PD9waHAKLyoqCiAqIFRoZW1lLCB0ZW1wbGF0ZSwgYW5kIHN0eWxlc2hlZXQgZnVuY3Rpb25zLgogKgogKiBAcGFja2FnZSBXb3JkUHJlc3MKICogQHN1YnBhY2thZ2UgVGhlbWUKICovCgovKioKICogUmV0dXJucyBhbiBhcnJheSBvZiBXUF9UaGVtZSBvYmplY3RzIGJhc2VkIG9uIHRoZSBhcmd1bWVudHMuCiAqCiAqIERlc3BpdGUgYWR2YW5jZXMgb3ZlciBnZXRfdGhlbWVzKCksIHRoaXMgZnVuY3Rpb24gaXMgcXVpdGUgZXhwZW5zaXZlLCBhbmQgZ3Jvd3MKICogbGluZWFybHkgd2l0aCBhZGRpdGlvbmFsIHRoZW1lcy4gU3RpY2sgdG8gd3BfZ2V0X3RoZW1lKCkgaWYgcG9zc2libGUuCiAqCiAqIEBzaW5jZSAzLjQuMAogKgogKiBAZ2xvYmFsIGFycmF5ICR3cF90aGVtZV9kaXJlY3RvcmllcwogKgogKiBAcGFyYW0gYXJyYXkgJGFyZ3MgewogKiAgICAgT3B0aW9uYWwuIFRoZSBzZWFyY2ggYXJndW1lbnRzLgogKgogKiAgICAgQHR5cGUgbWl4ZWQgJGVycm9ycyAgVHJ1ZSB0byByZXR1cm4gdGhlbWVzIHdpdGggZXJyb3JzLCBmYWxzZSB0byByZXR1cm4KICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lcyB3aXRob3V0IGVycm9ycywgbnVsbCB0byByZXR1cm4gYWxsIHRoZW1lcy4KICogICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgZmFsc2UuCiAqICAgICBAdHlwZSBtaXhlZCAkYWxsb3dlZCAoTXVsdGlzaXRlKSBUcnVlIHRvIHJldHVybiBvbmx5IGFsbG93ZWQgdGhlbWVzIGZvciBhIHNpdGUuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZSB0byByZXR1cm4gb25seSBkaXNhbGxvd2VkIHRoZW1lcyBmb3IgYSBzaXRlLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpdGUnIHRvIHJldHVybiBvbmx5IHNpdGUtYWxsb3dlZCB0aGVtZXMuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAnbmV0d29yaycgdG8gcmV0dXJuIG9ubHkgbmV0d29yay1hbGxvd2VkIHRoZW1lcy4KICogICAgICAgICAgICAgICAgICAgICAgICAgIE51bGwgdG8gcmV0dXJuIGFsbCB0aGVtZXMuIERlZmF1bHQgbnVsbC4KICogICAgIEB0eXBlIGludCAgICRibG9nX2lkIChNdWx0aXNpdGUpIFRoZSBibG9nIElEIHVzZWQgdG8gY2FsY3VsYXRlIHdoaWNoIHRoZW1lcwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGFsbG93ZWQuIERlZmF1bHQgMCwgc3lub255bW91cyBmb3IgdGhlIGN1cnJlbnQgYmxvZy4KICogfQogKiBAcmV0dXJuIFdQX1RoZW1lW10gQXJyYXkgb2YgV1BfVGhlbWUgb2JqZWN0cy4KICovCmZ1bmN0aW9uIHdwX2dldF90aGVtZXMoICRhcmdzID0gYXJyYXkoKSApIHsKCWdsb2JhbCAkd3BfdGhlbWVfZGlyZWN0b3JpZXM7CgoJJGRlZmF1bHRzID0gYXJyYXkoCgkJJ2Vycm9ycycgID0+IGZhbHNlLAoJCSdhbGxvd2VkJyA9PiBudWxsLAoJCSdibG9nX2lkJyA9PiAwLAoJKTsKCSRhcmdzICAgICA9IHdwX3BhcnNlX2FyZ3MoICRhcmdzLCAkZGVmYXVsdHMgKTsKCgkkdGhlbWVfZGlyZWN0b3JpZXMgPSBzZWFyY2hfdGhlbWVfZGlyZWN0b3JpZXMoKTsKCglpZiAoIGlzX2FycmF5KCAkd3BfdGhlbWVfZGlyZWN0b3JpZXMgKSAmJiBjb3VudCggJHdwX3RoZW1lX2RpcmVjdG9yaWVzICkgPiAxICkgewoJCS8vIE1ha2Ugc3VyZSB0aGUgYWN0aXZlIHRoZW1lIHdpbnMgb3V0LCBpbiBjYXNlIHNlYXJjaF90aGVtZV9kaXJlY3RvcmllcygpIHBpY2tzIHRoZSB3cm9uZwoJCS8vIG9uZSBpbiB0aGUgY2FzZSBvZiBhIGNvbmZsaWN0LiAoTm9ybWFsbHksIGxhc3QgcmVnaXN0ZXJlZCB0aGVtZSByb290IHdpbnMuKQoJCSRjdXJyZW50X3RoZW1lID0gZ2V0X3N0eWxlc2hlZXQoKTsKCQlpZiAoIGlzc2V0KCAkdGhlbWVfZGlyZWN0b3JpZXNbICRjdXJyZW50X3RoZW1lIF0gKSApIHsKCQkJJHJvb3Rfb2ZfY3VycmVudF90aGVtZSA9IGdldF9yYXdfdGhlbWVfcm9vdCggJGN1cnJlbnRfdGhlbWUgKTsKCQkJaWYgKCAhIGluX2FycmF5KCAkcm9vdF9vZl9jdXJyZW50X3RoZW1lLCAkd3BfdGhlbWVfZGlyZWN0b3JpZXMsIHRydWUgKSApIHsKCQkJCSRyb290X29mX2N1cnJlbnRfdGhlbWUgPSBXUF9DT05URU5UX0RJUiAuICRyb290X29mX2N1cnJlbnRfdGhlbWU7CgkJCX0KCQkJJHRoZW1lX2RpcmVjdG9yaWVzWyAkY3VycmVudF90aGVtZSBdWyd0aGVtZV9yb290J10gPSAkcm9vdF9vZl9jdXJyZW50X3RoZW1lOwoJCX0KCX0KCglpZiAoIGVtcHR5KCAkdGhlbWVfZGlyZWN0b3JpZXMgKSApIHsKCQlyZXR1cm4gYXJyYXkoKTsKCX0KCglpZiAoIGlzX211bHRpc2l0ZSgpICYmIG51bGwgIT09ICRhcmdzWydhbGxvd2VkJ10gKSB7CgkJJGFsbG93ZWQgPSAkYXJnc1snYWxsb3dlZCddOwoJCWlmICggJ25ldHdvcmsnID09PSAkYWxsb3dlZCApIHsKCQkJJHRoZW1lX2RpcmVjdG9yaWVzID0gYXJyYXlfaW50ZXJzZWN0X2tleSggJHRoZW1lX2RpcmVjdG9yaWVzLCBXUF9UaGVtZTo6Z2V0X2FsbG93ZWRfb25fbmV0d29yaygpICk7CgkJfSBlbHNlaWYgKCAnc2l0ZScgPT09ICRhbGxvd2VkICkgewoJCQkkdGhlbWVfZGlyZWN0b3JpZXMgPSBhcnJheV9pbnRlcnNlY3Rfa2V5KCAkdGhlbWVfZGlyZWN0b3JpZXMsIFdQX1RoZW1lOjpnZXRfYWxsb3dlZF9vbl9zaXRlKCAkYXJnc1snYmxvZ19pZCddICkgKTsKCQl9IGVsc2VpZiAoICRhbGxvd2VkICkgewoJCQkkdGhlbWVfZGlyZWN0b3JpZXMgPSBhcnJheV9pbnRlcnNlY3Rfa2V5KCAkdGhlbWVfZGlyZWN0b3JpZXMsIFdQX1RoZW1lOjpnZXRfYWxsb3dlZCggJGFyZ3NbJ2Jsb2dfaWQnXSApICk7CgkJfSBlbHNlIHsKCQkJJHRoZW1lX2RpcmVjdG9yaWVzID0gYXJyYXlfZGlmZl9rZXkoICR0aGVtZV9kaXJlY3RvcmllcywgV1BfVGhlbWU6OmdldF9hbGxvd2VkKCAkYXJnc1snYmxvZ19pZCddICkgKTsKCQl9Cgl9CgoJJHRoZW1lcyAgICAgICAgID0gYXJyYXkoKTsKCXN0YXRpYyAkX3RoZW1lcyA9IGFycmF5KCk7CgoJZm9yZWFjaCAoICR0aGVtZV9kaXJlY3RvcmllcyBhcyAkdGhlbWUgPT4gJHRoZW1lX3Jvb3QgKSB7CgkJaWYgKCBpc3NldCggJF90aGVtZXNbICR0aGVtZV9yb290Wyd0aGVtZV9yb290J10gLiAnLycgLiAkdGhlbWUgXSApICkgewoJCQkkdGhlbWVzWyAkdGhlbWUgXSA9ICRfdGhlbWVzWyAkdGhlbWVfcm9vdFsndGhlbWVfcm9vdCddIC4gJy8nIC4gJHRoZW1lIF07CgkJfSBlbHNlIHsKCQkJJHRoZW1lc1sgJHRoZW1lIF0gPSBuZXcgV1BfVGhlbWUoICR0aGVtZSwgJHRoZW1lX3Jvb3RbJ3RoZW1lX3Jvb3QnXSApOwoKCQkJJF90aGVtZXNbICR0aGVtZV9yb290Wyd0aGVtZV9yb290J10gLiAnLycgLiAkdGhlbWUgXSA9ICR0aGVtZXNbICR0aGVtZSBdOwoJCX0KCX0KCglpZiAoIG51bGwgIT09ICRhcmdzWydlcnJvcnMnXSApIHsKCQlmb3JlYWNoICggJHRoZW1lcyBhcyAkdGhlbWUgPT4gJHdwX3RoZW1lICkgewoJCQlpZiAoICR3cF90aGVtZS0+ZXJyb3JzKCkgIT0gJGFyZ3NbJ2Vycm9ycyddICkgewoJCQkJdW5zZXQoICR0aGVtZXNbICR0aGVtZSBdICk7CgkJCX0KCQl9Cgl9CgoJcmV0dXJuICR0aGVtZXM7Cn0KCi8qKgogKiBHZXRzIGEgV1BfVGhlbWUgb2JqZWN0IGZvciBhIHRoZW1lLgogKgogKiBAc2luY2UgMy40LjAKICoKICogQGdsb2JhbCBhcnJheSAkd3BfdGhlbWVfZGlyZWN0b3JpZXMKICoKICogQHBhcmFtIHN0cmluZyAkc3R5bGVzaGVldCBPcHRpb25hbC4gRGlyZWN0b3J5IG5hbWUgZm9yIHRoZSB0aGVtZS4gRGVmYXVsdHMgdG8gYWN0aXZlIHRoZW1lLgogKiBAcGFyYW0gc3RyaW5nICR0aGVtZV9yb290IE9wdGlvbmFsLiBBYnNvbHV0ZSBwYXRoIG9mIHRoZSB0aGVtZSByb290IHRvIGxvb2sgaW4uCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgZ2V0X3Jhd190aGVtZV9yb290KCkgaXMgdXNlZCB0byBjYWxjdWxhdGUKICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGhlbWUgcm9vdCBmb3IgdGhlICRzdHlsZXNoZWV0IHByb3ZpZGVkIChvciBhY3RpdmUgdGhlbWUpLgogKiBAcmV0dXJuIFdQX1RoZW1lIFRoZW1lIG9iamVjdC4gQmUgc3VyZSB0byBjaGVjayB0aGUgb2JqZWN0J3MgZXhpc3RzKCkgbWV0aG9kCiAqICAgICAgICAgICAgICAgICAgaWYgeW91IG5lZWQgdG8gY29uZmlybSB0aGUgdGhlbWUncyBleGlzdGVuY2UuCiAqLwpmdW5jdGlvbiB3cF9nZXRfdGhlbWUoICRzdHlsZXNoZWV0ID0gJycsICR0aGVtZV9yb290ID0gJycgKSB7CglnbG9iYWwgJHdwX3RoZW1lX2RpcmVjdG9yaWVzOwoKCWlmICggZW1wdHkoICRzdHlsZXNoZWV0ICkgKSB7CgkJJHN0eWxlc2hlZXQgPSBnZXRfc3R5bGVzaGVldCgpOwoJfQoKCWlmICggZW1wdHkoICR0aGVtZV9yb290ICkgKSB7CgkJJHRoZW1lX3Jvb3QgPSBnZXRfcmF3X3RoZW1lX3Jvb3QoICRzdHlsZXNoZWV0ICk7CgkJaWYgKCBmYWxzZSA9PT0gJHRoZW1lX3Jvb3QgKSB7CgkJCSR0aGVtZV9yb290ID0gV1BfQ09OVEVOVF9ESVIgLiAnL3RoZW1lcyc7CgkJfSBlbHNlaWYgKCAhIGluX2FycmF5KCAkdGhlbWVfcm9vdCwgKGFycmF5KSAkd3BfdGhlbWVfZGlyZWN0b3JpZXMsIHRydWUgKSApIHsKCQkJJHRoZW1lX3Jvb3QgPSBXUF9DT05URU5UX0RJUiAuICR0aGVtZV9yb290OwoJCX0KCX0KCglyZXR1cm4gbmV3IFdQX1RoZW1lKCAkc3R5bGVzaGVldCwgJHRoZW1lX3Jvb3QgKTsKfQoKLyoqCiAqIENsZWFycyB0aGUgY2FjaGUgaGVsZCBieSBnZXRfdGhlbWVfcm9vdHMoKSBhbmQgV1BfVGhlbWUuCiAqCiAqIEBzaW5jZSAzLjUuMAogKiBAcGFyYW0gYm9vbCAkY2xlYXJfdXBkYXRlX2NhY2hlIFdoZXRoZXIgdG8gY2xlYXIgdGhlIHRoZW1lIHVwZGF0ZXMgY2FjaGUuCiAqLwpmdW5jdGlvbiB3cF9jbGVhbl90aGVtZXNfY2FjaGUoICRjbGVhcl91cGRhdGVfY2FjaGUgPSB0cnVlICkgewoJaWYgKCAkY2xlYXJfdXBkYXRlX2NhY2hlICkgewoJCWRlbGV0ZV9zaXRlX3RyYW5zaWVudCggJ3VwZGF0ZV90aGVtZXMnICk7Cgl9CglzZWFyY2hfdGhlbWVfZGlyZWN0b3JpZXMoIHRydWUgKTsKCWZvcmVhY2ggKCB3cF9nZXRfdGhlbWVzKCBhcnJheSggJ2Vycm9ycycgPT4gbnVsbCApICkgYXMgJHRoZW1lICkgewoJCSR0aGVtZS0+Y2FjaGVfZGVsZXRlKCk7Cgl9Cn0KCi8qKgogKiBXaGV0aGVyIGEgY2hpbGQgdGhlbWUgaXMgaW4gdXNlLgogKgogKiBAc2luY2UgMy4wLjAKICoKICogQHJldHVybiBib29sIFRydWUgaWYgYSBjaGlsZCB0aGVtZSBpcyBpbiB1c2UsIGZhbHNlIG90aGVyd2lzZS4KICovCmZ1bmN0aW9uIGlzX2NoaWxkX3RoZW1lKCkgewoJcmV0dXJuICggVEVNUExBVEVQQVRIICE9PSBTVFlMRVNIRUVUUEFUSCApOwp9CgovKioKICogUmV0cmlldmVzIG5hbWUgb2YgdGhlIGN1cnJlbnQgc3R5bGVzaGVldC4KICoKICogVGhlIHRoZW1lIG5hbWUgdGhhdCBpcyBjdXJyZW50bHkgc2V0IGFzIHRoZSBmcm9udCBlbmQgdGhlbWUuCiAqCiAqIEZvciBhbGwgaW50ZW50cyBhbmQgcHVycG9zZXMsIHRoZSB0ZW1wbGF0ZSBuYW1lIGFuZCB0aGUgc3R5bGVzaGVldCBuYW1lCiAqIGFyZSBnb2luZyB0byBiZSB0aGUgc2FtZSBmb3IgbW9zdCBjYXNlcy4KICoKICogQHNpbmNlIDEuNS4wCiAqCiAqIEByZXR1cm4gc3RyaW5nIFN0eWxlc2hlZXQgbmFtZS4KICovCmZ1bmN0aW9uIGdldF9zdHlsZXNoZWV0KCkgewoJLyoqCgkgKiBGaWx0ZXJzIHRoZSBuYW1lIG9mIGN1cnJlbnQgc3R5bGVzaGVldC4KCSAqCgkgKiBAc2luY2UgMS41LjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRzdHlsZXNoZWV0IE5hbWUgb2YgdGhlIGN1cnJlbnQgc3R5bGVzaGVldC4KCSAqLwoJcmV0dXJuIGFwcGx5X2ZpbHRlcnMoICdzdHlsZXNoZWV0JywgZ2V0X29wdGlvbiggJ3N0eWxlc2hlZXQnICkgKTsKfQoKLyoqCiAqIFJldHJpZXZlcyBzdHlsZXNoZWV0IGRpcmVjdG9yeSBwYXRoIGZvciB0aGUgYWN0aXZlIHRoZW1lLgogKgogKiBAc2luY2UgMS41LjAKICoKICogQHJldHVybiBzdHJpbmcgUGF0aCB0byBhY3RpdmUgdGhlbWUncyBzdHlsZXNoZWV0IGRpcmVjdG9yeS4KICovCmZ1bmN0aW9uIGdldF9zdHlsZXNoZWV0X2RpcmVjdG9yeSgpIHsKCSRzdHlsZXNoZWV0ICAgICA9IGdldF9zdHlsZXNoZWV0KCk7CgkkdGhlbWVfcm9vdCAgICAgPSBnZXRfdGhlbWVfcm9vdCggJHN0eWxlc2hlZXQgKTsKCSRzdHlsZXNoZWV0X2RpciA9ICIkdGhlbWVfcm9vdC8kc3R5bGVzaGVldCI7CgoJLyoqCgkgKiBGaWx0ZXJzIHRoZSBzdHlsZXNoZWV0IGRpcmVjdG9yeSBwYXRoIGZvciB0aGUgYWN0aXZlIHRoZW1lLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHN0eWxlc2hlZXRfZGlyIEFic29sdXRlIHBhdGggdG8gdGhlIGFjdGl2ZSB0aGVtZS4KCSAqIEBwYXJhbSBzdHJpbmcgJHN0eWxlc2hlZXQgICAgIERpcmVjdG9yeSBuYW1lIG9mIHRoZSBhY3RpdmUgdGhlbWUuCgkgKiBAcGFyYW0gc3RyaW5nICR0aGVtZV9yb290ICAgICBBYnNvbHV0ZSBwYXRoIHRvIHRoZW1lcyBkaXJlY3RvcnkuCgkgKi8KCXJldHVybiBhcHBseV9maWx0ZXJzKCAnc3R5bGVzaGVldF9kaXJlY3RvcnknLCAkc3R5bGVzaGVldF9kaXIsICRzdHlsZXNoZWV0LCAkdGhlbWVfcm9vdCApOwp9CgovKioKICogUmV0cmlldmVzIHN0eWxlc2hlZXQgZGlyZWN0b3J5IFVSSSBmb3IgdGhlIGFjdGl2ZSB0aGVtZS4KICoKICogQHNpbmNlIDEuNS4wCiAqCiAqIEByZXR1cm4gc3RyaW5nIFVSSSB0byBhY3RpdmUgdGhlbWUncyBzdHlsZXNoZWV0IGRpcmVjdG9yeS4KICovCmZ1bmN0aW9uIGdldF9zdHlsZXNoZWV0X2RpcmVjdG9yeV91cmkoKSB7Cgkkc3R5bGVzaGVldCAgICAgICAgID0gc3RyX3JlcGxhY2UoICclMkYnLCAnLycsIHJhd3VybGVuY29kZSggZ2V0X3N0eWxlc2hlZXQoKSApICk7CgkkdGhlbWVfcm9vdF91cmkgICAgID0gZ2V0X3RoZW1lX3Jvb3RfdXJpKCAkc3R5bGVzaGVldCApOwoJJHN0eWxlc2hlZXRfZGlyX3VyaSA9ICIkdGhlbWVfcm9vdF91cmkvJHN0eWxlc2hlZXQiOwoKCS8qKgoJICogRmlsdGVycyB0aGUgc3R5bGVzaGVldCBkaXJlY3RvcnkgVVJJLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHN0eWxlc2hlZXRfZGlyX3VyaSBTdHlsZXNoZWV0IGRpcmVjdG9yeSBVUkkuCgkgKiBAcGFyYW0gc3RyaW5nICRzdHlsZXNoZWV0ICAgICAgICAgTmFtZSBvZiB0aGUgYWN0aXZhdGVkIHRoZW1lJ3MgZGlyZWN0b3J5LgoJICogQHBhcmFtIHN0cmluZyAkdGhlbWVfcm9vdF91cmkgICAgIFRoZW1lcyByb290IFVSSS4KCSAqLwoJcmV0dXJuIGFwcGx5X2ZpbHRlcnMoICdzdHlsZXNoZWV0X2RpcmVjdG9yeV91cmknLCAkc3R5bGVzaGVldF9kaXJfdXJpLCAkc3R5bGVzaGVldCwgJHRoZW1lX3Jvb3RfdXJpICk7Cn0KCi8qKgogKiBSZXRyaWV2ZXMgc3R5bGVzaGVldCBVUkkgZm9yIHRoZSBhY3RpdmUgdGhlbWUuCiAqCiAqIFRoZSBzdHlsZXNoZWV0IGZpbGUgbmFtZSBpcyAnc3R5bGUuY3NzJyB3aGljaCBpcyBhcHBlbmRlZCB0byB0aGUgc3R5bGVzaGVldCBkaXJlY3RvcnkgVVJJIHBhdGguCiAqIFNlZSBnZXRfc3R5bGVzaGVldF9kaXJlY3RvcnlfdXJpKCkuCiAqCiAqIEBzaW5jZSAxLjUuMAogKgogKiBAcmV0dXJuIHN0cmluZyBVUkkgdG8gYWN0aXZlIHRoZW1lJ3Mgc3R5bGVzaGVldC4KICovCmZ1bmN0aW9uIGdldF9zdHlsZXNoZWV0X3VyaSgpIHsKCSRzdHlsZXNoZWV0X2Rpcl91cmkgPSBnZXRfc3R5bGVzaGVldF9kaXJlY3RvcnlfdXJpKCk7Cgkkc3R5bGVzaGVldF91cmkgICAgID0gJHN0eWxlc2hlZXRfZGlyX3VyaSAuICcvc3R5bGUuY3NzJzsKCS8qKgoJICogRmlsdGVycyB0aGUgVVJJIG9mIHRoZSBhY3RpdmUgdGhlbWUgc3R5bGVzaGVldC4KCSAqCgkgKiBAc2luY2UgMS41LjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRzdHlsZXNoZWV0X3VyaSAgICAgU3R5bGVzaGVldCBVUkkgZm9yIHRoZSBhY3RpdmUgdGhlbWUvY2hpbGQgdGhlbWUuCgkgKiBAcGFyYW0gc3RyaW5nICRzdHlsZXNoZWV0X2Rpcl91cmkgU3R5bGVzaGVldCBkaXJlY3RvcnkgVVJJIGZvciB0aGUgYWN0aXZlIHRoZW1lL2NoaWxkIHRoZW1lLgoJICovCglyZXR1cm4gYXBwbHlfZmlsdGVycyggJ3N0eWxlc2hlZXRfdXJpJywgJHN0eWxlc2hlZXRfdXJpLCAkc3R5bGVzaGVldF9kaXJfdXJpICk7Cn0KCi8qKgogKiBSZXRyaWV2ZXMgdGhlIGxvY2FsaXplZCBzdHlsZXNoZWV0IFVSSS4KICoKICogVGhlIHN0eWxlc2hlZXQgZGlyZWN0b3J5IGZvciB0aGUgbG9jYWxpemVkIHN0eWxlc2hlZXQgZmlsZXMgYXJlIGxvY2F0ZWQsIGJ5CiAqIGRlZmF1bHQsIGluIHRoZSBiYXNlIHRoZW1lIGRpcmVjdG9yeS4gVGhlIG5hbWUgb2YgdGhlIGxvY2FsZSBmaWxlIHdpbGwgYmUgdGhlCiAqIGxvY2FsZSBmb2xsb3dlZCBieSAnLmNzcycuIElmIHRoYXQgZG9lcyBub3QgZXhpc3QsIHRoZW4gdGhlIHRleHQgZGlyZWN0aW9uCiAqIHN0eWxlc2hlZXQgd2lsbCBiZSBjaGVja2VkIGZvciBleGlzdGVuY2UsIGZvciBleGFtcGxlICdsdHIuY3NzJy4KICoKICogVGhlIHRoZW1lIG1heSBjaGFuZ2UgdGhlIGxvY2F0aW9uIG9mIHRoZSBzdHlsZXNoZWV0IGRpcmVjdG9yeSBieSBlaXRoZXIgdXNpbmcKICogdGhlIHtAc2VlICdzdHlsZXNoZWV0X2RpcmVjdG9yeV91cmknfSBvciB7QHNlZSAnbG9jYWxlX3N0eWxlc2hlZXRfdXJpJ30gZmlsdGVycy4KICoKICogSWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3R5bGVzaGVldCBmaWxlcyBmb3IgdGhlIGVudGlyZQogKiBXb3JkUHJlc3Mgd29ya2Zsb3csIHRoZW4gY2hhbmdlIHRoZSBmb3JtZXIuIElmIHlvdSBqdXN0IGhhdmUgdGhlIGxvY2FsZSBpbiBhCiAqIHNlcGFyYXRlIGZvbGRlciwgdGhlbiBjaGFuZ2UgdGhlIGxhdHRlci4KICoKICogQHNpbmNlIDIuMS4wCiAqCiAqIEBnbG9iYWwgV1BfTG9jYWxlICR3cF9sb2NhbGUgV29yZFByZXNzIGRhdGUgYW5kIHRpbWUgbG9jYWxlIG9iamVjdC4KICoKICogQHJldHVybiBzdHJpbmcgVVJJIHRvIGFjdGl2ZSB0aGVtZSdzIGxvY2FsaXplZCBzdHlsZXNoZWV0LgogKi8KZnVuY3Rpb24gZ2V0X2xvY2FsZV9zdHlsZXNoZWV0X3VyaSgpIHsKCWdsb2JhbCAkd3BfbG9jYWxlOwoJJHN0eWxlc2hlZXRfZGlyX3VyaSA9IGdldF9zdHlsZXNoZWV0X2RpcmVjdG9yeV91cmkoKTsKCSRkaXIgICAgICAgICAgICAgICAgPSBnZXRfc3R5bGVzaGVldF9kaXJlY3RvcnkoKTsKCSRsb2NhbGUgICAgICAgICAgICAgPSBnZXRfbG9jYWxlKCk7CglpZiAoIGZpbGVfZXhpc3RzKCAiJGRpci8kbG9jYWxlLmNzcyIgKSApIHsKCQkkc3R5bGVzaGVldF91cmkgPSAiJHN0eWxlc2hlZXRfZGlyX3VyaS8kbG9jYWxlLmNzcyI7Cgl9IGVsc2VpZiAoICEgZW1wdHkoICR3cF9sb2NhbGUtPnRleHRfZGlyZWN0aW9uICkgJiYgZmlsZV9leGlzdHMoICIkZGlyL3skd3BfbG9jYWxlLT50ZXh0X2RpcmVjdGlvbn0uY3NzIiApICkgewoJCSRzdHlsZXNoZWV0X3VyaSA9ICIkc3R5bGVzaGVldF9kaXJfdXJpL3skd3BfbG9jYWxlLT50ZXh0X2RpcmVjdGlvbn0uY3NzIjsKCX0gZWxzZSB7CgkJJHN0eWxlc2hlZXRfdXJpID0gJyc7Cgl9CgkvKioKCSAqIEZpbHRlcnMgdGhlIGxvY2FsaXplZCBzdHlsZXNoZWV0IFVSSS4KCSAqCgkgKiBAc2luY2UgMi4xLjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRzdHlsZXNoZWV0X3VyaSAgICAgTG9jYWxpemVkIHN0eWxlc2hlZXQgVVJJLgoJICogQHBhcmFtIHN0cmluZyAkc3R5bGVzaGVldF9kaXJfdXJpIFN0eWxlc2hlZXQgZGlyZWN0b3J5IFVSSS4KCSAqLwoJcmV0dXJuIGFwcGx5X2ZpbHRlcnMoICdsb2NhbGVfc3R5bGVzaGVldF91cmknLCAkc3R5bGVzaGVldF91cmksICRzdHlsZXNoZWV0X2Rpcl91cmkgKTsKfQoKLyoqCiAqIFJldHJpZXZlcyBuYW1lIG9mIHRoZSBhY3RpdmUgdGhlbWUuCiAqCiAqIEBzaW5jZSAxLjUuMAogKgogKiBAcmV0dXJuIHN0cmluZyBUZW1wbGF0ZSBuYW1lLgogKi8KZnVuY3Rpb24gZ2V0X3RlbXBsYXRlKCkgewoJLyoqCgkgKiBGaWx0ZXJzIHRoZSBuYW1lIG9mIHRoZSBhY3RpdmUgdGhlbWUuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKgoJICogQHBhcmFtIHN0cmluZyAkdGVtcGxhdGUgYWN0aXZlIHRoZW1lJ3MgZGlyZWN0b3J5IG5hbWUuCgkgKi8KCXJldHVybiBhcHBseV9maWx0ZXJzKCAndGVtcGxhdGUnLCBnZXRfb3B0aW9uKCAndGVtcGxhdGUnICkgKTsKfQoKLyoqCiAqIFJldHJpZXZlcyB0ZW1wbGF0ZSBkaXJlY3RvcnkgcGF0aCBmb3IgdGhlIGFjdGl2ZSB0aGVtZS4KICoKICogQHNpbmNlIDEuNS4wCiAqCiAqIEByZXR1cm4gc3RyaW5nIFBhdGggdG8gYWN0aXZlIHRoZW1lJ3MgdGVtcGxhdGUgZGlyZWN0b3J5LgogKi8KZnVuY3Rpb24gZ2V0X3RlbXBsYXRlX2RpcmVjdG9yeSgpIHsKCSR0ZW1wbGF0ZSAgICAgPSBnZXRfdGVtcGxhdGUoKTsKCSR0aGVtZV9yb290ICAgPSBnZXRfdGhlbWVfcm9vdCggJHRlbXBsYXRlICk7CgkkdGVtcGxhdGVfZGlyID0gIiR0aGVtZV9yb290LyR0ZW1wbGF0ZSI7CgoJLyoqCgkgKiBGaWx0ZXJzIHRoZSBhY3RpdmUgdGhlbWUgZGlyZWN0b3J5IHBhdGguCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKgoJICogQHBhcmFtIHN0cmluZyAkdGVtcGxhdGVfZGlyIFRoZSBwYXRoIG9mIHRoZSBhY3RpdmUgdGhlbWUgZGlyZWN0b3J5LgoJICogQHBhcmFtIHN0cmluZyAkdGVtcGxhdGUgICAgIERpcmVjdG9yeSBuYW1lIG9mIHRoZSBhY3RpdmUgdGhlbWUuCgkgKiBAcGFyYW0gc3RyaW5nICR0aGVtZV9yb290ICAgQWJzb2x1dGUgcGF0aCB0byB0aGUgdGhlbWVzIGRpcmVjdG9yeS4KCSAqLwoJcmV0dXJuIGFwcGx5X2ZpbHRlcnMoICd0ZW1wbGF0ZV9kaXJlY3RvcnknLCAkdGVtcGxhdGVfZGlyLCAkdGVtcGxhdGUsICR0aGVtZV9yb290ICk7Cn0KCi8qKgogKiBSZXRyaWV2ZXMgdGVtcGxhdGUgZGlyZWN0b3J5IFVSSSBmb3IgdGhlIGFjdGl2ZSB0aGVtZS4KICoKICogQHNpbmNlIDEuNS4wCiAqCiAqIEByZXR1cm4gc3RyaW5nIFVSSSB0byBhY3RpdmUgdGhlbWUncyB0ZW1wbGF0ZSBkaXJlY3RvcnkuCiAqLwpmdW5jdGlvbiBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5X3VyaSgpIHsKCSR0ZW1wbGF0ZSAgICAgICAgID0gc3RyX3JlcGxhY2UoICclMkYnLCAnLycsIHJhd3VybGVuY29kZSggZ2V0X3RlbXBsYXRlKCkgKSApOwoJJHRoZW1lX3Jvb3RfdXJpICAgPSBnZXRfdGhlbWVfcm9vdF91cmkoICR0ZW1wbGF0ZSApOwoJJHRlbXBsYXRlX2Rpcl91cmkgPSAiJHRoZW1lX3Jvb3RfdXJpLyR0ZW1wbGF0ZSI7CgoJLyoqCgkgKiBGaWx0ZXJzIHRoZSBhY3RpdmUgdGhlbWUgZGlyZWN0b3J5IFVSSS4KCSAqCgkgKiBAc2luY2UgMS41LjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR0ZW1wbGF0ZV9kaXJfdXJpIFRoZSBVUkkgb2YgdGhlIGFjdGl2ZSB0aGVtZSBkaXJlY3RvcnkuCgkgKiBAcGFyYW0gc3RyaW5nICR0ZW1wbGF0ZSAgICAgICAgIERpcmVjdG9yeSBuYW1lIG9mIHRoZSBhY3RpdmUgdGhlbWUuCgkgKiBAcGFyYW0gc3RyaW5nICR0aGVtZV9yb290X3VyaSAgIFRoZSB0aGVtZXMgcm9vdCBVUkkuCgkgKi8KCXJldHVybiBhcHBseV9maWx0ZXJzKCAndGVtcGxhdGVfZGlyZWN0b3J5X3VyaScsICR0ZW1wbGF0ZV9kaXJfdXJpLCAkdGVtcGxhdGUsICR0aGVtZV9yb290X3VyaSApOwp9CgovKioKICogUmV0cmlldmVzIHRoZW1lIHJvb3RzLgogKgogKiBAc2luY2UgMi45LjAKICoKICogQGdsb2JhbCBhcnJheSAkd3BfdGhlbWVfZGlyZWN0b3JpZXMKICoKICogQHJldHVybiBhcnJheXxzdHJpbmcgQW4gYXJyYXkgb2YgdGhlbWUgcm9vdHMga2V5ZWQgYnkgdGVtcGxhdGUvc3R5bGVzaGVldAogKiAgICAgICAgICAgICAgICAgICAgICBvciBhIHNpbmdsZSB0aGVtZSByb290IGlmIGFsbCB0aGVtZXMgaGF2ZSB0aGUgc2FtZSByb290LgogKi8KZnVuY3Rpb24gZ2V0X3RoZW1lX3Jvb3RzKCkgewoJZ2xvYmFsICR3cF90aGVtZV9kaXJlY3RvcmllczsKCglpZiAoICEgaXNfYXJyYXkoICR3cF90aGVtZV9kaXJlY3RvcmllcyApIHx8IGNvdW50KCAkd3BfdGhlbWVfZGlyZWN0b3JpZXMgKSA8PSAxICkgewoJCXJldHVybiAnL3RoZW1lcyc7Cgl9CgoJJHRoZW1lX3Jvb3RzID0gZ2V0X3NpdGVfdHJhbnNpZW50KCAndGhlbWVfcm9vdHMnICk7CglpZiAoIGZhbHNlID09PSAkdGhlbWVfcm9vdHMgKSB7CgkJc2VhcmNoX3RoZW1lX2RpcmVjdG9yaWVzKCB0cnVlICk7IC8vIFJlZ2VuZXJhdGUgdGhlIHRyYW5zaWVudC4KCQkkdGhlbWVfcm9vdHMgPSBnZXRfc2l0ZV90cmFuc2llbnQoICd0aGVtZV9yb290cycgKTsKCX0KCXJldHVybiAkdGhlbWVfcm9vdHM7Cn0KCi8qKgogKiBSZWdpc3RlcnMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGVtZXMuCiAqCiAqIEBzaW5jZSAyLjkuMAogKgogKiBAZ2xvYmFsIGFycmF5ICR3cF90aGVtZV9kaXJlY3RvcmllcwogKgogKiBAcGFyYW0gc3RyaW5nICRkaXJlY3RvcnkgRWl0aGVyIHRoZSBmdWxsIGZpbGVzeXN0ZW0gcGF0aCB0byBhIHRoZW1lIGZvbGRlcgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYSBmb2xkZXIgd2l0aGluIFdQX0NPTlRFTlRfRElSLgogKiBAcmV0dXJuIGJvb2wgVHJ1ZSBpZiBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZW1lcywKICogICAgICAgICAgICAgIGZhbHNlIGlmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuCiAqLwpmdW5jdGlvbiByZWdpc3Rlcl90aGVtZV9kaXJlY3RvcnkoICRkaXJlY3RvcnkgKSB7CglnbG9iYWwgJHdwX3RoZW1lX2RpcmVjdG9yaWVzOwoKCWlmICggISBmaWxlX2V4aXN0cyggJGRpcmVjdG9yeSApICkgewoJCS8vIFRyeSBwcmVwZW5kaW5nIGFzIHRoZSB0aGVtZSBkaXJlY3RvcnkgY291bGQgYmUgcmVsYXRpdmUgdG8gdGhlIGNvbnRlbnQgZGlyZWN0b3J5LgoJCSRkaXJlY3RvcnkgPSBXUF9DT05URU5UX0RJUiAuICcvJyAuICRkaXJlY3Rvcnk7CgkJLy8gSWYgdGhpcyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QsIHJldHVybiBhbmQgZG8gbm90IHJlZ2lzdGVyLgoJCWlmICggISBmaWxlX2V4aXN0cyggJGRpcmVjdG9yeSApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoKCWlmICggISBpc19hcnJheSggJHdwX3RoZW1lX2RpcmVjdG9yaWVzICkgKSB7CgkJJHdwX3RoZW1lX2RpcmVjdG9yaWVzID0gYXJyYXkoKTsKCX0KCgkkdW50cmFpbGVkID0gdW50cmFpbGluZ3NsYXNoaXQoICRkaXJlY3RvcnkgKTsKCWlmICggISBlbXB0eSggJHVudHJhaWxlZCApICYmICEgaW5fYXJyYXkoICR1bnRyYWlsZWQsICR3cF90aGVtZV9kaXJlY3RvcmllcywgdHJ1ZSApICkgewoJCSR3cF90aGVtZV9kaXJlY3Rvcmllc1tdID0gJHVudHJhaWxlZDsKCX0KCglyZXR1cm4gdHJ1ZTsKfQoKLyoqCiAqIFNlYXJjaGVzIGFsbCByZWdpc3RlcmVkIHRoZW1lIGRpcmVjdG9yaWVzIGZvciBjb21wbGV0ZSBhbmQgdmFsaWQgdGhlbWVzLgogKgogKiBAc2luY2UgMi45LjAKICoKICogQGdsb2JhbCBhcnJheSAkd3BfdGhlbWVfZGlyZWN0b3JpZXMKICoKICogQHBhcmFtIGJvb2wgJGZvcmNlIE9wdGlvbmFsLiBXaGV0aGVyIHRvIGZvcmNlIGEgbmV3IGRpcmVjdG9yeSBzY2FuLiBEZWZhdWx0IGZhbHNlLgogKiBAcmV0dXJuIGFycmF5fGZhbHNlIFZhbGlkIHRoZW1lcyBmb3VuZCBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgogKi8KZnVuY3Rpb24gc2VhcmNoX3RoZW1lX2RpcmVjdG9yaWVzKCAkZm9yY2UgPSBmYWxzZSApIHsKCWdsb2JhbCAkd3BfdGhlbWVfZGlyZWN0b3JpZXM7CglzdGF0aWMgJGZvdW5kX3RoZW1lcyA9IG51bGw7CgoJaWYgKCBlbXB0eSggJHdwX3RoZW1lX2RpcmVjdG9yaWVzICkgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWlmICggISAkZm9yY2UgJiYgaXNzZXQoICRmb3VuZF90aGVtZXMgKSApIHsKCQlyZXR1cm4gJGZvdW5kX3RoZW1lczsKCX0KCgkkZm91bmRfdGhlbWVzID0gYXJyYXkoKTsKCgkkd3BfdGhlbWVfZGlyZWN0b3JpZXMgPSAoYXJyYXkpICR3cF90aGVtZV9kaXJlY3RvcmllczsKCSRyZWxhdGl2ZV90aGVtZV9yb290cyA9IGFycmF5KCk7CgoJLyoKCSAqIFNldCB1cCBtYXliZS1yZWxhdGl2ZSwgbWF5YmUtYWJzb2x1dGUgYXJyYXkgb2YgdGhlbWUgZGlyZWN0b3JpZXMuCgkgKiBXZSBhbHdheXMgd2FudCB0byByZXR1cm4gYWJzb2x1dGUsIGJ1dCB3ZSBuZWVkIHRvIGNhY2hlIHJlbGF0aXZlCgkgKiB0byB1c2UgaW4gZ2V0X3RoZW1lX3Jvb3QoKS4KCSAqLwoJZm9yZWFjaCAoICR3cF90aGVtZV9kaXJlY3RvcmllcyBhcyAkdGhlbWVfcm9vdCApIHsKCQlpZiAoIDAgPT09IHN0cnBvcyggJHRoZW1lX3Jvb3QsIFdQX0NPTlRFTlRfRElSICkgKSB7CgkJCSRyZWxhdGl2ZV90aGVtZV9yb290c1sgc3RyX3JlcGxhY2UoIFdQX0NPTlRFTlRfRElSLCAnJywgJHRoZW1lX3Jvb3QgKSBdID0gJHRoZW1lX3Jvb3Q7CgkJfSBlbHNlIHsKCQkJJHJlbGF0aXZlX3RoZW1lX3Jvb3RzWyAkdGhlbWVfcm9vdCBdID0gJHRoZW1lX3Jvb3Q7CgkJfQoJfQoKCS8qKgoJICogRmlsdGVycyB3aGV0aGVyIHRvIGdldCB0aGUgY2FjaGUgb2YgdGhlIHJlZ2lzdGVyZWQgdGhlbWUgZGlyZWN0b3JpZXMuCgkgKgoJICogQHNpbmNlIDMuNC4wCgkgKgoJICogQHBhcmFtIGJvb2wgICAkY2FjaGVfZXhwaXJhdGlvbiBXaGV0aGVyIHRvIGdldCB0aGUgY2FjaGUgb2YgdGhlIHRoZW1lIGRpcmVjdG9yaWVzLiBEZWZhdWx0IGZhbHNlLgoJICogQHBhcmFtIHN0cmluZyAkY29udGV4dCAgICAgICAgICBUaGUgY2xhc3Mgb3IgZnVuY3Rpb24gbmFtZSBjYWxsaW5nIHRoZSBmaWx0ZXIuCgkgKi8KCSRjYWNoZV9leHBpcmF0aW9uID0gYXBwbHlfZmlsdGVycyggJ3dwX2NhY2hlX3RoZW1lc19wZXJzaXN0ZW50bHknLCBmYWxzZSwgJ3NlYXJjaF90aGVtZV9kaXJlY3RvcmllcycgKTsKCglpZiAoICRjYWNoZV9leHBpcmF0aW9uICkgewoJCSRjYWNoZWRfcm9vdHMgPSBnZXRfc2l0ZV90cmFuc2llbnQoICd0aGVtZV9yb290cycgKTsKCQlpZiAoIGlzX2FycmF5KCAkY2FjaGVkX3Jvb3RzICkgKSB7CgkJCWZvcmVhY2ggKCAkY2FjaGVkX3Jvb3RzIGFzICR0aGVtZV9kaXIgPT4gJHRoZW1lX3Jvb3QgKSB7CgkJCQkvLyBBIGNhY2hlZCB0aGVtZSByb290IGlzIG5vIGxvbmdlciBhcm91bmQsIHNvIHNraXAgaXQuCgkJCQlpZiAoICEgaXNzZXQoICRyZWxhdGl2ZV90aGVtZV9yb290c1sgJHRoZW1lX3Jvb3QgXSApICkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJJGZvdW5kX3RoZW1lc1sgJHRoZW1lX2RpciBdID0gYXJyYXkoCgkJCQkJJ3RoZW1lX2ZpbGUnID0+ICR0aGVtZV9kaXIgLiAnL3N0eWxlLmNzcycsCgkJCQkJJ3RoZW1lX3Jvb3QnID0+ICRyZWxhdGl2ZV90aGVtZV9yb290c1sgJHRoZW1lX3Jvb3QgXSwgLy8gQ29udmVydCByZWxhdGl2ZSB0byBhYnNvbHV0ZS4KCQkJCSk7CgkJCX0KCQkJcmV0dXJuICRmb3VuZF90aGVtZXM7CgkJfQoJCWlmICggISBpc19pbnQoICRjYWNoZV9leHBpcmF0aW9uICkgKSB7CgkJCSRjYWNoZV9leHBpcmF0aW9uID0gMzAgKiBNSU5VVEVfSU5fU0VDT05EUzsKCQl9Cgl9IGVsc2UgewoJCSRjYWNoZV9leHBpcmF0aW9uID0gMzAgKiBNSU5VVEVfSU5fU0VDT05EUzsKCX0KCgkvKiBMb29wIHRoZSByZWdpc3RlcmVkIHRoZW1lIGRpcmVjdG9yaWVzIGFuZCBleHRyYWN0IGFsbCB0aGVtZXMgKi8KCWZvcmVhY2ggKCAkd3BfdGhlbWVfZGlyZWN0b3JpZXMgYXMgJHRoZW1lX3Jvb3QgKSB7CgoJCS8vIFN0YXJ0IHdpdGggZGlyZWN0b3JpZXMgaW4gdGhlIHJvb3Qgb2YgdGhlIGFjdGl2ZSB0aGVtZSBkaXJlY3RvcnkuCgkJJGRpcnMgPSBAIHNjYW5kaXIoICR0aGVtZV9yb290ICk7CgkJaWYgKCAhICRkaXJzICkgewoJCQl0cmlnZ2VyX2Vycm9yKCAiJHRoZW1lX3Jvb3QgaXMgbm90IHJlYWRhYmxlIiwgRV9VU0VSX05PVElDRSApOwoJCQljb250aW51ZTsKCQl9CgkJZm9yZWFjaCAoICRkaXJzIGFzICRkaXIgKSB7CgkJCWlmICggISBpc19kaXIoICR0aGVtZV9yb290IC4gJy8nIC4gJGRpciApIHx8ICcuJyA9PT0gJGRpclswXSB8fCAnQ1ZTJyA9PT0gJGRpciApIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCWlmICggZmlsZV9leGlzdHMoICR0aGVtZV9yb290IC4gJy8nIC4gJGRpciAuICcvc3R5bGUuY3NzJyApICkgewoJCQkJLy8gd3AtY29udGVudC90aGVtZXMvYS1zaW5nbGUtdGhlbWUKCQkJCS8vIHdwLWNvbnRlbnQvdGhlbWVzIGlzICR0aGVtZV9yb290LCBhLXNpbmdsZS10aGVtZSBpcyAkZGlyLgoJCQkJJGZvdW5kX3RoZW1lc1sgJGRpciBdID0gYXJyYXkoCgkJCQkJJ3RoZW1lX2ZpbGUnID0+ICRkaXIgLiAnL3N0eWxlLmNzcycsCgkJCQkJJ3RoZW1lX3Jvb3QnID0+ICR0aGVtZV9yb290LAoJCQkJKTsKCQkJfSBlbHNlIHsKCQkJCSRmb3VuZF90aGVtZSA9IGZhbHNlOwoJCQkJLy8gd3AtY29udGVudC90aGVtZXMvYS1mb2xkZXItb2YtdGhlbWVzLyoKCQkJCS8vIHdwLWNvbnRlbnQvdGhlbWVzIGlzICR0aGVtZV9yb290LCBhLWZvbGRlci1vZi10aGVtZXMgaXMgJGRpciwgdGhlbiB0aGVtZXMgYXJlICRzdWJfZGlycy4KCQkJCSRzdWJfZGlycyA9IEAgc2NhbmRpciggJHRoZW1lX3Jvb3QgLiAnLycgLiAkZGlyICk7CgkJCQlpZiAoICEgJHN1Yl9kaXJzICkgewoJCQkJCXRyaWdnZXJfZXJyb3IoICIkdGhlbWVfcm9vdC8kZGlyIGlzIG5vdCByZWFkYWJsZSIsIEVfVVNFUl9OT1RJQ0UgKTsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCWZvcmVhY2ggKCAkc3ViX2RpcnMgYXMgJHN1Yl9kaXIgKSB7CgkJCQkJaWYgKCAhIGlzX2RpciggJHRoZW1lX3Jvb3QgLiAnLycgLiAkZGlyIC4gJy8nIC4gJHN1Yl9kaXIgKSB8fCAnLicgPT09ICRkaXJbMF0gfHwgJ0NWUycgPT09ICRkaXIgKSB7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0KCQkJCQlpZiAoICEgZmlsZV9leGlzdHMoICR0aGVtZV9yb290IC4gJy8nIC4gJGRpciAuICcvJyAuICRzdWJfZGlyIC4gJy9zdHlsZS5jc3MnICkgKSB7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0KCQkJCQkkZm91bmRfdGhlbWVzWyAkZGlyIC4gJy8nIC4gJHN1Yl9kaXIgXSA9IGFycmF5KAoJCQkJCQkndGhlbWVfZmlsZScgPT4gJGRpciAuICcvJyAuICRzdWJfZGlyIC4gJy9zdHlsZS5jc3MnLAoJCQkJCQkndGhlbWVfcm9vdCcgPT4gJHRoZW1lX3Jvb3QsCgkJCQkJKTsKCQkJCQkkZm91bmRfdGhlbWUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWU7CgkJCQl9CgkJCQkvLyBOZXZlciBtaW5kIHRoZSBhYm92ZSwgaXQncyBqdXN0IGEgdGhlbWUgbWlzc2luZyBhIHN0eWxlLmNzcy4KCQkJCS8vIFJldHVybiBpdDsgV1BfVGhlbWUgd2lsbCBjYXRjaCB0aGUgZXJyb3IuCgkJCQlpZiAoICEgJGZvdW5kX3RoZW1lICkgewoJCQkJCSRmb3VuZF90aGVtZXNbICRkaXIgXSA9IGFycmF5KAoJCQkJCQkndGhlbWVfZmlsZScgPT4gJGRpciAuICcvc3R5bGUuY3NzJywKCQkJCQkJJ3RoZW1lX3Jvb3QnID0+ICR0aGVtZV9yb290LAoJCQkJCSk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJYXNvcnQoICRmb3VuZF90aGVtZXMgKTsKCgkkdGhlbWVfcm9vdHMgICAgICAgICAgPSBhcnJheSgpOwoJJHJlbGF0aXZlX3RoZW1lX3Jvb3RzID0gYXJyYXlfZmxpcCggJHJlbGF0aXZlX3RoZW1lX3Jvb3RzICk7CgoJZm9yZWFjaCAoICRmb3VuZF90aGVtZXMgYXMgJHRoZW1lX2RpciA9PiAkdGhlbWVfZGF0YSApIHsKCQkkdGhlbWVfcm9vdHNbICR0aGVtZV9kaXIgXSA9ICRyZWxhdGl2ZV90aGVtZV9yb290c1sgJHRoZW1lX2RhdGFbJ3RoZW1lX3Jvb3QnXSBdOyAvLyBDb252ZXJ0IGFic29sdXRlIHRvIHJlbGF0aXZlLgoJfQoKCWlmICggZ2V0X3NpdGVfdHJhbnNpZW50KCAndGhlbWVfcm9vdHMnICkgIT0gJHRoZW1lX3Jvb3RzICkgewoJCXNldF9zaXRlX3RyYW5zaWVudCggJ3RoZW1lX3Jvb3RzJywgJHRoZW1lX3Jvb3RzLCAkY2FjaGVfZXhwaXJhdGlvbiApOwoJfQoKCXJldHVybiAkZm91bmRfdGhlbWVzOwp9CgovKioKICogUmV0cmlldmVzIHBhdGggdG8gdGhlbWVzIGRpcmVjdG9yeS4KICoKICogRG9lcyBub3QgaGF2ZSB0cmFpbGluZyBzbGFzaC4KICoKICogQHNpbmNlIDEuNS4wCiAqCiAqIEBnbG9iYWwgYXJyYXkgJHdwX3RoZW1lX2RpcmVjdG9yaWVzCiAqCiAqIEBwYXJhbSBzdHJpbmcgJHN0eWxlc2hlZXRfb3JfdGVtcGxhdGUgT3B0aW9uYWwuIFRoZSBzdHlsZXNoZWV0IG9yIHRlbXBsYXRlIG5hbWUgb2YgdGhlIHRoZW1lLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgaXMgdG8gbGV2ZXJhZ2UgdGhlIG1haW4gdGhlbWUgcm9vdC4KICogQHJldHVybiBzdHJpbmcgVGhlbWVzIGRpcmVjdG9yeSBwYXRoLgogKi8KZnVuY3Rpb24gZ2V0X3RoZW1lX3Jvb3QoICRzdHlsZXNoZWV0X29yX3RlbXBsYXRlID0gJycgKSB7CglnbG9iYWwgJHdwX3RoZW1lX2RpcmVjdG9yaWVzOwoKCSR0aGVtZV9yb290ID0gJyc7CgoJaWYgKCAkc3R5bGVzaGVldF9vcl90ZW1wbGF0ZSApIHsKCQkkdGhlbWVfcm9vdCA9IGdldF9yYXdfdGhlbWVfcm9vdCggJHN0eWxlc2hlZXRfb3JfdGVtcGxhdGUgKTsKCQlpZiAoICR0aGVtZV9yb290ICkgewoJCQkvLyBBbHdheXMgcHJlcGVuZCBXUF9DT05URU5UX0RJUiB1bmxlc3MgdGhlIHJvb3QgY3VycmVudGx5IHJlZ2lzdGVyZWQgYXMgYSB0aGVtZSBkaXJlY3RvcnkuCgkJCS8vIFRoaXMgZ2l2ZXMgcmVsYXRpdmUgdGhlbWUgcm9vdHMgdGhlIGJlbmVmaXQgb2YgdGhlIGRvdWJ0IHdoZW4gdGhpbmdzIGdvIGhheXdpcmUuCgkJCWlmICggISBpbl9hcnJheSggJHRoZW1lX3Jvb3QsIChhcnJheSkgJHdwX3RoZW1lX2RpcmVjdG9yaWVzLCB0cnVlICkgKSB7CgkJCQkkdGhlbWVfcm9vdCA9IFdQX0NPTlRFTlRfRElSIC4gJHRoZW1lX3Jvb3Q7CgkJCX0KCQl9Cgl9CgoJaWYgKCAhICR0aGVtZV9yb290ICkgewoJCSR0aGVtZV9yb290ID0gV1BfQ09OVEVOVF9ESVIgLiAnL3RoZW1lcyc7Cgl9CgoJLyoqCgkgKiBGaWx0ZXJzIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB0aGVtZXMgZGlyZWN0b3J5LgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHRoZW1lX3Jvb3QgQWJzb2x1dGUgcGF0aCB0byB0aGVtZXMgZGlyZWN0b3J5LgoJICovCglyZXR1cm4gYXBwbHlfZmlsdGVycyggJ3RoZW1lX3Jvb3QnLCAkdGhlbWVfcm9vdCApOwp9CgovKioKICogUmV0cmlldmVzIFVSSSBmb3IgdGhlbWVzIGRpcmVjdG9yeS4KICoKICogRG9lcyBub3QgaGF2ZSB0cmFpbGluZyBzbGFzaC4KICoKICogQHNpbmNlIDEuNS4wCiAqCiAqIEBnbG9iYWwgYXJyYXkgJHdwX3RoZW1lX2RpcmVjdG9yaWVzCiAqCiAqIEBwYXJhbSBzdHJpbmcgJHN0eWxlc2hlZXRfb3JfdGVtcGxhdGUgT3B0aW9uYWwuIFRoZSBzdHlsZXNoZWV0IG9yIHRlbXBsYXRlIG5hbWUgb2YgdGhlIHRoZW1lLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgaXMgdG8gbGV2ZXJhZ2UgdGhlIG1haW4gdGhlbWUgcm9vdC4KICogQHBhcmFtIHN0cmluZyAkdGhlbWVfcm9vdCAgICAgICAgICAgICBPcHRpb25hbC4gVGhlIHRoZW1lIHJvb3QgZm9yIHdoaWNoIGNhbGN1bGF0aW9ucyB3aWxsIGJlIGJhc2VkLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnRpbmcgdGhlIG5lZWQgZm9yIGEgZ2V0X3Jhd190aGVtZV9yb290KCkgY2FsbC4gRGVmYXVsdCBlbXB0eS4KICogQHJldHVybiBzdHJpbmcgVGhlbWVzIGRpcmVjdG9yeSBVUkkuCiAqLwpmdW5jdGlvbiBnZXRfdGhlbWVfcm9vdF91cmkoICRzdHlsZXNoZWV0X29yX3RlbXBsYXRlID0gJycsICR0aGVtZV9yb290ID0gJycgKSB7CglnbG9iYWwgJHdwX3RoZW1lX2RpcmVjdG9yaWVzOwoKCWlmICggJHN0eWxlc2hlZXRfb3JfdGVtcGxhdGUgJiYgISAkdGhlbWVfcm9vdCApIHsKCQkkdGhlbWVfcm9vdCA9IGdldF9yYXdfdGhlbWVfcm9vdCggJHN0eWxlc2hlZXRfb3JfdGVtcGxhdGUgKTsKCX0KCglpZiAoICRzdHlsZXNoZWV0X29yX3RlbXBsYXRlICYmICR0aGVtZV9yb290ICkgewoJCWlmICggaW5fYXJyYXkoICR0aGVtZV9yb290LCAoYXJyYXkpICR3cF90aGVtZV9kaXJlY3RvcmllcywgdHJ1ZSApICkgewoJCQkvLyBBYnNvbHV0ZSBwYXRoLiBNYWtlIGFuIGVkdWNhdGVkIGd1ZXNzLiBZTU1WIC0tIGJ1dCBub3RlIHRoZSBmaWx0ZXIgYmVsb3cuCgkJCWlmICggMCA9PT0gc3RycG9zKCAkdGhlbWVfcm9vdCwgV1BfQ09OVEVOVF9ESVIgKSApIHsKCQkJCSR0aGVtZV9yb290X3VyaSA9IGNvbnRlbnRfdXJsKCBzdHJfcmVwbGFjZSggV1BfQ09OVEVOVF9ESVIsICcnLCAkdGhlbWVfcm9vdCApICk7CgkJCX0gZWxzZWlmICggMCA9PT0gc3RycG9zKCAkdGhlbWVfcm9vdCwgQUJTUEFUSCApICkgewoJCQkJJHRoZW1lX3Jvb3RfdXJpID0gc2l0ZV91cmwoIHN0cl9yZXBsYWNlKCBBQlNQQVRILCAnJywgJHRoZW1lX3Jvb3QgKSApOwoJCQl9IGVsc2VpZiAoIDAgPT09IHN0cnBvcyggJHRoZW1lX3Jvb3QsIFdQX1BMVUdJTl9ESVIgKSB8fCAwID09PSBzdHJwb3MoICR0aGVtZV9yb290LCBXUE1VX1BMVUdJTl9ESVIgKSApIHsKCQkJCSR0aGVtZV9yb290X3VyaSA9IHBsdWdpbnNfdXJsKCBiYXNlbmFtZSggJHRoZW1lX3Jvb3QgKSwgJHRoZW1lX3Jvb3QgKTsKCQkJfSBlbHNlIHsKCQkJCSR0aGVtZV9yb290X3VyaSA9ICR0aGVtZV9yb290OwoJCQl9CgkJfSBlbHNlIHsKCQkJJHRoZW1lX3Jvb3RfdXJpID0gY29udGVudF91cmwoICR0aGVtZV9yb290ICk7CgkJfQoJfSBlbHNlIHsKCQkkdGhlbWVfcm9vdF91cmkgPSBjb250ZW50X3VybCggJ3RoZW1lcycgKTsKCX0KCgkvKioKCSAqIEZpbHRlcnMgdGhlIFVSSSBmb3IgdGhlbWVzIGRpcmVjdG9yeS4KCSAqCgkgKiBAc2luY2UgMS41LjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR0aGVtZV9yb290X3VyaSAgICAgICAgIFRoZSBVUkkgZm9yIHRoZW1lcyBkaXJlY3RvcnkuCgkgKiBAcGFyYW0gc3RyaW5nICRzaXRldXJsICAgICAgICAgICAgICAgIFdvcmRQcmVzcyB3ZWIgYWRkcmVzcyB3aGljaCBpcyBzZXQgaW4gR2VuZXJhbCBPcHRpb25zLgoJICogQHBhcmFtIHN0cmluZyAkc3R5bGVzaGVldF9vcl90ZW1wbGF0ZSBUaGUgc3R5bGVzaGVldCBvciB0ZW1wbGF0ZSBuYW1lIG9mIHRoZSB0aGVtZS4KCSAqLwoJcmV0dXJuIGFwcGx5X2ZpbHRlcnMoICd0aGVtZV9yb290X3VyaScsICR0aGVtZV9yb290X3VyaSwgZ2V0X29wdGlvbiggJ3NpdGV1cmwnICksICRzdHlsZXNoZWV0X29yX3RlbXBsYXRlICk7Cn0KCi8qKgogKiBHZXRzIHRoZSByYXcgdGhlbWUgcm9vdCByZWxhdGl2ZSB0byB0aGUgY29udGVudCBkaXJlY3Rvcnkgd2l0aCBubyBmaWx0ZXJzIGFwcGxpZWQuCiAqCiAqIEBzaW5jZSAzLjEuMAogKgogKiBAZ2xvYmFsIGFycmF5ICR3cF90aGVtZV9kaXJlY3RvcmllcwogKgogKiBAcGFyYW0gc3RyaW5nICRzdHlsZXNoZWV0X29yX3RlbXBsYXRlIFRoZSBzdHlsZXNoZWV0IG9yIHRlbXBsYXRlIG5hbWUgb2YgdGhlIHRoZW1lLgogKiBAcGFyYW0gYm9vbCAgICRza2lwX2NhY2hlICAgICAgICAgICAgIE9wdGlvbmFsLiBXaGV0aGVyIHRvIHNraXAgdGhlIGNhY2hlLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIGZhbHNlLCBtZWFuaW5nIHRoZSBjYWNoZSBpcyB1c2VkLgogKiBAcmV0dXJuIHN0cmluZyBUaGVtZSByb290LgogKi8KZnVuY3Rpb24gZ2V0X3Jhd190aGVtZV9yb290KCAkc3R5bGVzaGVldF9vcl90ZW1wbGF0ZSwgJHNraXBfY2FjaGUgPSBmYWxzZSApIHsKCWdsb2JhbCAkd3BfdGhlbWVfZGlyZWN0b3JpZXM7CgoJaWYgKCAhIGlzX2FycmF5KCAkd3BfdGhlbWVfZGlyZWN0b3JpZXMgKSB8fCBjb3VudCggJHdwX3RoZW1lX2RpcmVjdG9yaWVzICkgPD0gMSApIHsKCQlyZXR1cm4gJy90aGVtZXMnOwoJfQoKCSR0aGVtZV9yb290ID0gZmFsc2U7CgoJLy8gSWYgcmVxdWVzdGluZyB0aGUgcm9vdCBmb3IgdGhlIGFjdGl2ZSB0aGVtZSwgY29uc3VsdCBvcHRpb25zIHRvIGF2b2lkIGNhbGxpbmcgZ2V0X3RoZW1lX3Jvb3RzKCkuCglpZiAoICEgJHNraXBfY2FjaGUgKSB7CgkJaWYgKCBnZXRfb3B0aW9uKCAnc3R5bGVzaGVldCcgKSA9PSAkc3R5bGVzaGVldF9vcl90ZW1wbGF0ZSApIHsKCQkJJHRoZW1lX3Jvb3QgPSBnZXRfb3B0aW9uKCAnc3R5bGVzaGVldF9yb290JyApOwoJCX0gZWxzZWlmICggZ2V0X29wdGlvbiggJ3RlbXBsYXRlJyApID09ICRzdHlsZXNoZWV0X29yX3RlbXBsYXRlICkgewoJCQkkdGhlbWVfcm9vdCA9IGdldF9vcHRpb24oICd0ZW1wbGF0ZV9yb290JyApOwoJCX0KCX0KCglpZiAoIGVtcHR5KCAkdGhlbWVfcm9vdCApICkgewoJCSR0aGVtZV9yb290cyA9IGdldF90aGVtZV9yb290cygpOwoJCWlmICggISBlbXB0eSggJHRoZW1lX3Jvb3RzWyAkc3R5bGVzaGVldF9vcl90ZW1wbGF0ZSBdICkgKSB7CgkJCSR0aGVtZV9yb290ID0gJHRoZW1lX3Jvb3RzWyAkc3R5bGVzaGVldF9vcl90ZW1wbGF0ZSBdOwoJCX0KCX0KCglyZXR1cm4gJHRoZW1lX3Jvb3Q7Cn0KCi8qKgogKiBEaXNwbGF5cyBsb2NhbGl6ZWQgc3R5bGVzaGVldCBsaW5rIGVsZW1lbnQuCiAqCiAqIEBzaW5jZSAyLjEuMAogKi8KZnVuY3Rpb24gbG9jYWxlX3N0eWxlc2hlZXQoKSB7Cgkkc3R5bGVzaGVldCA9IGdldF9sb2NhbGVfc3R5bGVzaGVldF91cmkoKTsKCWlmICggZW1wdHkoICRzdHlsZXNoZWV0ICkgKSB7CgkJcmV0dXJuOwoJfQoKCSR0eXBlX2F0dHIgPSBjdXJyZW50X3RoZW1lX3N1cHBvcnRzKCAnaHRtbDUnLCAnc3R5bGUnICkgPyAnJyA6ICcgdHlwZT0idGV4dC9jc3MiJzsKCglwcmludGYoCgkJJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iJXMiJXMgbWVkaWE9InNjcmVlbiIgLz4nLAoJCSRzdHlsZXNoZWV0LAoJCSR0eXBlX2F0dHIKCSk7Cn0KCi8qKgogKiBTd2l0Y2hlcyB0aGUgdGhlbWUuCiAqCiAqIEFjY2VwdHMgb25lIGFyZ3VtZW50OiAkc3R5bGVzaGVldCBvZiB0aGUgdGhlbWUuIEl0IGFsc28gYWNjZXB0cyBhbiBhZGRpdGlvbmFsIGZ1bmN0aW9uIHNpZ25hdHVyZQogKiBvZiB0d28gYXJndW1lbnRzOiAkdGVtcGxhdGUgdGhlbiAkc3R5bGVzaGVldC4gVGhpcyBpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KICoKICogQHNpbmNlIDIuNS4wCiAqCiAqIEBnbG9iYWwgYXJyYXkgICAgICAgICAgICAgICAgJHdwX3RoZW1lX2RpcmVjdG9yaWVzCiAqIEBnbG9iYWwgV1BfQ3VzdG9taXplX01hbmFnZXIgJHdwX2N1c3RvbWl6ZQogKiBAZ2xvYmFsIGFycmF5ICAgICAgICAgICAgICAgICRzaWRlYmFyc193aWRnZXRzCiAqCiAqIEBwYXJhbSBzdHJpbmcgJHN0eWxlc2hlZXQgU3R5bGVzaGVldCBuYW1lLgogKi8KZnVuY3Rpb24gc3dpdGNoX3RoZW1lKCAkc3R5bGVzaGVldCApIHsKCWdsb2JhbCAkd3BfdGhlbWVfZGlyZWN0b3JpZXMsICR3cF9jdXN0b21pemUsICRzaWRlYmFyc193aWRnZXRzOwoKCSRyZXF1aXJlbWVudHMgPSB2YWxpZGF0ZV90aGVtZV9yZXF1aXJlbWVudHMoICRzdHlsZXNoZWV0ICk7CglpZiAoIGlzX3dwX2Vycm9yKCAkcmVxdWlyZW1lbnRzICkgKSB7CgkJd3BfZGllKCAkcmVxdWlyZW1lbnRzICk7Cgl9CgoJJF9zaWRlYmFyc193aWRnZXRzID0gbnVsbDsKCWlmICggJ3dwX2FqYXhfY3VzdG9taXplX3NhdmUnID09PSBjdXJyZW50X2FjdGlvbigpICkgewoJCSRvbGRfc2lkZWJhcnNfd2lkZ2V0c19kYXRhX3NldHRpbmcgPSAkd3BfY3VzdG9taXplLT5nZXRfc2V0dGluZyggJ29sZF9zaWRlYmFyc193aWRnZXRzX2RhdGEnICk7CgkJaWYgKCAkb2xkX3NpZGViYXJzX3dpZGdldHNfZGF0YV9zZXR0aW5nICkgewoJCQkkX3NpZGViYXJzX3dpZGdldHMgPSAkd3BfY3VzdG9taXplLT5wb3N0X3ZhbHVlKCAkb2xkX3NpZGViYXJzX3dpZGdldHNfZGF0YV9zZXR0aW5nICk7CgkJfQoJfSBlbHNlaWYgKCBpc19hcnJheSggJHNpZGViYXJzX3dpZGdldHMgKSApIHsKCQkkX3NpZGViYXJzX3dpZGdldHMgPSAkc2lkZWJhcnNfd2lkZ2V0czsKCX0KCglpZiAoIGlzX2FycmF5KCAkX3NpZGViYXJzX3dpZGdldHMgKSApIHsKCQlzZXRfdGhlbWVfbW9kKAoJCQknc2lkZWJhcnNfd2lkZ2V0cycsCgkJCWFycmF5KAoJCQkJJ3RpbWUnID0+IHRpbWUoKSwKCQkJCSdkYXRhJyA9PiAkX3NpZGViYXJzX3dpZGdldHMsCgkJCSkKCQkpOwoJfQoKCSRuYXZfbWVudV9sb2NhdGlvbnMgPSBnZXRfdGhlbWVfbW9kKCAnbmF2X21lbnVfbG9jYXRpb25zJyApOwoJdXBkYXRlX29wdGlvbiggJ3RoZW1lX3N3aXRjaF9tZW51X2xvY2F0aW9ucycsICRuYXZfbWVudV9sb2NhdGlvbnMgKTsKCglpZiAoIGZ1bmNfbnVtX2FyZ3MoKSA+IDEgKSB7CgkJJHN0eWxlc2hlZXQgPSBmdW5jX2dldF9hcmcoIDEgKTsKCX0KCgkkb2xkX3RoZW1lID0gd3BfZ2V0X3RoZW1lKCk7CgkkbmV3X3RoZW1lID0gd3BfZ2V0X3RoZW1lKCAkc3R5bGVzaGVldCApOwoJJHRlbXBsYXRlICA9ICRuZXdfdGhlbWUtPmdldF90ZW1wbGF0ZSgpOwoKCWlmICggd3BfaXNfcmVjb3ZlcnlfbW9kZSgpICkgewoJCSRwYXVzZWRfdGhlbWVzID0gd3BfcGF1c2VkX3RoZW1lcygpOwoJCSRwYXVzZWRfdGhlbWVzLT5kZWxldGUoICRvbGRfdGhlbWUtPmdldF9zdHlsZXNoZWV0KCkgKTsKCQkkcGF1c2VkX3RoZW1lcy0+ZGVsZXRlKCAkb2xkX3RoZW1lLT5nZXRfdGVtcGxhdGUoKSApOwoJfQoKCXVwZGF0ZV9vcHRpb24oICd0ZW1wbGF0ZScsICR0ZW1wbGF0ZSApOwoJdXBkYXRlX29wdGlvbiggJ3N0eWxlc2hlZXQnLCAkc3R5bGVzaGVldCApOwoKCWlmICggY291bnQoICR3cF90aGVtZV9kaXJlY3RvcmllcyApID4gMSApIHsKCQl1cGRhdGVfb3B0aW9uKCAndGVtcGxhdGVfcm9vdCcsIGdldF9yYXdfdGhlbWVfcm9vdCggJHRlbXBsYXRlLCB0cnVlICkgKTsKCQl1cGRhdGVfb3B0aW9uKCAnc3R5bGVzaGVldF9yb290JywgZ2V0X3Jhd190aGVtZV9yb290KCAkc3R5bGVzaGVldCwgdHJ1ZSApICk7Cgl9IGVsc2UgewoJCWRlbGV0ZV9vcHRpb24oICd0ZW1wbGF0ZV9yb290JyApOwoJCWRlbGV0ZV9vcHRpb24oICdzdHlsZXNoZWV0X3Jvb3QnICk7Cgl9CgoJJG5ld19uYW1lID0gJG5ld190aGVtZS0+Z2V0KCAnTmFtZScgKTsKCgl1cGRhdGVfb3B0aW9uKCAnY3VycmVudF90aGVtZScsICRuZXdfbmFtZSApOwoKCS8vIE1pZ3JhdGUgZnJvbSB0aGUgb2xkIG1vZHNfe25hbWV9IG9wdGlvbiB0byB0aGVtZV9tb2RzX3tzbHVnfS4KCWlmICggaXNfYWRtaW4oKSAmJiBmYWxzZSA9PT0gZ2V0X29wdGlvbiggJ3RoZW1lX21vZHNfJyAuICRzdHlsZXNoZWV0ICkgKSB7CgkJJGRlZmF1bHRfdGhlbWVfbW9kcyA9IChhcnJheSkgZ2V0X29wdGlvbiggJ21vZHNfJyAuICRuZXdfbmFtZSApOwoJCWlmICggISBlbXB0eSggJG5hdl9tZW51X2xvY2F0aW9ucyApICYmIGVtcHR5KCAkZGVmYXVsdF90aGVtZV9tb2RzWyduYXZfbWVudV9sb2NhdGlvbnMnXSApICkgewoJCQkkZGVmYXVsdF90aGVtZV9tb2RzWyduYXZfbWVudV9sb2NhdGlvbnMnXSA9ICRuYXZfbWVudV9sb2NhdGlvbnM7CgkJfQoJCWFkZF9vcHRpb24oICJ0aGVtZV9tb2RzXyRzdHlsZXNoZWV0IiwgJGRlZmF1bHRfdGhlbWVfbW9kcyApOwoJfSBlbHNlIHsKCQkvKgoJCSAqIFNpbmNlIHJldHJpZXZlX3dpZGdldHMoKSBpcyBjYWxsZWQgd2hlbiBpbml0aWFsaXppbmcgYSB0aGVtZSBpbiB0aGUgQ3VzdG9taXplciwKCQkgKiB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgdGhlbWUgbW9kcyB0byBhdm9pZCBvdmVyd3JpdGluZyBjaGFuZ2VzIG1hZGUgdmlhCgkJICogdGhlIEN1c3RvbWl6ZXIgd2hlbiBhY2Nlc3Npbmcgd3AtYWRtaW4vd2lkZ2V0cy5waHAuCgkJICovCgkJaWYgKCAnd3BfYWpheF9jdXN0b21pemVfc2F2ZScgPT09IGN1cnJlbnRfYWN0aW9uKCkgKSB7CgkJCXJlbW92ZV90aGVtZV9tb2QoICdzaWRlYmFyc193aWRnZXRzJyApOwoJCX0KCX0KCgl1cGRhdGVfb3B0aW9uKCAndGhlbWVfc3dpdGNoZWQnLCAkb2xkX3RoZW1lLT5nZXRfc3R5bGVzaGVldCgpICk7CgoJLyoqCgkgKiBGaXJlcyBhZnRlciB0aGUgdGhlbWUgaXMgc3dpdGNoZWQuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKiBAc2luY2UgNC41LjAgSW50cm9kdWNlZCB0aGUgYCRvbGRfdGhlbWVgIHBhcmFtZXRlci4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICAgJG5ld19uYW1lICBOYW1lIG9mIHRoZSBuZXcgdGhlbWUuCgkgKiBAcGFyYW0gV1BfVGhlbWUgJG5ld190aGVtZSBXUF9UaGVtZSBpbnN0YW5jZSBvZiB0aGUgbmV3IHRoZW1lLgoJICogQHBhcmFtIFdQX1RoZW1lICRvbGRfdGhlbWUgV1BfVGhlbWUgaW5zdGFuY2Ugb2YgdGhlIG9sZCB0aGVtZS4KCSAqLwoJZG9fYWN0aW9uKCAnc3dpdGNoX3RoZW1lJywgJG5ld19uYW1lLCAkbmV3X3RoZW1lLCAkb2xkX3RoZW1lICk7Cn0KCi8qKgogKiBDaGVja3MgdGhhdCB0aGUgYWN0aXZlIHRoZW1lIGhhcyB0aGUgcmVxdWlyZWQgZmlsZXMuCiAqCiAqIFN0YW5kYWxvbmUgdGhlbWVzIG5lZWQgdG8gaGF2ZSBhIGB0ZW1wbGF0ZXMvaW5kZXguaHRtbGAgb3IgYGluZGV4LnBocGAgdGVtcGxhdGUgZmlsZS4KICogQ2hpbGQgdGhlbWVzIG5lZWQgdG8gaGF2ZSBhIGBUZW1wbGF0ZWAgaGVhZGVyIGluIHRoZSBgc3R5bGUuY3NzYCBzdHlsZXNoZWV0LgogKgogKiBEb2VzIG5vdCBpbml0aWFsbHkgY2hlY2sgdGhlIGRlZmF1bHQgdGhlbWUsIHdoaWNoIGlzIHRoZSBmYWxsYmFjayBhbmQgc2hvdWxkIGFsd2F5cyBleGlzdC4KICogQnV0IGlmIGl0IGRvZXNuJ3QgZXhpc3QsIGl0J2xsIGZhbGwgYmFjayB0byB0aGUgbGF0ZXN0IGNvcmUgZGVmYXVsdCB0aGVtZSB0aGF0IGRvZXMgZXhpc3QuCiAqIFdpbGwgc3dpdGNoIHRoZW1lIHRvIHRoZSBmYWxsYmFjayB0aGVtZSBpZiBhY3RpdmUgdGhlbWUgZG9lcyBub3QgdmFsaWRhdGUuCiAqCiAqIFlvdSBjYW4gdXNlIHRoZSB7QHNlZSAndmFsaWRhdGVfY3VycmVudF90aGVtZSd9IGZpbHRlciB0byByZXR1cm4gZmFsc2UgdG8gZGlzYWJsZQogKiB0aGlzIGZ1bmN0aW9uYWxpdHkuCiAqCiAqIEBzaW5jZSAxLjUuMAogKiBAc2luY2UgNi4wLjAgUmVtb3ZlZCB0aGUgcmVxdWlyZW1lbnQgZm9yIGJsb2NrIHRoZW1lcyB0byBoYXZlIGFuIGBpbmRleC5waHBgIHRlbXBsYXRlLgogKgogKiBAc2VlIFdQX0RFRkFVTFRfVEhFTUUKICoKICogQHJldHVybiBib29sCiAqLwoKCgoKZnVuY3Rpb24gdmFsaWRhdGVfY3VycmVudF90aGVtZSgpIHsKCS8qKgoJICogRmlsdGVycyB3aGV0aGVyIHRvIHZhbGlkYXRlIHRoZSBhY3RpdmUgdGhlbWUuCgkgKgoJICogQHNpbmNlIDIuNy4wCgkgKgoJICogQHBhcmFtIGJvb2wgJHZhbGlkYXRlIFdoZXRoZXIgdG8gdmFsaWRhdGUgdGhlIGFjdGl2ZSB0aGVtZS4gRGVmYXVsdCB0cnVlLgoJICovCglpZiAoIHdwX2luc3RhbGxpbmcoKSB8fCAhIGFwcGx5X2ZpbHRlcnMoICd2YWxpZGF0ZV9jdXJyZW50X3RoZW1lJywgdHJ1ZSApICkgewoJCXJldHVybiB0cnVlOwoJfQoKCWlmICgKCQkhIGZpbGVfZXhpc3RzKCBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5KCkgLiAnL3RlbXBsYXRlcy9pbmRleC5odG1sJyApCgkJJiYgISBmaWxlX2V4aXN0cyggZ2V0X3RlbXBsYXRlX2RpcmVjdG9yeSgpIC4gJy9ibG9jay10ZW1wbGF0ZXMvaW5kZXguaHRtbCcgKSAvLyBEZXByZWNhdGVkIHBhdGggc3VwcG9ydCBzaW5jZSA1LjkuMC4KCQkmJiAhIGZpbGVfZXhpc3RzKCBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5KCkgLiAnL2luZGV4LnBocCcgKQoJKSB7CgkJLy8gSW52YWxpZC4KCX0gZWxzZWlmICggISBmaWxlX2V4aXN0cyggZ2V0X3RlbXBsYXRlX2RpcmVjdG9yeSgpIC4gJy9zdHlsZS5jc3MnICkgKSB7CgkJLy8gSW52YWxpZC4KCX0gZWxzZWlmICggaXNfY2hpbGRfdGhlbWUoKSAmJiAhIGZpbGVfZXhpc3RzKCBnZXRfc3R5bGVzaGVldF9kaXJlY3RvcnkoKSAuICcvc3R5bGUuY3NzJyApICkgewoJCS8vIEludmFsaWQuCgl9IGVsc2UgewoJCS8vIFZhbGlkLgoJCXJldHVybiB0cnVlOwoJfQoKCSRkZWZhdWx0ID0gd3BfZ2V0X3RoZW1lKCBXUF9ERUZBVUxUX1RIRU1FICk7CglpZiAoICRkZWZhdWx0LT5leGlzdHMoKSApIHsKCQlzd2l0Y2hfdGhlbWUoIFdQX0RFRkFVTFRfVEhFTUUgKTsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBJZiB3ZSdyZSBpbiBhbiBpbnZhbGlkIHN0YXRlIGJ1dCBXUF9ERUZBVUxUX1RIRU1FIGRvZXNuJ3QgZXhpc3QsCgkgKiBzd2l0Y2ggdG8gdGhlIGxhdGVzdCBjb3JlIGRlZmF1bHQgdGhlbWUgdGhhdCdzIGluc3RhbGxlZC4KCSAqCgkgKiBJZiBpdCB0dXJucyBvdXQgdGhhdCB0aGlzIGxhdGVzdCBjb3JlIGRlZmF1bHQgdGhlbWUgaXMgb3VyIGN1cnJlbnQKCSAqIHRoZW1lLCB0aGVuIHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhhdCwgc28gd2UgaGF2ZSB0byBiYWlsLAoJICogcmF0aGVyIHRoYW4gZ29pbmcgaW50byBhbiBpbmZpbml0ZSBsb29wLiAoVGhpcyBpcyB3aHkgdGhlcmUgYXJlCgkgKiBjaGVja3MgYWdhaW5zdCBXUF9ERUZBVUxUX1RIRU1FIGFib3ZlLCBhbHNvLikgV2UgYWxzbyBjYW4ndCBkbyBhbnl0aGluZwoJICogaWYgaXQgdHVybnMgb3V0IHRoZXJlIGlzIG5vIGRlZmF1bHQgdGhlbWUgaW5zdGFsbGVkLiAoVGhhdCdzIGBmYWxzZWAuKQoJICovCgkkZGVmYXVsdCA9IFdQX1RoZW1lOjpnZXRfY29yZV9kZWZhdWx0X3RoZW1lKCk7CglpZiAoIGZhbHNlID09PSAkZGVmYXVsdCB8fCBnZXRfc3R5bGVzaGVldCgpID09ICRkZWZhdWx0LT5nZXRfc3R5bGVzaGVldCgpICkgewoJCXJldHVybiB0cnVlOwoJfQoKCXN3aXRjaF90aGVtZSggJGRlZmF1bHQtPmdldF9zdHlsZXNoZWV0KCkgKTsKCXJldHVybiBmYWxzZTsKfQoKLyoqCiAqIFZhbGlkYXRlcyB0aGUgdGhlbWUgcmVxdWlyZW1lbnRzIGZvciBXb3JkUHJlc3MgdmVyc2lvbiBhbmQgUEhQIHZlcnNpb24uCiAqCiAqIFVzZXMgdGhlIGluZm9ybWF0aW9uIGZyb20gYFJlcXVpcmVzIGF0IGxlYXN0YCBhbmQgYFJlcXVpcmVzIFBIUGAgaGVhZGVycwogKiBkZWZpbmVkIGluIHRoZSB0aGVtZSdzIGBzdHlsZS5jc3NgIGZpbGUuCiAqCiAqIEBzaW5jZSA1LjUuMAogKiBAc2luY2UgNS44LjAgUmVtb3ZlZCBzdXBwb3J0IGZvciB1c2luZyBgcmVhZG1lLnR4dGAgYXMgYSBmYWxsYmFjay4KICoKICogQHBhcmFtIHN0cmluZyAkc3R5bGVzaGVldCBEaXJlY3RvcnkgbmFtZSBmb3IgdGhlIHRoZW1lLgogKiBAcmV0dXJuIHRydWV8V1BfRXJyb3IgVHJ1ZSBpZiByZXF1aXJlbWVudHMgYXJlIG1ldCwgV1BfRXJyb3Igb24gZmFpbHVyZS4KICovCmZ1bmN0aW9uIHZhbGlkYXRlX3RoZW1lX3JlcXVpcmVtZW50cyggJHN0eWxlc2hlZXQgKSB7CgkkdGhlbWUgPSB3cF9nZXRfdGhlbWUoICRzdHlsZXNoZWV0ICk7CgoJJHJlcXVpcmVtZW50cyA9IGFycmF5KAoJCSdyZXF1aXJlcycgICAgID0+ICEgZW1wdHkoICR0aGVtZS0+Z2V0KCAnUmVxdWlyZXNXUCcgKSApID8gJHRoZW1lLT5nZXQoICdSZXF1aXJlc1dQJyApIDogJycsCgkJJ3JlcXVpcmVzX3BocCcgPT4gISBlbXB0eSggJHRoZW1lLT5nZXQoICdSZXF1aXJlc1BIUCcgKSApID8gJHRoZW1lLT5nZXQoICdSZXF1aXJlc1BIUCcgKSA6ICcnLAoJKTsKCgkkY29tcGF0aWJsZV93cCAgPSBpc193cF92ZXJzaW9uX2NvbXBhdGlibGUoICRyZXF1aXJlbWVudHNbJ3JlcXVpcmVzJ10gKTsKCSRjb21wYXRpYmxlX3BocCA9IGlzX3BocF92ZXJzaW9uX2NvbXBhdGlibGUoICRyZXF1aXJlbWVudHNbJ3JlcXVpcmVzX3BocCddICk7CgoJaWYgKCAhICRjb21wYXRpYmxlX3dwICYmICEgJGNvbXBhdGlibGVfcGhwICkgewoJCXJldHVybiBuZXcgV1BfRXJyb3IoCgkJCSd0aGVtZV93cF9waHBfaW5jb21wYXRpYmxlJywKCQkJc3ByaW50ZigKCQkJCS8qIHRyYW5zbGF0b3JzOiAlczogVGhlbWUgbmFtZS4gKi8KCQkJCV94KCAnPHN0cm9uZz5FcnJvcjo8L3N0cm9uZz4gQ3VycmVudCBXb3JkUHJlc3MgYW5kIFBIUCB2ZXJzaW9ucyBkbyBub3QgbWVldCBtaW5pbXVtIHJlcXVpcmVtZW50cyBmb3IgJXMuJywgJ3RoZW1lJyApLAoJCQkJJHRoZW1lLT5kaXNwbGF5KCAnTmFtZScgKQoJCQkpCgkJKTsKCX0gZWxzZWlmICggISAkY29tcGF0aWJsZV9waHAgKSB7CgkJcmV0dXJuIG5ldyBXUF9FcnJvcigKCQkJJ3RoZW1lX3BocF9pbmNvbXBhdGlibGUnLAoJCQlzcHJpbnRmKAoJCQkJLyogdHJhbnNsYXRvcnM6ICVzOiBUaGVtZSBuYW1lLiAqLwoJCQkJX3goICc8c3Ryb25nPkVycm9yOjwvc3Ryb25nPiBDdXJyZW50IFBIUCB2ZXJzaW9uIGRvZXMgbm90IG1lZXQgbWluaW11bSByZXF1aXJlbWVudHMgZm9yICVzLicsICd0aGVtZScgKSwKCQkJCSR0aGVtZS0+ZGlzcGxheSggJ05hbWUnICkKCQkJKQoJCSk7Cgl9IGVsc2VpZiAoICEgJGNvbXBhdGlibGVfd3AgKSB7CgkJcmV0dXJuIG5ldyBXUF9FcnJvcigKCQkJJ3RoZW1lX3dwX2luY29tcGF0aWJsZScsCgkJCXNwcmludGYoCgkJCQkvKiB0cmFuc2xhdG9yczogJXM6IFRoZW1lIG5hbWUuICovCgkJCQlfeCggJzxzdHJvbmc+RXJyb3I6PC9zdHJvbmc+IEN1cnJlbnQgV29yZFByZXNzIHZlcnNpb24gZG9lcyBub3QgbWVldCBtaW5pbXVtIHJlcXVpcmVtZW50cyBmb3IgJXMuJywgJ3RoZW1lJyApLAoJCQkJJHRoZW1lLT5kaXNwbGF5KCAnTmFtZScgKQoJCQkpCgkJKTsKCX0KCglyZXR1cm4gdHJ1ZTsKfQoKLyoqCiAqIFJldHJpZXZlcyBhbGwgdGhlbWUgbW9kaWZpY2F0aW9ucy4KICoKICogQHNpbmNlIDMuMS4wCiAqIEBzaW5jZSA1LjkuMCBUaGUgcmV0dXJuIHZhbHVlIGlzIGFsd2F5cyBhbiBhcnJheS4KICoKICogQHJldHVybiBhcnJheSBUaGVtZSBtb2RpZmljYXRpb25zLgogKi8KZnVuY3Rpb24gZ2V0X3RoZW1lX21vZHMoKSB7CgkkdGhlbWVfc2x1ZyA9IGdldF9vcHRpb24oICdzdHlsZXNoZWV0JyApOwoJJG1vZHMgICAgICAgPSBnZXRfb3B0aW9uKCAidGhlbWVfbW9kc18kdGhlbWVfc2x1ZyIgKTsKCglpZiAoIGZhbHNlID09PSAkbW9kcyApIHsKCQkkdGhlbWVfbmFtZSA9IGdldF9vcHRpb24oICdjdXJyZW50X3RoZW1lJyApOwoJCWlmICggZmFsc2UgPT09ICR0aGVtZV9uYW1lICkgewoJCQkkdGhlbWVfbmFtZSA9IHdwX2dldF90aGVtZSgpLT5nZXQoICdOYW1lJyApOwoJCX0KCgkJJG1vZHMgPSBnZXRfb3B0aW9uKCAibW9kc18kdGhlbWVfbmFtZSIgKTsgLy8gRGVwcmVjYXRlZCBsb2NhdGlvbi4KCQlpZiAoIGlzX2FkbWluKCkgJiYgZmFsc2UgIT09ICRtb2RzICkgewoJCQl1cGRhdGVfb3B0aW9uKCAidGhlbWVfbW9kc18kdGhlbWVfc2x1ZyIsICRtb2RzICk7CgkJCWRlbGV0ZV9vcHRpb24oICJtb2RzXyR0aGVtZV9uYW1lIiApOwoJCX0KCX0KCglpZiAoICEgaXNfYXJyYXkoICRtb2RzICkgKSB7CgkJJG1vZHMgPSBhcnJheSgpOwoJfQoKCXJldHVybiAkbW9kczsKfQoKLyoqCiAqIFJldHJpZXZlcyB0aGVtZSBtb2RpZmljYXRpb24gdmFsdWUgZm9yIHRoZSBhY3RpdmUgdGhlbWUuCiAqCiAqIElmIHRoZSBtb2RpZmljYXRpb24gbmFtZSBkb2VzIG5vdCBleGlzdCBhbmQgYCRkZWZhdWx0YCBpcyBhIHN0cmluZywgdGhlbiB0aGUKICogZGVmYXVsdCB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoIHRoZSB7QGxpbmsgaHR0cHM6Ly93d3cucGhwLm5ldC9zcHJpbnRmIHNwcmludGYoKX0KICogUEhQIGZ1bmN0aW9uIHdpdGggdGhlIHRlbXBsYXRlIGRpcmVjdG9yeSBVUkkgYXMgdGhlIGZpcnN0IHZhbHVlIGFuZCB0aGUKICogc3R5bGVzaGVldCBkaXJlY3RvcnkgVVJJIGFzIHRoZSBzZWNvbmQgdmFsdWUuCiAqCiAqIEBzaW5jZSAyLjEuMAogKgogKiBAcGFyYW0gc3RyaW5nICRuYW1lICAgIFRoZW1lIG1vZGlmaWNhdGlvbiBuYW1lLgogKiBAcGFyYW0gbWl4ZWQgICRkZWZhdWx0IE9wdGlvbmFsLiBUaGVtZSBtb2RpZmljYXRpb24gZGVmYXVsdCB2YWx1ZS4gRGVmYXVsdCBmYWxzZS4KICogQHJldHVybiBtaXhlZCBUaGVtZSBtb2RpZmljYXRpb24gdmFsdWUuCiAqLwpmdW5jdGlvbiBnZXRfdGhlbWVfbW9kKCAkbmFtZSwgJGRlZmF1bHQgPSBmYWxzZSApIHsKCSRtb2RzID0gZ2V0X3RoZW1lX21vZHMoKTsKCglpZiAoIGlzc2V0KCAkbW9kc1sgJG5hbWUgXSApICkgewoJCS8qKgoJCSAqIEZpbHRlcnMgdGhlIHRoZW1lIG1vZGlmaWNhdGlvbiwgb3IgJ3RoZW1lX21vZCcsIHZhbHVlLgoJCSAqCgkJICogVGhlIGR5bmFtaWMgcG9ydGlvbiBvZiB0aGUgaG9vayBuYW1lLCBgJG5hbWVgLCByZWZlcnMgdG8gdGhlIGtleSBuYW1lCgkJICogb2YgdGhlIG1vZGlmaWNhdGlvbiBhcnJheS4gRm9yIGV4YW1wbGUsICdoZWFkZXJfdGV4dGNvbG9yJywgJ2hlYWRlcl9pbWFnZScsCgkJICogYW5kIHNvIG9uIGRlcGVuZGluZyBvbiB0aGUgdGhlbWUgb3B0aW9ucy4KCQkgKgoJCSAqIEBzaW5jZSAyLjIuMAoJCSAqCgkJICogQHBhcmFtIG1peGVkICRjdXJyZW50X21vZCBUaGUgdmFsdWUgb2YgdGhlIGFjdGl2ZSB0aGVtZSBtb2RpZmljYXRpb24uCgkJICovCgkJcmV0dXJuIGFwcGx5X2ZpbHRlcnMoICJ0aGVtZV9tb2RfeyRuYW1lfSIsICRtb2RzWyAkbmFtZSBdICk7Cgl9CgoJaWYgKCBpc19zdHJpbmcoICRkZWZhdWx0ICkgKSB7CgkJLy8gT25seSBydW4gdGhlIHJlcGxhY2VtZW50IGlmIGFuIHNwcmludGYoKSBzdHJpbmcgZm9ybWF0IHBhdHRlcm4gd2FzIGZvdW5kLgoJCWlmICggcHJlZ19tYXRjaCggJyMoPzwhJSklKD86XGQrXCQ/KT9zIycsICRkZWZhdWx0ICkgKSB7CgkJCS8vIFJlbW92ZSBhIHNpbmdsZSB0cmFpbGluZyBwZXJjZW50IHNpZ24uCgkJCSRkZWZhdWx0ID0gcHJlZ19yZXBsYWNlKCAnIyg/PCElKSUkIycsICcnLCAkZGVmYXVsdCApOwoJCQkkZGVmYXVsdCA9IHNwcmludGYoICRkZWZhdWx0LCBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5X3VyaSgpLCBnZXRfc3R5bGVzaGVldF9kaXJlY3RvcnlfdXJpKCkgKTsKCQl9Cgl9CgoJLyoqIFRoaXMgZmlsdGVyIGlzIGRvY3VtZW50ZWQgaW4gd3AtaW5jbHVkZXMvdGhlbWUucGhwICovCglyZXR1cm4gYXBwbHlfZmlsdGVycyggInRoZW1lX21vZF97JG5hbWV9IiwgJGRlZmF1bHQgKTsKfQoKLyoqCiAqIFVwZGF0ZXMgdGhlbWUgbW9kaWZpY2F0aW9uIHZhbHVlIGZvciB0aGUgYWN0aXZlIHRoZW1lLgogKgogKiBAc2luY2UgMi4xLjAKICogQHNpbmNlIDUuNi4wIEEgcmV0dXJuIHZhbHVlIHdhcyBhZGRlZC4KICoKICogQHBhcmFtIHN0cmluZyAkbmFtZSAgVGhlbWUgbW9kaWZpY2F0aW9uIG5hbWUuCiAqIEBwYXJhbSBtaXhlZCAgJHZhbHVlIFRoZW1lIG1vZGlmaWNhdGlvbiB2YWx1ZS4KICogQHJldHVybiBib29sIFRydWUgaWYgdGhlIHZhbHVlIHdhcyB1cGRhdGVkLCBmYWxzZSBvdGhlcndpc2UuCiAqLwpmdW5jdGlvbiBzZXRfdGhlbWVfbW9kKCAkbmFtZSwgJHZhbHVlICkgewoJJG1vZHMgICAgICA9IGdldF90aGVtZV9tb2RzKCk7Cgkkb2xkX3ZhbHVlID0gaXNzZXQoICRtb2RzWyAkbmFtZSBdICkgPyAkbW9kc1sgJG5hbWUgXSA6IGZhbHNlOwoKCS8qKgoJICogRmlsdGVycyB0aGUgdGhlbWUgbW9kaWZpY2F0aW9uLCBvciAndGhlbWVfbW9kJywgdmFsdWUgb24gc2F2ZS4KCSAqCgkgKiBUaGUgZHluYW1pYyBwb3J0aW9uIG9mIHRoZSBob29rIG5hbWUsIGAkbmFtZWAsIHJlZmVycyB0byB0aGUga2V5IG5hbWUKCSAqIG9mIHRoZSBtb2RpZmljYXRpb24gYXJyYXkuIEZvciBleGFtcGxlLCAnaGVhZGVyX3RleHRjb2xvcicsICdoZWFkZXJfaW1hZ2UnLAoJICogYW5kIHNvIG9uIGRlcGVuZGluZyBvbiB0aGUgdGhlbWUgb3B0aW9ucy4KCSAqCgkgKiBAc2luY2UgMy45LjAKCSAqCgkgKiBAcGFyYW0gbWl4ZWQgJHZhbHVlICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSB0aGVtZSBtb2RpZmljYXRpb24uCgkgKiBAcGFyYW0gbWl4ZWQgJG9sZF92YWx1ZSBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgdGhlbWUgbW9kaWZpY2F0aW9uLgoJICovCgkkbW9kc1sgJG5hbWUgXSA9IGFwcGx5X2ZpbHRlcnMoICJwcmVfc2V0X3RoZW1lX21vZF97JG5hbWV9IiwgJHZhbHVlLCAkb2xkX3ZhbHVlICk7CgoJJHRoZW1lID0gZ2V0X29wdGlvbiggJ3N0eWxlc2hlZXQnICk7CgoJcmV0dXJuIHVwZGF0ZV9vcHRpb24oICJ0aGVtZV9tb2RzXyR0aGVtZSIsICRtb2RzICk7Cn0KCi8qKgogKiBSZW1vdmVzIHRoZW1lIG1vZGlmaWNhdGlvbiBuYW1lIGZyb20gYWN0aXZlIHRoZW1lIGxpc3QuCiAqCiAqIElmIHJlbW92aW5nIHRoZSBuYW1lIGFsc28gcmVtb3ZlcyBhbGwgZWxlbWVudHMsIHRoZW4gdGhlIGVudGlyZSBvcHRpb24KICogd2lsbCBiZSByZW1vdmVkLgogKgogKiBAc2luY2UgMi4xLjAKICoKICogQHBhcmFtIHN0cmluZyAkbmFtZSBUaGVtZSBtb2RpZmljYXRpb24gbmFtZS4KICovCmZ1bmN0aW9uIHJlbW92ZV90aGVtZV9tb2QoICRuYW1lICkgewoJJG1vZHMgPSBnZXRfdGhlbWVfbW9kcygpOwoKCWlmICggISBpc3NldCggJG1vZHNbICRuYW1lIF0gKSApIHsKCQlyZXR1cm47Cgl9CgoJdW5zZXQoICRtb2RzWyAkbmFtZSBdICk7CgoJaWYgKCBlbXB0eSggJG1vZHMgKSApIHsKCQlyZW1vdmVfdGhlbWVfbW9kcygpOwoJCXJldHVybjsKCX0KCgkkdGhlbWUgPSBnZXRfb3B0aW9uKCAnc3R5bGVzaGVldCcgKTsKCgl1cGRhdGVfb3B0aW9uKCAidGhlbWVfbW9kc18kdGhlbWUiLCAkbW9kcyApOwp9CgovKioKICogUmVtb3ZlcyB0aGVtZSBtb2RpZmljYXRpb25zIG9wdGlvbiBmb3IgdGhlIGFjdGl2ZSB0aGVtZS4KICoKICogQHNpbmNlIDIuMS4wCiAqLwpmdW5jdGlvbiByZW1vdmVfdGhlbWVfbW9kcygpIHsKCWRlbGV0ZV9vcHRpb24oICd0aGVtZV9tb2RzXycgLiBnZXRfb3B0aW9uKCAnc3R5bGVzaGVldCcgKSApOwoKCS8vIE9sZCBzdHlsZS4KCSR0aGVtZV9uYW1lID0gZ2V0X29wdGlvbiggJ2N1cnJlbnRfdGhlbWUnICk7CglpZiAoIGZhbHNlID09PSAkdGhlbWVfbmFtZSApIHsKCQkkdGhlbWVfbmFtZSA9IHdwX2dldF90aGVtZSgpLT5nZXQoICdOYW1lJyApOwoJfQoKCWRlbGV0ZV9vcHRpb24oICdtb2RzXycgLiAkdGhlbWVfbmFtZSApOwp9CgovKioKICogUmV0cmlldmVzIHRoZSBjdXN0b20gaGVhZGVyIHRleHQgY29sb3IgaW4gMy0gb3IgNi1kaWdpdCBoZXhhZGVjaW1hbCBmb3JtLgogKgogKiBAc2luY2UgMi4xLjAKICoKICogQHJldHVybiBzdHJpbmcgSGVhZGVyIHRleHQgY29sb3IgaW4gMy0gb3IgNi1kaWdpdCBoZXhhZGVjaW1hbCBmb3JtIChtaW51cyB0aGUgaGFzaCBzeW1ib2wpLgogKi8KZnVuY3Rpb24gZ2V0X2hlYWRlcl90ZXh0Y29sb3IoKSB7CglyZXR1cm4gZ2V0X3RoZW1lX21vZCggJ2hlYWRlcl90ZXh0Y29sb3InLCBnZXRfdGhlbWVfc3VwcG9ydCggJ2N1c3RvbS1oZWFkZXInLCAnZGVmYXVsdC10ZXh0LWNvbG9yJyApICk7Cn0KCi8qKgogKiBEaXNwbGF5cyB0aGUgY3VzdG9tIGhlYWRlciB0ZXh0IGNvbG9yIGluIDMtIG9yIDYtZGlnaXQgaGV4YWRlY2ltYWwgZm9ybSAobWludXMgdGhlIGhhc2ggc3ltYm9sKS4KICoKICogQHNpbmNlIDIuMS4wCiAqLwpmdW5jdGlvbiBoZWFkZXJfdGV4dGNvbG9yKCkgewoJZWNobyBnZXRfaGVhZGVyX3RleHRjb2xvcigpOwp9CgovKioKICogV2hldGhlciB0byBkaXNwbGF5IHRoZSBoZWFkZXIgdGV4dC4KICoKICogQHNpbmNlIDMuNC4wCiAqCiAqIEByZXR1cm4gYm9vbAogKi8KZnVuY3Rpb24gZGlzcGxheV9oZWFkZXJfdGV4dCgpIHsKCWlmICggISBjdXJyZW50X3RoZW1lX3N1cHBvcnRzKCAnY3VzdG9tLWhlYWRlcicsICdoZWFkZXItdGV4dCcgKSApIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJJHRleHRfY29sb3IgPSBnZXRfdGhlbWVfbW9kKCAnaGVhZGVyX3RleHRjb2xvcicsIGdldF90aGVtZV9zdXBwb3J0KCAnY3VzdG9tLWhlYWRlcicsICdkZWZhdWx0LXRleHQtY29sb3InICkgKTsKCXJldHVybiAnYmxhbmsnICE9PSAkdGV4dF9jb2xvcjsKfQoKLyoqCiAqIENoZWNrcyB3aGV0aGVyIGEgaGVhZGVyIGltYWdlIGlzIHNldCBvciBub3QuCiAqCiAqIEBzaW5jZSA0LjIuMAogKgogKiBAc2VlIGdldF9oZWFkZXJfaW1hZ2UoKQogKgogKiBAcmV0dXJuIGJvb2wgV2hldGhlciBhIGhlYWRlciBpbWFnZSBpcyBzZXQgb3Igbm90LgogKi8KZnVuY3Rpb24gaGFzX2hlYWRlcl9pbWFnZSgpIHsKCXJldHVybiAoYm9vbCkgZ2V0X2hlYWRlcl9pbWFnZSgpOwp9CgovKioKICogUmV0cmlldmVzIGhlYWRlciBpbWFnZSBmb3IgY3VzdG9tIGhlYWRlci4KICoKICogQHNpbmNlIDIuMS4wCiAqCiAqIEByZXR1cm4gc3RyaW5nfGZhbHNlCiAqLwpmdW5jdGlvbiBnZXRfaGVhZGVyX2ltYWdlKCkgewoJJHVybCA9IGdldF90aGVtZV9tb2QoICdoZWFkZXJfaW1hZ2UnLCBnZXRfdGhlbWVfc3VwcG9ydCggJ2N1c3RvbS1oZWFkZXInLCAnZGVmYXVsdC1pbWFnZScgKSApOwoKCWlmICggJ3JlbW92ZS1oZWFkZXInID09PSAkdXJsICkgewoJCXJldHVybiBmYWxzZTsKCX0KCglpZiAoIGlzX3JhbmRvbV9oZWFkZXJfaW1hZ2UoKSApIHsKCQkkdXJsID0gZ2V0X3JhbmRvbV9oZWFkZXJfaW1hZ2UoKTsKCX0KCglyZXR1cm4gZXNjX3VybF9yYXcoIHNldF91cmxfc2NoZW1lKCAkdXJsICkgKTsKfQoKLyoqCiAqIENyZWF0ZXMgaW1hZ2UgdGFnIG1hcmt1cCBmb3IgYSBjdXN0b20gaGVhZGVyIGltYWdlLgogKgogKiBAc2luY2UgNC40LjAKICoKICogQHBhcmFtIGFycmF5ICRhdHRyIE9wdGlvbmFsLiBBZGRpdGlvbmFsIGF0dHJpYnV0ZXMgZm9yIHRoZSBpbWFnZSB0YWcuIENhbiBiZSB1c2VkCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYXR0cmlidXRlcy4gRGVmYXVsdCBlbXB0eS4KICogQHJldHVybiBzdHJpbmcgSFRNTCBpbWFnZSBlbGVtZW50IG1hcmt1cCBvciBlbXB0eSBzdHJpbmcgb24gZmFpbHVyZS4KICovCmZ1bmN0aW9uIGdldF9oZWFkZXJfaW1hZ2VfdGFnKCAkYXR0ciA9IGFycmF5KCkgKSB7CgkkaGVhZGVyICAgICAgPSBnZXRfY3VzdG9tX2hlYWRlcigpOwoJJGhlYWRlci0+dXJsID0gZ2V0X2hlYWRlcl9pbWFnZSgpOwoKCWlmICggISAkaGVhZGVyLT51cmwgKSB7CgkJcmV0dXJuICcnOwoJfQoKCSR3aWR0aCAgPSBhYnNpbnQoICRoZWFkZXItPndpZHRoICk7CgkkaGVpZ2h0ID0gYWJzaW50KCAkaGVhZGVyLT5oZWlnaHQgKTsKCSRhbHQgICAgPSAnJzsKCgkvLyBVc2UgYWx0ZXJuYXRpdmUgdGV4dCBhc3NpZ25lZCB0byB0aGUgaW1hZ2UsIGlmIGF2YWlsYWJsZS4gT3RoZXJ3aXNlLCBsZWF2ZSBpdCBlbXB0eS4KCWlmICggISBlbXB0eSggJGhlYWRlci0+YXR0YWNobWVudF9pZCApICkgewoJCSRpbWFnZV9hbHQgPSBnZXRfcG9zdF9tZXRhKCAkaGVhZGVyLT5hdHRhY2htZW50X2lkLCAnX3dwX2F0dGFjaG1lbnRfaW1hZ2VfYWx0JywgdHJ1ZSApOwoKCQlpZiAoIGlzX3N0cmluZyggJGltYWdlX2FsdCApICkgewoJCQkkYWx0ID0gJGltYWdlX2FsdDsKCQl9Cgl9CgoJJGF0dHIgPSB3cF9wYXJzZV9hcmdzKAoJCSRhdHRyLAoJCWFycmF5KAoJCQknc3JjJyAgICA9PiAkaGVhZGVyLT51cmwsCgkJCSd3aWR0aCcgID0+ICR3aWR0aCwKCQkJJ2hlaWdodCcgPT4gJGhlaWdodCwKCQkJJ2FsdCcgICAgPT4gJGFsdCwKCQkpCgkpOwoKCS8vIEdlbmVyYXRlICdzcmNzZXQnIGFuZCAnc2l6ZXMnIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQuCglpZiAoIGVtcHR5KCAkYXR0clsnc3Jjc2V0J10gKSAmJiAhIGVtcHR5KCAkaGVhZGVyLT5hdHRhY2htZW50X2lkICkgKSB7CgkJJGltYWdlX21ldGEgPSBnZXRfcG9zdF9tZXRhKCAkaGVhZGVyLT5hdHRhY2htZW50X2lkLCAnX3dwX2F0dGFjaG1lbnRfbWV0YWRhdGEnLCB0cnVlICk7CgkJJHNpemVfYXJyYXkgPSBhcnJheSggJHdpZHRoLCAkaGVpZ2h0ICk7CgoJCWlmICggaXNfYXJyYXkoICRpbWFnZV9tZXRhICkgKSB7CgkJCSRzcmNzZXQgPSB3cF9jYWxjdWxhdGVfaW1hZ2Vfc3Jjc2V0KCAkc2l6ZV9hcnJheSwgJGhlYWRlci0+dXJsLCAkaW1hZ2VfbWV0YSwgJGhlYWRlci0+YXR0YWNobWVudF9pZCApOwoKCQkJaWYgKCAhIGVtcHR5KCAkYXR0clsnc2l6ZXMnXSApICkgewoJCQkJJHNpemVzID0gJGF0dHJbJ3NpemVzJ107CgkJCX0gZWxzZSB7CgkJCQkkc2l6ZXMgPSB3cF9jYWxjdWxhdGVfaW1hZ2Vfc2l6ZXMoICRzaXplX2FycmF5LCAkaGVhZGVyLT51cmwsICRpbWFnZV9tZXRhLCAkaGVhZGVyLT5hdHRhY2htZW50X2lkICk7CgkJCX0KCgkJCWlmICggJHNyY3NldCAmJiAkc2l6ZXMgKSB7CgkJCQkkYXR0clsnc3Jjc2V0J10gPSAkc3Jjc2V0OwoJCQkJJGF0dHJbJ3NpemVzJ10gID0gJHNpemVzOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogRmlsdGVycyB0aGUgbGlzdCBvZiBoZWFkZXIgaW1hZ2UgYXR0cmlidXRlcy4KCSAqCgkgKiBAc2luY2UgNS45LjAKCSAqCgkgKiBAcGFyYW0gYXJyYXkgICRhdHRyICAgQXJyYXkgb2YgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBpbWFnZSB0YWcuCgkgKiBAcGFyYW0gb2JqZWN0ICRoZWFkZXIgVGhlIGN1c3RvbSBoZWFkZXIgb2JqZWN0IHJldHVybmVkIGJ5ICdnZXRfY3VzdG9tX2hlYWRlcigpJy4KCSAqLwoJJGF0dHIgPSBhcHBseV9maWx0ZXJzKCAnZ2V0X2hlYWRlcl9pbWFnZV90YWdfYXR0cmlidXRlcycsICRhdHRyLCAkaGVhZGVyICk7CgoJJGF0dHIgPSBhcnJheV9tYXAoICdlc2NfYXR0cicsICRhdHRyICk7CgkkaHRtbCA9ICc8aW1nJzsKCglmb3JlYWNoICggJGF0dHIgYXMgJG5hbWUgPT4gJHZhbHVlICkgewoJCSRodG1sIC49ICcgJyAuICRuYW1lIC4gJz0iJyAuICR2YWx1ZSAuICciJzsKCX0KCgkkaHRtbCAuPSAnIC8+JzsKCgkvKioKCSAqIEZpbHRlcnMgdGhlIG1hcmt1cCBvZiBoZWFkZXIgaW1hZ2VzLgoJICoKCSAqIEBzaW5jZSA0LjQuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGh0bWwgICBUaGUgSFRNTCBpbWFnZSB0YWcgbWFya3VwIGJlaW5nIGZpbHRlcmVkLgoJICogQHBhcmFtIG9iamVjdCAkaGVhZGVyIFRoZSBjdXN0b20gaGVhZGVyIG9iamVjdCByZXR1cm5lZCBieSAnZ2V0X2N1c3RvbV9oZWFkZXIoKScuCgkgKiBAcGFyYW0gYXJyYXkgICRhdHRyICAgQXJyYXkgb2YgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBpbWFnZSB0YWcuCgkgKi8KCXJldHVybiBhcHBseV9maWx0ZXJzKCAnZ2V0X2hlYWRlcl9pbWFnZV90YWcnLCAkaHRtbCwgJGhlYWRlciwgJGF0dHIgKTsKfQoKLyoqCiAqIERpc3BsYXlzIHRoZSBpbWFnZSBtYXJrdXAgZm9yIGEgY3VzdG9tIGhlYWRlciBpbWFnZS4KICoKICogQHNpbmNlIDQuNC4wCiAqCiAqIEBwYXJhbSBhcnJheSAkYXR0ciBPcHRpb25hbC4gQXR0cmlidXRlcyBmb3IgdGhlIGltYWdlIG1hcmt1cC4gRGVmYXVsdCBlbXB0eS4KICovCmZ1bmN0aW9uIHRoZV9oZWFkZXJfaW1hZ2VfdGFnKCAkYXR0ciA9IGFycmF5KCkgKSB7CgllY2hvIGdldF9oZWFkZXJfaW1hZ2VfdGFnKCAkYXR0ciApOwp9CgovKioKICogR2V0cyByYW5kb20gaGVhZGVyIGltYWdlIGRhdGEgZnJvbSByZWdpc3RlcmVkIGltYWdlcyBpbiB0aGVtZS4KICoKICogQHNpbmNlIDMuNC4wCiAqCiAqIEBhY2Nlc3MgcHJpdmF0ZQogKgogKiBAZ2xvYmFsIGFycmF5ICRfd3BfZGVmYXVsdF9oZWFkZXJzCiAqCiAqIEByZXR1cm4gb2JqZWN0CiAqLwpmdW5jdGlvbiBfZ2V0X3JhbmRvbV9oZWFkZXJfZGF0YSgpIHsKCWdsb2JhbCAkX3dwX2RlZmF1bHRfaGVhZGVyczsKCXN0YXRpYyAkX3dwX3JhbmRvbV9oZWFkZXIgPSBudWxsOwoKCWlmICggZW1wdHkoICRfd3BfcmFuZG9tX2hlYWRlciApICkgewoJCSRoZWFkZXJfaW1hZ2VfbW9kID0gZ2V0X3RoZW1lX21vZCggJ2hlYWRlcl9pbWFnZScsICcnICk7CgkJJGhlYWRlcnMgICAgICAgICAgPSBhcnJheSgpOwoKCQlpZiAoICdyYW5kb20tdXBsb2FkZWQtaW1hZ2UnID09PSAkaGVhZGVyX2ltYWdlX21vZCApIHsKCQkJJGhlYWRlcnMgPSBnZXRfdXBsb2FkZWRfaGVhZGVyX2ltYWdlcygpOwoJCX0gZWxzZWlmICggISBlbXB0eSggJF93cF9kZWZhdWx0X2hlYWRlcnMgKSApIHsKCQkJaWYgKCAncmFuZG9tLWRlZmF1bHQtaW1hZ2UnID09PSAkaGVhZGVyX2ltYWdlX21vZCApIHsKCQkJCSRoZWFkZXJzID0gJF93cF9kZWZhdWx0X2hlYWRlcnM7CgkJCX0gZWxzZSB7CgkJCQlpZiAoIGN1cnJlbnRfdGhlbWVfc3VwcG9ydHMoICdjdXN0b20taGVhZGVyJywgJ3JhbmRvbS1kZWZhdWx0JyApICkgewoJCQkJCSRoZWFkZXJzID0gJF93cF9kZWZhdWx0X2hlYWRlcnM7CgkJCQl9CgkJCX0KCQl9CgoJCWlmICggZW1wdHkoICRoZWFkZXJzICkgKSB7CgkJCXJldHVybiBuZXcgc3RkQ2xhc3M7CgkJfQoKCQkkX3dwX3JhbmRvbV9oZWFkZXIgPSAob2JqZWN0KSAkaGVhZGVyc1sgYXJyYXlfcmFuZCggJGhlYWRlcnMgKSBdOwoKCQkkX3dwX3JhbmRvbV9oZWFkZXItPnVybCA9IHNwcmludGYoCgkJCSRfd3BfcmFuZG9tX2hlYWRlci0+dXJsLAoJCQlnZXRfdGVtcGxhdGVfZGlyZWN0b3J5X3VyaSgpLAoJCQlnZXRfc3R5bGVzaGVldF9kaXJlY3RvcnlfdXJpKCkKCQkpOwoKCQkkX3dwX3JhbmRvbV9oZWFkZXItPnRodW1ibmFpbF91cmwgPSBzcHJpbnRmKAoJCQkkX3dwX3JhbmRvbV9oZWFkZXItPnRodW1ibmFpbF91cmwsCgkJCWdldF90ZW1wbGF0ZV9kaXJlY3RvcnlfdXJpKCksCgkJCWdldF9zdHlsZXNoZWV0X2RpcmVjdG9yeV91cmkoKQoJCSk7Cgl9CgoJcmV0dXJuICRfd3BfcmFuZG9tX2hlYWRlcjsKfQoKLyoqCiAqIEdldHMgcmFuZG9tIGhlYWRlciBpbWFnZSBVUkwgZnJvbSByZWdpc3RlcmVkIGltYWdlcyBpbiB0aGVtZS4KICoKICogQHNpbmNlIDMuMi4wCiAqCiAqIEByZXR1cm4gc3RyaW5nIFBhdGggdG8gaGVhZGVyIGltYWdlLgogKi8KZnVuY3Rpb24gZ2V0X3JhbmRvbV9oZWFkZXJfaW1hZ2UoKSB7CgkkcmFuZG9tX2ltYWdlID0gX2dldF9yYW5kb21faGVhZGVyX2RhdGEoKTsKCglpZiAoIGVtcHR5KCAkcmFuZG9tX2ltYWdlLT51cmwgKSApIHsKCQlyZXR1cm4gJyc7Cgl9CgoJcmV0dXJuICRyYW5kb21faW1hZ2UtPnVybDsKfQoKLyoqCiAqIENoZWNrcyBpZiByYW5kb20gaGVhZGVyIGltYWdlIGlzIGluIHVzZS4KICoKICogQWx3YXlzIHRydWUgaWYgdXNlciBleHByZXNzbHkgY2hvb3NlcyB0aGUgb3B0aW9uIGluIEFwcGVhcmFuY2UgPiBIZWFkZXIuCiAqIEFsc28gdHJ1ZSBpZiB0aGVtZSBoYXMgbXVsdGlwbGUgaGVhZGVyIGltYWdlcyByZWdpc3RlcmVkLCBubyBzcGVjaWZpYyBoZWFkZXIgaW1hZ2UKICogaXMgY2hvc2VuLCBhbmQgdGhlbWUgdHVybnMgb24gcmFuZG9tIGhlYWRlcnMgd2l0aCBhZGRfdGhlbWVfc3VwcG9ydCgpLgogKgogKiBAc2luY2UgMy4yLjAKICoKICogQHBhcmFtIHN0cmluZyAkdHlwZSBUaGUgcmFuZG9tIHBvb2wgdG8gdXNlLiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZSAnYW55JywKICogICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdCcsICd1cGxvYWRlZCcuIERlZmF1bHQgJ2FueScuCiAqIEByZXR1cm4gYm9vbAogKi8KZnVuY3Rpb24gaXNfcmFuZG9tX2hlYWRlcl9pbWFnZSggJHR5cGUgPSAnYW55JyApIHsKCSRoZWFkZXJfaW1hZ2VfbW9kID0gZ2V0X3RoZW1lX21vZCggJ2hlYWRlcl9pbWFnZScsIGdldF90aGVtZV9zdXBwb3J0KCAnY3VzdG9tLWhlYWRlcicsICdkZWZhdWx0LWltYWdlJyApICk7CgoJaWYgKCAnYW55JyA9PT0gJHR5cGUgKSB7CgkJaWYgKCAncmFuZG9tLWRlZmF1bHQtaW1hZ2UnID09PSAkaGVhZGVyX2ltYWdlX21vZAoJCQl8fCAncmFuZG9tLXVwbG9hZGVkLWltYWdlJyA9PT0gJGhlYWRlcl9pbWFnZV9tb2QKCQkJfHwgKCAnJyAhPT0gZ2V0X3JhbmRvbV9oZWFkZXJfaW1hZ2UoKSAmJiBlbXB0eSggJGhlYWRlcl9pbWFnZV9tb2QgKSApCgkJKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCX0gZWxzZSB7CgkJaWYgKCAicmFuZG9tLSR0eXBlLWltYWdlIiA9PT0gJGhlYWRlcl9pbWFnZV9tb2QgKSB7CgkJCXJldHVybiB0cnVlOwoJCX0gZWxzZWlmICggJ2RlZmF1bHQnID09PSAkdHlwZSAmJiBlbXB0eSggJGhlYWRlcl9pbWFnZV9tb2QgKSAmJiAnJyAhPT0gZ2V0X3JhbmRvbV9oZWFkZXJfaW1hZ2UoKSApIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoJfQoKCXJldHVybiBmYWxzZTsKfQoKLyoqCiAqIERpc3BsYXlzIGhlYWRlciBpbWFnZSBVUkwuCiAqCiAqIEBzaW5jZSAyLjEuMAogKi8KZnVuY3Rpb24gaGVhZGVyX2ltYWdlKCkgewoJJGltYWdlID0gZ2V0X2hlYWRlcl9pbWFnZSgpOwoKCWlmICggJGltYWdlICkgewoJCWVjaG8gZXNjX3VybCggJGltYWdlICk7Cgl9Cn0KCi8qKgogKiBHZXRzIHRoZSBoZWFkZXIgaW1hZ2VzIHVwbG9hZGVkIGZvciB0aGUgYWN0aXZlIHRoZW1lLgogKgogKiBAc2luY2UgMy4yLjAKICoKICogQHJldHVybiBhcnJheQogKi8KZnVuY3Rpb24gZ2V0X3VwbG9hZGVkX2hlYWRlcl9pbWFnZXMoKSB7CgkkaGVhZGVyX2ltYWdlcyA9IGFycmF5KCk7CgoJLy8gQHRvZG8gQ2FjaGluZy4KCSRoZWFkZXJzID0gZ2V0X3Bvc3RzKAoJCWFycmF5KAoJCQkncG9zdF90eXBlJyAgPT4gJ2F0dGFjaG1lbnQnLAoJCQknbWV0YV9rZXknICAgPT4gJ193cF9hdHRhY2htZW50X2lzX2N1c3RvbV9oZWFkZXInLAoJCQknbWV0YV92YWx1ZScgPT4gZ2V0X29wdGlvbiggJ3N0eWxlc2hlZXQnICksCgkJCSdvcmRlcmJ5JyAgICA9PiAnbm9uZScsCgkJCSdub3BhZ2luZycgICA9PiB0cnVlLAoJCSkKCSk7CgoJaWYgKCBlbXB0eSggJGhlYWRlcnMgKSApIHsKCQlyZXR1cm4gYXJyYXkoKTsKCX0KCglmb3JlYWNoICggKGFycmF5KSAkaGVhZGVycyBhcyAkaGVhZGVyICkgewoJCSR1cmwgICAgICAgICAgPSBlc2NfdXJsX3Jhdyggd3BfZ2V0X2F0dGFjaG1lbnRfdXJsKCAkaGVhZGVyLT5JRCApICk7CgkJJGhlYWRlcl9kYXRhICA9IHdwX2dldF9hdHRhY2htZW50X21ldGFkYXRhKCAkaGVhZGVyLT5JRCApOwoJCSRoZWFkZXJfaW5kZXggPSAkaGVhZGVyLT5JRDsKCgkJJGhlYWRlcl9pbWFnZXNbICRoZWFkZXJfaW5kZXggXSAgICAgICAgICAgICAgICAgID0gYXJyYXkoKTsKCQkkaGVhZGVyX2ltYWdlc1sgJGhlYWRlcl9pbmRleCBdWydhdHRhY2htZW50X2lkJ10gPSAkaGVhZGVyLT5JRDsKCQkkaGVhZGVyX2ltYWdlc1sgJGhlYWRlcl9pbmRleCBdWyd1cmwnXSAgICAgICAgICAgPSAkdXJsOwoJCSRoZWFkZXJfaW1hZ2VzWyAkaGVhZGVyX2luZGV4IF1bJ3RodW1ibmFpbF91cmwnXSA9ICR1cmw7CgkJJGhlYWRlcl9pbWFnZXNbICRoZWFkZXJfaW5kZXggXVsnYWx0X3RleHQnXSAgICAgID0gZ2V0X3Bvc3RfbWV0YSggJGhlYWRlci0+SUQsICdfd3BfYXR0YWNobWVudF9pbWFnZV9hbHQnLCB0cnVlICk7CgoJCWlmICggaXNzZXQoICRoZWFkZXJfZGF0YVsnYXR0YWNobWVudF9wYXJlbnQnXSApICkgewoJCQkkaGVhZGVyX2ltYWdlc1sgJGhlYWRlcl9pbmRleCBdWydhdHRhY2htZW50X3BhcmVudCddID0gJGhlYWRlcl9kYXRhWydhdHRhY2htZW50X3BhcmVudCddOwoJCX0gZWxzZSB7CgkJCSRoZWFkZXJfaW1hZ2VzWyAkaGVhZGVyX2luZGV4IF1bJ2F0dGFjaG1lbnRfcGFyZW50J10gPSAnJzsKCQl9CgoJCWlmICggaXNzZXQoICRoZWFkZXJfZGF0YVsnd2lkdGgnXSApICkgewoJCQkkaGVhZGVyX2ltYWdlc1sgJGhlYWRlcl9pbmRleCBdWyd3aWR0aCddID0gJGhlYWRlcl9kYXRhWyd3aWR0aCddOwoJCX0KCQlpZiAoIGlzc2V0KCAkaGVhZGVyX2RhdGFbJ2hlaWdodCddICkgKSB7CgkJCSRoZWFkZXJfaW1hZ2VzWyAkaGVhZGVyX2luZGV4IF1bJ2hlaWdodCddID0gJGhlYWRlcl9kYXRhWydoZWlnaHQnXTsKCQl9Cgl9CgoJcmV0dXJuICRoZWFkZXJfaW1hZ2VzOwp9CgovKioKICogR2V0cyB0aGUgaGVhZGVyIGltYWdlIGRhdGEuCiAqCiAqIEBzaW5jZSAzLjQuMAogKgogKiBAZ2xvYmFsIGFycmF5ICRfd3BfZGVmYXVsdF9oZWFkZXJzCiAqCiAqIEByZXR1cm4gb2JqZWN0CiAqLwpmdW5jdGlvbiBnZXRfY3VzdG9tX2hlYWRlcigpIHsKCWdsb2JhbCAkX3dwX2RlZmF1bHRfaGVhZGVyczsKCglpZiAoIGlzX3JhbmRvbV9oZWFkZXJfaW1hZ2UoKSApIHsKCQkkZGF0YSA9IF9nZXRfcmFuZG9tX2hlYWRlcl9kYXRhKCk7Cgl9IGVsc2UgewoJCSRkYXRhID0gZ2V0X3RoZW1lX21vZCggJ2hlYWRlcl9pbWFnZV9kYXRhJyApOwoJCWlmICggISAkZGF0YSAmJiBjdXJyZW50X3RoZW1lX3N1cHBvcnRzKCAnY3VzdG9tLWhlYWRlcicsICdkZWZhdWx0LWltYWdlJyApICkgewoJCQkkZGlyZWN0b3J5X2FyZ3MgICAgICAgID0gYXJyYXkoIGdldF90ZW1wbGF0ZV9kaXJlY3RvcnlfdXJpKCksIGdldF9zdHlsZXNoZWV0X2RpcmVjdG9yeV91cmkoKSApOwoJCQkkZGF0YSAgICAgICAgICAgICAgICAgID0gYXJyYXkoKTsKCQkJJGRhdGFbJ3VybCddICAgICAgICAgICA9IHZzcHJpbnRmKCBnZXRfdGhlbWVfc3VwcG9ydCggJ2N1c3RvbS1oZWFkZXInLCAnZGVmYXVsdC1pbWFnZScgKSwgJGRpcmVjdG9yeV9hcmdzICk7CgkJCSRkYXRhWyd0aHVtYm5haWxfdXJsJ10gPSAkZGF0YVsndXJsJ107CgkJCWlmICggISBlbXB0eSggJF93cF9kZWZhdWx0X2hlYWRlcnMgKSApIHsKCQkJCWZvcmVhY2ggKCAoYXJyYXkpICRfd3BfZGVmYXVsdF9oZWFkZXJzIGFzICRkZWZhdWx0X2hlYWRlciApIHsKCQkJCQkkdXJsID0gdnNwcmludGYoICRkZWZhdWx0X2hlYWRlclsndXJsJ10sICRkaXJlY3RvcnlfYXJncyApOwoJCQkJCWlmICggJGRhdGFbJ3VybCddID09ICR1cmwgKSB7CgkJCQkJCSRkYXRhICAgICAgICAgICAgICAgICAgPSAkZGVmYXVsdF9oZWFkZXI7CgkJCQkJCSRkYXRhWyd1cmwnXSAgICAgICAgICAgPSAkdXJsOwoJCQkJCQkkZGF0YVsndGh1bWJuYWlsX3VybCddID0gdnNwcmludGYoICRkYXRhWyd0aHVtYm5haWxfdXJsJ10sICRkaXJlY3RvcnlfYXJncyApOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJJGRlZmF1bHQgPSBhcnJheSgKCQkndXJsJyAgICAgICAgICAgPT4gJycsCgkJJ3RodW1ibmFpbF91cmwnID0+ICcnLAoJCSd3aWR0aCcgICAgICAgICA9PiBnZXRfdGhlbWVfc3VwcG9ydCggJ2N1c3RvbS1oZWFkZXInLCAnd2lkdGgnICksCgkJJ2hlaWdodCcgICAgICAgID0+IGdldF90aGVtZV9zdXBwb3J0KCAnY3VzdG9tLWhlYWRlcicsICdoZWlnaHQnICksCgkJJ3ZpZGVvJyAgICAgICAgID0+IGdldF90aGVtZV9zdXBwb3J0KCAnY3VzdG9tLWhlYWRlcicsICd2aWRlbycgKSwKCSk7CglyZXR1cm4gKG9iamVjdCkgd3BfcGFyc2VfYXJncyggJGRhdGEsICRkZWZhdWx0ICk7Cn0KCi8qKgogKiBSZWdpc3RlcnMgYSBzZWxlY3Rpb24gb2YgZGVmYXVsdCBoZWFkZXJzIHRvIGJlIGRpc3BsYXllZCBieSB0aGUgY3VzdG9tIGhlYWRlciBhZG1pbiBVSS4KICoKICogQHNpbmNlIDMuMC4wCiAqCiAqIEBnbG9iYWwgYXJyYXkgJF93cF9kZWZhdWx0X2hlYWRlcnMKICoKICogQHBhcmFtIGFycmF5ICRoZWFkZXJzIEFycmF5IG9mIGhlYWRlcnMga2V5ZWQgYnkgYSBzdHJpbmcgSUQuIFRoZSBJRHMgcG9pbnQgdG8gYXJyYXlzCiAqICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nICd1cmwnLCAndGh1bWJuYWlsX3VybCcsIGFuZCAnZGVzY3JpcHRpb24nIGtleXMuCiAqLwpmdW5jdGlvbiByZWdpc3Rlcl9kZWZhdWx0X2hlYWRlcnMoICRoZWFkZXJzICkgewoJZ2xvYmFsICRfd3BfZGVmYXVsdF9oZWFkZXJzOwoKCSRfd3BfZGVmYXVsdF9oZWFkZXJzID0gYXJyYXlfbWVyZ2UoIChhcnJheSkgJF93cF9kZWZhdWx0X2hlYWRlcnMsIChhcnJheSkgJGhlYWRlcnMgKTsKfQoKLyoqCiAqIFVucmVnaXN0ZXJzIGRlZmF1bHQgaGVhZGVycy4KICoKICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciByZWdpc3Rlcl9kZWZhdWx0X2hlYWRlcnMoKSBoYXMgYWxyZWFkeSBhZGRlZCB0aGUKICogaGVhZGVyIHlvdSB3YW50IHRvIHJlbW92ZS4KICoKICogQHNlZSByZWdpc3Rlcl9kZWZhdWx0X2hlYWRlcnMoKQogKiBAc2luY2UgMy4wLjAKICoKICogQGdsb2JhbCBhcnJheSAkX3dwX2RlZmF1bHRfaGVhZGVycwogKgogKiBAcGFyYW0gc3RyaW5nfGFycmF5ICRoZWFkZXIgVGhlIGhlYWRlciBzdHJpbmcgaWQgKGtleSBvZiBhcnJheSkgdG8gcmVtb3ZlLCBvciBhbiBhcnJheSB0aGVyZW9mLgogKiBAcmV0dXJuIGJvb2x8dm9pZCBBIHNpbmdsZSBoZWFkZXIgcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuCiAqICAgICAgICAgICAgICAgICAgIFRoZXJlIGlzIGN1cnJlbnRseSBubyByZXR1cm4gdmFsdWUgZm9yIG11bHRpcGxlIGhlYWRlcnMuCiAqLwpmdW5jdGlvbiB1bnJlZ2lzdGVyX2RlZmF1bHRfaGVhZGVycyggJGhlYWRlciApIHsKCWdsb2JhbCAkX3dwX2RlZmF1bHRfaGVhZGVyczsKCglpZiAoIGlzX2FycmF5KCAkaGVhZGVyICkgKSB7CgkJYXJyYXlfbWFwKCAndW5yZWdpc3Rlcl9kZWZhdWx0X2hlYWRlcnMnLCAkaGVhZGVyICk7Cgl9IGVsc2VpZiAoIGlzc2V0KCAkX3dwX2RlZmF1bHRfaGVhZGVyc1sgJGhlYWRlciBdICkgKSB7CgkJdW5zZXQoICRfd3BfZGVmYXVsdF9oZWFkZXJzWyAkaGVhZGVyIF0gKTsKCQlyZXR1cm4gdHJ1ZTsKCX0gZWxzZSB7CgkJcmV0dXJuIGZhbHNlOwoJfQp9CgovKioKICogQ2hlY2tzIHdoZXRoZXIgYSBoZWFkZXIgdmlkZW8gaXMgc2V0IG9yIG5vdC4KICoKICogQHNpbmNlIDQuNy4wCiAqCiAqIEBzZWUgZ2V0X2hlYWRlcl92aWRlb191cmwoKQogKgogKiBAcmV0dXJuIGJvb2wgV2hldGhlciBhIGhlYWRlciB2aWRlbyBpcyBzZXQgb3Igbm90LgogKi8KZnVuY3Rpb24gaGFzX2hlYWRlcl92aWRlbygpIHsKCXJldHVybiAoYm9vbCkgZ2V0X2hlYWRlcl92aWRlb191cmwoKTsKfQoKLyoqCiAqIFJldHJpZXZlcyBoZWFkZXIgdmlkZW8gVVJMIGZvciBjdXN0b20gaGVhZGVyLgogKgogKiBVc2VzIGEgbG9jYWwgdmlkZW8gaWYgcHJlc2VudCwgb3IgZmFsbHMgYmFjayB0byBhbiBleHRlcm5hbCB2aWRlby4KICoKICogQHNpbmNlIDQuNy4wCiAqCiAqIEByZXR1cm4gc3RyaW5nfGZhbHNlIEhlYWRlciB2aWRlbyBVUkwgb3IgZmFsc2UgaWYgdGhlcmUgaXMgbm8gdmlkZW8uCiAqLwpmdW5jdGlvbiBnZXRfaGVhZGVyX3ZpZGVvX3VybCgpIHsKCSRpZCA9IGFic2ludCggZ2V0X3RoZW1lX21vZCggJ2hlYWRlcl92aWRlbycgKSApOwoKCWlmICggJGlkICkgewoJCS8vIEdldCB0aGUgZmlsZSBVUkwgZnJvbSB0aGUgYXR0YWNobWVudCBJRC4KCQkkdXJsID0gd3BfZ2V0X2F0dGFjaG1lbnRfdXJsKCAkaWQgKTsKCX0gZWxzZSB7CgkJJHVybCA9IGdldF90aGVtZV9tb2QoICdleHRlcm5hbF9oZWFkZXJfdmlkZW8nICk7Cgl9CgoJLyoqCgkgKiBGaWx0ZXJzIHRoZSBoZWFkZXIgdmlkZW8gVVJMLgoJICoKCSAqIEBzaW5jZSA0LjcuMwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHVybCBIZWFkZXIgdmlkZW8gVVJMLCBpZiBhdmFpbGFibGUuCgkgKi8KCSR1cmwgPSBhcHBseV9maWx0ZXJzKCAnZ2V0X2hlYWRlcl92aWRlb191cmwnLCAkdXJsICk7CgoJaWYgKCAhICRpZCAmJiAhICR1cmwgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCXJldHVybiBlc2NfdXJsX3Jhdyggc2V0X3VybF9zY2hlbWUoICR1cmwgKSApOwp9CgovKioKICogRGlzcGxheXMgaGVhZGVyIHZpZGVvIFVSTC4KICoKICogQHNpbmNlIDQuNy4wCiAqLwpmdW5jdGlvbiB0aGVfaGVhZGVyX3ZpZGVvX3VybCgpIHsKCSR2aWRlbyA9IGdldF9oZWFkZXJfdmlkZW9fdXJsKCk7CgoJaWYgKCAkdmlkZW8gKSB7CgkJZWNobyBlc2NfdXJsKCAkdmlkZW8gKTsKCX0KfQoKLyoqCiAqIFJldHJpZXZlcyBoZWFkZXIgdmlkZW8gc2V0dGluZ3MuCiAqCiAqIEBzaW5jZSA0LjcuMAogKgogKiBAcmV0dXJuIGFycmF5CiAqLwpmdW5jdGlvbiBnZXRfaGVhZGVyX3ZpZGVvX3NldHRpbmdzKCkgewoJJGhlYWRlciAgICAgPSBnZXRfY3VzdG9tX2hlYWRlcigpOwoJJHZpZGVvX3VybCAgPSBnZXRfaGVhZGVyX3ZpZGVvX3VybCgpOwoJJHZpZGVvX3R5cGUgPSB3cF9jaGVja19maWxldHlwZSggJHZpZGVvX3VybCwgd3BfZ2V0X21pbWVfdHlwZXMoKSApOwoKCSRzZXR0aW5ncyA9IGFycmF5KAoJCSdtaW1lVHlwZScgID0+ICcnLAoJCSdwb3N0ZXJVcmwnID0+IGdldF9oZWFkZXJfaW1hZ2UoKSwKCQkndmlkZW9VcmwnICA9PiAkdmlkZW9fdXJsLAoJCSd3aWR0aCcgICAgID0+IGFic2ludCggJGhlYWRlci0+d2lkdGggKSwKCQknaGVpZ2h0JyAgICA9PiBhYnNpbnQoICRoZWFkZXItPmhlaWdodCApLAoJCSdtaW5XaWR0aCcgID0+IDkwMCwKCQknbWluSGVpZ2h0JyA9PiA1MDAsCgkJJ2wxMG4nICAgICAgPT4gYXJyYXkoCgkJCSdwYXVzZScgICAgICA9PiBfXyggJ1BhdXNlJyApLAoJCQkncGxheScgICAgICAgPT4gX18oICdQbGF5JyApLAoJCQkncGF1c2VTcGVhaycgPT4gX18oICdWaWRlbyBpcyBwYXVzZWQuJyApLAoJCQkncGxheVNwZWFrJyAgPT4gX18oICdWaWRlbyBpcyBwbGF5aW5nLicgKSwKCQkpLAoJKTsKCglpZiAoIHByZWdfbWF0Y2goICcjXmh0dHBzPzovLyg/Ond3d1wuKT8oPzp5b3V0dWJlXC5jb20vd2F0Y2h8eW91dHVcLmJlLykjJywgJHZpZGVvX3VybCApICkgewoJCSRzZXR0aW5nc1snbWltZVR5cGUnXSA9ICd2aWRlby94LXlvdXR1YmUnOwoJfSBlbHNlaWYgKCAhIGVtcHR5KCAkdmlkZW9fdHlwZVsndHlwZSddICkgKSB7CgkJJHNldHRpbmdzWydtaW1lVHlwZSddID0gJHZpZGVvX3R5cGVbJ3R5cGUnXTsKCX0KCgkvKioKCSAqIEZpbHRlcnMgaGVhZGVyIHZpZGVvIHNldHRpbmdzLgoJICoKCSAqIEBzaW5jZSA0LjcuMAoJICoKCSAqIEBwYXJhbSBhcnJheSAkc2V0dGluZ3MgQW4gYXJyYXkgb2YgaGVhZGVyIHZpZGVvIHNldHRpbmdzLgoJICovCglyZXR1cm4gYXBwbHlfZmlsdGVycyggJ2hlYWRlcl92aWRlb19zZXR0aW5ncycsICRzZXR0aW5ncyApOwp9CgovKioKICogQ2hlY2tzIHdoZXRoZXIgYSBjdXN0b20gaGVhZGVyIGlzIHNldCBvciBub3QuCiAqCiAqIEBzaW5jZSA0LjcuMAogKgogKiBAcmV0dXJuIGJvb2wgVHJ1ZSBpZiBhIGN1c3RvbSBoZWFkZXIgaXMgc2V0LiBGYWxzZSBpZiBub3QuCiAqLwpmdW5jdGlvbiBoYXNfY3VzdG9tX2hlYWRlcigpIHsKCWlmICggaGFzX2hlYWRlcl9pbWFnZSgpIHx8ICggaGFzX2hlYWRlcl92aWRlbygpICYmIGlzX2hlYWRlcl92aWRlb19hY3RpdmUoKSApICkgewoJCXJldHVybiB0cnVlOwoJfQoKCXJldHVybiBmYWxzZTsKfQoKLyoqCiAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXN0b20gaGVhZGVyIHZpZGVvIGlzIGVsaWdpYmxlIHRvIHNob3cgb24gdGhlIGN1cnJlbnQgcGFnZS4KICoKICogQHNpbmNlIDQuNy4wCiAqCiAqIEByZXR1cm4gYm9vbCBUcnVlIGlmIHRoZSBjdXN0b20gaGVhZGVyIHZpZGVvIHNob3VsZCBiZSBzaG93bi4gRmFsc2UgaWYgbm90LgogKi8KZnVuY3Rpb24gaXNfaGVhZGVyX3ZpZGVvX2FjdGl2ZSgpIHsKCWlmICggISBnZXRfdGhlbWVfc3VwcG9ydCggJ2N1c3RvbS1oZWFkZXInLCAndmlkZW8nICkgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCSR2aWRlb19hY3RpdmVfY2IgPSBnZXRfdGhlbWVfc3VwcG9ydCggJ2N1c3RvbS1oZWFkZXInLCAndmlkZW8tYWN0aXZlLWNhbGxiYWNrJyApOwoKCWlmICggZW1wdHkoICR2aWRlb19hY3RpdmVfY2IgKSB8fCAhIGlzX2NhbGxhYmxlKCAkdmlkZW9fYWN0aXZlX2NiICkgKSB7CgkJJHNob3dfdmlkZW8gPSB0cnVlOwoJfSBlbHNlIHsKCQkkc2hvd192aWRlbyA9IGNhbGxfdXNlcl9mdW5jKCAkdmlkZW9fYWN0aXZlX2NiICk7Cgl9CgoJLyoqCgkgKiBGaWx0ZXJzIHdoZXRoZXIgdGhlIGN1c3RvbSBoZWFkZXIgdmlkZW8gaXMgZWxpZ2libGUgdG8gc2hvdyBvbiB0aGUgY3VycmVudCBwYWdlLgoJICoKCSAqIEBzaW5jZSA0LjcuMAoJICoKCSAqIEBwYXJhbSBib29sICRzaG93X3ZpZGVvIFdoZXRoZXIgdGhlIGN1c3RvbSBoZWFkZXIgdmlkZW8gc2hvdWxkIGJlIHNob3duLiBSZXR1cm5zIHRoZSB2YWx1ZQoJICogICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHRoZW1lIHNldHRpbmcgZm9yIHRoZSBgY3VzdG9tLWhlYWRlcmAncyBgdmlkZW8tYWN0aXZlLWNhbGxiYWNrYC4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgIElmIG5vIGNhbGxiYWNrIGlzIHNldCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhhdCBvZiBgaXNfZnJvbnRfcGFnZSgpYC4KCSAqLwoJcmV0dXJuIGFwcGx5X2ZpbHRlcnMoICdpc19oZWFkZXJfdmlkZW9fYWN0aXZlJywgJHNob3dfdmlkZW8gKTsKfQoKLyoqCiAqIFJldHJpZXZlcyB0aGUgbWFya3VwIGZvciBhIGN1c3RvbSBoZWFkZXIuCiAqCiAqIFRoZSBjb250YWluZXIgZGl2IHdpbGwgYWx3YXlzIGJlIHJldHVybmVkIGluIHRoZSBDdXN0b21pemVyIHByZXZpZXcuCiAqCiAqIEBzaW5jZSA0LjcuMAogKgogKiBAcmV0dXJuIHN0cmluZyBUaGUgbWFya3VwIGZvciBhIGN1c3RvbSBoZWFkZXIgb24gc3VjY2Vzcy4KICovCmZ1bmN0aW9uIGdldF9jdXN0b21faGVhZGVyX21hcmt1cCgpIHsKCWlmICggISBoYXNfY3VzdG9tX2hlYWRlcigpICYmICEgaXNfY3VzdG9taXplX3ByZXZpZXcoKSApIHsKCQlyZXR1cm4gJyc7Cgl9CgoJcmV0dXJuIHNwcmludGYoCgkJJzxkaXYgaWQ9IndwLWN1c3RvbS1oZWFkZXIiIGNsYXNzPSJ3cC1jdXN0b20taGVhZGVyIj4lczwvZGl2PicsCgkJZ2V0X2hlYWRlcl9pbWFnZV90YWcoKQoJKTsKfQoKLyoqCiAqIFByaW50cyB0aGUgbWFya3VwIGZvciBhIGN1c3RvbSBoZWFkZXIuCiAqCiAqIEEgY29udGFpbmVyIGRpdiB3aWxsIGFsd2F5cyBiZSBwcmludGVkIGluIHRoZSBDdXN0b21pemVyIHByZXZpZXcuCiAqCiAqIEBzaW5jZSA0LjcuMAogKi8KZnVuY3Rpb24gdGhlX2N1c3RvbV9oZWFkZXJfbWFya3VwKCkgewoJJGN1c3RvbV9oZWFkZXIgPSBnZXRfY3VzdG9tX2hlYWRlcl9tYXJrdXAoKTsKCWlmICggZW1wdHkoICRjdXN0b21faGVhZGVyICkgKSB7CgkJcmV0dXJuOwoJfQoKCWVjaG8gJGN1c3RvbV9oZWFkZXI7CgoJaWYgKCBpc19oZWFkZXJfdmlkZW9fYWN0aXZlKCkgJiYgKCBoYXNfaGVhZGVyX3ZpZGVvKCkgfHwgaXNfY3VzdG9taXplX3ByZXZpZXcoKSApICkgewoJCXdwX2VucXVldWVfc2NyaXB0KCAnd3AtY3VzdG9tLWhlYWRlcicgKTsKCQl3cF9sb2NhbGl6ZV9zY3JpcHQoICd3cC1jdXN0b20taGVhZGVyJywgJ193cEN1c3RvbUhlYWRlclNldHRpbmdzJywgZ2V0X2hlYWRlcl92aWRlb19zZXR0aW5ncygpICk7Cgl9Cn0KCi8qKgogKiBSZXRyaWV2ZXMgYmFja2dyb3VuZCBpbWFnZSBmb3IgY3VzdG9tIGJhY2tncm91bmQuCiAqCiAqIEBzaW5jZSAzLjAuMAogKgogKiBAcmV0dXJuIHN0cmluZwogKi8KZnVuY3Rpb24gZ2V0X2JhY2tncm91bmRfaW1hZ2UoKSB7CglyZXR1cm4gZ2V0X3RoZW1lX21vZCggJ2JhY2tncm91bmRfaW1hZ2UnLCBnZXRfdGhlbWVfc3VwcG9ydCggJ2N1c3RvbS1iYWNrZ3JvdW5kJywgJ2RlZmF1bHQtaW1hZ2UnICkgKTsKfQoKLyoqCiAqIERpc3BsYXlzIGJhY2tncm91bmQgaW1hZ2UgcGF0aC4KICoKICogQHNpbmNlIDMuMC4wCiAqLwpmdW5jdGlvbiBiYWNrZ3JvdW5kX2ltYWdlKCkgewoJZWNobyBnZXRfYmFja2dyb3VuZF9pbWFnZSgpOwp9CgovKioKICogUmV0cmlldmVzIHZhbHVlIGZvciBjdXN0b20gYmFja2dyb3VuZCBjb2xvci4KICoKICogQHNpbmNlIDMuMC4wCiAqCiAqIEByZXR1cm4gc3RyaW5nCiAqLwpmdW5jdGlvbiBnZXRfYmFja2dyb3VuZF9jb2xvcigpIHsKCXJldHVybiBnZXRfdGhlbWVfbW9kKCAnYmFja2dyb3VuZF9jb2xvcicsIGdldF90aGVtZV9zdXBwb3J0KCAnY3VzdG9tLWJhY2tncm91bmQnLCAnZGVmYXVsdC1jb2xvcicgKSApOwp9CgovKioKICogRGlzcGxheXMgYmFja2dyb3VuZCBjb2xvciB2YWx1ZS4KICoKICogQHNpbmNlIDMuMC4wCiAqLwpmdW5jdGlvbiBiYWNrZ3JvdW5kX2NvbG9yKCkgewoJZWNobyBnZXRfYmFja2dyb3VuZF9jb2xvcigpOwp9CgovKioKICogRGVmYXVsdCBjdXN0b20gYmFja2dyb3VuZCBjYWxsYmFjay4KICoKICogQHNpbmNlIDMuMC4wCiAqLwpmdW5jdGlvbiBfY3VzdG9tX2JhY2tncm91bmRfY2IoKSB7CgkvLyAkYmFja2dyb3VuZCBpcyB0aGUgc2F2ZWQgY3VzdG9tIGltYWdlLCBvciB0aGUgZGVmYXVsdCBpbWFnZS4KCSRiYWNrZ3JvdW5kID0gc2V0X3VybF9zY2hlbWUoIGdldF9iYWNrZ3JvdW5kX2ltYWdlKCkgKTsKCgkvLyAkY29sb3IgaXMgdGhlIHNhdmVkIGN1c3RvbSBjb2xvci4KCS8vIEEgZGVmYXVsdCBoYXMgdG8gYmUgc3BlY2lmaWVkIGluIHN0eWxlLmNzcy4gSXQgd2lsbCBub3QgYmUgcHJpbnRlZCBoZXJlLgoJJGNvbG9yID0gZ2V0X2JhY2tncm91bmRfY29sb3IoKTsKCglpZiAoIGdldF90aGVtZV9zdXBwb3J0KCAnY3VzdG9tLWJhY2tncm91bmQnLCAnZGVmYXVsdC1jb2xvcicgKSA9PT0gJGNvbG9yICkgewoJCSRjb2xvciA9IGZhbHNlOwoJfQoKCSR0eXBlX2F0dHIgPSBjdXJyZW50X3RoZW1lX3N1cHBvcnRzKCAnaHRtbDUnLCAnc3R5bGUnICkgPyAnJyA6ICcgdHlwZT0idGV4dC9jc3MiJzsKCglpZiAoICEgJGJhY2tncm91bmQgJiYgISAkY29sb3IgKSB7CgkJaWYgKCBpc19jdXN0b21pemVfcHJldmlldygpICkgewoJCQlwcmludGYoICc8c3R5bGUlcyBpZD0iY3VzdG9tLWJhY2tncm91bmQtY3NzIj48L3N0eWxlPicsICR0eXBlX2F0dHIgKTsKCQl9CgkJcmV0dXJuOwoJfQoKCSRzdHlsZSA9ICRjb2xvciA/ICJiYWNrZ3JvdW5kLWNvbG9yOiAjJGNvbG9yOyIgOiAnJzsKCglpZiAoICRiYWNrZ3JvdW5kICkgewoJCSRpbWFnZSA9ICcgYmFja2dyb3VuZC1pbWFnZTogdXJsKCInIC4gZXNjX3VybF9yYXcoICRiYWNrZ3JvdW5kICkgLiAnIik7JzsKCgkJLy8gQmFja2dyb3VuZCBQb3NpdGlvbi4KCQkkcG9zaXRpb25feCA9IGdldF90aGVtZV9tb2QoICdiYWNrZ3JvdW5kX3Bvc2l0aW9uX3gnLCBnZXRfdGhlbWVfc3VwcG9ydCggJ2N1c3RvbS1iYWNrZ3JvdW5kJywgJ2RlZmF1bHQtcG9zaXRpb24teCcgKSApOwoJCSRwb3NpdGlvbl95ID0gZ2V0X3RoZW1lX21vZCggJ2JhY2tncm91bmRfcG9zaXRpb25feScsIGdldF90aGVtZV9zdXBwb3J0KCAnY3VzdG9tLWJhY2tncm91bmQnLCAnZGVmYXVsdC1wb3NpdGlvbi15JyApICk7CgoJCWlmICggISBpbl9hcnJheSggJHBvc2l0aW9uX3gsIGFycmF5KCAnbGVmdCcsICdjZW50ZXInLCAncmlnaHQnICksIHRydWUgKSApIHsKCQkJJHBvc2l0aW9uX3ggPSAnbGVmdCc7CgkJfQoKCQlpZiAoICEgaW5fYXJyYXkoICRwb3NpdGlvbl95LCBhcnJheSggJ3RvcCcsICdjZW50ZXInLCAnYm90dG9tJyApLCB0cnVlICkgKSB7CgkJCSRwb3NpdGlvbl95ID0gJ3RvcCc7CgkJfQoKCQkkcG9zaXRpb24gPSAiIGJhY2tncm91bmQtcG9zaXRpb246ICRwb3NpdGlvbl94ICRwb3NpdGlvbl95OyI7CgoJCS8vIEJhY2tncm91bmQgU2l6ZS4KCQkkc2l6ZSA9IGdldF90aGVtZV9tb2QoICdiYWNrZ3JvdW5kX3NpemUnLCBnZXRfdGhlbWVfc3VwcG9ydCggJ2N1c3RvbS1iYWNrZ3JvdW5kJywgJ2RlZmF1bHQtc2l6ZScgKSApOwoKCQlpZiAoICEgaW5fYXJyYXkoICRzaXplLCBhcnJheSggJ2F1dG8nLCAnY29udGFpbicsICdjb3ZlcicgKSwgdHJ1ZSApICkgewoJCQkkc2l6ZSA9ICdhdXRvJzsKCQl9CgoJCSRzaXplID0gIiBiYWNrZ3JvdW5kLXNpemU6ICRzaXplOyI7CgoJCS8vIEJhY2tncm91bmQgUmVwZWF0LgoJCSRyZXBlYXQgPSBnZXRfdGhlbWVfbW9kKCAnYmFja2dyb3VuZF9yZXBlYXQnLCBnZXRfdGhlbWVfc3VwcG9ydCggJ2N1c3RvbS1iYWNrZ3JvdW5kJywgJ2RlZmF1bHQtcmVwZWF0JyApICk7CgoJCWlmICggISBpbl9hcnJheSggJHJlcGVhdCwgYXJyYXkoICdyZXBlYXQteCcsICdyZXBlYXQteScsICdyZXBlYXQnLCAnbm8tcmVwZWF0JyApLCB0cnVlICkgKSB7CgkJCSRyZXBlYXQgPSAncmVwZWF0JzsKCQl9CgoJCSRyZXBlYXQgPSAiIGJhY2tncm91bmQtcmVwZWF0OiAkcmVwZWF0OyI7CgoJCS8vIEJhY2tncm91bmQgU2Nyb2xsLgoJCSRhdHRhY2htZW50ID0gZ2V0X3RoZW1lX21vZCggJ2JhY2tncm91bmRfYXR0YWNobWVudCcsIGdldF90aGVtZV9zdXBwb3J0KCAnY3VzdG9tLWJhY2tncm91bmQnLCAnZGVmYXVsdC1hdHRhY2htZW50JyApICk7CgoJCWlmICggJ2ZpeGVkJyAhPT0gJGF0dGFjaG1lbnQgKSB7CgkJCSRhdHRhY2htZW50ID0gJ3Njcm9sbCc7CgkJfQoKCQkkYXR0YWNobWVudCA9ICIgYmFja2dyb3VuZC1hdHRhY2htZW50OiAkYXR0YWNobWVudDsiOwoKCQkkc3R5bGUgLj0gJGltYWdlIC4gJHBvc2l0aW9uIC4gJHNpemUgLiAkcmVwZWF0IC4gJGF0dGFjaG1lbnQ7Cgl9Cgk/Pgo8c3R5bGU8P3BocCBlY2hvICR0eXBlX2F0dHI7ID8+IGlkPSJjdXN0b20tYmFja2dyb3VuZC1jc3MiPgpib2R5LmN1c3RvbS1iYWNrZ3JvdW5kIHsgPD9waHAgZWNobyB0cmltKCAkc3R5bGUgKTsgPz4gfQo8L3N0eWxlPgoJPD9waHAKfQoKLyoqCiAqIFJlbmRlcnMgdGhlIEN1c3RvbSBDU1Mgc3R5bGUgZWxlbWVudC4KICoKICogQHNpbmNlIDQuNy4wCiAqLwpmdW5jdGlvbiB3cF9jdXN0b21fY3NzX2NiKCkgewoJJHN0eWxlcyA9IHdwX2dldF9jdXN0b21fY3NzKCk7CglpZiAoICRzdHlsZXMgfHwgaXNfY3VzdG9taXplX3ByZXZpZXcoKSApIDoKCQkkdHlwZV9hdHRyID0gY3VycmVudF90aGVtZV9zdXBwb3J0cyggJ2h0bWw1JywgJ3N0eWxlJyApID8gJycgOiAnIHR5cGU9InRleHQvY3NzIic7CgkJPz4KCQk8c3R5bGU8P3BocCBlY2hvICR0eXBlX2F0dHI7ID8+IGlkPSJ3cC1jdXN0b20tY3NzIj4KCQkJPD9waHAKCQkJLy8gTm90ZSB0aGF0IGVzY19odG1sKCkgY2Fubm90IGJlIHVzZWQgYmVjYXVzZSBgZGl2ICZndDsgc3BhbmAgaXMgbm90IGludGVycHJldGVkIHByb3Blcmx5LgoJCQllY2hvIHN0cmlwX3RhZ3MoICRzdHlsZXMgKTsKCQkJPz4KCQk8L3N0eWxlPgoJCTw/cGhwCgllbmRpZjsKfQoKLyoqCiAqIEZldGNoZXMgdGhlIGBjdXN0b21fY3NzYCBwb3N0IGZvciBhIGdpdmVuIHRoZW1lLgogKgogKiBAc2luY2UgNC43LjAKICoKICogQHBhcmFtIHN0cmluZyAkc3R5bGVzaGVldCBPcHRpb25hbC4gQSB0aGVtZSBvYmplY3Qgc3R5bGVzaGVldCBuYW1lLiBEZWZhdWx0cyB0byB0aGUgYWN0aXZlIHRoZW1lLgogKiBAcmV0dXJuIFdQX1Bvc3R8bnVsbCBUaGUgY3VzdG9tX2NzcyBwb3N0IG9yIG51bGwgaWYgbm9uZSBleGlzdHMuCiAqLwpmdW5jdGlvbiB3cF9nZXRfY3VzdG9tX2Nzc19wb3N0KCAkc3R5bGVzaGVldCA9ICcnICkgewoJaWYgKCBlbXB0eSggJHN0eWxlc2hlZXQgKSApIHsKCQkkc3R5bGVzaGVldCA9IGdldF9zdHlsZXNoZWV0KCk7Cgl9CgoJJGN1c3RvbV9jc3NfcXVlcnlfdmFycyA9IGFycmF5KAoJCSdwb3N0X3R5cGUnICAgICAgICAgICAgICA9PiAnY3VzdG9tX2NzcycsCgkJJ3Bvc3Rfc3RhdHVzJyAgICAgICAgICAgID0+IGdldF9wb3N0X3N0YXRpKCksCgkJJ25hbWUnICAgICAgICAgICAgICAgICAgID0+IHNhbml0aXplX3RpdGxlKCAkc3R5bGVzaGVldCApLAoJCSdwb3N0c19wZXJfcGFnZScgICAgICAgICA9PiAxLAoJCSdub19mb3VuZF9yb3dzJyAgICAgICAgICA9PiB0cnVlLAoJCSdjYWNoZV9yZXN1bHRzJyAgICAgICAgICA9PiB0cnVlLAoJCSd1cGRhdGVfcG9zdF9tZXRhX2NhY2hlJyA9PiBmYWxzZSwKCQkndXBkYXRlX3Bvc3RfdGVybV9jYWNoZScgPT4gZmFsc2UsCgkJJ2xhenlfbG9hZF90ZXJtX21ldGEnICAgID0+IGZhbHNlLAoJKTsKCgkkcG9zdCA9IG51bGw7CglpZiAoIGdldF9zdHlsZXNoZWV0KCkgPT09ICRzdHlsZXNoZWV0ICkgewoJCSRwb3N0X2lkID0gZ2V0X3RoZW1lX21vZCggJ2N1c3RvbV9jc3NfcG9zdF9pZCcgKTsKCgkJaWYgKCAkcG9zdF9pZCA+IDAgJiYgZ2V0X3Bvc3QoICRwb3N0X2lkICkgKSB7CgkJCSRwb3N0ID0gZ2V0X3Bvc3QoICRwb3N0X2lkICk7CgkJfQoKCQkvLyBgLTFgIGluZGljYXRlcyBubyBwb3N0IGV4aXN0czsgbm8gcXVlcnkgbmVjZXNzYXJ5LgoJCWlmICggISAkcG9zdCAmJiAtMSAhPT0gJHBvc3RfaWQgKSB7CgkJCSRxdWVyeSA9IG5ldyBXUF9RdWVyeSggJGN1c3RvbV9jc3NfcXVlcnlfdmFycyApOwoJCQkkcG9zdCAgPSAkcXVlcnktPnBvc3Q7CgkJCS8qCgkJCSAqIENhY2hlIHRoZSBsb29rdXAuIFNlZSB3cF91cGRhdGVfY3VzdG9tX2Nzc19wb3N0KCkuCgkJCSAqIEB0b2RvIFRoaXMgc2hvdWxkIGdldCBjbGVhcmVkIGlmIGEgY3VzdG9tX2NzcyBwb3N0IGlzIGFkZGVkL3JlbW92ZWQuCgkJCSAqLwoJCQlzZXRfdGhlbWVfbW9kKCAnY3VzdG9tX2Nzc19wb3N0X2lkJywgJHBvc3QgPyAkcG9zdC0+SUQgOiAtMSApOwoJCX0KCX0gZWxzZSB7CgkJJHF1ZXJ5ID0gbmV3IFdQX1F1ZXJ5KCAkY3VzdG9tX2Nzc19xdWVyeV92YXJzICk7CgkJJHBvc3QgID0gJHF1ZXJ5LT5wb3N0OwoJfQoKCXJldHVybiAkcG9zdDsKfQoKLyoqCiAqIEZldGNoZXMgdGhlIHNhdmVkIEN1c3RvbSBDU1MgY29udGVudCBmb3IgcmVuZGVyaW5nLgogKgogKiBAc2luY2UgNC43LjAKICoKICogQHBhcmFtIHN0cmluZyAkc3R5bGVzaGVldCBPcHRpb25hbC4gQSB0aGVtZSBvYmplY3Qgc3R5bGVzaGVldCBuYW1lLiBEZWZhdWx0cyB0byB0aGUgYWN0aXZlIHRoZW1lLgogKiBAcmV0dXJuIHN0cmluZyBUaGUgQ3VzdG9tIENTUyBQb3N0IGNvbnRlbnQuCiAqLwpmdW5jdGlvbiB3cF9nZXRfY3VzdG9tX2NzcyggJHN0eWxlc2hlZXQgPSAnJyApIHsKCSRjc3MgPSAnJzsKCglpZiAoIGVtcHR5KCAkc3R5bGVzaGVldCApICkgewoJCSRzdHlsZXNoZWV0ID0gZ2V0X3N0eWxlc2hlZXQoKTsKCX0KCgkkcG9zdCA9IHdwX2dldF9jdXN0b21fY3NzX3Bvc3QoICRzdHlsZXNoZWV0ICk7CglpZiAoICRwb3N0ICkgewoJCSRjc3MgPSAkcG9zdC0+cG9zdF9jb250ZW50OwoJfQoKCS8qKgoJICogRmlsdGVycyB0aGUgY3VzdG9tIENTUyBvdXRwdXQgaW50byB0aGUgaGVhZCBlbGVtZW50LgoJICoKCSAqIEBzaW5jZSA0LjcuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGNzcyAgICAgICAgQ1NTIHB1bGxlZCBpbiBmcm9tIHRoZSBDdXN0b20gQ1NTIHBvc3QgdHlwZS4KCSAqIEBwYXJhbSBzdHJpbmcgJHN0eWxlc2hlZXQgVGhlIHRoZW1lIHN0eWxlc2hlZXQgbmFtZS4KCSAqLwoJJGNzcyA9IGFwcGx5X2ZpbHRlcnMoICd3cF9nZXRfY3VzdG9tX2NzcycsICRjc3MsICRzdHlsZXNoZWV0ICk7CgoJcmV0dXJuICRjc3M7Cn0KCi8qKgogKiBVcGRhdGVzIHRoZSBgY3VzdG9tX2Nzc2AgcG9zdCBmb3IgYSBnaXZlbiB0aGVtZS4KICoKICogSW5zZXJ0cyBhIGBjdXN0b21fY3NzYCBwb3N0IHdoZW4gb25lIGRvZXNuJ3QgeWV0IGV4aXN0LgogKgogKiBAc2luY2UgNC43LjAKICoKICogQHBhcmFtIHN0cmluZyAkY3NzIENTUywgc3RvcmVkIGluIGBwb3N0X2NvbnRlbnRgLgogKiBAcGFyYW0gYXJyYXkgICRhcmdzIHsKICogICAgIEFyZ3MuCiAqCiAqICAgICBAdHlwZSBzdHJpbmcgJHByZXByb2Nlc3NlZCBPcHRpb25hbC4gUHJlLXByb2Nlc3NlZCBDU1MsIHN0b3JlZCBpbiBgcG9zdF9jb250ZW50X2ZpbHRlcmVkYC4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGx5IGVtcHR5IHN0cmluZy4KICogICAgIEB0eXBlIHN0cmluZyAkc3R5bGVzaGVldCAgIE9wdGlvbmFsLiBTdHlsZXNoZWV0IChjaGlsZCB0aGVtZSkgdG8gdXBkYXRlLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gYWN0aXZlIHRoZW1lL3N0eWxlc2hlZXQuCiAqIH0KICogQHJldHVybiBXUF9Qb3N0fFdQX0Vycm9yIFBvc3Qgb24gc3VjY2VzcywgZXJyb3Igb24gZmFpbHVyZS4KICovCmZ1bmN0aW9uIHdwX3VwZGF0ZV9jdXN0b21fY3NzX3Bvc3QoICRjc3MsICRhcmdzID0gYXJyYXkoKSApIHsKCSRhcmdzID0gd3BfcGFyc2VfYXJncygKCQkkYXJncywKCQlhcnJheSgKCQkJJ3ByZXByb2Nlc3NlZCcgPT4gJycsCgkJCSdzdHlsZXNoZWV0JyAgID0+IGdldF9zdHlsZXNoZWV0KCksCgkJKQoJKTsKCgkkZGF0YSA9IGFycmF5KAoJCSdjc3MnICAgICAgICAgID0+ICRjc3MsCgkJJ3ByZXByb2Nlc3NlZCcgPT4gJGFyZ3NbJ3ByZXByb2Nlc3NlZCddLAoJKTsKCgkvKioKCSAqIEZpbHRlcnMgdGhlIGBjc3NgIChgcG9zdF9jb250ZW50YCkgYW5kIGBwcmVwcm9jZXNzZWRgIChgcG9zdF9jb250ZW50X2ZpbHRlcmVkYCkgYXJncwoJICogZm9yIGEgYGN1c3RvbV9jc3NgIHBvc3QgYmVpbmcgdXBkYXRlZC4KCSAqCgkgKiBUaGlzIGZpbHRlciBjYW4gYmUgdXNlZCBieSBwbHVnaW4gdGhhdCBvZmZlciBDU1MgcHJlLXByb2Nlc3NvcnMsIHRvIHN0b3JlIHRoZSBvcmlnaW5hbAoJICogcHJlLXByb2Nlc3NlZCBDU1MgaW4gYHBvc3RfY29udGVudF9maWx0ZXJlZGAgYW5kIHRoZW4gc3RvcmUgcHJvY2Vzc2VkIENTUyBpbiBgcG9zdF9jb250ZW50YC4KCSAqIFdoZW4gdXNlZCBpbiB0aGlzIHdheSwgdGhlIGBwb3N0X2NvbnRlbnRfZmlsdGVyZWRgIHNob3VsZCBiZSBzdXBwbGllZCBhcyB0aGUgc2V0dGluZyB2YWx1ZQoJICogaW5zdGVhZCBvZiBgcG9zdF9jb250ZW50YCB2aWEgYSB0aGUgYGN1c3RvbWl6ZV92YWx1ZV9jdXN0b21fY3NzYCBmaWx0ZXIsIGZvciBleGFtcGxlOgoJICoKCSAqIDxjb2RlPgoJICogYWRkX2ZpbHRlciggJ2N1c3RvbWl6ZV92YWx1ZV9jdXN0b21fY3NzJywgZnVuY3Rpb24oICR2YWx1ZSwgJHNldHRpbmcgKSB7CgkgKiAgICAgJHBvc3QgPSB3cF9nZXRfY3VzdG9tX2Nzc19wb3N0KCAkc2V0dGluZy0+c3R5bGVzaGVldCApOwoJICogICAgIGlmICggJHBvc3QgJiYgISBlbXB0eSggJHBvc3QtPnBvc3RfY29udGVudF9maWx0ZXJlZCApICkgewoJICogICAgICAgICAkY3NzID0gJHBvc3QtPnBvc3RfY29udGVudF9maWx0ZXJlZDsKCSAqICAgICB9CgkgKiAgICAgcmV0dXJuICRjc3M7CgkgKiB9LCAxMCwgMiApOwoJICogPC9jb2RlPgoJICoKCSAqIEBzaW5jZSA0LjcuMAoJICogQHBhcmFtIGFycmF5ICRkYXRhIHsKCSAqICAgICBDdXN0b20gQ1NTIGRhdGEuCgkgKgoJICogICAgIEB0eXBlIHN0cmluZyAkY3NzICAgICAgICAgIENTUyBzdG9yZWQgaW4gYHBvc3RfY29udGVudGAuCgkgKiAgICAgQHR5cGUgc3RyaW5nICRwcmVwcm9jZXNzZWQgUHJlLXByb2Nlc3NlZCBDU1Mgc3RvcmVkIGluIGBwb3N0X2NvbnRlbnRfZmlsdGVyZWRgLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGx5IGVtcHR5IHN0cmluZy4KCSAqIH0KCSAqIEBwYXJhbSBhcnJheSAkYXJncyB7CgkgKiAgICAgVGhlIGFyZ3MgcGFzc2VkIGludG8gYHdwX3VwZGF0ZV9jdXN0b21fY3NzX3Bvc3QoKWAgbWVyZ2VkIHdpdGggZGVmYXVsdHMuCgkgKgoJICogICAgIEB0eXBlIHN0cmluZyAkY3NzICAgICAgICAgIFRoZSBvcmlnaW5hbCBDU1MgcGFzc2VkIGluIHRvIGJlIHVwZGF0ZWQuCgkgKiAgICAgQHR5cGUgc3RyaW5nICRwcmVwcm9jZXNzZWQgVGhlIG9yaWdpbmFsIHByZXByb2Nlc3NlZCBDU1MgcGFzc2VkIGluIHRvIGJlIHVwZGF0ZWQuCgkgKiAgICAgQHR5cGUgc3RyaW5nICRzdHlsZXNoZWV0ICAgVGhlIHN0eWxlc2hlZXQgKHRoZW1lKSBiZWluZyB1cGRhdGVkLgoJICogfQoJICovCgkkZGF0YSA9IGFwcGx5X2ZpbHRlcnMoICd1cGRhdGVfY3VzdG9tX2Nzc19kYXRhJywgJGRhdGEsIGFycmF5X21lcmdlKCAkYXJncywgY29tcGFjdCggJ2NzcycgKSApICk7CgoJJHBvc3RfZGF0YSA9IGFycmF5KAoJCSdwb3N0X3RpdGxlJyAgICAgICAgICAgID0+ICRhcmdzWydzdHlsZXNoZWV0J10sCgkJJ3Bvc3RfbmFtZScgICAgICAgICAgICAgPT4gc2FuaXRpemVfdGl0bGUoICRhcmdzWydzdHlsZXNoZWV0J10gKSwKCQkncG9zdF90eXBlJyAgICAgICAgICAgICA9PiAnY3VzdG9tX2NzcycsCgkJJ3Bvc3Rfc3RhdHVzJyAgICAgICAgICAgPT4gJ3B1Ymxpc2gnLAoJCSdwb3N0X2NvbnRlbnQnICAgICAgICAgID0+ICRkYXRhWydjc3MnXSwKCQkncG9zdF9jb250ZW50X2ZpbHRlcmVkJyA9PiAkZGF0YVsncHJlcHJvY2Vzc2VkJ10sCgkpOwoKCS8vIFVwZGF0ZSBwb3N0IGlmIGl0IGFscmVhZHkgZXhpc3RzLCBvdGhlcndpc2UgY3JlYXRlIGEgbmV3IG9uZS4KCSRwb3N0ID0gd3BfZ2V0X2N1c3RvbV9jc3NfcG9zdCggJGFyZ3NbJ3N0eWxlc2hlZXQnXSApOwoJaWYgKCAkcG9zdCApIHsKCQkkcG9zdF9kYXRhWydJRCddID0gJHBvc3QtPklEOwoJCSRyICAgICAgICAgICAgICAgPSB3cF91cGRhdGVfcG9zdCggd3Bfc2xhc2goICRwb3N0X2RhdGEgKSwgdHJ1ZSApOwoJfSBlbHNlIHsKCQkkciA9IHdwX2luc2VydF9wb3N0KCB3cF9zbGFzaCggJHBvc3RfZGF0YSApLCB0cnVlICk7CgoJCWlmICggISBpc193cF9lcnJvciggJHIgKSApIHsKCQkJaWYgKCBnZXRfc3R5bGVzaGVldCgpID09PSAkYXJnc1snc3R5bGVzaGVldCddICkgewoJCQkJc2V0X3RoZW1lX21vZCggJ2N1c3RvbV9jc3NfcG9zdF9pZCcsICRyICk7CgkJCX0KCgkJCS8vIFRyaWdnZXIgY3JlYXRpb24gb2YgYSByZXZpc2lvbi4gVGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlICMzMDg1NCBpcyByZXNvbHZlZC4KCQkJaWYgKCAwID09PSBjb3VudCggd3BfZ2V0X3Bvc3RfcmV2aXNpb25zKCAkciApICkgKSB7CgkJCQl3cF9zYXZlX3Bvc3RfcmV2aXNpb24oICRyICk7CgkJCX0KCQl9Cgl9CgoJaWYgKCBpc193cF9lcnJvciggJHIgKSApIHsKCQlyZXR1cm4gJHI7Cgl9CglyZXR1cm4gZ2V0X3Bvc3QoICRyICk7Cn0KCi8qKgogKiBBZGRzIGNhbGxiYWNrIGZvciBjdXN0b20gVGlueU1DRSBlZGl0b3Igc3R5bGVzaGVldHMuCiAqCiAqIFRoZSBwYXJhbWV0ZXIgJHN0eWxlc2hlZXQgaXMgdGhlIG5hbWUgb2YgdGhlIHN0eWxlc2hlZXQsIHJlbGF0aXZlIHRvCiAqIHRoZSB0aGVtZSByb290LiBJdCBhbHNvIGFjY2VwdHMgYW4gYXJyYXkgb2Ygc3R5bGVzaGVldHMuCiAqIEl0IGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAnZWRpdG9yLXN0eWxlLmNzcycuCiAqCiAqIFRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBhZGRzIGFub3RoZXIgc3R5bGVzaGVldCB3aXRoIC1ydGwgcHJlZml4LCBlLmcuIGVkaXRvci1zdHlsZS1ydGwuY3NzLgogKiBJZiB0aGF0IGZpbGUgZG9lc24ndCBleGlzdCwgaXQgaXMgcmVtb3ZlZCBiZWZvcmUgYWRkaW5nIHRoZSBzdHlsZXNoZWV0KHMpIHRvIFRpbnlNQ0UuCiAqIElmIGFuIGFycmF5IG9mIHN0eWxlc2hlZXRzIGlzIHBhc3NlZCB0byBhZGRfZWRpdG9yX3N0eWxlKCksCiAqIFJUTCBpcyBvbmx5IGFkZGVkIGZvciB0aGUgZmlyc3Qgc3R5bGVzaGVldC4KICoKICogU2luY2UgdmVyc2lvbiAzLjQgdGhlIFRpbnlNQ0UgYm9keSBoYXMgLnJ0bCBDU1MgY2xhc3MuCiAqIEl0IGlzIGEgYmV0dGVyIG9wdGlvbiB0byB1c2UgdGhhdCBjbGFzcyBhbmQgYWRkIGFueSBSVEwgc3R5bGVzIHRvIHRoZSBtYWluIHN0eWxlc2hlZXQuCiAqCiAqIEBzaW5jZSAzLjAuMAogKgogKiBAZ2xvYmFsIGFycmF5ICRlZGl0b3Jfc3R5bGVzCiAqCiAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJHN0eWxlc2hlZXQgT3B0aW9uYWwuIFN0eWxlc2hlZXQgbmFtZSBvciBhcnJheSB0aGVyZW9mLCByZWxhdGl2ZSB0byB0aGVtZSByb290LgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvICdlZGl0b3Itc3R5bGUuY3NzJwogKi8KZnVuY3Rpb24gYWRkX2VkaXRvcl9zdHlsZSggJHN0eWxlc2hlZXQgPSAnZWRpdG9yLXN0eWxlLmNzcycgKSB7CglnbG9iYWwgJGVkaXRvcl9zdHlsZXM7CgoJYWRkX3RoZW1lX3N1cHBvcnQoICdlZGl0b3Itc3R5bGUnICk7CgoJJGVkaXRvcl9zdHlsZXMgPSAoYXJyYXkpICRlZGl0b3Jfc3R5bGVzOwoJJHN0eWxlc2hlZXQgICAgPSAoYXJyYXkpICRzdHlsZXNoZWV0OwoKCWlmICggaXNfcnRsKCkgKSB7CgkJJHJ0bF9zdHlsZXNoZWV0ID0gc3RyX3JlcGxhY2UoICcuY3NzJywgJy1ydGwuY3NzJywgJHN0eWxlc2hlZXRbMF0gKTsKCQkkc3R5bGVzaGVldFtdICAgPSAkcnRsX3N0eWxlc2hlZXQ7Cgl9CgoJJGVkaXRvcl9zdHlsZXMgPSBhcnJheV9tZXJnZSggJGVkaXRvcl9zdHlsZXMsICRzdHlsZXNoZWV0ICk7Cn0KCi8qKgogKiBSZW1vdmVzIGFsbCB2aXN1YWwgZWRpdG9yIHN0eWxlc2hlZXRzLgogKgogKiBAc2luY2UgMy4xLjAKICoKICogQGdsb2JhbCBhcnJheSAkZWRpdG9yX3N0eWxlcwogKgogKiBAcmV0dXJuIGJvb2wgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiB0aGVyZSB3ZXJlIG5vIHN0eWxlc2hlZXRzIHRvIHJlbW92ZS4KICovCmZ1bmN0aW9uIHJlbW92ZV9lZGl0b3Jfc3R5bGVzKCkgewoJaWYgKCAhIGN1cnJlbnRfdGhlbWVfc3VwcG9ydHMoICdlZGl0b3Itc3R5bGUnICkgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoJX3JlbW92ZV90aGVtZV9zdXBwb3J0KCAnZWRpdG9yLXN0eWxlJyApOwoJaWYgKCBpc19hZG1pbigpICkgewoJCSRHTE9CQUxTWydlZGl0b3Jfc3R5bGVzJ10gPSBhcnJheSgpOwoJfQoJcmV0dXJuIHRydWU7Cn0KCi8qKgogKiBSZXRyaWV2ZXMgYW55IHJlZ2lzdGVyZWQgZWRpdG9yIHN0eWxlc2hlZXQgVVJMcy4KICoKICogQHNpbmNlIDQuMC4wCiAqCiAqIEBnbG9iYWwgYXJyYXkgJGVkaXRvcl9zdHlsZXMgUmVnaXN0ZXJlZCBlZGl0b3Igc3R5bGVzaGVldHMKICoKICogQHJldHVybiBzdHJpbmdbXSBJZiByZWdpc3RlcmVkLCBhIGxpc3Qgb2YgZWRpdG9yIHN0eWxlc2hlZXQgVVJMcy4KICovCmZ1bmN0aW9uIGdldF9lZGl0b3Jfc3R5bGVzaGVldHMoKSB7Cgkkc3R5bGVzaGVldHMgPSBhcnJheSgpOwoJLy8gTG9hZCBlZGl0b3Jfc3R5bGUuY3NzIGlmIHRoZSBhY3RpdmUgdGhlbWUgc3VwcG9ydHMgaXQuCglpZiAoICEgZW1wdHkoICRHTE9CQUxTWydlZGl0b3Jfc3R5bGVzJ10gKSAmJiBpc19hcnJheSggJEdMT0JBTFNbJ2VkaXRvcl9zdHlsZXMnXSApICkgewoJCSRlZGl0b3Jfc3R5bGVzID0gJEdMT0JBTFNbJ2VkaXRvcl9zdHlsZXMnXTsKCgkJJGVkaXRvcl9zdHlsZXMgPSBhcnJheV91bmlxdWUoIGFycmF5X2ZpbHRlciggJGVkaXRvcl9zdHlsZXMgKSApOwoJCSRzdHlsZV91cmkgICAgID0gZ2V0X3N0eWxlc2hlZXRfZGlyZWN0b3J5X3VyaSgpOwoJCSRzdHlsZV9kaXIgICAgID0gZ2V0X3N0eWxlc2hlZXRfZGlyZWN0b3J5KCk7CgoJCS8vIFN1cHBvcnQgZXh0ZXJuYWxseSByZWZlcmVuY2VkIHN0eWxlcyAobGlrZSwgc2F5LCBmb250cykuCgkJZm9yZWFjaCAoICRlZGl0b3Jfc3R5bGVzIGFzICRrZXkgPT4gJGZpbGUgKSB7CgkJCWlmICggcHJlZ19tYXRjaCggJ35eKGh0dHBzPzopPy8vficsICRmaWxlICkgKSB7CgkJCQkkc3R5bGVzaGVldHNbXSA9IGVzY191cmxfcmF3KCAkZmlsZSApOwoJCQkJdW5zZXQoICRlZGl0b3Jfc3R5bGVzWyAka2V5IF0gKTsKCQkJfQoJCX0KCgkJLy8gTG9vayBpbiBhIHBhcmVudCB0aGVtZSBmaXJzdCwgdGhhdCB3YXkgY2hpbGQgdGhlbWUgQ1NTIG92ZXJyaWRlcy4KCQlpZiAoIGlzX2NoaWxkX3RoZW1lKCkgKSB7CgkJCSR0ZW1wbGF0ZV91cmkgPSBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5X3VyaSgpOwoJCQkkdGVtcGxhdGVfZGlyID0gZ2V0X3RlbXBsYXRlX2RpcmVjdG9yeSgpOwoKCQkJZm9yZWFjaCAoICRlZGl0b3Jfc3R5bGVzIGFzICRrZXkgPT4gJGZpbGUgKSB7CgkJCQlpZiAoICRmaWxlICYmIGZpbGVfZXhpc3RzKCAiJHRlbXBsYXRlX2Rpci8kZmlsZSIgKSApIHsKCQkJCQkkc3R5bGVzaGVldHNbXSA9ICIkdGVtcGxhdGVfdXJpLyRmaWxlIjsKCQkJCX0KCQkJfQoJCX0KCgkJZm9yZWFjaCAoICRlZGl0b3Jfc3R5bGVzIGFzICRmaWxlICkgewoJCQlpZiAoICRmaWxlICYmIGZpbGVfZXhpc3RzKCAiJHN0eWxlX2Rpci8kZmlsZSIgKSApIHsKCQkJCSRzdHlsZXNoZWV0c1tdID0gIiRzdHlsZV91cmkvJGZpbGUiOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogRmlsdGVycyB0aGUgYXJyYXkgb2YgVVJMcyBvZiBzdHlsZXNoZWV0cyBhcHBsaWVkIHRvIHRoZSBlZGl0b3IuCgkgKgoJICogQHNpbmNlIDQuMy4wCgkgKgoJICogQHBhcmFtIHN0cmluZ1tdICRzdHlsZXNoZWV0cyBBcnJheSBvZiBVUkxzIG9mIHN0eWxlc2hlZXRzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGVkaXRvci4KCSAqLwoJcmV0dXJuIGFwcGx5X2ZpbHRlcnMoICdlZGl0b3Jfc3R5bGVzaGVldHMnLCAkc3R5bGVzaGVldHMgKTsKfQoKLyoqCiAqIEV4cGFuZHMgYSB0aGVtZSdzIHN0YXJ0ZXIgY29udGVudCBjb25maWd1cmF0aW9uIHVzaW5nIGNvcmUtcHJvdmlkZWQgZGF0YS4KICoKICogQHNpbmNlIDQuNy4wCiAqCiAqIEByZXR1cm4gYXJyYXkgQXJyYXkgb2Ygc3RhcnRlciBjb250ZW50LgogKi8KZnVuY3Rpb24gZ2V0X3RoZW1lX3N0YXJ0ZXJfY29udGVudCgpIHsKCSR0aGVtZV9zdXBwb3J0ID0gZ2V0X3RoZW1lX3N1cHBvcnQoICdzdGFydGVyLWNvbnRlbnQnICk7CglpZiAoIGlzX2FycmF5KCAkdGhlbWVfc3VwcG9ydCApICYmICEgZW1wdHkoICR0aGVtZV9zdXBwb3J0WzBdICkgJiYgaXNfYXJyYXkoICR0aGVtZV9zdXBwb3J0WzBdICkgKSB7CgkJJGNvbmZpZyA9ICR0aGVtZV9zdXBwb3J0WzBdOwoJfSBlbHNlIHsKCQkkY29uZmlnID0gYXJyYXkoKTsKCX0KCgkkY29yZV9jb250ZW50ID0gYXJyYXkoCgkJJ3dpZGdldHMnICAgPT4gYXJyYXkoCgkJCSd0ZXh0X2J1c2luZXNzX2luZm8nID0+IGFycmF5KAoJCQkJJ3RleHQnLAoJCQkJYXJyYXkoCgkJCQkJJ3RpdGxlJyAgPT4gX3goICdGaW5kIFVzJywgJ1RoZW1lIHN0YXJ0ZXIgY29udGVudCcgKSwKCQkJCQkndGV4dCcgICA9PiBpbXBsb2RlKAoJCQkJCQknJywKCQkJCQkJYXJyYXkoCgkJCQkJCQknPHN0cm9uZz4nIC4gX3goICdBZGRyZXNzJywgJ1RoZW1lIHN0YXJ0ZXIgY29udGVudCcgKSAuICI8L3N0cm9uZz5cbiIsCgkJCQkJCQlfeCggJzEyMyBNYWluIFN0cmVldCcsICdUaGVtZSBzdGFydGVyIGNvbnRlbnQnICkgLiAiXG4iLAoJCQkJCQkJX3goICdOZXcgWW9yaywgTlkgMTAwMDEnLCAnVGhlbWUgc3RhcnRlciBjb250ZW50JyApIC4gIlxuXG4iLAoJCQkJCQkJJzxzdHJvbmc+JyAuIF94KCAnSG91cnMnLCAnVGhlbWUgc3RhcnRlciBjb250ZW50JyApIC4gIjwvc3Ryb25nPlxuIiwKCQkJCQkJCV94KCAnTW9uZGF5Jm5kYXNoO0ZyaWRheTogOTowMEFNJm5kYXNoOzU6MDBQTScsICdUaGVtZSBzdGFydGVyIGNvbnRlbnQnICkgLiAiXG4iLAoJCQkJCQkJX3goICdTYXR1cmRheSAmYW1wOyBTdW5kYXk6IDExOjAwQU0mbmRhc2g7MzowMFBNJywgJ1RoZW1lIHN0YXJ0ZXIgY29udGVudCcgKSwKCQkJCQkJKQoJCQkJCSksCgkJCQkJJ2ZpbHRlcicgPT4gdHJ1ZSwKCQkJCQkndmlzdWFsJyA9PiB0cnVlLAoJCQkJKSwKCQkJKSwKCQkJJ3RleHRfYWJvdXQnICAgICAgICAgPT4gYXJyYXkoCgkJCQkndGV4dCcsCgkJCQlhcnJheSgKCQkJCQkndGl0bGUnICA9PiBfeCggJ0Fib3V0IFRoaXMgU2l0ZScsICdUaGVtZSBzdGFydGVyIGNvbnRlbnQnICksCgkJCQkJJ3RleHQnICAgPT4gX3goICdUaGlzIG1heSBiZSBhIGdvb2QgcGxhY2UgdG8gaW50cm9kdWNlIHlvdXJzZWxmIGFuZCB5b3VyIHNpdGUgb3IgaW5jbHVkZSBzb21lIGNyZWRpdHMuJywgJ1RoZW1lIHN0YXJ0ZXIgY29udGVudCcgKSwKCQkJCQknZmlsdGVyJyA9PiB0cnVlLAoJCQkJCSd2aXN1YWwnID0+IHRydWUsCgkJCQkpLAoJCQkpLAoJCQknYXJjaGl2ZXMnICAgICAgICAgICA9PiBhcnJheSgKCQkJCSdhcmNoaXZlcycsCgkJCQlhcnJheSgKCQkJCQkndGl0bGUnID0+IF94KCAnQXJjaGl2ZXMnLCAnVGhlbWUgc3RhcnRlciBjb250ZW50JyApLAoJCQkJKSwKCQkJKSwKCQkJJ2NhbGVuZGFyJyAgICAgICAgICAgPT4gYXJyYXkoCgkJCQknY2FsZW5kYXInLAoJCQkJYXJyYXkoCgkJCQkJJ3RpdGxlJyA9PiBfeCggJ0NhbGVuZGFyJywgJ1RoZW1lIHN0YXJ0ZXIgY29udGVudCcgKSwKCQkJCSksCgkJCSksCgkJCSdjYXRlZ29yaWVzJyAgICAgICAgID0+IGFycmF5KAoJCQkJJ2NhdGVnb3JpZXMnLAoJCQkJYXJyYXkoCgkJCQkJJ3RpdGxlJyA9PiBfeCggJ0NhdGVnb3JpZXMnLCAnVGhlbWUgc3RhcnRlciBjb250ZW50JyApLAoJCQkJKSwKCQkJKSwKCQkJJ21ldGEnICAgICAgICAgICAgICAgPT4gYXJyYXkoCgkJCQknbWV0YScsCgkJCQlhcnJheSgKCQkJCQkndGl0bGUnID0+IF94KCAnTWV0YScsICdUaGVtZSBzdGFydGVyIGNvbnRlbnQnICksCgkJCQkpLAoJCQkpLAoJCQkncmVjZW50LWNvbW1lbnRzJyAgICA9PiBhcnJheSgKCQkJCSdyZWNlbnQtY29tbWVudHMnLAoJCQkJYXJyYXkoCgkJCQkJJ3RpdGxlJyA9PiBfeCggJ1JlY2VudCBDb21tZW50cycsICdUaGVtZSBzdGFydGVyIGNvbnRlbnQnICksCgkJCQkpLAoJCQkpLAoJCQkncmVjZW50LXBvc3RzJyAgICAgICA9PiBhcnJheSgKCQkJCSdyZWNlbnQtcG9zdHMnLAoJCQkJYXJyYXkoCgkJCQkJJ3RpdGxlJyA9PiBfeCggJ1JlY2VudCBQb3N0cycsICdUaGVtZSBzdGFydGVyIGNvbnRlbnQnICksCgkJCQkpLAoJCQkpLAoJCQknc2VhcmNoJyAgICAgICAgICAgICA9PiBhcnJheSgKCQkJCSdzZWFyY2gnLAoJCQkJYXJyYXkoCgkJCQkJJ3RpdGxlJyA9PiBfeCggJ1NlYXJjaCcsICdUaGVtZSBzdGFydGVyIGNvbnRlbnQnICksCgkJCQkpLAoJCQkpLAoJCSksCgkJJ25hdl9tZW51cycgPT4gYXJyYXkoCgkJCSdsaW5rX2hvbWUnICAgICAgID0+IGFycmF5KAoJCQkJJ3R5cGUnICA9PiAnY3VzdG9tJywKCQkJCSd0aXRsZScgPT4gX3goICdIb21lJywgJ1RoZW1lIHN0YXJ0ZXIgY29udGVudCcgKSwKCQkJCSd1cmwnICAgPT4gaG9tZV91cmwoICcvJyApLAoJCQkpLAoJCQkncGFnZV9ob21lJyAgICAgICA9PiBhcnJheSggLy8gRGVwcmVjYXRlZCBpbiBmYXZvciBvZiAnbGlua19ob21lJy4KCQkJCSd0eXBlJyAgICAgID0+ICdwb3N0X3R5cGUnLAoJCQkJJ29iamVjdCcgICAgPT4gJ3BhZ2UnLAoJCQkJJ29iamVjdF9pZCcgPT4gJ3t7aG9tZX19JywKCQkJKSwKCQkJJ3BhZ2VfYWJvdXQnICAgICAgPT4gYXJyYXkoCgkJCQkndHlwZScgICAgICA9PiAncG9zdF90eXBlJywKCQkJCSdvYmplY3QnICAgID0+ICdwYWdlJywKCQkJCSdvYmplY3RfaWQnID0+ICd7e2Fib3V0fX0nLAoJCQkpLAoJCQkncGFnZV9ibG9nJyAgICAgICA9PiBhcnJheSgKCQkJCSd0eXBlJyAgICAgID0+ICdwb3N0X3R5cGUnLAoJCQkJJ29iamVjdCcgICAgPT4gJ3BhZ2UnLAoJCQkJJ29iamVjdF9pZCcgPT4gJ3t7YmxvZ319JywKCQkJKSwKCQkJJ3BhZ2VfbmV3cycgICAgICAgPT4gYXJyYXkoCgkJCQkndHlwZScgICAgICA9PiAncG9zdF90eXBlJywKCQkJCSdvYmplY3QnICAgID0+ICdwYWdlJywKCQkJCSdvYmplY3RfaWQnID0+ICd7e25ld3N9fScsCgkJCSksCgkJCSdwYWdlX2NvbnRhY3QnICAgID0+IGFycmF5KAoJCQkJJ3R5cGUnICAgICAgPT4gJ3Bvc3RfdHlwZScsCgkJCQknb2JqZWN0JyAgICA9PiAncGFnZScsCgkJCQknb2JqZWN0X2lkJyA9PiAne3tjb250YWN0fX0nLAoJCQkpLAoKCQkJJ2xpbmtfZW1haWwnICAgICAgPT4gYXJyYXkoCgkJCQkndGl0bGUnID0+IF94KCAnRW1haWwnLCAnVGhlbWUgc3RhcnRlciBjb250ZW50JyApLAoJCQkJJ3VybCcgICA9PiAnbWFpbHRvOndvcmRwcmVzc0BleGFtcGxlLmNvbScsCgkJCSksCgkJCSdsaW5rX2ZhY2Vib29rJyAgID0+IGFycmF5KAoJCQkJJ3RpdGxlJyA9PiBfeCggJ0ZhY2Vib29rJywgJ1RoZW1lIHN0YXJ0ZXIgY29udGVudCcgKSwKCQkJCSd1cmwnICAgPT4gJ2h0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS93b3JkcHJlc3MnLAoJCQkpLAoJCQknbGlua19mb3Vyc3F1YXJlJyA9PiBhcnJheSgKCQkJCSd0aXRsZScgPT4gX3goICdGb3Vyc3F1YXJlJywgJ1RoZW1lIHN0YXJ0ZXIgY29udGVudCcgKSwKCQkJCSd1cmwnICAgPT4gJ2h0dHBzOi8vZm91cnNxdWFyZS5jb20vJywKCQkJKSwKCQkJJ2xpbmtfZ2l0aHViJyAgICAgPT4gYXJyYXkoCgkJCQkndGl0bGUnID0+IF94KCAnR2l0SHViJywgJ1RoZW1lIHN0YXJ0ZXIgY29udGVudCcgKSwKCQkJCSd1cmwnICAgPT4gJ2h0dHBzOi8vZ2l0aHViLmNvbS93b3JkcHJlc3MvJywKCQkJKSwKCQkJJ2xpbmtfaW5zdGFncmFtJyAgPT4gYXJyYXkoCgkJCQkndGl0bGUnID0+IF94KCAnSW5zdGFncmFtJywgJ1RoZW1lIHN0YXJ0ZXIgY29udGVudCcgKSwKCQkJCSd1cmwnICAgPT4gJ2h0dHBzOi8vd3d3Lmluc3RhZ3JhbS5jb20vZXhwbG9yZS90YWdzL3dvcmRjYW1wLycsCgkJCSksCgkJCSdsaW5rX2xpbmtlZGluJyAgID0+IGFycmF5KAoJCQkJJ3RpdGxlJyA9PiBfeCggJ0xpbmtlZEluJywgJ1RoZW1lIHN0YXJ0ZXIgY29udGVudCcgKSwKCQkJCSd1cmwnICAgPT4gJ2h0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9jb21wYW55LzEwODk3ODMnLAoJCQkpLAoJCQknbGlua19waW50ZXJlc3QnICA9PiBhcnJheSgKCQkJCSd0aXRsZScgPT4gX3goICdQaW50ZXJlc3QnLCAnVGhlbWUgc3RhcnRlciBjb250ZW50JyApLAoJCQkJJ3VybCcgICA9PiAnaHR0cHM6Ly93d3cucGludGVyZXN0LmNvbS8nLAoJCQkpLAoJCQknbGlua190d2l0dGVyJyAgICA9PiBhcnJheSgKCQkJCSd0aXRsZScgPT4gX3goICdUd2l0dGVyJywgJ1RoZW1lIHN0YXJ0ZXIgY29udGVudCcgKSwKCQkJCSd1cmwnICAgPT4gJ2h0dHBzOi8vdHdpdHRlci5jb20vd29yZHByZXNzJywKCQkJKSwKCQkJJ2xpbmtfeWVscCcgICAgICAgPT4gYXJyYXkoCgkJCQkndGl0bGUnID0+IF94KCAnWWVscCcsICdUaGVtZSBzdGFydGVyIGNvbnRlbnQnICksCgkJCQkndXJsJyAgID0+ICdodHRwczovL3d3dy55ZWxwLmNvbScsCgkJCSksCgkJCSdsaW5rX3lvdXR1YmUnICAgID0+IGFycmF5KAoJCQkJJ3RpdGxlJyA9PiBfeCggJ1lvdVR1YmUnLCAnVGhlbWUgc3RhcnRlciBjb250ZW50JyApLAoJCQkJJ3VybCcgICA9PiAnaHR0cHM6Ly93d3cueW91dHViZS5jb20vY2hhbm5lbC9VQ2RvZjRKdTdhbW0xY2h6MWdpMVQyWkEnLAoJCQkpLAoJCSksCgkJJ3Bvc3RzJyAgICAgPT4gYXJyYXkoCgkJCSdob21lJyAgICAgICAgICAgICA9PiBhcnJheSgKCQkJCSdwb3N0X3R5cGUnICAgID0+ICdwYWdlJywKCQkJCSdwb3N0X3RpdGxlJyAgID0+IF94KCAnSG9tZScsICdUaGVtZSBzdGFydGVyIGNvbnRlbnQnICksCgkJCQkncG9zdF9jb250ZW50JyA9PiBzcHJpbnRmKAoJCQkJCSI8IS0tIHdwOnBhcmFncmFwaCAtLT5cbjxwPiVzPC9wPlxuPCEtLSAvd3A6cGFyYWdyYXBoIC0tPiIsCgkJCQkJX3goICdXZWxjb21lIHRvIHlvdXIgc2l0ZSEgVGhpcyBpcyB5b3VyIGhvbWVwYWdlLCB3aGljaCBpcyB3aGF0IG1vc3QgdmlzaXRvcnMgd2lsbCBzZWUgd2hlbiB0aGV5IGNvbWUgdG8geW91ciBzaXRlIGZvciB0aGUgZmlyc3QgdGltZS4nLCAnVGhlbWUgc3RhcnRlciBjb250ZW50JyApCgkJCQkpLAoJCQkpLAoJCQknYWJvdXQnICAgICAgICAgICAgPT4gYXJyYXkoCgkJCQkncG9zdF90eXBlJyAgICA9PiAncGFnZScsCgkJCQkncG9zdF90aXRsZScgICA9PiBfeCggJ0Fib3V0JywgJ1RoZW1lIHN0YXJ0ZXIgY29udGVudCcgKSwKCQkJCSdwb3N0X2NvbnRlbnQnID0+IHNwcmludGYoCgkJCQkJIjwhLS0gd3A6cGFyYWdyYXBoIC0tPlxuPHA+JXM8L3A+XG48IS0tIC93cDpwYXJhZ3JhcGggLS0+IiwKCQkJCQlfeCggJ1lvdSBtaWdodCBiZSBhbiBhcnRpc3Qgd2hvIHdvdWxkIGxpa2UgdG8gaW50cm9kdWNlIHlvdXJzZWxmIGFuZCB5b3VyIHdvcmsgaGVyZSBvciBtYXliZSB5b3UmcnNxdW87cmUgYSBidXNpbmVzcyB3aXRoIGEgbWlzc2lvbiB0byBkZXNjcmliZS4nLCAnVGhlbWUgc3RhcnRlciBjb250ZW50JyApCgkJCQkpLAoJCQkpLAoJCQknY29udGFjdCcgICAgICAgICAgPT4gYXJyYXkoCgkJCQkncG9zdF90eXBlJyAgICA9PiAncGFnZScsCgkJCQkncG9zdF90aXRsZScgICA9PiBfeCggJ0NvbnRhY3QnLCAnVGhlbWUgc3RhcnRlciBjb250ZW50JyApLAoJCQkJJ3Bvc3RfY29udGVudCcgPT4gc3ByaW50ZigKCQkJCQkiPCEtLSB3cDpwYXJhZ3JhcGggLS0+XG48cD4lczwvcD5cbjwhLS0gL3dwOnBhcmFncmFwaCAtLT4iLAoJCQkJCV94KCAnVGhpcyBpcyBhIHBhZ2Ugd2l0aCBzb21lIGJhc2ljIGNvbnRhY3QgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gYWRkcmVzcyBhbmQgcGhvbmUgbnVtYmVyLiBZb3UgbWlnaHQgYWxzbyB0cnkgYSBwbHVnaW4gdG8gYWRkIGEgY29udGFjdCBmb3JtLicsICdUaGVtZSBzdGFydGVyIGNvbnRlbnQnICkKCQkJCSksCgkJCSksCgkJCSdibG9nJyAgICAgICAgICAgICA9PiBhcnJheSgKCQkJCSdwb3N0X3R5cGUnICA9PiAncGFnZScsCgkJCQkncG9zdF90aXRsZScgPT4gX3goICdCbG9nJywgJ1RoZW1lIHN0YXJ0ZXIgY29udGVudCcgKSwKCQkJKSwKCQkJJ25ld3MnICAgICAgICAgICAgID0+IGFycmF5KAoJCQkJJ3Bvc3RfdHlwZScgID0+ICdwYWdlJywKCQkJCSdwb3N0X3RpdGxlJyA9PiBfeCggJ05ld3MnLCAnVGhlbWUgc3RhcnRlciBjb250ZW50JyApLAoJCQkpLAoKCQkJJ2hvbWVwYWdlLXNlY3Rpb24nID0+IGFycmF5KAoJCQkJJ3Bvc3RfdHlwZScgICAgPT4gJ3BhZ2UnLAoJCQkJJ3Bvc3RfdGl0bGUnICAgPT4gX3goICdBIGhvbWVwYWdlIHNlY3Rpb24nLCAnVGhlbWUgc3RhcnRlciBjb250ZW50JyApLAoJCQkJJ3Bvc3RfY29udGVudCcgPT4gc3ByaW50ZigKCQkJCQkiPCEtLSB3cDpwYXJhZ3JhcGggLS0+XG48cD4lczwvcD5cbjwhLS0gL3dwOnBhcmFncmFwaCAtLT4iLAoJCQkJCV94KCAnVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgaG9tZXBhZ2Ugc2VjdGlvbi4gSG9tZXBhZ2Ugc2VjdGlvbnMgY2FuIGJlIGFueSBwYWdlIG90aGVyIHRoYW4gdGhlIGhvbWVwYWdlIGl0c2VsZiwgaW5jbHVkaW5nIHRoZSBwYWdlIHRoYXQgc2hvd3MgeW91ciBsYXRlc3QgYmxvZyBwb3N0cy4nLCAnVGhlbWUgc3RhcnRlciBjb250ZW50JyApCgkJCQkpLAoJCQkpLAoJCSksCgkpOwoKCSRjb250ZW50ID0gYXJyYXkoKTsKCglmb3JlYWNoICggJGNvbmZpZyBhcyAkdHlwZSA9PiAkYXJncyApIHsKCQlzd2l0Y2ggKCAkdHlwZSApIHsKCQkJLy8gVXNlIG9wdGlvbnMgYW5kIHRoZW1lX21vZHMgYXMtaXMuCgkJCWNhc2UgJ29wdGlvbnMnOgoJCQljYXNlICd0aGVtZV9tb2RzJzoKCQkJCSRjb250ZW50WyAkdHlwZSBdID0gJGNvbmZpZ1sgJHR5cGUgXTsKCQkJCWJyZWFrOwoKCQkJLy8gV2lkZ2V0cyBhcmUgZ3JvdXBlZCBpbnRvIHNpZGViYXJzLgoJCQljYXNlICd3aWRnZXRzJzoKCQkJCWZvcmVhY2ggKCAkY29uZmlnWyAkdHlwZSBdIGFzICRzaWRlYmFyX2lkID0+ICR3aWRnZXRzICkgewoJCQkJCWZvcmVhY2ggKCAkd2lkZ2V0cyBhcyAkaWQgPT4gJHdpZGdldCApIHsKCQkJCQkJaWYgKCBpc19hcnJheSggJHdpZGdldCApICkgewoKCQkJCQkJCS8vIEl0ZW0gZXh0ZW5kcyBjb3JlIGNvbnRlbnQuCgkJCQkJCQlpZiAoICEgZW1wdHkoICRjb3JlX2NvbnRlbnRbICR0eXBlIF1bICRpZCBdICkgKSB7CgkJCQkJCQkJJHdpZGdldCA9IGFycmF5KAoJCQkJCQkJCQkkY29yZV9jb250ZW50WyAkdHlwZSBdWyAkaWQgXVswXSwKCQkJCQkJCQkJYXJyYXlfbWVyZ2UoICRjb3JlX2NvbnRlbnRbICR0eXBlIF1bICRpZCBdWzFdLCAkd2lkZ2V0ICksCgkJCQkJCQkJKTsKCQkJCQkJCX0KCgkJCQkJCQkkY29udGVudFsgJHR5cGUgXVsgJHNpZGViYXJfaWQgXVtdID0gJHdpZGdldDsKCQkJCQkJfSBlbHNlaWYgKCBpc19zdHJpbmcoICR3aWRnZXQgKQoJCQkJCQkJJiYgISBlbXB0eSggJGNvcmVfY29udGVudFsgJHR5cGUgXSApCgkJCQkJCQkmJiAhIGVtcHR5KCAkY29yZV9jb250ZW50WyAkdHlwZSBdWyAkd2lkZ2V0IF0gKQoJCQkJCQkpIHsKCQkJCQkJCSRjb250ZW50WyAkdHlwZSBdWyAkc2lkZWJhcl9pZCBdW10gPSAkY29yZV9jb250ZW50WyAkdHlwZSBdWyAkd2lkZ2V0IF07CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQlicmVhazsKCgkJCS8vIEFuZCBuYXYgbWVudSBpdGVtcyBhcmUgZ3JvdXBlZCBpbnRvIG5hdiBtZW51cy4KCQkJY2FzZSAnbmF2X21lbnVzJzoKCQkJCWZvcmVhY2ggKCAkY29uZmlnWyAkdHlwZSBdIGFzICRuYXZfbWVudV9sb2NhdGlvbiA9PiAkbmF2X21lbnUgKSB7CgoJCQkJCS8vIEVuc3VyZSBuYXYgbWVudXMgZ2V0IGEgbmFtZS4KCQkJCQlpZiAoIGVtcHR5KCAkbmF2X21lbnVbJ25hbWUnXSApICkgewoJCQkJCQkkbmF2X21lbnVbJ25hbWUnXSA9ICRuYXZfbWVudV9sb2NhdGlvbjsKCQkJCQl9CgoJCQkJCSRjb250ZW50WyAkdHlwZSBdWyAkbmF2X21lbnVfbG9jYXRpb24gXVsnbmFtZSddID0gJG5hdl9tZW51WyduYW1lJ107CgoJCQkJCWZvcmVhY2ggKCAkbmF2X21lbnVbJ2l0ZW1zJ10gYXMgJGlkID0+ICRuYXZfbWVudV9pdGVtICkgewoJCQkJCQlpZiAoIGlzX2FycmF5KCAkbmF2X21lbnVfaXRlbSApICkgewoKCQkJCQkJCS8vIEl0ZW0gZXh0ZW5kcyBjb3JlIGNvbnRlbnQuCgkJCQkJCQlpZiAoICEgZW1wdHkoICRjb3JlX2NvbnRlbnRbICR0eXBlIF1bICRpZCBdICkgKSB7CgkJCQkJCQkJJG5hdl9tZW51X2l0ZW0gPSBhcnJheV9tZXJnZSggJGNvcmVfY29udGVudFsgJHR5cGUgXVsgJGlkIF0sICRuYXZfbWVudV9pdGVtICk7CgkJCQkJCQl9CgoJCQkJCQkJJGNvbnRlbnRbICR0eXBlIF1bICRuYXZfbWVudV9sb2NhdGlvbiBdWydpdGVtcyddW10gPSAkbmF2X21lbnVfaXRlbTsKCQkJCQkJfSBlbHNlaWYgKCBpc19zdHJpbmcoICRuYXZfbWVudV9pdGVtICkKCQkJCQkJCSYmICEgZW1wdHkoICRjb3JlX2NvbnRlbnRbICR0eXBlIF0gKQoJCQkJCQkJJiYgISBlbXB0eSggJGNvcmVfY29udGVudFsgJHR5cGUgXVsgJG5hdl9tZW51X2l0ZW0gXSApCgkJCQkJCSkgewoJCQkJCQkJJGNvbnRlbnRbICR0eXBlIF1bICRuYXZfbWVudV9sb2NhdGlvbiBdWydpdGVtcyddW10gPSAkY29yZV9jb250ZW50WyAkdHlwZSBdWyAkbmF2X21lbnVfaXRlbSBdOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJYnJlYWs7CgoJCQkvLyBBdHRhY2htZW50cyBhcmUgcG9zdHMgYnV0IGhhdmUgc3BlY2lhbCB0cmVhdG1lbnQuCgkJCWNhc2UgJ2F0dGFjaG1lbnRzJzoKCQkJCWZvcmVhY2ggKCAkY29uZmlnWyAkdHlwZSBdIGFzICRpZCA9PiAkaXRlbSApIHsKCQkJCQlpZiAoICEgZW1wdHkoICRpdGVtWydmaWxlJ10gKSApIHsKCQkJCQkJJGNvbnRlbnRbICR0eXBlIF1bICRpZCBdID0gJGl0ZW07CgkJCQkJfQoJCQkJfQoJCQkJYnJlYWs7CgoJCQkvLyBBbGwgdGhhdCdzIGxlZnQgbm93IGFyZSBwb3N0cyAoYmVzaWRlcyBhdHRhY2htZW50cykuCgkJCS8vIE5vdCBhIGRlZmF1bHQgY2FzZSBmb3IgdGhlIHNha2Ugb2YgY2xhcml0eSBhbmQgZnV0dXJlIHdvcmsuCgkJCWNhc2UgJ3Bvc3RzJzoKCQkJCWZvcmVhY2ggKCAkY29uZmlnWyAkdHlwZSBdIGFzICRpZCA9PiAkaXRlbSApIHsKCQkJCQlpZiAoIGlzX2FycmF5KCAkaXRlbSApICkgewoKCQkJCQkJLy8gSXRlbSBleHRlbmRzIGNvcmUgY29udGVudC4KCQkJCQkJaWYgKCAhIGVtcHR5KCAkY29yZV9jb250ZW50WyAkdHlwZSBdWyAkaWQgXSApICkgewoJCQkJCQkJJGl0ZW0gPSBhcnJheV9tZXJnZSggJGNvcmVfY29udGVudFsgJHR5cGUgXVsgJGlkIF0sICRpdGVtICk7CgkJCQkJCX0KCgkJCQkJCS8vIEVuZm9yY2UgYSBzdWJzZXQgb2YgZmllbGRzLgoJCQkJCQkkY29udGVudFsgJHR5cGUgXVsgJGlkIF0gPSB3cF9hcnJheV9zbGljZV9hc3NvYygKCQkJCQkJCSRpdGVtLAoJCQkJCQkJYXJyYXkoCgkJCQkJCQkJJ3Bvc3RfdHlwZScsCgkJCQkJCQkJJ3Bvc3RfdGl0bGUnLAoJCQkJCQkJCSdwb3N0X2V4Y2VycHQnLAoJCQkJCQkJCSdwb3N0X25hbWUnLAoJCQkJCQkJCSdwb3N0X2NvbnRlbnQnLAoJCQkJCQkJCSdtZW51X29yZGVyJywKCQkJCQkJCQknY29tbWVudF9zdGF0dXMnLAoJCQkJCQkJCSd0aHVtYm5haWwnLAoJCQkJCQkJCSd0ZW1wbGF0ZScsCgkJCQkJCQkpCgkJCQkJCSk7CgkJCQkJfSBlbHNlaWYgKCBpc19zdHJpbmcoICRpdGVtICkgJiYgISBlbXB0eSggJGNvcmVfY29udGVudFsgJHR5cGUgXVsgJGl0ZW0gXSApICkgewoJCQkJCQkkY29udGVudFsgJHR5cGUgXVsgJGl0ZW0gXSA9ICRjb3JlX2NvbnRlbnRbICR0eXBlIF1bICRpdGVtIF07CgkJCQkJfQoJCQkJfQoJCQkJYnJlYWs7CgkJfQoJfQoKCS8qKgoJICogRmlsdGVycyB0aGUgZXhwYW5kZWQgYXJyYXkgb2Ygc3RhcnRlciBjb250ZW50LgoJICoKCSAqIEBzaW5jZSA0LjcuMAoJICoKCSAqIEBwYXJhbSBhcnJheSAkY29udGVudCBBcnJheSBvZiBzdGFydGVyIGNvbnRlbnQuCgkgKiBAcGFyYW0gYXJyYXkgJGNvbmZpZyAgQXJyYXkgb2YgdGhlbWUtc3BlY2lmaWMgc3RhcnRlciBjb250ZW50IGNvbmZpZ3VyYXRpb24uCgkgKi8KCXJldHVybiBhcHBseV9maWx0ZXJzKCAnZ2V0X3RoZW1lX3N0YXJ0ZXJfY29udGVudCcsICRjb250ZW50LCAkY29uZmlnICk7Cn0KCi8qKgogKiBSZWdpc3RlcnMgdGhlbWUgc3VwcG9ydCBmb3IgYSBnaXZlbiBmZWF0dXJlLgogKgogKiBNdXN0IGJlIGNhbGxlZCBpbiB0aGUgdGhlbWUncyBmdW5jdGlvbnMucGhwIGZpbGUgdG8gd29yay4KICogSWYgYXR0YWNoZWQgdG8gYSBob29rLCBpdCBtdXN0IGJlIHtAc2VlICdhZnRlcl9zZXR1cF90aGVtZSd9LgogKiBUaGUge0BzZWUgJ2luaXQnfSBob29rIG1heSBiZSB0b28gbGF0ZSBmb3Igc29tZSBmZWF0dXJlcy4KICoKICogRXhhbXBsZSB1c2FnZToKICoKICogICAgIGFkZF90aGVtZV9zdXBwb3J0KCAndGl0bGUtdGFnJyApOwogKiAgICAgYWRkX3RoZW1lX3N1cHBvcnQoICdjdXN0b20tbG9nbycsIGFycmF5KAogKiAgICAgICAgICdoZWlnaHQnID0+IDQ4MCwKICogICAgICAgICAnd2lkdGgnICA9PiA3MjAsCiAqICAgICApICk7CiAqCiAqIEBzaW5jZSAyLjkuMAogKiBAc2luY2UgMy40LjAgVGhlIGBjdXN0b20taGVhZGVyLXVwbG9hZHNgIGZlYXR1cmUgd2FzIGRlcHJlY2F0ZWQuCiAqIEBzaW5jZSAzLjYuMCBUaGUgYGh0bWw1YCBmZWF0dXJlIHdhcyBhZGRlZC4KICogQHNpbmNlIDMuOS4wIFRoZSBgaHRtbDVgIGZlYXR1cmUgbm93IGFsc28gYWNjZXB0cyAnZ2FsbGVyeScgYW5kICdjYXB0aW9uJy4KICogQHNpbmNlIDQuMS4wIFRoZSBgdGl0bGUtdGFnYCBmZWF0dXJlIHdhcyBhZGRlZC4KICogQHNpbmNlIDQuNS4wIFRoZSBgY3VzdG9taXplLXNlbGVjdGl2ZS1yZWZyZXNoLXdpZGdldHNgIGZlYXR1cmUgd2FzIGFkZGVkLgogKiBAc2luY2UgNC43LjAgVGhlIGBzdGFydGVyLWNvbnRlbnRgIGZlYXR1cmUgd2FzIGFkZGVkLgogKiBAc2luY2UgNS4wLjAgVGhlIGByZXNwb25zaXZlLWVtYmVkc2AsIGBhbGlnbi13aWRlYCwgYGRhcmstZWRpdG9yLXN0eWxlYCwgYGRpc2FibGUtY3VzdG9tLWNvbG9yc2AsCiAqICAgICAgICAgICAgICBgZGlzYWJsZS1jdXN0b20tZm9udC1zaXplc2AsIGBlZGl0b3ItY29sb3ItcGFsZXR0ZWAsIGBlZGl0b3ItZm9udC1zaXplc2AsCiAqICAgICAgICAgICAgICBgZWRpdG9yLXN0eWxlc2AsIGFuZCBgd3AtYmxvY2stc3R5bGVzYCBmZWF0dXJlcyB3ZXJlIGFkZGVkLgogKiBAc2luY2UgNS4zLjAgVGhlIGBodG1sNWAgZmVhdHVyZSBub3cgYWxzbyBhY2NlcHRzICdzY3JpcHQnIGFuZCAnc3R5bGUnLgogKiBAc2luY2UgNS4zLjAgRm9ybWFsaXplZCB0aGUgZXhpc3RpbmcgYW5kIGFscmVhZHkgZG9jdW1lbnRlZCBgLi4uJGFyZ3NgIHBhcmFtZXRlcgogKiAgICAgICAgICAgICAgYnkgYWRkaW5nIGl0IHRvIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUuCiAqIEBzaW5jZSA1LjUuMCBUaGUgYGNvcmUtYmxvY2stcGF0dGVybnNgIGZlYXR1cmUgd2FzIGFkZGVkIGFuZCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCiAqIEBzaW5jZSA1LjUuMCBUaGUgYGN1c3RvbS1sb2dvYCBmZWF0dXJlIG5vdyBhbHNvIGFjY2VwdHMgJ3VubGluay1ob21lcGFnZS1sb2dvJy4KICogQHNpbmNlIDUuNi4wIFRoZSBgcG9zdC1mb3JtYXRzYCBmZWF0dXJlIHdhcm5zIGlmIG5vIGFycmF5IGlzIHBhc3NlZC4KICogQHNpbmNlIDUuOC4wIFRoZSBgd2lkZ2V0cy1ibG9jay1lZGl0b3JgIGZlYXR1cmUgZW5hYmxlcyB0aGUgV2lkZ2V0cyBibG9jayBlZGl0b3IuCiAqCiAqIEBnbG9iYWwgYXJyYXkgJF93cF90aGVtZV9mZWF0dXJlcwogKgogKiBAcGFyYW0gc3RyaW5nICRmZWF0dXJlIFRoZSBmZWF0dXJlIGJlaW5nIGFkZGVkLiBMaWtlbHkgY29yZSB2YWx1ZXMgaW5jbHVkZToKICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gJ2FkbWluLWJhcicKICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gJ2FsaWduLXdpZGUnCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAtICdhdXRvbWF0aWMtZmVlZC1saW5rcycKICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gJ2NvcmUtYmxvY2stcGF0dGVybnMnCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAtICdjdXN0b20tYmFja2dyb3VuZCcKICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gJ2N1c3RvbS1oZWFkZXInCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAtICdjdXN0b20tbGluZS1oZWlnaHQnCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAtICdjdXN0b20tbG9nbycKICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gJ2N1c3RvbWl6ZS1zZWxlY3RpdmUtcmVmcmVzaC13aWRnZXRzJwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSAnY3VzdG9tLXNwYWNpbmcnCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAtICdjdXN0b20tdW5pdHMnCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAtICdkYXJrLWVkaXRvci1zdHlsZScKICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gJ2Rpc2FibGUtY3VzdG9tLWNvbG9ycycKICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gJ2Rpc2FibGUtY3VzdG9tLWZvbnQtc2l6ZXMnCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAtICdlZGl0b3ItY29sb3ItcGFsZXR0ZScKICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gJ2VkaXRvci1ncmFkaWVudC1wcmVzZXRzJwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSAnZWRpdG9yLWZvbnQtc2l6ZXMnCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAtICdlZGl0b3Itc3R5bGVzJwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSAnZmVhdHVyZWQtY29udGVudCcKICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gJ2h0bWw1JwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSAnbWVudXMnCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAtICdwb3N0LWZvcm1hdHMnCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAtICdwb3N0LXRodW1ibmFpbHMnCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAtICdyZXNwb25zaXZlLWVtYmVkcycKICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gJ3N0YXJ0ZXItY29udGVudCcKICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gJ3RpdGxlLXRhZycKICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gJ3dwLWJsb2NrLXN0eWxlcycKICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gJ3dpZGdldHMnCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAtICd3aWRnZXRzLWJsb2NrLWVkaXRvcicKICogQHBhcmFtIG1peGVkICAuLi4kYXJncyBPcHRpb25hbCBleHRyYSBhcmd1bWVudHMgdG8gcGFzcyBhbG9uZyB3aXRoIGNlcnRhaW4gZmVhdHVyZXMuCiAqIEByZXR1cm4gdm9pZHxmYWxzZSBWb2lkIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuCiAqLwpmdW5jdGlvbiBhZGRfdGhlbWVfc3VwcG9ydCggJGZlYXR1cmUsIC4uLiRhcmdzICkgewoJZ2xvYmFsICRfd3BfdGhlbWVfZmVhdHVyZXM7CgoJaWYgKCAhICRhcmdzICkgewoJCSRhcmdzID0gdHJ1ZTsKCX0KCglzd2l0Y2ggKCAkZmVhdHVyZSApIHsKCQljYXNlICdwb3N0LXRodW1ibmFpbHMnOgoJCQkvLyBBbGwgcG9zdCB0eXBlcyBhcmUgYWxyZWFkeSBzdXBwb3J0ZWQuCgkJCWlmICggdHJ1ZSA9PT0gZ2V0X3RoZW1lX3N1cHBvcnQoICdwb3N0LXRodW1ibmFpbHMnICkgKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCS8qCgkJCSAqIE1lcmdlIHBvc3QgdHlwZXMgd2l0aCBhbnkgdGhhdCBhbHJlYWR5IGRlY2xhcmVkIHRoZWlyIHN1cHBvcnQKCQkJICogZm9yIHBvc3QgdGh1bWJuYWlscy4KCQkJICovCgkJCWlmICggaXNzZXQoICRhcmdzWzBdICkgJiYgaXNfYXJyYXkoICRhcmdzWzBdICkgJiYgaXNzZXQoICRfd3BfdGhlbWVfZmVhdHVyZXNbJ3Bvc3QtdGh1bWJuYWlscyddICkgKSB7CgkJCQkkYXJnc1swXSA9IGFycmF5X3VuaXF1ZSggYXJyYXlfbWVyZ2UoICRfd3BfdGhlbWVfZmVhdHVyZXNbJ3Bvc3QtdGh1bWJuYWlscyddWzBdLCAkYXJnc1swXSApICk7CgkJCX0KCgkJCWJyZWFrOwoKCQljYXNlICdwb3N0LWZvcm1hdHMnOgoJCQlpZiAoIGlzc2V0KCAkYXJnc1swXSApICYmIGlzX2FycmF5KCAkYXJnc1swXSApICkgewoJCQkJJHBvc3RfZm9ybWF0cyA9IGdldF9wb3N0X2Zvcm1hdF9zbHVncygpOwoJCQkJdW5zZXQoICRwb3N0X2Zvcm1hdHNbJ3N0YW5kYXJkJ10gKTsKCgkJCQkkYXJnc1swXSA9IGFycmF5X2ludGVyc2VjdCggJGFyZ3NbMF0sIGFycmF5X2tleXMoICRwb3N0X2Zvcm1hdHMgKSApOwoJCQl9IGVsc2UgewoJCQkJX2RvaW5nX2l0X3dyb25nKAoJCQkJCSJhZGRfdGhlbWVfc3VwcG9ydCggJ3Bvc3QtZm9ybWF0cycgKSIsCgkJCQkJX18oICdZb3UgbmVlZCB0byBwYXNzIGFuIGFycmF5IG9mIHBvc3QgZm9ybWF0cy4nICksCgkJCQkJJzUuNi4wJwoJCQkJKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQlicmVhazsKCgkJY2FzZSAnaHRtbDUnOgoJCQkvLyBZb3UgY2FuJ3QganVzdCBwYXNzICdodG1sNScsIHlvdSBuZWVkIHRvIHBhc3MgYW4gYXJyYXkgb2YgdHlwZXMuCgkJCWlmICggZW1wdHkoICRhcmdzWzBdICkgfHwgISBpc19hcnJheSggJGFyZ3NbMF0gKSApIHsKCQkJCV9kb2luZ19pdF93cm9uZygKCQkJCQkiYWRkX3RoZW1lX3N1cHBvcnQoICdodG1sNScgKSIsCgkJCQkJX18oICdZb3UgbmVlZCB0byBwYXNzIGFuIGFycmF5IG9mIHR5cGVzLicgKSwKCQkJCQknMy42LjEnCgkJCQkpOwoKCQkJCWlmICggISBlbXB0eSggJGFyZ3NbMF0gKSAmJiAhIGlzX2FycmF5KCAkYXJnc1swXSApICkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCgkJCQkvLyBCdWlsZCBhbiBhcnJheSBvZiB0eXBlcyBmb3IgYmFjay1jb21wYXQuCgkJCQkkYXJncyA9IGFycmF5KCAwID0+IGFycmF5KCAnY29tbWVudC1saXN0JywgJ2NvbW1lbnQtZm9ybScsICdzZWFyY2gtZm9ybScgKSApOwoJCQl9CgoJCQkvLyBDYWxsaW5nICdodG1sNScgYWdhaW4gbWVyZ2VzLCByYXRoZXIgdGhhbiBvdmVyd3JpdGVzLgoJCQlpZiAoIGlzc2V0KCAkX3dwX3RoZW1lX2ZlYXR1cmVzWydodG1sNSddICkgKSB7CgkJCQkkYXJnc1swXSA9IGFycmF5X21lcmdlKCAkX3dwX3RoZW1lX2ZlYXR1cmVzWydodG1sNSddWzBdLCAkYXJnc1swXSApOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlICdjdXN0b20tbG9nbyc6CgkJCWlmICggdHJ1ZSA9PT0gJGFyZ3MgKSB7CgkJCQkkYXJncyA9IGFycmF5KCAwID0+IGFycmF5KCkgKTsKCQkJfQoJCQkkZGVmYXVsdHMgPSBhcnJheSgKCQkJCSd3aWR0aCcgICAgICAgICAgICAgICAgPT4gbnVsbCwKCQkJCSdoZWlnaHQnICAgICAgICAgICAgICAgPT4gbnVsbCwKCQkJCSdmbGV4LXdpZHRoJyAgICAgICAgICAgPT4gZmFsc2UsCgkJCQknZmxleC1oZWlnaHQnICAgICAgICAgID0+IGZhbHNlLAoJCQkJJ2hlYWRlci10ZXh0JyAgICAgICAgICA9PiAnJywKCQkJCSd1bmxpbmstaG9tZXBhZ2UtbG9nbycgPT4gZmFsc2UsCgkJCSk7CgkJCSRhcmdzWzBdICA9IHdwX3BhcnNlX2FyZ3MoIGFycmF5X2ludGVyc2VjdF9rZXkoICRhcmdzWzBdLCAkZGVmYXVsdHMgKSwgJGRlZmF1bHRzICk7CgoJCQkvLyBBbGxvdyBmdWxsIGZsZXhpYmlsaXR5IGlmIG5vIHNpemUgaXMgc3BlY2lmaWVkLgoJCQlpZiAoIGlzX251bGwoICRhcmdzWzBdWyd3aWR0aCddICkgJiYgaXNfbnVsbCggJGFyZ3NbMF1bJ2hlaWdodCddICkgKSB7CgkJCQkkYXJnc1swXVsnZmxleC13aWR0aCddICA9IHRydWU7CgkJCQkkYXJnc1swXVsnZmxleC1oZWlnaHQnXSA9IHRydWU7CgkJCX0KCQkJYnJlYWs7CgoJCWNhc2UgJ2N1c3RvbS1oZWFkZXItdXBsb2Fkcyc6CgkJCXJldHVybiBhZGRfdGhlbWVfc3VwcG9ydCggJ2N1c3RvbS1oZWFkZXInLCBhcnJheSggJ3VwbG9hZHMnID0+IHRydWUgKSApOwoKCQljYXNlICdjdXN0b20taGVhZGVyJzoKCQkJaWYgKCB0cnVlID09PSAkYXJncyApIHsKCQkJCSRhcmdzID0gYXJyYXkoIDAgPT4gYXJyYXkoKSApOwoJCQl9CgoJCQkkZGVmYXVsdHMgPSBhcnJheSgKCQkJCSdkZWZhdWx0LWltYWdlJyAgICAgICAgICA9PiAnJywKCQkJCSdyYW5kb20tZGVmYXVsdCcgICAgICAgICA9PiBmYWxzZSwKCQkJCSd3aWR0aCcgICAgICAgICAgICAgICAgICA9PiAwLAoJCQkJJ2hlaWdodCcgICAgICAgICAgICAgICAgID0+IDAsCgkJCQknZmxleC1oZWlnaHQnICAgICAgICAgICAgPT4gZmFsc2UsCgkJCQknZmxleC13aWR0aCcgICAgICAgICAgICAgPT4gZmFsc2UsCgkJCQknZGVmYXVsdC10ZXh0LWNvbG9yJyAgICAgPT4gJycsCgkJCQknaGVhZGVyLXRleHQnICAgICAgICAgICAgPT4gdHJ1ZSwKCQkJCSd1cGxvYWRzJyAgICAgICAgICAgICAgICA9PiB0cnVlLAoJCQkJJ3dwLWhlYWQtY2FsbGJhY2snICAgICAgID0+ICcnLAoJCQkJJ2FkbWluLWhlYWQtY2FsbGJhY2snICAgID0+ICcnLAoJCQkJJ2FkbWluLXByZXZpZXctY2FsbGJhY2snID0+ICcnLAoJCQkJJ3ZpZGVvJyAgICAgICAgICAgICAgICAgID0+IGZhbHNlLAoJCQkJJ3ZpZGVvLWFjdGl2ZS1jYWxsYmFjaycgID0+ICdpc19mcm9udF9wYWdlJywKCQkJKTsKCgkJCSRqaXQgPSBpc3NldCggJGFyZ3NbMF1bJ19faml0J10gKTsKCQkJdW5zZXQoICRhcmdzWzBdWydfX2ppdCddICk7CgoJCQkvLyBNZXJnZSBpbiBkYXRhIGZyb20gcHJldmlvdXMgYWRkX3RoZW1lX3N1cHBvcnQoKSBjYWxscy4KCQkJLy8gVGhlIGZpcnN0IHZhbHVlIHJlZ2lzdGVyZWQgd2lucy4gKEEgY2hpbGQgdGhlbWUgaXMgc2V0IHVwIGZpcnN0LikKCQkJaWYgKCBpc3NldCggJF93cF90aGVtZV9mZWF0dXJlc1snY3VzdG9tLWhlYWRlciddICkgKSB7CgkJCQkkYXJnc1swXSA9IHdwX3BhcnNlX2FyZ3MoICRfd3BfdGhlbWVfZmVhdHVyZXNbJ2N1c3RvbS1oZWFkZXInXVswXSwgJGFyZ3NbMF0gKTsKCQkJfQoKCQkJLy8gTG9hZCBpbiB0aGUgZGVmYXVsdHMgYXQgdGhlIGVuZCwgYXMgd2UgbmVlZCB0byBpbnN1cmUgZmlyc3Qgb25lIHdpbnMuCgkJCS8vIFRoaXMgd2lsbCBjYXVzZSBhbGwgY29uc3RhbnRzIHRvIGJlIGRlZmluZWQsIGFzIGVhY2ggYXJnIHdpbGwgdGhlbiBiZSBzZXQgdG8gdGhlIGRlZmF1bHQuCgkJCWlmICggJGppdCApIHsKCQkJCSRhcmdzWzBdID0gd3BfcGFyc2VfYXJncyggJGFyZ3NbMF0sICRkZWZhdWx0cyApOwoJCQl9CgoJCQkvKgoJCQkgKiBJZiBhIGNvbnN0YW50IHdhcyBkZWZpbmVkLCB1c2UgdGhhdCB2YWx1ZS4gT3RoZXJ3aXNlLCBkZWZpbmUgdGhlIGNvbnN0YW50IHRvIGVuc3VyZQoJCQkgKiB0aGUgY29uc3RhbnQgaXMgYWx3YXlzIGFjY3VyYXRlIChhbmQgaXMgbm90IGRlZmluZWQgbGF0ZXIsICBvdmVycmlkaW5nIG91ciB2YWx1ZSkuCgkJCSAqIEFzIHN0YXRlZCBhYm92ZSwgdGhlIGZpcnN0IHZhbHVlIHdpbnMuCgkJCSAqIE9uY2Ugd2UgZ2V0IHRvIHdwX2xvYWRlZCAoanVzdC1pbi10aW1lKSwgZGVmaW5lIGFueSBjb25zdGFudHMgd2UgaGF2ZW4ndCBhbHJlYWR5LgoJCQkgKiBDb25zdGFudHMgYXJlIGxhbWUuIERvbid0IHJlZmVyZW5jZSB0aGVtLiBUaGlzIGlzIGp1c3QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCgkJCSAqLwoKCQkJaWYgKCBkZWZpbmVkKCAnTk9fSEVBREVSX1RFWFQnICkgKSB7CgkJCQkkYXJnc1swXVsnaGVhZGVyLXRleHQnXSA9ICEgTk9fSEVBREVSX1RFWFQ7CgkJCX0gZWxzZWlmICggaXNzZXQoICRhcmdzWzBdWydoZWFkZXItdGV4dCddICkgKSB7CgkJCQlkZWZpbmUoICdOT19IRUFERVJfVEVYVCcsIGVtcHR5KCAkYXJnc1swXVsnaGVhZGVyLXRleHQnXSApICk7CgkJCX0KCgkJCWlmICggZGVmaW5lZCggJ0hFQURFUl9JTUFHRV9XSURUSCcgKSApIHsKCQkJCSRhcmdzWzBdWyd3aWR0aCddID0gKGludCkgSEVBREVSX0lNQUdFX1dJRFRIOwoJCQl9IGVsc2VpZiAoIGlzc2V0KCAkYXJnc1swXVsnd2lkdGgnXSApICkgewoJCQkJZGVmaW5lKCAnSEVBREVSX0lNQUdFX1dJRFRIJywgKGludCkgJGFyZ3NbMF1bJ3dpZHRoJ10gKTsKCQkJfQoKCQkJaWYgKCBkZWZpbmVkKCAnSEVBREVSX0lNQUdFX0hFSUdIVCcgKSApIHsKCQkJCSRhcmdzWzBdWydoZWlnaHQnXSA9IChpbnQpIEhFQURFUl9JTUFHRV9IRUlHSFQ7CgkJCX0gZWxzZWlmICggaXNzZXQoICRhcmdzWzBdWydoZWlnaHQnXSApICkgewoJCQkJZGVmaW5lKCAnSEVBREVSX0lNQUdFX0hFSUdIVCcsIChpbnQpICRhcmdzWzBdWydoZWlnaHQnXSApOwoJCQl9CgoJCQlpZiAoIGRlZmluZWQoICdIRUFERVJfVEVYVENPTE9SJyApICkgewoJCQkJJGFyZ3NbMF1bJ2RlZmF1bHQtdGV4dC1jb2xvciddID0gSEVBREVSX1RFWFRDT0xPUjsKCQkJfSBlbHNlaWYgKCBpc3NldCggJGFyZ3NbMF1bJ2RlZmF1bHQtdGV4dC1jb2xvciddICkgKSB7CgkJCQlkZWZpbmUoICdIRUFERVJfVEVYVENPTE9SJywgJGFyZ3NbMF1bJ2RlZmF1bHQtdGV4dC1jb2xvciddICk7CgkJCX0KCgkJCWlmICggZGVmaW5lZCggJ0hFQURFUl9JTUFHRScgKSApIHsKCQkJCSRhcmdzWzBdWydkZWZhdWx0LWltYWdlJ10gPSBIRUFERVJfSU1BR0U7CgkJCX0gZWxzZWlmICggaXNzZXQoICRhcmdzWzBdWydkZWZhdWx0LWltYWdlJ10gKSApIHsKCQkJCWRlZmluZSggJ0hFQURFUl9JTUFHRScsICRhcmdzWzBdWydkZWZhdWx0LWltYWdlJ10gKTsKCQkJfQoKCQkJaWYgKCAkaml0ICYmICEgZW1wdHkoICRhcmdzWzBdWydkZWZhdWx0LWltYWdlJ10gKSApIHsKCQkJCSRhcmdzWzBdWydyYW5kb20tZGVmYXVsdCddID0gZmFsc2U7CgkJCX0KCgkJCS8vIElmIGhlYWRlcnMgYXJlIHN1cHBvcnRlZCwgYW5kIHdlIHN0aWxsIGRvbid0IGhhdmUgYSBkZWZpbmVkIHdpZHRoIG9yIGhlaWdodCwKCQkJLy8gd2UgaGF2ZSBpbXBsaWNpdCBmbGV4IHNpemVzLgoJCQlpZiAoICRqaXQgKSB7CgkJCQlpZiAoIGVtcHR5KCAkYXJnc1swXVsnd2lkdGgnXSApICYmIGVtcHR5KCAkYXJnc1swXVsnZmxleC13aWR0aCddICkgKSB7CgkJCQkJJGFyZ3NbMF1bJ2ZsZXgtd2lkdGgnXSA9IHRydWU7CgkJCQl9CgkJCQlpZiAoIGVtcHR5KCAkYXJnc1swXVsnaGVpZ2h0J10gKSAmJiBlbXB0eSggJGFyZ3NbMF1bJ2ZsZXgtaGVpZ2h0J10gKSApIHsKCQkJCQkkYXJnc1swXVsnZmxleC1oZWlnaHQnXSA9IHRydWU7CgkJCQl9CgkJCX0KCgkJCWJyZWFrOwoKCQljYXNlICdjdXN0b20tYmFja2dyb3VuZCc6CgkJCWlmICggdHJ1ZSA9PT0gJGFyZ3MgKSB7CgkJCQkkYXJncyA9IGFycmF5KCAwID0+IGFycmF5KCkgKTsKCQkJfQoKCQkJJGRlZmF1bHRzID0gYXJyYXkoCgkJCQknZGVmYXVsdC1pbWFnZScgICAgICAgICAgPT4gJycsCgkJCQknZGVmYXVsdC1wcmVzZXQnICAgICAgICAgPT4gJ2RlZmF1bHQnLAoJCQkJJ2RlZmF1bHQtcG9zaXRpb24teCcgICAgID0+ICdsZWZ0JywKCQkJCSdkZWZhdWx0LXBvc2l0aW9uLXknICAgICA9PiAndG9wJywKCQkJCSdkZWZhdWx0LXNpemUnICAgICAgICAgICA9PiAnYXV0bycsCgkJCQknZGVmYXVsdC1yZXBlYXQnICAgICAgICAgPT4gJ3JlcGVhdCcsCgkJCQknZGVmYXVsdC1hdHRhY2htZW50JyAgICAgPT4gJ3Njcm9sbCcsCgkJCQknZGVmYXVsdC1jb2xvcicgICAgICAgICAgPT4gJycsCgkJCQknd3AtaGVhZC1jYWxsYmFjaycgICAgICAgPT4gJ19jdXN0b21fYmFja2dyb3VuZF9jYicsCgkJCQknYWRtaW4taGVhZC1jYWxsYmFjaycgICAgPT4gJycsCgkJCQknYWRtaW4tcHJldmlldy1jYWxsYmFjaycgPT4gJycsCgkJCSk7CgoJCQkkaml0ID0gaXNzZXQoICRhcmdzWzBdWydfX2ppdCddICk7CgkJCXVuc2V0KCAkYXJnc1swXVsnX19qaXQnXSApOwoKCQkJLy8gTWVyZ2UgaW4gZGF0YSBmcm9tIHByZXZpb3VzIGFkZF90aGVtZV9zdXBwb3J0KCkgY2FsbHMuIFRoZSBmaXJzdCB2YWx1ZSByZWdpc3RlcmVkIHdpbnMuCgkJCWlmICggaXNzZXQoICRfd3BfdGhlbWVfZmVhdHVyZXNbJ2N1c3RvbS1iYWNrZ3JvdW5kJ10gKSApIHsKCQkJCSRhcmdzWzBdID0gd3BfcGFyc2VfYXJncyggJF93cF90aGVtZV9mZWF0dXJlc1snY3VzdG9tLWJhY2tncm91bmQnXVswXSwgJGFyZ3NbMF0gKTsKCQkJfQoKCQkJaWYgKCAkaml0ICkgewoJCQkJJGFyZ3NbMF0gPSB3cF9wYXJzZV9hcmdzKCAkYXJnc1swXSwgJGRlZmF1bHRzICk7CgkJCX0KCgkJCWlmICggZGVmaW5lZCggJ0JBQ0tHUk9VTkRfQ09MT1InICkgKSB7CgkJCQkkYXJnc1swXVsnZGVmYXVsdC1jb2xvciddID0gQkFDS0dST1VORF9DT0xPUjsKCQkJfSBlbHNlaWYgKCBpc3NldCggJGFyZ3NbMF1bJ2RlZmF1bHQtY29sb3InXSApIHx8ICRqaXQgKSB7CgkJCQlkZWZpbmUoICdCQUNLR1JPVU5EX0NPTE9SJywgJGFyZ3NbMF1bJ2RlZmF1bHQtY29sb3InXSApOwoJCQl9CgoJCQlpZiAoIGRlZmluZWQoICdCQUNLR1JPVU5EX0lNQUdFJyApICkgewoJCQkJJGFyZ3NbMF1bJ2RlZmF1bHQtaW1hZ2UnXSA9IEJBQ0tHUk9VTkRfSU1BR0U7CgkJCX0gZWxzZWlmICggaXNzZXQoICRhcmdzWzBdWydkZWZhdWx0LWltYWdlJ10gKSB8fCAkaml0ICkgewoJCQkJZGVmaW5lKCAnQkFDS0dST1VORF9JTUFHRScsICRhcmdzWzBdWydkZWZhdWx0LWltYWdlJ10gKTsKCQkJfQoKCQkJYnJlYWs7CgoJCS8vIEVuc3VyZSB0aGF0ICd0aXRsZS10YWcnIGlzIGFjY2Vzc2libGUgaW4gdGhlIGFkbWluLgoJCWNhc2UgJ3RpdGxlLXRhZyc6CgkJCS8vIENhbiBiZSBjYWxsZWQgaW4gZnVuY3Rpb25zLnBocCBidXQgbXVzdCBoYXBwZW4gYmVmb3JlIHdwX2xvYWRlZCwgaS5lLiBub3QgaW4gaGVhZGVyLnBocC4KCQkJaWYgKCBkaWRfYWN0aW9uKCAnd3BfbG9hZGVkJyApICkgewoJCQkJX2RvaW5nX2l0X3dyb25nKAoJCQkJCSJhZGRfdGhlbWVfc3VwcG9ydCggJ3RpdGxlLXRhZycgKSIsCgkJCQkJc3ByaW50ZigKCQkJCQkJLyogdHJhbnNsYXRvcnM6IDE6IHRpdGxlLXRhZywgMjogd3BfbG9hZGVkICovCgkJCQkJCV9fKCAnVGhlbWUgc3VwcG9ydCBmb3IgJTEkcyBzaG91bGQgYmUgcmVnaXN0ZXJlZCBiZWZvcmUgdGhlICUyJHMgaG9vay4nICksCgkJCQkJCSc8Y29kZT50aXRsZS10YWc8L2NvZGU+JywKCQkJCQkJJzxjb2RlPndwX2xvYWRlZDwvY29kZT4nCgkJCQkJKSwKCQkJCQknNC4xLjAnCgkJCQkpOwoKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJfQoKCSRfd3BfdGhlbWVfZmVhdHVyZXNbICRmZWF0dXJlIF0gPSAkYXJnczsKfQoKLyoqCiAqIFJlZ2lzdGVycyB0aGUgaW50ZXJuYWwgY3VzdG9tIGhlYWRlciBhbmQgYmFja2dyb3VuZCByb3V0aW5lcy4KICoKICogQHNpbmNlIDMuNC4wCiAqIEBhY2Nlc3MgcHJpdmF0ZQogKgogKiBAZ2xvYmFsIEN1c3RvbV9JbWFnZV9IZWFkZXIgJGN1c3RvbV9pbWFnZV9oZWFkZXIKICogQGdsb2JhbCBDdXN0b21fQmFja2dyb3VuZCAgICRjdXN0b21fYmFja2dyb3VuZAogKi8KZnVuY3Rpb24gX2N1c3RvbV9oZWFkZXJfYmFja2dyb3VuZF9qdXN0X2luX3RpbWUoKSB7CglnbG9iYWwgJGN1c3RvbV9pbWFnZV9oZWFkZXIsICRjdXN0b21fYmFja2dyb3VuZDsKCglpZiAoIGN1cnJlbnRfdGhlbWVfc3VwcG9ydHMoICdjdXN0b20taGVhZGVyJyApICkgewoJCS8vIEluIGNhc2UgYW55IGNvbnN0YW50cyB3ZXJlIGRlZmluZWQgYWZ0ZXIgYW4gYWRkX2N1c3RvbV9pbWFnZV9oZWFkZXIoKSBjYWxsLCByZS1ydW4uCgkJYWRkX3RoZW1lX3N1cHBvcnQoICdjdXN0b20taGVhZGVyJywgYXJyYXkoICdfX2ppdCcgPT4gdHJ1ZSApICk7CgoJCSRhcmdzID0gZ2V0X3RoZW1lX3N1cHBvcnQoICdjdXN0b20taGVhZGVyJyApOwoJCWlmICggJGFyZ3NbMF1bJ3dwLWhlYWQtY2FsbGJhY2snXSApIHsKCQkJYWRkX2FjdGlvbiggJ3dwX2hlYWQnLCAkYXJnc1swXVsnd3AtaGVhZC1jYWxsYmFjayddICk7CgkJfQoKCQlpZiAoIGlzX2FkbWluKCkgKSB7CgkJCXJlcXVpcmVfb25jZSBBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL2NsYXNzLWN1c3RvbS1pbWFnZS1oZWFkZXIucGhwJzsKCQkJJGN1c3RvbV9pbWFnZV9oZWFkZXIgPSBuZXcgQ3VzdG9tX0ltYWdlX0hlYWRlciggJGFyZ3NbMF1bJ2FkbWluLWhlYWQtY2FsbGJhY2snXSwgJGFyZ3NbMF1bJ2FkbWluLXByZXZpZXctY2FsbGJhY2snXSApOwoJCX0KCX0KCglpZiAoIGN1cnJlbnRfdGhlbWVfc3VwcG9ydHMoICdjdXN0b20tYmFja2dyb3VuZCcgKSApIHsKCQkvLyBJbiBjYXNlIGFueSBjb25zdGFudHMgd2VyZSBkZWZpbmVkIGFmdGVyIGFuIGFkZF9jdXN0b21fYmFja2dyb3VuZCgpIGNhbGwsIHJlLXJ1bi4KCQlhZGRfdGhlbWVfc3VwcG9ydCggJ2N1c3RvbS1iYWNrZ3JvdW5kJywgYXJyYXkoICdfX2ppdCcgPT4gdHJ1ZSApICk7CgoJCSRhcmdzID0gZ2V0X3RoZW1lX3N1cHBvcnQoICdjdXN0b20tYmFja2dyb3VuZCcgKTsKCQlhZGRfYWN0aW9uKCAnd3BfaGVhZCcsICRhcmdzWzBdWyd3cC1oZWFkLWNhbGxiYWNrJ10gKTsKCgkJaWYgKCBpc19hZG1pbigpICkgewoJCQlyZXF1aXJlX29uY2UgQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1jdXN0b20tYmFja2dyb3VuZC5waHAnOwoJCQkkY3VzdG9tX2JhY2tncm91bmQgPSBuZXcgQ3VzdG9tX0JhY2tncm91bmQoICRhcmdzWzBdWydhZG1pbi1oZWFkLWNhbGxiYWNrJ10sICRhcmdzWzBdWydhZG1pbi1wcmV2aWV3LWNhbGxiYWNrJ10gKTsKCQl9Cgl9Cn0KCi8qKgogKiBBZGRzIENTUyB0byBoaWRlIGhlYWRlciB0ZXh0IGZvciBjdXN0b20gbG9nbywgYmFzZWQgb24gQ3VzdG9taXplciBzZXR0aW5nLgogKgogKiBAc2luY2UgNC41LjAKICogQGFjY2VzcyBwcml2YXRlCiAqLwpmdW5jdGlvbiBfY3VzdG9tX2xvZ29faGVhZGVyX3N0eWxlcygpIHsKCWlmICggISBjdXJyZW50X3RoZW1lX3N1cHBvcnRzKCAnY3VzdG9tLWhlYWRlcicsICdoZWFkZXItdGV4dCcgKQoJCSYmIGdldF90aGVtZV9zdXBwb3J0KCAnY3VzdG9tLWxvZ28nLCAnaGVhZGVyLXRleHQnICkKCQkmJiAhIGdldF90aGVtZV9tb2QoICdoZWFkZXJfdGV4dCcsIHRydWUgKQoJKSB7CgkJJGNsYXNzZXMgPSAoYXJyYXkpIGdldF90aGVtZV9zdXBwb3J0KCAnY3VzdG9tLWxvZ28nLCAnaGVhZGVyLXRleHQnICk7CgkJJGNsYXNzZXMgPSBhcnJheV9tYXAoICdzYW5pdGl6ZV9odG1sX2NsYXNzJywgJGNsYXNzZXMgKTsKCQkkY2xhc3NlcyA9ICcuJyAuIGltcGxvZGUoICcsIC4nLCAkY2xhc3NlcyApOwoKCQkkdHlwZV9hdHRyID0gY3VycmVudF90aGVtZV9zdXBwb3J0cyggJ2h0bWw1JywgJ3N0eWxlJyApID8gJycgOiAnIHR5cGU9InRleHQvY3NzIic7CgkJPz4KCQk8IS0tIEN1c3RvbSBMb2dvOiBoaWRlIGhlYWRlciB0ZXh0IC0tPgoJCTxzdHlsZSBpZD0iY3VzdG9tLWxvZ28tY3NzIjw/cGhwIGVjaG8gJHR5cGVfYXR0cjsgPz4+CgkJCTw/cGhwIGVjaG8gJGNsYXNzZXM7ID8+IHsKCQkJCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCQkJCWNsaXA6IHJlY3QoMXB4LCAxcHgsIDFweCwgMXB4KTsKCQkJfQoJCTwvc3R5bGU+CgkJPD9waHAKCX0KfQoKLyoqCiAqIEdldHMgdGhlIHRoZW1lIHN1cHBvcnQgYXJndW1lbnRzIHBhc3NlZCB3aGVuIHJlZ2lzdGVyaW5nIHRoYXQgc3VwcG9ydC4KICoKICogRXhhbXBsZSB1c2FnZToKICoKICogICAgIGdldF90aGVtZV9zdXBwb3J0KCAnY3VzdG9tLWxvZ28nICk7CiAqICAgICBnZXRfdGhlbWVfc3VwcG9ydCggJ2N1c3RvbS1oZWFkZXInLCAnd2lkdGgnICk7CiAqCiAqIEBzaW5jZSAzLjEuMAogKiBAc2luY2UgNS4zLjAgRm9ybWFsaXplZCB0aGUgZXhpc3RpbmcgYW5kIGFscmVhZHkgZG9jdW1lbnRlZCBgLi4uJGFyZ3NgIHBhcmFtZXRlcgogKiAgICAgICAgICAgICAgYnkgYWRkaW5nIGl0IHRvIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUuCiAqCiAqIEBnbG9iYWwgYXJyYXkgJF93cF90aGVtZV9mZWF0dXJlcwogKgogKiBAcGFyYW0gc3RyaW5nICRmZWF0dXJlIFRoZSBmZWF0dXJlIHRvIGNoZWNrLiBTZWUgYWRkX3RoZW1lX3N1cHBvcnQoKSBmb3IgdGhlIGxpc3QKICogICAgICAgICAgICAgICAgICAgICAgICBvZiBwb3NzaWJsZSB2YWx1ZXMuCiAqIEBwYXJhbSBtaXhlZCAgLi4uJGFyZ3MgT3B0aW9uYWwgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGNoZWNrZWQgYWdhaW5zdCBjZXJ0YWluIGZlYXR1cmVzLgogKiBAcmV0dXJuIG1peGVkIFRoZSBhcnJheSBvZiBleHRyYSBhcmd1bWVudHMgb3IgdGhlIHZhbHVlIGZvciB0aGUgcmVnaXN0ZXJlZCBmZWF0dXJlLgogKi8KZnVuY3Rpb24gZ2V0X3RoZW1lX3N1cHBvcnQoICRmZWF0dXJlLCAuLi4kYXJncyApIHsKCWdsb2JhbCAkX3dwX3RoZW1lX2ZlYXR1cmVzOwoKCWlmICggISBpc3NldCggJF93cF90aGVtZV9mZWF0dXJlc1sgJGZlYXR1cmUgXSApICkgewoJCXJldHVybiBmYWxzZTsKCX0KCglpZiAoICEgJGFyZ3MgKSB7CgkJcmV0dXJuICRfd3BfdGhlbWVfZmVhdHVyZXNbICRmZWF0dXJlIF07Cgl9CgoJc3dpdGNoICggJGZlYXR1cmUgKSB7CgkJY2FzZSAnY3VzdG9tLWxvZ28nOgoJCWNhc2UgJ2N1c3RvbS1oZWFkZXInOgoJCWNhc2UgJ2N1c3RvbS1iYWNrZ3JvdW5kJzoKCQkJaWYgKCBpc3NldCggJF93cF90aGVtZV9mZWF0dXJlc1sgJGZlYXR1cmUgXVswXVsgJGFyZ3NbMF0gXSApICkgewoJCQkJcmV0dXJuICRfd3BfdGhlbWVfZmVhdHVyZXNbICRmZWF0dXJlIF1bMF1bICRhcmdzWzBdIF07CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoKCQlkZWZhdWx0OgoJCQlyZXR1cm4gJF93cF90aGVtZV9mZWF0dXJlc1sgJGZlYXR1cmUgXTsKCX0KfQoKLyoqCiAqIEFsbG93cyBhIHRoZW1lIHRvIGRlLXJlZ2lzdGVyIGl0cyBzdXBwb3J0IG9mIGEgY2VydGFpbiBmZWF0dXJlCiAqCiAqIFNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIHRoZW1lJ3MgZnVuY3Rpb25zLnBocCBmaWxlLiBHZW5lcmFsbHkgd291bGQKICogYmUgdXNlZCBmb3IgY2hpbGQgdGhlbWVzIHRvIG92ZXJyaWRlIHN1cHBvcnQgZnJvbSB0aGUgcGFyZW50IHRoZW1lLgogKgogKiBAc2luY2UgMy4wLjAKICoKICogQHNlZSBhZGRfdGhlbWVfc3VwcG9ydCgpCiAqCiAqIEBwYXJhbSBzdHJpbmcgJGZlYXR1cmUgVGhlIGZlYXR1cmUgYmVpbmcgcmVtb3ZlZC4gU2VlIGFkZF90aGVtZV9zdXBwb3J0KCkgZm9yIHRoZSBsaXN0CiAqICAgICAgICAgICAgICAgICAgICAgICAgb2YgcG9zc2libGUgdmFsdWVzLgogKiBAcmV0dXJuIGJvb2x8dm9pZCBXaGV0aGVyIGZlYXR1cmUgd2FzIHJlbW92ZWQuCiAqLwpmdW5jdGlvbiByZW1vdmVfdGhlbWVfc3VwcG9ydCggJGZlYXR1cmUgKSB7CgkvLyBEbyBub3QgcmVtb3ZlIGludGVybmFsIHJlZ2lzdHJhdGlvbnMgdGhhdCBhcmUgbm90IHVzZWQgZGlyZWN0bHkgYnkgdGhlbWVzLgoJaWYgKCBpbl9hcnJheSggJGZlYXR1cmUsIGFycmF5KCAnZWRpdG9yLXN0eWxlJywgJ3dpZGdldHMnLCAnbWVudXMnICksIHRydWUgKSApIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJcmV0dXJuIF9yZW1vdmVfdGhlbWVfc3VwcG9ydCggJGZlYXR1cmUgKTsKfQoKLyoqCiAqIERvIG5vdCB1c2UuIFJlbW92ZXMgdGhlbWUgc3VwcG9ydCBpbnRlcm5hbGx5IHdpdGhvdXQga25vd2xlZGdlIG9mIHRob3NlIG5vdCB1c2VkCiAqIGJ5IHRoZW1lcyBkaXJlY3RseS4KICoKICogQGFjY2VzcyBwcml2YXRlCiAqIEBzaW5jZSAzLjEuMAogKiBAZ2xvYmFsIGFycmF5ICAgICAgICAgICAgICAgJF93cF90aGVtZV9mZWF0dXJlcwogKiBAZ2xvYmFsIEN1c3RvbV9JbWFnZV9IZWFkZXIgJGN1c3RvbV9pbWFnZV9oZWFkZXIKICogQGdsb2JhbCBDdXN0b21fQmFja2dyb3VuZCAgICRjdXN0b21fYmFja2dyb3VuZAogKgogKiBAcGFyYW0gc3RyaW5nICRmZWF0dXJlIFRoZSBmZWF0dXJlIGJlaW5nIHJlbW92ZWQuIFNlZSBhZGRfdGhlbWVfc3VwcG9ydCgpIGZvciB0aGUgbGlzdAogKiAgICAgICAgICAgICAgICAgICAgICAgIG9mIHBvc3NpYmxlIHZhbHVlcy4KICogQHJldHVybiBib29sIFRydWUgaWYgc3VwcG9ydCB3YXMgcmVtb3ZlZCwgZmFsc2UgaWYgdGhlIGZlYXR1cmUgd2FzIG5vdCByZWdpc3RlcmVkLgogKi8KZnVuY3Rpb24gX3JlbW92ZV90aGVtZV9zdXBwb3J0KCAkZmVhdHVyZSApIHsKCWdsb2JhbCAkX3dwX3RoZW1lX2ZlYXR1cmVzOwoKCXN3aXRjaCAoICRmZWF0dXJlICkgewoJCWNhc2UgJ2N1c3RvbS1oZWFkZXItdXBsb2Fkcyc6CgkJCWlmICggISBpc3NldCggJF93cF90aGVtZV9mZWF0dXJlc1snY3VzdG9tLWhlYWRlciddICkgKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJYWRkX3RoZW1lX3N1cHBvcnQoICdjdXN0b20taGVhZGVyJywgYXJyYXkoICd1cGxvYWRzJyA9PiBmYWxzZSApICk7CgkJCXJldHVybjsgLy8gRG8gbm90IGNvbnRpbnVlIC0gY3VzdG9tLWhlYWRlci11cGxvYWRzIG5vIGxvbmdlciBleGlzdHMuCgl9CgoJaWYgKCAhIGlzc2V0KCAkX3dwX3RoZW1lX2ZlYXR1cmVzWyAkZmVhdHVyZSBdICkgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCXN3aXRjaCAoICRmZWF0dXJlICkgewoJCWNhc2UgJ2N1c3RvbS1oZWFkZXInOgoJCQlpZiAoICEgZGlkX2FjdGlvbiggJ3dwX2xvYWRlZCcgKSApIHsKCQkJCWJyZWFrOwoJCQl9CgkJCSRzdXBwb3J0ID0gZ2V0X3RoZW1lX3N1cHBvcnQoICdjdXN0b20taGVhZGVyJyApOwoJCQlpZiAoIGlzc2V0KCAkc3VwcG9ydFswXVsnd3AtaGVhZC1jYWxsYmFjayddICkgKSB7CgkJCQlyZW1vdmVfYWN0aW9uKCAnd3BfaGVhZCcsICRzdXBwb3J0WzBdWyd3cC1oZWFkLWNhbGxiYWNrJ10gKTsKCQkJfQoJCQlpZiAoIGlzc2V0KCAkR0xPQkFMU1snY3VzdG9tX2ltYWdlX2hlYWRlciddICkgKSB7CgkJCQlyZW1vdmVfYWN0aW9uKCAnYWRtaW5fbWVudScsIGFycmF5KCAkR0xPQkFMU1snY3VzdG9tX2ltYWdlX2hlYWRlciddLCAnaW5pdCcgKSApOwoJCQkJdW5zZXQoICRHTE9CQUxTWydjdXN0b21faW1hZ2VfaGVhZGVyJ10gKTsKCQkJfQoJCQlicmVhazsKCgkJY2FzZSAnY3VzdG9tLWJhY2tncm91bmQnOgoJCQlpZiAoICEgZGlkX2FjdGlvbiggJ3dwX2xvYWRlZCcgKSApIHsKCQkJCWJyZWFrOwoJCQl9CgkJCSRzdXBwb3J0ID0gZ2V0X3RoZW1lX3N1cHBvcnQoICdjdXN0b20tYmFja2dyb3VuZCcgKTsKCQkJaWYgKCBpc3NldCggJHN1cHBvcnRbMF1bJ3dwLWhlYWQtY2FsbGJhY2snXSApICkgewoJCQkJcmVtb3ZlX2FjdGlvbiggJ3dwX2hlYWQnLCAkc3VwcG9ydFswXVsnd3AtaGVhZC1jYWxsYmFjayddICk7CgkJCX0KCQkJcmVtb3ZlX2FjdGlvbiggJ2FkbWluX21lbnUnLCBhcnJheSggJEdMT0JBTFNbJ2N1c3RvbV9iYWNrZ3JvdW5kJ10sICdpbml0JyApICk7CgkJCXVuc2V0KCAkR0xPQkFMU1snY3VzdG9tX2JhY2tncm91bmQnXSApOwoJCQlicmVhazsKCX0KCgl1bnNldCggJF93cF90aGVtZV9mZWF0dXJlc1sgJGZlYXR1cmUgXSApOwoKCXJldHVybiB0cnVlOwp9CgovKioKICogQ2hlY2tzIGEgdGhlbWUncyBzdXBwb3J0IGZvciBhIGdpdmVuIGZlYXR1cmUuCiAqCiAqIEV4YW1wbGUgdXNhZ2U6CiAqCiAqICAgICBjdXJyZW50X3RoZW1lX3N1cHBvcnRzKCAnY3VzdG9tLWxvZ28nICk7CiAqICAgICBjdXJyZW50X3RoZW1lX3N1cHBvcnRzKCAnaHRtbDUnLCAnY29tbWVudC1mb3JtJyApOwogKgogKiBAc2luY2UgMi45LjAKICogQHNpbmNlIDUuMy4wIEZvcm1hbGl6ZWQgdGhlIGV4aXN0aW5nIGFuZCBhbHJlYWR5IGRvY3VtZW50ZWQgYC4uLiRhcmdzYCBwYXJhbWV0ZXIKICogICAgICAgICAgICAgIGJ5IGFkZGluZyBpdCB0byB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlLgogKgogKiBAZ2xvYmFsIGFycmF5ICRfd3BfdGhlbWVfZmVhdHVyZXMKICoKICogQHBhcmFtIHN0cmluZyAkZmVhdHVyZSBUaGUgZmVhdHVyZSBiZWluZyBjaGVja2VkLiBTZWUgYWRkX3RoZW1lX3N1cHBvcnQoKSBmb3IgdGhlIGxpc3QKICogICAgICAgICAgICAgICAgICAgICAgICBvZiBwb3NzaWJsZSB2YWx1ZXMuCiAqIEBwYXJhbSBtaXhlZCAgLi4uJGFyZ3MgT3B0aW9uYWwgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGNoZWNrZWQgYWdhaW5zdCBjZXJ0YWluIGZlYXR1cmVzLgogKiBAcmV0dXJuIGJvb2wgVHJ1ZSBpZiB0aGUgYWN0aXZlIHRoZW1lIHN1cHBvcnRzIHRoZSBmZWF0dXJlLCBmYWxzZSBvdGhlcndpc2UuCiAqLwpmdW5jdGlvbiBjdXJyZW50X3RoZW1lX3N1cHBvcnRzKCAkZmVhdHVyZSwgLi4uJGFyZ3MgKSB7CglnbG9iYWwgJF93cF90aGVtZV9mZWF0dXJlczsKCglpZiAoICdjdXN0b20taGVhZGVyLXVwbG9hZHMnID09PSAkZmVhdHVyZSApIHsKCQlyZXR1cm4gY3VycmVudF90aGVtZV9zdXBwb3J0cyggJ2N1c3RvbS1oZWFkZXInLCAndXBsb2FkcycgKTsKCX0KCglpZiAoICEgaXNzZXQoICRfd3BfdGhlbWVfZmVhdHVyZXNbICRmZWF0dXJlIF0gKSApIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLy8gSWYgbm8gYXJncyBwYXNzZWQgdGhlbiBubyBleHRyYSBjaGVja3MgbmVlZCB0byBiZSBwZXJmb3JtZWQuCglpZiAoICEgJGFyZ3MgKSB7CgkJLyoqIFRoaXMgZmlsdGVyIGlzIGRvY3VtZW50ZWQgaW4gd3AtaW5jbHVkZXMvdGhlbWUucGhwICovCgkJcmV0dXJuIGFwcGx5X2ZpbHRlcnMoICJjdXJyZW50X3RoZW1lX3N1cHBvcnRzLXskZmVhdHVyZX0iLCB0cnVlLCAkYXJncywgJF93cF90aGVtZV9mZWF0dXJlc1sgJGZlYXR1cmUgXSApOyAvLyBwaHBjczppZ25vcmUgV29yZFByZXNzLk5hbWluZ0NvbnZlbnRpb25zLlZhbGlkSG9va05hbWUuVXNlVW5kZXJzY29yZXMKCX0KCglzd2l0Y2ggKCAkZmVhdHVyZSApIHsKCQljYXNlICdwb3N0LXRodW1ibmFpbHMnOgoJCQkvKgoJCQkgKiBwb3N0LXRodW1ibmFpbHMgY2FuIGJlIHJlZ2lzdGVyZWQgZm9yIG9ubHkgY2VydGFpbiBjb250ZW50L3Bvc3QgdHlwZXMKCQkJICogYnkgcGFzc2luZyBhbiBhcnJheSBvZiB0eXBlcyB0byBhZGRfdGhlbWVfc3VwcG9ydCgpLgoJCQkgKiBJZiBubyBhcnJheSB3YXMgcGFzc2VkLCB0aGVuIGFueSB0eXBlIGlzIGFjY2VwdGVkLgoJCQkgKi8KCQkJaWYgKCB0cnVlID09PSAkX3dwX3RoZW1lX2ZlYXR1cmVzWyAkZmVhdHVyZSBdICkgeyAgLy8gUmVnaXN0ZXJlZCBmb3IgYWxsIHR5cGVzLgoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJJGNvbnRlbnRfdHlwZSA9ICRhcmdzWzBdOwoJCQlyZXR1cm4gaW5fYXJyYXkoICRjb250ZW50X3R5cGUsICRfd3BfdGhlbWVfZmVhdHVyZXNbICRmZWF0dXJlIF1bMF0sIHRydWUgKTsKCgkJY2FzZSAnaHRtbDUnOgoJCWNhc2UgJ3Bvc3QtZm9ybWF0cyc6CgkJCS8qCgkJCSAqIFNwZWNpZmljIHBvc3QgZm9ybWF0cyBjYW4gYmUgcmVnaXN0ZXJlZCBieSBwYXNzaW5nIGFuIGFycmF5IG9mIHR5cGVzCgkJCSAqIHRvIGFkZF90aGVtZV9zdXBwb3J0KCkuCgkJCSAqCgkJCSAqIFNwZWNpZmljIGFyZWFzIG9mIEhUTUw1IHN1cHBvcnQgKm11c3QqIGJlIHBhc3NlZCB2aWEgYW4gYXJyYXkgdG8gYWRkX3RoZW1lX3N1cHBvcnQoKS4KCQkJICovCgkJCSR0eXBlID0gJGFyZ3NbMF07CgkJCXJldHVybiBpbl9hcnJheSggJHR5cGUsICRfd3BfdGhlbWVfZmVhdHVyZXNbICRmZWF0dXJlIF1bMF0sIHRydWUgKTsKCgkJY2FzZSAnY3VzdG9tLWxvZ28nOgoJCWNhc2UgJ2N1c3RvbS1oZWFkZXInOgoJCWNhc2UgJ2N1c3RvbS1iYWNrZ3JvdW5kJzoKCQkJLy8gU3BlY2lmaWMgY2FwYWJpbGl0aWVzIGNhbiBiZSByZWdpc3RlcmVkIGJ5IHBhc3NpbmcgYW4gYXJyYXkgdG8gYWRkX3RoZW1lX3N1cHBvcnQoKS4KCQkJcmV0dXJuICggaXNzZXQoICRfd3BfdGhlbWVfZmVhdHVyZXNbICRmZWF0dXJlIF1bMF1bICRhcmdzWzBdIF0gKSAmJiAkX3dwX3RoZW1lX2ZlYXR1cmVzWyAkZmVhdHVyZSBdWzBdWyAkYXJnc1swXSBdICk7Cgl9CgoJLyoqCgkgKiBGaWx0ZXJzIHdoZXRoZXIgdGhlIGFjdGl2ZSB0aGVtZSBzdXBwb3J0cyBhIHNwZWNpZmljIGZlYXR1cmUuCgkgKgoJICogVGhlIGR5bmFtaWMgcG9ydGlvbiBvZiB0aGUgaG9vayBuYW1lLCBgJGZlYXR1cmVgLCByZWZlcnMgdG8gdGhlIHNwZWNpZmljCgkgKiB0aGVtZSBmZWF0dXJlLiBTZWUgYWRkX3RoZW1lX3N1cHBvcnQoKSBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLgoJICoKCSAqIEBzaW5jZSAzLjQuMAoJICoKCSAqIEBwYXJhbSBib29sICAgJHN1cHBvcnRzIFdoZXRoZXIgdGhlIGFjdGl2ZSB0aGVtZSBzdXBwb3J0cyB0aGUgZ2l2ZW4gZmVhdHVyZS4gRGVmYXVsdCB0cnVlLgoJICogQHBhcmFtIGFycmF5ICAkYXJncyAgICAgQXJyYXkgb2YgYXJndW1lbnRzIGZvciB0aGUgZmVhdHVyZS4KCSAqIEBwYXJhbSBzdHJpbmcgJGZlYXR1cmUgIFRoZSB0aGVtZSBmZWF0dXJlLgoJICovCglyZXR1cm4gYXBwbHlfZmlsdGVycyggImN1cnJlbnRfdGhlbWVfc3VwcG9ydHMteyRmZWF0dXJlfSIsIHRydWUsICRhcmdzLCAkX3dwX3RoZW1lX2ZlYXR1cmVzWyAkZmVhdHVyZSBdICk7IC8vIHBocGNzOmlnbm9yZSBXb3JkUHJlc3MuTmFtaW5nQ29udmVudGlvbnMuVmFsaWRIb29rTmFtZS5Vc2VVbmRlcnNjb3Jlcwp9CgovKioKICogQ2hlY2tzIGEgdGhlbWUncyBzdXBwb3J0IGZvciBhIGdpdmVuIGZlYXR1cmUgYmVmb3JlIGxvYWRpbmcgdGhlIGZ1bmN0aW9ucyB3aGljaCBpbXBsZW1lbnQgaXQuCiAqCiAqIEBzaW5jZSAyLjkuMAogKgogKiBAcGFyYW0gc3RyaW5nICRmZWF0dXJlIFRoZSBmZWF0dXJlIGJlaW5nIGNoZWNrZWQuIFNlZSBhZGRfdGhlbWVfc3VwcG9ydCgpIGZvciB0aGUgbGlzdAogKiAgICAgICAgICAgICAgICAgICAgICAgIG9mIHBvc3NpYmxlIHZhbHVlcy4KICogQHBhcmFtIHN0cmluZyAkaW5jbHVkZSBQYXRoIHRvIHRoZSBmaWxlLgogKiBAcmV0dXJuIGJvb2wgVHJ1ZSBpZiB0aGUgYWN0aXZlIHRoZW1lIHN1cHBvcnRzIHRoZSBzdXBwbGllZCBmZWF0dXJlLCBmYWxzZSBvdGhlcndpc2UuCiAqLwpmdW5jdGlvbiByZXF1aXJlX2lmX3RoZW1lX3N1cHBvcnRzKCAkZmVhdHVyZSwgJGluY2x1ZGUgKSB7CglpZiAoIGN1cnJlbnRfdGhlbWVfc3VwcG9ydHMoICRmZWF0dXJlICkgKSB7CgkJcmVxdWlyZSAkaW5jbHVkZTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCXJldHVybiBmYWxzZTsKfQoKLyoqCiAqIFJlZ2lzdGVycyBhIHRoZW1lIGZlYXR1cmUgZm9yIHVzZSBpbiBhZGRfdGhlbWVfc3VwcG9ydCgpLgogKgogKiBUaGlzIGRvZXMgbm90IGluZGljYXRlIHRoYXQgdGhlIGFjdGl2ZSB0aGVtZSBzdXBwb3J0cyB0aGUgZmVhdHVyZSwgaXQgb25seSBkZXNjcmliZXMKICogdGhlIGZlYXR1cmUncyBzdXBwb3J0ZWQgb3B0aW9ucy4KICoKICogQHNpbmNlIDUuNS4wCiAqCiAqIEBzZWUgYWRkX3RoZW1lX3N1cHBvcnQoKQogKgogKiBAZ2xvYmFsIGFycmF5ICRfd3BfcmVnaXN0ZXJlZF90aGVtZV9mZWF0dXJlcwogKgogKiBAcGFyYW0gc3RyaW5nICRmZWF0dXJlIFRoZSBuYW1lIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoZSBmZWF0dXJlLiBTZWUgYWRkX3RoZW1lX3N1cHBvcnQoKQogKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMuCiAqIEBwYXJhbSBhcnJheSAgJGFyZ3MgewogKiAgICAgRGF0YSB1c2VkIHRvIGRlc2NyaWJlIHRoZSB0aGVtZS4KICoKICogICAgIEB0eXBlIHN0cmluZyAgICAgJHR5cGUgICAgICAgICBUaGUgdHlwZSBvZiBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZlYXR1cmUuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgdmFsdWVzIGFyZSAnc3RyaW5nJywgJ2Jvb2xlYW4nLCAnaW50ZWdlcicsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ251bWJlcicsICdhcnJheScsIGFuZCAnb2JqZWN0Jy4gRGVmYXVsdHMgdG8gJ2Jvb2xlYW4nLgogKiAgICAgQHR5cGUgYm9vbCAgICAgICAkdmFyaWFkaWMgICAgIERvZXMgdGhpcyBmZWF0dXJlIHV0aWxpemUgdGhlIHZhcmlhZGljIHN1cHBvcnQKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBhZGRfdGhlbWVfc3VwcG9ydCgpLCBvciBhcmUgYWxsIGFyZ3VtZW50cyBzcGVjaWZpZWQKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci4gTXVzdCBiZSB1c2VkIHdpdGggdGhlICJhcnJheSIgdHlwZS4KICogICAgIEB0eXBlIHN0cmluZyAgICAgJGRlc2NyaXB0aW9uICBBIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlLiBJbmNsdWRlZCBpbgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBUaGVtZXMgUkVTVCBBUEkgc2NoZW1hLiBJbnRlbmRlZCBmb3IgZGV2ZWxvcGVycy4KICogICAgIEB0eXBlIGJvb2x8YXJyYXkgJHNob3dfaW5fcmVzdCB7CiAqICAgICAgICAgV2hldGhlciB0aGlzIGZlYXR1cmUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBUaGVtZXMgUkVTVCBBUEkgZW5kcG9pbnQuCiAqICAgICAgICAgRGVmYXVsdHMgdG8gbm90IGJlaW5nIGluY2x1ZGVkLiBXaGVuIHJlZ2lzdGVyaW5nIGFuICdhcnJheScgb3IgJ29iamVjdCcgdHlwZSwKICogICAgICAgICB0aGlzIGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkgd2l0aCB0aGUgJ3NjaGVtYScga2V5LgogKgogKiAgICAgICAgIEB0eXBlIGFycmF5ICAgICRzY2hlbWEgICAgICAgICAgIFNwZWNpZmllcyB0aGUgSlNPTiBTY2hlbWEgZGVmaW5pdGlvbiBkZXNjcmliaW5nCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZlYXR1cmUuIElmIGFueSBvYmplY3RzIGluIHRoZSBzY2hlbWEgZG8gbm90IGluY2x1ZGUKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJyBrZXl3b3JkLCBpdCBpcyBzZXQgdG8gZmFsc2UuCiAqICAgICAgICAgQHR5cGUgc3RyaW5nICAgJG5hbWUgICAgICAgICAgICAgQW4gYWx0ZXJuYXRlIG5hbWUgdG8gYmUgdXNlZCBhcyB0aGUgcHJvcGVydHkgbmFtZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBSRVNUIEFQSS4KICogICAgICAgICBAdHlwZSBjYWxsYWJsZSAkcHJlcGFyZV9jYWxsYmFjayBBIGZ1bmN0aW9uIHVzZWQgdG8gZm9ybWF0IHRoZSB0aGVtZSBzdXBwb3J0IGluIHRoZSBSRVNUIEFQSS4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNlaXZlcyB0aGUgcmF3IHRoZW1lIHN1cHBvcnQgdmFsdWUuCiAqICAgICAgfQogKiB9CiAqIEByZXR1cm4gdHJ1ZXxXUF9FcnJvciBUcnVlIGlmIHRoZSB0aGVtZSBmZWF0dXJlIHdhcyBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCwgYSBXUF9FcnJvciBvYmplY3QgaWYgbm90LgogKi8KZnVuY3Rpb24gcmVnaXN0ZXJfdGhlbWVfZmVhdHVyZSggJGZlYXR1cmUsICRhcmdzID0gYXJyYXkoKSApIHsKCWdsb2JhbCAkX3dwX3JlZ2lzdGVyZWRfdGhlbWVfZmVhdHVyZXM7CgoJaWYgKCAhIGlzX2FycmF5KCAkX3dwX3JlZ2lzdGVyZWRfdGhlbWVfZmVhdHVyZXMgKSApIHsKCQkkX3dwX3JlZ2lzdGVyZWRfdGhlbWVfZmVhdHVyZXMgPSBhcnJheSgpOwoJfQoKCSRkZWZhdWx0cyA9IGFycmF5KAoJCSd0eXBlJyAgICAgICAgID0+ICdib29sZWFuJywKCQkndmFyaWFkaWMnICAgICA9PiBmYWxzZSwKCQknZGVzY3JpcHRpb24nICA9PiAnJywKCQknc2hvd19pbl9yZXN0JyA9PiBmYWxzZSwKCSk7CgoJJGFyZ3MgPSB3cF9wYXJzZV9hcmdzKCAkYXJncywgJGRlZmF1bHRzICk7CgoJaWYgKCB0cnVlID09PSAkYXJnc1snc2hvd19pbl9yZXN0J10gKSB7CgkJJGFyZ3NbJ3Nob3dfaW5fcmVzdCddID0gYXJyYXkoKTsKCX0KCglpZiAoIGlzX2FycmF5KCAkYXJnc1snc2hvd19pbl9yZXN0J10gKSApIHsKCQkkYXJnc1snc2hvd19pbl9yZXN0J10gPSB3cF9wYXJzZV9hcmdzKAoJCQkkYXJnc1snc2hvd19pbl9yZXN0J10sCgkJCWFycmF5KAoJCQkJJ3NjaGVtYScgICAgICAgICAgID0+IGFycmF5KCksCgkJCQknbmFtZScgICAgICAgICAgICAgPT4gJGZlYXR1cmUsCgkJCQkncHJlcGFyZV9jYWxsYmFjaycgPT4gbnVsbCwKCQkJKQoJCSk7Cgl9CgoJaWYgKCAhIGluX2FycmF5KCAkYXJnc1sndHlwZSddLCBhcnJheSggJ3N0cmluZycsICdib29sZWFuJywgJ2ludGVnZXInLCAnbnVtYmVyJywgJ2FycmF5JywgJ29iamVjdCcgKSwgdHJ1ZSApICkgewoJCXJldHVybiBuZXcgV1BfRXJyb3IoCgkJCSdpbnZhbGlkX3R5cGUnLAoJCQlfXyggJ1RoZSBmZWF0dXJlICJ0eXBlIiBpcyBub3QgdmFsaWQgSlNPTiBTY2hlbWEgdHlwZS4nICkKCQkpOwoJfQoKCWlmICggdHJ1ZSA9PT0gJGFyZ3NbJ3ZhcmlhZGljJ10gJiYgJ2FycmF5JyAhPT0gJGFyZ3NbJ3R5cGUnXSApIHsKCQlyZXR1cm4gbmV3IFdQX0Vycm9yKAoJCQkndmFyaWFkaWNfbXVzdF9iZV9hcnJheScsCgkJCV9fKCAnV2hlbiByZWdpc3RlcmluZyBhICJ2YXJpYWRpYyIgdGhlbWUgZmVhdHVyZSwgdGhlICJ0eXBlIiBtdXN0IGJlIGFuICJhcnJheSIuJyApCgkJKTsKCX0KCglpZiAoIGZhbHNlICE9PSAkYXJnc1