aW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKaW1wb3J0IGphdmF4LnN3aW5nLio7CmltcG9ydCBqYXZhLnV0aWwuKjsKaW1wb3J0IGphdmEuYXd0Lio7CmltcG9ydCBqYXZhLnNxbC4qOwovKioKICoKICogQGF1dGhvciBTaHVrcmkgQWxpCiAqLwpwdWJsaWMgY2xhc3MgTWVudG9yR3VpIGV4dGVuZHMgamF2YXguc3dpbmcuSkZyYW1lIHsKICAgIGVudW0gUGFuZWwgewogICAgICAgIExPR0lOX1BBTkVMLAogICAgICAgIE1FTlRPUl9JTkZPX1BBTkVMOwogICAgfQogICAgCiAgICBlbnVtIEhpZ2hlc3REZWdyZWUgewogICAgICAgIEFTU09DSUFURSwKICAgICAgICBCQUNIRUxPUiwKICAgICAgICBNQVNURVIsCiAgICAgICAgRE9DVE9SOwogICAgICAgIAogICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZ3JlZUJ5TmFtZShTdHJpbmcgbmFtZSkgewogICAgICAgICAgICBmb3IgKEhpZ2hlc3REZWdyZWUgZGVncmVlIDogdmFsdWVzKCkpIHsKICAgICAgICAgICAgICAgIFN0cmluZyBkZWdyZWVTdHIgPSBkZWdyZWUubmFtZSgpOwogICAgICAgICAgICAgICAgaWYgKGRlZ3JlZVN0ci5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZ3JlZVN0cjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfQogICAgCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSTkFNRSA9ICZxdW90O1VTRVJOQU1FJnF1b3Q7OwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEID0gJnF1b3Q7UEFTU1dPUkQmcXVvdDs7CiAgICAvLyBNZW50b3IgaW5mb3JtYXRpb24gcGFuZWwKICAgIHByaXZhdGUgSlBhbmVsIG1lbnRvckluZm9QYW5lbDsKICAgIAogICAgcHJpdmF0ZSBKVGV4dEFyZWEgYWRkcmVzc1RleHRBcmVhOwogICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGVtYWlsVGV4dEZpZWxkOwogICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGZpcnN0TmFtZVRleHRGaWVsZDsKICAgIHByaXZhdGUgSlRleHRGaWVsZCBsYXN0TmFtZVRleHRGaWVsZDsKICAgIHByaXZhdGUgSlRleHRGaWVsZCB0ZWxlcGhvbmVUZXh0RmllbGQ7CiAgICAKICAgIHByaXZhdGUgZmluYWwgamF2YS51dGlsLkxpc3QmbHQ7SkNoZWNrQm94Jmd0OyBjaGVja0JveExpc3QgPSBuZXcgQXJyYXlMaXN0Jmx0OyZndDsoKTsKICAgIHByaXZhdGUgSkNvbWJvQm94Jmx0O1N0cmluZyZndDsgZGVncmVlQ29tYm9Cb3g7CiAgICBwcml2YXRlIEpDb21ib0JveCZsdDtTdHJpbmcmZ3Q7IGdyYWR1YXRpb25Db21ib0JveDsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGUk9NX0dSQURVQVRJT05fWUVBUiA9IDIwMTI7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9fR1JBRFVBVElPTl9ZRUFSID0gMjAyMjsKICAgIHByaXZhdGUgSkJ1dHRvbiByZXNldEJ1dHRvbjsKICAgIHByaXZhdGUgSkJ1dHRvbiBzYXZlQnV0dG9uOwogIAogICAgLy8gbG9naW4gcGFuZWwgY29tcG9uZW50cwogICAgcHJpdmF0ZSBKUGFuZWwgbG9naW5QYW5lbDsKICAgIAogICAgcHJpdmF0ZSBKTGFiZWwgbG9naW5UaXRsZUxhYmVsOwogICAgcHJpdmF0ZSBKTGFiZWwgdXNlcm5hbWVMYWJlbDsKICAgIHByaXZhdGUgSkxhYmVsIHBhc3N3b3JkTGFiZWw7CiAgICAKICAgIHByaXZhdGUgSlRleHRGaWVsZCB1c2VybmFtZVRleHRGaWVsZDsKICAgIHByaXZhdGUgSlBhc3N3b3JkRmllbGQgcGFzc3dvcmRUZXh0RmllbGQ7CiAgICBwcml2YXRlIEpCdXR0b24gc3VibWl0QnV0dG9uOwogICAgLyoqCiAgICAgKiBDcmVhdGVzIG5ldyBmb3JtIE1lbnRvckd1aQogICAgICovCiAgICBwdWJsaWMgTWVudG9yR3VpKCkgewogICAgICAgIAogICAgICAgIGluaXRDb21wb25lbnRzKCk7CiAgICB9CiAgICAvKioKICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgY29uc3RydWN0b3IgdG8gaW5pdGlhbGl6ZSB0aGUgZm9ybS4KICAgICAqIFdBUk5JTkc6IERvIE5PVCBtb2RpZnkgdGhpcyBjb2RlLiBUaGUgY29udGVudCBvZiB0aGlzIG1ldGhvZCBpcyBhbHdheXMKICAgICAqIHJlZ2VuZXJhdGVkIGJ5IHRoZSBGb3JtIEVkaXRvci4KICAgICAqLwogICAgQFN1cHByZXNzV2FybmluZ3MoJnF1b3Q7dW5jaGVja2VkJnF1b3Q7KQogICAgLy8gJmx0O2VkaXRvci1mb2xkIGRlZmF1bHRzdGF0ZT0mcXVvdDtjb2xsYXBzZWQmcXVvdDsgZGVzYz0mcXVvdDtHZW5lcmF0ZWQgQ29kZSZxdW90OyZndDsgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgcHJpdmF0ZSB2b2lkIGluaXRDb21wb25lbnRzKCkgewogICAgICAgIGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cyBncmlkQmFnQ29uc3RyYWludHM7CgogICAgICAgIGxvZ2luUGFuZWwgPSBuZXcgSlBhbmVsKCk7CiAgICAgICAgcGFzc3dvcmRMYWJlbCA9IG5ldyBKTGFiZWwoKTsKICAgICAgICB1c2VybmFtZUxhYmVsID0gbmV3IEpMYWJlbCgpOwogICAgICAgIHN1Ym1pdEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCk7CiAgICAgICAgdXNlcm5hbWVUZXh0RmllbGQgPSBuZXcgSlRleHRGaWVsZCgpOwogICAgICAgIHBhc3N3b3JkVGV4dEZpZWxkID0gbmV3IEpQYXNzd29yZEZpZWxkKCk7CiAgICAgICAgbG9naW5UaXRsZUxhYmVsID0gbmV3IEpMYWJlbCgpOwogICAgICAgIG1lbnRvckluZm9QYW5lbCA9IG5ldyBKUGFuZWwoKTsKICAgICAgICBmaXJzdE5hbWVUZXh0RmllbGQgPSBuZXcgSlRleHRGaWVsZCgpOwogICAgICAgIGxhc3ROYW1lVGV4dEZpZWxkID0gbmV3IEpUZXh0RmllbGQoKTsKICAgICAgICAKICAgICAgICBlbWFpbFRleHRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCk7CiAgICAgICAgCiAgICAgICAgdGVsZXBob25lVGV4dEZpZWxkID0gbmV3IEpUZXh0RmllbGQoKTsKICAgICAgICBKTGFiZWwgZGVncmVlTGFiZWwgPSBuZXcgSkxhYmVsKCk7CiAgICAgICAgSkxhYmVsIGFkZHJlc3NMYWJlbCA9IG5ldyBKTGFiZWwoKTsKICAgICAgICBkZWdyZWVDb21ib0JveCA9IG5ldyBKQ29tYm9Cb3gmbHQ7Jmd0OygpOwogICAgICAgIEpMYWJlbCBncmFkdWF0aW9uTGFiZWwgPSBuZXcgSkxhYmVsKCk7CiAgICAgICAgZ3JhZHVhdGlvbkNvbWJvQm94ID0gbmV3IEpDb21ib0JveCZsdDsmZ3Q7KCk7CiAgICAgICAgSkxhYmVsIGludGVyZXN0c0xhYmVsID0gbmV3IEpMYWJlbCgpOwogICAgICAgIHNhdmVCdXR0b24gPSBuZXcgSkJ1dHRvbigpOwogICAgICAgIHJlc2V0QnV0dG9uID0gbmV3IEpCdXR0b24oKTsKICAgICAgICBKU2Nyb2xsUGFuZSBhZGRyZXNzU2Nyb2xsUGFuZSA9IG5ldyBKU2Nyb2xsUGFuZSgpOwogICAgICAgIGFkZHJlc3NUZXh0QXJlYSA9IG5ldyBKVGV4dEFyZWEoKTsKCiAgICAgICAgbG9naW5QYW5lbC5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oNDYzLCAzNjMpKTsKICAgICAgICBsb2dpblBhbmVsLnNldEJhY2tncm91bmQoamF2YS5hd3QuQ29sb3IuYmx1ZSk7CiAgICAgICAgbG9naW5QYW5lbC5zZXRMYXlvdXQobmV3IGphdmEuYXd0LkdyaWRCYWdMYXlvdXQoKSk7CgogICAgICAgIHBhc3N3b3JkTGFiZWwuc2V0Rm9udChuZXcgamF2YS5hd3QuRm9udCgmcXVvdDtTeWxmYWVuJnF1b3Q7LCAwLCAxOCkpOyAvLyBOT0kxOE4KICAgICAgICBwYXNzd29yZExhYmVsLnNldEZvcmVncm91bmQobmV3IGphdmEuYXd0LkNvbG9yKDI1NSwgMjU1LCAyNTUpKTsKICAgICAgICBwYXNzd29yZExhYmVsLnNldEhvcml6b250YWxBbGlnbm1lbnQoamF2YXguc3dpbmcuSlRleHRGaWVsZC5DRU5URVIpOwogICAgICAgIHBhc3N3b3JkTGFiZWwuc2V0VGV4dCgmcXVvdDtQYXNzd29yZDomcXVvdDspOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cyA9IG5ldyBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMoKTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHggPSAwOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeSA9IDM7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmFuY2hvciA9IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1Q7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmluc2V0cyA9IG5ldyBqYXZhLmF3dC5JbnNldHMoMTIsIDE5MywgMCwgMCk7CiAgICAgICAgbG9naW5QYW5lbC5hZGQocGFzc3dvcmRMYWJlbCwgZ3JpZEJhZ0NvbnN0cmFpbnRzKTsKICAgICAgICBwYXNzd29yZExhYmVsLmdldEFjY2Vzc2libGVDb250ZXh0KCkuc2V0QWNjZXNzaWJsZU5hbWUoJnF1b3Q7cGFzc3dvcmRMYWJlbCZxdW90Oyk7CgogICAgICAgIHVzZXJuYW1lTGFiZWwuc2V0Rm9udChuZXcgamF2YS5hd3QuRm9udCgmcXVvdDtTeWxmYWVuJnF1b3Q7LCAwLCAxOCkpOyAvLyBOT0kxOE4KICAgICAgICB1c2VybmFtZUxhYmVsLnNldEZvcmVncm91bmQobmV3IGphdmEuYXd0LkNvbG9yKDI1NSwgMjU1LCAyNTUpKTsKICAgICAgICB1c2VybmFtZUxhYmVsLnNldEhvcml6b250YWxBbGlnbm1lbnQoamF2YXguc3dpbmcuSlRleHRGaWVsZC5DRU5URVIpOwogICAgICAgIHVzZXJuYW1lTGFiZWwuc2V0VGV4dCgmcXVvdDtVc2VybmFtZTomcXVvdDspOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cyA9IG5ldyBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMoKTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHggPSAwOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeSA9IDE7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmFuY2hvciA9IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1Q7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmluc2V0cyA9IG5ldyBqYXZhLmF3dC5JbnNldHMoOTMsIDE5MSwgMCwgMCk7CiAgICAgICAgbG9naW5QYW5lbC5hZGQodXNlcm5hbWVMYWJlbCwgZ3JpZEJhZ0NvbnN0cmFpbnRzKTsKICAgICAgICB1c2VybmFtZUxhYmVsLmdldEFjY2Vzc2libGVDb250ZXh0KCkuc2V0QWNjZXNzaWJsZU5hbWUoJnF1b3Q7dXNlcm5hbWVMYWJlbCZxdW90Oyk7CgogICAgICAgIHN1Ym1pdEJ1dHRvbi5zZXRCYWNrZ3JvdW5kKGphdmEuYXd0LkNvbG9yLmJsdWUpOwogICAgICAgIHN1Ym1pdEJ1dHRvbi5zZXRGb250KG5ldyBqYXZhLmF3dC5Gb250KCZxdW90O1N5bGZhZW4mcXVvdDssIDEsIDE0KSk7IC8vIE5PSTE4TgogICAgICAgIHN1Ym1pdEJ1dHRvbi5zZXRGb3JlZ3JvdW5kKG5ldyBqYXZhLmF3dC5Db2xvcigyNTUsIDI1NSwgMjU1KSk7CiAgICAgICAgc3VibWl0QnV0dG9uLnNldFRleHQoJnF1b3Q7U1VCTUlUJnF1b3Q7KTsKICAgICAgICBzdWJtaXRCdXR0b24uc2V0SG9yaXpvbnRhbFRleHRQb3NpdGlvbihqYXZheC5zd2luZy5Td2luZ0NvbnN0YW50cy5DRU5URVIpOwogICAgICAgIHN1Ym1pdEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIoKSB7CiAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBldnQpIHsKICAgICAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbkFjdGlvblBlcmZvcm1lZChldnQpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzID0gbmV3IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cygpOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeSA9IDU7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmFuY2hvciA9IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1Q7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmluc2V0cyA9IG5ldyBqYXZhLmF3dC5JbnNldHMoMTgsIDE5MiwgNDIsIDApOwogICAgICAgIGxvZ2luUGFuZWwuYWRkKHN1Ym1pdEJ1dHRvbiwgZ3JpZEJhZ0NvbnN0cmFpbnRzKTsKICAgICAgICBzdWJtaXRCdXR0b24uZ2V0QWNjZXNzaWJsZUNvbnRleHQoKS5zZXRBY2Nlc3NpYmxlTmFtZSgmcXVvdDtzdWJtaXRCdXR0b24mcXVvdDspOwoKICAgICAgICB1c2VybmFtZVRleHRGaWVsZC5zZXRGb250KG5ldyBqYXZhLmF3dC5Gb250KCZxdW90O1N5bGZhZW4mcXVvdDssIDAsIDE4KSk7IC8vIE5PSTE4TgogICAgICAgIHVzZXJuYW1lVGV4dEZpZWxkLnNldEZvcmVncm91bmQoamF2YS5hd3QuQ29sb3IuYmx1ZSk7CiAgICAgICAgdXNlcm5hbWVUZXh0RmllbGQuc2V0SG9yaXpvbnRhbEFsaWdubWVudChqYXZheC5zd2luZy5KVGV4dEZpZWxkLkxFRlQpOwogICAgICAgIAogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cyA9IG5ldyBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMoKTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHggPSAwOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeSA9IDI7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmlwYWR4ID0gMTUwOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5hbmNob3IgPSBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pbnNldHMgPSBuZXcgamF2YS5hd3QuSW5zZXRzKDYsIDE3OCwgMCwgMTc1KTsKICAgICAgICBsb2dpblBhbmVsLmFkZCh1c2VybmFtZVRleHRGaWVsZCwgZ3JpZEJhZ0NvbnN0cmFpbnRzKTsKICAgICAgICB1c2VybmFtZVRleHRGaWVsZC5nZXRBY2Nlc3NpYmxlQ29udGV4dCgpLnNldEFjY2Vzc2libGVOYW1lKCZxdW90O3VzZXJuYW1lVGV4dEZpZWxkJnF1b3Q7KTsKCiAgICAgICAgcGFzc3dvcmRUZXh0RmllbGQuc2V0Rm9udChuZXcgamF2YS5hd3QuRm9udCgmcXVvdDtTeWxmYWVuJnF1b3Q7LCAwLCAxOCkpOyAvLyBOT0kxOE4KICAgICAgICBwYXNzd29yZFRleHRGaWVsZC5zZXRGb3JlZ3JvdW5kKGphdmEuYXd0LkNvbG9yLmJsdWUpOwogICAgICAgIHBhc3N3b3JkVGV4dEZpZWxkLnNldEhvcml6b250YWxBbGlnbm1lbnQoamF2YXguc3dpbmcuSlRleHRGaWVsZC5MRUZUKTsKICAgICAgICAKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMgPSBuZXcgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzKCk7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR4ID0gMDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHkgPSA0OwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pcGFkeCA9IDE1MDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuYW5jaG9yID0gamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuaW5zZXRzID0gbmV3IGphdmEuYXd0Lkluc2V0cyg2LCAxNzgsIDAsIDE3NSk7CiAgICAgICAgbG9naW5QYW5lbC5hZGQocGFzc3dvcmRUZXh0RmllbGQsIGdyaWRCYWdDb25zdHJhaW50cyk7CiAgICAgICAgcGFzc3dvcmRUZXh0RmllbGQuZ2V0QWNjZXNzaWJsZUNvbnRleHQoKS5zZXRBY2Nlc3NpYmxlTmFtZSgmcXVvdDtwYXNzd29yZFRleHRGaWVsZCZxdW90Oyk7CgogICAgICAgIGxvZ2luVGl0bGVMYWJlbC5zZXRGb250KG5ldyBqYXZhLmF3dC5Gb250KCZxdW90O1N5bGZhZW4mcXVvdDssIDEsIDM2KSk7IC8vIE5PSTE4TgogICAgICAgIGxvZ2luVGl0bGVMYWJlbC5zZXRGb3JlZ3JvdW5kKGphdmF4LnN3aW5nLlVJTWFuYWdlci5nZXREZWZhdWx0cygpLmdldENvbG9yKCZxdW90O0J1dHRvbi5iYWNrZ3JvdW5kJnF1b3Q7KSk7CiAgICAgICAgbG9naW5UaXRsZUxhYmVsLnNldFRleHQoJnF1b3Q7TE9HSU4mcXVvdDspOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cyA9IG5ldyBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMoKTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHggPSAwOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeSA9IDA7CiAgICAgICAgbG9naW5QYW5lbC5hZGQobG9naW5UaXRsZUxhYmVsLCBncmlkQmFnQ29uc3RyYWludHMpOwoKICAgICAgICAKICAgICAgICBtZW50b3JJbmZvUGFuZWwuc2V0QmFja2dyb3VuZChqYXZhLmF3dC5Db2xvci5ibHVlKTsKICAgICAgICBtZW50b3JJbmZvUGFuZWwuc2V0TGF5b3V0KG5ldyBqYXZhLmF3dC5HcmlkQmFnTGF5b3V0KCkpOwoKICAgICAgICBKTGFiZWwgZmlyc3ROYW1lTGFiZWwgPSBuZXcgamF2YXguc3dpbmcuSkxhYmVsKCk7CiAgICAgICAgZmlyc3ROYW1lTGFiZWwuc2V0Rm9udChuZXcgamF2YS5hd3QuRm9udCgmcXVvdDtTeWxmYWVuJnF1b3Q7LCAwLCAxOCkpOyAvLyBOT0kxOE4KICAgICAgICBmaXJzdE5hbWVMYWJlbC5zZXRGb3JlZ3JvdW5kKG5ldyBqYXZhLmF3dC5Db2xvcigyNTUsIDI1NSwgMjU1KSk7CiAgICAgICAgZmlyc3ROYW1lTGFiZWwuc2V0SG9yaXpvbnRhbEFsaWdubWVudChqYXZheC5zd2luZy5Td2luZ0NvbnN0YW50cy5MRUZUKTsKICAgICAgICBmaXJzdE5hbWVMYWJlbC5zZXRUZXh0KCZxdW90O0ZpcnN0IG5hbWU6JnF1b3Q7KTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMgPSBuZXcgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzKCk7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR4ID0gMDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHkgPSAxOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5hbmNob3IgPSBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pbnNldHMgPSBuZXcgamF2YS5hd3QuSW5zZXRzKDI0LCAxMDMsIDAsIDApOwogICAgICAgIG1lbnRvckluZm9QYW5lbC5hZGQoZmlyc3ROYW1lTGFiZWwsIGdyaWRCYWdDb25zdHJhaW50cyk7CiAgICAgICAgZmlyc3ROYW1lTGFiZWwuZ2V0QWNjZXNzaWJsZUNvbnRleHQoKS5zZXRBY2Nlc3NpYmxlTmFtZSgmcXVvdDtmaXJzdE5hbWVMYWJlbCZxdW90Oyk7CgogICAgICAgIGZpcnN0TmFtZVRleHRGaWVsZC5zZXRGb250KG5ldyBqYXZhLmF3dC5Gb250KCZxdW90O1N5bGZhZW4mcXVvdDssIDAsIDE4KSk7IC8vIE5PSTE4TgogICAgICAgIGZpcnN0TmFtZVRleHRGaWVsZC5zZXRGb3JlZ3JvdW5kKGphdmEuYXd0LkNvbG9yLmJsdWUpOwogICAgICAgIGZpcnN0TmFtZVRleHRGaWVsZC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KGphdmF4LnN3aW5nLkpUZXh0RmllbGQuTEVGVCk7CiAgICAgICAgCiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzID0gbmV3IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cygpOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeCA9IDE7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR5ID0gMTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHdpZHRoID0gOTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuaXBhZHggPSAxNzA7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmFuY2hvciA9IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1Q7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmluc2V0cyA9IG5ldyBqYXZhLmF3dC5JbnNldHMoMTgsIDYsIDAsIDApOwogICAgICAgIG1lbnRvckluZm9QYW5lbC5hZGQoZmlyc3ROYW1lVGV4dEZpZWxkLCBncmlkQmFnQ29uc3RyYWludHMpOwogICAgICAgIGZpcnN0TmFtZVRleHRGaWVsZC5nZXRBY2Nlc3NpYmxlQ29udGV4dCgpLnNldEFjY2Vzc2libGVOYW1lKCZxdW90O2ZpcnN0TmFtZVRleHRGaWVsZCZxdW90Oyk7CgogICAgICAgIEpMYWJlbCBtZW50b3JJbmZvTGFiZWwgPSBuZXcgamF2YXguc3dpbmcuSkxhYmVsKCk7CiAgICAgICAgbWVudG9ySW5mb0xhYmVsLnNldEZvbnQobmV3IGphdmEuYXd0LkZvbnQoJnF1b3Q7U3lsZmFlbiZxdW90OywgMSwgMzYpKTsgLy8gTk9JMThOCiAgICAgICAgbWVudG9ySW5mb0xhYmVsLnNldEZvcmVncm91bmQoamF2YXguc3dpbmcuVUlNYW5hZ2VyLmdldERlZmF1bHRzKCkuZ2V0Q29sb3IoJnF1b3Q7QnV0dG9uLmJhY2tncm91bmQmcXVvdDspKTsKICAgICAgICBtZW50b3JJbmZvTGFiZWwuc2V0VGV4dCgmcXVvdDtNZW50b3IgaW5mb3JtYXRpb24mcXVvdDspOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cyA9IG5ldyBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMoKTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHggPSAwOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeSA9IDA7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR3aWR0aCA9IDY7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmFuY2hvciA9IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1Q7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmluc2V0cyA9IG5ldyBqYXZhLmF3dC5JbnNldHMoNiwgOTIsIDAsIDApOwogICAgICAgIG1lbnRvckluZm9QYW5lbC5hZGQobWVudG9ySW5mb0xhYmVsLCBncmlkQmFnQ29uc3RyYWludHMpOwogICAgICAgIG1lbnRvckluZm9MYWJlbC5nZXRBY2Nlc3NpYmxlQ29udGV4dCgpLnNldEFjY2Vzc2libGVOYW1lKCZxdW90O21lbnRvckluZm9MYWJlbCZxdW90Oyk7CiAgICAgICAgbWVudG9ySW5mb0xhYmVsLmdldEFjY2Vzc2libGVDb250ZXh0KCkuc2V0QWNjZXNzaWJsZURlc2NyaXB0aW9uKCZxdW90OyZxdW90Oyk7CgogICAgICAgIGxhc3ROYW1lVGV4dEZpZWxkLnNldEZvbnQobmV3IGphdmEuYXd0LkZvbnQoJnF1b3Q7U3lsZmFlbiZxdW90OywgMCwgMTgpKTsgLy8gTk9JMThOCiAgICAgICAgbGFzdE5hbWVUZXh0RmllbGQuc2V0Rm9yZWdyb3VuZChqYXZhLmF3dC5Db2xvci5ibHVlKTsKICAgICAgICBsYXN0TmFtZVRleHRGaWVsZC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KGphdmF4LnN3aW5nLkpUZXh0RmllbGQuTEVGVCk7CiAgICAgICAgCiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzID0gbmV3IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cygpOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeCA9IDE7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR5ID0gMjsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHdpZHRoID0gOTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZGhlaWdodCA9IDI7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmlwYWR4ID0gMTcwOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5hbmNob3IgPSBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pbnNldHMgPSBuZXcgamF2YS5hd3QuSW5zZXRzKDksIDYsIDAsIDApOwogICAgICAgIG1lbnRvckluZm9QYW5lbC5hZGQobGFzdE5hbWVUZXh0RmllbGQsIGdyaWRCYWdDb25zdHJhaW50cyk7CiAgICAgICAgbGFzdE5hbWVUZXh0RmllbGQuZ2V0QWNjZXNzaWJsZUNvbnRleHQoKS5zZXRBY2Nlc3NpYmxlTmFtZSgmcXVvdDtsYXN0TmFtZVRleHRGaWVsZCZxdW90Oyk7CgogICAgICAgIEpMYWJlbCBsYXN0TmFtZUxhYmVsID0gbmV3IGphdmF4LnN3aW5nLkpMYWJlbCgpOwogICAgICAgIGxhc3ROYW1lTGFiZWwuc2V0Rm9udChuZXcgamF2YS5hd3QuRm9udCgmcXVvdDtTeWxmYWVuJnF1b3Q7LCAwLCAxOCkpOyAvLyBOT0kxOE4KICAgICAgICBsYXN0TmFtZUxhYmVsLnNldEZvcmVncm91bmQobmV3IGphdmEuYXd0LkNvbG9yKDI1NSwgMjU1LCAyNTUpKTsKICAgICAgICBsYXN0TmFtZUxhYmVsLnNldEhvcml6b250YWxBbGlnbm1lbnQoamF2YXguc3dpbmcuU3dpbmdDb25zdGFudHMuTEVGVCk7CiAgICAgICAgbGFzdE5hbWVMYWJlbC5zZXRUZXh0KCZxdW90O0xhc3QgbmFtZTomcXVvdDspOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cyA9IG5ldyBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMoKTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHggPSAwOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeSA9IDI7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmlwYWR4ID0gMzsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuYW5jaG9yID0gamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuaW5zZXRzID0gbmV3IGphdmEuYXd0Lkluc2V0cygxMiwgMTAzLCAwLCAwKTsKICAgICAgICBtZW50b3JJbmZvUGFuZWwuYWRkKGxhc3ROYW1lTGFiZWwsIGdyaWRCYWdDb25zdHJhaW50cyk7CiAgICAgICAgbGFzdE5hbWVMYWJlbC5nZXRBY2Nlc3NpYmxlQ29udGV4dCgpLnNldEFjY2Vzc2libGVOYW1lKCZxdW90O2xhc3ROYW1lTGFiZWwmcXVvdDspOwoKICAgICAgICBlbWFpbFRleHRGaWVsZC5zZXRGb250KG5ldyBqYXZhLmF3dC5Gb250KCZxdW90O1N5bGZhZW4mcXVvdDssIDAsIDE4KSk7IC8vIE5PSTE4TgogICAgICAgIGVtYWlsVGV4dEZpZWxkLnNldEZvcmVncm91bmQoamF2YS5hd3QuQ29sb3IuYmx1ZSk7CiAgICAgICAgZW1haWxUZXh0RmllbGQuc2V0SG9yaXpvbnRhbEFsaWdubWVudChqYXZheC5zd2luZy5KVGV4dEZpZWxkLkxFRlQpOwogICAgICAgIAogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cyA9IG5ldyBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMoKTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHggPSAxOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeSA9IDQ7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR3aWR0aCA9IDk7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWRoZWlnaHQgPSAyOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pcGFkeCA9IDE3MDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuYW5jaG9yID0gamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuaW5zZXRzID0gbmV3IGphdmEuYXd0Lkluc2V0cygxMiwgNiwgMCwgMCk7CiAgICAgICAgbWVudG9ySW5mb1BhbmVsLmFkZChlbWFpbFRleHRGaWVsZCwgZ3JpZEJhZ0NvbnN0cmFpbnRzKTsKICAgICAgICBlbWFpbFRleHRGaWVsZC5nZXRBY2Nlc3NpYmxlQ29udGV4dCgpLnNldEFjY2Vzc2libGVOYW1lKCZxdW90O2VtYWlsVGV4dEZpZWxkJnF1b3Q7KTsKICAgICAgICAKICAgICAgICBKTGFiZWwgZW1haWxMYWJlbCA9IG5ldyBqYXZheC5zd2luZy5KTGFiZWwoKTsKICAgICAgICBlbWFpbExhYmVsLnNldEZvbnQobmV3IGphdmEuYXd0LkZvbnQoJnF1b3Q7U3lsZmFlbiZxdW90OywgMCwgMTgpKTsgLy8gTk9JMThOCiAgICAgICAgZW1haWxMYWJlbC5zZXRGb3JlZ3JvdW5kKG5ldyBqYXZhLmF3dC5Db2xvcigyNTUsIDI1NSwgMjU1KSk7CiAgICAgICAgZW1haWxMYWJlbC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KGphdmF4LnN3aW5nLlN3aW5nQ29uc3RhbnRzLkxFRlQpOwogICAgICAgIGVtYWlsTGFiZWwuc2V0VGV4dCgmcXVvdDtFbWFpbDomcXVvdDspOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cyA9IG5ldyBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMoKTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHggPSAwOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeSA9IDQ7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmlwYWR4ID0gMzc7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmFuY2hvciA9IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1Q7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmluc2V0cyA9IG5ldyBqYXZhLmF3dC5JbnNldHMoMTUsIDEwMywgMCwgMCk7CiAgICAgICAgbWVudG9ySW5mb1BhbmVsLmFkZChlbWFpbExhYmVsLCBncmlkQmFnQ29uc3RyYWludHMpOwogICAgICAgIGVtYWlsTGFiZWwuZ2V0QWNjZXNzaWJsZUNvbnRleHQoKS5zZXRBY2Nlc3NpYmxlTmFtZSgmcXVvdDtlbWFpbExhYmVsJnF1b3Q7KTsKCiAgICAgICAgSkxhYmVsIHRlbGVwaG9uZUxhYmVsID0gbmV3IGphdmF4LnN3aW5nLkpMYWJlbCgpOwogICAgICAgIHRlbGVwaG9uZUxhYmVsLnNldEZvbnQobmV3IGphdmEuYXd0LkZvbnQoJnF1b3Q7U3lsZmFlbiZxdW90OywgMCwgMTgpKTsgLy8gTk9JMThOCiAgICAgICAgdGVsZXBob25lTGFiZWwuc2V0Rm9yZWdyb3VuZChuZXcgamF2YS5hd3QuQ29sb3IoMjU1LCAyNTUsIDI1NSkpOwogICAgICAgIHRlbGVwaG9uZUxhYmVsLnNldEhvcml6b250YWxBbGlnbm1lbnQoamF2YXguc3dpbmcuU3dpbmdDb25zdGFudHMuTEVGVCk7CiAgICAgICAgdGVsZXBob25lTGFiZWwuc2V0VGV4dCgmcXVvdDtUZWxlcGhvbmU6JnF1b3Q7KTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMgPSBuZXcgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzKCk7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR4ID0gMDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHkgPSA2OwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pcGFkeCA9IDI7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmFuY2hvciA9IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1Q7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmluc2V0cyA9IG5ldyBqYXZhLmF3dC5JbnNldHMoOSwgMTAzLCAwLCAwKTsKICAgICAgICBtZW50b3JJbmZvUGFuZWwuYWRkKHRlbGVwaG9uZUxhYmVsLCBncmlkQmFnQ29uc3RyYWludHMpOwogICAgICAgIHRlbGVwaG9uZUxhYmVsLmdldEFjY2Vzc2libGVDb250ZXh0KCkuc2V0QWNjZXNzaWJsZU5hbWUoJnF1b3Q7dGVsZXBob25lTGFiZWwmcXVvdDspOwoKICAgICAgICB0ZWxlcGhvbmVUZXh0RmllbGQuc2V0Rm9udChuZXcgamF2YS5hd3QuRm9udCgmcXVvdDtTeWxmYWVuJnF1b3Q7LCAwLCAxOCkpOyAvLyBOT0kxOE4KICAgICAgICB0ZWxlcGhvbmVUZXh0RmllbGQuc2V0Rm9yZWdyb3VuZChqYXZhLmF3dC5Db2xvci5ibHVlKTsKICAgICAgICB0ZWxlcGhvbmVUZXh0RmllbGQuc2V0SG9yaXpvbnRhbEFsaWdubWVudChqYXZheC5zd2luZy5KVGV4dEZpZWxkLkxFRlQpOwogICAgICAgIAogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cyA9IG5ldyBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMoKTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHggPSAxOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeSA9IDY7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR3aWR0aCA9IDk7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWRoZWlnaHQgPSAyOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pcGFkeCA9IDE3MDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuYW5jaG9yID0gamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuaW5zZXRzID0gbmV3IGphdmEuYXd0Lkluc2V0cyg2LCA2LCAwLCAwKTsKICAgICAgICBtZW50b3JJbmZvUGFuZWwuYWRkKHRlbGVwaG9uZVRleHRGaWVsZCwgZ3JpZEJhZ0NvbnN0cmFpbnRzKTsKICAgICAgICB0ZWxlcGhvbmVUZXh0RmllbGQuZ2V0QWNjZXNzaWJsZUNvbnRleHQoKS5zZXRBY2Nlc3NpYmxlTmFtZSgmcXVvdDt0ZWxlcGhvbmVUZXh0RmllbGQmcXVvdDspOwoKICAgICAgICBkZWdyZWVMYWJlbC5zZXRGb250KG5ldyBqYXZhLmF3dC5Gb250KCZxdW90O1N5bGZhZW4mcXVvdDssIDAsIDE4KSk7IC8vIE5PSTE4TgogICAgICAgIGRlZ3JlZUxhYmVsLnNldEZvcmVncm91bmQobmV3IGphdmEuYXd0LkNvbG9yKDI1NSwgMjU1LCAyNTUpKTsKICAgICAgICBkZWdyZWVMYWJlbC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KGphdmF4LnN3aW5nLlN3aW5nQ29uc3RhbnRzLkxFRlQpOwogICAgICAgIGRlZ3JlZUxhYmVsLnNldFRleHQoJnF1b3Q7SGlnaGVzdCBEZWdyZWU6JnF1b3Q7KTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMgPSBuZXcgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzKCk7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR4ID0gMDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHkgPSAxMDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHdpZHRoID0gMzsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZGhlaWdodCA9IDI7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmlwYWR4ID0gMTM7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmFuY2hvciA9IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1Q7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmluc2V0cyA9IG5ldyBqYXZhLmF3dC5JbnNldHMoMjMsIDkyLCAwLCAwKTsKICAgICAgICBtZW50b3JJbmZvUGFuZWwuYWRkKGRlZ3JlZUxhYmVsLCBncmlkQmFnQ29uc3RyYWludHMpOwogICAgICAgIGRlZ3JlZUxhYmVsLmdldEFjY2Vzc2libGVDb250ZXh0KCkuc2V0QWNjZXNzaWJsZU5hbWUoJnF1b3Q7ZGVncmVlTGFiZWwmcXVvdDspOwoKICAgICAgICBhZGRyZXNzTGFiZWwuc2V0Rm9udChuZXcgamF2YS5hd3QuRm9udCgmcXVvdDtTeWxmYWVuJnF1b3Q7LCAwLCAxOCkpOyAvLyBOT0kxOE4KICAgICAgICBhZGRyZXNzTGFiZWwuc2V0Rm9yZWdyb3VuZChuZXcgamF2YS5hd3QuQ29sb3IoMjU1LCAyNTUsIDI1NSkpOwogICAgICAgIGFkZHJlc3NMYWJlbC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KGphdmF4LnN3aW5nLlN3aW5nQ29uc3RhbnRzLkxFRlQpOwogICAgICAgIGFkZHJlc3NMYWJlbC5zZXRUZXh0KCZxdW90O0FkZHJlc3M6JnF1b3Q7KTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMgPSBuZXcgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzKCk7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR4ID0gMDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHkgPSA4OwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pcGFkeCA9IDE4OwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5hbmNob3IgPSBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pbnNldHMgPSBuZXcgamF2YS5hd3QuSW5zZXRzKDEyLCAxMDMsIDAsIDApOwogICAgICAgIG1lbnRvckluZm9QYW5lbC5hZGQoYWRkcmVzc0xhYmVsLCBncmlkQmFnQ29uc3RyYWludHMpOwogICAgICAgIGFkZHJlc3NMYWJlbC5nZXRBY2Nlc3NpYmxlQ29udGV4dCgpLnNldEFjY2Vzc2libGVOYW1lKCZxdW90O2FkZHJlc3NMYWJlbCZxdW90Oyk7CgogICAgICAgIGRlZ3JlZUNvbWJvQm94LnNldE1vZGVsKG5ldyBEZWZhdWx0Q29tYm9Cb3hNb2RlbCZsdDsmZ3Q7KG5ldyBTdHJpbmdbSGlnaGVzdERlZ3JlZS52YWx1ZXMoKS5sZW5ndGhdKSk7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzID0gbmV3IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cygpOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeCA9IDQ7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR5ID0gMTA7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR3aWR0aCA9IDEwOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pcGFkeCA9IDEwMTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuYW5jaG9yID0gamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuaW5zZXRzID0gbmV3IGphdmEuYXd0Lkluc2V0cygyMywgNiwgMCwgNjIpOwogICAgICAgIGluaXREZWdyZWVDb21ib0JveCgpOwogICAgICAgIG1lbnRvckluZm9QYW5lbC5hZGQoZGVncmVlQ29tYm9Cb3gsIGdyaWRCYWdDb25zdHJhaW50cyk7CiAgICAgICAgZGVncmVlQ29tYm9Cb3guZ2V0QWNjZXNzaWJsZUNvbnRleHQoKS5zZXRBY2Nlc3NpYmxlTmFtZSgmcXVvdDtkZWdyZWVDb21ib0JveCZxdW90Oyk7CgogICAgICAgIGdyYWR1YXRpb25MYWJlbC5zZXRGb250KG5ldyBqYXZhLmF3dC5Gb250KCZxdW90O1N5bGZhZW4mcXVvdDssIDAsIDE4KSk7IC8vIE5PSTE4TgogICAgICAgIGdyYWR1YXRpb25MYWJlbC5zZXRGb3JlZ3JvdW5kKG5ldyBqYXZhLmF3dC5Db2xvcigyNTUsIDI1NSwgMjU1KSk7CiAgICAgICAgZ3JhZHVhdGlvbkxhYmVsLnNldEhvcml6b250YWxBbGlnbm1lbnQoamF2YXguc3dpbmcuU3dpbmdDb25zdGFudHMuTEVGVCk7CiAgICAgICAgZ3JhZHVhdGlvbkxhYmVsLnNldFRleHQoJnF1b3Q7R3JhZHVhdGlvbiBZZWFyOiZxdW90Oyk7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzID0gbmV3IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cygpOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeCA9IDA7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR5ID0gMTI7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR3aWR0aCA9IDM7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWRoZWlnaHQgPSAyOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pcGFkeCA9IDY7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmFuY2hvciA9IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1Q7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmluc2V0cyA9IG5ldyBqYXZhLmF3dC5JbnNldHMoNiwgOTIsIDAsIDApOwogICAgICAgIG1lbnRvckluZm9QYW5lbC5hZGQoZ3JhZHVhdGlvbkxhYmVsLCBncmlkQmFnQ29uc3RyYWludHMpOwogICAgICAgIGdyYWR1YXRpb25MYWJlbC5nZXRBY2Nlc3NpYmxlQ29udGV4dCgpLnNldEFjY2Vzc2libGVOYW1lKCZxdW90O2dyYWR1YXRpb25MYWJlbCZxdW90Oyk7CgogICAgICAgIGdyYWR1YXRpb25Db21ib0JveC5zZXRNb2RlbChuZXcgRGVmYXVsdENvbWJvQm94TW9kZWwmbHQ7Jmd0OyhuZXcgU3RyaW5nW1RPX0dSQURVQVRJT05fWUVBUiAtIEZST01fR1JBRFVBVElPTl9ZRUFSICsgMV0pKTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMgPSBuZXcgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzKCk7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR4ID0gNDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHkgPSAxMjsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHdpZHRoID0gMTA7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmlwYWR4ID0gMTAxOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5hbmNob3IgPSBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pbnNldHMgPSBuZXcgamF2YS5hd3QuSW5zZXRzKDMsIDYsIDAsIDYyKTsKICAgICAgICBpbml0R3JhZHVhdGlvbkNvbWJvQm94KCk7CiAgICAgICAgbWVudG9ySW5mb1BhbmVsLmFkZChncmFkdWF0aW9uQ29tYm9Cb3gsIGdyaWRCYWdDb25zdHJhaW50cyk7CiAgICAgICAgZ3JhZHVhdGlvbkNvbWJvQm94LmdldEFjY2Vzc2libGVDb250ZXh0KCkuc2V0QWNjZXNzaWJsZU5hbWUoJnF1b3Q7Z3JhZHVhdGlvbkNvbWJvQm94JnF1b3Q7KTsKCiAgICAgICAgaW50ZXJlc3RzTGFiZWwuc2V0Rm9udChuZXcgamF2YS5hd3QuRm9udCgmcXVvdDtTeWxmYWVuJnF1b3Q7LCAwLCAxOCkpOyAvLyBOT0kxOE4KICAgICAgICBpbnRlcmVzdHNMYWJlbC5zZXRGb3JlZ3JvdW5kKG5ldyBqYXZhLmF3dC5Db2xvcigyNTUsIDI1NSwgMjU1KSk7CiAgICAgICAgaW50ZXJlc3RzTGFiZWwuc2V0SG9yaXpvbnRhbEFsaWdubWVudChqYXZheC5zd2luZy5Td2luZ0NvbnN0YW50cy5MRUZUKTsKICAgICAgICBpbnRlcmVzdHNMYWJlbC5zZXRUZXh0KCZxdW90O01lbnRyb3RpbmcgaW50ZXJlc3RzOiZxdW90Oyk7CiAgICAgICAgaW50ZXJlc3RzTGFiZWwuc2V0VG9vbFRpcFRleHQoJnF1b3Q7JmxkcXVvO1NlbGVjdCBtYWpvcnMgdGhhdCB5b3UgYXJlIGludGVyZXN0ZWQgaW4gbWVudG9yaW5nJnF1b3Q7KTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMgPSBuZXcgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzKCk7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR4ID0gMDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHkgPSAxNDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHdpZHRoID0gNDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZGhlaWdodCA9IDI7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmFuY2hvciA9IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1Q7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmluc2V0cyA9IG5ldyBqYXZhLmF3dC5JbnNldHMoMSwgOTUsIDAsIDApOwogICAgICAgIG1lbnRvckluZm9QYW5lbC5hZGQoaW50ZXJlc3RzTGFiZWwsIGdyaWRCYWdDb25zdHJhaW50cyk7CiAgICAgICAgaW50ZXJlc3RzTGFiZWwuZ2V0QWNjZXNzaWJsZUNvbnRleHQoKS5zZXRBY2Nlc3NpYmxlTmFtZSgmcXVvdDtpbnRlcmVzdHNMYWJlbCZxdW90Oyk7CiAgICAgICAgICAgIAogICAgICAgIEpDaGVja0JveCBjaGVja2JveDEgPSBuZXcgSkNoZWNrQm94KCk7CiAgICAgICAgY2hlY2tib3gxLnNldEJhY2tncm91bmQoamF2YS5hd3QuQ29sb3IuYmx1ZSk7CiAgICAgICAgY2hlY2tib3gxLnNldEZvcmVncm91bmQobmV3IGphdmEuYXd0LkNvbG9yKDI1NSwgMjU1LCAyNTUpKTsKICAgICAgICBjaGVja2JveDEuc2V0VGV4dCgmcXVvdDtDb21wdXRlciBTY2llbmNlJnF1b3Q7KTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMgPSBuZXcgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzKCk7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR4ID0gNDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHkgPSAxNDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHdpZHRoID0gMTA7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmlwYWR4ID0gODg7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmFuY2hvciA9IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1Q7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmluc2V0cyA9IG5ldyBqYXZhLmF3dC5JbnNldHMoMCwgNiwgMCwgNjIpOwogICAgICAgIG1lbnRvckluZm9QYW5lbC5hZGQoY2hlY2tib3gxLCBncmlkQmFnQ29uc3RyYWludHMpOwogICAgICAgIGNoZWNrYm94MS5nZXRBY2Nlc3NpYmxlQ29udGV4dCgpLnNldEFjY2Vzc2libGVOYW1lKCZxdW90O2NvbXB1dGVyU2NpZW5jZUNoZWNrQm94JnF1b3Q7KTsKICAgICAgICBjaGVja0JveExpc3QuYWRkKGNoZWNrYm94MSk7CgogICAgICAgIEpDaGVja0JveCBjaGVja2JveDIgPSBuZXcgSkNoZWNrQm94KCk7CiAgICAgICAgY2hlY2tib3gyLnNldEJhY2tncm91bmQoamF2YS5hd3QuQ29sb3IuYmx1ZSk7CiAgICAgICAgY2hlY2tib3gyLnNldEZvcmVncm91bmQobmV3IGphdmEuYXd0LkNvbG9yKDI1NSwgMjU1LCAyNTUpKTsKICAgICAgICBjaGVja2JveDIuc2V0VGV4dCgmcXVvdDtDb21wdXRlciBJbmZvcm1hdGlvbmFsIFRlY2hub2xvZ3kmcXVvdDspOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cyA9IG5ldyBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMoKTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHggPSA0OwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeSA9IDE3OwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkd2lkdGggPSAxMDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuaXBhZHggPSA4ODsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuYW5jaG9yID0gamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuaW5zZXRzID0gbmV3IGphdmEuYXd0Lkluc2V0cyg2LCA2LCAwLCA2Mik7CiAgICAgICAgbWVudG9ySW5mb1BhbmVsLmFkZChjaGVja2JveDIsIGdyaWRCYWdDb25zdHJhaW50cyk7CiAgICAgICAgY2hlY2tib3gyLmdldEFjY2Vzc2libGVDb250ZXh0KCkuc2V0QWNjZXNzaWJsZU5hbWUoJnF1b3Q7Y29tcHV0ZXJUZWNoQ2hlY2tCb3gmcXVvdDspOwogICAgICAgIGNoZWNrQm94TGlzdC5hZGQoY2hlY2tib3gyKTsKICAgICAgICAKICAgICAgICBKQ2hlY2tCb3ggY2hlY2tib3gzID0gbmV3IEpDaGVja0JveCgpOwogICAgICAgIGNoZWNrYm94My5zZXRCYWNrZ3JvdW5kKGphdmEuYXd0LkNvbG9yLmJsdWUpOwogICAgICAgIGNoZWNrYm94My5zZXRGb3JlZ3JvdW5kKG5ldyBqYXZhLmF3dC5Db2xvcigyNTUsIDI1NSwgMjU1KSk7CiAgICAgICAgY2hlY2tib3gzLnNldFRleHQoJnF1b3Q7Q3liZXJzZWN1cml0eSZxdW90Oyk7CiAgICAgICAgCiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzID0gbmV3IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cygpOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeCA9IDQ7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR5ID0gMTY7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR3aWR0aCA9IDEwOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pcGFkeCA9IDg4OwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5hbmNob3IgPSBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pbnNldHMgPSBuZXcgamF2YS5hd3QuSW5zZXRzKDYsIDYsIDAsIDYyKTsKICAgICAgICBtZW50b3JJbmZvUGFuZWwuYWRkKGNoZWNrYm94MywgZ3JpZEJhZ0NvbnN0cmFpbnRzKTsKICAgICAgICBjaGVja2JveDMuZ2V0QWNjZXNzaWJsZUNvbnRleHQoKS5zZXRBY2Nlc3NpYmxlTmFtZSgmcXVvdDtjeWJlcnNlY3VyaXR5Q2hlY2tCb3gmcXVvdDspOwogICAgICAgIGNoZWNrQm94TGlzdC5hZGQoY2hlY2tib3gzKTsKCiAgICAgICAgSkNoZWNrQm94IGNoZWNrYm94NCA9IG5ldyBKQ2hlY2tCb3goKTsKICAgICAgICBjaGVja2JveDQuc2V0QmFja2dyb3VuZChqYXZhLmF3dC5Db2xvci5ibHVlKTsKICAgICAgICBjaGVja2JveDQuc2V0Rm9yZWdyb3VuZChuZXcgamF2YS5hd3QuQ29sb3IoMjU1LCAyNTUsIDI1NSkpOwogICAgICAgIGNoZWNrYm94NC5zZXRUZXh0KCZxdW90O0NvbXB1dGVyIEluZm9ybWF0aW9uYWwgU3lzdGVtcyZxdW90Oyk7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzID0gbmV3IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cygpOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeCA9IDQ7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR5ID0gMTg7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR3aWR0aCA9IDEwOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pcGFkeCA9IDg4OwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5hbmNob3IgPSBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pbnNldHMgPSBuZXcgamF2YS5hd3QuSW5zZXRzKDYsIDYsIDAsIDYyKTsKICAgICAgICBtZW50b3JJbmZvUGFuZWwuYWRkKGNoZWNrYm94NCwgZ3JpZEJhZ0NvbnN0cmFpbnRzKTsKICAgICAgICBjaGVja2JveDQuZ2V0QWNjZXNzaWJsZUNvbnRleHQoKS5zZXRBY2Nlc3NpYmxlTmFtZSgmcXVvdDtjb21wdXRlclN5c3RlbXNDaGVja0JveCZxdW90Oyk7CiAgICAgICAgY2hlY2tCb3hMaXN0LmFkZChjaGVja2JveDQpOwoKICAgICAgICBzYXZlQnV0dG9uLnNldFRleHQoJnF1b3Q7U0FWRSZxdW90Oyk7CiAgICAgICAgc2F2ZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIoKSB7CiAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBldnQpIHsKICAgICAgICAgICAgICAgIHNhdmVCdXR0b25BY3Rpb25QZXJmb3JtZWQoZXZ0KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cyA9IG5ldyBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMoKTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHggPSAwOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeSA9IDE5OwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkd2lkdGggPSAyOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pcGFkeCA9IDE0OwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pcGFkeSA9IDg7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmFuY2hvciA9IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1Q7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmluc2V0cyA9IG5ldyBqYXZhLmF3dC5JbnNldHMoMTgsIDExMywgMjUsIDApOwogICAgICAgIG1lbnRvckluZm9QYW5lbC5hZGQoc2F2ZUJ1dHRvbiwgZ3JpZEJhZ0NvbnN0cmFpbnRzKTsKICAgICAgICBzYXZlQnV0dG9uLmdldEFjY2Vzc2libGVDb250ZXh0KCkuc2V0QWNjZXNzaWJsZU5hbWUoJnF1b3Q7c2F2ZUJ1dHRvbiZxdW90Oyk7CgogICAgICAgIHJlc2V0QnV0dG9uLnNldFRleHQoJnF1b3Q7UkVTRVQmcXVvdDspOwogICAgICAgIHJlc2V0QnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50IGV2dCkgewogICAgICAgICAgICAgICAgcmVzZXRCdXR0b25BY3Rpb25QZXJmb3JtZWQoZXZ0KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cyA9IG5ldyBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMoKTsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHggPSA0OwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeSA9IDE5OwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pcGFkeCA9IDE4OwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5pcGFkeSA9IDg7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmFuY2hvciA9IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1Q7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmluc2V0cyA9IG5ldyBqYXZhLmF3dC5JbnNldHMoMTgsIDYsIDI1LCAwKTsKICAgICAgICBtZW50b3JJbmZvUGFuZWwuYWRkKHJlc2V0QnV0dG9uLCBncmlkQmFnQ29uc3RyYWludHMpOwogICAgICAgIHJlc2V0QnV0dG9uLmdldEFjY2Vzc2libGVDb250ZXh0KCkuc2V0QWNjZXNzaWJsZU5hbWUoJnF1b3Q7cmVzZXRCdXR0b24mcXVvdDspOwoKICAgICAgICBhZGRyZXNzVGV4dEFyZWEuc2V0Q29sdW1ucygxMCk7CiAgICAgICAgYWRkcmVzc1RleHRBcmVhLnNldFJvd3MoNSk7CiAgICAgICAgYWRkcmVzc1Njcm9sbFBhbmUuc2V0Vmlld3BvcnRWaWV3KGFkZHJlc3NUZXh0QXJlYSk7CiAgICAgICAgYWRkcmVzc1RleHRBcmVhLmdldEFjY2Vzc2libGVDb250ZXh0KCkuc2V0QWNjZXNzaWJsZU5hbWUoJnF1b3Q7YWRkcmVzc1RleHRBcmVhJnF1b3Q7KTsKCiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzID0gbmV3IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cygpOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5ncmlkeCA9IDE7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWR5ID0gODsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuZ3JpZHdpZHRoID0gNDsgCiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmdyaWRoZWlnaHQgPSAyOwogICAgICAgIGdyaWRCYWdDb25zdHJhaW50cy5maWxsID0gamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEg7CiAgICAgICAgZ3JpZEJhZ0NvbnN0cmFpbnRzLmlwYWR4ID0gMTAwOyAKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuaXBhZHkgPSA1MDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuYW5jaG9yID0gamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMud2VpZ2h0eCA9IDEuMDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMud2VpZ2h0eSA9IDEuMDsKICAgICAgICBncmlkQmFnQ29uc3RyYWludHMuaW5zZXRzID0gbmV3IGphdmEuYXd0Lkluc2V0cygxMiwgNiwgMCwgMCk7CiAgICAgICAgbWVudG9ySW5mb1BhbmVsLmFkZChhZGRyZXNzU2Nyb2xsUGFuZSwgZ3JpZEJhZ0NvbnN0cmFpbnRzKTsKICAgICAgICBhZGRyZXNzU2Nyb2xsUGFuZS5nZXRBY2Nlc3NpYmxlQ29udGV4dCgpLnNldEFjY2Vzc2libGVOYW1lKCZxdW90O2FkZHJlc3NTY3JvbGxQYW5lJnF1b3Q7KTsKCiAgICAgICAgCiAgICAgICAgc2V0VGl0bGUoJnF1b3Q7TWVudG9yIFByb2ZpbGUgR1VJIGNyZWF0ZWQgYnkgU2h1a3JpIEFsaSZxdW90Oyk7CiAgICAgICAgc2V0TWluaW11bVNpemUobmV3IERpbWVuc2lvbig2NTAsIDY0NykpOwogICAgICAgIHNldFNpemUobmV3IERpbWVuc2lvbig2NTAsIDY0NykpOwogICAgICAgIHNldExvY2F0aW9uUmVsYXRpdmVUbyhudWxsKTsKICAgICAgICBzZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oSkZyYW1lLkVYSVRfT05fQ0xPU0UpOwogICAgICAgIAogICAgICAgIGdldENvbnRlbnRQYW5lKCkuc2V0TGF5b3V0KG5ldyBDYXJkTGF5b3V0KCkpOwogICAgICAgIAogICAgICAgIGdldENvbnRlbnRQYW5lKCkuYWRkKGxvZ2luUGFuZWwpOwogICAgICAgIHBhY2soKTsKICAgIH0vLyAmbHQ7L2VkaXRvci1mb2xkJmd0OyAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgIHByaXZhdGUgdm9pZCBpbml0RGVncmVlQ29tYm9Cb3goKSB7CiAgICAgICAgZGVncmVlQ29tYm9Cb3gucmVtb3ZlQWxsSXRlbXMoKTsKICAgICAgICBmb3IgKEhpZ2hlc3REZWdyZWUgZGVncmVlIDogSGlnaGVzdERlZ3JlZS52YWx1ZXMoKSkgewogICAgICAgICAgICAKICAgICAgICAgICAgZGVncmVlQ29tYm9Cb3guYWRkSXRlbShkZWdyZWUubmFtZSgpKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHByaXZhdGUgdm9pZCBpbml0R3JhZHVhdGlvbkNvbWJvQm94KCkgewogICAgICAgIGdyYWR1YXRpb25Db21ib0JveC5yZW1vdmVBbGxJdGVtcygpOwogICAgICAgIGZvciAoaW50IGkgPSBGUk9NX0dSQURVQVRJT05fWUVBUjsgaSAmbHQ7PSBUT19HUkFEVUFUSU9OX1lFQVI7IGkrKykgewogICAgICAgICAgICBncmFkdWF0aW9uQ29tYm9Cb3guYWRkSXRlbShTdHJpbmcudmFsdWVPZihpKSk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBwcml2YXRlIHZvaWQgc3VibWl0QnV0dG9uQWN0aW9uUGVyZm9ybWVkKGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50IGV2dCkgeyAgCiAgICAgICAgaWYgKHVzZXJuYW1lVGV4dEZpZWxkLmdldFRleHQoKS5lcXVhbHMoVVNFUk5BTUUpKSB7CiAgICAgICAgICAgIGlmIChwYXNzd29yZFRleHRGaWVsZC5nZXRUZXh0KCkuZXF1YWxzKFBBU1NXT1JEKSkgewogICAgICAgICAgICAgICAgcmVtb3ZlKGxvZ2luUGFuZWwpOwogICAgICAgICAgICAgICAgYWRkKG1lbnRvckluZm9QYW5lbCk7CiAgICAgICAgICAgICAgICByZXBhaW50KCk7CiAgICAgICAgICAgICAgICByZXZhbGlkYXRlKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhudWxsLCAmcXVvdDtJbmNvcnJlY3QgcGFzc3dvcmQmcXVvdDspOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobnVsbCwgJnF1b3Q7U3VjaCB1c2VybmFtZSBkb2Vzbid0IGV4aXN0JnF1b3Q7KTsKICAgICAgICB9CiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgICBwcml2YXRlIHZvaWQgc2F2ZUJ1dHRvbkFjdGlvblBlcmZvcm1lZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBldnQpIHsKICAgICAgICBTdHJpbmcgZmlyc3ROYW1lID0gZmlyc3ROYW1lVGV4dEZpZWxkLmdldFRleHQoKTsKICAgICAgICBTdHJpbmcgbGFzdE5hbWUgPSBsYXN0TmFtZVRleHRGaWVsZC5nZXRUZXh0KCk7CiAgICAgICAgU3RyaW5nIGVtYWlsID0gZW1haWxUZXh0RmllbGQuZ2V0VGV4dCgpOwogICAgICAgIFN0cmluZyB0ZWxlcGhvbmUgPSB0ZWxlcGhvbmVUZXh0RmllbGQuZ2V0VGV4dCgpOwogICAgICAgIFN0cmluZyBhZGRyZXNzID0gYWRkcmVzc1RleHRBcmVhLmdldFRleHQoKTsKICAgICAgICBTdHJpbmcgZGVncmVlID0gSGlnaGVzdERlZ3JlZS5nZXREZWdyZWVCeU5hbWUoKFN0cmluZykgZGVncmVlQ29tYm9Cb3guZ2V0U2VsZWN0ZWRJdGVtKCkpOwogICAgICAgIGludCBncmFkdWF0aW9uWWVhciA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgZ3JhZHVhdGlvbkNvbWJvQm94LmdldFNlbGVjdGVkSXRlbSgpKTsKICAgICAgICAKICAgICAgICBTdHJpbmdCdWlsZGVyIG1ham9yc0JpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgZm9yIChKQ2hlY2tCb3ggY2hlY2tib3ggOiBjaGVja0JveExpc3QpIHsKICAgICAgICAgICAgaWYgKGNoZWNrYm94LmlzU2VsZWN0ZWQoKSkgewogICAgICAgICAgICAgICAgbWFqb3JzQmlsZGVyLmFwcGVuZChjaGVja2JveC5nZXRUZXh0KCkpLmFwcGVuZCgmcXVvdDsgJnF1b3Q7KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBTdHJpbmdbXSBtYWpvcnMgPSBtYWpvcnNCaWxkZXIudG9TdHJpbmcoKS5zdHJpcCgpLnNwbGl0KCZxdW90OyAmcXVvdDspOwogICAgICAgIAogICAgICAgIGlmIChmaXJzdE5hbWUuaXNCbGFuaygpIHx8IGxhc3ROYW1lLmlzQmxhbmsoKSB8fCBlbWFpbC5pc0JsYW5rKCkgfHwgdGVsZXBob25lLmlzQmxhbmsoKQogICAgICAgICAgICAgICAgfHwgYWRkcmVzcy5pc0JsYW5rKCkgfHwgbWFqb3JzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKG51bGwsICZxdW90O05vbmUgb2YgdGhlIGZpZWxkcyBtdXN0IGJlIGVtcHR5LCBhdCBsZWFzdCBvbmUgbWVudG9yaW5nIGludGVyZXN0IG11c3QgYmUgc2VsZWN0ZWQmcXVvdDspOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIFN0cmluZyBVUkwgPSAmcXVvdDtqZGJjOmRlcmJ5Oi8vbG9jYWxob3N0OjE1MjcvTWVudG9ycyBTeXN0ZW0mcXVvdDs7CiAgICAgICAgICAgICAgIFN0cmluZyBzcWwgPSAmcXVvdDtJTlNFUlQgSU5UTyBST09ULk1FTlRPUlMgKGlkLCBmaXJzdF9uYW1lLCBsYXN0X25hbWUsIGVtYWlsLCBhZGRyZXNzLCB0ZWxlcGhvbmUsIGhpZ2hlc3RfZGVncmVlLCBncmFkdWF0aW9uX3llYXIsIG1ham9ycykmcXVvdDsgKwogICAgICAgICAgICAgICAgJnF1b3Q7VkFMVUVTICgoU0VMRUNUIENPVU5UICgqKSBGUk9NIFJPT1QuTUVOVE9SUyksID8sID8sID8sID8sID8sID8sID8sID8pJnF1b3Q7OwogICAgICAgICAgICAgICBDb25uZWN0aW9uIGNvbiA9IG51bGw7CiAgICAgICAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHBzdG10ID0gbnVsbDsKICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoJnF1b3Q7b3JnLmFwYWNoZS5kZXJieS5qZGJjLkNsaWVudERyaXZlciZxdW90Oyk7CiAgICAgICAgICAgICAgICAgICBjb24gPSBEcml2ZXJNYW5hZ2VyLmdldENvbm5lY3Rpb24oVVJMLCAmcXVvdDtyb290JnF1b3Q7LCAmcXVvdDtyb290JnF1b3Q7KTsKICAgICAgICAgICAgICAgICAgIHBzdG10ID0gY29uLnByZXBhcmVTdGF0ZW1lbnQoc3FsKTsKICAgICAgICAgICAgICAgICAgIGludCBrID0gMDsKICAgICAgICAgICAgICAgICAgIHBzdG10LnNldFN0cmluZygrK2ssIGZpcnN0TmFtZSk7CiAgICAgICAgICAgICAgICAgICBwc3RtdC5zZXRTdHJpbmcoKytrLCBsYXN0TmFtZSk7CiAgICAgICAgICAgICAgICAgICBwc3RtdC5zZXRTdHJpbmcoKytrLCBlbWFpbCk7CiAgICAgICAgICAgICAgICAgICBwc3RtdC5zZXRTdHJpbmcoKytrLCBhZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgIHBzdG10LnNldFN0cmluZygrK2ssIHRlbGVwaG9uZSk7CiAgICAgICAgICAgICAgICAgICBwc3RtdC5zZXRTdHJpbmcoKytrLCBkZWdyZWUpOwogICAgICAgICAgICAgICAgICAgcHN0bXQuc2V0SW50KCsraywgZ3JhZHVhdGlvblllYXIpOwogICAgICAgICAgICAgICAgICAgcHN0bXQuc2V0U3RyaW5nKCsraywgQXJyYXlzLnRvU3RyaW5nKG1ham9ycykpOwogICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gcHN0bXQuZXhlY3V0ZVVwZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAmZ3Q7IDApIHsKICAgICAgICAgICAgICAgICAgICAgICByZXNldEJ1dHRvbkFjdGlvblBlcmZvcm1lZChudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobnVsbCwgJnF1b3Q7VGhlIG1lbnRvciB3YXMgc3VjY2Vzc2Z1bGx5IHNhdmVkJnF1b3Q7KTsKICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobnVsbCwgJnF1b3Q7VW5hYmxlIHRvIHNhdmUgYSBtZW50b3ImcXVvdDspOwogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHwgU1FMRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKG51bGwsIGUpOwogICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CiAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICBpZiAocHN0bXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3RtdC5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKG51bGwsIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgIGlmIChjb24gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb24uY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhudWxsLCBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSAgICAgIAogICAgCiAgICBwcml2YXRlIHZvaWQgcmVzZXRCdXR0b25BY3Rpb25QZXJmb3JtZWQoamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQgZXZ0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgZmlyc3ROYW1lVGV4dEZpZWxkLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsKICAgICAgICBsYXN0TmFtZVRleHRGaWVsZC5zZXRUZXh0KCZxdW90OyZxdW90Oyk7CiAgICAgICAgZW1haWxUZXh0RmllbGQuc2V0VGV4dCgmcXVvdDsmcXVvdDspOwogICAgICAgIHRlbGVwaG9uZVRleHRGaWVsZC5zZXRUZXh0KCZxdW90OyZxdW90Oyk7CiAgICAgICAgYWRkcmVzc1RleHRBcmVhLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsKICAgICAgICBkZWdyZWVDb21ib0JveC5zZXRTZWxlY3RlZEl0ZW0oZGVncmVlQ29tYm9Cb3guZ2V0SXRlbUF0KDApKTsKICAgICAgICBncmFkdWF0aW9uQ29tYm9Cb3guc2V0U2VsZWN0ZWRJdGVtKGdyYWR1YXRpb25Db21ib0JveC5nZXRJdGVtQXQoMCkpOwogICAgICAgIGZvciAoSkNoZWNrQm94IGNoZWNrYm94IDogY2hlY2tCb3hMaXN0KSB7CiAgICAgICAgICAgIGNoZWNrYm94LnNldFNlbGVjdGVkKGZhbHNlKTsKICAgICAgICB9CiAgICB9ICAgIAoKICAgIC8qKgogICAgICogQHBhcmFtIGFyZ3MgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewogICAgICAgIC8qIENyZWF0ZSBhbmQgZGlzcGxheSB0aGUgZm9ybSAqLwogICAgICAgIGphdmEuYXd0LkV2ZW50UXVldWUuaW52b2tlTGF0ZXIobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICBuZXcgTWVudG9yR3VpKCkuc2V0VmlzaWJsZSh0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfSAgICAgICAgICAgICAgICAgCn0K
import java.awt.Dimension;
import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.sql.*;
/**
*
* @author Shukri Ali
*/
public class MentorGui extends javax.swing.JFrame {
enum Panel {
LOGIN_PANEL,
MENTOR_INFO_PANEL;
}
enum HighestDegree {
ASSOCIATE,
BACHELOR,
MASTER,
DOCTOR;
public static String getDegreeByName(String name) {
for (HighestDegree degree : values()) {
String degreeStr = degree.name();
if (degreeStr.equalsIgnoreCase(name)) {
return degreeStr;
}
}
return null;
}
}
private static final long serialVersionUID = 1L;
private static final String USERNAME = "USERNAME";
private static final String PASSWORD = "PASSWORD";
// Mentor information panel
private JPanel mentorInfoPanel;
private JTextArea addressTextArea;
private JTextField emailTextField;
private JTextField firstNameTextField;
private JTextField lastNameTextField;
private JTextField telephoneTextField;
private final java.util.List<JCheckBox> checkBoxList = new ArrayList<>();
private JComboBox<String> degreeComboBox;
private JComboBox<String> graduationComboBox;
private static final int FROM_GRADUATION_YEAR = 2012;
private static final int TO_GRADUATION_YEAR = 2022;
private JButton resetButton;
private JButton saveButton;
// login panel components
private JPanel loginPanel;
private JLabel loginTitleLabel;
private JLabel usernameLabel;
private JLabel passwordLabel;
private JTextField usernameTextField;
private JPasswordField passwordTextField;
private JButton submitButton;
/**
* Creates new form MentorGui
*/
public MentorGui() {
initComponents();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
loginPanel = new JPanel();
passwordLabel = new JLabel();
usernameLabel = new JLabel();
submitButton = new JButton();
usernameTextField = new JTextField();
passwordTextField = new JPasswordField();
loginTitleLabel = new JLabel();
mentorInfoPanel = new JPanel();
firstNameTextField = new JTextField();
lastNameTextField = new JTextField();
emailTextField = new JTextField();
telephoneTextField = new JTextField();
JLabel degreeLabel = new JLabel();
JLabel addressLabel = new JLabel();
degreeComboBox = new JComboBox<>();
JLabel graduationLabel = new JLabel();
graduationComboBox = new JComboBox<>();
JLabel interestsLabel = new JLabel();
saveButton = new JButton();
resetButton = new JButton();
JScrollPane addressScrollPane = new JScrollPane();
addressTextArea = new JTextArea();
loginPanel.setPreferredSize(new Dimension(463, 363));
loginPanel.setBackground(java.awt.Color.blue);
loginPanel.setLayout(new java.awt.GridBagLayout());
passwordLabel.setFont(new java.awt.Font("Sylfaen", 0, 18)); // NOI18N
passwordLabel.setForeground(new java.awt.Color(255, 255, 255));
passwordLabel.setHorizontalAlignment(javax.swing.JTextField.CENTER);
passwordLabel.setText("Password:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(12, 193, 0, 0);
loginPanel.add(passwordLabel, gridBagConstraints);
passwordLabel.getAccessibleContext().setAccessibleName("passwordLabel");
usernameLabel.setFont(new java.awt.Font("Sylfaen", 0, 18)); // NOI18N
usernameLabel.setForeground(new java.awt.Color(255, 255, 255));
usernameLabel.setHorizontalAlignment(javax.swing.JTextField.CENTER);
usernameLabel.setText("Username:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(93, 191, 0, 0);
loginPanel.add(usernameLabel, gridBagConstraints);
usernameLabel.getAccessibleContext().setAccessibleName("usernameLabel");
submitButton.setBackground(java.awt.Color.blue);
submitButton.setFont(new java.awt.Font("Sylfaen", 1, 14)); // NOI18N
submitButton.setForeground(new java.awt.Color(255, 255, 255));
submitButton.setText("SUBMIT");
submitButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
submitButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
submitButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridy = 5;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(18, 192, 42, 0);
loginPanel.add(submitButton, gridBagConstraints);
submitButton.getAccessibleContext().setAccessibleName("submitButton");
usernameTextField.setFont(new java.awt.Font("Sylfaen", 0, 18)); // NOI18N
usernameTextField.setForeground(java.awt.Color.blue);
usernameTextField.setHorizontalAlignment(javax.swing.JTextField.LEFT);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.ipadx = 150;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 178, 0, 175);
loginPanel.add(usernameTextField, gridBagConstraints);
usernameTextField.getAccessibleContext().setAccessibleName("usernameTextField");
passwordTextField.setFont(new java.awt.Font("Sylfaen", 0, 18)); // NOI18N
passwordTextField.setForeground(java.awt.Color.blue);
passwordTextField.setHorizontalAlignment(javax.swing.JTextField.LEFT);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 4;
gridBagConstraints.ipadx = 150;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 178, 0, 175);
loginPanel.add(passwordTextField, gridBagConstraints);
passwordTextField.getAccessibleContext().setAccessibleName("passwordTextField");
loginTitleLabel.setFont(new java.awt.Font("Sylfaen", 1, 36)); // NOI18N
loginTitleLabel.setForeground(javax.swing.UIManager.getDefaults().getColor("Button.background"));
loginTitleLabel.setText("LOGIN");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
loginPanel.add(loginTitleLabel, gridBagConstraints);
mentorInfoPanel.setBackground(java.awt.Color.blue);
mentorInfoPanel.setLayout(new java.awt.GridBagLayout());
JLabel firstNameLabel = new javax.swing.JLabel();
firstNameLabel.setFont(new java.awt.Font("Sylfaen", 0, 18)); // NOI18N
firstNameLabel.setForeground(new java.awt.Color(255, 255, 255));
firstNameLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
firstNameLabel.setText("First name:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(24, 103, 0, 0);
mentorInfoPanel.add(firstNameLabel, gridBagConstraints);
firstNameLabel.getAccessibleContext().setAccessibleName("firstNameLabel");
firstNameTextField.setFont(new java.awt.Font("Sylfaen", 0, 18)); // NOI18N
firstNameTextField.setForeground(java.awt.Color.blue);
firstNameTextField.setHorizontalAlignment(javax.swing.JTextField.LEFT);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 9;
gridBagConstraints.ipadx = 170;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(18, 6, 0, 0);
mentorInfoPanel.add(firstNameTextField, gridBagConstraints);
firstNameTextField.getAccessibleContext().setAccessibleName("firstNameTextField");
JLabel mentorInfoLabel = new javax.swing.JLabel();
mentorInfoLabel.setFont(new java.awt.Font("Sylfaen", 1, 36)); // NOI18N
mentorInfoLabel.setForeground(javax.swing.UIManager.getDefaults().getColor("Button.background"));
mentorInfoLabel.setText("Mentor information");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 6;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 92, 0, 0);
mentorInfoPanel.add(mentorInfoLabel, gridBagConstraints);
mentorInfoLabel.getAccessibleContext().setAccessibleName("mentorInfoLabel");
mentorInfoLabel.getAccessibleContext().setAccessibleDescription("");
lastNameTextField.setFont(new java.awt.Font("Sylfaen", 0, 18)); // NOI18N
lastNameTextField.setForeground(java.awt.Color.blue);
lastNameTextField.setHorizontalAlignment(javax.swing.JTextField.LEFT);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 9;
gridBagConstraints.gridheight = 2;
gridBagConstraints.ipadx = 170;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(9, 6, 0, 0);
mentorInfoPanel.add(lastNameTextField, gridBagConstraints);
lastNameTextField.getAccessibleContext().setAccessibleName("lastNameTextField");
JLabel lastNameLabel = new javax.swing.JLabel();
lastNameLabel.setFont(new java.awt.Font("Sylfaen", 0, 18)); // NOI18N
lastNameLabel.setForeground(new java.awt.Color(255, 255, 255));
lastNameLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
lastNameLabel.setText("Last name:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.ipadx = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(12, 103, 0, 0);
mentorInfoPanel.add(lastNameLabel, gridBagConstraints);
lastNameLabel.getAccessibleContext().setAccessibleName("lastNameLabel");
emailTextField.setFont(new java.awt.Font("Sylfaen", 0, 18)); // NOI18N
emailTextField.setForeground(java.awt.Color.blue);
emailTextField.setHorizontalAlignment(javax.swing.JTextField.LEFT);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 4;
gridBagConstraints.gridwidth = 9;
gridBagConstraints.gridheight = 2;
gridBagConstraints.ipadx = 170;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(12, 6, 0, 0);
mentorInfoPanel.add(emailTextField, gridBagConstraints);
emailTextField.getAccessibleContext().setAccessibleName("emailTextField");
JLabel emailLabel = new javax.swing.JLabel();
emailLabel.setFont(new java.awt.Font("Sylfaen", 0, 18)); // NOI18N
emailLabel.setForeground(new java.awt.Color(255, 255, 255));
emailLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
emailLabel.setText("Email:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 4;
gridBagConstraints.ipadx = 37;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(15, 103, 0, 0);
mentorInfoPanel.add(emailLabel, gridBagConstraints);
emailLabel.getAccessibleContext().setAccessibleName("emailLabel");
JLabel telephoneLabel = new javax.swing.JLabel();
telephoneLabel.setFont(new java.awt.Font("Sylfaen", 0, 18)); // NOI18N
telephoneLabel.setForeground(new java.awt.Color(255, 255, 255));
telephoneLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
telephoneLabel.setText("Telephone:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 6;
gridBagConstraints.ipadx = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(9, 103, 0, 0);
mentorInfoPanel.add(telephoneLabel, gridBagConstraints);
telephoneLabel.getAccessibleContext().setAccessibleName("telephoneLabel");
telephoneTextField.setFont(new java.awt.Font("Sylfaen", 0, 18)); // NOI18N
telephoneTextField.setForeground(java.awt.Color.blue);
telephoneTextField.setHorizontalAlignment(javax.swing.JTextField.LEFT);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 6;
gridBagConstraints.gridwidth = 9;
gridBagConstraints.gridheight = 2;
gridBagConstraints.ipadx = 170;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 6, 0, 0);
mentorInfoPanel.add(telephoneTextField, gridBagConstraints);
telephoneTextField.getAccessibleContext().setAccessibleName("telephoneTextField");
degreeLabel.setFont(new java.awt.Font("Sylfaen", 0, 18)); // NOI18N
degreeLabel.setForeground(new java.awt.Color(255, 255, 255));
degreeLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
degreeLabel.setText("Highest Degree:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 10;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.gridheight = 2;
gridBagConstraints.ipadx = 13;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(23, 92, 0, 0);
mentorInfoPanel.add(degreeLabel, gridBagConstraints);
degreeLabel.getAccessibleContext().setAccessibleName("degreeLabel");
addressLabel.setFont(new java.awt.Font("Sylfaen", 0, 18)); // NOI18N
addressLabel.setForeground(new java.awt.Color(255, 255, 255));
addressLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
addressLabel.setText("Address:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 8;
gridBagConstraints.ipadx = 18;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(12, 103, 0, 0);
mentorInfoPanel.add(addressLabel, gridBagConstraints);
addressLabel.getAccessibleContext().setAccessibleName("addressLabel");
degreeComboBox.setModel(new DefaultComboBoxModel<>(new String[HighestDegree.values().length]));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 4;
gridBagConstraints.gridy = 10;
gridBagConstraints.gridwidth = 10;
gridBagConstraints.ipadx = 101;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(23, 6, 0, 62);
initDegreeComboBox();
mentorInfoPanel.add(degreeComboBox, gridBagConstraints);
degreeComboBox.getAccessibleContext().setAccessibleName("degreeComboBox");
graduationLabel.setFont(new java.awt.Font("Sylfaen", 0, 18)); // NOI18N
graduationLabel.setForeground(new java.awt.Color(255, 255, 255));
graduationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
graduationLabel.setText("Graduation Year:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 12;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.gridheight = 2;
gridBagConstraints.ipadx = 6;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 92, 0, 0);
mentorInfoPanel.add(graduationLabel, gridBagConstraints);
graduationLabel.getAccessibleContext().setAccessibleName("graduationLabel");
graduationComboBox.setModel(new DefaultComboBoxModel<>(new String[TO_GRADUATION_YEAR - FROM_GRADUATION_YEAR + 1]));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 4;
gridBagConstraints.gridy = 12;
gridBagConstraints.gridwidth = 10;
gridBagConstraints.ipadx = 101;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(3, 6, 0, 62);
initGraduationComboBox();
mentorInfoPanel.add(graduationComboBox, gridBagConstraints);
graduationComboBox.getAccessibleContext().setAccessibleName("graduationComboBox");
interestsLabel.setFont(new java.awt.Font("Sylfaen", 0, 18)); // NOI18N
interestsLabel.setForeground(new java.awt.Color(255, 255, 255));
interestsLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
interestsLabel.setText("Mentroting interests:");
interestsLabel.setToolTipText("“Select majors that you are interested in mentoring");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 14;
gridBagConstraints.gridwidth = 4;
gridBagConstraints.gridheight = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(1, 95, 0, 0);
mentorInfoPanel.add(interestsLabel, gridBagConstraints);
interestsLabel.getAccessibleContext().setAccessibleName("interestsLabel");
JCheckBox checkbox1 = new JCheckBox();
checkbox1.setBackground(java.awt.Color.blue);
checkbox1.setForeground(new java.awt.Color(255, 255, 255));
checkbox1.setText("Computer Science");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 4;
gridBagConstraints.gridy = 14;
gridBagConstraints.gridwidth = 10;
gridBagConstraints.ipadx = 88;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 6, 0, 62);
mentorInfoPanel.add(checkbox1, gridBagConstraints);
checkbox1.getAccessibleContext().setAccessibleName("computerScienceCheckBox");
checkBoxList.add(checkbox1);
JCheckBox checkbox2 = new JCheckBox();
checkbox2.setBackground(java.awt.Color.blue);
checkbox2.setForeground(new java.awt.Color(255, 255, 255));
checkbox2.setText("Computer Informational Technology");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 4;
gridBagConstraints.gridy = 17;
gridBagConstraints.gridwidth = 10;
gridBagConstraints.ipadx = 88;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 6, 0, 62);
mentorInfoPanel.add(checkbox2, gridBagConstraints);
checkbox2.getAccessibleContext().setAccessibleName("computerTechCheckBox");
checkBoxList.add(checkbox2);
JCheckBox checkbox3 = new JCheckBox();
checkbox3.setBackground(java.awt.Color.blue);
checkbox3.setForeground(new java.awt.Color(255, 255, 255));
checkbox3.setText("Cybersecurity");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 4;
gridBagConstraints.gridy = 16;
gridBagConstraints.gridwidth = 10;
gridBagConstraints.ipadx = 88;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 6, 0, 62);
mentorInfoPanel.add(checkbox3, gridBagConstraints);
checkbox3.getAccessibleContext().setAccessibleName("cybersecurityCheckBox");
checkBoxList.add(checkbox3);
JCheckBox checkbox4 = new JCheckBox();
checkbox4.setBackground(java.awt.Color.blue);
checkbox4.setForeground(new java.awt.Color(255, 255, 255));
checkbox4.setText("Computer Informational Systems");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 4;
gridBagConstraints.gridy = 18;
gridBagConstraints.gridwidth = 10;
gridBagConstraints.ipadx = 88;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 6, 0, 62);
mentorInfoPanel.add(checkbox4, gridBagConstraints);
checkbox4.getAccessibleContext().setAccessibleName("computerSystemsCheckBox");
checkBoxList.add(checkbox4);
saveButton.setText("SAVE");
saveButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
saveButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 19;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.ipadx = 14;
gridBagConstraints.ipady = 8;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(18, 113, 25, 0);
mentorInfoPanel.add(saveButton, gridBagConstraints);
saveButton.getAccessibleContext().setAccessibleName("saveButton");
resetButton.setText("RESET");
resetButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
resetButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 4;
gridBagConstraints.gridy = 19;
gridBagConstraints.ipadx = 18;
gridBagConstraints.ipady = 8;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(18, 6, 25, 0);
mentorInfoPanel.add(resetButton, gridBagConstraints);
resetButton.getAccessibleContext().setAccessibleName("resetButton");
addressTextArea.setColumns(10);
addressTextArea.setRows(5);
addressScrollPane.setViewportView(addressTextArea);
addressTextArea.getAccessibleContext().setAccessibleName("addressTextArea");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 8;
gridBagConstraints.gridwidth = 4;
gridBagConstraints.gridheight = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.ipadx = 100;
gridBagConstraints.ipady = 50;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(12, 6, 0, 0);
mentorInfoPanel.add(addressScrollPane, gridBagConstraints);
addressScrollPane.getAccessibleContext().setAccessibleName("addressScrollPane");
setTitle("Mentor Profile GUI created by Shukri Ali");
setMinimumSize(new Dimension(650, 647));
setSize(new Dimension(650, 647));
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setLayout(new CardLayout());
getContentPane().add(loginPanel);
pack();
}// </editor-fold>
private void initDegreeComboBox() {
degreeComboBox.removeAllItems();
for (HighestDegree degree : HighestDegree.values()) {
degreeComboBox.addItem(degree.name());
}
}
private void initGraduationComboBox() {
graduationComboBox.removeAllItems();
for (int i = FROM_GRADUATION_YEAR; i <= TO_GRADUATION_YEAR; i++) {
graduationComboBox.addItem(String.valueOf(i));
}
}
private void submitButtonActionPerformed(java.awt.event.ActionEvent evt) {
if (usernameTextField.getText().equals(USERNAME)) {
if (passwordTextField.getText().equals(PASSWORD)) {
remove(loginPanel);
add(mentorInfoPanel);
repaint();
revalidate();
} else {
JOptionPane.showMessageDialog(null, "Incorrect password");
}
} else {
JOptionPane.showMessageDialog(null, "Such username doesn't exist");
}
}
private void saveButtonActionPerformed(java.awt.event.ActionEvent evt) {
String firstName = firstNameTextField.getText();
String lastName = lastNameTextField.getText();
String email = emailTextField.getText();
String telephone = telephoneTextField.getText();
String address = addressTextArea.getText();
String degree = HighestDegree.getDegreeByName((String) degreeComboBox.getSelectedItem());
int graduationYear = Integer.parseInt((String) graduationComboBox.getSelectedItem());
StringBuilder majorsBilder = new StringBuilder();
for (JCheckBox checkbox : checkBoxList) {
if (checkbox.isSelected()) {
majorsBilder.append(checkbox.getText()).append(" ");
}
}
String[] majors = majorsBilder.toString().strip().split(" ");
if (firstName.isBlank() || lastName.isBlank() || email.isBlank() || telephone.isBlank()
|| address.isBlank() || majors.length == 0) {
JOptionPane.showMessageDialog(null, "None of the fields must be empty, at least one mentoring interest must be selected");
} else {
String URL = "jdbc:derby://localhost:1527/Mentors System";
String sql = "INSERT INTO ROOT.MENTORS (id, first_name, last_name, email, address, telephone, highest_degree, graduation_year, majors)" +
"VALUES ((SELECT COUNT (*) FROM ROOT.MENTORS), ?, ?, ?, ?, ?, ?, ?, ?)";
Connection con = null;
PreparedStatement pstmt = null;
try {
Class.forName("org.apache.derby.jdbc.ClientDriver");
con = DriverManager.getConnection(URL, "root", "root");
pstmt = con.prepareStatement(sql);
int k = 0;
pstmt.setString(++k, firstName);
pstmt.setString(++k, lastName);
pstmt.setString(++k, email);
pstmt.setString(++k, address);
pstmt.setString(++k, telephone);
pstmt.setString(++k, degree);
pstmt.setInt(++k, graduationYear);
pstmt.setString(++k, Arrays.toString(majors));
int result = pstmt.executeUpdate();
if (result > 0) {
resetButtonActionPerformed(null);
JOptionPane.showMessageDialog(null, "The mentor was successfully saved");
} else {
JOptionPane.showMessageDialog(null, "Unable to save a mentor");
}
} catch (ClassNotFoundException | SQLException e) {
JOptionPane.showMessageDialog(null, e);
System.exit(0);
} finally {
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, e.getMessage());
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, e.getMessage());
}
}
}
}
}
private void resetButtonActionPerformed(java.awt.event.ActionEvent evt) {
firstNameTextField.setText("");
lastNameTextField.setText("");
emailTextField.setText("");
telephoneTextField.setText("");
addressTextArea.setText("");
degreeComboBox.setSelectedItem(degreeComboBox.getItemAt(0));
graduationComboBox.setSelectedItem(graduationComboBox.getItemAt(0));
for (JCheckBox checkbox : checkBoxList) {
checkbox.setSelected(false);
}
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MentorGui().setVisible(true);
}
});
}
}