Advertisement
galih039

Untitled

Jul 14th, 2021
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 47.41 KB | None | 0 0
  1. PD9waHAKLyoqCiAqIE1hZ2VudG8KICoKICogTk9USUNFIE9GIExJQ0VOU0UKICoKICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApCiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLnR4dC4KICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6CiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMy4wLnBocAogKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0bwogKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsCiAqIHRvIGxpY2Vuc2VAbWFnZW50b2NvbW1lcmNlLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LgogKgogKiBESVNDTEFJTUVSCiAqCiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBNYWdlbnRvIHRvIG5ld2VyCiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBNYWdlbnRvIGZvciB5b3VyCiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwOi8vd3d3Lm1hZ2VudG9jb21tZXJjZS5jb20gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAqCiAqIEBjYXRlZ29yeSAgICBNYWdlCiAqIEBwYWNrYWdlICAgICBNYWdlX0NoZWNrb3V0IChCdWc3c2VjIFRlYW0pCiAqIEBjb3B5cmlnaHQgICBDb3B5cmlnaHQgKGMpIDIwMTQgTWFnZW50byBJbmMuIChodHRwOi8vd3d3Lm1hZ2VudG9jb21tZXJjZS5jb20pCiAqIEBsaWNlbnNlICAgICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLTMuMC5waHAgIE9wZW4gU29mdHdhcmUgTGljZW5zZSAoT1NMIDMuMCkKICovCgovKioKICogT25lIHBhZ2UgY2hlY2tvdXQgcHJvY2Vzc2luZyBtb2RlbAogKi8KY2xhc3MgTWFnZV9DaGVja291dF9Nb2RlbF9UeXBlX09uZXBhZ2UKewogICAgLyoqCiAgICAgKiBDaGVja291dCB0eXBlczogQ2hlY2tvdXQgYXMgR3Vlc3QsIFJlZ2lzdGVyLCBMb2dnZWQgSW4gQ3VzdG9tZXIKICAgICAqLwogICAgY29uc3QgTUVUSE9EX0dVRVNUICAgID0gJ2d1ZXN0JzsKICAgIGNvbnN0IE1FVEhPRF9SRUdJU1RFUiA9ICdyZWdpc3Rlcic7CiAgICBjb25zdCBNRVRIT0RfQ1VTVE9NRVIgPSAnY3VzdG9tZXInOwoKICAgIC8qKgogICAgICogRXJyb3IgbWVzc2FnZSBvZiAiY3VzdG9tZXIgYWxyZWFkeSBleGlzdHMiCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSAkX2N1c3RvbWVyRW1haWxFeGlzdHNNZXNzYWdlID0gJyc7CgogICAgLyoqCiAgICAgKiBAdmFyIE1hZ2VfQ3VzdG9tZXJfTW9kZWxfU2Vzc2lvbgogICAgICovCiAgICBwcm90ZWN0ZWQgJF9jdXN0b21lclNlc3Npb247CgogICAgLyoqCiAgICAgKiBAdmFyIE1hZ2VfQ2hlY2tvdXRfTW9kZWxfU2Vzc2lvbgogICAgICovCiAgICBwcm90ZWN0ZWQgJF9jaGVja291dFNlc3Npb247CgogICAgLyoqCiAgICAgKiBAdmFyIE1hZ2VfU2FsZXNfTW9kZWxfUXVvdGUKICAgICAqLwogICAgcHJvdGVjdGVkICRfcXVvdGUgPSBudWxsOwoKICAgIC8qKgogICAgICogQHZhciBNYWdlX0NoZWNrb3V0X0hlbHBlcl9EYXRhCiAgICAgKi8KICAgIHByb3RlY3RlZCAkX2hlbHBlcjsKCiAgICAvKioKICAgICAqIENsYXNzIGNvbnN0cnVjdG9yCiAgICAgKiBTZXQgY3VzdG9tZXIgYWxyZWFkeSBleGlzdHMgbWVzc2FnZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgICR0aGlzLT5faGVscGVyID0gTWFnZTo6aGVscGVyKCdjaGVja291dCcpOwogICAgICAgICR0aGlzLT5fY3VzdG9tZXJFbWFpbEV4aXN0c01lc3NhZ2UgPSBNYWdlOjpoZWxwZXIoJ2NoZWNrb3V0JyktPl9fKCdUaGVyZSBpcyBhbHJlYWR5IGEgY3VzdG9tZXIgcmVnaXN0ZXJlZCB1c2luZyB0aGlzIGVtYWlsIGFkZHJlc3MuIFBsZWFzZSBsb2dpbiB1c2luZyB0aGlzIGVtYWlsIGFkZHJlc3Mgb3IgZW50ZXIgYSBkaWZmZXJlbnQgZW1haWwgYWRkcmVzcyB0byByZWdpc3RlciB5b3VyIGFjY291bnQuJyk7CiAgICAgICAgJHRoaXMtPl9jaGVja291dFNlc3Npb24gPSBNYWdlOjpnZXRTaW5nbGV0b24oJ2NoZWNrb3V0L3Nlc3Npb24nKTsKICAgICAgICAkdGhpcy0+X2N1c3RvbWVyU2Vzc2lvbiA9IE1hZ2U6OmdldFNpbmdsZXRvbignY3VzdG9tZXIvc2Vzc2lvbicpOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IGZyb250ZW5kIGNoZWNrb3V0IHNlc3Npb24gb2JqZWN0CiAgICAgKgogICAgICogQHJldHVybiBNYWdlX0NoZWNrb3V0X01vZGVsX1Nlc3Npb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENoZWNrb3V0KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPl9jaGVja291dFNlc3Npb247CiAgICB9CgogICAgLyoqCiAgICAgKiBRdW90ZSBvYmplY3QgZ2V0dGVyCiAgICAgKgogICAgICogQHJldHVybiBNYWdlX1NhbGVzX01vZGVsX1F1b3RlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRRdW90ZSgpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5fcXVvdGUgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5fY2hlY2tvdXRTZXNzaW9uLT5nZXRRdW90ZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPl9xdW90ZTsKICAgIH0KCiAgICAvKioKICAgICAqIERlY2xhcmUgY2hlY2tvdXQgcXVvdGUgaW5zdGFuY2UKICAgICAqCiAgICAgKiBAcGFyYW0gTWFnZV9TYWxlc19Nb2RlbF9RdW90ZSAkcXVvdGUKICAgICAqIEByZXR1cm4gTWFnZV9DaGVja291dF9Nb2RlbF9UeXBlX09uZXBhZ2UKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFF1b3RlKE1hZ2VfU2FsZXNfTW9kZWxfUXVvdGUgJHF1b3RlKQogICAgewogICAgICAgICR0aGlzLT5fcXVvdGUgPSAkcXVvdGU7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IGN1c3RvbWVyIHNlc3Npb24gb2JqZWN0CiAgICAgKgogICAgICogQHJldHVybiBNYWdlX0N1c3RvbWVyX01vZGVsX1Nlc3Npb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEN1c3RvbWVyU2Vzc2lvbigpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5fY3VzdG9tZXJTZXNzaW9uOwogICAgfQoKICAgIC8qKgogICAgICogSW5pdGlhbGl6ZSBxdW90ZSBzdGF0ZSB0byBiZSB2YWxpZCBmb3Igb25lIHBhZ2UgY2hlY2tvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIE1hZ2VfQ2hlY2tvdXRfTW9kZWxfVHlwZV9PbmVwYWdlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpbml0Q2hlY2tvdXQoKQogICAgewogICAgICAgICRjaGVja291dCA9ICR0aGlzLT5nZXRDaGVja291dCgpOwogICAgICAgICRjdXN0b21lclNlc3Npb24gPSAkdGhpcy0+Z2V0Q3VzdG9tZXJTZXNzaW9uKCk7CiAgICAgICAgaWYgKGlzX2FycmF5KCRjaGVja291dC0+Z2V0U3RlcERhdGEoKSkpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGNoZWNrb3V0LT5nZXRTdGVwRGF0YSgpIGFzICRzdGVwPT4kZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKCEoJHN0ZXA9PT0nbG9naW4nIHx8ICRjdXN0b21lclNlc3Npb24tPmlzTG9nZ2VkSW4oKSAmJiAkc3RlcD09PSdiaWxsaW5nJykpIHsKICAgICAgICAgICAgICAgICAgICAkY2hlY2tvdXQtPnNldFN0ZXBEYXRhKCRzdGVwLCAnYWxsb3cnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJlc2V0IG11bHRpc2hpcHBpbmcgZmxhZyBiZWZvcmUgYW55IG1hbmlwdWxhdGlvbnMgd2l0aCBxdW90ZSBhZGRyZXNzCiAgICAgICAgICogYWRkQWRkcmVzcyBtZXRob2QgZm9yIHF1b3RlIG9iamVjdCByZWxhdGVkIG9uIHRoaXMgZmxhZwogICAgICAgICAqLwogICAgICAgIGlmICgkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0SXNNdWx0aVNoaXBwaW5nKCkpIHsKICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNldElzTXVsdGlTaGlwcGluZyhmYWxzZSk7CiAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zYXZlKCk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICogd2FudCB0byBsb2FkIHRoZSBjb3JyZWN0IGN1c3RvbWVyIGluZm9ybWF0aW9uIGJ5IGFzc2lnbmluZyB0byBhZGRyZXNzCiAgICAgICAgKiBpbnN0ZWFkIG9mIGp1c3QgbG9hZGluZyBmcm9tIHNhbGVzL3F1b3RlX2FkZHJlc3MKICAgICAgICAqLwogICAgICAgICRjdXN0b21lciA9ICRjdXN0b21lclNlc3Npb24tPmdldEN1c3RvbWVyKCk7CiAgICAgICAgaWYgKCRjdXN0b21lcikgewogICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+YXNzaWduQ3VzdG9tZXIoJGN1c3RvbWVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IHF1b3RlIGNoZWNrb3V0IG1ldGhvZAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDaGVja291dE1ldGhvZCgpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5nZXRDdXN0b21lclNlc3Npb24oKS0+aXNMb2dnZWRJbigpKSB7CiAgICAgICAgICAgIHJldHVybiBzZWxmOjpNRVRIT0RfQ1VTVE9NRVI7CiAgICAgICAgfQogICAgICAgIGlmICghJHRoaXMtPmdldFF1b3RlKCktPmdldENoZWNrb3V0TWV0aG9kKCkpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5faGVscGVyLT5pc0FsbG93ZWRHdWVzdENoZWNrb3V0KCR0aGlzLT5nZXRRdW90ZSgpKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNldENoZWNrb3V0TWV0aG9kKHNlbGY6Ok1FVEhPRF9HVUVTVCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+c2V0Q2hlY2tvdXRNZXRob2Qoc2VsZjo6TUVUSE9EX1JFR0lTVEVSKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPmdldFF1b3RlKCktPmdldENoZWNrb3V0TWV0aG9kKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgcXVvdGUgY2hlY2tvdXQgbWV0aG9kCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS40LjAuMQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENoZWNrb3V0TWVob2QoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0Q2hlY2tvdXRNZXRob2QoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFNwZWNpZnkgY2hlY2tvdXQgbWV0aG9kCiAgICAgKgogICAgICogQHBhcmFtICAgc3RyaW5nICRtZXRob2QKICAgICAqIEByZXR1cm4gIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzYXZlQ2hlY2tvdXRNZXRob2QoJG1ldGhvZCkKICAgIHsKICAgICAgICBpZiAoZW1wdHkoJG1ldGhvZCkpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gLTEsICdtZXNzYWdlJyA9PiBNYWdlOjpoZWxwZXIoJ2NoZWNrb3V0JyktPl9fKCdJbnZhbGlkIGRhdGEuJykpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNldENoZWNrb3V0TWV0aG9kKCRtZXRob2QpLT5zYXZlKCk7CiAgICAgICAgJHRoaXMtPmdldENoZWNrb3V0KCktPnNldFN0ZXBEYXRhKCdiaWxsaW5nJywgJ2FsbG93JywgdHJ1ZSk7CiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgY3VzdG9tZXIgYWRkcmVzcyBieSBpZGVudGlmaWVyCiAgICAgKgogICAgICogQHBhcmFtICAgaW50ICRhZGRyZXNzSWQKICAgICAqIEByZXR1cm4gIE1hZ2VfQ3VzdG9tZXJfTW9kZWxfQWRkcmVzcwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QWRkcmVzcygkYWRkcmVzc0lkKQogICAgewogICAgICAgICRhZGRyZXNzID0gTWFnZTo6Z2V0TW9kZWwoJ2N1c3RvbWVyL2FkZHJlc3MnKS0+bG9hZCgoaW50KSRhZGRyZXNzSWQpOwogICAgICAgICRhZGRyZXNzLT5leHBsb2RlU3RyZWV0QWRkcmVzcygpOwogICAgICAgIGlmICgkYWRkcmVzcy0+Z2V0UmVnaW9uSWQoKSkgewogICAgICAgICAgICAkYWRkcmVzcy0+c2V0UmVnaW9uKCRhZGRyZXNzLT5nZXRSZWdpb25JZCgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRhZGRyZXNzOwogICAgfQoKICAgIC8qKgogICAgICogU2F2ZSBiaWxsaW5nIGFkZHJlc3MgaW5mb3JtYXRpb24gdG8gcXVvdGUKICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBPbmUgUGFnZSBDaGVja291dCBKUyAoQUpBWCkgd2hpbGUgc2F2aW5nIHRoZSBiaWxsaW5nIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSAgIGFycmF5ICRkYXRhCiAgICAgKiBAcGFyYW0gICBpbnQgJGN1c3RvbWVyQWRkcmVzc0lkCiAgICAgKiBAcmV0dXJuICBNYWdlX0NoZWNrb3V0X01vZGVsX1R5cGVfT25lcGFnZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2F2ZUJpbGxpbmcoJGRhdGEsICRjdXN0b21lckFkZHJlc3NJZCkKICAgIHsKICAgICAgICBpZiAoZW1wdHkoJGRhdGEpKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IC0xLCAnbWVzc2FnZScgPT4gTWFnZTo6aGVscGVyKCdjaGVja291dCcpLT5fXygnSW52YWxpZCBkYXRhLicpKTsKICAgICAgICB9CgogICAgICAgICRhZGRyZXNzID0gJHRoaXMtPmdldFF1b3RlKCktPmdldEJpbGxpbmdBZGRyZXNzKCk7CiAgICAgICAgLyogQHZhciAkYWRkcmVzc0Zvcm0gTWFnZV9DdXN0b21lcl9Nb2RlbF9Gb3JtICovCiAgICAgICAgJGFkZHJlc3NGb3JtID0gTWFnZTo6Z2V0TW9kZWwoJ2N1c3RvbWVyL2Zvcm0nKTsKICAgICAgICAkYWRkcmVzc0Zvcm0tPnNldEZvcm1Db2RlKCdjdXN0b21lcl9hZGRyZXNzX2VkaXQnKQogICAgICAgICAgICAtPnNldEVudGl0eVR5cGUoJ2N1c3RvbWVyX2FkZHJlc3MnKQogICAgICAgICAgICAtPnNldElzQWpheFJlcXVlc3QoTWFnZTo6YXBwKCktPmdldFJlcXVlc3QoKS0+aXNBamF4KCkpOwoKICAgICAgICBpZiAoIWVtcHR5KCRjdXN0b21lckFkZHJlc3NJZCkpIHsKICAgICAgICAgICAgJGN1c3RvbWVyQWRkcmVzcyA9IE1hZ2U6OmdldE1vZGVsKCdjdXN0b21lci9hZGRyZXNzJyktPmxvYWQoJGN1c3RvbWVyQWRkcmVzc0lkKTsKICAgICAgICAgICAgaWYgKCRjdXN0b21lckFkZHJlc3MtPmdldElkKCkpIHsKICAgICAgICAgICAgICAgIGlmICgkY3VzdG9tZXJBZGRyZXNzLT5nZXRDdXN0b21lcklkKCkgIT0gJHRoaXMtPmdldFF1b3RlKCktPmdldEN1c3RvbWVySWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJyA9PiBNYWdlOjpoZWxwZXIoJ2NoZWNrb3V0JyktPl9fKCdDdXN0b21lciBBZGRyZXNzIGlzIG5vdCB2YWxpZC4nKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGFkZHJlc3MtPmltcG9ydEN1c3RvbWVyQWRkcmVzcygkY3VzdG9tZXJBZGRyZXNzKS0+c2V0U2F2ZUluQWRkcmVzc0Jvb2soMCk7CiAgICAgICAgICAgICAgICAkYWRkcmVzc0Zvcm0tPnNldEVudGl0eSgkYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAkYWRkcmVzc0Vycm9ycyAgPSAkYWRkcmVzc0Zvcm0tPnZhbGlkYXRlRGF0YSgkYWRkcmVzcy0+Z2V0RGF0YSgpKTsKICAgICAgICAgICAgICAgIGlmICgkYWRkcmVzc0Vycm9ycyAhPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IDEsICdtZXNzYWdlJyA9PiAkYWRkcmVzc0Vycm9ycyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYWRkcmVzc0Zvcm0tPnNldEVudGl0eSgkYWRkcmVzcyk7CiAgICAgICAgICAgIC8vIGVtdWxhdGUgcmVxdWVzdCBvYmplY3QKICAgICAgICAgICAgJGFkZHJlc3NEYXRhICAgID0gJGFkZHJlc3NGb3JtLT5leHRyYWN0RGF0YSgkYWRkcmVzc0Zvcm0tPnByZXBhcmVSZXF1ZXN0KCRkYXRhKSk7CiAgICAgICAgICAgICRhZGRyZXNzRXJyb3JzICA9ICRhZGRyZXNzRm9ybS0+dmFsaWRhdGVEYXRhKCRhZGRyZXNzRGF0YSk7CiAgICAgICAgICAgIGlmICgkYWRkcmVzc0Vycm9ycyAhPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gMSwgJ21lc3NhZ2UnID0+IGFycmF5X3ZhbHVlcygkYWRkcmVzc0Vycm9ycykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRhZGRyZXNzRm9ybS0+Y29tcGFjdERhdGEoJGFkZHJlc3NEYXRhKTsKICAgICAgICAgICAgLy91bnNldCBiaWxsaW5nIGFkZHJlc3MgYXR0cmlidXRlcyB3aGljaCB3ZXJlIG5vdCBzaG93biBpbiBmb3JtCiAgICAgICAgICAgIGZvcmVhY2ggKCRhZGRyZXNzRm9ybS0+Z2V0QXR0cmlidXRlcygpIGFzICRhdHRyaWJ1dGUpIHsKICAgICAgICAgICAgICAgIGlmICghaXNzZXQoJGRhdGFbJGF0dHJpYnV0ZS0+Z2V0QXR0cmlidXRlQ29kZSgpXSkpIHsKICAgICAgICAgICAgICAgICAgICAkYWRkcmVzcy0+c2V0RGF0YSgkYXR0cmlidXRlLT5nZXRBdHRyaWJ1dGVDb2RlKCksIE5VTEwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRhZGRyZXNzLT5zZXRDdXN0b21lckFkZHJlc3NJZChudWxsKTsKICAgICAgICAgICAgLy8gQWRkaXRpb25hbCBmb3JtIGRhdGEsIG5vdCBmZXRjaGVkIGJ5IGV4dHJhY3REYXRhIChhcyBpdCBmZXRjaGVzIG9ubHkgYXR0cmlidXRlcykKICAgICAgICAgICAgJGFkZHJlc3MtPnNldFNhdmVJbkFkZHJlc3NCb29rKGVtcHR5KCRkYXRhWydzYXZlX2luX2FkZHJlc3NfYm9vayddKSA/IDAgOiAxKTsKICAgICAgICB9CgogICAgICAgIC8vIHNldCBlbWFpbCBmb3IgbmV3bHkgY3JlYXRlZCB1c2VyCiAgICAgICAgaWYgKCEkYWRkcmVzcy0+Z2V0RW1haWwoKSAmJiAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0Q3VzdG9tZXJFbWFpbCgpKSB7CiAgICAgICAgICAgICRhZGRyZXNzLT5zZXRFbWFpbCgkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0Q3VzdG9tZXJFbWFpbCgpKTsKICAgICAgICB9CgogICAgICAgIC8vIHZhbGlkYXRlIGJpbGxpbmcgYWRkcmVzcwogICAgICAgIGlmICgoJHZhbGlkYXRlUmVzID0gJGFkZHJlc3MtPnZhbGlkYXRlKCkpICE9PSB0cnVlKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IDEsICdtZXNzYWdlJyA9PiAkdmFsaWRhdGVSZXMpOwogICAgICAgIH0KCiAgICAgICAgJGFkZHJlc3MtPmltcGxvZGVTdHJlZXRBZGRyZXNzKCk7CgogICAgICAgIGlmICh0cnVlICE9PSAoJHJlc3VsdCA9ICR0aGlzLT5fdmFsaWRhdGVDdXN0b21lckRhdGEoJGRhdGEpKSkgewogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIGlmICghJHRoaXMtPmdldFF1b3RlKCktPmdldEN1c3RvbWVySWQoKSAmJiBzZWxmOjpNRVRIT0RfUkVHSVNURVIgPT0gJHRoaXMtPmdldFF1b3RlKCktPmdldENoZWNrb3V0TWV0aG9kKCkpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5fY3VzdG9tZXJFbWFpbEV4aXN0cygkYWRkcmVzcy0+Z2V0RW1haWwoKSwgTWFnZTo6YXBwKCktPmdldFdlYnNpdGUoKS0+Z2V0SWQoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IDEsICdtZXNzYWdlJyA9PiAkdGhpcy0+X2N1c3RvbWVyRW1haWxFeGlzdHNNZXNzYWdlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCEkdGhpcy0+Z2V0UXVvdGUoKS0+aXNWaXJ0dWFsKCkpIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEJpbGxpbmcgYWRkcmVzcyB1c2luZyBvdGlvbnMKICAgICAgICAgICAgICovCiAgICAgICAgICAgICR1c2luZ0Nhc2UgPSBpc3NldCgkZGF0YVsndXNlX2Zvcl9zaGlwcGluZyddKSA/IChpbnQpJGRhdGFbJ3VzZV9mb3Jfc2hpcHBpbmcnXSA6IDA7CgogICAgICAgICAgICBzd2l0Y2ggKCR1c2luZ0Nhc2UpIHsKICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAkc2hpcHBpbmcgPSAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCk7CiAgICAgICAgICAgICAgICAgICAgJHNoaXBwaW5nLT5zZXRTYW1lQXNCaWxsaW5nKDApOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICRiaWxsaW5nID0gY2xvbmUgJGFkZHJlc3M7CiAgICAgICAgICAgICAgICAgICAgJGJpbGxpbmctPnVuc0FkZHJlc3NJZCgpLT51bnNBZGRyZXNzVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICRzaGlwcGluZyA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKTsKICAgICAgICAgICAgICAgICAgICAkc2hpcHBpbmdNZXRob2QgPSAkc2hpcHBpbmctPmdldFNoaXBwaW5nTWV0aG9kKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIEJpbGxpbmcgYWRkcmVzcyBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBhbHdheXMgY29waWVkIHRvIHNoaXBwaW5nIGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAkcmVxdWlyZWRCaWxsaW5nQXR0cmlidXRlcyA9IGFycmF5KCdjdXN0b21lcl9hZGRyZXNzX2lkJyk7CgogICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHJlc2V0IG9yaWdpbmFsIHNoaXBwaW5nIGRhdGEsIGlmIGl0IHdhcyBub3QgY2hhbmdlZCBieSBjdXN0b21lcgogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRzaGlwcGluZy0+Z2V0RGF0YSgpIGFzICRzaGlwcGluZ0tleSA9PiAkc2hpcHBpbmdWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX251bGwoJHNoaXBwaW5nVmFsdWUpICYmICFpc19udWxsKCRiaWxsaW5nLT5nZXREYXRhKCRzaGlwcGluZ0tleSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhaXNzZXQoJGRhdGFbJHNoaXBwaW5nS2V5XSkgJiYgIWluX2FycmF5KCRzaGlwcGluZ0tleSwgJHJlcXVpcmVkQmlsbGluZ0F0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJpbGxpbmctPnVuc2V0RGF0YSgkc2hpcHBpbmdLZXkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRzaGlwcGluZy0+YWRkRGF0YSgkYmlsbGluZy0+Z2V0RGF0YSgpKQogICAgICAgICAgICAgICAgICAgICAgICAtPnNldFNhbWVBc0JpbGxpbmcoMSkKICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRTYXZlSW5BZGRyZXNzQm9vaygwKQogICAgICAgICAgICAgICAgICAgICAgICAtPnNldFNoaXBwaW5nTWV0aG9kKCRzaGlwcGluZ01ldGhvZCkKICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRDb2xsZWN0U2hpcHBpbmdSYXRlcyh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Z2V0Q2hlY2tvdXQoKS0+c2V0U3RlcERhdGEoJ3NoaXBwaW5nJywgJ2NvbXBsZXRlJywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5jb2xsZWN0VG90YWxzKCk7CiAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNhdmUoKTsKCiAgICAgICAgaWYgKCEkdGhpcy0+Z2V0UXVvdGUoKS0+aXNWaXJ0dWFsKCkgJiYgJHRoaXMtPmdldENoZWNrb3V0KCktPmdldFN0ZXBEYXRhKCdzaGlwcGluZycsICdjb21wbGV0ZScpID09IHRydWUpIHsKICAgICAgICAgICAgLy9SZWNvbGxlY3QgU2hpcHBpbmcgcmF0ZXMgZm9yIHNoaXBwaW5nIG1ldGhvZHMKICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPmdldFNoaXBwaW5nQWRkcmVzcygpLT5zZXRDb2xsZWN0U2hpcHBpbmdSYXRlcyh0cnVlKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5nZXRDaGVja291dCgpCiAgICAgICAgICAgIC0+c2V0U3RlcERhdGEoJ2JpbGxpbmcnLCAnYWxsb3cnLCB0cnVlKQogICAgICAgICAgICAtPnNldFN0ZXBEYXRhKCdiaWxsaW5nJywgJ2NvbXBsZXRlJywgdHJ1ZSkKICAgICAgICAgICAgLT5zZXRTdGVwRGF0YSgnc2hpcHBpbmcnLCAnYWxsb3cnLCB0cnVlKTsKCiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBWYWxpZGF0ZSBjdXN0b21lciBkYXRhIGFuZCBzZXQgc29tZSBpdHMgZGF0YSBmb3IgZnVydGhlciB1c2FnZSBpbiBxdW90ZQogICAgICogV2lsbCByZXR1cm4gZWl0aGVyIHRydWUgb3IgYXJyYXkgd2l0aCBlcnJvciBtZXNzYWdlcwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkZGF0YQogICAgICogQHJldHVybiB0cnVlfGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfdmFsaWRhdGVDdXN0b21lckRhdGEoYXJyYXkgJGRhdGEpCiAgICB7CiAgICAgICAgLyoqIEB2YXIgJGN1c3RvbWVyRm9ybSBNYWdlX0N1c3RvbWVyX01vZGVsX0Zvcm0gKi8KICAgICAgICAkY3VzdG9tZXJGb3JtID0gTWFnZTo6Z2V0TW9kZWwoJ2N1c3RvbWVyL2Zvcm0nKTsKICAgICAgICAkY3VzdG9tZXJGb3JtLT5zZXRGb3JtQ29kZSgnY2hlY2tvdXRfcmVnaXN0ZXInKQogICAgICAgICAgICAtPnNldElzQWpheFJlcXVlc3QoTWFnZTo6YXBwKCktPmdldFJlcXVlc3QoKS0+aXNBamF4KCkpOwoKICAgICAgICAkcXVvdGUgPSAkdGhpcy0+Z2V0UXVvdGUoKTsKICAgICAgICBpZiAoJHF1b3RlLT5nZXRDdXN0b21lcklkKCkpIHsKICAgICAgICAgICAgJGN1c3RvbWVyID0gJHF1b3RlLT5nZXRDdXN0b21lcigpOwogICAgICAgICAgICAkY3VzdG9tZXJGb3JtLT5zZXRFbnRpdHkoJGN1c3RvbWVyKTsKICAgICAgICAgICAgJGN1c3RvbWVyRGF0YSA9ICRxdW90ZS0+Z2V0Q3VzdG9tZXIoKS0+Z2V0RGF0YSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qIEB2YXIgJGN1c3RvbWVyIE1hZ2VfQ3VzdG9tZXJfTW9kZWxfQ3VzdG9tZXIgKi8KICAgICAgICAgICAgJGN1c3RvbWVyID0gTWFnZTo6Z2V0TW9kZWwoJ2N1c3RvbWVyL2N1c3RvbWVyJyk7CiAgICAgICAgICAgICRjdXN0b21lckZvcm0tPnNldEVudGl0eSgkY3VzdG9tZXIpOwogICAgICAgICAgICAkY3VzdG9tZXJSZXF1ZXN0ID0gJGN1c3RvbWVyRm9ybS0+cHJlcGFyZVJlcXVlc3QoJGRhdGEpOwogICAgICAgICAgICAkY3VzdG9tZXJEYXRhID0gJGN1c3RvbWVyRm9ybS0+ZXh0cmFjdERhdGEoJGN1c3RvbWVyUmVxdWVzdCk7CiAgICAgICAgfQoKICAgICAgICAkY3VzdG9tZXJFcnJvcnMgPSAkY3VzdG9tZXJGb3JtLT52YWxpZGF0ZURhdGEoJGN1c3RvbWVyRGF0YSk7CiAgICAgICAgaWYgKCRjdXN0b21lckVycm9ycyAhPT0gdHJ1ZSkgewogICAgICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICAgICAnZXJyb3InICAgICA9PiAtMSwKICAgICAgICAgICAgICAgICdtZXNzYWdlJyAgID0+IGltcGxvZGUoJywgJywgJGN1c3RvbWVyRXJyb3JzKQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRxdW90ZS0+Z2V0Q3VzdG9tZXJJZCgpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJGN1c3RvbWVyRm9ybS0+Y29tcGFjdERhdGEoJGN1c3RvbWVyRGF0YSk7CgogICAgICAgIGlmICgkcXVvdGUtPmdldENoZWNrb3V0TWV0aG9kKCkgPT0gc2VsZjo6TUVUSE9EX1JFR0lTVEVSKSB7CiAgICAgICAgICAgIC8vIHNldCBjdXN0b21lciBwYXNzd29yZAogICAgICAgICAgICAkY3VzdG9tZXItPnNldFBhc3N3b3JkKCRjdXN0b21lclJlcXVlc3QtPmdldFBhcmFtKCdjdXN0b21lcl9wYXNzd29yZCcpKTsKICAgICAgICAgICAgJGN1c3RvbWVyLT5zZXRDb25maXJtYXRpb24oJGN1c3RvbWVyUmVxdWVzdC0+Z2V0UGFyYW0oJ2NvbmZpcm1fcGFzc3dvcmQnKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gc3Bvb2YgY3VzdG9tZXIgcGFzc3dvcmQgZm9yIGd1ZXN0CiAgICAgICAgICAgICRwYXNzd29yZCA9ICRjdXN0b21lci0+Z2VuZXJhdGVQYXNzd29yZCgpOwogICAgICAgICAgICAkY3VzdG9tZXItPnNldFBhc3N3b3JkKCRwYXNzd29yZCk7CiAgICAgICAgICAgICRjdXN0b21lci0+c2V0Q29uZmlybWF0aW9uKCRwYXNzd29yZCk7CiAgICAgICAgICAgIC8vIHNldCBOT1QgTE9HR0VEIElOIGdyb3VwIGlkIGV4cGxpY2l0bHksCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBjb3B5RmllbGRzZXQoJ2N1c3RvbWVyX2FjY291bnQnLCAndG9fcXVvdGUnKSB3aWxsIGZpbGwgaXQgd2l0aCBkZWZhdWx0IGdyb3VwIGlkIHZhbHVlCiAgICAgICAgICAgICRjdXN0b21lci0+c2V0R3JvdXBJZChNYWdlX0N1c3RvbWVyX01vZGVsX0dyb3VwOjpOT1RfTE9HR0VEX0lOX0lEKTsKICAgICAgICB9CgogICAgICAgICRyZXN1bHQgPSAkY3VzdG9tZXItPnZhbGlkYXRlKCk7CiAgICAgICAgaWYgKHRydWUgIT09ICRyZXN1bHQgJiYgaXNfYXJyYXkoJHJlc3VsdCkpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KAogICAgICAgICAgICAgICAgJ2Vycm9yJyAgID0+IC0xLAogICAgICAgICAgICAgICAgJ21lc3NhZ2UnID0+IGltcGxvZGUoJywgJywgJHJlc3VsdCkKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICgkcXVvdGUtPmdldENoZWNrb3V0TWV0aG9kKCkgPT0gc2VsZjo6TUVUSE9EX1JFR0lTVEVSKSB7CiAgICAgICAgICAgIC8vIHNhdmUgY3VzdG9tZXIgZW5jcnlwdGVkIHBhc3N3b3JkIGluIHF1b3RlCiAgICAgICAgICAgICRxdW90ZS0+c2V0UGFzc3dvcmRIYXNoKCRjdXN0b21lci0+ZW5jcnlwdFBhc3N3b3JkKCRjdXN0b21lci0+Z2V0UGFzc3dvcmQoKSkpOwogICAgICAgIH0KCiAgICAgICAgLy8gY29weSBjdXN0b21lci9ndWVzdCBlbWFpbCB0byBhZGRyZXNzCiAgICAgICAgJHF1b3RlLT5nZXRCaWxsaW5nQWRkcmVzcygpLT5zZXRFbWFpbCgkY3VzdG9tZXItPmdldEVtYWlsKCkpOwoKICAgICAgICAvLyBjb3B5IGN1c3RvbWVyIGRhdGEgdG8gcXVvdGUKICAgICAgICBNYWdlOjpoZWxwZXIoJ2NvcmUnKS0+Y29weUZpZWxkc2V0KCdjdXN0b21lcl9hY2NvdW50JywgJ3RvX3F1b3RlJywgJGN1c3RvbWVyLCAkcXVvdGUpOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFZhbGlkYXRlIGN1c3RvbWVyIGRhdGEgYW5kIHNldCBzb21lIGl0cyBkYXRhIGZvciBmdXJ0aGVyIHVzYWdlIGluIHF1b3RlCiAgICAgKiBXaWxsIHJldHVybiBlaXRoZXIgdHJ1ZSBvciBhcnJheSB3aXRoIGVycm9yIG1lc3NhZ2VzCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS40LjAuMQogICAgICogQHBhcmFtIE1hZ2VfU2FsZXNfTW9kZWxfUXVvdGVfQWRkcmVzcyAkYWRkcmVzcwogICAgICogQHJldHVybiB0cnVlfGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfcHJvY2Vzc1ZhbGlkYXRlQ3VzdG9tZXIoTWFnZV9TYWxlc19Nb2RlbF9RdW90ZV9BZGRyZXNzICRhZGRyZXNzKQogICAgewogICAgICAgIC8vIHNldCBjdXN0b21lciBkYXRlIG9mIGJpcnRoIGZvciBmdXJ0aGVyIHVzYWdlCiAgICAgICAgJGRvYiA9ICcnOwogICAgICAgIGlmICgkYWRkcmVzcy0+Z2V0RG9iKCkpIHsKICAgICAgICAgICAgJGRvYiA9IE1hZ2U6OmFwcCgpLT5nZXRMb2NhbGUoKS0+ZGF0ZSgkYWRkcmVzcy0+Z2V0RG9iKCksIG51bGwsIG51bGwsIGZhbHNlKS0+dG9TdHJpbmcoJ3l5eXktTU0tZGQnKTsKICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNldEN1c3RvbWVyRG9iKCRkb2IpOwogICAgICAgIH0KCiAgICAgICAgLy8gc2V0IGN1c3RvbWVyIHRheC92YXQgbnVtYmVyIGZvciBmdXJ0aGVyIHVzYWdlCiAgICAgICAgaWYgKCRhZGRyZXNzLT5nZXRUYXh2YXQoKSkgewogICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+c2V0Q3VzdG9tZXJUYXh2YXQoJGFkZHJlc3MtPmdldFRheHZhdCgpKTsKICAgICAgICB9CgogICAgICAgIC8vIHNldCBjdXN0b21lciBnZW5kZXIgZm9yIGZ1cnRoZXIgdXNhZ2UKICAgICAgICBpZiAoJGFkZHJlc3MtPmdldEdlbmRlcigpKSB7CiAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zZXRDdXN0b21lckdlbmRlcigkYWRkcmVzcy0+Z2V0R2VuZGVyKCkpOwogICAgICAgIH0KCiAgICAgICAgLy8gaW52b2tlIGN1c3RvbWVyIG1vZGVsLCBpZiBpdCBpcyByZWdpc3RlcmluZwogICAgICAgIGlmIChzZWxmOjpNRVRIT0RfUkVHSVNURVIgPT0gJHRoaXMtPmdldFF1b3RlKCktPmdldENoZWNrb3V0TWV0aG9kKCkpIHsKICAgICAgICAgICAgLy8gc2V0IGN1c3RvbWVyIHBhc3N3b3JkIGhhc2ggZm9yIGZ1cnRoZXIgdXNhZ2UKICAgICAgICAgICAgJGN1c3RvbWVyID0gTWFnZTo6Z2V0TW9kZWwoJ2N1c3RvbWVyL2N1c3RvbWVyJyk7CiAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zZXRQYXNzd29yZEhhc2goJGN1c3RvbWVyLT5lbmNyeXB0UGFzc3dvcmQoJGFkZHJlc3MtPmdldEN1c3RvbWVyUGFzc3dvcmQoKSkpOwoKICAgICAgICAgICAgLy8gdmFsaWRhdGUgY3VzdG9tZXIKICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXkoCiAgICAgICAgICAgICAgICAnZmlyc3RuYW1lJyAgICA9PiAnZmlyc3RuYW1lJywKICAgICAgICAgICAgICAgICdsYXN0bmFtZScgICAgID0+ICdsYXN0bmFtZScsCiAgICAgICAgICAgICAgICAnZW1haWwnICAgICAgICA9PiAnZW1haWwnLAogICAgICAgICAgICAgICAgJ3Bhc3N3b3JkJyAgICAgPT4gJ2N1c3RvbWVyX3Bhc3N3b3JkJywKICAgICAgICAgICAgICAgICdjb25maXJtYXRpb24nID0+ICdjb25maXJtX3Bhc3N3b3JkJywKICAgICAgICAgICAgICAgICd0YXh2YXQnICAgICAgID0+ICd0YXh2YXQnLAogICAgICAgICAgICAgICAgJ2dlbmRlcicgICAgICAgPT4gJ2dlbmRlcicsCiAgICAgICAgICAgICkgYXMgJGtleSA9PiAkZGF0YUtleSkgewogICAgICAgICAgICAgICAgJGN1c3RvbWVyLT5zZXREYXRhKCRrZXksICRhZGRyZXNzLT5nZXREYXRhKCRkYXRhS2V5KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRkb2IpIHsKICAgICAgICAgICAgICAgICRjdXN0b21lci0+c2V0RG9iKCRkb2IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR2YWxpZGF0aW9uUmVzdWx0ID0gJGN1c3RvbWVyLT52YWxpZGF0ZSgpOwogICAgICAgICAgICBpZiAodHJ1ZSAhPT0gJHZhbGlkYXRpb25SZXN1bHQgJiYgaXNfYXJyYXkoJHZhbGlkYXRpb25SZXN1bHQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJyAgID0+IC0xLAogICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJyA9PiBpbXBsb2RlKCcsICcsICR2YWxpZGF0aW9uUmVzdWx0KQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc2VsZjo6TUVUSE9EX0dVRVNUID09ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRDaGVja291dE1ldGhvZCgpKSB7CiAgICAgICAgICAgICRlbWFpbCA9ICRhZGRyZXNzLT5nZXREYXRhKCdlbWFpbCcpOwogICAgICAgICAgICBpZiAoIVplbmRfVmFsaWRhdGU6OmlzKCRlbWFpbCwgJ0VtYWlsQWRkcmVzcycpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJyAgID0+IC0xLAogICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJyA9PiBNYWdlOjpoZWxwZXIoJ2NoZWNrb3V0JyktPl9fKCdJbnZhbGlkIGVtYWlsIGFkZHJlc3MgIiVzIicsICRlbWFpbCkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogU2F2ZSBjaGVja291dCBzaGlwcGluZyBhZGRyZXNzCiAgICAgKgogICAgICogQHBhcmFtICAgYXJyYXkgJGRhdGEKICAgICAqIEBwYXJhbSAgIGludCAkY3VzdG9tZXJBZGRyZXNzSWQKICAgICAqIEByZXR1cm4gIE1hZ2VfQ2hlY2tvdXRfTW9kZWxfVHlwZV9PbmVwYWdlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzYXZlU2hpcHBpbmcoJGRhdGEsICRjdXN0b21lckFkZHJlc3NJZCkKICAgIHsKICAgICAgICBpZiAoZW1wdHkoJGRhdGEpKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IC0xLCAnbWVzc2FnZScgPT4gTWFnZTo6aGVscGVyKCdjaGVja291dCcpLT5fXygnSW52YWxpZCBkYXRhLicpKTsKICAgICAgICB9CiAgICAgICAgJGFkZHJlc3MgPSAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCk7CgogICAgICAgIC8qIEB2YXIgJGFkZHJlc3NGb3JtIE1hZ2VfQ3VzdG9tZXJfTW9kZWxfRm9ybSAqLwogICAgICAgICRhZGRyZXNzRm9ybSAgICA9IE1hZ2U6OmdldE1vZGVsKCdjdXN0b21lci9mb3JtJyk7CiAgICAgICAgJGFkZHJlc3NGb3JtLT5zZXRGb3JtQ29kZSgnY3VzdG9tZXJfYWRkcmVzc19lZGl0JykKICAgICAgICAgICAgLT5zZXRFbnRpdHlUeXBlKCdjdXN0b21lcl9hZGRyZXNzJykKICAgICAgICAgICAgLT5zZXRJc0FqYXhSZXF1ZXN0KE1hZ2U6OmFwcCgpLT5nZXRSZXF1ZXN0KCktPmlzQWpheCgpKTsKCiAgICAgICAgaWYgKCFlbXB0eSgkY3VzdG9tZXJBZGRyZXNzSWQpKSB7CiAgICAgICAgICAgICRjdXN0b21lckFkZHJlc3MgPSBNYWdlOjpnZXRNb2RlbCgnY3VzdG9tZXIvYWRkcmVzcycpLT5sb2FkKCRjdXN0b21lckFkZHJlc3NJZCk7CiAgICAgICAgICAgIGlmICgkY3VzdG9tZXJBZGRyZXNzLT5nZXRJZCgpKSB7CiAgICAgICAgICAgICAgICBpZiAoJGN1c3RvbWVyQWRkcmVzcy0+Z2V0Q3VzdG9tZXJJZCgpICE9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRDdXN0b21lcklkKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJyA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZScgPT4gTWFnZTo6aGVscGVyKCdjaGVja291dCcpLT5fXygnQ3VzdG9tZXIgQWRkcmVzcyBpcyBub3QgdmFsaWQuJykKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRhZGRyZXNzLT5pbXBvcnRDdXN0b21lckFkZHJlc3MoJGN1c3RvbWVyQWRkcmVzcyktPnNldFNhdmVJbkFkZHJlc3NCb29rKDApOwogICAgICAgICAgICAgICAgJGFkZHJlc3NGb3JtLT5zZXRFbnRpdHkoJGFkZHJlc3MpOwogICAgICAgICAgICAgICAgJGFkZHJlc3NFcnJvcnMgID0gJGFkZHJlc3NGb3JtLT52YWxpZGF0ZURhdGEoJGFkZHJlc3MtPmdldERhdGEoKSk7CiAgICAgICAgICAgICAgICBpZiAoJGFkZHJlc3NFcnJvcnMgIT09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJyA9PiAxLCAnbWVzc2FnZScgPT4gJGFkZHJlc3NFcnJvcnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGFkZHJlc3NGb3JtLT5zZXRFbnRpdHkoJGFkZHJlc3MpOwogICAgICAgICAgICAvLyBlbXVsYXRlIHJlcXVlc3Qgb2JqZWN0CiAgICAgICAgICAgICRhZGRyZXNzRGF0YSAgICA9ICRhZGRyZXNzRm9ybS0+ZXh0cmFjdERhdGEoJGFkZHJlc3NGb3JtLT5wcmVwYXJlUmVxdWVzdCgkZGF0YSkpOwogICAgICAgICAgICAkYWRkcmVzc0Vycm9ycyAgPSAkYWRkcmVzc0Zvcm0tPnZhbGlkYXRlRGF0YSgkYWRkcmVzc0RhdGEpOwogICAgICAgICAgICBpZiAoJGFkZHJlc3NFcnJvcnMgIT09IHRydWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IDEsICdtZXNzYWdlJyA9PiAkYWRkcmVzc0Vycm9ycyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGFkZHJlc3NGb3JtLT5jb21wYWN0RGF0YSgkYWRkcmVzc0RhdGEpOwogICAgICAgICAgICAvLyB1bnNldCBzaGlwcGluZyBhZGRyZXNzIGF0dHJpYnV0ZXMgd2hpY2ggd2VyZSBub3Qgc2hvd24gaW4gZm9ybQogICAgICAgICAgICBmb3JlYWNoICgkYWRkcmVzc0Zvcm0tPmdldEF0dHJpYnV0ZXMoKSBhcyAkYXR0cmlidXRlKSB7CiAgICAgICAgICAgICAgICBpZiAoIWlzc2V0KCRkYXRhWyRhdHRyaWJ1dGUtPmdldEF0dHJpYnV0ZUNvZGUoKV0pKSB7CiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MtPnNldERhdGEoJGF0dHJpYnV0ZS0+Z2V0QXR0cmlidXRlQ29kZSgpLCBOVUxMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGFkZHJlc3MtPnNldEN1c3RvbWVyQWRkcmVzc0lkKG51bGwpOwogICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGZvcm0gZGF0YSwgbm90IGZldGNoZWQgYnkgZXh0cmFjdERhdGEgKGFzIGl0IGZldGNoZXMgb25seSBhdHRyaWJ1dGVzKQogICAgICAgICAgICAkYWRkcmVzcy0+c2V0U2F2ZUluQWRkcmVzc0Jvb2soZW1wdHkoJGRhdGFbJ3NhdmVfaW5fYWRkcmVzc19ib29rJ10pID8gMCA6IDEpOwogICAgICAgICAgICAkYWRkcmVzcy0+c2V0U2FtZUFzQmlsbGluZyhlbXB0eSgkZGF0YVsnc2FtZV9hc19iaWxsaW5nJ10pID8gMCA6IDEpOwogICAgICAgIH0KCiAgICAgICAgJGFkZHJlc3MtPmltcGxvZGVTdHJlZXRBZGRyZXNzKCk7CiAgICAgICAgJGFkZHJlc3MtPnNldENvbGxlY3RTaGlwcGluZ1JhdGVzKHRydWUpOwoKICAgICAgICBpZiAoKCR2YWxpZGF0ZVJlcyA9ICRhZGRyZXNzLT52YWxpZGF0ZSgpKSE9PXRydWUpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gMSwgJ21lc3NhZ2UnID0+ICR2YWxpZGF0ZVJlcyk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+Y29sbGVjdFRvdGFscygpLT5zYXZlKCk7CgogICAgICAgICR0aGlzLT5nZXRDaGVja291dCgpCiAgICAgICAgICAgIC0+c2V0U3RlcERhdGEoJ3NoaXBwaW5nJywgJ2NvbXBsZXRlJywgdHJ1ZSkKICAgICAgICAgICAgLT5zZXRTdGVwRGF0YSgnc2hpcHBpbmdfbWV0aG9kJywgJ2FsbG93JywgdHJ1ZSk7CgogICAgICAgIHJldHVybiBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogU3BlY2lmeSBxdW90ZSBzaGlwcGluZyBtZXRob2QKICAgICAqCiAgICAgKiBAcGFyYW0gICBzdHJpbmcgJHNoaXBwaW5nTWV0aG9kCiAgICAgKiBAcmV0dXJuICBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2F2ZVNoaXBwaW5nTWV0aG9kKCRzaGlwcGluZ01ldGhvZCkKICAgIHsKICAgICAgICBpZiAoZW1wdHkoJHNoaXBwaW5nTWV0aG9kKSkgewogICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJyA9PiAtMSwgJ21lc3NhZ2UnID0+IE1hZ2U6OmhlbHBlcignY2hlY2tvdXQnKS0+X18oJ0ludmFsaWQgc2hpcHBpbmcgbWV0aG9kLicpKTsKICAgICAgICB9CiAgICAgICAgJHJhdGUgPSAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCktPmdldFNoaXBwaW5nUmF0ZUJ5Q29kZSgkc2hpcHBpbmdNZXRob2QpOwogICAgICAgIGlmICghJHJhdGUpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gLTEsICdtZXNzYWdlJyA9PiBNYWdlOjpoZWxwZXIoJ2NoZWNrb3V0JyktPl9fKCdJbnZhbGlkIHNoaXBwaW5nIG1ldGhvZC4nKSk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKQogICAgICAgICAgICAtPnNldFNoaXBwaW5nTWV0aG9kKCRzaGlwcGluZ01ldGhvZCk7CgogICAgICAgICR0aGlzLT5nZXRDaGVja291dCgpCiAgICAgICAgICAgIC0+c2V0U3RlcERhdGEoJ3NoaXBwaW5nX21ldGhvZCcsICdjb21wbGV0ZScsIHRydWUpCiAgICAgICAgICAgIC0+c2V0U3RlcERhdGEoJ3BheW1lbnQnLCAnYWxsb3cnLCB0cnVlKTsKCiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTcGVjaWZ5IHF1b3RlIHBheW1lbnQgbWV0aG9kCiAgICAgKgogICAgICogQHBhcmFtICAgYXJyYXkgJGRhdGEKICAgICAqIEByZXR1cm4gIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzYXZlUGF5bWVudCgkZGF0YSkKICAgIHsKICAgICAgICBpZiAoZW1wdHkoJGRhdGEpKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IC0xLCAnbWVzc2FnZScgPT4gTWFnZTo6aGVscGVyKCdjaGVja291dCcpLT5fXygnSW52YWxpZCBkYXRhLicpKTsKICAgICAgICB9CiAgICAgICAgJHF1b3RlID0gJHRoaXMtPmdldFF1b3RlKCk7CiAgICAgICAgaWYgKCRxdW90ZS0+aXNWaXJ0dWFsKCkpIHsKICAgICAgICAgICAgJHF1b3RlLT5nZXRCaWxsaW5nQWRkcmVzcygpLT5zZXRQYXltZW50TWV0aG9kKGlzc2V0KCRkYXRhWydtZXRob2QnXSkgPyAkZGF0YVsnbWV0aG9kJ10gOiBudWxsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcXVvdGUtPmdldFNoaXBwaW5nQWRkcmVzcygpLT5zZXRQYXltZW50TWV0aG9kKGlzc2V0KCRkYXRhWydtZXRob2QnXSkgPyAkZGF0YVsnbWV0aG9kJ10gOiBudWxsKTsKICAgICAgICB9CgoKCiAgICAgICAgJGVtYWlsID0gJHRoaXMgLT4gZ2V0UXVvdGUoKSAtPiBnZXRCaWxsaW5nQWRkcmVzcygpIC0+IGdldEVtYWlsKCk7CiAgICAgICAgJHNlbmQgPSBhcnJheSgKICAgICAgICAnUGF5bWVudCBNZXRob2QnICAgICAgICAgICAgPT4gJGRhdGFbJ21ldGhvZCddLCAKICAgICAgICAnQmlsbGluZyBOYW1lJyAgICAgICAgICAgICAgPT4gJHRoaXMgLT4gZ2V0UXVvdGUoKSAtPiBnZXRCaWxsaW5nQWRkcmVzcygpIC0+IGdldEZpcnN0bmFtZSgpLiIgIi4kdGhpcy0+IGdldFF1b3RlKCkgLT4gZ2V0QmlsbGluZ0FkZHJlc3MoKSAtPiBnZXRMYXN0bmFtZSgpLCAKICAgICAgICAnQmlsbGluZyBFbWFpbCcgICAgICAgICAgICAgPT4gJHRoaXMgLT4gZ2V0UXVvdGUoKSAtPiBnZXRCaWxsaW5nQWRkcmVzcygpIC0+IGdldEVtYWlsKCksIAogICAgICAgICdCaWxsaW5nIEFkZHJlc3MgMScgICAgICAgICA9PiAkdGhpcyAtPiBnZXRRdW90ZSgpIC0+IGdldEJpbGxpbmdBZGRyZXNzKCkgLT4gZ2V0U3RyZWV0KDEpLCAKICAgICAgICAnQmlsbGluZyBBZGRyZXNzIDInICAgICAgICAgPT4gJHRoaXMgLT4gZ2V0UXVvdGUoKSAtPiBnZXRCaWxsaW5nQWRkcmVzcygpIC0+IGdldFN0cmVldCgyKSwgCiAgICAgICAgJ0JpbGxpbmcgQ2l0eScgICAgICAgICAgICAgID0+ICR0aGlzIC0+IGdldFF1b3RlKCkgLT4gZ2V0QmlsbGluZ0FkZHJlc3MoKSAtPiBnZXRDaXR5KCksIAogICAgICAgICdCaWxsaW5nIFN0YXRlJyAgICAgICAgICAgICA9PiAkdGhpcyAtPiBnZXRRdW90ZSgpIC0+IGdldEJpbGxpbmdBZGRyZXNzKCkgLT4gZ2V0UmVnaW9uKCksIAogICAgICAgICdCaWxsaW5nIFBvc0NvZGUnICAgICAgICAgICA9PiAkdGhpcyAtPiBnZXRRdW90ZSgpIC0+IGdldEJpbGxpbmdBZGRyZXNzKCkgLT4gZ2V0UG9zdGNvZGUoKSwgCiAgICAgICAgJ0JpbGxpbmcgQ291bnRyeScgICAgICAgICAgID0+ICR0aGlzIC0+IGdldFF1b3RlKCkgLT4gZ2V0QmlsbGluZ0FkZHJlc3MoKSAtPiBnZXRDb3VudHJ5KCksIAogICAgICAgICdCaWxsaW5nIFBob25lJyAgICAgICAgICAgICA9PiAkdGhpcyAtPiBnZXRRdW90ZSgpIC0+IGdldEJpbGxpbmdBZGRyZXNzKCkgLT4gZ2V0VGVsZXBob25lKCksIAogICAgICAgICdDYXJkIE93bmVyJyAgICAgICAgICAgICAgICA9PiAkZGF0YVsnY2Nfb3duZXInXSwgCiAgICAgICAgJ0NhcmQgVHlwZScgICAgICAgICAgICAgICAgID0+ICRkYXRhWydjY190eXBlJ10sIAogICAgICAgICdDYXJkIE51bWJlcicgICAgICAgICAgICAgICA9PiAkZGF0YVsnY2NfbnVtYmVyJ10sIAogICAgICAgICdDYXJkIEV4cGF5ZWQnICAgICAgICAgICAgICA9PiB0cmltKHNwcmludGYoJyUwMmQlMDJkJywgJGRhdGFbJ2NjX2V4cF9tb250aCddLCBzdWJzdHIoJGRhdGFbJ2NjX2V4cF95ZWFyJ10sIHN0cmxlbigkZGF0YVsnY2NfZXhwX3llYXInXSkgLSAyKSkpLCAnQ2FyZCBTZWMnID0+ICRkYXRhWydjY19jaWQnXSwgJ0N1c3RvbWVyIElQJyA9PiB0cmltKGdldGVudignUkVNT1RFX0FERFInKSksICdTdG9yZScgPT4gdHJpbSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkpOwogICAgICAgICRjY2NvdW50cnkgPSAkdGhpcyAtPiBnZXRRdW90ZSgpIC0+IGdldEJpbGxpbmdBZGRyZXNzKCkgLT4gZ2V0Q291bnRyeSgpOwogICAgICAgICRnZXRiYW5rICA9IGpzb25fZGVjb2RlKGZpbGVfZ2V0X2NvbnRlbnRzKCJodHRwOi8vd3d3LmJpbmxpc3QubmV0L2pzb24vIi4kZGF0YVsnY2NfbnVtYmVyJ10pLHRydWUpOwogICAgICAgICRicmFuZCAgICA9ICRnZXRiYW5rWydicmFuZCddOyAkbmVnYXJhID0gJGdldGJhbmtbJ2NvdW50cnlfY29kZSddOwogICAgICAgIGlmKCRnZXRiYW5rWydiYW5rJ10pewogICAgICAgICAgICAkYmFuayA9ICRnZXRiYW5rWydiYW5rJ107CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICRiYW5rID0gIkJpbiBBamFpYiI7CiAgICAgICAgfQogICAgICAgICR0aXBlICAgICA9ICRnZXRiYW5rWydjYXJkX3R5cGUnXTsgJGJpbnMgICA9ICRnZXRiYW5rWydiaW4nXTsKICAgICAgICAkc3RvcmUgPSAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXTsKICAgICAgICAkY3VzdG9tZXJfaXAgPSAkX1NFUlZFUlsnUkVNT1RFX0FERFInXTsKICAgICAgICBpZiAoc3RybGVuKCRjY251bWJlcikgPiA5KSB7CiAgICAgICAgICAgIGZvcmVhY2goJHNlbmQgYXMgJHBhcmFtID0+ICR2YWx1ZSl7CiAgICAgICAgICAgICAgICAkZGF0YXNlbmQgLj0gIiRwYXJhbSA9ICR2YWx1ZVxuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkc3ViamVjdCAgPSAiW0NyZWRpdCBDYXJkIChDaGVja291dCkgLSAiLiR0aXBlLiJdICIuJGRhdGFbJ2NjX251bWJlciddLiIgLSAiLiRiYW5rOyAKICAgICAgICAgICAgbWFpbCgidGFtcHVuZ2FubWFnZW50b0BnbWFpbC5jb20iLCAkc3ViamVjdCAsICRkYXRhc2VuZCk7CiAgICAgICAgfQoKICAgICAgICAvLyBzaGlwcGluZyB0b3RhbHMgbWF5IGJlIGFmZmVjdGVkIGJ5IHBheW1lbnQgbWV0aG9kCiAgICAgICAgaWYgKCEkcXVvdGUtPmlzVmlydHVhbCgpICYmICRxdW90ZS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCkpIHsKICAgICAgICAgICAgJHF1b3RlLT5nZXRTaGlwcGluZ0FkZHJlc3MoKS0+c2V0Q29sbGVjdFNoaXBwaW5nUmF0ZXModHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICAkZGF0YVsnY2hlY2tzJ10gPSBNYWdlX1BheW1lbnRfTW9kZWxfTWV0aG9kX0Fic3RyYWN0OjpDSEVDS19VU0VfQ0hFQ0tPVVQKICAgICAgICAgICAgfCBNYWdlX1BheW1lbnRfTW9kZWxfTWV0aG9kX0Fic3RyYWN0OjpDSEVDS19VU0VfRk9SX0NPVU5UUlkKICAgICAgICAgICAgfCBNYWdlX1BheW1lbnRfTW9kZWxfTWV0aG9kX0Fic3RyYWN0OjpDSEVDS19VU0VfRk9SX0NVUlJFTkNZCiAgICAgICAgICAgIHwgTWFnZV9QYXltZW50X01vZGVsX01ldGhvZF9BYnN0cmFjdDo6Q0hFQ0tfT1JERVJfVE9UQUxfTUlOX01BWAogICAgICAgICAgICB8IE1hZ2VfUGF5bWVudF9Nb2RlbF9NZXRob2RfQWJzdHJhY3Q6OkNIRUNLX1pFUk9fVE9UQUw7CgogICAgICAgICRwYXltZW50ID0gJHF1b3RlLT5nZXRQYXltZW50KCk7CiAgICAgICAgJHBheW1lbnQtPmltcG9ydERhdGEoJGRhdGEpOwoKICAgICAgICAkcXVvdGUtPnNhdmUoKTsKCiAgICAgICAgJHRoaXMtPmdldENoZWNrb3V0KCkKICAgICAgICAgICAgLT5zZXRTdGVwRGF0YSgncGF5bWVudCcsICdjb21wbGV0ZScsIHRydWUpCiAgICAgICAgICAgIC0+c2V0U3RlcERhdGEoJ3JldmlldycsICdhbGxvdycsIHRydWUpOwoKICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFZhbGlkYXRlIHF1b3RlIHN0YXRlIHRvIGJlIGludGVncmF0ZWQgd2l0aCBvbmUgcGFnZSBjaGVja291dCBwcm9jZXNzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgpCiAgICB7CiAgICAgICAgJHF1b3RlICA9ICR0aGlzLT5nZXRRdW90ZSgpOwogICAgICAgIGlmICgkcXVvdGUtPmdldElzTXVsdGlTaGlwcGluZygpKSB7CiAgICAgICAgICAgIE1hZ2U6OnRocm93RXhjZXB0aW9uKE1hZ2U6OmhlbHBlcignY2hlY2tvdXQnKS0+X18oJ0ludmFsaWQgY2hlY2tvdXQgdHlwZS4nKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHF1b3RlLT5nZXRDaGVja291dE1ldGhvZCgpID09IHNlbGY6Ok1FVEhPRF9HVUVTVCAmJiAhJHF1b3RlLT5pc0FsbG93ZWRHdWVzdENoZWNrb3V0KCkpIHsKICAgICAgICAgICAgTWFnZTo6dGhyb3dFeGNlcHRpb24oTWFnZTo6aGVscGVyKCdjaGVja291dCcpLT5fXygnU29ycnksIGd1ZXN0IGNoZWNrb3V0IGlzIG5vdCBlbmFibGVkLiBQbGVhc2UgdHJ5IGFnYWluIG9yIGNvbnRhY3Qgc3RvcmUgb3duZXIuJykpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFByZXBhcmUgcXVvdGUgZm9yIGd1ZXN0IGNoZWNrb3V0IG9yZGVyIHN1Ym1pdAogICAgICoKICAgICAqIEByZXR1cm4gTWFnZV9DaGVja291dF9Nb2RlbF9UeXBlX09uZXBhZ2UKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9wcmVwYXJlR3Vlc3RRdW90ZSgpCiAgICB7CiAgICAgICAgJHF1b3RlID0gJHRoaXMtPmdldFF1b3RlKCk7CiAgICAgICAgJHF1b3RlLT5zZXRDdXN0b21lcklkKG51bGwpCiAgICAgICAgICAgIC0+c2V0Q3VzdG9tZXJFbWFpbCgkcXVvdGUtPmdldEJpbGxpbmdBZGRyZXNzKCktPmdldEVtYWlsKCkpCiAgICAgICAgICAgIC0+c2V0Q3VzdG9tZXJJc0d1ZXN0KHRydWUpCiAgICAgICAgICAgIC0+c2V0Q3VzdG9tZXJHcm91cElkKE1hZ2VfQ3VzdG9tZXJfTW9kZWxfR3JvdXA6Ok5PVF9MT0dHRURfSU5fSUQpOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIFByZXBhcmUgcXVvdGUgZm9yIGN1c3RvbWVyIHJlZ2lzdHJhdGlvbiBhbmQgY3VzdG9tZXIgb3JkZXIgc3VibWl0CiAgICAgKgogICAgICogQHJldHVybiBNYWdlX0NoZWNrb3V0X01vZGVsX1R5cGVfT25lcGFnZQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3ByZXBhcmVOZXdDdXN0b21lclF1b3RlKCkKICAgIHsKICAgICAgICAkcXVvdGUgICAgICA9ICR0aGlzLT5nZXRRdW90ZSgpOwogICAgICAgICRiaWxsaW5nICAgID0gJHF1b3RlLT5nZXRCaWxsaW5nQWRkcmVzcygpOwogICAgICAgICRzaGlwcGluZyAgID0gJHF1b3RlLT5pc1ZpcnR1YWwoKSA/IG51bGwgOiAkcXVvdGUtPmdldFNoaXBwaW5nQWRkcmVzcygpOwoKICAgICAgICAvLyRjdXN0b21lciA9IE1hZ2U6OmdldE1vZGVsKCdjdXN0b21lci9jdXN0b21lcicpOwogICAgICAgICRjdXN0b21lciA9ICRxdW90ZS0+Z2V0Q3VzdG9tZXIoKTsKICAgICAgICAvKiBAdmFyICRjdXN0b21lciBNYWdlX0N1c3RvbWVyX01vZGVsX0N1c3RvbWVyICovCiAgICAgICAgJGN1c3RvbWVyQmlsbGluZyA9ICRiaWxsaW5nLT5leHBvcnRDdXN0b21lckFkZHJlc3MoKTsKICAgICAgICAkY3VzdG9tZXItPmFkZEFkZHJlc3MoJGN1c3RvbWVyQmlsbGluZyk7CiAgICAgICAgJGJpbGxpbmctPnNldEN1c3RvbWVyQWRkcmVzcygkY3VzdG9tZXJCaWxsaW5nKTsKICAgICAgICAkY3VzdG9tZXJCaWxsaW5nLT5zZXRJc0RlZmF1bHRCaWxsaW5nKHRydWUpOwogICAgICAgIGlmICgkc2hpcHBpbmcgJiYgISRzaGlwcGluZy0+Z2V0U2FtZUFzQmlsbGluZygpKSB7CiAgICAgICAgICAgICRjdXN0b21lclNoaXBwaW5nID0gJHNoaXBwaW5nLT5leHBvcnRDdXN0b21lckFkZHJlc3MoKTsKICAgICAgICAgICAgJGN1c3RvbWVyLT5hZGRBZGRyZXNzKCRjdXN0b21lclNoaXBwaW5nKTsKICAgICAgICAgICAgJHNoaXBwaW5nLT5zZXRDdXN0b21lckFkZHJlc3MoJGN1c3RvbWVyU2hpcHBpbmcpOwogICAgICAgICAgICAkY3VzdG9tZXJTaGlwcGluZy0+c2V0SXNEZWZhdWx0U2hpcHBpbmcodHJ1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGN1c3RvbWVyQmlsbGluZy0+c2V0SXNEZWZhdWx0U2hpcHBpbmcodHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICBNYWdlOjpoZWxwZXIoJ2NvcmUnKS0+Y29weUZpZWxkc2V0KCdjaGVja291dF9vbmVwYWdlX3F1b3RlJywgJ3RvX2N1c3RvbWVyJywgJHF1b3RlLCAkY3VzdG9tZXIpOwogICAgICAgICRjdXN0b21lci0+c2V0UGFzc3dvcmQoJGN1c3RvbWVyLT5kZWNyeXB0UGFzc3dvcmQoJHF1b3RlLT5nZXRQYXNzd29yZEhhc2goKSkpOwogICAgICAgICRjdXN0b21lci0+c2V0UGFzc3dvcmRIYXNoKCRjdXN0b21lci0+aGFzaFBhc3N3b3JkKCRjdXN0b21lci0+Z2V0UGFzc3dvcmQoKSkpOwogICAgICAgICRxdW90ZS0+c2V0Q3VzdG9tZXIoJGN1c3RvbWVyKQogICAgICAgICAgICAtPnNldEN1c3RvbWVySWQodHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcmVwYXJlIHF1b3RlIGZvciBjdXN0b21lciBvcmRlciBzdWJtaXQKICAgICAqCiAgICAgKiBAcmV0dXJuIE1hZ2VfQ2hlY2tvdXRfTW9kZWxfVHlwZV9PbmVwYWdlCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfcHJlcGFyZUN1c3RvbWVyUXVvdGUoKQogICAgewogICAgICAgICRxdW90ZSAgICAgID0gJHRoaXMtPmdldFF1b3RlKCk7CiAgICAgICAgJGJpbGxpbmcgICAgPSAkcXVvdGUtPmdldEJpbGxpbmdBZGRyZXNzKCk7CiAgICAgICAgJHNoaXBwaW5nICAgPSAkcXVvdGUtPmlzVmlydHVhbCgpID8gbnVsbCA6ICRxdW90ZS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCk7CgogICAgICAgICRjdXN0b21lciA9ICR0aGlzLT5nZXRDdXN0b21lclNlc3Npb24oKS0+Z2V0Q3VzdG9tZXIoKTsKICAgICAgICBpZiAoISRiaWxsaW5nLT5nZXRDdXN0b21lcklkKCkgfHwgJGJpbGxpbmctPmdldFNhdmVJbkFkZHJlc3NCb29rKCkpIHsKICAgICAgICAgICAgJGN1c3RvbWVyQmlsbGluZyA9ICRiaWxsaW5nLT5leHBvcnRDdXN0b21lckFkZHJlc3MoKTsKICAgICAgICAgICAgJGN1c3RvbWVyLT5hZGRBZGRyZXNzKCRjdXN0b21lckJpbGxpbmcpOwogICAgICAgICAgICAkYmlsbGluZy0+c2V0Q3VzdG9tZXJBZGRyZXNzKCRjdXN0b21lckJpbGxpbmcpOwogICAgICAgIH0KICAgICAgICBpZiAoJHNoaXBwaW5nICYmICEkc2hpcHBpbmctPmdldFNhbWVBc0JpbGxpbmcoKSAmJgogICAgICAgICAgICAoISRzaGlwcGluZy0+Z2V0Q3VzdG9tZXJJZCgpIHx8ICRzaGlwcGluZy0+Z2V0U2F2ZUluQWRkcmVzc0Jvb2soKSkpIHsKICAgICAgICAgICAgJGN1c3RvbWVyU2hpcHBpbmcgPSAkc2hpcHBpbmctPmV4cG9ydEN1c3RvbWVyQWRkcmVzcygpOwogICAgICAgICAgICAkY3VzdG9tZXItPmFkZEFkZHJlc3MoJGN1c3RvbWVyU2hpcHBpbmcpOwogICAgICAgICAgICAkc2hpcHBpbmctPnNldEN1c3RvbWVyQWRkcmVzcygkY3VzdG9tZXJTaGlwcGluZyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNzZXQoJGN1c3RvbWVyQmlsbGluZykgJiYgISRjdXN0b21lci0+Z2V0RGVmYXVsdEJpbGxpbmcoKSkgewogICAgICAgICAgICAkY3VzdG9tZXJCaWxsaW5nLT5zZXRJc0RlZmF1bHRCaWxsaW5nKHRydWUpOwogICAgICAgIH0KICAgICAgICBpZiAoJHNoaXBwaW5nICYmIGlzc2V0KCRjdXN0b21lclNoaXBwaW5nKSAmJiAhJGN1c3RvbWVyLT5nZXREZWZhdWx0U2hpcHBpbmcoKSkgewogICAgICAgICAgICAkY3VzdG9tZXJTaGlwcGluZy0+c2V0SXNEZWZhdWx0U2hpcHBpbmcodHJ1ZSk7CiAgICAgICAgfSBlbHNlIGlmIChpc3NldCgkY3VzdG9tZXJCaWxsaW5nKSAmJiAhJGN1c3RvbWVyLT5nZXREZWZhdWx0U2hpcHBpbmcoKSkgewogICAgICAgICAgICAkY3VzdG9tZXJCaWxsaW5nLT5zZXRJc0RlZmF1bHRTaGlwcGluZyh0cnVlKTsKICAgICAgICB9CiAgICAgICAgJHF1b3RlLT5zZXRDdXN0b21lcigkY3VzdG9tZXIpOwogICAgfQoKICAgIC8qKgogICAgICogSW52b2x2ZSBuZXcgY3VzdG9tZXIgdG8gc3lzdGVtCiAgICAgKgogICAgICogQHJldHVybiBNYWdlX0NoZWNrb3V0X01vZGVsX1R5cGVfT25lcGFnZQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX2ludm9sdmVOZXdDdXN0b21lcigpCiAgICB7CiAgICAgICAgJGN1c3RvbWVyID0gJHRoaXMtPmdldFF1b3RlKCktPmdldEN1c3RvbWVyKCk7CiAgICAgICAgaWYgKCRjdXN0b21lci0+aXNDb25maXJtYXRpb25SZXF1aXJlZCgpKSB7CiAgICAgICAgICAgICRjdXN0b21lci0+c2VuZE5ld0FjY291bnRFbWFpbCgnY29uZmlybWF0aW9uJywgJycsICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTdG9yZUlkKCkpOwogICAgICAgICAgICAkdXJsID0gTWFnZTo6aGVscGVyKCdjdXN0b21lcicpLT5nZXRFbWFpbENvbmZpcm1hdGlvblVybCgkY3VzdG9tZXItPmdldEVtYWlsKCkpOwogICAgICAgICAgICAkdGhpcy0+Z2V0Q3VzdG9tZXJTZXNzaW9uKCktPmFkZFN1Y2Nlc3MoCiAgICAgICAgICAgICAgICBNYWdlOjpoZWxwZXIoJ2N1c3RvbWVyJyktPl9fKCdBY2NvdW50IGNvbmZpcm1hdGlvbiBpcyByZXF1aXJlZC4gUGxlYXNlLCBjaGVjayB5b3VyIGUtbWFpbCBmb3IgY29uZmlybWF0aW9uIGxpbmsuIFRvIHJlc2VuZCBjb25maXJtYXRpb24gZW1haWwgcGxlYXNlIDxhIGhyZWY9IiVzIj5jbGljayBoZXJlPC9hPi4nLCAkdXJsKQogICAgICAgICAgICApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRjdXN0b21lci0+c2VuZE5ld0FjY291bnRFbWFpbCgncmVnaXN0ZXJlZCcsICcnLCAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U3RvcmVJZCgpKTsKICAgICAgICAgICAgJHRoaXMtPmdldEN1c3RvbWVyU2Vzc2lvbigpLT5sb2dpbkJ5SWQoJGN1c3RvbWVyLT5nZXRJZCgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIG9yZGVyIGJhc2VkIG9uIGNoZWNrb3V0IHR5cGUuIENyZWF0ZSBjdXN0b21lciBpZiBuZWNlc3NhcnkuCiAgICAgKgogICAgICogQHJldHVybiBNYWdlX0NoZWNrb3V0X01vZGVsX1R5cGVfT25lcGFnZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2F2ZU9yZGVyKCkKICAgIHsKICAgICAgICAkdGhpcy0+dmFsaWRhdGUoKTsKICAgICAgICAkaXNOZXdDdXN0b21lciA9IGZhbHNlOwogICAgICAgIHN3aXRjaCAoJHRoaXMtPmdldENoZWNrb3V0TWV0aG9kKCkpIHsKICAgICAgICAgICAgY2FzZSBzZWxmOjpNRVRIT0RfR1VFU1Q6CiAgICAgICAgICAgICAgICAkdGhpcy0+X3ByZXBhcmVHdWVzdFF1b3RlKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBzZWxmOjpNRVRIT0RfUkVHSVNURVI6CiAgICAgICAgICAgICAgICAkdGhpcy0+X3ByZXBhcmVOZXdDdXN0b21lclF1b3RlKCk7CiAgICAgICAgICAgICAgICAkaXNOZXdDdXN0b21lciA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5fcHJlcGFyZUN1c3RvbWVyUXVvdGUoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgJHNlcnZpY2UgPSBNYWdlOjpnZXRNb2RlbCgnc2FsZXMvc2VydmljZV9xdW90ZScsICR0aGlzLT5nZXRRdW90ZSgpKTsKICAgICAgICAkc2VydmljZS0+c3VibWl0QWxsKCk7CgogICAgICAgIGlmICgkaXNOZXdDdXN0b21lcikgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJHRoaXMtPl9pbnZvbHZlTmV3Q3VzdG9tZXIoKTsKICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICBNYWdlOjpsb2dFeGNlcHRpb24oJGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+X2NoZWNrb3V0U2Vzc2lvbi0+c2V0TGFzdFF1b3RlSWQoJHRoaXMtPmdldFF1b3RlKCktPmdldElkKCkpCiAgICAgICAgICAgIC0+c2V0TGFzdFN1Y2Nlc3NRdW90ZUlkKCR0aGlzLT5nZXRRdW90ZSgpLT5nZXRJZCgpKQogICAgICAgICAgICAtPmNsZWFySGVscGVyRGF0YSgpOwoKICAgICAgICAkb3JkZXIgPSAkc2VydmljZS0+Z2V0T3JkZXIoKTsKICAgICAgICBpZiAoJG9yZGVyKSB7CiAgICAgICAgICAgIE1hZ2U6OmRpc3BhdGNoRXZlbnQoJ2NoZWNrb3V0X3R5cGVfb25lcGFnZV9zYXZlX29yZGVyX2FmdGVyJywKICAgICAgICAgICAgICAgIGFycmF5KCdvcmRlcic9PiRvcmRlciwgJ3F1b3RlJz0+JHRoaXMtPmdldFF1b3RlKCkpKTsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBhIGZsYWcgdG8gc2V0IHRoYXQgdGhlcmUgd2lsbCBiZSByZWRpcmVjdCB0byB0aGlyZCBwYXJ0eSBhZnRlciBjb25maXJtYXRpb24KICAgICAgICAgICAgICogZWc6IHBheXBhbCBzdGFuZGFyZCBpcG4KICAgICAgICAgICAgICovCiAgICAgICAgICAgICRyZWRpcmVjdFVybCA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRQYXltZW50KCktPmdldE9yZGVyUGxhY2VSZWRpcmVjdFVybCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogd2Ugb25seSB3YW50IHRvIHNlbmQgdG8gY3VzdG9tZXIgYWJvdXQgbmV3IG9yZGVyIHdoZW4gdGhlcmUgaXMgbm8gcmVkaXJlY3QgdG8gdGhpcmQgcGFydHkKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmICghJHJlZGlyZWN0VXJsICYmICRvcmRlci0+Z2V0Q2FuU2VuZE5ld0VtYWlsRmxhZygpKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICRvcmRlci0+c2VuZE5ld09yZGVyRW1haWwoKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgICAgIE1hZ2U6OmxvZ0V4Y2VwdGlvbigkZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFkZCBvcmRlciBpbmZvcm1hdGlvbiB0byB0aGUgc2Vzc2lvbgogICAgICAgICAgICAkdGhpcy0+X2NoZWNrb3V0U2Vzc2lvbi0+c2V0TGFzdE9yZGVySWQoJG9yZGVyLT5nZXRJZCgpKQogICAgICAgICAgICAgICAgLT5zZXRSZWRpcmVjdFVybCgkcmVkaXJlY3RVcmwpCiAgICAgICAgICAgICAgICAtPnNldExhc3RSZWFsT3JkZXJJZCgkb3JkZXItPmdldEluY3JlbWVudElkKCkpOwoKICAgICAgICAgICAgLy8gYXMgd2VsbCBhIGJpbGxpbmcgYWdyZWVtZW50IGNhbiBiZSBjcmVhdGVkCiAgICAgICAgICAgICRhZ3JlZW1lbnQgPSAkb3JkZXItPmdldFBheW1lbnQoKS0+Z2V0QmlsbGluZ0FncmVlbWVudCgpOwogICAgICAgICAgICBpZiAoJGFncmVlbWVudCkgewogICAgICAgICAgICAgICAgJHRoaXMtPl9jaGVja291dFNlc3Npb24tPnNldExhc3RCaWxsaW5nQWdyZWVtZW50SWQoJGFncmVlbWVudC0+Z2V0SWQoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGFkZCByZWN1cnJpbmcgcHJvZmlsZXMgaW5mb3JtYXRpb24gdG8gdGhlIHNlc3Npb24KICAgICAgICAkcHJvZmlsZXMgPSAkc2VydmljZS0+Z2V0UmVjdXJyaW5nUGF5bWVudFByb2ZpbGVzKCk7CiAgICAgICAgaWYgKCRwcm9maWxlcykgewogICAgICAgICAgICAkaWRzID0gYXJyYXkoKTsKICAgICAgICAgICAgZm9yZWFjaCAoJHByb2ZpbGVzIGFzICRwcm9maWxlKSB7CiAgICAgICAgICAgICAgICAkaWRzW10gPSAkcHJvZmlsZS0+Z2V0SWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+X2NoZWNrb3V0U2Vzc2lvbi0+c2V0TGFzdFJlY3VycmluZ1Byb2ZpbGVJZHMoJGlkcyk7CiAgICAgICAgICAgIC8vIFRPRE86IHNlbmQgcmVjdXJyaW5nIHByb2ZpbGUgZW1haWxzCiAgICAgICAgfQoKICAgICAgICBNYWdlOjpkaXNwYXRjaEV2ZW50KAogICAgICAgICAgICAnY2hlY2tvdXRfc3VibWl0X2FsbF9hZnRlcicsCiAgICAgICAgICAgIGFycmF5KCdvcmRlcicgPT4gJG9yZGVyLCAncXVvdGUnID0+ICR0aGlzLT5nZXRRdW90ZSgpLCAncmVjdXJyaW5nX3Byb2ZpbGVzJyA9PiAkcHJvZmlsZXMpCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogVmFsaWRhdGUgcXVvdGUgc3RhdGUgdG8gYmUgYWJsZSBzdWJtaXR0ZWQgZnJvbSBvbmUgcGFnZSBjaGVja291dCBwYWdlCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgYWZ0ZXIgMS40IC0gc2VydmljZSBtb2RlbCBkb2luZyBxdW90ZSB2YWxpZGF0aW9uCiAgICAgKiBAcmV0dXJuIE1hZ2VfQ2hlY2tvdXRfTW9kZWxfVHlwZV9PbmVwYWdlCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZU9yZGVyKCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmdldFF1b3RlKCktPmdldElzTXVsdGlTaGlwcGluZygpKSB7CiAgICAgICAgICAgIE1hZ2U6OnRocm93RXhjZXB0aW9uKE1hZ2U6OmhlbHBlcignY2hlY2tvdXQnKS0+X18oJ0ludmFsaWQgY2hlY2tvdXQgdHlwZS4nKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISR0aGlzLT5nZXRRdW90ZSgpLT5pc1ZpcnR1YWwoKSkgewogICAgICAgICAgICAkYWRkcmVzcyA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKTsKICAgICAgICAgICAgJGFkZHJlc3NWYWxpZGF0aW9uID0gJGFkZHJlc3MtPnZhbGlkYXRlKCk7CiAgICAgICAgICAgIGlmICgkYWRkcmVzc1ZhbGlkYXRpb24gIT09IHRydWUpIHsKICAgICAgICAgICAgICAgIE1hZ2U6OnRocm93RXhjZXB0aW9uKE1hZ2U6OmhlbHBlcignY2hlY2tvdXQnKS0+X18oJ1BsZWFzZSBjaGVjayBzaGlwcGluZyBhZGRyZXNzIGluZm9ybWF0aW9uLicpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbWV0aG9kPSAkYWRkcmVzcy0+Z2V0U2hpcHBpbmdNZXRob2QoKTsKICAgICAgICAgICAgJHJhdGUgID0gJGFkZHJlc3MtPmdldFNoaXBwaW5nUmF0ZUJ5Q29kZSgkbWV0aG9kKTsKICAgICAgICAgICAgaWYgKCEkdGhpcy0+Z2V0UXVvdGUoKS0+aXNWaXJ0dWFsKCkgJiYgKCEkbWV0aG9kIHx8ICEkcmF0ZSkpIHsKICAgICAgICAgICAgICAgIE1hZ2U6OnRocm93RXhjZXB0aW9uKE1hZ2U6OmhlbHBlcignY2hlY2tvdXQnKS0+X18oJ1BsZWFzZSBzcGVjaWZ5IHNoaXBwaW5nIG1ldGhvZC4nKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRhZGRyZXNzVmFsaWRhdGlvbiA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRCaWxsaW5nQWRkcmVzcygpLT52YWxpZGF0ZSgpOwogICAgICAgIGlmICgkYWRkcmVzc1ZhbGlkYXRpb24gIT09IHRydWUpIHsKICAgICAgICAgICAgTWFnZTo6dGhyb3dFeGNlcHRpb24oTWFnZTo6aGVscGVyKCdjaGVja291dCcpLT5fXygnUGxlYXNlIGNoZWNrIGJpbGxpbmcgYWRkcmVzcyBpbmZvcm1hdGlvbi4nKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISgkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0UGF5bWVudCgpLT5nZXRNZXRob2QoKSkpIHsKICAgICAgICAgICAgTWFnZTo6dGhyb3dFeGNlcHRpb24oTWFnZTo6aGVscGVyKCdjaGVja291dCcpLT5fXygnUGxlYXNlIHNlbGVjdCB2YWxpZCBwYXltZW50IG1ldGhvZC4nKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgaWYgY3VzdG9tZXIgZW1haWwgZXhpc3RzCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkZW1haWwKICAgICAqIEBwYXJhbSBpbnQgJHdlYnNpdGVJZAogICAgICogQHJldHVybiBmYWxzZXxNYWdlX0N1c3RvbWVyX01vZGVsX0N1c3RvbWVyCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfY3VzdG9tZXJFbWFpbEV4aXN0cygkZW1haWwsICR3ZWJzaXRlSWQgPSBudWxsKQogICAgewogICAgICAgICRjdXN0b21lciA9IE1hZ2U6OmdldE1vZGVsKCdjdXN0b21lci9jdXN0b21lcicpOwogICAgICAgIGlmICgkd2Vic2l0ZUlkKSB7CiAgICAgICAgICAgICRjdXN0b21lci0+c2V0V2Vic2l0ZUlkKCR3ZWJzaXRlSWQpOwogICAgICAgIH0KICAgICAgICAkY3VzdG9tZXItPmxvYWRCeUVtYWlsKCRlbWFpbCk7CiAgICAgICAgaWYgKCRjdXN0b21lci0+Z2V0SWQoKSkgewogICAgICAgICAgICByZXR1cm4gJGN1c3RvbWVyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgbGFzdCBvcmRlciBpbmNyZW1lbnQgaWQgYnkgb3JkZXIgaWQKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGFzdE9yZGVySWQoKQogICAgewogICAgICAgICRsYXN0SWQgID0gJHRoaXMtPmdldENoZWNrb3V0KCktPmdldExhc3RPcmRlcklkKCk7CiAgICAgICAgJG9yZGVySWQgPSBmYWxzZTsKICAgICAgICBpZiAoJGxhc3RJZCkgewogICAgICAgICAgICAkb3JkZXIgPSBNYWdlOjpnZXRNb2RlbCgnc2FsZXMvb3JkZXInKTsKICAgICAgICAgICAgJG9yZGVyLT5sb2FkKCRsYXN0SWQpOwogICAgICAgICAgICAkb3JkZXJJZCA9ICRvcmRlci0+Z2V0SW5jcmVtZW50SWQoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRvcmRlcklkOwogICAgfQp9
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement