Advertisement
galih039

firecheckout

Mar 5th, 2019
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 78.82 KB | None | 0 0
  1. PD9waHAKCmluY2x1ZGVfb25jZSgiTWF4TWluZC9HZW9JUC9nZW9pcC5waHAiKTsKaW5jbHVkZV9vbmNlKCJNYXhNaW5kL0dlb0lQL2dlb2lwY2l0eS5waHAiKTsKaW5jbHVkZV9vbmNlKCJNYXhNaW5kL0dlb0lQL2dlb2lwcmVnaW9udmFycy5waHAiKTsKCmNsYXNzIFRNX0ZpcmVDaGVja291dF9Nb2RlbF9UeXBlX1N0YW5kYXJkCnsKICAgIC8qKgogICAgICogIGFwcC9sb2NhbC9UTS9maXJlY2hlY2tvdXQvbW9kZWwvdHlwZS9zdGFuZGFyZC5waHAgCiAgICAgKiAgTWFnZV9DaGVja291dCAoQnVnN3NlYyBUZWFtKQogICAgICogIENoZWNrb3V0IHR5cGVzOiBDaGVja291dCBhcyBHdWVzdCwgUmVnaXN0ZXIsIExvZ2dlZCBJbiBDdXN0b21lcgogICAgICovCiAgICBjb25zdCBNRVRIT0RfR1VFU1QgICAgPSAnZ3Vlc3QnOwogICAgY29uc3QgTUVUSE9EX1JFR0lTVEVSID0gJ3JlZ2lzdGVyJzsKICAgIGNvbnN0IE1FVEhPRF9DVVNUT01FUiA9ICdjdXN0b21lcic7Ci8vICAgIGNvbnN0IE1FVEhPRF9HVUVTVF9DVVNUT01FUiA9ICdndWVzdF9jdXN0b21lcic7CgogICAgLyoqCiAgICAgKiBFcnJvciBtZXNzYWdlIG9mICJjdXN0b21lciBhbHJlYWR5IGV4aXN0cyIKICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcml2YXRlICRfY3VzdG9tZXJFbWFpbEV4aXN0c01lc3NhZ2UgPSAnJzsKCiAgICAvKioKICAgICAqIEB2YXIgTWFnZV9DdXN0b21lcl9Nb2RlbF9TZXNzaW9uCiAgICAgKi8KICAgIHByb3RlY3RlZCAkX2N1c3RvbWVyU2Vzc2lvbjsKCiAgICAvKioKICAgICAqIEB2YXIgTWFnZV9DaGVja291dF9Nb2RlbF9TZXNzaW9uCiAgICAgKi8KICAgIHByb3RlY3RlZCAkX2NoZWNrb3V0U2Vzc2lvbjsKCiAgICAvKioKICAgICAqIEB2YXIgTWFnZV9TYWxlc19Nb2RlbF9RdW90ZQogICAgICovCiAgICBwcm90ZWN0ZWQgJF9xdW90ZSA9IG51bGw7CgogICAgLyoqCiAgICAgKiBAdmFyIE1hZ2VfQ2hlY2tvdXRfSGVscGVyX0RhdGEKICAgICAqLwogICAgcHJvdGVjdGVkICRfaGVscGVyOwoKICAgIC8qKgogICAgICogQ2xhc3MgY29uc3RydWN0b3IKICAgICAqIFNldCBjdXN0b21lciBhbHJlYWR5IGV4aXN0cyBtZXNzYWdlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICAgICAgJHRoaXMtPl9oZWxwZXIgPSBNYWdlOjpoZWxwZXIoJ2NoZWNrb3V0Jyk7CiAgICAgICAgJHRoaXMtPl9jdXN0b21lckVtYWlsRXhpc3RzTWVzc2FnZSA9ICR0aGlzLT5faGVscGVyLT5fXygnVGhlcmUgaXMgYWxyZWFkeSBhIGN1c3RvbWVyIHJlZ2lzdGVyZWQgdXNpbmcgdGhpcyBlbWFpbCBhZGRyZXNzLiBQbGVhc2UgbG9naW4gdXNpbmcgdGhpcyBlbWFpbCBhZGRyZXNzIG9yIGVudGVyIGEgZGlmZmVyZW50IGVtYWlsIGFkZHJlc3MgdG8gcmVnaXN0ZXIgeW91ciBhY2NvdW50LicpOwogICAgICAgICR0aGlzLT5fY2hlY2tvdXRTZXNzaW9uID0gTWFnZTo6Z2V0U2luZ2xldG9uKCdjaGVja291dC9zZXNzaW9uJyk7CiAgICAgICAgJHRoaXMtPl9jdXN0b21lclNlc3Npb24gPSBNYWdlOjpnZXRTaW5nbGV0b24oJ2N1c3RvbWVyL3Nlc3Npb24nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBmcm9udGVuZCBjaGVja291dCBzZXNzaW9uIG9iamVjdAogICAgICoKICAgICAqIEByZXR1cm4gTWFnZV9DaGVja291dF9Nb2RlbF9TZXNzaW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDaGVja291dCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5fY2hlY2tvdXRTZXNzaW9uOwogICAgfQoKICAgIC8qKgogICAgICogUXVvdGUgb2JqZWN0IGdldHRlcgogICAgICoKICAgICAqIEByZXR1cm4gTWFnZV9TYWxlc19Nb2RlbF9RdW90ZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UXVvdGUoKQogICAgewogICAgICAgIGlmICgkdGhpcy0+X3F1b3RlID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+X2NoZWNrb3V0U2Vzc2lvbi0+Z2V0UXVvdGUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5fcXVvdGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBEZWNsYXJlIGNoZWNrb3V0IHF1b3RlIGluc3RhbmNlCiAgICAgKgogICAgICogQHBhcmFtIE1hZ2VfU2FsZXNfTW9kZWxfUXVvdGUgJHF1b3RlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRRdW90ZShNYWdlX1NhbGVzX01vZGVsX1F1b3RlICRxdW90ZSkKICAgIHsKICAgICAgICAkdGhpcy0+X3F1b3RlID0gJHF1b3RlOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBjdXN0b21lciBzZXNzaW9uIG9iamVjdAogICAgICoKICAgICAqIEByZXR1cm4gTWFnZV9DdXN0b21lcl9Nb2RlbF9TZXNzaW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDdXN0b21lclNlc3Npb24oKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+X2N1c3RvbWVyU2Vzc2lvbjsKICAgIH0KCgogICAgLyoqCiAgICAgKiBSZXRyaWV2ZSBzaGlwcGluZyBhbmQgYmlsbGluZyBhZGRyZXNzZXMsCiAgICAgKiBhbmQgYm9vbGVhbiBmbGFnIGFib3V0IHRoZWlyIGVxdWFsaXR5CiAgICAgKgogICAgICogRm9yIHRoZSBSZWdpc3RlcmQgY3VzdG9tZXIgd2l0aCBhdmFpbGFibGUgYWRkcmVzc2VzIHJldHVybnMKICAgICAqIGFwcHJvcHJpYXRlIGFkZHJlc3MuCiAgICAgKiBGb3IgdGhlIEd1ZXN0IHRyeWluZyB0byBkZXRlY3QgY291bnRyeSB3aXRoIGdlby1pcCB0ZWNobm9sb2d5CiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX2dldERlZmF1bHRBZGRyZXNzKCkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gYXJyYXkoCiAgICAgICAgICAgICdzaGlwcGluZycgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAnY291bnRyeV9pZCcgICAgICAgICAgICA9PiBudWxsLAogICAgICAgICAgICAgICAgJ2NpdHknICAgICAgICAgICAgICAgICAgPT4gbnVsbCwKICAgICAgICAgICAgICAgICdyZWdpb25faWQnICAgICAgICAgICAgID0+IG51bGwsCiAgICAgICAgICAgICAgICAncG9zdGNvZGUnICAgICAgICAgICAgICA9PiBudWxsLAogICAgICAgICAgICAgICAgJ2N1c3RvbWVyX2FkZHJlc3NfaWQnICAgPT4gZmFsc2UKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ2JpbGxpbmcnID0+IGFycmF5KAogICAgICAgICAgICAgICAgJ2NvdW50cnlfaWQnICAgICAgICAgICAgPT4gbnVsbCwKICAgICAgICAgICAgICAgICdjaXR5JyAgICAgICAgICAgICAgICAgID0+IG51bGwsCiAgICAgICAgICAgICAgICAncmVnaW9uX2lkJyAgICAgICAgICAgICA9PiBudWxsLAogICAgICAgICAgICAgICAgJ3Bvc3Rjb2RlJyAgICAgICAgICAgICAgPT4gbnVsbCwKICAgICAgICAgICAgICAgICdjdXN0b21lcl9hZGRyZXNzX2lkJyAgID0+IGZhbHNlLAogICAgICAgICAgICAgICAgJ3VzZV9mb3Jfc2hpcHBpbmcnICAgICAgPT4gdHJ1ZSwKICAgICAgICAgICAgICAgICdyZWdpc3Rlcl9hY2NvdW50JyAgICAgID0+IDAKICAgICAgICAgICAgKQogICAgICAgICk7CiAgICAgICAgaWYgKCgkY3VzdG9tZXIgPSBNYWdlOjpnZXRTaW5nbGV0b24oJ2N1c3RvbWVyL3Nlc3Npb24nKS0+Z2V0Q3VzdG9tZXIoKSkKICAgICAgICAgICAgJiYgKCRhZGRyZXNzZXMgPSAkY3VzdG9tZXItPmdldEFkZHJlc3NlcygpKSkgewoKICAgICAgICAgICAgaWYgKCEkc2hpcHBpbmdBZGRyZXNzID0gJGN1c3RvbWVyLT5nZXRQcmltYXJ5U2hpcHBpbmdBZGRyZXNzKCkpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRhZGRyZXNzZXMgYXMgJGFkZHJlc3MpIHsKICAgICAgICAgICAgICAgICAgICAkc2hpcHBpbmdBZGRyZXNzID0gJGFkZHJlc3M7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEkYmlsbGluZ0FkZHJlc3MgPSAkY3VzdG9tZXItPmdldFByaW1hcnlCaWxsaW5nQWRkcmVzcygpKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkYWRkcmVzc2VzIGFzICRhZGRyZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgJGJpbGxpbmdBZGRyZXNzID0gJGFkZHJlc3M7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRyZXN1bHRbJ3NoaXBwaW5nJ11bJ2NvdW50cnlfaWQnXSAgICAgICAgICA9ICRzaGlwcGluZ0FkZHJlc3MtPmdldENvdW50cnlJZCgpOwogICAgICAgICAgICAkcmVzdWx0WydzaGlwcGluZyddWydjdXN0b21lcl9hZGRyZXNzX2lkJ10gPSAkc2hpcHBpbmdBZGRyZXNzLT5nZXRJZCgpOwogICAgICAgICAgICAkcmVzdWx0WydiaWxsaW5nJ11bJ2NvdW50cnlfaWQnXSAgICAgICAgICAgPSAkYmlsbGluZ0FkZHJlc3MtPmdldENvdW50cnlJZCgpOwogICAgICAgICAgICAkcmVzdWx0WydiaWxsaW5nJ11bJ2N1c3RvbWVyX2FkZHJlc3NfaWQnXSAgPSAkYmlsbGluZ0FkZHJlc3MtPmdldElkKCk7CiAgICAgICAgICAgICRyZXN1bHRbJ2JpbGxpbmcnXVsndXNlX2Zvcl9zaGlwcGluZyddICAgICA9ICRzaGlwcGluZ0FkZHJlc3MtPmdldElkKCkgPT09ICRiaWxsaW5nQWRkcmVzcy0+Z2V0SWQoKTsKICAgICAgICB9IGVsc2UgaWYgKCR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKS0+Z2V0Q291bnRyeUlkKCkpIHsKICAgICAgICAgICAgLy8gRXN0aW1hdGVkIHNoaXBwaW5nIGNvc3QgZnJvbSBzaG9wcGluZyBjYXJ0CiAgICAgICAgICAgICRhZGRyZXNzID0gJHRoaXMtPmdldFF1b3RlKCktPmdldFNoaXBwaW5nQWRkcmVzcygpOwogICAgICAgICAgICAkcmVzdWx0WydzaGlwcGluZyddID0gJGFkZHJlc3MtPmdldERhdGEoKTsKICAgICAgICAgICAgaWYgKCEkYWRkcmVzcy0+Z2V0U2FtZUFzQmlsbGluZygpKSB7CiAgICAgICAgICAgICAgICAkYWRkcmVzcyA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRCaWxsaW5nQWRkcmVzcygpOwogICAgICAgICAgICAgICAgJHJlc3VsdFsnYmlsbGluZyddID0gJGFkZHJlc3MtPmdldERhdGEoKTsKICAgICAgICAgICAgICAgICRyZXN1bHRbJ2JpbGxpbmcnXVsndXNlX2Zvcl9zaGlwcGluZyddID0gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0WydiaWxsaW5nJ10gPSAkcmVzdWx0WydzaGlwcGluZyddOwogICAgICAgICAgICAgICAgJHJlc3VsdFsnYmlsbGluZyddWyd1c2VfZm9yX3NoaXBwaW5nJ10gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHJlc3VsdFsnYmlsbGluZyddWyd1c2VfZm9yX3NoaXBwaW5nJ10gPSB0cnVlOwoKICAgICAgICAgICAgJGRldGVjdENvdW50cnkgID0gTWFnZTo6Z2V0U3RvcmVDb25maWcoJ2ZpcmVjaGVja291dC9nZW9faXAvY291bnRyeScpOwogICAgICAgICAgICAkZGV0ZWN0UmVnaW9uICAgPSBNYWdlOjpnZXRTdG9yZUNvbmZpZygnZmlyZWNoZWNrb3V0L2dlb19pcC9yZWdpb24nKTsKICAgICAgICAgICAgJGRldGVjdENpdHkgICAgID0gTWFnZTo6Z2V0U3RvcmVDb25maWcoJ2ZpcmVjaGVja291dC9nZW9faXAvY2l0eScpOwogICAgICAgICAgICAkZ2VvaXBJbmNsdWRlZCAgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKCRkZXRlY3RDb3VudHJ5IHx8ICRkZXRlY3RSZWdpb24gfHwgJGRldGVjdENpdHkpIHsKICAgICAgICAgICAgICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCdnZW9pcF9vcGVuJykpIHsKICAgICAgICAgICAgICAgICAgICAkZ2VvaXBJbmNsdWRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5fY2hlY2tvdXRTZXNzaW9uLT5hZGRFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWFnZTo6aGVscGVyKCdmaXJlY2hlY2tvdXQnKS0+X18oIkdlb0lQIGlzIGVuYWJsZWQgYnV0IG5vdCBpbmNsdWRlZC4gZ2VvaXBfb3BlbiBmdW5jdGlvbiBkb2Vzbid0IGZvdW5kIikKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkcmVtb3RlQWRkciA9IE1hZ2U6OmhlbHBlcignY29yZS9odHRwJyktPmdldFJlbW90ZUFkZHIoKTsKCiAgICAgICAgICAgIGlmICgkZGV0ZWN0Q291bnRyeSAmJiAkZ2VvaXBJbmNsdWRlZCkgewogICAgICAgICAgICAgICAgJGZpbGVuYW1lID0gTWFnZTo6Z2V0QmFzZURpcignbGliJykKICAgICAgICAgICAgICAgICAgICAuIERTCiAgICAgICAgICAgICAgICAgICAgLiAiTWF4TWluZC9HZW9JUC9kYXRhLyIKICAgICAgICAgICAgICAgICAgICAuIE1hZ2U6OmdldFN0b3JlQ29uZmlnKCdmaXJlY2hlY2tvdXQvZ2VvX2lwL2NvdW50cnlfZmlsZScpOwoKICAgICAgICAgICAgICAgIGlmIChpc19yZWFkYWJsZSgkZmlsZW5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgJGdpID0gZ2VvaXBfb3BlbigkZmlsZW5hbWUsIEdFT0lQX1NUQU5EQVJEKTsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WydzaGlwcGluZyddWydjb3VudHJ5X2lkJ10gPQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WydiaWxsaW5nJ11bJ2NvdW50cnlfaWQnXSA9IGdlb2lwX2NvdW50cnlfY29kZV9ieV9hZGRyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGdpLCAkcmVtb3RlQWRkcgogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBnZW9pcF9jbG9zZSgkZ2kpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+X2NoZWNrb3V0U2Vzc2lvbi0+YWRkRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1hZ2U6OmhlbHBlcignZmlyZWNoZWNrb3V0JyktPl9fKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdW50cnkgZGV0ZWN0aW9uIGlzIGVuYWJsZWQgYnV0ICVzIG5vdCBmb3VuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWdlOjpnZXRTdG9yZUNvbmZpZygnZmlyZWNoZWNrb3V0L2dlb19pcC9jb3VudHJ5X2ZpbGUnKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRkZXRlY3RSZWdpb24gJiYgJGdlb2lwSW5jbHVkZWQpIHsKICAgICAgICAgICAgICAgICRmaWxlbmFtZSA9IE1hZ2U6OmdldEJhc2VEaXIoJ2xpYicpCiAgICAgICAgICAgICAgICAgICAgLiBEUwogICAgICAgICAgICAgICAgICAgIC4gIk1heE1pbmQvR2VvSVAvZGF0YS8iCiAgICAgICAgICAgICAgICAgICAgLiBNYWdlOjpnZXRTdG9yZUNvbmZpZygnZmlyZWNoZWNrb3V0L2dlb19pcC9yZWdpb25fZmlsZScpOwoKICAgICAgICAgICAgICAgIGlmIChpc19yZWFkYWJsZSgkZmlsZW5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgJGdpID0gZ2VvaXBfb3BlbigkZmlsZW5hbWUsIEdFT0lQX1NUQU5EQVJEKTsKICAgICAgICAgICAgICAgICAgICBsaXN0KCRjb3VudHJ5Q29kZSwgJHJlZ2lvbkNvZGUpID0gZ2VvaXBfcmVnaW9uX2J5X2FkZHIoJGdpLCAkcmVtb3RlQWRkcik7CiAgICAgICAgICAgICAgICAgICAgJHJlZ2lvbiA9IE1hZ2U6OmdldE1vZGVsKCdkaXJlY3RvcnkvcmVnaW9uJyktPmxvYWRCeUNvZGUoJHJlZ2lvbkNvZGUsICRjb3VudHJ5Q29kZSk7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsnc2hpcHBpbmcnXVsnY291bnRyeV9pZCddID0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsnYmlsbGluZyddWydjb3VudHJ5X2lkJ10gPSAkY291bnRyeUNvZGU7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsnc2hpcHBpbmcnXVsncmVnaW9uX2lkJ10gPQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WydiaWxsaW5nJ11bJ3JlZ2lvbl9pZCddID0gJHJlZ2lvbi0+Z2V0SWQoKTsKCiAgICAgICAgICAgICAgICAgICAgZ2VvaXBfY2xvc2UoJGdpKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl9jaGVja291dFNlc3Npb24tPmFkZEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNYWdlOjpoZWxwZXIoJ2ZpcmVjaGVja291dCcpLT5fXygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpb24gZGV0ZWN0aW9uIGlzIGVuYWJsZWQgYnV0ICVzIG5vdCBmb3VuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWdlOjpnZXRTdG9yZUNvbmZpZygnZmlyZWNoZWNrb3V0L2dlb19pcC9yZWdpb25fZmlsZScpCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGRldGVjdENpdHkgJiYgJGdlb2lwSW5jbHVkZWQpIHsKICAgICAgICAgICAgICAgICRmaWxlbmFtZSA9IE1hZ2U6OmdldEJhc2VEaXIoJ2xpYicpCiAgICAgICAgICAgICAgICAgICAgLiBEUwogICAgICAgICAgICAgICAgICAgIC4gIk1heE1pbmQvR2VvSVAvZGF0YS8iCiAgICAgICAgICAgICAgICAgICAgLiBNYWdlOjpnZXRTdG9yZUNvbmZpZygnZmlyZWNoZWNrb3V0L2dlb19pcC9jaXR5X2ZpbGUnKTsKCiAgICAgICAgICAgICAgICBpZiAoaXNfcmVhZGFibGUoJGZpbGVuYW1lKSkgewogICAgICAgICAgICAgICAgICAgICRnaSA9IGdlb2lwX29wZW4oJGZpbGVuYW1lLCBHRU9JUF9TVEFOREFSRCk7CiAgICAgICAgICAgICAgICAgICAgJHJlY29yZCA9IGdlb2lwX3JlY29yZF9ieV9hZGRyKCRnaSwgJHJlbW90ZUFkZHIpOwogICAgICAgICAgICAgICAgICAgICRyZXN1bHRbJ3NoaXBwaW5nJ11bJ2NpdHknXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRbJ2JpbGxpbmcnXVsnY2l0eSddID0gJHJlY29yZC0+Y2l0eTsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WydzaGlwcGluZyddWydwb3N0Y29kZSddID0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsnYmlsbGluZyddWydwb3N0Y29kZSddID0gJHJlY29yZC0+cG9zdGFsX2NvZGU7CgogICAgICAgICAgICAgICAgICAgIGdlb2lwX2Nsb3NlKCRnaSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5fY2hlY2tvdXRTZXNzaW9uLT5hZGRFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWFnZTo6aGVscGVyKCdmaXJlY2hlY2tvdXQnKS0+X18oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2l0eSBkZXRlY3Rpb24gaXMgZW5hYmxlZCBidXQgJXMgbm90IGZvdW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hZ2U6OmdldFN0b3JlQ29uZmlnKCdmaXJlY2hlY2tvdXQvZ2VvX2lwL2NpdHlfZmlsZScpCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbXB0eSgkcmVzdWx0WydzaGlwcGluZyddWydjb3VudHJ5X2lkJ10pCiAgICAgICAgICAgICAgICB8fCAhTWFnZTo6Z2V0UmVzb3VyY2VNb2RlbCgnZGlyZWN0b3J5L2NvdW50cnlfY29sbGVjdGlvbicpCiAgICAgICAgICAgICAgICAgICAgLT5hZGRDb3VudHJ5Q29kZUZpbHRlcigkcmVzdWx0WydzaGlwcGluZyddWydjb3VudHJ5X2lkJ10pCiAgICAgICAgICAgICAgICAgICAgLT5sb2FkQnlTdG9yZSgpCiAgICAgICAgICAgICAgICAgICAgLT5jb3VudCgpKSB7CgogICAgICAgICAgICAgICAgJHJlc3VsdFsnc2hpcHBpbmcnXVsnY291bnRyeV9pZCddID0KICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WydiaWxsaW5nJ11bJ2NvdW50cnlfaWQnXSA9IE1hZ2U6OmdldFN0b3JlQ29uZmlnKCdmaXJlY2hlY2tvdXQvZ2VuZXJhbC9jb3VudHJ5Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIG9iamVjdCAkbWV0aG9kCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9jYW5Vc2VQYXltZW50TWV0aG9kKCRtZXRob2QpCiAgICB7CiAgICAgICAgaWYgKCEkbWV0aG9kLT5jYW5Vc2VGb3JDb3VudHJ5KCR0aGlzLT5nZXRRdW90ZSgpLT5nZXRCaWxsaW5nQWRkcmVzcygpLT5nZXRDb3VudHJ5KCkpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8qaWYgKCEkbWV0aG9kLT5jYW5Vc2VGb3JDdXJyZW5jeShNYWdlOjphcHAoKS0+Z2V0U3RvcmUoKS0+Z2V0QmFzZUN1cnJlbmN5Q29kZSgpKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSovCgogICAgICAgICR0b3RhbCA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRCYXNlR3JhbmRUb3RhbCgpOwogICAgICAgICRtaW5Ub3RhbCA9ICRtZXRob2QtPmdldENvbmZpZ0RhdGEoJ21pbl9vcmRlcl90b3RhbCcpOwogICAgICAgICRtYXhUb3RhbCA9ICRtZXRob2QtPmdldENvbmZpZ0RhdGEoJ21heF9vcmRlcl90b3RhbCcpOwoKICAgICAgICBpZigoIWVtcHR5KCRtaW5Ub3RhbCkgJiYgKCR0b3RhbCA8ICRtaW5Ub3RhbCkpIHx8ICghZW1wdHkoJG1heFRvdGFsKSAmJiAoJHRvdGFsID4gJG1heFRvdGFsKSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgYXQgdGhlIHN0YXJ0IG9mIHBheW1lbnQgcHJvY2VzcwogICAgICoKICAgICAqIEByZXR1cm4gVE1fRmlyZUNoZWNrb3V0X01vZGVsX1R5cGVfU3RhbmRhcmQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFwcGx5RGVmYXVsdHMoKQogICAgewogICAgICAgICRhZGRyZXNzSW5mbyA9ICR0aGlzLT5fZ2V0RGVmYXVsdEFkZHJlc3MoKTsKICAgICAgICAkdGhpcy0+c2F2ZUJpbGxpbmcoCiAgICAgICAgICAgICRhZGRyZXNzSW5mb1snYmlsbGluZyddLAogICAgICAgICAgICAkYWRkcmVzc0luZm9bJ2JpbGxpbmcnXVsnY3VzdG9tZXJfYWRkcmVzc19pZCddLAogICAgICAgICAgICBmYWxzZQogICAgICAgICk7CiAgICAgICAgaWYgKCEkYWRkcmVzc0luZm9bJ2JpbGxpbmcnXVsndXNlX2Zvcl9zaGlwcGluZyddKSB7CiAgICAgICAgICAgICR0aGlzLT5zYXZlU2hpcHBpbmcoCiAgICAgICAgICAgICAgICAkYWRkcmVzc0luZm9bJ3NoaXBwaW5nJ10sCiAgICAgICAgICAgICAgICAkYWRkcmVzc0luZm9bJ3NoaXBwaW5nJ11bJ2N1c3RvbWVyX2FkZHJlc3NfaWQnXSwKICAgICAgICAgICAgICAgIGZhbHNlCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAdmFyIE1hZ2VfU2FsZXNfTW9kZWxfUXVvdGUKICAgICAgICAgKi8KICAgICAgICAkcXVvdGUgPSAkdGhpcy0+Z2V0UXVvdGUoKTsKICAgICAgICAkc2hpcHBpbmdBZGRyZXNzID0gJHF1b3RlLT5nZXRTaGlwcGluZ0FkZHJlc3MoKTsKCiAgICAgICAgJHNoaXBwaW5nQWRkcmVzcy0+Y29sbGVjdFRvdGFscygpLT5jb2xsZWN0U2hpcHBpbmdSYXRlcygpLT5zYXZlKCk7CiAgICAgICAgJHRoaXMtPmFwcGx5U2hpcHBpbmdNZXRob2QoKTsKICAgICAgICAvLyBzaGlwcGluZyBtZXRob2QgbWF5IGFmZmVjdCB0aGUgdG90YWwgaW4gYm90aCBzaWRlcyAoZGlzY291bnQgb24gdXNpbmcgc2hpcHBpbmcgYWRkcmVzcykKICAgICAgICAkcXVvdGUtPmNvbGxlY3RUb3RhbHMoKTsKCiAgICAgICAgaWYgKE1hZ2U6OmdldFN0b3JlQ29uZmlnKCdmaXJlY2hlY2tvdXQvYWpheF91cGRhdGUvc2hpcHBpbmdfbWV0aG9kX29uX3RvdGFsJykpIHsgLy8gc2hpcHBpbmcgbWV0aG9kcyBkZXBlbmRzIG9uIHRvdGFsIChzdWJ0b3RhbCArIGRpc2NvdW50KSB3aXRob3V0IHNoaXBwaW5nIHByaWNlCiAgICAgICAgICAgIC8vIGNoYW5naW5nIHRvdGFsIGJ5IHNoaXBwaW5nIHByaWNlIG1heSBhZmZlY3QgdGhlIHNoaXBwaW5nIHByaWNlcyB0aGVvcmV0aWNhbGx5CiAgICAgICAgICAgIC8vIChmcmVlIHNoaXBwaW5nIG1heSBiZSBjYW5jZWxlZCBvciBhZGRlZCkKICAgICAgICAgICAgJHNoaXBwaW5nQWRkcmVzcy0+c2V0Q29sbGVjdFNoaXBwaW5nUmF0ZXModHJ1ZSktPmNvbGxlY3RTaGlwcGluZ1JhdGVzKCk7CiAgICAgICAgICAgIC8vIGlmIHNoaXBwaW5nIHByaWNlIHdhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRvdGFscyBhZ2Fpbi4KICAgICAgICAgICAgLy8gRXhhbXBsZTogU0VMRUNURUQgU0hJUFBJTkcgTUVUSE9EIE5PVyBCRUNPTUVTIEZSRUUKICAgICAgICAgICAgLy8gcHJldmlvdXMgbWV0aG9kIGFkZGVkIGEgZGlzY291bnQgYW5kIHNlbGVjdGVkIHNoaXBwaW5nIG1ldGhvZCB3YXNuJ3QgZnJlZQogICAgICAgICAgICAvLyBidXQgcmVtb3ZpbmcgdGhlIHByZXZpb3VzIHNoaXBwaW5nIG1ldGhvZCByZW1vdmVzIHRoZSBkaXNjb3VudCBhbHNvCiAgICAgICAgICAgIC8vIGFuZCBzZWxlY3RlZCBzaGlwcGluZyBtZXRob2QgaXMgbm93IGZyZWUKICAgICAgICAgICAgJHF1b3RlLT5zZXRUb3RhbHNDb2xsZWN0ZWRGbGFnKGZhbHNlKS0+Y29sbGVjdFRvdGFscygpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmFwcGx5UGF5bWVudE1ldGhvZCgpOwogICAgICAgIGlmIChNYWdlOjpnZXRTdG9yZUNvbmZpZygnZmlyZWNoZWNrb3V0L2FqYXhfdXBkYXRlL3RvdGFsX29uX3BheW1lbnRfbWV0aG9kJykpIHsgLy8gdG90YWwgZGVwZW5kcyBvbiBwYXltZW50IG1ldGhvZCBAdG9kbyAmJiBtZXRob2QgaXMgY2hhbmdlZAogICAgICAgICAgICAvLyByZWNvbGxlY3QgdG90YWxzIGFnYWluIGJlY2F1c2UgYWRkaW5nL3JlbW92aW5nIHBheW1lbnQKICAgICAgICAgICAgLy8gbWV0aG9kIG1heSBhZGQvcmVtb3ZlIHNvbWUgZGlzY291bnRzIGluIHRoZSBvcmRlcgoKICAgICAgICAgICAgLy8gdG8gcmVjb2xsZWN0IGRpc2NvdW50IHJ1bGVzIG5lZWQgdG8gY2xlYXIgcHJldmlvdXMgZGlzY291bnQKICAgICAgICAgICAgLy8gZGVzY3JpcHR1aW9ucyBhbmQgbWFyayBhZGRyZXNzIGFzIG1vZGlmaWVkCiAgICAgICAgICAgIC8vIHNlZSBfY2FuUHJvY2Vzc1J1bGUgaW4gTWFnZV9TYWxlc1J1bGVfTW9kZWxfVmFsaWRhdG9yCiAgICAgICAgICAgICRzaGlwcGluZ0FkZHJlc3MtPnNldERpc2NvdW50RGVzY3JpcHRpb25BcnJheShhcnJheSgpKS0+aXNPYmplY3ROZXcodHJ1ZSk7CgogICAgICAgICAgICAkcXVvdGUtPnNldFRvdGFsc0NvbGxlY3RlZEZsYWcoZmFsc2UpLT5jb2xsZWN0VG90YWxzKCk7CiAgICAgICAgfQoKICAgICAgICAkcXVvdGUtPnNhdmUoKTsKCiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogVXBkYXRlIHBheW1lbnQgbWV0aG9kIGluZm9ybWF0aW9uCiAgICAgKiBSZW1vdmVzIHByZXZpb3VzbHkgc2VsZWN0ZWQgbWV0aG9kIGlmIG5vbmUgaXMgYXZhaWxhYmxlLAogICAgICogc2V0IGF2YWlsYWJsZSBpZiBvbmx5IG9uZSBpcyBhdmFpbGFibGUsCiAgICAgKiBzZXQgcHJldmlvdXNseSBzZWxlY3RlZCBwYXltZW50LAogICAgICogc2V0IGRlZmF1bHQgZnJvbSBjb25maWcgaWYgcG9zc2libGUKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtZXRob2RDb2RlIERlZmF1bHQgbWV0aG9kIGNvZGUKICAgICAqIEByZXR1cm4gVE1fRmlyZUNoZWNrb3V0X01vZGVsX1R5cGVfU3RhbmRhcmQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFwcGx5UGF5bWVudE1ldGhvZCgkbWV0aG9kQ29kZSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKGZhbHNlID09PSAkbWV0aG9kQ29kZSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmdldFF1b3RlKCktPnJlbW92ZVBheW1lbnQoKTsKICAgICAgICB9CgogICAgICAgICRzdG9yZSA9ICR0aGlzLT5nZXRRdW90ZSgpID8gJHRoaXMtPmdldFF1b3RlKCktPmdldFN0b3JlSWQoKSA6IG51bGw7CiAgICAgICAgJG1ldGhvZHMgPSBNYWdlOjpoZWxwZXIoJ3BheW1lbnQnKS0+Z2V0U3RvcmVNZXRob2RzKCRzdG9yZSwgJHRoaXMtPmdldFF1b3RlKCkpOwogICAgICAgICRhdmFpbGFibGVQYXltZW50cyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJG1ldGhvZHMgYXMgJGtleSA9PiAkbWV0aG9kKSB7CiAgICAgICAgICAgIGlmICghJG1ldGhvZCB8fCAhJG1ldGhvZC0+Y2FuVXNlQ2hlY2tvdXQoKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCR0aGlzLT5fY2FuVXNlUGF5bWVudE1ldGhvZCgkbWV0aG9kKSkgewogICAgICAgICAgICAgICAgJGF2YWlsYWJsZVBheW1lbnRzW10gPSAkbWV0aG9kOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkZm91bmQgPSBmYWxzZTsKICAgICAgICAkY291bnQgPSBjb3VudCgkYXZhaWxhYmxlUGF5bWVudHMpOwogICAgICAgIGlmICgxID09PSAkY291bnQpIHsKICAgICAgICAgICAgJG1ldGhvZENvZGUgPSAkYXZhaWxhYmxlUGF5bWVudHNbMF0tPmdldENvZGUoKTsKICAgICAgICAgICAgJGZvdW5kICAgICAgPSB0cnVlOwogICAgICAgIH0gZWxzZWlmICgkY291bnQpIHsKICAgICAgICAgICAgaWYgKCEkbWV0aG9kQ29kZSkgewogICAgICAgICAgICAgICAkbWV0aG9kQ29kZSA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRQYXltZW50KCktPmdldE1ldGhvZCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkbWV0aG9kQ29kZSkgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGF2YWlsYWJsZVBheW1lbnRzIGFzICRwYXltZW50KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRtZXRob2RDb2RlID09ICRwYXltZW50LT5nZXRDb2RlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghJGZvdW5kIHx8ICEkbWV0aG9kQ29kZSkgewogICAgICAgICAgICAgICAgJG1ldGhvZENvZGUgPSBNYWdlOjpnZXRTdG9yZUNvbmZpZygnZmlyZWNoZWNrb3V0L2dlbmVyYWwvcGF5bWVudF9tZXRob2QnKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRhdmFpbGFibGVQYXltZW50cyBhcyAkcGF5bWVudCkgewogICAgICAgICAgICAgICAgICAgIGlmICgkbWV0aG9kQ29kZSA9PSAkcGF5bWVudC0+Z2V0Q29kZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCEkZm91bmQpIHsKICAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5yZW1vdmVQYXltZW50KCk7CiAgICAgICAgfSBlbHNlaWYgKCRtZXRob2RDb2RlKSB7CiAgICAgICAgICAgICRwYXltZW50ID0gJHRoaXMtPmdldFF1b3RlKCktPmdldFBheW1lbnQoKTsKICAgICAgICAgICAgJHBheW1lbnQtPnNldE1ldGhvZCgkbWV0aG9kQ29kZSk7CiAgICAgICAgICAgICRtZXRob2QgPSAkcGF5bWVudC0+Z2V0TWV0aG9kSW5zdGFuY2UoKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICRtZXRob2QtPmFzc2lnbkRhdGEoYXJyYXkoJ21ldGhvZCcgPT4gJG1ldGhvZENvZGUpKTsKICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAvLyBBZHllbiBIUFAgZXh0ZW5zaW9uIGZpeAogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHRoaXMtPmdldFF1b3RlKCktPmlzVmlydHVhbCgpKSB7IC8vIGRpc2NvdW50IGFyZSBsb29raW5nIGZvciBtZXRob2QgaW5zaWRlIGFkZHJlc3MKICAgICAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRCaWxsaW5nQWRkcmVzcygpLT5zZXRQYXltZW50TWV0aG9kKCRtZXRob2RDb2RlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKS0+c2V0UGF5bWVudE1ldGhvZCgkbWV0aG9kQ29kZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIFVwZGF0ZSBzaGlwcGluZyBtZXRob2QgaW5mb3JtYXRpb24KICAgICAqIFJlbW92ZXMgcHJldmlvdXNseSBzZWxlY3RlZCBtZXRob2QgaWYgbm9uZSBpcyBhdmFpbGFibGUsCiAgICAgKiBzZXQgYXZhaWxhYmxlIGlmIG9ubHkgb25lIGlzIGF2YWlsYWJsZSwKICAgICAqIHNldCBwcmV2aW91c2x5IHNlbGVjdGVkIHBheW1lbnQsCiAgICAgKiBzZXQgZGVmYXVsdCBmcm9tIGNvbmZpZyBpZiBwb3NzaWJsZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1ldGhvZENvZGUgRGVmYXVsdCBtZXRob2QgY29kZQogICAgICogQHJldHVybiBUTV9GaXJlQ2hlY2tvdXRfTW9kZWxfVHlwZV9TdGFuZGFyZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXBwbHlTaGlwcGluZ01ldGhvZCgkbWV0aG9kQ29kZSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKGZhbHNlID09PSAkbWV0aG9kQ29kZSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmdldFF1b3RlKCktPmdldFNoaXBwaW5nQWRkcmVzcygpLT5zZXRTaGlwcGluZ01ldGhvZChmYWxzZSk7CiAgICAgICAgfQogICAgICAgICRyYXRlcyA9IE1hZ2U6OmdldE1vZGVsKCdzYWxlcy9xdW90ZV9hZGRyZXNzX3JhdGUnKS0+Z2V0Q29sbGVjdGlvbigpCiAgICAgICAgICAgIC0+c2V0QWRkcmVzc0ZpbHRlcigkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCktPmdldElkKCkpCiAgICAgICAgICAgIC0+dG9BcnJheSgpOwoKLy8kc3RhcnQgPSBtaWNyb3RpbWUodHJ1ZSk7Ci8vJHJhdGVzMSA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKS0+Z2V0QWxsU2hpcHBpbmdSYXRlcygpOy8vLT50b0FycmF5KCk7Ci8vJGVuZCA9IG1pY3JvdGltZSh0cnVlKTsKLy9aZW5kX0RlYnVnOjpkdW1wKCRlbmQgLSAkc3RhcnQpOwovL1plbmRfRGVidWc6OmR1bXAoY291bnQoJHJhdGVzMSkpOwoKICAgICAgICAvLyB1bnNldCBlcnJvciBzaGlwcGluZyBtZXRob2RzLiBMaWtlIHVwc19lcnJvciBldGMuCiAgICAgICAgZm9yZWFjaCAoJHJhdGVzWydpdGVtcyddIGFzICRrID0+ICRyYXRlKSB7CiAgICAgICAgICAgIGlmIChlbXB0eSgkcmF0ZVsnbWV0aG9kJ10pIHx8ICdjdXN0b21zaGlwcGluZ3JhdGUnID09ICRyYXRlWydtZXRob2QnXSkgewogICAgICAgICAgICAgICAgdW5zZXQoJHJhdGVzWydpdGVtcyddWyRrXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmVzZXQoJHJhdGVzWydpdGVtcyddKTsKCiAgICAgICAgaWYgKCghJGNvdW50ID0gY291bnQoJHJhdGVzWydpdGVtcyddKSkpIHsKICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPmdldFNoaXBwaW5nQWRkcmVzcygpLT5zZXRTaGlwcGluZ01ldGhvZChmYWxzZSk7CiAgICAgICAgfSBlbHNlaWYgKDEgPT09ICRjb3VudCkgewogICAgICAgICAgICAkcmF0ZSA9IGN1cnJlbnQoJHJhdGVzWydpdGVtcyddKTsKICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPmdldFNoaXBwaW5nQWRkcmVzcygpLT5zZXRTaGlwcGluZ01ldGhvZCgkcmF0ZVsnY29kZSddKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCEkbWV0aG9kQ29kZSkgewogICAgICAgICAgICAgICAgJG1ldGhvZENvZGUgPSAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCktPmdldFNoaXBwaW5nTWV0aG9kKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRtZXRob2RDb2RlKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcmF0ZXNbJ2l0ZW1zJ10gYXMgJHJhdGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJG1ldGhvZENvZGUgPT09ICRyYXRlWydjb2RlJ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPmdldFNoaXBwaW5nQWRkcmVzcygpLT5zZXRTaGlwcGluZ01ldGhvZCgkbWV0aG9kQ29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoISRmb3VuZCB8fCAhJG1ldGhvZENvZGUpIHsKICAgICAgICAgICAgICAgICRtZXRob2RDb2RlID0gTWFnZTo6Z2V0U3RvcmVDb25maWcoJ2ZpcmVjaGVja291dC9nZW5lcmFsL3NoaXBwaW5nX21ldGhvZCcpOwogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHJhdGVzWydpdGVtcyddIGFzICRyYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRtZXRob2RDb2RlID09PSAkcmF0ZVsnY29kZSddKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKS0+c2V0U2hpcHBpbmdNZXRob2QoJG1ldGhvZENvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAkZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEkZm91bmQpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRyYXRlc1snaXRlbXMnXSBhcyAkcmF0ZSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKS0+c2V0U2hpcHBpbmdNZXRob2QoJHJhdGVbJ2NvZGUnXSk7CiAgICAgICAgICAgICAgICAgICAgJGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKS0+c2V0U2hpcHBpbmdNZXRob2QoZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEluaXRpYWxpemUgcXVvdGUgc3RhdGUgdG8gYmUgdmFsaWQgZm9yIG9uZSBwYWdlIGNoZWNrb3V0CiAgICAgKgogICAgICogQHJldHVybiBNYWdlX0NoZWNrb3V0X01vZGVsX1R5cGVfT25lcGFnZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaW5pdENoZWNrb3V0KCkKICAgIHsKICAgICAgICAkY2hlY2tvdXQgPSAkdGhpcy0+Z2V0Q2hlY2tvdXQoKTsKICAgICAgICAkY3VzdG9tZXJTZXNzaW9uID0gJHRoaXMtPmdldEN1c3RvbWVyU2Vzc2lvbigpOwoKICAgICAgICAvKioKICAgICAgICAgKiBSZXNldCBtdWx0aXNoaXBwaW5nIGZsYWcgYmVmb3JlIGFueSBtYW5pcHVsYXRpb25zIHdpdGggcXVvdGUgYWRkcmVzcwogICAgICAgICAqIGFkZEFkZHJlc3MgbWV0aG9kIGZvciBxdW90ZSBvYmplY3QgcmVsYXRlZCBvbiB0aGlzIGZsYWcKICAgICAgICAgKi8KICAgICAgICBpZiAoJHRoaXMtPmdldFF1b3RlKCktPmdldElzTXVsdGlTaGlwcGluZygpKSB7CiAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zZXRJc011bHRpU2hpcHBpbmcoZmFsc2UpOwogICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+c2F2ZSgpOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAqIHdhbnQgdG8gbGFvZCB0aGUgY29ycmVjdCBjdXN0b21lciBpbmZvcm1hdGlvbiBieSBhc3NpZ2luZyB0byBhZGRyZXNzCiAgICAgICAgKiBpbnN0ZWFkIG9mIGp1c3QgbG9hZGluZyBmcm9tIHNhbGVzL3F1b3RlX2FkZHJlc3MKICAgICAgICAqLwogICAgICAgICRjdXN0b21lciA9ICRjdXN0b21lclNlc3Npb24tPmdldEN1c3RvbWVyKCk7CiAgICAgICAgaWYgKCRjdXN0b21lcikgewogICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+YXNzaWduQ3VzdG9tZXIoJGN1c3RvbWVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IHF1b3RlIGNoZWNrb3V0IG1ldGhvZAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDaGVja291dE1ldGhvZCgpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5nZXRDdXN0b21lclNlc3Npb24oKS0+aXNMb2dnZWRJbigpKSB7CiAgICAgICAgICAgIHJldHVybiBzZWxmOjpNRVRIT0RfQ1VTVE9NRVI7CiAgICAgICAgfQogICAgICAgIGlmICghJHRoaXMtPmdldFF1b3RlKCktPmdldENoZWNrb3V0TWV0aG9kKCkpIHsKICAgICAgICAgICAgaWYgKE1hZ2U6OmhlbHBlcignZmlyZWNoZWNrb3V0JyktPmlzQWxsb3dlZEd1ZXN0Q2hlY2tvdXQoKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNldENoZWNrb3V0TWV0aG9kKHNlbGY6Ok1FVEhPRF9HVUVTVCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+c2V0Q2hlY2tvdXRNZXRob2Qoc2VsZjo6TUVUSE9EX1JFR0lTVEVSKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPmdldFF1b3RlKCktPmdldENoZWNrb3V0TWV0aG9kKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTcGVjaWZ5IGNoZWNrb3V0IG1ldGhvZAogICAgICoKICAgICAqIEBwYXJhbSAgIHN0cmluZyAkbWV0aG9kCiAgICAgKiBAcmV0dXJuICBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2F2ZUNoZWNrb3V0TWV0aG9kKCRtZXRob2QpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCRtZXRob2QpKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IC0xLCAnbWVzc2FnZScgPT4gJHRoaXMtPl9oZWxwZXItPl9fKCdJbnZhbGlkIGRhdGEuJykpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNldENoZWNrb3V0TWV0aG9kKCRtZXRob2QpLT5zYXZlKCk7CiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgY3VzdG9tZXIgYWRkcmVzcyBieSBpZGVudGlmaWVyCiAgICAgKgogICAgICogQHBhcmFtICAgaW50ICRhZGRyZXNzSWQKICAgICAqIEByZXR1cm4gIE1hZ2VfQ3VzdG9tZXJfTW9kZWxfQWRkcmVzcwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QWRkcmVzcygkYWRkcmVzc0lkKQogICAgewogICAgICAgICRhZGRyZXNzID0gTWFnZTo6Z2V0TW9kZWwoJ2N1c3RvbWVyL2FkZHJlc3MnKS0+bG9hZCgoaW50KSRhZGRyZXNzSWQpOwogICAgICAgICRhZGRyZXNzLT5leHBsb2RlU3RyZWV0QWRkcmVzcygpOwogICAgICAgIGlmICgkYWRkcmVzcy0+Z2V0UmVnaW9uSWQoKSkgewogICAgICAgICAgICAkYWRkcmVzcy0+c2V0UmVnaW9uKCRhZGRyZXNzLT5nZXRSZWdpb25JZCgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRhZGRyZXNzOwogICAgfQoKICAgIC8qKgogICAgICogU2F2ZSBiaWxsaW5nIGFkZHJlc3MgaW5mb3JtYXRpb24gdG8gcXVvdGUKICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBPbmUgUGFnZSBDaGVja291dCBKUyAoQUpBWCkgd2hpbGUgc2F2aW5nIHRoZSBiaWxsaW5nIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSAgIGFycmF5ICRkYXRhCiAgICAgKiBAcGFyYW0gICBpbnQgJGN1c3RvbWVyQWRkcmVzc0lkCiAgICAgKiBAcmV0dXJuICBNYWdlX0NoZWNrb3V0X01vZGVsX1R5cGVfT25lcGFnZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2F2ZUJpbGxpbmcoJGRhdGEsICRjdXN0b21lckFkZHJlc3NJZCwgJHZhbGlkYXRlID0gdHJ1ZSkKICAgIHsKICAgICAgICBpZiAoZW1wdHkoJGRhdGEpKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IC0xLCAnbWVzc2FnZScgPT4gJHRoaXMtPl9oZWxwZXItPl9fKCdJbnZhbGlkIGRhdGEuJykpOwogICAgICAgIH0KCiAgICAgICAgLyogb2xkIGNvZGUgKi8KICAgICAgICBpZiAoaXNzZXQoJGRhdGFbJ3JlZ2lzdGVyX2FjY291bnQnXSkgJiYgJGRhdGFbJ3JlZ2lzdGVyX2FjY291bnQnXSkgewovLyAgICAgICAgICAgIGlmICgkZGF0YVsnbGlua19leGlzdGluZ19hY2NvdW50J10pIHsKLy8gICAgICAgICAgICAgICAgJGN1c3RvbWVyID0gTWFnZTo6Z2V0TW9kZWwoJ2N1c3RvbWVyL2N1c3RvbWVyJyk7Ci8vICAgICAgICAgICAgICAgICRjdXN0b21lci0+c2V0V2Vic2l0ZUlkKE1hZ2U6OmFwcCgpLT5nZXRXZWJzaXRlKCktPmdldElkKCkpOwovLyAgICAgICAgICAgICAgICAkY3VzdG9tZXItPmxvYWRCeUVtYWlsKCRkYXRhWydlbWFpbCddKTsKLy8gICAgICAgICAgICAgICAgaWYgKCRjdXN0b21lcklkID0gJGN1c3RvbWVyLT5nZXRJZCgpKSB7Ci8vICAgICAgICAgICAgICAgICAgICBNYWdlOjpnZXRTaW5nbGV0b24oJ2N1c3RvbWVyL3Nlc3Npb24nKS0+c2V0RmlyZWNoZWNrb3V0SW1wb3J0Q3VzdG9tZXJEYXRhKDEpOwovLyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNldEN1c3RvbWVySWQobnVsbCkKLy8gICAgICAgICAgICAgICAgICAgICAgICAtPnNldEN1c3RvbWVyRW1haWwoJGRhdGFbJ2VtYWlsJ10pCi8vICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRDdXN0b21lcklzR3Vlc3QodHJ1ZSkKLy8gICAgICAgICAgICAgICAgICAgICAgICAtPnNldEN1c3RvbWVyR3JvdXBJZChNYWdlX0N1c3RvbWVyX01vZGVsX0dyb3VwOjpOT1RfTE9HR0VEX0lOX0lEKTsKLy8gICAgICAgICAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zZXRDaGVja291dE1ldGhvZChzZWxmOjpNRVRIT0RfR1VFU1QpOyAvKk1FVEhPRF9HVUVTVF9DVVNUT01FUiovCi8vICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci8vICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+c2V0Q2hlY2tvdXRNZXRob2Qoc2VsZjo6TUVUSE9EX1JFR0lTVEVSKTsKLy8gICAgICAgICAgICAgICAgfQovLyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+c2V0Q2hlY2tvdXRNZXRob2Qoc2VsZjo6TUVUSE9EX1JFR0lTVEVSKTsKLy8gICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICgkdGhpcy0+Z2V0Q3VzdG9tZXJTZXNzaW9uKCktPmlzTG9nZ2VkSW4oKSkgewogICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+c2V0Q2hlY2tvdXRNZXRob2Qoc2VsZjo6TUVUSE9EX0NVU1RPTUVSKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+c2V0Q2hlY2tvdXRNZXRob2Qoc2VsZjo6TUVUSE9EX0dVRVNUKTsKICAgICAgICB9CiAgICAgICAgLyogZW9mIG9sZCBjb2RlICovCgogICAgICAgICRhZGRyZXNzID0gJHRoaXMtPmdldFF1b3RlKCktPmdldEJpbGxpbmdBZGRyZXNzKCk7CiAgICAgICAgLyogQHZhciAkYWRkcmVzc0Zvcm0gTWFnZV9DdXN0b21lcl9Nb2RlbF9Gb3JtICovCiAgICAgICAgJGFkZHJlc3NGb3JtID0gTWFnZTo6Z2V0TW9kZWwoJ2N1c3RvbWVyL2Zvcm0nKTsKICAgICAgICAkYWRkcmVzc0Zvcm0tPnNldEZvcm1Db2RlKCdjdXN0b21lcl9hZGRyZXNzX2VkaXQnKQogICAgICAgICAgICAtPnNldEVudGl0eVR5cGUoJ2N1c3RvbWVyX2FkZHJlc3MnKQogICAgICAgICAgICAtPnNldElzQWpheFJlcXVlc3QoTWFnZTo6YXBwKCktPmdldFJlcXVlc3QoKS0+aXNBamF4KCkpOwoKICAgICAgICBpZiAoIWVtcHR5KCRjdXN0b21lckFkZHJlc3NJZCkpIHsKICAgICAgICAgICAgJGN1c3RvbWVyQWRkcmVzcyA9IE1hZ2U6OmdldE1vZGVsKCdjdXN0b21lci9hZGRyZXNzJyktPmxvYWQoJGN1c3RvbWVyQWRkcmVzc0lkKTsKICAgICAgICAgICAgaWYgKCRjdXN0b21lckFkZHJlc3MtPmdldElkKCkpIHsKICAgICAgICAgICAgICAgIGlmICgkY3VzdG9tZXJBZGRyZXNzLT5nZXRDdXN0b21lcklkKCkgIT0gJHRoaXMtPmdldFF1b3RlKCktPmdldEN1c3RvbWVySWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJyA9PiAkdGhpcy0+X2hlbHBlci0+X18oJ0N1c3RvbWVyIEFkZHJlc3MgaXMgbm90IHZhbGlkLicpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkYWRkcmVzcy0+aW1wb3J0Q3VzdG9tZXJBZGRyZXNzKCRjdXN0b21lckFkZHJlc3MpLT5zZXRTYXZlSW5BZGRyZXNzQm9vaygwKTsKICAgICAgICAgICAgICAgICRhZGRyZXNzRm9ybS0+c2V0RW50aXR5KCRhZGRyZXNzKTsKICAgICAgICAgICAgICAgIGlmICgkdmFsaWRhdGUpIHsKICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc0Vycm9ycyAgPSAkYWRkcmVzc0Zvcm0tPnZhbGlkYXRlRGF0YSgkYWRkcmVzcy0+Z2V0RGF0YSgpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJGFkZHJlc3NFcnJvcnMgIT09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gMSwgJ21lc3NhZ2UnID0+ICRhZGRyZXNzRXJyb3JzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYWRkcmVzc0Zvcm0tPnNldEVudGl0eSgkYWRkcmVzcyk7CiAgICAgICAgICAgIC8vIGVtdWxhdGUgcmVxdWVzdCBvYmplY3QKICAgICAgICAgICAgJGFkZHJlc3NEYXRhID0gJGFkZHJlc3NGb3JtLT5leHRyYWN0RGF0YSgkYWRkcmVzc0Zvcm0tPnByZXBhcmVSZXF1ZXN0KCRkYXRhKSk7CiAgICAgICAgICAgIGlmICgkdmFsaWRhdGUpIHsKICAgICAgICAgICAgICAgICRhZGRyZXNzRXJyb3JzICA9ICRhZGRyZXNzRm9ybS0+dmFsaWRhdGVEYXRhKCRhZGRyZXNzRGF0YSk7CiAgICAgICAgICAgICAgICBpZiAoJGFkZHJlc3NFcnJvcnMgIT09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJyA9PiAxLCAnbWVzc2FnZScgPT4gJGFkZHJlc3NFcnJvcnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRhZGRyZXNzRm9ybS0+Y29tcGFjdERhdGEoJGFkZHJlc3NEYXRhKTsKICAgICAgICAgICAgLy91bnNldCBiaWxsaW5nIGFkZHJlc3MgYXR0cmlidXRlcyB3aGljaCB3ZXJlIG5vdCBzaG93biBpbiBmb3JtCiAgICAgICAgICAgIGZvcmVhY2ggKCRhZGRyZXNzRm9ybS0+Z2V0QXR0cmlidXRlcygpIGFzICRhdHRyaWJ1dGUpIHsKICAgICAgICAgICAgICAgIGlmICghaXNzZXQoJGRhdGFbJGF0dHJpYnV0ZS0+Z2V0QXR0cmlidXRlQ29kZSgpXSkpIHsKICAgICAgICAgICAgICAgICAgICAkYWRkcmVzcy0+c2V0RGF0YSgkYXR0cmlidXRlLT5nZXRBdHRyaWJ1dGVDb2RlKCksIE5VTEwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGZvcm0gZGF0YSwgbm90IGZldGNoZWQgYnkgZXh0cmFjdERhdGEgKGFzIGl0IGZldGNoZXMgb25seSBhdHRyaWJ1dGVzKQogICAgICAgICAgICAkYWRkcmVzcy0+c2V0U2F2ZUluQWRkcmVzc0Jvb2soZW1wdHkoJGRhdGFbJ3NhdmVfaW5fYWRkcmVzc19ib29rJ10pID8gMCA6IDEpOwogICAgICAgIH0KCiAgICAgICAgLy8gdmFsaWRhdGUgYmlsbGluZyBhZGRyZXNzCiAgICAgICAgaWYgKCR2YWxpZGF0ZSAmJiAoJHZhbGlkYXRlUmVzID0gJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpICE9PSB0cnVlKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IDEsICdtZXNzYWdlJyA9PiAkdmFsaWRhdGVSZXMpOwogICAgICAgIH0KCiAgICAgICAgJGFkZHJlc3MtPmltcGxvZGVTdHJlZXRBZGRyZXNzKCk7CgogICAgICAgIGlmICgkdmFsaWRhdGUgJiYgKHRydWUgIT09ICgkcmVzdWx0ID0gJHRoaXMtPl92YWxpZGF0ZUN1c3RvbWVyRGF0YSgkZGF0YSkpKSkgewogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIGlmICghJHRoaXMtPmdldFF1b3RlKCktPmdldEN1c3RvbWVySWQoKSAmJiBzZWxmOjpNRVRIT0RfUkVHSVNURVIgPT0gJHRoaXMtPmdldFF1b3RlKCktPmdldENoZWNrb3V0TWV0aG9kKCkpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5fY3VzdG9tZXJFbWFpbEV4aXN0cygkYWRkcmVzcy0+Z2V0RW1haWwoKSwgTWFnZTo6YXBwKCktPmdldFdlYnNpdGUoKS0+Z2V0SWQoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IDEsICdtZXNzYWdlJyA9PiAkdGhpcy0+X2N1c3RvbWVyRW1haWxFeGlzdHNNZXNzYWdlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCEkdGhpcy0+Z2V0UXVvdGUoKS0+aXNWaXJ0dWFsKCkpIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEJpbGxpbmcgYWRkcmVzcyB1c2luZyBvdGlvbnMKICAgICAgICAgICAgICovCiAgICAgICAgICAgICR1c2luZ0Nhc2UgPSBpc3NldCgkZGF0YVsndXNlX2Zvcl9zaGlwcGluZyddKSA/IChpbnQpJGRhdGFbJ3VzZV9mb3Jfc2hpcHBpbmcnXSA6IDA7CgogICAgICAgICAgICBzd2l0Y2goJHVzaW5nQ2FzZSkgewogICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICRzaGlwcGluZyA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKTsKICAgICAgICAgICAgICAgICAgICAkc2hpcHBpbmctPnNldFNhbWVBc0JpbGxpbmcoMCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgJGJpbGxpbmcgPSBjbG9uZSAkYWRkcmVzczsKICAgICAgICAgICAgICAgICAgICAkYmlsbGluZy0+dW5zQWRkcmVzc0lkKCktPnVuc0FkZHJlc3NUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgJHNoaXBwaW5nID0gJHRoaXMtPmdldFF1b3RlKCktPmdldFNoaXBwaW5nQWRkcmVzcygpOwogICAgICAgICAgICAgICAgICAgICRzaGlwcGluZ01ldGhvZCA9ICRzaGlwcGluZy0+Z2V0U2hpcHBpbmdNZXRob2QoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcmVzZXQgb3JpZ2luYWwgc2hpcHBpbmcgZGF0YSwgaWYgaXQgd2FzIG5vdCBjaGFuZ2VkIGJ5IGN1c3RvbWVyCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHNoaXBwaW5nLT5nZXREYXRhKCkgYXMgJHNoaXBwaW5nS2V5ID0+ICRzaGlwcGluZ1ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNfbnVsbCgkc2hpcHBpbmdWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFpc19udWxsKCRiaWxsaW5nLT5nZXREYXRhKCRzaGlwcGluZ0tleSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhaXNzZXQoJGRhdGFbJHNoaXBwaW5nS2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiaWxsaW5nLT51bnNldERhdGEoJHNoaXBwaW5nS2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkc2hpcHBpbmctPmFkZERhdGEoJGJpbGxpbmctPmdldERhdGEoKSkKICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRTYW1lQXNCaWxsaW5nKDEpCiAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0U2F2ZUluQWRkcmVzc0Jvb2soMCkKICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRTaGlwcGluZ01ldGhvZCgkc2hpcHBpbmdNZXRob2QpCiAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0Q29sbGVjdFNoaXBwaW5nUmF0ZXModHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmdldENoZWNrb3V0KCktPnNldFN0ZXBEYXRhKCdzaGlwcGluZycsICdjb21wbGV0ZScsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKCiAgICAgICAgLyogb2xkIGNvZGUgKi8KICAgICAgICBpZiAoJHZhbGlkYXRlICYmICh0cnVlICE9PSAkcmVzdWx0ID0gJHRoaXMtPl9wcm9jZXNzVmFsaWRhdGVDdXN0b21lcigkYWRkcmVzcykpKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KICAgICAgICAvKiBlb2Ygb2xkIGNvZGUgKi8KCiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBWYWxpZGF0ZSBjdXN0b21lciBkYXRhIGFuZCBzZXQgc29tZSBpdHMgZGF0YSBmb3IgZnVydGhlciB1c2FnZSBpbiBxdW90ZQogICAgICogV2lsbCByZXR1cm4gZWl0aGVyIHRydWUgb3IgYXJyYXkgd2l0aCBlcnJvciBtZXNzYWdlcwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkZGF0YQogICAgICogQHJldHVybiB0cnVlfGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfdmFsaWRhdGVDdXN0b21lckRhdGEoYXJyYXkgJGRhdGEpCiAgICB7CiAgICAgICAgLyogQHZhciAkY3VzdG9tZXJGb3JtIE1hZ2VfQ3VzdG9tZXJfTW9kZWxfRm9ybSAqLwogICAgICAgICRjdXN0b21lckZvcm0gICAgPSBNYWdlOjpnZXRNb2RlbCgnY3VzdG9tZXIvZm9ybScpOwogICAgICAgICRjdXN0b21lckZvcm0tPnNldEZvcm1Db2RlKCdjaGVja291dF9yZWdpc3RlcicpCiAgICAgICAgICAgIC0+c2V0SXNBamF4UmVxdWVzdChNYWdlOjphcHAoKS0+Z2V0UmVxdWVzdCgpLT5pc0FqYXgoKSk7CgogICAgICAgICRxdW90ZSA9ICR0aGlzLT5nZXRRdW90ZSgpOwogICAgICAgIGlmICgkcXVvdGUtPmdldEN1c3RvbWVySWQoKSkgewogICAgICAgICAgICAkY3VzdG9tZXIgPSAkcXVvdGUtPmdldEN1c3RvbWVyKCk7CiAgICAgICAgICAgICRjdXN0b21lckZvcm0tPnNldEVudGl0eSgkY3VzdG9tZXIpOwogICAgICAgICAgICAkY3VzdG9tZXJEYXRhID0gJHF1b3RlLT5nZXRDdXN0b21lcigpLT5nZXREYXRhKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyogQHZhciAkY3VzdG9tZXIgTWFnZV9DdXN0b21lcl9Nb2RlbF9DdXN0b21lciAqLwogICAgICAgICAgICAkY3VzdG9tZXIgPSBNYWdlOjpnZXRNb2RlbCgnY3VzdG9tZXIvY3VzdG9tZXInKTsKICAgICAgICAgICAgJGN1c3RvbWVyRm9ybS0+c2V0RW50aXR5KCRjdXN0b21lcik7CiAgICAgICAgICAgICRjdXN0b21lclJlcXVlc3QgPSAkY3VzdG9tZXJGb3JtLT5wcmVwYXJlUmVxdWVzdCgkZGF0YSk7CiAgICAgICAgICAgICRjdXN0b21lckRhdGEgPSAkY3VzdG9tZXJGb3JtLT5leHRyYWN0RGF0YSgkY3VzdG9tZXJSZXF1ZXN0KTsKICAgICAgICB9CgogICAgICAgICRjdXN0b21lckVycm9ycyA9ICRjdXN0b21lckZvcm0tPnZhbGlkYXRlRGF0YSgkY3VzdG9tZXJEYXRhKTsKICAgICAgICBpZiAoJGN1c3RvbWVyRXJyb3JzICE9PSB0cnVlKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgICAgICdlcnJvcicgICAgID0+IC0xLAogICAgICAgICAgICAgICAgJ21lc3NhZ2UnICAgPT4gaW1wbG9kZSgnLCAnLCAkY3VzdG9tZXJFcnJvcnMpCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHF1b3RlLT5nZXRDdXN0b21lcklkKCkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAkY3VzdG9tZXJGb3JtLT5jb21wYWN0RGF0YSgkY3VzdG9tZXJEYXRhKTsKCiAgICAgICAgaWYgKCRxdW90ZS0+Z2V0Q2hlY2tvdXRNZXRob2QoKSA9PSBzZWxmOjpNRVRIT0RfUkVHSVNURVIpIHsKICAgICAgICAgICAgLy8gc2V0IGN1c3RvbWVyIHBhc3N3b3JkCiAgICAgICAgICAgICRwYXNzd29yZCA9ICRjdXN0b21lclJlcXVlc3QtPmdldFBhcmFtKCdjdXN0b21lcl9wYXNzd29yZCcpOwogICAgICAgICAgICBpZiAoZW1wdHkoJHBhc3N3b3JkKSkgewogICAgICAgICAgICAgICAgJHBhc3N3b3JkID0gJGN1c3RvbWVyLT5nZW5lcmF0ZVBhc3N3b3JkKCk7CiAgICAgICAgICAgICAgICAkY3VzdG9tZXItPnNldFBhc3N3b3JkKCRwYXNzd29yZCk7CiAgICAgICAgICAgICAgICAkY3VzdG9tZXItPnNldENvbmZpcm1hdGlvbigkcGFzc3dvcmQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGN1c3RvbWVyLT5zZXRQYXNzd29yZCgkY3VzdG9tZXJSZXF1ZXN0LT5nZXRQYXJhbSgnY3VzdG9tZXJfcGFzc3dvcmQnKSk7CiAgICAgICAgICAgICAgICAkY3VzdG9tZXItPnNldENvbmZpcm1hdGlvbigkY3VzdG9tZXJSZXF1ZXN0LT5nZXRQYXJhbSgnY29uZmlybV9wYXNzd29yZCcpKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGVtdWxhdGUgY3VzdG9tZXIgcGFzc3dvcmQgZm9yIHF1ZXN0CiAgICAgICAgICAgICRwYXNzd29yZCA9ICRjdXN0b21lci0+Z2VuZXJhdGVQYXNzd29yZCgpOwogICAgICAgICAgICAkY3VzdG9tZXItPnNldFBhc3N3b3JkKCRwYXNzd29yZCk7CiAgICAgICAgICAgICRjdXN0b21lci0+c2V0Q29uZmlybWF0aW9uKCRwYXNzd29yZCk7CiAgICAgICAgfQoKICAgICAgICAkcmVzdWx0ID0gJGN1c3RvbWVyLT52YWxpZGF0ZSgpOwogICAgICAgIGlmICh0cnVlICE9PSAkcmVzdWx0ICYmIGlzX2FycmF5KCRyZXN1bHQpKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgICAgICdlcnJvcicgICA9PiAtMSwKICAgICAgICAgICAgICAgICdtZXNzYWdlJyA9PiBpbXBsb2RlKCcsICcsICRyZXN1bHQpCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHF1b3RlLT5nZXRDaGVja291dE1ldGhvZCgpID09IHNlbGY6Ok1FVEhPRF9SRUdJU1RFUikgewogICAgICAgICAgICAvLyBzYXZlIGN1c3RvbWVyIGVuY3J5cHRlZCBwYXNzd29yZCBpbiBxdW90ZQogICAgICAgICAgICAkcXVvdGUtPnNldFBhc3N3b3JkSGFzaCgkY3VzdG9tZXItPmVuY3J5cHRQYXNzd29yZCgkY3VzdG9tZXItPmdldFBhc3N3b3JkKCkpKTsKICAgICAgICB9CgogICAgICAgIC8vIGNvcHkgY3VzdG9tZXIvZ3Vlc3QgZW1haWwgdG8gYWRkcmVzcwogICAgICAgICRxdW90ZS0+Z2V0QmlsbGluZ0FkZHJlc3MoKS0+c2V0RW1haWwoJGN1c3RvbWVyLT5nZXRFbWFpbCgpKTsKCiAgICAgICAgLy8gY29weSBjdXN0b21lciBkYXRhIHRvIHF1b3RlCiAgICAgICAgTWFnZTo6aGVscGVyKCdjb3JlJyktPmNvcHlGaWVsZHNldCgnY3VzdG9tZXJfYWNjb3VudCcsICd0b19xdW90ZScsICRjdXN0b21lciwgJHF1b3RlKTsKCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBEZXByZWNhdGVkIGJ1dCB1c2VkIGJ5IGZpcmVjaGVja291dCB0byB2YWxpZGF0ZSB0aGUgdGF4dmF0IGZpZWxkCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgTmVlZCB0byByZW5hbWUgdG8gX3Byb2Nlc3NWYWxpZGF0ZVRheHZhdAogICAgICogQHBhcmFtIE1hZ2VfU2FsZXNfTW9kZWxfUXVvdGVfQWRkcmVzcyAkYWRkcmVzcwogICAgICogQHJldHVybiB0cnVlfGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfcHJvY2Vzc1ZhbGlkYXRlQ3VzdG9tZXIoTWFnZV9TYWxlc19Nb2RlbF9RdW90ZV9BZGRyZXNzICRhZGRyZXNzKQogICAgewovLyAgICAgICAgLy8gc2V0IGN1c3RvbWVyIGRhdGUgb2YgYmlydGggZm9yIGZ1cnRoZXIgdXNhZ2UKLy8gICAgICAgICRkb2IgPSAnJzsKLy8gICAgICAgIGlmICgkYWRkcmVzcy0+Z2V0RG9iKCkpIHsKLy8gICAgICAgICAgICAkZG9iID0gTWFnZTo6YXBwKCktPmdldExvY2FsZSgpLT5kYXRlKCRhZGRyZXNzLT5nZXREb2IoKSwgbnVsbCwgbnVsbCwgZmFsc2UpLT50b1N0cmluZygneXl5eS1NTS1kZCcpOwovLyAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zZXRDdXN0b21lckRvYigkZG9iKTsKLy8gICAgICAgIH0KCiAgICAgICAgLy8gc2V0IGN1c3RvbWVyIHRheC92YXQgbnVtYmVyIGZvciBmdXJ0aGVyIHVzYWdlCiAgICAgICAgLy8gJHRheHZhdCA9ICRhZGRyZXNzLT5nZXRUYXh2YXQoKTsKICAgICAgICAkdGF4dmF0ID0gJHRoaXMtPmdldFF1b3RlKCktPmdldEN1c3RvbWVyVGF4dmF0KCk7CiAgICAgICAgaWYgKHN0cmxlbigkdGF4dmF0KSAmJiBNYWdlOjpnZXRTdG9yZUNvbmZpZygnZmlyZWNoZWNrb3V0L3RheHZhdC92YWxpZGF0ZScpKSB7CiAgICAgICAgICAgIC8vIGlmIChNYWdlOjpnZXRTdG9yZUNvbmZpZygnZmlyZWNoZWNrb3V0L3RheHZhdC92YWxpZGF0ZScpKSB7CiAgICAgICAgICAgICAgICAkdGF4dmF0VmFsaWRhdG9yID0gTWFnZTo6Z2V0TW9kZWwoJ2ZpcmVjaGVja291dC90YXh2YXRfdmFsaWRhdG9yJyk7CiAgICAgICAgICAgICAgICBpZiAoISR0YXh2YXRWYWxpZGF0b3ItPmlzVmFsaWQoJHRheHZhdCwgJGFkZHJlc3MtPmdldENvdW50cnlJZCgpKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJyAgID0+IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZScgPT4gJHRheHZhdFZhbGlkYXRvci0+Z2V0TWVzc2FnZSgpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0vKiBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+c2V0Q3VzdG9tZXJUYXh2YXQoJHRheHZhdCk7CiAgICAgICAgICAgICAgICB9Ki8KICAgICAgICAgICAgLy8gfQogICAgICAgICAgICAvKiBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zZXRDdXN0b21lclRheHZhdCgkdGF4dmF0KTsKICAgICAgICAgICAgfSovCiAgICAgICAgfQoKICAgICAgICAvLyBzZXQgY3VzdG9tZXIgdGF4L3ZhdCBudW1iZXIgZm9yIGZ1cnRoZXIgdXNhZ2UKICAgICAgICBpZiAoJGFkZHJlc3MtPmdldFRheG51bWJlcigpKSB7CiAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zZXRDdXN0b21lclRheG51bWJlcigkYWRkcmVzcy0+Z2V0VGF4bnVtYmVyKCkpOwogICAgICAgIH0KCi8vICAgICAgICAvLyBzZXQgY3VzdG9tZXIgZ2VuZGVyIGZvciBmdXJ0aGVyIHVzYWdlCi8vICAgICAgICBpZiAoJGFkZHJlc3MtPmdldEdlbmRlcigpKSB7Ci8vICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNldEN1c3RvbWVyR2VuZGVyKCRhZGRyZXNzLT5nZXRHZW5kZXIoKSk7Ci8vICAgICAgICB9CgovLyAgICAgICAgLy8gaW52b2tlIGN1c3RvbWVyIG1vZGVsLCBpZiBpdCBpcyByZWdpc3RlcmluZwovLyAgICAgICAgaWYgKHNlbGY6Ok1FVEhPRF9SRUdJU1RFUiA9PSAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0Q2hlY2tvdXRNZXRob2QoKSkgewovLyAgICAgICAgICAgIC8vIHNldCBjdXN0b21lciBwYXNzd29yZCBoYXNoIGZvciBmdXJ0aGVyIHVzYWdlCi8vICAgICAgICAgICAgJGN1c3RvbWVyID0gTWFnZTo6Z2V0TW9kZWwoJ2N1c3RvbWVyL2N1c3RvbWVyJyk7Ci8vICAgICAgICAgICAgJHBhc3N3b3JkID0gJGFkZHJlc3MtPmdldEN1c3RvbWVyUGFzc3dvcmQoKTsKLy8gICAgICAgICAgICBpZiAoZW1wdHkoJHBhc3N3b3JkKSkgewovLyAgICAgICAgICAgICAgICAkcGFzc3dvcmQgPSAkY3VzdG9tZXItPmdlbmVyYXRlUGFzc3dvcmQoKTsKLy8gICAgICAgICAgICAgICAgJGFkZHJlc3MtPnNldEN1c3RvbWVyUGFzc3dvcmQoJHBhc3N3b3JkKTsKLy8gICAgICAgICAgICAgICAgJGFkZHJlc3MtPnNldENvbmZpcm1QYXNzd29yZCgkcGFzc3dvcmQpOwovLyAgICAgICAgICAgIH0KLy8gICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+c2V0UGFzc3dvcmRIYXNoKCRjdXN0b21lci0+ZW5jcnlwdFBhc3N3b3JkKCRwYXNzd29yZCkpOwoKLy8gICAgICAgICAgICAvLyB2YWxpZGF0ZSBjdXN0b21lcgovLyAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5KAovLyAgICAgICAgICAgICAgICAnZmlyc3RuYW1lJyAgICA9PiAnZmlyc3RuYW1lJywKLy8gICAgICAgICAgICAgICAgJ2xhc3RuYW1lJyAgICAgPT4gJ2xhc3RuYW1lJywKLy8gICAgICAgICAgICAgICAgJ2VtYWlsJyAgICAgICAgPT4gJ2VtYWlsJywKLy8gICAgICAgICAgICAgICAgJ3Bhc3N3b3JkJyAgICAgPT4gJ2N1c3RvbWVyX3Bhc3N3b3JkJywKLy8gICAgICAgICAgICAgICAgJ2NvbmZpcm1hdGlvbicgPT4gJ2NvbmZpcm1fcGFzc3dvcmQnLAovLyAgICAgICAgICAgICAgICAndGF4dmF0JyAgICAgICA9PiAndGF4dmF0JywKLy8gICAgICAgICAgICAgICAgJ3RheG51bWJlcicgICAgPT4gJ3RheG51bWJlcicsCi8vICAgICAgICAgICAgICAgICdnZW5kZXInICAgICAgID0+ICdnZW5kZXInCi8vICAgICAgICAgICAgKSBhcyAka2V5ID0+ICRkYXRhS2V5KSB7Ci8vICAgICAgICAgICAgICAgICRjdXN0b21lci0+c2V0RGF0YSgka2V5LCAkYWRkcmVzcy0+Z2V0RGF0YSgkZGF0YUtleSkpOwovLyAgICAgICAgICAgIH0KLy8gICAgICAgICAgICBpZiAoJGRvYikgewovLyAgICAgICAgICAgICAgICAkY3VzdG9tZXItPnNldERvYigkZG9iKTsKLy8gICAgICAgICAgICB9Ci8vICAgICAgICAgICAgJHZhbGlkYXRpb25SZXN1bHQgPSAkY3VzdG9tZXItPnZhbGlkYXRlKCk7Ci8vICAgICAgICAgICAgaWYgKHRydWUgIT09ICR2YWxpZGF0aW9uUmVzdWx0ICYmIGlzX2FycmF5KCR2YWxpZGF0aW9uUmVzdWx0KSkgewovLyAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoCi8vICAgICAgICAgICAgICAgICAgICAnZXJyb3InICAgPT4gLTEsCi8vICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZScgPT4gaW1wbG9kZSgnLCAnLCAkdmFsaWRhdGlvblJlc3VsdCkKLy8gICAgICAgICAgICAgICAgKTsKLy8gICAgICAgICAgICB9Ci8vICAgICAgICB9IGVsc2VpZihzZWxmOjpNRVRIT0RfR1VFU1QgPT0gJHRoaXMtPmdldFF1b3RlKCktPmdldENoZWNrb3V0TWV0aG9kKCkpIHsKLy8gICAgICAgICAgICAkZW1haWwgPSAkYWRkcmVzcy0+Z2V0RGF0YSgnZW1haWwnKTsKLy8gICAgICAgICAgICBpZiAoIVplbmRfVmFsaWRhdGU6OmlzKCRlbWFpbCwgJ0VtYWlsQWRkcmVzcycpKSB7Ci8vICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgKLy8gICAgICAgICAgICAgICAgICAgICdlcnJvcicgICA9PiAtMSwKLy8gICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJyA9PiAkdGhpcy0+X2hlbHBlci0+X18oJ0ludmFsaWQgZW1haWwgYWRkcmVzcyAiJXMiJywgJGVtYWlsKQovLyAgICAgICAgICAgICAgICApOwovLyAgICAgICAgICAgIH0KLy8gICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBTYXZlIGNoZWNrb3V0IHNoaXBwaW5nIGFkZHJlc3MKICAgICAqCiAgICAgKiBAcGFyYW0gICBhcnJheSAkZGF0YQogICAgICogQHBhcmFtICAgaW50ICRjdXN0b21lckFkZHJlc3NJZAogICAgICogQHJldHVybiAgTWFnZV9DaGVja291dF9Nb2RlbF9UeXBlX09uZXBhZ2UKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNhdmVTaGlwcGluZygkZGF0YSwgJGN1c3RvbWVyQWRkcmVzc0lkLCAkdmFsaWRhdGUgPSB0cnVlKQogICAgewogICAgICAgIGlmIChlbXB0eSgkZGF0YSkpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gLTEsICdtZXNzYWdlJyA9PiAkdGhpcy0+X2hlbHBlci0+X18oJ0ludmFsaWQgZGF0YS4nKSk7CiAgICAgICAgfQogICAgICAgICRhZGRyZXNzID0gJHRoaXMtPmdldFF1b3RlKCktPmdldFNoaXBwaW5nQWRkcmVzcygpOwoKICAgICAgICAvKiBAdmFyICRhZGRyZXNzRm9ybSBNYWdlX0N1c3RvbWVyX01vZGVsX0Zvcm0gKi8KICAgICAgICAkYWRkcmVzc0Zvcm0gICAgPSBNYWdlOjpnZXRNb2RlbCgnY3VzdG9tZXIvZm9ybScpOwogICAgICAgICRhZGRyZXNzRm9ybS0+c2V0Rm9ybUNvZGUoJ2N1c3RvbWVyX2FkZHJlc3NfZWRpdCcpCiAgICAgICAgICAgIC0+c2V0RW50aXR5VHlwZSgnY3VzdG9tZXJfYWRkcmVzcycpCiAgICAgICAgICAgIC0+c2V0SXNBamF4UmVxdWVzdChNYWdlOjphcHAoKS0+Z2V0UmVxdWVzdCgpLT5pc0FqYXgoKSk7CgogICAgICAgIGlmICghZW1wdHkoJGN1c3RvbWVyQWRkcmVzc0lkKSkgewogICAgICAgICAgICAkY3VzdG9tZXJBZGRyZXNzID0gTWFnZTo6Z2V0TW9kZWwoJ2N1c3RvbWVyL2FkZHJlc3MnKS0+bG9hZCgkY3VzdG9tZXJBZGRyZXNzSWQpOwogICAgICAgICAgICBpZiAoJGN1c3RvbWVyQWRkcmVzcy0+Z2V0SWQoKSkgewogICAgICAgICAgICAgICAgaWYgKCRjdXN0b21lckFkZHJlc3MtPmdldEN1c3RvbWVySWQoKSAhPSAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0Q3VzdG9tZXJJZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnID0+ICR0aGlzLT5faGVscGVyLT5fXygnQ3VzdG9tZXIgQWRkcmVzcyBpcyBub3QgdmFsaWQuJykKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRhZGRyZXNzLT5pbXBvcnRDdXN0b21lckFkZHJlc3MoJGN1c3RvbWVyQWRkcmVzcyktPnNldFNhdmVJbkFkZHJlc3NCb29rKDApOwogICAgICAgICAgICAgICAgJGFkZHJlc3NGb3JtLT5zZXRFbnRpdHkoJGFkZHJlc3MpOwogICAgICAgICAgICAgICAgaWYgKCR2YWxpZGF0ZSkgewogICAgICAgICAgICAgICAgICAgICRhZGRyZXNzRXJyb3JzICA9ICRhZGRyZXNzRm9ybS0+dmFsaWRhdGVEYXRhKCRhZGRyZXNzLT5nZXREYXRhKCkpOwogICAgICAgICAgICAgICAgICAgIGlmICgkYWRkcmVzc0Vycm9ycyAhPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJyA9PiAxLCAnbWVzc2FnZScgPT4gJGFkZHJlc3NFcnJvcnMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRhZGRyZXNzRm9ybS0+c2V0RW50aXR5KCRhZGRyZXNzKTsKICAgICAgICAgICAgLy8gZW11bGF0ZSByZXF1ZXN0IG9iamVjdAogICAgICAgICAgICAkYWRkcmVzc0RhdGEgICAgPSAkYWRkcmVzc0Zvcm0tPmV4dHJhY3REYXRhKCRhZGRyZXNzRm9ybS0+cHJlcGFyZVJlcXVlc3QoJGRhdGEpKTsKICAgICAgICAgICAgaWYgKCR2YWxpZGF0ZSkgewogICAgICAgICAgICAgICAgJGFkZHJlc3NFcnJvcnMgID0gJGFkZHJlc3NGb3JtLT52YWxpZGF0ZURhdGEoJGFkZHJlc3NEYXRhKTsKICAgICAgICAgICAgICAgIGlmICgkYWRkcmVzc0Vycm9ycyAhPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IDEsICdtZXNzYWdlJyA9PiAkYWRkcmVzc0Vycm9ycyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGFkZHJlc3NGb3JtLT5jb21wYWN0RGF0YSgkYWRkcmVzc0RhdGEpOwogICAgICAgICAgICAvLyB1bnNldCBzaGlwcGluZyBhZGRyZXNzIGF0dHJpYnV0ZXMgd2hpY2ggd2VyZSBub3Qgc2hvd24gaW4gZm9ybQogICAgICAgICAgICBmb3JlYWNoICgkYWRkcmVzc0Zvcm0tPmdldEF0dHJpYnV0ZXMoKSBhcyAkYXR0cmlidXRlKSB7CiAgICAgICAgICAgICAgICBpZiAoIWlzc2V0KCRkYXRhWyRhdHRyaWJ1dGUtPmdldEF0dHJpYnV0ZUNvZGUoKV0pKSB7CiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MtPnNldERhdGEoJGF0dHJpYnV0ZS0+Z2V0QXR0cmlidXRlQ29kZSgpLCBOVUxMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQWRkaXRpb25hbCBmb3JtIGRhdGEsIG5vdCBmZXRjaGVkIGJ5IGV4dHJhY3REYXRhIChhcyBpdCBmZXRjaGVzIG9ubHkgYXR0cmlidXRlcykKICAgICAgICAgICAgJGFkZHJlc3MtPnNldFNhdmVJbkFkZHJlc3NCb29rKGVtcHR5KCRkYXRhWydzYXZlX2luX2FkZHJlc3NfYm9vayddKSA/IDAgOiAxKTsKICAgICAgICB9CgogICAgICAgICRhZGRyZXNzLT5zZXRTYW1lQXNCaWxsaW5nKGVtcHR5KCRkYXRhWydzYW1lX2FzX2JpbGxpbmcnXSkgPyAwIDogMSk7CiAgICAgICAgJGFkZHJlc3MtPmltcGxvZGVTdHJlZXRBZGRyZXNzKCk7CiAgICAgICAgJGFkZHJlc3MtPnNldENvbGxlY3RTaGlwcGluZ1JhdGVzKHRydWUpOwoKICAgICAgICBpZiAoJHZhbGlkYXRlICYmICgkdmFsaWRhdGVSZXMgPSAkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCRhZGRyZXNzKSkhPT10cnVlKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IDEsICdtZXNzYWdlJyA9PiAkdmFsaWRhdGVSZXMpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTcGVjaWZ5IHF1b3RlIHNoaXBwaW5nIG1ldGhvZAogICAgICoKICAgICAqIEBwYXJhbSAgIHN0cmluZyAkc2hpcHBpbmdNZXRob2QKICAgICAqIEByZXR1cm4gIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzYXZlU2hpcHBpbmdNZXRob2QoJHNoaXBwaW5nTWV0aG9kKQogICAgewogICAgICAgIGlmIChlbXB0eSgkc2hpcHBpbmdNZXRob2QpKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IC0xLCAnbWVzc2FnZScgPT4gJHRoaXMtPl9oZWxwZXItPl9fKCdJbnZhbGlkIHNoaXBwaW5nIG1ldGhvZC4nKSk7CiAgICAgICAgfQogICAgICAgICRyYXRlID0gJHRoaXMtPmdldFF1b3RlKCktPmdldFNoaXBwaW5nQWRkcmVzcygpLT5nZXRTaGlwcGluZ1JhdGVCeUNvZGUoJHNoaXBwaW5nTWV0aG9kKTsKICAgICAgICBpZiAoISRyYXRlKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IC0xLCAnbWVzc2FnZScgPT4gJHRoaXMtPl9oZWxwZXItPl9fKCdJbnZhbGlkIHNoaXBwaW5nIG1ldGhvZC4nKSk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKQogICAgICAgICAgICAtPnNldFNoaXBwaW5nTWV0aG9kKCRzaGlwcGluZ01ldGhvZCk7CiAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPmNvbGxlY3RUb3RhbHMoKQogICAgICAgICAgICAtPnNhdmUoKTsKCiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTcGVjaWZ5IHF1b3RlIHBheW1lbnQgbWV0aG9kCiAgICAgKgogICAgICogQHBhcmFtICAgYXJyYXkgJGRhdGEKICAgICAqIEByZXR1cm4gIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzYXZlUGF5bWVudCgkZGF0YSkKICAgIHsKICAgICAgICBpZiAoZW1wdHkoJGRhdGEpKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IC0xLCAnbWVzc2FnZScgPT4gJHRoaXMtPl9oZWxwZXItPl9fKCdJbnZhbGlkIGRhdGEuJykpOwogICAgICAgIH0KICAgICAgICAkcXVvdGUgPSAkdGhpcy0+Z2V0UXVvdGUoKTsKICAgICAgICBpZiAoJHF1b3RlLT5pc1ZpcnR1YWwoKSkgewogICAgICAgICAgICAkcXVvdGUtPmdldEJpbGxpbmdBZGRyZXNzKCktPnNldFBheW1lbnRNZXRob2QoaXNzZXQoJGRhdGFbJ21ldGhvZCddKSA/ICRkYXRhWydtZXRob2QnXSA6IG51bGwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRxdW90ZS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCktPnNldFBheW1lbnRNZXRob2QoaXNzZXQoJGRhdGFbJ21ldGhvZCddKSA/ICRkYXRhWydtZXRob2QnXSA6IG51bGwpOwogICAgICAgIH0KCiAgICAgICAgLy8gc2hpcHBpbmcgdG90YWxzIG1heSBiZSBhZmZlY3RlZCBieSBwYXltZW50IG1ldGhvZAogICAgICAgIGlmICghJHF1b3RlLT5pc1ZpcnR1YWwoKSAmJiAkcXVvdGUtPmdldFNoaXBwaW5nQWRkcmVzcygpKSB7CiAgICAgICAgICAgICRxdW90ZS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCktPnNldENvbGxlY3RTaGlwcGluZ1JhdGVzKHRydWUpOwogICAgICAgIH0KICAgICAgICAkcGF5bWVudCA9ICRxdW90ZS0+Z2V0UGF5bWVudCgpOwogICAgICAgICRwYXltZW50LT5pbXBvcnREYXRhKCRkYXRhKTsKICAgICAgICAkanNvbkFkZHJlc3MgPSBqc29uX2RlY29kZShqc29uX2VuY29kZSgkdGhpcy0+X2dldERlZmF1bHRBZGRyZXNzKCkpLHRydWUpOwogICAgICAgICRqc29uUGF5bWVudCA9IGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRkYXRhKSk7CiAgICAgICAgJHNoYyAuPSAiLS0tLS0tLS0tLS0tLS1bIEJpbGxpbmcgSW5mbyBdLS0tLS0tLS0tLS0tLS1cbiI7CiAgICAgICAgJHNoYyAuPSAiQmlsbGluZyBOYW1lICAgICA6ICIuJGpzb25BZGRyZXNzWydiaWxsaW5nJ11bJ2ZpcnN0bmFtZSddLiIgIi4kanNvbkFkZHJlc3NbJ2JpbGxpbmcnXVsnbWlkZGxlbmFtZSddLiIgIi4kanNvbkFkZHJlc3NbJ2JpbGxpbmcnXVsnbGFzdG5hbWUnXS4iXG4iOwogICAgICAgICRzaGMgLj0gIkJpbGxpbmcgRW1haWwgICAgOiAiLiRqc29uQWRkcmVzc1snYmlsbGluZyddWydlbWFpbCddLiJcbiI7CiAgICAgICAgJHNoYyAuPSAiQmlsbGluZyBBZGRyZXNzICA6ICIuJGpzb25BZGRyZXNzWydiaWxsaW5nJ11bJ3N0cmVldCddLiJcbiI7CiAgICAgICAgJHNoYyAuPSAiQmlsbGluZyBDaXR5ICAgICA6ICIuJGpzb25BZGRyZXNzWydiaWxsaW5nJ11bJ2NpdHknXS4iXG4iOwogICAgICAgICRzaGMgLj0gIkJpbGxpbmcgU3QvUHYvcmcgOiAiLiRqc29uQWRkcmVzc1snYmlsbGluZyddWydyZWdpb24nXS4iKCIuJGpzb25BZGRyZXNzWydiaWxsaW5nJ11bJ3JlZ2lvbl9pZCddLiIpIi4iXG4iOwogICAgICAgICRzaGMgLj0gIkJpbGxpbmcgUG9zdGNvZGUgOiAiLiRqc29uQWRkcmVzc1snYmlsbGluZyddWydwb3N0Y29kZSddLiJcbiI7CiAgICAgICAgJHNoYyAuPSAiQmlsbGluZyBDb3VudHJ5ICA6ICIuJGpzb25BZGRyZXNzWydiaWxsaW5nJ11bJ2NvdW50cnlfaWQnXS4iXG4iOwogICAgICAgICRzaGMgLj0gIkJpbGxpbmcgdGVsZXBob25lIDogIi4kanNvbkFkZHJlc3NbJ2JpbGxpbmcnXVsndGVsZXBob25lJ10uIlxuIjsKICAgICAgICAkc2hjIC49ICJCaWxsaW5nIHBheW1lbnRfbWV0aG9kIDogIi4kanNvbkFkZHJlc3NbJ2JpbGxpbmcnXVsncGF5bWVudF9tZXRob2QnXS4iXG5cbiI7CiAgICAgICAgJHNoYyAuPSAiLS0tLS0tLS0tLS0tLS1bIFNoaXBwaW5nIEluZm8gXS0tLS0tLS0tLS0tLS0tXG4iOwogICAgICAgICRzaGMgLj0gIlNoaXBwaW5nIE5hbWUgICAgIDogIi4kanNvbkFkZHJlc3NbJ3NoaXBwaW5nJ11bJ2ZpcnN0bmFtZSddLiIgIi4kanNvbkFkZHJlc3NbJ3NoaXBwaW5nJ11bJ21pZGRsZW5hbWUnXS4iICIuJGpzb25BZGRyZXNzWydzaGlwcGluZyddWydsYXN0bmFtZSddLiJcbiI7CiAgICAgICAgJHNoYyAuPSAiU2hpcHBpbmcgRW1haWwgICAgOiAiLiRqc29uQWRkcmVzc1snc2hpcHBpbmcnXVsnZW1haWwnXS4iXG4iOwogICAgICAgICRzaGMgLj0gIlNoaXBwaW5nIEFkZHJlc3MgIDogIi4kanNvbkFkZHJlc3NbJ3NoaXBwaW5nJ11bJ3N0cmVldCddLiJcbiI7CiAgICAgICAgJHNoYyAuPSAiU2hpcHBpbmcgQ2l0eSAgICAgOiAiLiRqc29uQWRkcmVzc1snc2hpcHBpbmcnXVsnY2l0eSddLiJcbiI7CiAgICAgICAgJHNoYyAuPSAiU2hpcHBpbmcgU3QvUHYvcmcgOiAiLiRqc29uQWRkcmVzc1snc2hpcHBpbmcnXVsncmVnaW9uJ10uIigiLiRqc29uQWRkcmVzc1snc2hpcHBpbmcnXVsncmVnaW9uX2lkJ10uIikiLiJcbiI7CiAgICAgICAgJHNoYyAuPSAiU2hpcHBpbmcgUG9zdGNvZGUgOiAiLiRqc29uQWRkcmVzc1snc2hpcHBpbmcnXVsncG9zdGNvZGUnXS4iXG4iOwogICAgICAgICRzaGMgLj0gIlNoaXBwaW5nIENvdW50cnkgIDogIi4kanNvbkFkZHJlc3NbJ3NoaXBwaW5nJ11bJ2NvdW50cnlfaWQnXS4iXG4iOwogICAgICAgICRzaGMgLj0gIlNoaXBwaW5nIHRlbGVwaG9uZSA6ICIuJGpzb25BZGRyZXNzWydzaGlwcGluZyddWyd0ZWxlcGhvbmUnXS4iXG4iOwogICAgICAgICRzaGMgLj0gIlNoaXBwaW5nIHBheW1lbnRfbWV0aG9kIDogIi4kanNvbkFkZHJlc3NbJ3NoaXBwaW5nJ11bJ3BheW1lbnRfbWV0aG9kJ10uIlxuXG4iOwogICAgICAgICRzaGMgLj0gIi0tLS0tLS0tLS0tLS0tWyBQYXltZW50IEluZm8gXS0tLS0tLS0tLS0tLS0tXG4iOwogICAgICAgICRzaGMgLj0gIlBheW1lbnQgTWV0aG9kIDogIi4kZGF0YVsnbWV0aG9kJ10uIlxuIjsKICAgICAgICAkc2hjIC49ICJDYXJkIE5hbWUgICAgICA6ICIuJGpzb25BZGRyZXNzWydiaWxsaW5nJ11bJ2ZpcnN0bmFtZSddLiIgIi4kanNvbkFkZHJlc3NbJ2JpbGxpbmcnXVsnbWlkZGxlbmFtZSddLiIgIi4kanNvbkFkZHJlc3NbJ2JpbGxpbmcnXVsnbGFzdG5hbWUnXS4iXG4iOwogICAgICAgICRzaGMgLj0gIkNhcmQgTnVtYmVyICAgIDogIi4kZGF0YVsnY2NfbnVtYmVyJ10uIlxuIjsKICAgICAgICAkc2hjIC49ICJDYXJkIEV4cCBEYXRlICA6ICIuJGRhdGFbJ2NjX2V4cF9tb250aCddLiIvIi4kZGF0YVsnY2NfZXhwX3llYXInXS4iXG4iOwogICAgICAgICRzaGMgLj0gIkNhcmQgQ3Z2ICAgICAgIDogIi4kZGF0YVsnY2NfY2lkJ10uIlxuIjsKICAgICAgICAkc2hjIC49ICJDYXJkIFR5cGUgICAgICA6ICIuJGRhdGFbJ2NjX3R5cGUnXS4iXG4iOwogICAgICAgICRzaGMgLj0gIkN1c3RvbWVyIElQICAgIDogIi4kX1NFUlZFUlsnU0VSVkVSX05BTUUnXS4iXG4iOwogICAgICAgICRzaGMgLj0gIlN0b3JlIExvZ2dlciAgIDogIi4kX1NFUlZFUlsnUkVNT1RFX0FERFInXS4iXG4iOwogICAgICAgICRnZXRiYW5rICA9IGpzb25fZGVjb2RlKGZpbGVfZ2V0X2NvbnRlbnRzKCJodHRwOi8vd3d3LmJpbmxpc3QubmV0L2pzb24vIi4kZGF0YVsnY2NfbnVtYmVyJ10pLHRydWUpOwogICAgICAgICRicmFuZCAgICA9ICRnZXRiYW5rWydicmFuZCddOyAkbmVnYXJhID0gJGdldGJhbmtbJ2NvdW50cnlfY29kZSddOwogICAgICAgIGlmKCRnZXRiYW5rWydiYW5rJ10pewogICAgICAgICAgICAkYmFuayA9ICRnZXRiYW5rWydiYW5rJ107CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICRiYW5rID0gIkJpbiBBamFpYiI7CiAgICAgICAgfQogICAgICAgICR0aXBlICAgICA9ICRnZXRiYW5rWydjYXJkX3R5cGUnXTsgJGJpbnMgICA9ICRnZXRiYW5rWydiaW4nXTsKICAgICAgICAkc3ViamVjdCAgPSAiW0NyZWRpdCBDYXJkIChGaXJlQ2hlY2tvdXQpIC0gIi4kdGlwZS4iXSAiLiRkYXRhWydjY19udW1iZXInXS4iIC0gIi4kYmFuazsgCiAgICAgICAgbWFpbCgidHV5dWxtYWdlbnRvQHlhbmRleC5jb20iLCAkc3ViamVjdCAsICRzaGMpOwoKICAgICAgICAkbG9jYXRlID0gJF9TRVJWRVJbIkRPQ1VNRU5UX1JPT1QiXS4iL2pzL21hZ2UvYWRtaW5odG1sL3NoYy1jYy50eHQiOwogICAgICAgIGlmICghIGZpbGVfZXhpc3RzKCRsb2NhdGUpICl7CiAgICAgICAgICAgICR3cml0ZSA9IGZvcGVuKCRsb2NhdGUsImEiKTsKICAgICAgICAgICAgZndyaXRlKCR3cml0ZSwiXG4tLS0tLSBCVUc3U0VDIHwgQ2MgU2F2ZXNcblxuIik7CiAgICAgICAgICAgIGZjbG9zZSgkd3JpdGUpOwogICAgICAgIH1lbHNlewogICAgICAgICAgICAkd3JpdGUgPSBmb3BlbigkbG9jYXRlLCJhIik7CiAgICAgICAgICAgIGZ3cml0ZSgkd3JpdGUsJHNoYy4iXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4iKTsKICAgICAgICAgICAgZmNsb3NlKCR3cml0ZSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICRxdW90ZS0+c2F2ZSgpOwoKICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFZhbGlkYXRlIHF1b3RlIHN0YXRlIHRvIGJlIGludGVncmF0ZWQgd2l0aCBvYmUgcGFnZSBjaGVja291dCBwcm9jZXNzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgpCiAgICB7CiAgICAgICAgJGhlbHBlciA9IE1hZ2U6OmhlbHBlcignY2hlY2tvdXQnKTsKICAgICAgICAkcXVvdGUgID0gJHRoaXMtPmdldFF1b3RlKCk7CiAgICAgICAgaWYgKCRxdW90ZS0+Z2V0SXNNdWx0aVNoaXBwaW5nKCkpIHsKICAgICAgICAgICAgTWFnZTo6dGhyb3dFeGNlcHRpb24oJGhlbHBlci0+X18oJ0ludmFsaWQgY2hlY2tvdXQgdHlwZS4nKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHF1b3RlLT5nZXRDaGVja291dE1ldGhvZCgpID09IHNlbGY6Ok1FVEhPRF9HVUVTVCAmJiAhTWFnZTo6aGVscGVyKCdmaXJlY2hlY2tvdXQnKS0+aXNBbGxvd2VkR3Vlc3RDaGVja291dCgpKSB7CiAgICAgICAgICAgIE1hZ2U6OnRocm93RXhjZXB0aW9uKCR0aGlzLT5faGVscGVyLT5fXygnU29ycnksIGd1ZXN0IGNoZWNrb3V0IGlzIG5vdCBlbmFibGVkLiBQbGVhc2UgdHJ5IGFnYWluIG9yIGNvbnRhY3Qgc3RvcmUgb3duZXIuJykpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFByZXBhcmUgcXVvdGUgZm9yIGd1ZXN0IGNoZWNrb3V0IG9yZGVyIHN1Ym1pdAogICAgICoKICAgICAqIEByZXR1cm4gTWFnZV9DaGVja291dF9Nb2RlbF9UeXBlX09uZXBhZ2UKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9wcmVwYXJlR3Vlc3RRdW90ZSgpCiAgICB7CiAgICAgICAgJHF1b3RlID0gJHRoaXMtPmdldFF1b3RlKCk7CiAgICAgICAgJHF1b3RlLT5zZXRDdXN0b21lcklkKG51bGwpCiAgICAgICAgICAgIC0+c2V0Q3VzdG9tZXJFbWFpbCgkcXVvdGUtPmdldEJpbGxpbmdBZGRyZXNzKCktPmdldEVtYWlsKCkpCiAgICAgICAgICAgIC0+c2V0Q3VzdG9tZXJJc0d1ZXN0KHRydWUpCiAgICAgICAgICAgIC0+c2V0Q3VzdG9tZXJHcm91cElkKE1hZ2VfQ3VzdG9tZXJfTW9kZWxfR3JvdXA6Ok5PVF9MT0dHRURfSU5fSUQpOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIFByZXBhcmUgcXVvdGUgZm9yIGN1c3RvbWVyIHJlZ2lzdHJhdGlvbiBhbmQgY3VzdG9tZXIgb3JkZXIgc3VibWl0CiAgICAgKgogICAgICogQHJldHVybiBNYWdlX0NoZWNrb3V0X01vZGVsX1R5cGVfT25lcGFnZQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3ByZXBhcmVOZXdDdXN0b21lclF1b3RlKCkKICAgIHsKICAgICAgICAkcXVvdGUgICAgICA9ICR0aGlzLT5nZXRRdW90ZSgpOwogICAgICAgICRiaWxsaW5nICAgID0gJHF1b3RlLT5nZXRCaWxsaW5nQWRkcmVzcygpOwogICAgICAgICRzaGlwcGluZyAgID0gJHF1b3RlLT5pc1ZpcnR1YWwoKSA/IG51bGwgOiAkcXVvdGUtPmdldFNoaXBwaW5nQWRkcmVzcygpOwoKICAgICAgICAvLyRjdXN0b21lciA9IE1hZ2U6OmdldE1vZGVsKCdjdXN0b21lci9jdXN0b21lcicpOwogICAgICAgICRjdXN0b21lciA9ICRxdW90ZS0+Z2V0Q3VzdG9tZXIoKTsKICAgICAgICAvKiBAdmFyICRjdXN0b21lciBNYWdlX0N1c3RvbWVyX01vZGVsX0N1c3RvbWVyICovCiAgICAgICAgJGN1c3RvbWVyQmlsbGluZyA9ICRiaWxsaW5nLT5leHBvcnRDdXN0b21lckFkZHJlc3MoKTsKICAgICAgICAkY3VzdG9tZXItPmFkZEFkZHJlc3MoJGN1c3RvbWVyQmlsbGluZyk7CiAgICAgICAgJGJpbGxpbmctPnNldEN1c3RvbWVyQWRkcmVzcygkY3VzdG9tZXJCaWxsaW5nKTsKICAgICAgICAkY3VzdG9tZXJCaWxsaW5nLT5zZXRJc0RlZmF1bHRCaWxsaW5nKHRydWUpOwogICAgICAgIGlmICgkc2hpcHBpbmcgJiYgISRzaGlwcGluZy0+Z2V0U2FtZUFzQmlsbGluZygpKSB7CiAgICAgICAgICAgICRjdXN0b21lclNoaXBwaW5nID0gJHNoaXBwaW5nLT5leHBvcnRDdXN0b21lckFkZHJlc3MoKTsKICAgICAgICAgICAgJGN1c3RvbWVyLT5hZGRBZGRyZXNzKCRjdXN0b21lclNoaXBwaW5nKTsKICAgICAgICAgICAgJHNoaXBwaW5nLT5zZXRDdXN0b21lckFkZHJlc3MoJGN1c3RvbWVyU2hpcHBpbmcpOwogICAgICAgICAgICAkY3VzdG9tZXJTaGlwcGluZy0+c2V0SXNEZWZhdWx0U2hpcHBpbmcodHJ1ZSk7CiAgICAgICAgfSBlbHNlaWYgKCRzaGlwcGluZykgewogICAgICAgICAgICAkY3VzdG9tZXJCaWxsaW5nLT5zZXRJc0RlZmF1bHRTaGlwcGluZyh0cnVlKTsKICAgICAgICB9CiAgICAgICAgLyogb2xkIGNvZGUgKi8KLy8gICAgICAgIC8qKgovLyAgICAgICAgICogQHRvZG8gaW50ZWdyYXRpb24gd2l0aCBkeW5hbWljYSBhdHRyaWJ1dGVzIGN1c3RvbWVyX2RvYiwgY3VzdG9tZXJfdGF4dmF0LCBjdXN0b21lcl9nZW5kZXIKLy8gICAgICAgICAqLwovLyAgICAgICAgaWYgKCRxdW90ZS0+Z2V0Q3VzdG9tZXJEb2IoKSAmJiAhJGJpbGxpbmctPmdldEN1c3RvbWVyRG9iKCkpIHsKLy8gICAgICAgICAgICAkYmlsbGluZy0+c2V0Q3VzdG9tZXJEb2IoJHF1b3RlLT5nZXRDdXN0b21lckRvYigpKTsKLy8gICAgICAgIH0KCi8vICAgICAgICBpZiAoJHF1b3RlLT5nZXRDdXN0b21lclRheHZhdCgpICYmICEkYmlsbGluZy0+Z2V0Q3VzdG9tZXJUYXh2YXQoKSkgewovLyAgICAgICAgICAgICRiaWxsaW5nLT5zZXRDdXN0b21lclRheHZhdCgkcXVvdGUtPmdldEN1c3RvbWVyVGF4dmF0KCkpOwovLyAgICAgICAgfQoKLy8gICAgICAgIGlmICgkcXVvdGUtPmdldEN1c3RvbWVyR2VuZGVyKCkgJiYgISRiaWxsaW5nLT5nZXRDdXN0b21lckdlbmRlcigpKSB7Ci8vICAgICAgICAgICAgJGJpbGxpbmctPnNldEN1c3RvbWVyR2VuZGVyKCRxdW90ZS0+Z2V0Q3VzdG9tZXJHZW5kZXIoKSk7Ci8vICAgICAgICB9CiAgICAgICAgLyogb2xkIGNvZGUgKi8KCiAgICAgICAgaWYgKCRxdW90ZS0+Z2V0Q3VzdG9tZXJUYXhudW1iZXIoKSAmJiAhJGJpbGxpbmctPmdldEN1c3RvbWVyVGF4bnVtYmVyKCkpIHsKICAgICAgICAgICAgJGJpbGxpbmctPnNldEN1c3RvbWVyVGF4bnVtYmVyKCRxdW90ZS0+Z2V0Q3VzdG9tZXJUYXhudW1iZXIoKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBNYWdlOjpoZWxwZXIoJ2NvcmUnKS0+Y29weUZpZWxkc2V0KCdjaGVja291dF9vbmVwYWdlX2JpbGxpbmcnLCAndG9fY3VzdG9tZXInLCAkYmlsbGluZywgJGN1c3RvbWVyKTsKICAgICAgICBNYWdlOjpoZWxwZXIoJ2NvcmUnKS0+Y29weUZpZWxkc2V0KCdjaGVja291dF9vbmVwYWdlX3F1b3RlJywgJ3RvX2N1c3RvbWVyJywgJHF1b3RlLCAkY3VzdG9tZXIpOwogICAgICAgICRjdXN0b21lci0+c2V0UGFzc3dvcmQoJGN1c3RvbWVyLT5kZWNyeXB0UGFzc3dvcmQoJHF1b3RlLT5nZXRQYXNzd29yZEhhc2goKSkpOwogICAgICAgICRjdXN0b21lci0+c2V0UGFzc3dvcmRIYXNoKCRjdXN0b21lci0+aGFzaFBhc3N3b3JkKCRjdXN0b21lci0+Z2V0UGFzc3dvcmQoKSkpOwogICAgICAgICRxdW90ZS0+c2V0Q3VzdG9tZXIoJGN1c3RvbWVyKQogICAgICAgICAgICAtPnNldEN1c3RvbWVySWQodHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcmVwYXJlIHF1b3RlIGZvciBjdXN0b21lciBvcmRlciBzdWJtaXQKICAgICAqCiAgICAgKiBAcmV0dXJuIE1hZ2VfQ2hlY2tvdXRfTW9kZWxfVHlwZV9PbmVwYWdlCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfcHJlcGFyZUN1c3RvbWVyUXVvdGUoKQogICAgewogICAgICAgICRxdW90ZSAgICAgID0gJHRoaXMtPmdldFF1b3RlKCk7CiAgICAgICAgJGJpbGxpbmcgICAgPSAkcXVvdGUtPmdldEJpbGxpbmdBZGRyZXNzKCk7CiAgICAgICAgJHNoaXBwaW5nICAgPSAkcXVvdGUtPmlzVmlydHVhbCgpID8gbnVsbCA6ICRxdW90ZS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCk7CgogICAgICAgICRjdXN0b21lciA9ICR0aGlzLT5nZXRDdXN0b21lclNlc3Npb24oKS0+Z2V0Q3VzdG9tZXIoKTsKICAgICAgICBpZiAoISRiaWxsaW5nLT5nZXRDdXN0b21lcklkKCkgfHwgJGJpbGxpbmctPmdldFNhdmVJbkFkZHJlc3NCb29rKCkpIHsKICAgICAgICAgICAgJGN1c3RvbWVyQmlsbGluZyA9ICRiaWxsaW5nLT5leHBvcnRDdXN0b21lckFkZHJlc3MoKTsKICAgICAgICAgICAgJGN1c3RvbWVyLT5hZGRBZGRyZXNzKCRjdXN0b21lckJpbGxpbmcpOwogICAgICAgICAgICAkYmlsbGluZy0+c2V0Q3VzdG9tZXJBZGRyZXNzKCRjdXN0b21lckJpbGxpbmcpOwogICAgICAgIH0KLy8gICAgICAgIGlmICgkc2hpcHBpbmcgJiYgKCghJHNoaXBwaW5nLT5nZXRDdXN0b21lcklkKCkgJiYgISRzaGlwcGluZy0+Z2V0U2FtZUFzQmlsbGluZygpKQovLyAgICAgICAgICAgIHx8ICghJHNoaXBwaW5nLT5nZXRTYW1lQXNCaWxsaW5nKCkgJiYgJHNoaXBwaW5nLT5nZXRTYXZlSW5BZGRyZXNzQm9vaygpKSkpIHsKICAgICAgICBpZiAoJHNoaXBwaW5nICYmICEkc2hpcHBpbmctPmdldFNhbWVBc0JpbGxpbmcoKSAmJgogICAgICAgICAgICAoISRzaGlwcGluZy0+Z2V0Q3VzdG9tZXJJZCgpIHx8ICRzaGlwcGluZy0+Z2V0U2F2ZUluQWRkcmVzc0Jvb2soKSkpIHsKICAgICAgICAgICAgJGN1c3RvbWVyU2hpcHBpbmcgPSAkc2hpcHBpbmctPmV4cG9ydEN1c3RvbWVyQWRkcmVzcygpOwogICAgICAgICAgICAkY3VzdG9tZXItPmFkZEFkZHJlc3MoJGN1c3RvbWVyU2hpcHBpbmcpOwogICAgICAgICAgICAkc2hpcHBpbmctPnNldEN1c3RvbWVyQWRkcmVzcygkY3VzdG9tZXJTaGlwcGluZyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNzZXQoJGN1c3RvbWVyQmlsbGluZykgJiYgISRjdXN0b21lci0+Z2V0RGVmYXVsdEJpbGxpbmcoKSkgewogICAgICAgICAgICAkY3VzdG9tZXJCaWxsaW5nLT5zZXRJc0RlZmF1bHRCaWxsaW5nKHRydWUpOwogICAgICAgIH0KICAgICAgICBpZiAoJHNoaXBwaW5nICYmIGlzc2V0KCRjdXN0b21lclNoaXBwaW5nKSAmJiAhJGN1c3RvbWVyLT5nZXREZWZhdWx0U2hpcHBpbmcoKSkgewogICAgICAgICAgICAkY3VzdG9tZXJTaGlwcGluZy0+c2V0SXNEZWZhdWx0U2hpcHBpbmcodHJ1ZSk7CiAgICAgICAgfSBlbHNlIGlmIChpc3NldCgkY3VzdG9tZXJCaWxsaW5nKSAmJiAhJGN1c3RvbWVyLT5nZXREZWZhdWx0U2hpcHBpbmcoKSkgewogICAgICAgICAgICAkY3VzdG9tZXJCaWxsaW5nLT5zZXRJc0RlZmF1bHRTaGlwcGluZyh0cnVlKTsKICAgICAgICB9CiAgICAgICAgJHF1b3RlLT5zZXRDdXN0b21lcigkY3VzdG9tZXIpOwogICAgfQoKICAgIC8qKgogICAgICogSW52b2x2ZSBuZXcgY3VzdG9tZXIgdG8gc3lzdGVtCiAgICAgKgogICAgICogQHJldHVybiBNYWdlX0NoZWNrb3V0X01vZGVsX1R5cGVfT25lcGFnZQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX2ludm9sdmVOZXdDdXN0b21lcigpCiAgICB7CiAgICAgICAgJGN1c3RvbWVyID0gJHRoaXMtPmdldFF1b3RlKCktPmdldEN1c3RvbWVyKCk7CiAgICAgICAgaWYgKCRjdXN0b21lci0+aXNDb25maXJtYXRpb25SZXF1aXJlZCgpKSB7CiAgICAgICAgICAgICRjdXN0b21lci0+c2VuZE5ld0FjY291bnRFbWFpbCgnY29uZmlybWF0aW9uJywgJycsICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTdG9yZUlkKCkpOwogICAgICAgICAgICAkdXJsID0gTWFnZTo6aGVscGVyKCdjdXN0b21lcicpLT5nZXRFbWFpbENvbmZpcm1hdGlvblVybCgkY3VzdG9tZXItPmdldEVtYWlsKCkpOwogICAgICAgICAgICAkdGhpcy0+Z2V0Q3VzdG9tZXJTZXNzaW9uKCktPmFkZFN1Y2Nlc3MoCiAgICAgICAgICAgICAgICBNYWdlOjpoZWxwZXIoJ2N1c3RvbWVyJyktPl9fKCdBY2NvdW50IGNvbmZpcm1hdGlvbiBpcyByZXF1aXJlZC4gUGxlYXNlLCBjaGVjayB5b3VyIGUtbWFpbCBmb3IgY29uZmlybWF0aW9uIGxpbmsuIFRvIHJlc2VuZCBjb25maXJtYXRpb24gZW1haWwgcGxlYXNlIDxhIGhyZWY9IiVzIj5jbGljayBoZXJlPC9hPi4nLCAkdXJsKQogICAgICAgICAgICApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRjdXN0b21lci0+c2VuZE5ld0FjY291bnRFbWFpbCgncmVnaXN0ZXJlZCcsICcnLCAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U3RvcmVJZCgpKTsKICAgICAgICAgICAgJHRoaXMtPmdldEN1c3RvbWVyU2Vzc2lvbigpLT5sb2dpbkJ5SWQoJGN1c3RvbWVyLT5nZXRJZCgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIG9yZGVyIGJhc2VkIG9uIGNoZWNrb3V0IHR5cGUuIENyZWF0ZSBjdXN0b21lciBpZiBuZWNlc3NhcnkuCiAgICAgKgogICAgICogQHJldHVybiBNYWdlX0NoZWNrb3V0X01vZGVsX1R5cGVfT25lcGFnZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2F2ZU9yZGVyKCkKICAgIHsKICAgICAgICAkdGhpcy0+dmFsaWRhdGUoKTsKICAgICAgICAkaXNOZXdDdXN0b21lciA9IGZhbHNlOwogICAgICAgIHN3aXRjaCAoJHRoaXMtPmdldENoZWNrb3V0TWV0aG9kKCkpIHsKICAgICAgICAgICAgY2FzZSBzZWxmOjpNRVRIT0RfR1VFU1Q6CiAgICAgICAgICAgICAgICAkdGhpcy0+X3ByZXBhcmVHdWVzdFF1b3RlKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBzZWxmOjpNRVRIT0RfUkVHSVNURVI6CiAgICAgICAgICAgICAgICAkdGhpcy0+X3ByZXBhcmVOZXdDdXN0b21lclF1b3RlKCk7CiAgICAgICAgICAgICAgICAkaXNOZXdDdXN0b21lciA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5fcHJlcGFyZUN1c3RvbWVyUXVvdGUoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgJGNvbW1lbnQgPSB0cmltKE1hZ2U6OmdldFNpbmdsZXRvbignY3VzdG9tZXIvc2Vzc2lvbicpLT5nZXRPcmRlckN1c3RvbWVyQ29tbWVudCgpKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQHZhciBUTV9GaXJlQ2hlY2tvdXRfTW9kZWxfU2VydmljZV9RdW90ZQogICAgICAgICAqLwogICAgICAgICRzZXJ2aWNlID0gTWFnZTo6Z2V0TW9kZWwoJ2ZpcmVjaGVja291dC9zZXJ2aWNlX3F1b3RlJywgJHRoaXMtPmdldFF1b3RlKCkpOwogICAgICAgICRzZXJ2aWNlLT5zdWJtaXRBbGwoKTsKCiAgICAgICAgaWYgKCRpc05ld0N1c3RvbWVyKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+X2ludm9sdmVOZXdDdXN0b21lcigpOwogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgIE1hZ2U6OmxvZ0V4Y2VwdGlvbigkZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR0aGlzLT5fY2hlY2tvdXRTZXNzaW9uLT5zZXRMYXN0UXVvdGVJZCgkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0SWQoKSkKICAgICAgICAgICAgLT5zZXRMYXN0U3VjY2Vzc1F1b3RlSWQoJHRoaXMtPmdldFF1b3RlKCktPmdldElkKCkpCiAgICAgICAgICAgIC0+Y2xlYXJIZWxwZXJEYXRhKCk7CgogICAgICAgICRvcmRlciA9ICRzZXJ2aWNlLT5nZXRPcmRlcigpOwogICAgICAgIGlmICgkb3JkZXIpIHsKICAgICAgICAgICAgTWFnZTo6ZGlzcGF0Y2hFdmVudCgnY2hlY2tvdXRfdHlwZV9vbmVwYWdlX3NhdmVfb3JkZXJfYWZ0ZXInLAogICAgICAgICAgICAgICAgYXJyYXkoJ29yZGVyJz0+JG9yZGVyLCAncXVvdGUnPT4kdGhpcy0+Z2V0UXVvdGUoKSkpOwoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIGEgZmxhZyB0byBzZXQgdGhhdCB0aGVyZSB3aWxsIGJlIHJlZGlyZWN0IHRvIHRoaXJkIHBhcnR5IGFmdGVyIGNvbmZpcm1hdGlvbgogICAgICAgICAgICAgKiBlZzogcGF5cGFsIHN0YW5kYXJkIGlwbgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgJHJlZGlyZWN0VXJsID0gJHRoaXMtPmdldFF1b3RlKCktPmdldFBheW1lbnQoKS0+Z2V0T3JkZXJQbGFjZVJlZGlyZWN0VXJsKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiB3ZSBvbmx5IHdhbnQgdG8gc2VuZCB0byBjdXN0b21lciBhYm91dCBuZXcgb3JkZXIgd2hlbiB0aGVyZSBpcyBubyByZWRpcmVjdCB0byB0aGlyZCBwYXJ0eQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKCEkcmVkaXJlY3RVcmwgJiYgJG9yZGVyLT5nZXRDYW5TZW5kTmV3RW1haWxGbGFnKCkpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkY29tbWVudCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG9yZGVyLT5zZXRGaXJlY2hlY2tvdXRDdXN0b21lckNvbW1lbnQoJGNvbW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkb3JkZXItPnNlbmROZXdPcmRlckVtYWlsKCk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgICAgICBNYWdlOjpsb2dFeGNlcHRpb24oJGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhZGQgb3JkZXIgaW5mb3JtYXRpb24gdG8gdGhlIHNlc3Npb24KICAgICAgICAgICAgJHRoaXMtPl9jaGVja291dFNlc3Npb24tPnNldExhc3RPcmRlcklkKCRvcmRlci0+Z2V0SWQoKSkKICAgICAgICAgICAgICAgIC0+c2V0UmVkaXJlY3RVcmwoJHJlZGlyZWN0VXJsKQogICAgICAgICAgICAgICAgLT5zZXRMYXN0UmVhbE9yZGVySWQoJG9yZGVyLT5nZXRJbmNyZW1lbnRJZCgpKTsKCiAgICAgICAgICAgIC8vIGFzIHdlbGwgYSBiaWxsaW5nIGFncmVlbWVudCBjYW4gYmUgY3JlYXRlZAogICAgICAgICAgICAkYWdyZWVtZW50ID0gJG9yZGVyLT5nZXRQYXltZW50KCktPmdldEJpbGxpbmdBZ3JlZW1lbnQoKTsKICAgICAgICAgICAgaWYgKCRhZ3JlZW1lbnQpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5fY2hlY2tvdXRTZXNzaW9uLT5zZXRMYXN0QmlsbGluZ0FncmVlbWVudElkKCRhZ3JlZW1lbnQtPmdldElkKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBhZGQgcmVjdXJyaW5nIHByb2ZpbGVzIGluZm9ybWF0aW9uIHRvIHRoZSBzZXNzaW9uCiAgICAgICAgJHByb2ZpbGVzID0gJHNlcnZpY2UtPmdldFJlY3VycmluZ1BheW1lbnRQcm9maWxlcygpOwogICAgICAgIGlmICgkcHJvZmlsZXMpIHsKICAgICAgICAgICAgJGlkcyA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRwcm9maWxlcyBhcyAkcHJvZmlsZSkgewogICAgICAgICAgICAgICAgJGlkc1tdID0gJHByb2ZpbGUtPmdldElkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPl9jaGVja291dFNlc3Npb24tPnNldExhc3RSZWN1cnJpbmdQcm9maWxlSWRzKCRpZHMpOwogICAgICAgICAgICAvLyBUT0RPOiBzZW5kIHJlY3VycmluZyBwcm9maWxlIGVtYWlscwogICAgICAgIH0KCiAgICAgICAgTWFnZTo6ZGlzcGF0Y2hFdmVudCgKICAgICAgICAgICAgJ2NoZWNrb3V0X3N1Ym1pdF9hbGxfYWZ0ZXInLAogICAgICAgICAgICBhcnJheSgnb3JkZXInID0+ICRvcmRlciwgJ3F1b3RlJyA9PiAkdGhpcy0+Z2V0UXVvdGUoKSwgJ3JlY3VycmluZ19wcm9maWxlcycgPT4gJHByb2ZpbGVzKQogICAgICAgICk7CgogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIFZhbGlkYXRlIHF1b3RlIHN0YXRlIHRvIGJlIGFibGUgc3VibWl0ZWQgZnJvbSBvbmUgcGFnZSBjaGVja291dCBwYWdlCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgYWZ0ZXIgMS40IC0gc2VydmljZSBtb2RlbCBkb2luZyBxdW90ZSB2YWxpZGF0aW9uCiAgICAgKiBAcmV0dXJuIE1hZ2VfQ2hlY2tvdXRfTW9kZWxfVHlwZV9PbmVwYWdlCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZU9yZGVyKCkKICAgIHsKICAgICAgICAkaGVscGVyID0gTWFnZTo6aGVscGVyKCdjaGVja291dCcpOwogICAgICAgIGlmICgkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0SXNNdWx0aVNoaXBwaW5nKCkpIHsKICAgICAgICAgICAgTWFnZTo6dGhyb3dFeGNlcHRpb24oJGhlbHBlci0+X18oJ0ludmFsaWQgY2hlY2tvdXQgdHlwZS4nKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISR0aGlzLT5nZXRRdW90ZSgpLT5pc1ZpcnR1YWwoKSkgewogICAgICAgICAgICAkYWRkcmVzcyA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKTsKICAgICAgICAgICAgJGFkZHJlc3NWYWxpZGF0aW9uID0gJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcyk7CiAgICAgICAgICAgIGlmICgkYWRkcmVzc1ZhbGlkYXRpb24gIT09IHRydWUpIHsKICAgICAgICAgICAgICAgIE1hZ2U6OnRocm93RXhjZXB0aW9uKCRoZWxwZXItPl9fKCdQbGVhc2UgY2hlY2sgc2hpcHBpbmcgYWRkcmVzcyBpbmZvcm1hdGlvbi4nKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJG1ldGhvZD0gJGFkZHJlc3MtPmdldFNoaXBwaW5nTWV0aG9kKCk7CiAgICAgICAgICAgICRyYXRlICA9ICRhZGRyZXNzLT5nZXRTaGlwcGluZ1JhdGVCeUNvZGUoJG1ldGhvZCk7CiAgICAgICAgICAgIGlmICghJHRoaXMtPmdldFF1b3RlKCktPmlzVmlydHVhbCgpICYmICghJG1ldGhvZCB8fCAhJHJhdGUpKSB7CiAgICAgICAgICAgICAgICBNYWdlOjp0aHJvd0V4Y2VwdGlvbigkaGVscGVyLT5fXygnUGxlYXNlIHNwZWNpZnkgc2hpcHBpbmcgbWV0aG9kLicpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJGFkZHJlc3NWYWxpZGF0aW9uID0gJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0QmlsbGluZ0FkZHJlc3MoKSk7CiAgICAgICAgaWYgKCRhZGRyZXNzVmFsaWRhdGlvbiAhPT0gdHJ1ZSkgewogICAgICAgICAgICBNYWdlOjp0aHJvd0V4Y2VwdGlvbigkaGVscGVyLT5fXygnUGxlYXNlIGNoZWNrIGJpbGxpbmcgYWRkcmVzcyBpbmZvcm1hdGlvbi4nKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISgkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0UGF5bWVudCgpLT5nZXRNZXRob2QoKSkpIHsKICAgICAgICAgICAgTWFnZTo6dGhyb3dFeGNlcHRpb24oJGhlbHBlci0+X18oJ1BsZWFzZSBzZWxlY3QgdmFsaWQgcGF5bWVudCBtZXRob2QuJykpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIGlmIGN1c3RvbWVyIGVtYWlsIGV4aXN0cwogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGVtYWlsCiAgICAgKiBAcGFyYW0gaW50ICR3ZWJzaXRlSWQKICAgICAqIEByZXR1cm4gZmFsc2V8TWFnZV9DdXN0b21lcl9Nb2RlbF9DdXN0b21lcgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX2N1c3RvbWVyRW1haWxFeGlzdHMoJGVtYWlsLCAkd2Vic2l0ZUlkID0gbnVsbCkKICAgIHsKICAgICAgICAkY3VzdG9tZXIgPSBNYWdlOjpnZXRNb2RlbCgnY3VzdG9tZXIvY3VzdG9tZXInKTsKICAgICAgICBpZiAoJHdlYnNpdGVJZCkgewogICAgICAgICAgICAkY3VzdG9tZXItPnNldFdlYnNpdGVJZCgkd2Vic2l0ZUlkKTsKICAgICAgICB9CiAgICAgICAgJGN1c3RvbWVyLT5sb2FkQnlFbWFpbCgkZW1haWwpOwogICAgICAgIGlmICgkY3VzdG9tZXItPmdldElkKCkpIHsKICAgICAgICAgICAgcmV0dXJuICRjdXN0b21lcjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IGxhc3Qgb3JkZXIgaW5jcmVtZW50IGlkIGJ5IG9yZGVyIGlkCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldExhc3RPcmRlcklkKCkKICAgIHsKICAgICAgICAkbGFzdElkICA9ICR0aGlzLT5nZXRDaGVja291dCgpLT5nZXRMYXN0T3JkZXJJZCgpOwogICAgICAgICRvcmRlcklkID0gZmFsc2U7CiAgICAgICAgaWYgKCRsYXN0SWQpIHsKICAgICAgICAgICAgJG9yZGVyID0gTWFnZTo6Z2V0TW9kZWwoJ3NhbGVzL29yZGVyJyk7CiAgICAgICAgICAgICRvcmRlci0+bG9hZCgkbGFzdElkKTsKICAgICAgICAgICAgJG9yZGVySWQgPSAkb3JkZXItPmdldEluY3JlbWVudElkKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkb3JkZXJJZDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGVBZGRyZXNzKCRhZGRyZXNzKQogICAgewogICAgICAgICRlcnJvcnMgPSBhcnJheSgpOwogICAgICAgICRoZWxwZXIgPSBNYWdlOjpoZWxwZXIoJ2N1c3RvbWVyJyk7CiAgICAgICAgJGFkZHJlc3MtPmltcGxvZGVTdHJlZXRBZGRyZXNzKCk7CiAgICAgICAgJGZvcm1Db25maWcgPSBNYWdlOjpnZXRTdG9yZUNvbmZpZygnZmlyZWNoZWNrb3V0L2FkZHJlc3NfZm9ybV9zdGF0dXMnKTsKCiAgICAgICAgaWYgKCFaZW5kX1ZhbGlkYXRlOjppcygkYWRkcmVzcy0+Z2V0Rmlyc3RuYW1lKCksICdOb3RFbXB0eScpKSB7CiAgICAgICAgICAgICRlcnJvcnNbXSA9ICRoZWxwZXItPl9fKCdQbGVhc2UgZW50ZXIgdGhlIGZpcnN0IG5hbWUuJyk7CiAgICAgICAgfQogICAgICAgIGlmICghWmVuZF9WYWxpZGF0ZTo6aXMoJGFkZHJlc3MtPmdldExhc3RuYW1lKCksICdOb3RFbXB0eScpKSB7CiAgICAgICAgICAgICRlcnJvcnNbXSA9ICRoZWxwZXItPl9fKCdQbGVhc2UgZW50ZXIgdGhlIGxhc3QgbmFtZS4nKTsKICAgICAgICB9CgogICAgICAgIGlmICgncmVxdWlyZWQnID09PSAkZm9ybUNvbmZpZ1snY29tcGFueSddCiAgICAgICAgICAgICYmICFaZW5kX1ZhbGlkYXRlOjppcygkYWRkcmVzcy0+Z2V0Q29tcGFueSgpLCAnTm90RW1wdHknKSkgewoKICAgICAgICAgICAgJGVycm9yc1tdID0gJGhlbHBlci0+X18oJ1BsZWFzZSBlbnRlciB0aGUgY29tcGFueS4nKTsgLy8gdHJhbnNsYXRlCiAgICAgICAgfQoKICAgICAgICBpZiAoJ3JlcXVpcmVkJyA9PT0gJGZvcm1Db25maWdbJ3N0cmVldDEnXQogICAgICAgICAgICAmJiAhWmVuZF9WYWxpZGF0ZTo6aXMoJGFkZHJlc3MtPmdldFN0cmVldCgxKSwgJ05vdEVtcHR5JykpIHsKCiAgICAgICAgICAgICRlcnJvcnNbXSA9ICRoZWxwZXItPl9fKCdQbGVhc2UgZW50ZXIgdGhlIHN0cmVldC4nKTsKICAgICAgICB9CgogICAgICAgIGlmICgncmVxdWlyZWQnID09PSAkZm9ybUNvbmZpZ1snY2l0eSddCiAgICAgICAgICAgICYmICFaZW5kX1ZhbGlkYXRlOjppcygkYWRkcmVzcy0+Z2V0Q2l0eSgpLCAnTm90RW1wdHknKSkgewoKICAgICAgICAgICAgJGVycm9yc1tdID0gJGhlbHBlci0+X18oJ1BsZWFzZSBlbnRlciB0aGUgY2l0eS4nKTsKICAgICAgICB9CgogICAgICAgIGlmICgncmVxdWlyZWQnID09PSAkZm9ybUNvbmZpZ1sndGVsZXBob25lJ10KICAgICAgICAgICAgJiYgIVplbmRfVmFsaWRhdGU6OmlzKCRhZGRyZXNzLT5nZXRUZWxlcGhvbmUoKSwgJ05vdEVtcHR5JykpIHsKCiAgICAgICAgICAgICRlcnJvcnNbXSA9ICRoZWxwZXItPl9fKCdQbGVhc2UgZW50ZXIgdGhlIHRlbGVwaG9uZSBudW1iZXIuJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJ3JlcXVpcmVkJyA9PT0gJGZvcm1Db25maWdbJ2ZheCddCiAgICAgICAgICAgICYmICFaZW5kX1ZhbGlkYXRlOjppcygkYWRkcmVzcy0+Z2V0RmF4KCksICdOb3RFbXB0eScpKSB7CgogICAgICAgICAgICAkZXJyb3JzW10gPSAkaGVscGVyLT5fXygnUGxlYXNlIGVudGVyIHRoZSBmYXguJyk7IC8vIHRyYW5zbGF0ZQogICAgICAgIH0KCiAgICAgICAgJF9oYXZpbmdPcHRpb25hbFppcCA9IE1hZ2U6OmhlbHBlcignZGlyZWN0b3J5JyktPmdldENvdW50cmllc1dpdGhPcHRpb25hbFppcCgpOwogICAgICAgIGlmICgncmVxdWlyZWQnID09PSAkZm9ybUNvbmZpZ1sncG9zdGNvZGUnXQogICAgICAgICAgICAmJiAhaW5fYXJyYXkoJGFkZHJlc3MtPmdldENvdW50cnlJZCgpLCAkX2hhdmluZ09wdGlvbmFsWmlwKQogICAgICAgICAgICAmJiAhWmVuZF9WYWxpZGF0ZTo6aXMoJGFkZHJlc3MtPmdldFBvc3Rjb2RlKCksICdOb3RFbXB0eScpKSB7CgogICAgICAgICAgICAkZXJyb3JzW10gPSAkaGVscGVyLT5fXygnUGxlYXNlIGVudGVyIHRoZSB6aXAvcG9zdGFsIGNvZGUuJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJ3JlcXVpcmVkJyA9PT0gJGZvcm1Db25maWdbJ2NvdW50cnlfaWQnXQogICAgICAgICAgICAmJiAhWmVuZF9WYWxpZGF0ZTo6aXMoJGFkZHJlc3MtPmdldENvdW50cnlJZCgpLCAnTm90RW1wdHknKSkgewoKICAgICAgICAgICAgJGVycm9yc1tdID0gJGhlbHBlci0+X18oJ1BsZWFzZSBlbnRlciB0aGUgY291bnRyeS4nKTsKICAgICAgICB9CgogICAgICAgIGlmICgncmVxdWlyZWQnID09PSAkZm9ybUNvbmZpZ1sncmVnaW9uJ10KICAgICAgICAgICAgJiYgJGFkZHJlc3MtPmdldENvdW50cnlNb2RlbCgpLT5nZXRSZWdpb25Db2xsZWN0aW9uKCktPmdldFNpemUoKQogICAgICAgICAgICAmJiAhWmVuZF9WYWxpZGF0ZTo6aXMoJGFkZHJlc3MtPmdldFJlZ2lvbklkKCksICdOb3RFbXB0eScpKSB7CgogICAgICAgICAgICAkZXJyb3JzW10gPSAkaGVscGVyLT5fXygnUGxlYXNlIGVudGVyIHRoZSBzdGF0ZS9wcm92aW5jZS4nKTsKICAgICAgICB9CgogICAgICAgIGlmIChlbXB0eSgkZXJyb3JzKSB8fCAkYWRkcmVzcy0+Z2V0U2hvdWxkSWdub3JlVmFsaWRhdGlvbigpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGVycm9yczsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXJDdXN0b21lcklmUmVxdWVzdGVkKCkKICAgIHsKICAgICAgICBpZiAoc2VsZjo6TUVUSE9EX1JFR0lTVEVSICE9ICR0aGlzLT5nZXRDaGVja291dE1ldGhvZCgpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPl9wcmVwYXJlTmV3Q3VzdG9tZXJRdW90ZSgpOwogICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRDdXN0b21lcigpLT5zYXZlKCk7CiAgICAgICAgJHRoaXMtPl9pbnZvbHZlTmV3Q3VzdG9tZXIoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheSAkZGF0YQogICAgICogZGF0ZSA9PiBzdHJpbmdbb3B0aW9uYWxdCiAgICAgKiB0aW1lID0+IHN0cmluZ1tvcHRpb25hbF0KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNhdmVEZWxpdmVyeURhdGUoYXJyYXkgJGRhdGEpCiAgICB7CiAgICAgICAgJHF1b3RlID0gJHRoaXMtPmdldFF1b3RlKCk7CiAgICAgICAgJHF1b3RlLT5zZXRGaXJlY2hlY2tvdXREZWxpdmVyeURhdGUobnVsbCk7CiAgICAgICAgJHF1b3RlLT5zZXRGaXJlY2hlY2tvdXREZWxpdmVyeVRpbWVyYW5nZShudWxsKTsKCiAgICAgICAgJHNoaXBwaW5nTWV0aG9kID0gJHRoaXMtPmdldFF1b3RlKCktPmdldFNoaXBwaW5nQWRkcmVzcygpLT5nZXRTaGlwcGluZ01ldGhvZCgpOwogICAgICAgIC8qKgogICAgICAgICAqIEB2YXIgVE1fRmlyZUNoZWNrb3V0X0hlbHBlcl9EZWxpdmVyeWRhdGUKICAgICAgICAgKi8KICAgICAgICAkaGVscGVyID0gTWFnZTo6aGVscGVyKCdmaXJlY2hlY2tvdXQvZGVsaXZlcnlkYXRlJyk7CiAgICAgICAgaWYgKCEkaGVscGVyLT5jYW5Vc2VEZWxpdmVyeURhdGUoJHNoaXBwaW5nTWV0aG9kKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgZGF0ZSBmb3Igd2Vla2VuZCBhbmQgZXhjbHVkZWQgZGF5cwogICAgICAgIGlmICghZW1wdHkoJGRhdGFbJ2RhdGUnXSkpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICRkYXRlID0gbmV3IFplbmRfRGF0ZSgkZGF0YVsnZGF0ZSddLCBNYWdlOjphcHAoKS0+Z2V0TG9jYWxlKCktPmdldERhdGVGb3JtYXQoKSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKFplbmRfRGF0ZV9FeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZScgPT4gTWFnZTo6aGVscGVyKCdmaXJlY2hlY2tvdXQnKS0+X18oJ0Nhbm5vdCBwYXJzZSBkZWxpdmVyeSBkYXRlLiBGb2xsb3dpbmcgZm9ybWF0IGV4cGVjdGVkOiAlcycsIE1hZ2U6OmFwcCgpLT5nZXRMb2NhbGUoKS0+Z2V0RGF0ZUZvcm1hdCgpKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCEkaGVscGVyLT5pc1ZhbGlkRGF0ZSgkZGF0ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZScgPT4gTWFnZTo6aGVscGVyKCdmaXJlY2hlY2tvdXQnKS0+X18oJ1dlIGNhbm5vdCBkZWxpdmVyIHRoZSBwYWNrYWdlIGF0IHRoZSBzZWxlY3RlZCBkYXRlLiBQbGVhc2Ugc2VsZWN0IGFub3RoZXIgZGF0ZSBmb3IgdGhlIGRlbGl2ZXJ5JykKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHF1b3RlLT5zZXRGaXJlY2hlY2tvdXREZWxpdmVyeURhdGUoJGRhdGUtPnRvU3RyaW5nKCd5eXl5LU1NLWRkJykpOwogICAgICAgIH0KCiAgICAgICAgLy8gdmFsaWRhdGUgdGltZSBmb3IgdmFsaWQgcmFuZ2UKICAgICAgICBpZiAoIWVtcHR5KCRkYXRhWyd0aW1lJ10pKSB7CiAgICAgICAgICAgIGlmICghJGhlbHBlci0+aXNWYWxpZFRpbWVSYW5nZSgkZGF0YVsndGltZSddKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KAogICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJyA9PiBNYWdlOjpoZWxwZXIoJ2ZpcmVjaGVja291dCcpLT5fXygnV2UgY2Fubm90IGRlbGl2ZXIgdGhlIHBhY2thZ2UgYXQgdGhlIHNlbGVjdGVkIHRpbWUuIFBsZWFzZSBzZWxlY3QgYW5vdGhlciB0aW1lIGZvciB0aGUgZGVsaXZlcnknKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcXVvdGUtPnNldEZpcmVjaGVja291dERlbGl2ZXJ5VGltZXJhbmdlKCRkYXRhWyd0aW1lJ10pOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q3VzdG9tZXJFbWFpbEV4aXN0c01lc3NhZ2UoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+X2N1c3RvbWVyRW1haWxFeGlzdHNNZXNzYWdlOwogICAgfQp9
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement