ZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9BV1RFdmVudC5qYXZhIGIvYXd0L2phdmEvYXd0L0FXVEV2ZW50LmphdmEKaW5kZXggMWVkOWEzNy4uYThkYzgzYSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0FXVEV2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0FXVEV2ZW50LmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgRG1pdHJ5IEEuIER1cm5ldiwgTWljaGFlbCBEYW5pbG92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dDsKIAogaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKQEAgLTI3LDE5MCArMjgsMjUyIEBACiBpbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKIAogLyoqCi0gKiBUaGUgYWJzdHJhY3QgQVdUIGV2ZW50cyBpcyBiYXNlIGNsYXNzIGZvciBhbGwgQVdUIGV2ZW50cy4gCi0gKiBUaGlzIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBzdXBlcmNlZGUgdGhlIG9yaWdpbmFsIGphdmEuYXd0LkV2ZW50IGNsYXNzLgorICogVGhlIGFic3RyYWN0IGNsYXNzIEFXVEV2ZW50IGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgQVdUIGV2ZW50cy4gVGhpcyBjbGFzcworICogYW5kIGl0cyBzdWJjbGFzc2VzIHN1cGVyc2VkZSB0aGUgb3JpZ2luYWwgamF2YS5hd3QuRXZlbnQgY2xhc3MuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVdURXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE4MjUzMTQ3NzkxNjA0MDk0MDVMOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBDT01QT05FTlRfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gYSBjb21wb25lbnQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENPTVBPTkVOVF9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhCisgICAgICogY29tcG9uZW50LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBDT01QT05FTlRfRVZFTlRfTUFTSyA9IDE7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IENPTlRBSU5FUl9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhIGNvbnRhaW5lci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ09OVEFJTkVSX0VWRU5UX01BU0sgaW5kaWNhdGVzIHRoZSBldmVudCByZWxhdGVzIHRvIGEKKyAgICAgKiBjb250YWluZXIuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIENPTlRBSU5FUl9FVkVOVF9NQVNLID0gMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgRk9DVVNfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gdGhlIGZvY3VzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBGT0NVU19FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byB0aGUgZm9jdXMuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEZPQ1VTX0VWRU5UX01BU0sgPSA0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBLRVlfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gYSBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEtFWV9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhIGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgS0VZX0VWRU5UX01BU0sgPSA4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBNT1VTRV9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byB0aGUgbW91c2UuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IE1PVVNFX0VWRU5UX01BU0sgaW5kaWNhdGVzIHRoZSBldmVudCByZWxhdGVzIHRvIHRoZSBtb3VzZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTU9VU0VfRVZFTlRfTUFTSyA9IDE2OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBNT1VTRV9NT1RJT05fRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gYSBtb3VzZSBtb3Rpb24uICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IE1PVVNFX01PVElPTl9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhCisgICAgICogbW91c2UgbW90aW9uLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBNT1VTRV9NT1RJT05fRVZFTlRfTUFTSyA9IDMyOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBXSU5ET1dfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gYSB3aW5kb3cuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFdJTkRPV19FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhIHdpbmRvdy4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgV0lORE9XX0VWRU5UX01BU0sgPSA2NDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQUNUSU9OX0VWRU5UX01BU0sgaW5kaWNhdGVzIHRoZSBldmVudCByZWxhdGVzIHRvIGFuIGFjdGlvbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQUNUSU9OX0VWRU5UX01BU0sgaW5kaWNhdGVzIHRoZSBldmVudCByZWxhdGVzIHRvIGFuIGFjdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNUSU9OX0VWRU5UX01BU0sgPSAxMjg7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEFESlVTVE1FTlRfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gYW4gYWRqdXN0bWVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQURKVVNUTUVOVF9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhbgorICAgICAqIGFkanVzdG1lbnQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFESlVTVE1FTlRfRVZFTlRfTUFTSyA9IDI1NjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgSVRFTV9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhbiBpdGVtLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBJVEVNX0VWRU5UX01BU0sgaW5kaWNhdGVzIHRoZSBldmVudCByZWxhdGVzIHRvIGFuIGl0ZW0uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIElURU1fRVZFTlRfTUFTSyA9IDUxMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVEVYVF9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byB0ZXh0LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBURVhUX0VWRU5UX01BU0sgaW5kaWNhdGVzIHRoZSBldmVudCByZWxhdGVzIHRvIHRleHQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFRFWFRfRVZFTlRfTUFTSyA9IDEwMjQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IElOUFVUX01FVEhPRF9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhbiBpbnB1dCBtZXRob2QuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IElOUFVUX01FVEhPRF9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhbgorICAgICAqIGlucHV0IG1ldGhvZC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgSU5QVVRfTUVUSE9EX0VWRU5UX01BU0sgPSAyMDQ4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBQQUlOVF9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhIHBhaW50IG1ldGhvZC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUEFJTlRfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gYSBwYWludAorICAgICAqIG1ldGhvZC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUEFJTlRfRVZFTlRfTUFTSyA9IDgxOTI7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IElOVk9DQVRJT05fRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gYSBtZXRob2QgaW52b2NhdGlvbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgSU5WT0NBVElPTl9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhCisgICAgICogbWV0aG9kIGludm9jYXRpb24uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIElOVk9DQVRJT05fRVZFTlRfTUFTSyA9IDE2Mzg0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBISUVSQVJDSFlfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gYSBoaWVyYXJjaHkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEhJRVJBUkNIWV9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhCisgICAgICogaGllcmFyY2h5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBISUVSQVJDSFlfRVZFTlRfTUFTSyA9IDMyNzY4OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBISUVSQVJDSFlfQk9VTkRTX0VWRU5UX01BU0sgaW5kaWNhdGVzIHRoZSBldmVudCByZWxhdGVzIHRvIGhpZXJhcmNoeSBib3VuZHMuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEhJRVJBUkNIWV9CT1VORFNfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8KKyAgICAgKiBoaWVyYXJjaHkgYm91bmRzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBISUVSQVJDSFlfQk9VTkRTX0VWRU5UX01BU0sgPSA2NTUzNjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgTU9VU0VfV0hFRUxfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gdGhlIG1vdXNlIHdoZWVsLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBNT1VTRV9XSEVFTF9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byB0aGUKKyAgICAgKiBtb3VzZSB3aGVlbC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTU9VU0VfV0hFRUxfRVZFTlRfTUFTSyA9IDEzMTA3MjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgV0lORE9XX1NUQVRFX0VWRU5UX01BU0sgaW5kaWNhdGVzIHRoZSBldmVudCByZWxhdGVzIHRvIGEgd2luZG93IHN0YXRlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBXSU5ET1dfU1RBVEVfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gYQorICAgICAqIHdpbmRvdyBzdGF0ZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgV0lORE9XX1NUQVRFX0VWRU5UX01BU0sgPSAyNjIxNDQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFdJTkRPV19GT0NVU19FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhIHdpbmRvdyBmb2N1cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgV0lORE9XX0ZPQ1VTX0VWRU5UX01BU0sgaW5kaWNhdGVzIHRoZSBldmVudCByZWxhdGVzIHRvIGEKKyAgICAgKiB3aW5kb3cgZm9jdXMuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFdJTkRPV19GT0NVU19FVkVOVF9NQVNLID0gNTI0Mjg4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBSRVNFUlZFRF9JRF9NQVggaW5kaWNhdGVzIHRoZSBtYXhpbXVtIHZhbHVlIGZvciByZXNlcnZlZCAKLSAgICAgKiBBV1QgZXZlbnQgSURzLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBSRVNFUlZFRF9JRF9NQVggaW5kaWNhdGVzIHRoZSBtYXhpbXVtIHZhbHVlIGZvciByZXNlcnZlZCBBV1QKKyAgICAgKiBldmVudCBJRHMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTRVJWRURfSURfTUFYID0gMTk5OTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgZXZlbnRzTWFwLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBldmVudHNNYXAuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaHRhYmxlPEludGVnZXIsIEV2ZW50RGVzY3JpcHRvcj4gZXZlbnRzTWFwID0gbmV3IEhhc2h0YWJsZTxJbnRlZ2VyLCBFdmVudERlc2NyaXB0b3I+KCk7CiAKLSAgICAvKiogVGhlIGNvbnZlcnRlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29udmVydGVyLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIEV2ZW50Q29udmVydGVyIGNvbnZlcnRlcjsKIAotICAgIC8qKiBUaGUgSUQgb2YgdGhlIGV2ZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBJRCBvZiB0aGUgZXZlbnQuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBpZDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgY29uc3VtZWQgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBldmVudCBpcyBzZW50IGJhY2sgZG93biB0byAKLSAgICAgKiB0aGUgcGVlciBvbmNlIHRoZSBzb3VyY2UgaGFzIHByb2Nlc3NlZCBpdCAoZmFsc2UgbWVhbnMgaXQncyBzZW50IHRvIHRoZSBwZWVyLAorICAgIC8qKgorICAgICAqIFRoZSBjb25zdW1lZCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGV2ZW50IGlzIHNlbnQgYmFjayBkb3duIHRvIHRoZQorICAgICAqIHBlZXIgb25jZSB0aGUgc291cmNlIGhhcyBwcm9jZXNzZWQgaXQgKGZhbHNlIG1lYW5zIGl0J3Mgc2VudCB0byB0aGUgcGVlciwKICAgICAgKiB0cnVlIG1lYW5zIGl0J3Mgbm90KS4KLSAgICAgKi8gCisgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uc3VtZWQ7CiAKLSAgICAvKiogVGhlIGRpc3BhdGNoZWQgYnkga2ZtLiAqLworICAgIC8qKgorICAgICAqIFRoZSBkaXNwYXRjaGVkIGJ5IGtmbS4KKyAgICAgKi8KICAgICBib29sZWFuIGRpc3BhdGNoZWRCeUtGTTsKLSAgICAKLSAgICAvKiogVGhlIGlzIHBvc3RlZC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBpcyBwb3N0ZWQuCisgICAgICovCiAgICAgdHJhbnNpZW50IGJvb2xlYW4gaXNQb3N0ZWQ7CiAKICAgICBzdGF0aWMgewotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKEtleUV2ZW50LktFWV9UWVBFRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihLRVlfRVZFTlRfTUFTSywgS2V5TGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihLZXlFdmVudC5LRVlfUFJFU1NFRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihLRVlfRVZFTlRfTUFTSywgS2V5TGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihLZXlFdmVudC5LRVlfUkVMRUFTRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoS0VZX0VWRU5UX01BU0ssIEtleUxpc3RlbmVyLmNsYXNzKSk7Ci0gICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoTW91c2VFdmVudC5NT1VTRV9DTElDS0VEKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKE1PVVNFX0VWRU5UX01BU0ssIE1vdXNlTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihNb3VzZUV2ZW50Lk1PVVNFX1BSRVNTRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoTU9VU0VfRVZFTlRfTUFTSywgTW91c2VMaXN0ZW5lci5jbGFzcykpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKE1vdXNlRXZlbnQuTU9VU0VfUkVMRUFTRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoTU9VU0VfRVZFTlRfTUFTSywgTW91c2VMaXN0ZW5lci5jbGFzcykpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKE1vdXNlRXZlbnQuTU9VU0VfTU9WRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoTU9VU0VfTU9USU9OX0VWRU5UX01BU0ssIE1vdXNlTW90aW9uTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihNb3VzZUV2ZW50Lk1PVVNFX0VOVEVSRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoTU9VU0VfRVZFTlRfTUFTSywgTW91c2VMaXN0ZW5lci5jbGFzcykpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKE1vdXNlRXZlbnQuTU9VU0VfRVhJVEVEKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKE1PVVNFX0VWRU5UX01BU0ssIE1vdXNlTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihNb3VzZUV2ZW50Lk1PVVNFX0RSQUdHRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoTU9VU0VfTU9USU9OX0VWRU5UX01BU0ssIE1vdXNlTW90aW9uTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihNb3VzZUV2ZW50Lk1PVVNFX1dIRUVMKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKE1PVVNFX1dIRUVMX0VWRU5UX01BU0ssIE1vdXNlV2hlZWxMaXN0ZW5lci5jbGFzcykpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKENvbXBvbmVudEV2ZW50LkNPTVBPTkVOVF9NT1ZFRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihDT01QT05FTlRfRVZFTlRfTUFTSywgQ29tcG9uZW50TGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihDb21wb25lbnRFdmVudC5DT01QT05FTlRfUkVTSVpFRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihDT01QT05FTlRfRVZFTlRfTUFTSywgQ29tcG9uZW50TGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihDb21wb25lbnRFdmVudC5DT01QT05FTlRfU0hPV04pLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoQ09NUE9ORU5UX0VWRU5UX01BU0ssIENvbXBvbmVudExpc3RlbmVyLmNsYXNzKSk7Ci0gICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoQ29tcG9uZW50RXZlbnQuQ09NUE9ORU5UX0hJRERFTiksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihDT01QT05FTlRfRVZFTlRfTUFTSywgQ29tcG9uZW50TGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihGb2N1c0V2ZW50LkZPQ1VTX0dBSU5FRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihGT0NVU19FVkVOVF9NQVNLLCBGb2N1c0xpc3RlbmVyLmNsYXNzKSk7Ci0gICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoRm9jdXNFdmVudC5GT0NVU19MT1NUKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKEZPQ1VTX0VWRU5UX01BU0ssIEZvY3VzTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihQYWludEV2ZW50LlBBSU5UKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKFBBSU5UX0VWRU5UX01BU0ssIG51bGwpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihQYWludEV2ZW50LlVQREFURSksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihQQUlOVF9FVkVOVF9NQVNLLCBudWxsKSk7Ci0gICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoV2luZG93RXZlbnQuV0lORE9XX09QRU5FRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihXSU5ET1dfRVZFTlRfTUFTSywgV2luZG93TGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfQ0xPU0lORyksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihXSU5ET1dfRVZFTlRfTUFTSywgV2luZG93TGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfQ0xPU0VEKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKFdJTkRPV19FVkVOVF9NQVNLLCBXaW5kb3dMaXN0ZW5lci5jbGFzcykpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKFdpbmRvd0V2ZW50LldJTkRPV19ERUlDT05JRklFRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihXSU5ET1dfRVZFTlRfTUFTSywgV2luZG93TGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfSUNPTklGSUVEKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKFdJTkRPV19FVkVOVF9NQVNLLCBXaW5kb3dMaXN0ZW5lci5jbGFzcykpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKFdpbmRvd0V2ZW50LldJTkRPV19TVEFURV9DSEFOR0VEKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKFdJTkRPV19TVEFURV9FVkVOVF9NQVNLLCBXaW5kb3dTdGF0ZUxpc3RlbmVyLmNsYXNzKSk7Ci0gICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoV2luZG93RXZlbnQuV0lORE9XX0xPU1RfRk9DVVMpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoV0lORE9XX0ZPQ1VTX0VWRU5UX01BU0ssIFdpbmRvd0ZvY3VzTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfR0FJTkVEX0ZPQ1VTKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKFdJTkRPV19GT0NVU19FVkVOVF9NQVNLLCBXaW5kb3dGb2N1c0xpc3RlbmVyLmNsYXNzKSk7Ci0gICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoV2luZG93RXZlbnQuV0lORE9XX0RFQUNUSVZBVEVEKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKFdJTkRPV19FVkVOVF9NQVNLLCBXaW5kb3dMaXN0ZW5lci5jbGFzcykpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKFdpbmRvd0V2ZW50LldJTkRPV19BQ1RJVkFURUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoV0lORE9XX0VWRU5UX01BU0ssIFdpbmRvd0xpc3RlbmVyLmNsYXNzKSk7Ci0gICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoSGllcmFyY2h5RXZlbnQuSElFUkFSQ0hZX0NIQU5HRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoSElFUkFSQ0hZX0VWRU5UX01BU0ssIEhpZXJhcmNoeUxpc3RlbmVyLmNsYXNzKSk7Ci0gICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoSGllcmFyY2h5RXZlbnQuQU5DRVNUT1JfTU9WRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoSElFUkFSQ0hZX0JPVU5EU19FVkVOVF9NQVNLLCBIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lci5jbGFzcykpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKEhpZXJhcmNoeUV2ZW50LkFOQ0VTVE9SX1JFU0laRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoSElFUkFSQ0hZX0JPVU5EU19FVkVOVF9NQVNLLCBIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lci5jbGFzcykpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKENvbnRhaW5lckV2ZW50LkNPTVBPTkVOVF9BRERFRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihDT05UQUlORVJfRVZFTlRfTUFTSywgQ29udGFpbmVyTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihDb250YWluZXJFdmVudC5DT01QT05FTlRfUkVNT1ZFRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihDT05UQUlORVJfRVZFTlRfTUFTSywgQ29udGFpbmVyTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihJbnB1dE1ldGhvZEV2ZW50LklOUFVUX01FVEhPRF9URVhUX0NIQU5HRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoSU5QVVRfTUVUSE9EX0VWRU5UX01BU0ssIElucHV0TWV0aG9kTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihJbnB1dE1ldGhvZEV2ZW50LkNBUkVUX1BPU0lUSU9OX0NIQU5HRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoSU5QVVRfTUVUSE9EX0VWRU5UX01BU0ssIElucHV0TWV0aG9kTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihJbnZvY2F0aW9uRXZlbnQuSU5WT0NBVElPTl9ERUZBVUxUKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKElOVk9DQVRJT05fRVZFTlRfTUFTSywgbnVsbCkpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKEl0ZW1FdmVudC5JVEVNX1NUQVRFX0NIQU5HRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoSVRFTV9FVkVOVF9NQVNLLCBJdGVtTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihUZXh0RXZlbnQuVEVYVF9WQUxVRV9DSEFOR0VEKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKFRFWFRfRVZFTlRfTUFTSywgVGV4dExpc3RlbmVyLmNsYXNzKSk7Ci0gICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoQWN0aW9uRXZlbnQuQUNUSU9OX1BFUkZPUk1FRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihBQ1RJT05fRVZFTlRfTUFTSywgQWN0aW9uTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihBZGp1c3RtZW50RXZlbnQuQURKVVNUTUVOVF9WQUxVRV9DSEFOR0VEKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKEFESlVTVE1FTlRfRVZFTlRfTUFTSywgQWRqdXN0bWVudExpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoS2V5RXZlbnQuS0VZX1RZUEVEKSwgbmV3IEV2ZW50RGVzY3JpcHRvcihLRVlfRVZFTlRfTUFTSywKKyAgICAgICAgICAgICAgICBLZXlMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKEtleUV2ZW50LktFWV9QUkVTU0VEKSwgbmV3IEV2ZW50RGVzY3JpcHRvcihLRVlfRVZFTlRfTUFTSywKKyAgICAgICAgICAgICAgICBLZXlMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKEtleUV2ZW50LktFWV9SRUxFQVNFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoS0VZX0VWRU5UX01BU0ssCisgICAgICAgICAgICAgICAgS2V5TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihNb3VzZUV2ZW50Lk1PVVNFX0NMSUNLRUQpLCBuZXcgRXZlbnREZXNjcmlwdG9yKE1PVVNFX0VWRU5UX01BU0ssCisgICAgICAgICAgICAgICAgTW91c2VMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKE1vdXNlRXZlbnQuTU9VU0VfUFJFU1NFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoTU9VU0VfRVZFTlRfTUFTSywKKyAgICAgICAgICAgICAgICBNb3VzZUxpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoTW91c2VFdmVudC5NT1VTRV9SRUxFQVNFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoTU9VU0VfRVZFTlRfTUFTSywKKyAgICAgICAgICAgICAgICBNb3VzZUxpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoTW91c2VFdmVudC5NT1VTRV9NT1ZFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgTU9VU0VfTU9USU9OX0VWRU5UX01BU0ssIE1vdXNlTW90aW9uTGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihNb3VzZUV2ZW50Lk1PVVNFX0VOVEVSRUQpLCBuZXcgRXZlbnREZXNjcmlwdG9yKE1PVVNFX0VWRU5UX01BU0ssCisgICAgICAgICAgICAgICAgTW91c2VMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKE1vdXNlRXZlbnQuTU9VU0VfRVhJVEVEKSwgbmV3IEV2ZW50RGVzY3JpcHRvcihNT1VTRV9FVkVOVF9NQVNLLAorICAgICAgICAgICAgICAgIE1vdXNlTGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihNb3VzZUV2ZW50Lk1PVVNFX0RSQUdHRUQpLCBuZXcgRXZlbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIE1PVVNFX01PVElPTl9FVkVOVF9NQVNLLCBNb3VzZU1vdGlvbkxpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoTW91c2VFdmVudC5NT1VTRV9XSEVFTCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgTU9VU0VfV0hFRUxfRVZFTlRfTUFTSywgTW91c2VXaGVlbExpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoQ29tcG9uZW50RXZlbnQuQ09NUE9ORU5UX01PVkVEKSwgbmV3IEV2ZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfRVZFTlRfTUFTSywgQ29tcG9uZW50TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihDb21wb25lbnRFdmVudC5DT01QT05FTlRfUkVTSVpFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX0VWRU5UX01BU0ssIENvbXBvbmVudExpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoQ29tcG9uZW50RXZlbnQuQ09NUE9ORU5UX1NIT1dOKSwgbmV3IEV2ZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfRVZFTlRfTUFTSywgQ29tcG9uZW50TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihDb21wb25lbnRFdmVudC5DT01QT05FTlRfSElEREVOKSwgbmV3IEV2ZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfRVZFTlRfTUFTSywgQ29tcG9uZW50TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihGb2N1c0V2ZW50LkZPQ1VTX0dBSU5FRCksIG5ldyBFdmVudERlc2NyaXB0b3IoRk9DVVNfRVZFTlRfTUFTSywKKyAgICAgICAgICAgICAgICBGb2N1c0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoRm9jdXNFdmVudC5GT0NVU19MT1NUKSwgbmV3IEV2ZW50RGVzY3JpcHRvcihGT0NVU19FVkVOVF9NQVNLLAorICAgICAgICAgICAgICAgIEZvY3VzTGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihQYWludEV2ZW50LlBBSU5UKSwgbmV3IEV2ZW50RGVzY3JpcHRvcihQQUlOVF9FVkVOVF9NQVNLLCBudWxsKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoUGFpbnRFdmVudC5VUERBVEUpLCBuZXcgRXZlbnREZXNjcmlwdG9yKFBBSU5UX0VWRU5UX01BU0ssIG51bGwpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfT1BFTkVEKSwgbmV3IEV2ZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBXSU5ET1dfRVZFTlRfTUFTSywgV2luZG93TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfQ0xPU0lORyksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgV0lORE9XX0VWRU5UX01BU0ssIFdpbmRvd0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoV2luZG93RXZlbnQuV0lORE9XX0NMT1NFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgV0lORE9XX0VWRU5UX01BU0ssIFdpbmRvd0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoV2luZG93RXZlbnQuV0lORE9XX0RFSUNPTklGSUVEKSwgbmV3IEV2ZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBXSU5ET1dfRVZFTlRfTUFTSywgV2luZG93TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfSUNPTklGSUVEKSwgbmV3IEV2ZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBXSU5ET1dfRVZFTlRfTUFTSywgV2luZG93TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfU1RBVEVfQ0hBTkdFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgV0lORE9XX1NUQVRFX0VWRU5UX01BU0ssIFdpbmRvd1N0YXRlTGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfTE9TVF9GT0NVUyksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgV0lORE9XX0ZPQ1VTX0VWRU5UX01BU0ssIFdpbmRvd0ZvY3VzTGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfR0FJTkVEX0ZPQ1VTKSwgbmV3IEV2ZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBXSU5ET1dfRk9DVVNfRVZFTlRfTUFTSywgV2luZG93Rm9jdXNMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKFdpbmRvd0V2ZW50LldJTkRPV19ERUFDVElWQVRFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgV0lORE9XX0VWRU5UX01BU0ssIFdpbmRvd0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoV2luZG93RXZlbnQuV0lORE9XX0FDVElWQVRFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgV0lORE9XX0VWRU5UX01BU0ssIFdpbmRvd0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoSGllcmFyY2h5RXZlbnQuSElFUkFSQ0hZX0NIQU5HRUQpLCBuZXcgRXZlbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9FVkVOVF9NQVNLLCBIaWVyYXJjaHlMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKEhpZXJhcmNoeUV2ZW50LkFOQ0VTVE9SX01PVkVEKSwgbmV3IEV2ZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBISUVSQVJDSFlfQk9VTkRTX0VWRU5UX01BU0ssIEhpZXJhcmNoeUJvdW5kc0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoSGllcmFyY2h5RXZlbnQuQU5DRVNUT1JfUkVTSVpFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgSElFUkFSQ0hZX0JPVU5EU19FVkVOVF9NQVNLLCBIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKENvbnRhaW5lckV2ZW50LkNPTVBPTkVOVF9BRERFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgQ09OVEFJTkVSX0VWRU5UX01BU0ssIENvbnRhaW5lckxpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoQ29udGFpbmVyRXZlbnQuQ09NUE9ORU5UX1JFTU9WRUQpLCBuZXcgRXZlbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIENPTlRBSU5FUl9FVkVOVF9NQVNLLCBDb250YWluZXJMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKElucHV0TWV0aG9kRXZlbnQuSU5QVVRfTUVUSE9EX1RFWFRfQ0hBTkdFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgSU5QVVRfTUVUSE9EX0VWRU5UX01BU0ssIElucHV0TWV0aG9kTGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihJbnB1dE1ldGhvZEV2ZW50LkNBUkVUX1BPU0lUSU9OX0NIQU5HRUQpLCBuZXcgRXZlbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIElOUFVUX01FVEhPRF9FVkVOVF9NQVNLLCBJbnB1dE1ldGhvZExpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoSW52b2NhdGlvbkV2ZW50LklOVk9DQVRJT05fREVGQVVMVCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgSU5WT0NBVElPTl9FVkVOVF9NQVNLLCBudWxsKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoSXRlbUV2ZW50LklURU1fU1RBVEVfQ0hBTkdFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgSVRFTV9FVkVOVF9NQVNLLCBJdGVtTGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihUZXh0RXZlbnQuVEVYVF9WQUxVRV9DSEFOR0VEKSwgbmV3IEV2ZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBURVhUX0VWRU5UX01BU0ssIFRleHRMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKEFjdGlvbkV2ZW50LkFDVElPTl9QRVJGT1JNRUQpLCBuZXcgRXZlbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIEFDVElPTl9FVkVOVF9NQVNLLCBBY3Rpb25MaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKEFkanVzdG1lbnRFdmVudC5BREpVU1RNRU5UX1ZBTFVFX0NIQU5HRUQpLCBuZXcgRXZlbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIEFESlVTVE1FTlRfRVZFTlRfTUFTSywgQWRqdXN0bWVudExpc3RlbmVyLmNsYXNzKSk7CiAgICAgICAgIGNvbnZlcnRlciA9IG5ldyBFdmVudENvbnZlcnRlcigpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBV1QgZXZlbnQgZnJvbSB0aGUgc3BlY2lmaWVkIEV2ZW50IG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIEV2ZW50IG9iamVjdC4KKyAgICAgKiBAcGFyYW0gZXZlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBFdmVudCBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIEFXVEV2ZW50KEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIHRoaXMoZXZlbnQudGFyZ2V0LCBldmVudC5pZCk7CkBAIC0yMTksOCArMjgyLDEwIEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEFXVCBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCB0eXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBPYmplY3QuCi0gICAgICogQHBhcmFtIGlkIHRoZSBldmVudCdzIHR5cGUuCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBPYmplY3QuCisgICAgICogQHBhcmFtIGlkCisgICAgICogICAgICAgICAgICB0aGUgZXZlbnQncyB0eXBlLgogICAgICAqLwogICAgIHB1YmxpYyBBV1RFdmVudChPYmplY3Qgc291cmNlLCBpbnQgaWQpIHsKICAgICAgICAgc3VwZXIoc291cmNlKTsKQEAgLTI0MCw3ICszMDUsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgYSBuZXcgc291cmNlIGZvciB0aGUgQVdURXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5ld1NvdXJjZSB0aGUgbmV3IHNvdXJjZSBPYmplY3QgZm9yIHRoZSBBV1RFdmVudC4KKyAgICAgKiBAcGFyYW0gbmV3U291cmNlCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHNvdXJjZSBPYmplY3QgZm9yIHRoZSBBV1RFdmVudC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoT2JqZWN0IG5ld1NvdXJjZSkgewogICAgICAgICBzb3VyY2UgPSBuZXdTb3VyY2U7CkBAIC0yNTMsMzMgKzMxOSwzMiBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIC8qIFRoZSBmb3JtYXQgaXMgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3IgCi0gICAgICAgICAqIHdoaWNoIGNhbiBiZSByZXZlYWxlZCBieSB0aGUgZm9sbG93aW5nIGNvZGU6Ci0gICAgICAgICAqIAotICAgICAgICAgKiBBV1RFdmVudCBldmVudCA9IG5ldyBBV1RFdmVudChuZXcgQ29tcG9uZW50KCl7fSwgMSl7fTsKLSAgICAgICAgICogU3lzdGVtLm91dC5wcmludGxuKGV2ZW50KTsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIGZvcm1hdCBpcyBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvciB3aGljaCBjYW4gYmUgcmV2ZWFsZWQgYnkKKyAgICAgICAgICogdGhlIGZvbGxvd2luZyBjb2RlOiBBV1RFdmVudCBldmVudCA9IG5ldyBBV1RFdmVudChuZXcgQ29tcG9uZW50KCl7fSwKKyAgICAgICAgICogMSl7fTsgU3lzdGVtLm91dC5wcmludGxuKGV2ZW50KTsKICAgICAgICAgICovCiAgICAgICAgIFN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCisKICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIENvbXBvbmVudCAmJiAoc291cmNlICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBDb21wb25lbnQgY29tcCA9IChDb21wb25lbnQpIGdldFNvdXJjZSgpOworICAgICAgICAgICAgQ29tcG9uZW50IGNvbXAgPSAoQ29tcG9uZW50KWdldFNvdXJjZSgpOwogICAgICAgICAgICAgbmFtZSA9IGNvbXAuZ2V0TmFtZSgpOwogICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHJldHVybiAoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiWyIgKyBwYXJhbVN0cmluZygpICsgIl0iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogICAgICAgICAgICAgICAgICsgIiBvbiAiICsgKG5hbWUubGVuZ3RoKCkgPiAwID8gbmFtZSA6IHNvdXJjZSkpOyAvLyROT04tTkxTLTEkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgQVdURXZlbnQgc3RhdGUuIAotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBBV1RFdmVudCBzdGF0ZS4KKyAgICAgKiAKICAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBBV1RFdmVudCBzdGF0ZS4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHBhcmFtU3RyaW5nKCkgewotICAgICAgICAvL25vdGhpbmcgdG8gaW1wbGVtZW50OiBhbGwgZXZlbnQgdHlwZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZAorICAgICAgICAvLyBub3RoaW5nIHRvIGltcGxlbWVudDogYWxsIGV2ZW50IHR5cGVzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QKICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCiAgICAgfQogCkBAIC0yOTYsNzMgKzM2MSw3NyBAQAogICAgICAqIENvbnN1bWVzIHRoZSBBV1RFdmVudC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lKCkgewotICAgICAgIGNvbnN1bWVkID0gdHJ1ZTsKKyAgICAgICAgY29uc3VtZWQgPSB0cnVlOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENvbnZlcnQgQVdURXZlbnQgb2JqZWN0IHRvIGEgY29ycmVzcG9uZGluZyAoZGVwcmVjYXRlZCkgRXZlbnQgb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gbmV3IEV2ZW50IG9iamVjdCB3aGljaCBpcyBhIGNvbnZlcnRlZCBBV1RFdmVudCBvYmplY3Qgb3IgbnVsbAotICAgICAqIGlmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCBwb3NzaWJsZQorICAgICAqIEByZXR1cm4gbmV3IEV2ZW50IG9iamVjdCB3aGljaCBpcyBhIGNvbnZlcnRlZCBBV1RFdmVudCBvYmplY3Qgb3IgbnVsbCBpZgorICAgICAqICAgICAgICAgdGhlIGNvbnZlcnNpb24gaXMgbm90IHBvc3NpYmxlCiAgICAgICovCiAgICAgRXZlbnQgZ2V0RXZlbnQoKSB7Ci0gICAgICAgIAorCiAgICAgICAgIGlmIChpZCA9PSBBY3Rpb25FdmVudC5BQ1RJT05fUEVSRk9STUVEKSB7Ci0gICAgICAgICAgICBBY3Rpb25FdmVudCBhZSA9IChBY3Rpb25FdmVudCkgdGhpczsKKyAgICAgICAgICAgIEFjdGlvbkV2ZW50IGFlID0gKEFjdGlvbkV2ZW50KXRoaXM7CiAgICAgICAgICAgICByZXR1cm4gY29udmVydGVyLmNvbnZlcnRBY3Rpb25FdmVudChhZSk7CiAKICAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBBZGp1c3RtZW50RXZlbnQuQURKVVNUTUVOVF9WQUxVRV9DSEFOR0VEKSB7Ci0gICAgICAgICAgICBBZGp1c3RtZW50RXZlbnQgYWUgPSAoQWRqdXN0bWVudEV2ZW50KSB0aGlzOworICAgICAgICAgICAgQWRqdXN0bWVudEV2ZW50IGFlID0gKEFkanVzdG1lbnRFdmVudCl0aGlzOwogICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0QWRqdXN0bWVudEV2ZW50KGFlKTsKIAotLy8/Pz9BV1QKLS8vICAgICAgICB9IGVsc2UgaWYgKGlkID09IENvbXBvbmVudEV2ZW50LkNPTVBPTkVOVF9NT1ZFRAotLy8gICAgICAgICAgICAgICAgJiYgc291cmNlIGluc3RhbmNlb2YgV2luZG93KSB7Ci0vLyAgICAgICAgICAgIC8vdGhlIG9ubHkgdHlwZSBvZiBDb21wb25lbnQgZXZlbnRzIGlzIENPTVBPTkVOVF9NT1ZFRCBvbiB3aW5kb3cKLS8vICAgICAgICAgICAgQ29tcG9uZW50RXZlbnQgY2UgPSAoQ29tcG9uZW50RXZlbnQpIHRoaXM7Ci0vLyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXIuY29udmVydENvbXBvbmVudEV2ZW50KGNlKTsKKyAgICAgICAgICAgIC8vID8/P0FXVAorICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChpZCA9PSBDb21wb25lbnRFdmVudC5DT01QT05FTlRfTU9WRUQKKyAgICAgICAgICAgIC8vICYmIHNvdXJjZSBpbnN0YW5jZW9mIFdpbmRvdykgeworICAgICAgICAgICAgLy8gLy90aGUgb25seSB0eXBlIG9mIENvbXBvbmVudCBldmVudHMgaXMgQ09NUE9ORU5UX01PVkVEIG9uIHdpbmRvdworICAgICAgICAgICAgLy8gQ29tcG9uZW50RXZlbnQgY2UgPSAoQ29tcG9uZW50RXZlbnQpIHRoaXM7CisgICAgICAgICAgICAvLyByZXR1cm4gY29udmVydGVyLmNvbnZlcnRDb21wb25lbnRFdmVudChjZSk7CiAKICAgICAgICAgfSBlbHNlIGlmIChpZCA+PSBGb2N1c0V2ZW50LkZPQ1VTX0ZJUlNUICYmIGlkIDw9IEZvY3VzRXZlbnQuRk9DVVNfTEFTVCkgewotICAgICAgICAgICAgLy9ub3RoaW5nIHRvIGNvbnZlcnQKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gY29udmVydAogCi0vLz8/P0FXVAotLy8gICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gSXRlbUV2ZW50LklURU1fU1RBVEVfQ0hBTkdFRCkgewotLy8gICAgICAgICAgICBJdGVtRXZlbnQgaWUgPSAoSXRlbUV2ZW50KSB0aGlzOwotLy8gICAgICAgICAgICByZXR1cm4gY29udmVydGVyLmNvbnZlcnRJdGVtRXZlbnQoaWUpOworICAgICAgICAgICAgLy8gPz8/QVdUCisgICAgICAgICAgICAvLyB9IGVsc2UgaWYgKGlkID09IEl0ZW1FdmVudC5JVEVNX1NUQVRFX0NIQU5HRUQpIHsKKyAgICAgICAgICAgIC8vIEl0ZW1FdmVudCBpZSA9IChJdGVtRXZlbnQpIHRoaXM7CisgICAgICAgICAgICAvLyByZXR1cm4gY29udmVydGVyLmNvbnZlcnRJdGVtRXZlbnQoaWUpOwogCiAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gS2V5RXZlbnQuS0VZX1BSRVNTRUQgfHwgaWQgPT0gS2V5RXZlbnQuS0VZX1JFTEVBU0VEKSB7Ci0gICAgICAgICAgICBLZXlFdmVudCBrZSA9IChLZXlFdmVudCkgdGhpczsKKyAgICAgICAgICAgIEtleUV2ZW50IGtlID0gKEtleUV2ZW50KXRoaXM7CiAgICAgICAgICAgICByZXR1cm4gY29udmVydGVyLmNvbnZlcnRLZXlFdmVudChrZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoaWQgPj0gTW91c2VFdmVudC5NT1VTRV9GSVJTVCAmJiBpZCA8PSBNb3VzZUV2ZW50Lk1PVVNFX0xBU1QpIHsKLSAgICAgICAgICAgIE1vdXNlRXZlbnQgbWUgPSAoTW91c2VFdmVudCkgdGhpczsKKyAgICAgICAgICAgIE1vdXNlRXZlbnQgbWUgPSAoTW91c2VFdmVudCl0aGlzOwogICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0TW91c2VFdmVudChtZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gV2luZG93RXZlbnQuV0lORE9XX0NMT1NJTkcKLSAgICAgICAgICAgICAgICB8fCBpZCA9PSBXaW5kb3dFdmVudC5XSU5ET1dfSUNPTklGSUVECisgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gV2luZG93RXZlbnQuV0lORE9XX0NMT1NJTkcgfHwgaWQgPT0gV2luZG93RXZlbnQuV0lORE9XX0lDT05JRklFRAogICAgICAgICAgICAgICAgIHx8IGlkID09IFdpbmRvd0V2ZW50LldJTkRPV19ERUlDT05JRklFRCkgewotICAgICAgICAgICAgLy9ub3RoaW5nIHRvIGNvbnZlcnQKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gY29udmVydAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5ldyBFdmVudChzb3VyY2UsIGlkLCBudWxsKTsKICAgICB9CiAKLQogICAgIC8qKgotICAgICAqIFRoZSBDbGFzcyBFdmVudERlc2NyaXB0b3IuCisgICAgICogVGhlIGNsYXNzIEV2ZW50RGVzY3JpcHRvci4KICAgICAgKi8KICAgICBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnREZXNjcmlwdG9yIHsKIAotICAgICAgICAvKiogVGhlIGV2ZW50IG1hc2suICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZXZlbnQgbWFzay4KKyAgICAgICAgICovCiAgICAgICAgIGZpbmFsIGxvbmcgZXZlbnRNYXNrOwogCi0gICAgICAgIC8qKiBUaGUgbGlzdGVuZXIgdHlwZS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBsaXN0ZW5lciB0eXBlLgorICAgICAgICAgKi8KICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyVHlwZTsKIAogICAgICAgICAvKioKICAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGV2ZW50IGRlc2NyaXB0b3IuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gZXZlbnRNYXNrIHRoZSBldmVudCBtYXNrCi0gICAgICAgICAqIEBwYXJhbSBsaXN0ZW5lclR5cGUgdGhlIGxpc3RlbmVyIHR5cGUKKyAgICAgICAgICogQHBhcmFtIGV2ZW50TWFzaworICAgICAgICAgKiAgICAgICAgICAgIHRoZSBldmVudCBtYXNrLgorICAgICAgICAgKiBAcGFyYW0gbGlzdGVuZXJUeXBlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHR5cGUuCiAgICAgICAgICAqLwogICAgICAgICBFdmVudERlc2NyaXB0b3IobG9uZyBldmVudE1hc2ssIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBsaXN0ZW5lclR5cGUpIHsKICAgICAgICAgICAgIHRoaXMuZXZlbnRNYXNrID0gZXZlbnRNYXNrOwpAQCAtMzcwLDI0ICs0MzksMjggQEAKICAgICAgICAgfQogCiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIEV2ZW50VHlwZUxvb2t1cC4KKyAgICAgKiBUaGUgY2xhc3MgRXZlbnRUeXBlTG9va3VwLgogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudFR5cGVMb29rdXAgewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBsYXN0IGV2ZW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbGFzdCBldmVudC4KKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgQVdURXZlbnQgbGFzdEV2ZW50ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgbGFzdCBldmVudCBkZXNjcmlwdG9yLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbGFzdCBldmVudCBkZXNjcmlwdG9yLgorICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBFdmVudERlc2NyaXB0b3IgbGFzdEV2ZW50RGVzY3JpcHRvciA9IG51bGw7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldHMgdGhlIGV2ZW50IGRlc2NyaXB0b3IuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBldmVudCBkZXNjcmlwdG9yCisgICAgICAgICAqIEBwYXJhbSBldmVudAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBldmVudC4KKyAgICAgICAgICogQHJldHVybiB0aGUgZXZlbnQgZGVzY3JpcHRvci4KICAgICAgICAgICovCiAgICAgICAgIEV2ZW50RGVzY3JpcHRvciBnZXRFdmVudERlc2NyaXB0b3IoQVdURXZlbnQgZXZlbnQpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewpAQCAtNDAzLDkgKzQ3Niw5IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZXRzIHRoZSBldmVudCBtYXNrLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudAotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgZXZlbnQgbWFzaworICAgICAgICAgKiBAcGFyYW0gZXZlbnQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZXZlbnQuCisgICAgICAgICAqIEByZXR1cm4gdGhlIGV2ZW50IG1hc2suCiAgICAgICAgICAqLwogICAgICAgICBsb25nIGdldEV2ZW50TWFzayhBV1RFdmVudCBldmVudCkgewogICAgICAgICAgICAgZmluYWwgRXZlbnREZXNjcmlwdG9yIGVkID0gZ2V0RXZlbnREZXNjcmlwdG9yKGV2ZW50KTsKQEAgLTQxNCw2NSArNDg3LDYyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIEV2ZW50Q29udmVydGVyLgorICAgICAqIFRoZSBjbGFzcyBFdmVudENvbnZlcnRlci4KICAgICAgKi8KICAgICBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRDb252ZXJ0ZXIgewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBDb25zdGFudCBPTERfTU9EX01BU0suICovCi0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgT0xEX01PRF9NQVNLID0gRXZlbnQuQUxUX01BU0sgfCBFdmVudC5DVFJMX01BU0sKLSAgICAgICAgfCBFdmVudC5NRVRBX01BU0sgfCBFdmVudC5TSElGVF9NQVNLOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29uc3RhbnQgT0xEX01PRF9NQVNLLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBPTERfTU9EX01BU0sgPSBFdmVudC5BTFRfTUFTSyB8IEV2ZW50LkNUUkxfTUFTSyB8IEV2ZW50Lk1FVEFfTUFTSworICAgICAgICAgICAgICAgIHwgRXZlbnQuU0hJRlRfTUFTSzsKIAogICAgICAgICAvKioKICAgICAgICAgICogQ29udmVydCBhY3Rpb24gZXZlbnQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gYWUgdGhlIGFlCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBldmVudAorICAgICAgICAgKiBAcGFyYW0gYWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgYWUuCisgICAgICAgICAqIEByZXR1cm4gdGhlIGV2ZW50LgogICAgICAgICAgKi8KICAgICAgICAgRXZlbnQgY29udmVydEFjdGlvbkV2ZW50KEFjdGlvbkV2ZW50IGFlKSB7CiAgICAgICAgICAgICBFdmVudCBldnQgPSBuZXcgRXZlbnQoYWUuZ2V0U291cmNlKCksIGFlLmdldElEKCksIGFlLmdldEFjdGlvbkNvbW1hbmQoKSk7CiAgICAgICAgICAgICBldnQud2hlbiA9IGFlLmdldFdoZW4oKTsKICAgICAgICAgICAgIGV2dC5tb2RpZmllcnMgPSBhZS5nZXRNb2RpZmllcnMoKSAmIE9MRF9NT0RfTUFTSzsKIAotICAgICAgICAgICAvKiBpZiAoc291cmNlIGluc3RhbmNlb2YgQnV0dG9uKSB7Ci0gICAgICAgICAgICAgICAgYXJnID0gKChCdXR0b24pIHNvdXJjZSkuZ2V0TGFiZWwoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgQ2hlY2tib3gpIHsKLSAgICAgICAgICAgICAgICBhcmcgPSBuZXcgQm9vbGVhbigoKENoZWNrYm94KSBzb3VyY2UpLmdldFN0YXRlKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBDaGVja2JveE1lbnVJdGVtKSB7Ci0gICAgICAgICAgICAgICAgYXJnID0gKChDaGVja2JveE1lbnVJdGVtKSBzb3VyY2UpLmdldExhYmVsKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIENob2ljZSkgewotICAgICAgICAgICAgICAgIGFyZyA9ICgoQ2hvaWNlKSBzb3VyY2UpLmdldFNlbGVjdGVkSXRlbSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYXJnID0gKChMaXN0KSBzb3VyY2UpLmdldFNlbGVjdGVkSXRlbSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBNZW51SXRlbSkgewotICAgICAgICAgICAgICAgIGFyZyA9ICgoTWVudUl0ZW0pIHNvdXJjZSkuZ2V0TGFiZWwoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgVGV4dEZpZWxkKSB7Ci0gICAgICAgICAgICAgICAgYXJnID0gKChUZXh0RmllbGQpIHNvdXJjZSkuZ2V0VGV4dCgpOwotICAgICAgICAgICAgfQotKi8KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBpZiAoc291cmNlIGluc3RhbmNlb2YgQnV0dG9uKSB7IGFyZyA9ICgoQnV0dG9uKQorICAgICAgICAgICAgICogc291cmNlKS5nZXRMYWJlbCgpOyB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIENoZWNrYm94KSB7IGFyZworICAgICAgICAgICAgICogPSBuZXcgQm9vbGVhbigoKENoZWNrYm94KSBzb3VyY2UpLmdldFN0YXRlKCkpOyB9IGVsc2UgaWYgKHNvdXJjZQorICAgICAgICAgICAgICogaW5zdGFuY2VvZiBDaGVja2JveE1lbnVJdGVtKSB7IGFyZyA9ICgoQ2hlY2tib3hNZW51SXRlbSkKKyAgICAgICAgICAgICAqIHNvdXJjZSkuZ2V0TGFiZWwoKTsgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBDaG9pY2UpIHsgYXJnID0KKyAgICAgICAgICAgICAqICgoQ2hvaWNlKSBzb3VyY2UpLmdldFNlbGVjdGVkSXRlbSgpOyB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mCisgICAgICAgICAgICAgKiBMaXN0KSB7IGFyZyA9ICgoTGlzdCkgc291cmNlKS5nZXRTZWxlY3RlZEl0ZW0oKTsgfSBlbHNlIGlmCisgICAgICAgICAgICAgKiAoc291cmNlIGluc3RhbmNlb2YgTWVudUl0ZW0pIHsgYXJnID0gKChNZW51SXRlbSkKKyAgICAgICAgICAgICAqIHNvdXJjZSkuZ2V0TGFiZWwoKTsgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBUZXh0RmllbGQpIHsgYXJnCisgICAgICAgICAgICAgKiA9ICgoVGV4dEZpZWxkKSBzb3VyY2UpLmdldFRleHQoKTsgfQorICAgICAgICAgICAgICovCiAgICAgICAgICAgICByZXR1cm4gZXZ0OwogICAgICAgICB9CiAKLQogICAgICAgICAvKioKICAgICAgICAgICogQ29udmVydCBhZGp1c3RtZW50IGV2ZW50LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGFlIHRoZSBhZQotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgZXZlbnQKKyAgICAgICAgICogQHBhcmFtIGFlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGFlLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBldmVudC4KICAgICAgICAgICovCiAgICAgICAgIEV2ZW50IGNvbnZlcnRBZGp1c3RtZW50RXZlbnQoQWRqdXN0bWVudEV2ZW50IGFlKSB7Ci0gICAgICAgICAgICAvL1RPRE86IEV2ZW50LlNDUk9MTF9CRUdJTi9TQ1JPTExfRU5ECi0gICAgICAgICAgICByZXR1cm4gbmV3IEV2ZW50KGFlLnNvdXJjZSwgYWUuaWQgKyBhZS5nZXRBZGp1c3RtZW50VHlwZSgpIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoYWUuZ2V0VmFsdWUoKSkpOworICAgICAgICAgICAgLy8gVE9ETzogRXZlbnQuU0NST0xMX0JFR0lOL1NDUk9MTF9FTkQKKyAgICAgICAgICAgIHJldHVybiBuZXcgRXZlbnQoYWUuc291cmNlLCBhZS5pZCArIGFlLmdldEFkanVzdG1lbnRUeXBlKCkgLSAxLCBuZXcgSW50ZWdlcihhZQorICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKSkpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENvbnZlcnQgY29tcG9uZW50IGV2ZW50LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGNlIHRoZSBjZQotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgZXZlbnQKKyAgICAgICAgICogQHBhcmFtIGNlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGNlLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBldmVudC4KICAgICAgICAgICovCiAgICAgICAgIEV2ZW50IGNvbnZlcnRDb21wb25lbnRFdmVudChDb21wb25lbnRFdmVudCBjZSkgewogICAgICAgICAgICAgQ29tcG9uZW50IGNvbXAgPSBjZS5nZXRDb21wb25lbnQoKTsKQEAgLTQ4MiwzNSArNTUyLDI3IEBACiAgICAgICAgICAgICByZXR1cm4gZXZ0OwogICAgICAgICB9CiAKLSAgICAgICAgLy8/Pz9BV1QKKyAgICAgICAgLy8gPz8/QVdUCiAgICAgICAgIC8qCi0gICAgICAgIEV2ZW50IGNvbnZlcnRJdGVtRXZlbnQoSXRlbUV2ZW50IGllKSB7Ci0gICAgICAgICAgICBpbnQgb2xkSWQgPSBpZS5pZCArIGllLmdldFN0YXRlQ2hhbmdlKCkgLSAxOwotICAgICAgICAgICAgT2JqZWN0IHNvdXJjZSA9IGllLnNvdXJjZTsKLSAgICAgICAgICAgIGludCBpZHggPSAtMTsKLSAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgTGlzdCBsaXN0ID0gKExpc3QpIHNvdXJjZTsKLSAgICAgICAgICAgICAgICBpZHggPSBsaXN0LmdldFNlbGVjdGVkSW5kZXgoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIENob2ljZSkgewotICAgICAgICAgICAgICAgIENob2ljZSBjaG9pY2UgPSAoQ2hvaWNlKSBzb3VyY2U7Ci0gICAgICAgICAgICAgICAgaWR4ID0gY2hvaWNlLmdldFNlbGVjdGVkSW5kZXgoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9iamVjdCBhcmcgPSBpZHggPj0gMCA/IG5ldyBJbnRlZ2VyKGlkeCkgOiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBFdmVudChzb3VyY2UsIG9sZElkLCBhcmcpOwotICAgICAgICB9Ci0gICAgICAgICovCi0gICAgICAgIAorICAgICAgICAgKiBFdmVudCBjb252ZXJ0SXRlbUV2ZW50KEl0ZW1FdmVudCBpZSkgeyBpbnQgb2xkSWQgPSBpZS5pZCArCisgICAgICAgICAqIGllLmdldFN0YXRlQ2hhbmdlKCkgLSAxOyBPYmplY3Qgc291cmNlID0gaWUuc291cmNlOyBpbnQgaWR4ID0gLTE7IGlmCisgICAgICAgICAqIChzb3VyY2UgaW5zdGFuY2VvZiBMaXN0KSB7IExpc3QgbGlzdCA9IChMaXN0KSBzb3VyY2U7IGlkeCA9CisgICAgICAgICAqIGxpc3QuZ2V0U2VsZWN0ZWRJbmRleCgpOyB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIENob2ljZSkgeworICAgICAgICAgKiBDaG9pY2UgY2hvaWNlID0gKENob2ljZSkgc291cmNlOyBpZHggPSBjaG9pY2UuZ2V0U2VsZWN0ZWRJbmRleCgpOyB9CisgICAgICAgICAqIE9iamVjdCBhcmcgPSBpZHggPj0gMCA/IG5ldyBJbnRlZ2VyKGlkeCkgOiBudWxsOyByZXR1cm4gbmV3CisgICAgICAgICAqIEV2ZW50KHNvdXJjZSwgb2xkSWQsIGFyZyk7IH0KKyAgICAgICAgICovCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIENvbnZlcnQga2V5IGV2ZW50LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGtlIHRoZSBrZQotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgZXZlbnQKKyAgICAgICAgICogQHBhcmFtIGtlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGtlLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBldmVudC4KICAgICAgICAgICovCiAgICAgICAgIEV2ZW50IGNvbnZlcnRLZXlFdmVudChLZXlFdmVudCBrZSkgewogICAgICAgICAgICAgaW50IG9sZElkID0ga2UuaWQ7Ci0gICAgICAgICAgICAvL2xlYXZlIG9ubHkgb2xkIEV2ZW50J3MgbW9kaWZpZXJzCisgICAgICAgICAgICAvLyBsZWF2ZSBvbmx5IG9sZCBFdmVudCdzIG1vZGlmaWVycwogCiAgICAgICAgICAgICBpbnQgbW9kID0ga2UuZ2V0TW9kaWZpZXJzKCkgJiBPTERfTU9EX01BU0s7CiAgICAgICAgICAgICBDb21wb25lbnQgY29tcCA9IGtlLmdldENvbXBvbmVudCgpOwpAQCAtNTE4LDcgKzU4MCw3IEBACiAgICAgICAgICAgICBpbnQga2V5Q29kZSA9IGtlLmdldEtleUNvZGUoKTsKICAgICAgICAgICAgIGludCBrZXkgPSBjb252ZXJ0S2V5KGtleUNoYXIsIGtleUNvZGUpOwogICAgICAgICAgICAgaWYgKGtleSA+PSBFdmVudC5IT01FICYmIGtleSA8PSBFdmVudC5JTlNFUlQpIHsKLSAgICAgICAgICAgICAgICBvbGRJZCArPSAyOyAvL25vbi1BU0NJSSBrZXkgLT4gYWN0aW9uIGtleQorICAgICAgICAgICAgICAgIG9sZElkICs9IDI7IC8vIG5vbi1BU0NJSSBrZXkgLT4gYWN0aW9uIGtleQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG5ldyBFdmVudChjb21wLCBrZS5nZXRXaGVuKCksIG9sZElkLCAwLCAwLCBrZXksIG1vZCk7CiAgICAgICAgIH0KQEAgLTUyNiw5ICs1ODgsOSBAQAogICAgICAgICAvKioKICAgICAgICAgICogQ29udmVydCBtb3VzZSBldmVudC4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBtZSB0aGUgbWUKLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGV2ZW50CisgICAgICAgICAqIEBwYXJhbSBtZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBtZS4KKyAgICAgICAgICogQHJldHVybiB0aGUgZXZlbnQuCiAgICAgICAgICAqLwogICAgICAgICBFdmVudCBjb252ZXJ0TW91c2VFdmVudChNb3VzZUV2ZW50IG1lKSB7CiAgICAgICAgICAgICBpbnQgaWQgPSBtZS5pZDsKQEAgLTUzNyw3ICs1OTksNyBAQAogICAgICAgICAgICAgICAgIGV2dC54ID0gbWUuZ2V0WCgpOwogICAgICAgICAgICAgICAgIGV2dC55ID0gbWUuZ2V0WSgpOwogICAgICAgICAgICAgICAgIGludCBtb2QgPSBtZS5nZXRNb2RpZmllcnMoKTsKLSAgICAgICAgICAgICAgICAvL2luIEV2ZW50IG1vZGlmaWVycyBtZWFuIGJ1dHRvbiBudW1iZXIgZm9yIG1vdXNlIGV2ZW50czoKKyAgICAgICAgICAgICAgICAvLyBpbiBFdmVudCBtb2RpZmllcnMgbWVhbiBidXR0b24gbnVtYmVyIGZvciBtb3VzZSBldmVudHM6CiAgICAgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyA9IG1vZCAmIChFdmVudC5BTFRfTUFTSyB8IEV2ZW50Lk1FVEFfTUFTSyk7CiAgICAgICAgICAgICAgICAgaWYgKGlkID09IE1vdXNlRXZlbnQuTU9VU0VfUFJFU1NFRCkgewogICAgICAgICAgICAgICAgICAgICBldnQuY2xpY2tDb3VudCA9IG1lLmdldENsaWNrQ291bnQoKTsKQEAgLTU0Niw2OCArNjA4LDY5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvKioKICAgICAgICAgICogQ29udmVydCBrZXkuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0ga2V5Q2hhciB0aGUga2V5IGNoYXIKLSAgICAgICAgICogQHBhcmFtIGtleUNvZGUgdGhlIGtleSBjb2RlCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBpbnQKKyAgICAgICAgICogQHBhcmFtIGtleUNoYXIKKyAgICAgICAgICogICAgICAgICAgICB0aGUga2V5IGNoYXIuCisgICAgICAgICAqIEBwYXJhbSBrZXlDb2RlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGtleSBjb2RlLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICAgICAqLwogICAgICAgICBpbnQgY29udmVydEtleShjaGFyIGtleUNoYXIsIGludCBrZXlDb2RlKSB7CiAgICAgICAgICAgICBpbnQga2V5OwotICAgICAgICAgICAgLy9GMSAtIEYxMgorICAgICAgICAgICAgLy8gRjEgLSBGMTIKICAgICAgICAgICAgIGlmIChrZXlDb2RlID49IEtleUV2ZW50LlZLX0YxICYmIGtleUNvZGUgPD0gS2V5RXZlbnQuVktfRjEyKSB7CiAgICAgICAgICAgICAgICAga2V5ID0gRXZlbnQuRjEgKyBrZXlDb2RlIC0gS2V5RXZlbnQuVktfRjE7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgewotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vbm9uLWFjdGlvbiBrZXkKLSAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5Q2hhcjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgLy9hY3Rpb24ga2V5czoKLSAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LlZLX0hPTUU6Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LkhPTUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfRU5EOgotICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5FTkQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfUEFHRV9VUDoKLSAgICAgICAgICAgICAgICAgICAga2V5ID0gRXZlbnQuUEdVUDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5WS19QQUdFX0RPV046Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LlBHRE47Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfVVA6Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LlVQOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LlZLX0RPV046Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LkRPV047Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfTEVGVDoKLSAgICAgICAgICAgICAgICAgICAga2V5ID0gRXZlbnQuTEVGVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5WS19SSUdIVDoKLSAgICAgICAgICAgICAgICAgICAga2V5ID0gRXZlbnQuUklHSFQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfUFJJTlRTQ1JFRU46Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LlBSSU5UX1NDUkVFTjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5WS19TQ1JPTExfTE9DSzoKLSAgICAgICAgICAgICAgICAgICAga2V5ID0gRXZlbnQuU0NST0xMX0xPQ0s7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfQ0FQU19MT0NLOgotICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5DQVBTX0xPQ0s7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfTlVNX0xPQ0s6Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50Lk5VTV9MT0NLOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LlZLX1BBVVNFOgotICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5QQVVTRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5WS19JTlNFUlQ6Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LklOU0VSVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIG5vbi1hY3Rpb24ga2V5CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlDaGFyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vIGFjdGlvbiBrZXlzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LlZLX0hPTUU6CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5IT01FOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfRU5EOgorICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gRXZlbnQuRU5EOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfUEFHRV9VUDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LlBHVVA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5WS19QQUdFX0RPV046CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5QR0ROOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfVVA6CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5VUDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LlZLX0RPV046CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5ET1dOOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfTEVGVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LkxFRlQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5WS19SSUdIVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LlJJR0hUOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfUFJJTlRTQ1JFRU46CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5QUklOVF9TQ1JFRU47CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5WS19TQ1JPTExfTE9DSzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LlNDUk9MTF9MT0NLOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfQ0FQU19MT0NLOgorICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gRXZlbnQuQ0FQU19MT0NLOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfTlVNX0xPQ0s6CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5OVU1fTE9DSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LlZLX1BBVVNFOgorICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gRXZlbnQuUEFVU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5WS19JTlNFUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5JTlNFUlQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4ga2V5OwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0FXVEV4Y2VwdGlvbi5qYXZhIGIvYXd0L2phdmEvYXd0L0FXVEV4Y2VwdGlvbi5qYXZhCmluZGV4IDcwY2U2ZTEuLjY1OTBiNzMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9BV1RFeGNlcHRpb24uamF2YQorKysgYi9hd3QvamF2YS9hd3QvQVdURXhjZXB0aW9uLmphdmEKQEAgLTE4LDI2ICsxOCwzMCBAQAogICogQGF1dGhvciBNaWNoYWVsIERhbmlsb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCi0KIC8qKgotICogVGhlIEFXVEV4Y2VwdGlvbiBjbGFzcyBpcyB1c2VkIHRvIHByb3ZpZGUgbm90aWZpY2F0aW9uIGFuZCBpbmZvcm1hdGlvbgotICogYWJvdXQgQVdUIGVycm9ycy4KKyAqIFRoZSBBV1RFeGNlcHRpb24gY2xhc3MgaXMgdXNlZCB0byBwcm92aWRlIG5vdGlmaWNhdGlvbiBhbmQgaW5mb3JtYXRpb24gYWJvdXQKKyAqIEFXVCBlcnJvcnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQVdURXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTkwMDQxNDIzMTE1MTMyMzg3OUw7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQVdUIGV4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbXNnIHRoZSBzcGVjaWZpYyBtZXNzYWdlIGZvciBjdXJyZW50IGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWMgbWVzc2FnZSBmb3IgY3VycmVudCBleGNlcHRpb24uCiAgICAgICovCiAgICAgcHVibGljIEFXVEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9BV1RLZXlTdHJva2UuamF2YSBiL2F3dC9qYXZhL2F3dC9BV1RLZXlTdHJva2UuamF2YQppbmRleCA1ZTdkZTRlLi5mMDFmNmYwIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvQVdUS2V5U3Ryb2tlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0FXVEtleVN0cm9rZS5qYXZhCkBAIC0xOCw3ICsxOCw5IEBACiAgKiBAYXV0aG9yIERtaXRyeSBBLiBEdXJuZXYKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OworCiBpbXBvcnQgamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudDsKIGltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudDsKIGltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbjsKQEAgLTM2LDcgKzM4LDcgQEAKICAqIFRoZSBBV1RLZXlTdHJva2UgaG9sZHMgYWxsIG9mIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvbXBsZXRlIGFjdCBvZiAKICAqIHR5cGluZyBhIGNoYXJhY3Rlci4gVGhpcyBpbmNsdWRlcyB0aGUgZXZlbnRzIHRoYXQgYXJlIGdlbmVyYXRlZCB3aGVuIAogICogdGhlIGtleSBpcyBwcmVzc2VkLCByZWxlYXNlZCwgb3IgdHlwZWQgKHByZXNzZWQgYW5kIHJlbGVhc2VkIGdlbmVyYXRpbmcKLSAqIGEgdW5pY29kZSBjaGFyYWN0ZXIgcmVzdWx0KSB3aGljaCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudAorICogYSBVbmljb2RlIGNoYXJhY3RlciByZXN1bHQpIHdoaWNoIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50CiAgKiBvYmplY3RzIEtleUV2ZW50LktFWV9QUkVTU0VELCBLZXlFdmVudC5LRVlfUkVMRUFTRUQsIG9yIEtleUV2ZW50LktFWV9UWVBFRC4KICAqIEl0IGFsc28gaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggbW9kaWZpZXJzIChzdWNoIGFzIGNvbnRyb2wgb3IgCiAgKiBzaGlmdCkgd2VyZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGtleXN0cm9rZS4gVGhlIGZvbGxvd2luZyBtYXNrcyAKQEAgLTU3LDE5ICs1OSw0MSBAQAogICogIFRoZSBBV1RLZXlTdHJva2UgaXMgdW5pcXVlLCBhbmQgYXBwbGljYXRpb25zIHNob3VsZCBub3QgY3JlYXRlIHRoZWlyIG93biAKICAqICBpbnN0YW5jZXMgb2YgQVdUS2V5U3Ryb2tlLiBBbGwgYXBwbGljYXRpb25zIHNob3VsZCB1c2UgZ2V0QVdUS2V5U3Ryb2tlIAogICogIG1ldGhvZHMgZm9yIG9idGFpbmluZyBpbnN0YW5jZXMgb2YgQVdUS2V5U3Ryb2tlLgorICogIAorICogIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQVdUS2V5U3Ryb2tlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjQzMDUzOTY5MTE1NTE2MTg3MUw7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGNhY2hlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxBV1RLZXlTdHJva2UsIEFXVEtleVN0cm9rZT4gY2FjaGUgPSBuZXcgSGFzaE1hcDxBV1RLZXlTdHJva2UsIEFXVEtleVN0cm9rZT4oKTsgLy9NYXA8QVdUS2V5U3Ryb2tlLCA/IGV4dGVuZHMgQVdUS2V5U3Ryb2tlPgotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQga2V5RXZlbnRUeXBlc01hcC4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgU3RyaW5nPiBrZXlFdmVudFR5cGVzTWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOyAvL01hcDxpbnQsIFN0cmluZz4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgY2FjaGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEFXVEtleVN0cm9rZSwgQVdUS2V5U3Ryb2tlPiBjYWNoZSA9IG5ldyBIYXNoTWFwPEFXVEtleVN0cm9rZSwgQVdUS2V5U3Ryb2tlPigpOyAvLyBNYXAKIAotICAgIHByaXZhdGUgc3RhdGljIENvbnN0cnVjdG9yPD8+IHN1YkNvbnN0cnVjdG9yOyAgIAorICAgIC8vIDwKKyAgICAvLyBBV1RLZXlTdHJva2UKKyAgICAvLyAsCisgICAgLy8gPworICAgIC8vIGV4dGVuZHMKKyAgICAvLyBBV1RLZXlTdHJva2UKKyAgICAvLyA+CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQga2V5RXZlbnRUeXBlc01hcC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgU3RyaW5nPiBrZXlFdmVudFR5cGVzTWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOyAvLyBNYXAKKworICAgIC8vIDwKKyAgICAvLyBpbnQKKyAgICAvLyAsCisgICAgLy8gU3RyaW5nCisgICAgLy8gPgorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29uc3RydWN0b3I8Pz4gc3ViQ29uc3RydWN0b3I7CiAKICAgICBzdGF0aWMgewogICAgICAgICBrZXlFdmVudFR5cGVzTWFwLnB1dChuZXcgSW50ZWdlcihLZXlFdmVudC5LRVlfUFJFU1NFRCksICJwcmVzc2VkIik7IC8vJE5PTi1OTFMtMSQKQEAgLTc3LDUzICsxMDEsNjYgQEAKICAgICAgICAga2V5RXZlbnRUeXBlc01hcC5wdXQobmV3IEludGVnZXIoS2V5RXZlbnQuS0VZX1RZUEVEKSwgInR5cGVkIik7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKLSAgICAvKiogVGhlIGtleSBjaGFyLiAqLwotICAgIHByaXZhdGUgY2hhciBrZXlDaGFyOwotICAgIAotICAgIC8qKiBUaGUga2V5IGNvZGUuICovCi0gICAgcHJpdmF0ZSBpbnQga2V5Q29kZTsKLSAgICAKLSAgICAvKiogVGhlIG1vZGlmaWVycy4gKi8KLSAgICBwcml2YXRlIGludCBtb2RpZmllcnM7Ci0gICAgCi0gICAgLyoqIFRoZSBvbiBrZXkgcmVsZWFzZS4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gb25LZXlSZWxlYXNlOwotICAgIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBV1RLZXlTdHJva2UuIAotICAgICAqIGdldEFXVEtleVN0cm9rZSBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zIGNvZGUuICAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Q2hhciB0aGUga2V5IGNoYXIKLSAgICAgKiBAcGFyYW0ga2V5Q29kZSB0aGUga2V5IGNvZGUKLSAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBtb2RpZmllcnMKLSAgICAgKiBAcGFyYW0gb25LZXlSZWxlYXNlIHRydWUgaWYgQVdUS2V5U3Ryb2tlIGlzIGZvciBhIGtleSByZWxlYXNlLCBvdmVyd2lzZSBmYWxzZS4gCisgICAgICogVGhlIGtleSBjaGFyLgogICAgICAqLwotICAgIHByb3RlY3RlZCBBV1RLZXlTdHJva2UoY2hhciBrZXlDaGFyLCBpbnQga2V5Q29kZSwgaW50IG1vZGlmaWVycywKLSAgICAgICAgICAgIGJvb2xlYW4gb25LZXlSZWxlYXNlKQotICAgIHsKLSAgICAgICBzZXRBV1RLZXlTdHJva2Uoa2V5Q2hhciwga2V5Q29kZSwgbW9kaWZpZXJzLCBvbktleVJlbGVhc2UpOworICAgIHByaXZhdGUgY2hhciBrZXlDaGFyOworCisgICAgLyoqCisgICAgICogVGhlIGtleSBjb2RlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGtleUNvZGU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbW9kaWZpZXJzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1vZGlmaWVyczsKKworICAgIC8qKgorICAgICAqIFRoZSBvbiBrZXkgcmVsZWFzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gb25LZXlSZWxlYXNlOworCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEFXVEtleVN0cm9rZS4gZ2V0QVdUS2V5U3Ryb2tlIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBieQorICAgICAqIGFwcGxpY2F0aW9ucyBjb2RlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXlDaGFyCisgICAgICogICAgICAgICAgICB0aGUga2V5IGNoYXIuCisgICAgICogQHBhcmFtIGtleUNvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgY29kZS4KKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCisgICAgICogICAgICAgICAgICB0aGUgbW9kaWZpZXJzLgorICAgICAqIEBwYXJhbSBvbktleVJlbGVhc2UKKyAgICAgKiAgICAgICAgICAgIHRydWUgaWYgQVdUS2V5U3Ryb2tlIGlzIGZvciBhIGtleSByZWxlYXNlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFXVEtleVN0cm9rZShjaGFyIGtleUNoYXIsIGludCBrZXlDb2RlLCBpbnQgbW9kaWZpZXJzLCBib29sZWFuIG9uS2V5UmVsZWFzZSkgeworICAgICAgICBzZXRBV1RLZXlTdHJva2Uoa2V5Q2hhciwga2V5Q29kZSwgbW9kaWZpZXJzLCBvbktleVJlbGVhc2UpOwogICAgIH0KIAotICAgIC8qKiBTZXRzIHRoZSBhd3Qga2V5IHN0cm9rZS4KKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBBV1Qga2V5IHN0cm9rZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Q2hhciB0aGUga2V5IGNoYXIKLSAgICAgKiBAcGFyYW0ga2V5Q29kZSB0aGUga2V5IGNvZGUKLSAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBtb2RpZmllcnMKLSAgICAgKiBAcGFyYW0gb25LZXlSZWxlYXNlIHRoZSBvbiBrZXkgcmVsZWFzZQorICAgICAqIEBwYXJhbSBrZXlDaGFyCisgICAgICogICAgICAgICAgICB0aGUga2V5IGNoYXIuCisgICAgICogQHBhcmFtIGtleUNvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgY29kZS4KKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCisgICAgICogICAgICAgICAgICB0aGUgbW9kaWZpZXJzLgorICAgICAqIEBwYXJhbSBvbktleVJlbGVhc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvbiBrZXkgcmVsZWFzZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0QVdUS2V5U3Ryb2tlKCBjaGFyIGtleUNoYXIsIGludCBrZXlDb2RlLCBpbnQgbW9kaWZpZXJzLAotICAgICAgICAgICAgYm9vbGVhbiBvbktleVJlbGVhc2UpCi0gICAgeworICAgIHByaXZhdGUgdm9pZCBzZXRBV1RLZXlTdHJva2UoY2hhciBrZXlDaGFyLCBpbnQga2V5Q29kZSwgaW50IG1vZGlmaWVycywgYm9vbGVhbiBvbktleVJlbGVhc2UpIHsKICAgICAgICAgdGhpcy5rZXlDaGFyID0ga2V5Q2hhcjsKICAgICAgICAgdGhpcy5rZXlDb2RlID0ga2V5Q29kZTsKICAgICAgICAgdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CiAgICAgICAgIHRoaXMub25LZXlSZWxlYXNlID0gb25LZXlSZWxlYXNlOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBV1RLZXlTdHJva2Ugd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnM6Ci0gICAgICogS2V5RXZlbnQuQ0hBUl9VTkRFRklORUQga2V5IGNoYXIsIEtleUV2ZW50LlZLX1VOREVGSU5FRCBrZXkgY29kZSwKLSAgICAgKiB3aXRob3V0IG1vZGlmaWVycyBhbmQgZmFsc2Uga2V5IHJlYWxpc2VkIHZhbHVlLgorICAgICAqIEtleUV2ZW50LkNIQVJfVU5ERUZJTkVEIGtleSBjaGFyLCBLZXlFdmVudC5WS19VTkRFRklORUQga2V5IGNvZGUsIHdpdGhvdXQKKyAgICAgKiBtb2RpZmllcnMgYW5kIGZhbHNlIGtleSByZWFsaXplZCB2YWx1ZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQVdUS2V5U3Ryb2tlKCkgewogICAgICAgICB0aGlzKEtleUV2ZW50LkNIQVJfVU5ERUZJTkVELCBLZXlFdmVudC5WS19VTkRFRklORUQsIDAsIGZhbHNlKTsKQEAgLTEzMiw0MiArMTY5LDQ0IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdW5pcXVlIG51bWJlciB2YWx1ZSBmb3IgQVdUS2V5U3Ryb2tlIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQgdW5pcXVlIHZhbHVlIG9mIHRoZSBBV1RLZXlTdHJva2Ugb2JqZWN0LgorICAgICAqIEByZXR1cm4gdGhlIGludGVnZXIgdW5pcXVlIHZhbHVlIG9mIHRoZSBBV1RLZXlTdHJva2Ugb2JqZWN0LgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBtb2RpZmllcnMgKyAoIGtleUNvZGUgIT0gS2V5RXZlbnQuVktfVU5ERUZJTkVEID8KLSAgICAgICAgICAgICAgICBrZXlDb2RlIDoga2V5Q2hhcikgKyAob25LZXlSZWxlYXNlID8gLTEgOiAwKTsKKyAgICAgICAgcmV0dXJuIG1vZGlmaWVycyArIChrZXlDb2RlICE9IEtleUV2ZW50LlZLX1VOREVGSU5FRCA/IGtleUNvZGUgOiBrZXlDaGFyKQorICAgICAgICAgICAgICAgICsgKG9uS2V5UmVsZWFzZSA/IC0xIDogMCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc2V0IG9mIG1vZGlmaWVycyBmb3IgdGhlIEFXVEtleVN0cm9rZSBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50IHZhbHVlIHdoaWNoIGNvbnRhaW5zIG1vZGlmaWVycy4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIHZhbHVlIHdoaWNoIGNvbnRhaW5zIG1vZGlmaWVycy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldE1vZGlmaWVycygpIHsKICAgICAgICAgcmV0dXJuIG1vZGlmaWVyczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgQVdUS2V5U3Ryb2tlIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAgICAgKiBDb21wYXJlcyB0aGlzIEFXVEtleVN0cm9rZSBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBvYmplY3RzIGFyZSBpZGVudGljYWwsIG92ZXJ3aXNlIGZhbHNlLgorICAgICAqIEBwYXJhbSBhbk9iamVjdAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBBV1RLZXlTdHJva2Ugb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzCisgICAgICogICAgICAgICAgICBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgb2JqZWN0cyBhcmUgaWRlbnRpY2FsLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCkgewogICAgICAgICBpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBBV1RLZXlTdHJva2UpIHsKICAgICAgICAgICAgIEFXVEtleVN0cm9rZSBrZXkgPSAoQVdUS2V5U3Ryb2tlKWFuT2JqZWN0OwotICAgICAgICAgICAgcmV0dXJuICgoa2V5LmtleUNvZGUgPT0ga2V5Q29kZSkgJiYgKGtleS5rZXlDaGFyID09IGtleUNoYXIpICYmCi0gICAgICAgICAgICAgICAgICAgIChrZXkubW9kaWZpZXJzID09IG1vZGlmaWVycykgJiYKLSAgICAgICAgICAgICAgICAgICAgKGtleS5vbktleVJlbGVhc2UgPT0gb25LZXlSZWxlYXNlKSk7CisgICAgICAgICAgICByZXR1cm4gKChrZXkua2V5Q29kZSA9PSBrZXlDb2RlKSAmJiAoa2V5LmtleUNoYXIgPT0ga2V5Q2hhcikKKyAgICAgICAgICAgICAgICAgICAgJiYgKGtleS5tb2RpZmllcnMgPT0gbW9kaWZpZXJzKSAmJiAoa2V5Lm9uS2V5UmVsZWFzZSA9PSBvbktleVJlbGVhc2UpKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBBV1RLZXlTdHJva2UuCi0gICAgICogVGhpcyBzdHJpbmcgc2hvdWxkIGNvbnRhaW4ga2V5IHN0cm9rZSBwcm9wZXJ0aWVzLgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgQVdUS2V5U3Ryb2tlLiBUaGlzIHN0cmluZyBzaG91bGQKKyAgICAgKiBjb250YWluIGtleSBzdHJva2UgcHJvcGVydGllcy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIEFXVEtleVN0cm9rZS4KICAgICAgKi8KQEAgLTE3NSw5ICsyMTQsMTAgQEAKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBpbnQgdHlwZSA9IGdldEtleUV2ZW50VHlwZSgpOwogICAgICAgICByZXR1cm4gSW5wdXRFdmVudC5nZXRNb2RpZmllcnNFeFRleHQoZ2V0TW9kaWZpZXJzKCkpICsgIiAiICsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAga2V5RXZlbnRUeXBlc01hcC5nZXQobmV3IEludGVnZXIodHlwZSkpICsgICIgIiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICh0eXBlID09IEtleUV2ZW50LktFWV9UWVBFRCA/IG5ldyBTdHJpbmcobmV3IGNoYXJbXSB7a2V5Q2hhcn0pIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LmdldEtleVRleHQoa2V5Q29kZSkpOworICAgICAgICAgICAgICAgIGtleUV2ZW50VHlwZXNNYXAuZ2V0KG5ldyBJbnRlZ2VyKHR5cGUpKSArICIgIiArIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAodHlwZSA9PSBLZXlFdmVudC5LRVlfVFlQRUQgPyBuZXcgU3RyaW5nKG5ldyBjaGFyW10geworICAgICAgICAgICAgICAgICAgICBrZXlDaGFyCisgICAgICAgICAgICAgICAgfSkgOiBLZXlFdmVudC5nZXRLZXlUZXh0KGtleUNvZGUpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwMSwxNiArMjQxLDE4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgQVdUIGtleSBzdHJva2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGtleUNoYXIgdGhlIGtleSBjaGFyCi0gICAgICogQHBhcmFtIGtleUNvZGUgdGhlIGtleSBjb2RlCi0gICAgICogQHBhcmFtIG1vZGlmaWVycyB0aGUgbW9kaWZpZXJzCi0gICAgICogQHBhcmFtIG9uS2V5UmVsZWFzZSB0aGUgb24ga2V5IHJlbGVhc2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBBV1Qga2V5IHN0cm9rZQorICAgICAqIEBwYXJhbSBrZXlDaGFyCisgICAgICogICAgICAgICAgICB0aGUga2V5IGNoYXIuCisgICAgICogQHBhcmFtIGtleUNvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgY29kZS4KKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCisgICAgICogICAgICAgICAgICB0aGUgbW9kaWZpZXJzLgorICAgICAqIEBwYXJhbSBvbktleVJlbGVhc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvbiBrZXkgcmVsZWFzZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBBV1Qga2V5IHN0cm9rZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBV1RLZXlTdHJva2UgZ2V0QVdUS2V5U3Ryb2tlKGNoYXIga2V5Q2hhciwgaW50IGtleUNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvbktleVJlbGVhc2UpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBBV1RLZXlTdHJva2UgZ2V0QVdUS2V5U3Ryb2tlKGNoYXIga2V5Q2hhciwgaW50IGtleUNvZGUsIGludCBtb2RpZmllcnMsCisgICAgICAgICAgICBib29sZWFuIG9uS2V5UmVsZWFzZSkgewogICAgICAgICBBV1RLZXlTdHJva2Uga2V5ID0gbmV3SW5zdGFuY2Uoa2V5Q2hhciwga2V5Q29kZSwgbW9kaWZpZXJzLCBvbktleVJlbGVhc2UpOwogCiAgICAgICAgIEFXVEtleVN0cm9rZSB2YWx1ZSA9IGNhY2hlLmdldChrZXkpOwpAQCAtMjI0LDI4ICsyNjYsMzAgQEAKICAgICAvKioKICAgICAgKiBOZXcgaW5zdGFuY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGtleUNoYXIgdGhlIGtleSBjaGFyCi0gICAgICogQHBhcmFtIGtleUNvZGUgdGhlIGtleSBjb2RlCi0gICAgICogQHBhcmFtIG1vZGlmaWVycyB0aGUgbW9kaWZpZXJzCi0gICAgICogQHBhcmFtIG9uS2V5UmVsZWFzZSB0aGUgb24ga2V5IHJlbGVhc2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBBV1Qga2V5IHN0cm9rZQorICAgICAqIEBwYXJhbSBrZXlDaGFyCisgICAgICogICAgICAgICAgICB0aGUga2V5IGNoYXIuCisgICAgICogQHBhcmFtIGtleUNvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgY29kZS4KKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCisgICAgICogICAgICAgICAgICB0aGUgbW9kaWZpZXJzLgorICAgICAqIEBwYXJhbSBvbktleVJlbGVhc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvbiBrZXkgcmVsZWFzZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBBV1Qga2V5IHN0cm9rZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBV1RLZXlTdHJva2UgbmV3SW5zdGFuY2UoY2hhciBrZXlDaGFyLCBpbnQga2V5Q29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvbktleVJlbGVhc2UpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBBV1RLZXlTdHJva2UgbmV3SW5zdGFuY2UoY2hhciBrZXlDaGFyLCBpbnQga2V5Q29kZSwgaW50IG1vZGlmaWVycywKKyAgICAgICAgICAgIGJvb2xlYW4gb25LZXlSZWxlYXNlKSB7CiAgICAgICAgIEFXVEtleVN0cm9rZSBrZXk7Ci0gICAgICAgIC8vPz8/QVdUCi0vLyAgICAgICAgaWYgKHN1YkNvbnN0cnVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIGtleSA9IG5ldyBBV1RLZXlTdHJva2UoKTsKLSAgICAgICAgLy8/Pz9BV1QKLS8vICAgICAgICB9IGVsc2UgewotLy8gICAgICAgICAgICB0cnkgewotLy8gICAgICAgICAgICAgICAga2V5ID0gKEFXVEtleVN0cm9rZSkgc3ViQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoKTsKLS8vICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQorICAgICAgICAvLyA/Pz9BV1QKKyAgICAgICAgLy8gaWYgKHN1YkNvbnN0cnVjdG9yID09IG51bGwpIHsKKyAgICAgICAga2V5ID0gbmV3IEFXVEtleVN0cm9rZSgpOworICAgICAgICAvLyA/Pz9BV1QKKyAgICAgICAgLy8gfSBlbHNlIHsKKyAgICAgICAgLy8gdHJ5IHsKKyAgICAgICAgLy8ga2V5ID0gKEFXVEtleVN0cm9rZSkgc3ViQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgLy8gfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gfQogICAgICAgICBpbnQgYWxsTW9kaWZpZXJzID0gZ2V0QWxsTW9kaWZpZXJzKG1vZGlmaWVycyk7CiAgICAgICAgIGtleS5zZXRBV1RLZXlTdHJva2Uoa2V5Q2hhciwga2V5Q29kZSwgYWxsTW9kaWZpZXJzLCBvbktleVJlbGVhc2UpOwogICAgICAgICByZXR1cm4ga2V5OwpAQCAtMjU0LDIxICsyOTgsMjIgQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBtYXNrLgogICAgICAqIAotICAgICAqIEBwYXJhbSBtb2QgdGhlIG1vZAotICAgICAqIEBwYXJhbSBtYXNrIHRoZSBtYXNrCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50CisgICAgICogQHBhcmFtIG1vZAorICAgICAqICAgICAgICAgICAgdGhlIG1vZC4KKyAgICAgKiBAcGFyYW0gbWFzaworICAgICAqICAgICAgICAgICAgdGhlIG1hc2suCisgICAgICogQHJldHVybiB0aGUgaW50LgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGludCBhZGRNYXNrKGludCBtb2QsIGludCBtYXNrKSB7CiAgICAgICAgIHJldHVybiAoKG1vZCAmIG1hc2spICE9IDApID8gKG1vZCB8IG1hc2spIDogbW9kOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIHJldHVybiBhbGwgKG9sZCAmIG5ldykgbW9kaWZpZXJzIGNvcnJlc3BvbmRpbmcgdG8uCisgICAgICogUmV0dXJuIGFsbCAob2xkICYgbmV3KSBtb2RpZmllcnMgY29ycmVzcG9uZGluZyB0by4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbW9kIG9sZCBvciBuZXcgbW9kaWZpZXJzCi0gICAgICogCi0gICAgICogQHJldHVybiBvbGQgYW5kIG5ldyBtb2RpZmllcnMgdG9nZXRoZXIKKyAgICAgKiBAcGFyYW0gbW9kCisgICAgICogICAgICAgICAgICBvbGQgb3IgbmV3IG1vZGlmaWVycy4KKyAgICAgKiBAcmV0dXJuIG9sZCBhbmQgbmV3IG1vZGlmaWVycyB0b2dldGhlci4KICAgICAgKi8KICAgICBzdGF0aWMgaW50IGdldEFsbE1vZGlmaWVycyhpbnQgbW9kKSB7CiAgICAgICAgIGludCBhbGxNb2QgPSBtb2Q7CkBAIC0yODksMjcgKzMzNCwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgQVdUS2V5U3Ryb2tlIGZvciBwYXJzZWQgc3RyaW5nLgotICAgICAqIAotICAgICAqIFRoZSBzdHJpbmcgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgQVdUS2V5U3Ryb2tlIGZvciBwYXJzZWQgc3RyaW5nLiBUaGUgc3RyaW5nIG11c3QKKyAgICAgKiBoYXZlIHRoZSBmb2xsb3dpbmcgc3ludGF4OgogICAgICAqPHA+CiAgICAgICogJmx0O21vZGlmaWVycyZndDsqICgmbHQ7dHlwZWRJRCZndDsgfCAmbHQ7cHJlc3NlZFJlbGVhc2VkSUQmZ3Q7KQogICAgICAqPHA+Ci0gICAgICogbW9kaWZpZXJzIDo9IHNoaWZ0IHwgY29udHJvbCB8IGN0cmwgfCBtZXRhIHwgYWx0IHwgYWx0R3JhcGgKLSAgICAgKiA8YnI+IAotICAgICAqIHR5cGVkSUQgOj0gdHlwZWQgPHR5cGVkS2V5PgotICAgICAqIDxicj4KLSAgICAgKiB0eXBlZEtleSA6PSBzdHJpbmcgb2YgbGVuZ3RoIDEgZ2l2aW5nIHRoZSBVbmljb2RlIGNoYXJhY3Rlci4KLSAgICAgKiA8YnI+Ci0gICAgICogcHJlc3NlZFJlbGVhc2VkSUQgOj0gKHByZXNzZWQgfCByZWxlYXNlZCkgPGtleT4KLSAgICAgKiA8YnI+CisgICAgICogbW9kaWZpZXJzIDo9IHNoaWZ0IHwgY29udHJvbCB8IGN0cmwgfCBtZXRhIHwgYWx0IHwgYWx0R3JhcGggPGJyPgorICAgICAqIHR5cGVkSUQgOj0gdHlwZWQgPHR5cGVkS2V5PiA8YnI+CisgICAgICogdHlwZWRLZXkgOj0gc3RyaW5nIG9mIGxlbmd0aCAxIGdpdmluZyB0aGUgVW5pY29kZSBjaGFyYWN0ZXIuIDxicj4KKyAgICAgKiBwcmVzc2VkUmVsZWFzZWRJRCA6PSAocHJlc3NlZCB8IHJlbGVhc2VkKSA8a2V5PiA8YnI+CiAgICAgICoga2V5IDo9IEtleUV2ZW50IGtleSBjb2RlIG5hbWUsIGkuZS4gdGhlIG5hbWUgZm9sbG93aW5nICJWS18iLgogICAgICAqIDxwPgotICAgICAqIEBwYXJhbSBzIHRoZSBTdHJpbmcgd2hpY2ggY29udGFpbnMga2V5IHN0cm9rZSBwYXJhbWV0ZXJzLgogICAgICAqIAorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIHdoaWNoIGNvbnRhaW5zIGtleSBzdHJva2UgcGFyYW1ldGVycy4KICAgICAgKiBAcmV0dXJuIHRoZSBBV1RLZXlTdHJva2UgZm9yIHN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzdHJpbmcgaGFzIGluY29ycmVjdCBmb3JtYXQgb3IgbnVsbC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHN0cmluZyBoYXMgaW5jb3JyZWN0IGZvcm1hdCBvciBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQVdUS2V5U3Ryb2tlIGdldEFXVEtleVN0cm9rZShTdHJpbmcgcykgewogICAgICAgICBpZiAocyA9PSBudWxsKSB7CkBAIC0zNTEsMTYgKzM5MiwxNSBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42NiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGdldEFXVEtleVN0cm9rZShrZXlDaGFyLCBrZXlDb2RlLCBtb2RpZmllcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSA9PSBCb29sZWFuLlRSVUUpOworICAgICAgICByZXR1cm4gZ2V0QVdUS2V5U3Ryb2tlKGtleUNoYXIsIGtleUNvZGUsIG1vZGlmaWVycywgcmVsZWFzZSA9PSBCb29sZWFuLlRSVUUpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG5leHQgdG9rZW4uCiAgICAgICogCi0gICAgICogQHBhcmFtIHRva2VuaXplciB0aGUgdG9rZW5pemVyCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV4dCB0b2tlbgorICAgICAqIEBwYXJhbSB0b2tlbml6ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSB0b2tlbml6ZXIuCisgICAgICogQHJldHVybiB0aGUgbmV4dCB0b2tlbi4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV4dFRva2VuKFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIpIHsKICAgICAgICAgdHJ5IHsKQEAgLTM3NCw5ICs0MTQsOSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGtleSBjb2RlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSBzCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGNvZGUKKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIHMuCisgICAgICogQHJldHVybiB0aGUga2V5IGNvZGUuCiAgICAgICovCiAgICAgc3RhdGljIGludCBnZXRLZXlDb2RlKFN0cmluZyBzKSB7CiAgICAgICAgIHRyeSB7CkBAIC0zOTQsOCArNDM0LDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIGFuIGluc3RhbmNlIG9mIHRoZSBBV1RLZXlTdHJva2UgZm9yIHNwZWNpZmllZCBjaGFyYWN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGtleUNoYXIgdGhlIGtleWJvYXJkIGNoYXJhY3RlciB2YWx1ZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5Q2hhcgorICAgICAqICAgICAgICAgICAgdGhlIGtleWJvYXJkIGNoYXJhY3RlciB2YWx1ZS4KICAgICAgKiBAcmV0dXJuIGEgQVdUS2V5U3Ryb2tlIGZvciBzcGVjaWZpZWQgY2hhcmFjdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQVdUS2V5U3Ryb2tlIGdldEFXVEtleVN0cm9rZShjaGFyIGtleUNoYXIpIHsKQEAgLTQwMywxMjAgKzQ0MywxMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIEFXVEtleVN0cm9rZSBmb3IgYSBnaXZlbiBrZXkgY29kZSwgc2V0IAotICAgICAqIG9mIG1vZGlmaWVycywgYW5kIHNwZWNpZmllZCBrZXkgcmVsZWFzZWQgZmxhZyB2YWx1ZS4KLSAgICAgKiBUaGUga2V5IGNvZGVzIGFyZSBkZWZpbmVkIGluIGphdmEuYXd0LmV2ZW50LktleUV2ZW50IGNsYXNzLiAKLSAgICAgKiBUaGUgc2V0IG9mIG1vZGlmaWVycyBpcyBnaXZlbiBhcyBhIGJpdHdpc2UgY29tYmluYXRpb24gCi0gICAgICogb2YgbWFza3MgdGFrZW4gZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6CisgICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBBV1RLZXlTdHJva2UgZm9yIGEgZ2l2ZW4ga2V5IGNvZGUsIHNldCBvZgorICAgICAqIG1vZGlmaWVycywgYW5kIHNwZWNpZmllZCBrZXkgcmVsZWFzZWQgZmxhZyB2YWx1ZS4gVGhlIGtleSBjb2RlcyBhcmUKKyAgICAgKiBkZWZpbmVkIGluIGphdmEuYXd0LmV2ZW50LktleUV2ZW50IGNsYXNzLiBUaGUgc2V0IG9mIG1vZGlmaWVycyBpcyBnaXZlbgorICAgICAqIGFzIGEgYml0d2lzZSBjb21iaW5hdGlvbiBvZiBtYXNrcyB0YWtlbiBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdDoKICAgICAgKiA8dWw+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX0dSQVBIX0RPV05fTUFTSzwvbGk+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX0RPV05fTUFTSzwvbGk+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQ1RSTF9ET1dOX01BU0s8L2xpPgotICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50Lk1FVEFfRE9XTl9NQVNLPC9saT4KLSAgICAgKiA8bGk+amF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5TSElGVF9ET1dOX01BU0s8L2xpPgotICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkFMVF9HUkFQSF9NQVNLPC9saT4KLSAgICAgKiA8bGk+amF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5BTFRfTUFTSzwvbGk+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQ1RSTF9NQVNLPC9saT4KLSAgICAgKiA8bGk+amF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5NRVRBX01BU0s8L2xpPiAgCi0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuU0hJRlRfTUFTSzwvbGk+CisgICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX0dSQVBIX0RPV05fTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkFMVF9ET1dOX01BU0s8L2xpPiA8bGk+CisgICAgICogamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5DVFJMX0RPV05fTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50Lk1FVEFfRE9XTl9NQVNLPC9saT4gPGxpPgorICAgICAqIGphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuU0hJRlRfRE9XTl9NQVNLPC9saT4gPGxpPgorICAgICAqIGphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX0dSQVBIX01BU0s8L2xpPiA8bGk+CisgICAgICogamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5BTFRfTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkNUUkxfTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50Lk1FVEFfTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LlNISUZUX01BU0s8L2xpPgogICAgICAqIDwvdWw+Ci0gICAgICogIDxicj4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGtleUNvZGUgdGhlIHNwZWNpZmllZCBrZXkgY29kZSBvZiBrZXlib2FyZC4KLSAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBiaXQgc2V0IG9mIG1vZGlmaWVycy4KKyAgICAgKiA8YnI+CiAgICAgICogCisgICAgICogQHBhcmFtIGtleUNvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQga2V5IGNvZGUgb2Yga2V5Ym9hcmQuCisgICAgICogQHBhcmFtIG1vZGlmaWVycworICAgICAqICAgICAgICAgICAgdGhlIGJpdCBzZXQgb2YgbW9kaWZpZXJzLgorICAgICAqIEBwYXJhbSBvbktleVJlbGVhc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB3aGljaCByZXByZXNlbnRzIHdoZXRoZXIgdGhpcyBBV1RLZXlTdHJva2Ugc2hhbGwKKyAgICAgKiAgICAgICAgICAgIHJlcHJlc2VudHMgYSBrZXkgcmVsZWFzZS4KICAgICAgKiBAcmV0dXJuIHRoZSBBV1RLZXlTdHJva2UuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBV1RLZXlTdHJva2UgZ2V0QVdUS2V5U3Ryb2tlKGludCBrZXlDb2RlLCBpbnQgbW9kaWZpZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG9uS2V5UmVsZWFzZSkgewotICAgICAgICByZXR1cm4gZ2V0QVdUS2V5U3Ryb2tlKEtleUV2ZW50LkNIQVJfVU5ERUZJTkVELCBrZXlDb2RlLCBtb2RpZmllcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25LZXlSZWxlYXNlKTsKKyAgICBwdWJsaWMgc3RhdGljIEFXVEtleVN0cm9rZSBnZXRBV1RLZXlTdHJva2UoaW50IGtleUNvZGUsIGludCBtb2RpZmllcnMsIGJvb2xlYW4gb25LZXlSZWxlYXNlKSB7CisgICAgICAgIHJldHVybiBnZXRBV1RLZXlTdHJva2UoS2V5RXZlbnQuQ0hBUl9VTkRFRklORUQsIGtleUNvZGUsIG1vZGlmaWVycywgb25LZXlSZWxlYXNlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIEFXVEtleVN0cm9rZSBmb3IgYSBzcGVjaWZpZWQgY2hhcmFjdGVyIGFuZCBzZXQgb2YgbW9kaWZpZXJzLiAKLSAgICAgKiBUaGUgc2V0IG9mIG1vZGlmaWVycyBpcyBnaXZlbiBhcyBhIGJpdHdpc2UgY29tYmluYXRpb24gCi0gICAgICogb2YgbWFza3MgdGFrZW4gZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6CisgICAgICogUmV0dXJucyBBV1RLZXlTdHJva2UgZm9yIGEgc3BlY2lmaWVkIGNoYXJhY3RlciBhbmQgc2V0IG9mIG1vZGlmaWVycy4gVGhlCisgICAgICogc2V0IG9mIG1vZGlmaWVycyBpcyBnaXZlbiBhcyBhIGJpdHdpc2UgY29tYmluYXRpb24gb2YgbWFza3MgdGFrZW4gZnJvbQorICAgICAqIHRoZSBmb2xsb3dpbmcgbGlzdDoKICAgICAgKiA8dWw+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX0dSQVBIX0RPV05fTUFTSzwvbGk+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX0RPV05fTUFTSzwvbGk+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQ1RSTF9ET1dOX01BU0s8L2xpPgotICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50Lk1FVEFfRE9XTl9NQVNLPC9saT4KLSAgICAgKiA8bGk+amF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5TSElGVF9ET1dOX01BU0s8L2xpPgotICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkFMVF9HUkFQSF9NQVNLPC9saT4KLSAgICAgKiA8bGk+amF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5BTFRfTUFTSzwvbGk+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQ1RSTF9NQVNLPC9saT4KLSAgICAgKiA8bGk+amF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5NRVRBX01BU0s8L2xpPiAgCi0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuU0hJRlRfTUFTSzwvbGk+CisgICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX0dSQVBIX0RPV05fTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkFMVF9ET1dOX01BU0s8L2xpPiA8bGk+CisgICAgICogamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5DVFJMX0RPV05fTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50Lk1FVEFfRE9XTl9NQVNLPC9saT4gPGxpPgorICAgICAqIGphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuU0hJRlRfRE9XTl9NQVNLPC9saT4gPGxpPgorICAgICAqIGphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX0dSQVBIX01BU0s8L2xpPiA8bGk+CisgICAgICogamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5BTFRfTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkNUUkxfTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50Lk1FVEFfTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LlNISUZUX01BU0s8L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogCi0gICAgICogQHBhcmFtIGtleUNoYXIgdGhlIENoYXJhY3RlciBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBrZXlib2FyZCBjaGFyYWN0ZXIgdmFsdWUuCi0gICAgICogQHBhcmFtIG1vZGlmaWVycyB0aGUgYml0IHNldCBvZiBtb2RpZmllcnMuCi0gICAgICogCisgICAgICogQHBhcmFtIGtleUNoYXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBDaGFyYWN0ZXIgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMga2V5Ym9hcmQgY2hhcmFjdGVyCisgICAgICogICAgICAgICAgICB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCisgICAgICogICAgICAgICAgICB0aGUgYml0IHNldCBvZiBtb2RpZmllcnMuCiAgICAgICogQHJldHVybiB0aGUgQVdUS2V5U3Ryb2tlIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBrZXlDaGFyIHZhbHVlIGlzIG51bGwuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBrZXlDaGFyIHZhbHVlIGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBBV1RLZXlTdHJva2UgZ2V0QVdUS2V5U3Ryb2tlKENoYXJhY3RlciBrZXlDaGFyLCBpbnQgbW9kaWZpZXJzKSB7CiAgICAgICAgIGlmIChrZXlDaGFyID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGF3dC4wMT0nezB9JyBwYXJhbWV0ZXIgaXMgbnVsbAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4wMSIsICJrZXlDaGFyIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0QVdUS2V5U3Ryb2tlKGtleUNoYXIuY2hhclZhbHVlKCksIEtleUV2ZW50LlZLX1VOREVGSU5FRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIGdldEFXVEtleVN0cm9rZShrZXlDaGFyLmNoYXJWYWx1ZSgpLCBLZXlFdmVudC5WS19VTkRFRklORUQsIG1vZGlmaWVycywgZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgQVdUS2V5U3Ryb2tlIGZvciBhIHNwZWNpZmllZCBrZXkgY29kZSBhbmQgCi0gICAgICogc2V0IG9mIG1vZGlmaWVycy4KLSAgICAgKiBUaGUga2V5IGNvZGVzIGFyZSBkZWZpbmVkIGluIGphdmEuYXd0LmV2ZW50LktleUV2ZW50IGNsYXNzLiAKLSAgICAgKiBUaGUgc2V0IG9mIG1vZGlmaWVycyBpcyBnaXZlbiBhcyBhIGJpdHdpc2UgY29tYmluYXRpb24gCi0gICAgICogb2YgbWFza3MgdGFrZW4gZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6CisgICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBBV1RLZXlTdHJva2UgZm9yIGEgc3BlY2lmaWVkIGtleSBjb2RlIGFuZCBzZXQgb2YKKyAgICAgKiBtb2RpZmllcnMuIFRoZSBrZXkgY29kZXMgYXJlIGRlZmluZWQgaW4gamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQgY2xhc3MuCisgICAgICogVGhlIHNldCBvZiBtb2RpZmllcnMgaXMgZ2l2ZW4gYXMgYSBiaXR3aXNlIGNvbWJpbmF0aW9uIG9mIG1hc2tzIHRha2VuCisgICAgICogZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6CiAgICAgICogPHVsPgotICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkFMVF9HUkFQSF9ET1dOX01BU0s8L2xpPgotICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkFMVF9ET1dOX01BU0s8L2xpPgotICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkNUUkxfRE9XTl9NQVNLPC9saT4KLSAgICAgKiA8bGk+amF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5NRVRBX0RPV05fTUFTSzwvbGk+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuU0hJRlRfRE9XTl9NQVNLPC9saT4KLSAgICAgKiA8bGk+amF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5BTFRfR1JBUEhfTUFTSzwvbGk+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX01BU0s8L2xpPgotICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkNUUkxfTUFTSzwvbGk+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuTUVUQV9NQVNLPC9saT4gIAotICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LlNISUZUX01BU0s8L2xpPgorICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkFMVF9HUkFQSF9ET1dOX01BU0s8L2xpPiA8bGk+CisgICAgICogamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5BTFRfRE9XTl9NQVNLPC9saT4gPGxpPgorICAgICAqIGphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQ1RSTF9ET1dOX01BU0s8L2xpPiA8bGk+CisgICAgICogamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5NRVRBX0RPV05fTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LlNISUZUX0RPV05fTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkFMVF9HUkFQSF9NQVNLPC9saT4gPGxpPgorICAgICAqIGphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX01BU0s8L2xpPiA8bGk+CisgICAgICogamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5DVFJMX01BU0s8L2xpPiA8bGk+CisgICAgICogamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5NRVRBX01BU0s8L2xpPiA8bGk+CisgICAgICogamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5TSElGVF9NQVNLPC9saT4KICAgICAgKiA8L3VsPgotICAgICAqICAKLSAgICAgKiBAcGFyYW0ga2V5Q29kZSB0aGUgc3BlY2lmaWVkIGtleSBjb2RlIG9mIGtleWJvYXJkLgotICAgICAqIEBwYXJhbSBtb2RpZmllcnMgdGhlIGJpdCBzZXQgb2YgbW9kaWZpZXJzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEFXVEtleVN0cm9rZQorICAgICAqIEBwYXJhbSBrZXlDb2RlCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGtleSBjb2RlIG9mIGtleWJvYXJkLgorICAgICAqIEBwYXJhbSBtb2RpZmllcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXQgc2V0IG9mIG1vZGlmaWVycy4KKyAgICAgKiBAcmV0dXJuIHRoZSBBV1RLZXlTdHJva2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBBV1RLZXlTdHJva2UgZ2V0QVdUS2V5U3Ryb2tlKGludCBrZXlDb2RlLCBpbnQgbW9kaWZpZXJzKSB7CiAgICAgICAgIHJldHVybiBnZXRBV1RLZXlTdHJva2Uoa2V5Q29kZSwgbW9kaWZpZXJzLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgQVdUS2V5U3Ryb2tlIGZvciBhIGtleSBldmVudC4gVGhpcyBtZXRob2Qgb2J0YWlucyB0aGUga2V5IGNoYXIgCisgICAgICogR2V0cyB0aGUgQVdUS2V5U3Ryb2tlIGZvciBhIGtleSBldmVudC4gVGhpcyBtZXRob2Qgb2J0YWlucyB0aGUga2V5IGNoYXIKICAgICAgKiBhbmQga2V5IGNvZGUgZnJvbSB0aGUgc3BlY2lmaWVkIGtleSBldmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYW5FdmVudCB0aGUga2V5IGV2ZW50IHdoaWNoIGlkZW50aWZpZXMgdGhlIGRlc2lyZWQgQVdUS2V5U3Ryb2tlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBhbkV2ZW50CisgICAgICogICAgICAgICAgICB0aGUga2V5IGV2ZW50IHdoaWNoIGlkZW50aWZpZXMgdGhlIGRlc2lyZWQgQVdUS2V5U3Ryb2tlLgogICAgICAqIEByZXR1cm4gdGhlIEFXVEtleVN0cm9rZSBmb3IgdGhlIGtleSBldmVudC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEFXVEtleVN0cm9rZSBnZXRBV1RLZXlTdHJva2VGb3JFdmVudChLZXlFdmVudCBhbkV2ZW50KSB7CiAgICAgICAgIGludCBpZCA9IGFuRXZlbnQuZ2V0SUQoKTsKICAgICAgICAgY2hhciB1bmRlZiA9IEtleUV2ZW50LkNIQVJfVU5ERUZJTkVEOwotICAgICAgICBjaGFyIGtleUNoYXIgPSAoaWQgPT0gS2V5RXZlbnQuS0VZX1RZUEVEID8gYW5FdmVudC5nZXRLZXlDaGFyKCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYpOwotICAgICAgICBpbnQga2V5Q29kZSA9IChrZXlDaGFyID09IHVuZGVmID8gYW5FdmVudC5nZXRLZXlDb2RlKCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuVktfVU5ERUZJTkVEKTsKKyAgICAgICAgY2hhciBrZXlDaGFyID0gKGlkID09IEtleUV2ZW50LktFWV9UWVBFRCA/IGFuRXZlbnQuZ2V0S2V5Q2hhcigpIDogdW5kZWYpOworICAgICAgICBpbnQga2V5Q29kZSA9IChrZXlDaGFyID09IHVuZGVmID8gYW5FdmVudC5nZXRLZXlDb2RlKCkgOiBLZXlFdmVudC5WS19VTkRFRklORUQpOwogICAgICAgICByZXR1cm4gZ2V0QVdUS2V5U3Ryb2tlKGtleUNoYXIsIGtleUNvZGUsIGFuRXZlbnQuZ2V0TW9kaWZpZXJzRXgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9PSBLZXlFdmVudC5LRVlfUkVMRUFTRUQpOworICAgICAgICAgICAgICAgIGlkID09IEtleUV2ZW50LktFWV9SRUxFQVNFRCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUga2V5IGV2ZW50IHR5cGUgZm9yIHRoZSBBV1RLZXlTdHJva2Ugb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBldmVudCB0eXBlOiBLZXlFdmVudC5LRVlfUFJFU1NFRCwgS2V5RXZlbnQuS0VZX1RZUEVELCBvciBLZXlFdmVudC5LRVlfUkVMRUFTRUQKKyAgICAgKiBAcmV0dXJuIHRoZSBrZXkgZXZlbnQgdHlwZTogS2V5RXZlbnQuS0VZX1BSRVNTRUQsIEtleUV2ZW50LktFWV9UWVBFRCwgb3IKKyAgICAgKiAgICAgICAgIEtleUV2ZW50LktFWV9SRUxFQVNFRC4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldEtleUV2ZW50VHlwZSgpIHsKICAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuVktfVU5ERUZJTkVEKSB7CkBAIC01MjYsMTEgKzU2NywxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVucyB0cnVlIGlmIHRoZSBrZXkgZXZlbnQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBV1RLZXlTdHJva2UgaXMgCi0gICAgICogS0VZX1JFTEVBU0VELCBvdmVyd2lzZSBmYWxzZS4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGtleSBldmVudCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFXVEtleVN0cm9rZSBpcworICAgICAqIEtFWV9SRUxFQVNFRCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaWYgdGhlIGtleSBldmVudCBhc3NvY2lhdGVkIHdpdGggdGhlIEFXVEtleVN0cm9rZSBpcyAKLSAgICAgKiBLRVlfUkVMRUFTRUQsIG92ZXJ3aXNlIGZhbHNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaWYgdGhlIGtleSBldmVudCBhc3NvY2lhdGVkIHdpdGggdGhlIEFXVEtleVN0cm9rZSBpcworICAgICAqICAgICAgICAgS0VZX1JFTEVBU0VELCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNPbktleVJlbGVhc2UoKSB7CiAgICAgICAgIHJldHVybiBvbktleVJlbGVhc2U7CkBAIC01MzksNTAgKzU4MCw0NCBAQAogICAgIC8qKgogICAgICAqIFJlYWQgcmVzb2x2ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB0aGUgb2JqZWN0IHN0cmVhbSBleGNlcHRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QuCisgICAgICogQHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB0aGUgb2JqZWN0IHN0cmVhbSBleGNlcHRpb24uCiAgICAgICovCiAgICAgcHJvdGVjdGVkIE9iamVjdCByZWFkUmVzb2x2ZSgpIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0QVdUS2V5U3Ryb2tlKHRoaXMua2V5Q2hhciwgdGhpcy5rZXlDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kaWZpZXJzLCB0aGlzLm9uS2V5UmVsZWFzZSk7CisgICAgICAgIHJldHVybiBnZXRBV1RLZXlTdHJva2UodGhpcy5rZXlDaGFyLCB0aGlzLmtleUNvZGUsIHRoaXMubW9kaWZpZXJzLCB0aGlzLm9uS2V5UmVsZWFzZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmVnaXN0ZXIgc3ViY2xhc3MuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN1YmNsYXNzIHRoZSBzdWJjbGFzcworICAgICAqIEBwYXJhbSBzdWJjbGFzcworICAgICAqICAgICAgICAgICAgdGhlIHN1YmNsYXNzLgogICAgICAqLwogICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCByZWdpc3RlclN1YmNsYXNzKENsYXNzPD8+IHN1YmNsYXNzKSB7Ci0gICAgICAgIC8vPz8/QVdUCisgICAgICAgIC8vID8/P0FXVAogICAgICAgICAvKgotICAgICAgICBpZiAoc3ViY2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gYXd0LjAxPSd7MH0nIHBhcmFtZXRlciBpcyBudWxsCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjAxIiwgInN1YmNsYXNzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgICAgICBpZiAoISBBV1RLZXlTdHJva2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzdWJjbGFzcykpIHsKLSAgICAgICAgICAgIC8vIGF3dC42Nz1zdWJjbGFzcyBpcyBub3QgZGVyaXZlZCBmcm9tIEFXVEtleVN0cm9rZQotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42NyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdWJDb25zdHJ1Y3RvciA9IHN1YmNsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IoKTsKLSAgICAgICAgICAgIHN1YkNvbnN0cnVjdG9yLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gYXd0LjY4PXN1YmNsYXNzIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjgiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBjYWNoZS5jbGVhcigpOyAvL2ZsdXNoIHRoZSBjYWNoZQotICAgICAgICAqLworICAgICAgICAgKiBpZiAoc3ViY2xhc3MgPT0gbnVsbCkgeyAvLyBhd3QuMDE9J3swfScgcGFyYW1ldGVyIGlzIG51bGwgdGhyb3cgbmV3CisgICAgICAgICAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4wMSIsICJzdWJjbGFzcyIpKTsKKyAgICAgICAgICogLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIH0gaWYgKCEKKyAgICAgICAgICogQVdUS2V5U3Ryb2tlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oc3ViY2xhc3MpKSB7IC8vIGF3dC42Nz1zdWJjbGFzcworICAgICAgICAgKiBpcyBub3QgZGVyaXZlZCBmcm9tIEFXVEtleVN0cm9rZSB0aHJvdyBuZXcKKyAgICAgICAgICogQ2xhc3NDYXN0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjY3IikpOyAvLyROT04tTkxTLTEkIH0gdHJ5CisgICAgICAgICAqIHsgc3ViQ29uc3RydWN0b3IgPSBzdWJjbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKCk7CisgICAgICAgICAqIHN1YkNvbnN0cnVjdG9yLnNldEFjY2Vzc2libGUodHJ1ZSk7IH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICogdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7IH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7IC8vCisgICAgICAgICAqIGF3dC42OD1zdWJjbGFzcyBjb3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIHRocm93IG5ldworICAgICAgICAgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjgiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICogfSBjYWNoZS5jbGVhcigpOyAvL2ZsdXNoIHRoZSBjYWNoZQorICAgICAgICAgKi8KICAgICB9CiAKICAgICAvKioKICAgICAgKiBQYXJzZXMgdGhlIG1vZGlmaWVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJNb2QgdGhlIHN0ciBtb2QKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsb25nCisgICAgICogQHBhcmFtIHN0ck1vZAorICAgICAqICAgICAgICAgICAgdGhlIHN0ciBtb2QuCisgICAgICogQHJldHVybiB0aGUgbG9uZy4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBsb25nIHBhcnNlTW9kaWZpZXIoU3RyaW5nIHN0ck1vZCkgewogICAgICAgICBsb25nIG1vZGlmaWVycyA9IDBsOwpAQCAtNjA5LDkgKzY0NCw5IEBACiAgICAgLyoqCiAgICAgICogUGFyc2VzIHRoZSB0eXBlZCBpZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyVHlwZWQgdGhlIHN0ciB0eXBlZAotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bAorICAgICAqIEBwYXJhbSBzdHJUeXBlZAorICAgICAqICAgICAgICAgICAgdGhlIHN0ciB0eXBlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwYXJzZVR5cGVkSUQoU3RyaW5nIHN0clR5cGVkKSB7CiAgICAgICAgIGlmIChzdHJUeXBlZC5lcXVhbHMoInR5cGVkIikpIHsgLy8kTk9OLU5MUy0xJApAQCAtNjI0LDkgKzY1OSw5IEBACiAgICAgLyoqCiAgICAgICogUGFyc2VzIHRoZSB0eXBlZCBrZXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0ckNoYXIgdGhlIHN0ciBjaGFyCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hhcgorICAgICAqIEBwYXJhbSBzdHJDaGFyCisgICAgICogICAgICAgICAgICB0aGUgc3RyIGNoYXIuCisgICAgICogQHJldHVybiB0aGUgY2hhci4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBjaGFyIHBhcnNlVHlwZWRLZXkoU3RyaW5nIHN0ckNoYXIpIHsKICAgICAgICAgY2hhciBrZXlDaGFyID0gS2V5RXZlbnQuQ0hBUl9VTkRFRklORUQ7CkBAIC02NDIsOSArNjc3LDkgQEAKICAgICAvKioKICAgICAgKiBQYXJzZXMgdGhlIHByZXNzZWQgcmVsZWFzZWQgaWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0ciB0aGUgc3RyCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYm9vbGVhbgorICAgICAqIEBwYXJhbSBzdHIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHIuCisgICAgICogQHJldHVybiB0aGUgYm9vbGVhbi4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBCb29sZWFuIHBhcnNlUHJlc3NlZFJlbGVhc2VkSUQoU3RyaW5nIHN0cikgewogCkBAIC02NTksOSArNjk0LDkgQEAKICAgICAvKioKICAgICAgKiBQYXJzZXMgdGhlIGtleS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyQ29kZSB0aGUgc3RyIGNvZGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQKKyAgICAgKiBAcGFyYW0gc3RyQ29kZQorICAgICAqICAgICAgICAgICAgdGhlIHN0ciBjb2RlLgorICAgICAqIEByZXR1cm4gdGhlIGludC4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBpbnQgcGFyc2VLZXkoU3RyaW5nIHN0ckNvZGUpIHsKICAgICAgICAgaW50IGtleUNvZGUgPSBLZXlFdmVudC5WS19VTkRFRklORUQ7CkBAIC02NzUsNCArNzEwLDMgQEAKICAgICAgICAgcmV0dXJuIGtleUNvZGU7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvQVdUUGVybWlzc2lvbi5qYXZhIGIvYXd0L2phdmEvYXd0L0FXVFBlcm1pc3Npb24uamF2YQppbmRleCAyNTMyNmFiLi40YmQ4MzU3IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvQVdUUGVybWlzc2lvbi5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9BV1RQZXJtaXNzaW9uLmphdmEKQEAgLTE4LDI0ICsxOCwzMSBAQAogICogQGF1dGhvciBQYXZlbCBEb2xnb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5CYXNpY1Blcm1pc3Npb247CiAKIC8qKgotICogVGhlIEFXVFBlcm1pc3Npb24gc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uIGFuZCB0aGUgCi0gKiBjb3JyZXNwb25kaW5nIGFjdGlvbiBsaXN0LgorICogVGhlIEFXVFBlcm1pc3Npb24gc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uIGFuZCB0aGUgY29ycmVzcG9uZGluZworICogYWN0aW9uIGxpc3QuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQVdUUGVybWlzc2lvbiBleHRlbmRzIEJhc2ljUGVybWlzc2lvbiB7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODg5MDM5MjQwMjU4ODgxNDQ2NUw7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQVdUUGVybWlzc2lvbiB3aXRoIGRlZmluZWQgbmFtZSBhbmQgYWN0aW9ucy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIG5ldyBBV1RQZXJtaXNzaW9uLiAKLSAgICAgKiBAcGFyYW0gYWN0aW9ucyB0aGUgYWN0aW9ucyBvZiBhIG5ldyBBV1RQZXJtaXNzaW9uLgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiBhIG5ldyBBV1RQZXJtaXNzaW9uLgorICAgICAqIEBwYXJhbSBhY3Rpb25zCisgICAgICogICAgICAgICAgICB0aGUgYWN0aW9ucyBvZiBhIG5ldyBBV1RQZXJtaXNzaW9uLgogICAgICAqLwogICAgIHB1YmxpYyBBV1RQZXJtaXNzaW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgYWN0aW9ucykgewogICAgICAgICBzdXBlcihuYW1lLCBhY3Rpb25zKTsKQEAgLTQ0LDExICs1MSwxMSBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBV1QgcGVybWlzc2lvbiB3aXRoIHRoZSBkZWZpbmVkIG5hbWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgYSBuZXcgQVdUUGVybWlzc2lvbi4gCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgbmV3IEFXVFBlcm1pc3Npb24uCiAgICAgICovCiAgICAgcHVibGljIEFXVFBlcm1pc3Npb24oU3RyaW5nIG5hbWUpIHsKICAgICAgICAgc3VwZXIobmFtZSk7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9BY3RpdmVFdmVudC5qYXZhIGIvYXd0L2phdmEvYXd0L0FjdGl2ZUV2ZW50LmphdmEKaW5kZXggNDEzMzc1Mi4uNzA0NDYyMyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0FjdGl2ZUV2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0FjdGl2ZUV2ZW50LmphdmEKQEAgLTE4LDE4ICsxOCwyMSBAQAogICogQGF1dGhvciBNaWNoYWVsIERhbmlsb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiAvKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgZXZlbnRzIHRoYXQga25vdyBob3cgdG8gZGlzcGF0Y2ggdGhlbXNlbHZlcy4gCi0gKiBTdWNoIGV2ZW50IGNhbiBiZSBwbGFjZWQgdXBvbiB0aGUgZXZlbnQgcXVldWUgYW5kIGl0cyBkaXNwYXRjaCBtZXRob2QgCi0gKiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyBkaXNwYXRjaGVkLgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBldmVudHMgdGhhdCBrbm93IGhvdyB0byBkaXNwYXRjaCB0aGVtc2VsdmVzLiBTdWNoCisgKiBldmVudCBjYW4gYmUgcGxhY2VkIHVwb24gdGhlIGV2ZW50IHF1ZXVlIGFuZCBpdHMgZGlzcGF0Y2ggbWV0aG9kIHdpbGwgYmUKKyAqIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyBkaXNwYXRjaGVkLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBBY3RpdmVFdmVudCB7CiAKICAgICAvKioKLSAgICAgKiBEaXNwYXRjaGVzIHRoZSBldmVudCB0byB0aGUgbGlzdGVuZXJzIG9mIHRoZSBldmVudCdzIHNvdXJjZSwgCi0gICAgICogb3IgZG9lcyB3aGF0ZXZlciBpdCBpcyB0aGlzIGV2ZW50IGlzIHN1cHBvc2VkIHRvIGRvLgorICAgICAqIERpc3BhdGNoZXMgdGhlIGV2ZW50IHRvIHRoZSBsaXN0ZW5lcnMgb2YgdGhlIGV2ZW50J3Mgc291cmNlLCBvciBkb2VzCisgICAgICogd2hhdGV2ZXIgaXQgaXMgdGhpcyBldmVudCBpcyBzdXBwb3NlZCB0byBkby4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaCgpOwogCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvQWRqdXN0YWJsZS5qYXZhIGIvYXd0L2phdmEvYXd0L0FkanVzdGFibGUuamF2YQppbmRleCAzMjQxY2FkLi5iYWY4MGY3IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvQWRqdXN0YWJsZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9BZGp1c3RhYmxlLmphdmEKQEAgLTE4LDMyICsxOCwzNSBAQAogICogQGF1dGhvciBQYXZlbCBEb2xnb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWRqdXN0bWVudExpc3RlbmVyOwogCiAvKioKLSAqIFRoZSBBZGp1c3RhYmxlIGludGVyZmFjZSByZXByZXNlbnRzIGFuIGFkanVzdGFibGUgbnVtZXJpYyB2YWx1ZSAKLSAqIGNvbnRhaW5lZCB3aXRoaW4gYSBib3VuZGVkIHJhbmdlIG9mIHZhbHVlcywgc3VjaCBhcyB0aGUgY3VycmVudCAKLSAqIGxvY2F0aW9uIGluIHNjcm9sbGFibGUgcmVnaW9uIG9yIHRoZSB2YWx1ZSBvZiBhIGdhdWdlLgorICogVGhlIEFkanVzdGFibGUgaW50ZXJmYWNlIHJlcHJlc2VudHMgYW4gYWRqdXN0YWJsZSBudW1lcmljIHZhbHVlIGNvbnRhaW5lZAorICogd2l0aGluIGEgYm91bmRlZCByYW5nZSBvZiB2YWx1ZXMsIHN1Y2ggYXMgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gc2Nyb2xsYWJsZQorICogcmVnaW9uIG9yIHRoZSB2YWx1ZSBvZiBhIGdhdWdlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBBZGp1c3RhYmxlIHsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgSE9SSVpPTlRBTCBpbmRpY2F0ZXMgdGhhdCB0aGUgQWRqdXN0YWJsZSdzIG9yaWVudGF0aW9uIAotICAgICAqIGlzIGhvcml6b250YWwuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBIT1JJWk9OVEFMIGluZGljYXRlcyB0aGF0IHRoZSBBZGp1c3RhYmxlJ3Mgb3JpZW50YXRpb24gaXMKKyAgICAgKiBob3Jpem9udGFsLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPUklaT05UQUwgPSAwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBWRVJUSUNBTCBpbmRpY2F0ZXMgdGhhdCB0aGUgQWRqdXN0YWJsZSdzIG9yaWVudGF0aW9uIAotICAgICAqIGlzIHZlcnRpY2FsLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVkVSVElDQUwgaW5kaWNhdGVzIHRoYXQgdGhlIEFkanVzdGFibGUncyBvcmllbnRhdGlvbiBpcworICAgICAqIHZlcnRpY2FsLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlRJQ0FMID0gMTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgTk9fT1JJRU5UQVRJT04gaW5kaWNhdGVzIHRoYXQgdGhlIEFkanVzdGFibGUgCi0gICAgICogaGFzIG5vIG9yaWVudGF0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBOT19PUklFTlRBVElPTiBpbmRpY2F0ZXMgdGhhdCB0aGUgQWRqdXN0YWJsZSBoYXMgbm8KKyAgICAgKiBvcmllbnRhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19PUklFTlRBVElPTiA9IDI7CiAKQEAgLTU3LDE0ICs2MCwxNiBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHZhbHVlIHRvIHRoZSBBZGp1c3RhYmxlIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgQWRqdXN0YWJsZSBvYmplY3QuIAorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgQWRqdXN0YWJsZSBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoaW50IGEwKTsKIAogICAgIC8qKgogICAgICAqIEFkZHMgdGhlIEFkanVzdG1lbnRMaXN0ZW5lciB0byBjdXJyZW50IEFkanVzdG1lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGEwIHRoZSBBZGp1c3RtZW50TGlzdGVuZXIgb2JqZWN0LgorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIEFkanVzdG1lbnRMaXN0ZW5lciBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQWRqdXN0bWVudExpc3RlbmVyKEFkanVzdG1lbnRMaXN0ZW5lciBhMCk7CiAKQEAgLTg1LDcgKzkwLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSBBZGp1c3RhYmxlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIEFkanVzdGFibGUuIAorICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIEFkanVzdGFibGUuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNaW5pbXVtKCk7CiAKQEAgLTExMyw0NCArMTE4LDQ5IEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgYWRqdXN0bWVudCBsaXN0ZW5lciBvZiB0aGUgQWRqdXN0YWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIHNwZWNpZmllZCBBZGp1c3RtZW50TGlzdGVuZXIgdG8gYmUgcmVtb3ZlZC4KKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgQWRqdXN0bWVudExpc3RlbmVyIHRvIGJlIHJlbW92ZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlQWRqdXN0bWVudExpc3RlbmVyKEFkanVzdG1lbnRMaXN0ZW5lciBhMCk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBibG9jayBpbmNyZW1lbnQgZm9yIHRoZSBBZGp1c3RhYmxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhMCB0aGUgbmV3IGJsb2NrIGluY3JlbWVudC4KKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgYmxvY2sgaW5jcmVtZW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEJsb2NrSW5jcmVtZW50KGludCBhMCk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBBZGp1c3RhYmxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhMCB0aGUgbmV3IG1heGltdW0gb2YgdGhlIEFkanVzdGFibGUuCisgICAgICogQHBhcmFtIGEwCisgICAgICogICAgICAgICAgICB0aGUgbmV3IG1heGltdW0gb2YgdGhlIEFkanVzdGFibGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TWF4aW11bShpbnQgYTApOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgQWRqdXN0YWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIG5ldyBtaW5pbXVtIG9mIHRoZSBBZGp1c3RhYmxlLgorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBtaW5pbXVtIG9mIHRoZSBBZGp1c3RhYmxlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE1pbmltdW0oaW50IGEwKTsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHVuaXQgaW5jcmVtZW50IG9mIHRoZSBBZGp1c3RhYmxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhMCB0aGUgbmV3IHVuaXQgaW5jcmVtZW50IG9mIHRoZSBBZGp1c3RhYmxlLgorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB1bml0IGluY3JlbWVudCBvZiB0aGUgQWRqdXN0YWJsZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRVbml0SW5jcmVtZW50KGludCBhMCk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB2aXNpYmxlIGFtb3VudCBvZiB0aGUgQWRqdXN0YWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIG5ldyB2aXNpYmxlIGFtb3VudCBvZiB0aGUgQWRqdXN0YWJsZS4KKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmlzaWJsZSBhbW91bnQgb2YgdGhlIEFkanVzdGFibGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZUFtb3VudChpbnQgYTApOwogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9BbHBoYUNvbXBvc2l0ZS5qYXZhIGIvYXd0L2phdmEvYXd0L0FscGhhQ29tcG9zaXRlLmphdmEKaW5kZXggZDI2NzUzYy4uODM4OWViNCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0FscGhhQ29tcG9zaXRlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0FscGhhQ29tcG9zaXRlLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5hd3QuQ29tcG9zaXRlOwpAQCAtMjgsMTQ4ICsyOSwxODEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmdsLklDb21wb3NpdGVDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCi0KIC8qKgotICogVGhlIEFscGhhQ29tcG9zaXRlIGNsYXNzIGRlZmluZXMgYSBiYXNpYyBhbHBoYSBjb21wb3NpdGluZyBydWxlcyBmb3IgCi0gKiBjb21iaW5pbmcgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBjb2xvcnMgdG8gYWNoaWV2ZSBibGVuZGluZyBhbmQgCi0gKiB0cmFuc3BhcmVuY3kgZWZmZWN0cyB3aXRoIGdyYXBoaWNzIGFuZCBpbWFnZXMuCisgKiBUaGUgQWxwaGFDb21wb3NpdGUgY2xhc3MgZGVmaW5lcyBhIGJhc2ljIGFscGhhIGNvbXBvc2l0aW5nIHJ1bGVzIGZvcgorICogY29tYmluaW5nIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gY29sb3JzIHRvIGFjaGlldmUgYmxlbmRpbmcgYW5kIHRyYW5zcGFyZW5jeQorICogZWZmZWN0cyB3aXRoIGdyYXBoaWNzIGFuZCBpbWFnZXMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQWxwaGFDb21wb3NpdGUgaW1wbGVtZW50cyBDb21wb3NpdGUgewogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBDTEVBUiBpbmRpY2F0ZXMgdGhhdCBib3RoIHRoZSBjb2xvciBhbmQgdGhlIGFscGhhIG9mIAotICAgICAqIHRoZSBkZXN0aW5hdGlvbiBhcmUgY2xlYXJlZCAoUG9ydGVyLUR1ZmYgQ2xlYXIgcnVsZSkuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENMRUFSIGluZGljYXRlcyB0aGF0IGJvdGggdGhlIGNvbG9yIGFuZCB0aGUgYWxwaGEgb2YgdGhlCisgICAgICogZGVzdGluYXRpb24gYXJlIGNsZWFyZWQgKFBvcnRlci1EdWZmIENsZWFyIHJ1bGUpLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMRUFSID0gMTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgU1JDIGluZGljYXRlcyB0aGF0IHRoZSBzb3VyY2UgaXMgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU1JDIGluZGljYXRlcyB0aGF0IHRoZSBzb3VyY2UgaXMgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbgogICAgICAqIChQb3J0ZXItRHVmZiBTb3VyY2UgcnVsZSkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1JDID0gMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgRFNUIGluZGljYXRlcyB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBsZWZ0IHVudG91Y2hlZCAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRFNUIGluZGljYXRlcyB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBsZWZ0IHVudG91Y2hlZAogICAgICAqIChQb3J0ZXItRHVmZiBEZXN0aW5hdGlvbiBydWxlKS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEU1QgPSA5OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBTUkNfT1ZFUiBpbmRpY2F0ZXMgdGhhdCB0aGUgc291cmNlIGlzIGNvbXBvc2l0ZWQgb3ZlciAKLSAgICAgKiB0aGUgZGVzdGluYXRpb24gKFBvcnRlci1EdWZmIFNvdXJjZSBPdmVyIERlc3RpbmF0aW9uIHJ1bGUpLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBTUkNfT1ZFUiBpbmRpY2F0ZXMgdGhhdCB0aGUgc291cmNlIGlzIGNvbXBvc2l0ZWQgb3ZlciB0aGUKKyAgICAgKiBkZXN0aW5hdGlvbiAoUG9ydGVyLUR1ZmYgU291cmNlIE92ZXIgRGVzdGluYXRpb24gcnVsZSkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1JDX09WRVIgPSAzOwogCiAgICAgLyoqCi0gICAgICogVGhlIENvbnN0YW50IERTVF9PVkVSIGluZGljYXRlcyB0aGF0IFRoZSBkZXN0aW5hdGlvbiBpcyBjb21wb3NpdGVkIG92ZXIgCi0gICAgICogdGhlIHNvdXJjZSBhbmQgdGhlIHJlc3VsdCByZXBsYWNlcyB0aGUgZGVzdGluYXRpb24gCi0gICAgICogKFBvcnRlci1EdWZmIERlc3RpbmF0aW9uIE92ZXIgU291cmNlIHJ1bGUpLgorICAgICAqIFRoZSBDb25zdGFudCBEU1RfT1ZFUiBpbmRpY2F0ZXMgdGhhdCBUaGUgZGVzdGluYXRpb24gaXMgY29tcG9zaXRlZCBvdmVyCisgICAgICogdGhlIHNvdXJjZSBhbmQgdGhlIHJlc3VsdCByZXBsYWNlcyB0aGUgZGVzdGluYXRpb24gKFBvcnRlci1EdWZmCisgICAgICogRGVzdGluYXRpb24gT3ZlciBTb3VyY2UgcnVsZSkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFNUX09WRVIgPSA0OwogCiAgICAgLyoqCi0gICAgICogVGhlIENvbnN0YW50IFNSQ19JTiBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFydCBvZiB0aGUgc291cmNlIGx5aW5nIAotICAgICAqIGluc2lkZSBvZiB0aGUgZGVzdGluYXRpb24gcmVwbGFjZXMgdGhlIGRlc3RpbmF0aW9uIChQb3J0ZXItRHVmZiAKLSAgICAgKiBTb3VyY2UgSW4gRGVzdGluYXRpb24gcnVsZSkuCisgICAgICogVGhlIENvbnN0YW50IFNSQ19JTiBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFydCBvZiB0aGUgc291cmNlIGx5aW5nIGluc2lkZSBvZgorICAgICAqIHRoZSBkZXN0aW5hdGlvbiByZXBsYWNlcyB0aGUgZGVzdGluYXRpb24gKFBvcnRlci1EdWZmIFNvdXJjZSBJbgorICAgICAqIERlc3RpbmF0aW9uIHJ1bGUpLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNSQ19JTiA9IDU7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IERTVF9JTiBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFydCBvZiB0aGUgZGVzdGluYXRpb24gCi0gICAgICogbHlpbmcgaW5zaWRlIG9mIHRoZSBzb3VyY2UgcmVwbGFjZXMgdGhlIGRlc3RpbmF0aW9uIAotICAgICAqIChQb3J0ZXItRHVmZiBEZXN0aW5hdGlvbiBJbiBTb3VyY2UgcnVsZSkuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IERTVF9JTiBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFydCBvZiB0aGUgZGVzdGluYXRpb24gbHlpbmcKKyAgICAgKiBpbnNpZGUgb2YgdGhlIHNvdXJjZSByZXBsYWNlcyB0aGUgZGVzdGluYXRpb24gKFBvcnRlci1EdWZmIERlc3RpbmF0aW9uIEluCisgICAgICogU291cmNlIHJ1bGUpLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERTVF9JTiA9IDY7CiAKICAgICAvKioKLSAgICAgKiBUaGUgQ29uc3RhbnQgU1JDX09VVCBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFydCBvZiB0aGUgc291cmNlIGx5aW5nIAotICAgICAqIG91dHNpZGUgb2YgdGhlIGRlc3RpbmF0aW9uIHJlcGxhY2VzIHRoZSBkZXN0aW5hdGlvbiAoUG9ydGVyLUR1ZmYgCi0gICAgICogU291cmNlIEhlbGQgT3V0IEJ5IERlc3RpbmF0aW9uIHJ1bGUpLgorICAgICAqIFRoZSBDb25zdGFudCBTUkNfT1VUIGluZGljYXRlcyB0aGF0IHRoZSBwYXJ0IG9mIHRoZSBzb3VyY2UgbHlpbmcgb3V0c2lkZQorICAgICAqIG9mIHRoZSBkZXN0aW5hdGlvbiByZXBsYWNlcyB0aGUgZGVzdGluYXRpb24gKFBvcnRlci1EdWZmIFNvdXJjZSBIZWxkIE91dAorICAgICAqIEJ5IERlc3RpbmF0aW9uIHJ1bGUpLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNSQ19PVVQgPSA3OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBEU1RfT1VUIGluZGljYXRlcyB0aGF0IHRoZSBwYXJ0IG9mIHRoZSBkZXN0aW5hdGlvbiAKLSAgICAgKiBseWluZyBvdXRzaWRlIG9mIHRoZSBzb3VyY2UgcmVwbGFjZXMgdGhlIGRlc3RpbmF0aW9uIChQb3J0ZXItRHVmZiAKLSAgICAgKiBEZXN0aW5hdGlvbiBIZWxkIE91dCBCeSBTb3VyY2UgcnVsZSkuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IERTVF9PVVQgaW5kaWNhdGVzIHRoYXQgdGhlIHBhcnQgb2YgdGhlIGRlc3RpbmF0aW9uIGx5aW5nCisgICAgICogb3V0c2lkZSBvZiB0aGUgc291cmNlIHJlcGxhY2VzIHRoZSBkZXN0aW5hdGlvbiAoUG9ydGVyLUR1ZmYgRGVzdGluYXRpb24KKyAgICAgKiBIZWxkIE91dCBCeSBTb3VyY2UgcnVsZSkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFNUX09VVCA9IDg7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFNSQ19BVE9QIGluZGljYXRlcyB0aGF0IHRoZSBwYXJ0IG9mIHRoZSBzb3VyY2UgbHlpbmcgCi0gICAgICogaW5zaWRlIG9mIHRoZSBkZXN0aW5hdGlvbiBpcyBjb21wb3NpdGVkIG9udG8gdGhlIGRlc3RpbmF0aW9uIAotICAgICAqIChQb3J0ZXItRHVmZiBTb3VyY2UgQXRvcCBEZXN0aW5hdGlvbiBydWxlKS4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU1JDX0FUT1AgaW5kaWNhdGVzIHRoYXQgdGhlIHBhcnQgb2YgdGhlIHNvdXJjZSBseWluZyBpbnNpZGUKKyAgICAgKiBvZiB0aGUgZGVzdGluYXRpb24gaXMgY29tcG9zaXRlZCBvbnRvIHRoZSBkZXN0aW5hdGlvbiAoUG9ydGVyLUR1ZmYgU291cmNlCisgICAgICogQXRvcCBEZXN0aW5hdGlvbiBydWxlKS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUkNfQVRPUCA9IDEwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBEU1RfQVRPUCBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFydCBvZiB0aGUgZGVzdGluYXRpb24gCi0gICAgICogbHlpbmcgaW5zaWRlIG9mIHRoZSBzb3VyY2UgaXMgY29tcG9zaXRlZCBvdmVyIHRoZSBzb3VyY2UgYW5kIHJlcGxhY2VzIAotICAgICAqIHRoZSBkZXN0aW5hdGlvbiAoUG9ydGVyLUR1ZmYgRGVzdGluYXRpb24gQXRvcCBTb3VyY2UgcnVsZSkuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IERTVF9BVE9QIGluZGljYXRlcyB0aGF0IHRoZSBwYXJ0IG9mIHRoZSBkZXN0aW5hdGlvbiBseWluZworICAgICAqIGluc2lkZSBvZiB0aGUgc291cmNlIGlzIGNvbXBvc2l0ZWQgb3ZlciB0aGUgc291cmNlIGFuZCByZXBsYWNlcyB0aGUKKyAgICAgKiBkZXN0aW5hdGlvbiAoUG9ydGVyLUR1ZmYgRGVzdGluYXRpb24gQXRvcCBTb3VyY2UgcnVsZSkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFNUX0FUT1AgPSAxMTsKIAogICAgIC8qKgotICAgICAqIFRoZSBDb25zdGFudCBYT1IgaW5kaWNhdGVzIHRoYXQgdGhlIHBhcnQgb2YgdGhlIHNvdXJjZSB0aGF0IGxpZXMgCi0gICAgICogb3V0c2lkZSBvZiB0aGUgZGVzdGluYXRpb24gaXMgY29tYmluZWQgd2l0aCB0aGUgcGFydCBvZiB0aGUgZGVzdGluYXRpb24gCi0gICAgICogdGhhdCBsaWVzIG91dHNpZGUgb2YgdGhlIHNvdXJjZSAoUG9ydGVyLUR1ZmYgU291cmNlIFhvciBEZXN0aW5hdGlvbiBydWxlKS4KKyAgICAgKiBUaGUgQ29uc3RhbnQgWE9SIGluZGljYXRlcyB0aGF0IHRoZSBwYXJ0IG9mIHRoZSBzb3VyY2UgdGhhdCBsaWVzIG91dHNpZGUKKyAgICAgKiBvZiB0aGUgZGVzdGluYXRpb24gaXMgY29tYmluZWQgd2l0aCB0aGUgcGFydCBvZiB0aGUgZGVzdGluYXRpb24gdGhhdCBsaWVzCisgICAgICogb3V0c2lkZSBvZiB0aGUgc291cmNlIChQb3J0ZXItRHVmZiBTb3VyY2UgWG9yIERlc3RpbmF0aW9uIHJ1bGUpLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhPUiA9IDEyOwogCi0gICAgLyoqIEFscGhhQ29tcG9zaXRlIG9iamVjdCB3aXRoIHRoZSBvcGFxdWUgQ0xFQVIgcnVsZSBhbmQgYW4gYWxwaGEgb2YgMS4wZi4gKi8KKyAgICAvKioKKyAgICAgKiBBbHBoYUNvbXBvc2l0ZSBvYmplY3Qgd2l0aCB0aGUgb3BhcXVlIENMRUFSIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbHBoYUNvbXBvc2l0ZSBDbGVhciA9IG5ldyBBbHBoYUNvbXBvc2l0ZShDTEVBUik7CiAKLSAgICAvKiogQWxwaGFDb21wb3NpdGUgb2JqZWN0IHdpdGggdGhlIG9wYXF1ZSBTUkMgcnVsZSBhbmQgYW4gYWxwaGEgb2YgMS4wZi4gKi8KKyAgICAvKioKKyAgICAgKiBBbHBoYUNvbXBvc2l0ZSBvYmplY3Qgd2l0aCB0aGUgb3BhcXVlIFNSQyBydWxlIGFuZCBhbiBhbHBoYSBvZiAxLjBmLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWxwaGFDb21wb3NpdGUgU3JjID0gbmV3IEFscGhhQ29tcG9zaXRlKFNSQyk7CiAKLSAgICAvKiogQWxwaGFDb21wb3NpdGUgb2JqZWN0IHdpdGggdGhlIG9wYXF1ZSBEU1QgcnVsZSBhbmQgYW4gYWxwaGEgb2YgMS4wZi4gKi8KKyAgICAvKioKKyAgICAgKiBBbHBoYUNvbXBvc2l0ZSBvYmplY3Qgd2l0aCB0aGUgb3BhcXVlIERTVCBydWxlIGFuZCBhbiBhbHBoYSBvZiAxLjBmLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWxwaGFDb21wb3NpdGUgRHN0ID0gbmV3IEFscGhhQ29tcG9zaXRlKERTVCk7CiAKLSAgICAvKiogQWxwaGFDb21wb3NpdGUgb2JqZWN0IHdpdGggdGhlIG9wYXF1ZSBTUkNfT1ZFUiBydWxlIGFuZCBhbiBhbHBoYSBvZiAxLjBmLiAqLworICAgIC8qKgorICAgICAqIEFscGhhQ29tcG9zaXRlIG9iamVjdCB3aXRoIHRoZSBvcGFxdWUgU1JDX09WRVIgcnVsZSBhbmQgYW4gYWxwaGEgb2YgMS4wZi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFscGhhQ29tcG9zaXRlIFNyY092ZXIgPSBuZXcgQWxwaGFDb21wb3NpdGUoU1JDX09WRVIpOwogCi0gICAgLyoqIEFscGhhQ29tcG9zaXRlIG9iamVjdCB3aXRoIHRoZSBvcGFxdWUgRFNUX09WRVIgcnVsZSBhbmQgYW4gYWxwaGEgb2YgMS4wZi4gKi8KKyAgICAvKioKKyAgICAgKiBBbHBoYUNvbXBvc2l0ZSBvYmplY3Qgd2l0aCB0aGUgb3BhcXVlIERTVF9PVkVSIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbHBoYUNvbXBvc2l0ZSBEc3RPdmVyID0gbmV3IEFscGhhQ29tcG9zaXRlKERTVF9PVkVSKTsKIAotICAgIC8qKiBBbHBoYUNvbXBvc2l0ZSBvYmplY3Qgd2l0aCB0aGUgb3BhcXVlIFNSQ19JTiBydWxlIGFuZCBhbiBhbHBoYSBvZiAxLjBmLiAqLworICAgIC8qKgorICAgICAqIEFscGhhQ29tcG9zaXRlIG9iamVjdCB3aXRoIHRoZSBvcGFxdWUgU1JDX0lOIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbHBoYUNvbXBvc2l0ZSBTcmNJbiA9IG5ldyBBbHBoYUNvbXBvc2l0ZShTUkNfSU4pOwogCi0gICAgLyoqIEFscGhhQ29tcG9zaXRlIG9iamVjdCB3aXRoIHRoZSBvcGFxdWUgRFNUX0lOIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuICovCisgICAgLyoqCisgICAgICogQWxwaGFDb21wb3NpdGUgb2JqZWN0IHdpdGggdGhlIG9wYXF1ZSBEU1RfSU4gcnVsZSBhbmQgYW4gYWxwaGEgb2YgMS4wZi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFscGhhQ29tcG9zaXRlIERzdEluID0gbmV3IEFscGhhQ29tcG9zaXRlKERTVF9JTik7CiAKLSAgICAvKiogQWxwaGFDb21wb3NpdGUgb2JqZWN0IHdpdGggdGhlIG9wYXF1ZSBTUkNfT1VUIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuICovCisgICAgLyoqCisgICAgICogQWxwaGFDb21wb3NpdGUgb2JqZWN0IHdpdGggdGhlIG9wYXF1ZSBTUkNfT1VUIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbHBoYUNvbXBvc2l0ZSBTcmNPdXQgPSBuZXcgQWxwaGFDb21wb3NpdGUoU1JDX09VVCk7CiAKLSAgICAvKiogQWxwaGFDb21wb3NpdGUgb2JqZWN0IHdpdGggdGhlIG9wYXF1ZSBEU1RfT1VUIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuICovCisgICAgLyoqCisgICAgICogQWxwaGFDb21wb3NpdGUgb2JqZWN0IHdpdGggdGhlIG9wYXF1ZSBEU1RfT1VUIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbHBoYUNvbXBvc2l0ZSBEc3RPdXQgPSBuZXcgQWxwaGFDb21wb3NpdGUoRFNUX09VVCk7CiAKLSAgICAvKiogQWxwaGFDb21wb3NpdGUgb2JqZWN0IHdpdGggdGhlIG9wYXF1ZSBTUkNfQVRPUCBydWxlIGFuZCBhbiBhbHBoYSBvZiAxLjBmLiAqLworICAgIC8qKgorICAgICAqIEFscGhhQ29tcG9zaXRlIG9iamVjdCB3aXRoIHRoZSBvcGFxdWUgU1JDX0FUT1AgcnVsZSBhbmQgYW4gYWxwaGEgb2YgMS4wZi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFscGhhQ29tcG9zaXRlIFNyY0F0b3AgPSBuZXcgQWxwaGFDb21wb3NpdGUoU1JDX0FUT1ApOwogCi0gICAgLyoqIEFscGhhQ29tcG9zaXRlIG9iamVjdCB3aXRoIHRoZSBvcGFxdWUgRFNUX0FUT1AgcnVsZSBhbmQgYW4gYWxwaGEgb2YgMS4wZi4gKi8KKyAgICAvKioKKyAgICAgKiBBbHBoYUNvbXBvc2l0ZSBvYmplY3Qgd2l0aCB0aGUgb3BhcXVlIERTVF9BVE9QIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbHBoYUNvbXBvc2l0ZSBEc3RBdG9wID0gbmV3IEFscGhhQ29tcG9zaXRlKERTVF9BVE9QKTsKIAotICAgIC8qKiBBbHBoYUNvbXBvc2l0ZSBvYmplY3Qgd2l0aCB0aGUgb3BhcXVlIFhPUiBydWxlIGFuZCBhbiBhbHBoYSBvZiAxLjBmLiAqLworICAgIC8qKgorICAgICAqIEFscGhhQ29tcG9zaXRlIG9iamVjdCB3aXRoIHRoZSBvcGFxdWUgWE9SIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbHBoYUNvbXBvc2l0ZSBYb3IgPSBuZXcgQWxwaGFDb21wb3NpdGUoWE9SKTsKIAotICAgIC8qKiBUaGUgcnVsZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcnVsZS4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBydWxlOwotICAgIAotICAgIC8qKiBUaGUgYWxwaGEuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgYWxwaGEuCisgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCBhbHBoYTsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBhbHBoYSBjb21wb3NpdGUuCi0gICAgICogQ3JlYXRlcyBhIGNvbnRleHQgZm9yIHRoZSBjb21wb3NpdGluZyBvcGVyYXRpb24uIFRoZSBjb250ZXh0IGNvbnRhaW5zIHN0YXRlIHRoYXQgaXMgdXNlZCBpbiBwZXJmb3JtaW5nIHRoZSBjb21wb3NpdGluZyBvcGVyYXRpb24uCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGFscGhhIGNvbXBvc2l0ZS4gQ3JlYXRlcyBhIGNvbnRleHQgZm9yIHRoZSBjb21wb3NpdGluZworICAgICAqIG9wZXJhdGlvbi4gVGhlIGNvbnRleHQgY29udGFpbnMgc3RhdGUgdGhhdCBpcyB1c2VkIGluIHBlcmZvcm1pbmcgdGhlCisgICAgICogY29tcG9zaXRpbmcgb3BlcmF0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBydWxlIHRoZSBydWxlCi0gICAgICogQHBhcmFtIGFscGhhIHRoZSBhbHBoYQorICAgICAqIEBwYXJhbSBydWxlCisgICAgICogICAgICAgICAgICB0aGUgcnVsZS4KKyAgICAgKiBAcGFyYW0gYWxwaGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbHBoYS4KICAgICAgKi8KLSAgICBwcml2YXRlIEFscGhhQ29tcG9zaXRlKGludCBydWxlLCBmbG9hdCBhbHBoYSl7Ci0gICAgICAgIGlmKHJ1bGUgPCBDTEVBUiB8fCBydWxlID4gWE9SKSB7CisgICAgcHJpdmF0ZSBBbHBoYUNvbXBvc2l0ZShpbnQgcnVsZSwgZmxvYXQgYWxwaGEpIHsKKyAgICAgICAgaWYgKHJ1bGUgPCBDTEVBUiB8fCBydWxlID4gWE9SKSB7CiAgICAgICAgICAgICAvLyBhd3QuMTFEPVVua25vd24gcnVsZQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xMUQiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQotICAgICAgICBpZihhbHBoYSA8IDAuMGYgfHwgYWxwaGEgPiAxLjBmKSB7CisgICAgICAgIGlmIChhbHBoYSA8IDAuMGYgfHwgYWxwaGEgPiAxLjBmKSB7CiAgICAgICAgICAgICAvLyBhd3QuMTFFPVdyb25nIGFscGhhIHZhbHVlCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjExRSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CkBAIC0xODEsNDEgKzIxNSw0NCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBhbHBoYSBjb21wb3NpdGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJ1bGUgdGhlIHJ1bGUKKyAgICAgKiBAcGFyYW0gcnVsZQorICAgICAqICAgICAgICAgICAgdGhlIHJ1bGUuCiAgICAgICovCi0gICAgcHJpdmF0ZSBBbHBoYUNvbXBvc2l0ZShpbnQgcnVsZSl7CisgICAgcHJpdmF0ZSBBbHBoYUNvbXBvc2l0ZShpbnQgcnVsZSkgewogICAgICAgICB0aGlzKHJ1bGUsIDEuMGYpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBDb21wb3NpdGVDb250ZXh0IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIENvbG9yTW9kZWwsCi0gICAgICogZGVzdGluYXRpb24gQ29sb3JNb2RlbCBhbmQgUmVuZGVyaW5nSGludHMgcGFyYW1ldGVycyBmb3IgYSBjb21wb3NpbmcgCisgICAgICogZGVzdGluYXRpb24gQ29sb3JNb2RlbCBhbmQgUmVuZGVyaW5nSGludHMgcGFyYW1ldGVycyBmb3IgYSBjb21wb3NpbmcKICAgICAgKiBvcGVyYXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyY0NvbG9yTW9kZWwgdGhlIHNvdXJjZSdzIENvbG9yTW9kZWwuCi0gICAgICogQHBhcmFtIGRzdENvbG9yTW9kZWwgdGhlIGRlc3RpbmF0aW9uJ3MgQ29sb3JNb2RlbC4KLSAgICAgKiBAcGFyYW0gaGludHMgdGhlIFJlbmRlcmluZ0hpbnRzIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBDb21wb3NpdGVDb250ZXh0IG9iamVjdC4gICAgCi0gICAgICogCi0gICAgICogQHNlZSBqYXZhLmF3dC5Db21wb3NpdGUjY3JlYXRlQ29udGV4dChqYXZhLmF3dC5pbWFnZS5Db2xvck1vZGVsLCBqYXZhLmF3dC5pbWFnZS5Db2xvck1vZGVsLCBqYXZhLmF3dC5SZW5kZXJpbmdIaW50cykKKyAgICAgKiBAcGFyYW0gc3JjQ29sb3JNb2RlbAorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSdzIENvbG9yTW9kZWwuCisgICAgICogQHBhcmFtIGRzdENvbG9yTW9kZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbidzIENvbG9yTW9kZWwuCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0LgorICAgICAqIEByZXR1cm4gdGhlIENvbXBvc2l0ZUNvbnRleHQgb2JqZWN0LgorICAgICAqIEBzZWUgamF2YS5hd3QuQ29tcG9zaXRlI2NyZWF0ZUNvbnRleHQoamF2YS5hd3QuaW1hZ2UuQ29sb3JNb2RlbCwKKyAgICAgKiAgICAgIGphdmEuYXd0LmltYWdlLkNvbG9yTW9kZWwsIGphdmEuYXd0LlJlbmRlcmluZ0hpbnRzKQogICAgICAqLwotICAgIHB1YmxpYyBDb21wb3NpdGVDb250ZXh0IGNyZWF0ZUNvbnRleHQoQ29sb3JNb2RlbCBzcmNDb2xvck1vZGVsLAotICAgICAgICAgICAgQ29sb3JNb2RlbCBkc3RDb2xvck1vZGVsLCBSZW5kZXJpbmdIaW50cyBoaW50cykgeworICAgIHB1YmxpYyBDb21wb3NpdGVDb250ZXh0IGNyZWF0ZUNvbnRleHQoQ29sb3JNb2RlbCBzcmNDb2xvck1vZGVsLCBDb2xvck1vZGVsIGRzdENvbG9yTW9kZWwsCisgICAgICAgICAgICBSZW5kZXJpbmdIaW50cyBoaW50cykgewogICAgICAgICByZXR1cm4gbmV3IElDb21wb3NpdGVDb250ZXh0KHRoaXMsIHNyY0NvbG9yTW9kZWwsIGRzdENvbG9yTW9kZWwpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENvbXBhcmVzIHRoZSBBbHBoYUNvbXBvc2l0ZSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBBbHBoYUNvbXBvc2l0ZSBvYmplY3QgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZAotICAgICAqIG9iamVjdC4KKyAgICAgKiAgICAgICAgIG9iamVjdC4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZighKG9iaiBpbnN0YW5jZW9mIEFscGhhQ29tcG9zaXRlKSkgeworICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBBbHBoYUNvbXBvc2l0ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBBbHBoYUNvbXBvc2l0ZSBvdGhlciA9IChBbHBoYUNvbXBvc2l0ZSlvYmo7CkBAIC0yNDcsMTEgKzI4NCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGFscGhhIHZhbHVlIG9mIHRoaXMgQWxwaGFDb21wb3NpdGUgb2JqZWN0OyByZXR1cm5zIDEuMCBpZiAKLSAgICAgKiB0aGlzIEFscGhhQ29tcG9zaXRlIG9iamVjdCBkb2Vzbid0IGhhdmUgYWxwaGEgdmFsdWUuCisgICAgICogR2V0cyB0aGUgYWxwaGEgdmFsdWUgb2YgdGhpcyBBbHBoYUNvbXBvc2l0ZSBvYmplY3Q7IHJldHVybnMgMS4wIGlmIHRoaXMKKyAgICAgKiBBbHBoYUNvbXBvc2l0ZSBvYmplY3QgZG9lc24ndCBoYXZlIGFscGhhIHZhbHVlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFscGhhIHZhbHVlIG9mIHRoaXMgQWxwaGFDb21wb3NpdGUgb2JqZWN0IG9yIDEuMCBpZiAKLSAgICAgKiB0aGlzIEFscGhhQ29tcG9zaXRlIG9iamVjdCBkb2Vzbid0IGhhdmUgYWxwaGEgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgYWxwaGEgdmFsdWUgb2YgdGhpcyBBbHBoYUNvbXBvc2l0ZSBvYmplY3Qgb3IgMS4wIGlmIHRoaXMKKyAgICAgKiAgICAgICAgIEFscGhhQ29tcG9zaXRlIG9iamVjdCBkb2Vzbid0IGhhdmUgYWxwaGEgdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldEFscGhhKCkgewogICAgICAgICByZXR1cm4gYWxwaGE7CkBAIC0yNjAsMTMgKzI5NywxNCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIEFscGhhQ29tcG9zaXRlIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBydWxlIGFuZCBhbHBoYSB2YWx1ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcnVsZSB0aGUgY29tcG9zaXRpbmcgcnVsZS4KLSAgICAgKiBAcGFyYW0gYWxwaGEgdGhlIGFscGhhIHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gQWxwaGFDb21wb3NpdGUgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHJ1bGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb21wb3NpdGluZyBydWxlLgorICAgICAqIEBwYXJhbSBhbHBoYQorICAgICAqICAgICAgICAgICAgdGhlIGFscGhhIHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIEFscGhhQ29tcG9zaXRlIGluc3RhbmNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQWxwaGFDb21wb3NpdGUgZ2V0SW5zdGFuY2UoaW50IHJ1bGUsIGZsb2F0IGFscGhhKSB7Ci0gICAgICAgIGlmKGFscGhhID09IDEuMGYpIHsKKyAgICAgICAgaWYgKGFscGhhID09IDEuMGYpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRJbnN0YW5jZShydWxlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbmV3IEFscGhhQ29tcG9zaXRlKHJ1bGUsIGFscGhhKTsKQEAgLTI3NSw0MSArMzEzLDQwIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgQWxwaGFDb21wb3NpdGUgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHJ1bGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJ1bGUgdGhlIGNvbXBvc2l0aW5nIHJ1bGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBBbHBoYUNvbXBvc2l0ZSBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gcnVsZQorICAgICAqICAgICAgICAgICAgdGhlIGNvbXBvc2l0aW5nIHJ1bGUuCisgICAgICogQHJldHVybiB0aGUgQWxwaGFDb21wb3NpdGUgaW5zdGFuY2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBBbHBoYUNvbXBvc2l0ZSBnZXRJbnN0YW5jZShpbnQgcnVsZSkgewotICAgICAgICBzd2l0Y2gocnVsZSl7Ci0gICAgICAgIGNhc2UgQ0xFQVI6Ci0gICAgICAgICAgICByZXR1cm4gQ2xlYXI7Ci0gICAgICAgIGNhc2UgU1JDOgotICAgICAgICAgICAgcmV0dXJuIFNyYzsKLSAgICAgICAgY2FzZSBEU1Q6Ci0gICAgICAgICAgICByZXR1cm4gRHN0OwotICAgICAgICBjYXNlIFNSQ19PVkVSOgotICAgICAgICAgICAgcmV0dXJuIFNyY092ZXI7Ci0gICAgICAgIGNhc2UgRFNUX09WRVI6Ci0gICAgICAgICAgICByZXR1cm4gRHN0T3ZlcjsKLSAgICAgICAgY2FzZSBTUkNfSU46Ci0gICAgICAgICAgICByZXR1cm4gU3JjSW47Ci0gICAgICAgIGNhc2UgRFNUX0lOOgotICAgICAgICAgICAgcmV0dXJuIERzdEluOwotICAgICAgICBjYXNlIFNSQ19PVVQ6Ci0gICAgICAgICAgICByZXR1cm4gU3JjT3V0OwotICAgICAgICBjYXNlIERTVF9PVVQ6Ci0gICAgICAgICAgICByZXR1cm4gRHN0T3V0OwotICAgICAgICBjYXNlIFNSQ19BVE9QOgotICAgICAgICAgICAgcmV0dXJuIFNyY0F0b3A7Ci0gICAgICAgIGNhc2UgRFNUX0FUT1A6Ci0gICAgICAgICAgICByZXR1cm4gRHN0QXRvcDsKLSAgICAgICAgY2FzZSBYT1I6Ci0gICAgICAgICAgICByZXR1cm4gWG9yOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYXd0LjExRD1Vbmtub3duIHJ1bGUKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTFEIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgIHN3aXRjaCAocnVsZSkgeworICAgICAgICAgICAgY2FzZSBDTEVBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2xlYXI7CisgICAgICAgICAgICBjYXNlIFNSQzoKKyAgICAgICAgICAgICAgICByZXR1cm4gU3JjOworICAgICAgICAgICAgY2FzZSBEU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIERzdDsKKyAgICAgICAgICAgIGNhc2UgU1JDX09WRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNyY092ZXI7CisgICAgICAgICAgICBjYXNlIERTVF9PVkVSOgorICAgICAgICAgICAgICAgIHJldHVybiBEc3RPdmVyOworICAgICAgICAgICAgY2FzZSBTUkNfSU46CisgICAgICAgICAgICAgICAgcmV0dXJuIFNyY0luOworICAgICAgICAgICAgY2FzZSBEU1RfSU46CisgICAgICAgICAgICAgICAgcmV0dXJuIERzdEluOworICAgICAgICAgICAgY2FzZSBTUkNfT1VUOgorICAgICAgICAgICAgICAgIHJldHVybiBTcmNPdXQ7CisgICAgICAgICAgICBjYXNlIERTVF9PVVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIERzdE91dDsKKyAgICAgICAgICAgIGNhc2UgU1JDX0FUT1A6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNyY0F0b3A7CisgICAgICAgICAgICBjYXNlIERTVF9BVE9QOgorICAgICAgICAgICAgICAgIHJldHVybiBEc3RBdG9wOworICAgICAgICAgICAgY2FzZSBYT1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIFhvcjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gYXd0LjExRD1Vbmtub3duIHJ1bGUKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjExRCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9CYXNpY1N0cm9rZS5qYXZhIGIvYXd0L2phdmEvYXd0L0Jhc2ljU3Ryb2tlLmphdmEKaW5kZXggOTU1ZGM2Yi4uMjQ1NzgxNSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0Jhc2ljU3Ryb2tlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0Jhc2ljU3Ryb2tlLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5hd3QuZ2VvbS5HZW5lcmFsUGF0aDsKQEAgLTI3LDEzOSArMjgsMTg4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lm1pc2MuSGFzaENvZGU7CiAKIC8qKgotICogVGhlIEJhc2ljU3Ryb2tlIGNsYXNzIHNwZWNpZmllcyBhIHNldCBvZiByZW5kZXJpbmcgYXR0cmlidXRlcyBmb3IgdGhlIG91dGxpbmVzIAotICogb2YgZ3JhcGhpY3MgcHJpbWl0aXZlcy4gVGhlIEJhc2ljU3Ryb2tlIGF0dHJpYnV0ZXMgZGVzY3JpYmUgdGhlIHNoYXBlIG9mIHRoZSAKLSAqIHBlbiB3aGljaCBkcmF3cyB0aGUgb3V0bGluZSBvZiBhIFNoYXBlIGFuZCB0aGUgZGVjb3JhdGlvbnMgYXBwbGllZCBhdCB0aGUgZW5kcwotICogYW5kIGpvaW5zIG9mIHBhdGggc2VnbWVudHMgb2YgdGhlIFNoYXBlLiBUaGUgQmFzaWNTdHJva2UgaGFzIHRoZSBmb2xsb3dpbmcKLSAqIHJlbmRlcmluZyBhdHRyaWJ1dGVzOgorICogVGhlIEJhc2ljU3Ryb2tlIGNsYXNzIHNwZWNpZmllcyBhIHNldCBvZiByZW5kZXJpbmcgYXR0cmlidXRlcyBmb3IgdGhlCisgKiBvdXRsaW5lcyBvZiBncmFwaGljcyBwcmltaXRpdmVzLiBUaGUgQmFzaWNTdHJva2UgYXR0cmlidXRlcyBkZXNjcmliZSB0aGUKKyAqIHNoYXBlIG9mIHRoZSBwZW4gd2hpY2ggZHJhd3MgdGhlIG91dGxpbmUgb2YgYSBTaGFwZSBhbmQgdGhlIGRlY29yYXRpb25zCisgKiBhcHBsaWVkIGF0IHRoZSBlbmRzIGFuZCBqb2lucyBvZiBwYXRoIHNlZ21lbnRzIG9mIHRoZSBTaGFwZS4gVGhlIEJhc2ljU3Ryb2tlCisgKiBoYXMgdGhlIGZvbGxvd2luZyByZW5kZXJpbmcgYXR0cmlidXRlczoKICAqIDxwPgogICogPHVsPgotICogPGxpPiBsaW5lIHdpZHRoIC10aGUgcGVuIHdpZHRoIHdoaWNoIGRyYXdzIHRoZSBvdXRsaW5lcy48L2xpPgotICogPGxpPiBlbmQgY2FwcyAtIGluZGljYXRlcyB0aGUgZGVjb3JhdGlvbiBhcHBsaWVkIHRvIHRoZSBlbmRzIG9mIHVuY2xvc2VkIAotICogc3VicGF0aHMgYW5kIGRhc2ggc2VnbWVudHMuIFRoZSBCYXNpY1N0cm9rZSBkZWZpbmVzIHRocmVlIGRpZmZlcmVudCBkZWNvcmF0aW9uczoKLSAqIENBUF9CVVRULCBDQVBfUk9VTkQsIGFuZCBDQVBfU1FVQVJFLjwvbGk+Ci0gKiA8bGk+bGluZSBqb2lucyAtIGluZGljYXRlcyB0aGUgZGVjb3JhdGlvbiBhcHBsaWVkIGF0IHRoZSBpbnRlcnNlY3Rpb24gb2YgCi0gKiB0d28gcGF0aCBzZWdtZW50cyBhbmQgYXQgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgZW5kcG9pbnRzIG9mIGEgc3VicGF0aC4KLSAqIFRoZSBCYXNpY1N0cm9rZSBkZWZpbmVzIHRocmVlIGRlY29yYXRpb25zOiBKT0lOX0JFVkVMLCBKT0lOX01JVEVSLCAKLSAqIGFuZCBKT0lOX1JPVU5ELjwvbGk+Ci0gKiA8bGk+bWl0ZXIgbGltaXQgLSB0aGUgbGltaXQgdG8gdHJpbSBhIGxpbmUgam9pbiB0aGF0IGhhcyBhIEpPSU5fTUlURVIgCisgKiA8bGk+bGluZSB3aWR0aCAtdGhlIHBlbiB3aWR0aCB3aGljaCBkcmF3cyB0aGUgb3V0bGluZXMuPC9saT4KKyAqIDxsaT5lbmQgY2FwcyAtIGluZGljYXRlcyB0aGUgZGVjb3JhdGlvbiBhcHBsaWVkIHRvIHRoZSBlbmRzIG9mIHVuY2xvc2VkCisgKiBzdWJwYXRocyBhbmQgZGFzaCBzZWdtZW50cy4gVGhlIEJhc2ljU3Ryb2tlIGRlZmluZXMgdGhyZWUgZGlmZmVyZW50CisgKiBkZWNvcmF0aW9uczogQ0FQX0JVVFQsIENBUF9ST1VORCwgYW5kIENBUF9TUVVBUkUuPC9saT4KKyAqIDxsaT5saW5lIGpvaW5zIC0gaW5kaWNhdGVzIHRoZSBkZWNvcmF0aW9uIGFwcGxpZWQgYXQgdGhlIGludGVyc2VjdGlvbiBvZiB0d28KKyAqIHBhdGggc2VnbWVudHMgYW5kIGF0IHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIGVuZHBvaW50cyBvZiBhIHN1YnBhdGguIFRoZQorICogQmFzaWNTdHJva2UgZGVmaW5lcyB0aHJlZSBkZWNvcmF0aW9uczogSk9JTl9CRVZFTCwgSk9JTl9NSVRFUiwgYW5kCisgKiBKT0lOX1JPVU5ELjwvbGk+CisgKiA8bGk+bWl0ZXIgbGltaXQgLSB0aGUgbGltaXQgdG8gdHJpbSBhIGxpbmUgam9pbiB0aGF0IGhhcyBhIEpPSU5fTUlURVIKICAqIGRlY29yYXRpb24uPC9saT4KLSAqIDxsaT5kYXNoIGF0dHJpYnV0ZXMgLSB0aGUgZGVmaW5pdGlvbiBvZiBob3cgdG8gbWFrZSBhIGRhc2ggcGF0dGVybiBieSAKLSAqIGFsdGVybmF0aW5nIGJldHdlZW4gb3BhcXVlIGFuZCB0cmFuc3BhcmVudCBzZWN0aW9ucyA8L2xpPgorICogPGxpPmRhc2ggYXR0cmlidXRlcyAtIHRoZSBkZWZpbml0aW9uIG9mIGhvdyB0byBtYWtlIGEgZGFzaCBwYXR0ZXJuIGJ5CisgKiBhbHRlcm5hdGluZyBiZXR3ZWVuIG9wYXF1ZSBhbmQgdHJhbnNwYXJlbnQgc2VjdGlvbnM8L2xpPgogICogPC91bD4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBCYXNpY1N0cm9rZSBpbXBsZW1lbnRzIFN0cm9rZSB7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IENBUF9CVVRUIGluZGljYXRlcyB0aGUgZW5kcyBvZiB1bmNsb3NlZCBzdWJwYXRocyAKLSAgICAgKiBhbmQgZGFzaCBzZWdtZW50cyBoYXZlIG5vIGFkZGVkIGRlY29yYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENBUF9CVVRUIGluZGljYXRlcyB0aGUgZW5kcyBvZiB1bmNsb3NlZCBzdWJwYXRocyBhbmQgZGFzaAorICAgICAqIHNlZ21lbnRzIGhhdmUgbm8gYWRkZWQgZGVjb3JhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBfQlVUVCA9IDA7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBDQVBfUk9VTkQgaW5kaWNhdGVzIHRoZSBlbmRzIG9mIHVuY2xvc2VkIHN1YnBhdGhzIAotICAgICAqIGFuZCBkYXNoIHNlZ21lbnRzIGhhdmUgYSByb3VuZCBkZWNvcmF0aW9uLgorCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENBUF9ST1VORCBpbmRpY2F0ZXMgdGhlIGVuZHMgb2YgdW5jbG9zZWQgc3VicGF0aHMgYW5kIGRhc2gKKyAgICAgKiBzZWdtZW50cyBoYXZlIGEgcm91bmQgZGVjb3JhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBfUk9VTkQgPSAxOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgQ0FQX1NRVUFSRSBpbmRpY2F0ZXMgdGhlIGVuZHMgb2YgdW5jbG9zZWQgc3VicGF0aHMgCi0gICAgICogYW5kIGRhc2ggc2VnbWVudHMgaGF2ZSBhIHNxdWFyZSBwcm9qZWN0aW9uLgorCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENBUF9TUVVBUkUgaW5kaWNhdGVzIHRoZSBlbmRzIG9mIHVuY2xvc2VkIHN1YnBhdGhzIGFuZCBkYXNoCisgICAgICogc2VnbWVudHMgaGF2ZSBhIHNxdWFyZSBwcm9qZWN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUF9TUVVBUkUgPSAyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBKT0lOX01JVEVSIGluZGljYXRlcyB0aGF0IHBhdGggc2VnbWVudHMgYXJlIGpvaW5lZCBieSAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgSk9JTl9NSVRFUiBpbmRpY2F0ZXMgdGhhdCBwYXRoIHNlZ21lbnRzIGFyZSBqb2luZWQgYnkKICAgICAgKiBleHRlbmRpbmcgdGhlaXIgb3V0c2lkZSBlZGdlcyB1bnRpbCB0aGV5IG1lZXQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSk9JTl9NSVRFUiA9IDA7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBKT0lOX1JPVU5EIGluZGljYXRlcyB0aGF0IHBhdGggc2VnbWVudHMgYXJlIGpvaW5lZCBieSAKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBKT0lOX1JPVU5EIGluZGljYXRlcyB0aGF0IHBhdGggc2VnbWVudHMgYXJlIGpvaW5lZCBieQogICAgICAqIHJvdW5kaW5nIG9mZiB0aGUgY29ybmVyIGF0IGEgcmFkaXVzIG9mIGhhbGYgdGhlIGxpbmUgd2lkdGguCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSk9JTl9ST1VORCA9IDE7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBKT0lOX0JFVkVMIGluZGljYXRlcyB0aGF0IHBhdGggc2VnbWVudHMgYXJlIGpvaW5lZCBieSAKLSAgICAgKiBjb25uZWN0aW5nIHRoZSBvdXRlciBjb3JuZXJzIG9mIHRoZWlyIHdpZGUgb3V0bGluZXMgd2l0aCAKLSAgICAgKiBhIHN0cmFpZ2h0IHNlZ21lbnQuCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgSk9JTl9CRVZFTCBpbmRpY2F0ZXMgdGhhdCBwYXRoIHNlZ21lbnRzIGFyZSBqb2luZWQgYnkKKyAgICAgKiBjb25uZWN0aW5nIHRoZSBvdXRlciBjb3JuZXJzIG9mIHRoZWlyIHdpZGUgb3V0bGluZXMgd2l0aCBhIHN0cmFpZ2h0CisgICAgICogc2VnbWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKT0lOX0JFVkVMID0gMjsKLSAgICAKLSAgICAvKiogQ29uc3RhbnRzIGZvciBjYWxjdWxhdGluZy4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9MRVZFTCA9IDIwOyAgICAgICAgLy8gTWF4aW1hbCBkZWVwbmVzcyBvZiBjdXJ2ZSBzdWJkaXZpc2lvbgotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQ1VSVkVfREVMVEEuICovCi0gICAgc3RhdGljIGZpbmFsIGRvdWJsZSBDVVJWRV9ERUxUQSA9IDIuMDsgIC8vIFdpZHRoIHRvbGVyYW5jZQotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQ09STkVSX0FOR0xFLiAqLworCisgICAgLyoqCisgICAgICogQ29uc3RhbnRzIGZvciBjYWxjdWxhdGluZy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9MRVZFTCA9IDIwOyAvLyBNYXhpbWFsIGRlZXBuZXNzIG9mIGN1cnZlIHN1YmRpdmlzaW9uCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ1VSVkVfREVMVEEuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGRvdWJsZSBDVVJWRV9ERUxUQSA9IDIuMDsgLy8gV2lkdGggdG9sZXJhbmNlCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ09STkVSX0FOR0xFLgorICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBkb3VibGUgQ09STkVSX0FOR0xFID0gNC4wOyAvLyBNaW5pbXVtIGNvcm5lciBhbmdsZQotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQ09STkVSX1pFUk8uICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ09STkVSX1pFUk8uCisgICAgICovCiAgICAgc3RhdGljIGZpbmFsIGRvdWJsZSBDT1JORVJfWkVSTyA9IDAuMDE7IC8vIFplcm8gYW5nbGUKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IENVQklDX0FSQy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDVUJJQ19BUkMuCisgICAgICovCiAgICAgc3RhdGljIGZpbmFsIGRvdWJsZSBDVUJJQ19BUkMgPSA0LjAgLyAzLjAgKiAoTWF0aC5zcXJ0KDIuMCkgLSAxKTsKIAotICAgIC8qKiBTdHJva2Ugd2lkdGguICovCisgICAgLyoqCisgICAgICogU3Ryb2tlIHdpZHRoLgorICAgICAqLwogICAgIGZsb2F0IHdpZHRoOwotICAgIAotICAgIC8qKiBTdHJva2UgY2FwIHR5cGUuICovCisKKyAgICAvKioKKyAgICAgKiBTdHJva2UgY2FwIHR5cGUuCisgICAgICovCiAgICAgaW50IGNhcDsKLSAgICAKLSAgICAvKiogU3Ryb2tlIGpvaW4gdHlwZS4gKi8KKworICAgIC8qKgorICAgICAqIFN0cm9rZSBqb2luIHR5cGUuCisgICAgICovCiAgICAgaW50IGpvaW47Ci0gICAgCi0gICAgLyoqIFN0cm9rZSBtaXRlciBsaW1pdC4gKi8KKworICAgIC8qKgorICAgICAqIFN0cm9rZSBtaXRlciBsaW1pdC4KKyAgICAgKi8KICAgICBmbG9hdCBtaXRlckxpbWl0OwotICAgIAotICAgIC8qKiBTdHJva2UgZGFzaGVzIGFycmF5LiAqLworCisgICAgLyoqCisgICAgICogU3Ryb2tlIGRhc2hlcyBhcnJheS4KKyAgICAgKi8KICAgICBmbG9hdCBkYXNoW107Ci0gICAgCi0gICAgLyoqIFN0cm9rZSBkYXNoIHBoYXNlLiAqLworCisgICAgLyoqCisgICAgICogU3Ryb2tlIGRhc2ggcGhhc2UuCisgICAgICovCiAgICAgZmxvYXQgZGFzaFBoYXNlOwogCi0gICAgLyoqIFRoZSB0ZW1wb3JhcnkgcHJlLWNhbGN1bGF0ZWQgdmFsdWVzLiAqLworICAgIC8qKgorICAgICAqIFRoZSB0ZW1wb3JhcnkgcHJlLWNhbGN1bGF0ZWQgdmFsdWVzLgorICAgICAqLwogICAgIGRvdWJsZSBjdXJ2ZURlbHRhOwotICAgIAotICAgIC8qKiBUaGUgY29ybmVyIGRlbHRhLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGNvcm5lciBkZWx0YS4KKyAgICAgKi8KICAgICBkb3VibGUgY29ybmVyRGVsdGE7Ci0gICAgCi0gICAgLyoqIFRoZSB6ZXJvIGRlbHRhLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHplcm8gZGVsdGEuCisgICAgICovCiAgICAgZG91YmxlIHplcm9EZWx0YTsKIAotICAgIC8qKiBUaGUgdzIuICovCisgICAgLyoqCisgICAgICogVGhlIHcyLgorICAgICAqLwogICAgIGRvdWJsZSB3MjsKLSAgICAKLSAgICAvKiogVGhlIGZteS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBmbXkuCisgICAgICovCiAgICAgZG91YmxlIGZteCwgZm15OwotICAgIAotICAgIC8qKiBUaGUgc215LiAqLworCisgICAgLyoqCisgICAgICogVGhlIHNteS4KKyAgICAgKi8KICAgICBkb3VibGUgc2N4LCBzY3ksIHNteCwgc215OwotICAgIAotICAgIC8qKiBUaGUgY3kuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgY3kuCisgICAgICovCiAgICAgZG91YmxlIG14LCBteSwgY3gsIGN5OwogCi0gICAgLyoqIFRoZSB0ZW1wb3JhcnkgaW5kaWNhdG9ycy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgdGVtcG9yYXJ5IGluZGljYXRvcnMuCisgICAgICovCiAgICAgYm9vbGVhbiBpc01vdmU7Ci0gICAgCi0gICAgLyoqIFRoZSBpcyBmaXJzdC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBpcyBmaXJzdC4KKyAgICAgKi8KICAgICBib29sZWFuIGlzRmlyc3Q7Ci0gICAgCi0gICAgLyoqIFRoZSBjaGVjayBtb3ZlLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGNoZWNrIG1vdmUuCisgICAgICovCiAgICAgYm9vbGVhbiBjaGVja01vdmU7Ci0gICAgCi0gICAgLyoqIFRoZSB0ZW1wb3JhcnkgYW5kIGRlc3RpbmF0aW9uIHdvcmsgcGF0aHMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGVtcG9yYXJ5IGFuZCBkZXN0aW5hdGlvbiB3b3JrIHBhdGhzLgorICAgICAqLwogICAgIEJ1ZmZlcmVkUGF0aCBkc3QsIGxwLCBycCwgc3A7Ci0gICAgCi0gICAgLyoqIFN0cm9rZSBkYXNoZXIgY2xhc3MuICovCisKKyAgICAvKioKKyAgICAgKiBTdHJva2UgZGFzaGVyIGNsYXNzLgorICAgICAqLwogICAgIERhc2hlciBkYXNoZXI7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQmFzaWNTdHJva2Ugd2l0aCBkZWZhdWx0IHdpZHRoLCBjYXAsIGpvaW4sIGxpbWl0LAotICAgICAqIGRhc2ggYXR0cmlidXRlcyBwYXJhbWV0ZXJzLiBUaGUgZGVmYXVsdCBwYXJhbWV0ZXJzIGFyZSBhIHNvbGlkIGxpbmUgb2YgCi0gICAgICogd2lkdGggMS4wLCBDQVBfU1FVQVJFLCBKT0lOX01JVEVSLCBhIG1pdGVyIGxpbWl0IG9mIDEwLjAsIG51bGwgZGFzaCBhdHRyaWJ1dGVzLAorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBCYXNpY1N0cm9rZSB3aXRoIGRlZmF1bHQgd2lkdGgsIGNhcCwgam9pbiwgbGltaXQsIGRhc2gKKyAgICAgKiBhdHRyaWJ1dGVzIHBhcmFtZXRlcnMuIFRoZSBkZWZhdWx0IHBhcmFtZXRlcnMgYXJlIGEgc29saWQgbGluZSBvZiB3aWR0aAorICAgICAqIDEuMCwgQ0FQX1NRVUFSRSwgSk9JTl9NSVRFUiwgYSBtaXRlciBsaW1pdCBvZiAxMC4wLCBudWxsIGRhc2ggYXR0cmlidXRlcywKICAgICAgKiBhbmQgYSBkYXNoIHBoYXNlIG9mIDAuMGYuCiAgICAgICovCiAgICAgcHVibGljIEJhc2ljU3Ryb2tlKCkgewpAQCAtMTY3LDE3ICsyMTcsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQmFzaWNTdHJva2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoLCAgCi0gICAgICogY2Fwcywgam9pbnMsIGxpbWl0LCBkYXNoIGF0dHJpYnV0ZXMsIGRhc2ggcGhhc2UgcGFyYW1ldGVycy4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQmFzaWNTdHJva2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoLCBjYXBzLCBqb2lucywKKyAgICAgKiBsaW1pdCwgZGFzaCBhdHRyaWJ1dGVzLCBkYXNoIHBoYXNlIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiBCYXNpa1N0cm9rZS4KLSAgICAgKiBAcGFyYW0gY2FwIHRoZSBlbmQgZGVjb3JhdGlvbiBvZiBCYXNpa1N0cm9rZS4KLSAgICAgKiBAcGFyYW0gam9pbiB0aGUgam9pbiBzZWdtZW50cyBkZWNvcmF0aW9uLgotICAgICAqIEBwYXJhbSBtaXRlckxpbWl0IHRoZSBsaW1pdCB0byB0cmltIHRoZSBtaXRlciBqb2luLgotICAgICAqIEBwYXJhbSBkYXNoIHRoZSBhcnJheSB3aXRoIHRoZSBkYXNoaW5nIHBhdHRlcm4uCi0gICAgICogQHBhcmFtIGRhc2hQaGFzZSB0aGUgb2Zmc2V0IHRvIHN0YXJ0IHRoZSBkYXNoaW5nIHBhdHRlcm4uCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgQmFzaWtTdHJva2UuCisgICAgICogQHBhcmFtIGNhcAorICAgICAqICAgICAgICAgICAgdGhlIGVuZCBkZWNvcmF0aW9uIG9mIEJhc2lrU3Ryb2tlLgorICAgICAqIEBwYXJhbSBqb2luCisgICAgICogICAgICAgICAgICB0aGUgam9pbiBzZWdtZW50cyBkZWNvcmF0aW9uLgorICAgICAqIEBwYXJhbSBtaXRlckxpbWl0CisgICAgICogICAgICAgICAgICB0aGUgbGltaXQgdG8gdHJpbSB0aGUgbWl0ZXIgam9pbi4KKyAgICAgKiBAcGFyYW0gZGFzaAorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdpdGggdGhlIGRhc2hpbmcgcGF0dGVybi4KKyAgICAgKiBAcGFyYW0gZGFzaFBoYXNlCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHRvIHN0YXJ0IHRoZSBkYXNoaW5nIHBhdHRlcm4uCiAgICAgICovCi0gICAgcHVibGljIEJhc2ljU3Ryb2tlKGZsb2F0IHdpZHRoLCBpbnQgY2FwLCBpbnQgam9pbiwgZmxvYXQgbWl0ZXJMaW1pdCwgZmxvYXRbXSBkYXNoLCBmbG9hdCBkYXNoUGhhc2UpIHsKKyAgICBwdWJsaWMgQmFzaWNTdHJva2UoZmxvYXQgd2lkdGgsIGludCBjYXAsIGludCBqb2luLCBmbG9hdCBtaXRlckxpbWl0LCBmbG9hdFtdIGRhc2gsCisgICAgICAgICAgICBmbG9hdCBkYXNoUGhhc2UpIHsKICAgICAgICAgaWYgKHdpZHRoIDwgMC4wZikgewogICAgICAgICAgICAgLy8gYXd0LjEzMz1OZWdhdGl2ZSB3aWR0aAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xMzMiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTIwNCw3ICsyNjEsNyBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTM4IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBaRVJPOiB7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGRhc2gubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhc2gubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGRhc2hbaV0gPCAwLjApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3dC4xMzk9TmVnYXRpdmUgZGFzaFt7MH1dCiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjEzOSIsIGkpKTsgLy8kTk9OLU5MUy0xJApAQCAtMjI2LDM1ICsyODMsNDMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQmFzaWNTdHJva2Ugd2l0aCBzcGVjaWZpZWQgd2lkdGgsIGNhcCwgam9pbiwgbGltaXQKLSAgICAgKiBhbmQgZGVmYXVsdCBkYXNoIGF0dHJpYnV0ZXMgcGFyYW1ldGVycy4gCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJhc2ljU3Ryb2tlIHdpdGggc3BlY2lmaWVkIHdpZHRoLCBjYXAsIGpvaW4sIGxpbWl0IGFuZAorICAgICAqIGRlZmF1bHQgZGFzaCBhdHRyaWJ1dGVzIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiBCYXNpa1N0cm9rZS4KLSAgICAgKiBAcGFyYW0gY2FwIHRoZSBlbmQgZGVjb3JhdGlvbiBvZiBCYXNpa1N0cm9rZS4KLSAgICAgKiBAcGFyYW0gam9pbiB0aGUgam9pbiBzZWdtZW50cyBkZWNvcmF0aW9uLgotICAgICAqIEBwYXJhbSBtaXRlckxpbWl0IHRoZSBsaW1pdCB0byB0cmltIHRoZSBtaXRlciBqb2luLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIEJhc2lrU3Ryb2tlLgorICAgICAqIEBwYXJhbSBjYXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgZGVjb3JhdGlvbiBvZiBCYXNpa1N0cm9rZS4KKyAgICAgKiBAcGFyYW0gam9pbgorICAgICAqICAgICAgICAgICAgdGhlIGpvaW4gc2VnbWVudHMgZGVjb3JhdGlvbi4KKyAgICAgKiBAcGFyYW0gbWl0ZXJMaW1pdAorICAgICAqICAgICAgICAgICAgdGhlIGxpbWl0IHRvIHRyaW0gdGhlIG1pdGVyIGpvaW4uCiAgICAgICovCiAgICAgcHVibGljIEJhc2ljU3Ryb2tlKGZsb2F0IHdpZHRoLCBpbnQgY2FwLCBpbnQgam9pbiwgZmxvYXQgbWl0ZXJMaW1pdCkgewogICAgICAgICB0aGlzKHdpZHRoLCBjYXAsIGpvaW4sIG1pdGVyTGltaXQsIG51bGwsIDAuMGYpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBCYXNpY1N0cm9rZSB3aXRoIHNwZWNpZmllZCB3aWR0aCwgY2FwLCBqb2luCi0gICAgICogYW5kIGRlZmF1bHQgbGltaXQgYW5kIGRhc2ggYXR0cmlidXRlcyBwYXJhbWV0ZXJzLiAKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQmFzaWNTdHJva2Ugd2l0aCBzcGVjaWZpZWQgd2lkdGgsIGNhcCwgam9pbiBhbmQKKyAgICAgKiBkZWZhdWx0IGxpbWl0IGFuZCBkYXNoIGF0dHJpYnV0ZXMgcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIEJhc2lrU3Ryb2tlLgotICAgICAqIEBwYXJhbSBjYXAgdGhlIGVuZCBkZWNvcmF0aW9uIG9mIEJhc2lrU3Ryb2tlLgotICAgICAqIEBwYXJhbSBqb2luIHRoZSBqb2luIHNlZ21lbnRzIGRlY29yYXRpb24uCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgQmFzaWtTdHJva2UuCisgICAgICogQHBhcmFtIGNhcAorICAgICAqICAgICAgICAgICAgdGhlIGVuZCBkZWNvcmF0aW9uIG9mIEJhc2lrU3Ryb2tlLgorICAgICAqIEBwYXJhbSBqb2luCisgICAgICogICAgICAgICAgICB0aGUgam9pbiBzZWdtZW50cyBkZWNvcmF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBCYXNpY1N0cm9rZShmbG9hdCB3aWR0aCwgaW50IGNhcCwgaW50IGpvaW4pIHsKICAgICAgICAgdGhpcyh3aWR0aCwgY2FwLCBqb2luLCAxMC4wZiwgbnVsbCwgMC4wZik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJhc2ljU3Ryb2tlIHdpdGggc3BlY2lmaWVkIHdpZHRoIGFuZCBkZWZhdWx0IGNhcCwgam9pbiwKLSAgICAgKiBsaW1pdCwgZGFzaCBhdHRyaWJ1dGVzIHBhcmFtZXRlcnMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJhc2ljU3Ryb2tlIHdpdGggc3BlY2lmaWVkIHdpZHRoIGFuZCBkZWZhdWx0IGNhcCwKKyAgICAgKiBqb2luLCBsaW1pdCwgZGFzaCBhdHRyaWJ1dGVzIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiBCYXNpY1N0cm9rZS4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBCYXNpY1N0cm9rZS4KICAgICAgKi8KICAgICBwdWJsaWMgQmFzaWNTdHJva2UoZmxvYXQgd2lkdGgpIHsKICAgICAgICAgdGhpcyh3aWR0aCwgQ0FQX1NRVUFSRSwgSk9JTl9NSVRFUiwgMTAuMGYsIG51bGwsIDAuMGYpOwpAQCAtMjg4LDcgKzM1Myw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWl0ZXIgbGltaXQgb2YgdGhlIEJhc2ljU3Ryb2tlICh0aGUgbGltaXQgdG8gdHJpbSB0aGUgbWl0ZXIgam9pbikuCisgICAgICogR2V0cyB0aGUgbWl0ZXIgbGltaXQgb2YgdGhlIEJhc2ljU3Ryb2tlICh0aGUgbGltaXQgdG8gdHJpbSB0aGUgbWl0ZXIKKyAgICAgKiBqb2luKS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBtaXRlciBsaW1pdCBvZiB0aGUgQmFzaWNTdHJva2UuCiAgICAgICovCkBAIC0zMzgsMTAgKzQwNCwxMCBAQAogICAgIC8qKgogICAgICAqIENvbXBhcmVzIHRoaXMgQmFzaWNTdHJva2Ugb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBPYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9iaiB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIE9iamVjdCBpcyBhIEJhc2ljU3Ryb2tlIHdpdGggdGhlIHNhbWUgZGF0YQotICAgICAqIHZhbHVlcyBhcyB0aGlzIEJhc2ljU3Ryb2tlOyBmYWxzZSBvdGhlcndpc2UuIAorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgT2JqZWN0IGlzIGEgQmFzaWNTdHJva2Ugd2l0aCB0aGUgc2FtZSBkYXRhIHZhbHVlcyBhcworICAgICAqICAgICAgICAgdGhpcyBCYXNpY1N0cm9rZTsgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CkBAIC0zNTAsMTMgKzQxNiw5IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEJhc2ljU3Ryb2tlKSB7CiAgICAgICAgICAgICBCYXNpY1N0cm9rZSBicyA9IChCYXNpY1N0cm9rZSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBicy53aWR0aCA9PSB3aWR0aCAmJgotICAgICAgICAgICAgICAgIGJzLmNhcCA9PSBjYXAgJiYKLSAgICAgICAgICAgICAgICBicy5qb2luID09IGpvaW4gJiYKLSAgICAgICAgICAgICAgICBicy5taXRlckxpbWl0ID09IG1pdGVyTGltaXQgJiYKLSAgICAgICAgICAgICAgICBicy5kYXNoUGhhc2UgPT0gZGFzaFBoYXNlICYmCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5cy5lcXVhbHMoYnMuZGFzaCwgZGFzaCk7CisgICAgICAgICAgICByZXR1cm4gYnMud2lkdGggPT0gd2lkdGggJiYgYnMuY2FwID09IGNhcCAmJiBicy5qb2luID09IGpvaW4KKyAgICAgICAgICAgICAgICAgICAgJiYgYnMubWl0ZXJMaW1pdCA9PSBtaXRlckxpbWl0ICYmIGJzLmRhc2hQaGFzZSA9PSBkYXNoUGhhc2UKKyAgICAgICAgICAgICAgICAgICAgJiYgamF2YS51dGlsLkFycmF5cy5lcXVhbHMoYnMuZGFzaCwgZGFzaCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTM2NCw5ICs0MjYsOSBAQAogICAgIC8qKgogICAgICAqIENhbGN1bGF0ZXMgYWxsb3dhYmxlIGN1cnZlIGRlcml2YXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnZlIGRlbHRhCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGguCisgICAgICogQHJldHVybiB0aGUgY3VydmUgZGVsdGEuCiAgICAgICovCiAgICAgZG91YmxlIGdldEN1cnZlRGVsdGEoZG91YmxlIHdpZHRoKSB7CiAgICAgICAgIGRvdWJsZSBhID0gd2lkdGggKyBDVVJWRV9ERUxUQTsKQEAgLTM3OCw5ICs0NDAsOSBAQAogICAgIC8qKgogICAgICAqIENhbGN1bGF0ZXMgdGhlIHZhbHVlIHRvIGRldGVjdCBhIHNtYWxsIGFuZ2xlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGgKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JuZXIgZGVsdGEKKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aC4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb3JuZXIgZGVsdGEuCiAgICAgICovCiAgICAgZG91YmxlIGdldENvcm5lckRlbHRhKGRvdWJsZSB3aWR0aCkgewogICAgICAgICByZXR1cm4gd2lkdGggKiB3aWR0aCAqIE1hdGguc2luKE1hdGguUEkgKiBDT1JORVJfQU5HTEUgLyAxODAuMCk7CkBAIC0zODksMjIgKzQ1MSwyMSBAQAogICAgIC8qKgogICAgICAqIENhbGN1bGF0ZXMgdmFsdWUgdG8gZGV0ZWN0IGEgemVybyBhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgemVybyBkZWx0YQorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoLgorICAgICAqIEByZXR1cm4gdGhlIHplcm8gZGVsdGEuCiAgICAgICovCiAgICAgZG91YmxlIGdldFplcm9EZWx0YShkb3VibGUgd2lkdGgpIHsKICAgICAgICAgcmV0dXJuIHdpZHRoICogd2lkdGggKiBNYXRoLnNpbihNYXRoLlBJICogQ09STkVSX1pFUk8gLyAxODAuMCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFNoYXBlIGZyb20gdGhlIG91dGxpbmUgb2YgdGhlIHNwZWNpZmllZCBzaGFwZSAKLSAgICAgKiBkcmF3biB3aXRoIHRoaXMgQmFzaWNTdHJva2UuCisgICAgICogQ3JlYXRlcyBhIFNoYXBlIGZyb20gdGhlIG91dGxpbmUgb2YgdGhlIHNwZWNpZmllZCBzaGFwZSBkcmF3biB3aXRoIHRoaXMKKyAgICAgKiBCYXNpY1N0cm9rZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyB0aGUgc3BlY2lmaWVkIFNoYXBlIHRvIGJlIHN0cm9rZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgU2hhcGUgdG8gYmUgc3Ryb2tlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBTaGFwZSBvZiB0aGUgc3Ryb2tlZCBvdXRsaW5lLgotICAgICAqIAogICAgICAqIEBzZWUgamF2YS5hd3QuU3Ryb2tlI2NyZWF0ZVN0cm9rZWRTaGFwZShqYXZhLmF3dC5TaGFwZSkKICAgICAgKi8KICAgICBwdWJsaWMgU2hhcGUgY3JlYXRlU3Ryb2tlZFNoYXBlKFNoYXBlIHMpIHsKQEAgLTQyOSw3ICs0OTAsOCBAQAogICAgIC8qKgogICAgICAqIEdlbmVyYXRlcyBhIHNoYXBlIHdpdGggYSBzb2xpZCAobm90IGRhc2hlZCkgb3V0bGluZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCAtIHRoZSBQYXRoSXRlcmF0b3Igb2Ygc291cmNlIHNoYXBlCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBQYXRoSXRlcmF0b3Igb2Ygc291cmNlIHNoYXBlLgogICAgICAqLwogICAgIHZvaWQgY3JlYXRlU29saWRTaGFwZShQYXRoSXRlcmF0b3IgcCkgewogICAgICAgICBkb3VibGUgY29vcmRzW10gPSBuZXcgZG91YmxlWzZdOwpAQCAtNDM5LDM2ICs1MDEsMzcgQEAKICAgICAgICAgY2hlY2tNb3ZlID0gdHJ1ZTsKICAgICAgICAgYm9vbGVhbiBpc0Nsb3NlZCA9IHRydWU7CiAKLSAgICAgICAgd2hpbGUoIXAuaXNEb25lKCkpIHsKLSAgICAgICAgICAgIHN3aXRjaChwLmN1cnJlbnRTZWdtZW50KGNvb3JkcykpIHsKLSAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19NT1ZFVE86Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0Nsb3NlZCkgewotICAgICAgICAgICAgICAgICAgICBjbG9zZVNvbGlkU2hhcGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcnAuY2xlYW4oKTsKLSAgICAgICAgICAgICAgICBteCA9IGN4ID0gY29vcmRzWzBdOwotICAgICAgICAgICAgICAgIG15ID0gY3kgPSBjb29yZHNbMV07Ci0gICAgICAgICAgICAgICAgaXNNb3ZlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpc0Nsb3NlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0xJTkVUTzoKLSAgICAgICAgICAgICAgICBhZGRMaW5lKGN4LCBjeSwgY3ggPSBjb29yZHNbMF0sIGN5ID0gY29vcmRzWzFdLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19RVUFEVE86Ci0gICAgICAgICAgICAgICAgYWRkUXVhZChjeCwgY3ksIGNvb3Jkc1swXSwgY29vcmRzWzFdLCBjeCA9IGNvb3Jkc1syXSwgY3kgPSBjb29yZHNbM10pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0NVQklDVE86Ci0gICAgICAgICAgICAgICAgYWRkQ3ViaWMoY3gsIGN5LCBjb29yZHNbMF0sIGNvb3Jkc1sxXSwgY29vcmRzWzJdLCBjb29yZHNbM10sIGN4ID0gY29vcmRzWzRdLCBjeSA9IGNvb3Jkc1s1XSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBhdGhJdGVyYXRvci5TRUdfQ0xPU0U6Ci0gICAgICAgICAgICAgICAgYWRkTGluZShjeCwgY3ksIG14LCBteSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGFkZEpvaW4obHAsIG14LCBteSwgbHAueE1vdmUsIGxwLnlNb3ZlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBhZGRKb2luKHJwLCBteCwgbXksIHJwLnhNb3ZlLCBycC55TW92ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGxwLmNsb3NlUGF0aCgpOwotICAgICAgICAgICAgICAgIHJwLmNsb3NlUGF0aCgpOwotICAgICAgICAgICAgICAgIGxwLmFwcGVuZFJldmVyc2UocnApOwotICAgICAgICAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgd2hpbGUgKCFwLmlzRG9uZSgpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHAuY3VycmVudFNlZ21lbnQoY29vcmRzKSkgeworICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19NT1ZFVE86CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNDbG9zZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlU29saWRTaGFwZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJwLmNsZWFuKCk7CisgICAgICAgICAgICAgICAgICAgIG14ID0gY3ggPSBjb29yZHNbMF07CisgICAgICAgICAgICAgICAgICAgIG15ID0gY3kgPSBjb29yZHNbMV07CisgICAgICAgICAgICAgICAgICAgIGlzTW92ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlzQ2xvc2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19MSU5FVE86CisgICAgICAgICAgICAgICAgICAgIGFkZExpbmUoY3gsIGN5LCBjeCA9IGNvb3Jkc1swXSwgY3kgPSBjb29yZHNbMV0sIHRydWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBhdGhJdGVyYXRvci5TRUdfUVVBRFRPOgorICAgICAgICAgICAgICAgICAgICBhZGRRdWFkKGN4LCBjeSwgY29vcmRzWzBdLCBjb29yZHNbMV0sIGN4ID0gY29vcmRzWzJdLCBjeSA9IGNvb3Jkc1szXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19DVUJJQ1RPOgorICAgICAgICAgICAgICAgICAgICBhZGRDdWJpYyhjeCwgY3ksIGNvb3Jkc1swXSwgY29vcmRzWzFdLCBjb29yZHNbMl0sIGNvb3Jkc1szXSwgY3ggPSBjb29yZHNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3kgPSBjb29yZHNbNV0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBhdGhJdGVyYXRvci5TRUdfQ0xPU0U6CisgICAgICAgICAgICAgICAgICAgIGFkZExpbmUoY3gsIGN5LCBteCwgbXksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkSm9pbihscCwgbXgsIG15LCBscC54TW92ZSwgbHAueU1vdmUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBhZGRKb2luKHJwLCBteCwgbXksIHJwLnhNb3ZlLCBycC55TW92ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBscC5jbG9zZVBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgcnAuY2xvc2VQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgIGxwLmFwcGVuZFJldmVyc2UocnApOworICAgICAgICAgICAgICAgICAgICBpc0Nsb3NlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcC5uZXh0KCk7CiAgICAgICAgIH0KQEAgLTQ5Miw3ICs1NTUsOCBAQAogICAgIC8qKgogICAgICAqIEdlbmVyYXRlcyBkYXNoZWQgc3Ryb2tlZCBzaGFwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCAtIHRoZSBQYXRoSXRlcmF0b3Igb2Ygc291cmNlIHNoYXBlCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBQYXRoSXRlcmF0b3Igb2Ygc291cmNlIHNoYXBlLgogICAgICAqLwogICAgIHZvaWQgY3JlYXRlRGFzaGVkU2hhcGUoUGF0aEl0ZXJhdG9yIHApIHsKICAgICAgICAgZG91YmxlIGNvb3Jkc1tdID0gbmV3IGRvdWJsZVs2XTsKQEAgLTUwMiw1MiArNTY2LDUzIEBACiAgICAgICAgIGNoZWNrTW92ZSA9IGZhbHNlOwogICAgICAgICBib29sZWFuIGlzQ2xvc2VkID0gdHJ1ZTsKIAotICAgICAgICB3aGlsZSghcC5pc0RvbmUoKSkgewotICAgICAgICAgICAgc3dpdGNoKHAuY3VycmVudFNlZ21lbnQoY29vcmRzKSkgewotICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX01PVkVUTzoKKyAgICAgICAgd2hpbGUgKCFwLmlzRG9uZSgpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHAuY3VycmVudFNlZ21lbnQoY29vcmRzKSkgeworICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19NT1ZFVE86CiAKLSAgICAgICAgICAgICAgICBpZiAoIWlzQ2xvc2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlRGFzaGVkU2hhcGUoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNDbG9zZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlRGFzaGVkU2hhcGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgZGFzaGVyID0gbmV3IERhc2hlcihkYXNoLCBkYXNoUGhhc2UpOwotICAgICAgICAgICAgICAgIGxwLmNsZWFuKCk7Ci0gICAgICAgICAgICAgICAgcnAuY2xlYW4oKTsKLSAgICAgICAgICAgICAgICBzcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaXNGaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaXNNb3ZlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpc0Nsb3NlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG14ID0gY3ggPSBjb29yZHNbMF07Ci0gICAgICAgICAgICAgICAgbXkgPSBjeSA9IGNvb3Jkc1sxXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19MSU5FVE86Ci0gICAgICAgICAgICAgICAgYWRkRGFzaExpbmUoY3gsIGN5LCBjeCA9IGNvb3Jkc1swXSwgY3kgPSBjb29yZHNbMV0pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX1FVQURUTzoKLSAgICAgICAgICAgICAgICBhZGREYXNoUXVhZChjeCwgY3ksIGNvb3Jkc1swXSwgY29vcmRzWzFdLCBjeCA9IGNvb3Jkc1syXSwgY3kgPSBjb29yZHNbM10pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0NVQklDVE86Ci0gICAgICAgICAgICAgICAgYWRkRGFzaEN1YmljKGN4LCBjeSwgY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3Jkc1syXSwgY29vcmRzWzNdLCBjeCA9IGNvb3Jkc1s0XSwgY3kgPSBjb29yZHNbNV0pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0NMT1NFOgotICAgICAgICAgICAgICAgIGFkZERhc2hMaW5lKGN4LCBjeSwgY3ggPSBteCwgY3kgPSBteSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGFzaGVyLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29ubmVjdCBjdXJyZW50IGFuZCBoZWFkIHNlZ21lbnRzCi0gICAgICAgICAgICAgICAgICAgIGFkZEpvaW4obHAsIGZteCwgZm15LCBzcC54TW92ZSwgc3AueU1vdmUsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBscC5qb2luKHNwKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkSm9pbihscCwgZm14LCBmbXksIHJwLnhMYXN0LCBycC55TGFzdCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGxwLmNvbWJpbmUocnApOwotICAgICAgICAgICAgICAgICAgICBhZGRDYXAobHAsIHNteCwgc215LCBscC54TW92ZSwgbHAueU1vdmUpOwotICAgICAgICAgICAgICAgICAgICBscC5jbG9zZVBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgZHN0LmFwcGVuZChscCk7CisgICAgICAgICAgICAgICAgICAgIGRhc2hlciA9IG5ldyBEYXNoZXIoZGFzaCwgZGFzaFBoYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgbHAuY2xlYW4oKTsKKyAgICAgICAgICAgICAgICAgICAgcnAuY2xlYW4oKTsKICAgICAgICAgICAgICAgICAgICAgc3AgPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlRGFzaGVkU2hhcGUoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlzRmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpc01vdmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpc0Nsb3NlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBteCA9IGN4ID0gY29vcmRzWzBdOworICAgICAgICAgICAgICAgICAgICBteSA9IGN5ID0gY29vcmRzWzFdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBhdGhJdGVyYXRvci5TRUdfTElORVRPOgorICAgICAgICAgICAgICAgICAgICBhZGREYXNoTGluZShjeCwgY3ksIGN4ID0gY29vcmRzWzBdLCBjeSA9IGNvb3Jkc1sxXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19RVUFEVE86CisgICAgICAgICAgICAgICAgICAgIGFkZERhc2hRdWFkKGN4LCBjeSwgY29vcmRzWzBdLCBjb29yZHNbMV0sIGN4ID0gY29vcmRzWzJdLCBjeSA9IGNvb3Jkc1szXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19DVUJJQ1RPOgorICAgICAgICAgICAgICAgICAgICBhZGREYXNoQ3ViaWMoY3gsIGN5LCBjb29yZHNbMF0sIGNvb3Jkc1sxXSwgY29vcmRzWzJdLCBjb29yZHNbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ggPSBjb29yZHNbNF0sIGN5ID0gY29vcmRzWzVdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0NMT1NFOgorICAgICAgICAgICAgICAgICAgICBhZGREYXNoTGluZShjeCwgY3ksIGN4ID0gbXgsIGN5ID0gbXkpOwogCi0gICAgICAgICAgICAgICAgaXNDbG9zZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoZGFzaGVyLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbm5lY3QgY3VycmVudCBhbmQgaGVhZCBzZWdtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgYWRkSm9pbihscCwgZm14LCBmbXksIHNwLnhNb3ZlLCBzcC55TW92ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBscC5qb2luKHNwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZEpvaW4obHAsIGZteCwgZm15LCBycC54TGFzdCwgcnAueUxhc3QsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbHAuY29tYmluZShycCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRDYXAobHAsIHNteCwgc215LCBscC54TW92ZSwgbHAueU1vdmUpOworICAgICAgICAgICAgICAgICAgICAgICAgbHAuY2xvc2VQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3QuYXBwZW5kKGxwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlRGFzaGVkU2hhcGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwLm5leHQoKTsKICAgICAgICAgfQpAQCAtNTgzLDExICs2NDgsMTYgQEAKICAgICAvKioKICAgICAgKiBBZGRzIGNhcCB0byB0aGUgd29yayBwYXRoLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIC0gdGhlIEJ1ZmZlcmVkUGF0aCBvYmplY3Qgb2Ygd29yayBwYXRoCi0gICAgICogQHBhcmFtIHgwIC0gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc291cmNlIHBhdGgKLSAgICAgKiBAcGFyYW0geTAgLSB0aGUgeSBjb29yZGluYXRlIG9uIHRoZSBzb3VyY2UgcGF0aAotICAgICAqIEBwYXJhbSB4MiAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIG5leHQgcG9pbnQgb24gdGhlIHdvcmsgcGF0aAotICAgICAqIEBwYXJhbSB5MiAtIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIG5leHQgcG9pbnQgb24gdGhlIHdvcmsgcGF0aAorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgQnVmZmVyZWRQYXRoIG9iamVjdCBvZiB3b3JrIHBhdGguCisgICAgICogQHBhcmFtIHgwCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzb3VyY2UgcGF0aC4KKyAgICAgKiBAcGFyYW0geTAKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb24gdGhlIHNvdXJjZSBwYXRoLgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbmV4dCBwb2ludCBvbiB0aGUgd29yayBwYXRoLgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbmV4dCBwb2ludCBvbiB0aGUgd29yayBwYXRoLgogICAgICAqLwogICAgIHZvaWQgYWRkQ2FwKEJ1ZmZlcmVkUGF0aCBwLCBkb3VibGUgeDAsIGRvdWJsZSB5MCwgZG91YmxlIHgyLCBkb3VibGUgeTIpIHsKICAgICAgICAgZG91YmxlIHgxID0gcC54TGFzdDsKQEAgLTU5Nyw0MiArNjY3LDQ5IEBACiAgICAgICAgIGRvdWJsZSB4MjAgPSB4MiAtIHgwOwogICAgICAgICBkb3VibGUgeTIwID0geTIgLSB5MDsKIAotICAgICAgICBzd2l0Y2goY2FwKSB7Ci0gICAgICAgIGNhc2UgQ0FQX0JVVFQ6Ci0gICAgICAgICAgICBwLmxpbmVUbyh4MiwgeTIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0FQX1JPVU5EOgotICAgICAgICAgICAgZG91YmxlIG14ID0geDEwICogQ1VCSUNfQVJDOwotICAgICAgICAgICAgZG91YmxlIG15ID0geTEwICogQ1VCSUNfQVJDOworICAgICAgICBzd2l0Y2ggKGNhcCkgeworICAgICAgICAgICAgY2FzZSBDQVBfQlVUVDoKKyAgICAgICAgICAgICAgICBwLmxpbmVUbyh4MiwgeTIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQVBfUk9VTkQ6CisgICAgICAgICAgICAgICAgZG91YmxlIG14ID0geDEwICogQ1VCSUNfQVJDOworICAgICAgICAgICAgICAgIGRvdWJsZSBteSA9IHkxMCAqIENVQklDX0FSQzsKIAotICAgICAgICAgICAgZG91YmxlIHgzID0geDAgKyB5MTA7Ci0gICAgICAgICAgICBkb3VibGUgeTMgPSB5MCAtIHgxMDsKKyAgICAgICAgICAgICAgICBkb3VibGUgeDMgPSB4MCArIHkxMDsKKyAgICAgICAgICAgICAgICBkb3VibGUgeTMgPSB5MCAtIHgxMDsKIAotICAgICAgICAgICAgeDEwICo9IENVQklDX0FSQzsKLSAgICAgICAgICAgIHkxMCAqPSBDVUJJQ19BUkM7Ci0gICAgICAgICAgICB4MjAgKj0gQ1VCSUNfQVJDOwotICAgICAgICAgICAgeTIwICo9IENVQklDX0FSQzsKKyAgICAgICAgICAgICAgICB4MTAgKj0gQ1VCSUNfQVJDOworICAgICAgICAgICAgICAgIHkxMCAqPSBDVUJJQ19BUkM7CisgICAgICAgICAgICAgICAgeDIwICo9IENVQklDX0FSQzsKKyAgICAgICAgICAgICAgICB5MjAgKj0gQ1VCSUNfQVJDOwogCi0gICAgICAgICAgICBwLmN1YmljVG8oeDEgKyB5MTAsIHkxIC0geDEwLCB4MyArIG14LCB5MyArIG15LCB4MywgeTMpOwotICAgICAgICAgICAgcC5jdWJpY1RvKHgzIC0gbXgsIHkzIC0gbXksIHgyIC0geTIwLCB5MiArIHgyMCwgeDIsIHkyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENBUF9TUVVBUkU6Ci0gICAgICAgICAgICBwLmxpbmVUbyh4MSArIHkxMCwgeTEgLSB4MTApOwotICAgICAgICAgICAgcC5saW5lVG8oeDIgLSB5MjAsIHkyICsgeDIwKTsKLSAgICAgICAgICAgIHAubGluZVRvKHgyLCB5Mik7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBwLmN1YmljVG8oeDEgKyB5MTAsIHkxIC0geDEwLCB4MyArIG14LCB5MyArIG15LCB4MywgeTMpOworICAgICAgICAgICAgICAgIHAuY3ViaWNUbyh4MyAtIG14LCB5MyAtIG15LCB4MiAtIHkyMCwgeTIgKyB4MjAsIHgyLCB5Mik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBUF9TUVVBUkU6CisgICAgICAgICAgICAgICAgcC5saW5lVG8oeDEgKyB5MTAsIHkxIC0geDEwKTsKKyAgICAgICAgICAgICAgICBwLmxpbmVUbyh4MiAtIHkyMCwgeTIgKyB4MjApOworICAgICAgICAgICAgICAgIHAubGluZVRvKHgyLCB5Mik7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBBZGRzIGJldmVsIGFuZCBtaXRlciBqb2luIHRvIHRoZSB3b3JrIHBhdGguCiAgICAgICogCi0gICAgICogQHBhcmFtIHAgLSB0aGUgQnVmZmVyZWRQYXRoIG9iamVjdCBvZiB3b3JrIHBhdGgKLSAgICAgKiBAcGFyYW0geDAgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzb3VyY2UgcGF0aAotICAgICAqIEBwYXJhbSB5MCAtIHRoZSB5IGNvb3JkaW5hdGUgb24gdGhlIHNvdXJjZSBwYXRoCi0gICAgICogQHBhcmFtIHgyIC0gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbmV4dCBwb2ludCBvbiB0aGUgd29yayBwYXRoCi0gICAgICogQHBhcmFtIHkyIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbmV4dCBwb2ludCBvbiB0aGUgd29yayBwYXRoCi0gICAgICogQHBhcmFtIGlzTGVmdCAtIHRoZSBvcmllbnRhdGlvbiBvZiB3b3JrIHBhdGgsIHRydWUgaWYgd29yayBwYXRoIGxpZXMgdG8gdGhlIGxlZnQgZnJvbSBzb3VyY2UgcGF0aCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBCdWZmZXJlZFBhdGggb2JqZWN0IG9mIHdvcmsgcGF0aC4KKyAgICAgKiBAcGFyYW0geDAKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNvdXJjZSBwYXRoLgorICAgICAqIEBwYXJhbSB5MAorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvbiB0aGUgc291cmNlIHBhdGguCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBuZXh0IHBvaW50IG9uIHRoZSB3b3JrIHBhdGguCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBuZXh0IHBvaW50IG9uIHRoZSB3b3JrIHBhdGguCisgICAgICogQHBhcmFtIGlzTGVmdAorICAgICAqICAgICAgICAgICAgdGhlIG9yaWVudGF0aW9uIG9mIHdvcmsgcGF0aCwgdHJ1ZSBpZiB3b3JrIHBhdGggbGllcyB0byB0aGUKKyAgICAgKiAgICAgICAgICAgIGxlZnQgZnJvbSBzb3VyY2UgcGF0aCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHZvaWQgYWRkSm9pbihCdWZmZXJlZFBhdGggcCwgZG91YmxlIHgwLCBkb3VibGUgeTAsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBib29sZWFuIGlzTGVmdCkgewogICAgICAgICBkb3VibGUgeDEgPSBwLnhMYXN0OwpAQCAtNjY3LDI2ICs3NDQsMjYgQEAKICAgICAgICAgICAgIHAubGluZVRvKHgwLCB5MCk7CiAgICAgICAgICAgICBwLmxpbmVUbyh4MiwgeTIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dpdGNoKGpvaW4pIHsKLSAgICAgICAgICAgIGNhc2UgSk9JTl9CRVZFTDoKLSAgICAgICAgICAgICAgICBwLmxpbmVUbyh4MiwgeTIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBKT0lOX01JVEVSOgotICAgICAgICAgICAgICAgIGRvdWJsZSBzMSA9IHgxICogeDEwICsgeTEgKiB5MTA7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHMyID0geDIgKiB4MjAgKyB5MiAqIHkyMDsKLSAgICAgICAgICAgICAgICBkb3VibGUgeDMgPSAoczEgKiB5MjAgLSBzMiAqIHkxMCkgLyBzaW4wOwotICAgICAgICAgICAgICAgIGRvdWJsZSB5MyA9IChzMiAqIHgxMCAtIHMxICogeDIwKSAvIHNpbjA7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHgzMCA9IHgzIC0geDA7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHkzMCA9IHkzIC0geTA7Ci0gICAgICAgICAgICAgICAgZG91YmxlIG1pdGVyTGVuZ3RoID0gTWF0aC5zcXJ0KHgzMCAqIHgzMCArIHkzMCAqIHkzMCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1pdGVyTGVuZ3RoIDwgbWl0ZXJMaW1pdCAqIHcyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHAubGluZVRvKHgzLCB5Myk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHAubGluZVRvKHgyLCB5Mik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEpPSU5fUk9VTkQ6Ci0gICAgICAgICAgICAgICAgYWRkUm91bmRKb2luKHAsIHgwLCB5MCwgeDIsIHkyLCBpc0xlZnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgc3dpdGNoIChqb2luKSB7CisgICAgICAgICAgICAgICAgY2FzZSBKT0lOX0JFVkVMOgorICAgICAgICAgICAgICAgICAgICBwLmxpbmVUbyh4MiwgeTIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEpPSU5fTUlURVI6CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzMSA9IHgxICogeDEwICsgeTEgKiB5MTA7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzMiA9IHgyICogeDIwICsgeTIgKiB5MjA7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4MyA9IChzMSAqIHkyMCAtIHMyICogeTEwKSAvIHNpbjA7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB5MyA9IChzMiAqIHgxMCAtIHMxICogeDIwKSAvIHNpbjA7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4MzAgPSB4MyAtIHgwOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgeTMwID0geTMgLSB5MDsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1pdGVyTGVuZ3RoID0gTWF0aC5zcXJ0KHgzMCAqIHgzMCArIHkzMCAqIHkzMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtaXRlckxlbmd0aCA8IG1pdGVyTGltaXQgKiB3MikgeworICAgICAgICAgICAgICAgICAgICAgICAgcC5saW5lVG8oeDMsIHkzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwLmxpbmVUbyh4MiwgeTIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEpPSU5fUk9VTkQ6CisgICAgICAgICAgICAgICAgICAgIGFkZFJvdW5kSm9pbihwLCB4MCwgeTAsIHgyLCB5MiwgaXNMZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC02OTQsMTIgKzc3MSwxOSBAQAogICAgIC8qKgogICAgICAqIEFkZHMgcm91bmQgam9pbiB0byB0aGUgd29yayBwYXRoLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIC0gdGhlIEJ1ZmZlcmVkUGF0aCBvYmplY3Qgb2Ygd29yayBwYXRoCi0gICAgICogQHBhcmFtIHgwIC0gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc291cmNlIHBhdGgKLSAgICAgKiBAcGFyYW0geTAgLSB0aGUgeSBjb29yZGluYXRlIG9uIHRoZSBzb3VyY2UgcGF0aAotICAgICAqIEBwYXJhbSB4MiAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIG5leHQgcG9pbnQgb24gdGhlIHdvcmsgcGF0aAotICAgICAqIEBwYXJhbSB5MiAtIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIG5leHQgcG9pbnQgb24gdGhlIHdvcmsgcGF0aAotICAgICAqIEBwYXJhbSBpc0xlZnQgLSB0aGUgb3JpZW50YXRpb24gb2Ygd29yayBwYXRoLCB0cnVlIGlmIHdvcmsgcGF0aCBsaWVzIHRvIHRoZSBsZWZ0IGZyb20gc291cmNlIHBhdGgsIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgQnVmZmVyZWRQYXRoIG9iamVjdCBvZiB3b3JrIHBhdGguCisgICAgICogQHBhcmFtIHgwCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzb3VyY2UgcGF0aC4KKyAgICAgKiBAcGFyYW0geTAKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb24gdGhlIHNvdXJjZSBwYXRoLgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbmV4dCBwb2ludCBvbiB0aGUgd29yayBwYXRoLgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbmV4dCBwb2ludCBvbiB0aGUgd29yayBwYXRoLgorICAgICAqIEBwYXJhbSBpc0xlZnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcmllbnRhdGlvbiBvZiB3b3JrIHBhdGgsIHRydWUgaWYgd29yayBwYXRoIGxpZXMgdG8gdGhlCisgICAgICogICAgICAgICAgICBsZWZ0IGZyb20gc291cmNlIHBhdGgsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICB2b2lkIGFkZFJvdW5kSm9pbihCdWZmZXJlZFBhdGggcCwgZG91YmxlIHgwLCBkb3VibGUgeTAsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBib29sZWFuIGlzTGVmdCkgewogICAgICAgICBkb3VibGUgeDEgPSBwLnhMYXN0OwpAQCAtNzYzLDExICs4NDcsMTYgQEAKICAgICAvKioKICAgICAgKiBBZGRzIHNvbGlkIGxpbmUgc2VnbWVudCB0byB0aGUgd29yayBwYXRoLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0IGxpbmUgcG9pbnQKLSAgICAgKiBAcGFyYW0geTEgLSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydCBsaW5lIHBvaW50Ci0gICAgICogQHBhcmFtIHgyIC0gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIGxpbmUgcG9pbnQKLSAgICAgKiBAcGFyYW0geTIgLSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgbGluZSBwb2ludAotICAgICAqIEBwYXJhbSB6ZXJvIC0gaWYgdHJ1ZSBpdCdzIGFsbG93YWJsZSB0byBhZGQgemVybyBsZW5ndGggbGluZSBzZWdtZW50CisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydCBsaW5lIHBvaW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnQgbGluZSBwb2ludC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBsaW5lIHBvaW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIGxpbmUgcG9pbnQuCisgICAgICogQHBhcmFtIHplcm8KKyAgICAgKiAgICAgICAgICAgIGlmIHRydWUgaXQncyBhbGxvd2FibGUgdG8gYWRkIHplcm8gbGVuZ3RoIGxpbmUgc2VnbWVudC4KICAgICAgKi8KICAgICB2b2lkIGFkZExpbmUoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBib29sZWFuIHplcm8pIHsKICAgICAgICAgZG91YmxlIGR4ID0geDIgLSB4MTsKQEAgLTgwOCwxMiArODk3LDE4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyBzb2xpZCBxdWFkIHNlZ21lbnQgdG8gdGhlIHdvcmsgcGF0aC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkxIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB4MiAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkyIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geDMgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkzIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludAorICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB4MworICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTMKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRoaXJkIGNvbnRyb2wgcG9pbnQuCiAgICAgICovCiAgICAgdm9pZCBhZGRRdWFkKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MiwgZG91YmxlIHgzLCBkb3VibGUgeTMpIHsKICAgICAgICAgZG91YmxlIHgyMSA9IHgyIC0geDE7CkBAIC04NDEsMTEgKzkzNiwxMSBAQAogCiAgICAgICAgIGRvdWJsZSB3OwogICAgICAgICB3ID0gdzIgLyBsMjE7Ci0gICAgICAgIGRvdWJsZSBteDEgPSAtIHkyMSAqIHc7Ci0gICAgICAgIGRvdWJsZSBteTEgPSAgIHgyMSAqIHc7CisgICAgICAgIGRvdWJsZSBteDEgPSAteTIxICogdzsKKyAgICAgICAgZG91YmxlIG15MSA9IHgyMSAqIHc7CiAgICAgICAgIHcgPSB3MiAvIGwyMzsKLSAgICAgICAgZG91YmxlIG14MyA9ICAgeTIzICogdzsKLSAgICAgICAgZG91YmxlIG15MyA9IC0geDIzICogdzsKKyAgICAgICAgZG91YmxlIG14MyA9IHkyMyAqIHc7CisgICAgICAgIGRvdWJsZSBteTMgPSAteDIzICogdzsKIAogICAgICAgICBkb3VibGUgbHgxID0geDEgKyBteDE7CiAgICAgICAgIGRvdWJsZSBseTEgPSB5MSArIG15MTsKQEAgLTkwMywxNSArOTk4LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3ViZGl2aWRlcyBzb2xpZCBxdWFkIGN1cnZlIHRvIG1ha2Ugb3V0bGluZSBmb3Igc291cmNlIHF1YWQgc2VnbWVudCBhbmQgYWRkcyBpdCB0byB3b3JrIHBhdGguCisgICAgICogU3ViZGl2aWRlcyBzb2xpZCBxdWFkIGN1cnZlIHRvIG1ha2Ugb3V0bGluZSBmb3Igc291cmNlIHF1YWQgc2VnbWVudCBhbmQKKyAgICAgKiBhZGRzIGl0IHRvIHdvcmsgcGF0aC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkxIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB4MiAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkyIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geDMgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkzIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSBsZXZlbCAtIHRoZSBtYXhpbXVtIGxldmVsIG9mIHN1YmRpdmlzaW9uIGRlZXBuZXNzCisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgzCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5MworICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0gbGV2ZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIGxldmVsIG9mIHN1YmRpdmlzaW9uIGRlZXBuZXNzLgogICAgICAqLwogICAgIHZvaWQgYWRkU3ViUXVhZChkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIsIGRvdWJsZSB4MywgZG91YmxlIHkzLCBpbnQgbGV2ZWwpIHsKICAgICAgICAgZG91YmxlIHgyMSA9IHgyIC0geDE7CkBAIC05MzksOCArMTA0Miw4IEBACiAgICAgICAgICAgICBkb3VibGUgbXgyID0gKHgyMSAqIGwyMyArIHgyMyAqIGwyMSkgKiB3OwogICAgICAgICAgICAgZG91YmxlIG15MiA9ICh5MjEgKiBsMjMgKyB5MjMgKiBsMjEpICogdzsKICAgICAgICAgICAgIHcgPSB3MiAvIGwyMzsKLSAgICAgICAgICAgIGRvdWJsZSBteDMgPSAgIHkyMyAqIHc7Ci0gICAgICAgICAgICBkb3VibGUgbXkzID0gLSB4MjMgKiB3OworICAgICAgICAgICAgZG91YmxlIG14MyA9IHkyMyAqIHc7CisgICAgICAgICAgICBkb3VibGUgbXkzID0gLXgyMyAqIHc7CiAgICAgICAgICAgICBscC5xdWFkVG8oeDIgKyBteDIsIHkyICsgbXkyLCB4MyArIG14MywgeTMgKyBteTMpOwogICAgICAgICAgICAgcnAucXVhZFRvKHgyIC0gbXgyLCB5MiAtIG15MiwgeDMgLSBteDMsIHkzIC0gbXkzKTsKICAgICAgICAgfQpAQCAtOTQ5LDE2ICsxMDUyLDI1IEBACiAgICAgLyoqCiAgICAgICogQWRkcyBzb2xpZCBjdWJpYyBzZWdtZW50IHRvIHRoZSB3b3JrIHBhdGguCiAgICAgICogCi0gICAgICogQHBhcmFtIHgxIC0gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB5MSAtIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geDIgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB5MiAtIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHgzIC0gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB5MyAtIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRoaXJkIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geDQgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmb3VycyBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHk0IC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZm91cnMgY29udHJvbCBwb2ludAorICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB4MworICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTMKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRoaXJkIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHg0CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmb3VycyBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5NAorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZm91cnMgY29udHJvbCBwb2ludC4KICAgICAgKi8KLSAgICB2b2lkIGFkZEN1YmljKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MiwgZG91YmxlIHgzLCBkb3VibGUgeTMsIGRvdWJsZSB4NCwgZG91YmxlIHk0KSB7CisgICAgdm9pZCBhZGRDdWJpYyhkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIsIGRvdWJsZSB4MywgZG91YmxlIHkzLCBkb3VibGUgeDQsCisgICAgICAgICAgICBkb3VibGUgeTQpIHsKICAgICAgICAgZG91YmxlIHgxMiA9IHgxIC0geDI7CiAgICAgICAgIGRvdWJsZSB5MTIgPSB5MSAtIHkyOwogICAgICAgICBkb3VibGUgeDIzID0geDIgLSB4MzsKQEAgLTk5NywzNSArMTEwOSwzMiBAQAogCiAgICAgICAgIGlmIChsMTIgPT0gMC4wKSB7CiAgICAgICAgICAgICB3ID0gdzIgLyBsMjM7Ci0gICAgICAgICAgICBteDEgPSAgIHkyMyAqIHc7Ci0gICAgICAgICAgICBteTEgPSAtIHgyMyAqIHc7CisgICAgICAgICAgICBteDEgPSB5MjMgKiB3OworICAgICAgICAgICAgbXkxID0gLXgyMyAqIHc7CiAgICAgICAgICAgICB3ID0gdzIgLyBsMzQ7Ci0gICAgICAgICAgICBteDQgPSAgIHkzNCAqIHc7Ci0gICAgICAgICAgICBteTQgPSAtIHgzNCAqIHc7Ci0gICAgICAgICAgICBvbkxpbmUgPSAtIHgyMyAqIHkzNCArIHkyMyAqIHgzNCA9PSAwLjA7IC8vIHNpbjMKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChsMzQgPT0gMC4wKSB7CisgICAgICAgICAgICBteDQgPSB5MzQgKiB3OworICAgICAgICAgICAgbXk0ID0gLXgzNCAqIHc7CisgICAgICAgICAgICBvbkxpbmUgPSAteDIzICogeTM0ICsgeTIzICogeDM0ID09IDAuMDsgLy8gc2luMworICAgICAgICB9IGVsc2UgaWYgKGwzNCA9PSAwLjApIHsKICAgICAgICAgICAgIHcgPSB3MiAvIGwxMjsKLSAgICAgICAgICAgIG14MSA9ICAgeTEyICogdzsKLSAgICAgICAgICAgIG15MSA9IC0geDEyICogdzsKKyAgICAgICAgICAgIG14MSA9IHkxMiAqIHc7CisgICAgICAgICAgICBteTEgPSAteDEyICogdzsKICAgICAgICAgICAgIHcgPSB3MiAvIGwyMzsKLSAgICAgICAgICAgIG14NCA9ICAgeTIzICogdzsKLSAgICAgICAgICAgIG15NCA9IC0geDIzICogdzsKLSAgICAgICAgICAgIG9uTGluZSA9IC0geDEyICogeTIzICsgeTEyICogeDIzID09IDAuMDsgLy8gc2luMgorICAgICAgICAgICAgbXg0ID0geTIzICogdzsKKyAgICAgICAgICAgIG15NCA9IC14MjMgKiB3OworICAgICAgICAgICAgb25MaW5lID0gLXgxMiAqIHkyMyArIHkxMiAqIHgyMyA9PSAwLjA7IC8vIHNpbjIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHcgPSB3MiAvIGwxMjsKLSAgICAgICAgICAgIG14MSA9ICAgeTEyICogdzsKLSAgICAgICAgICAgIG15MSA9IC0geDEyICogdzsKKyAgICAgICAgICAgIG14MSA9IHkxMiAqIHc7CisgICAgICAgICAgICBteTEgPSAteDEyICogdzsKICAgICAgICAgICAgIHcgPSB3MiAvIGwzNDsKLSAgICAgICAgICAgIG14NCA9ICAgeTM0ICogdzsKLSAgICAgICAgICAgIG15NCA9IC0geDM0ICogdzsKKyAgICAgICAgICAgIG14NCA9IHkzNCAqIHc7CisgICAgICAgICAgICBteTQgPSAteDM0ICogdzsKICAgICAgICAgICAgIGlmIChsMjMgPT0gMC4wKSB7Ci0gICAgICAgICAgICAgICAgb25MaW5lID0gLSB4MTIgKiB5MzQgKyB5MTIgKiB4MzQgPT0gMC4wOworICAgICAgICAgICAgICAgIG9uTGluZSA9IC14MTIgKiB5MzQgKyB5MTIgKiB4MzQgPT0gMC4wOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvbkxpbmUgPQotICAgICAgICAgICAgICAgICAgICAtIHgxMiAqIHkzNCArIHkxMiAqIHgzNCA9PSAwLjAgJiYKLSAgICAgICAgICAgICAgICAgICAgLSB4MTIgKiB5MjMgKyB5MTIgKiB4MjMgPT0gMC4wICYmIC8vIHNpbjIKLSAgICAgICAgICAgICAgICAgICAgLSB4MjMgKiB5MzQgKyB5MjMgKiB4MzQgPT0gMC4wOyAgIC8vIHNpbjMKKyAgICAgICAgICAgICAgICBvbkxpbmUgPSAteDEyICogeTM0ICsgeTEyICogeDM0ID09IDAuMCAmJiAteDEyICogeTIzICsgeTEyICogeDIzID09IDAuMCAmJiAvLyBzaW4yCisgICAgICAgICAgICAgICAgICAgICAgICAteDIzICogeTM0ICsgeTIzICogeDM0ID09IDAuMDsgLy8gc2luMwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTEwNjMsOCArMTE3Miw3IEBACiAgICAgICAgICAgICAgICAgaWYgKDAuMCA8IHQgJiYgdCA8IDEuMCkgewogICAgICAgICAgICAgICAgICAgICByb290c1tyYysrXSA9IHQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpZiAoZCA+IDAuMCkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChkID4gMC4wKSB7CiAgICAgICAgICAgICAgICAgZCA9IE1hdGguc3FydChkKTsKICAgICAgICAgICAgICAgICBkb3VibGUgeiA9IGwxMiArIGwzNCAtIGwyMyAtIGwyMzsKICAgICAgICAgICAgICAgICBkb3VibGUgdDsKQEAgLTEwODcsMTUgKzExOTUsMTUgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcm9vdHNbcmMrK10gPSAxLjA7CiAKLSAgICAgICAgICAgICAgICBkb3VibGUgYXggPSAtIHgzNCAtIHgxMiArIHgyMyArIHgyMzsKLSAgICAgICAgICAgICAgICBkb3VibGUgYXkgPSAtIHkzNCAtIHkxMiArIHkyMyArIHkyMzsKLSAgICAgICAgICAgICAgICBkb3VibGUgYnggPSAzLjAgKiAoLSB4MjMgKyB4MTIpOwotICAgICAgICAgICAgICAgIGRvdWJsZSBieSA9IDMuMCAqICgtIHkyMyArIHkxMik7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGN4ID0gMy4wICogKC0geDEyKTsKLSAgICAgICAgICAgICAgICBkb3VibGUgY3kgPSAzLjAgKiAoLSB5MTIpOworICAgICAgICAgICAgICAgIGRvdWJsZSBheCA9IC14MzQgLSB4MTIgKyB4MjMgKyB4MjM7CisgICAgICAgICAgICAgICAgZG91YmxlIGF5ID0gLXkzNCAtIHkxMiArIHkyMyArIHkyMzsKKyAgICAgICAgICAgICAgICBkb3VibGUgYnggPSAzLjAgKiAoLXgyMyArIHgxMik7CisgICAgICAgICAgICAgICAgZG91YmxlIGJ5ID0gMy4wICogKC15MjMgKyB5MTIpOworICAgICAgICAgICAgICAgIGRvdWJsZSBjeCA9IDMuMCAqICgteDEyKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgY3kgPSAzLjAgKiAoLXkxMik7CiAgICAgICAgICAgICAgICAgZG91YmxlIHhQcmV2ID0geDE7CiAgICAgICAgICAgICAgICAgZG91YmxlIHlQcmV2ID0geTE7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJjOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJjOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQgPSByb290c1tpXTsKICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHB4ID0gdCAqICh0ICogKHQgKiBheCArIGJ4KSArIGN4KSArIHgxOwogICAgICAgICAgICAgICAgICAgICBkb3VibGUgcHkgPSB0ICogKHQgKiAodCAqIGF5ICsgYnkpICsgY3kpICsgeTE7CkBAIC0xMTA5LDggKzEyMTcsOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHhQcmV2ID0gcHg7CiAgICAgICAgICAgICAgICAgICAgIHlQcmV2ID0gcHk7Ci0gICAgICAgICAgICAgICAgICAgIG14MSA9IC0gbXgxOwotICAgICAgICAgICAgICAgICAgICBteTEgPSAtIG15MTsKKyAgICAgICAgICAgICAgICAgICAgbXgxID0gLW14MTsKKyAgICAgICAgICAgICAgICAgICAgbXkxID0gLW15MTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxwLmN1YmljVG8oeDIgKyBteDEsIHkyICsgbXkxLCB4MyArIG14NCwgeTMgKyBteTQsIHg0ICsgbXg0LCB5NCArIG15NCk7CkBAIC0xMTIyLDE5ICsxMjMwLDMwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3ViZGl2aWRlcyBzb2xpZCBjdWJpYyBjdXJ2ZSB0byBtYWtlIG91dGxpbmUgZm9yIHNvdXJjZSBxdWFkIHNlZ21lbnQgYW5kIGFkZHMgaXQgdG8gd29yayBwYXRoLgorICAgICAqIFN1YmRpdmlkZXMgc29saWQgY3ViaWMgY3VydmUgdG8gbWFrZSBvdXRsaW5lIGZvciBzb3VyY2UgcXVhZCBzZWdtZW50IGFuZAorICAgICAqIGFkZHMgaXQgdG8gd29yayBwYXRoLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geTEgLSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHgyIC0gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geTIgLSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB4MyAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRoaXJkIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geTMgLSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHg0IC0gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZm91cnMgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB5NCAtIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZvdXJzIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0gbGV2ZWwgLSB0aGUgbWF4aW11bSBsZXZlbCBvZiBzdWJkaXZpc2lvbiBkZWVwbmVzcworICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB4MworICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTMKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRoaXJkIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHg0CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmb3VycyBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5NAorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZm91cnMgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0gbGV2ZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIGxldmVsIG9mIHN1YmRpdmlzaW9uIGRlZXBuZXNzLgogICAgICAqLwotICAgIHZvaWQgYWRkU3ViQ3ViaWMoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBkb3VibGUgeDMsIGRvdWJsZSB5MywgZG91YmxlIHg0LCBkb3VibGUgeTQsIGludCBsZXZlbCkgeworICAgIHZvaWQgYWRkU3ViQ3ViaWMoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBkb3VibGUgeDMsIGRvdWJsZSB5MywgZG91YmxlIHg0LAorICAgICAgICAgICAgZG91YmxlIHk0LCBpbnQgbGV2ZWwpIHsKICAgICAgICAgZG91YmxlIHgxMiA9IHgxIC0geDI7CiAgICAgICAgIGRvdWJsZSB5MTIgPSB5MSAtIHkyOwogICAgICAgICBkb3VibGUgeDIzID0geDIgLSB4MzsKQEAgLTExNDIsMTkgKzEyNjEsMTggQEAKICAgICAgICAgZG91YmxlIHgzNCA9IHgzIC0geDQ7CiAgICAgICAgIGRvdWJsZSB5MzQgPSB5MyAtIHk0OwogCi0gICAgICAgIGRvdWJsZSBjb3MyID0gLSB4MTIgKiB4MjMgLSB5MTIgKiB5MjM7Ci0gICAgICAgIGRvdWJsZSBjb3MzID0gLSB4MjMgKiB4MzQgLSB5MjMgKiB5MzQ7Ci0gICAgICAgIGRvdWJsZSBzaW4yID0gLSB4MTIgKiB5MjMgKyB5MTIgKiB4MjM7Ci0gICAgICAgIGRvdWJsZSBzaW4zID0gLSB4MjMgKiB5MzQgKyB5MjMgKiB4MzQ7Ci0gICAgICAgIGRvdWJsZSBzaW4wID0gLSB4MTIgKiB5MzQgKyB5MTIgKiB4MzQ7Ci0gICAgICAgIGRvdWJsZSBjb3MwID0gLSB4MTIgKiB4MzQgLSB5MTIgKiB5MzQ7CisgICAgICAgIGRvdWJsZSBjb3MyID0gLXgxMiAqIHgyMyAtIHkxMiAqIHkyMzsKKyAgICAgICAgZG91YmxlIGNvczMgPSAteDIzICogeDM0IC0geTIzICogeTM0OworICAgICAgICBkb3VibGUgc2luMiA9IC14MTIgKiB5MjMgKyB5MTIgKiB4MjM7CisgICAgICAgIGRvdWJsZSBzaW4zID0gLXgyMyAqIHkzNCArIHkyMyAqIHgzNDsKKyAgICAgICAgZG91YmxlIHNpbjAgPSAteDEyICogeTM0ICsgeTEyICogeDM0OworICAgICAgICBkb3VibGUgY29zMCA9IC14MTIgKiB4MzQgLSB5MTIgKiB5MzQ7CiAKLSAgICAgICAgaWYgKGxldmVsIDwgTUFYX0xFVkVMICYmIChzaW4yICE9IDAuMCB8fCBzaW4zICE9IDAuMCB8fCBzaW4wICE9IDAuMCkgJiYKLSAgICAgICAgICAgIChjb3MyID49IDAuMCB8fCBjb3MzID49IDAuMCB8fCBjb3MwID49IDAuMCB8fAotICAgICAgICAgICAgKE1hdGguYWJzKHNpbjIgLyBjb3MyKSA+IGN1cnZlRGVsdGEpIHx8Ci0gICAgICAgICAgICAoTWF0aC5hYnMoc2luMyAvIGNvczMpID4gY3VydmVEZWx0YSkgfHwKLSAgICAgICAgICAgIChNYXRoLmFicyhzaW4wIC8gY29zMCkgPiBjdXJ2ZURlbHRhKSkpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKGxldmVsIDwgTUFYX0xFVkVMCisgICAgICAgICAgICAgICAgJiYgKHNpbjIgIT0gMC4wIHx8IHNpbjMgIT0gMC4wIHx8IHNpbjAgIT0gMC4wKQorICAgICAgICAgICAgICAgICYmIChjb3MyID49IDAuMCB8fCBjb3MzID49IDAuMCB8fCBjb3MwID49IDAuMAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKE1hdGguYWJzKHNpbjIgLyBjb3MyKSA+IGN1cnZlRGVsdGEpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTWF0aC5hYnMoc2luMyAvIGNvczMpID4gY3VydmVEZWx0YSkgfHwgKE1hdGguYWJzKHNpbjAgLyBjb3MwKSA+IGN1cnZlRGVsdGEpKSkgewogICAgICAgICAgICAgZG91YmxlIGN4ID0gKHgyICsgeDMpIC8gMi4wOwogICAgICAgICAgICAgZG91YmxlIGN5ID0gKHkyICsgeTMpIC8gMi4wOwogICAgICAgICAgICAgZG91YmxlIGx4MiA9ICh4MiArIHgxKSAvIDIuMDsKQEAgLTExNzcsMjcgKzEyOTUsMjYgQEAKIAogICAgICAgICAgICAgaWYgKGwxMiA9PSAwLjApIHsKICAgICAgICAgICAgICAgICB3ID0gdzIgLyBsMjM7Ci0gICAgICAgICAgICAgICAgbXgxID0gICB5MjMgKiB3OwotICAgICAgICAgICAgICAgIG15MSA9IC0geDIzICogdzsKKyAgICAgICAgICAgICAgICBteDEgPSB5MjMgKiB3OworICAgICAgICAgICAgICAgIG15MSA9IC14MjMgKiB3OwogICAgICAgICAgICAgICAgIHcgPSB3MiAvIGwzNDsKLSAgICAgICAgICAgICAgICBteDQgPSAgIHkzNCAqIHc7Ci0gICAgICAgICAgICAgICAgbXk0ID0gLSB4MzQgKiB3OwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpZiAobDM0ID09IDAuMCkgeworICAgICAgICAgICAgICAgIG14NCA9IHkzNCAqIHc7CisgICAgICAgICAgICAgICAgbXk0ID0gLXgzNCAqIHc7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGwzNCA9PSAwLjApIHsKICAgICAgICAgICAgICAgICB3ID0gdzIgLyBsMTI7Ci0gICAgICAgICAgICAgICAgbXgxID0gICB5MTIgKiB3OwotICAgICAgICAgICAgICAgIG15MSA9IC0geDEyICogdzsKKyAgICAgICAgICAgICAgICBteDEgPSB5MTIgKiB3OworICAgICAgICAgICAgICAgIG15MSA9IC14MTIgKiB3OwogICAgICAgICAgICAgICAgIHcgPSB3MiAvIGwyMzsKLSAgICAgICAgICAgICAgICBteDQgPSAgIHkyMyAqIHc7Ci0gICAgICAgICAgICAgICAgbXk0ID0gLSB4MjMgKiB3OworICAgICAgICAgICAgICAgIG14NCA9IHkyMyAqIHc7CisgICAgICAgICAgICAgICAgbXk0ID0gLXgyMyAqIHc7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIENvbW1vbiBjYXNlCiAgICAgICAgICAgICAgICAgdyA9IHcyIC8gbDEyOwotICAgICAgICAgICAgICAgIG14MSA9ICAgeTEyICogdzsKLSAgICAgICAgICAgICAgICBteTEgPSAtIHgxMiAqIHc7CisgICAgICAgICAgICAgICAgbXgxID0geTEyICogdzsKKyAgICAgICAgICAgICAgICBteTEgPSAteDEyICogdzsKICAgICAgICAgICAgICAgICB3ID0gdzIgLyBsMzQ7Ci0gICAgICAgICAgICAgICAgbXg0ID0gICB5MzQgKiB3OwotICAgICAgICAgICAgICAgIG15NCA9IC0geDM0ICogdzsKKyAgICAgICAgICAgICAgICBteDQgPSB5MzQgKiB3OworICAgICAgICAgICAgICAgIG15NCA9IC14MzQgKiB3OwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoc2luMiA9PSAwLjApIHsKQEAgLTEyMjUsMTAgKzEzNDIsMTQgQEAKICAgICAvKioKICAgICAgKiBBZGRzIGRhc2hlZCBsaW5lIHNlZ21lbnQgdG8gdGhlIHdvcmsgcGF0aC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydCBsaW5lIHBvaW50Ci0gICAgICogQHBhcmFtIHkxIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnQgbGluZSBwb2ludAotICAgICAqIEBwYXJhbSB4MiAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBsaW5lIHBvaW50Ci0gICAgICogQHBhcmFtIHkyIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIGxpbmUgcG9pbnQKKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0IGxpbmUgcG9pbnQuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydCBsaW5lIHBvaW50LgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIGxpbmUgcG9pbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgbGluZSBwb2ludC4KICAgICAgKi8KICAgICB2b2lkIGFkZERhc2hMaW5lKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MikgewogICAgICAgICBkb3VibGUgeDIxID0geDIgLSB4MTsKQEAgLTEyNDMsMTIgKzEzNjQsMTIgQEAKICAgICAgICAgZG91YmxlIHB4MSwgcHkxOwogICAgICAgICBweDEgPSBweTEgPSAwLjA7CiAgICAgICAgIGRvdWJsZSB3ID0gdzIgLyBsMjE7Ci0gICAgICAgIGRvdWJsZSBteCA9IC0geTIxICogdzsKLSAgICAgICAgZG91YmxlIG15ID0gICB4MjEgKiB3OworICAgICAgICBkb3VibGUgbXggPSAteTIxICogdzsKKyAgICAgICAgZG91YmxlIG15ID0geDIxICogdzsKIAogICAgICAgICBkYXNoZXIuaW5pdChuZXcgRGFzaEl0ZXJhdG9yLkxpbmUobDIxKSk7CiAKLSAgICAgICAgd2hpbGUoIWRhc2hlci5lb2YoKSkgeworICAgICAgICB3aGlsZSAoIWRhc2hlci5lb2YoKSkgewogICAgICAgICAgICAgZG91YmxlIHQgPSBkYXNoZXIuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgIHNjeCA9IHgxICsgdCAqIHgyMTsKICAgICAgICAgICAgIHNjeSA9IHkxICsgdCAqIHkyMTsKQEAgLTEyNzEsMjggKzEzOTIsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgYWRkSm9pbihscCwgeDEsIHkxLCBseDEsIGx5MSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIGFkZEpvaW4ocnAsIHgxLCB5MSwgcngxLCByeTEsIGZhbHNlKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBpZiAoZGFzaGVyLmlzQ29udGludWUoKSkgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgcHgyID0gc2N4OwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgcHkyID0gc2N5OwotICAgICAgICAgICAgICAgICAgICBscC5saW5lVG8ocHgyICsgbXgsIHB5MiArIG15KTsKLSAgICAgICAgICAgICAgICAgICAgcnAubGluZVRvKHB4MiAtIG14LCBweTIgLSBteSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkYXNoZXIuY2xvc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZENhcChscCwgcHgyLCBweTIsIHJwLnhMYXN0LCBycC55TGFzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBscC5jb21iaW5lKHJwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0ZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZteCA9IHNteDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXkgPSBzbXk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3AgPSBscDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscCA9IG5ldyBCdWZmZXJlZFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2FwKGxwLCBzbXgsIHNteSwgbHAueE1vdmUsIGxwLnlNb3ZlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC5jbG9zZVBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlzTW92ZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRhc2hlci5pc0NvbnRpbnVlKCkpIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgcHgyID0gc2N4OworICAgICAgICAgICAgICAgIGRvdWJsZSBweTIgPSBzY3k7CisgICAgICAgICAgICAgICAgbHAubGluZVRvKHB4MiArIG14LCBweTIgKyBteSk7CisgICAgICAgICAgICAgICAgcnAubGluZVRvKHB4MiAtIG14LCBweTIgLSBteSk7CisgICAgICAgICAgICAgICAgaWYgKGRhc2hlci5jbG9zZSkgeworICAgICAgICAgICAgICAgICAgICBhZGRDYXAobHAsIHB4MiwgcHkyLCBycC54TGFzdCwgcnAueUxhc3QpOworICAgICAgICAgICAgICAgICAgICBscC5jb21iaW5lKHJwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZteCA9IHNteDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZteSA9IHNteTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwID0gbHA7CisgICAgICAgICAgICAgICAgICAgICAgICBscCA9IG5ldyBCdWZmZXJlZFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZENhcChscCwgc214LCBzbXksIGxwLnhNb3ZlLCBscC55TW92ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBscC5jbG9zZVBhdGgoKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpc01vdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgZGFzaGVyLm5leHQoKTsKICAgICAgICAgfQpAQCAtMTMwMSwxMiArMTQyMSwxOCBAQAogICAgIC8qKgogICAgICAqIEFkZHMgZGFzaGVkIHF1YWQgc2VnbWVudCB0byB0aGUgd29yayBwYXRoLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geTEgLSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHgyIC0gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geTIgLSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB4MyAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRoaXJkIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geTMgLSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBjb250cm9sIHBvaW50CisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgzCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5MworICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludC4KICAgICAgKi8KICAgICB2b2lkIGFkZERhc2hRdWFkKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MiwgZG91YmxlIHgzLCBkb3VibGUgeTMpIHsKIApAQCAtMTM0NSw3ICsxNDcxLDcgQEAKIAogICAgICAgICBkYXNoZXIuaW5pdChuZXcgRGFzaEl0ZXJhdG9yLlF1YWQoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MykpOwogCi0gICAgICAgIHdoaWxlKCFkYXNoZXIuZW9mKCkpIHsKKyAgICAgICAgd2hpbGUgKCFkYXNoZXIuZW9mKCkpIHsKICAgICAgICAgICAgIGRvdWJsZSB0ID0gZGFzaGVyLmdldFZhbHVlKCk7CiAgICAgICAgICAgICBkb3VibGUgZHggPSB0ICogYXggKyBieDsKICAgICAgICAgICAgIGRvdWJsZSBkeSA9IHQgKiBheSArIGJ5OwpAQCAtMTM1Nyw4ICsxNDgzLDggQEAKICAgICAgICAgICAgICAgICBkeDEgPSBkeDsKICAgICAgICAgICAgICAgICBkeTEgPSBkeTsKICAgICAgICAgICAgICAgICBkb3VibGUgdyA9IHcyIC8gTWF0aC5zcXJ0KGR4MSAqIGR4MSArIGR5MSAqIGR5MSk7Ci0gICAgICAgICAgICAgICAgZG91YmxlIG14MSA9IC0gZHkxICogdzsKLSAgICAgICAgICAgICAgICBkb3VibGUgbXkxID0gICBkeDEgKiB3OworICAgICAgICAgICAgICAgIGRvdWJsZSBteDEgPSAtZHkxICogdzsKKyAgICAgICAgICAgICAgICBkb3VibGUgbXkxID0gZHgxICogdzsKICAgICAgICAgICAgICAgICBkb3VibGUgbHgxID0gcHgxICsgbXgxOwogICAgICAgICAgICAgICAgIGRvdWJsZSBseTEgPSBweTEgKyBteTE7CiAgICAgICAgICAgICAgICAgZG91YmxlIHJ4MSA9IHB4MSAtIG14MTsKQEAgLTEzNzQsMzMgKzE1MDAsMzIgQEAKICAgICAgICAgICAgICAgICAgICAgYWRkSm9pbihscCwgeDEsIHkxLCBseDEsIGx5MSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIGFkZEpvaW4ocnAsIHgxLCB5MSwgcngxLCByeTEsIGZhbHNlKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgCi0gICAgICAgICAgICAgICAgaWYgKGRhc2hlci5pc0NvbnRpbnVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHB4MyA9IHNjeDsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHB5MyA9IHNjeTsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHN4ID0geDIgLSB4MjMgKiBwcmV2OwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3kgPSB5MiAtIHkyMyAqIHByZXY7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0MiA9ICh0IC0gcHJldikgLyAoMSAtIHByZXYpOwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgcHgyID0gcHgxICsgKHN4IC0gcHgxKSAqIHQyOwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgcHkyID0gcHkxICsgKHN5IC0gcHkxKSAqIHQyOworICAgICAgICAgICAgfSBlbHNlIGlmIChkYXNoZXIuaXNDb250aW51ZSgpKSB7CisgICAgICAgICAgICAgICAgZG91YmxlIHB4MyA9IHNjeDsKKyAgICAgICAgICAgICAgICBkb3VibGUgcHkzID0gc2N5OworICAgICAgICAgICAgICAgIGRvdWJsZSBzeCA9IHgyIC0geDIzICogcHJldjsKKyAgICAgICAgICAgICAgICBkb3VibGUgc3kgPSB5MiAtIHkyMyAqIHByZXY7CisgICAgICAgICAgICAgICAgZG91YmxlIHQyID0gKHQgLSBwcmV2KSAvICgxIC0gcHJldik7CisgICAgICAgICAgICAgICAgZG91YmxlIHB4MiA9IHB4MSArIChzeCAtIHB4MSkgKiB0MjsKKyAgICAgICAgICAgICAgICBkb3VibGUgcHkyID0gcHkxICsgKHN5IC0gcHkxKSAqIHQyOwogCi0gICAgICAgICAgICAgICAgICAgIGFkZFF1YWQocHgxLCBweTEsIHB4MiwgcHkyLCBweDMsIHB5Myk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkYXNoZXIuaXNDbG9zZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2FwKGxwLCBweDMsIHB5MywgcnAueExhc3QsIHJwLnlMYXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwLmNvbWJpbmUocnApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm14ID0gc214OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZteSA9IHNteTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcCA9IGxwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwID0gbmV3IEJ1ZmZlcmVkUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRDYXAobHAsIHNteCwgc215LCBscC54TW92ZSwgbHAueU1vdmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLmNsb3NlUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaXNNb3ZlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBhZGRRdWFkKHB4MSwgcHkxLCBweDIsIHB5MiwgcHgzLCBweTMpOworICAgICAgICAgICAgICAgIGlmIChkYXNoZXIuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBhZGRDYXAobHAsIHB4MywgcHkzLCBycC54TGFzdCwgcnAueUxhc3QpOworICAgICAgICAgICAgICAgICAgICBscC5jb21iaW5lKHJwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZteCA9IHNteDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZteSA9IHNteTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwID0gbHA7CisgICAgICAgICAgICAgICAgICAgICAgICBscCA9IG5ldyBCdWZmZXJlZFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZENhcChscCwgc214LCBzbXksIGxwLnhNb3ZlLCBscC55TW92ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBscC5jbG9zZVBhdGgoKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpc01vdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcHJldiA9IHQ7CiAgICAgICAgICAgICBkYXNoZXIubmV4dCgpOwpAQCAtMTQxMCwxNiArMTUzNSwyNSBAQAogICAgIC8qKgogICAgICAqIEFkZHMgZGFzaGVkIGN1YmljIHNlZ21lbnQgdG8gdGhlIHdvcmsgcGF0aC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkxIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB4MiAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkyIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geDMgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkzIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB4NCAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZvdXJzIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geTQgLSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmb3VycyBjb250cm9sIHBvaW50CisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgzCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5MworICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDQKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZvdXJzIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHk0CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmb3VycyBjb250cm9sIHBvaW50LgogICAgICAqLwotICAgIHZvaWQgYWRkRGFzaEN1YmljKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MiwgZG91YmxlIHgzLCBkb3VibGUgeTMsIGRvdWJsZSB4NCwgZG91YmxlIHk0KSB7CisgICAgdm9pZCBhZGREYXNoQ3ViaWMoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBkb3VibGUgeDMsIGRvdWJsZSB5MywgZG91YmxlIHg0LAorICAgICAgICAgICAgZG91YmxlIHk0KSB7CiAKICAgICAgICAgZG91YmxlIHgxMiA9IHgxIC0geDI7CiAgICAgICAgIGRvdWJsZSB5MTIgPSB5MSAtIHkyOwpAQCAtMTQ2OSw3ICsxNjAzLDcgQEAKIAogICAgICAgICBkYXNoZXIuaW5pdChuZXcgRGFzaEl0ZXJhdG9yLkN1YmljKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NCkpOwogCi0gICAgICAgIHdoaWxlKCFkYXNoZXIuZW9mKCkpIHsKKyAgICAgICAgd2hpbGUgKCFkYXNoZXIuZW9mKCkpIHsKIAogICAgICAgICAgICAgZG91YmxlIHQgPSBkYXNoZXIuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgIHNjeCA9IHQgKiAodCAqICh0ICogYXggKyBieCkgKyBjeCkgKyBkeDsKQEAgLTE0ODAsOCArMTYxNCw4IEBACiAgICAgICAgICAgICAgICAgZG91YmxlIGR4MSA9IHQgKiAodCAqIChheCArIGF4ICsgYXgpICsgYnggKyBieCkgKyBjeDsKICAgICAgICAgICAgICAgICBkb3VibGUgZHkxID0gdCAqICh0ICogKGF5ICsgYXkgKyBheSkgKyBieSArIGJ5KSArIGN5OwogICAgICAgICAgICAgICAgIGRvdWJsZSB3ID0gdzIgLyBNYXRoLnNxcnQoZHgxICogZHgxICsgZHkxICogZHkxKTsKLSAgICAgICAgICAgICAgICBkb3VibGUgbXgxID0gLSBkeTEgKiB3OwotICAgICAgICAgICAgICAgIGRvdWJsZSBteTEgPSAgIGR4MSAqIHc7CisgICAgICAgICAgICAgICAgZG91YmxlIG14MSA9IC1keTEgKiB3OworICAgICAgICAgICAgICAgIGRvdWJsZSBteTEgPSBkeDEgKiB3OwogICAgICAgICAgICAgICAgIGRvdWJsZSBseDEgPSBweDEgKyBteDE7CiAgICAgICAgICAgICAgICAgZG91YmxlIGx5MSA9IHB5MSArIG15MTsKICAgICAgICAgICAgICAgICBkb3VibGUgcngxID0gcHgxIC0gbXgxOwpAQCAtMTQ5Nyw0MiArMTYzMSw0MSBAQAogICAgICAgICAgICAgICAgICAgICBhZGRKb2luKGxwLCB4MSwgeTEsIGx4MSwgbHkxLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgYWRkSm9pbihycCwgeDEsIHkxLCByeDEsIHJ5MSwgZmFsc2UpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSAKLSAgICAgICAgICAgICAgICBpZiAoZGFzaGVyLmlzQ29udGludWUoKSkgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3gxID0geDIgLSB4MjMgKiBwcmV2OwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3kxID0geTIgLSB5MjMgKiBwcmV2OwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3gyID0geDMgLSB4MzQgKiBwcmV2OwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3kyID0geTMgLSB5MzQgKiBwcmV2OwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3gzID0gc3gxICsgKHN4MiAtIHN4MSkgKiBwcmV2OwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3kzID0gc3kxICsgKHN5MiAtIHN5MSkgKiBwcmV2OwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgdDIgPSAodCAtIHByZXYpIC8gKDEgLSBwcmV2KTsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHN4NCA9IHN4MyArIChzeDIgLSBzeDMpICogdDI7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzeTQgPSBzeTMgKyAoc3kyIC0gc3kzKSAqIHQyOworICAgICAgICAgICAgfSBlbHNlIGlmIChkYXNoZXIuaXNDb250aW51ZSgpKSB7CisgICAgICAgICAgICAgICAgZG91YmxlIHN4MSA9IHgyIC0geDIzICogcHJldjsKKyAgICAgICAgICAgICAgICBkb3VibGUgc3kxID0geTIgLSB5MjMgKiBwcmV2OworICAgICAgICAgICAgICAgIGRvdWJsZSBzeDIgPSB4MyAtIHgzNCAqIHByZXY7CisgICAgICAgICAgICAgICAgZG91YmxlIHN5MiA9IHkzIC0geTM0ICogcHJldjsKKyAgICAgICAgICAgICAgICBkb3VibGUgc3gzID0gc3gxICsgKHN4MiAtIHN4MSkgKiBwcmV2OworICAgICAgICAgICAgICAgIGRvdWJsZSBzeTMgPSBzeTEgKyAoc3kyIC0gc3kxKSAqIHByZXY7CisgICAgICAgICAgICAgICAgZG91YmxlIHQyID0gKHQgLSBwcmV2KSAvICgxIC0gcHJldik7CisgICAgICAgICAgICAgICAgZG91YmxlIHN4NCA9IHN4MyArIChzeDIgLSBzeDMpICogdDI7CisgICAgICAgICAgICAgICAgZG91YmxlIHN5NCA9IHN5MyArIChzeTIgLSBzeTMpICogdDI7CiAKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHB4NCA9IHNjeDsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHB5NCA9IHNjeTsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHB4MiA9IHB4MSArIChzeDMgLSBweDEpICogdDI7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBweTIgPSBweTEgKyAoc3kzIC0gcHkxKSAqIHQyOwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgcHgzID0gcHgyICsgKHN4NCAtIHB4MikgKiB0MjsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHB5MyA9IHB5MiArIChzeTQgLSBweTIpICogdDI7CisgICAgICAgICAgICAgICAgZG91YmxlIHB4NCA9IHNjeDsKKyAgICAgICAgICAgICAgICBkb3VibGUgcHk0ID0gc2N5OworICAgICAgICAgICAgICAgIGRvdWJsZSBweDIgPSBweDEgKyAoc3gzIC0gcHgxKSAqIHQyOworICAgICAgICAgICAgICAgIGRvdWJsZSBweTIgPSBweTEgKyAoc3kzIC0gcHkxKSAqIHQyOworICAgICAgICAgICAgICAgIGRvdWJsZSBweDMgPSBweDIgKyAoc3g0IC0gcHgyKSAqIHQyOworICAgICAgICAgICAgICAgIGRvdWJsZSBweTMgPSBweTIgKyAoc3k0IC0gcHkyKSAqIHQyOwogCi0gICAgICAgICAgICAgICAgICAgIGFkZEN1YmljKHB4MSwgcHkxLCBweDIsIHB5MiwgcHgzLCBweTMsIHB4NCwgcHk0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRhc2hlci5pc0Nsb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRDYXAobHAsIHB4NCwgcHk0LCBycC54TGFzdCwgcnAueUxhc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgbHAuY29tYmluZShycCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGaXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXggPSBzbXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm15ID0gc215OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwID0gbHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAgPSBuZXcgQnVmZmVyZWRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZENhcChscCwgc214LCBzbXksIGxwLnhNb3ZlLCBscC55TW92ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAuY2xvc2VQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc01vdmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGFkZEN1YmljKHB4MSwgcHkxLCBweDIsIHB5MiwgcHgzLCBweTMsIHB4NCwgcHk0KTsKKyAgICAgICAgICAgICAgICBpZiAoZGFzaGVyLmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkQ2FwKGxwLCBweDQsIHB5NCwgcnAueExhc3QsIHJwLnlMYXN0KTsKKyAgICAgICAgICAgICAgICAgICAgbHAuY29tYmluZShycCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0ZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmbXggPSBzbXg7CisgICAgICAgICAgICAgICAgICAgICAgICBmbXkgPSBzbXk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcCA9IGxwOworICAgICAgICAgICAgICAgICAgICAgICAgbHAgPSBuZXcgQnVmZmVyZWRQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRDYXAobHAsIHNteCwgc215LCBscC54TW92ZSwgbHAueU1vdmUpOworICAgICAgICAgICAgICAgICAgICAgICAgbHAuY2xvc2VQYXRoKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaXNNb3ZlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHByZXYgPSB0OwogICAgICAgICAgICAgZGFzaGVyLm5leHQoKTsKQEAgLTE1NDMsMzAgKzE2NzYsNDQgQEAKICAgICAgKiBEYXNoZXIgY2xhc3MgcHJvdmlkZXMgZGFzaGluZyBmb3IgcGFydGljdWxhciBkYXNoIHN0eWxlLgogICAgICAqLwogICAgIGNsYXNzIERhc2hlciB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHBvcy4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBvcy4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSBwb3M7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGZpcnN0LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZmlyc3QuCisgICAgICAgICAqLwogICAgICAgICBib29sZWFuIGNsb3NlLCB2aXNpYmxlLCBmaXJzdDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgZGFzaC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhc2guCisgICAgICAgICAqLwogICAgICAgICBmbG9hdCBkYXNoW107Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHBoYXNlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcGhhc2UuCisgICAgICAgICAqLwogICAgICAgICBmbG9hdCBwaGFzZTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgaW5kZXguICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBpbmRleC4KKyAgICAgICAgICovCiAgICAgICAgIGludCBpbmRleDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgaXRlci4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGl0ZXIuCisgICAgICAgICAqLwogICAgICAgICBEYXNoSXRlcmF0b3IgaXRlcjsKLSAgICAgICAgCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXNoZXIuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gZGFzaCB0aGUgZGFzaAotICAgICAgICAgKiBAcGFyYW0gcGhhc2UgdGhlIHBoYXNlCisgICAgICAgICAqIEBwYXJhbSBkYXNoCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGRhc2guCisgICAgICAgICAqIEBwYXJhbSBwaGFzZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBwaGFzZS4KICAgICAgICAgICovCiAgICAgICAgIERhc2hlcihmbG9hdCBkYXNoW10sIGZsb2F0IHBoYXNlKSB7CiAgICAgICAgICAgICB0aGlzLmRhc2ggPSBkYXNoOwpAQCAtMTU3OCw1MiArMTcyNSw1MyBAQAogICAgICAgICAgICAgICAgIHZpc2libGUgPSAhdmlzaWJsZTsKICAgICAgICAgICAgICAgICBwb3MgLT0gZGFzaFtpbmRleF07CiAgICAgICAgICAgICAgICAgaW5kZXggPSAoaW5kZXggKyAxKSAlIGRhc2gubGVuZ3RoOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICAgICAgfQogICAgICAgICAgICAgcG9zID0gLXBvczsKICAgICAgICAgICAgIGZpcnN0ID0gdmlzaWJsZTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvKioKICAgICAgICAgICogSW5pdHMgdGhlLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXIKKyAgICAgICAgICogQHBhcmFtIGl0ZXIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgaXRlci4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgaW5pdChEYXNoSXRlcmF0b3IgaXRlcikgewogICAgICAgICAgICAgdGhpcy5pdGVyID0gaXRlcjsKICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvKioKICAgICAgICAgICogQ2hlY2tzIGlmIGlzIG9wZW4uCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIG9wZW4KKyAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiBpcyBvcGVuLgogICAgICAgICAgKi8KICAgICAgICAgYm9vbGVhbiBpc09wZW4oKSB7CiAgICAgICAgICAgICByZXR1cm4gdmlzaWJsZSAmJiBwb3MgPCBpdGVyLmxlbmd0aDsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvKioKICAgICAgICAgICogQ2hlY2tzIGlmIGlzIGNvbnRpbnVlLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiBpcyBjb250aW51ZQorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGNvbnRpbnVlLgogICAgICAgICAgKi8KICAgICAgICAgYm9vbGVhbiBpc0NvbnRpbnVlKCkgewogICAgICAgICAgICAgcmV0dXJuICF2aXNpYmxlICYmIHBvcyA+IDA7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIENoZWNrcyBpZiBpcyBjbG9zZWQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGNsb3NlZAorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGNsb3NlZC4KICAgICAgICAgICovCiAgICAgICAgIGJvb2xlYW4gaXNDbG9zZWQoKSB7CiAgICAgICAgICAgICByZXR1cm4gY2xvc2U7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIENoZWNrcyBpZiBpcyBjb25uZWN0ZWQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGNvbm5lY3RlZAorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGNvbm5lY3RlZC4KICAgICAgICAgICovCiAgICAgICAgIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7CiAgICAgICAgICAgICByZXR1cm4gZmlyc3QgJiYgIWNsb3NlOwpAQCAtMTYzMiw3ICsxNzgwLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEVvZi4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bAorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwuCiAgICAgICAgICAqLwogICAgICAgICBib29sZWFuIGVvZigpIHsKICAgICAgICAgICAgIGlmICghY2xvc2UpIHsKQEAgLTE2NDgsNyArMTc5Niw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIE5leHQuCiAgICAgICAgICAqLwpAQCAtMTY2MywxNyArMTgxMSwxNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgdmlzaWJsZSA9ICF2aXNpYmxlOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZXRzIHRoZSB2YWx1ZS4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlCisgICAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlLgogICAgICAgICAgKi8KICAgICAgICAgZG91YmxlIGdldFZhbHVlKCkgewogICAgICAgICAgICAgZG91YmxlIHQgPSBpdGVyLmdldE5leHQocG9zKTsKICAgICAgICAgICAgIHJldHVybiB0IDwgMCA/IDAgOiAodCA+IDEgPyAxIDogdCk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICB9CiAKICAgICAvKioKQEAgLTE2ODEsNyArMTgyOSw5IEBACiAgICAgICovCiAgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIERhc2hJdGVyYXRvciB7CiAKLSAgICAgICAgLyoqIFRoZSBDb25zdGFudCBGTEFUTkVTUy4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBDb25zdGFudCBGTEFUTkVTUy4KKyAgICAgICAgICovCiAgICAgICAgIHN0YXRpYyBmaW5hbCBkb3VibGUgRkxBVE5FU1MgPSAxLjA7CiAKICAgICAgICAgLyoqCkBAIC0xNjkyLDcgKzE4NDIsOCBAQAogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgbGluZS4KICAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICogQHBhcmFtIGxlbiB0aGUgbGVuCisgICAgICAgICAgICAgKiBAcGFyYW0gbGVuCisgICAgICAgICAgICAgKiAgICAgICAgICAgIHRoZSBsZW4uCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIExpbmUoZG91YmxlIGxlbikgewogICAgICAgICAgICAgICAgIGxlbmd0aCA9IGxlbjsKQEAgLTE3MTAsMzYgKzE4NjEsNTYgQEAKICAgICAgICAgICovCiAgICAgICAgIHN0YXRpYyBjbGFzcyBRdWFkIGV4dGVuZHMgRGFzaEl0ZXJhdG9yIHsKIAotICAgICAgICAgICAgLyoqIFRoZSB2YWwgc2l6ZS4gKi8KKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIHZhbCBzaXplLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpbnQgdmFsU2l6ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIFRoZSB2YWwgcG9zLiAqLworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSB2YWwgcG9zLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpbnQgdmFsUG9zOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogVGhlIGN1ciBsZW4uICovCisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIGN1ciBsZW4uCisgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGRvdWJsZSBjdXJMZW47Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgcHJldiBsZW4uICovCisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIHByZXYgbGVuLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBkb3VibGUgcHJldkxlbjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIFRoZSBsYXN0IGxlbi4gKi8KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgbGFzdCBsZW4uCisgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGRvdWJsZSBsYXN0TGVuOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogVGhlIHZhbHVlcy4gKi8KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgdmFsdWVzLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBkb3VibGVbXSB2YWx1ZXM7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgc3RlcC4gKi8KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgc3RlcC4KKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgZG91YmxlIHN0ZXA7CiAKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHF1YWQuCiAgICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBwYXJhbSB4MSB0aGUgeDEKLSAgICAgICAgICAgICAqIEBwYXJhbSB5MSB0aGUgeTEKLSAgICAgICAgICAgICAqIEBwYXJhbSB4MiB0aGUgeDIKLSAgICAgICAgICAgICAqIEBwYXJhbSB5MiB0aGUgeTIKLSAgICAgICAgICAgICAqIEBwYXJhbSB4MyB0aGUgeDMKLSAgICAgICAgICAgICAqIEBwYXJhbSB5MyB0aGUgeTMKKyAgICAgICAgICAgICAqIEBwYXJhbSB4MQorICAgICAgICAgICAgICogICAgICAgICAgICB0aGUgeDEuCisgICAgICAgICAgICAgKiBAcGFyYW0geTEKKyAgICAgICAgICAgICAqICAgICAgICAgICAgdGhlIHkxLgorICAgICAgICAgICAgICogQHBhcmFtIHgyCisgICAgICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4Mi4KKyAgICAgICAgICAgICAqIEBwYXJhbSB5MgorICAgICAgICAgICAgICogICAgICAgICAgICB0aGUgeTIuCisgICAgICAgICAgICAgKiBAcGFyYW0geDMKKyAgICAgICAgICAgICAqICAgICAgICAgICAgdGhlIHgzLgorICAgICAgICAgICAgICogQHBhcmFtIHkzCisgICAgICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5My4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgUXVhZChkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIsIGRvdWJsZSB4MywgZG91YmxlIHkzKSB7CiAKQEAgLTE3NjYsNyArMTkzNyw3IEBACiAgICAgICAgICAgICAgICAgZG91YmxlIHB2eCA9IHZ4OwogICAgICAgICAgICAgICAgIGRvdWJsZSBwdnkgPSB2eTsKICAgICAgICAgICAgICAgICBsZW5ndGggPSAwLjA7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHZ4ICs9IGR4MTsKICAgICAgICAgICAgICAgICAgICAgdnkgKz0gZHkxOwogICAgICAgICAgICAgICAgICAgICBkeDEgKz0gZHgyOwpAQCAtMTgwNCw0MCArMTk3NSw2MyBAQAogICAgICAgICAgKi8KICAgICAgICAgc3RhdGljIGNsYXNzIEN1YmljIGV4dGVuZHMgRGFzaEl0ZXJhdG9yIHsKIAotICAgICAgICAgICAgLyoqIFRoZSB2YWwgc2l6ZS4gKi8KKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIHZhbCBzaXplLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpbnQgdmFsU2l6ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIFRoZSB2YWwgcG9zLiAqLworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSB2YWwgcG9zLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpbnQgdmFsUG9zOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogVGhlIGN1ciBsZW4uICovCisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIGN1ciBsZW4uCisgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGRvdWJsZSBjdXJMZW47Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgcHJldiBsZW4uICovCisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIHByZXYgbGVuLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBkb3VibGUgcHJldkxlbjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIFRoZSBsYXN0IGxlbi4gKi8KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgbGFzdCBsZW4uCisgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGRvdWJsZSBsYXN0TGVuOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogVGhlIHZhbHVlcy4gKi8KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgdmFsdWVzLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBkb3VibGVbXSB2YWx1ZXM7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgc3RlcC4gKi8KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgc3RlcC4KKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgZG91YmxlIHN0ZXA7CiAKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGN1YmljLgogICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBAcGFyYW0geDEgdGhlIHgxCi0gICAgICAgICAgICAgKiBAcGFyYW0geTEgdGhlIHkxCi0gICAgICAgICAgICAgKiBAcGFyYW0geDIgdGhlIHgyCi0gICAgICAgICAgICAgKiBAcGFyYW0geTIgdGhlIHkyCi0gICAgICAgICAgICAgKiBAcGFyYW0geDMgdGhlIHgzCi0gICAgICAgICAgICAgKiBAcGFyYW0geTMgdGhlIHkzCi0gICAgICAgICAgICAgKiBAcGFyYW0geDQgdGhlIHg0Ci0gICAgICAgICAgICAgKiBAcGFyYW0geTQgdGhlIHk0CisgICAgICAgICAgICAgKiBAcGFyYW0geDEKKyAgICAgICAgICAgICAqICAgICAgICAgICAgdGhlIHgxLgorICAgICAgICAgICAgICogQHBhcmFtIHkxCisgICAgICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5MS4KKyAgICAgICAgICAgICAqIEBwYXJhbSB4MgorICAgICAgICAgICAgICogICAgICAgICAgICB0aGUgeDIuCisgICAgICAgICAgICAgKiBAcGFyYW0geTIKKyAgICAgICAgICAgICAqICAgICAgICAgICAgdGhlIHkyLgorICAgICAgICAgICAgICogQHBhcmFtIHgzCisgICAgICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4My4KKyAgICAgICAgICAgICAqIEBwYXJhbSB5MworICAgICAgICAgICAgICogICAgICAgICAgICB0aGUgeTMuCisgICAgICAgICAgICAgKiBAcGFyYW0geDQKKyAgICAgICAgICAgICAqICAgICAgICAgICAgdGhlIHg0LgorICAgICAgICAgICAgICogQHBhcmFtIHk0CisgICAgICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5NC4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ3ViaWMoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBkb3VibGUgeDMsIGRvdWJsZSB5MywgZG91YmxlIHg0LCBkb3VibGUgeTQpIHsKKyAgICAgICAgICAgIEN1YmljKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MiwgZG91YmxlIHgzLCBkb3VibGUgeTMsIGRvdWJsZSB4NCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHk0KSB7CiAKICAgICAgICAgICAgICAgICBkb3VibGUgbngxID0geDEgKyB4MyAtIHgyIC0geDI7CiAgICAgICAgICAgICAgICAgZG91YmxlIG55MSA9IHkxICsgeTMgLSB5MiAtIHkyOwpAQCAtMTg2OSw3ICsyMDYzLDcgQEAKICAgICAgICAgICAgICAgICBkb3VibGUgcHZ4ID0gdng7CiAgICAgICAgICAgICAgICAgZG91YmxlIHB2eSA9IHZ5OwogICAgICAgICAgICAgICAgIGxlbmd0aCA9IDAuMDsKLSAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgdnggKz0gZHgxOwogICAgICAgICAgICAgICAgICAgICB2eSArPSBkeTE7CiAgICAgICAgICAgICAgICAgICAgIGR4MSArPSBkeDI7CkBAIC0xOTA0LDE1ICsyMDk4LDE3IEBACiAKICAgICAgICAgfQogCi0gICAgICAgIC8qKiBUaGUgbGVuZ3RoLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGxlbmd0aC4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSBsZW5ndGg7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldHMgdGhlIG5leHQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gZGFzaFBvcyB0aGUgZGFzaCBwb3MKLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIG5leHQKKyAgICAgICAgICogQHBhcmFtIGRhc2hQb3MKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZGFzaCBwb3MuCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5leHQuCiAgICAgICAgICAqLwogICAgICAgICBhYnN0cmFjdCBkb3VibGUgZ2V0TmV4dChkb3VibGUgZGFzaFBvcyk7CiAKQEAgLTE5MjMsMzkgKzIxMTksNjAgQEAKICAgICAgKi8KICAgICBzdGF0aWMgY2xhc3MgQnVmZmVyZWRQYXRoIHsKIAotICAgICAgICAvKiogVGhlIENvbnN0YW50IGJ1ZkNhcGFjaXR5LiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIENvbnN0YW50IGJ1ZkNhcGFjaXR5LgorICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGJ1ZkNhcGFjaXR5ID0gMTA7CiAKLSAgICAgICAgLyoqIFRoZSBwb2ludCBzaGlmdC4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwb2ludCBzaGlmdC4KKyAgICAgICAgICovCiAgICAgICAgIHN0YXRpYyBpbnQgcG9pbnRTaGlmdFtdID0gewotICAgICAgICAgICAgICAgIDIsICAvLyBNT1ZFVE8KLSAgICAgICAgICAgICAgICAyLCAgLy8gTElORVRPCi0gICAgICAgICAgICAgICAgNCwgIC8vIFFVQURUTwotICAgICAgICAgICAgICAgIDYsICAvLyBDVUJJQ1RPCi0gICAgICAgICAgICAgICAgMH07IC8vIENMT1NFCisgICAgICAgICAgICAgICAgMiwgLy8gTU9WRVRPCisgICAgICAgICAgICAgICAgMiwgLy8gTElORVRPCisgICAgICAgICAgICAgICAgNCwgLy8gUVVBRFRPCisgICAgICAgICAgICAgICAgNiwgLy8gQ1VCSUNUTworICAgICAgICAgICAgICAgIDAKKyAgICAgICAgfTsgLy8gQ0xPU0UKIAotICAgICAgICAvKiogVGhlIHR5cGVzLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGVzLgorICAgICAgICAgKi8KICAgICAgICAgYnl0ZVtdIHR5cGVzOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBwb2ludHMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwb2ludHMuCisgICAgICAgICAqLwogICAgICAgICBmbG9hdFtdIHBvaW50czsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgdHlwZSBzaXplLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdHlwZSBzaXplLgorICAgICAgICAgKi8KICAgICAgICAgaW50IHR5cGVTaXplOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBwb2ludCBzaXplLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcG9pbnQgc2l6ZS4KKyAgICAgICAgICovCiAgICAgICAgIGludCBwb2ludFNpemU7CiAKLSAgICAgICAgLyoqIFRoZSB4IGxhc3QuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBsYXN0LgorICAgICAgICAgKi8KICAgICAgICAgZmxvYXQgeExhc3Q7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHkgbGFzdC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgbGFzdC4KKyAgICAgICAgICovCiAgICAgICAgIGZsb2F0IHlMYXN0OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB4IG1vdmUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IG1vdmUuCisgICAgICAgICAqLwogICAgICAgICBmbG9hdCB4TW92ZTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBtb3ZlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBtb3ZlLgorICAgICAgICAgKi8KICAgICAgICAgZmxvYXQgeU1vdmU7CiAKICAgICAgICAgLyoqCkBAIC0xOTY5LDggKzIxODYsMTAgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENoZWNrIGJ1Zi4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB0eXBlQ291bnQgdGhlIHR5cGUgY291bnQKLSAgICAgICAgICogQHBhcmFtIHBvaW50Q291bnQgdGhlIHBvaW50IGNvdW50CisgICAgICAgICAqIEBwYXJhbSB0eXBlQ291bnQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgdHlwZSBjb3VudC4KKyAgICAgICAgICogQHBhcmFtIHBvaW50Q291bnQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgcG9pbnQgY291bnQuCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIGNoZWNrQnVmKGludCB0eXBlQ291bnQsIGludCBwb2ludENvdW50KSB7CiAgICAgICAgICAgICBpZiAodHlwZVNpemUgKyB0eXBlQ291bnQgPiB0eXBlcy5sZW5ndGgpIHsKQEAgLTE5ODgsNyArMjIwNyw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDaGVja3MgaWYgaXMgZW1wdHkuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGVtcHR5CisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgZW1wdHkuCiAgICAgICAgICAqLwogICAgICAgICBib29sZWFuIGlzRW1wdHkoKSB7CiAgICAgICAgICAgICByZXR1cm4gdHlwZVNpemUgPT0gMDsKQEAgLTIwMDUsOCArMjIyNCwxMCBAQAogICAgICAgICAvKioKICAgICAgICAgICogTW92ZSB0by4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4IHRoZSB4Ci0gICAgICAgICAqIEBwYXJhbSB5IHRoZSB5CisgICAgICAgICAqIEBwYXJhbSB4CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHguCisgICAgICAgICAqIEBwYXJhbSB5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkuCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIG1vdmVUbyhkb3VibGUgeCwgZG91YmxlIHkpIHsKICAgICAgICAgICAgIGNoZWNrQnVmKDEsIDIpOwpAQCAtMjAxOCw4ICsyMjM5LDEwIEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBMaW5lIHRvLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHggdGhlIHgKLSAgICAgICAgICogQHBhcmFtIHkgdGhlIHkKKyAgICAgICAgICogQHBhcmFtIHgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeC4KKyAgICAgICAgICogQHBhcmFtIHkKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeS4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgbGluZVRvKGRvdWJsZSB4LCBkb3VibGUgeSkgewogICAgICAgICAgICAgY2hlY2tCdWYoMSwgMik7CkBAIC0yMDMxLDEwICsyMjU0LDE0IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBRdWFkIHRvLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHgxIHRoZSB4MQotICAgICAgICAgKiBAcGFyYW0geTEgdGhlIHkxCi0gICAgICAgICAqIEBwYXJhbSB4MiB0aGUgeDIKLSAgICAgICAgICogQHBhcmFtIHkyIHRoZSB5MgorICAgICAgICAgKiBAcGFyYW0geDEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeDEuCisgICAgICAgICAqIEBwYXJhbSB5MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5MS4KKyAgICAgICAgICogQHBhcmFtIHgyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHgyLgorICAgICAgICAgKiBAcGFyYW0geTIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeTIuCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIHF1YWRUbyhkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIpIHsKICAgICAgICAgICAgIGNoZWNrQnVmKDEsIDQpOwpAQCAtMjA0OCwxMiArMjI3NSwxOCBAQAogICAgICAgICAvKioKICAgICAgICAgICogQ3ViaWMgdG8uCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0geDEgdGhlIHgxCi0gICAgICAgICAqIEBwYXJhbSB5MSB0aGUgeTEKLSAgICAgICAgICogQHBhcmFtIHgyIHRoZSB4MgotICAgICAgICAgKiBAcGFyYW0geTIgdGhlIHkyCi0gICAgICAgICAqIEBwYXJhbSB4MyB0aGUgeDMKLSAgICAgICAgICogQHBhcmFtIHkzIHRoZSB5MworICAgICAgICAgKiBAcGFyYW0geDEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeDEuCisgICAgICAgICAqIEBwYXJhbSB5MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5MS4KKyAgICAgICAgICogQHBhcmFtIHgyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHgyLgorICAgICAgICAgKiBAcGFyYW0geTIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeTIuCisgICAgICAgICAqIEBwYXJhbSB4MworICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4My4KKyAgICAgICAgICogQHBhcmFtIHkzCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkzLgogICAgICAgICAgKi8KICAgICAgICAgdm9pZCBjdWJpY1RvKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MiwgZG91YmxlIHgzLCBkb3VibGUgeTMpIHsKICAgICAgICAgICAgIGNoZWNrQnVmKDEsIDYpOwpAQCAtMjA3Nyw4ICsyMzEwLDEwIEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBTZXRzIHRoZSBsYXN0LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHggdGhlIHgKLSAgICAgICAgICogQHBhcmFtIHkgdGhlIHkKKyAgICAgICAgICogQHBhcmFtIHgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeC4KKyAgICAgICAgICogQHBhcmFtIHkKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeS4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgc2V0TGFzdChkb3VibGUgeCwgZG91YmxlIHkpIHsKICAgICAgICAgICAgIHBvaW50c1twb2ludFNpemUgLSAyXSA9IHhMYXN0ID0gKGZsb2F0KXg7CkBAIC0yMDg4LDcgKzIzMjMsOCBAQAogICAgICAgICAvKioKICAgICAgICAgICogQXBwZW5kLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHAgdGhlIHAKKyAgICAgICAgICogQHBhcmFtIHAKKyAgICAgICAgICogICAgICAgICAgICB0aGUgcC4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgYXBwZW5kKEJ1ZmZlcmVkUGF0aCBwKSB7CiAgICAgICAgICAgICBjaGVja0J1ZihwLnR5cGVTaXplLCBwLnBvaW50U2l6ZSk7CkBAIC0yMTAzLDE4ICsyMzM5LDE5IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBBcHBlbmQgcmV2ZXJzZS4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBwIHRoZSBwCisgICAgICAgICAqIEBwYXJhbSBwCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHAuCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIGFwcGVuZFJldmVyc2UoQnVmZmVyZWRQYXRoIHApIHsKICAgICAgICAgICAgIGNoZWNrQnVmKHAudHlwZVNpemUsIHAucG9pbnRTaXplKTsKICAgICAgICAgICAgIC8vIFNraXAgbGFzdCBwb2ludCwgYmVhY2F1c2UgaXQncyB0aGUgZmlyc3QgcG9pbnQgb2YgdGhlIHNlY29uZCBwYXRoCi0gICAgICAgICAgICBmb3IoaW50IGkgPSBwLnBvaW50U2l6ZSAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gcC5wb2ludFNpemUgLSAyOyBpID49IDA7IGkgLT0gMikgewogICAgICAgICAgICAgICAgIHBvaW50c1twb2ludFNpemUrK10gPSBwLnBvaW50c1tpICsgMF07CiAgICAgICAgICAgICAgICAgcG9pbnRzW3BvaW50U2l6ZSsrXSA9IHAucG9pbnRzW2kgKyAxXTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFNraXAgZmlyc3QgdHlwZSwgYmVhY3VzZSBpdCdzIGFsd2F5cyBNT1ZFVE8KICAgICAgICAgICAgIGludCBjbG9zZUluZGV4ID0gMDsKLSAgICAgICAgICAgIGZvcihpbnQgaSA9IHAudHlwZVNpemUgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHAudHlwZVNpemUgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgIGJ5dGUgdHlwZSA9IHAudHlwZXNbaV07CiAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gUGF0aEl0ZXJhdG9yLlNFR19NT1ZFVE8pIHsKICAgICAgICAgICAgICAgICAgICAgdHlwZXNbY2xvc2VJbmRleF0gPSBQYXRoSXRlcmF0b3IuU0VHX01PVkVUTzsKQEAgLTIxMzMsNyArMjM3MCw4IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBKb2luLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHAgdGhlIHAKKyAgICAgICAgICogQHBhcmFtIHAKKyAgICAgICAgICogICAgICAgICAgICB0aGUgcC4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgam9pbihCdWZmZXJlZFBhdGggcCkgewogICAgICAgICAgICAgLy8gU2tpcCBNT1ZFVE8KQEAgLTIxNDksMTcgKzIzODcsMTggQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENvbWJpbmUuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gcCB0aGUgcAorICAgICAgICAgKiBAcGFyYW0gcAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBwLgogICAgICAgICAgKi8KICAgICAgICAgdm9pZCBjb21iaW5lKEJ1ZmZlcmVkUGF0aCBwKSB7CiAgICAgICAgICAgICBjaGVja0J1ZihwLnR5cGVTaXplIC0gMSwgcC5wb2ludFNpemUgLSAyKTsKICAgICAgICAgICAgIC8vIFNraXAgbGFzdCBwb2ludCwgYmVhY2F1c2UgaXQncyB0aGUgZmlyc3QgcG9pbnQgb2YgdGhlIHNlY29uZCBwYXRoCi0gICAgICAgICAgICBmb3IoaW50IGkgPSBwLnBvaW50U2l6ZSAtIDQ7IGkgPj0gMDsgaSAtPSAyKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gcC5wb2ludFNpemUgLSA0OyBpID49IDA7IGkgLT0gMikgewogICAgICAgICAgICAgICAgIHBvaW50c1twb2ludFNpemUrK10gPSBwLnBvaW50c1tpICsgMF07CiAgICAgICAgICAgICAgICAgcG9pbnRzW3BvaW50U2l6ZSsrXSA9IHAucG9pbnRzW2kgKyAxXTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFNraXAgZmlyc3QgdHlwZSwgYmVhY3VzZSBpdCdzIGFsd2F5cyBNT1ZFVE8KLSAgICAgICAgICAgIGZvcihpbnQgaSA9IHAudHlwZVNpemUgLSAxOyBpID49IDE7IGktLSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHAudHlwZVNpemUgLSAxOyBpID49IDE7IGktLSkgewogICAgICAgICAgICAgICAgIHR5cGVzW3R5cGVTaXplKytdID0gcC50eXBlc1tpXTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHhMYXN0ID0gcG9pbnRzW3BvaW50U2l6ZSAtIDJdOwpAQCAtMjE2OSwyOSArMjQwOCwzMCBAQAogICAgICAgICAvKioKICAgICAgICAgICogQ3JlYXRlcyB0aGUgZ2VuZXJhbCBwYXRoLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgZ2VuZXJhbCBwYXRoCisgICAgICAgICAqIEByZXR1cm4gdGhlIGdlbmVyYWwgcGF0aC4KICAgICAgICAgICovCiAgICAgICAgIEdlbmVyYWxQYXRoIGNyZWF0ZUdlbmVyYWxQYXRoKCkgewogICAgICAgICAgICAgR2VuZXJhbFBhdGggcCA9IG5ldyBHZW5lcmFsUGF0aCgpOwogICAgICAgICAgICAgaW50IGogPSAwOwotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHR5cGVTaXplOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVNpemU7IGkrKykgewogICAgICAgICAgICAgICAgIGludCB0eXBlID0gdHlwZXNbaV07Ci0gICAgICAgICAgICAgICAgc3dpdGNoKHR5cGUpewotICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19NT1ZFVE86Ci0gICAgICAgICAgICAgICAgICAgIHAubW92ZVRvKHBvaW50c1tqXSwgcG9pbnRzW2ogKyAxXSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19MSU5FVE86Ci0gICAgICAgICAgICAgICAgICAgIHAubGluZVRvKHBvaW50c1tqXSwgcG9pbnRzW2ogKyAxXSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19RVUFEVE86Ci0gICAgICAgICAgICAgICAgICAgIHAucXVhZFRvKHBvaW50c1tqXSwgcG9pbnRzW2ogKyAxXSwgcG9pbnRzW2ogKyAyXSwgcG9pbnRzW2ogKyAzXSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19DVUJJQ1RPOgotICAgICAgICAgICAgICAgICAgICBwLmN1cnZlVG8ocG9pbnRzW2pdLCBwb2ludHNbaiArIDFdLCBwb2ludHNbaiArIDJdLCBwb2ludHNbaiArIDNdLCBwb2ludHNbaiArIDRdLCBwb2ludHNbaiArIDVdKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0NMT1NFOgotICAgICAgICAgICAgICAgICAgICBwLmNsb3NlUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX01PVkVUTzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHAubW92ZVRvKHBvaW50c1tqXSwgcG9pbnRzW2ogKyAxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0xJTkVUTzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHAubGluZVRvKHBvaW50c1tqXSwgcG9pbnRzW2ogKyAxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX1FVQURUTzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHAucXVhZFRvKHBvaW50c1tqXSwgcG9pbnRzW2ogKyAxXSwgcG9pbnRzW2ogKyAyXSwgcG9pbnRzW2ogKyAzXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0NVQklDVE86CisgICAgICAgICAgICAgICAgICAgICAgICBwLmN1cnZlVG8ocG9pbnRzW2pdLCBwb2ludHNbaiArIDFdLCBwb2ludHNbaiArIDJdLCBwb2ludHNbaiArIDNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHNbaiArIDRdLCBwb2ludHNbaiArIDVdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdGhJdGVyYXRvci5TRUdfQ0xPU0U6CisgICAgICAgICAgICAgICAgICAgICAgICBwLmNsb3NlUGF0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGogKz0gcG9pbnRTaGlmdFt0eXBlXTsKICAgICAgICAgICAgIH0KQEAgLTIyMDEsNCArMjQ0MSwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9CdWZmZXJDYXBhYmlsaXRpZXMuamF2YSBiL2F3dC9qYXZhL2F3dC9CdWZmZXJDYXBhYmlsaXRpZXMuamF2YQppbmRleCA4MGU4YWRkLi5jZDVmZTdiIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvQnVmZmVyQ2FwYWJpbGl0aWVzLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0J1ZmZlckNhcGFiaWxpdGllcy5qYXZhCkBAIC0xOCwzNSArMTgsNDUgQEAKICAqIEBhdXRob3IgQWxleGV5IEEuIFBldHJlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dDsKIAotCiAvKioKLSAqIFRoZSBCdWZmZXJDYXBhYmlsaXRpZXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgY2FwYWJpbGl0aWVzIAotICogYW5kIG90aGVyIHByb3BlcnRpZXMgb2YgdGhlIGltYWdlIGJ1ZmZlcnMuCisgKiBUaGUgQnVmZmVyQ2FwYWJpbGl0aWVzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGNhcGFiaWxpdGllcyBhbmQgb3RoZXIgcHJvcGVydGllcworICogb2YgdGhlIGltYWdlIGJ1ZmZlcnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQnVmZmVyQ2FwYWJpbGl0aWVzIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLSAgICAKLSAgICAvKiogVGhlIGZyb250IGJ1ZmZlciBjYXBhYmlsaXRpZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZnJvbnQgYnVmZmVyIGNhcGFiaWxpdGllcy4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIEltYWdlQ2FwYWJpbGl0aWVzIGZyb250QnVmZmVyQ2FwYWJpbGl0aWVzOwotICAgIAotICAgIC8qKiBUaGUgYmFjayBidWZmZXIgY2FwYWJpbGl0aWVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGJhY2sgYnVmZmVyIGNhcGFiaWxpdGllcy4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIEltYWdlQ2FwYWJpbGl0aWVzIGJhY2tCdWZmZXJDYXBhYmlsaXRpZXM7Ci0gICAgCi0gICAgLyoqIFRoZSBmbGlwIGNvbnRlbnRzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGZsaXAgY29udGVudHMuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBGbGlwQ29udGVudHMgZmxpcENvbnRlbnRzOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJ1ZmZlckNhcGFiaWxpdGllcyBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZyb250QnVmZmVyQ2FwYWJpbGl0aWVzIHRoZSBmcm9udCBidWZmZXIgY2FwYWJpbGl0aWVzLCAKLSAgICAgKiBjYW4gbm90IGJlIG51bGwuCi0gICAgICogQHBhcmFtIGJhY2tCdWZmZXJDYXBhYmlsaXRpZXMgdGhlIHRoZSBiYWNrIGFuZCBpbnRlcm1lZGlhdGUgCi0gICAgICogYnVmZmVycyBjYXBhYmlsaXRpZXMsIGNhbiBub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gZmxpcENvbnRlbnRzIHRoZSBiYWNrIGJ1ZmZlciBjb250ZW50cyBhZnRlciBwYWdlIGZsaXBwaW5nLCAKLSAgICAgKiBudWxsIGlmIHBhZ2UgZmxpcHBpbmcgaXMgbm90IHVzZWQuCisgICAgICogQHBhcmFtIGZyb250QnVmZmVyQ2FwYWJpbGl0aWVzCisgICAgICogICAgICAgICAgICB0aGUgZnJvbnQgYnVmZmVyIGNhcGFiaWxpdGllcywgY2FuIG5vdCBiZSBudWxsLgorICAgICAqIEBwYXJhbSBiYWNrQnVmZmVyQ2FwYWJpbGl0aWVzCisgICAgICogICAgICAgICAgICB0aGUgdGhlIGJhY2sgYW5kIGludGVybWVkaWF0ZSBidWZmZXJzIGNhcGFiaWxpdGllcywgY2FuIG5vdCBiZQorICAgICAqICAgICAgICAgICAgbnVsbC4KKyAgICAgKiBAcGFyYW0gZmxpcENvbnRlbnRzCisgICAgICogICAgICAgICAgICB0aGUgYmFjayBidWZmZXIgY29udGVudHMgYWZ0ZXIgcGFnZSBmbGlwcGluZywgbnVsbCBpZiBwYWdlCisgICAgICogICAgICAgICAgICBmbGlwcGluZyBpcyBub3QgdXNlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgQnVmZmVyQ2FwYWJpbGl0aWVzKEltYWdlQ2FwYWJpbGl0aWVzIGZyb250QnVmZmVyQ2FwYWJpbGl0aWVzLCAKKyAgICBwdWJsaWMgQnVmZmVyQ2FwYWJpbGl0aWVzKEltYWdlQ2FwYWJpbGl0aWVzIGZyb250QnVmZmVyQ2FwYWJpbGl0aWVzLAogICAgICAgICAgICAgSW1hZ2VDYXBhYmlsaXRpZXMgYmFja0J1ZmZlckNhcGFiaWxpdGllcywgRmxpcENvbnRlbnRzIGZsaXBDb250ZW50cykgewogICAgICAgICBpZiAoZnJvbnRCdWZmZXJDYXBhYmlsaXRpZXMgPT0gbnVsbCB8fCBiYWNrQnVmZmVyQ2FwYWJpbGl0aWVzID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTcwLDggKzgwLDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBpbWFnZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGZyb250IGJ1ZmZlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZUNhcGFiaWxpdGllcyBvYmplY3QgcmVwcmVzZW50ZWQgY2FwYWJpbGl0aWVzIAotICAgICAqIG9mIHRoZSBmcm9udCBidWZmZXIuIAorICAgICAqIEByZXR1cm4gdGhlIEltYWdlQ2FwYWJpbGl0aWVzIG9iamVjdCByZXByZXNlbnRlZCBjYXBhYmlsaXRpZXMgb2YgdGhlCisgICAgICogICAgICAgICBmcm9udCBidWZmZXIuCiAgICAgICovCiAgICAgcHVibGljIEltYWdlQ2FwYWJpbGl0aWVzIGdldEZyb250QnVmZmVyQ2FwYWJpbGl0aWVzKCkgewogICAgICAgICByZXR1cm4gZnJvbnRCdWZmZXJDYXBhYmlsaXRpZXM7CkBAIC04MCwxNSArOTAsMTUgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBpbWFnZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGJhY2sgYnVmZmVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEltYWdlQ2FwYWJpbGl0aWVzIG9iamVjdCByZXByZXNlbnRlZCBjYXBhYmlsaXRpZXMgCi0gICAgICogb2YgdGhlIGJhY2sgYnVmZmVyLiAKKyAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZUNhcGFiaWxpdGllcyBvYmplY3QgcmVwcmVzZW50ZWQgY2FwYWJpbGl0aWVzIG9mIHRoZSBiYWNrCisgICAgICogICAgICAgICBidWZmZXIuCiAgICAgICovCiAgICAgcHVibGljIEltYWdlQ2FwYWJpbGl0aWVzIGdldEJhY2tCdWZmZXJDYXBhYmlsaXRpZXMoKSB7CiAgICAgICAgIHJldHVybiBiYWNrQnVmZmVyQ2FwYWJpbGl0aWVzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZsaXAgY29udGVudHMgb2YgdGhlIGJhY2sgYnVmZmVyIGFmdGVyIHBhZ2UtZmxpcHBpbmcuIAorICAgICAqIEdldHMgdGhlIGZsaXAgY29udGVudHMgb2YgdGhlIGJhY2sgYnVmZmVyIGFmdGVyIHBhZ2UtZmxpcHBpbmcuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgRmxpcENvbnRlbnRzIG9mIHRoZSBiYWNrIGJ1ZmZlciBhZnRlciBwYWdlLWZsaXBwaW5nLgogICAgICAqLwpAQCAtOTksOCArMTA5LDcgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhlIGJ1ZmZlciBzdHJhdGVneSB1c2VzIHBhZ2UgZmxpcHBpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgYnVmZmVyIHN0cmF0ZWd5IHVzZXMgcGFnZSBmbGlwcGluZywKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgYnVmZmVyIHN0cmF0ZWd5IHVzZXMgcGFnZSBmbGlwcGluZywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzUGFnZUZsaXBwaW5nKCkgewogICAgICAgICByZXR1cm4gZmxpcENvbnRlbnRzICE9IG51bGw7CkBAIC0xMTAsNyArMTE5LDcgQEAKICAgICAgKiBDaGVja3MgaWYgcGFnZSBmbGlwcGluZyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBmdWxsLXNjcmVlbiBtb2RlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgcGFnZSBmbGlwcGluZyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBmdWxsLXNjcmVlbiBtb2RlLAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGxTY3JlZW5SZXF1aXJlZCgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTE5LDM5ICsxMjgsNDAgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgcGFnZSBmbGlwcGluZyBjYW4gYmUgcGVyZm9ybWVkIHVzaW5nIG1vcmUgdGhhbiB0d28gYnVmZmVycy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHBhZ2UgZmxpcHBpbmcgY2FuIGJlIHBlcmZvcm1lZCB1c2luZyBtb3JlIHRoYW4gdHdvIGJ1ZmZlcnMsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgcGFnZSBmbGlwcGluZyBjYW4gYmUgcGVyZm9ybWVkIHVzaW5nIG1vcmUgdGhhbiB0d28KKyAgICAgKiAgICAgICAgIGJ1ZmZlcnMsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpQnVmZmVyQXZhaWxhYmxlKCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIEZsaXBDb250ZW50cyBjbGFzcyByZXByZXNlbnRzIGEgc2V0IG9mIHBvc3NpYmxlIGJhY2sgYnVmZmVyIGNvbnRlbnRzIAorICAgICAqIFRoZSBGbGlwQ29udGVudHMgY2xhc3MgcmVwcmVzZW50cyBhIHNldCBvZiBwb3NzaWJsZSBiYWNrIGJ1ZmZlciBjb250ZW50cwogICAgICAqIGFmdGVyIHBhZ2UtZmxpcHBpbmcuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGbGlwQ29udGVudHMgewotICAgICAgICAKKwogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGJhY2sgYnVmZmVyZWQgY29udGVudHMgYXJlIGNsZWFyZWQgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvciAKKyAgICAgICAgICogVGhlIGJhY2sgYnVmZmVyZWQgY29udGVudHMgYXJlIGNsZWFyZWQgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvcgogICAgICAgICAgKiBhZnRlciBmbGlwcGluZy4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRmxpcENvbnRlbnRzIEJBQ0tHUk9VTkQgPSBuZXcgRmxpcENvbnRlbnRzKCk7Ci0gICAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBiYWNrIGJ1ZmZlcmVkIGNvbnRlbnRzIGFyZSBjb3BpZWQgdG8gdGhlIGZyb250IGJ1ZmZlciBiZWZvcmUgCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBiYWNrIGJ1ZmZlcmVkIGNvbnRlbnRzIGFyZSBjb3BpZWQgdG8gdGhlIGZyb250IGJ1ZmZlciBiZWZvcmUKICAgICAgICAgICogZmxpcHBpbmcuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZsaXBDb250ZW50cyBDT1BJRUQgPSBuZXcgRmxpcENvbnRlbnRzKCk7Ci0gICAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBiYWNrIGJ1ZmZlciBjb250ZW50cyBhcmUgdGhlIHByaW9yIGNvbnRlbnRzIG9mIHRoZSAKLSAgICAgICAgICogZnJvbnQgYnVmZmVyLgorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYmFjayBidWZmZXIgY29udGVudHMgYXJlIHRoZSBwcmlvciBjb250ZW50cyBvZiB0aGUgZnJvbnQgYnVmZmVyLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBGbGlwQ29udGVudHMgUFJJT1IgPSBuZXcgRmxpcENvbnRlbnRzKCk7Ci0gICAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBiYWNrIGJ1ZmZlciBjb250ZW50cyBhcmUgdW5kZWZpbmVkIGFmdGVyIGZsaXBwaW5nIAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYmFjayBidWZmZXIgY29udGVudHMgYXJlIHVuZGVmaW5lZCBhZnRlciBmbGlwcGluZwogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBGbGlwQ29udGVudHMgVU5ERUZJTkVEID0gbmV3IEZsaXBDb250ZW50cygpOwogCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvQ29sb3IuamF2YSBiL2F3dC9qYXZhL2F3dC9Db2xvci5qYXZhCmluZGV4IGUxZTQxNzguLjkzYzUzMmQgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9Db2xvci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9Db2xvci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIE9sZWcgVi4gS2hhc2NoYW5za3kKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5hd3QuY29sb3IuQ29sb3JTcGFjZTsKQEAgLTMzLDE1NSArMzQsMjMwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIENvbG9yIGNsYXNzIGRlZmluZXMgY29sb3JzIGluIHRoZSBkZWZhdWx0IHNSR0IgY29sb3IgCi0gKiBzcGFjZSBvciBpbiB0aGUgc3BlY2lmaWVkIENvbG9yU3BhY2UuIEV2ZXJ5IENvbG9yIGNvbnRhaW5zIGFscGhhIHZhbHVlLgotICogVGhlIGFscGhhIHZhbHVlIGRlZmluZXMgdGhlIHRyYW5zcGFyZW5jeSBvZiBhIGNvbG9yIGFuZCBjYW4gYmUgcmVwcmVzZW50ZWQKLSAqIGJ5IGEgZmxvYXQgdmFsdWUgaW4gdGhlIHJhbmdlIDAuMCAtIDEuMCBvciAwIC0gMjU1LiAKLSAgKi8KKyAqIFRoZSBDb2xvciBjbGFzcyBkZWZpbmVzIGNvbG9ycyBpbiB0aGUgZGVmYXVsdCBzUkdCIGNvbG9yIHNwYWNlIG9yIGluIHRoZQorICogc3BlY2lmaWVkIENvbG9yU3BhY2UuIEV2ZXJ5IENvbG9yIGNvbnRhaW5zIGFscGhhIHZhbHVlLiBUaGUgYWxwaGEgdmFsdWUKKyAqIGRlZmluZXMgdGhlIHRyYW5zcGFyZW5jeSBvZiBhIGNvbG9yIGFuZCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgYSBmbG9hdCB2YWx1ZQorICogaW4gdGhlIHJhbmdlIDAuMCAtIDEuMCBvciAwIC0gMjU1LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIENvbG9yIGltcGxlbWVudHMgUGFpbnQsIFNlcmlhbGl6YWJsZSB7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTE4NTI2ODE2ODgxMTYxMDc3TDsKIAogICAgIC8qCi0gICAgICogVGhlIHZhbHVlcyBvZiB0aGUgZm9sbG93aW5nIGNvbG9ycyBhcmUgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3Igd2hpY2gKLSAgICAgKiBjYW4gYmUgcmV2ZWFsZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBvciBzaW1pbGFyIGNvZGU6Ci0gICAgICogICBDb2xvciBjID0gQ29sb3Iud2hpdGU7Ci0gICAgICogICBTeXN0ZW0ub3V0LnByaW50bG4oYyk7CisgICAgICogVGhlIHZhbHVlcyBvZiB0aGUgZm9sbG93aW5nIGNvbG9ycyBhcmUgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3IKKyAgICAgKiB3aGljaCBjYW4gYmUgcmV2ZWFsZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBvciBzaW1pbGFyIGNvZGU6IENvbG9yIGMgPQorICAgICAqIENvbG9yLndoaXRlOyBTeXN0ZW0ub3V0LnByaW50bG4oYyk7CiAgICAgICovCiAKLSAgICAvKiogVGhlIGNvbG9yIHdoaXRlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvciB3aGl0ZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIHdoaXRlID0gbmV3IENvbG9yKDI1NSwgMjU1LCAyNTUpOwogCi0gICAgLyoqIFRoZSBjb2xvciB3aGl0ZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3Igd2hpdGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBXSElURSA9IHdoaXRlOwogCi0gICAgLyoqIFRoZSBjb2xvciBsaWdodCBncmF5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvciBsaWdodCBncmF5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgbGlnaHRHcmF5ID0gbmV3IENvbG9yKDE5MiwgMTkyLCAxOTIpOwogCi0gICAgLyoqIFRoZSBjb2xvciBsaWdodCBncmF5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvciBsaWdodCBncmF5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgTElHSFRfR1JBWSA9IGxpZ2h0R3JheTsKIAotICAgIC8qKiBUaGUgY29sb3IgZ3JheS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3IgZ3JheS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIGdyYXkgPSBuZXcgQ29sb3IoMTI4LCAxMjgsIDEyOCk7CiAKLSAgICAvKiogVGhlIGNvbG9yIGdyYXkuICovCisgICAgLyoqCisgICAgICogVGhlIGNvbG9yIGdyYXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBHUkFZID0gZ3JheTsKIAotICAgIC8qKiBUaGUgY29sb3IgZGFyayBncmF5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvciBkYXJrIGdyYXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBkYXJrR3JheSA9IG5ldyBDb2xvcig2NCwgNjQsIDY0KTsKIAotICAgIC8qKiBUaGUgY29sb3IgZGFyayBncmF5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvciBkYXJrIGdyYXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBEQVJLX0dSQVkgPSBkYXJrR3JheTsKIAotICAgIC8qKiBUaGUgY29sb3IgYmxhY2suICovCisgICAgLyoqCisgICAgICogVGhlIGNvbG9yIGJsYWNrLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgYmxhY2sgPSBuZXcgQ29sb3IoMCwgMCwgMCk7CiAKLSAgICAvKiogVGhlIGNvbG9yIGJsYWNrLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvciBibGFjay4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIEJMQUNLID0gYmxhY2s7CiAKLSAgICAvKiogVGhlIGNvbG9yIHJlZC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3IgcmVkLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgcmVkID0gbmV3IENvbG9yKDI1NSwgMCwgMCk7CiAKLSAgICAvKiogVGhlIGNvbG9yIHJlZC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3IgcmVkLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgUkVEID0gcmVkOwogCi0gICAgLyoqIFRoZSBjb2xvciBwaW5rLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvciBwaW5rLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgcGluayA9IG5ldyBDb2xvcigyNTUsIDE3NSwgMTc1KTsKIAotICAgIC8qKiBUaGUgY29sb3IgcGluay4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3IgcGluay4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIFBJTksgPSBwaW5rOwogCi0gICAgLyoqIFRoZSBjb2xvciBvcmFuZ2UuICovCisgICAgLyoqCisgICAgICogVGhlIGNvbG9yIG9yYW5nZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIG9yYW5nZSA9IG5ldyBDb2xvcigyNTUsIDIwMCwgMCk7CiAKLSAgICAvKiogVGhlIGNvbG9yIG9yYW5nZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3Igb3JhbmdlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgT1JBTkdFID0gb3JhbmdlOwogCi0gICAgLyoqIFRoZSBjb2xvciB5ZWxsb3cuICovCisgICAgLyoqCisgICAgICogVGhlIGNvbG9yIHllbGxvdy4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIHllbGxvdyA9IG5ldyBDb2xvcigyNTUsIDI1NSwgMCk7CiAKLSAgICAvKiogVGhlIGNvbG9yIHllbGxvdy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3IgeWVsbG93LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgWUVMTE9XID0geWVsbG93OwogCi0gICAgLyoqIFRoZSBjb2xvciBncmVlbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3IgZ3JlZW4uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBncmVlbiA9IG5ldyBDb2xvcigwLCAyNTUsIDApOwogCi0gICAgLyoqIFRoZSBjb2xvciBncmVlbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3IgZ3JlZW4uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBHUkVFTiA9IGdyZWVuOwogCi0gICAgLyoqIFRoZSBjb2xvciBtYWdlbnRhLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvciBtYWdlbnRhLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgbWFnZW50YSA9IG5ldyBDb2xvcigyNTUsIDAsIDI1NSk7CiAKLSAgICAvKiogVGhlIGNvbG9yIG1hZ2VudGEuICovCisgICAgLyoqCisgICAgICogVGhlIGNvbG9yIG1hZ2VudGEuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBNQUdFTlRBID0gbWFnZW50YTsKIAotICAgIC8qKiBUaGUgY29sb3IgY3lhbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3IgY3lhbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIGN5YW4gPSBuZXcgQ29sb3IoMCwgMjU1LCAyNTUpOwogCi0gICAgLyoqIFRoZSBjb2xvciBjeWFuLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvciBjeWFuLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgQ1lBTiA9IGN5YW47CiAKLSAgICAvKiogVGhlIGNvbG9yIGJsdWUuICovCisgICAgLyoqCisgICAgICogVGhlIGNvbG9yIGJsdWUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBibHVlID0gbmV3IENvbG9yKDAsIDAsIDI1NSk7CiAKLSAgICAvKiogVGhlIGNvbG9yIGJsdWUuICovCisgICAgLyoqCisgICAgICogVGhlIGNvbG9yIGJsdWUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBCTFVFID0gYmx1ZTsKIAotICAgIC8qKiBpbnRlZ2VyIFJHQiB2YWx1ZS4gKi8KKyAgICAvKioKKyAgICAgKiBpbnRlZ2VyIFJHQiB2YWx1ZS4KKyAgICAgKi8KICAgICBpbnQgdmFsdWU7CiAKLSAgICAvKiogRmxvYXQgc1JHQiB2YWx1ZS4gKi8KKyAgICAvKioKKyAgICAgKiBGbG9hdCBzUkdCIHZhbHVlLgorICAgICAqLwogICAgIHByaXZhdGUgZmxvYXRbXSBmcmdidmFsdWU7CiAKLSAgICAvKiogQ29sb3IgaW4gYW4gYXJiaXRyYXJ5IGNvbG9yIHNwYWNlIHdpdGggPGNvZGU+ZmxvYXQ8L2NvZGU+IGNvbXBvbmVudHMuIElmIG51bGwsIG90aGVyIHZhbHVlIHNob3VsZCBiZSB1c2VkLiAqLworICAgIC8qKgorICAgICAqIENvbG9yIGluIGFuIGFyYml0cmFyeSBjb2xvciBzcGFjZSB3aXRoIDxjb2RlPmZsb2F0PC9jb2RlPiBjb21wb25lbnRzLiBJZgorICAgICAqIG51bGwsIG90aGVyIHZhbHVlIHNob3VsZCBiZSB1c2VkLgorICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgZnZhbHVlW107CiAKLSAgICAvKiogRmxvYXQgYWxwaGEgdmFsdWUuIElmIGZyZ2J2YWx1ZSBpcyBudWxsLCB0aGlzIGlzIG5vdCB2YWxpZCBkYXRhLiAqLworICAgIC8qKgorICAgICAqIEZsb2F0IGFscGhhIHZhbHVlLiBJZiBmcmdidmFsdWUgaXMgbnVsbCwgdGhpcyBpcyBub3QgdmFsaWQgZGF0YS4KKyAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0IGZhbHBoYTsKIAotICAgIC8qKiBUaGUgY29sb3IncyBjb2xvciBzcGFjZSBpZiBhcHBsaWNhYmxlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvcidzIGNvbG9yIHNwYWNlIGlmIGFwcGxpY2FibGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBDb2xvclNwYWNlIGNzOwogCiAgICAgLyoKLSAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIFNDQUxFX0ZBQ1RPUiBpcyBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvciB3aGljaAotICAgICAqIGNhbiBiZSByZXZlYWxlZCB1c2luZyB0aGUgZm9sbG93aW5nIGNvZGU6Ci0gICAgICogICBDb2xvciBjID0gbmV3IENvbG9yKDEwMCwgMTAwLCAxMDApOwotICAgICAqICAgQ29sb3IgYmMgPSBjLmJyaWdodGVyKCk7Ci0gICAgICogICBTeXN0ZW0ub3V0LnByaW50bG4oIkJyaWdodGVyIGZhY3RvcjogIiArICgoZmxvYXQpYy5nZXRSZWQoKSkvKChmbG9hdCliYy5nZXRSZWQoKSkpOwotICAgICAqICAgQ29sb3IgZGMgPSBjLmRhcmtlcigpOwotICAgICAqICAgU3lzdGVtLm91dC5wcmludGxuKCJEYXJrZXIgZmFjdG9yOiAiICsgKChmbG9hdClkYy5nZXRSZWQoKSkvKChmbG9hdCljLmdldFJlZCgpKSk7Ci0gICAgICogVGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBmb3IgYnJpZ2h0ZXIgYW5kIGRhcmtlciBtZXRob2RzLCBzbyB3ZSBuZWVkIG9ubHkKLSAgICAgKiBvbmUgc2NhbGUgZmFjdG9yIGZvciBib3RoLgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgU0NBTEVfRkFDVE9SIGlzIGJhc2VkIG9uIDEuNSByZWxlYXNlIGJlaGF2aW9yIHdoaWNoIGNhbgorICAgICAqIGJlIHJldmVhbGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29kZTogQ29sb3IgYyA9IG5ldyBDb2xvcigxMDAsIDEwMCwgMTAwKTsKKyAgICAgKiBDb2xvciBiYyA9IGMuYnJpZ2h0ZXIoKTsgU3lzdGVtLm91dC5wcmludGxuKCJCcmlnaHRlciBmYWN0b3I6ICIgKworICAgICAqICgoZmxvYXQpYy5nZXRSZWQoKSkvKChmbG9hdCliYy5nZXRSZWQoKSkpOyBDb2xvciBkYyA9IGMuZGFya2VyKCk7CisgICAgICogU3lzdGVtLm91dC5wcmludGxuKCJEYXJrZXIgZmFjdG9yOiAiICsKKyAgICAgKiAoKGZsb2F0KWRjLmdldFJlZCgpKS8oKGZsb2F0KWMuZ2V0UmVkKCkpKTsgVGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBmb3IKKyAgICAgKiBicmlnaHRlciBhbmQgZGFya2VyIG1ldGhvZHMsIHNvIHdlIG5lZWQgb25seSBvbmUgc2NhbGUgZmFjdG9yIGZvciBib3RoLgogICAgICAqLwotICAgIC8qKiBUaGUgQ29uc3RhbnQgU0NBTEVfRkFDVE9SLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBTQ0FMRV9GQUNUT1IuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIFNDQUxFX0ZBQ1RPUiA9IDAuNzsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgTUlOX1NDQUxBQkxFLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fU0NBTEFCTEUgPSAzOyAvLyBzaG91bGQgaW5jcmVhc2Ugd2hlbiBtdWx0aXBsaWVkIGJ5IFNDQUxFX0ZBQ1RPUgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBNSU5fU0NBTEFCTEUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9TQ0FMQUJMRSA9IDM7IC8vIHNob3VsZCBpbmNyZWFzZSB3aGVuCiAKLSAgICAvKiogVGhlIGN1cnJlbnQgcGFpbnQgY29udGV4dC4gKi8KKyAgICAvLyBtdWx0aXBsaWVkIGJ5IFNDQUxFX0ZBQ1RPUgorCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgcGFpbnQgY29udGV4dC4KKyAgICAgKi8KICAgICB0cmFuc2llbnQgcHJpdmF0ZSBQYWludENvbnRleHQgY3VycmVudFBhaW50Q29udGV4dDsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjb2xvciBpbiB0aGUgc3BlY2lmaWVkIENvbG9yU3BhY2UsIHRoZSBzcGVjaWZpZWQgY29sb3IgCi0gICAgICogY29tcG9uZW50cyBhbmQgdGhlIHNwZWNpZmllZCBhbHBoYS4gCisgICAgICogQ3JlYXRlcyBhIGNvbG9yIGluIHRoZSBzcGVjaWZpZWQgQ29sb3JTcGFjZSwgdGhlIHNwZWNpZmllZCBjb2xvcgorICAgICAqIGNvbXBvbmVudHMgYW5kIHRoZSBzcGVjaWZpZWQgYWxwaGEuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNzcGFjZSB0aGUgQ29sb3JTcGFjZSB0byBiZSB1c2VkIHRvIGRlZmluZSB0aGUgY29tcG9uZW50cy4KLSAgICAgKiBAcGFyYW0gY29tcG9uZW50cyB0aGUgY29tcG9uZW50cy4KLSAgICAgKiBAcGFyYW0gYWxwaGEgdGhlIGFscGhhLgorICAgICAqIEBwYXJhbSBjc3BhY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBDb2xvclNwYWNlIHRvIGJlIHVzZWQgdG8gZGVmaW5lIHRoZSBjb21wb25lbnRzLgorICAgICAqIEBwYXJhbSBjb21wb25lbnRzCisgICAgICogICAgICAgICAgICB0aGUgY29tcG9uZW50cy4KKyAgICAgKiBAcGFyYW0gYWxwaGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbHBoYS4KICAgICAgKi8KICAgICBwdWJsaWMgQ29sb3IoQ29sb3JTcGFjZSBjc3BhY2UsIGZsb2F0W10gY29tcG9uZW50cywgZmxvYXQgYWxwaGEpIHsKICAgICAgICAgaW50IG5Db21wcyA9IGNzcGFjZS5nZXROdW1Db21wb25lbnRzKCk7CiAgICAgICAgIGZsb2F0IGNvbXA7CiAgICAgICAgIGZ2YWx1ZSA9IG5ldyBmbG9hdFtuQ29tcHNdOwogCi0gICAgICAgIGZvcihpbnQgaT0wIDsgaTxuQ29tcHM7IGkrKykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Db21wczsgaSsrKSB7CiAgICAgICAgICAgICBjb21wID0gY29tcG9uZW50c1tpXTsKLSAgICAgICAgICAgIGlmKGNvbXAgPCAwLjBmIHx8IGNvbXAgPiAxLjBmKSB7Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjEwNz1Db2xvciBwYXJhbWV0ZXIgb3V0c2lkZSBvZiBleHBlY3RlZCByYW5nZTogY29tcG9uZW50IHswfS4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTA3IiwgaSkpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBpZiAoY29tcCA8IDAuMGYgfHwgY29tcCA+IDEuMGYpIHsKKyAgICAgICAgICAgICAgICAvLyBhd3QuMTA3PUNvbG9yIHBhcmFtZXRlciBvdXRzaWRlIG9mIGV4cGVjdGVkIHJhbmdlOiBjb21wb25lbnQKKyAgICAgICAgICAgICAgICAvLyB7MH0uCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xMDciLCBpKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZ2YWx1ZVtpXSA9IGNvbXBvbmVudHNbaV07CiAgICAgICAgIH0KQEAgLTE5NiwyMiArMjcyLDIyIEBACiAKICAgICAgICAgZnJnYnZhbHVlID0gY3MudG9SR0IoZnZhbHVlKTsKIAotICAgICAgICB2YWx1ZSA9ICAoKGludCkoZnJnYnZhbHVlWzJdKjI1NSArIDAuNSkpICAgIHwKLSAgICAgICAgICAgICAgICAoKChpbnQpKGZyZ2J2YWx1ZVsxXSoyNTUgKyAwLjUpKSA8PCA4ICkgIHwKLSAgICAgICAgICAgICAgICAoKChpbnQpKGZyZ2J2YWx1ZVswXSoyNTUgKyAwLjUpKSA8PCAxNiApIHwKLSAgICAgICAgICAgICAgICAoKChpbnQpKGZhbHBoYSoyNTUgKyAwLjUpKSA8PCAyNCApOworICAgICAgICB2YWx1ZSA9ICgoaW50KShmcmdidmFsdWVbMl0gKiAyNTUgKyAwLjUpKSB8ICgoKGludCkoZnJnYnZhbHVlWzFdICogMjU1ICsgMC41KSkgPDwgOCkKKyAgICAgICAgICAgICAgICB8ICgoKGludCkoZnJnYnZhbHVlWzBdICogMjU1ICsgMC41KSkgPDwgMTYpIHwgKCgoaW50KShmYWxwaGEgKiAyNTUgKyAwLjUpKSA8PCAyNCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHNSR0IgY29sb3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbWJpbmVkIAotICAgICAqIFJHQkEgdmFsdWUgY29uc2lzdGluZyBvZiB0aGUgYWxwaGEgY29tcG9uZW50IGluIGJpdHMgMjQtMzEsIAotICAgICAqIHRoZSByZWQgY29tcG9uZW50IGluIGJpdHMgMTYtMjMsIHRoZSBncmVlbiBjb21wb25lbnQgaW4gYml0cyA4LTE1LCAKLSAgICAgKiBhbmQgdGhlIGJsdWUgY29tcG9uZW50IGluIGJpdHMgMC03LiBJZiB0aGUgaGFzYWxwaGEgYXJndW1lbnQgaXMgCi0gICAgICogZmFsc2UsIHRoZSBhbHBoYSBoYXMgZGVmYXVsdCB2YWx1ZSAtIDI1NS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgc1JHQiBjb2xvciB3aXRoIHRoZSBzcGVjaWZpZWQgY29tYmluZWQgUkdCQSB2YWx1ZQorICAgICAqIGNvbnNpc3Rpbmcgb2YgdGhlIGFscGhhIGNvbXBvbmVudCBpbiBiaXRzIDI0LTMxLCB0aGUgcmVkIGNvbXBvbmVudCBpbgorICAgICAqIGJpdHMgMTYtMjMsIHRoZSBncmVlbiBjb21wb25lbnQgaW4gYml0cyA4LTE1LCBhbmQgdGhlIGJsdWUgY29tcG9uZW50IGluCisgICAgICogYml0cyAwLTcuIElmIHRoZSBoYXNhbHBoYSBhcmd1bWVudCBpcyBmYWxzZSwgdGhlIGFscGhhIGhhcyBkZWZhdWx0IHZhbHVlCisgICAgICogLSAyNTUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJnYmEgdGhlIFJHQkEgY29tcG9uZW50cy4KLSAgICAgKiBAcGFyYW0gaGFzQWxwaGEgYWxwaGEgcGFyYW1ldGVyIGlzIHRydWUgaWYgYWxwaGEgYml0cyBhcmUgdmFsaWQsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSByZ2JhCisgICAgICogICAgICAgICAgICB0aGUgUkdCQSBjb21wb25lbnRzLgorICAgICAqIEBwYXJhbSBoYXNBbHBoYQorICAgICAqICAgICAgICAgICAgdGhlIGFscGhhIHBhcmFtZXRlciBpcyB0cnVlIGlmIGFscGhhIGJpdHMgYXJlIHZhbGlkLCBmYWxzZQorICAgICAqICAgICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBDb2xvcihpbnQgcmdiYSwgYm9vbGVhbiBoYXNBbHBoYSkgewogICAgICAgICBpZiAoIWhhc0FscGhhKSB7CkBAIC0yMjIsMTMgKzI5OCwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBjb2xvciB3aXRoIHRoZSBzcGVjaWZpZWQgcmVkLCBncmVlbiwgYmx1ZSBhbmQgYWxwaGEgCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGNvbG9yIHdpdGggdGhlIHNwZWNpZmllZCByZWQsIGdyZWVuLCBibHVlIGFuZCBhbHBoYQogICAgICAqIGNvbXBvbmVudHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIHJlZCBjb21wb25lbnQuCi0gICAgICogQHBhcmFtIGcgdGhlIGdyZWVuIGNvbXBvbmVudC4KLSAgICAgKiBAcGFyYW0gYiB0aGUgYmx1ZSBjb21wb25lbnQuCi0gICAgICogQHBhcmFtIGEgdGhlIGFscGhhIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIHJlZCBjb21wb25lbnQuCisgICAgICogQHBhcmFtIGcKKyAgICAgKiAgICAgICAgICAgIHRoZSBncmVlbiBjb21wb25lbnQuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBibHVlIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gYQorICAgICAqICAgICAgICAgICAgdGhlIGFscGhhIGNvbXBvbmVudC4KICAgICAgKi8KICAgICBwdWJsaWMgQ29sb3IoaW50IHIsIGludCBnLCBpbnQgYiwgaW50IGEpIHsKICAgICAgICAgaWYgKChyICYgMHhGRikgIT0gciB8fCAoZyAmIDB4RkYpICE9IGcgfHwgKGIgJiAweEZGKSAhPSBiIHx8IChhICYgMHhGRikgIT0gYSkgewpAQCAtMjM5LDEyICszMTksMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgb3BhcXVlIHNSR0IgY29sb3Igd2l0aCB0aGUgc3BlY2lmaWVkIHJlZCwgZ3JlZW4sIAotICAgICAqIGFuZCBibHVlIHZhbHVlcy4gVGhlIEFscGhhIGNvbXBvbmVudCBpcyBzZXQgdG8gdGhlIGRlZmF1bHQgLSAxLjAuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IG9wYXF1ZSBzUkdCIGNvbG9yIHdpdGggdGhlIHNwZWNpZmllZCByZWQsIGdyZWVuLCBhbmQKKyAgICAgKiBibHVlIHZhbHVlcy4gVGhlIEFscGhhIGNvbXBvbmVudCBpcyBzZXQgdG8gdGhlIGRlZmF1bHQgLSAxLjAuCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIHJlZCBjb21wb25lbnQuIAotICAgICAqIEBwYXJhbSBnIHRoZSBncmVlbiBjb21wb25lbnQuCi0gICAgICogQHBhcmFtIGIgdGhlIGJsdWUgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgcmVkIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIGdyZWVuIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJsdWUgY29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBDb2xvcihpbnQgciwgaW50IGcsIGludCBiKSB7CiAgICAgICAgIGlmICgociAmIDB4RkYpICE9IHIgfHwgKGcgJiAweEZGKSAhPSBnIHx8IChiICYgMHhGRikgIT0gYikgewpAQCAtMjU2LDMxICszMzksMzIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgc1JHQiBjb2xvciB3aXRoIHRoZSBzcGVjaWZpZWQgCi0gICAgICogUkdCIHZhbHVlIGNvbnNpc3Rpbmcgb2YgdGhlIHJlZCBjb21wb25lbnQgaW4gYml0cyAxNi0yMywgCi0gICAgICogdGhlIGdyZWVuIGNvbXBvbmVudCBpbiBiaXRzIDgtMTUsIGFuZCB0aGUgYmx1ZSBjb21wb25lbnQgCi0gICAgICogaW4gYml0cyAwLTcuIEFscGhhIGhhcyBkZWZhdWx0IHZhbHVlIC0gMjU1LgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBzUkdCIGNvbG9yIHdpdGggdGhlIHNwZWNpZmllZCBSR0IgdmFsdWUgY29uc2lzdGluZyBvZgorICAgICAqIHRoZSByZWQgY29tcG9uZW50IGluIGJpdHMgMTYtMjMsIHRoZSBncmVlbiBjb21wb25lbnQgaW4gYml0cyA4LTE1LCBhbmQKKyAgICAgKiB0aGUgYmx1ZSBjb21wb25lbnQgaW4gYml0cyAwLTcuIEFscGhhIGhhcyBkZWZhdWx0IHZhbHVlIC0gMjU1LgogICAgICAqIAotICAgICAqIEBwYXJhbSByZ2IgdGhlIFJHQiBjb21wb25lbnRzLgorICAgICAqIEBwYXJhbSByZ2IKKyAgICAgKiAgICAgICAgICAgIHRoZSBSR0IgY29tcG9uZW50cy4KICAgICAgKi8KICAgICBwdWJsaWMgQ29sb3IoaW50IHJnYikgewogICAgICAgICB2YWx1ZSA9IHJnYiB8IDB4RkYwMDAwMDA7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGNvbG9yIHdpdGggdGhlIHNwZWNpZmllZCByZWQsIGdyZWVuLCBibHVlIGFuZCBhbHBoYSAKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgY29sb3Igd2l0aCB0aGUgc3BlY2lmaWVkIHJlZCwgZ3JlZW4sIGJsdWUgYW5kIGFscGhhCiAgICAgICogY29tcG9uZW50cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gciB0aGUgcmVkIGNvbXBvbmVudC4KLSAgICAgKiBAcGFyYW0gZyB0aGUgZ3JlZW4gY29tcG9uZW50LgotICAgICAqIEBwYXJhbSBiIHRoZSBibHVlIGNvbXBvbmVudC4KLSAgICAgKiBAcGFyYW0gYSB0aGUgYWxwaGEgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgcmVkIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIGdyZWVuIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJsdWUgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSBhCisgICAgICogICAgICAgICAgICB0aGUgYWxwaGEgY29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKSB7Ci0gICAgICAgIHRoaXMoKGludCkocioyNTUrMC41KSwKLSAgICAgICAgICAgICAgICAoaW50KShnKjI1NSswLjUpLAotICAgICAgICAgICAgICAgIChpbnQpKGIqMjU1KzAuNSksCi0gICAgICAgICAgICAgICAgKGludCkoYSoyNTUrMC41KSk7CisgICAgICAgIHRoaXMoKGludCkociAqIDI1NSArIDAuNSksIChpbnQpKGcgKiAyNTUgKyAwLjUpLCAoaW50KShiICogMjU1ICsgMC41KSwgKGludCkoYSAqIDI1NSArIDAuNSkpOwogICAgICAgICBmYWxwaGEgPSBhOwogICAgICAgICBmdmFsdWUgPSBuZXcgZmxvYXRbM107CiAgICAgICAgIGZ2YWx1ZVswXSA9IHI7CkBAIC0yOTAsMjUgKzM3NCwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBjb2xvciB3aXRoIHRoZSBzcGVjaWZpZWQgcmVkLCBncmVlbiwgYW5kIGJsdWUgCi0gICAgICogY29tcG9uZW50cyBhbmQgZGVmYXVsdCBhbGZhIHZhbHVlIC0gMS4wLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBjb2xvciB3aXRoIHRoZSBzcGVjaWZpZWQgcmVkLCBncmVlbiwgYW5kIGJsdWUKKyAgICAgKiBjb21wb25lbnRzIGFuZCBkZWZhdWx0IGFscGhhIHZhbHVlIC0gMS4wLgogICAgICAqIAotICAgICAqIEBwYXJhbSByIHRoZSByZWQgY29tcG9uZW50LgotICAgICAqIEBwYXJhbSBnIHRoZSBncmVlbiBjb21wb25lbnQuCi0gICAgICogQHBhcmFtIGIgdGhlIGJsdWUgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgcmVkIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIGdyZWVuIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJsdWUgY29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKSB7CiAgICAgICAgIHRoaXMociwgZywgYiwgMS4wZik7CiAgICAgfQogCi0gICAgcHVibGljIFBhaW50Q29udGV4dCBjcmVhdGVDb250ZXh0KAotICAgICAgICAgICAgQ29sb3JNb2RlbCBjbSwKLSAgICAgICAgICAgIFJlY3RhbmdsZSByLAotICAgICAgICAgICAgUmVjdGFuZ2xlMkQgcjJkLAotICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHhmb3JtLAotICAgICAgICAgICAgUmVuZGVyaW5nSGludHMgcmhzCi0gICAgKSB7Ci0gICAgICAgIGlmKGN1cnJlbnRQYWludENvbnRleHQgIT0gbnVsbCkgeworICAgIHB1YmxpYyBQYWludENvbnRleHQgY3JlYXRlQ29udGV4dChDb2xvck1vZGVsIGNtLCBSZWN0YW5nbGUgciwgUmVjdGFuZ2xlMkQgcjJkLAorICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHhmb3JtLCBSZW5kZXJpbmdIaW50cyByaHMpIHsKKyAgICAgICAgaWYgKGN1cnJlbnRQYWludENvbnRleHQgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRQYWludENvbnRleHQ7CiAgICAgICAgIH0KICAgICAgICAgY3VycmVudFBhaW50Q29udGV4dCA9IG5ldyBDb2xvci5Db2xvclBhaW50Q29udGV4dCh2YWx1ZSk7CkBAIC0zMjMsMTUgKzQwNSwxMiBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIC8qCi0gICAgICAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIHN0cmluZyBpcyBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvciB3aGljaAotICAgICAgICAgICBjYW4gYmUgcmV2ZWFsZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb2RlOgorICAgICAgICAgKiBUaGUgZm9ybWF0IG9mIHRoZSBzdHJpbmcgaXMgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3Igd2hpY2ggY2FuCisgICAgICAgICAqIGJlIHJldmVhbGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29kZTogQ29sb3IgYyA9IG5ldyBDb2xvcigxLCAyLCAzKTsKKyAgICAgICAgICogU3lzdGVtLm91dC5wcmludGxuKGMpOworICAgICAgICAgKi8KIAotICAgICAgICAgICBDb2xvciBjID0gbmV3IENvbG9yKDEsIDIsIDMpOwotICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYyk7Ci0gICAgICAgICovCi0gICAgICAgIAotICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICJbcj0iICsgZ2V0UmVkKCkgKyAvLyROT04tTkxTLTEkCisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICJbcj0iICsgZ2V0UmVkKCkgKyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICAgIixnPSIgKyBnZXRHcmVlbigpICsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICIsYj0iICsgZ2V0Qmx1ZSgpICsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICJdIjsgLy8kTk9OLU5MUy0xJApAQCAtMzQwLDY1ICs0MTksNjcgQEAKICAgICAvKioKICAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIE9iamVjdCB0byB0aGUgQ29sb3IuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9iaiB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBPYmplY3QgaXMgYSBDb2xvciB3aG9zZSAKLSAgICAgKiB2YWx1ZSBpcyBlcXVhbCB0byB0aGlzIENvbG9yLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgT2JqZWN0IGlzIGEgQ29sb3Igd2hvc2UgdmFsdWUgaXMgZXF1YWwgdG8KKyAgICAgKiAgICAgICAgIHRoaXMgQ29sb3IsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZihvYmogaW5zdGFuY2VvZiBDb2xvcikgeworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29sb3IpIHsKICAgICAgICAgICAgIHJldHVybiAoKENvbG9yKW9iaikudmFsdWUgPT0gdGhpcy52YWx1ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGZsb2F0IGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbG9yIGFuZCBhbHBoYSBjb21wb25lbnRzIG9mIAotICAgICAqIHRoZSBDb2xvciBpbiB0aGUgc3BlY2lmaWVkIENvbG9yU3BhY2UuIAorICAgICAqIFJldHVybnMgYSBmbG9hdCBhcnJheSBjb250YWluaW5nIHRoZSBjb2xvciBhbmQgYWxwaGEgY29tcG9uZW50cyBvZiB0aGUKKyAgICAgKiBDb2xvciBpbiB0aGUgc3BlY2lmaWVkIENvbG9yU3BhY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yU3BhY2UgdGhlIHNwZWNpZmllZCBDb2xvclNwYWNlLgotICAgICAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgd3JpdHRlbiB0bwotICAgICAqIHRoaXMgZmxvYXQgYXJyYXkuIElmIG51bGwsIGEgZmxvYXQgYXJyYXkgd2lsbCBiZSBjcmVhdGVkLgotICAgICAqIAorICAgICAqIEBwYXJhbSBjb2xvclNwYWNlCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIENvbG9yU3BhY2UuCisgICAgICogQHBhcmFtIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzIGZsb2F0CisgICAgICogICAgICAgICAgICBhcnJheS4gSWYgbnVsbCwgYSBmbG9hdCBhcnJheSB3aWxsIGJlIGNyZWF0ZWQuCiAgICAgICogQHJldHVybiB0aGUgY29sb3IgYW5kIGFscGhhIGNvbXBvbmVudHMgaW4gYSBmbG9hdCBhcnJheS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXRbXSBnZXRDb21wb25lbnRzKENvbG9yU3BhY2UgY29sb3JTcGFjZSwgZmxvYXRbXSBjb21wb25lbnRzKSB7CiAgICAgICAgIGludCBuQ29tcHMgPSBjb2xvclNwYWNlLmdldE51bUNvbXBvbmVudHMoKTsKLSAgICAgICAgaWYoY29tcG9uZW50cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb21wb25lbnRzID0gbmV3IGZsb2F0W25Db21wcysxXTsKKyAgICAgICAgaWYgKGNvbXBvbmVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgY29tcG9uZW50cyA9IG5ldyBmbG9hdFtuQ29tcHMgKyAxXTsKICAgICAgICAgfQogCiAgICAgICAgIGdldENvbG9yQ29tcG9uZW50cyhjb2xvclNwYWNlLCBjb21wb25lbnRzKTsKIAotICAgICAgICBpZihmcmdidmFsdWUgIT0gbnVsbCkgeworICAgICAgICBpZiAoZnJnYnZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgIGNvbXBvbmVudHNbbkNvbXBzXSA9IGZhbHBoYTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbXBvbmVudHNbbkNvbXBzXSA9IGdldEFscGhhKCkvMjU1ZjsKKyAgICAgICAgICAgIGNvbXBvbmVudHNbbkNvbXBzXSA9IGdldEFscGhhKCkgLyAyNTVmOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGZsb2F0IGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbG9yIGNvbXBvbmVudHMgb2YgCi0gICAgICogdGhlIENvbG9yIGluIHRoZSBzcGVjaWZpZWQgQ29sb3JTcGFjZS4KKyAgICAgKiBSZXR1cm5zIGEgZmxvYXQgYXJyYXkgY29udGFpbmluZyB0aGUgY29sb3IgY29tcG9uZW50cyBvZiB0aGUgQ29sb3IgaW4gdGhlCisgICAgICogc3BlY2lmaWVkIENvbG9yU3BhY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yU3BhY2UgdGhlIHNwZWNpZmllZCBDb2xvclNwYWNlLgotICAgICAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgd3JpdHRlbiB0bwotICAgICAqIHRoaXMgZmxvYXQgYXJyYXkuIElmIG51bGwsIGEgZmxvYXQgYXJyYXkgd2lsbCBiZSBjcmVhdGVkLgotICAgICAqIAorICAgICAqIEBwYXJhbSBjb2xvclNwYWNlCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIENvbG9yU3BhY2UuCisgICAgICogQHBhcmFtIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzIGZsb2F0CisgICAgICogICAgICAgICAgICBhcnJheS4gSWYgbnVsbCwgYSBmbG9hdCBhcnJheSB3aWxsIGJlIGNyZWF0ZWQuCiAgICAgICogQHJldHVybiB0aGUgY29sb3IgY29tcG9uZW50cyBpbiBhIGZsb2F0IGFycmF5LgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdFtdIGdldENvbG9yQ29tcG9uZW50cyhDb2xvclNwYWNlIGNvbG9yU3BhY2UsIGZsb2F0W10gY29tcG9uZW50cykgewogICAgICAgICBmbG9hdFtdIGNpZVhZWkNvbXBvbmVudHMgPSBnZXRDb2xvclNwYWNlKCkudG9DSUVYWVooZ2V0Q29sb3JDb21wb25lbnRzKG51bGwpKTsKICAgICAgICAgZmxvYXRbXSBjc0NvbXBvbmVudHMgPSBjb2xvclNwYWNlLmZyb21DSUVYWVooY2llWFlaQ29tcG9uZW50cyk7CiAKLSAgICAgICAgaWYoY29tcG9uZW50cyA9PSBudWxsKSB7CisgICAgICAgIGlmIChjb21wb25lbnRzID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBjc0NvbXBvbmVudHM7CiAgICAgICAgIH0KIAotICAgICAgICBmb3IoaW50IGk9MDsgaTxjc0NvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjc0NvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIGNvbXBvbmVudHNbaV0gPSBjc0NvbXBvbmVudHNbaV07CiAgICAgICAgIH0KIApAQCAtNDE5LDE2ICs1MDAsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9yIHdoaWNoIGlzIGEgZGFya2VyIHRoYW4gdGhpcyBDb2xvcgotICAgICAqIGFjY29yZGluZyB0byBhIGZpeGVkIHNjYWxlIGZhY3Rvci4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9yIHdoaWNoIGlzIGEgZGFya2VyIHRoYW4gdGhpcyBDb2xvciBhY2NvcmRpbmcgdG8gYQorICAgICAqIGZpeGVkIHNjYWxlIGZhY3Rvci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBkYXJrZXIgQ29sb3IuCiAgICAgICovCiAgICAgcHVibGljIENvbG9yIGRhcmtlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb2xvcigKLSAgICAgICAgICAgICAgICAoaW50KShnZXRSZWQoKSpTQ0FMRV9GQUNUT1IpLAotICAgICAgICAgICAgICAgIChpbnQpKGdldEdyZWVuKCkqU0NBTEVfRkFDVE9SKSwKLSAgICAgICAgICAgICAgICAoaW50KShnZXRCbHVlKCkqU0NBTEVfRkFDVE9SKSk7CisgICAgICAgIHJldHVybiBuZXcgQ29sb3IoKGludCkoZ2V0UmVkKCkgKiBTQ0FMRV9GQUNUT1IpLCAoaW50KShnZXRHcmVlbigpICogU0NBTEVfRkFDVE9SKSwKKyAgICAgICAgICAgICAgICAoaW50KShnZXRCbHVlKCkgKiBTQ0FMRV9GQUNUT1IpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ0MiwyOCArNTIxLDI4IEBACiAgICAgICAgIGludCBiID0gZ2V0Qmx1ZSgpOwogICAgICAgICBpbnQgZyA9IGdldEdyZWVuKCk7CiAKLSAgICAgICAgaWYociA9PSAwICYmIGIgPT0gMCAmJiBnID09IDApIHsKKyAgICAgICAgaWYgKHIgPT0gMCAmJiBiID09IDAgJiYgZyA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yKE1JTl9TQ0FMQUJMRSwgTUlOX1NDQUxBQkxFLCBNSU5fU0NBTEFCTEUpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYociA8IE1JTl9TQ0FMQUJMRSAmJiByICE9IDApIHsKKyAgICAgICAgaWYgKHIgPCBNSU5fU0NBTEFCTEUgJiYgciAhPSAwKSB7CiAgICAgICAgICAgICByID0gTUlOX1NDQUxBQkxFOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgciA9IChpbnQpIChyL1NDQUxFX0ZBQ1RPUik7CisgICAgICAgICAgICByID0gKGludCkociAvIFNDQUxFX0ZBQ1RPUik7CiAgICAgICAgICAgICByID0gKHIgPiAyNTUpID8gMjU1IDogcjsKICAgICAgICAgfQogCi0gICAgICAgIGlmKGIgPCBNSU5fU0NBTEFCTEUgJiYgYiAhPSAwKSB7CisgICAgICAgIGlmIChiIDwgTUlOX1NDQUxBQkxFICYmIGIgIT0gMCkgewogICAgICAgICAgICAgYiA9IE1JTl9TQ0FMQUJMRTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGIgPSAoaW50KSAoYi9TQ0FMRV9GQUNUT1IpOworICAgICAgICAgICAgYiA9IChpbnQpKGIgLyBTQ0FMRV9GQUNUT1IpOwogICAgICAgICAgICAgYiA9IChiID4gMjU1KSA/IDI1NSA6IGI7CiAgICAgICAgIH0KIAotICAgICAgICBpZihnIDwgTUlOX1NDQUxBQkxFICYmIGcgIT0gMCkgeworICAgICAgICBpZiAoZyA8IE1JTl9TQ0FMQUJMRSAmJiBnICE9IDApIHsKICAgICAgICAgICAgIGcgPSBNSU5fU0NBTEFCTEU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnID0gKGludCkgKGcvU0NBTEVfRkFDVE9SKTsKKyAgICAgICAgICAgIGcgPSAoaW50KShnIC8gU0NBTEVfRkFDVE9SKTsKICAgICAgICAgICAgIGcgPSAoZyA+IDI1NSkgPyAyNTUgOiBnOwogICAgICAgICB9CiAKQEAgLTQ3MSwyNCArNTUwLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGZsb2F0IGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbG9yIGFuZCBhbHBoYSBjb21wb25lbnRzIG9mIAotICAgICAqIHRoZSBDb2xvciBpbiB0aGUgZGVmYXVsdCBzUkdCIGNvbG9yIHNwYWNlLiAKKyAgICAgKiBSZXR1cm5zIGEgZmxvYXQgYXJyYXkgY29udGFpbmluZyB0aGUgY29sb3IgYW5kIGFscGhhIGNvbXBvbmVudHMgb2YgdGhlCisgICAgICogQ29sb3IgaW4gdGhlIGRlZmF1bHQgc1JHQiBjb2xvciBzcGFjZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50cyB0aGUgcmVzdWx0cyBvZiB0aGlzIG1ldGhvZCB3aWxsIGJlIHdyaXR0ZW4gdG8KLSAgICAgKiB0aGlzIGZsb2F0IGFycmF5LiBBIG5ldyBmbG9hdCBhcnJheSB3aWxsIGJlIGNyZWF0ZWQgaWYgdGhpcwotICAgICAqIGFyZ3VtZW50IGlzIG51bGwuCi0gICAgICogCisgICAgICogQHBhcmFtIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzIGZsb2F0CisgICAgICogICAgICAgICAgICBhcnJheS4gQSBuZXcgZmxvYXQgYXJyYXkgd2lsbCBiZSBjcmVhdGVkIGlmIHRoaXMgYXJndW1lbnQgaXMKKyAgICAgKiAgICAgICAgICAgIG51bGwuCiAgICAgICogQHJldHVybiB0aGUgUkdCIGNvbG9yIGFuZCBhbHBoYSBjb21wb25lbnRzIGluIGEgZmxvYXQgYXJyYXkuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0W10gZ2V0UkdCQ29tcG9uZW50cyhmbG9hdFtdIGNvbXBvbmVudHMpIHsKLSAgICAgICAgaWYoY29tcG9uZW50cyA9PSBudWxsKSB7CisgICAgICAgIGlmIChjb21wb25lbnRzID09IG51bGwpIHsKICAgICAgICAgICAgIGNvbXBvbmVudHMgPSBuZXcgZmxvYXRbNF07CiAgICAgICAgIH0KIAotICAgICAgICBpZihmcmdidmFsdWUgIT0gbnVsbCkgeworICAgICAgICBpZiAoZnJnYnZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgIGNvbXBvbmVudHNbM10gPSBmYWxwaGE7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb21wb25lbnRzWzNdID0gZ2V0QWxwaGEoKS8yNTVmOworICAgICAgICAgICAgY29tcG9uZW50c1szXSA9IGdldEFscGhhKCkgLyAyNTVmOwogICAgICAgICB9CiAKICAgICAgICAgZ2V0UkdCQ29sb3JDb21wb25lbnRzKGNvbXBvbmVudHMpOwpAQCAtNDk3LDUyICs1NzYsNTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZmxvYXQgYXJyYXkgY29udGFpbmluZyB0aGUgY29sb3IgY29tcG9uZW50cyBvZiAKLSAgICAgKiB0aGUgQ29sb3IgaW4gdGhlIGRlZmF1bHQgc1JHQiBjb2xvciBzcGFjZS4gCisgICAgICogUmV0dXJucyBhIGZsb2F0IGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbG9yIGNvbXBvbmVudHMgb2YgdGhlIENvbG9yIGluIHRoZQorICAgICAqIGRlZmF1bHQgc1JHQiBjb2xvciBzcGFjZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50cyB0aGUgcmVzdWx0cyBvZiB0aGlzIG1ldGhvZCB3aWxsIGJlIHdyaXR0ZW4gdG8KLSAgICAgKiB0aGlzIGZsb2F0IGFycmF5LiBBIG5ldyBmbG9hdCBhcnJheSB3aWxsIGJlIGNyZWF0ZWQgaWYgdGhpcwotICAgICAqIGFyZ3VtZW50IGlzIG51bGwuCi0gICAgICogCisgICAgICogQHBhcmFtIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzIGZsb2F0CisgICAgICogICAgICAgICAgICBhcnJheS4gQSBuZXcgZmxvYXQgYXJyYXkgd2lsbCBiZSBjcmVhdGVkIGlmIHRoaXMgYXJndW1lbnQgaXMKKyAgICAgKiAgICAgICAgICAgIG51bGwuCiAgICAgICogQHJldHVybiB0aGUgUkdCIGNvbG9yIGNvbXBvbmVudHMgaW4gYSBmbG9hdCBhcnJheS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXRbXSBnZXRSR0JDb2xvckNvbXBvbmVudHMoZmxvYXRbXSBjb21wb25lbnRzKSB7Ci0gICAgICAgIGlmKGNvbXBvbmVudHMgPT0gbnVsbCkgeworICAgICAgICBpZiAoY29tcG9uZW50cyA9PSBudWxsKSB7CiAgICAgICAgICAgICBjb21wb25lbnRzID0gbmV3IGZsb2F0WzNdOwogICAgICAgICB9CiAKLSAgICAgICAgaWYoZnJnYnZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgaWYgKGZyZ2J2YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBjb21wb25lbnRzWzJdID0gZnJnYnZhbHVlWzJdOwogICAgICAgICAgICAgY29tcG9uZW50c1sxXSA9IGZyZ2J2YWx1ZVsxXTsKICAgICAgICAgICAgIGNvbXBvbmVudHNbMF0gPSBmcmdidmFsdWVbMF07CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb21wb25lbnRzWzJdID0gZ2V0Qmx1ZSgpLzI1NWY7Ci0gICAgICAgICAgICBjb21wb25lbnRzWzFdID0gZ2V0R3JlZW4oKS8yNTVmOwotICAgICAgICAgICAgY29tcG9uZW50c1swXSA9IGdldFJlZCgpLzI1NWY7CisgICAgICAgICAgICBjb21wb25lbnRzWzJdID0gZ2V0Qmx1ZSgpIC8gMjU1ZjsKKyAgICAgICAgICAgIGNvbXBvbmVudHNbMV0gPSBnZXRHcmVlbigpIC8gMjU1ZjsKKyAgICAgICAgICAgIGNvbXBvbmVudHNbMF0gPSBnZXRSZWQoKSAvIDI1NWY7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gY29tcG9uZW50czsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZmxvYXQgYXJyYXkgd2hpY2ggY29udGFpbnMgdGhlIGNvbG9yIGFuZCBhbHBoYSBjb21wb25lbnRzIG9mIAorICAgICAqIFJldHVybnMgYSBmbG9hdCBhcnJheSB3aGljaCBjb250YWlucyB0aGUgY29sb3IgYW5kIGFscGhhIGNvbXBvbmVudHMgb2YKICAgICAgKiB0aGUgQ29sb3IgaW4gdGhlIENvbG9yU3BhY2Ugb2YgdGhlIENvbG9yLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgd3JpdHRlbiB0bwotICAgICAqIHRoaXMgZmxvYXQgYXJyYXkuIEEgbmV3IGZsb2F0IGFycmF5IHdpbGwgYmUgY3JlYXRlZCBpZiB0aGlzCi0gICAgICogYXJndW1lbnQgaXMgbnVsbC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgdGhlIHJlc3VsdHMgb2YgdGhpcyBtZXRob2Qgd2lsbCBiZSB3cml0dGVuIHRvIHRoaXMgZmxvYXQKKyAgICAgKiAgICAgICAgICAgIGFycmF5LiBBIG5ldyBmbG9hdCBhcnJheSB3aWxsIGJlIGNyZWF0ZWQgaWYgdGhpcyBhcmd1bWVudCBpcworICAgICAqICAgICAgICAgICAgbnVsbC4KICAgICAgKiBAcmV0dXJuIHRoZSBjb2xvciBhbmQgYWxwaGEgY29tcG9uZW50cyBpbiBhIGZsb2F0IGFycmF5LgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdFtdIGdldENvbXBvbmVudHMoZmxvYXRbXSBjb21wb25lbnRzKSB7Ci0gICAgICAgIGlmKGZ2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChmdmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGdldFJHQkNvbXBvbmVudHMoY29tcG9uZW50cyk7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQgbkNvbG9yQ29tcHMgPSBmdmFsdWUubGVuZ3RoOwogCi0gICAgICAgIGlmKGNvbXBvbmVudHMgPT0gbnVsbCkgewotICAgICAgICAgICAgY29tcG9uZW50cyA9IG5ldyBmbG9hdFtuQ29sb3JDb21wcysxXTsKKyAgICAgICAgaWYgKGNvbXBvbmVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgY29tcG9uZW50cyA9IG5ldyBmbG9hdFtuQ29sb3JDb21wcyArIDFdOwogICAgICAgICB9CiAKICAgICAgICAgZ2V0Q29sb3JDb21wb25lbnRzKGNvbXBvbmVudHMpOwpAQCAtNTUzLDI1ICs2MzIsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZmxvYXQgYXJyYXkgd2hpY2ggY29udGFpbnMgdGhlIGNvbG9yIGNvbXBvbmVudHMgb2YgCi0gICAgICogdGhlIENvbG9yIGluIHRoZSBDb2xvclNwYWNlIG9mIHRoZSBDb2xvci4KKyAgICAgKiBSZXR1cm5zIGEgZmxvYXQgYXJyYXkgd2hpY2ggY29udGFpbnMgdGhlIGNvbG9yIGNvbXBvbmVudHMgb2YgdGhlIENvbG9yIGluCisgICAgICogdGhlIENvbG9yU3BhY2Ugb2YgdGhlIENvbG9yLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgd3JpdHRlbiB0bwotICAgICAqIHRoaXMgZmxvYXQgYXJyYXkuIEEgbmV3IGZsb2F0IGFycmF5IHdpbGwgYmUgY3JlYXRlZCBpZiB0aGlzCi0gICAgICogYXJndW1lbnQgaXMgbnVsbC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgdGhlIHJlc3VsdHMgb2YgdGhpcyBtZXRob2Qgd2lsbCBiZSB3cml0dGVuIHRvIHRoaXMgZmxvYXQKKyAgICAgKiAgICAgICAgICAgIGFycmF5LiBBIG5ldyBmbG9hdCBhcnJheSB3aWxsIGJlIGNyZWF0ZWQgaWYgdGhpcyBhcmd1bWVudCBpcworICAgICAqICAgICAgICAgICAgbnVsbC4KICAgICAgKiBAcmV0dXJuIHRoZSBjb2xvciBjb21wb25lbnRzIGluIGEgZmxvYXQgYXJyYXkuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0W10gZ2V0Q29sb3JDb21wb25lbnRzKGZsb2F0W10gY29tcG9uZW50cykgewotICAgICAgICBpZihmdmFsdWUgPT0gbnVsbCkgeworICAgICAgICBpZiAoZnZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRSR0JDb2xvckNvbXBvbmVudHMoY29tcG9uZW50cyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZihjb21wb25lbnRzID09IG51bGwpIHsKKyAgICAgICAgaWYgKGNvbXBvbmVudHMgPT0gbnVsbCkgewogICAgICAgICAgICAgY29tcG9uZW50cyA9IG5ldyBmbG9hdFtmdmFsdWUubGVuZ3RoXTsKICAgICAgICAgfQogCi0gICAgICAgIGZvcihpbnQgaT0wOyBpPGZ2YWx1ZS5sZW5ndGg7IGkrKykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZ2YWx1ZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgY29tcG9uZW50c1tpXSA9IGZ2YWx1ZVtpXTsKICAgICAgICAgfQogCkBAIC01ODksNyArNjY4LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldFRyYW5zcGFyZW5jeSgpIHsKLSAgICAgICAgc3dpdGNoKGdldEFscGhhKCkpIHsKKyAgICAgICAgc3dpdGNoIChnZXRBbHBoYSgpKSB7CiAgICAgICAgICAgICBjYXNlIDB4ZmY6CiAgICAgICAgICAgICAgICAgcmV0dXJuIFRyYW5zcGFyZW5jeS5PUEFRVUU7CiAgICAgICAgICAgICBjYXNlIDA6CkBAIC02MDksNyArNjg4LDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBSR0IgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBjb2xvciBpbiB0aGUgZGVmYXVsdCBzUkdCIENvbG9yTW9kZWwuCisgICAgICogR2V0cyB0aGUgUkdCIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgY29sb3IgaW4gdGhlIGRlZmF1bHQgc1JHQgorICAgICAqIENvbG9yTW9kZWwuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgUkdCIGNvbG9yIHZhbHVlIGluIHRoZSBkZWZhdWx0IHNSR0IgQ29sb3JNb2RlbC4KICAgICAgKi8KQEAgLTY0NSwxNCArNzI1LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgQ29sb3IgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgb3IgcmV0dXJucyB0aGUgQ29sb3IKLSAgICAgKiBzcGVjaWZpZWQgYnkgdGhlIHNlY29uZCBwYXJhbWV0ZXIuCisgICAgICogR2V0cyB0aGUgQ29sb3IgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgb3IgcmV0dXJucyB0aGUgQ29sb3Igc3BlY2lmaWVkCisgICAgICogYnkgdGhlIHNlY29uZCBwYXJhbWV0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotICAgICAqIEBwYXJhbSBkZWYgdGhlIGRlZmF1bHQgQ29sb3IuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29sb3IgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgb3IgdGhlIENvbG9yCi0gICAgICogc3BlY2lmaWVkIGJ5IHRoZSBzZWNvbmQgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBubQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBzdHJpbmcuCisgICAgICogQHBhcmFtIGRlZgorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgQ29sb3IuCisgICAgICogQHJldHVybiB0aGUgY29sb3IgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgb3IgdGhlIENvbG9yIHNwZWNpZmllZCBieQorICAgICAqICAgICAgICAgdGhlIHNlY29uZCBwYXJhbWV0ZXIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDb2xvciBnZXRDb2xvcihTdHJpbmcgbm0sIENvbG9yIGRlZikgewogICAgICAgICBJbnRlZ2VyIGludGVnZXIgPSBJbnRlZ2VyLmdldEludGVnZXIobm0pOwpAQCAtNjY4LDExICs3NDksMTIgQEAKICAgICAgKiBHZXRzIHRoZSBDb2xvciBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCBvciByZXR1cm5zIHRoZSBDb2xvciBjb252ZXJ0ZWQKICAgICAgKiBmcm9tIHRoZSBzZWNvbmQgcGFyYW1ldGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBubSB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLSAgICAgKiBAcGFyYW0gZGVmIHRoZSBkZWZhdWx0IENvbG9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbG9yIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcsIG9yIHRoZSBDb2xvcgotICAgICAqIGNvbnZlcnRlZCBmcm9tIHRoZSBzZWNvbmQgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBubQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBzdHJpbmcuCisgICAgICogQHBhcmFtIGRlZgorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgQ29sb3IuCisgICAgICogQHJldHVybiB0aGUgY29sb3IgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgb3IgdGhlIENvbG9yIGNvbnZlcnRlZCBmcm9tCisgICAgICogICAgICAgICB0aGUgc2Vjb25kIHBhcmFtZXRlci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENvbG9yIGdldENvbG9yKFN0cmluZyBubSwgaW50IGRlZikgewogICAgICAgICBJbnRlZ2VyIGludGVnZXIgPSBJbnRlZ2VyLmdldEludGVnZXIobm0pOwpAQCAtNjg3LDggKzc2OSw4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgQ29sb3IgZnJvbSB0aGUgc3BlY2lmaWVkIFN0cmluZy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbm0gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0gICAgICogCisgICAgICogQHBhcmFtIG5tCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHN0cmluZy4KICAgICAgKiBAcmV0dXJuIHRoZSBDb2xvciBvYmplY3QsIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDb2xvciBnZXRDb2xvcihTdHJpbmcgbm0pIHsKQEAgLTcwNCwxMCArNzg2LDEyIEBACiAgICAgLyoqCiAgICAgICogRGVjb2RlcyBhIFN0cmluZyB0byBhbiBpbnRlZ2VyIGFuZCByZXR1cm5zIHRoZSBzcGVjaWZpZWQgb3BhcXVlIENvbG9yLgogICAgICAqIAotICAgICAqIEBwYXJhbSBubSBhIFN0cmluZyB3aGljaCByZXByZXNlbnRzIGFuIG9wYXF1ZSBjb2xvciBhcyBhIDI0LWJpdCBpbnRlZ2VyLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNhbiBub3QgYmUKLSAgICAgKiBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlci4KKyAgICAgKiBAcGFyYW0gbm0KKyAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgd2hpY2ggcmVwcmVzZW50cyBhbiBvcGFxdWUgY29sb3IgYXMgYSAyNC1iaXQKKyAgICAgKiAgICAgICAgICAgIGludGVnZXIuCisgICAgICogQHJldHVybiB0aGUgQ29sb3Igb2JqZWN0IGZyb20gdGhlIGdpdmVuIFN0cmluZy4KKyAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNhbiBub3QgYmUgY29udmVydGVkIHRvIGFuIGludGVnZXIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDb2xvciBkZWNvZGUoU3RyaW5nIG5tKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKICAgICAgICAgSW50ZWdlciBpbnRlZ2VyID0gSW50ZWdlci5kZWNvZGUobm0pOwpAQCAtNzE3LDMxICs4MDEsMzYgQEAKICAgICAvKioKICAgICAgKiBHZXRzIGEgQ29sb3Igb2JqZWN0IHVzaW5nIHRoZSBzcGVjaWZpZWQgdmFsdWVzIG9mIHRoZSBIU0IgY29sb3IgbW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGggdGhlIGh1ZSBjb21wb25lbnQgb2YgdGhlIENvbG9yLgotICAgICAqIEBwYXJhbSBzIHRoZSBzYXR1cmF0aW9uIG9mIHRoZSBDb2xvci4KLSAgICAgKiBAcGFyYW0gYiB0aGUgYnJpZ2h0bmVzcyBvZiB0aGUgQ29sb3IuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGNvbG9yIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgaHVlLCBzYXR1cmF0aW9uIGFuZCAKLSAgICAgKiBicmlnaHRuZXNzIHZhbHVlcy4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGh1ZSBjb21wb25lbnQgb2YgdGhlIENvbG9yLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgc2F0dXJhdGlvbiBvZiB0aGUgQ29sb3IuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBicmlnaHRuZXNzIG9mIHRoZSBDb2xvci4KKyAgICAgKiBAcmV0dXJuIGEgY29sb3Igb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBodWUsIHNhdHVyYXRpb24gYW5kIGJyaWdodG5lc3MKKyAgICAgKiAgICAgICAgIHZhbHVlcy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENvbG9yIGdldEhTQkNvbG9yKGZsb2F0IGgsIGZsb2F0IHMsIGZsb2F0IGIpIHsKICAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihIU0J0b1JHQihoLCBzLCBiKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIENvbG9yIHNwZWNpZmllZCBieSB0aGUgUkdCIG1vZGVsIHRvIGFuIGVxdWl2YWxlbnQgCi0gICAgICogY29sb3IgaW4gdGhlIEhTQiBtb2RlbC4KKyAgICAgKiBDb252ZXJ0cyB0aGUgQ29sb3Igc3BlY2lmaWVkIGJ5IHRoZSBSR0IgbW9kZWwgdG8gYW4gZXF1aXZhbGVudCBjb2xvciBpbgorICAgICAqIHRoZSBIU0IgbW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIHJlZCBjb21wb25lbnQuCi0gICAgICogQHBhcmFtIGcgdGhlIGdyZWVuIGNvbXBvbmVudC4KLSAgICAgKiBAcGFyYW0gYiB0aGUgYmx1ZSBjb21wb25lbnQuCi0gICAgICogQHBhcmFtIGhzYnZhbHMgdGhlIGFycmF5IG9mIHJlc3VsdCBodWUsIHNhdHVyYXRpb24sIGJyaWdodG5lc3MKLSAgICAgKiB2YWx1ZXMgb3IgbnVsbC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIHJlZCBjb21wb25lbnQuCisgICAgICogQHBhcmFtIGcKKyAgICAgKiAgICAgICAgICAgIHRoZSBncmVlbiBjb21wb25lbnQuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBibHVlIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gaHNidmFscworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHJlc3VsdCBodWUsIHNhdHVyYXRpb24sIGJyaWdodG5lc3MgdmFsdWVzIG9yCisgICAgICogICAgICAgICAgICBudWxsLgogICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IG9mIGh1ZSwgc2F0dXJhdGlvbiwgYnJpZ2h0bmVzcyB2YWx1ZXMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmbG9hdFtdIFJHQnRvSFNCKGludCByLCBpbnQgZywgaW50IGIsIGZsb2F0W10gaHNidmFscykgewotICAgICAgICBpZihoc2J2YWxzID09IG51bGwpIHsKKyAgICAgICAgaWYgKGhzYnZhbHMgPT0gbnVsbCkgewogICAgICAgICAgICAgaHNidmFscyA9IG5ldyBmbG9hdFszXTsKICAgICAgICAgfQogCkBAIC03NTAsMTIgKzgzOSwxMiBAQAogCiAgICAgICAgIGZsb2F0IEgsIFMsIEI7CiAKLSAgICAgICAgQiA9IFYvMjU1LmY7CisgICAgICAgIEIgPSBWIC8gMjU1LmY7CiAKLSAgICAgICAgaWYoViA9PSB0ZW1wKSB7CisgICAgICAgIGlmIChWID09IHRlbXApIHsKICAgICAgICAgICAgIEggPSBTID0gMDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFMgPSAoViAtIHRlbXApLygoZmxvYXQpVik7CisgICAgICAgICAgICBTID0gKFYgLSB0ZW1wKSAvICgoZmxvYXQpVik7CiAKICAgICAgICAgICAgIGZsb2F0IENyID0gKFYgLSByKSAvIChmbG9hdCkoViAtIHRlbXApOwogICAgICAgICAgICAgZmxvYXQgQ2cgPSAoViAtIGcpIC8gKGZsb2F0KShWIC0gdGVtcCk7CkBAIC03NzAsNyArODU5LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgSCAvPSA2LmY7Ci0gICAgICAgICAgICBpZihIIDwgMCkgeworICAgICAgICAgICAgaWYgKEggPCAwKSB7CiAgICAgICAgICAgICAgICAgSCsrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC03ODMsNTAgKzg3Miw3MCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBDb2xvciBzcGVjaWZpZWQgYnkgdGhlIEhTQiBtb2RlbCB0byBhbiBlcXVpdmFsZW50IAotICAgICAqIGNvbG9yIGluIHRoZSBkZWZhdWx0IFJHQiBtb2RlbC4KKyAgICAgKiBDb252ZXJ0cyB0aGUgQ29sb3Igc3BlY2lmaWVkIGJ5IHRoZSBIU0IgbW9kZWwgdG8gYW4gZXF1aXZhbGVudCBjb2xvciBpbgorICAgICAqIHRoZSBkZWZhdWx0IFJHQiBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaHVlIHRoZSBodWUgY29tcG9uZW50IG9mIHRoZSBDb2xvci4KLSAgICAgKiBAcGFyYW0gc2F0dXJhdGlvbiB0aGUgc2F0dXJhdGlvbiBvZiB0aGUgQ29sb3IuCi0gICAgICogQHBhcmFtIGJyaWdodG5lc3MgdGhlIGJyaWdodG5lc3Mgb2YgdGhlIENvbG9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFJHQiB2YWx1ZSBvZiB0aGUgY29sb3Igd2l0aCB0aGUgc3BlY2lmaWVkIGh1ZSwgCi0gICAgICogc2F0dXJhdGlvbiBhbmQgYnJpZ2h0bmVzcy4KKyAgICAgKiBAcGFyYW0gaHVlCisgICAgICogICAgICAgICAgICB0aGUgaHVlIGNvbXBvbmVudCBvZiB0aGUgQ29sb3IuCisgICAgICogQHBhcmFtIHNhdHVyYXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBzYXR1cmF0aW9uIG9mIHRoZSBDb2xvci4KKyAgICAgKiBAcGFyYW0gYnJpZ2h0bmVzcworICAgICAqICAgICAgICAgICAgdGhlIGJyaWdodG5lc3Mgb2YgdGhlIENvbG9yLgorICAgICAqIEByZXR1cm4gdGhlIFJHQiB2YWx1ZSBvZiB0aGUgY29sb3Igd2l0aCB0aGUgc3BlY2lmaWVkIGh1ZSwgc2F0dXJhdGlvbiBhbmQKKyAgICAgKiAgICAgICAgIGJyaWdodG5lc3MuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgSFNCdG9SR0IoZmxvYXQgaHVlLCBmbG9hdCBzYXR1cmF0aW9uLCBmbG9hdCBicmlnaHRuZXNzKSB7CiAgICAgICAgIGZsb2F0IGZyLCBmZywgZmI7CiAKLSAgICAgICAgaWYoc2F0dXJhdGlvbiA9PSAwKSB7CisgICAgICAgIGlmIChzYXR1cmF0aW9uID09IDApIHsKICAgICAgICAgICAgIGZyID0gZmcgPSBmYiA9IGJyaWdodG5lc3M7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmbG9hdCBIID0gKGh1ZSAtIChmbG9hdClNYXRoLmZsb29yKGh1ZSkpICogNjsKLSAgICAgICAgICAgIGludCBJID0gKGludCkgTWF0aC5mbG9vcihIKTsKKyAgICAgICAgICAgIGludCBJID0gKGludClNYXRoLmZsb29yKEgpOwogICAgICAgICAgICAgZmxvYXQgRiA9IEggLSBJOwogICAgICAgICAgICAgZmxvYXQgTSA9IGJyaWdodG5lc3MgKiAoMSAtIHNhdHVyYXRpb24pOwogICAgICAgICAgICAgZmxvYXQgTiA9IGJyaWdodG5lc3MgKiAoMSAtIHNhdHVyYXRpb24gKiBGKTsKICAgICAgICAgICAgIGZsb2F0IEsgPSBicmlnaHRuZXNzICogKDEgLSBzYXR1cmF0aW9uICogKDEgLSBGKSk7CiAKLSAgICAgICAgICAgIHN3aXRjaChJKSB7CisgICAgICAgICAgICBzd2l0Y2ggKEkpIHsKICAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIGZyID0gYnJpZ2h0bmVzczsgZmcgPSBLOyBmYiA9IE07IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBmciA9IGJyaWdodG5lc3M7CisgICAgICAgICAgICAgICAgICAgIGZnID0gSzsKKyAgICAgICAgICAgICAgICAgICAgZmIgPSBNOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIGZyID0gTjsgZmcgPSBicmlnaHRuZXNzOyBmYiA9IE07IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBmciA9IE47CisgICAgICAgICAgICAgICAgICAgIGZnID0gYnJpZ2h0bmVzczsKKyAgICAgICAgICAgICAgICAgICAgZmIgPSBNOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIGZyID0gTTsgZmcgPSBicmlnaHRuZXNzOyBmYiA9IEs7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBmciA9IE07CisgICAgICAgICAgICAgICAgICAgIGZnID0gYnJpZ2h0bmVzczsKKyAgICAgICAgICAgICAgICAgICAgZmIgPSBLOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgIGZyID0gTTsgZmcgPSBOOyBmYiA9IGJyaWdodG5lc3M7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBmciA9IE07CisgICAgICAgICAgICAgICAgICAgIGZnID0gTjsKKyAgICAgICAgICAgICAgICAgICAgZmIgPSBicmlnaHRuZXNzOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgIGZyID0gSzsgZmcgPSBNOyBmYiA9IGJyaWdodG5lc3M7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBmciA9IEs7CisgICAgICAgICAgICAgICAgICAgIGZnID0gTTsKKyAgICAgICAgICAgICAgICAgICAgZmIgPSBicmlnaHRuZXNzOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgICAgIGZyID0gYnJpZ2h0bmVzczsgZmcgPSBNOyBmYiA9IE47IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBmciA9IGJyaWdodG5lc3M7CisgICAgICAgICAgICAgICAgICAgIGZnID0gTTsKKyAgICAgICAgICAgICAgICAgICAgZmIgPSBOOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICBmciA9IGZiID0gZmcgPSAwOyAvLyBpbXBvc3NpYmxlLCB0byBzdXByZXNzIGNvbXBpbGVyIGVycm9yCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgciA9IChpbnQpIChmciAqIDI1NS4gKyAwLjUpOwotICAgICAgICBpbnQgZyA9IChpbnQpIChmZyAqIDI1NS4gKyAwLjUpOwotICAgICAgICBpbnQgYiA9IChpbnQpIChmYiAqIDI1NS4gKyAwLjUpOworICAgICAgICBpbnQgciA9IChpbnQpKGZyICogMjU1LiArIDAuNSk7CisgICAgICAgIGludCBnID0gKGludCkoZmcgKiAyNTUuICsgMC41KTsKKyAgICAgICAgaW50IGIgPSAoaW50KShmYiAqIDI1NS4gKyAwLjUpOwogCiAgICAgICAgIHJldHVybiAociA8PCAxNikgfCAoZyA8PCA4KSB8IGIgfCAweEZGMDAwMDAwOwogICAgIH0KQEAgLTgzNSwxNyArOTQ0LDIyIEBACiAgICAgICogVGhlIENsYXNzIENvbG9yUGFpbnRDb250ZXh0LgogICAgICAqLwogICAgIGNsYXNzIENvbG9yUGFpbnRDb250ZXh0IGltcGxlbWVudHMgUGFpbnRDb250ZXh0IHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgcmdiIHZhbHVlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgUkdCIHZhbHVlLgorICAgICAgICAgKi8KICAgICAgICAgaW50IHJnYlZhbHVlOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBzYXZlZCByYXN0ZXIuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzYXZlZCByYXN0ZXIuCisgICAgICAgICAqLwogICAgICAgICBXcml0YWJsZVJhc3RlciBzYXZlZFJhc3RlciA9IG51bGw7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBjb2xvciBwYWludCBjb250ZXh0LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHJnYiB0aGUgcmdiCisgICAgICAgICAqIEBwYXJhbSByZ2IKKyAgICAgICAgICogICAgICAgICAgICB0aGUgUkdCIHZhbHVlLgogICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIENvbG9yUGFpbnRDb250ZXh0KGludCByZ2IpIHsKICAgICAgICAgICAgIHJnYlZhbHVlID0gcmdiOwpAQCAtODYwLDE1ICs5NzQsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBSYXN0ZXIgZ2V0UmFzdGVyKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSB7Ci0gICAgICAgICAgICBpZiAoc2F2ZWRSYXN0ZXIgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICB3ICE9IHNhdmVkUmFzdGVyLmdldFdpZHRoKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgaCAhPSBzYXZlZFJhc3Rlci5nZXRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIHNhdmVkUmFzdGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbG9yTW9kZWwoKS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIodywgaCk7CisgICAgICAgICAgICBpZiAoc2F2ZWRSYXN0ZXIgPT0gbnVsbCB8fCB3ICE9IHNhdmVkUmFzdGVyLmdldFdpZHRoKCkgfHwgaCAhPSBzYXZlZFJhc3Rlci5nZXRIZWlnaHQoKSkgeworICAgICAgICAgICAgICAgIHNhdmVkUmFzdGVyID0gZ2V0Q29sb3JNb2RlbCgpLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3Rlcih3LCBoKTsKIAogICAgICAgICAgICAgICAgIC8vIFN1cHBvc2Ugd2UgaGF2ZSBoZXJlIHNpbXBsZSBJTlQvUkdCIGNvbG9yL3NhbXBsZSBtb2RlbAotICAgICAgICAgICAgICAgIERhdGFCdWZmZXJJbnQgaW50QnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChEYXRhQnVmZmVySW50KSBzYXZlZFJhc3Rlci5nZXREYXRhQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgRGF0YUJ1ZmZlckludCBpbnRCdWZmZXIgPSAoRGF0YUJ1ZmZlckludClzYXZlZFJhc3Rlci5nZXREYXRhQnVmZmVyKCk7CiAgICAgICAgICAgICAgICAgaW50IHJnYlZhbHVlc1tdID0gaW50QnVmZmVyLmdldERhdGEoKTsKICAgICAgICAgICAgICAgICBpbnQgcmdiRmlsbFZhbHVlID0gcmdiVmFsdWU7CiAgICAgICAgICAgICAgICAgQXJyYXlzLmZpbGwocmdiVmFsdWVzLCByZ2JGaWxsVmFsdWUpOwpAQCAtODc4LDQgKzk4OCwzIEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9Db21wb25lbnQuamF2YSBiL2F3dC9qYXZhL2F3dC9Db21wb25lbnQuamF2YQppbmRleCBmMTlkMjg1Li5jNTJhOWY0IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvQ29tcG9uZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0NvbXBvbmVudC5qYXZhCkBAIC03OCw1NDcgKzc4LDI3MyBAQAogLy9pbXBvcnQgamF2YXguYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlU3RhdGU7CiAvL2ltcG9ydCBqYXZheC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVTdGF0ZVNldDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuQ2xpcFJlZ2lvbjsKLS8vaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuRmllbGRzQWNjZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5DbGlwUmVnaW9uOyAvL2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LkZpZWxkc0FjY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuZ2wuTXVsdGlSZWN0QXJlYTsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LnN0YXRlLlN0YXRlOwotLy9pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC50ZXh0LlRleHRGaWVsZEtpdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LnN0YXRlLlN0YXRlOyAvL2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LnRleHQuVGV4dEZpZWxkS2l0OwogLy9pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC50ZXh0LlRleHRLaXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC53dGsuTmF0aXZlV2luZG93OworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247CiAKIC8qKgotICogVGhlIGFic3RyYWN0IENvbXBvbmVudCBjbGFzcyBzcGVjaWZpZXMgYW4gb2JqZWN0IHdpdGggYSBncmFwaGljYWwgCi0gKiByZXByZXNlbnRhdGlvbiB0aGF0IGNhbiBiZSBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbiBhbmQgdGhhdCBjYW4gCi0gKiBpbnRlcmFjdCB3aXRoIHRoZSB1c2VyIChmb3IgZXhhbXBsZTogc2Nyb2xsYmFycywgYnV0dG9ucywgY2hlY2tib3hlcykuCisgKiBUaGUgYWJzdHJhY3QgQ29tcG9uZW50IGNsYXNzIHNwZWNpZmllcyBhbiBvYmplY3Qgd2l0aCBhIGdyYXBoaWNhbAorICogcmVwcmVzZW50YXRpb24gdGhhdCBjYW4gYmUgZGlzcGxheWVkIG9uIHRoZSBzY3JlZW4gYW5kIHRoYXQgY2FuIGludGVyYWN0IHdpdGgKKyAqIHRoZSB1c2VyIChmb3IgZXhhbXBsZTogc2Nyb2xsYmFycywgYnV0dG9ucywgY2hlY2tib3hlcykuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50IGltcGxlbWVudHMgSW1hZ2VPYnNlcnZlciwgTWVudUNvbnRhaW5lciwgU2VyaWFsaXphYmxlIHsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzY0NDExNDUxMjcxNDYxOTc1MEw7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRPUF9BTElHTk1FTlQgaW5kaWNhdGVzIHRoZSB0b3AgYWxpZ25tZW50IG9mIHRoZSBjb21wb25lbnQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRPUF9BTElHTk1FTlQgaW5kaWNhdGVzIHRoZSB0b3AgYWxpZ25tZW50IG9mIHRoZSBjb21wb25lbnQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBUT1BfQUxJR05NRU5UID0gMC4wZjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQ0VOVEVSX0FMSUdOTUVOVCBpbmRpY2F0ZXMgdGhlIGNlbnRlciBhbGlnbm1lbnQgb2YgdGhlIGNvbXBvbmVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ0VOVEVSX0FMSUdOTUVOVCBpbmRpY2F0ZXMgdGhlIGNlbnRlciBhbGlnbm1lbnQgb2YgdGhlCisgICAgICogY29tcG9uZW50LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgQ0VOVEVSX0FMSUdOTUVOVCA9IDAuNWY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEJPVFRPTV9BTElHTk1FTlQgaW5kaWNhdGVzIHRoZSBib3R0b20gYWxpZ25tZW50IG9mIHRoZSBjb21wb25lbnQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEJPVFRPTV9BTElHTk1FTlQgaW5kaWNhdGVzIHRoZSBib3R0b20gYWxpZ25tZW50IG9mIHRoZQorICAgICAqIGNvbXBvbmVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IEJPVFRPTV9BTElHTk1FTlQgPSAxLjBmOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBMRUZUX0FMSUdOTUVOVCBpbmRpY2F0ZXMgdGhlIGxlZnQgYWxpZ25tZW50IG9mIHRoZSBjb21wb25lbnQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IExFRlRfQUxJR05NRU5UIGluZGljYXRlcyB0aGUgbGVmdCBhbGlnbm1lbnQgb2YgdGhlCisgICAgICogY29tcG9uZW50LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgTEVGVF9BTElHTk1FTlQgPSAwLjBmOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBSSUdIVF9BTElHTk1FTlQgaW5kaWNhdGVzIHRoZSByaWdodCBhbGlnbm1lbnQgb2YgdGhlIGNvbXBvbmVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUklHSFRfQUxJR05NRU5UIGluZGljYXRlcyB0aGUgcmlnaHQgYWxpZ25tZW50IG9mIHRoZQorICAgICAqIGNvbXBvbmVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IFJJR0hUX0FMSUdOTUVOVCA9IDEuMGY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGNoaWxkQ2xhc3Nlc0ZsYWdzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBjaGlsZENsYXNzZXNGbGFncy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNodGFibGU8Q2xhc3M8Pz4sIEJvb2xlYW4+IGNoaWxkQ2xhc3Nlc0ZsYWdzID0gbmV3IEhhc2h0YWJsZTxDbGFzczw/PiwgQm9vbGVhbj4oKTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgcGVlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgcGVlci4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb25lbnRQZWVyIHBlZXIgPSBuZXcgQ29tcG9uZW50UGVlcigpIHsKICAgICB9OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpbmNyZW1lbnRhbEltYWdlVXBkYXRlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpbmNyZW1lbnRhbEltYWdlVXBkYXRlLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaW5jcmVtZW50YWxJbWFnZVVwZGF0ZTsKIAotICAgIC8qKiBUaGUgdG9vbGtpdC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgdG9vbGtpdC4KKyAgICAgKi8KICAgICBmaW5hbCB0cmFuc2llbnQgVG9vbGtpdCB0b29sa2l0ID0gVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpOwogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBBY2Nlc3NpYmxlQVdUQ29tcG9uZW50IGV4dGVuZHMgQWNjZXNzaWJsZUNvbnRleHQgaW1wbGVtZW50cwotICAgICAgICAgICAgU2VyaWFsaXphYmxlLCBBY2Nlc3NpYmxlQ29tcG9uZW50IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjQyMzIxNjU1NzU3ODAwMTkxTDsKLQotICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgQWNjZXNzaWJsZUFXVENvbXBvbmVudEhhbmRsZXIgaW1wbGVtZW50cyBDb21wb25lbnRMaXN0ZW5lciB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgQWNjZXNzaWJsZUFXVENvbXBvbmVudEhhbmRsZXIoKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBvbmVudEhpZGRlbihDb21wb25lbnRFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJlaGF2aW91ci5pc0xpZ2h0d2VpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoQWNjZXNzaWJsZUNvbnRleHQuQUNDRVNTSUJMRV9TVEFURV9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2libGVTdGF0ZS5WSVNJQkxFLCBudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcG9uZW50TW92ZWQoQ29tcG9uZW50RXZlbnQgZSkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wb25lbnRSZXNpemVkKENvbXBvbmVudEV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcG9uZW50U2hvd24oQ29tcG9uZW50RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChiZWhhdmlvdXIuaXNMaWdodHdlaWdodCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKEFjY2Vzc2libGVDb250ZXh0LkFDQ0VTU0lCTEVfU1RBVEVfUFJPUEVSVFksIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmxlU3RhdGUuVklTSUJMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgQWNjZXNzaWJsZUFXVEZvY3VzSGFuZGxlciBpbXBsZW1lbnRzIEZvY3VzTGlzdGVuZXIgewotICAgICAgICAgICAgcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJlaGF2aW91ci5pc0xpZ2h0d2VpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoQWNjZXNzaWJsZUNvbnRleHQuQUNDRVNTSUJMRV9TVEFURV9QUk9QRVJUWSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2libGVTdGF0ZS5GT0NVU0VEKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChiZWhhdmlvdXIuaXNMaWdodHdlaWdodCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKEFjY2Vzc2libGVDb250ZXh0LkFDQ0VTU0lCTEVfU1RBVEVfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmxlU3RhdGUuRk9DVVNFRCwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgcHJvdGVjdGVkIENvbXBvbmVudExpc3RlbmVyIGFjY2Vzc2libGVBV1RDb21wb25lbnRIYW5kbGVyOwotICAgIAotICAgICAgICBwcm90ZWN0ZWQgRm9jdXNMaXN0ZW5lciBhY2Nlc3NpYmxlQVdURm9jdXNIYW5kbGVyOwotICAgICAgICAqLwotICAgICAgICAvKgotICAgICAgICAgKiBOdW1iZXIgb2YgcmVnaXN0ZXJlZCBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzLgotICAgICAgICAgKi8KLSAgICAgICAgLyoKLSAgICAgICAgaW50IGxpc3RlbmVyc0NvdW50OwotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEZvY3VzTGlzdGVuZXIoRm9jdXNMaXN0ZW5lciBsKSB7Ci0gICAgICAgICAgICBDb21wb25lbnQudGhpcy5hZGRGb2N1c0xpc3RlbmVyKGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHN1cGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIGxpc3RlbmVyc0NvdW50Kys7Ci0gICAgICAgICAgICAgICAgaWYgKGFjY2Vzc2libGVBV1RDb21wb25lbnRIYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWNjZXNzaWJsZUFXVENvbXBvbmVudEhhbmRsZXIgPSBuZXcgQWNjZXNzaWJsZUFXVENvbXBvbmVudEhhbmRsZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50LnRoaXMuYWRkQ29tcG9uZW50TGlzdGVuZXIoYWNjZXNzaWJsZUFXVENvbXBvbmVudEhhbmRsZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWNjZXNzaWJsZUFXVEZvY3VzSGFuZGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjY2Vzc2libGVBV1RGb2N1c0hhbmRsZXIgPSBuZXcgQWNjZXNzaWJsZUFXVEZvY3VzSGFuZGxlcigpOwotICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQudGhpcy5hZGRGb2N1c0xpc3RlbmVyKGFjY2Vzc2libGVBV1RGb2N1c0hhbmRsZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoUG9pbnQgcCkgewotICAgICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBDb21wb25lbnQudGhpcy5jb250YWlucyhwKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBBY2Nlc3NpYmxlIGdldEFjY2Vzc2libGVBdChQb2ludCBhcmcwKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29sb3IgZ2V0QmFja2dyb3VuZCgpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50LnRoaXMuZ2V0QmFja2dyb3VuZCgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJlY3RhbmdsZSBnZXRCb3VuZHMoKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudC50aGlzLmdldEJvdW5kcygpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEN1cnNvciBnZXRDdXJzb3IoKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudC50aGlzLmdldEN1cnNvcigpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZvbnQgZ2V0Rm9udCgpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50LnRoaXMuZ2V0Rm9udCgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZvbnRNZXRyaWNzIGdldEZvbnRNZXRyaWNzKEZvbnQgZikgewotICAgICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBDb21wb25lbnQudGhpcy5nZXRGb250TWV0cmljcyhmKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kKCkgewotICAgICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBDb21wb25lbnQudGhpcy5nZXRGb3JlZ3JvdW5kKCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudC50aGlzLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb25PblNjcmVlbigpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50LnRoaXMuZ2V0TG9jYXRpb25PblNjcmVlbigpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERpbWVuc2lvbiBnZXRTaXplKCkgewotICAgICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBDb21wb25lbnQudGhpcy5nZXRTaXplKCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudC50aGlzLmlzRW5hYmxlZCgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGb2N1c1RyYXZlcnNhYmxlKCkgewotICAgICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBDb21wb25lbnQudGhpcy5pc0ZvY3VzVHJhdmVyc2FibGUoKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2hvd2luZygpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50LnRoaXMuaXNTaG93aW5nKCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudC50aGlzLmlzVmlzaWJsZSgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlRm9jdXNMaXN0ZW5lcihGb2N1c0xpc3RlbmVyIGwpIHsKLSAgICAgICAgICAgIENvbXBvbmVudC50aGlzLnJlbW92ZUZvY3VzTGlzdGVuZXIobCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXJzQ291bnQtLTsKLSAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbGlzdGVuZXJzLCByZW1vdmUgaGFuZGxlcnM6Ci0gICAgICAgICAgICAgICAgQ29tcG9uZW50LnRoaXMucmVtb3ZlRm9jdXNMaXN0ZW5lcihhY2Nlc3NpYmxlQVdURm9jdXNIYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBDb21wb25lbnQudGhpcy5yZW1vdmVDb21wb25lbnRMaXN0ZW5lcihhY2Nlc3NpYmxlQVdUQ29tcG9uZW50SGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgYWNjZXNzaWJsZUFXVENvbXBvbmVudEhhbmRsZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIGFjY2Vzc2libGVBV1RGb2N1c0hhbmRsZXIgPSBudWxsOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdEZvY3VzKCkgewotICAgICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENvbXBvbmVudC50aGlzLnJlcXVlc3RGb2N1cygpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChDb2xvciBjb2xvcikgewotICAgICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENvbXBvbmVudC50aGlzLnNldEJhY2tncm91bmQoY29sb3IpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Qm91bmRzKFJlY3RhbmdsZSByKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ29tcG9uZW50LnRoaXMuc2V0Qm91bmRzKHIpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q3Vyc29yKEN1cnNvciBjdXJzb3IpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDb21wb25lbnQudGhpcy5zZXRDdXJzb3IoY3Vyc29yKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ29tcG9uZW50LnRoaXMuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEZvbnQoRm9udCBmKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ29tcG9uZW50LnRoaXMuc2V0Rm9udChmKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEZvcmVncm91bmQoQ29sb3IgY29sb3IpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDb21wb25lbnQudGhpcy5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFBvaW50IHApIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDb21wb25lbnQudGhpcy5zZXRMb2NhdGlvbihwKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNpemUoRGltZW5zaW9uIHNpemUpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDb21wb25lbnQudGhpcy5zZXRTaXplKHNpemUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDb21wb25lbnQudGhpcy5zZXRWaXNpYmxlKHZpc2libGUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFjY2Vzc2libGUgZ2V0QWNjZXNzaWJsZVBhcmVudCgpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBBY2Nlc3NpYmxlIGFQYXJlbnQgPSBzdXBlci5nZXRBY2Nlc3NpYmxlUGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYVBhcmVudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29udGFpbmVyIHBhcmVudCA9IGdldFBhcmVudCgpOwotICAgICAgICAgICAgICAgIHJldHVybiAocGFyZW50IGluc3RhbmNlb2YgQWNjZXNzaWJsZSA/IChBY2Nlc3NpYmxlKSBwYXJlbnQgOiBudWxsKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQWNjZXNzaWJsZSBnZXRBY2Nlc3NpYmxlQ2hpbGQoaW50IGkpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldEFjY2Vzc2libGVDaGlsZHJlbkNvdW50KCkgewotICAgICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBY2Nlc3NpYmxlQ29tcG9uZW50IGdldEFjY2Vzc2libGVDb21wb25lbnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc2libGVEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRBY2Nlc3NpYmxlRGVzY3JpcHRpb24oKTsgLy8gd2h5IG92ZXJyaWRlPwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QWNjZXNzaWJsZUluZGV4SW5QYXJlbnQoKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldEFjY2Vzc2libGVQYXJlbnQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBDb250YWluZXIgcGFyZW50ID0gZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJlbnQuZ2V0Q29tcG9uZW50Q291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbXBvbmVudCBhQ29tcCA9IHBhcmVudC5nZXRDb21wb25lbnQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhQ29tcCBpbnN0YW5jZW9mIEFjY2Vzc2libGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhQ29tcCA9PSBDb21wb25lbnQudGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICsrY291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBY2Nlc3NpYmxlUm9sZSBnZXRBY2Nlc3NpYmxlUm9sZSgpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQWNjZXNzaWJsZVJvbGUuQVdUX0NPTVBPTkVOVDsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQWNjZXNzaWJsZVN0YXRlU2V0IGdldEFjY2Vzc2libGVTdGF0ZVNldCgpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBBY2Nlc3NpYmxlU3RhdGVTZXQgc2V0ID0gbmV3IEFjY2Vzc2libGVTdGF0ZVNldCgpOwotICAgICAgICAgICAgICAgIGlmIChpc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKEFjY2Vzc2libGVTdGF0ZS5FTkFCTEVEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGlzRm9jdXNhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChBY2Nlc3NpYmxlU3RhdGUuRk9DVVNBQkxFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGhhc0ZvY3VzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChBY2Nlc3NpYmxlU3RhdGUuRk9DVVNFRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpc09wYXF1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoQWNjZXNzaWJsZVN0YXRlLk9QQVFVRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKEFjY2Vzc2libGVTdGF0ZS5TSE9XSU5HKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGlzVmlzaWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoQWNjZXNzaWJsZVN0YXRlLlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gc2V0OwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkgdGhyb3dzIElsbGVnYWxDb21wb25lbnRTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudC50aGlzLmdldExvY2FsZSgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgICovCisgICAgICogcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIEFjY2Vzc2libGVBV1RDb21wb25lbnQgZXh0ZW5kcyBBY2Nlc3NpYmxlQ29udGV4dAorICAgICAqIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBBY2Nlc3NpYmxlQ29tcG9uZW50IHsgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZworICAgICAqIHNlcmlhbFZlcnNpb25VSUQgPSA2NDIzMjE2NTU3NTc4MDAxOTFMOyBwcm90ZWN0ZWQgY2xhc3MKKyAgICAgKiBBY2Nlc3NpYmxlQVdUQ29tcG9uZW50SGFuZGxlciBpbXBsZW1lbnRzIENvbXBvbmVudExpc3RlbmVyIHsgcHJvdGVjdGVkCisgICAgICogQWNjZXNzaWJsZUFXVENvbXBvbmVudEhhbmRsZXIoKSB7IH0gcHVibGljIHZvaWQKKyAgICAgKiBjb21wb25lbnRIaWRkZW4oQ29tcG9uZW50RXZlbnQgZSkgeyBpZiAoYmVoYXZpb3VyLmlzTGlnaHR3ZWlnaHQoKSkgeworICAgICAqIHJldHVybjsgfSBmaXJlUHJvcGVydHlDaGFuZ2UoQWNjZXNzaWJsZUNvbnRleHQuQUNDRVNTSUJMRV9TVEFURV9QUk9QRVJUWSwKKyAgICAgKiBBY2Nlc3NpYmxlU3RhdGUuVklTSUJMRSwgbnVsbCk7IH0gcHVibGljIHZvaWQKKyAgICAgKiBjb21wb25lbnRNb3ZlZChDb21wb25lbnRFdmVudCBlKSB7IH0gcHVibGljIHZvaWQKKyAgICAgKiBjb21wb25lbnRSZXNpemVkKENvbXBvbmVudEV2ZW50IGUpIHsgfSBwdWJsaWMgdm9pZAorICAgICAqIGNvbXBvbmVudFNob3duKENvbXBvbmVudEV2ZW50IGUpIHsgaWYgKGJlaGF2aW91ci5pc0xpZ2h0d2VpZ2h0KCkpIHsKKyAgICAgKiByZXR1cm47IH0gZmlyZVByb3BlcnR5Q2hhbmdlKEFjY2Vzc2libGVDb250ZXh0LkFDQ0VTU0lCTEVfU1RBVEVfUFJPUEVSVFksCisgICAgICogbnVsbCwgQWNjZXNzaWJsZVN0YXRlLlZJU0lCTEUpOyB9IH0gcHJvdGVjdGVkIGNsYXNzCisgICAgICogQWNjZXNzaWJsZUFXVEZvY3VzSGFuZGxlciBpbXBsZW1lbnRzIEZvY3VzTGlzdGVuZXIgeyBwdWJsaWMgdm9pZAorICAgICAqIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgeyBpZiAoYmVoYXZpb3VyLmlzTGlnaHR3ZWlnaHQoKSkgeyByZXR1cm47IH0KKyAgICAgKiBmaXJlUHJvcGVydHlDaGFuZ2UoQWNjZXNzaWJsZUNvbnRleHQuQUNDRVNTSUJMRV9TVEFURV9QUk9QRVJUWSwgbnVsbCwKKyAgICAgKiBBY2Nlc3NpYmxlU3RhdGUuRk9DVVNFRCk7IH0gcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgeyBpZgorICAgICAqIChiZWhhdmlvdXIuaXNMaWdodHdlaWdodCgpKSB7IHJldHVybjsgfQorICAgICAqIGZpcmVQcm9wZXJ0eUNoYW5nZShBY2Nlc3NpYmxlQ29udGV4dC5BQ0NFU1NJQkxFX1NUQVRFX1BST1BFUlRZLAorICAgICAqIEFjY2Vzc2libGVTdGF0ZS5GT0NVU0VELCBudWxsKTsgfSB9IHByb3RlY3RlZCBDb21wb25lbnRMaXN0ZW5lcgorICAgICAqIGFjY2Vzc2libGVBV1RDb21wb25lbnRIYW5kbGVyOyBwcm90ZWN0ZWQgRm9jdXNMaXN0ZW5lcgorICAgICAqIGFjY2Vzc2libGVBV1RGb2N1c0hhbmRsZXI7CisgICAgICovCisgICAgLyoKKyAgICAgKiBOdW1iZXIgb2YgcmVnaXN0ZXJlZCBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzLgorICAgICAqLworICAgIC8qCisgICAgICogaW50IGxpc3RlbmVyc0NvdW50OyBwdWJsaWMgdm9pZCBhZGRGb2N1c0xpc3RlbmVyKEZvY3VzTGlzdGVuZXIgbCkgeworICAgICAqIENvbXBvbmVudC50aGlzLmFkZEZvY3VzTGlzdGVuZXIobCk7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCisgICAgICogbGlzdGVuZXIpIHsgdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7CisgICAgICogc3VwZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7IGxpc3RlbmVyc0NvdW50Kys7IGlmCisgICAgICogKGFjY2Vzc2libGVBV1RDb21wb25lbnRIYW5kbGVyID09IG51bGwpIHsgYWNjZXNzaWJsZUFXVENvbXBvbmVudEhhbmRsZXIgPQorICAgICAqIG5ldyBBY2Nlc3NpYmxlQVdUQ29tcG9uZW50SGFuZGxlcigpOworICAgICAqIENvbXBvbmVudC50aGlzLmFkZENvbXBvbmVudExpc3RlbmVyKGFjY2Vzc2libGVBV1RDb21wb25lbnRIYW5kbGVyKTsgfSBpZgorICAgICAqIChhY2Nlc3NpYmxlQVdURm9jdXNIYW5kbGVyID09IG51bGwpIHsgYWNjZXNzaWJsZUFXVEZvY3VzSGFuZGxlciA9IG5ldworICAgICAqIEFjY2Vzc2libGVBV1RGb2N1c0hhbmRsZXIoKTsKKyAgICAgKiBDb21wb25lbnQudGhpcy5hZGRGb2N1c0xpc3RlbmVyKGFjY2Vzc2libGVBV1RGb2N1c0hhbmRsZXIpOyB9IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFBvaW50IHApIHsKKyAgICAgKiB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgcmV0dXJuIENvbXBvbmVudC50aGlzLmNvbnRhaW5zKHApOyB9IGZpbmFsbHkgeworICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfSBwdWJsaWMgQWNjZXNzaWJsZSBnZXRBY2Nlc3NpYmxlQXQoUG9pbnQgYXJnMCkgeworICAgICAqIHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4gbnVsbDsgfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfQorICAgICAqIH0gcHVibGljIENvbG9yIGdldEJhY2tncm91bmQoKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4KKyAgICAgKiBDb21wb25lbnQudGhpcy5nZXRCYWNrZ3JvdW5kKCk7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqIHB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKCkgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgcmV0dXJuCisgICAgICogQ29tcG9uZW50LnRoaXMuZ2V0Qm91bmRzKCk7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfSBwdWJsaWMKKyAgICAgKiBDdXJzb3IgZ2V0Q3Vyc29yKCkgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgcmV0dXJuCisgICAgICogQ29tcG9uZW50LnRoaXMuZ2V0Q3Vyc29yKCk7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfSBwdWJsaWMKKyAgICAgKiBGb250IGdldEZvbnQoKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4KKyAgICAgKiBDb21wb25lbnQudGhpcy5nZXRGb250KCk7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfSBwdWJsaWMKKyAgICAgKiBGb250TWV0cmljcyBnZXRGb250TWV0cmljcyhGb250IGYpIHsgdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7IHJldHVybgorICAgICAqIENvbXBvbmVudC50aGlzLmdldEZvbnRNZXRyaWNzKGYpOyB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKiBwdWJsaWMgQ29sb3IgZ2V0Rm9yZWdyb3VuZCgpIHsgdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7IHJldHVybgorICAgICAqIENvbXBvbmVudC50aGlzLmdldEZvcmVncm91bmQoKTsgfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9CisgICAgICogcHVibGljIFBvaW50IGdldExvY2F0aW9uKCkgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgcmV0dXJuCisgICAgICogQ29tcG9uZW50LnRoaXMuZ2V0TG9jYXRpb24oKTsgfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IHB1YmxpYworICAgICAqIFBvaW50IGdldExvY2F0aW9uT25TY3JlZW4oKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4KKyAgICAgKiBDb21wb25lbnQudGhpcy5nZXRMb2NhdGlvbk9uU2NyZWVuKCk7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0KKyAgICAgKiB9IHB1YmxpYyBEaW1lbnNpb24gZ2V0U2l6ZSgpIHsgdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7IHJldHVybgorICAgICAqIENvbXBvbmVudC50aGlzLmdldFNpemUoKTsgfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IHB1YmxpYworICAgICAqIGJvb2xlYW4gaXNFbmFibGVkKCkgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgcmV0dXJuCisgICAgICogQ29tcG9uZW50LnRoaXMuaXNFbmFibGVkKCk7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfSBwdWJsaWMKKyAgICAgKiBib29sZWFuIGlzRm9jdXNUcmF2ZXJzYWJsZSgpIHsgdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7IHJldHVybgorICAgICAqIENvbXBvbmVudC50aGlzLmlzRm9jdXNUcmF2ZXJzYWJsZSgpOyB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKiBwdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmcoKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4KKyAgICAgKiBDb21wb25lbnQudGhpcy5pc1Nob3dpbmcoKTsgfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IHB1YmxpYworICAgICAqIGJvb2xlYW4gaXNWaXNpYmxlKCkgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgcmV0dXJuCisgICAgICogQ29tcG9uZW50LnRoaXMuaXNWaXNpYmxlKCk7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfSBwdWJsaWMKKyAgICAgKiB2b2lkIHJlbW92ZUZvY3VzTGlzdGVuZXIoRm9jdXNMaXN0ZW5lciBsKSB7CisgICAgICogQ29tcG9uZW50LnRoaXMucmVtb3ZlRm9jdXNMaXN0ZW5lcihsKTsgfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKKyAgICAgKiBsaXN0ZW5lcikgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsKKyAgICAgKiBzdXBlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsgbGlzdGVuZXJzQ291bnQtLTsgaWYKKyAgICAgKiAobGlzdGVuZXJzQ291bnQgPiAwKSB7IHJldHVybjsgfSAvLyBpZiB0aGVyZSBhcmUgbm8gbW9yZSBsaXN0ZW5lcnMsCisgICAgICogcmVtb3ZlIGhhbmRsZXJzOgorICAgICAqIENvbXBvbmVudC50aGlzLnJlbW92ZUZvY3VzTGlzdGVuZXIoYWNjZXNzaWJsZUFXVEZvY3VzSGFuZGxlcik7CisgICAgICogQ29tcG9uZW50LnRoaXMucmVtb3ZlQ29tcG9uZW50TGlzdGVuZXIoYWNjZXNzaWJsZUFXVENvbXBvbmVudEhhbmRsZXIpOworICAgICAqIGFjY2Vzc2libGVBV1RDb21wb25lbnRIYW5kbGVyID0gbnVsbDsgYWNjZXNzaWJsZUFXVEZvY3VzSGFuZGxlciA9IG51bGw7IH0KKyAgICAgKiBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IHB1YmxpYyB2b2lkIHJlcXVlc3RGb2N1cygpIHsKKyAgICAgKiB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgQ29tcG9uZW50LnRoaXMucmVxdWVzdEZvY3VzKCk7IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQoQ29sb3IgY29sb3IpIHsKKyAgICAgKiB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgQ29tcG9uZW50LnRoaXMuc2V0QmFja2dyb3VuZChjb2xvcik7IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IHB1YmxpYyB2b2lkIHNldEJvdW5kcyhSZWN0YW5nbGUgcikgeworICAgICAqIHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyBDb21wb25lbnQudGhpcy5zZXRCb3VuZHMocik7IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IHB1YmxpYyB2b2lkIHNldEN1cnNvcihDdXJzb3IgY3Vyc29yKSB7CisgICAgICogdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7IENvbXBvbmVudC50aGlzLnNldEN1cnNvcihjdXJzb3IpOyB9IGZpbmFsbHkgeworICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfSBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAqIHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyBDb21wb25lbnQudGhpcy5zZXRFbmFibGVkKGVuYWJsZWQpOyB9IGZpbmFsbHkgeworICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfSBwdWJsaWMgdm9pZCBzZXRGb250KEZvbnQgZikgeyB0b29sa2l0LmxvY2tBV1QoKTsKKyAgICAgKiB0cnkgeyBDb21wb25lbnQudGhpcy5zZXRGb250KGYpOyB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKiBwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kKENvbG9yIGNvbG9yKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeworICAgICAqIENvbXBvbmVudC50aGlzLnNldEZvcmVncm91bmQoY29sb3IpOyB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKiBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihQb2ludCBwKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeworICAgICAqIENvbXBvbmVudC50aGlzLnNldExvY2F0aW9uKHApOyB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKiBwdWJsaWMgdm9pZCBzZXRTaXplKERpbWVuc2lvbiBzaXplKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeworICAgICAqIENvbXBvbmVudC50aGlzLnNldFNpemUoc2l6ZSk7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfSBwdWJsaWMKKyAgICAgKiB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeworICAgICAqIENvbXBvbmVudC50aGlzLnNldFZpc2libGUodmlzaWJsZSk7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgQWNjZXNzaWJsZSBnZXRBY2Nlc3NpYmxlUGFyZW50KCkgeyB0b29sa2l0LmxvY2tBV1QoKTsKKyAgICAgKiB0cnkgeyBBY2Nlc3NpYmxlIGFQYXJlbnQgPSBzdXBlci5nZXRBY2Nlc3NpYmxlUGFyZW50KCk7IGlmIChhUGFyZW50ICE9CisgICAgICogbnVsbCkgeyByZXR1cm4gYVBhcmVudDsgfSBDb250YWluZXIgcGFyZW50ID0gZ2V0UGFyZW50KCk7IHJldHVybiAocGFyZW50CisgICAgICogaW5zdGFuY2VvZiBBY2Nlc3NpYmxlID8gKEFjY2Vzc2libGUpIHBhcmVudCA6IG51bGwpOyB9IGZpbmFsbHkgeworICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgQWNjZXNzaWJsZSBnZXRBY2Nlc3NpYmxlQ2hpbGQoaW50IGkpIHsKKyAgICAgKiB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgcmV0dXJuIG51bGw7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0KKyAgICAgKiB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBpbnQgZ2V0QWNjZXNzaWJsZUNoaWxkcmVuQ291bnQoKSB7IHRvb2xraXQubG9ja0FXVCgpOworICAgICAqIHRyeSB7IHJldHVybiAwOyB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHVibGljIEFjY2Vzc2libGVDb21wb25lbnQgZ2V0QWNjZXNzaWJsZUNvbXBvbmVudCgpIHsgcmV0dXJuCisgICAgICogdGhpczsgfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc2libGVEZXNjcmlwdGlvbigpIHsgcmV0dXJuCisgICAgICogc3VwZXIuZ2V0QWNjZXNzaWJsZURlc2NyaXB0aW9uKCk7IC8vIHdoeSBvdmVycmlkZT8gfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgaW50IGdldEFjY2Vzc2libGVJbmRleEluUGFyZW50KCkgeyB0b29sa2l0LmxvY2tBV1QoKTsKKyAgICAgKiB0cnkgeyBpZiAoZ2V0QWNjZXNzaWJsZVBhcmVudCgpID09IG51bGwpIHsgcmV0dXJuIC0xOyB9IGludCBjb3VudCA9IDA7CisgICAgICogQ29udGFpbmVyIHBhcmVudCA9IGdldFBhcmVudCgpOyBmb3IgKGludCBpID0gMDsgaSA8CisgICAgICogcGFyZW50LmdldENvbXBvbmVudENvdW50KCk7IGkrKykgeyBDb21wb25lbnQgYUNvbXAgPQorICAgICAqIHBhcmVudC5nZXRDb21wb25lbnQoaSk7IGlmIChhQ29tcCBpbnN0YW5jZW9mIEFjY2Vzc2libGUpIHsgaWYgKGFDb21wID09CisgICAgICogQ29tcG9uZW50LnRoaXMpIHsgcmV0dXJuIGNvdW50OyB9ICsrY291bnQ7IH0gfSByZXR1cm4gLTE7IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBBY2Nlc3NpYmxlUm9sZSBnZXRBY2Nlc3NpYmxlUm9sZSgpIHsgdG9vbGtpdC5sb2NrQVdUKCk7CisgICAgICogdHJ5IHsgcmV0dXJuIEFjY2Vzc2libGVSb2xlLkFXVF9DT01QT05FTlQ7IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBBY2Nlc3NpYmxlU3RhdGVTZXQgZ2V0QWNjZXNzaWJsZVN0YXRlU2V0KCkgeworICAgICAqIHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyBBY2Nlc3NpYmxlU3RhdGVTZXQgc2V0ID0gbmV3CisgICAgICogQWNjZXNzaWJsZVN0YXRlU2V0KCk7IGlmIChpc0VuYWJsZWQoKSkgeworICAgICAqIHNldC5hZGQoQWNjZXNzaWJsZVN0YXRlLkVOQUJMRUQpOyB9IGlmIChpc0ZvY3VzYWJsZSgpKSB7CisgICAgICogc2V0LmFkZChBY2Nlc3NpYmxlU3RhdGUuRk9DVVNBQkxFKTsgfSBpZiAoaGFzRm9jdXMoKSkgeworICAgICAqIHNldC5hZGQoQWNjZXNzaWJsZVN0YXRlLkZPQ1VTRUQpOyB9IGlmIChpc09wYXF1ZSgpKSB7CisgICAgICogc2V0LmFkZChBY2Nlc3NpYmxlU3RhdGUuT1BBUVVFKTsgfSBpZiAoaXNTaG93aW5nKCkpIHsKKyAgICAgKiBzZXQuYWRkKEFjY2Vzc2libGVTdGF0ZS5TSE9XSU5HKTsgfSBpZiAoaXNWaXNpYmxlKCkpIHsKKyAgICAgKiBzZXQuYWRkKEFjY2Vzc2libGVTdGF0ZS5WSVNJQkxFKTsgfSByZXR1cm4gc2V0OyB9IGZpbmFsbHkgeworICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHRocm93cyBJbGxlZ2FsQ29tcG9uZW50U3RhdGVFeGNlcHRpb24KKyAgICAgKiB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4gQ29tcG9uZW50LnRoaXMuZ2V0TG9jYWxlKCk7IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IH0KKyAgICAgKi8KICAgICAvKioKLSAgICAgKiBUaGUgQmx0QnVmZmVyU3RyYXRlZ3kgY2xhc3MgcHJvdmlkZXMgb3Bwb3J0dW5pdHkgb2YgYmxpdHRpbmcgCi0gICAgICogb2Zmc2NyZWVuIHN1cmZhY2VzIHRvIGEgY29tcG9uZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiAKLSAgICAgKiBibGl0dGluZywgc2VlIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQml0X2JsaXQiPkJpdCBibGl0PC9hPi4KKyAgICAgKiBUaGUgQmx0QnVmZmVyU3RyYXRlZ3kgY2xhc3MgcHJvdmlkZXMgb3Bwb3J0dW5pdHkgb2YgYmxpdHRpbmcgb2Zmc2NyZWVuCisgICAgICogc3VyZmFjZXMgdG8gYSBjb21wb25lbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGJsaXR0aW5nLCBzZWUgPGEKKyAgICAgKiBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpdF9ibGl0Ij5CaXQgYmxpdDwvYT4uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGNsYXNzIEJsdEJ1ZmZlclN0cmF0ZWd5IGV4dGVuZHMgQnVmZmVyU3RyYXRlZ3kgewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBiYWNrIGJ1ZmZlcnMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBiYWNrIGJ1ZmZlcnMuCisgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgVm9sYXRpbGVJbWFnZVtdIGJhY2tCdWZmZXJzOwogCi0gICAgICAgIC8qKiBUaGUgY2Fwcy4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjYXBzLgorICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIEJ1ZmZlckNhcGFiaWxpdGllcyBjYXBzOwogCi0gICAgICAgIC8qKiBUaGUgd2lkdGguICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGguCisgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgaW50IHdpZHRoOwogCi0gICAgICAgIC8qKiBUaGUgaGVpZ2h0LiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGhlaWdodC4KKyAgICAgICAgICovCiAgICAgICAgIHByb3RlY3RlZCBpbnQgaGVpZ2h0OwogCi0gICAgICAgIC8qKiBUaGUgdmFsaWRhdGVkIGNvbnRlbnRzLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHZhbGlkYXRlZCBjb250ZW50cy4KKyAgICAgICAgICovCiAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlZENvbnRlbnRzOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQmx0QnVmZmVyU3RyYXRlZ3kgYnVmZmVyIHN0cmF0ZWd5LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG51bUJ1ZmZlcnMgdGhlIG51bWJlciBvZiBidWZmZXJzLgotICAgICAgICAgKiBAcGFyYW0gY2FwcyB0aGUgQnVmZmVyQ2FwYWJpbGl0aWVzLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHRocm93cyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiB0aGUgbm90IGltcGxlbWVudGVkIGV4Y2VwdGlvbi4KKyAgICAgICAgICogQHBhcmFtIG51bUJ1ZmZlcnMKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMuCisgICAgICAgICAqIEBwYXJhbSBjYXBzCisgICAgICAgICAqICAgICAgICAgICAgdGhlIEJ1ZmZlckNhcGFiaWxpdGllcy4KKyAgICAgICAgICogQHRocm93cyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICB0aGUgbm90IGltcGxlbWVudGVkIGV4Y2VwdGlvbi4KICAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBCbHRCdWZmZXJTdHJhdGVneShpbnQgbnVtQnVmZmVycywgQnVmZmVyQ2FwYWJpbGl0aWVzIGNhcHMpIHRocm93cyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uIHsKKyAgICAgICAgcHJvdGVjdGVkIEJsdEJ1ZmZlclN0cmF0ZWd5KGludCBudW1CdWZmZXJzLCBCdWZmZXJDYXBhYmlsaXRpZXMgY2FwcykKKyAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpZiAodHJ1ZSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRyYXdpbmcgYnVmZmVyIGhhcyBiZWVuIGxvc3Qgc2luY2UgdGhlIGxhc3QgY2FsbCAKLSAgICAgICAgICogdG8gZ2V0RHJhd0dyYXBoaWNzLiAKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBkcmF3aW5nIGJ1ZmZlciBoYXMgYmVlbiBsb3N0IHNpbmNlIHRoZSBsYXN0IGNhbGwKKyAgICAgICAgICogdG8gZ2V0RHJhd0dyYXBoaWNzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkcmF3aW5nIGJ1ZmZlciBoYXMgYmVlbiBsb3N0IHNpbmNlIHRoZSBsYXN0IGNhbGwgCi0gICAgICAgICAqIHRvIGdldERyYXdHcmFwaGljcywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAgICAgKiAgCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZHJhd2luZyBidWZmZXIgaGFzIGJlZW4gbG9zdCBzaW5jZSB0aGUgbGFzdCBjYWxsCisgICAgICAgICAqICAgICAgICAgdG8gZ2V0RHJhd0dyYXBoaWNzLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICAqIEBzZWUgamF2YS5hd3QuaW1hZ2UuQnVmZmVyU3RyYXRlZ3kjY29udGVudHNMb3N0KCkKICAgICAgICAgICovCiAgICAgICAgIEBPdmVycmlkZQpAQCAtNjM0LDkgKzM2MCw4IEBACiAgICAgICAgICAqIHN0YXRlIGFuZCByZWluaXRpYWxpemVkIHRvIHRoZSBkZWZhdWx0IGJhY2tncm91bmQgY29sb3IuCiAgICAgICAgICAqIAogICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRyYXdpbmcgYnVmZmVyIGhhcyBiZWVuIHJlc3RvcmVkIGZyb20gYSBsb3N0Ci0gICAgICAgICAqIHN0YXRlIGFuZCByZWluaXRpYWxpemVkIHRvIHRoZSBkZWZhdWx0IGJhY2tncm91bmQgY29sb3IsCi0gICAgICAgICAqIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgICAgICogICAgICAgICAgIAorICAgICAgICAgKiAgICAgICAgIHN0YXRlIGFuZCByZWluaXRpYWxpemVkIHRvIHRoZSBkZWZhdWx0IGJhY2tncm91bmQgY29sb3IsCisgICAgICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAgKiBAc2VlIGphdmEuYXd0LmltYWdlLkJ1ZmZlclN0cmF0ZWd5I2NvbnRlbnRzUmVzdG9yZWQoKQogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCkBAIC02NTAsNyArMzc1LDggQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENyZWF0ZXMgdGhlIGJhY2sgYnVmZmVycy4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBudW1CdWZmZXJzIHRoZSBudW1iZXIgb2YgYnVmZmVycy4KKyAgICAgICAgICogQHBhcmFtIG51bUJ1ZmZlcnMKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMuCiAgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCYWNrQnVmZmVycyhpbnQgbnVtQnVmZmVycykgewogICAgICAgICAgICAgaWYgKHRydWUpIHsKQEAgLTY2MiwxOSArMzg4LDE3IEBACiAgICAgICAgICAqIFJldHVybnMgdGhlIEJ1ZmZlckNhcGFiaWxpdGllcyBvZiB0aGUgYnVmZmVyIHN0cmF0ZWd5LgogICAgICAgICAgKiAKICAgICAgICAgICogQHJldHVybiB0aGUgQnVmZmVyQ2FwYWJpbGl0aWVzLgotICAgICAgICAgKiAKICAgICAgICAgICogQHNlZSBqYXZhLmF3dC5pbWFnZS5CdWZmZXJTdHJhdGVneSNnZXRDYXBhYmlsaXRpZXMoKQogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBCdWZmZXJDYXBhYmlsaXRpZXMgZ2V0Q2FwYWJpbGl0aWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIChCdWZmZXJDYXBhYmlsaXRpZXMpIGNhcHMuY2xvbmUoKTsKKyAgICAgICAgICAgIHJldHVybiAoQnVmZmVyQ2FwYWJpbGl0aWVzKWNhcHMuY2xvbmUoKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZXRzIEdyYXBoaWNzIG9mIGN1cnJlbnQgYnVmZmVyIHN0cmF0ZWd5LgogICAgICAgICAgKiAKICAgICAgICAgICogQHJldHVybiB0aGUgR3JhcGhpY3Mgb2YgY3VycmVudCBidWZmZXIgc3RyYXRlZ3kuCi0gICAgICAgICAqIAogICAgICAgICAgKiBAc2VlIGphdmEuYXd0LmltYWdlLkJ1ZmZlclN0cmF0ZWd5I2dldERyYXdHcmFwaGljcygpCiAgICAgICAgICAqLwogICAgICAgICBAT3ZlcnJpZGUKQEAgLTcwOCw1NiArNDMyLDY4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIEZsaXBCdWZmZXJTdHJhdGVneSBjbGFzcyBpcyBmb3IgZmxpcHBpbmcgYnVmZmVycyBvbiBhIGNvbXBvbmVudC4gCisgICAgICogVGhlIEZsaXBCdWZmZXJTdHJhdGVneSBjbGFzcyBpcyBmb3IgZmxpcHBpbmcgYnVmZmVycyBvbiBhIGNvbXBvbmVudC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgY2xhc3MgRmxpcEJ1ZmZlclN0cmF0ZWd5IGV4dGVuZHMgQnVmZmVyU3RyYXRlZ3kgewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBCdWZmZXIgQ2FwYWJpbGl0aWVzLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgQnVmZmVyIENhcGFiaWxpdGllcy4KKyAgICAgICAgICovCiAgICAgICAgIHByb3RlY3RlZCBCdWZmZXJDYXBhYmlsaXRpZXMgY2FwczsKIAotICAgICAgICAvKiogVGhlIGRyYXdpbmcgYnVmZmVyLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRyYXdpbmcgYnVmZmVyLgorICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIEltYWdlIGRyYXdCdWZmZXI7CiAKLSAgICAgICAgLyoqIFRoZSBkcmF3aW5nIFZvbGF0aWxlSW1hZ2UgYnVmZmVyLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRyYXdpbmcgVm9sYXRpbGVJbWFnZSBidWZmZXIuCisgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgVm9sYXRpbGVJbWFnZSBkcmF3VkJ1ZmZlcjsKIAotICAgICAgICAvKiogVGhlIG51bWJlciBvZiBidWZmZXJzLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG51bWJlciBvZiBidWZmZXJzLgorICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIGludCBudW1CdWZmZXJzOwogCi0gICAgICAgIC8qKiBUaGUgdmFsaWRhdGVkIGNvbnRlbnRzIGluZGljYXRlcyBpZiB0aGUgZHJhd2luZyBidWZmZXIgaXMgcmVzdG9yZWQgZnJvbQotICAgICAgICAgKiBsb3N0IHN0YXRlLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHZhbGlkYXRlZCBjb250ZW50cyBpbmRpY2F0ZXMgaWYgdGhlIGRyYXdpbmcgYnVmZmVyIGlzIHJlc3RvcmVkCisgICAgICAgICAqIGZyb20gbG9zdCBzdGF0ZS4KKyAgICAgICAgICovCiAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlZENvbnRlbnRzOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxpcCBidWZmZXIgc3RyYXRlZ3kuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gbnVtQnVmZmVycyB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMuCi0gICAgICAgICAqIEBwYXJhbSBjYXBzIHRoZSBCdWZmZXJDYXBhYmlsaXRpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAdGhyb3dzIEFXVEV4Y2VwdGlvbiBpZiB0aGUgY2FwYWJpbGl0aWVzIHN1cHBsaWVkIGNvdWxkIG5vdCAKLSAgICAgICAgICogYmUgc3VwcG9ydGVkIG9yIG1ldC4KKyAgICAgICAgICogQHBhcmFtIG51bUJ1ZmZlcnMKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMuCisgICAgICAgICAqIEBwYXJhbSBjYXBzCisgICAgICAgICAqICAgICAgICAgICAgdGhlIEJ1ZmZlckNhcGFiaWxpdGllcy4KKyAgICAgICAgICogQHRocm93cyBBV1RFeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgdGhlIGNhcGFiaWxpdGllcyBzdXBwbGllZCBjb3VsZCBub3QgYmUgc3VwcG9ydGVkIG9yCisgICAgICAgICAqICAgICAgICAgICAgIG1ldC4KICAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBGbGlwQnVmZmVyU3RyYXRlZ3koaW50IG51bUJ1ZmZlcnMsIEJ1ZmZlckNhcGFiaWxpdGllcyBjYXBzKQotICAgICAgICAgICAgICAgIHRocm93cyBBV1RFeGNlcHRpb24gewotICAgICAgICAgICAgLy8/Pz9BV1QKKyAgICAgICAgcHJvdGVjdGVkIEZsaXBCdWZmZXJTdHJhdGVneShpbnQgbnVtQnVmZmVycywgQnVmZmVyQ2FwYWJpbGl0aWVzIGNhcHMpIHRocm93cyBBV1RFeGNlcHRpb24geworICAgICAgICAgICAgLy8gPz8/QVdUCiAgICAgICAgICAgICAvKgotICAgICAgICAgICAgaWYgKCEoQ29tcG9uZW50LnRoaXMgaW5zdGFuY2VvZiBXaW5kb3cpICYmICEoQ29tcG9uZW50LnRoaXMgaW5zdGFuY2VvZiBDYW52YXMpKSB7Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjE0Qj1Pbmx5IENhbnZhcyBvciBXaW5kb3cgaXMgYWxsb3dlZAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTRCIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqLworICAgICAgICAgICAgICogaWYgKCEoQ29tcG9uZW50LnRoaXMgaW5zdGFuY2VvZiBXaW5kb3cpICYmICEoQ29tcG9uZW50LnRoaXMKKyAgICAgICAgICAgICAqIGluc3RhbmNlb2YgQ2FudmFzKSkgeyAvLyBhd3QuMTRCPU9ubHkgQ2FudmFzIG9yIFdpbmRvdyBpcyBhbGxvd2VkCisgICAgICAgICAgICAgKiB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjE0QiIpKTsKKyAgICAgICAgICAgICAqIC8vJE5PTi1OTFMtMSQgfQorICAgICAgICAgICAgICovCiAgICAgICAgICAgICAvLyBUT0RPOiB0aHJvdyBuZXcgQVdURXhjZXB0aW9uKCJDYXBhYmlsaXRpZXMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgICAgICAgIHRoaXMubnVtQnVmZmVycyA9IG51bUJ1ZmZlcnM7Ci0gICAgICAgICAgICB0aGlzLmNhcHMgPSAoQnVmZmVyQ2FwYWJpbGl0aWVzKSBjYXBzLmNsb25lKCk7CisgICAgICAgICAgICB0aGlzLmNhcHMgPSAoQnVmZmVyQ2FwYWJpbGl0aWVzKWNhcHMuY2xvbmUoKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRyYXdpbmcgYnVmZmVyIGhhcyBiZWVuIGxvc3Qgc2luY2UgdGhlIGxhc3QgY2FsbCAKLSAgICAgICAgICogdG8gZ2V0RHJhd0dyYXBoaWNzLiAKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBkcmF3aW5nIGJ1ZmZlciBoYXMgYmVlbiBsb3N0IHNpbmNlIHRoZSBsYXN0IGNhbGwKKyAgICAgICAgICogdG8gZ2V0RHJhd0dyYXBoaWNzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkcmF3aW5nIGJ1ZmZlciBoYXMgYmVlbiBsb3N0IHNpbmNlIHRoZSBsYXN0IGNhbGwgCi0gICAgICAgICAqIHRvIGdldERyYXdHcmFwaGljcywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkcmF3aW5nIGJ1ZmZlciBoYXMgYmVlbiBsb3N0IHNpbmNlIHRoZSBsYXN0IGNhbGwKKyAgICAgICAgICogICAgICAgICB0byBnZXREcmF3R3JhcGhpY3MsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICogQHNlZSBqYXZhLmF3dC5pbWFnZS5CdWZmZXJTdHJhdGVneSNjb250ZW50c0xvc3QoKQogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCkBAIC03NzMsOSArNTA5LDggQEAKICAgICAgICAgICogc3RhdGUgYW5kIHJlaW5pdGlhbGl6ZWQgdG8gdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvci4KICAgICAgICAgICogCiAgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZHJhd2luZyBidWZmZXIgaGFzIGJlZW4gcmVzdG9yZWQgZnJvbSBhIGxvc3QKLSAgICAgICAgICogc3RhdGUgYW5kIHJlaW5pdGlhbGl6ZWQgdG8gdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvciwKLSAgICAgICAgICogZmFsc2Ugb3RoZXJ3aXNlLiAKLSAgICAgICAgICogCisgICAgICAgICAqICAgICAgICAgc3RhdGUgYW5kIHJlaW5pdGlhbGl6ZWQgdG8gdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvciwKKyAgICAgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICAqIEBzZWUgamF2YS5hd3QuaW1hZ2UuQnVmZmVyU3RyYXRlZ3kjY29udGVudHNSZXN0b3JlZCgpCiAgICAgICAgICAqLwogICAgICAgICBAT3ZlcnJpZGUKQEAgLTc4OSwxNCArNTI0LDE0IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDcmVhdGVzIGZsaXBwaW5nIGJ1ZmZlcnMgd2l0aCB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBjYXBhYmlsaXRpZXMuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gbnVtQnVmZmVycyB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMuCi0gICAgICAgICAqIEBwYXJhbSBjYXBzIHRoZSBCdWZmZXJDYXBhYmlsaXRpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAdGhyb3dzIEFXVEV4Y2VwdGlvbiBpZiB0aGUgY2FwYWJpbGl0aWVzIGNvdWxkIG5vdCBiZSAKLSAgICAgICAgICogc3VwcG9ydGVkIG9yIG1ldC4KKyAgICAgICAgICogQHBhcmFtIG51bUJ1ZmZlcnMKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMuCisgICAgICAgICAqIEBwYXJhbSBjYXBzCisgICAgICAgICAqICAgICAgICAgICAgdGhlIEJ1ZmZlckNhcGFiaWxpdGllcy4KKyAgICAgICAgICogQHRocm93cyBBV1RFeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgdGhlIGNhcGFiaWxpdGllcyBjb3VsZCBub3QgYmUgc3VwcG9ydGVkIG9yIG1ldC4KICAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1ZmZlcnMoaW50IG51bUJ1ZmZlcnMsIEJ1ZmZlckNhcGFiaWxpdGllcyBjYXBzKQotICAgICAgICAgICAgICAgIHRocm93cyBBV1RFeGNlcHRpb24geworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdWZmZXJzKGludCBudW1CdWZmZXJzLCBCdWZmZXJDYXBhYmlsaXRpZXMgY2FwcykgdGhyb3dzIEFXVEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpZiAobnVtQnVmZmVycyA8IDIpIHsKICAgICAgICAgICAgICAgICAvLyBhd3QuMTRDPU51bWJlciBvZiBidWZmZXJzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9uZQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTRDIikpOyAvLyROT04tTkxTLTEkCkBAIC04MjcsNyArNTYyLDggQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEZsaXBzIHRoZSBjb250ZW50cyBvZiB0aGUgYmFjayBidWZmZXIgdG8gdGhlIGZyb250IGJ1ZmZlci4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBmbGlwQWN0aW9uIHRoZSBmbGlwIGFjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGZsaXBBY3Rpb24KKyAgICAgICAgICogICAgICAgICAgICB0aGUgZmxpcCBhY3Rpb24uCiAgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmbGlwKEJ1ZmZlckNhcGFiaWxpdGllcy5GbGlwQ29udGVudHMgZmxpcEFjdGlvbikgewogICAgICAgICAgICAgaWYgKHRydWUpIHsKQEAgLTg1MSwxOSArNTg3LDE3IEBACiAgICAgICAgICAqIFJldHVybnMgdGhlIEJ1ZmZlckNhcGFiaWxpdGllcyBvZiB0aGUgYnVmZmVyIHN0cmF0ZWd5LgogICAgICAgICAgKiAKICAgICAgICAgICogQHJldHVybiB0aGUgQnVmZmVyQ2FwYWJpbGl0aWVzLgotICAgICAgICAgKiAKICAgICAgICAgICogQHNlZSBqYXZhLmF3dC5pbWFnZS5CdWZmZXJTdHJhdGVneSNnZXRDYXBhYmlsaXRpZXMoKQogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBCdWZmZXJDYXBhYmlsaXRpZXMgZ2V0Q2FwYWJpbGl0aWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIChCdWZmZXJDYXBhYmlsaXRpZXMpIGNhcHMuY2xvbmUoKTsKKyAgICAgICAgICAgIHJldHVybiAoQnVmZmVyQ2FwYWJpbGl0aWVzKWNhcHMuY2xvbmUoKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZXRzIEdyYXBoaWNzIG9mIGN1cnJlbnQgYnVmZmVyIHN0cmF0ZWd5LgogICAgICAgICAgKiAKICAgICAgICAgICogQHJldHVybiB0aGUgR3JhcGhpY3Mgb2YgY3VycmVudCBidWZmZXIgc3RyYXRlZ3kuCi0gICAgICAgICAqIAogICAgICAgICAgKiBAc2VlIGphdmEuYXd0LmltYWdlLkJ1ZmZlclN0cmF0ZWd5I2dldERyYXdHcmFwaGljcygpCiAgICAgICAgICAqLwogICAgICAgICBAT3ZlcnJpZGUKQEAgLTkwMCwxNCArNjM0LDE2IEBACiAgICAgICogVGhlIGludGVybmFsIGNvbXBvbmVudCdzIHN0YXRlIHV0aWxpemVkIGJ5IHRoZSB2aXN1YWwgdGhlbWUuCiAgICAgICovCiAgICAgY2xhc3MgQ29tcG9uZW50U3RhdGUgaW1wbGVtZW50cyBTdGF0ZSB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGRlZmF1bHQgbWluaW11bSBzaXplLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGVmYXVsdCBtaW5pbXVtIHNpemUuCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIERpbWVuc2lvbiBkZWZhdWx0TWluaW11bVNpemUgPSBuZXcgRGltZW5zaW9uKCk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENoZWNrcyBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBjb21wb25lbnQgaXMgZW5hYmxlZAorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBjb21wb25lbnQgaXMgZW5hYmxlZC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKICAgICAgICAgICAgIHJldHVybiBlbmFibGVkOwpAQCAtOTE2LDcgKzY1Miw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDaGVja3MgaWYgdGhlIGNvbXBvbmVudCBpcyB2aXNpYmxlLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgY29tcG9uZW50IGlzIHZpc2libGUKKyAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgY29tcG9uZW50IGlzIHZpc2libGUuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CiAgICAgICAgICAgICByZXR1cm4gdmlzaWJsZTsKQEAgLTkyNSwxNyArNjYxLDE3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDaGVja3MgaWYgaXMgZm9jdXNlZC4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgZm9jdXNlZAorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGZvY3VzZWQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzZWQoKSB7Ci0gICAgICAgICAgICAvLz8/P0FXVDogcmV0dXJuIGlzRm9jdXNPd25lcigpOworICAgICAgICAgICAgLy8gPz8/QVdUOiByZXR1cm4gaXNGb2N1c093bmVyKCk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogR2V0cyB0aGUgZm9udC4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGZvbnQKKyAgICAgICAgICogQHJldHVybiB0aGUgZm9udC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBGb250IGdldEZvbnQoKSB7CiAgICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50LnRoaXMuZ2V0Rm9udCgpOwpAQCAtOTQ0LDcgKzY4MCw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDaGVja3MgaWYgdGhlIGZvbnQgaGFzIGJlZW4gc2V0LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgZm9udCBoYXMgYmVlbiBzZXQKKyAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgZm9udCBoYXMgYmVlbiBzZXQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvbnRTZXQoKSB7CiAgICAgICAgICAgICByZXR1cm4gZm9udCAhPSBudWxsOwpAQCAtOTUzLDcgKzY4OSw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgYmFja2dyb3VuZCBjb2xvcgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIENvbG9yIGdldEJhY2tncm91bmQoKSB7CiAgICAgICAgICAgICBDb2xvciBjID0gQ29tcG9uZW50LnRoaXMuZ2V0QmFja2dyb3VuZCgpOwpAQCAtOTYzLDcgKzY5OSw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDaGVja3MgaWYgdGhlIGJhY2tncm91bmQgaXMgc2V0LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgYmFja2dyb3VuZCBpcyBzZXQKKyAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgYmFja2dyb3VuZCBpcyBzZXQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0JhY2tncm91bmRTZXQoKSB7CiAgICAgICAgICAgICByZXR1cm4gYmFja0NvbG9yICE9IG51bGw7CkBAIC05NzIsNyArNzA4LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldHMgdGhlIHRleHQgY29sb3IuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSB0ZXh0IGNvbG9yCisgICAgICAgICAqIEByZXR1cm4gdGhlIHRleHQgY29sb3IuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgQ29sb3IgZ2V0VGV4dENvbG9yKCkgewogICAgICAgICAgICAgQ29sb3IgYyA9IGdldEZvcmVncm91bmQoKTsKQEAgLTk4Miw3ICs3MTgsNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogQ2hlY2tzIGlmIHRoZSB0ZXh0IGNvbG9yIGlzIHNldC4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHRleHQgY29sb3IgaXMgc2V0CisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHRleHQgY29sb3IgaXMgc2V0LgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNUZXh0Q29sb3JTZXQoKSB7CiAgICAgICAgICAgICByZXR1cm4gZm9yZUNvbG9yICE9IG51bGw7CkBAIC05OTEsNyArNzI3LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldHMgdGhlIGZvbnQgbWV0cmljcy4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGZvbnQgbWV0cmljcworICAgICAgICAgKiBAcmV0dXJuIHRoZSBmb250IG1ldHJpY3MuCiAgICAgICAgICAqLwogICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgICAgICBwdWJsaWMgRm9udE1ldHJpY3MgZ2V0Rm9udE1ldHJpY3MoKSB7CkBAIC0xMDAxLDcgKzczNyw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZXRzIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBib3VuZGluZyByZWN0YW5nbGUKKyAgICAgICAgICogQHJldHVybiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFJlY3RhbmdsZSBnZXRCb3VuZHMoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZSh4LCB5LCB3LCBoKTsKQEAgLTEwMTAsNyArNzQ2LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZQorICAgICAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRGltZW5zaW9uIGdldFNpemUoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbih3LCBoKTsKQEAgLTEwMTksNyArNzU1LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldHMgdGhlIHdpbmRvdyBpZC4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHdpbmRvdyBpZAorICAgICAgICAgKiBAcmV0dXJuIHRoZSB3aW5kb3cgaWQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgbG9uZyBnZXRXaW5kb3dJZCgpIHsKICAgICAgICAgICAgIE5hdGl2ZVdpbmRvdyB3aW4gPSBnZXROYXRpdmVXaW5kb3coKTsKQEAgLTEwMjksNyArNzY1LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldHMgdGhlIGRlZmF1bHQgbWluaW11bSBzaXplLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBtaW5pbXVtIHNpemUKKyAgICAgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBtaW5pbXVtIHNpemUuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRGltZW5zaW9uIGdldERlZmF1bHRNaW5pbXVtU2l6ZSgpIHsKICAgICAgICAgICAgIGlmIChkZWZhdWx0TWluaW11bVNpemUgPT0gbnVsbCkgewpAQCAtMTA0MSw3ICs3NzcsOCBAQAogICAgICAgICAvKioKICAgICAgICAgICogU2V0cyB0aGUgZGVmYXVsdCBtaW5pbXVtIHNpemUuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbmV3IGRlZmF1bHQgbWluaW11bSBzaXplCisgICAgICAgICAqIEBwYXJhbSBzaXplCisgICAgICAgICAqICAgICAgICAgICAgdGhlIG5ldyBkZWZhdWx0IG1pbmltdW0gc2l6ZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRNaW5pbXVtU2l6ZShEaW1lbnNpb24gc2l6ZSkgewogICAgICAgICAgICAgZGVmYXVsdE1pbmltdW1TaXplID0gc2l6ZTsKQEAgLTEwNjIsMTc5ICs3OTksMjgzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLz8/P0FXVDogcHJpdmF0ZSB0cmFuc2llbnQgQWNjZXNzaWJsZUNvbnRleHQgYWNjZXNzaWJsZUNvbnRleHQ7CisgICAgLy8gPz8/QVdUOiBwcml2YXRlIHRyYW5zaWVudCBBY2Nlc3NpYmxlQ29udGV4dCBhY2Nlc3NpYmxlQ29udGV4dDsKIAotICAgIC8qKiBUaGUgYmVoYXZpb3VyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBiZWhhdmlvdXIuCisgICAgICovCiAgICAgZmluYWwgdHJhbnNpZW50IENvbXBvbmVudEJlaGF2aW9yIGJlaGF2aW91cjsKIAotICAgIC8vPz8/QVdUOiBDb250YWluZXIgcGFyZW50OworICAgIC8vID8/P0FXVDogQ29udGFpbmVyIHBhcmVudDsKIAotICAgIC8qKiBUaGUgbmFtZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZS4KKyAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBuYW1lOwogCi0gICAgLyoqIFRoZSBhdXRvIG5hbWUuICovCisgICAgLyoqCisgICAgICogVGhlIGF1dG8gbmFtZS4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gYXV0b05hbWUgPSB0cnVlOwogCi0gICAgLyoqIFRoZSBmb250LiAqLworICAgIC8qKgorICAgICAqIFRoZSBmb250LgorICAgICAqLwogICAgIHByaXZhdGUgRm9udCBmb250OwogCi0gICAgLyoqIFRoZSBiYWNrIGNvbG9yLiAqLworICAgIC8qKgorICAgICAqIFRoZSBiYWNrIGNvbG9yLgorICAgICAqLwogICAgIHByaXZhdGUgQ29sb3IgYmFja0NvbG9yOwogCi0gICAgLyoqIFRoZSBmb3JlIGNvbG9yLiAqLworICAgIC8qKgorICAgICAqIFRoZSBmb3JlIGNvbG9yLgorICAgICAqLwogICAgIHByaXZhdGUgQ29sb3IgZm9yZUNvbG9yOwogCi0gICAgLyoqIFRoZSBkZXByZWNhdGVkIGV2ZW50IGhhbmRsZXIuICovCisgICAgLyoqCisgICAgICogVGhlIGRlcHJlY2F0ZWQgZXZlbnQgaGFuZGxlci4KKyAgICAgKi8KICAgICBib29sZWFuIGRlcHJlY2F0ZWRFdmVudEhhbmRsZXIgPSB0cnVlOwogCi0gICAgLyoqIFRoZSBlbmFibGVkIGV2ZW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZW5hYmxlZCBldmVudHMuCisgICAgICovCiAgICAgcHJpdmF0ZSBsb25nIGVuYWJsZWRFdmVudHM7CiAKLSAgICAvKiogVGhlIGVuYWJsZWQgYXd0IGV2ZW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZW5hYmxlZCBBV1QgZXZlbnRzLgorICAgICAqLwogICAgIHByaXZhdGUgbG9uZyBlbmFibGVkQVdURXZlbnRzOwogCi0gICAgLyoqIFRoZSBjb21wb25lbnQgbGlzdGVuZXJzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb21wb25lbnQgbGlzdGVuZXJzLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgQVdUTGlzdGVuZXJMaXN0PENvbXBvbmVudExpc3RlbmVyPiBjb21wb25lbnRMaXN0ZW5lcnMgPSBuZXcgQVdUTGlzdGVuZXJMaXN0PENvbXBvbmVudExpc3RlbmVyPigKICAgICAgICAgICAgIHRoaXMpOwogCi0gICAgLyoqIFRoZSBmb2N1cyBsaXN0ZW5lcnMuICovCisgICAgLyoqCisgICAgICogVGhlIGZvY3VzIGxpc3RlbmVycy4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIEFXVExpc3RlbmVyTGlzdDxGb2N1c0xpc3RlbmVyPiBmb2N1c0xpc3RlbmVycyA9IG5ldyBBV1RMaXN0ZW5lckxpc3Q8Rm9jdXNMaXN0ZW5lcj4oCiAgICAgICAgICAgICB0aGlzKTsKIAotICAgIC8qKiBUaGUgaGllcmFyY2h5IGxpc3RlbmVycy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaGllcmFyY2h5IGxpc3RlbmVycy4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIEFXVExpc3RlbmVyTGlzdDxIaWVyYXJjaHlMaXN0ZW5lcj4gaGllcmFyY2h5TGlzdGVuZXJzID0gbmV3IEFXVExpc3RlbmVyTGlzdDxIaWVyYXJjaHlMaXN0ZW5lcj4oCiAgICAgICAgICAgICB0aGlzKTsKIAotICAgIC8qKiBUaGUgaGllcmFyY2h5IGJvdW5kcyBsaXN0ZW5lcnMuICovCisgICAgLyoqCisgICAgICogVGhlIGhpZXJhcmNoeSBib3VuZHMgbGlzdGVuZXJzLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgQVdUTGlzdGVuZXJMaXN0PEhpZXJhcmNoeUJvdW5kc0xpc3RlbmVyPiBoaWVyYXJjaHlCb3VuZHNMaXN0ZW5lcnMgPSBuZXcgQVdUTGlzdGVuZXJMaXN0PEhpZXJhcmNoeUJvdW5kc0xpc3RlbmVyPigKICAgICAgICAgICAgIHRoaXMpOwogCi0gICAgLyoqIFRoZSBrZXkgbGlzdGVuZXJzLiAqLwotICAgIHByaXZhdGUgZmluYWwgQVdUTGlzdGVuZXJMaXN0PEtleUxpc3RlbmVyPiBrZXlMaXN0ZW5lcnMgPSBuZXcgQVdUTGlzdGVuZXJMaXN0PEtleUxpc3RlbmVyPigKLSAgICAgICAgICAgIHRoaXMpOworICAgIC8qKgorICAgICAqIFRoZSBrZXkgbGlzdGVuZXJzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQVdUTGlzdGVuZXJMaXN0PEtleUxpc3RlbmVyPiBrZXlMaXN0ZW5lcnMgPSBuZXcgQVdUTGlzdGVuZXJMaXN0PEtleUxpc3RlbmVyPih0aGlzKTsKIAotICAgIC8qKiBUaGUgbW91c2UgbGlzdGVuZXJzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBtb3VzZSBsaXN0ZW5lcnMuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBBV1RMaXN0ZW5lckxpc3Q8TW91c2VMaXN0ZW5lcj4gbW91c2VMaXN0ZW5lcnMgPSBuZXcgQVdUTGlzdGVuZXJMaXN0PE1vdXNlTGlzdGVuZXI+KAogICAgICAgICAgICAgdGhpcyk7CiAKLSAgICAvKiogVGhlIG1vdXNlIG1vdGlvbiBsaXN0ZW5lcnMuICovCisgICAgLyoqCisgICAgICogVGhlIG1vdXNlIG1vdGlvbiBsaXN0ZW5lcnMuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBBV1RMaXN0ZW5lckxpc3Q8TW91c2VNb3Rpb25MaXN0ZW5lcj4gbW91c2VNb3Rpb25MaXN0ZW5lcnMgPSBuZXcgQVdUTGlzdGVuZXJMaXN0PE1vdXNlTW90aW9uTGlzdGVuZXI+KAogICAgICAgICAgICAgdGhpcyk7CiAKLSAgICAvKiogVGhlIG1vdXNlIHdoZWVsIGxpc3RlbmVycy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbW91c2Ugd2hlZWwgbGlzdGVuZXJzLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgQVdUTGlzdGVuZXJMaXN0PE1vdXNlV2hlZWxMaXN0ZW5lcj4gbW91c2VXaGVlbExpc3RlbmVycyA9IG5ldyBBV1RMaXN0ZW5lckxpc3Q8TW91c2VXaGVlbExpc3RlbmVyPigKICAgICAgICAgICAgIHRoaXMpOwogCi0gICAgLyoqIFRoZSBpbnB1dCBtZXRob2QgbGlzdGVuZXJzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBpbnB1dCBtZXRob2QgbGlzdGVuZXJzLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgQVdUTGlzdGVuZXJMaXN0PElucHV0TWV0aG9kTGlzdGVuZXI+IGlucHV0TWV0aG9kTGlzdGVuZXJzID0gbmV3IEFXVExpc3RlbmVyTGlzdDxJbnB1dE1ldGhvZExpc3RlbmVyPigKICAgICAgICAgICAgIHRoaXMpOwogCi0gICAgLyoqIFRoZSB4LiAqLworICAgIC8qKgorICAgICAqIFRoZSB4LgorICAgICAqLwogICAgIGludCB4OwogCi0gICAgLyoqIFRoZSB5LiAqLworICAgIC8qKgorICAgICAqIFRoZSB5LgorICAgICAqLwogICAgIGludCB5OwogCi0gICAgLyoqIFRoZSB3LiAqLworICAgIC8qKgorICAgICAqIFRoZSB3LgorICAgICAqLwogICAgIGludCB3OwogCi0gICAgLyoqIFRoZSBoLiAqLworICAgIC8qKgorICAgICAqIFRoZSBoLgorICAgICAqLwogICAgIGludCBoOwogCi0gICAgLyoqIFRoZSBtYXhpbXVtIHNpemUuICovCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gc2l6ZS4KKyAgICAgKi8KICAgICBwcml2YXRlIERpbWVuc2lvbiBtYXhpbXVtU2l6ZTsKIAotICAgIC8qKiBUaGUgbWluaW11bSBzaXplLiAqLworICAgIC8qKgorICAgICAqIFRoZSBtaW5pbXVtIHNpemUuCisgICAgICovCiAgICAgcHJpdmF0ZSBEaW1lbnNpb24gbWluaW11bVNpemU7CiAKLSAgICAvKiogVGhlIHByZWZlcnJlZCBzaXplLiAqLworICAgIC8qKgorICAgICAqIFRoZSBwcmVmZXJyZWQgc2l6ZS4KKyAgICAgKi8KICAgICBwcml2YXRlIERpbWVuc2lvbiBwcmVmZXJyZWRTaXplOwogCi0gICAgLyoqIFRoZSBib3VuZHMgbWFzayBwYXJhbS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgYm91bmRzIG1hc2sgcGFyYW0uCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgYm91bmRzTWFza1BhcmFtOwogCi0gICAgLyoqIFRoZSBpZ25vcmUgcmVwYWludC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaWdub3JlIHJlcGFpbnQuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZVJlcGFpbnQ7CiAKLSAgICAvKiogVGhlIGVuYWJsZWQuICovCisgICAgLyoqCisgICAgICogVGhlIGVuYWJsZWQuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQgPSB0cnVlOwogCi0gICAgLyoqIFRoZSBpbnB1dCBtZXRob2RzIGVuYWJsZWQuICovCisgICAgLyoqCisgICAgICogVGhlIGlucHV0IG1ldGhvZHMgZW5hYmxlZC4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gaW5wdXRNZXRob2RzRW5hYmxlZCA9IHRydWU7CiAKLSAgICAvKiogVGhlIGRpc3BhdGNoIHRvIGltLiAqLworICAgIC8qKgorICAgICAqIFRoZSBkaXNwYXRjaCB0byBpbS4KKyAgICAgKi8KICAgICB0cmFuc2llbnQgYm9vbGVhbiBkaXNwYXRjaFRvSU0gPSB0cnVlOwogCi0gICAgLyoqIFRoZSBmb2N1c2FibGUuICovCisgICAgLyoqCisgICAgICogVGhlIGZvY3VzYWJsZS4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gZm9jdXNhYmxlID0gdHJ1ZTsgLy8gQnkgZGVmYXVsdCwgYWxsIENvbXBvbmVudHMgcmV0dXJuCiAKICAgICAvLyB0cnVlIGZyb20gaXNGb2N1c2FibGUoKSBtZXRob2QKLSAgICAvKiogVGhlIHZpc2libGUuICovCisgICAgLyoqCisgICAgICogVGhlIHZpc2libGUuCisgICAgICovCiAgICAgYm9vbGVhbiB2aXNpYmxlID0gdHJ1ZTsKIAotICAgIC8qKiBUaGUgY2FsbGVkIHNldCBmb2N1c2FibGUuICovCisgICAgLyoqCisgICAgICogVGhlIGNhbGxlZCBzZXQgZm9jdXNhYmxlLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBjYWxsZWRTZXRGb2N1c2FibGU7CiAKLSAgICAvKiogVGhlIG92ZXJyaWRlbiBpcyBmb2N1c2FibGUuICovCisgICAgLyoqCisgICAgICogVGhlIG92ZXJyaWRkZW4gaXMgZm9jdXNhYmxlLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBvdmVycmlkZW5Jc0ZvY3VzYWJsZSA9IHRydWU7CiAKLSAgICAvKiogVGhlIGZvY3VzIHRyYXZlcnNhbCBrZXlzIGVuYWJsZWQuICovCisgICAgLyoqCisgICAgICogVGhlIGZvY3VzIHRyYXZlcnNhbCBrZXlzIGVuYWJsZWQuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGZvY3VzVHJhdmVyc2FsS2V5c0VuYWJsZWQgPSB0cnVlOwogCi0gICAgLyoqIFBvc3NpYmxlIGtleXMgYXJlOiBGT1JXQVJEX1RSQVZFUlNBTF9LRVlTLCBCQUNLV0FSRF9UUkFWRVJTQUxfS0VZUywgVVBfQ1lDTEVfVFJBVkVSU0FMX0tFWVMuICovCisgICAgLyoqCisgICAgICogUG9zc2libGUga2V5cyBhcmU6IEZPUldBUkRfVFJBVkVSU0FMX0tFWVMsIEJBQ0tXQVJEX1RSQVZFUlNBTF9LRVlTLAorICAgICAqIFVQX0NZQ0xFX1RSQVZFUlNBTF9LRVlTLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgTWFwPEludGVnZXIsIFNldDw/IGV4dGVuZHMgQVdUS2V5U3Ryb2tlPj4gdHJhdmVyc2FsS2V5cyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFNldDw/IGV4dGVuZHMgQVdUS2V5U3Ryb2tlPj4oKTsKIAotICAgIC8qKiBUaGUgdHJhdmVyc2FsIGkgZHMuICovCisgICAgLyoqCisgICAgICogVGhlIHRyYXZlcnNhbCBpIGRzLgorICAgICAqLwogICAgIGludFtdIHRyYXZlcnNhbElEczsKIAotICAgIC8qKiBUaGUgbG9jYWxlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBsb2NhbGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBMb2NhbGUgbG9jYWxlOwogCi0gICAgLyoqIFRoZSBvcmllbnRhdGlvbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgb3JpZW50YXRpb24uCisgICAgICovCiAgICAgcHJpdmF0ZSBDb21wb25lbnRPcmllbnRhdGlvbiBvcmllbnRhdGlvbjsKIAotICAgIC8qKiBUaGUgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQuICovCisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0LgorICAgICAqLwogICAgIHByaXZhdGUgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IHByb3BlcnR5Q2hhbmdlU3VwcG9ydDsKIAotICAgIC8vPz8/QVdUOiBwcml2YXRlIEFycmF5TGlzdDxQb3B1cE1lbnU+IHBvcHVwczsKKyAgICAvLyA/Pz9BV1Q6IHByaXZhdGUgQXJyYXlMaXN0PFBvcHVwTWVudT4gcG9wdXBzOwogCi0gICAgLyoqIFRoZSBjb2FsZXNjZXIuICovCisgICAgLyoqCisgICAgICogVGhlIGNvYWxlc2Nlci4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gY29hbGVzY2VyOwogCi0gICAgLyoqIFRoZSBldmVudHMgdGFibGUuICovCisgICAgLyoqCisgICAgICogVGhlIGV2ZW50cyB0YWJsZS4KKyAgICAgKi8KICAgICBwcml2YXRlIEhhc2h0YWJsZTxJbnRlZ2VyLCBMaW5rZWRMaXN0PEFXVEV2ZW50Pj4gZXZlbnRzVGFibGU7CiAKLSAgICAvKiogQ2FzaGVkIHJlZmVyZW5jZSB1c2VkIGR1cmluZyBFdmVudFF1ZXVlLnBvc3RFdmVudCgpICovCisgICAgLyoqCisgICAgICogQ2FzaGVkIHJlZmVyZW5jZSB1c2VkIGR1cmluZyBFdmVudFF1ZXVlLnBvc3RFdmVudCgpCisgICAgICovCiAgICAgcHJpdmF0ZSBMaW5rZWRMaXN0PEFXVEV2ZW50PiBldmVudHNMaXN0OwogCi0gICAgLyoqIFRoZSBoaWVyYXJjaHkgY2hhbmdpbmcgY291bnRlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaGllcmFyY2h5IGNoYW5naW5nIGNvdW50ZXIuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgaGllcmFyY2h5Q2hhbmdpbmdDb3VudGVyOwogCi0gICAgLyoqIFRoZSB3YXMgc2hvd2luZy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgd2FzIHNob3dpbmcuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIHdhc1Nob3dpbmc7CiAKLSAgICAvKiogVGhlIHdhcyBkaXNwbGF5YWJsZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgd2FzIGRpc3BsYXlhYmxlLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiB3YXNEaXNwbGF5YWJsZTsKIAotICAgIC8qKiBUaGUgY3Vyc29yLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjdXJzb3IuCisgICAgICovCiAgICAgQ3Vyc29yIGN1cnNvcjsKIAotICAgIC8vPz8/QVdUOiBEcm9wVGFyZ2V0IGRyb3BUYXJnZXQ7CisgICAgLy8gPz8/QVdUOiBEcm9wVGFyZ2V0IGRyb3BUYXJnZXQ7CiAKLSAgICAvKiogVGhlIG1vdXNlIGV4aXRlZCBleHBlY3RlZC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbW91c2UgZXhpdGVkIGV4cGVjdGVkLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBtb3VzZUV4aXRlZEV4cGVjdGVkOwogCi0gICAgLyoqIFRoZSByZXBhaW50IHJlZ2lvbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcmVwYWludCByZWdpb24uCisgICAgICovCiAgICAgdHJhbnNpZW50IE11bHRpUmVjdEFyZWEgcmVwYWludFJlZ2lvbjsKIAotICAgIC8vPz8/QVdUOiB0cmFuc2llbnQgUmVkcmF3TWFuYWdlciByZWRyYXdNYW5hZ2VyOwotICAgIC8qKiBUaGUgcmVkcmF3IG1hbmFnZXIuICovCisgICAgLy8gPz8/QVdUOiB0cmFuc2llbnQgUmVkcmF3TWFuYWdlciByZWRyYXdNYW5hZ2VyOworICAgIC8qKgorICAgICAqIFRoZSByZWRyYXcgbWFuYWdlci4KKyAgICAgKi8KICAgICB0cmFuc2llbnQgT2JqZWN0IHJlZHJhd01hbmFnZXI7CiAKLSAgICAvKiogVGhlIHZhbGlkLiAqLworICAgIC8qKgorICAgICAqIFRoZSB2YWxpZC4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWQ7CiAKLSAgICAvKiogVGhlIHVwZGF0ZWQgaW1hZ2VzLiAqLworICAgIC8qKgorICAgICAqIFRoZSB1cGRhdGVkIGltYWdlcy4KKyAgICAgKi8KICAgICBwcml2YXRlIEhhc2hNYXA8SW1hZ2UsIEltYWdlUGFyYW1ldGVycz4gdXBkYXRlZEltYWdlczsKIAogICAgIC8qKgpAQCAtMTI0NCw3ICsxMDg1LDkgQEAKICAgICBwcml2YXRlIGNsYXNzIENvbXBvbmVudExvY2sgewogICAgIH0KIAotICAgIC8qKiBUaGUgY29tcG9uZW50IGxvY2suICovCisgICAgLyoqCisgICAgICogVGhlIGNvbXBvbmVudCBsb2NrLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgdHJhbnNpZW50IE9iamVjdCBjb21wb25lbnRMb2NrID0gbmV3IENvbXBvbmVudExvY2soKTsKICAgICBzdGF0aWMgewogICAgICAgICBQcml2aWxlZ2VkQWN0aW9uPFN0cmluZ1tdPiBhY3Rpb24gPSBuZXcgUHJpdmlsZWdlZEFjdGlvbjxTdHJpbmdbXT4oKSB7CkBAIC0xMjc2LDE3ICsxMTE5LDE2IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IENvbXBvbmVudE9yaWVudGF0aW9uLlVOS05PV047CiAgICAgICAgICAgICByZWRyYXdNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgICAgIC8vPz8/QVdUCisgICAgICAgICAgICAvLyA/Pz9BV1QKICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICB0cmF2ZXJzYWxJRHMgPSB0aGlzIGluc3RhbmNlb2YgQ29udGFpbmVyID8gS2V5Ym9hcmRGb2N1c01hbmFnZXIuY29udFRyYXZlcnNhbElEcwotICAgICAgICAgICAgICAgICAgICA6IEtleWJvYXJkRm9jdXNNYW5hZ2VyLmNvbXBUcmF2ZXJzYWxJRHM7Ci0gICAgICAgICAgICBmb3IgKGludCBlbGVtZW50IDogdHJhdmVyc2FsSURzKSB7Ci0gICAgICAgICAgICAgICAgdHJhdmVyc2FsS2V5cy5wdXQobmV3IEludGVnZXIoZWxlbWVudCksIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmVoYXZpb3VyID0gY3JlYXRlQmVoYXZpb3IoKTsKLSAgICAgICAgICAgICovCisgICAgICAgICAgICAgKiB0cmF2ZXJzYWxJRHMgPSB0aGlzIGluc3RhbmNlb2YgQ29udGFpbmVyID8KKyAgICAgICAgICAgICAqIEtleWJvYXJkRm9jdXNNYW5hZ2VyLmNvbnRUcmF2ZXJzYWxJRHMgOgorICAgICAgICAgICAgICogS2V5Ym9hcmRGb2N1c01hbmFnZXIuY29tcFRyYXZlcnNhbElEczsgZm9yIChpbnQgZWxlbWVudCA6CisgICAgICAgICAgICAgKiB0cmF2ZXJzYWxJRHMpIHsgdHJhdmVyc2FsS2V5cy5wdXQobmV3IEludGVnZXIoZWxlbWVudCksIG51bGwpOyB9CisgICAgICAgICAgICAgKiBiZWhhdmlvdXIgPSBjcmVhdGVCZWhhdmlvcigpOworICAgICAgICAgICAgICovCiAgICAgICAgICAgICBiZWhhdmlvdXIgPSBudWxsOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGRlcml2ZUNvYWxlc2NlckZsYWcoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7CkBAIC0xMzA3LDggKzExNDksOCBAQAogICAgICAgICAgICAgICAgIGZvciAoQ2xhc3M8Pz4gYyA9IHRoaXNDbGFzczsgYyAhPSBDb21wb25lbnQuY2xhc3M7IGMgPSBjLmdldFN1cGVyY2xhc3MoKSkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29hbGVzY2VNZXRob2QgPSBjLmdldERlY2xhcmVkTWV0aG9kKCJjb2FsZXNjZUV2ZW50cyIsIG5ldyBDbGFzc1tdIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqYXZhLmF3dC5BV1RFdmVudCIpLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImphdmEuYXd0LkFXVEV2ZW50IikgfSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqYXZhLmF3dC5BV1RFdmVudCIpLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiamF2YS5hd3QuQVdURXZlbnQiKX0pOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKGNvYWxlc2NlTWV0aG9kICE9IG51bGwpIHsKQEAgLTEzMzIsNyArMTE3NCw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgQ29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuZXcgbmFtZSBvZiB0aGUgQ29tcG9uZW50LgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmV3IG5hbWUgb2YgdGhlIENvbXBvbmVudC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIFN0cmluZyBvbGROYW1lOwpAQCAtMTM2NywxNSArMTIxMCwxNSBAQAogICAgIC8qKgogICAgICAqIEF1dG8gbmFtZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcuCiAgICAgICovCiAgICAgU3RyaW5nIGF1dG9OYW1lKCkgewogICAgICAgICBTdHJpbmcgbmFtZSA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwogICAgICAgICBpZiAobmFtZS5pbmRleE9mKCIkIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgLy8/Pz9BV1QKLSAgICAgICAgLy9pbnQgbnVtYmVyID0gdG9vbGtpdC5hdXRvTnVtYmVyLm5leHRDb21wb25lbnQrKzsKKyAgICAgICAgLy8gPz8/QVdUCisgICAgICAgIC8vIGludCBudW1iZXIgPSB0b29sa2l0LmF1dG9OdW1iZXIubmV4dENvbXBvbmVudCsrOwogICAgICAgICBpbnQgbnVtYmVyID0gMDsKICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpICsgSW50ZWdlci50b1N0cmluZyhudW1iZXIpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIHJldHVybiBuYW1lOwpAQCAtMTM5MCwxMCArMTIzMyw4IEBACiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgLyoKICAgICAgICAgICogVGhlIGZvcm1hdCBpcyBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvciB3aGljaCBjYW4gYmUgcmV2ZWFsZWQgYnkKLSAgICAgICAgICogdGhlIGZvbGxvd2luZyBjb2RlOgotICAgICAgICAgKiAKLSAgICAgICAgICogQ29tcG9uZW50IGMgPSBuZXcgQ29tcG9uZW50KCl7fTsgYy5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICogU3lzdGVtLm91dC5wcmludGxuKGMpOworICAgICAgICAgKiB0aGUgZm9sbG93aW5nIGNvZGU6IENvbXBvbmVudCBjID0gbmV3IENvbXBvbmVudCgpe307CisgICAgICAgICAqIGMuc2V0VmlzaWJsZShmYWxzZSk7IFN5c3RlbS5vdXQucHJpbnRsbihjKTsKICAgICAgICAgICovCiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwogICAgICAgICB0cnkgewpAQCAtMTQwMywzMiArMTI0NCwyMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHB1YmxpYyB2b2lkIGFkZChQb3B1cE1lbnUgcG9wdXApIHsKLSAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAocG9wdXAuZ2V0UGFyZW50KCkgPT0gdGhpcykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwb3B1cHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBvcHVwcyA9IG5ldyBBcnJheUxpc3Q8UG9wdXBNZW51PigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcG9wdXAuc2V0UGFyZW50KHRoaXMpOwotICAgICAgICAgICAgcG9wdXBzLmFkZChwb3B1cCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICB9Ci0gICAgfQotICAgICovCisgICAgICogcHVibGljIHZvaWQgYWRkKFBvcHVwTWVudSBwb3B1cCkgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgaWYKKyAgICAgKiAocG9wdXAuZ2V0UGFyZW50KCkgPT0gdGhpcykgeyByZXR1cm47IH0gaWYgKHBvcHVwcyA9PSBudWxsKSB7IHBvcHVwcyA9CisgICAgICogbmV3IEFycmF5TGlzdDxQb3B1cE1lbnU+KCk7IH0gcG9wdXAuc2V0UGFyZW50KHRoaXMpOyBwb3B1cHMuYWRkKHBvcHVwKTsgfQorICAgICAqIGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKi8KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlIGNvbXBvbmVudCBjb250YWlucyB0aGUgc3BlY2lmaWVkIFBvaW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIHRoZSBQb2ludC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBjb21wb25lbnQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBQb2ludCwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBQb2ludC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBjb21wb25lbnQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBQb2ludCwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhQb2ludCBwKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMTQ0MCwxNCArMTI3MCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlIGNvbXBvbmVudCBjb250YWlucyB0aGUgcG9pbnQgd2l0aCAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzLgorICAgICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlIGNvbXBvbmVudCBjb250YWlucyB0aGUgcG9pbnQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogY29vcmRpbmF0ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGNvbXBvbmVudCBjb250YWlucyB0aGUgcG9pbnQgd2l0aCAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgY29tcG9uZW50IGNvbnRhaW5zIHRoZSBwb2ludCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIGNvb3JkaW5hdGVzLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHgsIGludCB5KSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMTQ2Miw3ICsxMjkzLDYgQEAKICAgICAgKiBEZXByZWNhdGVkOiByZXBsYWNlZCBieSByZXBsYWNlZCBieSBnZXRTaXplKCkgbWV0aG9kLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGRpbWVuc2lvbi4KLSAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBnZXRTaXplKCkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0xNDc0LDkwICsxMzA0LDYzIEBACiAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwogICAgICAgICB9CiAgICAgfQotICAgIAotICAgIC8vPz8/QVdUCisKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHB1YmxpYyBDb250YWluZXIgZ2V0UGFyZW50KCkgewotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICB9Ci0gICAgfQotICAgICovCi0gICAgCisgICAgICogcHVibGljIENvbnRhaW5lciBnZXRQYXJlbnQoKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4gcGFyZW50OyB9CisgICAgICogZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqLworCiAgICAgLyoqCiAgICAgICogTGlzdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3V0IHRoZSBvdXQKLSAgICAgKiBAcGFyYW0gaW5kZW50IHRoZSBpbmRlbnQKLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3V0CisgICAgICogICAgICAgICAgICB0aGUgb3V0LgorICAgICAqIEBwYXJhbSBpbmRlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRlbnQKICAgICAgKiBAcmV0dXJuIHRoZSBuZWFyZXN0IGhlYXZ5d2VpZ2h0IGFuY2VzdG9yIGluIGhpZXJhcmNoeSBvcgotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZAorICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kLgogICAgICAqLwotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBDb21wb25lbnQgZ2V0SFdBbmNlc3RvcigpIHsKLSAgICAgICAgcmV0dXJuIChwYXJlbnQgIT0gbnVsbCA/IHBhcmVudC5nZXRIV1N1cmZhY2UoKSA6IG51bGwpOwotICAgIH0KLSAgICAqLwotICAgIAorICAgICAqIENvbXBvbmVudCBnZXRIV0FuY2VzdG9yKCkgeyByZXR1cm4gKHBhcmVudCAhPSBudWxsID8KKyAgICAgKiBwYXJlbnQuZ2V0SFdTdXJmYWNlKCkgOiBudWxsKTsgfQorICAgICAqLworCiAgICAgLyoqCiAgICAgICogQHJldHVybiBoZWF2eXdlaWdodCBjb21wb25lbnQgdGhhdCBpcyBlcXVhbCB0byBvciBpcyBhIG5lYXJlc3QKICAgICAgKiAgICAgICAgIGhlYXZ5d2VpZ2h0IGNvbnRhaW5lciBvZiB0aGUgY3VycmVudCBjb21wb25lbnQsIG9yCi0gICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQKKyAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC4KICAgICAgKi8KLSAgICAvLz8/P0FXVAorICAgIC8vID8/P0FXVAogICAgIC8qCi0gICAgQ29tcG9uZW50IGdldEhXU3VyZmFjZSgpIHsKLSAgICAgICAgQ29tcG9uZW50IHBhcmVudDsKLSAgICAgICAgZm9yIChwYXJlbnQgPSB0aGlzOyAocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQuaXNMaWdodHdlaWdodCgpKTsgcGFyZW50ID0gcGFyZW50Ci0gICAgICAgICAgICAgICAgLmdldFBhcmVudCgpKSB7Ci0gICAgICAgICAgICA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9CisgICAgICogQ29tcG9uZW50IGdldEhXU3VyZmFjZSgpIHsgQ29tcG9uZW50IHBhcmVudDsgZm9yIChwYXJlbnQgPSB0aGlzOyAocGFyZW50CisgICAgICogIT0gbnVsbCkgJiYgKHBhcmVudC5pc0xpZ2h0d2VpZ2h0KCkpOyBwYXJlbnQgPSBwYXJlbnQgLmdldFBhcmVudCgpKSB7IDsgfQorICAgICAqIHJldHVybiBwYXJlbnQ7IH0gV2luZG93IGdldFdpbmRvd0FuY2VzdG9yKCkgeyBDb21wb25lbnQgcGFyOyBmb3IgKHBhciA9CisgICAgICogdGhpczsgcGFyICE9IG51bGwgJiYgIShwYXIgaW5zdGFuY2VvZiBXaW5kb3cpOyBwYXIgPSBwYXIuZ2V0UGFyZW50KCkpIHsgOworICAgICAqIH0gcmV0dXJuIChXaW5kb3cpIHBhcjsgfQorICAgICAqLwogCi0gICAgV2luZG93IGdldFdpbmRvd0FuY2VzdG9yKCkgewotICAgICAgICBDb21wb25lbnQgcGFyOwotICAgICAgICBmb3IgKHBhciA9IHRoaXM7IHBhciAhPSBudWxsICYmICEocGFyIGluc3RhbmNlb2YgV2luZG93KTsgcGFyID0gcGFyLmdldFBhcmVudCgpKSB7Ci0gICAgICAgICAgICA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChXaW5kb3cpIHBhcjsKLSAgICB9Ci0gICAgKi8KLSAgICAKLSAgICAvKiogVG8gYmUgY2FsbGVkIGJ5IGNvbnRhaW5lciAqLwotICAgIC8vPz8/QVdUCi0gICAgLyoKLSAgICB2b2lkIHNldFBhcmVudChDb250YWluZXIgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICBzZXRSZWRyYXdNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRSZWRyYXdNYW5hZ2VyKCkgewotICAgICAgICByZWRyYXdNYW5hZ2VyID0gZ2V0UmVkcmF3TWFuYWdlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShNZW51Q29tcG9uZW50IG1lbnUpIHsKLSAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobWVudS5nZXRQYXJlbnQoKSA9PSB0aGlzKSB7Ci0gICAgICAgICAgICAgICAgbWVudS5zZXRQYXJlbnQobnVsbCk7Ci0gICAgICAgICAgICAgICAgcG9wdXBzLnJlbW92ZShtZW51KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KICAgICAvKioKLSAgICAgKiBQcmludHMgYSBsaXN0IG9mIHRoaXMgY29tcG9uZW50IHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgCi0gICAgICogbGVhZGluZyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCBQcmludFN0cmVhbS4KKyAgICAgKiBUbyBiZSBjYWxsZWQgYnkgY29udGFpbmVyCisgICAgICovCisgICAgLy8gPz8/QVdUCisgICAgLyoKKyAgICAgKiB2b2lkIHNldFBhcmVudChDb250YWluZXIgcGFyZW50KSB7IHRoaXMucGFyZW50ID0gcGFyZW50OworICAgICAqIHNldFJlZHJhd01hbmFnZXIoKTsgfSB2b2lkIHNldFJlZHJhd01hbmFnZXIoKSB7IHJlZHJhd01hbmFnZXIgPQorICAgICAqIGdldFJlZHJhd01hbmFnZXIoKTsgfSBwdWJsaWMgdm9pZCByZW1vdmUoTWVudUNvbXBvbmVudCBtZW51KSB7CisgICAgICogdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7IGlmIChtZW51LmdldFBhcmVudCgpID09IHRoaXMpIHsKKyAgICAgKiBtZW51LnNldFBhcmVudChudWxsKTsgcG9wdXBzLnJlbW92ZShtZW51KTsgfSB9IGZpbmFsbHkgeworICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqLworICAgIC8qKgorICAgICAqIFByaW50cyBhIGxpc3Qgb2YgdGhpcyBjb21wb25lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBsZWFkaW5nCisgICAgICogd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgUHJpbnRTdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIG91dCB0aGUgb3V0cHV0IFByaW50U3RyZWFtIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gaW5kZW50IGhvdyBtYW55IGxlYWRpbmcgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIHByZXBlbmQKKyAgICAgKiBAcGFyYW0gb3V0CisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IFByaW50U3RyZWFtIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gaW5kZW50CisgICAgICogICAgICAgICAgICBob3cgbWFueSBsZWFkaW5nIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBwcmVwZW5kLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGxpc3QoUHJpbnRTdHJlYW0gb3V0LCBpbnQgaW5kZW50KSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMTU3MSw3ICsxMzc0LDggQEAKICAgICAvKioKICAgICAgKiBQcmludHMgYSBsaXN0IG9mIHRoaXMgY29tcG9uZW50IHRvIHRoZSBzcGVjaWZpZWQgUHJpbnRXcml0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIG91dCB0aGUgb3V0cHV0IFByaW50V3JpdGVyIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gb3V0CisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IFByaW50V3JpdGVyIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBsaXN0KFByaW50V3JpdGVyIG91dCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTE1ODMsMTEgKzEzODcsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgYSBsaXN0IG9mIHRoaXMgY29tcG9uZW50IHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgCi0gICAgICogbGVhZGluZyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCBQcmludFdyaXRlci4KKyAgICAgKiBQcmludHMgYSBsaXN0IG9mIHRoaXMgY29tcG9uZW50IHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbGVhZGluZworICAgICAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIFByaW50V3JpdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvdXQgdGhlIG91dHB1dCBQcmludFdyaXRlciBvYmplY3QuCi0gICAgICogQHBhcmFtIGluZGVudCBob3cgbWFueSBsZWFkaW5nIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBwcmVwZW5kCisgICAgICogQHBhcmFtIG91dAorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBQcmludFdyaXRlciBvYmplY3QuCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgaG93IG1hbnkgbGVhZGluZyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gcHJlcGVuZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBsaXN0KFByaW50V3JpdGVyIG91dCwgaW50IGluZGVudCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTE1OTksMTMgKzE0MDUsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgc3RyaW5nIGNvbXBvc2VkIG9mIHRoZSBkZXNpcmVkIG51bWJlciBvZiAKLSAgICAgKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCisgICAgICogR2V0cyBhIHN0cmluZyBjb21wb3NlZCBvZiB0aGUgZGVzaXJlZCBudW1iZXIgb2Ygd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRlbnQgdGhlIGxlbmd0aCBvZiB0aGUgU3RyaW5nIHRvIHJldHVybgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyBjb21wb3NlZCBvZiB0aGUgZGVzaXJlZCBudW1iZXIgb2YgCi0gICAgICogd2hpdGVzcGFjZSBjaGFyYWN0ZXJzCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgU3RyaW5nIHRvIHJldHVybi4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgY29tcG9zZWQgb2YgdGhlIGRlc2lyZWQgbnVtYmVyIG9mIHdoaXRlc3BhY2UKKyAgICAgKiAgICAgICAgIGNoYXJhY3RlcnMuCiAgICAgICovCiAgICAgU3RyaW5nIGdldEluZGVudFN0cihpbnQgaW5kZW50KSB7CiAgICAgICAgIGNoYXJbXSBpbmQgPSBuZXcgY2hhcltpbmRlbnRdOwpAQCAtMTYxNiw5ICsxNDIxLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnRzIGEgbGlzdCBvZiB0aGlzIGNvbXBvbmVudCB0byB0aGUgc3BlY2lmaWVkIFByaW50U3RyZWFtCisgICAgICogUHJpbnRzIGEgbGlzdCBvZiB0aGlzIGNvbXBvbmVudCB0byB0aGUgc3BlY2lmaWVkIFByaW50U3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvdXQgdGhlIG91dHB1dCBQcmludFN0cmVhbSBvYmplY3QuCisgICAgICogQHBhcmFtIG91dAorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBQcmludFN0cmVhbSBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbGlzdChQcmludFN0cmVhbSBvdXQpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0xNjMxLDggKzE0MzcsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50cyBhIGxpc3Qgb2YgdGhpcyBjb21wb25lbnQgdG8gdGhlIHN0YW5kYXJkIHN5c3RlbSAKLSAgICAgKiBvdXRwdXQgc3RyZWFtLgorICAgICAqIFByaW50cyBhIGxpc3Qgb2YgdGhpcyBjb21wb25lbnQgdG8gdGhlIHN0YW5kYXJkIHN5c3RlbSBvdXRwdXQgc3RyZWFtLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGxpc3QoKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMTY0NCw5ICsxNDQ5LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnRzIHRoaXMgY29tcG9uZW50LiAKKyAgICAgKiBQcmludHMgdGhpcyBjb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGcgdGhlIEdyYXBoaWNzIHRvIGJlIHVzZWQgZm9yIHBhaW50aW5nLiAKKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIEdyYXBoaWNzIHRvIGJlIHVzZWQgZm9yIHBhaW50aW5nLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHByaW50KEdyYXBoaWNzIGcpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0xNjYwLDcgKzE0NjYsOCBAQAogICAgIC8qKgogICAgICAqIFByaW50cyB0aGUgY29tcG9uZW50IGFuZCBhbGwgb2YgaXRzIHN1YmNvbXBvbmVudHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGcgdGhlIEdyYXBoaWNzIHRvIGJlIHVzZWQgZm9yIHBhaW50aW5nLgorICAgICAqIEBwYXJhbSBnCisgICAgICogICAgICAgICAgICB0aGUgR3JhcGhpY3MgdG8gYmUgdXNlZCBmb3IgcGFpbnRpbmcuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHJpbnRBbGwoR3JhcGhpY3MgZykgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTE2NzIsMTEgKzE0NzksMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBDb21wb25lbnQgc3BlY2lmaWVkIGJ5IHdpZHRoIGFuZCBoZWlnaHQKLSAgICAgKiBwYXJhbWV0ZXJzLgorICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIENvbXBvbmVudCBzcGVjaWZpZWQgYnkgd2lkdGggYW5kIGhlaWdodCBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIENvbXBvbmVudC4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIENvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgQ29tcG9uZW50LgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIENvbXBvbmVudC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTE2OTAsNyArMTQ5OCw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgQ29tcG9uZW50IHNwZWNpZmllZCBieSBEaW1lbnNpb24gb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBkIHRoZSBuZXcgc2l6ZSBvZiB0aGUgQ29tcG9uZW50LgorICAgICAqIEBwYXJhbSBkCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHNpemUgb2YgdGhlIENvbXBvbmVudC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTaXplKERpbWVuc2lvbiBkKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMTcwNCw5ICsxNTEzLDEwIEBACiAgICAgLyoqCiAgICAgICogRGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgc2V0U2l6ZShpbnQsIGludCkgbWV0aG9kLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGguCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0LgotICAgICAqIAorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQuCiAgICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgc2V0U2l6ZShpbnQsIGludCkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0xNzIzLDggKzE1MzMsOCBAQAogICAgIC8qKgogICAgICAqIERlcHJlY2F0ZWQ6IHJlcGxhY2VkIGJ5IHNldFNpemUoaW50LCBpbnQpIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIHNpemUuCiAgICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgc2V0U2l6ZShpbnQsIGludCkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0xNzQwLDggKzE1NTAsNyBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvbmVudCBpcyBjb21wbGV0ZWx5IG9wYXF1ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgY29tcG9uZW50IGlzIGNvbXBsZXRlbHkgb3BhcXVlLCAKLSAgICAgKiAgZmFsc2UgYnkgZGVmYXVsdC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgY29tcG9uZW50IGlzIGNvbXBsZXRlbHkgb3BhcXVlLCBmYWxzZSBieSBkZWZhdWx0LgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzT3BhcXVlKCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTE3NjUsNyArMTU3NCw3IEBACiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwogICAgICAgICB9Ci0gICAgICAgIC8vPz8/QVdUOiBmaXJlQWNjZXNzaWJsZVN0YXRlQ2hhbmdlKEFjY2Vzc2libGVTdGF0ZS5FTkFCTEVELCBmYWxzZSk7CisgICAgICAgIC8vID8/P0FXVDogZmlyZUFjY2Vzc2libGVTdGF0ZUNoYW5nZShBY2Nlc3NpYmxlU3RhdGUuRU5BQkxFRCwgZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTc4MSwxNSArMTU5MCwxNSBAQAogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKICAgICAgICAgfQotICAgICAgICAvLz8/P0FXVDogZmlyZUFjY2Vzc2libGVTdGF0ZUNoYW5nZShBY2Nlc3NpYmxlU3RhdGUuRU5BQkxFRCwgdHJ1ZSk7CisgICAgICAgIC8vID8/P0FXVDogZmlyZUFjY2Vzc2libGVTdGF0ZUNoYW5nZShBY2Nlc3NpYmxlU3RhdGUuRU5BQkxFRCwgdHJ1ZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogRW5hYmxlcyBvciBkaXNhYmxlIHRoaXMgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBiIHRoZSBib29sZWFuIHBhcmFtZXRlci4KLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBzZXRFbmFibGVkKGJvb2xlYW4pIG1ldGhvZC4gCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBib29sZWFuIHBhcmFtZXRlci4KKyAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBzZXRFbmFibGVkKGJvb2xlYW4pIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIGVuYWJsZShib29sZWFuIGIpIHsKQEAgLTE4MDksOSArMTYxOCw5IEBACiAgICAgICogU3RvcmVzIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGNvbXBvbmVudCB0byB0aGUgc3BlY2lmaWVkIFBvaW50IG9iamVjdDsKICAgICAgKiByZXR1cm5zIHRoZSBwb2ludCBvZiB0aGUgY29tcG9uZW50J3MgdG9wLWxlZnQgY29ybmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBydiB0aGUgUG9pbnQgb2JqZWN0IHdoZXJlIHRoZSBjb21wb25lbnQncyB0b3AtbGVmdCBjb3JuZXIKLSAgICAgKiBwb3NpdGlvbiB3aWxsIGJlIHN0b3JlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcnYKKyAgICAgKiAgICAgICAgICAgIHRoZSBQb2ludCBvYmplY3Qgd2hlcmUgdGhlIGNvbXBvbmVudCdzIHRvcC1sZWZ0IGNvcm5lcgorICAgICAqICAgICAgICAgICAgcG9zaXRpb24gd2lsbCBiZSBzdG9yZWQuCiAgICAgICogQHJldHVybiB0aGUgUG9pbnQgd2hpY2ggc3BlY2lmaWVzIHRoZSBjb21wb25lbnQncyB0b3AtbGVmdCBjb3JuZXIuCiAgICAgICovCiAgICAgcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJ2KSB7CkBAIC0xODI4LDggKzE2MzcsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxvY2F0aW9uIG9mIHRoaXMgY29tcG9uZW50IG9uIHRoZSBmb3JtOwotICAgICAqIHJldHVybnMgdGhlIHBvaW50IG9mIHRoZSBjb21wb25lbnQncyB0b3AtbGVmdCBjb3JuZXIuCisgICAgICogR2V0cyB0aGUgbG9jYXRpb24gb2YgdGhpcyBjb21wb25lbnQgb24gdGhlIGZvcm07IHJldHVybnMgdGhlIHBvaW50IG9mIHRoZQorICAgICAqIGNvbXBvbmVudCdzIHRvcC1sZWZ0IGNvcm5lci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBQb2ludCB3aGljaCBzcGVjaWZpZXMgdGhlIGNvbXBvbmVudCdzIHRvcC1sZWZ0IGNvcm5lci4KICAgICAgKi8KQEAgLTE4NTcsMTIgKzE2NjYsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTdG9yZXMgdGhlIHNpemUgb2YgdGhpcyBDb21wb25lbnQgdG8gdGhlIHNwZWNpZmllZCBEaW1lbnNpb24gCi0gICAgICogb2JqZWN0LgorICAgICAqIFN0b3JlcyB0aGUgc2l6ZSBvZiB0aGlzIENvbXBvbmVudCB0byB0aGUgc3BlY2lmaWVkIERpbWVuc2lvbiBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJ2IHRoZSBEaW1lbnNpb24gb2JqZWN0IHdoZXJlIHRoZSBzaXplIG9mIHRoZSBDb21wb25lbnQgCi0gICAgICogd2lsbCBiZSBzdG9yZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIHJ2CisgICAgICogICAgICAgICAgICB0aGUgRGltZW5zaW9uIG9iamVjdCB3aGVyZSB0aGUgc2l6ZSBvZiB0aGUgQ29tcG9uZW50IHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgIHN0b3JlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBEaW1lbnNpb24gb2YgdGhpcyBDb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIERpbWVuc2lvbiBnZXRTaXplKERpbWVuc2lvbiBydikgewpAQCAtMTg3OSw5ICsxNjg3LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBDb21wb25lbnQgaXMgdmFsaWQuIEEgY29tcG9uZW50IGlzIHZhbGlkIAotICAgICAqIGlmIGl0IGlzIGNvcnJlY3RseSBzaXplZCBhbmQgcG9zaXRpb25lZCB3aXRoaW4gaXRzIHBhcmVudCBjb250YWluZXIKLSAgICAgKiAgYW5kIGFsbCBpdHMgY2hpbGRyZW4gYXJlIGFsc28gdmFsaWQuIAorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIENvbXBvbmVudCBpcyB2YWxpZC4gQSBjb21wb25lbnQgaXMgdmFsaWQgaWYgaXQKKyAgICAgKiBpcyBjb3JyZWN0bHkgc2l6ZWQgYW5kIHBvc2l0aW9uZWQgd2l0aGluIGl0cyBwYXJlbnQgY29udGFpbmVyIGFuZCBhbGwgaXRzCisgICAgICogY2hpbGRyZW4gYXJlIGFsc28gdmFsaWQuCiAgICAgICogCiAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgQ29tcG9uZW50IGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCkBAIC0xODk4LDcgKzE3MDYsNiBAQAogICAgICAqIERlcHJlY2F0ZWQ6IHJlcGxhY2VkIGJ5IGdldENvbXBvbmVudEF0KGludCwgaW50KSBtZXRob2QuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgUG9pbnQuCi0gICAgICogCiAgICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgZ2V0Q29tcG9uZW50QXQoaW50LCBpbnQpIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMTkxMiw3ICsxNzE5LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25uZWN0cyB0aGlzIENvbXBvbmVudCB0byBhIG5hdGl2ZSBzY3JlZW4gcmVzb3VyY2UgYW5kIG1ha2VzIGl0IAorICAgICAqIENvbm5lY3RzIHRoaXMgQ29tcG9uZW50IHRvIGEgbmF0aXZlIHNjcmVlbiByZXNvdXJjZSBhbmQgbWFrZXMgaXQKICAgICAgKiBkaXNwbGF5YWJsZS4gVGhpcyBtZXRob2Qgbm90IGJlIGNhbGxlZCBkaXJlY3RseSBieSB1c2VyIGFwcGxpY2F0aW9ucy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGROb3RpZnkoKSB7CkBAIC0xOTIwLDExICsxNzI3LDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBwcmVwYXJlNEhpZXJhcmNoeUNoYW5nZSgpOwogICAgICAgICAgICAgYmVoYXZpb3VyLmFkZE5vdGlmeSgpOwotICAgICAgICAgICAgLy8/Pz9BV1QKLS8vICAgICAgICAgICAgZmluaXNoSGllcmFyY2h5Q2hhbmdlKHRoaXMsIHBhcmVudCwgMCk7Ci0vLyAgICAgICAgICAgIGlmIChkcm9wVGFyZ2V0ICE9IG51bGwpIHsKLS8vICAgICAgICAgICAgICAgIGRyb3BUYXJnZXQuYWRkTm90aWZ5KHBlZXIpOwotLy8gICAgICAgICAgICB9CisgICAgICAgICAgICAvLyA/Pz9BV1QKKyAgICAgICAgICAgIC8vIGZpbmlzaEhpZXJhcmNoeUNoYW5nZSh0aGlzLCBwYXJlbnQsIDApOworICAgICAgICAgICAgLy8gaWYgKGRyb3BUYXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gZHJvcFRhcmdldC5hZGROb3RpZnkocGVlcik7CisgICAgICAgICAgICAvLyB9CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwogICAgICAgICB9CkBAIC0xOTMzLDQ1ICsxNzQwLDMyIEBACiAgICAgLyoqCiAgICAgICogTWFwIHRvIGRpc3BsYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGIgdGhlIGIKKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGIuCiAgICAgICovCiAgICAgdm9pZCBtYXBUb0Rpc3BsYXkoYm9vbGVhbiBiKSB7Ci0gICAgICAgIC8vPz8/QVdUCisgICAgICAgIC8vID8/P0FXVAogICAgICAgICAvKgotICAgICAgICBpZiAoYiAmJiAhaXNEaXNwbGF5YWJsZSgpKSB7Ci0gICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBXaW5kb3cpIHx8ICgocGFyZW50ICE9IG51bGwpICYmIHBhcmVudC5pc0Rpc3BsYXlhYmxlKCkpKSB7Ci0gICAgICAgICAgICAgICAgYWRkTm90aWZ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIWIgJiYgaXNEaXNwbGF5YWJsZSgpKSB7Ci0gICAgICAgICAgICByZW1vdmVOb3RpZnkoKTsKLSAgICAgICAgfQotICAgICAgICAqLworICAgICAgICAgKiBpZiAoYiAmJiAhaXNEaXNwbGF5YWJsZSgpKSB7IGlmICgodGhpcyBpbnN0YW5jZW9mIFdpbmRvdykgfHwgKChwYXJlbnQKKyAgICAgICAgICogIT0gbnVsbCkgJiYgcGFyZW50LmlzRGlzcGxheWFibGUoKSkpIHsgYWRkTm90aWZ5KCk7IH0gfSBlbHNlIGlmICghYgorICAgICAgICAgKiAmJiBpc0Rpc3BsYXlhYmxlKCkpIHsgcmVtb3ZlTm90aWZ5KCk7IH0KKyAgICAgICAgICovCiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgdG9vbGtpdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFjY2Vzc2libGUgY29udGV4dCBzcGVjaWZpYyBmb3IgcGFydGljdWxhciBjb21wb25lbnQKKyAgICAgKiBAcmV0dXJuIGFjY2Vzc2libGUgY29udGV4dCBzcGVjaWZpYyBmb3IgcGFydGljdWxhciBjb21wb25lbnQuCiAgICAgICovCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIEFjY2Vzc2libGVDb250ZXh0IGNyZWF0ZUFjY2Vzc2libGVDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisgICAgICogQWNjZXNzaWJsZUNvbnRleHQgY3JlYXRlQWNjZXNzaWJsZUNvbnRleHQoKSB7IHJldHVybiBudWxsOyB9IHB1YmxpYworICAgICAqIEFjY2Vzc2libGVDb250ZXh0IGdldEFjY2Vzc2libGVDb250ZXh0KCkgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgaWYKKyAgICAgKiAoYWNjZXNzaWJsZUNvbnRleHQgPT0gbnVsbCkgeyBhY2Nlc3NpYmxlQ29udGV4dCA9CisgICAgICogY3JlYXRlQWNjZXNzaWJsZUNvbnRleHQoKTsgfSByZXR1cm4gYWNjZXNzaWJsZUNvbnRleHQ7IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9CisgICAgICovCiAKLSAgICBwdWJsaWMgQWNjZXNzaWJsZUNvbnRleHQgZ2V0QWNjZXNzaWJsZUNvbnRleHQoKSB7Ci0gICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGFjY2Vzc2libGVDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhY2Nlc3NpYmxlQ29udGV4dCA9IGNyZWF0ZUFjY2Vzc2libGVDb250ZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYWNjZXNzaWJsZUNvbnRleHQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICB9Ci0gICAgfQotICAgICovCi0gCiAgICAgLyoqCiAgICAgICogR2V0cyBUb29sa2l0IGZvciB0aGUgY3VycmVudCBDb21wb25lbnQuCiAgICAgICogCkBAIC0xOTgyLDggKzE3NzYsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhpcyBjb21wb25lbnQncyBsb2NraW5nIG9iamVjdCBmb3IgQVdUIGNvbXBvbmVudCB0cmVlIAotICAgICAqIGFuZCBsYXlvdXQgb3BlcmF0aW9ucy4KKyAgICAgKiBHZXRzIHRoaXMgY29tcG9uZW50J3MgbG9ja2luZyBvYmplY3QgZm9yIEFXVCBjb21wb25lbnQgdHJlZSBhbmQgbGF5b3V0CisgICAgICogb3BlcmF0aW9ucy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSB0cmVlIGxvY2tpbmcgb2JqZWN0LgogICAgICAqLwpAQCAtMTk5MiwxMiArMTc4NiwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBwYXJhbSBldnQgdGhlIEV2ZW50LgotICAgICAqIEBwYXJhbSB3aGF0IHRoZSBldmVudCdzIGtleS4KKyAgICAgKiBIYW5kbGVzIHRoZSBldmVudC4gVXNlIEFjdGlvbkxpc3RlbmVyIGluc3RlYWQgb2YgdGhpcy4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZ0CisgICAgICogICAgICAgICAgICB0aGUgRXZlbnQuCisgICAgICogQHBhcmFtIHdoYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudCdzIGtleS4KICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwuCi0gICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlIEFjdGlvbkxpc3RlbmVyIGNsYXNzIGZvciByZWdpc3RlcmluZyBldmVudCBsaXN0ZW5lci4gICAKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2UgQWN0aW9uTGlzdGVuZXIgY2xhc3MgZm9yIHJlZ2lzdGVyaW5nIGV2ZW50IGxpc3RlbmVyLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gYWN0aW9uKEV2ZW50IGV2dCwgT2JqZWN0IHdoYXQpIHsKQEAgLTIwMDYsMTEgKzE4MDIsMTAgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBjaGFuZ2Ugc3VwcG9ydC4KICAgICAgKi8KICAgICBwcml2YXRlIFByb3BlcnR5Q2hhbmdlU3VwcG9ydCBnZXRQcm9wZXJ0eUNoYW5nZVN1cHBvcnQoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoY29tcG9uZW50TG9jaykgewpAQCAtMjAyMCwzNiArMTgxNSwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q2hhbmdlU3VwcG9ydDsKICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICAvLz8/P0FXVAorCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgZ2V0UHJvcGVydHlDaGFuZ2VTdXBwb3J0KCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGdldFByb3BlcnR5Q2hhbmdlU3VwcG9ydCgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwbHlDb21wb25lbnRPcmllbnRhdGlvbihDb21wb25lbnRPcmllbnRhdGlvbiBvcmllbnRhdGlvbikgewotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldENvbXBvbmVudE9yaWVudGF0aW9uKG9yaWVudGF0aW9uKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KKyAgICAgKiBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgKiBnZXRQcm9wZXJ0eUNoYW5nZVN1cHBvcnQoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsgfSBwdWJsaWMKKyAgICAgKiB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwKKyAgICAgKiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICogZ2V0UHJvcGVydHlDaGFuZ2VTdXBwb3J0KCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsCisgICAgICogbGlzdGVuZXIpOyB9IHB1YmxpYyB2b2lkIGFwcGx5Q29tcG9uZW50T3JpZW50YXRpb24oQ29tcG9uZW50T3JpZW50YXRpb24KKyAgICAgKiBvcmllbnRhdGlvbikgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsKKyAgICAgKiBzZXRDb21wb25lbnRPcmllbnRhdGlvbihvcmllbnRhdGlvbik7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0KKyAgICAgKiB9CisgICAgICovCiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNldCBvZiBmb2N1cyB0cmF2ZXJzYWwga2V5cyBmb3IgdGhlIGdpdmVuIGZvY3VzIAotICAgICAqIHRyYXZlcnNhbCBvcGVyYXRpb24gaGFzIGJlZW4gZXhwbGljaXRseSBkZWZpbmVkIGZvciB0aGlzIENvbXBvbmVudC4gCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXQgb2YgZm9jdXMgdHJhdmVyc2FsIGtleXMgZm9yIHRoZSBnaXZlbiBmb2N1cworICAgICAqIHRyYXZlcnNhbCBvcGVyYXRpb24gaGFzIGJlZW4gZXhwbGljaXRseSBkZWZpbmVkIGZvciB0aGlzIENvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQgdGhlIElEIG9mIHRyYXZlcnNhbCBrZXkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc2V0IG9mIGZvY3VzIHRyYXZlcnNhbCBrZXlzIGZvciB0aGUgZ2l2ZW4gZm9jdXMgCi0gICAgICogdHJhdmVyc2FsIG9wZXJhdGlvbiBoYXMgYmVlbiBleHBsaWNpdGx5IGRlZmluZWQgZm9yIHRoaXMgQ29tcG9uZW50LAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4gCisgICAgICogQHBhcmFtIGlkCisgICAgICogICAgICAgICAgICB0aGUgSUQgb2YgdHJhdmVyc2FsIGtleS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzZXQgb2YgZm9jdXMgdHJhdmVyc2FsIGtleXMgZm9yIHRoZSBnaXZlbiBmb2N1cy4KKyAgICAgKiAgICAgICAgIHRyYXZlcnNhbCBvcGVyYXRpb24gaGFzIGJlZW4gZXhwbGljaXRseSBkZWZpbmVkIGZvciB0aGlzCisgICAgICogICAgICAgICBDb21wb25lbnQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBhcmVGb2N1c1RyYXZlcnNhbEtleXNTZXQoaW50IGlkKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMjA2OSw3ICsxODU3LDYgQEAKICAgICAgKiBHZXRzIHRoZSBib3VuZHMgb2YgdGhlIENvbXBvbmVudC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSByZWN0YW5nbGUgYm91bmRzIG9mIHRoZSBDb21wb25lbnQuCi0gICAgICogCiAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGdldEJvdW5kcygpIG1ldGhvb2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTIwODMsMTYgKzE4NzAsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb25zdHJ1Y3Rpb24gc3RhdHVzIG9mIGEgc3BlY2lmaWVkIGltYWdlCi0gICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoIGFuZCBoZWlnaHQgdGhhdCBpcyBiZWluZyBjcmVhdGVkLgorICAgICAqIFJldHVybnMgdGhlIGNvbnN0cnVjdGlvbiBzdGF0dXMgb2YgYSBzcGVjaWZpZWQgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogd2lkdGggYW5kIGhlaWdodCB0aGF0IGlzIGJlaW5nIGNyZWF0ZWQuCiAgICAgICogCi0gICAgICogCi0gICAgICogQHBhcmFtIGltYWdlIHRoZSBpbWFnZSB0byBiZSBjaGVja2VkLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2Ygc2NhbGVkIGltYWdlIHdoaWNoIHN0YXR1cyBpcyBiZWluZyBjaGVja2VkLCBvciAtMS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2Ygc2NhbGVkIGltYWdlIHdoaWNoIHN0YXR1cyBpcyBiZWluZyBjaGVja2VkLCBvciAtMS4KLSAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHRvIGJlIG5vdGlmaWVkIHdoaWxlIAotICAgICAqIHRoZSBpbWFnZSBpcyBiZWluZyBwcmVwYXJlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byBiZSBjaGVja2VkLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHNjYWxlZCBpbWFnZSB3aGljaCBzdGF0dXMgaXMgYmVpbmcgY2hlY2tlZCwgb3IKKyAgICAgKiAgICAgICAgICAgIC0xLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2Ygc2NhbGVkIGltYWdlIHdoaWNoIHN0YXR1cyBpcyBiZWluZyBjaGVja2VkLCBvcgorICAgICAqICAgICAgICAgICAgLTEuCisgICAgICogQHBhcmFtIG9ic2VydmVyCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VPYnNlcnZlciBvYmplY3QgdG8gYmUgbm90aWZpZWQgd2hpbGUgdGhlIGltYWdlIGlzCisgICAgICogICAgICAgICAgICBiZWluZyBwcmVwYXJlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZU9ic2VydmVyIGZsYWdzIG9mIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBpbWFnZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY2hlY2tJbWFnZShJbWFnZSBpbWFnZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBJbWFnZU9ic2VydmVyIG9ic2VydmVyKSB7CkBAIC0yMTA1LDEzICsxODk2LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29uc3RydWN0aW9uIHN0YXR1cyBvZiBhIHNwZWNpZmllZCBpbWFnZSB0aGF0IGlzIGJlaW5nIGNyZWF0ZWQuCisgICAgICogUmV0dXJucyB0aGUgY29uc3RydWN0aW9uIHN0YXR1cyBvZiBhIHNwZWNpZmllZCBpbWFnZSB0aGF0IGlzIGJlaW5nCisgICAgICogY3JlYXRlZC4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2UgdGhlIGltYWdlIHRvIGJlIGNoZWNrZWQuCi0gICAgICogQHBhcmFtIG9ic2VydmVyIHRoZSBJbWFnZU9ic2VydmVyIG9iamVjdCB0byBiZSBub3RpZmllZCB3aGlsZSAKLSAgICAgKiB0aGUgaW1hZ2UgaXMgYmVpbmcgcHJlcGFyZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIGltYWdlCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZU9ic2VydmVyIG9iamVjdCB0byBiZSBub3RpZmllZCB3aGlsZSB0aGUgaW1hZ2UgaXMKKyAgICAgKiAgICAgICAgICAgIGJlaW5nIHByZXBhcmVkLgogICAgICAqIEByZXR1cm4gdGhlIEltYWdlT2JzZXJ2ZXIgZmxhZ3Mgb2YgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGltYWdlIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIGludCBjaGVja0ltYWdlKEltYWdlIGltYWdlLCBJbWFnZU9ic2VydmVyIG9ic2VydmVyKSB7CkBAIC0yMTI2LDEwICsxOTE4LDExIEBACiAgICAgLyoqCiAgICAgICogQ29hbGVzY2VzIHRoZSBleGlzdGVkIGV2ZW50IHdpdGggbmV3IGV2ZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBleGlzdGluZ0V2ZW50IHRoZSBleGlzdGluZyBldmVudCBpbiB0aGUgRXZlbnRRdWV1ZS4KLSAgICAgKiBAcGFyYW0gbmV3RXZlbnQgdGhlIG5ldyBldmVudCB0byBiZSBwb3N0ZWQgdG8gdGhlIEV2ZW50UXVldWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29hbGVzY2VkIEFXVEV2ZW50LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGNvYWxlc2NpbmcgZG9uZS4gCisgICAgICogQHBhcmFtIGV4aXN0aW5nRXZlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBleGlzdGluZyBldmVudCBpbiB0aGUgRXZlbnRRdWV1ZS4KKyAgICAgKiBAcGFyYW0gbmV3RXZlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgZXZlbnQgdG8gYmUgcG9zdGVkIHRvIHRoZSBFdmVudFF1ZXVlLgorICAgICAqIEByZXR1cm4gdGhlIGNvYWxlc2NlZCBBV1RFdmVudCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBjb2FsZXNjaW5nIGRvbmUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEFXVEV2ZW50IGNvYWxlc2NlRXZlbnRzKEFXVEV2ZW50IGV4aXN0aW5nRXZlbnQsIEFXVEV2ZW50IG5ld0V2ZW50KSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMjE0Nyw3ICsxOTQwLDcgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhpcyBDb21wb25lbnQgaXMgYSBjb2FsZXNjZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBpcyBjb2FsZXNjZXIKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGNvYWxlc2Nlci4KICAgICAgKi8KICAgICBib29sZWFuIGlzQ29hbGVzY2VyKCkgewogICAgICAgICByZXR1cm4gY29hbGVzY2VyOwpAQCAtMjE1Niw5ICsxOTQ5LDkgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSByZWxhdGl2ZSBldmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGlkCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVsYXRpdmUgZXZlbnQKKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpZC4KKyAgICAgKiBAcmV0dXJuIHRoZSByZWxhdGl2ZSBldmVudC4KICAgICAgKi8KICAgICBBV1RFdmVudCBnZXRSZWxhdGl2ZUV2ZW50KGludCBpZCkgewogICAgICAgICBJbnRlZ2VyIGlkV3JhcHBlciA9IG5ldyBJbnRlZ2VyKGlkKTsKQEAgLTIxNzcsNyArMTk3MCw4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgbmV3IGV2ZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQKKyAgICAgKiBAcGFyYW0gZXZlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudC4KICAgICAgKi8KICAgICB2b2lkIGFkZE5ld0V2ZW50KEFXVEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGV2ZW50c0xpc3QuYWRkTGFzdChldmVudCk7CkBAIC0yMTkzLDcgKzE5ODcsOCBAQAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIG5leHQgZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGlkIHRoZSBpZAorICAgICAqIEBwYXJhbSBpZAorICAgICAqICAgICAgICAgICAgdGhlIGlkLgogICAgICAqLwogICAgIHZvaWQgcmVtb3ZlTmV4dEV2ZW50KGludCBpZCkgewogICAgICAgICBldmVudHNUYWJsZS5nZXQobmV3IEludGVnZXIoaWQpKS5yZW1vdmVGaXJzdCgpOwpAQCAtMjIwMiw4ICsxOTk3LDggQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIHRoZSBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgSW1hZ2VQcm9kdWNlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvZHVjZXIgdGhlIEltYWdlUHJvZHVjZXIgdG8gYmUgdXNlZCBmb3IgaW1hZ2UgY3JlYXRpb24uCi0gICAgICogCisgICAgICogQHBhcmFtIHByb2R1Y2VyCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VQcm9kdWNlciB0byBiZSB1c2VkIGZvciBpbWFnZSBjcmVhdGlvbi4KICAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgSW1hZ2VQcm9kdWNlci4KICAgICAgKi8KICAgICBwdWJsaWMgSW1hZ2UgY3JlYXRlSW1hZ2UoSW1hZ2VQcm9kdWNlciBwcm9kdWNlcikgewpAQCAtMjIxOCwxMSArMjAxMywxMyBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYW4gb2ZmLXNjcmVlbiBkcmF3YWJsZSBpbWFnZSB0byBiZSB1c2VkIGZvciBkb3VibGUgYnVmZmVyaW5nLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGltYWdlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgb2ZmLXNjcmVlbiBkcmF3YWJsZSBpbWFnZSBvciBudWxsIGlmIHRoZSBjb21wb25lbnQgaXMgbm90IAotICAgICAqIGRpc3BsYXlhYmxlIG9yIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpIG1ldGhvZCByZXR1cm5zIHRydWUuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGltYWdlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlLgorICAgICAqIEByZXR1cm4gdGhlIG9mZi1zY3JlZW4gZHJhd2FibGUgaW1hZ2Ugb3IgbnVsbCBpZiB0aGUgY29tcG9uZW50IGlzIG5vdAorICAgICAqICAgICAgICAgZGlzcGxheWFibGUgb3IgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkgbWV0aG9kIHJldHVybnMKKyAgICAgKiAgICAgICAgIHRydWUuCiAgICAgICovCiAgICAgcHVibGljIEltYWdlIGNyZWF0ZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTIyNDUsMTcgKzIwNDIsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIG9mZi1zY3JlZW4gZHJhd2FibGUgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoLAotICAgICAqIGhlaWdodCBhbmQgSW1hZ2VDYXBhYmlsaXRpZXMuCisgICAgICogQ3JlYXRlcyBhbiBvZmYtc2NyZWVuIGRyYXdhYmxlIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCB3aWR0aCwgaGVpZ2h0IGFuZAorICAgICAqIEltYWdlQ2FwYWJpbGl0aWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGgKLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQKLSAgICAgKiBAcGFyYW0gY2FwcyB0aGUgSW1hZ2VDYXBhYmlsaXRpZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdm9sYXRpbGUgaW1hZ2UKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFXVEV4Y2VwdGlvbiBpZiBhbiBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgY2FwYWJpbGl0aWVzIAotICAgICAqIGNhbm5vdCBiZSBjcmVhdGVkLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQuCisgICAgICogQHBhcmFtIGNhcHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZUNhcGFiaWxpdGllcy4KKyAgICAgKiBAcmV0dXJuIHRoZSB2b2xhdGlsZSBpbWFnZS4KKyAgICAgKiBAdGhyb3dzIEFXVEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBjYXBhYmlsaXRpZXMgY2Fubm90IGJlCisgICAgICogICAgICAgICAgICAgY3JlYXRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgVm9sYXRpbGVJbWFnZSBjcmVhdGVWb2xhdGlsZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgSW1hZ2VDYXBhYmlsaXRpZXMgY2FwcykKICAgICAgICAgICAgIHRocm93cyBBV1RFeGNlcHRpb24gewpAQCAtMjI3NywxNiArMjA3NiwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB2b2xhdGlsZSBvZmYtc2NyZWVuIGRyYXdhYmxlIGltYWdlIHdoaWNoIGlzIHVzZWQgCi0gICAgICogZm9yIGRvdWJsZSBidWZmZXJpbmcuCisgICAgICogQ3JlYXRlcyBhIHZvbGF0aWxlIG9mZi1zY3JlZW4gZHJhd2FibGUgaW1hZ2Ugd2hpY2ggaXMgdXNlZCBmb3IgZG91YmxlCisgICAgICogYnVmZmVyaW5nLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgaW1hZ2UuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIGltYWdlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZvbGF0aWxlIGltYWdlIGEgdm9sYXRpbGUgb2ZmLXNjcmVlbiBkcmF3YWJsZSBpbWFnZSAKLSAgICAgKiB3aGljaCBpcyB1c2VkIGZvciBkb3VibGUgYnVmZmVyaW5nIG9yIG51bGwgaWYgdGhlIGNvbXBvbmVudCAKLSAgICAgKiBpcyBub3QgZGlzcGxheWFibGUsIG9yIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpIG1ldGhvZAotICAgICAqIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIGltYWdlLgorICAgICAqIEByZXR1cm4gdGhlIHZvbGF0aWxlIGltYWdlIGEgdm9sYXRpbGUgb2ZmLXNjcmVlbiBkcmF3YWJsZSBpbWFnZSB3aGljaCBpcworICAgICAqICAgICAgICAgdXNlZCBmb3IgZG91YmxlIGJ1ZmZlcmluZyBvciBudWxsIGlmIHRoZSBjb21wb25lbnQgaXMgbm90CisgICAgICogICAgICAgICBkaXNwbGF5YWJsZSwgb3IgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkgbWV0aG9kIHJldHVybnMKKyAgICAgKiAgICAgICAgIHRydWUuCiAgICAgICovCiAgICAgcHVibGljIFZvbGF0aWxlSW1hZ2UgY3JlYXRlVm9sYXRpbGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0yMzExLDkgKzIxMTEsMTIgQEAKICAgICAgKiB3aXRoIHRoZSBjb21wb25lbnQncyBiYWNrZ3JvdW5kIGNvbG9yIHRvIHByZXBhcmUgaXQgZm9yIGRvdWJsZS1idWZmZXJlZAogICAgICAqIHBhaW50aW5nLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgaW1hZ2UKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0CisgICAgICogQHBhcmFtIGltYWdlCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGguCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgZmlsbEltYWdlQmFja2dyb3VuZChJbWFnZSBpbWFnZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgICAgICAgIEdyYXBoaWNzIGdyID0gaW1hZ2UuZ2V0R3JhcGhpY3MoKTsKQEAgLTIzMjUsOCArMjEyOCw4IEBACiAgICAgLyoqCiAgICAgICogRGVsaXZlcnMgZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2dCB0aGUgZXZlbnQuCi0gICAgICogCisgICAgICogQHBhcmFtIGV2dAorICAgICAqICAgICAgICAgICAgdGhlIGV2ZW50LgogICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGRpc3BhdGNoRXZlbnQoQVdURXZlbnQgZSkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0yMzM1LDcgKzIxMzgsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb21wdHMgdGhlIGxheW91dCBtYW5hZ2VyIHRvIGxheSBvdXQgdGhpcyBjb21wb25lbnQuIAorICAgICAqIFByb21wdHMgdGhlIGxheW91dCBtYW5hZ2VyIHRvIGxheSBvdXQgdGhpcyBjb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZG9MYXlvdXQoKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMjM1MCw5ICsyMTUzLDEyIEBACiAgICAgLyoqCiAgICAgICogRmlyZSBwcm9wZXJ0eSBjaGFuZ2UgaW1wbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lCi0gICAgICogQHBhcmFtIG9sZFZhbHVlIHRoZSBvbGQgdmFsdWUKLSAgICAgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyB2YWx1ZQorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEBwYXJhbSBvbGRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG9sZCB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gbmV3VmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZUltcGwoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKICAgICAgICAgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IHBjczsKQEAgLTIzNjgsMzIgKzIxNzQsNDAgQEAKICAgICAvKioKICAgICAgKiBSZXBvcnRzIGEgYm91bmQgcHJvcGVydHkgY2hhbmdlcyBmb3IgaW50IHByb3BlcnRpZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIG9sZCBwcm9wZXJ0eSdzIHZhbHVlLgotICAgICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHByb3BlcnR5J3MgdmFsdWUuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUuCisgICAgICogQHBhcmFtIG9sZFZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgb2xkIHByb3BlcnR5J3MgdmFsdWUuCisgICAgICogQHBhcmFtIG5ld1ZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHByb3BlcnR5J3MgdmFsdWUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7CiAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZUltcGwocHJvcGVydHlOYW1lLCBuZXcgSW50ZWdlcihvbGRWYWx1ZSksIG5ldyBJbnRlZ2VyKG5ld1ZhbHVlKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVwb3J0IGEgYm91bmQgcHJvcGVydHkgY2hhbmdlIGZvciBhIGJvb2xlYW4tdmFsdWVkIHByb3BlcnR5LiAKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIHByb3BlcnR5J3Mgb2xkIHZhbHVlLgotICAgICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgcHJvcGVydHkncyBuZXcgdmFsdWUuCisgICAgICogUmVwb3J0IGEgYm91bmQgcHJvcGVydHkgY2hhbmdlIGZvciBhIGJvb2xlYW4tdmFsdWVkIHByb3BlcnR5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEBwYXJhbSBvbGRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5J3Mgb2xkIHZhbHVlLgorICAgICAqIEBwYXJhbSBuZXdWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5J3MgbmV3IHZhbHVlLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0gICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZUltcGwocHJvcGVydHlOYW1lLCBCb29sZWFuLnZhbHVlT2Yob2xkVmFsdWUpLCBCb29sZWFuCi0gICAgICAgICAgICAgICAgLnZhbHVlT2YobmV3VmFsdWUpKTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlSW1wbChwcm9wZXJ0eU5hbWUsIEJvb2xlYW4udmFsdWVPZihvbGRWYWx1ZSksIEJvb2xlYW4udmFsdWVPZihuZXdWYWx1ZSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcG9ydHMgYSBib3VuZCBwcm9wZXJ0eSBjaGFuZ2UgZm9yIGFuIE9iamVjdC12YWx1ZWQgcHJvcGVydHkuIAorICAgICAqIFJlcG9ydHMgYSBib3VuZCBwcm9wZXJ0eSBjaGFuZ2UgZm9yIGFuIE9iamVjdC12YWx1ZWQgcHJvcGVydHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIHByb3BlcnR5J3Mgb2xkIHZhbHVlCi0gICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBwcm9wZXJ0eSdzIG5ldyB2YWx1ZQorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEBwYXJhbSBvbGRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5J3Mgb2xkIHZhbHVlLgorICAgICAqIEBwYXJhbSBuZXdWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5J3MgbmV3IHZhbHVlLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBPYmplY3Qgb2xkVmFsdWUsCiAgICAgICAgICAgICBmaW5hbCBPYmplY3QgbmV3VmFsdWUpIHsKQEAgLTI0MDEsNzUgKzIyMTUsOTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXBvcnQgYSBib3VuZCBwcm9wZXJ0eSBjaGFuZ2UgZm9yIGEgYnl0ZS12YWx1ZWQgcHJvcGVydHkuIAorICAgICAqIFJlcG9ydCBhIGJvdW5kIHByb3BlcnR5IGNoYW5nZSBmb3IgYSBieXRlLXZhbHVlZCBwcm9wZXJ0eS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgcHJvcGVydHkncyBvbGQgdmFsdWUuCi0gICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBwcm9wZXJ0eSdzIG5ldyB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lCisgICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZS4KKyAgICAgKiBAcGFyYW0gb2xkVmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSdzIG9sZCB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gbmV3VmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSdzIG5ldyB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgYnl0ZSBvbGRWYWx1ZSwgYnl0ZSBuZXdWYWx1ZSkgewogICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2VJbXBsKHByb3BlcnR5TmFtZSwgbmV3IEJ5dGUob2xkVmFsdWUpLCBuZXcgQnl0ZShuZXdWYWx1ZSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcG9ydCBhIGJvdW5kIHByb3BlcnR5IGNoYW5nZSBmb3IgYSBjaGFyLXZhbHVlZCBwcm9wZXJ0eS4gCisgICAgICogUmVwb3J0IGEgYm91bmQgcHJvcGVydHkgY2hhbmdlIGZvciBhIGNoYXItdmFsdWVkIHByb3BlcnR5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICogQHBhcmFtIG9sZFZhbHVlIHRoZSBvbGQgcHJvcGVydHkncyB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyBwcm9wZXJ0eSdzIHZhbHVlLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEBwYXJhbSBvbGRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG9sZCBwcm9wZXJ0eSdzIHZhbHVlLgorICAgICAqIEBwYXJhbSBuZXdWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBwcm9wZXJ0eSdzIHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBjaGFyIG9sZFZhbHVlLCBjaGFyIG5ld1ZhbHVlKSB7CiAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZUltcGwocHJvcGVydHlOYW1lLCBuZXcgQ2hhcmFjdGVyKG9sZFZhbHVlKSwgbmV3IENoYXJhY3RlcihuZXdWYWx1ZSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcG9ydCBhIGJvdW5kIHByb3BlcnR5IGNoYW5nZSBmb3IgYSBzaG9ydC12YWx1ZWQgcHJvcGVydHkuIAorICAgICAqIFJlcG9ydCBhIGJvdW5kIHByb3BlcnR5IGNoYW5nZSBmb3IgYSBzaG9ydC12YWx1ZWQgcHJvcGVydHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIG9sZCBwcm9wZXJ0eSdzIHZhbHVlLgotICAgICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHByb3BlcnR5J3MgdmFsdWUuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUuCisgICAgICogQHBhcmFtIG9sZFZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgb2xkIHByb3BlcnR5J3MgdmFsdWUuCisgICAgICogQHBhcmFtIG5ld1ZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHByb3BlcnR5J3MgdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIHNob3J0IG9sZFZhbHVlLCBzaG9ydCBuZXdWYWx1ZSkgewogICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2VJbXBsKHByb3BlcnR5TmFtZSwgbmV3IFNob3J0KG9sZFZhbHVlKSwgbmV3IFNob3J0KG5ld1ZhbHVlKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVwb3J0IGEgYm91bmQgcHJvcGVydHkgY2hhbmdlIGZvciBhIGxvbmctdmFsdWVkIHByb3BlcnR5LiAKKyAgICAgKiBSZXBvcnQgYSBib3VuZCBwcm9wZXJ0eSBjaGFuZ2UgZm9yIGEgbG9uZy12YWx1ZWQgcHJvcGVydHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIG9sZCBwcm9wZXJ0eSdzIHZhbHVlLgotICAgICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHByb3BlcnR5J3MgdmFsdWUuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUuCisgICAgICogQHBhcmFtIG9sZFZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgb2xkIHByb3BlcnR5J3MgdmFsdWUuCisgICAgICogQHBhcmFtIG5ld1ZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHByb3BlcnR5J3MgdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGxvbmcgb2xkVmFsdWUsIGxvbmcgbmV3VmFsdWUpIHsKICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlSW1wbChwcm9wZXJ0eU5hbWUsIG5ldyBMb25nKG9sZFZhbHVlKSwgbmV3IExvbmcobmV3VmFsdWUpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXBvcnQgYSBib3VuZCBwcm9wZXJ0eSBjaGFuZ2UgZm9yIGEgZmxvYXQtdmFsdWVkIHByb3BlcnR5LiAKKyAgICAgKiBSZXBvcnQgYSBib3VuZCBwcm9wZXJ0eSBjaGFuZ2UgZm9yIGEgZmxvYXQtdmFsdWVkIHByb3BlcnR5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICogQHBhcmFtIG9sZFZhbHVlIHRoZSBvbGQgcHJvcGVydHkncyB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyBwcm9wZXJ0eSdzIHZhbHVlLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEBwYXJhbSBvbGRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG9sZCBwcm9wZXJ0eSdzIHZhbHVlLgorICAgICAqIEBwYXJhbSBuZXdWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBwcm9wZXJ0eSdzIHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBmbG9hdCBvbGRWYWx1ZSwgZmxvYXQgbmV3VmFsdWUpIHsKICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlSW1wbChwcm9wZXJ0eU5hbWUsIG5ldyBGbG9hdChvbGRWYWx1ZSksIG5ldyBGbG9hdChuZXdWYWx1ZSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcG9ydCBhIGJvdW5kIHByb3BlcnR5IGNoYW5nZSBmb3IgYSBkb3VibGUtdmFsdWVkIHByb3BlcnR5LiAKKyAgICAgKiBSZXBvcnQgYSBib3VuZCBwcm9wZXJ0eSBjaGFuZ2UgZm9yIGEgZG91YmxlLXZhbHVlZCBwcm9wZXJ0eS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgb2xkIHByb3BlcnR5J3MgdmFsdWUuCi0gICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgcHJvcGVydHkncyB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lCisgICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZS4KKyAgICAgKiBAcGFyYW0gb2xkVmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvbGQgcHJvcGVydHkncyB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gbmV3VmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgcHJvcGVydHkncyB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgZG91YmxlIG9sZFZhbHVlLCBkb3VibGUgbmV3VmFsdWUpIHsKICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlSW1wbChwcm9wZXJ0eU5hbWUsIG5ldyBEb3VibGUob2xkVmFsdWUpLCBuZXcgRG91YmxlKG5ld1ZhbHVlKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgYWxpZ25tZW50IGFsb25nIHRoZSB4IGF4aXMuIAorICAgICAqIEdldHMgdGhlIGFsaWdubWVudCBhbG9uZyB0aGUgeCBheGlzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFsaWdubWVudCBhbG9uZyB0aGUgeCBheGlzLiAKKyAgICAgKiBAcmV0dXJuIHRoZSBhbGlnbm1lbnQgYWxvbmcgdGhlIHggYXhpcy4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0QWxpZ25tZW50WCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0yNDgxLDcgKzIzMTMsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGFsaWdubWVudCBhbG9uZyB0aGUgeSBheGlzLiAKKyAgICAgKiBHZXRzIHRoZSBhbGlnbm1lbnQgYWxvbmcgdGhlIHkgYXhpcy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBhbGlnbm1lbnQgYWxvbmcgeSBheGlzLgogICAgICAqLwpAQCAtMjUwMiwxMiArMjMzNCwxMSBAQAogICAgIHB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vPz8/QVdUCisgICAgICAgICAgICAvLyA/Pz9BV1QKICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBpZiAoKGJhY2tDb2xvciA9PSBudWxsKSAmJiAocGFyZW50ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRCYWNrZ3JvdW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqLworICAgICAgICAgICAgICogaWYgKChiYWNrQ29sb3IgPT0gbnVsbCkgJiYgKHBhcmVudCAhPSBudWxsKSkgeyByZXR1cm4KKyAgICAgICAgICAgICAqIHBhcmVudC5nZXRCYWNrZ3JvdW5kKCk7IH0KKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgcmV0dXJuIGJhY2tDb2xvcjsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7CkBAIC0yNTI5LDExICsyMzYwLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBkYXRhIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgdG8gdGhlIHNwZWNpZmllZCAKLSAgICAgKiBSZWN0YW5nbGUgb2JqZWN0LgorICAgICAqIFdyaXRlcyB0aGUgZGF0YSBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIHRvIHRoZSBzcGVjaWZpZWQgUmVjdGFuZ2xlCisgICAgICogb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBydiB0aGUgUmVjdGFuZ2xlIG9iamVjdCB3aGVyZSB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlJ3MgZGF0YSBpcyBzdG9yZWQuICAKLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcnYKKyAgICAgKiAgICAgICAgICAgIHRoZSBSZWN0YW5nbGUgb2JqZWN0IHdoZXJlIHRoZSBib3VuZGluZyByZWN0YW5nbGUncyBkYXRhIGlzCisgICAgICogICAgICAgICAgICBzdG9yZWQuCiAgICAgICogQHJldHVybiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKFJlY3RhbmdsZSBydikgewpAQCAtMjU2Niw4ICsyMzk4LDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBDb21wb25lbnQgd2hpY2ggY29udGFpbnMgdGhlIHNwZWNpZmllZCBQb2ludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgUG9pbnQuCi0gICAgICogCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBQb2ludC4KICAgICAgKiBAcmV0dXJuIHRoZSBDb21wb25lbnQgd2hpY2ggY29udGFpbnMgdGhlIHNwZWNpZmllZCBQb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgQ29tcG9uZW50IGdldENvbXBvbmVudEF0KFBvaW50IHApIHsKQEAgLTI1ODAsMTQgKzI0MTIsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBDb21wb25lbnQgd2hpY2ggY29udGFpbnMgdGhlIHBvaW50IHdpdGggdGhlCi0gICAgICogc3BlY2lmaWVkIGNvb3JkaW5hdGVzLgorICAgICAqIEdldHMgdGhlIENvbXBvbmVudCB3aGljaCBjb250YWlucyB0aGUgcG9pbnQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogY29vcmRpbmF0ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgQ29tcG9uZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBwb2ludCB3aXRoIHRoZQotICAgICAqIHNwZWNpZmllZCBjb29yZGluYXRlcy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LgorICAgICAqIEByZXR1cm4gdGhlIENvbXBvbmVudCB3aGljaCBjb250YWlucyB0aGUgcG9pbnQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBjb29yZGluYXRlcy4KICAgICAgKi8KICAgICBwdWJsaWMgQ29tcG9uZW50IGdldENvbXBvbmVudEF0KGludCB4LCBpbnQgeSkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTI2MjIsMTEgKzI0NTUsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJldHVybiBjdXJzb3I7Ci0gICAgICAgICAgICAvLz8/P0FXVAotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50LmdldEN1cnNvcigpOwotICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAvLyA/Pz9BV1QKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIH0gZWxzZSBpZiAocGFyZW50ICE9IG51bGwpIHsgcmV0dXJuIHBhcmVudC5nZXRDdXJzb3IoKTsKKyAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBDdXJzb3IuZ2V0RGVmYXVsdEN1cnNvcigpOwogICAgICAgICB9IGZpbmFsbHkgewpAQCAtMjYzNCw1NyArMjQ2NiwyOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHB1YmxpYyBEcm9wVGFyZ2V0IGdldERyb3BUYXJnZXQoKSB7Ci0gICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGRyb3BUYXJnZXQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDb250YWluZXIgZ2V0Rm9jdXNDeWNsZVJvb3RBbmNlc3RvcigpIHsKLSAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRhaW5lciBjID0gcGFyZW50OyBjICE9IG51bGw7IGMgPSBjLmdldFBhcmVudCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGMuaXNGb2N1c0N5Y2xlUm9vdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgU2V0PEFXVEtleVN0cm9rZT4gZ2V0Rm9jdXNUcmF2ZXJzYWxLZXlzKGludCBpZCkgewotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEludGVnZXIga0lkID0gbmV3IEludGVnZXIoaWQpOwotICAgICAgICAgICAgS2V5Ym9hcmRGb2N1c01hbmFnZXIuY2hlY2tUcmF2ZXJzYWxLZXlzSUQodHJhdmVyc2FsS2V5cywga0lkKTsKLSAgICAgICAgICAgIFNldDw/IGV4dGVuZHMgQVdUS2V5U3Ryb2tlPiBrZXlzID0gdHJhdmVyc2FsS2V5cy5nZXQoa0lkKTsKLSAgICAgICAgICAgIGlmIChrZXlzID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBrZXlzID0gcGFyZW50LmdldEZvY3VzVHJhdmVyc2FsS2V5cyhpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoa2V5cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAga2V5cyA9IEtleWJvYXJkRm9jdXNNYW5hZ2VyLmdldEN1cnJlbnRLZXlib2FyZEZvY3VzTWFuYWdlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdEZvY3VzVHJhdmVyc2FsS2V5cyhpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKFNldDxBV1RLZXlTdHJva2U+KSBrZXlzOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAqLwotICAgIAorICAgICAqIHB1YmxpYyBEcm9wVGFyZ2V0IGdldERyb3BUYXJnZXQoKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4KKyAgICAgKiBkcm9wVGFyZ2V0OyB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0gcHVibGljIENvbnRhaW5lcgorICAgICAqIGdldEZvY3VzQ3ljbGVSb290QW5jZXN0b3IoKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyBmb3IgKENvbnRhaW5lciBjID0KKyAgICAgKiBwYXJlbnQ7IGMgIT0gbnVsbDsgYyA9IGMuZ2V0UGFyZW50KCkpIHsgaWYgKGMuaXNGb2N1c0N5Y2xlUm9vdCgpKSB7CisgICAgICogcmV0dXJuIGM7IH0gfSByZXR1cm4gbnVsbDsgfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9CisgICAgICogQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIHB1YmxpYyBTZXQ8QVdUS2V5U3Ryb2tlPgorICAgICAqIGdldEZvY3VzVHJhdmVyc2FsS2V5cyhpbnQgaWQpIHsgdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7IEludGVnZXIga0lkID0KKyAgICAgKiBuZXcgSW50ZWdlcihpZCk7IEtleWJvYXJkRm9jdXNNYW5hZ2VyLmNoZWNrVHJhdmVyc2FsS2V5c0lEKHRyYXZlcnNhbEtleXMsCisgICAgICoga0lkKTsgU2V0PD8gZXh0ZW5kcyBBV1RLZXlTdHJva2U+IGtleXMgPSB0cmF2ZXJzYWxLZXlzLmdldChrSWQpOyBpZiAoa2V5cworICAgICAqID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsga2V5cyA9IHBhcmVudC5nZXRGb2N1c1RyYXZlcnNhbEtleXMoaWQpOyB9CisgICAgICogaWYgKGtleXMgPT0gbnVsbCkgeyBrZXlzID0KKyAgICAgKiBLZXlib2FyZEZvY3VzTWFuYWdlci5nZXRDdXJyZW50S2V5Ym9hcmRGb2N1c01hbmFnZXIoKQorICAgICAqIC5nZXREZWZhdWx0Rm9jdXNUcmF2ZXJzYWxLZXlzKGlkKTsgfSByZXR1cm4gKFNldDxBV1RLZXlTdHJva2U+KSBrZXlzOyB9CisgICAgICogZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqLworCiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoZSB0aGUgZm9jdXMgdHJhdmVyc2FsIGtleXMgYXJlIGVuYWJsZWQgZm9yIHRoaXMgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHRoZSBmb2N1cyB0cmF2ZXJzYWwga2V5cyBhcmUgZW5hYmxlZCBmb3IgCi0gICAgICogdGhpcyBjb21wb25lbnQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSB0aGUgZm9jdXMgdHJhdmVyc2FsIGtleXMgYXJlIGVuYWJsZWQgZm9yIHRoaXMKKyAgICAgKiAgICAgICAgIGNvbXBvbmVudCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldEZvY3VzVHJhdmVyc2FsS2V5c0VuYWJsZWQoKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMjY5OCw4ICsyNTAyLDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBmb250IG1ldHJpY3Mgb2YgdGhlIHNwZWNpZmllZCBGb250LgogICAgICAqIAotICAgICAqIEBwYXJhbSBmIHRoZSBGb250LgotICAgICAqIAorICAgICAqIEBwYXJhbSBmCisgICAgICogICAgICAgICAgICB0aGUgRm9udC4KICAgICAgKiBAcmV0dXJuIHRoZSBGb250TWV0cmljcyBvZiB0aGUgc3BlY2lmaWVkIEZvbnQuCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKQEAgLTI3MTUsMTIgKzI1MTksMTEgQEAKICAgICBwdWJsaWMgQ29sb3IgZ2V0Rm9yZWdyb3VuZCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLz8/P0FXVAorICAgICAgICAgICAgLy8gPz8/QVdUCiAgICAgICAgICAgICAvKgotICAgICAgICAgICAgaWYgKGZvcmVDb2xvciA9PSBudWxsICYmIHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRGb3JlZ3JvdW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqLworICAgICAgICAgICAgICogaWYgKGZvcmVDb2xvciA9PSBudWxsICYmIHBhcmVudCAhPSBudWxsKSB7IHJldHVybgorICAgICAgICAgICAgICogcGFyZW50LmdldEZvcmVncm91bmQoKTsgfQorICAgICAgICAgICAgICovCiAgICAgICAgICAgICByZXR1cm4gZm9yZUNvbG9yOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKQEAgLTI3MjgsMTEgKzI1MzEsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBHcmFwaGljcyBvZiB0aGUgQ29tcG9uZW50IG9yIG51bGwgaWYgdGhpcyBDb21wb25lbnQKLSAgICAgKiBpcyBub3QgZGlzcGxheWFibGUuCisgICAgICogR2V0cyB0aGUgR3JhcGhpY3Mgb2YgdGhlIENvbXBvbmVudCBvciBudWxsIGlmIHRoaXMgQ29tcG9uZW50IGlzIG5vdAorICAgICAqIGRpc3BsYXlhYmxlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEdyYXBoaWNzIG9mIHRoZSBDb21wb25lbnQgb3IgbnVsbCBpZiB0aGlzIENvbXBvbmVudAotICAgICAqIGlzIG5vdCBkaXNwbGF5YWJsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBHcmFwaGljcyBvZiB0aGUgQ29tcG9uZW50IG9yIG51bGwgaWYgdGhpcyBDb21wb25lbnQgaXMgbm90CisgICAgICogICAgICAgICBkaXNwbGF5YWJsZS4KICAgICAgKi8KICAgICBwdWJsaWMgR3JhcGhpY3MgZ2V0R3JhcGhpY3MoKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMjc0OSwyNiArMjU1MiwxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29tcG9uZW50LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnZXRHcmFwaGljc0NvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIC8vPz8/QVdUCisgICAgICAgIC8vID8/P0FXVAogICAgICAgICAvKgotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFdpbmRvdyB3aW4gPSBnZXRXaW5kb3dBbmNlc3RvcigpOwotICAgICAgICAgICAgaWYgKHdpbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gd2luLmdldEdyYXBoaWNzQ29uZmlndXJhdGlvbigpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgICAgICAqLworICAgICAgICAgKiB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgV2luZG93IHdpbiA9IGdldFdpbmRvd0FuY2VzdG9yKCk7IGlmICh3aW4gPT0KKyAgICAgICAgICogbnVsbCkgeyByZXR1cm4gbnVsbDsgfSByZXR1cm4gd2luLmdldEdyYXBoaWNzQ29uZmlndXJhdGlvbigpOyB9CisgICAgICAgICAqIGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9CisgICAgICAgICAqLwogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKQEAgLTI3ODcsMTEgKzI1ODIsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgcGFpbnQgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbSAKLSAgICAgKiBzaG91bGQgYmUgaWdub3JlZC4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgcGFpbnQgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbSBzaG91bGQKKyAgICAgKiBiZSBpZ25vcmVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBwYWludCBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIHRoZSBvcGVyYXRpbmcgc3lzdGVtIAotICAgICAqIHNob3VsZCBiZSBpZ25vcmVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlIGlmIHBhaW50IG1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhlIG9wZXJhdGluZyBzeXN0ZW0gc2hvdWxkCisgICAgICogICAgICAgICBiZSBpZ25vcmVkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0SWdub3JlUmVwYWludCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0yODAzLDIzICsyNTk4LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgaW5wdXQgY29udGV4dCBvZiB0aGlzIGNvbXBvbmVudCBmb3IgaGFuZGxpbmcgCi0gICAgICogdGhlIGNvbW11bmljYXRpb24gd2l0aCBpbnB1dCBtZXRob2RzIHdoZW4gdGV4dCBpcyBlbnRlcmVkIAotICAgICAqIGluIHRoaXMgY29tcG9uZW50LgorICAgICAqIEdldHMgdGhlIGlucHV0IGNvbnRleHQgb2YgdGhpcyBjb21wb25lbnQgZm9yIGhhbmRsaW5nIHRoZSBjb21tdW5pY2F0aW9uCisgICAgICogd2l0aCBpbnB1dCBtZXRob2RzIHdoZW4gdGV4dCBpcyBlbnRlcmVkIGluIHRoaXMgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIElucHV0Q29udGV4dCB1c2VkIGJ5IHRoaXMgQ29tcG9uZW50IG9yIAotICAgICAqIG51bGwgaWYgbm8gY29udGV4dCBpcyBzcGVjaWZpbmVkLgorICAgICAqIEByZXR1cm4gdGhlIElucHV0Q29udGV4dCB1c2VkIGJ5IHRoaXMgQ29tcG9uZW50IG9yIG51bGwgaWYgbm8gY29udGV4dCBpcworICAgICAqICAgICAgICAgc3BlY2lmaW5lZC4KICAgICAgKi8KICAgICBwdWJsaWMgSW5wdXRDb250ZXh0IGdldElucHV0Q29udGV4dCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLz8/P0FXVAorICAgICAgICAgICAgLy8gPz8/QVdUCiAgICAgICAgICAgICAvKgotICAgICAgICAgICAgQ29udGFpbmVyIHBhcmVudCA9IGdldFBhcmVudCgpOwotICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRJbnB1dENvbnRleHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICovCisgICAgICAgICAgICAgKiBDb250YWluZXIgcGFyZW50ID0gZ2V0UGFyZW50KCk7IGlmIChwYXJlbnQgIT0gbnVsbCkgeyByZXR1cm4KKyAgICAgICAgICAgICAqIHBhcmVudC5nZXRJbnB1dENvbnRleHQoKTsgfQorICAgICAgICAgICAgICovCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7CkBAIC0yODI3LDExICsyNjE5LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgaW5wdXQgbWV0aG9kIHJlcXVlc3QgaGFuZGxlciB3aGljaCBzdXBwb3J0cyByZXF1ZXN0cwotICAgICAqIGZyb20gaW5wdXQgbWV0aG9kcyBmb3IgdGhpcyBjb21wb25lbnQsIG9yIG51bGwgZm9yIGRlZmF1bHQuCisgICAgICogR2V0cyB0aGUgaW5wdXQgbWV0aG9kIHJlcXVlc3QgaGFuZGxlciB3aGljaCBzdXBwb3J0cyByZXF1ZXN0cyBmcm9tIGlucHV0CisgICAgICogbWV0aG9kcyBmb3IgdGhpcyBjb21wb25lbnQsIG9yIG51bGwgZm9yIGRlZmF1bHQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW5wdXQgbWV0aG9kIHJlcXVlc3QgaGFuZGxlciB3aGljaCBzdXBwb3J0cyByZXF1ZXN0cwotICAgICAqIGZyb20gaW5wdXQgbWV0aG9kcyBmb3IgdGhpcyBjb21wb25lbnQsIG9yIG51bGwgZm9yIGRlZmF1bHQuCisgICAgICogQHJldHVybiB0aGUgaW5wdXQgbWV0aG9kIHJlcXVlc3QgaGFuZGxlciB3aGljaCBzdXBwb3J0cyByZXF1ZXN0cyBmcm9tCisgICAgICogICAgICAgICBpbnB1dCBtZXRob2RzIGZvciB0aGlzIGNvbXBvbmVudCwgb3IgbnVsbCBmb3IgZGVmYXVsdC4KICAgICAgKi8KICAgICBwdWJsaWMgSW5wdXRNZXRob2RSZXF1ZXN0cyBnZXRJbnB1dE1ldGhvZFJlcXVlc3RzKCkgewogICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTI4NDUsMTkgKzI2MzcsMTQgQEAKICAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLz8/P0FXVAorICAgICAgICAgICAgLy8gPz8/QVdUCiAgICAgICAgICAgICAvKgotICAgICAgICAgICAgaWYgKGxvY2FsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTG9jYWxlLmdldERlZmF1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBhd3QuMTUwPW5vIHBhcmVudAotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbENvbXBvbmVudFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjE1MCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuZ2V0TG9jYWxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqLworICAgICAgICAgICAgICogaWYgKGxvY2FsZSA9PSBudWxsKSB7IGlmIChwYXJlbnQgPT0gbnVsbCkgeyBpZiAodGhpcyBpbnN0YW5jZW9mCisgICAgICAgICAgICAgKiBXaW5kb3cpIHsgcmV0dXJuIExvY2FsZS5nZXREZWZhdWx0KCk7IH0gLy8gYXd0LjE1MD1ubyBwYXJlbnQKKyAgICAgICAgICAgICAqIHRocm93IG5ldworICAgICAgICAgICAgICogSWxsZWdhbENvbXBvbmVudFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjE1MCIpKTsKKyAgICAgICAgICAgICAqIC8vJE5PTi1OTFMtMSQgfSByZXR1cm4gZ2V0UGFyZW50KCkuZ2V0TG9jYWxlKCk7IH0KKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7CkBAIC0yODY1LDM1ICsyNjUyLDMwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbG9jYXRpb24gb2YgdGhpcyBjb21wb25lbnQgaW4gdGhlIGZvcm0gb2YgYSBwb2ludCAKLSAgICAgKiBzcGVjaWZ5aW5nIHRoZSBjb21wb25lbnQncyB0b3AtbGVmdCBjb3JuZXIgaW4gdGhlIAotICAgICAqIHNjcmVlbidzIGNvb3JkaW5hdGUgc3BhY2UuCisgICAgICogR2V0cyB0aGUgbG9jYXRpb24gb2YgdGhpcyBjb21wb25lbnQgaW4gdGhlIGZvcm0gb2YgYSBwb2ludCBzcGVjaWZ5aW5nIHRoZQorICAgICAqIGNvbXBvbmVudCdzIHRvcC1sZWZ0IGNvcm5lciBpbiB0aGUgc2NyZWVuJ3MgY29vcmRpbmF0ZSBzcGFjZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBQb2ludCBnaXZpbmcgdGhlIGNvbXBvbmVudCdzIGxvY2F0aW9uIGluIHRoZSAKLSAgICAgKiBzY3JlZW4ncyBjb29yZGluYXRlIHNwYWNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbENvbXBvbmVudFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBjb21wb25lbnQgaXMgCi0gICAgICogbm90IHNob3duIG9uIHRoZSBzY3JlZW4uCisgICAgICogQHJldHVybiB0aGUgUG9pbnQgZ2l2aW5nIHRoZSBjb21wb25lbnQncyBsb2NhdGlvbiBpbiB0aGUgc2NyZWVuJ3MKKyAgICAgKiAgICAgICAgIGNvb3JkaW5hdGUgc3BhY2UuCisgICAgICogQHRocm93cyBJbGxlZ2FsQ29tcG9uZW50U3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY29tcG9uZW50IGlzIG5vdCBzaG93biBvbiB0aGUgc2NyZWVuLgogICAgICAqLwogICAgIHB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbk9uU2NyZWVuKCkgdGhyb3dzIElsbGVnYWxDb21wb25lbnRTdGF0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgUG9pbnQgcCA9IG5ldyBQb2ludCgpOwogICAgICAgICAgICAgaWYgKGlzU2hvd2luZygpKSB7Ci0gICAgICAgICAgICAgICAgLy8/Pz9BV1QKKyAgICAgICAgICAgICAgICAvLyA/Pz9BV1QKICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgIENvbXBvbmVudCBjb21wOwotICAgICAgICAgICAgICAgIGZvciAoY29tcCA9IHRoaXM7IGNvbXAgIT0gbnVsbCAmJiAhKGNvbXAgaW5zdGFuY2VvZiBXaW5kb3cpOyBjb21wID0gY29tcAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBhcmVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHAudHJhbnNsYXRlKGNvbXAuZ2V0WCgpLCBjb21wLmdldFkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgICAgIHAudHJhbnNsYXRlKGNvbXAuZ2V0WCgpLCBjb21wLmdldFkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICogQ29tcG9uZW50IGNvbXA7IGZvciAoY29tcCA9IHRoaXM7IGNvbXAgIT0gbnVsbCAmJiAhKGNvbXAKKyAgICAgICAgICAgICAgICAgKiBpbnN0YW5jZW9mIFdpbmRvdyk7IGNvbXAgPSBjb21wIC5nZXRQYXJlbnQoKSkgeworICAgICAgICAgICAgICAgICAqIHAudHJhbnNsYXRlKGNvbXAuZ2V0WCgpLCBjb21wLmdldFkoKSk7IH0gaWYgKGNvbXAgaW5zdGFuY2VvZgorICAgICAgICAgICAgICAgICAqIFdpbmRvdykgeyBwLnRyYW5zbGF0ZShjb21wLmdldFgoKSwgY29tcC5nZXRZKCkpOyB9CisgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgcmV0dXJuIHA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBhd3QuMTUxPWNvbXBvbmVudCBtdXN0IGJlIHNob3dpbmcgb24gdGhlIHNjcmVlbiB0byBkZXRlcm1pbmUgaXRzIGxvY2F0aW9uCisgICAgICAgICAgICAvLyBhd3QuMTUxPWNvbXBvbmVudCBtdXN0IGJlIHNob3dpbmcgb24gdGhlIHNjcmVlbiB0byBkZXRlcm1pbmUgaXRzCisgICAgICAgICAgICAvLyBsb2NhdGlvbgogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxDb21wb25lbnRTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xNTEiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7CkBAIC0yOTAxLDExICsyNjgzLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgcGVlci4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkKLSAgICAgKiB1c2VyIGFwcGxpY2F0aW9ucy4KKyAgICAgKiBHZXRzIHRoZSBwZWVyLiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseSBieSB1c2VyCisgICAgICogYXBwbGljYXRpb25zLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIENvbXBvbmVudFBlZXIuCi0gICAgICogCiAgICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgaXNEaXNwbGF5YWJsZSgpLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0yOTIyLDI0ICsyNzAzLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycyByZWdpc3RlcmVkIHRvCi0gICAgICogdGhpcyBDb21wb25lbnQuCisgICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycyByZWdpc3RlcmVkIHRvIHRoaXMKKyAgICAgKiBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMgcmVnaXN0ZXJlZCB0bwotICAgICAqIHRoaXMgQ29tcG9uZW50LgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzIHJlZ2lzdGVyZWQgdG8gdGhpcworICAgICAqICAgICAgICAgQ29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB7CiAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eUNoYW5nZVN1cHBvcnQoKS5nZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gYXJyYXkgb2YgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBvYmplY3RzIHJlZ2lzdGVyZWQKLSAgICAgKiB0byB0aGlzIENvbXBvbmVudCBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgb2JqZWN0cyByZWdpc3RlcmVkIHRvIHRoaXMKKyAgICAgKiBDb21wb25lbnQgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgb2JqZWN0cyByZWdpc3RlcmVkCi0gICAgICogdG8gdGhpcyBDb21wb25lbnQgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUuCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIG9iamVjdHMgcmVnaXN0ZXJlZCB0byB0aGlzCisgICAgICogICAgICAgICBDb21wb25lbnQgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCiAgICAgICovCiAgICAgcHVibGljIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBnZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eUNoYW5nZVN1cHBvcnQoKS5nZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhwcm9wZXJ0eU5hbWUpOwpAQCAtMjk5MCwxMSArMjc3MSwxMSBAQAogICAgIC8qKgogICAgICAqIEdvdCB0aGUgZm9jdXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2dCB0aGUgRXZlbnQuCi0gICAgICogQHBhcmFtIHdoYXQgdGhlIE9iamVjdC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZ0CisgICAgICogICAgICAgICAgICB0aGUgRXZlbnQuCisgICAgICogQHBhcmFtIHdoYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QuCiAgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsLgotICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHByb2Nlc3NGb2N1c0V2ZW50KEZvY3VzRXZlbnQpIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMzAwNywxMCArMjc4OCw5IEBACiAgICAgLyoqCiAgICAgICogSGFuZGxlcyBldmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZ0IHRoZSBFdmVudC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZ0CisgICAgICogICAgICAgICAgICB0aGUgRXZlbnQuCiAgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsLgotICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHByb2Nlc3NFdmVudChBV1RFdmVudCkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0zMDUyLDcgKzI4MzIsNyBAQAogICAgIHB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vPz8/QVdUOiByZXR1cm4gaXNGb2N1c093bmVyKCk7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IHJldHVybiBpc0ZvY3VzT3duZXIoKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7CkBAIC0zMDc2LDI0ICsyODU2LDI0IEBACiAgICAgICAgICAgICBtb3ZlRm9jdXNPbkhpZGUoKTsKICAgICAgICAgICAgIGJlaGF2aW91ci5zZXRWaXNpYmxlKGZhbHNlKTsKICAgICAgICAgICAgIHBvc3RFdmVudChuZXcgQ29tcG9uZW50RXZlbnQodGhpcywgQ29tcG9uZW50RXZlbnQuQ09NUE9ORU5UX0hJRERFTikpOwotICAgICAgICAgICAgLy8/Pz9BV1Q6IGZpbmlzaEhpZXJhcmNoeUNoYW5nZSh0aGlzLCBwYXJlbnQsIDApOworICAgICAgICAgICAgLy8gPz8/QVdUOiBmaW5pc2hIaWVyYXJjaHlDaGFuZ2UodGhpcywgcGFyZW50LCAwKTsKICAgICAgICAgICAgIG5vdGlmeUlucHV0TWV0aG9kKG51bGwpOwotICAgICAgICAgICAgLy8/Pz9BV1Q6IGludmFsaWRhdGVSZWFsUGFyZW50KCk7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IGludmFsaWRhdGVSZWFsUGFyZW50KCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBwb2ludCB3aXRoIHRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMgCi0gICAgICogYmVsb25ncyB0byB0aGUgQ29tbXBvbmVudC4KKyAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHBvaW50IHdpdGggdGhlIHNwZWNpZmllZCBjb29yZGluYXRlcyBiZWxvbmdzIHRvCisgICAgICogdGhlIENvbW1wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgUG9pbnQuCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgUG9pbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcG9pbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzIAotICAgICAqIGJlbG9uZ3MgdG8gdGhlIENvbW1wb25lbnQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgUG9pbnQuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIFBvaW50LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHBvaW50IHdpdGggdGhlIHNwZWNpZmllZCBjb29yZGluYXRlcyBiZWxvbmdzIHRvIHRoZQorICAgICAqICAgICAgICAgQ29tbXBvbmVudCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGNvbnRhaW5zKGludCwgaW50KSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTMxMDcsMTUgKzI4ODcsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnZhbGlkYXRlcyB0aGUgY29tcG9uZW50LCB0aGlzIGNvbXBvbmVudCBhbmQgYWxsIHBhcmVudHMgCi0gICAgICogYWJvdmUgaXQgYXJlIG1hcmtlZCBhcyBuZWVkaW5nIHRvIGJlIGxhaWQgb3V0LiAKKyAgICAgKiBJbnZhbGlkYXRlcyB0aGUgY29tcG9uZW50LCB0aGlzIGNvbXBvbmVudCBhbmQgYWxsIHBhcmVudHMgYWJvdmUgaXQgYXJlCisgICAgICogbWFya2VkIGFzIG5lZWRpbmcgdG8gYmUgbGFpZCBvdXQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgcmVzZXREZWZhdWx0U2l6ZSgpOwotICAgICAgICAgICAgLy8/Pz9BV1Q6IGludmFsaWRhdGVSZWFsUGFyZW50KCk7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IGludmFsaWRhdGVSZWFsUGFyZW50KCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwogICAgICAgICB9CkBAIC0zMTI0LDggKzI5MDQsOCBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgYmFja2dyb3VuZCBjb2xvciBpcyBzZXQgdG8gdGhpcyBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgYmFja2dyb3VuZCBjb2xvciBpcyBzZXQgdG8gdGhpcyBDb21wb25lbnQsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGJhY2tncm91bmQgY29sb3IgaXMgc2V0IHRvIHRoaXMgQ29tcG9uZW50LCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQmFja2dyb3VuZFNldCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0zMTM5LDggKzI5MTksNyBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCBhIGN1cnNvciBpcyBzZXQgZm9yIHRoZSBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBhIGN1cnNvciBpcyBzZXQgZm9yIHRoZSBDb21wb25lbnQsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYSBjdXJzb3IgaXMgc2V0IGZvciB0aGUgQ29tcG9uZW50LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNDdXJzb3JTZXQoKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMzE2NiwxMSArMjk0NSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvbmVudCBpcyBwYWludGVkIHRvIGFuIGJ1ZmZlcgotICAgICAqIHdoaWNoIGlzIGNvcGllZCB0byB0aGUgc2NyZWVuIGxhdGVyLgorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvbmVudCBpcyBwYWludGVkIHRvIGFuIGJ1ZmZlciB3aGljaCBpcworICAgICAqIGNvcGllZCB0byB0aGUgc2NyZWVuIGxhdGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBjb21wb25lbnQgaXMgcGFpbnRlZCB0byBhbiBidWZmZXIKLSAgICAgKiB3aGljaCBpcyBjb3BpZWQgdG8gdGhlIHNjcmVlbiBsYXRlciwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBjb21wb25lbnQgaXMgcGFpbnRlZCB0byBhbiBidWZmZXIgd2hpY2ggaXMgY29waWVkCisgICAgICogICAgICAgICB0byB0aGUgc2NyZWVuIGxhdGVyLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNEb3VibGVCdWZmZXJlZCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0zMjAwLDcgKzI5NzksNyBAQAogICAgICAqICJSZWN1cnNpdmUiIGlzRW5hYmxlZCgpLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBub3Qgb25seSBjb21wb25lbnQgaXRzZWxmIGlzIGVuYWJsZWQgYnV0IGl0cyBoZWF2eXdlaWdodAotICAgICAqIHBhcmVudCBpcyBhbHNvICJpbmRpcmVjdGx5IiBlbmFibGVkCisgICAgICogICAgICAgICBwYXJlbnQgaXMgYWxzbyAiaW5kaXJlY3RseSIgZW5hYmxlZC4KICAgICAgKi8KICAgICBib29sZWFuIGlzSW5kaXJlY3RseUVuYWJsZWQoKSB7CiAgICAgICAgIENvbXBvbmVudCBjb21wID0gdGhpczsKQEAgLTMyMDgsNyArMjk4Nyw3IEBACiAgICAgICAgICAgICBpZiAoIWNvbXAuaXNMaWdodHdlaWdodCgpICYmICFjb21wLmlzRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8/Pz9BV1Q6IGNvbXAgPSBjb21wLmdldFJlYWxQYXJlbnQoKTsKKyAgICAgICAgICAgIC8vID8/P0FXVDogY29tcCA9IGNvbXAuZ2V0UmVhbFBhcmVudCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTMyMTYsNyArMjk5NSw3IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoZSBjb21wb25lbnQgaXMga2V5IGVuYWJsZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgYW5kIGluZGlyZWN0bHkgZW5hYmxlZAorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGNvbXBvbmVudCBpcyBlbmFibGVkIGFuZCBpbmRpcmVjdGx5IGVuYWJsZWQuCiAgICAgICovCiAgICAgYm9vbGVhbiBpc0tleUVuYWJsZWQoKSB7CiAgICAgICAgIGlmICghaXNFbmFibGVkKCkpIHsKQEAgLTMyMjksMzkgKzMwMDgsMjQgQEAKICAgICAgKiBHZXRzIG9ubHkgcGFyZW50IG9mIGEgY2hpbGQgY29tcG9uZW50LCBidXQgbm90IG93bmVyIG9mIGEgd2luZG93LgogICAgICAqIAogICAgICAqIEByZXR1cm4gcGFyZW50IG9mIGNoaWxkIGNvbXBvbmVudCwgbnVsbCBpZiBjb21wb25lbnQgaXMgYSB0b3AtbGV2ZWwKLSAgICAgKiAoV2luZG93IGluc3RhbmNlKQorICAgICAqICAgICAgICAgKFdpbmRvdyBpbnN0YW5jZSkuCiAgICAgICovCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIENvbnRhaW5lciBnZXRSZWFsUGFyZW50KCkgewotICAgICAgICByZXR1cm4gKCEodGhpcyBpbnN0YW5jZW9mIFdpbmRvdykgPyBnZXRQYXJlbnQoKSA6IG51bGwpOwotICAgIH0KKyAgICAgKiBDb250YWluZXIgZ2V0UmVhbFBhcmVudCgpIHsgcmV0dXJuICghKHRoaXMgaW5zdGFuY2VvZiBXaW5kb3cpID8KKyAgICAgKiBnZXRQYXJlbnQoKSA6IG51bGwpOyB9IHB1YmxpYyBib29sZWFuIGlzRm9jdXNDeWNsZVJvb3QoQ29udGFpbmVyCisgICAgICogY29udGFpbmVyKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4gZ2V0Rm9jdXNDeWNsZVJvb3RBbmNlc3RvcigpCisgICAgICogPT0gY29udGFpbmVyOyB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0gcHVibGljIGJvb2xlYW4KKyAgICAgKiBpc0ZvY3VzT3duZXIoKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4KKyAgICAgKiBLZXlib2FyZEZvY3VzTWFuYWdlci5nZXRDdXJyZW50S2V5Ym9hcmRGb2N1c01hbmFnZXIoKS5nZXRGb2N1c093bmVyKCkgPT0KKyAgICAgKiB0aGlzOyB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKi8KIAotICAgIHB1YmxpYyBib29sZWFuIGlzRm9jdXNDeWNsZVJvb3QoQ29udGFpbmVyIGNvbnRhaW5lcikgewotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRGb2N1c0N5Y2xlUm9vdEFuY2VzdG9yKCkgPT0gY29udGFpbmVyOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRm9jdXNPd25lcigpIHsKLSAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gS2V5Ym9hcmRGb2N1c01hbmFnZXIuZ2V0Q3VycmVudEtleWJvYXJkRm9jdXNNYW5hZ2VyKCkuZ2V0Rm9jdXNPd25lcigpID09IHRoaXM7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICB9Ci0gICAgfQotICAgICovCi0gICAgCiAgICAgLyoqCiAgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgQ29tcG9uZW50IGNhbiBiZSBmb2N1c2FibGUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIENvbXBvbmVudCBjYW4gYmUgZm9jdXNhYmxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgaXNGb2N1c2FibGUoKS4gCisgICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgaXNGb2N1c2FibGUoKS4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBib29sZWFuIGlzRm9jdXNUcmF2ZXJzYWJsZSgpIHsKQEAgLTMzMDYsOCArMzA3MCw4IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIGZvcmVncm91bmQgY29sb3IgaXMgc2V0IGZvciB0aGUgQ29tcG9uZW50IG9yIG5vdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGZvcmVncm91bmQgY29sb3IgaXMgc2V0IGZvciB0aGUgQ29tcG9uZW50LAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGZvcmVncm91bmQgY29sb3IgaXMgc2V0IGZvciB0aGUgQ29tcG9uZW50LCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRm9yZWdyb3VuZFNldCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0zMzIxLDggKzMwODUsOCBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYSBsaWdodHdlaWdodCBwZWVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBjb21wb25lbnQgaGFzIGEgbGlnaHR3ZWlnaHQgcGVlciwKLSAgICAgKiBmYWxzZSBpZiBpdCBoYXMgYSBuYXRpdmUgcGVlciBvciBubyBwZWVyLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBjb21wb25lbnQgaGFzIGEgbGlnaHR3ZWlnaHQgcGVlciwgZmFsc2UgaWYgaXQgaGFzIGEKKyAgICAgKiAgICAgICAgIG5hdGl2ZSBwZWVyIG9yIG5vIHBlZXIuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNMaWdodHdlaWdodCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0zMzMzLDIyICszMDk3LDE4IEBACiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIENvbXBvbmVudCBpcyBzaG93bi4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgQ29tcG9uZW50IGlzIHNob3duLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkgewotICAgICAgICAvLz8/P0FXVAorICAgICAgICAvLyA/Pz9BV1QKICAgICAgICAgLyoKLSAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gKGlzVmlzaWJsZSgpICYmIGlzRGlzcGxheWFibGUoKSAmJiAocGFyZW50ICE9IG51bGwpICYmIHBhcmVudC5pc1Nob3dpbmcoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICB9Ci0gICAgICAgICovCisgICAgICAgICAqIHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4gKGlzVmlzaWJsZSgpICYmIGlzRGlzcGxheWFibGUoKSAmJgorICAgICAgICAgKiAocGFyZW50ICE9IG51bGwpICYmIHBhcmVudC5pc1Nob3dpbmcoKSk7IH0gZmluYWxseSB7CisgICAgICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0KKyAgICAgICAgICovCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTMzNjksMTEgKzMxMjksMTEgQEAKICAgICAvKioKICAgICAgKiBEZXByZWNhdGVkOiByZXBsYWNlZCBieSBwcm9jZXNzS2V5RXZlbnQoS2V5RXZlbnQpIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZ0IHRoZSBFdmVudC4KLSAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgY29kZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZ0CisgICAgICogICAgICAgICAgICB0aGUgRXZlbnQuCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleSBjb2RlLgogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bC4KLSAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSByZXBsYWNlZCBieSBwcm9jZXNzS2V5RXZlbnQoS2V5RXZlbnQpIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMzM4NiwxMSArMzE0NiwxMSBAQAogICAgIC8qKgogICAgICAqIERlcHJlY2F0ZWQ6IHJlcGxhY2VkIGJ5IHByb2Nlc3NLZXlFdmVudChLZXlFdmVudCkgbWV0aG9kLgogICAgICAqIAotICAgICAqIEBwYXJhbSBldnQgdGhlIEV2ZW50LgotICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleSBjb2RlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBldnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBFdmVudC4KKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IGNvZGUuCiAgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsLgotICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHByb2Nlc3NLZXlFdmVudChLZXlFdmVudCkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0zNDE4LDExICszMTc4LDExIEBACiAgICAgLyoqCiAgICAgICogRGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgZ2V0Q29tcG9uZW50QXQoaW50LCBpbnQpIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUuCiAgICAgICogQHJldHVybiBUaGUgY29tcG9uZW50LgotICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGdldENvbXBvbmVudEF0KGludCwgaW50KSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTM0MzksMTMgKzMxOTksMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXByZWNhdGVkOiByZXBsYWNlZCBieSBwcm9jZXNzRm9jdXNFdmVudChGb2N1c0V2ZW50KS4gCisgICAgICogRGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgcHJvY2Vzc0ZvY3VzRXZlbnQoRm9jdXNFdmVudCkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2dCB0aGUgRXZlbnQuCi0gICAgICogQHBhcmFtIHdoYXQgdGhlIE9iamVjdC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZ0CisgICAgICogICAgICAgICAgICB0aGUgRXZlbnQuCisgICAgICogQHBhcmFtIHdoYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QuCiAgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsLgotICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHByb2Nlc3NGb2N1c0V2ZW50KEZvY3VzRXZlbnQpLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0zNDU4LDEyICszMjE4LDEzIEBACiAgICAgLyoqCiAgICAgICogRGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgcHJvY2Vzc01vdXNlRXZlbnQoTW91c2VFdmVudCkgbWV0aG9kLgogICAgICAqIAotICAgICAqIEBwYXJhbSBldnQgdGhlIE1vdXNlRXZlbnQuCi0gICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBldnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBNb3VzZUV2ZW50LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlLgogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bC4KLSAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBwcm9jZXNzTW91c2VFdmVudChNb3VzZUV2ZW50KSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTM0NzYsMTIgKzMyMzcsMTMgQEAKICAgICAvKioKICAgICAgKiBEZXByZWNhdGVkOiByZXBsYWNlZCBieSBnZXRNaW5pbXVtU2l6ZSgpIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZ0IHRoZSBFdmVudC4KLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUuCi0gICAgICogCisgICAgICogQHBhcmFtIGV2dAorICAgICAqICAgICAgICAgICAgdGhlIEV2ZW50LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlLgogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bC4KLSAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBnZXRNaW5pbXVtU2l6ZSgpIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMzQ5NCwxMiArMzI1NiwxMyBAQAogICAgIC8qKgogICAgICAqIFJlcGxhY2VkIGJ5IHByb2Nlc3NNb3VzZUV2ZW50KE1vdXNlRXZlbnQpIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZ0IHRoZSBFdmVudC4KLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUuCi0gICAgICogCisgICAgICogQHBhcmFtIGV2dAorICAgICAqICAgICAgICAgICAgdGhlIEV2ZW50LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlLgogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bC4KLSAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSBwcm9jZXNzTW91c2VFdmVudChNb3VzZUV2ZW50KSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTM1MTIsMTIgKzMyNzUsMTMgQEAKICAgICAvKioKICAgICAgKiBSZXBsYWNlZCBieSBwcm9jZXNzTW91c2VFdmVudChNb3VzZUV2ZW50KSBtZXRob2QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2dCB0aGUgRXZlbnQuCi0gICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBldnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBFdmVudC4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZS4KICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwuCi0gICAgICogCiAgICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgcHJvY2Vzc01vdXNlRXZlbnQoTW91c2VFdmVudCkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0zNTMwLDEyICszMjk0LDEzIEBACiAgICAgLyoqCiAgICAgICogUmVwbGFjZWQgYnkgcHJvY2Vzc01vdXNlRXZlbnQoTW91c2VFdmVudCkgbWV0aG9kLgogICAgICAqIAotICAgICAqIEBwYXJhbSBldnQgdGhlIEV2ZW50LgotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZ0CisgICAgICogICAgICAgICAgICB0aGUgRXZlbnQuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUuCiAgICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgcHJvY2Vzc01vdXNlRXZlbnQoTW91c2VFdmVudCkgbWV0aG9kLgotICAgICAqIAogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMzU0OCwxMiArMzMxMywxMyBAQAogICAgIC8qKgogICAgICAqIFJlcGxhY2VkIGJ5IHByb2Nlc3NNb3VzZUV2ZW50KE1vdXNlRXZlbnQpIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZ0IHRoZSBFdmVudC4KLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUuCi0gICAgICogCisgICAgICogQHBhcmFtIGV2dAorICAgICAqICAgICAgICAgICAgdGhlIEV2ZW50LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlLgogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bC4KLSAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBwcm9jZXNzTW91c2VFdmVudChNb3VzZUV2ZW50KSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTM1NjYsOSArMzMzMiwxMCBAQAogICAgIC8qKgogICAgICAqIERlcHJlY2F0ZWQ6IHJlcGxhY2VkIGJ5IHNldExvY2F0aW9uKGludCwgaW50KSBtZXRob2QuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZXMuCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZXMuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGVzLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlcy4KICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBzZXRMb2NhdGlvbihpbnQsIGludCkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0zNTgyLDE4ICszMzQ5LDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLz8/P0FXVAorICAgIC8vID8/P0FXVAogICAgIC8qCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgdm9pZCBuZXh0Rm9jdXMoKSB7Ci0gICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJhbnNmZXJGb2N1cyhLZXlib2FyZEZvY3VzTWFuYWdlci5GT1JXQVJEX1RSQVZFUlNBTF9LRVlTKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KKyAgICAgKiBARGVwcmVjYXRlZCBwdWJsaWMgdm9pZCBuZXh0Rm9jdXMoKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeworICAgICAqIHRyYW5zZmVyRm9jdXMoS2V5Ym9hcmRGb2N1c01hbmFnZXIuRk9SV0FSRF9UUkFWRVJTQUxfS0VZUyk7IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9CisgICAgICovCiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb21wb25lbnQncyBzdGF0ZS4KQEAgLTM2MDMsMTAgKzMzNjQsOCBAQAogICAgIHByb3RlY3RlZCBTdHJpbmcgcGFyYW1TdHJpbmcoKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIFRoZSBmb3JtYXQgaXMgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3Igd2hpY2ggY2FuIGJlIHJldmVhbGVkIGJ5Ci0gICAgICAgICAqIHRoZSBmb2xsb3dpbmcgY29kZToKLSAgICAgICAgICogCi0gICAgICAgICAqIENvbXBvbmVudCBjID0gbmV3IENvbXBvbmVudCgpe307IGMuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAqIFN5c3RlbS5vdXQucHJpbnRsbihjKTsKKyAgICAgICAgICogdGhlIGZvbGxvd2luZyBjb2RlOiBDb21wb25lbnQgYyA9IG5ldyBDb21wb25lbnQoKXt9OworICAgICAgICAgKiBjLnNldFZpc2libGUoZmFsc2UpOyBTeXN0ZW0ub3V0LnByaW50bG4oYyk7CiAgICAgICAgICAqLwogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKICAgICAgICAgdHJ5IHsKQEAgLTM2MjQsMzUgKzMzODMsMjcgQEAKICAgICAgICAgaWYgKGhhbmRsZWQpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIC8vPz8/QVdUCisgICAgICAgIC8vID8/P0FXVAogICAgICAgICAvKgotCi0gICAgICAgIC8vIHByb3BhZ2F0ZSBub24taGFuZGxlZCBldmVudHMgdXAgdG8gcGFyZW50Ci0gICAgICAgIENvbXBvbmVudCBwYXIgPSBwYXJlbnQ7Ci0gICAgICAgIC8vIHRyeSB0byBjYWxsIHBvc3RFdmVudCBvbmx5IG9uIGNvbXBvbmVudHMgd2hpY2gKLSAgICAgICAgLy8gb3ZlcnJpZGUgYW55IG9mIGRlcHJlY2F0ZWQgbWV0aG9kIGhhbmRsZXJzCi0gICAgICAgIC8vIHdoaWxlIChwYXIgIT0gbnVsbCAmJiAhcGFyLmRlcHJlY2F0ZWRFdmVudEhhbmRsZXIpIHsKLSAgICAgICAgLy8gcGFyID0gcGFyLnBhcmVudDsKLSAgICAgICAgLy8gfQotICAgICAgICAvLyB0cmFuc2xhdGUgZXZlbnQgY29vcmRpbmF0ZXMgYmVmb3JlIHBvc3RpbmcgaXQgdG8gcGFyZW50Ci0gICAgICAgIGlmIChwYXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZXZ0LnRyYW5zbGF0ZSh4LCB5KTsKLSAgICAgICAgICAgIHBhci5wb3N0RXZlbnQoZXZ0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgKi8KKyAgICAgICAgICogLy8gcHJvcGFnYXRlIG5vbi1oYW5kbGVkIGV2ZW50cyB1cCB0byBwYXJlbnQgQ29tcG9uZW50IHBhciA9IHBhcmVudDsKKyAgICAgICAgICogLy8gdHJ5IHRvIGNhbGwgcG9zdEV2ZW50IG9ubHkgb24gY29tcG9uZW50cyB3aGljaCAvLyBvdmVycmlkZSBhbnkgb2YKKyAgICAgICAgICogZGVwcmVjYXRlZCBtZXRob2QgaGFuZGxlcnMgLy8gd2hpbGUgKHBhciAhPSBudWxsICYmCisgICAgICAgICAqICFwYXIuZGVwcmVjYXRlZEV2ZW50SGFuZGxlcikgeyAvLyBwYXIgPSBwYXIucGFyZW50OyAvLyB9IC8vIHRyYW5zbGF0ZQorICAgICAgICAgKiBldmVudCBjb29yZGluYXRlcyBiZWZvcmUgcG9zdGluZyBpdCB0byBwYXJlbnQgaWYgKHBhciAhPSBudWxsKSB7CisgICAgICAgICAqIGV2dC50cmFuc2xhdGUoeCwgeSk7IHBhci5wb3N0RXZlbnQoZXZ0KTsgfQorICAgICAgICAgKi8KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByZXBhcmVzIGFuIGltYWdlIGZvciByZW5kZXJpbmcgb24gdGhlIENvbXBvbmVudC4gCi0gICAgICogIAotICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgSW1hZ2UgdG8gYmUgcHJlcGFyZWQuCi0gICAgICogQHBhcmFtIG9ic2VydmVyIHRoZSBJbWFnZU9ic2VydmVyIG9iamVjdCB0byBiZSBub3RpZmllZCBhcyBzb29uIGFzIAotICAgICAqIHRoZSBpbWFnZSBpcyBwcmVwYXJlZC4KKyAgICAgKiBQcmVwYXJlcyBhbiBpbWFnZSBmb3IgcmVuZGVyaW5nIG9uIHRoZSBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBpbWFnZSBoYXMgYmVlbiBmdWxseSBwcmVwYXJlZCwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIGltYWdlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2UgdG8gYmUgcHJlcGFyZWQuCisgICAgICogQHBhcmFtIG9ic2VydmVyCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VPYnNlcnZlciBvYmplY3QgdG8gYmUgbm90aWZpZWQgYXMgc29vbiBhcyB0aGUgaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIGlzIHByZXBhcmVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaW1hZ2UgaGFzIGJlZW4gZnVsbHkgcHJlcGFyZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBwcmVwYXJlSW1hZ2UoSW1hZ2UgaW1hZ2UsIEltYWdlT2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0zNjY0LDE3ICszNDE1LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJlcGFyZXMgYW4gaW1hZ2UgZm9yIHJlbmRlcmluZyBvbiB0aGUgQ29tcG9uZW50IHdpdGggdGhlCi0gICAgICogc3BlY2lmaWVkIHdpZHRoLCBoZWlnaHQsIGFuZCBJbWFnZU9ic2VydmVyLiAKKyAgICAgKiBQcmVwYXJlcyBhbiBpbWFnZSBmb3IgcmVuZGVyaW5nIG9uIHRoZSBDb21wb25lbnQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogd2lkdGgsIGhlaWdodCwgYW5kIEltYWdlT2JzZXJ2ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlIHRoZSBJbWFnZSB0byBiZSBwcmVwYXJlZC4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHNjYWxlZCBpbWFnZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2Ygc2NhbGVkIGhlaWdodC4KLSAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHRvIGJlIG5vdGlmaWVkIGFzIHNvb24gYXMgCi0gICAgICogdGhlIGltYWdlIGlzIHByZXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaW1hZ2UgaXMgYmVlbiBmdWxseSBwcmVwYXJlZCwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIGltYWdlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2UgdG8gYmUgcHJlcGFyZWQuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2Ygc2NhbGVkIGltYWdlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2Ygc2NhbGVkIGhlaWdodC4KKyAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZU9ic2VydmVyIG9iamVjdCB0byBiZSBub3RpZmllZCBhcyBzb29uIGFzIHRoZSBpbWFnZQorICAgICAqICAgICAgICAgICAgaXMgcHJlcGFyZWQuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBpbWFnZSBpcyBiZWVuIGZ1bGx5IHByZXBhcmVkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcHJlcGFyZUltYWdlKEltYWdlIGltYWdlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEltYWdlT2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0zNjkxLDE2ICszNDQ0LDE0IEBACiAgICAgcHVibGljIHZvaWQgcmVtb3ZlTm90aWZ5KCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vPz8/QVdUCisgICAgICAgICAgICAvLyA/Pz9BV1QKICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBpZiAoZHJvcFRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZHJvcFRhcmdldC5yZW1vdmVOb3RpZnkocGVlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqLworICAgICAgICAgICAgICogaWYgKGRyb3BUYXJnZXQgIT0gbnVsbCkgeyBkcm9wVGFyZ2V0LnJlbW92ZU5vdGlmeShwZWVyKTsgfQorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBwcmVwYXJlNEhpZXJhcmNoeUNoYW5nZSgpOwotICAgICAgICAgICAgLy8vPz8/QVdUOiBtb3ZlRm9jdXMoKTsKKyAgICAgICAgICAgIC8vIC8/Pz9BV1Q6IG1vdmVGb2N1cygpOwogICAgICAgICAgICAgYmVoYXZpb3VyLnJlbW92ZU5vdGlmeSgpOwotICAgICAgICAgICAgLy8/Pz9BV1Q6IGZpbmlzaEhpZXJhcmNoeUNoYW5nZSh0aGlzLCBwYXJlbnQsIDApOworICAgICAgICAgICAgLy8gPz8/QVdUOiBmaW5pc2hIaWVyYXJjaHlDaGFuZ2UodGhpcywgcGFyZW50LCAwKTsKICAgICAgICAgICAgIHJlbW92ZU5vdGlmeUlucHV0Q29udGV4dCgpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKQEAgLTM3MDgsNyArMzQ1OSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2FsbHMgSW5wdXRDb250ZXh0LnJlbW92ZU5vdGlmeQorICAgICAqIENhbGxzIElucHV0Q29udGV4dC5yZW1vdmVOb3RpZnkuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZU5vdGlmeUlucHV0Q29udGV4dCgpIHsKICAgICAgICAgaWYgKCFpbnB1dE1ldGhvZHNFbmFibGVkKSB7CkBAIC0zNzE2LDcgKzM0NjcsNyBAQAogICAgICAgICB9CiAgICAgICAgIElucHV0Q29udGV4dCBpYyA9IGdldElucHV0Q29udGV4dCgpOwogICAgICAgICBpZiAoaWMgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8/Pz9BV1Q6IGljLnJlbW92ZU5vdGlmeSh0aGlzKTsKKyAgICAgICAgICAgIC8vID8/P0FXVDogaWMucmVtb3ZlTm90aWZ5KHRoaXMpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNzI2LDQ2ICszNDc3LDI1IEBACiAgICAgICogc2V0Rm9jdXNhYmxlKGZhbHNlKSBpcyBjYWxsZWQsIGFuZCB0aGVyZWZvcmUgYXV0b21hdGljIGZvcndhcmQgZm9jdXMKICAgICAgKiB0cmF2ZXJzYWwgaXMgbmVjZXNzYXJ5CiAgICAgICovCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHZvaWQgbW92ZUZvY3VzKCkgewotICAgICAgICAvLyBkb24ndCB1c2UgdHJhbnNmZXJGb2N1cygpLCBidXQgcXVlcnkgZm9jdXMgdHJhdmVyc2FsIHBvbGljeSBkaXJlY3RseQotICAgICAgICAvLyBhbmQgaWYgaXQgcmV0dXJucyBudWxsLCB0cmFuc2ZlciBmb2N1cyB1cCBjeWNsZQotICAgICAgICAvLyBhbmQgZmluZCBuZXh0IGZvY3VzYWJsZSBjb21wb25lbnQgdGhlcmUKLSAgICAgICAgS2V5Ym9hcmRGb2N1c01hbmFnZXIga2ZtID0gS2V5Ym9hcmRGb2N1c01hbmFnZXIuZ2V0Q3VycmVudEtleWJvYXJkRm9jdXNNYW5hZ2VyKCk7Ci0gICAgICAgIENvbnRhaW5lciByb290ID0ga2ZtLmdldEN1cnJlbnRGb2N1c0N5Y2xlUm9vdCgpOwotICAgICAgICBDb21wb25lbnQgbmV4dENvbXAgPSB0aGlzOwotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhaXNGb2N1c093bmVyKCk7Ci0gICAgICAgIHdoaWxlICghc3VjY2VzcykgewotICAgICAgICAgICAgaWYgKHJvb3QgIT0gbmV4dENvbXAuZ2V0Rm9jdXNDeWNsZVJvb3RBbmNlc3RvcigpKSB7Ci0gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50IHdhcyBwcm9iYWJseSByZW1vdmVkIGZyb20gY29udGFpbmVyCi0gICAgICAgICAgICAgICAgLy8gc28gZm9jdXMgd2lsbCBiZSBsb3N0IGluIHNvbWUgdGltZQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5leHRDb21wID0gcm9vdC5nZXRGb2N1c1RyYXZlcnNhbFBvbGljeSgpLmdldENvbXBvbmVudEFmdGVyKHJvb3QsIG5leHRDb21wKTsKLSAgICAgICAgICAgIGlmIChuZXh0Q29tcCA9PSB0aGlzKSB7Ci0gICAgICAgICAgICAgICAgbmV4dENvbXAgPSBudWxsOyAvLyBhdm9pZCBsb29waW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobmV4dENvbXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBuZXh0Q29tcC5yZXF1ZXN0Rm9jdXNJbldpbmRvdygpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuZXh0Q29tcCA9IHJvb3Q7Ci0gICAgICAgICAgICAgICAgcm9vdCA9IHJvb3QuZ2V0Rm9jdXNDeWNsZVJvb3RBbmNlc3RvcigpOwotICAgICAgICAgICAgICAgIC8vIGlmIG5vIGFjY2VwdGFibGUgY29tcG9uZW50IGlzIGZvdW5kIGF0IGFsbCAtIGNsZWFyIGdsb2JhbAotICAgICAgICAgICAgICAgIC8vIGZvY3VzIG93bmVyCi0gICAgICAgICAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENvbXAgaW5zdGFuY2VvZiBXaW5kb3cpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvdyB3bmQgPSAoV2luZG93KSBuZXh0Q29tcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHduZC5zZXRGb2N1c093bmVyKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgd25kLnNldFJlcXVlc3RlZEZvY3VzKG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGtmbS5jbGVhckdsb2JhbEZvY3VzT3duZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAqLworICAgICAqIHZvaWQgbW92ZUZvY3VzKCkgeyAvLyBkb24ndCB1c2UgdHJhbnNmZXJGb2N1cygpLCBidXQgcXVlcnkgZm9jdXMKKyAgICAgKiB0cmF2ZXJzYWwgcG9saWN5IGRpcmVjdGx5IC8vIGFuZCBpZiBpdCByZXR1cm5zIG51bGwsIHRyYW5zZmVyIGZvY3VzIHVwCisgICAgICogY3ljbGUgLy8gYW5kIGZpbmQgbmV4dCBmb2N1c2FibGUgY29tcG9uZW50IHRoZXJlIEtleWJvYXJkRm9jdXNNYW5hZ2VyIGtmbQorICAgICAqID0gS2V5Ym9hcmRGb2N1c01hbmFnZXIuZ2V0Q3VycmVudEtleWJvYXJkRm9jdXNNYW5hZ2VyKCk7IENvbnRhaW5lciByb290ID0KKyAgICAgKiBrZm0uZ2V0Q3VycmVudEZvY3VzQ3ljbGVSb290KCk7IENvbXBvbmVudCBuZXh0Q29tcCA9IHRoaXM7IGJvb2xlYW4KKyAgICAgKiBzdWNjZXNzID0gIWlzRm9jdXNPd25lcigpOyB3aGlsZSAoIXN1Y2Nlc3MpIHsgaWYgKHJvb3QgIT0KKyAgICAgKiBuZXh0Q29tcC5nZXRGb2N1c0N5Y2xlUm9vdEFuY2VzdG9yKCkpIHsgLy8gY29tcG9uZW50IHdhcyBwcm9iYWJseSByZW1vdmVkCisgICAgICogZnJvbSBjb250YWluZXIgLy8gc28gZm9jdXMgd2lsbCBiZSBsb3N0IGluIHNvbWUgdGltZSByZXR1cm47IH0gbmV4dENvbXAgPQorICAgICAqIHJvb3QuZ2V0Rm9jdXNUcmF2ZXJzYWxQb2xpY3koKS5nZXRDb21wb25lbnRBZnRlcihyb290LCBuZXh0Q29tcCk7IGlmCisgICAgICogKG5leHRDb21wID09IHRoaXMpIHsgbmV4dENvbXAgPSBudWxsOyAvLyBhdm9pZCBsb29waW5nIH0gaWYgKG5leHRDb21wICE9CisgICAgICogbnVsbCkgeyBzdWNjZXNzID0gbmV4dENvbXAucmVxdWVzdEZvY3VzSW5XaW5kb3coKTsgfSBlbHNlIHsgbmV4dENvbXAgPQorICAgICAqIHJvb3Q7IHJvb3QgPSByb290LmdldEZvY3VzQ3ljbGVSb290QW5jZXN0b3IoKTsgLy8gaWYgbm8gYWNjZXB0YWJsZQorICAgICAqIGNvbXBvbmVudCBpcyBmb3VuZCBhdCBhbGwgLSBjbGVhciBnbG9iYWwgLy8gZm9jdXMgb3duZXIgaWYgKHJvb3QgPT0gbnVsbCkKKyAgICAgKiB7IGlmIChuZXh0Q29tcCBpbnN0YW5jZW9mIFdpbmRvdykgeyBXaW5kb3cgd25kID0gKFdpbmRvdykgbmV4dENvbXA7CisgICAgICogd25kLnNldEZvY3VzT3duZXIobnVsbCk7IHduZC5zZXRSZXF1ZXN0ZWRGb2N1cyhudWxsKTsgfQorICAgICAqIGtmbS5jbGVhckdsb2JhbEZvY3VzT3duZXIoKTsgcmV0dXJuOyB9IH0gfSB9CisgICAgICovCiAKICAgICAvKioKICAgICAgKiBGb3IgQ29udGFpbmVyIHRoZXJlJ3MgYSBkaWZmZXJlbmNlIGJldHdlZW4gbW92aW5nIGZvY3VzIHdoZW4gYmVpbmcgbWFkZQpAQCAtMzc3NCw4MCArMzUwNCw3MyBAQAogICAgICAqIHNldFZpc2libGUoKSBpcyBub3QgY2FsbGVkLgogICAgICAqLwogICAgIHZvaWQgbW92ZUZvY3VzT25IaWRlKCkgewotICAgICAgICAvLz8/P0FXVDogbW92ZUZvY3VzKCk7CisgICAgICAgIC8vID8/P0FXVDogbW92ZUZvY3VzKCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHJlZ2lzdGVyZWQgZm9yIHRoaXMgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICBnZXRQcm9wZXJ0eUNoYW5nZVN1cHBvcnQoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgcmVnaXN0ZXJlZCBmb3QgdGhpcyBjb21wb25lbnQgCi0gICAgICogZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHl5LgorICAgICAqIFJlbW92ZXMgdGhlIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciByZWdpc3RlcmVkIGZvdCB0aGlzIGNvbXBvbmVudCBmb3IKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5eS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lCisgICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZS4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgZ2V0UHJvcGVydHlDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKTsKICAgICB9CiAKLQogICAgIC8qKgotICAgICAqIFJlcGFpbnRzIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIG9mIHRoaXMgY29tcG9uZW50IHdpdGhpbiAKLSAgICAgKiB0bSBtaWxsaXNlY29uZHMuCisgICAgICogUmVwYWludHMgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgb2YgdGhpcyBjb21wb25lbnQgd2l0aGluIHRtCisgICAgICogbWlsbGlzZWNvbmRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0bSB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHVwZGF0aW5nLgotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgUmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgUmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgUmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiBSZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHRtCisgICAgICogICAgICAgICAgICB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHVwZGF0aW5nLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIFJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiBSZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgUmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgUmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlcGFpbnQobG9uZyB0bSwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgLy8/Pz9BV1QKKyAgICAgICAgLy8gPz8/QVdUCiAgICAgICAgIC8qCi0gICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwgKHJlZHJhd01hbmFnZXIgPT0gbnVsbCkgfHwgIWlzU2hvd2luZygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJlaGF2aW91ciBpbnN0YW5jZW9mIExXQmVoYXZpb3IpIHsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50ID09IG51bGwgfHwgIXBhcmVudC52aXNpYmxlIHx8ICFwYXJlbnQuYmVoYXZpb3VyLmlzRGlzcGxheWFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXBhaW50UmVnaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwYWludFJlZ2lvbiA9IG5ldyBNdWx0aVJlY3RBcmVhKG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXBhaW50UmVnaW9uLmludGVyc2VjdChuZXcgUmVjdGFuZ2xlKDAsIDAsIHRoaXMudywgdGhpcy5oKSk7Ci0gICAgICAgICAgICAgICAgcmVwYWludFJlZ2lvbi50cmFuc2xhdGUodGhpcy54LCB0aGlzLnkpOwotICAgICAgICAgICAgICAgIHBhcmVudC5yZXBhaW50UmVnaW9uID0gcmVwYWludFJlZ2lvbjsKLSAgICAgICAgICAgICAgICByZXBhaW50UmVnaW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICBwYXJlbnQucmVwYWludCh0bSwgeCArIHRoaXMueCwgeSArIHRoaXMueSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChyZXBhaW50UmVnaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVkcmF3TWFuYWdlci5hZGRVcGRhdGVSZWdpb24odGhpcywgcmVwYWludFJlZ2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGFpbnRSZWdpb24gPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZHJhd01hbmFnZXIuYWRkVXBkYXRlUmVnaW9uKHRoaXMsIG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0b29sa2l0LmdldFN5c3RlbUV2ZW50UXVldWVDb3JlKCkubm90aWZ5RXZlbnRNb25pdG9yKHRvb2xraXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgICAgICAqLworICAgICAgICAgKiB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwKKyAgICAgICAgICogKHJlZHJhd01hbmFnZXIgPT0gbnVsbCkgfHwgIWlzU2hvd2luZygpKSB7IHJldHVybjsgfSBpZiAoYmVoYXZpb3VyCisgICAgICAgICAqIGluc3RhbmNlb2YgTFdCZWhhdmlvcikgeyBpZiAocGFyZW50ID09IG51bGwgfHwgIXBhcmVudC52aXNpYmxlIHx8CisgICAgICAgICAqICFwYXJlbnQuYmVoYXZpb3VyLmlzRGlzcGxheWFibGUoKSkgeyByZXR1cm47IH0gaWYgKHJlcGFpbnRSZWdpb24gPT0KKyAgICAgICAgICogbnVsbCkgeyByZXBhaW50UmVnaW9uID0gbmV3IE11bHRpUmVjdEFyZWEobmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwKKyAgICAgICAgICogaGVpZ2h0KSk7IH0gcmVwYWludFJlZ2lvbi5pbnRlcnNlY3QobmV3IFJlY3RhbmdsZSgwLCAwLCB0aGlzLncsCisgICAgICAgICAqIHRoaXMuaCkpOyByZXBhaW50UmVnaW9uLnRyYW5zbGF0ZSh0aGlzLngsIHRoaXMueSk7CisgICAgICAgICAqIHBhcmVudC5yZXBhaW50UmVnaW9uID0gcmVwYWludFJlZ2lvbjsgcmVwYWludFJlZ2lvbiA9IG51bGw7CisgICAgICAgICAqIHBhcmVudC5yZXBhaW50KHRtLCB4ICsgdGhpcy54LCB5ICsgdGhpcy55LCB3aWR0aCwgaGVpZ2h0KTsgfSBlbHNlIHsKKyAgICAgICAgICogaWYgKHJlcGFpbnRSZWdpb24gIT0gbnVsbCkgeyByZWRyYXdNYW5hZ2VyLmFkZFVwZGF0ZVJlZ2lvbih0aGlzLAorICAgICAgICAgKiByZXBhaW50UmVnaW9uKTsgcmVwYWludFJlZ2lvbiA9IG51bGw7IH0gZWxzZSB7CisgICAgICAgICAqIHJlZHJhd01hbmFnZXIuYWRkVXBkYXRlUmVnaW9uKHRoaXMsIG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsCisgICAgICAgICAqIGhlaWdodCkpOyB9CisgICAgICAgICAqIHRvb2xraXQuZ2V0U3lzdGVtRXZlbnRRdWV1ZUNvcmUoKS5ub3RpZnlFdmVudE1vbml0b3IodG9vbGtpdCk7IH0gfQorICAgICAgICAgKiBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfQorICAgICAgICAgKi8KICAgICB9CiAKICAgICAvKioKICAgICAgKiBQb3N0IGV2ZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlIHRoZSBlCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlLgogICAgICAqLwogICAgIHZvaWQgcG9zdEV2ZW50KEFXVEV2ZW50IGUpIHsKICAgICAgICAgZ2V0VG9vbGtpdCgpLmdldFN5c3RlbUV2ZW50UXVldWVJbXBsKCkucG9zdEV2ZW50KGUpOwpAQCAtMzg1NiwxMCArMzU3OSwxNCBAQAogICAgIC8qKgogICAgICAqIFJlcGFpbnRzIHRoZSBzcGVjaWZpZWQgUmVjdGFuZ2xlIG9mIHRoaXMgQ29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgUmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgUmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgUmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiBSZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgUmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIFJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBSZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiBSZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVwYWludChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTM4ODcsNyArMzYxNCw4IEBACiAgICAgLyoqCiAgICAgICogUmVwYWludHMgdGhlIGNvbXBvbmVudCB3aXRoaW4gdG0gbWlsbGlzZWNvbmRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0bSB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHVwZGF0aW5nLgorICAgICAqIEBwYXJhbSB0bQorICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB1cGRhdGluZy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXBhaW50KGxvbmcgdG0pIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0zODk5LDI5ICszNjI3LDI4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVxdWVzdHMgdGhhdCB0aGlzIENvbXBvbmVudCBnZXQgdGhlIGlucHV0IGZvY3VzIHRlbXBvcmFyaWx5LiAKLSAgICAgKiBUaGlzIGNvbXBvbmVudCBtdXN0IGJlIGRpc3BsYXlhYmxlLCB2aXNpYmxlLCBhbmQgZm9jdXNhYmxlLgorICAgICAqIFJlcXVlc3RzIHRoYXQgdGhpcyBDb21wb25lbnQgZ2V0IHRoZSBpbnB1dCBmb2N1cyB0ZW1wb3JhcmlseS4gVGhpcworICAgICAqIGNvbXBvbmVudCBtdXN0IGJlIGRpc3BsYXlhYmxlLCB2aXNpYmxlLCBhbmQgZm9jdXNhYmxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0ZW1wb3JhcnkgdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSBpZiB0aGUgZm9jdXMgY2hhbmdlIAotICAgICAqIGlzIHRlbXBvcmFyeSwgd2hlbiB0aGUgd2luZG93IGxvc2VzIHRoZSBmb2N1cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZvY3VzIGNoYW5nZSByZXF1ZXN0IGlzIHN1Y2NlZWRlZCwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIHRlbXBvcmFyeQorICAgICAqICAgICAgICAgICAgdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSBpZiB0aGUgZm9jdXMgY2hhbmdlIGlzIHRlbXBvcmFyeSwgd2hlbgorICAgICAqICAgICAgICAgICAgdGhlIHdpbmRvdyBsb3NlcyB0aGUgZm9jdXMuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmb2N1cyBjaGFuZ2UgcmVxdWVzdCBpcyBzdWNjZWVkZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1ZXN0Rm9jdXMoYm9vbGVhbiB0ZW1wb3JhcnkpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLz8/P0FXVDogcmV0dXJuIHJlcXVlc3RGb2N1c0ltcGwodGVtcG9yYXJ5LCB0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IHJldHVybiByZXF1ZXN0Rm9jdXNJbXBsKHRlbXBvcmFyeSwgdHJ1ZSwgZmFsc2UpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKICAgICAgICAgfQotICAgICAgICAvLz8/P0FXVAorICAgICAgICAvLyA/Pz9BV1QKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcXVlc3RzIHRoYXQgdGhpcyBDb21wb25lbnQgZ2V0IHRoZSBpbnB1dCBmb2N1cy4gCi0gICAgICogVGhpcyBjb21wb25lbnQgbXVzdCBiZSBkaXNwbGF5YWJsZSwgdmlzaWJsZSwgYW5kIGZvY3VzYWJsZS4KKyAgICAgKiBSZXF1ZXN0cyB0aGF0IHRoaXMgQ29tcG9uZW50IGdldCB0aGUgaW5wdXQgZm9jdXMuIFRoaXMgY29tcG9uZW50IG11c3QgYmUKKyAgICAgKiBkaXNwbGF5YWJsZSwgdmlzaWJsZSwgYW5kIGZvY3VzYWJsZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0Rm9jdXMoKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMzkzMiw1NSArMzY1OSwzNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHByb3RlY3RlZCBib29sZWFuIHJlcXVlc3RGb2N1c0luV2luZG93KGJvb2xlYW4gdGVtcG9yYXJ5KSB7Ci0gICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgV2luZG93IHduZCA9IGdldFdpbmRvd0FuY2VzdG9yKCk7Ci0gICAgICAgICAgICBpZiAoKHduZCA9PSBudWxsKSB8fCAhd25kLmlzRm9jdXNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RGb2N1c0ltcGwodGVtcG9yYXJ5LCBmYWxzZSwgZmFsc2UpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gcmVxdWVzdEZvY3VzSW1wbChib29sZWFuIHRlbXBvcmFyeSwgYm9vbGVhbiBjcm9zc1dpbmRvdywgYm9vbGVhbiByZWplY3Rpb25SZWNvdmVyeSkgewotICAgICAgICBpZiAoIXJlamVjdGlvblJlY292ZXJ5ICYmIGlzRm9jdXNPd25lcigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBXaW5kb3cgd25kID0gZ2V0V2luZG93QW5jZXN0b3IoKTsKLSAgICAgICAgQ29udGFpbmVyIHBhciA9IGdldFJlYWxQYXJlbnQoKTsKLSAgICAgICAgaWYgKChwYXIgIT0gbnVsbCkgJiYgcGFyLmlzUmVtb3ZlZCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaXNTaG93aW5nKCkgfHwgIWlzRm9jdXNhYmxlKCkgfHwgIXduZC5pc0ZvY3VzYWJsZVdpbmRvdygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEtleWJvYXJkRm9jdXNNYW5hZ2VyLmdldEN1cnJlbnRLZXlib2FyZEZvY3VzTWFuYWdlcigpLnJlcXVlc3RGb2N1cyh0aGlzLAotICAgICAgICAgICAgICAgIHRlbXBvcmFyeSwgY3Jvc3NXaW5kb3csIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RGb2N1c0luV2luZG93KCkgewotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiByZXF1ZXN0Rm9jdXNJbldpbmRvdyhmYWxzZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICB9Ci0gICAgfQotICAgICovCisgICAgICogcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWVzdEZvY3VzSW5XaW5kb3coYm9vbGVhbiB0ZW1wb3JhcnkpIHsKKyAgICAgKiB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgV2luZG93IHduZCA9IGdldFdpbmRvd0FuY2VzdG9yKCk7IGlmICgod25kID09CisgICAgICogbnVsbCkgfHwgIXduZC5pc0ZvY3VzZWQoKSkgeyByZXR1cm4gZmFsc2U7IH0gcmV0dXJuCisgICAgICogcmVxdWVzdEZvY3VzSW1wbCh0ZW1wb3JhcnksIGZhbHNlLCBmYWxzZSk7IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IGJvb2xlYW4gcmVxdWVzdEZvY3VzSW1wbChib29sZWFuIHRlbXBvcmFyeSwKKyAgICAgKiBib29sZWFuIGNyb3NzV2luZG93LCBib29sZWFuIHJlamVjdGlvblJlY292ZXJ5KSB7IGlmICghcmVqZWN0aW9uUmVjb3ZlcnkKKyAgICAgKiAmJiBpc0ZvY3VzT3duZXIoKSkgeyByZXR1cm4gdHJ1ZTsgfSBXaW5kb3cgd25kID0gZ2V0V2luZG93QW5jZXN0b3IoKTsKKyAgICAgKiBDb250YWluZXIgcGFyID0gZ2V0UmVhbFBhcmVudCgpOyBpZiAoKHBhciAhPSBudWxsKSAmJiBwYXIuaXNSZW1vdmVkKSB7CisgICAgICogcmV0dXJuIGZhbHNlOyB9IGlmICghaXNTaG93aW5nKCkgfHwgIWlzRm9jdXNhYmxlKCkgfHwKKyAgICAgKiAhd25kLmlzRm9jdXNhYmxlV2luZG93KCkpIHsgcmV0dXJuIGZhbHNlOyB9IHJldHVybgorICAgICAqIEtleWJvYXJkRm9jdXNNYW5hZ2VyLmdldEN1cnJlbnRLZXlib2FyZEZvY3VzTWFuYWdlcigpLnJlcXVlc3RGb2N1cyh0aGlzLAorICAgICAqIHRlbXBvcmFyeSwgY3Jvc3NXaW5kb3csIHRydWUpOyB9IHB1YmxpYyBib29sZWFuIHJlcXVlc3RGb2N1c0luV2luZG93KCkgeworICAgICAqIHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4gcmVxdWVzdEZvY3VzSW5XaW5kb3coZmFsc2UpOyB9IGZpbmFsbHkgeworICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqLwogCiAgICAgLyoqCiAgICAgICogRGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgc2V0Qm91bmRzKGludCwgaW50LCBpbnQsIGludCkgbWV0aG9kLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGguIAotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aC4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodC4KICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBzZXRCb3VuZHMoaW50LCBpbnQsIGludCwgaW50KSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTM5OTUsMTMgKzM3MDIsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHJlY3RhbmdsZSBmb3IgdGhpcyBDb21wb25lbnQgdG8gYmUgdGhlIHJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQgCisgICAgICogU2V0cyByZWN0YW5nbGUgZm9yIHRoaXMgQ29tcG9uZW50IHRvIGJlIHRoZSByZWN0YW5nbGUgd2l0aCB0aGUgc3BlY2lmaWVkCiAgICAgICogeCx5IGNvb3JkaW5hdGVzIG9mIHRoZSB0b3AtbGVmdCBjb3JuZXIgYW5kIHRoZSB3aWR0aCBhbmQgaGVpZ2h0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcC1sZWZ0IGNvcm5lci4KLSAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AtbGVmdCBjb3JuZXIuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4gCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcC1sZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wLWxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRCb3VuZHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC00MDEzLDE2ICszNzI0LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyByZWN0YW5nbGUgZm9yIHRoaXMgQ29tcG9uZW50IHRvIGJlIHRoZSByZWN0YW5nbGUgd2l0aCB0aGUgc3BlY2lmaWVkIAotICAgICAqIHgseSBjb29yZGluYXRlcyBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIGFuZCB0aGUgd2lkdGggYW5kIGhlaWdodAotICAgICAqIGFuZCBwb3N0cyB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzLgorICAgICAqIFNldHMgcmVjdGFuZ2xlIGZvciB0aGlzIENvbXBvbmVudCB0byBiZSB0aGUgcmVjdGFuZ2xlIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIHgseSBjb29yZGluYXRlcyBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIGFuZCB0aGUgd2lkdGggYW5kIGhlaWdodCBhbmQgcG9zdHMKKyAgICAgKiB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcC1sZWZ0IGNvcm5lci4KLSAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AtbGVmdCBjb3JuZXIuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4gCi0gICAgICogQHBhcmFtIGJNYXNrIHRoZSBiaXRtYXNrIG9mIGJvdW5kcyBvcHRpb25zCi0gICAgICogQHBhcmFtIHVwZGF0ZUJlaGF2aW9yIHRoZSB3aGV0aGVyIHRvIHVwZGF0ZSB0aGUgYmVoYXZvaXIncyBib3VuZHMgYXMgd2VsbAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AtbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcC1sZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGJNYXNrCisgICAgICogICAgICAgICAgICB0aGUgYml0bWFzayBvZiBib3VuZHMgb3B0aW9ucy4KKyAgICAgKiBAcGFyYW0gdXBkYXRlQmVoYXZpb3IKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aGV0aGVyIHRvIHVwZGF0ZSB0aGUgYmVoYXZvaXIncyBib3VuZHMgYXMgd2VsbC4KICAgICAgKi8KICAgICB2b2lkIHNldEJvdW5kcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGJNYXNrLCBib29sZWFuIHVwZGF0ZUJlaGF2aW9yKSB7CiAgICAgICAgIGludCBvbGRYID0gdGhpcy54OwpAQCAtNDAzMiw3ICszNzQ5LDcgQEAKICAgICAgICAgc2V0Qm91bmRzRmllbGRzKHgsIHksIHcsIGgsIGJNYXNrKTsKICAgICAgICAgLy8gTW92ZWQKICAgICAgICAgaWYgKChvbGRYICE9IHRoaXMueCkgfHwgKG9sZFkgIT0gdGhpcy55KSkgewotICAgICAgICAgICAgLy8/Pz9BV1Q6IGludmFsaWRhdGVSZWFsUGFyZW50KCk7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IGludmFsaWRhdGVSZWFsUGFyZW50KCk7CiAgICAgICAgICAgICBwb3N0RXZlbnQobmV3IENvbXBvbmVudEV2ZW50KHRoaXMsIENvbXBvbmVudEV2ZW50LkNPTVBPTkVOVF9NT1ZFRCkpOwogICAgICAgICAgICAgc3ByZWFkSGllcmFyY2h5Qm91bmRzRXZlbnRzKHRoaXMsIEhpZXJhcmNoeUV2ZW50LkFOQ0VTVE9SX01PVkVEKTsKICAgICAgICAgfQpAQCAtNDA1MSw3ICszNzY4LDggQEAKICAgICAvKioKICAgICAgKiBDYWxscyBJbnB1dENvbnRleHRJbXBsLm5vdGlmeUNsaWVudFdpbmRvd0NoYW5nZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJvdW5kcyB0aGUgYm91bmRzCisgICAgICogQHBhcmFtIGJvdW5kcworICAgICAqICAgICAgICAgICAgdGhlIGJvdW5kcy4KICAgICAgKi8KICAgICB2b2lkIG5vdGlmeUlucHV0TWV0aG9kKFJlY3RhbmdsZSBib3VuZHMpIHsKICAgICAgICAgLy8gb25seSBXaW5kb3cgYWN0dWFsbHkgbm90aWZpZXMgSU0gb2YgYm91bmRzIGNoYW5nZQpAQCAtNDA2MCwxMSArMzc3OCwxNiBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGJvdW5kcyBmaWVsZHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHgKLSAgICAgKiBAcGFyYW0geSB0aGUgeQotICAgICAqIEBwYXJhbSB3IHRoZSB3Ci0gICAgICogQHBhcmFtIGggdGhlIGgKLSAgICAgKiBAcGFyYW0gYk1hc2sgdGhlIGIgbWFzaworICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3LgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaC4KKyAgICAgKiBAcGFyYW0gYk1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiIG1hc2suCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHNldEJvdW5kc0ZpZWxkcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGJNYXNrKSB7CiAgICAgICAgIGlmICgoYk1hc2sgJiBOYXRpdmVXaW5kb3cuQk9VTkRTX05PU0laRSkgPT0gMCkgewpAQCAtNDA4MCw3ICszODAzLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBuYXRpdmUgaW5zZXRzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hdGl2ZSBpbnNldHMKKyAgICAgKiBAcmV0dXJuIHRoZSBuYXRpdmUgaW5zZXRzLgogICAgICAqLwogICAgIEluc2V0cyBnZXROYXRpdmVJbnNldHMoKSB7CiAgICAgICAgIHJldHVybiBuZXcgSW5zZXRzKDAsIDAsIDAsIDApOwpAQCAtNDA4OSw3ICszODEyLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBpbnNldHMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW5zZXRzCisgICAgICogQHJldHVybiB0aGUgaW5zZXRzLgogICAgICAqLwogICAgIEluc2V0cyBnZXRJbnNldHMoKSB7CiAgICAgICAgIHJldHVybiBuZXcgSW5zZXRzKDAsIDAsIDAsIDApOwpAQCAtNDA5OCw3ICszODIxLDcgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgaXMgbW91c2UgZXhpdGVkIGV4cGVjdGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgbW91c2UgZXhpdGVkIGV4cGVjdGVkCisgICAgICogQHJldHVybiB0cnVlLCBpZiBpcyBtb3VzZSBleGl0ZWQgZXhwZWN0ZWQuCiAgICAgICovCiAgICAgYm9vbGVhbiBpc01vdXNlRXhpdGVkRXhwZWN0ZWQoKSB7CiAgICAgICAgIHJldHVybiBtb3VzZUV4aXRlZEV4cGVjdGVkOwpAQCAtNDEwNyw3ICszODMwLDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBtb3VzZSBleGl0ZWQgZXhwZWN0ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV4cGVjdGVkIHRoZSBuZXcgbW91c2UgZXhpdGVkIGV4cGVjdGVkCisgICAgICogQHBhcmFtIGV4cGVjdGVkCisgICAgICogICAgICAgICAgICB0aGUgbmV3IG1vdXNlIGV4aXRlZCBleHBlY3RlZC4KICAgICAgKi8KICAgICB2b2lkIHNldE1vdXNlRXhpdGVkRXhwZWN0ZWQoYm9vbGVhbiBleHBlY3RlZCkgewogICAgICAgICBtb3VzZUV4aXRlZEV4cGVjdGVkID0gZXhwZWN0ZWQ7CkBAIC00MTE2LDcgKzM4NDAsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIG5ldyBib3VuZGluZyByZWN0YW5nbGUgZm9yIHRoaXMgQ29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSByIHRoZSBuZXcgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGJvdW5kaW5nIHJlY3RhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRCb3VuZHMoUmVjdGFuZ2xlIHIpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC00MTI4LDEwICszODUzLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29tcG9uZW50IG9yaWVudGF0aW9uIHdoaWNoIGFmZmVjdHMgdGhlIGNvbXBvbmVudCdzCi0gICAgICogZWxlbWVudHMgYW5kIHRleHQgd2l0aGluIHRoaXMgY29tcG9uZW50LiAKKyAgICAgKiBTZXRzIHRoZSBjb21wb25lbnQgb3JpZW50YXRpb24gd2hpY2ggYWZmZWN0cyB0aGUgY29tcG9uZW50J3MgZWxlbWVudHMgYW5kCisgICAgICogdGV4dCB3aXRoaW4gdGhpcyBjb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIG8gdGhlIENvbXBvbmVudE9yaWVudGF0aW9uIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gbworICAgICAqICAgICAgICAgICAgdGhlIENvbXBvbmVudE9yaWVudGF0aW9uIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRPcmllbnRhdGlvbihDb21wb25lbnRPcmllbnRhdGlvbiBvKSB7CiAgICAgICAgIENvbXBvbmVudE9yaWVudGF0aW9uIG9sZE9yaWVudGF0aW9uOwpAQCAtNDE0OSw3ICszODc1LDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgY3Vyc29yIGZvciB0aGlzIENvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY3Vyc29yIHRoZSBuZXcgQ3Vyc29yLgorICAgICAqIEBwYXJhbSBjdXJzb3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgQ3Vyc29yLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEN1cnNvcihDdXJzb3IgY3Vyc29yKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtNDE2OCwyNiArMzg5NSwyMCBAQAogICAgICAgICBpZiAoaXNEaXNwbGF5YWJsZSgpICYmIGlzU2hvd2luZygpKSB7CiAgICAgICAgICAgICBSZWN0YW5nbGUgYWJzUmVjdCA9IG5ldyBSZWN0YW5nbGUoZ2V0TG9jYXRpb25PblNjcmVlbigpLCBnZXRTaXplKCkpOwogICAgICAgICAgICAgUG9pbnQgYWJzUG9pbnRlclBvcyA9IHRvb2xraXQuZGlzcGF0Y2hlci5tb3VzZURpc3BhdGNoZXIuZ2V0UG9pbnRlclBvcygpOwotICAgICAgICAgICAgLy8/Pz9BV1QKKyAgICAgICAgICAgIC8vID8/P0FXVAogICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIGlmIChhYnNSZWN0LmNvbnRhaW5zKGFic1BvaW50ZXJQb3MpKSB7Ci0gICAgICAgICAgICAgICAgLy8gc2V0IEN1cnNvciBvbmx5IG9uIHRvcC1sZXZlbCBXaW5kb3dzKG9uIFgxMSkKLSAgICAgICAgICAgICAgICBXaW5kb3cgdG9wTGV2ZWxXbmQgPSBnZXRXaW5kb3dBbmNlc3RvcigpOwotICAgICAgICAgICAgICAgIGlmICh0b3BMZXZlbFduZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBvaW50IHBvaW50ZXJQb3MgPSBNb3VzZURpc3BhdGNoZXIuY29udmVydFBvaW50KG51bGwsIGFic1BvaW50ZXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wTGV2ZWxXbmQpOwotICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQgY29tcFVuZGVyQ3Vyc29yID0gdG9wTGV2ZWxXbmQuZmluZENvbXBvbmVudEF0KHBvaW50ZXJQb3MpOwotICAgICAgICAgICAgICAgICAgICAvLyBpZiAoY29tcFVuZGVyQ3Vyc29yID09IHRoaXMgfHwKLSAgICAgICAgICAgICAgICAgICAgLy8gY29tcFVuZGVyQ3Vyc29yLmdldEN1cnNvckFuY2VzdG9yKCkgPT0gdGhpcykgewotICAgICAgICAgICAgICAgICAgICBOYXRpdmVXaW5kb3cgd25kID0gdG9wTGV2ZWxXbmQuZ2V0TmF0aXZlV2luZG93KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wVW5kZXJDdXJzb3IgIT0gbnVsbCAmJiB3bmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29tcFVuZGVyQ3Vyc29yLmdldFJlYWxDdXJzb3IoKS5nZXROYXRpdmVDdXJzb3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q3Vyc29yKHduZC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAqIGlmIChhYnNSZWN0LmNvbnRhaW5zKGFic1BvaW50ZXJQb3MpKSB7IC8vIHNldCBDdXJzb3Igb25seSBvbgorICAgICAgICAgICAgICogdG9wLWxldmVsIFdpbmRvd3Mob24gWDExKSBXaW5kb3cgdG9wTGV2ZWxXbmQgPQorICAgICAgICAgICAgICogZ2V0V2luZG93QW5jZXN0b3IoKTsgaWYgKHRvcExldmVsV25kICE9IG51bGwpIHsgUG9pbnQgcG9pbnRlclBvcworICAgICAgICAgICAgICogPSBNb3VzZURpc3BhdGNoZXIuY29udmVydFBvaW50KG51bGwsIGFic1BvaW50ZXJQb3MsIHRvcExldmVsV25kKTsKKyAgICAgICAgICAgICAqIENvbXBvbmVudCBjb21wVW5kZXJDdXJzb3IgPQorICAgICAgICAgICAgICogdG9wTGV2ZWxXbmQuZmluZENvbXBvbmVudEF0KHBvaW50ZXJQb3MpOyAvLyBpZiAoY29tcFVuZGVyQ3Vyc29yCisgICAgICAgICAgICAgKiA9PSB0aGlzIHx8IC8vIGNvbXBVbmRlckN1cnNvci5nZXRDdXJzb3JBbmNlc3RvcigpID09IHRoaXMpIHsKKyAgICAgICAgICAgICAqIE5hdGl2ZVdpbmRvdyB3bmQgPSB0b3BMZXZlbFduZC5nZXROYXRpdmVXaW5kb3coKTsgaWYKKyAgICAgICAgICAgICAqIChjb21wVW5kZXJDdXJzb3IgIT0gbnVsbCAmJiB3bmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICogY29tcFVuZGVyQ3Vyc29yLmdldFJlYWxDdXJzb3IoKS5nZXROYXRpdmVDdXJzb3IoKQorICAgICAgICAgICAgICogLnNldEN1cnNvcih3bmQuZ2V0SWQoKSk7IH0gLy8gfSB9IH0KKyAgICAgICAgICAgICAqLwogICAgICAgICB9CiAgICAgfQogCkBAIC00MTk1LDY4ICszOTE2LDQ0IEBACiAgICAgICogR2V0cyB0aGUgYW5jZXN0b3IgQ3Vyc29yIGlmIENvbXBvbmVudCBpcyBkaXNhYmxlZCAoZGlyZWN0bHkgb3IgdmlhIGFuCiAgICAgICogYW5jZXN0b3IpIGV2ZW4gaWYgQ3Vyc29yIGlzIGV4cGxpY2l0bHkgc2V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFjdHVhbCBDdXJzb3IgdG8gYmUgZGlzcGxheWVkCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgYWN0dWFsIEN1cnNvciB0byBiZSBkaXNwbGF5ZWQuCiAgICAgICovCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIEN1cnNvciBnZXRSZWFsQ3Vyc29yKCkgewotICAgICAgICBDb21wb25lbnQgY3Vyc29yQW5jZXN0b3IgPSBnZXRDdXJzb3JBbmNlc3RvcigpOwotICAgICAgICByZXR1cm4gY3Vyc29yQW5jZXN0b3IgIT0gbnVsbCA/IGN1cnNvckFuY2VzdG9yLmdldEN1cnNvcigpIDogQ3Vyc29yLmdldERlZmF1bHRDdXJzb3IoKTsKLSAgICB9Ci0gICAgKi8KKyAgICAgKiBDdXJzb3IgZ2V0UmVhbEN1cnNvcigpIHsgQ29tcG9uZW50IGN1cnNvckFuY2VzdG9yID0gZ2V0Q3Vyc29yQW5jZXN0b3IoKTsKKyAgICAgKiByZXR1cm4gY3Vyc29yQW5jZXN0b3IgIT0gbnVsbCA/IGN1cnNvckFuY2VzdG9yLmdldEN1cnNvcigpIDoKKyAgICAgKiBDdXJzb3IuZ2V0RGVmYXVsdEN1cnNvcigpOyB9CisgICAgICovCiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBhbmNlc3RvcihvciBjb21wb25lbnQgaXRzZWxmKSB3aG9zZSBjdXJzb3IgaXMgc2V0IHdoZW4gcG9pbnRlcgogICAgICAqIGlzIGluc2lkZSBjb21wb25lbnQKICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFjdHVhbCBDdXJzb3IgdG8gYmUgZGlzcGxheWVkCisgICAgICogQHJldHVybiB0aGUgYWN0dWFsIEN1cnNvciB0byBiZSBkaXNwbGF5ZWQuCiAgICAgICovCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIENvbXBvbmVudCBnZXRDdXJzb3JBbmNlc3RvcigpIHsKLSAgICAgICAgQ29tcG9uZW50IGNvbXA7Ci0gICAgICAgIGZvciAoY29tcCA9IHRoaXM7IGNvbXAgIT0gbnVsbDsgY29tcCA9IGNvbXAuZ2V0UGFyZW50KCkpIHsKLSAgICAgICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgV2luZG93IHx8IGNvbXAuaXNDdXJzb3JTZXQoKSAmJiBjb21wLmlzS2V5RW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorICAgICAqIENvbXBvbmVudCBnZXRDdXJzb3JBbmNlc3RvcigpIHsgQ29tcG9uZW50IGNvbXA7IGZvciAoY29tcCA9IHRoaXM7IGNvbXAgIT0KKyAgICAgKiBudWxsOyBjb21wID0gY29tcC5nZXRQYXJlbnQoKSkgeyBpZiAoY29tcCBpbnN0YW5jZW9mIFdpbmRvdyB8fAorICAgICAqIGNvbXAuaXNDdXJzb3JTZXQoKSAmJiBjb21wLmlzS2V5RW5hYmxlZCgpKSB7IHJldHVybiBjb21wOyB9IH0gcmV0dXJuCisgICAgICogbnVsbDsgfSBwdWJsaWMgdm9pZCBzZXREcm9wVGFyZ2V0KERyb3BUYXJnZXQgZHQpIHsgdG9vbGtpdC5sb2NrQVdUKCk7IHRyeQorICAgICAqIHsgaWYgKGRyb3BUYXJnZXQgPT0gZHQpIHsgcmV0dXJuOyB9IERyb3BUYXJnZXQgb2xkRHJvcFRhcmdldCA9CisgICAgICogZHJvcFRhcmdldDsgZHJvcFRhcmdldCA9IGR0OyBpZiAob2xkRHJvcFRhcmdldCAhPSBudWxsKSB7IGlmCisgICAgICogKGJlaGF2aW91ci5pc0Rpc3BsYXlhYmxlKCkpIHsgb2xkRHJvcFRhcmdldC5yZW1vdmVOb3RpZnkocGVlcik7IH0KKyAgICAgKiBvbGREcm9wVGFyZ2V0LnNldENvbXBvbmVudChudWxsKTsgfSBpZiAoZHQgIT0gbnVsbCkgeworICAgICAqIGR0LnNldENvbXBvbmVudCh0aGlzKTsgaWYgKGJlaGF2aW91ci5pc0Rpc3BsYXlhYmxlKCkpIHsKKyAgICAgKiBkdC5hZGROb3RpZnkocGVlcik7IH0gfSB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKi8KIAotICAgIHB1YmxpYyB2b2lkIHNldERyb3BUYXJnZXQoRHJvcFRhcmdldCBkdCkgewotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChkcm9wVGFyZ2V0ID09IGR0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRHJvcFRhcmdldCBvbGREcm9wVGFyZ2V0ID0gZHJvcFRhcmdldDsKLSAgICAgICAgICAgIGRyb3BUYXJnZXQgPSBkdDsKLSAgICAgICAgICAgIGlmIChvbGREcm9wVGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYmVoYXZpb3VyLmlzRGlzcGxheWFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICBvbGREcm9wVGFyZ2V0LnJlbW92ZU5vdGlmeShwZWVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2xkRHJvcFRhcmdldC5zZXRDb21wb25lbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGR0LnNldENvbXBvbmVudCh0aGlzKTsKLSAgICAgICAgICAgICAgICBpZiAoYmVoYXZpb3VyLmlzRGlzcGxheWFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICBkdC5hZGROb3RpZnkocGVlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAqLwotICAgIAogICAgIC8qKgotICAgICAqIFNldHMgdGhpcyBjb21wb25lbnQgdG8gdGhlICJlbmFibGVkIiBvciAiZGlzYWJsZWQiIHN0YXRlIGRlcGVuZGluZwotICAgICAqIG9uIHRoZSBzcGVjaWZpZWQgYm9vbGVhbiBwYXJhbWV0ZXIuCisgICAgICogU2V0cyB0aGlzIGNvbXBvbmVudCB0byB0aGUgImVuYWJsZWQiIG9yICJkaXNhYmxlZCIgc3RhdGUgZGVwZW5kaW5nIG9uIHRoZQorICAgICAqIHNwZWNpZmllZCBib29sZWFuIHBhcmFtZXRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBzaG91bGQgYmUgZW5hYmxlZDsgZmFsc2UKLSAgICAgKiBpZiB0aGlzIGNvbXBvbmVudCBzaG91bGQgYmUgZGlzYWJsZWQuCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0cnVlIGlmIHRoaXMgY29tcG9uZW50IHNob3VsZCBiZSBlbmFibGVkOyBmYWxzZSBpZiB0aGlzCisgICAgICogICAgICAgICAgICBjb21wb25lbnQgc2hvdWxkIGJlIGRpc2FibGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiB2YWx1ZSkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTQyNzAsNyArMzk2Nyw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZW5hYmxlZCBpbXBsLgogICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGVuYWJsZWQgaW1wbAorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBlbmFibGVkIGltcGwuCiAgICAgICovCiAgICAgdm9pZCBzZXRFbmFibGVkSW1wbChib29sZWFuIHZhbHVlKSB7CiAgICAgICAgIGlmIChlbmFibGVkICE9IHZhbHVlKSB7CkBAIC00MjgzLDc3ICszOTgxLDQ5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLz8/P0FXVAorICAgIC8vID8/P0FXVAogICAgIC8qCi0gICAgcHJpdmF0ZSB2b2lkIGZpcmVBY2Nlc3NpYmxlU3RhdGVDaGFuZ2UoQWNjZXNzaWJsZVN0YXRlIHN0YXRlLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGlmIChiZWhhdmlvdXIuaXNMaWdodHdlaWdodCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgQWNjZXNzaWJsZUNvbnRleHQgYWMgPSBnZXRBY2Nlc3NpYmxlQ29udGV4dCgpOwotICAgICAgICBpZiAoYWMgIT0gbnVsbCkgewotICAgICAgICAgICAgQWNjZXNzaWJsZVN0YXRlIG9sZFZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIEFjY2Vzc2libGVTdGF0ZSBuZXdWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAodmFsdWUpIHsKLSAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IHN0YXRlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvbGRWYWx1ZSA9IHN0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWMuZmlyZVByb3BlcnR5Q2hhbmdlKEFjY2Vzc2libGVDb250ZXh0LkFDQ0VTU0lCTEVfU1RBVEVfUFJPUEVSVFksIG9sZFZhbHVlLAotICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KKyAgICAgKiBwcml2YXRlIHZvaWQgZmlyZUFjY2Vzc2libGVTdGF0ZUNoYW5nZShBY2Nlc3NpYmxlU3RhdGUgc3RhdGUsIGJvb2xlYW4KKyAgICAgKiB2YWx1ZSkgeyBpZiAoYmVoYXZpb3VyLmlzTGlnaHR3ZWlnaHQoKSkgeyByZXR1cm47IH0gQWNjZXNzaWJsZUNvbnRleHQgYWMKKyAgICAgKiA9IGdldEFjY2Vzc2libGVDb250ZXh0KCk7IGlmIChhYyAhPSBudWxsKSB7IEFjY2Vzc2libGVTdGF0ZSBvbGRWYWx1ZSA9CisgICAgICogbnVsbDsgQWNjZXNzaWJsZVN0YXRlIG5ld1ZhbHVlID0gbnVsbDsgaWYgKHZhbHVlKSB7IG5ld1ZhbHVlID0gc3RhdGU7IH0KKyAgICAgKiBlbHNlIHsgb2xkVmFsdWUgPSBzdGF0ZTsgfQorICAgICAqIGFjLmZpcmVQcm9wZXJ0eUNoYW5nZShBY2Nlc3NpYmxlQ29udGV4dC5BQ0NFU1NJQkxFX1NUQVRFX1BST1BFUlRZLAorICAgICAqIG9sZFZhbHVlLCBuZXdWYWx1ZSk7IH0gfQorICAgICAqLwogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzVHJhdmVyc2FsS2V5cyhpbnQgaWQsIFNldDw/IGV4dGVuZHMgQVdUS2V5U3Ryb2tlPiBrZXlzdHJva2VzKSB7Ci0gICAgICAgIFNldDw/IGV4dGVuZHMgQVdUS2V5U3Ryb2tlPiBvbGRUcmF2ZXJzYWxLZXlzOwotICAgICAgICBTdHJpbmcgcHJvcE5hbWUgPSAiRm9jdXNUcmF2ZXJzYWxLZXlzIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEludGVnZXIga0lkID0gbmV3IEludGVnZXIoaWQpOwotICAgICAgICAgICAgS2V5Ym9hcmRGb2N1c01hbmFnZXIuY2hlY2tUcmF2ZXJzYWxLZXlzSUQodHJhdmVyc2FsS2V5cywga0lkKTsKLSAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBTZXQ8PyBleHRlbmRzIEFXVEtleVN0cm9rZT4+IGtleXMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTZXQ8PyBleHRlbmRzIEFXVEtleVN0cm9rZT4+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBraWQgOiB0cmF2ZXJzYWxJRHMpIHsKLSAgICAgICAgICAgICAgICBJbnRlZ2VyIGtleSA9IG5ldyBJbnRlZ2VyKGtpZCk7Ci0gICAgICAgICAgICAgICAga2V5cy5wdXQoa2V5LCBnZXRGb2N1c1RyYXZlcnNhbEtleXMoa2lkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBLZXlib2FyZEZvY3VzTWFuYWdlci5jaGVja0tleVN0cm9rZXModHJhdmVyc2FsSURzLCBrZXlzLCBrSWQsIGtleXN0cm9rZXMpOwotICAgICAgICAgICAgb2xkVHJhdmVyc2FsS2V5cyA9IHRyYXZlcnNhbEtleXMuZ2V0KG5ldyBJbnRlZ2VyKGlkKSk7Ci0gICAgICAgICAgICAvLyBwdXQgYSBjb3B5IG9mIGtleXN0cm9rZXMgb2JqZWN0IGludG8gbWFwOgotICAgICAgICAgICAgU2V0PD8gZXh0ZW5kcyBBV1RLZXlTdHJva2U+IG5ld0tleXMgPSBrZXlzdHJva2VzOwotICAgICAgICAgICAgaWYgKGtleXN0cm9rZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5ld0tleXMgPSBuZXcgSGFzaFNldDxBV1RLZXlTdHJva2U+KGtleXN0cm9rZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJhdmVyc2FsS2V5cy5wdXQoa0lkLCBuZXdLZXlzKTsKLSAgICAgICAgICAgIFN0cmluZyBkaXJlY3Rpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgc3dpdGNoIChpZCkgewotICAgICAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmRGb2N1c01hbmFnZXIuRk9SV0FSRF9UUkFWRVJTQUxfS0VZUzoKLSAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImZvcndhcmQiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmRGb2N1c01hbmFnZXIuQkFDS1dBUkRfVFJBVkVSU0FMX0tFWVM6Ci0gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJiYWNrd2FyZCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLZXlib2FyZEZvY3VzTWFuYWdlci5VUF9DWUNMRV9UUkFWRVJTQUxfS0VZUzoKLSAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gInVwQ3ljbGUiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmRGb2N1c01hbmFnZXIuRE9XTl9DWUNMRV9UUkFWRVJTQUxfS0VZUzoKLSAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImRvd25DeWNsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9wTmFtZSA9IGRpcmVjdGlvbiArIHByb3BOYW1lOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UocHJvcE5hbWUsIG9sZFRyYXZlcnNhbEtleXMsIGtleXN0cm9rZXMpOwotICAgIH0KLSAgICAqLworICAgICAqIHB1YmxpYyB2b2lkIHNldEZvY3VzVHJhdmVyc2FsS2V5cyhpbnQgaWQsIFNldDw/IGV4dGVuZHMgQVdUS2V5U3Ryb2tlPgorICAgICAqIGtleXN0cm9rZXMpIHsgU2V0PD8gZXh0ZW5kcyBBV1RLZXlTdHJva2U+IG9sZFRyYXZlcnNhbEtleXM7IFN0cmluZworICAgICAqIHByb3BOYW1lID0gIkZvY3VzVHJhdmVyc2FsS2V5cyI7IC8vJE5PTi1OTFMtMSQgdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7CisgICAgICogSW50ZWdlciBrSWQgPSBuZXcgSW50ZWdlcihpZCk7CisgICAgICogS2V5Ym9hcmRGb2N1c01hbmFnZXIuY2hlY2tUcmF2ZXJzYWxLZXlzSUQodHJhdmVyc2FsS2V5cywga0lkKTsKKyAgICAgKiBNYXA8SW50ZWdlciwgU2V0PD8gZXh0ZW5kcyBBV1RLZXlTdHJva2U+PiBrZXlzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwKKyAgICAgKiBTZXQ8PyBleHRlbmRzIEFXVEtleVN0cm9rZT4+KCk7IGZvciAoaW50IGtpZCA6IHRyYXZlcnNhbElEcykgeyBJbnRlZ2VyCisgICAgICoga2V5ID0gbmV3IEludGVnZXIoa2lkKTsga2V5cy5wdXQoa2V5LCBnZXRGb2N1c1RyYXZlcnNhbEtleXMoa2lkKSk7IH0KKyAgICAgKiBLZXlib2FyZEZvY3VzTWFuYWdlci5jaGVja0tleVN0cm9rZXModHJhdmVyc2FsSURzLCBrZXlzLCBrSWQsCisgICAgICoga2V5c3Ryb2tlcyk7IG9sZFRyYXZlcnNhbEtleXMgPSB0cmF2ZXJzYWxLZXlzLmdldChuZXcgSW50ZWdlcihpZCkpOyAvLworICAgICAqIHB1dCBhIGNvcHkgb2Yga2V5c3Ryb2tlcyBvYmplY3QgaW50byBtYXA6IFNldDw/IGV4dGVuZHMgQVdUS2V5U3Ryb2tlPgorICAgICAqIG5ld0tleXMgPSBrZXlzdHJva2VzOyBpZiAoa2V5c3Ryb2tlcyAhPSBudWxsKSB7IG5ld0tleXMgPSBuZXcKKyAgICAgKiBIYXNoU2V0PEFXVEtleVN0cm9rZT4oa2V5c3Ryb2tlcyk7IH0gdHJhdmVyc2FsS2V5cy5wdXQoa0lkLCBuZXdLZXlzKTsKKyAgICAgKiBTdHJpbmcgZGlyZWN0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQgc3dpdGNoIChpZCkgeyBjYXNlCisgICAgICogS2V5Ym9hcmRGb2N1c01hbmFnZXIuRk9SV0FSRF9UUkFWRVJTQUxfS0VZUzogZGlyZWN0aW9uID0gImZvcndhcmQiOworICAgICAqIC8vJE5PTi1OTFMtMSQgYnJlYWs7IGNhc2UgS2V5Ym9hcmRGb2N1c01hbmFnZXIuQkFDS1dBUkRfVFJBVkVSU0FMX0tFWVM6CisgICAgICogZGlyZWN0aW9uID0gImJhY2t3YXJkIjsgLy8kTk9OLU5MUy0xJCBicmVhazsgY2FzZQorICAgICAqIEtleWJvYXJkRm9jdXNNYW5hZ2VyLlVQX0NZQ0xFX1RSQVZFUlNBTF9LRVlTOiBkaXJlY3Rpb24gPSAidXBDeWNsZSI7CisgICAgICogLy8kTk9OLU5MUy0xJCBicmVhazsgY2FzZSBLZXlib2FyZEZvY3VzTWFuYWdlci5ET1dOX0NZQ0xFX1RSQVZFUlNBTF9LRVlTOgorICAgICAqIGRpcmVjdGlvbiA9ICJkb3duQ3ljbGUiOyAvLyROT04tTkxTLTEkIGJyZWFrOyB9IHByb3BOYW1lID0gZGlyZWN0aW9uICsKKyAgICAgKiBwcm9wTmFtZTsgfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfSBmaXJlUHJvcGVydHlDaGFuZ2UocHJvcE5hbWUsCisgICAgICogb2xkVHJhdmVyc2FsS2V5cywga2V5c3Ryb2tlcyk7IH0KKyAgICAgKi8KIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGZvY3VzIHRyYXZlcnNhbCBrZXlzIHN0YXRlIGZvciB0aGlzIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpZiB0aGUgZm9jdXMgdHJhdmVyc2FsIGtleXMgc3RhdGUgaXMgZW5hYmxlZCwKLSAgICAgKiBmYWxzZSBpZiB0aGUgZm9jdXMgdHJhdmVyc2FsIGtleXMgc3RhdGUgaXMgZGlzYWJsZWQuCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0cnVlIGlmIHRoZSBmb2N1cyB0cmF2ZXJzYWwga2V5cyBzdGF0ZSBpcyBlbmFibGVkLCBmYWxzZSBpZgorICAgICAqICAgICAgICAgICAgdGhlIGZvY3VzIHRyYXZlcnNhbCBrZXlzIHN0YXRlIGlzIGRpc2FibGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzVHJhdmVyc2FsS2V5c0VuYWJsZWQoYm9vbGVhbiB2YWx1ZSkgewogICAgICAgICBib29sZWFuIG9sZEZvY3VzVHJhdmVyc2FsS2V5c0VuYWJsZWQ7CkBAIC00MzY4LDM4ICs0MDM4LDIzIEBACiAgICAgICAgICAgICAgICAgZm9jdXNUcmF2ZXJzYWxLZXlzRW5hYmxlZCk7CiAgICAgfQogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzYWJsZShib29sZWFuIGZvY3VzYWJsZSkgewotICAgICAgICBib29sZWFuIG9sZEZvY3VzYWJsZTsKLSAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjYWxsZWRTZXRGb2N1c2FibGUgPSB0cnVlOwotICAgICAgICAgICAgb2xkRm9jdXNhYmxlID0gdGhpcy5mb2N1c2FibGU7Ci0gICAgICAgICAgICB0aGlzLmZvY3VzYWJsZSA9IGZvY3VzYWJsZTsKLSAgICAgICAgICAgIGlmICghZm9jdXNhYmxlKSB7Ci0gICAgICAgICAgICAgICAgbW92ZUZvY3VzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICB9Ci0gICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiZm9jdXNhYmxlIiwgb2xkRm9jdXNhYmxlLCBmb2N1c2FibGUpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIEZvbnQgZ2V0Rm9udCgpIHsKLSAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gKGZvbnQgPT0gbnVsbCkgJiYgKHBhcmVudCAhPSBudWxsKSA/IHBhcmVudC5nZXRGb250KCkgOiBmb250OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAqLworICAgICAqIHB1YmxpYyB2b2lkIHNldEZvY3VzYWJsZShib29sZWFuIGZvY3VzYWJsZSkgeyBib29sZWFuIG9sZEZvY3VzYWJsZTsKKyAgICAgKiB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgY2FsbGVkU2V0Rm9jdXNhYmxlID0gdHJ1ZTsgb2xkRm9jdXNhYmxlID0KKyAgICAgKiB0aGlzLmZvY3VzYWJsZTsgdGhpcy5mb2N1c2FibGUgPSBmb2N1c2FibGU7IGlmICghZm9jdXNhYmxlKSB7CisgICAgICogbW92ZUZvY3VzKCk7IH0gfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfQorICAgICAqIGZpcmVQcm9wZXJ0eUNoYW5nZSgiZm9jdXNhYmxlIiwgb2xkRm9jdXNhYmxlLCBmb2N1c2FibGUpOyAvLyROT04tTkxTLTEkIH0KKyAgICAgKiBwdWJsaWMgRm9udCBnZXRGb250KCkgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgcmV0dXJuIChmb250ID09IG51bGwpICYmCisgICAgICogKHBhcmVudCAhPSBudWxsKSA/IHBhcmVudC5nZXRGb250KCkgOiBmb250OyB9IGZpbmFsbHkgeworICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqLwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZm9udCBmb3IgdGhpcyBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGYgdGhlIG5ldyBmb250IG9mIHRoZSBDb21wb25lbnQuCisgICAgICogQHBhcmFtIGYKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgZm9udCBvZiB0aGUgQ29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZvbnQoRm9udCBmKSB7CiAgICAgICAgIEZvbnQgb2xkRm9udDsKQEAgLTQ0MTYsNyArNDA3MSw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZm9udCBpbXBsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBmIHRoZSBuZXcgZm9udCBpbXBsCisgICAgICogQHBhcmFtIGYKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgZm9udCBpbXBsLgogICAgICAqLwogICAgIHZvaWQgc2V0Rm9udEltcGwoRm9udCBmKSB7CiAgICAgICAgIGZvbnQgPSBmOwpAQCAtNDQyNiwxMiArNDA4MiwxMSBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBJbnZhbGlkYXRlIHRoZSBjb21wb25lbnQgaWYgaXQgaW5oZXJpdHMgdGhlIGZvbnQgZnJvbSB0aGUgcGFyZW50LiBUaGlzCiAgICAgICogbWV0aG9kIGlzIG92ZXJyaWRkZW4gaW4gQ29udGFpbmVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcG9uZW50IHdhcyBpbnZhbGlkYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21wb25lbnQgd2FzIGludmFsaWRhdGVkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgYm9vbGVhbiBwcm9wYWdhdGVGb250KCkgewogICAgICAgICBpZiAoZm9udCA9PSBudWxsKSB7CkBAIC00NDQ0LDcgKzQwOTksOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3IgZm9yIHRoaXMgQ29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjIHRoZSBuZXcgZm9yZWdyb3VuZCBjb2xvci4KKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIG5ldyBmb3JlZ3JvdW5kIGNvbG9yLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZvcmVncm91bmQoQ29sb3IgYykgewogICAgICAgICBDb2xvciBvbGRGZ0NvbG9yOwpAQCAtNDQ2Miw3ICs0MTE4LDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZvciB0aGUgQ29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjIHRoZSBuZXcgYmFja2dyb3VuZCBjb2xvciBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgYmFja2dyb3VuZCBjb2xvciBmb3IgdGhpcyBjb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChDb2xvciBjKSB7CiAgICAgICAgIENvbG9yIG9sZEJrQ29sb3I7CkBAIC00NDc4LDExICs0MTM1LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmxhZyBmb3Igd2hldGhlciBwYWludCBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIHRoZSBvcGVyYXRpbmcgCi0gICAgICogc3lzdGVtIHNob3VsZCBiZSBpZ25vcmVkIG9yIG5vdC4gCisgICAgICogU2V0cyB0aGUgZmxhZyBmb3Igd2hldGhlciBwYWludCBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIHRoZSBvcGVyYXRpbmcKKyAgICAgKiBzeXN0ZW0gc2hvdWxkIGJlIGlnbm9yZWQgb3Igbm90LgogICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0cnVlIGlmIHBhaW50IG1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhlIG9wZXJhdGluZyAKLSAgICAgKiBzeXN0ZW0gc2hvdWxkIGJlIGlnbm9yZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRydWUgaWYgcGFpbnQgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbQorICAgICAqICAgICAgICAgICAgc2hvdWxkIGJlIGlnbm9yZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVSZXBhaW50KGJvb2xlYW4gdmFsdWUpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC00NDk2LDcgKzQxNTQsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGxvY2FsZSBvZiB0aGUgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBsb2NhbGUgdGhlIG5ldyBMb2NhbGUuCisgICAgICogQHBhcmFtIGxvY2FsZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBMb2NhbGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgTG9jYWxlIG9sZExvY2FsZTsKQEAgLTQ1MTMsNyArNDE3Miw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIENvbXBvbmVudCB0byB0aGUgc3BlY2lmaWVkIHBvaW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIHRoZSBuZXcgbG9jYXRpb24gb2YgdGhlIENvbXBvbmVudAorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGxvY2F0aW9uIG9mIHRoZSBDb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oUG9pbnQgcCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTQ1MjUsMTAgKzQxODUsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgQ29tcG9uZW50IHRvIHRoZSBzcGVjaWZpZWQgeCwgeSBjb29yZGluYXRlcy4gIAorICAgICAqIFNldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBDb21wb25lbnQgdG8gdGhlIHNwZWNpZmllZCB4LCB5IGNvb3JkaW5hdGVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihpbnQgeCwgaW50IHkpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC00NTQyLDggKzQyMDQsOSBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHZpc2liaWxpdHkgc3RhdGUgb2YgdGhlIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYiB0cnVlIGlmIHRoZSBjb21wb25lbnQgaXMgdmlzaWJsZSwgZmFsc2UgaWYgdGhlIGNvbXBvbmVudAotICAgICAqIGlzIG5vdCBzaG93bi4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGlzIHZpc2libGUsIGZhbHNlIGlmIHRoZSBjb21wb25lbnQgaXMKKyAgICAgKiAgICAgICAgICAgIG5vdCBzaG93bi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gYikgewogICAgICAgICAvLyBzaG93KCkgJiBoaWRlKCkgYXJlIG5vdCBkZXByZWNhdGVkIGZvciBXaW5kb3csCkBAIC00NTY5LDkgKzQyMzIsOSBAQAogICAgICAgICAgICAgdmlzaWJsZSA9IHRydWU7CiAgICAgICAgICAgICBiZWhhdmlvdXIuc2V0VmlzaWJsZSh0cnVlKTsKICAgICAgICAgICAgIHBvc3RFdmVudChuZXcgQ29tcG9uZW50RXZlbnQodGhpcywgQ29tcG9uZW50RXZlbnQuQ09NUE9ORU5UX1NIT1dOKSk7Ci0gICAgICAgICAgICAvLz8/P0FXVDogZmluaXNoSGllcmFyY2h5Q2hhbmdlKHRoaXMsIHBhcmVudCwgMCk7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IGZpbmlzaEhpZXJhcmNoeUNoYW5nZSh0aGlzLCBwYXJlbnQsIDApOwogICAgICAgICAgICAgbm90aWZ5SW5wdXRNZXRob2QobmV3IFJlY3RhbmdsZSh4LCB5LCB3LCBoKSk7Ci0gICAgICAgICAgICAvLz8/P0FXVDogaW52YWxpZGF0ZVJlYWxQYXJlbnQoKTsKKyAgICAgICAgICAgIC8vID8/P0FXVDogaW52YWxpZGF0ZVJlYWxQYXJlbnQoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7CiAgICAgICAgIH0KQEAgLTQ1ODAsOCArNDI0Myw4IEBACiAgICAgLyoqCiAgICAgICogRGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgc2V0VmlzaWJsZShib29sZWFuKSBtZXRob2QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGIgdGhlIHZpc2liaWxpdHkncyBzdGF0ZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIHZpc2liaWxpdHkncyBzdGF0ZS4KICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBzZXRWaXNpYmxlKGJvb2xlYW4pIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtNDU5Myw5NyArNDI1Niw0MCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHZvaWQgdHJhbnNmZXJGb2N1cyhpbnQgZGlyKSB7Ci0gICAgICAgIENvbnRhaW5lciByb290ID0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBDb250YWluZXIpIHsKLSAgICAgICAgICAgIENvbnRhaW5lciBjb250ID0gKENvbnRhaW5lcikgdGhpczsKLSAgICAgICAgICAgIGlmIChjb250LmlzRm9jdXNDeWNsZVJvb3QoKSkgewotICAgICAgICAgICAgICAgIHJvb3QgPSBjb250LmdldEZvY3VzVHJhdmVyc2FsUm9vdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyb290ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJvb3QgPSBnZXRGb2N1c0N5Y2xlUm9vdEFuY2VzdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gdHJhbnNmZXIgZm9jdXMgdXAgY3ljbGUgaWYgcm9vdCBpcyB1bnJlYWNoYWJsZQotICAgICAgICBDb21wb25lbnQgY29tcCA9IHRoaXM7Ci0gICAgICAgIHdoaWxlICgocm9vdCAhPSBudWxsKQotICAgICAgICAgICAgICAgICYmICEocm9vdC5pc0ZvY3VzQ3ljbGVSb290KCkgJiYgcm9vdC5pc1Nob3dpbmcoKSAmJiByb290LmlzRW5hYmxlZCgpICYmIHJvb3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC5pc0ZvY3VzYWJsZSgpKSkgewotICAgICAgICAgICAgY29tcCA9IHJvb3Q7Ci0gICAgICAgICAgICByb290ID0gcm9vdC5nZXRGb2N1c0N5Y2xlUm9vdEFuY2VzdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIEZvY3VzVHJhdmVyc2FsUG9saWN5IHBvbGljeSA9IHJvb3QuZ2V0Rm9jdXNUcmF2ZXJzYWxQb2xpY3koKTsKLSAgICAgICAgQ29tcG9uZW50IG5leHRDb21wID0gbnVsbDsKLSAgICAgICAgc3dpdGNoIChkaXIpIHsKLSAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmRGb2N1c01hbmFnZXIuRk9SV0FSRF9UUkFWRVJTQUxfS0VZUzoKLSAgICAgICAgICAgICAgICBuZXh0Q29tcCA9IHBvbGljeS5nZXRDb21wb25lbnRBZnRlcihyb290LCBjb21wKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmRGb2N1c01hbmFnZXIuQkFDS1dBUkRfVFJBVkVSU0FMX0tFWVM6Ci0gICAgICAgICAgICAgICAgbmV4dENvbXAgPSBwb2xpY3kuZ2V0Q29tcG9uZW50QmVmb3JlKHJvb3QsIGNvbXApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZXh0Q29tcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBuZXh0Q29tcC5yZXF1ZXN0Rm9jdXMoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRyYW5zZmVyRm9jdXMoKSB7Ci0gICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV4dEZvY3VzKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdHJhbnNmZXJGb2N1c0JhY2t3YXJkKCkgewotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRyYW5zZmVyRm9jdXMoS2V5Ym9hcmRGb2N1c01hbmFnZXIuQkFDS1dBUkRfVFJBVkVSU0FMX0tFWVMpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRyYW5zZmVyRm9jdXNVcEN5Y2xlKCkgewotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEtleWJvYXJkRm9jdXNNYW5hZ2VyIGtmbSA9IEtleWJvYXJkRm9jdXNNYW5hZ2VyLmdldEN1cnJlbnRLZXlib2FyZEZvY3VzTWFuYWdlcigpOwotICAgICAgICAgICAgQ29udGFpbmVyIHJvb3QgPSBrZm0uZ2V0Q3VycmVudEZvY3VzQ3ljbGVSb290KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKHJvb3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICBDb21wb25lbnQgbmV4dENvbXAgPSBudWxsOwotICAgICAgICAgICAgQ29udGFpbmVyIG5ld1Jvb3QgPSByb290OwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIG5leHRDb21wID0gbmV3Um9vdCBpbnN0YW5jZW9mIFdpbmRvdyA/IG5ld1Jvb3QuZ2V0Rm9jdXNUcmF2ZXJzYWxQb2xpY3koKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRDb21wb25lbnQobmV3Um9vdCkgOiBuZXdSb290OwotICAgICAgICAgICAgICAgIG5ld1Jvb3QgPSBuZXdSb290LmdldEZvY3VzQ3ljbGVSb290QW5jZXN0b3IoKTsKLSAgICAgICAgICAgICAgICBpZiAobmV4dENvbXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IG5leHRDb21wLnJlcXVlc3RGb2N1c0luV2luZG93KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1Jvb3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAga2ZtLnNldEdsb2JhbEN1cnJlbnRGb2N1c0N5Y2xlUm9vdChuZXdSb290KTsKLSAgICAgICAgICAgIH0gd2hpbGUgKCFzdWNjZXNzKTsKLSAgICAgICAgICAgIGlmICghc3VjY2VzcyAmJiByb290ICE9IG5ld1Jvb3QpIHsKLSAgICAgICAgICAgICAgICBrZm0uc2V0R2xvYmFsQ3VycmVudEZvY3VzQ3ljbGVSb290KHJvb3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAqLworICAgICAqIHZvaWQgdHJhbnNmZXJGb2N1cyhpbnQgZGlyKSB7IENvbnRhaW5lciByb290ID0gbnVsbDsgaWYgKHRoaXMgaW5zdGFuY2VvZgorICAgICAqIENvbnRhaW5lcikgeyBDb250YWluZXIgY29udCA9IChDb250YWluZXIpIHRoaXM7IGlmCisgICAgICogKGNvbnQuaXNGb2N1c0N5Y2xlUm9vdCgpKSB7IHJvb3QgPSBjb250LmdldEZvY3VzVHJhdmVyc2FsUm9vdCgpOyB9IH0gaWYKKyAgICAgKiAocm9vdCA9PSBudWxsKSB7IHJvb3QgPSBnZXRGb2N1c0N5Y2xlUm9vdEFuY2VzdG9yKCk7IH0gLy8gdHJhbnNmZXIgZm9jdXMKKyAgICAgKiB1cCBjeWNsZSBpZiByb290IGlzIHVucmVhY2hhYmxlIENvbXBvbmVudCBjb21wID0gdGhpczsgd2hpbGUgKChyb290ICE9CisgICAgICogbnVsbCkgJiYgIShyb290LmlzRm9jdXNDeWNsZVJvb3QoKSAmJiByb290LmlzU2hvd2luZygpICYmCisgICAgICogcm9vdC5pc0VuYWJsZWQoKSAmJiByb290IC5pc0ZvY3VzYWJsZSgpKSkgeyBjb21wID0gcm9vdDsgcm9vdCA9CisgICAgICogcm9vdC5nZXRGb2N1c0N5Y2xlUm9vdEFuY2VzdG9yKCk7IH0gaWYgKHJvb3QgPT0gbnVsbCkgeyByZXR1cm47IH0KKyAgICAgKiBGb2N1c1RyYXZlcnNhbFBvbGljeSBwb2xpY3kgPSByb290LmdldEZvY3VzVHJhdmVyc2FsUG9saWN5KCk7IENvbXBvbmVudAorICAgICAqIG5leHRDb21wID0gbnVsbDsgc3dpdGNoIChkaXIpIHsgY2FzZQorICAgICAqIEtleWJvYXJkRm9jdXNNYW5hZ2VyLkZPUldBUkRfVFJBVkVSU0FMX0tFWVM6IG5leHRDb21wID0KKyAgICAgKiBwb2xpY3kuZ2V0Q29tcG9uZW50QWZ0ZXIocm9vdCwgY29tcCk7IGJyZWFrOyBjYXNlCisgICAgICogS2V5Ym9hcmRGb2N1c01hbmFnZXIuQkFDS1dBUkRfVFJBVkVSU0FMX0tFWVM6IG5leHRDb21wID0KKyAgICAgKiBwb2xpY3kuZ2V0Q29tcG9uZW50QmVmb3JlKHJvb3QsIGNvbXApOyBicmVhazsgfSBpZiAobmV4dENvbXAgIT0gbnVsbCkgeworICAgICAqIG5leHRDb21wLnJlcXVlc3RGb2N1cyhmYWxzZSk7IH0gfSBwdWJsaWMgdm9pZCB0cmFuc2ZlckZvY3VzKCkgeworICAgICAqIHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyBuZXh0Rm9jdXMoKTsgfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfQorICAgICAqIH0gcHVibGljIHZvaWQgdHJhbnNmZXJGb2N1c0JhY2t3YXJkKCkgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsKKyAgICAgKiB0cmFuc2ZlckZvY3VzKEtleWJvYXJkRm9jdXNNYW5hZ2VyLkJBQ0tXQVJEX1RSQVZFUlNBTF9LRVlTKTsgfSBmaW5hbGx5IHsKKyAgICAgKiB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0gcHVibGljIHZvaWQgdHJhbnNmZXJGb2N1c1VwQ3ljbGUoKSB7CisgICAgICogdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7IEtleWJvYXJkRm9jdXNNYW5hZ2VyIGtmbSA9CisgICAgICogS2V5Ym9hcmRGb2N1c01hbmFnZXIuZ2V0Q3VycmVudEtleWJvYXJkRm9jdXNNYW5hZ2VyKCk7IENvbnRhaW5lciByb290ID0KKyAgICAgKiBrZm0uZ2V0Q3VycmVudEZvY3VzQ3ljbGVSb290KCk7IGlmKHJvb3QgPT0gbnVsbCkgeyByZXR1cm47IH0gYm9vbGVhbgorICAgICAqIHN1Y2Nlc3MgPSBmYWxzZTsgQ29tcG9uZW50IG5leHRDb21wID0gbnVsbDsgQ29udGFpbmVyIG5ld1Jvb3QgPSByb290OyBkbworICAgICAqIHsgbmV4dENvbXAgPSBuZXdSb290IGluc3RhbmNlb2YgV2luZG93ID8KKyAgICAgKiBuZXdSb290LmdldEZvY3VzVHJhdmVyc2FsUG9saWN5KCkgLmdldERlZmF1bHRDb21wb25lbnQobmV3Um9vdCkgOgorICAgICAqIG5ld1Jvb3Q7IG5ld1Jvb3QgPSBuZXdSb290LmdldEZvY3VzQ3ljbGVSb290QW5jZXN0b3IoKTsgaWYgKG5leHRDb21wID09CisgICAgICogbnVsbCkgeyBicmVhazsgfSBzdWNjZXNzID0gbmV4dENvbXAucmVxdWVzdEZvY3VzSW5XaW5kb3coKTsgaWYgKG5ld1Jvb3QKKyAgICAgKiA9PSBudWxsKSB7IGJyZWFrOyB9IGtmbS5zZXRHbG9iYWxDdXJyZW50Rm9jdXNDeWNsZVJvb3QobmV3Um9vdCk7IH0gd2hpbGUKKyAgICAgKiAoIXN1Y2Nlc3MpOyBpZiAoIXN1Y2Nlc3MgJiYgcm9vdCAhPSBuZXdSb290KSB7CisgICAgICoga2ZtLnNldEdsb2JhbEN1cnJlbnRGb2N1c0N5Y2xlUm9vdChyb290KTsgfSB9IGZpbmFsbHkgeworICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqLwogCiAgICAgLyoqCiAgICAgICogVmFsaWRhdGVzIHRoYXQgdGhpcyBjb21wb25lbnQgaGFzIGEgdmFsaWQgbGF5b3V0LgpAQCAtNDcxMCw3ICs0MzE2LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBuYXRpdmUgd2luZG93LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hdGl2ZSB3aW5kb3cKKyAgICAgKiBAcmV0dXJuIHRoZSBuYXRpdmUgd2luZG93LgogICAgICAqLwogICAgIE5hdGl2ZVdpbmRvdyBnZXROYXRpdmVXaW5kb3coKSB7CiAgICAgICAgIHJldHVybiBiZWhhdmlvdXIuZ2V0TmF0aXZlV2luZG93KCk7CkBAIC00NzE5LDggKzQzMjUsOCBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCBhIG1heGltdW0gc2l6ZSBpcyBzZXQgZm9yIHRoZSBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgbWF4aW11bSBzaXplIGlzIHNldCBmb3IgdGhlIENvbXBvbmVudCwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgbWF4aW11bSBzaXplIGlzIHNldCBmb3IgdGhlIENvbXBvbmVudCwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc01heGltdW1TaXplU2V0KCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTQ3MzQsOCArNDM0MCw4IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBtaW5pbXVtIHNpemUgaXMgc2V0IGZvciB0aGUgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIG1pbmltdW0gc2l6ZSBpcyBzZXQgZm9yIHRoZSBjb21wb25lbnQsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIG1pbmltdW0gc2l6ZSBpcyBzZXQgZm9yIHRoZSBjb21wb25lbnQsIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNNaW5pbXVtU2l6ZVNldCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC00NzQ5LDggKzQzNTUsOCBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJlZmVycmVkIHNpemUgaXMgc2V0IGZvciB0aGUgQ29tcG9uZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHByZWZlcnJlZCBzaXplIGlzIHNldCBmb3IgdGhlIENvbXBvbmVudCwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcHJlZmVycmVkIHNpemUgaXMgc2V0IGZvciB0aGUgQ29tcG9uZW50LCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzUHJlZmVycmVkU2l6ZVNldCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC00NzY5LDggKzQzNzUsOCBAQAogICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0TWF4aW11bVNpemUoKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGlzTWF4aW11bVNpemVTZXQoKSA/IG5ldyBEaW1lbnNpb24obWF4aW11bVNpemUpIDogbmV3IERpbWVuc2lvbigKLSAgICAgICAgICAgICAgICAgICAgU2hvcnQuTUFYX1ZBTFVFLCBTaG9ydC5NQVhfVkFMVUUpOworICAgICAgICAgICAgcmV0dXJuIGlzTWF4aW11bVNpemVTZXQoKSA/IG5ldyBEaW1lbnNpb24obWF4aW11bVNpemUpIDogbmV3IERpbWVuc2lvbihTaG9ydC5NQVhfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgIFNob3J0Lk1BWF9WQUxVRSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwogICAgICAgICB9CkBAIC00Nzk0LDcgKzQ0MDAsNiBAQAogICAgICAqIERlcHJlY2F0ZWQ6IHJlcGxhY2VkIGJ5IGdldE1pbmltdW1TaXplKCkgbWV0aG9kLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIERpbWVuc2lvbi4KLSAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBnZXRNaW5pbXVtU2l6ZSgpIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtNDgwOCw3ICs0NDEzLDcgQEAKICAgICAgICAgICAgIGlmIChkZWZTaXplICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gKERpbWVuc2lvbilkZWZTaXplLmNsb25lKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaXNEaXNwbGF5YWJsZSgpPyBuZXcgRGltZW5zaW9uKDEsIDEpIDogbmV3IERpbWVuc2lvbih3LCBoKTsKKyAgICAgICAgICAgIHJldHVybiBpc0Rpc3BsYXlhYmxlKCkgPyBuZXcgRGltZW5zaW9uKDEsIDEpIDogbmV3IERpbWVuc2lvbih3LCBoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7CiAgICAgICAgIH0KQEAgLTQ4MzIsNyArNDQzNyw2IEBACiAgICAgICogRGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgZ2V0UHJlZmVycmVkU2l6ZSgpIG1ldGhvZC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBEaW1lbnNpb24uCi0gICAgICogCiAgICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgZ2V0UHJlZmVycmVkU2l6ZSgpIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtNDg1NSw3ICs0NDU5LDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIENvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWF4aW11bVNpemUgdGhlIG5ldyBtYXhpbXVtIHNpemUgb2YgdGhlIENvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gbWF4aW11bVNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgbWF4aW11bSBzaXplIG9mIHRoZSBDb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TWF4aW11bVNpemUoRGltZW5zaW9uIG1heGltdW1TaXplKSB7CiAgICAgICAgIERpbWVuc2lvbiBvbGRNYXhpbXVtU2l6ZTsKQEAgLTQ4ODIsNyArNDQ4Nyw3IEBACiAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgibWF4aW11bVNpemUiLCBvbGRNYXhpbXVtU2l6ZSwgdGhpcy5tYXhpbXVtU2l6ZSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLz8/P0FXVDogaW52YWxpZGF0ZVJlYWxQYXJlbnQoKTsKKyAgICAgICAgICAgIC8vID8/P0FXVDogaW52YWxpZGF0ZVJlYWxQYXJlbnQoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7CiAgICAgICAgIH0KQEAgLTQ4OTEsNyArNDQ5Niw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbWluaW11bSBzaXplIG9mIHRoZSBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIG1pbmltdW1TaXplIHRoZSBuZXcgbWluaW11bSBzaXplIG9mIHRoZSBDb21wb25lbnQuCisgICAgICogQHBhcmFtIG1pbmltdW1TaXplCisgICAgICogICAgICAgICAgICB0aGUgbmV3IG1pbmltdW0gc2l6ZSBvZiB0aGUgQ29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE1pbmltdW1TaXplKERpbWVuc2lvbiBtaW5pbXVtU2l6ZSkgewogICAgICAgICBEaW1lbnNpb24gb2xkTWluaW11bVNpemU7CkBAIC00OTE4LDcgKzQ1MjQsNyBAQAogICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoIm1pbmltdW1TaXplIiwgb2xkTWluaW11bVNpemUsIHRoaXMubWluaW11bVNpemUpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8/Pz9BV1Q6IGludmFsaWRhdGVSZWFsUGFyZW50KCk7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IGludmFsaWRhdGVSZWFsUGFyZW50KCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwogICAgICAgICB9CkBAIC00OTI3LDcgKzQ1MzMsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHByZWZlcnJlZCBzaXplIG9mIHRoZSBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByZWZlcnJlZFNpemUgdGhlIG5ldyBwcmVmZXJyZWQgc2l6ZSBvZiB0aGUgQ29tcG9uZW50LgorICAgICAqIEBwYXJhbSBwcmVmZXJyZWRTaXplCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHByZWZlcnJlZCBzaXplIG9mIHRoZSBDb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UHJlZmVycmVkU2l6ZShEaW1lbnNpb24gcHJlZmVycmVkU2l6ZSkgewogICAgICAgICBEaW1lbnNpb24gb2xkUHJlZmVycmVkU2l6ZTsKQEAgLTQ5NTQsNDcgKzQ1NjEsMzggQEAKICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJwcmVmZXJyZWRTaXplIiwgb2xkUHJlZmVycmVkU2l6ZSwgdGhpcy5wcmVmZXJyZWRTaXplKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vPz8/QVdUOiBpbnZhbGlkYXRlUmVhbFBhcmVudCgpOworICAgICAgICAgICAgLy8gPz8/QVdUOiBpbnZhbGlkYXRlUmVhbFBhcmVudCgpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBSZWRyYXdNYW5hZ2VyIGdldFJlZHJhd01hbmFnZXIoKSB7Ci0gICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRSZWRyYXdNYW5hZ2VyKCk7Ci0gICAgfQotICAgICovCisgICAgICogUmVkcmF3TWFuYWdlciBnZXRSZWRyYXdNYW5hZ2VyKCkgeyBpZiAocGFyZW50ID09IG51bGwpIHsgcmV0dXJuIG51bGw7IH0KKyAgICAgKiByZXR1cm4gcGFyZW50LmdldFJlZHJhd01hbmFnZXIoKTsgfQorICAgICAqLwogCiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIGlzIGZvY3VzYWJpbGl0eSBleHBsaWNpdGx5IHNldC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgY29tcG9uZW50IGhhcyBhIGZvY3VzYWJsZSBwZWVyCisgICAgICogQHJldHVybiB0cnVlIGlmIGNvbXBvbmVudCBoYXMgYSBmb2N1c2FibGUgcGVlci4KICAgICAgKi8KLSAgICAvLz8/P0FXVAorICAgIC8vID8/P0FXVAogICAgIC8qCi0gICAgYm9vbGVhbiBpc1BlZXJGb2N1c2FibGUoKSB7Ci0gICAgICAgIC8vIFRoZSByZWNvbW1lbmRhdGlvbnMgZm9yIFdpbmRvd3MgYW5kIFVuaXggYXJlIHRoYXQKLSAgICAgICAgLy8gQ2FudmFzZXMsIExhYmVscywgUGFuZWxzLCBTY3JvbGxiYXJzLCBTY3JvbGxQYW5lcywgV2luZG93cywKLSAgICAgICAgLy8gYW5kIGxpZ2h0d2VpZ2h0IENvbXBvbmVudHMgaGF2ZSBub24tZm9jdXNhYmxlIHBlZXJzLAotICAgICAgICAvLyBhbmQgYWxsIG90aGVyIENvbXBvbmVudHMgaGF2ZSBmb2N1c2FibGUgcGVlcnMuCi0gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQ2FudmFzIHx8IHRoaXMgaW5zdGFuY2VvZiBMYWJlbCB8fCB0aGlzIGluc3RhbmNlb2YgUGFuZWwKLSAgICAgICAgICAgICAgICB8fCB0aGlzIGluc3RhbmNlb2YgU2Nyb2xsYmFyIHx8IHRoaXMgaW5zdGFuY2VvZiBTY3JvbGxQYW5lCi0gICAgICAgICAgICAgICAgfHwgdGhpcyBpbnN0YW5jZW9mIFdpbmRvdyB8fCBpc0xpZ2h0d2VpZ2h0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgKi8KKyAgICAgKiBib29sZWFuIGlzUGVlckZvY3VzYWJsZSgpIHsgLy8gVGhlIHJlY29tbWVuZGF0aW9ucyBmb3IgV2luZG93cyBhbmQgVW5peAorICAgICAqIGFyZSB0aGF0IC8vIENhbnZhc2VzLCBMYWJlbHMsIFBhbmVscywgU2Nyb2xsYmFycywgU2Nyb2xsUGFuZXMsIFdpbmRvd3MsCisgICAgICogLy8gYW5kIGxpZ2h0d2VpZ2h0IENvbXBvbmVudHMgaGF2ZSBub24tZm9jdXNhYmxlIHBlZXJzLCAvLyBhbmQgYWxsIG90aGVyCisgICAgICogQ29tcG9uZW50cyBoYXZlIGZvY3VzYWJsZSBwZWVycy4gaWYgKHRoaXMgaW5zdGFuY2VvZiBDYW52YXMgfHwgdGhpcworICAgICAqIGluc3RhbmNlb2YgTGFiZWwgfHwgdGhpcyBpbnN0YW5jZW9mIFBhbmVsIHx8IHRoaXMgaW5zdGFuY2VvZiBTY3JvbGxiYXIgfHwKKyAgICAgKiB0aGlzIGluc3RhbmNlb2YgU2Nyb2xsUGFuZSB8fCB0aGlzIGluc3RhbmNlb2YgV2luZG93IHx8IGlzTGlnaHR3ZWlnaHQoKSkKKyAgICAgKiB7IHJldHVybiBmYWxzZTsgfSByZXR1cm4gdHJ1ZTsgfQorICAgICAqLwogCiAgICAgLyoqCiAgICAgICogQHJldHVybiB0cnVlIGlmIGZvY3VzYWJpbGl0eSB3YXMgZXhwbGljaXRseSBzZXQgdmlhIGEgY2FsbCB0bwogICAgICAqICAgICAgICAgc2V0Rm9jdXNhYmxlKCkgb3IgdmlhIG92ZXJyaWRpbmcgaXNGb2N1c2FibGUoKSBvcgotICAgICAqICAgICAgICAgaXNGb2N1c1RyYXZlcnNhYmxlKCkKKyAgICAgKiAgICAgICAgIGlzRm9jdXNUcmF2ZXJzYWJsZSgpLgogICAgICAqLwogICAgIGJvb2xlYW4gaXNGb2N1c2FiaWxpdHlFeHBsaWNpdGx5U2V0KCkgewogICAgICAgICByZXR1cm4gY2FsbGVkU2V0Rm9jdXNhYmxlIHx8IG92ZXJyaWRlbklzRm9jdXNhYmxlOwpAQCAtNTAwMyw3ICs0NjAxLDggQEAKICAgICAvKioKICAgICAgKiBQYWludHMgdGhlIGNvbXBvbmVudCBhbmQgYWxsIG9mIGl0cyBzdWJjb21wb25lbnRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBnIHRoZSBHcmFwaGljcyB0byBiZSB1c2VkIGZvciBwYWludGluZy4KKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIEdyYXBoaWNzIHRvIGJlIHVzZWQgZm9yIHBhaW50aW5nLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHBhaW50QWxsKEdyYXBoaWNzIGcpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC01MDE3LDcgKzQ2MTYsOCBAQAogICAgIC8qKgogICAgICAqIFVwZGF0ZXMgdGhpcyBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGcgdGhlIEdyYXBoaWNzIHRvIGJlIHVzZWQgZm9yIHVwZGF0aW5nLgorICAgICAqIEBwYXJhbSBnCisgICAgICogICAgICAgICAgICB0aGUgR3JhcGhpY3MgdG8gYmUgdXNlZCBmb3IgdXBkYXRpbmcuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlKEdyYXBoaWNzIGcpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC01MDM2LDcgKzQ2MzYsOCBAQAogICAgIC8qKgogICAgICAqIFBhaW50cyB0aGlzIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZyB0aGUgR3JhcGhpY3MgdG8gYmUgdXNlZCBmb3IgcGFpbnRpbmcuCisgICAgICogQHBhcmFtIGcKKyAgICAgKiAgICAgICAgICAgIHRoZSBHcmFwaGljcyB0byBiZSB1c2VkIGZvciBwYWludGluZy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBnKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtNTA1MCw3ICs0NjUxLDggQEAKICAgICAvKioKICAgICAgKiBQcmVwYXJlcyB0aGUgY29tcG9uZW50IHRvIGJlIHBhaW50ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGcgdGhlIEdyYXBoaWNzIHRvIGJlIHVzZWQgZm9yIHBhaW50aW5nLgorICAgICAqIEBwYXJhbSBnCisgICAgICogICAgICAgICAgICB0aGUgR3JhcGhpY3MgdG8gYmUgdXNlZCBmb3IgcGFpbnRpbmcuCiAgICAgICovCiAgICAgdm9pZCBwcmVwYWludChHcmFwaGljcyBnKSB7CiAgICAgICAgIC8vIEp1c3QgdG8gbm90aGluZy4gRm9yIG92ZXJyaWRpbmcuCkBAIC01MDU5LDcgKzQ2NjEsNyBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiBpcyBwcmVwYWludGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgcHJlcGFpbnRlcgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgcHJlcGFpbnRlci4KICAgICAgKi8KICAgICBib29sZWFuIGlzUHJlcGFpbnRlcigpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNTA4Myw0MSArNDY4NSwyOSBAQAogICAgICAgICAvLyBUbyBiZSBpbmhlcml0ZWQgYnkgQ29udGFpbmVyCiAgICAgfQogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHZvaWQgZmluaXNoSGllcmFyY2h5Q2hhbmdlKENvbXBvbmVudCBjaGFuZ2VkLCBDb250YWluZXIgY2hhbmdlZFBhcmVudCwgaW50IGFuY2VzdG9yRmxhZ3MpIHsKLSAgICAgICAgaWYgKC0taGllcmFyY2h5Q2hhbmdpbmdDb3VudGVyID09IDApIHsKLSAgICAgICAgICAgIGludCBjaGFuZ2VGbGFncyA9IGFuY2VzdG9yRmxhZ3M7Ci0gICAgICAgICAgICBpZiAod2FzU2hvd2luZyAhPSBpc1Nob3dpbmcoKSkgewotICAgICAgICAgICAgICAgIGNoYW5nZUZsYWdzIHw9IEhpZXJhcmNoeUV2ZW50LlNIT1dJTkdfQ0hBTkdFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3YXNEaXNwbGF5YWJsZSAhPSBpc0Rpc3BsYXlhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VGbGFncyB8PSBIaWVyYXJjaHlFdmVudC5ESVNQTEFZQUJJTElUWV9DSEFOR0VEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoYW5nZUZsYWdzID4gMCkgewotICAgICAgICAgICAgICAgIHBvc3RFdmVudChuZXcgSGllcmFyY2h5RXZlbnQodGhpcywgSGllcmFyY2h5RXZlbnQuSElFUkFSQ0hZX0NIQU5HRUQsIGNoYW5nZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkUGFyZW50LCBjaGFuZ2VGbGFncykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluaXNoQ2hpbGRyZW5IaWVyYXJjaHlDaGFuZ2UoY2hhbmdlZCwgY2hhbmdlZFBhcmVudCwgYW5jZXN0b3JGbGFncyk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgICogdm9pZCBmaW5pc2hIaWVyYXJjaHlDaGFuZ2UoQ29tcG9uZW50IGNoYW5nZWQsIENvbnRhaW5lciBjaGFuZ2VkUGFyZW50LAorICAgICAqIGludCBhbmNlc3RvckZsYWdzKSB7IGlmICgtLWhpZXJhcmNoeUNoYW5naW5nQ291bnRlciA9PSAwKSB7IGludAorICAgICAqIGNoYW5nZUZsYWdzID0gYW5jZXN0b3JGbGFnczsgaWYgKHdhc1Nob3dpbmcgIT0gaXNTaG93aW5nKCkpIHsgY2hhbmdlRmxhZ3MKKyAgICAgKiB8PSBIaWVyYXJjaHlFdmVudC5TSE9XSU5HX0NIQU5HRUQ7IH0gaWYgKHdhc0Rpc3BsYXlhYmxlICE9CisgICAgICogaXNEaXNwbGF5YWJsZSgpKSB7IGNoYW5nZUZsYWdzIHw9IEhpZXJhcmNoeUV2ZW50LkRJU1BMQVlBQklMSVRZX0NIQU5HRUQ7CisgICAgICogfSBpZiAoY2hhbmdlRmxhZ3MgPiAwKSB7IHBvc3RFdmVudChuZXcgSGllcmFyY2h5RXZlbnQodGhpcywKKyAgICAgKiBIaWVyYXJjaHlFdmVudC5ISUVSQVJDSFlfQ0hBTkdFRCwgY2hhbmdlZCwgY2hhbmdlZFBhcmVudCwgY2hhbmdlRmxhZ3MpKTsKKyAgICAgKiB9IGZpbmlzaENoaWxkcmVuSGllcmFyY2h5Q2hhbmdlKGNoYW5nZWQsIGNoYW5nZWRQYXJlbnQsIGFuY2VzdG9yRmxhZ3MpOyB9CisgICAgICogfSB2b2lkIGZpbmlzaENoaWxkcmVuSGllcmFyY2h5Q2hhbmdlKENvbXBvbmVudCBjaGFuZ2VkLCBDb250YWluZXIKKyAgICAgKiBjaGFuZ2VkUGFyZW50LCBpbnQgYW5jZXN0b3JGbGFncykgeyAvLyBUbyBiZSBpbmhlcml0ZWQgYnkgQ29udGFpbmVyIH0KKyAgICAgKiB2b2lkIHBvc3RIaWVyYXJjaHlCb3VuZHNFdmVudHMoQ29tcG9uZW50IGNoYW5nZWQsIGludCBpZCkgeyBwb3N0RXZlbnQobmV3CisgICAgICogSGllcmFyY2h5RXZlbnQodGhpcywgaWQsIGNoYW5nZWQsIG51bGwsIDApKTsgfQorICAgICAqLwogCi0KLSAgICB2b2lkIGZpbmlzaENoaWxkcmVuSGllcmFyY2h5Q2hhbmdlKENvbXBvbmVudCBjaGFuZ2VkLCBDb250YWluZXIgY2hhbmdlZFBhcmVudCwKLSAgICAgICAgICAgIGludCBhbmNlc3RvckZsYWdzKSB7Ci0gICAgICAgIC8vIFRvIGJlIGluaGVyaXRlZCBieSBDb250YWluZXIKLSAgICB9Ci0KLSAgICB2b2lkIHBvc3RIaWVyYXJjaHlCb3VuZHNFdmVudHMoQ29tcG9uZW50IGNoYW5nZWQsIGludCBpZCkgewotICAgICAgICBwb3N0RXZlbnQobmV3IEhpZXJhcmNoeUV2ZW50KHRoaXMsIGlkLCBjaGFuZ2VkLCBudWxsLCAwKSk7Ci0gICAgfQotICAgICovCi0gICAgCiAgICAgLyoqCiAgICAgICogU3ByZWFkIGhpZXJhcmNoeSBib3VuZHMgZXZlbnRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjaGFuZ2VkIHRoZSBjaGFuZ2VkCi0gICAgICogQHBhcmFtIGlkIHRoZSBpZAorICAgICAqIEBwYXJhbSBjaGFuZ2VkCisgICAgICogICAgICAgICAgICB0aGUgY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpZC4KICAgICAgKi8KICAgICB2b2lkIHNwcmVhZEhpZXJhcmNoeUJvdW5kc0V2ZW50cyhDb21wb25lbnQgY2hhbmdlZCwgaW50IGlkKSB7CiAgICAgICAgIC8vIFRvIGJlIGluaGVyaXRlZCBieSBDb250YWluZXIKQEAgLTUxMjYsNTkgKzQ3MTYsNDAgQEAKICAgICAvKioKICAgICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IHRvIHRoaXMgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlIHRoZSBFdmVudC4KKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIEV2ZW50LgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRpc3BhdGNoRXZlbnQoQVdURXZlbnQgZSkgewotICAgICAgICAvLz8/P0FXVAorICAgICAgICAvLyA/Pz9BV1QKICAgICAgICAgLyoKLSAgICAgICAgaWYgKGUuaXNDb25zdW1lZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBQYWludEV2ZW50KSB7Ci0gICAgICAgICAgICB0b29sa2l0LmRpc3BhdGNoQVdURXZlbnQoZSk7Ci0gICAgICAgICAgICBwcm9jZXNzUGFpbnRFdmVudCgoUGFpbnRFdmVudCkgZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgS2V5Ym9hcmRGb2N1c01hbmFnZXIga2ZtID0gS2V5Ym9hcmRGb2N1c01hbmFnZXIuZ2V0Q3VycmVudEtleWJvYXJkRm9jdXNNYW5hZ2VyKCk7Ci0gICAgICAgIGlmICghZS5kaXNwYXRjaGVkQnlLRk0gJiYga2ZtLmRpc3BhdGNoRXZlbnQoZSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEtleUV2ZW50KSB7Ci0gICAgICAgICAgICBLZXlFdmVudCBrZSA9IChLZXlFdmVudCkgZTsKLSAgICAgICAgICAgIC8vIGNvbnN1bWVzIEtleUV2ZW50IHdoaWNoIHJlcHJlc2VudHMgYSBmb2N1cyB0cmF2ZXJzYWwga2V5Ci0gICAgICAgICAgICBpZiAoZ2V0Rm9jdXNUcmF2ZXJzYWxLZXlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAga2ZtLnByb2Nlc3NLZXlFdmVudCh0aGlzLCBrZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGtlLmlzQ29uc3VtZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dE1ldGhvZHNFbmFibGVkICYmIGRpc3BhdGNoVG9JTSAmJiBlLmlzUG9zdGVkICYmIGRpc3BhdGNoRXZlbnRUb0lNKGUpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGUuZ2V0SUQoKSA9PSBXaW5kb3dFdmVudC5XSU5ET1dfSUNPTklGSUVEKSB7Ci0gICAgICAgICAgICBub3RpZnlJbnB1dE1ldGhvZChudWxsKTsKLSAgICAgICAgfQotICAgICAgICBBV1RFdmVudC5FdmVudERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHRvb2xraXQuZXZlbnRUeXBlTG9va3VwLmdldEV2ZW50RGVzY3JpcHRvcihlKTsKLSAgICAgICAgdG9vbGtpdC5kaXNwYXRjaEFXVEV2ZW50KGUpOwotICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoaXNFdmVudEVuYWJsZWQoZGVzY3JpcHRvci5ldmVudE1hc2spCi0gICAgICAgICAgICAgICAgICAgIHx8IChnZXRMaXN0ZW5lcnMoZGVzY3JpcHRvci5saXN0ZW5lclR5cGUpLmxlbmd0aCA+IDApKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0V2ZW50KGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaW5wdXQgZXZlbnRzIGNhbiBiZSBjb25zdW1lZCBieSB1c2VyIGxpc3RlbmVyczoKLSAgICAgICAgICAgIGlmICghZS5pc0NvbnN1bWVkKCkgJiYgKChlbmFibGVkQVdURXZlbnRzICYgZGVzY3JpcHRvci5ldmVudE1hc2spICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgcG9zdHByb2Nlc3NFdmVudChlLCBkZXNjcmlwdG9yLmV2ZW50TWFzayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcG9zdERlcHJlY2F0ZWRFdmVudChlKTsKLSAgICAgICAgKi8KKyAgICAgICAgICogaWYgKGUuaXNDb25zdW1lZCgpKSB7IHJldHVybjsgfSBpZiAoZSBpbnN0YW5jZW9mIFBhaW50RXZlbnQpIHsKKyAgICAgICAgICogdG9vbGtpdC5kaXNwYXRjaEFXVEV2ZW50KGUpOyBwcm9jZXNzUGFpbnRFdmVudCgoUGFpbnRFdmVudCkgZSk7CisgICAgICAgICAqIHJldHVybjsgfSBLZXlib2FyZEZvY3VzTWFuYWdlciBrZm0gPQorICAgICAgICAgKiBLZXlib2FyZEZvY3VzTWFuYWdlci5nZXRDdXJyZW50S2V5Ym9hcmRGb2N1c01hbmFnZXIoKTsgaWYKKyAgICAgICAgICogKCFlLmRpc3BhdGNoZWRCeUtGTSAmJiBrZm0uZGlzcGF0Y2hFdmVudChlKSkgeyByZXR1cm47IH0gaWYgKGUKKyAgICAgICAgICogaW5zdGFuY2VvZiBLZXlFdmVudCkgeyBLZXlFdmVudCBrZSA9IChLZXlFdmVudCkgZTsgLy8gY29uc3VtZXMKKyAgICAgICAgICogS2V5RXZlbnQgd2hpY2ggcmVwcmVzZW50cyBhIGZvY3VzIHRyYXZlcnNhbCBrZXkgaWYKKyAgICAgICAgICogKGdldEZvY3VzVHJhdmVyc2FsS2V5c0VuYWJsZWQoKSkgeyBrZm0ucHJvY2Vzc0tleUV2ZW50KHRoaXMsIGtlKTsgaWYKKyAgICAgICAgICogKGtlLmlzQ29uc3VtZWQoKSkgeyByZXR1cm47IH0gfSB9IGlmIChpbnB1dE1ldGhvZHNFbmFibGVkICYmCisgICAgICAgICAqIGRpc3BhdGNoVG9JTSAmJiBlLmlzUG9zdGVkICYmIGRpc3BhdGNoRXZlbnRUb0lNKGUpKSB7IHJldHVybjsgfSBpZgorICAgICAgICAgKiAoZS5nZXRJRCgpID09IFdpbmRvd0V2ZW50LldJTkRPV19JQ09OSUZJRUQpIHsKKyAgICAgICAgICogbm90aWZ5SW5wdXRNZXRob2QobnVsbCk7IH0gQVdURXZlbnQuRXZlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPQorICAgICAgICAgKiB0b29sa2l0LmV2ZW50VHlwZUxvb2t1cC5nZXRFdmVudERlc2NyaXB0b3IoZSk7CisgICAgICAgICAqIHRvb2xraXQuZGlzcGF0Y2hBV1RFdmVudChlKTsgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgeyBpZgorICAgICAgICAgKiAoaXNFdmVudEVuYWJsZWQoZGVzY3JpcHRvci5ldmVudE1hc2spIHx8CisgICAgICAgICAqIChnZXRMaXN0ZW5lcnMoZGVzY3JpcHRvci5saXN0ZW5lclR5cGUpLmxlbmd0aCA+IDApKSB7CisgICAgICAgICAqIHByb2Nlc3NFdmVudChlKTsgfSAvLyBpbnB1dCBldmVudHMgY2FuIGJlIGNvbnN1bWVkIGJ5IHVzZXIgbGlzdGVuZXJzOgorICAgICAgICAgKiBpZiAoIWUuaXNDb25zdW1lZCgpICYmICgoZW5hYmxlZEFXVEV2ZW50cyAmIGRlc2NyaXB0b3IuZXZlbnRNYXNrKSAhPQorICAgICAgICAgKiAwKSkgeyBwb3N0cHJvY2Vzc0V2ZW50KGUsIGRlc2NyaXB0b3IuZXZlbnRNYXNrKTsgfSB9CisgICAgICAgICAqIHBvc3REZXByZWNhdGVkRXZlbnQoZSk7CisgICAgICAgICAqLwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFBvc3QgZGVwcmVjYXRlZCBldmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZSB0aGUgZQorICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgZS4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcG9zdERlcHJlY2F0ZWRFdmVudChBV1RFdmVudCBlKSB7CiAgICAgICAgIGlmIChkZXByZWNhdGVkRXZlbnRIYW5kbGVyKSB7CkBAIC01MTkyLDI3ICs0NzYzLDI5IEBACiAgICAgLyoqCiAgICAgICogUG9zdHByb2Nlc3MgZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKLSAgICAgKiBAcGFyYW0gZXZlbnRNYXNrIHRoZSBldmVudCBtYXNrCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlLgorICAgICAqIEBwYXJhbSBldmVudE1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudCBtYXNrLgogICAgICAqLwogICAgIHZvaWQgcG9zdHByb2Nlc3NFdmVudChBV1RFdmVudCBlLCBsb25nIGV2ZW50TWFzaykgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIGNhbGwgc3lzdGVtIGxpc3RlbmVycyB1bmRlciBBV1QgbG9jawogICAgICAgICAgICAgaWYgKGV2ZW50TWFzayA9PSBBV1RFdmVudC5GT0NVU19FVkVOVF9NQVNLKSB7Ci0gICAgICAgICAgICAgICAgcHJlcHJvY2Vzc0ZvY3VzRXZlbnQoKEZvY3VzRXZlbnQpIGUpOworICAgICAgICAgICAgICAgIHByZXByb2Nlc3NGb2N1c0V2ZW50KChGb2N1c0V2ZW50KWUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudE1hc2sgPT0gQVdURXZlbnQuS0VZX0VWRU5UX01BU0spIHsKLSAgICAgICAgICAgICAgICBwcmVwcm9jZXNzS2V5RXZlbnQoKEtleUV2ZW50KSBlKTsKKyAgICAgICAgICAgICAgICBwcmVwcm9jZXNzS2V5RXZlbnQoKEtleUV2ZW50KWUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudE1hc2sgPT0gQVdURXZlbnQuTU9VU0VfRVZFTlRfTUFTSykgewotICAgICAgICAgICAgICAgIHByZXByb2Nlc3NNb3VzZUV2ZW50KChNb3VzZUV2ZW50KSBlKTsKKyAgICAgICAgICAgICAgICBwcmVwcm9jZXNzTW91c2VFdmVudCgoTW91c2VFdmVudCllKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRNYXNrID09IEFXVEV2ZW50Lk1PVVNFX01PVElPTl9FVkVOVF9NQVNLKSB7Ci0gICAgICAgICAgICAgICAgcHJlcHJvY2Vzc01vdXNlTW90aW9uRXZlbnQoKE1vdXNlRXZlbnQpIGUpOworICAgICAgICAgICAgICAgIHByZXByb2Nlc3NNb3VzZU1vdGlvbkV2ZW50KChNb3VzZUV2ZW50KWUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudE1hc2sgPT0gQVdURXZlbnQuQ09NUE9ORU5UX0VWRU5UX01BU0spIHsKLSAgICAgICAgICAgICAgICBwcmVwcm9jZXNzQ29tcG9uZW50RXZlbnQoKENvbXBvbmVudEV2ZW50KSBlKTsKKyAgICAgICAgICAgICAgICBwcmVwcm9jZXNzQ29tcG9uZW50RXZlbnQoKENvbXBvbmVudEV2ZW50KWUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudE1hc2sgPT0gQVdURXZlbnQuTU9VU0VfV0hFRUxfRVZFTlRfTUFTSykgewotICAgICAgICAgICAgICAgIHByZXByb2Nlc3NNb3VzZVdoZWVsRXZlbnQoKE1vdXNlV2hlZWxFdmVudCkgZSk7CisgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc01vdXNlV2hlZWxFdmVudCgoTW91c2VXaGVlbEV2ZW50KWUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudE1hc2sgPT0gQVdURXZlbnQuSU5QVVRfTUVUSE9EX0VWRU5UX01BU0spIHsKLSAgICAgICAgICAgICAgICBwcmVwcm9jZXNzSW5wdXRNZXRob2RFdmVudCgoSW5wdXRNZXRob2RFdmVudCkgZSk7CisgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc0lucHV0TWV0aG9kRXZlbnQoKElucHV0TWV0aG9kRXZlbnQpZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwpAQCAtNTIyMiw3ICs0Nzk1LDggQEAKICAgICAvKioKICAgICAgKiBQcmVwcm9jZXNzIGlucHV0IG1ldGhvZCBldmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZSB0aGUgZQorICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgZS4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcHJlcHJvY2Vzc0lucHV0TWV0aG9kRXZlbnQoSW5wdXRNZXRob2RFdmVudCBlKSB7CiAgICAgICAgIHByb2Nlc3NJbnB1dE1ldGhvZEV2ZW50SW1wbChlLCBpbnB1dE1ldGhvZExpc3RlbmVycy5nZXRTeXN0ZW1MaXN0ZW5lcnMoKSk7CkBAIC01MjMxLDcgKzQ4MDUsOCBAQAogICAgIC8qKgogICAgICAqIFByZXByb2Nlc3MgbW91c2Ugd2hlZWwgZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHByZXByb2Nlc3NNb3VzZVdoZWVsRXZlbnQoTW91c2VXaGVlbEV2ZW50IGUpIHsKICAgICAgICAgcHJvY2Vzc01vdXNlV2hlZWxFdmVudEltcGwoZSwgbW91c2VXaGVlbExpc3RlbmVycy5nZXRTeXN0ZW1MaXN0ZW5lcnMoKSk7CkBAIC01MjQwLDggKzQ4MTUsMTAgQEAKICAgICAvKioKICAgICAgKiBQcm9jZXNzIG1vdXNlIHdoZWVsIGV2ZW50IGltcGwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKLSAgICAgKiBAcGFyYW0gYyB0aGUgYworICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgZS4KKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIGMuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb3VzZVdoZWVsRXZlbnRJbXBsKE1vdXNlV2hlZWxFdmVudCBlLCBDb2xsZWN0aW9uPE1vdXNlV2hlZWxMaXN0ZW5lcj4gYykgewogICAgICAgICBmb3IgKE1vdXNlV2hlZWxMaXN0ZW5lciBsaXN0ZW5lciA6IGMpIHsKQEAgLTUyNTYsNyArNDgzMyw4IEBACiAgICAgLyoqCiAgICAgICogUHJlcHJvY2VzcyBjb21wb25lbnQgZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHByZXByb2Nlc3NDb21wb25lbnRFdmVudChDb21wb25lbnRFdmVudCBlKSB7CiAgICAgICAgIHByb2Nlc3NDb21wb25lbnRFdmVudEltcGwoZSwgY29tcG9uZW50TGlzdGVuZXJzLmdldFN5c3RlbUxpc3RlbmVycygpKTsKQEAgLTUyNjUsNyArNDg0Myw4IEBACiAgICAgLyoqCiAgICAgICogUHJlcHJvY2VzcyBtb3VzZSBtb3Rpb24gZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIGUuCiAgICAgICovCiAgICAgdm9pZCBwcmVwcm9jZXNzTW91c2VNb3Rpb25FdmVudChNb3VzZUV2ZW50IGUpIHsKICAgICAgICAgcHJvY2Vzc01vdXNlTW90aW9uRXZlbnRJbXBsKGUsIG1vdXNlTW90aW9uTGlzdGVuZXJzLmdldFN5c3RlbUxpc3RlbmVycygpKTsKQEAgLTUyNzQsNyArNDg1Myw4IEBACiAgICAgLyoqCiAgICAgICogUHJlcHJvY2VzcyBtb3VzZSBldmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZSB0aGUgZQorICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgZQogICAgICAqLwogICAgIHZvaWQgcHJlcHJvY2Vzc01vdXNlRXZlbnQoTW91c2VFdmVudCBlKSB7CiAgICAgICAgIHByb2Nlc3NNb3VzZUV2ZW50SW1wbChlLCBtb3VzZUxpc3RlbmVycy5nZXRTeXN0ZW1MaXN0ZW5lcnMoKSk7CkBAIC01MjgzLDcgKzQ4NjMsOCBAQAogICAgIC8qKgogICAgICAqIFByZXByb2Nlc3Mga2V5IGV2ZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlIHRoZSBlCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlLgogICAgICAqLwogICAgIHZvaWQgcHJlcHJvY2Vzc0tleUV2ZW50KEtleUV2ZW50IGUpIHsKICAgICAgICAgcHJvY2Vzc0tleUV2ZW50SW1wbChlLCBrZXlMaXN0ZW5lcnMuZ2V0U3lzdGVtTGlzdGVuZXJzKCkpOwpAQCAtNTI5Miw3OSArNDg3Myw4MiBAQAogICAgIC8qKgogICAgICAqIFByZXByb2Nlc3MgZm9jdXMgZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIGUuCiAgICAgICovCiAgICAgdm9pZCBwcmVwcm9jZXNzRm9jdXNFdmVudChGb2N1c0V2ZW50IGUpIHsKICAgICAgICAgcHJvY2Vzc0ZvY3VzRXZlbnRJbXBsKGUsIGZvY3VzTGlzdGVuZXJzLmdldFN5c3RlbUxpc3RlbmVycygpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgQVdURXZlbnQgb2NjdXJyZWQgb24gdGhpcyBjb21wb25lbnQuIAorICAgICAqIFByb2Nlc3NlcyBBV1RFdmVudCBvY2N1cnJlZCBvbiB0aGlzIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZSB0aGUgQVdURXZlbnQuCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBBV1RFdmVudC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRXZlbnQoQVdURXZlbnQgZSkgewogICAgICAgICBsb25nIGV2ZW50TWFzayA9IHRvb2xraXQuZXZlbnRUeXBlTG9va3VwLmdldEV2ZW50TWFzayhlKTsKICAgICAgICAgaWYgKGV2ZW50TWFzayA9PSBBV1RFdmVudC5DT01QT05FTlRfRVZFTlRfTUFTSykgewotICAgICAgICAgICAgcHJvY2Vzc0NvbXBvbmVudEV2ZW50KChDb21wb25lbnRFdmVudCkgZSk7CisgICAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50RXZlbnQoKENvbXBvbmVudEV2ZW50KWUpOwogICAgICAgICB9IGVsc2UgaWYgKGV2ZW50TWFzayA9PSBBV1RFdmVudC5GT0NVU19FVkVOVF9NQVNLKSB7Ci0gICAgICAgICAgICBwcm9jZXNzRm9jdXNFdmVudCgoRm9jdXNFdmVudCkgZSk7CisgICAgICAgICAgICBwcm9jZXNzRm9jdXNFdmVudCgoRm9jdXNFdmVudCllKTsKICAgICAgICAgfSBlbHNlIGlmIChldmVudE1hc2sgPT0gQVdURXZlbnQuS0VZX0VWRU5UX01BU0spIHsKLSAgICAgICAgICAgIHByb2Nlc3NLZXlFdmVudCgoS2V5RXZlbnQpIGUpOworICAgICAgICAgICAgcHJvY2Vzc0tleUV2ZW50KChLZXlFdmVudCllKTsKICAgICAgICAgfSBlbHNlIGlmIChldmVudE1hc2sgPT0gQVdURXZlbnQuTU9VU0VfRVZFTlRfTUFTSykgewotICAgICAgICAgICAgcHJvY2Vzc01vdXNlRXZlbnQoKE1vdXNlRXZlbnQpIGUpOworICAgICAgICAgICAgcHJvY2Vzc01vdXNlRXZlbnQoKE1vdXNlRXZlbnQpZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRNYXNrID09IEFXVEV2ZW50Lk1PVVNFX1dIRUVMX0VWRU5UX01BU0spIHsKLSAgICAgICAgICAgIHByb2Nlc3NNb3VzZVdoZWVsRXZlbnQoKE1vdXNlV2hlZWxFdmVudCkgZSk7CisgICAgICAgICAgICBwcm9jZXNzTW91c2VXaGVlbEV2ZW50KChNb3VzZVdoZWVsRXZlbnQpZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRNYXNrID09IEFXVEV2ZW50Lk1PVVNFX01PVElPTl9FVkVOVF9NQVNLKSB7Ci0gICAgICAgICAgICBwcm9jZXNzTW91c2VNb3Rpb25FdmVudCgoTW91c2VFdmVudCkgZSk7CisgICAgICAgICAgICBwcm9jZXNzTW91c2VNb3Rpb25FdmVudCgoTW91c2VFdmVudCllKTsKICAgICAgICAgfSBlbHNlIGlmIChldmVudE1hc2sgPT0gQVdURXZlbnQuSElFUkFSQ0hZX0VWRU5UX01BU0spIHsKLSAgICAgICAgICAgIHByb2Nlc3NIaWVyYXJjaHlFdmVudCgoSGllcmFyY2h5RXZlbnQpIGUpOworICAgICAgICAgICAgcHJvY2Vzc0hpZXJhcmNoeUV2ZW50KChIaWVyYXJjaHlFdmVudCllKTsKICAgICAgICAgfSBlbHNlIGlmIChldmVudE1hc2sgPT0gQVdURXZlbnQuSElFUkFSQ0hZX0JPVU5EU19FVkVOVF9NQVNLKSB7Ci0gICAgICAgICAgICBwcm9jZXNzSGllcmFyY2h5Qm91bmRzRXZlbnQoKEhpZXJhcmNoeUV2ZW50KSBlKTsKKyAgICAgICAgICAgIHByb2Nlc3NIaWVyYXJjaHlCb3VuZHNFdmVudCgoSGllcmFyY2h5RXZlbnQpZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRNYXNrID09IEFXVEV2ZW50LklOUFVUX01FVEhPRF9FVkVOVF9NQVNLKSB7Ci0gICAgICAgICAgICBwcm9jZXNzSW5wdXRNZXRob2RFdmVudCgoSW5wdXRNZXRob2RFdmVudCkgZSk7CisgICAgICAgICAgICBwcm9jZXNzSW5wdXRNZXRob2RFdmVudCgoSW5wdXRNZXRob2RFdmVudCllKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gYXJyYXkgb2YgYWxsIGxpc3RlbmVyJ3Mgb2JqZWN0cyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0gICAgICogbGlzdGVuZXIgdHlwZSBhbmQgcmVnaXN0ZXJlZCB0byB0aGlzIENvbXBvbmVudC4KKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIGFsbCBsaXN0ZW5lcidzIG9iamVjdHMgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBsaXN0ZW5lcgorICAgICAqIHR5cGUgYW5kIHJlZ2lzdGVyZWQgdG8gdGhpcyBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyVHlwZSB0aGUgbGlzdGVuZXIgdHlwZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXJUeXBlCisgICAgICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdHlwZS4KICAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGFsbCBsaXN0ZW5lcidzIG9iamVjdHMgYmFzZWQgb24gdGhlIHNwZWNpZmllZAotICAgICAqIGxpc3RlbmVyIHR5cGUgYW5kIHJlZ2lzdGVyZWQgdG8gdGhpcyBDb21wb25lbnQuIAorICAgICAqICAgICAgICAgbGlzdGVuZXIgdHlwZSBhbmQgcmVnaXN0ZXJlZCB0byB0aGlzIENvbXBvbmVudC4KICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgPFQgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBUW10gZ2V0TGlzdGVuZXJzKENsYXNzPFQ+IGxpc3RlbmVyVHlwZSkgewogICAgICAgICBpZiAoQ29tcG9uZW50TGlzdGVuZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShsaXN0ZW5lclR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgZ2V0Q29tcG9uZW50TGlzdGVuZXJzKCk7CisgICAgICAgICAgICByZXR1cm4gKFRbXSlnZXRDb21wb25lbnRMaXN0ZW5lcnMoKTsKICAgICAgICAgfSBlbHNlIGlmIChGb2N1c0xpc3RlbmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20obGlzdGVuZXJUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIChUW10pIGdldEZvY3VzTGlzdGVuZXJzKCk7CisgICAgICAgICAgICByZXR1cm4gKFRbXSlnZXRGb2N1c0xpc3RlbmVycygpOwogICAgICAgICB9IGVsc2UgaWYgKEhpZXJhcmNoeUJvdW5kc0xpc3RlbmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20obGlzdGVuZXJUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIChUW10pIGdldEhpZXJhcmNoeUJvdW5kc0xpc3RlbmVycygpOworICAgICAgICAgICAgcmV0dXJuIChUW10pZ2V0SGllcmFyY2h5Qm91bmRzTGlzdGVuZXJzKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoSGllcmFyY2h5TGlzdGVuZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShsaXN0ZW5lclR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgZ2V0SGllcmFyY2h5TGlzdGVuZXJzKCk7CisgICAgICAgICAgICByZXR1cm4gKFRbXSlnZXRIaWVyYXJjaHlMaXN0ZW5lcnMoKTsKICAgICAgICAgfSBlbHNlIGlmIChJbnB1dE1ldGhvZExpc3RlbmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20obGlzdGVuZXJUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIChUW10pIGdldElucHV0TWV0aG9kTGlzdGVuZXJzKCk7CisgICAgICAgICAgICByZXR1cm4gKFRbXSlnZXRJbnB1dE1ldGhvZExpc3RlbmVycygpOwogICAgICAgICB9IGVsc2UgaWYgKEtleUxpc3RlbmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20obGlzdGVuZXJUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIChUW10pIGdldEtleUxpc3RlbmVycygpOworICAgICAgICAgICAgcmV0dXJuIChUW10pZ2V0S2V5TGlzdGVuZXJzKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoTW91c2VXaGVlbExpc3RlbmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20obGlzdGVuZXJUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIChUW10pIGdldE1vdXNlV2hlZWxMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIHJldHVybiAoVFtdKWdldE1vdXNlV2hlZWxMaXN0ZW5lcnMoKTsKICAgICAgICAgfSBlbHNlIGlmIChNb3VzZU1vdGlvbkxpc3RlbmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20obGlzdGVuZXJUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIChUW10pIGdldE1vdXNlTW90aW9uTGlzdGVuZXJzKCk7CisgICAgICAgICAgICByZXR1cm4gKFRbXSlnZXRNb3VzZU1vdGlvbkxpc3RlbmVycygpOwogICAgICAgICB9IGVsc2UgaWYgKE1vdXNlTGlzdGVuZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShsaXN0ZW5lclR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgZ2V0TW91c2VMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIHJldHVybiAoVFtdKWdldE1vdXNlTGlzdGVuZXJzKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxpc3RlbmVyVHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiAoVFtdKSBnZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpOworICAgICAgICAgICAgcmV0dXJuIChUW10pZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gKFRbXSkgQXJyYXkubmV3SW5zdGFuY2UobGlzdGVuZXJUeXBlLCAwKTsKKyAgICAgICAgcmV0dXJuIChUW10pQXJyYXkubmV3SW5zdGFuY2UobGlzdGVuZXJUeXBlLCAwKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBQcm9jZXNzIHBhaW50IGV2ZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQKKyAgICAgKiBAcGFyYW0gZXZlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1BhaW50RXZlbnQoUGFpbnRFdmVudCBldmVudCkgewogICAgICAgICBpZiAocmVkcmF3TWFuYWdlciA9PSBudWxsKSB7CkBAIC01MzkyLDEzICs0OTc2LDE1IEBACiAgICAgLyoqCiAgICAgICogSW5pdHMgdGhlIGdyYXBoaWNzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBnIHRoZSBnCi0gICAgICogQHBhcmFtIGUgdGhlIGUKKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIGcuCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlLgogICAgICAqLwogICAgIHZvaWQgaW5pdEdyYXBoaWNzKEdyYXBoaWNzIGcsIFBhaW50RXZlbnQgZSkgewogICAgICAgICBSZWN0YW5nbGUgY2xpcCA9IGUuZ2V0VXBkYXRlUmVjdCgpOwogICAgICAgICBpZiAoY2xpcCBpbnN0YW5jZW9mIENsaXBSZWdpb24pIHsKLSAgICAgICAgICAgIGcuc2V0Q2xpcCgoKENsaXBSZWdpb24pIGNsaXApLmdldENsaXAoKSk7CisgICAgICAgICAgICBnLnNldENsaXAoKChDbGlwUmVnaW9uKWNsaXApLmdldENsaXAoKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBnLnNldENsaXAoY2xpcCk7CiAgICAgICAgIH0KQEAgLTU0MTMsMTEgKzQ5OTksMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFbmFibGVzIHRoZSBldmVudHMgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50IG1hc2sgdG8gYmUgZGVsaXZlcmVkIHRvIAotICAgICAqIHRoaXMgY29tcG9uZW50LgorICAgICAqIEVuYWJsZXMgdGhlIGV2ZW50cyB3aXRoIHRoZSBzcGVjaWZpZWQgZXZlbnQgbWFzayB0byBiZSBkZWxpdmVyZWQgdG8gdGhpcworICAgICAqIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnRzVG9FbmFibGUgdGhlIGV2ZW50cyBtYXNrIHdoaWNoIHNwZWNpZmllcyB0aGUgdHlwZXMgCi0gICAgICogb2YgZXZlbnRzIHRvIGVuYWJsZS4KKyAgICAgKiBAcGFyYW0gZXZlbnRzVG9FbmFibGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudHMgbWFzayB3aGljaCBzcGVjaWZpZXMgdGhlIHR5cGVzIG9mIGV2ZW50cyB0byBlbmFibGUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZW5hYmxlRXZlbnRzKGxvbmcgZXZlbnRzVG9FbmFibGUpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC01NDMyLDE3ICs1MDE4LDE5IEBACiAgICAgLyoqCiAgICAgICogRW5hYmxlIGF3dCBldmVudHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50c1RvRW5hYmxlIHRoZSBldmVudHMgdG8gZW5hYmxlCisgICAgICogQHBhcmFtIGV2ZW50c1RvRW5hYmxlCisgICAgICogICAgICAgICAgICB0aGUgZXZlbnRzIHRvIGVuYWJsZS4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgZW5hYmxlQVdURXZlbnRzKGxvbmcgZXZlbnRzVG9FbmFibGUpIHsKICAgICAgICAgZW5hYmxlZEFXVEV2ZW50cyB8PSBldmVudHNUb0VuYWJsZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEaXNhYmxlcyB0aGUgZXZlbnRzIHdpdGggdHlwZXMgc3BlY2lmaWVkIGJ5IHRoZSBzcGVjaWZpZWQgZXZlbnQgbWFzayAKLSAgICAgKiBmcm9tIGJlaW5nIGRlbGl2ZXJlZCB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKiBEaXNhYmxlcyB0aGUgZXZlbnRzIHdpdGggdHlwZXMgc3BlY2lmaWVkIGJ5IHRoZSBzcGVjaWZpZWQgZXZlbnQgbWFzayBmcm9tCisgICAgICogYmVpbmcgZGVsaXZlcmVkIHRvIHRoaXMgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudHNUb0Rpc2FibGUgdGhlIGV2ZW50IG1hc2sgc3BlY2lmeWluZyB0aGUgZXZlbnQgdHlwZXMuIAorICAgICAqIEBwYXJhbSBldmVudHNUb0Rpc2FibGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudCBtYXNrIHNwZWNpZnlpbmcgdGhlIGV2ZW50IHR5cGVzLgogICAgICAqLwogICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGRpc2FibGVFdmVudHMobG9uZyBldmVudHNUb0Rpc2FibGUpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC01NDU5LDkgKzUwNDcsOSBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiBpcyBtb3VzZSBldmVudCBlbmFibGVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudE1hc2sgdGhlIGV2ZW50IG1hc2sKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIG1vdXNlIGV2ZW50IGVuYWJsZWQKKyAgICAgKiBAcGFyYW0gZXZlbnRNYXNrCisgICAgICogICAgICAgICAgICB0aGUgZXZlbnQgbWFzay4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIG1vdXNlIGV2ZW50IGVuYWJsZWQuCiAgICAgICovCiAgICAgYm9vbGVhbiBpc01vdXNlRXZlbnRFbmFibGVkKGxvbmcgZXZlbnRNYXNrKSB7CiAgICAgICAgIHJldHVybiAoaXNFdmVudEVuYWJsZWQoZXZlbnRNYXNrKSB8fCAoZW5hYmxlZEFXVEV2ZW50cyAmIGV2ZW50TWFzaykgIT0gMCk7CkBAIC01NDcwLDE4ICs1MDU4LDE5IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIGlzIGV2ZW50IGVuYWJsZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50TWFzayB0aGUgZXZlbnQgbWFzawotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgZXZlbnQgZW5hYmxlZAorICAgICAqIEBwYXJhbSBldmVudE1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudCBtYXNrLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgZXZlbnQgZW5hYmxlZC4KICAgICAgKi8KICAgICBib29sZWFuIGlzRXZlbnRFbmFibGVkKGxvbmcgZXZlbnRNYXNrKSB7CiAgICAgICAgIHJldHVybiAoKGVuYWJsZWRFdmVudHMgJiBldmVudE1hc2spICE9IDApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgaW5wdXQgbWV0aG9kIHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LiAKKyAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIGlucHV0IG1ldGhvZCBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW5hYmxlIHRydWUgdG8gZW5hYmxlIGlucHV0IG1ldGhvZCBzdXBwb3J0LCBmYWxzZSB0byBkaXNhYmxlIGl0LiAKKyAgICAgKiBAcGFyYW0gZW5hYmxlCisgICAgICogICAgICAgICAgICB0cnVlIHRvIGVuYWJsZSBpbnB1dCBtZXRob2Qgc3VwcG9ydCwgZmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBlbmFibGVJbnB1dE1ldGhvZHMoYm9vbGVhbiBlbmFibGUpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC01NDk2LDExICs1MDg1LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiBhbGwgY29tcG9uZW50J3MgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIHRoaXMKLSAgICAgKiBjb21wb25lbnQuCisgICAgICogR2V0cyBhbiBhcnJheSBvZiBhbGwgY29tcG9uZW50J3MgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgY29tcG9uZW50LgogICAgICAqIAogICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgYWxsIGNvbXBvbmVudCdzIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciB0aGlzCi0gICAgICogY29tcG9uZW50LgorICAgICAqICAgICAgICAgY29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBDb21wb25lbnRMaXN0ZW5lcltdIGdldENvbXBvbmVudExpc3RlbmVycygpIHsKICAgICAgICAgcmV0dXJuIGNvbXBvbmVudExpc3RlbmVycy5nZXRVc2VyTGlzdGVuZXJzKG5ldyBDb21wb25lbnRMaXN0ZW5lclswXSk7CkBAIC01NTEwLDcgKzUwOTgsOCBAQAogICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgbGlzdGVuZXIgdG8gdGhlIENvbXBvbmVudCBmb3IgcmVjZWl2aW5nCiAgICAgICogY29tcG9uZW50J3MgZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIENvbXBvbmVudExpc3RlbmVyLgorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgQ29tcG9uZW50TGlzdGVuZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50TGlzdGVuZXIoQ29tcG9uZW50TGlzdGVuZXIgbCkgewogICAgICAgICBjb21wb25lbnRMaXN0ZW5lcnMuYWRkVXNlckxpc3RlbmVyKGwpOwpAQCAtNTUxOSwxNyArNTEwOCwxOSBAQAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIGNvbXBvbmVudCBsaXN0ZW5lciByZWdpc3RlcmVkIGZvciB0aGlzIENvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgQ29tcG9uZW50TGlzdGVuZXIuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBDb21wb25lbnRMaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmVDb21wb25lbnRMaXN0ZW5lcihDb21wb25lbnRMaXN0ZW5lciBsKSB7CiAgICAgICAgIGNvbXBvbmVudExpc3RlbmVycy5yZW1vdmVVc2VyTGlzdGVuZXIobCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgY29tcG9uZW50IGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkIG9uIHRoaXMgY29tcG9uZW50IAotICAgICAqIGJ5IGRpc3BhdGNoaW5nIHRoZW0gdG8gYW55IHJlZ2lzdGVyZWQgQ29tcG9uZW50TGlzdGVuZXIgb2JqZWN0cy4KKyAgICAgKiBQcm9jZXNzZXMgYSBjb21wb25lbnQgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQgb24gdGhpcyBjb21wb25lbnQgYnkKKyAgICAgKiBkaXNwYXRjaGluZyB0aGVtIHRvIGFueSByZWdpc3RlcmVkIENvbXBvbmVudExpc3RlbmVyIG9iamVjdHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIENvbXBvbmVudEV2ZW50LgorICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgQ29tcG9uZW50RXZlbnQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NvbXBvbmVudEV2ZW50KENvbXBvbmVudEV2ZW50IGUpIHsKICAgICAgICAgcHJvY2Vzc0NvbXBvbmVudEV2ZW50SW1wbChlLCBjb21wb25lbnRMaXN0ZW5lcnMuZ2V0VXNlckxpc3RlbmVycygpKTsKQEAgLTU1MzgsOCArNTEyOSwxMCBAQAogICAgIC8qKgogICAgICAqIFByb2Nlc3MgY29tcG9uZW50IGV2ZW50IGltcGwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKLSAgICAgKiBAcGFyYW0gYyB0aGUgYworICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgZS4KKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIGMuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb21wb25lbnRFdmVudEltcGwoQ29tcG9uZW50RXZlbnQgZSwgQ29sbGVjdGlvbjxDb21wb25lbnRMaXN0ZW5lcj4gYykgewogICAgICAgICBmb3IgKENvbXBvbmVudExpc3RlbmVyIGxpc3RlbmVyIDogYykgewpAQCAtNTU3MCwxMCArNTE2MywxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBmb2N1cyBsaXN0ZW5lciB0byB0aGUgQ29tcG9uZW50IGZvciByZWNlaXZpbmcKLSAgICAgKiBmb2N1cyBldmVudHMuCisgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIGZvY3VzIGxpc3RlbmVyIHRvIHRoZSBDb21wb25lbnQgZm9yIHJlY2VpdmluZyBmb2N1cworICAgICAqIGV2ZW50cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgRm9jdXNMaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIEZvY3VzTGlzdGVuZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkRm9jdXNMaXN0ZW5lcihGb2N1c0xpc3RlbmVyIGwpIHsKICAgICAgICAgZm9jdXNMaXN0ZW5lcnMuYWRkVXNlckxpc3RlbmVyKGwpOwpAQCAtNTU4Miw3ICs1MTc2LDggQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBhd3QgZm9jdXMgbGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIGwKKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIGwuCiAgICAgICovCiAgICAgdm9pZCBhZGRBV1RGb2N1c0xpc3RlbmVyKEZvY3VzTGlzdGVuZXIgbCkgewogICAgICAgICBlbmFibGVBV1RFdmVudHMoQVdURXZlbnQuRk9DVVNfRVZFTlRfTUFTSyk7CkBAIC01NTkyLDE3ICs1MTg3LDE5IEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgZm9jdXMgbGlzdGVuZXIgcmVnaXN0ZXJlZCBmb3IgdGhpcyBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIEZvY3VzTGlzdGVuZXIuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb2N1c0xpc3RlbmVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUZvY3VzTGlzdGVuZXIoRm9jdXNMaXN0ZW5lciBsKSB7CiAgICAgICAgIGZvY3VzTGlzdGVuZXJzLnJlbW92ZVVzZXJMaXN0ZW5lcihsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSBGb2N1c0V2ZW50IHRoYXQgaGFzIG9jY3VycmVkIG9uIHRoaXMgY29tcG9uZW50Ci0gICAgICogYnkgZGlzcGF0Y2hpbmcgaXQgdG8gdGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gZSB0aGUgRm9jdXNFdmVudC4KKyAgICAgKiBQcm9jZXNzZXMgYSBGb2N1c0V2ZW50IHRoYXQgaGFzIG9jY3VycmVkIG9uIHRoaXMgY29tcG9uZW50IGJ5IGRpc3BhdGNoaW5nCisgICAgICogaXQgdG8gdGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgRm9jdXNFdmVudC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRm9jdXNFdmVudChGb2N1c0V2ZW50IGUpIHsKICAgICAgICAgcHJvY2Vzc0ZvY3VzRXZlbnRJbXBsKGUsIGZvY3VzTGlzdGVuZXJzLmdldFVzZXJMaXN0ZW5lcnMoKSk7CkBAIC01NjExLDggKzUyMDgsMTAgQEAKICAgICAvKioKICAgICAgKiBQcm9jZXNzIGZvY3VzIGV2ZW50IGltcGwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKLSAgICAgKiBAcGFyYW0gYyB0aGUgYworICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgZS4KKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIGMuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NGb2N1c0V2ZW50SW1wbChGb2N1c0V2ZW50IGUsIENvbGxlY3Rpb248Rm9jdXNMaXN0ZW5lcj4gYykgewogICAgICAgICBmb3IgKEZvY3VzTGlzdGVuZXIgbGlzdGVuZXIgOiBjKSB7CkBAIC01NjI4LDExICs1MjI3LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHJlZ2lzdGVyZWQgSGllcmFyY2h5TGlzdGVuZXJzIGZvcgotICAgICAqIHRoaXMgQ29tcG9uZW50LgorICAgICAqIEdldHMgYW4gYXJyYXkgb2YgcmVnaXN0ZXJlZCBIaWVyYXJjaHlMaXN0ZW5lcnMgZm9yIHRoaXMgQ29tcG9uZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcmVnaXN0ZXJlZCBIaWVyYXJjaHlMaXN0ZW5lcnMgZm9yCi0gICAgICogdGhpcyBDb21wb25lbnQuCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiByZWdpc3RlcmVkIEhpZXJhcmNoeUxpc3RlbmVycyBmb3IgdGhpcyBDb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIEhpZXJhcmNoeUxpc3RlbmVyW10gZ2V0SGllcmFyY2h5TGlzdGVuZXJzKCkgewogICAgICAgICByZXR1cm4gaGllcmFyY2h5TGlzdGVuZXJzLmdldFVzZXJMaXN0ZW5lcnMobmV3IEhpZXJhcmNoeUxpc3RlbmVyWzBdKTsKQEAgLTU2NDEsNyArNTIzOCw4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIGhpZXJhcmNoeSBsaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgSGllcmFyY2h5TGlzdGVuZXIuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBIaWVyYXJjaHlMaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRIaWVyYXJjaHlMaXN0ZW5lcihIaWVyYXJjaHlMaXN0ZW5lciBsKSB7CiAgICAgICAgIGhpZXJhcmNoeUxpc3RlbmVycy5hZGRVc2VyTGlzdGVuZXIobCk7CkBAIC01NjUwLDE3ICs1MjQ4LDE5IEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgaGllcmFyY2h5IGxpc3RlbmVyIHJlZ2lzdGVyZWQgZm9yIHRoaXMgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSBIaWVyYXJjaHlMaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIEhpZXJhcmNoeUxpc3RlbmVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUhpZXJhcmNoeUxpc3RlbmVyKEhpZXJhcmNoeUxpc3RlbmVyIGwpIHsKICAgICAgICAgaGllcmFyY2h5TGlzdGVuZXJzLnJlbW92ZVVzZXJMaXN0ZW5lcihsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSBoaWVyYXJjaHkgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQgb24gdGhpcyBjb21wb25lbnQKLSAgICAgKiBieSBkaXNwYXRjaGluZyBpdCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuIAorICAgICAqIFByb2Nlc3NlcyBhIGhpZXJhcmNoeSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZCBvbiB0aGlzIGNvbXBvbmVudCBieQorICAgICAqIGRpc3BhdGNoaW5nIGl0IHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZSB0aGUgSGllcmFyY2h5RXZlbnQuCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBIaWVyYXJjaHlFdmVudC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSGllcmFyY2h5RXZlbnQoSGllcmFyY2h5RXZlbnQgZSkgewogICAgICAgICBmb3IgKEhpZXJhcmNoeUxpc3RlbmVyIGxpc3RlbmVyIDogaGllcmFyY2h5TGlzdGVuZXJzLmdldFVzZXJMaXN0ZW5lcnMoKSkgewpAQCAtNTY3Myw4ICs1MjczLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIEhpZXJhcmNoeUJvdW5kc0xpc3RlbmVyIG9iamVjdHMgcmVnaXN0ZXJlZAotICAgICAqIHRvIHRoaXMgQ29tcG9uZW50LgorICAgICAqIEdldHMgYW4gYXJyYXkgb2YgSGllcmFyY2h5Qm91bmRzTGlzdGVuZXIgb2JqZWN0cyByZWdpc3RlcmVkIHRvIHRoaXMKKyAgICAgKiBDb21wb25lbnQuCiAgICAgICogCiAgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lciBvYmplY3RzLgogICAgICAqLwpAQCAtNTY4NSw3ICs1Mjg1LDggQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgaGllcmFyY2h5IGJvdW5kcyBsaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgSGllcmFyY2h5Qm91bmRzTGlzdGVuZXIuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lcihIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lciBsKSB7CiAgICAgICAgIGhpZXJhcmNoeUJvdW5kc0xpc3RlbmVycy5hZGRVc2VyTGlzdGVuZXIobCk7CkBAIC01Njk0LDE3ICs1Mjk1LDE5IEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgaGllcmFyY2h5IGJvdW5kcyBsaXN0ZW5lciByZWdpc3RlcmVkIGZvciB0aGlzIENvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgSGllcmFyY2h5Qm91bmRzTGlzdGVuZXIuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmVIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lcihIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lciBsKSB7CiAgICAgICAgIGhpZXJhcmNoeUJvdW5kc0xpc3RlbmVycy5yZW1vdmVVc2VyTGlzdGVuZXIobCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgaGllcmFyY2h5IGJvdW5kcyBldmVudCB0aGF0IGhhcyBvY2N1cnJlZCBvbiB0aGlzIGNvbXBvbmVudAotICAgICAqIGJ5IGRpc3BhdGNoaW5nIGl0IHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGUgdGhlIEhpZXJhcmNoeUJvdW5kc0V2ZW50LgorICAgICAqIFByb2Nlc3NlcyBhIGhpZXJhcmNoeSBib3VuZHMgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQgb24gdGhpcyBjb21wb25lbnQgYnkKKyAgICAgKiBkaXNwYXRjaGluZyBpdCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAgICogCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBIaWVyYXJjaHlCb3VuZHNFdmVudC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSGllcmFyY2h5Qm91bmRzRXZlbnQoSGllcmFyY2h5RXZlbnQgZSkgewogICAgICAgICBmb3IgKEhpZXJhcmNoeUJvdW5kc0xpc3RlbmVyIGxpc3RlbmVyIDogaGllcmFyY2h5Qm91bmRzTGlzdGVuZXJzLmdldFVzZXJMaXN0ZW5lcnMoKSkgewpAQCAtNTczMSw3ICs1MzM0LDggQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQga2V5IGxpc3RlbmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSBLZXlMaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIEtleUxpc3RlbmVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEtleUxpc3RlbmVyKEtleUxpc3RlbmVyIGwpIHsKICAgICAgICAga2V5TGlzdGVuZXJzLmFkZFVzZXJMaXN0ZW5lcihsKTsKQEAgLTU3NDAsNyArNTM0NCw4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgYXd0IGtleSBsaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgbAorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgbC4KICAgICAgKi8KICAgICB2b2lkIGFkZEFXVEtleUxpc3RlbmVyKEtleUxpc3RlbmVyIGwpIHsKICAgICAgICAgZW5hYmxlQVdURXZlbnRzKEFXVEV2ZW50LktFWV9FVkVOVF9NQVNLKTsKQEAgLTU3NTAsMTcgKzUzNTUsMTkgQEAKICAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBrZXkgbGlzdGVuZXIgcmVnaXN0ZXJlZCBmb3IgdGhpcyBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIEtleUxpc3RlbmVyLgorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgS2V5TGlzdGVuZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlS2V5TGlzdGVuZXIoS2V5TGlzdGVuZXIgbCkgewogICAgICAgICBrZXlMaXN0ZW5lcnMucmVtb3ZlVXNlckxpc3RlbmVyKGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBhIGtleSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZCBvbiB0aGlzIGNvbXBvbmVudAotICAgICAqIGJ5IGRpc3BhdGNoaW5nIGl0IHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICAgKiBQcm9jZXNzZXMgYSBrZXkgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQgb24gdGhpcyBjb21wb25lbnQgYnkgZGlzcGF0Y2hpbmcKKyAgICAgKiBpdCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIEtleUV2ZW50LgorICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgS2V5RXZlbnQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0tleUV2ZW50KEtleUV2ZW50IGUpIHsKICAgICAgICAgcHJvY2Vzc0tleUV2ZW50SW1wbChlLCBrZXlMaXN0ZW5lcnMuZ2V0VXNlckxpc3RlbmVycygpKTsKQEAgLTU3NjksOCArNTM3NiwxMCBAQAogICAgIC8qKgogICAgICAqIFByb2Nlc3Mga2V5IGV2ZW50IGltcGwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKLSAgICAgKiBAcGFyYW0gYyB0aGUgYworICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgZS4KKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIGMuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NLZXlFdmVudEltcGwoS2V5RXZlbnQgZSwgQ29sbGVjdGlvbjxLZXlMaXN0ZW5lcj4gYykgewogICAgICAgICBmb3IgKEtleUxpc3RlbmVyIGxpc3RlbmVyIDogYykgewpAQCAtNTgwMCw3ICs1NDA5LDggQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgbW91c2UgbGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIE1vdXNlTGlzdGVuZXIuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBNb3VzZUxpc3RlbmVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZE1vdXNlTGlzdGVuZXIoTW91c2VMaXN0ZW5lciBsKSB7CiAgICAgICAgIG1vdXNlTGlzdGVuZXJzLmFkZFVzZXJMaXN0ZW5lcihsKTsKQEAgLTU4MDksNyArNTQxOSw4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgYXd0IG1vdXNlIGxpc3RlbmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSBsCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBsLgogICAgICAqLwogICAgIHZvaWQgYWRkQVdUTW91c2VMaXN0ZW5lcihNb3VzZUxpc3RlbmVyIGwpIHsKICAgICAgICAgZW5hYmxlQVdURXZlbnRzKEFXVEV2ZW50Lk1PVVNFX0VWRU5UX01BU0spOwpAQCAtNTgxOSw3ICs1NDMwLDggQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBhd3QgbW91c2UgbW90aW9uIGxpc3RlbmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSBsCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBsLgogICAgICAqLwogICAgIHZvaWQgYWRkQVdUTW91c2VNb3Rpb25MaXN0ZW5lcihNb3VzZU1vdGlvbkxpc3RlbmVyIGwpIHsKICAgICAgICAgZW5hYmxlQVdURXZlbnRzKEFXVEV2ZW50Lk1PVVNFX01PVElPTl9FVkVOVF9NQVNLKTsKQEAgLTU4MjksNyArNTQ0MSw4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgYXd0IGNvbXBvbmVudCBsaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgbAorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgbC4KICAgICAgKi8KICAgICB2b2lkIGFkZEFXVENvbXBvbmVudExpc3RlbmVyKENvbXBvbmVudExpc3RlbmVyIGwpIHsKICAgICAgICAgZW5hYmxlQVdURXZlbnRzKEFXVEV2ZW50LkNPTVBPTkVOVF9FVkVOVF9NQVNLKTsKQEAgLTU4MzksNyArNTQ1Miw4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgYXd0IGlucHV0IG1ldGhvZCBsaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgbAorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgbC4KICAgICAgKi8KICAgICB2b2lkIGFkZEFXVElucHV0TWV0aG9kTGlzdGVuZXIoSW5wdXRNZXRob2RMaXN0ZW5lciBsKSB7CiAgICAgICAgIGVuYWJsZUFXVEV2ZW50cyhBV1RFdmVudC5JTlBVVF9NRVRIT0RfRVZFTlRfTUFTSyk7CkBAIC01ODQ5LDcgKzU0NjMsOCBAQAogICAgIC8qKgogICAgICAqIEFkZHMgdGhlIGF3dCBtb3VzZSB3aGVlbCBsaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgbAorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgbC4KICAgICAgKi8KICAgICB2b2lkIGFkZEFXVE1vdXNlV2hlZWxMaXN0ZW5lcihNb3VzZVdoZWVsTGlzdGVuZXIgbCkgewogICAgICAgICBlbmFibGVBV1RFdmVudHMoQVdURXZlbnQuTU9VU0VfV0hFRUxfRVZFTlRfTUFTSyk7CkBAIC01ODU5LDE3ICs1NDc0LDE5IEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgbW91c2UgbGlzdGVuZXIgcmVnaXN0ZXJlZCBmb3IgdGhpcyBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIE1vdXNlTGlzdGVuZXIuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBNb3VzZUxpc3RlbmVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZU1vdXNlTGlzdGVuZXIoTW91c2VMaXN0ZW5lciBsKSB7CiAgICAgICAgIG1vdXNlTGlzdGVuZXJzLnJlbW92ZVVzZXJMaXN0ZW5lcihsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSBtb3VzZSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZCBvbiB0aGlzIGNvbXBvbmVudAotICAgICAqIGJ5IGRpc3BhdGNoaW5nIGl0IHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICAgKiBQcm9jZXNzZXMgYSBtb3VzZSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZCBvbiB0aGlzIGNvbXBvbmVudCBieQorICAgICAqIGRpc3BhdGNoaW5nIGl0IHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZSB0aGUgTW91c2VFdmVudC4KKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIE1vdXNlRXZlbnQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc01vdXNlRXZlbnQoTW91c2VFdmVudCBlKSB7CiAgICAgICAgIHByb2Nlc3NNb3VzZUV2ZW50SW1wbChlLCBtb3VzZUxpc3RlbmVycy5nZXRVc2VyTGlzdGVuZXJzKCkpOwpAQCAtNTg3OCw4ICs1NDk1LDEwIEBACiAgICAgLyoqCiAgICAgICogUHJvY2VzcyBtb3VzZSBldmVudCBpbXBsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlIHRoZSBlCi0gICAgICogQHBhcmFtIGMgdGhlIGMKKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIGUuCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW91c2VFdmVudEltcGwoTW91c2VFdmVudCBlLCBDb2xsZWN0aW9uPE1vdXNlTGlzdGVuZXI+IGMpIHsKICAgICAgICAgZm9yIChNb3VzZUxpc3RlbmVyIGxpc3RlbmVyIDogYykgewpAQCAtNTkwNiw4ICs1NTI1LDEwIEBACiAgICAgLyoqCiAgICAgICogUHJvY2VzcyBtb3VzZSBtb3Rpb24gZXZlbnQgaW1wbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZSB0aGUgZQotICAgICAqIEBwYXJhbSBjIHRoZSBjCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlLgorICAgICAqIEBwYXJhbSBjCisgICAgICogICAgICAgICAgICB0aGUgYy4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vdXNlTW90aW9uRXZlbnRJbXBsKE1vdXNlRXZlbnQgZSwgQ29sbGVjdGlvbjxNb3VzZU1vdGlvbkxpc3RlbmVyPiBjKSB7CiAgICAgICAgIGZvciAoTW91c2VNb3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IGMpIHsKQEAgLTU5MjMsMTEgKzU1NDQsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdGhlIG1vdXNlIG1vdGlvbiBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCB0bwotICAgICAqIHRoZSBDb21wb25lbnQuCisgICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgbW91c2UgbW90aW9uIGxpc3RlbmVycyByZWdpc3RlcmVkIHRvIHRoZSBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgTW91c2VNb3Rpb25MaXN0ZW5lcnMgcmVnaXN0ZXJlZCB0bwotICAgICAqIHRoZSBDb21wb25lbnQuCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgTW91c2VNb3Rpb25MaXN0ZW5lcnMgcmVnaXN0ZXJlZCB0byB0aGUgQ29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBNb3VzZU1vdGlvbkxpc3RlbmVyW10gZ2V0TW91c2VNb3Rpb25MaXN0ZW5lcnMoKSB7CiAgICAgICAgIHJldHVybiBtb3VzZU1vdGlvbkxpc3RlbmVycy5nZXRVc2VyTGlzdGVuZXJzKG5ldyBNb3VzZU1vdGlvbkxpc3RlbmVyWzBdKTsKQEAgLTU5MzYsNyArNTU1NSw4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIG1vdXNlIG1vdGlvbiBsaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgTW91c2VNb3Rpb25MaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIE1vdXNlTW90aW9uTGlzdGVuZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkTW91c2VNb3Rpb25MaXN0ZW5lcihNb3VzZU1vdGlvbkxpc3RlbmVyIGwpIHsKICAgICAgICAgbW91c2VNb3Rpb25MaXN0ZW5lcnMuYWRkVXNlckxpc3RlbmVyKGwpOwpAQCAtNTk0NSwyOCArNTU2NSwyOCBAQAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIG1vdXNlIG1vdGlvbiBsaXN0ZW5lciByZWdpc3RlcmVkIGZvciB0aGlzIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgTW91c2VNb3Rpb25MaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIE1vdXNlTW90aW9uTGlzdGVuZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlTW91c2VNb3Rpb25MaXN0ZW5lcihNb3VzZU1vdGlvbkxpc3RlbmVyIGwpIHsKICAgICAgICAgbW91c2VNb3Rpb25MaXN0ZW5lcnMucmVtb3ZlVXNlckxpc3RlbmVyKGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBhIG1vdXNlIG1vdGlvbiBldmVudCB0aGF0IGhhcyBvY2N1cnJlZCBvbiB0aGlzIGNvbXBvbmVudAotICAgICAqIGJ5IGRpc3BhdGNoaW5nIGl0IHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICAgKiBQcm9jZXNzZXMgYSBtb3VzZSBtb3Rpb24gZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQgb24gdGhpcyBjb21wb25lbnQgYnkKKyAgICAgKiBkaXNwYXRjaGluZyBpdCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIE1vdXNlRXZlbnQuCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBNb3VzZUV2ZW50LgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NNb3VzZU1vdGlvbkV2ZW50KE1vdXNlRXZlbnQgZSkgewogICAgICAgICBwcm9jZXNzTW91c2VNb3Rpb25FdmVudEltcGwoZSwgbW91c2VNb3Rpb25MaXN0ZW5lcnMuZ2V0VXNlckxpc3RlbmVycygpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHRoZSBtb3VzZSB3aGVlbCBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCB0bwotICAgICAqIHRoZSBDb21wb25lbnQuCisgICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgbW91c2Ugd2hlZWwgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgdG8gdGhlIENvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBNb3VzZVdoZWVsTGlzdGVuZXJzIHJlZ2lzdGVyZWQgdG8KLSAgICAgKiB0aGUgQ29tcG9uZW50LgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIE1vdXNlV2hlZWxMaXN0ZW5lcnMgcmVnaXN0ZXJlZCB0byB0aGUgQ29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBNb3VzZVdoZWVsTGlzdGVuZXJbXSBnZXRNb3VzZVdoZWVsTGlzdGVuZXJzKCkgewogICAgICAgICByZXR1cm4gbW91c2VXaGVlbExpc3RlbmVycy5nZXRVc2VyTGlzdGVuZXJzKG5ldyBNb3VzZVdoZWVsTGlzdGVuZXJbMF0pOwpAQCAtNTk3NSw3ICs1NTk1LDggQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgbW91c2Ugd2hlZWwgbGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIE1vdXNlV2hlZWxMaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIE1vdXNlV2hlZWxMaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRNb3VzZVdoZWVsTGlzdGVuZXIoTW91c2VXaGVlbExpc3RlbmVyIGwpIHsKICAgICAgICAgbW91c2VXaGVlbExpc3RlbmVycy5hZGRVc2VyTGlzdGVuZXIobCk7CkBAIC01OTg0LDI4ICs1NjA1LDMwIEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgbW91c2Ugd2hlZWwgbGlzdGVuZXIgcmVnaXN0ZXJlZCBmb3IgdGhpcyBjb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIE1vdXNlV2hlZWxMaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIE1vdXNlV2hlZWxMaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmVNb3VzZVdoZWVsTGlzdGVuZXIoTW91c2VXaGVlbExpc3RlbmVyIGwpIHsKICAgICAgICAgbW91c2VXaGVlbExpc3RlbmVycy5yZW1vdmVVc2VyTGlzdGVuZXIobCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgbW91c2Ugd2hlZWwgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQgb24gdGhpcyBjb21wb25lbnQKLSAgICAgKiBieSBkaXNwYXRjaGluZyBpdCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAgICogUHJvY2Vzc2VzIGEgbW91c2Ugd2hlZWwgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQgb24gdGhpcyBjb21wb25lbnQgYnkKKyAgICAgKiBkaXNwYXRjaGluZyBpdCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIE1vdXNlV2hlZWxFdmVudC4KKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIE1vdXNlV2hlZWxFdmVudC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTW91c2VXaGVlbEV2ZW50KE1vdXNlV2hlZWxFdmVudCBlKSB7CiAgICAgICAgIHByb2Nlc3NNb3VzZVdoZWVsRXZlbnRJbXBsKGUsIG1vdXNlV2hlZWxMaXN0ZW5lcnMuZ2V0VXNlckxpc3RlbmVycygpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHRoZSBJbnB1dE1ldGhvZExpc3RlbmVyIGxpc3RlbmVycyAKLSAgICAgKiByZWdpc3RlcmVkIHRvIHRoZSBDb21wb25lbnQuCisgICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgSW5wdXRNZXRob2RMaXN0ZW5lciBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCB0byB0aGUKKyAgICAgKiBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgSW5wdXRNZXRob2RMaXN0ZW5lciBsaXN0ZW5lcnMgCi0gICAgICogcmVnaXN0ZXJlZCB0byB0aGUgQ29tcG9uZW50LgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIElucHV0TWV0aG9kTGlzdGVuZXIgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgdG8gdGhlCisgICAgICogICAgICAgICBDb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIElucHV0TWV0aG9kTGlzdGVuZXJbXSBnZXRJbnB1dE1ldGhvZExpc3RlbmVycygpIHsKICAgICAgICAgcmV0dXJuIGlucHV0TWV0aG9kTGlzdGVuZXJzLmdldFVzZXJMaXN0ZW5lcnMobmV3IElucHV0TWV0aG9kTGlzdGVuZXJbMF0pOwpAQCAtNjAxNCw3ICs1NjM3LDggQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgaW5wdXQgbWV0aG9kIGxpc3RlbmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSBJbnB1dE1ldGhvZExpc3RlbmVyLgorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgSW5wdXRNZXRob2RMaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dE1ldGhvZExpc3RlbmVyKElucHV0TWV0aG9kTGlzdGVuZXIgbCkgewogICAgICAgICBpbnB1dE1ldGhvZExpc3RlbmVycy5hZGRVc2VyTGlzdGVuZXIobCk7CkBAIC02MDIzLDE3ICs1NjQ3LDE5IEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgaW5wdXQgbWV0aG9kIGxpc3RlbmVyIHJlZ2lzdGVyZWQgZm9yIHRoaXMgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSBJbnB1dE1ldGhvZExpc3RlbmVyLgorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgSW5wdXRNZXRob2RMaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmVJbnB1dE1ldGhvZExpc3RlbmVyKElucHV0TWV0aG9kTGlzdGVuZXIgbCkgewogICAgICAgICBpbnB1dE1ldGhvZExpc3RlbmVycy5yZW1vdmVVc2VyTGlzdGVuZXIobCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGFuIGlucHV0IG1ldGhvZCBldmVudCB0aGF0IGhhcyBvY2N1cnJlZCBvbiB0aGlzIGNvbXBvbmVudAotICAgICAqIGJ5IGRpc3BhdGNoaW5nIGl0IHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICAgKiBQcm9jZXNzZXMgYW4gaW5wdXQgbWV0aG9kIGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkIG9uIHRoaXMgY29tcG9uZW50IGJ5CisgICAgICogZGlzcGF0Y2hpbmcgaXQgdG8gdGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlIHRoZSBJbnB1dE1ldGhvZEV2ZW50LgorICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgSW5wdXRNZXRob2RFdmVudC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW5wdXRNZXRob2RFdmVudChJbnB1dE1ldGhvZEV2ZW50IGUpIHsKICAgICAgICAgcHJvY2Vzc0lucHV0TWV0aG9kRXZlbnRJbXBsKGUsIGlucHV0TWV0aG9kTGlzdGVuZXJzLmdldFVzZXJMaXN0ZW5lcnMoKSk7CkBAIC02MDQyLDExICs1NjY4LDEyIEBACiAgICAgLyoqCiAgICAgICogUHJvY2VzcyBpbnB1dCBtZXRob2QgZXZlbnQgaW1wbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZSB0aGUgZQotICAgICAqIEBwYXJhbSBjIHRoZSBjCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlLgorICAgICAqIEBwYXJhbSBjCisgICAgICogICAgICAgICAgICB0aGUgYy4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0lucHV0TWV0aG9kRXZlbnRJbXBsKElucHV0TWV0aG9kRXZlbnQgZSwKLSAgICAgICAgICAgIENvbGxlY3Rpb248SW5wdXRNZXRob2RMaXN0ZW5lcj4gYykgeworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSW5wdXRNZXRob2RFdmVudEltcGwoSW5wdXRNZXRob2RFdmVudCBlLCBDb2xsZWN0aW9uPElucHV0TWV0aG9kTGlzdGVuZXI+IGMpIHsKICAgICAgICAgZm9yIChJbnB1dE1ldGhvZExpc3RlbmVyIGxpc3RlbmVyIDogYykgewogICAgICAgICAgICAgc3dpdGNoIChlLmdldElEKCkpIHsKICAgICAgICAgICAgICAgICBjYXNlIElucHV0TWV0aG9kRXZlbnQuQ0FSRVRfUE9TSVRJT05fQ0hBTkdFRDoKQEAgLTYwNTksMzEgKzU2ODYsMjggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBwdWJsaWMgUG9pbnQgZ2V0TW91c2VQb3NpdGlvbigpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIFBvaW50IGFic1BvaW50ZXJQb3MgPSBNb3VzZUluZm8uZ2V0UG9pbnRlckluZm8oKS5nZXRMb2NhdGlvbigpOwotICAgICAgICBXaW5kb3cgd2luVW5kZXJQdHIgPSB0b29sa2l0LmRpc3BhdGNoZXIubW91c2VEaXNwYXRjaGVyLmZpbmRXaW5kb3dBdChhYnNQb2ludGVyUG9zKTsKLSAgICAgICAgUG9pbnQgcG9pbnRlclBvcyA9IE1vdXNlRGlzcGF0Y2hlci5jb252ZXJ0UG9pbnQobnVsbCwgYWJzUG9pbnRlclBvcywgd2luVW5kZXJQdHIpOwotICAgICAgICBib29sZWFuIGlzVW5kZXJQb2ludGVyID0gZmFsc2U7Ci0gICAgICAgIGlmICh3aW5VbmRlclB0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpc1VuZGVyUG9pbnRlciA9IHdpblVuZGVyUHRyLmlzQ29tcG9uZW50QXQodGhpcywgcG9pbnRlclBvcyk7Ci0gICAgICAgIGlmIChpc1VuZGVyUG9pbnRlcikgewotICAgICAgICAgICAgcmV0dXJuIE1vdXNlRGlzcGF0Y2hlci5jb252ZXJ0UG9pbnQobnVsbCwgYWJzUG9pbnRlclBvcywgdGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgICovCisgICAgICogcHVibGljIFBvaW50IGdldE1vdXNlUG9zaXRpb24oKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24geyBQb2ludAorICAgICAqIGFic1BvaW50ZXJQb3MgPSBNb3VzZUluZm8uZ2V0UG9pbnRlckluZm8oKS5nZXRMb2NhdGlvbigpOyBXaW5kb3cKKyAgICAgKiB3aW5VbmRlclB0ciA9CisgICAgICogdG9vbGtpdC5kaXNwYXRjaGVyLm1vdXNlRGlzcGF0Y2hlci5maW5kV2luZG93QXQoYWJzUG9pbnRlclBvcyk7IFBvaW50CisgICAgICogcG9pbnRlclBvcyA9IE1vdXNlRGlzcGF0Y2hlci5jb252ZXJ0UG9pbnQobnVsbCwgYWJzUG9pbnRlclBvcywKKyAgICAgKiB3aW5VbmRlclB0cik7IGJvb2xlYW4gaXNVbmRlclBvaW50ZXIgPSBmYWxzZTsgaWYgKHdpblVuZGVyUHRyID09IG51bGwpIHsKKyAgICAgKiByZXR1cm4gbnVsbDsgfSBpc1VuZGVyUG9pbnRlciA9IHdpblVuZGVyUHRyLmlzQ29tcG9uZW50QXQodGhpcywKKyAgICAgKiBwb2ludGVyUG9zKTsgaWYgKGlzVW5kZXJQb2ludGVyKSB7IHJldHVybgorICAgICAqIE1vdXNlRGlzcGF0Y2hlci5jb252ZXJ0UG9pbnQobnVsbCwgYWJzUG9pbnRlclBvcywgdGhpcyk7IH0gcmV0dXJuIG51bGw7IH0KKyAgICAgKi8KIAogICAgIC8qKgogICAgICAqIFNldCBuYXRpdmUgY2FyZXQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIDxicj4KICAgICAgKiBOb3RlOiB0aGlzIG1ldGhvZCB0YWtlcyBBV1QgbG9jayBpbnNpZGUgYmVjYXVzZSBpdCB3YWxrcyB0aHJvdWdoIHRoZQogICAgICAqIGNvbXBvbmVudCBoaWVyYXJjaHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHgKLSAgICAgKiBAcGFyYW0geSB0aGUgeQorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkuCiAgICAgICovCiAgICAgdm9pZCBzZXRDYXJldFBvcyhmaW5hbCBpbnQgeCwgZmluYWwgaW50IHkpIHsKICAgICAgICAgUnVubmFibGUgciA9IG5ldyBSdW5uYWJsZSgpIHsKQEAgLTYxMDYsMzUgKzU3MzAsMzQgQEAKICAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgYXQgZXZlbnQgZGlzcGF0Y2ggdGhyZWFkLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4Ci0gICAgICogQHBhcmFtIHkgdGhlIHkKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHguCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5LgogICAgICAqLwogICAgIHZvaWQgc2V0Q2FyZXRQb3NJbXBsKGludCB4LCBpbnQgeSkgewogICAgICAgICBDb21wb25lbnQgYyA9IHRoaXM7CiAgICAgICAgIHdoaWxlICgoYyAhPSBudWxsKSAmJiBjLmJlaGF2aW91ci5pc0xpZ2h0d2VpZ2h0KCkpIHsKICAgICAgICAgICAgIHggKz0gYy54OwogICAgICAgICAgICAgeSArPSBjLnk7Ci0gICAgICAgICAgICAvLz8/P0FXVDogYyA9IGMuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IGMgPSBjLmdldFBhcmVudCgpOwogICAgICAgICB9CiAgICAgICAgIGlmIChjID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICAvLz8/P0FXVAorICAgICAgICAvLyA/Pz9BV1QKICAgICAgICAgLyoKLSAgICAgICAgaWYgKGMgaW5zdGFuY2VvZiBXaW5kb3cpIHsKLSAgICAgICAgICAgIEluc2V0cyBpbnNldHMgPSBjLmdldE5hdGl2ZUluc2V0cygpOwotICAgICAgICAgICAgeCAtPSBpbnNldHMubGVmdDsKLSAgICAgICAgICAgIHkgLT0gaW5zZXRzLnRvcDsKLSAgICAgICAgfQotICAgICAgICB0b29sa2l0LmdldFdpbmRvd0ZhY3RvcnkoKS5zZXRDYXJldFBvc2l0aW9uKHgsIHkpOwotICAgICAgICAqLworICAgICAgICAgKiBpZiAoYyBpbnN0YW5jZW9mIFdpbmRvdykgeyBJbnNldHMgaW5zZXRzID0gYy5nZXROYXRpdmVJbnNldHMoKTsgeCAtPQorICAgICAgICAgKiBpbnNldHMubGVmdDsgeSAtPSBpbnNldHMudG9wOyB9CisgICAgICAgICAqIHRvb2xraXQuZ2V0V2luZG93RmFjdG9yeSgpLnNldENhcmV0UG9zaXRpb24oeCwgeSk7CisgICAgICAgICAqLwogICAgIH0KIAogICAgIC8vIHRvIGJlIG92ZXJyaWRkZW4gaW4gc3RhbmRhcmQgY29tcG9uZW50cyBzdWNoIGFzIEJ1dHRvbiBhbmQgTGlzdAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRlZmF1bHQgbWluaW11bSBzaXplLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgbWluaW11bSBzaXplCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBtaW5pbXVtIHNpemUuCiAgICAgICovCiAgICAgRGltZW5zaW9uIGdldERlZmF1bHRNaW5pbXVtU2l6ZSgpIHsKICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC02MTQ0LDcgKzU3NjcsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRlZmF1bHQgcHJlZmVycmVkIHNpemUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBwcmVmZXJyZWQgc2l6ZQorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgcHJlZmVycmVkIHNpemUuCiAgICAgICovCiAgICAgRGltZW5zaW9uIGdldERlZmF1bHRQcmVmZXJyZWRTaXplKCkgewogICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTYxNTcsMzAgKzU3ODAsMjggQEAKICAgICB2b2lkIHJlc2V0RGVmYXVsdFNpemUoKSB7CiAgICAgfQogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIENvbXBvbmVudEJlaGF2aW9yIGNyZWF0ZUJlaGF2aW9yKCkgewotICAgICAgICByZXR1cm4gbmV3IExXQmVoYXZpb3IodGhpcyk7Ci0gICAgfQotICAgICovCisgICAgICogQ29tcG9uZW50QmVoYXZpb3IgY3JlYXRlQmVoYXZpb3IoKSB7IHJldHVybiBuZXcgTFdCZWhhdmlvcih0aGlzKTsgfQorICAgICAqLwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZGVmYXVsdCBiYWNrZ3JvdW5kLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgYmFja2dyb3VuZAorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgYmFja2dyb3VuZC4KICAgICAgKi8KICAgICBDb2xvciBnZXREZWZhdWx0QmFja2dyb3VuZCgpIHsKLSAgICAgICAgLy8/Pz9BV1Q6IHJldHVybiBnZXRXaW5kb3dBbmNlc3RvcigpLmdldERlZmF1bHRCYWNrZ3JvdW5kKCk7CisgICAgICAgIC8vID8/P0FXVDogcmV0dXJuIGdldFdpbmRvd0FuY2VzdG9yKCkuZ2V0RGVmYXVsdEJhY2tncm91bmQoKTsKICAgICAgICAgcmV0dXJuIGdldEJhY2tncm91bmQoKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IGZvcmVncm91bmQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBmb3JlZ3JvdW5kCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBmb3JlZ3JvdW5kLgogICAgICAqLwogICAgIENvbG9yIGdldERlZmF1bHRGb3JlZ3JvdW5kKCkgewotICAgICAgICAvLz8/P0FXVCByZXR1cm4gZ2V0V2luZG93QW5jZXN0b3IoKS5nZXREZWZhdWx0Rm9yZWdyb3VuZCgpOworICAgICAgICAvLyA/Pz9BV1QgcmV0dXJuIGdldFdpbmRvd0FuY2VzdG9yKCkuZ2V0RGVmYXVsdEZvcmVncm91bmQoKTsKICAgICAgICAgcmV0dXJuIGdldEZvcmVncm91bmQoKTsKICAgICB9CiAKQEAgLTYxODgsNyArNTgwOSw4IEBACiAgICAgICogQ2FsbGVkIHdoZW4gbmF0aXZlIHJlc291cmNlIGZvciB0aGlzIGNvbXBvbmVudCBpcyBjcmVhdGVkIChmb3IKICAgICAgKiBoZWF2eXdlaWdodHMgb25seSkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpbiB0aGUgd2luCisgICAgICogQHBhcmFtIHdpbgorICAgICAqICAgICAgICAgICAgdGhlIHdpbi4KICAgICAgKi8KICAgICB2b2lkIG5hdGl2ZVdpbmRvd0NyZWF0ZWQoTmF0aXZlV2luZG93IHdpbikgewogICAgICAgICAvLyB0byBiZSBvdmVycmlkZGVuCkBAIC02MTk4LDQ4ICs1ODIwLDM3IEBACiAgICAgICogRGV0ZXJtaW5lIHRoZSBjb21wb25lbnQncyBhcmVhIGhpZGRlbiBiZWhpbmQgdGhlIHdpbmRvd3MgdGhhdCBoYXZlIGhpZ2hlcgogICAgICAqIFotb3JkZXIsIGluY2x1ZGluZyB3aW5kb3dzIG9mIG90aGVyIGFwcGxpY2F0aW9ucy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2UgdGhlIGltYWdlCi0gICAgICogQHBhcmFtIGRlc3RMb2NhdGlvbiB0aGUgZGVzdCBsb2NhdGlvbgotICAgICAqIEBwYXJhbSBkZXN0U2l6ZSB0aGUgZGVzdCBzaXplCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2FsY3VsYXRlZCByZWdpb24sIG9yIG51bGwgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQKKyAgICAgKiBAcGFyYW0gaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gZGVzdExvY2F0aW9uCisgICAgICogICAgICAgICAgICB0aGUgZGVzdCBsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gZGVzdFNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0IHNpemUuCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjYWxjdWxhdGVkIHJlZ2lvbiwgb3IgbnVsbCBpZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KICAgICAgKi8KLSAgICAvLz8/P0FXVAorICAgIC8vID8/P0FXVAogICAgIC8qCi0gICAgTXVsdGlSZWN0QXJlYSBnZXRPYnNjdXJlZFJlZ2lvbihSZWN0YW5nbGUgcGFydCkgewotICAgICAgICBpZiAoIXZpc2libGUgfHwgcGFyZW50ID09IG51bGwgfHwgIXBhcmVudC52aXNpYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgdywgaCk7Ci0gICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHIgPSByLmludGVyc2VjdGlvbihwYXJ0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHIudHJhbnNsYXRlKHgsIHkpOwotICAgICAgICBNdWx0aVJlY3RBcmVhIHJldCA9IHBhcmVudC5nZXRPYnNjdXJlZFJlZ2lvbihyKTsKLSAgICAgICAgaWYgKHJldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYXJlbnQuYWRkT2JzY3VyZWRSZWdpb25zKHJldCwgdGhpcyk7Ci0gICAgICAgICAgICByZXQudHJhbnNsYXRlKC14LCAteSk7Ci0gICAgICAgICAgICByZXQuaW50ZXJzZWN0KG5ldyBSZWN0YW5nbGUoMCwgMCwgdywgaCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgICovCisgICAgICogTXVsdGlSZWN0QXJlYSBnZXRPYnNjdXJlZFJlZ2lvbihSZWN0YW5nbGUgcGFydCkgeyBpZiAoIXZpc2libGUgfHwgcGFyZW50CisgICAgICogPT0gbnVsbCB8fCAhcGFyZW50LnZpc2libGUpIHsgcmV0dXJuIG51bGw7IH0gUmVjdGFuZ2xlIHIgPSBuZXcKKyAgICAgKiBSZWN0YW5nbGUoMCwgMCwgdywgaCk7IGlmIChwYXJ0ICE9IG51bGwpIHsgciA9IHIuaW50ZXJzZWN0aW9uKHBhcnQpOyB9IGlmCisgICAgICogKHIuaXNFbXB0eSgpKSB7IHJldHVybiBudWxsOyB9IHIudHJhbnNsYXRlKHgsIHkpOyBNdWx0aVJlY3RBcmVhIHJldCA9CisgICAgICogcGFyZW50LmdldE9ic2N1cmVkUmVnaW9uKHIpOyBpZiAocmV0ICE9IG51bGwpIHsKKyAgICAgKiBwYXJlbnQuYWRkT2JzY3VyZWRSZWdpb25zKHJldCwgdGhpcyk7IHJldC50cmFuc2xhdGUoLXgsIC15KTsKKyAgICAgKiByZXQuaW50ZXJzZWN0KG5ldyBSZWN0YW5nbGUoMCwgMCwgdywgaCkpOyB9IHJldHVybiByZXQ7IH0KKyAgICAgKi8KIAotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBzdHJlYW0uZGVmYXVsdFJlYWRPYmplY3QoKTsKLSAgICAgICAgRmllbGRzQWNjZXNzb3IgYWNjZXNzb3IgPSBuZXcgRmllbGRzQWNjZXNzb3IoQ29tcG9uZW50LmNsYXNzLCB0aGlzKTsKLSAgICAgICAgYWNjZXNzb3Iuc2V0KCJ0b29sa2l0IiwgVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhY2Nlc3Nvci5zZXQoImJlaGF2aW91ciIsIGNyZWF0ZUJlaGF2aW9yKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFjY2Vzc29yLnNldCgiY29tcG9uZW50TG9jayIsIG5ldyBPYmplY3QoKSk7IC8vICROT04tTE9DSy0xJCAvLyROT04tTkxTLTEkCi0gICAgfQotICAgICovCisgICAgICogcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICogQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7IHN0cmVhbS5kZWZhdWx0UmVhZE9iamVjdCgpOyBGaWVsZHNBY2Nlc3NvcgorICAgICAqIGFjY2Vzc29yID0gbmV3IEZpZWxkc0FjY2Vzc29yKENvbXBvbmVudC5jbGFzcywgdGhpcyk7CisgICAgICogYWNjZXNzb3Iuc2V0KCJ0b29sa2l0IiwgVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpKTsgLy8kTk9OLU5MUy0xJAorICAgICAqIGFjY2Vzc29yLnNldCgiYmVoYXZpb3VyIiwgY3JlYXRlQmVoYXZpb3IoKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgKiBhY2Nlc3Nvci5zZXQoImNvbXBvbmVudExvY2siLCBuZXcgT2JqZWN0KCkpOyAvLyAkTk9OLUxPQ0stMSQKKyAgICAgKiAvLyROT04tTkxTLTEkIH0KKyAgICAgKi8KIAogICAgIGZpbmFsIHZvaWQgb25EcmF3SW1hZ2UoSW1hZ2UgaW1hZ2UsIFBvaW50IGRlc3RMb2NhdGlvbiwgRGltZW5zaW9uIGRlc3RTaXplLCBSZWN0YW5nbGUgc291cmNlKSB7CiAgICAgICAgIEltYWdlUGFyYW1ldGVycyBpbWFnZVBhcmFtczsKQEAgLTYyNzIsMzMgKzU4ODMsMzcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBwcml2YXRlIHZvaWQgaW52YWxpZGF0ZVJlYWxQYXJlbnQoKSB7Ci0gICAgICAgIENvbnRhaW5lciByZWFsUGFyZW50ID0gZ2V0UmVhbFBhcmVudCgpOwotICAgICAgICBpZiAoKHJlYWxQYXJlbnQgIT0gbnVsbCkgJiYgcmVhbFBhcmVudC5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIHJlYWxQYXJlbnQuaW52YWxpZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgICovCisgICAgICogcHJpdmF0ZSB2b2lkIGludmFsaWRhdGVSZWFsUGFyZW50KCkgeyBDb250YWluZXIgcmVhbFBhcmVudCA9CisgICAgICogZ2V0UmVhbFBhcmVudCgpOyBpZiAoKHJlYWxQYXJlbnQgIT0gbnVsbCkgJiYgcmVhbFBhcmVudC5pc1ZhbGlkKCkpIHsKKyAgICAgKiByZWFsUGFyZW50LmludmFsaWRhdGUoKTsgfSB9CisgICAgICovCiAKICAgICAvKioKICAgICAgKiBUaGUgQ2xhc3MgSW1hZ2VQYXJhbWV0ZXJzLgogICAgICAqLwogICAgIHByaXZhdGUgY2xhc3MgSW1hZ2VQYXJhbWV0ZXJzIHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgZHJhd2luZyBwYXJhbXMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkcmF3aW5nIHBhcmFtcy4KKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgZmluYWwgTGlua2VkTGlzdDxEcmF3aW5nUGFyYW1ldGVycz4gZHJhd2luZ1BhcmFtcyA9IG5ldyBMaW5rZWRMaXN0PERyYXdpbmdQYXJhbWV0ZXJzPigpOwogCi0gICAgICAgIC8qKiBUaGUgc2l6ZS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzaXplLgorICAgICAgICAgKi8KICAgICAgICAgRGltZW5zaW9uIHNpemUgPSBuZXcgRGltZW5zaW9uKENvbXBvbmVudC50aGlzLncsIENvbXBvbmVudC50aGlzLmgpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBBZGRzIHRoZSBkcmF3aW5nLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGRlc3RMb2NhdGlvbiB0aGUgZGVzdCBsb2NhdGlvbgotICAgICAgICAgKiBAcGFyYW0gZGVzdFNpemUgdGhlIGRlc3Qgc2l6ZQotICAgICAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2UKKyAgICAgICAgICogQHBhcmFtIGRlc3RMb2NhdGlvbgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0IGxvY2F0aW9uLgorICAgICAgICAgKiBAcGFyYW0gZGVzdFNpemUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZGVzdCBzaXplLgorICAgICAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZS4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgYWRkRHJhd2luZyhQb2ludCBkZXN0TG9jYXRpb24sIERpbWVuc2lvbiBkZXN0U2l6ZSwgUmVjdGFuZ2xlIHNvdXJjZSkgewogICAgICAgICAgICAgZHJhd2luZ1BhcmFtcy5hZGQobmV3IERyYXdpbmdQYXJhbWV0ZXJzKGRlc3RMb2NhdGlvbiwgZGVzdFNpemUsIHNvdXJjZSkpOwpAQCAtNjMwNyw3ICs1OTIyLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIERyYXdpbmcgcGFyYW1ldGVycyBpdGVyYXRvci4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGl0ZXJhdG9yPCBkcmF3aW5nIHBhcmFtZXRlcnM+CisgICAgICAgICAqIEByZXR1cm4gdGhlIGl0ZXJhdG9yPCBkcmF3aW5nIHBhcmFtZXRlcnM+LgogICAgICAgICAgKi8KICAgICAgICAgSXRlcmF0b3I8RHJhd2luZ1BhcmFtZXRlcnM+IGRyYXdpbmdQYXJhbWV0ZXJzSXRlcmF0b3IoKSB7CiAgICAgICAgICAgICByZXR1cm4gZHJhd2luZ1BhcmFtcy5pdGVyYXRvcigpOwpAQCAtNjMxNywyMiArNTkzMiwzMSBAQAogICAgICAgICAgKiBUaGUgQ2xhc3MgRHJhd2luZ1BhcmFtZXRlcnMuCiAgICAgICAgICAqLwogICAgICAgICBjbGFzcyBEcmF3aW5nUGFyYW1ldGVycyB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgZGVzdCBsb2NhdGlvbi4gKi8KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgZGVzdCBsb2NhdGlvbi4KKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgUG9pbnQgZGVzdExvY2F0aW9uOwogCi0gICAgICAgICAgICAvKiogVGhlIGRlc3Qgc2l6ZS4gKi8KKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIGRlc3Qgc2l6ZS4KKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgRGltZW5zaW9uIGRlc3RTaXplOwogCi0gICAgICAgICAgICAvKiogVGhlIHNvdXJjZS4gKi8KKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIHNvdXJjZS4KKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgUmVjdGFuZ2xlIHNvdXJjZTsKIAogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZHJhd2luZyBwYXJhbWV0ZXJzLgogICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBAcGFyYW0gZGVzdExvY2F0aW9uIHRoZSBkZXN0IGxvY2F0aW9uCi0gICAgICAgICAgICAgKiBAcGFyYW0gZGVzdFNpemUgdGhlIGRlc3Qgc2l6ZQotICAgICAgICAgICAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlCisgICAgICAgICAgICAgKiBAcGFyYW0gZGVzdExvY2F0aW9uCisgICAgICAgICAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0IGxvY2F0aW9uLgorICAgICAgICAgICAgICogQHBhcmFtIGRlc3RTaXplCisgICAgICAgICAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0IHNpemUuCisgICAgICAgICAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICAgICAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UuCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIERyYXdpbmdQYXJhbWV0ZXJzKFBvaW50IGRlc3RMb2NhdGlvbiwgRGltZW5zaW9uIGRlc3RTaXplLCBSZWN0YW5nbGUgc291cmNlKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5kZXN0TG9jYXRpb24gPSBuZXcgUG9pbnQoZGVzdExvY2F0aW9uKTsKQEAgLTYzNTMsNDQgKzU5NzcsMzIgQEAKICAgICAvKioKICAgICAgKiBUZXh0Q29tcG9uZW50IHN1cHBvcnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIGUuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBkaXNwYXRjaCBldmVudCB0byBpbS4KKyAgICAgKi8KKyAgICAvLyA/Pz9BV1QKKyAgICAvKgorICAgICAqIHByaXZhdGUgVGV4dEtpdCB0ZXh0S2l0ID0gbnVsbDsgVGV4dEtpdCBnZXRUZXh0S2l0KCkgeyByZXR1cm4gdGV4dEtpdDsgfQorICAgICAqIHZvaWQgc2V0VGV4dEtpdChUZXh0S2l0IGtpdCkgeyB0ZXh0S2l0ID0ga2l0OyB9CisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBUZXh0RmllbGQgc3VwcG9ydC4KKyAgICAgKi8KKyAgICAvLyA/Pz9BV1QKKyAgICAvKgorICAgICAqIHByaXZhdGUgVGV4dEZpZWxkS2l0IHRleHRGaWVsZEtpdCA9IG51bGw7IFRleHRGaWVsZEtpdCBnZXRUZXh0RmllbGRLaXQoKQorICAgICAqIHsgcmV0dXJuIHRleHRGaWVsZEtpdDsgfSB2b2lkIHNldFRleHRGaWVsZEtpdChUZXh0RmllbGRLaXQga2l0KSB7CisgICAgICogdGV4dEZpZWxkS2l0ID0ga2l0OyB9CisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBEaXNwYXRjaGVzIGlucHV0ICYgZm9jdXMgZXZlbnRzIHRvIGlucHV0IG1ldGhvZCBjb250ZXh0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgZGlzcGF0Y2ggZXZlbnQgdG8gaW0KLSAgICAgKi8KLSAgICAvLz8/P0FXVAotICAgIC8qCi0gICAgcHJpdmF0ZSBUZXh0S2l0IHRleHRLaXQgPSBudWxsOwotCi0gICAgVGV4dEtpdCBnZXRUZXh0S2l0KCkgewotICAgICAgICByZXR1cm4gdGV4dEtpdDsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFRleHRLaXQoVGV4dEtpdCBraXQpIHsKLSAgICAgICAgdGV4dEtpdCA9IGtpdDsKLSAgICB9Ci0gICAgKi8KLQotICAgIC8qKgotICAgICAqIFRleHRGaWVsZCBzdXBwb3J0Ci0gICAgICovCi0gICAgLy8/Pz9BV1QKLSAgICAvKgotICAgIHByaXZhdGUgVGV4dEZpZWxkS2l0IHRleHRGaWVsZEtpdCA9IG51bGw7Ci0KLSAgICBUZXh0RmllbGRLaXQgZ2V0VGV4dEZpZWxkS2l0KCkgewotICAgICAgICByZXR1cm4gdGV4dEZpZWxkS2l0OwotICAgIH0KLQotICAgIHZvaWQgc2V0VGV4dEZpZWxkS2l0KFRleHRGaWVsZEtpdCBraXQpIHsKLSAgICAgICAgdGV4dEZpZWxkS2l0ID0ga2l0OwotICAgIH0KLSAgICAqLwotCi0gICAgLyoqCi0gICAgICogRGlzcGF0Y2hlcyBpbnB1dCAmIGZvY3VzIGV2ZW50cyB0byBpbnB1dCBtZXRob2QKLSAgICAgKiBjb250ZXh0LgotICAgICAqIEBwYXJhbSBlIGV2ZW50IHRvIHBhc3MgdG8gSW5wdXRDb250ZXh0LmRpc3BhdGNoRXZlbnQoKQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBldmVudCB3YXMgY29uc3VtZWQgYnkgSU0sIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICBldmVudCB0byBwYXNzIHRvIElucHV0Q29udGV4dC5kaXNwYXRjaEV2ZW50KCkuCisgICAgICogQHJldHVybiB0cnVlIGlmIGV2ZW50IHdhcyBjb25zdW1lZCBieSBJTSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBkaXNwYXRjaEV2ZW50VG9JTShBV1RFdmVudCBlKSB7CiAgICAgICAgIElucHV0Q29udGV4dCBpYyA9IGdldElucHV0Q29udGV4dCgpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0NvbXBvbmVudEJlaGF2aW9yLmphdmEgYi9hd3QvamF2YS9hd3QvQ29tcG9uZW50QmVoYXZpb3IuamF2YQppbmRleCA4OWM5OTk5Li5mNGU4ZmZiIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvQ29tcG9uZW50QmVoYXZpb3IuamF2YQorKysgYi9hd3QvamF2YS9hd3QvQ29tcG9uZW50QmVoYXZpb3IuamF2YQpAQCAtMjQsNyArMjQsNyBAQAogCiAvKioKICAqIFRoZSBpbnRlcmZhY2Ugb2YgdGhlIGhlbHBlciBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIGRpZmZlcmVuY2UKLSAqIGJldHdlZW4gbGlnaHR3ZWlnaHQgYW5kIGhlYXZ5d2VpZ2h0IGNvbXBvbmVudHMuIAorICogYmV0d2VlbiBsaWdodHdlaWdodCBhbmQgaGVhdnl3ZWlnaHQgY29tcG9uZW50cy4KICAqLwogaW50ZXJmYWNlIENvbXBvbmVudEJlaGF2aW9yIHsKIApkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0NvbXBvbmVudE9yaWVudGF0aW9uLmphdmEgYi9hd3QvamF2YS9hd3QvQ29tcG9uZW50T3JpZW50YXRpb24uamF2YQppbmRleCBkZGIxMThkLi41YWNjMTFhIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvQ29tcG9uZW50T3JpZW50YXRpb24uamF2YQorKysgYi9hd3QvamF2YS9hd3QvQ29tcG9uZW50T3JpZW50YXRpb24uamF2YQpAQCAtMTgsNDQgKzE4LDU5IEBACiAgKiBAYXV0aG9yIE1pY2hhZWwgRGFuaWxvdiwgRG1pdHJ5IEEuIER1cm5ldgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIAogLyoqCi0gKiBUaGUgQ29tcG9uZW50T3JpZW50YXRpb24gY2xhc3Mgc3BlY2lmaWVzIHRoZSBsYW5ndWFnZS1zZW5zaXRpdmUgb3JpZW50YXRpb24gCi0gKiBvZiBjb21wb25lbnQncyBlbGVtZW50cyBvciB0ZXh0LiBJdCBpcyB1c2VkIHRvIHJlZmxlY3QgdGhlIGRpZmZlcmVuY2VzIGluIHRoaXMgCi0gKiBvcmRlcmluZyBiZXR3ZWVuIGRpZmZlcmVudCB3cml0dGluZyBzeXN0ZW1zLiBUaGUgQ29tcG9uZW50T3JpZW50YXRpb24gY2xhc3MgCi0gKiBpbmRpY2F0ZXMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBlbGVtZW50cy90ZXh0IGluIHRoZSBob3Jpem9udGFsIGRpcmVjdGlvbgotICogKCJsZWZ0IHRvIHJpZ2h0IiBvciAicmlnaHQgdG8gbGVmdCIpIGFuZCBpbiB0aGUgdmVydGljYWwgZGlyZWN0aW9uCisgKiBUaGUgQ29tcG9uZW50T3JpZW50YXRpb24gY2xhc3Mgc3BlY2lmaWVzIHRoZSBsYW5ndWFnZS1zZW5zaXRpdmUgb3JpZW50YXRpb24KKyAqIG9mIGNvbXBvbmVudCdzIGVsZW1lbnRzIG9yIHRleHQuIEl0IGlzIHVzZWQgdG8gcmVmbGVjdCB0aGUgZGlmZmVyZW5jZXMgaW4KKyAqIHRoaXMgb3JkZXJpbmcgYmV0d2VlbiBkaWZmZXJlbnQgd3JpdGluZyBzeXN0ZW1zLiBUaGUgQ29tcG9uZW50T3JpZW50YXRpb24KKyAqIGNsYXNzIGluZGljYXRlcyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIGVsZW1lbnRzL3RleHQgaW4gdGhlIGhvcml6b250YWwKKyAqIGRpcmVjdGlvbiAoImxlZnQgdG8gcmlnaHQiIG9yICJyaWdodCB0byBsZWZ0IikgYW5kIGluIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb24KICAqICgidG9wIHRvIGJvdHRvbSIgb3IgImJvdHRvbSB0byB0b3AiKS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBDb21wb25lbnRPcmllbnRhdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQxMTMyOTEzOTIxNDM1NjM4MjhMOwogCi0gICAgLyoqIAorICAgIC8qKgogICAgICAqIFRoZSBDb25zdGFudCBMRUZUX1RPX1JJR0hUIGluZGljYXRlcyB0aGF0IGl0ZW1zIHJ1biBsZWZ0IHRvIHJpZ2h0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50T3JpZW50YXRpb24gTEVGVF9UT19SSUdIVCA9IG5ldyBDb21wb25lbnRPcmllbnRhdGlvbih0cnVlLCB0cnVlKTsKIAotICAgIC8qKiAKKyAgICAvKioKICAgICAgKiBUaGUgQ29uc3RhbnQgUklHSFRfVE9fTEVGVCBpbmRpY2F0ZXMgdGhhdCBpdGVtcyBydW4gcmlnaHQgdG8gbGVmdC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE9yaWVudGF0aW9uIFJJR0hUX1RPX0xFRlQgPSBuZXcgQ29tcG9uZW50T3JpZW50YXRpb24odHJ1ZSwgZmFsc2UpOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBVTktOT1dOIGluZGljYXRlcyB0aGF0IGEgY29tcG9uZW50J3Mgb3JpZW50YXRpb24gaXMgbm90IHNldC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVU5LTk9XTiBpbmRpY2F0ZXMgdGhhdCBhIGNvbXBvbmVudCdzIG9yaWVudGF0aW9uIGlzIG5vdCBzZXQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnRPcmllbnRhdGlvbiBVTktOT1dOID0gbmV3IENvbXBvbmVudE9yaWVudGF0aW9uKHRydWUsIHRydWUpOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBybExhbmdzLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHJsTGFuZ3MgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7IC8vUklHSFRfVE9fTEVGVCBsYW5ndWFnZXMKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgcmxMYW5ncy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBybExhbmdzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOyAvLyBSSUdIVF9UT19MRUZUCiAKLSAgICAvKiogVGhlIGhvcml6b250YWwuICovCisgICAgLy8gbGFuZ3VhZ2VzCisKKyAgICAvKioKKyAgICAgKiBUaGUgaG9yaXpvbnRhbC4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaG9yaXpvbnRhbDsKIAotICAgIC8qKiBUaGUgbGVmdDJyaWdodC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbGVmdDJyaWdodC4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbGVmdDJyaWdodDsKIAogICAgIHN0YXRpYyB7CkBAIC02OCwxMCArODMsOSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG9yaWVudGF0aW9uIGZvciB0aGUgZ2l2ZW4gUmVzb3VyY2VCdW5kbGUncyBsb2NhbGl6YXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIGJkbCB0aGUgUmVzb3VyY2VCdW5kbGUuCi0gICAgICogCisgICAgICogQHBhcmFtIGJkbAorICAgICAqICAgICAgICAgICAgdGhlIFJlc291cmNlQnVuZGxlLgogICAgICAqIEByZXR1cm4gdGhlIENvbXBvbmVudE9yaWVudGF0aW9uLgotICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFVzZSBnZXRPcmllbnRhdGlvbihqYXZhLnV0aWwuTG9jYWxlKSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTc5LDEyICs5MywxMSBAQAogICAgICAgICBPYmplY3Qgb2JqID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG9iaiA9IGJkbC5nZXRPYmplY3QoIk9yaWVudGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkgeworICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7CiAgICAgICAgICAgICBvYmogPSBudWxsOwogICAgICAgICB9CiAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb21wb25lbnRPcmllbnRhdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIChDb21wb25lbnRPcmllbnRhdGlvbikgb2JqOworICAgICAgICAgICAgcmV0dXJuIChDb21wb25lbnRPcmllbnRhdGlvbilvYmo7CiAgICAgICAgIH0KICAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGJkbC5nZXRMb2NhbGUoKTsKICAgICAgICAgaWYgKGxvY2FsZSA9PSBudWxsKSB7CkBAIC05Niw4ICsxMDksOCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG9yaWVudGF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGxvY2FsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbG9jYWxlIHRoZSBzcGVjaWZpZWQgTG9jYWxlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBsb2NhbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgTG9jYWxlLgogICAgICAqIEByZXR1cm4gdGhlIENvbXBvbmVudE9yaWVudGF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ29tcG9uZW50T3JpZW50YXRpb24gZ2V0T3JpZW50YXRpb24oTG9jYWxlIGxvY2FsZSkgewpAQCAtMTA4LDggKzEyMSwxMCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBjb21wb25lbnQgb3JpZW50YXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIGhvciB3aGV0aGVyIHRoZSBpdGVtcyBzaG91bGQgYmUgYXJyYW5nZWQgaG9yaXpvbnRhbGx5Ci0gICAgICogQHBhcmFtIGwyciB3aGV0aGVyIHRoaXMgb3JpZW50YXRpb24gc3BlY2lmaWVzIGEgbGVmdC10by1yaWdodCBmbG93CisgICAgICogQHBhcmFtIGhvcgorICAgICAqICAgICAgICAgICAgd2hldGhlciB0aGUgaXRlbXMgc2hvdWxkIGJlIGFycmFuZ2VkIGhvcml6b250YWxseS4KKyAgICAgKiBAcGFyYW0gbDJyCisgICAgICogICAgICAgICAgICB3aGV0aGVyIHRoaXMgb3JpZW50YXRpb24gc3BlY2lmaWVzIGEgbGVmdC10by1yaWdodCBmbG93LgogICAgICAqLwogICAgIHByaXZhdGUgQ29tcG9uZW50T3JpZW50YXRpb24oYm9vbGVhbiBob3IsIGJvb2xlYW4gbDJyKSB7CiAgICAgICAgIGhvcml6b250YWwgPSBob3I7CkBAIC0xMTcsMTEgKzEzMiwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGV4dCBvZiB0aGUgb2Ygd3JpdGluZyBzeXN0ZW1zIGFycmFuZ2VkCi0gICAgICogaG9yaXpvbnRhbGx5LgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGV4dCBvZiB0aGUgb2Ygd3JpdGluZyBzeXN0ZW1zIGFycmFuZ2VkIGhvcml6b250YWxseS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSB0ZXh0IGlzIHdyaXR0ZW4gaG9yaXpvbnRhbGx5LCBmYWxzZSAKLSAgICAgKiBmb3IgYSB2ZXJ0aWNhbCBhcnJhbmdlbWVudC4gCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgdGV4dCBpcyB3cml0dGVuIGhvcml6b250YWxseSwgZmFsc2UgZm9yIGEgdmVydGljYWwKKyAgICAgKiAgICAgICAgIGFycmFuZ2VtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzSG9yaXpvbnRhbCgpIHsKICAgICAgICAgcmV0dXJuIGhvcml6b250YWw7CkBAIC0xMzAsOCArMTQ0LDggQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRleHQgaXMgYXJyYW5nZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgZm9yIHdyaXRpbmcgc3lzdGVtcyB3cml0dGVuIGZyb20gbGVmdCB0byByaWdodDsgCi0gICAgICogZmFsc2UgZm9yIHJpZ2h0LXRvLWxlZnQuCisgICAgICogQHJldHVybiB0cnVlLCBmb3Igd3JpdGluZyBzeXN0ZW1zIHdyaXR0ZW4gZnJvbSBsZWZ0IHRvIHJpZ2h0OyBmYWxzZSBmb3IKKyAgICAgKiAgICAgICAgIHJpZ2h0LXRvLWxlZnQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNMZWZ0VG9SaWdodCgpIHsKICAgICAgICAgcmV0dXJuIGxlZnQycmlnaHQ7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvQ29tcG9zaXRlLmphdmEgYi9hd3QvamF2YS9hd3QvQ29tcG9zaXRlLmphdmEKaW5kZXggOGU1YjkwYS4uZDE3MzBmZSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0NvbXBvc2l0ZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9Db21wb3NpdGUuamF2YQpAQCAtMTgsMzAgKzE4LDM0IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dDsKIAogaW1wb3J0IGphdmEuYXd0LmltYWdlLkNvbG9yTW9kZWw7CiAKIC8qKgotICogVGhlIENvbXBvc2l0ZSBpbnRlcmZhY2UgYWxsb3dzIHRoZSBtZXRob2RzIHRvIGNvbXBvc2UgYSBkcmF3IHByaW1pdGl2ZSAKLSAqIG9uIHRoZSBncmFwaGljcyBhcmVhLiBUaGUgY2xhc3NlcyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgCi0gKiB0aGUgcnVsZXMgYW5kIGEgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgY29udGV4dCBmb3IgYSBwYXJ0aWN1bGFyIG9wZXJhdGlvbi4KKyAqIFRoZSBDb21wb3NpdGUgaW50ZXJmYWNlIGFsbG93cyB0aGUgbWV0aG9kcyB0byBjb21wb3NlIGEgZHJhdyBwcmltaXRpdmUgb24gdGhlCisgKiBncmFwaGljcyBhcmVhLiBUaGUgY2xhc3NlcyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgdGhlIHJ1bGVzIGFuZAorICogYSBtZXRob2QgdG8gY3JlYXRlIHRoZSBjb250ZXh0IGZvciBhIHBhcnRpY3VsYXIgb3BlcmF0aW9uLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBDb21wb3NpdGUgewogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIENvbXBvc2l0ZUNvbnRleHQgd2hpY2ggZGVmaW5lcyB0aGUgZW5jYXBzdWxhdGVkIGFuZCAKLSAgICAgKiBvcHRpbWl6ZWQgZW52aXJvbm1lbnQgZm9yIGEgY29tcG9zaXRpbmcgb3BlcmF0aW9uLiBTZXZlcmFsIGNvbnRleHRzIAotICAgICAqIGNhbiBleGlzdCBmb3IgYSBzaW5nbGUgQ29tcG9zaXRlIG9iamVjdC4KKyAgICAgKiBDcmVhdGVzIGEgQ29tcG9zaXRlQ29udGV4dCB3aGljaCBkZWZpbmVzIHRoZSBlbmNhcHN1bGF0ZWQgYW5kIG9wdGltaXplZAorICAgICAqIGVudmlyb25tZW50IGZvciBhIGNvbXBvc2l0aW5nIG9wZXJhdGlvbi4gU2V2ZXJhbCBjb250ZXh0cyBjYW4gZXhpc3QgZm9yIGEKKyAgICAgKiBzaW5nbGUgQ29tcG9zaXRlIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjQ29sb3JNb2RlbCB0aGUgc291cmNlJ3MgQ29sb3JNb2RlbC4KLSAgICAgKiBAcGFyYW0gZHN0Q29sb3JNb2RlbCB0aGUgZGVzdGluYXRpb24ncyBDb2xvck1vZGVsLgotICAgICAqIEBwYXJhbSBoaW50cyB0aGUgUmVuZGVyaW5nSGludHMuCi0gICAgICogCisgICAgICogQHBhcmFtIHNyY0NvbG9yTW9kZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UncyBDb2xvck1vZGVsLgorICAgICAqIEBwYXJhbSBkc3RDb2xvck1vZGVsCisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24ncyBDb2xvck1vZGVsLgorICAgICAqIEBwYXJhbSBoaW50cworICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmluZ0hpbnRzLgogICAgICAqIEByZXR1cm4gdGhlIENvbXBvc2l0ZUNvbnRleHQgb2JqZWN0LgogICAgICAqLwotICAgIHB1YmxpYyBDb21wb3NpdGVDb250ZXh0IGNyZWF0ZUNvbnRleHQoQ29sb3JNb2RlbCBzcmNDb2xvck1vZGVsLAotICAgICAgICAgICAgQ29sb3JNb2RlbCBkc3RDb2xvck1vZGVsLCBSZW5kZXJpbmdIaW50cyBoaW50cyk7CisgICAgcHVibGljIENvbXBvc2l0ZUNvbnRleHQgY3JlYXRlQ29udGV4dChDb2xvck1vZGVsIHNyY0NvbG9yTW9kZWwsIENvbG9yTW9kZWwgZHN0Q29sb3JNb2RlbCwKKyAgICAgICAgICAgIFJlbmRlcmluZ0hpbnRzIGhpbnRzKTsKIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvQ29tcG9zaXRlQ29udGV4dC5qYXZhIGIvYXd0L2phdmEvYXd0L0NvbXBvc2l0ZUNvbnRleHQuamF2YQppbmRleCBjNjc2MDMyLi43OTU2NDBkIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvQ29tcG9zaXRlQ29udGV4dC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9Db21wb3NpdGVDb250ZXh0LmphdmEKQEAgLTE4LDI1ICsxOCwzMSBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIGltcG9ydCBqYXZhLmF3dC5pbWFnZS5SYXN0ZXI7CiBpbXBvcnQgamF2YS5hd3QuaW1hZ2UuV3JpdGFibGVSYXN0ZXI7CiAKIC8qKgotICogVGhlIENvbXBvc2l0ZUNvbnRleHQgaW50ZXJmYWNlIHNwZWNpZmllcyB0aGUgZW5jYXBzdWxhdGVkIGFuZCBvcHRpbWl6ZWQgCi0gKiBlbnZpcm9ubWVudCBmb3IgYSBjb21wb3NpdGluZyBvcGVyYXRpb24uIAorICogVGhlIENvbXBvc2l0ZUNvbnRleHQgaW50ZXJmYWNlIHNwZWNpZmllcyB0aGUgZW5jYXBzdWxhdGVkIGFuZCBvcHRpbWl6ZWQKKyAqIGVudmlyb25tZW50IGZvciBhIGNvbXBvc2l0aW5nIG9wZXJhdGlvbi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ29tcG9zaXRlQ29udGV4dCB7CiAKICAgICAvKioKLSAgICAgKiBDb21wb3NlcyB0aGUgdHdvIHNvdXJjZSBSYXN0ZXIgb2JqZWN0cyBhbmQgcGxhY2VzIHRoZSByZXN1bHQgaW4gdGhlIAotICAgICAqIGRlc3RpbmF0aW9uIFdyaXRhYmxlUmFzdGVyLiAKKyAgICAgKiBDb21wb3NlcyB0aGUgdHdvIHNvdXJjZSBSYXN0ZXIgb2JqZWN0cyBhbmQgcGxhY2VzIHRoZSByZXN1bHQgaW4gdGhlCisgICAgICogZGVzdGluYXRpb24gV3JpdGFibGVSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc291cmNlIFJhc3Rlci4KLSAgICAgKiBAcGFyYW0gZHN0SW4gdGhlIGRlc3RpbmF0aW9uIFJhc3Rlci4KLSAgICAgKiBAcGFyYW0gZHN0T3V0IHRoZSBXcml0YWJsZVJhc3RlciBvYmplY3Qgd2hlcmUgdGhlIHJlc3VsdCBvZgotICAgICAqIGNvbXBvc2luZyBvcGVyYXRpb24gaXMgc3RvcmVkLgorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgUmFzdGVyLgorICAgICAqIEBwYXJhbSBkc3RJbgorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIFJhc3Rlci4KKyAgICAgKiBAcGFyYW0gZHN0T3V0CisgICAgICogICAgICAgICAgICB0aGUgV3JpdGFibGVSYXN0ZXIgb2JqZWN0IHdoZXJlIHRoZSByZXN1bHQgb2YgY29tcG9zaW5nCisgICAgICogICAgICAgICAgICBvcGVyYXRpb24gaXMgc3RvcmVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNvbXBvc2UoUmFzdGVyIHNyYywgUmFzdGVyIGRzdEluLCBXcml0YWJsZVJhc3RlciBkc3RPdXQpOwogCkBAIC00Niw0ICs1MiwzIEBACiAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpOwogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9DdXJzb3IuamF2YSBiL2F3dC9qYXZhL2F3dC9DdXJzb3IuamF2YQppbmRleCA2MjU2ODZjLi4wYTBjYzg0IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvQ3Vyc29yLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0N1cnNvci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIERtaXRyeSBBLiBEdXJuZXYKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMzUsNjEgKzM2LDk5IEBACiAKIC8qKgogICogVGhlIEN1cnNvciBjbGFzcyByZXByZXNlbnRzIHRoZSBiaXRtYXAgb2YgdGhlIG1vdXNlIGN1cnNvci4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDdXJzb3IgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDgwMjgyMzc0OTc1Njg5ODU1MDRMOwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgREVGQVVMVF9DVVJTT1IgaW5kaWNhdGVzIHRoZSBkZWZhdWx0IGN1cnNvciB0eXBlLiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IERFRkFVTFRfQ1VSU09SIGluZGljYXRlcyB0aGUgZGVmYXVsdCBjdXJzb3IgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NVUlNPUiA9IDA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IENST1NTSEFJUl9DVVJTT1IgY3Vyc29yIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENST1NTSEFJUl9DVVJTT1IgY3Vyc29yIHR5cGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1JPU1NIQUlSX0NVUlNPUiA9IDE7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRFWFRfQ1VSU09SIGN1cnNvciB0eXBlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBURVhUX0NVUlNPUiBjdXJzb3IgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUX0NVUlNPUiA9IDI7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFdBSVRfQ1VSU09SIGN1cnNvciB0eXBlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBXQUlUX0NVUlNPUiBjdXJzb3IgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQUlUX0NVUlNPUiA9IDM7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFNXX1JFU0laRV9DVVJTT1IgY3Vyc29yIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNXX1JFU0laRV9DVVJTT1IgY3Vyc29yIHR5cGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1dfUkVTSVpFX0NVUlNPUiA9IDQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFNFX1JFU0laRV9DVVJTT1IgY3Vyc29yIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNFX1JFU0laRV9DVVJTT1IgY3Vyc29yIHR5cGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VfUkVTSVpFX0NVUlNPUiA9IDU7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IE5XX1JFU0laRV9DVVJTT1IgY3Vyc29yIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IE5XX1JFU0laRV9DVVJTT1IgY3Vyc29yIHR5cGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTldfUkVTSVpFX0NVUlNPUiA9IDY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IE5FX1JFU0laRV9DVVJTT1IgY3Vyc29yIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IE5FX1JFU0laRV9DVVJTT1IgY3Vyc29yIHR5cGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVfUkVTSVpFX0NVUlNPUiA9IDc7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IE5fUkVTSVpFX0NVUlNPUiBjdXJzb3IgdHlwZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTl9SRVNJWkVfQ1VSU09SIGN1cnNvciB0eXBlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5fUkVTSVpFX0NVUlNPUiA9IDg7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFNfUkVTSVpFX0NVUlNPUiBjdXJzb3IgdHlwZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU19SRVNJWkVfQ1VSU09SIGN1cnNvciB0eXBlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfUkVTSVpFX0NVUlNPUiA9IDk7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFdfUkVTSVpFX0NVUlNPUiBjdXJzb3IgdHlwZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgV19SRVNJWkVfQ1VSU09SIGN1cnNvciB0eXBlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdfUkVTSVpFX0NVUlNPUiA9IDEwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBFX1JFU0laRV9DVVJTT1IgY3Vyc29yIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEVfUkVTSVpFX0NVUlNPUiBjdXJzb3IgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFX1JFU0laRV9DVVJTT1IgPSAxMTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgSEFORF9DVVJTT1IgY3Vyc29yIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEhBTkRfQ1VSU09SIGN1cnNvciB0eXBlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBTkRfQ1VSU09SID0gMTI7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IE1PVkVfQ1VSU09SIGN1cnNvciB0eXBlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBNT1ZFX0NVUlNPUiBjdXJzb3IgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT1ZFX0NVUlNPUiA9IDEzOwogCi0gICAgLyoqIEEgbWFwcGluZyBmcm9tIG5hbWVzIHRvIHN5c3RlbSBjdXN0b20gY3Vyc29ycy4gKi8KKyAgICAvKioKKyAgICAgKiBBIG1hcHBpbmcgZnJvbSBuYW1lcyB0byBzeXN0ZW0gY3VzdG9tIGN1cnNvcnMuCisgICAgICovCiAgICAgc3RhdGljIE1hcDxTdHJpbmcsIEN1cnNvcj4gc3lzdGVtQ3VzdG9tQ3Vyc29yczsKLSAgICAKLSAgICAvKiogVGhlIGN1cnNvciBwcm9wcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBjdXJzb3IgcHJvcHMuCisgICAgICovCiAgICAgc3RhdGljIFByb3BlcnRpZXMgY3Vyc29yUHJvcHM7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IHByZWRlZmluZWROYW1lcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgcHJlZGVmaW5lZE5hbWVzLgorICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBwcmVkZWZpbmVkTmFtZXMgPSB7CiAgICAgICAgICAgICAiRGVmYXVsdCIsICJDcm9zc2hhaXIiLCAiVGV4dCIsICJXYWl0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAogICAgICAgICAgICAgIlNvdXRod2VzdCBSZXNpemUiLCAiU291dGhlYXN0IFJlc2l6ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtOTksNDEgKzEzOCw1MiBAQAogCiAgICAgfTsKIAotICAgIC8qKiBUaGUgcHJlZGVmaW5lZCBzZXQgb2YgY3Vyc29ycy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcHJlZGVmaW5lZCBzZXQgb2YgY3Vyc29ycy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgc3RhdGljIEN1cnNvcltdIHByZWRlZmluZWQgPSB7Ci0gICAgICAgICAgICBuZXcgQ3Vyc29yKERFRkFVTFRfQ1VSU09SKSwgbnVsbCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgICAgbnVsbCwgbnVsbAorICAgICAgICAgICAgbmV3IEN1cnNvcihERUZBVUxUX0NVUlNPUiksIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCisgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsCiAgICAgfTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQ1VTVE9NX0NVUlNPUiBpcyBhc3NvY2lhdGVkIHdpdGggYWxsIGN1c3RvbSBjdXJzb3IgdHlwZXMuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDVVNUT01fQ1VSU09SIGlzIGFzc29jaWF0ZWQgd2l0aCBhbGwgY3VzdG9tIGN1cnNvciB0eXBlcy4KICAgICAgKiAoVGhvc2Ugd2hpY2ggYXJlIG5vdCBwcmVkZWZpbmVkKQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVU1RPTV9DVVJTT1IgPSAtMTsKIAotICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY3Vyc29yLiAqLworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjdXJzb3IuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwogCi0gICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBjdXJzb3IsIGNob3NlbiBmcm9tIHRoZSBsaXN0IG9mIGN1cnNvciB0eXBlIGNvbnN0YW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgY3Vyc29yLCBjaG9zZW4gZnJvbSB0aGUgbGlzdCBvZiBjdXJzb3IgdHlwZSBjb25zdGFudHMuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdHlwZTsKLSAgICAKLSAgICAvKiogVGhlIG5hdGl2ZSBjdXJzb3IuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmF0aXZlIGN1cnNvci4KKyAgICAgKi8KICAgICBwcml2YXRlIHRyYW5zaWVudCBOYXRpdmVDdXJzb3IgbmF0aXZlQ3Vyc29yOwotICAgIAotICAgIC8qKiBUaGUgZXhhY3QgcG9pbnQgb24gdGhlIGN1cnNvciBpbWFnZSB0aGF0IGluZGljYXRlcyB3aGljaCBwb2ludCAKLSAgICAgKiB0aGUgY3Vyc29yIGlzIHNlbGVjdGluZyAocG9pbnRpbmcgdG8pLiBUaGUgY29vcmRpbmF0ZXMgYXJlIGdpdmVuIAotICAgICAqIHdpdGggcmVzcGVjdCB0aGUgb3JpZ2luIG9mIHRoZSBJbWFnZSAoaXRzIHVwcGVyIGxlZnQgY29ybmVyKS4KKworICAgIC8qKgorICAgICAqIFRoZSBleGFjdCBwb2ludCBvbiB0aGUgY3Vyc29yIGltYWdlIHRoYXQgaW5kaWNhdGVzIHdoaWNoIHBvaW50IHRoZSBjdXJzb3IKKyAgICAgKiBpcyBzZWxlY3RpbmcgKHBvaW50aW5nIHRvKS4gVGhlIGNvb3JkaW5hdGVzIGFyZSBnaXZlbiB3aXRoIHJlc3BlY3QgdGhlCisgICAgICogb3JpZ2luIG9mIHRoZSBJbWFnZSAoaXRzIHVwcGVyIGxlZnQgY29ybmVyKS4KICAgICAgKi8KICAgICBwcml2YXRlIFBvaW50IGhvdFNwb3Q7Ci0gICAgCi0gICAgLyoqIFRoZSBpbWFnZSB0byBkcmF3IG9uIHRoZSBzY3JlZW4gcmVwcmVzZW50aW5nIHRoZSBjdXJzb3IuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgaW1hZ2UgdG8gZHJhdyBvbiB0aGUgc2NyZWVuIHJlcHJlc2VudGluZyB0aGUgY3Vyc29yLgorICAgICAqLwogICAgIHByaXZhdGUgSW1hZ2UgaW1hZ2U7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgY3Vyc29yIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGN1cnNvci4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgY3Vyc29yLgogICAgICAqLwogICAgIHByb3RlY3RlZCBDdXJzb3IoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgdGhpcyhuYW1lLCBudWxsLCBuZXcgUG9pbnQoKSk7CkBAIC0xNDIsNyArMTkyLDggQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgY3Vyc29yIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiBjdXJzb3IuCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGN1cnNvci4KICAgICAgKi8KICAgICBwdWJsaWMgQ3Vyc29yKGludCB0eXBlKSB7CiAgICAgICAgIGNoZWNrVHlwZSh0eXBlKTsKQEAgLTE1NSw5ICsyMDYsMTIgQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgY3Vyc29yLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCi0gICAgICogQHBhcmFtIGltZyB0aGUgaW1nCi0gICAgICogQHBhcmFtIGhvdFNwb3QgdGhlIGhvdCBzcG90CisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lLgorICAgICAqIEBwYXJhbSBpbWcKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWcuCisgICAgICogQHBhcmFtIGhvdFNwb3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBob3Qgc3BvdC4KICAgICAgKi8KICAgICBDdXJzb3IoU3RyaW5nIG5hbWUsIEltYWdlIGltZywgUG9pbnQgaG90U3BvdCkgewogICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwpAQCAtMTY3LDEwICsyMjEsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGaW5hbGl6ZSBtZXRob2Qgb3ZlcnJpZGVkIGZpbmFsaXplIG1ldGhvZCBmcm9tIE9iamVjdCBjbGFzcy4KKyAgICAgKiBGaW5hbGl6ZSBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBmaW5hbGl6ZSBtZXRob2QgZnJvbSBPYmplY3QgY2xhc3MuCiAgICAgICogCi0gICAgICogQHRocm93cyBUaHJvd2FibGUgaWYgdGhlIG5hdGl2ZSBjdXJzb3IgaXMgbm90IG51bGwgYW5kIHRocm93cwotICAgICAqIGEgdGhyb3dhYmxlIHdoZW4gZGVzdHJveWVkLgorICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG5hdGl2ZSBjdXJzb3IgaXMgbm90IG51bGwgYW5kIHRocm93cyBhIFRocm93YWJsZSB3aGVuCisgICAgICogICAgICAgICAgICAgZGVzdHJveWVkLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CkBAIC0yMDEsNyArMjU2LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBjdXJzb3IgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJzb3IgdHlwZQorICAgICAqIEByZXR1cm4gdGhlIGN1cnNvciB0eXBlLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKICAgICAgICAgcmV0dXJuIHR5cGU7CkBAIC0yMTAsOCArMjY1LDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBwcmVkZWZpbmVkIGN1cnNvciB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiBjdXJzb3IuCi0gICAgICogCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGN1cnNvci4KICAgICAgKiBAcmV0dXJuIHRoZSBwcmVkZWZpbmVkIGN1cnNvciB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEN1cnNvciBnZXRQcmVkZWZpbmVkQ3Vyc29yKGludCB0eXBlKSB7CkBAIC0yMzYsMzMgKzI5MSwzMyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHNwZWNpZmllZCBzeXN0ZW0gY3VzdG9tIGN1cnNvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBzeXN0ZW0gY3Vyc29yLgotICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBzeXN0ZW0gY3Vyc29yLgogICAgICAqIEByZXR1cm4gdGhlIHNwZWNpZmljIHN5c3RlbSBjdXJzb3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0gICAgICogCi0gICAgICogQHRocm93cyBBV1RFeGNlcHRpb24gaWYgdGhlIGRlc2lyZWQgY3Vyc29yIGhhcyBtYWxmb3JtZWQgZGF0YQotICAgICAqIHN1Y2ggYXMgYW4gaW5jb3JyZWN0bHkgZGVmaW5lZCBob3Qgc3BvdC4KLSAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIGlmIHRoZSBpc0hlYWRsZXNzIG1ldGhvZCBvZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudAotICAgICAqIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAdGhyb3dzIEFXVEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBkZXNpcmVkIGN1cnNvciBoYXMgbWFsZm9ybWVkIGRhdGEgc3VjaCBhcyBhbgorICAgICAqICAgICAgICAgICAgIGluY29ycmVjdGx5IGRlZmluZWQgaG90IHNwb3QuCisgICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpc0hlYWRsZXNzIG1ldGhvZCBvZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudCByZXR1cm5zCisgICAgICogICAgICAgICAgICAgdHJ1ZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEN1cnNvciBnZXRTeXN0ZW1DdXN0b21DdXJzb3IoU3RyaW5nIG5hbWUpCi0gICAgdGhyb3dzIEFXVEV4Y2VwdGlvbiwgSGVhZGxlc3NFeGNlcHRpb24geworICAgIHB1YmxpYyBzdGF0aWMgQ3Vyc29yIGdldFN5c3RlbUN1c3RvbUN1cnNvcihTdHJpbmcgbmFtZSkgdGhyb3dzIEFXVEV4Y2VwdGlvbiwgSGVhZGxlc3NFeGNlcHRpb24gewogICAgICAgICBUb29sa2l0LmNoZWNrSGVhZGxlc3MoKTsKICAgICAgICAgcmV0dXJuIGdldFN5c3RlbUN1c3RvbUN1cnNvckZyb21NYXAobmFtZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHN5c3RlbSBjdXN0b20gY3Vyc29yIGZyb20gdGhlIG1hcCBvZiBzeXN0ZW0gY3VzdG9tIGN1cnNvcnMuCisgICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHN5c3RlbSBjdXN0b20gY3Vyc29yIGZyb20gdGhlIG1hcCBvZiBzeXN0ZW0gY3VzdG9tCisgICAgICogY3Vyc29ycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBjdXJzb3IuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVzaXJlZCBzeXN0ZW0gY3VzdG9tIGN1cnNvciBmcm9tIHRoZSAKLSAgICAgKiBtYXAgb2Ygc3lzdGVtIGN1c3RvbSBjdXJzb3JzLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQVdURXhjZXB0aW9uIHRoZSBBV1QgZXhjZXB0aW9uCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGN1cnNvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBkZXNpcmVkIHN5c3RlbSBjdXN0b20gY3Vyc29yIGZyb20gdGhlIG1hcCBvZiBzeXN0ZW0gY3VzdG9tCisgICAgICogICAgICAgICBjdXJzb3JzLgorICAgICAqIEB0aHJvd3MgQVdURXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgdGhlIEFXVCBleGNlcHRpb24uCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ3Vyc29yIGdldFN5c3RlbUN1c3RvbUN1cnNvckZyb21NYXAgKFN0cmluZyBuYW1lKQotICAgIHRocm93cyBBV1RFeGNlcHRpb24geworICAgIHByaXZhdGUgc3RhdGljIEN1cnNvciBnZXRTeXN0ZW1DdXN0b21DdXJzb3JGcm9tTWFwKFN0cmluZyBuYW1lKSB0aHJvd3MgQVdURXhjZXB0aW9uIHsKICAgICAgICAgbG9hZEN1cnNvclByb3BzKCk7CiAgICAgICAgIGlmIChzeXN0ZW1DdXN0b21DdXJzb3JzID09IG51bGwpIHsKICAgICAgICAgICAgIHN5c3RlbUN1c3RvbUN1cnNvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEN1cnNvcj4oKTsKQEAgLTI4NCw4ICszMzksNyBAQAogICAgICAgICBpbnQgeCwgeTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHggPSBuZXcgSW50ZWdlcihob3RTcG90U3RyLnN1YnN0cmluZygwLCBpZHgpKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgeSA9IG5ldyBJbnRlZ2VyKGhvdFNwb3RTdHIuc3Vic3RyaW5nKGlkeCArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG90U3BvdFN0ci5sZW5ndGgoKSkpLmludFZhbHVlKCk7CisgICAgICAgICAgICB5ID0gbmV3IEludGVnZXIoaG90U3BvdFN0ci5zdWJzdHJpbmcoaWR4ICsgMSwgaG90U3BvdFN0ci5sZW5ndGgoKSkpLmludFZhbHVlKCk7CiAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBV1RFeGNlcHRpb24oZXhNc2cpOwogICAgICAgICB9CkBAIC0yOTksNyArMzUzLDggQEAKICAgICAvKioKICAgICAgKiBMb2FkIGN1cnNvciBwcm9wcy4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFXVEV4Y2VwdGlvbiB0aGUgQVdUIGV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgQVdURXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgdGhlIEFXVCBleGNlcHRpb24uCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkQ3Vyc29yUHJvcHMoKSB0aHJvd3MgQVdURXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGN1cnNvclByb3BzICE9IG51bGwpIHsKQEAgLTMwOCwxOCArMzYzLDE4IEBACiAgICAgICAgIFN0cmluZyBzZXAgPSBGaWxlLnNlcGFyYXRvcjsKICAgICAgICAgU3RyaW5nIGN1cnNvcnNEaXIgPSAibGliIiArIHNlcCArICJpbWFnZXMiICsgc2VwICsgImN1cnNvcnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogICAgICAgICBTdHJpbmcgY3Vyc29yc0Fic0RpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgKyBzZXAgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcnNEaXI7CisgICAgICAgICAgICAgICAgY3Vyc29yc0RpcjsKICAgICAgICAgU3RyaW5nIGN1cnNvclByb3BzRmlsZU5hbWUgPSAiY3Vyc29ycy5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgY3Vyc29yUHJvcHNGdWxsRmlsZU5hbWUgPSAoY3Vyc29yc0Fic0RpciArIHNlcCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3JQcm9wc0ZpbGVOYW1lKTsKKyAgICAgICAgU3RyaW5nIGN1cnNvclByb3BzRnVsbEZpbGVOYW1lID0gKGN1cnNvcnNBYnNEaXIgKyBzZXAgKyBjdXJzb3JQcm9wc0ZpbGVOYW1lKTsKICAgICAgICAgY3Vyc29yUHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgY3Vyc29yUHJvcHMubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKAotICAgICAgICAgICAgICAgICAgICBjdXJzb3JQcm9wc0Z1bGxGaWxlTmFtZSkpKTsKKyAgICAgICAgICAgIGN1cnNvclByb3BzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShjdXJzb3JQcm9wc0Z1bGxGaWxlTmFtZSkpKTsKICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIGF3dC4xNDI9RXhjZXB0aW9uOiBjbGFzcyB7MH0gezF9IG9jY3VycmVkIHdoaWxlIGxvYWRpbmc6IHsyfQogICAgICAgICAgICAgdGhyb3cgbmV3IEFXVEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xNDIiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117ZS5nZXRDbGFzcygpLCBlLmdldE1lc3NhZ2UoKSwgY3Vyc29yUHJvcHNGdWxsRmlsZU5hbWV9KSk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRDbGFzcygpLCBlLmdldE1lc3NhZ2UoKSwgY3Vyc29yUHJvcHNGdWxsRmlsZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQVdURXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgfQpAQCAtMzI5LDcgKzM4NCw4IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2sgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgdHlwZS4KICAgICAgKi8KICAgICBzdGF0aWMgdm9pZCBjaGVja1R5cGUoaW50IHR5cGUpIHsKICAgICAgICAgLy8gY2FuJ3QgdXNlIHByZWRlZmluZWQgYXJyYXkgaGVyZSBiZWNhdXNlIGl0IG1heSBub3QgaGF2ZSBiZWVuCkBAIC0zNDQsNyArNDAwLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBuYXRpdmUgY3Vyc29yLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hdGl2ZSBjdXJzb3IKKyAgICAgKiBAcmV0dXJuIHRoZSBuYXRpdmUgY3Vyc29yLgogICAgICAqLwogICAgIE5hdGl2ZUN1cnNvciBnZXROYXRpdmVDdXJzb3IoKSB7CiAgICAgICAgIGlmIChuYXRpdmVDdXJzb3IgIT0gbnVsbCkgewpAQCAtMzU0LDggKzQxMCw3IEBACiAgICAgICAgIGlmICh0eXBlICE9IENVU1RPTV9DVVJTT1IpIHsKICAgICAgICAgICAgIG5hdGl2ZUN1cnNvciA9IHRvb2xraXQuY3JlYXRlTmF0aXZlQ3Vyc29yKHR5cGUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmF0aXZlQ3Vyc29yID0gdG9vbGtpdC5jcmVhdGVDdXN0b21OYXRpdmVDdXJzb3IoaW1hZ2UsIGhvdFNwb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgICAgIG5hdGl2ZUN1cnNvciA9IHRvb2xraXQuY3JlYXRlQ3VzdG9tTmF0aXZlQ3Vyc29yKGltYWdlLCBob3RTcG90LCBuYW1lKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbmF0aXZlQ3Vyc29yOwogICAgIH0KQEAgLTM2MywxMCArNDE4LDEwIEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbmF0aXZlIGN1cnNvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmF0aXZlQ3Vyc29yIHRoZSBuZXcgbmF0aXZlIGN1cnNvcgorICAgICAqIEBwYXJhbSBuYXRpdmVDdXJzb3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgbmF0aXZlIGN1cnNvci4KICAgICAgKi8KICAgICB2b2lkIHNldE5hdGl2ZUN1cnNvcihOYXRpdmVDdXJzb3IgbmF0aXZlQ3Vyc29yKSB7CiAgICAgICAgIHRoaXMubmF0aXZlQ3Vyc29yID0gbmF0aXZlQ3Vyc29yOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0RpbWVuc2lvbi5qYXZhIGIvYXd0L2phdmEvYXd0L0RpbWVuc2lvbi5qYXZhCmluZGV4IDgxMzc4NDYuLjY3Nzc5NjIgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9EaW1lbnNpb24uamF2YQorKysgYi9hd3QvamF2YS9hd3QvRGltZW5zaW9uLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5hd3QuZ2VvbS5EaW1lbnNpb24yRDsKQEAgLTI2LDI2ICsyNywzNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5taXNjLkhhc2hDb2RlOwogCiAvKioKLSAqIFRoZSBEaW1lbnNpb24gcmVwcmVzZW50cyB0aGUgc2l6ZSAod2lkdGggYW5kIGhlaWdodCkgb2YgYSBjb21wb25lbnQuCi0gKiBUaGUgd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMgY2FuIGJlIG5lZ2F0aXZlLCBidXQgaW4gdGhhdCBjYXNlIHRoZSAKLSAqIGJlaGF2aW9yIG9mIHNvbWUgbWV0aG9kcyBpcyB1bmV4cGVjdGVkLiAKKyAqIFRoZSBEaW1lbnNpb24gcmVwcmVzZW50cyB0aGUgc2l6ZSAod2lkdGggYW5kIGhlaWdodCkgb2YgYSBjb21wb25lbnQuIFRoZQorICogd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMgY2FuIGJlIG5lZ2F0aXZlLCBidXQgaW4gdGhhdCBjYXNlIHRoZSBiZWhhdmlvciBvZgorICogc29tZSBtZXRob2RzIGlzIHVuZXhwZWN0ZWQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRGltZW5zaW9uIGV4dGVuZHMgRGltZW5zaW9uMkQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ3MjM5NTI1Nzk0OTEzNDk1MjRMOwogCi0gICAgLyoqIFRoZSB3aWR0aCBkaW1lbnNpb24uICovCisgICAgLyoqCisgICAgICogVGhlIHdpZHRoIGRpbWVuc2lvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgaW50IHdpZHRoOwotICAgIAotICAgIC8qKiBUaGUgaGVpZ2h0IGRpbWVuc2lvbi4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBoZWlnaHQgZGltZW5zaW9uLgorICAgICAqLwogICAgIHB1YmxpYyBpbnQgaGVpZ2h0OwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IERpbWVuc2lvbiB3aXRoIHRoZSBzYW1lIGRhdGEgYXMgdGhlIHNwZWNpZmllZCBEaW1lbnNpb24uCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IERpbWVuc2lvbiB3aXRoIHRoZSBzYW1lIGRhdGEgYXMgdGhlIHNwZWNpZmllZAorICAgICAqIERpbWVuc2lvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZCB0aGUgRGltZW5zaW9uIHRvIGNvcHkgdGhlIGRhdGEgZnJvbSB3aGVuIGNyZWF0aW5nIHRoZSAKLSAgICAgKiBuZXcgRGltZW5zaW9uIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gZAorICAgICAqICAgICAgICAgICAgdGhlIERpbWVuc2lvbiB0byBjb3B5IHRoZSBkYXRhIGZyb20gd2hlbiBjcmVhdGluZyB0aGUgbmV3CisgICAgICogICAgICAgICAgICBEaW1lbnNpb24gb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBEaW1lbnNpb24oRGltZW5zaW9uIGQpIHsKICAgICAgICAgdGhpcyhkLndpZHRoLCBkLmhlaWdodCk7CkBAIC02MSw4ICs3MiwxMCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBEaW1lbnNpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoIGFuZCBoZWlnaHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgbmV3IERpbWVuc2lvbi4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIG5ldyBEaW1lbnNpb24uCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIG5ldyBEaW1lbnNpb24uCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgbmV3IERpbWVuc2lvbi4KICAgICAgKi8KICAgICBwdWJsaWMgRGltZW5zaW9uKGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICBzZXRTaXplKHdpZHRoLCBoZWlnaHQpOwpAQCAtODQsMTAgKzk3LDEwIEBACiAgICAgLyoqCiAgICAgICogQ29tcGFyZXMgdGhpcyBEaW1lbnNpb24gb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9iaiB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBPYmplY3QgaXMgYSBEaW1lbnNpb24gd2l0aCAKLSAgICAgKiB0aGUgc2FtZSB3aWR0aCBhbmQgaGVpZ2h0IGRhdGEgYXMgdGhpcyBEaW1lbnNpb24uIAorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIE9iamVjdCBpcyBhIERpbWVuc2lvbiB3aXRoIHRoZSBzYW1lIHdpZHRoCisgICAgICogICAgICAgICBhbmQgaGVpZ2h0IGRhdGEgYXMgdGhpcyBEaW1lbnNpb24uCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKQEAgLTEwOCwxNiArMTIxLDIwIEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgLy8gVGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3VyLiBJdCBjb3VsZCBiZSBvYnRhaW5lZCBpbiB0aGUgZm9sbG93aW5nIHdheQorICAgICAgICAvLyBUaGUgb3V0cHV0IGZvcm1hdCBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvdXIuIEl0IGNvdWxkIGJlCisgICAgICAgIC8vIG9idGFpbmVkIGluIHRoZSBmb2xsb3dpbmcgd2F5CiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgRGltZW5zaW9uKCkudG9TdHJpbmcoKSkKICAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIlt3aWR0aD0iICsgd2lkdGggKyAiLGhlaWdodD0iICsgaGVpZ2h0ICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhpcyBEaW1lbnNpb24gb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LgorICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhpcyBEaW1lbnNpb24gb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCB3aWR0aCBhbmQKKyAgICAgKiBoZWlnaHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgRGltZW5zaW9uLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgRGltZW5zaW9uLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBEaW1lbnNpb24uCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgRGltZW5zaW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDsKQEAgLTEyNSwyMiArMTQyLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2l6ZSBvZiB0aGlzIERpbWVuc2lvbiBvYmplY3QgYnkgY29weWluZyB0aGUgCi0gICAgICogZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgRGltZW5zaW9uIG9iamVjdC4KKyAgICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoaXMgRGltZW5zaW9uIG9iamVjdCBieSBjb3B5aW5nIHRoZSBkYXRhIGZyb20gdGhlCisgICAgICogc3BlY2lmaWVkIERpbWVuc2lvbiBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGQgdGhlIERpbWVuc2lvbiB0aGF0IGdpdmVzIHRoZSBuZXcgc2l6ZSB2YWx1ZXMuCisgICAgICogQHBhcmFtIGQKKyAgICAgKiAgICAgICAgICAgIHRoZSBEaW1lbnNpb24gdGhhdCBnaXZlcyB0aGUgbmV3IHNpemUgdmFsdWVzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNpemUoRGltZW5zaW9uIGQpIHsKICAgICAgICAgc2V0U2l6ZShkLndpZHRoLCBkLmhlaWdodCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2l6ZSBvZiB0aGlzIERpbWVuc2lvbiBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGRvdWJsZSB3aWR0aCAKKyAgICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoaXMgRGltZW5zaW9uIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgZG91YmxlIHdpZHRoCiAgICAgICogYW5kIGhlaWdodC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBEaW1lbnNpb24uCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBEaW1lbnNpb24uCi0gICAgICogCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIERpbWVuc2lvbi4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBEaW1lbnNpb24uCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLkRpbWVuc2lvbjJEI3NldFNpemUoZG91YmxlLCBkb3VibGUpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC0xNjEsNyArMTgwLDYgQEAKICAgICAgKiBHZXRzIHRoZSBoZWlnaHQgb2YgdGhlIERpbWVuc2lvbi4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBoZWlnaHQgb2YgdGhlIERpbWVuc2lvbi4KLSAgICAgKiAKICAgICAgKiBAc2VlIGphdmEuYXd0Lmdlb20uRGltZW5zaW9uMkQjZ2V0SGVpZ2h0KCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTE3Myw3ICsxOTEsNiBAQAogICAgICAqIEdldHMgdGhlIHdpZHRoIG9mIHRoZSBEaW1lbnNpb24uCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgd2lkdGggb2YgdGhlIERpbWVuc2lvbi4KLSAgICAgKiAKICAgICAgKiBAc2VlIGphdmEuYXd0Lmdlb20uRGltZW5zaW9uMkQjZ2V0V2lkdGgoKQogICAgICAqLwogICAgIEBPdmVycmlkZQpAQCAtMTgyLDQgKzE5OSwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9EaXNwbGF5TW9kZS5qYXZhIGIvYXd0L2phdmEvYXd0L0Rpc3BsYXlNb2RlLmphdmEKaW5kZXggMDgyYzdiOC4uODAyMTAxMCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0Rpc3BsYXlNb2RlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0Rpc3BsYXlNb2RlLmphdmEKQEAgLTE4LDQxICsxOCw2MCBAQAogICogQGF1dGhvciBBbGV4ZXkgQS4gUGV0cmVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiAvKioKLSAqIFRoZSBEaXNwbGF5TW9kZSBjbGFzcyBjb250YWluZXMgdGhlIGJpdCBkZXB0aCwgaGVpZ2h0LCB3aWR0aCBhbmQgCi0gKiByZWZyZXNoIHJhdGUgb2YgYSBHcmFwaGljc0RldmljZS4KKyAqIFRoZSBEaXNwbGF5TW9kZSBjbGFzcyBjb250YWlucyB0aGUgYml0IGRlcHRoLCBoZWlnaHQsIHdpZHRoIGFuZCByZWZyZXNoIHJhdGUKKyAqIG9mIGEgR3JhcGhpY3NEZXZpY2UuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRGlzcGxheU1vZGUgewotICAgIAotICAgIC8qKiBUaGUgd2lkdGguICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgd2lkdGguCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgd2lkdGg7CiAKLSAgICAvKiogVGhlIGhlaWdodC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaGVpZ2h0LgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgaW50IGhlaWdodDsKIAotICAgIC8qKiBUaGUgYml0IGRlcHRoLiAqLworICAgIC8qKgorICAgICAqIFRoZSBiaXQgZGVwdGguCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgYml0RGVwdGg7CiAKLSAgICAvKiogVGhlIHJlZnJlc2ggcmF0ZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcmVmcmVzaCByYXRlLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgaW50IHJlZnJlc2hSYXRlOwogCi0gICAvKiogVGhlIENvbnN0YW50IFZhbHVlIEJJVF9ERVBUSF9NVUxUSSBpbmRpY2F0ZXMgdGhlIGJpdCBkZXB0aCAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBWYWx1ZSBCSVRfREVQVEhfTVVMVEkgaW5kaWNhdGVzIHRoZSBiaXQgZGVwdGgKKyAgICAgKi8KIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJVF9ERVBUSF9NVUxUSSA9IC0xOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBSRUZSRVNIX1JBVEVfVU5LTk9XTiBpbmRpY2F0ZXMgdGhlIHJlZnJlc2ggcmF0ZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUkVGUkVTSF9SQVRFX1VOS05PV04gaW5kaWNhdGVzIHRoZSByZWZyZXNoIHJhdGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVGUkVTSF9SQVRFX1VOS05PV04gPSAwOwogCi0gICAvKioKLSAgICAqIENyZWF0ZXMgYSBuZXcgRGlzcGxheU1vZGUgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotICAgICogIAotICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgZGlzcGxheS4KLSAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgZGlzcGxheS4KLSAgICAqIEBwYXJhbSBiaXREZXB0aCB0aGUgYml0IGRlcHRoIG9mIHRoZSBkaXNwbGF5LgotICAgICogQHBhcmFtIHJlZnJlc2hSYXRlIHRoZSByZWZyZXNoIHJhdGUgb2YgdGhlIGRpc3BsYXkuCi0gICAgKi8KKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IERpc3BsYXlNb2RlIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgZGlzcGxheS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBkaXNwbGF5LgorICAgICAqIEBwYXJhbSBiaXREZXB0aAorICAgICAqICAgICAgICAgICAgdGhlIGJpdCBkZXB0aCBvZiB0aGUgZGlzcGxheS4KKyAgICAgKiBAcGFyYW0gcmVmcmVzaFJhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWZyZXNoIHJhdGUgb2YgdGhlIGRpc3BsYXkuCisgICAgICovCiAKICAgICBwdWJsaWMgRGlzcGxheU1vZGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYml0RGVwdGgsIGludCByZWZyZXNoUmF0ZSkgewogICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7CkBAIC02MSwxNSArODAsMTQgQEAKICAgICAgICAgdGhpcy5yZWZyZXNoUmF0ZSA9IHJlZnJlc2hSYXRlOwogICAgIH0KIAotCi0gICAvKioKLSAgICAqIENvbXBhcmVzIGlmIHRoaXMgRGlzcGxheU1vZGUgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBvYmplY3Qgb3Igbm90LgotICAgICogCi0gICAgKiBAcGFyYW0gZG0gdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KLSAgICAqIAotICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhIERpc3BsYXlNb2RlIHdpdGggdGhlIHNhbWUKLSAgICAqIGRhdGEgdmFsdWVzIGFzIHRoaXMgRGlzcGxheU1vZGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAqLworICAgIC8qKgorICAgICAqIENvbXBhcmVzIGlmIHRoaXMgRGlzcGxheU1vZGUgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBvYmplY3Qgb3Igbm90LgorICAgICAqIAorICAgICAqIEBwYXJhbSBkbQorICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGEgRGlzcGxheU1vZGUgd2l0aCB0aGUgc2FtZSBkYXRhCisgICAgICogICAgICAgICB2YWx1ZXMgYXMgdGhpcyBEaXNwbGF5TW9kZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBkbSkgewpAQCAtODAsMTMgKzk4LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgKiBDb21wYXJlcyBpZiB0aGlzIERpc3BsYXlNb2RlIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgRGlzcGxheU1vZGUgb2JqZWN0Ci0gICAgKiBvciBub3QuCi0gICAgKiAKLSAgICAqIEBwYXJhbSBkbSB0aGUgRGlzcGxheU1vZGUgdG8gYmUgY29tcGFyZWQuCi0gICAgKiAKLSAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYWxsIG9mIHRoZSBkYXRhIHZhbHVlcyBvZiB0aGlzIERpc3BsYXlNb2RlIGFyZSBlcXVhbCAKLSAgICAqIHRvIHRoZSB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCBEaXNwbGF5TW9kZSBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBDb21wYXJlcyBpZiB0aGlzIERpc3BsYXlNb2RlIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgRGlzcGxheU1vZGUgb2JqZWN0CisgICAgICogb3Igbm90LgorICAgICAqIAorICAgICAqIEBwYXJhbSBkbQorICAgICAqICAgICAgICAgICAgdGhlIERpc3BsYXlNb2RlIHRvIGJlIGNvbXBhcmVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYWxsIG9mIHRoZSBkYXRhIHZhbHVlcyBvZiB0aGlzIERpc3BsYXlNb2RlIGFyZSBlcXVhbCB0bworICAgICAqICAgICAgICAgdGhlIHZhbHVlcyBvZiB0aGUgc3BlY2lmaWVkIERpc3BsYXlNb2RlIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhEaXNwbGF5TW9kZSBkbSkgewogICAgICAgICBpZiAoZG0gPT0gbnVsbCkgewpAQCAtMTA4LDggKzEyNiw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgYml0IGRlcHRoIG9mIHRoZSBEaXNwbGF5TW9kZSwgcmV0dXJucyBCSVRfREVQVEhfTVVMVEkgdmFsdWUKLSAgICAgKiBpZiBtdWx0aXBsZSBiaXQgZGVwdGhzIGFyZSBzdXBwb3J0ZWQgaW4gdGhpcyBkaXNwbGF5IG1vZGUuCisgICAgICogR2V0cyB0aGUgYml0IGRlcHRoIG9mIHRoZSBEaXNwbGF5TW9kZSwgcmV0dXJucyBCSVRfREVQVEhfTVVMVEkgdmFsdWUgaWYKKyAgICAgKiBtdWx0aXBsZSBiaXQgZGVwdGhzIGFyZSBzdXBwb3J0ZWQgaW4gdGhpcyBkaXNwbGF5IG1vZGUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYml0IGRlcHRoIG9mIHRoZSBEaXNwbGF5TW9kZS4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9FdmVudC5qYXZhIGIvYXd0L2phdmEvYXd0L0V2ZW50LmphdmEKaW5kZXggZjA3NDI1OC4uMjI2YTYxZiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0V2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0V2ZW50LmphdmEKQEAgLTE4LDIyNCArMTgsMjkzIEBACiAgKiBAYXV0aG9yIERtaXRyeSBBLiBEdXJuZXYKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiAKIC8qKgotICogVGhlIEV2ZW50IENsYXNzIGlzIG9ic29sZXRlIGFuZCBoYXMgYmVlbiByZXBsYWNlZCBieSBBV1RFdmVudCBjbGFzcy4KKyAqIFRoZSBFdmVudCBjbGFzcyBpcyBvYnNvbGV0ZSBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgQVdURXZlbnQgY2xhc3MuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRXZlbnQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDU0ODg5MjI1MDk0MDA1MDQ3MDNMOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgU0hJRlRfTUFTSyBpbmRpY2F0ZXMgdGhhdCB0aGUgU2hpZnQga2V5IGlzIGRvd24gd2hlbiAKLSAgICAgKiB0aGUgZXZlbnQgb2NjdXJyZWQuCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU0hJRlRfTUFTSyBpbmRpY2F0ZXMgdGhhdCB0aGUgU2hpZnQga2V5IGlzIGRvd24gd2hlbiB0aGUKKyAgICAgKiBldmVudCBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSElGVF9NQVNLID0gMTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgQ1RSTF9NQVNLIGluZGljYXRlcyB0aGF0IHRoZSBDb250cm9sIGtleSBpcyBkb3duIHdoZW4gCi0gICAgICogdGhlIGV2ZW50IG9jY3VycmVkLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDVFJMX01BU0sgaW5kaWNhdGVzIHRoYXQgdGhlIENvbnRyb2wga2V5IGlzIGRvd24gd2hlbiB0aGUKKyAgICAgKiBldmVudCBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVFJMX01BU0sgPSAyOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBNRVRBX01BU0sgaW5kaWNhdGVzIHRoYXQgdGhlIE1ldGEga2V5IGlzIGRvd24gd2hlbiB0Ci0gICAgICogaGUgZXZlbnQgb2NjdXJyZWQgKG9yIHRoZSByaWdodCBtb3VzZSBidXR0b24pLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBNRVRBX01BU0sgaW5kaWNhdGVzIHRoYXQgdGhlIE1ldGEga2V5IGlzIGRvd24gd2hlbiB0IGhlCisgICAgICogZXZlbnQgb2NjdXJyZWQgKG9yIHRoZSByaWdodCBtb3VzZSBidXR0b24pLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEFfTUFTSyA9IDQ7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEFMVF9NQVNLIGluZGljYXRlcyB0aGF0IHRoZSBBbHQga2V5IGlzIGRvd24gd2hlbiAKLSAgICAgKiB0aGUgZXZlbnQgb2NjdXJyZWQgKG9yIHRoZSBtaWRkbGUgbW91c2UgYnV0dG9uKS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEFMVF9NQVNLIGluZGljYXRlcyB0aGF0IHRoZSBBbHQga2V5IGlzIGRvd24gd2hlbiB0aGUgZXZlbnQKKyAgICAgKiBvY2N1cnJlZCAob3IgdGhlIG1pZGRsZSBtb3VzZSBidXR0b24pLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMVF9NQVNLID0gODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgSE9NRSBpbmRpY2F0ZXMgSG9tZSBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEhPTUUgaW5kaWNhdGVzIEhvbWUga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPTUUgPSAxMDAwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBFTkQgaW5kaWNhdGVzIEVuZCBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEVORCBpbmRpY2F0ZXMgRW5kIGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkQgPSAxMDAxOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBQR1VQIGluZGljYXRlcyBQYWdlIFVwIGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUEdVUCBpbmRpY2F0ZXMgUGFnZSBVcCBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEdVUCA9IDEwMDI7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFBHRE4gaW5kaWNhdGVzIFBhZ2UgRG93biBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFBHRE4gaW5kaWNhdGVzIFBhZ2UgRG93biBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEdETiA9IDEwMDM7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFVQIGluZGljYXRlcyBVcCBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFVQIGluZGljYXRlcyBVcCBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVAgPSAxMDA0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBET1dOIGluZGljYXRlcyBEb3duIGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRE9XTiBpbmRpY2F0ZXMgRG93biBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9XTiA9IDEwMDU7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IExFRlQgaW5kaWNhdGVzIExlZnQga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBMRUZUIGluZGljYXRlcyBMZWZ0IGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUID0gMTAwNjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgUklHSFQgaW5kaWNhdGVzIFJpZ2h0IGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUklHSFQgaW5kaWNhdGVzIFJpZ2h0IGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVCA9IDEwMDc7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEYxIGluZGljYXRlcyBGMSBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEYxIGluZGljYXRlcyBGMSBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRjEgPSAxMDA4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBGMiBpbmRpY2F0ZXMgRjIga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBGMiBpbmRpY2F0ZXMgRjIga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEYyID0gMTAwOTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgRjMgaW5kaWNhdGVzIEYzIGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRjMgaW5kaWNhdGVzIEYzIGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGMyA9IDEwMTA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEY0IGluZGljYXRlcyBGNCBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEY0IGluZGljYXRlcyBGNCBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRjQgPSAxMDExOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBGNSBpbmRpY2F0ZXMgRjUga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBGNSBpbmRpY2F0ZXMgRjUga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEY1ID0gMTAxMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgRjYgaW5kaWNhdGVzIEY2IGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRjYgaW5kaWNhdGVzIEY2IGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGNiA9IDEwMTM7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEY3IGluZGljYXRlcyBGNyBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEY3IGluZGljYXRlcyBGNyBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRjcgPSAxMDE0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBGOCBpbmRpY2F0ZXMgRjgga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBGOCBpbmRpY2F0ZXMgRjgga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEY4ID0gMTAxNTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgRjkgaW5kaWNhdGVzIEY5IGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRjkgaW5kaWNhdGVzIEY5IGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGOSA9IDEwMTY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEYxMCBpbmRpY2F0ZXMgRjEwIGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRjEwIGluZGljYXRlcyBGMTAga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEYxMCA9IDEwMTc7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEYxMSBpbmRpY2F0ZXMgRjExIGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRjExIGluZGljYXRlcyBGMTEga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEYxMSA9IDEwMTg7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEYxMiBpbmRpY2F0ZXMgRjEyIGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRjEyIGluZGljYXRlcyBGMTIga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEYxMiA9IDEwMTk7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFBSSU5UX1NDUkVFTiAgaW5kaWNhdGVzIFByaW50IFNjcmVlbiBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFBSSU5UX1NDUkVFTiBpbmRpY2F0ZXMgUHJpbnQgU2NyZWVuIGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklOVF9TQ1JFRU4gPSAxMDIwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBTQ1JPTExfTE9DSyBpbmRpY2F0ZXMgU2Nyb2xsIExvY2sga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBTQ1JPTExfTE9DSyBpbmRpY2F0ZXMgU2Nyb2xsIExvY2sga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9MT0NLID0gMTAyMTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQ0FQU19MT0NLIGluZGljYXRlcyBDYXBzIExvY2sga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDQVBTX0xPQ0sgaW5kaWNhdGVzIENhcHMgTG9jayBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQU19MT0NLID0gMTAyMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgTlVNX0xPQ0sgaW5kaWNhdGVzIE51bSBMb2NrIGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTlVNX0xPQ0sgaW5kaWNhdGVzIE51bSBMb2NrIGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1fTE9DSyA9IDEwMjM7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFBBVVNFIGluZGljYXRlcyBQYXVzZSBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFBBVVNFIGluZGljYXRlcyBQYXVzZSBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFVU0UgPSAxMDI0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBJTlNFUlQgaW5kaWNhdGVzIEluc2VydCBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IElOU0VSVCBpbmRpY2F0ZXMgSW5zZXJ0IGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNFUlQgPSAxMDI1OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBFTlRFUiBpbmRpY2F0ZXMgRW50ZXIga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBFTlRFUiBpbmRpY2F0ZXMgRW50ZXIga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVEVSID0gMTA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEJBQ0tfU1BBQ0UgaW5kaWNhdGVzIEJhY2sgU3BhY2Uga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBCQUNLX1NQQUNFIGluZGljYXRlcyBCYWNrIFNwYWNlIGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQUNLX1NQQUNFID0gODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVEFCIGluZGljYXRlcyBUQWIga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUIgaW5kaWNhdGVzIFRBYiBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFCID0gOTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgRVNDQVBFIGluZGljYXRlcyBFc2NhcGUga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBFU0NBUEUgaW5kaWNhdGVzIEVzY2FwZSBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVNDQVBFID0gMjc7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IERFTEVURSBpbmRpY2F0ZXMgRGVsZXRlIGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgREVMRVRFIGluZGljYXRlcyBEZWxldGUga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFTEVURSA9IDEyNzsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgV0lORE9XX0RFU1RST1kgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzIGFza2VkIHRoZQotICAgICAqIHdpbmRvdyBtYW5hZ2VyIHRvIGtpbGwgdGhlIHdpbmRvdy4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgV0lORE9XX0RFU1RST1kgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzIGFza2VkCisgICAgICogdGhlIHdpbmRvdyBtYW5hZ2VyIHRvIGtpbGwgdGhlIHdpbmRvdy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSU5ET1dfREVTVFJPWSA9IDIwMTsKIAotICAgIC8qKiAKKyAgICAvKioKICAgICAgKiBUaGUgQ29uc3RhbnQgV0lORE9XX0VYUE9TRSBpbmRpY2F0ZXMgYW4gZXZlbnQgd2hlbiB0aGUgdXNlciBoYXMgYXNrZWQgdGhlCiAgICAgICogd2luZG93IG1hbmFnZXIgdG8gZXhwb3NlIHRoZSB3aW5kb3cuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX0VYUE9TRSA9IDIwMjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgV0lORE9XX0lDT05JRlkgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzIGFza2VkIHRoZQotICAgICAqIHdpbmRvdyBtYW5hZ2VyIHRvIGluY29uaWZ5IHRoZSB3aW5kb3cuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFdJTkRPV19JQ09OSUZZIGluZGljYXRlcyBhbiBldmVudCB3aGVuIHRoZSB1c2VyIGhhcyBhc2tlZAorICAgICAqIHRoZSB3aW5kb3cgbWFuYWdlciB0byBpY29uaWZ5IHRoZSB3aW5kb3cuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX0lDT05JRlkgPSAyMDM7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFdJTkRPV19ERUlDT05JRlkgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzIGFza2VkIHRoZQotICAgICAqIHdpbmRvdyBtYW5hZ2VyIHRvIGRlaW5jb25pZnkgdGhlIHdpbmRvdy4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFdJTkRPV19ERUlDT05JRlkgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzIGFza2VkCisgICAgICogdGhlIHdpbmRvdyBtYW5hZ2VyIHRvIGRlaWNvbmlmeSB0aGUgd2luZG93LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJTkRPV19ERUlDT05JRlkgPSAyMDQ7CiAKLSAgICAvKiogCisgICAgLyoqCiAgICAgICogVGhlIENvbnN0YW50IFdJTkRPV19NT1ZFRCBpbmRpY2F0ZXMgYW4gZXZlbnQgd2hlbiB0aGUgdXNlciBoYXMgYXNrZWQgdGhlCi0gICAgICogd2luZG93IG1hbmFnZXIgdG8gbW92ZSB0aGUgd2luZG93LiAKKyAgICAgKiB3aW5kb3cgbWFuYWdlciB0byBtb3ZlIHRoZSB3aW5kb3cuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX01PVkVEID0gMjA1OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBLRVlfUFJFU1MgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgcHJlc3NlcyAKLSAgICAgKiBhIG5vcm1hbCBrZXkuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBLRVlfUFJFU1MgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBhIG5vcm1hbAorICAgICAqIGtleS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlfUFJFU1MgPSA0MDE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEtFWV9SRUxFQVNFIGluZGljYXRlcyBhbiBldmVudCB3aGVuIHRoZSB1c2VyIHJlbGVhc2VzIAotICAgICAqIGEgbm9ybWFsIGtleS4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgS0VZX1JFTEVBU0UgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgcmVsZWFzZXMgYQorICAgICAqIG5vcm1hbCBrZXkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZX1JFTEVBU0UgPSA0MDI7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEtFWV9BQ1RJT04gaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgcHJlc3NlZCAKLSAgICAgKiBhIG5vbi1BU0NJSSBhY3Rpb24ga2V5LiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgS0VZX0FDVElPTiBpbmRpY2F0ZXMgYW4gZXZlbnQgd2hlbiB0aGUgdXNlciBwcmVzc2VkIGEKKyAgICAgKiBub24tQVNDSUkgYWN0aW9uIGtleS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlfQUNUSU9OID0gNDAzOwogCiAgICAgLyoqCi0gICAgICogVGhlIENvbnN0YW50IEtFWV9BQ1RJT05fUkVMRUFTRSBpbmRpY2F0ZXMgYW4gZXZlbnQgd2hlbiB0aGUgdXNlciByZWxlYXNlZCAKLSAgICAgKiBhIG5vbi1BU0NJSSBhY3Rpb24ga2V5LiAKKyAgICAgKiBUaGUgQ29uc3RhbnQgS0VZX0FDVElPTl9SRUxFQVNFIGluZGljYXRlcyBhbiBldmVudCB3aGVuIHRoZSB1c2VyIHJlbGVhc2VkCisgICAgICogYSBub24tQVNDSUkgYWN0aW9uIGtleS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlfQUNUSU9OX1JFTEVBU0UgPSA0MDQ7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IE1PVVNFX0RPV04gaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzIHByZXNzZWQgCi0gICAgICogdGhlIG1vdXNlIGJ1dHRvbi4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IE1PVVNFX0RPV04gaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzIHByZXNzZWQgdGhlCisgICAgICogbW91c2UgYnV0dG9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PVVNFX0RPV04gPSA1MDE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IE1PVVNFX1VQIGluZGljYXRlcyBhbiBldmVudCB3aGVuIHRoZSB1c2VyIGhhcyByZWxlYXNlZCAKLSAgICAgKiB0aGUgbW91c2UgYnV0dG9uLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTU9VU0VfVVAgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzIHJlbGVhc2VkIHRoZQorICAgICAqIG1vdXNlIGJ1dHRvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT1VTRV9VUCA9IDUwMjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgTU9VU0VfTU9WRSBpbmRpY2F0ZXMgYW4gZXZlbnQgd2hlbiB0aGUgdXNlciBoYXMgbW92ZWQKLSAgICAgKiB0aGUgbW91c2Ugd2l0aCBubyBidXR0b24gcHJlc3NlZC4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTU9VU0VfTU9WRSBpbmRpY2F0ZXMgYW4gZXZlbnQgd2hlbiB0aGUgdXNlciBoYXMgbW92ZWQgdGhlCisgICAgICogbW91c2Ugd2l0aCBubyBidXR0b24gcHJlc3NlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT1VTRV9NT1ZFID0gNTAzOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBNT1VTRV9FTlRFUiBpbmRpY2F0ZXMgYW4gZXZlbnQgd2hlbiB0aGUgbW91c2UKLSAgICAgKiBoYXMgZW50ZXJlZCBhIGNvbXBvbmVudC4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTU9VU0VfRU5URVIgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIG1vdXNlIGhhcyBlbnRlcmVkIGEKKyAgICAgKiBjb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9VU0VfRU5URVIgPSA1MDQ7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IE1PVVNFX0VYSVQgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIG1vdXNlCi0gICAgICogaGFzIGV4aXRlZCBhIGNvbXBvbmVudC4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IE1PVVNFX0VYSVQgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIG1vdXNlIGhhcyBleGl0ZWQgYQorICAgICAqIGNvbXBvbmVudC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT1VTRV9FWElUID0gNTA1OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBNT1VTRV9EUkFHIGluZGljYXRlcyBhbiBldmVudCB3aGVuIHRoZSB1c2VyCi0gICAgICogaGFzIG1vdmVkIGEgbW91c2Ugd2l0aCB0aGUgcHJlc3NlZCBidXR0b24uIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBNT1VTRV9EUkFHIGluZGljYXRlcyBhbiBldmVudCB3aGVuIHRoZSB1c2VyIGhhcyBtb3ZlZCBhCisgICAgICogbW91c2Ugd2l0aCB0aGUgcHJlc3NlZCBidXR0b24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9VU0VfRFJBRyA9IDUwNjsKIAotICAgIC8qKiAKKyAgICAvKioKICAgICAgKiBUaGUgQ29uc3RhbnQgU0NST0xMX0xJTkVfVVAgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzCiAgICAgICogYWN0aXZhdGVkIGxpbmUtdXAgYXJlYSBvZiBzY3JvbGxiYXIuCiAgICAgICovCkBAIC0yNDMsMTAxICszMTIsMTM2IEBACiAKICAgICAvKioKICAgICAgKiBUaGUgQ29uc3RhbnQgU0NST0xMX0xJTkVfRE9XTiBpbmRpY2F0ZXMgYW4gZXZlbnQgd2hlbiB0aGUgdXNlciBoYXMKLSAgICAgKiBhY3RpdmF0ZWQgbGluZS1kb3duIGFyZWEgb2Ygc2Nyb2xsYmFyLiAKKyAgICAgKiBhY3RpdmF0ZWQgbGluZS1kb3duIGFyZWEgb2Ygc2Nyb2xsYmFyLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9MSU5FX0RPV04gPSA2MDI7CiAKICAgICAvKioKICAgICAgKiBUaGUgQ29uc3RhbnQgU0NST0xMX1BBR0VfVVAgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzCi0gICAgICogYWN0aXZhdGVkIHBhZ2UgdXAgYXJlYSBvZiBzY3JvbGxiYXIuIAorICAgICAqIGFjdGl2YXRlZCBwYWdlIHVwIGFyZWEgb2Ygc2Nyb2xsYmFyLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9QQUdFX1VQID0gNjAzOwogCiAgICAgLyoqCiAgICAgICogVGhlIENvbnN0YW50IFNDUk9MTF9QQUdFX0RPV04gaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzCi0gICAgICogYWN0aXZhdGVkIHBhZ2UgZG93biBhcmVhIG9mIHNjcm9sbGJhci4gCisgICAgICogYWN0aXZhdGVkIHBhZ2UgZG93biBhcmVhIG9mIHNjcm9sbGJhci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JPTExfUEFHRV9ET1dOID0gNjA0OwogCiAgICAgLyoqCi0gICAgICogVGhlIENvbnN0YW50IFNDUk9MTF9BQlNPTFVURSBpbmRpY2F0ZXMgYW4gZXZlbnQgd2hlbiB0aGUgdXNlciAKLSAgICAgKiBoYXMgbW92ZWQgdGhlIGJ1YmJsZSBpbiBhIHNjcm9sbCBiYXIuIAorICAgICAqIFRoZSBDb25zdGFudCBTQ1JPTExfQUJTT0xVVEUgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzIG1vdmVkCisgICAgICogdGhlIGJ1YmJsZSBpbiBhIHNjcm9sbCBiYXIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX0FCU09MVVRFID0gNjA1OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBTQ1JPTExfQkVHSU4gaW5kaWNhdGVzIGEgc2Nyb2xsIGJlZ2luIGV2ZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBTQ1JPTExfQkVHSU4gaW5kaWNhdGVzIGEgc2Nyb2xsIGJlZ2luIGV2ZW50LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9CRUdJTiA9IDYwNjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgU0NST0xMX0VORCBpbmRpY2F0ZXMgYSBzY3JvbGwgZW5kIGV2ZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBTQ1JPTExfRU5EIGluZGljYXRlcyBhIHNjcm9sbCBlbmQgZXZlbnQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX0VORCA9IDYwNzsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgTElTVF9TRUxFQ1QgaW5kaWNhdGVzIHRoYXQgYW4gaXRlbSBpbiBhIGxpc3QgCi0gICAgICogaGFzIGJlZW4gc2VsZWN0ZWQuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IExJU1RfU0VMRUNUIGluZGljYXRlcyB0aGF0IGFuIGl0ZW0gaW4gYSBsaXN0IGhhcyBiZWVuCisgICAgICogc2VsZWN0ZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElTVF9TRUxFQ1QgPSA3MDE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IExJU1RfREVTRUxFQ1QgaW5kaWNhdGVzIHRoYXQgYW4gaXRlbSBpbiBhIGxpc3QgCi0gICAgICogaGFzIGJlZW4gZGVzZWxlY3RlZC4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IExJU1RfREVTRUxFQ1QgaW5kaWNhdGVzIHRoYXQgYW4gaXRlbSBpbiBhIGxpc3QgaGFzIGJlZW4KKyAgICAgKiB1bnNlbGVjdGVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1RfREVTRUxFQ1QgPSA3MDI7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEFDVElPTl9FVkVOVCBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciB3YW50cyBzb21lIAotICAgICAqIGFjdGlvbiB0byBvY2N1ci4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQUNUSU9OX0VWRU5UIGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIHdhbnRzIHNvbWUgYWN0aW9uIHRvCisgICAgICogb2NjdXIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0VWRU5UID0gMTAwMTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgTE9BRF9GSUxFIGluZGljYXRlcyBhIGZpbGUgbG9hZGluZyBldmVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTE9BRF9GSUxFIGluZGljYXRlcyBhIGZpbGUgbG9hZGluZyBldmVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0FEX0ZJTEUgPSAxMDAyOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBTQVZFX0ZJTEUgaW5kaWNhdGVzIGEgZmlsZSBzYXZpbmcgZXZlbnQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNBVkVfRklMRSBpbmRpY2F0ZXMgYSBmaWxlIHNhdmluZyBldmVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQVZFX0ZJTEUgPSAxMDAzOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBHT1RfRk9DVVMgaW5kaWNhdGVzIHRoYXQgYSBjb21wb25lbnQgZ290IHRoZSBmb2N1cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgR09UX0ZPQ1VTIGluZGljYXRlcyB0aGF0IGEgY29tcG9uZW50IGdvdCB0aGUgZm9jdXMuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR09UX0ZPQ1VTID0gMTAwNDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgTE9TVF9GT0NVUyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tcG9uZW50IGxvc3QgdGhlIGZvY3VzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBMT1NUX0ZPQ1VTIGluZGljYXRlcyB0aGF0IHRoZSBjb21wb25lbnQgbG9zdCB0aGUgZm9jdXMuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9TVF9GT0NVUyA9IDEwMDU7CiAKLSAgICAvKiogVGhlIHRhcmdldCBpcyB0aGUgY29tcG9uZW50IHdpdGggd2hpY2ggdGhlIGV2ZW50IGlzIGFzc29jaWF0ZWQuICovCisgICAgLyoqCisgICAgICogVGhlIHRhcmdldCBpcyB0aGUgY29tcG9uZW50IHdpdGggd2hpY2ggdGhlIGV2ZW50IGlzIGFzc29jaWF0ZWQuCisgICAgICovCiAgICAgcHVibGljIE9iamVjdCB0YXJnZXQ7CiAKLSAgICAvKiogVGhlIHdoZW4gaXMgdGltZXN0YW1wIHdoZW4gZXZlbnQgaGFzIG9jY3VyZWQuICovCisgICAgLyoqCisgICAgICogVGhlIHdoZW4gaXMgdGltZXN0YW1wIHdoZW4gZXZlbnQgaGFzIG9jY3VyZWQuCisgICAgICovCiAgICAgcHVibGljIGxvbmcgd2hlbjsKIAotICAgIC8qKiBUaGUgaWQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIHRoZSBldmVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaWQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIHRoZSBldmVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgaW50IGlkOwogCi0gICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgZXZlbnQuICovCisgICAgLyoqCisgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiBldmVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgaW50IHg7CiAKLSAgICAvKiogVGhlIHkgY29vcmRpbmF0ZSBvZiBldmVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIGV2ZW50LgorICAgICAqLwogICAgIHB1YmxpYyBpbnQgeTsKIAotICAgIC8qKiBUaGUga2V5IGNvZGUgb2Yga2V5IGV2ZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBrZXkgY29kZSBvZiBrZXkgZXZlbnQuCisgICAgICovCiAgICAgcHVibGljIGludCBrZXk7CiAKLSAgICAvKiogVGhlIHN0YXRlIG9mIHRoZSBtb2RpZmllciBrZXlzIChnaXZlbiBieSBhIGJpdG1hc2spLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzdGF0ZSBvZiB0aGUgbW9kaWZpZXIga2V5cyAoZ2l2ZW4gYnkgYSBiaXRtYXNrKS4KKyAgICAgKi8KICAgICBwdWJsaWMgaW50IG1vZGlmaWVyczsKIAotICAgIC8qKiBUaGUgY2xpY2sgY291bnQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgY2xpY2tzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjbGljayBjb3VudCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBjbGlja3MuCisgICAgICovCiAgICAgcHVibGljIGludCBjbGlja0NvdW50OwogCi0gICAgLyoqIFRoZSBhcmd1bWVudCBvZiB0aGUgZXZlbnQuICovCisgICAgLyoqCisgICAgICogVGhlIGFyZ3VtZW50IG9mIHRoZSBldmVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGFyZzsKIAotICAgIC8qKiBUaGUgbmV4dCBldmVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbmV4dCBldmVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgRXZlbnQgZXZ0OwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCB0YXJnZXQgY29tcG9uZW50LCAKLSAgICAgKiBldmVudCB0eXBlLCBhbmQgYXJndW1lbnQuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCB0YXJnZXQgY29tcG9uZW50LCBldmVudCB0eXBlLAorICAgICAqIGFuZCBhcmd1bWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgY29tcG9uZW50LgotICAgICAqIEBwYXJhbSBpZCB0aGUgZXZlbnQgdHlwZS4KLSAgICAgKiBAcGFyYW0gYXJnIHRoZSBhcmd1bWVudC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0CisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudCB0eXBlLgorICAgICAqIEBwYXJhbSBhcmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcmd1bWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgRXZlbnQoT2JqZWN0IHRhcmdldCwgaW50IGlkLCBPYmplY3QgYXJnKSB7CiAgICAgICAgIHRoaXModGFyZ2V0LCAwbCwgaWQsIDAsIDAsIDAsIDAsIGFyZyk7CkBAIC0zNDgsMTMgKzQ1MiwyMCBAQAogICAgICAqIGV2ZW50IHR5cGUsIHggYW5kIHkgY29vcmRpbmF0ZXMsIGtleWJvYXJkIGtleSwgc3RhdGUgb2YgdGhlIG1vZGlmaWVyCiAgICAgICoga2V5cywgYW5kIGFuIGFyZ3VtZW50IHNldCB0byBudWxsLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIHRhcmdldCBjb21wb25lbnQuCi0gICAgICogQHBhcmFtIHdoZW4gdGhlIHRpbWUgc3RhbXAuCi0gICAgICogQHBhcmFtIGlkIHRoZSBldmVudCB0eXBlLgotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkuCi0gICAgICogQHBhcmFtIG1vZGlmaWVycyB0aGUgbW9kaWZpZXIga2V5cyBzdGF0ZS4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0CisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gd2hlbgorICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgc3RhbXAuCisgICAgICogQHBhcmFtIGlkCisgICAgICogICAgICAgICAgICB0aGUgZXZlbnQgdHlwZS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5LgorICAgICAqIEBwYXJhbSBtb2RpZmllcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBtb2RpZmllciBrZXlzIHN0YXRlLgogICAgICAqLwogICAgIHB1YmxpYyBFdmVudChPYmplY3QgdGFyZ2V0LCBsb25nIHdoZW4sIGludCBpZCwgaW50IHgsIGludCB5LCBpbnQga2V5LCBpbnQgbW9kaWZpZXJzKSB7CiAgICAgICAgIHRoaXModGFyZ2V0LCB3aGVuLCBpZCwgeCwgeSwga2V5LCBtb2RpZmllcnMsIG51bGwpOwpAQCAtMzY1LDE0ICs0NzYsMjIgQEAKICAgICAgKiBldmVudCB0eXBlLCB4IGFuZCB5IGNvb3JkaW5hdGVzLCBrZXlib2FyZCBrZXksIHN0YXRlIG9mIHRoZSBtb2RpZmllcgogICAgICAqIGtleXMsIGFuZCBhbiBhcmd1bWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgY29tcG9uZW50LgotICAgICAqIEBwYXJhbSB3aGVuIHRoZSB0aW1lIHN0YW1wLgotICAgICAqIEBwYXJhbSBpZCB0aGUgZXZlbnQgdHlwZS4KLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIGtleSB0aGUga2V5LgotICAgICAqIEBwYXJhbSBtb2RpZmllcnMgdGhlIG1vZGlmaWVyIGtleXMgc3RhdGUuCi0gICAgICogQHBhcmFtIGFyZyB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50LgorICAgICAqIEBwYXJhbSB0YXJnZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSB3aGVuCisgICAgICogICAgICAgICAgICB0aGUgdGltZSBzdGFtcC4KKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudCB0eXBlLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkuCisgICAgICogQHBhcmFtIG1vZGlmaWVycworICAgICAqICAgICAgICAgICAgdGhlIG1vZGlmaWVyIGtleXMgc3RhdGUuCisgICAgICogQHBhcmFtIGFyZworICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBhcmd1bWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgRXZlbnQoT2JqZWN0IHRhcmdldCwgbG9uZyB3aGVuLCBpbnQgaWQsIGludCB4LCBpbnQgeSwgaW50IGtleSwgaW50IG1vZGlmaWVycywgT2JqZWN0IGFyZykgewogICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKQEAgLTM5MiwxMSArNTExLDEwIEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgLyogVGhlIGZvcm1hdCBpcyBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvciAKLSAgICAgICAgICogd2hpY2ggY2FuIGJlIHJldmVhbGVkIGJ5IHRoZSBmb2xsb3dpbmcgY29kZToKLSAgICAgICAgICogCi0gICAgICAgICAqIEV2ZW50IGUgPSBuZXcgRXZlbnQobmV3IEJ1dHRvbigpLCAwbCwgRXZlbnQuS0VZX1BSRVNTLCAKLSAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAwLCAwLCBFdmVudC5UQUIsIEV2ZW50LlNISUZUX01BU0ssICJhcmciKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIGZvcm1hdCBpcyBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvciB3aGljaCBjYW4gYmUgcmV2ZWFsZWQgYnkKKyAgICAgICAgICogdGhlIGZvbGxvd2luZyBjb2RlOiBFdmVudCBlID0gbmV3IEV2ZW50KG5ldyBCdXR0b24oKSwgMGwsCisgICAgICAgICAqIEV2ZW50LktFWV9QUkVTUywgMCwgMCwgRXZlbnQuVEFCLCBFdmVudC5TSElGVF9NQVNLLCAiYXJnIik7CiAgICAgICAgICAqIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKICAgICAgICAgICovCiAKQEAgLTQxMCwxNSArNTI4LDE1IEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBwYXJhbVN0cmluZygpIHsKICAgICAgICAgcmV0dXJuICJpZD0iICsgaWQgKyAiLHg9IiArIHggKyAiLHk9IiArIHkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgICAoa2V5ICE9IDAgPyAiLGtleT0iICsga2V5ICArIGdldE1vZGlmaWVyc1N0cmluZygpIDogIiIpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICIsdGFyZ2V0PSIgKyB0YXJnZXQgKyAvLyROT04tTkxTLTEkCi0gICAgICAgIChhcmcgIT0gbnVsbCA/ICIsYXJnPSIgKyBhcmcgOiAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICAgICAgICAgIChrZXkgIT0gMCA/ICIsa2V5PSIgKyBrZXkgKyBnZXRNb2RpZmllcnNTdHJpbmcoKSA6ICIiKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICAgICAgICAgICIsdGFyZ2V0PSIgKyB0YXJnZXQgKyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgKGFyZyAhPSBudWxsID8gIixhcmc9IiArIGFyZyA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kaWZpZXJzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGlmaWVycworICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGlmaWVycy4KICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBnZXRNb2RpZmllcnNTdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZyBzdHJNb2QgPSAiIjsgLy8kTk9OLU5MUy0xJApAQCAtNDM1LDEzICs1NTMsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUcmFuc2xhdGVzIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgaGlzIGV2ZW50IHRvIHRoZSB4K2R4IGFuZCB4K2R5IAorICAgICAqIFRyYW5zbGF0ZXMgeCBhbmQgeSBjb29yZGluYXRlcyBvZiBoaXMgZXZlbnQgdG8gdGhlIHgrZHggYW5kIHgrZHkKICAgICAgKiBjb29yZGluYXRlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZHggdGhlIGR4IC0gdGhlIGRpc3RhbmNlIGJ5IHdoaWNoIHRoZSBldmVudCdzIHggY29vcmRpbmF0ZQotICAgICAqIGlzIGluY3JlYXNlZCAKLSAgICAgKiBAcGFyYW0gZHkgdGhlIGR5IC0gdGhlIGRpc3RhbmNlIGJ5IHdoaWNoIHRoZSBldmVudCdzIHkgY29vcmRpbmF0ZQotICAgICAqIGlzIGluY3JlYXNlZCAKKyAgICAgKiBAcGFyYW0gZHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0YW5jZSBieSB3aGljaCB0aGUgZXZlbnQncyB4IGNvb3JkaW5hdGUgaXMgaW5jcmVhc2VkLgorICAgICAqIEBwYXJhbSBkeQorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIGJ5IHdoaWNoIHRoZSBldmVudCdzIHkgY29vcmRpbmF0ZSBpcyBpbmNyZWFzZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdHJhbnNsYXRlKGludCBkeCwgaW50IGR5KSB7CiAgICAgICAgIHggKz0gZHg7CkBAIC00NzYsNCArNTk0LDMgQEAKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0V2ZW50UXVldWUuamF2YSBiL2F3dC9qYXZhL2F3dC9FdmVudFF1ZXVlLmphdmEKaW5kZXggMzk5NzU0Ni4uMTI2YTU5MyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0V2ZW50UXVldWUuamF2YQorKysgYi9hd3QvamF2YS9hd3QvRXZlbnRRdWV1ZS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIE1pY2hhZWwgRGFuaWxvdiwgUGF2ZWwgRG9sZ292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dDsKIAogaW1wb3J0IGphdmEuYXd0LmV2ZW50Lkludm9jYXRpb25FdmVudDsKQEAgLTI1LDYwICsyNiw2OSBAQAogaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwogCiAvKioKLSAqIFRoZSBFdmVudFF1ZXVlIGNsYXNzIG1hbmFnZXMgZXZlbnRzLiBJdCBpcyBhIHBsYXRmb3JtLWluZGVwZW5kZW50IGNsYXNzIAotICogdGhhdCBxdWV1ZXMgZXZlbnRzIGJvdGggZnJvbSB0aGUgdW5kZXJseWluZyBwZWVyIGNsYXNzZXMgYW5kIGZyb20gdHJ1c3RlZCAKKyAqIFRoZSBFdmVudFF1ZXVlIGNsYXNzIG1hbmFnZXMgZXZlbnRzLiBJdCBpcyBhIHBsYXRmb3JtLWluZGVwZW5kZW50IGNsYXNzIHRoYXQKKyAqIHF1ZXVlcyBldmVudHMgYm90aCBmcm9tIHRoZSB1bmRlcmx5aW5nIHBlZXIgY2xhc3NlcyBhbmQgZnJvbSB0cnVzdGVkCiAgKiBhcHBsaWNhdGlvbiBjbGFzc2VzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEV2ZW50UXVldWUgewotICAgIAotICAgIC8qKiBUaGUgY29yZSByZWYuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBFdmVudFF1ZXVlQ29yZUF0b21pY1JlZmVyZW5jZSBjb3JlUmVmID0gCi0gICAgICAgICAgICBuZXcgRXZlbnRRdWV1ZUNvcmVBdG9taWNSZWZlcmVuY2UoKTsKLSAgICAKKworICAgIC8qKgorICAgICAqIFRoZSBjb3JlIHJlZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEV2ZW50UXVldWVDb3JlQXRvbWljUmVmZXJlbmNlIGNvcmVSZWYgPSBuZXcgRXZlbnRRdWV1ZUNvcmVBdG9taWNSZWZlcmVuY2UoKTsKKwogICAgIC8qKgogICAgICAqIFRoZSBDbGFzcyBFdmVudFF1ZXVlQ29yZUF0b21pY1JlZmVyZW5jZS4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudFF1ZXVlQ29yZUF0b21pY1JlZmVyZW5jZSB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGNvcmUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb3JlLgorICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBFdmVudFF1ZXVlQ29yZSBjb3JlOwogCi0gICAgICAgIC8qc3luY2hyb25pemVkKi8gLyoqCisgICAgICAgIC8qIHN5bmNocm9uaXplZCAqLworICAgICAgICAvKioKICAgICAgICAgICogR2V0cyB0aGUuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBldmVudCBxdWV1ZSBjb3JlCisgICAgICAgICAqIEByZXR1cm4gdGhlIGV2ZW50IHF1ZXVlIGNvcmUuCiAgICAgICAgICAqLwotICAgICAgICBFdmVudFF1ZXVlQ29yZSBnZXQoKSB7IAorICAgICAgICBFdmVudFF1ZXVlQ29yZSBnZXQoKSB7CiAgICAgICAgICAgICByZXR1cm4gY29yZTsKICAgICAgICAgfQogCi0gICAgICAgIC8qc3luY2hyb25pemVkKi8gLyoqCisgICAgICAgIC8qIHN5bmNocm9uaXplZCAqLworICAgICAgICAvKioKICAgICAgICAgICogU2V0cyB0aGUuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gbmV3Q29yZSB0aGUgbmV3IGNvcmUKKyAgICAgICAgICogQHBhcmFtIG5ld0NvcmUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbmV3IGNvcmUuCiAgICAgICAgICAqLwotICAgICAgICB2b2lkIHNldChFdmVudFF1ZXVlQ29yZSBuZXdDb3JlKSB7IAorICAgICAgICB2b2lkIHNldChFdmVudFF1ZXVlQ29yZSBuZXdDb3JlKSB7CiAgICAgICAgICAgICBjb3JlID0gbmV3Q29yZTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2FsbGluZyB0aHJlYWQgaXMgdGhlIGN1cnJlbnQgCi0gICAgICogQVdUIEV2ZW50UXVldWUncyBkaXNwYXRjaCB0aHJlYWQuIAorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2FsbGluZyB0aHJlYWQgaXMgdGhlIGN1cnJlbnQgQVdUIEV2ZW50UXVldWUncworICAgICAqIGRpc3BhdGNoIHRocmVhZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBjYWxsaW5nIHRocmVhZCBpcyB0aGUgY3VycmVudCAKLSAgICAgKiBBV1QgRXZlbnRRdWV1ZSdzIGRpc3BhdGNoIHRocmVhZDsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIHRoZSBjdXJyZW50IEFXVCBFdmVudFF1ZXVlJ3MKKyAgICAgKiAgICAgICAgIGRpc3BhdGNoIHRocmVhZDsgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Rpc3BhdGNoVGhyZWFkKCkgewogICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSBpbnN0YW5jZW9mIEV2ZW50RGlzcGF0Y2hUaHJlYWQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUG9zdHMgYW4gSW52b2NhdGlvbkV2ZW50IHdoaWNoIGV4ZWN1dGVzIHRoZSBydW4oKSBtZXRob2Qgb24gYSBSdW5uYWJsZSAKKyAgICAgKiBQb3N0cyBhbiBJbnZvY2F0aW9uRXZlbnQgd2hpY2ggZXhlY3V0ZXMgdGhlIHJ1bigpIG1ldGhvZCBvbiBhIFJ1bm5hYmxlCiAgICAgICogd2hlbiBkaXNwYXRjaGVkIGJ5IHRoZSBBV1QgZXZlbnQgZGlzcGF0Y2hlciB0aHJlYWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJ1bm5hYmxlIHRoZSBSdW5uYWJsZSB3aG9zZSBydW4gbWV0aG9kIHNob3VsZCBiZSBleGVjdXRlZCAKLSAgICAgKiBzeW5jaHJvbm91c2x5IG9uIHRoZSBFdmVudFF1ZXVlLgorICAgICAqIEBwYXJhbSBydW5uYWJsZQorICAgICAqICAgICAgICAgICAgdGhlIFJ1bm5hYmxlIHdob3NlIHJ1biBtZXRob2Qgc2hvdWxkIGJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHkKKyAgICAgKiAgICAgICAgICAgIG9uIHRoZSBFdmVudFF1ZXVlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnZva2VMYXRlcihSdW5uYWJsZSBydW5uYWJsZSkgewogICAgICAgICBUb29sa2l0IHRvb2xraXQgPSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCk7CkBAIC04NywyOSArOTcsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQb3N0cyBhbiBJbnZvY2F0aW9uRXZlbnQgd2hpY2ggZXhlY3V0ZXMgdGhlIHJ1bigpIG1ldGhvZCBvbiBhIFJ1bm5hYmxlIAotICAgICAqIHdoZW4gZGlzcGF0Y2hlZCBieSB0aGUgQVdUIGV2ZW50IGRpc3BhdGNoZXIgdGhyZWFkIGFuZCB0aGUgCi0gICAgICogbm90aWZ5QWxsIG1ldGhvZCBpcyBjYWxsZWQgb24gaXQgaW1tZWRpYXRlbHkgYWZ0ZXIgcnVuIHJldHVybnMuCisgICAgICogUG9zdHMgYW4gSW52b2NhdGlvbkV2ZW50IHdoaWNoIGV4ZWN1dGVzIHRoZSBydW4oKSBtZXRob2Qgb24gYSBSdW5uYWJsZQorICAgICAqIHdoZW4gZGlzcGF0Y2hlZCBieSB0aGUgQVdUIGV2ZW50IGRpc3BhdGNoZXIgdGhyZWFkIGFuZCB0aGUgbm90aWZ5QWxsCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBvbiBpdCBpbW1lZGlhdGVseSBhZnRlciBydW4gcmV0dXJucy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcnVubmFibGUgdGhlIFJ1bm5hYmxlIHdob3NlIHJ1biBtZXRob2Qgc2hvdWxkIGJlIGV4ZWN1dGVkIAotICAgICAqIHN5bmNocm9ub3VzbHkgb24gdGhlIEV2ZW50UXVldWUuCi0gICAgICogCi0gICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiBhbm90aGVyIHRocmVhZCBoYXMgaW50ZXJydXB0ZWQgCi0gICAgICogdGhpcyB0aHJlYWQuCi0gICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGlmIGEgdGhyb3dhYmxlIGlzIHRocm93biAKLSAgICAgKiB3aGVuIHJ1bm5pbmcgdGhlIHJ1bm5hYmxlLiAKKyAgICAgKiBAcGFyYW0gcnVubmFibGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBSdW5uYWJsZSB3aG9zZSBydW4gbWV0aG9kIHNob3VsZCBiZSBleGVjdXRlZCBzeW5jaHJvbm91c2x5CisgICAgICogICAgICAgICAgICBvbiB0aGUgRXZlbnRRdWV1ZS4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaGFzIGludGVycnVwdGVkIHRoaXMgdGhyZWFkLgorICAgICAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJ1bm5pbmcgdGhlIHJ1bm5hYmxlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnZva2VBbmRXYWl0KFJ1bm5hYmxlIHJ1bm5hYmxlKQotICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW52b2tlQW5kV2FpdChSdW5uYWJsZSBydW5uYWJsZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CiAKICAgICAgICAgaWYgKGlzRGlzcGF0Y2hUaHJlYWQoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CiAgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBUb29sa2l0IHRvb2xraXQgPSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCk7Ci0gICAgICAgIGZpbmFsIE9iamVjdCBub3RpZmllciA9IG5ldyBPYmplY3QoKTsgIC8vJE5PTi1MT0NLLTEkCi0gICAgICAgIEludm9jYXRpb25FdmVudCBldmVudCA9IG5ldyBJbnZvY2F0aW9uRXZlbnQoCi0gICAgICAgICAgICAgICAgdG9vbGtpdCwgcnVubmFibGUsIG5vdGlmaWVyLCB0cnVlKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IG5vdGlmaWVyID0gbmV3IE9iamVjdCgpOyAvLyAkTk9OLUxPQ0stMSQKKyAgICAgICAgSW52b2NhdGlvbkV2ZW50IGV2ZW50ID0gbmV3IEludm9jYXRpb25FdmVudCh0b29sa2l0LCBydW5uYWJsZSwgbm90aWZpZXIsIHRydWUpOwogCiAgICAgICAgIHN5bmNocm9uaXplZCAobm90aWZpZXIpIHsKICAgICAgICAgICAgIHRvb2xraXQuZ2V0U3lzdGVtRXZlbnRRdWV1ZUltcGwoKS5wb3N0RXZlbnQoZXZlbnQpOwpAQCAtMTI2LDcgKzEzNSw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc3lzdGVtIGV2ZW50IHF1ZXVlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbSBldmVudCBxdWV1ZQorICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbSBldmVudCBxdWV1ZS4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBFdmVudFF1ZXVlIGdldFN5c3RlbUV2ZW50UXVldWUoKSB7CiAgICAgICAgIFRocmVhZCB0aCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CkBAIC0xMzUsNDggKzE0NCw0NSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1vc3QgcmVjZW50IGV2ZW50J3MgdGltZXN0YW1wLgotICAgICAqIFRoaXMgZXZlbnQgd2FzIGRpc3BhdGNoZWQgZnJvbSB0aGUgRXZlbnRRdWV1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIAotICAgICAqIGNhbGxpbmcgdGhyZWFkLgorICAgICAqIEdldHMgdGhlIG1vc3QgcmVjZW50IGV2ZW50J3MgdGltZXN0YW1wLiBUaGlzIGV2ZW50IHdhcyBkaXNwYXRjaGVkIGZyb20KKyAgICAgKiB0aGUgRXZlbnRRdWV1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcgdGhyZWFkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBFdmVudCB0byBiZSBkaXNwYXRjaGVkLCAKLSAgICAgKiBvciBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSBpZiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIGZyb20gCi0gICAgICogYSB0aHJlYWQgb3RoZXIgdGhhbiBhbiBldmVudC1kaXNwYXRjaGluZyB0aHJlYWQuCisgICAgICogQHJldHVybiB0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXN0IEV2ZW50IHRvIGJlIGRpc3BhdGNoZWQsIG9yCisgICAgICogICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSBpZiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIGZyb20gYQorICAgICAqICAgICAgICAgdGhyZWFkIG90aGVyIHRoYW4gYW4gZXZlbnQtZGlzcGF0Y2hpbmcgdGhyZWFkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRNb3N0UmVjZW50RXZlbnRUaW1lKCkgewogICAgICAgICBFdmVudFF1ZXVlIGVxID0gZ2V0U3lzdGVtRXZlbnRRdWV1ZSgpOwotICAgICAgICByZXR1cm4gKGVxICE9IG51bGwpID8gCi0gICAgICAgICAgICAgICAgZXEuZ2V0TW9zdFJlY2VudEV2ZW50VGltZUltcGwoKSA6IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICByZXR1cm4gKGVxICE9IG51bGwpID8gZXEuZ2V0TW9zdFJlY2VudEV2ZW50VGltZUltcGwoKSA6IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG1vc3QgcmVjZW50IGV2ZW50IHRpbWUgaW1wbC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtb3N0IHJlY2VudCBldmVudCB0aW1lIGltcGwKKyAgICAgKiBAcmV0dXJuIHRoZSBtb3N0IHJlY2VudCBldmVudCB0aW1lIGltcGwuCiAgICAgICovCiAgICAgcHJpdmF0ZSBsb25nIGdldE1vc3RSZWNlbnRFdmVudFRpbWVJbXBsKCkgewogICAgICAgICByZXR1cm4gZ2V0Q29yZSgpLmdldE1vc3RSZWNlbnRFdmVudFRpbWUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0aGUgY3VycmVudGx5IGRpc3BhdGNoZWQgZXZlbnQgYnkgdGhlIEV2ZW50UXVldWUgCi0gICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsaW5nIHRocmVhZC4KKyAgICAgKiBSZXR1cm5zIHRoZSB0aGUgY3VycmVudGx5IGRpc3BhdGNoZWQgZXZlbnQgYnkgdGhlIEV2ZW50UXVldWUgYXNzb2NpYXRlZAorICAgICAqIHdpdGggdGhlIGNhbGxpbmcgdGhyZWFkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnRseSBkaXNwYXRjaGVkIGV2ZW50IG9yIG51bGwgaWYgdGhpcyBtZXRob2QgCi0gICAgICogaXMgaW52b2tlZCBmcm9tIGEgdGhyZWFkIG90aGVyIHRoYW4gYW4gZXZlbnQtZGlzcGF0Y2hpbmcgdGhyZWFkLgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnRseSBkaXNwYXRjaGVkIGV2ZW50IG9yIG51bGwgaWYgdGhpcyBtZXRob2QgaXMgaW52b2tlZAorICAgICAqICAgICAgICAgZnJvbSBhIHRocmVhZCBvdGhlciB0aGFuIGFuIGV2ZW50LWRpc3BhdGNoaW5nIHRocmVhZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEFXVEV2ZW50IGdldEN1cnJlbnRFdmVudCgpIHsKICAgICAgICAgRXZlbnRRdWV1ZSBlcSA9IGdldFN5c3RlbUV2ZW50UXVldWUoKTsKLSAgICAgICAgcmV0dXJuIChlcSAhPSBudWxsKSA/IAotICAgICAgICAgICAgICAgIGVxLmdldEN1cnJlbnRFdmVudEltcGwoKSA6IG51bGw7CisgICAgICAgIHJldHVybiAoZXEgIT0gbnVsbCkgPyBlcS5nZXRDdXJyZW50RXZlbnRJbXBsKCkgOiBudWxsOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGN1cnJlbnQgZXZlbnQgaW1wbC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGV2ZW50IGltcGwKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGV2ZW50IGltcGwuCiAgICAgICovCiAgICAgcHJpdmF0ZSBBV1RFdmVudCBnZXRDdXJyZW50RXZlbnRJbXBsKCkgewogICAgICAgICByZXR1cm4gZ2V0Q29yZSgpLmdldEN1cnJlbnRFdmVudCgpOwpAQCAtMTkyLDcgKzE5OCw4IEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGV2ZW50IHF1ZXVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0IHRoZSB0CisgICAgICogQHBhcmFtIHQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0LgogICAgICAqLwogICAgIEV2ZW50UXVldWUoVG9vbGtpdCB0KSB7CiAgICAgICAgIHNldENvcmUobmV3IEV2ZW50UXVldWVDb3JlKHRoaXMsIHQpKTsKQEAgLTIwMSw3ICsyMDgsOCBAQAogICAgIC8qKgogICAgICAqIFBvc3RzIGEgZXZlbnQgdG8gdGhlIEV2ZW50UXVldWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IEFXVEV2ZW50LgorICAgICAqIEBwYXJhbSBldmVudAorICAgICAqICAgICAgICAgICAgQVdURXZlbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcG9zdEV2ZW50KEFXVEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGV2ZW50LmlzUG9zdGVkID0gdHJ1ZTsKQEAgLTIwOSwyOSArMjE3LDI4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBldmVudCBmcm9tIHRoZSBFdmVudFF1ZXVlIGFuZCByZW1vdmVzIGl0IGZyb20gdGhpcyBxdWV1ZS4gCi0gICAgICogIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgQVdURXZlbnQuCisgICAgICogUmV0dXJucyBhbiBldmVudCBmcm9tIHRoZSBFdmVudFF1ZXVlIGFuZCByZW1vdmVzIGl0IGZyb20gdGhpcyBxdWV1ZS4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlzIHRocm93biBpZiBhbm90aGVyIHRocmVhZCAKLSAgICAgKiBpbnRlcnJ1cHRzIHRoaXMgdGhyZWFkLgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgQVdURXZlbnQuCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlzIHRocm93biBpZiBhbm90aGVyIHRocmVhZCBpbnRlcnJ1cHRzIHRoaXMgdGhyZWFkLgogICAgICAqLwogICAgIHB1YmxpYyBBV1RFdmVudCBnZXROZXh0RXZlbnQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gZ2V0Q29yZSgpLmdldE5leHRFdmVudCgpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG5leHQgZXZlbnQgbm8gd2FpdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGV2ZW50IG5vIHdhaXQKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGV2ZW50IG5vIHdhaXQuCiAgICAgICovCiAgICAgQVdURXZlbnQgZ2V0TmV4dEV2ZW50Tm9XYWl0KCkgewogICAgICAgICByZXR1cm4gZ2V0Q29yZSgpLmdldE5leHRFdmVudE5vV2FpdCgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGV2ZW50IG9mIHRoZSBFdmVudFF1ZXVlICh3aXRob3V0IHJlbW92aW5nIGl0IAotICAgICAqIGZyb20gdGhlIHF1ZXVlKS4KKyAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBldmVudCBvZiB0aGUgRXZlbnRRdWV1ZSAod2l0aG91dCByZW1vdmluZyBpdCBmcm9tIHRoZQorICAgICAqIHF1ZXVlKS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSB0aGUgZmlyc3QgQVdUIGV2ZW50IG9mIHRoZSBFdmVudFF1ZXVlLgogICAgICAqLwpAQCAtMjQwLDExICsyNDcsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBldmVudCBvZiB0aGUgRXZlbnRRdWV1ZSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQKLSAgICAgKiAod2l0aG91dCByZW1vdmluZyBpdCBmcm9tIHRoZSBxdWV1ZSkuCisgICAgICogUmV0dXJucyB0aGUgZmlyc3QgZXZlbnQgb2YgdGhlIEV2ZW50UXVldWUgd2l0aCB0aGUgc3BlY2lmaWVkIElEICh3aXRob3V0CisgICAgICogcmVtb3ZpbmcgaXQgZnJvbSB0aGUgcXVldWUpLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpZCB0aGUgdHlwZSBJRCBvZiBldmVudC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIElEIG9mIGV2ZW50LgogICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IGV2ZW50IG9mIHRoZSBFdmVudFF1ZXVlIHdpdGggdGhlIHNwZWNpZmllZCBJRC4KICAgICAgKi8KICAgICBwdWJsaWMgQVdURXZlbnQgcGVla0V2ZW50KGludCBpZCkgewpAQCAtMjUyLDIxICsyNTksMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXBsYWNlcyB0aGUgZXhpc3RpbmcgRXZlbnRRdWV1ZSB3aXRoIHRoZSBzcGVjaWZpZWQgRXZlbnRRdWV1ZS4gCi0gICAgICogQW55IHBlbmRpbmcgZXZlbnRzIGFyZSB0cmFuc2ZlcnJlZCB0byB0aGUgbmV3IEV2ZW50UXVldWUuIAorICAgICAqIFJlcGxhY2VzIHRoZSBleGlzdGluZyBFdmVudFF1ZXVlIHdpdGggdGhlIHNwZWNpZmllZCBFdmVudFF1ZXVlLiBBbnkKKyAgICAgKiBwZW5kaW5nIGV2ZW50cyBhcmUgdHJhbnNmZXJyZWQgdG8gdGhlIG5ldyBFdmVudFF1ZXVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuZXdFdmVudFF1ZXVlIHRoZSBuZXcgZXZlbnQgcXVldWUuCisgICAgICogQHBhcmFtIG5ld0V2ZW50UXVldWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgZXZlbnQgcXVldWUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHVzaChFdmVudFF1ZXVlIG5ld0V2ZW50UXVldWUpIHsKICAgICAgICAgZ2V0Q29yZSgpLnB1c2gobmV3RXZlbnRRdWV1ZSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogU3RvcHMgZGlzcGF0Y2hpbmcgZXZlbnRzIHVzaW5nIHRoaXMgRXZlbnRRdWV1ZS4gCi0gICAgICogQW55IHBlbmRpbmcgZXZlbnRzIGFyZSB0cmFuc2ZlcnJlZCB0byB0aGUgcHJldmlvdXMgRXZlbnRRdWV1ZS4KKyAgICAgKiBTdG9wcyBkaXNwYXRjaGluZyBldmVudHMgdXNpbmcgdGhpcyBFdmVudFF1ZXVlLiBBbnkgcGVuZGluZyBldmVudHMgYXJlCisgICAgICogdHJhbnNmZXJyZWQgdG8gdGhlIHByZXZpb3VzIEV2ZW50UXVldWUuCiAgICAgICogCi0gICAgICogQHRocm93cyBFbXB0eVN0YWNrRXhjZXB0aW9uIGlzIHRocm93biBpZiBubyBwcmV2aW91cyBwdXNoIAotICAgICAqIHdhcyBtYWRlIG9uIHRoaXMgRXZlbnRRdWV1ZS4KKyAgICAgKiBAdGhyb3dzIEVtcHR5U3RhY2tFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpcyB0aHJvd24gaWYgbm8gcHJldmlvdXMgcHVzaCB3YXMgbWFkZSBvbiB0aGlzIEV2ZW50UXVldWUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcG9wKCkgdGhyb3dzIEVtcHR5U3RhY2tFeGNlcHRpb24gewogICAgICAgICBnZXRDb3JlKCkucG9wKCk7CkBAIC0yNzUsNyArMjgzLDggQEAKICAgICAvKioKICAgICAgKiBEaXNwYXRjaGVzIHRoZSBzcGVjaWZpZWQgZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBBV1RFdmVudC4KKyAgICAgKiBAcGFyYW0gZXZlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBBV1RFdmVudC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaEV2ZW50KEFXVEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGdldENvcmUoKS5kaXNwYXRjaEV2ZW50SW1wbChldmVudCk7CkBAIC0yODQsNyArMjkzLDcgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgZW1wdHkKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGVtcHR5LgogICAgICAqLwogICAgIGJvb2xlYW4gaXNFbXB0eSgpIHsKICAgICAgICAgcmV0dXJuIGdldENvcmUoKS5pc0VtcHR5KCk7CkBAIC0yOTMsMTYgKzMwMiwxNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGNvcmUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29yZQorICAgICAqIEByZXR1cm4gdGhlIGNvcmUuCiAgICAgICovCiAgICAgRXZlbnRRdWV1ZUNvcmUgZ2V0Q29yZSgpIHsKICAgICAgICAgcmV0dXJuIGNvcmVSZWYuZ2V0KCk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgY29yZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3Q29yZSB0aGUgbmV3IGNvcmUKKyAgICAgKiBAcGFyYW0gbmV3Q29yZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBjb3JlLgogICAgICAqLwogICAgIHZvaWQgc2V0Q29yZShFdmVudFF1ZXVlQ29yZSBuZXdDb3JlKSB7CiAgICAgICAgIGNvcmVSZWYuc2V0KChuZXdDb3JlICE9IG51bGwpID8gbmV3Q29yZSA6IG5ldyBFdmVudFF1ZXVlQ29yZSh0aGlzKSk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvRm9udC5qYXZhIGIvYXd0L2phdmEvYXd0L0ZvbnQuamF2YQppbmRleCAxMzlhZTY4Li40ZWQ5MzQzIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvRm9udC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9Gb250LmphdmEKQEAgLTQ2LDEzMCArNDYsMTY1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5nbC5mb250LkZvbnRNZXRyaWNzSW1wbDsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmdsLmZvbnQuTGluZU1ldHJpY3NJbXBsOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lm1pc2MuSGFzaENvZGU7CiAKLQogLyoqCi0gKiBUaGUgRm9udCBjbGFzcyByZXByZXNlbnRzIGZvbnRzIGZvciByZW5kZXJpbmcgdGV4dC4gCi0gKiBUaGlzIGNsYXNzIGFsbG93IHRvIG1hcCBjaGFyYWN0ZXJzIHRvIGdseXBocy4KLSAqIDxwPiAKLSAqIEEgZ2x5cGggaXMgYSBzaGFwZSB1c2VkIHRvIHJlbmRlciBhIGNoYXJhY3RlciBvciBhIHNlcXVlbmNlIG9mIAotICogY2hhcmFjdGVycy4gRm9yIGV4YW1wbGUgb25lIGNoYXJhY3RlciBvZiBMYXRpbiB3cml0aW5nIHN5c3RlbSAKLSAqIHJlcHJlc2VudGVkIGJ5IG9uZSBnbHl0aCwgYnV0IGluIGNvbXBsZXggd3JpdGluZyBzeXN0ZW0gc3VjaCBhcyAKLSAqIFNvdXRoIGFuZCBTb3V0aC1FYXN0IEFzaWFuIHRoZXJlIGlzIG1vcmUgY29tcGxpY2F0ZWQgY29ycmVzcG9uZGVuY2UgCi0gKiBiZXR3ZWVuIGNoYXJhY3RlcnMgYW5kIGdseXBocy4KKyAqIFRoZSBGb250IGNsYXNzIHJlcHJlc2VudHMgZm9udHMgZm9yIHJlbmRlcmluZyB0ZXh0LiBUaGlzIGNsYXNzIGFsbG93IHRvIG1hcAorICogY2hhcmFjdGVycyB0byBnbHlwaHMuCiAgKiA8cD4KLSAqIFRoZSBGb250IG9iamVjdCBpcyBpZGVudGlmaWVkIGJ5IHR3byB0eXBlcyBvZiBuYW1lcy4gVGhlIGxvZ2ljYWwgZm9udCBuYW1lIAotICogaXMgdGhlIG5hbWUgdGhhdCBpcyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgZm9udC4gVGhlIGZvbnQgbmFtZQotICogaXMgdGhlIG5hbWUgb2YgYSBwYXJ0aWN1bGFyIGZvbnQgZmFjZSAoZm9yIGV4YW1wbGUsIEFyaWFsIEJvbGQpLiAKLSAqIFRoZSBmYW1pbHkgbmFtZSBpcyB0aGUgZm9udCdzIGZhbWlseSBuYW1lIHRoYXQgc3BlY2lmaWVzIAotICogdGhlIHR5cG9ncmFwaGljIGRlc2lnbiBhY3Jvc3Mgc2V2ZXJhbCBmYWNlcyAoZm9yIGV4YW1wbGUsIEFyaWFsKS4gSW4gCi0gKiBhbGwgdGhlIEZvbnQgaXMgaWRlbnRpZmllZCBieSB0aHJlZSBhdHRyaWJ1dGVzOiB0aGUgZmFtaWx5IG5hbWUsIAotICogdGhlIHN0eWxlIChzdWNoIGFzIGJvbGQgb3IgaXRhbGljKSwgYW5kIHRoZSBzaXplLgorICogQSBnbHlwaCBpcyBhIHNoYXBlIHVzZWQgdG8gcmVuZGVyIGEgY2hhcmFjdGVyIG9yIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycy4KKyAqIEZvciBleGFtcGxlIG9uZSBjaGFyYWN0ZXIgb2YgTGF0aW4gd3JpdGluZyBzeXN0ZW0gcmVwcmVzZW50ZWQgYnkgb25lIGdseXBoLAorICogYnV0IGluIGNvbXBsZXggd3JpdGluZyBzeXN0ZW0gc3VjaCBhcyBTb3V0aCBhbmQgU291dGgtRWFzdCBBc2lhbiB0aGVyZSBpcworICogbW9yZSBjb21wbGljYXRlZCBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIGNoYXJhY3RlcnMgYW5kIGdseXBocy4KKyAqIDxwPgorICogVGhlIEZvbnQgb2JqZWN0IGlzIGlkZW50aWZpZWQgYnkgdHdvIHR5cGVzIG9mIG5hbWVzLiBUaGUgbG9naWNhbCBmb250IG5hbWUgaXMKKyAqIHRoZSBuYW1lIHRoYXQgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIGZvbnQuIFRoZSBmb250IG5hbWUgaXMgdGhlIG5hbWUgb2YgYQorICogcGFydGljdWxhciBmb250IGZhY2UgKGZvciBleGFtcGxlLCBBcmlhbCBCb2xkKS4gVGhlIGZhbWlseSBuYW1lIGlzIHRoZSBmb250J3MKKyAqIGZhbWlseSBuYW1lIHRoYXQgc3BlY2lmaWVzIHRoZSB0eXBvZ3JhcGhpYyBkZXNpZ24gYWNyb3NzIHNldmVyYWwgZmFjZXMgKGZvcgorICogZXhhbXBsZSwgQXJpYWwpLiBJbiBhbGwgdGhlIEZvbnQgaXMgaWRlbnRpZmllZCBieSB0aHJlZSBhdHRyaWJ1dGVzOiB0aGUKKyAqIGZhbWlseSBuYW1lLCB0aGUgc3R5bGUgKHN1Y2ggYXMgYm9sZCBvciBpdGFsaWMpLCBhbmQgdGhlIHNpemUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRm9udCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQyMDYwMjEzMTE1OTE0NTkyMTNMOwogCiAgICAgLy8gSWRlbnRpdHkgVHJhbnNmb3JtIGF0dHJpYnV0ZQotICAgIC8qKiBUaGUgQ29uc3RhbnQgSURFTlRJVFlfVFJBTlNGT1JNLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBJREVOVElUWV9UUkFOU0ZPUk0uCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNmb3JtQXR0cmlidXRlIElERU5USVRZX1RSQU5TRk9STSA9IG5ldyBUcmFuc2Zvcm1BdHRyaWJ1dGUoCiAgICAgICAgICAgICBuZXcgQWZmaW5lVHJhbnNmb3JtKCkpOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBQTEFJTiBpbmRpY2F0ZXMgZm9udCdzIHBsYWluIHN0eWxlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBQTEFJTiBpbmRpY2F0ZXMgZm9udCdzIHBsYWluIHN0eWxlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQUlOID0gMDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQk9MRCBpbmRpY2F0ZXMgZm9udCdzIGJvbGQgc3R5bGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEJPTEQgaW5kaWNhdGVzIGZvbnQncyBib2xkIHN0eWxlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPTEQgPSAxOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBJVEFMSUMgaW5kaWNhdGVzIGZvbnQncyBpdGFsaWMgc3R5bGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IElUQUxJQyBpbmRpY2F0ZXMgZm9udCdzIGl0YWxpYyBzdHlsZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJVEFMSUMgPSAyOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBST01BTl9CQVNFTElORSBpbmRpY2F0ZWQgcm9tYW4gYmFzZWxpbmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFJPTUFOX0JBU0VMSU5FIGluZGljYXRlZCByb21hbiBiYXNlbGluZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST01BTl9CQVNFTElORSA9IDA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IENFTlRFUl9CQVNFTElORSBpbmRpY2F0ZXMgY2VudGVyIGJhc2VsaW5lLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDRU5URVJfQkFTRUxJTkUgaW5kaWNhdGVzIGNlbnRlciBiYXNlbGluZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRU5URVJfQkFTRUxJTkUgPSAxOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBIQU5HSU5HX0JBU0VMSU5FIGluZGljYXRlcyBoYW5naW5nIGJhc2VsaW5lLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBIQU5HSU5HX0JBU0VMSU5FIGluZGljYXRlcyBoYW5naW5nIGJhc2VsaW5lLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBTkdJTkdfQkFTRUxJTkUgPSAyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUUlVFVFlQRV9GT05UIGluZGljYXRlcyBhIGZvbnQgcmVzb3VyY2Ugb2YgCi0gICAgICogdHlwZSBUUlVFVFlQRS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRSVUVUWVBFX0ZPTlQgaW5kaWNhdGVzIGEgZm9udCByZXNvdXJjZSBvZiB0eXBlIFRSVUVUWVBFLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSVUVUWVBFX0ZPTlQgPSAwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUWVBFMV9GT05UIGluZGljYXRlcyBhIGZvbnQgcmVzb3VyY2Ugb2YKLSAgICAgKiB0eXBlIFRZUEUxLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRTFfRk9OVCBpbmRpY2F0ZXMgYSBmb250IHJlc291cmNlIG9mIHR5cGUgVFlQRTEuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRTFfRk9OVCA9IDE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IExBWU9VVF9MRUZUX1RPX1JJR0hUIGluZGljYXRlcyB0aGF0IHRleHQgaXMKLSAgICAgKiBsZWZ0IHRvIHJpZ2h0LiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTEFZT1VUX0xFRlRfVE9fUklHSFQgaW5kaWNhdGVzIHRoYXQgdGV4dCBpcyBsZWZ0IHRvIHJpZ2h0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBWU9VVF9MRUZUX1RPX1JJR0hUID0gMDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgTEFZT1VUX1JJR0hUX1RPX0xFRlQgaW5kaWNhdGVzIHRoYXQgdGV4dCBpcwotICAgICAqIHJpZ2h0IHRvIGxlZnQuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBMQVlPVVRfUklHSFRfVE9fTEVGVCBpbmRpY2F0ZXMgdGhhdCB0ZXh0IGlzIHJpZ2h0IHRvIGxlZnQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX1JJR0hUX1RPX0xFRlQgPSAxOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBMQVlPVVRfTk9fU1RBUlRfQ09OVEVYVCBpbmRpY2F0ZXMgdGhhdCB0aGUgdGV4dAotICAgICAqIGluIHRoZSBjaGFyIGFycmF5IGJlZm9yZSB0aGUgaW5kaWNhdGVkIHN0YXJ0IHNob3VsZCBub3QgYmUgZXhhbWluZWQuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBMQVlPVVRfTk9fU1RBUlRfQ09OVEVYVCBpbmRpY2F0ZXMgdGhhdCB0aGUgdGV4dCBpbiB0aGUgY2hhcgorICAgICAqIGFycmF5IGJlZm9yZSB0aGUgaW5kaWNhdGVkIHN0YXJ0IHNob3VsZCBub3QgYmUgZXhhbWluZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX05PX1NUQVJUX0NPTlRFWFQgPSAyOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBMQVlPVVRfTk9fTElNSVRfQ09OVEVYVCBpbmRpY2F0ZXMgdGhhdCB0ZXh0IGluIAotICAgICAqIHRoZSBjaGFyIGFycmF5IGFmdGVyIHRoZSBpbmRpY2F0ZWQgbGltaXQgc2hvdWxkIG5vdCBiZSBleGFtaW5lZC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTEFZT1VUX05PX0xJTUlUX0NPTlRFWFQgaW5kaWNhdGVzIHRoYXQgdGV4dCBpbiB0aGUgY2hhcgorICAgICAqIGFycmF5IGFmdGVyIHRoZSBpbmRpY2F0ZWQgbGltaXQgc2hvdWxkIG5vdCBiZSBleGFtaW5lZC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfTk9fTElNSVRfQ09OVEVYVCA9IDQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IERFRkFVTFRfRk9OVC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgREVGQVVMVF9GT05ULgorICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBGb250IERFRkFVTFRfRk9OVCA9IG5ldyBGb250KCJEaWFsb2ciLCBGb250LlBMQUlOLCAxMik7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgRm9udC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgRm9udC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CiAKLSAgICAvKiogVGhlIHN0eWxlIG9mIHRoZSBGb250LiAqLworICAgIC8qKgorICAgICAqIFRoZSBzdHlsZSBvZiB0aGUgRm9udC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHN0eWxlOwogCi0gICAgLyoqIFRoZSBzaXplIG9mIHRoZSBGb250LiAqLworICAgIC8qKgorICAgICAqIFRoZSBzaXplIG9mIHRoZSBGb250LgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgc2l6ZTsKIAotICAgIC8qKiBUaGUgcG9pbnQgc2l6ZSBvZiB0aGUgRm9udC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcG9pbnQgc2l6ZSBvZiB0aGUgRm9udC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmxvYXQgcG9pbnRTaXplOwogCiAgICAgLy8gRmxhZyBpZiB0aGUgRm9udCBvYmplY3QgdHJhbnNmb3JtZWQKLSAgICAvKiogVGhlIHRyYW5zZm9ybWVkLiAqLworICAgIC8qKgorICAgICAqIFRoZSB0cmFuc2Zvcm1lZC4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gdHJhbnNmb3JtZWQ7CiAKICAgICAvLyBTZXQgb2YgZm9udCBhdHRyaWJ1dGVzCi0gICAgLyoqIFRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdGVkIGF0dHJpYnV0ZXMuCisgICAgICovCiAgICAgcHJpdmF0ZSBIYXNodGFibGU8QXR0cmlidXRlLCBPYmplY3Q+IGZSZXF1ZXN0ZWRBdHRyaWJ1dGVzOwogCiAgICAgLy8gZm9udCBwZWVyIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgRm9udAotICAgIC8qKiBUaGUgZm9udCBwZWVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBmb250IHBlZXIuCisgICAgICovCiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgRm9udFBlZXJJbXBsIGZvbnRQZWVyOwogCiAgICAgLy8gbnVtYmVyIG9mIGdseXBocyBpbiB0aGlzIEZvbnQKLSAgICAvKiogVGhlIG51bSBnbHlwaHMuICovCisgICAgLyoqCisgICAgICogVGhlIG51bSBnbHlwaHMuCisgICAgICovCiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgaW50IG51bUdseXBocyA9IC0xOwogCiAgICAgLy8gY29kZSBmb3IgbWlzc2luZyBnbHlwaCBmb3IgdGhpcyBGb250Ci0gICAgLyoqIFRoZSBtaXNzaW5nIGdseXBoIGNvZGUuICovCisgICAgLyoqCisgICAgICogVGhlIG1pc3NpbmcgZ2x5cGggY29kZS4KKyAgICAgKi8KICAgICBwcml2YXRlIHRyYW5zaWVudCBpbnQgbWlzc2luZ0dseXBoQ29kZSA9IC0xOwogCiAgICAgLyoqCiAgICAgICogV3JpdGVzIG9iamVjdCB0byBPYmplY3RPdXRwdXRTdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIG91dCBPYmplY3RPdXRwdXRTdHJlYW0KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gb3V0CisgICAgICogICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7CkBAIC0xNzksMTAgKzIxNCwxMiBAQAogICAgICAqIFJlYWRzIG9iamVjdCBmcm9tIE9iamVjdElucHV0U3RyZWFtIG9iamVjdCBhbmQgc2V0IG5hdGl2ZSBwbGF0Zm9ybQogICAgICAqIGRlcGVuZGVudCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGluIE9iamVjdElucHV0U3RyZWFtIG9iamVjdAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB0aGUgY2xhc3Mgbm90IGZvdW5kIGV4Y2VwdGlvbgorICAgICAqIEBwYXJhbSBpbgorICAgICAqICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2JqZWN0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgdGhlIGNsYXNzIG5vdCBmb3VuZCBleGNlcHRpb24uCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLAogICAgICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CkBAIC0xOTQsMTEgKzIzMSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBGb250IHdpdGggdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVzLiAKLSAgICAgKiBUaGUgRm9udCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBkZWZhdWx0IGF0dHJpYnV0ZXMgCi0gICAgICogaWYgdGhlIGF0dHJpYnV0ZSdzIHBhcmFtZXRlciBpcyBudWxsLiAKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgRm9udCB3aXRoIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlcy4gVGhlIEZvbnQgd2lsbCBiZQorICAgICAqIGNyZWF0ZWQgd2l0aCBkZWZhdWx0IGF0dHJpYnV0ZXMgaWYgdGhlIGF0dHJpYnV0ZSdzIHBhcmFtZXRlciBpcyBudWxsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBuZXcgRm9udCwgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcworICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZXMgdG8gYmUgYXNzaWduZWQgdG8gdGhlIG5ldyBGb250LCBvciBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBGb250KE1hcDw/IGV4dGVuZHMgQXR0cmlidXRlLCA/PiBhdHRyaWJ1dGVzKSB7CiAgICAgICAgIE9iamVjdCBjdXJyQXR0cjsKQEAgLTIxNyw0MyArMjU0LDM4IEBACiAKICAgICAgICAgICAgIGN1cnJBdHRyID0gYXR0cmlidXRlcy5nZXQoVGV4dEF0dHJpYnV0ZS5TSVpFKTsKICAgICAgICAgICAgIGlmIChjdXJyQXR0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wb2ludFNpemUgPSAoKEZsb2F0KSBjdXJyQXR0cikuZmxvYXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHRoaXMuc2l6ZSA9IChpbnQpIE1hdGguY2VpbCh0aGlzLnBvaW50U2l6ZSk7CisgICAgICAgICAgICAgICAgdGhpcy5wb2ludFNpemUgPSAoKEZsb2F0KWN1cnJBdHRyKS5mbG9hdFZhbHVlKCk7CisgICAgICAgICAgICAgICAgdGhpcy5zaXplID0gKGludClNYXRoLmNlaWwodGhpcy5wb2ludFNpemUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjdXJyQXR0ciA9IGF0dHJpYnV0ZXMuZ2V0KFRleHRBdHRyaWJ1dGUuUE9TVFVSRSk7Ci0gICAgICAgICAgICBpZiAoY3VyckF0dHIgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBjdXJyQXR0ci5lcXVhbHMoVGV4dEF0dHJpYnV0ZS5QT1NUVVJFX09CTElRVUUpKSB7CisgICAgICAgICAgICBpZiAoY3VyckF0dHIgIT0gbnVsbCAmJiBjdXJyQXR0ci5lcXVhbHMoVGV4dEF0dHJpYnV0ZS5QT1NUVVJFX09CTElRVUUpKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5zdHlsZSB8PSBGb250LklUQUxJQzsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY3VyckF0dHIgPSBhdHRyaWJ1dGVzLmdldChUZXh0QXR0cmlidXRlLldFSUdIVCk7CiAgICAgICAgICAgICBpZiAoKGN1cnJBdHRyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICYmICgoKEZsb2F0KSBjdXJyQXR0cikuZmxvYXRWYWx1ZSgpID49IChUZXh0QXR0cmlidXRlLldFSUdIVF9CT0xEKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mbG9hdFZhbHVlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICYmICgoKEZsb2F0KWN1cnJBdHRyKS5mbG9hdFZhbHVlKCkgPj0gKFRleHRBdHRyaWJ1dGUuV0VJR0hUX0JPTEQpLmZsb2F0VmFsdWUoKSkpIHsKICAgICAgICAgICAgICAgICB0aGlzLnN0eWxlIHw9IEZvbnQuQk9MRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY3VyckF0dHIgPSBhdHRyaWJ1dGVzLmdldChUZXh0QXR0cmlidXRlLkZBTUlMWSk7CiAgICAgICAgICAgICBpZiAoY3VyckF0dHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IChTdHJpbmcpIGN1cnJBdHRyOworICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IChTdHJpbmcpY3VyckF0dHI7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGN1cnJBdHRyID0gYXR0cmlidXRlcy5nZXQoVGV4dEF0dHJpYnV0ZS5UUkFOU0ZPUk0pOwogICAgICAgICAgICAgaWYgKGN1cnJBdHRyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZiAoY3VyckF0dHIgaW5zdGFuY2VvZiBUcmFuc2Zvcm1BdHRyaWJ1dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lZCA9ICEoKFRyYW5zZm9ybUF0dHJpYnV0ZSkgY3VyckF0dHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRyYW5zZm9ybSgpLmlzSWRlbnRpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lZCA9ICEoKFRyYW5zZm9ybUF0dHJpYnV0ZSljdXJyQXR0cikuZ2V0VHJhbnNmb3JtKCkuaXNJZGVudGl0eSgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyckF0dHIgaW5zdGFuY2VvZiBBZmZpbmVUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lZCA9ICEoKEFmZmluZVRyYW5zZm9ybSkgY3VyckF0dHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzSWRlbnRpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lZCA9ICEoKEFmZmluZVRyYW5zZm9ybSljdXJyQXR0cikuaXNJZGVudGl0eSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMgPSBuZXcgSGFzaHRhYmxlPEF0dHJpYnV0ZSwgT2JqZWN0Pig1KTsKLSAgICAgICAgICAgIGZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlRSQU5TRk9STSwKLSAgICAgICAgICAgICAgICAgICAgSURFTlRJVFlfVFJBTlNGT1JNKTsKKyAgICAgICAgICAgIGZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlRSQU5TRk9STSwgSURFTlRJVFlfVFJBTlNGT1JNKTsKIAogICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lZCA9IGZhbHNlOwogCkBAIC0yNjIsMTggKzI5NCwxNCBAQAogICAgICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuU0laRSwgbmV3IEZsb2F0KHRoaXMuc2l6ZSkpOwogCiAgICAgICAgICAgICBpZiAoKHRoaXMuc3R5bGUgJiBGb250LkJPTEQpICE9IDApIHsKLSAgICAgICAgICAgICAgICBmUmVxdWVzdGVkQXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5XRUlHSFQsCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXh0QXR0cmlidXRlLldFSUdIVF9CT0xEKTsKKyAgICAgICAgICAgICAgICBmUmVxdWVzdGVkQXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5XRUlHSFQsIFRleHRBdHRyaWJ1dGUuV0VJR0hUX0JPTEQpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmUmVxdWVzdGVkQXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5XRUlHSFQsCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXh0QXR0cmlidXRlLldFSUdIVF9SRUdVTEFSKTsKKyAgICAgICAgICAgICAgICBmUmVxdWVzdGVkQXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5XRUlHSFQsIFRleHRBdHRyaWJ1dGUuV0VJR0hUX1JFR1VMQVIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCh0aGlzLnN0eWxlICYgRm9udC5JVEFMSUMpICE9IDApIHsKLSAgICAgICAgICAgICAgICBmUmVxdWVzdGVkQXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5QT1NUVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEF0dHJpYnV0ZS5QT1NUVVJFX09CTElRVUUpOworICAgICAgICAgICAgICAgIGZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlBPU1RVUkUsIFRleHRBdHRyaWJ1dGUuUE9TVFVSRV9PQkxJUVVFKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuUE9TVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRleHRBdHRyaWJ1dGUuUE9TVFVSRV9SRUdVTEFSKTsKKyAgICAgICAgICAgICAgICBmUmVxdWVzdGVkQXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5QT1NUVVJFLCBUZXh0QXR0cmlidXRlLlBPU1RVUkVfUkVHVUxBUik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgfQpAQCAtMjgyLDkgKzMxMCwxMiBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBGb250IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBzdHlsZSBhbmQgc2l6ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBmb250LgotICAgICAqIEBwYXJhbSBzdHlsZSB0aGUgc3R5bGUgb2YgZm9udC4KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiBmb250LgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiBmb250LgorICAgICAqIEBwYXJhbSBzdHlsZQorICAgICAqICAgICAgICAgICAgdGhlIHN0eWxlIG9mIGZvbnQuCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIG9mIGZvbnQuCiAgICAgICovCiAgICAgcHVibGljIEZvbnQoU3RyaW5nIG5hbWUsIGludCBzdHlsZSwgaW50IHNpemUpIHsKIApAQCAtMzAzLDQ2ICszMzQsNDMgQEAKICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuU0laRSwgbmV3IEZsb2F0KHRoaXMuc2l6ZSkpOwogCiAgICAgICAgIGlmICgodGhpcy5zdHlsZSAmIEZvbnQuQk9MRCkgIT0gMCkgewotICAgICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuV0VJR0hULAotICAgICAgICAgICAgICAgICAgICBUZXh0QXR0cmlidXRlLldFSUdIVF9CT0xEKTsKKyAgICAgICAgICAgIGZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLldFSUdIVCwgVGV4dEF0dHJpYnV0ZS5XRUlHSFRfQk9MRCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmUmVxdWVzdGVkQXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5XRUlHSFQsCi0gICAgICAgICAgICAgICAgICAgIFRleHRBdHRyaWJ1dGUuV0VJR0hUX1JFR1VMQVIpOworICAgICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuV0VJR0hULCBUZXh0QXR0cmlidXRlLldFSUdIVF9SRUdVTEFSKTsKICAgICAgICAgfQogICAgICAgICBpZiAoKHRoaXMuc3R5bGUgJiBGb250LklUQUxJQykgIT0gMCkgewotICAgICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuUE9TVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgVGV4dEF0dHJpYnV0ZS5QT1NUVVJFX09CTElRVUUpOworICAgICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuUE9TVFVSRSwgVGV4dEF0dHJpYnV0ZS5QT1NUVVJFX09CTElRVUUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuUE9TVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgVGV4dEF0dHJpYnV0ZS5QT1NUVVJFX1JFR1VMQVIpOworICAgICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuUE9TVFVSRSwgVGV4dEF0dHJpYnV0ZS5QT1NUVVJFX1JFR1VMQVIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgRm9udCBoYXMgYSBnbHlwaCBmb3IgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGMgdGhlIGNoYXJhY3Rlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBGb250IGhhcyBhIGdseXBoIGZvciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgRm9udCBoYXMgYSBnbHlwaCBmb3IgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIsIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuRGlzcGxheShjaGFyIGMpIHsKLSAgICAgICAgRm9udFBlZXJJbXBsIHBlZXIgPSAoRm9udFBlZXJJbXBsKSB0aGlzLmdldFBlZXIoKTsKKyAgICAgICAgRm9udFBlZXJJbXBsIHBlZXIgPSAoRm9udFBlZXJJbXBsKXRoaXMuZ2V0UGVlcigpOwogICAgICAgICByZXR1cm4gcGVlci5jYW5EaXNwbGF5KGMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgRm9udCBjYW4gZGlzcGxheSB0aGUgY2hhcmFjdGVycyBvZiB0aGUgCi0gICAgICogdGhlIHNwZWNpZmllZCB0ZXh0IGZyb20gdGhlIHNwZWNpZmllZCBzdGFydCBwb3NpdGlvbiAKLSAgICAgKiB0byB0aGUgc3BlY2lmaWVkIGxpbWl0IHBvc2l0aW9uLiAKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEZvbnQgY2FuIGRpc3BsYXkgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB0ZXh0IGZyb20gdGhlIHNwZWNpZmllZCBzdGFydCBwb3NpdGlvbiB0byB0aGUgc3BlY2lmaWVkIGxpbWl0IHBvc2l0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0LgotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2Zmc2V0IChpbiB0aGUgY2hhcmFjdGVyIGFycmF5KS4KLSAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbWl0IG9mZnNldCAoaW4gdGhlIGNoYXJhY3RlciBhcnJheSkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYSBjaGFyYWN0ZXIncyBwb3NpdGlvbiBpbiB0aGUgdGV4dCB0aGF0IHRoaXMgRm9udCAKLSAgICAgKiBjYW4gbm90IGRpc3BsYXksIG9yIC0xIGlmIHRoaXMgRm9udCBjYW4gZGlzcGxheSBhbGwgY2hhcmFjdGVycyAKLSAgICAgKiBpbiB0aGlzIHRleHQuCisgICAgICogQHBhcmFtIHRleHQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0ZXh0LgorICAgICAqIEBwYXJhbSBzdGFydAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IG9mZnNldCAoaW4gdGhlIGNoYXJhY3RlciBhcnJheSkuCisgICAgICogQHBhcmFtIGxpbWl0CisgICAgICogICAgICAgICAgICB0aGUgbGltaXQgb2Zmc2V0IChpbiB0aGUgY2hhcmFjdGVyIGFycmF5KS4KKyAgICAgKiBAcmV0dXJuIHRoZSBhIGNoYXJhY3RlcidzIHBvc2l0aW9uIGluIHRoZSB0ZXh0IHRoYXQgdGhpcyBGb250IGNhbiBub3QKKyAgICAgKiAgICAgICAgIGRpc3BsYXksIG9yIC0xIGlmIHRoaXMgRm9udCBjYW4gZGlzcGxheSBhbGwgY2hhcmFjdGVycyBpbiB0aGlzCisgICAgICogICAgICAgICB0ZXh0LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY2FuRGlzcGxheVVwVG8oY2hhcltdIHRleHQsIGludCBzdGFydCwgaW50IGxpbWl0KSB7CiAgICAgICAgIGludCBzdCA9IHN0YXJ0OwpAQCAtMzYxLDE3ICszODksMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEZvbnQgY2FuIGRpc3BsYXkgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIAotICAgICAqIHRoZSBzcGVjaWZpZWQgQ2hhcmFjdGVySXRlcmF0b3IgZnJvbSB0aGUgc3BlY2lmaWVkIHN0YXJ0IHBvc2l0aW9uIAotICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIGxpbWl0IHBvc2l0aW9uLiAKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEZvbnQgY2FuIGRpc3BsYXkgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBDaGFyYWN0ZXJJdGVyYXRvciBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhcnQgcG9zaXRpb24gYW5kIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBsaW1pdCBwb3NpdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlciB0aGUgQ2hhcmFjdGVySXRlcmF0b3IuCi0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZmZzZXQuCi0gICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW1pdCBvZmZzZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYSBjaGFyYWN0ZXIncyBwb3NpdGlvbiBpbiB0aGUgQ2hhcmFjdGVySXRlcmF0b3IKLSAgICAgKiB0aGF0IHRoaXMgRm9udCBjYW4gbm90IGRpc3BsYXksIG9yIC0xIGlmIHRoaXMgRm9udCBjYW4gZGlzcGxheSAKLSAgICAgKiBhbGwgY2hhcmFjdGVycyBpbiB0aGlzIHRleHQuCisgICAgICogQHBhcmFtIGl0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBDaGFyYWN0ZXJJdGVyYXRvci4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBvZmZzZXQuCisgICAgICogQHBhcmFtIGxpbWl0CisgICAgICogICAgICAgICAgICB0aGUgbGltaXQgb2Zmc2V0LgorICAgICAqIEByZXR1cm4gdGhlIGEgY2hhcmFjdGVyJ3MgcG9zaXRpb24gaW4gdGhlIENoYXJhY3Rlckl0ZXJhdG9yIHRoYXQgdGhpcworICAgICAqICAgICAgICAgRm9udCBjYW4gbm90IGRpc3BsYXksIG9yIC0xIGlmIHRoaXMgRm9udCBjYW4gZGlzcGxheSBhbGwKKyAgICAgKiAgICAgICAgIGNoYXJhY3RlcnMgaW4gdGhpcyB0ZXh0LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY2FuRGlzcGxheVVwVG8oQ2hhcmFjdGVySXRlcmF0b3IgaXRlciwgaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKICAgICAgICAgaW50IHN0ID0gc3RhcnQ7CkBAIC0zOTQsMTEgKzQyNCwxMSBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIEZvbnQgY2FuIGRpc3BsYXkgYSBzcGVjaWZpZWQgU3RyaW5nLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHIgdGhlIFN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhIGNoYXJhY3RlcidzIHBvc2l0aW9uIGluIHRoZSBTdHJpbmcgdGhhdCAKLSAgICAgKiB0aGlzIEZvbnQgY2FuIG5vdCBkaXNwbGF5LCBvciAtMSBpZiB0aGlzIEZvbnQgY2FuIGRpc3BsYXkgCi0gICAgICogYWxsIGNoYXJhY3RlcnMgaW4gdGhpcyB0ZXh0LgorICAgICAqIEBwYXJhbSBzdHIKKyAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcuCisgICAgICogQHJldHVybiB0aGUgYSBjaGFyYWN0ZXIncyBwb3NpdGlvbiBpbiB0aGUgU3RyaW5nIHRoYXQgdGhpcyBGb250IGNhbiBub3QKKyAgICAgKiAgICAgICAgIGRpc3BsYXksIG9yIC0xIGlmIHRoaXMgRm9udCBjYW4gZGlzcGxheSBhbGwgY2hhcmFjdGVycyBpbiB0aGlzCisgICAgICogICAgICAgICB0ZXh0LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY2FuRGlzcGxheVVwVG8oU3RyaW5nIHN0cikgewogICAgICAgICBjaGFyW10gY2hhcnMgPSBzdHIudG9DaGFyQXJyYXkoKTsKQEAgLTQwNiw0NSArNDM2LDQ5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEdseXBoVmVjdG9yIG9mIGFzc29jaWF0aW5nIGNoYXJhY3RlcnMgdG8gZ2x5cGhzIAotICAgICAqIGJhc2VkIG9uIHRoZSB1bmljb2RlIG1hcCBvZiB0aGlzIEZvbnQuIAorICAgICAqIENyZWF0ZXMgYSBHbHlwaFZlY3RvciBvZiBhc3NvY2lhdGluZyBjaGFyYWN0ZXJzIHRvIGdseXBocyBiYXNlZCBvbiB0aGUKKyAgICAgKiBVbmljb2RlIG1hcCBvZiB0aGlzIEZvbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZyYyB0aGUgRm9udFJlbmRlckNvbnRleHQuCi0gICAgICogQHBhcmFtIGNoYXJzIHRoZSBjaGFyYWN0ZXJzIGFycmF5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEdseXBoVmVjdG9yIG9mIGFzc29jaWF0aW5nIGNoYXJhY3RlcnMgdG8gZ2x5cGhzIAotICAgICAqIGJhc2VkIG9uIHRoZSB1bmljb2RlIG1hcCBvZiB0aGlzIEZvbnQuCisgICAgICogQHBhcmFtIGZyYworICAgICAqICAgICAgICAgICAgdGhlIEZvbnRSZW5kZXJDb250ZXh0LgorICAgICAqIEBwYXJhbSBjaGFycworICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlcnMgYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgR2x5cGhWZWN0b3Igb2YgYXNzb2NpYXRpbmcgY2hhcmFjdGVycyB0byBnbHlwaHMgYmFzZWQgb24gdGhlCisgICAgICogICAgICAgICBVbmljb2RlIG1hcCBvZiB0aGlzIEZvbnQuCiAgICAgICovCiAgICAgcHVibGljIEdseXBoVmVjdG9yIGNyZWF0ZUdseXBoVmVjdG9yKEZvbnRSZW5kZXJDb250ZXh0IGZyYywgY2hhcltdIGNoYXJzKSB7CiAgICAgICAgIHJldHVybiBuZXcgQW5kcm9pZEdseXBoVmVjdG9yKGNoYXJzLCBmcmMsIHRoaXMsIDApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBHbHlwaFZlY3RvciBvZiBhc3NvY2lhdGluZyBjaGFyYWN0ZXJzIGNvbnRhaW5lZAotICAgICAqIGluIHRoZSBzcGVjaWZpZWQgQ2hhcmFjdGVySXRlcmF0b3IgdG8gZ2x5cGhzIGJhc2VkIG9uIAotICAgICAqIHRoZSB1bmljb2RlIG1hcCBvZiB0aGlzIEZvbnQuIAorICAgICAqIENyZWF0ZXMgYSBHbHlwaFZlY3RvciBvZiBhc3NvY2lhdGluZyBjaGFyYWN0ZXJzIGNvbnRhaW5lZCBpbiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgQ2hhcmFjdGVySXRlcmF0b3IgdG8gZ2x5cGhzIGJhc2VkIG9uIHRoZSBVbmljb2RlIG1hcCBvZiB0aGlzCisgICAgICogRm9udC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnJjIHRoZSBGb250UmVuZGVyQ29udGV4dC4KLSAgICAgKiBAcGFyYW0gaXRlciB0aGUgQ2hhcmFjdGVySXRlcmF0b3IuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgR2x5cGhWZWN0b3Igb2YgYXNzb2NpYXRpbmcgY2hhcmFjdGVycyBjb250YWluZWQKLSAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIENoYXJhY3Rlckl0ZXJhdG9yIHRvIGdseXBocyAKLSAgICAgKiBiYXNlZCBvbiB0aGUgdW5pY29kZSBtYXAgb2YgdGhpcyBGb250LgorICAgICAqIEBwYXJhbSBmcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250UmVuZGVyQ29udGV4dC4KKyAgICAgKiBAcGFyYW0gaXRlcgorICAgICAqICAgICAgICAgICAgdGhlIENoYXJhY3Rlckl0ZXJhdG9yLgorICAgICAqIEByZXR1cm4gdGhlIEdseXBoVmVjdG9yIG9mIGFzc29jaWF0aW5nIGNoYXJhY3RlcnMgY29udGFpbmVkIGluIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIENoYXJhY3Rlckl0ZXJhdG9yIHRvIGdseXBocyBiYXNlZCBvbiB0aGUgVW5pY29kZSBtYXAgb2YKKyAgICAgKiAgICAgICAgIHRoaXMgRm9udC4KICAgICAgKi8KLSAgICBwdWJsaWMgR2x5cGhWZWN0b3IgY3JlYXRlR2x5cGhWZWN0b3IoRm9udFJlbmRlckNvbnRleHQgZnJjLAotICAgICAgICAgICAgQ2hhcmFjdGVySXRlcmF0b3IgaXRlcikgewotICAgIAl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkISIpOyAvLyROT04tTkxTLTEkICAgIAorICAgIHB1YmxpYyBHbHlwaFZlY3RvciBjcmVhdGVHbHlwaFZlY3RvcihGb250UmVuZGVyQ29udGV4dCBmcmMsIENoYXJhY3Rlckl0ZXJhdG9yIGl0ZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCEiKTsgLy8kTk9OLU5MUy0xJCAgICAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgR2x5cGhWZWN0b3Igb2YgYXNzb2NpYXRpbmcgY2hhcmFjdGVycyB0byBnbHlwaHMgYmFzZWQgb24gCi0gICAgICogdGhlIHVuaWNvZGUgbWFwIG9mIHRoaXMgRm9udC4gCisgICAgICogQ3JlYXRlcyBhIEdseXBoVmVjdG9yIG9mIGFzc29jaWF0aW5nIGNoYXJhY3RlcnMgdG8gZ2x5cGhzIGJhc2VkIG9uIHRoZQorICAgICAqIFVuaWNvZGUgbWFwIG9mIHRoaXMgRm9udC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnJjIHRoZSBGb250UmVuZGVyQ29udGV4dC4KLSAgICAgKiBAcGFyYW0gZ2x5cGhDb2RlcyB0aGUgc3BlY2lmaWVkIGludGVnZXIgYXJyYXkgb2YgZ2x5cGggY29kZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgR2x5cGhWZWN0b3Igb2YgYXNzb2NpYXRpbmcgY2hhcmFjdGVycyB0byBnbHlwaHMgCi0gICAgICogYmFzZWQgb24gdGhlIHVuaWNvZGUgbWFwIG9mIHRoaXMgRm9udC4KKyAgICAgKiBAcGFyYW0gZnJjCisgICAgICogICAgICAgICAgICB0aGUgRm9udFJlbmRlckNvbnRleHQuCisgICAgICogQHBhcmFtIGdseXBoQ29kZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgaW50ZWdlciBhcnJheSBvZiBnbHlwaCBjb2Rlcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBHbHlwaFZlY3RvciBvZiBhc3NvY2lhdGluZyBjaGFyYWN0ZXJzIHRvIGdseXBocyBiYXNlZCBvbiB0aGUKKyAgICAgKiAgICAgICAgIFVuaWNvZGUgbWFwIG9mIHRoaXMgRm9udC4KKyAgICAgKiBAdGhyb3dzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuCiAgICAgICovCiAgICAgcHVibGljIEdseXBoVmVjdG9yIGNyZWF0ZUdseXBoVmVjdG9yKEZvbnRSZW5kZXJDb250ZXh0IGZyYywgaW50W10gZ2x5cGhDb2RlcykKICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uIHsKQEAgLTQ1MiwxNCArNDg2LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEdseXBoVmVjdG9yIG9mIGFzc29jaWF0aW5nIGNoYXJhY3RlcnMgdG8gZ2x5cGhzIGJhc2VkIG9uIAotICAgICAqIHRoZSB1bmljb2RlIG1hcCBvZiB0aGlzIEZvbnQuIAorICAgICAqIENyZWF0ZXMgYSBHbHlwaFZlY3RvciBvZiBhc3NvY2lhdGluZyBjaGFyYWN0ZXJzIHRvIGdseXBocyBiYXNlZCBvbiB0aGUKKyAgICAgKiBVbmljb2RlIG1hcCBvZiB0aGlzIEZvbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZyYyB0aGUgRm9udFJlbmRlckNvbnRleHQuCi0gICAgICogQHBhcmFtIHN0ciB0aGUgc3BlY2lmaWVkIFN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBHbHlwaFZlY3RvciBvZiBhc3NvY2lhdGluZyBjaGFyYWN0ZXJzIHRvIGdseXBocyAKLSAgICAgKiBiYXNlZCBvbiB0aGUgdW5pY29kZSBtYXAgb2YgdGhpcyBGb250LgorICAgICAqIEBwYXJhbSBmcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250UmVuZGVyQ29udGV4dC4KKyAgICAgKiBAcGFyYW0gc3RyCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFN0cmluZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBHbHlwaFZlY3RvciBvZiBhc3NvY2lhdGluZyBjaGFyYWN0ZXJzIHRvIGdseXBocyBiYXNlZCBvbiB0aGUKKyAgICAgKiAgICAgICAgIFVuaWNvZGUgbWFwIG9mIHRoaXMgRm9udC4KICAgICAgKi8KICAgICBwdWJsaWMgR2x5cGhWZWN0b3IgY3JlYXRlR2x5cGhWZWN0b3IoRm9udFJlbmRlckNvbnRleHQgZnJjLCBTdHJpbmcgc3RyKSB7CiAgICAgICAgIHJldHVybiBuZXcgQW5kcm9pZEdseXBoVmVjdG9yKHN0ci50b0NoYXJBcnJheSgpLCBmcmMsIHRoaXMsIDApOwpAQCAtNDY3LDE0ICs1MDIsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmb250IHN0eWxlIGNvbnN0YW50IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZSBmb250IHN0eWxlCi0gICAgICogbmFtZXMgKCJCT0xEIiwgIklUQUxJQyIsICJCT0xESVRBTElDIikuIFRoaXMgbWV0aG9kIHJldHVybnMgRm9udC5QTEFJTiBpZgotICAgICAqIHRoZSBhcmd1bWVudCBpcyBub3Qgb25lIG9mIHRoZSBwcmVkZWZpbmVkIHN0eWxlIG5hbWVzLgorICAgICAqIFJldHVybnMgdGhlIGZvbnQgc3R5bGUgY29uc3RhbnQgdmFsdWUgY29ycmVzcG9uZGluZyB0byBvbmUgb2YgdGhlIGZvbnQKKyAgICAgKiBzdHlsZSBuYW1lcyAoIkJPTEQiLCAiSVRBTElDIiwgIkJPTERJVEFMSUMiKS4gVGhpcyBtZXRob2QgcmV0dXJucworICAgICAqIEZvbnQuUExBSU4gaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBvbmUgb2YgdGhlIHByZWRlZmluZWQgc3R5bGUgbmFtZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZvbnRTdHlsZU5hbWUgZm9udCBzdHlsZSBuYW1lCi0gICAgICogCisgICAgICogQHBhcmFtIGZvbnRTdHlsZU5hbWUKKyAgICAgKiAgICAgICAgICAgIGZvbnQgc3R5bGUgbmFtZS4KICAgICAgKiBAcmV0dXJuIGZvbnQgc3R5bGUgY29uc3RhbnQgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgZm9udCBzdHlsZSBuYW1lCi0gICAgICogc3BlY2lmaWVkLgorICAgICAqICAgICAgICAgc3BlY2lmaWVkLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRGb250U3R5bGUoU3RyaW5nIGZvbnRTdHlsZU5hbWUpIHsKICAgICAgICAgaW50IHJlc3VsdCA9IEZvbnQuUExBSU47CkBAIC00OTEsMTIgKzUyNiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIERlY29kZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2hpY2ggZGVzY3JpYmVkIHRoZSBGb250LiBUaGUgc3RyaW5nIAotICAgICAqIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiBmb250bmFtZS1zdHlsZS1wb2ludHNpemUuIAotICAgICAqIFRoZSBzdHlsZSBjYW4gYmUgUExBSU4sIEJPTEQsIEJPTERJVEFMSUMsIG9yIElUQUxJQy4KKyAgICAgKiBEZWNvZGVzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdoaWNoIGRlc2NyaWJlZCB0aGUgRm9udC4gVGhlIHN0cmluZyBzaG91bGQKKyAgICAgKiBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiBmb250bmFtZS1zdHlsZS1wb2ludHNpemUuIFRoZSBzdHlsZSBjYW4gYmUKKyAgICAgKiBQTEFJTiwgQk9MRCwgQk9MRElUQUxJQywgb3IgSVRBTElDLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB3aGljaCBkZXNjcmliZXMgdGhlIGZvbnQuCi0gICAgICogCisgICAgICogQHBhcmFtIHN0cgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB3aGljaCBkZXNjcmliZXMgdGhlIGZvbnQuCiAgICAgICogQHJldHVybiB0aGUgRm9udCBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgRm9udCBkZWNvZGUoU3RyaW5nIHN0cikgewpAQCAtNTUzLDE1ICs1ODgsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQZXJmb21zIHRoZSBzcGVjaWZpZWQgYWZmaW5lIHRyYW5zZm9ybSB0byB0aGUgRm9udCBhbmQgcmV0dXJucyAKLSAgICAgKiBhIG5ldyBGb250LgorICAgICAqIFBlcmZvcm1zIHRoZSBzcGVjaWZpZWQgYWZmaW5lIHRyYW5zZm9ybSB0byB0aGUgRm9udCBhbmQgcmV0dXJucyBhIG5ldworICAgICAqIEZvbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRyYW5zIHRoZSBBZmZpbmVUcmFuc2Zvcm0uCi0gICAgICogCisgICAgICogQHBhcmFtIHRyYW5zCisgICAgICogICAgICAgICAgICB0aGUgQWZmaW5lVHJhbnNmb3JtLgogICAgICAqIEByZXR1cm4gdGhlIEZvbnQgb2JqZWN0LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFmZmluZSB0cmFuc2Zvcm0gcGFyYW1ldGVyCi0gICAgICogaXMgbnVsbC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFmZmluZSB0cmFuc2Zvcm0gcGFyYW1ldGVyIGlzIG51bGwuCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIEZvbnQgZGVyaXZlRm9udChBZmZpbmVUcmFuc2Zvcm0gdHJhbnMpIHsKQEAgLTU3MSw1NSArNjA1LDUyIEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0Ljk0IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBIYXNodGFibGU8QXR0cmlidXRlLCBPYmplY3Q+IGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzID0gKEhhc2h0YWJsZTxBdHRyaWJ1dGUsIE9iamVjdD4pIGZSZXF1ZXN0ZWRBdHRyaWJ1dGVzCisgICAgICAgIEhhc2h0YWJsZTxBdHRyaWJ1dGUsIE9iamVjdD4gZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMgPSAoSGFzaHRhYmxlPEF0dHJpYnV0ZSwgT2JqZWN0PilmUmVxdWVzdGVkQXR0cmlidXRlcwogICAgICAgICAgICAgICAgIC5jbG9uZSgpOwogCi0gICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlRSQU5TRk9STSwKLSAgICAgICAgICAgICAgICBuZXcgVHJhbnNmb3JtQXR0cmlidXRlKHRyYW5zKSk7CisgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlRSQU5TRk9STSwgbmV3IFRyYW5zZm9ybUF0dHJpYnV0ZSh0cmFucykpOwogCiAgICAgICAgIHJldHVybiBuZXcgRm9udChkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcyk7CiAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IEZvbnQgdGhhdCBpcyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgRm9udCAKLSAgICAgKiBtb2RpZmllZCBzbyB0aGF0IHRoZSBzaXplIGlzIHRoZSBzcGVjaWZpZWQgc2l6ZS4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IEZvbnQgdGhhdCBpcyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgRm9udCBtb2RpZmllZCBzbyB0aGF0CisgICAgICogdGhlIHNpemUgaXMgdGhlIHNwZWNpZmllZCBzaXplLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIGZvbnQuCi0gICAgICogCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIG9mIGZvbnQuCiAgICAgICogQHJldHVybiB0aGUgRm9udCBvYmplY3QuCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIEZvbnQgZGVyaXZlRm9udChmbG9hdCBzaXplKSB7Ci0gICAgICAgIEhhc2h0YWJsZTxBdHRyaWJ1dGUsIE9iamVjdD4gZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMgPSAoSGFzaHRhYmxlPEF0dHJpYnV0ZSwgT2JqZWN0PikgZlJlcXVlc3RlZEF0dHJpYnV0ZXMKKyAgICAgICAgSGFzaHRhYmxlPEF0dHJpYnV0ZSwgT2JqZWN0PiBkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcyA9IChIYXNodGFibGU8QXR0cmlidXRlLCBPYmplY3Q+KWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzCiAgICAgICAgICAgICAgICAgLmNsb25lKCk7CiAgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlNJWkUsIG5ldyBGbG9hdChzaXplKSk7CiAgICAgICAgIHJldHVybiBuZXcgRm9udChkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBGb250IHRoYXQgaXMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IEZvbnQgCi0gICAgICogbW9kaWZpZWQgc28gdGhhdCB0aGUgc3R5bGUgaXMgdGhlIHNwZWNpZmllZCBzdHlsZS4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IEZvbnQgdGhhdCBpcyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgRm9udCBtb2RpZmllZCBzbyB0aGF0CisgICAgICogdGhlIHN0eWxlIGlzIHRoZSBzcGVjaWZpZWQgc3R5bGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBvZiBmb250LgotICAgICAqIAorICAgICAqIEBwYXJhbSBzdHlsZQorICAgICAqICAgICAgICAgICAgdGhlIHN0eWxlIG9mIGZvbnQuCiAgICAgICogQHJldHVybiB0aGUgRm9udCBvYmplY3QuCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIEZvbnQgZGVyaXZlRm9udChpbnQgc3R5bGUpIHsKLSAgICAgICAgSGFzaHRhYmxlPEF0dHJpYnV0ZSwgT2JqZWN0PiBkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcyA9IChIYXNodGFibGU8QXR0cmlidXRlLCBPYmplY3Q+KSBmUmVxdWVzdGVkQXR0cmlidXRlcworICAgICAgICBIYXNodGFibGU8QXR0cmlidXRlLCBPYmplY3Q+IGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzID0gKEhhc2h0YWJsZTxBdHRyaWJ1dGUsIE9iamVjdD4pZlJlcXVlc3RlZEF0dHJpYnV0ZXMKICAgICAgICAgICAgICAgICAuY2xvbmUoKTsKIAogICAgICAgICBpZiAoKHN0eWxlICYgRm9udC5CT0xEKSAhPSAwKSB7Ci0gICAgICAgICAgICBkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5XRUlHSFQsCi0gICAgICAgICAgICAgICAgICAgIFRleHRBdHRyaWJ1dGUuV0VJR0hUX0JPTEQpOworICAgICAgICAgICAgZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuV0VJR0hULCBUZXh0QXR0cmlidXRlLldFSUdIVF9CT0xEKTsKICAgICAgICAgfSBlbHNlIGlmIChkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcy5nZXQoVGV4dEF0dHJpYnV0ZS5XRUlHSFQpICE9IG51bGwpIHsKICAgICAgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnJlbW92ZShUZXh0QXR0cmlidXRlLldFSUdIVCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoKHN0eWxlICYgRm9udC5JVEFMSUMpICE9IDApIHsKLSAgICAgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlBPU1RVUkUsCi0gICAgICAgICAgICAgICAgICAgIFRleHRBdHRyaWJ1dGUuUE9TVFVSRV9PQkxJUVVFKTsKKyAgICAgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlBPU1RVUkUsIFRleHRBdHRyaWJ1dGUuUE9TVFVSRV9PQkxJUVVFKTsKICAgICAgICAgfSBlbHNlIGlmIChkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcy5nZXQoVGV4dEF0dHJpYnV0ZS5QT1NUVVJFKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcy5yZW1vdmUoVGV4dEF0dHJpYnV0ZS5QT1NUVVJFKTsKICAgICAgICAgfQpAQCAtNjI4LDEzICs2NTksMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IEZvbnQgdGhhdCBpcyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgRm9udAotICAgICAqIG1vZGlmaWVkIHRvIG1hdGNoIHRoZSBzcGVjaWZpZWQgc3R5bGUgYW5kIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIGFmZmluZSB0cmFuc2Zvcm0gYXBwbGllZCB0byBpdHMgZ2x5cGhzLgorICAgICAqIFJldHVybnMgYSBuZXcgRm9udCB0aGF0IGlzIGEgY29weSBvZiB0aGUgY3VycmVudCBGb250IG1vZGlmaWVkIHRvIG1hdGNoCisgICAgICogdGhlIHNwZWNpZmllZCBzdHlsZSBhbmQgd2l0aCB0aGUgc3BlY2lmaWVkIGFmZmluZSB0cmFuc2Zvcm0gYXBwbGllZCB0bworICAgICAqIGl0cyBnbHlwaHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBvZiBmb250LgotICAgICAqIEBwYXJhbSB0cmFucyB0aGUgQWZmaW5lVHJhbnNmb3JtLgotICAgICAqIAorICAgICAqIEBwYXJhbSBzdHlsZQorICAgICAqICAgICAgICAgICAgdGhlIHN0eWxlIG9mIGZvbnQuCisgICAgICogQHBhcmFtIHRyYW5zCisgICAgICogICAgICAgICAgICB0aGUgQWZmaW5lVHJhbnNmb3JtLgogICAgICAqIEByZXR1cm4gdGhlIEZvbnQgb2JqZWN0LgogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQpAQCAtNjQ0LDUzICs2NzYsNDggQEAKICAgICAgICAgICAgIC8vIGF3dC45ND10cmFuc2Zvcm0gY2FuIG5vdCBiZSBudWxsCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0Ljk0IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KLSAgICAgICAgSGFzaHRhYmxlPEF0dHJpYnV0ZSwgT2JqZWN0PiBkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcyA9IChIYXNodGFibGU8QXR0cmlidXRlLCBPYmplY3Q+KSBmUmVxdWVzdGVkQXR0cmlidXRlcworICAgICAgICBIYXNodGFibGU8QXR0cmlidXRlLCBPYmplY3Q+IGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzID0gKEhhc2h0YWJsZTxBdHRyaWJ1dGUsIE9iamVjdD4pZlJlcXVlc3RlZEF0dHJpYnV0ZXMKICAgICAgICAgICAgICAgICAuY2xvbmUoKTsKIAogICAgICAgICBpZiAoKHN0eWxlICYgQk9MRCkgIT0gMCkgewotICAgICAgICAgICAgZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuV0VJR0hULAotICAgICAgICAgICAgICAgICAgICBUZXh0QXR0cmlidXRlLldFSUdIVF9CT0xEKTsKKyAgICAgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLldFSUdIVCwgVGV4dEF0dHJpYnV0ZS5XRUlHSFRfQk9MRCk7CiAgICAgICAgIH0gZWxzZSBpZiAoZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMuZ2V0KFRleHRBdHRyaWJ1dGUuV0VJR0hUKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcy5yZW1vdmUoVGV4dEF0dHJpYnV0ZS5XRUlHSFQpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKChzdHlsZSAmIElUQUxJQykgIT0gMCkgewotICAgICAgICAgICAgZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuUE9TVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgVGV4dEF0dHJpYnV0ZS5QT1NUVVJFX09CTElRVUUpOworICAgICAgICAgICAgZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuUE9TVFVSRSwgVGV4dEF0dHJpYnV0ZS5QT1NUVVJFX09CTElRVUUpOwogICAgICAgICB9IGVsc2UgaWYgKGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLmdldChUZXh0QXR0cmlidXRlLlBPU1RVUkUpICE9IG51bGwpIHsKICAgICAgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnJlbW92ZShUZXh0QXR0cmlidXRlLlBPU1RVUkUpOwogICAgICAgICB9Ci0gICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlRSQU5TRk9STSwKLSAgICAgICAgICAgICAgICBuZXcgVHJhbnNmb3JtQXR0cmlidXRlKHRyYW5zKSk7CisgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlRSQU5TRk9STSwgbmV3IFRyYW5zZm9ybUF0dHJpYnV0ZSh0cmFucykpOwogCiAgICAgICAgIHJldHVybiBuZXcgRm9udChkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBGb250IHRoYXQgaXMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IEZvbnQgCi0gICAgICogbW9kaWZpZWQgc28gdGhhdCB0aGUgc2l6ZSBhbmQgc3R5bGUgYXJlIHRoZSBzcGVjaWZpZWQgCi0gICAgICogc2l6ZSBhbmQgc3R5bGUuCisgICAgICogUmV0dXJucyBhIG5ldyBGb250IHRoYXQgaXMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IEZvbnQgbW9kaWZpZWQgc28gdGhhdAorICAgICAqIHRoZSBzaXplIGFuZCBzdHlsZSBhcmUgdGhlIHNwZWNpZmllZCBzaXplIGFuZCBzdHlsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3R5bGUgdGhlIHN0eWxlIG9mIGZvbnQuCi0gICAgICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgZm9udC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3R5bGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHlsZSBvZiBmb250LgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiBmb250LgogICAgICAqIEByZXR1cm4gdGhlIEZvbnQgb2JqZWN0LgogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBGb250IGRlcml2ZUZvbnQoaW50IHN0eWxlLCBmbG9hdCBzaXplKSB7Ci0gICAgICAgIEhhc2h0YWJsZTxBdHRyaWJ1dGUsIE9iamVjdD4gZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMgPSAoSGFzaHRhYmxlPEF0dHJpYnV0ZSwgT2JqZWN0PikgZlJlcXVlc3RlZEF0dHJpYnV0ZXMKKyAgICAgICAgSGFzaHRhYmxlPEF0dHJpYnV0ZSwgT2JqZWN0PiBkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcyA9IChIYXNodGFibGU8QXR0cmlidXRlLCBPYmplY3Q+KWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzCiAgICAgICAgICAgICAgICAgLmNsb25lKCk7CiAKICAgICAgICAgaWYgKChzdHlsZSAmIEJPTEQpICE9IDApIHsKLSAgICAgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLldFSUdIVCwKLSAgICAgICAgICAgICAgICAgICAgVGV4dEF0dHJpYnV0ZS5XRUlHSFRfQk9MRCk7CisgICAgICAgICAgICBkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5XRUlHSFQsIFRleHRBdHRyaWJ1dGUuV0VJR0hUX0JPTEQpOwogICAgICAgICB9IGVsc2UgaWYgKGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLmdldChUZXh0QXR0cmlidXRlLldFSUdIVCkgIT0gbnVsbCkgewogICAgICAgICAgICAgZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMucmVtb3ZlKFRleHRBdHRyaWJ1dGUuV0VJR0hUKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICgoc3R5bGUgJiBJVEFMSUMpICE9IDApIHsKLSAgICAgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlBPU1RVUkUsCi0gICAgICAgICAgICAgICAgICAgIFRleHRBdHRyaWJ1dGUuUE9TVFVSRV9PQkxJUVVFKTsKKyAgICAgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlBPU1RVUkUsIFRleHRBdHRyaWJ1dGUuUE9TVFVSRV9PQkxJUVVFKTsKICAgICAgICAgfSBlbHNlIGlmIChkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcy5nZXQoVGV4dEF0dHJpYnV0ZS5QT1NUVVJFKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcy5yZW1vdmUoVGV4dEF0dHJpYnV0ZS5QT1NUVVJFKTsKICAgICAgICAgfQpAQCAtNzAzLDE1ICs3MzAsMTUgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgbmV3IEZvbnQgb2JqZWN0IHdpdGggYSBuZXcgc2V0IG9mIGZvbnQgYXR0cmlidXRlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyB0aGUgbWFwIG9mIGF0dHJpYnV0ZXMuCi0gICAgICogCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXAgb2YgYXR0cmlidXRlcy4KICAgICAgKiBAcmV0dXJuIHRoZSBGb250LgogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBGb250IGRlcml2ZUZvbnQoTWFwPD8gZXh0ZW5kcyBBdHRyaWJ1dGUsID8+IGF0dHJpYnV0ZXMpIHsKICAgICAgICAgQXR0cmlidXRlW10gYXZhbEF0dHJpYnV0ZXMgPSB0aGlzLmdldEF2YWlsYWJsZUF0dHJpYnV0ZXMoKTsKIAotICAgICAgICBIYXNodGFibGU8QXR0cmlidXRlLCBPYmplY3Q+IGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzID0gKEhhc2h0YWJsZTxBdHRyaWJ1dGUsIE9iamVjdD4pIGZSZXF1ZXN0ZWRBdHRyaWJ1dGVzCisgICAgICAgIEhhc2h0YWJsZTxBdHRyaWJ1dGUsIE9iamVjdD4gZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMgPSAoSGFzaHRhYmxlPEF0dHJpYnV0ZSwgT2JqZWN0PilmUmVxdWVzdGVkQXR0cmlidXRlcwogICAgICAgICAgICAgICAgIC5jbG9uZSgpOwogICAgICAgICBPYmplY3QgY3VyckF0dHJpYnV0ZTsKICAgICAgICAgZm9yIChBdHRyaWJ1dGUgZWxlbWVudCA6IGF2YWxBdHRyaWJ1dGVzKSB7CkBAIC03MjYsMTAgKzc1MywxMCBAQAogICAgIC8qKgogICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgT2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgRm9udC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIE9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBGb250Ci0gICAgICogd2l0aCB0aGUgc2FtZSBmYW1pbHksIHNpemUsIGFuZCBzdHlsZSBhcyB0aGlzIEZvbnQsIGZhbHNlIG90aGVyd2lzZS4gCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgT2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIEZvbnQgd2l0aCB0aGUKKyAgICAgKiAgICAgICAgIHNhbWUgZmFtaWx5LCBzaXplLCBhbmQgc3R5bGUgYXMgdGhpcyBGb250LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKQEAgLTczOSwxMSArNzY2LDEwIEBACiAKICAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZvbnQgZm9udCA9IChGb250KSBvYmo7CisgICAgICAgICAgICAgICAgRm9udCBmb250ID0gKEZvbnQpb2JqOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuICgodGhpcy5zdHlsZSA9PSBmb250LnN0eWxlKSAmJiAodGhpcy5zaXplID09IGZvbnQuc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMubmFtZS5lcXVhbHMoZm9udC5uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHRoaXMucG9pbnRTaXplID09IGZvbnQucG9pbnRTaXplKSAmJiAodGhpcworICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5uYW1lLmVxdWFscyhmb250Lm5hbWUpICYmICh0aGlzLnBvaW50U2l6ZSA9PSBmb250LnBvaW50U2l6ZSkgJiYgKHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUcmFuc2Zvcm0oKSkuZXF1YWxzKGZvbnQuZ2V0VHJhbnNmb3JtKCkpKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB9CkBAIC03NTksNyArNzg1LDcgQEAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgTWFwPFRleHRBdHRyaWJ1dGUsID8+IGdldEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHJldHVybiAoTWFwPFRleHRBdHRyaWJ1dGUsID8+KSBmUmVxdWVzdGVkQXR0cmlidXRlcy5jbG9uZSgpOworICAgICAgICByZXR1cm4gKE1hcDxUZXh0QXR0cmlidXRlLCA/PilmUmVxdWVzdGVkQXR0cmlidXRlcy5jbG9uZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzY4LDE4ICs3OTQsMTkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBrZXlzIGFycmF5IG9mIGFsbCBhdmFpbGFibGUgYXR0cmlidXRlcy4KICAgICAgKi8KICAgICBwdWJsaWMgQXR0cmlidXRlW10gZ2V0QXZhaWxhYmxlQXR0cmlidXRlcygpIHsKLSAgICAgICAgQXR0cmlidXRlW10gYXR0cnMgPSB7IFRleHRBdHRyaWJ1dGUuRkFNSUxZLCBUZXh0QXR0cmlidXRlLlBPU1RVUkUsCi0gICAgICAgICAgICAgICAgVGV4dEF0dHJpYnV0ZS5TSVpFLCBUZXh0QXR0cmlidXRlLlRSQU5TRk9STSwKLSAgICAgICAgICAgICAgICBUZXh0QXR0cmlidXRlLldFSUdIVCwgVGV4dEF0dHJpYnV0ZS5TVVBFUlNDUklQVCwKLSAgICAgICAgICAgICAgICBUZXh0QXR0cmlidXRlLldJRFRIIH07CisgICAgICAgIEF0dHJpYnV0ZVtdIGF0dHJzID0geworICAgICAgICAgICAgICAgIFRleHRBdHRyaWJ1dGUuRkFNSUxZLCBUZXh0QXR0cmlidXRlLlBPU1RVUkUsIFRleHRBdHRyaWJ1dGUuU0laRSwKKyAgICAgICAgICAgICAgICBUZXh0QXR0cmlidXRlLlRSQU5TRk9STSwgVGV4dEF0dHJpYnV0ZS5XRUlHSFQsIFRleHRBdHRyaWJ1dGUuU1VQRVJTQ1JJUFQsCisgICAgICAgICAgICAgICAgVGV4dEF0dHJpYnV0ZS5XSURUSAorICAgICAgICB9OwogICAgICAgICByZXR1cm4gYXR0cnM7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYmFzZWxpbmUgZm9yIHRoaXMgY2hhcmFjdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjIHRoZSBjaGFyYWN0ZXIuCi0gICAgICogCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIuCiAgICAgICogQHJldHVybiB0aGUgYmFzZWxpbmUgZm9yIHRoaXMgY2hhcmFjdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBieXRlIGdldEJhc2VsaW5lRm9yKGNoYXIgYykgewpAQCAtODAwLDE5ICs4MjcsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmYW1pbHkgbmFtZSBvZiB0aGlzIEZvbnQgYXNzb2NpYXRlZCB3aXRoIAotICAgICAqIHRoZSBzcGVjaWZpZWQgbG9jYWxlLgorICAgICAqIFJldHVybnMgdGhlIGZhbWlseSBuYW1lIG9mIHRoaXMgRm9udCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIGxvY2FsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgbG9jYWxlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZhbWlseSBuYW1lIG9mIHRoaXMgRm9udCBhc3NvY2lhdGVkIHdpdGggCi0gICAgICogdGhlIHNwZWNpZmllZCBsb2NhbGUuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbGUuCisgICAgICogQHJldHVybiB0aGUgZmFtaWx5IG5hbWUgb2YgdGhpcyBGb250IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBsb2NhbGUuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRGYW1pbHkoTG9jYWxlIGwpIHsKICAgICAgICAgaWYgKGwgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gYXd0LjAxPSd7MH0nIHBhcmFtZXRlciBpcyBudWxsCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAiYXd0LjAxIiwgIkxvY2FsZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAorICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjAxIiwgIkxvY2FsZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBnZXRGYW1pbHkoKTsKICAgICB9CkBAIC04MjAsMTIgKzg0NiwxMiBAQAogICAgIC8qKgogICAgICAqIEdldHMgYSBGb250IHdpdGggdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgc2V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBuZXcgRm9udC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcworICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZXMgdG8gYmUgYXNzaWduZWQgdG8gdGhlIG5ldyBGb250LgogICAgICAqIEByZXR1cm4gdGhlIEZvbnQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBGb250IGdldEZvbnQoTWFwPD8gZXh0ZW5kcyBBdHRyaWJ1dGUsID8+IGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgRm9udCBmbnQgPSAoRm9udCkgYXR0cmlidXRlcy5nZXQoVGV4dEF0dHJpYnV0ZS5GT05UKTsKKyAgICAgICAgRm9udCBmbnQgPSAoRm9udClhdHRyaWJ1dGVzLmdldChUZXh0QXR0cmlidXRlLkZPTlQpOwogICAgICAgICBpZiAoZm50ICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBmbnQ7CiAgICAgICAgIH0KQEAgLTgzMywxNCArODU5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIEZvbnQgb2JqZWN0IGZyb20gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIGxpc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLSAgICAgKiBvciByZXR1cm5zIHRoZSBzcGVjaWZpZWQgRm9udCBpZiB0aGVyZSBpcyBubyBzdWNoIHByb3BlcnR5LgorICAgICAqIEdldHMgYSBGb250IG9iamVjdCBmcm9tIHRoZSBzeXN0ZW0gcHJvcGVydGllcyBsaXN0IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG5hbWUgb3IgcmV0dXJucyB0aGUgc3BlY2lmaWVkIEZvbnQgaWYgdGhlcmUgaXMgbm8gc3VjaCBwcm9wZXJ0eS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3AgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBuYW1lLgotICAgICAqIEBwYXJhbSBmIHRoZSBGb250LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEZvbnQgb2JqZWN0IGZyb20gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIGxpc3QgIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi0gICAgICogb3IgdGhlIHNwZWNpZmllZCBGb250IGlmIHRoZXJlIGlzIG5vIHN1Y2ggcHJvcGVydHkuCisgICAgICogQHBhcmFtIHNwCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUuCisgICAgICogQHBhcmFtIGYKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250LgorICAgICAqIEByZXR1cm4gdGhlIEZvbnQgb2JqZWN0IGZyb20gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIGxpc3Qgd2l0aCB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBuYW1lIG9yIHRoZSBzcGVjaWZpZWQgRm9udCBpZiB0aGVyZSBpcyBubyBzdWNoCisgICAgICogICAgICAgICBwcm9wZXJ0eS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEZvbnQgZ2V0Rm9udChTdHJpbmcgc3AsIEZvbnQgZikgewogICAgICAgICBTdHJpbmcgcHIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoc3ApOwpAQCAtODUxLDEyICs4NzksMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgRm9udCBvYmplY3QgZnJvbSB0aGUgc3lzdGVtIHByb3BlcnRpZXMgbGlzdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKiBHZXRzIGEgRm9udCBvYmplY3QgZnJvbSB0aGUgc3lzdGVtIHByb3BlcnRpZXMgbGlzdCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBuYW1lLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcCB0aGUgc3lzdGVtIHByb3BlcnR5IG5hbWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgRm9udCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzaHVjaCBwcm9wZXJ0eQotICAgICAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiAKKyAgICAgKiBAcGFyYW0gc3AKKyAgICAgKiAgICAgICAgICAgIHRoZSBzeXN0ZW0gcHJvcGVydHkgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBGb250LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggcHJvcGVydHkgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBuYW1lLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgRm9udCBnZXRGb250KFN0cmluZyBzcCkgewogICAgICAgICByZXR1cm4gZ2V0Rm9udChzcCwgbnVsbCk7CkBAIC04NzcsOCArOTA2LDggQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBmb250IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbG9jYWxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSBsb2NhbGUuCi0gICAgICogCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbGUuCiAgICAgICogQHJldHVybiB0aGUgZm9udCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGxvY2FsZS4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEZvbnROYW1lKExvY2FsZSBsKSB7CkBAIC04ODgsMzggKzkxNyw0NSBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBMaW5lTWV0cmljcyBvYmplY3QgY3JlYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2hhcnMgdGhlIGNoYXJzIGFycmF5LgotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBlbmQgdGhlIGVuZCBvZmZzZXQuCi0gICAgICogQHBhcmFtIGZyYyB0aGUgRm9udFJlbmRlckNvbnRleHQuCi0gICAgICogCisgICAgICogQHBhcmFtIGNoYXJzCisgICAgICogICAgICAgICAgICB0aGUgY2hhcnMgYXJyYXkuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBlbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBmcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250UmVuZGVyQ29udGV4dC4KICAgICAgKiBAcmV0dXJuIHRoZSBMaW5lTWV0cmljcyBmb3IgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgogICAgICAqLwotICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhjaGFyW10gY2hhcnMsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgeworICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhjaGFyW10gY2hhcnMsIGludCBzdGFydCwgaW50IGVuZCwgRm9udFJlbmRlckNvbnRleHQgZnJjKSB7CiAgICAgICAgIGlmIChmcmMgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gYXd0LjAwPUZvbnRSZW5kZXJDb250ZXh0IGlzIG51bGwKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4wMCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgLy9Gb250TWV0cmljcyBmbSA9IEFuZHJvaWRHcmFwaGljczJELmdldEluc3RhbmNlKCkuZ2V0Rm9udE1ldHJpY3MoKTsKKyAgICAgICAgLy8gRm9udE1ldHJpY3MgZm0gPSBBbmRyb2lkR3JhcGhpY3MyRC5nZXRJbnN0YW5jZSgpLmdldEZvbnRNZXRyaWNzKCk7CiAgICAgICAgIEZvbnRNZXRyaWNzIGZtID0gbmV3IEZvbnRNZXRyaWNzSW1wbCh0aGlzKTsKLSAgICAgICAgZmxvYXRbXSBmbWV0ID0ge2ZtLmdldEFzY2VudCgpLCBmbS5nZXREZXNjZW50KCksIGZtLmdldExlYWRpbmcoKX07IAorICAgICAgICBmbG9hdFtdIGZtZXQgPSB7CisgICAgICAgICAgICAgICAgZm0uZ2V0QXNjZW50KCksIGZtLmdldERlc2NlbnQoKSwgZm0uZ2V0TGVhZGluZygpCisgICAgICAgIH07CiAgICAgICAgIHJldHVybiBuZXcgTGluZU1ldHJpY3NJbXBsKGNoYXJzLmxlbmd0aCwgZm1ldCwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIExpbmVNZXRyaWNzIG9iamVjdCBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpdGVyIHRoZSBDaGFyYWN0ZXJJdGVyYXRvci4KLSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mZnNldC4KLSAgICAgKiBAcGFyYW0gZW5kIHRoZSBlbmQgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBmcmMgdGhlIEZvbnRSZW5kZXJDb250ZXh0LgotICAgICAqIAorICAgICAqIEBwYXJhbSBpdGVyCisgICAgICogICAgICAgICAgICB0aGUgQ2hhcmFjdGVySXRlcmF0b3IuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBlbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBmcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250UmVuZGVyQ29udGV4dC4KICAgICAgKiBAcmV0dXJuIHRoZSBMaW5lTWV0cmljcyBmb3IgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgogICAgICAqLwotICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhDaGFyYWN0ZXJJdGVyYXRvciBpdGVyLCBpbnQgc3RhcnQsCi0gICAgICAgICAgICBpbnQgZW5kLCBGb250UmVuZGVyQ29udGV4dCBmcmMpIHsKKyAgICBwdWJsaWMgTGluZU1ldHJpY3MgZ2V0TGluZU1ldHJpY3MoQ2hhcmFjdGVySXRlcmF0b3IgaXRlciwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgRm9udFJlbmRlckNvbnRleHQgZnJjKSB7CiAKICAgICAgICAgaWYgKGZyYyA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBhd3QuMDA9Rm9udFJlbmRlckNvbnRleHQgaXMgbnVsbApAQCAtOTM1LDggKzk3MSw4IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhcltpdGVyQ291bnRdOwogICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChjaGFyIGMgPSBpdGVyLnNldEluZGV4KHN0YXJ0KTsgYyAhPSBDaGFyYWN0ZXJJdGVyYXRvci5ET05FCi0gICAgICAgICAgICAgICAgICAgICYmIChpIDwgaXRlckNvdW50KTsgYyA9IGl0ZXIubmV4dCgpKSB7CisgICAgICAgICAgICBmb3IgKGNoYXIgYyA9IGl0ZXIuc2V0SW5kZXgoc3RhcnQpOyBjICE9IENoYXJhY3Rlckl0ZXJhdG9yLkRPTkUgJiYgKGkgPCBpdGVyQ291bnQpOyBjID0gaXRlcgorICAgICAgICAgICAgICAgICAgICAubmV4dCgpKSB7CiAgICAgICAgICAgICAgICAgY2hhcnNbaV0gPSBjOwogICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgIH0KQEAgLTk0OCwxNiArOTg0LDE5IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIExpbmVNZXRyaWNzIG9iamVjdCBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHIgdGhlIFN0cmluZy4KLSAgICAgKiBAcGFyYW0gZnJjIHRoZSBGb250UmVuZGVyQ29udGV4dC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RyCisgICAgICogICAgICAgICAgICB0aGUgU3RyaW5nLgorICAgICAqIEBwYXJhbSBmcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250UmVuZGVyQ29udGV4dC4KICAgICAgKiBAcmV0dXJuIHRoZSBMaW5lTWV0cmljcyBmb3IgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgogICAgICAqLwogICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhTdHJpbmcgc3RyLCBGb250UmVuZGVyQ29udGV4dCBmcmMpIHsKLSAgICAgICAgLy9Gb250TWV0cmljcyBmbSA9IEFuZHJvaWRHcmFwaGljczJELmdldEluc3RhbmNlKCkuZ2V0Rm9udE1ldHJpY3MoKTsKKyAgICAgICAgLy8gRm9udE1ldHJpY3MgZm0gPSBBbmRyb2lkR3JhcGhpY3MyRC5nZXRJbnN0YW5jZSgpLmdldEZvbnRNZXRyaWNzKCk7CiAgICAgICAgIEZvbnRNZXRyaWNzIGZtID0gbmV3IEZvbnRNZXRyaWNzSW1wbCh0aGlzKTsKLSAgICAgICAgZmxvYXRbXSBmbWV0ID0ge2ZtLmdldEFzY2VudCgpLCBmbS5nZXREZXNjZW50KCksIGZtLmdldExlYWRpbmcoKX07Ci0gICAgICAgIC8vTG9nLmkoIkZPTlQgRk1FVCIsIGZtZXQudG9TdHJpbmcoKSk7CisgICAgICAgIGZsb2F0W10gZm1ldCA9IHsKKyAgICAgICAgICAgICAgICBmbS5nZXRBc2NlbnQoKSwgZm0uZ2V0RGVzY2VudCgpLCBmbS5nZXRMZWFkaW5nKCkKKyAgICAgICAgfTsKKyAgICAgICAgLy8gTG9nLmkoIkZPTlQgRk1FVCIsIGZtZXQudG9TdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiBuZXcgTGluZU1ldHJpY3NJbXBsKHN0ci5sZW5ndGgoKSwgZm1ldCwgbnVsbCk7CiAKICAgICB9CkBAIC05NjUsNDUgKzEwMDQsNDggQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgTGluZU1ldHJpY3Mgb2JqZWN0IGNyZWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0ciB0aGUgU3RyaW5nLgotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBlbmQgdGhlIGVuZCBvZmZzZXQuCi0gICAgICogQHBhcmFtIGZyYyB0aGUgRm9udFJlbmRlckNvbnRleHQuCi0gICAgICogCisgICAgICogQHBhcmFtIHN0cgorICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZy4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBvZmZzZXQuCisgICAgICogQHBhcmFtIGVuZAorICAgICAqICAgICAgICAgICAgdGhlIGVuZCBvZmZzZXQuCisgICAgICogQHBhcmFtIGZyYworICAgICAqICAgICAgICAgICAgdGhlIEZvbnRSZW5kZXJDb250ZXh0LgogICAgICAqIEByZXR1cm4gdGhlIExpbmVNZXRyaWNzIGZvciB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCiAgICAgICovCi0gICAgcHVibGljIExpbmVNZXRyaWNzIGdldExpbmVNZXRyaWNzKFN0cmluZyBzdHIsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgeworICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhTdHJpbmcgc3RyLCBpbnQgc3RhcnQsIGludCBlbmQsIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgewogICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lTWV0cmljcyhzdHIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLCBmcmMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxvZ2ljYWwgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGluIAotICAgICAqIHRoZSBzcGVjaWZpZWQgRm9udFJlbmRlckNvbnRleHQuIFRoZSBsb2dpY2FsIGJvdW5kcyBjb250YWlucyAKLSAgICAgKiB0aGUgb3JpZ2luLCBhc2NlbnQsIGFkdmFuY2UsIGFuZCBoZWlnaHQuCisgICAgICogR2V0cyB0aGUgbG9naWNhbCBib3VuZHMgb2YgdGhlIHNwZWNpZmllZCBTdHJpbmcgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIEZvbnRSZW5kZXJDb250ZXh0LiBUaGUgbG9naWNhbCBib3VuZHMgY29udGFpbnMgdGhlIG9yaWdpbiwgYXNjZW50LAorICAgICAqIGFkdmFuY2UsIGFuZCBoZWlnaHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNpIHRoZSBzcGVjaWZpZWQgQ2hhcmFjdGVySXRlcmF0b3IuCi0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZmZzZXQuCi0gICAgICogQHBhcmFtIGVuZCB0aGUgZW5kIG9mZnNldC4KLSAgICAgKiBAcGFyYW0gZnJjIHRoZSBGb250UmVuZGVyQ29udGV4dC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2kKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgQ2hhcmFjdGVySXRlcmF0b3IuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBlbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBmcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250UmVuZGVyQ29udGV4dC4KICAgICAgKiBAcmV0dXJuIGEgUmVjdGFuZ2xlMkQgb2JqZWN0LgogICAgICAqLwotICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRTdHJpbmdCb3VuZHMoQ2hhcmFjdGVySXRlcmF0b3IgY2ksIGludCBzdGFydCwKLSAgICAgICAgICAgIGludCBlbmQsIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgeworICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRTdHJpbmdCb3VuZHMoQ2hhcmFjdGVySXRlcmF0b3IgY2ksIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgewogICAgICAgICBpbnQgZmlyc3QgPSBjaS5nZXRCZWdpbkluZGV4KCk7CiAgICAgICAgIGludCBmaW5pc2ggPSBjaS5nZXRFbmRJbmRleCgpOwogICAgICAgICBjaGFyW10gY2hhcnM7CiAKICAgICAgICAgaWYgKHN0YXJ0IDwgZmlyc3QpIHsKICAgICAgICAgICAgIC8vIGF3dC45NT1Xcm9uZyBzdGFydCBpbmRleDogezB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICJhd3QuOTUiLCBzdGFydCkpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC45NSIsIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICBpZiAoZW5kID4gZmluaXNoKSB7CiAgICAgICAgICAgICAvLyBhd3QuOTY9V3JvbmcgZmluaXNoIGluZGV4OiB7MH0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgImF3dC45NiIsIGVuZCkpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC45NiIsIGVuZCkpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgaWYgKHN0YXJ0ID4gZW5kKSB7CiAgICAgICAgICAgICAvLyBhd3QuOTc9V3JvbmcgcmFuZ2UgbGVuZ3RoOiB7MH0KQEAgLTEwMjgsMTMgKzEwNzAsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb2dpY2FsIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIFN0cmluZyBpbiAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIEZvbnRSZW5kZXJDb250ZXh0LiBUaGUgbG9naWNhbCBib3VuZHMgY29udGFpbnMgCi0gICAgICogdGhlIG9yaWdpbiwgYXNjZW50LCBhZHZhbmNlLCBhbmQgaGVpZ2h0LgorICAgICAqIEdldHMgdGhlIGxvZ2ljYWwgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBGb250UmVuZGVyQ29udGV4dC4gVGhlIGxvZ2ljYWwgYm91bmRzIGNvbnRhaW5zIHRoZSBvcmlnaW4sIGFzY2VudCwKKyAgICAgKiBhZHZhbmNlLCBhbmQgaGVpZ2h0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHIgdGhlIHNwZWNpZmllZCBTdHJpbmcuCi0gICAgICogQHBhcmFtIGZyYyB0aGUgRm9udFJlbmRlckNvbnRleHQuCi0gICAgICogCisgICAgICogQHBhcmFtIHN0cgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBTdHJpbmcuCisgICAgICogQHBhcmFtIGZyYworICAgICAqICAgICAgICAgICAgdGhlIEZvbnRSZW5kZXJDb250ZXh0LgogICAgICAqIEByZXR1cm4gYSBSZWN0YW5nbGUyRCBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIFJlY3RhbmdsZTJEIGdldFN0cmluZ0JvdW5kcyhTdHJpbmcgc3RyLCBGb250UmVuZGVyQ29udGV4dCBmcmMpIHsKQEAgLTEwNDQsNDYgKzEwODcsNDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb2dpY2FsIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIFN0cmluZyBpbiAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIEZvbnRSZW5kZXJDb250ZXh0LiBUaGUgbG9naWNhbCBib3VuZHMgY29udGFpbnMgCi0gICAgICogdGhlIG9yaWdpbiwgYXNjZW50LCBhZHZhbmNlLCBhbmQgaGVpZ2h0LgorICAgICAqIEdldHMgdGhlIGxvZ2ljYWwgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBGb250UmVuZGVyQ29udGV4dC4gVGhlIGxvZ2ljYWwgYm91bmRzIGNvbnRhaW5zIHRoZSBvcmlnaW4sIGFzY2VudCwKKyAgICAgKiBhZHZhbmNlLCBhbmQgaGVpZ2h0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHIgdGhlIHNwZWNpZmllZCBTdHJpbmcuCi0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZmZzZXQuCi0gICAgICogQHBhcmFtIGVuZCB0aGUgZW5kIG9mZnNldC4KLSAgICAgKiBAcGFyYW0gZnJjIHRoZSBGb250UmVuZGVyQ29udGV4dC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RyCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFN0cmluZy4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBvZmZzZXQuCisgICAgICogQHBhcmFtIGVuZAorICAgICAqICAgICAgICAgICAgdGhlIGVuZCBvZmZzZXQuCisgICAgICogQHBhcmFtIGZyYworICAgICAqICAgICAgICAgICAgdGhlIEZvbnRSZW5kZXJDb250ZXh0LgogICAgICAqIEByZXR1cm4gYSBSZWN0YW5nbGUyRCBvYmplY3QuCiAgICAgICovCi0gICAgcHVibGljIFJlY3RhbmdsZTJEIGdldFN0cmluZ0JvdW5kcyhTdHJpbmcgc3RyLCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICBGb250UmVuZGVyQ29udGV4dCBmcmMpIHsKKyAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0U3RyaW5nQm91bmRzKFN0cmluZyBzdHIsIGludCBzdGFydCwgaW50IGVuZCwgRm9udFJlbmRlckNvbnRleHQgZnJjKSB7CiAKICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQm91bmRzKChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKSwgZnJjKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb2dpY2FsIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIFN0cmluZyBpbiAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIEZvbnRSZW5kZXJDb250ZXh0LiBUaGUgbG9naWNhbCBib3VuZHMgY29udGFpbnMgCi0gICAgICogdGhlIG9yaWdpbiwgYXNjZW50LCBhZHZhbmNlLCBhbmQgaGVpZ2h0LgorICAgICAqIEdldHMgdGhlIGxvZ2ljYWwgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBGb250UmVuZGVyQ29udGV4dC4gVGhlIGxvZ2ljYWwgYm91bmRzIGNvbnRhaW5zIHRoZSBvcmlnaW4sIGFzY2VudCwKKyAgICAgKiBhZHZhbmNlLCBhbmQgaGVpZ2h0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjaGFycyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBhcnJheS4KLSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mZnNldC4KLSAgICAgKiBAcGFyYW0gZW5kIHRoZSBlbmQgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBmcmMgdGhlIEZvbnRSZW5kZXJDb250ZXh0LgotICAgICAqIAorICAgICAqIEBwYXJhbSBjaGFycworICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXJyYXkuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBlbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBmcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250UmVuZGVyQ29udGV4dC4KICAgICAgKiBAcmV0dXJuIGEgUmVjdGFuZ2xlMkQgb2JqZWN0LgogICAgICAqLwotICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRTdHJpbmdCb3VuZHMoY2hhcltdIGNoYXJzLCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICBGb250UmVuZGVyQ29udGV4dCBmcmMpIHsKKyAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0U3RyaW5nQm91bmRzKGNoYXJbXSBjaGFycywgaW50IHN0YXJ0LCBpbnQgZW5kLCBGb250UmVuZGVyQ29udGV4dCBmcmMpIHsKICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewogICAgICAgICAgICAgLy8gYXd0Ljk1PVdyb25nIHN0YXJ0IGluZGV4OiB7MH0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgImF3dC45NSIsIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0Ljk1Iiwgc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIGlmIChlbmQgPiBjaGFycy5sZW5ndGgpIHsKICAgICAgICAgICAgIC8vIGF3dC45Nj1Xcm9uZyBmaW5pc2ggaW5kZXg6IHswfQotICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAiYXd0Ljk2IiwgZW5kKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0Ljk2IiwgZW5kKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICBpZiAoc3RhcnQgPiBlbmQpIHsKICAgICAgICAgICAgIC8vIGF3dC45Nz1Xcm9uZyByYW5nZSBsZW5ndGg6IHswfQpAQCAtMTA5NSw3ICsxMTQwLDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4wMCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgRm9udFBlZXJJbXBsIHBlZXIgPSAoRm9udFBlZXJJbXBsKSB0aGlzLmdldFBlZXIoKTsKKyAgICAgICAgRm9udFBlZXJJbXBsIHBlZXIgPSAoRm9udFBlZXJJbXBsKXRoaXMuZ2V0UGVlcigpOwogCiAgICAgICAgIGZpbmFsIGludCBUUkFOU0ZPUk1fTUFTSyA9IEFmZmluZVRyYW5zZm9ybS5UWVBFX0dFTkVSQUxfUk9UQVRJT04KICAgICAgICAgICAgICAgICB8IEFmZmluZVRyYW5zZm9ybS5UWVBFX0dFTkVSQUxfVFJBTlNGT1JNOwpAQCAtMTExMCwxMyArMTE1NSwxMyBAQAogICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICAgICAgICAgICB3aWR0aCArPSBwZWVyLmNoYXJXaWR0aChjaGFyc1tpXSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0xpbmVNZXRyaWNzIG5sbSA9IHBlZXIuZ2V0TGluZU1ldHJpY3MoKTsKLSAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gTGluZU1ldHJpY3MgbmxtID0gcGVlci5nZXRMaW5lTWV0cmljcygpOworCiAgICAgICAgICAgICBMaW5lTWV0cmljcyBubG0gPSBnZXRMaW5lTWV0cmljcyhjaGFycywgc3RhcnQsIGVuZCwgZnJjKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBib3VuZHMgPSB0cmFuc2Zvcm0uY3JlYXRlVHJhbnNmb3JtZWRTaGFwZSgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3RhbmdsZTJELkZsb2F0KDAsIC1ubG0uZ2V0QXNjZW50KCksIHdpZHRoLCBubG0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SGVpZ2h0KCkpKS5nZXRCb3VuZHMyRCgpOworICAgICAgICAgICAgICAgICAgICBuZXcgUmVjdGFuZ2xlMkQuRmxvYXQoMCwgLW5sbS5nZXRBc2NlbnQoKSwgd2lkdGgsIG5sbS5nZXRIZWlnaHQoKSkpCisgICAgICAgICAgICAgICAgICAgIC5nZXRCb3VuZHMyRCgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OwogICAgICAgICAgICAgY2hhcltdIHN1YkNoYXJzID0gbmV3IGNoYXJbbGVuXTsKQEAgLTExMjcsMTEgKzExNzIsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjaGFyYWN0ZXIncyBtYXhpbXVtIGJvdW5kcyBhcyBkZWZpbmVkIGluIAotICAgICAqIHRoZSBzcGVjaWZpZWQgRm9udFJlbmRlckNvbnRleHQuCisgICAgICogR2V0cyB0aGUgY2hhcmFjdGVyJ3MgbWF4aW11bSBib3VuZHMgYXMgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogRm9udFJlbmRlckNvbnRleHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZyYyB0aGUgRm9udFJlbmRlckNvbnRleHQuCi0gICAgICogCisgICAgICogQHBhcmFtIGZyYworICAgICAqICAgICAgICAgICAgdGhlIEZvbnRSZW5kZXJDb250ZXh0LgogICAgICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlcidzIG1heGltdW0gYm91bmRzLgogICAgICAqLwogICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRNYXhDaGFyQm91bmRzKEZvbnRSZW5kZXJDb250ZXh0IGZyYykgewpAQCAtMTE0MCw3ICsxMTg1LDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4wMCIpKTsgLy8kTk9OLU5MUy0xJCAKICAgICAgICAgfQogCi0gICAgICAgIEZvbnRQZWVySW1wbCBwZWVyID0gKEZvbnRQZWVySW1wbCkgdGhpcy5nZXRQZWVyKCk7CisgICAgICAgIEZvbnRQZWVySW1wbCBwZWVyID0gKEZvbnRQZWVySW1wbCl0aGlzLmdldFBlZXIoKTsKIAogICAgICAgICBSZWN0YW5nbGUyRCBib3VuZHMgPSBwZWVyLmdldE1heENoYXJCb3VuZHMoZnJjKTsKICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSA9IGdldFRyYW5zZm9ybSgpOwpAQCAtMTE1NSw0MiArMTIwMCw0MCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgR2x5cGhWZWN0b3Igb2JqZWN0IHBlcmZvcm1pbmcgZnVsbCBsYXlvdXQgb2YKLSAgICAgKiB0aGUgdGV4dC4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IEdseXBoVmVjdG9yIG9iamVjdCBwZXJmb3JtaW5nIGZ1bGwgbGF5b3V0IG9mIHRoZSB0ZXh0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBmcmMgdGhlIEZvbnRSZW5kZXJDb250ZXh0LgotICAgICAqIEBwYXJhbSBjaGFycyB0aGUgY2hhcmFjdGVyIGFycmF5IHRvIGJlIGxheW91dC4KLSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgdGV4dCB0byB1c2UgZm9yIAotICAgICAqIHRoZSBHbHlwaFZlY3Rvci4KLSAgICAgKiBAcGFyYW0gY291bnQgdGhlIGNvdW50IG9mIGNoYXJhY3RlcnMgdG8gdXNlIGZvciAKLSAgICAgKiB0aGUgR2x5cGhWZWN0b3IuCi0gICAgICogQHBhcmFtIGZsYWdzIHRoZSBmbGFnIGluZGljYXRpbmcgdGV4dCBkaXJlY3Rpb246IAotICAgICAqIExBWU9VVF9SSUdIVF9UT19MRUZULCBMQVlPVVRfTEVGVF9UT19SSUdIVC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJjCisgICAgICogICAgICAgICAgICB0aGUgRm9udFJlbmRlckNvbnRleHQuCisgICAgICogQHBhcmFtIGNoYXJzCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGFycmF5IHRvIGJlIGxheW91dC4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIHRleHQgdG8gdXNlIGZvciB0aGUgR2x5cGhWZWN0b3IuCisgICAgICogQHBhcmFtIGNvdW50CisgICAgICogICAgICAgICAgICB0aGUgY291bnQgb2YgY2hhcmFjdGVycyB0byB1c2UgZm9yIHRoZSBHbHlwaFZlY3Rvci4KKyAgICAgKiBAcGFyYW0gZmxhZ3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbGFnIGluZGljYXRpbmcgdGV4dCBkaXJlY3Rpb246IExBWU9VVF9SSUdIVF9UT19MRUZULAorICAgICAqICAgICAgICAgICAgTEFZT1VUX0xFRlRfVE9fUklHSFQuCiAgICAgICogQHJldHVybiB0aGUgR2x5cGhWZWN0b3IuCiAgICAgICovCi0gICAgcHVibGljIEdseXBoVmVjdG9yIGxheW91dEdseXBoVmVjdG9yKEZvbnRSZW5kZXJDb250ZXh0IGZyYywgY2hhcltdIGNoYXJzLAotICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgY291bnQsIGludCBmbGFncykgeworICAgIHB1YmxpYyBHbHlwaFZlY3RvciBsYXlvdXRHbHlwaFZlY3RvcihGb250UmVuZGVyQ29udGV4dCBmcmMsIGNoYXJbXSBjaGFycywgaW50IHN0YXJ0LCBpbnQgY291bnQsCisgICAgICAgICAgICBpbnQgZmxhZ3MpIHsKICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IG1ldGhvZCBmb3IgYmlkaXJlY3Rpb25hbCB0ZXh0LgogICAgICAgICAvLyBBdCB0aGUgbW9tZW50IG9ubHkgTFRSIGFuZCBSVEwgdGV4dHMgc3VwcG9ydGVkLgogICAgICAgICBpZiAoc3RhcnQgPCAwKSB7CiAgICAgICAgICAgICAvLyBhd3QuOTU9V3Jvbmcgc3RhcnQgaW5kZXg6IHswfQotICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICJhd3QuOTUiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0Ljk1IiwgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICAgICBzdGFydCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGNvdW50IDwgMCkgewogICAgICAgICAgICAgLy8gYXd0Ljk4PVdyb25nIGNvdW50IHZhbHVlLCBjYW4gbm90IGJlIG5lZ2F0aXZlOiB7MH0KLSAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAiYXd0Ljk4IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC45OCIsIC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICAgICAgY291bnQpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzdGFydCArIGNvdW50ID4gY2hhcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAvLyBhd3QuOTk9V3JvbmcgW3N0YXJ0ICsgY291bnRdIGlzIG91dCBvZiByYW5nZTogezB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgImF3dC45OSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuOTkiLCAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICAgICAgIChzdGFydCArIGNvdW50KSkpOwogICAgICAgICB9CiAKQEAgLTEyMzQsNyArMTI3Nyw3IEBACiAgICAgICogQHJldHVybiB0aGUgcG9zdHNjcmlwdCBuYW1lIG9mIHRoaXMgRm9udC4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFBTTmFtZSgpIHsKLSAgICAgICAgRm9udFBlZXJJbXBsIHBlZXIgPSAoRm9udFBlZXJJbXBsKSB0aGlzLmdldFBlZXIoKTsKKyAgICAgICAgRm9udFBlZXJJbXBsIHBlZXIgPSAoRm9udFBlZXJJbXBsKXRoaXMuZ2V0UGVlcigpOwogICAgICAgICByZXR1cm4gcGVlci5nZXRQU05hbWUoKTsKICAgICB9CiAKQEAgLTEyNTEsMzkgKzEyOTQsMzcgQEAKICAgICAgKiBHZXRzIHRoZSBwZWVyIG9mIHRoaXMgRm9udC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBwZWVyIG9mIHRoaXMgRm9udC4KLSAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCBGb250IHJlbmRlcmluZyBpcyBwbGF0Zm9ybSBpbmRlcGVuZGVudCBub3cuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgamF2YS5hd3QucGVlci5Gb250UGVlciBnZXRQZWVyKCkgewogICAgICAgICBpZiAoZm9udFBlZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgZm9udFBlZXIgPSAoRm9udFBlZXJJbXBsKSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEdyYXBoaWNzRmFjdG9yeSgpLmdldEZvbnRQZWVyKHRoaXMpOworICAgICAgICAgICAgZm9udFBlZXIgPSAoRm9udFBlZXJJbXBsKVRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKS5nZXRHcmFwaGljc0ZhY3RvcnkoKS5nZXRGb250UGVlcigKKyAgICAgICAgICAgICAgICAgICAgdGhpcyk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZvbnRQZWVyOwogCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHJhbnNmb3JtIGFjdGluZyBvbiB0aGlzIEZvbnQgKGZyb20gdGhlIEZvbnQncyAKLSAgICAgKiBhdHRyaWJ1dGVzKS4KKyAgICAgKiBHZXRzIHRoZSB0cmFuc2Zvcm0gYWN0aW5nIG9uIHRoaXMgRm9udCAoZnJvbSB0aGUgRm9udCdzIGF0dHJpYnV0ZXMpLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWF0aW9uIG9mIHRoaXMgRm9udC4gCisgICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtYXRpb24gb2YgdGhpcyBGb250LgogICAgICAqLwogICAgIHB1YmxpYyBBZmZpbmVUcmFuc2Zvcm0gZ2V0VHJhbnNmb3JtKCkgewogICAgICAgICBPYmplY3QgdHJhbnNmb3JtID0gZlJlcXVlc3RlZEF0dHJpYnV0ZXMuZ2V0KFRleHRBdHRyaWJ1dGUuVFJBTlNGT1JNKTsKIAogICAgICAgICBpZiAodHJhbnNmb3JtICE9IG51bGwpIHsKICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm0gaW5zdGFuY2VvZiBUcmFuc2Zvcm1BdHRyaWJ1dGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChUcmFuc2Zvcm1BdHRyaWJ1dGUpIHRyYW5zZm9ybSkuZ2V0VHJhbnNmb3JtKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoVHJhbnNmb3JtQXR0cmlidXRlKXRyYW5zZm9ybSkuZ2V0VHJhbnNmb3JtKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodHJhbnNmb3JtIGluc3RhbmNlb2YgQWZmaW5lVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBZmZpbmVUcmFuc2Zvcm0oKEFmZmluZVRyYW5zZm9ybSkgdHJhbnNmb3JtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFmZmluZVRyYW5zZm9ybSgoQWZmaW5lVHJhbnNmb3JtKXRyYW5zZm9ybSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBuZXcgQWZmaW5lVHJhbnNmb3JtKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChBZmZpbmVUcmFuc2Zvcm0pIHRyYW5zZm9ybTsKKyAgICAgICAgcmV0dXJuIChBZmZpbmVUcmFuc2Zvcm0pdHJhbnNmb3JtOwogCiAgICAgfQogCkBAIC0xMzI0LDEzICsxMzY1LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgRm9udCBoYXMgdW5pZm9ybSBsaW5lIG1ldHJpY3MuIAorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIEZvbnQgaGFzIHVuaWZvcm0gbGluZSBtZXRyaWNzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIEZvbnQgaGFzIHVuaWZvcm0gbGluZSBtZXRyaWNzLCAKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgRm9udCBoYXMgdW5pZm9ybSBsaW5lIG1ldHJpY3MsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNVbmlmb3JtTGluZU1ldHJpY3MoKSB7Ci0gICAgICAgIEZvbnRQZWVySW1wbCBwZWVyID0gKEZvbnRQZWVySW1wbCkgdGhpcy5nZXRQZWVyKCk7CisgICAgICAgIEZvbnRQZWVySW1wbCBwZWVyID0gKEZvbnRQZWVySW1wbCl0aGlzLmdldFBlZXIoKTsKICAgICAgICAgcmV0dXJuIHBlZXIuaGFzVW5pZm9ybUxpbmVNZXRyaWNzKCk7CiAgICAgfQogCkBAIC0xMzM4LDcgKzEzNzgsNiBAQAogICAgICAqIFJldHVybnMgaGFzaCBjb2RlIG9mIHRoaXMgRm9udCBvYmplY3QuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIG9mIHRoaXMgRm9udCBvYmplY3QuCi0KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewpAQCAtMTM3NiwyMSArMTQxNSwyMSBAQAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TnVtR2x5cGhzKCkgewogICAgICAgICBpZiAobnVtR2x5cGhzID09IC0xKSB7Ci0gICAgICAgICAgICBGb250UGVlckltcGwgcGVlciA9IChGb250UGVlckltcGwpIHRoaXMuZ2V0UGVlcigpOworICAgICAgICAgICAgRm9udFBlZXJJbXBsIHBlZXIgPSAoRm9udFBlZXJJbXBsKXRoaXMuZ2V0UGVlcigpOwogICAgICAgICAgICAgdGhpcy5udW1HbHlwaHMgPSBwZWVyLmdldE51bUdseXBocygpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0aGlzLm51bUdseXBoczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBnbHlwaENvZGUgd2hpY2ggaXMgdXNlZCBhcyBkZWZhdWx0IGdseXBoIHdoZW4gdGhpcyBGb250Ci0gICAgICogZG9lcyBub3QgaGF2ZSBhIGdseXBoIGZvciBhIHNwZWNpZmllZCB1bmljb2RlLgorICAgICAqIEdldHMgdGhlIGdseXBoQ29kZSB3aGljaCBpcyB1c2VkIGFzIGRlZmF1bHQgZ2x5cGggd2hlbiB0aGlzIEZvbnQgZG9lcyBub3QKKyAgICAgKiBoYXZlIGEgZ2x5cGggZm9yIGEgc3BlY2lmaWVkIFVuaWNvZGUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgbWlzc2luZyBnbHlwaCBjb2RlLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWlzc2luZ0dseXBoQ29kZSgpIHsKICAgICAgICAgaWYgKG1pc3NpbmdHbHlwaENvZGUgPT0gLTEpIHsKLSAgICAgICAgICAgIEZvbnRQZWVySW1wbCBwZWVyID0gKEZvbnRQZWVySW1wbCkgdGhpcy5nZXRQZWVyKCk7CisgICAgICAgICAgICBGb250UGVlckltcGwgcGVlciA9IChGb250UGVlckltcGwpdGhpcy5nZXRQZWVyKCk7CiAgICAgICAgICAgICB0aGlzLm1pc3NpbmdHbHlwaENvZGUgPSBwZWVyLmdldE1pc3NpbmdHbHlwaENvZGUoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdGhpcy5taXNzaW5nR2x5cGhDb2RlOwpAQCAtMTQwNywyOSArMTQ0NiwzMCBAQAogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgaXRhbGljIGFuZ2xlIG9mIHRoaXMgRm9udC4KLSAgICAgICogCisgICAgICogCiAgICAgICogQHJldHVybiB0aGUgaXRhbGljIGFuZ2xlIG9mIHRoaXMgRm9udC4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0SXRhbGljQW5nbGUoKSB7Ci0gICAgICAgIEZvbnRQZWVySW1wbCBwZWVyID0gKEZvbnRQZWVySW1wbCkgdGhpcy5nZXRQZWVyKCk7CisgICAgICAgIEZvbnRQZWVySW1wbCBwZWVyID0gKEZvbnRQZWVySW1wbCl0aGlzLmdldFBlZXIoKTsKICAgICAgICAgcmV0dXJuIHBlZXIuZ2V0SXRhbGljQW5nbGUoKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIHRoZSBmb250IHdpdGggdGhlIHNwZWNpZmllZCBmb250IGZvcm1hdCBhbmQgZm9udCBmaWxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBmb250Rm9ybWF0IHRoZSBmb250IGZvcm1hdC4KLSAgICAgKiBAcGFyYW0gZm9udEZpbGUgdGhlIGZpbGUgb2JqZWN0IHJlcHJlc2VudGVkIHRoZSBpbnB1dCBkYXRhIAotICAgICAqIGZvciB0aGUgZm9udC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZm9udEZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIGZvbnQgZm9ybWF0LgorICAgICAqIEBwYXJhbSBmb250RmlsZQorICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgb2JqZWN0IHJlcHJlc2VudGVkIHRoZSBpbnB1dCBkYXRhIGZvciB0aGUgZm9udC4KICAgICAgKiBAcmV0dXJuIHRoZSBGb250LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgRm9udEZvcm1hdEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgZm9udEZpbGUgZG9lcyBub3QgY29udGFpbiAKLSAgICAgKiB0aGUgcmVxdWlyZWQgZm9udCB0YWJsZXMgZm9yIHRoZSBzcGVjaWZpZWQgZm9ybWF0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gc2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgRm9udEZvcm1hdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlzIHRocm93biBpZiBmb250RmlsZSBkb2VzIG5vdCBjb250YWluIHRoZSByZXF1aXJlZCBmb250CisgICAgICogICAgICAgICAgICAgdGFibGVzIGZvciB0aGUgc3BlY2lmaWVkIGZvcm1hdC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgc2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRm9udCBjcmVhdGVGb250KGludCBmb250Rm9ybWF0LCBGaWxlIGZvbnRGaWxlKQotICAgICAgICAgICAgdGhyb3dzIEZvbnRGb3JtYXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgc3RhdGljIEZvbnQgY3JlYXRlRm9udChpbnQgZm9udEZvcm1hdCwgRmlsZSBmb250RmlsZSkgdGhyb3dzIEZvbnRGb3JtYXRFeGNlcHRpb24sCisgICAgICAgICAgICBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vID8/P0FXVCBub3Qgc3VwcG9ydGVkCiAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmb250RmlsZSk7CiAgICAgICAgIHRyeSB7CkBAIC0xNDQyLDE1ICsxNDgyLDE2IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgZm9udCB3aXRoIHRoZSBzcGVjaWZpZWQgZm9udCBmb3JtYXQgYW5kIGlucHV0IHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9udEZvcm1hdCB0aGUgZm9udCBmb3JtYXQuCi0gICAgICogQHBhcmFtIGZvbnRTdHJlYW0gdGhlIGlucHV0IHN0cmVhbSByZXByZXNlbnRlZCBpbnB1dCBkYXRhIGZvciAKLSAgICAgKiB0aGUgZm9udC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZm9udEZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIGZvbnQgZm9ybWF0LgorICAgICAqIEBwYXJhbSBmb250U3RyZWFtCisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgc3RyZWFtIHJlcHJlc2VudGVkIGlucHV0IGRhdGEgZm9yIHRoZSBmb250LgogICAgICAqIEByZXR1cm4gdGhlIEZvbnQuCi0gICAgICogCi0gICAgICogQHRocm93cyBGb250Rm9ybWF0RXhjZXB0aW9uIGlzIHRocm93biBpZiBmb250RmlsZSBkb2VzIG5vdCBjb250YWluIAotICAgICAqIHRoZSByZXF1aXJlZCBmb250IHRhYmxlcyBmb3IgdGhlIHNwZWNpZmllZCBmb3JtYXQuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBzaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBGb250Rm9ybWF0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaXMgdGhyb3duIGlmIGZvbnRGaWxlIGRvZXMgbm90IGNvbnRhaW4gdGhlIHJlcXVpcmVkIGZvbnQKKyAgICAgKiAgICAgICAgICAgICB0YWJsZXMgZm9yIHRoZSBzcGVjaWZpZWQgZm9ybWF0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBzaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBGb250IGNyZWF0ZUZvbnQoaW50IGZvbnRGb3JtYXQsIElucHV0U3RyZWFtIGZvbnRTdHJlYW0pCiAgICAgICAgICAgICB0aHJvd3MgRm9udEZvcm1hdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewpAQCAtMTQ2NiwxNSArMTUwNywxNSBAQAogICAgICAgICBpZiAoZm9udEZvcm1hdCAhPSBUUlVFVFlQRV9GT05UKSB7IC8vIGF3dC45QT1VbnN1cHBvcnRlZCBmb250IGZvcm1hdAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC45QSIpKTsgLy8kTk9OLU5MUy0xJCAKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvKiBHZXQgZm9udCBmaWxlIGluIHN5c3RlbS1zcGVjaWZpYyBkaXJlY3RvcnkgKi8KIAotICAgICAgICBGaWxlIGZvbnRGaWxlID0gVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldEdyYXBoaWNzRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgLmdldEZvbnRNYW5hZ2VyKCkuZ2V0VGVtcEZvbnRGaWxlKCk7CisgICAgICAgIEZpbGUgZm9udEZpbGUgPSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0R3JhcGhpY3NGYWN0b3J5KCkuZ2V0Rm9udE1hbmFnZXIoKQorICAgICAgICAgICAgICAgIC5nZXRUZW1wRm9udEZpbGUoKTsKIAotICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbW9kaWZpZWQKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1tb2RpZmllZAogICAgICAgICBidWZmU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZm9udFN0cmVhbSwgODE5Mik7Ci0gICAgICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtbW9kaWZpZWQKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtbW9kaWZpZWQKICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmT3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZm9udEZpbGUpOwogCiAgICAgICAgIGJSZWFkID0gYnVmZlN0cmVhbS5yZWFkKGJ1ZiwgMCwgc2l6ZSk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvRm9udEZvcm1hdEV4Y2VwdGlvbi5qYXZhIGIvYXd0L2phdmEvYXd0L0ZvbnRGb3JtYXRFeGNlcHRpb24uamF2YQppbmRleCBjMDE3ZmQyLi44MDY3MTFhIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvRm9udEZvcm1hdEV4Y2VwdGlvbi5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9Gb250Rm9ybWF0RXhjZXB0aW9uLmphdmEKQEAgLTE4LDIxICsxOCwyNyBAQAogICogQGF1dGhvciBJbHlhIFMuIE9rb21pbgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIC8qKgotICogVGhlIEZvbnRGb3JtYXRFeGNlcHRpb24gY2xhc3MgaXMgdXNlZCB0byBwcm92aWRlIG5vdGlmaWNhdGlvbgotICogYW5kIGluZm9ybWF0aW9uIHRoYXQgZm9udCBjYW4ndCBiZSBjcmVhdGVkLgorICogVGhlIEZvbnRGb3JtYXRFeGNlcHRpb24gY2xhc3MgaXMgdXNlZCB0byBwcm92aWRlIG5vdGlmaWNhdGlvbiBhbmQgaW5mb3JtYXRpb24KKyAqIHRoYXQgZm9udCBjYW4ndCBiZSBjcmVhdGVkLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEZvbnRGb3JtYXRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NDgxMjkwMTQ3ODExMzYxMjcyTDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBmb250IGZvcm1hdCBleGNlcHRpb24gd2l0aCBkZXRhaWxlZCBtZXNzYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSByZWFzb24gdGhlIGRldGFpbGVkIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIHJlYXNvbgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbGVkIG1lc3NhZ2UuCiAgICAgICovCiAgICAgcHVibGljIEZvbnRGb3JtYXRFeGNlcHRpb24oU3RyaW5nIHJlYXNvbikgewogICAgICAgICBzdXBlcihyZWFzb24pOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0ZvbnRNZXRyaWNzLmphdmEgYi9hd3QvamF2YS9hd3QvRm9udE1ldHJpY3MuamF2YQppbmRleCAzOTQ4ZDczLi45MDgyNjI2IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvRm9udE1ldHJpY3MuamF2YQorKysgYi9hd3QvamF2YS9hd3QvRm9udE1ldHJpY3MuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJbHlhIFMuIE9rb21pbgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIGltcG9ydCBqYXZhLmF3dC5mb250LkZvbnRSZW5kZXJDb250ZXh0OwpAQCAtMjksMzQgKzMwLDQwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIEZvbnRNZXRyaWNzIGNsYXNzIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZW5kZXJpbmcgCi0gKiBvZiBhIHBhcnRpY3VsYXIgZm9udCBvbiBhIHBhcnRpY3VsYXIgc2NyZWVuLgorICogVGhlIEZvbnRNZXRyaWNzIGNsYXNzIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZW5kZXJpbmcgb2YgYQorICogcGFydGljdWxhciBmb250IG9uIGEgcGFydGljdWxhciBzY3JlZW4uCiAgKiA8cD4KLSAqIEVhY2ggY2hhcmFjdGVyIGluIHRoZSBGb250IGhhcyB0aHJlZSB2YWx1ZXMgdGhhdCBoZWxwIGRlZmluZSB3aGVyZSAKLSAqIHRvIHBsYWNlIGl0OiBhbiBhc2NlbnQsIGEgZGVzY2VudCwgYW5kIGFuIGFkdmFuY2UuIFRoZSBhc2NlbnQgaXMgdGhlIAotICogZGlzdGFuY2UgdGhlIGNoYXJhY3RlciBleHRlbmRzIGFib3ZlIHRoZSBiYXNlbGluZS4gVGhlIGRlc2NlbnQgaXMKLSAqIHRoZSBkaXN0YW5jZSB0aGUgY2hhcmFjdGVyIGV4dGVuZHMgYmVsb3cgdGhlIGJhc2VsaW5lLiAKLSAqIFRoZSBhZHZhbmNlIHdpZHRoIGRlZmluZXMgdGhlIHBvc2l0aW9uIGF0IHdoaWNoIHRoZSBuZXh0IGNoYXJhY3RlcgotICogc2hvdWxkIGJlIHBsYWNlZC4KKyAqIEVhY2ggY2hhcmFjdGVyIGluIHRoZSBGb250IGhhcyB0aHJlZSB2YWx1ZXMgdGhhdCBoZWxwIGRlZmluZSB3aGVyZSB0byBwbGFjZQorICogaXQ6IGFuIGFzY2VudCwgYSBkZXNjZW50LCBhbmQgYW4gYWR2YW5jZS4gVGhlIGFzY2VudCBpcyB0aGUgZGlzdGFuY2UgdGhlCisgKiBjaGFyYWN0ZXIgZXh0ZW5kcyBhYm92ZSB0aGUgYmFzZWxpbmUuIFRoZSBkZXNjZW50IGlzIHRoZSBkaXN0YW5jZSB0aGUKKyAqIGNoYXJhY3RlciBleHRlbmRzIGJlbG93IHRoZSBiYXNlbGluZS4gVGhlIGFkdmFuY2Ugd2lkdGggZGVmaW5lcyB0aGUgcG9zaXRpb24KKyAqIGF0IHdoaWNoIHRoZSBuZXh0IGNoYXJhY3RlciBzaG91bGQgYmUgcGxhY2VkLgogICogPHA+Ci0gKiBBbiBhcnJheSBvZiBjaGFyYWN0ZXJzIG9yIGEgc3RyaW5nIGhhcyBhbiBhc2NlbnQsIGEgZGVzY2VudCwKLSAqICBhbmQgYW4gYWR2YW5jZSB3aWR0aCB0b28uIFRoZSBhc2NlbnQgb3IgZGVzY2VudCBvZiB0aGUgYXJyYXkgCi0gKiAgaXMgc3BlY2lmaWVkIGJ5IHRoZSBtYXhpbXVtIGFzY2VudCBvciBkZXNjZW50IG9mIHRoZSBjaGFyYWN0ZXJzIAotICogIGluIHRoZSBhcnJheS4gVGhlIGFkdmFuY2Ugd2lkdGggaXMgdGhlIHN1bSBvZiB0aGUgYWR2YW5jZSB3aWR0aHMgCi0gKiAgb2YgZWFjaCBvZiB0aGUgY2hhcmFjdGVycyBpbiB0aGUgY2hhcmFjdGVyIGFycmF5LgorICogQW4gYXJyYXkgb2YgY2hhcmFjdGVycyBvciBhIHN0cmluZyBoYXMgYW4gYXNjZW50LCBhIGRlc2NlbnQsIGFuZCBhbiBhZHZhbmNlCisgKiB3aWR0aCB0b28uIFRoZSBhc2NlbnQgb3IgZGVzY2VudCBvZiB0aGUgYXJyYXkgaXMgc3BlY2lmaWVkIGJ5IHRoZSBtYXhpbXVtCisgKiBhc2NlbnQgb3IgZGVzY2VudCBvZiB0aGUgY2hhcmFjdGVycyBpbiB0aGUgYXJyYXkuIFRoZSBhZHZhbmNlIHdpZHRoIGlzIHRoZQorICogc3VtIG9mIHRoZSBhZHZhbmNlIHdpZHRocyBvZiBlYWNoIG9mIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBjaGFyYWN0ZXIgYXJyYXkuCisgKiA8L3A+CisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRm9udE1ldHJpY3MgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE2ODExMjYyMjUyMDUwNTAxNDdMOwogCi0gICAgLyoqIFRoZSBmb250IGZyb20gd2hpY2ggdGhlIEZvbnRNZXRyaWNzIGlzIGNyZWF0ZWQuICovCisgICAgLyoqCisgICAgICogVGhlIGZvbnQgZnJvbSB3aGljaCB0aGUgRm9udE1ldHJpY3MgaXMgY3JlYXRlZC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgRm9udCBmb250OwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZvbnQgbWV0cmljcyBmcm9tIHRoZSBzcGVjaWZpZWQgRm9udC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm50IHRoZSBGb250LgorICAgICAqIEBwYXJhbSBmbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250LgogICAgICAqLwogICAgIHByb3RlY3RlZCBGb250TWV0cmljcyhGb250IGZudCkgewogICAgICAgICB0aGlzLmZvbnQgPSBmbnQ7CkBAIC02NSwxMiArNzIsMTEgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBGb250TWV0cmljcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICJbZm9udD0iICsgdGhpcy5nZXRGb250KCkgKyAvLyROT04tTkxTLTEkCisgICAgICAgIHJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIltmb250PSIgKyB0aGlzLmdldEZvbnQoKSArIC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICAiYXNjZW50PSIgKyB0aGlzLmdldEFzY2VudCgpICsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICIsIGRlc2NlbnQ9IiArIHRoaXMuZ2V0RGVzY2VudCgpICsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICIsIGhlaWdodD0iICsgdGhpcy5nZXRIZWlnaHQoKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCkBAIC05NSw5ICsxMDEsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZvbnQgYXNjZW50IG9mIHRoZSBGb250IGFzc29jaWF0ZWQgd2l0aCB0aGlzIEZvbnRNZXRyaWNzLgotICAgICAqIFRoZSBmb250IGFzY2VudCBpcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgZm9udCdzIGJhc2VsaW5lIHRvIAotICAgICAqIHRoZSB0b3Agb2YgbW9zdCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4KKyAgICAgKiBHZXRzIHRoZSBmb250IGFzY2VudCBvZiB0aGUgRm9udCBhc3NvY2lhdGVkIHdpdGggdGhpcyBGb250TWV0cmljcy4gVGhlCisgICAgICogZm9udCBhc2NlbnQgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGZvbnQncyBiYXNlbGluZSB0byB0aGUgdG9wIG9mIG1vc3QKKyAgICAgKiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBhc2NlbnQgb2YgdGhlIEZvbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgRm9udE1ldHJpY3MuCiAgICAgICovCkBAIC0xMDYsOSArMTEyLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmb250IGRlc2NlbnQgb2YgdGhlIEZvbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgRm9udE1ldHJpY3MuCi0gICAgICogVGhlIGZvbnQgZGVzY2VudCBpcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgZm9udCdzIGJhc2VsaW5lIHRvIAotICAgICAqIHRoZSBib3R0b20gb2YgbW9zdCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyB3aXRoIGRlc2NlbmRlcnMuCisgICAgICogR2V0cyB0aGUgZm9udCBkZXNjZW50IG9mIHRoZSBGb250IGFzc29jaWF0ZWQgd2l0aCB0aGlzIEZvbnRNZXRyaWNzLiBUaGUKKyAgICAgKiBmb250IGRlc2NlbnQgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGZvbnQncyBiYXNlbGluZSB0byB0aGUgYm90dG9tIG9mCisgICAgICogbW9zdCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyB3aXRoIGRlc2NlbmRlcnMuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgZGVzY2VudCBvZiB0aGUgRm9udCBhc3NvY2lhdGVkIHdpdGggdGhpcyBGb250TWV0cmljcy4KICAgICAgKi8KQEAgLTEyNiwxOTIgKzEzMiwxOTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBMaW5lTWV0cmljcyBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgQ2hhcmFjdGVySXRlcmF0b3IKLSAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIEdyYXBoaWNzLgorICAgICAqIEdldHMgdGhlIExpbmVNZXRyaWNzIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBDaGFyYWN0ZXJJdGVyYXRvciBpbiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgR3JhcGhpY3MuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNpIHRoZSBDaGFyYWN0ZXJJdGVyYXRvci4KLSAgICAgKiBAcGFyYW0gYmVnaW5JbmRleCB0aGUgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgdXNlZC4KLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgR3JhcGhpY3MuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgTGluZU1ldHJpY3Mgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIENoYXJhY3Rlckl0ZXJhdG9yCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcy4KKyAgICAgKiBAcGFyYW0gY2kKKyAgICAgKiAgICAgICAgICAgIHRoZSBDaGFyYWN0ZXJJdGVyYXRvci4KKyAgICAgKiBAcGFyYW0gYmVnaW5JbmRleAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldC4KKyAgICAgKiBAcGFyYW0gbGltaXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSB1c2VkLgorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICogICAgICAgICAgICB0aGUgR3JhcGhpY3MuCisgICAgICogQHJldHVybiB0aGUgTGluZU1ldHJpY3Mgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIENoYXJhY3Rlckl0ZXJhdG9yIGluIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIEdyYXBoaWNzLgogICAgICAqLwotICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhDaGFyYWN0ZXJJdGVyYXRvciBjaSwgaW50IGJlZ2luSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbWl0LCBHcmFwaGljcyBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBmb250LmdldExpbmVNZXRyaWNzKGNpLCBiZWdpbkluZGV4LCBsaW1pdCwgCi0gICAgICAgICAgICAgICAgdGhpcy5nZXRGUkNGcm9tR3JhcGhpY3MoY29udGV4dCkpOworICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhDaGFyYWN0ZXJJdGVyYXRvciBjaSwgaW50IGJlZ2luSW5kZXgsIGludCBsaW1pdCwKKyAgICAgICAgICAgIEdyYXBoaWNzIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGZvbnQuZ2V0TGluZU1ldHJpY3MoY2ksIGJlZ2luSW5kZXgsIGxpbWl0LCB0aGlzLmdldEZSQ0Zyb21HcmFwaGljcyhjb250ZXh0KSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgTGluZU1ldHJpY3Mgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIFN0cmluZwotICAgICAqIGluIHRoZSBzcGVjaWZpZWQgR3JhcGhpY3MuCisgICAgICogR2V0cyB0aGUgTGluZU1ldHJpY3Mgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIFN0cmluZyBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogR3JhcGhpY3MuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0ciB0aGUgU3RyaW5nLgotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBHcmFwaGljcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBMaW5lTWV0cmljcyBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgU3RyaW5nCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcy4KKyAgICAgKiBAcGFyYW0gc3RyCisgICAgICogICAgICAgICAgICB0aGUgU3RyaW5nLgorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICogICAgICAgICAgICB0aGUgR3JhcGhpY3MuCisgICAgICogQHJldHVybiB0aGUgTGluZU1ldHJpY3Mgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIFN0cmluZyBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBHcmFwaGljcy4KICAgICAgKi8KICAgICBwdWJsaWMgTGluZU1ldHJpY3MgZ2V0TGluZU1ldHJpY3MoU3RyaW5nIHN0ciwgR3JhcGhpY3MgY29udGV4dCkgewogICAgICAgICByZXR1cm4gZm9udC5nZXRMaW5lTWV0cmljcyhzdHIsIHRoaXMuZ2V0RlJDRnJvbUdyYXBoaWNzKGNvbnRleHQpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBMaW5lTWV0cmljcyBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIAotICAgICAqIGFycmF5IGluIHRoZSBzcGVjaWZpZWQgR3JhcGhpY3MuCisgICAgICogR2V0cyB0aGUgTGluZU1ldHJpY3Mgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBhcnJheSBpbiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgR3JhcGhpY3MuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNoYXJzIHRoZSBjaGFyYWN0ZXIgYXJyYXkuCi0gICAgICogQHBhcmFtIGJlZ2luSW5kZXggdGhlIG9mZnNldCBvZiBhcnJheS4KLSAgICAgKiBAcGFyYW0gbGltaXQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHVzZWQuCi0gICAgICogQHBhcmFtIGNvbnRleHQgdGhlIEdyYXBoaWNzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIExpbmVNZXRyaWNzIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgCi0gICAgICogYXJyYXkgaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcy4KKyAgICAgKiBAcGFyYW0gY2hhcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgYXJyYXkuCisgICAgICogQHBhcmFtIGJlZ2luSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgYXJyYXkuCisgICAgICogQHBhcmFtIGxpbWl0CisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgdXNlZC4KKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgICAgICAgdGhlIEdyYXBoaWNzLgorICAgICAqIEByZXR1cm4gdGhlIExpbmVNZXRyaWNzIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXJyYXkgaW4gdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgR3JhcGhpY3MuCiAgICAgICovCi0gICAgcHVibGljIExpbmVNZXRyaWNzIGdldExpbmVNZXRyaWNzKGNoYXJbXSBjaGFycywgaW50IGJlZ2luSW5kZXgsIGludCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBmb250LmdldExpbmVNZXRyaWNzKGNoYXJzLCBiZWdpbkluZGV4LCBsaW1pdCwgCi0gICAgICAgICAgICAgICAgdGhpcy5nZXRGUkNGcm9tR3JhcGhpY3MoY29udGV4dCkpOworICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhjaGFyW10gY2hhcnMsIGludCBiZWdpbkluZGV4LCBpbnQgbGltaXQsIEdyYXBoaWNzIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGZvbnQuZ2V0TGluZU1ldHJpY3MoY2hhcnMsIGJlZ2luSW5kZXgsIGxpbWl0LCB0aGlzLmdldEZSQ0Zyb21HcmFwaGljcyhjb250ZXh0KSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgTGluZU1ldHJpY3Mgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIFN0cmluZwotICAgICAqIGluIHRoZSBzcGVjaWZpZWQgR3JhcGhpY3MuCisgICAgICogR2V0cyB0aGUgTGluZU1ldHJpY3Mgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIFN0cmluZyBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogR3JhcGhpY3MuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0ciB0aGUgU3RyaW5nLgotICAgICAqIEBwYXJhbSBiZWdpbkluZGV4IHRoZSBvZmZzZXQuCi0gICAgICogQHBhcmFtIGxpbWl0IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSB1c2VkLgotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBHcmFwaGljcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBMaW5lTWV0cmljcyBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgU3RyaW5nCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcy4KKyAgICAgKiBAcGFyYW0gc3RyCisgICAgICogICAgICAgICAgICB0aGUgU3RyaW5nLgorICAgICAqIEBwYXJhbSBiZWdpbkluZGV4CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBsaW1pdAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHVzZWQuCisgICAgICogQHBhcmFtIGNvbnRleHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBHcmFwaGljcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBMaW5lTWV0cmljcyBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIEdyYXBoaWNzLgogICAgICAqLwotICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhTdHJpbmcgc3RyLCBpbnQgYmVnaW5JbmRleCwgaW50IGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGZvbnQuZ2V0TGluZU1ldHJpY3Moc3RyLCBiZWdpbkluZGV4LCBsaW1pdCwgCi0gICAgICAgICAgICAgICAgdGhpcy5nZXRGUkNGcm9tR3JhcGhpY3MoY29udGV4dCkpOworICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhTdHJpbmcgc3RyLCBpbnQgYmVnaW5JbmRleCwgaW50IGxpbWl0LCBHcmFwaGljcyBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBmb250LmdldExpbmVNZXRyaWNzKHN0ciwgYmVnaW5JbmRleCwgbGltaXQsIHRoaXMuZ2V0RlJDRnJvbUdyYXBoaWNzKGNvbnRleHQpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIncyBtYXhpbXVtIGJvdW5kcyBpbiB0aGUgc3BlY2lmaWVkIAotICAgICAqIEdyYXBoaWNzIGNvbnRleHQuCisgICAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyJ3MgbWF4aW11bSBib3VuZHMgaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcyBjb250ZXh0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBHcmFwaGljcyBjb250ZXh0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlcidzIG1heGltdW0gYm91bmRzIGluIHRoZSBzcGVjaWZpZWQgCi0gICAgICogR3JhcGhpY3MgY29udGV4dC4KKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgICAgICAgdGhlIEdyYXBoaWNzIGNvbnRleHQuCisgICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyJ3MgbWF4aW11bSBib3VuZHMgaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcyBjb250ZXh0LgogICAgICAqLwogICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRNYXhDaGFyQm91bmRzKEdyYXBoaWNzIGNvbnRleHQpIHsKICAgICAgICAgcmV0dXJuIHRoaXMuZm9udC5nZXRNYXhDaGFyQm91bmRzKHRoaXMuZ2V0RlJDRnJvbUdyYXBoaWNzKGNvbnRleHQpKTsKICAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgQ2hhcmFjdGVySXRlcmF0b3IgCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcyBjb250ZXh0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjaSB0aGUgQ2hhcmFjdGVySXRlcmF0b3IuCi0gICAgICogQHBhcmFtIGJlZ2luSW5kZXggdGhlIGJlZ2luIG9mZnNldCBvZiB0aGUgYXJyYXkuCi0gICAgICogQHBhcmFtIGxpbWl0IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycy4KLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgR3JhcGhpY3MuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgQ2hhcmFjdGVySXRlcmF0b3IgCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcyBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRTdHJpbmdCb3VuZHMoQ2hhcmFjdGVySXRlcmF0b3IgY2ksIGludCBiZWdpbkluZGV4LAotICAgICAgICAgICAgaW50IGxpbWl0LCBHcmFwaGljcyBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBmb250LmdldFN0cmluZ0JvdW5kcyhjaSwgYmVnaW5JbmRleCwgbGltaXQsIAotICAgICAgICAgICAgICAgIHRoaXMuZ2V0RlJDRnJvbUdyYXBoaWNzKGNvbnRleHQpKTsKLSAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBib3VuZHMgb2YgdGhlIHNwZWNpZmllZCBTdHJpbmcgCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcyBjb250ZXh0LgorICAgICAqIEdldHMgdGhlIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIENoYXJhY3Rlckl0ZXJhdG9yIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBHcmFwaGljcyBjb250ZXh0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHIgdGhlIFN0cmluZy4KLSAgICAgKiBAcGFyYW0gYmVnaW5JbmRleCB0aGUgYmVnaW4gb2Zmc2V0IG9mIHRoZSBhcnJheS4KLSAgICAgKiBAcGFyYW0gbGltaXQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzLgotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBHcmFwaGljcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBib3VuZHMgb2YgdGhlIHNwZWNpZmllZCBTdHJpbmcgCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcyBjb250ZXh0LgorICAgICAqIEBwYXJhbSBjaQorICAgICAqICAgICAgICAgICAgdGhlIENoYXJhY3Rlckl0ZXJhdG9yLgorICAgICAqIEBwYXJhbSBiZWdpbkluZGV4CisgICAgICogICAgICAgICAgICB0aGUgYmVnaW4gb2Zmc2V0IG9mIHRoZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gbGltaXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycy4KKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgICAgICAgdGhlIEdyYXBoaWNzLgorICAgICAqIEByZXR1cm4gdGhlIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIENoYXJhY3Rlckl0ZXJhdG9yIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIEdyYXBoaWNzIGNvbnRleHQuCiAgICAgICovCi0gICAgcHVibGljIFJlY3RhbmdsZTJEIGdldFN0cmluZ0JvdW5kcyhTdHJpbmcgc3RyLCBpbnQgYmVnaW5JbmRleCwgaW50IGxpbWl0LAorICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRTdHJpbmdCb3VuZHMoQ2hhcmFjdGVySXRlcmF0b3IgY2ksIGludCBiZWdpbkluZGV4LCBpbnQgbGltaXQsCiAgICAgICAgICAgICBHcmFwaGljcyBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBmb250LmdldFN0cmluZ0JvdW5kcyhzdHIsIGJlZ2luSW5kZXgsIGxpbWl0LCAKLSAgICAgICAgICAgICAgICB0aGlzLmdldEZSQ0Zyb21HcmFwaGljcyhjb250ZXh0KSk7CisgICAgICAgIHJldHVybiBmb250LmdldFN0cmluZ0JvdW5kcyhjaSwgYmVnaW5JbmRleCwgbGltaXQsIHRoaXMuZ2V0RlJDRnJvbUdyYXBoaWNzKGNvbnRleHQpKTsKICAgICB9CiAKLQogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcnMgYXJyYXkgCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcyBjb250ZXh0LgorICAgICAqIEdldHMgdGhlIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIFN0cmluZyBpbiB0aGUgc3BlY2lmaWVkIEdyYXBoaWNzCisgICAgICogY29udGV4dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2hhcnMgdGhlIGNoYXJhY3RlcnMgYXJyYXkuCi0gICAgICogQHBhcmFtIGJlZ2luSW5kZXggdGhlIGJlZ2luIG9mZnNldCBvZiB0aGUgYXJyYXkuCi0gICAgICogQHBhcmFtIGxpbWl0IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycy4KLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgR3JhcGhpY3MuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycyBhcnJheSAKLSAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIEdyYXBoaWNzIGNvbnRleHQuCisgICAgICogQHBhcmFtIHN0cgorICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZy4KKyAgICAgKiBAcGFyYW0gYmVnaW5JbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGJlZ2luIG9mZnNldCBvZiB0aGUgYXJyYXkuCisgICAgICogQHBhcmFtIGxpbWl0CisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMuCisgICAgICogQHBhcmFtIGNvbnRleHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBHcmFwaGljcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBib3VuZHMgb2YgdGhlIHNwZWNpZmllZCBTdHJpbmcgaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcworICAgICAqICAgICAgICAgY29udGV4dC4KICAgICAgKi8KLSAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0U3RyaW5nQm91bmRzKGNoYXJbXSBjaGFycywgaW50IGJlZ2luSW5kZXgsIGludCBsaW1pdCwKLSAgICAgICAgICAgIEdyYXBoaWNzIGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGZvbnQuZ2V0U3RyaW5nQm91bmRzKGNoYXJzLCBiZWdpbkluZGV4LCBsaW1pdCwgCi0gICAgICAgICAgICAgICAgdGhpcy5nZXRGUkNGcm9tR3JhcGhpY3MoY29udGV4dCkpOworICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRTdHJpbmdCb3VuZHMoU3RyaW5nIHN0ciwgaW50IGJlZ2luSW5kZXgsIGludCBsaW1pdCwgR3JhcGhpY3MgY29udGV4dCkgeworICAgICAgICByZXR1cm4gZm9udC5nZXRTdHJpbmdCb3VuZHMoc3RyLCBiZWdpbkluZGV4LCBsaW1pdCwgdGhpcy5nZXRGUkNGcm9tR3JhcGhpY3MoY29udGV4dCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIFN0cmluZyAKLSAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIEdyYXBoaWNzIGNvbnRleHQuCisgICAgICogR2V0cyB0aGUgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycyBhcnJheSBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogR3JhcGhpY3MgY29udGV4dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyIHRoZSBTdHJpbmcuCi0gICAgICogQHBhcmFtIGNvbnRleHQgdGhlIEdyYXBoaWNzLgorICAgICAqIEBwYXJhbSBjaGFycworICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlcnMgYXJyYXkuCisgICAgICogQHBhcmFtIGJlZ2luSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBiZWdpbiBvZmZzZXQgb2YgdGhlIGFycmF5LgorICAgICAqIEBwYXJhbSBsaW1pdAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzLgorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICogICAgICAgICAgICB0aGUgR3JhcGhpY3MuCisgICAgICogQHJldHVybiB0aGUgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycyBhcnJheSBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBHcmFwaGljcyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRTdHJpbmdCb3VuZHMoY2hhcltdIGNoYXJzLCBpbnQgYmVnaW5JbmRleCwgaW50IGxpbWl0LCBHcmFwaGljcyBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBmb250LmdldFN0cmluZ0JvdW5kcyhjaGFycywgYmVnaW5JbmRleCwgbGltaXQsIHRoaXMuZ2V0RlJDRnJvbUdyYXBoaWNzKGNvbnRleHQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBib3VuZHMgb2YgdGhlIHNwZWNpZmllZCBTdHJpbmcgaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcworICAgICAqIGNvbnRleHQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgU3RyaW5nIAotICAgICAqIGluIHRoZSBzcGVjaWZpZWQgR3JhcGhpY3MgY29udGV4dC4KKyAgICAgKiBAcGFyYW0gc3RyCisgICAgICogICAgICAgICAgICB0aGUgU3RyaW5nLgorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICogICAgICAgICAgICB0aGUgR3JhcGhpY3MuCisgICAgICogQHJldHVybiB0aGUgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGluIHRoZSBzcGVjaWZpZWQgR3JhcGhpY3MKKyAgICAgKiAgICAgICAgIGNvbnRleHQuCiAgICAgICovCiAgICAgcHVibGljIFJlY3RhbmdsZTJEIGdldFN0cmluZ0JvdW5kcyhTdHJpbmcgc3RyLCBHcmFwaGljcyBjb250ZXh0KSB7CiAgICAgICAgIHJldHVybiBmb250LmdldFN0cmluZ0JvdW5kcyhzdHIsIHRoaXMuZ2V0RlJDRnJvbUdyYXBoaWNzKGNvbnRleHQpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIEZvbnQgaGFzIHVuaWZvcm0gbGluZSBtZXRyaWNzIG9yIG5vdC4gCi0gICAgICogVGhlIEZvbnQgY2FuIGNvbnRhaW4gY2hhcmFjdGVycyBvZiBvdGhlciBmb250cyBmb3IgCi0gICAgICogY292ZXJpbmcgY2hhcmFjdGVyIHNldC4gSW4gdGhpcyBjYXNlIHRoZSBGb250IGlzbid0Ci0gICAgICogdW5pZm9ybS4gCi0gICAgICogIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIEZvbnQgaGFzIHVuaWZvcm0gbGluZSBtZXRyaWNzLCAKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQ2hlY2tzIGlmIHRoZSBGb250IGhhcyB1bmlmb3JtIGxpbmUgbWV0cmljcyBvciBub3QuIFRoZSBGb250IGNhbiBjb250YWluCisgICAgICogY2hhcmFjdGVycyBvZiBvdGhlciBmb250cyBmb3IgY292ZXJpbmcgY2hhcmFjdGVyIHNldC4gSW4gdGhpcyBjYXNlIHRoZQorICAgICAqIEZvbnQgaXNuJ3QgdW5pZm9ybS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBGb250IGhhcyB1bmlmb3JtIGxpbmUgbWV0cmljcywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc1VuaWZvcm1MaW5lTWV0cmljcygpIHsKICAgICAgICAgcmV0dXJuIHRoaXMuZm9udC5oYXNVbmlmb3JtTGluZU1ldHJpY3MoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBsZWZ0bW9zdCBwb2ludCB0byB0aGUgcmlnaHRtb3N0IAotICAgICAqIHBvaW50IG9uIHRoZSBzdHJpbmcncyBiYXNlbGluZSBzaG93aW5nIHRoZSBzcGVjaWZpZWQgYXJyYXkgCi0gICAgICogb2YgYnl0ZXMgaW4gdGhpcyBGb250LiAgIAorICAgICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGxlZnRtb3N0IHBvaW50IHRvIHRoZSByaWdodG1vc3QgcG9pbnQgb24KKyAgICAgKiB0aGUgc3RyaW5nJ3MgYmFzZWxpbmUgc2hvd2luZyB0aGUgc3BlY2lmaWVkIGFycmF5IG9mIGJ5dGVzIGluIHRoaXMgRm9udC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgYXJyYXkgb2YgYnl0ZXMgdG8gYmUgbWVhc3VyZWQuCi0gICAgICogQHBhcmFtIG9mZiB0aGUgc3RhcnQgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBtZWFzdXJlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGJ5dGVzIHRvIGJlIG1lYXN1cmVkLgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBvZmZzZXQuCisgICAgICogQHBhcmFtIGxlbgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBtZWFzdXJlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBhZHZhbmNlIHdpZHRoIG9mIHRoZSBhcnJheS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGJ5dGVzV2lkdGgoYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4pIHsKICAgICAgICAgaW50IHdpZHRoID0gMDsKLSAgICAgICAgaWYgKChvZmYgPj0gZGF0YS5sZW5ndGgpIHx8IChvZmYgPCAwKSl7CisgICAgICAgIGlmICgob2ZmID49IGRhdGEubGVuZ3RoKSB8fCAob2ZmIDwgMCkpIHsKICAgICAgICAgICAgIC8vIGF3dC4xM0I9b2Zmc2V0IG9mZiBpcyBvdXQgb2YgcmFuZ2UKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTNCIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKG9mZitsZW4gPiBkYXRhLmxlbmd0aCkpeworICAgICAgICBpZiAoKG9mZiArIGxlbiA+IGRhdGEubGVuZ3RoKSkgewogICAgICAgICAgICAgLy8gYXd0LjEzQz1udW1iZXIgb2YgZWxlbWV0cyBsZW4gaXMgb3V0IG9mIHJhbmdlCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjEzQyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IG9mZjsgaSA8IG9mZitsZW47IGkrKyl7CisgICAgICAgIGZvciAoaW50IGkgPSBvZmY7IGkgPCBvZmYgKyBsZW47IGkrKykgewogICAgICAgICAgICAgd2lkdGggKz0gY2hhcldpZHRoKGRhdGFbaV0pOwogICAgICAgICB9CiAKQEAgLTMxOSwyOSArMzMxLDMxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgbGVmdG1vc3QgcG9pbnQgdG8gdGhlIHJpZ2h0bW9zdCAKLSAgICAgKiBwb2ludCBvbiB0aGUgc3RyaW5nJ3MgYmFzZWxpbmUgc2hvd2luZyB0aGUgc3BlY2lmaWVkIGFycmF5IAotICAgICAqIG9mIGNoYXJhY3RlcnMgaW4gdGhpcyBGb250LiAgIAorICAgICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGxlZnRtb3N0IHBvaW50IHRvIHRoZSByaWdodG1vc3QgcG9pbnQgb24KKyAgICAgKiB0aGUgc3RyaW5nJ3MgYmFzZWxpbmUgc2hvd2luZyB0aGUgc3BlY2lmaWVkIGFycmF5IG9mIGNoYXJhY3RlcnMgaW4gdGhpcworICAgICAqIEZvbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMgdG8gYmUgbWVhc3VyZWQuCi0gICAgICogQHBhcmFtIG9mZiB0aGUgc3RhcnQgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBtZWFzdXJlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMgdG8gYmUgbWVhc3VyZWQuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IG9mZnNldC4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIG1lYXN1cmVkLgogICAgICAqIEByZXR1cm4gdGhlIGFkdmFuY2Ugd2lkdGggb2YgdGhlIGFycmF5LgogICAgICAqLwotICAgIHB1YmxpYyBpbnQgY2hhcnNXaWR0aChjaGFyW10gZGF0YSwgaW50IG9mZiAsIGludCBsZW4peworICAgIHB1YmxpYyBpbnQgY2hhcnNXaWR0aChjaGFyW10gZGF0YSwgaW50IG9mZiwgaW50IGxlbikgewogICAgICAgICBpbnQgd2lkdGggPSAwOwotICAgICAgICBpZiAoKG9mZiA+PSBkYXRhLmxlbmd0aCkgfHwgKG9mZiA8IDApKXsKKyAgICAgICAgaWYgKChvZmYgPj0gZGF0YS5sZW5ndGgpIHx8IChvZmYgPCAwKSkgewogICAgICAgICAgICAgLy8gYXd0LjEzQj1vZmZzZXQgb2ZmIGlzIG91dCBvZiByYW5nZQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xM0IiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIGlmICgob2ZmK2xlbiA+IGRhdGEubGVuZ3RoKSl7CisgICAgICAgIGlmICgob2ZmICsgbGVuID4gZGF0YS5sZW5ndGgpKSB7CiAgICAgICAgICAgICAvLyBhd3QuMTNDPW51bWJlciBvZiBlbGVtZXRzIGxlbiBpcyBvdXQgb2YgcmFuZ2UKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTNDIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKGludCBpID0gb2ZmOyBpIDwgb2ZmK2xlbjsgaSsrKXsKKyAgICAgICAgZm9yIChpbnQgaSA9IG9mZjsgaSA8IG9mZiArIGxlbjsgaSsrKSB7CiAgICAgICAgICAgICB3aWR0aCArPSBjaGFyV2lkdGgoZGF0YVtpXSk7CiAgICAgICAgIH0KIApAQCAtMzQ5LDEyICszNjMsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBsZWZ0bW9zdCBwb2ludCB0byB0aGUgcmlnaHRtb3N0IAotICAgICAqIHBvaW50IG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGluIHRoaXMgRm9udC4gICAKKyAgICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBsZWZ0bW9zdCBwb2ludCB0byB0aGUgcmlnaHRtb3N0IHBvaW50IG9mCisgICAgICogdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaW4gdGhpcyBGb250LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjaCB0aGUgc3BlY2lmaWVkIHVuaWNvZGUgcG9pbnQgY29kZSBvZiAKLSAgICAgKiBjaGFyYWN0ZXIgdG8gYmUgbWVhc3VyZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIGNoCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFVuaWNvZGUgcG9pbnQgY29kZSBvZiBjaGFyYWN0ZXIgdG8gYmUgbWVhc3VyZWQuCiAgICAgICogQHJldHVybiB0aGUgYWR2YW5jZSB3aWR0aCBvZiB0aGUgY2hhcmFjdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY2hhcldpZHRoKGludCBjaCkgewpAQCAtMzYyLDExICszNzUsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBsZWZ0bW9zdCBwb2ludCB0byB0aGUgcmlnaHRtb3N0IAotICAgICAqIHBvaW50IG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGluIHRoaXMgRm9udC4gICAKKyAgICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBsZWZ0bW9zdCBwb2ludCB0byB0aGUgcmlnaHRtb3N0IHBvaW50IG9mCisgICAgICogdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaW4gdGhpcyBGb250LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjaCB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciB0byBiZSBtZWFzdXJlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2gKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHRvIGJlIG1lYXN1cmVkLgogICAgICAqIEByZXR1cm4gdGhlIGFkdmFuY2Ugd2lkdGggb2YgdGhlIGNoYXJhY3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGNoYXJXaWR0aChjaGFyIGNoKSB7CkBAIC0zODMsMTEgKzM5NiwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1heGltdW0gZm9udCBhc2NlbnQgb2YgdGhlIEZvbnQgYXNzb2NpYXRlZCB3aXRoIAotICAgICAqIHRoaXMgRm9udE1ldHJpY3MuCisgICAgICogR2V0cyB0aGUgbWF4aW11bSBmb250IGFzY2VudCBvZiB0aGUgRm9udCBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqIEZvbnRNZXRyaWNzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gZm9udCBhc2NlbnQgb2YgdGhlIEZvbnQgYXNzb2NpYXRlZCB3aXRoIAotICAgICAqIHRoaXMgRm9udE1ldHJpY3MuCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBmb250IGFzY2VudCBvZiB0aGUgRm9udCBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqICAgICAgICAgRm9udE1ldHJpY3MuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNYXhBc2NlbnQoKSB7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMzk3LDcgKzQxMCw2IEBACiAgICAgICogR2V0cyB0aGUgbWF4aW11bSBmb250IGRlc2NlbnQgb2YgY2hhcmFjdGVyIGluIHRoaXMgRm9udC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIGZvbnQgZGVzY2VudCBvZiBjaGFyYWN0ZXIgaW4gdGhpcyBGb250LgotICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGdldE1heERlc2NlbnQoKSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTQyNiwyMyArNDM4LDIyIEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgYWR2YW5jZSB3aWR0aCBmb3IgdGhlIHNwZWNpZmllZCBTdHJpbmcgaW4gdGhpcyBGb250LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHIgU3RyaW5nIHRvIGJlIG1lYXN1cmVkLiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0aGUgYWR2YW5jZSB3aWR0aCBmb3IgdGhlIHNwZWNpZmllZCBTdHJpbmcgCi0gICAgICogaW4gdGhpcyBGb250LgorICAgICAqIEBwYXJhbSBzdHIKKyAgICAgKiAgICAgICAgICAgIFN0cmluZyB0byBiZSBtZWFzdXJlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB0aGUgYWR2YW5jZSB3aWR0aCBmb3IgdGhlIHNwZWNpZmllZCBTdHJpbmcgaW4gdGhpcyBGb250LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgc3RyaW5nV2lkdGgoU3RyaW5nIHN0cikgewogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIEZvbnRSZW5kZXJDb250ZXh0IGluc3RhbnNlIG9mIHRoZSBHcmFwaGljcyBjb250ZXh0IHNwZWNpZmllZC4KKyAgICAgKiBSZXR1cm5zIGEgRm9udFJlbmRlckNvbnRleHQgaW5zdGFuY2Ugb2YgdGhlIEdyYXBoaWNzIGNvbnRleHQgc3BlY2lmaWVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBzcGVjaWZpZWQgR3JhcGhpY3MgY29udGV4dAotICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIEdyYXBoaWNzIGNvbnRleHQuCiAgICAgICogQHJldHVybiBhIEZvbnRSZW5kZXJDb250ZXh0IG9mIHRoZSBzcGVjaWZpZWQgR3JhcGhpY3MgY29udGV4dC4KICAgICAgKi8KLSAgICBwcml2YXRlIEZvbnRSZW5kZXJDb250ZXh0IGdldEZSQ0Zyb21HcmFwaGljcyhHcmFwaGljcyBjb250ZXh0KXsKKyAgICBwcml2YXRlIEZvbnRSZW5kZXJDb250ZXh0IGdldEZSQ0Zyb21HcmFwaGljcyhHcmFwaGljcyBjb250ZXh0KSB7CiAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYzsKICAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBHcmFwaGljczJEKSB7CiAgICAgICAgICAgICBmcmMgPSAoKEdyYXBoaWNzMkQpY29udGV4dCkuZ2V0Rm9udFJlbmRlckNvbnRleHQoKTsKQEAgLTQ1Myw0ICs0NjQsMyBAQAogICAgICAgICByZXR1cm4gZnJjOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0dyYWRpZW50UGFpbnQuamF2YSBiL2F3dC9qYXZhL2F3dC9HcmFkaWVudFBhaW50LmphdmEKaW5kZXggMGUwNjUyOC4uM2IzMmVmNSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0dyYWRpZW50UGFpbnQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvR3JhZGllbnRQYWludC5qYXZhCkBAIC0yNiw1NiArMjYsNzEgQEAKIAogLyoqCiAgKiBUaGUgR3JhZGllbnRQYWludCBjbGFzcyBkZWZpbmVzIGEgd2F5IHRvIGZpbGwgYSBTaGFwZSB3aXRoIGEgbGluZWFyIGNvbG9yCi0gKiBncmFkaWVudCBwYXR0ZXJuLiAKKyAqIGdyYWRpZW50IHBhdHRlcm4uCiAgKiA8cD4KLSAqIFRoZSBHcmFkaWVudFBhaW50J3MgZmlsbCBwYXR0ZXJuIGlzIGRldGVybWluZWQgYnkgdHdvIHBvaW50cyBhbmQgdHdvIGNvbG9ycywgCi0gKiBwbHVzIHRoZSBjeWNsaWMgbW9kZSBvcHRpb24uCi0gKiBFYWNoIG9mIHRoZSB0d28gcG9pbnRzIGlzIHBhaW50ZWQgd2l0aCBpdHMgY29ycmVzcG9uZGluZyBjb2xvciwgYW5kIG9uIAotICogdGhlIGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSB0d28gcG9pbnRzLCB0aGUgY29sb3IgaXMgcHJvcG9ydGlvbmFsbHkKLSAqIGNoYW5nZWQgYmV0d2VlbiB0aGUgdHdvIGNvbG9ycy4gRm9yIHBvaW50cyBvbiB0aGUgc2FtZSBsaW5lIHdoaWNoIGFyZSBub3QgCi0gKiBiZXR3ZWVuIHRoZSB0d28gc3BlY2lmaWVkIHBvaW50cyAob3V0c2lkZSBvZiB0aGUgY29ubmVjdGluZyBzZWdtZW50KSB0aGVpcgotICogY29sb3IgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY3ljbGljIG1vZGUgb3B0aW9uLiBJZiB0aGUgbW9kZSBpcyBjeWNsaWMsIHRoZW4KLSAqIHRoZSByZXN0IG9mIHRoZSBsaW5lIHJlcGVhdHMgdGhlIGNvbG9yIHBhdHRlcm4gb2YgdGhlIGNvbm5lY3Rpbmcgc2VnbWVudCwgCi0gKiBjeWNsaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIHR3byBjb2xvcnMuIElmIG5vdCwgdGhlIG1vZGUgaXMgYWN5Y2xpYyAKLSAqIHdoaWNoIG1lYW5zIHRoYXQgYWxsIHBvaW50cyAKLSAqIG9uIHRoZSBsaW5lIG91dHNpZGUgdGhlIGNvbm5lY3RpbmcgbGluZSBzZWdtZW50IGFyZSBnaXZlbiB0aGUgc2FtZSAKLSAqIGNvbG9yIGFzIHRoZSBjbG9zZXN0IG9mIHRoZSB0d28gc3BlY2lmaWVkIHBvaW50cy4KKyAqIFRoZSBHcmFkaWVudFBhaW50J3MgZmlsbCBwYXR0ZXJuIGlzIGRldGVybWluZWQgYnkgdHdvIHBvaW50cyBhbmQgdHdvIGNvbG9ycywKKyAqIHBsdXMgdGhlIGN5Y2xpYyBtb2RlIG9wdGlvbi4gRWFjaCBvZiB0aGUgdHdvIHBvaW50cyBpcyBwYWludGVkIHdpdGggaXRzCisgKiBjb3JyZXNwb25kaW5nIGNvbG9yLCBhbmQgb24gdGhlIGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSB0d28gcG9pbnRzLCB0aGUKKyAqIGNvbG9yIGlzIHByb3BvcnRpb25hbGx5IGNoYW5nZWQgYmV0d2VlbiB0aGUgdHdvIGNvbG9ycy4gRm9yIHBvaW50cyBvbiB0aGUKKyAqIHNhbWUgbGluZSB3aGljaCBhcmUgbm90IGJldHdlZW4gdGhlIHR3byBzcGVjaWZpZWQgcG9pbnRzIChvdXRzaWRlIG9mIHRoZQorICogY29ubmVjdGluZyBzZWdtZW50KSB0aGVpciBjb2xvciBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjeWNsaWMgbW9kZSBvcHRpb24uIElmCisgKiB0aGUgbW9kZSBpcyBjeWNsaWMsIHRoZW4gdGhlIHJlc3Qgb2YgdGhlIGxpbmUgcmVwZWF0cyB0aGUgY29sb3IgcGF0dGVybiBvZgorICogdGhlIGNvbm5lY3Rpbmcgc2VnbWVudCwgY3ljbGluZyBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIHRoZSB0d28gY29sb3JzLiBJZgorICogbm90LCB0aGUgbW9kZSBpcyBhY3ljbGljIHdoaWNoIG1lYW5zIHRoYXQgYWxsIHBvaW50cyBvbiB0aGUgbGluZSBvdXRzaWRlIHRoZQorICogY29ubmVjdGluZyBsaW5lIHNlZ21lbnQgYXJlIGdpdmVuIHRoZSBzYW1lIGNvbG9yIGFzIHRoZSBjbG9zZXN0IG9mIHRoZSB0d28KKyAqIHNwZWNpZmllZCBwb2ludHMuCiAgKiA8cD4KLSAqIFRoZSBjb2xvciBvZiBwb2ludHMgdGhhdCBhcmUgbm90IG9uIHRoZSBsaW5lIGNvbm5lY3RpbmcgdGhlIHR3byAKLSAqIHNwZWNpZmllZCBwb2ludHMgYXJlIGdpdmVuIGJ5IHBlcnBlbmRpY3VsYXIgcHJvamVjdGlvbjogYnkgdGFraW5nIAotICogdGhlIHNldCBvZiBsaW5lcyBwZXJwZW5kaWN1bGFyIHRvIHRoZSBjb25uZWN0aW5nIGxpbmUgYW5kIGZvciBlYWNoIAotICogb25lLCB0aGUgd2hvbGUgbGluZSBpcyBjb2xvcmVkIHdpdGggdGhlIHNhbWUgY29sb3IuCisgKiBUaGUgY29sb3Igb2YgcG9pbnRzIHRoYXQgYXJlIG5vdCBvbiB0aGUgbGluZSBjb25uZWN0aW5nIHRoZSB0d28gc3BlY2lmaWVkCisgKiBwb2ludHMgYXJlIGdpdmVuIGJ5IHBlcnBlbmRpY3VsYXIgcHJvamVjdGlvbjogYnkgdGFraW5nIHRoZSBzZXQgb2YgbGluZXMKKyAqIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGNvbm5lY3RpbmcgbGluZSBhbmQgZm9yIGVhY2ggb25lLCB0aGUgd2hvbGUgbGluZSBpcworICogY29sb3JlZCB3aXRoIHRoZSBzYW1lIGNvbG9yLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEdyYWRpZW50UGFpbnQgaW1wbGVtZW50cyBQYWludCB7Ci0gICAgCi0gICAgLyoqIFRoZSBzdGFydCBwb2ludCBjb2xvci4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBzdGFydCBwb2ludCBjb2xvci4KKyAgICAgKi8KICAgICBDb2xvciBjb2xvcjE7CiAKLSAgICAvKiogVGhlIGVuZCBjb2xvciBwb2ludC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZW5kIGNvbG9yIHBvaW50LgorICAgICAqLwogICAgIENvbG9yIGNvbG9yMjsKIAotICAgIC8qKiBUaGUgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IHBvaW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgc3RhcnQgcG9pbnQuCisgICAgICovCiAgICAgUG9pbnQyRCBwb2ludDE7CiAKLSAgICAvKiogVGhlIGxvY2F0aW9uIG9mIHRoZSBlbmQgcG9pbnQuICovCisgICAgLyoqCisgICAgICogVGhlIGxvY2F0aW9uIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICovCiAgICAgUG9pbnQyRCBwb2ludDI7CiAKLSAgICAvKiogVGhlIGluZGljYXRvciBvZiBjeWNsZSBmaWxsaW5nLiBJZiBUUlVFIGZpbGxpbmcgCi0gICAgICogcmVwZWF0ZWQgb3V0c2lkZSBwb2ludHMgc3RyaXBlLCBpZiBGQUxTRSBzb2xpZCBjb2xvciBmaWxsaW5nIG91dHNpZGUuICovCisgICAgLyoqCisgICAgICogVGhlIGluZGljYXRvciBvZiBjeWNsZSBmaWxsaW5nLiBJZiBUUlVFIGZpbGxpbmcgcmVwZWF0ZWQgb3V0c2lkZSBwb2ludHMKKyAgICAgKiBzdHJpcGUsIGlmIEZBTFNFIHNvbGlkIGNvbG9yIGZpbGxpbmcgb3V0c2lkZS4KKyAgICAgKi8KICAgICBib29sZWFuIGN5Y2xpYzsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBHcmFkaWVudFBhaW50IHdpdGggY3ljbGljIG9yIGFjeWNsaWMgbW9kZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcG9pbnQxIHRoZSBmaXJzdCBzcGVjaWZpZWQgcG9pbnQuCi0gICAgICogQHBhcmFtIGNvbG9yMSB0aGUgQ29sb3Igb2YgdGhlIGZpcnN0IHNwZWNpZmllZCBwb2ludC4gCi0gICAgICogQHBhcmFtIHBvaW50MiB0aGUgc2Vjb25kIHNwZWNpZmllZCBwb2ludC4KLSAgICAgKiBAcGFyYW0gY29sb3IyIHRoZSBDb2xvciBvZiB0aGUgc2Vjb25kIHNwZWNpZmllZCBwb2ludC4KLSAgICAgKiBAcGFyYW0gY3ljbGljIHRoZSBjeWNsaWMgbW9kZSAtIHRydWUgaWYgdGhlIGdyYWRpZW50IHBhdHRlcm4gc2hvdWxkIGN5Y2xlIAotICAgICAqIHJlcGVhdGVkbHkgYmV0d2VlbiB0aGUgdHdvIGNvbG9yczsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBwb2ludDEKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBzcGVjaWZpZWQgcG9pbnQuCisgICAgICogQHBhcmFtIGNvbG9yMQorICAgICAqICAgICAgICAgICAgdGhlIENvbG9yIG9mIHRoZSBmaXJzdCBzcGVjaWZpZWQgcG9pbnQuCisgICAgICogQHBhcmFtIHBvaW50MgorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBzcGVjaWZpZWQgcG9pbnQuCisgICAgICogQHBhcmFtIGNvbG9yMgorICAgICAqICAgICAgICAgICAgdGhlIENvbG9yIG9mIHRoZSBzZWNvbmQgc3BlY2lmaWVkIHBvaW50LgorICAgICAqIEBwYXJhbSBjeWNsaWMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjeWNsaWMgbW9kZSAtIHRydWUgaWYgdGhlIGdyYWRpZW50IHBhdHRlcm4gc2hvdWxkIGN5Y2xlCisgICAgICogICAgICAgICAgICByZXBlYXRlZGx5IGJldHdlZW4gdGhlIHR3byBjb2xvcnM7IGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KLSAgICBwdWJsaWMgR3JhZGllbnRQYWludChQb2ludDJEIHBvaW50MSwgQ29sb3IgY29sb3IxLCBQb2ludDJEIHBvaW50MiwKLSAgICAgICAgICAgIENvbG9yIGNvbG9yMiwgYm9vbGVhbiBjeWNsaWMpIHsKKyAgICBwdWJsaWMgR3JhZGllbnRQYWludChQb2ludDJEIHBvaW50MSwgQ29sb3IgY29sb3IxLCBQb2ludDJEIHBvaW50MiwgQ29sb3IgY29sb3IyLCBib29sZWFuIGN5Y2xpYykgewogICAgICAgICBpZiAocG9pbnQxID09IG51bGwgfHwgcG9pbnQyID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGF3dC42RD1Qb2ludCBpcyBudWxsCiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNkQiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTkzLDE3ICsxMDgsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgR3JhZGllbnRQYWludCB3aXRoIGN5Y2xpYyBvciBhY3ljbGljIG1vZGU7Ci0gICAgICogcG9pbnRzIGFyZSBzcGVjaWZpZWQgYnkgY29vcmRpbmF0ZXMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEdyYWRpZW50UGFpbnQgd2l0aCBjeWNsaWMgb3IgYWN5Y2xpYyBtb2RlOyBwb2ludHMgYXJlCisgICAgICogc3BlY2lmaWVkIGJ5IGNvb3JkaW5hdGVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludC4KLSAgICAgKiBAcGFyYW0geTEgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuCi0gICAgICogQHBhcmFtIGNvbG9yMSB0aGUgY29sb3Igb2YgdGhlIGZpcnN0IHBvaW50LgotICAgICAqIEBwYXJhbSB4MiB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuCi0gICAgICogQHBhcmFtIHkyIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC4KLSAgICAgKiBAcGFyYW0gY29sb3IyIHRoZSBjb2xvciBvZiB0aGUgc2Vjb25kIHBvaW50LgotICAgICAqIEBwYXJhbSBjeWNsaWMgdGhlIGN5Y2xpYyBtb2RlIC0gdHJ1ZSBpZiB0aGUgZ3JhZGllbnQgcGF0dGVybiBzaG91bGQgY3ljbGUgCi0gICAgICogcmVwZWF0ZWRseSBiZXR3ZWVuIHRoZSB0d28gY29sb3JzOyBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50LgorICAgICAqIEBwYXJhbSBjb2xvcjEKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xvciBvZiB0aGUgZmlyc3QgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuCisgICAgICogQHBhcmFtIGNvbG9yMgorICAgICAqICAgICAgICAgICAgdGhlIGNvbG9yIG9mIHRoZSBzZWNvbmQgcG9pbnQuCisgICAgICogQHBhcmFtIGN5Y2xpYworICAgICAqICAgICAgICAgICAgdGhlIGN5Y2xpYyBtb2RlIC0gdHJ1ZSBpZiB0aGUgZ3JhZGllbnQgcGF0dGVybiBzaG91bGQgY3ljbGUKKyAgICAgKiAgICAgICAgICAgIHJlcGVhdGVkbHkgYmV0d2VlbiB0aGUgdHdvIGNvbG9yczsgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBHcmFkaWVudFBhaW50KGZsb2F0IHgxLCBmbG9hdCB5MSwgQ29sb3IgY29sb3IxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIENvbG9yIGNvbG9yMiwKICAgICAgICAgICAgIGJvb2xlYW4gY3ljbGljKSB7CkBAIC0xMTEsMTUgKzEzMywyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBhY3ljbGljIEdyYWRpZW50UGFpbnQ7Ci0gICAgICogcG9pbnRzIGFyZSBzcGVjaWZpZWQgYnkgY29vcmRpbmF0ZXMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGFjeWNsaWMgR3JhZGllbnRQYWludDsgcG9pbnRzIGFyZSBzcGVjaWZpZWQgYnkKKyAgICAgKiBjb29yZGluYXRlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuCi0gICAgICogQHBhcmFtIHkxIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50LgotICAgICAqIEBwYXJhbSBjb2xvcjEgdGhlIGNvbG9yIG9mIHRoZSBmaXJzdCBwb2ludC4KLSAgICAgKiBAcGFyYW0geDIgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50LgotICAgICAqIEBwYXJhbSB5MiB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuCi0gICAgICogQHBhcmFtIGNvbG9yMiB0aGUgY29sb3Igb2YgdGhlIHNlY29uZCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuCisgICAgICogQHBhcmFtIGNvbG9yMQorICAgICAqICAgICAgICAgICAgdGhlIGNvbG9yIG9mIHRoZSBmaXJzdCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC4KKyAgICAgKiBAcGFyYW0gY29sb3IyCisgICAgICogICAgICAgICAgICB0aGUgY29sb3Igb2YgdGhlIHNlY29uZCBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgR3JhZGllbnRQYWludChmbG9hdCB4MSwgZmxvYXQgeTEsIENvbG9yIGNvbG9yMSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBDb2xvciBjb2xvcjIpIHsKICAgICAgICAgdGhpcyh4MSwgeTEsIGNvbG9yMSwgeDIsIHkyLCBjb2xvcjIsIGZhbHNlKTsKQEAgLTEyOCwyOSArMTU2LDM4IEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGFjeWNsaWMgR3JhZGllbnRQYWludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcG9pbnQxIHRoZSBmaXJzdCBzcGVjaWZpZWQgcG9pbnQuCi0gICAgICogQHBhcmFtIGNvbG9yMSB0aGUgQ29sb3Igb2YgdGhlIGZpcnN0IHNwZWNpZmllZCBwb2ludC4gCi0gICAgICogQHBhcmFtIHBvaW50MiB0aGUgc2Vjb25kIHNwZWNpZmllZCBwb2ludC4KLSAgICAgKiBAcGFyYW0gY29sb3IyIHRoZSBDb2xvciBvZiB0aGUgc2Vjb25kIHNwZWNpZmllZCBwb2ludC4KKyAgICAgKiBAcGFyYW0gcG9pbnQxCisgICAgICogICAgICAgICAgICB0aGUgZmlyc3Qgc3BlY2lmaWVkIHBvaW50LgorICAgICAqIEBwYXJhbSBjb2xvcjEKKyAgICAgKiAgICAgICAgICAgIHRoZSBDb2xvciBvZiB0aGUgZmlyc3Qgc3BlY2lmaWVkIHBvaW50LgorICAgICAqIEBwYXJhbSBwb2ludDIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgc3BlY2lmaWVkIHBvaW50LgorICAgICAqIEBwYXJhbSBjb2xvcjIKKyAgICAgKiAgICAgICAgICAgIHRoZSBDb2xvciBvZiB0aGUgc2Vjb25kIHNwZWNpZmllZCBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgR3JhZGllbnRQYWludChQb2ludDJEIHBvaW50MSwgQ29sb3IgY29sb3IxLCBQb2ludDJEIHBvaW50MiwgQ29sb3IgY29sb3IyKSB7CiAgICAgICAgIHRoaXMocG9pbnQxLCBjb2xvcjEsIHBvaW50MiwgY29sb3IyLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBQYWludENvbnRleHQgZm9yIGEgY29sb3IgcGF0dGVybiBnZW5lcmF0aW5nLiAKKyAgICAgKiBDcmVhdGVzIFBhaW50Q29udGV4dCBmb3IgYSBjb2xvciBwYXR0ZXJuIGdlbmVyYXRpbmcuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNtIHRoZSBDb2xvck1vZGVsIG9mIHRoZSBQYWludCBkYXRhLgotICAgICAqIEBwYXJhbSBkZXZpY2VCb3VuZHMgdGhlIGJvdW5kaW5nIFJlY3RhbmdsZSBvZiBncmFwaGljcyBwcmltaXRpdmVzCi0gICAgICogYmVpbmcgcmVuZGVyZWQgaW4gdGhlIGRldmljZSBzcGFjZS4gCi0gICAgICogQHBhcmFtIHVzZXJCb3VuZHMgdHRoZSBib3VuZGluZyBSZWN0YW5nbGUgb2YgZ3JhcGhpY3MgcHJpbWl0aXZlcwotICAgICAqIGJlaW5nIHJlbmRlcmVkIGluIHRoZSB1c2VyIHNwYWNlLiAKLSAgICAgKiBAcGFyYW0gdCB0aGUgQWZmaW5lVHJhbnNmb3JtIGZyb20gdXNlciBzcGFjZSBpbnRvIGRldmljZSBzcGFjZS4KLSAgICAgKiBAcGFyYW0gaGludHMgdGhlIFJyZW5kZXJpbmdIaW50cyBvYmplY3QuCi0gICAgICogCisgICAgICogQHBhcmFtIGNtCisgICAgICogICAgICAgICAgICB0aGUgQ29sb3JNb2RlbCBvZiB0aGUgUGFpbnQgZGF0YS4KKyAgICAgKiBAcGFyYW0gZGV2aWNlQm91bmRzCisgICAgICogICAgICAgICAgICB0aGUgYm91bmRpbmcgUmVjdGFuZ2xlIG9mIGdyYXBoaWNzIHByaW1pdGl2ZXMgYmVpbmcgcmVuZGVyZWQKKyAgICAgKiAgICAgICAgICAgIGluIHRoZSBkZXZpY2Ugc3BhY2UuCisgICAgICogQHBhcmFtIHVzZXJCb3VuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBib3VuZGluZyBSZWN0YW5nbGUgb2YgZ3JhcGhpY3MgcHJpbWl0aXZlcyBiZWluZyByZW5kZXJlZAorICAgICAqICAgICAgICAgICAgaW4gdGhlIHVzZXIgc3BhY2UuCisgICAgICogQHBhcmFtIHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBBZmZpbmVUcmFuc2Zvcm0gZnJvbSB1c2VyIHNwYWNlIGludG8gZGV2aWNlIHNwYWNlLgorICAgICAqIEBwYXJhbSBoaW50cworICAgICAqICAgICAgICAgICAgdGhlIFJyZW5kZXJpbmdIaW50cyBvYmplY3QuCiAgICAgICogQHJldHVybiB0aGUgUGFpbnRDb250ZXh0IGZvciBjb2xvciBwYXR0ZXJuIGdlbmVyYXRpbmcuCi0gICAgICogCi0gICAgICogQHNlZSBqYXZhLmF3dC5QYWludCNjcmVhdGVDb250ZXh0KGphdmEuYXd0LmltYWdlLkNvbG9yTW9kZWwsIGphdmEuYXd0LlJlY3RhbmdsZSwgamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRCwgamF2YS5hd3QuZ2VvbS5BZmZpbmVUcmFuc2Zvcm0sIGphdmEuYXd0LlJlbmRlcmluZ0hpbnRzKQorICAgICAqIEBzZWUgamF2YS5hd3QuUGFpbnQjY3JlYXRlQ29udGV4dChqYXZhLmF3dC5pbWFnZS5Db2xvck1vZGVsLAorICAgICAqICAgICAgamF2YS5hd3QuUmVjdGFuZ2xlLCBqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJELAorICAgICAqICAgICAgamF2YS5hd3QuZ2VvbS5BZmZpbmVUcmFuc2Zvcm0sIGphdmEuYXd0LlJlbmRlcmluZ0hpbnRzKQogICAgICAqLwogICAgIHB1YmxpYyBQYWludENvbnRleHQgY3JlYXRlQ29udGV4dChDb2xvck1vZGVsIGNtLCBSZWN0YW5nbGUgZGV2aWNlQm91bmRzLAogICAgICAgICAgICAgUmVjdGFuZ2xlMkQgdXNlckJvdW5kcywgQWZmaW5lVHJhbnNmb3JtIHQsIFJlbmRlcmluZ0hpbnRzIGhpbnRzKSB7CkBAIC0xNzgsNyArMjE1LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBmaXJzdCBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBQb2ludCBvYmplY3QgLSB0aGUgZmlyc3QgcG9pbnQuIAorICAgICAqIEByZXR1cm4gdGhlIFBvaW50IG9iamVjdCAtIHRoZSBmaXJzdCBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgUG9pbnQyRCBnZXRQb2ludDEoKSB7CiAgICAgICAgIHJldHVybiBwb2ludDE7CkBAIC0xOTcsNyArMjM0LDYgQEAKICAgICAgKiBHZXRzIHRoZSB0cmFuc3BhcmVuY3kgbW9kZSBmb3IgdGhlIEdyYWRpZW50UGFpbnQuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgdHJhbnNwYXJlbmN5IG1vZGUgZm9yIHRoZSBHcmFkaWVudFBhaW50LgotICAgICAqIAogICAgICAqIEBzZWUgamF2YS5hd3QuVHJhbnNwYXJlbmN5I2dldFRyYW5zcGFyZW5jeSgpCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRUcmFuc3BhcmVuY3koKSB7CkBAIC0yMDcsMTEgKzI0MywxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEdyYWRpZW50UGFpbnQgbW9kZTogdHJ1ZSBmb3IgY3ljbGljIG1vZGUsIGZhbHNlIGZvcgotICAgICAqIGFjeWNsaWMgbW9kZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBHcmFkaWVudFBhaW50IG1vZGU6IHRydWUgZm9yIGN5Y2xpYyBtb2RlLCBmYWxzZSBmb3IgYWN5Y2xpYworICAgICAqIG1vZGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBncmFkaWVudCBjeWNsZXMgcmVwZWF0ZWRseSBiZXR3ZWVuIHRoZSB0d28gY29sb3JzOyAKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBncmFkaWVudCBjeWNsZXMgcmVwZWF0ZWRseSBiZXR3ZWVuIHRoZSB0d28gY29sb3JzOworICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQ3ljbGljKCkgewogICAgICAgICByZXR1cm4gY3ljbGljOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0dyYXBoaWNzLmphdmEgYi9hd3QvamF2YS9hd3QvR3JhcGhpY3MuamF2YQppbmRleCBjMjBmNmJjLi4yZDZlNzlmIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvR3JhcGhpY3MuamF2YQorKysgYi9hd3QvamF2YS9hd3QvR3JhcGhpY3MuamF2YQpAQCAtMTgsMjYgKzE4LDI3IEBACiAgKiBAYXV0aG9yIEFsZXhleSBBLiBQZXRyZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIGltcG9ydCBqYXZhLmF3dC5pbWFnZS5JbWFnZU9ic2VydmVyOwogaW1wb3J0IGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3I7CiAKIC8qKgotICogVGhlIGFic3RyYWN0IEdyYXBoaWNzIGNsYXNzIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gZHJhdyBvbiBhIHNjcmVlbgotICogb3Igb3RoZXIgcmVuZGVyaW5nIHRhcmdldC4gVGhlcmUgYXJlIHNldmVyYWwgcHJvcGVydGllcyB3aGljaCAKLSAqIGRlZmluZSByZW5kZXJpbmcgb3B0aW9uczogb3JpZ2luIHBvaW50LCBjbGlwcGluZyBhcmVhLCBjb2xvciwgZm9udC4KLSAqIDxicj48YnI+Ci0gKiBUaGUgb3JpZ2luIHBvaW50IHNwZWNpZmllcyB0aGUgYmVnZ2luaW5nIG9mIHRoZSBjbGlwcGluZyBhcmVhIGNvb3JkaW5hdGUgCi0gKiBzeXN0ZW0uIEFsbCBjb29yZGluYXRlcyB1c2VkIGluIHJlbmRlcmluZyBvcGVyYXRpb25zIGFyZSBjb21wdXRlZCB3aXRoIAotICogcmVzcGVjdCB0byB0aGlzIHBvaW50LiBUaGUgY2xpcHBpbmcgYXJlYSBkZWZpbmVzIHRoZSBib3VuZGFyaWVzIHdoZXJlIAotICogcmVuZGVyaW5nIG9wZXJhdGlvbnMgY2FuIGJlIHBlcmZvcm1lZC4gUmVuZGVyaW5nIG9wZXJhdGlvbnMgY2FuJ3QgbW9kaWZ5IAotICogcGl4ZWxzIG91dHNpZGUgb2YgdGhlIGNsaXBwaW5nIGFyZWEuCi0gKiA8YnI+PGJyPgotICogVGhlIGRyYXcgYW5kIGZpbGwgbWV0aG9kcyBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gZHJhd2luZyBzaGFwZXMsIHRleHQsIAotICogaW1hZ2VzIHdpdGggc3BlY2lmaWVkIGZvbnQgYW5kIGNvbG9yIG9wdGlvbnMgaW4gdGhlIHNwZWNpZmllZCBwYXJ0IAotICogb2YgdGhlIHNjcmVlbi4KLSAqICAgIAorICogVGhlIGFic3RyYWN0IEdyYXBoaWNzIGNsYXNzIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gZHJhdyBvbiBhIHNjcmVlbiBvciBvdGhlcgorICogcmVuZGVyaW5nIHRhcmdldC4gVGhlcmUgYXJlIHNldmVyYWwgcHJvcGVydGllcyB3aGljaCBkZWZpbmUgcmVuZGVyaW5nCisgKiBvcHRpb25zOiBvcmlnaW4gcG9pbnQsIGNsaXBwaW5nIGFyZWEsIGNvbG9yLCBmb250LiA8YnI+CisgKiA8YnI+CisgKiBUaGUgb3JpZ2luIHBvaW50IHNwZWNpZmllcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjbGlwcGluZyBhcmVhIGNvb3JkaW5hdGUKKyAqIHN5c3RlbS4gQWxsIGNvb3JkaW5hdGVzIHVzZWQgaW4gcmVuZGVyaW5nIG9wZXJhdGlvbnMgYXJlIGNvbXB1dGVkIHdpdGgKKyAqIHJlc3BlY3QgdG8gdGhpcyBwb2ludC4gVGhlIGNsaXBwaW5nIGFyZWEgZGVmaW5lcyB0aGUgYm91bmRhcmllcyB3aGVyZQorICogcmVuZGVyaW5nIG9wZXJhdGlvbnMgY2FuIGJlIHBlcmZvcm1lZC4gUmVuZGVyaW5nIG9wZXJhdGlvbnMgY2FuJ3QgbW9kaWZ5CisgKiBwaXhlbHMgb3V0c2lkZSBvZiB0aGUgY2xpcHBpbmcgYXJlYS4gPGJyPgorICogPGJyPgorICogVGhlIGRyYXcgYW5kIGZpbGwgbWV0aG9kcyBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gZHJhd2luZyBzaGFwZXMsIHRleHQsIGltYWdlcworICogd2l0aCBzcGVjaWZpZWQgZm9udCBhbmQgY29sb3Igb3B0aW9ucyBpbiB0aGUgc3BlY2lmaWVkIHBhcnQgb2YgdGhlIHNjcmVlbi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcmFwaGljcyB7CiAKQEAgLTQ1LDcgKzQ2LDcgQEAKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBHcmFwaGljcy4gVGhpcyBjb25zdHJ1Y3RvciBpcyBkZWZhdWx0IGZvciBHcmFwaGljcyBhbmQKLSAgICAgKiBjYW4gbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gCisgICAgICogY2FuIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEdyYXBoaWNzKCkgewogICAgIH0KQEAgLTUzLDE5ICs1NCwyMiBAQAogICAgIC8vIFB1YmxpYyBtZXRob2RzCiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGUgR3JhcGhpY3Mgb2JqZWN0IHdpdGggYSBuZXcgb3JpZ2luIGFuZCBhIG5ldyAKLSAgICAgKiBzcGVjaWZpZWQgY2xpcCBhcmVhLiBUaGUgbmV3IGNsaXAgYXJlYSBpcyB0aGUgcmVjdGFuZ2xlIGRlZmluZWQgYnkgCi0gICAgICogdGhlIG9yaWdpbiBwb2ludCB3aXRoIGNvb3JkaW5hdGVzIFgsWSBhbmQgdGhlIGdpdmVuIHdpZHRoIGFuZCBoZWlnaHQuIAotICAgICAqIFRoZSBjb29yZGluYXRlcyBvZiBhbGwgc3Vic2VxdWVudCByZW5kZXJpbmcgb3BlcmF0aW9ucyB3aWxsIGJlIGNvbXB1dGVkCi0gICAgICogd2l0aCByZXNwZWN0IHRvIHRoZSBuZXcgb3JpZ2luIGFuZCBjYW4gYmUgcGVyZm9ybWVkIG9ubHkgd2l0aGluIHRoZSAKLSAgICAgKiByYW5nZSBvZiB0aGUgY2xpcHBpbmcgYXJlYSBkaW1lbnRpb25zLiAKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgb3JpZ2luYWwgcG9pbnQKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW5hbCBwb2ludAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgY2xpcHBpbmcgYXJlYQotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiBjbGlwcGluZyBhcmVhCisgICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhlIEdyYXBoaWNzIG9iamVjdCB3aXRoIGEgbmV3IG9yaWdpbiBhbmQgYSBuZXcKKyAgICAgKiBzcGVjaWZpZWQgY2xpcCBhcmVhLiBUaGUgbmV3IGNsaXAgYXJlYSBpcyB0aGUgcmVjdGFuZ2xlIGRlZmluZWQgYnkgdGhlCisgICAgICogb3JpZ2luIHBvaW50IHdpdGggY29vcmRpbmF0ZXMgWCxZIGFuZCB0aGUgZ2l2ZW4gd2lkdGggYW5kIGhlaWdodC4gVGhlCisgICAgICogY29vcmRpbmF0ZXMgb2YgYWxsIHN1YnNlcXVlbnQgcmVuZGVyaW5nIG9wZXJhdGlvbnMgd2lsbCBiZSBjb21wdXRlZCB3aXRoCisgICAgICogcmVzcGVjdCB0byB0aGUgbmV3IG9yaWdpbiBhbmQgY2FuIGJlIHBlcmZvcm1lZCBvbmx5IHdpdGhpbiB0aGUgcmFuZ2Ugb2YKKyAgICAgKiB0aGUgY2xpcHBpbmcgYXJlYSBkaW1lbnNpb25zLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEdyYXBoaWNzIG9iamVjdCB3aXRoIG5ldyBvcmlnaW4gcG9pbnQgYW5kIGNsaXBwaW5nIGFyZWEuIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW5hbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgb3JpZ2luYWwgcG9pbnQuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgY2xpcHBpbmcgYXJlYS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIGNsaXBwaW5nIGFyZWEuCisgICAgICogQHJldHVybiB0aGUgR3JhcGhpY3Mgb2JqZWN0IHdpdGggbmV3IG9yaWdpbiBwb2ludCBhbmQgY2xpcHBpbmcgYXJlYS4KICAgICAgKi8KICAgICBwdWJsaWMgR3JhcGhpY3MgY3JlYXRlKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgICAgICAgIEdyYXBoaWNzIHJlcyA9IGNyZWF0ZSgpOwpAQCAtNzUsMTggKzc5LDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRHJhd3MgdGhlIGhpZ2xpZ2h0ZWQgb3V0bGluZSBvZiBhIHJlY3RhbmdsZS4KKyAgICAgKiBEcmF3cyB0aGUgaGlnaGxpZ2h0ZWQgb3V0bGluZSBvZiBhIHJlY3RhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AgbGVmdCBjb3JuZXIuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHJhaXNlZCBhIGJvb2xlYW4gdmFsdWUgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHJlY3RhbmdsZSAKLSAgICAgKiBpcyBkcmF3biBhcyByYWlzZWQgb3IgaW5kZW50ZWQuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gcmFpc2VkCisgICAgICogICAgICAgICAgICBhIGJvb2xlYW4gdmFsdWUgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHJlY3RhbmdsZSBpcyBkcmF3bgorICAgICAqICAgICAgICAgICAgYXMgcmFpc2VkIG9yIGluZGVudGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRyYXczRFJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2xlYW4gcmFpc2VkKSB7CiAgICAgICAgIC8vIE5vdGU6IGxpZ2h0ZXIvZGFya2VyIGNvbG9ycyBzaG91bGQgYmUgdXNlZCB0byBkcmF3IDNkIHJlY3QuCi0gICAgICAgIC8vIFRoZSByZXN1bHRpbmcgcmVjdCBpcyAod2lkdGgrMSl4KGhlaWdodCsxKS4gU3Ryb2tlIGFuZCBwYWludCBhdHRyaWJ1dGVzIG9mCisgICAgICAgIC8vIFRoZSByZXN1bHRpbmcgcmVjdCBpcyAod2lkdGgrMSl4KGhlaWdodCsxKS4gU3Ryb2tlIGFuZCBwYWludAorICAgICAgICAvLyBhdHRyaWJ1dGVzIG9mCiAgICAgICAgIC8vIHRoZSBHcmFwaGljczJEIHNob3VsZCBiZSByZXNldCB0byB0aGUgZGVmYXVsdCB2YWx1ZXMuCiAgICAgICAgIC8vIGZpbGxSZWN0IGlzIHVzZWQgaW5zdGVhZCBvZiBkcmF3TGluZSB0byBieXBhc3Mgc3Ryb2tlCiAgICAgICAgIC8vIHJlc2V0L3NldCBhbmQgcmFzdGVyaXphdGlvbi4KQEAgLTEwMywzNiArMTEzLDQ2IEBACiAKICAgICAgICAgc2V0Q29sb3IoY29sb3JVcCk7CiAgICAgICAgIGZpbGxSZWN0KHgsIHksIHdpZHRoLCAxKTsKLSAgICAgICAgZmlsbFJlY3QoeCwgeSsxLCAxLCBoZWlnaHQpOworICAgICAgICBmaWxsUmVjdCh4LCB5ICsgMSwgMSwgaGVpZ2h0KTsKIAogICAgICAgICBzZXRDb2xvcihjb2xvckRvd24pOwotICAgICAgICBmaWxsUmVjdCh4K3dpZHRoLCB5LCAxLCBoZWlnaHQpOwotICAgICAgICBmaWxsUmVjdCh4KzEsIHkraGVpZ2h0LCB3aWR0aCwgMSk7CisgICAgICAgIGZpbGxSZWN0KHggKyB3aWR0aCwgeSwgMSwgaGVpZ2h0KTsKKyAgICAgICAgZmlsbFJlY3QoeCArIDEsIHkgKyBoZWlnaHQsIHdpZHRoLCAxKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEcmF3cyB0aGUgdGV4dCByZXByZXNlbnRlZCBieSBieXRlIGFycmF5LiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBjdXJyZW50IAorICAgICAqIERyYXdzIHRoZSB0ZXh0IHJlcHJlc2VudGVkIGJ5IGJ5dGUgYXJyYXkuIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGN1cnJlbnQKICAgICAgKiBmb250IGFuZCBjb2xvciBmb3IgcmVuZGVyaW5nLgogICAgICAqIAotICAgICAqIEBwYXJhbSBieXRlcyB0aGUgYnl0ZSBhcnJheSB3aGljaCBjb250YWlucyB0aGUgdGV4dCB0byBiZSBkcmF3bi4gCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgYnl0ZSBhcnJheSBvZiB0aGUgdGV4dCB0byBiZSBkcmF3bi4KLSAgICAgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgdGV4dCB0byBkcmF3LiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIHdoZXJlIHRoZSB0ZXh0IGlzIHRvIGJlIGRyYXduLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgd2hlcmUgdGhlIHRleHQgaXMgdG8gYmUgZHJhd24uCisgICAgICogQHBhcmFtIGJ5dGVzCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSB3aGljaCBjb250YWlucyB0aGUgdGV4dCB0byBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgYnl0ZSBhcnJheSBvZiB0aGUgdGV4dCB0byBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHRleHQgdG8gZHJhdy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dCBpcyB0byBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dCBpcyB0byBiZSBkcmF3bi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkcmF3Qnl0ZXMoYnl0ZVtdIGJ5dGVzLCBpbnQgb2ZmLCBpbnQgbGVuLCBpbnQgeCwgaW50IHkpIHsKICAgICAgICAgZHJhd1N0cmluZyhuZXcgU3RyaW5nKGJ5dGVzLCBvZmYsIGxlbiksIHgsIHkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIERyYXdzIHRoZSB0ZXh0IHJlcHJlc2VudGVkIGJ5IGNoYXJhY3RlciBhcnJheS4gVGhpcyBtZXRob2QgdXNlcyB0aGUgCisgICAgICogRHJhd3MgdGhlIHRleHQgcmVwcmVzZW50ZWQgYnkgY2hhcmFjdGVyIGFycmF5LiBUaGlzIG1ldGhvZCB1c2VzIHRoZQogICAgICAqIGN1cnJlbnQgZm9udCBhbmQgY29sb3IgZm9yIHJlbmRlcmluZy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2hhcnMgdGhlIGNoYXJhY3RlciBhcnJheS4gCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgY2hhcmFjdGVyIGFycmF5IG9mIHRoZSB0ZXh0IHRvIGJlIGRyYXduLgotICAgICAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdoaWNoIHdpbGwgYmUgZHJhd24uIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgd2hlcmUgdGhlIHRleHQgaXMgdG8gYmUgZHJhd24uCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dCBpcyB0byBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0gY2hhcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgYXJyYXkuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCB3aXRoaW4gdGhlIGNoYXJhY3RlciBhcnJheSBvZiB0aGUgdGV4dCB0byBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2hpY2ggd2lsbCBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dCBpcyB0byBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dCBpcyB0byBiZSBkcmF3bi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkcmF3Q2hhcnMoY2hhcltdIGNoYXJzLCBpbnQgb2ZmLCBpbnQgbGVuLCBpbnQgeCwgaW50IHkpIHsKICAgICAgICAgZHJhd1N0cmluZyhuZXcgU3RyaW5nKGNoYXJzLCBvZmYsIGxlbiksIHgsIHkpOwpAQCAtMTQxLDM3ICsxNjEsNTEgQEAKICAgICAvKioKICAgICAgKiBEcmF3cyB0aGUgb3V0bGluZSBvZiBhIHBvbHlnb24gd2hpY2ggaXMgZGVmaW5lZCBieSBQb2x5Z29uIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgUG9seWdvbiBvYmplY3QuCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBQb2x5Z29uIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkcmF3UG9seWdvbihQb2x5Z29uIHApIHsKICAgICAgICAgZHJhd1BvbHlnb24ocC54cG9pbnRzLCBwLnlwb2ludHMsIHAubnBvaW50cyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRHJhd3MgdGhlIHJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQgd2lkdGggYW5kIGxlbmd0aCBhbmQgdG9wIGxlZnQgCisgICAgICogRHJhd3MgdGhlIHJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQgd2lkdGggYW5kIGxlbmd0aCBhbmQgdG9wIGxlZnQKICAgICAgKiBjb3JuZXIgY29vcmRpbmF0ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRyYXdSZWN0KGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGludCBbXXhwb2ludHMgPSB7eCwgeCwgeCt3aWR0aCwgeCt3aWR0aH07Ci0gICAgICAgIGludCBbXXlwb2ludHMgPSB7eSwgeStoZWlnaHQsIHkraGVpZ2h0LCB5fTsKKyAgICAgICAgaW50W10geHBvaW50cyA9IHsKKyAgICAgICAgICAgICAgICB4LCB4LCB4ICsgd2lkdGgsIHggKyB3aWR0aAorICAgICAgICB9OworICAgICAgICBpbnRbXSB5cG9pbnRzID0geworICAgICAgICAgICAgICAgIHksIHkgKyBoZWlnaHQsIHkgKyBoZWlnaHQsIHkKKyAgICAgICAgfTsKIAogICAgICAgICBkcmF3UG9seWdvbih4cG9pbnRzLCB5cG9pbnRzLCA0KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGaWxscyB0aGUgaGlnbGlnaHRlZCBvdXRsaW5lIG9mIGEgcmVjdGFuZ2xlLgorICAgICAqIEZpbGxzIHRoZSBoaWdobGlnaHRlZCBvdXRsaW5lIG9mIGEgcmVjdGFuZ2xlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AgbGVmdCBjb3JuZXIuCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSByYWlzZWQgYSBib29sZWFuIHZhbHVlIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSByZWN0YW5nbGUgCi0gICAgICogaXMgZHJhd24gYXMgcmFpc2VkIG9yIGluZGVudGVkLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gcmFpc2VkCisgICAgICogICAgICAgICAgICBhIGJvb2xlYW4gdmFsdWUgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHJlY3RhbmdsZSBpcyBkcmF3bgorICAgICAqICAgICAgICAgICAgYXMgcmFpc2VkIG9yIGluZGVudGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGZpbGwzRFJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2xlYW4gcmFpc2VkKSB7CiAgICAgICAgIC8vIE5vdGU6IGxpZ2h0ZXIvZGFya2VyIGNvbG9ycyBzaG91bGQgYmUgdXNlZCB0byBkcmF3IDNkIHJlY3QuCkBAIC0xNzksNyArMjEzLDcgQEAKICAgICAgICAgLy8gU3Ryb2tlIGFuZCBwYWludCBhdHRyaWJ1dGVzIG9mIHRoZSBHcmFwaGljczJEIHNob3VsZCBiZSByZXNldAogICAgICAgICAvLyB0byB0aGUgZGVmYXVsdCB2YWx1ZXMuIGZpbGxSZWN0IGlzIHVzZWQgaW5zdGVhZCBvZiBkcmF3TGluZSB0bwogICAgICAgICAvLyBieXBhc3Mgc3Ryb2tlIHJlc2V0L3NldCBhbmQgbGluZSByYXN0ZXJpemF0aW9uLgotICAgICAgICAKKwogICAgICAgICBDb2xvciBjb2xvciA9IGdldENvbG9yKCk7CiAgICAgICAgIENvbG9yIGNvbG9yVXAsIGNvbG9yRG93bjsKICAgICAgICAgaWYgKHJhaXNlZCkgewpAQCAtMTk0LDIxICsyMjgsMjIgQEAKIAogICAgICAgICB3aWR0aC0tOwogICAgICAgICBoZWlnaHQtLTsKLSAgICAgICAgZmlsbFJlY3QoeCsxLCB5KzEsIHdpZHRoLTEsIGhlaWdodC0xKTsKKyAgICAgICAgZmlsbFJlY3QoeCArIDEsIHkgKyAxLCB3aWR0aCAtIDEsIGhlaWdodCAtIDEpOwogCiAgICAgICAgIHNldENvbG9yKGNvbG9yVXApOwogICAgICAgICBmaWxsUmVjdCh4LCB5LCB3aWR0aCwgMSk7Ci0gICAgICAgIGZpbGxSZWN0KHgsIHkrMSwgMSwgaGVpZ2h0KTsKKyAgICAgICAgZmlsbFJlY3QoeCwgeSArIDEsIDEsIGhlaWdodCk7CiAKICAgICAgICAgc2V0Q29sb3IoY29sb3JEb3duKTsKLSAgICAgICAgZmlsbFJlY3QoeCt3aWR0aCwgeSwgMSwgaGVpZ2h0KTsKLSAgICAgICAgZmlsbFJlY3QoeCsxLCB5K2hlaWdodCwgd2lkdGgsIDEpOworICAgICAgICBmaWxsUmVjdCh4ICsgd2lkdGgsIHksIDEsIGhlaWdodCk7CisgICAgICAgIGZpbGxSZWN0KHggKyAxLCB5ICsgaGVpZ2h0LCB3aWR0aCwgMSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogRmlsbHMgdGhlIHBvbHlnb24gd2l0aCB0aGUgY3VycmVudCBjb2xvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgUG9seWdvbiBvYmplY3QuCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBQb2x5Z29uIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBmaWxsUG9seWdvbihQb2x5Z29uIHApIHsKICAgICAgICAgZmlsbFBvbHlnb24ocC54cG9pbnRzLCBwLnlwb2ludHMsIHAubnBvaW50cyk7CkBAIC0yMjIsMTIgKzI1NywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJvdW5kcyBvZiB0aGUgY3VycmVudCBjbGlwcGluZyBhcmVhIGFzIGEgcmVjdGFuZ2xlIAotICAgICAqIGFuZCBjb3BpZXMgaXQgdG8gYW4gZXhpc3RpbmcgcmVjdGFuZ2xlLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gciBhIFJlY3RhbmdsZSBvYmplY3Qgd2hlcmUgdGhlIGN1cnJlbnQgY2xpcHBpbmcgYXJlYSAKLSAgICAgKiBib3VuZHMgYXJlIHRvIGJlIGNvcGllZC4KKyAgICAgKiBHZXRzIHRoZSBib3VuZHMgb2YgdGhlIGN1cnJlbnQgY2xpcHBpbmcgYXJlYSBhcyBhIHJlY3RhbmdsZSBhbmQgY29waWVzIGl0CisgICAgICogdG8gYW4gZXhpc3RpbmcgcmVjdGFuZ2xlLgogICAgICAqIAorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICBhIFJlY3RhbmdsZSBvYmplY3Qgd2hlcmUgdGhlIGN1cnJlbnQgY2xpcHBpbmcgYXJlYSBib3VuZHMgYXJlCisgICAgICogICAgICAgICAgICB0byBiZSBjb3BpZWQuCiAgICAgICogQHJldHVybiB0aGUgYm91bmRzIG9mIHRoZSBjdXJyZW50IGNsaXBwaW5nIGFyZWEuCiAgICAgICovCiAgICAgcHVibGljIFJlY3RhbmdsZSBnZXRDbGlwQm91bmRzKFJlY3RhbmdsZSByKSB7CkBAIC0yNDgsOCArMjgzLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBib3VuZHMgb2YgdGhlIGN1cnJlbnQgY2xpcHBpbmcgYXJlYSBhcyBhIHJlY3RhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgUmVjdGFuZ2xlIG9iamVjdCAKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgUmVjdGFuZ2xlIG9iamVjdC4KICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDbGlwQm91bmRzKCl9CiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTI1OCw5ICsyOTIsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZvbnQgbWV0cmljcyBvZiB0aGUgY3VycmVudCBmb250LiAKLSAgICAgKiBUaGUgZm9udCBtZXRyaWNzIG9iamVjdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVuZGVyaW5nIAotICAgICAqIG9mIGEgcGFydGljdWxhciBmb250LgorICAgICAqIEdldHMgdGhlIGZvbnQgbWV0cmljcyBvZiB0aGUgY3VycmVudCBmb250LiBUaGUgZm9udCBtZXRyaWNzIG9iamVjdAorICAgICAqIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZW5kZXJpbmcgb2YgYSBwYXJ0aWN1bGFyIGZvbnQuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgZm9udCBtZXRyaWNzIG9mIGN1cnJlbnQgZm9udC4KICAgICAgKi8KQEAgLTI2OSwxOSArMzAyLDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBpbnRlcnNlY3RzIHRoZSAKLSAgICAgKiBjdXJyZW50IGNsaXBwaW5nIGFyZWEuCi0gICAgICogIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgaW50ZXJzZWN0cyB0aGUgY3VycmVudAorICAgICAqIGNsaXBwaW5nIGFyZWEuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBpbnRlcnNlY3RzIHRoZSBjdXJyZW50IGNsaXBwaW5nIGFyZWEsIAotICAgICAqIG92ZXJ3aXNlIGZhbHNlLiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBpbnRlcnNlY3RzIHRoZSBjdXJyZW50IGNsaXBwaW5nCisgICAgICogICAgICAgICBhcmVhLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGl0Q2xpcChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICAvLyBUT0RPOiBDcmVhdGUgcGFja2FnZSBwcml2YXRlIG1ldGhvZCBSZWN0YW5nbGUuaW50ZXJzZWN0cyhpbnQsIGludCwgaW50LCBpbnQpOworICAgICAgICAvLyBUT0RPOiBDcmVhdGUgcGFja2FnZSBwcml2YXRlIG1ldGhvZCBSZWN0YW5nbGUuaW50ZXJzZWN0cyhpbnQsIGludCwKKyAgICAgICAgLy8gaW50LCBpbnQpOwogICAgICAgICByZXR1cm4gZ2V0Q2xpcEJvdW5kcygpLmludGVyc2VjdHMobmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KSk7CiAgICAgfQogCkBAIC0yOTksNDUgKzMzNiw1NiBAQAogICAgIC8vIEFic3RyYWN0IG1ldGhvZHMKIAogICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZS4gVGhpcyBtZXRob2QgZmlsbHMgc3BlY2lmaWVkIHJlY3RhbmdsZSAKLSAgICAgKiB3aXRoIGJhY2tncm91bmQgY29sb3IuICAKKyAgICAgKiBDbGVhcnMgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUuIFRoaXMgbWV0aG9kIGZpbGxzIHNwZWNpZmllZCByZWN0YW5nbGUKKyAgICAgKiB3aXRoIGJhY2tncm91bmQgY29sb3IuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsZWFyUmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAKICAgICAvKioKLSAgICAgKiBJbnRlcnNlY3RzIHRoZSBjdXJyZW50IGNsaXBwaW5nIGFyZWEgd2l0aCBhIG5ldyByZWN0YW5nbGUuIAotICAgICAqIElmIHRoZSBjdXJyZW50IGNsaXBwaW5nIGFyZWEgaXMgbm90IGRlZmluZWQsIHRoZSByZWN0YW5nbGUgCi0gICAgICogYmVjb21lcyBhIG5ldyBjbGlwcGluZyBhcmVhLiBSZW5kZXJpbmcgb3BlcmF0aW9ucyBhcmUgb25seSBhbGxvd2VkIAotICAgICAqIHdpdGhpbiB0aGUgbmV3IHRoZSBjbGlwcGluZyBhcmVhLiAgICAKLSAgICAgKiAgICAgICAgICAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgZm9yIGludGVyc2VjdGlvbi4gCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIGZvciBpbnRlcnNlY3Rpb24uCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIGZvciBpbnRlcnNlY3Rpb24uCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgZm9yIGludGVyc2VjdGlvbi4KKyAgICAgKiBJbnRlcnNlY3RzIHRoZSBjdXJyZW50IGNsaXBwaW5nIGFyZWEgd2l0aCBhIG5ldyByZWN0YW5nbGUuIElmIHRoZSBjdXJyZW50CisgICAgICogY2xpcHBpbmcgYXJlYSBpcyBub3QgZGVmaW5lZCwgdGhlIHJlY3RhbmdsZSBiZWNvbWVzIGEgbmV3IGNsaXBwaW5nIGFyZWEuCisgICAgICogUmVuZGVyaW5nIG9wZXJhdGlvbnMgYXJlIG9ubHkgYWxsb3dlZCB3aXRoaW4gdGhlIG5ldyB0aGUgY2xpcHBpbmcgYXJlYS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIGZvciBpbnRlcnNlY3Rpb24uCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBmb3IgaW50ZXJzZWN0aW9uLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgZm9yIGludGVyc2VjdGlvbi4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgZm9yIGludGVyc2VjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbGlwUmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAKICAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIHJlY3RhbmdsZSBhcmVhIHRvIGFub3RoZXIgYXJlYSBzcGVjaWZpZWQgYnkgCi0gICAgICogYSBkaXN0YW5jZSAoZHgsIGR5KSBmcm9tIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUncyBsb2NhdGlvbi4gCi0gICAgICogUG9zaXRpdmUgZHggYW5kIGR5IHZhbHVlcyBnaXZlIGEgbmV3IGxvY2F0aW9uIGRlZmluZWQgYnkgCi0gICAgICogdHJhbnNsYXRpb24gdG8gdGhlIHJpZ2h0IGFuZCBkb3duIGZyb20gdGhlIG9yaWdpbmFsIGxvY2F0aW9uLCAKLSAgICAgKiBuZWdhdGl2ZSBkeCBhbmQgZHkgdmFsdWVzIC0gdG8gdGhlIGxlZnQgYW5kIHVwLgotICAgICAqIDxicj48YnI+CisgICAgICogQ29waWVzIHRoZSByZWN0YW5nbGUgYXJlYSB0byBhbm90aGVyIGFyZWEgc3BlY2lmaWVkIGJ5IGEgZGlzdGFuY2UgKGR4LAorICAgICAqIGR5KSBmcm9tIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUncyBsb2NhdGlvbi4gUG9zaXRpdmUgZHggYW5kIGR5IHZhbHVlcworICAgICAqIGdpdmUgYSBuZXcgbG9jYXRpb24gZGVmaW5lZCBieSB0cmFuc2xhdGlvbiB0byB0aGUgcmlnaHQgYW5kIGRvd24gZnJvbSB0aGUKKyAgICAgKiBvcmlnaW5hbCBsb2NhdGlvbiwgbmVnYXRpdmUgZHggYW5kIGR5IHZhbHVlcyAtIHRvIHRoZSBsZWZ0IGFuZCB1cC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3ggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHdoaWNoIHdpbGwgYmUgY29waWVkLiAKLSAgICAgKiBAcGFyYW0gc3kgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHdoaWNoIHdpbGwgYmUgY29waWVkLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSB3aGljaCB3aWxsIGJlIGNvcGllZC4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB3aGljaCB3aWxsIGJlIGNvcGllZC4KLSAgICAgKiBAcGFyYW0gZHggdGhlIGhvcml6b250YWwgZGlzdGFuY2UgZnJvbSB0aGUgc291cmNlIHJlY3RhbmdsZSdzIAotICAgICAqIGxvY2F0aW9uIHRvIHRoZSBjb3B5J3MgbG9jYXRpb24uIAotICAgICAqIEBwYXJhbSBkeSB0aGUgdmVydGljYWwgZGlzdGFuY2UgZnJvbSB0aGUgc291cmNlIHJlY3RhbmdsZSdzIAotICAgICAqIGxvY2F0aW9uIHRvIHRoZSBjb3B5J3MgbG9jYXRpb24uIAorICAgICAqIEBwYXJhbSBzeAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHdoaWNoIHdpbGwgYmUgY29waWVkLgorICAgICAqIEBwYXJhbSBzeQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHdoaWNoIHdpbGwgYmUgY29waWVkLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgd2hpY2ggd2lsbCBiZSBjb3BpZWQuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIHdoaWNoIHdpbGwgYmUgY29waWVkLgorICAgICAqIEBwYXJhbSBkeAorICAgICAqICAgICAgICAgICAgdGhlIGhvcml6b250YWwgZGlzdGFuY2UgZnJvbSB0aGUgc291cmNlIHJlY3RhbmdsZSdzIGxvY2F0aW9uCisgICAgICogICAgICAgICAgICB0byB0aGUgY29weSdzIGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBkeQorICAgICAqICAgICAgICAgICAgdGhlIHZlcnRpY2FsIGRpc3RhbmNlIGZyb20gdGhlIHNvdXJjZSByZWN0YW5nbGUncyBsb2NhdGlvbiB0bworICAgICAqICAgICAgICAgICAgdGhlIGNvcHkncyBsb2NhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjb3B5QXJlYShpbnQgc3gsIGludCBzeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZHgsIGludCBkeSk7CiAKQEAgLTM0OSwyMTUgKzM5NywzMTQgQEAKICAgICBwdWJsaWMgYWJzdHJhY3QgR3JhcGhpY3MgY3JlYXRlKCk7CiAKICAgICAvKioKLSAgICAgKiBEaXNwb3NlcyBvZiB0aGUgR3JhcGhpY3MuIFRoaXMgR3JhcGhpY3Mgb2JqZWN0IGNhbiBub3QgYmUgdXNlZCBhZnRlciAKLSAgICAgKiBjYWxsaW5nIHRoaXMgbWV0aG9kLiAgCisgICAgICogRGlzcG9zZXMgb2YgdGhlIEdyYXBoaWNzLiBUaGlzIEdyYXBoaWNzIG9iamVjdCBjYW4gbm90IGJlIHVzZWQgYWZ0ZXIKKyAgICAgKiBjYWxsaW5nIHRoaXMgbWV0aG9kLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRpc3Bvc2UoKTsKIAogICAgIC8qKgotICAgICAqIERyYXdzIHRoZSBhcmMgY292ZXJpbmcgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgYW5kIHVzaW5nIHRoZSBjdXJyZW50IGNvbG9yLiAKLSAgICAgKiBUaGUgcmVjdGFuZ2xlIGlzIGRlZmluZWQgYnkgdGhlIG9yaWdpbiBwb2ludCAoWCwgWSkgYW5kIGRpbWVudGlvbnMgCi0gICAgICogKHdpZHRoIGFuZCBoZWlnaHQpLiBUaGUgYXJjIGNlbnRlciBpcyB0aGUgdGhlIGNlbnRlciBvZiBzcGVjaWZpZWQgcmVjdGFuZ2xlLiAKLSAgICAgKiBUaGUgYW5nbGUgb3JpZ2luIGlzIDMgbydjbG9jayBwb3NpdGlvbiwgdGhlIHBvc2l0aXZlIGFuZ2xlIGlzIGNvdW50ZWQgYXMgYSAKLSAgICAgKiBjb3VudGVyLWNsb2Nrd2lzZSByb3RhdGlvbiwgdGhlIG5lZ290aXZlIGFuZ2xlIGlzIGNvdW50ZWQgYXMgY2xvY2t3aXNlIHJvdGF0aW9uLiAgIAorICAgICAqIERyYXdzIHRoZSBhcmMgY292ZXJpbmcgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgYW5kIHVzaW5nIHRoZSBjdXJyZW50CisgICAgICogY29sb3IuIFRoZSByZWN0YW5nbGUgaXMgZGVmaW5lZCBieSB0aGUgb3JpZ2luIHBvaW50IChYLCBZKSBhbmQgZGltZW5zaW9ucworICAgICAqICh3aWR0aCBhbmQgaGVpZ2h0KS4gVGhlIGFyYyBjZW50ZXIgaXMgdGhlIHRoZSBjZW50ZXIgb2Ygc3BlY2lmaWVkCisgICAgICogcmVjdGFuZ2xlLiBUaGUgYW5nbGUgb3JpZ2luIGlzIDMgbydjbG9jayBwb3NpdGlvbiwgdGhlIHBvc2l0aXZlIGFuZ2xlIGlzCisgICAgICogY291bnRlZCBhcyBhIGNvdW50ZXItY2xvY2t3aXNlIHJvdGF0aW9uLCB0aGUgbmVnYXRpdmUgYW5nbGUgaXMgY291bnRlZCBhcworICAgICAqIGNsb2Nrd2lzZSByb3RhdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBvcmlnaW4gY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHdoaWNoIHNjYWxlcyB0aGUgYXJjLiAKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBvcmlnaW4gY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHdoaWNoIHNjYWxlcyB0aGUgYXJjLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSB3aGljaCBzY2FsZXMgdGhlIGFyYy4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB3aGljaCBzY2FsZXMgdGhlIGFyYy4KLSAgICAgKiBAcGFyYW0gc2Egc3RhcnQgYW5nbGUgLSB0aGUgb3JpZ2luIGFuZ2xlIG9mIGFyYy4KLSAgICAgKiBAcGFyYW0gZWEgYXJjIGFuZ2xlIC0gdGhlIGFuZ3VsYXIgYXJjIHZhbHVlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBhbmdsZS4gCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIG9yaWdpbiBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBhcmMuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIG9yaWdpbiBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBhcmMuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSB3aGljaCBzY2FsZXMgdGhlIGFyYy4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBhcmMuCisgICAgICogQHBhcmFtIHNhCisgICAgICogICAgICAgICAgICBzdGFydCBhbmdsZSAtIHRoZSBvcmlnaW4gYW5nbGUgb2YgYXJjLgorICAgICAqIEBwYXJhbSBlYQorICAgICAqICAgICAgICAgICAgYXJjIGFuZ2xlIC0gdGhlIGFuZ3VsYXIgYXJjIHZhbHVlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkcmF3QXJjKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2EsIGludCBlYSk7CiAKICAgICAvKioKLSAgICAgKiBEcmF3cyB0aGUgc3BlY2lmaWVkIGltYWdlIHdpdGggdGhlIGRlZmluZWQgYmFja2dyb3VuZCBjb2xvci4gCi0gICAgICogVGhlIHRvcCBsZWZ0IGNvcm5lciBvZiBpbWFnZSB3aWxsIGJlIGRyYXduIGF0IHBvaW50ICh4LCB5KSAKLSAgICAgKiBpbiBjdXJyZW50IGNvb3JkaW5hdGUgc3lzdGVtLiBUaGUgaW1hZ2UgbG9hZGluZyBwcm9jZXNzIG5vdGlmaWVzIHRoZQotICAgICAqIHNwZWNpZmllZCBJbWFnZSBPYnNlcnZlci4gVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBpbWFnZQotICAgICAqIGhhcyBsb2FkZWQsIG92ZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuICAgICAgIAorICAgICAqIERyYXdzIHRoZSBzcGVjaWZpZWQgaW1hZ2Ugd2l0aCB0aGUgZGVmaW5lZCBiYWNrZ3JvdW5kIGNvbG9yLiBUaGUgdG9wIGxlZnQKKyAgICAgKiBjb3JuZXIgb2YgaW1hZ2Ugd2lsbCBiZSBkcmF3biBhdCBwb2ludCAoeCwgeSkgaW4gY3VycmVudCBjb29yZGluYXRlCisgICAgICogc3lzdGVtLiBUaGUgaW1hZ2UgbG9hZGluZyBwcm9jZXNzIG5vdGlmaWVzIHRoZSBzcGVjaWZpZWQgSW1hZ2UgT2JzZXJ2ZXIuCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBpbWFnZSBoYXMgbG9hZGVkLCBvdGhlcndpc2UgaXQgcmV0dXJucworICAgICAqIGZhbHNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWcgdGhlIGltYWdlIHdoaWNoIHdpbGwgYmUgZHJhd24uIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGltYWdlIHRvcCBsZWZ0IGNvcm5lci4gCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgaW1hZ2UgdG9wIGxlZnQgY29ybmVyLiAKLSAgICAgKiBAcGFyYW0gYmdjb2xvciB0aGUgYmFja2dyb3VuZCBjb2xvci4KLSAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCBhYm91dCBpbWFnZSBsb2FkaW5nIHByb2Nlc3MuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBsb2FkaW5nIGltYWdlIGlzIHN1Y2Nlc3NmdWwgb3IgaW1hZ2UgaXMgbnVsbCwgb3Zlcndpc2UgZmFsc2UuCisgICAgICogQHBhcmFtIGltZworICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIHdoaWNoIHdpbGwgYmUgZHJhd24uCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGltYWdlIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgaW1hZ2UgdG9wIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSBiZ2NvbG9yCisgICAgICogICAgICAgICAgICB0aGUgYmFja2dyb3VuZCBjb2xvci4KKyAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZU9ic2VydmVyIG9iamVjdCB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQgYWJvdXQgaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIGxvYWRpbmcgcHJvY2Vzcy4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGxvYWRpbmcgaW1hZ2UgaXMgc3VjY2Vzc2Z1bCBvciBpbWFnZSBpcyBudWxsLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGRyYXdJbWFnZShJbWFnZSBpbWcsIGludCB4LCBpbnQgeSwgQ29sb3IgYmdjb2xvciwgSW1hZ2VPYnNlcnZlciBvYnNlcnZlcik7CiAKICAgICAvKioKLSAgICAgKiBEcmF3cyB0aGUgc3BlY2lmaWVkIGltYWdlLiAKLSAgICAgKiBUaGUgdG9wIGxlZnQgY29ybmVyIG9mIGltYWdlIHdpbGwgYmUgZHJhd24gYXQgcG9pbnQgKHgsIHkpIAotICAgICAqIGluIGN1cnJlbnQgY29vcmRpbmF0ZSBzeXN0ZW0uIFRoZSBpbWFnZSBsb2FkaW5nIHByb2Nlc3Mgbm90aWZpZXMgdGhlCi0gICAgICogc3BlY2lmaWVkIEltYWdlIE9ic2VydmVyLiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIGltYWdlCi0gICAgICogaGFzIGxvYWRlZCwgb3Zlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4gCisgICAgICogRHJhd3MgdGhlIHNwZWNpZmllZCBpbWFnZS4gVGhlIHRvcCBsZWZ0IGNvcm5lciBvZiBpbWFnZSB3aWxsIGJlIGRyYXduIGF0CisgICAgICogcG9pbnQgKHgsIHkpIGluIGN1cnJlbnQgY29vcmRpbmF0ZSBzeXN0ZW0uIFRoZSBpbWFnZSBsb2FkaW5nIHByb2Nlc3MKKyAgICAgKiBub3RpZmllcyB0aGUgc3BlY2lmaWVkIEltYWdlIE9ic2VydmVyLiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlCisgICAgICogaW1hZ2UgaGFzIGxvYWRlZCwgb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltZyB0aGUgaW1hZ2Ugd2hpY2ggd2lsbCBiZSBkcmF3bi4gCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgaW1hZ2UgdG9wIGxlZnQgY29ybmVyLiAKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBpbWFnZSB0b3AgbGVmdCBjb3JuZXIuIAotICAgICAqIEBwYXJhbSBvYnNlcnZlciB0aGUgSW1hZ2VPYnNlcnZlciBvYmplY3Qgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkIGFib3V0IGltYWdlIGxvYWRpbmcgcHJvY2Vzcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGxvYWRpbmcgaW1hZ2UgaXMgc3VjY2Vzc2Z1bCBvciBpbWFnZSBpcyBudWxsLCBvdmVyd2lzZSBmYWxzZS4KKyAgICAgKiBAcGFyYW0gaW1nCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2Ugd2hpY2ggd2lsbCBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgaW1hZ2UgdG9wIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBpbWFnZSB0b3AgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIG9ic2VydmVyCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VPYnNlcnZlciBvYmplY3Qgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkIGFib3V0IGltYWdlCisgICAgICogICAgICAgICAgICBsb2FkaW5nIHByb2Nlc3MuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBsb2FkaW5nIGltYWdlIGlzIHN1Y2Nlc3NmdWwgb3IgaW1hZ2UgaXMgbnVsbCwgb3RoZXJ3aXNlCisgICAgICogICAgICAgICBmYWxzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBkcmF3SW1hZ2UoSW1hZ2UgaW1nLCBpbnQgeCwgaW50IHksIEltYWdlT2JzZXJ2ZXIgb2JzZXJ2ZXIpOwogCiAgICAgLyoqCi0gICAgICogU2NhbGVzIHRoZSBzcGVjaWZpZWQgaW1hZ2UgdG8gZml0IGluIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGFuZCAKLSAgICAgKiBkcmF3cyBpdCB3aXRoIHRoZSBkZWZpbmVkIGJhY2tncm91bmQgY29sb3IuIFRoZSB0b3AgbGVmdCBjb3JuZXIgCi0gICAgICogb2YgdGhlIGltYWdlIHdpbGwgYmUgZHJhd24gYXQgdGhlIHBvaW50ICh4LCB5KSBpbiBjdXJyZW50IGNvb3JkaW5hdGUgCi0gICAgICogc3lzdGVtLiBUaGUgbm9uLW9wYXF1ZSBwaXhlbHMgd2lsbCBiZSBkcmF3biBpbiB0aGUgYmFja2dyb3VuZCBjb2xvci4gCi0gICAgICogVGhlIGltYWdlIGxvYWRpbmcgcHJvY2VzcyBub3RpZmllcyB0aGUgc3BlY2lmaWVkIEltYWdlIE9ic2VydmVyLiAKLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIGltYWdlIGhhcyBsb2FkZWQsIG92ZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuIAorICAgICAqIFNjYWxlcyB0aGUgc3BlY2lmaWVkIGltYWdlIHRvIGZpdCBpbiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBhbmQgZHJhd3MgaXQKKyAgICAgKiB3aXRoIHRoZSBkZWZpbmVkIGJhY2tncm91bmQgY29sb3IuIFRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGltYWdlIHdpbGwKKyAgICAgKiBiZSBkcmF3biBhdCB0aGUgcG9pbnQgKHgsIHkpIGluIGN1cnJlbnQgY29vcmRpbmF0ZSBzeXN0ZW0uIFRoZSBub24tb3BhcXVlCisgICAgICogcGl4ZWxzIHdpbGwgYmUgZHJhd24gaW4gdGhlIGJhY2tncm91bmQgY29sb3IuIFRoZSBpbWFnZSBsb2FkaW5nIHByb2Nlc3MKKyAgICAgKiBub3RpZmllcyB0aGUgc3BlY2lmaWVkIEltYWdlIE9ic2VydmVyLiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlCisgICAgICogaW1hZ2UgaGFzIGxvYWRlZCwgb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltZyB0aGUgaW1hZ2Ugd2hpY2ggd2lsbCBiZSBkcmF3bi4KLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBpbWFnZSdzIHRvcCBsZWZ0IGNvcm5lci4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBpbWFnZSdzIHRvcCBsZWZ0IGNvcm5lci4gCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBpbWFnZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlIHdoaWNoIHNjYWxlcyB0aGUgaW1hZ2UuCi0gICAgICogQHBhcmFtIGJnY29sb3IgdGhlIGJhY2tncm91bmQgY29sb3IuCi0gICAgICogQHBhcmFtIG9ic2VydmVyIHRoZSBJbWFnZU9ic2VydmVyIG9iamVjdCB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQgYWJvdXQgaW1hZ2UgbG9hZGluZyBwcm9jZXNzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgbG9hZGluZyBpbWFnZSBpcyBzdWNjZXNzZnVsIG9yIGltYWdlIGlzIG51bGwsIG92ZXJ3aXNlIGZhbHNlLgorICAgICAqIEBwYXJhbSBpbWcKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSB3aGljaCB3aWxsIGJlIGRyYXduLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBpbWFnZSdzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgaW1hZ2UncyB0b3AgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlIHdoaWNoIHNjYWxlcyB0aGUgaW1hZ2UuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gYmdjb2xvcgorICAgICAqICAgICAgICAgICAgdGhlIGJhY2tncm91bmQgY29sb3IuCisgICAgICogQHBhcmFtIG9ic2VydmVyCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VPYnNlcnZlciBvYmplY3Qgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkIGFib3V0IGltYWdlCisgICAgICogICAgICAgICAgICBsb2FkaW5nIHByb2Nlc3MuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBsb2FkaW5nIGltYWdlIGlzIHN1Y2Nlc3NmdWwgb3IgaW1hZ2UgaXMgbnVsbCwgb3RoZXJ3aXNlCisgICAgICogICAgICAgICBmYWxzZS4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBkcmF3SW1hZ2UoSW1hZ2UgaW1nLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgQ29sb3IgYmdjb2xvciwgSW1hZ2VPYnNlcnZlciBvYnNlcnZlcik7CisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZHJhd0ltYWdlKEltYWdlIGltZywgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICBDb2xvciBiZ2NvbG9yLCBJbWFnZU9ic2VydmVyIG9ic2VydmVyKTsKIAogICAgIC8qKgotICAgICAqIFNjYWxlcyB0aGUgc3BlY2lmaWVkIGltYWdlIHRvIGZpdCBpbiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBhbmQgCi0gICAgICogZHJhd3MgaXQuIFRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGltYWdlIHdpbGwgYmUgZHJhd24gYXQgdGhlIAotICAgICAqIHBvaW50ICh4LCB5KSBpbiBjdXJyZW50IGNvb3JkaW5hdGUgc3lzdGVtLiBUaGUgaW1hZ2UgbG9hZGluZyBwcm9jZXNzIAotICAgICAqIG5vdGlmaWVzIHRoZSBzcGVjaWZpZWQgSW1hZ2UgT2JzZXJ2ZXIuIAotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgaW1hZ2UgaGFzIGxvYWRlZCwgb3Zlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4gCisgICAgICogU2NhbGVzIHRoZSBzcGVjaWZpZWQgaW1hZ2UgdG8gZml0IGluIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGFuZCBkcmF3cworICAgICAqIGl0LiBUaGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBpbWFnZSB3aWxsIGJlIGRyYXduIGF0IHRoZSBwb2ludCAoeCwgeSkgaW4KKyAgICAgKiBjdXJyZW50IGNvb3JkaW5hdGUgc3lzdGVtLiBUaGUgaW1hZ2UgbG9hZGluZyBwcm9jZXNzIG5vdGlmaWVzIHRoZQorICAgICAqIHNwZWNpZmllZCBJbWFnZSBPYnNlcnZlci4gVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBpbWFnZSBoYXMKKyAgICAgKiBsb2FkZWQsIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWcgdGhlIGltYWdlIHdoaWNoIHdpbGwgYmUgZHJhd24uCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgaW1hZ2UgdG9wIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGltYWdlIHRvcCBsZWZ0IGNvcm5lci4gCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBpbWFnZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlIHdoaWNoIHNjYWxlcyB0aGUgaW1hZ2UuCi0gICAgICogQHBhcmFtIG9ic2VydmVyIHRoZSBJbWFnZU9ic2VydmVyIG9iamVjdCB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQgYWJvdXQgaW1hZ2UgbG9hZGluZyBwcm9jZXNzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgbG9hZGluZyBpbWFnZSBpcyBzdWNjZXNzZnVsIG9yIGltYWdlIGlzIG51bGwsIG92ZXJ3aXNlIGZhbHNlLgorICAgICAqIEBwYXJhbSBpbWcKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSB3aGljaCB3aWxsIGJlIGRyYXduLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBpbWFnZSB0b3AgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGltYWdlIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZSB3aGljaCBzY2FsZXMgdGhlIGltYWdlLgorICAgICAqIEBwYXJhbSBvYnNlcnZlcgorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCBhYm91dCBpbWFnZQorICAgICAqICAgICAgICAgICAgbG9hZGluZyBwcm9jZXNzLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgbG9hZGluZyBpbWFnZSBpcyBzdWNjZXNzZnVsIG9yIGltYWdlIGlzIG51bGwsIG90aGVyd2lzZQorICAgICAqICAgICAgICAgZmFsc2UuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZHJhd0ltYWdlKEltYWdlIGltZywgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEltYWdlT2JzZXJ2ZXIgb2JzZXJ2ZXIpOworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGRyYXdJbWFnZShJbWFnZSBpbWcsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgSW1hZ2VPYnNlcnZlciBvYnNlcnZlcik7CiAKICAgICAvKioKLSAgICAgKiBTY2FsZXMgdGhlIHNwZWNpZmllZCBhcmVhIG9mIHRoZSBzcGVjaWZpZWQgaW1hZ2UgdG8gZml0IGluIHRoZSByZWN0YW5nbGUgYXJlYSAKLSAgICAgKiBkZWZpbmVkIGJ5IGl0cyBjb3JuZXJzIGNvb3JkaW5hdGVzIGFuZCBkcmF3cyB0aGUgc3ViLWltYWdlIHdpdGggdGhlIHNwZWNpZmllZCAKLSAgICAgKiBiYWNrZ3JvdW5kIGNvbG9yLiBUaGUgc3ViLWltYWdlIHRvIGJlIGRyYXduIGlzIGRlZmluZWQgYnkgaXRzIHRvcCBsZWZ0IAotICAgICAqIGNvcm5lciBjb29yZGluYXRlcyAoc3gxLCBzeTEpIGFuZCBib3R0b20gcmlnaHQgY29ybmVyIGNvb3JkaW5hdGVzIChzeDIsIHN5MikKLSAgICAgKiBjb21wdXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIG9yaWdpbiAodG9wIGxlZnQgY29ybmVyKSBvZiB0aGUgc291cmNlIGltYWdlLgotICAgICAqIFRoZSBub24gb3BhcXVlIHBpeGVscyB3aWxsIGJlIGRyYXduIGluIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLiBUaGUgCi0gICAgICogaW1hZ2UgbG9hZGluZyBwcm9jZXNzIG5vdGlmaWVzIHNwZWNpZmllZCBJbWFnZSBPYnNlcnZlci4gCi0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBpbWFnZQotICAgICAqIGhhcyBsb2FkZWQsIG92ZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuIAorICAgICAqIFNjYWxlcyB0aGUgc3BlY2lmaWVkIGFyZWEgb2YgdGhlIHNwZWNpZmllZCBpbWFnZSB0byBmaXQgaW4gdGhlIHJlY3RhbmdsZQorICAgICAqIGFyZWEgZGVmaW5lZCBieSBpdHMgY29ybmVycyBjb29yZGluYXRlcyBhbmQgZHJhd3MgdGhlIHN1Yi1pbWFnZSB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yLiBUaGUgc3ViLWltYWdlIHRvIGJlIGRyYXduIGlzIGRlZmluZWQgYnkgaXRzCisgICAgICogdG9wIGxlZnQgY29ybmVyIGNvb3JkaW5hdGVzIChzeDEsIHN5MSkgYW5kIGJvdHRvbSByaWdodCBjb3JuZXIKKyAgICAgKiBjb29yZGluYXRlcyAoc3gyLCBzeTIpIGNvbXB1dGVkIHdpdGggcmVzcGVjdCB0byB0aGUgb3JpZ2luICh0b3AgbGVmdAorICAgICAqIGNvcm5lcikgb2YgdGhlIHNvdXJjZSBpbWFnZS4gVGhlIG5vbiBvcGFxdWUgcGl4ZWxzIHdpbGwgYmUgZHJhd24gaW4gdGhlCisgICAgICogYmFja2dyb3VuZCBjb2xvci4gVGhlIGltYWdlIGxvYWRpbmcgcHJvY2VzcyBub3RpZmllcyBzcGVjaWZpZWQgSW1hZ2UKKyAgICAgKiBPYnNlcnZlci4gVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBpbWFnZSBoYXMgbG9hZGVkLCBvdGhlcndpc2UgaXQKKyAgICAgKiByZXR1cm5zIGZhbHNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWcgdGhlIGltYWdlIHdoaWNoIHdpbGwgYmUgZHJhd24uCi0gICAgICogQHBhcmFtIGR4MSB0aGUgWCB0b3AgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlIGFyZWEuIAotICAgICAqIEBwYXJhbSBkeTEgdGhlIFkgdG9wIGxlZnQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZSBhcmVhLgotICAgICAqIEBwYXJhbSBkeDIgdGhlIFggYm90dG9tIHJpZ2h0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUgYXJlYS4KLSAgICAgKiBAcGFyYW0gZHkyIHRoZSBZIGJvdHRvbSByaWdodCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlIGFyZWEuCi0gICAgICogQHBhcmFtIHN4MSB0aGUgWCB0b3AgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBiZSBkcmF3biB3aXRoaW4gdGhlIHNvdXJjZSBpbWFnZS4KLSAgICAgKiBAcGFyYW0gc3kxIHRoZSBZIHRvcCBsZWZ0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIGJlIGRyYXduIHdpdGhpbiB0aGUgc291cmNlIGltYWdlLgotICAgICAqIEBwYXJhbSBzeDIgdGhlIFggYm90dG9tIHJpZ2h0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIGJlIGRyYXduIHdpdGhpbiB0aGUgc291cmNlIGltYWdlLgotICAgICAqIEBwYXJhbSBzeTIgdGhlIFkgYm90dG9tIHJpZ2h0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIGJlIGRyYXduIHdpdGhpbiB0aGUgc291cmNlIGltYWdlLgotICAgICAqIEBwYXJhbSBiZ2NvbG9yIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLgotICAgICAqIEBwYXJhbSBvYnNlcnZlciB0aGUgSW1hZ2VPYnNlcnZlciBvYmplY3Qgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkIGFib3V0IGltYWdlIGxvYWRpbmcgcHJvY2Vzcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGxvYWRpbmcgaW1hZ2UgaXMgc3VjY2Vzc2Z1bCBvciBpbWFnZSBpcyBudWxsLCBvdmVyd2lzZSBmYWxzZS4KKyAgICAgKiBAcGFyYW0gaW1nCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2Ugd2hpY2ggd2lsbCBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0gZHgxCisgICAgICogICAgICAgICAgICB0aGUgWCB0b3AgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlCisgICAgICogICAgICAgICAgICBhcmVhLgorICAgICAqIEBwYXJhbSBkeTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIHRvcCBsZWZ0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUKKyAgICAgKiAgICAgICAgICAgIGFyZWEuCisgICAgICogQHBhcmFtIGR4MgorICAgICAqICAgICAgICAgICAgdGhlIFggYm90dG9tIHJpZ2h0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBkZXN0aW5hdGlvbgorICAgICAqICAgICAgICAgICAgcmVjdGFuZ2xlIGFyZWEuCisgICAgICogQHBhcmFtIGR5MgorICAgICAqICAgICAgICAgICAgdGhlIFkgYm90dG9tIHJpZ2h0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBkZXN0aW5hdGlvbgorICAgICAqICAgICAgICAgICAgcmVjdGFuZ2xlIGFyZWEuCisgICAgICogQHBhcmFtIHN4MQorICAgICAqICAgICAgICAgICAgdGhlIFggdG9wIGxlZnQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gYmUgZHJhd24KKyAgICAgKiAgICAgICAgICAgIHdpdGhpbiB0aGUgc291cmNlIGltYWdlLgorICAgICAqIEBwYXJhbSBzeTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIHRvcCBsZWZ0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIGJlIGRyYXduCisgICAgICogICAgICAgICAgICB3aXRoaW4gdGhlIHNvdXJjZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gc3gyCisgICAgICogICAgICAgICAgICB0aGUgWCBib3R0b20gcmlnaHQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gYmUgZHJhd24KKyAgICAgKiAgICAgICAgICAgIHdpdGhpbiB0aGUgc291cmNlIGltYWdlLgorICAgICAqIEBwYXJhbSBzeTIKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGJvdHRvbSByaWdodCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBiZSBkcmF3bgorICAgICAqICAgICAgICAgICAgd2l0aGluIHRoZSBzb3VyY2UgaW1hZ2UuCisgICAgICogQHBhcmFtIGJnY29sb3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLgorICAgICAqIEBwYXJhbSBvYnNlcnZlcgorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCBhYm91dCBpbWFnZQorICAgICAqICAgICAgICAgICAgbG9hZGluZyBwcm9jZXNzLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgbG9hZGluZyBpbWFnZSBpcyBzdWNjZXNzZnVsIG9yIGltYWdlIGlzIG51bGwsIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZHJhd0ltYWdlKEltYWdlIGltZywgaW50IGR4MSwgaW50IGR5MSwgaW50IGR4MiwgaW50IGR5MiwgaW50IHN4MSwgaW50IHN5MSwgaW50IHN4MiwgaW50IHN5MiwgQ29sb3IgYmdjb2xvciwgSW1hZ2VPYnNlcnZlciBvYnNlcnZlcik7CisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZHJhd0ltYWdlKEltYWdlIGltZywgaW50IGR4MSwgaW50IGR5MSwgaW50IGR4MiwgaW50IGR5MiwgaW50IHN4MSwKKyAgICAgICAgICAgIGludCBzeTEsIGludCBzeDIsIGludCBzeTIsIENvbG9yIGJnY29sb3IsIEltYWdlT2JzZXJ2ZXIgb2JzZXJ2ZXIpOwogCiAgICAgLyoqCi0gICAgICogU2NhbGVzIHRoZSBzcGVjaWZpZWQgYXJlYSBvZiB0aGUgc3BlY2lmaWVkIGltYWdlIHRvIGZpdCBpbiB0aGUgcmVjdGFuZ2xlIGFyZWEgCi0gICAgICogZGVmaW5lZCBieSBpdHMgY29ybmVycyBjb29yZGluYXRlcyBhbmQgZHJhd3MgdGhlIHN1Yi1pbWFnZS4gVGhlIHN1Yi1pbWFnZSAKLSAgICAgKiB0byBiZSBkcmF3biBpcyBkZWZpbmVkIGJ5IGl0cyB0b3AgbGVmdCAKLSAgICAgKiBjb3JuZXIgY29vcmRpbmF0ZXMgKHN4MSwgc3kxKSBhbmQgYm90dG9tIHJpZ2h0IGNvcm5lciBjb29yZGluYXRlcyAoc3gyLCBzeTIpCi0gICAgICogY29tcHV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBvcmlnaW4gKHRvcCBsZWZ0IGNvcm5lcikgb2YgdGhlIHNvdXJjZSBpbWFnZS4KLSAgICAgKiBUaGUgaW1hZ2UgbG9hZGluZyBwcm9jZXNzIG5vdGlmaWVzIHNwZWNpZmllZCBJbWFnZSBPYnNlcnZlci4gCi0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBpbWFnZQotICAgICAqIGhhcyBsb2FkZWQsIG92ZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuIAorICAgICAqIFNjYWxlcyB0aGUgc3BlY2lmaWVkIGFyZWEgb2YgdGhlIHNwZWNpZmllZCBpbWFnZSB0byBmaXQgaW4gdGhlIHJlY3RhbmdsZQorICAgICAqIGFyZWEgZGVmaW5lZCBieSBpdHMgY29ybmVycyBjb29yZGluYXRlcyBhbmQgZHJhd3MgdGhlIHN1Yi1pbWFnZS4gVGhlCisgICAgICogc3ViLWltYWdlIHRvIGJlIGRyYXduIGlzIGRlZmluZWQgYnkgaXRzIHRvcCBsZWZ0IGNvcm5lciBjb29yZGluYXRlcyAoc3gxLAorICAgICAqIHN5MSkgYW5kIGJvdHRvbSByaWdodCBjb3JuZXIgY29vcmRpbmF0ZXMgKHN4Miwgc3kyKSBjb21wdXRlZCB3aXRoIHJlc3BlY3QKKyAgICAgKiB0byB0aGUgb3JpZ2luICh0b3AgbGVmdCBjb3JuZXIpIG9mIHRoZSBzb3VyY2UgaW1hZ2UuIFRoZSBpbWFnZSBsb2FkaW5nCisgICAgICogcHJvY2VzcyBub3RpZmllcyBzcGVjaWZpZWQgSW1hZ2UgT2JzZXJ2ZXIuIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZgorICAgICAqIHRoZSBpbWFnZSBoYXMgbG9hZGVkLCBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1nIHRoZSBpbWFnZSB3aGljaCB3aWxsIGJlIGRyYXduLgotICAgICAqIEBwYXJhbSBkeDEgdGhlIFggdG9wIGxlZnQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZSBhcmVhLiAKLSAgICAgKiBAcGFyYW0gZHkxIHRoZSBZIHRvcCBsZWZ0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUgYXJlYS4KLSAgICAgKiBAcGFyYW0gZHgyIHRoZSBYIGJvdHRvbSByaWdodCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlIGFyZWEuCi0gICAgICogQHBhcmFtIGR5MiB0aGUgWSBib3R0b20gcmlnaHQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZSBhcmVhLgotICAgICAqIEBwYXJhbSBzeDEgdGhlIFggdG9wIGxlZnQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gYmUgZHJhd24gd2l0aGluIHRoZSBzb3VyY2UgaW1hZ2UuCi0gICAgICogQHBhcmFtIHN5MSB0aGUgWSB0b3AgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBiZSBkcmF3biB3aXRoaW4gdGhlIHNvdXJjZSBpbWFnZS4KLSAgICAgKiBAcGFyYW0gc3gyIHRoZSBYIGJvdHRvbSByaWdodCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBiZSBkcmF3biB3aXRoaW4gdGhlIHNvdXJjZSBpbWFnZS4KLSAgICAgKiBAcGFyYW0gc3kyIHRoZSBZIGJvdHRvbSByaWdodCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBiZSBkcmF3biB3aXRoaW4gdGhlIHNvdXJjZSBpbWFnZS4KLSAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCBhYm91dCBpbWFnZSBsb2FkaW5nIHByb2Nlc3MuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBsb2FkaW5nIGltYWdlIGlzIHN1Y2Nlc3NmdWwgb3IgaW1hZ2UgaXMgbnVsbCwgb3Zlcndpc2UgZmFsc2UuCisgICAgICogQHBhcmFtIGltZworICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIHdoaWNoIHdpbGwgYmUgZHJhd24uCisgICAgICogQHBhcmFtIGR4MQorICAgICAqICAgICAgICAgICAgdGhlIFggdG9wIGxlZnQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZQorICAgICAqICAgICAgICAgICAgYXJlYS4KKyAgICAgKiBAcGFyYW0gZHkxCisgICAgICogICAgICAgICAgICB0aGUgWSB0b3AgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlCisgICAgICogICAgICAgICAgICBhcmVhLgorICAgICAqIEBwYXJhbSBkeDIKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGJvdHRvbSByaWdodCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24KKyAgICAgKiAgICAgICAgICAgIHJlY3RhbmdsZSBhcmVhLgorICAgICAqIEBwYXJhbSBkeTIKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGJvdHRvbSByaWdodCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24KKyAgICAgKiAgICAgICAgICAgIHJlY3RhbmdsZSBhcmVhLgorICAgICAqIEBwYXJhbSBzeDEKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIHRvcCBsZWZ0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIGJlIGRyYXduCisgICAgICogICAgICAgICAgICB3aXRoaW4gdGhlIHNvdXJjZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gc3kxCisgICAgICogICAgICAgICAgICB0aGUgWSB0b3AgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBiZSBkcmF3bgorICAgICAqICAgICAgICAgICAgd2l0aGluIHRoZSBzb3VyY2UgaW1hZ2UuCisgICAgICogQHBhcmFtIHN4MgorICAgICAqICAgICAgICAgICAgdGhlIFggYm90dG9tIHJpZ2h0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIGJlIGRyYXduCisgICAgICogICAgICAgICAgICB3aXRoaW4gdGhlIHNvdXJjZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gc3kyCisgICAgICogICAgICAgICAgICB0aGUgWSBib3R0b20gcmlnaHQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gYmUgZHJhd24KKyAgICAgKiAgICAgICAgICAgIHdpdGhpbiB0aGUgc291cmNlIGltYWdlLgorICAgICAqIEBwYXJhbSBvYnNlcnZlcgorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCBhYm91dCBpbWFnZQorICAgICAqICAgICAgICAgICAgbG9hZGluZyBwcm9jZXNzLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgbG9hZGluZyBpbWFnZSBpcyBzdWNjZXNzZnVsIG9yIGltYWdlIGlzIG51bGwsIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZHJhd0ltYWdlKEltYWdlIGltZywgaW50IGR4MSwgaW50IGR5MSwgaW50IGR4MiwgaW50IGR5MiwgaW50IHN4MSwgaW50IHN5MSwgaW50IHN4MiwgaW50IHN5MiwgSW1hZ2VPYnNlcnZlciBvYnNlcnZlcik7Ci0gICAgCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZHJhd0ltYWdlKEltYWdlIGltZywgaW50IGR4MSwgaW50IGR5MSwgaW50IGR4MiwgaW50IGR5MiwgaW50IHN4MSwKKyAgICAgICAgICAgIGludCBzeTEsIGludCBzeDIsIGludCBzeTIsIEltYWdlT2JzZXJ2ZXIgb2JzZXJ2ZXIpOworCiAgICAgLyoqCi0gICAgICogRHJhd3MgYSBsaW5lIGZyb20gdGhlIHBvaW50ICh4MSwgeTEpIHRvIHRoZSBwb2ludCAoeDIsIHkyKS4gCi0gICAgICogVGhpcyBtZXRob2QgZHJhd3MgdGhlIGxpbmUgd2l0aCBjdXJyZW50IGNvbG9yIAotICAgICAqIHdoaWNoIGNhbiBiZSBjaGFuZ2VkIGJ5IHNldENvbG9yKENvbG9yIGMpIG1ldGhvZC4KKyAgICAgKiBEcmF3cyBhIGxpbmUgZnJvbSB0aGUgcG9pbnQgKHgxLCB5MSkgdG8gdGhlIHBvaW50ICh4MiwgeTIpLiBUaGlzIG1ldGhvZAorICAgICAqIGRyYXdzIHRoZSBsaW5lIHdpdGggY3VycmVudCBjb2xvciB3aGljaCBjYW4gYmUgY2hhbmdlZCBieSBzZXRDb2xvcihDb2xvcgorICAgICAqIGMpIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuCi0gICAgICogQHBhcmFtIHkxIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50LgotICAgICAqIEBwYXJhbSB4MiB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuCi0gICAgICogQHBhcmFtIHkyIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZHJhd0xpbmUoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKTsKIAogICAgIC8qKgotICAgICAqIERyYXdzIHRoZSBvdWxpbmUgb2YgYW4gb3ZhbCB0byBmaXQgaW4gdGhlIHJlY3RhbmdsZSBkZWZpbmVkCi0gICAgICogYnkgdGhlIGdpdmVuIHdpZHRoLCBoZWlnaHQsIGFuZCB0b3AgbGVmdCBjb3JuZXIuCisgICAgICogRHJhd3MgdGhlIG91dGxpbmUgb2YgYW4gb3ZhbCB0byBmaXQgaW4gdGhlIHJlY3RhbmdsZSBkZWZpbmVkIGJ5IHRoZSBnaXZlbgorICAgICAqIHdpZHRoLCBoZWlnaHQsIGFuZCB0b3AgbGVmdCBjb3JuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggdG9wIGxlZnQgY29ybmVyIG92YWwgY29vcmRpbmF0ZQotICAgICAqIEBwYXJhbSB5IHRoZSBZIHRvcCBsZWZ0IGNvcm5lciBvdmFsIGNvb3JkaW5hdGUKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIG92YWwgd2lkdGgKLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBvdmFsIGhlaWdodAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCB0b3AgbGVmdCBjb3JuZXIgb3ZhbCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSB0b3AgbGVmdCBjb3JuZXIgb3ZhbCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIG92YWwgd2lkdGguCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIG92YWwgaGVpZ2h0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRyYXdPdmFsKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKIAogICAgIC8qKgotICAgICAqIERyYXdzIHRoZSBvdXRsaW5lIG9mIGEgcG9seWdvbi4gVGhlIHBvbHlnb24gdmVydGljZXMgYXJlIGRlZmluZWQgYnkgcG9pbnRzIAotICAgICAqIHdpdGggeHBvaW50c1tpXSwgeXBvaW50c1tpXSAgYXMgY29vcmRpbmF0ZXMuIFRoZSBwb2x5Z29uIGVkZ2VzIGFyZSB0aGUKLSAgICAgKiBsaW5lcyBmcm9tIHRoZSBwb2ludHMgd2l0aCAoeHBvaW50c1tpLTFdLCB5cG9pbnRzW2ktMV0pIGNvb3JkaW5hdGVzIHRvICAgCi0gICAgICogdGhlIHBvaW50cyB3aXRoICh4cG9pbnRzW2ldLCB5cG9pbnRzW2ldKSBjb29yZGluYXRlcywgZm9yIDAgPCBpIDwgbnBvaW50cyArMS4KKyAgICAgKiBEcmF3cyB0aGUgb3V0bGluZSBvZiBhIHBvbHlnb24uIFRoZSBwb2x5Z29uIHZlcnRpY2VzIGFyZSBkZWZpbmVkIGJ5CisgICAgICogcG9pbnRzIHdpdGggeHBvaW50c1tpXSwgeXBvaW50c1tpXSBhcyBjb29yZGluYXRlcy4gVGhlIHBvbHlnb24gZWRnZXMgYXJlCisgICAgICogdGhlIGxpbmVzIGZyb20gdGhlIHBvaW50cyB3aXRoICh4cG9pbnRzW2ktMV0sIHlwb2ludHNbaS0xXSkgY29vcmRpbmF0ZXMKKyAgICAgKiB0byB0aGUgcG9pbnRzIHdpdGggKHhwb2ludHNbaV0sIHlwb2ludHNbaV0pIGNvb3JkaW5hdGVzLCBmb3IgMCA8IGkgPAorICAgICAqIG5wb2ludHMgKzEuCiAgICAgICogCi0gICAgICogQHBhcmFtIHhwb2ludHMgdGhlIGFycmF5IG9mIFggY29vcmRpbmF0ZXMgb2YgdGhlIHBvbHlnb24gdmVydGljZXMuCi0gICAgICogQHBhcmFtIHlwb2ludHMgdGhlIGFycmF5IG9mIFkgY29vcmRpbmF0ZXMgb2YgdGhlIHBvbHlnb24gdmVydGljZXMuCi0gICAgICogQHBhcmFtIG5wb2ludHMgdGhlIG51bWJlciBvZiBwb2x5Z29uIHZlcnRpY2VzL3BvaW50cy4KKyAgICAgKiBAcGFyYW0geHBvaW50cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIFggY29vcmRpbmF0ZXMgb2YgdGhlIHBvbHlnb24gdmVydGljZXMuCisgICAgICogQHBhcmFtIHlwb2ludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBZIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2x5Z29uIHZlcnRpY2VzLgorICAgICAqIEBwYXJhbSBucG9pbnRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHBvbHlnb24gdmVydGljZXMvcG9pbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRyYXdQb2x5Z29uKGludFtdIHhwb2ludHMsIGludFtdIHlwb2ludHMsIGludCBucG9pbnRzKTsKIAogICAgIC8qKgotICAgICAqIERyYXdzIGEgc2V0IG9mIGNvbm5lY3RlZCBsaW5lcyB3aGljaCBhcmUgZGVmaW5lZCBieSB0aGUgeCBhbmQgeSBjb29yZGluYXRlIGFycmF5cy4gIAotICAgICAqIFRoZSBwb2x5bGluZSBpcyBjbG9zZWQgaWYgY29vcmRpbmF0ZXMgb2YgdGhlIGZpcnN0IHBvaW50IGFyZSB0aGUgc2FtZSBhcyAKLSAgICAgKiBjb29yZGluYXRlcyBvZiB0aGUgbGFzdCBwb2ludC4KKyAgICAgKiBEcmF3cyBhIHNldCBvZiBjb25uZWN0ZWQgbGluZXMgd2hpY2ggYXJlIGRlZmluZWQgYnkgdGhlIHggYW5kIHkKKyAgICAgKiBjb29yZGluYXRlIGFycmF5cy4gVGhlIHBvbHlsaW5lIGlzIGNsb3NlZCBpZiBjb29yZGluYXRlcyBvZiB0aGUgZmlyc3QKKyAgICAgKiBwb2ludCBhcmUgdGhlIHNhbWUgYXMgY29vcmRpbmF0ZXMgb2YgdGhlIGxhc3QgcG9pbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHhwb2ludHMgdGhlIGFycmF5IG9mIFggcG9pbnQgY29vcmRpbmF0ZXMuCi0gICAgICogQHBhcmFtIHlwb2ludHMgdGhlIGFycmF5IG9mIFkgcG9pbnQgY29vcmRpbmF0ZXMuCi0gICAgICogQHBhcmFtIG5wb2ludHMgdGhlIG51bWJlciBvZiBwb2ludHMuCisgICAgICogQHBhcmFtIHhwb2ludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBYIHBvaW50IGNvb3JkaW5hdGVzLgorICAgICAqIEBwYXJhbSB5cG9pbnRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgWSBwb2ludCBjb29yZGluYXRlcy4KKyAgICAgKiBAcGFyYW0gbnBvaW50cworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBwb2ludHMuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZHJhd1BvbHlsaW5lKGludFtdIHhwb2ludHMsIGludFtdIHlwb2ludHMsIGludCBucG9pbnRzKTsKIAogICAgIC8qKgogICAgICAqIERyYXdzIHRoZSBvdXRsaW5lIG9mIGEgcmVjdGFuZ2xlIHdpdGggcm91bmQgY29ybmVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AgbGVmdCBjb3JuZXIuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gYXJjV2lkdGggdGhlIGFyYyB3aWR0aCBmb3IgdGhlIGNvcm5lcnMuCi0gICAgICogQHBhcmFtIGFyY0hlaWdodCB0aGUgYXJjIGhlaWdodCBmb3IgdGhlIGNvcm5lcnMuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBhcmNXaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIGFyYyB3aWR0aCBmb3IgdGhlIGNvcm5lcnMuCisgICAgICogQHBhcmFtIGFyY0hlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGFyYyBoZWlnaHQgZm9yIHRoZSBjb3JuZXJzLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRyYXdSb3VuZFJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBhcmNXaWR0aCwgaW50IGFyY0hlaWdodCk7CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZHJhd1JvdW5kUmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGFyY1dpZHRoLAorICAgICAgICAgICAgaW50IGFyY0hlaWdodCk7CiAKICAgICAvKioKLSAgICAgKiBEcmF3cyBhIHRleHQgZGVmaW5lZCBieSBhbiBpdGVyYXRvci4gVGhlIGl0ZXJhdG9yIHNob3VsZCBzcGVjaWZ5IHRoZSBmb250IAotICAgICAqIGZvciBldmVyeSBjaGFyYWN0ZXIuIAotICAgICAqICAKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgdGhlIGl0ZXJhdG9yLgotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnQgY2hhcmFjdGVyLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4KKyAgICAgKiBEcmF3cyBhIHRleHQgZGVmaW5lZCBieSBhbiBpdGVyYXRvci4gVGhlIGl0ZXJhdG9yIHNob3VsZCBzcGVjaWZ5IHRoZSBmb250CisgICAgICogZm9yIGV2ZXJ5IGNoYXJhY3Rlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXRlcmF0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBpdGVyYXRvci4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZHJhd1N0cmluZyhBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgaXRlcmF0b3IsIGludCB4LCBpbnQgeSk7CiAKQEAgLTU2NSw4NiArNzEyLDExNyBAQAogICAgICAqIERyYXdzIGEgdGV4dCBkZWZpbmVkIGJ5IGEgc3RyaW5nLiBUaGlzIG1ldGhvZCBkcmF3cyB0aGUgdGV4dCB3aXRoIGN1cnJlbnQKICAgICAgKiBmb250IGFuZCBjb2xvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcuIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnQgY2hhcmFjdGVyLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4KKyAgICAgKiBAcGFyYW0gc3RyCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkcmF3U3RyaW5nKFN0cmluZyBzdHIsIGludCB4LCBpbnQgeSk7CiAKICAgICAvKioKLSAgICAgKiBGaWxscyB0aGUgYXJjIGNvdmVyaW5nIHRoZSByZWN0YW5nbGUgYW5kIHVzaW5nIHRoZSBjdXJyZW50IGNvbG9yLiAKLSAgICAgKiBUaGUgcmVjdGFuZ2xlIGlzIGRlZmluZWQgYnkgdGhlIG9yaWdpbiBwb2ludCAoWCwgWSkgYW5kIGRpbWVudGlvbnMgKHdpZHRoIGFuZCBoZWlnaHQpLiAKLSAgICAgKiBUaGUgYXJjIGNlbnRlciBpcyB0aGUgdGhlIGNlbnRlciBvZiBzcGVjaWZpZWQgcmVjdGFuZ2xlLiAKLSAgICAgKiBUaGUgYW5nbGUgb3JpZ2luIGlzIGF0IHRoZSAzIG8nY2xvY2sgcG9zaXRpb24sIGFuZCBhIHBvc2l0aXZlIGFuZ2xlIGdpdmVzICAKKyAgICAgKiBGaWxscyB0aGUgYXJjIGNvdmVyaW5nIHRoZSByZWN0YW5nbGUgYW5kIHVzaW5nIHRoZSBjdXJyZW50IGNvbG9yLiBUaGUKKyAgICAgKiByZWN0YW5nbGUgaXMgZGVmaW5lZCBieSB0aGUgb3JpZ2luIHBvaW50IChYLCBZKSBhbmQgZGltZW5zaW9ucyAod2lkdGggYW5kCisgICAgICogaGVpZ2h0KS4gVGhlIGFyYyBjZW50ZXIgaXMgdGhlIHRoZSBjZW50ZXIgb2Ygc3BlY2lmaWVkIHJlY3RhbmdsZS4gVGhlCisgICAgICogYW5nbGUgb3JpZ2luIGlzIGF0IHRoZSAzIG8nY2xvY2sgcG9zaXRpb24sIGFuZCBhIHBvc2l0aXZlIGFuZ2xlIGdpdmVzCiAgICAgICogY291bnRlci1jbG9ja3dpc2Ugcm90YXRpb24sIGEgbmVnYXRpdmUgYW5nbGUgZ2l2ZXMgY2xvY2t3aXNlIHJvdGF0aW9uLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBvcmlnaW4gY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHdoaWNoIHNjYWxlcyB0aGUgYXJjLiAKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBvcmlnaW4gY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHdoaWNoIHNjYWxlcyB0aGUgYXJjLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSB3aGljaCBzY2FsZXMgdGhlIGFyYy4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB3aGljaCBzY2FsZXMgdGhlIGFyYy4KLSAgICAgKiBAcGFyYW0gc2Egc3RhcnQgYW5nbGUgLSB0aGUgb3JpZ2luIGFuZ2xlIG9mIGFyYy4KLSAgICAgKiBAcGFyYW0gZWEgYXJjIGFuZ2xlIC0gdGhlIGFuZ3VsYXIgYXJjIHZhbHVlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBhbmdsZS4gCisgICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIG9yaWdpbiBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBhcmMuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIG9yaWdpbiBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBhcmMuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSB3aGljaCBzY2FsZXMgdGhlIGFyYy4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBhcmMuCisgICAgICogQHBhcmFtIHNhCisgICAgICogICAgICAgICAgICBzdGFydCBhbmdsZSAtIHRoZSBvcmlnaW4gYW5nbGUgb2YgYXJjLgorICAgICAqIEBwYXJhbSBlYQorICAgICAqICAgICAgICAgICAgYXJjIGFuZ2xlIC0gdGhlIGFuZ3VsYXIgYXJjIHZhbHVlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmaWxsQXJjKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2EsIGludCBlYSk7CiAKICAgICAvKioKLSAgICAgKiBGaWxscyBhbiBvdmFsIHdpdGggdGhlIGN1cnJlbnQgY29sb3Igd2hlcmUgdGhlIG92YWwgaXMgZGVmaW5lZCBieSB0aGUgCisgICAgICogRmlsbHMgYW4gb3ZhbCB3aXRoIHRoZSBjdXJyZW50IGNvbG9yIHdoZXJlIHRoZSBvdmFsIGlzIGRlZmluZWQgYnkgdGhlCiAgICAgICogYm91bmRpbmcgcmVjdGFuZ2xlIHdpdGggdGhlIGdpdmVuIHdpZHRoLCBoZWlnaHQsIGFuZCB0b3AgbGVmdCBjb3JuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggdG9wIGxlZnQgY29ybmVyIG92YWwgY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSB0b3AgbGVmdCBjb3JuZXIgb3ZhbCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgb3ZhbCB3aWR0aC4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBvdmFsIGhlaWdodC4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggdG9wIGxlZnQgY29ybmVyIG92YWwgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgdG9wIGxlZnQgY29ybmVyIG92YWwgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdmFsIHdpZHRoLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdmFsIGhlaWdodC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmaWxsT3ZhbChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAKICAgICAvKioKLSAgICAgKiBGaWxscyBhIHBvbHlnb24gd2l0aCB0aGUgY3VycmVudCBjb2xvci4gVGhlIHBvbHlnb24gdmVydGljZXMgYXJlIGRlZmluZWQgYnkgdGhlIHBvaW50cyAKLSAgICAgKiB3aXRoIHhwb2ludHNbaV0sIHlwb2ludHNbaV0gYXMgY29vcmRpbmF0ZXMuIFRoZSBwb2x5Z29uIGVkZ2VzIGFyZSB0aGUKLSAgICAgKiBsaW5lcyBmcm9tIHRoZSBwb2ludHMgd2l0aCAoeHBvaW50c1tpLTFdLCB5cG9pbnRzW2ktMV0pIGNvb3JkaW5hdGVzIHRvICAgCi0gICAgICogdGhlIHBvaW50cyB3aXRoICh4cG9pbnRzW2ldLCB5cG9pbnRzW2ldKSBjb29yZGluYXRlcywgZm9yIDAgPCBpIDwgbnBvaW50cyArMS4KKyAgICAgKiBGaWxscyBhIHBvbHlnb24gd2l0aCB0aGUgY3VycmVudCBjb2xvci4gVGhlIHBvbHlnb24gdmVydGljZXMgYXJlIGRlZmluZWQKKyAgICAgKiBieSB0aGUgcG9pbnRzIHdpdGggeHBvaW50c1tpXSwgeXBvaW50c1tpXSBhcyBjb29yZGluYXRlcy4gVGhlIHBvbHlnb24KKyAgICAgKiBlZGdlcyBhcmUgdGhlIGxpbmVzIGZyb20gdGhlIHBvaW50cyB3aXRoICh4cG9pbnRzW2ktMV0sIHlwb2ludHNbaS0xXSkKKyAgICAgKiBjb29yZGluYXRlcyB0byB0aGUgcG9pbnRzIHdpdGggKHhwb2ludHNbaV0sIHlwb2ludHNbaV0pIGNvb3JkaW5hdGVzLCBmb3IKKyAgICAgKiAwIDwgaSA8IG5wb2ludHMgKzEuCiAgICAgICogCi0gICAgICogQHBhcmFtIHhwb2ludHMgdGhlIGFycmF5IG9mIFggY29vcmRpbmF0ZXMgb2YgdGhlIHBvbHlnb24gdmVydGljZXMuCi0gICAgICogQHBhcmFtIHlwb2ludHMgdGhlIGFycmF5IG9mIFkgY29vcmRpbmF0ZXMgb2YgdGhlIHBvbHlnb24gdmVydGljZXMuCi0gICAgICogQHBhcmFtIG5wb2ludHMgdGhlIG51bWJlciBvZiBwb2x5Z29uIHZlcnRpY2VzL3BvaW50cy4KKyAgICAgKiBAcGFyYW0geHBvaW50cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIFggY29vcmRpbmF0ZXMgb2YgdGhlIHBvbHlnb24gdmVydGljZXMuCisgICAgICogQHBhcmFtIHlwb2ludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBZIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2x5Z29uIHZlcnRpY2VzLgorICAgICAqIEBwYXJhbSBucG9pbnRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHBvbHlnb24gdmVydGljZXMvcG9pbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGZpbGxQb2x5Z29uKGludFtdIHhwb2ludHMsIGludFtdIHlwb2ludHMsIGludCBucG9pbnRzKTsKIAogICAgIC8qKgotICAgICAqIEZpbGxzIGEgcmVjdGFuZ2xlIHdpdGggdGhlIGN1cnJlbnQgY29sb3IuIAotICAgICAqIFRoZSByZWN0YW5nbGUgaXMgZGVmaW5lZCBieSBpdHMgd2lkdGggYW5kIGxlbmd0aCBhbmQgdG9wIGxlZnQgY29ybmVyIGNvb3JkaW5hdGVzLgorICAgICAqIEZpbGxzIGEgcmVjdGFuZ2xlIHdpdGggdGhlIGN1cnJlbnQgY29sb3IuIFRoZSByZWN0YW5nbGUgaXMgZGVmaW5lZCBieSBpdHMKKyAgICAgKiB3aWR0aCBhbmQgbGVuZ3RoIGFuZCB0b3AgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZmlsbFJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogCiAgICAgLyoqCiAgICAgICogRmlsbHMgYSByb3VuZCBjb3JuZXJlZCByZWN0YW5nbGUgd2l0aCB0aGUgY3VycmVudCBjb2xvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGFyY1dpZHRoIHRoZSBhcmMgd2lkdGggYXQgdGhlIGNvcm5lcnMuCi0gICAgICogQHBhcmFtIGFyY0hlaWdodCB0aGUgYXJjIGhlaWdodCBhdCB0aGUgY29ybmVycy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBib3VuZGluZworICAgICAqICAgICAgICAgICAgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nCisgICAgICogICAgICAgICAgICByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGFyY1dpZHRoCisgICAgICogICAgICAgICAgICB0aGUgYXJjIHdpZHRoIGF0IHRoZSBjb3JuZXJzLgorICAgICAqIEBwYXJhbSBhcmNIZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcmMgaGVpZ2h0IGF0IHRoZSBjb3JuZXJzLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGZpbGxSb3VuZFJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBhcmNXaWR0aCwgaW50IGFyY0hlaWdodCk7CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZmlsbFJvdW5kUmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGFyY1dpZHRoLAorICAgICAgICAgICAgaW50IGFyY0hlaWdodCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjbGlwcGluZyBhcmVhLgotICAgICAqIDxicj4gPGJyPgotICAgICAqICAKKyAgICAgKiBHZXRzIHRoZSBjbGlwcGluZyBhcmVhLiA8YnI+CisgICAgICogPGJyPgorICAgICAqIAogICAgICAqIEByZXR1cm4gYSBTaGFwZSBvYmplY3Qgb2YgdGhlIGNsaXBwaW5nIGFyZWEgb3IgbnVsbCBpZiBpdCBpcyBub3Qgc2V0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTaGFwZSBnZXRDbGlwKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBib3VuZHMgb2YgdGhlIGN1cnJlbnQgY2xpcHBpbmcgYXJlYSBhcyBhIHJlY3RhbmdsZS4KLSAgICAgKiAgCi0gICAgICogQHJldHVybiBhIFJlY3RhbmdsZSBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgYm91bmRzIG9mIHRoZSBjdXJyZW50IGNsaXBwaW5nIGFyZWEuIAorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBSZWN0YW5nbGUgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIGJvdW5kcyBvZiB0aGUgY3VycmVudAorICAgICAqICAgICAgICAgY2xpcHBpbmcgYXJlYS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgUmVjdGFuZ2xlIGdldENsaXBCb3VuZHMoKTsKIApAQCAtNjYzLDc1ICs4NDEsODQgQEAKICAgICBwdWJsaWMgYWJzdHJhY3QgRm9udCBnZXRGb250KCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmb250IG1ldHJpY3Mgb2YgdGhlIHNwZWNpZmllZCBmb250LiAKLSAgICAgKiBUaGUgZm9udCBtZXRyaWNzIG9iamVjdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVuZGVyaW5nIG9mIGEgcGFydGljdWxhciBmb250LgorICAgICAqIEdldHMgdGhlIGZvbnQgbWV0cmljcyBvZiB0aGUgc3BlY2lmaWVkIGZvbnQuIFRoZSBmb250IG1ldHJpY3Mgb2JqZWN0CisgICAgICogY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlbmRlcmluZyBvZiBhIHBhcnRpY3VsYXIgZm9udC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9udCB0aGUgc3BlY2lmaWVkIGZvbnQKLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZm9udAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBmb250LgogICAgICAqIEByZXR1cm4gdGhlIGZvbnQgbWV0cmljcyBmb3IgdGhlIHNwZWNpZmllZCBmb250LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBGb250TWV0cmljcyBnZXRGb250TWV0cmljcyhGb250IGZvbnQpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmV3IGNsaXBwaW5nIGFyZWEgc3BlY2lmaWVkIGJ5IHJlY3RhbmdsZS4gVGhlIG5ldyBjbGlwcGluZyBhcmVhIAotICAgICAqIGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSB3aW5kb3cncyB2aXNpYmlsaXR5LiBSZW5kZXJpbmcgb3BlcmF0aW9ucyBjYW4ndCBiZSBwZXJmb3JtZWQgCi0gICAgICogb3V0c2lkZSBuZXcgY2xpcHBpbmcgYXJlYS4KKyAgICAgKiBTZXRzIHRoZSBuZXcgY2xpcHBpbmcgYXJlYSBzcGVjaWZpZWQgYnkgcmVjdGFuZ2xlLiBUaGUgbmV3IGNsaXBwaW5nIGFyZWEKKyAgICAgKiBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgd2luZG93J3MgdmlzaWJpbGl0eS4gUmVuZGVyaW5nIG9wZXJhdGlvbnMgY2FuJ3QgYmUKKyAgICAgKiBwZXJmb3JtZWQgb3V0c2lkZSBuZXcgY2xpcHBpbmcgYXJlYS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBuZXcgY2xpcHBpbmcgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBjbGlwcGluZyByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgbmV3IGNsaXBwaW5nIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIG5ldyBjbGlwcGluZyByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBjbGlwcGluZyByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBjbGlwcGluZyByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIG5ldyBjbGlwcGluZyByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgbmV3IGNsaXBwaW5nIHJlY3RhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDbGlwKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5ldyBjbGlwcGluZyBhcmVhIHRvIGJlIHRoZSBhcmVhIHNwZWNpZmllZCBieSBTaGFwZSBvYmplY3QuIAotICAgICAqIFRoZSBuZXcgY2xpcHBpbmcgYXJlYSBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgd2luZG93J3MgdmlzaWJpbGl0eS4gCi0gICAgICogUmVuZGVyaW5nIG9wZXJhdGlvbnMgY2FuJ3QgYmUgcGVyZm9ybWVkIG91dHNpZGUgbmV3IGNsaXBwaW5nIGFyZWEuCisgICAgICogU2V0cyB0aGUgbmV3IGNsaXBwaW5nIGFyZWEgdG8gYmUgdGhlIGFyZWEgc3BlY2lmaWVkIGJ5IFNoYXBlIG9iamVjdC4gVGhlCisgICAgICogbmV3IGNsaXBwaW5nIGFyZWEgZG9lc24ndCBkZXBlbmQgb24gdGhlIHdpbmRvdydzIHZpc2liaWxpdHkuIFJlbmRlcmluZworICAgICAqIG9wZXJhdGlvbnMgY2FuJ3QgYmUgcGVyZm9ybWVkIG91dHNpZGUgbmV3IGNsaXBwaW5nIGFyZWEuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNsaXAgYSBTaGFwZSBvYmplY3Qgd2hpY2ggcmVwcmVzZW50ZXMgbmV3IGNsaXBwaW5nIGFyZWEuCisgICAgICogQHBhcmFtIGNsaXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBTaGFwZSBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBuZXcgY2xpcHBpbmcgYXJlYS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDbGlwKFNoYXBlIGNsaXApOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBHcmFwaGljcyBjb2xvci4gQWxsIHJlbmRlcmluZyBvcGVyYXRpb25zIHdpdGggdGhpcyBHcmFwaGljcwotICAgICAqIHdpbGwgdXNlIHRoaXMgY29sb3IuCisgICAgICogU2V0cyB0aGUgY3VycmVudCBHcmFwaGljcyBjb2xvci4gQWxsIHJlbmRlcmluZyBvcGVyYXRpb25zIHdpdGggdGhpcworICAgICAqIEdyYXBoaWNzIHdpbGwgdXNlIHRoaXMgY29sb3IuCiAgICAgICogCi0gICAgICogQHBhcmFtIGMgdGhlIG5ldyBjb2xvci4KKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIG5ldyBjb2xvci4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDb2xvcihDb2xvciBjKTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgR3JhcGhpY3MgZm9udC4gQWxsIHJlbmRlcmluZyBvcGVyYXRpb25zIHdpdGggdGhpcyBHcmFwaGljcwotICAgICAqIHdpbGwgdXNlIHRoaXMgZm9udC4KKyAgICAgKiBTZXRzIHRoZSBjdXJyZW50IEdyYXBoaWNzIGZvbnQuIEFsbCByZW5kZXJpbmcgb3BlcmF0aW9ucyB3aXRoIHRoaXMKKyAgICAgKiBHcmFwaGljcyB3aWxsIHVzZSB0aGlzIGZvbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZvbnQgdGhlIG5ldyBmb250LgorICAgICAqIEBwYXJhbSBmb250CisgICAgICogICAgICAgICAgICB0aGUgbmV3IGZvbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Rm9udChGb250IGZvbnQpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgcGFpbnQgbW9kZSBmb3IgdGhlIEdyYXBoaWNzIHdoaWNoIG92ZXJ3cml0ZXMgYWxsIHJlbmRlcmluZyAKKyAgICAgKiBTZXRzIHRoZSBwYWludCBtb2RlIGZvciB0aGUgR3JhcGhpY3Mgd2hpY2ggb3ZlcndyaXRlcyBhbGwgcmVuZGVyaW5nCiAgICAgICogb3BlcmF0aW9ucyB3aXRoIHRoZSBjdXJyZW50IGNvbG9yLgotICAgICAqICAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQYWludE1vZGUoKTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIFhPUiBtb2RlIGZvciB0aGUgR3JhcGhpY3Mgd2hpY2ggY2hhbmdlcyBhIHBpeGVsIGZyb20KLSAgICAgKiB0aGUgY3VycmVudCBjb2xvciB0byB0aGUgc3BlY2lmaWVkIFhPUiBjb2xvci4KLSAgICAgKiA8YnI+IDxicj4KKyAgICAgKiBTZXRzIHRoZSBYT1IgbW9kZSBmb3IgdGhlIEdyYXBoaWNzIHdoaWNoIGNoYW5nZXMgYSBwaXhlbCBmcm9tIHRoZSBjdXJyZW50CisgICAgICogY29sb3IgdG8gdGhlIHNwZWNpZmllZCBYT1IgY29sb3IuIDxicj4KKyAgICAgKiA8YnI+CiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yIHRoZSBuZXcgWE9SIG1vZGUKKyAgICAgKiBAcGFyYW0gY29sb3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgWE9SIG1vZGUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0WE9STW9kZShDb2xvciBjb2xvcik7CiAKICAgICAvKioKLSAgICAgKiBUcmFuc2xhdGVzIHRoZSBvcmlnaW4gb2YgR3JhcGhpY3MgY3VycmVudCBjb29yZGluYXRlIHN5c3RlbSAKLSAgICAgKiB0byB0aGUgcG9pbnQgd2l0aCBYLCBZIGNvb3JkaW5hdGVzIGluIHRoZSBjdXJyZW50IGNvb3JkaW5hdGUgc3lzdGVtLgotICAgICAqIEFsbCByZW5kZXJpbmcgb3BlcmF0aW9uIGluIHRoaXMgR3JhcGhpY3Mgd2lsbCBiZSByZWxhdGVkIHRvIHRoZSBuZXcgb3JpZ2luLgorICAgICAqIFRyYW5zbGF0ZXMgdGhlIG9yaWdpbiBvZiBHcmFwaGljcyBjdXJyZW50IGNvb3JkaW5hdGUgc3lzdGVtIHRvIHRoZSBwb2ludAorICAgICAqIHdpdGggWCwgWSBjb29yZGluYXRlcyBpbiB0aGUgY3VycmVudCBjb29yZGluYXRlIHN5c3RlbS4gQWxsIHJlbmRlcmluZworICAgICAqIG9wZXJhdGlvbiBpbiB0aGlzIEdyYXBoaWNzIHdpbGwgYmUgcmVsYXRlZCB0byB0aGUgbmV3IG9yaWdpbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgb3JpZ2luLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4uCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdHJhbnNsYXRlKGludCB4LCBpbnQgeSk7CiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvR3JhcGhpY3MyRC5qYXZhIGIvYXd0L2phdmEvYXd0L0dyYXBoaWNzMkQuamF2YQppbmRleCAyZmY1ZTBjLi4wNGE3MzE5IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvR3JhcGhpY3MyRC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9HcmFwaGljczJELmphdmEKQEAgLTMwLDE5ICszMCwyMiBAQAogCiAvKioKICAqIFRoZSBHcmFwaGljczJEIGNsYXNzIGV4dGVuZHMgR3JhcGhpY3MgY2xhc3MgYW5kIHByb3ZpZGVzIG1vcmUgY2FwYWJpbGl0aWVzCi0gKiBmb3IgcmVuZGVyaW5nIHRleHQsIGltYWdlcywgc2hhcGVzLiBUaGlzIHByb3ZpZGVzIG1ldGhvZHMgdG8gcGVmb3JtIAotICogdHJhbnNmb3JtYXRpb24gb2YgY29vcmRpbmF0ZSBzeXN0ZW0sIGNvbG9yIG1hbmFnZW1lbnQsIGFuZCB0ZXh0IGxheW91dC4gCi0gKiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgZXhpc3QgZm9yIHJlbmRlcmluZzoKKyAqIGZvciByZW5kZXJpbmcgdGV4dCwgaW1hZ2VzLCBzaGFwZXMuIFRoaXMgcHJvdmlkZXMgbWV0aG9kcyB0byBwZXJmb3JtCisgKiB0cmFuc2Zvcm1hdGlvbiBvZiBjb29yZGluYXRlIHN5c3RlbSwgY29sb3IgbWFuYWdlbWVudCwgYW5kIHRleHQgbGF5b3V0LiBUaGUKKyAqIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGV4aXN0IGZvciByZW5kZXJpbmc6CiAgKiA8dWw+CiAgKiA8bGk+Q29sb3IgLSBjdXJyZW50IEdyYXBoaWNzMkQgY29sb3I7PC9saT4KICAqIDxsaT5Gb250IC0gY3VycmVudCBHcmFwaGljczJEIGZvbnQ7PC9saT4KLSAqIDxsaT5TdHJva2UgLSBwZW4gd2l0aCBhIHdpZHRoIG9mIDEgcGl4ZWw7PC9saT4gIAorICogPGxpPlN0cm9rZSAtIHBlbiB3aXRoIGEgd2lkdGggb2YgMSBwaXhlbDs8L2xpPgogICogPGxpPlRyYW5zZm9ybSAtIGN1cnJlbnQgR3JhcGhpY3MyRCBUcmFuc2Zvcm1hdGlvbjs8L2xpPgotICogPGxpPkNvbXBvc2l0ZSAtIGFscGhhIGNvbXBvc2l0aW5nIHJ1bGVzIGZvciBjb21iaW5pbmcgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBjb2xvcnMuPC9saT4KLSAqIDwvdWw+IAorICogPGxpPkNvbXBvc2l0ZSAtIGFscGhhIGNvbXBvc2l0aW5nIHJ1bGVzIGZvciBjb21iaW5pbmcgc291cmNlIGFuZCBkZXN0aW5hdGlvbgorICogY29sb3JzLjwvbGk+CisgKiA8L3VsPgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEdyYXBoaWNzMkQgZXh0ZW5kcyBHcmFwaGljcyB7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgR3JhcGhpY3MyRCBvYmplY3QuIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIG5ldmVyIGJlCiAgICAgICogY2FsbGVkIGRpcmVjdGx5LgpAQCAtNTIsNDEgKzU1LDQ2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyBwcmVmZXJlbmNlcyBmb3IgdGhlIHJlbmRlcmluZyBhbGdvcml0aG1zLiBUaGUgcHJlZmVyZW5jZXMKLSAgICAgKiBhcmUgYXJiaXRyYXJ5IGFuZCBzcGVjaWZpZWQgYnkgTWFwIG9iamVjdHMuIEFsbCBzcGVjaWZpZWQgYnkgTWFwIG9iamVjdAotICAgICAqIHByZWZlcmVuY2llcyBjYW4gYmUgbW9kaWZpZWQuIAorICAgICAqIEFkZHMgcHJlZmVyZW5jZXMgZm9yIHRoZSByZW5kZXJpbmcgYWxnb3JpdGhtcy4gVGhlIHByZWZlcmVuY2VzIGFyZQorICAgICAqIGFyYml0cmFyeSBhbmQgc3BlY2lmaWVkIGJ5IE1hcCBvYmplY3RzLiBBbGwgc3BlY2lmaWVkIGJ5IE1hcCBvYmplY3QKKyAgICAgKiBwcmVmZXJlbmNlcyBjYW4gYmUgbW9kaWZpZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGhpbnRzIHRoZSByZW5kZXJpbmcgaGludHMuCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgcmVuZGVyaW5nIGhpbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZFJlbmRlcmluZ0hpbnRzKE1hcDw/LCA/PiBoaW50cyk7CiAKICAgICAvKioKLSAgICAgKiBJbnRlcnNlY3RzIHRoZSBjdXJyZW50IGNsaXBwaW5nIGFyZWEgd2l0aCB0aGUgc3BlY2lmaWVkIFNoYXBlIAotICAgICAqIGFuZCB0aGUgcmVzdWx0IGJlY29tZXMgYSBuZXcgY2xpcHBpbmcgYXJlYS4gCi0gICAgICogSWYgY3VycmVudCBjbGlwcGluZyBhcmVhIGlzIG5vdCBkZWZpbmVkLCB0aGUgU2hhcGUgCi0gICAgICogYmVjb21lcyB0aGUgbmV3IGNsaXBwaW5nIGFyZWEuIE5vIHJlbmRlcmluZyBvcGVyYXRpb25zIAotICAgICAqIGFyZSBhbGxvd2VkIG91dHNpZGUgdGhlIGNsaXBwaW5nIGFyZWEuICAKKyAgICAgKiBJbnRlcnNlY3RzIHRoZSBjdXJyZW50IGNsaXBwaW5nIGFyZWEgd2l0aCB0aGUgc3BlY2lmaWVkIFNoYXBlIGFuZCB0aGUKKyAgICAgKiByZXN1bHQgYmVjb21lcyBhIG5ldyBjbGlwcGluZyBhcmVhLiBJZiBjdXJyZW50IGNsaXBwaW5nIGFyZWEgaXMgbm90CisgICAgICogZGVmaW5lZCwgdGhlIFNoYXBlIGJlY29tZXMgdGhlIG5ldyBjbGlwcGluZyBhcmVhLiBObyByZW5kZXJpbmcgb3BlcmF0aW9ucworICAgICAqIGFyZSBhbGxvd2VkIG91dHNpZGUgdGhlIGNsaXBwaW5nIGFyZWEuCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIHNwZWNpZmllZCBTaGFwZSBvYmplY3Qgd2hpY2ggd2lsbCBiZSBpbnRlcnNlY3RlZCAKLSAgICAgKiB3aXRoIGN1cnJlbnQgY2xpcHBpbmcgYXJlYS4KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBTaGFwZSBvYmplY3Qgd2hpY2ggd2lsbCBiZSBpbnRlcnNlY3RlZCB3aXRoCisgICAgICogICAgICAgICAgICBjdXJyZW50IGNsaXBwaW5nIGFyZWEuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgY2xpcChTaGFwZSBzKTsKIAogICAgIC8qKgogICAgICAqIERyYXdzIHRoZSBvdXRsaW5lIG9mIHRoZSBzcGVjaWZpZWQgU2hhcGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIFNoYXBlIHdoaWNoIG91bGluZSBpcyBkcmF3bi4KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIFNoYXBlIHdoaWNoIG91dGxpbmUgaXMgZHJhd24uCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZHJhdyhTaGFwZSBzKTsKIAogICAgIC8qKgotICAgICAqIERyYXdzIHRoZSBzcGVjaWZpZWQgR2x5cGhWZWN0b3Igb2JqZWN0J3MgdGV4dCBhdCB0aGUgcG9pbnQgeCwgeS4gCisgICAgICogRHJhd3MgdGhlIHNwZWNpZmllZCBHbHlwaFZlY3RvciBvYmplY3QncyB0ZXh0IGF0IHRoZSBwb2ludCB4LCB5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBnIHRoZSBHbHlwaFZlY3RvciBvYmplY3QgdG8gYmUgZHJhd24uCi0gICAgICogQHBhcmFtIHggdGhlIFggcG9zaXRpb24gd2hlcmUgdGhlIEdseXBoVmVjdG9yJ3MgdGV4dCBzaG91bGQgCi0gICAgICogYmUgcmVuZGVyZWQuICAKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBwb3NpdGlvbiB3aGVyZSB0aGUgR2x5cGhWZWN0b3IncyB0ZXh0IHNob3VsZCAKLSAgICAgKiBiZSByZW5kZXJlZC4KKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIEdseXBoVmVjdG9yIG9iamVjdCB0byBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggcG9zaXRpb24gd2hlcmUgdGhlIEdseXBoVmVjdG9yJ3MgdGV4dCBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgICAgIHJlbmRlcmVkLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBwb3NpdGlvbiB3aGVyZSB0aGUgR2x5cGhWZWN0b3IncyB0ZXh0IHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgcmVuZGVyZWQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZHJhd0dseXBoVmVjdG9yKEdseXBoVmVjdG9yIGcsIGZsb2F0IHgsIGZsb2F0IHkpOwogCkBAIC05NCw4NyArMTAyLDEwNyBAQAogICAgICAqIERyYXdzIHRoZSBCdWZmZXJlZEltYWdlIC0tIG1vZGlmaWVkIGFjY29yZGluZyB0byB0aGUgb3BlcmF0aW9uCiAgICAgICogQnVmZmVyZWRJbWFnZU9wIC0tIGF0IHRoZSBwb2ludCB4LCB5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWcgdGhlIEJ1ZmZlcmVkSW1hZ2UgdG8gYmUgcmVuZGVyZWQuCi0gICAgICogQHBhcmFtIG9wIHRoZSBmaWx0ZXIgdG8gYmUgYXBwbGllZCB0byB0aGUgaW1hZ2UgYmVmb3JlIHJlbmRlcmluZy4gCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgd2hlcmUgdGhlIGltYWdlJ3MgdXBwZXIgbGVmdCBjb3JuZXIKLSAgICAgKiB3aWxsIGJlIHBsYWNlZC4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB3aGVyZSB0aGUgaW1hZ2UncyB1cHBlciBsZWZ0IGNvcm5lcgotICAgICAqIHdpbGwgYmUgcGxhY2VkLgorICAgICAqIEBwYXJhbSBpbWcKKyAgICAgKiAgICAgICAgICAgIHRoZSBCdWZmZXJlZEltYWdlIHRvIGJlIHJlbmRlcmVkLgorICAgICAqIEBwYXJhbSBvcAorICAgICAqICAgICAgICAgICAgdGhlIGZpbHRlciB0byBiZSBhcHBsaWVkIHRvIHRoZSBpbWFnZSBiZWZvcmUgcmVuZGVyaW5nLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB3aGVyZSB0aGUgaW1hZ2UncyB1cHBlciBsZWZ0CisgICAgICogICAgICAgICAgICBjb3JuZXIgd2lsbCBiZSBwbGFjZWQuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHdoZXJlIHRoZSBpbWFnZSdzIHVwcGVyIGxlZnQKKyAgICAgKiAgICAgICAgICAgIGNvcm5lciB3aWxsIGJlIHBsYWNlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkcmF3SW1hZ2UoQnVmZmVyZWRJbWFnZSBpbWcsIEJ1ZmZlcmVkSW1hZ2VPcCBvcCwgaW50IHgsIGludCB5KTsKIAogICAgIC8qKgotICAgICAqIERyYXdzIEJ1ZmZlcmVkSW1hZ2UgdHJhbnNmb3JtZWQgZnJvbSBpbWFnZSBzcGFjZSBpbnRvIHVzZXIgc3BhY2UgCisgICAgICogRHJhd3MgQnVmZmVyZWRJbWFnZSB0cmFuc2Zvcm1lZCBmcm9tIGltYWdlIHNwYWNlIGludG8gdXNlciBzcGFjZQogICAgICAqIGFjY29yZGluZyB0byB0aGUgQWZmaW5lVHJhbnNmb3JtIHhmb3JtIGFuZCBub3RpZmllcyB0aGUgSW1hZ2VPYnNlcnZlci4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGltZyB0aGUgQnVmZmVyZWRJbWFnZSB0byBiZSByZW5kZXJlZC4KLSAgICAgKiBAcGFyYW0geGZvcm0gdGhlIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBmcm9tIHRoZSBpbWFnZSB0byB0aGUgdXNlciBzcGFjZS4KLSAgICAgKiBAcGFyYW0gb2JzIHRoZSBJbWFnZU9ic2VydmVyIHRvIGJlIG5vdGlmaWVkIGFib3V0IHRoZSBpbWFnZSBjb252ZXJzaW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGltYWdlIGlzIHN1Y2Nlc3NmdWxseSBsb2FkZWQgYW5kIHJlbmRlcmVkLCAKLSAgICAgKiBvciBpdCdzIG51bGwsIG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKiBAcGFyYW0gaW1nCisgICAgICogICAgICAgICAgICB0aGUgQnVmZmVyZWRJbWFnZSB0byBiZSByZW5kZXJlZC4KKyAgICAgKiBAcGFyYW0geGZvcm0KKyAgICAgKiAgICAgICAgICAgIHRoZSBhZmZpbmUgdHJhbnNmb3JtYXRpb24gZnJvbSB0aGUgaW1hZ2UgdG8gdGhlIHVzZXIgc3BhY2UuCisgICAgICogQHBhcmFtIG9icworICAgICAqICAgICAgICAgICAgdGhlIEltYWdlT2JzZXJ2ZXIgdG8gYmUgbm90aWZpZWQgYWJvdXQgdGhlIGltYWdlIGNvbnZlcnNpb24uCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgaW1hZ2UgaXMgc3VjY2Vzc2Z1bGx5IGxvYWRlZCBhbmQgcmVuZGVyZWQsIG9yIGl0J3MKKyAgICAgKiAgICAgICAgIG51bGwsIG90aGVyd2lzZSBmYWxzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBkcmF3SW1hZ2UoSW1hZ2UgaW1nLCBBZmZpbmVUcmFuc2Zvcm0geGZvcm0sIEltYWdlT2JzZXJ2ZXIgb2JzKTsKIAogICAgIC8qKgotICAgICAqIERyYXdzIGEgUmVuZGVyYWJsZUltYWdlIHdoaWNoIGlzIHRyYW5zZm9ybWVkIGZyb20gaW1hZ2Ugc3BhY2UgaW50byB1c2VyIAorICAgICAqIERyYXdzIGEgUmVuZGVyYWJsZUltYWdlIHdoaWNoIGlzIHRyYW5zZm9ybWVkIGZyb20gaW1hZ2Ugc3BhY2UgaW50byB1c2VyCiAgICAgICogYWNjb3JkaW5nIHRvIHRoZSBBZmZpbmVUcmFuc2Zvcm0geGZvcm0uCi0gICAgICogIAotICAgICAqIEBwYXJhbSBpbWcgdGhlIFJlbmRlcmFibGVJbWFnZSB0byBiZSByZW5kZXJlZC4KLSAgICAgKiBAcGFyYW0geGZvcm0gdGhlIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBmcm9tIGltYWdlIHRvIHVzZXIgc3BhY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGltZworICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmFibGVJbWFnZSB0byBiZSByZW5kZXJlZC4KKyAgICAgKiBAcGFyYW0geGZvcm0KKyAgICAgKiAgICAgICAgICAgIHRoZSBhZmZpbmUgdHJhbnNmb3JtYXRpb24gZnJvbSBpbWFnZSB0byB1c2VyIHNwYWNlLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRyYXdSZW5kZXJhYmxlSW1hZ2UoUmVuZGVyYWJsZUltYWdlIGltZywgQWZmaW5lVHJhbnNmb3JtIHhmb3JtKTsKIAogICAgIC8qKgotICAgICAqIERyYXdzIGEgUmVuZGVyZWRJbWFnZSB3aGljaCBpcyB0cmFuc2Zvcm1lZCBmcm9tIGltYWdlIHNwYWNlIGludG8gdXNlciAKKyAgICAgKiBEcmF3cyBhIFJlbmRlcmVkSW1hZ2Ugd2hpY2ggaXMgdHJhbnNmb3JtZWQgZnJvbSBpbWFnZSBzcGFjZSBpbnRvIHVzZXIKICAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIEFmZmluZVRyYW5zZm9ybSB4Zm9ybS4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGltZyB0aGUgUmVuZGVyZWRJbWFnZSB0byBiZSByZW5kZXJlZC4KLSAgICAgKiBAcGFyYW0geGZvcm0gdGhlIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBmcm9tIGltYWdlIHRvIHVzZXIgc3BhY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGltZworICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmVkSW1hZ2UgdG8gYmUgcmVuZGVyZWQuCisgICAgICogQHBhcmFtIHhmb3JtCisgICAgICogICAgICAgICAgICB0aGUgYWZmaW5lIHRyYW5zZm9ybWF0aW9uIGZyb20gaW1hZ2UgdG8gdXNlciBzcGFjZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkcmF3UmVuZGVyZWRJbWFnZShSZW5kZXJlZEltYWdlIGltZywgQWZmaW5lVHJhbnNmb3JtIHhmb3JtKTsKIAogICAgIC8qKgotICAgICAqIERyYXdzIHRoZSBzdHJpbmcgc3BlY2lmaWVkIGJ5IHRoZSBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuIAotICAgICAqIFRoZSBmaXJzdCBjaGFyYWN0ZXIncyBwb3NpdGlvbiBpcyBzcGVjaWZpZWQgYnkgdGhlIFgsIFkgcGFyYW1ldGVycy4gICAKKyAgICAgKiBEcmF3cyB0aGUgc3RyaW5nIHNwZWNpZmllZCBieSB0aGUgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLiBUaGUgZmlyc3QKKyAgICAgKiBjaGFyYWN0ZXIncyBwb3NpdGlvbiBpcyBzcGVjaWZpZWQgYnkgdGhlIFgsIFkgcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3Igd2hvc2UgdGV4dCBpcyBkcmF3bi4KLSAgICAgKiBAcGFyYW0geCB0aGUgWCBwb3NpdGlvbiB3aGVyZSB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGRyYXduLiAKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBwb3NpdGlvbiB3aGVyZSB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGRyYXduLgorICAgICAqIEBwYXJhbSBpdGVyYXRvcgorICAgICAqICAgICAgICAgICAgd2hvc2UgdGV4dCBpcyBkcmF3bi4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggcG9zaXRpb24gd2hlcmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBkcmF3bi4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgcG9zaXRpb24gd2hlcmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBkcmF3bi4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkcmF3U3RyaW5nKEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciBpdGVyYXRvciwgZmxvYXQgeCwgZmxvYXQgeSk7CiAKICAgICAvKioKLSAgICAgKiBEcmF3cyB0aGUgc3RyaW5nIHNwZWNpZmllZCBieSB0aGUgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLiAKLSAgICAgKiBUaGUgZmlyc3QgY2hhcmFjdGVyJ3MgcG9zaXRpb24gaXMgc3BlY2lmaWVkIGJ5IHRoZSBYLCBZIHBhcmFtZXRlcnMuICAgCisgICAgICogRHJhd3MgdGhlIHN0cmluZyBzcGVjaWZpZWQgYnkgdGhlIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci4gVGhlIGZpcnN0CisgICAgICogY2hhcmFjdGVyJ3MgcG9zaXRpb24gaXMgc3BlY2lmaWVkIGJ5IHRoZSBYLCBZIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yIHdob3NlIHRleHQgaXMgZHJhd24uCi0gICAgICogQHBhcmFtIHggdGhlIFggcG9zaXRpb24gd2hlcmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBkcmF3bi4gCi0gICAgICogQHBhcmFtIHkgdGhlIFkgcG9zaXRpb24gd2hlcmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBkcmF3bi4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXRlcmF0b3IKKyAgICAgKiAgICAgICAgICAgIHdob3NlIHRleHQgaXMgZHJhd24uCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIHBvc2l0aW9uIHdoZXJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgZHJhd24uCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIHBvc2l0aW9uIHdoZXJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgZHJhd24uCiAgICAgICogQHNlZSBqYXZhLmF3dC5HcmFwaGljcyNkcmF3U3RyaW5nKEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciwgaW50LCBpbnQpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZHJhd1N0cmluZyhBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgaXRlcmF0b3IsIGludCB4LCBpbnQgeSk7CiAKICAgICAvKioKLSAgICAgKiBEcmF3cyB0aGUgU3RyaW5nIHdob3NlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaXMgc3BlY2lmaWVkIAotICAgICAqIGJ5IHRoZSBwYXJhbWV0ZXJzIFgsIFkuICAgCisgICAgICogRHJhd3MgdGhlIFN0cmluZyB3aG9zZSB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGlzIHNwZWNpZmllZCBieSB0aGUKKyAgICAgKiBwYXJhbWV0ZXJzIFgsIFkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIFN0cmluZyB0byBiZSBkcmF3bi4KLSAgICAgKiBAcGFyYW0geCB0aGUgWCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLiAKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIHRvIGJlIGRyYXduLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRyYXdTdHJpbmcoU3RyaW5nIHMsIGZsb2F0IHgsIGZsb2F0IHkpOwogCiAgICAgLyoqCi0gICAgICogRHJhd3MgdGhlIFN0cmluZyB3aG9zZSB0aGUgZmlyc3QgY2hhcmFjdGVyIGNvb3JkaW5hdGVzIGFyZSBzcGVjaWZpZWQgCi0gICAgICogYnkgdGhlIHBhcmFtZXRlcnMgWCwgWS4gICAKKyAgICAgKiBEcmF3cyB0aGUgU3RyaW5nIHdob3NlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgY29vcmRpbmF0ZXMgYXJlIHNwZWNpZmllZCBieQorICAgICAqIHRoZSBwYXJhbWV0ZXJzIFgsIFkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0ciB0aGUgU3RyaW5nIHRvIGJlIGRyYXduLgotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4gCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLgotICAgICAqIAorICAgICAqIEBwYXJhbSBzdHIKKyAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgdG8gYmUgZHJhd24uCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLgogICAgICAqIEBzZWUgamF2YS5hd3QuR3JhcGhpY3MjZHJhd1N0cmluZyhTdHJpbmcsIGludCwgaW50KQogICAgICAqLwogICAgIEBPdmVycmlkZQpAQCAtMTgzLDcgKzIxMSw4IEBACiAgICAgLyoqCiAgICAgICogRmlsbHMgdGhlIGludGVyaW9yIG9mIHRoZSBzcGVjaWZpZWQgU2hhcGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIFNoYXBlIHRvIGJlIGZpbGxlZC4KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIFNoYXBlIHRvIGJlIGZpbGxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmaWxsKFNoYXBlIHMpOwogCkBAIC0yMDQsNyArMjMzLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbgorICAgICAqIEByZXR1cm4gdGhlIGRldmljZSBjb25maWd1cmF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2V0RGV2aWNlQ29uZmlndXJhdGlvbigpOwogCkBAIC0yMjMsMTcgKzI1MiwxNyBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBQYWludCBnZXRQYWludCgpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2Ygc2luZ2xlIHByZWZlcmVuY2UgZm9yIHNwZWNpZmllZCBrZXkuIAorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHNpbmdsZSBwcmVmZXJlbmNlIGZvciBzcGVjaWZpZWQga2V5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgdGhlIHNwZWNpZmllZCBrZXkgb2YgdGhlIHJlbmRlcmluZyBoaW50LgotICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQga2V5IG9mIHRoZSByZW5kZXJpbmcgaGludC4KICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiByZW5kZXJpbmcgaGludCBmb3Igc3BlY2lmaWVkIGtleS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFJlbmRlcmluZ0hpbnQoUmVuZGVyaW5nSGludHMuS2V5IGtleSk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZXQgb2YgdGhlIHJlbmRlcmluZyBwcmVmZXJlbmNlcyBhcyBhIGNvbGxlY3Rpb24gb2YgCi0gICAgICoga2V5L3ZhbHVlIHBhaXJzLgorICAgICAqIEdldHMgdGhlIHNldCBvZiB0aGUgcmVuZGVyaW5nIHByZWZlcmVuY2VzIGFzIGEgY29sbGVjdGlvbiBvZiBrZXkvdmFsdWUKKyAgICAgKiBwYWlycy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBSZW5kZXJpbmdIaW50cyB3aGljaCBjb250YWlucyB0aGUgcmVuZGVyaW5nIHByZWZlcmVuY2VzLgogICAgICAqLwpAQCAtMjU0LDE3MiArMjgzLDE5NiBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBBZmZpbmVUcmFuc2Zvcm0gZ2V0VHJhbnNmb3JtKCk7CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBTaGFwZSBpbnRlcnNlY3RzIHRoZSBzcGVjaWZpZWQgCi0gICAgICogUmVjdGFuZ2xlLiBJZiB0aGUgb25TdHJva2UgcGFyYW1ldGVyIGlzIHRydWUsIHRoaXMgbWV0aG9kIAotICAgICAqIGNoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIFNoYXBlIG91dGxpbmUgaW50ZXJzZWN0cyB0aGUgc3BlY2lmaWVkIAotICAgICAqIFJlY3RhbmdsZSwgb3RoZXJ3aXNlIHRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIAotICAgICAqIFNoYXBlJ3MgaW50ZXJpb3IgaW50ZXJzZWN0cyB0aGUgc3BlY2lmaWVkIFJlY3RhbmdsZS4gICAKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgU2hhcGUgaW50ZXJzZWN0cyB0aGUgc3BlY2lmaWVkCisgICAgICogUmVjdGFuZ2xlLiBJZiB0aGUgb25TdHJva2UgcGFyYW1ldGVyIGlzIHRydWUsIHRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyCisgICAgICogb3Igbm90IHRoZSBzcGVjaWZpZWQgU2hhcGUgb3V0bGluZSBpbnRlcnNlY3RzIHRoZSBzcGVjaWZpZWQgUmVjdGFuZ2xlLAorICAgICAqIG90aGVyd2lzZSB0aGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBTaGFwZSdzCisgICAgICogaW50ZXJpb3IgaW50ZXJzZWN0cyB0aGUgc3BlY2lmaWVkIFJlY3RhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVjdCB0aGUgc3BlY2lmaWVkIFJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gcyB0aGUgU2hhcGUgdG8gY2hlY2sgZm9yIGludGVyc2VjdGlvbi4KLSAgICAgKiBAcGFyYW0gb25TdHJva2UgdGhlIHBhcmFtZXRlciBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoaXMgbWV0aG9kIGNoZWNrcwotICAgICAqIGZvciBpbnRlcnNlY3Rpb24gb2YgdGhlIFNoYXBlIG91dGxpbmUgb3Igb2YgdGhlIFNoYXBlIGludGVyaW9yIHdpdGggCi0gICAgICogdGhlIFJlY3RhbmdsZS4gCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGVyZSBpcyBhIGhpdCwgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqIEBwYXJhbSByZWN0CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIFNoYXBlIHRvIGNoZWNrIGZvciBpbnRlcnNlY3Rpb24uCisgICAgICogQHBhcmFtIG9uU3Ryb2tlCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGRldGVybWluZXMgd2hldGhlciBvciBub3QgdGhpcyBtZXRob2QgY2hlY2tzIGZvcgorICAgICAqICAgICAgICAgICAgaW50ZXJzZWN0aW9uIG9mIHRoZSBTaGFwZSBvdXRsaW5lIG9yIG9mIHRoZSBTaGFwZSBpbnRlcmlvcgorICAgICAqICAgICAgICAgICAgd2l0aCB0aGUgUmVjdGFuZ2xlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlcmUgaXMgYSBoaXQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoaXQoUmVjdGFuZ2xlIHJlY3QsIFNoYXBlIHMsIGJvb2xlYW4gb25TdHJva2UpOwogCiAgICAgLyoqCiAgICAgICogUGVyZm9ybXMgYSByb3RhdGlvbiB0cmFuc2Zvcm0gcmVsYXRpdmUgdG8gY3VycmVudCBHcmFwaGljczJEIFRyYW5zZm9ybS4KLSAgICAgKiBUaGUgY29vcmRpbmF0ZSBzeXN0ZW0gaXMgcm90YXRlZCBieSB0aGUgc3BlY2lmaWVkIGFuZ2xlIGluIHJhZGlhbnMgcmVsYXRpdmUgdG8gCi0gICAgICogY3VycmVudCBvcmlnaW4uCisgICAgICogVGhlIGNvb3JkaW5hdGUgc3lzdGVtIGlzIHJvdGF0ZWQgYnkgdGhlIHNwZWNpZmllZCBhbmdsZSBpbiByYWRpYW5zCisgICAgICogcmVsYXRpdmUgdG8gY3VycmVudCBvcmlnaW4uCiAgICAgICogCi0gICAgICogQHBhcmFtIHRoZXRhIHRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zLgorICAgICAqIEBwYXJhbSB0aGV0YQorICAgICAqICAgICAgICAgICAgdGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnMuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcm90YXRlKGRvdWJsZSB0aGV0YSk7CiAKICAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhIHRyYW5zbGF0ZWQgcm90YXRpb24gdHJhbnNmb3JtIHJlbGF0aXZlIHRvIGN1cnJlbnQgR3JhcGhpY3MyRCAKLSAgICAgKiBUcmFuc2Zvcm0uIFRoZSBjb29yZGluYXRlIHN5c3RlbSBpcyByb3RhdGVkIGJ5IHRoZSBzcGVjaWZpZWQgYW5nbGUgaW4gcmFkaWFucyAKLSAgICAgKiByZWxhdGl2ZSB0byBjdXJyZW50IG9yaWdpbiBhbmQgdGhlbiBtb3ZlZCB0byBwb2ludCAoeCwgeSkuCisgICAgICogUGVyZm9ybXMgYSB0cmFuc2xhdGVkIHJvdGF0aW9uIHRyYW5zZm9ybSByZWxhdGl2ZSB0byBjdXJyZW50IEdyYXBoaWNzMkQKKyAgICAgKiBUcmFuc2Zvcm0uIFRoZSBjb29yZGluYXRlIHN5c3RlbSBpcyByb3RhdGVkIGJ5IHRoZSBzcGVjaWZpZWQgYW5nbGUgaW4KKyAgICAgKiByYWRpYW5zIHJlbGF0aXZlIHRvIGN1cnJlbnQgb3JpZ2luIGFuZCB0aGVuIG1vdmVkIHRvIHBvaW50ICh4LCB5KS4gSXMKKyAgICAgKiB0aGlzIHJpZ2h0PwogICAgICAqIAotICAgICAqIElzIHRoaXMgcmlnaHQ/Ci0gICAgICogCi0gICAgICogQHBhcmFtIHRoZXRhIHRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zLgotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZS4gCisgICAgICogQHBhcmFtIHRoZXRhCisgICAgICogICAgICAgICAgICB0aGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFucy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByb3RhdGUoZG91YmxlIHRoZXRhLCBkb3VibGUgeCwgZG91YmxlIHkpOwogCiAgICAgLyoqCi0gICAgICogUGVyZm9ybXMgYSBsaW5lYXIgc2NhbGUgdHJhbnNmb3JtIHJlbGF0aXZlIHRvIGN1cnJlbnQgR3JhcGhpY3MyRCBUcmFuc2Zvcm0uCi0gICAgICogVGhlIGNvb3JkaW5hdGUgc3lzdGVtIGlzIHJlc2NhbGVkIHZlcnRpY2FsbHkgYW5kIGhvcml6b250YWxseSAKKyAgICAgKiBQZXJmb3JtcyBhIGxpbmVhciBzY2FsZSB0cmFuc2Zvcm0gcmVsYXRpdmUgdG8gY3VycmVudCBHcmFwaGljczJECisgICAgICogVHJhbnNmb3JtLiBUaGUgY29vcmRpbmF0ZSBzeXN0ZW0gaXMgcmVzY2FsZWQgdmVydGljYWxseSBhbmQgaG9yaXpvbnRhbGx5CiAgICAgICogYnkgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzeCB0aGUgc2NhbGluZyBmYWN0b3IgYnkgd2hpY2ggdGhlIFggY29vcmRpbmF0ZSBpcyBtdWx0aXBsaWVkLiAgIAotICAgICAqIEBwYXJhbSBzeSB0aGUgc2NhbGluZyBmYWN0b3IgYnkgd2hpY2ggdGhlIFkgY29vcmRpbmF0ZSBpcyBtdWx0aXBsaWVkLiAgIAorICAgICAqIEBwYXJhbSBzeAorICAgICAqICAgICAgICAgICAgdGhlIHNjYWxpbmcgZmFjdG9yIGJ5IHdoaWNoIHRoZSBYIGNvb3JkaW5hdGUgaXMgbXVsdGlwbGllZC4KKyAgICAgKiBAcGFyYW0gc3kKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2FsaW5nIGZhY3RvciBieSB3aGljaCB0aGUgWSBjb29yZGluYXRlIGlzIG11bHRpcGxpZWQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2NhbGUoZG91YmxlIHN4LCBkb3VibGUgc3kpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIG5ldyBiYWNrZ3JvdW5kIGNvbG9yIGZvciBjbGVhcmluZyByZWN0YW5ndWxhciBhcmVhcy4gCi0gICAgICogVGhlIGNsZWFyUmVjdCBtZXRob2QgdXNlcyB0aGUgY3VycmVudCBiYWNrZ3JvdW5kIGNvbG9yLiAKKyAgICAgKiBTZXRzIGEgbmV3IGJhY2tncm91bmQgY29sb3IgZm9yIGNsZWFyaW5nIHJlY3Rhbmd1bGFyIGFyZWFzLiBUaGUgY2xlYXJSZWN0CisgICAgICogbWV0aG9kIHVzZXMgdGhlIGN1cnJlbnQgYmFja2dyb3VuZCBjb2xvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3IgdGhlIG5ldyBiYWNrZ3JvdW5kIGNvbG9yLgorICAgICAqIEBwYXJhbSBjb2xvcgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBiYWNrZ3JvdW5kIGNvbG9yLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEJhY2tncm91bmQoQ29sb3IgY29sb3IpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBjb21wb3NpdGUgZm9yIEdyYXBoaWNzMkQuIAorICAgICAqIFNldHMgdGhlIGN1cnJlbnQgY29tcG9zaXRlIGZvciBHcmFwaGljczJELgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wIHRoZSBDb21wb3NpdGUgb2JqZWN0LgorICAgICAqIEBwYXJhbSBjb21wCisgICAgICogICAgICAgICAgICB0aGUgQ29tcG9zaXRlIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbXApOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcGFpbnQgZm9yIEdyYXBoaWNzMkQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBhaW50IHRoZSBQYWludCBvYmplY3QuCisgICAgICogQHBhcmFtIHBhaW50CisgICAgICogICAgICAgICAgICB0aGUgUGFpbnQgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFBhaW50KFBhaW50IHBhaW50KTsKIAogICAgIC8qKgogICAgICAqIFNldHMgYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgY3VycmVudCBSZW5kZXJpbmdIaW50cyBtYXAuCiAgICAgICogCi0gICAgICogQHBhcmFtIGtleSB0aGUga2V5IG9mIHRoZSByZW5kZXJpbmcgaGludCB0byBzZXQuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQgZm9yIHRoZSByZW5kZXJpbmcgaGludC4KKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IG9mIHRoZSByZW5kZXJpbmcgaGludCB0byBzZXQuCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gc2V0IGZvciB0aGUgcmVuZGVyaW5nIGhpbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UmVuZGVyaW5nSGludChSZW5kZXJpbmdIaW50cy5LZXkga2V5LCBPYmplY3QgdmFsdWUpOwogCiAgICAgLyoqCi0gICAgICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgcmVuZGVyaW5nIGhpbnRzIHdpdGggdGhlIHNwZWNpZmllZCByZW5kZXJpbmcgcHJlZmVyZW5jZXMuCisgICAgICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgcmVuZGVyaW5nIGhpbnRzIHdpdGggdGhlIHNwZWNpZmllZCByZW5kZXJpbmcKKyAgICAgKiBwcmVmZXJlbmNlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGludHMgdGhlIG5ldyBNYXAgb2YgcmVuZGVyaW5nIGhpbnRzLgorICAgICAqIEBwYXJhbSBoaW50cworICAgICAqICAgICAgICAgICAgdGhlIG5ldyBNYXAgb2YgcmVuZGVyaW5nIGhpbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFJlbmRlcmluZ0hpbnRzKE1hcDw/LCA/PiBoaW50cyk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBzdHJva2UgZm9yIHRoZSBHcmFwaGljczJELgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSBTdHJva2Ugb2JqZWN0LgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgU3Ryb2tlIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdHJva2UoU3Ryb2tlIHMpOwogCiAgICAgLyoqCi0gICAgICogT3ZlcndyaXRlIHRoZSBjdXJyZW50IFRyYW5zZm9ybSBvZiB0aGUgR3JhcGhpY3MyRC4gVGhlIHNwZWNpZmllZCBUcmFuc2Zvcm0gCi0gICAgICogc2hvdWxkIGJlIHJlY2VpdmVkIGZyb20gdGhlIGdldFRyYW5zZm9ybSgpIG1ldGhvZCBhbmQgc2hvdWxkIGJlIHVzZWQgCi0gICAgICogb25seSBmb3IgcmVzdG9yaW5nIHRoZSBvcmlnaW5hbCBHcmFwaGljczJEIHRyYW5zZm9ybSBhZnRlciBjYWxsaW5nCi0gICAgICogZHJhdyBvciBmaWxsIG1ldGhvZHMuIAorICAgICAqIE92ZXJ3cml0ZSB0aGUgY3VycmVudCBUcmFuc2Zvcm0gb2YgdGhlIEdyYXBoaWNzMkQuIFRoZSBzcGVjaWZpZWQKKyAgICAgKiBUcmFuc2Zvcm0gc2hvdWxkIGJlIHJlY2VpdmVkIGZyb20gdGhlIGdldFRyYW5zZm9ybSgpIG1ldGhvZCBhbmQgc2hvdWxkIGJlCisgICAgICogdXNlZCBvbmx5IGZvciByZXN0b3JpbmcgdGhlIG9yaWdpbmFsIEdyYXBoaWNzMkQgdHJhbnNmb3JtIGFmdGVyIGNhbGxpbmcKKyAgICAgKiBkcmF3IG9yIGZpbGwgbWV0aG9kcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gVHggdGhlIHNwZWNpZmllZCBUcmFuc2Zvcm0uCisgICAgICogQHBhcmFtIFR4CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFRyYW5zZm9ybS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUcmFuc2Zvcm0oQWZmaW5lVHJhbnNmb3JtIFR4KTsKIAogICAgIC8qKgotICAgICAqIFBlcmZvcm1zIGEgc2hlYXIgdHJhbnNmb3JtIHJlbGF0aXZlIHRvIGN1cnJlbnQgR3JhcGhpY3MyRCBUcmFuc2Zvcm0uCi0gICAgICogVGhlIGNvb3JkaW5hdGUgc3lzdGVtIGlzIHNoaWZ0ZWQgYnkgdGhlIHNwZWNpZmllZCBtdWx0aXBsaWVycyByZWxhdGl2ZSB0byAKKyAgICAgKiBQZXJmb3JtcyBhIHNoZWFyIHRyYW5zZm9ybSByZWxhdGl2ZSB0byBjdXJyZW50IEdyYXBoaWNzMkQgVHJhbnNmb3JtLiBUaGUKKyAgICAgKiBjb29yZGluYXRlIHN5c3RlbSBpcyBzaGlmdGVkIGJ5IHRoZSBzcGVjaWZpZWQgbXVsdGlwbGllcnMgcmVsYXRpdmUgdG8KICAgICAgKiBjdXJyZW50IHBvc2l0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaHggdGhlIG11bHRpcGxpZXIgYnkgd2hpY2ggdGhlIFggY29vcmRpbmF0ZXMgc2hpZnQgcG9zaXRpb24KLSAgICAgKiBhbG9uZyBYIGF4aXMgYXMgYSBmdW5jdGlvbiBvZiBZIGNvb3JkaW5hdGVzLiAgIAotICAgICAqIEBwYXJhbSBzaHkgdGhlIG11bHRpcGxpZXIgYnkgd2hpY2ggdGhlIFkgY29vcmRpbmF0ZXMgc2hpZnQgcG9zaXRpb24KLSAgICAgKiBhbG9uZyBZIGF4aXMgYXMgYSBmdW5jdGlvbiBvZiBYIGNvb3JkaW5hdGVzLiAgIAorICAgICAqIEBwYXJhbSBzaHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBtdWx0aXBsaWVyIGJ5IHdoaWNoIHRoZSBYIGNvb3JkaW5hdGVzIHNoaWZ0IHBvc2l0aW9uIGFsb25nCisgICAgICogICAgICAgICAgICBYIGF4aXMgYXMgYSBmdW5jdGlvbiBvZiBZIGNvb3JkaW5hdGVzLgorICAgICAqIEBwYXJhbSBzaHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBtdWx0aXBsaWVyIGJ5IHdoaWNoIHRoZSBZIGNvb3JkaW5hdGVzIHNoaWZ0IHBvc2l0aW9uIGFsb25nCisgICAgICogICAgICAgICAgICBZIGF4aXMgYXMgYSBmdW5jdGlvbiBvZiBYIGNvb3JkaW5hdGVzLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNoZWFyKGRvdWJsZSBzaHgsIGRvdWJsZSBzaHkpOwogCiAgICAgLyoqCi0gICAgICogQ29uY2F0ZW5hdGVzIHRoZSBBZmZpbmVUcmFuc2Zvcm0gb2JqZWN0IHdpdGggY3VycmVudCBUcmFuc2Zvcm0gCi0gICAgICogb2YgdGhpcyBHcmFwaGljczJELiBUaGUgdHJhbnNmb3JtcyBhcmUgYXBwbGllZCBpbiByZXZlcnNlIG9yZGVyCi0gICAgICogd2l0aCB0aGUgbGFzdCBzcGVjaWZpZWQgdHJhbnNmb3JtIGFwcGxpZWQgZmlyc3QgYW5kIHRoZSBuZXh0Ci0gICAgICogdHJhbnNmb3JtYXRpb24gYXBwbGllZCB0byB0aGUgcmVzdWx0IG9mIHByZXZpb3VzIHRyYW5zZm9ybWF0aW9uLiAKLSAgICAgKiBNb3JlIHByZWNpc2VseSwgaWYgQ3ggaXMgdGhlIGN1cnJlbnQgR3JhcGhpY3MyRCB0cmFuc2Zvcm0sIHRoZSAKLSAgICAgKiB0cmFuc2Zvcm0gbWV0aG9kJ3MgcmVzdWx0IHdpdGggVHggYXMgdGhlIHBhcmFtZXRlcgotICAgICAqIGlzIHRoZSB0cmFuc2Zvcm1hdGlvbiBSeCwgd2hlcmUgUngocCkgPSBDeChUeChwKSksIGZvciBwIC0gYSBwb2ludAotICAgICAqIGluIGN1cnJlbnQgY29vcmRpbmF0ZSBzeXN0ZW0uIFJ4IGJlY29tZXMgdGhlIGN1cnJlbnQgVHJhbnNmb3JtICAgCisgICAgICogQ29uY2F0ZW5hdGVzIHRoZSBBZmZpbmVUcmFuc2Zvcm0gb2JqZWN0IHdpdGggY3VycmVudCBUcmFuc2Zvcm0gb2YgdGhpcworICAgICAqIEdyYXBoaWNzMkQuIFRoZSB0cmFuc2Zvcm1zIGFyZSBhcHBsaWVkIGluIHJldmVyc2Ugb3JkZXIgd2l0aCB0aGUgbGFzdAorICAgICAqIHNwZWNpZmllZCB0cmFuc2Zvcm0gYXBwbGllZCBmaXJzdCBhbmQgdGhlIG5leHQgdHJhbnNmb3JtYXRpb24gYXBwbGllZCB0bworICAgICAqIHRoZSByZXN1bHQgb2YgcHJldmlvdXMgdHJhbnNmb3JtYXRpb24uIE1vcmUgcHJlY2lzZWx5LCBpZiBDeCBpcyB0aGUKKyAgICAgKiBjdXJyZW50IEdyYXBoaWNzMkQgdHJhbnNmb3JtLCB0aGUgdHJhbnNmb3JtIG1ldGhvZCdzIHJlc3VsdCB3aXRoIFR4IGFzCisgICAgICogdGhlIHBhcmFtZXRlciBpcyB0aGUgdHJhbnNmb3JtYXRpb24gUngsIHdoZXJlIFJ4KHApID0gQ3goVHgocCkpLCBmb3IgcCAtCisgICAgICogYSBwb2ludCBpbiBjdXJyZW50IGNvb3JkaW5hdGUgc3lzdGVtLiBSeCBiZWNvbWVzIHRoZSBjdXJyZW50IFRyYW5zZm9ybQogICAgICAqIGZvciB0aGlzIEdyYXBoaWNzMkQuCiAgICAgICogCi0gICAgICogQHBhcmFtIFR4IHRoZSBBZmZpbmVUcmFuc2Zvcm0gb2JqZWN0IHRvIGJlIGNvbmNhdGVuYXRlZCB3aXRoIAotICAgICAqIGN1cnJlbnQgVHJhbnNmb3JtLgorICAgICAqIEBwYXJhbSBUeAorICAgICAqICAgICAgICAgICAgdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgdG8gYmUgY29uY2F0ZW5hdGVkIHdpdGggY3VycmVudAorICAgICAqICAgICAgICAgICAgVHJhbnNmb3JtLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRyYW5zZm9ybShBZmZpbmVUcmFuc2Zvcm0gVHgpOwogCiAgICAgLyoqCiAgICAgICogUGVyZm9ybXMgYSB0cmFuc2xhdGUgdHJhbnNmb3JtIHJlbGF0aXZlIHRvIGN1cnJlbnQgR3JhcGhpY3MyRCBUcmFuc2Zvcm0uCi0gICAgICogVGhlIGNvb3JkaW5hdGUgc3lzdGVtIGlzIG1vdmVkIGJ5IHRoZSBzcGVjaWZpZWQgZGlzdGFuY2UgcmVsYXRpdmUgCi0gICAgICogdG8gY3VycmVudCBwb3NpdGlvbi4KKyAgICAgKiBUaGUgY29vcmRpbmF0ZSBzeXN0ZW0gaXMgbW92ZWQgYnkgdGhlIHNwZWNpZmllZCBkaXN0YW5jZSByZWxhdGl2ZSB0bworICAgICAqIGN1cnJlbnQgcG9zaXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHR4IHRoZSB0cmFuc2xhdGlvbiBkaXN0YW5jZSBhbG9uZyB0aGUgWCBheGlzLgotICAgICAqIEBwYXJhbSB0eSB0aGUgdHJhbnNsYXRpb24gZGlzdGFuY2UgYWxvbmcgdGhlIFkgYXhpcy4KKyAgICAgKiBAcGFyYW0gdHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc2xhdGlvbiBkaXN0YW5jZSBhbG9uZyB0aGUgWCBheGlzLgorICAgICAqIEBwYXJhbSB0eQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zbGF0aW9uIGRpc3RhbmNlIGFsb25nIHRoZSBZIGF4aXMuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdHJhbnNsYXRlKGRvdWJsZSB0eCwgZG91YmxlIHR5KTsKIAogICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBvcmlnaW4gR3JhcGhpY3MyRCBUcmFuc2Zvcm0gdG8gdGhlIHBvaW50IHdpdGggeCwgeQotICAgICAqIGNvb3JkaW5hdGVzIGluIGN1cnJlbnQgY29vcmRpbmF0ZSBzeXN0ZW0uIFRoZSBuZXcgb3JpZ2luIG9mIGNvb3JkaW5hdGUgCi0gICAgICogc3lzdGVtIGlzIG1vdmVkIHRvIHRoZSAoeCwgeSkgcG9pbnQgYWNjb3JkaW5nbHkuIEFsbCByZW5kZXJpbmcgYW5kIAotICAgICAqIHRyYW5zZm9ybSBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgcmVsYXRpdmUgdG8gdGhpcyBuZXcgb3JpZ2luLgorICAgICAqIE1vdmVzIHRoZSBvcmlnaW4gR3JhcGhpY3MyRCBUcmFuc2Zvcm0gdG8gdGhlIHBvaW50IHdpdGggeCwgeSBjb29yZGluYXRlcworICAgICAqIGluIGN1cnJlbnQgY29vcmRpbmF0ZSBzeXN0ZW0uIFRoZSBuZXcgb3JpZ2luIG9mIGNvb3JkaW5hdGUgc3lzdGVtIGlzCisgICAgICogbW92ZWQgdG8gdGhlICh4LCB5KSBwb2ludCBhY2NvcmRpbmdseS4gQWxsIHJlbmRlcmluZyBhbmQgdHJhbnNmb3JtCisgICAgICogb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIHJlbGF0aXZlIHRvIHRoaXMgbmV3IG9yaWdpbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUuIAotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlLgogICAgICAqIEBzZWUgamF2YS5hd3QuR3JhcGhpY3MjdHJhbnNsYXRlKGludCwgaW50KQogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRyYW5zbGF0ZShpbnQgeCwgaW50IHkpOwogCiAgICAgLyoqCi0gICAgICogRmlsbHMgYSAzRCByZWN0YW5nbGUgd2l0aCB0aGUgY3VycmVudCBjb2xvci4gCi0gICAgICogVGhlIHJlY3RhbmdsZSBpcyBzcGVjaWZpZWQgYnkgaXRzIHdpZHRoLCBoZWlnaHQsIGFuZCB0b3AgbGVmdCBjb3JuZXIgCi0gICAgICogY29vcmRpbmF0ZXMuCisgICAgICogRmlsbHMgYSAzRCByZWN0YW5nbGUgd2l0aCB0aGUgY3VycmVudCBjb2xvci4gVGhlIHJlY3RhbmdsZSBpcyBzcGVjaWZpZWQKKyAgICAgKiBieSBpdHMgd2lkdGgsIGhlaWdodCwgYW5kIHRvcCBsZWZ0IGNvcm5lciBjb29yZGluYXRlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AgbGVmdCBjb3JuZXIuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHJhaXNlZCBhIGJvb2xlYW4gdmFsdWUgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHJlY3RhbmdsZSAKLSAgICAgKiBpcyBkcmF3biBhcyByYWlzZWQgb3IgaW5kZW50ZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gcmFpc2VkCisgICAgICogICAgICAgICAgICBhIGJvb2xlYW4gdmFsdWUgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHJlY3RhbmdsZSBpcyBkcmF3bgorICAgICAqICAgICAgICAgICAgYXMgcmFpc2VkIG9yIGluZGVudGVkLgogICAgICAqIEBzZWUgamF2YS5hd3QuR3JhcGhpY3MjZmlsbDNEUmVjdChpbnQsIGludCwgaW50LCBpbnQsIGJvb2xlYW4pCiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC00MzMsMTUgKzQ4NiwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIERyYXdzIHRoZSBoaWdsaWdodGVkIG91dGxpbmUgb2YgYSByZWN0YW5nbGUuCisgICAgICogRHJhd3MgdGhlIGhpZ2hsaWdodGVkIG91dGxpbmUgb2YgYSByZWN0YW5nbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSByYWlzZWQgYSBib29sZWFuIHZhbHVlIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSByZWN0YW5nbGUgCi0gICAgICogaXMgZHJhd24gYXMgcmFpc2VkIG9yIGluZGVudGVkLgotICAgICAqICAgICAgIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHJhaXNlZAorICAgICAqICAgICAgICAgICAgYSBib29sZWFuIHZhbHVlIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSByZWN0YW5nbGUgaXMgZHJhd24KKyAgICAgKiAgICAgICAgICAgIGFzIHJhaXNlZCBvciBpbmRlbnRlZC4KICAgICAgKiBAc2VlIGphdmEuYXd0LkdyYXBoaWNzI2RyYXczRFJlY3QoaW50LCBpbnQsIGludCwgaW50LCBib29sZWFuKQogICAgICAqLwogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0dyYXBoaWNzQ29uZmlndXJhdGlvbi5qYXZhIGIvYXd0L2phdmEvYXd0L0dyYXBoaWNzQ29uZmlndXJhdGlvbi5qYXZhCmluZGV4IDhiZWMyNTMuLmQ1OWU4OTYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9HcmFwaGljc0NvbmZpZ3VyYXRpb24uamF2YQorKysgYi9hd3QvamF2YS9hd3QvR3JhcGhpY3NDb25maWd1cmF0aW9uLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgQWxleGV5IEEuIFBldHJlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dDsKIAogaW1wb3J0IGphdmEuYXd0Lmdlb20uQWZmaW5lVHJhbnNmb3JtOwpAQCAtMzAsNzAgKzMxLDc2IEBACiAvKioKICAqIFRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gY2xhc3MgY29udGFpbnMgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBncmFwaGljcwogICogZGV2aWNlcyBzdWNoIGFzIGEgcHJpbnRlciBvciBtb25pdG9yLCBhbmQgcmVwcmVzZW50cyBkZXZpY2UncyBjYXBhYmlsaXRpZXMKLSAqIGFuZCBtb2Rlcy4gTWFueSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gb2JqZWN0cyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoCi0gKiBzaW5nbGUgZ3JhcGhpY3MgZGV2aWNlLgorICogYW5kIG1vZGVzLiBNYW55IEdyYXBoaWNzQ29uZmlndXJhdGlvbiBvYmplY3RzIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggc2luZ2xlCisgKiBncmFwaGljcyBkZXZpY2UuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgR3JhcGhpY3NDb25maWd1cmF0aW9uIHsKLSAgIAotICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgY291bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYW5kIHNob3VsZCBiZSBvYnRhaW5lZCBpbiAKLSAgICAgKiBleHRlbmRlZCBjbGFzc2VzLiAKLSAgICAqLwogCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgY291bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYW5kIHNob3VsZCBiZSBvYnRhaW5lZCBpbiBleHRlbmRlZAorICAgICAqIGNsYXNzZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIEdyYXBoaWNzQ29uZmlndXJhdGlvbigpIHsKICAgICB9CiAKLQotICAgLyoqCi0gICAgKiBDcmVhdGVzIEJ1ZmZlcmVkSW1hZ2UgaW1hZ2Ugb2JqZWN0IHdpdGggYSBkYXRhIGxheW91dCBhbmQgY29sb3IgbW9kZWwgCi0gICAgKiBjb21wYXRpYmxlIHdpdGggdGhpcyBHcmFwaGljc0NvbmZpZ3VyYXRpb24gd2l0aCBzcGVjaWZpZWQgd2lkdGggCi0gICAgKiBhbmQgaGVpZ2h0IHBhcmFtZXRlcnMuCi0gICAgKiAKLSAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgQnVmZmVyZWRJbWFnZS4KLSAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiBCdWZmZXJlZEltYWdlLgotICAgICogCi0gICAgKiBAcmV0dXJuIHRoZSBCdWZmZXJlZEltYWdlIG9iamVjdCB3aXRoIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0IAotICAgICogcGFyYW1ldGVycy4KLSAgICAqLworICAgIC8qKgorICAgICAqIENyZWF0ZXMgQnVmZmVyZWRJbWFnZSBpbWFnZSBvYmplY3Qgd2l0aCBhIGRhdGEgbGF5b3V0IGFuZCBjb2xvciBtb2RlbAorICAgICAqIGNvbXBhdGlibGUgd2l0aCB0aGlzIEdyYXBoaWNzQ29uZmlndXJhdGlvbiB3aXRoIHNwZWNpZmllZCB3aWR0aCBhbmQKKyAgICAgKiBoZWlnaHQgcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBCdWZmZXJlZEltYWdlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgQnVmZmVyZWRJbWFnZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBCdWZmZXJlZEltYWdlIG9iamVjdCB3aXRoIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0CisgICAgICogICAgICAgICBwYXJhbWV0ZXJzLgorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBCdWZmZXJlZEltYWdlIGNyZWF0ZUNvbXBhdGlibGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIEJ1ZmZlcmVkSW1hZ2UgdGhhdCBoYXMgdGhlIHNwZWNpZmllZCB3aWR0aCwgaGVpZ2h0LAotICAgICAqIHRyYW5zcGFyZW5jeSBhbmQgaGFzIGEgZGF0YSBsYXlvdXQgYW5kIGNvbG9yIG1vZGVsIGNvbXBhdGlibGUgd2l0aCB0aGlzIAotICAgICAqIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4gCisgICAgICogdHJhbnNwYXJlbmN5IGFuZCBoYXMgYSBkYXRhIGxheW91dCBhbmQgY29sb3IgbW9kZWwgY29tcGF0aWJsZSB3aXRoIHRoaXMKKyAgICAgKiBHcmFwaGljc0NvbmZpZ3VyYXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiBpbWFnZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgIG9mIGltYWdlLgotICAgICAqIEBwYXJhbSB0cmFuc3BhcmVuY3kgdGhlIHRyYW5zcGFyZW5jeSBtb2RlLgotICAgICAqIAorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIGltYWdlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgaW1hZ2UuCisgICAgICogQHBhcmFtIHRyYW5zcGFyZW5jeQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zcGFyZW5jeSBtb2RlLgogICAgICAqIEByZXR1cm4gdGhlIEJ1ZmZlcmVkSW1hZ2Ugb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBCdWZmZXJlZEltYWdlIGNyZWF0ZUNvbXBhdGlibGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCB0cmFuc3BhcmVuY3kpOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFZvbGF0aWxlSW1hZ2UgdGhhdCBoYXMgdGhlIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0IAotICAgICAqIGFuZCBoYXMgYSBkYXRhIGxheW91dCBhbmQgY29sb3IgbW9kZWwgY29tcGF0aWJsZSB3aXRoIHRoaXMgCi0gICAgICogR3JhcGhpY3NDb25maWd1cmF0aW9uLiAKKyAgICAgKiBDcmVhdGVzIGEgVm9sYXRpbGVJbWFnZSB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIHdpZHRoIGFuZCBoZWlnaHQgYW5kIGhhcyBhCisgICAgICogZGF0YSBsYXlvdXQgYW5kIGNvbG9yIG1vZGVsIGNvbXBhdGlibGUgd2l0aCB0aGlzIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIGltYWdlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiBpbWFnZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIGltYWdlLgogICAgICAqIEByZXR1cm4gdGhlIFZvbGF0aWxlSW1hZ2Ugb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBWb2xhdGlsZUltYWdlIGNyZWF0ZUNvbXBhdGlibGVWb2xhdGlsZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgVm9sYXRpbGVJbWFnZSB0aGF0IHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgd2lkdGgsIGhlaWdodCwKLSAgICAgKiB0cmFuc3BhcmVuY3kgYW5kIGhhcyBhIGRhdGEgbGF5b3V0IGFuZCBjb2xvciBtb2RlbCBjb21wYXRpYmxlIHdpdGggdGhpcyAKLSAgICAgKiBHcmFwaGljc0NvbmZpZ3VyYXRpb24uIAorICAgICAqIHRyYW5zcGFyZW5jeSBhbmQgaGFzIGEgZGF0YSBsYXlvdXQgYW5kIGNvbG9yIG1vZGVsIGNvbXBhdGlibGUgd2l0aCB0aGlzCisgICAgICogR3JhcGhpY3NDb25maWd1cmF0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgaW1hZ2UuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIGltYWdlLgotICAgICAqIEBwYXJhbSB0cmFuc3BhcmVuY3kgdGhlIHRyYW5zcGFyZW5jeSBtb2RlLgotICAgICAqIAorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIGltYWdlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgaW1hZ2UuCisgICAgICogQHBhcmFtIHRyYW5zcGFyZW5jeQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zcGFyZW5jeSBtb2RlLgogICAgICAqIEByZXR1cm4gdGhlIFZvbGF0aWxlSW1hZ2Ugb2JqZWN0LgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBWb2xhdGlsZUltYWdlIGNyZWF0ZUNvbXBhdGlibGVWb2xhdGlsZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHRyYW5zcGFyZW5jeSk7CisgICAgcHVibGljIGFic3RyYWN0IFZvbGF0aWxlSW1hZ2UgY3JlYXRlQ29tcGF0aWJsZVZvbGF0aWxlSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgaW50IHRyYW5zcGFyZW5jeSk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBib3VuZHMgb2YgYXJlYSBjb3ZlcmVkIGJ5IHRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gaW4gdGhlCkBAIC0xMTEsMjAgKzExOCwxOSBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBDb2xvck1vZGVsIGdldENvbG9yTW9kZWwoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIENvbG9yTW9kZWwgb2YgdGhlIEdyYXBoaWNzQ29uZmlndXJhdGlvbiB3aGljaCAKLSAgICAgKiBzdXBwb3J0cyBzcGVjaWZpZWQgVHJhbnNwYXJlbmN5LgorICAgICAqIEdldHMgdGhlIENvbG9yTW9kZWwgb2YgdGhlIEdyYXBoaWNzQ29uZmlndXJhdGlvbiB3aGljaCBzdXBwb3J0cyBzcGVjaWZpZWQKKyAgICAgKiBUcmFuc3BhcmVuY3kuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRyYW5zcGFyZW5jeSB0aGUgVHJhbnNwYXJlbmN5IG1vZGU6IE9QQVFVRSwgQklUTUFTSywgb3IKLSAgICAgKiBUUkFOU0xVQ0VOVC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBDb2xvck1vZGVsIG9mIHRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gd2hpY2ggCi0gICAgICogc3VwcG9ydHMgc3BlY2lmaWVkIFRyYW5zcGFyZW5jeS4KKyAgICAgKiBAcGFyYW0gdHJhbnNwYXJlbmN5CisgICAgICogICAgICAgICAgICB0aGUgVHJhbnNwYXJlbmN5IG1vZGU6IE9QQVFVRSwgQklUTUFTSywgb3IgVFJBTlNMVUNFTlQuCisgICAgICogQHJldHVybiB0aGUgQ29sb3JNb2RlbCBvZiB0aGUgR3JhcGhpY3NDb25maWd1cmF0aW9uIHdoaWNoIHN1cHBvcnRzCisgICAgICogICAgICAgICBzcGVjaWZpZWQgVHJhbnNwYXJlbmN5LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBDb2xvck1vZGVsIGdldENvbG9yTW9kZWwoaW50IHRyYW5zcGFyZW5jeSk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IEFmZmluZVRyYW5zZm9ybSBvZiB0aGUgR3JhcGhpY3NDb25maWd1cmF0aW9uLgotICAgICAqIFRoaXMgbWV0aG9kIHRyYW5zbGF0ZXMgdXNlciBjb29yZGluYXRlcyB0byBkZXZpY2UgY29vcmRpbmF0ZXMuCisgICAgICogR2V0cyB0aGUgZGVmYXVsdCBBZmZpbmVUcmFuc2Zvcm0gb2YgdGhlIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCB0cmFuc2xhdGVzIHVzZXIgY29vcmRpbmF0ZXMgdG8gZGV2aWNlIGNvb3JkaW5hdGVzLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgQWZmaW5lVHJhbnNmb3JtIG9mIHRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24uCiAgICAgICovCkBAIC0xNDQsMjMgKzE1MCwyNCBAQAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBBZmZpbmVUcmFuc2Zvcm0gZ2V0Tm9ybWFsaXppbmdUcmFuc2Zvcm0oKTsKIAotCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBWb2xhdGlsZUltYWdlIHdpdGggc3BlY2lmaWVkIHdpZHRoLCBoZWlnaHQsIEltYWdlQ2FwYWJpbGl0aWVzOwotICAgICAqIGEgZGF0YSBsYXlvdXQgYW5kIGNvbG9yIG1vZGVsIGNvbXBhdGlibGUgd2l0aCB0aGlzIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4gCi0gICAgICogIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgaW1hZ2UuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIGltYWdlLgotICAgICAqIEBwYXJhbSBjYXBzIHRoZSBJbWFnZUNhcGFiaWxpdGllcyBvYmplY3QuCisgICAgICogQ3JlYXRlcyBWb2xhdGlsZUltYWdlIHdpdGggc3BlY2lmaWVkIHdpZHRoLCBoZWlnaHQsIEltYWdlQ2FwYWJpbGl0aWVzOyBhCisgICAgICogZGF0YSBsYXlvdXQgYW5kIGNvbG9yIG1vZGVsIGNvbXBhdGlibGUgd2l0aCB0aGlzIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBWb2xhdGlsZUltYWdlIHdoaWNoIGRhdGEgbGF5b3V0IGFuZCBjb2xvciBtb2RlbCBjb21wYXRpYmxlIAotICAgICAqIHdpdGggdGhpcyBHcmFwaGljc0NvbmZpZ3VyYXRpb24uIAotICAgICAqIAotICAgICAqIEB0aHJvd3MgQVdURXhjZXB0aW9uIGlmIEltYWdlQ2FwYWJpbGl0aWVzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCi0gICAgICogR3JhcGhpY3NDb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIGltYWdlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgaW1hZ2UuCisgICAgICogQHBhcmFtIGNhcHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZUNhcGFiaWxpdGllcyBvYmplY3QuCisgICAgICogQHJldHVybiB0aGUgVm9sYXRpbGVJbWFnZSB3aGljaCBkYXRhIGxheW91dCBhbmQgY29sb3IgbW9kZWwgY29tcGF0aWJsZQorICAgICAqICAgICAgICAgd2l0aCB0aGlzIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFXVEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIEltYWdlQ2FwYWJpbGl0aWVzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCisgICAgICogICAgICAgICAgICAgR3JhcGhpY3NDb25maWd1cmF0aW9uLgogICAgICAqLwotICAgIHB1YmxpYyBWb2xhdGlsZUltYWdlIGNyZWF0ZUNvbXBhdGlibGVWb2xhdGlsZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgIEltYWdlQ2FwYWJpbGl0aWVzIGNhcHMpIHRocm93cyBBV1RFeGNlcHRpb24geworICAgIHB1YmxpYyBWb2xhdGlsZUltYWdlIGNyZWF0ZUNvbXBhdGlibGVWb2xhdGlsZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgSW1hZ2VDYXBhYmlsaXRpZXMgY2FwcykKKyAgICAgICAgICAgIHRocm93cyBBV1RFeGNlcHRpb24gewogICAgICAgICBWb2xhdGlsZUltYWdlIHJlcyA9IGNyZWF0ZUNvbXBhdGlibGVWb2xhdGlsZUltYWdlKHdpZHRoLCBoZWlnaHQpOwogICAgICAgICBpZiAoIXJlcy5nZXRDYXBhYmlsaXRpZXMoKS5lcXVhbHMoY2FwcykpIHsKICAgICAgICAgICAgIC8vIGF3dC4xNEE9Q2FuIG5vdCBjcmVhdGUgVm9sYXRpbGVJbWFnZSB3aXRoIHNwZWNpZmllZCBjYXBhYmlsaXRpZXMKQEAgLTE3MCwyMSArMTc3LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFZvbGF0aWxlSW1hZ2Ugd2l0aCBzcGVjaWZpZWQgd2lkdGgsIGhlaWdodCwgdHJhbnNwYXJlbmN5IAotICAgICAqIGFuZCBJbWFnZUNhcGFiaWxpdGllczsgYSBkYXRhIGxheW91dCBhbmQgY29sb3IgbW9kZWwgY29tcGF0aWJsZSB3aXRoIAotICAgICAqIHRoaXMgR3JhcGhpY3NDb25maWd1cmF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgaW1hZ2UuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIGltYWdlLgotICAgICAqIEBwYXJhbSBjYXBzIHRoZSBJbWFnZUNhcGFiaWxpdGllcyBvYmplY3QuCi0gICAgICogQHBhcmFtIHRyYW5zcGFyZW5jeSB0aGUgVHJhbnNwYXJlbmN5IG1vZGU6IE9QQVFVRSwgQklUTUFTSywgb3IKLSAgICAgKiBUUkFOU0xVQ0VOVC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBWb2xhdGlsZUltYWdlIHdoaWNoIGRhdGEgbGF5b3V0IGFuZCBjb2xvciBtb2RlbCBjb21wYXRpYmxlIAotICAgICAqIHdpdGggdGhpcyBHcmFwaGljc0NvbmZpZ3VyYXRpb24uIAotICAgICAqIAotICAgICAqIEB0aHJvd3MgQVdURXhjZXB0aW9uIGlmIEltYWdlQ2FwYWJpbGl0aWVzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCisgICAgICogQ3JlYXRlcyBhIFZvbGF0aWxlSW1hZ2Ugd2l0aCBzcGVjaWZpZWQgd2lkdGgsIGhlaWdodCwgdHJhbnNwYXJlbmN5IGFuZAorICAgICAqIEltYWdlQ2FwYWJpbGl0aWVzOyBhIGRhdGEgbGF5b3V0IGFuZCBjb2xvciBtb2RlbCBjb21wYXRpYmxlIHdpdGggdGhpcwogICAgICAqIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIGltYWdlLgorICAgICAqIEBwYXJhbSBjYXBzCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VDYXBhYmlsaXRpZXMgb2JqZWN0LgorICAgICAqIEBwYXJhbSB0cmFuc3BhcmVuY3kKKyAgICAgKiAgICAgICAgICAgIHRoZSBUcmFuc3BhcmVuY3kgbW9kZTogT1BBUVVFLCBCSVRNQVNLLCBvciBUUkFOU0xVQ0VOVC4KKyAgICAgKiBAcmV0dXJuIHRoZSBWb2xhdGlsZUltYWdlIHdoaWNoIGRhdGEgbGF5b3V0IGFuZCBjb2xvciBtb2RlbCBjb21wYXRpYmxlCisgICAgICogICAgICAgICB3aXRoIHRoaXMgR3JhcGhpY3NDb25maWd1cmF0aW9uLgorICAgICAqIEB0aHJvd3MgQVdURXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgSW1hZ2VDYXBhYmlsaXRpZXMgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUKKyAgICAgKiAgICAgICAgICAgICBHcmFwaGljc0NvbmZpZ3VyYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIFZvbGF0aWxlSW1hZ2UgY3JlYXRlQ29tcGF0aWJsZVZvbGF0aWxlSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgSW1hZ2VDYXBhYmlsaXRpZXMgY2FwcywgaW50IHRyYW5zcGFyZW5jeSkgdGhyb3dzIEFXVEV4Y2VwdGlvbiB7CkBAIC0xOTksNyArMjA4LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBidWZmZXJpbmcgY2FwYWJpbGl0aWVzIG9mIHRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgQnVmZmVyQ2FwYWJpbGl0aWVzIG9iamVjdC4gCisgICAgICogQHJldHVybiB0aGUgQnVmZmVyQ2FwYWJpbGl0aWVzIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgQnVmZmVyQ2FwYWJpbGl0aWVzIGdldEJ1ZmZlckNhcGFiaWxpdGllcygpIHsKICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJDYXBhYmlsaXRpZXMobmV3IEltYWdlQ2FwYWJpbGl0aWVzKGZhbHNlKSwgbmV3IEltYWdlQ2FwYWJpbGl0aWVzKGZhbHNlKSwKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9HcmFwaGljc0RldmljZS5qYXZhIGIvYXd0L2phdmEvYXd0L0dyYXBoaWNzRGV2aWNlLmphdmEKaW5kZXggOGNmNzAwYS4uOWVkYTRlMCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0dyYXBoaWNzRGV2aWNlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0dyYXBoaWNzRGV2aWNlLmphdmEKQEAgLTE4LDUwICsxOCw2MSBAQAogICogQGF1dGhvciBBbGV4ZXkgQS4gUGV0cmVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIEdyYXBoaWNzRGV2aWNlIGNsYXNzIGRlc2NyaWJlcyB0aGUgZ3JhcGhpY3MgZGV2aWNlcyAoc3VjaCBhcyBzY3JlZW5zIAotICogb3IgcHJpbnRlcnMpIHdoaWNoIGFyZSBhdmFpbGFibGUgaW4gYSBwYXJ0aWN1bGFyIGdyYXBoaWNzIGVudmlyb25tZW50LiAKLSAqIE1hbnkgR3JhcGhpY3NEZXZpY2UgaW5zdGFuY2VzIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUKLSAqIEdyYXBoaWNzRW52aXJvbm1lbnQuIEVhY2ggR3JhcGhpY3NEZXZpY2UgaGFzIG9uZSBvciBtb3JlIEdyYXBoaWNzQ29uZmlndXJhdGlvbgotICogb2JqZWN0cyB3aGljaCBzcGVjaWZ5IHRoZSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMgYW5kIG1vZGVzIG9mIEdyYXBoaWNzRGV2aWNlLgorICogVGhlIEdyYXBoaWNzRGV2aWNlIGNsYXNzIGRlc2NyaWJlcyB0aGUgZ3JhcGhpY3MgZGV2aWNlcyAoc3VjaCBhcyBzY3JlZW5zIG9yCisgKiBwcmludGVycykgd2hpY2ggYXJlIGF2YWlsYWJsZSBpbiBhIHBhcnRpY3VsYXIgZ3JhcGhpY3MgZW52aXJvbm1lbnQuIE1hbnkKKyAqIEdyYXBoaWNzRGV2aWNlIGluc3RhbmNlcyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlIEdyYXBoaWNzRW52aXJvbm1lbnQuCisgKiBFYWNoIEdyYXBoaWNzRGV2aWNlIGhhcyBvbmUgb3IgbW9yZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gb2JqZWN0cyB3aGljaAorICogc3BlY2lmeSB0aGUgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zIGFuZCBtb2RlcyBvZiBHcmFwaGljc0RldmljZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcmFwaGljc0RldmljZSB7Ci0gICAgCi0gICAgLyoqIFRoZSBkaXNwbGF5IG1vZGUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlzcGxheSBtb2RlLgorICAgICAqLwogICAgIHByaXZhdGUgRGlzcGxheU1vZGUgZGlzcGxheU1vZGU7CiAKLSAgICAvLz8/P0FXVAotLy8gICAgcHJpdmF0ZSBXaW5kb3cgZnVsbFNjcmVlbldpbmRvdyA9IG51bGw7CisgICAgLy8gPz8/QVdUCisgICAgLy8gcHJpdmF0ZSBXaW5kb3cgZnVsbFNjcmVlbldpbmRvdyA9IG51bGw7CiAKLSAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9JTUFHRV9CVUZGRVIgaW5kaWNhdGVzIGEgaW1hZ2UgYnVmZmVyIGRldmljZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9JTUFHRV9CVUZGRVIgaW5kaWNhdGVzIGEgaW1hZ2UgYnVmZmVyIGRldmljZS4KKyAgICAgKi8KIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSU1BR0VfQlVGRkVSID0gMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9QUklOVEVSIGluZGljYXRlcyBhIHByaW50ZXIgZGV2aWNlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX1BSSU5URVIgaW5kaWNhdGVzIGEgcHJpbnRlciBkZXZpY2UuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9QUklOVEVSID0gMTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9SQVNURVJfU0NSRUVOIGluZGljYXRlcyBhIHJhc3RlciBzY3JlZW4gZGV2aWNlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX1JBU1RFUl9TQ1JFRU4gaW5kaWNhdGVzIGEgcmFzdGVyIHNjcmVlbiBkZXZpY2UuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9SQVNURVJfU0NSRUVOID0gMDsKIAotICAgLyoqCi0gICAgKiBDb25zdHJ1Y3RvciBpcyBub3QgdG8gYmUgdXNlZCBkaXJlY3RseSBhcyB0aGlzIGNsYXNzIGlzIGFic3RyYWN0LiAKLSAgICAqLworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGlzIG5vdCB0byBiZSB1c2VkIGRpcmVjdGx5IGFzIHRoaXMgY2xhc3MgaXMgYWJzdHJhY3QuCisgICAgICovCiAgICAgcHJvdGVjdGVkIEdyYXBoaWNzRGV2aWNlKCkgewotICAgICAgICBkaXNwbGF5TW9kZSA9IG5ldyBEaXNwbGF5TW9kZSgwLCAwLCBEaXNwbGF5TW9kZS5CSVRfREVQVEhfTVVMVEksIERpc3BsYXlNb2RlLlJFRlJFU0hfUkFURV9VTktOT1dOKTsKKyAgICAgICAgZGlzcGxheU1vZGUgPSBuZXcgRGlzcGxheU1vZGUoMCwgMCwgRGlzcGxheU1vZGUuQklUX0RFUFRIX01VTFRJLAorICAgICAgICAgICAgICAgIERpc3BsYXlNb2RlLlJFRlJFU0hfUkFURV9VTktOT1dOKTsKICAgICB9CiAKLQotICAgLyoqCi0gICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBvYmplY3RzIGFzc29jaWF0ZWQKLSAgICAqIHdpdGggdGhlIEdyYXBoaWNzRGV2aWNlLiAgCi0gICAgKiAKLSAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgR3JhcGhpY3NDb25maWd1cmF0aW9uIG9iamVjdHMgYXNzb2NpYXRlZAotICAgICogd2l0aCB0aGUgR3JhcGhpY3NEZXZpY2UuCi0gICAgKi8KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBvYmplY3RzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiBHcmFwaGljc0RldmljZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBvYmplY3RzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiAgICAgICAgIEdyYXBoaWNzRGV2aWNlLgorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBHcmFwaGljc0NvbmZpZ3VyYXRpb25bXSBnZXRDb25maWd1cmF0aW9ucygpOwogCiAgICAgLyoqCkBAIC03Miw0MSArODMsMzkgQEAKICAgICBwdWJsaWMgYWJzdHJhY3QgR3JhcGhpY3NDb25maWd1cmF0aW9uIGdldERlZmF1bHRDb25maWd1cmF0aW9uKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBTdHJpbmcgaWRlbnRpZmllciB3aGljaCBhc3NvY2lhdGVkIHdpdGggdGhlIEdyYXBoaWNzRGV2aWNlIGluIAorICAgICAqIEdldHMgdGhlIFN0cmluZyBpZGVudGlmaWVyIHdoaWNoIGFzc29jaWF0ZWQgd2l0aCB0aGUgR3JhcGhpY3NEZXZpY2UgaW4KICAgICAgKiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgaWRlbnRpZmllciBvZiB0aGUgR3JhcGhpY3NEZXZpY2UgaW4gCi0gICAgICogdGhlIEdyYXBoaWNzRW52aXJvbm1lbnQuCisgICAgICogQHJldHVybiB0aGUgU3RyaW5nIGlkZW50aWZpZXIgb2YgdGhlIEdyYXBoaWNzRGV2aWNlIGluIHRoZQorICAgICAqICAgICAgICAgR3JhcGhpY3NFbnZpcm9ubWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldElEc3RyaW5nKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHRoaXMgR3JhcGhpY3NEZXZpY2U6IAotICAgICAqIFRZUEVfSU1BR0VfQlVGRkVSLCBUWVBFX1BSSU5URVIgb3IgVFlQRV9SQVNURVJfU0NSRUVOLgorICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhpcyBHcmFwaGljc0RldmljZTogVFlQRV9JTUFHRV9CVUZGRVIsIFRZUEVfUFJJTlRFUiBvcgorICAgICAqIFRZUEVfUkFTVEVSX1NDUkVFTi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgR3JhcGhpY3NEZXZpY2U6IFRZUEVfSU1BR0VfQlVGRkVSLCAKLSAgICAgKiBUWVBFX1BSSU5URVIgb3IgVFlQRV9SQVNURVJfU0NSRUVOLgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBHcmFwaGljc0RldmljZTogVFlQRV9JTUFHRV9CVUZGRVIsIFRZUEVfUFJJTlRFUgorICAgICAqICAgICAgICAgb3IgVFlQRV9SQVNURVJfU0NSRUVOLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0VHlwZSgpOwogCi0KLQotICAgLyoqCi0JKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIGFjY2VsZXJhdGVkIAotCSogbWVtb3J5IG9uIHRoaXMgZGV2aWNlLiAKLSAgICAqIAotICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhY2NlbGVyYXRlZCBtZW1vcnkuCi0gICAgKi8KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIGFjY2VsZXJhdGVkIG1lbW9yeSBvbiB0aGlzCisgICAgICogZGV2aWNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYWNjZWxlcmF0ZWQgbWVtb3J5LgorICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0QXZhaWxhYmxlQWNjZWxlcmF0ZWRNZW1vcnkoKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIC8qID8/P0FXVAotICAgIHB1YmxpYyBHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2V0QmVzdENvbmZpZ3VyYXRpb24oR3JhcGhpY3NDb25maWdUZW1wbGF0ZSBnY3QpIHsKLSAgICAgICAgcmV0dXJuIGdjdC5nZXRCZXN0Q29uZmlndXJhdGlvbihnZXRDb25maWd1cmF0aW9ucygpKTsKLSAgICB9Ci0gICAgKi8KLSAgICAKKyAgICAvKgorICAgICAqID8/P0FXVCBwdWJsaWMgR3JhcGhpY3NDb25maWd1cmF0aW9uCisgICAgICogZ2V0QmVzdENvbmZpZ3VyYXRpb24oR3JhcGhpY3NDb25maWdUZW1wbGF0ZSBnY3QpIHsgcmV0dXJuCisgICAgICogZ2N0LmdldEJlc3RDb25maWd1cmF0aW9uKGdldENvbmZpZ3VyYXRpb25zKCkpOyB9CisgICAgICovCisKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGRpc3BsYXkgbW9kZSBvZiB0aGUgR3JhcGhpY3NEZXZpY2UuCiAgICAgICogCkBAIC0xMjIsNDMgKzEzMSw0MyBAQAogICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZGlzcGxheSBtb2RlcyBhdmFpbGFibGUgaW4gdGhpcyBHcmFwaGljc0RldmljZS4KICAgICAgKi8KICAgICBwdWJsaWMgRGlzcGxheU1vZGVbXSBnZXREaXNwbGF5TW9kZXMoKSB7Ci0gICAgICAgIERpc3BsYXlNb2RlIFtdZG1zID0ge2Rpc3BsYXlNb2RlfTsKLSAgICAgICAgcmV0dXJuICBkbXM7CisgICAgICAgIERpc3BsYXlNb2RlW10gZG1zID0geworICAgICAgICAgICAgZGlzcGxheU1vZGUKKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuIGRtczsKICAgICB9CiAKLSAgICAvKiA/Pz9BV1QKLSAgICBwdWJsaWMgV2luZG93IGdldEZ1bGxTY3JlZW5XaW5kb3coKSB7Ci0gICAgICAgIHJldHVybiBmdWxsU2NyZWVuV2luZG93OwotICAgIH0KLSAgICAqLwotICAgIAorICAgIC8qCisgICAgICogPz8/QVdUIHB1YmxpYyBXaW5kb3cgZ2V0RnVsbFNjcmVlbldpbmRvdygpIHsgcmV0dXJuIGZ1bGxTY3JlZW5XaW5kb3c7IH0KKyAgICAgKi8KKwogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIEdyYXBoaWNzRGV2aWNlIHN1cHBvcnRzIGxvdy1sZXZlbCAKLSAgICAgKiBkaXNwbGF5IGNoYW5nZXMuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgR3JhcGhpY3NEZXZpY2Ugc3VwcG9ydHMgbG93LWxldmVsIGRpc3BsYXkgY2hhbmdlcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgR3JhcGhpY3NEZXZpY2Ugc3VwcG9ydHMgbG93LWxldmVsIAotICAgICAqIGRpc3BsYXkgY2hhbmdlczsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBHcmFwaGljc0RldmljZSBzdXBwb3J0cyBsb3ctbGV2ZWwgZGlzcGxheSBjaGFuZ2VzOworICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRGlzcGxheUNoYW5nZVN1cHBvcnRlZCgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIEdyYXBoaWNzRGV2aWNlIHN1cHBvcnRzIGZ1bGwgc2NyZWVuCi0gICAgICogbW9kZS4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBHcmFwaGljc0RldmljZSBzdXBwb3J0cyBmdWxsIHNjcmVlbiBtb2RlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBHcmFwaGljc0RldmljZSBzdXBwb3J0cyBmdWxsIHNjcmVlbgotICAgICAqIG1vZGU7IG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgR3JhcGhpY3NEZXZpY2Ugc3VwcG9ydHMgZnVsbCBzY3JlZW4gbW9kZSwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGxTY3JlZW5TdXBwb3J0ZWQoKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgLy9hbiBhcnJheSBvZiBkaXNwbGF5IG1vZGVzIGF2YWlsYWJsZSBpbiB0aGlzIEdyYXBoaWNzRGV2aWNlLgotICAgIAorCisgICAgLy8gYW4gYXJyYXkgb2YgZGlzcGxheSBtb2RlcyBhdmFpbGFibGUgaW4gdGhpcyBHcmFwaGljc0RldmljZS4KKwogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGRpc3BsYXkgbW9kZSBvZiB0aGlzIEdyYXBoaWNzRGV2aWNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkbSB0aGUgbmV3IGRpc3BsYXkgbW9kZSBvZiB0aGlzIEdyYXBoaWNzRGV2aWNlLiAKKyAgICAgKiBAcGFyYW0gZG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgZGlzcGxheSBtb2RlIG9mIHRoaXMgR3JhcGhpY3NEZXZpY2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheU1vZGUoRGlzcGxheU1vZGUgZG0pIHsKICAgICAgICAgaWYgKCFpc0Rpc3BsYXlDaGFuZ2VTdXBwb3J0ZWQoKSkgewpAQCAtMTY2LDcgKzE3NSw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTIyIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBEaXNwbGF5TW9kZSBbXWRtcyA9IGdldERpc3BsYXlNb2RlcygpOworICAgICAgICBEaXNwbGF5TW9kZVtdIGRtcyA9IGdldERpc3BsYXlNb2RlcygpOwogICAgICAgICBmb3IgKERpc3BsYXlNb2RlIGVsZW1lbnQgOiBkbXMpIHsKICAgICAgICAgICAgIGlmIChlbGVtZW50LmVxdWFscyhkbSkpIHsKICAgICAgICAgICAgICAgICBkaXNwbGF5TW9kZSA9IGRtOwpAQCAtMTc3LDIzICsxODYsMTEgQEAKICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xMjMiLCBkbSkpOyAvLyROT04tTkxTLTEkCiAgICAgfQogCi0gICAgLyogPz8/QVdUCi0gICAgcHVibGljIHZvaWQgc2V0RnVsbFNjcmVlbldpbmRvdyhXaW5kb3cgdykgewotICAgICAgICBpZiAodyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmdWxsU2NyZWVuV2luZG93ID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZ1bGxTY3JlZW5XaW5kb3cgPSB3OwotCi0gICAgICAgIGlmIChpc0Z1bGxTY3JlZW5TdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgdy5lbmFibGVJbnB1dE1ldGhvZHMoZmFsc2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdy5zZXRTaXplKGRpc3BsYXlNb2RlLmdldFdpZHRoKCksIGRpc3BsYXlNb2RlLmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIHcuc2V0TG9jYXRpb24oMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgdy5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICB3LnNldEFsd2F5c09uVG9wKHRydWUpOwotICAgIH0KLSAgICAqLworICAgIC8qCisgICAgICogPz8/QVdUIHB1YmxpYyB2b2lkIHNldEZ1bGxTY3JlZW5XaW5kb3coV2luZG93IHcpIHsgaWYgKHcgPT0gbnVsbCkgeworICAgICAqIGZ1bGxTY3JlZW5XaW5kb3cgPSBudWxsOyByZXR1cm47IH0gZnVsbFNjcmVlbldpbmRvdyA9IHc7IGlmCisgICAgICogKGlzRnVsbFNjcmVlblN1cHBvcnRlZCgpKSB7IHcuZW5hYmxlSW5wdXRNZXRob2RzKGZhbHNlKTsgfSBlbHNlIHsKKyAgICAgKiB3LnNldFNpemUoZGlzcGxheU1vZGUuZ2V0V2lkdGgoKSwgZGlzcGxheU1vZGUuZ2V0SGVpZ2h0KCkpOworICAgICAqIHcuc2V0TG9jYXRpb24oMCwgMCk7IH0gdy5zZXRWaXNpYmxlKHRydWUpOyB3LnNldEFsd2F5c09uVG9wKHRydWUpOyB9CisgICAgICovCiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvR3JhcGhpY3NFbnZpcm9ubWVudC5qYXZhIGIvYXd0L2phdmEvYXd0L0dyYXBoaWNzRW52aXJvbm1lbnQuamF2YQppbmRleCAzYjE0ZjU1Li5kNTI3NDE3IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvR3JhcGhpY3NFbnZpcm9ubWVudC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9HcmFwaGljc0Vudmlyb25tZW50LmphdmEKQEAgLTI4LDE3ICsyOCwyMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuZ2wuQ29tbW9uR3JhcGhpY3MyREZhY3Rvcnk7CiAKIC8qKgotICogVGhlIEdyYXBoaWNzRW52aXJvbm1lbnQgY2xhc3MgZGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgR3JhcGhpY3NEZXZpY2UgCi0gKiBvYmplY3RzIGFuZCBGb250IG9iamVjdHMgd2hpY2ggYXJlIGF2YWlsYWJsZSBmb3IgSmF2YSBhcHBsaWNhdGlvbiBvbgotICogY3VycmVudCBwbGF0Zm9ybS4KKyAqIFRoZSBHcmFwaGljc0Vudmlyb25tZW50IGNsYXNzIGRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIEdyYXBoaWNzRGV2aWNlIG9iamVjdHMKKyAqIGFuZCBGb250IG9iamVjdHMgd2hpY2ggYXJlIGF2YWlsYWJsZSBmb3IgSmF2YSBhcHBsaWNhdGlvbiBvbiBjdXJyZW50CisgKiBwbGF0Zm9ybS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcmFwaGljc0Vudmlyb25tZW50IHsKLSAgICAKKwogICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGNvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGFuZCBzaG91bGQgYmUgb2J0YWluZWQgaW4gCi0gICAgICogZXh0ZW5kZWQgY2xhc3Nlcy4gCisgICAgICogQ29uc3RydWN0b3IgY291bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYW5kIHNob3VsZCBiZSBvYnRhaW5lZCBpbiBleHRlbmRlZAorICAgICAqIGNsYXNzZXMuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIEdyYXBoaWNzRW52aXJvbm1lbnQoKSB7fQorICAgIHByb3RlY3RlZCBHcmFwaGljc0Vudmlyb25tZW50KCkgeworICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGxvY2FsIEdyYXBoaWNzRW52aXJvbm1lbnQuCkBAIC00NiwxNyArNDksMTYgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbCBHcmFwaGljc0Vudmlyb25tZW50LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgR3JhcGhpY3NFbnZpcm9ubWVudCBnZXRMb2NhbEdyYXBoaWNzRW52aXJvbm1lbnQoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChDb250ZXh0U3RvcmFnZS5nZXRDb250ZXh0TG9jaygpKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoQ29udGV4dFN0b3JhZ2UuZ2V0Q29udGV4dExvY2soKSkgewogICAgICAgICAgICAgaWYgKENvbnRleHRTdG9yYWdlLmdldEdyYXBoaWNzRW52aXJvbm1lbnQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzSGVhZGxlc3MoKSkgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIENvbnRleHRTdG9yYWdlLnNldEdyYXBoaWNzRW52aXJvbm1lbnQobmV3IEhlYWRsZXNzR3JhcGhpY3NFbnZpcm9ubWVudCgpKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChpc0hlYWRsZXNzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dFN0b3JhZ2Uuc2V0R3JhcGhpY3NFbnZpcm9ubWVudChuZXcgSGVhZGxlc3NHcmFwaGljc0Vudmlyb25tZW50KCkpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkdyYXBoaWNzMkRGYWN0b3J5IGcyZGYgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDb21tb25HcmFwaGljczJERmFjdG9yeSkgVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldEdyYXBoaWNzRmFjdG9yeSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgQ29udGV4dFN0b3JhZ2Uuc2V0R3JhcGhpY3NFbnZpcm9ubWVudCggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZzJkZi5jcmVhdGVHcmFwaGljc0Vudmlyb25tZW50KENvbnRleHRTdG9yYWdlLmdldFdpbmRvd0ZhY3RvcnkoKSkKLSAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgQ29tbW9uR3JhcGhpY3MyREZhY3RvcnkgZzJkZiA9IChDb21tb25HcmFwaGljczJERmFjdG9yeSlUb29sa2l0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRUb29sa2l0KCkuZ2V0R3JhcGhpY3NGYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dFN0b3JhZ2Uuc2V0R3JhcGhpY3NFbnZpcm9ubWVudChnMmRmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUdyYXBoaWNzRW52aXJvbm1lbnQoQ29udGV4dFN0b3JhZ2UuZ2V0V2luZG93RmFjdG9yeSgpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC02NSwyNCArNjcsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGEgZGlzcGxheSwga2V5Ym9hcmQsIGFuZCBtb3VzZSBhcmUgc3VwcG9ydGVkIAotICAgICAqIGluIHRoaXMgZ3JhcGhpY3MgZW52aXJvbm1lbnQuCisgICAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhIGRpc3BsYXksIGtleWJvYXJkLCBhbmQgbW91c2UgYXJlIHN1cHBvcnRlZCBpbgorICAgICAqIHRoaXMgZ3JhcGhpY3MgZW52aXJvbm1lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBIZWFkbGVzc0V4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBmcm9tIGFyZWFzIG9mIAotICAgICAqIHRoZSBncmFwaGljcyBlbnZpcm9ubWVudCB0aGF0IGFyZSBkZXBlbmRlbnQgb24gYSBkaXNwbGF5LCBrZXlib2FyZCwgCi0gICAgICogb3IgbW91c2U7IGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIEhlYWRsZXNzRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGZyb20gYXJlYXMgb2YgdGhlCisgICAgICogICAgICAgICBncmFwaGljcyBlbnZpcm9ubWVudCB0aGF0IGFyZSBkZXBlbmRlbnQgb24gYSBkaXNwbGF5LCBrZXlib2FyZCwKKyAgICAgKiAgICAgICAgIG9yIG1vdXNlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNIZWFkbGVzc0luc3RhbmNlKCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IGEgZGlzcGxheSwga2V5Ym9hcmQsIGFuZCBtb3VzZSBhcmUgc3VwcG9ydGVkIAotICAgICAqIGluIHRoaXMgZW52aXJvbm1lbnQuIAorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCBhIGRpc3BsYXksIGtleWJvYXJkLCBhbmQgbW91c2UgYXJlIHN1cHBvcnRlZCBpbgorICAgICAqIHRoaXMgZW52aXJvbm1lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBhIEhlYWRsZXNzRXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGFyZWFzIG9mIAotICAgICAqIHRoZSBUb29sa2l0IGFuZCBHcmFwaGljc0Vudmlyb25tZW50IHRoYXQgYXJlIGRlcGVuZGVudCBvbiAKLSAgICAgKiBhIGRpc3BsYXksIGtleWJvYXJkLCBvciBtb3VzZTsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYSBIZWFkbGVzc0V4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBhcmVhcyBvZiB0aGUgVG9vbGtpdAorICAgICAqICAgICAgICAgYW5kIEdyYXBoaWNzRW52aXJvbm1lbnQgdGhhdCBhcmUgZGVwZW5kZW50IG9uIGEgZGlzcGxheSwKKyAgICAgKiAgICAgICAgIGtleWJvYXJkLCBvciBtb3VzZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hlYWRsZXNzKCkgewogICAgICAgICByZXR1cm4gInRydWUiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuYXd0LmhlYWRsZXNzIikpOwpAQCAtOTIsOCArOTQsOCBAQAogICAgICAqIEdldHMgdGhlIG1heGltdW0gYm91bmRzIG9mIHN5c3RlbSBjZW50ZXJlZCB3aW5kb3dzLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gYm91bmRzIG9mIHN5c3RlbSBjZW50ZXJlZCB3aW5kb3dzLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gaWYgaXNIZWFkbGVzcygpIG1ldGhvZCByZXR1cm5zIHRydWUuCisgICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGlzSGVhZGxlc3MoKSBtZXRob2QgcmV0dXJucyB0cnVlLgogICAgICAqLwogICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0TWF4aW11bVdpbmRvd0JvdW5kcygpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBnZXREZWZhdWx0U2NyZWVuRGV2aWNlKCkuZ2V0RGVmYXVsdENvbmZpZ3VyYXRpb24oKS5nZXRCb3VuZHMoKTsKQEAgLTEwMyw4ICsxMDUsOCBAQAogICAgICAqIEdldHMgdGhlIFBvaW50IHdoaWNoIHNob3VsZCBkZWZpbmVzIHRoZSBjZW50ZXIgb2Ygc3lzdGVtIHdpbmRvdy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBQb2ludCB3aGVyZSB0aGUgc3lzdGVtIHdpbmRvdyBzaG91bGQgYmUgY2VudGVyZWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiBpZiBpc0hlYWRsZXNzKCkgbWV0aG9kIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgaXNIZWFkbGVzcygpIG1ldGhvZCByZXR1cm5zIHRydWUuCiAgICAgICovCiAgICAgcHVibGljIFBvaW50IGdldENlbnRlclBvaW50KCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKICAgICAgICAgUmVjdGFuZ2xlIG13YiA9IGdldE1heGltdW1XaW5kb3dCb3VuZHMoKTsKQEAgLTExMiw5ICsxMTQsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBwcmltYXJ5IGZvbnQgc2hvdWxkIGJlIHVzZWQuIAotICAgICAqIFByaW1hcnkgZm9udCBpcyBzcGVjaWZpZWQgYnkgaW5pdGlhbCBzeXN0ZW0gbG9jYWxlIG9yIGRlZmF1bHQgZW5jb2RpbmcpLgotICAgICAqIAorICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBwcmltYXJ5IGZvbnQgc2hvdWxkIGJlIHVzZWQuIFByaW1hcnkgZm9udCBpcyBzcGVjaWZpZWQKKyAgICAgKiBieSBpbml0aWFsIHN5c3RlbSBsb2NhbGUgb3IgZGVmYXVsdCBlbmNvZGluZykuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHJlZmVyTG9jYWxlRm9udHMoKSB7CiAgICAgICAgIC8vIE5vdGU6IEFQSSBzcGVjaWZpY2F0aW9uIHNheXMgZm9sbG93aW5nOgpAQCAtMTIzLDcgKzEyNCw4IEBACiAgICAgICAgIC8vIGl0IG1heSBoYXZlIG5vIGVmZmVjdCBhdCBhbGwuIiBTbywgZG9pbmcgbm90aGluZyBpcyBhbgogICAgICAgICAvLyBhY2NlcHRhYmxlIGJlaGF2aW9yIGZvciB0aGlzIG1ldGhvZC4KIAotICAgICAgICAvLyBGb3Igbm93IEZvbnRNYW5hZ2VyIHVzZXMgMS40IGZvbnQucHJvcGVydGllcyBzY2hlbWUgZm9yIGZvbnQgbWFwcGluZywgc28KKyAgICAgICAgLy8gRm9yIG5vdyBGb250TWFuYWdlciB1c2VzIDEuNCBmb250LnByb3BlcnRpZXMgc2NoZW1lIGZvciBmb250IG1hcHBpbmcsCisgICAgICAgIC8vIHNvCiAgICAgICAgIC8vIHRoaXMgbWV0aG9kIGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2UuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZAogICAgICAgICAvLyB3aGljaCB3aWxsIGluZmx1ZW5jZSBmb250IG1hcHBpbmcgaXMgcG9zdHBvbmVkIHVudGlsCiAgICAgICAgIC8vIDEuNSBtYXBwaW5nIHNjaGVtZSBub3QgaW1wbGVtZW50ZWQuCkBAIC0xNDEsNyArMTQzLDggQEAKICAgICAgICAgLy8gaXQgbWF5IGhhdmUgbm8gZWZmZWN0IGF0IGFsbC4iIFNvLCBkb2luZyBub3RoaW5nIGlzIGFuCiAgICAgICAgIC8vIGFjY2VwdGFibGUgYmVoYXZpb3IgZm9yIHRoaXMgbWV0aG9kLgogCi0gICAgICAgIC8vIEZvciBub3cgRm9udE1hbmFnZXIgdXNlcyAxLjQgZm9udC5wcm9wZXJ0aWVzIHNjaGVtZSBmb3IgZm9udCBtYXBwaW5nLCBzbworICAgICAgICAvLyBGb3Igbm93IEZvbnRNYW5hZ2VyIHVzZXMgMS40IGZvbnQucHJvcGVydGllcyBzY2hlbWUgZm9yIGZvbnQgbWFwcGluZywKKyAgICAgICAgLy8gc28KICAgICAgICAgLy8gdGhpcyBtZXRob2QgZG9lc24ndCBtYWtlIGFueSBzZW5zZS4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kCiAgICAgICAgIC8vIHdoaWNoIHdpbGwgaW5mbHVlbmNlIGZvbnQgbWFwcGluZyBpcyBwb3N0cG9uZWQgdW50aWwKICAgICAgICAgLy8gMS41IG1hcHBpbmcgc2NoZW1lIG5vdCBpbXBsZW1lbnRlZC4KQEAgLTE1MywxOSArMTU2LDE5IEBACiAgICAgICogQ3JlYXRlcyB0aGUgR3JhcGhpY3MyRCBvYmplY3QgZm9yIHJlbmRlcmluZyB0byB0aGUgc3BlY2lmaWVkCiAgICAgICogQnVmZmVyZWRJbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVmZmVyZWRJbWFnZSB0aGUgQnVmZmVyZWRJbWFnZSBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgR3JhcGhpY3MyRCBvYmplY3Qgd2hpY2ggYWxsb3dzIHRvIHJlbmRlciB0byB0aGUgc3BlY2lmaWVkIAotICAgICAqIEJ1ZmZlcmVkSW1hZ2UuCisgICAgICogQHBhcmFtIGJ1ZmZlcmVkSW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBCdWZmZXJlZEltYWdlIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBHcmFwaGljczJEIG9iamVjdCB3aGljaCBhbGxvd3MgdG8gcmVuZGVyIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEdyYXBoaWNzMkQgY3JlYXRlR3JhcGhpY3MoQnVmZmVyZWRJbWFnZSBidWZmZXJlZEltYWdlKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGFycmF5IG9mIGFsbCBhdmFpbGFibGUgZm9udHMgaW5zdGFuY2VzIGluIHRoaXMgCisgICAgICogR2V0cyB0aGUgYXJyYXkgb2YgYWxsIGF2YWlsYWJsZSBmb250cyBpbnN0YW5jZXMgaW4gdGhpcwogICAgICAqIEdyYXBoaWNzRW52aXJvbWVudHMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgYWxsIGF2YWlsYWJsZSBmb250cyBpbnN0YW5jZXMgaW4gdGhpcyAKLSAgICAgKiBHcmFwaGljc0Vudmlyb21lbnRzLgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGFsbCBhdmFpbGFibGUgZm9udHMgaW5zdGFuY2VzIGluIHRoaXMKKyAgICAgKiAgICAgICAgIEdyYXBoaWNzRW52aXJvbWVudHMuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEZvbnRbXSBnZXRBbGxGb250cygpOwogCkBAIC0xODAsMTEgKzE4MywxMSBAQAogICAgICAqIEdldHMgdGhlIGFycmF5IG9mIGFsbCBhdmFpbGFibGUgZm9udCBmYW1pbHkgbmFtZXMgZm9yIHRoZSBzcGVjaWZpZWQKICAgICAgKiBsb2NhbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxvY2FsZSB0aGUgTG9jYWxlIG9iamVjdCB3aGljaCByZXByZXNlbnRzIGdlb2dyYXBoaWNhbAotICAgICAqIHJlZ2lvbi4gVGhlIGRlZmF1bHQgbG9jYWxlIGlzIHVzZWQgaWYgbG9jYWxlIGlzIG51bGwuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgYXZhaWxhYmxlIGZvbnQgZmFtaWx5IG5hbWVzIGZvciB0aGUgc3BlY2lmaWVkIAotICAgICAqIGxvY2FsZS4KKyAgICAgKiBAcGFyYW0gbG9jYWxlCisgICAgICogICAgICAgICAgICB0aGUgTG9jYWxlIG9iamVjdCB3aGljaCByZXByZXNlbnRzIGdlb2dyYXBoaWNhbCByZWdpb24uIFRoZQorICAgICAqICAgICAgICAgICAgZGVmYXVsdCBsb2NhbGUgaXMgdXNlZCBpZiBsb2NhbGUgaXMgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBhdmFpbGFibGUgZm9udCBmYW1pbHkgbmFtZXMgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIGxvY2FsZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0QXZhaWxhYmxlRm9udEZhbWlseU5hbWVzKExvY2FsZSBsb2NhbGUpOwogCkBAIC0xOTIsMTggKzE5NSwxOCBAQAogICAgICAqIEdldHMgdGhlIGRlZmF1bHQgc2NyZWVuIGRldmljZSBhcyBHcmFwaGljRGV2aWNlIG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBHcmFwaGljRGV2aWNlIG9iamVjdCB3aGljaCByZXByZXNlbnRzIGRlZmF1bHQgc2NyZWVuIGRldmljZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIGlmIGlzSGVhZGxlc3MoKSByZXR1cm5zIHRydWUuCisgICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGlzSGVhZGxlc3MoKSByZXR1cm5zIHRydWUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEdyYXBoaWNzRGV2aWNlIGdldERlZmF1bHRTY3JlZW5EZXZpY2UoKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBHZXRzIGFuIGFycmF5IG9mIGFsbCBhdmFpbGFibGUgc2NyZWVuIGRldmljZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgR3JhcGhpY3NEZXZpY2Ugb2JnZWN0cyB3aGljaCByZXByZXNlbnRzIAotICAgICAqIGFsbCBhdmFpbGFibGUgc2NyZWVuIGRldmljZXMuCi0gICAgICogCi0gICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiBpZiBpc0hlYWRsZXNzKCkgcmV0dXJucyB0cnVlLgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIEdyYXBoaWNzRGV2aWNlIG9iamVjdHMgd2hpY2ggcmVwcmVzZW50cyBhbGwKKyAgICAgKiAgICAgICAgIGF2YWlsYWJsZSBzY3JlZW4gZGV2aWNlcy4KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgaXNIZWFkbGVzcygpIHJldHVybnMgdHJ1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgR3JhcGhpY3NEZXZpY2VbXSBnZXRTY3JlZW5EZXZpY2VzKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0hlYWRsZXNzRXhjZXB0aW9uLmphdmEgYi9hd3QvamF2YS9hd3QvSGVhZGxlc3NFeGNlcHRpb24uamF2YQppbmRleCAyOGU0NjNiLi5lYzExMWYxIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvSGVhZGxlc3NFeGNlcHRpb24uamF2YQorKysgYi9hd3QvamF2YS9hd3QvSGVhZGxlc3NFeGNlcHRpb24uamF2YQpAQCAtMTgsMTYgKzE4LDIxIEBACiAgKiBAYXV0aG9yIEFsZXhleSBBLiBQZXRyZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIC8qKgotICogVGhlIEhlYWRsZXNzRXhjZXB0aW9uIGNsYXNzIHByb3ZpZGVzIG5vdGlmaWNhdGlvbnMgYW5kIGVycm9yIG1lc3NhZ2VzIAotICogd2hlbiBjb2RlIHRoYXQgaXMgZGVwZW5kZW50IG9uIGEga2V5Ym9hcmQsIGRpc3BsYXksIG9yIG1vdXNlIGlzIGNhbGxlZCAKLSAqIGluIGFuIGVudmlyb25tZW50IHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBhIGtleWJvYXJkLCBkaXNwbGF5LCBvciBtb3VzZS4KKyAqIFRoZSBIZWFkbGVzc0V4Y2VwdGlvbiBjbGFzcyBwcm92aWRlcyBub3RpZmljYXRpb25zIGFuZCBlcnJvciBtZXNzYWdlcyB3aGVuCisgKiBjb2RlIHRoYXQgaXMgZGVwZW5kZW50IG9uIGEga2V5Ym9hcmQsIGRpc3BsYXksIG9yIG1vdXNlIGlzIGNhbGxlZCBpbiBhbgorICogZW52aXJvbm1lbnQgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGEga2V5Ym9hcmQsIGRpc3BsYXksIG9yIG1vdXNlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEhlYWRsZXNzRXhjZXB0aW9uIGV4dGVuZHMgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gewotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE2NzE4MzY0NDk0NDM1ODU2M0w7CiAKICAgICAvKioKQEAgLTQwLDcgKzQ1LDggQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgaGVhZGxlc3MgZXhjZXB0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBtc2cgdGhlIFN0cmluZyB3aGljaCByZXByZXNlbnRzIGVycm9yIG1lc3NhZ2UuIAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgd2hpY2ggcmVwcmVzZW50cyBlcnJvciBtZXNzYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBIZWFkbGVzc0V4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvSGVhZGxlc3NHcmFwaGljc0Vudmlyb25tZW50LmphdmEgYi9hd3QvamF2YS9hd3QvSGVhZGxlc3NHcmFwaGljc0Vudmlyb25tZW50LmphdmEKaW5kZXggOTdmODhkMS4uMzA2MzkzZiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0hlYWRsZXNzR3JhcGhpY3NFbnZpcm9ubWVudC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9IZWFkbGVzc0dyYXBoaWNzRW52aXJvbm1lbnQuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3NEZXZpY2U7CkBAIC0yMywzMCArMjQsMzIgQEAKIAogLyoqCiAgKiBUaGUgSGVhZGxlc3NHcmFwaGljc0Vudmlyb25tZW50IGNsYXNzIGlzIHRoZSBDb21tb25HcmFwaGljc0Vudmlyb25tZW50Ci0gKiBpbXBsZW1lbnRhdGlvbiB0byB1c2UgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIGVudmlyb25tZW50IGxhY2tzIGRpc3BsYXksIAorICogaW1wbGVtZW50YXRpb24gdG8gdXNlIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBlbnZpcm9ubWVudCBsYWNrcyBkaXNwbGF5LAogICoga2V5Ym9hcmQsIGFuZCBtb3VzZSBzdXBwb3J0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEhlYWRsZXNzR3JhcGhpY3NFbnZpcm9ubWVudCBleHRlbmRzIENvbW1vbkdyYXBoaWNzRW52aXJvbm1lbnQgewotICAgIAorCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhIGRpc3BsYXksIGtleWJvYXJkLCBhbmQgbW91c2UgYXJlIHN1cHBvcnRlZCAKLSAgICAgKiBpbiB0aGlzIGdyYXBoaWNzIGVudmlyb25tZW50LgorICAgICAqIFJldHVybnMgd2hldGhlciBvciBub3QgYSBkaXNwbGF5LCBrZXlib2FyZCwgYW5kIG1vdXNlIGFyZSBzdXBwb3J0ZWQgaW4KKyAgICAgKiB0aGlzIGdyYXBoaWNzIGVudmlyb25tZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgSGVhZGxlc3NFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gZnJvbSBhcmVhcyBvZiAKLSAgICAgKiB0aGUgZ3JhcGhpY3MgZW52aXJvbm1lbnQgdGhhdCBhcmUgZGVwZW5kZW50IG9uIGEgZGlzcGxheSwga2V5Ym9hcmQsIAotICAgICAqIG9yIG1vdXNlOyBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBIZWFkbGVzc0V4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBmcm9tIGFyZWFzIG9mIHRoZQorICAgICAqICAgICAgICAgZ3JhcGhpY3MgZW52aXJvbm1lbnQgdGhhdCBhcmUgZGVwZW5kZW50IG9uIGEgZGlzcGxheSwga2V5Ym9hcmQsCisgICAgICogICAgICAgICBvciBtb3VzZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzSGVhZGxlc3NJbnN0YW5jZSgpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZGVmYXVsdCBzY3JlZW4gZGV2aWNlIGFzIEdyYXBoaWNEZXZpY2Ugb2JqZWN0LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIEdyYXBoaWNEZXZpY2Ugb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgZGVmYXVsdCBzY3JlZW4gZGV2aWNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gaWYgaXNIZWFkbGVzcygpIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgaXNIZWFkbGVzcygpIHJldHVybnMgdHJ1ZS4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgR3JhcGhpY3NEZXZpY2UgZ2V0RGVmYXVsdFNjcmVlbkRldmljZSgpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CkBAIC01NiwxMCArNTksMTAgQEAKICAgICAvKioKICAgICAgKiBHZXRzIGFuIGFycmF5IG9mIGFsbCBhdmFpbGFibGUgc2NyZWVuIGRldmljZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgR3JhcGhpY3NEZXZpY2Ugb2JqZWN0cyB3aGljaCByZXByZXNlbnRzIAotICAgICAqIGFsbCBhdmFpbGFibGUgc2NyZWVuIGRldmljZXMuCi0gICAgICogCi0gICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiBpZiBpc0hlYWRsZXNzKCkgcmV0dXJucyB0cnVlLgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIEdyYXBoaWNzRGV2aWNlIG9iamVjdHMgd2hpY2ggcmVwcmVzZW50cyBhbGwKKyAgICAgKiAgICAgICAgIGF2YWlsYWJsZSBzY3JlZW4gZGV2aWNlcy4KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgaXNIZWFkbGVzcygpIHJldHVybnMgdHJ1ZS4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgR3JhcGhpY3NEZXZpY2VbXSBnZXRTY3JlZW5EZXZpY2VzKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9IZWFkbGVzc1Rvb2xraXQuamF2YSBiL2F3dC9qYXZhL2F3dC9IZWFkbGVzc1Rvb2xraXQuamF2YQppbmRleCBhN2RkNTU3Li5jNjRhODVhIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvSGVhZGxlc3NUb29sa2l0LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0hlYWRsZXNzVG9vbGtpdC5qYXZhCkBAIC0yNiwxMzYgKzI2LDc1IEBACiAvL2ltcG9ydCBqYXZhLmF3dC5kbmQuSW52YWxpZERuRE9wZXJhdGlvbkV4Y2VwdGlvbjsKIC8vaW1wb3J0IGphdmEuYXd0LmRuZC5wZWVyLkRyYWdTb3VyY2VDb250ZXh0UGVlcjsKIGltcG9ydCBqYXZhLmF3dC5pbS5JbnB1dE1ldGhvZEhpZ2hsaWdodDsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5Db2xvck1vZGVsOwotLy9pbXBvcnQgamF2YS5hd3QucGVlci4qOworaW1wb3J0IGphdmEuYXd0LmltYWdlLkNvbG9yTW9kZWw7IC8vaW1wb3J0IGphdmEuYXd0LnBlZXIuKjsKIC8vaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VTdXBwb3J0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LkNvbXBvbmVudEludGVybmFsczsKLS8vaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuZGF0YXRyYW5zZmVyLkRUSzsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LkNvbXBvbmVudEludGVybmFsczsgLy9pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5kYXRhdHJhbnNmZXIuRFRLOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3Qud3RrLkdyYXBoaWNzRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0Lnd0ay5OYXRpdmVFdmVudFF1ZXVlOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3Qud3RrLldpbmRvd0ZhY3Rvcnk7CiAKIC8qKgotICogVGhlIEhlYWRsZXNzVG9vbGtpdCBjbGFzcyBpcyBhIHN1YmNsYXNzIG9mIFRvb2xraXRJbXBsIHRvIAotICogYmUgdXNlZCBmb3IgZ3JhcGhpY2FsIGVudmlyb25tZW50cyB0aGF0IGxhY2sga2V5Ym9hcmQgYW5kIAotICogbW91c2UgY2FwYWJpbGl0aWVzLgorICogVGhlIEhlYWRsZXNzVG9vbGtpdCBjbGFzcyBpcyBhIHN1YmNsYXNzIG9mIFRvb2xraXRJbXBsIHRvIGJlIHVzZWQgZm9yCisgKiBncmFwaGljYWwgZW52aXJvbm1lbnRzIHRoYXQgbGFjayBrZXlib2FyZCBhbmQgbW91c2UgY2FwYWJpbGl0aWVzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEhlYWRsZXNzVG9vbGtpdCBleHRlbmRzIFRvb2xraXRJbXBsIHsKLSAgICAKLSAgICAvLz8/P0FXVAorCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQnV0dG9uUGVlciBjcmVhdGVCdXR0b24oQnV0dG9uIGEwKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENoZWNrYm94UGVlciBjcmVhdGVDaGVja2JveChDaGVja2JveCBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENoZWNrYm94TWVudUl0ZW1QZWVyIGNyZWF0ZUNoZWNrYm94TWVudUl0ZW0oQ2hlY2tib3hNZW51SXRlbSBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDaG9pY2VQZWVyIGNyZWF0ZUNob2ljZShDaG9pY2UgYTApIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBDdXJzb3IgY3JlYXRlQ3VzdG9tQ3Vyc29yKEltYWdlIGltZywgUG9pbnQgaG90U3BvdCwgU3RyaW5nIG5hbWUpCi0gICAgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIERpYWxvZ1BlZXIgY3JlYXRlRGlhbG9nKERpYWxvZyBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxUIGV4dGVuZHMgRHJhZ0dlc3R1cmVSZWNvZ25pemVyPiBUIGNyZWF0ZURyYWdHZXN0dXJlUmVjb2duaXplcigKLSAgICAgICAgICAgIENsYXNzPFQ+IHJlY29nbml6ZXJBYnN0cmFjdENsYXNzLCBEcmFnU291cmNlIGRzLCBDb21wb25lbnQgYywgaW50IHNyY0FjdGlvbnMsCi0gICAgICAgICAgICBEcmFnR2VzdHVyZUxpc3RlbmVyIGRnbCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRHJhZ1NvdXJjZUNvbnRleHRQZWVyIGNyZWF0ZURyYWdTb3VyY2VDb250ZXh0UGVlcihEcmFnR2VzdHVyZUV2ZW50IGRnZSkKLSAgICB0aHJvd3MgSW52YWxpZERuRE9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBJbnZhbGlkRG5ET3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEZpbGVEaWFsb2dQZWVyIGNyZWF0ZUZpbGVEaWFsb2coRmlsZURpYWxvZyBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEZyYW1lUGVlciBjcmVhdGVGcmFtZShGcmFtZSBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIExhYmVsUGVlciBjcmVhdGVMYWJlbChMYWJlbCBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIExpc3RQZWVyIGNyZWF0ZUxpc3QoTGlzdCBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE1lbnVQZWVyIGNyZWF0ZU1lbnUoTWVudSBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE1lbnVCYXJQZWVyIGNyZWF0ZU1lbnVCYXIoTWVudUJhciBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE1lbnVJdGVtUGVlciBjcmVhdGVNZW51SXRlbShNZW51SXRlbSBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFBvcHVwTWVudVBlZXIgY3JlYXRlUG9wdXBNZW51KFBvcHVwTWVudSBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFNjcm9sbGJhclBlZXIgY3JlYXRlU2Nyb2xsYmFyKFNjcm9sbGJhciBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFNjcm9sbFBhbmVQZWVyIGNyZWF0ZVNjcm9sbFBhbmUoU2Nyb2xsUGFuZSBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFRleHRBcmVhUGVlciBjcmVhdGVUZXh0QXJlYShUZXh0QXJlYSBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFRleHRGaWVsZFBlZXIgY3JlYXRlVGV4dEZpZWxkKFRleHRGaWVsZCBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFdpbmRvd1BlZXIgY3JlYXRlV2luZG93KFdpbmRvdyBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgICovCisgICAgICogQE92ZXJyaWRlIHByb3RlY3RlZCBCdXR0b25QZWVyIGNyZWF0ZUJ1dHRvbihCdXR0b24gYTApIHRocm93cworICAgICAqIEhlYWRsZXNzRXhjZXB0aW9uIHsgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHJvdGVjdGVkIENoZWNrYm94UGVlciBjcmVhdGVDaGVja2JveChDaGVja2JveCBhMCkgdGhyb3dzCisgICAgICogSGVhZGxlc3NFeGNlcHRpb24geyB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsgfQorICAgICAqIEBPdmVycmlkZSBwcm90ZWN0ZWQgQ2hlY2tib3hNZW51SXRlbVBlZXIKKyAgICAgKiBjcmVhdGVDaGVja2JveE1lbnVJdGVtKENoZWNrYm94TWVudUl0ZW0gYTApIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CisgICAgICogdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHJvdGVjdGVkIENob2ljZVBlZXIgY3JlYXRlQ2hvaWNlKENob2ljZSBhMCkgdGhyb3dzCisgICAgICogSGVhZGxlc3NFeGNlcHRpb24geyB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsgfSBwdWJsaWMgQ3Vyc29yCisgICAgICogY3JlYXRlQ3VzdG9tQ3Vyc29yKEltYWdlIGltZywgUG9pbnQgaG90U3BvdCwgU3RyaW5nIG5hbWUpIHRocm93cworICAgICAqIEhlYWRsZXNzRXhjZXB0aW9uIHsgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHJvdGVjdGVkIERpYWxvZ1BlZXIgY3JlYXRlRGlhbG9nKERpYWxvZyBhMCkgdGhyb3dzCisgICAgICogSGVhZGxlc3NFeGNlcHRpb24geyB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsgfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgPFQgZXh0ZW5kcyBEcmFnR2VzdHVyZVJlY29nbml6ZXI+IFQKKyAgICAgKiBjcmVhdGVEcmFnR2VzdHVyZVJlY29nbml6ZXIoIENsYXNzPFQ+IHJlY29nbml6ZXJBYnN0cmFjdENsYXNzLCBEcmFnU291cmNlCisgICAgICogZHMsIENvbXBvbmVudCBjLCBpbnQgc3JjQWN0aW9ucywgRHJhZ0dlc3R1cmVMaXN0ZW5lciBkZ2wpIHsgcmV0dXJuIG51bGw7CisgICAgICogfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgRHJhZ1NvdXJjZUNvbnRleHRQZWVyCisgICAgICogY3JlYXRlRHJhZ1NvdXJjZUNvbnRleHRQZWVyKERyYWdHZXN0dXJlRXZlbnQgZGdlKSB0aHJvd3MKKyAgICAgKiBJbnZhbGlkRG5ET3BlcmF0aW9uRXhjZXB0aW9uIHsgdGhyb3cgbmV3IEludmFsaWREbkRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgKiB9CisgICAgICogQE92ZXJyaWRlIHByb3RlY3RlZCBGaWxlRGlhbG9nUGVlciBjcmVhdGVGaWxlRGlhbG9nKEZpbGVEaWFsb2cgYTApIHRocm93cworICAgICAqIEhlYWRsZXNzRXhjZXB0aW9uIHsgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHJvdGVjdGVkIEZyYW1lUGVlciBjcmVhdGVGcmFtZShGcmFtZSBhMCkgdGhyb3dzCisgICAgICogSGVhZGxlc3NFeGNlcHRpb24geyB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsgfQorICAgICAqIEBPdmVycmlkZSBwcm90ZWN0ZWQgTGFiZWxQZWVyIGNyZWF0ZUxhYmVsKExhYmVsIGEwKSB0aHJvd3MKKyAgICAgKiBIZWFkbGVzc0V4Y2VwdGlvbiB7IHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOyB9CisgICAgICogQE92ZXJyaWRlIHByb3RlY3RlZCBMaXN0UGVlciBjcmVhdGVMaXN0KExpc3QgYTApIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbgorICAgICAqIHsgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHJvdGVjdGVkIE1lbnVQZWVyIGNyZWF0ZU1lbnUoTWVudSBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogeyB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsgfQorICAgICAqIEBPdmVycmlkZSBwcm90ZWN0ZWQgTWVudUJhclBlZXIgY3JlYXRlTWVudUJhcihNZW51QmFyIGEwKSB0aHJvd3MKKyAgICAgKiBIZWFkbGVzc0V4Y2VwdGlvbiB7IHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOyB9CisgICAgICogQE92ZXJyaWRlIHByb3RlY3RlZCBNZW51SXRlbVBlZXIgY3JlYXRlTWVudUl0ZW0oTWVudUl0ZW0gYTApIHRocm93cworICAgICAqIEhlYWRsZXNzRXhjZXB0aW9uIHsgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHJvdGVjdGVkIFBvcHVwTWVudVBlZXIgY3JlYXRlUG9wdXBNZW51KFBvcHVwTWVudSBhMCkgdGhyb3dzCisgICAgICogSGVhZGxlc3NFeGNlcHRpb24geyB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsgfQorICAgICAqIEBPdmVycmlkZSBwcm90ZWN0ZWQgU2Nyb2xsYmFyUGVlciBjcmVhdGVTY3JvbGxiYXIoU2Nyb2xsYmFyIGEwKSB0aHJvd3MKKyAgICAgKiBIZWFkbGVzc0V4Y2VwdGlvbiB7IHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOyB9CisgICAgICogQE92ZXJyaWRlIHByb3RlY3RlZCBTY3JvbGxQYW5lUGVlciBjcmVhdGVTY3JvbGxQYW5lKFNjcm9sbFBhbmUgYTApIHRocm93cworICAgICAqIEhlYWRsZXNzRXhjZXB0aW9uIHsgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHJvdGVjdGVkIFRleHRBcmVhUGVlciBjcmVhdGVUZXh0QXJlYShUZXh0QXJlYSBhMCkgdGhyb3dzCisgICAgICogSGVhZGxlc3NFeGNlcHRpb24geyB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsgfQorICAgICAqIEBPdmVycmlkZSBwcm90ZWN0ZWQgVGV4dEZpZWxkUGVlciBjcmVhdGVUZXh0RmllbGQoVGV4dEZpZWxkIGEwKSB0aHJvd3MKKyAgICAgKiBIZWFkbGVzc0V4Y2VwdGlvbiB7IHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOyB9CisgICAgICogQE92ZXJyaWRlIHByb3RlY3RlZCBXaW5kb3dQZWVyIGNyZWF0ZVdpbmRvdyhXaW5kb3cgYTApIHRocm93cworICAgICAqIEhlYWRsZXNzRXhjZXB0aW9uIHsgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7IH0KKyAgICAgKi8KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0QmVzdEN1cnNvclNpemUoaW50IHByZWZXaWR0aCwgaW50IHByZWZIZWlnaHQpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CkBAIC0xODYsMjUgKzEyNSwxOCBAQAogICAgIHB1YmxpYyBpbnQgZ2V0TWVudVNob3J0Y3V0S2V5TWFzaygpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOwogICAgIH0KLSAgICAKLSAgICAvLz8/P0FXVAorCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBAT3ZlcnJpZGUKLSAgICBOYXRpdmVFdmVudFF1ZXVlIGdldE5hdGl2ZUV2ZW50UXVldWUoKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFByaW50Sm9iIGdldFByaW50Sm9iKEZyYW1lIGZyYW1lLCBTdHJpbmcgam9idGl0bGUsIEpvYkF0dHJpYnV0ZXMgam9iQXR0cmlidXRlcywgCi0gICAgICAgICAgICBQYWdlQXR0cmlidXRlcyBwYWdlQXR0cmlidXRlcykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUHJpbnRKb2IgZ2V0UHJpbnRKb2IoRnJhbWUgZnJhbWUsIFN0cmluZyBqb2J0aXRsZSwgUHJvcGVydGllcyBwcm9wcykgdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICB7Ci0gICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgIH0KLSAgICAqLworICAgICAqIEBPdmVycmlkZSBOYXRpdmVFdmVudFF1ZXVlIGdldE5hdGl2ZUV2ZW50UXVldWUoKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24KKyAgICAgKiB7IHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOyB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBQcmludEpvYiBnZXRQcmludEpvYihGcmFtZSBmcmFtZSwgU3RyaW5nIGpvYnRpdGxlLAorICAgICAqIEpvYkF0dHJpYnV0ZXMgam9iQXR0cmlidXRlcywgUGFnZUF0dHJpYnV0ZXMgcGFnZUF0dHJpYnV0ZXMpIHRocm93cworICAgICAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7IHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsgfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgUHJpbnRKb2IgZ2V0UHJpbnRKb2IoRnJhbWUgZnJhbWUsIFN0cmluZyBqb2J0aXRsZSwKKyAgICAgKiBQcm9wZXJ0aWVzIHByb3BzKSB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24geyB0aHJvdyBuZXcKKyAgICAgKiBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOyB9CisgICAgICovCiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSW5zZXRzIGdldFNjcmVlbkluc2V0cyhHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2MpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CkBAIC0yMTQsNDQgKzE0NiwzNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0U2NyZWVuUmVzb2x1dGlvbigpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOwotICAgIH0gICAgCisgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIERpbWVuc2lvbiBnZXRTY3JlZW5TaXplKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7CiAgICAgfQotICAgIAotICAgIC8vPz8/QVdUCisKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbGlwYm9hcmQgZ2V0U3lzdGVtQ2xpcGJvYXJkKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfSAgICAKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2xpcGJvYXJkIGdldFN5c3RlbVNlbGVjdGlvbigpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBXaW5kb3dGYWN0b3J5IGdldFdpbmRvd0ZhY3RvcnkoKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgKi8KKyAgICAgKiBAT3ZlcnJpZGUgcHVibGljIENsaXBib2FyZCBnZXRTeXN0ZW1DbGlwYm9hcmQoKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24KKyAgICAgKiB7IHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOyB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBDbGlwYm9hcmQgZ2V0U3lzdGVtU2VsZWN0aW9uKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogeyB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsgfQorICAgICAqIEBPdmVycmlkZSBXaW5kb3dGYWN0b3J5IGdldFdpbmRvd0ZhY3RvcnkoKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24geworICAgICAqIHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOyB9CisgICAgICovCiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewogICAgICAgICBsb2NrQVdUKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBDb21wb25lbnRJbnRlcm5hbHMuc2V0Q29tcG9uZW50SW50ZXJuYWxzKG5ldyBDb21wb25lbnRJbnRlcm5hbHNJbXBsKCkpOwotICAgICAgICAgICAgLy8/Pz9BV1Q6IG5ldyBFdmVudFF1ZXVlKHRoaXMpOyAvLyBjcmVhdGUgdGhlIHN5c3RlbSBFdmVudFF1ZXVlCi0gICAgICAgICAgICAvLz8/P0FXVDogZGlzcGF0Y2hlciA9IG5ldyBEaXNwYXRjaGVyKHRoaXMpOworICAgICAgICAgICAgLy8gPz8/QVdUOiBuZXcgRXZlbnRRdWV1ZSh0aGlzKTsgLy8gY3JlYXRlIHRoZSBzeXN0ZW0gRXZlbnRRdWV1ZQorICAgICAgICAgICAgLy8gPz8/QVdUOiBkaXNwYXRjaGVyID0gbmV3IERpc3BhdGNoZXIodGhpcyk7CiAgICAgICAgICAgICBkZXNrdG9wUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAgICAgLy8/Pz9BV1Q6IGRlc2t0b3BQcm9wc1N1cHBvcnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VTdXBwb3J0KHRoaXMpOwotLy8gICAgICAgICAgPz8/QVdUOiBhd3RFdmVudHNNYW5hZ2VyID0gbmV3IEFXVEV2ZW50c01hbmFnZXIoKTsKLS8vICAgICAgICAgID8/P0FXVDogZGlzcGF0Y2hUaHJlYWQgPSBuZXcgSGVhZGxlc3NFdmVudERpc3BhdGNoVGhyZWFkKHRoaXMsIGRpc3BhdGNoZXIpOyAgICAgICAgICAgIAotLy8gICAgICAgICAgPz8/QVdUOiBkdGsgPSBEVEsuZ2V0RFRLKCk7Ci0gICAgICAgICAgICBkaXNwYXRjaFRocmVhZC5zdGFydCgpOyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gPz8/QVdUOiBkZXNrdG9wUHJvcHNTdXBwb3J0ID0gbmV3IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCh0aGlzKTsKKyAgICAgICAgICAgIC8vID8/P0FXVDogYXd0RXZlbnRzTWFuYWdlciA9IG5ldyBBV1RFdmVudHNNYW5hZ2VyKCk7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IGRpc3BhdGNoVGhyZWFkID0gbmV3IEhlYWRsZXNzRXZlbnREaXNwYXRjaFRocmVhZCh0aGlzLAorICAgICAgICAgICAgLy8gZGlzcGF0Y2hlcik7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IGR0ayA9IERUSy5nZXREVEsoKTsKKyAgICAgICAgICAgIGRpc3BhdGNoVGhyZWFkLnN0YXJ0KCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB1bmxvY2tBV1QoKTsKICAgICAgICAgfQpAQCAtMjg0LDggKzIwOSw4IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgTWFwPGphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSwgPz4gbWFwSW5wdXRNZXRob2RIaWdobGlnaHRJbXBsKAotICAgICAgICAgICAgSW5wdXRNZXRob2RIaWdobGlnaHQgaGlnaGxpZ2h0KSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24geworICAgIE1hcDxqYXZhLmF3dC5mb250LlRleHRBdHRyaWJ1dGUsID8+IG1hcElucHV0TWV0aG9kSGlnaGxpZ2h0SW1wbChJbnB1dE1ldGhvZEhpZ2hsaWdodCBoaWdobGlnaHQpCisgICAgICAgICAgICB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9JbGxlZ2FsQ29tcG9uZW50U3RhdGVFeGNlcHRpb24uamF2YSBiL2F3dC9qYXZhL2F3dC9JbGxlZ2FsQ29tcG9uZW50U3RhdGVFeGNlcHRpb24uamF2YQppbmRleCAyMWRjMzVmLi5iZWQxNzI5IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvSWxsZWdhbENvbXBvbmVudFN0YXRlRXhjZXB0aW9uLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0lsbGVnYWxDb21wb25lbnRTdGF0ZUV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwzNCArMTgsMzggQEAKICAqIEBhdXRob3IgTWljaGFlbCBEYW5pbG92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dDsKIAogLyoqCi0gKiBUaGUgSWxsZWdhbENvbXBvbmVudFN0YXRlRXhjZXB0aW9uIGNsYXNzIGlzIHVzZWQgdG8gcHJvdmlkZSAKLSAqIG5vdGlmaWNhdGlvbiB0aGF0IEFXVCBjb21wb25lbnQgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIAotICogZm9yIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorICogVGhlIElsbGVnYWxDb21wb25lbnRTdGF0ZUV4Y2VwdGlvbiBjbGFzcyBpcyB1c2VkIHRvIHByb3ZpZGUgbm90aWZpY2F0aW9uIHRoYXQKKyAqIEFXVCBjb21wb25lbnQgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbGxlZ2FsQ29tcG9uZW50U3RhdGVFeGNlcHRpb24gZXh0ZW5kcyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xODg5MzM5NTg3MjA4MTQ0MjM4TDsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbGxlZ2FsQ29tcG9uZW50U3RhdGVFeGNlcHRpb24gd2l0aAotICAgICAqIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSWxsZWdhbENvbXBvbmVudFN0YXRlRXhjZXB0aW9uIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG1lc3NhZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIFN0cmluZyBtZXNzYWdlIHdoaWNoIGRlc2NyaWJlcyB0aGUgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIG1lc3NhZ2Ugd2hpY2ggZGVzY3JpYmVzIHRoZSBleGNlcHRpb24uCiAgICAgICovCiAgICAgcHVibGljIElsbGVnYWxDb21wb25lbnRTdGF0ZUV4Y2VwdGlvbihTdHJpbmcgcykgewogICAgICAgICBzdXBlcihzKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSWxsZWdhbENvbXBvbmVudFN0YXRlRXhjZXB0aW9uIHdpdGhvdXQKLSAgICAgKiBkZXRhaWxlZCBtZXNzYWdlLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbGxlZ2FsQ29tcG9uZW50U3RhdGVFeGNlcHRpb24gd2l0aG91dCBkZXRhaWxlZAorICAgICAqIG1lc3NhZ2UuCiAgICAgICovCiAgICAgcHVibGljIElsbGVnYWxDb21wb25lbnRTdGF0ZUV4Y2VwdGlvbigpIHsKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0ltYWdlLmphdmEgYi9hd3QvamF2YS9hd3QvSW1hZ2UuamF2YQppbmRleCBjMjE3ZTM4Li43YWUzZWQ4IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvSW1hZ2UuamF2YQorKysgYi9hd3QvamF2YS9hd3QvSW1hZ2UuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIGltcG9ydCBqYXZhLmF3dC5pbWFnZS5BcmVhQXZlcmFnaW5nU2NhbGVGaWx0ZXI7CkBAIC0zMCw2NCArMzEsNjcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgSW1hZ2UgYWJzdHJhY3QgY2xhc3MgcmVwcmVzZW50cyB0aGUgZ3JhcGhpYyBpbWFnZXMuIAorICogVGhlIEltYWdlIGFic3RyYWN0IGNsYXNzIHJlcHJlc2VudHMgdGhlIGdyYXBoaWMgaW1hZ2VzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEltYWdlIHsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgVW5kZWZpbmVkUHJvcGVydHkgb2JqZWN0IHNob3VsZCBiZSByZXR1cm5lZCBpZgotICAgICAqIHByb3BlcnR5IGlzIG5vdCBkZWZpbmVkIGZvciBhIHBhcnRpY3VsYXIgaW1hZ2UuIAorICAgIC8qKgorICAgICAqIFRoZSBVbmRlZmluZWRQcm9wZXJ0eSBvYmplY3Qgc2hvdWxkIGJlIHJldHVybmVkIGlmIHByb3BlcnR5IGlzIG5vdAorICAgICAqIGRlZmluZWQgZm9yIGEgcGFydGljdWxhciBpbWFnZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBVbmRlZmluZWRQcm9wZXJ0eSA9IG5ldyBPYmplY3QoKTsgIC8vJE5PTi1MT0NLLTEkCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVW5kZWZpbmVkUHJvcGVydHkgPSBuZXcgT2JqZWN0KCk7IC8vICROT04tTE9DSy0xJAogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBTQ0FMRV9ERUZBVUxUIGluZGljYXRlcyB0aGUgZGVmYXVsdCBpbWFnZQotICAgICAqIHNjYWxpbmcgYWxnb3JpdGhtLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU0NBTEVfREVGQVVMVCBpbmRpY2F0ZXMgdGhlIGRlZmF1bHQgaW1hZ2Ugc2NhbGluZyBhbGdvcml0aG0uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NBTEVfREVGQVVMVCA9IDE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFNDQUxFX0ZBU1QgaW5kaWNhdGVzIGFuIGltYWdlIHNjYWxpbmcgYWxnb3JpdGhtIHdoaWNoIAotICAgICAqIHBsYWNlcyBhIGhpZ2hlciBwcmlvcml0eSBvbiBzY2FsaW5nIHNwZWVkIHRoYW4gb24gdGhlIGltYWdlJ3Mgc21vb3RobmVzcy4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNDQUxFX0ZBU1QgaW5kaWNhdGVzIGFuIGltYWdlIHNjYWxpbmcgYWxnb3JpdGhtIHdoaWNoIHBsYWNlcworICAgICAqIGEgaGlnaGVyIHByaW9yaXR5IG9uIHNjYWxpbmcgc3BlZWQgdGhhbiBvbiB0aGUgaW1hZ2UncyBzbW9vdGhuZXNzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDQUxFX0ZBU1QgPSAyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBTQ0FMRV9TTU9PVEggaW5kaWNhdGVzIGFuIGltYWdlIHNjYWxpbmcgYWxnb3JpdGhtIHdoaWNoIAotICAgICAqIHBsYWNlcyBhIGhpZ2hlciBwcmlvcml0eSBvbiBpbWFnZSBzbW9vdGhuZXNzIHRoYW4gb24gc2NhbGluZyBzcGVlZC4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNDQUxFX1NNT09USCBpbmRpY2F0ZXMgYW4gaW1hZ2Ugc2NhbGluZyBhbGdvcml0aG0gd2hpY2gKKyAgICAgKiBwbGFjZXMgYSBoaWdoZXIgcHJpb3JpdHkgb24gaW1hZ2Ugc21vb3RobmVzcyB0aGFuIG9uIHNjYWxpbmcgc3BlZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NBTEVfU01PT1RIID0gNDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgU0NBTEVfUkVQTElDQVRFIGluZGljYXRlcyB0aGUgaW1hZ2Ugc2NhbGluZyAKLSAgICAgKiBhbGdvcml0aG0gaW4gdGhlIFJlcGxpY2F0ZVNjYWxlRmlsdGVyIGNsYXNzLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU0NBTEVfUkVQTElDQVRFIGluZGljYXRlcyB0aGUgaW1hZ2Ugc2NhbGluZyBhbGdvcml0aG0gaW4gdGhlCisgICAgICogUmVwbGljYXRlU2NhbGVGaWx0ZXIgY2xhc3MuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NBTEVfUkVQTElDQVRFID0gODsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgU0NBTEVfQVJFQV9BVkVSQUdJTkcgaW5kaWNhdGVzICAKLSAgICAgKiB0aGUgYXJlYSBhdmVyYWdpbmcgaW1hZ2Ugc2NhbGluZyBhbGdvcml0aG0uIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBTQ0FMRV9BUkVBX0FWRVJBR0lORyBpbmRpY2F0ZXMgdGhlIGFyZWEgYXZlcmFnaW5nIGltYWdlCisgICAgICogc2NhbGluZyBhbGdvcml0aG0uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NBTEVfQVJFQV9BVkVSQUdJTkcgPSAxNjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgYWNjZWxlcmF0aW9uIHByaW9yaXR5IGluZGljYXRlcyBpbWFnZSBhY2NlbGVyYXRpb24uICAgCisgICAgLyoqCisgICAgICogVGhlIGFjY2VsZXJhdGlvbiBwcmlvcml0eSBpbmRpY2F0ZXMgaW1hZ2UgYWNjZWxlcmF0aW9uLgogICAgICAqLwogICAgIHByb3RlY3RlZCBmbG9hdCBhY2NlbGVyYXRpb25Qcmlvcml0eSA9IDAuNWY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGNhcGFiaWxpdGllcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgY2FwYWJpbGl0aWVzLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlQ2FwYWJpbGl0aWVzIGNhcGFiaWxpdGllcyA9IG5ldyBJbWFnZUNhcGFiaWxpdGllcyhmYWxzZSk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBpbWFnZSBwcm9wZXJ0eSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKiBUaGUgVW5kZWZpbmVkUHJvcGVydHkgb2JqZWN0IHNob3VsZCBiZSByZXR1cm4gaWYgdGhlIHByb3BlcnR5IGlzIAotICAgICAqIG5vdCBzcGVjaWZpZWQgZm9yIHRoaXMgaW1hZ2UuICBUaGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZSBudWxsIGlmIHRoZQotICAgICAqIHByb3BlcnR5IGlzIGN1cnJlbnRseSB1bmtub3duIHlldCBhbmQgdGhlIHNwZWNpZmllZCBJbWFnZU9ic2VydmVyIGlzCi0gICAgICogdG8gYmUgbm90aWZpZWQgbGF0ZXIuIAorICAgICAqIEdldHMgdGhlIGltYWdlIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUaGUgVW5kZWZpbmVkUHJvcGVydHkKKyAgICAgKiBvYmplY3Qgc2hvdWxkIGJlIHJldHVybiBpZiB0aGUgcHJvcGVydHkgaXMgbm90IHNwZWNpZmllZCBmb3IgdGhpcyBpbWFnZS4KKyAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZSBudWxsIGlmIHRoZSBwcm9wZXJ0eSBpcyBjdXJyZW50bHkgdW5rbm93biB5ZXQKKyAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBJbWFnZU9ic2VydmVyIGlzIHRvIGJlIG5vdGlmaWVkIGxhdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGltYWdlJ3MgcHJvcGVydHkuCi0gICAgICogQHBhcmFtIG9ic2VydmVyIHRoZSBJbWFnZU9ic2VydmVyLgotICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiBpbWFnZSdzIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSBvYnNlcnZlcgorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlT2JzZXJ2ZXIuCiAgICAgICogQHJldHVybiB0aGUgT2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBuYW1lLCBJbWFnZU9ic2VydmVyIG9ic2VydmVyKTsKQEAgLTEwMCwzOSArMTA0LDQwIEBACiAgICAgcHVibGljIGFic3RyYWN0IEltYWdlUHJvZHVjZXIgZ2V0U291cmNlKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB3aWR0aCBvZiB0aGlzIGltYWdlLiBUaGUgc3BlY2lmaWVkIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IAotICAgICAqIGlzIG5vdGlmaWVkIHdoZW4gdGhlIHdpZHRoIG9mIHRoaXMgaW1hZ2UgaXMgYXZhaWxhYmxlLgorICAgICAqIEdldHMgdGhlIHdpZHRoIG9mIHRoaXMgaW1hZ2UuIFRoZSBzcGVjaWZpZWQgSW1hZ2VPYnNlcnZlciBvYmplY3QgaXMKKyAgICAgKiBub3RpZmllZCB3aGVuIHRoZSB3aWR0aCBvZiB0aGlzIGltYWdlIGlzIGF2YWlsYWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHdoaWNoIGlzIAotICAgICAqIGlzIG5vdGlmaWVkIHdoZW4gdGhlIHdpZHRoIG9mIHRoaXMgaW1hZ2UgaXMgYXZhaWxhYmxlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHdpZHRoIG9mIGltYWdlLCBvciAtMSBpZiB0aGUgd2lkdGggb2YgdGhpcyBpbWFnZSAKLSAgICAgKiBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqIEBwYXJhbSBvYnNlcnZlcgorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHdoaWNoIGlzIGlzIG5vdGlmaWVkIHdoZW4gdGhlIHdpZHRoCisgICAgICogICAgICAgICAgICBvZiB0aGlzIGltYWdlIGlzIGF2YWlsYWJsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB3aWR0aCBvZiBpbWFnZSwgb3IgLTEgaWYgdGhlIHdpZHRoIG9mIHRoaXMgaW1hZ2UgaXMgbm90CisgICAgICogICAgICAgICBhdmFpbGFibGUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRXaWR0aChJbWFnZU9ic2VydmVyIG9ic2VydmVyKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhlaWdodCBvZiB0aGlzIGltYWdlLiBUaGUgc3BlY2lmaWVkIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IAotICAgICAqIGlzIG5vdGlmaWVkIHdoZW4gdGhlIGhlaWdodCBvZiB0aGlzIGltYWdlIGlzIGF2YWlsYWJsZS4KKyAgICAgKiBHZXRzIHRoZSBoZWlnaHQgb2YgdGhpcyBpbWFnZS4gVGhlIHNwZWNpZmllZCBJbWFnZU9ic2VydmVyIG9iamVjdCBpcworICAgICAqIG5vdGlmaWVkIHdoZW4gdGhlIGhlaWdodCBvZiB0aGlzIGltYWdlIGlzIGF2YWlsYWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHdoaWNoIGlzIAotICAgICAqIGlzIG5vdGlmaWVkIHdoZW4gdGhlIGhlaWdodCBvZiB0aGlzIGltYWdlIGlzIGF2YWlsYWJsZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBoZWlnaHQgb2YgaW1hZ2UsIG9yIC0xIGlmIHRoZSBoZWlnaHQgb2YgdGhpcyBpbWFnZSAKLSAgICAgKiBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqIEBwYXJhbSBvYnNlcnZlcgorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHdoaWNoIGlzIGlzIG5vdGlmaWVkIHdoZW4gdGhlIGhlaWdodAorICAgICAqICAgICAgICAgICAgb2YgdGhpcyBpbWFnZSBpcyBhdmFpbGFibGUuCisgICAgICogQHJldHVybiB0aGUgaGVpZ2h0IG9mIGltYWdlLCBvciAtMSBpZiB0aGUgaGVpZ2h0IG9mIHRoaXMgaW1hZ2UgaXMgbm90CisgICAgICogICAgICAgICBhdmFpbGFibGUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRIZWlnaHQoSW1hZ2VPYnNlcnZlciBvYnNlcnZlcik7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzY2FsZWQgaW5zdGFuY2Ugb2YgdGhpcyBJbWFnZS4gVGhpcyBtZXRob2QgcmV0dXJucyAKLSAgICAgKiBhbiBJbWFnZSBvYmplY3QgY29uc3RydWN0ZWQgZnJvbSB0aGUgc291cmNlIG9mIHRoaXMgaW1hZ2UgCi0gICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoLCBoZWlnaHQsIGFuZCBhcHBsaWVkIHNjYWxpbmcKLSAgICAgKiBhbGdob3JpdGhtLgorICAgICAqIEdldHMgdGhlIHNjYWxlZCBpbnN0YW5jZSBvZiB0aGlzIEltYWdlLiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIEltYWdlCisgICAgICogb2JqZWN0IGNvbnN0cnVjdGVkIGZyb20gdGhlIHNvdXJjZSBvZiB0aGlzIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIHdpZHRoLCBoZWlnaHQsIGFuZCBhcHBsaWVkIHNjYWxpbmcgYWxnb3JpdGhtLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2Ygc2NhbGVkIEltYWdlLiAKLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2Ygc2NhbGVkIEltYWdlLgotICAgICAqIEBwYXJhbSBoaW50cyB0aGUgY29uc3RhbnQgd2hpY2ggaW5kaWNhdGVzIHNjYWxpbmcgYWxnb3JpdGhtLiAKLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBzY2FsZWQgSW1hZ2UuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiBzY2FsZWQgSW1hZ2UuCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgY29uc3RhbnQgd2hpY2ggaW5kaWNhdGVzIHNjYWxpbmcgYWxnb3JpdGhtLgogICAgICAqIEByZXR1cm4gdGhlIHNjYWxlZCBJbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgSW1hZ2UgZ2V0U2NhbGVkSW5zdGFuY2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgaGludHMpIHsKQEAgLTE0NywxNyArMTUyLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIEdyYXBoaWNzIG9iamVjdCBmb3IgcmVuZGVyaW5nIHRoaXMgaW1hZ2UuIAotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBvZmYtc2NyZWVuIGltYWdlcy4KKyAgICAgKiBHZXRzIGEgR3JhcGhpY3Mgb2JqZWN0IGZvciByZW5kZXJpbmcgdGhpcyBpbWFnZS4gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQKKyAgICAgKiBmb3Igb2ZmLXNjcmVlbiBpbWFnZXMuCiAgICAgICogCiAgICAgICogQHJldHVybiBhIEdyYXBoaWNzIG9iamVjdCBmb3IgcmVuZGVyaW5nIHRvIHRoaXMgaW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEdyYXBoaWNzIGdldEdyYXBoaWNzKCk7CiAKICAgICAvKioKLSAgICAgKiBGbHVzaGVzIHJlc291cmNlcyB3aGljaCBhcmUgdXNlZCBieSB0aGlzIEltYWdlIG9iamVjdC4gCi0gICAgICogVGhpcyBtZXRob2QgcmVzZXRzIHRoZSBpbWFnZSB0byB0aGUgcmVjb25zdHJ1Y3RlcmVkIHN0YXRlCi0gICAgICogZnJvbSB0aGUgaW1hZ2UncyBzb3VyY2UuCisgICAgICogRmx1c2hlcyByZXNvdXJjZXMgd2hpY2ggYXJlIHVzZWQgYnkgdGhpcyBJbWFnZSBvYmplY3QuIFRoaXMgbWV0aG9kIHJlc2V0cworICAgICAqIHRoZSBpbWFnZSB0byB0aGUgcmVjb25zdHJ1Y3RlZCBzdGF0ZSBmcm9tIHRoZSBpbWFnZSdzIHNvdXJjZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmbHVzaCgpOwogCkBAIC0xNzEsMTAgKzE3NSwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFjY2VsZXJhdGlvbiBwcmlvcml0eSBmb3IgdGhpcyBpbWFnZS4gIAotICAgICAqICAKLSAgICAgKiBAcGFyYW0gcHJpb3JpdHkgdGhlIG5ldyBhY2NlbGVyYXRpb24gcHJpb3JpdHkgKHZhbHVlIGluIHRoZQotICAgICAqIHJhbmdlIDAtMSkuCisgICAgICogU2V0cyB0aGUgYWNjZWxlcmF0aW9uIHByaW9yaXR5IGZvciB0aGlzIGltYWdlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcmlvcml0eQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBhY2NlbGVyYXRpb24gcHJpb3JpdHkgKHZhbHVlIGluIHRoZSByYW5nZSAwLTEpLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEFjY2VsZXJhdGlvblByaW9yaXR5KGZsb2F0IHByaW9yaXR5KSB7CiAgICAgICAgIGlmIChwcmlvcml0eSA8IDAgfHwgcHJpb3JpdHkgPiAxKSB7CkBAIC0xODUsMTkgKzE4OSwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gSW1hZ2VDYXBhYmlsaXRpZXMgb2JqZWN0IG9mIHRoaXMgSW1hZ2Ugb2JqZWN0Ci0gICAgICogZm9yIHRoZSBzcGVjaWZpZWQgR3JhcGhpY3NDb25maWd1cmF0aW9uLiAKKyAgICAgKiBHZXRzIGFuIEltYWdlQ2FwYWJpbGl0aWVzIG9iamVjdCBvZiB0aGlzIEltYWdlIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZ2MgdGhlIHNwZWNpZmllZCBHcmFwaGljc0NvbmZpZ3VyYXRpb24gb2JqZWN0IAotICAgICAqIChudWxsIHZhbHVlIG1lYW5zIGRlZmF1bHQgR3JhcGhpY3NDb25maWd1cmF0aW9uKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIEltYWdlQ2FwYWJpbGl0aWVzIG9iamVjdCBvZiB0aGlzIEltYWdlIG9iamVjdAotICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gZ2MKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgR3JhcGhpY3NDb25maWd1cmF0aW9uIG9iamVjdCAobnVsbCB2YWx1ZSBtZWFucworICAgICAqICAgICAgICAgICAgZGVmYXVsdCBHcmFwaGljc0NvbmZpZ3VyYXRpb24pLgorICAgICAqIEByZXR1cm4gYW4gSW1hZ2VDYXBhYmlsaXRpZXMgb2JqZWN0IG9mIHRoaXMgSW1hZ2Ugb2JqZWN0IGZvciB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBHcmFwaGljc0NvbmZpZ3VyYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIEltYWdlQ2FwYWJpbGl0aWVzIGdldENhcGFiaWxpdGllcyhHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2MpIHsKICAgICAgICAgLy8gTm90ZTogY29tbW9uIGltYWdlIGlzIG5vdCBhY2NlbGVyYXRlZC4KICAgICAgICAgcmV0dXJuIGNhcGFiaWxpdGllczsKICAgICB9CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0ltYWdlQ2FwYWJpbGl0aWVzLmphdmEgYi9hd3QvamF2YS9hd3QvSW1hZ2VDYXBhYmlsaXRpZXMuamF2YQppbmRleCA2ZTllY2ZjLi5jNmQ1OTQ2IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvSW1hZ2VDYXBhYmlsaXRpZXMuamF2YQorKysgYi9hd3QvamF2YS9hd3QvSW1hZ2VDYXBhYmlsaXRpZXMuamF2YQpAQCAtMTgsMjIgKzE4LDI3IEBACiAgKiBAYXV0aG9yIEFsZXhleSBBLiBQZXRyZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIC8qKgogICogVGhlIEltYWdlQ2FwYWJpbGl0aWVzIGNsYXNzIGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IGFuIGltYWdlJ3MgY2FwYWJpbGl0aWVzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEltYWdlQ2FwYWJpbGl0aWVzIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLSAgICAKLSAgICAvKiogVGhlIGFjY2VsZXJhdGVkLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGFjY2VsZXJhdGVkLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBhY2NlbGVyYXRlZDsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbWFnZUNhcGFiaWxpdGllcyB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBhY2NlbGVyYXRpb24gZmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBhY2NlbGVyYXRpb24KLSAgICAgKiBpcyBkZXNpcmVkIG9yIG5vdC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2VDYXBhYmlsaXRpZXMgd2l0aCB0aGUgc3BlY2lmaWVkIGFjY2VsZXJhdGlvbiBmbGFnCisgICAgICogd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgYWNjZWxlcmF0aW9uIGlzIGRlc2lyZWQgb3Igbm90LgogICAgICAqIAotICAgICAqIEBwYXJhbSBhY2NlbGVyYXRlZCB0aGUgYWNjZWxlcmF0ZWQgZmxhZy4KKyAgICAgKiBAcGFyYW0gYWNjZWxlcmF0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBhY2NlbGVyYXRlZCBmbGFnLgogICAgICAqLwogICAgIHB1YmxpYyBJbWFnZUNhcGFiaWxpdGllcyhib29sZWFuIGFjY2VsZXJhdGVkKSB7CiAgICAgICAgIHRoaXMuYWNjZWxlcmF0ZWQgPSBhY2NlbGVyYXRlZDsKQEAgLTUwLDIzICs1NSwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybmUgdHJ1ZSBpZiB0aGUgSW1hZ2Ugb2YgdGhpcyBJbWFnZUNhcGFiaWxpdGllcyBpcyBvciBjYW4gYmUKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEltYWdlIG9mIHRoaXMgSW1hZ2VDYXBhYmlsaXRpZXMgaXMgb3IgY2FuIGJlCiAgICAgICogYWNjZWxlcmF0ZWQuCi0gICAgICogIAorICAgICAqIAogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIEltYWdlIG9mIHRoaXMgSW1hZ2VDYXBhYmlsaXRpZXMgaXMgb3IgY2FuIGJlCi0gICAgICogYWNjZWxlcmF0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAgICAgICAgIGFjY2VsZXJhdGVkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNBY2NlbGVyYXRlZCgpIHsKICAgICAgICAgcmV0dXJuIGFjY2VsZXJhdGVkOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIEltYWdlQ2FwYWJpbGl0aWVzIGFwcGxpZXMgdG8KLSAgICAgKiB0aGUgVm9sYXRpbGVJbWFnZSB3aGljaCBjYW4gbG9zZSBpdHMgc3VyZmFjZXMuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgSW1hZ2VDYXBhYmlsaXRpZXMgYXBwbGllcyB0byB0aGUgVm9sYXRpbGVJbWFnZSB3aGljaAorICAgICAqIGNhbiBsb3NlIGl0cyBzdXJmYWNlcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBJbWFnZUNhcGFiaWxpdGllcyBhcHBsaWVzIHRvCi0gICAgICogdGhlIFZvbGF0aWxlSW1hZ2Ugd2hpY2ggY2FuIGxvc2UgaXRzIHN1cmZhY2VzLCAKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgSW1hZ2VDYXBhYmlsaXRpZXMgYXBwbGllcyB0byB0aGUgVm9sYXRpbGVJbWFnZSB3aGljaAorICAgICAqICAgICAgICAgY2FuIGxvc2UgaXRzIHN1cmZhY2VzLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNUcnVlVm9sYXRpbGUoKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0luc2V0cy5qYXZhIGIvYXd0L2phdmEvYXd0L0luc2V0cy5qYXZhCmluZGV4IDYxZjNmZDguLjA0ZjE5OGMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9JbnNldHMuamF2YQorKysgYi9hd3QvamF2YS9hd3QvSW5zZXRzLmphdmEKQEAgLTE4LDQ0ICsxOCw0OSBAQAogICogQGF1dGhvciBEbWl0cnkgQS4gRHVybmV2CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dDsKIAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lm1pc2MuSGFzaENvZGU7CiAKLQogLyoqCi0gKiBUaGUgSW5zZXRzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGJvcmRlcnMgb2YgYSBjb250YWluZXIuIAotICogVGhpcyBjbGFzcyBkZXNjcmliZXMgdGhlIHNwYWNlIHRoYXQgYSBjb250YWluZXIgc2hvdWxkIGxlYXZlIGF0IGVhY2ggZWRnZToKLSAqIHRoZSB0b3AsIHRoZSBib3R0b20sIHRoZSByaWdodCBzaWRlLCBhbmQgdGhlIGxlZnQgc2lkZS4gCi0gKiBUaGUgc3BhY2UgY2FuIGJlIGZpbGxlZCB3aXRoIGEgYm9yZGVyLCBhIGJsYW5rIHNwYWNlLCBvciBhIHRpdGxlLgorICogVGhlIEluc2V0cyBjbGFzcyByZXByZXNlbnRzIHRoZSBib3JkZXJzIG9mIGEgY29udGFpbmVyLiBUaGlzIGNsYXNzIGRlc2NyaWJlcworICogdGhlIHNwYWNlIHRoYXQgYSBjb250YWluZXIgc2hvdWxkIGxlYXZlIGF0IGVhY2ggZWRnZTogdGhlIHRvcCwgdGhlIGJvdHRvbSwKKyAqIHRoZSByaWdodCBzaWRlLCBhbmQgdGhlIGxlZnQgc2lkZS4gVGhlIHNwYWNlIGNhbiBiZSBmaWxsZWQgd2l0aCBhIGJvcmRlciwgYQorICogYmxhbmsgc3BhY2UsIG9yIGEgdGl0bGUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSW5zZXRzIGltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUgewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yMjcyNTcyNjM3Njk1NDY2NzQ5TDsKIAogICAgIC8qKgotICAgICAqIFRoZSB0b3AgaW5zZXQgaW5kaWNhdGVzIHRoZSBzaXplIG9mIHRoZSBzcGFjZSBhZGRlZCB0byB0aGUgCi0gICAgICogdG9wIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogVGhlIHRvcCBpbnNldCBpbmRpY2F0ZXMgdGhlIHNpemUgb2YgdGhlIHNwYWNlIGFkZGVkIHRvIHRoZSB0b3Agb2YgdGhlCisgICAgICogcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgdG9wOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBsZWZ0IGluc2V0IGluZGljYXRlcyB0aGUgc2l6ZSBvZiB0aGUgc3BhY2UgYWRkZWQgdG8gdGhlIAotICAgICAqIGxlZnQgc2lkZSBvZiB0aGUgcmVjdGFuZ2xlLgorICAgIC8qKgorICAgICAqIFRoZSBsZWZ0IGluc2V0IGluZGljYXRlcyB0aGUgc2l6ZSBvZiB0aGUgc3BhY2UgYWRkZWQgdG8gdGhlIGxlZnQgc2lkZSBvZgorICAgICAqIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIGludCBsZWZ0OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBib3R0b20gaW5zZXQgaW5kaWNhdGVzIHRoZSBzaXplIG9mIHRoZSBzcGFjZSBzdWJ0cmFjdGVkIGZyb20gCi0gICAgICogdGhlIGJvdHRvbSBvZiB0aGUgcmVjdGFuZ2xlLgorICAgIC8qKgorICAgICAqIFRoZSBib3R0b20gaW5zZXQgaW5kaWNhdGVzIHRoZSBzaXplIG9mIHRoZSBzcGFjZSBzdWJ0cmFjdGVkIGZyb20gdGhlCisgICAgICogYm90dG9tIG9mIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIGludCBib3R0b207CiAKLSAgICAvKiogVGhlIHJpZ2h0IGluc2V0IGluZGljYXRlcyB0aGUgc2l6ZSBvZiB0aGUgc3BhY2Ugc3VidHJhY3RlZCBmcm9tIAotICAgICAqIHRoZSByaWdodCBzaWRlIG9mIHRoZSByZWN0YW5nbGUuIAorICAgIC8qKgorICAgICAqIFRoZSByaWdodCBpbnNldCBpbmRpY2F0ZXMgdGhlIHNpemUgb2YgdGhlIHNwYWNlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgcmlnaHQKKyAgICAgKiBzaWRlIG9mIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIGludCByaWdodDsKIApAQCAtNjMsMTAgKzY4LDE0IEBACiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEluc2V0IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgdG9wLCBsZWZ0LCBib3R0b20sCiAgICAgICogcmlnaHQgcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdG9wIHRoZSB0b3AgaW5zZXQuCi0gICAgICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgaW5zZXQuCi0gICAgICogQHBhcmFtIGJvdHRvbSB0aGUgYm90dG9tIGluc2V0LgotICAgICAqIEBwYXJhbSByaWdodCB0aGUgcmlnaHQgaW5zZXQuCisgICAgICogQHBhcmFtIHRvcAorICAgICAqICAgICAgICAgICAgdGhlIHRvcCBpbnNldC4KKyAgICAgKiBAcGFyYW0gbGVmdAorICAgICAqICAgICAgICAgICAgdGhlIGxlZnQgaW5zZXQuCisgICAgICogQHBhcmFtIGJvdHRvbQorICAgICAqICAgICAgICAgICAgdGhlIGJvdHRvbSBpbnNldC4KKyAgICAgKiBAcGFyYW0gcmlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSByaWdodCBpbnNldC4KICAgICAgKi8KICAgICBwdWJsaWMgSW5zZXRzKGludCB0b3AsIGludCBsZWZ0LCBpbnQgYm90dG9tLCBpbnQgcmlnaHQpIHsKICAgICAgICAgc2V0VmFsdWVzKHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCk7CkBAIC0xMDAsMTAgKzEwOSwxMCBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiB0aGlzIEluc2V0cyBvYmplY3QgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG8gdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBvYmplY3QgaXMgYW4gSW5zZXRzIG9iamVjdCB3aG9zZSBkYXRhIHZhbHVlcwotICAgICAqIGFyZSBlcXVhbCB0byB0aG9zZSBvZiB0aGlzIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBvCisgICAgICogICAgICAgICAgICB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIG9iamVjdCBpcyBhbiBJbnNldHMgb2JqZWN0IHdob3NlIGRhdGEgdmFsdWVzIGFyZQorICAgICAqICAgICAgICAgZXF1YWwgdG8gdGhvc2Ugb2YgdGhpcyBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKQEAgLTExMSw5ICsxMjAsOCBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJbnNldHMpIHsKLSAgICAgICAgICAgIEluc2V0cyBpID0gKEluc2V0cykgbzsKLSAgICAgICAgICAgIHJldHVybiAoKGkubGVmdCA9PSBsZWZ0KSAmJiAoaS5ib3R0b20gPT0gYm90dG9tKSAmJgotICAgICAgICAgICAgICAgICAgICAoaS5yaWdodCA9PSByaWdodCkgJiYgKGkudG9wID09IHRvcCkpOworICAgICAgICAgICAgSW5zZXRzIGkgPSAoSW5zZXRzKW87CisgICAgICAgICAgICByZXR1cm4gKChpLmxlZnQgPT0gbGVmdCkgJiYgKGkuYm90dG9tID09IGJvdHRvbSkgJiYgKGkucmlnaHQgPT0gcmlnaHQpICYmIChpLnRvcCA9PSB0b3ApKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMTI1LDIzICsxMzMsMjYgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAvKiBUaGUgZm9ybWF0IGlzIGJhc2VkIG9uIDEuNSByZWxlYXNlIGJlaGF2aW9yIAotICAgICAgICAgKiB3aGljaCBjYW4gYmUgcmV2ZWFsZWQgYnkgdGhlIGZvbGxvd2luZyBjb2RlOgotICAgICAgICAgKiBTeXN0ZW0ub3V0LnByaW50bG4obmV3IEluc2V0cygxLCAyLCAzLCA0KSk7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBmb3JtYXQgaXMgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3Igd2hpY2ggY2FuIGJlIHJldmVhbGVkIGJ5CisgICAgICAgICAqIHRoZSBmb2xsb3dpbmcgY29kZTogU3lzdGVtLm91dC5wcmludGxuKG5ldyBJbnNldHMoMSwgMiwgMywgNCkpOwogICAgICAgICAgKi8KIAotICAgICAgICByZXR1cm4gKGdldENsYXNzKCkuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAiW2xlZnQ9IiArIGxlZnQgKyAiLHRvcD0iICsgdG9wICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgIixyaWdodD0iICsgcmlnaHQgKyAiLGJvdHRvbT0iICArIGJvdHRvbSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisgICAgICAgIHJldHVybiAoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiW2xlZnQ9IiArIGxlZnQgKyAiLHRvcD0iICsgdG9wICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgICAgICAgICAgIixyaWdodD0iICsgcmlnaHQgKyAiLGJvdHRvbT0iICsgYm90dG9tICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKICAgICB9CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRvcCwgbGVmdCwgYm90dG9tLCBhbmQgcmlnaHQgaW5zZXRzIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBpbnNldC4KLSAgICAgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCBpbnNldC4KLSAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20gaW5zZXQuCi0gICAgICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCBpbnNldC4KKyAgICAgKiBAcGFyYW0gdG9wCisgICAgICogICAgICAgICAgICB0aGUgdG9wIGluc2V0LgorICAgICAqIEBwYXJhbSBsZWZ0CisgICAgICogICAgICAgICAgICB0aGUgbGVmdCBpbnNldC4KKyAgICAgKiBAcGFyYW0gYm90dG9tCisgICAgICogICAgICAgICAgICB0aGUgYm90dG9tIGluc2V0LgorICAgICAqIEBwYXJhbSByaWdodAorICAgICAqICAgICAgICAgICAgdGhlIHJpZ2h0IGluc2V0LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldChpbnQgdG9wLCBpbnQgbGVmdCwgaW50IGJvdHRvbSwgaW50IHJpZ2h0KSB7CiAgICAgICAgIHNldFZhbHVlcyh0b3AsIGxlZnQsIGJvdHRvbSwgcmlnaHQpOwpAQCAtMTUwLDEwICsxNjEsMTQgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB2YWx1ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRvcCB0aGUgdG9wCi0gICAgICogQHBhcmFtIGxlZnQgdGhlIGxlZnQKLSAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20KLSAgICAgKiBAcGFyYW0gcmlnaHQgdGhlIHJpZ2h0CisgICAgICogQHBhcmFtIHRvcAorICAgICAqICAgICAgICAgICAgdGhlIHRvcC4KKyAgICAgKiBAcGFyYW0gbGVmdAorICAgICAqICAgICAgICAgICAgdGhlIGxlZnQuCisgICAgICogQHBhcmFtIGJvdHRvbQorICAgICAqICAgICAgICAgICAgdGhlIGJvdHRvbS4KKyAgICAgKiBAcGFyYW0gcmlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSByaWdodC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWVzKGludCB0b3AsIGludCBsZWZ0LCBpbnQgYm90dG9tLCBpbnQgcmlnaHQpIHsKICAgICAgICAgdGhpcy50b3AgPSB0b3A7CkBAIC0xNjIsNCArMTc3LDMgQEAKICAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0OwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0l0ZW1TZWxlY3RhYmxlLmphdmEgYi9hd3QvamF2YS9hd3QvSXRlbVNlbGVjdGFibGUuamF2YQppbmRleCBhNDYzNjRiLi4yMTJjZjcwIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvSXRlbVNlbGVjdGFibGUuamF2YQorKysgYi9hd3QvamF2YS9hd3QvSXRlbVNlbGVjdGFibGUuamF2YQpAQCAtMTgsMzUgKzE4LDQxIEBACiAgKiBAYXV0aG9yIE1pY2hhZWwgRGFuaWxvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIGltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtTGlzdGVuZXI7CiAKIC8qKgogICogVGhlIEl0ZW1TZWxlY3RhYmxlIGludGVyZmFjZSByZXByZXNlbnRzIGEgc2V0IG9mIGl0ZW1zIHdoaWNoIGNhbiBiZSBzZWxlY3RlZC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSXRlbVNlbGVjdGFibGUgewogCiAgICAgLyoqCi0gICAgICogQWRkcyBhbiBJdGVtTGlzdGVuZXIgZm9yIHJlY2VpdmluZyBpdGVtIGV2ZW50cyB3aGVuIHRoZSBzdGF0ZSBvZiBhbiBpdGVtIAotICAgICAqIGlzIGNoYW5nZWQgYnkgdGhlIHVzZXIuIAorICAgICAqIEFkZHMgYW4gSXRlbUxpc3RlbmVyIGZvciByZWNlaXZpbmcgaXRlbSBldmVudHMgd2hlbiB0aGUgc3RhdGUgb2YgYW4gaXRlbQorICAgICAqIGlzIGNoYW5nZWQgYnkgdGhlIHVzZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIEl0ZW1MaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIEl0ZW1MaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRJdGVtTGlzdGVuZXIoSXRlbUxpc3RlbmVyIGwpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgc2VsZWN0ZWQgb2JqZWN0cyBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHNlbGVjdGVkIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBzZWxlY3RlZCBvYmplY3RzIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gc2VsZWN0ZWQgCisgICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgc2VsZWN0ZWQgb2JqZWN0cyBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHNlbGVjdGVkCiAgICAgICogb2JqZWN0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHNlbGVjdGVkIG9iamVjdHMgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzZWxlY3RlZAorICAgICAqICAgICAgICAgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3RbXSBnZXRTZWxlY3RlZE9iamVjdHMoKTsKIAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBJdGVtTGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIEl0ZW1MaXN0ZW5lciB3aGljaCB3aWxsIGJlIHJlbW92ZWQuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBJdGVtTGlzdGVuZXIgd2hpY2ggd2lsbCBiZSByZW1vdmVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUl0ZW1MaXN0ZW5lcihJdGVtTGlzdGVuZXIgbCk7CiAKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9NZW51Q29tcG9uZW50LmphdmEgYi9hd3QvamF2YS9hd3QvTWVudUNvbXBvbmVudC5qYXZhCmluZGV4IDllYjRmM2QuLjljMWIxMjAgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9NZW51Q29tcG9uZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L01lbnVDb21wb25lbnQuamF2YQpAQCAtMjEsOCArMjEsNyBAQAogaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7CiBpbXBvcnQgamF2YS5hd3QucGVlci5NZW51Q29tcG9uZW50UGVlcjsKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotLy9pbXBvcnQgamF2YXguYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7IC8vaW1wb3J0IGphdmF4LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZTsKIC8vaW1wb3J0IGphdmF4LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbXBvbmVudDsKIC8vaW1wb3J0IGphdmF4LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRleHQ7CiAvL2ltcG9ydCBqYXZheC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVSb2xlOwpAQCAtMzEsMzcxICszMCwxNzIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmdsLk11bHRpUmVjdEFyZWE7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5zdGF0ZS5NZW51SXRlbVN0YXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3Quc3RhdGUuTWVudVN0YXRlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247CiAKIC8qKgotICogVGhlIE1lbnVDb21wb25lbnQgYWJzdHJhY3QgY2xhc3MgaXMgdGhlIHN1cGVyY2xhc3MgZm9yIG1lbnUgCi0gKiBjb21wb25lbnRzLiBNZW51IGNvbXBvbmVudHMgcmVjZWl2ZSBhbmQgcHJvY2VzcyBBV1QgZXZlbnRzLgorICogVGhlIE1lbnVDb21wb25lbnQgYWJzdHJhY3QgY2xhc3MgaXMgdGhlIHN1cGVyY2xhc3MgZm9yIG1lbnUgY29tcG9uZW50cy4gTWVudQorICogY29tcG9uZW50cyByZWNlaXZlIGFuZCBwcm9jZXNzIEFXVCBldmVudHMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ1MzY5MDIzNTYyMjM4OTQzNzlMOwogCi0gICAgLyoqIFRoZSBuYW1lLiAqLworICAgIC8qKgorICAgICAqIFRoZSBuYW1lLgorICAgICAqLwogICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CiAKLSAgICAvKiogVGhlIGZvbnQuICovCisgICAgLyoqCisgICAgICogVGhlIGZvbnQuCisgICAgICovCiAgICAgcHJpdmF0ZSBGb250IGZvbnQ7CiAKLSAgICAvKiogVGhlIHBhcmVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcGFyZW50LgorICAgICAqLwogICAgIE1lbnVDb250YWluZXIgcGFyZW50OwogCi0gICAgLyoqIFRoZSBkZXByZWNhdGVkIGV2ZW50IGhhbmRsZXIuICovCisgICAgLyoqCisgICAgICogVGhlIGRlcHJlY2F0ZWQgZXZlbnQgaGFuZGxlci4KKyAgICAgKi8KICAgICBib29sZWFuIGRlcHJlY2F0ZWRFdmVudEhhbmRsZXIgPSB0cnVlOwogCi0gICAgLyoqIFRoZSBzZWxlY3RlZCBpdGVtIGluZGV4LiAqLworICAgIC8qKgorICAgICAqIFRoZSBzZWxlY3RlZCBpdGVtIGluZGV4LgorICAgICAqLwogICAgIHByaXZhdGUgaW50IHNlbGVjdGVkSXRlbUluZGV4OwogCi0gICAgLy8/Pz9BV1Q6IHByaXZhdGUgQWNjZXNzaWJsZUNvbnRleHQgYWNjZXNzaWJsZUNvbnRleHQ7CisgICAgLy8gPz8/QVdUOiBwcml2YXRlIEFjY2Vzc2libGVDb250ZXh0IGFjY2Vzc2libGVDb250ZXh0OwogCi0gICAgLyoqIFRoZSB0b29sa2l0LiAqLworICAgIC8qKgorICAgICAqIFRoZSB0b29sa2l0LgorICAgICAqLwogICAgIGZpbmFsIFRvb2xraXQgdG9vbGtpdCA9IFRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKTsKIAotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgQWNjZXNzaWJsZUFXVE1lbnVDb21wb25lbnQgZXh0ZW5kcyBBY2Nlc3NpYmxlQ29udGV4dCBpbXBsZW1lbnRzCi0gICAgICAgICAgICBTZXJpYWxpemFibGUsIEFjY2Vzc2libGVDb21wb25lbnQsIEFjY2Vzc2libGVTZWxlY3Rpb24gewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDI2OTUzMzQxNjIyMzc5ODY5OEw7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkRm9jdXNMaXN0ZW5lcihGb2N1c0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhQb2ludCBwdCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEFjY2Vzc2libGUgZ2V0QWNjZXNzaWJsZUF0KFBvaW50IHB0KSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUmVjdGFuZ2xlIGdldEJvdW5kcygpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEN1cnNvciBnZXRDdXJzb3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBGb250IGdldEZvbnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVudUNvbXBvbmVudC50aGlzLmdldEZvbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBGb250TWV0cmljcyBnZXRGb250TWV0cmljcyhGb250IGZvbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbG9yIGdldEZvcmVncm91bmQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFBvaW50IGdldExvY2F0aW9uT25TY3JlZW4oKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0U2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGFsd2F5cyBlbmFibGVkCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzVHJhdmVyc2FibGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gYWx3YXlzIGZvY3VzIHRyYXZlcnNhYmxlCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsvLyBhbHdheXMgc2hvd2luZwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGFsd2F5cyB2aXNpYmxlCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVGb2N1c0xpc3RlbmVyKEZvY3VzTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RGb2N1cygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQoQ29sb3IgY29sb3IpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEJvdW5kcyhSZWN0YW5nbGUgcmVjdCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q3Vyc29yKEN1cnNvciBjdXJzb3IpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb250KEZvbnQgZm9udCkgewotICAgICAgICAgICAgTWVudUNvbXBvbmVudC50aGlzLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kKENvbG9yIGNvbG9yKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihQb2ludCBwdCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2l6ZShEaW1lbnNpb24gcHQpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRBY2Nlc3NpYmxlU2VsZWN0aW9uKGludCBpbmRleCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXJBY2Nlc3NpYmxlU2VsZWN0aW9uKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEFjY2Vzc2libGUgZ2V0QWNjZXNzaWJsZVNlbGVjdGlvbihpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRBY2Nlc3NpYmxlU2VsZWN0aW9uQ291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWNjZXNzaWJsZUNoaWxkU2VsZWN0ZWQoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVBY2Nlc3NpYmxlU2VsZWN0aW9uKGludCBpbmRleCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0QWxsQWNjZXNzaWJsZVNlbGVjdGlvbigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQWNjZXNzaWJsZSBnZXRBY2Nlc3NpYmxlQ2hpbGQoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldEFjY2Vzc2libGVDaGlsZHJlbkNvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFjY2Vzc2libGVDb21wb25lbnQgZ2V0QWNjZXNzaWJsZUNvbXBvbmVudCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzaWJsZURlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEFjY2Vzc2libGVEZXNjcmlwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QWNjZXNzaWJsZUluZGV4SW5QYXJlbnQoKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQWNjZXNzaWJsZSBhUGFyZW50ID0gZ2V0QWNjZXNzaWJsZVBhcmVudCgpOwotICAgICAgICAgICAgICAgIGludCBhSW5kZXggPSAtMTsKLSAgICAgICAgICAgICAgICBpZiAoYVBhcmVudCBpbnN0YW5jZW9mIE1lbnVDb21wb25lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgTWVudUNvbXBvbmVudCBwYXJlbnQgPSAoTWVudUNvbXBvbmVudCkgYVBhcmVudDsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gcGFyZW50LmdldEl0ZW1Db3VudCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVDb21wb25lbnQgY29tcCA9IHBhcmVudC5nZXRJdGVtKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBBY2Nlc3NpYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYUluZGV4Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgPT0gTWVudUNvbXBvbmVudC50aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc2libGVOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEFjY2Vzc2libGVOYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFjY2Vzc2libGUgZ2V0QWNjZXNzaWJsZVBhcmVudCgpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBBY2Nlc3NpYmxlIGFQYXJlbnQgPSBzdXBlci5nZXRBY2Nlc3NpYmxlUGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYVBhcmVudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgTWVudUNvbnRhaW5lciBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgQWNjZXNzaWJsZSkgewotICAgICAgICAgICAgICAgICAgICBhUGFyZW50ID0gKEFjY2Vzc2libGUpIHBhcmVudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFQYXJlbnQ7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFjY2Vzc2libGVSb2xlIGdldEFjY2Vzc2libGVSb2xlKCkgewotICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc2libGVSb2xlLkFXVF9DT01QT05FTlQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFjY2Vzc2libGVTZWxlY3Rpb24gZ2V0QWNjZXNzaWJsZVNlbGVjdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBY2Nlc3NpYmxlU3RhdGVTZXQgZ2V0QWNjZXNzaWJsZVN0YXRlU2V0KCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NpYmxlU3RhdGVTZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotICAgICAgICB9Ci0gICAgfQotICAgICovCisgICAgICogcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIEFjY2Vzc2libGVBV1RNZW51Q29tcG9uZW50IGV4dGVuZHMKKyAgICAgKiBBY2Nlc3NpYmxlQ29udGV4dCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgQWNjZXNzaWJsZUNvbXBvbmVudCwKKyAgICAgKiBBY2Nlc3NpYmxlU2VsZWN0aW9uIHsgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0KKyAgICAgKiAtNDI2OTUzMzQxNjIyMzc5ODY5OEw7IHB1YmxpYyB2b2lkIGFkZEZvY3VzTGlzdGVuZXIoRm9jdXNMaXN0ZW5lcgorICAgICAqIGxpc3RlbmVyKSB7IH0gcHVibGljIGJvb2xlYW4gY29udGFpbnMoUG9pbnQgcHQpIHsgcmV0dXJuIGZhbHNlOyB9IHB1YmxpYworICAgICAqIEFjY2Vzc2libGUgZ2V0QWNjZXNzaWJsZUF0KFBvaW50IHB0KSB7IHJldHVybiBudWxsOyB9IHB1YmxpYyBDb2xvcgorICAgICAqIGdldEJhY2tncm91bmQoKSB7IHJldHVybiBudWxsOyB9IHB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKCkgeyByZXR1cm4KKyAgICAgKiBudWxsOyB9IHB1YmxpYyBDdXJzb3IgZ2V0Q3Vyc29yKCkgeyByZXR1cm4gbnVsbDsgfSBwdWJsaWMgRm9udCBnZXRGb250KCkKKyAgICAgKiB7IHJldHVybiBNZW51Q29tcG9uZW50LnRoaXMuZ2V0Rm9udCgpOyB9IHB1YmxpYyBGb250TWV0cmljcworICAgICAqIGdldEZvbnRNZXRyaWNzKEZvbnQgZm9udCkgeyByZXR1cm4gbnVsbDsgfSBwdWJsaWMgQ29sb3IgZ2V0Rm9yZWdyb3VuZCgpIHsKKyAgICAgKiByZXR1cm4gbnVsbDsgfSBwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oKSB7IHJldHVybiBudWxsOyB9IHB1YmxpYyBQb2ludAorICAgICAqIGdldExvY2F0aW9uT25TY3JlZW4oKSB7IHJldHVybiBudWxsOyB9IHB1YmxpYyBEaW1lbnNpb24gZ2V0U2l6ZSgpIHsKKyAgICAgKiByZXR1cm4gbnVsbDsgfSBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7IHJldHVybiB0cnVlOyAvLyBhbHdheXMKKyAgICAgKiBlbmFibGVkIH0gcHVibGljIGJvb2xlYW4gaXNGb2N1c1RyYXZlcnNhYmxlKCkgeyByZXR1cm4gdHJ1ZTsgLy8gYWx3YXlzCisgICAgICogZm9jdXMgdHJhdmVyc2FibGUgfSBwdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmcoKSB7IHJldHVybiB0cnVlOy8vIGFsd2F5cworICAgICAqIHNob3dpbmcgfSBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7IHJldHVybiB0cnVlOyAvLyBhbHdheXMgdmlzaWJsZSB9CisgICAgICogcHVibGljIHZvaWQgcmVtb3ZlRm9jdXNMaXN0ZW5lcihGb2N1c0xpc3RlbmVyIGxpc3RlbmVyKSB7IH0gcHVibGljIHZvaWQKKyAgICAgKiByZXF1ZXN0Rm9jdXMoKSB7IH0gcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChDb2xvciBjb2xvcikgeyB9IHB1YmxpYyB2b2lkCisgICAgICogc2V0Qm91bmRzKFJlY3RhbmdsZSByZWN0KSB7IH0gcHVibGljIHZvaWQgc2V0Q3Vyc29yKEN1cnNvciBjdXJzb3IpIHsgfQorICAgICAqIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7IH0gcHVibGljIHZvaWQgc2V0Rm9udChGb250CisgICAgICogZm9udCkgeyBNZW51Q29tcG9uZW50LnRoaXMuc2V0Rm9udChmb250KTsgfSBwdWJsaWMgdm9pZAorICAgICAqIHNldEZvcmVncm91bmQoQ29sb3IgY29sb3IpIHsgfSBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihQb2ludCBwdCkgeyB9CisgICAgICogcHVibGljIHZvaWQgc2V0U2l6ZShEaW1lbnNpb24gcHQpIHsgfSBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4KKyAgICAgKiB2aXNpYmxlKSB7IH0gcHVibGljIHZvaWQgYWRkQWNjZXNzaWJsZVNlbGVjdGlvbihpbnQgaW5kZXgpIHsgfSBwdWJsaWMKKyAgICAgKiB2b2lkIGNsZWFyQWNjZXNzaWJsZVNlbGVjdGlvbigpIHsgfSBwdWJsaWMgQWNjZXNzaWJsZQorICAgICAqIGdldEFjY2Vzc2libGVTZWxlY3Rpb24oaW50IGluZGV4KSB7IHJldHVybiBudWxsOyB9IHB1YmxpYyBpbnQKKyAgICAgKiBnZXRBY2Nlc3NpYmxlU2VsZWN0aW9uQ291bnQoKSB7IHJldHVybiAwOyB9IHB1YmxpYyBib29sZWFuCisgICAgICogaXNBY2Nlc3NpYmxlQ2hpbGRTZWxlY3RlZChpbnQgaW5kZXgpIHsgcmV0dXJuIGZhbHNlOyB9IHB1YmxpYyB2b2lkCisgICAgICogcmVtb3ZlQWNjZXNzaWJsZVNlbGVjdGlvbihpbnQgaW5kZXgpIHsgfSBwdWJsaWMgdm9pZAorICAgICAqIHNlbGVjdEFsbEFjY2Vzc2libGVTZWxlY3Rpb24oKSB7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHVibGljIEFjY2Vzc2libGUgZ2V0QWNjZXNzaWJsZUNoaWxkKGludCBpbmRleCkgeyByZXR1cm4gbnVsbDsKKyAgICAgKiB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBpbnQgZ2V0QWNjZXNzaWJsZUNoaWxkcmVuQ291bnQoKSB7IHJldHVybiAwOyB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBBY2Nlc3NpYmxlQ29tcG9uZW50IGdldEFjY2Vzc2libGVDb21wb25lbnQoKSB7IHJldHVybgorICAgICAqIHRoaXM7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyBnZXRBY2Nlc3NpYmxlRGVzY3JpcHRpb24oKSB7IHJldHVybgorICAgICAqIHN1cGVyLmdldEFjY2Vzc2libGVEZXNjcmlwdGlvbigpOyB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBpbnQgZ2V0QWNjZXNzaWJsZUluZGV4SW5QYXJlbnQoKSB7IHRvb2xraXQubG9ja0FXVCgpOworICAgICAqIHRyeSB7IEFjY2Vzc2libGUgYVBhcmVudCA9IGdldEFjY2Vzc2libGVQYXJlbnQoKTsgaW50IGFJbmRleCA9IC0xOyBpZgorICAgICAqIChhUGFyZW50IGluc3RhbmNlb2YgTWVudUNvbXBvbmVudCkgeyBNZW51Q29tcG9uZW50IHBhcmVudCA9CisgICAgICogKE1lbnVDb21wb25lbnQpIGFQYXJlbnQ7IGludCBjb3VudCA9IHBhcmVudC5nZXRJdGVtQ291bnQoKTsgZm9yIChpbnQgaSA9CisgICAgICogMDsgaSA8IGNvdW50OyBpKyspIHsgTWVudUNvbXBvbmVudCBjb21wID0gcGFyZW50LmdldEl0ZW0oaSk7IGlmIChjb21wCisgICAgICogaW5zdGFuY2VvZiBBY2Nlc3NpYmxlKSB7IGFJbmRleCsrOyBpZiAoY29tcCA9PSBNZW51Q29tcG9uZW50LnRoaXMpIHsKKyAgICAgKiByZXR1cm4gYUluZGV4OyB9IH0gfSB9IHJldHVybiAtMTsgfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzaWJsZU5hbWUoKSB7IHJldHVybgorICAgICAqIHN1cGVyLmdldEFjY2Vzc2libGVOYW1lKCk7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHVibGljIEFjY2Vzc2libGUgZ2V0QWNjZXNzaWJsZVBhcmVudCgpIHsgdG9vbGtpdC5sb2NrQVdUKCk7CisgICAgICogdHJ5IHsgQWNjZXNzaWJsZSBhUGFyZW50ID0gc3VwZXIuZ2V0QWNjZXNzaWJsZVBhcmVudCgpOyBpZiAoYVBhcmVudCAhPQorICAgICAqIG51bGwpIHsgcmV0dXJuIGFQYXJlbnQ7IH0gTWVudUNvbnRhaW5lciBwYXJlbnQgPSBnZXRQYXJlbnQoKTsgaWYgKHBhcmVudAorICAgICAqIGluc3RhbmNlb2YgQWNjZXNzaWJsZSkgeyBhUGFyZW50ID0gKEFjY2Vzc2libGUpIHBhcmVudDsgfSByZXR1cm4gYVBhcmVudDsKKyAgICAgKiB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHVibGljIEFjY2Vzc2libGVSb2xlIGdldEFjY2Vzc2libGVSb2xlKCkgeyByZXR1cm4KKyAgICAgKiBBY2Nlc3NpYmxlUm9sZS5BV1RfQ09NUE9ORU5UOyB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBBY2Nlc3NpYmxlU2VsZWN0aW9uIGdldEFjY2Vzc2libGVTZWxlY3Rpb24oKSB7IHJldHVybgorICAgICAqIHRoaXM7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHVibGljIEFjY2Vzc2libGVTdGF0ZVNldCBnZXRBY2Nlc3NpYmxlU3RhdGVTZXQoKSB7IHJldHVybiBuZXcKKyAgICAgKiBBY2Nlc3NpYmxlU3RhdGVTZXQoKTsgfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsgcmV0dXJuIExvY2FsZS5nZXREZWZhdWx0KCk7IH0gfQorICAgICAqLwogCiAgICAgLyoqCi0gICAgICogVGhlIGFjY2Vzc29yIHRvIE1lbnVDb21wb25lbnQgaW50ZXJuYWwgc3RhdGUsCi0gICAgICogdXRpbGl6ZWQgYnkgdGhlIHZpc3VhbCB0aGVtZS4KKyAgICAgKiBUaGUgYWNjZXNzb3IgdG8gTWVudUNvbXBvbmVudCBpbnRlcm5hbCBzdGF0ZSwgdXRpbGl6ZWQgYnkgdGhlIHZpc3VhbAorICAgICAqIHRoZW1lLgogICAgICAqIAotICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gdGhlIGhlYWRsZXNzIGV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB0aGUgaGVhZGxlc3MgZXhjZXB0aW9uLgogICAgICAqLwotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBjbGFzcyBTdGF0ZSBpbXBsZW1lbnRzIE1lbnVTdGF0ZSB7Ci0gICAgICAgIERpbWVuc2lvbiBzaXplOworICAgICAqIGNsYXNzIFN0YXRlIGltcGxlbWVudHMgTWVudVN0YXRlIHsgRGltZW5zaW9uIHNpemU7IERpbWVuc2lvbiBnZXRTaXplKCkgeworICAgICAqIGlmIChzaXplID09IG51bGwpIHsgY2FsY3VsYXRlKCk7IH0gcmV0dXJuIHNpemU7IH0gcHVibGljIGludCBnZXRXaWR0aCgpIHsKKyAgICAgKiByZXR1cm4gZ2V0U2l6ZSgpLndpZHRoOyB9IHB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgeyByZXR1cm4KKyAgICAgKiBnZXRTaXplKCkuaGVpZ2h0OyB9IHB1YmxpYyBGb250IGdldEZvbnQoKSB7IHJldHVybgorICAgICAqIE1lbnVDb21wb25lbnQudGhpcy5nZXRGb250KCk7IH0gcHVibGljIGludCBnZXRJdGVtQ291bnQoKSB7IHJldHVybgorICAgICAqIE1lbnVDb21wb25lbnQudGhpcy5nZXRJdGVtQ291bnQoKTsgfSBwdWJsaWMgaW50IGdldFNlbGVjdGVkSXRlbUluZGV4KCkgeworICAgICAqIHJldHVybiBNZW51Q29tcG9uZW50LnRoaXMuZ2V0U2VsZWN0ZWRJdGVtSW5kZXgoKTsgfSBwdWJsaWMgYm9vbGVhbgorICAgICAqIGlzRm9udFNldCgpIHsgcmV0dXJuIE1lbnVDb21wb25lbnQudGhpcy5pc0ZvbnRTZXQoKTsgfQorICAgICAqIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpIHB1YmxpYyBGb250TWV0cmljcyBnZXRGb250TWV0cmljcyhGb250CisgICAgICogZikgeyByZXR1cm4gTWVudUNvbXBvbmVudC50aGlzLnRvb2xraXQuZ2V0Rm9udE1ldHJpY3MoZik7IH0gcHVibGljIFBvaW50CisgICAgICogZ2V0TG9jYXRpb24oKSB7IHJldHVybiBNZW51Q29tcG9uZW50LnRoaXMuZ2V0TG9jYXRpb24oKTsgfSBwdWJsaWMKKyAgICAgKiBNZW51SXRlbVN0YXRlIGdldEl0ZW0oaW50IGluZGV4KSB7IE1lbnVJdGVtIGl0ZW0gPQorICAgICAqIE1lbnVDb21wb25lbnQudGhpcy5nZXRJdGVtKGluZGV4KTsgcmV0dXJuIGl0ZW0uaXRlbVN0YXRlOyB9IHB1YmxpYyB2b2lkCisgICAgICogc2V0U2l6ZShpbnQgdywgaW50IGgpIHsgdGhpcy5zaXplID0gbmV3IERpbWVuc2lvbih3LCBoKTsgfSB2b2lkCisgICAgICogY2FsY3VsYXRlKCkgeyBzaXplID0gbmV3IERpbWVuc2lvbigpOworICAgICAqIHNpemUuc2V0U2l6ZSh0b29sa2l0LnRoZW1lLmNhbGN1bGF0ZU1lbnVTaXplKHRoaXMpKTsgfSB2b2lkIHJlc2V0KCkgeyBmb3IKKyAgICAgKiAoaW50IGkgPSAwOyBpIDwgZ2V0SXRlbUNvdW50KCk7IGkrKykgeyAoKE1lbnVJdGVtLlN0YXRlKQorICAgICAqIGdldEl0ZW0oaSkpLnJlc2V0KCk7IH0gfSB9CisgICAgICovCiAKLSAgICAgICAgRGltZW5zaW9uIGdldFNpemUoKSB7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U2l6ZSgpLndpZHRoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRIZWlnaHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U2l6ZSgpLmhlaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBGb250IGdldEZvbnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVudUNvbXBvbmVudC50aGlzLmdldEZvbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SXRlbUNvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIE1lbnVDb21wb25lbnQudGhpcy5nZXRJdGVtQ291bnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJdGVtSW5kZXgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVudUNvbXBvbmVudC50aGlzLmdldFNlbGVjdGVkSXRlbUluZGV4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvbnRTZXQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVudUNvbXBvbmVudC50aGlzLmlzRm9udFNldCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICAgICAgcHVibGljIEZvbnRNZXRyaWNzIGdldEZvbnRNZXRyaWNzKEZvbnQgZikgewotICAgICAgICAgICAgcmV0dXJuIE1lbnVDb21wb25lbnQudGhpcy50b29sa2l0LmdldEZvbnRNZXRyaWNzKGYpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFBvaW50IGdldExvY2F0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIE1lbnVDb21wb25lbnQudGhpcy5nZXRMb2NhdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1lbnVJdGVtU3RhdGUgZ2V0SXRlbShpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBNZW51Q29tcG9uZW50LnRoaXMuZ2V0SXRlbShpbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gaXRlbS5pdGVtU3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3LCBpbnQgaCkgewotICAgICAgICAgICAgdGhpcy5zaXplID0gbmV3IERpbWVuc2lvbih3LCBoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY2FsY3VsYXRlKCkgewotICAgICAgICAgICAgc2l6ZSA9IG5ldyBEaW1lbnNpb24oKTsKLSAgICAgICAgICAgIHNpemUuc2V0U2l6ZSh0b29sa2l0LnRoZW1lLmNhbGN1bGF0ZU1lbnVTaXplKHRoaXMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdldEl0ZW1Db3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAoKE1lbnVJdGVtLlN0YXRlKSBnZXRJdGVtKGkpKS5yZXNldCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgKi8KLSAgICAKICAgICAvKioKLSAgICAgKiBQb3AtdXAgYm94IGZvciBtZW51LiBJdCB0cmFuc2ZlcnMgdGhlIHBhaW50IGV2ZW50cywgCi0gICAgICoga2V5Ym9hcmQgYW5kIG1vdXNlIGV2ZW50cyB0byB0aGUgbWVudSBjb21wb25lbnQgaXRzZWxmCisgICAgICogUG9wLXVwIGJveCBmb3IgbWVudS4gSXQgdHJhbnNmZXJzIHRoZSBwYWludCBldmVudHMsIGtleWJvYXJkIGFuZCBtb3VzZQorICAgICAqIGV2ZW50cyB0byB0aGUgbWVudSBjb21wb25lbnQgaXRzZWxmLgogICAgICAqLwotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBjbGFzcyBNZW51UG9wdXBCb3ggZXh0ZW5kcyBQb3B1cEJveCB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUG9pbnQgbGFzdE1vdXNlUG9zID0gbmV3IFBvaW50KCk7CisgICAgICogY2xhc3MgTWVudVBvcHVwQm94IGV4dGVuZHMgUG9wdXBCb3ggeyBwcml2YXRlIGZpbmFsIFBvaW50IGxhc3RNb3VzZVBvcyA9CisgICAgICogbmV3IFBvaW50KCk7CisgICAgICogQE92ZXJyaWRlIGJvb2xlYW4gaXNNZW51KCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAqIEBPdmVycmlkZSB2b2lkIHBhaW50KEdyYXBoaWNzIGdyKSB7IE1lbnVDb21wb25lbnQudGhpcy5wYWludChncik7IH0KKyAgICAgKiBAT3ZlcnJpZGUgdm9pZCBvbktleUV2ZW50KGludCBldmVudElkLCBpbnQgdktleSwgbG9uZyB3aGVuLCBpbnQKKyAgICAgKiBtb2RpZmllcnMpIHsgTWVudUNvbXBvbmVudC50aGlzLm9uS2V5RXZlbnQoZXZlbnRJZCwgdktleSwgd2hlbiwKKyAgICAgKiBtb2RpZmllcnMpOyB9CisgICAgICogQE92ZXJyaWRlIHZvaWQgb25Nb3VzZUV2ZW50KGludCBldmVudElkLCBQb2ludCB3aGVyZSwgaW50IG1vdXNlQnV0dG9uLAorICAgICAqIGxvbmcgd2hlbiwgaW50IG1vZGlmaWVycywgaW50IHdoZWVsUm90YXRpb24pIHsgLy8gcHJldmVudCBjb25mbGljdCBvZgorICAgICAqIG1vdXNlIGFuZCBrZXlib2FyZCAvLyB3aGVuIHN1Yi1tZW51IGRyb3BzIGRvd24gZHVlIHRvIGtleWJvYXJkIG5hdmlnYXRpb24KKyAgICAgKiBpZiAobGFzdE1vdXNlUG9zLmVxdWFscyh3aGVyZSkgJiYgKGV2ZW50SWQgPT0gTW91c2VFdmVudC5NT1VTRV9NT1ZFRCB8fAorICAgICAqIGV2ZW50SWQgPT0gTW91c2VFdmVudC5NT1VTRV9FTlRFUkVEKSkgeyByZXR1cm47IH0KKyAgICAgKiBsYXN0TW91c2VQb3Muc2V0TG9jYXRpb24od2hlcmUpOyBNZW51Q29tcG9uZW50LnRoaXMub25Nb3VzZUV2ZW50KGV2ZW50SWQsCisgICAgICogd2hlcmUsIG1vdXNlQnV0dG9uLCB3aGVuLCBtb2RpZmllcnMpOyB9IH0KKyAgICAgKi8KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgYm9vbGVhbiBpc01lbnUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICB2b2lkIHBhaW50KEdyYXBoaWNzIGdyKSB7Ci0gICAgICAgICAgICBNZW51Q29tcG9uZW50LnRoaXMucGFpbnQoZ3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHZvaWQgb25LZXlFdmVudChpbnQgZXZlbnRJZCwgaW50IHZLZXksIGxvbmcgd2hlbiwgaW50IG1vZGlmaWVycykgewotICAgICAgICAgICAgTWVudUNvbXBvbmVudC50aGlzLm9uS2V5RXZlbnQoZXZlbnRJZCwgdktleSwgd2hlbiwgbW9kaWZpZXJzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICB2b2lkIG9uTW91c2VFdmVudChpbnQgZXZlbnRJZCwgUG9pbnQgd2hlcmUsIGludCBtb3VzZUJ1dHRvbiwgbG9uZyB3aGVuLCBpbnQgbW9kaWZpZXJzLAotICAgICAgICAgICAgICAgIGludCB3aGVlbFJvdGF0aW9uKSB7Ci0gICAgICAgICAgICAvLyBwcmV2ZW50IGNvbmZsaWN0IG9mIG1vdXNlIGFuZCBrZXlib2FyZAotICAgICAgICAgICAgLy8gd2hlbiBzdWItbWVudSBkcm9wcyBkb3duIGR1ZSB0byBrZXlib2FyZCBuYXZpZ2F0aW9uCi0gICAgICAgICAgICBpZiAobGFzdE1vdXNlUG9zLmVxdWFscyh3aGVyZSkKLSAgICAgICAgICAgICAgICAgICAgJiYgKGV2ZW50SWQgPT0gTW91c2VFdmVudC5NT1VTRV9NT1ZFRCB8fCBldmVudElkID09IE1vdXNlRXZlbnQuTU9VU0VfRU5URVJFRCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsYXN0TW91c2VQb3Muc2V0TG9jYXRpb24od2hlcmUpOwotICAgICAgICAgICAgTWVudUNvbXBvbmVudC50aGlzLm9uTW91c2VFdmVudChldmVudElkLCB3aGVyZSwgbW91c2VCdXR0b24sIHdoZW4sIG1vZGlmaWVycyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KLSAgICAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgTWVudUNvbXBvbmVudCBvYmplY3QuCiAgICAgICogCi0gICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiBpZiB0aGUgZ3JhcGhpY2FsIGludGVyZmFjZQotICAgICAqIGVudmlyb25tZW50IGNhbid0IHN1cHBvcnQgTWVudUNvbXBvbmVudHMKKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGdyYXBoaWNhbCBpbnRlcmZhY2UgZW52aXJvbm1lbnQgY2FuJ3Qgc3VwcG9ydAorICAgICAqICAgICAgICAgICAgIE1lbnVDb21wb25lbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBNZW51Q29tcG9uZW50KCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC00MzgsOSArMjM4LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBQYXJlbnQgbWVudSBDb250YWluZXIgLgorICAgICAqIEdldHMgdGhlIHBhcmVudCBtZW51IGNvbnRhaW5lci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQKKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQuCiAgICAgICovCiAgICAgcHVibGljIE1lbnVDb250YWluZXIgZ2V0UGFyZW50KCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTQ1NCw3ICsyNTQsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIE1lbnVDb21wb25lbnQgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5ldyBuYW1lIG9mIHRoZSBNZW51Q29tcG9uZW50IG9iamVjdC4gCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgbmFtZSBvZiB0aGUgTWVudUNvbXBvbmVudCBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTQ2OCw3ICsyNjksOCBAQAogICAgIC8qKgogICAgICAqIERpc3BhdGNoZXMgQVdUIGV2ZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudCB0aGUgQVdURXZlbnQuCisgICAgICogQHBhcmFtIGV2ZW50CisgICAgICogICAgICAgICAgICB0aGUgQVdURXZlbnQuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgZGlzcGF0Y2hFdmVudChBV1RFdmVudCBldmVudCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTQ4NSw3ICsyODcsOCBAQAogICAgIC8qKgogICAgICAqIFBvc3QgZGVwcmVjYXRlZCBldmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50CisgICAgICogQHBhcmFtIGV2ZW50CisgICAgICogICAgICAgICAgICB0aGUgZXZlbnQuCiAgICAgICovCiAgICAgdm9pZCBwb3N0RGVwcmVjYXRlZEV2ZW50KEFXVEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIEV2ZW50IGV2dCA9IGV2ZW50LmdldEV2ZW50KCk7CkBAIC00OTUsMTEgKzI5OCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHBlZXIgb2YgdGhlIE1lbnVDb21wb25lbnQ7IGFuIGFwcGxpY2F0aW9uIG11c3Qgbm90Ci0gICAgICogdXNlIHRoaXMgbWV0aG9kIGRpcmVjdGx5LgorICAgICAqIEdldHMgdGhlIHBlZXIgb2YgdGhlIE1lbnVDb21wb25lbnQ7IGFuIGFwcGxpY2F0aW9uIG11c3Qgbm90IHVzZSB0aGlzCisgICAgICogbWV0aG9kIGRpcmVjdGx5LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIE1lbnVDb21wb25lbnRQZWVyIG9iamVjdC4KLSAgICAgKgorICAgICAqIEB0aHJvd3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcy4KICAgICAgKiBAZGVwcmVjYXRlZCBhbiBhcHBsaWNhdGlvbiBtdXN0IG5vdCB1c2UgdGhpcyBtZXRob2QgZGlyZWN0bHkuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTUyNywxMSArMzMxLDkgQEAKICAgICAvKioKICAgICAgKiBQb3N0cyB0aGUgRXZlbnQgdG8gdGhlIE1lbnVDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIEV2ZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGV2ZW50IGlzIHBvc3RlZCBzdWNjZXNzZnVsbHk7IAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIEV2ZW50LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGV2ZW50IGlzIHBvc3RlZCBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBkaXNwYXRjaEV2ZW50IG1ldGhvZC4KICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQpAQCAtNTUxLDggKzM1Myw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBNZW51Q29tcG9uZW50IHN0YXRlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBNZW51Q29tcG9uZW50Ci0gICAgICogc3RhdGUuCisgICAgICogQHJldHVybiByZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIE1lbnVDb21wb25lbnQgc3RhdGUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBwYXJhbVN0cmluZygpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC01NjMsMjAgKzM2NCwxMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHB1YmxpYyBBY2Nlc3NpYmxlQ29udGV4dCBnZXRBY2Nlc3NpYmxlQ29udGV4dCgpIHsKLSAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoYWNjZXNzaWJsZUNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFjY2Vzc2libGVDb250ZXh0ID0gY3JlYXRlQWNjZXNzaWJsZUNvbnRleHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBhY2Nlc3NpYmxlQ29udGV4dDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KKyAgICAgKiBwdWJsaWMgQWNjZXNzaWJsZUNvbnRleHQgZ2V0QWNjZXNzaWJsZUNvbnRleHQoKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkKKyAgICAgKiB7IGlmIChhY2Nlc3NpYmxlQ29udGV4dCA9PSBudWxsKSB7IGFjY2Vzc2libGVDb250ZXh0ID0KKyAgICAgKiBjcmVhdGVBY2Nlc3NpYmxlQ29udGV4dCgpOyB9IHJldHVybiBhY2Nlc3NpYmxlQ29udGV4dDsgfSBmaW5hbGx5IHsKKyAgICAgKiB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKi8KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGZvbnQgb2YgdGhlIE1lbnVDb21wb25lbnQgb2JqZWN0LgpAQCAtNjA1LDEzICszOTksMTMgQEAKICAgICAgKi8KICAgICBib29sZWFuIGlzRm9udFNldCgpIHsKICAgICAgICAgcmV0dXJuIGZvbnQgIT0gbnVsbAotICAgICAgICAgICAgICAgIHx8ICgocGFyZW50IGluc3RhbmNlb2YgTWVudUNvbXBvbmVudCkgJiYgKChNZW51Q29tcG9uZW50KSBwYXJlbnQpLmlzRm9udFNldCgpKTsKKyAgICAgICAgICAgICAgICB8fCAoKHBhcmVudCBpbnN0YW5jZW9mIE1lbnVDb21wb25lbnQpICYmICgoTWVudUNvbXBvbmVudClwYXJlbnQpLmlzRm9udFNldCgpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDaGVja3MgZm9yIGRlZmF1bHQgZm9udC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwuCiAgICAgICovCiAgICAgYm9vbGVhbiBoYXNEZWZhdWx0Rm9udCgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNjIwLDcgKzQxNCw4IEBACiAgICAgLyoqCiAgICAgICogUHJvY2Vzc2VzIGFuIEFXVEVldmVudCBvbiB0aGlzIG1lbnUgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudCB0aGUgQVdURXZlbnQuCisgICAgICogQHBhcmFtIGV2ZW50CisgICAgICogICAgICAgICAgICB0aGUgQVdURXZlbnQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0V2ZW50KEFXVEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtNjQ1LDcgKzQ0MCw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgRm9udCBmb3IgdGhpcyBNZW51Q29tcG9uZW50IG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9udCB0aGUgbmV3IEZvbnQgdG8gYmUgdXNlZCBmb3IgdGhpcyBNZW51Q29tcG9uZW50LgorICAgICAqIEBwYXJhbSBmb250CisgICAgICogICAgICAgICAgICB0aGUgbmV3IEZvbnQgdG8gYmUgdXNlZCBmb3IgdGhpcyBNZW51Q29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZvbnQoRm9udCBmb250KSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtNjU5LDcgKzQ1NSw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcGFyZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIG5ldyBwYXJlbnQKKyAgICAgKiBAcGFyYW0gcGFyZW50CisgICAgICogICAgICAgICAgICB0aGUgbmV3IHBhcmVudC4KICAgICAgKi8KICAgICB2b2lkIHNldFBhcmVudChNZW51Q29udGFpbmVyIHBhcmVudCkgewogICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKQEAgLTY2OCw3ICs0NjUsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGxvY2F0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxvY2F0aW9uCisgICAgICogQHJldHVybiB0aGUgbG9jYXRpb24uCiAgICAgICovCiAgICAgUG9pbnQgZ2V0TG9jYXRpb24oKSB7CiAgICAgICAgIC8vIHRvIGJlIG92ZXJyaWRkZW4KQEAgLTY3OCw3ICs0NzUsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHdpZHRoLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHdpZHRoCisgICAgICogQHJldHVybiB0aGUgd2lkdGguCiAgICAgICovCiAgICAgaW50IGdldFdpZHRoKCkgewogICAgICAgICAvLyB0byBiZSBvdmVycmlkZGVuCkBAIC02ODgsNyArNDg1LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBoZWlnaHQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaGVpZ2h0CisgICAgICogQHJldHVybiB0aGUgaGVpZ2h0LgogICAgICAqLwogICAgIGludCBnZXRIZWlnaHQoKSB7CiAgICAgICAgIC8vIHRvIGJlIG92ZXJyaWRkZW4KQEAgLTY5OCwzMSArNDk1LDE5IEBACiAgICAgLyoqCiAgICAgICogUmVjdXJzaXZlbHkgZmluZCB0aGUgbWVudSBpdGVtIGZvciBhIG1lbnUgc2hvcnRjdXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGdyIHRoZSBncgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1lbnUgaXRlbTsKLSAgICAgKiBvciBudWxsIGlmIHRoZSBpdGVtIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgc2hvcnRjdXQKKyAgICAgKiBAcGFyYW0gZ3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBnci4KKyAgICAgKiBAcmV0dXJuIHRoZSBtZW51IGl0ZW07IG9yIG51bGwgaWYgdGhlIGl0ZW0gaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcworICAgICAqICAgICAgICAgc2hvcnRjdXQuCiAgICAgICovCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIE1lbnVJdGVtIGdldFNob3J0Y3V0TWVudUl0ZW1JbXBsKE1lbnVTaG9ydGN1dCBtcykgewotICAgICAgICBpZiAobXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRJdGVtQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBNZW51SXRlbSBtaSA9IGdldEl0ZW0oaSk7Ci0gICAgICAgICAgICBpZiAobWkgaW5zdGFuY2VvZiBNZW51KSB7Ci0gICAgICAgICAgICAgICAgbWkgPSAoKE1lbnUpIG1pKS5nZXRTaG9ydGN1dE1lbnVJdGVtSW1wbChtcyk7Ci0gICAgICAgICAgICAgICAgaWYgKG1pICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobXMuZXF1YWxzKG1pLmdldFNob3J0Y3V0KCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAqLworICAgICAqIE1lbnVJdGVtIGdldFNob3J0Y3V0TWVudUl0ZW1JbXBsKE1lbnVTaG9ydGN1dCBtcykgeyBpZiAobXMgPT0gbnVsbCkgeworICAgICAqIHJldHVybiBudWxsOyB9IGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0SXRlbUNvdW50KCk7IGkrKykgeyBNZW51SXRlbSBtaSA9CisgICAgICogZ2V0SXRlbShpKTsgaWYgKG1pIGluc3RhbmNlb2YgTWVudSkgeyBtaSA9ICgoTWVudSkKKyAgICAgKiBtaSkuZ2V0U2hvcnRjdXRNZW51SXRlbUltcGwobXMpOyBpZiAobWkgIT0gbnVsbCkgeyByZXR1cm4gbWk7IH0gfSBlbHNlIGlmCisgICAgICogKG1zLmVxdWFscyhtaS5nZXRTaG9ydGN1dCgpKSkgeyByZXR1cm4gbWk7IH0gfSByZXR1cm4gbnVsbDsgfQorICAgICAqLwogCiAgICAgdm9pZCBwYWludChHcmFwaGljcyBncikgewogICAgICAgICBnci5zZXRDb2xvcihDb2xvci5MSUdIVF9HUkFZKTsKQEAgLTczMywxMSArNTE4LDE2IEBACiAgICAgLyoqCiAgICAgICogTW91c2UgZXZlbnRzIGhhbmRsZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50SWQgLSBvbmUgb2YgdGhlIE1vdXNlRXZlbnQuTU9VU0VfKiBjb25zdGFudHMKLSAgICAgKiBAcGFyYW0gd2hlcmUgLSBtb3VzZSBsb2NhdGlvbgotICAgICAqIEBwYXJhbSBtb3VzZUJ1dHRvbiAtIG1vdXNlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIG9yIHJlbGVhc2VkCi0gICAgICogQHBhcmFtIHdoZW4gLSBldmVudCB0aW1lCi0gICAgICogQHBhcmFtIG1vZGlmaWVycyAtIGlucHV0IGV2ZW50IG1vZGlmaWVycworICAgICAqIEBwYXJhbSBldmVudElkCisgICAgICogICAgICAgICAgICBvbmUgb2YgdGhlIE1vdXNlRXZlbnQuTU9VU0VfKiBjb25zdGFudHMuCisgICAgICogQHBhcmFtIHdoZXJlCisgICAgICogICAgICAgICAgICBtb3VzZSBsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gbW91c2VCdXR0b24KKyAgICAgKiAgICAgICAgICAgIG1vdXNlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIG9yIHJlbGVhc2VkLgorICAgICAqIEBwYXJhbSB3aGVuCisgICAgICogICAgICAgICAgICBldmVudCB0aW1lLgorICAgICAqIEBwYXJhbSBtb2RpZmllcnMKKyAgICAgKiAgICAgICAgICAgIGlucHV0IGV2ZW50IG1vZGlmaWVycy4KICAgICAgKi8KICAgICB2b2lkIG9uTW91c2VFdmVudChpbnQgZXZlbnRJZCwgUG9pbnQgd2hlcmUsIGludCBtb3VzZUJ1dHRvbiwgbG9uZyB3aGVuLCBpbnQgbW9kaWZpZXJzKSB7CiAgICAgICAgIC8vIHRvIGJlIG92ZXJyaWRkZW4KQEAgLTc0NiwxNTkgKzUzNiwxMDkgQEAKICAgICAvKioKICAgICAgKiBLZXlib2FyZCBldmVudCBoYW5kbGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudElkIC0gb25lIG9mIHRoZSBLZXlFdmVudC5LRVlfKiBjb25zdGFudHMKLSAgICAgKiBAcGFyYW0gdktleSAtIHRoZSBrZXkgY29kZQotICAgICAqIEBwYXJhbSB3aGVuIC0gZXZlbnQgdGltZQotICAgICAqIEBwYXJhbSBtb2RpZmllcnMgLSBpbnB1dCBldmVudCBtb2RpZmllcnMKKyAgICAgKiBAcGFyYW0gZXZlbnRJZAorICAgICAqICAgICAgICAgICAgb25lIG9mIHRoZSBLZXlFdmVudC5LRVlfKiBjb25zdGFudHMuCisgICAgICogQHBhcmFtIHZLZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgY29kZS4KKyAgICAgKiBAcGFyYW0gd2hlbgorICAgICAqICAgICAgICAgICAgZXZlbnQgdGltZS4KKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCisgICAgICogICAgICAgICAgICBpbnB1dCBldmVudCBtb2RpZmllcnMuCiAgICAgICovCiAgICAgdm9pZCBvbktleUV2ZW50KGludCBldmVudElkLCBpbnQgdktleSwgbG9uZyB3aGVuLCBpbnQgbW9kaWZpZXJzKSB7CiAgICAgICAgIC8vIHRvIGJlIG92ZXJyaWRkZW4KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQb3N0IHRoZSBBY3Rpb25FdmVudCBvciBJdGVtRXZlbnQsCi0gICAgICogZGVwZW5kaW5nIG9uIHR5cGUgb2YgdGhlIG1lbnUgaXRlbS4KKyAgICAgKiBQb3N0IHRoZSBBY3Rpb25FdmVudCBvciBJdGVtRXZlbnQsIGRlcGVuZGluZyBvbiB0eXBlIG9mIHRoZSBtZW51IGl0ZW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleAorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LgorICAgICAqIEByZXR1cm4gdGhlIGl0ZW0gcmVjdC4KKyAgICAgKi8KKyAgICAvLyA/Pz9BV1QKKyAgICAvKgorICAgICAqIHZvaWQgZmlyZUl0ZW1BY3Rpb24oaW50IGl0ZW0sIGxvbmcgd2hlbiwgaW50IG1vZGlmaWVycykgeyBNZW51SXRlbSBtaSA9CisgICAgICogZ2V0SXRlbShpdGVtKTsgbWkuaXRlbVNlbGVjdGVkKHdoZW4sIG1vZGlmaWVycyk7IH0gTWVudUl0ZW0gZ2V0SXRlbShpbnQKKyAgICAgKiBpbmRleCkgeyAvLyB0byBiZSBvdmVycmlkZGVuIHJldHVybiBudWxsOyB9IGludCBnZXRJdGVtQ291bnQoKSB7IHJldHVybgorICAgICAqIDA7IH0KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHN1Yi1tZW51IG9mIGN1cnJlbnRseSBzZWxlY2V0ZCBpdGVtLCBvciBudWxsIGlmIHN1Y2ggYQorICAgICAqICAgICAgICAgc3ViLW1lbnUgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICAvLyA/Pz9BV1QKKyAgICAvKgorICAgICAqIE1lbnUgZ2V0U2VsZWN0ZWRTdWJtZW51KCkgeyBpZiAoc2VsZWN0ZWRJdGVtSW5kZXggPCAwKSB7IHJldHVybiBudWxsOyB9CisgICAgICogTWVudUl0ZW0gaXRlbSA9IGdldEl0ZW0oc2VsZWN0ZWRJdGVtSW5kZXgpOyByZXR1cm4gKGl0ZW0gaW5zdGFuY2VvZiBNZW51KQorICAgICAqID8gKE1lbnUpIGl0ZW0gOiBudWxsOyB9CisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHNlbGVjdEl0ZW0oaW5kZXgsIHRydWUpLgorICAgICAqLworICAgIC8vID8/P0FXVAorICAgIC8qCisgICAgICogdm9pZCBzZWxlY3RJdGVtKGludCBpbmRleCkgeyBzZWxlY3RJdGVtKGluZGV4LCB0cnVlKTsgfQorICAgICAqLworCisgICAgLyoqCisgICAgICogQ2hhbmdlIHRoZSBzZWxlY3Rpb24gaW4gdGhlIG1lbnUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaXRlbSByZWN0CisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICBuZXcgc2VsZWNldGQgaXRlbSdzIGluZGV4LgorICAgICAqIEBwYXJhbSBzaG93U3ViTWVudQorICAgICAqICAgICAgICAgICAgaWYgbmV3IHNlbGVjdGVkIGl0ZW0gaGFzIGEgc3ViLW1lbnUsIHNob3VsZCB0aGF0IHN1Yi1tZW51IGJlCisgICAgICogICAgICAgICAgICBkaXNwbGF5ZWQuCiAgICAgICovCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHZvaWQgZmlyZUl0ZW1BY3Rpb24oaW50IGl0ZW0sIGxvbmcgd2hlbiwgaW50IG1vZGlmaWVycykgewotICAgICAgICBNZW51SXRlbSBtaSA9IGdldEl0ZW0oaXRlbSk7Ci0gICAgICAgIG1pLml0ZW1TZWxlY3RlZCh3aGVuLCBtb2RpZmllcnMpOwotICAgIH0KLQotICAgIE1lbnVJdGVtIGdldEl0ZW0oaW50IGluZGV4KSB7Ci0gICAgICAgIC8vIHRvIGJlIG92ZXJyaWRkZW4KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgaW50IGdldEl0ZW1Db3VudCgpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgICovCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBzdWItbWVudSBvZiBjdXJyZW50bHkgc2VsZWNldGQgaXRlbSwgCi0gICAgICogb3IgbnVsbCBpZiBzdWNoIGEgc3ViLW1lbnUgaXMgbm90IGF2YWlsYWJsZSAKKyAgICAgKiB2b2lkIHNlbGVjdEl0ZW0oaW50IGluZGV4LCBib29sZWFuIHNob3dTdWJNZW51KSB7IGlmIChzZWxlY3RlZEl0ZW1JbmRleAorICAgICAqID09IGluZGV4KSB7IHJldHVybjsgfSBpZiAoc2VsZWN0ZWRJdGVtSW5kZXggPj0gMCAmJgorICAgICAqIGdldEl0ZW0oc2VsZWN0ZWRJdGVtSW5kZXgpIGluc3RhbmNlb2YgTWVudSkgeyAoKE1lbnUpCisgICAgICogZ2V0SXRlbShzZWxlY3RlZEl0ZW1JbmRleCkpLmhpZGUoKTsgfSBNdWx0aVJlY3RBcmVhIGNsaXAgPQorICAgICAqIGdldFVwZGF0ZUNsaXAoaW5kZXgsIHNlbGVjdGVkSXRlbUluZGV4KTsgc2VsZWN0ZWRJdGVtSW5kZXggPSBpbmRleDsKKyAgICAgKiBHcmFwaGljcyBnciA9IGdldEdyYXBoaWNzKGNsaXApOyBpZiAoZ3IgIT0gbnVsbCkgeyBwYWludChncik7IH0gaWYKKyAgICAgKiAoc2hvd1N1Yk1lbnUpIHsgc2hvd1N1Yk1lbnUoc2VsZWN0ZWRJdGVtSW5kZXgpOyB9IH0KICAgICAgKi8KLSAgICAvLz8/P0FXVAotICAgIC8qCi0gICAgTWVudSBnZXRTZWxlY3RlZFN1Ym1lbnUoKSB7Ci0gICAgICAgIGlmIChzZWxlY3RlZEl0ZW1JbmRleCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBnZXRJdGVtKHNlbGVjdGVkSXRlbUluZGV4KTsKLSAgICAgICAgcmV0dXJuIChpdGVtIGluc3RhbmNlb2YgTWVudSkgPyAoTWVudSkgaXRlbSA6IG51bGw7Ci0gICAgfQotICAgICovCi0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHNlbGVjdEl0ZW0oaW5kZXgsIHRydWUpCi0gICAgICovCi0gICAgLy8/Pz9BV1QKLSAgICAvKgotICAgIHZvaWQgc2VsZWN0SXRlbShpbnQgaW5kZXgpIHsKLSAgICAgICAgc2VsZWN0SXRlbShpbmRleCwgdHJ1ZSk7Ci0gICAgfQotICAgICovCi0KLSAgICAvKioKLSAgICAgKiBDaGFuZ2UgdGhlIHNlbGVjdGlvbiBpbiB0aGUgbWVudSAKLSAgICAgKiBAcGFyYW0gaW5kZXggLSBuZXcgc2VsZWNldGQgaXRlbSdzIGluZGV4Ci0gICAgICogQHBhcmFtIHNob3dTdWJNZW51IC0gaWYgbmV3IHNlbGVjdGVkIGl0ZW0gaGFzIGEgc3ViLW1lbnUsCi0gICAgICogc2hvdWxkIHRoYXQgc3ViLW1lbnUgYmUgZGlzcGxheWVkIAotICAgICAqLwotICAgIC8vPz8/QVdUCi0gICAgLyoKLSAgICB2b2lkIHNlbGVjdEl0ZW0oaW50IGluZGV4LCBib29sZWFuIHNob3dTdWJNZW51KSB7Ci0gICAgICAgIGlmIChzZWxlY3RlZEl0ZW1JbmRleCA9PSBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3RlZEl0ZW1JbmRleCA+PSAwICYmIGdldEl0ZW0oc2VsZWN0ZWRJdGVtSW5kZXgpIGluc3RhbmNlb2YgTWVudSkgewotICAgICAgICAgICAgKChNZW51KSBnZXRJdGVtKHNlbGVjdGVkSXRlbUluZGV4KSkuaGlkZSgpOwotICAgICAgICB9Ci0gICAgICAgIE11bHRpUmVjdEFyZWEgY2xpcCA9IGdldFVwZGF0ZUNsaXAoaW5kZXgsIHNlbGVjdGVkSXRlbUluZGV4KTsKLSAgICAgICAgc2VsZWN0ZWRJdGVtSW5kZXggPSBpbmRleDsKLSAgICAgICAgR3JhcGhpY3MgZ3IgPSBnZXRHcmFwaGljcyhjbGlwKTsKLSAgICAgICAgaWYgKGdyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhaW50KGdyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2hvd1N1Yk1lbnUpIHsKLSAgICAgICAgICAgIHNob3dTdWJNZW51KHNlbGVjdGVkSXRlbUluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAqLwogCiAgICAgLyoqCiAgICAgICogQ2hhbmdlIHRoZSBzZWxlY3RlZCBpdGVtIHRvIHRoZSBuZXh0IG9uZSBpbiB0aGUgcmVxdWVzdGVkIGRpcmVjdGlvbgogICAgICAqIG1vdmluZyBjeWNsaWNhbGx5LCBza2lwcGluZyBzZXBhcmF0b3JzCi0gICAgICogQHBhcmFtIGZvcndhcmQgLSB0aGUgZGlyZWN0aW9uIHRvIG1vdmUgdGhlIHNlbGVjdGlvbgotICAgICAqIEBwYXJhbSBzaG93U3ViTWVudSAtIGlmIG5ldyBzZWxlY3RlZCBpdGVtIGhhcyBhIHN1Yi1tZW51LAotICAgICAqIHNob3VsZCB0aGF0IHN1Yi1tZW51IGJlIGRpc3BsYXllZCAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZm9yd2FyZAorICAgICAqICAgICAgICAgICAgdGhlIGRpcmVjdGlvbiB0byBtb3ZlIHRoZSBzZWxlY3Rpb24uCisgICAgICogQHBhcmFtIHNob3dTdWJNZW51CisgICAgICogICAgICAgICAgICBpZiBuZXcgc2VsZWN0ZWQgaXRlbSBoYXMgYSBzdWItbWVudSwgc2hvdWxkIHRoYXQgc3ViLW1lbnUgYmUKKyAgICAgKiAgICAgICAgICAgIGRpc3BsYXllZC4KICAgICAgKi8KLSAgICAvLz8/P0FXVAorICAgIC8vID8/P0FXVAogICAgIC8qCi0gICAgdm9pZCBzZWxlY3ROZXh0SXRlbShib29sZWFuIGZvcndhcmQsIGJvb2xlYW4gc2hvd1N1Yk1lbnUpIHsKLSAgICAgICAgaW50IHNlbGVjdGVkID0gZ2V0U2VsZWN0ZWRJdGVtSW5kZXgoKTsKLSAgICAgICAgaW50IGNvdW50ID0gZ2V0SXRlbUNvdW50KCk7Ci0gICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlbGVjdGVkIDwgMCkgewotICAgICAgICAgICAgc2VsZWN0ZWQgPSAoZm9yd2FyZCA/IGNvdW50IC0gMSA6IDApOwotICAgICAgICB9Ci0gICAgICAgIGludCBpID0gc2VsZWN0ZWQ7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGkgPSAoZm9yd2FyZCA/IChpICsgMSkgOiAoaSArIGNvdW50IC0gMSkpICUgY291bnQ7Ci0gICAgICAgICAgICBpICU9IGNvdW50OwotICAgICAgICAgICAgTWVudUl0ZW0gaXRlbSA9IGdldEl0ZW0oaSk7Ci0gICAgICAgICAgICBpZiAoISItIi5lcXVhbHMoaXRlbS5nZXRMYWJlbCgpKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgc2VsZWN0SXRlbShpLCBzaG93U3ViTWVudSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChpICE9IHNlbGVjdGVkKTsKLSAgICB9Ci0KLSAgICAKLSAgICB2b2lkIHNob3dTdWJNZW51KGludCBpbmRleCkgewotICAgICAgICBpZiAoKGluZGV4IDwgMCkgfHwgIWlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBNZW51SXRlbSBpdGVtID0gZ2V0SXRlbShpbmRleCk7Ci0gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgTWVudSkgewotICAgICAgICAgICAgTWVudSBtZW51ID0gKChNZW51KSBnZXRJdGVtKGluZGV4KSk7Ci0gICAgICAgICAgICBpZiAobWVudS5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUG9pbnQgbG9jYXRpb24gPSBnZXRTdWJtZW51TG9jYXRpb24oaW5kZXgpOwotICAgICAgICAgICAgbWVudS5zaG93KGxvY2F0aW9uLngsIGxvY2F0aW9uLnksIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAqLworICAgICAqIHZvaWQgc2VsZWN0TmV4dEl0ZW0oYm9vbGVhbiBmb3J3YXJkLCBib29sZWFuIHNob3dTdWJNZW51KSB7IGludCBzZWxlY3RlZAorICAgICAqID0gZ2V0U2VsZWN0ZWRJdGVtSW5kZXgoKTsgaW50IGNvdW50ID0gZ2V0SXRlbUNvdW50KCk7IGlmIChjb3VudCA9PSAwKSB7CisgICAgICogcmV0dXJuOyB9IGlmIChzZWxlY3RlZCA8IDApIHsgc2VsZWN0ZWQgPSAoZm9yd2FyZCA/IGNvdW50IC0gMSA6IDApOyB9IGludAorICAgICAqIGkgPSBzZWxlY3RlZDsgZG8geyBpID0gKGZvcndhcmQgPyAoaSArIDEpIDogKGkgKyBjb3VudCAtIDEpKSAlIGNvdW50OyBpCisgICAgICogJT0gY291bnQ7IE1lbnVJdGVtIGl0ZW0gPSBnZXRJdGVtKGkpOyBpZiAoISItIi5lcXVhbHMoaXRlbS5nZXRMYWJlbCgpKSkgeworICAgICAqIC8vJE5PTi1OTFMtMSQgc2VsZWN0SXRlbShpLCBzaG93U3ViTWVudSk7IHJldHVybjsgfSB9IHdoaWxlIChpICE9CisgICAgICogc2VsZWN0ZWQpOyB9IHZvaWQgc2hvd1N1Yk1lbnUoaW50IGluZGV4KSB7IGlmICgoaW5kZXggPCAwKSB8fAorICAgICAqICFpc0FjdGl2ZSgpKSB7IHJldHVybjsgfSBNZW51SXRlbSBpdGVtID0gZ2V0SXRlbShpbmRleCk7IGlmIChpdGVtCisgICAgICogaW5zdGFuY2VvZiBNZW51KSB7IE1lbnUgbWVudSA9ICgoTWVudSkgZ2V0SXRlbShpbmRleCkpOyBpZgorICAgICAqIChtZW51LmdldEl0ZW1Db3VudCgpID09IDApIHsgcmV0dXJuOyB9IFBvaW50IGxvY2F0aW9uID0KKyAgICAgKiBnZXRTdWJtZW51TG9jYXRpb24oaW5kZXgpOyBtZW51LnNob3cobG9jYXRpb24ueCwgbG9jYXRpb24ueSwgZmFsc2UpOyB9IH0KKyAgICAgKi8KIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gLSB0aGUgbWVudSBiYXIgd2hpY2ggaXMgdGhlIHJvb3Qgb2YgY3JyZW50IG1lbnUncyBoaWVyYXJjaHk7Ci0gICAgICogb3IgbnVsbCBpZiB0aGUgaGllcmFyY2h5IHJvb3QgaXMgbm90IGEgbWVudSBiYXIgCisgICAgICogQHJldHVybiB0aGUgbWVudSBiYXIgd2hpY2ggaXMgdGhlIHJvb3Qgb2YgY3VycmVudCBtZW51J3MgaGllcmFyY2h5OyBvcgorICAgICAqICAgICAgICAgbnVsbCBpZiB0aGUgaGllcmFyY2h5IHJvb3QgaXMgbm90IGEgbWVudSBiYXIuCiAgICAgICovCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIE1lbnVCYXIgZ2V0TWVudUJhcigpIHsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1lbnVCYXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVudUJhcikgcGFyZW50OwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZW51Q29tcG9uZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChNZW51Q29tcG9uZW50KSBwYXJlbnQpLmdldE1lbnVCYXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBQb3B1cEJveCBnZXRQb3B1cEJveCgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgICovCisgICAgICogTWVudUJhciBnZXRNZW51QmFyKCkgeyBpZiAocGFyZW50IGluc3RhbmNlb2YgTWVudUJhcikgeyByZXR1cm4gKE1lbnVCYXIpCisgICAgICogcGFyZW50OyB9IGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZW51Q29tcG9uZW50KSB7IHJldHVybiAoKE1lbnVDb21wb25lbnQpCisgICAgICogcGFyZW50KS5nZXRNZW51QmFyKCk7IH0gcmV0dXJuIG51bGw7IH0gUG9wdXBCb3ggZ2V0UG9wdXBCb3goKSB7IHJldHVybgorICAgICAqIG51bGw7IH0KKyAgICAgKi8KIAogICAgIFJlY3RhbmdsZSBnZXRJdGVtUmVjdChpbnQgaW5kZXgpIHsKICAgICAgICAgLy8gdG8gYmUgb3ZlcnJpZGRlbgpAQCAtOTA2LDEzICs2NDYsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgdGhlIGNsaXAgcmVnaW9uIHdoZW4gbWVudSBzZWxlY3Rpb24gaXMgY2hhbmdlZAotICAgICAqIGZyb20gaW5kZXgxIHRvIGluZGV4Mi4KKyAgICAgKiBEZXRlcm1pbmUgdGhlIGNsaXAgcmVnaW9uIHdoZW4gbWVudSBzZWxlY3Rpb24gaXMgY2hhbmdlZCBmcm9tIGluZGV4MSB0bworICAgICAqIGluZGV4Mi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXgxIC0gb2xkIHNlbGVjdGVkIGludGVtCi0gICAgICogQHBhcmFtIGluZGV4MiAtIG5ldyBzZWxlY3RlZCBpdGVtCi0gICAgICogCi0gICAgICogQHJldHVybiAtIHRoZSByZWdpb24gdG8gcmVwYWludAorICAgICAqIEBwYXJhbSBpbmRleDEKKyAgICAgKiAgICAgICAgICAgIG9sZCBzZWxlY3RlZCBpdGVtLgorICAgICAqIEBwYXJhbSBpbmRleDIKKyAgICAgKiAgICAgICAgICAgIG5ldyBzZWxlY3RlZCBpdGVtLgorICAgICAqIEByZXR1cm4gdGhlIHJlZ2lvbiB0byByZXBhaW50LgogICAgICAqLwogICAgIGZpbmFsIE11bHRpUmVjdEFyZWEgZ2V0VXBkYXRlQ2xpcChpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKSB7CiAgICAgICAgIE11bHRpUmVjdEFyZWEgY2xpcCA9IG5ldyBNdWx0aVJlY3RBcmVhKCk7CkBAIC05MjgsOSArNjY5LDkgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBzdWJtZW51IGxvY2F0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXgKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWJtZW51IGxvY2F0aW9uCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXguCisgICAgICogQHJldHVybiB0aGUgc3VibWVudSBsb2NhdGlvbi4KICAgICAgKi8KICAgICBQb2ludCBnZXRTdWJtZW51TG9jYXRpb24oaW50IGluZGV4KSB7CiAgICAgICAgIC8vIHRvIGJlIG92ZXJyaWRkZW4KQEAgLTk0MCw3ICs2ODEsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHNlbGVjdGVkIGl0ZW0gaW5kZXguCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2VsZWN0ZWQgaXRlbSBpbmRleAorICAgICAqIEByZXR1cm4gdGhlIHNlbGVjdGVkIGl0ZW0gaW5kZXguCiAgICAgICovCiAgICAgaW50IGdldFNlbGVjdGVkSXRlbUluZGV4KCkgewogICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtSW5kZXg7CkBAIC05NTIsMTQgKzY5MywxNSBAQAogICAgIHZvaWQgaGlkZSgpIHsKICAgICAgICAgc2VsZWN0ZWRJdGVtSW5kZXggPSAtMTsKICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1lbnVDb21wb25lbnQpIHsKLSAgICAgICAgICAgICgoTWVudUNvbXBvbmVudCkgcGFyZW50KS5pdGVtSGlkZGVuKHRoaXMpOworICAgICAgICAgICAgKChNZW51Q29tcG9uZW50KXBhcmVudCkuaXRlbUhpZGRlbih0aGlzKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIEl0ZW0gaGlkZGVuLgogICAgICAqIAotICAgICAqIEBwYXJhbSBtYyB0aGUgbWMKKyAgICAgKiBAcGFyYW0gbWMKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYy4KICAgICAgKi8KICAgICB2b2lkIGl0ZW1IaWRkZW4oTWVudUNvbXBvbmVudCBtYykgewogICAgICAgICAvLyB0byBiZSBvdmVycmlkZGVuCkBAIC05NjgsNyArNzEwLDcgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgaXMgdmlzaWJsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIHZpc2libGUKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIHZpc2libGUuCiAgICAgICovCiAgICAgYm9vbGVhbiBpc1Zpc2libGUoKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtOTc3LDcgKzcxOSw3IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIGlzIGFjdGl2ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGFjdGl2ZQorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgYWN0aXZlLgogICAgICAqLwogICAgIGJvb2xlYW4gaXNBY3RpdmUoKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtOTg3LDE0ICs3MjksMTYgQEAKICAgICAgKiBIaWRlIGFsbCBtZW51IGhpZXJhcmNoeS4KICAgICAgKi8KICAgICB2b2lkIGVuZE1lbnUoKSB7Ci0gICAgICAgIC8vPz8/QVdUOiB0b29sa2l0LmRpc3BhdGNoZXIucG9wdXBEaXNwYXRjaGVyLmRlYWN0aXZhdGVBbGwoKTsKKyAgICAgICAgLy8gPz8/QVdUOiB0b29sa2l0LmRpc3BhdGNoZXIucG9wdXBEaXNwYXRjaGVyLmRlYWN0aXZhdGVBbGwoKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBIYW5kbGUgdGhlIG1vdXNlIGNsaWNrIG9yIEVudGVyIGtleSBldmVudCBvbiBhIG1lbnUncyBpdGVtLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aGVuIC0gdGhlIGV2ZW50IHRpbWUKLSAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIC0gaW5wdXQgZXZlbnQgbW9kaWZpZXJzCisgICAgICogQHBhcmFtIHdoZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudCB0aW1lLgorICAgICAqIEBwYXJhbSBtb2RpZmllcnMKKyAgICAgKiAgICAgICAgICAgIGlucHV0IGV2ZW50IG1vZGlmaWVycy4KICAgICAgKi8KICAgICB2b2lkIGl0ZW1TZWxlY3RlZChsb25nIHdoZW4sIGludCBtb2RpZmllcnMpIHsKICAgICAgICAgZW5kTWVudSgpOwpAQCAtMTAwMywxNCArNzQ3LDE0IEBACiAgICAgLyoqCiAgICAgICogQXV0byBuYW1lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZworICAgICAqIEByZXR1cm4gdGhlIHN0cmluZy4KICAgICAgKi8KICAgICBTdHJpbmcgYXV0b05hbWUoKSB7CiAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CiAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoIiQiKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICAvLz8/P0FXVDogaW50IG51bWJlciA9IHRvb2xraXQuYXV0b051bWJlci5uZXh0TWVudUNvbXBvbmVudCsrOworICAgICAgICAvLyA/Pz9BV1Q6IGludCBudW1iZXIgPSB0b29sa2l0LmF1dG9OdW1iZXIubmV4dE1lbnVDb21wb25lbnQrKzsKICAgICAgICAgaW50IG51bWJlciA9IDA7CiAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKSArIEludGVnZXIudG9TdHJpbmcobnVtYmVyKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICByZXR1cm4gbmFtZTsKQEAgLTEwMTksMTAgKzc2MywxMCBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgdGhlIEdyYXBoaWNzIG9iamVjdCBmb3IgdGhlIHBvcC11cCBib3ggb2YgdGhpcyBtZW51IGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xpcCAtIHRoZSBjbGlwIHRvIHNldCBvbiB0aGlzIEdyYXBoaWNzCi0gICAgICogCi0gICAgICogQHJldHVybiAtIHRoZSBjcmVhdGVkIEdyYXBoaWNzIG9iamVjdCwKLSAgICAgKiBvciBudWxsIGlmIHN1Y2ggb2JqZWN0IGlzIG5vdCBhdmFpbGFibGUuCisgICAgICogQHBhcmFtIGNsaXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGlwIHRvIHNldCBvbiB0aGlzIEdyYXBoaWNzLgorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgR3JhcGhpY3Mgb2JqZWN0LCBvciBudWxsIGlmIHN1Y2ggb2JqZWN0IGlzIG5vdAorICAgICAqICAgICAgICAgYXZhaWxhYmxlLgogICAgICAqLwogICAgIEdyYXBoaWNzIGdldEdyYXBoaWNzKE11bHRpUmVjdEFyZWEgY2xpcCkgewogICAgICAgICAvLyB0byBiZSBvdmVycmlkZGVuCkBAIC0xMDMwLDEyICs3NzQsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAcmV0dXJuIGFjY2Vzc2libGUgY29udGV4dCBzcGVjaWZpYyBmb3IgcGFydGljdWxhciBtZW51IGNvbXBvbmVudAorICAgICAqIEByZXR1cm4gYWNjZXNzaWJsZSBjb250ZXh0IHNwZWNpZmljIGZvciBwYXJ0aWN1bGFyIG1lbnUgY29tcG9uZW50LgogICAgICAqLwotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBBY2Nlc3NpYmxlQ29udGV4dCBjcmVhdGVBY2Nlc3NpYmxlQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgICovCisgICAgICogQWNjZXNzaWJsZUNvbnRleHQgY3JlYXRlQWNjZXNzaWJsZUNvbnRleHQoKSB7IHJldHVybiBudWxsOyB9CisgICAgICovCiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvTWVudUNvbnRhaW5lci5qYXZhIGIvYXd0L2phdmEvYXd0L01lbnVDb250YWluZXIuamF2YQppbmRleCA3YTQ4ZjEzLi5lNTA5YTFiIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvTWVudUNvbnRhaW5lci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9NZW51Q29udGFpbmVyLmphdmEKQEAgLTE4LDE3ICsxOCwyMSBAQAogICogQGF1dGhvciBQYXZlbCBEb2xnb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiAvKioKICAqIFRoZSBNZW51Q29udGFpbmVyIGludGVyZmFjZSByZXByZXNlbnRzIGFsbCBtZW51IGNvbnRhaW5lcnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIE1lbnVDb250YWluZXIgewogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIE1lbnVDb21wb25lbnQgZnJvbSB0aGUgTWVudUNvbnRhaW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYyB0aGUgTWVudUNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIE1lbnVDb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlKE1lbnVDb21wb25lbnQgYyk7CiAKQEAgLTQyLDE1ICs0NiwxMiBAQAogICAgIC8qKgogICAgICAqIFBvc3RzIGFuIEV2ZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlIHRoZSBFdmVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV2ZW50IGlzIHBvc3RlZCBzdWNjZXNzZnVsbHk7IAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIEV2ZW50LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgaXMgcG9zdGVkIHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGRpc3BhdGNoRXZlbnQgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gcG9zdEV2ZW50KEV2ZW50IGUpOwogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9QYWludC5qYXZhIGIvYXd0L2phdmEvYXd0L1BhaW50LmphdmEKaW5kZXggZjg3MzJjOC4uZGZlYTNhNyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L1BhaW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L1BhaW50LmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgQWxleGV5IEEuIFBldHJlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dDsKIAogaW1wb3J0IGphdmEuYXd0Lmdlb20uQWZmaW5lVHJhbnNmb3JtOwpAQCAtMjUsMjggKzI2LDMyIEBACiBpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQ29sb3JNb2RlbDsKIAogLyoqCi0gKiBUaGUgUGFpbnQgaW50ZXJmYWNlIHByb3ZpZGVzIHBvc3NpYmlsaXR5IG9mIGdlbmVyYXRpbmcgCi0gKiBjb2xvciBwYXR0ZXJucyBpbiBkZXZpY2Ugc3BhY2UgZm9yIGZpbGwsIGRyYXcsIG9yIHN0cm9rZSBvcGVyYXRpb25zIAotICogaW4gYSBHcmFwaGljczJELgorICogVGhlIFBhaW50IGludGVyZmFjZSBwcm92aWRlcyBwb3NzaWJpbGl0eSBvZiBnZW5lcmF0aW5nIGNvbG9yIHBhdHRlcm5zIGluCisgKiBkZXZpY2Ugc3BhY2UgZm9yIGZpbGwsIGRyYXcsIG9yIHN0cm9rZSBvcGVyYXRpb25zIGluIGEgR3JhcGhpY3MyRC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUGFpbnQgZXh0ZW5kcyBUcmFuc3BhcmVuY3kgewotICAgIAorCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgUGFpbnRDb250ZXh0IHdoaWNoIGlzIHVzZWQgdG8gZ2VuZXJhdGUgY29sb3IgCi0gICAgICogcGF0dGVybnMgZm9yIHJlbmRlcmluZyBvcGVyYXRpb25zIG9mIEdyYXBoaWNzMkQuCisgICAgICogQ3JlYXRlcyB0aGUgUGFpbnRDb250ZXh0IHdoaWNoIGlzIHVzZWQgdG8gZ2VuZXJhdGUgY29sb3IgcGF0dGVybnMgZm9yCisgICAgICogcmVuZGVyaW5nIG9wZXJhdGlvbnMgb2YgR3JhcGhpY3MyRC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY20gdGhlIENvbG9yTW9kZWwgb2JqZWN0LCBvciBudWxsLgotICAgICAqIEBwYXJhbSBkZXZpY2VCb3VuZHMgdGhlIFJlY3RhbmdsZSByZXByZXNlbnRzIHRoZSBib3VuZGluZyBib3ggb2YKLSAgICAgKiBkZXZpY2Ugc3BhY2UgZm9yIHRoZSBncmFwaGljcyByZW5kZXJpbmcgb3BlcmF0aW9ucy4KLSAgICAgKiBAcGFyYW0gdXNlckJvdW5kcyB0aGUgUmVjdGFuZ2xlIHJlcHJlc2VudHMgYm91bmRpbmcgYm94IG9mCi0gICAgICogdXNlciBzcGFjZSBmb3IgdGhlIGdyYXBoaWNzIHJlbmRlcmluZyBvcGVyYXRpb25zLgotICAgICAqIEBwYXJhbSB4Zm9ybSB0aGUgQWZmaW5lVHJhbnNmb3JtIGZvciB0cmFuc2xhdGlvbiBmcm9tIHVzZXIgc3BhY2UgCi0gICAgICogdG8gZGV2aWNlIHNwYWNlLgotICAgICAqIEBwYXJhbSBoaW50cyB0aGUgUmVuZGVyaW5nSGludHMgcHJlZmVyZW5jZXMuCi0gICAgICogCisgICAgICogQHBhcmFtIGNtCisgICAgICogICAgICAgICAgICB0aGUgQ29sb3JNb2RlbCBvYmplY3QsIG9yIG51bGwuCisgICAgICogQHBhcmFtIGRldmljZUJvdW5kcworICAgICAqICAgICAgICAgICAgdGhlIFJlY3RhbmdsZSByZXByZXNlbnRzIHRoZSBib3VuZGluZyBib3ggb2YgZGV2aWNlIHNwYWNlIGZvcgorICAgICAqICAgICAgICAgICAgdGhlIGdyYXBoaWNzIHJlbmRlcmluZyBvcGVyYXRpb25zLgorICAgICAqIEBwYXJhbSB1c2VyQm91bmRzCisgICAgICogICAgICAgICAgICB0aGUgUmVjdGFuZ2xlIHJlcHJlc2VudHMgYm91bmRpbmcgYm94IG9mIHVzZXIgc3BhY2UgZm9yIHRoZQorICAgICAqICAgICAgICAgICAgZ3JhcGhpY3MgcmVuZGVyaW5nIG9wZXJhdGlvbnMuCisgICAgICogQHBhcmFtIHhmb3JtCisgICAgICogICAgICAgICAgICB0aGUgQWZmaW5lVHJhbnNmb3JtIGZvciB0cmFuc2xhdGlvbiBmcm9tIHVzZXIgc3BhY2UgdG8gZGV2aWNlCisgICAgICogICAgICAgICAgICBzcGFjZS4KKyAgICAgKiBAcGFyYW0gaGludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBSZW5kZXJpbmdIaW50cyBwcmVmZXJlbmNlcy4KICAgICAgKiBAcmV0dXJuIHRoZSBQYWludENvbnRleHQgZm9yIGdlbmVyYXRpbmcgY29sb3IgcGF0dGVybnMuCiAgICAgICovCi0gICAgUGFpbnRDb250ZXh0IGNyZWF0ZUNvbnRleHQoQ29sb3JNb2RlbCBjbSwgUmVjdGFuZ2xlIGRldmljZUJvdW5kcywKLSAgICAgICAgICAgIFJlY3RhbmdsZTJEIHVzZXJCb3VuZHMsIEFmZmluZVRyYW5zZm9ybSB4Zm9ybSwKLSAgICAgICAgICAgIFJlbmRlcmluZ0hpbnRzIGhpbnRzKTsKKyAgICBQYWludENvbnRleHQgY3JlYXRlQ29udGV4dChDb2xvck1vZGVsIGNtLCBSZWN0YW5nbGUgZGV2aWNlQm91bmRzLCBSZWN0YW5nbGUyRCB1c2VyQm91bmRzLAorICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHhmb3JtLCBSZW5kZXJpbmdIaW50cyBoaW50cyk7CiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvUGFpbnRDb250ZXh0LmphdmEgYi9hd3QvamF2YS9hd3QvUGFpbnRDb250ZXh0LmphdmEKaW5kZXggNjQ3ZGU4Yi4uOTY2YjZjYSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L1BhaW50Q29udGV4dC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9QYWludENvbnRleHQuamF2YQpAQCAtMTgsMjAgKzE4LDIyIEBACiAgKiBAYXV0aG9yIEFsZXhleSBBLiBQZXRyZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIGltcG9ydCBqYXZhLmF3dC5pbWFnZS5Db2xvck1vZGVsOwogaW1wb3J0IGphdmEuYXd0LmltYWdlLlJhc3RlcjsKIAogLyoqCi0gKiBUaGUgUGFpbnRDb250ZXh0IGludGVyZmFjZSBkZXRlcm1pbmVzIHRoZSBzcGVjaWZpYyBlbnZpcm9ubWVudCBmb3IKLSAqIGdlbmVyYXRpbmcgY29sb3IgcGF0dGVybnMgaW4gZGV2aWNlIHNwYWNlIGZvciBmaWxsLCBkcmF3LCBvciBzdHJva2UgCi0gKiByZW5kZXJpbmcgb3BlcmF0aW9ucyB1c2luZyBHcmFwaGljczJELiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBjb2xvcnMKLSAqIHRocm91Z2ggdGhlIFJhc3RlciBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpYyBDb2xvck1vZGVsIAotICogZm9yIEdyYXBoaWNzMkQgcmVuZGVyaW5nIG9wZXJhdGlvbnMuCisgKiBUaGUgUGFpbnRDb250ZXh0IGludGVyZmFjZSBkZXRlcm1pbmVzIHRoZSBzcGVjaWZpYyBlbnZpcm9ubWVudCBmb3IgZ2VuZXJhdGluZworICogY29sb3IgcGF0dGVybnMgaW4gZGV2aWNlIHNwYWNlIGZvciBmaWxsLCBkcmF3LCBvciBzdHJva2UgcmVuZGVyaW5nIG9wZXJhdGlvbnMKKyAqIHVzaW5nIEdyYXBoaWNzMkQuIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGNvbG9ycyB0aHJvdWdoIHRoZSBSYXN0ZXIgb2JqZWN0CisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmljIENvbG9yTW9kZWwgZm9yIEdyYXBoaWNzMkQgcmVuZGVyaW5nIG9wZXJhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFBhaW50Q29udGV4dCB7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZWxlYXNlcyB0aGUgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgdGhlIG9wZXJhdGlvbi4KICAgICAgKi8KQEAgLTQ1LDIwICs0NywyMyBAQAogICAgIENvbG9yTW9kZWwgZ2V0Q29sb3JNb2RlbCgpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgUmFzdGVyIHdoaWNoIGRlZmluZXMgdGhlIGNvbG9ycyBvZiB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIAorICAgICAqIEdldHMgdGhlIFJhc3RlciB3aGljaCBkZWZpbmVzIHRoZSBjb2xvcnMgb2YgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhcgogICAgICAqIGFyZWEgZm9yIEdyYXBoaWNzMkQgcmVuZGVyaW5nIG9wZXJhdGlvbnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgZGV2aWNlIHNwYWNlIGFyZWEgZm9yIHdoaWNoIAotICAgICAqIGNvbG9ycyBhcmUgZ2VuZXJhdGVkLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGRldmljZSBzcGFjZSBhcmVhIGZvciB3aGljaCAKLSAgICAgKiBjb2xvcnMgYXJlIGdlbmVyYXRlZC4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGRldmljZSBzcGFjZSBhcmVhIGZvciB3aGljaCAKLSAgICAgKiBjb2xvcnMgYXJlIGdlbmVyYXRlZC4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBkZXZpY2Ugc3BhY2UgYXJlYSBmb3Igd2hpY2ggCi0gICAgICogY29sb3JzIGFyZSBnZW5lcmF0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgUmFzdGVyIG9iamVjdCB3aGljaCBjb250YWlucyB0aGUgY29sb3JzIG9mIHRoZSBzcGVjaWZpZWQgCi0gICAgICogcmVjdGFuZ3VsYXIgYXJlYSBmb3IgR3JhcGhpY3MyRCByZW5kZXJpbmcgb3BlcmF0aW9ucy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgZGV2aWNlIHNwYWNlIGFyZWEgZm9yIHdoaWNoIGNvbG9ycyBhcmUKKyAgICAgKiAgICAgICAgICAgIGdlbmVyYXRlZC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgZGV2aWNlIHNwYWNlIGFyZWEgZm9yIHdoaWNoIGNvbG9ycyBhcmUKKyAgICAgKiAgICAgICAgICAgIGdlbmVyYXRlZC4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBkZXZpY2Ugc3BhY2UgYXJlYSBmb3Igd2hpY2ggY29sb3JzIGFyZQorICAgICAqICAgICAgICAgICAgZ2VuZXJhdGVkLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBkZXZpY2Ugc3BhY2UgYXJlYSBmb3Igd2hpY2ggY29sb3JzIGFyZQorICAgICAqICAgICAgICAgICAgZ2VuZXJhdGVkLgorICAgICAqIEByZXR1cm4gdGhlIFJhc3RlciBvYmplY3Qgd2hpY2ggY29udGFpbnMgdGhlIGNvbG9ycyBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICByZWN0YW5ndWxhciBhcmVhIGZvciBHcmFwaGljczJEIHJlbmRlcmluZyBvcGVyYXRpb25zLgogICAgICAqLwogICAgIFJhc3RlciBnZXRSYXN0ZXIoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpOwogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L1BvaW50LmphdmEgYi9hd3QvamF2YS9hd3QvUG9pbnQuamF2YQppbmRleCA5OTQxOGVkLi44ZWM0MjQxIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvUG9pbnQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvUG9pbnQuamF2YQpAQCAtMTgsMjggKzE4LDM3IEBACiAgKiBAYXV0aG9yIERlbmlzIE0uIEtpc2hlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dDsKIAogaW1wb3J0IGphdmEuYXd0Lmdlb20uUG9pbnQyRDsKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIAogLyoqCi0gKiBUaGUgUG9pbnQgY2xhc3MgcmVwcmVzZW50cyBhIHBvaW50IGxvY2F0aW9uIHdpdGggY29vcmRpbmF0ZXMgWCwgWSBpbiAKLSAqIGN1cnJlbnQgY29vcmRpbmF0ZSBzeXN0ZW0uCisgKiBUaGUgUG9pbnQgY2xhc3MgcmVwcmVzZW50cyBhIHBvaW50IGxvY2F0aW9uIHdpdGggY29vcmRpbmF0ZXMgWCwgWSBpbiBjdXJyZW50CisgKiBjb29yZGluYXRlIHN5c3RlbS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBQb2ludCBleHRlbmRzIFBvaW50MkQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01Mjc2OTQwNjQwMjU5NzQ5ODUwTDsKIAotICAgIC8qKiBUaGUgWCBjb29yZGluYXRlIG9mIFBvaW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBYIGNvb3JkaW5hdGUgb2YgUG9pbnQuCisgICAgICovCiAgICAgcHVibGljIGludCB4OwotICAgIAotICAgIC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIFBvaW50LiAqLworCisgICAgLyoqCisgICAgICogVGhlIFkgY29vcmRpbmF0ZSBvZiBQb2ludC4KKyAgICAgKi8KICAgICBwdWJsaWMgaW50IHk7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcG9pbnQgd2l0aCAoMCwgTykgY29vcmRpbmF0ZXMsIHRoZSBvcmlnaW4gb2YgCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHBvaW50IHdpdGggKDAsIE8pIGNvb3JkaW5hdGVzLCB0aGUgb3JpZ2luIG9mCiAgICAgICogY29vcmRpbmF0ZSBzeXN0ZW0uCiAgICAgICovCiAgICAgcHVibGljIFBvaW50KCkgewpAQCAtNDksMTggKzU4LDIwIEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHBvaW50IHdpdGggKHgsIHkpIGNvb3JkaW5hdGVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgUG9pbnQuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiBQb2ludC4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiBQb2ludC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiBQb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgUG9pbnQoaW50IHgsIGludCB5KSB7CiAgICAgICAgIHNldExvY2F0aW9uKHgsIHkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBwb2ludCwgZ2l2aW5nIGl0IHRoZSBzYW1lIGxvY2Fpb24gYXMKLSAgICAgKiB0aGUgcGFyYW1ldGVyIHAuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHBvaW50LCBnaXZpbmcgaXQgdGhlIHNhbWUgbG9jYXRpb24gYXMgdGhlIHBhcmFtZXRlciBwLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIHRoZSBQb2ludCBvYmplY3QgZ2l2aW5nIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgbmV3IHBvaW50LgorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgUG9pbnQgb2JqZWN0IGdpdmluZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIG5ldyBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgUG9pbnQoUG9pbnQgcCkgewogICAgICAgICBzZXRMb2NhdGlvbihwLngsIHAueSk7CkBAIC02OSwxMiArODAsMTAgQEAKICAgICAvKioKICAgICAgKiBDb21wYXJlcyBjdXJyZW50IFBvaW50IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9iaiB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIE9iamVjdCBiZWluZyBjb21wYXJlZCBpcyBhIFBvaW50IAotICAgICAqIHdob3NlIGNvb3JkaW5hdGVzIGFyZSBlcXVhbCB0byB0aGUgY29vcmRpbmF0ZXMgb2YgdGhpcyAKLSAgICAgKiBQb2ludCwgb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgT2JqZWN0IGJlaW5nIGNvbXBhcmVkIGlzIGEgUG9pbnQgd2hvc2UgY29vcmRpbmF0ZXMKKyAgICAgKiAgICAgICAgIGFyZSBlcXVhbCB0byB0aGUgY29vcmRpbmF0ZXMgb2YgdGhpcyBQb2ludCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgamF2YS5hd3QuZ2VvbS5Qb2ludDJEI2VxdWFscyhPYmplY3QpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC0xMDMsNyArMTEyLDYgQEAKICAgICAgKiBHZXRzIFggY29vcmRpbmF0ZSBvZiBQb2ludCBhcyBhIGRvdWJsZS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIFggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgYXMgYSBkb3VibGUuCi0gICAgICogCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlBvaW50MkQjZ2V0WCgpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC0xMTUsNyArMTIzLDYgQEAKICAgICAgKiBHZXRzIFkgY29vcmRpbmF0ZSBvZiBQb2ludCBhcyBhIGRvdWJsZS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIFkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgYXMgYSBkb3VibGUuCi0gICAgICogCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlBvaW50MkQjZ2V0WSgpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC0xMzUsNyArMTQyLDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgUG9pbnQgdG8gdGhlIHNhbWUgY29vcmRpbmF0ZXMgYXMgcC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgUG9pbnQgdGhhdCBnaXZlcyB0aGUgbmV3IGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgUG9pbnQgdGhhdCBnaXZlcyB0aGUgbmV3IGxvY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFBvaW50IHApIHsKICAgICAgICAgc2V0TG9jYXRpb24ocC54LCBwLnkpOwpAQCAtMTQ0LDggKzE1MiwxMCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBQb2ludCB0byB0aGUgY29vcmRpbmF0ZXMgWCwgWS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBQb2ludCdzIG5ldyBsb2NhdGlvbi4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBQb2ludCdzIG5ldyBsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgUG9pbnQncyBuZXcgbG9jYXRpb24uCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIFBvaW50J3MgbmV3IGxvY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKGludCB4LCBpbnQgeSkgewogICAgICAgICB0aGlzLnggPSB4OwpAQCAtMTU1LDM2ICsxNjUsNDMgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBsb2NhdGlvbiBvZiBQb2ludCB0byB0aGUgc3BlY2lmaWVkIGRvdWJsZSBjb29yZGluYXRlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCB0aGUgUG9pbnQncyBuZXcgbG9jYXRpb24uCi0gICAgICogQHBhcmFtIHkgdGhlIFkgdGhlIFBvaW50J3MgbmV3IGxvY2F0aW9uLgotICAgICAqICAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggdGhlIFBvaW50J3MgbmV3IGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSB0aGUgUG9pbnQncyBuZXcgbG9jYXRpb24uCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlBvaW50MkQjc2V0TG9jYXRpb24oZG91YmxlLCBkb3VibGUpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oZG91YmxlIHgsIGRvdWJsZSB5KSB7Ci0gICAgICAgIHggPSB4IDwgSW50ZWdlci5NSU5fVkFMVUUgPyBJbnRlZ2VyLk1JTl9WQUxVRSA6IHggPiBJbnRlZ2VyLk1BWF9WQUxVRSA/IEludGVnZXIuTUFYX1ZBTFVFIDogeDsKLSAgICAgICAgeSA9IHkgPCBJbnRlZ2VyLk1JTl9WQUxVRSA/IEludGVnZXIuTUlOX1ZBTFVFIDogeSA+IEludGVnZXIuTUFYX1ZBTFVFID8gSW50ZWdlci5NQVhfVkFMVUUgOiB5OworICAgICAgICB4ID0geCA8IEludGVnZXIuTUlOX1ZBTFVFID8gSW50ZWdlci5NSU5fVkFMVUUgOiB4ID4gSW50ZWdlci5NQVhfVkFMVUUgPyBJbnRlZ2VyLk1BWF9WQUxVRQorICAgICAgICAgICAgICAgIDogeDsKKyAgICAgICAgeSA9IHkgPCBJbnRlZ2VyLk1JTl9WQUxVRSA/IEludGVnZXIuTUlOX1ZBTFVFIDogeSA+IEludGVnZXIuTUFYX1ZBTFVFID8gSW50ZWdlci5NQVhfVkFMVUUKKyAgICAgICAgICAgICAgICA6IHk7CiAgICAgICAgIHNldExvY2F0aW9uKChpbnQpTWF0aC5yb3VuZCh4KSwgKGludClNYXRoLnJvdW5kKHkpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBNb3ZlcyB0aGUgUG9pbnQgdG8gdGhlIHNwZWNpZmllZCAoeCwgeSkgbG9jYXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgbmV3IGxvY2F0aW9uLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBsb2NhdGlvbi4gCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgbmV3IGxvY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG1vdmUoaW50IHgsIGludCB5KSB7CiAgICAgICAgIHNldExvY2F0aW9uKHgsIHkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRyYW5zbGF0ZXMgY3VycmVudCBQb2ludCBtb3ZpbmcgaXQgZnJvbSB0aGUgcG9zaXRpb24gKHgsIHkpIAotICAgICAqIHRvIHRoZSBuZXcgcG9zaXRpb24gZ2l2ZW4gYnkgKHgrZHgsIHgrZHkpIGNvb3JkaW5hdGVzLgorICAgICAqIFRyYW5zbGF0ZXMgY3VycmVudCBQb2ludCBtb3ZpbmcgaXQgZnJvbSB0aGUgcG9zaXRpb24gKHgsIHkpIHRvIHRoZSBuZXcKKyAgICAgKiBwb3NpdGlvbiBnaXZlbiBieSAoeCtkeCwgeCtkeSkgY29vcmRpbmF0ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGR4IHRoZSBob3Jpem9udGFsIGRlbHRhIC0gdGhlIFBvaW50IGlzIG1vdmVkIHRvIHRoaXMgZGlzdGFuY2UgYWxvbmcKLSAgICAgKiBYIGF4aXMuCi0gICAgICogQHBhcmFtIGR5IHRoZSB2ZXJ0aWNhbCBkZWx0YSAtIHRoZSBQb2ludCBpcyBtb3ZlZCB0byB0aGlzIGRpc3RhbmNlIGFsb25nCi0gICAgICogWSBheGlzLgorICAgICAqIEBwYXJhbSBkeAorICAgICAqICAgICAgICAgICAgdGhlIGhvcml6b250YWwgZGVsdGEgLSB0aGUgUG9pbnQgaXMgbW92ZWQgdG8gdGhpcyBkaXN0YW5jZQorICAgICAqICAgICAgICAgICAgYWxvbmcgWCBheGlzLgorICAgICAqIEBwYXJhbSBkeQorICAgICAqICAgICAgICAgICAgdGhlIHZlcnRpY2FsIGRlbHRhIC0gdGhlIFBvaW50IGlzIG1vdmVkIHRvIHRoaXMgZGlzdGFuY2UgYWxvbmcKKyAgICAgKiAgICAgICAgICAgIFkgYXhpcy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0cmFuc2xhdGUoaW50IGR4LCBpbnQgZHkpIHsKICAgICAgICAgeCArPSBkeDsKQEAgLTE5Miw0ICsyMDksMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvUG9seWdvbi5qYXZhIGIvYXd0L2phdmEvYXd0L1BvbHlnb24uamF2YQppbmRleCA2ZjNmYzk3Li5kZTMxZWI5IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvUG9seWdvbi5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9Qb2x5Z29uLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5hd3QuUG9pbnQ7CkBAIC0zNCw1NyArMzUsNzggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgUG9seWdvbiBjbGFzcyBkZWZpbmVzIGFuIGNsb3NlZCBhcmVhIHNwZWNpZmllZCBieSBuIHZlcnRpY2VzIGFuZCAKLSAqIG4gZWRnZXMuIFRoZSBjb29yZGluYXRlcyBvZiB0aGUgdmVydGljZXMgYXJlIHNwZWNpZmllZCBieSB4LCB5IGFycmF5cy4KLSAqIFRoZSBlZGdlcyBhcmUgdGhlIGxpbmUgc2VnbWVudHMgZnJvbSB0aGUgcG9pbnQgKHhbaV0sIHlbaV0pIHRvIHRoZSBwb2ludCAKLSAqICh4W2krMV0sIHlbaSsxXSksIGZvciAtMSA8IGkgPCAobi0xKSBwbHVzIHRoZSBsaW5lIHNlZ21lbnQgZnJvbSAKLSAqIHRoZSBwb2ludCAoeFtuLTFdLCB5W24tMV0pIHRvIHRoZSBwb2ludCAoeFswXSwgeVswXSkgcG9pbnQuIAotICogVGhlIFBvbHlnb24gaXMgZW1wdHkgaWYgdGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBpcyB6ZXJvLiAgIAorICogVGhlIFBvbHlnb24gY2xhc3MgZGVmaW5lcyBhbiBjbG9zZWQgYXJlYSBzcGVjaWZpZWQgYnkgbiB2ZXJ0aWNlcyBhbmQgbiBlZGdlcy4KKyAqIFRoZSBjb29yZGluYXRlcyBvZiB0aGUgdmVydGljZXMgYXJlIHNwZWNpZmllZCBieSB4LCB5IGFycmF5cy4gVGhlIGVkZ2VzIGFyZQorICogdGhlIGxpbmUgc2VnbWVudHMgZnJvbSB0aGUgcG9pbnQgKHhbaV0sIHlbaV0pIHRvIHRoZSBwb2ludCAoeFtpKzFdLCB5W2krMV0pLAorICogZm9yIC0xIDwgaSA8IChuLTEpIHBsdXMgdGhlIGxpbmUgc2VnbWVudCBmcm9tIHRoZSBwb2ludCAoeFtuLTFdLCB5W24tMV0pIHRvCisgKiB0aGUgcG9pbnQgKHhbMF0sIHlbMF0pIHBvaW50LiBUaGUgUG9seWdvbiBpcyBlbXB0eSBpZiB0aGUgbnVtYmVyIG9mIHZlcnRpY2VzCisgKiBpcyB6ZXJvLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFBvbHlnb24gaW1wbGVtZW50cyBTaGFwZSwgU2VyaWFsaXphYmxlIHsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjQ2MDA2MTQzNzkwMDA2OTk2OUw7CiAKLSAgICAvKiogVGhlIHBvaW50cyBidWZmZXIgY2FwYWNpdHkuICovCisgICAgLyoqCisgICAgICogVGhlIHBvaW50cyBidWZmZXIgY2FwYWNpdHkuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9DQVBBQ0lUWSA9IDQ7Ci0gICAgCi0gICAgLyoqIFRoZSBudW1iZXIgb2YgUG9seWdvbiB2ZXJ0aWNlcy4qLworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBQb2x5Z29uIHZlcnRpY2VzLgorICAgICAqLwogICAgIHB1YmxpYyBpbnQgbnBvaW50czsKLSAgICAKLSAgICAvKiogVGhlIGFycmF5IG9mIFggY29vcmRpbmF0ZXMgb2YgdGhlIHZlcnRpY2VzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGFycmF5IG9mIFggY29vcmRpbmF0ZXMgb2YgdGhlIHZlcnRpY2VzLgorICAgICAqLwogICAgIHB1YmxpYyBpbnRbXSB4cG9pbnRzOwotICAgIAotICAgIC8qKiBUaGUgYXJyYXkgb2YgWSBjb29yZGluYXRlcyBvZiB0aGUgdmVydGljZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXJyYXkgb2YgWSBjb29yZGluYXRlcyBvZiB0aGUgdmVydGljZXMuCisgICAgICovCiAgICAgcHVibGljIGludFtdIHlwb2ludHM7Ci0gICAgCi0gICAgLyoqICAKLSAgICAgKiBUaGUgc21hbGxlc3QgUmVjdGFuZ2xlIHRoYXQgY29tcGxldGVseSBjb250YWlucyB0aGlzIFBvbHlnb24uIAorCisgICAgLyoqCisgICAgICogVGhlIHNtYWxsZXN0IFJlY3RhbmdsZSB0aGF0IGNvbXBsZXRlbHkgY29udGFpbnMgdGhpcyBQb2x5Z29uLgogICAgICAqLwogICAgIHByb3RlY3RlZCBSZWN0YW5nbGUgYm91bmRzOwogCiAgICAgLyoKLSAgICAgKiBQb2x5Z29uIHBhdGggaXRlcmF0b3IgIAorICAgICAqIFBvbHlnb24gcGF0aCBpdGVyYXRvcgogICAgICAqLwogICAgIC8qKgogICAgICAqIFRoZSBpbnRlcm5hbCBDbGFzcyBJdGVyYXRvci4KICAgICAgKi8KICAgICBjbGFzcyBJdGVyYXRvciBpbXBsZW1lbnRzIFBhdGhJdGVyYXRvciB7CiAKLSAgICAgICAgLyoqIFRoZSBzb3VyY2UgUG9seWdvbiBvYmplY3QuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc291cmNlIFBvbHlnb24gb2JqZWN0LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFBvbHlnb24gcDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgcGF0aCBpdGVyYXRvciB0cmFuc2Zvcm1hdGlvbi4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBhdGggaXRlcmF0b3IgdHJhbnNmb3JtYXRpb24uCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgQWZmaW5lVHJhbnNmb3JtIHQ7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGN1cnJlbnQgc2VnbWVuZXQgaW5kZXguICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjdXJyZW50IHNlZ21lbnQgaW5kZXguCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgaW50IGluZGV4OwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFBvbHlnb24uSXRlcmF0b3IgZm9yIHRoZSBnaXZlbiBwb2x5Z29uIGFuZCB0cmFuc2Zvcm1hdGlvbgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFBvbHlnb24uSXRlcmF0b3IgZm9yIHRoZSBnaXZlbiBwb2x5Z29uIGFuZAorICAgICAgICAgKiB0cmFuc2Zvcm1hdGlvbgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGF0IC0gdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgdG8gYXBwbHkgcmVjdGFuZ2xlIHBhdGgKLSAgICAgICAgICogQHBhcmFtIHAgdGhlIHAKKyAgICAgICAgICogQHBhcmFtIGF0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgdG8gYXBwbHkgcmVjdGFuZ2xlIHBhdGguCisgICAgICAgICAqIEBwYXJhbSBwCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHAuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgSXRlcmF0b3IoQWZmaW5lVHJhbnNmb3JtIGF0LCBQb2x5Z29uIHApIHsKICAgICAgICAgICAgIHRoaXMucCA9IHA7CkBAIC0xNDgsMTggKzE3MCwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBwb2x5Z29uIHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdmVydGljZXMsCi0gICAgICogYW5kIHRoZSBnaXZlbiBhcnJheXMgb2YgeCwgeSB2ZXJ0ZXggY29vcmRpbmF0ZXMuIFRoZSBsZW5ndGggb2YgCi0gICAgICogZWFjaCBjb29yZGluYXRlIGFycmF5IG1heSBub3QgYmUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIAotICAgICAqIHZlcnRpY2VzIGJ1dCBtYXkgYmUgZ3JlYXRlci4gT25seSB0aGUgZmlyc3QgbiBlbGVtZW50cyBhcmUgdXNlZCBmcm9tIAotICAgICAqIGVhY2ggY29vcmRpbmF0ZSBhcnJheS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcG9seWdvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHZlcnRpY2VzLCBhbmQgdGhlCisgICAgICogZ2l2ZW4gYXJyYXlzIG9mIHgsIHkgdmVydGV4IGNvb3JkaW5hdGVzLiBUaGUgbGVuZ3RoIG9mIGVhY2ggY29vcmRpbmF0ZQorICAgICAqIGFycmF5IG1heSBub3QgYmUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHZlcnRpY2VzIGJ1dCBtYXkgYmUKKyAgICAgKiBncmVhdGVyLiBPbmx5IHRoZSBmaXJzdCBuIGVsZW1lbnRzIGFyZSB1c2VkIGZyb20gZWFjaCBjb29yZGluYXRlIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4cG9pbnRzIHRoZSBhcnJheSBvZiBYIHZlcnRleCBjb29yZGluYXRlcy4gCi0gICAgICogQHBhcmFtIHlwb2ludHMgdGhlIGFycmF5IG9mIFkgdmVydGV4IGNvb3JkaW5hdGVzLgotICAgICAqIEBwYXJhbSBucG9pbnRzIHRoZSBudW1iZXIgdmVydGljZXMgb2YgdGhlIHBvbHlnb24uCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBsZW5ndGggb2YgeHBvaW50cyBvciB5cG9pbnRzCi0gICAgICogaXMgbGVzcyB0aGFuIG4uCi0gICAgICogQHRocm93cyBOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiBpZiBuIGlzIG5lZ2F0aXZlLgorICAgICAqIEBwYXJhbSB4cG9pbnRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgWCB2ZXJ0ZXggY29vcmRpbmF0ZXMuCisgICAgICogQHBhcmFtIHlwb2ludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBZIHZlcnRleCBjb29yZGluYXRlcy4KKyAgICAgKiBAcGFyYW0gbnBvaW50cworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciB2ZXJ0aWNlcyBvZiB0aGUgcG9seWdvbi4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbGVuZ3RoIG9mIHhwb2ludHMgb3IgeXBvaW50cyBpcyBsZXNzIHRoYW4gbi4KKyAgICAgKiBAdGhyb3dzIE5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgbiBpcyBuZWdhdGl2ZS4KICAgICAgKi8KICAgICBwdWJsaWMgUG9seWdvbihpbnRbXSB4cG9pbnRzLCBpbnRbXSB5cG9pbnRzLCBpbnQgbnBvaW50cykgewogICAgICAgICBpZiAobnBvaW50cyA+IHhwb2ludHMubGVuZ3RoIHx8IG5wb2ludHMgPiB5cG9pbnRzLmxlbmd0aCkgewpAQCAtMTc4LDkgKzIwMyw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBjdXJyZW50IFBvbHlnb24gdG8gYW4gZW1wdHkgUG9seWdvbi4gTW9yZSBwcmVjaXNlbHksIAotICAgICAqIHRoZSBudW1iZXIgb2YgUG9seWdvbiB2ZXJ0aWNlcyBpcyBzZXQgdG8gemVybywgYnV0IHgsIHkgY29vcmRpbmF0ZXMgCi0gICAgICogYXJyYXlzIGFyZSBub3QgYWZmZWN0ZWQuICAKKyAgICAgKiBSZXNldHMgdGhlIGN1cnJlbnQgUG9seWdvbiB0byBhbiBlbXB0eSBQb2x5Z29uLiBNb3JlIHByZWNpc2VseSwgdGhlCisgICAgICogbnVtYmVyIG9mIFBvbHlnb24gdmVydGljZXMgaXMgc2V0IHRvIHplcm8sIGJ1dCB4LCB5IGNvb3JkaW5hdGVzIGFycmF5cworICAgICAqIGFyZSBub3QgYWZmZWN0ZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CiAgICAgICAgIG5wb2ludHMgPSAwOwpAQCAtMTg4LDIxICsyMTMsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnZhbGlkYXRlcyB0aGUgZGF0YSB0aGF0IGRlcGVuZHMgb24gdGhlIHZlcnRleCBjb29yZGluYXRlcy4gCi0gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBkaXJlY3QgbWFuaXB1bGF0aW9ucyAgCi0gICAgICogb2YgdGhlIHgsIHkgdmVydGV4IGNvb3JkaW5hdGVzIGFycmF5cyB0byBhdm9pZCB1bnByZWRpY3RhYmxlIAotICAgICAqIHJlc3VsdHMgb2YgbWV0aG9kcyB3aGljaCByZWx5IG9uIHRoZSBib3VuZGluZyBib3guCisgICAgICogSW52YWxpZGF0ZXMgdGhlIGRhdGEgdGhhdCBkZXBlbmRzIG9uIHRoZSB2ZXJ0ZXggY29vcmRpbmF0ZXMuIFRoaXMgbWV0aG9kCisgICAgICogc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBkaXJlY3QgbWFuaXB1bGF0aW9ucyBvZiB0aGUgeCwgeSB2ZXJ0ZXgKKyAgICAgKiBjb29yZGluYXRlcyBhcnJheXMgdG8gYXZvaWQgdW5wcmVkaWN0YWJsZSByZXN1bHRzIG9mIG1ldGhvZHMgd2hpY2ggcmVseQorICAgICAqIG9uIHRoZSBib3VuZGluZyBib3guCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpIHsKICAgICAgICAgYm91bmRzID0gbnVsbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBwb2ludCB0byB0aGUgUG9seWdvbiBhbmQgdXBkYXRlcyB0aGUgYm91bmRpbmcgYm94IAotICAgICAqIGFjY29yZGluZ2x5LgorICAgICAqIEFkZHMgdGhlIHBvaW50IHRvIHRoZSBQb2x5Z29uIGFuZCB1cGRhdGVzIHRoZSBib3VuZGluZyBib3ggYWNjb3JkaW5nbHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGFkZGVkIHZlcnRleC4KLSAgICAgKiBAcGFyYW0gcHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgYWRkZWQgdmVydGV4LgorICAgICAqIEBwYXJhbSBweAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgYWRkZWQgdmVydGV4LgorICAgICAqIEBwYXJhbSBweQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgYWRkZWQgdmVydGV4LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFBvaW50KGludCBweCwgaW50IHB5KSB7CiAgICAgICAgIGlmIChucG9pbnRzID09IHhwb2ludHMubGVuZ3RoKSB7CkBAIC0yMjIsMjAgKzI0OCwxNiBAQAogICAgICAgICBucG9pbnRzKys7CiAKICAgICAgICAgaWYgKGJvdW5kcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBib3VuZHMuc2V0RnJhbWVGcm9tRGlhZ29uYWwoCi0gICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGJvdW5kcy5nZXRNaW5YKCksIHB4KSwKLSAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4oYm91bmRzLmdldE1pblkoKSwgcHkpLAotICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChib3VuZHMuZ2V0TWF4WCgpLCBweCksCi0gICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KGJvdW5kcy5nZXRNYXhZKCksIHB5KSk7CisgICAgICAgICAgICBib3VuZHMuc2V0RnJhbWVGcm9tRGlhZ29uYWwoTWF0aC5taW4oYm91bmRzLmdldE1pblgoKSwgcHgpLCBNYXRoLm1pbihib3VuZHMuZ2V0TWluWSgpLAorICAgICAgICAgICAgICAgICAgICBweSksIE1hdGgubWF4KGJvdW5kcy5nZXRNYXhYKCksIHB4KSwgTWF0aC5tYXgoYm91bmRzLmdldE1heFkoKSwgcHkpKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgUG9seWdvbi4gVGhlIGJvdW5kaW5nIHJlY3RhbmdsZQotICAgICAqIGlzIHRoZSBzbWFsbGVzdCByZWN0YW5nbGUgd2hpY2ggY29udGFpbnMgdGhlIFBvbHlnb24uCisgICAgICogR2V0cyB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBQb2x5Z29uLiBUaGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIHRoZQorICAgICAqIHNtYWxsZXN0IHJlY3RhbmdsZSB3aGljaCBjb250YWlucyB0aGUgUG9seWdvbi4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgdGhlIFBvbHlnb24uCi0gICAgICogCiAgICAgICogQHNlZSBqYXZhLmF3dC5TaGFwZSNnZXRCb3VuZHMoKQogICAgICAqLwogICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKCkgewpAQCAtMjcwLDExICsyOTIsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgdGhlIFBvbHlnb24uIFRoZSBib3VuZGluZyByZWN0YW5nbGUKLSAgICAgKiBpcyB0aGUgc21hbGxlc3QgcmVjdGFuZ2xlIHdoaWNoIGNvbnRhaW5zIHRoZSBQb2x5Z29uLgorICAgICAqIEdldHMgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgUG9seWdvbi4gVGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBpcyB0aGUKKyAgICAgKiBzbWFsbGVzdCByZWN0YW5nbGUgd2hpY2ggY29udGFpbnMgdGhlIFBvbHlnb24uCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBQb2x5Z29uLgotICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFVzZSBnZXRCb3VuZHMoKSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTI4MywxMiArMzA0LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgUmVjdGFuZ2xlMkQgd2hpY2ggcmVwcmVzZW50cyBQb2x5Z29uIGJvdW5kcy4KLSAgICAgKiBUaGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIHRoZSBzbWFsbGVzdCByZWN0YW5nbGUgd2hpY2ggY29udGFpbnMgCi0gICAgICogdGhlIFBvbHlnb24uCisgICAgICogR2V0cyB0aGUgUmVjdGFuZ2xlMkQgd2hpY2ggcmVwcmVzZW50cyBQb2x5Z29uIGJvdW5kcy4gVGhlIGJvdW5kaW5nCisgICAgICogcmVjdGFuZ2xlIGlzIHRoZSBzbWFsbGVzdCByZWN0YW5nbGUgd2hpY2ggY29udGFpbnMgdGhlIFBvbHlnb24uCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBQb2x5Z29uLgotICAgICAqIAogICAgICAqIEBzZWUgamF2YS5hd3QuU2hhcGUjZ2V0Qm91bmRzMkQoKQogICAgICAqLwogICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRCb3VuZHMyRCgpIHsKQEAgLTI5NiwxMSArMzE1LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVHJhbnNsYXRlcyBhbGwgdmVydGljZXMgb2YgUG9seWdvbiB0aGUgc3BlY2lmaWVkIGRpc3RhbmNlcwotICAgICAqIGFsb25nIFgsIFkgYXhpcy4KKyAgICAgKiBUcmFuc2xhdGVzIGFsbCB2ZXJ0aWNlcyBvZiBQb2x5Z29uIHRoZSBzcGVjaWZpZWQgZGlzdGFuY2VzIGFsb25nIFgsIFkKKyAgICAgKiBheGlzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBteCB0aGUgZGlzdGFuY2UgdG8gdHJhbnNsYXRlIGhvcml6b250YWxseS4KLSAgICAgKiBAcGFyYW0gbXkgdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSB2ZXJ0aWNhbGx5LgorICAgICAqIEBwYXJhbSBteAorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBob3Jpem9udGFsbHkuCisgICAgICogQHBhcmFtIG15CisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgdG8gdHJhbnNsYXRlIHZlcnRpY2FsbHkuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdHJhbnNsYXRlKGludCBteCwgaW50IG15KSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnBvaW50czsgaSsrKSB7CkBAIC0zMTMsNDYgKzMzNCw0NyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcG9pbnQgZ2l2ZW4gYnkgdGhlIGNvb3JkaW5hdGVzIHgsIHkgbGllcyBpbnNpZGUgCisgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBwb2ludCBnaXZlbiBieSB0aGUgY29vcmRpbmF0ZXMgeCwgeSBsaWVzIGluc2lkZQogICAgICAqIHRoZSBQb2x5Z29uLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIGNoZWNrLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIGNoZWNrLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBwb2ludCBsaWVzIGluc2lkZSB0aGUgUG9seWdvbiwKLSAgICAgKiBvdGhlcndpc2UgZmFsc2UuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIGNoZWNrLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgcG9pbnQgbGllcyBpbnNpZGUgdGhlIFBvbHlnb24sIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGNvbnRhaW5zKGludCwgaW50KSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpbnNpZGUoaW50IHgsIGludCB5KSB7Ci0gICAgICAgIHJldHVybiBjb250YWlucygoZG91YmxlKSB4LCAoZG91YmxlKSB5KTsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKChkb3VibGUpeCwgKGRvdWJsZSl5KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHBvaW50IGdpdmVuIGJ5IHRoZSBjb29yZGluYXRlcyB4LCB5IGxpZXMgaW5zaWRlIAorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcG9pbnQgZ2l2ZW4gYnkgdGhlIGNvb3JkaW5hdGVzIHgsIHkgbGllcyBpbnNpZGUKICAgICAgKiB0aGUgUG9seWdvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgcG9pbnQgbGllcyBpbnNpZGUgdGhlIFBvbHlnb24sCi0gICAgICogb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgdG8gY2hlY2suCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIHBvaW50IGxpZXMgaW5zaWRlIHRoZSBQb2x5Z29uLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCB4LCBpbnQgeSkgewotICAgICAgICByZXR1cm4gY29udGFpbnMoKGRvdWJsZSkgeCwgKGRvdWJsZSkgeSk7CisgICAgICAgIHJldHVybiBjb250YWlucygoZG91YmxlKXgsIChkb3VibGUpeSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBwb2ludCB3aXRoIHNwZWNpZmllZCBkb3VibGUgY29vcmRpbmF0ZXMgCi0gICAgICogbGllcyBpbnNpZGUgdGhlIFBvbHlnb24uCisgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBwb2ludCB3aXRoIHNwZWNpZmllZCBkb3VibGUgY29vcmRpbmF0ZXMgbGllcworICAgICAqIGluc2lkZSB0aGUgUG9seWdvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBwb2ludCBnaXZlbiBieSB0aGUgZG91YmxlIGNvb3JkaW5hdGVzIAotICAgICAqIGxpZXMgaW5zaWRlIHRoZSBQb2x5Z29uLCBvdGhlcndpc2UgZmFsc2UuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIGNoZWNrLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBwb2ludCBnaXZlbiBieSB0aGUgZG91YmxlIGNvb3JkaW5hdGVzIGxpZXMgaW5zaWRlCisgICAgICogICAgICAgICB0aGUgUG9seWdvbiwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgamF2YS5hd3QuU2hhcGUjY29udGFpbnMoZG91YmxlLCBkb3VibGUpCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoZG91YmxlIHgsIGRvdWJsZSB5KSB7CkBAIC0zNjAsMTkgKzM4MiwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcmVjdGFuZ2xlIGRldGVybWluZWQgYnkgdGhlIHBhcmFtZXRlcnMgIAotICAgICAqIFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSBsaWVzIGluc2lkZSB0aGUgUG9seWdvbi4KKyAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHJlY3RhbmdsZSBkZXRlcm1pbmVkIGJ5IHRoZSBwYXJhbWV0ZXJzIFt4LCB5LAorICAgICAqIHdpZHRoLCBoZWlnaHRdIGxpZXMgaW5zaWRlIHRoZSBQb2x5Z29uLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZXMncyBsZWZ0IHVwcGVyIAotICAgICAqIGNvcm5lciBhcyBhIGRvdWJsZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGVzJ3MgbGVmdCB1cHBlciAKLSAgICAgKiBjb3JuZXIgYXMgYSBkb3VibGUuCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiByZWN0YW5nbGUgYXMgYSBkb3VibGUuCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlIGFzIGEgZG91YmxlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgbGllcyBpbnNpZGUgdGhlIFBvbHlnb24sCi0gICAgICogb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGVzJ3MgbGVmdCB1cHBlciBjb3JuZXIgYXMgYQorICAgICAqICAgICAgICAgICAgZG91YmxlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGVzJ3MgbGVmdCB1cHBlciBjb3JuZXIgYXMgYQorICAgICAqICAgICAgICAgICAgZG91YmxlLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZSBhcyBhIGRvdWJsZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZSBhcyBhIGRvdWJsZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGxpZXMgaW5zaWRlIHRoZSBQb2x5Z29uLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgamF2YS5hd3QuU2hhcGUjY29udGFpbnMoZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0KSB7CkBAIC0zODEsMjAgKzQwNSwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcmVjdGFuZ2xlIGRldGVybWluZWQgYnkgdGhlIHBhcmFtZXRlcnMgIAotICAgICAqIFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSBpbnRlcnNlY3RzIHRoZSBpbnRlcmlvciBvZgotICAgICAqIHRoZSBQb2x5Z29uLgorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcmVjdGFuZ2xlIGRldGVybWluZWQgYnkgdGhlIHBhcmFtZXRlcnMgW3gsIHksCisgICAgICogd2lkdGgsIGhlaWdodF0gaW50ZXJzZWN0cyB0aGUgaW50ZXJpb3Igb2YgdGhlIFBvbHlnb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlcydzIGxlZnQgdXBwZXIgCi0gICAgICogY29ybmVyIGFzIGEgZG91YmxlLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZXMncyBsZWZ0IHVwcGVyIAotICAgICAqIGNvcm5lciBhcyBhIGRvdWJsZS4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHJlY3RhbmdsZSBhcyBhIGRvdWJsZS4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIGhlaWdodCBvZiByZWN0YW5nbGUgYXMgYSBkb3VibGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBpbnRlcnNlY3RzIHRoZSBpbnRlcmlvciBvZgotICAgICAqIHRoZSBQb2x5Z29uLCBvdGhlcndpc2UgZmFsc2UuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZXMncyBsZWZ0IHVwcGVyIGNvcm5lciBhcyBhCisgICAgICogICAgICAgICAgICBkb3VibGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZXMncyBsZWZ0IHVwcGVyIGNvcm5lciBhcyBhCisgICAgICogICAgICAgICAgICBkb3VibGUuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlIGFzIGEgZG91YmxlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlIGFzIGEgZG91YmxlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgaW50ZXJzZWN0cyB0aGUgaW50ZXJpb3Igb2YgdGhlCisgICAgICogICAgICAgICBQb2x5Z29uLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICogQHNlZSBqYXZhLmF3dC5TaGFwZSNpbnRlcnNlY3RzKGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSkKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3RzKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0KSB7CkBAIC00MDUsMTEgKzQzMCwxMCBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBsaWVzIGluc2lkZSB0aGUgUG9seWdvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVjdCB0aGUgUmVjdGFuZ2xlMkQgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgbGllcyBpbnNpZGUgdGhlIFBvbHlnb24sCi0gICAgICogb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqIAorICAgICAqIEBwYXJhbSByZWN0CisgICAgICogICAgICAgICAgICB0aGUgUmVjdGFuZ2xlMkQgb2JqZWN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgbGllcyBpbnNpZGUgdGhlIFBvbHlnb24sIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICogQHNlZSBqYXZhLmF3dC5TaGFwZSNjb250YWlucyhqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEKQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFJlY3RhbmdsZTJEIHJlY3QpIHsKQEAgLTQxOSwxMCArNDQzLDEwIEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgUG9pbnQgbGllcyBpbnNpZGUgdGhlIFBvbHlnb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHBvaW50IHRoZSBQb2ludCBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIFBvaW50IGxpZXMgaW5zaWRlIHRoZSBQb2x5Z29uLAotICAgICAqIG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKiBAcGFyYW0gcG9pbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBQb2ludCBvYmplY3QuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIFBvaW50IGxpZXMgaW5zaWRlIHRoZSBQb2x5Z29uLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFBvaW50IHBvaW50KSB7CiAgICAgICAgIHJldHVybiBjb250YWlucyhwb2ludC5nZXRYKCksIHBvaW50LmdldFkoKSk7CkBAIC00MzEsMTEgKzQ1NSwxMCBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIFBvaW50MkQgbGllcyBpbnNpZGUgdGhlIFBvbHlnb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHBvaW50IHRoZSBQb2ludDJEIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgUG9pbnQyRCBsaWVzIGluc2lkZSB0aGUgUG9seWdvbiwKLSAgICAgKiBvdGhlcndpc2UgZmFsc2UuCi0gICAgICogCisgICAgICogQHBhcmFtIHBvaW50CisgICAgICogICAgICAgICAgICB0aGUgUG9pbnQyRCBvYmplY3QuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIFBvaW50MkQgbGllcyBpbnNpZGUgdGhlIFBvbHlnb24sIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICogQHNlZSBqYXZhLmF3dC5TaGFwZSNjb250YWlucyhqYXZhLmF3dC5nZW9tLlBvaW50MkQpCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoUG9pbnQyRCBwb2ludCkgewpAQCAtNDQzLDE0ICs0NjYsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIGludGVyaW9yIG9mIHJlY3RhbmdsZSBzcGVjaWZpZWQgYnkgCi0gICAgICogdGhlIFJlY3RhbmdsZTJEIG9iamVjdCBpbnRlcnNlY3RzIHRoZSBpbnRlcmlvciBvZiB0aGUgUG9seWdvbi4KKyAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIGludGVyaW9yIG9mIHJlY3RhbmdsZSBzcGVjaWZpZWQgYnkgdGhlCisgICAgICogUmVjdGFuZ2xlMkQgb2JqZWN0IGludGVyc2VjdHMgdGhlIGludGVyaW9yIG9mIHRoZSBQb2x5Z29uLgogICAgICAqIAotICAgICAqIEBwYXJhbSByZWN0IHRoZSBSZWN0YW5nbGUyRCBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgUmVjdGFuZ2xlMkQgaW50ZXJzZWN0cyB0aGUgaW50ZXJpb3Igb2YKLSAgICAgKiB0aGUgUG9seWdvbiwgb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqIAorICAgICAqIEBwYXJhbSByZWN0CisgICAgICogICAgICAgICAgICB0aGUgUmVjdGFuZ2xlMkQgb2JqZWN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIFJlY3RhbmdsZTJEIGludGVyc2VjdHMgdGhlIGludGVyaW9yIG9mIHRoZSBQb2x5Z29uLAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgamF2YS5hd3QuU2hhcGUjaW50ZXJzZWN0cyhqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEKQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGludGVyc2VjdHMoUmVjdGFuZ2xlMkQgcmVjdCkgewpAQCAtNDU4LDEzICs0ODAsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBQYXRoSXRlcmF0b3Igb2JqZWN0IHdoaWNoIGdpdmVzIHRoZSBjb29yZGluYXRlcyBvZiAKLSAgICAgKiB0aGUgcG9seWdvbiwgdHJhbnNmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgQWZmaW5lVHJhbnNmb3JtLgorICAgICAqIEdldHMgdGhlIFBhdGhJdGVyYXRvciBvYmplY3Qgd2hpY2ggZ2l2ZXMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2x5Z29uLAorICAgICAqIHRyYW5zZm9ybWVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIEFmZmluZVRyYW5zZm9ybS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdCB0aGUgc3BlY2lmaWVkIEFmZmluZVRyYW5zZm9ybSBvYmplY3QsIG9yIG51bGwuCi0gICAgICogCisgICAgICogQHBhcmFtIHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgQWZmaW5lVHJhbnNmb3JtIG9iamVjdCBvciBudWxsLgogICAgICAqIEByZXR1cm4gUGF0aEl0ZXJhdG9yIG9iamVjdCBmb3IgdGhlIFBvbHlnb24uCi0gICAgICogCiAgICAgICogQHNlZSBqYXZhLmF3dC5TaGFwZSNnZXRQYXRoSXRlcmF0b3IoamF2YS5hd3QuZ2VvbS5BZmZpbmVUcmFuc2Zvcm0pCiAgICAgICovCiAgICAgcHVibGljIFBhdGhJdGVyYXRvciBnZXRQYXRoSXRlcmF0b3IoQWZmaW5lVHJhbnNmb3JtIHQpIHsKQEAgLTQ3MiwyMyArNDkzLDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgUGF0aEl0ZXJhdG9yIG9iamVjdCB3aGljaCBnaXZlcyB0aGUgY29vcmRpbmF0ZXMgb2YgCi0gICAgICogdGhlIHBvbHlnb24sIHRyYW5zZm9ybWVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIEFmZmluZVRyYW5zZm9ybS4KLSAgICAgKiBUaGUgZmxhdG5lc3MgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCisgICAgICogR2V0cyB0aGUgUGF0aEl0ZXJhdG9yIG9iamVjdCB3aGljaCBnaXZlcyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHBvbHlnb24sCisgICAgICogdHJhbnNmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgQWZmaW5lVHJhbnNmb3JtLiBUaGUgZmxhdG5lc3MKKyAgICAgKiBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdCB0aGUgc3BlY2lmaWVkIEFmZmluZVRyYW5zZm9ybSBvYmplY3QsIG9yIG51bGwuCi0gICAgICogQHBhcmFtIGZsYXRuZXNzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aGUgY29udHJvbCBwb2ludHMgZm9yIAotICAgICAqIGEgZ2l2ZW4gY3VydmUgd2hpY2ggdmFyaWVzIGZyb20gY29saW5lYXIgYmVmb3JlIGEgc3ViZGl2aWRlZCBjdXJ2ZSAKLSAgICAgKiBpcyByZXBsYWNlZCBieSBhIHN0cmFpZ2h0IGxpbmUgY29ubmVjdGluZyB0aGUgZW5kcG9pbnRzLiAKLSAgICAgKiBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGZvciB0aGUgUG9seWdvbiBjbGFzcy4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gdAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0gb2JqZWN0IG9yIG51bGwuCisgICAgICogQHBhcmFtIGZsYXRuZXNzCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGhlIGNvbnRyb2wgcG9pbnRzIGZvciBhIGdpdmVuIGN1cnZlCisgICAgICogICAgICAgICAgICB3aGljaCB2YXJpZXMgZnJvbSBjb2xpbmVhciBiZWZvcmUgYSBzdWJkaXZpZGVkIGN1cnZlIGlzCisgICAgICogICAgICAgICAgICByZXBsYWNlZCBieSBhIHN0cmFpZ2h0IGxpbmUgY29ubmVjdGluZyB0aGUgZW5kcG9pbnRzLiBUaGlzCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgaXMgaWdub3JlZCBmb3IgdGhlIFBvbHlnb24gY2xhc3MuCiAgICAgICogQHJldHVybiBQYXRoSXRlcmF0b3Igb2JqZWN0IGZvciB0aGUgUG9seWdvbi4KLSAgICAgKiAgCi0gICAgICogQHNlZSBqYXZhLmF3dC5TaGFwZSNnZXRQYXRoSXRlcmF0b3IoamF2YS5hd3QuZ2VvbS5BZmZpbmVUcmFuc2Zvcm0sIGRvdWJsZSkKKyAgICAgKiBAc2VlIGphdmEuYXd0LlNoYXBlI2dldFBhdGhJdGVyYXRvcihqYXZhLmF3dC5nZW9tLkFmZmluZVRyYW5zZm9ybSwKKyAgICAgKiAgICAgIGRvdWJsZSkKICAgICAgKi8KICAgICBwdWJsaWMgUGF0aEl0ZXJhdG9yIGdldFBhdGhJdGVyYXRvcihBZmZpbmVUcmFuc2Zvcm0gdCwgZG91YmxlIGZsYXRuZXNzKSB7CiAgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IodCwgdGhpcyk7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9SZWN0YW5nbGUuamF2YSBiL2F3dC9qYXZhL2F3dC9SZWN0YW5nbGUuamF2YQppbmRleCA4NmM0ZGZjLi5kOGViYjNhIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvUmVjdGFuZ2xlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L1JlY3RhbmdsZS5qYXZhCkBAIC0xOCwzNiArMTgsNDggQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRDsKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIAogLyoqCi0gKiBUaGUgUmVjdGFuZ2xlIGNsYXNzIGRlZmluZXMgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgaW4gdGVybXMgb2YgaXRzCi0gKiB1cHBlciBsZWZ0IGNvcm5lciBjb29yZGluYXRlcyBbeCx5XSwgaXRzIHdpZHRoLCBhbmQgaXRzIGhlaWdodC4gIAotICogQSBSZWN0YW5nbGUgc3BlY2lmaWVkIGJ5IFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSBwYXJhbWV0ZXJzIGhhcyBhbiAKLSAqIG91dGxpbmUgcGF0aCB3aXRoIGNvcm5lcnMgYXQgW3gsIHldLCBbeCArIHdpZHRoLHldLCBbeCArIHdpZHRoLHkgKyBoZWlnaHRdLCAKLSAqIGFuZCBbeCwgeSArIGhlaWdodF0uIAotICogPGJyPjxicj4KLSAqIFRoZSByZWN0YW5nbGUgaXMgZW1wdHkgaWYgdGhlIHdpZHRoIG9yIGhlaWdodCBpcyBuZWdhdGl2ZSBvciB6ZXJvLiAKLSAqIEluIHRoaXMgY2FzZSB0aGUgaXNFbXB0eSBtZXRob2QgcmV0dXJucyB0cnVlLgorICogVGhlIFJlY3RhbmdsZSBjbGFzcyBkZWZpbmVzIHRoZSByZWN0YW5ndWxhciBhcmVhIGluIHRlcm1zIG9mIGl0cyB1cHBlciBsZWZ0CisgKiBjb3JuZXIgY29vcmRpbmF0ZXMgW3gseV0sIGl0cyB3aWR0aCwgYW5kIGl0cyBoZWlnaHQuIEEgUmVjdGFuZ2xlIHNwZWNpZmllZCBieQorICogW3gsIHksIHdpZHRoLCBoZWlnaHRdIHBhcmFtZXRlcnMgaGFzIGFuIG91dGxpbmUgcGF0aCB3aXRoIGNvcm5lcnMgYXQgW3gsIHldLAorICogW3ggKyB3aWR0aCx5XSwgW3ggKyB3aWR0aCx5ICsgaGVpZ2h0XSwgYW5kIFt4LCB5ICsgaGVpZ2h0XS4gPGJyPgorICogPGJyPgorICogVGhlIHJlY3RhbmdsZSBpcyBlbXB0eSBpZiB0aGUgd2lkdGggb3IgaGVpZ2h0IGlzIG5lZ2F0aXZlIG9yIHplcm8uIEluIHRoaXMKKyAqIGNhc2UgdGhlIGlzRW1wdHkgbWV0aG9kIHJldHVybnMgdHJ1ZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBSZWN0YW5nbGUgZXh0ZW5kcyBSZWN0YW5nbGUyRCBpbXBsZW1lbnRzIFNoYXBlLCBTZXJpYWxpemFibGUgewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00MzQ1ODU3MDcwMjU1Njc0NzY0TDsKIAotICAgIC8qKiBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyBsZWZ0IHVwcGVyIGNvcm5lci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyBsZWZ0IHVwcGVyIGNvcm5lci4KKyAgICAgKi8KICAgICBwdWJsaWMgaW50IHg7Ci0gICAgCi0gICAgLyoqIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIGxlZnQgdXBwZXIgY29ybmVyLiAqLworCisgICAgLyoqCisgICAgICogVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgbGVmdCB1cHBlciBjb3JuZXIuCisgICAgICovCiAgICAgcHVibGljIGludCB5OwotICAgIAotICAgIC8qKiBUaGUgd2lkdGggb2YgcmVjdGFuZ2xlLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KKyAgICAgKi8KICAgICBwdWJsaWMgaW50IHdpZHRoOwotICAgIAotICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlLgorICAgICAqLwogICAgIHB1YmxpYyBpbnQgaGVpZ2h0OwogCiAgICAgLyoqCkBAIC02MCw3MyArNzIsODIgQEAKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyByZWN0YW5nbGUgd2hvc2UgdXBwZXIgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZXMgYXJlCi0gICAgICogZ2l2ZW4gYnkgdGhlIFBvaW50IG9iamVjdCAocC5YIGFuZCBwLlkpLCBhbmQgdGhlIHdpZHRoIGFuZCAKLSAgICAgKiB0aGUgaGVpZ2h0IGFyZSB6ZXJvLiAKKyAgICAgKiBnaXZlbiBieSB0aGUgUG9pbnQgb2JqZWN0IChwLlggYW5kIHAuWSksIGFuZCB0aGUgd2lkdGggYW5kIHRoZSBoZWlnaHQgYXJlCisgICAgICogemVyby4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgUG9pbnQgc3BlY2lmaWVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBjb29yZGluYXRlcyBvZiAKLSAgICAgKiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgUG9pbnQgc3BlY2lmaWVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBjb29yZGluYXRlcyBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgIHJlY3RhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgUmVjdGFuZ2xlKFBvaW50IHApIHsKICAgICAgICAgc2V0Qm91bmRzKHAueCwgcC55LCAwLCAwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHJlY3RhbmdsZSB3aG9zZSB1cHBlciBsZWZ0IGNvcm5lciBjb29yZGluYXRlcyBhcmUKLSAgICAgKiBnaXZlbiBieSB0aGUgUG9pbnQgb2JqZWN0IChwLlggYW5kIHAuWSksIGFuZCB0aGUgd2lkdGggYW5kIHRoZSBoZWlnaHQKLSAgICAgKiBhcmUgZ2l2ZW4gYnkgRGltZW5zaW9uIG9iamVjdCAoZC53aWR0aCBhbmQgZC5oZWlnaHQpLiAKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcmVjdGFuZ2xlIHdob3NlIHVwcGVyIGxlZnQgY29ybmVyIGNvb3JkaW5hdGVzIGFyZQorICAgICAqIGdpdmVuIGJ5IHRoZSBQb2ludCBvYmplY3QgKHAuWCBhbmQgcC5ZKSwgYW5kIHRoZSB3aWR0aCBhbmQgdGhlIGhlaWdodCBhcmUKKyAgICAgKiBnaXZlbiBieSBEaW1lbnNpb24gb2JqZWN0IChkLndpZHRoIGFuZCBkLmhlaWdodCkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHAgdGhlIFBvaW50IHNwZWNpZmllcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZXMgb2YgCi0gICAgICogdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gZCB0aGUgRGltZW50aW9uIHNwZWNpZmllcyB0aGUgd2lkdGggYW5kIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4gCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2ludCBzcGVjaWZpZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIGNvb3JkaW5hdGVzIG9mIHRoZQorICAgICAqICAgICAgICAgICAgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBkCisgICAgICogICAgICAgICAgICB0aGUgZGltZW5zaW9uIHNwZWNpZmllcyB0aGUgd2lkdGggYW5kIHRoZSBoZWlnaHQgb2YgdGhlCisgICAgICogICAgICAgICAgICByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIFJlY3RhbmdsZShQb2ludCBwLCBEaW1lbnNpb24gZCkgewogICAgICAgICBzZXRCb3VuZHMocC54LCBwLnksIGQud2lkdGgsIGQuaGVpZ2h0KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcmVjdGFuZ2xlIGRldGVybWluZWQgYnkgdGhlIHVwcGVyIGxlZnQgY29ybmVyIAorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyByZWN0YW5nbGUgZGV0ZXJtaW5lZCBieSB0aGUgdXBwZXIgbGVmdCBjb3JuZXIKICAgICAgKiBjb29yZGluYXRlcyAoeCwgeSksIHdpZHRoIGFuZCBoZWlnaHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggdXBwZXIgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIHVwcGVyIGxlZnQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlLiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggdXBwZXIgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSB1cHBlciBsZWZ0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyBSZWN0YW5nbGUoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgICAgICAgc2V0Qm91bmRzKHgsIHksIHdpZHRoLCBoZWlnaHQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyByZWN0YW5nbGUgd2l0aCBbMCwgMF0gYXMgaXRzIHVwcGVyIGxlZnQgCi0gICAgICogY29ybmVyIGNvb3JkaW5hdGVzIGFuZCB0aGUgc3BlY2lmaWVkIHdpZHRoIGFuZCBoZWlnaHQuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHJlY3RhbmdsZSB3aXRoIFswLCAwXSBhcyBpdHMgdXBwZXIgbGVmdCBjb3JuZXIKKyAgICAgKiBjb29yZGluYXRlcyBhbmQgdGhlIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuIAorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgUmVjdGFuZ2xlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICBzZXRCb3VuZHMoMCwgMCwgd2lkdGgsIGhlaWdodCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHJlY3RhbmdsZSB3aXRoIHRoZSBzYW1lIGNvb3JkaW5hdGVzIAotICAgICAqIGFzIHRoZSBnaXZlbiBzb3VyY2UgcmVjdGFuZ2xlLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyByZWN0YW5nbGUgd2l0aCB0aGUgc2FtZSBjb29yZGluYXRlcyBhcyB0aGUgZ2l2ZW4KKyAgICAgKiBzb3VyY2UgcmVjdGFuZ2xlLgogICAgICAqIAotICAgICAqIEBwYXJhbSByIHRoZSBSZWN0YW5nbGUgb2JqZWN0IHdoaWNoIHBhcmFtZXRlcnMgd2lsbCBiZSB1c2VkIGZvciAKLSAgICAgKiBpbnN0YW50aWF0aW5nIGEgbmV3IFJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIFJlY3RhbmdsZSBvYmplY3Qgd2hpY2ggcGFyYW1ldGVycyB3aWxsIGJlIHVzZWQgZm9yCisgICAgICogICAgICAgICAgICBpbnN0YW50aWF0aW5nIGEgbmV3IFJlY3RhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgUmVjdGFuZ2xlKFJlY3RhbmdsZSByKSB7CiAgICAgICAgIHNldEJvdW5kcyhyLngsIHIueSwgci53aWR0aCwgci5oZWlnaHQpOwogICAgIH0KLS8qCi0gICAgcHVibGljIFJlY3RhbmdsZShEaW1lbnNpb24gZCkgewotICAgICAgICBzZXRCb3VuZHMoMCwgMCwgZC53aWR0aCwgZC5oZWlnaHQpOwotICAgIH0KLSovCisKKyAgICAvKgorICAgICAqIHB1YmxpYyBSZWN0YW5nbGUoRGltZW5zaW9uIGQpIHsgc2V0Qm91bmRzKDAsIDAsIGQud2lkdGgsIGQuaGVpZ2h0KTsgfQorICAgICAqLwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIFggY29vcmRpbmF0ZSBvZiBib3VuZCBhcyBhIGRvdWJsZS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBYIGNvb3JkaW5hdGUgb2YgYm91bmQgYXMgYSBkb3VibGUuCi0gICAgICogICAKICAgICAgKiBAc2VlIGphdmEuYXd0Lmdlb20uUmVjdGFuZ3VsYXJTaGFwZSNnZXRYKCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTEzOCw3ICsxNTksNiBAQAogICAgICAqIEdldHMgdGhlIFkgY29vcmRpbmF0ZSBvZiBib3VuZCBhcyBhIGRvdWJsZS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBZIGNvb3JkaW5hdGUgb2YgYm91bmQgYXMgYSBkb3VibGUuCi0gICAgICogCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlJlY3Rhbmd1bGFyU2hhcGUjZ2V0WSgpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC0xNDksOCArMTY5LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBhcyBhIGRvdWJsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBhcyBhIGRvdWJsZS4gCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgYXMgYSBkb3VibGUuCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlJlY3Rhbmd1bGFyU2hhcGUjZ2V0SGVpZ2h0KCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTE2Miw3ICsxODEsNiBAQAogICAgICAqIEdldHMgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgYXMgYSBkb3VibGUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSBhcyBhIGRvdWJsZS4KLSAgICAgKiAgCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlJlY3Rhbmd1bGFyU2hhcGUjZ2V0V2lkdGgoKQogICAgICAqLwogICAgIEBPdmVycmlkZQpAQCAtMTcxLDExICsxODksMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSByZWN0YW5nbGUgaXMgZW1wdHkuIFRoZSByZWN0YW5nbGUgaXMgZW1wdHkgaWYgCi0gICAgICogaXRzIHdpZHRoIG9yIGhlaWdodCBpcyBuZWdhdGl2ZSBvciB6ZXJvLgorICAgICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHJlY3RhbmdsZSBpcyBlbXB0eS4gVGhlIHJlY3RhbmdsZSBpcyBlbXB0eQorICAgICAqIGlmIGl0cyB3aWR0aCBvciBoZWlnaHQgaXMgbmVnYXRpdmUgb3IgemVyby4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSByZWN0YW5nbGUgaXMgZW1wdHksIG90aGVyd2lzZSBmYWxzZS4KLSAgICAgKiAKICAgICAgKiBAc2VlIGphdmEuYXd0Lmdlb20uUmVjdGFuZ3VsYXJTaGFwZSNpc0VtcHR5KCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTE4NCw5ICsyMDEsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNpemUgb2YgYSBSZWN0YW5nbGUgYXMgRGltZW50aW9uIG9iamVjdC4KKyAgICAgKiBHZXRzIHRoZSBzaXplIG9mIGEgUmVjdGFuZ2xlIGFzIERpbWVuc2lvbiBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIERpbWVudGlvbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBzaXplIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHJldHVybiBhIERpbWVuc2lvbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBzaXplIG9mIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIERpbWVuc2lvbiBnZXRTaXplKCkgewogICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KTsKQEAgLTE5NSw4ICsyMTIsMTAgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBSZWN0YW5nbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSBuZXcgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4gCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgbmV3IGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOwpAQCAtMjA2LDcgKzIyNSw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgc2l6ZSBvZiBhIFJlY3RhbmdsZSBzcGVjaWZpZWQgYXMgRGltZW5zaW9uIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZCBhIERpbWVuc2lvbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBuZXcgc2l6ZSBvZiBhIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gZAorICAgICAqICAgICAgICAgICAgYSBEaW1lbnNpb24gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgbmV3IHNpemUgb2YgYSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2l6ZShEaW1lbnNpb24gZCkgewogICAgICAgICBzZXRTaXplKGQud2lkdGgsIGQuaGVpZ2h0KTsKQEAgLTIxNSwxOSArMjM1LDIxIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbG9jYXRpb24gb2YgYSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lciBhcyBhIFBvaW50IG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBQb2ludCBvYmplY3Qgd2l0aCBjb29yZGluYXRlcyBlcXVhbCB0byB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgCi0gICAgICogb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBQb2ludCBvYmplY3Qgd2l0aCBjb29yZGluYXRlcyBlcXVhbCB0byB0aGUgdXBwZXIgbGVmdCBjb3JuZXIKKyAgICAgKiAgICAgICAgIG9mIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIFBvaW50IGdldExvY2F0aW9uKCkgewogICAgICAgICByZXR1cm4gbmV3IFBvaW50KHgsIHkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSByZWN0YW5nbGUgaW4gdGVybXMgb2YgaXRzIHVwcGVyIGxlZnQgCi0gICAgICogY29ybmVyIGNvb3JkaW5hdGVzIFggYW5kIFkuCisgICAgICogU2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlY3RhbmdsZSBpbiB0ZXJtcyBvZiBpdHMgdXBwZXIgbGVmdCBjb3JuZXIKKyAgICAgKiBjb29yZGluYXRlcyBYIGFuZCBZLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oaW50IHgsIGludCB5KSB7CiAgICAgICAgIHRoaXMueCA9IHg7CkBAIC0yMzUsMjMgKzI1NywyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxvY2F0aW9uIG9mIGEgcmVjdGFuZ2xlIHVzaW5nIGEgUG9pbnQgb2JqZWN0IHRvIGdpdmUgdGhlIAorICAgICAqIFNldHMgdGhlIGxvY2F0aW9uIG9mIGEgcmVjdGFuZ2xlIHVzaW5nIGEgUG9pbnQgb2JqZWN0IHRvIGdpdmUgdGhlCiAgICAgICogY29vcmRpbmF0ZXMgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIHRoZSBQb2ludCBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgbmV3IHVwcGVyIGxlZnQgY29ybmVyIAotICAgICAqIGNvb3JkaW5hdGVzIG9mIHJlY3RhbmdsZS4gIAorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgUG9pbnQgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIG5ldyB1cHBlciBsZWZ0IGNvcm5lcgorICAgICAqICAgICAgICAgICAgY29vcmRpbmF0ZXMgb2YgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFBvaW50IHApIHsKICAgICAgICAgc2V0TG9jYXRpb24ocC54LCBwLnkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIE1vdmVzIGEgcmVjdGFuZ2xlIHRvIHRoZSBuZXcgbG9jYXRpb24gYnkgbW92aW5nIGl0cyB1cHBlciBsZWZ0IGNvcm5lcgotICAgICAqIHRvIHRoZSBwb2ludCB3aXRoIGNvb3JkaW5hdGVzIFggYW5kIFkuCisgICAgICogTW92ZXMgYSByZWN0YW5nbGUgdG8gdGhlIG5ldyBsb2NhdGlvbiBieSBtb3ZpbmcgaXRzIHVwcGVyIGxlZnQgY29ybmVyIHRvCisgICAgICogdGhlIHBvaW50IHdpdGggY29vcmRpbmF0ZXMgWCBhbmQgWS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgbmV3IFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCi0gICAgICogQHBhcmFtIHkgdGhlIG5ldyBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgbmV3IFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KICAgICAgKiBAZGVwcmVjYXRlZCBVc2Ugc2V0TG9jYXRpb24oaW50LCBpbnQpIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMjYwLDE2ICsyODQsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByZWN0YW5nbGUgdG8gYmUgdGhlIG5lYXJlc3QgcmVjdGFuZ2xlIHdpdGggaW50ZWdlciBjb29yZGluYXRlcyAKKyAgICAgKiBTZXRzIHRoZSByZWN0YW5nbGUgdG8gYmUgdGhlIG5lYXJlc3QgcmVjdGFuZ2xlIHdpdGggaW50ZWdlciBjb29yZGluYXRlcwogICAgICAqIGJvdW5kaW5nIHRoZSByZWN0YW5nbGUgZGVmaW5lZCBieSB0aGUgZG91YmxlLXZhbHVlZCBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBkb3VibGUtdmFsdWVkCi0gICAgICogcmVjdGFuZ2xlIHRvIGJlIGJvdW5kZWQuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGRvdWJsZS12YWx1ZWQKLSAgICAgKiByZWN0YW5nbGUgdG8gYmUgYm91bmRlZC4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgdG8gYmUgYm91bmRlZC4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB0byBiZSBib3VuZGVkLiAgICAgIAotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZG91YmxlLXZhbHVlZAorICAgICAqICAgICAgICAgICAgcmVjdGFuZ2xlIHRvIGJlIGJvdW5kZWQuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBkb3VibGUtdmFsdWVkCisgICAgICogICAgICAgICAgICByZWN0YW5nbGUgdG8gYmUgYm91bmRlZC4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRvIGJlIGJvdW5kZWQuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIHRvIGJlIGJvdW5kZWQuCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEI3NldFJlY3QoZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKQogICAgICAqLwogICAgIEBPdmVycmlkZQpAQCAtMjg0LDkgKzMxMSwxMCBAQAogICAgIC8qKgogICAgICAqIFNldHMgYSBuZXcgc2l6ZSBmb3IgdGhlIHJlY3RhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHJlY3RhbmdsZSdzIG5ldyB3aWR0aC4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSByZWN0YW5nbGUncyBuZXcgaGVpZ2h0LgotICAgICAqIAorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHJlY3RhbmdsZSdzIG5ldyB3aWR0aC4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgcmVjdGFuZ2xlJ3MgbmV3IGhlaWdodC4KICAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHNldFNpemUoaW50LCBpbnQpIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMjk1LDE0ICszMjMsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIGJvdW5kcyBvZiBhIHJlY3RhbmdsZSB0byB0aGUgc3BlY2lmaWVkIHgsIHksIHdpZHRoIGFuZCBoZWlnaHQgCisgICAgICogUmVzZXRzIHRoZSBib3VuZHMgb2YgYSByZWN0YW5nbGUgdG8gdGhlIHNwZWNpZmllZCB4LCB5LCB3aWR0aCBhbmQgaGVpZ2h0CiAgICAgICogcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgbmV3IFggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIuCi0gICAgICogQHBhcmFtIHkgdGhlIG5ldyBZIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgbmV3IHdpZHRoIG9mIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBuZXcgaGVpZ2h0IG9mIHJlY3RhbmdsZS4gCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgWCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBZIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB3aWR0aCBvZiByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBoZWlnaHQgb2YgcmVjdGFuZ2xlLgogICAgICAqIEBkZXByZWNhdGVkIHVzZSBzZXRCb3VuZHMoaW50LCBpbnQsIGludCwgaW50KSBtZXRob2QKICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMzEyLDEwICszNDMsOSBAQAogCiAgICAgLyoqCiAgICAgICogR2V0cyBib3VuZHMgb2YgdGhlIHJlY3RhbmdsZSBhcyBhIG5ldyBSZWN0YW5nbGUgb2JqZWN0LgotICAgICAqICAKLSAgICAgKiBAcmV0dXJuIHRoZSBSZWN0YW5nbGUgb2JqZWN0IHdpdGggdGhlIHNhbWUgYm91bmRzIGFzIAotICAgICAqIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUuIAogICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIFJlY3RhbmdsZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBib3VuZHMgYXMgdGhlIG9yaWdpbmFsCisgICAgICogICAgICAgICByZWN0YW5nbGUuCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlJlY3Rhbmd1bGFyU2hhcGUjZ2V0Qm91bmRzKCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTMyNSwxMCArMzU1LDkgQEAKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGJvdW5kcyBvZiB0aGUgb3JpZ2luYWwgcmVjdGFuZ2xlIGFzIGEgUmVjdGFuZ2xlMkQgb2JqZWN0LgotICAgICAqICAKLSAgICAgKiBAcmV0dXJuIHRoZSBSZWN0YW5nbGUyRCBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgYm91bmRzIG9mIAotICAgICAqIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUuIAogICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIFJlY3RhbmdsZTJEIG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBib3VuZHMgb2YgdGhlCisgICAgICogICAgICAgICBvcmlnaW5hbCByZWN0YW5nbGUuCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEI2dldEJvdW5kczJEKCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTMzNywxMyArMzY2LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgYm91bmRzIG9mIGEgcmVjdGFuZ2xlIHRvIHRoZSBzcGVjaWZpZWQgeCwgeSwgd2lkdGgsIGFuZCBoZWlnaHQgCisgICAgICogU2V0cyB0aGUgYm91bmRzIG9mIGEgcmVjdGFuZ2xlIHRvIHRoZSBzcGVjaWZpZWQgeCwgeSwgd2lkdGgsIGFuZCBoZWlnaHQKICAgICAgKiBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEJvdW5kcyhpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICB0aGlzLnggPSB4OwpAQCAtMzUzLDI1ICszODYsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBib3VuZHMgb2YgdGhlIHJlY3RhbmdsZSB0byBtYXRjaCB0aGUgYm91bmRzIG9mIHRoZQotICAgICAqIFJlY3RhbmdsZSBvYmplY3Qgc2VudCBhcyBhIHBhcmFtZXRlci4KKyAgICAgKiBTZXRzIHRoZSBib3VuZHMgb2YgdGhlIHJlY3RhbmdsZSB0byBtYXRjaCB0aGUgYm91bmRzIG9mIHRoZSBSZWN0YW5nbGUKKyAgICAgKiBvYmplY3Qgc2VudCBhcyBhIHBhcmFtZXRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gciB0aGUgUmVjdGFuZ2xlIG9iamVjdCB3aGljaCBzcGVjaWZpZXMgdGhlIG5ldyBib3VuZHMuIAorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgUmVjdGFuZ2xlIG9iamVjdCB3aGljaCBzcGVjaWZpZXMgdGhlIG5ldyBib3VuZHMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Qm91bmRzKFJlY3RhbmdsZSByKSB7CiAgICAgICAgIHNldEJvdW5kcyhyLngsIHIueSwgci53aWR0aCwgci5oZWlnaHQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVubGFyZ2VzIHRoZSByZWN0YW5nbGUgYnkgbW92aW5nIGVhY2ggY29ybmVyIG91dHdhcmQgZnJvbSB0aGUgCi0gICAgICogY2VudGVyIGJ5IGEgZGlzdGFuY2Ugb2YgZHggaG9yaXpvbmFsbHkgYW5kIGEgZGlzdGFuY2Ugb2YgZHkgCi0gICAgICogdmVydGljYWxseS4gU3BlY2lmaWNhbGx5LCBjaGFuZ2VzIGEgcmVjdGFuZ2xlIHdpdGggCi0gICAgICogW3gsIHksIHdpZHRoLCBoZWlnaHRdIHBhcmFtZXRlcnMgdG8gCi0gICAgICogYSByZWN0YW5nbGUgd2l0aCBbeC1keCwgeS1keSwgd2lkdGgrMipkeCwgaGVpZ2h0KzIqZHldCi0gICAgICogcGFyYW1ldGVycy4gCi0gICAgICogICAKLSAgICAgKiBAcGFyYW0gZHggdGhlIGhvcml6b250YWwgZGlzdGFuY2UgdG8gbW92ZSBlYWNoIGNvcm5lciBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSBkeSB0aGUgdmVydGljYWwgZGlzdGFuY2UgdG8gbW92ZSBlYWNoIGNvcm5lciBjb29yZGluYXRlLgorICAgICAqIEVubGFyZ2VzIHRoZSByZWN0YW5nbGUgYnkgbW92aW5nIGVhY2ggY29ybmVyIG91dHdhcmQgZnJvbSB0aGUgY2VudGVyIGJ5IGEKKyAgICAgKiBkaXN0YW5jZSBvZiBkeCBob3Jpem9uYWxseSBhbmQgYSBkaXN0YW5jZSBvZiBkeSB2ZXJ0aWNhbGx5LiBTcGVjaWZpY2FsbHksCisgICAgICogY2hhbmdlcyBhIHJlY3RhbmdsZSB3aXRoIFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSBwYXJhbWV0ZXJzIHRvIGEgcmVjdGFuZ2xlCisgICAgICogd2l0aCBbeC1keCwgeS1keSwgd2lkdGgrMipkeCwgaGVpZ2h0KzIqZHldIHBhcmFtZXRlcnMuCisgICAgICogCisgICAgICogQHBhcmFtIGR4CisgICAgICogICAgICAgICAgICB0aGUgaG9yaXpvbnRhbCBkaXN0YW5jZSB0byBtb3ZlIGVhY2ggY29ybmVyIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIGR5CisgICAgICogICAgICAgICAgICB0aGUgdmVydGljYWwgZGlzdGFuY2UgdG8gbW92ZSBlYWNoIGNvcm5lciBjb29yZGluYXRlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdyb3coaW50IGR4LCBpbnQgZHkpIHsKICAgICAgICAgeCAtPSBkeDsKQEAgLTM4MSwxMSArNDE1LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTW92ZXMgYSByZWN0YW5nbGUgYSBkaXN0YW5jZSBvZiBteCBhbG9uZyB0aGUgeCBjb29yZGluYXRlIGF4aXMgCi0gICAgICogYW5kIGEgZGlzdGFuY2Ugb2YgbXkgYWxvbmcgeSBjb29yZGluYXRlIGF4aXMuCisgICAgICogTW92ZXMgYSByZWN0YW5nbGUgYSBkaXN0YW5jZSBvZiBteCBhbG9uZyB0aGUgeCBjb29yZGluYXRlIGF4aXMgYW5kIGEKKyAgICAgKiBkaXN0YW5jZSBvZiBteSBhbG9uZyB5IGNvb3JkaW5hdGUgYXhpcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbXggdGhlIGhvcml6b250YWwgdHJhbnNsYXRpb24gaW5jcmVtZW50LgotICAgICAqIEBwYXJhbSBteSB0aGUgdmVydGljYWwgdHJhbnNsYXRpb24gaW5jcmVtZW50LgorICAgICAqIEBwYXJhbSBteAorICAgICAqICAgICAgICAgICAgdGhlIGhvcml6b250YWwgdHJhbnNsYXRpb24gaW5jcmVtZW50LgorICAgICAqIEBwYXJhbSBteQorICAgICAqICAgICAgICAgICAgdGhlIHZlcnRpY2FsIHRyYW5zbGF0aW9uIGluY3JlbWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0cmFuc2xhdGUoaW50IG14LCBpbnQgbXkpIHsKICAgICAgICAgeCArPSBteDsKQEAgLTM5NSw4ICs0MzEsMTIgQEAKICAgICAvKioKICAgICAgKiBFbmxhcmdlcyB0aGUgcmVjdGFuZ2xlIHRvIGNvdmVyIHRoZSBzcGVjaWZpZWQgcG9pbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBwb2ludCB0byBiZSBjb3ZlcmVkIGJ5IHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBwb2ludCB0byBiZSBjb3ZlcmVkIGJ5IHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBuZXcgcG9pbnQgdG8gYmUgY292ZXJlZCBieSB0aGUKKyAgICAgKiAgICAgICAgICAgIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gcHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBwb2ludCB0byBiZSBjb3ZlcmVkIGJ5IHRoZQorICAgICAqICAgICAgICAgICAgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgcHgsIGludCBweSkgewogICAgICAgICBpbnQgeDEgPSBNYXRoLm1pbih4LCBweCk7CkBAIC00MDcsMTEgKzQ0NywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVubGFyZ2VzIHRoZSByZWN0YW5nbGUgdG8gY292ZXIgdGhlIHNwZWNpZmllZCBwb2ludCB3aXRoIHRoZQotICAgICAqIG5ldyBwb2ludCBnaXZlbiBhcyBhIFBvaW50IG9iamVjdC4KKyAgICAgKiBFbmxhcmdlcyB0aGUgcmVjdGFuZ2xlIHRvIGNvdmVyIHRoZSBzcGVjaWZpZWQgcG9pbnQgd2l0aCB0aGUgbmV3IHBvaW50CisgICAgICogZ2l2ZW4gYXMgYSBQb2ludCBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIHAgdGhlIFBvaW50IG9iamVjdCB0aGF0IHNwZWNpZmllcyB0aGUgbmV3IHBvaW50IHRvIAotICAgICAqIGJlIGNvdmVyZWQgYnkgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gcAorICAgICAqICAgICAgICAgICAgdGhlIFBvaW50IG9iamVjdCB0aGF0IHNwZWNpZmllcyB0aGUgbmV3IHBvaW50IHRvIGJlIGNvdmVyZWQgYnkKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkKFBvaW50IHApIHsKICAgICAgICAgYWRkKHAueCwgcC55KTsKQEAgLTQyMSw3ICs0NjIsOCBAQAogICAgICAqIEFkZHMgYSBuZXcgcmVjdGFuZ2xlIHRvIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUsIHRoZSByZXN1bHQgaXMgYW4gdW5pb24gb2YKICAgICAgKiB0aGUgc3BlY2lmaWVkIHNwZWNpZmllZCByZWN0YW5nbGUgYW5kIG9yaWdpbmFsIHJlY3RhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gciB0aGUgUmVjdGFuZ2xlIHdoaWNoIGlzIGFkZGVkIHRvIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUuIAorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgUmVjdGFuZ2xlIHdoaWNoIGlzIGFkZGVkIHRvIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkKFJlY3RhbmdsZSByKSB7CiAgICAgICAgIGludCB4MSA9IE1hdGgubWluKHgsIHIueCk7CkBAIC00MzIsMTQgKzQ3NCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHBvaW50IHdpdGggc3BlY2lmaWVkIGNvb3JkaW5hdGVzIFtweCwgcHldIAorICAgICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHBvaW50IHdpdGggc3BlY2lmaWVkIGNvb3JkaW5hdGVzIFtweCwgcHldCiAgICAgICogaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIHJlY3RhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHggdGhlIFggY29vcmRpbmF0ZSBvZiBwb2ludC4KLSAgICAgKiBAcGFyYW0gcHkgdGhlIFkgY29vcmRpbmF0ZSBvZiBwb2ludC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBwb2ludCB3aXRoIHNwZWNpZmllZCBjb29yZGluYXRlcyBbcHgsIHB5XSBpcyAKLSAgICAgKiB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgcmVjdGFuZ2xlLCBvdGhlcndpc2UgZmFsc2UuCisgICAgICogQHBhcmFtIHB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHBvaW50LgorICAgICAqIEBwYXJhbSBweQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBwb2ludCB3aXRoIHNwZWNpZmllZCBjb29yZGluYXRlcyBbcHgsIHB5XSBpcyB3aXRoaW4KKyAgICAgKiAgICAgICAgIHRoZSBib3VuZHMgb2YgdGhlIHJlY3RhbmdsZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCBweCwgaW50IHB5KSB7CiAgICAgICAgIGlmIChpc0VtcHR5KCkpIHsKQEAgLTQ1NCwyOSArNDk3LDMyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgcG9pbnQgZ2l2ZW4gYXMgYSBQb2ludCBvYmplY3QgCi0gICAgICogaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBwb2ludCBnaXZlbiBhcyBhIFBvaW50IG9iamVjdCBpcyB3aXRoaW4gdGhlCisgICAgICogYm91bmRzIG9mIHRoZSByZWN0YW5nbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHAgdGhlIFBvaW50IG9iamVjdAotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHBvaW50IHAgaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIAotICAgICAqIHJlY3RhbmdsZSwgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgUG9pbnQgb2JqZWN0CisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcG9pbnQgcCBpcyB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgcmVjdGFuZ2xlLAorICAgICAqICAgICAgICAgb3RoZXJ3aXNlIGZhbHNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFBvaW50IHApIHsKICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKHAueCwgcC55KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSByZWN0YW5nbGUgc3BlY2lmaWVkIGJ5IFtyeCwgcnksIHJ3LCByaF0gCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgcmVjdGFuZ2xlIHNwZWNpZmllZCBieSBbcngsIHJ5LCBydywgcmhdCiAgICAgICogcGFyYW1ldGVycyBpcyBsb2NhdGVkIGluc2lkZSB0aGUgb3JpZ2luYWwgcmVjdGFuZ2xlLgogICAgICAqIAotICAgICAqIEBwYXJhbSByeCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgdG8gY29tcGFyZS4KLSAgICAgKiBAcGFyYW0gcnkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHRvIGNvbXBhcmUuCi0gICAgICogQHBhcmFtIHJ3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRvIGNvbXBhcmUuCi0gICAgICogQHBhcmFtIHJoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB0byBjb21wYXJlLgotICAgICAqIAorICAgICAqIEBwYXJhbSByeAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHRvIGNvbXBhcmUuCisgICAgICogQHBhcmFtIHJ5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgdG8gY29tcGFyZS4KKyAgICAgKiBAcGFyYW0gcncKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRvIGNvbXBhcmUuCisgICAgICogQHBhcmFtIHJoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgdG8gY29tcGFyZS4KICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGEgcmVjdGFuZ2xlIHdpdGggW3J4LCByeSwgcncsIHJoXSBwYXJhbWV0ZXJzIGlzIGVudGlyZWx5Ci0gICAgICogY29udGFpbmVkIGluIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUsIG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKiAgICAgICAgIGNvbnRhaW5lZCBpbiB0aGUgb3JpZ2luYWwgcmVjdGFuZ2xlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHJ4LCBpbnQgcnksIGludCBydywgaW50IHJoKSB7CiAgICAgICAgIHJldHVybiBjb250YWlucyhyeCwgcnkpICYmIGNvbnRhaW5zKHJ4ICsgcncgLSAxLCByeSArIHJoIC0gMSk7CkBAIC00ODYsMjUgKzUzMiwyNSBAQAogICAgICAqIENvbXBhcmVzIHdoZXRoZXIgb3Igbm90IHRoZSByZWN0YW5nbGUgc3BlY2lmaWVkIGJ5IHRoZSBSZWN0YW5nbGUgb2JqZWN0CiAgICAgICogaXMgbG9jYXRlZCBpbnNpZGUgdGhlIG9yaWdpbmFsIHJlY3RhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gciB0aGUgUmVjdGFuZ2xlIG9iamVjdC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIFJlY3RhbmdsZSBvYmplY3QuCiAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcmVjdGFuZ2xlIHNwZWNpZmllZCBieSBSZWN0YW5nbGUgb2JqZWN0IGlzIGVudGlyZWx5Ci0gICAgICogY29udGFpbmVkIGluIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUsIG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKiAgICAgICAgIGNvbnRhaW5lZCBpbiB0aGUgb3JpZ2luYWwgcmVjdGFuZ2xlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoUmVjdGFuZ2xlIHIpIHsKICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKHIueCwgci55LCByLndpZHRoLCByLmhlaWdodCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgd2hldGhlciBvciBub3QgYSBwb2ludCB3aXRoIHNwZWNpZmllZCBjb29yZGluYXRlcyBbcHgsIHB5XSBiZWxvbmdzIAotICAgICAqIHRvIGEgcmVjdGFuZ2xlLgorICAgICAqIENvbXBhcmVzIHdoZXRoZXIgb3Igbm90IGEgcG9pbnQgd2l0aCBzcGVjaWZpZWQgY29vcmRpbmF0ZXMgW3B4LCBweV0KKyAgICAgKiBiZWxvbmdzIHRvIGEgcmVjdGFuZ2xlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBweCB0aGUgWCBjb29yZGluYXRlIG9mIGEgcG9pbnQuCi0gICAgICogQHBhcmFtIHB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgYSBwb2ludC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGEgcG9pbnQgd2l0aCBzcGVjaWZpZWQgY29vcmRpbmF0ZXMgW3B4LCBweV0gYmVsb25ncyAKLSAgICAgKiB0byBhIHJlY3RhbmdsZSwgb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBweAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiBhIHBvaW50LgorICAgICAqIEBwYXJhbSBweQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiBhIHBvaW50LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYSBwb2ludCB3aXRoIHNwZWNpZmllZCBjb29yZGluYXRlcyBbcHgsIHB5XSBiZWxvbmdzIHRvIGEKKyAgICAgKiAgICAgICAgIHJlY3RhbmdsZSwgb3RoZXJ3aXNlIGZhbHNlLgogICAgICAqIEBkZXByZWNhdGVkIHVzZSBjb250YWlucyhpbnQsIGludCkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC01MTMsMjAgKzU1OSwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgb3JpZ2luYWwgcmVjdGFuZ2xlIHdpdGggdGhlIAotICAgICAqIHNwZWNpZmllZCBSZWN0YW5nbGUyRC4KKyAgICAgKiBSZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIG9yaWdpbmFsIHJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBSZWN0YW5nbGUyRC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gciB0aGUgUmVjdGFuZ2xlMkQgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFJlY3RhbmdsZTJEIG9iamVjdCB0aGF0IGlzIHRoZSByZXN1bHQgb2YgaW50ZXJzZWN0aW5nIAotICAgICAqIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUgd2l0aCB0aGUgc3BlY2lmaWVkIFJlY3RhbmdsZTJELgotICAgICAqIAorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgUmVjdGFuZ2xlMkQgb2JqZWN0LgorICAgICAqIEByZXR1cm4gdGhlIFJlY3RhbmdsZTJEIG9iamVjdCB0aGF0IGlzIHRoZSByZXN1bHQgb2YgaW50ZXJzZWN0aW5nIHRoZQorICAgICAqICAgICAgICAgb3JpZ2luYWwgcmVjdGFuZ2xlIHdpdGggdGhlIHNwZWNpZmllZCBSZWN0YW5nbGUyRC4KICAgICAgKiBAc2VlIGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQjY3JlYXRlSW50ZXJzZWN0aW9uKGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFJlY3RhbmdsZTJEIGNyZWF0ZUludGVyc2VjdGlvbihSZWN0YW5nbGUyRCByKSB7CiAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSB7Ci0gICAgICAgICAgICByZXR1cm4gaW50ZXJzZWN0aW9uKChSZWN0YW5nbGUpIHIpOworICAgICAgICAgICAgcmV0dXJuIGludGVyc2VjdGlvbigoUmVjdGFuZ2xlKXIpOwogICAgICAgICB9CiAgICAgICAgIFJlY3RhbmdsZTJEIGRzdCA9IG5ldyBSZWN0YW5nbGUyRC5Eb3VibGUoKTsKICAgICAgICAgUmVjdGFuZ2xlMkQuaW50ZXJzZWN0KHRoaXMsIHIsIGRzdCk7CkBAIC01MzQsMTQgKzU3OSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgb3JpZ2luYWwgcmVjdGFuZ2xlIHdpdGggdGhlIAotICAgICAqIHNwZWNpZmllZCByZWN0YW5nbGUuIEFuIGVtcHR5IHJlY3RhbmdsZSBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBubwotICAgICAqIGludGVyc2VjdGlvbi4KKyAgICAgKiBSZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIG9yaWdpbmFsIHJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiByZWN0YW5nbGUuIEFuIGVtcHR5IHJlY3RhbmdsZSBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyBpbnRlcnNlY3Rpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIFJlY3RhbmdsZSBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgUmVjdGFuZ2xlIG9iamVjdCBpcyByZXN1bHQgb2YgdGhlIG9yaWdpbmFsIHJlY3RhbmdsZSB3aXRoIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgcmVjdGFuZ2xlLiAKKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIFJlY3RhbmdsZSBvYmplY3QuCisgICAgICogQHJldHVybiB0aGUgUmVjdGFuZ2xlIG9iamVjdCBpcyByZXN1bHQgb2YgdGhlIG9yaWdpbmFsIHJlY3RhbmdsZSB3aXRoIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIHJlY3RhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgUmVjdGFuZ2xlIGludGVyc2VjdGlvbihSZWN0YW5nbGUgcikgewogICAgICAgICBpbnQgeDEgPSBNYXRoLm1heCh4LCByLngpOwpAQCAtNTUyLDM5ICs1OTYsMzggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBvcmlnaW5hbCByZWN0YW5nbGUgaW50ZXJzZWN0cyAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZS4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBvcmlnaW5hbCByZWN0YW5nbGUgaW50ZXJzZWN0cyB0aGUgc3BlY2lmaWVkCisgICAgICogcmVjdGFuZ2xlLgogICAgICAqIAotICAgICAqIEBwYXJhbSByIHRoZSBSZWN0YW5nbGUgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHR3byByZWN0YW5nbGVzIG92ZXJsYXA7IG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIFJlY3RhbmdsZSBvYmplY3QuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgdHdvIHJlY3RhbmdsZXMgb3ZlcmxhcCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGludGVyc2VjdHMoUmVjdGFuZ2xlIHIpIHsKICAgICAgICAgcmV0dXJuICFpbnRlcnNlY3Rpb24ocikuaXNFbXB0eSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hlcmUgdGhlIHNwZWNpZmllZCBQb2ludCBpcyBsb2NhdGVkIHdpdGggcmVzcGVjdCB0byAKLSAgICAgKiB0aGUgcmVjdGFuZ2xlLiBUaGlzIG1ldGhvZCBjb21wdXRlcyB3aGV0aGVyIHRoZSBwb2ludCBpcyB0byB0aGUgCi0gICAgICogcmlnaHQgb3IgdG8gdGhlIGxlZnQgb2YgdGhlIHJlY3RhbmdsZSBhbmQgd2hldGhlciBpdCBpcyBhYm92ZSAKLSAgICAgKiBvciBiZWxvdyB0aGUgcmVjdGFuZ2xlLCBhbmQgcGFja3MgdGhlIHJlc3VsdCBpbnRvIGFuIGludCBieSAKLSAgICAgKiB1c2luZyBhIGJpbmFyeSBPUiBvcGVyYXRpb24gd2l0aCB0aGUgZm9sbG93aW5nIG1hc2tzOgorICAgICAqIERldGVybWluZXMgd2hlcmUgdGhlIHNwZWNpZmllZCBQb2ludCBpcyBsb2NhdGVkIHdpdGggcmVzcGVjdCB0byB0aGUKKyAgICAgKiByZWN0YW5nbGUuIFRoaXMgbWV0aG9kIGNvbXB1dGVzIHdoZXRoZXIgdGhlIHBvaW50IGlzIHRvIHRoZSByaWdodCBvciB0bworICAgICAqIHRoZSBsZWZ0IG9mIHRoZSByZWN0YW5nbGUgYW5kIHdoZXRoZXIgaXQgaXMgYWJvdmUgb3IgYmVsb3cgdGhlIHJlY3RhbmdsZSwKKyAgICAgKiBhbmQgcGFja3MgdGhlIHJlc3VsdCBpbnRvIGFuIGludGVnZXIgYnkgdXNpbmcgYSBiaW5hcnkgT1Igb3BlcmF0aW9uIHdpdGgKKyAgICAgKiB0aGUgZm9sbG93aW5nIG1hc2tzOgogICAgICAqIDx1bD4KICAgICAgKjxsaT5SZWN0YW5nbGUyRC5PVVRfTEVGVDwvbGk+CiAgICAgICo8bGk+UmVjdGFuZ2xlMkQuT1VUX1RPUDwvbGk+CiAgICAgICo8bGk+UmVjdGFuZ2xlMkQuT1VUX1JJR0hUPC9saT4KICAgICAgKjxsaT5SZWN0YW5nbGUyRC5PVVRfQk9UVE9NPC9saT4KICAgICAgKjwvdWw+Ci0gICAgICoKLSAgICAgKiBJZiB0aGUgcmVjdGFuZ2xlIGlzIGVtcHR5LCBhbGwgbWFza3MgYXJlIHNldCwgYW5kIGlmIHRoZSAKLSAgICAgKiBwb2ludCBpcyBpbnNpZGUgdGhlIHJlY3RhbmdsZSwgbm9uZSBhcmUgc2V0LgorICAgICAqIElmIHRoZSByZWN0YW5nbGUgaXMgZW1wdHksIGFsbCBtYXNrcyBhcmUgc2V0LCBhbmQgaWYgdGhlIHBvaW50IGlzIGluc2lkZQorICAgICAqIHRoZSByZWN0YW5nbGUsIG5vbmUgYXJlIHNldC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBvaW50LgotICAgICAqIEBwYXJhbSBweSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBzcGVjaWZpZWQgcG9pbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIFBvaW50IHJlbGF0aXZlIHRvIHRoZSByZWN0YW5nbGUgCi0gICAgICogYXMgdGhlIHJlc3VsdCBvZiBsb2dpY2FsIE9SIG9wZXJhdGlvbiB3aXRoIGFsbCBvdXQgbWFza3MuCi0gICAgICogCisgICAgICogQHBhcmFtIHB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBzcGVjaWZpZWQgcG9pbnQuCisgICAgICogQHBhcmFtIHB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBzcGVjaWZpZWQgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIFBvaW50IHJlbGF0aXZlIHRvIHRoZSByZWN0YW5nbGUgYXMgdGhlIHJlc3VsdAorICAgICAqICAgICAgICAgb2YgbG9naWNhbCBPUiBvcGVyYXRpb24gd2l0aCBhbGwgb3V0IG1hc2tzLgogICAgICAqIEBzZWUgamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRCNvdXRjb2RlKGRvdWJsZSwgZG91YmxlKQogICAgICAqLwogICAgIEBPdmVycmlkZQpAQCAtNTkzLDIzICs2MzYsMTkgQEAKIAogICAgICAgICBpZiAod2lkdGggPD0gMCkgewogICAgICAgICAgICAgY29kZSB8PSBPVVRfTEVGVCB8IE9VVF9SSUdIVDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpZiAocHggPCB4KSB7Ci0gICAgICAgICAgICAgICAgY29kZSB8PSBPVVRfTEVGVDsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGlmIChweCA+IHggKyB3aWR0aCkgewotICAgICAgICAgICAgICAgICAgICBjb2RlIHw9IE9VVF9SSUdIVDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocHggPCB4KSB7CisgICAgICAgICAgICBjb2RlIHw9IE9VVF9MRUZUOworICAgICAgICB9IGVsc2UgaWYgKHB4ID4geCArIHdpZHRoKSB7CisgICAgICAgICAgICBjb2RlIHw9IE9VVF9SSUdIVDsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChoZWlnaHQgPD0gMCkgewogICAgICAgICAgICAgY29kZSB8PSBPVVRfVE9QIHwgT1VUX0JPVFRPTTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpZiAocHkgPCB5KSB7Ci0gICAgICAgICAgICAgICAgY29kZSB8PSBPVVRfVE9QOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgaWYgKHB5ID4geSArIGhlaWdodCkgewotICAgICAgICAgICAgICAgICAgICBjb2RlIHw9IE9VVF9CT1RUT007Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHB5IDwgeSkgeworICAgICAgICAgICAgY29kZSB8PSBPVVRfVE9QOworICAgICAgICB9IGVsc2UgaWYgKHB5ID4geSArIGhlaWdodCkgeworICAgICAgICAgICAgY29kZSB8PSBPVVRfQk9UVE9NOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGNvZGU7CiAgICAgfQpAQCAtNjE3LDEwICs2NTYsOSBAQAogICAgIC8qKgogICAgICAqIEVubGFyZ2VzIHRoZSByZWN0YW5nbGUgdG8gY292ZXIgdGhlIHNwZWNpZmllZCBSZWN0YW5nbGUyRC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gciB0aGUgUmVjdGFuZ2xlMkQgb2JqZWN0LgotICAgICAqIAorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgUmVjdGFuZ2xlMkQgb2JqZWN0LgogICAgICAqIEByZXR1cm4gdGhlIHVuaW9uIG9mIHRoZSBvcmlnaW5hbCBhbmQgdGhlIHNwZWNpZmllZCBSZWN0YW5nbGUyRC4KLSAgICAgKiAKICAgICAgKiBAc2VlIGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQjY3JlYXRlVW5pb24oamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTYzNiw4ICs2NzQsOCBAQAogICAgIC8qKgogICAgICAqIEVubGFyZ2VzIHRoZSByZWN0YW5nbGUgdG8gY292ZXIgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIFJlY3RhbmdsZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIFJlY3RhbmdsZS4KICAgICAgKiBAcmV0dXJuIHRoZSB1bmlvbiBvZiB0aGUgb3JpZ2luYWwgYW5kIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyBSZWN0YW5nbGUgdW5pb24oUmVjdGFuZ2xlIHIpIHsKQEAgLTY0OSwxMSArNjg3LDEwIEBACiAgICAgLyoqCiAgICAgICogQ29tcGFyZXMgdGhlIG9yaWdpbmFsIFJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBvYmogdGhlIHNwZWNpZmllZCBPYmplY3QgZm9yIGNvbXBhcmlzb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIE9iamVjdCBpcyBhIHJlY3RhbmdsZSB3aXRoIHRoZSAKLSAgICAgKiBzYW1lIGRpbWVuc2lvbnMgYXMgdGhlIG9yaWdpbmFsIHJlY3RhbmdsZSwgb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgT2JqZWN0IGZvciBjb21wYXJpc29uLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBPYmplY3QgaXMgYSByZWN0YW5nbGUgd2l0aCB0aGUgc2FtZQorICAgICAqICAgICAgICAgZGltZW5zaW9ucyBhcyB0aGUgb3JpZ2luYWwgcmVjdGFuZ2xlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEI2VxdWFscyhPYmplY3QpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC02NjksMTggKzcwNiwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY3RhbmdsZTsgdGhlIHN0cmluZyBjb250YWlucyAKLSAgICAgKiBbeCwgeSwgd2lkdGgsIGhlaWdodF0gcGFyYW1ldGVycyBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY3RhbmdsZTsgdGhlIHN0cmluZyBjb250YWlucyBbeCwKKyAgICAgKiB5LCB3aWR0aCwgaGVpZ2h0XSBwYXJhbWV0ZXJzIG9mIHRoZSByZWN0YW5nbGUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgLy8gVGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3VyLiBJdCBjb3VsZCBiZSBvYnRhaW5lZCBpbiB0aGUgZm9sbG93aW5nIHdheQorICAgICAgICAvLyBUaGUgb3V0cHV0IGZvcm1hdCBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvdXIuIEl0IGNvdWxkIGJlCisgICAgICAgIC8vIG9idGFpbmVkIGluIHRoZSBmb2xsb3dpbmcgd2F5CiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgUmVjdGFuZ2xlKCkudG9TdHJpbmcoKSkKICAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIlt4PSIgKyB4ICsgIix5PSIgKyB5ICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAiLHdpZHRoPSIgKyB3aWR0aCArICIsaGVpZ2h0PSIgKyBoZWlnaHQgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisgICAgICAgICAgICAgICAgIix3aWR0aD0iICsgd2lkdGggKyAiLGhlaWdodD0iICsgaGVpZ2h0ICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvUmVuZGVyaW5nSGludHMuamF2YSBiL2F3dC9qYXZhL2F3dC9SZW5kZXJpbmdIaW50cy5qYXZhCmluZGV4IDQ5NTc4ODQuLmFjZjZmYTEgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9SZW5kZXJpbmdIaW50cy5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9SZW5kZXJpbmdIaW50cy5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIEFsZXhleSBBLiBQZXRyZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTI3LDIyNCArMjgsMjE5IEBACiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCi0gKiBUaGUgUmVuZGVyaW5nSGludHMgY2xhc3MgcmVwcmVzZW50cyBwcmVmZXJlbmNlcyBmb3IgdGhlIHJlbmRlcmluZyBhbGdvcml0aG1zLiAKLSAqIFRoZSBwcmVmZXJlbmNlcyBhcmUgYXJiaXRyYXJ5IGFuZCBjYW4gYmUgc3BlY2lmaWVkIGJ5IE1hcCBvYmplY3RzIG9yIGJ5IAotICoga2V5LXZhbHVlIHBhaXJzLiAKKyAqIFRoZSBSZW5kZXJpbmdIaW50cyBjbGFzcyByZXByZXNlbnRzIHByZWZlcmVuY2VzIGZvciB0aGUgcmVuZGVyaW5nIGFsZ29yaXRobXMuCisgKiBUaGUgcHJlZmVyZW5jZXMgYXJlIGFyYml0cmFyeSBhbmQgY2FuIGJlIHNwZWNpZmllZCBieSBNYXAgb2JqZWN0cyBvciBieQorICoga2V5LXZhbHVlIHBhaXJzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFJlbmRlcmluZ0hpbnRzIGltcGxlbWVudHMgTWFwPE9iamVjdCwgT2JqZWN0PiwgQ2xvbmVhYmxlIHsKLSAgICAKKwogICAgIC8qKgotICAgICAqIFRoZSBDb25zdGFudCBLRVlfQUxQSEFfSU5URVJQT0xBVElPTiAtIGFscGhhIGludGVycG9sYXRpb24gcmVuZGVyaW5nIAotICAgICAqIGhpbnQga2V5LiAKKyAgICAgKiBUaGUgQ29uc3RhbnQgS0VZX0FMUEhBX0lOVEVSUE9MQVRJT04gLSBhbHBoYSBpbnRlcnBvbGF0aW9uIHJlbmRlcmluZyBoaW50CisgICAgICoga2V5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgS2V5IEtFWV9BTFBIQV9JTlRFUlBPTEFUSU9OID0gbmV3IEtleUltcGwoMSk7Ci0gICAgCi0gICAgLyoqIAorCisgICAgLyoqCiAgICAgICogVGhlIENvbnN0YW50IFZBTFVFX0FMUEhBX0lOVEVSUE9MQVRJT05fREVGQVVMVCAtIGFscGhhIGludGVycG9sYXRpb24KICAgICAgKiByZW5kZXJpbmcgaGludCB2YWx1ZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9BTFBIQV9JTlRFUlBPTEFUSU9OX0RFRkFVTFQgPSBuZXcgS2V5VmFsdWUoS0VZX0FMUEhBX0lOVEVSUE9MQVRJT04pOwotICAgIAotICAgIC8qKiAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9BTFBIQV9JTlRFUlBPTEFUSU9OX0RFRkFVTFQgPSBuZXcgS2V5VmFsdWUoCisgICAgICAgICAgICBLRVlfQUxQSEFfSU5URVJQT0xBVElPTik7CisKKyAgICAvKioKICAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfQUxQSEFfSU5URVJQT0xBVElPTl9TUEVFRCAtIGFscGhhIGludGVycG9sYXRpb24KICAgICAgKiByZW5kZXJpbmcgaGludCB2YWx1ZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9BTFBIQV9JTlRFUlBPTEFUSU9OX1NQRUVEID0gbmV3IEtleVZhbHVlKEtFWV9BTFBIQV9JTlRFUlBPTEFUSU9OKTsKLSAgICAKLSAgICAvKiogCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkFMVUVfQUxQSEFfSU5URVJQT0xBVElPTl9TUEVFRCA9IG5ldyBLZXlWYWx1ZSgKKyAgICAgICAgICAgIEtFWV9BTFBIQV9JTlRFUlBPTEFUSU9OKTsKKworICAgIC8qKgogICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9BTFBIQV9JTlRFUlBPTEFUSU9OX1FVQUxJVFkgLSBhbHBoYSBpbnRlcnBvbGF0aW9uCiAgICAgICogcmVuZGVyaW5nIGhpbnQgdmFsdWUuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkFMVUVfQUxQSEFfSU5URVJQT0xBVElPTl9RVUFMSVRZID0gbmV3IEtleVZhbHVlKEtFWV9BTFBIQV9JTlRFUlBPTEFUSU9OKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9BTFBIQV9JTlRFUlBPTEFUSU9OX1FVQUxJVFkgPSBuZXcgS2V5VmFsdWUoCisgICAgICAgICAgICBLRVlfQUxQSEFfSU5URVJQT0xBVElPTik7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEtFWV9BTlRJQUxJQVNJTkcgLSBhbnRpYWxpYXNpbmcgcmVuZGVyaW5nIAotICAgICAqIGhpbnQga2V5LiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgS0VZX0FOVElBTElBU0lORyAtIGFudGlhbGlhc2luZyByZW5kZXJpbmcgaGludCBrZXkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBLZXkgS0VZX0FOVElBTElBU0lORyA9IG5ldyBLZXlJbXBsKDIpOwotICAgIAorCiAgICAgLyoqCi0gICAgICogVGhlIENvbnN0YW50IFZBTFVFX0FOVElBTElBU19ERUZBVUxUIC0gYW50aWFsaWFzaW5nCi0gICAgICogcmVuZGVyaW5nIGhpbnQgdmFsdWUuIAorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9BTlRJQUxJQVNfREVGQVVMVCAtIGFudGlhbGlhc2luZyByZW5kZXJpbmcgaGludCB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9BTlRJQUxJQVNfREVGQVVMVCA9IG5ldyBLZXlWYWx1ZShLRVlfQU5USUFMSUFTSU5HKTsKLSAgICAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFZBTFVFX0FOVElBTElBU19PTiAtIGFudGlhbGlhc2luZwotICAgICAqIHJlbmRlcmluZyBoaW50IHZhbHVlLgorCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFZBTFVFX0FOVElBTElBU19PTiAtIGFudGlhbGlhc2luZyByZW5kZXJpbmcgaGludCB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9BTlRJQUxJQVNfT04gPSBuZXcgS2V5VmFsdWUoS0VZX0FOVElBTElBU0lORyk7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfQU5USUFMSUFTX09GRiAtIGFudGlhbGlhc2luZwotICAgICAqIHJlbmRlcmluZyBoaW50IHZhbHVlLgorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9BTlRJQUxJQVNfT0ZGIC0gYW50aWFsaWFzaW5nIHJlbmRlcmluZyBoaW50IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX0FOVElBTElBU19PRkYgPSBuZXcgS2V5VmFsdWUoS0VZX0FOVElBTElBU0lORyk7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEtFWV9DT0xPUl9SRU5ERVJJTkcgIC0gY29sb3IgcmVuZGVyaW5nIAotICAgICAqIGhpbnQga2V5LgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBLRVlfQ09MT1JfUkVOREVSSU5HIC0gY29sb3IgcmVuZGVyaW5nIGhpbnQga2V5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgS2V5IEtFWV9DT0xPUl9SRU5ERVJJTkcgPSBuZXcgS2V5SW1wbCgzKTsKLSAgICAKKwogICAgIC8qKgotICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9DT0xPUl9SRU5ERVJfREVGQVVMVCAtIGNvbG9yCi0gICAgICogcmVuZGVyaW5nIGhpbnQgdmFsdWUuIAorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9DT0xPUl9SRU5ERVJfREVGQVVMVCAtIGNvbG9yIHJlbmRlcmluZyBoaW50IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX0NPTE9SX1JFTkRFUl9ERUZBVUxUID0gbmV3IEtleVZhbHVlKEtFWV9DT0xPUl9SRU5ERVJJTkcpOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfQ09MT1JfUkVOREVSX1NQRUVEICAtIGNvbG9yCi0gICAgICogcmVuZGVyaW5nIGhpbnQgdmFsdWUuIAorCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFZBTFVFX0NPTE9SX1JFTkRFUl9TUEVFRCAtIGNvbG9yIHJlbmRlcmluZyBoaW50IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX0NPTE9SX1JFTkRFUl9TUEVFRCA9IG5ldyBLZXlWYWx1ZShLRVlfQ09MT1JfUkVOREVSSU5HKTsKLSAgICAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFZBTFVFX0NPTE9SX1JFTkRFUl9RVUFMSVRZIC0gY29sb3IKLSAgICAgKiByZW5kZXJpbmcgaGludCB2YWx1ZS4KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9DT0xPUl9SRU5ERVJfUVVBTElUWSAtIGNvbG9yIHJlbmRlcmluZyBoaW50IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX0NPTE9SX1JFTkRFUl9RVUFMSVRZID0gbmV3IEtleVZhbHVlKEtFWV9DT0xPUl9SRU5ERVJJTkcpOwogCiAgICAgLyoqCi0gICAgICogIFRoZSBDb25zdGFudCBLRVlfRElUSEVSSU5HICAtIGRpdGhlcmluZwotICAgICAqIHJlbmRlcmluZyBoaW50IGtleS4KKyAgICAgKiBUaGUgQ29uc3RhbnQgS0VZX0RJVEhFUklORyAtIGRpdGhlcmluZyByZW5kZXJpbmcgaGludCBrZXkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBLZXkgS0VZX0RJVEhFUklORyA9IG5ldyBLZXlJbXBsKDQpOwotICAgIAorCiAgICAgLyoqCi0gICAgICogVGhlIENvbnN0YW50IFZBTFVFX0RJVEhFUl9ERUZBVUxUIC0gZGl0aGVyaW5nCi0gICAgICogcmVuZGVyaW5nIGhpbnQgdmFsdWUuCisgICAgICogVGhlIENvbnN0YW50IFZBTFVFX0RJVEhFUl9ERUZBVUxUIC0gZGl0aGVyaW5nIHJlbmRlcmluZyBoaW50IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX0RJVEhFUl9ERUZBVUxUID0gbmV3IEtleVZhbHVlKEtFWV9ESVRIRVJJTkcpOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfRElUSEVSX0RJU0FCTEUgLSBkaXRoZXJpbmcKLSAgICAgKiByZW5kZXJpbmcgaGludCB2YWx1ZS4KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9ESVRIRVJfRElTQUJMRSAtIGRpdGhlcmluZyByZW5kZXJpbmcgaGludCB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9ESVRIRVJfRElTQUJMRSA9IG5ldyBLZXlWYWx1ZShLRVlfRElUSEVSSU5HKTsKLSAgICAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFZBTFVFX0RJVEhFUl9ESVNBQkxFIC0gZGl0aGVyaW5nCi0gICAgICogcmVuZGVyaW5nIGhpbnQgdmFsdWUuCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfRElUSEVSX0RJU0FCTEUgLSBkaXRoZXJpbmcgcmVuZGVyaW5nIGhpbnQgdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkFMVUVfRElUSEVSX0VOQUJMRSA9IG5ldyBLZXlWYWx1ZShLRVlfRElUSEVSSU5HKTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgS0VZX0ZSQUNUSU9OQUxNRVRSSUNTIC0gZnJhY3Rpb25hbCBtZXRyaWNzCi0gICAgICogcmVuZGVyaW5nIGhpbnQga2V5LgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBLRVlfRlJBQ1RJT05BTE1FVFJJQ1MgLSBmcmFjdGlvbmFsIG1ldHJpY3MgcmVuZGVyaW5nIGhpbnQKKyAgICAgKiBrZXkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBLZXkgS0VZX0ZSQUNUSU9OQUxNRVRSSUNTID0gbmV3IEtleUltcGwoNSk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfRlJBQ1RJT05BTE1FVFJJQ1NfREVGQVVMVCAtIGZyYWN0aW9uYWwgbWV0cmljcwogICAgICAqIHJlbmRlcmluZyBoaW50IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX0ZSQUNUSU9OQUxNRVRSSUNTX0RFRkFVTFQgPSBuZXcgS2V5VmFsdWUoS0VZX0ZSQUNUSU9OQUxNRVRSSUNTKTsKLSAgICAKKwogICAgIC8qKgotICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9GUkFDVElPTkFMTUVUUklDU19PTiAtIGZyYWN0aW9uYWwgbWV0cmljcwotICAgICAqIHJlbmRlcmluZyBoaW50IHZhbHVlLgorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9GUkFDVElPTkFMTUVUUklDU19PTiAtIGZyYWN0aW9uYWwgbWV0cmljcyByZW5kZXJpbmcKKyAgICAgKiBoaW50IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX0ZSQUNUSU9OQUxNRVRSSUNTX09OID0gbmV3IEtleVZhbHVlKEtFWV9GUkFDVElPTkFMTUVUUklDUyk7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiAgVGhlIENvbnN0YW50IFZBTFVFX0ZSQUNUSU9OQUxNRVRSSUNTX09GRiAtIGZyYWN0aW9uYWwgbWV0cmljcwotICAgICAqIHJlbmRlcmluZyBoaW50IHZhbHVlLgorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9GUkFDVElPTkFMTUVUUklDU19PRkYgLSBmcmFjdGlvbmFsIG1ldHJpY3MgcmVuZGVyaW5nCisgICAgICogaGludCB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9GUkFDVElPTkFMTUVUUklDU19PRkYgPSBuZXcgS2V5VmFsdWUoS0VZX0ZSQUNUSU9OQUxNRVRSSUNTKTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgS0VZX0lOVEVSUE9MQVRJT04gLSBpbnRlcnBvbGF0aW9uCi0gICAgICogcmVuZGVyaW5nIGhpbnQga2V5LgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBLRVlfSU5URVJQT0xBVElPTiAtIGludGVycG9sYXRpb24gcmVuZGVyaW5nIGhpbnQga2V5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgS2V5IEtFWV9JTlRFUlBPTEFUSU9OID0gbmV3IEtleUltcGwoNik7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9JTlRFUlBPTEFUSU9OX0JJQ1VCSUMgLSBpbnRlcnBvbGF0aW9uCi0gICAgICogcmVuZGVyaW5nIGhpbnQgdmFsdWUuIAorCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFZBTFVFX0lOVEVSUE9MQVRJT05fQklDVUJJQyAtIGludGVycG9sYXRpb24gcmVuZGVyaW5nIGhpbnQKKyAgICAgKiB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9JTlRFUlBPTEFUSU9OX0JJQ1VCSUMgPSBuZXcgS2V5VmFsdWUoS0VZX0lOVEVSUE9MQVRJT04pOwotICAgIAorCiAgICAgLyoqCi0gICAgICogVGhlIENvbnN0YW50IFZBTFVFX0lOVEVSUE9MQVRJT05fQklMSU5FQVIgLSBpbnRlcnBvbGF0aW9uCi0gICAgICogcmVuZGVyaW5nIGhpbnQgdmFsdWUuCisgICAgICogVGhlIENvbnN0YW50IFZBTFVFX0lOVEVSUE9MQVRJT05fQklMSU5FQVIgLSBpbnRlcnBvbGF0aW9uIHJlbmRlcmluZyBoaW50CisgICAgICogdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkFMVUVfSU5URVJQT0xBVElPTl9CSUxJTkVBUiA9IG5ldyBLZXlWYWx1ZShLRVlfSU5URVJQT0xBVElPTik7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBWQUxVRV9JTlRFUlBPTEFUSU9OX05FQVJFU1RfTkVJR0hCT1IgLSBpbnRlcnBvbGF0aW9uCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfSU5URVJQT0xBVElPTl9ORUFSRVNUX05FSUdIQk9SIC0gaW50ZXJwb2xhdGlvbgogICAgICAqIHJlbmRlcmluZyBoaW50IHZhbHVlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX0lOVEVSUE9MQVRJT05fTkVBUkVTVF9ORUlHSEJPUiA9IG5ldyBLZXlWYWx1ZShLRVlfSU5URVJQT0xBVElPTik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkFMVUVfSU5URVJQT0xBVElPTl9ORUFSRVNUX05FSUdIQk9SID0gbmV3IEtleVZhbHVlKAorICAgICAgICAgICAgS0VZX0lOVEVSUE9MQVRJT04pOwogCiAgICAgLyoqCiAgICAgICogVGhlIENvbnN0YW50IEtFWV9SRU5ERVJJTkcgLSByZW5kZXJpbmcgaGludCBrZXkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBLZXkgS0VZX1JFTkRFUklORyA9IG5ldyBLZXlJbXBsKDcpOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfUkVOREVSX0RFRkFVTFQgLSByZW5kZXJpbmcgaGludCB2YWx1ZS4gCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfUkVOREVSX0RFRkFVTFQgLSByZW5kZXJpbmcgaGludCB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9SRU5ERVJfREVGQVVMVCA9IG5ldyBLZXlWYWx1ZShLRVlfUkVOREVSSU5HKTsKLSAgICAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFZBTFVFX1JFTkRFUl9TUEVFRCAtIHJlbmRlcmluZyBoaW50IHZhbHVlLiAKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9SRU5ERVJfU1BFRUQgLSByZW5kZXJpbmcgaGludCB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9SRU5ERVJfU1BFRUQgPSBuZXcgS2V5VmFsdWUoS0VZX1JFTkRFUklORyk7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9SRU5ERVJfUVVBTElUWSAtIHJlbmRlcmluZyBoaW50IHZhbHVlLiAKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9SRU5ERVJfUVVBTElUWSAtIHJlbmRlcmluZyBoaW50IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX1JFTkRFUl9RVUFMSVRZID0gbmV3IEtleVZhbHVlKEtFWV9SRU5ERVJJTkcpOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBLRVlfU1RST0tFX0NPTlRST0wgLSBzdHJva2UgY29udHJvbCBoaW50IGtleS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEtFWV9TVFJPS0VfQ09OVFJPTCAtIHN0cm9rZSBjb250cm9sIGhpbnQga2V5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgS2V5IEtFWV9TVFJPS0VfQ09OVFJPTCA9IG5ldyBLZXlJbXBsKDgpOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfU1RST0tFX0RFRkFVTFQgLSBzdHJva2UgaGludCB2YWx1ZS4gCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfU1RST0tFX0RFRkFVTFQgLSBzdHJva2UgaGludCB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9TVFJPS0VfREVGQVVMVCA9IG5ldyBLZXlWYWx1ZShLRVlfU1RST0tFX0NPTlRST0wpOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfU1RST0tFX05PUk1BTElaRSAtIHN0cm9rZSBoaW50IHZhbHVlLiAKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9TVFJPS0VfTk9STUFMSVpFIC0gc3Ryb2tlIGhpbnQgdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkFMVUVfU1RST0tFX05PUk1BTElaRSA9IG5ldyBLZXlWYWx1ZShLRVlfU1RST0tFX0NPTlRST0wpOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfU1RST0tFX1BVUkUgLSBzdHJva2UgaGludCB2YWx1ZS4gCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfU1RST0tFX1BVUkUgLSBzdHJva2UgaGludCB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9TVFJPS0VfUFVSRSA9IG5ldyBLZXlWYWx1ZShLRVlfU1RST0tFX0NPTlRST0wpOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBLRVlfVEVYVF9BTlRJQUxJQVNJTkcgLSB0ZXh0IGFudGlhbGlhc2luZyBoaW50IGtleS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEtFWV9URVhUX0FOVElBTElBU0lORyAtIHRleHQgYW50aWFsaWFzaW5nIGhpbnQga2V5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgS2V5IEtFWV9URVhUX0FOVElBTElBU0lORyA9IG5ldyBLZXlJbXBsKDkpOwotICAgIAorCiAgICAgLyoqCi0gICAgICogIFRoZSBDb25zdGFudCBWQUxVRV9URVhUX0FOVElBTElBU19ERUZBVUxUIC0gdGV4dCBhbnRpYWxpYXNpbmcgaGludCBrZXkuIAorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9URVhUX0FOVElBTElBU19ERUZBVUxUIC0gdGV4dCBhbnRpYWxpYXNpbmcgaGludCBrZXkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkFMVUVfVEVYVF9BTlRJQUxJQVNfREVGQVVMVCA9IG5ldyBLZXlWYWx1ZShLRVlfVEVYVF9BTlRJQUxJQVNJTkcpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogVGhlIENvbnN0YW50IFZBTFVFX1RFWFRfQU5USUFMSUFTX09OIC0gdGV4dCBhbnRpYWxpYXNpbmcgaGludCBrZXkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkFMVUVfVEVYVF9BTlRJQUxJQVNfT04gPSBuZXcgS2V5VmFsdWUoS0VZX1RFWFRfQU5USUFMSUFTSU5HKTsKLSAgICAKKwogICAgIC8qKgotICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9URVhUX0FOVElBTElBU19PRkYgLSB0ZXh0IGFudGlhbGlhc2luZyBoaW50IGtleS4gCisgICAgICogVGhlIENvbnN0YW50IFZBTFVFX1RFWFRfQU5USUFMSUFTX09GRiAtIHRleHQgYW50aWFsaWFzaW5nIGhpbnQga2V5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX1RFWFRfQU5USUFMSUFTX09GRiA9IG5ldyBLZXlWYWx1ZShLRVlfVEVYVF9BTlRJQUxJQVNJTkcpOwogCiAgICAgLyoqIFRoZSBtYXAuICovCiAgICAgcHJpdmF0ZSBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKLSAgICAKKwogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyByZW5kZXJpbmcgaGludHMgb2JqZWN0IGZyb20gc3BlY2lmaWVkIE1hcCBvYmplY3Qgd2l0aCBkZWZpbmVkCi0gICAgICoga2V5L3ZhbHVlIHBhaXJzIG9yIG51bGwgZm9yIGVtcHR5IFJlbmRlcmluZ0hpbnRzLiAKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcmVuZGVyaW5nIGhpbnRzIG9iamVjdCBmcm9tIHNwZWNpZmllZCBNYXAgb2JqZWN0IHdpdGgKKyAgICAgKiBkZWZpbmVkIGtleS92YWx1ZSBwYWlycyBvciBudWxsIGZvciBlbXB0eSBSZW5kZXJpbmdIaW50cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwIHRoZSBNYXAgb2JqZWN0IHdpdGggZGVmaW5lZCBrZXkvdmFsdWUgcGFpcnMgb3IgbnVsbCBmb3IKLSAgICAgKiBlbXB0eSBSZW5kZXJpbmdIaW50cy4gCisgICAgICogQHBhcmFtIG1hcAorICAgICAqICAgICAgICAgICAgdGhlIE1hcCBvYmplY3Qgd2l0aCBkZWZpbmVkIGtleS92YWx1ZSBwYWlycyBvciBudWxsIGZvciBlbXB0eQorICAgICAqICAgICAgICAgICAgUmVuZGVyaW5nSGludHMuCiAgICAgICovCiAgICAgcHVibGljIFJlbmRlcmluZ0hpbnRzKE1hcDxLZXksID8+IG1hcCkgewogICAgICAgICBzdXBlcigpOwpAQCAtMjU0LDEwICsyNTAsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcmVuZGVyaW5nIGhpbnRzIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5L3ZhbHVlIHBhaXIuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHJlbmRlcmluZyBoaW50cyBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS92YWx1ZQorICAgICAqIHBhaXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGtleSB0aGUga2V5IG9mIGhpbnQgcHJvcGVydHkuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiBoaW50IHByb3BlcnR5LgorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgb2YgaGludCBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiBoaW50IHByb3BlcnR5LgogICAgICAqLwogICAgIHB1YmxpYyBSZW5kZXJpbmdIaW50cyhLZXkga2V5LCBPYmplY3QgdmFsdWUpIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTI2OCwyMSArMjY3LDIyIEBACiAgICAgICogQWRkcyB0aGUgcHJvcGVydGllcyByZXByZXNlbnRlZCBieSBrZXkvdmFsdWUgcGFpcnMgZnJvbSB0aGUgc3BlY2lmaWVkCiAgICAgICogUmVuZGVyaW5nSGludHMgb2JqZWN0IHRvIGN1cnJlbnQgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBoaW50cyB0aGUgUmVuZGVyaW5nSGludHMgdG8gYmUgYWRkZWQuCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgUmVuZGVyaW5nSGludHMgdG8gYmUgYWRkZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkKFJlbmRlcmluZ0hpbnRzIGhpbnRzKSB7CiAgICAgICAgIG1hcC5wdXRBbGwoaGludHMubWFwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQdXRzIHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBrZXkuIE5laXRoZXIgdGhlIGtleSBub3IgCi0gICAgICogdGhlIHZhbHVlIGNhbiBiZSBudWxsLgorICAgICAqIFB1dHMgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIGtleS4gTmVpdGhlciB0aGUga2V5IG5vciB0aGUKKyAgICAgKiB2YWx1ZSBjYW4gYmUgbnVsbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5IHRoZSByZW5kZXJpbmcgaGludCBrZXkuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSByZW5kZXJpbmcgaGludCB2YWx1ZS4gCi0gICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIHJlbmRlcmluZyBoaW50IGtleS4KKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSByZW5kZXJpbmcgaGludCB2YWx1ZS4KICAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyByZW5kZXJpbmcgaGludCB2YWx1ZSBhc3NpZ25lZCB0byB0aGUga2V5IG9yIG51bGwuCi0gICAgICogCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CiAgICAgICAgIGlmICghKChLZXkpa2V5KS5pc0NvbXBhdGlibGVWYWx1ZSh2YWx1ZSkpIHsKQEAgLTI5MywxMyArMjkzLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGtleSBhbmQgY29ycmVzcG9uZGluZyB2YWx1ZSBmcm9tIAotICAgICAqIHRoZSBSZW5kZXJpbmdIaW50cyBvYmplY3QuCisgICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGtleSBhbmQgY29ycmVzcG9uZGluZyB2YWx1ZSBmcm9tIHRoZSBSZW5kZXJpbmdIaW50cworICAgICAqIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5IHRoZSBzcGVjaWZpZWQgaGludCBrZXkgdG8gYmUgcmVtb3ZlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3Qgb2YgcHJldmlvdXMgcmVuZGVyaW5nIGhpbnQgdmFsdWUgd2hpY2ggaXMgCi0gICAgICogYXNzaWduZWQgdG8gdGhlIHNwZWNpZmllZCBrZXksIG9yIG51bGwuCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBoaW50IGtleSB0byBiZSByZW1vdmVkLgorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBvZiBwcmV2aW91cyByZW5kZXJpbmcgaGludCB2YWx1ZSB3aGljaCBpcyBhc3NpZ25lZCB0bworICAgICAqICAgICAgICAgdGhlIHNwZWNpZmllZCBrZXksIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewogICAgICAgICByZXR1cm4gbWFwLnJlbW92ZShrZXkpOwpAQCAtMzA4LDggKzMwOCw4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgdmFsdWUgYXNzaWduZWQgdG8gdGhlIHNwZWNpZmllZCBrZXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGtleSB0aGUgcmVuZGVyaW5nIGhpbnQga2V5LgotICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSByZW5kZXJpbmcgaGludCBrZXkuCiAgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGFzc2lnbmVkIHRvIHRoZSBzcGVjaWZpZWQga2V5LgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKQEAgLTMxOSw3ICszMTksNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBzZXQgb2YgcmVuZGVyaW5nIGhpbnRzIGtleXMgZm9yIGN1cnJlbnQgUmVuZGVyaW5nSGludHMgb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiByZW5kZXJpbmcgaGludHMga2V5cy4gCisgICAgICogQHJldHVybiB0aGUgc2V0IG9mIHJlbmRlcmluZyBoaW50cyBrZXlzLgogICAgICAqLwogICAgIHB1YmxpYyBTZXQ8T2JqZWN0PiBrZXlTZXQoKSB7CiAgICAgICAgIHJldHVybiBtYXAua2V5U2V0KCk7CkBAIC0zMzYsMjMgKzMzNiwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFB1dHMgYWxsIG9mIHRoZSBwcmVmZXJlbmNlcyBmcm9tIHRoZSBzcGVjaWZpZWQgTWFwIGludG8gCi0gICAgICogdGhlIGN1cnJlbnQgUmVuZGVyaW5nSGludHMgb2JqZWN0LiBUaGVzZSBtYXBwaW5ncyByZXBsYWNlIAotICAgICAqIGFsbCBleGlzdGluZyBwcmVmZXJlbmNlcy4KKyAgICAgKiBQdXRzIGFsbCBvZiB0aGUgcHJlZmVyZW5jZXMgZnJvbSB0aGUgc3BlY2lmaWVkIE1hcCBpbnRvIHRoZSBjdXJyZW50CisgICAgICogUmVuZGVyaW5nSGludHMgb2JqZWN0LiBUaGVzZSBtYXBwaW5ncyByZXBsYWNlIGFsbCBleGlzdGluZyBwcmVmZXJlbmNlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbSB0aGUgc3BlY2lmaWVkIE1hcCBvZiBwcmVmZXJlbmNlcy4KKyAgICAgKiBAcGFyYW0gbQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBNYXAgb2YgcHJlZmVyZW5jZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcDw/LCA/PiBtKSB7CiAgICAgICAgIGlmIChtIGluc3RhbmNlb2YgUmVuZGVyaW5nSGludHMpIHsKLSAgICAgICAgICAgIG1hcC5wdXRBbGwoKChSZW5kZXJpbmdIaW50cykgbSkubWFwKTsKKyAgICAgICAgICAgIG1hcC5wdXRBbGwoKChSZW5kZXJpbmdIaW50cyltKS5tYXApOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgU2V0PD8+IGVudHJpZXMgPSBtLmVudHJ5U2V0KCk7CiAKLSAgICAgICAgICAgIGlmIChlbnRyaWVzICE9IG51bGwpeworICAgICAgICAgICAgaWYgKGVudHJpZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIEl0ZXJhdG9yPD8+IGl0ID0gZW50cmllcy5pdGVyYXRvcigpOwogICAgICAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PD8sID8+IGVudHJ5ID0gKE1hcC5FbnRyeTw/LCA/PikgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBLZXkga2V5ID0gKEtleSkgZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTw/LCA/PiBlbnRyeSA9IChNYXAuRW50cnk8PywgPz4paXQubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBLZXkga2V5ID0gKEtleSllbnRyeS5nZXRLZXkoKTsKICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbCA9IGVudHJ5LmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICAgICAgIHB1dChrZXksIHZhbCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMzYxLDcgKzM2MSw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIENvbGxlY3Rpb24gb2YgdmFsdWVzIGNvbnRhaW5lZCBpbiBjdXJyZW50IFJlbmRlcmluZ0hpbnRzIG9iamVjdC4KKyAgICAgKiBSZXR1cm5zIGEgQ29sbGVjdGlvbiBvZiB2YWx1ZXMgY29udGFpbmVkIGluIGN1cnJlbnQgUmVuZGVyaW5nSGludHMKKyAgICAgKiBvYmplY3QuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgQ29sbGVjdGlvbiBvZiBSZW5kZXJpbmdIaW50cydzIHZhbHVlcy4KICAgICAgKi8KQEAgLTM3MywxMCArMzc0LDEwIEBACiAgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IGN1cnJlbnQgUmVuZGVyaW5nSGludHMgb2JqZWN0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZQogICAgICAqIHRoZSB2YWx1ZSB3aGljaCBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIE9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHNwZWNpZmllZCBPYmplY3QuCi0gICAgICogCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIE9iamVjdC4KICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGFzc2lnbmVkIHRvIGF0IGxlYXN0IG9uZQotICAgICAqIFJlbmRlcmluZ0hpbnQncyBrZXksIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAgICAgICAgIFJlbmRlcmluZ0hpbnQncyBrZXksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewogICAgICAgICByZXR1cm4gbWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpOwpAQCAtMzg2LDExICszODcsMTAgQEAKICAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgY3VycmVudCBSZW5kZXJpbmdIaW50cyBvYmplY3QgY29udGFpbnMgdGhlIGtleQogICAgICAqIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgT2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgdGhlIHNwZWNpZmllZCBPYmplY3QuCi0gICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBPYmplY3QuCiAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgT2JqZWN0Ci0gICAgICogYXMgYSBrZXksIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgIGFzIGEga2V5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewogICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKQEAgLTQwMSw4ICs0MDEsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0IGNvbnRhaW5zIGFueSAKLSAgICAgKiBrZXkvdmFsdWUgcGFpcnMuCisgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBSZW5kZXJpbmdIaW50cyBvYmplY3QgY29udGFpbnMgYW55IGtleS92YWx1ZQorICAgICAqIHBhaXJzLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIFJlbmRlcmluZ0hpbnRzIG9iamVjdCBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwpAQCAtNDI5LDExICs0MjksMTAgQEAKICAgICAvKioKICAgICAgKiBDb21wYXJlcyB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG8gdGhlIHNwZWNpZmllZCBPYmplY3QgdG8gYmUgY29tcGFpcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIE9iamVjdCBpcyBhIE1hcCB3aG9zZSBrZXkvdmFsdWUgcGFpcnMgCi0gICAgICogbWF0Y2ggdGhpcyBSZW5kZXJpbmdIaW50cycga2V5L3ZhbHVlIHBhaXJzLCAKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIG8KKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIE9iamVjdCBpcyBhIE1hcCB3aG9zZSBrZXkvdmFsdWUgcGFpcnMgbWF0Y2ggdGhpcworICAgICAqICAgICAgICAgUmVuZGVyaW5nSGludHMnIGtleS92YWx1ZSBwYWlycywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewpAQCAtNDUyLDcgKzQ1MSw3IEBACiAgICAgICAgICAgICBLZXkga2V5ID0gKEtleSlpdC5uZXh0KCk7CiAgICAgICAgICAgICBPYmplY3QgdjEgPSBnZXQoa2V5KTsKICAgICAgICAgICAgIE9iamVjdCB2MiA9IG0uZ2V0KGtleSk7Ci0gICAgICAgICAgICBpZiAoISh2MT09bnVsbD92Mj09bnVsbDp2MS5lcXVhbHModjIpKSkgeworICAgICAgICAgICAgaWYgKCEodjEgPT0gbnVsbCA/IHYyID09IG51bGwgOiB2MS5lcXVhbHModjIpKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDg1LDI4ICs0ODQsMzAgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFJlbmRlcmluZ0hpbnRzIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgUmVuZGVyaW5nSGludHMgb2JqZWN0LiAKKyAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgUmVuZGVyaW5nSGludHMgb2JqZWN0LgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiUmVuZGVyaW5nSGludHNbIittYXAudG9TdHJpbmcoKSsiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICByZXR1cm4gIlJlbmRlcmluZ0hpbnRzWyIgKyBtYXAudG9TdHJpbmcoKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIFJlbmRlcmluZ0hpbnRzLktleSBjbGFzcyBpcyBhYnN0cmFjdCBhbmQgZGVmaW5lcyBhIGJhc2UgdHlwZSBmb3IgCi0gICAgICogYWxsIFJlbmRlcmluZ0hpbnRzIGtleXMuCisgICAgICogVGhlIFJlbmRlcmluZ0hpbnRzLktleSBjbGFzcyBpcyBhYnN0cmFjdCBhbmQgZGVmaW5lcyBhIGJhc2UgdHlwZSBmb3IgYWxsCisgICAgICogUmVuZGVyaW5nSGludHMga2V5cy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEtleSB7Ci0gICAgICAgIAorCiAgICAgICAgIC8qKiBUaGUga2V5LiAqLwogICAgICAgICBwcml2YXRlIGZpbmFsIGludCBrZXk7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBrZXkgd2l0aCB1bmlxdWUgaW50IGlkZW50aWZpZXIuIAotICAgICAgICAgKiBObyB0d28gb2JqZWN0cyBvZiB0aGUgc2FtZSBzdWJjbGFzcyB3aXRoIHRoZSBzYW1lIGludGVnZXIga2V5Ci0gICAgICAgICAqIGNhbiBiZSBpbnN0YW50aWF0ZWQuIAorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcga2V5IHdpdGggdW5pcXVlIGludGVnZXIgaWRlbnRpZmllci4gTm8gdHdvIG9iamVjdHMKKyAgICAgICAgICogb2YgdGhlIHNhbWUgc3ViY2xhc3Mgd2l0aCB0aGUgc2FtZSBpbnRlZ2VyIGtleSBjYW4gYmUgaW5zdGFudGlhdGVkLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGtleSB0aGUgdW5pcXVlIGtleS4KKyAgICAgICAgICogQHBhcmFtIGtleQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB1bmlxdWUga2V5LgogICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIEtleShpbnQga2V5KSB7CiAgICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKQEAgLTUxNSwxMCArNTE2LDEwIEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDb21wYXJlcyB0aGUgS2V5IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG8gdGhlIHNwZWNpZmllZCBPYmplY3QgdG8gYmUgY29tcGFpcmVkLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgS2V5IGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0LCAKLSAgICAgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKiBAcGFyYW0gbworICAgICAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBLZXkgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QsIGZhbHNlCisgICAgICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewpAQCAtNTM2LDExICs1MzcsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIGludCB1bmlxdWUga2V5IHdpdGggd2hpY2ggdGhpcyBLZXkgb2JqZWN0IGhhcyBiZWVuIAorICAgICAgICAgKiBSZXR1cm5zIGludGVnZXIgdW5pcXVlIGtleSB3aXRoIHdoaWNoIHRoaXMgS2V5IG9iamVjdCBoYXMgYmVlbgogICAgICAgICAgKiBpbnN0YW50aWF0ZWQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBpbnQgdW5pcXVlIGtleSB3aXRoIHdoaWNoIHRoaXMgS2V5IG9iamVjdCBoYXMgYmVlbiAKLSAgICAgICAgICogaW5zdGFudGlhdGVkLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIHVuaXF1ZSBrZXkgd2l0aCB3aGljaCB0aGlzIEtleSBvYmplY3QgaGFzIGJlZW4KKyAgICAgICAgICogICAgICAgICBpbnN0YW50aWF0ZWQuCiAgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGludEtleSgpIHsKICAgICAgICAgICAgIHJldHVybiBrZXk7CkBAIC01NDksMTAgKzU1MCwxMCBAQAogICAgICAgICAvKioKICAgICAgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHNwZWNpZmllZCB2YWx1ZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEtleS4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB2YWwgdGhlIE9iamVjdC4KLSAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSB2YWwKKyAgICAgICAgICogICAgICAgICAgICB0aGUgT2JqZWN0LgogICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBLZXksCi0gICAgICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0NvbXBhdGlibGVWYWx1ZShPYmplY3QgdmFsKTsKICAgICB9CkBAIC01NjMsOSArNTY0LDEwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgS2V5SW1wbCBleHRlbmRzIEtleSB7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBrZXkgaW1wbC4KKyAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGtleSBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleQorICAgICAgICAgKiBAcGFyYW0ga2V5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGtleS4KICAgICAgICAgICovCiAgICAgICAgIHByb3RlY3RlZCBLZXlJbXBsKGludCBrZXkpIHsKICAgICAgICAgICAgIHN1cGVyKGtleSk7CkBAIC01ODUsMTQgKzU4NywxNyBAQAogICAgICAqIFByaXZhdGUgY2xhc3MgS2V5VmFsdWUgaXMgdXNlZCBhcyB2YWx1ZSBmb3IgS2V5IGNsYXNzIGluc3RhbmNlLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEtleVZhbHVlIHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUga2V5LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUga2V5LgorICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBmaW5hbCBLZXkga2V5OwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcga2V5IHZhbHVlLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGtleSB0aGUga2V5CisgICAgICAgICAqIEBwYXJhbSBrZXkKKyAgICAgICAgICogICAgICAgICAgICB0aGUga2V5LgogICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIEtleVZhbHVlKEtleSBrZXkpIHsKICAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5OwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L1NoYXBlLmphdmEgYi9hd3QvamF2YS9hd3QvU2hhcGUuamF2YQppbmRleCAzZGJhZDI1Li41OWJjNjIzIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvU2hhcGUuamF2YQorKysgYi9hd3QvamF2YS9hd3QvU2hhcGUuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBBbGV4ZXkgQS4gUGV0cmVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5hd3QuZ2VvbS5BZmZpbmVUcmFuc2Zvcm07CkBAIC0yNiwxMzcgKzI3LDEzNiBAQAogaW1wb3J0IGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQ7CiAKIC8qKgotICogVGhlIFNoYXBlIGludGVyZmFjZSBkZWZpbmVzIGEgZ2VvbWV0cmljIHNoYXBlIGRlZmluZWQgYnkgYSBib3VuZGFyeSAKLSAqIChvdXRsaW5lKSBwYXRoLiBUaGUgcGF0aCBvdXRsaW5lIGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIGEgCi0gKiBQYXRoSXRlcmF0b3Igb2JqZWN0LiBUaGUgU2hhcGUgCi0gKiBpbnRlcmZhY2UgcHJvdmlkZXMgbWV0aG9kcyBmb3Igb2J0YWluaW5nIHRoZSBib3VuZGluZyBib3ggKHdoaWNoIGlzIAotICogdGhlIHNtYWxsZXN0IHJlY3RhbmdsZSBjb250YWluaW5nIHRoZSBzaGFwZSBhbmQgZm9yIG9idGFpbmluZyBhIFBhdGhJdGVyYXRvciAKLSAqIG9iamVjdCBmb3IgY3VycmVudCBTaGFwZSwgYXMgd2VsbCBhcyB1dGlsaXR5IG1ldGhvZHMgd2hpY2ggCi0gKiBkZXRlcm1pbmUgaWYgdGhlIFNoYXBlIGNvbnRhaW5zIG9yIGludGVyc2VjdHMgYSBSZWN0YW5nbGUgb3IgY29udGFpbnMgYSBQb2ludC4KKyAqIFRoZSBTaGFwZSBpbnRlcmZhY2UgZGVmaW5lcyBhIGdlb21ldHJpYyBzaGFwZSBkZWZpbmVkIGJ5IGEgYm91bmRhcnkgKG91dGxpbmUpCisgKiBwYXRoLiBUaGUgcGF0aCBvdXRsaW5lIGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIGEgUGF0aEl0ZXJhdG9yIG9iamVjdC4gVGhlCisgKiBTaGFwZSBpbnRlcmZhY2UgcHJvdmlkZXMgbWV0aG9kcyBmb3Igb2J0YWluaW5nIHRoZSBib3VuZGluZyBib3ggKHdoaWNoIGlzIHRoZQorICogc21hbGxlc3QgcmVjdGFuZ2xlIGNvbnRhaW5pbmcgdGhlIHNoYXBlIGFuZCBmb3Igb2J0YWluaW5nIGEgUGF0aEl0ZXJhdG9yCisgKiBvYmplY3QgZm9yIGN1cnJlbnQgU2hhcGUsIGFzIHdlbGwgYXMgdXRpbGl0eSBtZXRob2RzIHdoaWNoIGRldGVybWluZSBpZiB0aGUKKyAqIFNoYXBlIGNvbnRhaW5zIG9yIGludGVyc2VjdHMgYSBSZWN0YW5nbGUgb3IgY29udGFpbnMgYSBQb2ludC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgU2hhcGUgewotICAgIAorCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBwb2ludCB3aXRoIHNwZWNpZmllZCBjb29yZGluYXRlcyBsaWVzIGluc2lkZSAKKyAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHBvaW50IHdpdGggc3BlY2lmaWVkIGNvb3JkaW5hdGVzIGxpZXMgaW5zaWRlCiAgICAgICogdGhlIFNoYXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMgbGllIGluc2lkZSB0aGUgU2hhcGUsCi0gICAgICogb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBjb29yZGluYXRlcyBsaWUgaW5zaWRlIHRoZSBTaGFwZSwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhkb3VibGUgeCwgZG91YmxlIHkpOwogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSByZWN0YW5nbGUgd2l0aCBzcGVjaWZpZWQgCi0gICAgICogW3gsIHksIHdpZHRoLCBoZWlnaHRdIHBhcmFtZXRlcnMgbGllcyBpbnNpZGUgdGhlIFNoYXBlLgorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcmVjdGFuZ2xlIHdpdGggc3BlY2lmaWVkIFt4LCB5LCB3aWR0aCwgaGVpZ2h0XQorICAgICAqIHBhcmFtZXRlcnMgbGllcyBpbnNpZGUgdGhlIFNoYXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGRvdWJsZSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IAotICAgICAqIGNvcm5lci4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBkb3VibGUgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCAKLSAgICAgKiBjb3JuZXIuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGxpZXMgaW5zaWRlIHRoZSBTaGFwZSwKLSAgICAgKiBvdGhlcndpc2UgZmFsc2UuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGRvdWJsZSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgZG91YmxlIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGxpZXMgaW5zaWRlIHRoZSBTaGFwZSwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3LCBkb3VibGUgaCk7CiAKICAgICAvKioKICAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBQb2ludDJEIGxpZXMgaW5zaWRlIHRoZSBTaGFwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcG9pbnQgdGhlIFBvaW50MkQgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBQb2ludDJEIGxpZXMgaW5zaWRlIHRoZSBTaGFwZSwKLSAgICAgKiBvdGhlcndpc2UgZmFsc2UuCisgICAgICogQHBhcmFtIHBvaW50CisgICAgICogICAgICAgICAgICB0aGUgUG9pbnQyRCBvYmplY3QuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIFBvaW50MkQgbGllcyBpbnNpZGUgdGhlIFNoYXBlLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFBvaW50MkQgcG9pbnQpOwogCiAgICAgLyoqCiAgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGxpZXMgaW5zaWRlIHRoZSBTaGFwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gciB0aGUgUmVjdGFuZ2xlMkQgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgbGllcyBpbnNpZGUgdGhlIFNoYXBlLAotICAgICAqIG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIFJlY3RhbmdsZTJEIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGxpZXMgaW5zaWRlIHRoZSBTaGFwZSwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhSZWN0YW5nbGUyRCByKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgU2hhcGUuIFRoZSBib3VuZGluZyByZWN0YW5nbGUKLSAgICAgKiBpcyB0aGUgc21hbGxlc3QgcmVjdGFuZ2xlIHdoaWNoIGNvbnRhaW5zIHRoZSBTaGFwZS4KKyAgICAgKiBHZXRzIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgdGhlIFNoYXBlLiBUaGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIHRoZQorICAgICAqIHNtYWxsZXN0IHJlY3RhbmdsZSB3aGljaCBjb250YWlucyB0aGUgU2hhcGUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBTaGFwZS4KICAgICAgKi8KICAgICBwdWJsaWMgUmVjdGFuZ2xlIGdldEJvdW5kcygpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgUmVjdGFuZ2xlMkQgd2hpY2ggcmVwcmVzZW50cyBTaGFwZSBib3VuZHMuCi0gICAgICogVGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBpcyB0aGUgc21hbGxlc3QgcmVjdGFuZ2xlIHdoaWNoIGNvbnRhaW5zIAotICAgICAqIHRoZSBTaGFwZS4KKyAgICAgKiBHZXRzIHRoZSBSZWN0YW5nbGUyRCB3aGljaCByZXByZXNlbnRzIFNoYXBlIGJvdW5kcy4gVGhlIGJvdW5kaW5nCisgICAgICogcmVjdGFuZ2xlIGlzIHRoZSBzbWFsbGVzdCByZWN0YW5nbGUgd2hpY2ggY29udGFpbnMgdGhlIFNoYXBlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgU2hhcGUuCiAgICAgICovCiAgICAgcHVibGljIFJlY3RhbmdsZTJEIGdldEJvdW5kczJEKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBQYXRoSXRlcmF0b3Igb2JqZWN0IG9mIHRoZSBTaGFwZSB3aGljaCBwcm92aWRlcyAKLSAgICAgKiBhY2Nlc3MgdG8gdGhlIHNoYXBlJ3MgYm91bmRhcnkgbW9kaWZpZWQgCi0gICAgICogYnkgdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0uCisgICAgICogR2V0cyB0aGUgUGF0aEl0ZXJhdG9yIG9iamVjdCBvZiB0aGUgU2hhcGUgd2hpY2ggcHJvdmlkZXMgYWNjZXNzIHRvIHRoZQorICAgICAqIHNoYXBlJ3MgYm91bmRhcnkgbW9kaWZpZWQgYnkgdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGF0IHRoZSBzcGVjaWZpZWQgQWZmaW5lVHJhbnNmb3JtIG9iamVjdCwgb3IgbnVsbC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgQWZmaW5lVHJhbnNmb3JtIG9iamVjdCBvciBudWxsLgogICAgICAqIEByZXR1cm4gUGF0aEl0ZXJhdG9yIG9iamVjdCBmb3IgdGhlIFNoYXBlLgogICAgICAqLwogICAgIHB1YmxpYyBQYXRoSXRlcmF0b3IgZ2V0UGF0aEl0ZXJhdG9yKEFmZmluZVRyYW5zZm9ybSBhdCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBQYXRoSXRlcmF0b3Igb2JqZWN0IG9mIHRoZSBTaGFwZSB3aGljaCBwcm92aWRlcyAKLSAgICAgKiBhY2Nlc3MgdG8gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBzaGFwZXMgYm91bmRhcnkgbW9kaWZpZWQgCi0gICAgICogYnkgdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0uIFRoZSBmbGF0bmVzcyBwYXJhbWV0ZXIKLSAgICAgKiBkZWZpbmVzIHRoZSBhbW91bnQgb2Ygc3ViZGl2aXNpb24gb2YgdGhlIGN1cnZlZCBzZWdtZW50cyBhbmQKLSAgICAgKiBzcGVjaWZpZXMgdGhlIG1heGltdW0gZGlzdGFuY2Ugd2hpY2ggZXZlcnkgcG9pbnQgb24gdGhlIAotICAgICAqIHVuZmxhdHRlbmVkIHRyYW5zZm9ybWVkIGN1cnZlIGNhbiBkZXZpYXRlIGZyb20gdGhlIHJldHVybmVkIAotICAgICAqIGZsYXR0ZW5lZCBwYXRoIHNlZ21lbnRzLiAgCisgICAgICogR2V0cyB0aGUgUGF0aEl0ZXJhdG9yIG9iamVjdCBvZiB0aGUgU2hhcGUgd2hpY2ggcHJvdmlkZXMgYWNjZXNzIHRvIHRoZQorICAgICAqIGNvb3JkaW5hdGVzIG9mIHRoZSBzaGFwZXMgYm91bmRhcnkgbW9kaWZpZWQgYnkgdGhlIHNwZWNpZmllZAorICAgICAqIEFmZmluZVRyYW5zZm9ybS4gVGhlIGZsYXRuZXNzIHBhcmFtZXRlciBkZWZpbmVzIHRoZSBhbW91bnQgb2Ygc3ViZGl2aXNpb24KKyAgICAgKiBvZiB0aGUgY3VydmVkIHNlZ21lbnRzIGFuZCBzcGVjaWZpZXMgdGhlIG1heGltdW0gZGlzdGFuY2Ugd2hpY2ggZXZlcnkKKyAgICAgKiBwb2ludCBvbiB0aGUgdW5mbGF0dGVuZWQgdHJhbnNmb3JtZWQgY3VydmUgY2FuIGRldmlhdGUgZnJvbSB0aGUgcmV0dXJuZWQKKyAgICAgKiBmbGF0dGVuZWQgcGF0aCBzZWdtZW50cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXQgdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0gb2JqZWN0LCBvciBudWxsLgotICAgICAqIEBwYXJhbSBmbGF0bmVzcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGhlIGNvbnRyb2wgcG9pbnRzIGZvciAKLSAgICAgKiBhIGdpdmVuIGN1cnZlIHdoaWNoIHZhcmllcyBmcm9tIGNvbGluZWFyIGJlZm9yZSBhIHN1YmRpdmlkZWQgCi0gICAgICogY3VydmUgaXMgcmVwbGFjZWQgYnkgYSBzdHJhaWdodCBsaW5lIGNvbm5lY3RpbmcgdGhlIGVuZHBvaW50cy4gCi0gICAgICogCisgICAgICogQHBhcmFtIGF0CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIEFmZmluZVRyYW5zZm9ybSBvYmplY3Qgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gZmxhdG5lc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aGUgY29udHJvbCBwb2ludHMgZm9yIGEgZ2l2ZW4gY3VydmUKKyAgICAgKiAgICAgICAgICAgIHdoaWNoIHZhcmllcyBmcm9tIGNvbGluZWFyIGJlZm9yZSBhIHN1YmRpdmlkZWQgY3VydmUgaXMKKyAgICAgKiAgICAgICAgICAgIHJlcGxhY2VkIGJ5IGEgc3RyYWlnaHQgbGluZSBjb25uZWN0aW5nIHRoZSBlbmRwb2ludHMuCiAgICAgICogQHJldHVybiBQYXRoSXRlcmF0b3Igb2JqZWN0IGZvciB0aGUgU2hhcGUuCiAgICAgICovCiAgICAgcHVibGljIFBhdGhJdGVyYXRvciBnZXRQYXRoSXRlcmF0b3IoQWZmaW5lVHJhbnNmb3JtIGF0LCBkb3VibGUgZmxhdG5lc3MpOwogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBpbnRlcmlvciBvZiByZWN0YW5ndWxhciBzcGVjaWZpZWQgYnkgCi0gICAgICogW3gsIHksIHdpZHRoLCBoZWlnaHRdIHBhcmFtZXRlcnMgaW50ZXJzZWN0cyB0aGUgaW50ZXJpb3Igb2YKLSAgICAgKiB0aGUgU2hhcGUuCisgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBpbnRlcmlvciBvZiByZWN0YW5ndWxhciBzcGVjaWZpZWQgYnkgW3gsIHksCisgICAgICogd2lkdGgsIGhlaWdodF0gcGFyYW1ldGVycyBpbnRlcnNlY3RzIHRoZSBpbnRlcmlvciBvZiB0aGUgU2hhcGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggZG91YmxlIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQKLSAgICAgKiBjb3JuZXIuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgZG91YmxlIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgCi0gICAgICogY29ybmVyLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcmVjdGFuZ2xlIHNwZWNpZmllZCBieSAKLSAgICAgKiBbeCwgeSwgd2lkdGgsIGhlaWdodF0gcGFyYW1ldGVycyBpbnRlcnNlY3RzIHRoZSBpbnRlcmlvciBvZgotICAgICAqIHRoZSBTaGFwZSwgb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBkb3VibGUgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGRvdWJsZSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcmVjdGFuZ2xlIHNwZWNpZmllZCBieSBbeCwgeSwgd2lkdGgsIGhlaWdodF0KKyAgICAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW50ZXJzZWN0cyB0aGUgaW50ZXJpb3Igb2YgdGhlIFNoYXBlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0cyhkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3LCBkb3VibGUgaCk7CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIGludGVyaW9yIG9mIHJlY3RhbmdsIHNwZWNpZmllZCBieSAKLSAgICAgKiBSZWN0YW5nbGUyRCBvYmplY3QgaW50ZXJzZWN0cyB0aGUgaW50ZXJpb3Igb2YgdGhlIFNoYXBlLgorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgaW50ZXJpb3Igb2YgcmVjdGFuZ2xlIHNwZWNpZmllZCBieSBSZWN0YW5nbGUyRAorICAgICAqIG9iamVjdCBpbnRlcnNlY3RzIHRoZSBpbnRlcmlvciBvZiB0aGUgU2hhcGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIFJlY3RhbmdsZTJEIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBSZWN0YW5nbGUyRCBpbnRlcnNlY3RzIHRoZSBpbnRlcmlvciBvZgotICAgICAqIHRoZSBTaGFwZSwgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgUmVjdGFuZ2xlMkQgb2JqZWN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIFJlY3RhbmdsZTJEIGludGVyc2VjdHMgdGhlIGludGVyaW9yIG9mIHRoZSBTaGFwZSwKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSBmYWxzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3RzKFJlY3RhbmdsZTJEIHIpOwogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L1N0cm9rZS5qYXZhIGIvYXd0L2phdmEvYXd0L1N0cm9rZS5qYXZhCmluZGV4IGU2ZDY4M2QuLjZkMTdhMjMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9TdHJva2UuamF2YQorKysgYi9hd3QvamF2YS9hd3QvU3Ryb2tlLmphdmEKQEAgLTE4LDI5ICsxOCwzMiBAQAogICogQGF1dGhvciBBbGV4ZXkgQS4gUGV0cmVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiAvKioKLSAqIFRoZSBTdHJva2UgaW50ZXJmYWNlIGdpdmVzIGEgcGVuIHN0eWxlIHRvIGJlIHVzZWQgYnkgdGhlIAotICogR3JhcGhpY3MyRCBpbnRlcmZhY2UuIEl0IHByb3ZpZGVzIGEgbWVhbnMgZm9yIGdldHRpbmcgYSBzdHJva2VkIHZlcnNpb24gCi0gKiBvZiBhIHNoYXBlLCB3aGljaCBpcyB0aGUgdmVyc2lvbiB0aGF0IGlzIHN1aXRhYmxlIGZvciBkcmF3aW5nIHZpYSAKLSAqIHRoZSBHcmFwaGljczJEIGludGVyZmFjZS4gU3Ryb2tpbmcgYSBzaGFwZSBnaXZlcyB0aGUgc2hhcGUncyBvdXRsaW5lCi0gKiBhIHdpZHRoIG9yIGRyYXdpbmcgc3R5bGUuIAorICogVGhlIFN0cm9rZSBpbnRlcmZhY2UgZ2l2ZXMgYSBwZW4gc3R5bGUgdG8gYmUgdXNlZCBieSB0aGUgR3JhcGhpY3MyRAorICogaW50ZXJmYWNlLiBJdCBwcm92aWRlcyBhIG1lYW5zIGZvciBnZXR0aW5nIGEgc3Ryb2tlZCB2ZXJzaW9uIG9mIGEgc2hhcGUsCisgKiB3aGljaCBpcyB0aGUgdmVyc2lvbiB0aGF0IGlzIHN1aXRhYmxlIGZvciBkcmF3aW5nIHZpYSB0aGUgR3JhcGhpY3MyRAorICogaW50ZXJmYWNlLiBTdHJva2luZyBhIHNoYXBlIGdpdmVzIHRoZSBzaGFwZSdzIG91dGxpbmUgYSB3aWR0aCBvciBkcmF3aW5nCisgKiBzdHlsZS4KICAqIDxwPgotICogVGhlIERyYXcgbWV0aG9kcyBmcm9tIEdyYXBoaWNzMkQgaW50ZXJmYWNlIHNob3VsZCB1c2UgdGhlIFN0cm9rZSBvYmplY3QgZm9yIAotICogcmVuZGVyaW5nIHRoZSBzaGFwZSdzIG91dGxpbmUuIFRoZSBzdHJva2Ugc2hvdWxkIGJlIHNldCBieSAKLSAqIHNldFN0cm9rZShqYXZhLmF3dC5TdHJva2UpIG1ldGhvZCBvZiB0aGUgR3JhcGhpY3MyRCBpbnRlcmZhY2UuIAorICogVGhlIERyYXcgbWV0aG9kcyBmcm9tIEdyYXBoaWNzMkQgaW50ZXJmYWNlIHNob3VsZCB1c2UgdGhlIFN0cm9rZSBvYmplY3QgZm9yCisgKiByZW5kZXJpbmcgdGhlIHNoYXBlJ3Mgb3V0bGluZS4gVGhlIHN0cm9rZSBzaG91bGQgYmUgc2V0IGJ5CisgKiBzZXRTdHJva2UoamF2YS5hd3QuU3Ryb2tlKSBtZXRob2Qgb2YgdGhlIEdyYXBoaWNzMkQgaW50ZXJmYWNlLgorICogCiAgKiBAc2VlIGphdmEuYXd0LkdyYXBoaWNzMkQjc2V0U3Ryb2tlKGphdmEuYXd0LlN0cm9rZSkKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFN0cm9rZSB7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBzdHJva2VkIHNoYXBlLCB3aGljaCBpcyB0aGUgdmVyc2lvbiB0aGF0IGlzIHN1aXRhYmxlIGZvciBkcmF3aW5nIHZpYSAKLSAgICAgKiB0aGUgR3JhcGhpY3MyRCBpbnRlcmZhY2UuIFN0cm9raW5nIGEgc2hhcGUgZ2l2ZXMgdGhlIHNoYXBlJ3Mgb3V0bGluZQotICAgICAqIGEgd2lkdGggb3IgZHJhd2luZyBzdHlsZS4KKyAgICAgKiBDcmVhdGVzIHRoZSBzdHJva2VkIHNoYXBlLCB3aGljaCBpcyB0aGUgdmVyc2lvbiB0aGF0IGlzIHN1aXRhYmxlIGZvcgorICAgICAqIGRyYXdpbmcgdmlhIHRoZSBHcmFwaGljczJEIGludGVyZmFjZS4gU3Ryb2tpbmcgYSBzaGFwZSBnaXZlcyB0aGUgc2hhcGUncworICAgICAqIG91dGxpbmUgYSB3aWR0aCBvciBkcmF3aW5nIHN0eWxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIHRoZSBvcmlnaW5hbCBzaGFwZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcAorICAgICAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIHNoYXBlLgogICAgICAqIEByZXR1cm4gdGhlIHN0cm9rZWQgc2hhcGUuCiAgICAgICovCiAgICAgcHVibGljIFNoYXBlIGNyZWF0ZVN0cm9rZWRTaGFwZShTaGFwZSBwKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9Ub29sa2l0LmphdmEgYi9hd3QvamF2YS9hd3QvVG9vbGtpdC5qYXZhCmluZGV4IDBjMDY2YjIuLmUzOGQ1MjQgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9Ub29sa2l0LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L1Rvb2xraXQuamF2YQpAQCAtNTYsMzQgKzU2LDUwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC53dGsuU2h1dGRvd25XYXRjaGRvZzsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0Lnd0ay5TeW5jaHJvbml6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC53dGsuV1RLOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247CiAKIC8qKgotICogVGhlIFRvb2xraXQgY2xhc3MgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyAKLSAqIEFic3RyYWN0IFdpbmRvdyBUb29sa2l0IGltcGxlbWVudGF0aW9uLiBUb29sa2l0J3Mgc3ViY2xhc3NlcyAKLSAqIGFyZSB1c2VkIHRvIGJpbmQgdGhlIHZhcmlvdXMgY29tcG9uZW50cyB0byBwYXJ0aWN1bGFyIG5hdGl2ZSAKLSAqIHRvb2xraXQgaW1wbGVtZW50YXRpb25zLgorICogVGhlIFRvb2xraXQgY2xhc3MgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBBYnN0cmFjdAorICogV2luZG93IFRvb2xraXQgaW1wbGVtZW50YXRpb24uIFRvb2xraXQncyBzdWJjbGFzc2VzIGFyZSB1c2VkIHRvIGJpbmQgdGhlCisgKiB2YXJpb3VzIGNvbXBvbmVudHMgdG8gcGFydGljdWxhciBuYXRpdmUgdG9vbGtpdCBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVG9vbGtpdCB7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBSRUNPVVJDRV9QQVRILiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFJFQ09VUkNFX1BBVEguCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ09VUkNFX1BBVEggPSAib3JnLmFwYWNoZS5oYXJtb255LmF3dC5yZXNvdXJjZXMuQVdUUHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IHByb3BlcnRpZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgcHJvcGVydGllcy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBwcm9wZXJ0aWVzID0gbG9hZFJlc291cmNlcyhSRUNPVVJDRV9QQVRIKTsKLSAgICAKLSAgICAvKiogVGhlIGRpc3BhdGNoZXIuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlzcGF0Y2hlci4KKyAgICAgKi8KICAgICBEaXNwYXRjaGVyIGRpc3BhdGNoZXI7CiAKLSAgICAvKiogVGhlIHN5c3RlbSBldmVudCBxdWV1ZSBjb3JlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzeXN0ZW0gZXZlbnQgcXVldWUgY29yZS4KKyAgICAgKi8KICAgICBwcml2YXRlIEV2ZW50UXVldWVDb3JlIHN5c3RlbUV2ZW50UXVldWVDb3JlOwogCi0gICAgLyoqIFRoZSBkaXNwYXRjaCB0aHJlYWQuICovCisgICAgLyoqCisgICAgICogVGhlIGRpc3BhdGNoIHRocmVhZC4KKyAgICAgKi8KICAgICBFdmVudERpc3BhdGNoVGhyZWFkIGRpc3BhdGNoVGhyZWFkOwogCi0gICAgLyoqIFRoZSBuYXRpdmUgdGhyZWFkLiAqLworICAgIC8qKgorICAgICAqIFRoZSBuYXRpdmUgdGhyZWFkLgorICAgICAqLwogICAgIE5hdGl2ZUV2ZW50VGhyZWFkIG5hdGl2ZVRocmVhZDsKIAotICAgIC8qKiBUaGUgYXd0IGV2ZW50cyBtYW5hZ2VyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBBV1QgZXZlbnRzIG1hbmFnZXIuCisgICAgICovCiAgICAgcHJvdGVjdGVkIEFXVEV2ZW50c01hbmFnZXIgYXd0RXZlbnRzTWFuYWdlcjsKIAogICAgIC8qKgpAQCAtOTIsNDcgKzEwOCw2OCBAQAogICAgIHByaXZhdGUgY2xhc3MgQVdUVHJlZUxvY2sgewogICAgIH0KIAotICAgIC8qKiBUaGUgYXd0IHRyZWUgbG9jay4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQVdUIHRyZWUgbG9jay4KKyAgICAgKi8KICAgICBmaW5hbCBPYmplY3QgYXd0VHJlZUxvY2sgPSBuZXcgQVdUVHJlZUxvY2soKTsKIAotICAgIC8qKiBUaGUgc3luY2hyb25pemVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzeW5jaHJvbml6ZXIuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gQ29udGV4dFN0b3JhZ2UuZ2V0U3luY2hyb25pemVyKCk7CiAKLSAgICAvKiogVGhlIHNodXRkb3duIHdhdGNoZG9nLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzaHV0ZG93biB3YXRjaGRvZy4KKyAgICAgKi8KICAgICBmaW5hbCBTaHV0ZG93bldhdGNoZG9nIHNodXRkb3duV2F0Y2hkb2cgPSBuZXcgU2h1dGRvd25XYXRjaGRvZygpOwogCi0gICAgLyoqIFRoZSBhdXRvIG51bWJlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgYXV0byBudW1iZXIuCisgICAgICovCiAgICAgZmluYWwgQXV0b051bWJlciBhdXRvTnVtYmVyID0gbmV3IEF1dG9OdW1iZXIoKTsKIAotICAgIC8qKiBUaGUgZXZlbnQgdHlwZSBsb29rdXAuICovCisgICAgLyoqCisgICAgICogVGhlIGV2ZW50IHR5cGUgbG9va3VwLgorICAgICAqLwogICAgIGZpbmFsIEFXVEV2ZW50LkV2ZW50VHlwZUxvb2t1cCBldmVudFR5cGVMb29rdXAgPSBuZXcgQVdURXZlbnQuRXZlbnRUeXBlTG9va3VwKCk7CiAKLSAgICAvKiogVGhlIGIgZHluYW1pYyBsYXlvdXQgc2V0LiAqLyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgYiBkeW5hbWljIGxheW91dCBzZXQuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGJEeW5hbWljTGF5b3V0U2V0ID0gdHJ1ZTsKIAotICAgIC8qKiBUaGUgc2V0IG9mIGRlc2t0b3AgcHJvcGVydGllcyB0aGF0IHVzZXIgc2V0IGRpcmVjdGx5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgZGVza3RvcCBwcm9wZXJ0aWVzIHRoYXQgdXNlciBzZXQgZGlyZWN0bHkuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoU2V0PFN0cmluZz4gdXNlclByb3BTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CiAKLSAgICAvKiogVGhlIGRlc2t0b3AgcHJvcGVydGllcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZGVza3RvcCBwcm9wZXJ0aWVzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGRlc2t0b3BQcm9wZXJ0aWVzOwogCi0gICAgLyoqIFRoZSBkZXNrdG9wIHByb3BzIHN1cHBvcnQuICovCisgICAgLyoqCisgICAgICogVGhlIGRlc2t0b3AgcHJvcHMgc3VwcG9ydC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IGRlc2t0b3BQcm9wc1N1cHBvcnQ7CiAKICAgICAvKioKLSAgICAgKiBGb3IgdGhpcyBjb21wb25lbnQgdGhlIG5hdGl2ZSB3aW5kb3cgaXMgYmVpbmcgY3JlYXRlZAotICAgICAqIEl0IGlzIHVzZWQgaW4gdGhlIGNhbGxiYWNrLWRyaXZlbiB3aW5kb3cgY3JlYXRpb24KLSAgICAgKiAoZS5nLiBvbiBXaW5kb3dzIGluIHRoZSBoYW5kbGVyIG9mIFdNX0NSRUFURSBldmVudCkKLSAgICAgKiB0byBlc3RhYmxpc2ggdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGlzIGNvbXBvbmVudAotICAgICAqIGFuZCBpdHMgbmF0aXZlIHdpbmRvdy4KKyAgICAgKiBGb3IgdGhpcyBjb21wb25lbnQgdGhlIG5hdGl2ZSB3aW5kb3cgaXMgYmVpbmcgY3JlYXRlZCBJdCBpcyB1c2VkIGluIHRoZQorICAgICAqIGNhbGxiYWNrLWRyaXZlbiB3aW5kb3cgY3JlYXRpb24gKGUuZy4gb24gV2luZG93cyBpbiB0aGUgaGFuZGxlciBvZgorICAgICAqIFdNX0NSRUFURSBldmVudCkgdG8gZXN0YWJsaXNoIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhpcyBjb21wb25lbnQgYW5kCisgICAgICogaXRzIG5hdGl2ZSB3aW5kb3cuCiAgICAgICovCiAgICAgcHJpdmF0ZSBPYmplY3QgcmVjZW50TmF0aXZlV2luZG93Q29tcG9uZW50OwogCi0gICAgLyoqIFRoZSB3dGsuICovCisgICAgLyoqCisgICAgICogVGhlIHd0ay4KKyAgICAgKi8KICAgICBwcml2YXRlIFdUSyB3dGs7CiAKICAgICAvKioKICAgICAgKiBUaGUgQ2xhc3MgQ29tcG9uZW50SW50ZXJuYWxzSW1wbC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgY2xhc3MgQ29tcG9uZW50SW50ZXJuYWxzSW1wbCBleHRlbmRzIENvbXBvbmVudEludGVybmFscyB7CiAKQEAgLTE0MywxMyArMTgwLDE1IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgewogICAgICAgICAgICAgZGlzcGF0Y2hUaHJlYWQuc2h1dGRvd24oKTsKICAgICAgICAgfQotICAgICAgIAorCiAgICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBkZXNrdG9wIHByb3BlcnR5IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgYW5kIGZpcmVzIGEgcHJvcGVydHkgCi0gICAgICAgICAqIGNoYW5nZSBldmVudC4gIAorICAgICAgICAgKiBTZXRzIHRoZSBkZXNrdG9wIHByb3BlcnR5IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgYW5kIGZpcmVzIGEgcHJvcGVydHkKKyAgICAgICAgICogY2hhbmdlIGV2ZW50LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgcHJvcGVydHkuCi0gICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHByb3BlcnR5LgorICAgICAgICAgKiBAcGFyYW0gbmFtZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHByb3BlcnR5LgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHByb3BlcnR5LgogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldERlc2t0b3BQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CkBAIC0xNTcsMTIgKzE5NiwxMiBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKLSAgICAgKiBBIGxvdCBvZiBtZXRob2RzIG11c3QgdGhyb3cgSGVhZGxlc3NFeGNlcHRpb24KLSAgICAgKiBpZiA8Y29kZT5HcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKTwvY29kZT4gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKiBBIGxvdCBvZiBtZXRob2RzIG11c3QgdGhyb3cgSGVhZGxlc3NFeGNlcHRpb24gaWYKKyAgICAgKiA8Y29kZT5HcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKTwvY29kZT4gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPi4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHRoZSBoZWFkbGVzcyBleGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgdGhlIGhlYWRsZXNzIGV4Y2VwdGlvbi4KICAgICAgKi8KICAgICBzdGF0aWMgdm9pZCBjaGVja0hlYWRsZXNzKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKEdyYXBoaWNzRW52aXJvbm1lbnQuZ2V0TG9jYWxHcmFwaGljc0Vudmlyb25tZW50KCkuaXNIZWFkbGVzc0luc3RhbmNlKCkpCkBAIC0xNzAsNTEgKzIwOSw0OSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvY2sgYXd0LgorICAgICAqIExvY2sgQVdULgogICAgICAqLwogICAgIGZpbmFsIHZvaWQgbG9ja0FXVCgpIHsKICAgICAgICAgc3luY2hyb25pemVyLmxvY2soKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTdGF0aWMgbG9jayBhd3QuCisgICAgICogU3RhdGljIGxvY2sgQVdULgogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCB2b2lkIHN0YXRpY0xvY2tBV1QoKSB7CiAgICAgICAgIENvbnRleHRTdG9yYWdlLmdldFN5bmNocm9uaXplcigpLmxvY2soKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBVbmxvY2sgYXd0LgorICAgICAqIFVubG9jayBBV1QuCiAgICAgICovCiAgICAgZmluYWwgdm9pZCB1bmxvY2tBV1QoKSB7CiAgICAgICAgIHN5bmNocm9uaXplci51bmxvY2soKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTdGF0aWMgdW5sb2NrIGF3dC4KKyAgICAgKiBTdGF0aWMgdW5sb2NrIEFXVC4KICAgICAgKi8KICAgICBzdGF0aWMgZmluYWwgdm9pZCBzdGF0aWNVbmxvY2tBV1QoKSB7CiAgICAgICAgIENvbnRleHRTdG9yYWdlLmdldFN5bmNocm9uaXplcigpLnVubG9jaygpOwotICAgIH0gICAgCisgICAgfQogCiAgICAgLyoqCi0gICAgICogSW52b2tlQW5kV2FpdCB1bmRlciBBV1QgbG9jay4gVy9vIHRoaXMgbWV0aG9kIHN5c3RlbSBjYW4gaGFuZyB1cC4KLSAgICAgKiBBZGRlZCB0byBzdXBwb3J0IG1vZGFsaXR5IChEaWFsb2cuc2hvdygpICYgUG9wdXBNZW51LnNob3coKSkgZnJvbQotICAgICAqIG5vdCBldmVudCBkaXNwYXRjaCB0aHJlYWQuIFVzZSBpbiBvdGhlciBjYXNlcyBpcyBub3QgcmVjb21tZW5kZWQuCi0gICAgICoKLSAgICAgKiBTdGlsbCBjYW4gYmUgY2FsbGVkIG9ubHkgZm9yIHdob2xlIEFQSSBtZXRob2RzIHRoYXQKLSAgICAgKiBjYW5ub3QgYmUgY2FsbGVkIGZyb20gb3RoZXIgY2xhc3NlcyBBUEkgbWV0aG9kcy4KLSAgICAgKiBFeGFtcGxlczoKLSAgICAgKiAgICAgIHNob3coKSBmb3IgbW9kYWwgZGlhbG9ncyAgICAtIGNvcnJlY3QsIG9ubHkgdXNlciBjYW4gY2FsbCBpdCwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0bHkgb3IgdGhyb3VnaCBzZXRWaXNpYmxlKHRydWUpCi0gICAgICogICAgICBzZXRCb3VuZHMoKSBmb3IgY29tcG9uZW50cyAgLSBpbmNvcnJlY3QsIHNldEJvdW5kcygpCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBjYWxsZWQgZnJvbSBsYXlvdXRDb250YWluZXIoKQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGF5b3V0IG1hbmFnZXJzCisgICAgICogSW52b2tlQW5kV2FpdCB1bmRlciBBV1QgbG9jay4gVy9vIHRoaXMgbWV0aG9kIHN5c3RlbSBjYW4gaGFuZyB1cC4gQWRkZWQKKyAgICAgKiB0byBzdXBwb3J0IG1vZGFsaXR5IChEaWFsb2cuc2hvdygpICYgUG9wdXBNZW51LnNob3coKSkgZnJvbSBub3QgZXZlbnQKKyAgICAgKiBkaXNwYXRjaCB0aHJlYWQuIFVzZSBpbiBvdGhlciBjYXNlcyBpcyBub3QgcmVjb21tZW5kZWQuIFN0aWxsIGNhbiBiZQorICAgICAqIGNhbGxlZCBvbmx5IGZvciB3aG9sZSBBUEkgbWV0aG9kcyB0aGF0IGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBvdGhlcgorICAgICAqIGNsYXNzZXMgQVBJIG1ldGhvZHMuIEV4YW1wbGVzOiBzaG93KCkgZm9yIG1vZGFsIGRpYWxvZ3MgLSBjb3JyZWN0LCBvbmx5CisgICAgICogdXNlciBjYW4gY2FsbCBpdCwgZGlyZWN0bHkgb3IgdGhyb3VnaCBzZXRWaXNpYmxlKHRydWUpIHNldEJvdW5kcygpIGZvcgorICAgICAqIGNvbXBvbmVudHMgLSBpbmNvcnJlY3QsIHNldEJvdW5kcygpIGNhbiBiZSBjYWxsZWQgZnJvbSBsYXlvdXRDb250YWluZXIoKQorICAgICAqIGZvciBsYXlvdXQgbWFuYWdlcnMKICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcnVubmFibGUgdGhlIHJ1bm5hYmxlCi0gICAgICogCi0gICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB0aGUgaW50ZXJydXB0ZWQgZXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHRoZSBpbnZvY2F0aW9uIHRhcmdldCBleGNlcHRpb24KKyAgICAgKiBAcGFyYW0gcnVubmFibGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBydW5uYWJsZS4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgdGhlIGludGVycnVwdGVkIGV4Y2VwdGlvbi4KKyAgICAgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB0aGUgaW52b2NhdGlvbiB0YXJnZXQgZXhjZXB0aW9uLgogICAgICAqLwogICAgIGZpbmFsIHZvaWQgdW5zYWZlSW52b2tlQW5kV2FpdChSdW5uYWJsZSBydW5uYWJsZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLAogICAgICAgICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CkBAIC0yMjksNyArMjY2LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBzeW5jaHJvbml6ZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3luY2hyb25pemVyCisgICAgICogQHJldHVybiB0aGUgc3luY2hyb25pemVyLgogICAgICAqLwogICAgIGZpbmFsIFN5bmNocm9uaXplciBnZXRTeW5jaHJvbml6ZXIoKSB7CiAgICAgICAgIHJldHVybiBzeW5jaHJvbml6ZXI7CkBAIC0yMzgsMTkgKzI3NSwyMCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHdUSy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB3VEsKKyAgICAgKiBAcmV0dXJuIHRoZSB3VEsuCiAgICAgICovCiAgICAgZmluYWwgV1RLIGdldFdUSygpIHsKICAgICAgICAgcmV0dXJuIHd0azsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGFuZCBkZWZhdWx0IHZhbHVlLiAKLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBkZWZWYWx1ZSBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGZvdW5kLiAKKyAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGFuZCBkZWZhdWx0IHZhbHVlLiBUaGlzIG1ldGhvZAorICAgICAqIHJldHVybnMgdGhlIGRlZlZhbHVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZm91bmQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3BOYW1lIHRoZSBuYW1lIG9mIHByb3BlcnR5LgotICAgICAqIEBwYXJhbSBkZWZWYWwgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogCisgICAgICogQHBhcmFtIHByb3BOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gZGVmVmFsCisgICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZS4KICAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBkZWZWYWwpIHsKQEAgLTI3MywxMSArMzExLDExIEBACiAgICAgICAgICAgICBzdGF0aWNVbmxvY2tBV1QoKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRlZmF1bHQgVG9vbGtpdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IFRvb2xraXQKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IFRvb2xraXQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBUb29sa2l0IGdldERlZmF1bHRUb29sa2l0KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKENvbnRleHRTdG9yYWdlLmdldENvbnRleHRMb2NrKCkpIHsKQEAgLTI5MCwzNCArMzI4LDM0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdGF0aWNMb2NrQVdUKCk7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRlZlRvb2xraXQgPSBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSGVhZGxlc3NUb29sa2l0KCkgOiBuZXcgVG9vbGtpdEltcGwoKTsKKyAgICAgICAgICAgICAgICBkZWZUb29sa2l0ID0gR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkgPyBuZXcgSGVhZGxlc3NUb29sa2l0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFRvb2xraXRJbXBsKCk7CiAgICAgICAgICAgICAgICAgQ29udGV4dFN0b3JhZ2Uuc2V0RGVmYXVsdFRvb2xraXQoZGVmVG9vbGtpdCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZlRvb2xraXQ7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIHN0YXRpY1VubG9ja0FXVCgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9UT0RPOiByZWFkIHN5c3RlbSBwcm9wZXJ0eSBuYW1lZCBhd3QudG9vbGtpdAotICAgICAgICAgICAgLy9hbmQgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0gICAgICAgICAgICAvL2J5IGRlZmF1bHQgdXNlIFRvb2xraXRJbXBsCisgICAgICAgICAgICAvLyBUT0RPOiByZWFkIHN5c3RlbSBwcm9wZXJ0eSBuYW1lZCBhd3QudG9vbGtpdAorICAgICAgICAgICAgLy8gYW5kIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAorICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCB1c2UgVG9vbGtpdEltcGwKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRlZmF1bHQgRm9udC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZXJhdWx0IEZvbnQgZm9yIFRvb2xraXQuCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBGb250IGZvciBUb29sa2l0LgogICAgICAqLwogICAgIEZvbnQgZ2V0RGVmYXVsdEZvbnQoKSB7CiAgICAgICAgIHJldHVybiB3dGsuZ2V0U3lzdGVtUHJvcGVydGllcygpLmdldERlZmF1bHRGb250KCk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogTG9hZCByZXNvdXJjZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBidW5kbGUKKyAgICAgKiBAcGFyYW0gcGF0aAorICAgICAqICAgICAgICAgICAgdGhlIHBhdGguCisgICAgICogQHJldHVybiB0aGUgcmVzb3VyY2UgYnVuZGxlLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGxvYWRSZXNvdXJjZXMoU3RyaW5nIHBhdGgpIHsKICAgICAgICAgdHJ5IHsKQEAgLTMzMCw3ICszNjgsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHdUSyBjbGFzcyBuYW1lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHdUSyBjbGFzcyBuYW1lCisgICAgICogQHJldHVybiB0aGUgd1RLIGNsYXNzIG5hbWUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFdUS0NsYXNzTmFtZSgpIHsKICAgICAgICAgcmV0dXJuICJjb20uYW5kcm9pZC5pbnRlcm5hbC5hd3QuQW5kcm9pZFdUSyI7CkBAIC0zMzksOSArMzc3LDkgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBjb21wb25lbnQgYnkgaWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGlkIHRoZSBpZAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbXBvbmVudCBieSBpZAorICAgICAqIEBwYXJhbSBpZAorICAgICAqICAgICAgICAgICAgdGhlIGlkLgorICAgICAqIEByZXR1cm4gdGhlIGNvbXBvbmVudCBieSBpZC4KICAgICAgKi8KICAgICBDb21wb25lbnQgZ2V0Q29tcG9uZW50QnlJZChsb25nIGlkKSB7CiAgICAgICAgIGlmIChpZCA9PSAwKSB7CkBAIC0zNjIsMTIgKzQwMCwxMiBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyB0b29sa2l0LgogICAgICAqLwotICAgIHB1YmxpYyBUb29sa2l0KCkgeyAgICAgICAgCisgICAgcHVibGljIFRvb2xraXQoKSB7CiAgICAgICAgIGluaXQoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbml0cyBBV1QuCisgICAgICogSW5pdGlhdGVzIEFXVC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewogICAgICAgICBsb2NrQVdUKCk7CkBAIC0zOTcsNDMgKzQzNSw1MiBAQAogICAgICAgICAgICAgdW5sb2NrQVdUKCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBTeW5jaHJvbml6ZXMgdGhpcyB0b29sa2l0J3MgZ3JhcGhpY3MuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3luYygpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29uc3RydWN0aW9uIHN0YXR1cyBvZiBhIHNwZWNpZmllZCBpbWFnZSB0aGF0IGlzIGJlaW5nIGNyZWF0ZWQuCisgICAgICogUmV0dXJucyB0aGUgY29uc3RydWN0aW9uIHN0YXR1cyBvZiBhIHNwZWNpZmllZCBpbWFnZSB0aGF0IGlzIGJlaW5nCisgICAgICogY3JlYXRlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIGltYWdlIHRvIGJlIGNoZWNrZWQuCi0gICAgICogQHBhcmFtIGExIHRoZSB3aWR0aCBvZiBzY2FsZWQgaW1hZ2UgZm9yIHdoaWNoIHRoZSBzdGF0dXMgaXMgYmVpbmcgY2hlY2tlZCwgb3IgLTEuCi0gICAgICogQHBhcmFtIGEyIHRoZSBoZWlnaHQgb2Ygc2NhbGVkIGltYWdlIGZvciB3aGljaCB0aGUgc3RhdHVzIGlzIGJlaW5nIGNoZWNrZWQsIG9yIC0xLgotICAgICAqIEBwYXJhbSBhMyB0aGUgSW1hZ2VPYnNlcnZlciBvYmplY3QgdG8gYmUgbm90aWZpZWQgd2hpbGUgCi0gICAgICogdGhlIGltYWdlIGlzIGJlaW5nIHByZXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEltYWdlT2JzZXJ2ZXIgZmxhZ3Mgd2hpY2ggZ2l2ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byBiZSBjaGVja2VkLgorICAgICAqIEBwYXJhbSBhMQorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHNjYWxlZCBpbWFnZSBmb3Igd2hpY2ggdGhlIHN0YXR1cyBpcyBiZWluZworICAgICAqICAgICAgICAgICAgY2hlY2tlZCBvciAtMS4KKyAgICAgKiBAcGFyYW0gYTIKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2Ygc2NhbGVkIGltYWdlIGZvciB3aGljaCB0aGUgc3RhdHVzIGlzIGJlaW5nCisgICAgICogICAgICAgICAgICBjaGVja2VkIG9yIC0xLgorICAgICAqIEBwYXJhbSBhMworICAgICAqICAgICAgICAgICAgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHRvIGJlIG5vdGlmaWVkIHdoaWxlIHRoZSBpbWFnZSBpcworICAgICAqICAgICAgICAgICAgYmVpbmcgcHJlcGFyZWQuCisgICAgICogQHJldHVybiB0aGUgSW1hZ2VPYnNlcnZlciBmbGFncyB3aGljaCBnaXZlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBpbWFnZQorICAgICAqICAgICAgICAgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGNoZWNrSW1hZ2UoSW1hZ2UgYTAsIGludCBhMSwgaW50IGEyLCBJbWFnZU9ic2VydmVyIGEzKTsKLSAgIAorCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIEltYWdlUHJvZHVjZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGEwIHRoZSBJbWFnZVByb2R1Y2VyIHRvIGJlIHVzZWQgZm9yIGltYWdlIGNyZWF0aW9uLgotICAgICAqIAorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlUHJvZHVjZXIgdG8gYmUgdXNlZCBmb3IgaW1hZ2UgY3JlYXRpb24uCiAgICAgICogQHJldHVybiB0aGUgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIEltYWdlUHJvZHVjZXIuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEltYWdlIGNyZWF0ZUltYWdlKEltYWdlUHJvZHVjZXIgYTApOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgaW1hZ2UgZnJvbSB0aGUgc3BlY2lmaWVkIGJ5dGUgYXJyYXksIG9mZnNldCBhbmQgbGVuZ3RoLgotICAgICAqIFRoZSBieXRlIGFycmF5IHNob3VsZCBjb250YWluIGRhdGEgd2l0aCBpbWFnZSBmb3JtYXQgc3VwcG9ydGVkIGJ5IAotICAgICAqIFRvb2xraXQgc3VjaCBhcyBKUEVHLCBHSUYsIG9yIFBORy4gIAorICAgICAqIENyZWF0ZXMgdGhlIGltYWdlIGZyb20gdGhlIHNwZWNpZmllZCBieXRlIGFycmF5LCBvZmZzZXQgYW5kIGxlbmd0aC4gVGhlCisgICAgICogYnl0ZSBhcnJheSBzaG91bGQgY29udGFpbiBkYXRhIHdpdGggaW1hZ2UgZm9ybWF0IHN1cHBvcnRlZCBieSBUb29sa2l0CisgICAgICogc3VjaCBhcyBKUEVHLCBHSUYsIG9yIFBORy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIGJ5dGUgYXJyYXkgd2l0aCB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gYTEgdGhlIG9mZnNldCBvZiB0aGUgYmVnZ2luaW5nIHRoZSBpbWFnZSBkYXRhIGluIHRoZSBieXRlIGFycmF5LgotICAgICAqIEBwYXJhbSBhMiB0aGUgbGVuZ3RoIG9mIHRoZSBpbWFnZSBkYXRhIGluIHRoZSBieXRlIGFycmF5LgotICAgICAqIAorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgd2l0aCB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gYTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGJlZ2lubmluZyB0aGUgaW1hZ2UgZGF0YSBpbiB0aGUgYnl0ZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gYTIKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGltYWdlIGRhdGEgaW4gdGhlIGJ5dGUgYXJyYXkuCiAgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBJbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgSW1hZ2UgY3JlYXRlSW1hZ2UoYnl0ZVtdIGEwLCBpbnQgYTEsIGludCBhMik7CkBAIC00NDEsOCArNDg4LDggQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIHRoZSBpbWFnZSB1c2luZyBpbWFnZSBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBVUkwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGEwIHRoZSBVUkwgZm9yIGV4dHJhY3RpbmcgaW1hZ2UgZGF0YS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBVUkwgZm9yIGV4dHJhY3RpbmcgaW1hZ2UgZGF0YS4KICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgSW1hZ2UgY3JlYXRlSW1hZ2UoVVJMIGEwKTsKQEAgLTQ1MCw4ICs0OTcsOCBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgdGhlIGltYWdlIHVzaW5nIGltYWdlIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGEwIHRoZSBmaWxlIG5hbWUgd2hpY2ggY29udGFpbnMgaW1hZ2UgZGF0YSBvZiBzdXBwb3J0ZWQgZm9ybWF0LgotICAgICAqIAorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgbmFtZSB3aGljaCBjb250YWlucyBpbWFnZSBkYXRhIG9mIHN1cHBvcnRlZCBmb3JtYXQuCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyBhMCk7CkBAIC00NjAsMjIgKzUwNywyMCBAQAogICAgICAqIEdldHMgdGhlIGNvbG9yIG1vZGVsLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIENvbG9yTW9kZWwgb2YgVG9vbGtpdCdzIHNjcmVlbi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIGlmIHRoZSAKLSAgICAgKiBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKSBtZXRob2QgcmV0dXJucyB0cnVlLgorICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkgbWV0aG9kIHJldHVybnMgdHJ1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQ29sb3JNb2RlbCBnZXRDb2xvck1vZGVsKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uOwotICAgIAorCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc2NyZWVuIGRldmljZSBtZXRyaWNzIGZvciB0aGUgc3BlY2lmaWVkIGZvbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZvbnQgdGhlIEZvbnQuCi0gICAgICogCisgICAgICogQHBhcmFtIGZvbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250LgogICAgICAqIEByZXR1cm4gdGhlIEZvbnRNZXRyaWNzIGZvciB0aGUgc3BlY2lmaWVkIEZvbnQuCi0gICAgICogCiAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGdldExpbmVNZXRyaWNzIG1ldGhvZCBmcm9tIEZvbnQgY2xhc3MuCiAgICAgICovCi0gICAgICAgIAorCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYWJzdHJhY3QgRm9udE1ldHJpY3MgZ2V0Rm9udE1ldHJpY3MoRm9udCBmb250KTsKIApAQCAtNDgzLDEzICs1MjgsMTggQEAKICAgICAgKiBQcmVwYXJlcyB0aGUgc3BlY2lmaWVkIGltYWdlIGZvciByZW5kZXJpbmcgb24gdGhlIHNjcmVlbiB3aXRoIHRoZQogICAgICAqIHNwZWNpZmllZCBzaXplLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhMCB0aGUgSW1hZ2UgdG8gYmUgcHJlcGFyZWQuCi0gICAgICogQHBhcmFtIGExIHRoZSB3aWR0aCBvZiB0aGUgc2NyZWVuIHJlcHJlc2VudGF0aW9uIG9yIC0xIGZvciB0aGUgY3VycmVudCBzY3JlZW4uCi0gICAgICogQHBhcmFtIGEyIHRoZSBoZWlnaHQgb2YgdGhlIHNjcmVlbiByZXByZXNlbnRhdGlvbiBvciAtMSBmb3IgdGhlIGN1cnJlbnQgc2NyZWVuLgotICAgICAqIEBwYXJhbSBhMyB0aGUgSW1hZ2VPYnNlcnZlciBvYmplY3QgdG8gYmUgbm90aWZpZWQgYXMgc29vbiBhcyAKLSAgICAgKiB0aGUgaW1hZ2UgaXMgcHJlcGFyZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBpbWFnZSBpcyBmdWxseSBwcmVwYXJlZDsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlIHRvIGJlIHByZXBhcmVkLgorICAgICAqIEBwYXJhbSBhMQorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBzY3JlZW4gcmVwcmVzZW50YXRpb24gb3IgLTEgZm9yIHRoZSBjdXJyZW50CisgICAgICogICAgICAgICAgICBzY3JlZW4uCisgICAgICogQHBhcmFtIGEyCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBzY3JlZW4gcmVwcmVzZW50YXRpb24gb3IgLTEgZm9yIHRoZSBjdXJyZW50CisgICAgICogICAgICAgICAgICBzY3JlZW4uCisgICAgICogQHBhcmFtIGEzCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VPYnNlcnZlciBvYmplY3QgdG8gYmUgbm90aWZpZWQgYXMgc29vbiBhcyB0aGUgaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIGlzIHByZXBhcmVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaW1hZ2UgaXMgZnVsbHkgcHJlcGFyZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBwcmVwYXJlSW1hZ2UoSW1hZ2UgYTAsIGludCBhMSwgaW50IGEyLCBJbWFnZU9ic2VydmVyIGEzKTsKIApAQCAtNTAyLDIxICs1NTIsMTkgQEAKICAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBmb250IG5hbWVzIHdoaWNoIGFyZSBhdmFpbGFibGUgaW4gdGhpcyBUb29sa2l0LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGZvbnQgbmFtZXMgd2hpY2ggYXJlIGF2YWlsYWJsZSBpbiB0aGlzIFRvb2xraXQuCi0gICAgICogCiAgICAgICogQGRlcHJlY2F0ZWQgdXNlIEdyYXBoaWNzRW52aXJvbm1lbnQuZ2V0QXZhaWxhYmxlRm9udEZhbWlseU5hbWVzKCkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldEZvbnRMaXN0KCk7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0aGUgRm9udCBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIHBlZXIgCi0gICAgICogaW50ZXJmYWNlLgorICAgICAqIEdldHMgdGhlIHRoZSBGb250IGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQgcGVlciBpbnRlcmZhY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGEwIHRoZSBGb250IG5hbWUgdG8gYmUgaW1wbGVtZW50ZWQuCi0gICAgICogQHBhcmFtIGExIHRoZSB0aGUgZm9udCBzdHlsZTogUExBSU4sIEJPTEQsIElUQUxJQy4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250IG5hbWUgdG8gYmUgaW1wbGVtZW50ZWQuCisgICAgICogQHBhcmFtIGExCisgICAgICogICAgICAgICAgICB0aGUgdGhlIGZvbnQgc3R5bGU6IFBMQUlOLCBCT0xELCBJVEFMSUMuCiAgICAgICogQHJldHVybiB0aGUgRm9udFBlZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBGb250LgotICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIHVzZSBqYXZhLmF3dC5HcmFwaGljc0Vudmlyb25tZW50LmdldEFsbEZvbnRzIG1ldGhvZC4KICAgICAgKi8KIApAQCAtNTI0LDI3ICs1NzIsMjcgQEAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRm9udFBlZXIgZ2V0Rm9udFBlZXIoU3RyaW5nIGEwLCBpbnQgYTEpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgaW1hZ2UgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgd2hpY2ggY29udGFpbnMgaW1hZ2UgZGF0YSBpbgotICAgICAqIGEgc3VwcG9ydGVkIGltYWdlIGZvcm1hdCAoc3VjaCBhcyBKUEVHLCBHSUYsIG9yIFBORyk7IHRoaXMgbWV0aG9kIAotICAgICAqIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgSW1hZ2UgZm9yIG11bHRpcGxlIGNhbGxzIG9mIHRoaXMgbWV0aG9kIHdpdGggCi0gICAgICogdGhlIHNhbWUgaW1hZ2UgZmlsZSBuYW1lLgorICAgICAqIEdldHMgdGhlIGltYWdlIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlIHdoaWNoIGNvbnRhaW5zIGltYWdlIGRhdGEgaW4gYQorICAgICAqIHN1cHBvcnRlZCBpbWFnZSBmb3JtYXQgKHN1Y2ggYXMgSlBFRywgR0lGLCBvciBQTkcpOyB0aGlzIG1ldGhvZCBzaG91bGQKKyAgICAgKiByZXR1cm4gdGhlIHNhbWUgSW1hZ2UgZm9yIG11bHRpcGxlIGNhbGxzIG9mIHRoaXMgbWV0aG9kIHdpdGggdGhlIHNhbWUKKyAgICAgKiBpbWFnZSBmaWxlIG5hbWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGEwIHRoZSBmaWxlIG5hbWUgd2hpY2ggY29udGFpbnMgaW1hZ2UgZGF0YSBpbgotICAgICAqIGEgc3VwcG9ydGVkIGltYWdlIGZvcm1hdCAoc3VjaCBhcyBKUEVHLCBHSUYsIG9yIFBORykuCi0gICAgICogCisgICAgICogQHBhcmFtIGEwCisgICAgICogICAgICAgICAgICB0aGUgZmlsZSBuYW1lIHdoaWNoIGNvbnRhaW5zIGltYWdlIGRhdGEgaW4gYSBzdXBwb3J0ZWQgaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIGZvcm1hdCAoc3VjaCBhcyBKUEVHLCBHSUYsIG9yIFBORykuCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEltYWdlIGdldEltYWdlKFN0cmluZyBhMCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBpbWFnZSBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMIHdoaWNoIGNvbnRhaW5zIGltYWdlIGRhdGEgaW4KLSAgICAgKiBhIHN1cHBvcnRlZCBpbWFnZSBmb3JtYXQgKHN1Y2ggYXMgSlBFRywgR0lGLCBvciBQTkcpOyB0aGlzIG1ldGhvZCAKLSAgICAgKiBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIEltYWdlIGZvciBtdWx0aXBsZSBjYWxscyBvZiB0aGlzIG1ldGhvZCB3aXRoIAotICAgICAqIHRoZSBzYW1lIGltYWdlIFVSTC4KKyAgICAgKiBHZXRzIHRoZSBpbWFnZSBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMIHdoaWNoIGNvbnRhaW5zIGltYWdlIGRhdGEgaW4gYQorICAgICAqIHN1cHBvcnRlZCBpbWFnZSBmb3JtYXQgKHN1Y2ggYXMgSlBFRywgR0lGLCBvciBQTkcpOyB0aGlzIG1ldGhvZCBzaG91bGQKKyAgICAgKiByZXR1cm4gdGhlIHNhbWUgSW1hZ2UgZm9yIG11bHRpcGxlIGNhbGxzIG9mIHRoaXMgbWV0aG9kIHdpdGggdGhlIHNhbWUKKyAgICAgKiBpbWFnZSBVUkwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGEwIHRoZSBVUkwgd2hpY2ggY29udGFpbnMgaW1hZ2UgZGF0YSBpbgotICAgICAqIGEgc3VwcG9ydGVkIGltYWdlIGZvcm1hdCAoc3VjaCBhcyBKUEVHLCBHSUYsIG9yIFBORykuCi0gICAgICogCisgICAgICogQHBhcmFtIGEwCisgICAgICogICAgICAgICAgICB0aGUgVVJMIHdoaWNoIGNvbnRhaW5zIGltYWdlIGRhdGEgaW4gYSBzdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0CisgICAgICogICAgICAgICAgICAoc3VjaCBhcyBKUEVHLCBHSUYsIG9yIFBORykuCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEltYWdlIGdldEltYWdlKFVSTCBhMCk7CkBAIC01NTMsMjAgKzYwMSwxNyBAQAogICAgICAqIEdldHMgdGhlIHNjcmVlbiByZXNvbHV0aW9uLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHNjcmVlbiByZXNvbHV0aW9uLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gaWYgdGhlIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpCi0gICAgICogbWV0aG9kIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpIG1ldGhvZCByZXR1cm5zIHRydWUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRTY3JlZW5SZXNvbHV0aW9uKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc2NyZWVuIHNpemUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIERpbWVuc2lvbiBvYmplY3QgY29udGFpbmluZyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZgotICAgICAqIHRoZSBzY3JlZW4uCi0gICAgICogCi0gICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiBpZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkKLSAgICAgKiBtZXRob2QgcmV0dXJucyB0cnVlLgorICAgICAqIEByZXR1cm4gYSBEaW1lbnNpb24gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHNjcmVlbi4KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpIG1ldGhvZCByZXR1cm5zIHRydWUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IERpbWVuc2lvbiBnZXRTY3JlZW5TaXplKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uOwogCkBAIC01NzgsMTUgKzYyMywxNCBAQAogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBFdmVudFF1ZXVlIGdldFN5c3RlbUV2ZW50UXVldWVJbXBsKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbWFwIG9mIHRleHQgYXR0cmlidXRlcyBmb3IgdGhlIGFic3RyYWN0IGxldmVsIGRlc2NyaXB0aW9uIAotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgaW5wdXQgbWV0aG9kIGhpZ2hsaWdodCwgb3IgbnVsbCBpZiBubyBtYXBwaW5nIGlzIGZvdW5kLiAKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGhpZ2hsaWdodCB0aGUgSW5wdXRNZXRob2RIaWdobGlnaHQuCisgICAgICogUmV0dXJucyBhIG1hcCBvZiB0ZXh0IGF0dHJpYnV0ZXMgZm9yIHRoZSBhYnN0cmFjdCBsZXZlbCBkZXNjcmlwdGlvbiBvZgorICAgICAqIHRoZSBzcGVjaWZpZWQgaW5wdXQgbWV0aG9kIGhpZ2hsaWdodCwgb3IgbnVsbCBpZiBubyBtYXBwaW5nIGlzIGZvdW5kLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIE1hcDxqYXZhLmF3dC5mb250LiB0ZXh0IGF0dHJpYnV0ZSw/PgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gaWYgdGhlIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpCi0gICAgICogbWV0aG9kIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAcGFyYW0gaGlnaGxpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgSW5wdXRNZXRob2RIaWdobGlnaHQuCisgICAgICogQHJldHVybiB0aGUgTWFwPGphdmEuYXd0LmZvbnQuIHRleHQgYXR0cmlidXRlLD8+LgorICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkgbWV0aG9kIHJldHVybnMgdHJ1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgTWFwPGphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSwgPz4gbWFwSW5wdXRNZXRob2RIaWdobGlnaHQoCiAgICAgICAgICAgICBJbnB1dE1ldGhvZEhpZ2hsaWdodCBoaWdobGlnaHQpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbjsKQEAgLTU5NCwxNCArNjM4LDE0IEBACiAgICAgLyoqCiAgICAgICogTWFwIGlucHV0IG1ldGhvZCBoaWdobGlnaHQgaW1wbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGlnaGxpZ2h0IHRoZSBoaWdobGlnaHQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXA8amF2YS5hd3QuZm9udC4gdGV4dCBhdHRyaWJ1dGUsPz4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHRoZSBoZWFkbGVzcyBleGNlcHRpb24KKyAgICAgKiBAcGFyYW0gaGlnaGxpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGlnaGxpZ2h0LgorICAgICAqIEByZXR1cm4gdGhlIG1hcDxqYXZhLmF3dC5mb250LiB0ZXh0IGF0dHJpYnV0ZSw/Pi4KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgdGhlIGhlYWRsZXNzIGV4Y2VwdGlvbi4KICAgICAgKi8KLSAgICBNYXA8amF2YS5hd3QuZm9udC5UZXh0QXR0cmlidXRlLCA/PiBtYXBJbnB1dE1ldGhvZEhpZ2hsaWdodEltcGwoCi0gICAgICAgICAgICBJbnB1dE1ldGhvZEhpZ2hsaWdodCBoaWdobGlnaHQpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CisgICAgTWFwPGphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSwgPz4gbWFwSW5wdXRNZXRob2RIaWdobGlnaHRJbXBsKElucHV0TWV0aG9kSGlnaGxpZ2h0IGhpZ2hsaWdodCkKKyAgICAgICAgICAgIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CiAgICAgICAgIEhhc2hNYXA8amF2YS5hd3QuZm9udC5UZXh0QXR0cmlidXRlLCA/PiBtYXAgPSBuZXcgSGFzaE1hcDxqYXZhLmF3dC5mb250LlRleHRBdHRyaWJ1dGUsIE9iamVjdD4oKTsKICAgICAgICAgd3RrLmdldFN5c3RlbVByb3BlcnRpZXMoKS5tYXBJbnB1dE1ldGhvZEhpZ2hsaWdodChoaWdobGlnaHQsIG1hcCk7CiAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48amF2YS5hd3QuZm9udC5UZXh0QXR0cmlidXRlLCBPYmplY3Q+IHVubW9kaWZpYWJsZU1hcChtYXApOwpAQCAtNjExLDkgKzY1NSwxMSBAQAogICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkCiAgICAgICogcHJvcGVydHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3BOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lIGZvciB3aGljaCB0aGUgc3BlY2lmaWVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLSAgICAgKiB3aWxsIGJlIGFkZGVkLiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBvYmplY3QuCisgICAgICogQHBhcmFtIHByb3BOYW1lCisgICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZSBmb3Igd2hpY2ggdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB3aWxsIGJlIGFkZGVkLgorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcE5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbCkgewogICAgICAgICBsb2NrQVdUKCk7CkBAIC02MjQsMzEgKzY3MCwzMiBAQAogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgdW5sb2NrQVdUKCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGwgIT0gbnVsbCkgeyAvLyB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBudWxsIGxpc3RlbmVyIHdpbGwgbm90IGJlIGFkZGVkCisgICAgICAgIGlmIChsICE9IG51bGwpIHsgLy8gdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgbnVsbCBsaXN0ZW5lciB3aWxsIG5vdCBiZQorICAgICAgICAgICAgLy8gYWRkZWQKICAgICAgICAgICAgIGRlc2t0b3BQcm9wc1N1cHBvcnQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wTmFtZSwgbCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgd2l0aAotICAgICAqIHRoaXMgVG9vbGtpdC4KKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzCisgICAgICogVG9vbGtpdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgd2l0aAotICAgICAqIHRoaXMgVG9vbGtpdC4gCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycyByZWdpc3RlcmVkIHdpdGggdGhpcworICAgICAqICAgICAgICAgVG9vbGtpdC4KICAgICAgKi8KICAgICBwdWJsaWMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIGdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCkgewogICAgICAgICByZXR1cm4gZGVza3RvcFByb3BzU3VwcG9ydC5nZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCB3aXRoCi0gICAgICogdGhpcyBUb29sa2l0IGZvciBub3RpZmljYXRpb24gcmVnYXJkaW5nIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCisgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycyByZWdpc3RlcmVkIHdpdGggdGhpcworICAgICAqIFRvb2xraXQgZm9yIG5vdGlmaWNhdGlvbiByZWdhcmRpbmcgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcE5hbWUgdGhlIHByb3BlcnR5IG5hbWUgZm9yIHdoaWNoIHRoZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0gICAgICogd2FzIHJlZ2lzdGVyZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMgcmVnaXN0ZXJlZCBmb3IgdGhlIHNwZWNpZmllZCAKLSAgICAgKiBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEBwYXJhbSBwcm9wTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUgZm9yIHdoaWNoIHRoZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHdhcworICAgICAqICAgICAgICAgICAgcmVnaXN0ZXJlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyByZWdpc3RlcmVkIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBwcm9wZXJ0eSBuYW1lLgogICAgICAqLwogICAgIHB1YmxpYyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHByb3BOYW1lKSB7CiAgICAgICAgIHJldHVybiBkZXNrdG9wUHJvcHNTdXBwb3J0LmdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BOYW1lKTsKQEAgLTY1OCwyOCArNzA1LDMzIEBACiAgICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciByZWdpc3RlcmVkIGZvciB0aGUKICAgICAgKiBzcGVjaWZpZWQgcHJvcGVydHkgbmFtZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcE5hbWUgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICogQHBhcmFtIGwgdGhlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcmVnaXN0ZXJlZCBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEBwYXJhbSBwcm9wTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHJlZ2lzdGVyZWQgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgICAgIHByb3BlcnR5IG5hbWUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcE5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbCkgewogICAgICAgICBkZXNrdG9wUHJvcHNTdXBwb3J0LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcE5hbWUsIGwpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBjdXN0b20gY3Vyc29yIHdpdGggdGhlIHNwZWNpZmllZCBJbWFnZSwgaG90IHNwb3QsIGFuZCBjdXJzb3IKICAgICAgKiBkZXNjcmlwdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1nIHRoZSBpbWFnZSBvZiBhY3RpdmF0ZWQgY3Vyc29yLgotICAgICAqIEBwYXJhbSBob3RTcG90IHRoZSBQb2ludCBnaXZpbmcgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJzb3IncyBob3Qgc3BvdC4gCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIGN1cnNvciBkZXNjcmlwdGlvbi4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1nCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2Ugb2YgYWN0aXZhdGVkIGN1cnNvci4KKyAgICAgKiBAcGFyYW0gaG90U3BvdAorICAgICAqICAgICAgICAgICAgdGhlIFBvaW50IGdpdmluZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnNvcidzIGhvdCBzcG90LgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgY3Vyc29yIGRlc2NyaXB0aW9uLgogICAgICAqIEByZXR1cm4gdGhlIGN1cnNvciB3aXRoIHRoZSBzcGVjaWZpZWQgSW1hZ2UsIGhvdCBzcG90LCBhbmQgY3Vyc29yCi0gICAgICogZGVzY3JpcHRpb24uCi0gICAgICogCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBob3Qgc3BvdCB2YWx1ZXMgYXJlIG91dHNpZGUgIAotICAgICAqIHRoZSBib3VuZHMgb2YgdGhlIGN1cnNvci4KLSAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIGlmIGlzSGVhZGxlc3MoKSBtZXRob2Qgb2YgR3JhcGhpY3NFbnZpcm9ubWVudAotICAgICAqIGNsYXNzIHJldHVybnMgdHJ1ZS4KKyAgICAgKiAgICAgICAgIGRlc2NyaXB0aW9uLgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBob3Qgc3BvdCB2YWx1ZXMgYXJlIG91dHNpZGUgdGhlIGJvdW5kcyBvZiB0aGUgY3Vyc29yLgorICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBpc0hlYWRsZXNzKCkgbWV0aG9kIG9mIEdyYXBoaWNzRW52aXJvbm1lbnQgY2xhc3MgcmV0dXJucworICAgICAqICAgICAgICAgICAgIHRydWUuCiAgICAgICovCiAgICAgcHVibGljIEN1cnNvciBjcmVhdGVDdXN0b21DdXJzb3IoSW1hZ2UgaW1nLCBQb2ludCBob3RTcG90LCBTdHJpbmcgbmFtZSkKICAgICAgICAgICAgIHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCBIZWFkbGVzc0V4Y2VwdGlvbiB7CkBAIC02OTgsMjAgKzc1MCwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1cHBvcnRlZCBjdXJzb3IgZGltZW5zaW9uIHdoaWNoIGlzIGNsb3Nlc3QgdG8gdGhlIAotICAgICAqIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LiBJZiB0aGUgVG9vbGtpdCBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIAotICAgICAqIGN1cnNvciBzaXplLCB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBzdXBwb3J0ZWQgY3Vyc29yIHNpemUuCi0gICAgICogSWYgY3VzdG9tIGN1cnNvciBpcyBub3Qgc3VwcG9ydGVkLCBhIGRpbWVuc2lvbiBvZiAwLCAwIHNob3VsZCBiZQotICAgICAqIHJldHVybmVkLgorICAgICAqIFJldHVybnMgdGhlIHN1cHBvcnRlZCBjdXJzb3IgZGltZW5zaW9uIHdoaWNoIGlzIGNsb3Nlc3QgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIHdpZHRoIGFuZCBoZWlnaHQuIElmIHRoZSBUb29sa2l0IG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgY3Vyc29yIHNpemUsIHRoaXMKKyAgICAgKiBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgc3VwcG9ydGVkIGN1cnNvciBzaXplLiBJZiBjdXN0b20gY3Vyc29yIGlzIG5vdAorICAgICAqIHN1cHBvcnRlZCwgYSBkaW1lbnNpb24gb2YgMCwgMCBzaG91bGQgYmUgcmV0dXJuZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByZWZXaWR0aCB0aGUgcHJlZmZlcmVkIGN1cnNvciB3aWR0aC4KLSAgICAgKiBAcGFyYW0gcHJlZkhlaWdodCB0aGUgcHJlZmZlcmVkIGN1cnNvciBoZWlnaHQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3VwcG9ydGVkIGN1cnNvciBkaW1lbnNpb24gd2hpY2ggaXMgY2xvc2VzdCB0byB0aGUgCi0gICAgICogc3BlY2lmaWVkIHdpZHRoIGFuZCBoZWlnaHQuCi0gICAgICogCi0gICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiBpZiBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKSAKLSAgICAgKiByZXR1cm5zIHRydWUuCisgICAgICogQHBhcmFtIHByZWZXaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBjdXJzb3Igd2lkdGguCisgICAgICogQHBhcmFtIHByZWZIZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgY3Vyc29yIGhlaWdodC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdXBwb3J0ZWQgY3Vyc29yIGRpbWVuc2lvbiB3aGljaCBpcyBjbG9zZXN0IHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIHdpZHRoIGFuZCBoZWlnaHQuCisgICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpIHJldHVybnMgdHJ1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgRGltZW5zaW9uIGdldEJlc3RDdXJzb3JTaXplKGludCBwcmVmV2lkdGgsIGludCBwcmVmSGVpZ2h0KSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gewogICAgICAgICBsb2NrQVdUKCk7CkBAIC03MjMsMTAgKzc3NCwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGRlc2t0b3AgcHJvcGVydHkuIAorICAgICAqIEdldHMgdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGRlc2t0b3AgcHJvcGVydHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3BOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9wTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUuCiAgICAgICogQHJldHVybiB0aGUgT2JqZWN0IHRoYXQgaXMgdGhlIHByb3BlcnR5J3MgdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIE9iamVjdCBnZXREZXNrdG9wUHJvcGVydHkoU3RyaW5nIHByb3BOYW1lKSB7CkBAIC03NTQsMTcgKzgwNSwxOSBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGxvY2tpbmcga2V5IHN0YXRlIGZvciB0aGUgc3BlY2lmaWVkIGtleS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIGtleSBjb2RlOiBWS19DQVBTX0xPQ0ssIFZLX05VTV9MT0NLLCBWS19TQ1JPTExfTE9DSywgCi0gICAgICogb3IgVktfS0FOQV9MT0NLLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGtleSBjb2RlIGlzIGluIHRoZSBsb2NrZWQgc3RhdGUsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHN0YXRlIG9mIHRoaXMga2V5IAotICAgICAqIGNhbid0IGJlIHJldHJpZXZlZCwgb3IgaWYgdGhlIGtleWJvYXJkIGRvZXNuJ3QgaGF2ZSB0aGlzIGtleS4KLSAgICAgKiBAdGhyb3dzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4KKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgY29kZTogVktfQ0FQU19MT0NLLCBWS19OVU1fTE9DSywgVktfU0NST0xMX0xPQ0ssIG9yCisgICAgICogICAgICAgICAgICBWS19LQU5BX0xPQ0suCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQga2V5IGNvZGUgaXMgaW4gdGhlIGxvY2tlZCBzdGF0ZSwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHN0YXRlIG9mIHRoaXMga2V5IGNhbid0IGJlIHJldHJpZXZlZCwgb3IgaWYgdGhlCisgICAgICogICAgICAgICAgICAga2V5Ym9hcmQgZG9lc24ndCBoYXZlIHRoaXMga2V5LgorICAgICAqIEB0aHJvd3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0TG9ja2luZ0tleVN0YXRlKGludCBhMCkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRMb2NraW5nS2V5U3RhdGUoaW50IGEwKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24sCisgICAgICAgICAgICBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uIHsKICAgICAgICAgbG9ja0FXVCgpOwogICAgICAgICB0cnkgewogICAgICAgICB9IGZpbmFsbHkgewpAQCAtNzgxLDkgKzgzNCw4IEBACiAgICAgICogY3VzdG9tIGN1cnNvci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIGN1cnNvciBjb2xvcnMuCi0gICAgICogCi0gICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiBpZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkKLSAgICAgKiBtZXRob2QgcmV0dXJucyB0cnVlLgorICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkgbWV0aG9kIHJldHVybnMgdHJ1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE1heGltdW1DdXJzb3JDb2xvcnMoKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gewogICAgICAgICBsb2NrQVdUKCk7CkBAIC03OTYsMTEgKzg0OCwxMCBAQAogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbWVudSBzaG9ydGN1dCBrZXkgbWFzay4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG1lbnUgc2hvcnRjdXQga2V5IG1hc2suCiAgICAgICogCi0gICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiBpZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkKLSAgICAgKiBtZXRob2QgcmV0dXJucyB0cnVlLgorICAgICAqIEByZXR1cm4gdGhlIG1lbnUgc2hvcnRjdXQga2V5IG1hc2suCisgICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKSBtZXRob2QgcmV0dXJucyB0cnVlLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWVudVNob3J0Y3V0S2V5TWFzaygpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CiAgICAgICAgIGxvY2tBV1QoKTsKQEAgLTgxNCwxMiArODY1LDExIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc2NyZWVuIGluc2V0cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZ2MgdGhlIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2MKKyAgICAgKiAgICAgICAgICAgIHRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24uCiAgICAgICogQHJldHVybiB0aGUgaW5zZXRzIG9mIHRoaXMgdG9vbGtpdC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIGlmIHRoZSBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKQotICAgICAqIG1ldGhvZCByZXR1cm5zIHRydWUuCisgICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKSBtZXRob2QgcmV0dXJucyB0cnVlLgogICAgICAqLwogICAgIHB1YmxpYyBJbnNldHMgZ2V0U2NyZWVuSW5zZXRzKEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnYykgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGdjID09IG51bGwpIHsKQEAgLTgyNywxNyArODc3LDE3IEBACiAgICAgICAgIH0KICAgICAgICAgbG9ja0FXVCgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnNldHMoMCwgMCwgMCwgMCk7IC8vVE9ETzogZ2V0IHJlYWwgc2NyZWVuIGluc2V0cworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnNldHMoMCwgMCwgMCwgMCk7IC8vIFRPRE86IGdldCByZWFsIHNjcmVlbiBpbnNldHMKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHVubG9ja0FXVCgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc3lzdGVtIEV2ZW50UXVldWUgaW5zdGFuY2UuIAotICAgICAqIElmIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGNoZWNrQXd0RXZlbnRRdWV1ZUFjY2VzcyBpcyB1c2VkLAotICAgICAqIHRoZW4gdGhpcyByZXN1bHRzIG9mIGEgY2FsbCB0byB0aGUgc2VjdXJpdHkgbWFuYWdlcidzIGNoZWNrUGVybWlzc2lvbgotICAgICAqIG1ldGhvZCB3aXRoIGFuIEFXVFBlcm1pc3Npb24oImFjY2Vzc0V2ZW50UXVldWUiKSBwZXJtaXNzaW9uLgorICAgICAqIEdldHMgdGhlIHN5c3RlbSBFdmVudFF1ZXVlIGluc3RhbmNlLiBJZiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAqIGNoZWNrQXd0RXZlbnRRdWV1ZUFjY2VzcyBpcyB1c2VkLCB0aGVuIHRoaXMgcmVzdWx0cyBvZiBhIGNhbGwgdG8gdGhlCisgICAgICogc2VjdXJpdHkgbWFuYWdlcidzIGNoZWNrUGVybWlzc2lvbiBtZXRob2Qgd2l0aCBhbgorICAgICAqIEFXVFBlcm1pc3Npb24oImFjY2Vzc0V2ZW50UXVldWUiKSBwZXJtaXNzaW9uLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbSBFdmVudFF1ZXVlIGluc3RhbmNlLgogICAgICAqLwpAQCAtODQ5LDE5ICs4OTksMjAgQEAKICAgICAgICAgcmV0dXJuIGdldFN5c3RlbUV2ZW50UXVldWVJbXBsKCk7CiAgICAgfQogCi0gICAgLyoqIAorICAgIC8qKgogICAgICAqIEdldHMgdGhlIHN5c3RlbSBldmVudCBxdWV1ZSBjb3JlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbSBldmVudCBxdWV1ZSBjb3JlCisgICAgICogQHJldHVybiB0aGUgc3lzdGVtIGV2ZW50IHF1ZXVlIGNvcmUuCiAgICAgICovCiAgICAgRXZlbnRRdWV1ZUNvcmUgZ2V0U3lzdGVtRXZlbnRRdWV1ZUNvcmUoKSB7CiAgICAgICAgIHJldHVybiBzeXN0ZW1FdmVudFF1ZXVlQ29yZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBzeXN0ZW0gZXZlbnQgcXVldWUgY29yZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29yZSB0aGUgbmV3IHN5c3RlbSBldmVudCBxdWV1ZSBjb3JlCisgICAgICogQHBhcmFtIGNvcmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgc3lzdGVtIGV2ZW50IHF1ZXVlIGNvcmUuCiAgICAgICovCiAgICAgdm9pZCBzZXRTeXN0ZW1FdmVudFF1ZXVlQ29yZShFdmVudFF1ZXVlQ29yZSBjb3JlKSB7CiAgICAgICAgIHN5c3RlbUV2ZW50UXVldWVDb3JlID0gY29yZTsKQEAgLTg4MiwxMSArOTMzLDEwIEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIGR5bmFtaWMgbGF5b3V0IG9mIENvbnRhaW5lcnMgaXMgYWN0aXZlIG9yIG5vdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGR5bmFtaWMgbGF5b3V0IG9mIENvbnRhaW5lcnMgaXMgYWN0aXZlLAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIGlmIHRoZSBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKQotICAgICAqIG1ldGhvZCByZXR1cm5zIHRydWUuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBpcyBkeW5hbWljIGxheW91dCBvZiBDb250YWluZXJzIGlzIGFjdGl2ZSwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpIG1ldGhvZCByZXR1cm5zIHRydWUuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNEeW5hbWljTGF5b3V0QWN0aXZlKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKICAgICAgICAgbG9ja0FXVCgpOwpAQCAtODk4LDE3ICs5NDgsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgbGF5b3V0IG9mIENvbnRhaW5lcnMgaXMgY2hlY2tlZCBkeW5hbWljYWxseSBkdXJpbmcgcmVzaXppbmcsCi0gICAgICogb3Igc3RhdGljYWxseSBhZnRlciByZXNpemluZyBpcyBjb21wbGV0ZWQuIAorICAgICAqIFJldHVybnMgaWYgdGhlIGxheW91dCBvZiBDb250YWluZXJzIGlzIGNoZWNrZWQgZHluYW1pY2FsbHkgZHVyaW5nCisgICAgICogcmVzaXppbmcsIG9yIHN0YXRpY2FsbHkgYWZ0ZXIgcmVzaXppbmcgaXMgY29tcGxldGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaWYgdGhlIGxheW91dCBvZiBDb250YWluZXJzIGlzIGNoZWNrZWQgZHluYW1pY2FsbHkgZHVyaW5nIAotICAgICAqIHJlc2l6aW5nOyBmYWxzZSwgaWYgdGhlIGxheW91dCBvZiBDb250YWluZXJzIGlzIGNoZWNrZWQgc3RhdGljYWxseSBhZnRlciAKLSAgICAgKiByZXNpemluZyBpcyBjb21wbGV0ZWQuIAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gaWYgdGhlIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpCi0gICAgICogbWV0aG9kIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlmIHRoZSBsYXlvdXQgb2YgQ29udGFpbmVycyBpcyBjaGVja2VkIGR5bmFtaWNhbGx5CisgICAgICogICAgICAgICBkdXJpbmcgcmVzaXppbmc7IGZhbHNlLCBpZiB0aGUgbGF5b3V0IG9mIENvbnRhaW5lcnMgaXMgY2hlY2tlZAorICAgICAqICAgICAgICAgc3RhdGljYWxseSBhZnRlciByZXNpemluZyBpcyBjb21wbGV0ZWQuCisgICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKSBtZXRob2QgcmV0dXJucyB0cnVlLgogICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIGlzRHluYW1pY0xheW91dFNldCgpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CiAgICAgICAgIGxvY2tBV1QoKTsKQEAgLTkyMiwxMiArOTcwLDExIEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgZnJhbWUgc3RhdGUgaXMgc3VwcG9ydGVkIGJ5IFRvb2xraXQgb3Igbm90LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgZnJhbWUgc3RhdGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBmcmFtZSBzdGF0ZSBpcyBzdXBwb3J0ZWQ7IGZhbHNlIG90aHJ3aXNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gaWYgdGhlIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpCi0gICAgICogbWV0aG9kIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAcGFyYW0gc3RhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmcmFtZSBzdGF0ZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGZyYW1lIHN0YXRlIGlzIHN1cHBvcnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkgbWV0aG9kIHJldHVybnMgdHJ1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZyYW1lU3RhdGVTdXBwb3J0ZWQoaW50IHN0YXRlKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gewogICAgICAgICBsb2NrQVdUKCk7CkBAIC05NDEsOCArOTg4LDggQEAKICAgICAvKioKICAgICAgKiBMb2FkcyB0aGUgdmFsdWUgb2YgdGhlIGRlc2t0b3AgcHJvcGVydHkgd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3BOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9wTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUuCiAgICAgICogQHJldHVybiB0aGUgZGVza3RvcCBwcm9wZXJ0eSB2YWx1ZXMuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIE9iamVjdCBsYXppbHlMb2FkRGVza3RvcFByb3BlcnR5KFN0cmluZyBwcm9wTmFtZSkgewpAQCAtOTUyLDExICs5OTksMTEgQEAKICAgICAvKioKICAgICAgKiBMb2FkcyB0aGUgY3VycmVudCBzeXN0ZW0gY29sb3IgdmFsdWVzIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9ycyB0aGUgYXJyYXkgd2hlcmUgdGhlIGN1cnJlbnQgc3lzdGVtIGNvbG9yIHZhbHVlcyAKLSAgICAgKiBhcmUgd3JpdHRlbiBieSB0aGlzIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIGlmIHRoZSBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKQotICAgICAqIG1ldGhvZCByZXR1cm5zIHRydWUuCisgICAgICogQHBhcmFtIGNvbG9ycworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdoZXJlIHRoZSBjdXJyZW50IHN5c3RlbSBjb2xvciB2YWx1ZXMgYXJlIHdyaXR0ZW4gYnkKKyAgICAgKiAgICAgICAgICAgIHRoaXMgbWV0aG9kLgorICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkgbWV0aG9kIHJldHVybnMgdHJ1ZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkU3lzdGVtQ29sb3JzKGludFtdIGNvbG9ycykgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKICAgICAgICAgbG9ja0FXVCgpOwpAQCAtOTY5LDggKzEwMTYsMTAgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGVza3RvcCBwcm9wZXJ0eSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcE5hbWUgdGhlIHByb3BlcnR5J3MgbmFtZS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHByb3BlcnR5J3MgdmFsdWUuCisgICAgICogQHBhcmFtIHByb3BOYW1lCisgICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkncyBuYW1lLgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5J3MgdmFsdWUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0RGVza3RvcFByb3BlcnR5KFN0cmluZyBwcm9wTmFtZSwgT2JqZWN0IHZhbHVlKSB7CiAgICAgICAgIE9iamVjdCBvbGRWYWw7CkBAIC05ODYsMTUgKzEwMzUsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsYXlvdXQgc3RhdGUsIHdoZXRoZXIgdGhlIENvbnRhaW5lciBsYXlvdXQgaXMgY2hlY2tlZCAKLSAgICAgKiBkeW5hbWljYWxseSBkdXJpbmcgcmVzaXppbmcsIG9yIHN0YXRpY2FsbHkgYWZ0ZXIgcmVzaXppbmcgaXMgY29tcGxldGVkLiAKKyAgICAgKiBTZXRzIHRoZSBsYXlvdXQgc3RhdGUsIHdoZXRoZXIgdGhlIENvbnRhaW5lciBsYXlvdXQgaXMgY2hlY2tlZAorICAgICAqIGR5bmFtaWNhbGx5IGR1cmluZyByZXNpemluZywgb3Igc3RhdGljYWxseSBhZnRlciByZXNpemluZyBpcyBjb21wbGV0ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGR5bmFtaWMgdGhlIG5ldyBkeW5hbWljIGxheW91dCBzdGF0ZSAtIGlmIHRydWUgdGhlIGxheW91dCBvZiAKLSAgICAgKiBDb250YWluZXJzIGlzIGNoZWNrZWQgZHluYW1pY2FsbHkgZHVyaW5nIHJlc2l6aW5nLCBpZiBmYWxzZSAtCi0gICAgICogc3RhdGljYWxseSBhZnRlciByZXNpemluZyBpcyBjb21wbGV0ZWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiBpZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkKLSAgICAgKiBtZXRob2QgcmV0dXJucyB0cnVlLgorICAgICAqIEBwYXJhbSBkeW5hbWljCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGR5bmFtaWMgbGF5b3V0IHN0YXRlIC0gaWYgdHJ1ZSB0aGUgbGF5b3V0IG9mCisgICAgICogICAgICAgICAgICBDb250YWluZXJzIGlzIGNoZWNrZWQgZHluYW1pY2FsbHkgZHVyaW5nIHJlc2l6aW5nLCBpZiBmYWxzZSAtCisgICAgICogICAgICAgICAgICBzdGF0aWNhbGx5IGFmdGVyIHJlc2l6aW5nIGlzIGNvbXBsZXRlZC4KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpIG1ldGhvZCByZXR1cm5zIHRydWUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHluYW1pY0xheW91dChib29sZWFuIGR5bmFtaWMpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CiAgICAgICAgIGxvY2tBV1QoKTsKQEAgLTEwMDgsMTYgKzEwNTcsMjAgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBsb2NraW5nIGtleSBzdGF0ZSBmb3IgdGhlIHNwZWNpZmllZCBrZXkgY29kZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIGtleSBjb2RlOiBWS19DQVBTX0xPQ0ssIFZLX05VTV9MT0NLLCBWS19TQ1JPTExfTE9DSywgCi0gICAgICogb3IgVktfS0FOQV9MT0NLLgotICAgICAqIEBwYXJhbSBhMSB0aGUgc3RhdGUgLSB0cnVlIHRvIHNldCB0aGUgc3BlY2lmaWVkIGtleSBjb2RlIHRvIHRoZSBsb2NrZWQgc3RhdGUsCi0gICAgICogZmFsc2UgLSB0byB1bmxvY2sgaXQuCi0gICAgICogCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgc3RhdGUgb2YgdGhpcyBrZXkgCi0gICAgICogY2FuJ3QgYmUgc2V0LCBvciBpZiB0aGUga2V5Ym9hcmQgZG9lc24ndCBoYXZlIHRoaXMga2V5LgotICAgICAqIEB0aHJvd3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLgorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIGtleSBjb2RlOiBWS19DQVBTX0xPQ0ssIFZLX05VTV9MT0NLLCBWS19TQ1JPTExfTE9DSywgb3IKKyAgICAgKiAgICAgICAgICAgIFZLX0tBTkFfTE9DSy4KKyAgICAgKiBAcGFyYW0gYTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGF0ZSAtIHRydWUgdG8gc2V0IHRoZSBzcGVjaWZpZWQga2V5IGNvZGUgdG8gdGhlIGxvY2tlZAorICAgICAqICAgICAgICAgICAgc3RhdGUsIGZhbHNlIC0gdG8gdW5sb2NrIGl0LgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3RhdGUgb2YgdGhpcyBrZXkgY2FuJ3QgYmUgc2V0LCBvciBpZiB0aGUga2V5Ym9hcmQKKyAgICAgKiAgICAgICAgICAgICBkb2Vzbid0IGhhdmUgdGhpcyBrZXkuCisgICAgICogQHRocm93cyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NraW5nS2V5U3RhdGUoaW50IGEwLCBib29sZWFuIGExKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24sIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHNldExvY2tpbmdLZXlTdGF0ZShpbnQgYTAsIGJvb2xlYW4gYTEpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgICAgIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gewogICAgICAgICBsb2NrQVdUKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgIH0gZmluYWxseSB7CkBAIC0xMDI5LDcgKzEwODIsNiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBPbiBxdWV1ZSBlbXB0eS4KICAgICAgKi8KQEAgLTEwNDAsMTQgKzEwOTIsMTQgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIHRoZSB3dGsuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNsc05hbWUgdGhlIGNscyBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgd1RLCisgICAgICogQHBhcmFtIGNsc05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbHMgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB3VEsuCiAgICAgICovCiAgICAgcHJpdmF0ZSBXVEsgY3JlYXRlV1RLKFN0cmluZyBjbHNOYW1lKSB7CiAgICAgICAgIFdUSyBuZXdXVEsgPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3V1RLID0gKFdUSykgQ2xhc3MuZm9yTmFtZShjbHNOYW1lKS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgbmV3V1RLID0gKFdUSylDbGFzcy5mb3JOYW1lKGNsc05hbWUpLm5ld0luc3RhbmNlKCk7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQpAQCAtMTA1Niw3ICsxMTA4LDkgQEAKIAogICAgIC8qKgogICAgICAqIENvbm5lY3QgdGhlIGNvbXBvbmVudCB0byBpdHMgbmF0aXZlIHdpbmRvdwotICAgICAqIEBwYXJhbSB3aW5JZCAtIGlkIG9mIG5hdGl2ZSB3aW5kb3cganVzdCBjcmVhdGVkCisgICAgICogCisgICAgICogQHBhcmFtIHdpbklkCisgICAgICogICAgICAgICAgICB0aGUgaWQgb2YgbmF0aXZlIHdpbmRvdyBqdXN0IGNyZWF0ZWQuCiAgICAgICovCiAgICAgYm9vbGVhbiBvbldpbmRvd0NyZWF0ZWQobG9uZyB3aW5JZCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMDY1LDQ1ICsxMTE5LDUwIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbmF0aXZlIGV2ZW50IHF1ZXVlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hdGl2ZSBldmVudCBxdWV1ZQorICAgICAqIEByZXR1cm4gdGhlIG5hdGl2ZSBldmVudCBxdWV1ZS4KICAgICAgKi8KICAgICBOYXRpdmVFdmVudFF1ZXVlIGdldE5hdGl2ZUV2ZW50UXVldWUoKSB7CiAgICAgICAgIHJldHVybiB3dGsuZ2V0TmF0aXZlRXZlbnRRdWV1ZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzaGFyZWQgaW5zdGFuY2Ugb2YgaW1wbGVtZW50YXRpb24gb2Ygb3JnLmFwYWNoZS5oYXJtb255LmF3dC53dGsuTmF0aXZlQ3Vyc29yCi0gICAgICogZm9yIGN1cnJlbnQgcGxhdGZvcm0gZm9yCisgICAgICogUmV0dXJucyBhIHNoYXJlZCBpbnN0YW5jZSBvZiBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAqIG9yZy5hcGFjaGUuaGFybW9ueS5hd3Qud3RrLk5hdGl2ZUN1cnNvciBmb3IgY3VycmVudCBwbGF0Zm9ybSBmb3IuCiAgICAgICogCi0gICAgICogQHBhcmFtIHR5cGUgLSBKYXZhIEN1cnNvciB0eXBlCi0gICAgICogCi0gICAgICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2YgaW1wbGVtZW50YXRpb24gb2YgTmF0aXZlQ3Vyc29yCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBKYXZhIEN1cnNvciB0eXBlLgorICAgICAqIEByZXR1cm4gbmV3IGluc3RhbmNlIG9mIGltcGxlbWVudGF0aW9uIG9mIE5hdGl2ZUN1cnNvci4KICAgICAgKi8KICAgICBOYXRpdmVDdXJzb3IgY3JlYXRlTmF0aXZlQ3Vyc29yKGludCB0eXBlKSB7CiAgICAgICAgIHJldHVybiB3dGsuZ2V0Q3Vyc29yRmFjdG9yeSgpLmdldEN1cnNvcih0eXBlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2hhcmVkIGluc3RhbmNlIG9mIGltcGxlbWVudGF0aW9uIG9mIG9yZy5hcGFjaGUuaGFybW9ueS5hd3Qud3RrLk5hdGl2ZUN1cnNvcgotICAgICAqIGZvciBjdXJyZW50IHBsYXRmb3JtIGZvciBjdXN0b20gY3Vyc29yCisgICAgICogUmV0dXJucyBhIHNoYXJlZCBpbnN0YW5jZSBvZiBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAqIG9yZy5hcGFjaGUuaGFybW9ueS5hd3Qud3RrLk5hdGl2ZUN1cnNvciBmb3IgY3VycmVudCBwbGF0Zm9ybSBmb3IgY3VzdG9tCisgICAgICogY3Vyc29yCiAgICAgICogCi0gICAgICogQHBhcmFtIGltZyB0aGUgaW1nCi0gICAgICogQHBhcmFtIGhvdFNwb3QgdGhlIGhvdCBzcG90Ci0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIG5ldyBpbnN0YW5jZSBvZiBpbXBsZW1lbnRhdGlvbiBvZiBOYXRpdmVDdXJzb3IKKyAgICAgKiBAcGFyYW0gaW1nCisgICAgICogICAgICAgICAgICB0aGUgaW1nLgorICAgICAqIEBwYXJhbSBob3RTcG90CisgICAgICogICAgICAgICAgICB0aGUgaG90IHNwb3QuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lLgorICAgICAqIEByZXR1cm4gbmV3IGluc3RhbmNlIG9mIGltcGxlbWVudGF0aW9uIG9mIE5hdGl2ZUN1cnNvci4KICAgICAgKi8KICAgICBOYXRpdmVDdXJzb3IgY3JlYXRlQ3VzdG9tTmF0aXZlQ3Vyc29yKEltYWdlIGltZywgUG9pbnQgaG90U3BvdCwgU3RyaW5nIG5hbWUpIHsKICAgICAgICAgcmV0dXJuIHd0ay5nZXRDdXJzb3JGYWN0b3J5KCkuY3JlYXRlQ3VzdG9tQ3Vyc29yKGltZywgaG90U3BvdC54LCBob3RTcG90LnkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZHMgYW4gQVdURXZlbnRMaXN0ZW5lciB0byB0aGUgVG9vbGtpdCB0byBsaXN0ZW4gZm9yIGV2ZW50cwotICAgICAqIG9mIHR5cGVzIGNvcnJlc3BvbmRpbmcgdG8gYml0cyBpbiB0aGUgc3BlY2lmaWVkIGV2ZW50IG1hc2suIAotICAgICAqIEV2ZW50IG1hc2tzIGFyZSBkZWZpbmVkIGluIEFXVEV2ZW50IGNsYXNzLgorICAgICAqIEFkZHMgYW4gQVdURXZlbnRMaXN0ZW5lciB0byB0aGUgVG9vbGtpdCB0byBsaXN0ZW4gZm9yIGV2ZW50cyBvZiB0eXBlcworICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gYml0cyBpbiB0aGUgc3BlY2lmaWVkIGV2ZW50IG1hc2suIEV2ZW50IG1hc2tzIGFyZQorICAgICAqIGRlZmluZWQgaW4gQVdURXZlbnQgY2xhc3MuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBBV1RFdmVudExpc3RlbmVyLgotICAgICAqIEBwYXJhbSBldmVudE1hc2sgaGUgYml0bWFzayBvZiBldmVudCB0eXBlcy4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBBV1RFdmVudExpc3RlbmVyLgorICAgICAqIEBwYXJhbSBldmVudE1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXRtYXNrIG9mIGV2ZW50IHR5cGVzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEFXVEV2ZW50TGlzdGVuZXIoQVdURXZlbnRMaXN0ZW5lciBsaXN0ZW5lciwgbG9uZyBldmVudE1hc2spIHsKICAgICAgICAgbG9ja0FXVCgpOwpAQCAtMTExOSw5ICsxMTc4LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGF3dCBldmVudCBsaXN0ZW5lci4KKyAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgQVdUIGV2ZW50IGxpc3RlbmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgQVdURXZlbnRMaXN0ZW5lciB0byBiZSByZW1vdmVkLgorICAgICAqIEBwYXJhbSBsaXN0ZW5lcgorICAgICAqICAgICAgICAgICAgdGhlIEFXVEV2ZW50TGlzdGVuZXIgdG8gYmUgcmVtb3ZlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmVBV1RFdmVudExpc3RlbmVyKEFXVEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgbG9ja0FXVCgpOwpAQCAtMTEzOSw3ICsxMTk5LDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBhcnJheSBvZiBhbGwgQVdUIGV2ZW50IGxpc3RlbmVycyByZWdpc3RlcmVkIHdpdGggdGhpcyBUb29sa2l0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGFsbCBBV1QgZXZlbnQgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIFRvb2xraXQuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgYWxsIEFXVCBldmVudCBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMKKyAgICAgKiAgICAgICAgIFRvb2xraXQuCiAgICAgICovCiAgICAgcHVibGljIEFXVEV2ZW50TGlzdGVuZXJbXSBnZXRBV1RFdmVudExpc3RlbmVycygpIHsKICAgICAgICAgbG9ja0FXVCgpOwpAQCAtMTE1NSwxMyArMTIxNiwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHRoZSBBV1QgZXZlbnQgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIFRvb2xraXQgCisgICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgdGhlIEFXVCBldmVudCBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgVG9vbGtpdAogICAgICAqIGZvciB0aGUgZXZlbnQgdHlwZXMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGV2ZW50IG1hc2suCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50TWFzayB0aGUgYml0IG1hc2sgb2YgZXZlbnQgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiB0aGUgQVdUIGV2ZW50IGxpc3RlbmVycyByZWdpc3RlcmVkIGluIHRoaXMgVG9vbGtpdCAKLSAgICAgKiBmb3IgdGhlIGV2ZW50IHR5cGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBldmVudCBtYXNrLgorICAgICAqIEBwYXJhbSBldmVudE1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXQgbWFzayBvZiBldmVudCB0eXBlLgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHRoZSBBV1QgZXZlbnQgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgaW4gdGhpcyBUb29sa2l0CisgICAgICogICAgICAgICBmb3IgdGhlIGV2ZW50IHR5cGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBldmVudCBtYXNrLgogICAgICAqLwogICAgIHB1YmxpYyBBV1RFdmVudExpc3RlbmVyW10gZ2V0QVdURXZlbnRMaXN0ZW5lcnMobG9uZyBldmVudE1hc2spIHsKICAgICAgICAgbG9ja0FXVCgpOwpAQCAtMTE3NywzMCArMTIzOCwzNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIERpc3BhdGNoIGF3dCBldmVudC4KKyAgICAgKiBEaXNwYXRjaCBBV1QgZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudAorICAgICAqIEBwYXJhbSBldmVudAorICAgICAqICAgICAgICAgICAgdGhlIGV2ZW50LgogICAgICAqLwogICAgIHZvaWQgZGlzcGF0Y2hBV1RFdmVudChBV1RFdmVudCBldmVudCkgewogICAgICAgICBhd3RFdmVudHNNYW5hZ2VyLmRpc3BhdGNoQVdURXZlbnQoZXZlbnQpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFRoZSBDbGFzcyBBV1RFdmVudHNNYW5hZ2VyLgogICAgICAqLwogICAgIGZpbmFsIGNsYXNzIEFXVEV2ZW50c01hbmFnZXIgewogCi0gICAgICAgIC8qKiBUaGUgcGVybWlzc2lvbi4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwZXJtaXNzaW9uLgorICAgICAgICAgKi8KICAgICAgICAgQVdUUGVybWlzc2lvbiBwZXJtaXNzaW9uID0gbmV3IEFXVFBlcm1pc3Npb24oImxpc3RlblRvQWxsQVdURXZlbnRzIik7IC8vJE5PTi1OTFMtMSQKIAotICAgICAgICAvKiogVGhlIGxpc3RlbmVycy4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBsaXN0ZW5lcnMuCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIGZpbmFsIEFXVExpc3RlbmVyTGlzdDxBV1RFdmVudExpc3RlbmVyUHJveHk+IGxpc3RlbmVycyA9IG5ldyBBV1RMaXN0ZW5lckxpc3Q8QVdURXZlbnRMaXN0ZW5lclByb3h5PigpOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIHRoZSBhd3QgZXZlbnQgbGlzdGVuZXIuCisgICAgICAgICAqIEFkZHMgdGhlIEFXVCBldmVudCBsaXN0ZW5lci4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLSAgICAgICAgICogQHBhcmFtIGV2ZW50TWFzayB0aGUgZXZlbnQgbWFzaworICAgICAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbGlzdGVuZXIuCisgICAgICAgICAqIEBwYXJhbSBldmVudE1hc2sKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZXZlbnQgbWFzay4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgYWRkQVdURXZlbnRMaXN0ZW5lcihBV1RFdmVudExpc3RlbmVyIGxpc3RlbmVyLCBsb25nIGV2ZW50TWFzaykgewogICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKQEAgLTEyMDksOSArMTI3NywxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbW92ZXMgdGhlIGF3dCBldmVudCBsaXN0ZW5lci4KKyAgICAgICAgICogUmVtb3ZlcyB0aGUgQVdUIGV2ZW50IGxpc3RlbmVyLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgorICAgICAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbGlzdGVuZXIuCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIHJlbW92ZUFXVEV2ZW50TGlzdGVuZXIoQVdURXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKQEAgLTEyMjUsOSArMTI5NCw5IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgYVdUIGV2ZW50IGxpc3RlbmVycy4KKyAgICAgICAgICogR2V0cyB0aGUgQVdUIGV2ZW50IGxpc3RlbmVycy4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGFXVCBldmVudCBsaXN0ZW5lcnMKKyAgICAgICAgICogQHJldHVybiB0aGUgQVdUIGV2ZW50IGxpc3RlbmVycy4KICAgICAgICAgICovCiAgICAgICAgIEFXVEV2ZW50TGlzdGVuZXJbXSBnZXRBV1RFdmVudExpc3RlbmVycygpIHsKICAgICAgICAgICAgIEhhc2hTZXQ8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJzU2V0ID0gbmV3IEhhc2hTZXQ8RXZlbnRMaXN0ZW5lcj4oKTsKQEAgLTEyMzgsMTEgKzEzMDcsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBhV1QgZXZlbnQgbGlzdGVuZXJzLgorICAgICAgICAgKiBHZXRzIHRoZSBBV1QgZXZlbnQgbGlzdGVuZXJzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGV2ZW50TWFzayB0aGUgZXZlbnQgbWFzawotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgYVdUIGV2ZW50IGxpc3RlbmVycworICAgICAgICAgKiBAcGFyYW0gZXZlbnRNYXNrCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGV2ZW50IG1hc2suCisgICAgICAgICAqIEByZXR1cm4gdGhlIEFXVCBldmVudCBsaXN0ZW5lcnMuCiAgICAgICAgICAqLwogICAgICAgICBBV1RFdmVudExpc3RlbmVyW10gZ2V0QVdURXZlbnRMaXN0ZW5lcnMobG9uZyBldmVudE1hc2spIHsKICAgICAgICAgICAgIEhhc2hTZXQ8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJzU2V0ID0gbmV3IEhhc2hTZXQ8RXZlbnRMaXN0ZW5lcj4oKTsKQEAgLTEyNTUsOSArMTMyNCwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIERpc3BhdGNoIGF3dCBldmVudC4KKyAgICAgICAgICogRGlzcGF0Y2ggQVdUIGV2ZW50LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudAorICAgICAgICAgKiBAcGFyYW0gZXZlbnQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZXZlbnQuCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIGRpc3BhdGNoQVdURXZlbnQoQVdURXZlbnQgZXZlbnQpIHsKICAgICAgICAgICAgIEFXVEV2ZW50LkV2ZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZXZlbnRUeXBlTG9va3VwLmdldEV2ZW50RGVzY3JpcHRvcihldmVudCk7CkBAIC0xMjcxLDY4ICsxMzQxLDEwNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogVGhlIENsYXNzIEF1dG9OdW1iZXIuCiAgICAgICovCiAgICAgc3RhdGljIGZpbmFsIGNsYXNzIEF1dG9OdW1iZXIgewogCi0gICAgICAgIC8qKiBUaGUgbmV4dCBjb21wb25lbnQuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmV4dCBjb21wb25lbnQuCisgICAgICAgICAqLwogICAgICAgICBpbnQgbmV4dENvbXBvbmVudCA9IDA7CiAKLSAgICAgICAgLyoqIFRoZSBuZXh0IGNhbnZhcy4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuZXh0IGNhbnZhcy4KKyAgICAgICAgICovCiAgICAgICAgIGludCBuZXh0Q2FudmFzID0gMDsKIAotICAgICAgICAvKiogVGhlIG5leHQgcGFuZWwuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmV4dCBwYW5lbC4KKyAgICAgICAgICovCiAgICAgICAgIGludCBuZXh0UGFuZWwgPSAwOwogCi0gICAgICAgIC8qKiBUaGUgbmV4dCB3aW5kb3cuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmV4dCB3aW5kb3cuCisgICAgICAgICAqLwogICAgICAgICBpbnQgbmV4dFdpbmRvdyA9IDA7CiAKLSAgICAgICAgLyoqIFRoZSBuZXh0IGZyYW1lLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5leHQgZnJhbWUuCisgICAgICAgICAqLwogICAgICAgICBpbnQgbmV4dEZyYW1lID0gMDsKIAotICAgICAgICAvKiogVGhlIG5leHQgZGlhbG9nLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5leHQgZGlhbG9nLgorICAgICAgICAgKi8KICAgICAgICAgaW50IG5leHREaWFsb2cgPSAwOwogCi0gICAgICAgIC8qKiBUaGUgbmV4dCBidXR0b24uICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmV4dCBidXR0b24uCisgICAgICAgICAqLwogICAgICAgICBpbnQgbmV4dEJ1dHRvbiA9IDA7CiAKLSAgICAgICAgLyoqIFRoZSBuZXh0IG1lbnUgY29tcG9uZW50LiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5leHQgbWVudSBjb21wb25lbnQuCisgICAgICAgICAqLwogICAgICAgICBpbnQgbmV4dE1lbnVDb21wb25lbnQgPSAwOwogCi0gICAgICAgIC8qKiBUaGUgbmV4dCBsYWJlbC4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuZXh0IGxhYmVsLgorICAgICAgICAgKi8KICAgICAgICAgaW50IG5leHRMYWJlbCA9IDA7CiAKLSAgICAgICAgLyoqIFRoZSBuZXh0IGNoZWNrIGJveC4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuZXh0IGNoZWNrIGJveC4KKyAgICAgICAgICovCiAgICAgICAgIGludCBuZXh0Q2hlY2tCb3ggPSAwOwogCi0gICAgICAgIC8qKiBUaGUgbmV4dCBzY3JvbGxiYXIuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmV4dCBzY3JvbGxiYXIuCisgICAgICAgICAqLwogICAgICAgICBpbnQgbmV4dFNjcm9sbGJhciA9IDA7CiAKLSAgICAgICAgLyoqIFRoZSBuZXh0IHNjcm9sbCBwYW5lLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5leHQgc2Nyb2xsIHBhbmUuCisgICAgICAgICAqLwogICAgICAgICBpbnQgbmV4dFNjcm9sbFBhbmUgPSAwOwogCi0gICAgICAgIC8qKiBUaGUgbmV4dCBsaXN0LiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5leHQgbGlzdC4KKyAgICAgICAgICovCiAgICAgICAgIGludCBuZXh0TGlzdCA9IDA7CiAKLSAgICAgICAgLyoqIFRoZSBuZXh0IGNob2ljZS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuZXh0IGNob2ljZS4KKyAgICAgICAgICovCiAgICAgICAgIGludCBuZXh0Q2hvaWNlID0gMDsKIAotICAgICAgICAvKiogVGhlIG5leHQgZmlsZSBkaWFsb2cuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmV4dCBmaWxlIGRpYWxvZy4KKyAgICAgICAgICovCiAgICAgICAgIGludCBuZXh0RmlsZURpYWxvZyA9IDA7CiAKLSAgICAgICAgLyoqIFRoZSBuZXh0IHRleHQgYXJlYS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuZXh0IHRleHQgYXJlYS4KKyAgICAgICAgICovCiAgICAgICAgIGludCBuZXh0VGV4dEFyZWEgPSAwOwogCi0gICAgICAgIC8qKiBUaGUgbmV4dCB0ZXh0IGZpZWxkLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5leHQgdGV4dCBmaWVsZC4KKyAgICAgICAgICovCiAgICAgICAgIGludCBuZXh0VGV4dEZpZWxkID0gMDsKICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIGNsYXNzIExvY2sgewogICAgIH0KIAotICAgICAgICAvKiogVGhlIGxvY2suICovCisgICAgLyoqCisgICAgICogVGhlIGxvY2suCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbG9jayA9IG5ldyBMb2NrKCk7Ci0gICAgICAgIAorCiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvVHJhbnNwYXJlbmN5LmphdmEgYi9hd3QvamF2YS9hd3QvVHJhbnNwYXJlbmN5LmphdmEKaW5kZXggOTc5MzExNC4uNDRhMWU3ZiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L1RyYW5zcGFyZW5jeS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9UcmFuc3BhcmVuY3kuamF2YQpAQCAtMTgsMzQgKzE4LDQwIEBACiAgKiBAYXV0aG9yIFBhdmVsIERvbGdvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIC8qKgogICogVGhlIFRyYW5zcGFyZW5jeSBpbnRlcmZhY2UgZGVmaW5lcyB0cmFuc3BhcmVuY3kncyBnZW5lcmFsIG1vZGVzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBUcmFuc3BhcmVuY3kgewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBPUEFRVUUgcmVwcmVzZW50cyBjb21wbGV0ZWx5IG9wYXF1ZSBkYXRhLAotICAgICAqIGFsbCBwaXhlbHMgaGF2ZSBhbiBhbHBoYSB2YWx1ZSBvZiAxLjAuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBPUEFRVUUgcmVwcmVzZW50cyBjb21wbGV0ZWx5IG9wYXF1ZSBkYXRhLCBhbGwgcGl4ZWxzIGhhdmUgYW4KKyAgICAgKiBhbHBoYSB2YWx1ZSBvZiAxLjAuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BBUVVFID0gMTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQklUTUFTSyByZXByZXNlbnRzIGRhdGEgd2hpY2ggY2FuIGJlIGVpdGhlciAKLSAgICAgKiBjb21wbGV0ZWx5IG9wYXF1ZSwgd2l0aCBhbiBhbHBoYSB2YWx1ZSBvZiAxLjAsIG9yIGNvbXBsZXRlbHkgCi0gICAgICogdHJhbnNwYXJlbnQsIHdpdGggYW4gYWxwaGEgdmFsdWUgb2YgMC4wLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBCSVRNQVNLIHJlcHJlc2VudHMgZGF0YSB3aGljaCBjYW4gYmUgZWl0aGVyIGNvbXBsZXRlbHkKKyAgICAgKiBvcGFxdWUsIHdpdGggYW4gYWxwaGEgdmFsdWUgb2YgMS4wLCBvciBjb21wbGV0ZWx5IHRyYW5zcGFyZW50LCB3aXRoIGFuCisgICAgICogYWxwaGEgdmFsdWUgb2YgMC4wLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJVE1BU0sgPSAyOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUUkFOU0xVQ0VOVCByZXByZXNlbnRzIGRhdGEgd2hpY2ggYWxwaGEgdmFsdWUKLSAgICAgKiBjYW4gdmFyeSBiZXR3ZWVuIGFuZCBpbmNsdWRpbmcgMC4wIGFuZCAxLjAuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRSQU5TTFVDRU5UIHJlcHJlc2VudHMgZGF0YSB3aGljaCBhbHBoYSB2YWx1ZSBjYW4gdmFyeQorICAgICAqIGJldHdlZW4gYW5kIGluY2x1ZGluZyAwLjAgYW5kIDEuMC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0xVQ0VOVCA9IDM7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB0cmFuc3BhcmVuY3kgbW9kZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc3BhcmVuY3kgbW9kZTogT1BBUVVFLCBCSVRNQVNLIG9yIFRSQU5TTFVDRU5ULiAgCisgICAgICogQHJldHVybiB0aGUgdHJhbnNwYXJlbmN5IG1vZGU6IE9QQVFVRSwgQklUTUFTSyBvciBUUkFOU0xVQ0VOVC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFRyYW5zcGFyZW5jeSgpOwogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9jb2xvci9DTU1FeGNlcHRpb24uamF2YSBiL2F3dC9qYXZhL2F3dC9jb2xvci9DTU1FeGNlcHRpb24uamF2YQppbmRleCAxNmZlNzZlLi4xOGI5YTdlIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvY29sb3IvQ01NRXhjZXB0aW9uLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2NvbG9yL0NNTUV4Y2VwdGlvbi5qYXZhCkBAIC0yMSwxOCArMjEsMjIgQEAKIHBhY2thZ2UgamF2YS5hd3QuY29sb3I7CiAKIC8qKgotICogVGhlIENNTUV4Y2VwdGlvbiBpcyB0aHJvd24gYXMgc29vbiBhcyBhIG5hdGl2ZSBDTU0gZXJyb3IKLSAqIG9jY3VyZXMuCisgKiBUaGUgQ01NRXhjZXB0aW9uIGlzIHRocm93biBhcyBzb29uIGFzIGEgbmF0aXZlIENNTSBlcnJvciBvY2N1cnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ01NRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gewogICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1Nzc1NTU4MDQ0MTQyOTk0OTY1TDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBDTU0gZXhjZXB0aW9uIHdpdGggZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIFN0cmluZyAtIGRldGFpbCBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2Ugb2YgdGhlIGV4Y2VwdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgQ01NRXhjZXB0aW9uIChTdHJpbmcgcykgewogICAgICAgICBzdXBlciAocyk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvY29sb3IvQ29sb3JTcGFjZS5qYXZhIGIvYXd0L2phdmEvYXd0L2NvbG9yL0NvbG9yU3BhY2UuamF2YQppbmRleCBmOTYxNTE0Li40NGM0OTFiIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvY29sb3IvQ29sb3JTcGFjZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9jb2xvci9Db2xvclNwYWNlLmphdmEKQEAgLTI2LDEzMSArMjYsMjA5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIENvbG9yU3BhY2UgY2xhc3MgZGVmaW5lcyBhIGNvbG9yIHNwYWNlIHR5cGUgZm9yIGEgQ29sb3IgYW5kIHByb3ZpZGVzIG1ldGhvZHMKLSAqIGZvciBhcnJheXMgb2YgY29sb3IgY29tcG9uZW50IG9wZXJhdGlvbnMuCisgKiBUaGUgQ29sb3JTcGFjZSBjbGFzcyBkZWZpbmVzIGEgY29sb3Igc3BhY2UgdHlwZSBmb3IgYSBDb2xvciBhbmQgcHJvdmlkZXMKKyAqIG1ldGhvZHMgZm9yIGFycmF5cyBvZiBjb2xvciBjb21wb25lbnQgb3BlcmF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb2xvclNwYWNlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKIAogICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDA5NDUyNzA0MzA4Njg5NzI0TDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9YWVogaW5kaWNhdGVzIFhZWiBjb2xvciBzcGFjZSB0eXBlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX1hZWiBpbmRpY2F0ZXMgWFlaIGNvbG9yIHNwYWNlIHR5cGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9YWVogPSAwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX0xhYiBpbmRpY2F0ZXMgTGFiIGNvbG9yIHNwYWNlIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfTGFiIGluZGljYXRlcyBMYWIgY29sb3Igc3BhY2UgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0xhYiA9IDE7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfTHV2IGluZGljYXRlcyBMdXYgY29sb3Igc3BhY2UgdHlwZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9MdXYgaW5kaWNhdGVzIEx1diBjb2xvciBzcGFjZSB0eXBlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfTHV2ID0gMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9ZQ2JDciBpbmRpY2F0ZXMgWUNiQ3IgY29sb3Igc3BhY2UgdHlwZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9ZQ2JDciBpbmRpY2F0ZXMgWUNiQ3IgY29sb3Igc3BhY2UgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1lDYkNyID0gMzsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9ZeHkgaW5kaWNhdGVzIFl4eSBjb2xvciBzcGFjZSB0eXBlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX1l4eSBpbmRpY2F0ZXMgWXh5IGNvbG9yIHNwYWNlIHR5cGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9ZeHkgPSA0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX1JHQiBpbmRpY2F0ZXMgUkdCIGNvbG9yIHNwYWNlIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfUkdCIGluZGljYXRlcyBSR0IgY29sb3Igc3BhY2UgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1JHQiA9IDU7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfR1JBWSBpbmRpY2F0ZXMgR3JheSBjb2xvciBzcGFjZSB0eXBlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0dSQVkgaW5kaWNhdGVzIEdyYXkgY29sb3Igc3BhY2UgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0dSQVkgPSA2OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX0hTViBpbmRpY2F0ZXMgSFNWIGNvbG9yIHNwYWNlIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfSFNWIGluZGljYXRlcyBIU1YgY29sb3Igc3BhY2UgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0hTViA9IDc7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfSExTIGluZGljYXRlcyBITFMgY29sb3Igc3BhY2UgdHlwZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9ITFMgaW5kaWNhdGVzIEhMUyBjb2xvciBzcGFjZSB0eXBlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSExTID0gODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9DTVlLIGluZGljYXRlcyBDTVlLIGNvbG9yIHNwYWNlIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfQ01ZSyBpbmRpY2F0ZXMgQ01ZSyBjb2xvciBzcGFjZSB0eXBlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQ01ZSyA9IDk7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfQ01ZIGluZGljYXRlcyBDTVkgY29sb3Igc3BhY2UgdHlwZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9DTVkgaW5kaWNhdGVzIENNWSBjb2xvciBzcGFjZSB0eXBlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQ01ZID0gMTE7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfMkNMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggMiBjb21wb25lbnRzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFXzJDTFIgaW5kaWNhdGVzIGNvbG9yIHNwYWNlcyB3aXRoIDIgY29tcG9uZW50cy4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFXzJDTFIgPSAxMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV8zQ0xSIGluZGljYXRlcyBjb2xvciBzcGFjZXMgd2l0aCAzIGNvbXBvbmVudHMuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfM0NMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggMyBjb21wb25lbnRzLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfM0NMUiA9IDEzOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFXzRDTFIgaW5kaWNhdGVzIGNvbG9yIHNwYWNlcyB3aXRoIDQgY29tcG9uZW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV80Q0xSIGluZGljYXRlcyBjb2xvciBzcGFjZXMgd2l0aCA0IGNvbXBvbmVudHMuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV80Q0xSID0gMTQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfNUNMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggNSBjb21wb25lbnRzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFXzVDTFIgaW5kaWNhdGVzIGNvbG9yIHNwYWNlcyB3aXRoIDUgY29tcG9uZW50cy4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFXzVDTFIgPSAxNTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV82Q0xSIGluZGljYXRlcyBjb2xvciBzcGFjZXMgd2l0aCA2IGNvbXBvbmVudHMuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfNkNMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggNiBjb21wb25lbnRzLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfNkNMUiA9IDE2OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFXzdDTFIgaW5kaWNhdGVzIGNvbG9yIHNwYWNlcyB3aXRoIDcgY29tcG9uZW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV83Q0xSIGluZGljYXRlcyBjb2xvciBzcGFjZXMgd2l0aCA3IGNvbXBvbmVudHMuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV83Q0xSID0gMTc7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfOENMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggOCBjb21wb25lbnRzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFXzhDTFIgaW5kaWNhdGVzIGNvbG9yIHNwYWNlcyB3aXRoIDggY29tcG9uZW50cy4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFXzhDTFIgPSAxODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV85Q0xSIGluZGljYXRlcyBjb2xvciBzcGFjZXMgd2l0aCA5IGNvbXBvbmVudHMuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfOUNMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggOSBjb21wb25lbnRzLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfOUNMUiA9IDE5OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX0FDTFIgaW5kaWNhdGVzIGNvbG9yIHNwYWNlcyB3aXRoIDEwIGNvbXBvbmVudHMuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfQUNMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggMTAgY29tcG9uZW50cy4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0FDTFIgPSAyMDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9CQ0xSIGluZGljYXRlcyBjb2xvciBzcGFjZXMgd2l0aCAxMSBjb21wb25lbnRzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0JDTFIgaW5kaWNhdGVzIGNvbG9yIHNwYWNlcyB3aXRoIDExIGNvbXBvbmVudHMuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9CQ0xSID0gMjE7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfQ0NMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggMTIgY29tcG9uZW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9DQ0xSIGluZGljYXRlcyBjb2xvciBzcGFjZXMgd2l0aCAxMiBjb21wb25lbnRzLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQ0NMUiA9IDIyOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX0RDTFIgaW5kaWNhdGVzIGNvbG9yIHNwYWNlcyB3aXRoIDEzIGNvbXBvbmVudHMuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfRENMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggMTMgY29tcG9uZW50cy4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0RDTFIgPSAyMzsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9FQ0xSIGluZGljYXRlcyBjb2xvciBzcGFjZXMgd2l0aCAxNCBjb21wb25lbnRzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0VDTFIgaW5kaWNhdGVzIGNvbG9yIHNwYWNlcyB3aXRoIDE0IGNvbXBvbmVudHMuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9FQ0xSID0gMjQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfRkNMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggMTUgY29tcG9uZW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9GQ0xSIGluZGljYXRlcyBjb2xvciBzcGFjZXMgd2l0aCAxNSBjb21wb25lbnRzLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRkNMUiA9IDI1OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBDU19zUkdCIGluZGljYXRlcyBzdGFuZGFyZCBSR0IgY29sb3Igc3BhY2UuKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ1Nfc1JHQiBpbmRpY2F0ZXMgc3RhbmRhcmQgUkdCIGNvbG9yIHNwYWNlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTX3NSR0IgPSAxMDAwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBDU19MSU5FQVJfUkdCIGluZGljYXRlcyBsaW5lYXIgUkdCIGNvbG9yIHNwYWNlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDU19MSU5FQVJfUkdCIGluZGljYXRlcyBsaW5lYXIgUkdCIGNvbG9yIHNwYWNlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTX0xJTkVBUl9SR0IgPSAxMDA0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBDU19DSUVYWVogaW5kaWNhdGVzIENJRVhZWiBjb252ZXJzaW9uIGNvbG9yIHNwYWNlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDU19DSUVYWVogaW5kaWNhdGVzIENJRVhZWiBjb252ZXJzaW9uIGNvbG9yIHNwYWNlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTX0NJRVhZWiA9IDEwMDE7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IENTX1BZQ0MgaW5kaWNhdGVzIFBob3RvIFlDQyBjb252ZXJzaW9uIGNvbG9yIHNwYWNlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDU19QWUNDIGluZGljYXRlcyBQaG90byBZQ0MgY29udmVyc2lvbiBjb2xvciBzcGFjZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDU19QWUNDID0gMTAwMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQ1NfR1JBWSBpbmRpY2F0ZXMgbGluZWFyIGdyYXkgc2NhbGUgY29sb3Igc3BhY2UuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENTX0dSQVkgaW5kaWNhdGVzIGxpbmVhciBncmF5IHNjYWxlIGNvbG9yIHNwYWNlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTX0dSQVkgPSAxMDAzOwogCi0gICAgLyoqIFRoZSBjc18gZ3JheS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY3NfIGdyYXkuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ29sb3JTcGFjZSBjc19HcmF5ID0gbnVsbDsKICAgICAKLSAgICAvKiogVGhlIGNzXyBweWNjLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjc18gcHljYy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBDb2xvclNwYWNlIGNzX1BZQ0MgPSBudWxsOwogICAgIAotICAgIC8qKiBUaGUgY3NfIGNpZXh5ei4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY3NfIGNpZXh5ei4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBDb2xvclNwYWNlIGNzX0NJRVhZWiA9IG51bGw7CiAgICAgCi0gICAgLyoqIFRoZSBjc18gbHJnYi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY3NfIGxyZ2IuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ29sb3JTcGFjZSBjc19MUkdCID0gbnVsbDsKICAgICAKLSAgICAvKiogVGhlIGNzX3MgcmdiLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjc19zIHJnYi4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBDb2xvclNwYWNlIGNzX3NSR0IgPSBudWxsOwogCi0gICAgLyoqIFRoZSB0eXBlLiAqLworICAgIC8qKgorICAgICAqIFRoZSB0eXBlLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IHR5cGU7CiAgICAgCi0gICAgLyoqIFRoZSBudW0gY29tcG9uZW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbnVtIGNvbXBvbmVudHMuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgbnVtQ29tcG9uZW50czsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIENvbG9yU3BhY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICogQ29sb3JTcGFjZSB0eXBlIGFuZCBudW1iZXIgb2YgY29tcG9uZW50cy4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBDb2xvclNwYWNlIHdpdGggdGhlIHNwZWNpZmllZCBDb2xvclNwYWNlIHR5cGUgYW5kIG51bWJlcgorICAgICAqIG9mIGNvbXBvbmVudHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgY29sb3Igc3BhY2UuCi0gICAgICogQHBhcmFtIG51bWNvbXBvbmVudHMgdGhlIG51bWJlciBvZiBjb21wb25lbnRzLgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiBjb2xvciBzcGFjZS4KKyAgICAgKiBAcGFyYW0gbnVtY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb21wb25lbnRzLgogICAgICAqLwogICAgIHByb3RlY3RlZCBDb2xvclNwYWNlKGludCB0eXBlLCBpbnQgbnVtY29tcG9uZW50cykgewogICAgICAgICB0aGlzLm51bUNvbXBvbmVudHMgPSBudW1jb21wb25lbnRzOwpAQCAtMTYwLDggKzIzOCw4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IGZvciB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWR4IHRoZSBpbmRleCBvZiB0aGUgY29tcG9uZW50LgotICAgICAqIAorICAgICAqIEBwYXJhbSBpZHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29tcG9uZW50LgogICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudC4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoaW50IGlkeCkgewpAQCAtMTc0LDU2ICsyNTIsNTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQZXJmb3JtIHRyYW5zZm9ybWF0aW9uIGEgY29sb3IgZnJvbSB0aGlzIENvbG9yU3BhY2UgCi0gICAgICogaW50byB0aGUgUkdCIGNvbG9yIHNwYWNlLgorICAgICAqIFBlcmZvcm1zIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiBhIGNvbG9yIGZyb20gdGhpcyBDb2xvclNwYWNlIGludG8gdGhlIFJHQgorICAgICAqIGNvbG9yIHNwYWNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xvcnZhbHVlIHRoZSBjb2xvciB2YWx1ZSBpbiB0aGlzIENvbG9yU3BhY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmxvYXQgYXJyYXkgd2l0aCBjb2xvciBjb21wb25lbnRzIGluIHRoZSAKLSAgICAgKiBSR0IgY29sb3Igc3BhY2UuCisgICAgICogQHBhcmFtIGNvbG9ydmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xvciB2YWx1ZSBpbiB0aGlzIENvbG9yU3BhY2UuCisgICAgICogQHJldHVybiB0aGUgZmxvYXQgYXJyYXkgd2l0aCBjb2xvciBjb21wb25lbnRzIGluIHRoZSBSR0IgY29sb3Igc3BhY2UuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGZsb2F0W10gdG9SR0IoZmxvYXRbXSBjb2xvcnZhbHVlKTsKIAogICAgIC8qKgotICAgICAqIFBlcmZvcm0gdHJhbnNmb3JtYXRpb24gYSBjb2xvciBmcm9tIHRoaXMgQ29sb3JTcGFjZSAKLSAgICAgKiBpbnRvIHRoZSBDU19DSUVYWVogY29sb3Igc3BhY2UuCisgICAgICogUGVyZm9ybXMgdGhlIHRyYW5zZm9ybWF0aW9uIG9mIGEgY29sb3IgZnJvbSB0aGlzIENvbG9yU3BhY2UgaW50byB0aGUKKyAgICAgKiBDU19DSUVYWVogY29sb3Igc3BhY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9ydmFsdWUgdGhlIGNvbG9yIHZhbHVlIGluIHRoaXMgQ29sb3JTcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdCBhcnJheSB3aXRoIGNvbG9yIGNvbXBvbmVudHMgaW4gdGhlIAotICAgICAqIENTX0NJRVhZWiBjb2xvciBzcGFjZS4gCisgICAgICogQHBhcmFtIGNvbG9ydmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xvciB2YWx1ZSBpbiB0aGlzIENvbG9yU3BhY2UuCisgICAgICogQHJldHVybiB0aGUgZmxvYXQgYXJyYXkgd2l0aCBjb2xvciBjb21wb25lbnRzIGluIHRoZSBDU19DSUVYWVogY29sb3IKKyAgICAgKiAgICAgICAgIHNwYWNlLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBmbG9hdFtdIHRvQ0lFWFlaKGZsb2F0W10gY29sb3J2YWx1ZSk7CiAKICAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBjb2xvciB0cmFuc2Zvcm1hdGlvbiBmcm9tIHRoZSBSR0IgY29sb3Igc3BhY2UgCi0gICAgICogaW50byB0aGlzIENvbG9yU3BhY2UuCisgICAgICogUGVyZm9ybXMgdGhlIHRyYW5zZm9ybWF0aW9uIG9mIGEgY29sb3IgZnJvbSB0aGUgUkdCIGNvbG9yIHNwYWNlIGludG8gdGhpcworICAgICAqIENvbG9yU3BhY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJnYnZhbHVlIGEgZmxvYXQgYXJyYXkgaW4gdGhlIFJHQiBjb2xvciBzcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdFtdIGFuIGFycmF5IG9mIHRyYW5zZm9ybWVkIGNvbG9yCi0gICAgICogY29tcG9uZW50cy4gCisgICAgICogQHBhcmFtIHJnYnZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgYXJyYXkgcmVwcmVzZW50aW5nIGEgY29sb3IgaW4gdGhlIFJHQiBjb2xvciBzcGFjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdCBhcnJheSB3aXRoIHRoZSB0cmFuc2Zvcm1lZCBjb2xvciBjb21wb25lbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBmbG9hdFtdIGZyb21SR0IoZmxvYXRbXSByZ2J2YWx1ZSk7CiAKICAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBjb2xvciB0cmFuc2Zvcm1hdGlvbiBmcm9tIHRoZSBDU19DSUVYWVogY29sb3Igc3BhY2UgCisgICAgICogUGVyZm9ybXMgdGhlIHRyYW5zZm9ybWF0aW9uIG9mIGEgY29sb3IgZnJvbSB0aGUgQ1NfQ0lFWFlaIGNvbG9yIHNwYWNlCiAgICAgICogaW50byB0aGlzIENvbG9yU3BhY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9ydmFsdWUgYSBmbG9hdCBhcnJheSBpbiB0aGUgQ1NfQ0lFWFlaIGNvbG9yIHNwYWNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZsb2F0W10gYW4gYXJyYXkgb2YgdHJhbnNmb3JtZWQgY29sb3IKLSAgICAgKiBjb21wb25lbnRzLiAKKyAgICAgKiBAcGFyYW0gY29sb3J2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IGFycmF5IHJlcHJlc2VudGluZyBhIGNvbG9yIGluIHRoZSBDU19DSUVYWVogY29sb3IKKyAgICAgKiAgICAgICAgICAgIHNwYWNlLgorICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IHdpdGggdGhlIHRyYW5zZm9ybWVkIGNvbG9yIGNvbXBvbmVudHMuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGZsb2F0W10gZnJvbUNJRVhZWihmbG9hdFtdIGNvbG9ydmFsdWUpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWluaW11bSBub3JtYWxpemVkIGNvbG9yIGNvbXBvbmVudCB2YWx1ZSBmb3IgCi0gICAgICogdGhlIHNwZWNpZmllZCBjb21wb25lbnQuCisgICAgICogR2V0cyB0aGUgbWluaW11bSBub3JtYWxpemVkIGNvbG9yIGNvbXBvbmVudCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50IHRoZSBjb21wb25lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWluaWltdW0gbm9ybWFsaXplZCB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSBjb21wb25lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb21wb25lbnQgdG8gZGV0ZXJtaW5lIHRoZSBtaW5pbXVtIHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gbm9ybWFsaXplZCB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRNaW5WYWx1ZShpbnQgY29tcG9uZW50KSB7CiAgICAgICAgIGlmIChjb21wb25lbnQgPCAwIHx8IGNvbXBvbmVudCA+IG51bUNvbXBvbmVudHMgLSAxKSB7CkBAIC0yMzQsMTEgKzMxMCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1heGltdW0gbm9ybWFsaXplZCBjb2xvciBjb21wb25lbnQgdmFsdWUgZm9yIAotICAgICAqIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50LgorICAgICAqIEdldHMgdGhlIG1heGltdW0gbm9ybWFsaXplZCBjb2xvciBjb21wb25lbnQgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbXBvbmVudCB0aGUgY29tcG9uZW50LgotICAgICAqIAorICAgICAqIEBwYXJhbSBjb21wb25lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb21wb25lbnQgdG8gZGV0ZXJtaW5lIHRoZSBtYXhpbXVtIHZhbHVlLgogICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbm9ybWFsaXplZCB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRNYXhWYWx1ZShpbnQgY29tcG9uZW50KSB7CkBAIC0yNTIsOCArMzI4LDcgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhpcyBDb2xvclNwYWNlIGhhcyBDU19zUkdCIHR5cGUgb3Igbm90LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBDb2xvclNwYWNlIGhhcyBDU19zUkdCIHR5cGUsIAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgQ29sb3JTcGFjZSBoYXMgQ1Nfc1JHQiB0eXBlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNDU19zUkdCKCkgewogICAgICAgICAvLyBJZiBvdXIgY29sb3Igc3BhY2UgaXMgc1JHQiwgdGhlbiBjc19zUkdCCkBAIC0yODEsMTIgKzM1NiwxMSBAQAogCiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzaW5nbGUgaW5zdGFuY2Ugb2YgQ29sb3JTcGFjZSB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBDb2xvclNwYWNlOiBDU19zUkdCLCBDU19MSU5FQVJfUkdCLCBDU19DSUVYWVosIENTX0dSQVksIAotICAgICAqIG9yIENTX1BZQ0MuCisgICAgICogR2V0cyB0aGUgc2luZ2xlIGluc3RhbmNlIG9mIENvbG9yU3BhY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIENvbG9yU3BhY2U6CisgICAgICogQ1Nfc1JHQiwgQ1NfTElORUFSX1JHQiwgQ1NfQ0lFWFlaLCBDU19HUkFZLCBvciBDU19QWUNDLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xvcnNwYWNlIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBzcGVjaWZpZWQgQ29sb3JzcGFjZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29sb3JzcGFjZQorICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHNwZWNpZmllZCBDb2xvcnNwYWNlLgogICAgICAqIEByZXR1cm4gdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgZGVzaXJlZCBDb2xvclNwYWNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ29sb3JTcGFjZSBnZXRJbnN0YW5jZShpbnQgY29sb3JzcGFjZSkgewpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2NvbG9yL0lDQ19Db2xvclNwYWNlLmphdmEgYi9hd3QvamF2YS9hd3QvY29sb3IvSUNDX0NvbG9yU3BhY2UuamF2YQppbmRleCA1ZWNlMmVmLi41YjRkN2U5IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvY29sb3IvSUNDX0NvbG9yU3BhY2UuamF2YQorKysgYi9hd3QvamF2YS9hd3QvY29sb3IvSUNDX0NvbG9yU3BhY2UuamF2YQpAQCAtMjgsMTkgKzI4LDI0IEBACiBpbXBvcnQgamF2YS5pby4qOwogCiAvKioKLSAqIElDQ19Db2xvclNwYWNlIGNsYXNzIGltcGxlbWVudHMgQ29sb3JTcGFjZSBhYnN0cmFjdCBjbGFzcyBhbmQgCi0gKiByZXByZXNlbnRzIGRldmljZSBpbmRlcGVuZGVudCBhbmQgZGV2aWNlIGRlcGVuZGVudCBjb2xvciBzcGFjZXMuCi0gKiBUaGlzIGNvbG9yIHNwYWNlIGlzIGJhc2VkIG9uIHRoZSBJbnRlcm5hdGlvbmFsIENvbG9yIENvbnNvcnRpdW0gCi0gKiBTcGVjaWZpY2F0aW9uIChJQ0MpIEZpbGUgRm9ybWF0IGZvciBDb2xvciBQcm9maWxlczogCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmNvbG9yLm9yZyI+aHR0cDovL3d3dy5jb2xvci5vcmc8L2E+CisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGFic3RyYWN0IGNsYXNzIENvbG9yU3BhY2UgYW5kIHJlcHJlc2VudHMgZGV2aWNlCisgKiBpbmRlcGVuZGVudCBhbmQgZGV2aWNlIGRlcGVuZGVudCBjb2xvciBzcGFjZXMuIFRoaXMgY29sb3Igc3BhY2UgaXMgYmFzZWQgb24KKyAqIHRoZSBJbnRlcm5hdGlvbmFsIENvbG9yIENvbnNvcnRpdW0gU3BlY2lmaWNhdGlvbiAoSUNDKSBGaWxlIEZvcm1hdCBmb3IgQ29sb3IKKyAqIFByb2ZpbGVzOiA8YSBocmVmPSJodHRwOi8vd3d3LmNvbG9yLm9yZyI+aHR0cDovL3d3dy5jb2xvci5vcmc8L2E+CisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSUNDX0NvbG9yU3BhY2UgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzQ1NTg4OTExNDA3MDQzMTQ4M0w7CiAKICAgICAvLyBOZWVkIHRvIGtlZXAgY29tcGF0aWJpbGl0eSB3aXRoIHNlcmlhbGl6ZWQgZm9ybQotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsUGVyc2lzdGVudEZpZWxkcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgc2VyaWFsUGVyc2lzdGVudEZpZWxkcy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RTdHJlYW1GaWVsZFtdCiAgICAgICBzZXJpYWxQZXJzaXN0ZW50RmllbGRzID0gewogICAgICAgICBuZXcgT2JqZWN0U3RyZWFtRmllbGQoInRoaXNQcm9maWxlIiwgSUNDX1Byb2ZpbGUuY2xhc3MpLCAvLyROT04tTkxTLTEkCkBAIC01Myw2MyArNTgsOTQgQEAKIAogCiAgICAvKioKLSAgICAqIEFjY29yZGluZyB0byBJQ0Mgc3BlY2lmaWNhdGlvbiAoZnJvbSBodHRwOi8vd3d3LmNvbG9yLm9yZykKLSAgICAqICJGb3IgdGhlIENJRVhZWiBlbmNvZGluZywgZWFjaCBjb21wb25lbnQgKFgsIFksIGFuZCBaKQotICAgICogaXMgZW5jb2RlZCBhcyBhIHUxRml4ZWQxNU51bWJlciIuCi0gICAgKiBUaGlzIG1lYW5zIHRoYXQgbWF4IHZhbHVlIGZvciB0aGlzIGVuY29kaW5nIGlzIDEgKyAoMzI3NjcvMzI3NjgpCi0gICAgKi8KKyAgICAgKiBBY2NvcmRpbmcgdG8gSUNDIHNwZWNpZmljYXRpb24gKGZyb20gaHR0cDovL3d3dy5jb2xvci5vcmcpICJGb3IgdGhlCisgICAgICogQ0lFWFlaIGVuY29kaW5nLCBlYWNoIGNvbXBvbmVudCAoWCwgWSwgYW5kIFopIGlzIGVuY29kZWQgYXMgYQorICAgICAqIHUxRml4ZWQxNU51bWJlciIuIFRoaXMgbWVhbnMgdGhhdCBtYXggdmFsdWUgZm9yIHRoaXMgZW5jb2RpbmcgaXMgMSArCisgICAgICogKDMyNzY3LzMyNzY4KQorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1BWF9YWVogPSAxZiArICgzMjc2N2YvMzI3NjhmKTsKICAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IE1BWF9TSE9SVC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTUFYX1NIT1JULgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1BWF9TSE9SVCA9IDY1NTM1ZjsKICAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IElOVl9NQVhfU0hPUlQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IElOVl9NQVhfU0hPUlQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgSU5WX01BWF9TSE9SVCA9IDFmL01BWF9TSE9SVDsKICAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IFNIT1JUMlhZWl9GQUNUT1IuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNIT1JUMlhZWl9GQUNUT1IuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgU0hPUlQyWFlaX0ZBQ1RPUiA9IE1BWF9YWVovTUFYX1NIT1JUOwogICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgWFlaMlNIT1JUX0ZBQ1RPUi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgWFlaMlNIT1JUX0ZBQ1RPUi4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBYWVoyU0hPUlRfRkFDVE9SID0gTUFYX1NIT1JUL01BWF9YWVo7CiAKLSAgICAvKiogVGhlIHByb2ZpbGUuICovCisgICAgLyoqCisgICAgICogVGhlIHByb2ZpbGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBJQ0NfUHJvZmlsZSBwcm9maWxlID0gbnVsbDsKICAgICAKLSAgICAvKiogVGhlIG1pbiB2YWx1ZXMuICovCisgICAgLyoqCisgICAgICogVGhlIG1pbiB2YWx1ZXMuCisgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCBtaW5WYWx1ZXNbXSA9IG51bGw7CiAgICAgCi0gICAgLyoqIFRoZSBtYXggdmFsdWVzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBtYXggdmFsdWVzLgorICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgbWF4VmFsdWVzW10gPSBudWxsOwogCiAgICAgLy8gY2FjaGUgdHJhbnNmb3JtcyBoZXJlIC0gcGVyZm9ybWFuY2UgZ2FpbgotICAgIC8qKiBUaGUgdG8gcmdiIHRyYW5zZm9ybS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgdG8gcmdiIHRyYW5zZm9ybS4KKyAgICAgKi8KICAgICBwcml2YXRlIElDQ19UcmFuc2Zvcm0gdG9SR0JUcmFuc2Zvcm0gPSBudWxsOwogICAgIAotICAgIC8qKiBUaGUgZnJvbSByZ2IgdHJhbnNmb3JtLiAqLworICAgIC8qKgorICAgICAqIFRoZSBmcm9tIHJnYiB0cmFuc2Zvcm0uCisgICAgICovCiAgICAgcHJpdmF0ZSBJQ0NfVHJhbnNmb3JtIGZyb21SR0JUcmFuc2Zvcm0gPSBudWxsOwogICAgIAotICAgIC8qKiBUaGUgdG8geHl6IHRyYW5zZm9ybS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgdG8geHl6IHRyYW5zZm9ybS4KKyAgICAgKi8KICAgICBwcml2YXRlIElDQ19UcmFuc2Zvcm0gdG9YWVpUcmFuc2Zvcm0gPSBudWxsOwogICAgIAotICAgIC8qKiBUaGUgZnJvbSB4eXogdHJhbnNmb3JtLiAqLworICAgIC8qKgorICAgICAqIFRoZSBmcm9tIHh5eiB0cmFuc2Zvcm0uCisgICAgICovCiAgICAgcHJpdmF0ZSBJQ0NfVHJhbnNmb3JtIGZyb21YWVpUcmFuc2Zvcm0gPSBudWxsOwogCi0gICAgLyoqIFRoZSBjb252ZXJ0ZXIuICovCisgICAgLyoqCisgICAgICogVGhlIGNvbnZlcnRlci4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIENvbG9yQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBDb2xvckNvbnZlcnRlcigpOwogICAgIAotICAgIC8qKiBUaGUgc2NhbGVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzY2FsZXIuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBDb2xvclNjYWxlciBzY2FsZXIgPSBuZXcgQ29sb3JTY2FsZXIoKTsKICAgICAKLSAgICAvKiogVGhlIHNjYWxpbmcgZGF0YSBsb2FkZWQuICovCisgICAgLyoqCisgICAgICogVGhlIHNjYWxpbmcgZGF0YSBsb2FkZWQuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIHNjYWxpbmdEYXRhTG9hZGVkID0gZmFsc2U7CiAKLSAgICAvKiogVGhlIHJlc29sdmVkIGRlc2VyaWFsaXplZCBpbnN0LiAqLworICAgIC8qKgorICAgICAqIFRoZSByZXNvbHZlZCBkZXNlcmlhbGl6ZWQgaW5zdC4KKyAgICAgKi8KICAgICBwcml2YXRlIElDQ19Db2xvclNwYWNlIHJlc29sdmVkRGVzZXJpYWxpemVkSW5zdDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJQ0MgY29sb3Igc3BhY2UgZnJvbSBhbiBJQ0NfUHJvZmlsZSBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBmIHRoZSBJQ0NfUHJvZmlsZSBvYmplY3QuCisgICAgICogQHBhcmFtIHBmCisgICAgICogICAgICAgICAgICB0aGUgSUNDX1Byb2ZpbGUgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBJQ0NfQ29sb3JTcGFjZShJQ0NfUHJvZmlsZSBwZikgewogICAgICAgICBzdXBlcihwZi5nZXRDb2xvclNwYWNlVHlwZSgpLCBwZi5nZXROdW1Db21wb25lbnRzKCkpOwpAQCAtMTMyLDcgKzE2OCw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSUNDX1Byb2ZpbGUgZm9yIHRoaXMgSUNDX0NvbG9yU3BhY2UuCisgICAgICogR2V0cyB0aGUgSUNDX1Byb2ZpbGUgZm9yIHRoaXMgSUNDX0NvbG9yU3BhY2UuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgSUNDX1Byb2ZpbGUgZm9yIHRoaXMgSUNDX0NvbG9yU3BhY2UuCiAgICAgICovCkBAIC0xNDQsNiArMTgwLDE0IEBACiAgICAgICAgIHJldHVybiBwcm9maWxlOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiBhIGNvbG9yIGZyb20gdGhpcyBDb2xvclNwYWNlIGludG8gdGhlIFJHQgorICAgICAqIGNvbG9yIHNwYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb2xvcnZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgY29sb3IgdmFsdWUgaW4gdGhpcyBDb2xvclNwYWNlLgorICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IHdpdGggY29sb3IgY29tcG9uZW50cyBpbiB0aGUgUkdCIGNvbG9yIHNwYWNlLgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmbG9hdFtdIHRvUkdCKGZsb2F0W10gY29sb3J2YWx1ZSkgewogICAgICAgICBpZiAodG9SR0JUcmFuc2Zvcm0gPT0gbnVsbCkgewpAQCAtMTc0LDYgKzIxOCwxNSBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiBhIGNvbG9yIGZyb20gdGhpcyBDb2xvclNwYWNlIGludG8gdGhlCisgICAgICogQ1NfQ0lFWFlaIGNvbG9yIHNwYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb2xvcnZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgY29sb3IgdmFsdWUgaW4gdGhpcyBDb2xvclNwYWNlLgorICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IHdpdGggY29sb3IgY29tcG9uZW50cyBpbiB0aGUgQ1NfQ0lFWFlaIGNvbG9yCisgICAgICogICAgICAgICBzcGFjZS4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmxvYXRbXSB0b0NJRVhZWihmbG9hdFtdIGNvbG9ydmFsdWUpIHsKICAgICAgICAgaWYgKHRvWFlaVHJhbnNmb3JtID09IG51bGwpIHsKQEAgLTIxMiw2ICsyNjUsMTQgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyB0aGUgdHJhbnNmb3JtYXRpb24gb2YgYSBjb2xvciBmcm9tIHRoZSBSR0IgY29sb3Igc3BhY2UgaW50byB0aGlzCisgICAgICogQ29sb3JTcGFjZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmdidmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBhcnJheSByZXByZXNlbnRpbmcgYSBjb2xvciBpbiB0aGUgUkdCIGNvbG9yIHNwYWNlLgorICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IHdpdGggdGhlIHRyYW5zZm9ybWVkIGNvbG9yIGNvbXBvbmVudHMuCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZsb2F0W10gZnJvbVJHQihmbG9hdFtdIHJnYnZhbHVlKSB7CiAgICAgICAgIGlmIChmcm9tUkdCVHJhbnNmb3JtID09IG51bGwpIHsKQEAgLTI0MSw2ICszMDIsMTUgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyB0aGUgdHJhbnNmb3JtYXRpb24gb2YgYSBjb2xvciBmcm9tIHRoZSBDU19DSUVYWVogY29sb3Igc3BhY2UKKyAgICAgKiBpbnRvIHRoaXMgQ29sb3JTcGFjZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0geHl6dmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBhcnJheSByZXByZXNlbnRpbmcgYSBjb2xvciBpbiB0aGUgQ1NfQ0lFWFlaIGNvbG9yCisgICAgICogICAgICAgICAgICBzcGFjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdCBhcnJheSB3aXRoIHRoZSB0cmFuc2Zvcm1lZCBjb2xvciBjb21wb25lbnRzLgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmbG9hdFtdIGZyb21DSUVYWVooZmxvYXRbXSB4eXp2YWx1ZSkgewogICAgICAgICBpZiAoZnJvbVhZWlRyYW5zZm9ybSA9PSBudWxsKSB7CkBAIC0yNzksNiArMzQ5LDE0IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWluaW11bSBub3JtYWxpemVkIGNvbG9yIGNvbXBvbmVudCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIGNvbXBvbmVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50CisgICAgICogICAgICAgICAgICB0aGUgY29tcG9uZW50IHRvIGRldGVybWluZSB0aGUgbWluaW11bSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIG5vcm1hbGl6ZWQgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmxvYXQgZ2V0TWluVmFsdWUoaW50IGNvbXBvbmVudCkgewogICAgICAgICBpZiAoKGNvbXBvbmVudCA8IDApIHx8IChjb21wb25lbnQgPiB0aGlzLmdldE51bUNvbXBvbmVudHMoKSAtIDEpKSB7CkBAIC0yODksNiArMzY3LDE0IEBACiAgICAgICAgIHJldHVybiBtaW5WYWx1ZXNbY29tcG9uZW50XTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIG5vcm1hbGl6ZWQgY29sb3IgY29tcG9uZW50IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogY29tcG9uZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb21wb25lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb21wb25lbnQgdG8gZGV0ZXJtaW5lIHRoZSBtYXhpbXVtIHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbm9ybWFsaXplZCB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmbG9hdCBnZXRNYXhWYWx1ZShpbnQgY29tcG9uZW50KSB7CiAgICAgICAgIGlmICgoY29tcG9uZW50IDwgMCkgfHwgKGNvbXBvbmVudCA+IHRoaXMuZ2V0TnVtQ29tcG9uZW50cygpIC0gMSkpIHsKQEAgLTMzNCw5ICs0MjAsMTAgQEAKICAgICAvKioKICAgICAgKiBXcml0ZSBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG91dCB0aGUgb3V0Ci0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIG91dAorICAgICAqICAgICAgICAgICAgdGhlIG91dAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbS5QdXRGaWVsZCBmaWVsZHMgPSBvdXQucHV0RmllbGRzKCk7CkBAIC0zNTQsMTAgKzQ0MSwxMiBAQAogICAgIC8qKgogICAgICAqIFJlYWQgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbiB0aGUgaW4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gdGhlIGNsYXNzIG5vdCBmb3VuZCBleGNlcHRpb24KKyAgICAgKiBAcGFyYW0gaW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgdGhlIGNsYXNzIG5vdCBmb3VuZCBleGNlcHRpb24KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0uR2V0RmllbGQgZmllbGRzID0gaW4ucmVhZEZpZWxkcygpOwpAQCAtMzY5LDggKzQ1OCw4IEBACiAgICAgICogUmVhZCByZXNvbHZlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIG9iamVjdAotICAgICAqIAotICAgICAqIEB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHRoZSBvYmplY3Qgc3RyZWFtIGV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgdGhlIG9iamVjdCBzdHJlYW0gZXhjZXB0aW9uCiAgICAgICovCiAgICAgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiByZXNvbHZlZERlc2VyaWFsaXplZEluc3Q7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvY29sb3IvSUNDX1Byb2ZpbGUuamF2YSBiL2F3dC9qYXZhL2F3dC9jb2xvci9JQ0NfUHJvZmlsZS5qYXZhCmluZGV4IGFkNzA0ZTAuLjhmZmVlNmMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9jb2xvci9JQ0NfUHJvZmlsZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9jb2xvci9JQ0NfUHJvZmlsZS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIE9sZWcgVi4gS2hhc2NoYW5za3kKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmNvbG9yOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtNDAsNDI3ICs0MSw2ODEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgSUNDX1Byb2ZpbGUgY2xhc3MgcmVwcmVzZW50cyBhIGNvbG9yIHByb2ZpbGUgZGF0YSBmb3IgY29sb3Igc3BhY2VzIAotICogYmFzZWQgb24gdGhlIEludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bSBTcGVjaWZpY2F0aW9uIElDQy4xOjIwMDEtMTIsIAotICogRmlsZSBGb3JtYXQgZm9yIENvbG9yIFByb2ZpbGVzLgorICogVGhlIElDQ19Qcm9maWxlIGNsYXNzIHJlcHJlc2VudHMgYSBjb2xvciBwcm9maWxlIGRhdGEgZm9yIGNvbG9yIHNwYWNlcyBiYXNlZAorICogb24gdGhlIEludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bSBTcGVjaWZpY2F0aW9uIElDQy4xOjIwMDEtMTIsIEZpbGUKKyAqIEZvcm1hdCBmb3IgQ29sb3IgUHJvZmlsZXMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSUNDX1Byb2ZpbGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zOTM4NTE1ODYxOTkwOTM2NzY2TDsKIAogICAgIC8vIE5PVEU6IENvbnN0YW50IGZpZWxkIHZhbHVlcyBhcmUgbm90ZWQgaW4gMS41IHNwZWNpZmljYXRpb24uCiAKICAgICAvKioKLSAgICAgKiBUaGUgQ29uc3RhbnQgQ0xBU1NfSU5QVVQgaW5kaWNhdGVzIHRoYXQgcHJvZmlsZSBjbGFzcyBpcyBpbnB1dC4gCisgICAgICogVGhlIENvbnN0YW50IENMQVNTX0lOUFVUIGluZGljYXRlcyB0aGF0IHByb2ZpbGUgY2xhc3MgaXMgaW5wdXQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfSU5QVVQgPSAwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBDTEFTU19ESVNQTEFZIGluZGljYXRlcyB0aGF0IHByb2ZpbGUgY2xhc3MgaXMgZGlzcGxheS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENMQVNTX0RJU1BMQVkgaW5kaWNhdGVzIHRoYXQgcHJvZmlsZSBjbGFzcyBpcyBkaXNwbGF5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTX0RJU1BMQVkgPSAxOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBDTEFTU19PVVRQVVQgaW5kaWNhdGVzIHRoYXQgcHJvZmlsZSBjbGFzcyBpcyBvdXRwdXQuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDTEFTU19PVVRQVVQgaW5kaWNhdGVzIHRoYXQgcHJvZmlsZSBjbGFzcyBpcyBvdXRwdXQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfT1VUUFVUID0gMjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgQ0xBU1NfREVWSUNFTElOSyBpbmRpY2F0ZXMgdGhhdCBwcm9maWxlIGNsYXNzIAotICAgICAqIGlzIGRldmljZSBsaW5rLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ0xBU1NfREVWSUNFTElOSyBpbmRpY2F0ZXMgdGhhdCBwcm9maWxlIGNsYXNzIGlzIGRldmljZQorICAgICAqIGxpbmsuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfREVWSUNFTElOSyA9IDM7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IENMQVNTX0NPTE9SU1BBQ0VDT05WRVJTSU9OIGluZGljYXRlcyB0aGF0IHByb2ZpbGUgY2xhc3MgCi0gICAgICogaXMgY29sb3Igc3BhY2UgY29udmVyc2lvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ0xBU1NfQ09MT1JTUEFDRUNPTlZFUlNJT04gaW5kaWNhdGVzIHRoYXQgcHJvZmlsZSBjbGFzcyBpcworICAgICAqIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfQ09MT1JTUEFDRUNPTlZFUlNJT04gPSA0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBDTEFTU19BQlNUUkFDVCBpbmRpY2F0ZXMgdGhhdCBwcm9maWxlIGNsYXNzIGlzIGFic3RyYWN0LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDTEFTU19BQlNUUkFDVCBpbmRpY2F0ZXMgdGhhdCBwcm9maWxlIGNsYXNzIGlzIGFic3RyYWN0LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTX0FCU1RSQUNUID0gNTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgQ0xBU1NfTkFNRURDT0xPUiBpbmRpY2F0ZXMgdGhhdCBwcm9maWxlIGNsYXNzIAotICAgICAqIGlzIG5hbWVkIGNvbG9yLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ0xBU1NfTkFNRURDT0xPUiBpbmRpY2F0ZXMgdGhhdCBwcm9maWxlIGNsYXNzIGlzIG5hbWVkCisgICAgICogY29sb3IuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfTkFNRURDT0xPUiA9IDY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnWFlaRGF0YSAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1hZWkRhdGEgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1hZWkRhdGEgPSAxNDgyMjUwNzg0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0xhYkRhdGEgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdMYWJEYXRhIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdMYWJEYXRhID0gMTI4MTQ1MDUyODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdMdXZEYXRhIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnTHV2RGF0YSAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnTHV2RGF0YSA9IDEyODI3NjYzNjg7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnWUNiQ3JEYXRhIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnWUNiQ3JEYXRhIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdZQ2JDckRhdGEgPSAxNDk3NTg4MzM4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1l4eURhdGEgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdZeHlEYXRhIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdZeHlEYXRhID0gMTUwMTA2NzU1MjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdSZ2JEYXRhIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnUmdiRGF0YSAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnUmdiRGF0YSA9IDEzODA0MDE2OTY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnR3JheURhdGEgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdHcmF5RGF0YSAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnR3JheURhdGEgPSAxMTk2NTczMDE3OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0hzdkRhdGEgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdIc3ZEYXRhIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdIc3ZEYXRhID0gMTIxMzQyMTA4ODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdIbHNEYXRhIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnSGxzRGF0YSAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnSGxzRGF0YSA9IDEyMTI5NjE1Njg7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnQ215a0RhdGEgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdDbXlrRGF0YSAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnQ215a0RhdGEgPSAxMTI5MTQyNjAzOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0NteURhdGEgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdDbXlEYXRhIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdDbXlEYXRhID0gMTEyOTE0MjU2MDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTJDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTJDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlMkNMUiA9IDg0MzI3MTI1MDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTNDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTNDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlM0NMUiA9IDg2MDA0ODQ2NjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTRDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTRDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlNENMUiA9IDg3NjgyNTY4MjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTVDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTVDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlNUNMUiA9IDg5MzYwMjg5ODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTZDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTZDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlNkNMUiA9IDkxMDM4MDExNDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTdDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTdDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlN0NMUiA9IDkyNzE1NzMzMDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZThDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZThDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlOENMUiA9IDk0MzkzNDU0NjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTlDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTlDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlOUNMUiA9IDk2MDcxMTc2MjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZUFDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZUFDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlQUNMUiA9IDEwOTQ5Mjk0OTA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnU3BhY2VCQ0xSIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnU3BhY2VCQ0xSIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdTcGFjZUJDTFIgPSAxMTExNzA2NzA2OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1NwYWNlQ0NMUiAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1NwYWNlQ0NMUiAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnU3BhY2VDQ0xSID0gMTEyODQ4MzkyMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZURDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZURDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlRENMUiA9IDExNDUyNjExMzg7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnU3BhY2VFQ0xSIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnU3BhY2VFQ0xSIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdTcGFjZUVDTFIgPSAxMTYyMDM4MzU0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1NwYWNlRkNMUiAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1NwYWNlRkNMUiAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnU3BhY2VGQ0xSID0gMTE3ODgxNTU3MDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdJbnB1dENsYXNzIC0gSUNDIFByb2ZpbGUgQ2xhc3MgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0lucHV0Q2xhc3MgLSBJQ0MgUHJvZmlsZSBDbGFzcyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdJbnB1dENsYXNzID0gMTkzNTg5NjE3ODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdEaXNwbGF5Q2xhc3MgLSBJQ0MgUHJvZmlsZSBDbGFzcyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnRGlzcGxheUNsYXNzIC0gSUNDIFByb2ZpbGUgQ2xhc3MgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnRGlzcGxheUNsYXNzID0gMTgzNTk1NTMxNDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdPdXRwdXRDbGFzcyAtIElDQyBQcm9maWxlIENsYXNzIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdPdXRwdXRDbGFzcyAtIElDQyBQcm9maWxlIENsYXNzIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ091dHB1dENsYXNzID0gMTg4NjU0OTEwNjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdMaW5rQ2xhc3MgLSBJQ0MgUHJvZmlsZSBDbGFzcyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnTGlua0NsYXNzIC0gSUNDIFByb2ZpbGUgQ2xhc3MgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnTGlua0NsYXNzID0gMTgxODg0ODg3NTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdBYnN0cmFjdENsYXNzIC0gSUNDIFByb2ZpbGUgQ2xhc3MgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0Fic3RyYWN0Q2xhc3MgLSBJQ0MgUHJvZmlsZSBDbGFzcyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdBYnN0cmFjdENsYXNzID0gMTYzMzg0MjAzNjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdDb2xvcmFudE9yZGVyVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdDb2xvcmFudE9yZGVyVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ0NvbG9yYW50T3JkZXJUYWcgPSAxNjY4MDUxNTY3OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0NvbG9yYW50VGFibGVUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0NvbG9yYW50VGFibGVUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnQ29sb3JhbnRUYWJsZVRhZyA9IDE2NjgwNTE1NzI7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnQ29sb3JTcGFjZUNsYXNzIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdDb2xvclNwYWNlQ2xhc3MgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnQ29sb3JTcGFjZUNsYXNzID0gMTkzNjc0NDgwMzsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdOYW1lZENvbG9yQ2xhc3MgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ05hbWVkQ29sb3JDbGFzcyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdOYW1lZENvbG9yQ2xhc3MgPSAxODUyNjYyNjM2OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1BlcmNlcHR1YWwgLSBJQ0MgUHJvZmlsZSBSZW5kZXJpbmcgSW50ZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1BlcmNlcHR1YWwgLSBJQ0MgUHJvZmlsZSBSZW5kZXJpbmcgSW50ZW50LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljUGVyY2VwdHVhbCA9IDA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljUmVsYXRpdmVDb2xvcmltZXRyaWMgLSBJQ0MgUHJvZmlsZSBSZW5kZXJpbmcgSW50ZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1JlbGF0aXZlQ29sb3JpbWV0cmljIC0gSUNDIFByb2ZpbGUgUmVuZGVyaW5nIEludGVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1JlbGF0aXZlQ29sb3JpbWV0cmljID0gMTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTYXR1cmF0aW9uIC0gSUNDIFByb2ZpbGUgUmVuZGVyaW5nIEludGVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTYXR1cmF0aW9uIC0gSUNDIFByb2ZpbGUgUmVuZGVyaW5nIEludGVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NhdHVyYXRpb24gPSAyOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0Fic29sdXRlQ29sb3JpbWV0cmljIC0gSUNDIFByb2ZpbGUgUmVuZGVyaW5nIEludGVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNBYnNvbHV0ZUNvbG9yaW1ldHJpYyAtIElDQyBQcm9maWxlIFJlbmRlcmluZyBJbnRlbnQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNBYnNvbHV0ZUNvbG9yaW1ldHJpYyA9IDM7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnSGVhZCAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnSGVhZCAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdIZWFkID0gMTc1MTQ3NDUzMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdBVG9CMFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnQVRvQjBUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnQVRvQjBUYWcgPSAxMDkzODEyNzg0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0FUb0IxVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdBVG9CMVRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdBVG9CMVRhZyA9IDEwOTM4MTI3ODU7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnQVRvQjJUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0FUb0IyVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ0FUb0IyVGFnID0gMTA5MzgxMjc4NjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdCbHVlQ29sb3JhbnRUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0JsdWVDb2xvcmFudFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdCbHVlQ29sb3JhbnRUYWcgPSAxNjQ5OTU3MjEwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0JsdWVNYXRyaXhDb2x1bW5UYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0JsdWVNYXRyaXhDb2x1bW5UYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnQmx1ZU1hdHJpeENvbHVtblRhZyA9IDE2NDk5NTcyMTA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnQmx1ZVRSQ1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnQmx1ZVRSQ1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdCbHVlVFJDVGFnID0gMTY0OTY5MzI1MTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdCVG9BMFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnQlRvQTBUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnQlRvQTBUYWcgPSAxMTEwNTg5NzQ0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0JUb0ExVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdCVG9BMVRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdCVG9BMVRhZyA9IDExMTA1ODk3NDU7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnQlRvQTJUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0JUb0EyVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ0JUb0EyVGFnID0gMTExMDU4OTc0NjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdDYWxpYnJhdGlvbkRhdGVUaW1lVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdDYWxpYnJhdGlvbkRhdGVUaW1lVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ0NhbGlicmF0aW9uRGF0ZVRpbWVUYWcgPSAxNjY3MzI5MTQwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0NoYXJUYXJnZXRUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0NoYXJUYXJnZXRUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnQ2hhclRhcmdldFRhZyA9IDE5NTI1NDMzMzU7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnQ29weXJpZ2h0VGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdDb3B5cmlnaHRUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnQ29weXJpZ2h0VGFnID0gMTY2ODMxMzcxNjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdDcmRJbmZvVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdDcmRJbmZvVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ0NyZEluZm9UYWcgPSAxNjY4NDQxMTkzOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0RldmljZU1mZ0Rlc2NUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0RldmljZU1mZ0Rlc2NUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnRGV2aWNlTWZnRGVzY1RhZyA9IDE2ODQ4OTMyODQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnRGV2aWNlTW9kZWxEZXNjVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdEZXZpY2VNb2RlbERlc2NUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnRGV2aWNlTW9kZWxEZXNjVGFnID0gMTY4NDg5MDcyNDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdEZXZpY2VTZXR0aW5nc1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnRGV2aWNlU2V0dGluZ3NUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnRGV2aWNlU2V0dGluZ3NUYWcgPSAxNjg0MzcxMDU5OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0dhbXV0VGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdHYW11dFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdHYW11dFRhZyA9IDE3MzQ0MzgyNjA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnR3JheVRSQ1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnR3JheVRSQ1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdHcmF5VFJDVGFnID0gMTgwMDY4ODE5NTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdHcmVlbkNvbG9yYW50VGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdHcmVlbkNvbG9yYW50VGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ0dyZWVuQ29sb3JhbnRUYWcgPSAxNzMzODQzMjkwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0dyZWVuTWF0cml4Q29sdW1uVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdHcmVlbk1hdHJpeENvbHVtblRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdHcmVlbk1hdHJpeENvbHVtblRhZyA9IDE3MzM4NDMyOTA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnR3JlZW5UUkNUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0dyZWVuVFJDVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ0dyZWVuVFJDVGFnID0gMTczMzU3OTMzMTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdMdW1pbmFuY2VUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0x1bWluYW5jZVRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdMdW1pbmFuY2VUYWcgPSAxODE5NjM1MDQ5OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ01lYXN1cmVtZW50VGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdNZWFzdXJlbWVudFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdNZWFzdXJlbWVudFRhZyA9IDE4MzUzNjA2Mjc7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnTWVkaWFCbGFja1BvaW50VGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdNZWRpYUJsYWNrUG9pbnRUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnTWVkaWFCbGFja1BvaW50VGFnID0gMTY1MTIwODMwODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdNZWRpYVdoaXRlUG9pbnRUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ01lZGlhV2hpdGVQb2ludFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdNZWRpYVdoaXRlUG9pbnRUYWcgPSAyMDA0MTE5NjY4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ05hbWVkQ29sb3IyVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdOYW1lZENvbG9yMlRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdOYW1lZENvbG9yMlRhZyA9IDE4NTIwMDk1MjI7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnT3V0cHV0UmVzcG9uc2VUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ091dHB1dFJlc3BvbnNlVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ091dHB1dFJlc3BvbnNlVGFnID0gMTkxOTI1MTMxMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdQcmV2aWV3MFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnUHJldmlldzBUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnUHJldmlldzBUYWcgPSAxODg2NTQ1MjAwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1ByZXZpZXcxVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdQcmV2aWV3MVRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdQcmV2aWV3MVRhZyA9IDE4ODY1NDUyMDE7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnUHJldmlldzJUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1ByZXZpZXcyVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1ByZXZpZXcyVGFnID0gMTg4NjU0NTIwMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdQcm9maWxlRGVzY3JpcHRpb25UYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1Byb2ZpbGVEZXNjcmlwdGlvblRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdQcm9maWxlRGVzY3JpcHRpb25UYWcgPSAxNjg0MzcwMjc1OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1Byb2ZpbGVTZXF1ZW5jZURlc2NUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1Byb2ZpbGVTZXF1ZW5jZURlc2NUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnUHJvZmlsZVNlcXVlbmNlRGVzY1RhZyA9IDE4ODY2MTA4MDE7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnUHMyQ1JEMFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnUHMyQ1JEMFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdQczJDUkQwVGFnID0gMTg4NjYxMDQ4MDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdQczJDUkQxVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdQczJDUkQxVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1BzMkNSRDFUYWcgPSAxODg2NjEwNDgxOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1BzMkNSRDJUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1BzMkNSRDJUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnUHMyQ1JEMlRhZyA9IDE4ODY2MTA0ODI7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnUHMyQ1JEM1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnUHMyQ1JEM1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdQczJDUkQzVGFnID0gMTg4NjYxMDQ4MzsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdQczJDU0FUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1BzMkNTQVRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdQczJDU0FUYWcgPSAxODg2NTk3NzQ3OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1BzMlJlbmRlcmluZ0ludGVudFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnUHMyUmVuZGVyaW5nSW50ZW50VGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1BzMlJlbmRlcmluZ0ludGVudFRhZyA9IDE4ODY1OTc3Mzc7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnUmVkQ29sb3JhbnRUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1JlZENvbG9yYW50VGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1JlZENvbG9yYW50VGFnID0gMTkxODM5MjY2NjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdSZWRNYXRyaXhDb2x1bW5UYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1JlZE1hdHJpeENvbHVtblRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdSZWRNYXRyaXhDb2x1bW5UYWcgPSAxOTE4MzkyNjY2OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1JlZFRSQ1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnUmVkVFJDVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1JlZFRSQ1RhZyA9IDE5MTgxMjg3MDc7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnU2NyZWVuaW5nRGVzY1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnU2NyZWVuaW5nRGVzY1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdTY3JlZW5pbmdEZXNjVGFnID0gMTkzNTg5NzE4ODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTY3JlZW5pbmdUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1NjcmVlbmluZ1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdTY3JlZW5pbmdUYWcgPSAxOTM1ODk3MTk4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1RlY2hub2xvZ3lUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1RlY2hub2xvZ3lUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnVGVjaG5vbG9neVRhZyA9IDE5NTI4MDE2NDA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnVWNyQmdUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1VjckJnVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1VjckJnVGFnID0gMTY1MDg3NzQ3MjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdWaWV3aW5nQ29uZERlc2NUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1ZpZXdpbmdDb25kRGVzY1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdWaWV3aW5nQ29uZERlc2NUYWcgPSAxOTg3NDA1MTU2OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1ZpZXdpbmdDb25kaXRpb25zVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdWaWV3aW5nQ29uZGl0aW9uc1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdWaWV3aW5nQ29uZGl0aW9uc1RhZyA9IDE5ODY2MTg3NDM7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnQ2hyb21hdGljQWRhcHRhdGlvblRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnQ2hyb21hdGljQWRhcHRhdGlvblRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdDaHJvbWF0aWNBZGFwdGF0aW9uVGFnID0gMTY2Nzc4NTA2MDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdDaHJvbWF0aWNpdHlUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0Nocm9tYXRpY2l0eVRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdDaHJvbWF0aWNpdHlUYWcgPSAxNjY3Nzg5NDIxOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0hkclNpemUgLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljSGRyU2l6ZSAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0hkclNpemUgPSAwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0hkckNtbUlkIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0hkckNtbUlkIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljSGRyQ21tSWQgPSA0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0hkclZlcnNpb24gLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljSGRyVmVyc2lvbiAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0hkclZlcnNpb24gPSA4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0hkckRldmljZUNsYXNzIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0hkckRldmljZUNsYXNzIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljSGRyRGV2aWNlQ2xhc3MgPSAxMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNIZHJDb2xvclNwYWNlIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0hkckNvbG9yU3BhY2UgLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNIZHJDb2xvclNwYWNlID0gMTY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljSGRyUGNzIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0hkclBjcyAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0hkclBjcyA9IDIwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0hkckRhdGUgLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljSGRyRGF0ZSAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0hkckRhdGUgPSAyNDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNIZHJNYWdpYyAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNIZHJNYWdpYyAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0hkck1hZ2ljID0gMzY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljSGRyUGxhdGZvcm0gLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljSGRyUGxhdGZvcm0gLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNIZHJQbGF0Zm9ybSA9IDQwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0hkclByb2ZpbGVJRCAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNIZHJQcm9maWxlSUQgLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNIZHJQcm9maWxlSUQgPSA4NDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNIZHJGbGFncyAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNIZHJGbGFncyAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0hkckZsYWdzID0gNDQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljSGRyTWFudWZhY3R1cmVyIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0hkck1hbnVmYWN0dXJlciAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0hkck1hbnVmYWN0dXJlciA9IDQ4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0hkck1vZGVsIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0hkck1vZGVsIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljSGRyTW9kZWwgPSA1MjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNIZHJBdHRyaWJ1dGVzIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0hkckF0dHJpYnV0ZXMgLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNIZHJBdHRyaWJ1dGVzID0gNTY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljSGRyUmVuZGVyaW5nSW50ZW50IC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0hkclJlbmRlcmluZ0ludGVudCAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0hkclJlbmRlcmluZ0ludGVudCA9IDY0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0hkcklsbHVtaW5hbnQgLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljSGRySWxsdW1pbmFudCAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0hkcklsbHVtaW5hbnQgPSA2ODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNIZHJDcmVhdG9yIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0hkckNyZWF0b3IgLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNIZHJDcmVhdG9yID0gODA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljSUNDQWJzb2x1dGVDb2xvcmltZXRyaWMgLSBJQ0MgUHJvZmlsZSBSZW5kZXJpbmcgSW50ZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0lDQ0Fic29sdXRlQ29sb3JpbWV0cmljIC0gSUNDIFByb2ZpbGUgUmVuZGVyaW5nIEludGVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0lDQ0Fic29sdXRlQ29sb3JpbWV0cmljID0gMzsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNNZWRpYVJlbGF0aXZlQ29sb3JpbWV0cmljIC0gSUNDIFByb2ZpbGUgUmVuZGVyaW5nIEludGVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNNZWRpYVJlbGF0aXZlQ29sb3JpbWV0cmljIC0gSUNDIFByb2ZpbGUgUmVuZGVyaW5nIEludGVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY01lZGlhUmVsYXRpdmVDb2xvcmltZXRyaWMgPSAxOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1RhZ1R5cGUgLSBJQ0MgUHJvZmlsZSBDb25zdGFudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNUYWdUeXBlIC0gSUNDIFByb2ZpbGUgQ29uc3RhbnQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNUYWdUeXBlID0gMDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNUYWdSZXNlcnZlZCAtIElDQyBQcm9maWxlIENvbnN0YW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1RhZ1Jlc2VydmVkIC0gSUNDIFByb2ZpbGUgQ29uc3RhbnQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNUYWdSZXNlcnZlZCA9IDQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljQ3VydmVDb3VudCAtIElDQyBQcm9maWxlIENvbnN0YW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0N1cnZlQ291bnQgLSBJQ0MgUHJvZmlsZSBDb25zdGFudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0N1cnZlQ291bnQgPSA4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0N1cnZlRGF0YSAtIElDQyBQcm9maWxlIENvbnN0YW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0N1cnZlRGF0YSAtIElDQyBQcm9maWxlIENvbnN0YW50LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljQ3VydmVEYXRhID0gMTI7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljWFlaTnVtYmVyWCAtIElDQyBQcm9maWxlIENvbnN0YW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1hZWk51bWJlclggLSBJQ0MgUHJvZmlsZSBDb25zdGFudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1hZWk51bWJlclggPSA4OwogCi0gICAgLyoqIFNpemUgb2YgYSBwcm9maWxlIGhlYWRlci4gKi8KKyAgICAvKioKKyAgICAgKiBTaXplIG9mIGEgcHJvZmlsZSBoZWFkZXIuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGhlYWRlclNpemUgPSAxMjg7CiAKLSAgICAvKiogaGVhZGVyIG1hZ2ljIG51bWJlci4gKi8KKyAgICAvKioKKyAgICAgKiBoZWFkZXIgbWFnaWMgbnVtYmVyLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBoZWFkZXJNYWdpY051bWJlciA9IDB4NjE2MzczNzA7CiAKICAgICAvLyBDYWNoZSBvZiBwcmVkZWZpbmVkIHByb2ZpbGVzCi0gICAgLyoqIFRoZSBzIHJnYiBwcm9maWxlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzIHJnYiBwcm9maWxlLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIElDQ19Qcm9maWxlIHNSR0JQcm9maWxlOwotICAgIAotICAgIC8qKiBUaGUgeHl6IHByb2ZpbGUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgeHl6IHByb2ZpbGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgSUNDX1Byb2ZpbGUgeHl6UHJvZmlsZTsKLSAgICAKLSAgICAvKiogVGhlIGdyYXkgcHJvZmlsZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBncmF5IHByb2ZpbGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgSUNDX1Byb2ZpbGUgZ3JheVByb2ZpbGU7Ci0gICAgCi0gICAgLyoqIFRoZSBweWNjIHByb2ZpbGUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHljYyBwcm9maWxlLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIElDQ19Qcm9maWxlIHB5Y2NQcm9maWxlOwotICAgIAotICAgIC8qKiBUaGUgbGluZWFyIHJnYiBwcm9maWxlLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGxpbmVhciByZ2IgcHJvZmlsZS4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBJQ0NfUHJvZmlsZSBsaW5lYXJSR0JQcm9maWxlOwogCi0gICAgLyoqIEhhbmRsZSB0byB0aGUgY3VycmVudCBwcm9maWxlLiAqLworICAgIC8qKgorICAgICAqIEhhbmRsZSB0byB0aGUgY3VycmVudCBwcm9maWxlLgorICAgICAqLwogICAgIHByaXZhdGUgdHJhbnNpZW50IGxvbmcgcHJvZmlsZUhhbmRsZSA9IDA7CiAKLSAgICAvKiogSWYgaGFuZGxlIGlzIHVzZWQgYnkgYW5vdGhlciBjbGFzcyB0aGlzIG9iamVjdCBpcyBub3QgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgcHJvZmlsZS4gKi8KKyAgICAvKioKKyAgICAgKiBJZiBoYW5kbGUgaXMgdXNlZCBieSBhbm90aGVyIGNsYXNzIHRoaXMgb2JqZWN0IGlzIG5vdCByZXNwb25zaWJsZSBmb3IKKyAgICAgKiBjbG9zaW5nIHByb2ZpbGUuCisgICAgICovCiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBoYW5kbGVTdG9sZW4gPSBmYWxzZTsKIAotICAgIC8qKiBDYWNoZWQgaGVhZGVyIGRhdGEuICovCisgICAgLyoqCisgICAgICogQ2FjaGVkIGhlYWRlciBkYXRhLgorICAgICAqLwogICAgIHByaXZhdGUgdHJhbnNpZW50IGJ5dGVbXSBoZWFkZXJEYXRhID0gbnVsbDsKIAotICAgIC8qKiBTZXJpYWxpemF0aW9uIHN1cHBvcnQuICovCisgICAgLyoqCisgICAgICogU2VyaWFsaXphdGlvbiBzdXBwb3J0LgorICAgICAqLwogICAgIHByaXZhdGUgdHJhbnNpZW50IElDQ19Qcm9maWxlIG9wZW5lZFByb2ZpbGVPYmplY3Q7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgaUMgY18gcHJvZmlsZS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSUNDIHByb2ZpbGUgd2l0aCB0aGUgZ2l2ZW4gZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YQorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgZGF0YS4KICAgICAgKi8KICAgICBwcml2YXRlIElDQ19Qcm9maWxlKGJ5dGVbXSBkYXRhKSB7CiAgICAgICAgIHByb2ZpbGVIYW5kbGUgPSBOYXRpdmVDTU0uY21tT3BlblByb2ZpbGUoZGF0YSk7CkBAIC00NzYsNyArNzMxLDggQEAKICAgICAvKioKICAgICAgKiBVc2VkIHRvIGluc3RhbnRpYXRlIHN1YmNsYXNzZXMgKElDQ19Qcm9maWxlR3JleSBhbmQgSUNDX1Byb2ZpbGVSR0IpLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9maWxlSGFuZGxlIC0gc2hvdWxkIGJlIHZhbGlkIGhhbmRsZSB0byBvcGVuZWQgY29sb3IgcHJvZmlsZQorICAgICAqIEBwYXJhbSBwcm9maWxlSGFuZGxlCisgICAgICogICAgICAgICAgICAtIHNob3VsZCBiZSB2YWxpZCBoYW5kbGUgdG8gb3BlbmVkIGNvbG9yIHByb2ZpbGUKICAgICAgKi8KICAgICBJQ0NfUHJvZmlsZShsb25nIHByb2ZpbGVIYW5kbGUpIHsKICAgICAgICAgdGhpcy5wcm9maWxlSGFuZGxlID0gcHJvZmlsZUhhbmRsZTsKQEAgLTQ4NywxMCArNzQzLDExIEBACiAgICAgLyoqCiAgICAgICogV3JpdGVzIHRoZSBJQ0NfUHJvZmlsZSB0byBhIGZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZpbGVOYW1lIHRoZSBmaWxlIG5hbWUuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBzaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgZHVyaW5nCi0gICAgICogd3JpdGluZyBvciBvcGVuaW5nIHRoZSBmaWxlLgorICAgICAqIEBwYXJhbSBmaWxlTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgbmFtZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgZHVyaW5nIHdyaXRpbmcgb3Igb3BlbmluZworICAgICAqICAgICAgICAgICAgIHRoZSBmaWxlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvU3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOwpAQCAtNTAxLDkgKzc1OCwxMCBAQAogICAgIC8qKgogICAgICAqIFNlcmlhbGl6YWJsZSBpbXBsZW1lbnRhdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyB0aGUgcwotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgcworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwpAQCAtNTE0LDEwICs3NzIsMTIgQEAKICAgICAvKioKICAgICAgKiBTZXJpYWxpemFibGUgaW1wbGVtZW50YXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIHMKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gdGhlIGNsYXNzIG5vdCBmb3VuZCBleGNlcHRpb24KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIHMKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHRoZSBjbGFzcyBub3QgZm91bmQgZXhjZXB0aW9uCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gcykgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgcy5kZWZhdWx0UmVhZE9iamVjdCgpOwpAQCAtNTQ3LDkgKzgwNyw5IEBACiAgICAgICogUmVzb2x2ZXMgaW5zdGFuY2VzIGJlaW5nIGRlc2VyaWFsaXplZCBpbnRvIGluc3RhbmNlcyByZWdpc3RlcmVkIHdpdGggQ01NLgogICAgICAqIAogICAgICAqIEByZXR1cm4gSUNDX1Byb2ZpbGUgb2JqZWN0IGZvciBwcm9maWxlIHJlZ2lzdGVyZWQgd2l0aCBDTU0uCi0gICAgICogCi0gICAgICogQHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlcmlhbGl6ZWQgCi0gICAgICogZmlsZXMgb3IgZHVyaW5nIHRoZSBwcm9jZXNzIG9mIHJlYWRpbmcgdGhlbS4KKyAgICAgKiBAdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZXJpYWxpemVkIGZpbGVzIG9yIGR1cmluZyB0aGUKKyAgICAgKiAgICAgICAgICAgICBwcm9jZXNzIG9mIHJlYWRpbmcgdGhlbS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBvcGVuZWRQcm9maWxlT2JqZWN0OwpAQCAtNTU4LDIwICs4MTgsMjMgQEAKICAgICAvKioKICAgICAgKiBXcml0ZXMgdGhlIElDQ19Qcm9maWxlIHRvIGFuIE91dHB1dFN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyB0aGUgT3V0cHV0U3RyZWFtLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gc2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkIGR1cmluZwotICAgICAqIHdyaXRpbmcgb3Igb3BlbmluZyBPdXRwdXRTdHJlYW0uCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBPdXRwdXRTdHJlYW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCBkdXJpbmcgd3JpdGluZyBvcgorICAgICAqICAgICAgICAgICAgIG9wZW5pbmcgT3V0cHV0U3RyZWFtLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzLndyaXRlKGdldERhdGEoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIHRhZ2dlZCBkYXRhIGVsZW1lbnQgaW4gdGhlIHByb2ZpbGUgZnJvbSBhIGJ5dGUgYXJyYXkuIAorICAgICAqIFNldHMgYSB0YWdnZWQgZGF0YSBlbGVtZW50IGluIHRoZSBwcm9maWxlIGZyb20gYSBieXRlIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSB0YWdTaWduYXR1cmUgdGhlIElDQyB0YWcgc2lnbmF0dXJlIGZvciB0aGUgZGF0YSBlbGVtZW50IHRvIGJlIHNldC4gCi0gICAgICogQHBhcmFtIHRhZ0RhdGEgdGhlIGRhdGEgdG8gYmUgc2V0IGZvciB0aGUgc3BlY2lmaWVkIHRhZyBzaWduYXR1cmUuCisgICAgICogQHBhcmFtIHRhZ1NpZ25hdHVyZQorICAgICAqICAgICAgICAgICAgdGhlIElDQyB0YWcgc2lnbmF0dXJlIGZvciB0aGUgZGF0YSBlbGVtZW50IHRvIGJlIHNldC4KKyAgICAgKiBAcGFyYW0gdGFnRGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdG8gYmUgc2V0IGZvciB0aGUgc3BlY2lmaWVkIHRhZyBzaWduYXR1cmUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RGF0YShpbnQgdGFnU2lnbmF0dXJlLCBieXRlW10gdGFnRGF0YSkgewogICAgICAgICBOYXRpdmVDTU0uY21tU2V0UHJvZmlsZUVsZW1lbnQocHJvZmlsZUhhbmRsZSwgdGFnU2lnbmF0dXJlLCB0YWdEYXRhKTsKQEAgLTU4MiwyMSArODQ1LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIHRhZ2dlZCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgcHJvZmlsZSBhcyBhIGJ5dGUgYXJyYXkuIAotICAgICAqIEVsZW1lbnRzIGFyZSBpZGVudGlmaWVkIGJ5IHRhZyBzaWduYXR1cmVzIGFzIGRlZmluZWQgaW4gCi0gICAgICogdGhlIElDQyBzcGVjaWZpY2F0aW9uLiAKKyAgICAgKiBHZXRzIGEgdGFnZ2VkIGRhdGEgZWxlbWVudCBmcm9tIHRoZSBwcm9maWxlIGFzIGEgYnl0ZSBhcnJheS4gRWxlbWVudHMgYXJlCisgICAgICogaWRlbnRpZmllZCBieSB0YWcgc2lnbmF0dXJlcyBhcyBkZWZpbmVkIGluIHRoZSBJQ0Mgc3BlY2lmaWNhdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFnU2lnbmF0dXJlIHRoZSBJQ0MgdGFnIHNpZ25hdHVyZSBmb3IgdGhlIGRhdGEgZWxlbWVudCB0byBnZXQuCi0gICAgICogCisgICAgICogQHBhcmFtIHRhZ1NpZ25hdHVyZQorICAgICAqICAgICAgICAgICAgdGhlIElDQyB0YWcgc2lnbmF0dXJlIGZvciB0aGUgZGF0YSBlbGVtZW50IHRvIGdldC4KICAgICAgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSB0YWdnZWQgZGF0YSBlbGVtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gZ2V0RGF0YShpbnQgdGFnU2lnbmF0dXJlKSB7CiAgICAgICAgIGludCB0YWdTaXplID0gMDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRhZ1NpemUgPSBOYXRpdmVDTU0uY21tR2V0UHJvZmlsZUVsZW1lbnRTaXplKAotICAgICAgICAgICAgICAgICAgICBwcm9maWxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICB0YWdTaWduYXR1cmUKLSAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgdGFnU2l6ZSA9IE5hdGl2ZUNNTS5jbW1HZXRQcm9maWxlRWxlbWVudFNpemUocHJvZmlsZUhhbmRsZSwgdGFnU2lnbmF0dXJlKTsKICAgICAgICAgfSBjYXRjaCAoQ01NRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIFdlJ2xsIGdldCB0aGlzIGV4Y2VwdGlvbiBpZiB0aGVyZSdzIG5vIGVsZW1lbnQgd2l0aAogICAgICAgICAgICAgLy8gdGhlIHNwZWNpZmllZCB0YWcgc2lnbmF0dXJlCkBAIC02MjUsNyArODg0LDcgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKLSAgICAgICAgaWYgKHByb2ZpbGVIYW5kbGUhPTAgJiYgIWhhbmRsZVN0b2xlbikgeworICAgICAgICBpZiAocHJvZmlsZUhhbmRsZSAhPSAwICYmICFoYW5kbGVTdG9sZW4pIHsKICAgICAgICAgICAgIE5hdGl2ZUNNTS5jbW1DbG9zZVByb2ZpbGUocHJvZmlsZUhhbmRsZSk7CiAgICAgICAgIH0KIApAQCAtNjYzLDE2ICs5MjIsMTYgQEAKICAgICAgICAgLy8gTm90IGFuIElDQyBwcm9maWxlIGNsYXNzCiAgICAgICAgIC8vIGF3dC4xNUY9UHJvZmlsZSBjbGFzcyBkb2VzIG5vdCBjb21wbHkgd2l0aCBJQ0Mgc3BlY2lmaWNhdGlvbgogICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjE1RiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKKwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbG9yIHNwYWNlIHR5cGUgb2YgdGhlIFByb2ZpbGUgQ29ubmVjdGlvbiBTcGFjZSAoUENTKS4KKyAgICAgKiBHZXRzIHRoZSBjb2xvciBzcGFjZSB0eXBlIG9mIHRoZSBQcm9maWxlIENvbm5lY3Rpb24gU3BhY2UgKFBDUykuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgUENTIHR5cGUuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRQQ1NUeXBlKCkgewotICAgICAgICAgcmV0dXJuIGNzRnJvbVNpZ25hdHVyZShnZXRJbnRGcm9tSGVhZGVyKGljSGRyUGNzKSk7CisgICAgICAgIHJldHVybiBjc0Zyb21TaWduYXR1cmUoZ2V0SW50RnJvbUhlYWRlcihpY0hkclBjcykpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzQwLDcgKzk5OSw3IEBACiAgICAgICogQHJldHVybiB0aGUgbWlub3IgdmVyc2lvbiBvZiB0aGlzIElDQyBwcm9maWxlLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWlub3JWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0Qnl0ZUZyb21IZWFkZXIoaWNIZHJWZXJzaW9uKzEpOworICAgICAgICByZXR1cm4gZ2V0Qnl0ZUZyb21IZWFkZXIoaWNIZHJWZXJzaW9uICsgMSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03NjIsMTMgKzEwMjEsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUcmllcyB0byBvcGVuIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiBQYXRoIGVudHJpZXMgY2FuIGJlIAotICAgICAqIGRpdmlkZWQgYnkgYSBzZXBhcmF0b3IgY2hhcmFjdGVyLgorICAgICAqIFRyaWVzIHRvIG9wZW4gdGhlIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiBQYXRoIGVudHJpZXMgY2FuIGJlIGRpdmlkZWQKKyAgICAgKiBieSBhIHNlcGFyYXRvciBjaGFyYWN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLSAgICAgKiBAcGFyYW0gZmlsZU5hbWUgdGhlIGZpbGUgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZpbGUgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIHBhdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIHRoZSBmaWxlLgorICAgICAqIEBwYXJhbSBmaWxlTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnB1dCBzdHJlYW0gdG8gcmVhZCB0aGUgZmlsZS4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBGaWxlSW5wdXRTdHJlYW0gdHJ5UGF0aChTdHJpbmcgcGF0aCwgU3RyaW5nIGZpbGVOYW1lKSB7CiAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaVN0cmVhbSA9IG51bGw7CkBAIC03ODYsNyArMTA0Niw4IEBACiAgICAgICAgICAgICAgICAgaWYgKGZpU3RyZWFtICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpU3RyZWFtOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBmaVN0cmVhbTsKQEAgLTc5NSwxOCArMTA1NiwxOCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiBJQ0NfUHJvZmlsZSBmcm9tIGRhdGEgaW4gdGhlIHNwZWNpZmllZCBmaWxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlTmFtZSB0aGUgc3BlY2lmaWVkIG5hbWUgb2YgZmlsZSB3aXRoIElDQyBwcm9maWxlIGRhdGEuCi0gICAgICogCisgICAgICogQHBhcmFtIGZpbGVOYW1lCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIG5hbWUgb2YgZmlsZSB3aXRoIElDQyBwcm9maWxlIGRhdGEuCiAgICAgICogQHJldHVybiBzaW5nbGUgaW5zdGFuY2Ugb2YgSUNDX1Byb2ZpbGUuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBzaWduYWxzIHRoYXQgYW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVhZGluZyB0aGUgZmlsZQotICAgICAqIG9yIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHNpZ25hbHMgdGhhdCBhbiBJL08gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVhZGluZyB0aGUgZmlsZSBvcgorICAgICAqICAgICAgICAgICAgIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSUNDX1Byb2ZpbGUgZ2V0SW5zdGFuY2UoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBmaW5hbCBTdHJpbmcgZk5hbWUgPSBmaWxlTmFtZTsgLy8gdG8gdXNlIGluIHRoZSBwcml2aWxlZ2VkIGJsb2NrCiAKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpU3RyZWFtID0gKEZpbGVJbnB1dFN0cmVhbSkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb248RmlsZUlucHV0U3RyZWFtPigpIHsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpU3RyZWFtID0gKEZpbGVJbnB1dFN0cmVhbSlBY2Nlc3NDb250cm9sbGVyCisgICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxGaWxlSW5wdXRTdHJlYW0+KCkgewogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgRmlsZUlucHV0U3RyZWFtIHJ1bigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaVN0cmVhbSA9IG51bGw7CiAKQEAgLTgxNiw3ICsxMDc3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlTdHJlYW0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlTdHJlYW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHt9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBqYXZhLmljY3Byb2ZpbGUucGF0aCBlbnRyaWVzCiAgICAgICAgICAgICAgICAgICAgICAgICBmaVN0cmVhbSA9IHRyeVBhdGgoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmljY3Byb2ZpbGUucGF0aCIpLCBmTmFtZSk7IC8vJE5PTi1OTFMtMSQKQEAgLTgzMyw5ICsxMDk1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGRpcmVjdG9yeSB3aXRoIGphdmEgc2FtcGxlIHByb2ZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob21lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaVN0cmVhbSA9IHRyeVBhdGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob21lICsgRmlsZS5zZXBhcmF0b3JDaGFyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaWIiICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgImNtbSIsIGZOYW1lIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpU3RyZWFtID0gdHJ5UGF0aChob21lICsgRmlsZS5zZXBhcmF0b3JDaGFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJsaWIiICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgImNtbSIsIGZOYW1lIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTg1NCwxNyArMTExNSwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiBJQ0NfUHJvZmlsZSB3aXRoIGRhdGEgaW4KLSAgICAgKiB0aGUgc3BlY2lmaWVkIElucHV0U3RyZWFtLgorICAgICAqIEdldHMgdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiBJQ0NfUHJvZmlsZSB3aXRoIGRhdGEgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIElucHV0U3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSBJbnB1dFN0cmVhbSB3aXRoIElDQyBwcm9maWxlIGRhdGEuCi0gICAgICogCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbnB1dFN0cmVhbSB3aXRoIElDQyBwcm9maWxlIGRhdGEuCiAgICAgICogQHJldHVybiBzaW5nbGUgaW5zdGFuY2Ugb2YgSUNDX1Byb2ZpbGUuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCBkdXJpbmcgcmVhZGluZyAKLSAgICAgKiBmcm9tIElucHV0U3RyZWFtLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBmaWxlIGRvZXMgbm90IGNvbnRhaW4gdmFsaWQgCi0gICAgICogSUNDIFByb2ZpbGUgZGF0YS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgZHVyaW5nIHJlYWRpbmcgZnJvbQorICAgICAqICAgICAgICAgICAgIElucHV0U3RyZWFtLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGZpbGUgZG9lcyBub3QgY29udGFpbiB2YWxpZCBJQ0MgUHJvZmlsZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSUNDX1Byb2ZpbGUgZ2V0SW5zdGFuY2UoSW5wdXRTdHJlYW0gcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIGhlYWRlciA9IG5ldyBieXRlW2hlYWRlclNpemVdOwpAQCAtODc3LDEwICsxMTM4LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIENoZWNrIHRoZSBwcm9maWxlIGRhdGEgZm9yIGNvbnNpc3RlbmN5Ci0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICBJQ0NfUHJvZmlsZUhlbHBlci5nZXRCaWdFbmRpYW5Gcm9tQnl0ZUFycmF5KGhlYWRlciwgaWNIZHJNYWdpYykgIT0KLSAgICAgICAgICAgICAgICBoZWFkZXJNYWdpY051bWJlcgotICAgICAgICApIHsKKyAgICAgICAgaWYgKElDQ19Qcm9maWxlSGVscGVyLmdldEJpZ0VuZGlhbkZyb21CeXRlQXJyYXkoaGVhZGVyLCBpY0hkck1hZ2ljKSAhPSBoZWFkZXJNYWdpY051bWJlcikgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihpbnZhbGlkRGF0YU1lc3NhZ2UpOwogICAgICAgICB9CiAKQEAgLTg5MiwxMCArMTE1MCw3IEBACiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoaGVhZGVyLCAwLCBwcm9maWxlRGF0YSwgMCwgaGVhZGVyU2l6ZSk7CiAKICAgICAgICAgLy8gUmVhZCB0aGUgcHJvZmlsZSBpdHNlbGYKLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgIHMucmVhZChwcm9maWxlRGF0YSwgaGVhZGVyU2l6ZSwgcHJvZmlsZVNpemUgLSBoZWFkZXJTaXplKSAhPQotICAgICAgICAgICAgICAgIHByb2ZpbGVTaXplIC0gaGVhZGVyU2l6ZQotICAgICAgICApIHsKKyAgICAgICAgaWYgKHMucmVhZChwcm9maWxlRGF0YSwgaGVhZGVyU2l6ZSwgcHJvZmlsZVNpemUgLSBoZWFkZXJTaXplKSAhPSBwcm9maWxlU2l6ZSAtIGhlYWRlclNpemUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oaW52YWxpZERhdGFNZXNzYWdlKTsKICAgICAgICAgfQogCkBAIC05MDMsMTYgKzExNTgsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzaW5nbGUgaW5zdGFuY2Ugb2YgSUNDX1Byb2ZpbGUgZnJvbSB0aGUgc3BlY2lmaWVkIGRhdGEgaW4gCi0gICAgICogYSBieXRlIGFycmF5LgorICAgICAqIEdldHMgdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiBJQ0NfUHJvZmlsZSBmcm9tIHRoZSBzcGVjaWZpZWQgZGF0YSBpbiBhIGJ5dGUKKyAgICAgKiBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgYnl0ZSBhcnJheSBvZiBJQ0MgcHJvZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHNpbmdsZSBpbnN0YW5jZSBvZiBJQ0NfUHJvZmlsZSBmcm9tIHRoZSBzcGVjaWZpZWQgZGF0YSBpbiAKLSAgICAgKiBhIGJ5dGUgYXJyYXkuCi0gICAgICogCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGZpbGUgZG9lcyBub3QgY29udGFpbiB2YWxpZCAKLSAgICAgKiBJQ0MgUHJvZmlsZSBkYXRhLgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSBvZiBJQ0MgcHJvZmlsZS4KKyAgICAgKiBAcmV0dXJuIHNpbmdsZSBpbnN0YW5jZSBvZiBJQ0NfUHJvZmlsZSBmcm9tIHRoZSBzcGVjaWZpZWQgZGF0YSBpbiBhIGJ5dGUKKyAgICAgKiAgICAgICAgIGFycmF5LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGZpbGUgZG9lcyBub3QgY29udGFpbiB2YWxpZCBJQ0MgUHJvZmlsZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSUNDX1Byb2ZpbGUgZ2V0SW5zdGFuY2UoYnl0ZVtdIGRhdGEpIHsKICAgICAgICAgSUNDX1Byb2ZpbGUgcmVzID0gbnVsbDsKQEAgLTkyNCwyOSArMTE3OCwyOCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xNjIiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJ3aW5kb3dzIikgPj0gMCkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICggcmVzLmdldENvbG9yU3BhY2VUeXBlICgpID09IENvbG9yU3BhY2UuVFlQRV9SR0IgJiYKLSAgICAgICAgICAgICAgICAgcmVzLmdldERhdGFTaXplKGljU2lnTWVkaWFXaGl0ZVBvaW50VGFnKSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgcmVzLmdldERhdGFTaXplKGljU2lnUmVkQ29sb3JhbnRUYWcpID4gMCAmJgotICAgICAgICAgICAgICAgICByZXMuZ2V0RGF0YVNpemUoaWNTaWdHcmVlbkNvbG9yYW50VGFnKSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgcmVzLmdldERhdGFTaXplKGljU2lnQmx1ZUNvbG9yYW50VGFnKSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgcmVzLmdldERhdGFTaXplKGljU2lnUmVkVFJDVGFnKSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgcmVzLmdldERhdGFTaXplKGljU2lnR3JlZW5UUkNUYWcpID4gMCAmJgotICAgICAgICAgICAgICAgICByZXMuZ2V0RGF0YVNpemUoaWNTaWdCbHVlVFJDVGFnKSA+IDAKLSAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICByZXMgPSBuZXcgSUNDX1Byb2ZpbGVSR0IocmVzLmdldFByb2ZpbGVIYW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCByZXMuZ2V0Q29sb3JTcGFjZVR5cGUgKCkgPT0gQ29sb3JTcGFjZS5UWVBFX0dSQVkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5nZXREYXRhU2l6ZShpY1NpZ01lZGlhV2hpdGVQb2ludFRhZykgPiAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICByZXMuZ2V0RGF0YVNpemUoaWNTaWdHcmF5VFJDVGFnKSA+IDAKLSAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICByZXMgPSBuZXcgSUNDX1Byb2ZpbGVHcmF5IChyZXMuZ2V0UHJvZmlsZUhhbmRsZSgpKTsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigid2luZG93cyIpID49IDApIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChyZXMuZ2V0Q29sb3JTcGFjZVR5cGUoKSA9PSBDb2xvclNwYWNlLlRZUEVfUkdCCisgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXMuZ2V0RGF0YVNpemUoaWNTaWdNZWRpYVdoaXRlUG9pbnRUYWcpID4gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzLmdldERhdGFTaXplKGljU2lnUmVkQ29sb3JhbnRUYWcpID4gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzLmdldERhdGFTaXplKGljU2lnR3JlZW5Db2xvcmFudFRhZykgPiAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXMuZ2V0RGF0YVNpemUoaWNTaWdCbHVlQ29sb3JhbnRUYWcpID4gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzLmdldERhdGFTaXplKGljU2lnUmVkVFJDVGFnKSA+IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlcy5nZXREYXRhU2l6ZShpY1NpZ0dyZWVuVFJDVGFnKSA+IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlcy5nZXREYXRhU2l6ZShpY1NpZ0JsdWVUUkNUYWcpID4gMCkgeworICAgICAgICAgICAgICAgICAgICByZXMgPSBuZXcgSUNDX1Byb2ZpbGVSR0IocmVzLmdldFByb2ZpbGVIYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuZ2V0Q29sb3JTcGFjZVR5cGUoKSA9PSBDb2xvclNwYWNlLlRZUEVfR1JBWQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzLmdldERhdGFTaXplKGljU2lnTWVkaWFXaGl0ZVBvaW50VGFnKSA+IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlcy5nZXREYXRhU2l6ZShpY1NpZ0dyYXlUUkNUYWcpID4gMCkgeworICAgICAgICAgICAgICAgICAgICByZXMgPSBuZXcgSUNDX1Byb2ZpbGVHcmF5KHJlcy5nZXRQcm9maWxlSGFuZGxlKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBjYXRjaCAoQ01NRXhjZXB0aW9uIGUpIHsgLyogcmV0dXJuIHJlcyBpbiB0aGlzIGNhc2UgKi8KICAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0gICAgICAgIH0gY2F0Y2ggKENNTUV4Y2VwdGlvbiBlKSB7IC8qIHJldHVybiByZXMgaW4gdGhpcyBjYXNlICovIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKICAgICAvKioKQEAgLTk1NCw4MCArMTIwNyw3NyBAQAogICAgICAqIGRlZmluZWQgYnkgdGhlIENvbG9yU3BhY2UgY2xhc3M6IENTX3NSR0IsIENTX0xJTkVBUl9SR0IsIENTX0NJRVhZWiwKICAgICAgKiBDU19QWUNDLCBDU19HUkFZLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjc3BhY2UgdGhlIHR5cGUgb2YgY29sb3Igc3BhY2UgZGVmaW5lZCBpbiB0aGUgQ29sb3JTcGFjZSBjbGFzcy4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gY3NwYWNlCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiBjb2xvciBzcGFjZSBkZWZpbmVkIGluIHRoZSBDb2xvclNwYWNlIGNsYXNzLgogICAgICAqIEByZXR1cm4gc2luZ2xlIGluc3RhbmNlIG9mIElDQ19Qcm9maWxlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIG5vdCBvbmUgb2YgdGhlIGRlZmluZWQgY29sb3IgCi0gICAgICogc3BhY2UgdHlwZXMuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpcyBub3Qgb25lIG9mIHRoZSBkZWZpbmVkIGNvbG9yIHNwYWNlIHR5cGVzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSUNDX1Byb2ZpbGUgZ2V0SW5zdGFuY2UoaW50IGNzcGFjZSkgewotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKGNzcGFjZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3dpdGNoIChjc3BhY2UpIHsKIAotICAgICAgY2FzZSBDb2xvclNwYWNlLkNTX3NSR0I6Ci0gICAgICAgIGlmIChzUkdCUHJvZmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzUkdCUHJvZmlsZSA9IGdldEluc3RhbmNlKCJzUkdCLnBmIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICBjYXNlIENvbG9yU3BhY2UuQ1Nfc1JHQjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNSR0JQcm9maWxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNSR0JQcm9maWxlID0gZ2V0SW5zdGFuY2UoInNSR0IucGYiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzUkdCUHJvZmlsZTsKKworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3JTcGFjZS5DU19DSUVYWVo6CisgICAgICAgICAgICAgICAgICAgIGlmICh4eXpQcm9maWxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHh5elByb2ZpbGUgPSBnZXRJbnN0YW5jZSgiQ0lFWFlaLnBmIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4geHl6UHJvZmlsZTsKKworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3JTcGFjZS5DU19HUkFZOgorICAgICAgICAgICAgICAgICAgICBpZiAoZ3JheVByb2ZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ3JheVByb2ZpbGUgPSBnZXRJbnN0YW5jZSgiR1JBWS5wZiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyYXlQcm9maWxlOworCisgICAgICAgICAgICAgICAgY2FzZSBDb2xvclNwYWNlLkNTX1BZQ0M6CisgICAgICAgICAgICAgICAgICAgIGlmIChweWNjUHJvZmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBweWNjUHJvZmlsZSA9IGdldEluc3RhbmNlKCJQWUNDLnBmIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHljY1Byb2ZpbGU7CisKKyAgICAgICAgICAgICAgICBjYXNlIENvbG9yU3BhY2UuQ1NfTElORUFSX1JHQjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVhclJHQlByb2ZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZWFyUkdCUHJvZmlsZSA9IGdldEluc3RhbmNlKCJMSU5FQVJfUkdCLnBmIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluZWFyUkdCUHJvZmlsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBhd3QuMTYzPUNhbid0IG9wZW4gY29sb3IgcHJvZmlsZQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIkNhbid0IG9wZW4gY29sb3IgcHJvZmlsZSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzUkdCUHJvZmlsZTsKIAotICAgICAgY2FzZSBDb2xvclNwYWNlLkNTX0NJRVhZWjoKLSAgICAgICAgaWYgKHh5elByb2ZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgeHl6UHJvZmlsZSA9IGdldEluc3RhbmNlKCJDSUVYWVoucGYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB4eXpQcm9maWxlOwotCi0gICAgICBjYXNlIENvbG9yU3BhY2UuQ1NfR1JBWToKLSAgICAgICAgaWYgKGdyYXlQcm9maWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIGdyYXlQcm9maWxlID0gZ2V0SW5zdGFuY2UoIkdSQVkucGYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBncmF5UHJvZmlsZTsKLQotICAgICAgY2FzZSBDb2xvclNwYWNlLkNTX1BZQ0M6Ci0gICAgICAgIGlmIChweWNjUHJvZmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBweWNjUHJvZmlsZSA9IGdldEluc3RhbmNlKCJQWUNDLnBmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHljY1Byb2ZpbGU7Ci0KLSAgICAgIGNhc2UgQ29sb3JTcGFjZS5DU19MSU5FQVJfUkdCOgotICAgICAgICBpZiAobGluZWFyUkdCUHJvZmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsaW5lYXJSR0JQcm9maWxlID0gZ2V0SW5zdGFuY2UoIkxJTkVBUl9SR0IucGYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaW5lYXJSR0JQcm9maWxlOwotICAgICAgfQotCi0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAvLyBhd3QuMTYzPUNhbid0IG9wZW4gY29sb3IgcHJvZmlsZSAKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIkNhbid0IG9wZW4gY29sb3IgcHJvZmlsZSIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAvLyBhd3QuMTY0PU5vdCBhIHByZWRlZmluZWQgY29sb3Igc3BhY2UKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIk5vdCBhIHByZWRlZmluZWQgY29sb3Igc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKLSAgICAvLyBhd3QuMTY0PU5vdCBhIHByZWRlZmluZWQgY29sb3Igc3BhY2UKLSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiTm90IGEgcHJlZGVmaW5lZCBjb2xvciBzcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KICAgICAvKioKICAgICAgKiBSZWFkcyBhbiBpbnRlZ2VyIGZyb20gdGhlIHByb2ZpbGUgaGVhZGVyIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIGlkeCAtIG9mZnNldCBpbiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGhlYWRlcgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludCBmcm9tIGhlYWRlcgorICAgICAqIEBwYXJhbSBpZHgKKyAgICAgKiAgICAgICAgICAgIC0gb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgaGVhZGVyCisgICAgICogQHJldHVybiB0aGUgaW50ZWdlciB2YWx1ZSBmcm9tIGhlYWRlcgogICAgICAqLwogICAgIHByaXZhdGUgaW50IGdldEludEZyb21IZWFkZXIoaW50IGlkeCkgewogICAgICAgICBpZiAoaGVhZGVyRGF0YSA9PSBudWxsKSB7CiAgICAgICAgICAgICBoZWFkZXJEYXRhID0gZ2V0RGF0YShpY1NpZ0hlYWQpOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuICAoKGhlYWRlckRhdGFbaWR4XSAgICYgMHhGRikgPDwgMjQpfAotICAgICAgICAgICAgICAgICAgKChoZWFkZXJEYXRhW2lkeCsxXSAmIDB4RkYpIDw8IDE2KXwKLSAgICAgICAgICAgICAgICAgICgoaGVhZGVyRGF0YVtpZHgrMl0gJiAweEZGKSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAoKGhlYWRlckRhdGFbaWR4KzNdICYgMHhGRikpOworICAgICAgICByZXR1cm4gKChoZWFkZXJEYXRhW2lkeF0gJiAweEZGKSA8PCAyNCkgfCAoKGhlYWRlckRhdGFbaWR4ICsgMV0gJiAweEZGKSA8PCAxNikKKyAgICAgICAgICAgICAgICB8ICgoaGVhZGVyRGF0YVtpZHggKyAyXSAmIDB4RkYpIDw8IDgpIHwgKChoZWFkZXJEYXRhW2lkeCArIDNdICYgMHhGRikpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJlYWRzIGJ5dGUgZnJvbSB0aGUgcHJvZmlsZSBoZWFkZXIgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWR4IC0gb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgaGVhZGVyCi0gICAgICogCisgICAgICogQHBhcmFtIGlkeAorICAgICAqICAgICAgICAgICAgLSBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoZWFkZXIKICAgICAgKiBAcmV0dXJuIHRoZSBieXRlIGZyb20gaGVhZGVyCiAgICAgICovCiAgICAgcHJpdmF0ZSBieXRlIGdldEJ5dGVGcm9tSGVhZGVyKGludCBpZHgpIHsKQEAgLTEwMzksMTEgKzEyODksMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBJQ0MgY29sb3Igc3BhY2Ugc2lnbmF0dXJlIHRvIHRoZSBqYXZhIHByZWRlZmluZWQKLSAgICAgKiBjb2xvciBzcGFjZSB0eXBlLgorICAgICAqIENvbnZlcnRzIElDQyBjb2xvciBzcGFjZSBzaWduYXR1cmUgdG8gdGhlIGphdmEgcHJlZGVmaW5lZCBjb2xvciBzcGFjZQorICAgICAqIHR5cGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNpZ25hdHVyZSB0aGUgc2lnbmF0dXJlCi0gICAgICogCisgICAgICogQHBhcmFtIHNpZ25hdHVyZQorICAgICAqICAgICAgICAgICAgdGhlIHNpZ25hdHVyZQogICAgICAqIEByZXR1cm4gdGhlIGludAogICAgICAqLwogICAgIHByaXZhdGUgaW50IGNzRnJvbVNpZ25hdHVyZShpbnQgc2lnbmF0dXJlKSB7CkBAIC0xMTAyLDcgKzEzNTIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gYXd0LjE2NT1Db2xvciBzcGFjZSBkb2Vzbid0IGNvbXBseSB3aXRoIElDQyBzcGVjaWZpY2F0aW9uCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjE2NSIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjE2NSIpKTsgLy8kTk9OLU5MUy0xJAogICAgIH0KIAogICAgIC8qKgpAQCAtMTExOCwyMiArMTM2OCwxOSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRhdGEgc2l6ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFnU2lnbmF0dXJlIHRoZSB0YWcgc2lnbmF0dXJlCi0gICAgICogCisgICAgICogQHBhcmFtIHRhZ1NpZ25hdHVyZQorICAgICAqICAgICAgICAgICAgdGhlIHRhZyBzaWduYXR1cmUKICAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIHNpemUKICAgICAgKi8KICAgICBwcml2YXRlIGludCBnZXREYXRhU2l6ZShpbnQgdGFnU2lnbmF0dXJlKSB7Ci0gICAgICAgIHJldHVybiBOYXRpdmVDTU0uY21tR2V0UHJvZmlsZUVsZW1lbnRTaXplKAotICAgICAgICAgICAgICAgIHByb2ZpbGVIYW5kbGUsCi0gICAgICAgICAgICAgICAgdGFnU2lnbmF0dXJlCi0gICAgICAgICAgICApOworICAgICAgICByZXR1cm4gTmF0aXZlQ01NLmNtbUdldFByb2ZpbGVFbGVtZW50U2l6ZShwcm9maWxlSGFuZGxlLCB0YWdTaWduYXR1cmUpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJlYWRzIFhZWiB2YWx1ZSBmcm9tIHRoZSB0YWcgZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFnU2lnbmF0dXJlIHRoZSB0YWcgc2lnbmF0dXJlCi0gICAgICogCisgICAgICogQHBhcmFtIHRhZ1NpZ25hdHVyZQorICAgICAqICAgICAgICAgICAgdGhlIHRhZyBzaWduYXR1cmUKICAgICAgKiBAcmV0dXJuIHRoZSBYWVogdmFsdWUKICAgICAgKi8KICAgICBmbG9hdFtdIGdldFhZWlZhbHVlKGludCB0YWdTaWduYXR1cmUpIHsKQEAgLTExNTMsMjAgKzE0MDAsMjAgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBtZWRpYSB3aGl0ZSBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZWRpYSB3aGl0ZSBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIG1lZGlhIHdoaXRlIHBvaW50LgogICAgICAqLwogICAgIGZsb2F0W10gZ2V0TWVkaWFXaGl0ZVBvaW50KCkgewogICAgICAgICByZXR1cm4gZ2V0WFlaVmFsdWUoaWNTaWdNZWRpYVdoaXRlUG9pbnRUYWcpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIElmIFRSQyBpcyBub3QgYSB0YWJsZSByZXR1cm5zIGdhbW1hIHZpYSByZXR1cm4gdmFsdWUKLSAgICAgKiBhbmQgc2V0cyBkYXRhVFJDIHRvIG51bGwuIElmIFRSQyBpcyBhIHRhYmxlIHJldHVybnMgMAotICAgICAqIGFuZCBmaWxscyBkYXRhVFJDIHdpdGggdmFsdWVzLgorICAgICAqIElmIFRSQyBpcyBub3QgYSB0YWJsZSByZXR1cm5zIGdhbW1hIHZpYSByZXR1cm4gdmFsdWUgYW5kIHNldHMgZGF0YVRSQyB0bworICAgICAqIG51bGwuIElmIFRSQyBpcyBhIHRhYmxlIHJldHVybnMgMCBhbmQgZmlsbHMgZGF0YVRSQyB3aXRoIHZhbHVlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFnU2lnbmF0dXJlIHRoZSB0YWcgc2lnbmF0dXJlCi0gICAgICogQHBhcmFtIGRhdGFUUkMgdGhlIGRhdGEgdHJjCi0gICAgICogCisgICAgICogQHBhcmFtIHRhZ1NpZ25hdHVyZQorICAgICAqICAgICAgICAgICAgdGhlIHRhZyBzaWduYXR1cmUKKyAgICAgKiBAcGFyYW0gZGF0YVRSQworICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHJjCiAgICAgICogQHJldHVybiAtIGdhbW1hIG9yIHplcm8gaWYgVFJDIGlzIGEgdGFibGUKICAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0IGdldEdhbW1hT3JUUkMoaW50IHRhZ1NpZ25hdHVyZSwgc2hvcnRbXSBkYXRhVFJDKSB7CkBAIC0xMTk1LDggKzE0NDIsOCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGdhbW1hLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0YWdTaWduYXR1cmUgdGhlIHRhZyBzaWduYXR1cmUKLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGFnU2lnbmF0dXJlCisgICAgICogICAgICAgICAgICB0aGUgdGFnIHNpZ25hdHVyZQogICAgICAqIEByZXR1cm4gdGhlIGdhbW1hCiAgICAgICovCiAgICAgZmxvYXQgZ2V0R2FtbWEoaW50IHRhZ1NpZ25hdHVyZSkgewpAQCAtMTIxMSwxMCArMTQ1OCwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRSQy4KKyAgICAgKiBHZXRzIHRoZSBUUkMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRhZ1NpZ25hdHVyZSB0aGUgdGFnIHNpZ25hdHVyZQotICAgICAqIAorICAgICAqIEBwYXJhbSB0YWdTaWduYXR1cmUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YWcgc2lnbmF0dXJlCiAgICAgICogQHJldHVybiB0aGUgdFJDCiAgICAgICovCiAgICAgc2hvcnRbXSBnZXRUUkMoaW50IHRhZ1NpZ25hdHVyZSkgewpAQCAtMTIyOCw0ICsxNDc1LDMgQEAKICAgICAgICAgcmV0dXJuIGRhdGFUUkM7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvY29sb3IvSUNDX1Byb2ZpbGVHcmF5LmphdmEgYi9hd3QvamF2YS9hd3QvY29sb3IvSUNDX1Byb2ZpbGVHcmF5LmphdmEKaW5kZXggZjAwOWIxOC4uZjc0ODEwMSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2NvbG9yL0lDQ19Qcm9maWxlR3JheS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9jb2xvci9JQ0NfUHJvZmlsZUdyYXkuamF2YQpAQCAtMjIsMjEgKzIyLDI2IEBACiAKIC8qKgogICogVGhlIElDQ19Qcm9maWxlR3JheSBjbGFzcyByZXByZXNlbnQgcHJvZmlsZXMgd2l0aCBUWVBFX0dSQVkgY29sb3Igc3BhY2UgdHlwZSwKLSAqIGFuZCBpbmNsdWRlcyB0aGUgZ3JheVRSQ1RhZyBhbmQgbWVkaWFXaGl0ZVBvaW50VGFnIHRhZ3MuIAorICogYW5kIGluY2x1ZGVzIHRoZSBncmF5VFJDVGFnIGFuZCBtZWRpYVdoaXRlUG9pbnRUYWcgdGFncy4gVGhlIGdyYXkgY29tcG9uZW50CisgKiBjYW4gYmUgdHJhbnNmb3JtZWQgZnJvbSBhIEdSQVkgZGV2aWNlIHByb2ZpbGUgY29sb3Igc3BhY2UgdG8gdGhlIENJRVhZWgorICogUHJvZmlsZSB0aHJvdWdoIHRoZSB0b25lIHJlcHJvZHVjdGlvbiBjdXJ2ZSAoVFJDKToKKyAqIDxwPgorICogUENTWSA9IGdyYXlUUkNbZGV2aWNlR3JheV0KICAqIAotICogVGhlIGdyYXkgY29tcG9uZW50IGNhbiBiZSB0cmFuc2Zvcm1lZCBmcm9tIGEgR1JBWSBkZXZpY2UgcHJvZmlsZSBjb2xvciBzcGFjZSAKLSAqIHRvIHRoZSBDSUVYWVogUHJvZmlsZSB0aHJvdWdoIHRoZSB0b25lIHJlcHJvZHVjdGlvbiBjdXJ2ZSAoVFJDKTogCi0gKiA8cD5QQ1NZID0gZ3JheVRSQ1tkZXZpY2VHcmF5XQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJQ0NfUHJvZmlsZUdyYXkgZXh0ZW5kcyBJQ0NfUHJvZmlsZSB7CiAgICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xMTI0NzIxMjkwNzMyMDAyNjQ5TDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBpQyBjXyBwcm9maWxlIGdyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb2ZpbGVIYW5kbGUgdGhlIHByb2ZpbGUgaGFuZGxlCisgICAgICogQHBhcmFtIHByb2ZpbGVIYW5kbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9maWxlIGhhbmRsZQogICAgICAqLwogICAgIElDQ19Qcm9maWxlR3JheShsb25nIHByb2ZpbGVIYW5kbGUpIHsKICAgICAgICAgc3VwZXIocHJvZmlsZUhhbmRsZSk7CkBAIC00NSwxMiArNTAsMTcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBUUkMgYXMgYW4gYXJyYXkgb2Ygc2hvcnRzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzaG9ydCBhcnJheSBvZiB0aGUgVFJDLgorICAgICAqIEByZXR1cm4gdGhlIHNob3J0IGFycmF5IG9mIHRoZSBUUkMuCiAgICAgICovCiAgICAgcHVibGljIHNob3J0W10gZ2V0VFJDKCkgewogICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VFJDKGljU2lnR3JheVRSQ1RhZyk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWVkaWEgd2hpdGUgcG9pbnQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbWVkaWEgd2hpdGUgcG9pbnQKKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmxvYXRbXSBnZXRNZWRpYVdoaXRlUG9pbnQoKSB7CiAgICAgICAgIHJldHVybiBzdXBlci5nZXRNZWRpYVdoaXRlUG9pbnQoKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9jb2xvci9JQ0NfUHJvZmlsZVJHQi5qYXZhIGIvYXd0L2phdmEvYXd0L2NvbG9yL0lDQ19Qcm9maWxlUkdCLmphdmEKaW5kZXggYmViMWEwYy4uOWM2MDEwZiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2NvbG9yL0lDQ19Qcm9maWxlUkdCLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2NvbG9yL0lDQ19Qcm9maWxlUkdCLmphdmEKQEAgLTIzLDM4ICsyMyw1OCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBJQ0NfUHJvZmlsZVJHQiBjbGFzcyByZXByZXNlbnRzIHByb2ZpbGVzIHdpdGggUkdCIGNvbG9yIHNwYWNlIHR5cGUgYW5kIAotICogY29udGFpbnMgdGhlIHJlZENvbG9yYW50VGFnLCBncmVlbkNvbG9yYW50VGFnLCBibHVlQ29sb3JhbnRUYWcsIHJlZFRSQ1RhZywgCisgKiBUaGUgSUNDX1Byb2ZpbGVSR0IgY2xhc3MgcmVwcmVzZW50cyBwcm9maWxlcyB3aXRoIFJHQiBjb2xvciBzcGFjZSB0eXBlIGFuZAorICogY29udGFpbnMgdGhlIHJlZENvbG9yYW50VGFnLCBncmVlbkNvbG9yYW50VGFnLCBibHVlQ29sb3JhbnRUYWcsIHJlZFRSQ1RhZywKICAqIGdyZWVuVFJDVGFnLCBibHVlVFJDVGFnLCBhbmQgbWVkaWFXaGl0ZVBvaW50VGFnIHRhZ3MuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSUNDX1Byb2ZpbGVSR0IgZXh0ZW5kcyBJQ0NfUHJvZmlsZSB7CiAgICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDg1MDUwNjczODUxNTI1NzkzMzRMOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGlDIGNfIHByb2ZpbGUgcmdiLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBSR0IgSUNDX1Byb2ZpbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb2ZpbGVIYW5kbGUgdGhlIHByb2ZpbGUgaGFuZGxlCisgICAgICogQHBhcmFtIHByb2ZpbGVIYW5kbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9maWxlIGhhbmRsZQogICAgICAqLwogICAgIElDQ19Qcm9maWxlUkdCKGxvbmcgcHJvZmlsZUhhbmRsZSkgewogICAgICAgICBzdXBlcihwcm9maWxlSGFuZGxlKTsKICAgICB9CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFJFRENPTVBPTkVOVCBpbmRpY2F0ZXMgdGhlIHJlZCBjb21wb25lbnQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFJFRENPTVBPTkVOVCBpbmRpY2F0ZXMgdGhlIHJlZCBjb21wb25lbnQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVEQ09NUE9ORU5UID0gMDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgR1JFRU5DT01QT05FTlQgaW5kaWNhdGVzIHRoZSBncmVlbiBjb21wb25lbnQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEdSRUVOQ09NUE9ORU5UIGluZGljYXRlcyB0aGUgZ3JlZW4gY29tcG9uZW50LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdSRUVOQ09NUE9ORU5UID0gMTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQkxVRUNPTVBPTkVOVCBpbmRpY2F0ZXMgdGhlIGJsdWUgY29tcG9uZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBCTFVFQ09NUE9ORU5UIGluZGljYXRlcyB0aGUgYmx1ZSBjb21wb25lbnQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkxVRUNPTVBPTkVOVCA9IDI7CiAKICAgICAvLyBhd3QuMTVFPVVua25vd24gY29tcG9uZW50LiBNdXN0IGJlIFJFRENPTVBPTkVOVCwgR1JFRU5DT01QT05FTlQgb3IgQkxVRUNPTVBPTkVOVC4KLSAgICAvKiogVGhlIENvbnN0YW50IFVOS05PV05fQ09NUE9ORU5UX01TRy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVU5LTk9XTl9DT01QT05FTlRfTVNHLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX0NPTVBPTkVOVF9NU0cgPSBNZXNzYWdlcwogICAgICAgICAgICAgLmdldFN0cmluZygiYXd0LjE1RSIpOyAvLyROT04tTkxTLTEkCiAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBUUkMuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbXBvbmVudAorICAgICAqICAgICAgICAgICAgdGhlIHRhZyBzaWduYXR1cmUuCisgICAgICogQHJldHVybiB0aGUgVFJDIHZhbHVlLgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzaG9ydFtdIGdldFRSQyhpbnQgY29tcG9uZW50KSB7CiAgICAgICAgIHN3aXRjaCAoY29tcG9uZW50KSB7CkBAIC03MCw2ICs5MCwxMyBAQAogICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFVOS05PV05fQ09NUE9ORU5UX01TRyk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZ2FtbWEuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbXBvbmVudAorICAgICAqICAgICAgICAgICAgdGhlIHRhZyBzaWduYXR1cmUuCisgICAgICogQHJldHVybiB0aGUgZ2FtbWEgdmFsdWUuCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZsb2F0IGdldEdhbW1hKGludCBjb21wb25lbnQpIHsKICAgICAgICAgc3dpdGNoIChjb21wb25lbnQpIHsKQEAgLTg2LDExICsxMTMsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgZmxvYXQgbWF0cml4IHdoaWNoIGNvbnRhaW5zIHRoZSBYLCBZLCBhbmQgWiBjb21wb25lbnRzIG9mIAotICAgICAqIHRoZSBwcm9maWxlJ3MgcmVkQ29sb3JhbnRUYWcsIGdyZWVuQ29sb3JhbnRUYWcsIGFuZCBibHVlQ29sb3JhbnRUYWcuCisgICAgICogR2V0cyBhIGZsb2F0IG1hdHJpeCB3aGljaCBjb250YWlucyB0aGUgWCwgWSwgYW5kIFogY29tcG9uZW50cyBvZiB0aGUKKyAgICAgKiBwcm9maWxlJ3MgcmVkQ29sb3JhbnRUYWcsIGdyZWVuQ29sb3JhbnRUYWcsIGFuZCBibHVlQ29sb3JhbnRUYWcuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIGZsb2F0IG1hdHJpeCB3aGljaCBjb250YWlucyB0aGUgWCwgWSwgYW5kIFogY29tcG9uZW50cyBvZiAKLSAgICAgKiB0aGUgcHJvZmlsZSdzIHJlZENvbG9yYW50VGFnLCBncmVlbkNvbG9yYW50VGFnLCBhbmQgYmx1ZUNvbG9yYW50VGFnLgorICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IG1hdHJpeCB3aGljaCBjb250YWlucyB0aGUgWCwgWSwgYW5kIFogY29tcG9uZW50cyBvZiB0aGUKKyAgICAgKiAgICAgICAgIHByb2ZpbGUncyByZWRDb2xvcmFudFRhZywgZ3JlZW5Db2xvcmFudFRhZywgYW5kIGJsdWVDb2xvcmFudFRhZy4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXRbXVtdIGdldE1hdHJpeCgpIHsKICAgICAgICAgZmxvYXQgW11bXSBtID0gbmV3IGZsb2F0WzNdWzNdOyAvLyBUaGUgbWF0cml4CkBAIC0xMTQsNiArMTQxLDExIEBACiAgICAgICAgIHJldHVybiBtOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1lZGlhIHdoaXRlIHBvaW50LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG1lZGlhIHdoaXRlIHBvaW50LgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmbG9hdFtdIGdldE1lZGlhV2hpdGVQb2ludCgpIHsKICAgICAgICAgcmV0dXJuIHN1cGVyLmdldE1lZGlhV2hpdGVQb2ludCgpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2NvbG9yL1Byb2ZpbGVEYXRhRXhjZXB0aW9uLmphdmEgYi9hd3QvamF2YS9hd3QvY29sb3IvUHJvZmlsZURhdGFFeGNlcHRpb24uamF2YQppbmRleCBjYTE2OWZlLi4zMzVmMzE0IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvY29sb3IvUHJvZmlsZURhdGFFeGNlcHRpb24uamF2YQorKysgYi9hd3QvamF2YS9hd3QvY29sb3IvUHJvZmlsZURhdGFFeGNlcHRpb24uamF2YQpAQCAtMjEsMTggKzIxLDIzIEBACiBwYWNrYWdlIGphdmEuYXd0LmNvbG9yOwogCiAvKioKLSAqIFRoZSBQcm9maWxlRGF0YUV4Y2VwdGlvbiBjbGFzcyByZXByZXNlbnRzIGFuIGVycm9yIHdoaWNoIG9jY3VycyAKLSAqIHdoaWxlIGFjY2Vzc2luZyBvciBwcm9jZXNzaW5nIGFuIElDQ19Qcm9maWxlIG9iamVjdC4KKyAqIFRoZSBQcm9maWxlRGF0YUV4Y2VwdGlvbiBjbGFzcyByZXByZXNlbnRzIGFuIGVycm9yIHdoaWNoIG9jY3VycyB3aGlsZQorICogYWNjZXNzaW5nIG9yIHByb2Nlc3NpbmcgYW4gSUNDX1Byb2ZpbGUgb2JqZWN0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFByb2ZpbGVEYXRhRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CiAgICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcyODYxNDA4ODgyNDAzMjI0OThMOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHByb2ZpbGUgZGF0YSBleGNlcHRpb24gd2l0aCBkZXRhaWxlZCBtZXNzYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSBkZXRhaWxlZCBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsZWQgbWVzc2FnZSBvZiB0aGUgZXhjZXB0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBQcm9maWxlRGF0YUV4Y2VwdGlvbihTdHJpbmcgcykgewogICAgICAgICBzdXBlcihzKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9jb2xvci9wYWNrYWdlLmh0bWwgYi9hd3QvamF2YS9hd3QvY29sb3IvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOWQ5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9hd3QvamF2YS9hd3QvY29sb3IvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxib2R5PgorICAgIDxwPgorICAgICAgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGNsYXNzZXMgcmVwcmVzZW50aW5nIGNvbG9yIHNwYWNlcyBhbmQgcHJvZmlsZXMgYmFzZWQgb24gdGhlIEludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bSAoSUNDKSBQcm9maWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uLiAKKyAgICA8L3A+CisgICAgQHNpbmNlIEFuZHJvaWQgMS4wCisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9BV1RFdmVudExpc3RlbmVyLmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvQVdURXZlbnRMaXN0ZW5lci5qYXZhCmluZGV4IGY2MjFjOWIuLjc2MjkzYjMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9BV1RFdmVudExpc3RlbmVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0FXVEV2ZW50TGlzdGVuZXIuamF2YQpAQCAtMjMsNiArMjMsMTIgQEAKIGltcG9ydCBqYXZhLmF3dC5BV1RFdmVudDsKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBBV1RFdmVudExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgdm9pZCBldmVudERpc3BhdGNoZWQoQVdURXZlbnQgZXZlbnQpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0FXVEV2ZW50TGlzdGVuZXJQcm94eS5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L0FXVEV2ZW50TGlzdGVuZXJQcm94eS5qYXZhCmluZGV4IDVlZTVlNTkuLjNlZGM0MWYzIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvQVdURXZlbnRMaXN0ZW5lclByb3h5LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0FXVEV2ZW50TGlzdGVuZXJQcm94eS5qYXZhCkBAIC0yNiw2ICsyNiwxMiBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBjbGFzcyBBV1RFdmVudExpc3RlbmVyUHJveHkgZXh0ZW5kcyBFdmVudExpc3RlbmVyUHJveHkgaW1wbGVtZW50cyBBV1RFdmVudExpc3RlbmVyIHsKIAogICAgIHByaXZhdGUgQVdURXZlbnRMaXN0ZW5lciBsaXN0ZW5lcjsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9BY3Rpb25FdmVudC5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L0FjdGlvbkV2ZW50LmphdmEKaW5kZXggYzMyZmM0Yi4uZTg4MmUwZCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0FjdGlvbkV2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0FjdGlvbkV2ZW50LmphdmEKQEAgLTIyLDYgKzIyLDEyIEBACiAKIGltcG9ydCBqYXZhLmF3dC5BV1RFdmVudDsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIEFjdGlvbkV2ZW50IGV4dGVuZHMgQVdURXZlbnQgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc2NzEwNzg3OTYyNzM4MzIxNDlMOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0FjdGlvbkxpc3RlbmVyLmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvQWN0aW9uTGlzdGVuZXIuamF2YQppbmRleCA0NzNkMmI2Li5hNmVlZTdhIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvQWN0aW9uTGlzdGVuZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvQWN0aW9uTGlzdGVuZXIuamF2YQpAQCAtMjIsNiArMjIsMTIgQEAKIAogaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgaW50ZXJmYWNlIEFjdGlvbkxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvQWRqdXN0bWVudEV2ZW50LmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvQWRqdXN0bWVudEV2ZW50LmphdmEKaW5kZXggYTJiMTFhOC4uYmUyZDZjNCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0FkanVzdG1lbnRFdmVudC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9BZGp1c3RtZW50RXZlbnQuamF2YQpAQCAtMjMsNiArMjMsMTIgQEAKIGltcG9ydCBqYXZhLmF3dC5BV1RFdmVudDsKIGltcG9ydCBqYXZhLmF3dC5BZGp1c3RhYmxlOwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgY2xhc3MgQWRqdXN0bWVudEV2ZW50IGV4dGVuZHMgQVdURXZlbnQgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTcwMDI5MDY0NTIwNTI3OTkyMUw7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvQWRqdXN0bWVudExpc3RlbmVyLmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvQWRqdXN0bWVudExpc3RlbmVyLmphdmEKaW5kZXggZWY3YzM3OC4uNWY2YTcyNCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0FkanVzdG1lbnRMaXN0ZW5lci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9BZGp1c3RtZW50TGlzdGVuZXIuamF2YQpAQCAtMjIsNiArMjIsMTIgQEAKIAogaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgaW50ZXJmYWNlIEFkanVzdG1lbnRMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCiAgICAgcHVibGljIHZvaWQgYWRqdXN0bWVudFZhbHVlQ2hhbmdlZChBZGp1c3RtZW50RXZlbnQgZSk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvQ29tcG9uZW50QWRhcHRlci5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L0NvbXBvbmVudEFkYXB0ZXIuamF2YQppbmRleCA0ZjBiZDkwLi5jNDIyMzVmIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvQ29tcG9uZW50QWRhcHRlci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9Db21wb25lbnRBZGFwdGVyLmphdmEKQEAgLTIwLDYgKzIwLDEyIEBACiAgKi8KIHBhY2thZ2UgamF2YS5hd3QuZXZlbnQ7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnRBZGFwdGVyIGltcGxlbWVudHMgQ29tcG9uZW50TGlzdGVuZXIgewogCiAgICAgcHVibGljIENvbXBvbmVudEFkYXB0ZXIoKSB7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvQ29tcG9uZW50RXZlbnQuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9Db21wb25lbnRFdmVudC5qYXZhCmluZGV4IGQwYmNhNTQuLjc2MGQzYWIgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9Db21wb25lbnRFdmVudC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9Db21wb25lbnRFdmVudC5qYXZhCkBAIC0yMyw2ICsyMywxMiBAQAogaW1wb3J0IGphdmEuYXd0LkFXVEV2ZW50OwogaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIENvbXBvbmVudEV2ZW50IGV4dGVuZHMgQVdURXZlbnQgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODEwMTQwNjgyMzkwMjk5Mjk2NUw7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvQ29tcG9uZW50TGlzdGVuZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9Db21wb25lbnRMaXN0ZW5lci5qYXZhCmluZGV4IDE0N2U5ZTAuLmE1YWRiYTIgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9Db21wb25lbnRMaXN0ZW5lci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9Db21wb25lbnRMaXN0ZW5lci5qYXZhCkBAIC0yMiw2ICsyMiwxMiBAQAogCiBpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50TGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKIAogICAgIHB1YmxpYyB2b2lkIGNvbXBvbmVudEhpZGRlbihDb21wb25lbnRFdmVudCBlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9Db250YWluZXJBZGFwdGVyLmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvQ29udGFpbmVyQWRhcHRlci5qYXZhCmluZGV4IDEyZGMzZGUuLjQ0OTgzYzcgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9Db250YWluZXJBZGFwdGVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0NvbnRhaW5lckFkYXB0ZXIuamF2YQpAQCAtMjAsNiArMjAsMTIgQEAKICAqLwogcGFja2FnZSBqYXZhLmF3dC5ldmVudDsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRhaW5lckFkYXB0ZXIgaW1wbGVtZW50cyBDb250YWluZXJMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgQ29udGFpbmVyQWRhcHRlcigpIHsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9Db250YWluZXJFdmVudC5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L0NvbnRhaW5lckV2ZW50LmphdmEKaW5kZXggMWExMDU1Yy4uMzcyYzllNCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0NvbnRhaW5lckV2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0NvbnRhaW5lckV2ZW50LmphdmEKQEAgLTIzLDYgKzIzLDEyIEBACiBpbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwogLy8/Pz9BV1Q6IGltcG9ydCBqYXZhLmF3dC5Db250YWluZXI7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBjbGFzcyBDb250YWluZXJFdmVudCBleHRlbmRzIENvbXBvbmVudEV2ZW50IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00MTE0OTQyMjUwNTM5NzcyMDQxTDsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9Db250YWluZXJMaXN0ZW5lci5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L0NvbnRhaW5lckxpc3RlbmVyLmphdmEKaW5kZXggYmY0NzY2NC4uNTE3ODU5ZSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0NvbnRhaW5lckxpc3RlbmVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0NvbnRhaW5lckxpc3RlbmVyLmphdmEKQEAgLTIyLDYgKzIyLDEyIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBDb250YWluZXJMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCiAgICAgcHVibGljIHZvaWQgY29tcG9uZW50QWRkZWQoQ29udGFpbmVyRXZlbnQgZSk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvRm9jdXNBZGFwdGVyLmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvRm9jdXNBZGFwdGVyLmphdmEKaW5kZXggMzQ4OWUxMS4uM2EzZTM3ZiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0ZvY3VzQWRhcHRlci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9Gb2N1c0FkYXB0ZXIuamF2YQpAQCAtMjAsNiArMjAsMTIgQEAKICAqLwogcGFja2FnZSBqYXZhLmF3dC5ldmVudDsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEZvY3VzQWRhcHRlciBpbXBsZW1lbnRzIEZvY3VzTGlzdGVuZXIgewogCiAgICAgcHVibGljIEZvY3VzQWRhcHRlcigpIHsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9Gb2N1c0V2ZW50LmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvRm9jdXNFdmVudC5qYXZhCmluZGV4IDFkYjUyNjMuLjRhMTg2ODkgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9Gb2N1c0V2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0ZvY3VzRXZlbnQuamF2YQpAQCAtMjIsNiArMjIsMTIgQEAKIAogaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIEZvY3VzRXZlbnQgZXh0ZW5kcyBDb21wb25lbnRFdmVudCB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MjM3NTM3ODY0NTc0MTYzOTZMOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0ZvY3VzTGlzdGVuZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9Gb2N1c0xpc3RlbmVyLmphdmEKaW5kZXggZWU5OGQ5MC4uNmJiYmQwMCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0ZvY3VzTGlzdGVuZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvRm9jdXNMaXN0ZW5lci5qYXZhCkBAIC0yMiw2ICsyMiwxMiBAQAogCiBpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgRm9jdXNMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCiAgICAgcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9IaWVyYXJjaHlCb3VuZHNBZGFwdGVyLmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvSGllcmFyY2h5Qm91bmRzQWRhcHRlci5qYXZhCmluZGV4IDI0ZTNkOWQuLmJiZmU4ZmYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9IaWVyYXJjaHlCb3VuZHNBZGFwdGVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0hpZXJhcmNoeUJvdW5kc0FkYXB0ZXIuamF2YQpAQCAtMjAsNiArMjAsMTIgQEAKICAqLwogcGFja2FnZSBqYXZhLmF3dC5ldmVudDsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEhpZXJhcmNoeUJvdW5kc0FkYXB0ZXIgaW1wbGVtZW50cyBIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgSGllcmFyY2h5Qm91bmRzQWRhcHRlcigpIHsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9IaWVyYXJjaHlCb3VuZHNMaXN0ZW5lci5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L0hpZXJhcmNoeUJvdW5kc0xpc3RlbmVyLmphdmEKaW5kZXggNDI4OGY1Mi4uM2U4ZjJlNyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0hpZXJhcmNoeUJvdW5kc0xpc3RlbmVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0hpZXJhcmNoeUJvdW5kc0xpc3RlbmVyLmphdmEKQEAgLTIyLDYgKzIyLDEyIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCiAgICAgcHVibGljIHZvaWQgYW5jZXN0b3JNb3ZlZChIaWVyYXJjaHlFdmVudCBlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9IaWVyYXJjaHlFdmVudC5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L0hpZXJhcmNoeUV2ZW50LmphdmEKaW5kZXggMTg4MTY2Ny4uYzFkMjJmNCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0hpZXJhcmNoeUV2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0hpZXJhcmNoeUV2ZW50LmphdmEKQEAgLTI0LDYgKzI0LDEyIEBACiBpbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwogLy8/Pz9BV1Q6IGltcG9ydCBqYXZhLmF3dC5Db250YWluZXI7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBjbGFzcyBIaWVyYXJjaHlFdmVudCBleHRlbmRzIEFXVEV2ZW50IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MzM3NTc2OTcwMDM4MDQzOTkwTDsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9IaWVyYXJjaHlMaXN0ZW5lci5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L0hpZXJhcmNoeUxpc3RlbmVyLmphdmEKaW5kZXggZTAxYmExMS4uZmYzZDliYyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0hpZXJhcmNoeUxpc3RlbmVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0hpZXJhcmNoeUxpc3RlbmVyLmphdmEKQEAgLTIyLDYgKzIyLDEyIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBIaWVyYXJjaHlMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCiAgICAgcHVibGljIHZvaWQgaGllcmFyY2h5Q2hhbmdlZChIaWVyYXJjaHlFdmVudCBlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9JbnB1dEV2ZW50LmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvSW5wdXRFdmVudC5qYXZhCmluZGV4IGM5ODM4MmQuLjM0M2I3YTMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9JbnB1dEV2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0lucHV0RXZlbnQuamF2YQpAQCAtMjIsNiArMjIsMTIgQEAKIAogaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIElucHV0RXZlbnQgZXh0ZW5kcyBDb21wb25lbnRFdmVudCB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjQ4MjUyNTk4MTY5ODMwOTc4Nkw7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvSW5wdXRNZXRob2RFdmVudC5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L0lucHV0TWV0aG9kRXZlbnQuamF2YQppbmRleCBhNWNhYzRlLi5iZTAwMWE1IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvSW5wdXRNZXRob2RFdmVudC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9JbnB1dE1ldGhvZEV2ZW50LmphdmEKQEAgLTI3LDYgKzI3LDEyIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIElucHV0TWV0aG9kRXZlbnQgZXh0ZW5kcyBBV1RFdmVudCB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0NzI3MTkwODc0Nzc4OTIyNjYxTDsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9JbnB1dE1ldGhvZExpc3RlbmVyLmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvSW5wdXRNZXRob2RMaXN0ZW5lci5qYXZhCmluZGV4IDBhYjY5MTguLjg1ZWFhN2UgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9JbnB1dE1ldGhvZExpc3RlbmVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0lucHV0TWV0aG9kTGlzdGVuZXIuamF2YQpAQCAtMjIsNiArMjIsMTIgQEAKIAogaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgaW50ZXJmYWNlIElucHV0TWV0aG9kTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKIAogICAgIHB1YmxpYyB2b2lkIGNhcmV0UG9zaXRpb25DaGFuZ2VkKElucHV0TWV0aG9kRXZlbnQgZSk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvSW52b2NhdGlvbkV2ZW50LmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvSW52b2NhdGlvbkV2ZW50LmphdmEKaW5kZXggNTkzNDZlZC4uNThlM2I3MiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0ludm9jYXRpb25FdmVudC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9JbnZvY2F0aW9uRXZlbnQuamF2YQpAQCAtMjUsNiArMjUsMTIgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgY2xhc3MgSW52b2NhdGlvbkV2ZW50IGV4dGVuZHMgQVdURXZlbnQgaW1wbGVtZW50cyBBY3RpdmVFdmVudCB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0MzYwNTYzNDQ5MDk0NTk0NTBMOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0l0ZW1FdmVudC5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L0l0ZW1FdmVudC5qYXZhCmluZGV4IDg0MmRhMTQuLjA5OTA4ZjIgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9JdGVtRXZlbnQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvSXRlbUV2ZW50LmphdmEKQEAgLTIzLDYgKzIzLDEyIEBACiBpbXBvcnQgamF2YS5hd3QuQVdURXZlbnQ7CiBpbXBvcnQgamF2YS5hd3QuSXRlbVNlbGVjdGFibGU7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBjbGFzcyBJdGVtRXZlbnQgZXh0ZW5kcyBBV1RFdmVudCB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjA4NzA4MTMyNDQ3MjA2OTMzTDsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9JdGVtTGlzdGVuZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9JdGVtTGlzdGVuZXIuamF2YQppbmRleCAzMzYzM2JlLi44ZGVjNjczIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvSXRlbUxpc3RlbmVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0l0ZW1MaXN0ZW5lci5qYXZhCkBAIC0yMiw2ICsyMiwxMiBAQAogCiBpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSXRlbUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgdm9pZCBpdGVtU3RhdGVDaGFuZ2VkKEl0ZW1FdmVudCBlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9LZXlBZGFwdGVyLmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvS2V5QWRhcHRlci5qYXZhCmluZGV4IDQyM2I1YzkuLmE5NmNjYTggMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9LZXlBZGFwdGVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0tleUFkYXB0ZXIuamF2YQpAQCAtMjAsNiArMjAsMTIgQEAKICAqLwogcGFja2FnZSBqYXZhLmF3dC5ldmVudDsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEtleUFkYXB0ZXIgaW1wbGVtZW50cyBLZXlMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgS2V5QWRhcHRlcigpIHsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9LZXlFdmVudC5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L0tleUV2ZW50LmphdmEKaW5kZXggMDU2YzY0Yy4uODYyN2Y3MCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0tleUV2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0tleUV2ZW50LmphdmEKQEAgLTI3LDYgKzI3LDEyIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIEtleUV2ZW50IGV4dGVuZHMgSW5wdXRFdmVudCB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjM1MjEzMDk1MzAyODEyNjk1NEw7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvS2V5TGlzdGVuZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9LZXlMaXN0ZW5lci5qYXZhCmluZGV4IGYyMGZjOTAuLmVjMTQ0ZGYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9LZXlMaXN0ZW5lci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9LZXlMaXN0ZW5lci5qYXZhCkBAIC0yMiw2ICsyMiwxMiBAQAogCiBpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgS2V5TGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKIAogICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VBZGFwdGVyLmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VBZGFwdGVyLmphdmEKaW5kZXggNDk3Mzk1Ni4uZGMxOTE3MyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L01vdXNlQWRhcHRlci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZUFkYXB0ZXIuamF2YQpAQCAtMjAsNiArMjAsMTIgQEAKICAqLwogcGFja2FnZSBqYXZhLmF3dC5ldmVudDsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIE1vdXNlQWRhcHRlciBpbXBsZW1lbnRzIE1vdXNlTGlzdGVuZXIgewogCiAgICAgcHVibGljIE1vdXNlQWRhcHRlcigpIHsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZUV2ZW50LmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VFdmVudC5qYXZhCmluZGV4IDBiNzc2ZjkuLjJiMWZhOGIgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZUV2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L01vdXNlRXZlbnQuamF2YQpAQCAtMjYsNiArMjYsMTIgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgY2xhc3MgTW91c2VFdmVudCBleHRlbmRzIElucHV0RXZlbnQgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTk5MTIxNDE1MzQ5NDg0Mjg0OEw7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VMaXN0ZW5lci5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L01vdXNlTGlzdGVuZXIuamF2YQppbmRleCA1ZDMyYjBmLi45NTg3OWI5IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VMaXN0ZW5lci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZUxpc3RlbmVyLmphdmEKQEAgLTIyLDYgKzIyLDEyIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBNb3VzZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrZWQoTW91c2VFdmVudCBlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZU1vdGlvbkFkYXB0ZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZU1vdGlvbkFkYXB0ZXIuamF2YQppbmRleCBhNGJlYmNjLi4xZWNkMGQ1IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VNb3Rpb25BZGFwdGVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L01vdXNlTW90aW9uQWRhcHRlci5qYXZhCkBAIC0yMCw2ICsyMCwxMiBAQAogICovCiBwYWNrYWdlIGphdmEuYXd0LmV2ZW50OwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTW91c2VNb3Rpb25BZGFwdGVyIGltcGxlbWVudHMgTW91c2VNb3Rpb25MaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgTW91c2VNb3Rpb25BZGFwdGVyKCkgewpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L01vdXNlTW90aW9uTGlzdGVuZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZU1vdGlvbkxpc3RlbmVyLmphdmEKaW5kZXggYTVjMTFkYS4uZTEzMTNjMyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L01vdXNlTW90aW9uTGlzdGVuZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VNb3Rpb25MaXN0ZW5lci5qYXZhCkBAIC0yMiw2ICsyMiwxMiBAQAogCiBpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgTW91c2VNb3Rpb25MaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCiAgICAgcHVibGljIHZvaWQgbW91c2VEcmFnZ2VkKE1vdXNlRXZlbnQgZSk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VXaGVlbEV2ZW50LmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VXaGVlbEV2ZW50LmphdmEKaW5kZXggZDNhYzlkOC4uYTNlZDQyNCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L01vdXNlV2hlZWxFdmVudC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZVdoZWVsRXZlbnQuamF2YQpAQCAtMjIsNiArMjIsMTIgQEAKIAogaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIE1vdXNlV2hlZWxFdmVudCBleHRlbmRzIE1vdXNlRXZlbnQgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTkxODc0MTM1ODE5OTM1NjM5MjlMOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L01vdXNlV2hlZWxMaXN0ZW5lci5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L01vdXNlV2hlZWxMaXN0ZW5lci5qYXZhCmluZGV4IDhjYTFjOGIuLjJkNmE5ODIgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZVdoZWVsTGlzdGVuZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VXaGVlbExpc3RlbmVyLmphdmEKQEAgLTIyLDYgKzIyLDEyIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBNb3VzZVdoZWVsTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKIAogICAgIHB1YmxpYyB2b2lkIG1vdXNlV2hlZWxNb3ZlZChNb3VzZVdoZWVsRXZlbnQgZSk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvUGFpbnRFdmVudC5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L1BhaW50RXZlbnQuamF2YQppbmRleCBkMDU3M2UxLi4yMmFjMDkwIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvUGFpbnRFdmVudC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9QYWludEV2ZW50LmphdmEKQEAgLTIzLDYgKzIzLDEyIEBACiBpbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwogaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIFBhaW50RXZlbnQgZXh0ZW5kcyBDb21wb25lbnRFdmVudCB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMjY3NDkyMDI2NDMzMzM3NTkzTDsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9UZXh0RXZlbnQuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9UZXh0RXZlbnQuamF2YQppbmRleCBlMmJmZDk2Li4yYTY5MGFkIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvVGV4dEV2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L1RleHRFdmVudC5qYXZhCkBAIC0yMiw2ICsyMiwxMiBAQAogCiBpbXBvcnQgamF2YS5hd3QuQVdURXZlbnQ7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBjbGFzcyBUZXh0RXZlbnQgZXh0ZW5kcyBBV1RFdmVudCB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2MjY5OTAyMjkxMjUwOTQxMTc5TDsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9UZXh0TGlzdGVuZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9UZXh0TGlzdGVuZXIuamF2YQppbmRleCA2YzVhNjcxLi4wNTc1N2M0IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvVGV4dExpc3RlbmVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L1RleHRMaXN0ZW5lci5qYXZhCkBAIC0yMiw2ICsyMiwxMiBAQAogCiBpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgVGV4dExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgdm9pZCB0ZXh0VmFsdWVDaGFuZ2VkKFRleHRFdmVudCBlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9XaW5kb3dBZGFwdGVyLmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvV2luZG93QWRhcHRlci5qYXZhCmluZGV4IDlkNGIzNzcuLjk3MGFhOGQgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9XaW5kb3dBZGFwdGVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L1dpbmRvd0FkYXB0ZXIuamF2YQpAQCAtMjAsNiArMjAsMTIgQEAKICAqLwogcGFja2FnZSBqYXZhLmF3dC5ldmVudDsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFdpbmRvd0FkYXB0ZXIgaW1wbGVtZW50cyBXaW5kb3dMaXN0ZW5lciwgV2luZG93U3RhdGVMaXN0ZW5lciwgV2luZG93Rm9jdXNMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgV2luZG93QWRhcHRlcigpIHsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9XaW5kb3dFdmVudC5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L1dpbmRvd0V2ZW50LmphdmEKaW5kZXggNjVhMzBlNC4uNDc0ZDJhYyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L1dpbmRvd0V2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L1dpbmRvd0V2ZW50LmphdmEKQEAgLTI1LDYgKzI1LDEyIEBACiAvL2ltcG9ydCBqYXZhLmF3dC5XaW5kb3c7CiAvL2ltcG9ydCBqYXZhLmF3dC5GcmFtZTsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIFdpbmRvd0V2ZW50IGV4dGVuZHMgQ29tcG9uZW50RXZlbnQgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE1Njc5NTkxMzMxNDc5MTIxMjdMOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L1dpbmRvd0ZvY3VzTGlzdGVuZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9XaW5kb3dGb2N1c0xpc3RlbmVyLmphdmEKaW5kZXggZTAyMDBmMi4uNTI4NDU5ZiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L1dpbmRvd0ZvY3VzTGlzdGVuZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvV2luZG93Rm9jdXNMaXN0ZW5lci5qYXZhCkBAIC0yMiw2ICsyMiwxMiBAQAogCiBpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgV2luZG93Rm9jdXNMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCiAgICAgcHVibGljIHZvaWQgd2luZG93R2FpbmVkRm9jdXMoV2luZG93RXZlbnQgZSk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvV2luZG93TGlzdGVuZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9XaW5kb3dMaXN0ZW5lci5qYXZhCmluZGV4IDIwYTJiMDguLjMxYmQ1NDcgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9XaW5kb3dMaXN0ZW5lci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9XaW5kb3dMaXN0ZW5lci5qYXZhCkBAIC0yMiw2ICsyMiwxMiBAQAogCiBpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgV2luZG93TGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKIAogICAgIHB1YmxpYyB2b2lkIHdpbmRvd0FjdGl2YXRlZChXaW5kb3dFdmVudCBlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9XaW5kb3dTdGF0ZUxpc3RlbmVyLmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvV2luZG93U3RhdGVMaXN0ZW5lci5qYXZhCmluZGV4IDEyZGJjMjAuLmJhMTRkOWUgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9XaW5kb3dTdGF0ZUxpc3RlbmVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L1dpbmRvd1N0YXRlTGlzdGVuZXIuamF2YQpAQCAtMjIsNiArMjIsMTIgQEAKIAogaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgaW50ZXJmYWNlIFdpbmRvd1N0YXRlTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKIAogICAgIHB1YmxpYyB2b2lkIHdpbmRvd1N0YXRlQ2hhbmdlZChXaW5kb3dFdmVudCBlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9mb250L0ZvbnRSZW5kZXJDb250ZXh0LmphdmEgYi9hd3QvamF2YS9hd3QvZm9udC9Gb250UmVuZGVyQ29udGV4dC5qYXZhCmluZGV4IDc2NjMwMGQuLmQ3ZGUwMGYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9mb250L0ZvbnRSZW5kZXJDb250ZXh0LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ZvbnQvRm9udFJlbmRlckNvbnRleHQuamF2YQpAQCAtMjMsMjMgKzIzLDMwIEBACiBpbXBvcnQgamF2YS5hd3QuZ2VvbS5BZmZpbmVUcmFuc2Zvcm07CiAKIC8qKgotICogVGhlIEZvbnRSZW5kZXJDb250ZXh0IGNsYXNzIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiAKLSAqIGFib3V0IHRleHQgbWVhc3VyZW1lbnQuIEFudGktYWxpYXNpbmcgYW5kIGZyYWN0aW9uYWwtbWV0cmljcwotICogbW9kZXMgYXJlIGRlZmluZWQgYnkgYW4gYXBwbGljYXRpb24gYW5kIGFmZmVjdCB0aGUgc2l6ZSBvZgotICogYSBjaGFyYWN0ZXIuCisgKiBUaGUgRm9udFJlbmRlckNvbnRleHQgY2xhc3MgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRleHQgbWVhc3VyZW1lbnQuCisgKiBBbnRpLWFsaWFzaW5nIGFuZCBmcmFjdGlvbmFsLW1ldHJpY3MgbW9kZXMgYXJlIGRlZmluZWQgYnkgYW4gYXBwbGljYXRpb24gYW5kCisgKiBhZmZlY3QgdGhlIHNpemUgb2YgYSBjaGFyYWN0ZXIuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRm9udFJlbmRlckNvbnRleHQgewogCiAgICAgLy8gQWZmaW5lIHRyYW5zZm9ybSBvZiB0aGlzIG1vZGUKLSAgICAvKiogVGhlIHRyYW5zZm9ybS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNmb3JtLgorICAgICAqLwogICAgIHByaXZhdGUgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybTsKIAogICAgIC8vIElzIHRoZSBhbnRpLWFsaWFzZWQgbW9kZSB1c2VkCi0gICAgLyoqIFRoZSBhbnRpIGFsaWFzZWQuICovCisgICAgLyoqCisgICAgICogVGhlIGFudGkgYWxpYXNlZC4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gZkFudGlBbGlhc2VkOwogCiAgICAgLy8gSXMgdGhlIGZyYWN0aW9uYWwgbWV0cmljcyB1c2VkCi0gICAgLyoqIFRoZSBmcmFjdGlvbmFsIG1ldHJpY3MuICovCisgICAgLyoqCisgICAgICogVGhlIGZyYWN0aW9uYWwgbWV0cmljcy4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gZkZyYWN0aW9uYWxNZXRyaWNzOwogCiAKQEAgLTQ3LDkgKzU0LDEyIEBACiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEZvbnRSZW5kZXJDb250ZXh0IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQKICAgICAgKiBBZmZpbmVUcmFuc2Zvcm0sIGFudGktYWxpYXNpbmcgYW5kIGZyYWN0aW9uYWwgbWV0cmljcyBmbGFncy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHJhbnMgdGhlIEFmZmluZVRyYW5zZm9ybS4KLSAgICAgKiBAcGFyYW0gYW50aUFsaWFzZWQgdGhlIGFudGktYWxpYXNpbmcgZmxhZy4KLSAgICAgKiBAcGFyYW0gdXNlc0ZyYWN0aW9uYWxNZXRyaWNzIHRoZSBmcmFjdGlvbmFsIG1ldHJpY3MgZmxhZy4KKyAgICAgKiBAcGFyYW0gdHJhbnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBBZmZpbmVUcmFuc2Zvcm0uCisgICAgICogQHBhcmFtIGFudGlBbGlhc2VkCisgICAgICogICAgICAgICAgICB0aGUgYW50aS1hbGlhc2luZyBmbGFnLgorICAgICAqIEBwYXJhbSB1c2VzRnJhY3Rpb25hbE1ldHJpY3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBmcmFjdGlvbmFsIG1ldHJpY3MgZmxhZy4KICAgICAgKi8KICAgICBwdWJsaWMgRm9udFJlbmRlckNvbnRleHQoQWZmaW5lVHJhbnNmb3JtIHRyYW5zLCBib29sZWFuIGFudGlBbGlhc2VkLCAKICAgICAgICAgICAgIGJvb2xlYW4gdXNlc0ZyYWN0aW9uYWxNZXRyaWNzKSB7CkBAIC02NywxMiArNzcsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIE9iamVjdCB3aXRoIGN1cnJlbnQgRm9udFJlbmRlckNvbnRleHQgb2JqZWN0LiAKKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIE9iamVjdCB3aXRoIGN1cnJlbnQgRm9udFJlbmRlckNvbnRleHQgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBvYmogdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBPYmplY3QgaXMgZXF1YWwgdG8gY3VycmVudAotICAgICAqIEZvbnRSZW5kZXJDb250ZXh0IG9iamVjdC4KKyAgICAgKiAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IG9iamVjdC4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewpAQCAtOTIsMTEgKzEwMiwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRyYW5zZm9ybSB3aGljaCBpcyB1c2VkIGZvciBzY2FsaW5nIHR5cG9ncmFwaGljYWwgcG9pbnRzIAotICAgICAqIHRvIHBpeGVscyBpbiB0aGlzIEZvbnRSZW5kZXJDb250ZXh0LgorICAgICAqIEdldHMgdGhlIHRyYW5zZm9ybSB3aGljaCBpcyB1c2VkIGZvciBzY2FsaW5nIHR5cG9ncmFwaGljYWwgcG9pbnRzIHRvCisgICAgICogcGl4ZWxzIGluIHRoaXMgRm9udFJlbmRlckNvbnRleHQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgQWZmaW5lVHJhbnNmb3JtIHdoaWNoIGlzIHVzZWQgZm9yIHNjYWxpbmcgdHlwb2dyYXBoaWNhbCAKLSAgICAgKiBwb2ludHMgdG8gcGl4ZWxzIGluIHRoaXMgRm9udFJlbmRlckNvbnRleHQuCisgICAgICogQHJldHVybiB0aGUgQWZmaW5lVHJhbnNmb3JtIHdoaWNoIGlzIHVzZWQgZm9yIHNjYWxpbmcgdHlwb2dyYXBoaWNhbAorICAgICAqICAgICAgICAgcG9pbnRzIHRvIHBpeGVscyBpbiB0aGlzIEZvbnRSZW5kZXJDb250ZXh0LgogICAgICAqLwogICAgIHB1YmxpYyBBZmZpbmVUcmFuc2Zvcm0gZ2V0VHJhbnNmb3JtKCkgewogICAgICAgICBpZiAodHJhbnNmb3JtICE9IG51bGwpewpAQCAtMTA2LDEzICsxMTYsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIEZvbnRSZW5kZXJDb250ZXh0IG9iamVjdCB3aXRoIGN1cnJlbnQgCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBGb250UmVuZGVyQ29udGV4dCBvYmplY3Qgd2l0aCBjdXJyZW50CiAgICAgICogRm9udFJlbmRlckNvbnRleHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZyYyB0aGUgRm9udFJlbmRlckNvbnRleHQgb2JqZWN0IHRvIGJlIGNvbXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBGb250UmVuZGVyQ29udGV4dCBvYmplY3QgaXMKLSAgICAgKiBlcXVhbCB0byBjdXJyZW50IEZvbnRSZW5kZXJDb250ZXh0LgorICAgICAqIEBwYXJhbSBmcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250UmVuZGVyQ29udGV4dCBvYmplY3QgdG8gYmUgY29tcGFyZWQuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIEZvbnRSZW5kZXJDb250ZXh0IG9iamVjdCBpcyBlcXVhbCB0bworICAgICAqICAgICAgICAgY3VycmVudCBGb250UmVuZGVyQ29udGV4dC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoRm9udFJlbmRlckNvbnRleHQgZnJjKSB7CiAgICAgICAgIGlmICh0aGlzID09IGZyYyl7CkBAIC0xMzIsMTEgKzE0MiwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGV4dCBmcmFjdGlvbmFsIG1ldHJpY3MgYXJlIHVzZWQgaW4gCi0gICAgICogdGhpcyBGb250UmVuZGVyQ29udGV4dC4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRleHQgZnJhY3Rpb25hbCBtZXRyaWNzIGFyZSB1c2VkIGluIHRoaXMKKyAgICAgKiBGb250UmVuZGVyQ29udGV4dC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSB0ZXh0IGZyYWN0aW9uYWwgbWV0cmljcyBhcmUgdXNlZCBpbiAKLSAgICAgKiB0aGlzIEZvbnRSZW5kZXJDb250ZXh0LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgdGV4dCBmcmFjdGlvbmFsIG1ldHJpY3MgYXJlIHVzZWQgaW4gdGhpcworICAgICAqICAgICAgICAgRm9udFJlbmRlckNvbnRleHQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiB1c2VzRnJhY3Rpb25hbE1ldHJpY3MoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLmZGcmFjdGlvbmFsTWV0cmljczsKQEAgLTE0Niw3ICsxNTYsNyBAQAogICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbnRpLWFsaWFzaW5nIGlzIHVzZWQgaW4gdGhpcyBGb250UmVuZGVyQ29udGV4dC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGFudGktYWxpYXNpbmcgaXMgdXNlZCBpbiB0aGlzIEZvbnRSZW5kZXJDb250ZXh0LAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0FudGlBbGlhc2VkKCkgewogICAgICAgICByZXR1cm4gdGhpcy5mQW50aUFsaWFzZWQ7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZm9udC9HbHlwaEp1c3RpZmljYXRpb25JbmZvLmphdmEgYi9hd3QvamF2YS9hd3QvZm9udC9HbHlwaEp1c3RpZmljYXRpb25JbmZvLmphdmEKaW5kZXggNGMzZTAyZS4uYjAzZGUwYSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ZvbnQvR2x5cGhKdXN0aWZpY2F0aW9uSW5mby5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9mb250L0dseXBoSnVzdGlmaWNhdGlvbkluZm8uamF2YQpAQCAtMTgsMTI0ICsxOCwxMzQgQEAKICAqIEBhdXRob3IgSWx5YSBTLiBPa29taW4KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmZvbnQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgR2x5cGhKdXN0aWZpY2F0aW9uSW5mbyBjbGFzcyBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCAKLSAqIHRoZSBnbHlwaCdzIGp1c3RpZmljYXRpb24gcHJvcGVydGllcy4gVGhlcmUgYXJlIGZvdXIganVzdGlmaWNhdGlvbiAKLSAqIHByb3BlcnRpZXM6IHdlaWdodCwgcHJpb3JpdHksIGFic29yYiwgYW5kIGxpbWl0LgorICogVGhlIEdseXBoSnVzdGlmaWNhdGlvbkluZm8gY2xhc3MgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdseXBoJ3MKKyAqIGp1c3RpZmljYXRpb24gcHJvcGVydGllcy4gVGhlcmUgYXJlIGZvdXIganVzdGlmaWNhdGlvbiBwcm9wZXJ0aWVzOiB3ZWlnaHQsCisgKiBwcmlvcml0eSwgYWJzb3JiLCBhbmQgbGltaXQuCiAgKiA8cD4KLSAqIFRoZXJlIGFyZSB0d28gc2V0cyBvZiBtZXRyaWNzOiBncm93aW5nIGFuZCBzaHJpbmtpbmcuIAotICogR3Jvd2luZyBtZXRyaWNzIGFyZSB1c2VkIHdoZW4gdGhlIGdseXBocyBhcmUgdG8gYmUgc3ByZWFkIGFwYXJ0IAotICogdG8gZml0IGEgbGFyZ2VyIHdpZHRoLiBTaHJpbmtpbmcgbWV0cmljcyBhcmUgdXNlZCB3aGVuIHRoZSBnbHlwaHMgCi0gKiBhcmUgdG8gYmUgbW92ZWQgdG9nZXRoZXIgdG8gZml0IGEgc21hbGxlciB3aWR0aC4KKyAqIFRoZXJlIGFyZSB0d28gc2V0cyBvZiBtZXRyaWNzOiBncm93aW5nIGFuZCBzaHJpbmtpbmcuIEdyb3dpbmcgbWV0cmljcyBhcmUKKyAqIHVzZWQgd2hlbiB0aGUgZ2x5cGhzIGFyZSB0byBiZSBzcHJlYWQgYXBhcnQgdG8gZml0IGEgbGFyZ2VyIHdpZHRoLiBTaHJpbmtpbmcKKyAqIG1ldHJpY3MgYXJlIHVzZWQgd2hlbiB0aGUgZ2x5cGhzIGFyZSB0byBiZSBtb3ZlZCB0b2dldGhlciB0byBmaXQgYSBzbWFsbGVyCisgKiB3aWR0aC4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBHbHlwaEp1c3RpZmljYXRpb25JbmZvIHsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgUFJJT1JJVFlfS0FTSElEQSBpbmRpY2F0ZXMgdGhlIGhpZ2hlc3QgCi0gICAgICoganVzdGlmaWNhdGlvbiBwcmlvcml0eS4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUFJJT1JJVFlfS0FTSElEQSBpbmRpY2F0ZXMgdGhlIGhpZ2hlc3QganVzdGlmaWNhdGlvbgorICAgICAqIHByaW9yaXR5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX0tBU0hJREEgPSAwOwogCiAgICAgLyoqCi0gICAgICogVGhlIENvbnN0YW50IFBSSU9SSVRZX1dISVRFU1BBQ0UgaW5kaWNhdGVzIHRoZSBzZWNvbmQgaGlnaGVzdCAKLSAgICAgKiBqdXN0aWZpY2F0aW9uIHByaW9yaXR5LiAKKyAgICAgKiBUaGUgQ29uc3RhbnQgUFJJT1JJVFlfV0hJVEVTUEFDRSBpbmRpY2F0ZXMgdGhlIHNlY29uZCBoaWdoZXN0CisgICAgICoganVzdGlmaWNhdGlvbiBwcmlvcml0eS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9XSElURVNQQUNFID0gMTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgUFJJT1JJVFlfSU5URVJDSEFSIGluZGljYXRlcyB0aGUgc2Vjb25kIGxvd2VzdCAKLSAgICAgKiBqdXN0aWZpY2F0aW9uIHByaW9yaXR5LiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUFJJT1JJVFlfSU5URVJDSEFSIGluZGljYXRlcyB0aGUgc2Vjb25kIGxvd2VzdCBqdXN0aWZpY2F0aW9uCisgICAgICogcHJpb3JpdHkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfSU5URVJDSEFSID0gMjsKIAogICAgIC8qKgotICAgICAqIFRoZSBDb25zdGFudCBQUklPUklUWV9OT05FIGluZGljYXRlcyB0aGUgbG93ZXN0IGp1c3RpZmljYXRpb24gCi0gICAgICogcHJpb3JpdHkuCisgICAgICogVGhlIENvbnN0YW50IFBSSU9SSVRZX05PTkUgaW5kaWNhdGVzIHRoZSBsb3dlc3QganVzdGlmaWNhdGlvbiBwcmlvcml0eS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9OT05FID0gMzsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgZ3JvdyBhYnNvcmIgZmxhZyBpbmRpY2F0ZXMgaWYgdGhpcyBnbHlwaCBhYnNvcmJzIGFsbCBleHRyYSAKLSAgICAgKiBzcGFjZSBhdCB0aGlzIGFuZCBsb3dlciBwcmlvcml0eSBsZXZlbHMgd2hlbiBpdCBncm93cy4KKyAgICAvKioKKyAgICAgKiBUaGUgZ3JvdyBhYnNvcmIgZmxhZyBpbmRpY2F0ZXMgaWYgdGhpcyBnbHlwaCBhYnNvcmJzIGFsbCBleHRyYSBzcGFjZSBhdAorICAgICAqIHRoaXMgYW5kIGxvd2VyIHByaW9yaXR5IGxldmVscyB3aGVuIGl0IGdyb3dzLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGdyb3dBYnNvcmI7CiAKLSAgICAvKiogCi0gICAgICogVGhlIGdyb3cgbGVmdCBsaW1pdCB2YWx1ZSByZXByZXNlbnRzIHRoZSBtYXhpbXVtIHZhbHVlIGJ5IHdoaWNoIAotICAgICAqIHRoZSBsZWZ0IHNpZGUgb2YgdGhpcyBnbHlwaCBncm93cy4gCisgICAgLyoqCisgICAgICogVGhlIGdyb3cgbGVmdCBsaW1pdCB2YWx1ZSByZXByZXNlbnRzIHRoZSBtYXhpbXVtIHZhbHVlIGJ5IHdoaWNoIHRoZSBsZWZ0CisgICAgICogc2lkZSBvZiB0aGlzIGdseXBoIGdyb3dzLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBncm93TGVmdExpbWl0OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBncm93IHJpZ2h0IGxpbWl0IHZhbHVlIHJlcGVzZW50cyB0aGUgbWF4aW11bSB2YWx1ZSBieSB3aGljaCAKLSAgICAgKiB0aGUgcmlnaHQgc2lkZSBvZiB0aGlzIGdseXBoIGdyb3dzLgorICAgIC8qKgorICAgICAqIFRoZSBncm93IHJpZ2h0IGxpbWl0IHZhbHVlIHJlcGVzZW50cyB0aGUgbWF4aW11bSB2YWx1ZSBieSB3aGljaCB0aGUgcmlnaHQKKyAgICAgKiBzaWRlIG9mIHRoaXMgZ2x5cGggZ3Jvd3MuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGZsb2F0IGdyb3dSaWdodExpbWl0OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBncm93IHByaW9yaXR5IHZhbHVlIHJlcHJlc2VudHMgdGhlIHByaW9yaXR5IGxldmVsIG9mIHRoaXMgCi0gICAgICogZ2x5cGggYXMgaXQgaXMgZ3Jvd2luZy4gCisgICAgLyoqCisgICAgICogVGhlIGdyb3cgcHJpb3JpdHkgdmFsdWUgcmVwcmVzZW50cyB0aGUgcHJpb3JpdHkgbGV2ZWwgb2YgdGhpcyBnbHlwaCBhcyBpdAorICAgICAqIGlzIGdyb3dpbmcuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBncm93UHJpb3JpdHk7CiAKLSAgICAvKiogCi0gICAgICogVGhlIHNocmluayBhYnNvcmIgZmxlZyBpbmRpY2F0ZXMgdGhpcyBnbHlwaCBhYnNvcmJzIGFsbCByZW1haW5pbmcgCi0gICAgICogc2hyaW5rYWdlIGF0IHRoaXMgYW5kIGxvd2VyIHByaW9yaXR5IGxldmVscyBhcyBpdCBzaHJpbmtzLiAKKyAgICAvKioKKyAgICAgKiBUaGUgc2hyaW5rIGFic29yYiBmbGVnIGluZGljYXRlcyB0aGlzIGdseXBoIGFic29yYnMgYWxsIHJlbWFpbmluZworICAgICAqIHNocmlua2FnZSBhdCB0aGlzIGFuZCBsb3dlciBwcmlvcml0eSBsZXZlbHMgYXMgaXQgc2hyaW5rcy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzaHJpbmtBYnNvcmI7CiAKLSAgICAvKiogCi0gICAgICogVGhlIHNocmluayBsZWZ0IGxpbWl0IHZhbHVlIHJlcHJlc2VudHMgdGhlIG1heGltdW0gdmFsdWUgYnkgd2hpY2ggCi0gICAgICogdGhlIGxlZnQgc2lkZSBvZiB0aGlzIGdseXBoIHNocmlua3MuIAorICAgIC8qKgorICAgICAqIFRoZSBzaHJpbmsgbGVmdCBsaW1pdCB2YWx1ZSByZXByZXNlbnRzIHRoZSBtYXhpbXVtIHZhbHVlIGJ5IHdoaWNoIHRoZQorICAgICAqIGxlZnQgc2lkZSBvZiB0aGlzIGdseXBoIHNocmlua3MuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGZsb2F0IHNocmlua0xlZnRMaW1pdDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgc2hyaW5rIHJpZ2h0IGxpbWl0IHZhbHVlIHJlcHJlc2VudHMgdGhlIG1heGltdW0gdmFsdWUgYnkgd2hpY2ggCi0gICAgICogdGhlIHJpZ2h0IHNpZGUgb2YgdGhpcyBnbHlwaCBzaHJpbmtzLiAKKyAgICAvKioKKyAgICAgKiBUaGUgc2hyaW5rIHJpZ2h0IGxpbWl0IHZhbHVlIHJlcHJlc2VudHMgdGhlIG1heGltdW0gdmFsdWUgYnkgd2hpY2ggdGhlCisgICAgICogcmlnaHQgc2lkZSBvZiB0aGlzIGdseXBoIHNocmlua3MuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGZsb2F0IHNocmlua1JpZ2h0TGltaXQ7CiAKICAgICAvKioKLSAgICAgKiBUaGUgc2hyaW5rIHByaW9yaXR5IHJlcHJlc2VudHMgdGhlIGdseXRoJ3MgcHJpb3JpdHkgbGV2ZWwgCi0gICAgICogYXMgaXQgaXMgc2hyaW5raW5nLgorICAgICAqIFRoZSBzaHJpbmsgcHJpb3JpdHkgcmVwcmVzZW50cyB0aGUgZ2x5dGgncyBwcmlvcml0eSBsZXZlbCBhcyBpdCBpcworICAgICAqIHNocmlua2luZy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IHNocmlua1ByaW9yaXR5OwogCi0gICAgLyoqIAotICAgICAqIFRoZSB3ZWlnaHQgb2YgdGhlIGdseXBoLiAKKyAgICAvKioKKyAgICAgKiBUaGUgd2VpZ2h0IG9mIHRoZSBnbHlwaC4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgZmxvYXQgd2VpZ2h0OwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEdseXBoSnVzdGlmaWNhdGlvbkluZm8gb2JqZWN0IHdoaWNoIGNvbnRhaW5zCi0gICAgICogZ2x5cGgncyBqdXN0aWZpY2F0aW9uIHByb3BlcnRpZXMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEdseXBoSnVzdGlmaWNhdGlvbkluZm8gb2JqZWN0IHdoaWNoIGNvbnRhaW5zIGdseXBoJ3MKKyAgICAgKiBqdXN0aWZpY2F0aW9uIHByb3BlcnRpZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdlaWdodCB0aGUgd2VpZ2h0IG9mIGdseXBoLgotICAgICAqIEBwYXJhbSBncm93QWJzb3JiIGluZGljYXRlcyBpZiB0aGlzIGdseXBoIGNvbnRhaXMgYWxsIHNwYWNlIAotICAgICAqIGF0IHRoaXMgcHJpb3JpdHkgYW5kIGxvd2VyIHByaW9yaXR5IGxldmVscyB3aGVuIGl0IGdyb3dzLgotICAgICAqIEBwYXJhbSBncm93UHJpb3JpdHkgaW5kaWNhdGVzIHRoZSBwcmlvcml0eSBsZXZlbCBvZiB0aGlzIGdseXBoIAotICAgICAqIHdoZW4gaXQgZ3Jvd3MuCi0gICAgICogQHBhcmFtIGdyb3dMZWZ0TGltaXQgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHdoaWNoIHRoZSAKLSAgICAgKiBsZWZ0IHNpZGUgb2YgdGhpcyBnbHlwaCBjYW4gZ3Jvdy4KLSAgICAgKiBAcGFyYW0gZ3Jvd1JpZ2h0TGltaXQgdGhlIG1heGltdW0gdmFsdWUgb2Ygd2hpY2ggdGhlIHJpZ2h0IHNpZGUgb2YgCi0gICAgICogdGhpcyBnbHlwaCBjYW4gZ3Jvdy4KLSAgICAgKiBAcGFyYW0gc2hyaW5rQWJzb3JiIGluZGljYXRlcyBpZiB0aGlzIGdseXBoIGNvbnRhaW5zIGFsbCByZW1haW5pbmcKLSAgICAgKiBzaHJpbmthZ2UgYXQgdGhpcyBhbmQgbG93ZXIgcHJpb3JpdHkgbGV2ZWxzIHdoZW4gaXQgc2hyaW5rcy4KLSAgICAgKiBAcGFyYW0gc2hyaW5rUHJpb3JpdHkgaW5kaWNhdGVzIHRoZSBnbHlwaCdzIHByaW9yaXR5IGxldmVsIHdoZW4gCi0gICAgICogaXQgc2hyaW5rcy4KLSAgICAgKiBAcGFyYW0gc2hyaW5rTGVmdExpbWl0IGluZGljYXRlcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiB3aGljaCAKLSAgICAgKiB0aGUgbGVmdCBzaWRlIG9mIHRoaXMgZ2x5cGggY2FuIHNocmluay4gCi0gICAgICogQHBhcmFtIHNocmlua1JpZ2h0TGltaXQgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIGFtb3VudCBieSB3aGljaCAKLSAgICAgKiB0aGUgcmlnaHQgc2lkZSBvZiB0aGlzIGdseXBoIGNhbiBzaHJpbmsuCisgICAgICogQHBhcmFtIHdlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIHdlaWdodCBvZiBnbHlwaC4KKyAgICAgKiBAcGFyYW0gZ3Jvd0Fic29yYgorICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIGlmIHRoaXMgZ2x5cGggY29udGFpcyBhbGwgc3BhY2UgYXQgdGhpcyBwcmlvcml0eSBhbmQKKyAgICAgKiAgICAgICAgICAgIGxvd2VyIHByaW9yaXR5IGxldmVscyB3aGVuIGl0IGdyb3dzLgorICAgICAqIEBwYXJhbSBncm93UHJpb3JpdHkKKyAgICAgKiAgICAgICAgICAgIGluZGljYXRlcyB0aGUgcHJpb3JpdHkgbGV2ZWwgb2YgdGhpcyBnbHlwaCB3aGVuIGl0IGdyb3dzLgorICAgICAqIEBwYXJhbSBncm93TGVmdExpbWl0CisgICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgdGhlIG1heGltdW0gdmFsdWUgb2Ygd2hpY2ggdGhlIGxlZnQgc2lkZSBvZiB0aGlzCisgICAgICogICAgICAgICAgICBnbHlwaCBjYW4gZ3Jvdy4KKyAgICAgKiBAcGFyYW0gZ3Jvd1JpZ2h0TGltaXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHdoaWNoIHRoZSByaWdodCBzaWRlIG9mIHRoaXMgZ2x5cGggY2FuCisgICAgICogICAgICAgICAgICBncm93LgorICAgICAqIEBwYXJhbSBzaHJpbmtBYnNvcmIKKyAgICAgKiAgICAgICAgICAgIGluZGljYXRlcyBpZiB0aGlzIGdseXBoIGNvbnRhaW5zIGFsbCByZW1haW5pbmcgc2hyaW5rYWdlIGF0CisgICAgICogICAgICAgICAgICB0aGlzIGFuZCBsb3dlciBwcmlvcml0eSBsZXZlbHMgd2hlbiBpdCBzaHJpbmtzLgorICAgICAqIEBwYXJhbSBzaHJpbmtQcmlvcml0eQorICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIHRoZSBnbHlwaCdzIHByaW9yaXR5IGxldmVsIHdoZW4gaXQgc2hyaW5rcy4KKyAgICAgKiBAcGFyYW0gc2hyaW5rTGVmdExpbWl0CisgICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgdGhlIG1heGltdW0gdmFsdWUgb2Ygd2hpY2ggdGhlIGxlZnQgc2lkZSBvZiB0aGlzCisgICAgICogICAgICAgICAgICBnbHlwaCBjYW4gc2hyaW5rLgorICAgICAqIEBwYXJhbSBzaHJpbmtSaWdodExpbWl0CisgICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgdGhlIG1heGltdW0gYW1vdW50IGJ5IHdoaWNoIHRoZSByaWdodCBzaWRlIG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgIGdseXBoIGNhbiBzaHJpbmsuCiAgICAgICovCiAgICAgcHVibGljIEdseXBoSnVzdGlmaWNhdGlvbkluZm8oZmxvYXQgd2VpZ2h0LCBib29sZWFuIGdyb3dBYnNvcmIsIGludCBncm93UHJpb3JpdHksCi0gICAgICAgICAgICBmbG9hdCBncm93TGVmdExpbWl0LCBmbG9hdCBncm93UmlnaHRMaW1pdCwgYm9vbGVhbiBzaHJpbmtBYnNvcmIsCi0gICAgICAgICAgICBpbnQgc2hyaW5rUHJpb3JpdHksIGZsb2F0IHNocmlua0xlZnRMaW1pdCwgZmxvYXQgc2hyaW5rUmlnaHRMaW1pdCkgeworICAgICAgICAgICAgZmxvYXQgZ3Jvd0xlZnRMaW1pdCwgZmxvYXQgZ3Jvd1JpZ2h0TGltaXQsIGJvb2xlYW4gc2hyaW5rQWJzb3JiLCBpbnQgc2hyaW5rUHJpb3JpdHksCisgICAgICAgICAgICBmbG9hdCBzaHJpbmtMZWZ0TGltaXQsIGZsb2F0IHNocmlua1JpZ2h0TGltaXQpIHsKIAogICAgICAgICBpZiAod2VpZ2h0IDwgMCkgewogICAgICAgICAgICAgLy8gYXd0LjE5Qz13ZWlnaHQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcgpAQCAtMTU2LDEzICsxNjYsMTUgQEAKICAgICAgICAgdGhpcy5ncm93UmlnaHRMaW1pdCA9IGdyb3dSaWdodExpbWl0OwogCiAgICAgICAgIGlmICgoc2hyaW5rUHJpb3JpdHkgPCAwKSB8fCAoc2hyaW5rUHJpb3JpdHkgPiBQUklPUklUWV9OT05FKSkgewotICAgICAgICAgICAgLy8gYXd0LjE5Rj1pbmNvcnJlY3QgdmFsdWUgZm9yIHNocmlua1ByaW9yaXR5LCBtb3JlIHRoYW4gUFJJT1JJVFlfTk9ORSBvciBsZXNzIHRoYW4gUFJJT1JJVFlfS0FTSElEQSB2YWx1ZQorICAgICAgICAgICAgLy8gYXd0LjE5Rj1pbmNvcnJlY3QgdmFsdWUgZm9yIHNocmlua1ByaW9yaXR5LCBtb3JlIHRoYW4KKyAgICAgICAgICAgIC8vIFBSSU9SSVRZX05PTkUgb3IgbGVzcyB0aGFuIFBSSU9SSVRZX0tBU0hJREEgdmFsdWUKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTlGIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgdGhpcy5zaHJpbmtQcmlvcml0eSA9IHNocmlua1ByaW9yaXR5OwogCiAgICAgICAgIGlmICgoZ3Jvd1ByaW9yaXR5IDwgMCkgfHwgKGdyb3dQcmlvcml0eSA+IFBSSU9SSVRZX05PTkUpKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjAwPWluY29ycmVjdCB2YWx1ZSBmb3IgZ3Jvd1ByaW9yaXR5LCBtb3JlIHRoYW4gUFJJT1JJVFlfTk9ORSBvciBsZXNzIHRoYW4gUFJJT1JJVFlfS0FTSElEQSB2YWx1ZQorICAgICAgICAgICAgLy8gYXd0LjIwMD1pbmNvcnJlY3QgdmFsdWUgZm9yIGdyb3dQcmlvcml0eSwgbW9yZSB0aGFuIFBSSU9SSVRZX05PTkUKKyAgICAgICAgICAgIC8vIG9yIGxlc3MgdGhhbiBQUklPUklUWV9LQVNISURBIHZhbHVlCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIwMCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIHRoaXMuZ3Jvd1ByaW9yaXR5ID0gZ3Jvd1ByaW9yaXR5OwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ZvbnQvR2x5cGhNZXRyaWNzLmphdmEgYi9hd3QvamF2YS9hd3QvZm9udC9HbHlwaE1ldHJpY3MuamF2YQppbmRleCBkOTZlZjE4Li4yODcxNzIyIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZm9udC9HbHlwaE1ldHJpY3MuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZm9udC9HbHlwaE1ldHJpY3MuamF2YQpAQCAtMTgsODIgKzE4LDk4IEBACiAgKiBAYXV0aG9yIElseWEgUy4gT2tvbWluCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5mb250OwogCiBpbXBvcnQgamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRDsKIAogLyoqCi0gKiBUaGUgR2x5cGhNZXRyaWNzIGNsYXNzIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzaXplIGFuZCBzaGFwZSAKLSAqIG9mIGEgc2luZ2xlIGdseXBoLiAKLSAqIEVhY2ggZ2x5cGggaGFzIGluZm9ybWF0aW9uIHRvIHNwZWNpZnkgd2hldGhlciBpdHMgYmFzZWxpbmUgaXMgaG9yaXpvbnRhbCAKLSAqIG9yIHZlcnRpY2FsIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gb24gaG93IGl0IGludGVyYWN0cyB3aXRoIAotICogb3RoZXIgY2hhcmFjdGVycyBpbiBhIHRleHQsIGdpdmVuIGFzIG9uZSBvZiB0aGUKLSAqIGZvbGxvd2luZyB0eXBlczogU1RBTkRBUkQsIExJR0FUVVJFLCBDT01CSU5JTkcsIG9yIENPTVBPTkVOVC4KKyAqIFRoZSBHbHlwaE1ldHJpY3MgY2xhc3MgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNpemUgYW5kIHNoYXBlIG9mIGEKKyAqIHNpbmdsZSBnbHlwaC4gRWFjaCBnbHlwaCBoYXMgaW5mb3JtYXRpb24gdG8gc3BlY2lmeSB3aGV0aGVyIGl0cyBiYXNlbGluZSBpcworICogaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIG9uIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBvdGhlcgorICogY2hhcmFjdGVycyBpbiBhIHRleHQsIGdpdmVuIGFzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzOiBTVEFOREFSRCwKKyAqIExJR0FUVVJFLCBDT01CSU5JTkcsIG9yIENPTVBPTkVOVC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBHbHlwaE1ldHJpY3MgewogCiAgICAgLy8gYWR2YW5jZSB3aWR0aCBvZiB0aGUgZ2x5cGggY2hhcmFjdGVyIGNlbGwKLSAgICAvKiogVGhlIGFkdmFuY2UgeC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgYWR2YW5jZSB4LgorICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgYWR2YW5jZVg7Ci0gICAgCisKICAgICAvLyBhZHZhbmNlIGhlaWdodCBvZiB0aGUgZ2x5cGggY2hhcmFjdGVyIGNlbGwKLSAgICAvKiogVGhlIGFkdmFuY2UgeS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgYWR2YW5jZSB5LgorICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgYWR2YW5jZVk7CiAKICAgICAvLyBmbGFnIGlmIHRoZSBnbHlwaCBob3Jpem9udGFsCi0gICAgLyoqIFRoZSBob3Jpem9udGFsLiAqLworICAgIC8qKgorICAgICAqIFRoZSBob3Jpem9udGFsLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBob3Jpem9udGFsOwogCi0gICAgLy8gZ2x5cGggdHlwZSBjb2RlIAotICAgIC8qKiBUaGUgZ2x5cGggdHlwZS4gKi8KKyAgICAvLyBnbHlwaCB0eXBlIGNvZGUKKyAgICAvKioKKyAgICAgKiBUaGUgZ2x5cGggdHlwZS4KKyAgICAgKi8KICAgICBwcml2YXRlIGJ5dGUgZ2x5cGhUeXBlOwotICAgIAorCiAgICAgLy8gYm91bmRpbmcgYm94IGZvciBvdXRsaW5lIG9mIHRoZSBnbHlwaAotICAgIC8qKiBUaGUgYm91bmRzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBib3VuZHMuCisgICAgICovCiAgICAgcHJpdmF0ZSBSZWN0YW5nbGUyRC5GbG9hdCBib3VuZHM7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFNUQU5EQVJEIGluZGljYXRlcyBhIGdseXBoIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSAKLSAgICAgKiBjaGFyYWN0ZXIuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBTVEFOREFSRCBpbmRpY2F0ZXMgYSBnbHlwaCB0aGF0IHJlcHJlc2VudHMgYSBzaW5nbGUKKyAgICAgKiBjaGFyYWN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNUQU5EQVJEID0gMDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgTElHQVRVUkUgaW5kaWNhdGVzIGEgZ2x5cGggdGhhdCByZXByZXNlbnRzIG11bHRpcGxlIAotICAgICAqIGNoYXJhY3RlcnMgYXMgYSBsaWdhdHVyZS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IExJR0FUVVJFIGluZGljYXRlcyBhIGdseXBoIHRoYXQgcmVwcmVzZW50cyBtdWx0aXBsZQorICAgICAqIGNoYXJhY3RlcnMgYXMgYSBsaWdhdHVyZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTElHQVRVUkUgPSAxOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBDT01CSU5JTkcgaW5kaWNhdGVzIGEgZ2x5cGggd2hpY2ggaGFzIG5vIGNhcmV0IHBvc2l0aW9uIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDT01CSU5JTkcgaW5kaWNhdGVzIGEgZ2x5cGggd2hpY2ggaGFzIG5vIGNhcmV0IHBvc2l0aW9uCiAgICAgICogYmV0d2VlbiBnbHlwaHMgKGZvciBleGFtcGxlIHVtbGF1dCkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENPTUJJTklORyA9IDI7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IENPTVBPTkVOVCBpbmRpY2F0ZXMgYSBnbHlwaCB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVyIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDT01QT05FTlQgaW5kaWNhdGVzIGEgZ2x5cGggd2l0aCBubyBjb3JyZXNwb25kaW5nIGNoYXJhY3RlcgogICAgICAqIGluIHRoZSBiYWNraW5nIHN0b3JlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDT01QT05FTlQgPSAzOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBXSElURVNQQUNFIGluZGljYXRlcyBhIGdseXBoIHdpdGhvdXQgdmlzdWFsIAotICAgICAqIHJlcHJlc2VudGF0aW9uLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgV0hJVEVTUEFDRSBpbmRpY2F0ZXMgYSBnbHlwaCB3aXRob3V0IHZpc3VhbCByZXByZXNlbnRhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgV0hJVEVTUEFDRSA9IDQ7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgR2x5cGhNZXRyaWNzIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaG9yaXpvbnRhbCBzcGVjaWZpZXMgaWYgbWV0cmljcyBhcmUgZm9yIGEgaG9yaXpvbnRhbCBiYXNlbGluZSAKLSAgICAgKiAodHJ1ZSB2YWx1ZSksIG9yIGEgdmVydGljYWwgYmFzZWxpbmUgKGZhbHNlIHZhbHVlKS4KLSAgICAgKiBAcGFyYW0gYWR2YW5jZVggdGhlIFggY29tcG9uZW50IG9mIHRoZSBnbHlwaCdzIGFkdmFuY2UuCi0gICAgICogQHBhcmFtIGFkdmFuY2VZIHRoZSBZIGNvbXBvbmVudCBvZiB0aGUgZ2x5cGgncyBhZHZhbmNlLgotICAgICAqIEBwYXJhbSBib3VuZHMgdGhlIGdseXBoJ3MgYm91bmRzLgotICAgICAqIEBwYXJhbSBnbHlwaFR5cGUgdGhlIGdseXBoJ3MgdHlwZS4KKyAgICAgKiBAcGFyYW0gaG9yaXpvbnRhbAorICAgICAqICAgICAgICAgICAgc3BlY2lmaWVzIGlmIG1ldHJpY3MgYXJlIGZvciBhIGhvcml6b250YWwgYmFzZWxpbmUgKHRydWUKKyAgICAgKiAgICAgICAgICAgIHZhbHVlKSwgb3IgYSB2ZXJ0aWNhbCBiYXNlbGluZSAoZmFsc2UgdmFsdWUpLgorICAgICAqIEBwYXJhbSBhZHZhbmNlWAorICAgICAqICAgICAgICAgICAgdGhlIFggY29tcG9uZW50IG9mIHRoZSBnbHlwaCdzIGFkdmFuY2UuCisgICAgICogQHBhcmFtIGFkdmFuY2VZCisgICAgICogICAgICAgICAgICB0aGUgWSBjb21wb25lbnQgb2YgdGhlIGdseXBoJ3MgYWR2YW5jZS4KKyAgICAgKiBAcGFyYW0gYm91bmRzCisgICAgICogICAgICAgICAgICB0aGUgZ2x5cGgncyBib3VuZHMuCisgICAgICogQHBhcmFtIGdseXBoVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGdseXBoJ3MgdHlwZS4KICAgICAgKi8KLSAgICBwdWJsaWMgR2x5cGhNZXRyaWNzKGJvb2xlYW4gaG9yaXpvbnRhbCwgZmxvYXQgYWR2YW5jZVgsIGZsb2F0IGFkdmFuY2VZLCAKLSAgICAgICAgICAgIFJlY3RhbmdsZTJEIGJvdW5kcywgYnl0ZSBnbHlwaFR5cGUpIHsKKyAgICBwdWJsaWMgR2x5cGhNZXRyaWNzKGJvb2xlYW4gaG9yaXpvbnRhbCwgZmxvYXQgYWR2YW5jZVgsIGZsb2F0IGFkdmFuY2VZLCBSZWN0YW5nbGUyRCBib3VuZHMsCisgICAgICAgICAgICBieXRlIGdseXBoVHlwZSkgewogICAgICAgICB0aGlzLmhvcml6b250YWwgPSBob3Jpem9udGFsOwogICAgICAgICB0aGlzLmFkdmFuY2VYID0gYWR2YW5jZVg7CiAgICAgICAgIHRoaXMuYWR2YW5jZVkgPSBhZHZhbmNlWTsKQEAgLTEwNyw5ICsxMjMsMTIgQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgaG9yaXpvbnRhbCBHbHlwaE1ldHJpY3Mgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGFkdmFuY2VYIHRoZSBYIGNvbXBvbmVudCBvZiB0aGUgZ2x5cGgncyBhZHZhbmNlLgotICAgICAqIEBwYXJhbSBib3VuZHMgdGhlIGdseXBoJ3MgYm91bmRzLgotICAgICAqIEBwYXJhbSBnbHlwaFR5cGUgdGhlIGdseXBoJ3MgdHlwZS4KKyAgICAgKiBAcGFyYW0gYWR2YW5jZVgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvbXBvbmVudCBvZiB0aGUgZ2x5cGgncyBhZHZhbmNlLgorICAgICAqIEBwYXJhbSBib3VuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBnbHlwaCdzIGJvdW5kcy4KKyAgICAgKiBAcGFyYW0gZ2x5cGhUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZ2x5cGgncyB0eXBlLgogICAgICAqLwogICAgIHB1YmxpYyBHbHlwaE1ldHJpY3MoZmxvYXQgYWR2YW5jZVgsIFJlY3RhbmdsZTJEIGJvdW5kcywgYnl0ZSBnbHlwaFR5cGUpIHsKICAgICAgICAgdGhpcy5hZHZhbmNlWCA9IGFkdmFuY2VYOwpAQCAtMTI5LDcgKzE0OCw3IEBACiAgICAgICogQHJldHVybiBnbHlwaCdzIGJvdW5kcy4KICAgICAgKi8KICAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzMkQoKSB7Ci0gICAgICAgIHJldHVybiAoUmVjdGFuZ2xlMkQuRmxvYXQpIHRoaXMuYm91bmRzLmNsb25lKCk7CisgICAgICAgIHJldHVybiAoUmVjdGFuZ2xlMkQuRmxvYXQpdGhpcy5ib3VuZHMuY2xvbmUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE4NywxMSArMjA2LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgcmlnaHQgKGZvciBob3Jpem9udGFsKSBvciAKLSAgICAgKiBib3R0b20gKGZvciB2ZXJ0aWNhbCkgb2YgdGhlIGdseXBoIGJvdW5kcyB0byB0aGUgYWR2YW5jZS4KKyAgICAgKiBHZXRzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSByaWdodCAoZm9yIGhvcml6b250YWwpIG9yIGJvdHRvbSAoZm9yCisgICAgICogdmVydGljYWwpIG9mIHRoZSBnbHlwaCBib3VuZHMgdG8gdGhlIGFkdmFuY2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgcmlnaHQgKGZvciBob3Jpem9udGFsKSBvciAKLSAgICAgKiBib3R0b20gKGZvciB2ZXJ0aWNhbCkgb2YgdGhlIGdseXBoIGJvdW5kcyB0byB0aGUgYWR2YW5jZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSByaWdodCAoZm9yIGhvcml6b250YWwpIG9yIGJvdHRvbSAoZm9yCisgICAgICogICAgICAgICB2ZXJ0aWNhbCkgb2YgdGhlIGdseXBoIGJvdW5kcyB0byB0aGUgYWR2YW5jZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0UlNCKCkgewogICAgICAgICBpZiAodGhpcy5ob3Jpem9udGFsKSB7CkBAIC0yMDEsMTEgKzIyMCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRpc3RhbmNlIGZyb20gMCwgMCB0byB0aGUgbGVmdCAoZm9yIGhvcml6b250YWwpIAotICAgICAqIG9yIHRvcCAoZm9yIHZlcnRpY2FsKSBvZiB0aGUgZ2x5cGggYm91bmRzLgorICAgICAqIEdldHMgdGhlIGRpc3RhbmNlIGZyb20gMCwgMCB0byB0aGUgbGVmdCAoZm9yIGhvcml6b250YWwpIG9yIHRvcCAoZm9yCisgICAgICogdmVydGljYWwpIG9mIHRoZSBnbHlwaCBib3VuZHMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGlzdGFuY2UgZnJvbSAwLCAwIHRvIHRoZSBsZWZ0IChmb3IgaG9yaXpvbnRhbCkgCi0gICAgICogb3IgdG9wIChmb3IgdmVydGljYWwpIG9mIHRoZSBnbHlwaCBib3VuZHMuCisgICAgICogQHJldHVybiB0aGUgZGlzdGFuY2UgZnJvbSAwLCAwIHRvIHRoZSBsZWZ0IChmb3IgaG9yaXpvbnRhbCkgb3IgdG9wIChmb3IKKyAgICAgKiAgICAgICAgIHZlcnRpY2FsKSBvZiB0aGUgZ2x5cGggYm91bmRzLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRMU0IoKSB7CiAgICAgICAgIGlmICh0aGlzLmhvcml6b250YWwpIHsKQEAgLTI0NSw0ICsyNjQsMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZm9udC9HbHlwaFZlY3Rvci5qYXZhIGIvYXd0L2phdmEvYXd0L2ZvbnQvR2x5cGhWZWN0b3IuamF2YQppbmRleCBiM2M5NDA2Li5hNzJiNzc0IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZm9udC9HbHlwaFZlY3Rvci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9mb250L0dseXBoVmVjdG9yLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgSWx5YSBTLiBPa29taW4KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmZvbnQ7CiAKIGltcG9ydCBqYXZhLmF3dC5Gb250OwpAQCAtMzIsNDUgKzMzLDQ3IEBACiBpbXBvcnQgamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRDsKIAogLyoqCi0gKiBUaGUgR2x5cGhWZWN0b3IgY2xhc3MgY29udGFpbnMgYSBjb2xsZWN0aW9uIG9mIGdseXBocyB3aXRoIGdlb21ldHJpYyAKLSAqIGluZm9ybWF0aW9uIGFuZCBlYWNoIGdseXBoJ3MgbG9jYXRpb24uIEVhY2ggR2x5cGhWZWN0b3IgY2FuIGJlIGFzc29jaWF0ZWQgCi0gKiB3aXRoIG9ubHkgb25lIEZvbnQuIEdseXBoVmVjdG9yIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBmb3IgCi0gKiBlYWNoIGdseXBoOgorICogVGhlIEdseXBoVmVjdG9yIGNsYXNzIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBnbHlwaHMgd2l0aCBnZW9tZXRyaWMKKyAqIGluZm9ybWF0aW9uIGFuZCBlYWNoIGdseXBoJ3MgbG9jYXRpb24uIEVhY2ggR2x5cGhWZWN0b3IgY2FuIGJlIGFzc29jaWF0ZWQKKyAqIHdpdGggb25seSBvbmUgRm9udC4gR2x5cGhWZWN0b3IgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGZvciBlYWNoCisgKiBnbHlwaDoKICAqIDx1bD4KICAqIDxsaT50aGUgZ2x5cGggcG9zaXRpb247PC9saT4KICAqIDxsaT50aGUgdHJhbnNmb3JtIG9mIHRoZSBnbHlwaDs8L2xpPgogICogPGxpPnRoZSBtZXRyaWNzIG9mIHRoZSBnbHlwaCBpbiB0aGUgY29udGV4dCBvZiB0aGUgR2x5cGhWZWN0b3IuPC9saT4KICAqIDwvdWw+CisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2x5cGhWZWN0b3IgaW1wbGVtZW50cyBDbG9uZWFibGUgewogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBGTEFHX0hBU19UUkFOU0ZPUk1TIGluZGljYXRlcyB0aGF0IHRoaXMgR2x5cGhWZWN0b3IgCi0gICAgICogaGFzIHBlci1nbHlwaCB0cmFuc2Zvcm1zLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBGTEFHX0hBU19UUkFOU0ZPUk1TIGluZGljYXRlcyB0aGF0IHRoaXMgR2x5cGhWZWN0b3IgaGFzCisgICAgICogcGVyLWdseXBoIHRyYW5zZm9ybXMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19IQVNfVFJBTlNGT1JNUyA9IDE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEZMQUdfSEFTX1BPU0lUSU9OX0FESlVTVE1FTlRTIGluZGljYXRlcyB0aGF0IAotICAgICAqIHRoZSBHbHlwaFZlY3RvciBoYXMgcGVyLWdseXBoIHBvc2l0aW9uIGFkanVzdG1lbnRzLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRkxBR19IQVNfUE9TSVRJT05fQURKVVNUTUVOVFMgaW5kaWNhdGVzIHRoYXQgdGhlIEdseXBoVmVjdG9yCisgICAgICogaGFzIHBlci1nbHlwaCBwb3NpdGlvbiBhZGp1c3RtZW50cy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0hBU19QT1NJVElPTl9BREpVU1RNRU5UUyA9IDI7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEZMQUdfUlVOX1JUTCBpbmRpY2F0ZXMgdGhhdCB0aGlzIEdseXBoVmVjdG9yIGhhcyBhIAotICAgICAqIHJpZ2h0IHRvIGxlZnQgcnVuIGRpcmVjdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRkxBR19SVU5fUlRMIGluZGljYXRlcyB0aGF0IHRoaXMgR2x5cGhWZWN0b3IgaGFzIGEgcmlnaHQgdG8KKyAgICAgKiBsZWZ0IHJ1biBkaXJlY3Rpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19SVU5fUlRMID0gNDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgRkxBR19DT01QTEVYX0dMWVBIUyBpbmRpY2F0ZXMgdGhhdCB0aGlzIEdseXBoVmVjdG9yIAotICAgICAqIGhhcyBhIGNvbXBsZXggZ2x5cGggdG8gY2hhciBtYXBwaW5nLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBGTEFHX0NPTVBMRVhfR0xZUEhTIGluZGljYXRlcyB0aGF0IHRoaXMgR2x5cGhWZWN0b3IgaGFzIGEKKyAgICAgKiBjb21wbGV4IGdseXBoIHRvIGNoYXIgbWFwcGluZy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0NPTVBMRVhfR0xZUEhTID0gODsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgRkxBR19NQVNLIGluZGljYXRlcyBhIG1hc2sgZm9yIHN1cHBvcnRlZCBmbGFncyAKLSAgICAgKiBmcm9tIGdldExheW91dEZsYWdzLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBGTEFHX01BU0sgaW5kaWNhdGVzIGEgbWFzayBmb3Igc3VwcG9ydGVkIGZsYWdzIGZyb20KKyAgICAgKiBnZXRMYXlvdXRGbGFncy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX01BU0sgPSAxNTsgLy8gKHwpIG1hc2sgb2Ygb3RoZXIgZmxhZ3MKIApAQCAtODEsMTcgKzg0LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgcGl4ZWwgYm91bmRzIG9mIHRoZSBHbHlwaFZlY3RvciB3aGVuIHJlbmRlcmVkCi0gICAgICogYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgRm9udFJlbmRlckNvbnRleHQuCisgICAgICogR2V0cyB0aGUgcGl4ZWwgYm91bmRzIG9mIHRoZSBHbHlwaFZlY3RvciB3aGVuIHJlbmRlcmVkIGF0IHRoZSBzcGVjaWZpZWQKKyAgICAgKiBsb2NhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgRm9udFJlbmRlckNvbnRleHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZyYyB0aGUgRm9udFJlbmRlckNvbnRleHQuCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgR2x5cGhWZWN0b3IncyBsb2NhdGlvbi4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBHbHlwaFZlY3RvcidzIGxvY2F0aW9uLgotICAgICAqIAorICAgICAqIEBwYXJhbSBmcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250UmVuZGVyQ29udGV4dC4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgR2x5cGhWZWN0b3IncyBsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgR2x5cGhWZWN0b3IncyBsb2NhdGlvbi4KICAgICAgKiBAcmV0dXJuIHRoZSBwaXhlbCBib3VuZHMKICAgICAgKi8KICAgICBwdWJsaWMgUmVjdGFuZ2xlIGdldFBpeGVsQm91bmRzKEZvbnRSZW5kZXJDb250ZXh0IGZyYywgZmxvYXQgeCwgZmxvYXQgeSkgewotICAgICAgICAvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIC0gaW50ZWdlciBSZWN0YW5nbGUsIHRoYXQgZW5jbG9zZXMgdmlzdWFsIAorICAgICAgICAvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIC0gaW50ZWdlciBSZWN0YW5nbGUsIHRoYXQgZW5jbG9zZXMgdmlzdWFsCiAgICAgICAgIC8vIGJvdW5kcyByZWN0YW5nbGUKICAgICAgICAgUmVjdGFuZ2xlMkQgdmlzdWFsUmVjdCA9IGdldFZpc3VhbEJvdW5kcygpOwogCkBAIC0xMDQsMTkgKzEwOSwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHBpeGVsIGJvdW5kcyBvZiB0aGUgZ2x5cGggd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4IGluCi0gICAgICogdGhpcyBHbHlwaFZlY3RvciB3aGljaCBpcyByZW5kZXJlZCB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBGb250UmVuZGVyQ29udGV4dCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAgICAqIEdldHMgdGhlIHBpeGVsIGJvdW5kcyBvZiB0aGUgZ2x5cGggd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoaXMKKyAgICAgKiBHbHlwaFZlY3RvciB3aGljaCBpcyByZW5kZXJlZCB3aXRoIHRoZSBzcGVjaWZpZWQgRm9udFJlbmRlckNvbnRleHQgYXQgdGhlCisgICAgICogc3BlY2lmaWVkIGxvY2F0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgZ2x5cGggaW5kZXggaW4gdGhpcyBHbHlwaFZlY3Rvci4KLSAgICAgKiBAcGFyYW0gZnJjIHRoZSBGb250UmVuZGVyQ29udGV4dC4KLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBHbHlwaFZlY3RvcidzIGxvY2F0aW9uLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIEdseXBoVmVjdG9yJ3MgbG9jYXRpb24uCi0gICAgICogCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgZ2x5cGggaW5kZXggaW4gdGhpcyBHbHlwaFZlY3Rvci4KKyAgICAgKiBAcGFyYW0gZnJjCisgICAgICogICAgICAgICAgICB0aGUgRm9udFJlbmRlckNvbnRleHQuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIEdseXBoVmVjdG9yJ3MgbG9jYXRpb24uCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIEdseXBoVmVjdG9yJ3MgbG9jYXRpb24uCiAgICAgICogQHJldHVybiBhIFJlY3RhbmdsZSBib3VuZHMuCiAgICAgICovCi0gICAgcHVibGljIFJlY3RhbmdsZSBnZXRHbHlwaFBpeGVsQm91bmRzKGludCBpbmRleCwgRm9udFJlbmRlckNvbnRleHQgZnJjLCAKLSAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICBwdWJsaWMgUmVjdGFuZ2xlIGdldEdseXBoUGl4ZWxCb3VuZHMoaW50IGluZGV4LCBGb250UmVuZGVyQ29udGV4dCBmcmMsIGZsb2F0IHgsIGZsb2F0IHkpIHsKICAgICAgICAgUmVjdGFuZ2xlMkQgdmlzdWFsUmVjdCA9IGdldEdseXBoVmlzdWFsQm91bmRzKGluZGV4KS5nZXRCb3VuZHMyRCgpOwogCiAgICAgICAgIGludCBtaW5YID0gKGludClNYXRoLmZsb29yKHZpc3VhbFJlY3QuZ2V0TWluWCgpICsgeCk7CkBAIC0xMjgsMTQgKzEzNSwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZpc3VhbCBib3VuZHMgb2YgdGhlIEdseXBoVmVjdG9yLiAKKyAgICAgKiBHZXRzIHRoZSB2aXN1YWwgYm91bmRzIG9mIHRoZSBHbHlwaFZlY3Rvci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSB2aXN1YWwgYm91bmRzIG9mIHRoZSBHbHlwaFZlY3Rvci4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgUmVjdGFuZ2xlMkQgZ2V0VmlzdWFsQm91bmRzKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb2dpY2FsIGJvdW5kcyBvZiB0aGUgR2x5cGhWZWN0b3IuIAorICAgICAqIEdldHMgdGhlIGxvZ2ljYWwgYm91bmRzIG9mIHRoZSBHbHlwaFZlY3Rvci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBsb2dpY2FsIGJvdW5kcyBvZiB0aGUgR2x5cGhWZWN0b3IuCiAgICAgICovCkBAIC0xNDQsMzYgKzE1MSwzOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBzcGVjaWZpZWQgZ2x5cGggaW4gdGhpcyBHbHlwaFZlY3Rvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleCB0aGUgZ2x5cGggaW5kZXggaW4gdGhpcyBHbHlwaFZlY3Rvci4KLSAgICAgKiBAcGFyYW0gbmV3UG9zIHRoZSBuZXcgcG9zaXRpb24gb2YgdGhlIGdseXBoIGF0IHRoZSBzcGVjaWZpZWQgZ2x5cGhJbmRleC4KKyAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGdseXBoIGluZGV4IGluIHRoaXMgR2x5cGhWZWN0b3IuCisgICAgICogQHBhcmFtIG5ld1BvcworICAgICAqICAgICAgICAgICAgdGhlIG5ldyBwb3NpdGlvbiBvZiB0aGUgZ2x5cGggYXQgdGhlIHNwZWNpZmllZCBnbHlwaEluZGV4LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEdseXBoUG9zaXRpb24oaW50IGdseXBoSW5kZXgsIFBvaW50MkQgbmV3UG9zKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBzcGVjaWZpZWQgZ2x5cGggaW4gdGhpcyBHbHlwaFZlY3Rvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleCB0aGUgZ2x5cGggaW5kZXggaW4gdGhpcyBHbHlwaFZlY3Rvci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGdseXBoIGluZGV4IGluIHRoaXMgR2x5cGhWZWN0b3IuCiAgICAgICogQHJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIHNwZWNpZmllZCBnbHlwaCBpbiB0aGlzIEdseXBoVmVjdG9yLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBQb2ludDJEIGdldEdseXBoUG9zaXRpb24oaW50IGdseXBoSW5kZXgpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgYWZmaW5lIHRyYW5zZm9ybSB0byBhIGdseXBoIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleAotICAgICAqIGluIHRoaXMgR2x5cGhWZWN0b3IuCisgICAgICogU2V0cyB0aGUgYWZmaW5lIHRyYW5zZm9ybSB0byBhIGdseXBoIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleCBpbiB0aGlzCisgICAgICogR2x5cGhWZWN0b3IuCiAgICAgICogCi0gICAgICogQHBhcmFtIGdseXBoSW5kZXggdGhlIGdseXRoIGluZGV4IGluIHRoaXMgR2x5cGhWZWN0b3IuCi0gICAgICogQHBhcmFtIHRyYW5zIHRoZSBBZmZpbmVUcmFuc2Zvcm0gdG8gYmUgYXNzaWduZWQgdG8gdGhlCi0gICAgICogc3BlY2lmaWVkIGdseXBoLgorICAgICAqIEBwYXJhbSBnbHlwaEluZGV4CisgICAgICogICAgICAgICAgICB0aGUgZ2x5dGggaW5kZXggaW4gdGhpcyBHbHlwaFZlY3Rvci4KKyAgICAgKiBAcGFyYW0gdHJhbnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBBZmZpbmVUcmFuc2Zvcm0gdG8gYmUgYXNzaWduZWQgdG8gdGhlIHNwZWNpZmllZCBnbHlwaC4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRHbHlwaFRyYW5zZm9ybShpbnQgZ2x5cGhJbmRleCwgCi0gICAgICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnMpOworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEdseXBoVHJhbnNmb3JtKGludCBnbHlwaEluZGV4LCBBZmZpbmVUcmFuc2Zvcm0gdHJhbnMpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgdHJhbnNmb3JtIG9mIHRoZSBzcGVjaWZpZWQgZ2x5cGggaW4gdGhpcyBHbHlwaFZlY3Rvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleCB0aGUgZ2x5cGggaW5kZXggaW4gdGhpcyBHbHlwaFZlY3Rvci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGdseXBoIGluZGV4IGluIHRoaXMgR2x5cGhWZWN0b3IuCiAgICAgICogQHJldHVybiB0aGUgbmV3IHRyYW5zZm9ybSBvZiB0aGUgZ2x5cGguCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEFmZmluZVRyYW5zZm9ybSBnZXRHbHlwaFRyYW5zZm9ybShpbnQgZ2x5cGhJbmRleCk7CkBAIC0xODEsMzQgKzE5MCwzMiBAQAogICAgIC8qKgogICAgICAqIENvbXBhcmVzIHRoaXMgR2x5cGhWZWN0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIEdseXBoVmVjdG9yIG9iamVjdHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGdseXBoVmVjdG9yIHRoZSBHbHlwaFZlY3RvciBvYmplY3QgdG8gYmUgY29tcGFyZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIGdseXBoVmVjdG9yCisgICAgICogICAgICAgICAgICB0aGUgR2x5cGhWZWN0b3Igb2JqZWN0IHRvIGJlIGNvbXBhcmVkLgogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBHbHlwaFZlY3RvciBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIEdseXBoVmVjdG9yCi0gICAgICogb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogICAgICAgICBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlcXVhbHMoR2x5cGhWZWN0b3IgZ2x5cGhWZWN0b3IpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWV0cmljcyBvZiB0aGUgZ2x5cGggd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0gICAgICogaW4gdGhpcyBHbHlwaFZlY3Rvci4KKyAgICAgKiBHZXRzIHRoZSBtZXRyaWNzIG9mIHRoZSBnbHlwaCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggaW4gdGhpcworICAgICAqIEdseXBoVmVjdG9yLgogICAgICAqIAotICAgICAqIEBwYXJhbSBnbHlwaEluZGV4IGluZGV4IGluIHRoaXMgR2x5cGhWZWN0b3IuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0cmljcyBvZiB0aGUgZ2x5cGggd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0gICAgICogaW4gdGhpcyBHbHlwaFZlY3Rvci4KKyAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleAorICAgICAqICAgICAgICAgICAgaW5kZXggaW4gdGhpcyBHbHlwaFZlY3Rvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRyaWNzIG9mIHRoZSBnbHlwaCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggaW4gdGhpcworICAgICAqICAgICAgICAgR2x5cGhWZWN0b3IuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEdseXBoTWV0cmljcyBnZXRHbHlwaE1ldHJpY3MoaW50IGdseXBoSW5kZXgpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUganVzdGlmaWNhdGlvbiBpbmZvcm1hdGlvbiBvZiB0aGUgZ2x5cGggCi0gICAgICogd2hvc2UgaW5kZXggaXMgc3BlY2lmaWVkLgorICAgICAqIEdldHMgdGhlIGp1c3RpZmljYXRpb24gaW5mb3JtYXRpb24gb2YgdGhlIGdseXBoIHdob3NlIGluZGV4IGlzIHNwZWNpZmllZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleCB0aGUgZ2x5cGggaW5kZXguCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgR2x5cGhKdXN0aWZpY2F0aW9uSW5mbyBmb3IgdGhlIHNwZWNpZmllZCBnbHlwaC4gCisgICAgICogQHBhcmFtIGdseXBoSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBnbHlwaCBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoZSBHbHlwaEp1c3RpZmljYXRpb25JbmZvIGZvciB0aGUgc3BlY2lmaWVkIGdseXBoLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBHbHlwaEp1c3RpZmljYXRpb25JbmZvIGdldEdseXBoSnVzdGlmaWNhdGlvbkluZm8oCi0gICAgICAgICAgICBpbnQgZ2x5cGhJbmRleCk7CisgICAgcHVibGljIGFic3RyYWN0IEdseXBoSnVzdGlmaWNhdGlvbkluZm8gZ2V0R2x5cGhKdXN0aWZpY2F0aW9uSW5mbyhpbnQgZ2x5cGhJbmRleCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBGb250UmVuZGVyQ29udGV4dCBvZiB0aGlzIEdseXBoVmVjdG9yLgpAQCAtMjE4LDE4ICsyMjUsMjAgQEAKICAgICBwdWJsaWMgYWJzdHJhY3QgRm9udFJlbmRlckNvbnRleHQgZ2V0Rm9udFJlbmRlckNvbnRleHQoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgYSBTaGFwZSBvYmplY3Qgd2hpY2ggZGVmaW5lcyB0aGUgdmlzdWFsIHJlcHJlc2VudGF0aW9uIAotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgZ2x5cGggaW4gdGhpcyBHbHlwaFZlY3RvciwgdHJhbnNsYXRlZCBhIAotICAgICAqIGRpc3RhbmNlIG9mIHggaW4gdGhlIFggZGlyZWN0aW9uIGFuZCB5IGluIHRoZSBZIGRpcmVjdGlvbi4gCisgICAgICogR2V0cyBhIFNoYXBlIG9iamVjdCB3aGljaCBkZWZpbmVzIHRoZSB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgICAgICogc3BlY2lmaWVkIGdseXBoIGluIHRoaXMgR2x5cGhWZWN0b3IsIHRyYW5zbGF0ZWQgYSBkaXN0YW5jZSBvZiB4IGluIHRoZSBYCisgICAgICogZGlyZWN0aW9uIGFuZCB5IGluIHRoZSBZIGRpcmVjdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleCB0aGUgZ2x5dGggaW5kZXggaW4gdGhpcyBHbHlwaFZlY3Rvci4KLSAgICAgKiBAcGFyYW0geCB0aGUgZGlzdGFuY2UgaW4gdGhlIFggZGlyZWN0aW9uIHRvIHRyYW5zbGF0ZSB0aGUgCi0gICAgICogc2hhcGUgb2JqZWN0IGJlZm9yZSByZXR1cm5pbmcgaXQuCi0gICAgICogQHBhcmFtIHkgdGhlIGRpc3RhbmNlIGluIHRoZSBZIGRpcmVjdGlvbiB0byB0cmFuc2xhdGUgdGhlIAotICAgICAqIHNoYXBlIG9iamVjdCBiZWZvcmUgcmV0dXJuaW5nIGl0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTaGFwZSBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgdmlzdWFsIHJlcHJlc2VudGF0aW9uIAotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgZ2x5cGggaW4gdGhpcyBHbHlwaFZlY3RvciAtIGdseXBoIG91dGxpbmUuIAorICAgICAqIEBwYXJhbSBnbHlwaEluZGV4CisgICAgICogICAgICAgICAgICB0aGUgZ2x5dGggaW5kZXggaW4gdGhpcyBHbHlwaFZlY3Rvci4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIGluIHRoZSBYIGRpcmVjdGlvbiB0byB0cmFuc2xhdGUgdGhlIHNoYXBlIG9iamVjdAorICAgICAqICAgICAgICAgICAgYmVmb3JlIHJldHVybmluZyBpdC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIGluIHRoZSBZIGRpcmVjdGlvbiB0byB0cmFuc2xhdGUgdGhlIHNoYXBlIG9iamVjdAorICAgICAqICAgICAgICAgICAgYmVmb3JlIHJldHVybmluZyBpdC4KKyAgICAgKiBAcmV0dXJuIGEgU2hhcGUgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBnbHlwaCBpbiB0aGlzIEdseXBoVmVjdG9yIC0gZ2x5cGggb3V0bGluZS4KICAgICAgKi8KICAgICBwdWJsaWMgU2hhcGUgZ2V0R2x5cGhPdXRsaW5lKGludCBnbHlwaEluZGV4LCBmbG9hdCB4LCBmbG9hdCB5KSB7CiAgICAgICAgIFNoYXBlIGluaXRpYWxTaGFwZSA9IGdldEdseXBoT3V0bGluZShnbHlwaEluZGV4KTsKQEAgLTI0MCw0MyArMjQ5LDQyIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgdmlzdWFsIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIGdseXBoIGluIHRoZSBHbHlwaFZlY3Rvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleCB0aGUgZ2x5cGggaW5kZXggaW4gdGhpcyBHbHlwaFZlY3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBnbHlwaCB2aXN1YWwgYm91bmRzIG9mIHRoZSBnbHlwaCB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBpbmRleCBpbiB0aGUgR2x5cGhWZWN0b3IuCisgICAgICogQHBhcmFtIGdseXBoSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBnbHlwaCBpbmRleCBpbiB0aGlzIEdseXBoVmVjdG9yLgorICAgICAqIEByZXR1cm4gdGhlIGdseXBoIHZpc3VhbCBib3VuZHMgb2YgdGhlIGdseXBoIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleCBpbgorICAgICAqICAgICAgICAgdGhlIEdseXBoVmVjdG9yLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTaGFwZSBnZXRHbHlwaFZpc3VhbEJvdW5kcyhpbnQgZ2x5cGhJbmRleCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgU2hhcGUgb2JqZWN0IHdoaWNoIGRlZmluZXMgdGhlIHZpc3VhbCByZXByZXNlbnRhdGlvbiAKLSAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIGdseXBoIGluIHRoaXMgR2x5cGhWZWN0b3IuIAotICAgICAqICAKLSAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleCB0aGUgZ2x5dGggaW5kZXggaW4gdGhpcyBHbHlwaFZlY3Rvci4KKyAgICAgKiBHZXRzIGEgU2hhcGUgb2JqZWN0IHdoaWNoIGRlZmluZXMgdGhlIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgZ2x5cGggaW4gdGhpcyBHbHlwaFZlY3Rvci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgU2hhcGUgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIHZpc3VhbCByZXByZXNlbnRhdGlvbiAKLSAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIGdseXBoIGluIHRoaXMgR2x5cGhWZWN0b3IgLSBnbHlwaCBvdXRsaW5lLiAKKyAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGdseXRoIGluZGV4IGluIHRoaXMgR2x5cGhWZWN0b3IuCisgICAgICogQHJldHVybiBhIFNoYXBlIG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgZ2x5cGggaW4gdGhpcyBHbHlwaFZlY3RvciAtIGdseXBoIG91dGxpbmUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNoYXBlIGdldEdseXBoT3V0bGluZShpbnQgZ2x5cGhJbmRleCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb2dpY2FsIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIGdseXBoIGluIAotICAgICAqIHRoZSBHbHlwaFZlY3Rvci4gCisgICAgICogR2V0cyB0aGUgbG9naWNhbCBib3VuZHMgb2YgdGhlIHNwZWNpZmllZCBnbHlwaCBpbiB0aGUgR2x5cGhWZWN0b3IuCiAgICAgICogCi0gICAgICogQHBhcmFtIGdseXBoSW5kZXggdGhlIGluZGV4IGluIHRoaXMgR2x5cGhWZWN0b3Igb2YgdGhlIGdseXBoIGZyb20gd2hpY2ggCi0gICAgICogdG8gcmV0cmlldmUgaXRzIGxvZ2ljYWwgYm91bmRzCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbG9naWNhbCBib3VuZHMgb2YgdGhlIHNwZWNpZmllZCBnbHlwaCBpbiAKLSAgICAgKiB0aGUgR2x5cGhWZWN0b3IuCisgICAgICogQHBhcmFtIGdseXBoSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBpbiB0aGlzIEdseXBoVmVjdG9yIG9mIHRoZSBnbHlwaCBmcm9tIHdoaWNoIHRvCisgICAgICogICAgICAgICAgICByZXRyaWV2ZSBpdHMgbG9naWNhbCBib3VuZHMKKyAgICAgKiBAcmV0dXJuIHRoZSBsb2dpY2FsIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIGdseXBoIGluIHRoZSBHbHlwaFZlY3Rvci4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU2hhcGUgZ2V0R2x5cGhMb2dpY2FsQm91bmRzKGludCBnbHlwaEluZGV4KTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEdseXBoVmVjdG9yIHJlbmRlcmVkIGluCi0gICAgICogeCwgeSBsb2NhdGlvbiBhcyBhIFNoYXBlIG9iamVjdC4KKyAgICAgKiBHZXRzIHRoZSB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBHbHlwaFZlY3RvciByZW5kZXJlZCBpbiB4LCB5CisgICAgICogbG9jYXRpb24gYXMgYSBTaGFwZSBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgR2x5cGhWZWN0b3IuCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgR2x5cGhWZWN0b3IuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIEdseXBoVmVjdG9yLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBHbHlwaFZlY3Rvci4KICAgICAgKiBAcmV0dXJuIHRoZSB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBHbHlwaFZlY3RvciBhcyBhIFNoYXBlIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU2hhcGUgZ2V0T3V0bGluZShmbG9hdCB4LCBmbG9hdCB5KTsKQEAgLTI5OCw3NyArMzA2LDc5IEBACiAgICAgLyoqCiAgICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgZ2x5cGggY29kZXMgb2YgdGhlIHNwZWNpZmllZCBnbHlwaHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJlZ2luR2x5cGhJbmRleCB0aGUgaW5kZXggaW50byB0aGlzIEdseXBoVmVjdG9yIGF0IHdoaWNoIAotICAgICAqIHRvIHN0YXJ0IHJldHJpZXZpbmcgZ2x5cGggY29kZXMuCi0gICAgICogQHBhcmFtIG51bUVudHJpZXMgdGhlIG51bWJlciBvZiBnbHlwaCBjb2Rlcy4KLSAgICAgKiBAcGFyYW0gY29kZVJldHVybiB0aGUgYXJyYXkgaW50byB3aGljaCB0aGUgcmVzdWx0aW5nIAotICAgICAqIGdseXBoY29kZXMgd2lsbCBiZSB3cml0dGVuLgotICAgICAqIAorICAgICAqIEBwYXJhbSBiZWdpbkdseXBoSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBpbnRvIHRoaXMgR2x5cGhWZWN0b3IgYXQgd2hpY2ggdG8gc3RhcnQgcmV0cmlldmluZworICAgICAqICAgICAgICAgICAgZ2x5cGggY29kZXMuCisgICAgICogQHBhcmFtIG51bUVudHJpZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZ2x5cGggY29kZXMuCisgICAgICogQHBhcmFtIGNvZGVSZXR1cm4KKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBpbnRvIHdoaWNoIHRoZSByZXN1bHRpbmcgZ2x5cGhjb2RlcyB3aWxsIGJlIHdyaXR0ZW4uCiAgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgdGhlIGdseXBoIGNvZGVzLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnRbXSBnZXRHbHlwaENvZGVzKGludCBiZWdpbkdseXBoSW5kZXgsIGludCBudW1FbnRyaWVzLCAKLSAgICAgICAgICAgIGludFtdIGNvZGVSZXR1cm4pOworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnRbXSBnZXRHbHlwaENvZGVzKGludCBiZWdpbkdseXBoSW5kZXgsIGludCBudW1FbnRyaWVzLCBpbnRbXSBjb2RlUmV0dXJuKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdGhlIGNoYXJhY3RlciBpbmRpY2VzIG9mIAotICAgICAqIHRoZSBzcGVjaWZpZWQgZ2x5cGhzLgorICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdGhlIGNoYXJhY3RlciBpbmRpY2VzIG9mIHRoZSBzcGVjaWZpZWQgZ2x5cGhzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBiZWdpbkdseXBoSW5kZXggdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBnbHlwaCB0byByZXR1cm4gaW5mb3JtYXRpb24gZm9yLgotICAgICAqIEBwYXJhbSBudW1FbnRyaWVzIHRoZSBudW1iZXIgb2YgZ2x5cGggaW5kaWNlcyB0byByZXR1cm4uCi0gICAgICogQHBhcmFtIGNvZGVSZXR1cm4gdGhlIGFycmF5IGludG8gd2hpY2ggdGhlIHJlc3VsdGluZyBjaGFyYWN0ZXIgCi0gICAgICogaW5kaWNlcyB3aWxsIGJlIHdyaXR0ZW4uCi0gICAgICogCisgICAgICogQHBhcmFtIGJlZ2luR2x5cGhJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBnbHlwaCB0byByZXR1cm4gaW5mb3JtYXRpb24gZm9yLgorICAgICAqIEBwYXJhbSBudW1FbnRyaWVzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGdseXBoIGluZGljZXMgdG8gcmV0dXJuLgorICAgICAqIEBwYXJhbSBjb2RlUmV0dXJuCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgaW50byB3aGljaCB0aGUgcmVzdWx0aW5nIGNoYXJhY3RlciBpbmRpY2VzIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgIHdyaXR0ZW4uCiAgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBjaGFyYWN0ZXIgaW5kaWNlcyBmb3IgdGhlIHNwZWNpZmllcyBnbHlwaHMuCiAgICAgICovCi0gICAgcHVibGljIGludFtdIGdldEdseXBoQ2hhckluZGljZXMoaW50IGJlZ2luR2x5cGhJbmRleCwgaW50IG51bUVudHJpZXMsIAotICAgICAgICAgICAgaW50W10gY29kZVJldHVybikgeworICAgIHB1YmxpYyBpbnRbXSBnZXRHbHlwaENoYXJJbmRpY2VzKGludCBiZWdpbkdseXBoSW5kZXgsIGludCBudW1FbnRyaWVzLCBpbnRbXSBjb2RlUmV0dXJuKSB7CiAgICAgICAgIGlmIChjb2RlUmV0dXJuID09IG51bGwpIHsKICAgICAgICAgICAgIGNvZGVSZXR1cm4gPSBuZXcgaW50W251bUVudHJpZXNdOwogICAgICAgICB9CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspewotICAgICAgICAgICAgY29kZVJldHVybltpXSA9IGdldEdseXBoQ2hhckluZGV4KGkrYmVnaW5HbHlwaEluZGV4KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHsKKyAgICAgICAgICAgIGNvZGVSZXR1cm5baV0gPSBnZXRHbHlwaENoYXJJbmRleChpICsgYmVnaW5HbHlwaEluZGV4KTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gY29kZVJldHVybjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHRoZSBwb3NpdGlvbnMgb2YgdGhlIHNwZWNpZmllZCBnbHlwaHMgaW4gCi0gICAgICogdGhpcyBHbHlwaFZlY3Rvci4KKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHRoZSBwb3NpdGlvbnMgb2YgdGhlIHNwZWNpZmllZCBnbHlwaHMgaW4gdGhpcworICAgICAqIEdseXBoVmVjdG9yLgogICAgICAqIAotICAgICAqIEBwYXJhbSBiZWdpbkdseXBoSW5kZXggdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBnbHlwaCB0byByZXR1cm4gaW5mb3JtYXRpb24gZm9yLgotICAgICAqIEBwYXJhbSBudW1FbnRyaWVzIHRoZSBudW1iZXIgb2YgZ2x5cGhzIHRvIHJldHVybiBpbmZvcm1hdGlvbiBmb3IuCi0gICAgICogQHBhcmFtIHBvc2l0aW9uUmV0dXJuIHRoZSBhcnJheSB3aGVyZSB0aGUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkLiAKLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYmVnaW5HbHlwaEluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGdseXBoIHRvIHJldHVybiBpbmZvcm1hdGlvbiBmb3IuCisgICAgICogQHBhcmFtIG51bUVudHJpZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZ2x5cGhzIHRvIHJldHVybiBpbmZvcm1hdGlvbiBmb3IuCisgICAgICogQHBhcmFtIHBvc2l0aW9uUmV0dXJuCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgd2hlcmUgdGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZC4KICAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGdseXBoIHBvc2l0aW9ucy4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgZmxvYXRbXSBnZXRHbHlwaFBvc2l0aW9ucyhpbnQgYmVnaW5HbHlwaEluZGV4LCAKLSAgICAgICAgICAgIGludCBudW1FbnRyaWVzLCBmbG9hdFtdIHBvc2l0aW9uUmV0dXJuKTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgZmxvYXRbXSBnZXRHbHlwaFBvc2l0aW9ucyhpbnQgYmVnaW5HbHlwaEluZGV4LCBpbnQgbnVtRW50cmllcywKKyAgICAgICAgICAgIGZsb2F0W10gcG9zaXRpb25SZXR1cm4pOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZ2x5cGggY29kZSBvZiB0aGUgc3BlY2lmaWVkIGdseXBoLgogICAgICAqIAotICAgICAqIEBwYXJhbSBnbHlwaEluZGV4IHRoZSBpbmRleCBpbiB0aGlzIEdseXBoVmVjdG9yIHdoaWNoIGNvcnJlc3BvbmRzIAotICAgICAqIHRvIHRoZSBnbHlwaCBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBnbHlwaGNvZGUuCi0gICAgICogCisgICAgICogQHBhcmFtIGdseXBoSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBpbiB0aGlzIEdseXBoVmVjdG9yIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBnbHlwaAorICAgICAqICAgICAgICAgICAgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgZ2x5cGhjb2RlLgogICAgICAqIEByZXR1cm4gdGhlIGdseXBoY29kZSBvZiB0aGUgc3BlY2lmaWVkIGdseXBoLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0R2x5cGhDb2RlKGludCBnbHlwaEluZGV4KTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZpcnN0IGxvZ2ljYWwgY2hhcmFjdGVyJ3MgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBnbHlwaC4gCi0gICAgICogIAotICAgICAqIEBwYXJhbSBnbHlwaEluZGV4IHRoZSBnbHlwaCBpbmRleC4KKyAgICAgKiBHZXRzIHRoZSBmaXJzdCBsb2dpY2FsIGNoYXJhY3RlcidzIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgZ2x5cGguCiAgICAgICogCisgICAgICogQHBhcmFtIGdseXBoSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBnbHlwaCBpbmRleC4KICAgICAgKiBAcmV0dXJuIHRoZSB0aGUgZmlyc3QgbG9naWNhbCBjaGFyYWN0ZXIncyBpbmRleC4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEdseXBoQ2hhckluZGV4KGludCBnbHlwaEluZGV4KXsKKyAgICBwdWJsaWMgaW50IGdldEdseXBoQ2hhckluZGV4KGludCBnbHlwaEluZGV4KSB7CiAgICAgICAgIC8vIGRlZmF1bHQgaW1wbGVtZXRhdGlvbiBvbmUtdG8tb25lCiAgICAgICAgIHJldHVybiBnbHlwaEluZGV4OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgZGVmYXVsdCBsYXlvdXQgdG8gdGhpcyBHbHlwaFZlY3Rvci4gCisgICAgICogU2V0cyBkZWZhdWx0IGxheW91dCB0byB0aGlzIEdseXBoVmVjdG9yLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHBlcmZvcm1EZWZhdWx0TGF5b3V0KCk7CiAKQEAgLTM4MCwxNSArMzkwLDE0IEBACiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXROdW1HbHlwaHMoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgZmxhZ3Mgd2hpY2ggZGVzY3JpYmUgdGhlIGdsb2JhbCBzdGF0ZSBvZiB0aGUgR2x5cGhWZWN0b3IuIAotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgMC4KKyAgICAgKiBHZXRzIGZsYWdzIHdoaWNoIGRlc2NyaWJlIHRoZSBnbG9iYWwgc3RhdGUgb2YgdGhlIEdseXBoVmVjdG9yLiBUaGUKKyAgICAgKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgMC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBsYXlvdXQgZmxhZ3MKICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldExheW91dEZsYWdzKCl7CisgICAgcHVibGljIGludCBnZXRMYXlvdXRGbGFncygpIHsKICAgICAgICAgLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAtIHJldHVybmVkIHZhbHVlIGlzIDAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9mb250L0dyYXBoaWNBdHRyaWJ1dGUuamF2YSBiL2F3dC9qYXZhL2F3dC9mb250L0dyYXBoaWNBdHRyaWJ1dGUuamF2YQppbmRleCAyZjQxOTUxLi44NDgwZTBmIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZm9udC9HcmFwaGljQXR0cmlidXRlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ZvbnQvR3JhcGhpY0F0dHJpYnV0ZS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIElseWEgUy4gT2tvbWluCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5mb250OwogCiBpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKQEAgLTI2LDQ5ICsyNyw1NCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBHcmFwaGljQXR0cmlidXRlIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IHRvCi0gKiBpbnNlcnQgZ3JhcGhpY2FsIGVsZW1lbnRzIGluIHByaW50ZWQgdGV4dC4gICAKKyAqIFRoZSBHcmFwaGljQXR0cmlidXRlIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IHRvIGluc2VydAorICogZ3JhcGhpY2FsIGVsZW1lbnRzIGluIHByaW50ZWQgdGV4dC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcmFwaGljQXR0cmlidXRlIHsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVE9QX0FMSUdOTUVOVCBpbmRpY2F0ZXMgdXNpbmcgdGhlIHRvcCBsaW5lIHRvIAotICAgICAqIGNhbGN1bGF0ZSBwbGFjZW1lbnQgb2YgZ3JhcGhpY3MuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRPUF9BTElHTk1FTlQgaW5kaWNhdGVzIHVzaW5nIHRoZSB0b3AgbGluZSB0byBjYWxjdWxhdGUKKyAgICAgKiBwbGFjZW1lbnQgb2YgZ3JhcGhpY3MuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QX0FMSUdOTUVOVCA9IC0xOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBCT1RUT01fQUxJR05NRU5UIGluZGljYXRlcyB1c2luZyB0aGUgYm90dG9tIGxpbmUgdG8gCi0gICAgICogY2FsY3VsYXRlIHBsYWNlbWVudCBvZiBncmFwaGljcy4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEJPVFRPTV9BTElHTk1FTlQgaW5kaWNhdGVzIHVzaW5nIHRoZSBib3R0b20gbGluZSB0bworICAgICAqIGNhbGN1bGF0ZSBwbGFjZW1lbnQgb2YgZ3JhcGhpY3MuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9UVE9NX0FMSUdOTUVOVCA9IC0yOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBST01BTl9CQVNFTElORSBpbmRpY2F0ZXMgdGhlIHBsYWNlbWVudCBvZiB0aGUgcm9tYW4gCi0gICAgICogYmFzZWxpbmUgd2l0aCByZXNwZWN0IHRvIHRoZSBncmFwaGljcyBvcmlnaW4uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFJPTUFOX0JBU0VMSU5FIGluZGljYXRlcyB0aGUgcGxhY2VtZW50IG9mIHRoZSByb21hbiBiYXNlbGluZQorICAgICAqIHdpdGggcmVzcGVjdCB0byB0aGUgZ3JhcGhpY3Mgb3JpZ2luLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPTUFOX0JBU0VMSU5FID0gMDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgQ0VOVEVSX0JBU0VMSU5FIGluZGljYXRlcyB0aGUgcGxhY2VtZW50IG9mIHRoZSBjZW50ZXIgCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENFTlRFUl9CQVNFTElORSBpbmRpY2F0ZXMgdGhlIHBsYWNlbWVudCBvZiB0aGUgY2VudGVyCiAgICAgICogYmFzZWxpbmUgd2l0aCByZXNwZWN0IHRvIHRoZSBncmFwaGljcyBvcmlnaW4uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VOVEVSX0JBU0VMSU5FID0gMTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgSEFOR0lOR19CQVNFTElORSBpbmRpY2F0ZXMgdGhlIHBsYWNlbWVudCBvZiB0aGUgaGFuZ2luZyAKLSAgICAgKiBiYXNlbGluZSB3aXRoIHJlc3BlY3QgdG8gdGhlIGdyYXBoaWNzIG9yaWdpbi4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEhBTkdJTkdfQkFTRUxJTkUgaW5kaWNhdGVzIHRoZSBwbGFjZW1lbnQgb2YgdGhlIGhhbmdpbmcKKyAgICAgKiBiYXNlbGluZSB3aXRoIHJlc3BlY3QgdG8gdGhlIGdyYXBoaWNzIG9yaWdpbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIQU5HSU5HX0JBU0VMSU5FID0gMjsKIAogICAgIC8vIHRoZSBhbGlnbm1lbnQgb2YgdGhpcyBHcmFwaGljQXR0cmlidXRlCi0gICAgLyoqIFRoZSBhbGlnbm1lbnQuICovCisgICAgLyoqCisgICAgICogVGhlIGFsaWdubWVudC4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBhbGlnbm1lbnQ7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZ3JhcGhpYyBhdHRyaWJ1dGUgd2l0aCB0aGUgc3BlY2lmaWVkIGFsaWdubWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWxpZ24gdGhlIHNwZWNpZmllZCBhbGlnbm1lbnQuCisgICAgICogQHBhcmFtIGFsaWduCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGFsaWdubWVudC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgR3JhcGhpY0F0dHJpYnV0ZShpbnQgYWxpZ24pIHsKICAgICAgICAgaWYgKChhbGlnbiA8IEJPVFRPTV9BTElHTk1FTlQpIHx8IChhbGlnbiA+IEhBTkdJTkdfQkFTRUxJTkUpKSB7CkBAIC04MSwxNiArODcsMTkgQEAKICAgICAvKioKICAgICAgKiBEcmF3cyB0aGUgR3JhcGhpY0F0dHJpYnV0ZSBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBncmFwaGljcyB0aGUgR3JhcGhpY3MuCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiBHcmFwaGljQXR0cmlidXRlIGxvY2F0aW9uLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgR3JhcGhpY0F0dHJpYnV0ZSBsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gZ3JhcGhpY3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBHcmFwaGljcy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiBHcmFwaGljQXR0cmlidXRlIGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIEdyYXBoaWNBdHRyaWJ1dGUgbG9jYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZHJhdyhHcmFwaGljczJEIGdyYXBoaWNzLCBmbG9hdCB4LCBmbG9hdCB5KTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIEdyYXBoaWNBdHRyaWJ1dGUncyBhZHZhbmNlLiBJdCdzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBwb2ludCAKLSAgICAgKiBhdCB3aGljaCB0aGUgZ3JhcGhpYyBpcyByZW5kZXJlZCBhbmQgdGhlIHBvaW50IHdoZXJlIHRoZSBuZXh0IGNoYXJhY3RlciAKLSAgICAgKiBvciBncmFwaGljIGlzIHJlbmRlcmVkLgorICAgICAqIEdldHMgdGhlIEdyYXBoaWNBdHRyaWJ1dGUncyBhZHZhbmNlLiBJdCdzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBwb2ludCBhdAorICAgICAqIHdoaWNoIHRoZSBncmFwaGljIGlzIHJlbmRlcmVkIGFuZCB0aGUgcG9pbnQgd2hlcmUgdGhlIG5leHQgY2hhcmFjdGVyIG9yCisgICAgICogZ3JhcGhpYyBpcyByZW5kZXJlZC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBHcmFwaGljQXR0cmlidXRlJ3MgYWR2YW5jZS4KICAgICAgKi8KQEAgLTEzOSw1OCArMTQ4LDMyIEBACiAgICAgICogQHJldHVybiB0aGUgR2x5cGhKdXN0aWZpY2F0aW9uSW5mbyBvZiB0aGlzIEdyYXBoaWNBdHRyaWJ1dGUuCiAgICAgICovCiAgICAgcHVibGljIEdseXBoSnVzdGlmaWNhdGlvbkluZm8gZ2V0SnVzdGlmaWNhdGlvbkluZm8oKSB7Ci0gICAgICAgIAotICAgICAgICAvKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uLgotICAgICAgICAgKiBTaW5jZSBkb2N1bWVudGF0aW9uIGRvZXNuJ3QgZGVzY3JpYmUgZGVmYXVsdCB2YWx1ZXMsCi0gICAgICAgICAqIHRoZXkgd2VyZSBjYWxjdWxhdGVkIGJhc2VkIG9uIDEuNSByZWxlYXNlIAotICAgICAgICAgKiBiZWhhdmlvciBhbmQgY2FuIGJlIG9idGFpbmVkIHVzaW5nIG5leHQgdGVzdCBzYW1wbGU6Ci0gICAgICAgICAqIAotICAgICAgICAgKiAgICAvLyBDcmVhdGUgR3JhcGhpY0F0dHJpYnV0ZSBjbGFzcyBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgKiAgICBwdWJsaWMgY2xhc3MgTXlHcmFwaGljQXR0cmlidXRlIGV4dGVuZHMgR3JhcGhpY0F0dHJpYnV0ZSB7Ci0gICAgICAgICAqICAgICAgICBwcm90ZWN0ZWQgTXlHcmFwaGljQXR0cmlidXRlKGludCBhbGlnbikgewotICAgICAgICAgKiAgICAgICAgICAgIHN1cGVyKGFsaWduKTsKLSAgICAgICAgICogICAgICAgIH0KLSAgICAgICAgICoKLSAgICAgICAgICogICAgICAgIHB1YmxpYyBmbG9hdCBnZXREZXNjZW50KCkgewotICAgICAgICAgKiAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAqICAgICAgICB9Ci0gICAgICAgICAqCi0gICAgICAgICAqICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0QWR2YW5jZSgpIHsKLSAgICAgICAgICogICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgKiAgICAgICAgfQotICAgICAgICAgKgotICAgICAgICAgKiAgICAgICAgcHVibGljIHZvaWQgZHJhdyhHcmFwaGljczJEIGcyLCBmbG9hdCB4LCBmbG9hdCB5KSB7Ci0gICAgICAgICAqICAgICAgICB9Ci0gICAgICAgICAqCi0gICAgICAgICAqICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0QXNjZW50KCkgewotICAgICAgICAgKiAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgKiAgICAgICAgfQotICAgICAgICAgKiAgICB9Ci0gICAgICAgICAqCi0gICAgICAgICAqICAgIE15R3JhcGhpY0F0dHJpYnV0ZSBteUdBID0gZ2F0Lm5ldyBNeUdyYXBoaWNBdHRyaWJ1dGUoMCk7Ci0gICAgICAgICAqICAgIC8vIHByaW50IGp1c3RpZmljYXRpb24gcGFyYW1ldGVycwotICAgICAgICAgKiAgICBTeXN0ZW0ub3V0LnByaW50bG4obXlHQS5nZXRKdXN0aWZpY2F0aW9uSW5mbygpLmdyb3dBYnNvcmIpOwotICAgICAgICAgKiAgICBTeXN0ZW0ub3V0LnByaW50bG4obXlHQS5nZXRKdXN0aWZpY2F0aW9uSW5mbygpLnNocmlua0Fic29yYik7Ci0gICAgICAgICAqICAgIFN5c3RlbS5vdXQucHJpbnRsbihteUdBLmdldEp1c3RpZmljYXRpb25JbmZvKCkuZ3Jvd0xlZnRMaW1pdCk7Ci0gICAgICAgICAqICAgIFN5c3RlbS5vdXQucHJpbnRsbihteUdBLmdldEp1c3RpZmljYXRpb25JbmZvKCkuZ3Jvd1ByaW9yaXR5KTsKLSAgICAgICAgICogICAgU3lzdGVtLm91dC5wcmludGxuKG15R0EuZ2V0SnVzdGlmaWNhdGlvbkluZm8oKS5ncm93UmlnaHRMaW1pdCk7Ci0gICAgICAgICAqICAgIFN5c3RlbS5vdXQucHJpbnRsbihteUdBLmdldEp1c3RpZmljYXRpb25JbmZvKCkuc2hyaW5rTGVmdExpbWl0KTsKLSAgICAgICAgICogICAgU3lzdGVtLm91dC5wcmludGxuKG15R0EuZ2V0SnVzdGlmaWNhdGlvbkluZm8oKS5zaHJpbmtQcmlvcml0eSk7Ci0gICAgICAgICAqICAgIFN5c3RlbS5vdXQucHJpbnRsbihteUdBLmdldEp1c3RpZmljYXRpb25JbmZvKCkuc2hyaW5rUmlnaHRMaW1pdCk7Ci0gICAgICAgICAqICAgIFN5c3RlbS5vdXQucHJpbnRsbihteUdBLmdldEp1c3RpZmljYXRpb25JbmZvKCkud2VpZ2h0KTsKKworICAgICAgICAvKgorICAgICAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uLiBTaW5jZSBkb2N1bWVudGF0aW9uIGRvZXNuJ3QgZGVzY3JpYmUgZGVmYXVsdAorICAgICAgICAgKiB2YWx1ZXMsIHRoZXkgd2VyZSBjYWxjdWxhdGVkIGJhc2VkIG9uIDEuNSByZWxlYXNlIGJlaGF2aW9yIGFuZCBjYW4gYmUKKyAgICAgICAgICogb2J0YWluZWQgdXNpbmcgbmV4dCB0ZXN0IHNhbXBsZTogLy8gQ3JlYXRlIEdyYXBoaWNBdHRyaWJ1dGUgY2xhc3MKKyAgICAgICAgICogaW1wbGVtZW50YXRpb24gcHVibGljIGNsYXNzIE15R3JhcGhpY0F0dHJpYnV0ZSBleHRlbmRzCisgICAgICAgICAqIEdyYXBoaWNBdHRyaWJ1dGUgeyBwcm90ZWN0ZWQgTXlHcmFwaGljQXR0cmlidXRlKGludCBhbGlnbikgeworICAgICAgICAgKiBzdXBlcihhbGlnbik7IH0gcHVibGljIGZsb2F0IGdldERlc2NlbnQoKSB7IHJldHVybiAwOyB9IHB1YmxpYyBmbG9hdAorICAgICAgICAgKiBnZXRBZHZhbmNlKCkgeyByZXR1cm4gMTsgfSBwdWJsaWMgdm9pZCBkcmF3KEdyYXBoaWNzMkQgZzIsIGZsb2F0IHgsCisgICAgICAgICAqIGZsb2F0IHkpIHsgfSBwdWJsaWMgZmxvYXQgZ2V0QXNjZW50KCkgeyByZXR1cm4gMDsgfSB9CisgICAgICAgICAqIE15R3JhcGhpY0F0dHJpYnV0ZSBteUdBID0gZ2F0Lm5ldyBNeUdyYXBoaWNBdHRyaWJ1dGUoMCk7IC8vIHByaW50CisgICAgICAgICAqIGp1c3RpZmljYXRpb24gcGFyYW1ldGVycworICAgICAgICAgKiBTeXN0ZW0ub3V0LnByaW50bG4obXlHQS5nZXRKdXN0aWZpY2F0aW9uSW5mbygpLmdyb3dBYnNvcmIpOworICAgICAgICAgKiBTeXN0ZW0ub3V0LnByaW50bG4obXlHQS5nZXRKdXN0aWZpY2F0aW9uSW5mbygpLnNocmlua0Fic29yYik7CisgICAgICAgICAqIFN5c3RlbS5vdXQucHJpbnRsbihteUdBLmdldEp1c3RpZmljYXRpb25JbmZvKCkuZ3Jvd0xlZnRMaW1pdCk7CisgICAgICAgICAqIFN5c3RlbS5vdXQucHJpbnRsbihteUdBLmdldEp1c3RpZmljYXRpb25JbmZvKCkuZ3Jvd1ByaW9yaXR5KTsKKyAgICAgICAgICogU3lzdGVtLm91dC5wcmludGxuKG15R0EuZ2V0SnVzdGlmaWNhdGlvbkluZm8oKS5ncm93UmlnaHRMaW1pdCk7CisgICAgICAgICAqIFN5c3RlbS5vdXQucHJpbnRsbihteUdBLmdldEp1c3RpZmljYXRpb25JbmZvKCkuc2hyaW5rTGVmdExpbWl0KTsKKyAgICAgICAgICogU3lzdGVtLm91dC5wcmludGxuKG15R0EuZ2V0SnVzdGlmaWNhdGlvbkluZm8oKS5zaHJpbmtQcmlvcml0eSk7CisgICAgICAgICAqIFN5c3RlbS5vdXQucHJpbnRsbihteUdBLmdldEp1c3RpZmljYXRpb25JbmZvKCkuc2hyaW5rUmlnaHRMaW1pdCk7CisgICAgICAgICAqIFN5c3RlbS5vdXQucHJpbnRsbihteUdBLmdldEp1c3RpZmljYXRpb25JbmZvKCkud2VpZ2h0KTsKICAgICAgICAgICovCiAgICAgICAgIGZsb2F0IGFkdmFuY2UgPSBnZXRBZHZhbmNlKCk7Ci0gICAgICAgIHJldHVybiBuZXcgR2x5cGhKdXN0aWZpY2F0aW9uSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdseXBoSnVzdGlmaWNhdGlvbkluZm8uUFJJT1JJVFlfSU5URVJDSEFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSAvIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlIC8gMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2x5cGhKdXN0aWZpY2F0aW9uSW5mby5QUklPUklUWV9XSElURVNQQUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICByZXR1cm4gbmV3IEdseXBoSnVzdGlmaWNhdGlvbkluZm8oYWR2YW5jZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgR2x5cGhKdXN0aWZpY2F0aW9uSW5mby5QUklPUklUWV9JTlRFUkNIQVIsIGFkdmFuY2UgLyAzLCBhZHZhbmNlIC8gMywgZmFsc2UsCisgICAgICAgICAgICAgICAgR2x5cGhKdXN0aWZpY2F0aW9uSW5mby5QUklPUklUWV9XSElURVNQQUNFLCAwLCAwKTsKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ZvbnQvSW1hZ2VHcmFwaGljQXR0cmlidXRlLmphdmEgYi9hd3QvamF2YS9hd3QvZm9udC9JbWFnZUdyYXBoaWNBdHRyaWJ1dGUuamF2YQppbmRleCA0MWY5MGI4Li5kNmQ0NzU4IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZm9udC9JbWFnZUdyYXBoaWNBdHRyaWJ1dGUuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZm9udC9JbWFnZUdyYXBoaWNBdHRyaWJ1dGUuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJbHlhIFMuIE9rb21pbgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZm9udDsKIAogaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7CkBAIC0yNyw0NCArMjgsNTcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubWlzYy5IYXNoQ29kZTsKIAogLyoqCi0gKiBUaGUgSW1hZ2VHcmFwaGljQXR0cmlidXRlIGNsYXNzIHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IHRvIGluc2VydCAKLSAqIGltYWdlcyB0byBhIHRleHQuCisgKiBUaGUgSW1hZ2VHcmFwaGljQXR0cmlidXRlIGNsYXNzIHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IHRvIGluc2VydCBpbWFnZXMgdG8gYQorICogdGV4dC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUgZXh0ZW5kcyBHcmFwaGljQXR0cmlidXRlIHsKIAogICAgIC8vIEltYWdlIG9iamVjdCByZW5kZXJlZCBieSB0aGlzIEltYWdlR3JhcGhpY0F0dHJpYnV0ZQotICAgIC8qKiBUaGUgaW1hZ2UuICovCisgICAgLyoqCisgICAgICogVGhlIGltYWdlLgorICAgICAqLwogICAgIHByaXZhdGUgSW1hZ2UgZkltYWdlOwogCiAgICAgLy8gWCBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4gcG9pbnQKLSAgICAvKiogVGhlIG9yaWdpbiB4LiAqLworICAgIC8qKgorICAgICAqIFRoZSBvcmlnaW4geC4KKyAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0IGZPcmlnaW5YOwogCiAgICAgLy8gWSBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4gcG9pbnQKLSAgICAvKiogVGhlIG9yaWdpbiB5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBvcmlnaW4geS4KKyAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0IGZPcmlnaW5ZOwogCiAgICAgLy8gdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBvYmplY3QKLSAgICAvKiogVGhlIGltZyB3aWR0aC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaW1nIHdpZHRoLgorICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgZkltZ1dpZHRoOwogCiAgICAgLy8gdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2Ugb2JqZWN0Ci0gICAgLyoqIFRoZSBpbWcgaGVpZ2h0LiAqLworICAgIC8qKgorICAgICAqIFRoZSBpbWcgaGVpZ2h0LgorICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgZkltZ0hlaWdodDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUgd2l0aCB0aGUgc3BlY2lmaWVkIGltYWdlLAogICAgICAqIGFsaWdubWVudCBhbmQgb3JpZ2lucy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2UgdGhlIEltYWdlIHRvIGJlIHJlbmRlcmVkIGJ5IEltYWdlR3JhcGhpY0F0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gYWxpZ25tZW50IHRoZSBhbGlnbm1lbnQgb2YgdGhlIEltYWdlR3JhcGhpY0F0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gb3JpZ2luWCB0aGUgb3JpZ2luIFggY29vcmRpbmF0ZSBpbiB0aGUgaW1hZ2Ugb2YKLSAgICAgKiBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUuICAKLSAgICAgKiBAcGFyYW0gb3JpZ2luWSB0aGUgb3JpZ2luIFkgY29vcmRpbmF0ZSBpbiB0aGUgaW1hZ2Ugb2YKLSAgICAgKiBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUuICAKKyAgICAgKiBAcGFyYW0gaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZSB0byBiZSByZW5kZXJlZCBieSBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGFsaWdubWVudAorICAgICAqICAgICAgICAgICAgdGhlIGFsaWdubWVudCBvZiB0aGUgSW1hZ2VHcmFwaGljQXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBvcmlnaW5YCisgICAgICogICAgICAgICAgICB0aGUgb3JpZ2luIFggY29vcmRpbmF0ZSBpbiB0aGUgaW1hZ2Ugb2YgSW1hZ2VHcmFwaGljQXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBvcmlnaW5ZCisgICAgICogICAgICAgICAgICB0aGUgb3JpZ2luIFkgY29vcmRpbmF0ZSBpbiB0aGUgaW1hZ2Ugb2YgSW1hZ2VHcmFwaGljQXR0cmlidXRlLgogICAgICAqLwotICAgIHB1YmxpYyBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUoSW1hZ2UgaW1hZ2UsIGludCBhbGlnbm1lbnQsIGZsb2F0IG9yaWdpblgsIAotICAgICAgICAgICAgZmxvYXQgb3JpZ2luWSkgeworICAgIHB1YmxpYyBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUoSW1hZ2UgaW1hZ2UsIGludCBhbGlnbm1lbnQsIGZsb2F0IG9yaWdpblgsIGZsb2F0IG9yaWdpblkpIHsKICAgICAgICAgc3VwZXIoYWxpZ25tZW50KTsKIAogICAgICAgICB0aGlzLmZJbWFnZSA9IGltYWdlOwpAQCAtODAsOCArOTQsMTAgQEAKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2VHcmFwaGljQXR0cmlidXRlIHdpdGggdGhlIHNwZWNpZmllZCBpbWFnZSBhbmQKICAgICAgKiBhbGlnbm1lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlIHRoZSBJbWFnZSB0byBiZSByZW5kZXJlZCBieSBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIGFsaWdubWVudCB0aGUgYWxpZ25tZW50IG9mIHRoZSBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGltYWdlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2UgdG8gYmUgcmVuZGVyZWQgYnkgSW1hZ2VHcmFwaGljQXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBhbGlnbm1lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGlnbm1lbnQgb2YgdGhlIEltYWdlR3JhcGhpY0F0dHJpYnV0ZS4KICAgICAgKi8KICAgICBwdWJsaWMgSW1hZ2VHcmFwaGljQXR0cmlidXRlKEltYWdlIGltYWdlLCBpbnQgYWxpZ25tZW50KSB7CiAgICAgICAgIHRoaXMoaW1hZ2UsIGFsaWdubWVudCwgMCwgMCk7CkBAIC0xMDUsMTAgKzEyMSwxMCBAQAogICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgSW1hZ2VHcmFwaGljQXR0cmlidXRlIG9iamVjdCB3aXRoIHRoaXMKICAgICAgKiBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpZ2EgdGhlIEltYWdlR3JhcGhpY0F0dHJpYnV0ZSBvYmplY3QgdG8gYmUgY29tcGFyZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIGlnYQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlR3JhcGhpY0F0dHJpYnV0ZSBvYmplY3QgdG8gYmUgY29tcGFyZWQuCiAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIEltYWdlR3JhcGhpY0F0dHJpYnV0ZSBvYmplY3QgaXMgZXF1YWwgdG8KLSAgICAgKiB0aGlzIEltYWdlR3JhcGhpY0F0dHJpYnV0ZSBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAgICAgICAgIHRoaXMgSW1hZ2VHcmFwaGljQXR0cmlidXRlIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhJbWFnZUdyYXBoaWNBdHRyaWJ1dGUgaWdhKSB7CiAgICAgICAgIGlmIChpZ2EgPT0gbnVsbCkgewpAQCAtMTE5LDI2ICsxMzUsMjMgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIChmT3JpZ2luWCA9PSBpZ2EuZk9yaWdpblggJiYKLSAgICAgICAgICAgICAgICBmT3JpZ2luWSA9PSBpZ2EuZk9yaWdpblkgJiYKLSAgICAgICAgICAgICAgICBnZXRBbGlnbm1lbnQoKSA9PSBpZ2EuZ2V0QWxpZ25tZW50KCkgJiYKLSAgICAgICAgICAgICAgICBmSW1hZ2UuZXF1YWxzKGlnYS5mSW1hZ2UpKTsKKyAgICAgICAgcmV0dXJuIChmT3JpZ2luWCA9PSBpZ2EuZk9yaWdpblggJiYgZk9yaWdpblkgPT0gaWdhLmZPcmlnaW5ZCisgICAgICAgICAgICAgICAgJiYgZ2V0QWxpZ25tZW50KCkgPT0gaWdhLmdldEFsaWdubWVudCgpICYmIGZJbWFnZS5lcXVhbHMoaWdhLmZJbWFnZSkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgT2JqZWN0IHdpdGggdGhpcyBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUgb2JqZWN0LgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gb2JqIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCiAgICAgICogCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgT2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMKLSAgICAgKiBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUgb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogICAgICAgICBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUgb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBlcXVhbHMoKEltYWdlR3JhcGhpY0F0dHJpYnV0ZSkgb2JqKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGVxdWFscygoSW1hZ2VHcmFwaGljQXR0cmlidXRlKW9iaik7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIApAQCAtMTQ5LDkgKzE2Miw2IEBACiAgICAgICAgIGcyLmRyYXdJbWFnZShmSW1hZ2UsIChpbnQpKHggLSBmT3JpZ2luWCksIChpbnQpKHkgLSBmT3JpZ2luWSksIG51bGwpOwogICAgIH0KIAotICAgIC8qKiAKLSAgICAgKiBAc2VlIGphdmEuYXd0LmZvbnQuR3JhcGhpY0F0dHJpYnV0ZSNnZXRBZHZhbmNlKCkKLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmxvYXQgZ2V0QWR2YW5jZSgpIHsKICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIGZJbWdXaWR0aCAtIGZPcmlnaW5YKTsKQEAgLTE2NywxMyArMTc3LDkgQEAKICAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUyRC5GbG9hdCgtZk9yaWdpblgsIC1mT3JpZ2luWSwgZkltZ1dpZHRoLCBmSW1nSGVpZ2h0KTsKICAgICB9CiAKLSAgICAvKiogCi0gICAgICogQHNlZSBqYXZhLmF3dC5mb250LkdyYXBoaWNBdHRyaWJ1dGUjZ2V0RGVzY2VudCgpCi0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZsb2F0IGdldERlc2NlbnQoKSB7CiAgICAgICAgIHJldHVybiBNYXRoLm1heCgwLCBmSW1nSGVpZ2h0IC0gZk9yaWdpblkpOwogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZm9udC9MaW5lQnJlYWtNZWFzdXJlci5qYXZhIGIvYXd0L2phdmEvYXd0L2ZvbnQvTGluZUJyZWFrTWVhc3VyZXIuamF2YQppbmRleCBlZmNlNjE1Li40ODAwMDkzIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZm9udC9MaW5lQnJlYWtNZWFzdXJlci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9mb250L0xpbmVCcmVha01lYXN1cmVyLmphdmEKQEAgLTIxLDY0ICsyMSw2OSBAQAogCiBwYWNrYWdlIGphdmEuYXd0LmZvbnQ7CiAKLWltcG9ydCBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yOwotLy8/Pz9BV1Q6IGltcG9ydCBqYXZhLnRleHQuQnJlYWtJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yOyAvLz8/P0FXVDogaW1wb3J0IGphdmEudGV4dC5CcmVha0l0ZXJhdG9yOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIGNsYXNzIExpbmVCcmVha01lYXN1cmVyIHByb3ZpZGVzIG1ldGhvZHMgdG8gbWVhc3VyZSB0aGUgZ3JhcGhpY2FsIAotICogcmVwcmVzZW50YXRpb24gb2YgYSB0ZXh0IGluIG9yZGVyIHRvIGRldGVybWluZSB3aGVyZSB0byBhZGQgbGluZSAKLSAqIGJyZWFrcyBzbyB0aGUgcmVzdWx0aW5nIGxpbmUgb2YgdGV4dCBmaXRzIGl0cyB3cmFwcGluZyB3aWR0aC4gCi0gKiBUaGUgd3JhcHBpbmcgd2lkdGggZGVmaW5lcyB0aGUgdmlzdWFsIHdpZHRoIG9mIHRoZSBwYXJhZ3JhcGguCisgKiBUaGUgY2xhc3MgTGluZUJyZWFrTWVhc3VyZXIgcHJvdmlkZXMgbWV0aG9kcyB0byBtZWFzdXJlIHRoZSBncmFwaGljYWwKKyAqIHJlcHJlc2VudGF0aW9uIG9mIGEgdGV4dCBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hlcmUgdG8gYWRkIGxpbmUgYnJlYWtzIHNvCisgKiB0aGUgcmVzdWx0aW5nIGxpbmUgb2YgdGV4dCBmaXRzIGl0cyB3cmFwcGluZyB3aWR0aC4gVGhlIHdyYXBwaW5nIHdpZHRoCisgKiBkZWZpbmVzIHRoZSB2aXN1YWwgd2lkdGggb2YgdGhlIHBhcmFncmFwaC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBMaW5lQnJlYWtNZWFzdXJlciB7Ci0gICAgCi0gICAgLyoqIFRoZSB0bS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSB0bS4KKyAgICAgKi8KICAgICBwcml2YXRlIFRleHRNZWFzdXJlciB0bSA9IG51bGw7Ci0gICAgLy8/Pz9BV1QgcHJpdmF0ZSBCcmVha0l0ZXJhdG9yIGJpID0gbnVsbDsKLSAgICAvKiogVGhlIHBvc2l0aW9uLiAqLworCisgICAgLy8gPz8/QVdUIHByaXZhdGUgQnJlYWtJdGVyYXRvciBiaSA9IG51bGw7CisgICAgLyoqCisgICAgICogVGhlIHBvc2l0aW9uLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IHBvc2l0aW9uID0gMDsKLSAgICAKLSAgICAvKiogVGhlIG1heHBvcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBtYXhwb3MuCisgICAgICovCiAgICAgaW50IG1heHBvcyA9IDA7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgTGluZUJyZWFrTWVhc3VyZXIgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIHRleHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRleHQgdGhlIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciBvYmplY3Qgd2hpY2ggY29udGFpbnMKLSAgICAgKiB0ZXh0IHdpdGggYXQgbGVhc3Qgb25lIGNoYXJhY3Rlci4KLSAgICAgKiBAcGFyYW0gZnJjIHRoZSBGb250UmVuZGVyQ29udGV4dCByZXByZXNlbnRlZCBpbmZvcm1hdGlvbgotICAgICAqIGFib3V0IGdyYXBoaWMgZGV2aWNlLgorICAgICAqIEBwYXJhbSB0ZXh0CisgICAgICogICAgICAgICAgICB0aGUgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIG9iamVjdCB3aGljaCBjb250YWlucyB0ZXh0CisgICAgICogICAgICAgICAgICB3aXRoIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIuCisgICAgICogQHBhcmFtIGZyYworICAgICAqICAgICAgICAgICAgdGhlIEZvbnRSZW5kZXJDb250ZXh0IHJlcHJlc2VudGVkIGluZm9ybWF0aW9uIGFib3V0IGdyYXBoaWMKKyAgICAgKiAgICAgICAgICAgIGRldmljZS4KICAgICAgKi8KICAgICBwdWJsaWMgTGluZUJyZWFrTWVhc3VyZXIoQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIHRleHQsIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgewotICAgICAgICAvLz8/P0FXVDogdGhpcyh0ZXh0LCBCcmVha0l0ZXJhdG9yLmdldExpbmVJbnN0YW5jZSgpLCBmcmMpOworICAgICAgICAvLyA/Pz9BV1Q6IHRoaXModGV4dCwgQnJlYWtJdGVyYXRvci5nZXRMaW5lSW5zdGFuY2UoKSwgZnJjKTsKICAgICB9CiAKLSAgICAvKiA/Pz9BV1QKLSAgICBwdWJsaWMgTGluZUJyZWFrTWVhc3VyZXIoCi0gICAgICAgICAgICBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgdGV4dCwKLSAgICAgICAgICAgIEJyZWFrSXRlcmF0b3IgYmksCi0gICAgICAgICAgICBGb250UmVuZGVyQ29udGV4dCBmcmMKLSAgICApIHsKLSAgICAgICAgdG0gPSBuZXcgVGV4dE1lYXN1cmVyKHRleHQsIGZyYyk7Ci0gICAgICAgIHRoaXMuYmkgPSBiaTsKLSAgICAgICAgdGhpcy5iaS5zZXRUZXh0KHRleHQpOwotICAgICAgICBwb3NpdGlvbiA9IHRleHQuZ2V0QmVnaW5JbmRleCgpOwotICAgICAgICBtYXhwb3MgPSB0bS5hY2kuZ2V0RW5kSW5kZXgoKTsKLSAgICB9Ci0gICAgKi8KKyAgICAvKgorICAgICAqID8/P0FXVCBwdWJsaWMgTGluZUJyZWFrTWVhc3VyZXIoIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciB0ZXh0LAorICAgICAqIEJyZWFrSXRlcmF0b3IgYmksIEZvbnRSZW5kZXJDb250ZXh0IGZyYyApIHsgdG0gPSBuZXcgVGV4dE1lYXN1cmVyKHRleHQsCisgICAgICogZnJjKTsgdGhpcy5iaSA9IGJpOyB0aGlzLmJpLnNldFRleHQodGV4dCk7IHBvc2l0aW9uID0KKyAgICAgKiB0ZXh0LmdldEJlZ2luSW5kZXgoKTsgbWF4cG9zID0gdG0uYWNpLmdldEVuZEluZGV4KCk7IH0KKyAgICAgKi8KIAogICAgIC8qKgotICAgICAqIERlbGV0ZXMgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIG9mIHRoZSB0ZXh0LCAKLSAgICAgKiB1cGRhdGVzIHRoaXMgTGluZUJyZWFrTWVhc3VyZXIgb2JqZWN0LgorICAgICAqIERlbGV0ZXMgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIG9mIHRoZSB0ZXh0LCB1cGRhdGVzIHRoaXMKKyAgICAgKiBMaW5lQnJlYWtNZWFzdXJlciBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5ld1RleHQgdGhlIG5ldyB0ZXh0LgotICAgICAqIEBwYXJhbSBwb3MgdGhlIHBvc2lvbiBvZiB0aGUgY2hhcmFjdGVyIHdoaWNoIGlzIGRlbGV0ZWQuCisgICAgICogQHBhcmFtIG5ld1RleHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdGV4dC4KKyAgICAgKiBAcGFyYW0gcG9zCisgICAgICogICAgICAgICAgICB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciB3aGljaCBpcyBkZWxldGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUNoYXIoQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIG5ld1RleHQsIGludCBwb3MpIHsKICAgICAgICAgdG0uZGVsZXRlQ2hhcihuZXdUZXh0LCBwb3MpOwotICAgICAgICAvLz8/P0FXVDogYmkuc2V0VGV4dChuZXdUZXh0KTsKKyAgICAgICAgLy8gPz8/QVdUOiBiaS5zZXRUZXh0KG5ld1RleHQpOwogCiAgICAgICAgIHBvc2l0aW9uID0gbmV3VGV4dC5nZXRCZWdpbkluZGV4KCk7CiAKQEAgLTg4LDIyICs5MywyNCBAQAogICAgIC8qKgogICAgICAqIEdldHMgY3VycmVudCBwb3NpdGlvbiBvZiB0aGlzIExpbmVCcmVha01lYXN1cmVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gY3VycmVudCBwb3NpdGlvbiBvZiB0aGlzIExpbmVCcmVha01lYXN1cmVyCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGlzIExpbmVCcmVha01lYXN1cmVyCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRQb3NpdGlvbigpIHsKICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc2VydGVzIGEgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhlIHRleHQsIAotICAgICAqIHVwZGF0ZXMgdGhpcyBMaW5lQnJlYWtNZWFzdXJlciBvYmplY3QuCisgICAgICogSW5zZXJ0cyBhIGNoYXJhY3RlciBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoZSB0ZXh0LCB1cGRhdGVzIHRoaXMKKyAgICAgKiBMaW5lQnJlYWtNZWFzdXJlciBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5ld1RleHQgdGhlIG5ldyB0ZXh0LgotICAgICAqIEBwYXJhbSBwb3MgdGhlIHBvc2lvbiBvZiB0aGUgY2hhcmFjdGVyIHdoaWNoIGlzIGluc2VydGVkLgorICAgICAqIEBwYXJhbSBuZXdUZXh0CisgICAgICogICAgICAgICAgICB0aGUgbmV3IHRleHQuCisgICAgICogQHBhcmFtIHBvcworICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgd2hpY2ggaXMgaW5zZXJ0ZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaW5zZXJ0Q2hhcihBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgbmV3VGV4dCwgaW50IHBvcykgewogICAgICAgICB0bS5pbnNlcnRDaGFyKG5ld1RleHQsIHBvcyk7Ci0vLyAgICAgID8/P0FXVDogYmkuc2V0VGV4dChuZXdUZXh0KTsKKyAgICAgICAgLy8gPz8/QVdUOiBiaS5zZXRUZXh0KG5ld1RleHQpOwogCiAgICAgICAgIHBvc2l0aW9uID0gbmV3VGV4dC5nZXRCZWdpbkluZGV4KCk7CiAKQEAgLTExMSwyMSArMTE4LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV4dCBsaW5lIG9mIHRleHQsIHVwZGF0ZXMgY3VycmVudCBwb3NpdGlvbiBpbiB0aGlzIAorICAgICAqIFJldHVybnMgdGhlIG5leHQgbGluZSBvZiB0ZXh0LCB1cGRhdGVzIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhpcwogICAgICAqIExpbmVCcmVha01lYXN1cmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3cmFwcGluZ1dpZHRoIHRoZSBtYXhpbXVtIHZpc2libGUgbGluZSB3aWR0aC4KLSAgICAgKiBAcGFyYW0gb2Zmc2V0TGltaXQgdGhlIGxpbWl0IHBvaW50IHdpdGhpbmcgdGhlIHRleHQgaW5kaWNhdGluZwotICAgICAqIHRoYXQgbm8gZnVydGhlciB0ZXh0IHNob3VsZCBiZSBpbmNsdWRlZCBvbiB0aGUgbGluZTsgdGhlIHBhcmFncmFwaCBicmVhay4KLSAgICAgKiBAcGFyYW0gcmVxdWlyZU5leHRXb3JkIGlmIHRydWUsIG51bGwgaXMgcmV0dXJuZWQgKHRoZSBlbnRpcmUgd29yZCBhdCB0aGUgY3VycmVudCAKLSAgICAgKiBwb3NpdGlvbiBkb2VzIG5vdCBmaXQgd2l0aGluIHRoZSB3cmFwcGluZyB3aWR0aCk7ICAKLSAgICAgKiBpZiBmYWxzZSwgYSB2YWxpZCBsYXlvdXQgaXMgcmV0dXJuZWQgdGhhdCBpbmNsdWRlcyBhdCBsZWFzdCB0aGUgCi0gICAgICogY2hhcmFjdGVyIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgVGV4dExheW91dCB3aGljaCBiZWdpbnMgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIAotICAgICAqIHJlcHJlc2VudHMgdGhlIG5leHQgbGluZSBvZiB0ZXh0IHdpdGggd2lkdGggd3JhcHBpbmdXaWR0aCwgbnVsbCBpcyAKLSAgICAgKiByZXR1cm5lZCBpZiB0aGUgZW50aXJlIHdvcmQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gZG9lcyBub3QgZml0IHdpdGhpbiAKLSAgICAgKiB0aGUgd3JhcHBpbmcgd2lkdGguCisgICAgICogQHBhcmFtIHdyYXBwaW5nV2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIHZpc2libGUgbGluZSB3aWR0aC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0TGltaXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaW1pdCBwb2ludCB3aXRoaW4gdGhlIHRleHQgaW5kaWNhdGluZyB0aGF0IG5vIGZ1cnRoZXIKKyAgICAgKiAgICAgICAgICAgIHRleHQgc2hvdWxkIGJlIGluY2x1ZGVkIG9uIHRoZSBsaW5lOyB0aGUgcGFyYWdyYXBoIGJyZWFrLgorICAgICAqIEBwYXJhbSByZXF1aXJlTmV4dFdvcmQKKyAgICAgKiAgICAgICAgICAgIGlmIHRydWUsIG51bGwgaXMgcmV0dXJuZWQgKHRoZSBlbnRpcmUgd29yZCBhdCB0aGUgY3VycmVudAorICAgICAqICAgICAgICAgICAgcG9zaXRpb24gZG9lcyBub3QgZml0IHdpdGhpbiB0aGUgd3JhcHBpbmcgd2lkdGgpOyBpZiBmYWxzZSwgYQorICAgICAqICAgICAgICAgICAgdmFsaWQgbGF5b3V0IGlzIHJldHVybmVkIHRoYXQgaW5jbHVkZXMgYXQgbGVhc3QgdGhlIGNoYXJhY3RlcgorICAgICAqICAgICAgICAgICAgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICogQHJldHVybiB0aGUgbmV4dCBUZXh0TGF5b3V0IHdoaWNoIGJlZ2lucyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQKKyAgICAgKiAgICAgICAgIHJlcHJlc2VudHMgdGhlIG5leHQgbGluZSBvZiB0ZXh0IHdpdGggd2lkdGggd3JhcHBpbmdXaWR0aCwgbnVsbAorICAgICAqICAgICAgICAgaXMgcmV0dXJuZWQgaWYgdGhlIGVudGlyZSB3b3JkIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGRvZXMgbm90CisgICAgICogICAgICAgICBmaXQgd2l0aGluIHRoZSB3cmFwcGluZyB3aWR0aC4KICAgICAgKi8KICAgICBwdWJsaWMgVGV4dExheW91dCBuZXh0TGF5b3V0KGZsb2F0IHdyYXBwaW5nV2lkdGgsIGludCBvZmZzZXRMaW1pdCwgYm9vbGVhbiByZXF1aXJlTmV4dFdvcmQpIHsKICAgICAgICAgaWYgKHBvc2l0aW9uID09IG1heHBvcykgewpAQCAtMTQ1LDggKzE1NCw4IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbmV4dCBsaW5lIG9mIHRleHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdyYXBwaW5nV2lkdGggdGhlIG1heGltdW0gdmlzaWJsZSBsaW5lIHdpZHRoLgotICAgICAqIAorICAgICAqIEBwYXJhbSB3cmFwcGluZ1dpZHRoCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSB2aXNpYmxlIGxpbmUgd2lkdGguCiAgICAgICogQHJldHVybiB0aGUgbmV4dCBsaW5lIG9mIHRleHQuCiAgICAgICovCiAgICAgcHVibGljIFRleHRMYXlvdXQgbmV4dExheW91dChmbG9hdCB3cmFwcGluZ1dpZHRoKSB7CkBAIC0xNTYsOCArMTY1LDggQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIG5leHQgbGluZSBvZiB0ZXh0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB3cmFwcGluZ1dpZHRoIHRoZSBtYXhpbXVtIHZpc2libGUgbGluZSB3aWR0aC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gd3JhcHBpbmdXaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gdmlzaWJsZSBsaW5lIHdpZHRoLgogICAgICAqIEByZXR1cm4gdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgbmV4dCBsaW5lIG9mIHRleHQuCiAgICAgICovCiAgICAgcHVibGljIGludCBuZXh0T2Zmc2V0KGZsb2F0IHdyYXBwaW5nV2lkdGgpIHsKQEAgLTE2NywyMiArMTc2LDIyIEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGxpbmUgb2YgdGV4dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd3JhcHBpbmdXaWR0aCB0aGUgbWF4aW11bSB2aXNpYmxlIGxpbmUgd2lkdGguCi0gICAgICogQHBhcmFtIG9mZnNldExpbWl0IHRoZSBsaW1pdCBwb2ludCB3aXRoaW5nIHRoZSB0ZXh0IGluZGljYXRpbmcKLSAgICAgKiB0aGF0IG5vIGZ1cnRoZXIgdGV4dCBzaG91bGQgYmUgaW5jbHVkZWQgb24gdGhlIGxpbmU7IHRoZSBwYXJhZ3JhcGggYnJlYWsuCi0gICAgICogQHBhcmFtIHJlcXVpcmVOZXh0V29yZCBpZiB0cnVlLCB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyByZXR1cm5lZCAKLSAgICAgKiBpZiB0aGUgZW50aXJlIG5leHQgd29yZCBkb2VzIG5vdCBmaXQgd2l0aGluIHdyYXBwaW5nV2lkdGg7IAotICAgICAqIGlmIGZhbHNlLCB0aGUgb2Zmc2V0IHJldHVybmVkIGlzIGF0IGxlYXN0IG9uZSBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQKLSAgICAgKiBwb3NpdGlvbi4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gd3JhcHBpbmdXaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gdmlzaWJsZSBsaW5lIHdpZHRoLgorICAgICAqIEBwYXJhbSBvZmZzZXRMaW1pdAorICAgICAqICAgICAgICAgICAgdGhlIGxpbWl0IHBvaW50IHdpdGhpbmcgdGhlIHRleHQgaW5kaWNhdGluZyB0aGF0IG5vIGZ1cnRoZXIKKyAgICAgKiAgICAgICAgICAgIHRleHQgc2hvdWxkIGJlIGluY2x1ZGVkIG9uIHRoZSBsaW5lOyB0aGUgcGFyYWdyYXBoIGJyZWFrLgorICAgICAqIEBwYXJhbSByZXF1aXJlTmV4dFdvcmQKKyAgICAgKiAgICAgICAgICAgIGlmIHRydWUsIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIHJldHVybmVkIGlmIHRoZSBlbnRpcmUgbmV4dAorICAgICAqICAgICAgICAgICAgd29yZCBkb2VzIG5vdCBmaXQgd2l0aGluIHdyYXBwaW5nV2lkdGg7IGlmIGZhbHNlLCB0aGUgb2Zmc2V0CisgICAgICogICAgICAgICAgICByZXR1cm5lZCBpcyBhdCBsZWFzdCBvbmUgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHBvc2l0aW9uLgogICAgICAqIEByZXR1cm4gdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgbmV4dCBsaW5lIG9mIHRleHQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG9mZnNldExpbWl0IGlzIGxlc3MgdGhhbiAKLSAgICAgKiB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvZmZzZXRMaW1pdCBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgcG9zaXRpb24uCiAgICAgICovCiAgICAgcHVibGljIGludCBuZXh0T2Zmc2V0KGZsb2F0IHdyYXBwaW5nV2lkdGgsIGludCBvZmZzZXRMaW1pdCwgYm9vbGVhbiByZXF1aXJlTmV4dFdvcmQpIHsKICAgICAgICAgaWYgKG9mZnNldExpbWl0IDw9IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjAzPU9mZnNldCBsaW1pdCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIGN1cnJlbnQgcG9zaXRpb24uIAorICAgICAgICAgICAgLy8gYXd0LjIwMz1PZmZzZXQgbGltaXQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBjdXJyZW50IHBvc2l0aW9uLgogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMDMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCkBAIC0xOTMsMjIgKzIwMiwyMCBAQAogICAgICAgICBpbnQgYnJlYWtQb3MgPSB0bS5nZXRMaW5lQnJlYWtJbmRleChwb3NpdGlvbiwgd3JhcHBpbmdXaWR0aCk7CiAgICAgICAgIGludCBjb3JyZWN0ZWRQb3MgPSBicmVha1BvczsKIAotICAgICAgICAvLyBUaGlzIGNoZWNrIGlzIHJlcXVpcmVkIGJlY2F1c2UgYmkucHJlY2VkaW5nKG1heHBvcykgdGhyb3dzIGFuIGV4Y2VwdGlvbgotICAgICAgICAvKiA/Pz9BV1QKLSAgICAgICAgaWYgKGJyZWFrUG9zID09IG1heHBvcykgewotICAgICAgICAgICAgY29ycmVjdGVkUG9zID0gbWF4cG9zOwotICAgICAgICB9IGVsc2UgaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYmkuZ2V0VGV4dCgpLnNldEluZGV4KGJyZWFrUG9zKSkpIHsKLSAgICAgICAgICAgIGNvcnJlY3RlZFBvcyA9IGJpLmZvbGxvd2luZyhicmVha1Bvcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb3JyZWN0ZWRQb3MgPSBiaS5wcmVjZWRpbmcoYnJlYWtQb3MpOwotICAgICAgICB9Ci0gICAgICAgICovCi0gICAgICAgIAorICAgICAgICAvLyBUaGlzIGNoZWNrIGlzIHJlcXVpcmVkIGJlY2F1c2UgYmkucHJlY2VkaW5nKG1heHBvcykgdGhyb3dzIGFuCisgICAgICAgIC8vIGV4Y2VwdGlvbgorICAgICAgICAvKgorICAgICAgICAgKiA/Pz9BV1QgaWYgKGJyZWFrUG9zID09IG1heHBvcykgeyBjb3JyZWN0ZWRQb3MgPSBtYXhwb3M7IH0gZWxzZSBpZgorICAgICAgICAgKiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShiaS5nZXRUZXh0KCkuc2V0SW5kZXgoYnJlYWtQb3MpKSkgeworICAgICAgICAgKiBjb3JyZWN0ZWRQb3MgPSBiaS5mb2xsb3dpbmcoYnJlYWtQb3MpOyB9IGVsc2UgeyBjb3JyZWN0ZWRQb3MgPQorICAgICAgICAgKiBiaS5wcmVjZWRpbmcoYnJlYWtQb3MpOyB9CisgICAgICAgICAqLworCiAgICAgICAgIGlmIChwb3NpdGlvbiA+PSBjb3JyZWN0ZWRQb3MpIHsKICAgICAgICAgICAgIGlmIChyZXF1aXJlTmV4dFdvcmQpIHsKICAgICAgICAgICAgICAgICBjb3JyZWN0ZWRQb3MgPSBwb3NpdGlvbjsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29ycmVjdGVkUG9zID0gTWF0aC5tYXgocG9zaXRpb24rMSwgYnJlYWtQb3MpOworICAgICAgICAgICAgICAgIGNvcnJlY3RlZFBvcyA9IE1hdGgubWF4KHBvc2l0aW9uICsgMSwgYnJlYWtQb3MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTIxOCw3ICsyMjUsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIG5ldyBwb3NpdGlvbiBvZiB0aGlzIExpbmVCcmVha01lYXN1cmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwb3MgdGhlIG5ldyBwb3NpdGlvbiBvZiB0aGlzIExpbmVCcmVha01lYXN1cmVyLgorICAgICAqIEBwYXJhbSBwb3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgcG9zaXRpb24gb2YgdGhpcyBMaW5lQnJlYWtNZWFzdXJlci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQb3NpdGlvbihpbnQgcG9zKSB7CiAgICAgICAgIGlmICh0bS5hY2kuZ2V0QmVnaW5JbmRleCgpID4gcG9zIHx8IG1heHBvcyA8IHBvcykgewpAQCAtMjI4LDQgKzIzNiwzIEBACiAgICAgICAgIHBvc2l0aW9uID0gcG9zOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ZvbnQvTGluZU1ldHJpY3MuamF2YSBiL2F3dC9qYXZhL2F3dC9mb250L0xpbmVNZXRyaWNzLmphdmEKaW5kZXggMjg1NzE4Ny4uNGIwM2U1ZCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ZvbnQvTGluZU1ldHJpY3MuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZm9udC9MaW5lTWV0cmljcy5qYXZhCkBAIC0xOCwyMiArMTgsMjQgQEAKICAqIEBhdXRob3IgSWx5YSBTLiBPa29taW4KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmZvbnQ7CiAKIC8qKgotICogVGhlIExpbmVNZXRyaWNzIGNsYXNzIHByb3ZpZGVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgY29uY2VybmluZyBob3cgdGhlIHRleHQgCi0gKiBpcyBwb3NpdGlvbmVkIHdpdGggcmVzcGVjdCB0byB0aGUgYmFzZSBsaW5lLCBzdWNoIGFzIGFzY2VudCwgZGVzY2VudCwgCi0gKiBhbmQgbGVhZGluZy4KKyAqIFRoZSBMaW5lTWV0cmljcyBjbGFzcyBwcm92aWRlcyBpbmZvcm1hdGlvbiBzdWNoIGFzIGNvbmNlcm5pbmcgaG93IHRoZSB0ZXh0IGlzCisgKiBwb3NpdGlvbmVkIHdpdGggcmVzcGVjdCB0byB0aGUgYmFzZSBsaW5lLCBzdWNoIGFzIGFzY2VudCwgZGVzY2VudCwgYW5kCisgKiBsZWFkaW5nLgogICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIExpbmVNZXRyaWNzIHsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJhc2VsaW5lIG9mZnNldHMgb2YgdGhlIHRleHQgYWNjb3JkaW5nIHRvIHRoZSAKLSAgICAgKiB0aGUgYmFzZWxpbmUgb2YgdGhpcyB0ZXh0LgorICAgICAqIEdldHMgdGhlIGJhc2VsaW5lIG9mZnNldHMgb2YgdGhlIHRleHQgYWNjb3JkaW5nIHRvIHRoZSB0aGUgYmFzZWxpbmUgb2YKKyAgICAgKiB0aGlzIHRleHQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYmFzZWxpbmUgb2Zmc2V0cyBvZiB0aGUgdGV4dCBhY2NvcmRpbmcgdG8gdGhlIAotICAgICAqIHRoZSBiYXNlbGluZSBvZiB0aGlzIHRleHQuCisgICAgICogQHJldHVybiB0aGUgYmFzZWxpbmUgb2Zmc2V0cyBvZiB0aGUgdGV4dCBhY2NvcmRpbmcgdG8gdGhlIHRoZSBiYXNlbGluZSBvZgorICAgICAqICAgICAgICAgdGhpcyB0ZXh0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBmbG9hdFtdIGdldEJhc2VsaW5lT2Zmc2V0cygpOwogCkBAIC00NSwxMSArNDcsMTEgQEAKICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldE51bUNoYXJzKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBiYXNlbGluZSBpbmRleCwgcmV0dXJucyBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAgICAgKiBpbmRleDogUk9NQU5fQkFTRUxJTkUsIENFTlRFUl9CQVNFTElORSwgSEFOR0lOR19CQVNFTElORS4KKyAgICAgKiBHZXRzIHRoZSBiYXNlbGluZSBpbmRleCwgcmV0dXJucyBvbmUgb2YgdGhlIGZvbGxvd2luZyBpbmRleDoKKyAgICAgKiBST01BTl9CQVNFTElORSwgQ0VOVEVSX0JBU0VMSU5FLCBIQU5HSU5HX0JBU0VMSU5FLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJhc2VsaW5lIGluZGV4OiBST01BTl9CQVNFTElORSwgQ0VOVEVSX0JBU0VMSU5FCi0gICAgICogb3IgSEFOR0lOR19CQVNFTElORS4KKyAgICAgKiBAcmV0dXJuIHRoZSBiYXNlbGluZSBpbmRleDogUk9NQU5fQkFTRUxJTkUsIENFTlRFUl9CQVNFTElORSBvcgorICAgICAqICAgICAgICAgSEFOR0lOR19CQVNFTElORS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEJhc2VsaW5lSW5kZXgoKTsKIApAQCAtODksMTEgKzkxLDExIEBACiAgICAgcHVibGljIGFic3RyYWN0IGZsb2F0IGdldExlYWRpbmcoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhlaWdodCBvZiB0aGUgdGV4dCBhcyBhIHN1bSBvZiB0aGUgYXNjZW50LCB0aGUgZGVzY2VudCAKLSAgICAgKiBhbmQgdGhlIGxlYWRpbmcuCisgICAgICogR2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSB0ZXh0IGFzIGEgc3VtIG9mIHRoZSBhc2NlbnQsIHRoZSBkZXNjZW50IGFuZCB0aGUKKyAgICAgKiBsZWFkaW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgdGV4dCBhcyBhIHN1bSBvZiB0aGUgYXNjZW50LCB0aGUgZGVzY2VudCAKLSAgICAgKiBhbmQgdGhlIGxlYWRpbmcuCisgICAgICogQHJldHVybiB0aGUgaGVpZ2h0IG9mIHRoZSB0ZXh0IGFzIGEgc3VtIG9mIHRoZSBhc2NlbnQsIHRoZSBkZXNjZW50IGFuZAorICAgICAqICAgICAgICAgdGhlIGxlYWRpbmcuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGZsb2F0IGdldEhlaWdodCgpOwogCkBAIC0xMTIsNCArMTE0LDMgQEAKICAgICBwdWJsaWMgYWJzdHJhY3QgZmxvYXQgZ2V0QXNjZW50KCk7CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ZvbnQvTXVsdGlwbGVNYXN0ZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9mb250L011bHRpcGxlTWFzdGVyLmphdmEKaW5kZXggNzczYmZjZi4uZDI2NGYyNCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ZvbnQvTXVsdGlwbGVNYXN0ZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZm9udC9NdWx0aXBsZU1hc3Rlci5qYXZhCkBAIC0xOCwzOCArMTgsNDQgQEAKICAqIEBhdXRob3IgSWx5YSBTLiBPa29taW4KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmZvbnQ7CiAKIGltcG9ydCBqYXZhLmF3dC5Gb250OwogCiAvKioKLSAqIFRoZSBNdWx0aXBsZU1hc3RlciBpbnRlcmZhY2UgcHJvdmlkZXMgbWV0aG9kcyB0byBtYW5pcHVsYXRlIE11bHRpcGxlTWFzdGVyIAorICogVGhlIE11bHRpcGxlTWFzdGVyIGludGVyZmFjZSBwcm92aWRlcyBtZXRob2RzIHRvIG1hbmlwdWxhdGUgTXVsdGlwbGVNYXN0ZXIKICAqIHR5cGUgZm9udHMgYW5kIHJldHJpZXZlIGdyYXBoaWNhbCBhbmQgZGVzaWduIGRhdGEgZnJvbSB0aGVtLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBNdWx0aXBsZU1hc3RlciB7CiAKICAgICAvKioKLSAgICAgKiBEZXJpdmVzIGEgbmV3IG11bHRpcGxlIG1hc3RlciBmb250IGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgCi0gICAgICogcGFyYW1ldGVycy4KKyAgICAgKiBEZXJpdmVzIGEgbmV3IG11bHRpcGxlIG1hc3RlciBmb250IGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZ2x5cGhXaWR0aHMgZmxvYXQgYXJyYXkgd2hpY2ggcmVwcmVzZW50cyB3aWR0aCBvZiBlYWNoIGdseXBoCi0gICAgICogaW4gZm9udCBzcGFjZS4KLSAgICAgKiBAcGFyYW0gYXZnU3RlbVdpZHRoIHRoZSBhdmVyYWdlIHN0ZW0gd2lkdGggaW4gZm9udCBzcGFjZS4KLSAgICAgKiBAcGFyYW0gdHlwaWNhbENhcEhlaWdodCB0aGUgdHlwaWNhbCB1cHBlciBjYXNlIGNoYXIgaGVpZ2h0LgotICAgICAqIEBwYXJhbSB0eXBpY2FsWEhlaWdodCB0aGUgdHlwaWNhbCBsb3dlciBjYXNlIGNoYXIgaGVpZ2h0LgotICAgICAqIEBwYXJhbSBpdGFsaWNBbmdsZSB0aGUgc2xvcGUgYW5nbGUgZm9yIGl0YWxpY3MuCi0gICAgICogCisgICAgICogQHBhcmFtIGdseXBoV2lkdGhzCisgICAgICogICAgICAgICAgICBmbG9hdCBhcnJheSB3aGljaCByZXByZXNlbnRzIHdpZHRoIG9mIGVhY2ggZ2x5cGggaW4gZm9udAorICAgICAqICAgICAgICAgICAgc3BhY2UuCisgICAgICogQHBhcmFtIGF2Z1N0ZW1XaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIGF2ZXJhZ2Ugc3RlbSB3aWR0aCBpbiBmb250IHNwYWNlLgorICAgICAqIEBwYXJhbSB0eXBpY2FsQ2FwSGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgdHlwaWNhbCB1cHBlciBjYXNlIGNoYXIgaGVpZ2h0LgorICAgICAqIEBwYXJhbSB0eXBpY2FsWEhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIHR5cGljYWwgbG93ZXIgY2FzZSBjaGFyIGhlaWdodC4KKyAgICAgKiBAcGFyYW0gaXRhbGljQW5nbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzbG9wZSBhbmdsZSBmb3IgaXRhbGljcy4KICAgICAgKiBAcmV0dXJuIGEgTXVsdGlwbGVNYXN0ZXIgZm9udC4KICAgICAgKi8KLSAgICBwdWJsaWMgRm9udCBkZXJpdmVNTUZvbnQoZmxvYXRbXSBnbHlwaFdpZHRocywgZmxvYXQgYXZnU3RlbVdpZHRoLAotICAgICAgICAgICAgZmxvYXQgdHlwaWNhbENhcEhlaWdodCwgZmxvYXQgdHlwaWNhbFhIZWlnaHQsIGZsb2F0IGl0YWxpY0FuZ2xlKTsKKyAgICBwdWJsaWMgRm9udCBkZXJpdmVNTUZvbnQoZmxvYXRbXSBnbHlwaFdpZHRocywgZmxvYXQgYXZnU3RlbVdpZHRoLCBmbG9hdCB0eXBpY2FsQ2FwSGVpZ2h0LAorICAgICAgICAgICAgZmxvYXQgdHlwaWNhbFhIZWlnaHQsIGZsb2F0IGl0YWxpY0FuZ2xlKTsKIAogICAgIC8qKgotICAgICAqIERlcml2ZXMgYSBuZXcgbXVsdGlwbGUgbWFzdGVyIGZvbnQgYmFzZWQgb24gdGhlIGRlc2lnbiBheGlzIHZhbHVlcyAKLSAgICAgKiBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCBhcnJheS4gCisgICAgICogRGVyaXZlcyBhIG5ldyBtdWx0aXBsZSBtYXN0ZXIgZm9udCBiYXNlZCBvbiB0aGUgZGVzaWduIGF4aXMgdmFsdWVzCisgICAgICogY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGF4ZXMgYW4gZmxvYXQgYXJyYXkgd2hpY2ggY29udGFpbnMgYXhpcyB2YWx1ZXMuCi0gICAgICogCisgICAgICogQHBhcmFtIGF4ZXMKKyAgICAgKiAgICAgICAgICAgIGFuIGZsb2F0IGFycmF5IHdoaWNoIGNvbnRhaW5zIGF4aXMgdmFsdWVzLgogICAgICAqIEByZXR1cm4gYSBNdWx0aXBsZU1hc3RlciBmb250LgogICAgICAqLwogICAgIHB1YmxpYyBGb250IGRlcml2ZU1NRm9udChmbG9hdFtdIGF4ZXMpOwpAQCAtNjIsMjUgKzY4LDI0IEBACiAgICAgcHVibGljIGZsb2F0W10gZ2V0RGVzaWduQXhpc0RlZmF1bHRzKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhcnJheSBvZiBkZXNpZ24gYXhpcyBuYW1lcy4gCisgICAgICogR2V0cyB0aGUgYXJyYXkgb2YgZGVzaWduIGF4aXMgbmFtZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgZGVzaWduIGF4aXMgbmFtZXMuIAorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGRlc2lnbiBheGlzIG5hbWVzLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREZXNpZ25BeGlzTmFtZXMoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGFycmF5IG9mIGRlc2lnbiBheGlzIHJhbmdlcy4gCisgICAgICogR2V0cyB0aGUgYXJyYXkgb2YgZGVzaWduIGF4aXMgcmFuZ2VzLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGRlc2lnbiBheGlzIHJhbmdlcy4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXRbXSBnZXREZXNpZ25BeGlzUmFuZ2VzKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgbXVsdGlwbGUgbWFzdGVyIGRlc2lnbiBjb250cm9scy4gCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIG11bHRpcGxlIG1hc3RlciBkZXNpZ24gY29udHJvbHMuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG11bHRpcGxlIG1hc3RlciBkZXNpZ24gY29udHJvbHMuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXROdW1EZXNpZ25BeGVzKCk7CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ZvbnQvT3BlblR5cGUuamF2YSBiL2F3dC9qYXZhL2F3dC9mb250L09wZW5UeXBlLmphdmEKaW5kZXggNTNjYjZjMC4uZGI2NjkxMSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ZvbnQvT3BlblR5cGUuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZm9udC9PcGVuVHlwZS5qYXZhCkBAIC0xOCwzMTggKzE4LDMyMyBAQAogICogQGF1dGhvciBJbHlhIFMuIE9rb21pbgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZm9udDsKIAogLyoqCi0gKiBUaGUgT3BlblR5cGUgaW50ZXJmYWNlIHByb3ZpZGVzIGNvbnN0YW50cyBhbmQgbWV0aG9kcyBmb3IgZ2V0dGluZyAKLSAqIGluc3RhbmNlIGRhdGEgZm9yIGZvbnRzIG9mIHR5cGUgT3BlblR5cGUgYW5kIFRydWVUeXBlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwKLSAqIHNlZSB0aGUgPGEgaHJlZj0iaHR0cDovL3BhcnRuZXJzLmFkb2JlLmNvbS9wdWJsaWMvZGV2ZWxvcGVyL29wZW50eXBlL2luZGV4X3NwZWMuaHRtbCI+T3BlblR5cGUgc3BlY2lmaWNhdGlvbjwvYT4uCisgKiBUaGUgT3BlblR5cGUgaW50ZXJmYWNlIHByb3ZpZGVzIGNvbnN0YW50cyBhbmQgbWV0aG9kcyBmb3IgZ2V0dGluZyBpbnN0YW5jZQorICogZGF0YSBmb3IgZm9udHMgb2YgdHlwZSBPcGVuVHlwZSBhbmQgVHJ1ZVR5cGUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlCisgKiA8YQorICogaHJlZj0iaHR0cDovL3BhcnRuZXJzLmFkb2JlLmNvbS9wdWJsaWMvZGV2ZWxvcGVyL29wZW50eXBlL2luZGV4X3NwZWMuaHRtbCI+CisgKiBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uPC9hPi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgT3BlblR5cGUgewogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfQUNOVCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfQUNOVCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0FDTlQgPSAxNjMzOTA2MjkyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfQVZBUiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0FWQVIgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19BVkFSID0gMTYzNTE0ODE0NjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0JBU0UgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0JBU0UgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19CQVNFID0gMTExMTU3NzQxMzsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0JEQVQgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0JEQVQgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19CREFUID0gMTY1MDc0NTcxNjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0JMT0MgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0JMT0MgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19CTE9DID0gMTY1MTI3MzU3MTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0JTTE4gaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0JTTE4gaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19CU0xOID0gMTY1MTczMTU2NjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0NGRiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfQ0ZGIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfQ0ZGID0gMTEyODY3ODk0NDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0NNQVAgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0NNQVAgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19DTUFQID0gMTY2ODExMjc1MjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0NWQVIgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0NWQVIgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19DVkFSID0gMTY2ODcwMjU3ODsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0NWVCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfQ1ZUIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfQ1ZUID0gMTY2ODcwNzM2MDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0RTSUcgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0RTSUcgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19EU0lHID0gMTE0NjMwODkzNTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0VCRFQgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0VCRFQgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19FQkRUID0gMTE2MTk3MDc3MjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0VCTEMgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0VCTEMgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19FQkxDID0gMTE2MTk3MjgwMzsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0VCU0MgIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19FQlNDIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfRUJTQyA9IDExNjE5NzQ1OTU7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19GRFNDIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfRkRTQyBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0ZEU0MgPSAxNzE3ODU5MTcxOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfRkVBVCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfRkVBVCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0ZFQVQgPSAxNzE3OTIwMTE2OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfRk1UWCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfRk1UWCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0ZNVFggPSAxNzE4NDQ5MjcyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfRlBHTSBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfRlBHTSBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0ZQR00gPSAxNzE4NjQyNTQxOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfRlZBUiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfRlZBUiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0ZWQVIgPSAxNzE5MDM0MjI2OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfR0FTUCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfR0FTUCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0dBU1AgPSAxNzM0NDM5NzkyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfR0RFRiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfR0RFRiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0dERUYgPSAxMTk1NjU2NTE4OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfR0xZRiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfR0xZRiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0dMWUYgPSAxNzM1MTYyMjE0OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfR1BPUyBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfR1BPUyBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0dQT1MgPSAxMTk2NDQ1NTIzOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfR1NVQiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfR1NVQiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0dTVUIgPSAxMTk2NjQzNjUwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfR1ZBUiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0dWQVIgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19HVkFSID0gMTczNTgxMTQ0MjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0hETVggaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0hETVggaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19IRE1YID0gMTc1MTQxMjA4ODsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0hFQUQgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0hFQUQgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19IRUFEID0gMTc1MTQ3NDUzMjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0hIRUEgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0hIRUEgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19ISEVBID0gMTc1MTY3MjE2MTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0hNVFggaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0hNVFggaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19ITVRYID0gMTc1MjAwMzcwNDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0pTVEYgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0pTVEYgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19KU1RGID0gMTI0Njk3NTA0NjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0pVU1QgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0pVU1QgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19KVVNUID0gMTc4NjA4MjE2NDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0tFUk4gaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0tFUk4gaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19LRVJOID0gMTgwMTgxMDU0MjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0xDQVIgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0xDQVIgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19MQ0FSID0gMTgxODQ1MjMzODsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0xPQ0EgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0xPQ0EgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19MT0NBID0gMTgxOTIzOTI2NTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0xUU0ggaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0xUU0ggaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19MVFNIID0gMTI4MDU5NDc2MDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX01BWFAgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX01BWFAgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19NQVhQID0gMTgzNTEwNDM2ODsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX01NRlggaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX01NRlggaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19NTUZYID0gMTI5NjkwOTkxMjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX01NU0QgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX01NU0QgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19NTVNEID0gMTI5NjkxMzIyMDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX01PUlQgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX01PUlQgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19NT1JUID0gMTgzNjAyMDM0MDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX05BTUUgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX05BTUUgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19OQU1FID0gMTg1MTg3ODc1NzsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX09QQkQgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX09QQkQgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19PUEJEID0gMTgzNjAyMDM0MDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX09TMiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX09TMiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX09TMiA9IDEzMzA4NTE2MzQ7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19QQ0xUICBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfUENMVCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1BDTFQgPSAxMzQ2NTg3NzMyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfUE9TVCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfUE9TVCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1BPU1QgPSAxODg2MzUyMjQ0OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfUFJFUCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfUFJFUCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1BSRVAgPSAxODg2NTQ1MjY0OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfUFJPUCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfUFJPUCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1BST1AgPSAxODg2NTQ3ODI0OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfVFJBSyBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfVFJBSyBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1RSQUsgPSAxOTUzNjUzMDk5OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfVFlQMSBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfVFlQMSBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1RZUDEgPSAxOTU0MTE1NjMzOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfVkRNWCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfVkRNWCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1ZETVggPSAxNDQ3MzE2ODI0OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfVkhFQSBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfVkhFQSBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1ZIRUEgPSAxOTg2NTUzMTg1OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfVk1UWCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfVk1UWCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1ZNVFggPSAxOTg2ODg0NzI4OwogCkBAIC0zNDEsNzAgKzM0Niw3MyBAQAogICAgIHB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGFibGUgZm9yIGEgc3BlY2lmaWVkIHRhZy4gCi0gICAgICogU2ZudCB0YWJsZXMgaW5jbHVkZSBjbWFwLCBuYW1lIGFuZCBoZWFkIGl0ZW1zLiAKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHNmbnRUYWcgdGhlIHNmbnQgdGFnLgorICAgICAqIEdldHMgdGhlIHRhYmxlIGZvciBhIHNwZWNpZmllZCB0YWcuIFNmbnQgdGFibGVzIGluY2x1ZGUgY21hcCwgbmFtZSBhbmQKKyAgICAgKiBoZWFkIGl0ZW1zLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBieXRlIGFycmF5IGNvbnRhaW5zIHRoZSBmb250IGRhdGEgY29ycmVzcG9uZGluZyAKLSAgICAgKiB0byB0aGUgc3BlY2lmaWVkIHRhZy4KKyAgICAgKiBAcGFyYW0gc2ZudFRhZworICAgICAqICAgICAgICAgICAgdGhlIHNmbnQgdGFnLgorICAgICAqIEByZXR1cm4gYSBieXRlIGFycmF5IGNvbnRhaW5zIHRoZSBmb250IGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCB0YWcuCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSBnZXRGb250VGFibGUoaW50IHNmbnRUYWcpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGFibGUgZm9yIGEgc3BlY2lmaWVkIHRhZy4gCi0gICAgICogU2ZudCB0YWJsZXMgaW5jbHVkZSBjbWFwLCBuYW1lIGFuZCBoZWFkIGl0ZW1zLiAKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHNmbnRUYWcgdGhlIHNmbnQgdGFnLgotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBvZiB0aGUgcmV0dXJuZWQgdGFibGUuCi0gICAgICogQHBhcmFtIGNvdW50IHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgdGFibGUuCisgICAgICogR2V0cyB0aGUgdGFibGUgZm9yIGEgc3BlY2lmaWVkIHRhZy4gU2ZudCB0YWJsZXMgaW5jbHVkZSBjbWFwLCBuYW1lIGFuZAorICAgICAqIGhlYWQgaXRlbXMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgdGFibGUgY29ycmVzcG9uZGluZyB0byBzZm50VGFnIGFuZCBjb250YWluaW5nIAotICAgICAqIHRoZSBieXRlcyBzdGFydGluZyBhdCBvZmZzZXQgYnl0ZSBhbmQgaW5jbHVkaW5nIGNvdW50IGJ5dGVzLgorICAgICAqIEBwYXJhbSBzZm50VGFnCisgICAgICogICAgICAgICAgICB0aGUgc2ZudCB0YWcuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgcmV0dXJuZWQgdGFibGUuCisgICAgICogQHBhcmFtIGNvdW50CisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHJldHVybmVkIHRhYmxlLgorICAgICAqIEByZXR1cm4gdGhlIHRhYmxlIGNvcnJlc3BvbmRpbmcgdG8gc2ZudFRhZyBhbmQgY29udGFpbmluZyB0aGUgYnl0ZXMKKyAgICAgKiAgICAgICAgIHN0YXJ0aW5nIGF0IG9mZnNldCBieXRlIGFuZCBpbmNsdWRpbmcgY291bnQgYnl0ZXMuCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSBnZXRGb250VGFibGUoaW50IHNmbnRUYWcsIGludCBvZmZzZXQsIGludCBjb3VudCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0YWJsZSBmb3IgYSBzcGVjaWZpZWQgdGFnLiAKLSAgICAgKiBTZm50IHRhYmxlcyBpbmNsdWRlIGNtYXAsIG5hbWUgYW5kIGhlYWQgaXRlbXMuCisgICAgICogR2V0cyB0aGUgdGFibGUgZm9yIGEgc3BlY2lmaWVkIHRhZy4gU2ZudCB0YWJsZXMgaW5jbHVkZSBjbWFwLCBuYW1lIGFuZAorICAgICAqIGhlYWQgaXRlbXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0clNmbnRUYWcgdGhlIHN0ciBzZm50IHRhZyBhcyBhIFN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheSBjb250YWlucyB0aGUgZm9udCBkYXRhIGNvcnJlc3BvbmRpbmcgCi0gICAgICogdG8gdGhlIHNwZWNpZmllZCB0YWcuCisgICAgICogQHBhcmFtIHN0clNmbnRUYWcKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHIgc2ZudCB0YWcgYXMgYSBTdHJpbmcuCisgICAgICogQHJldHVybiBhIGJ5dGUgYXJyYXkgY29udGFpbnMgdGhlIGZvbnQgZGF0YSBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIHRhZy4KICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdldEZvbnRUYWJsZShTdHJpbmcgc3RyU2ZudFRhZyk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0YWJsZSBmb3IgYSBzcGVjaWZpZWQgdGFnLiAKLSAgICAgKiBTZm50IHRhYmxlcyBpbmNsdWRlIGNtYXAsIG5hbWUgYW5kIGhlYWQgaXRlbXMuIAotICAgICAqICAKLSAgICAgKiBAcGFyYW0gc3RyU2ZudFRhZyB0aGUgc2ZudCB0YWcgYXMgYSBTdHJpbmcuCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IG9mIHRoZSByZXR1cm5lZCB0YWJsZS4KLSAgICAgKiBAcGFyYW0gY291bnQgdGhlIG51bWJlciBvZiByZXR1cm5lZCB0YWJsZS4KKyAgICAgKiBHZXRzIHRoZSB0YWJsZSBmb3IgYSBzcGVjaWZpZWQgdGFnLiBTZm50IHRhYmxlcyBpbmNsdWRlIGNtYXAsIG5hbWUgYW5kCisgICAgICogaGVhZCBpdGVtcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0YWJsZSBjb3JyZXNwb25kaW5nIHRvIHNmbnRUYWcgYW5kIGNvbnRhaW5pbmcgCi0gICAgICogdGhlIGJ5dGVzIHN0YXJ0aW5nIGF0IG9mZnNldCBieXRlIGFuZCBpbmNsdWRpbmcgY291bnQgYnl0ZXMuCisgICAgICogQHBhcmFtIHN0clNmbnRUYWcKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZm50IHRhZyBhcyBhIFN0cmluZy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSByZXR1cm5lZCB0YWJsZS4KKyAgICAgKiBAcGFyYW0gY291bnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgdGFibGUuCisgICAgICogQHJldHVybiB0aGUgdGFibGUgY29ycmVzcG9uZGluZyB0byBzZm50VGFnIGFuZCBjb250YWluaW5nIHRoZSBieXRlcworICAgICAqICAgICAgICAgc3RhcnRpbmcgYXQgb2Zmc2V0IGJ5dGUgYW5kIGluY2x1ZGluZyBjb3VudCBieXRlcy4KICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdldEZvbnRUYWJsZShTdHJpbmcgc3RyU2ZudFRhZywgaW50IG9mZnNldCwgaW50IGNvdW50KTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRhYmxlIHNpemUgZm9yIGEgc3BlY2lmaWVkIHRhZy4gCisgICAgICogR2V0cyB0aGUgdGFibGUgc2l6ZSBmb3IgYSBzcGVjaWZpZWQgdGFnLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJTZm50VGFnIHRoZSBzZm50IHRhZyBhcyBhIFN0cmluZy4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RyU2ZudFRhZworICAgICAqICAgICAgICAgICAgdGhlIHNmbnQgdGFnIGFzIGEgU3RyaW5nLgogICAgICAqIEByZXR1cm4gdGhlIHRhYmxlIHNpemUgZm9yIGEgc3BlY2lmaWVkIHRhZy4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEZvbnRUYWJsZVNpemUoU3RyaW5nIHN0clNmbnRUYWcpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGFibGUgc2l6ZSBmb3IgYSBzcGVjaWZpZWQgdGFnLiAKKyAgICAgKiBHZXRzIHRoZSB0YWJsZSBzaXplIGZvciBhIHNwZWNpZmllZCB0YWcuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNmbnRUYWcgdGhlIHNmbnQgdGFnLgotICAgICAqIAorICAgICAqIEBwYXJhbSBzZm50VGFnCisgICAgICogICAgICAgICAgICB0aGUgc2ZudCB0YWcuCiAgICAgICogQHJldHVybiB0aGUgdGFibGUgc2l6ZSBmb3IgYSBzcGVjaWZpZWQgdGFnLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0Rm9udFRhYmxlU2l6ZShpbnQgc2ZudFRhZyk7CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ZvbnQvU2hhcGVHcmFwaGljQXR0cmlidXRlLmphdmEgYi9hd3QvamF2YS9hd3QvZm9udC9TaGFwZUdyYXBoaWNBdHRyaWJ1dGUuamF2YQppbmRleCA0NTE5OWZkLi4xODJiZmZkIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZm9udC9TaGFwZUdyYXBoaWNBdHRyaWJ1dGUuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZm9udC9TaGFwZUdyYXBoaWNBdHRyaWJ1dGUuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJbHlhIFMuIE9rb21pbgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZm9udDsKIAogaW1wb3J0IGphdmEuYXd0LkJhc2ljU3Ryb2tlOwpAQCAtMjksNjEgKzMwLDc1IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubWlzYy5IYXNoQ29kZTsKIAotCiAvKioKLSAqIFRoZSBTaGFwZUdyYXBoaWNBdHRyaWJ1dGUgY2xhc3MgcHJvdmlkZXMgYW4gb3Bwb3J0dW5pdHkgdG8gaW5zZXJ0IAotICogc2hhcGVzIHRvIGEgdGV4dC4KKyAqIFRoZSBTaGFwZUdyYXBoaWNBdHRyaWJ1dGUgY2xhc3MgcHJvdmlkZXMgYW4gb3Bwb3J0dW5pdHkgdG8gaW5zZXJ0IHNoYXBlcyB0byBhCisgKiB0ZXh0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFNoYXBlR3JhcGhpY0F0dHJpYnV0ZSBleHRlbmRzIEdyYXBoaWNBdHRyaWJ1dGUgewogCiAgICAgLy8gc2hhcGUgdG8gcmVuZGVyCi0gICAgLyoqIFRoZSBzaGFwZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgc2hhcGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBTaGFwZSBmU2hhcGU7Ci0gICAgCisKICAgICAvLyBmbGFnLCBpZiB0aGUgc2hhcGUgc2hvdWxkIGJlIHN0cm9rZWQgKHRydWUpIG9yIGZpbGxlZCAoZmFsc2UpCi0gICAgLyoqIFRoZSBzdHJva2UuICovCisgICAgLyoqCisgICAgICogVGhlIHN0cm9rZS4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gZlN0cm9rZTsKIAogICAgIC8vIGJvdW5kcyBvZiB0aGUgc2hhcGUKLSAgICAvKiogVGhlIGJvdW5kcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgYm91bmRzLgorICAgICAqLwogICAgIHByaXZhdGUgUmVjdGFuZ2xlMkQgZkJvdW5kczsKLSAgICAKKwogICAgIC8vIFggY29vcmRpbmF0ZSBvZiB0aGUgb3JpZ2luIHBvaW50Ci0gICAgLyoqIFRoZSBvcmlnaW4geC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgb3JpZ2luIHguCisgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCBmT3JpZ2luWDsKLSAgICAKKwogICAgIC8vIFkgY29vcmRpbmF0ZSBvZiB0aGUgb3JpZ2luIHBvaW50Ci0gICAgLyoqIFRoZSBvcmlnaW4geS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgb3JpZ2luIHkuCisgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCBmT3JpZ2luWTsKIAogICAgIC8vIHdpZHRoIG9mIHRoZSBzaGFwZQotICAgIC8qKiBUaGUgc2hhcGUgd2lkdGguICovCisgICAgLyoqCisgICAgICogVGhlIHNoYXBlIHdpZHRoLgorICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgZlNoYXBlV2lkdGg7Ci0gICAgCisKICAgICAvLyBoZWlnaHQgb2YgdGhlIHNoYXBlCi0gICAgLyoqIFRoZSBzaGFwZSBoZWlnaHQuICovCisgICAgLyoqCisgICAgICogVGhlIHNoYXBlIGhlaWdodC4KKyAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0IGZTaGFwZUhlaWdodDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgU1RST0tFIGluZGljYXRlcyB3aGV0aGVyIHRoZSBTaGFwZSBpcyBzdHJva2VkIAotICAgICAqIG9yIG5vdC4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNUUk9LRSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgU2hhcGUgaXMgc3Ryb2tlZCBvciBub3QuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFNUUk9LRSA9IHRydWU7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEZJTEwgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIFNoYXBlIGlzIGZpbGxlZCAKLSAgICAgKiBvciBub3QuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEZJTEwgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIFNoYXBlIGlzIGZpbGxlZCBvciBub3QuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJTEwgPSBmYWxzZTsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBTaGFwZUdyYXBoaWNBdHRyaWJ1dGUgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIAotICAgICAqIFNoYXBlLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBTaGFwZUdyYXBoaWNBdHRyaWJ1dGUgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIFNoYXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaGFwZSB0aGUgc2hhcGUgdG8gYmUgcmVuZGVyZWQgYnkgdGhpcyAKLSAgICAgKiBTaGFwZUdyYXBoaWNBdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIGFsaWdubWVudCB0aGUgYWxpZ25tZW50IG9mIHRoaXMgU2hhcGVHcmFwaGljQXR0cmlidXRlLgotICAgICAqIEBwYXJhbSBzdHJva2UgdHJ1ZSBpZiB0aGUgU2hhcGUgaXMgc3Ryb2tlZCwKLSAgICAgKiAgZmFsc2UgaWYgdGhlIFNoYXBlIGlzIGZpbGxlZC4KKyAgICAgKiBAcGFyYW0gc2hhcGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaGFwZSB0byBiZSByZW5kZXJlZCBieSB0aGlzIFNoYXBlR3JhcGhpY0F0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gYWxpZ25tZW50CisgICAgICogICAgICAgICAgICB0aGUgYWxpZ25tZW50IG9mIHRoaXMgU2hhcGVHcmFwaGljQXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBzdHJva2UKKyAgICAgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIFNoYXBlIGlzIHN0cm9rZWQsIGZhbHNlIGlmIHRoZSBTaGFwZSBpcyBmaWxsZWQuCiAgICAgICovCiAgICAgcHVibGljIFNoYXBlR3JhcGhpY0F0dHJpYnV0ZShTaGFwZSBzaGFwZSwgaW50IGFsaWdubWVudCwgYm9vbGVhbiBzdHJva2UpIHsKICAgICAgICAgc3VwZXIoYWxpZ25tZW50KTsKQEAgLTkxLDcgKzEwNiw3IEBACiAgICAgICAgIHRoaXMuZlNoYXBlID0gc2hhcGU7CiAgICAgICAgIHRoaXMuZlN0cm9rZSA9IHN0cm9rZTsKIAotICAgICAgICB0aGlzLmZCb3VuZHMgID0gZlNoYXBlLmdldEJvdW5kczJEKCk7CisgICAgICAgIHRoaXMuZkJvdW5kcyA9IGZTaGFwZS5nZXRCb3VuZHMyRCgpOwogCiAgICAgICAgIHRoaXMuZk9yaWdpblggPSAoZmxvYXQpZkJvdW5kcy5nZXRNaW5YKCk7CiAgICAgICAgIHRoaXMuZk9yaWdpblkgPSAoZmxvYXQpZkJvdW5kcy5nZXRNaW5ZKCk7CkBAIC0xMTgsMTAgKzEzMywxMCBAQAogICAgICAqIENvbXBhcmVzIHRoaXMgU2hhcGVHcmFwaGljQXR0cmlidXRlIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkCiAgICAgICogU2hhcGVHcmFwaGljQXR0cmlidXRlIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2dhIHRoZSBTaGFwZUdyYXBoaWNBdHRyaWJ1dGUgb2JqZWN0IHRvIGJlIGNvbXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBTaGFwZUdyYXBoaWNBdHRyaWJ1dGUgb2JqZWN0IGlzIGVxdWFsCi0gICAgICogdG8gdGhlIHNwZWNpZmllZCBTaGFwZUdyYXBoaWNBdHRyaWJ1dGUgb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIHNnYQorICAgICAqICAgICAgICAgICAgdGhlIFNoYXBlR3JhcGhpY0F0dHJpYnV0ZSBvYmplY3QgdG8gYmUgY29tcGFyZWQuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIFNoYXBlR3JhcGhpY0F0dHJpYnV0ZSBvYmplY3QgaXMgZXF1YWwgdG8gdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgU2hhcGVHcmFwaGljQXR0cmlidXRlIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhTaGFwZUdyYXBoaWNBdHRyaWJ1dGUgc2dhKSB7CiAgICAgICAgIGlmIChzZ2EgPT0gbnVsbCkgewpAQCAtMTMyLDI3ICsxNDcsMjQgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuICggZlN0cm9rZSA9PSBzZ2EuZlN0cm9rZSAmJgotICAgICAgICAgICAgICAgIGdldEFsaWdubWVudCgpID09IHNnYS5nZXRBbGlnbm1lbnQoKSAmJgotICAgICAgICAgICAgICAgIGZTaGFwZS5lcXVhbHMoc2dhLmZTaGFwZSkpOworICAgICAgICByZXR1cm4gKGZTdHJva2UgPT0gc2dhLmZTdHJva2UgJiYgZ2V0QWxpZ25tZW50KCkgPT0gc2dhLmdldEFsaWdubWVudCgpICYmIGZTaGFwZQorICAgICAgICAgICAgICAgIC5lcXVhbHMoc2dhLmZTaGFwZSkpOwogCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhpcyBTaGFwZUdyYXBoaWNBdHRyaWJ1dGUgb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBPYmplY3QuCisgICAgICogQ29tcGFyZXMgdGhpcyBTaGFwZUdyYXBoaWNBdHRyaWJ1dGUgb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQgT2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBvYmogdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgU2hhcGVHcmFwaGljQXR0cmlidXRlIG9iamVjdCBpcyBlcXVhbAotICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgT2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgU2hhcGVHcmFwaGljQXR0cmlidXRlIG9iamVjdCBpcyBlcXVhbCB0byB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBPYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGVxdWFscygoU2hhcGVHcmFwaGljQXR0cmlidXRlKSBvYmopOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZXF1YWxzKChTaGFwZUdyYXBoaWNBdHRyaWJ1dGUpb2JqKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTE2MCw3ICsxNzIsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRyYXcoR3JhcGhpY3MyRCBnMiwgZmxvYXQgeCwgZmxvYXQgeSkgewogICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gYXQgPSBBZmZpbmVUcmFuc2Zvcm0uZ2V0VHJhbnNsYXRlSW5zdGFuY2UoeCwgeSk7Ci0gICAgICAgIGlmIChmU3Ryb2tlID09IFNUUk9LRSl7CisgICAgICAgIGlmIChmU3Ryb2tlID09IFNUUk9LRSkgewogICAgICAgICAgICAgU3Ryb2tlIG9sZFN0cm9rZSA9IGcyLmdldFN0cm9rZSgpOwogICAgICAgICAgICAgZzIuc2V0U3Ryb2tlKG5ldyBCYXNpY1N0cm9rZSgpKTsKICAgICAgICAgICAgIGcyLmRyYXcoYXQuY3JlYXRlVHJhbnNmb3JtZWRTaGFwZShmU2hhcGUpKTsKQEAgLTE5Miw0ICsyMDQsMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZm9udC9UZXh0SGl0SW5mby5qYXZhIGIvYXd0L2phdmEvYXd0L2ZvbnQvVGV4dEhpdEluZm8uamF2YQppbmRleCAxN2JiZjcxLi42NDYwZWJhIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZm9udC9UZXh0SGl0SW5mby5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9mb250L1RleHRIaXRJbmZvLmphdmEKQEAgLTIzLDI5ICsyMywzNiBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lm1pc2MuSGFzaENvZGU7CiAKLQogLyoqCi0gKiBUaGUgVGV4dEhpdEluZm8gY2xhc3MgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBjYXJldCBwb3NpdGlvbiAKLSAqIGluIGEgdGV4dCBtb2RlbCBmb3IgaW5zZXJ0aW9uIG9yIGRlbGV0aW9uIG9mIGEgY2hhcmFjdGVyIGluIGEgdGV4dC4KLSAqIFRoZSBUZXh0SGl0SW5mbyBkZWZpbmVzIHR3byBiaWFzZXMgb2YgdGhlIGNoYXJhY3RlcjogbGVhZGluZyBvciB0cmFpbGluZy4KLSAqIExlYWRpbmcgcG9zaXRpb24gbWVhbnMgdGhlIGxlZnQgZWRnZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciAKLSAqIChUZXh0SGl0SW5mby5sZWFkaW5nKDIpIG1ldGhvZCBmb3IgInRleHQiIHJldHVybnMgdGhlIGxlZnQgc2lkZSBvZiAieCIpLgotICogVHJhaWxpbmcgcG9zaXRpb24gbWVhbnMgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLSAqIChUZXh0SGl0SW5mby50cmFpbGluZygyKSBtZXRob2QgZm9yICJ0ZXh0IiByZXR1cm5zIHRoZSByaWdodCBzaWRlIG9mICJ4IikuCisgKiBUaGUgVGV4dEhpdEluZm8gY2xhc3MgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBjYXJldCBwb3NpdGlvbiBpbiBhIHRleHQKKyAqIG1vZGVsIGZvciBpbnNlcnRpb24gb3IgZGVsZXRpb24gb2YgYSBjaGFyYWN0ZXIgaW4gYSB0ZXh0LiBUaGUgVGV4dEhpdEluZm8KKyAqIGRlZmluZXMgdHdvIGJpYXNlcyBvZiB0aGUgY2hhcmFjdGVyOiBsZWFkaW5nIG9yIHRyYWlsaW5nLiBMZWFkaW5nIHBvc2l0aW9uCisgKiBtZWFucyB0aGUgbGVmdCBlZGdlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIChUZXh0SGl0SW5mby5sZWFkaW5nKDIpIG1ldGhvZAorICogZm9yICJ0ZXh0IiByZXR1cm5zIHRoZSBsZWZ0IHNpZGUgb2YgIngiKS4gVHJhaWxpbmcgcG9zaXRpb24gbWVhbnMgdGhlIHJpZ2h0CisgKiBlZGdlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIChUZXh0SGl0SW5mby50cmFpbGluZygyKSBtZXRob2QgZm9yICJ0ZXh0IgorICogcmV0dXJucyB0aGUgcmlnaHQgc2lkZSBvZiAieCIpLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFRleHRIaXRJbmZvIHsKLSAgICAKLSAgICAvKiogVGhlIGNoYXIgaWR4LiAqLworCisgICAgLyoqCisgICAgICogVGhlIGNoYXIgaWR4LgorICAgICAqLwogICAgIHByaXZhdGUgaW50IGNoYXJJZHg7IC8vIFJlcHJlc2VudHMgY2hhcmFjdGVyIGluZGV4IGluIHRoZSBsaW5lCi0gICAgCi0gICAgLyoqIFRoZSBpcyB0cmFpbGluZy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBpcyB0cmFpbGluZy4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gaXNUcmFpbGluZzsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyB0ZXh0IGhpdCBpbmZvLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpZHggdGhlIGlkeAotICAgICAqIEBwYXJhbSBpc1RyYWlsaW5nIHRoZSBpcyB0cmFpbGluZworICAgICAqIEBwYXJhbSBpZHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpZHguCisgICAgICogQHBhcmFtIGlzVHJhaWxpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBpcyB0cmFpbGluZy4KICAgICAgKi8KICAgICBwcml2YXRlIFRleHRIaXRJbmZvKGludCBpZHgsIGJvb2xlYW4gaXNUcmFpbGluZykgewogICAgICAgICBjaGFySWR4ID0gaWR4OwpAQCAtNTMsOTAgKzYwLDgyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVG8gc3RyaW5nLgorICAgICAqIFJldHVybnMgdGhlIHRleHR1YWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgVGV4dEhpdEluZm8gaW5zdGFuY2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKAotICAgICAgICAgICAgICAgICJUZXh0SGl0SW5mb1siICsgY2hhcklkeCArICIsICIgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICAoaXNUcmFpbGluZz8iVHJhaWxpbmciOiJMZWFkaW5nIikgKyAiXSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIlRleHRIaXRJbmZvWyIgKyBjaGFySWR4ICsgIiwgIiArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICAgICAgICAgIChpc1RyYWlsaW5nID8gIlRyYWlsaW5nIiA6ICJMZWFkaW5nIikgKyAiXSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKICAgICAgICAgKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDb21wYXJlcyB0aGlzIFRleHRIaXRJbmZvIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBvYmogdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGEgVGV4dEhpdEluZm8gb2JqZWN0IAotICAgICAqIHdpdGggdGhlIHNhbWUgZGF0YSB2YWx1ZXMgYXMgdGhpcyBUZXh0SGl0SW5mbywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhIFRleHRIaXRJbmZvIG9iamVjdCB3aXRoIHRoZQorICAgICAqICAgICAgICAgc2FtZSBkYXRhIHZhbHVlcyBhcyB0aGlzIFRleHRIaXRJbmZvLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFRleHRIaXRJbmZvKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXF1YWxzKChUZXh0SGl0SW5mbykgb2JqKTsKKyAgICAgICAgICAgIHJldHVybiBlcXVhbHMoKFRleHRIaXRJbmZvKW9iaik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoaXMgVGV4dEhpdEluZm8gb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBUZXh0SGl0SW5mbwotICAgICAqIG9iamVjdC4KKyAgICAgKiBDb21wYXJlcyB0aGlzIFRleHRIaXRJbmZvIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgVGV4dEhpdEluZm8gb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB0aGkgdGhlIFRleHRIaXRJbmZvIG9iamVjdCB0byBiZSBjb21wYXJlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGhpCisgICAgICogICAgICAgICAgICB0aGUgVGV4dEhpdEluZm8gb2JqZWN0IHRvIGJlIGNvbXBhcmVkLgogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBUZXh0SGl0SW5mbyBvYmplY3QgaGFzIHRoZSBzYW1lIGRhdGEgdmFsdWVzIGFzIHRoZQotICAgICAqIHNwZWNpZmllZCBUZXh0SGl0SW5mbyBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBUZXh0SGl0SW5mbyBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoVGV4dEhpdEluZm8gdGhpKSB7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIHRoaSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgdGhpLmNoYXJJZHggPT0gY2hhcklkeCAmJgotICAgICAgICAgICAgICAgIHRoaS5pc1RyYWlsaW5nID09IGlzVHJhaWxpbmc7CisgICAgICAgIHJldHVybiB0aGkgIT0gbnVsbCAmJiB0aGkuY2hhcklkeCA9PSBjaGFySWR4ICYmIHRoaS5pc1RyYWlsaW5nID09IGlzVHJhaWxpbmc7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIFRleHRIaXRJbmZvIG9iamVjdCB3aXRoIGl0cyBjaGFyYWN0ZXIgaW5kZXggCi0gICAgICogYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgZnJvbSB0aGUgY2hhcmFjdGVyIGluZGV4IG9mIAotICAgICAqIHRoaXMgVGV4dEhpdEluZm8uCisgICAgICogR2V0cyBhIFRleHRIaXRJbmZvIG9iamVjdCB3aXRoIGl0cyBjaGFyYWN0ZXIgaW5kZXggYXQgdGhlIHNwZWNpZmllZAorICAgICAqIG9mZnNldCBmcm9tIHRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgdGhpcyBUZXh0SGl0SW5mby4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgVGV4dEhpdEluZm8uIAorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQuCisgICAgICogQHJldHVybiB0aGUgVGV4dEhpdEluZm8uCiAgICAgICovCiAgICAgcHVibGljIFRleHRIaXRJbmZvIGdldE9mZnNldEhpdChpbnQgb2Zmc2V0KSB7CiAgICAgICAgIHJldHVybiBuZXcgVGV4dEhpdEluZm8oY2hhcklkeCArIG9mZnNldCwgaXNUcmFpbGluZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIFRleHRIaXRJbmZvIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3RoZXIgc2lkZSBvZiAKLSAgICAgKiB0aGUgaW5zZXJ0aW9uIHBvaW50LiAKLSAgICAgKiAgCisgICAgICogR2V0cyBhIFRleHRIaXRJbmZvIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgaW5zZXJ0aW9uIHBvaW50LgorICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIG90aGVyIGhpdC4KICAgICAgKi8KICAgICBwdWJsaWMgVGV4dEhpdEluZm8gZ2V0T3RoZXJIaXQoKSB7Ci0gICAgICAgIHJldHVybiBpc1RyYWlsaW5nID8KLSAgICAgICAgICAgICAgICBuZXcgVGV4dEhpdEluZm8oY2hhcklkeCsxLCBmYWxzZSkgOgotICAgICAgICAgICAgICAgIG5ldyBUZXh0SGl0SW5mbyhjaGFySWR4LTEsIHRydWUpOworICAgICAgICByZXR1cm4gaXNUcmFpbGluZyA/IG5ldyBUZXh0SGl0SW5mbyhjaGFySWR4ICsgMSwgZmFsc2UpCisgICAgICAgICAgICAgICAgOiBuZXcgVGV4dEhpdEluZm8oY2hhcklkeCAtIDEsIHRydWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSBjaGFyYWN0ZXIgaXMgaGl0LAotICAgICAqIGZhbHNlIGlmIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSBjaGFyYWN0ZXIgaXMgaGl0LgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSBjaGFyYWN0ZXIgaXMgaGl0LCBmYWxzZSBpZiB0aGUKKyAgICAgKiB0cmFpbGluZyBlZGdlIG9mIHRoZSBjaGFyYWN0ZXIgaXMgaGl0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSBjaGFyYWN0ZXIgaXMgaGl0LAotICAgICAqIGZhbHNlIGlmIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSBjaGFyYWN0ZXIgaXMgaGl0LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSBjaGFyYWN0ZXIgaXMgaGl0LCBmYWxzZSBpZiB0aGUKKyAgICAgKiAgICAgICAgIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGNoYXJhY3RlciBpcyBoaXQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNMZWFkaW5nRWRnZSgpIHsKICAgICAgICAgcmV0dXJuICFpc1RyYWlsaW5nOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEhhc2ggY29kZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgdmFsdWUgb2YgdGhpcyBUZXh0SGl0SW5mbyBpbnN0YW5jZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgdmFsdWUuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKQEAgLTE0NiwxMSArMTQ1LDExIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgaW5zZXJ0aW9uIGluZGV4LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGluc2VydGlvbiBpbmRleDogY2hhcmFjdGVyIGluZGV4IGlmIHRoZSBsZWFkaW5nIGVkZ2UKLSAgICAgKiBpcyBoaXQsIG9yIGNoYXJhY3RlciBpbmRleCArIDEgaWYgdGhlIHRyYWlsaW5nIGVkZ2UgaXMgaGl0LiAgIAorICAgICAqIEByZXR1cm4gdGhlIGluc2VydGlvbiBpbmRleDogY2hhcmFjdGVyIGluZGV4IGlmIHRoZSBsZWFkaW5nIGVkZ2UgaXMgaGl0LAorICAgICAqICAgICAgICAgb3IgY2hhcmFjdGVyIGluZGV4ICsgMSBpZiB0aGUgdHJhaWxpbmcgZWRnZSBpcyBoaXQuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRJbnNlcnRpb25JbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIGlzVHJhaWxpbmcgPyBjaGFySWR4KzEgOiBjaGFySWR4OworICAgICAgICByZXR1cm4gaXNUcmFpbGluZyA/IGNoYXJJZHggKyAxIDogY2hhcklkeDsKICAgICB9CiAKICAgICAvKioKQEAgLTE2Myw1MiArMTYyLDUyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIFRleHRIaXRJbmZvIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhaWxpbmcgZWRnZSBvZiAKLSAgICAgKiB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgY2hhciBpbmRleC4KKyAgICAgKiBSZXR1cm5zIGEgVGV4dEhpdEluZm8gYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSBjaGFyYWN0ZXIKKyAgICAgKiBhdCB0aGUgc3BlY2lmaWVkIGNoYXIgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGNoYXJJbmRleCB0aGUgY2hhciBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgCi0gICAgICogdGhlIGNoYXJhY3RlciBhdCB0aGUgc3BlY2lmaWVkIGNoYXIgaW5kZXguCisgICAgICogQHBhcmFtIGNoYXJJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGNoYXIgaW5kZXguCisgICAgICogQHJldHVybiB0aGUgVGV4dEhpdEluZm8gYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZQorICAgICAqICAgICAgICAgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgY2hhciBpbmRleC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFRleHRIaXRJbmZvIHRyYWlsaW5nKGludCBjaGFySW5kZXgpIHsKICAgICAgICAgcmV0dXJuIG5ldyBUZXh0SGl0SW5mbyhjaGFySW5kZXgsIHRydWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBUZXh0SGl0SW5mbyBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBsZWFkaW5nIGVkZ2UgCi0gICAgICogb2YgdGhlIGNoYXJhY3RlciBhdCB0aGUgc3BlY2lmaWVkIGNoYXIgaW5kZXguCisgICAgICogUmV0dXJucyBhIFRleHRIaXRJbmZvIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUKKyAgICAgKiBjaGFyYWN0ZXIgYXQgdGhlIHNwZWNpZmllZCBjaGFyIGluZGV4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjaGFySW5kZXggdGhlIGNoYXIgaW5kZXguCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgVGV4dEhpdEluZm8gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbGVhZGluZyBlZGdlIAotICAgICAqIG9mIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHNwZWNpZmllZCBjaGFyIGluZGV4LgorICAgICAqIEBwYXJhbSBjaGFySW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIGluZGV4LgorICAgICAqIEByZXR1cm4gdGhlIFRleHRIaXRJbmZvIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUKKyAgICAgKiAgICAgICAgIGNoYXJhY3RlciBhdCB0aGUgc3BlY2lmaWVkIGNoYXIgaW5kZXguCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBUZXh0SGl0SW5mbyBsZWFkaW5nKGludCBjaGFySW5kZXgpIHsKICAgICAgICAgcmV0dXJuIG5ldyBUZXh0SGl0SW5mbyhjaGFySW5kZXgsIGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgKHRyYWlsaW5nKSBUZXh0SGl0SW5mbyBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBjaGFyYWN0ZXIgCisgICAgICogUmV0dXJucyBhICh0cmFpbGluZykgVGV4dEhpdEluZm8gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY2hhcmFjdGVyCiAgICAgICogYmVmb3JlIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBjaGFyYWN0ZXIgCi0gICAgICogYmVmb3JlIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQuCisgICAgICogQHJldHVybiB0aGUgVGV4dEhpdEluZm8gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBvZmZzZXQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBUZXh0SGl0SW5mbyBiZWZvcmVPZmZzZXQoaW50IG9mZnNldCkgewotICAgICAgICByZXR1cm4gbmV3IFRleHRIaXRJbmZvKG9mZnNldC0xLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXh0SGl0SW5mbyhvZmZzZXQgLSAxLCB0cnVlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgKGxlYWRpbmcpIFRleHRIaXRJbmZvIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGNoYXJhY3RlciAKKyAgICAgKiBSZXR1cm5zIGEgKGxlYWRpbmcpIFRleHRIaXRJbmZvIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGNoYXJhY3RlcgogICAgICAqIGFmdGVyIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBjaGFyYWN0ZXIgCi0gICAgICogYWZ0ZXIgdGhlIHNwZWNpZmllZCBvZmZzZXQuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldC4KKyAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgb2Zmc2V0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgVGV4dEhpdEluZm8gYWZ0ZXJPZmZzZXQoaW50IG9mZnNldCkgewogICAgICAgICByZXR1cm4gbmV3IFRleHRIaXRJbmZvKG9mZnNldCwgZmFsc2UpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ZvbnQvVGV4dExheW91dC5qYXZhIGIvYXd0L2phdmEvYXd0L2ZvbnQvVGV4dExheW91dC5qYXZhCmluZGV4IGU4MGFmZDAuLmNjNmYwYmEgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9mb250L1RleHRMYXlvdXQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZm9udC9UZXh0TGF5b3V0LmphdmEKQEAgLTM5LDE4ICszOSwxOSBAQAogCiAvKioKICAqIFRoZSBUZXh0TGF5b3V0IGNsYXNzIGRlZmluZXMgdGhlIGdyYXBoaWNhbCByZXByZXNlbnRhdGlvbiBvZiBjaGFyYWN0ZXIgZGF0YS4KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgbWV0aG9kIGZvciBvYnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgY3Vyc29yIAotICogcG9zaXRpb25pbmcgYW5kIG1vdmVtZW50LCBzcGxpdCBjdXJzb3JzIGZvciB0ZXh0IHdpdGggZGlmZmVyZW50IGRpcmVjdGlvbnMsIAotICogbG9naWNhbCBhbmQgdmlzdWFsIGhpZ2hsaWdodGluZywgbXVsdGlwbGUgYmFzZWxpbmVzLCBoaXRzLCBqdXN0aWZpY2F0aW9uLCAKLSAqIGFzY2VudCwgZGVzY2VudCwgYW5kIGFkdmFuY2UsIGFuZCByZW5kZXJpbmcuIEEgVGV4dExheW91dCBvYmplY3QgY2FuIGJlIAotICogcmVuZGVyZWQgdXNpbmcgR3JhcGhpY3MgY29udGV4dC4gCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIG1ldGhvZCBmb3Igb2J0YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGN1cnNvciBwb3NpdGlvbmluZworICogYW5kIG1vdmVtZW50LCBzcGxpdCBjdXJzb3JzIGZvciB0ZXh0IHdpdGggZGlmZmVyZW50IGRpcmVjdGlvbnMsIGxvZ2ljYWwgYW5kCisgKiB2aXN1YWwgaGlnaGxpZ2h0aW5nLCBtdWx0aXBsZSBiYXNlbGluZXMsIGhpdHMsIGp1c3RpZmljYXRpb24sIGFzY2VudCwKKyAqIGRlc2NlbnQsIGFuZCBhZHZhbmNlLCBhbmQgcmVuZGVyaW5nLiBBIFRleHRMYXlvdXQgb2JqZWN0IGNhbiBiZSByZW5kZXJlZAorICogdXNpbmcgR3JhcGhpY3MgY29udGV4dC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBUZXh0TGF5b3V0IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKIAogICAgIC8qKgotICAgICAqIFRoZSBDYXJldFBvbGljeSBjbGFzcyBwcm92aWRlcyBhIHBvbGljeSBmb3Igb2J0YWluaW5nIHRoZSAKLSAgICAgKiBjYXJldCBsb2NhdGlvbi4gVGhlIHNpbmdsZSBnZXRTdHJvbmdDYXJldCBtZXRob2Qgc3BlY2lmaWVzIAotICAgICAqIHRoZSBwb2xpY3kuCisgICAgICogVGhlIENhcmV0UG9saWN5IGNsYXNzIHByb3ZpZGVzIGEgcG9saWN5IGZvciBvYnRhaW5pbmcgdGhlIGNhcmV0IGxvY2F0aW9uLgorICAgICAqIFRoZSBzaW5nbGUgZ2V0U3Ryb25nQ2FyZXQgbWV0aG9kIHNwZWNpZmllcyB0aGUgcG9saWN5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FyZXRQb2xpY3kgewogCkBAIC02MiwxNCArNjMsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHdoaWNoZXZlciBvZiB0aGUgdHdvIHNwZWNpZmllZCBUZXh0SGl0SW5mbyBvYmplY3RzIAotICAgICAgICAgKiBoYXMgdGhlIHN0cm9uZ2VyIGNhcmV0IChoaWdoZXIgY2hhcmFjdGVyIGxldmVsKSBpbiB0aGUgCi0gICAgICAgICAqIHNwZWNpZmllZCBUZXh0TGF5b3V0LgorICAgICAgICAgKiBSZXR1cm5zIHdoaWNoZXZlciBvZiB0aGUgdHdvIHNwZWNpZmllZCBUZXh0SGl0SW5mbyBvYmplY3RzIGhhcyB0aGUKKyAgICAgICAgICogc3Ryb25nZXIgY2FyZXQgKGhpZ2hlciBjaGFyYWN0ZXIgbGV2ZWwpIGluIHRoZSBzcGVjaWZpZWQgVGV4dExheW91dC4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBoaXQxIHRoZSBmaXJzdCBUZXh0SGl0SW5mbyBvZiB0aGUgc3BlY2lmaWVkIFRleHRMYXlvdXQuCi0gICAgICAgICAqIEBwYXJhbSBoaXQyIHRoZSBzZWNvbmQgVGV4dEhpdEluZm8gb2YgdGhlIHNwZWNpZmllZCBUZXh0TGF5b3V0LgotICAgICAgICAgKiBAcGFyYW0gbGF5b3V0IHRoZSBUZXh0TGF5b3V0LgotICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGhpdDEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgVGV4dEhpdEluZm8gb2YgdGhlIHNwZWNpZmllZCBUZXh0TGF5b3V0LgorICAgICAgICAgKiBAcGFyYW0gaGl0MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgVGV4dEhpdEluZm8gb2YgdGhlIHNwZWNpZmllZCBUZXh0TGF5b3V0LgorICAgICAgICAgKiBAcGFyYW0gbGF5b3V0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIFRleHRMYXlvdXQuCiAgICAgICAgICAqIEByZXR1cm4gdGhlIFRleHRIaXRJbmZvIHdpdGggdGhlIHN0cm9uZ2VyIGNhcmV0LgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFRleHRIaXRJbmZvIGdldFN0cm9uZ0NhcmV0KFRleHRIaXRJbmZvIGhpdDEsIFRleHRIaXRJbmZvIGhpdDIsIFRleHRMYXlvdXQgbGF5b3V0KSB7CkBAIC04Nyw1MCArODksNjQgQEAKIAogICAgIH0KIAotICAgIC8qKiAKKyAgICAvKioKICAgICAgKiBUaGUgQ29uc3RhbnQgREVGQVVMVF9DQVJFVF9QT0xJQ1kgaW5kaWNhdGVzIHRoZSBkZWZhdWx0IGNhcmV0IHBvbGljeS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRleHRMYXlvdXQuQ2FyZXRQb2xpY3kgREVGQVVMVF9DQVJFVF9QT0xJQ1kgPSBuZXcgQ2FyZXRQb2xpY3koKTsKIAotICAgIC8qKiBUaGUgYnJlYWtlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgYnJlYWtlci4KKyAgICAgKi8KICAgICBwcml2YXRlIFRleHRSdW5CcmVha2VyIGJyZWFrZXI7Ci0gICAgCi0gICAgLyoqIFRoZSBtZXRyaWNzIHZhbGlkLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG1ldHJpY3MgdmFsaWQuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIG1ldHJpY3NWYWxpZCA9IGZhbHNlOwotICAgIAotICAgIC8qKiBUaGUgdG1jLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHRtYy4KKyAgICAgKi8KICAgICBwcml2YXRlIFRleHRNZXRyaWNzQ2FsY3VsYXRvciB0bWM7Ci0gICAgCi0gICAgLyoqIFRoZSBtZXRyaWNzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG1ldHJpY3MuCisgICAgICovCiAgICAgcHJpdmF0ZSBCYXNpY01ldHJpY3MgbWV0cmljczsKLSAgICAKLSAgICAvKiogVGhlIGNhcmV0IG1hbmFnZXIuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2FyZXQgbWFuYWdlci4KKyAgICAgKi8KICAgICBwcml2YXRlIENhcmV0TWFuYWdlciBjYXJldE1hbmFnZXI7Ci0gICAgCi0gICAgLyoqIFRoZSBqdXN0aWZpY2F0aW9uIHdpZHRoLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGp1c3RpZmljYXRpb24gd2lkdGguCisgICAgICovCiAgICAgZmxvYXQganVzdGlmaWNhdGlvbldpZHRoID0gLTE7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgVGV4dExheW91dCBvYmplY3QgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZwotICAgICAqIGFuZCBGb250LgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBUZXh0TGF5b3V0IG9iamVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBGb250LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQuCi0gICAgICogQHBhcmFtIGZvbnQgdGhlIGZvbnQgb2YgdGhlIHRleHQuCi0gICAgICogQHBhcmFtIGZyYyB0aGUgRm9udFJlbmRlckNvbnRleHQgb2JqZWN0IGZvciBvYnRhaW5pbmcKLSAgICAgKiBpbmZvcm1hdGlvbiBhYm91dCBhIGdyYXBoaWNzIGRldmljZS4KKyAgICAgKiBAcGFyYW0gc3RyaW5nCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZC4KKyAgICAgKiBAcGFyYW0gZm9udAorICAgICAqICAgICAgICAgICAgdGhlIGZvbnQgb2YgdGhlIHRleHQuCisgICAgICogQHBhcmFtIGZyYworICAgICAqICAgICAgICAgICAgdGhlIEZvbnRSZW5kZXJDb250ZXh0IG9iamVjdCBmb3Igb2J0YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGEKKyAgICAgKiAgICAgICAgICAgIGdyYXBoaWNzIGRldmljZS4KICAgICAgKi8KICAgICBwdWJsaWMgVGV4dExheW91dChTdHJpbmcgc3RyaW5nLCBGb250IGZvbnQsIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgewotICAgICAgICBpZiAoc3RyaW5nID09IG51bGwpeworICAgICAgICBpZiAoc3RyaW5nID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGF3dC4wMT0nezB9JyBwYXJhbWV0ZXIgaXMgbnVsbAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4wMSIsICJzdHJpbmciKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZm9udCA9PSBudWxsKXsKKworICAgICAgICBpZiAoZm9udCA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBhd3QuMDE9J3swfScgcGFyYW1ldGVyIGlzIG51bGwKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMDEiLCAiZm9udCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApeworICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKICAgICAgICAgICAgIC8vIGF3dC4wMj0nezB9JyBwYXJhbWV0ZXIgaGFzIHplcm8gbGVuZ3RoCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjAyIiwgInN0cmluZyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAgICAgICAgIH0KQEAgLTE0MiwzNSArMTU4LDM1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFRleHRMYXlvdXQgZnJvbSB0aGUgc3BlY2lmaWVkIHRleHQgYW5kIAotICAgICAqIGEgbWFwIG9mIGF0dHJpYnV0ZXMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFRleHRMYXlvdXQgZnJvbSB0aGUgc3BlY2lmaWVkIHRleHQgYW5kIGEgbWFwIG9mCisgICAgICogYXR0cmlidXRlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkLgotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIHRvIGJlIHVzZWQgZm9yIG9idGFpbmluZyB0aGUgdGV4dCAKLSAgICAgKiBzdHlsZS4KLSAgICAgKiBAcGFyYW0gZnJjIHRoZSBGb250UmVuZGVyQ29udGV4dCBvYmplY3QgZm9yIG9idGFpbmluZwotICAgICAqIGluZm9ybWF0aW9uIGFib3V0IGEgZ3JhcGhpY3MgZGV2aWNlLgorICAgICAqIEBwYXJhbSBzdHJpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkLgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzCisgICAgICogICAgICAgICAgICB0aGUgYXR0cmlidXRlcyB0byBiZSB1c2VkIGZvciBvYnRhaW5pbmcgdGhlIHRleHQgc3R5bGUuCisgICAgICogQHBhcmFtIGZyYworICAgICAqICAgICAgICAgICAgdGhlIEZvbnRSZW5kZXJDb250ZXh0IG9iamVjdCBmb3Igb2J0YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGEKKyAgICAgKiAgICAgICAgICAgIGdyYXBoaWNzIGRldmljZS4KICAgICAgKi8KLSAgICBwdWJsaWMgVGV4dExheW91dCgKLSAgICAgICAgICAgIFN0cmluZyBzdHJpbmcsCisgICAgcHVibGljIFRleHRMYXlvdXQoU3RyaW5nIHN0cmluZywKICAgICAgICAgICAgIE1hcDw/IGV4dGVuZHMgamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGUsID8+IGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICBGb250UmVuZGVyQ29udGV4dCBmcmMgKSB7Ci0gICAgICAgIGlmIChzdHJpbmcgPT0gbnVsbCl7CisgICAgICAgICAgICBGb250UmVuZGVyQ29udGV4dCBmcmMpIHsKKyAgICAgICAgaWYgKHN0cmluZyA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBhd3QuMDE9J3swfScgcGFyYW1ldGVyIGlzIG51bGwKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMDEiLCAic3RyaW5nIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCl7CisKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gYXd0LjAxPSd7MH0nIHBhcmFtZXRlciBpcyBudWxsCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjAxIiwgImF0dHJpYnV0ZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApeworCisgICAgICAgIGlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewogICAgICAgICAgICAgLy8gYXd0LjAyPSd7MH0nIHBhcmFtZXRlciBoYXMgemVybyBsZW5ndGgKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMDIiLCAic3RyaW5nIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgCisKICAgICAgICAgQXR0cmlidXRlZFN0cmluZyBhcyA9IG5ldyBBdHRyaWJ1dGVkU3RyaW5nKHN0cmluZyk7CiAgICAgICAgIGFzLmFkZEF0dHJpYnV0ZXMoYXR0cmlidXRlcywgMCwgc3RyaW5nLmxlbmd0aCgpKTsKICAgICAgICAgdGhpcy5icmVha2VyID0gbmV3IFRleHRSdW5CcmVha2VyKGFzLmdldEl0ZXJhdG9yKCksIGZyYyk7CkBAIC0xODAsMTcgKzE5NiwxOSBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBUZXh0TGF5b3V0IGZyb20gdGhlIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGV4dCB0aGUgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLgotICAgICAqIEBwYXJhbSBmcmMgdGhlIEZvbnRSZW5kZXJDb250ZXh0IG9iamVjdCBmb3Igb2J0YWluaW5nCi0gICAgICogaW5mb3JtYXRpb24gYWJvdXQgYSBncmFwaGljcyBkZXZpY2UuCisgICAgICogQHBhcmFtIHRleHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuCisgICAgICogQHBhcmFtIGZyYworICAgICAqICAgICAgICAgICAgdGhlIEZvbnRSZW5kZXJDb250ZXh0IG9iamVjdCBmb3Igb2J0YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGEKKyAgICAgKiAgICAgICAgICAgIGdyYXBoaWNzIGRldmljZS4KICAgICAgKi8KICAgICBwdWJsaWMgVGV4dExheW91dChBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgdGV4dCwgRm9udFJlbmRlckNvbnRleHQgZnJjKSB7Ci0gICAgICAgIGlmICh0ZXh0ID09IG51bGwpeworICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBhd3QuMDM9J3swfScgaXRlcmF0b3IgcGFyYW1ldGVyIGlzIG51bGwKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMDMiLCAidGV4dCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICh0ZXh0LmdldEJlZ2luSW5kZXgoKSA9PSB0ZXh0LmdldEVuZEluZGV4KCkpeworCisgICAgICAgIGlmICh0ZXh0LmdldEJlZ2luSW5kZXgoKSA9PSB0ZXh0LmdldEVuZEluZGV4KCkpIHsKICAgICAgICAgICAgIC8vIGF3dC4wND0nezB9JyBpdGVyYXRvciBwYXJhbWV0ZXIgaGFzIHplcm8gbGVuZ3RoCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjA0IiwgInRleHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogICAgICAgICB9CkBAIC0yMDIsNyArMjIwLDggQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgdGV4dCBsYXlvdXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJyZWFrZXIgdGhlIGJyZWFrZXIKKyAgICAgKiBAcGFyYW0gYnJlYWtlcgorICAgICAqICAgICAgICAgICAgdGhlIGJyZWFrZXIuCiAgICAgICovCiAgICAgVGV4dExheW91dChUZXh0UnVuQnJlYWtlciBicmVha2VyKSB7CiAgICAgICAgIHRoaXMuYnJlYWtlciA9IGJyZWFrZXI7CkBAIC0yMjYsNyArMjQ1LDcgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgT2JqZWN0IGNsb25lKCkgewotICAgICAgICBUZXh0TGF5b3V0IHJlcyA9IG5ldyBUZXh0TGF5b3V0KChUZXh0UnVuQnJlYWtlcikgYnJlYWtlci5jbG9uZSgpKTsKKyAgICAgICAgVGV4dExheW91dCByZXMgPSBuZXcgVGV4dExheW91dCgoVGV4dFJ1bkJyZWFrZXIpYnJlYWtlci5jbG9uZSgpKTsKIAogICAgICAgICBpZiAoanVzdGlmaWNhdGlvbldpZHRoID49IDApIHsKICAgICAgICAgICAgIHJlcy5oYW5kbGVKdXN0aWZ5KGp1c3RpZmljYXRpb25XaWR0aCk7CkBAIC0yMzgsMTAgKzI1NywxMCBAQAogICAgIC8qKgogICAgICAqIENvbXBhcmVzIHRoaXMgVGV4dExheW91dCBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBUZXh0TGF5b3V0IG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGF5b3V0IHRoZSBUZXh0TGF5b3V0IG9iamVjdCB0byBiZSBjb21wYXJlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgVGV4dExheW91dCBvYmplY3QgaXMgZXF1YWwgdG8gCi0gICAgICogdGhlIHNwZWNpZmllZCBUZXh0TGF5b3V0IG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBsYXlvdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBUZXh0TGF5b3V0IG9iamVjdCB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgVGV4dExheW91dCBvYmplY3QgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgVGV4dExheW91dCBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoVGV4dExheW91dCBsYXlvdXQpIHsKICAgICAgICAgaWYgKGxheW91dCA9PSBudWxsKSB7CkBAIC0yNTMsMTQgKzI3MiwxNCBAQAogICAgIC8qKgogICAgICAqIENvbXBhcmVzIHRoaXMgVGV4dExheW91dCBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBPYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9iaiB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBUZXh0TGF5b3V0IG9iamVjdCBpcyBlcXVhbCB0byAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIE9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIFRleHRMYXlvdXQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgT2JqZWN0LAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBUZXh0TGF5b3V0ID8gZXF1YWxzKChUZXh0TGF5b3V0KSBvYmopIDogZmFsc2U7CisgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBUZXh0TGF5b3V0ID8gZXF1YWxzKChUZXh0TGF5b3V0KW9iaikgOiBmYWxzZTsKICAgICB9CiAKICAgICAvKioKQEAgLTI3NCwxNiArMjkzLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRHJhd3MgdGhpcyBUZXh0TGF5b3V0IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gd2l0aCB0aGUgCi0gICAgICogc3BlY2lmaWVkIEdyYXBoaWNzMkQgY29udGV4dC4gCisgICAgICogRHJhd3MgdGhpcyBUZXh0TGF5b3V0IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogR3JhcGhpY3MyRCBjb250ZXh0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBnMmQgdGhlIEdyYXBoaWNzMkQgb2JqZWN0IHdoaWNoIHJlbmRlcnMgdGhpcyBUZXh0TGF5b3V0LgotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIFRleHRMYXlvdXQgb3JpZ2luLiAKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBUZXh0TGF5b3V0IG9yaWdpbi4KKyAgICAgKiBAcGFyYW0gZzJkCisgICAgICogICAgICAgICAgICB0aGUgR3JhcGhpY3MyRCBvYmplY3Qgd2hpY2ggcmVuZGVycyB0aGlzIFRleHRMYXlvdXQuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIFRleHRMYXlvdXQgb3JpZ2luLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBUZXh0TGF5b3V0IG9yaWdpbi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkcmF3KEdyYXBoaWNzMkQgZzJkLCBmbG9hdCB4LCBmbG9hdCB5KSB7CiAgICAgICAgIHVwZGF0ZU1ldHJpY3MoKTsKLSAgICAgICAgYnJlYWtlci5kcmF3U2VnbWVudHMoZzJkLCB4ICx5KTsKKyAgICAgICAgYnJlYWtlci5kcmF3U2VnbWVudHMoZzJkLCB4LCB5KTsKICAgICB9CiAKICAgICAvKioKQEAgLTMyNSwxNSArMzQ3LDE1IEBACiAgICAgICovCiAgICAgcHVibGljIGJ5dGUgZ2V0QmFzZWxpbmUoKSB7CiAgICAgICAgIHVwZGF0ZU1ldHJpY3MoKTsKLSAgICAgICAgcmV0dXJuIChieXRlKSBtZXRyaWNzLmdldEJhc2VMaW5lSW5kZXgoKTsKKyAgICAgICAgcmV0dXJuIChieXRlKW1ldHJpY3MuZ2V0QmFzZUxpbmVJbmRleCgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZsb2F0IGFycmF5IG9mIG9mZnNldHMgZm9yIHRoZSBiYXNlbGluZXMgd2hpY2ggCi0gICAgICogYXJlIHVzZWQgaW4gdGhpcyBUZXh0TGF5b3V0LgorICAgICAqIEdldHMgdGhlIGZsb2F0IGFycmF5IG9mIG9mZnNldHMgZm9yIHRoZSBiYXNlbGluZXMgd2hpY2ggYXJlIHVzZWQgaW4gdGhpcworICAgICAqIFRleHRMYXlvdXQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmxvYXQgYXJyYXkgb2Ygb2Zmc2V0cyBmb3IgdGhlIGJhc2VsaW5lcyB3aGljaCAKLSAgICAgKiBhcmUgdXNlZCBpbiB0aGlzIFRleHRMYXlvdXQuCisgICAgICogQHJldHVybiB0aGUgZmxvYXQgYXJyYXkgb2Ygb2Zmc2V0cyBmb3IgdGhlIGJhc2VsaW5lcyB3aGljaCBhcmUgdXNlZCBpbgorICAgICAqICAgICAgICAgdGhpcyBUZXh0TGF5b3V0LgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdFtdIGdldEJhc2VsaW5lT2Zmc2V0cygpIHsKICAgICAgICAgdXBkYXRlTWV0cmljcygpOwpAQCAtMzQxLDE0ICszNjMsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBibGFjayBib3ggYm91bmRzIG9mIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzcGVjaWZpZWQgYXJlYS4gCi0gICAgICogVGhlIGJsYWNrIGJveCBib3VuZHMgaXMgYW4gU2hhcGUgd2hpY2ggY29udGFpbnMgYWxsIAotICAgICAqIGJvdW5kaW5nIGJveGVzIG9mIGFsbCB0aGUgZ2x5cGhzIG9mIHRoZSBjaGFyYWN0ZXJzIAotICAgICAqIGJldHdlZW4gZmlyc3RFbmRwb2ludCBhbmQgc2Vjb25kRW5kcG9pbnQgcGFyYW1ldGVycyB2YWx1ZXMuICAgICAKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGZpcnN0RW5kcG9pbnQgdGhlIGZpcnN0IHBvaW50IG9mIHRoZSBhcmVhLgotICAgICAqIEBwYXJhbSBzZWNvbmRFbmRwb2ludCB0aGUgc2Vjb25kIHBvaW50IG9mIHRoZSBhcmVhLgorICAgICAqIEdldHMgdGhlIGJsYWNrIGJveCBib3VuZHMgb2YgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHNwZWNpZmllZCBhcmVhLiBUaGUKKyAgICAgKiBibGFjayBib3ggYm91bmRzIGlzIGFuIFNoYXBlIHdoaWNoIGNvbnRhaW5zIGFsbCBib3VuZGluZyBib3hlcyBvZiBhbGwgdGhlCisgICAgICogZ2x5cGhzIG9mIHRoZSBjaGFyYWN0ZXJzIGJldHdlZW4gZmlyc3RFbmRwb2ludCBhbmQgc2Vjb25kRW5kcG9pbnQKKyAgICAgKiBwYXJhbWV0ZXJzIHZhbHVlcy4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmlyc3RFbmRwb2ludAorICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvaW50IG9mIHRoZSBhcmVhLgorICAgICAqIEBwYXJhbSBzZWNvbmRFbmRwb2ludAorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBwb2ludCBvZiB0aGUgYXJlYS4KICAgICAgKiBAcmV0dXJuIHRoZSBTaGFwZSB3aGljaCBjb250YWlucyBibGFjayBib3ggYm91bmRzLgogICAgICAqLwogICAgIHB1YmxpYyBTaGFwZSBnZXRCbGFja0JveEJvdW5kcyhpbnQgZmlyc3RFbmRwb2ludCwgaW50IHNlY29uZEVuZHBvaW50KSB7CkBAIC0zNzIsOCArMzk1LDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjYXJldCBvZiB0aGUgc3BlY2lmaWVkIFRleHRIaXRJbmZvLgogICAgICAqIAotICAgICAqIEBwYXJhbSBoaXRJbmZvIHRoZSBUZXh0SGl0SW5mby4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaGl0SW5mbworICAgICAqICAgICAgICAgICAgdGhlIFRleHRIaXRJbmZvLgogICAgICAqIEByZXR1cm4gdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjYXJldCBvZiB0aGUgc3BlY2lmaWVkIFRleHRIaXRJbmZvLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdFtdIGdldENhcmV0SW5mbyhUZXh0SGl0SW5mbyBoaXRJbmZvKSB7CkBAIC0zODIsMTIgKzQwNSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhcmV0IG9mIHRoZSBzcGVjaWZpZWQgVGV4dEhpdEluZm8KLSAgICAgKiBvZiBhIGNoYXJhY3RlciBpbiB0aGlzIFRleHRMYXlvdXQuCisgICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2FyZXQgb2YgdGhlIHNwZWNpZmllZCBUZXh0SGl0SW5mbyBvZiBhCisgICAgICogY2hhcmFjdGVyIGluIHRoaXMgVGV4dExheW91dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGl0SW5mbyB0aGUgVGV4dEhpdEluZm8gb2YgYSBjaGFyYWN0ZXIgaW4gdGhpcyBUZXh0TGF5b3V0LgotICAgICAqIEBwYXJhbSBib3VuZHMgdGhlIGJvdW5kcyB0byB3aGljaCB0aGUgY2FyZXQgaW5mbyBpcyBjb25zdHJ1Y3RlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaGl0SW5mbworICAgICAqICAgICAgICAgICAgdGhlIFRleHRIaXRJbmZvIG9mIGEgY2hhcmFjdGVyIGluIHRoaXMgVGV4dExheW91dC4KKyAgICAgKiBAcGFyYW0gYm91bmRzCisgICAgICogICAgICAgICAgICB0aGUgYm91bmRzIHRvIHdoaWNoIHRoZSBjYXJldCBpbmZvIGlzIGNvbnN0cnVjdGVkLgogICAgICAqIEByZXR1cm4gdGhlIGNhcmV0IG9mIHRoZSBzcGVjaWZpZWQgVGV4dEhpdEluZm8uCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0W10gZ2V0Q2FyZXRJbmZvKFRleHRIaXRJbmZvIGhpdEluZm8sIFJlY3RhbmdsZTJEIGJvdW5kcykgewpAQCAtMzk2LDEyICs0MjAsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgU2hhcGUgd2hpY2ggcmVwcmVzZW50cyB0aGUgY2FyZXQgb2YgdGhlIHNwZWNpZmllZCBUZXh0SGl0SW5mbwotICAgICAqIGluIHRoZSBib3VuZHMgb2YgdGhpcyBUZXh0TGF5b3V0LgorICAgICAqIEdldHMgYSBTaGFwZSB3aGljaCByZXByZXNlbnRzIHRoZSBjYXJldCBvZiB0aGUgc3BlY2lmaWVkIFRleHRIaXRJbmZvIGluCisgICAgICogdGhlIGJvdW5kcyBvZiB0aGlzIFRleHRMYXlvdXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGhpdEluZm8gdGhlIFRleHRIaXRJbmZvLgotICAgICAqIEBwYXJhbSBib3VuZHMgdGhlIGJvdW5kcyB0byB3aGljaCB0aGUgY2FyZXQgaW5mbyBpcyBjb25zdHJ1Y3RlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaGl0SW5mbworICAgICAqICAgICAgICAgICAgdGhlIFRleHRIaXRJbmZvLgorICAgICAqIEBwYXJhbSBib3VuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBib3VuZHMgdG8gd2hpY2ggdGhlIGNhcmV0IGluZm8gaXMgY29uc3RydWN0ZWQuCiAgICAgICogQHJldHVybiB0aGUgU2hhcGUgd2hpY2ggcmVwcmVzZW50cyB0aGUgY2FyZXQuCiAgICAgICovCiAgICAgcHVibGljIFNoYXBlIGdldENhcmV0U2hhcGUoVGV4dEhpdEluZm8gaGl0SW5mbywgUmVjdGFuZ2xlMkQgYm91bmRzKSB7CkBAIC00MTAsMTEgKzQzNSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYSBTaGFwZSB3aGljaCByZXByZXNlbnRzIHRoZSBjYXJldCBvZiB0aGUgc3BlY2lmaWVkIFRleHRIaXRJbmZvCi0gICAgICogaW4gdGhlIGJvdW5kcyBvZiB0aGlzIFRleHRMYXlvdXQuCisgICAgICogR2V0cyBhIFNoYXBlIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNhcmV0IG9mIHRoZSBzcGVjaWZpZWQgVGV4dEhpdEluZm8gaW4KKyAgICAgKiB0aGUgYm91bmRzIG9mIHRoaXMgVGV4dExheW91dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGl0SW5mbyB0aGUgVGV4dEhpdEluZm8uCi0gICAgICogCisgICAgICogQHBhcmFtIGhpdEluZm8KKyAgICAgKiAgICAgICAgICAgIHRoZSBUZXh0SGl0SW5mby4KICAgICAgKiBAcmV0dXJuIHRoZSBTaGFwZSB3aGljaCByZXByZXNlbnRzIHRoZSBjYXJldC4KICAgICAgKi8KICAgICBwdWJsaWMgU2hhcGUgZ2V0Q2FyZXRTaGFwZShUZXh0SGl0SW5mbyBoaXRJbmZvKSB7CkBAIC00MjMsNDUgKzQ0OCw0NyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdHdvIFNoYXBlcyBmb3IgdGhlIHN0cm9uZyBhbmQgd2VhayBjYXJldHMgd2l0aAotICAgICAqIGRlZmF1bHQgY2FyZXQgcG9saWN5IGFuZCBudWxsIGJvdW5kczogdGhlIGZpcnN0IGVsZW1lbnQgCi0gICAgICogaXMgdGhlIHN0cm9uZyBjYXJldCwgdGhlIHNlY29uZCBpcyB0aGUgd2VhayBjYXJldCBvciBudWxsLiAKKyAgICAgKiBHZXRzIHR3byBTaGFwZXMgZm9yIHRoZSBzdHJvbmcgYW5kIHdlYWsgY2FyZXRzIHdpdGggZGVmYXVsdCBjYXJldCBwb2xpY3kKKyAgICAgKiBhbmQgbnVsbCBib3VuZHM6IHRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBzdHJvbmcgY2FyZXQsIHRoZSBzZWNvbmQgaXMgdGhlCisgICAgICogd2VhayBjYXJldCBvciBudWxsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvZmZzZXQgYW4gb2Zmc2V0IGluIHRoZSBUZXh0TGF5b3V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdHdvIFNoYXBlcyBjb3JyZXNwb25kZWQgdG8gdGhlIHN0cm9uZwotICAgICAqIGFuZCB3ZWFrIGNhcmV0cy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICBhbiBvZmZzZXQgaW4gdGhlIFRleHRMYXlvdXQuCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0d28gU2hhcGVzIGNvcnJlc3BvbmRlZCB0byB0aGUgc3Ryb25nIGFuZCB3ZWFrCisgICAgICogICAgICAgICBjYXJldHMuCiAgICAgICovCiAgICAgcHVibGljIFNoYXBlW10gZ2V0Q2FyZXRTaGFwZXMoaW50IG9mZnNldCkgewogICAgICAgICByZXR1cm4gZ2V0Q2FyZXRTaGFwZXMob2Zmc2V0LCBudWxsLCBUZXh0TGF5b3V0LkRFRkFVTFRfQ0FSRVRfUE9MSUNZKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHR3byBTaGFwZXMgZm9yIHRoZSBzdHJvbmcgYW5kIHdlYWsgY2FyZXRzIHdpdGgKLSAgICAgKiB0aGUgZGVmYXVsdCBjYXJldCBwb2xpY3k6IHRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBzdHJvbmcgCi0gICAgICogY2FyZXQsIHRoZSBzZWNvbmQgaXMgdGhlIHdlYWsgY2FyZXQgb3IgbnVsbC4KKyAgICAgKiBHZXRzIHR3byBTaGFwZXMgZm9yIHRoZSBzdHJvbmcgYW5kIHdlYWsgY2FyZXRzIHdpdGggdGhlIGRlZmF1bHQgY2FyZXQKKyAgICAgKiBwb2xpY3k6IHRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBzdHJvbmcgY2FyZXQsIHRoZSBzZWNvbmQgaXMgdGhlIHdlYWsKKyAgICAgKiBjYXJldCBvciBudWxsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvZmZzZXQgYW4gb2Zmc2V0IGluIHRoZSBUZXh0TGF5b3V0LgotICAgICAqIEBwYXJhbSBib3VuZHMgdGhlIGJvdW5kcyB0byB3aGljaCB0byBleHRlbmQgdGhlIGNhcmV0cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHR3byBTaGFwZXMgY29ycmVzcG9uZGVkIHRvIHRoZSBzdHJvbmcKLSAgICAgKiBhbmQgd2VhayBjYXJldHMuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgYW4gb2Zmc2V0IGluIHRoZSBUZXh0TGF5b3V0LgorICAgICAqIEBwYXJhbSBib3VuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBib3VuZHMgdG8gd2hpY2ggdG8gZXh0ZW5kIHRoZSBjYXJldHMuCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0d28gU2hhcGVzIGNvcnJlc3BvbmRlZCB0byB0aGUgc3Ryb25nIGFuZCB3ZWFrCisgICAgICogICAgICAgICBjYXJldHMuCiAgICAgICovCiAgICAgcHVibGljIFNoYXBlW10gZ2V0Q2FyZXRTaGFwZXMoaW50IG9mZnNldCwgUmVjdGFuZ2xlMkQgYm91bmRzKSB7CiAgICAgICAgIHJldHVybiBnZXRDYXJldFNoYXBlcyhvZmZzZXQsIGJvdW5kcywgVGV4dExheW91dC5ERUZBVUxUX0NBUkVUX1BPTElDWSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0d28gU2hhcGVzIGZvciB0aGUgc3Ryb25nIGFuZCB3ZWFrIGNhcmV0czogdGhlIGZpcnN0Ci0gICAgICogZWxlbWVudCBpcyB0aGUgc3Ryb25nIGNhcmV0LCB0aGUgc2Vjb25kIGlzIHRoZSB3ZWFrIGNhcmV0IAotICAgICAqIG9yIG51bGwuCisgICAgICogR2V0cyB0d28gU2hhcGVzIGZvciB0aGUgc3Ryb25nIGFuZCB3ZWFrIGNhcmV0czogdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlCisgICAgICogc3Ryb25nIGNhcmV0LCB0aGUgc2Vjb25kIGlzIHRoZSB3ZWFrIGNhcmV0IG9yIG51bGwuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9mZnNldCBhbiBvZmZzZXQgaW4gdGhlIFRleHRMYXlvdXQuCi0gICAgICogQHBhcmFtIGJvdW5kcyB0aGUgYm91bmRzIHRvIHdoaWNoIHRvIGV4dGVuZCB0aGUgY2FyZXRzLgotICAgICAqIEBwYXJhbSBwb2xpY3kgdGhlIHNwZWNpZmllZCBDYXJldFBvbGljeS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHR3byBTaGFwZXMgY29ycmVzcG9uZGVkIHRvIHRoZSBzdHJvbmcKLSAgICAgKiBhbmQgd2VhayBjYXJldHMuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgYW4gb2Zmc2V0IGluIHRoZSBUZXh0TGF5b3V0LgorICAgICAqIEBwYXJhbSBib3VuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBib3VuZHMgdG8gd2hpY2ggdG8gZXh0ZW5kIHRoZSBjYXJldHMuCisgICAgICogQHBhcmFtIHBvbGljeQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBDYXJldFBvbGljeS4KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHR3byBTaGFwZXMgY29ycmVzcG9uZGVkIHRvIHRoZSBzdHJvbmcgYW5kIHdlYWsKKyAgICAgKiAgICAgICAgIGNhcmV0cy4KICAgICAgKi8KICAgICBwdWJsaWMgU2hhcGVbXSBnZXRDYXJldFNoYXBlcyhpbnQgb2Zmc2V0LCBSZWN0YW5nbGUyRCBib3VuZHMsIFRleHRMYXlvdXQuQ2FyZXRQb2xpY3kgcG9saWN5KSB7CiAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJyZWFrZXIuZ2V0Q2hhckNvdW50KCkpIHsKQEAgLTQ4MywxNSArNTEwLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGV2ZWwgb2YgdGhlIGNoYXJhY3RlciB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXguIAotICAgICAqICAKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGUgY2hhcmFjdGVyLgorICAgICAqIEdldHMgdGhlIGxldmVsIG9mIHRoZSBjaGFyYWN0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIAorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGUgY2hhcmFjdGVyLgogICAgICAqIEByZXR1cm4gdGhlIGxldmVsIG9mIHRoZSBjaGFyYWN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIGJ5dGUgZ2V0Q2hhcmFjdGVyTGV2ZWwoaW50IGluZGV4KSB7CiAgICAgICAgIGlmIChpbmRleCA9PSAtMSB8fCBpbmRleCA9PSBnZXRDaGFyYWN0ZXJDb3VudCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGJ5dGUpIGJyZWFrZXIuZ2V0QmFzZUxldmVsKCk7CisgICAgICAgICAgICByZXR1cm4gKGJ5dGUpYnJlYWtlci5nZXRCYXNlTGV2ZWwoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYnJlYWtlci5nZXRMZXZlbChpbmRleCk7CiAgICAgfQpAQCAtNTA3LDE2ICs1MzQsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBUZXh0TGF5b3V0IHdpY2ggaXMganVzdGlmaWVkIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIHdpZHRoIHJlbGF0ZWQgdG8gdGhpcyBUZXh0TGF5b3V0LgorICAgICAqIEdldHMgdGhlIFRleHRMYXlvdXQgd2ljaCBpcyBqdXN0aWZpZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoIHJlbGF0ZWQgdG8KKyAgICAgKiB0aGlzIFRleHRMYXlvdXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGp1c3RpZmljYXRpb25XaWR0aCB0aGUgd2lkdGggd2hpY2ggaXMgdXNlZCAKLSAgICAgKiBmb3IganVzdGlmaWNhdGlvbi4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0ganVzdGlmaWNhdGlvbldpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggd2hpY2ggaXMgdXNlZCBmb3IganVzdGlmaWNhdGlvbi4KICAgICAgKiBAcmV0dXJuIGEgVGV4dExheW91dCBqdXN0aWZpZWQgdG8gdGhlIHNwZWNpZmllZCB3aWR0aC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEVycm9yIHRoZSBlcnJvciBvY2N1cmVzIGlmIHRoaXMgVGV4dExheW91dCBoYXMgYmVlbgotICAgICAqIGFscmVhZHkganVzdGlmaWVkLgorICAgICAqIEB0aHJvd3MgRXJyb3IKKyAgICAgKiAgICAgICAgICAgICB0aGUgZXJyb3Igb2NjdXJlcyBpZiB0aGlzIFRleHRMYXlvdXQgaGFzIGJlZW4gYWxyZWFkeQorICAgICAqICAgICAgICAgICAgIGp1c3RpZmllZC4KICAgICAgKi8KICAgICBwdWJsaWMgVGV4dExheW91dCBnZXRKdXN0aWZpZWRMYXlvdXQoZmxvYXQganVzdGlmaWNhdGlvbldpZHRoKSB0aHJvd3MgRXJyb3IgewogICAgICAgICBmbG9hdCBqdXN0aWZpY2F0aW9uID0gYnJlYWtlci5nZXRKdXN0aWZpY2F0aW9uKCk7CkBAIC01MjgsNyArNTU0LDcgQEAKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgVGV4dExheW91dCBqdXN0aWZpZWRMYXlvdXQgPSBuZXcgVGV4dExheW91dCgoVGV4dFJ1bkJyZWFrZXIpIGJyZWFrZXIuY2xvbmUoKSk7CisgICAgICAgIFRleHRMYXlvdXQganVzdGlmaWVkTGF5b3V0ID0gbmV3IFRleHRMYXlvdXQoKFRleHRSdW5CcmVha2VyKWJyZWFrZXIuY2xvbmUoKSk7CiAgICAgICAgIGp1c3RpZmllZExheW91dC5oYW5kbGVKdXN0aWZ5KGp1c3RpZmljYXRpb25XaWR0aCk7CiAgICAgICAgIHJldHVybiBqdXN0aWZpZWRMYXlvdXQ7CiAgICAgfQpAQCAtNTQ0LDE1ICs1NzAsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgU2hhcGUgcmVwcmVzZW50aW5nIHRoZSBsb2dpY2FsIHNlbGVjdGlvbiBiZXR3ZWVlbiAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGVuZHBvaW50cyBhbmQgZXh0ZW5kZWQgdG8gdGhlIG5hdHVyYWwgCi0gICAgICogYm91bmRzIG9mIHRoaXMgVGV4dExheW91dC4KKyAgICAgKiBHZXRzIGEgU2hhcGUgcmVwcmVzZW50aW5nIHRoZSBsb2dpY2FsIHNlbGVjdGlvbiBiZXR3ZWVlbiB0aGUgc3BlY2lmaWVkCisgICAgICogZW5kcG9pbnRzIGFuZCBleHRlbmRlZCB0byB0aGUgbmF0dXJhbCBib3VuZHMgb2YgdGhpcyBUZXh0TGF5b3V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBmaXJzdEVuZHBvaW50IHRoZSBmaXJzdCBzZWxlY3RlZCBlbmRwb2ludCB3aXRoaW4gdGhlIGFyZWEgb2YgY2hhcmFjdGVycwotICAgICAqIEBwYXJhbSBzZWNvbmRFbmRwb2ludCB0aGUgc2Vjb25kIHNlbGVjdGVkIGVuZHBvaW50IHdpdGhpbiB0aGUgYXJlYSBvZiBjaGFyYWN0ZXJzCi0gICAgICogCi0gICAgICogQHJldHVybiBhIFNoYXBlIHJlcHJlc2VudGVkIHRoZSBsb2dpY2FsIHNlbGVjdGlvbiBiZXR3ZWVlbiAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGVuZHBvaW50cy4KKyAgICAgKiBAcGFyYW0gZmlyc3RFbmRwb2ludAorICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IHNlbGVjdGVkIGVuZHBvaW50IHdpdGhpbiB0aGUgYXJlYSBvZiBjaGFyYWN0ZXJzCisgICAgICogQHBhcmFtIHNlY29uZEVuZHBvaW50CisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIHNlbGVjdGVkIGVuZHBvaW50IHdpdGhpbiB0aGUgYXJlYSBvZiBjaGFyYWN0ZXJzCisgICAgICogQHJldHVybiBhIFNoYXBlIHJlcHJlc2VudGVkIHRoZSBsb2dpY2FsIHNlbGVjdGlvbiBiZXR3ZWVlbiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBlbmRwb2ludHMuCiAgICAgICovCiAgICAgcHVibGljIFNoYXBlIGdldExvZ2ljYWxIaWdobGlnaHRTaGFwZShpbnQgZmlyc3RFbmRwb2ludCwgaW50IHNlY29uZEVuZHBvaW50KSB7CiAgICAgICAgIHVwZGF0ZU1ldHJpY3MoKTsKQEAgLTU2MCwyMiArNTg2LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIFNoYXBlIHJlcHJlc2VudGluZyB0aGUgbG9naWNhbCBzZWxlY3Rpb24gYmV0d2VlZW4gCi0gICAgICogdGhlIHNwZWNpZmllZCBlbmRwb2ludHMgYW5kIGV4dGVuZGVkIHRvIHRoZSBzcGVjaWZpZWQgCi0gICAgICogYm91bmRzIG9mIHRoaXMgVGV4dExheW91dC4KKyAgICAgKiBHZXRzIGEgU2hhcGUgcmVwcmVzZW50aW5nIHRoZSBsb2dpY2FsIHNlbGVjdGlvbiBiZXR3ZWVlbiB0aGUgc3BlY2lmaWVkCisgICAgICogZW5kcG9pbnRzIGFuZCBleHRlbmRlZCB0byB0aGUgc3BlY2lmaWVkIGJvdW5kcyBvZiB0aGlzIFRleHRMYXlvdXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZpcnN0RW5kcG9pbnQgdGhlIGZpcnN0IHNlbGVjdGVkIGVuZHBvaW50IHdpdGhpbiB0aGUgYXJlYSBvZiBjaGFyYWN0ZXJzCi0gICAgICogQHBhcmFtIHNlY29uZEVuZHBvaW50IHRoZSBzZWNvbmQgc2VsZWN0ZWQgZW5kcG9pbnQgd2l0aGluIHRoZSBhcmVhIG9mIGNoYXJhY3RlcnMKLSAgICAgKiBAcGFyYW0gYm91bmRzIHRoZSBzcGVjaWZpZWQgYm91bmRzIG9mIHRoaXMgVGV4dExheW91dC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgU2hhcGUgcmVwcmVzZW50ZWQgdGhlIGxvZ2ljYWwgc2VsZWN0aW9uIGJldHdlZWVuIAotICAgICAqIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnRzLgorICAgICAqIEBwYXJhbSBmaXJzdEVuZHBvaW50CisgICAgICogICAgICAgICAgICB0aGUgZmlyc3Qgc2VsZWN0ZWQgZW5kcG9pbnQgd2l0aGluIHRoZSBhcmVhIG9mIGNoYXJhY3RlcnMKKyAgICAgKiBAcGFyYW0gc2Vjb25kRW5kcG9pbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgc2VsZWN0ZWQgZW5kcG9pbnQgd2l0aGluIHRoZSBhcmVhIG9mIGNoYXJhY3RlcnMKKyAgICAgKiBAcGFyYW0gYm91bmRzCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGJvdW5kcyBvZiB0aGlzIFRleHRMYXlvdXQuCisgICAgICogQHJldHVybiBhIFNoYXBlIHJlcHJlc2VudGVkIHRoZSBsb2dpY2FsIHNlbGVjdGlvbiBiZXR3ZWVlbiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBlbmRwb2ludHMuCiAgICAgICovCi0gICAgcHVibGljIFNoYXBlIGdldExvZ2ljYWxIaWdobGlnaHRTaGFwZSgKLSAgICAgICAgICAgIGludCBmaXJzdEVuZHBvaW50LAotICAgICAgICAgICAgaW50IHNlY29uZEVuZHBvaW50LAotICAgICAgICAgICAgUmVjdGFuZ2xlMkQgYm91bmRzCi0gICAgKSB7CisgICAgcHVibGljIFNoYXBlIGdldExvZ2ljYWxIaWdobGlnaHRTaGFwZShpbnQgZmlyc3RFbmRwb2ludCwgaW50IHNlY29uZEVuZHBvaW50LCBSZWN0YW5nbGUyRCBib3VuZHMpIHsKICAgICAgICAgdXBkYXRlTWV0cmljcygpOwogCiAgICAgICAgIGlmIChmaXJzdEVuZHBvaW50ID4gc2Vjb25kRW5kcG9pbnQpIHsKQEAgLTU4Myw2MiArNjA2LDUxIEBACiAgICAgICAgICAgICAgICAgLy8gYXd0LjE5Nz1FbmRwb2ludHMgYXJlIG91dCBvZiByYW5nZQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTk3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2FyZXRNYW5hZ2VyLmdldExvZ2ljYWxIaWdobGlnaHRTaGFwZSgKLSAgICAgICAgICAgICAgICAgICAgc2Vjb25kRW5kcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgIGZpcnN0RW5kcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgIGJvdW5kcywKLSAgICAgICAgICAgICAgICAgICAgdGhpcwotICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIHJldHVybiBjYXJldE1hbmFnZXIuZ2V0TG9naWNhbEhpZ2hsaWdodFNoYXBlKHNlY29uZEVuZHBvaW50LCBmaXJzdEVuZHBvaW50LCBib3VuZHMsCisgICAgICAgICAgICAgICAgICAgIHRoaXMpOwogICAgICAgICB9CiAgICAgICAgIGlmIChmaXJzdEVuZHBvaW50IDwgMCB8fCBzZWNvbmRFbmRwb2ludCA+IGJyZWFrZXIuZ2V0Q2hhckNvdW50KCkpIHsKICAgICAgICAgICAgIC8vIGF3dC4xOTc9RW5kcG9pbnRzIGFyZSBvdXQgb2YgcmFuZ2UKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTk3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNhcmV0TWFuYWdlci5nZXRMb2dpY2FsSGlnaGxpZ2h0U2hhcGUoCi0gICAgICAgICAgICAgICAgZmlyc3RFbmRwb2ludCwKLSAgICAgICAgICAgICAgICBzZWNvbmRFbmRwb2ludCwKLSAgICAgICAgICAgICAgICBib3VuZHMsCi0gICAgICAgICAgICAgICAgdGhpcwotICAgICAgICApOworICAgICAgICByZXR1cm4gY2FyZXRNYW5hZ2VyLmdldExvZ2ljYWxIaWdobGlnaHRTaGFwZShmaXJzdEVuZHBvaW50LCBzZWNvbmRFbmRwb2ludCwgYm91bmRzLCB0aGlzKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb2dpY2FsIHJhbmdlcyBvZiB0ZXh0IHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEgdmlzdWFsIAotICAgICAqIHNlbGVjdGlvbi4KKyAgICAgKiBHZXRzIHRoZSBsb2dpY2FsIHJhbmdlcyBvZiB0ZXh0IHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEgdmlzdWFsIHNlbGVjdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGl0MSB0aGUgZmlyc3QgZW5kcG9pbnQgb2YgdGhlIHZpc3VhbCByYW5nZS4KLSAgICAgKiBAcGFyYW0gaGl0MiB0aGUgc2Vjb25kIGVuZHBvaW50IG9mIHRoZSB2aXN1YWwgcmFuZ2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbG9naWNhbCByYW5nZXMgb2YgdGV4dCB3aGljaCBjb3JyZXNwb25kcyB0byBhIHZpc3VhbCAKLSAgICAgKiBzZWxlY3Rpb24uCisgICAgICogQHBhcmFtIGhpdDEKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBlbmRwb2ludCBvZiB0aGUgdmlzdWFsIHJhbmdlLgorICAgICAqIEBwYXJhbSBoaXQyCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIGVuZHBvaW50IG9mIHRoZSB2aXN1YWwgcmFuZ2UuCisgICAgICogQHJldHVybiB0aGUgbG9naWNhbCByYW5nZXMgb2YgdGV4dCB3aGljaCBjb3JyZXNwb25kcyB0byBhIHZpc3VhbAorICAgICAqICAgICAgICAgc2VsZWN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBpbnRbXSBnZXRMb2dpY2FsUmFuZ2VzRm9yVmlzdWFsU2VsZWN0aW9uKFRleHRIaXRJbmZvIGhpdDEsIFRleHRIaXRJbmZvIGhpdDIpIHsKICAgICAgICAgcmV0dXJuIGNhcmV0TWFuYWdlci5nZXRMb2dpY2FsUmFuZ2VzRm9yVmlzdWFsU2VsZWN0aW9uKGhpdDEsIGhpdDIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIFRleHRIaXRJbmZvIGZvciB0aGUgbmV4dCBjYXJldCB0byB0aGUgbGVmdCAob3IKLSAgICAgKiB1cCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lKSBvZiB0aGUgc3BlY2lmaWVkIG9mZnNldC4gCisgICAgICogR2V0cyB0aGUgVGV4dEhpdEluZm8gZm9yIHRoZSBuZXh0IGNhcmV0IHRvIHRoZSBsZWZ0IChvciB1cCBhdCB0aGUgZW5kIG9mCisgICAgICogdGhlIGxpbmUpIG9mIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBpbiB0aGlzIFRleHRMYXlvdXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgVGV4dEhpdEluZm8gZm9yIHRoZSBuZXh0IGNhcmV0IHRvIHRoZSBsZWZ0IChvcgotICAgICAqIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUpIG9mIHRoZSBzcGVjaWZpZWQgaGl0LCBvciBudWxsIAotICAgICAqIGlmIHRoZXJlIGlzIG5vIGhpdC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoaXMgVGV4dExheW91dC4KKyAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBmb3IgdGhlIG5leHQgY2FyZXQgdG8gdGhlIGxlZnQgKG9yIHVwIGF0IHRoZSBlbmQKKyAgICAgKiAgICAgICAgIG9mIHRoZSBsaW5lKSBvZiB0aGUgc3BlY2lmaWVkIGhpdCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBoaXQuCiAgICAgICovCiAgICAgcHVibGljIFRleHRIaXRJbmZvIGdldE5leHRMZWZ0SGl0KGludCBvZmZzZXQpIHsKICAgICAgICAgcmV0dXJuIGdldE5leHRMZWZ0SGl0KG9mZnNldCwgREVGQVVMVF9DQVJFVF9QT0xJQ1kpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIFRleHRIaXRJbmZvIGZvciB0aGUgbmV4dCBjYXJldCB0byB0aGUgbGVmdCAob3IKLSAgICAgKiB1cCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lKSBvZiB0aGUgc3BlY2lmaWVkIGhpdC4gCisgICAgICogR2V0cyB0aGUgVGV4dEhpdEluZm8gZm9yIHRoZSBuZXh0IGNhcmV0IHRvIHRoZSBsZWZ0IChvciB1cCBhdCB0aGUgZW5kIG9mCisgICAgICogdGhlIGxpbmUpIG9mIHRoZSBzcGVjaWZpZWQgaGl0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBoaXRJbmZvIHRoZSBpbml0aWFsIGhpdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBmb3IgdGhlIG5leHQgY2FyZXQgdG8gdGhlIGxlZnQgKG9yCi0gICAgICogdXAgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSkgb2YgdGhlIHNwZWNpZmllZCBoaXQsIG9yIG51bGwgCi0gICAgICogaWYgdGhlcmUgaXMgbm8gaGl0LgorICAgICAqIEBwYXJhbSBoaXRJbmZvCisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBoaXQuCisgICAgICogQHJldHVybiB0aGUgVGV4dEhpdEluZm8gZm9yIHRoZSBuZXh0IGNhcmV0IHRvIHRoZSBsZWZ0IChvciB1cCBhdCB0aGUgZW5kCisgICAgICogICAgICAgICBvZiB0aGUgbGluZSkgb2YgdGhlIHNwZWNpZmllZCBoaXQsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gaGl0LgogICAgICAqLwogICAgIHB1YmxpYyBUZXh0SGl0SW5mbyBnZXROZXh0TGVmdEhpdChUZXh0SGl0SW5mbyBoaXRJbmZvKSB7CiAgICAgICAgIGJyZWFrZXIuY3JlYXRlQWxsU2VnbWVudHMoKTsKQEAgLTY0NiwxNSArNjU4LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgVGV4dEhpdEluZm8gZm9yIHRoZSBuZXh0IGNhcmV0IHRvIHRoZSBsZWZ0IChvcgotICAgICAqIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUpIG9mIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LCBnaXZlbiB0aGUgCi0gICAgICogc3BlY2lmaWVkIGNhcmV0IHBvbGljeS4gCisgICAgICogR2V0cyB0aGUgVGV4dEhpdEluZm8gZm9yIHRoZSBuZXh0IGNhcmV0IHRvIHRoZSBsZWZ0IChvciB1cCBhdCB0aGUgZW5kIG9mCisgICAgICogdGhlIGxpbmUpIG9mIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LCBnaXZlbiB0aGUgc3BlY2lmaWVkIGNhcmV0IHBvbGljeS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW4gdGhpcyBUZXh0TGF5b3V0LgotICAgICAqIEBwYXJhbSBwb2xpY3kgdGhlIHBvbGljeSB0byBiZSB1c2VkIGZvciBvYnRhaW5pbmcgdGhlIHN0cm9uZyBjYXJldC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBmb3IgdGhlIG5leHQgY2FyZXQgdG8gdGhlIGxlZnQgb2YgdGhlIAotICAgICAqIHNwZWNpZmllZCBvZmZzZXQsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gaGl0LgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhpcyBUZXh0TGF5b3V0LgorICAgICAqIEBwYXJhbSBwb2xpY3kKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2xpY3kgdG8gYmUgdXNlZCBmb3Igb2J0YWluaW5nIHRoZSBzdHJvbmcgY2FyZXQuCisgICAgICogQHJldHVybiB0aGUgVGV4dEhpdEluZm8gZm9yIHRoZSBuZXh0IGNhcmV0IHRvIHRoZSBsZWZ0IG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIG9mZnNldCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBoaXQuCiAgICAgICovCiAgICAgcHVibGljIFRleHRIaXRJbmZvIGdldE5leHRMZWZ0SGl0KGludCBvZmZzZXQsIFRleHRMYXlvdXQuQ2FyZXRQb2xpY3kgcG9saWN5KSB7CiAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJyZWFrZXIuZ2V0Q2hhckNvdW50KCkpIHsKQEAgLTY3MywxNCArNjg1LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgVGV4dEhpdEluZm8gZm9yIHRoZSBuZXh0IGNhcmV0IHRvIHRoZSByaWdodCAob3IKLSAgICAgKiBkb3duIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUpIG9mIHRoZSBzcGVjaWZpZWQgaGl0LiAKKyAgICAgKiBHZXRzIHRoZSBUZXh0SGl0SW5mbyBmb3IgdGhlIG5leHQgY2FyZXQgdG8gdGhlIHJpZ2h0IChvciBkb3duIGF0IHRoZSBlbmQKKyAgICAgKiBvZiB0aGUgbGluZSkgb2YgdGhlIHNwZWNpZmllZCBoaXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGhpdEluZm8gdGhlIGluaXRpYWwgaGl0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFRleHRIaXRJbmZvIGZvciB0aGUgbmV4dCBjYXJldCB0byB0aGUgcmlnaHQgKG9yCi0gICAgICogZG93biBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lKSBvZiB0aGUgc3BlY2lmaWVkIGhpdCwgb3IgbnVsbCAKLSAgICAgKiBpZiB0aGVyZSBpcyBubyBoaXQuCisgICAgICogQHBhcmFtIGhpdEluZm8KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIGhpdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBmb3IgdGhlIG5leHQgY2FyZXQgdG8gdGhlIHJpZ2h0IChvciBkb3duIGF0IHRoZQorICAgICAqICAgICAgICAgZW5kIG9mIHRoZSBsaW5lKSBvZiB0aGUgc3BlY2lmaWVkIGhpdCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubworICAgICAqICAgICAgICAgaGl0LgogICAgICAqLwogICAgIHB1YmxpYyBUZXh0SGl0SW5mbyBnZXROZXh0UmlnaHRIaXQoVGV4dEhpdEluZm8gaGl0SW5mbykgewogICAgICAgICBicmVha2VyLmNyZWF0ZUFsbFNlZ21lbnRzKCk7CkBAIC02ODgsMjggKzcwMCwyOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIFRleHRIaXRJbmZvIGZvciB0aGUgbmV4dCBjYXJldCB0byB0aGUgcmlnaHQgKG9yCi0gICAgICogZG93biBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lKSBvZiB0aGUgc3BlY2lmaWVkIG9mZnNldC4gCisgICAgICogR2V0cyB0aGUgVGV4dEhpdEluZm8gZm9yIHRoZSBuZXh0IGNhcmV0IHRvIHRoZSByaWdodCAob3IgZG93biBhdCB0aGUgZW5kCisgICAgICogb2YgdGhlIGxpbmUpIG9mIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBpbiB0aGlzIFRleHRMYXlvdXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgVGV4dEhpdEluZm8gZm9yIHRoZSBuZXh0IGNhcmV0IHRvIHRoZSByaWdodCBvZiB0aGUgCi0gICAgICogc3BlY2lmaWVkIG9mZnNldCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBoaXQuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGlzIFRleHRMYXlvdXQuCisgICAgICogQHJldHVybiB0aGUgVGV4dEhpdEluZm8gZm9yIHRoZSBuZXh0IGNhcmV0IHRvIHRoZSByaWdodCBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBvZmZzZXQsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gaGl0LgogICAgICAqLwogICAgIHB1YmxpYyBUZXh0SGl0SW5mbyBnZXROZXh0UmlnaHRIaXQoaW50IG9mZnNldCkgewogICAgICAgICByZXR1cm4gZ2V0TmV4dFJpZ2h0SGl0KG9mZnNldCwgREVGQVVMVF9DQVJFVF9QT0xJQ1kpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIFRleHRIaXRJbmZvIGZvciB0aGUgbmV4dCBjYXJldCB0byB0aGUgcmlnaHQgKG9yCi0gICAgICogZG93biBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lKSBvZiB0aGUgc3BlY2lmaWVkIG9mZnNldCwgZ2l2ZW4gdGhlIAotICAgICAqIHNwZWNpZmllZCBjYXJldCBwb2xpY3kuIAorICAgICAqIEdldHMgdGhlIFRleHRIaXRJbmZvIGZvciB0aGUgbmV4dCBjYXJldCB0byB0aGUgcmlnaHQgKG9yIGRvd24gYXQgdGhlIGVuZAorICAgICAqIG9mIHRoZSBsaW5lKSBvZiB0aGUgc3BlY2lmaWVkIG9mZnNldCwgZ2l2ZW4gdGhlIHNwZWNpZmllZCBjYXJldCBwb2xpY3kuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGluIHRoaXMgVGV4dExheW91dC4KLSAgICAgKiBAcGFyYW0gcG9saWN5IHRoZSBwb2xpY3kgdG8gYmUgdXNlZCBmb3Igb2J0YWluaW5nIHRoZSBzdHJvbmcgY2FyZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgVGV4dEhpdEluZm8gZm9yIHRoZSBuZXh0IGNhcmV0IHRvIHRoZSByaWdodCBvZiB0aGUgCi0gICAgICogc3BlY2lmaWVkIG9mZnNldCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBoaXQuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGlzIFRleHRMYXlvdXQuCisgICAgICogQHBhcmFtIHBvbGljeQorICAgICAqICAgICAgICAgICAgdGhlIHBvbGljeSB0byBiZSB1c2VkIGZvciBvYnRhaW5pbmcgdGhlIHN0cm9uZyBjYXJldC4KKyAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBmb3IgdGhlIG5leHQgY2FyZXQgdG8gdGhlIHJpZ2h0IG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIG9mZnNldCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBoaXQuCiAgICAgICovCiAgICAgcHVibGljIFRleHRIaXRJbmZvIGdldE5leHRSaWdodEhpdChpbnQgb2Zmc2V0LCBUZXh0TGF5b3V0LkNhcmV0UG9saWN5IHBvbGljeSkgewogICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBicmVha2VyLmdldENoYXJDb3VudCgpKSB7CkBAIC03MzAsMTAgKzc0Miw5IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgb3V0bGluZSBvZiB0aGlzIFRleHRMYXlvdXQgYXMgYSBTaGFwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geGZvcm0gdGhlIEFmZmluZVRyYW5zZm9ybSB0byBiZSB1c2VkIHRvIHRyYW5zZm9ybSAKLSAgICAgKiB0aGUgb3V0bGluZSBiZWZvcmUgcmV0dXJuaW5nIGl0LCBvciBudWxsIGlmIG5vIHRyYW5zZm9ybWF0aW9uCi0gICAgICogaXMgZGVzaXJlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0geGZvcm0KKyAgICAgKiAgICAgICAgICAgIHRoZSBBZmZpbmVUcmFuc2Zvcm0gdG8gYmUgdXNlZCB0byB0cmFuc2Zvcm0gdGhlIG91dGxpbmUgYmVmb3JlCisgICAgICogICAgICAgICAgICByZXR1cm5pbmcgaXQsIG9yIG51bGwgaWYgbm8gdHJhbnNmb3JtYXRpb24gaXMgZGVzaXJlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBvdXRsaW5lIG9mIHRoaXMgVGV4dExheW91dCBhcyBhIFNoYXBlLgogICAgICAqLwogICAgIHB1YmxpYyBTaGFwZSBnZXRPdXRsaW5lKEFmZmluZVRyYW5zZm9ybSB4Zm9ybSkgewpAQCAtNzQ5LDggKzc2MCw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmlzaWJsZSBhZHZhbmNlIG9mIHRoaXMgVGV4dExheW91dCB3aGljaCBpcyBkZWZpbmVkIGFzCi0gICAgICogZGlmZmVuY2UgYmV0d2VlbiBsZWFkaW5nIChhZHZhbmNlKSBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4KKyAgICAgKiBHZXRzIHRoZSB2aXNpYmxlIGFkdmFuY2Ugb2YgdGhpcyBUZXh0TGF5b3V0IHdoaWNoIGlzIGRlZmluZWQgYXMgZGlmZmVuY2UKKyAgICAgKiBiZXR3ZWVuIGxlYWRpbmcgKGFkdmFuY2UpIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHZpc2libGUgYWR2YW5jZSBvZiB0aGlzIFRleHRMYXlvdXQuCiAgICAgICovCkBAIC03NjQsMTUgKzc3NSwxMyBAQAogCiAgICAgICAgIGlmIChsYXN0Tm9uV2hpdGVzcGFjZSA8IDApIHsKICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9IGVsc2UgaWYgKGxhc3ROb25XaGl0ZXNwYWNlID09IGdldENoYXJhY3RlckNvdW50KCktMSkgeworICAgICAgICB9IGVsc2UgaWYgKGxhc3ROb25XaGl0ZXNwYWNlID09IGdldENoYXJhY3RlckNvdW50KCkgLSAxKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0QWR2YW5jZSgpOwogICAgICAgICB9IGVsc2UgaWYgKGp1c3RpZmljYXRpb25XaWR0aCA+PSAwKSB7IC8vIExheW91dCBpcyBqdXN0aWZpZWQKICAgICAgICAgICAgIHJldHVybiBqdXN0aWZpY2F0aW9uV2lkdGg7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBicmVha2VyLnB1c2hTZWdtZW50cygKLSAgICAgICAgICAgICAgICAgICAgYnJlYWtlci5nZXRBQ0koKS5nZXRCZWdpbkluZGV4KCksCi0gICAgICAgICAgICAgICAgICAgIGxhc3ROb25XaGl0ZXNwYWNlICsgYnJlYWtlci5nZXRBQ0koKS5nZXRCZWdpbkluZGV4KCkgKyAxCi0gICAgICAgICAgICApOworICAgICAgICAgICAgYnJlYWtlci5wdXNoU2VnbWVudHMoYnJlYWtlci5nZXRBQ0koKS5nZXRCZWdpbkluZGV4KCksIGxhc3ROb25XaGl0ZXNwYWNlCisgICAgICAgICAgICAgICAgICAgICsgYnJlYWtlci5nZXRBQ0koKS5nZXRCZWdpbkluZGV4KCkgKyAxKTsKIAogICAgICAgICAgICAgYnJlYWtlci5jcmVhdGVBbGxTZWdtZW50cygpOwogCkBAIC03ODQsMTQgKzc5MywxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYSBTaGFwZSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgaGlnaGxpZ2h0ZWQgKHNlbGVjdGVkKSBhcmVhCi0gICAgICogYmFzZWQgb24gdHdvIGhpdCBsb2NhdGlvbnMgd2l0aGluIHRoZSB0ZXh0IGFuZCBleHRlbmRzIHRvIHRoZSBib3VuZHMuCisgICAgICogR2V0cyBhIFNoYXBlIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBoaWdobGlnaHRlZCAoc2VsZWN0ZWQpIGFyZWEgYmFzZWQKKyAgICAgKiBvbiB0d28gaGl0IGxvY2F0aW9ucyB3aXRoaW4gdGhlIHRleHQgYW5kIGV4dGVuZHMgdG8gdGhlIGJvdW5kcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGl0MSB0aGUgZmlyc3QgdGV4dCBoaXQgbG9jYXRpb24uCi0gICAgICogQHBhcmFtIGhpdDIgdGhlIHNlY29uZCB0ZXh0IGhpdCBsb2NhdGlvbi4KLSAgICAgKiBAcGFyYW0gYm91bmRzIHRoZSByZWN0YW5nbGUgdGhhdCB0aGUgaGlnaGxpZ2h0ZWQgYXJlYSBzaG91bGQgYmUgCi0gICAgICogZXh0ZW5kZWQgb3IgcmVzdHJpY3RlZCB0by4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaGl0MQorICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IHRleHQgaGl0IGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBoaXQyCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIHRleHQgaGl0IGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBib3VuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWN0YW5nbGUgdGhhdCB0aGUgaGlnaGxpZ2h0ZWQgYXJlYSBzaG91bGQgYmUgZXh0ZW5kZWQgb3IKKyAgICAgKiAgICAgICAgICAgIHJlc3RyaWN0ZWQgdG8uCiAgICAgICogQHJldHVybiBhIFNoYXBlIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBoaWdobGlnaHRlZCAoc2VsZWN0ZWQpIGFyZWEuCiAgICAgICovCiAgICAgcHVibGljIFNoYXBlIGdldFZpc3VhbEhpZ2hsaWdodFNoYXBlKFRleHRIaXRJbmZvIGhpdDEsIFRleHRIaXRJbmZvIGhpdDIsIFJlY3RhbmdsZTJEIGJvdW5kcykgewpAQCAtNzk5LDEyICs4MTAsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgU2hhcGUgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIGhpZ2hsaWdodGVkIChzZWxlY3RlZCkgYXJlYQotICAgICAqIGJhc2VkIG9uIHR3byBoaXQgbG9jYXRpb25zIHdpdGhpbiB0aGUgdGV4dC4KKyAgICAgKiBHZXRzIGEgU2hhcGUgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIGhpZ2hsaWdodGVkIChzZWxlY3RlZCkgYXJlYSBiYXNlZAorICAgICAqIG9uIHR3byBoaXQgbG9jYXRpb25zIHdpdGhpbiB0aGUgdGV4dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGl0MSB0aGUgZmlyc3QgdGV4dCBoaXQgbG9jYXRpb24uCi0gICAgICogQHBhcmFtIGhpdDIgdGhlIHNlY29uZCB0ZXh0IGhpdCBsb2NhdGlvbi4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaGl0MQorICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IHRleHQgaGl0IGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBoaXQyCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIHRleHQgaGl0IGxvY2F0aW9uLgogICAgICAqIEByZXR1cm4gYSBTaGFwZSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgaGlnaGxpZ2h0ZWQgKHNlbGVjdGVkKSBhcmVhLgogICAgICAqLwogICAgIHB1YmxpYyBTaGFwZSBnZXRWaXN1YWxIaWdobGlnaHRTaGFwZShUZXh0SGl0SW5mbyBoaXQxLCBUZXh0SGl0SW5mbyBoaXQyKSB7CkBAIC04MTMsMjMgKzgyNSwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIFRleHRIaXRJbmZvIGZvciBhIGhpdCBvbiB0aGUgb3Bwb3NpdGUgc2lkZSBvZiB0aGUgCi0gICAgICogc3BlY2lmaWVkIGhpdCdzIGNhcmV0LgorICAgICAqIEdldHMgdGhlIFRleHRIaXRJbmZvIGZvciBhIGhpdCBvbiB0aGUgb3Bwb3NpdGUgc2lkZSBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogaGl0J3MgY2FyZXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGhpdEluZm8gdGhlIHNwZWNpZmllZCBUZXh0SGl0SW5mby4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBmb3IgYSBoaXQgb24gdGhlIG9wcG9zaXRlIHNpZGUgb2YgdGhlIAotICAgICAqIHNwZWNpZmllZCBoaXQncyBjYXJldC4KKyAgICAgKiBAcGFyYW0gaGl0SW5mbworICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBUZXh0SGl0SW5mby4KKyAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBmb3IgYSBoaXQgb24gdGhlIG9wcG9zaXRlIHNpZGUgb2YgdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgaGl0J3MgY2FyZXQuCiAgICAgICovCiAgICAgcHVibGljIFRleHRIaXRJbmZvIGdldFZpc3VhbE90aGVySGl0KFRleHRIaXRJbmZvIGhpdEluZm8pIHsKICAgICAgICAgcmV0dXJuIGNhcmV0TWFuYWdlci5nZXRWaXN1YWxPdGhlckhpdChoaXRJbmZvKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBKdXN0aWZpZXMgdGhlIHRleHQ7IHRoaXMgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZGVuCi0gICAgICogYnkgc3ViY2xhc3Nlcy4KKyAgICAgKiBKdXN0aWZpZXMgdGhlIHRleHQ7IHRoaXMgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGp1c3RpZmljYXRpb25XaWR0aCB0aGUgd2lkdGggZm9yIGp1c3RpZmljYXRpb24uCisgICAgICogQHBhcmFtIGp1c3RpZmljYXRpb25XaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIGZvciBqdXN0aWZpY2F0aW9uLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUp1c3RpZnkoZmxvYXQganVzdGlmaWNhdGlvbldpZHRoKSB7CiAgICAgICAgIGZsb2F0IGp1c3RpZmljYXRpb24gPSBicmVha2VyLmdldEp1c3RpZmljYXRpb24oKTsKQEAgLTg1MSw1NCArODYzLDU0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIFRleHRIaXRJbmZvIG9iamVjdCB0aGF0IGdpdmVzIGluZm9ybWF0aW9uIG9uIHdoaWNoIAotICAgICAqIGRpdmlzaW9uIHBvaW50IChiZXR3ZWVuIHR3byBjaGFyYWN0ZXJzKSBpcyBjb3JyZXNwb25kcyB0byBhIAotICAgICAqIGhpdCAoc3VjaCBhcyBhIG1vdXNlIGNsaWNrKSBhdCB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzLgorICAgICAqIFJldHVybnMgYSBUZXh0SGl0SW5mbyBvYmplY3QgdGhhdCBnaXZlcyBpbmZvcm1hdGlvbiBvbiB3aGljaCBkaXZpc2lvbgorICAgICAqIHBvaW50IChiZXR3ZWVuIHR3byBjaGFyYWN0ZXJzKSBpcyBjb3JyZXNwb25kcyB0byBhIGhpdCAoc3VjaCBhcyBhIG1vdXNlCisgICAgICogY2xpY2spIGF0IHRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBpbiB0aGlzIFRleHRMYXlvdXQuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBpbiB0aGlzIFRleHRMYXlvdXQuCi0gICAgICogCi0gICAgICogVGV4dEhpdEluZm8gb2JqZWN0IGNvb3Jlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGNvb3JkaW5hdGVzCi0gICAgICogd2l0aGluIHRoZSB0ZXh0LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIGluIHRoaXMgVGV4dExheW91dC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBpbiB0aGlzIFRleHRMYXlvdXQuIFRleHRIaXRJbmZvIG9iamVjdAorICAgICAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMgd2l0aGluIHRoZSB0ZXh0LgorICAgICAqIEByZXR1cm4gdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgVGV4dEhpdEluZm8gaGl0VGVzdENoYXIoZmxvYXQgeCwgZmxvYXQgeSkgewogICAgICAgICByZXR1cm4gaGl0VGVzdENoYXIoeCwgeSwgZ2V0Qm91bmRzKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBUZXh0SGl0SW5mbyBvYmplY3QgdGhhdCBnaXZlcyBpbmZvcm1hdGlvbiBvbiB3aGljaCAKLSAgICAgKiBkaXZpc2lvbiBwb2ludCAoYmV0d2VlbiB0d28gY2hhcmFjdGVycykgaXMgY29ycmVzcG9uZHMgdG8gYSAKLSAgICAgKiBoaXQgKHN1Y2ggYXMgYSBtb3VzZSBjbGljaykgYXQgdGhlIHNwZWNpZmllZCBjb29yZGluYXRlcyB3aXRoaW4gCi0gICAgICogdGhlIHNwZWNpZmllZCB0ZXh0IHJlY3RhbmdsZS4KKyAgICAgKiBSZXR1cm5zIGEgVGV4dEhpdEluZm8gb2JqZWN0IHRoYXQgZ2l2ZXMgaW5mb3JtYXRpb24gb24gd2hpY2ggZGl2aXNpb24KKyAgICAgKiBwb2ludCAoYmV0d2VlbiB0d28gY2hhcmFjdGVycykgaXMgY29ycmVzcG9uZHMgdG8gYSBoaXQgKHN1Y2ggYXMgYSBtb3VzZQorICAgICAqIGNsaWNrKSBhdCB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRleHQgcmVjdGFuZ2xlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgaW4gdGhpcyBUZXh0TGF5b3V0LgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgaW4gdGhpcyBUZXh0TGF5b3V0LgotICAgICAqIEBwYXJhbSBib3VuZHMgdGhlIGJvdW5kcyBvZiB0aGUgdGV4dCBhcmVhLgotICAgICAqIAotICAgICAqIFRleHRIaXRJbmZvIG9iamVjdCBjb29yZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBjb29yZGluYXRlcwotICAgICAqIHdpdGhpbiB0aGUgdGV4dC4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBpbiB0aGlzIFRleHRMYXlvdXQuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgaW4gdGhpcyBUZXh0TGF5b3V0LgorICAgICAqIEBwYXJhbSBib3VuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBib3VuZHMgb2YgdGhlIHRleHQgYXJlYS4gVGV4dEhpdEluZm8gb2JqZWN0IGNvcnJlc3BvbmRpbmcKKyAgICAgKiAgICAgICAgICAgIHRvIHRoZSBnaXZlbiBjb29yZGluYXRlcyB3aXRoaW4gdGhlIHRleHQuCisgICAgICogQHJldHVybiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYXJhY3RlciBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBUZXh0SGl0SW5mbyBoaXRUZXN0Q2hhcihmbG9hdCB4LCBmbG9hdCB5LCBSZWN0YW5nbGUyRCBib3VuZHMpIHsKICAgICAgICAgaWYgKHggPiBib3VuZHMuZ2V0TWF4WCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gYnJlYWtlci5pc0xUUigpID8KLSAgICAgICAgICAgICAgICAgICAgVGV4dEhpdEluZm8udHJhaWxpbmcoYnJlYWtlci5nZXRDaGFyQ291bnQoKSAtIDEpIDogVGV4dEhpdEluZm8ubGVhZGluZygwKTsKKyAgICAgICAgICAgIHJldHVybiBicmVha2VyLmlzTFRSKCkgPyBUZXh0SGl0SW5mby50cmFpbGluZyhicmVha2VyLmdldENoYXJDb3VudCgpIC0gMSkgOiBUZXh0SGl0SW5mbworICAgICAgICAgICAgICAgICAgICAubGVhZGluZygwKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICh4IDwgYm91bmRzLmdldE1pblgoKSkgewotICAgICAgICAgICAgcmV0dXJuIGJyZWFrZXIuaXNMVFIoKSA/Ci0gICAgICAgICAgICAgICAgICAgIFRleHRIaXRJbmZvLmxlYWRpbmcoMCkgOiBUZXh0SGl0SW5mby50cmFpbGluZyhicmVha2VyLmdldENoYXJDb3VudCgpIC0gMSk7CisgICAgICAgICAgICByZXR1cm4gYnJlYWtlci5pc0xUUigpID8gVGV4dEhpdEluZm8ubGVhZGluZygwKSA6IFRleHRIaXRJbmZvLnRyYWlsaW5nKGJyZWFrZXIKKyAgICAgICAgICAgICAgICAgICAgLmdldENoYXJDb3VudCgpIC0gMSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gYnJlYWtlci5oaXRUZXN0KHgsIHkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIFRleHRMYXlvdXQgaGFzIGEgImxlZnQgdG8gcmlnaHQiIAotICAgICAqIGRpcmVjdGlvbi4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBUZXh0TGF5b3V0IGhhcyBhICJsZWZ0IHRvIHJpZ2h0IiBkaXJlY3Rpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgVGV4dExheW91dCBoYXMgYSAibGVmdCB0byByaWdodCIgCi0gICAgICogZGlyZWN0aW9uLCBmYWxzZSBpZiB0aGlzIFRleHRMYXlvdXQgaGFzIGEgInJpZ2h0IHRvIGxlZnQiIAotICAgICAqIGRpcmVjdGlvbi4gCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgVGV4dExheW91dCBoYXMgYSAibGVmdCB0byByaWdodCIgZGlyZWN0aW9uLCBmYWxzZSBpZgorICAgICAqICAgICAgICAgdGhpcyBUZXh0TGF5b3V0IGhhcyBhICJyaWdodCB0byBsZWZ0IiBkaXJlY3Rpb24uCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNMZWZ0VG9SaWdodCgpIHsKICAgICAgICAgcmV0dXJuIGJyZWFrZXIuaXNMVFIoKTsKQEAgLTkxMyw0ICs5MjUsMyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZm9udC9UZXh0TWVhc3VyZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9mb250L1RleHRNZWFzdXJlci5qYXZhCmluZGV4IDAxN2YzZDkuLjk3NDFmNTkgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9mb250L1RleHRNZWFzdXJlci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9mb250L1RleHRNZWFzdXJlci5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiAKIHBhY2thZ2UgamF2YS5hd3QuZm9udDsKIAotCiBpbXBvcnQgamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuZ2wuZm9udC5UZXh0TWV0cmljc0NhbGN1bGF0b3I7CkBAIC0yOSwyNiArMjgsMzggQEAKIAogLyoqCiAgKiBUaGUgVGV4dE1lYXN1cmVyIGNsYXNzIHByb3ZpZGVzIHV0aWxpdGllcyBmb3IgbGluZSBicmVhayBvcGVyYXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFRleHRNZWFzdXJlciBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0gICAgCi0gICAgLyoqIFRoZSBhY2kuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgYWNpLgorICAgICAqLwogICAgIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciBhY2k7Ci0gICAgCi0gICAgLyoqIFRoZSBmcmMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZnJjLgorICAgICAqLwogICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYzsKLSAgICAKLSAgICAvKiogVGhlIGJyZWFrZXIuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgYnJlYWtlci4KKyAgICAgKi8KICAgICBUZXh0UnVuQnJlYWtlciBicmVha2VyID0gbnVsbDsKLSAgICAKLSAgICAvKiogVGhlIHRtYy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSB0bWMuCisgICAgICovCiAgICAgVGV4dE1ldHJpY3NDYWxjdWxhdG9yIHRtYyA9IG51bGw7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgdGV4dCBtZWFzdXJlciBmcm9tIHRoZSBzcGVjaWZpZWQgdGV4dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGV4dCB0aGUgc291cmNlIHRleHQuCi0gICAgICogQHBhcmFtIGZyYyB0aGUgRm9udFJlbmRlckNvbnRleHQuCisgICAgICogQHBhcmFtIHRleHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgdGV4dC4KKyAgICAgKiBAcGFyYW0gZnJjCisgICAgICogICAgICAgICAgICB0aGUgRm9udFJlbmRlckNvbnRleHQuCiAgICAgICovCiAgICAgcHVibGljIFRleHRNZWFzdXJlcihBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgdGV4dCwgRm9udFJlbmRlckNvbnRleHQgZnJjKSB7CiAgICAgICAgIHRoaXMuYWNpID0gdGV4dDsKQEAgLTU4LDE3ICs2OSwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcGxhY2VzIHRoZSBjdXJyZW50IHRleHQgd2l0aCB0aGUgbmV3IHRleHQsIGluc2VydGluZyBhIGJyZWFrCi0gICAgICogY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgaW5zZXJ0IHBvc2l0aW9uLiAgCisgICAgICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgdGV4dCB3aXRoIHRoZSBuZXcgdGV4dCwgaW5zZXJ0aW5nIGEgYnJlYWsgY2hhcmFjdGVyCisgICAgICogYXQgdGhlIHNwZWNpZmllZCBpbnNlcnQgcG9zaXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIG5ld1BhcmFncmFwaCB0aGUgbmV3IHBhcmFncmFwaCB0ZXh0LiAKLSAgICAgKiBAcGFyYW0gaW5zZXJ0UG9zIHRoZSBwb3NpdGlvbiBpbiB0aGUgdGV4dCB3aGVyZSB0aGUgY2hhcmFjdGVyIGlzIGluc2VydGVkLiAKKyAgICAgKiBAcGFyYW0gbmV3UGFyYWdyYXBoCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHBhcmFncmFwaCB0ZXh0LgorICAgICAqIEBwYXJhbSBpbnNlcnRQb3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBpbiB0aGUgdGV4dCB3aGVyZSB0aGUgY2hhcmFjdGVyIGlzIGluc2VydGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGluc2VydENoYXIoQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIG5ld1BhcmFncmFwaCwgaW50IGluc2VydFBvcykgewogICAgICAgICBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3Igb2xkQWNpID0gYWNpOwogICAgICAgICBhY2kgPSBuZXdQYXJhZ3JhcGg7Ci0gICAgICAgIGlmICgob2xkQWNpLmdldEVuZEluZGV4KCkgLSBvbGRBY2kuZ2V0QmVnaW5JbmRleCgpKSAtCi0gICAgICAgICAgIChhY2kuZ2V0RW5kSW5kZXgoKSAtIGFjaS5nZXRCZWdpbkluZGV4KCkpICE9IC0xKSB7CisgICAgICAgIGlmICgob2xkQWNpLmdldEVuZEluZGV4KCkgLSBvbGRBY2kuZ2V0QmVnaW5JbmRleCgpKQorICAgICAgICAgICAgICAgIC0gKGFjaS5nZXRFbmRJbmRleCgpIC0gYWNpLmdldEJlZ2luSW5kZXgoKSkgIT0gLTEpIHsKICAgICAgICAgICAgIGJyZWFrZXIgPSBuZXcgVGV4dFJ1bkJyZWFrZXIoYWNpLCB0aGlzLmZyYyk7CiAgICAgICAgICAgICB0bWMgPSBuZXcgVGV4dE1ldHJpY3NDYWxjdWxhdG9yKGJyZWFrZXIpOwogICAgICAgICB9IGVsc2UgewpAQCAtNzcsMTcgKzkwLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgdGV4dCB3aXRoIHRoZSBuZXcgdGV4dCBhbmQgZGVsZXRlcyBhCi0gICAgICogY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uICAKKyAgICAgKiBSZXBsYWNlcyB0aGUgY3VycmVudCB0ZXh0IHdpdGggdGhlIG5ldyB0ZXh0IGFuZCBkZWxldGVzIGEgY2hhcmFjdGVyIGF0CisgICAgICogdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3UGFyYWdyYXBoIHRoZSBwYXJhZ3JhcGggdGV4dCBhZnRlciBkZWxldGlvbi4gCi0gICAgICogQHBhcmFtIGRlbGV0ZVBvcyB0aGUgcG9zaXRpb24gaW4gdGhlIHRleHQgd2hlcmUgdGhlIGNoYXJhY3RlciBpcyByZW1vdmVkLiAKKyAgICAgKiBAcGFyYW0gbmV3UGFyYWdyYXBoCisgICAgICogICAgICAgICAgICB0aGUgcGFyYWdyYXBoIHRleHQgYWZ0ZXIgZGVsZXRpb24uCisgICAgICogQHBhcmFtIGRlbGV0ZVBvcworICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIGluIHRoZSB0ZXh0IHdoZXJlIHRoZSBjaGFyYWN0ZXIgaXMgcmVtb3ZlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkZWxldGVDaGFyKEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciBuZXdQYXJhZ3JhcGgsIGludCBkZWxldGVQb3MpIHsKICAgICAgICAgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIG9sZEFjaSA9IGFjaTsKICAgICAgICAgYWNpID0gbmV3UGFyYWdyYXBoOwotICAgICAgICBpZiAoKG9sZEFjaS5nZXRFbmRJbmRleCgpIC0gb2xkQWNpLmdldEJlZ2luSW5kZXgoKSkgLQotICAgICAgICAgICAoYWNpLmdldEVuZEluZGV4KCkgLSBhY2kuZ2V0QmVnaW5JbmRleCgpKSAhPSAxKSB7CisgICAgICAgIGlmICgob2xkQWNpLmdldEVuZEluZGV4KCkgLSBvbGRBY2kuZ2V0QmVnaW5JbmRleCgpKQorICAgICAgICAgICAgICAgIC0gKGFjaS5nZXRFbmRJbmRleCgpIC0gYWNpLmdldEJlZ2luSW5kZXgoKSkgIT0gMSkgewogICAgICAgICAgICAgYnJlYWtlciA9IG5ldyBUZXh0UnVuQnJlYWtlcihhY2ksIHRoaXMuZnJjKTsKICAgICAgICAgICAgIHRtYyA9IG5ldyBUZXh0TWV0cmljc0NhbGN1bGF0b3IoYnJlYWtlcik7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0xMDIsMzkgKzExNywzOSBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBPYmplY3QgY2xvbmUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGV4dE1lYXN1cmVyKChBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IpIGFjaS5jbG9uZSgpLCBmcmMpOworICAgICAgICByZXR1cm4gbmV3IFRleHRNZWFzdXJlcigoQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yKWFjaS5jbG9uZSgpLCBmcmMpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBUZXh0TGF5b3V0IG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHJhbmdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4KLSAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGluZGV4IGFmdGVyIHRoZSBsYXN0IGNoYXJhY3Rlci4gCi0gICAgICogCi0gICAgICogQHJldHVybiBhIFRleHRMYXlvdXQgZm9yIHRoZSBjaGFyYWN0ZXJzIGJlZ2lubmluZyBhdCAic3RhcnQiIHVwIAotICAgICAqIHRvICJlbmQiLgorICAgICAqIEBwYXJhbSBzdGFydAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIuCisgICAgICogQHBhcmFtIGxpbWl0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggYWZ0ZXIgdGhlIGxhc3QgY2hhcmFjdGVyLgorICAgICAqIEByZXR1cm4gYSBUZXh0TGF5b3V0IGZvciB0aGUgY2hhcmFjdGVycyBiZWdpbm5pbmcgYXQgInN0YXJ0IiB1cCB0byAiZW5kIi4KICAgICAgKi8KICAgICBwdWJsaWMgVGV4dExheW91dCBnZXRMYXlvdXQoaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKICAgICAgICAgYnJlYWtlci5wdXNoU2VnbWVudHMoc3RhcnQgLSBhY2kuZ2V0QmVnaW5JbmRleCgpLCBsaW1pdCAtIGFjaS5nZXRCZWdpbkluZGV4KCkpOwogCiAgICAgICAgIGJyZWFrZXIuY3JlYXRlQWxsU2VnbWVudHMoKTsKLSAgICAgICAgVGV4dExheW91dCBsYXlvdXQgPSBuZXcgVGV4dExheW91dCgoVGV4dFJ1bkJyZWFrZXIpIGJyZWFrZXIuY2xvbmUoKSk7CisgICAgICAgIFRleHRMYXlvdXQgbGF5b3V0ID0gbmV3IFRleHRMYXlvdXQoKFRleHRSdW5CcmVha2VyKWJyZWFrZXIuY2xvbmUoKSk7CiAKICAgICAgICAgYnJlYWtlci5wb3BTZWdtZW50cygpOwogICAgICAgICByZXR1cm4gbGF5b3V0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGdyYXBoaWNhbCB3aWR0aCBvZiBhIGxpbmUgYmVnaW5uaW5nIGF0ICJzdGFydCIgCi0gICAgICogcGFyYW1ldGVyIGFuZCBpbmNsdWRpbmcgY2hhcmFjdGVycyB1cCB0byAiZW5kIiBwYXJhbWV0ZXIuIAotICAgICAqICJzdGFydCIgYW5kICJlbmQiIGFyZSBhYnNvbHV0ZSBpbmRpY2VzLCBub3QgcmVsYXRpdmUgdG8gdGhlIAotICAgICAqICJzdGFydCIgb2YgdGhlIHBhcmFncmFwaC4KKyAgICAgKiBSZXR1cm5zIHRoZSBncmFwaGljYWwgd2lkdGggb2YgYSBsaW5lIGJlZ2lubmluZyBhdCAic3RhcnQiIHBhcmFtZXRlciBhbmQKKyAgICAgKiBpbmNsdWRpbmcgY2hhcmFjdGVycyB1cCB0byAiZW5kIiBwYXJhbWV0ZXIuICJzdGFydCIgYW5kICJlbmQiIGFyZQorICAgICAqIGFic29sdXRlIGluZGljZXMsIG5vdCByZWxhdGl2ZSB0byB0aGUgInN0YXJ0IiBvZiB0aGUgcGFyYWdyYXBoLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgY2hhcmFjdGVyIGluZGV4IGF0IHdoaWNoIHRvIHN0YXJ0IG1lYXN1cmluZy4KLSAgICAgKiBAcGFyYW0gZW5kIHRoZSBjaGFyYWN0ZXIgaW5kZXggYXQgd2hpY2ggdG8gc3RvcCBtZWFzdXJpbmcuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZ3JhcGhpY2FsIHdpZHRoIG9mIGEgbGluZSBiZWdpbm5pbmcgYXQgInN0YXJ0IiAgCi0gICAgICogYW5kIGluY2x1ZGluZyBjaGFyYWN0ZXJzIHVwIHRvICJlbmQiLgorICAgICAqIEBwYXJhbSBzdGFydAorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciBpbmRleCBhdCB3aGljaCB0byBzdGFydCBtZWFzdXJpbmcuCisgICAgICogQHBhcmFtIGVuZAorICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlciBpbmRleCBhdCB3aGljaCB0byBzdG9wIG1lYXN1cmluZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBncmFwaGljYWwgd2lkdGggb2YgYSBsaW5lIGJlZ2lubmluZyBhdCAic3RhcnQiIGFuZCBpbmNsdWRpbmcKKyAgICAgKiAgICAgICAgIGNoYXJhY3RlcnMgdXAgdG8gImVuZCIuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldEFkdmFuY2VCZXR3ZWVuKGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgICBicmVha2VyLnB1c2hTZWdtZW50cyhzdGFydCAtIGFjaS5nZXRCZWdpbkluZGV4KCksIGVuZCAtIGFjaS5nZXRCZWdpbkluZGV4KCkpOwpAQCAtMTQ3LDIxICsxNjIsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHdoaWNoIGlzIG5vdCBmaXQgb24gCi0gICAgICogYSBsaW5lIGJlZ2lubmluZyBhdCBzdGFydCBhbmQgcG9zc2libGUgbWVhc3VyaW5nIHVwIHRvIG1heEFkdmFuY2UgCi0gICAgICogaW4gZ3JhcGhpY2FsIHdpZHRoLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdGFydCBoZSBjaGFyYWN0ZXIgaW5kZXggYXQgd2hpY2ggdG8gc3RhcnQgbWVhc3VyaW5nLiAKLSAgICAgKiBAcGFyYW0gbWF4QWR2YW5jZSB0aGUgZ3JhcGhpY2FsIHdpZHRoIGluIHdoaWNoIHRoZSBsaW5lIG11c3QgZml0LiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgdGhhdCBpcyBmaXQgb24gYSBsaW5lIAotICAgICAqIGJlZ2lubmluZyBhdCBzdGFydCwgd2hpY2ggaXMgbm90IGxvbmdlciB0aGFuIG1heEFkdmFuY2UgaW4gZ3JhcGhpY2FsCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciB3aGljaCBpcyBub3QgZml0IG9uIGEgbGluZQorICAgICAqIGJlZ2lubmluZyBhdCBzdGFydCBhbmQgcG9zc2libGUgbWVhc3VyaW5nIHVwIHRvIG1heEFkdmFuY2UgaW4gZ3JhcGhpY2FsCiAgICAgICogd2lkdGguCisgICAgICogCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICBoZSBjaGFyYWN0ZXIgaW5kZXggYXQgd2hpY2ggdG8gc3RhcnQgbWVhc3VyaW5nLgorICAgICAqIEBwYXJhbSBtYXhBZHZhbmNlCisgICAgICogICAgICAgICAgICB0aGUgZ3JhcGhpY2FsIHdpZHRoIGluIHdoaWNoIHRoZSBsaW5lIG11c3QgZml0LgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciB0aGF0IGlzIGZpdCBvbiBhIGxpbmUKKyAgICAgKiAgICAgICAgIGJlZ2lubmluZyBhdCBzdGFydCwgd2hpY2ggaXMgbm90IGxvbmdlciB0aGFuIG1heEFkdmFuY2UgaW4KKyAgICAgKiAgICAgICAgIGdyYXBoaWNhbCB3aWR0aC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldExpbmVCcmVha0luZGV4KGludCBzdGFydCwgZmxvYXQgbWF4QWR2YW5jZSkgewogICAgICAgICBicmVha2VyLmNyZWF0ZUFsbFNlZ21lbnRzKCk7Ci0gICAgICAgIHJldHVybiBicmVha2VyLmdldExpbmVCcmVha0luZGV4KAotICAgICAgICAgICAgICAgIHN0YXJ0IC0gYWNpLmdldEJlZ2luSW5kZXgoKSwgbWF4QWR2YW5jZSkgKyBhY2kuZ2V0QmVnaW5JbmRleCgpOworICAgICAgICByZXR1cm4gYnJlYWtlci5nZXRMaW5lQnJlYWtJbmRleChzdGFydCAtIGFjaS5nZXRCZWdpbkluZGV4KCksIG1heEFkdmFuY2UpCisgICAgICAgICAgICAgICAgKyBhY2kuZ2V0QmVnaW5JbmRleCgpOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ZvbnQvVHJhbnNmb3JtQXR0cmlidXRlLmphdmEgYi9hd3QvamF2YS9hd3QvZm9udC9UcmFuc2Zvcm1BdHRyaWJ1dGUuamF2YQppbmRleCA3YzliMGJkLi5mZjJjYWEyIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZm9udC9UcmFuc2Zvcm1BdHRyaWJ1dGUuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZm9udC9UcmFuc2Zvcm1BdHRyaWJ1dGUuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJbHlhIFMuIE9rb21pbgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZm9udDsKIAogaW1wb3J0IGphdmEuYXd0Lmdlb20uQWZmaW5lVHJhbnNmb3JtOwpAQCAtMjgsMjggKzI5LDM0IEBACiAvKioKICAqIFRoZSBUcmFuc2Zvcm1BdHRyaWJ1dGUgY2xhc3MgaXMgYSB3cmFwcGVyIGZvciB0aGUgQWZmaW5lVHJhbnNmb3JtIGNsYXNzIGluCiAgKiBvcmRlciB0byB1c2UgaXQgYXMgYXR0cmlidXRlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFRyYW5zZm9ybUF0dHJpYnV0ZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzM1NjI0NzM1NzgyNzcwOTUzMEw7CiAKICAgICAvLyBhZmZpbmUgdHJhbnNmb3JtIG9mIHRoaXMgVHJhbnNmb3JtQXR0cmlidXRlIGluc3RhbmNlCi0gICAgLyoqIFRoZSB0cmFuc2Zvcm0uICovCisgICAgLyoqCisgICAgICogVGhlIHRyYW5zZm9ybS4KKyAgICAgKi8KICAgICBwcml2YXRlIEFmZmluZVRyYW5zZm9ybSBmVHJhbnNmb3JtOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFRyYW5zZm9ybUF0dHJpYnV0ZSBmcm9tIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBBZmZpbmVUcmFuc2Zvcm0uCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFRyYW5zZm9ybUF0dHJpYnV0ZSBmcm9tIHRoZSBzcGVjaWZpZWQgQWZmaW5lVHJhbnNmb3JtLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0cmFuc2Zvcm0gdGhlIEFmZmluZVRyYW5zZm9ybSB0byBiZSB3cmFwcGVkLgorICAgICAqIEBwYXJhbSB0cmFuc2Zvcm0KKyAgICAgKiAgICAgICAgICAgIHRoZSBBZmZpbmVUcmFuc2Zvcm0gdG8gYmUgd3JhcHBlZC4KICAgICAgKi8KICAgICBwdWJsaWMgVHJhbnNmb3JtQXR0cmlidXRlKEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0pIHsKICAgICAgICAgaWYgKHRyYW5zZm9ybSA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBhd3QuOTQ9dHJhbnNmb3JtIGNhbiBub3QgYmUgbnVsbAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC45NCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9Ci0gICAgICAgIGlmICghdHJhbnNmb3JtLmlzSWRlbnRpdHkoKSl7CisgICAgICAgIGlmICghdHJhbnNmb3JtLmlzSWRlbnRpdHkoKSkgewogICAgICAgICAgICAgdGhpcy5mVHJhbnNmb3JtID0gbmV3IEFmZmluZVRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgICB9CiAgICAgfQpAQCAtNjAsNyArNjcsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIGluaXRpYWwgQWZmaW5lVHJhbnNmb3JtIHdoaWNoIGlzIHdyYXBwZWQuCiAgICAgICovCiAgICAgcHVibGljIEFmZmluZVRyYW5zZm9ybSBnZXRUcmFuc2Zvcm0oKSB7Ci0gICAgICAgIGlmIChmVHJhbnNmb3JtICE9IG51bGwpeworICAgICAgICBpZiAoZlRyYW5zZm9ybSAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IEFmZmluZVRyYW5zZm9ybShmVHJhbnNmb3JtKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbmV3IEFmZmluZVRyYW5zZm9ybSgpOwpAQCAtNjksMTIgKzc2LDExIEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoaXMgdHJhbnNmb3JtIGlzIGFuIGlkZW50aXR5IHRyYW5zZm9ybS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgdHJhbnNmb3JtIGlzIGFuIGlkZW50aXR5IHRyYW5zZm9ybSwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIHRyYW5zZm9ybSBpcyBhbiBpZGVudGl0eSB0cmFuc2Zvcm0sIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNJZGVudGl0eSgpIHsKICAgICAgICAgcmV0dXJuIChmVHJhbnNmb3JtID09IG51bGwpOwogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZm9udC9wYWNrYWdlLmh0bWwgYi9hd3QvamF2YS9hd3QvZm9udC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4ZGNjMAotLS0gL2Rldi9udWxsCisrKyBiL2F3dC9qYXZhL2F3dC9mb250L3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8Ym9keT4KKyAgICA8cD4KKyAgICAgIFRoaXMgcGFja2FnZSBjb250YWlucyBjbGFzc2VzIHRvIHN1cHBvcnQgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGRpZmZlcmVudCB0eXBlcyBvZiBmb250cyBmb3IgZXhhbXBsZSBUcnVlVHlwZSBmb250cy4KKyAgICA8L3A+CisgICAgQHNpbmNlIEFuZHJvaWQgMS4wCisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9nZW9tL0FmZmluZVRyYW5zZm9ybS5qYXZhIGIvYXd0L2phdmEvYXd0L2dlb20vQWZmaW5lVHJhbnNmb3JtLmphdmEKaW5kZXggNWZkMzkzNC4uOGE2OTM4YyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2dlb20vQWZmaW5lVHJhbnNmb3JtLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2dlb20vQWZmaW5lVHJhbnNmb3JtLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0Lmdlb207CiAKIGltcG9ydCBqYXZhLmF3dC5TaGFwZTsKQEAgLTI4LDc2ICsyOSwxMTggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubWlzYy5IYXNoQ29kZTsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgQWZmaW5lVHJhbnNmb3JtIHJlcHJlc2VudHMgYSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gCi0gKiAocm90YXRpb24sIHNjYWxpbmcsIG9yIHNoZWFyKSBmb2xsb3dlZCBieSBhIHRyYW5zbGF0aW9uIHRoYXQgCi0gKiBhY3RzIG9uIGEgY29vcmRpbmF0ZSBzcGFjZS4gSXQgcHJlc2VydmVzIGNvbGluZWFyaXR5IG9mIHBvaW50cyAKLSAqIGFuZCByYXRpb3Mgb2YgZGlzdGFuY2VzIGJldHdlZW4gY29sbGluZWFyIHBvaW50czogc28gaWYgQSwgQiwgCi0gKiBhbmQgQyBhcmUgb24gYSBsaW5lLCB0aGVuIGFmdGVyIHRoZSBzcGFjZSBoYXMgYmVlbiB0cmFuc2Zvcm1lZCAKLSAqIHZpYSB0aGUgYWZmaW5lIHRyYW5zZm9ybSwgdGhlIGltYWdlcyBvZiB0aGUgdGhyZWUgcG9pbnRzIHdpbGwgCi0gKiBzdGlsbCBiZSBvbiBhIGxpbmUsIGFuZCB0aGUgcmF0aW8gb2YgdGhlIGRpc3RhbmNlIGZyb20gQSB0byBCCi0gKiB3aXRoIHRoZSBkaXN0YW5jZSBmcm9tIEIgdG8gQyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nCi0gKiByYXRpbyBpbiB0aGUgaW1hZ2Ugc3BhY2UuCisgKiBUaGUgQ2xhc3MgQWZmaW5lVHJhbnNmb3JtIHJlcHJlc2VudHMgYSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gKHJvdGF0aW9uLAorICogc2NhbGluZywgb3Igc2hlYXIpIGZvbGxvd2VkIGJ5IGEgdHJhbnNsYXRpb24gdGhhdCBhY3RzIG9uIGEgY29vcmRpbmF0ZSBzcGFjZS4KKyAqIEl0IHByZXNlcnZlcyBjb2xsaW5lYXJpdHkgb2YgcG9pbnRzIGFuZCByYXRpb3Mgb2YgZGlzdGFuY2VzIGJldHdlZW4gY29sbGluZWFyCisgKiBwb2ludHM6IHNvIGlmIEEsIEIsIGFuZCBDIGFyZSBvbiBhIGxpbmUsIHRoZW4gYWZ0ZXIgdGhlIHNwYWNlIGhhcyBiZWVuCisgKiB0cmFuc2Zvcm1lZCB2aWEgdGhlIGFmZmluZSB0cmFuc2Zvcm0sIHRoZSBpbWFnZXMgb2YgdGhlIHRocmVlIHBvaW50cyB3aWxsCisgKiBzdGlsbCBiZSBvbiBhIGxpbmUsIGFuZCB0aGUgcmF0aW8gb2YgdGhlIGRpc3RhbmNlIGZyb20gQSB0byBCIHdpdGggdGhlCisgKiBkaXN0YW5jZSBmcm9tIEIgdG8gQyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIHJhdGlvIGluIHRoZSBpbWFnZQorICogc3BhY2UuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQWZmaW5lVHJhbnNmb3JtIGltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUgewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDEzMzA5NzMyMTA1MjM4NjA4MzRMOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX0lERU5USVRZLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0lERU5USVRZLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSURFTlRJVFkgPSAwOwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9UUkFOU0xBVElPTi4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX1RSQU5TTEFUSU9OLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVFJBTlNMQVRJT04gPSAxOwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9VTklGT1JNX1NDQUxFLiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfVU5JRk9STV9TQ0FMRS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1VOSUZPUk1fU0NBTEUgPSAyOwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9HRU5FUkFMX1NDQUxFLiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfR0VORVJBTF9TQ0FMRS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0dFTkVSQUxfU0NBTEUgPSA0OwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9RVUFEUkFOVF9ST1RBVElPTi4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX1FVQURSQU5UX1JPVEFUSU9OLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfUVVBRFJBTlRfUk9UQVRJT04gPSA4OwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9HRU5FUkFMX1JPVEFUSU9OLiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfR0VORVJBTF9ST1RBVElPTi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0dFTkVSQUxfUk9UQVRJT04gPSAxNjsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfR0VORVJBTF9UUkFOU0ZPUk0uICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9HRU5FUkFMX1RSQU5TRk9STS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0dFTkVSQUxfVFJBTlNGT1JNID0gMzI7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX0ZMSVAuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9GTElQLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRkxJUCA9IDY0OwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9NQVNLX1NDQUxFLiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfTUFTS19TQ0FMRS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX01BU0tfU0NBTEUgPSBUWVBFX1VOSUZPUk1fU0NBTEUgfCBUWVBFX0dFTkVSQUxfU0NBTEU7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX01BU0tfUk9UQVRJT04uICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9NQVNLX1JPVEFUSU9OLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfTUFTS19ST1RBVElPTiA9IFRZUEVfUVVBRFJBTlRfUk9UQVRJT04gfCBUWVBFX0dFTkVSQUxfUk9UQVRJT047CiAKLSAgICAvKiogVGhlIDxjb2RlPlRZUEVfVU5LTk9XTjwvY29kZT4gaXMgYW4gaW5pdGlhbCB0eXBlIHZhbHVlLiAqLworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5UWVBFX1VOS05PV048L2NvZGU+IGlzIGFuIGluaXRpYWwgdHlwZSB2YWx1ZS4KKyAgICAgKi8KICAgICBzdGF0aWMgZmluYWwgaW50IFRZUEVfVU5LTk9XTiA9IC0xOwotICAgIAotICAgIC8qKiBUaGUgbWluIHZhbHVlIGVxdWl2YWxlbnQgdG8gemVyby4gSWYgYWJzb2x1dGUgdmFsdWUgbGVzcyB0aGVuIFpFUk8gaXQgY29uc2lkZXJlZCBhcyB6ZXJvLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG1pbiB2YWx1ZSBlcXVpdmFsZW50IHRvIHplcm8uIElmIGFic29sdXRlIHZhbHVlIGxlc3MgdGhlbiBaRVJPIGl0CisgICAgICogY29uc2lkZXJlZCBhcyB6ZXJvLgorICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBkb3VibGUgWkVSTyA9IDFFLTEwOwotICAgCi0gICAgLyoqIFRoZSB2YWx1ZXMgb2YgdHJhbnNmb3JtYXRpb24gbWF0cml4LiAqLworCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlcyBvZiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgICAgICovCiAgICAgZG91YmxlIG0wMDsKLSAgICAKLSAgICAvKiogVGhlIG0xMC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBtMTAuCisgICAgICovCiAgICAgZG91YmxlIG0xMDsKLSAgICAKLSAgICAvKiogVGhlIG0wMS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBtMDEuCisgICAgICovCiAgICAgZG91YmxlIG0wMTsKLSAgICAKLSAgICAvKiogVGhlIG0xMS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBtMTEuCisgICAgICovCiAgICAgZG91YmxlIG0xMTsKLSAgICAKLSAgICAvKiogVGhlIG0wMi4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBtMDIuCisgICAgICovCiAgICAgZG91YmxlIG0wMjsKLSAgICAKLSAgICAvKiogVGhlIG0xMi4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBtMTIuCisgICAgICovCiAgICAgZG91YmxlIG0xMjsKIAotICAgIC8qKiBUaGUgdHJhbnNmb3JtYXRpb24gPGNvZGU+dHlwZTwvY29kZT4uICovCisgICAgLyoqCisgICAgICogVGhlIHRyYW5zZm9ybWF0aW9uIDxjb2RlPnR5cGU8L2NvZGU+LgorICAgICAqLwogICAgIHRyYW5zaWVudCBpbnQgdHlwZTsKIAogICAgIC8qKgpAQCAtMTExLDEwICsxNTQsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgYWZmaW5lIHRyYW5zZm9ybSB0aGF0IGhhcyB0aGUgc2FtZSBkYXRhIGFzCi0gICAgICogdGhlIGdpdmVuIEFmZmluZVRyYW5zZm9ybS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgYWZmaW5lIHRyYW5zZm9ybSB0aGF0IGhhcyB0aGUgc2FtZSBkYXRhIGFzIHRoZSBnaXZlbgorICAgICAqIEFmZmluZVRyYW5zZm9ybS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdCB0aGUgdHJhbnNmb3JtIHRvIGNvcHkuCisgICAgICogQHBhcmFtIHQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc2Zvcm0gdG8gY29weS4KICAgICAgKi8KICAgICBwdWJsaWMgQWZmaW5lVHJhbnNmb3JtKEFmZmluZVRyYW5zZm9ybSB0KSB7CiAgICAgICAgIHRoaXMudHlwZSA9IHQudHlwZTsKQEAgLTEyOCwxNSArMTcyLDIxIEBACiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgYWZmaW5lIHRyYW5zZm9ybSBieSBzcGVjaWZ5aW5nIHRoZSB2YWx1ZXMgb2YgdGhlIDJ4MwotICAgICAqIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBhcyBmbG9hdHMuIFRoZSB0eXBlIGlzIHNldCB0byB0aGUgZGVmYXVsdAotICAgICAqIHR5cGU6IDxjb2RlPlRZUEVfVU5LTk9XTjwvY29kZT4KKyAgICAgKiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggYXMgZmxvYXRzLiBUaGUgdHlwZSBpcyBzZXQgdG8gdGhlIGRlZmF1bHQgdHlwZToKKyAgICAgKiA8Y29kZT5UWVBFX1VOS05PV048L2NvZGU+CiAgICAgICogCi0gICAgICogQHBhcmFtIG0wMCB0aGUgbTAwIGVudHJ5IGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCi0gICAgICogQHBhcmFtIG0xMCB0aGUgbTEwIGVudHJ5IGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCi0gICAgICogQHBhcmFtIG0wMSB0aGUgbTAxIGVudHJ5IGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCi0gICAgICogQHBhcmFtIG0xMSB0aGUgbTExIGVudHJ5IGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCi0gICAgICogQHBhcmFtIG0wMiB0aGUgbTAyIGVudHJ5IGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCi0gICAgICogQHBhcmFtIG0xMiB0aGUgbTEyIGVudHJ5IGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgICAgICogQHBhcmFtIG0wMAorICAgICAqICAgICAgICAgICAgdGhlIG0wMCBlbnRyeSBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICAgICAqIEBwYXJhbSBtMTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBtMTAgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KKyAgICAgKiBAcGFyYW0gbTAxCisgICAgICogICAgICAgICAgICB0aGUgbTAxIGVudHJ5IGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgICAgICogQHBhcmFtIG0xMQorICAgICAqICAgICAgICAgICAgdGhlIG0xMSBlbnRyeSBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICAgICAqIEBwYXJhbSBtMDIKKyAgICAgKiAgICAgICAgICAgIHRoZSBtMDIgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KKyAgICAgKiBAcGFyYW0gbTEyCisgICAgICogICAgICAgICAgICB0aGUgbTEyIGVudHJ5IGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCiAgICAgICovCiAgICAgcHVibGljIEFmZmluZVRyYW5zZm9ybShmbG9hdCBtMDAsIGZsb2F0IG0xMCwgZmxvYXQgbTAxLCBmbG9hdCBtMTEsIGZsb2F0IG0wMiwgZmxvYXQgbTEyKSB7CiAgICAgICAgIHRoaXMudHlwZSA9IFRZUEVfVU5LTk9XTjsKQEAgLTE1MCwxNSArMjAwLDIxIEBACiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgYWZmaW5lIHRyYW5zZm9ybSBieSBzcGVjaWZ5aW5nIHRoZSB2YWx1ZXMgb2YgdGhlIDJ4MwotICAgICAqIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBhcyBkb3VibGVzLiBUaGUgdHlwZSBpcyBzZXQgdG8gdGhlIGRlZmF1bHQKLSAgICAgKiB0eXBlOiA8Y29kZT5UWVBFX1VOS05PV048L2NvZGU+CisgICAgICogdHJhbnNmb3JtYXRpb24gbWF0cml4IGFzIGRvdWJsZXMuIFRoZSB0eXBlIGlzIHNldCB0byB0aGUgZGVmYXVsdCB0eXBlOgorICAgICAqIDxjb2RlPlRZUEVfVU5LTk9XTjwvY29kZT4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbTAwIHRoZSBtMDAgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KLSAgICAgKiBAcGFyYW0gbTEwIHRoZSBtMTAgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KLSAgICAgKiBAcGFyYW0gbTAxIHRoZSBtMDEgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KLSAgICAgKiBAcGFyYW0gbTExIHRoZSBtMTEgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KLSAgICAgKiBAcGFyYW0gbTAyIHRoZSBtMDIgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KLSAgICAgKiBAcGFyYW0gbTEyIHRoZSBtMTIgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KKyAgICAgKiBAcGFyYW0gbTAwCisgICAgICogICAgICAgICAgICB0aGUgbTAwIGVudHJ5IGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgICAgICogQHBhcmFtIG0xMAorICAgICAqICAgICAgICAgICAgdGhlIG0xMCBlbnRyeSBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICAgICAqIEBwYXJhbSBtMDEKKyAgICAgKiAgICAgICAgICAgIHRoZSBtMDEgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KKyAgICAgKiBAcGFyYW0gbTExCisgICAgICogICAgICAgICAgICB0aGUgbTExIGVudHJ5IGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgICAgICogQHBhcmFtIG0wMgorICAgICAqICAgICAgICAgICAgdGhlIG0wMiBlbnRyeSBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICAgICAqIEBwYXJhbSBtMTIKKyAgICAgKiAgICAgICAgICAgIHRoZSBtMTIgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KICAgICAgKi8KICAgICBwdWJsaWMgQWZmaW5lVHJhbnNmb3JtKGRvdWJsZSBtMDAsIGRvdWJsZSBtMTAsIGRvdWJsZSBtMDEsIGRvdWJsZSBtMTEsIGRvdWJsZSBtMDIsIGRvdWJsZSBtMTIpIHsKICAgICAgICAgdGhpcy50eXBlID0gVFlQRV9VTktOT1dOOwpAQCAtMTcxLDIwICsyMjcsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgYWZmaW5lIHRyYW5zZm9ybSBieSByZWFkaW5nIHRoZSB2YWx1ZXMgb2YgdGhlIAotICAgICAqIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBmcm9tIGFuIGFycmF5IG9mIGZsb2F0cy4gVGhlIG1hcHBpbmcgZnJvbSB0aGUKLSAgICAgKiBhcnJheSB0byB0aGUgbWF0cml4IHN0YXJ0cyB3aXRoIDxjb2RlPm1hdHJpeFswXTwvY29kZT4gZ2l2aW5nIHRoZSAKLSAgICAgKiB0b3AtbGVmdCBlbnRyeSBvZiB0aGUgbWF0cml4IGFuZCAKLSAgICAgKiBwcm9jZWVkcyB3aXRoIHRoZSB1c3VhbCBsZWZ0LXRvLXJpZ2h0IGFuZCB0b3AtZG93biBvcmRlcmluZy4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgYWZmaW5lIHRyYW5zZm9ybSBieSByZWFkaW5nIHRoZSB2YWx1ZXMgb2YgdGhlCisgICAgICogdHJhbnNmb3JtYXRpb24gbWF0cml4IGZyb20gYW4gYXJyYXkgb2YgZmxvYXRzLiBUaGUgbWFwcGluZyBmcm9tIHRoZSBhcnJheQorICAgICAqIHRvIHRoZSBtYXRyaXggc3RhcnRzIHdpdGggPGNvZGU+bWF0cml4WzBdPC9jb2RlPiBnaXZpbmcgdGhlIHRvcC1sZWZ0CisgICAgICogZW50cnkgb2YgdGhlIG1hdHJpeCBhbmQgcHJvY2VlZHMgd2l0aCB0aGUgdXN1YWwgbGVmdC10by1yaWdodCBhbmQKKyAgICAgKiB0b3AtZG93biBvcmRlcmluZy4KICAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgYXJyYXkgaGFzIG9ubHkgZm91ciBlbnRyaWVzLCB0aGVuIHRoZSB0d28gZW50cmllcyBvZiB0aGUgCi0gICAgICogbGFzdCByb3cgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBkZWZhdWx0IHRvIHplcm8uCisgICAgICogSWYgdGhlIGFycmF5IGhhcyBvbmx5IGZvdXIgZW50cmllcywgdGhlbiB0aGUgdHdvIGVudHJpZXMgb2YgdGhlIGxhc3Qgcm93CisgICAgICogb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBkZWZhdWx0IHRvIHplcm8uCiAgICAgICogCi0gICAgICogQHBhcmFtIG1hdHJpeCB0aGUgYXJyYXkgb2YgZm91ciBvciBzaXggZmxvYXRzIGdpdmluZyB0aGUgdmFsdWVzIAotICAgICAqIG9mIHRoZSBtYXRyaXguCi0gICAgICogCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIHNpemUgb2YgdGhlIGFycmF5Ci0gICAgICogaXMgMCwgMSwgMiwgMywgb3IgNS4KKyAgICAgKiBAcGFyYW0gbWF0cml4CisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgZm91ciBvciBzaXggZmxvYXRzIGdpdmluZyB0aGUgdmFsdWVzIG9mIHRoZQorICAgICAqICAgICAgICAgICAgbWF0cml4LgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNpemUgb2YgdGhlIGFycmF5IGlzIDAsIDEsIDIsIDMsIG9yIDUuCiAgICAgICovCiAgICAgcHVibGljIEFmZmluZVRyYW5zZm9ybShmbG9hdFtdIG1hdHJpeCkgewogICAgICAgICB0aGlzLnR5cGUgPSBUWVBFX1VOS05PV047CkBAIC0xOTksMjAgKzI1NSwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBhZmZpbmUgdHJhbnNmb3JtIGJ5IHJlYWRpbmcgdGhlIHZhbHVlcyBvZiB0aGUgCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGFmZmluZSB0cmFuc2Zvcm0gYnkgcmVhZGluZyB0aGUgdmFsdWVzIG9mIHRoZQogICAgICAqIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBmcm9tIGFuIGFycmF5IG9mIGRvdWJsZXMuIFRoZSBtYXBwaW5nIGZyb20gdGhlCi0gICAgICogYXJyYXkgdG8gdGhlIG1hdHJpeCBzdGFydHMgd2l0aCA8Y29kZT5tYXRyaXhbMF08L2NvZGU+IGdpdmluZyB0aGUgCi0gICAgICogdG9wLWxlZnQgZW50cnkgb2YgdGhlIG1hdHJpeCBhbmQgCi0gICAgICogcHJvY2VlZHMgd2l0aCB0aGUgdXN1YWwgbGVmdC10by1yaWdodCBhbmQgdG9wLWRvd24gb3JkZXJpbmcuCisgICAgICogYXJyYXkgdG8gdGhlIG1hdHJpeCBzdGFydHMgd2l0aCA8Y29kZT5tYXRyaXhbMF08L2NvZGU+IGdpdmluZyB0aGUKKyAgICAgKiB0b3AtbGVmdCBlbnRyeSBvZiB0aGUgbWF0cml4IGFuZCBwcm9jZWVkcyB3aXRoIHRoZSB1c3VhbCBsZWZ0LXRvLXJpZ2h0CisgICAgICogYW5kIHRvcC1kb3duIG9yZGVyaW5nLgogICAgICAqIDxwPgotICAgICAqIElmIHRoZSBhcnJheSBoYXMgb25seSBmb3VyIGVudHJpZXMsIHRoZW4gdGhlIHR3byBlbnRyaWVzIG9mIHRoZSAKLSAgICAgKiBsYXN0IHJvdyBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IGRlZmF1bHQgdG8gemVyby4KKyAgICAgKiBJZiB0aGUgYXJyYXkgaGFzIG9ubHkgZm91ciBlbnRyaWVzLCB0aGVuIHRoZSB0d28gZW50cmllcyBvZiB0aGUgbGFzdCByb3cKKyAgICAgKiBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IGRlZmF1bHQgdG8gemVyby4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWF0cml4IHRoZSBhcnJheSBvZiBmb3VyIG9yIHNpeCBkb3VibGVzIGdpdmluZyB0aGUgdmFsdWVzIAotICAgICAqIG9mIHRoZSBtYXRyaXguCi0gICAgICogCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIHNpemUgb2YgdGhlIGFycmF5Ci0gICAgICogaXMgMCwgMSwgMiwgMywgb3IgNS4KKyAgICAgKiBAcGFyYW0gbWF0cml4CisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgZm91ciBvciBzaXggZG91YmxlcyBnaXZpbmcgdGhlIHZhbHVlcyBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgIG1hdHJpeC4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSBhcnJheSBpcyAwLCAxLCAyLCAzLCBvciA1LgogICAgICAqLwogICAgIHB1YmxpYyBBZmZpbmVUcmFuc2Zvcm0oZG91YmxlW10gbWF0cml4KSB7CiAgICAgICAgIHRoaXMudHlwZSA9IFRZUEVfVU5LTk9XTjsKQEAgLTIyNiwyNyArMjgyLDI2IEBACiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFJldHVybnMgdHlwZSBvZiB0aGUgYWZmaW5lIHRyYW5zZm9ybWF0aW9uLgogICAgICAqIDxwPgotICAgICAqIFRoZSB0eXBlIGlzIGNvbXB1dGVkIGFzIGZvbGxvd3M6IExhYmVsIHRoZSBlbnRyaWVzIG9mIHRoZSAKLSAgICAgKiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggYXMgdGhyZWUgcm93cyAobTAwLCBtMDEpLCAobTEwLCBtMTEpLCBhbmQKLSAgICAgKiAobTAyLCBtMTIpLiBUaGVuIGlmIHRoZSBvcmlnaW5hbCBiYXNpcyB2ZWN0b3JzIGFyZSAoMSwgMCkgYW5kICgwLCAxKSwgCi0gICAgICogdGhlIG5ldyBiYXNpcyB2ZWN0b3JzIGFmdGVyIHRyYW5zZm9ybWF0aW9uIGFyZSBnaXZlbiBieSAobTAwLCBtMDEpIAotICAgICAqIGFuZCAobTEwLCBtMTEpLCBhbmQgdGhlIHRyYW5zbGF0aW9uIHZlY3RvciBpcyAobTAyLCBtMTIpLgorICAgICAqIFRoZSB0eXBlIGlzIGNvbXB1dGVkIGFzIGZvbGxvd3M6IExhYmVsIHRoZSBlbnRyaWVzIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbgorICAgICAqIG1hdHJpeCBhcyB0aHJlZSByb3dzIChtMDAsIG0wMSksIChtMTAsIG0xMSksIGFuZCAobTAyLCBtMTIpLiBUaGVuIGlmIHRoZQorICAgICAqIG9yaWdpbmFsIGJhc2lzIHZlY3RvcnMgYXJlICgxLCAwKSBhbmQgKDAsIDEpLCB0aGUgbmV3IGJhc2lzIHZlY3RvcnMgYWZ0ZXIKKyAgICAgKiB0cmFuc2Zvcm1hdGlvbiBhcmUgZ2l2ZW4gYnkgKG0wMCwgbTAxKSBhbmQgKG0xMCwgbTExKSwgYW5kIHRoZQorICAgICAqIHRyYW5zbGF0aW9uIHZlY3RvciBpcyAobTAyLCBtMTIpLgogICAgICAqIDxwPgotICAgICAqIFRoZSB0eXBlcyBhcmUgY2xhc3NpZmllZCBhcyBmb2xsb3dzOiA8YnIvPiAKLSAgICAgKiAgIFRZUEVfSURFTlRJVFkgLSBubyBjaGFuZ2U8YnIvPgotICAgICAqICAgVFlQRV9UUkFOU0xBVElPTiAtIFRoZSB0cmFuc2xhdGlvbiB2ZWN0b3IgaXNuJ3QgemVybzxici8+Ci0gICAgICogICBUWVBFX1VOSUZPUk1fU0NBTEUgLSBUaGUgbmV3IGJhc2lzIHZlY3RvcnMgaGF2ZSBlcXVhbCBsZW5ndGg8YnIvPgotICAgICAqICAgVFlQRV9HRU5FUkFMX1NDQUxFIC0gVGhlIG5ldyBiYXNpcyB2ZWN0b3JzIGRvbnQnIGhhdmUgZXF1YWwgbGVuZ3RoPGJyLz4KLSAgICAgKiAgIFRZUEVfRkxJUCAtIFRoZSBuZXcgYmFzaXMgdmVjdG9yIG9yaWVudGF0aW9uIGRpZmZlcnMgZnJvbSB0aGUgb3JpZ2luYWwgb25lPGJyLz4KLSAgICAgKiAgIFRZUEVfUVVBRFJBTlRfUk9UQVRJT04gLSBUaGUgbmV3IGJhc2lzIGlzIGEgcm90YXRpb24gb2YgdGhlIG9yaWdpbmFsIGJ5IDkwLCAxODAsIDI3MCwgb3IgMzYwIGRlZ3JlZXM8YnIvPiAgIAotICAgICAqICAgVFlQRV9HRU5FUkFMX1JPVEFUSU9OIC0gVGhlIG5ldyBiYXNpcyBpcyBhIHJvdGF0aW9uIG9mIHRoZSBvcmlnaW5hbCBieSBhbiBhcmJpdHJhcnkgYW5nbGU8YnIvPgotICAgICAqICAgVFlQRV9HRU5FUkFMX1RSQU5TRk9STSAtIFRoZSB0cmFuc2Zvcm1hdGlvbiBjYW4ndCBiZSBpbnZlcnRlZC48YnIvPgotICAgICAqICAgPHA+Ci0gICAgICogTm90ZSB0aGF0IG11bHRpcGxlIHR5cGVzIGFyZSBwb3NzaWJsZSwgdGh1cyB0aGUgdHlwZXMgY2FuIGJlIGNvbWJpbmVkIAorICAgICAqIFRoZSB0eXBlcyBhcmUgY2xhc3NpZmllZCBhcyBmb2xsb3dzOiA8YnIvPiBUWVBFX0lERU5USVRZIC0gbm8gY2hhbmdlPGJyLz4KKyAgICAgKiBUWVBFX1RSQU5TTEFUSU9OIC0gVGhlIHRyYW5zbGF0aW9uIHZlY3RvciBpc24ndCB6ZXJvPGJyLz4KKyAgICAgKiBUWVBFX1VOSUZPUk1fU0NBTEUgLSBUaGUgbmV3IGJhc2lzIHZlY3RvcnMgaGF2ZSBlcXVhbCBsZW5ndGg8YnIvPgorICAgICAqIFRZUEVfR0VORVJBTF9TQ0FMRSAtIFRoZSBuZXcgYmFzaXMgdmVjdG9ycyBkb250JyBoYXZlIGVxdWFsIGxlbmd0aDxici8+CisgICAgICogVFlQRV9GTElQIC0gVGhlIG5ldyBiYXNpcyB2ZWN0b3Igb3JpZW50YXRpb24gZGlmZmVycyBmcm9tIHRoZSBvcmlnaW5hbAorICAgICAqIG9uZTxici8+IFRZUEVfUVVBRFJBTlRfUk9UQVRJT04gLSBUaGUgbmV3IGJhc2lzIGlzIGEgcm90YXRpb24gb2YgdGhlCisgICAgICogb3JpZ2luYWwgYnkgOTAsIDE4MCwgMjcwLCBvciAzNjAgZGVncmVlczxici8+IFRZUEVfR0VORVJBTF9ST1RBVElPTiAtIFRoZQorICAgICAqIG5ldyBiYXNpcyBpcyBhIHJvdGF0aW9uIG9mIHRoZSBvcmlnaW5hbCBieSBhbiBhcmJpdHJhcnkgYW5nbGU8YnIvPgorICAgICAqIFRZUEVfR0VORVJBTF9UUkFOU0ZPUk0gLSBUaGUgdHJhbnNmb3JtYXRpb24gY2FuJ3QgYmUgaW52ZXJ0ZWQuPGJyLz4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgbXVsdGlwbGUgdHlwZXMgYXJlIHBvc3NpYmxlLCB0aHVzIHRoZSB0eXBlcyBjYW4gYmUgY29tYmluZWQKICAgICAgKiB1c2luZyBiaXR3aXNlIGNvbWJpbmF0aW9ucy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBBZmZpbmUgVHJhbnNmb3JtLgpAQCAtMjY1LDExICszMjAsMTAgQEAKIAogICAgICAgICBpZiAobTAyICE9IDAuMCB8fCBtMTIgIT0gMC4wKSB7CiAgICAgICAgICAgICB0eXBlIHw9IFRZUEVfVFJBTlNMQVRJT047Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgaWYgKG0wMCA9PSAxLjAgJiYgbTExID09IDEuMCAmJiBtMDEgPT0gMC4wICYmIG0xMCA9PSAwLjApIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gVFlQRV9JREVOVElUWTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtMDAgPT0gMS4wICYmIG0xMSA9PSAxLjAgJiYgbTAxID09IDAuMCAmJiBtMTAgPT0gMC4wKSB7CisgICAgICAgICAgICB0eXBlID0gVFlQRV9JREVOVElUWTsKKyAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICB9CiAKICAgICAgICAgaWYgKG0wMCAqIG0xMSAtIG0wMSAqIG0xMCA8IDAuMCkgewogICAgICAgICAgICAgdHlwZSB8PSBUWVBFX0ZMSVA7CkBAIC0yNzksMjYgKzMzMywyMiBAQAogICAgICAgICBkb3VibGUgZHkgPSBtMDEgKiBtMDEgKyBtMTEgKiBtMTE7CiAgICAgICAgIGlmIChkeCAhPSBkeSkgewogICAgICAgICAgICAgdHlwZSB8PSBUWVBFX0dFTkVSQUxfU0NBTEU7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgaWYgKGR4ICE9IDEuMCkgewotICAgICAgICAgICAgICAgIHR5cGUgfD0gVFlQRV9VTklGT1JNX1NDQUxFOwotICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGR4ICE9IDEuMCkgeworICAgICAgICAgICAgdHlwZSB8PSBUWVBFX1VOSUZPUk1fU0NBTEU7CisgICAgICAgIH0KIAotICAgICAgICBpZiAoKG0wMCA9PSAwLjAgJiYgbTExID09IDAuMCkgfHwKLSAgICAgICAgICAgIChtMTAgPT0gMC4wICYmIG0wMSA9PSAwLjAgJiYgKG0wMCA8IDAuMCB8fCBtMTEgPCAwLjApKSkKLSAgICAgICAgeworICAgICAgICBpZiAoKG0wMCA9PSAwLjAgJiYgbTExID09IDAuMCkgfHwgKG0xMCA9PSAwLjAgJiYgbTAxID09IDAuMCAmJiAobTAwIDwgMC4wIHx8IG0xMSA8IDAuMCkpKSB7CiAgICAgICAgICAgICB0eXBlIHw9IFRZUEVfUVVBRFJBTlRfUk9UQVRJT047Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgaWYgKG0wMSAhPSAwLjAgfHwgbTEwICE9IDAuMCkgewotICAgICAgICAgICAgICAgIHR5cGUgfD0gVFlQRV9HRU5FUkFMX1JPVEFUSU9OOwotICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG0wMSAhPSAwLjAgfHwgbTEwICE9IDAuMCkgeworICAgICAgICAgICAgdHlwZSB8PSBUWVBFX0dFTkVSQUxfUk9UQVRJT047CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gdHlwZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzY2FsZSB4IGVudHJ5IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgKLSAgICAgKiAodGhlIHVwcGVyIGxlZnQgbWF0cml4IGVudHJ5KS4KKyAgICAgKiBHZXRzIHRoZSBzY2FsZSB4IGVudHJ5IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggKHRoZSB1cHBlciBsZWZ0CisgICAgICogbWF0cml4IGVudHJ5KS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBzY2FsZSB4IHZhbHVlLgogICAgICAqLwpAQCAtMzA3LDggKzM1Nyw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2NhbGUgeSBlbnRyeSBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4Ci0gICAgICogKHRoZSBsb3dlciByaWdodCBlbnRyeSBvZiB0aGUgbGluZWFyIHRyYW5zZm9ybWF0aW9uKS4KKyAgICAgKiBHZXRzIHRoZSBzY2FsZSB5IGVudHJ5IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggKHRoZSBsb3dlciByaWdodAorICAgICAqIGVudHJ5IG9mIHRoZSBsaW5lYXIgdHJhbnNmb3JtYXRpb24pLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHNjYWxlIHkgdmFsdWUuCiAgICAgICovCkBAIC0zMTcsOCArMzY3LDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzaGVhciB4IGVudHJ5IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgKLSAgICAgKiAodGhlIHVwcGVyIHJpZ2h0IGVudHJ5IG9mIHRoZSBsaW5lYXIgdHJhbnNmb3JtYXRpb24pLgorICAgICAqIEdldHMgdGhlIHNoZWFyIHggZW50cnkgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAodGhlIHVwcGVyIHJpZ2h0CisgICAgICogZW50cnkgb2YgdGhlIGxpbmVhciB0cmFuc2Zvcm1hdGlvbikuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgc2hlYXIgeCB2YWx1ZS4KICAgICAgKi8KQEAgLTMyNyw4ICszNzcsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNoZWFyIHkgZW50cnkgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeAotICAgICAqICh0aGUgbG93ZXIgbGVmdCBlbnRyeSBvZiB0aGUgbGluZWFyIHRyYW5zZm9ybWF0aW9uKS4KKyAgICAgKiBHZXRzIHRoZSBzaGVhciB5IGVudHJ5IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggKHRoZSBsb3dlciBsZWZ0IGVudHJ5CisgICAgICogb2YgdGhlIGxpbmVhciB0cmFuc2Zvcm1hdGlvbikuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgc2hlYXIgeSB2YWx1ZS4KICAgICAgKi8KQEAgLTM2NCwxNSArNDE0LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSB2YWx1ZXMgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBpbnRvIHRoZSBnaXZlbiAKLSAgICAgKiBhcnJheSBvZiBkb3VibGVzLiBJZiB0aGUgYXJyYXkgaGFzIGxlbmd0aCA0LCBvbmx5IHRoZSBsaW5lYXIKLSAgICAgKiB0cmFuc2Zvcm1hdGlvbiBwYXJ0IHdpbGwgYmUgd3JpdHRlbiBpbnRvIGl0LiBJZiBpdCBoYXMgbGVuZ3RoIAotICAgICAqIGdyZWF0ZXIgdGhhbiA0LCB0aGUgdHJhbnNsYXRpb24gdmVjdG9yIHdpbGwgYmUgaW5jbHVkZWQgYXMgd2VsbC4KKyAgICAgKiBXcml0ZXMgdGhlIHZhbHVlcyBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IGludG8gdGhlIGdpdmVuIGFycmF5IG9mCisgICAgICogZG91Ymxlcy4gSWYgdGhlIGFycmF5IGhhcyBsZW5ndGggNCwgb25seSB0aGUgbGluZWFyIHRyYW5zZm9ybWF0aW9uIHBhcnQKKyAgICAgKiB3aWxsIGJlIHdyaXR0ZW4gaW50byBpdC4gSWYgaXQgaGFzIGxlbmd0aCBncmVhdGVyIHRoYW4gNCwgdGhlIHRyYW5zbGF0aW9uCisgICAgICogdmVjdG9yIHdpbGwgYmUgaW5jbHVkZWQgYXMgd2VsbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWF0cml4IHRoZSBhcnJheSB0byBmaWxsIHdpdGggdGhlIHZhbHVlcyBvZiB0aGUgbWF0cml4LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBzaXplIG9mIHRoZSBhcnJheQotICAgICAqIGlzIDAsIDEsIDIsIDMsIG9yIDUuCisgICAgICogQHBhcmFtIG1hdHJpeAorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHRvIGZpbGwgd2l0aCB0aGUgdmFsdWVzIG9mIHRoZSBtYXRyaXguCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgaXMgMCwgMSwgMiwgMywgb3IgNS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXRNYXRyaXgoZG91YmxlW10gbWF0cml4KSB7CiAgICAgICAgIG1hdHJpeFswXSA9IG0wMDsKQEAgLTM5NywxMiArNDQ3LDE4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgdHJhbnNmb3JtIGluIHRlcm1zIG9mIGEgbGlzdCBvZiBkb3VibGUgdmFsdWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBtMDAgdGhlIG0wMCBjb29yZGluYXRlIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCi0gICAgICogQHBhcmFtIG0xMCB0aGUgbTEwIGNvb3JkaW5hdGUgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KLSAgICAgKiBAcGFyYW0gbTAxIHRoZSBtMDEgY29vcmRpbmF0ZSBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgotICAgICAqIEBwYXJhbSBtMTEgdGhlIG0xMSBjb29yZGluYXRlIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCi0gICAgICogQHBhcmFtIG0wMiB0aGUgbTAyIGNvb3JkaW5hdGUgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KLSAgICAgKiBAcGFyYW0gbTEyIHRoZSBtMTIgY29vcmRpbmF0ZSBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICAgICAqIEBwYXJhbSBtMDAKKyAgICAgKiAgICAgICAgICAgIHRoZSBtMDAgY29vcmRpbmF0ZSBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICAgICAqIEBwYXJhbSBtMTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBtMTAgY29vcmRpbmF0ZSBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICAgICAqIEBwYXJhbSBtMDEKKyAgICAgKiAgICAgICAgICAgIHRoZSBtMDEgY29vcmRpbmF0ZSBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICAgICAqIEBwYXJhbSBtMTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBtMTEgY29vcmRpbmF0ZSBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICAgICAqIEBwYXJhbSBtMDIKKyAgICAgKiAgICAgICAgICAgIHRoZSBtMDIgY29vcmRpbmF0ZSBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICAgICAqIEBwYXJhbSBtMTIKKyAgICAgKiAgICAgICAgICAgIHRoZSBtMTIgY29vcmRpbmF0ZSBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zZm9ybShkb3VibGUgbTAwLCBkb3VibGUgbTEwLCBkb3VibGUgbTAxLCBkb3VibGUgbTExLCBkb3VibGUgbTAyLCBkb3VibGUgbTEyKSB7CiAgICAgICAgIHRoaXMudHlwZSA9IFRZUEVfVU5LTk9XTjsKQEAgLTQxNSwxMCArNDcxLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdHJhbnNmb3JtJ3MgZGF0YSB0byBtYXRjaCB0aGUgZGF0YSBvZiB0aGUgdHJhbnNmb3JtIAotICAgICAqIHNlbnQgYXMgYSBwYXJhbWV0ZXIuCisgICAgICogU2V0cyB0aGUgdHJhbnNmb3JtJ3MgZGF0YSB0byBtYXRjaCB0aGUgZGF0YSBvZiB0aGUgdHJhbnNmb3JtIHNlbnQgYXMgYQorICAgICAqIHBhcmFtZXRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdCB0aGUgdHJhbnNmb3JtIHRoYXQgZ2l2ZXMgdGhlIG5ldyB2YWx1ZXMuCisgICAgICogQHBhcmFtIHQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc2Zvcm0gdGhhdCBnaXZlcyB0aGUgbmV3IHZhbHVlcy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2Zvcm0oQWZmaW5lVHJhbnNmb3JtIHQpIHsKICAgICAgICAgdHlwZSA9IHQudHlwZTsKQEAgLTQzNSwxNSArNDkyLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdHJhbnNmb3JtYXRpb24gdG8gYSB0cmFuc2xhdGlvbiBhbG9uZS4KLSAgICAgKiBTZXRzIHRoZSBsaW5lYXIgcGFydCBvZiB0aGUgdHJhbnNmb3JtYXRpb24gdG8gaWRlbnRpdHkgCi0gICAgICogYW5kIHRoZSB0cmFuc2xhdGlvbiB2ZWN0b3IgdG8gdGhlIHZhbHVlcyBzZW50IGFzIHBhcmFtZXRlcnMuCi0gICAgICogU2V0cyB0aGUgdHlwZSB0byA8Y29kZT5UWVBFX0lERU5USVRZPC9jb2RlPgotICAgICAqIGlmIHRoZSByZXN1bHRpbmcgQWZmaW5lVHJhbnNmb3JtYXRpb24gaXMgdGhlIGlkZW50aXR5IAotICAgICAqIHRyYW5zZm9ybWF0aW9uLCBvdGhlcndpc2Ugc2V0cyBpdCB0byA8Y29kZT5UWVBFX1RSQU5TTEFUSU9OPC9jb2RlPi4KKyAgICAgKiBTZXRzIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBhIHRyYW5zbGF0aW9uIGFsb25lLiBTZXRzIHRoZSBsaW5lYXIgcGFydCBvZgorICAgICAqIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBpZGVudGl0eSBhbmQgdGhlIHRyYW5zbGF0aW9uIHZlY3RvciB0byB0aGUgdmFsdWVzCisgICAgICogc2VudCBhcyBwYXJhbWV0ZXJzLiBTZXRzIHRoZSB0eXBlIHRvIDxjb2RlPlRZUEVfSURFTlRJVFk8L2NvZGU+IGlmIHRoZQorICAgICAqIHJlc3VsdGluZyBBZmZpbmVUcmFuc2Zvcm1hdGlvbiBpcyB0aGUgaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24sIG90aGVyd2lzZQorICAgICAqIHNldHMgaXQgdG8gPGNvZGU+VFlQRV9UUkFOU0xBVElPTjwvY29kZT4uCiAgICAgICogCi0gICAgICogQHBhcmFtIG14IHRoZSBkaXN0YW5jZSB0byB0cmFuc2xhdGUgaW4gdGhlIHggZGlyZWN0aW9uLgotICAgICAqIEBwYXJhbSBteSB0aGUgZGlzdGFuY2UgdG8gdHJhbnNsYXRlIGluIHRoZSB5IGRpcmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gbXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0YW5jZSB0byB0cmFuc2xhdGUgaW4gdGhlIHggZGlyZWN0aW9uLgorICAgICAqIEBwYXJhbSBteQorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBpbiB0aGUgeSBkaXJlY3Rpb24uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VG9UcmFuc2xhdGlvbihkb3VibGUgbXgsIGRvdWJsZSBteSkgewogICAgICAgICBtMDAgPSBtMTEgPSAxLjA7CkBAIC00NTgsMTQgKzUxNiwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRyYW5zZm9ybWF0aW9uIHRvIGJlaW5nIGEgc2NhbGUgYWxvbmUsIGVsaW1pbmF0aW5nIAotICAgICAqIHJvdGF0aW9uLCBzaGVhciwgYW5kIHRyYW5zbGF0aW9uIGVsZW1lbnRzLgotICAgICAqIFNldHMgdGhlIHR5cGUgdG8gPGNvZGU+VFlQRV9JREVOVElUWTwvY29kZT4KLSAgICAgKiBpZiB0aGUgcmVzdWx0aW5nIEFmZmluZVRyYW5zZm9ybWF0aW9uIGlzIHRoZSBpZGVudGl0eSAKLSAgICAgKiB0cmFuc2Zvcm1hdGlvbiwgb3RoZXJ3aXNlIHNldHMgaXQgdG8gPGNvZGU+VFlQRV9VTktOT1dOPC9jb2RlPi4KKyAgICAgKiBTZXRzIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBiZWluZyBhIHNjYWxlIGFsb25lLCBlbGltaW5hdGluZyByb3RhdGlvbiwKKyAgICAgKiBzaGVhciwgYW5kIHRyYW5zbGF0aW9uIGVsZW1lbnRzLiBTZXRzIHRoZSB0eXBlIHRvCisgICAgICogPGNvZGU+VFlQRV9JREVOVElUWTwvY29kZT4gaWYgdGhlIHJlc3VsdGluZyBBZmZpbmVUcmFuc2Zvcm1hdGlvbiBpcyB0aGUKKyAgICAgKiBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbiwgb3RoZXJ3aXNlIHNldHMgaXQgdG8gPGNvZGU+VFlQRV9VTktOT1dOPC9jb2RlPi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2N4IHRoZSBzY2FsaW5nIGZhY3RvciBpbiB0aGUgeCBkaXJlY3Rpb24uCi0gICAgICogQHBhcmFtIHNjeSB0aGUgc2NhbGluZyBmYWN0b3IgaW4gdGhlIHkgZGlyZWN0aW9uLgorICAgICAqIEBwYXJhbSBzY3gKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2FsaW5nIGZhY3RvciBpbiB0aGUgeCBkaXJlY3Rpb24uCisgICAgICogQHBhcmFtIHNjeQorICAgICAqICAgICAgICAgICAgdGhlIHNjYWxpbmcgZmFjdG9yIGluIHRoZSB5IGRpcmVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUb1NjYWxlKGRvdWJsZSBzY3gsIGRvdWJsZSBzY3kpIHsKICAgICAgICAgbTAwID0gc2N4OwpAQCAtNDc5LDE0ICs1MzgsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBiZWluZyBhIHNoZWFyIGFsb25lLCBlbGltaW5hdGluZyAKLSAgICAgKiByb3RhdGlvbiwgc2NhbGluZywgYW5kIHRyYW5zbGF0aW9uIGVsZW1lbnRzLgotICAgICAqIFNldHMgdGhlIHR5cGUgdG8gPGNvZGU+VFlQRV9JREVOVElUWTwvY29kZT4KLSAgICAgKiBpZiB0aGUgcmVzdWx0aW5nIEFmZmluZVRyYW5zZm9ybWF0aW9uIGlzIHRoZSBpZGVudGl0eSAKLSAgICAgKiB0cmFuc2Zvcm1hdGlvbiwgb3RoZXJ3aXNlIHNldHMgaXQgdG8gPGNvZGU+VFlQRV9VTktOT1dOPC9jb2RlPi4KKyAgICAgKiBTZXRzIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBiZWluZyBhIHNoZWFyIGFsb25lLCBlbGltaW5hdGluZyByb3RhdGlvbiwKKyAgICAgKiBzY2FsaW5nLCBhbmQgdHJhbnNsYXRpb24gZWxlbWVudHMuIFNldHMgdGhlIHR5cGUgdG8KKyAgICAgKiA8Y29kZT5UWVBFX0lERU5USVRZPC9jb2RlPiBpZiB0aGUgcmVzdWx0aW5nIEFmZmluZVRyYW5zZm9ybWF0aW9uIGlzIHRoZQorICAgICAqIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uLCBvdGhlcndpc2Ugc2V0cyBpdCB0byA8Y29kZT5UWVBFX1VOS05PV048L2NvZGU+LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaHggdGhlIHNoZWFyaW5nIGZhY3RvciBpbiB0aGUgeCBkaXJlY3Rpb24uCi0gICAgICogQHBhcmFtIHNoeSB0aGUgc2hlYXJpbmcgZmFjdG9yIGluIHRoZSB5IGRpcmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gc2h4CisgICAgICogICAgICAgICAgICB0aGUgc2hlYXJpbmcgZmFjdG9yIGluIHRoZSB4IGRpcmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gc2h5CisgICAgICogICAgICAgICAgICB0aGUgc2hlYXJpbmcgZmFjdG9yIGluIHRoZSB5IGRpcmVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUb1NoZWFyKGRvdWJsZSBzaHgsIGRvdWJsZSBzaHkpIHsKICAgICAgICAgbTAwID0gbTExID0gMS4wOwpAQCAtNTAxLDEzICs1NjEsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBiZWluZyBhIHJvdGF0aW9uIGFsb25lLCBlbGltaW5hdGluZyAKLSAgICAgKiBzaGVhcmluZywgc2NhbGluZywgYW5kIHRyYW5zbGF0aW9uIGVsZW1lbnRzLgotICAgICAqIFNldHMgdGhlIHR5cGUgdG8gPGNvZGU+VFlQRV9JREVOVElUWTwvY29kZT4KLSAgICAgKiBpZiB0aGUgcmVzdWx0aW5nIEFmZmluZVRyYW5zZm9ybWF0aW9uIGlzIHRoZSBpZGVudGl0eSAKLSAgICAgKiB0cmFuc2Zvcm1hdGlvbiwgb3RoZXJ3aXNlIHNldHMgaXQgdG8gPGNvZGU+VFlQRV9VTktOT1dOPC9jb2RlPi4KKyAgICAgKiBTZXRzIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBiZWluZyBhIHJvdGF0aW9uIGFsb25lLCBlbGltaW5hdGluZyBzaGVhcmluZywKKyAgICAgKiBzY2FsaW5nLCBhbmQgdHJhbnNsYXRpb24gZWxlbWVudHMuIFNldHMgdGhlIHR5cGUgdG8KKyAgICAgKiA8Y29kZT5UWVBFX0lERU5USVRZPC9jb2RlPiBpZiB0aGUgcmVzdWx0aW5nIEFmZmluZVRyYW5zZm9ybWF0aW9uIGlzIHRoZQorICAgICAqIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uLCBvdGhlcndpc2Ugc2V0cyBpdCB0byA8Y29kZT5UWVBFX1VOS05PV048L2NvZGU+LgogICAgICAqIAotICAgICAqIEBwYXJhbSBhbmdsZSB0aGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFucy4KKyAgICAgKiBAcGFyYW0gYW5nbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRvUm90YXRpb24oZG91YmxlIGFuZ2xlKSB7CiAgICAgICAgIGRvdWJsZSBzaW4gPSBNYXRoLnNpbihhbmdsZSk7CkBAIC01MTUsMTEgKzU3NSwxMCBAQAogICAgICAgICBpZiAoTWF0aC5hYnMoY29zKSA8IFpFUk8pIHsKICAgICAgICAgICAgIGNvcyA9IDAuMDsKICAgICAgICAgICAgIHNpbiA9IHNpbiA+IDAuMCA/IDEuMCA6IC0xLjA7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgaWYgKE1hdGguYWJzKHNpbikgPCBaRVJPKSB7Ci0gICAgICAgICAgICAgICAgc2luID0gMC4wOwotICAgICAgICAgICAgICAgIGNvcyA9IGNvcyA+IDAuMCA/IDEuMCA6IC0xLjA7Ci0gICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoc2luKSA8IFpFUk8pIHsKKyAgICAgICAgICAgIHNpbiA9IDAuMDsKKyAgICAgICAgICAgIGNvcyA9IGNvcyA+IDAuMCA/IDEuMCA6IC0xLjA7CisgICAgICAgIH0KICAgICAgICAgbTAwID0gbTExID0gY29zOwogICAgICAgICBtMDEgPSAtc2luOwogICAgICAgICBtMTAgPSBzaW47CkBAIC01MjgsMTMgKzU4NywxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRyYW5zZm9ybWF0aW9uIHRvIGJlaW5nIGEgcm90YXRpb24gZm9sbG93ZWQgYnkgYSAKLSAgICAgKiB0cmFuc2xhdGlvbi4gCisgICAgICogU2V0cyB0aGUgdHJhbnNmb3JtYXRpb24gdG8gYmVpbmcgYSByb3RhdGlvbiBmb2xsb3dlZCBieSBhIHRyYW5zbGF0aW9uLgogICAgICAqIFNldHMgdGhlIHR5cGUgdG8gPGNvZGU+VFlQRV9VTktOT1dOPC9jb2RlPi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYW5nbGUgdGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnMuCi0gICAgICogQHBhcmFtIHB4IHRoZSBkaXN0YW5jZSB0byB0cmFuc2xhdGUgaW4gdGhlIHggZGlyZWN0aW9uLgotICAgICAqIEBwYXJhbSBweSB0aGUgZGlzdGFuY2UgdG8gdHJhbnNsYXRlIGluIHRoZSB5IGRpcmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gYW5nbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zLgorICAgICAqIEBwYXJhbSBweAorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBpbiB0aGUgeCBkaXJlY3Rpb24uCisgICAgICogQHBhcmFtIHB5CisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgdG8gdHJhbnNsYXRlIGluIHRoZSB5IGRpcmVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUb1JvdGF0aW9uKGRvdWJsZSBhbmdsZSwgZG91YmxlIHB4LCBkb3VibGUgcHkpIHsKICAgICAgICAgc2V0VG9Sb3RhdGlvbihhbmdsZSk7CkBAIC01NDQsMTUgKzYwNSwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgQWZmaW5lVHJhbnNmb3JtYXRpb24gdGhhdCBpcyBhIHRyYW5zbGF0aW9uIGFsb25lCi0gICAgICogd2l0aCB0aGUgdHJhbnNsYXRpb24gdmVjdG9yIGdpdmVuIGJ5IHRoZSB2YWx1ZXMgc2VudCBhcyBwYXJhbWV0ZXJzLgotICAgICAqIFRoZSBuZXcgdHJhbnNmb3JtYXRpb24ncyB0eXBlIGlzIDxjb2RlPlRZUEVfSURFTlRJVFk8L2NvZGU+Ci0gICAgICogaWYgdGhlIEFmZmluZVRyYW5zZm9ybWF0aW9uIGlzIHRoZSBpZGVudGl0eSAKLSAgICAgKiB0cmFuc2Zvcm1hdGlvbiwgb3RoZXJ3aXNlIGl0J3MgPGNvZGU+VFlQRV9UUkFOU0xBVElPTjwvY29kZT4uCisgICAgICogQ3JlYXRlcyBhIG5ldyBBZmZpbmVUcmFuc2Zvcm1hdGlvbiB0aGF0IGlzIGEgdHJhbnNsYXRpb24gYWxvbmUgd2l0aCB0aGUKKyAgICAgKiB0cmFuc2xhdGlvbiB2ZWN0b3IgZ2l2ZW4gYnkgdGhlIHZhbHVlcyBzZW50IGFzIHBhcmFtZXRlcnMuIFRoZSBuZXcKKyAgICAgKiB0cmFuc2Zvcm1hdGlvbidzIHR5cGUgaXMgPGNvZGU+VFlQRV9JREVOVElUWTwvY29kZT4gaWYgdGhlCisgICAgICogQWZmaW5lVHJhbnNmb3JtYXRpb24gaXMgdGhlIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uLCBvdGhlcndpc2UgaXQncworICAgICAqIDxjb2RlPlRZUEVfVFJBTlNMQVRJT048L2NvZGU+LgogICAgICAqIAotICAgICAqIEBwYXJhbSBteCB0aGUgZGlzdGFuY2UgdG8gdHJhbnNsYXRlIGluIHRoZSB4IGRpcmVjdGlvbi4KLSAgICAgKiBAcGFyYW0gbXkgdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBpbiB0aGUgeSBkaXJlY3Rpb24uCi0KKyAgICAgKiBAcGFyYW0gbXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0YW5jZSB0byB0cmFuc2xhdGUgaW4gdGhlIHggZGlyZWN0aW9uLgorICAgICAqIEBwYXJhbSBteQorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBpbiB0aGUgeSBkaXJlY3Rpb24uCiAgICAgICogQHJldHVybiB0aGUgbmV3IEFmZmluZVRyYW5zZm9ybWF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQWZmaW5lVHJhbnNmb3JtIGdldFRyYW5zbGF0ZUluc3RhbmNlKGRvdWJsZSBteCwgZG91YmxlIG15KSB7CkBAIC01NjIsMTQgKzYyNCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgQWZmaW5lVHJhbnNmb3JtYXRpb24gdGhhdCBpcyBhIHNjYWxlIGFsb25lLgotICAgICAqIFRoZSBuZXcgdHJhbnNmb3JtYXRpb24ncyB0eXBlIGlzIDxjb2RlPlRZUEVfSURFTlRJVFk8L2NvZGU+Ci0gICAgICogaWYgdGhlIEFmZmluZVRyYW5zZm9ybWF0aW9uIGlzIHRoZSBpZGVudGl0eSAKLSAgICAgKiB0cmFuc2Zvcm1hdGlvbiwgb3RoZXJ3aXNlIGl0J3MgPGNvZGU+VFlQRV9VTktOT1dOPC9jb2RlPi4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IEFmZmluZVRyYW5zZm9ybWF0aW9uIHRoYXQgaXMgYSBzY2FsZSBhbG9uZS4gVGhlIG5ldworICAgICAqIHRyYW5zZm9ybWF0aW9uJ3MgdHlwZSBpcyA8Y29kZT5UWVBFX0lERU5USVRZPC9jb2RlPiBpZiB0aGUKKyAgICAgKiBBZmZpbmVUcmFuc2Zvcm1hdGlvbiBpcyB0aGUgaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24sIG90aGVyd2lzZSBpdCdzCisgICAgICogPGNvZGU+VFlQRV9VTktOT1dOPC9jb2RlPi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2N4IHRoZSBzY2FsaW5nIGZhY3RvciBpbiB0aGUgeCBkaXJlY3Rpb24uCi0gICAgICogQHBhcmFtIHNjWSB0aGUgc2NhbGluZyBmYWN0b3IgaW4gdGhlIHkgZGlyZWN0aW9uLgotICAgICAqIAorICAgICAqIEBwYXJhbSBzY3gKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2FsaW5nIGZhY3RvciBpbiB0aGUgeCBkaXJlY3Rpb24uCisgICAgICogQHBhcmFtIHNjWQorICAgICAqICAgICAgICAgICAgdGhlIHNjYWxpbmcgZmFjdG9yIGluIHRoZSB5IGRpcmVjdGlvbi4KICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgQWZmaW5lVHJhbnNmb3JtYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBBZmZpbmVUcmFuc2Zvcm0gZ2V0U2NhbGVJbnN0YW5jZShkb3VibGUgc2N4LCBkb3VibGUgc2NZKSB7CkBAIC01NzksMTQgKzY0MiwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgQWZmaW5lVHJhbnNmb3JtYXRpb24gdGhhdCBpcyBhIHNoZWFyIGFsb25lLgotICAgICAqIFRoZSBuZXcgdHJhbnNmb3JtYXRpb24ncyB0eXBlIGlzIDxjb2RlPlRZUEVfSURFTlRJVFk8L2NvZGU+Ci0gICAgICogaWYgdGhlIEFmZmluZVRyYW5zZm9ybWF0aW9uIGlzIHRoZSBpZGVudGl0eSAKLSAgICAgKiB0cmFuc2Zvcm1hdGlvbiwgb3RoZXJ3aXNlIGl0J3MgPGNvZGU+VFlQRV9VTktOT1dOPC9jb2RlPi4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IEFmZmluZVRyYW5zZm9ybWF0aW9uIHRoYXQgaXMgYSBzaGVhciBhbG9uZS4gVGhlIG5ldworICAgICAqIHRyYW5zZm9ybWF0aW9uJ3MgdHlwZSBpcyA8Y29kZT5UWVBFX0lERU5USVRZPC9jb2RlPiBpZiB0aGUKKyAgICAgKiBBZmZpbmVUcmFuc2Zvcm1hdGlvbiBpcyB0aGUgaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24sIG90aGVyd2lzZSBpdCdzCisgICAgICogPGNvZGU+VFlQRV9VTktOT1dOPC9jb2RlPi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2h4IHRoZSBzaGVhcmluZyBmYWN0b3IgaW4gdGhlIHggZGlyZWN0aW9uLgotICAgICAqIEBwYXJhbSBzaHkgdGhlIHNoZWFyaW5nIGZhY3RvciBpbiB0aGUgeSBkaXJlY3Rpb24uCi0gICAgICogCisgICAgICogQHBhcmFtIHNoeAorICAgICAqICAgICAgICAgICAgdGhlIHNoZWFyaW5nIGZhY3RvciBpbiB0aGUgeCBkaXJlY3Rpb24uCisgICAgICogQHBhcmFtIHNoeQorICAgICAqICAgICAgICAgICAgdGhlIHNoZWFyaW5nIGZhY3RvciBpbiB0aGUgeSBkaXJlY3Rpb24uCiAgICAgICogQHJldHVybiB0aGUgbmV3IEFmZmluZVRyYW5zZm9ybWF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQWZmaW5lVHJhbnNmb3JtIGdldFNoZWFySW5zdGFuY2UoZG91YmxlIHNoeCwgZG91YmxlIHNoeSkgewpAQCAtNTk2LDEzICs2NjAsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEFmZmluZVRyYW5zZm9ybWF0aW9uIHRoYXQgaXMgYSByb3RhdGlvbiBhbG9uZS4KLSAgICAgKiBUaGUgbmV3IHRyYW5zZm9ybWF0aW9uJ3MgdHlwZSBpcyA8Y29kZT5UWVBFX0lERU5USVRZPC9jb2RlPgotICAgICAqIGlmIHRoZSBBZmZpbmVUcmFuc2Zvcm1hdGlvbiBpcyB0aGUgaWRlbnRpdHkgCi0gICAgICogdHJhbnNmb3JtYXRpb24sIG90aGVyd2lzZSBpdCdzIDxjb2RlPlRZUEVfVU5LTk9XTjwvY29kZT4uCisgICAgICogQ3JlYXRlcyBhIG5ldyBBZmZpbmVUcmFuc2Zvcm1hdGlvbiB0aGF0IGlzIGEgcm90YXRpb24gYWxvbmUuIFRoZSBuZXcKKyAgICAgKiB0cmFuc2Zvcm1hdGlvbidzIHR5cGUgaXMgPGNvZGU+VFlQRV9JREVOVElUWTwvY29kZT4gaWYgdGhlCisgICAgICogQWZmaW5lVHJhbnNmb3JtYXRpb24gaXMgdGhlIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uLCBvdGhlcndpc2UgaXQncworICAgICAqIDxjb2RlPlRZUEVfVU5LTk9XTjwvY29kZT4uCiAgICAgICogCi0gICAgICogQHBhcmFtIGFuZ2xlIHRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zLgotICAgICAqIAorICAgICAqIEBwYXJhbSBhbmdsZQorICAgICAqICAgICAgICAgICAgdGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnMuCiAgICAgICogQHJldHVybiB0aGUgbmV3IEFmZmluZVRyYW5zZm9ybWF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQWZmaW5lVHJhbnNmb3JtIGdldFJvdGF0ZUluc3RhbmNlKGRvdWJsZSBhbmdsZSkgewpAQCAtNjEyLDE0ICs2NzYsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEFmZmluZVRyYW5zZm9ybWF0aW9uIHRoYXQgaXMgYSByb3RhdGlvbiBmb2xsb3dlZCBieSBhIAotICAgICAqIHRyYW5zbGF0aW9uLiAKLSAgICAgKiBTZXRzIHRoZSB0eXBlIHRvIDxjb2RlPlRZUEVfVU5LTk9XTjwvY29kZT4uCisgICAgICogQ3JlYXRlcyBhIG5ldyBBZmZpbmVUcmFuc2Zvcm1hdGlvbiB0aGF0IGlzIGEgcm90YXRpb24gZm9sbG93ZWQgYnkgYQorICAgICAqIHRyYW5zbGF0aW9uLiBTZXRzIHRoZSB0eXBlIHRvIDxjb2RlPlRZUEVfVU5LTk9XTjwvY29kZT4uCiAgICAgICogCi0gICAgICogQHBhcmFtIGFuZ2xlIHRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zLgotICAgICAqIEBwYXJhbSB4IHRoZSBkaXN0YW5jZSB0byB0cmFuc2xhdGUgaW4gdGhlIHggZGlyZWN0aW9uLgotICAgICAqIEBwYXJhbSB5IHRoZSBkaXN0YW5jZSB0byB0cmFuc2xhdGUgaW4gdGhlIHkgZGlyZWN0aW9uLgotICAgICAqIAorICAgICAqIEBwYXJhbSBhbmdsZQorICAgICAqICAgICAgICAgICAgdGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnMuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0YW5jZSB0byB0cmFuc2xhdGUgaW4gdGhlIHggZGlyZWN0aW9uLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgdG8gdHJhbnNsYXRlIGluIHRoZSB5IGRpcmVjdGlvbi4KICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgQWZmaW5lVHJhbnNmb3JtYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBBZmZpbmVUcmFuc2Zvcm0gZ2V0Um90YXRlSW5zdGFuY2UoZG91YmxlIGFuZ2xlLCBkb3VibGUgeCwgZG91YmxlIHkpIHsKQEAgLTYzMSw4ICs2OTYsMTAgQEAKICAgICAvKioKICAgICAgKiBBcHBsaWVzIGEgdHJhbnNsYXRpb24gdG8gdGhpcyBBZmZpbmVUcmFuc2Zvcm1hdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbXggdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBpbiB0aGUgeCBkaXJlY3Rpb24uCi0gICAgICogQHBhcmFtIG15IHRoZSBkaXN0YW5jZSB0byB0cmFuc2xhdGUgaW4gdGhlIHkgZGlyZWN0aW9uLgorICAgICAqIEBwYXJhbSBteAorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBpbiB0aGUgeCBkaXJlY3Rpb24uCisgICAgICogQHBhcmFtIG15CisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgdG8gdHJhbnNsYXRlIGluIHRoZSB5IGRpcmVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0cmFuc2xhdGUoZG91YmxlIG14LCBkb3VibGUgbXkpIHsKICAgICAgICAgY29uY2F0ZW5hdGUoQWZmaW5lVHJhbnNmb3JtLmdldFRyYW5zbGF0ZUluc3RhbmNlKG14LCBteSkpOwpAQCAtNjQxLDggKzcwOCwxMCBAQAogICAgIC8qKgogICAgICAqIEFwcGxpZXMgYSBzY2FsaW5nIHRyYW5zZm9ybWF0aW9uIHRvIHRoaXMgQWZmaW5lVHJhbnNmb3JtYXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHNjeCB0aGUgc2NhbGluZyBmYWN0b3IgaW4gdGhlIHggZGlyZWN0aW9uLgotICAgICAqIEBwYXJhbSBzY3kgdGhlIHNjYWxpbmcgZmFjdG9yIGluIHRoZSB5IGRpcmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gc2N4CisgICAgICogICAgICAgICAgICB0aGUgc2NhbGluZyBmYWN0b3IgaW4gdGhlIHggZGlyZWN0aW9uLgorICAgICAqIEBwYXJhbSBzY3kKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2FsaW5nIGZhY3RvciBpbiB0aGUgeSBkaXJlY3Rpb24uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2NhbGUoZG91YmxlIHNjeCwgZG91YmxlIHNjeSkgewogICAgICAgICBjb25jYXRlbmF0ZShBZmZpbmVUcmFuc2Zvcm0uZ2V0U2NhbGVJbnN0YW5jZShzY3gsIHNjeSkpOwpAQCAtNjUxLDggKzcyMCwxMCBAQAogICAgIC8qKgogICAgICAqIEFwcGxpZXMgYSBzaGVhcmluZyB0cmFuc2Zvcm1hdGlvbiB0byB0aGlzIEFmZmluZVRyYW5zZm9ybWF0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaHggdGhlIHNoZWFyaW5nIGZhY3RvciBpbiB0aGUgeCBkaXJlY3Rpb24uCi0gICAgICogQHBhcmFtIHNoeSB0aGUgc2hlYXJpbmcgZmFjdG9yIGluIHRoZSB5IGRpcmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gc2h4CisgICAgICogICAgICAgICAgICB0aGUgc2hlYXJpbmcgZmFjdG9yIGluIHRoZSB4IGRpcmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gc2h5CisgICAgICogICAgICAgICAgICB0aGUgc2hlYXJpbmcgZmFjdG9yIGluIHRoZSB5IGRpcmVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzaGVhcihkb3VibGUgc2h4LCBkb3VibGUgc2h5KSB7CiAgICAgICAgIGNvbmNhdGVuYXRlKEFmZmluZVRyYW5zZm9ybS5nZXRTaGVhckluc3RhbmNlKHNoeCwgc2h5KSk7CkBAIC02NjEsMTkgKzczMiwyMyBAQAogICAgIC8qKgogICAgICAqIEFwcGxpZXMgYSByb3RhdGlvbiB0cmFuc2Zvcm1hdGlvbiB0byB0aGlzIEFmZmluZVRyYW5zZm9ybWF0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhbmdsZSB0aGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFucy4KKyAgICAgKiBAcGFyYW0gYW5nbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJvdGF0ZShkb3VibGUgYW5nbGUpIHsKICAgICAgICAgY29uY2F0ZW5hdGUoQWZmaW5lVHJhbnNmb3JtLmdldFJvdGF0ZUluc3RhbmNlKGFuZ2xlKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXBwbGllcyBhIHJvdGF0aW9uIGFuZCB0cmFuc2xhdGlvbiB0cmFuc2Zvcm1hdGlvbiB0byB0aGlzIAorICAgICAqIEFwcGxpZXMgYSByb3RhdGlvbiBhbmQgdHJhbnNsYXRpb24gdHJhbnNmb3JtYXRpb24gdG8gdGhpcwogICAgICAqIEFmZmluZVRyYW5zZm9ybWF0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhbmdsZSB0aGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFucy4KLSAgICAgKiBAcGFyYW0gcHggdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBpbiB0aGUgeCBkaXJlY3Rpb24uCi0gICAgICogQHBhcmFtIHB5IHRoZSBkaXN0YW5jZSB0byB0cmFuc2xhdGUgaW4gdGhlIHkgZGlyZWN0aW9uLgorICAgICAqIEBwYXJhbSBhbmdsZQorICAgICAqICAgICAgICAgICAgdGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnMuCisgICAgICogQHBhcmFtIHB4CisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgdG8gdHJhbnNsYXRlIGluIHRoZSB4IGRpcmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gcHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0YW5jZSB0byB0cmFuc2xhdGUgaW4gdGhlIHkgZGlyZWN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJvdGF0ZShkb3VibGUgYW5nbGUsIGRvdWJsZSBweCwgZG91YmxlIHB5KSB7CiAgICAgICAgIGNvbmNhdGVuYXRlKEFmZmluZVRyYW5zZm9ybS5nZXRSb3RhdGVJbnN0YW5jZShhbmdsZSwgcHgsIHB5KSk7CkBAIC02ODIsMzYgKzc1Nyw0MCBAQAogICAgIC8qKgogICAgICAqIE11bHRpcGxpZXMgdGhlIG1hdHJpeCByZXByZXNlbnRhdGlvbnMgb2YgdHdvIEFmZmluZVRyYW5zZm9ybSBvYmplY3RzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0MSAtIHRoZSBBZmZpbmVUcmFuc2Zvcm0gb2JqZWN0IGlzIGEgbXVsdGlwbGljYW5kCi0gICAgICogQHBhcmFtIHQyIC0gdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgaXMgYSBtdWx0aXBsaWVyCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBBZmZpbmVUcmFuc2Zvcm0gb2JqZWN0IHRoYXQgaXMgdGhlIHJlc3VsdCBvZiB0MSBtdWx0aXBsaWVkIGJ5IHRoZSBtYXRyaXggdDIuCisgICAgICogQHBhcmFtIHQxCisgICAgICogICAgICAgICAgICAtIHRoZSBBZmZpbmVUcmFuc2Zvcm0gb2JqZWN0IGlzIGEgbXVsdGlwbGljYW5kCisgICAgICogQHBhcmFtIHQyCisgICAgICogICAgICAgICAgICAtIHRoZSBBZmZpbmVUcmFuc2Zvcm0gb2JqZWN0IGlzIGEgbXVsdGlwbGllcgorICAgICAqIEByZXR1cm4gYW4gQWZmaW5lVHJhbnNmb3JtIG9iamVjdCB0aGF0IGlzIHRoZSByZXN1bHQgb2YgdDEgbXVsdGlwbGllZCBieQorICAgICAqICAgICAgICAgdGhlIG1hdHJpeCB0Mi4KICAgICAgKi8KICAgICBBZmZpbmVUcmFuc2Zvcm0gbXVsdGlwbHkoQWZmaW5lVHJhbnNmb3JtIHQxLCBBZmZpbmVUcmFuc2Zvcm0gdDIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBZmZpbmVUcmFuc2Zvcm0oCi0gICAgICAgICAgICAgICAgdDEubTAwICogdDIubTAwICsgdDEubTEwICogdDIubTAxLCAgICAgICAgICAvLyBtMDAKLSAgICAgICAgICAgICAgICB0MS5tMDAgKiB0Mi5tMTAgKyB0MS5tMTAgKiB0Mi5tMTEsICAgICAgICAgIC8vIG0wMQotICAgICAgICAgICAgICAgIHQxLm0wMSAqIHQyLm0wMCArIHQxLm0xMSAqIHQyLm0wMSwgICAgICAgICAgLy8gbTEwCi0gICAgICAgICAgICAgICAgdDEubTAxICogdDIubTEwICsgdDEubTExICogdDIubTExLCAgICAgICAgICAvLyBtMTEKKyAgICAgICAgcmV0dXJuIG5ldyBBZmZpbmVUcmFuc2Zvcm0odDEubTAwICogdDIubTAwICsgdDEubTEwICogdDIubTAxLCAvLyBtMDAKKyAgICAgICAgICAgICAgICB0MS5tMDAgKiB0Mi5tMTAgKyB0MS5tMTAgKiB0Mi5tMTEsIC8vIG0wMQorICAgICAgICAgICAgICAgIHQxLm0wMSAqIHQyLm0wMCArIHQxLm0xMSAqIHQyLm0wMSwgLy8gbTEwCisgICAgICAgICAgICAgICAgdDEubTAxICogdDIubTEwICsgdDEubTExICogdDIubTExLCAvLyBtMTEKICAgICAgICAgICAgICAgICB0MS5tMDIgKiB0Mi5tMDAgKyB0MS5tMTIgKiB0Mi5tMDEgKyB0Mi5tMDIsIC8vIG0wMgogICAgICAgICAgICAgICAgIHQxLm0wMiAqIHQyLm0xMCArIHQxLm0xMiAqIHQyLm0xMSArIHQyLm0xMik7Ly8gbTEyCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXBwbGllcyB0aGUgZ2l2ZW4gQWZmaW5lVHJhbnNmb3JtIHRvIHRoaXMgQWZmaW5lVHJhbnNmb3JtCi0gICAgICogdmlhIG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KKyAgICAgKiBBcHBsaWVzIHRoZSBnaXZlbiBBZmZpbmVUcmFuc2Zvcm0gdG8gdGhpcyBBZmZpbmVUcmFuc2Zvcm0gdmlhIG1hdHJpeAorICAgICAqIG11bHRpcGxpY2F0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0IHRoZSBBZmZpbmVUcmFuc2Zvcm0gdG8gYXBwbHkgdG8gdGhpcyBBZmZpbmVUcmFuc2Zvcm0uCisgICAgICogQHBhcmFtIHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBBZmZpbmVUcmFuc2Zvcm0gdG8gYXBwbHkgdG8gdGhpcyBBZmZpbmVUcmFuc2Zvcm0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY29uY2F0ZW5hdGUoQWZmaW5lVHJhbnNmb3JtIHQpIHsKICAgICAgICAgc2V0VHJhbnNmb3JtKG11bHRpcGx5KHQsIHRoaXMpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGFuZ2VzIHRoZSBjdXJyZW50IEFmZmluZVRyYW5zZm9ybSB0aGUgb25lIG9idGFpbmVkIGJ5IAotICAgICAqIHRha2luZyB0aGUgdHJhbnNmb3JtIHQgYW5kIGFwcGx5aW5nIHRoaXMgQWZmaW5lVHJhbnNmb3JtIHRvIGl0LgorICAgICAqIENoYW5nZXMgdGhlIGN1cnJlbnQgQWZmaW5lVHJhbnNmb3JtIHRoZSBvbmUgb2J0YWluZWQgYnkgdGFraW5nIHRoZQorICAgICAqIHRyYW5zZm9ybSB0IGFuZCBhcHBseWluZyB0aGlzIEFmZmluZVRyYW5zZm9ybSB0byBpdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdCB0aGUgQWZmaW5lVHJhbnNmb3JtIHRoYXQgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gaXMgbXVsdGlwbGllZCBieS4KKyAgICAgKiBAcGFyYW0gdAorICAgICAqICAgICAgICAgICAgdGhlIEFmZmluZVRyYW5zZm9ybSB0aGF0IHRoaXMgQWZmaW5lVHJhbnNmb3JtIGlzIG11bHRpcGxpZWQKKyAgICAgKiAgICAgICAgICAgIGJ5LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHByZUNvbmNhdGVuYXRlKEFmZmluZVRyYW5zZm9ybSB0KSB7CiAgICAgICAgIHNldFRyYW5zZm9ybShtdWx0aXBseSh0aGlzLCB0KSk7CkBAIC03MjEsOSArODAwLDkgQEAKICAgICAgKiBDcmVhdGVzIGFuIEFmZmluZVRyYW5zZm9ybSB0aGF0IGlzIHRoZSBpbnZlcnNlIG9mIHRoaXMgdHJhbnNmb3JtLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGFmZmluZSB0cmFuc2Zvcm0gdGhhdCBpcyB0aGUgaW52ZXJzZSBvZiB0aGlzIEFmZmluZVRyYW5zZm9ybS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE5vbmludmVydGlibGVUcmFuc2Zvcm1FeGNlcHRpb24gaWYgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gY2Fubm90IGJlIAotICAgICAqIGludmVydGVkICh0aGUgZGV0ZXJtaW5hbnQgb2YgdGhlIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBwYXJ0IGlzIHplcm8pLgorICAgICAqIEB0aHJvd3MgTm9uaW52ZXJ0aWJsZVRyYW5zZm9ybUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgQWZmaW5lVHJhbnNmb3JtIGNhbm5vdCBiZSBpbnZlcnRlZCAodGhlIGRldGVybWluYW50CisgICAgICogICAgICAgICAgICAgb2YgdGhlIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBwYXJ0IGlzIHplcm8pLgogICAgICAqLwogICAgIHB1YmxpYyBBZmZpbmVUcmFuc2Zvcm0gY3JlYXRlSW52ZXJzZSgpIHRocm93cyBOb25pbnZlcnRpYmxlVHJhbnNmb3JtRXhjZXB0aW9uIHsKICAgICAgICAgZG91YmxlIGRldCA9IGdldERldGVybWluYW50KCk7CkBAIC03MzEsMjUgKzgxMCwyNiBAQAogICAgICAgICAgICAgLy8gYXd0LjIwND1EZXRlcm1pbmFudCBpcyB6ZXJvCiAgICAgICAgICAgICB0aHJvdyBuZXcgTm9uaW52ZXJ0aWJsZVRyYW5zZm9ybUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMDQiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEFmZmluZVRyYW5zZm9ybSgKLSAgICAgICAgICAgICAgICAgbTExIC8gZGV0LCAvLyBtMDAKKyAgICAgICAgcmV0dXJuIG5ldyBBZmZpbmVUcmFuc2Zvcm0obTExIC8gZGV0LCAvLyBtMDAKICAgICAgICAgICAgICAgICAtbTEwIC8gZGV0LCAvLyBtMTAKICAgICAgICAgICAgICAgICAtbTAxIC8gZGV0LCAvLyBtMDEKLSAgICAgICAgICAgICAgICAgbTAwIC8gZGV0LCAvLyBtMTEKKyAgICAgICAgICAgICAgICBtMDAgLyBkZXQsIC8vIG0xMQogICAgICAgICAgICAgICAgIChtMDEgKiBtMTIgLSBtMTEgKiBtMDIpIC8gZGV0LCAvLyBtMDIKLSAgICAgICAgICAgICAgICAobTEwICogbTAyIC0gbTAwICogbTEyKSAvIGRldCAgLy8gbTEyCisgICAgICAgICAgICAgICAgKG0xMCAqIG0wMiAtIG0wMCAqIG0xMikgLyBkZXQgLy8gbTEyCiAgICAgICAgICk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQXBwbHkgdGhlIGN1cnJlbnQgQWZmaW5lVHJhbnNmb3JtIHRvIHRoZSBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBvcmlnaW5hbCBwb2ludC4KLSAgICAgKiBAcGFyYW0gZHN0IFBvaW50MkQgb2JqZWN0IHRvIGJlIGZpbGxlZCB3aXRoIHRoZSBkZXN0aW5hdGlvbgotICAgICAqIGNvb3JkaW5hdGVzICh3aGVyZSB0aGUgb3JpZ2luYWwgcG9pbnQgaXMgc2VudCBieSB0aGlzIEFmZmluZVRyYW5zZm9ybSkuIE1heSBiZSBudWxsLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBvaW50IGluIHRoZSBBZmZpbmVUcmFuc2Zvcm0ncyBpbWFnZSBzcGFjZSB3aGVyZSB0aGUKLSAgICAgKiBvcmlnaW5hbCBwb2ludCBpcyBzZW50LgorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBwb2ludC4KKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICBQb2ludDJEIG9iamVjdCB0byBiZSBmaWxsZWQgd2l0aCB0aGUgZGVzdGluYXRpb24gY29vcmRpbmF0ZXMKKyAgICAgKiAgICAgICAgICAgICh3aGVyZSB0aGUgb3JpZ2luYWwgcG9pbnQgaXMgc2VudCBieSB0aGlzIEFmZmluZVRyYW5zZm9ybSkuCisgICAgICogICAgICAgICAgICBNYXkgYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBwb2ludCBpbiB0aGUgQWZmaW5lVHJhbnNmb3JtJ3MgaW1hZ2Ugc3BhY2Ugd2hlcmUgdGhlIG9yaWdpbmFsCisgICAgICogICAgICAgICBwb2ludCBpcyBzZW50LgogICAgICAqLwogICAgIHB1YmxpYyBQb2ludDJEIHRyYW5zZm9ybShQb2ludDJEIHNyYywgUG9pbnQyRCBkc3QpIHsKICAgICAgICAgaWYgKGRzdCA9PSBudWxsKSB7CkBAIC03NzAsMjUgKzg1MCwyOSBAQAogICAgIC8qKgogICAgICAqIEFwcGxpZXMgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gdG8gYW4gYXJyYXkgb2YgcG9pbnRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIGFycmF5IG9mIHBvaW50cyB0byBiZSB0cmFuc2Zvcm1lZC4KLSAgICAgKiBAcGFyYW0gc3JjT2ZmIHRoZSBvZmZzZXQgaW4gdGhlIHNvdXJjZSBwb2ludCBhcnJheSBvZiB0aGUgZmlyc3QgcG9pbnQKLSAgICAgKiB0byBiZSB0cmFuc2Zvcm1lZC4KLSAgICAgKiBAcGFyYW0gZHN0IHRoZSBwb2ludCBhcnJheSB3aGVyZSB0aGUgaW1hZ2VzIG9mIHRoZSBwb2ludHMgKGFmdGVyIAotICAgICAqIGFwcGx5aW5nIHRoZSBBZmZpbmVUcmFuc2Zvcm1hdGlvbikgc2hvdWxkIGJlIHBsYWNlZC4KLSAgICAgKiBAcGFyYW0gZHN0T2ZmIHRoZSBvZmZzZXQgaW4gdGhlIGRlc3RpbmF0aW9uIGFycmF5IHdoZXJlIHRoZSBuZXcgCi0gICAgICogdmFsdWVzIHNob3VsZCBiZSB3cml0dGVuLgotICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBwb2ludHMgdG8gdHJhbnNmb3JtLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIAotICAgICAqIDxjb2RlPnNyY09mZiArIGxlbmd0aCA+IHNyYy5sZW5ndGg8L2NvZGU+IG9yCi0gICAgICogPGNvZGU+ZHN0T2ZmICsgbGVuZ3RoID4gZHN0Lmxlbmd0aDwvY29kZT4uCisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHBvaW50cyB0byBiZSB0cmFuc2Zvcm1lZC4KKyAgICAgKiBAcGFyYW0gc3JjT2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBzb3VyY2UgcG9pbnQgYXJyYXkgb2YgdGhlIGZpcnN0IHBvaW50IHRvIGJlCisgICAgICogICAgICAgICAgICB0cmFuc2Zvcm1lZC4KKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICB0aGUgcG9pbnQgYXJyYXkgd2hlcmUgdGhlIGltYWdlcyBvZiB0aGUgcG9pbnRzIChhZnRlciBhcHBseWluZworICAgICAqICAgICAgICAgICAgdGhlIEFmZmluZVRyYW5zZm9ybWF0aW9uKSBzaG91bGQgYmUgcGxhY2VkLgorICAgICAqIEBwYXJhbSBkc3RPZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIGRlc3RpbmF0aW9uIGFycmF5IHdoZXJlIHRoZSBuZXcgdmFsdWVzCisgICAgICogICAgICAgICAgICBzaG91bGQgYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHBvaW50cyB0byB0cmFuc2Zvcm0uCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5zcmNPZmYgKyBsZW5ndGggPiBzcmMubGVuZ3RoPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgIDxjb2RlPmRzdE9mZiArIGxlbmd0aCA+IGRzdC5sZW5ndGg8L2NvZGU+LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShQb2ludDJEW10gc3JjLCBpbnQgc3JjT2ZmLCBQb2ludDJEW10gZHN0LCBpbnQgZHN0T2ZmLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIHdoaWxlICgtLWxlbmd0aCA+PSAwKSB7Ci0gICAgICAgICAgICBQb2ludDJEIHNyY1BvaW50ID0gc3JjW3NyY09mZisrXTsgCisgICAgICAgICAgICBQb2ludDJEIHNyY1BvaW50ID0gc3JjW3NyY09mZisrXTsKICAgICAgICAgICAgIGRvdWJsZSB4ID0gc3JjUG9pbnQuZ2V0WCgpOwogICAgICAgICAgICAgZG91YmxlIHkgPSBzcmNQb2ludC5nZXRZKCk7Ci0gICAgICAgICAgICBQb2ludDJEIGRzdFBvaW50ID0gZHN0W2RzdE9mZl07IAorICAgICAgICAgICAgUG9pbnQyRCBkc3RQb2ludCA9IGRzdFtkc3RPZmZdOwogICAgICAgICAgICAgaWYgKGRzdFBvaW50ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZiAoc3JjUG9pbnQgaW5zdGFuY2VvZiBQb2ludDJELkRvdWJsZSkgewogICAgICAgICAgICAgICAgICAgICBkc3RQb2ludCA9IG5ldyBQb2ludDJELkRvdWJsZSgpOwpAQCAtODAwLDI3ICs4ODQsMzEgQEAKICAgICAgICAgICAgIGRzdFtkc3RPZmYrK10gPSBkc3RQb2ludDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIEFwcGxpZXMgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gdG8gYSBzZXQgb2YgcG9pbnRzIGdpdmVuIAotICAgICAqIGFzIGFuIGFycmF5IG9mIGRvdWJsZSB2YWx1ZXMgd2hlcmUgZXZlcnkgdHdvIHZhbHVlcyBpbiB0aGUgYXJyYXkgCi0gICAgICogZ2l2ZSB0aGUgY29vcmRpbmF0ZXMgb2YgYSBwb2ludDsgdGhlIGV2ZW4taW5kZXhlZCB2YWx1ZXMgZ2l2aW5nIHRoZQotICAgICAqIHggY29vcmRpbmF0ZXMgYW5kIHRoZSBvZGQtaW5kZXhlZCB2YWx1ZXMgZ2l2aW5nIHRoZSB5IGNvb3JkaW5hdGVzLgorICAgICAqIEFwcGxpZXMgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gdG8gYSBzZXQgb2YgcG9pbnRzIGdpdmVuIGFzIGFuIGFycmF5IG9mCisgICAgICogZG91YmxlIHZhbHVlcyB3aGVyZSBldmVyeSB0d28gdmFsdWVzIGluIHRoZSBhcnJheSBnaXZlIHRoZSBjb29yZGluYXRlcyBvZgorICAgICAqIGEgcG9pbnQ7IHRoZSBldmVuLWluZGV4ZWQgdmFsdWVzIGdpdmluZyB0aGUgeCBjb29yZGluYXRlcyBhbmQgdGhlCisgICAgICogb2RkLWluZGV4ZWQgdmFsdWVzIGdpdmluZyB0aGUgeSBjb29yZGluYXRlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBhcnJheSBvZiBwb2ludHMgdG8gYmUgdHJhbnNmb3JtZWQuCi0gICAgICogQHBhcmFtIHNyY09mZiB0aGUgb2Zmc2V0IGluIHRoZSBzb3VyY2UgcG9pbnQgYXJyYXkgb2YgdGhlIGZpcnN0IHBvaW50Ci0gICAgICogdG8gYmUgdHJhbnNmb3JtZWQuCi0gICAgICogQHBhcmFtIGRzdCB0aGUgcG9pbnQgYXJyYXkgd2hlcmUgdGhlIGltYWdlcyBvZiB0aGUgcG9pbnRzIChhZnRlciAKLSAgICAgKiBhcHBseWluZyB0aGUgQWZmaW5lVHJhbnNmb3JtYXRpb24pIHNob3VsZCBiZSBwbGFjZWQuCi0gICAgICogQHBhcmFtIGRzdE9mZiB0aGUgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGVyZSB0aGUgbmV3IAotICAgICAqIHZhbHVlcyBzaG91bGQgYmUgd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRvIHRyYW5zZm9ybS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiAKLSAgICAgKiA8Y29kZT5zcmNPZmYgKyBsZW5ndGgqMiA+IHNyYy5sZW5ndGg8L2NvZGU+IG9yCi0gICAgICogPGNvZGU+ZHN0T2ZmICsgbGVuZ3RoKjIgPiBkc3QubGVuZ3RoPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcG9pbnRzIHRvIGJlIHRyYW5zZm9ybWVkLgorICAgICAqIEBwYXJhbSBzcmNPZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIHNvdXJjZSBwb2ludCBhcnJheSBvZiB0aGUgZmlyc3QgcG9pbnQgdG8gYmUKKyAgICAgKiAgICAgICAgICAgIHRyYW5zZm9ybWVkLgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2ludCBhcnJheSB3aGVyZSB0aGUgaW1hZ2VzIG9mIHRoZSBwb2ludHMgKGFmdGVyIGFwcGx5aW5nCisgICAgICogICAgICAgICAgICB0aGUgQWZmaW5lVHJhbnNmb3JtYXRpb24pIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICogQHBhcmFtIGRzdE9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2hlcmUgdGhlIG5ldyB2YWx1ZXMKKyAgICAgKiAgICAgICAgICAgIHNob3VsZCBiZSB3cml0dGVuLgorICAgICAqIEBwYXJhbSBsZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRvIHRyYW5zZm9ybS4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPnNyY09mZiArIGxlbmd0aCoyID4gc3JjLmxlbmd0aDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICA8Y29kZT5kc3RPZmYgKyBsZW5ndGgqMiA+IGRzdC5sZW5ndGg8L2NvZGU+LgogICAgICAqLwotICAgICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oZG91YmxlW10gc3JjLCBpbnQgc3JjT2ZmLCBkb3VibGVbXSBkc3QsIGludCBkc3RPZmYsIGludCBsZW5ndGgpIHsKKyAgICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oZG91YmxlW10gc3JjLCBpbnQgc3JjT2ZmLCBkb3VibGVbXSBkc3QsIGludCBkc3RPZmYsIGludCBsZW5ndGgpIHsKICAgICAgICAgaW50IHN0ZXAgPSAyOwogICAgICAgICBpZiAoc3JjID09IGRzdCAmJiBzcmNPZmYgPCBkc3RPZmYgJiYgZHN0T2ZmIDwgc3JjT2ZmICsgbGVuZ3RoICogMikgewogICAgICAgICAgICAgc3JjT2ZmID0gc3JjT2ZmICsgbGVuZ3RoICogMiAtIDI7CkBAIC04MzgsMjMgKzkyNiwyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFwcGxpZXMgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gdG8gYSBzZXQgb2YgcG9pbnRzIGdpdmVuIAotICAgICAqIGFzIGFuIGFycmF5IG9mIGZsb2F0IHZhbHVlcyB3aGVyZSBldmVyeSB0d28gdmFsdWVzIGluIHRoZSBhcnJheSAKLSAgICAgKiBnaXZlIHRoZSBjb29yZGluYXRlcyBvZiBhIHBvaW50OyB0aGUgZXZlbi1pbmRleGVkIHZhbHVlcyBnaXZpbmcgdGhlCi0gICAgICogeCBjb29yZGluYXRlcyBhbmQgdGhlIG9kZC1pbmRleGVkIHZhbHVlcyBnaXZpbmcgdGhlIHkgY29vcmRpbmF0ZXMuCisgICAgICogQXBwbGllcyB0aGlzIEFmZmluZVRyYW5zZm9ybSB0byBhIHNldCBvZiBwb2ludHMgZ2l2ZW4gYXMgYW4gYXJyYXkgb2YKKyAgICAgKiBmbG9hdCB2YWx1ZXMgd2hlcmUgZXZlcnkgdHdvIHZhbHVlcyBpbiB0aGUgYXJyYXkgZ2l2ZSB0aGUgY29vcmRpbmF0ZXMgb2YKKyAgICAgKiBhIHBvaW50OyB0aGUgZXZlbi1pbmRleGVkIHZhbHVlcyBnaXZpbmcgdGhlIHggY29vcmRpbmF0ZXMgYW5kIHRoZQorICAgICAqIG9kZC1pbmRleGVkIHZhbHVlcyBnaXZpbmcgdGhlIHkgY29vcmRpbmF0ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgYXJyYXkgb2YgcG9pbnRzIHRvIGJlIHRyYW5zZm9ybWVkLgotICAgICAqIEBwYXJhbSBzcmNPZmYgdGhlIG9mZnNldCBpbiB0aGUgc291cmNlIHBvaW50IGFycmF5IG9mIHRoZSBmaXJzdCBwb2ludAotICAgICAqIHRvIGJlIHRyYW5zZm9ybWVkLgotICAgICAqIEBwYXJhbSBkc3QgdGhlIHBvaW50IGFycmF5IHdoZXJlIHRoZSBpbWFnZXMgb2YgdGhlIHBvaW50cyAoYWZ0ZXIgCi0gICAgICogYXBwbHlpbmcgdGhlIEFmZmluZVRyYW5zZm9ybWF0aW9uKSBzaG91bGQgYmUgcGxhY2VkLgotICAgICAqIEBwYXJhbSBkc3RPZmYgdGhlIG9mZnNldCBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2hlcmUgdGhlIG5ldyAKLSAgICAgKiB2YWx1ZXMgc2hvdWxkIGJlIHdyaXR0ZW4uCi0gICAgICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIHBvaW50cyB0byB0cmFuc2Zvcm0uCi0gICAgICogCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgCi0gICAgICogPGNvZGU+c3JjT2ZmICsgbGVuZ3RoKjIgPiBzcmMubGVuZ3RoPC9jb2RlPiBvcgotICAgICAqIDxjb2RlPmRzdE9mZiArIGxlbmd0aCoyID4gZHN0Lmxlbmd0aDwvY29kZT4uCisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHBvaW50cyB0byBiZSB0cmFuc2Zvcm1lZC4KKyAgICAgKiBAcGFyYW0gc3JjT2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBzb3VyY2UgcG9pbnQgYXJyYXkgb2YgdGhlIGZpcnN0IHBvaW50IHRvIGJlCisgICAgICogICAgICAgICAgICB0cmFuc2Zvcm1lZC4KKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICB0aGUgcG9pbnQgYXJyYXkgd2hlcmUgdGhlIGltYWdlcyBvZiB0aGUgcG9pbnRzIChhZnRlciBhcHBseWluZworICAgICAqICAgICAgICAgICAgdGhlIEFmZmluZVRyYW5zZm9ybWF0aW9uKSBzaG91bGQgYmUgcGxhY2VkLgorICAgICAqIEBwYXJhbSBkc3RPZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIGRlc3RpbmF0aW9uIGFycmF5IHdoZXJlIHRoZSBuZXcgdmFsdWVzCisgICAgICogICAgICAgICAgICBzaG91bGQgYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHBvaW50cyB0byB0cmFuc2Zvcm0uCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5zcmNPZmYgKyBsZW5ndGgqMiA+IHNyYy5sZW5ndGg8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgPGNvZGU+ZHN0T2ZmICsgbGVuZ3RoKjIgPiBkc3QubGVuZ3RoPC9jb2RlPi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oZmxvYXRbXSBzcmMsIGludCBzcmNPZmYsIGZsb2F0W10gZHN0LCBpbnQgZHN0T2ZmLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIGludCBzdGVwID0gMjsKQEAgLTg3MiwyNiArOTY0LDMwIEBACiAgICAgICAgICAgICBkc3RPZmYgKz0gc3RlcDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIEFwcGxpZXMgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gdG8gYSBzZXQgb2YgcG9pbnRzIGdpdmVuIAotICAgICAqIGFzIGFuIGFycmF5IG9mIGZsb2F0IHZhbHVlcyB3aGVyZSBldmVyeSB0d28gdmFsdWVzIGluIHRoZSBhcnJheSAKLSAgICAgKiBnaXZlIHRoZSBjb29yZGluYXRlcyBvZiBhIHBvaW50OyB0aGUgZXZlbi1pbmRleGVkIHZhbHVlcyBnaXZpbmcgdGhlCi0gICAgICogeCBjb29yZGluYXRlcyBhbmQgdGhlIG9kZC1pbmRleGVkIHZhbHVlcyBnaXZpbmcgdGhlIHkgY29vcmRpbmF0ZXMuCi0gICAgICogVGhlIGRlc3RpbmF0aW9uIGNvb3JkaW5hdGVzIGFyZSBnaXZlbiBhcyB2YWx1ZXMgb2YgdHlwZSA8Y29kZT5kb3VibGU8L2NvZGU+LgorICAgICAqIEFwcGxpZXMgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gdG8gYSBzZXQgb2YgcG9pbnRzIGdpdmVuIGFzIGFuIGFycmF5IG9mCisgICAgICogZmxvYXQgdmFsdWVzIHdoZXJlIGV2ZXJ5IHR3byB2YWx1ZXMgaW4gdGhlIGFycmF5IGdpdmUgdGhlIGNvb3JkaW5hdGVzIG9mCisgICAgICogYSBwb2ludDsgdGhlIGV2ZW4taW5kZXhlZCB2YWx1ZXMgZ2l2aW5nIHRoZSB4IGNvb3JkaW5hdGVzIGFuZCB0aGUKKyAgICAgKiBvZGQtaW5kZXhlZCB2YWx1ZXMgZ2l2aW5nIHRoZSB5IGNvb3JkaW5hdGVzLiBUaGUgZGVzdGluYXRpb24gY29vcmRpbmF0ZXMKKyAgICAgKiBhcmUgZ2l2ZW4gYXMgdmFsdWVzIG9mIHR5cGUgPGNvZGU+ZG91YmxlPC9jb2RlPi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBhcnJheSBvZiBwb2ludHMgdG8gYmUgdHJhbnNmb3JtZWQuCi0gICAgICogQHBhcmFtIHNyY09mZiB0aGUgb2Zmc2V0IGluIHRoZSBzb3VyY2UgcG9pbnQgYXJyYXkgb2YgdGhlIGZpcnN0IHBvaW50Ci0gICAgICogdG8gYmUgdHJhbnNmb3JtZWQuCi0gICAgICogQHBhcmFtIGRzdCB0aGUgcG9pbnQgYXJyYXkgd2hlcmUgdGhlIGltYWdlcyBvZiB0aGUgcG9pbnRzIChhZnRlciAKLSAgICAgKiBhcHBseWluZyB0aGUgQWZmaW5lVHJhbnNmb3JtYXRpb24pIHNob3VsZCBiZSBwbGFjZWQuCi0gICAgICogQHBhcmFtIGRzdE9mZiB0aGUgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGVyZSB0aGUgbmV3IAotICAgICAqIHZhbHVlcyBzaG91bGQgYmUgd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRvIHRyYW5zZm9ybS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiAKLSAgICAgKiA8Y29kZT5zcmNPZmYgKyBsZW5ndGgqMiA+IHNyYy5sZW5ndGg8L2NvZGU+IG9yCi0gICAgICogPGNvZGU+ZHN0T2ZmICsgbGVuZ3RoKjIgPiBkc3QubGVuZ3RoPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcG9pbnRzIHRvIGJlIHRyYW5zZm9ybWVkLgorICAgICAqIEBwYXJhbSBzcmNPZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIHNvdXJjZSBwb2ludCBhcnJheSBvZiB0aGUgZmlyc3QgcG9pbnQgdG8gYmUKKyAgICAgKiAgICAgICAgICAgIHRyYW5zZm9ybWVkLgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2ludCBhcnJheSB3aGVyZSB0aGUgaW1hZ2VzIG9mIHRoZSBwb2ludHMgKGFmdGVyIGFwcGx5aW5nCisgICAgICogICAgICAgICAgICB0aGUgQWZmaW5lVHJhbnNmb3JtYXRpb24pIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICogQHBhcmFtIGRzdE9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2hlcmUgdGhlIG5ldyB2YWx1ZXMKKyAgICAgKiAgICAgICAgICAgIHNob3VsZCBiZSB3cml0dGVuLgorICAgICAqIEBwYXJhbSBsZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRvIHRyYW5zZm9ybS4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPnNyY09mZiArIGxlbmd0aCoyID4gc3JjLmxlbmd0aDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICA8Y29kZT5kc3RPZmYgKyBsZW5ndGgqMiA+IGRzdC5sZW5ndGg8L2NvZGU+LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShmbG9hdFtdIHNyYywgaW50IHNyY09mZiwgZG91YmxlW10gZHN0LCBpbnQgZHN0T2ZmLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIHdoaWxlICgtLWxlbmd0aCA+PSAwKSB7CkBAIC05MDMsMjQgKzk5OSwyOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFwcGxpZXMgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gdG8gYSBzZXQgb2YgcG9pbnRzIGdpdmVuIAotICAgICAqIGFzIGFuIGFycmF5IG9mIGRvdWJsZSB2YWx1ZXMgd2hlcmUgZXZlcnkgdHdvIHZhbHVlcyBpbiB0aGUgYXJyYXkgCi0gICAgICogZ2l2ZSB0aGUgY29vcmRpbmF0ZXMgb2YgYSBwb2ludDsgdGhlIGV2ZW4taW5kZXhlZCB2YWx1ZXMgZ2l2aW5nIHRoZQotICAgICAqIHggY29vcmRpbmF0ZXMgYW5kIHRoZSBvZGQtaW5kZXhlZCB2YWx1ZXMgZ2l2aW5nIHRoZSB5IGNvb3JkaW5hdGVzLgotICAgICAqIFRoZSBkZXN0aW5hdGlvbiBjb29yZGluYXRlcyBhcmUgZ2l2ZW4gYXMgdmFsdWVzIG9mIHR5cGUgPGNvZGU+ZmxvYXQ8L2NvZGU+LgorICAgICAqIEFwcGxpZXMgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gdG8gYSBzZXQgb2YgcG9pbnRzIGdpdmVuIGFzIGFuIGFycmF5IG9mCisgICAgICogZG91YmxlIHZhbHVlcyB3aGVyZSBldmVyeSB0d28gdmFsdWVzIGluIHRoZSBhcnJheSBnaXZlIHRoZSBjb29yZGluYXRlcyBvZgorICAgICAqIGEgcG9pbnQ7IHRoZSBldmVuLWluZGV4ZWQgdmFsdWVzIGdpdmluZyB0aGUgeCBjb29yZGluYXRlcyBhbmQgdGhlCisgICAgICogb2RkLWluZGV4ZWQgdmFsdWVzIGdpdmluZyB0aGUgeSBjb29yZGluYXRlcy4gVGhlIGRlc3RpbmF0aW9uIGNvb3JkaW5hdGVzCisgICAgICogYXJlIGdpdmVuIGFzIHZhbHVlcyBvZiB0eXBlIDxjb2RlPmZsb2F0PC9jb2RlPi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBhcnJheSBvZiBwb2ludHMgdG8gYmUgdHJhbnNmb3JtZWQuCi0gICAgICogQHBhcmFtIHNyY09mZiB0aGUgb2Zmc2V0IGluIHRoZSBzb3VyY2UgcG9pbnQgYXJyYXkgb2YgdGhlIGZpcnN0IHBvaW50Ci0gICAgICogdG8gYmUgdHJhbnNmb3JtZWQuCi0gICAgICogQHBhcmFtIGRzdCB0aGUgcG9pbnQgYXJyYXkgd2hlcmUgdGhlIGltYWdlcyBvZiB0aGUgcG9pbnRzIChhZnRlciAKLSAgICAgKiBhcHBseWluZyB0aGUgQWZmaW5lVHJhbnNmb3JtYXRpb24pIHNob3VsZCBiZSBwbGFjZWQuCi0gICAgICogQHBhcmFtIGRzdE9mZiB0aGUgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGVyZSB0aGUgbmV3IAotICAgICAqIHZhbHVlcyBzaG91bGQgYmUgd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRvIHRyYW5zZm9ybS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiAKLSAgICAgKiA8Y29kZT5zcmNPZmYgKyBsZW5ndGgqMiA+IHNyYy5sZW5ndGg8L2NvZGU+IG9yCi0gICAgICogPGNvZGU+ZHN0T2ZmICsgbGVuZ3RoKjIgPiBkc3QubGVuZ3RoPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcG9pbnRzIHRvIGJlIHRyYW5zZm9ybWVkLgorICAgICAqIEBwYXJhbSBzcmNPZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIHNvdXJjZSBwb2ludCBhcnJheSBvZiB0aGUgZmlyc3QgcG9pbnQgdG8gYmUKKyAgICAgKiAgICAgICAgICAgIHRyYW5zZm9ybWVkLgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2ludCBhcnJheSB3aGVyZSB0aGUgaW1hZ2VzIG9mIHRoZSBwb2ludHMgKGFmdGVyIGFwcGx5aW5nCisgICAgICogICAgICAgICAgICB0aGUgQWZmaW5lVHJhbnNmb3JtYXRpb24pIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICogQHBhcmFtIGRzdE9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2hlcmUgdGhlIG5ldyB2YWx1ZXMKKyAgICAgKiAgICAgICAgICAgIHNob3VsZCBiZSB3cml0dGVuLgorICAgICAqIEBwYXJhbSBsZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRvIHRyYW5zZm9ybS4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPnNyY09mZiArIGxlbmd0aCoyID4gc3JjLmxlbmd0aDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICA8Y29kZT5kc3RPZmYgKyBsZW5ndGgqMiA+IGRzdC5sZW5ndGg8L2NvZGU+LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShkb3VibGVbXSBzcmMsIGludCBzcmNPZmYsIGZsb2F0W10gZHN0LCBpbnQgZHN0T2ZmLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIHdoaWxlICgtLWxlbmd0aCA+PSAwKSB7CkBAIC05MzIsMTUgKzEwMzIsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUcmFuc2Zvcm1zIHRoZSBwb2ludCBhY2NvcmRpbmcgdG8gdGhlIGxpbmVhciB0cmFuc2Zvcm1hdGlvbgotICAgICAqIHBhcnQgb2YgdGhpcyBBZmZpbmVUcmFuc2Zvcm1hdGlvbiAod2l0aG91dCBhcHBseWluZyB0aGUgdHJhbnNsYXRpb24pLgorICAgICAqIFRyYW5zZm9ybXMgdGhlIHBvaW50IGFjY29yZGluZyB0byB0aGUgbGluZWFyIHRyYW5zZm9ybWF0aW9uIHBhcnQgb2YgdGhpcworICAgICAqIEFmZmluZVRyYW5zZm9ybWF0aW9uICh3aXRob3V0IGFwcGx5aW5nIHRoZSB0cmFuc2xhdGlvbikuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgb3JpZ2luYWwgcG9pbnQuCi0gICAgICogQHBhcmFtIGRzdCB0aGUgcG9pbnQgb2JqZWN0IHdoZXJlIHRoZSByZXN1bHQgb2YgdGhlIGRlbHRhIHRyYW5zZm9ybQotICAgICAqIGlzIHdyaXR0ZW4uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBkZWx0YSB0cmFuc2Zvcm0gKGxpbmVhciBwYXJ0IAotICAgICAqIG9ubHkpIHRvIHRoZSBvcmlnaW5hbCBwb2ludC4KKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgcG9pbnQuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIHBvaW50IG9iamVjdCB3aGVyZSB0aGUgcmVzdWx0IG9mIHRoZSBkZWx0YSB0cmFuc2Zvcm0gaXMKKyAgICAgKiAgICAgICAgICAgIHdyaXR0ZW4uCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBkZWx0YSB0cmFuc2Zvcm0gKGxpbmVhciBwYXJ0IG9ubHkpIHRvCisgICAgICogICAgICAgICB0aGUgb3JpZ2luYWwgcG9pbnQuCiAgICAgICovCiAgICAgLy8gVE9ETzogaXMgdGhpcyByaWdodD8gaWYgZHN0IGlzIG51bGwsIHdlIGNoZWNrIHdoYXQgaXQncyBhbgogICAgIC8vIGluc3RhbmNlIG9mPyBTaG91bGRuJ3QgaXQgYmUgc3JjIGluc3RhbmNlb2YgUG9pbnQyRC5Eb3VibGU/CkBAIC05NjEsMjQgKzEwNjIsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBcHBsaWVzIHRoZSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gcGFydCBvZiB0aGlzIEFmZmluZVRyYW5zZm9ybSAKLSAgICAgKiAoaWdub3JpbmcgdGhlIHRyYW5zbGF0aW9uIHBhcnQpIHRvIGEgc2V0IG9mIHBvaW50cyBnaXZlbiAKLSAgICAgKiBhcyBhbiBhcnJheSBvZiBkb3VibGUgdmFsdWVzIHdoZXJlIGV2ZXJ5IHR3byB2YWx1ZXMgaW4gdGhlIGFycmF5IAotICAgICAqIGdpdmUgdGhlIGNvb3JkaW5hdGVzIG9mIGEgcG9pbnQ7IHRoZSBldmVuLWluZGV4ZWQgdmFsdWVzIGdpdmluZyB0aGUKLSAgICAgKiB4IGNvb3JkaW5hdGVzIGFuZCB0aGUgb2RkLWluZGV4ZWQgdmFsdWVzIGdpdmluZyB0aGUgeSBjb29yZGluYXRlcy4KKyAgICAgKiBBcHBsaWVzIHRoZSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gcGFydCBvZiB0aGlzIEFmZmluZVRyYW5zZm9ybSAoaWdub3JpbmcKKyAgICAgKiB0aGUgdHJhbnNsYXRpb24gcGFydCkgdG8gYSBzZXQgb2YgcG9pbnRzIGdpdmVuIGFzIGFuIGFycmF5IG9mIGRvdWJsZQorICAgICAqIHZhbHVlcyB3aGVyZSBldmVyeSB0d28gdmFsdWVzIGluIHRoZSBhcnJheSBnaXZlIHRoZSBjb29yZGluYXRlcyBvZiBhCisgICAgICogcG9pbnQ7IHRoZSBldmVuLWluZGV4ZWQgdmFsdWVzIGdpdmluZyB0aGUgeCBjb29yZGluYXRlcyBhbmQgdGhlCisgICAgICogb2RkLWluZGV4ZWQgdmFsdWVzIGdpdmluZyB0aGUgeSBjb29yZGluYXRlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBhcnJheSBvZiBwb2ludHMgdG8gYmUgdHJhbnNmb3JtZWQuCi0gICAgICogQHBhcmFtIHNyY09mZiB0aGUgb2Zmc2V0IGluIHRoZSBzb3VyY2UgcG9pbnQgYXJyYXkgb2YgdGhlIGZpcnN0IHBvaW50Ci0gICAgICogdG8gYmUgdHJhbnNmb3JtZWQuCi0gICAgICogQHBhcmFtIGRzdCB0aGUgcG9pbnQgYXJyYXkgd2hlcmUgdGhlIGltYWdlcyBvZiB0aGUgcG9pbnRzIChhZnRlciAKLSAgICAgKiBhcHBseWluZyB0aGUgZGVsdGEgdHJhbnNmb3JtYXRpb24pIHNob3VsZCBiZSBwbGFjZWQuCi0gICAgICogQHBhcmFtIGRzdE9mZiB0aGUgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGVyZSB0aGUgbmV3IAotICAgICAqIHZhbHVlcyBzaG91bGQgYmUgd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRvIHRyYW5zZm9ybS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiAKLSAgICAgKiA8Y29kZT5zcmNPZmYgKyBsZW5ndGgqMiA+IHNyYy5sZW5ndGg8L2NvZGU+IG9yCi0gICAgICogPGNvZGU+ZHN0T2ZmICsgbGVuZ3RoKjIgPiBkc3QubGVuZ3RoPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcG9pbnRzIHRvIGJlIHRyYW5zZm9ybWVkLgorICAgICAqIEBwYXJhbSBzcmNPZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIHNvdXJjZSBwb2ludCBhcnJheSBvZiB0aGUgZmlyc3QgcG9pbnQgdG8gYmUKKyAgICAgKiAgICAgICAgICAgIHRyYW5zZm9ybWVkLgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2ludCBhcnJheSB3aGVyZSB0aGUgaW1hZ2VzIG9mIHRoZSBwb2ludHMgKGFmdGVyIGFwcGx5aW5nCisgICAgICogICAgICAgICAgICB0aGUgZGVsdGEgdHJhbnNmb3JtYXRpb24pIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICogQHBhcmFtIGRzdE9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2hlcmUgdGhlIG5ldyB2YWx1ZXMKKyAgICAgKiAgICAgICAgICAgIHNob3VsZCBiZSB3cml0dGVuLgorICAgICAqIEBwYXJhbSBsZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRvIHRyYW5zZm9ybS4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPnNyY09mZiArIGxlbmd0aCoyID4gc3JjLmxlbmd0aDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICA8Y29kZT5kc3RPZmYgKyBsZW5ndGgqMiA+IGRzdC5sZW5ndGg8L2NvZGU+LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRlbHRhVHJhbnNmb3JtKGRvdWJsZVtdIHNyYywgaW50IHNyY09mZiwgZG91YmxlW10gZHN0LCBpbnQgZHN0T2ZmLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIHdoaWxlICgtLWxlbmd0aCA+PSAwKSB7CkBAIC05OTAsMTkgKzEwOTUsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUcmFuc2Zvcm1zIHRoZSBwb2ludCBhY2NvcmRpbmcgdG8gdGhlIGludmVyc2Ugb2YgdGhpcyBBZmZpbmVUcmFuc2Zvcm1hdGlvbi4KKyAgICAgKiBUcmFuc2Zvcm1zIHRoZSBwb2ludCBhY2NvcmRpbmcgdG8gdGhlIGludmVyc2Ugb2YgdGhpcworICAgICAqIEFmZmluZVRyYW5zZm9ybWF0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIG9yaWdpbmFsIHBvaW50LgotICAgICAqIEBwYXJhbSBkc3QgdGhlIHBvaW50IG9iamVjdCB3aGVyZSB0aGUgcmVzdWx0IG9mIHRoZSBpbnZlcnNlIHRyYW5zZm9ybQotICAgICAqIGlzIHdyaXR0ZW4gKG1heSBiZSBudWxsKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGludmVyc2UgdHJhbnNmb3JtLgotICAgICAqIEludmVyc2UgdHJhbnNmb3JtLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTm9uaW52ZXJ0aWJsZVRyYW5zZm9ybUV4Y2VwdGlvbiBpZiB0aGlzIEFmZmluZVRyYW5zZm9ybSBjYW5ub3QgYmUgCi0gICAgICogaW52ZXJ0ZWQgKHRoZSBkZXRlcm1pbmFudCBvZiB0aGUgbGluZWFyIHRyYW5zZm9ybWF0aW9uIHBhcnQgaXMgemVybykuCisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIHBvaW50LgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2ludCBvYmplY3Qgd2hlcmUgdGhlIHJlc3VsdCBvZiB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0gaXMKKyAgICAgKiAgICAgICAgICAgIHdyaXR0ZW4gKG1heSBiZSBudWxsKS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGludmVyc2UgdHJhbnNmb3JtLiBJbnZlcnNlIHRyYW5zZm9ybS4KKyAgICAgKiBAdGhyb3dzIE5vbmludmVydGlibGVUcmFuc2Zvcm1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIEFmZmluZVRyYW5zZm9ybSBjYW5ub3QgYmUgaW52ZXJ0ZWQgKHRoZSBkZXRlcm1pbmFudAorICAgICAqICAgICAgICAgICAgIG9mIHRoZSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gcGFydCBpcyB6ZXJvKS4KICAgICAgKi8KLSAgICBwdWJsaWMgUG9pbnQyRCBpbnZlcnNlVHJhbnNmb3JtKFBvaW50MkQgc3JjLCBQb2ludDJEIGRzdCkgdGhyb3dzIE5vbmludmVydGlibGVUcmFuc2Zvcm1FeGNlcHRpb24geworICAgIHB1YmxpYyBQb2ludDJEIGludmVyc2VUcmFuc2Zvcm0oUG9pbnQyRCBzcmMsIFBvaW50MkQgZHN0KQorICAgICAgICAgICAgdGhyb3dzIE5vbmludmVydGlibGVUcmFuc2Zvcm1FeGNlcHRpb24gewogICAgICAgICBkb3VibGUgZGV0ID0gZ2V0RGV0ZXJtaW5hbnQoKTsKICAgICAgICAgaWYgKE1hdGguYWJzKGRldCkgPCBaRVJPKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjA0PURldGVybWluYW50IGlzIHplcm8KQEAgLTEwMjUsMjkgKzExMzIsMzMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBcHBsaWVzIHRoZSBpbnZlcnNlIG9mIHRoaXMgQWZmaW5lVHJhbnNmb3JtIHRvIGEgc2V0IG9mIHBvaW50cyBnaXZlbiAKLSAgICAgKiBhcyBhbiBhcnJheSBvZiBkb3VibGUgdmFsdWVzIHdoZXJlIGV2ZXJ5IHR3byB2YWx1ZXMgaW4gdGhlIGFycmF5IAotICAgICAqIGdpdmUgdGhlIGNvb3JkaW5hdGVzIG9mIGEgcG9pbnQ7IHRoZSBldmVuLWluZGV4ZWQgdmFsdWVzIGdpdmluZyB0aGUKLSAgICAgKiB4IGNvb3JkaW5hdGVzIGFuZCB0aGUgb2RkLWluZGV4ZWQgdmFsdWVzIGdpdmluZyB0aGUgeSBjb29yZGluYXRlcy4KKyAgICAgKiBBcHBsaWVzIHRoZSBpbnZlcnNlIG9mIHRoaXMgQWZmaW5lVHJhbnNmb3JtIHRvIGEgc2V0IG9mIHBvaW50cyBnaXZlbiBhcworICAgICAqIGFuIGFycmF5IG9mIGRvdWJsZSB2YWx1ZXMgd2hlcmUgZXZlcnkgdHdvIHZhbHVlcyBpbiB0aGUgYXJyYXkgZ2l2ZSB0aGUKKyAgICAgKiBjb29yZGluYXRlcyBvZiBhIHBvaW50OyB0aGUgZXZlbi1pbmRleGVkIHZhbHVlcyBnaXZpbmcgdGhlIHggY29vcmRpbmF0ZXMKKyAgICAgKiBhbmQgdGhlIG9kZC1pbmRleGVkIHZhbHVlcyBnaXZpbmcgdGhlIHkgY29vcmRpbmF0ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgYXJyYXkgb2YgcG9pbnRzIHRvIGJlIHRyYW5zZm9ybWVkLgotICAgICAqIEBwYXJhbSBzcmNPZmYgdGhlIG9mZnNldCBpbiB0aGUgc291cmNlIHBvaW50IGFycmF5IG9mIHRoZSBmaXJzdCBwb2ludAotICAgICAqIHRvIGJlIHRyYW5zZm9ybWVkLgotICAgICAqIEBwYXJhbSBkc3QgdGhlIHBvaW50IGFycmF5IHdoZXJlIHRoZSBpbWFnZXMgb2YgdGhlIHBvaW50cyAoYWZ0ZXIgCi0gICAgICogYXBwbHlpbmcgdGhlIGludmVyc2Ugb2YgdGhlIEFmZmluZVRyYW5zZm9ybWF0aW9uKSBzaG91bGQgYmUgcGxhY2VkLgotICAgICAqIEBwYXJhbSBkc3RPZmYgdGhlIG9mZnNldCBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2hlcmUgdGhlIG5ldyAKLSAgICAgKiB2YWx1ZXMgc2hvdWxkIGJlIHdyaXR0ZW4uCi0gICAgICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIHBvaW50cyB0byB0cmFuc2Zvcm0uCi0gICAgICogCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgCi0gICAgICogPGNvZGU+c3JjT2ZmICsgbGVuZ3RoKjIgPiBzcmMubGVuZ3RoPC9jb2RlPiBvcgotICAgICAqIDxjb2RlPmRzdE9mZiArIGxlbmd0aCoyID4gZHN0Lmxlbmd0aDwvY29kZT4uCi0gICAgICogQHRocm93cyBOb25pbnZlcnRpYmxlVHJhbnNmb3JtRXhjZXB0aW9uIGlmIHRoaXMgQWZmaW5lVHJhbnNmb3JtIGNhbm5vdCBiZSAKLSAgICAgKiBpbnZlcnRlZCAodGhlIGRldGVybWluYW50IG9mIHRoZSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gcGFydCBpcyB6ZXJvKS4KKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcG9pbnRzIHRvIGJlIHRyYW5zZm9ybWVkLgorICAgICAqIEBwYXJhbSBzcmNPZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIHNvdXJjZSBwb2ludCBhcnJheSBvZiB0aGUgZmlyc3QgcG9pbnQgdG8gYmUKKyAgICAgKiAgICAgICAgICAgIHRyYW5zZm9ybWVkLgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2ludCBhcnJheSB3aGVyZSB0aGUgaW1hZ2VzIG9mIHRoZSBwb2ludHMgKGFmdGVyIGFwcGx5aW5nCisgICAgICogICAgICAgICAgICB0aGUgaW52ZXJzZSBvZiB0aGUgQWZmaW5lVHJhbnNmb3JtYXRpb24pIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICogQHBhcmFtIGRzdE9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2hlcmUgdGhlIG5ldyB2YWx1ZXMKKyAgICAgKiAgICAgICAgICAgIHNob3VsZCBiZSB3cml0dGVuLgorICAgICAqIEBwYXJhbSBsZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRvIHRyYW5zZm9ybS4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPnNyY09mZiArIGxlbmd0aCoyID4gc3JjLmxlbmd0aDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICA8Y29kZT5kc3RPZmYgKyBsZW5ndGgqMiA+IGRzdC5sZW5ndGg8L2NvZGU+LgorICAgICAqIEB0aHJvd3MgTm9uaW52ZXJ0aWJsZVRyYW5zZm9ybUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgQWZmaW5lVHJhbnNmb3JtIGNhbm5vdCBiZSBpbnZlcnRlZCAodGhlIGRldGVybWluYW50CisgICAgICogICAgICAgICAgICAgb2YgdGhlIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBwYXJ0IGlzIHplcm8pLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGludmVyc2VUcmFuc2Zvcm0oZG91YmxlW10gc3JjLCBpbnQgc3JjT2ZmLCBkb3VibGVbXSBkc3QsIGludCBkc3RPZmYsIGludCBsZW5ndGgpCi0gICAgICAgIHRocm93cyBOb25pbnZlcnRpYmxlVHJhbnNmb3JtRXhjZXB0aW9uCi0gICAgeworICAgICAgICAgICAgdGhyb3dzIE5vbmludmVydGlibGVUcmFuc2Zvcm1FeGNlcHRpb24gewogICAgICAgICBkb3VibGUgZGV0ID0gZ2V0RGV0ZXJtaW5hbnQoKTsKICAgICAgICAgaWYgKE1hdGguYWJzKGRldCkgPCBaRVJPKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjA0PURldGVybWluYW50IGlzIHplcm8KQEAgLTEwNjMsMTMgKzExNzQsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHNoYXBlIHdob3NlIGRhdGEgaXMgZ2l2ZW4gYnkgYXBwbHlpbmcgdGhpcyAKLSAgICAgKiBBZmZpbmVUcmFuc2Zvcm0gdG8gdGhlIHNwZWNpZmllZCBzaGFwZS4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHNoYXBlIHdob3NlIGRhdGEgaXMgZ2l2ZW4gYnkgYXBwbHlpbmcgdGhpcyBBZmZpbmVUcmFuc2Zvcm0KKyAgICAgKiB0byB0aGUgc3BlY2lmaWVkIHNoYXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIG9yaWdpbmFsIHNoYXBlIHdob3NlIGRhdGEgaXMgdG8gYmUgdHJhbnNmb3JtZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IHNoYXBlIGZvdW5kIGJ5IGFwcGx5aW5nIHRoaXMgQWZmaW5lVHJhbnNmb3JtIHRvIAotICAgICAqIHRoZSBvcmlnaW5hbCBzaGFwZS4KKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgc2hhcGUgd2hvc2UgZGF0YSBpcyB0byBiZSB0cmFuc2Zvcm1lZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgc2hhcGUgZm91bmQgYnkgYXBwbHlpbmcgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gdG8gdGhlCisgICAgICogICAgICAgICBvcmlnaW5hbCBzaGFwZS4KICAgICAgKi8KICAgICBwdWJsaWMgU2hhcGUgY3JlYXRlVHJhbnNmb3JtZWRTaGFwZShTaGFwZSBzcmMpIHsKICAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7CkBAIC0xMDg2LDkgKzExOTcsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBnZXRDbGFzcygpLmdldE5hbWUoKSArCi0gICAgICAgICAgICAiW1siICsgbTAwICsgIiwgIiArIG0wMSArICIsICIgKyBtMDIgKyAiXSwgWyIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAorICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiW1siICsgbTAwICsgIiwgIiArIG0wMSArICIsICIgKyBtMDIgKyAiXSwgWyIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAogICAgICAgICAgICAgICAgICsgbTEwICsgIiwgIiArIG0xMSArICIsICIgKyBtMTIgKyAiXV0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogICAgIH0KIApAQCAtMTEyMCwzOSArMTIyOSwzOSBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBBZmZpbmVUcmFuc2Zvcm0pIHsKICAgICAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0ID0gKEFmZmluZVRyYW5zZm9ybSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBtMDAgPT0gdC5tMDAgJiYgbTAxID09IHQubTAxICYmCi0gICAgICAgICAgICAgICAgbTAyID09IHQubTAyICYmIG0xMCA9PSB0Lm0xMCAmJgotICAgICAgICAgICAgICAgIG0xMSA9PSB0Lm0xMSAmJiBtMTIgPT0gdC5tMTI7CisgICAgICAgICAgICByZXR1cm4gbTAwID09IHQubTAwICYmIG0wMSA9PSB0Lm0wMSAmJiBtMDIgPT0gdC5tMDIgJiYgbTEwID09IHQubTEwICYmIG0xMSA9PSB0Lm0xMQorICAgICAgICAgICAgICAgICAgICAmJiBtMTIgPT0gdC5tMTI7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIAogICAgIC8qKgogICAgICAqIFdyaXRlcyB0aGUgQWZmaW5lVHJhc3Nmb3JtIG9iamVjdCB0byB0aGUgb3V0cHV0IHN0ZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0gLSB0aGUgb3V0cHV0IHN0cmVhbQotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gLSBpZiB0aGVyZSBhcmUgSS9PIGVycm9ycyB3aGlsZSB3cml0aW5nIHRvIHRoZSBvdXRwdXQgc3RyZW0KKyAgICAgKiBAcGFyYW0gc3RyZWFtCisgICAgICogICAgICAgICAgICAtIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAtIGlmIHRoZXJlIGFyZSBJL08gZXJyb3JzIHdoaWxlIHdyaXRpbmcgdG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc3RyZWFtLmRlZmF1bHRXcml0ZU9iamVjdCgpOwogICAgIH0KIAotICAgIAogICAgIC8qKgogICAgICAqIFJlYWQgdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0gLSB0aGUgaW5wdXQgc3RlYW0KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0gaWYgdGhlcmUgYXJlIEkvTyBlcnJvcnMgd2hpbGUgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzdHJlbQotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiAtIGlmIGNsYXNzIGNvdWxkIG5vdCBiZSBmb3VuZAorICAgICAqIEBwYXJhbSBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgIC0gdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgLSBpZiB0aGVyZSBhcmUgSS9PIGVycm9ycyB3aGlsZSByZWFkaW5nIGZyb20gdGhlIGlucHV0CisgICAgICogICAgICAgICAgICAgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIC0gaWYgY2xhc3MgY291bGQgbm90IGJlIGZvdW5kLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgICBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgc3RyZWFtLmRlZmF1bHRSZWFkT2JqZWN0KCk7CiAgICAgICAgIHR5cGUgPSBUWVBFX1VOS05PV047CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9nZW9tL0FyYzJELmphdmEgYi9hd3QvamF2YS9hd3QvZ2VvbS9BcmMyRC5qYXZhCmluZGV4IGJjMWU5NWMuLjU2ZjVjZDMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9nZW9tL0FyYzJELmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2dlb20vQXJjMkQuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBEZW5pcyBNLiBLaXNoZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZ2VvbTsKIAogaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwpAQCAtMjUsNTkgKzI2LDc3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIENsYXNzIEFyYzJEIHJlcHJlc2VudHMgYSBzZWdtZW50IG9mIGEgY3VydmUgaW5zY3JpYmVkIAotICogaW4gYSByZWN0YW5nbGUuIFRoZSBjdXJ2ZSBpcyBkZWZpbmVkIGJ5IGEgc3RhcnQgYW5nbGUgYW5kIGFuIAotICogZXh0ZW50IGFuZ2xlICh0aGUgZW5kIGFuZ2xlIG1pbnVzIHRoZSBzdGFydCBhbmdsZSkgYXMgCi0gKiBhIHBpZSB3ZWRnZSB3aG9zZSBwb2ludCBpcyBpbiB0aGUgY2VudGVyIG9mIHRoZSByZWN0YW5nbGUuCi0gKiBUaGUgQXJjMkQgYXMgYSBzaGFwZSBtYXkgYmUgZWl0aGVyIE9QRU4gKGluY2x1ZGluZyBub3RoaW5nIAotICogYnV0IHRoZSBjdXJ2ZWQgYXJjIHNlZ21lbnQgaXRzZWxmKSwgQ0hPUkQgKHRoZSBjdXJ2ZWQgYXJjCi0gKiBzZWdtZW50IGNsb3NlZCBieSBhIGNvbm5lY3Rpbmcgc2VnbWVudCBmcm9tIHRoZSBlbmQgdG8gdGhlIAotICogYmVnaW5uaW5nIG9mIHRoZSBhcmMsIG9yIFBJRSAodGhlIHNlZ21lbnRzIGZyb20gdGhlIGVuZCAKLSAqIG9mIHRoZSBhcmMgdG8gdGhlIGNlbnRlciBvZiB0aGUgcmVjdGFuZ2xlIGFuZCBmcm9tIHRoZQotICogY2VudGVyIG9mIHRoZSByZWN0YW5nbGUgYmFjayB0byB0aGUgYXJjJ3Mgc3RhcnQgcG9pbnQgYXJlIAotICogaW5jbHVkZWQpLgorICogVGhlIENsYXNzIEFyYzJEIHJlcHJlc2VudHMgYSBzZWdtZW50IG9mIGEgY3VydmUgaW5zY3JpYmVkIGluIGEgcmVjdGFuZ2xlLiBUaGUKKyAqIGN1cnZlIGlzIGRlZmluZWQgYnkgYSBzdGFydCBhbmdsZSBhbmQgYW4gZXh0ZW50IGFuZ2xlICh0aGUgZW5kIGFuZ2xlIG1pbnVzCisgKiB0aGUgc3RhcnQgYW5nbGUpIGFzIGEgcGllIHdlZGdlIHdob3NlIHBvaW50IGlzIGluIHRoZSBjZW50ZXIgb2YgdGhlCisgKiByZWN0YW5nbGUuIFRoZSBBcmMyRCBhcyBhIHNoYXBlIG1heSBiZSBlaXRoZXIgT1BFTiAoaW5jbHVkaW5nIG5vdGhpbmcgYnV0IHRoZQorICogY3VydmVkIGFyYyBzZWdtZW50IGl0c2VsZiksIENIT1JEICh0aGUgY3VydmVkIGFyYyBzZWdtZW50IGNsb3NlZCBieSBhCisgKiBjb25uZWN0aW5nIHNlZ21lbnQgZnJvbSB0aGUgZW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFyYywgb3IgUElFICh0aGUKKyAqIHNlZ21lbnRzIGZyb20gdGhlIGVuZCBvZiB0aGUgYXJjIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHJlY3RhbmdsZSBhbmQgZnJvbSB0aGUKKyAqIGNlbnRlciBvZiB0aGUgcmVjdGFuZ2xlIGJhY2sgdG8gdGhlIGFyYydzIHN0YXJ0IHBvaW50IGFyZSBpbmNsdWRlZCkuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXJjMkQgZXh0ZW5kcyBSZWN0YW5ndWxhclNoYXBlIHsKIAotICAgIC8qKiBUaGUgYXJjIHR5cGUgT1BFTiBpbmRpY2F0ZXMgdGhhdCB0aGUgc2hhcGUgaW5jbHVkZXMgb25seSB0aGUgCi0gICAgICogY3VydmVkIGFyYyBzZWdtZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBhcmMgdHlwZSBPUEVOIGluZGljYXRlcyB0aGF0IHRoZSBzaGFwZSBpbmNsdWRlcyBvbmx5IHRoZSBjdXJ2ZWQgYXJjCisgICAgICogc2VnbWVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBPUEVOID0gMDsKLSAgICAKLSAgICAvKiogVGhlIGFyYyB0eXBlIENIT1JEIGluZGljYXRlcyB0aGF0IGFzIGEgc2hhcGUgdGhlIGNvbm5lY3RpbmcKLSAgICAgKiBzZWdtZW50IGZyb20gdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VydmVkIGFyYyB0byB0aGUgYmVnaW5uaW5nCi0gICAgICogcG9pbnQgaXMgaW5jbHVkZWQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXJjIHR5cGUgQ0hPUkQgaW5kaWNhdGVzIHRoYXQgYXMgYSBzaGFwZSB0aGUgY29ubmVjdGluZyBzZWdtZW50IGZyb20KKyAgICAgKiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgYXJjIHRvIHRoZSBiZWdpbm5pbmcgcG9pbnQgaXMgaW5jbHVkZWQuCisgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ0hPUkQgPSAxOwotICAgIAotICAgIC8qKiBUaGUgYXJjIHR5cGUgUElFIGluZGljYXRlcyB0aGF0IGFzIGEgc2hhcGUgdGhlIHR3byBzZWdtZW50cyAKLSAgICAgKiBmcm9tIHRoZSBhcmMncyBlbmRwb2ludCB0byB0aGUgY2VudGVyIG9mIHRoZSByZWN0YW5nbGUgYW5kIGZyb20gCi0gICAgICogdGhlIGNlbnRlciBvZiB0aGUgcmVjdGFuZ2xlIHRvIHRoZSBhcmMncyBlbmRwb2ludCBhcmUgaW5jbHVkZWQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXJjIHR5cGUgUElFIGluZGljYXRlcyB0aGF0IGFzIGEgc2hhcGUgdGhlIHR3byBzZWdtZW50cyBmcm9tIHRoZQorICAgICAqIGFyYydzIGVuZHBvaW50IHRvIHRoZSBjZW50ZXIgb2YgdGhlIHJlY3RhbmdsZSBhbmQgZnJvbSB0aGUgY2VudGVyIG9mIHRoZQorICAgICAqIHJlY3RhbmdsZSB0byB0aGUgYXJjJ3MgZW5kcG9pbnQgYXJlIGluY2x1ZGVkLgorICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBJRSA9IDI7CiAKICAgICAvKioKLSAgICAgKiBUaGUgQ2xhc3MgRmxvYXQgaXMgYSBzdWJjbGFzcyBvZiBBcmMyRCBpbiB3aGljaCBhbGwgb2YgdGhlIAotICAgICAqIGRhdGEgdmFsdWVzIGFyZSBnaXZlbiBhcyBmbG9hdHMuCisgICAgICogVGhlIENsYXNzIEZsb2F0IGlzIGEgc3ViY2xhc3Mgb2YgQXJjMkQgaW4gd2hpY2ggYWxsIG9mIHRoZSBkYXRhIHZhbHVlcworICAgICAqIGFyZSBnaXZlbiBhcyBmbG9hdHMuCisgICAgICogCiAgICAgICogQHNlZSBBcmMyRC5Eb3VibGUKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZsb2F0IGV4dGVuZHMgQXJjMkQgewogCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQKLSAgICAgICAgICogY29udGFpbnMgdGhlIGFyYy4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUgdGhhdAorICAgICAgICAgKiBjb250YWlucyB0aGUgYXJjLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IHg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSB0aGF0Ci0gICAgICAgICAqIGNvbnRhaW5zIHRoZSBhcmMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUgdGhhdAorICAgICAgICAgKiBjb250YWlucyB0aGUgYXJjLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IHk7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgdGhhdCBjb250YWlucyB0aGUgYXJjLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5zIHRoZSBhcmMuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgd2lkdGg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQgY29udGFpbnMgdGhlIGFyYy4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQgY29udGFpbnMgdGhlIGFyYy4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCBoZWlnaHQ7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCBzdGFydDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgd2lkdGggYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGggYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IGV4dGVudDsKIAogICAgICAgICAvKioKQEAgLTkwLDggKzEwOSw5IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQXJjMkQgb2YgdGhlIHNwZWNpZmllZCB0eXBlIHdpdGggZmxvYXQgdmFsdWVzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIG5ldyBBcmMyRCwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwgCi0gICAgICAgICAqIHtAbGluayBBcmMyRCNDSE9SRH0sIG9yIHtAbGluayBBcmMyRCNQSUV9LgorICAgICAgICAgKiBAcGFyYW0gdHlwZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBuZXcgQXJjMkQsIGVpdGhlciB7QGxpbmsgQXJjMkQjT1BFTn0sCisgICAgICAgICAqICAgICAgICAgICAge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3Ige0BsaW5rIEFyYzJEI1BJRX0uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRmxvYXQoaW50IHR5cGUpIHsKICAgICAgICAgICAgIHN1cGVyKHR5cGUpOwpAQCAtMTAwLDIwICsxMjAsMjYgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIEFyYzJEIHdpdGggdGhlIHNwZWNpZmllZCBmbG9hdC12YWx1ZWQgZGF0YS4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUgdGhhdAotICAgICAgICAgKiBjb250YWlucyB0aGUgYXJjLgotICAgICAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQKLSAgICAgICAgICogY29udGFpbnMgdGhlIGFyYy4KLSAgICAgICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQKLSAgICAgICAgICogY29udGFpbnMgdGhlIGFyYy4KLSAgICAgICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgdGhhdAotICAgICAgICAgKiBjb250YWlucyB0aGUgYXJjLgotICAgICAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KLSAgICAgICAgICogQHBhcmFtIGV4dGVudCB0aGUgd2lkdGggYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgotICAgICAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgbmV3IEFyYzJELCBlaXRoZXIge0BsaW5rIEFyYzJEI09QRU59LCAKLSAgICAgICAgICoge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3Ige0BsaW5rIEFyYzJEI1BJRX0uCisgICAgICAgICAqIEBwYXJhbSB4CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZQorICAgICAgICAgKiAgICAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIGFyYy4KKyAgICAgICAgICogQHBhcmFtIHkKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICAgICAqICAgICAgICAgICAgdGhhdCBjb250YWlucyB0aGUgYXJjLgorICAgICAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5zIHRoZSBhcmMuCisgICAgICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgdGhhdCBjb250YWlucyB0aGUgYXJjLgorICAgICAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgorICAgICAgICAgKiBAcGFyYW0gZXh0ZW50CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KKyAgICAgICAgICogQHBhcmFtIHR5cGUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgbmV3IEFyYzJELCBlaXRoZXIge0BsaW5rIEFyYzJEI09QRU59LAorICAgICAgICAgKiAgICAgICAgICAgIHtAbGluayBBcmMyRCNDSE9SRH0sIG9yIHtAbGluayBBcmMyRCNQSUV9LgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEZsb2F0KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQsIGZsb2F0IHN0YXJ0LCBmbG9hdCBleHRlbnQsIGludCB0eXBlKSB7CisgICAgICAgIHB1YmxpYyBGbG9hdChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0LCBmbG9hdCBzdGFydCwgZmxvYXQgZXh0ZW50LAorICAgICAgICAgICAgICAgIGludCB0eXBlKSB7CiAgICAgICAgICAgICBzdXBlcih0eXBlKTsKICAgICAgICAgICAgIHRoaXMueCA9IHg7CiAgICAgICAgICAgICB0aGlzLnkgPSB5OwpAQCAtMTI0LDE0ICsxNTAsMTggQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQW5nbGUyRCB3aXRoIHRoZSBzcGVjaWZpZWQgZmxvYXQtdmFsdWVkIGRhdGEKLSAgICAgICAgICogYW5kIHRoZSBib3VuZGluZyByZWN0YW5nbGUgZ2l2ZW4gYnkgdGhlIHBhcmFtZXRlciBib3VuZHMuCisgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBbmdsZTJEIHdpdGggdGhlIHNwZWNpZmllZCBmbG9hdC12YWx1ZWQgZGF0YSBhbmQKKyAgICAgICAgICogdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBnaXZlbiBieSB0aGUgcGFyYW1ldGVyIGJvdW5kcy4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBib3VuZHMgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgQW5nbGUyRC4KLSAgICAgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCi0gICAgICAgICAqIEBwYXJhbSBleHRlbnQgdGhlIHdpZHRoIGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KLSAgICAgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIG5ldyBBcmMyRCwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwgCi0gICAgICAgICAqIHtAbGluayBBcmMyRCNDSE9SRH0sIG9yIHtAbGluayBBcmMyRCNQSUV9LgorICAgICAgICAgKiBAcGFyYW0gYm91bmRzCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgQW5nbGUyRC4KKyAgICAgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KKyAgICAgICAgICogQHBhcmFtIGV4dGVudAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCisgICAgICAgICAqIEBwYXJhbSB0eXBlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIG5ldyBBcmMyRCwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwKKyAgICAgICAgICogICAgICAgICAgICB7QGxpbmsgQXJjMkQjQ0hPUkR9LCBvciB7QGxpbmsgQXJjMkQjUElFfS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBGbG9hdChSZWN0YW5nbGUyRCBib3VuZHMsIGZsb2F0IHN0YXJ0LCBmbG9hdCBleHRlbnQsIGludCB0eXBlKSB7CiAgICAgICAgICAgICBzdXBlcih0eXBlKTsKQEAgLTE0OCw4ICsxNzgsOCBAQAogICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgIH0KIAotICAgICAgIEBPdmVycmlkZQotICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0WSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0WSgpIHsKICAgICAgICAgICAgIHJldHVybiB5OwogICAgICAgICB9CiAKQEAgLTE3OSw5ICsyMDksOCBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEFyYyhkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCwKLSAgICAgICAgICAgICAgICBkb3VibGUgc3RhcnQsIGRvdWJsZSBleHRlbnQsIGludCB0eXBlKQotICAgICAgICB7CisgICAgICAgIHB1YmxpYyB2b2lkIHNldEFyYyhkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCwgZG91YmxlIHN0YXJ0LAorICAgICAgICAgICAgICAgIGRvdWJsZSBleHRlbnQsIGludCB0eXBlKSB7CiAgICAgICAgICAgICB0aGlzLnNldEFyY1R5cGUodHlwZSk7CiAgICAgICAgICAgICB0aGlzLnggPSAoZmxvYXQpeDsKICAgICAgICAgICAgIHRoaXMueSA9IChmbG9hdCl5OwpAQCAtMjA5LDMwICsyMzgsNDQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGUgQ2xhc3MgRG91YmxlIGlzIGEgc3ViY2xhc3Mgb2YgQXJjMkQgaW4gd2hpY2ggYWxsIG9mIHRoZSAKLSAgICAgKiBkYXRhIHZhbHVlcyBhcmUgZ2l2ZW4gYXMgZG91Ymxlcy4KKyAgICAgKiBUaGUgQ2xhc3MgRG91YmxlIGlzIGEgc3ViY2xhc3Mgb2YgQXJjMkQgaW4gd2hpY2ggYWxsIG9mIHRoZSBkYXRhIHZhbHVlcworICAgICAqIGFyZSBnaXZlbiBhcyBkb3VibGVzLgorICAgICAqIAogICAgICAqIEBzZWUgQXJjMkQuRmxvYXQKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERvdWJsZSBleHRlbmRzIEFyYzJEIHsKIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSB0aGF0Ci0gICAgICAgICAqIGNvbnRhaW5zIHRoZSBhcmMuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQKKyAgICAgICAgICogY29udGFpbnMgdGhlIGFyYy4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgeDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQKLSAgICAgICAgICogY29udGFpbnMgdGhlIGFyYy4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSB0aGF0CisgICAgICAgICAqIGNvbnRhaW5zIHRoZSBhcmMuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIHk7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgdGhhdCBjb250YWlucyB0aGUgYXJjLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5zIHRoZSBhcmMuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIHdpZHRoOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5zIHRoZSBhcmMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5zIHRoZSBhcmMuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIGhlaWdodDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSBzdGFydDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgd2lkdGggYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGggYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSBleHRlbnQ7CiAKICAgICAgICAgLyoqCkBAIC0yNDUsOCArMjg4LDkgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBcmMyRCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgd2l0aCBkb3VibGUgdmFsdWVzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIG5ldyBBcmMyRCwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwgCi0gICAgICAgICAqIHtAbGluayBBcmMyRCNDSE9SRH0sIG9yIHtAbGluayBBcmMyRCNQSUV9LgorICAgICAgICAgKiBAcGFyYW0gdHlwZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBuZXcgQXJjMkQsIGVpdGhlciB7QGxpbmsgQXJjMkQjT1BFTn0sCisgICAgICAgICAqICAgICAgICAgICAge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3Ige0BsaW5rIEFyYzJEI1BJRX0uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRG91YmxlKGludCB0eXBlKSB7CiAgICAgICAgICAgICBzdXBlcih0eXBlKTsKQEAgLTI1NSwyMiArMjk5LDI2IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBBcmMyRCB3aXRoIHRoZSBzcGVjaWZpZWQgZG91YmxlLXZhbHVlZCBkYXRhLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSB0aGF0Ci0gICAgICAgICAqIGNvbnRhaW5zIHRoZSBhcmMuCi0gICAgICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUgdGhhdAotICAgICAgICAgKiBjb250YWlucyB0aGUgYXJjLgotICAgICAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgdGhhdAotICAgICAgICAgKiBjb250YWlucyB0aGUgYXJjLgotICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB0aGF0Ci0gICAgICAgICAqIGNvbnRhaW5zIHRoZSBhcmMuCi0gICAgICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgotICAgICAgICAgKiBAcGFyYW0gZXh0ZW50IHRoZSB3aWR0aCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCi0gICAgICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBuZXcgQXJjMkQsIGVpdGhlciB7QGxpbmsgQXJjMkQjT1BFTn0sIAotICAgICAgICAgKiB7QGxpbmsgQXJjMkQjQ0hPUkR9LCBvciB7QGxpbmsgQXJjMkQjUElFfS4KKyAgICAgICAgICogQHBhcmFtIHgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICAgICAqICAgICAgICAgICAgdGhhdCBjb250YWlucyB0aGUgYXJjLgorICAgICAgICAgKiBAcGFyYW0geQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgICAgICogICAgICAgICAgICB0aGF0IGNvbnRhaW5zIHRoZSBhcmMuCisgICAgICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQgY29udGFpbnMgdGhlIGFyYy4KKyAgICAgICAgICogQHBhcmFtIGhlaWdodAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5zIHRoZSBhcmMuCisgICAgICAgICAqIEBwYXJhbSBzdGFydAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCisgICAgICAgICAqIEBwYXJhbSBleHRlbnQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgd2lkdGggYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgorICAgICAgICAgKiBAcGFyYW0gdHlwZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBuZXcgQXJjMkQsIGVpdGhlciB7QGxpbmsgQXJjMkQjT1BFTn0sCisgICAgICAgICAqICAgICAgICAgICAge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3Ige0BsaW5rIEFyYzJEI1BJRX0uCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRG91YmxlKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0LAotICAgICAgICAgICAgICAgIGRvdWJsZSBzdGFydCwgZG91YmxlIGV4dGVudCwgaW50IHR5cGUpCi0gICAgICAgIHsKKyAgICAgICAgcHVibGljIERvdWJsZShkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCwgZG91YmxlIHN0YXJ0LCBkb3VibGUgZXh0ZW50LAorICAgICAgICAgICAgICAgIGludCB0eXBlKSB7CiAgICAgICAgICAgICBzdXBlcih0eXBlKTsKICAgICAgICAgICAgIHRoaXMueCA9IHg7CiAgICAgICAgICAgICB0aGlzLnkgPSB5OwpAQCAtMjgxLDE0ICszMjksMTggQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQW5nbGUyRCB3aXRoIHRoZSBzcGVjaWZpZWQgZmxvYXQtdmFsdWVkIGRhdGEKLSAgICAgICAgICogYW5kIHRoZSBib3VuZGluZyByZWN0YW5nbGUgZ2l2ZW4gYnkgdGhlIHBhcmFtZXRlciBib3VuZHMuCisgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBbmdsZTJEIHdpdGggdGhlIHNwZWNpZmllZCBmbG9hdC12YWx1ZWQgZGF0YSBhbmQKKyAgICAgICAgICogdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBnaXZlbiBieSB0aGUgcGFyYW1ldGVyIGJvdW5kcy4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBib3VuZHMgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgQW5nbGUyRC4KLSAgICAgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCi0gICAgICAgICAqIEBwYXJhbSBleHRlbnQgdGhlIHdpZHRoIGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KLSAgICAgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIG5ldyBBcmMyRCwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwgCi0gICAgICAgICAqIHtAbGluayBBcmMyRCNDSE9SRH0sIG9yIHtAbGluayBBcmMyRCNQSUV9LgorICAgICAgICAgKiBAcGFyYW0gYm91bmRzCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgQW5nbGUyRC4KKyAgICAgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KKyAgICAgICAgICogQHBhcmFtIGV4dGVudAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCisgICAgICAgICAqIEBwYXJhbSB0eXBlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIG5ldyBBcmMyRCwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwKKyAgICAgICAgICogICAgICAgICAgICB7QGxpbmsgQXJjMkQjQ0hPUkR9LCBvciB7QGxpbmsgQXJjMkQjUElFfS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBEb3VibGUoUmVjdGFuZ2xlMkQgYm91bmRzLCBkb3VibGUgc3RhcnQsIGRvdWJsZSBleHRlbnQsIGludCB0eXBlKSB7CiAgICAgICAgICAgICBzdXBlcih0eXBlKTsKQEAgLTMzNiw5ICszODgsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEFyYyhkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCwKLSAgICAgICAgICAgICAgICBkb3VibGUgc3RhcnQsIGRvdWJsZSBleHRlbnQsIGludCB0eXBlKQotICAgICAgICB7CisgICAgICAgIHB1YmxpYyB2b2lkIHNldEFyYyhkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCwgZG91YmxlIHN0YXJ0LAorICAgICAgICAgICAgICAgIGRvdWJsZSBleHRlbnQsIGludCB0eXBlKSB7CiAgICAgICAgICAgICB0aGlzLnNldEFyY1R5cGUodHlwZSk7CiAgICAgICAgICAgICB0aGlzLnggPSB4OwogICAgICAgICAgICAgdGhpcy55ID0geTsKQEAgLTM2Niw3MyArNDE3LDExNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoZSBDbGFzcyBJdGVyYXRvciBpcyB0aGUgc3ViY2xhc3Mgb2YgUGF0aEl0ZXJhdG9yIHRoYXQgaXMgdXNlZCB0byAKKyAgICAgKiBUaGUgQ2xhc3MgSXRlcmF0b3IgaXMgdGhlIHN1YmNsYXNzIG9mIFBhdGhJdGVyYXRvciB0aGF0IGlzIHVzZWQgdG8KICAgICAgKiB0cmF2ZXJzZSB0aGUgYm91bmRhcnkgb2YgYSBzaGFwZSBvZiB0eXBlIEFyYzJELgogICAgICAqLwogICAgIGNsYXNzIEl0ZXJhdG9yIGltcGxlbWVudHMgUGF0aEl0ZXJhdG9yIHsKIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBhcmMncyBib3VuZGluZyByZWN0YW5nbGUuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGFyYydzIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSB4OwogCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGFyYydzIGJvdW5kaW5nIHJlY3RhbmdsZS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgYXJjJ3MgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgICAgICAgKi8KICAgICAgICAgZG91YmxlIHk7CiAKLSAgICAgICAgLyoqIEhhbGYgb2YgdGhlIHdpZHRoIG9mIHRoZSBhcmMncyBib3VuZGluZyByZWN0YW5nbGUgKHRoZSByYWRpdXMgaW4gdGhlIGNhc2Ugb2YgYSBjaXJjdWxhciBhcmMpLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogSGFsZiBvZiB0aGUgd2lkdGggb2YgdGhlIGFyYydzIGJvdW5kaW5nIHJlY3RhbmdsZSAodGhlIHJhZGl1cyBpbiB0aGUKKyAgICAgICAgICogY2FzZSBvZiBhIGNpcmN1bGFyIGFyYykuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUgd2lkdGg7Ci0gICAgICAgIAotICAgICAgICAvKiogSGFsZiBvZiB0aGUgaGVpZ2h0IG9mIHRoZSBhcmMncyBib3VuZGluZyByZWN0YW5nbGUgKHRoZSByYWRpdXMgaW4gdGhlIGNhc2Ugb2YgYSBjaXJjdWxhciBhcmMpLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYWxmIG9mIHRoZSBoZWlnaHQgb2YgdGhlIGFyYydzIGJvdW5kaW5nIHJlY3RhbmdsZSAodGhlIHJhZGl1cyBpbiB0aGUKKyAgICAgICAgICogY2FzZSBvZiBhIGNpcmN1bGFyIGFyYykuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUgaGVpZ2h0OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBzdGFydCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzdGFydCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUgYW5nbGU7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGFuZ2xlIGV4dGVudCBpbiBkZWdyZWVzLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYW5nbGUgZXh0ZW50IGluIGRlZ3JlZXMuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUgZXh0ZW50OwotICAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgY2xvc3VyZSB0eXBlIG9mIHRoZSBhcmMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjbG9zdXJlIHR5cGUgb2YgdGhlIGFyYy4KKyAgICAgICAgICovCiAgICAgICAgIGludCB0eXBlOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBwYXRoIGl0ZXJhdG9yIHRyYW5zZm9ybWF0aW9uLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcGF0aCBpdGVyYXRvciB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgICAgICovCiAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBjdXJyZW50IHNlZ21lbnQgaW5kZXguICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjdXJyZW50IHNlZ21lbnQgaW5kZXguCisgICAgICAgICAqLwogICAgICAgICBpbnQgaW5kZXg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIG51bWJlciBvZiBhcmMgc2VnbWVudHMgdGhlIHNvdXJjZSBhcmMgc3ViZGl2aWRlZCB0byBiZSBhcHByb3hpbWF0ZWQgYnkgQmV6aWVyIGN1cnZlcy4gRGVwZW5kcyBvbiBleHRlbnQgdmFsdWUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBudW1iZXIgb2YgYXJjIHNlZ21lbnRzIHRoZSBzb3VyY2UgYXJjIHN1YmRpdmlkZWQgdG8gYmUKKyAgICAgICAgICogYXBwcm94aW1hdGVkIGJ5IEJlemllciBjdXJ2ZXMuIERlcGVuZHMgb24gZXh0ZW50IHZhbHVlLgorICAgICAgICAgKi8KICAgICAgICAgaW50IGFyY0NvdW50OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBudW1iZXIgb2YgbGluZSBzZWdtZW50cy4gRGVwZW5kcyBvbiBjbG9zdXJlIHR5cGUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBudW1iZXIgb2YgbGluZSBzZWdtZW50cy4gRGVwZW5kcyBvbiBjbG9zdXJlIHR5cGUuCisgICAgICAgICAqLwogICAgICAgICBpbnQgbGluZUNvdW50OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBzdGVwIHRvIGNhbGN1bGF0ZSBuZXh0IGFyYyBzdWJkaXZpc2lvbiBwb2ludC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHN0ZXAgdG8gY2FsY3VsYXRlIG5leHQgYXJjIHN1YmRpdmlzaW9uIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgZG91YmxlIHN0ZXA7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHRlbXBvcmFyeSB2YWx1ZSBvZiBjb3NpbnVzIG9mIHRoZSBjdXJyZW50IGFuZ2xlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGVtcG9yYXJ5IHZhbHVlIG9mIGNvc2ludXMgb2YgdGhlIGN1cnJlbnQgYW5nbGUuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUgY29zOwogCi0gICAgICAgIC8qKiBUaGUgdGVtcG9yYXJ5IHZhbHVlIG9mIHNpbnVzIG9mIHRoZSBjdXJyZW50IGFuZ2xlLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRlbXBvcmFyeSB2YWx1ZSBvZiBzaW51cyBvZiB0aGUgY3VycmVudCBhbmdsZS4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSBzaW47Ci0gICAgICAgIAorCiAgICAgICAgIC8qKiBUaGUgY29lZmZpY2llbnQgdG8gY2FsY3VsYXRlIGNvbnRyb2wgcG9pbnRzIG9mIEJlemllciBjdXJ2ZXMuICovCiAgICAgICAgIGRvdWJsZSBrOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB0ZW1wb3JhcnkgdmFsdWUgb2YgeCBjb29yZGluYXRlIG9mIHRoZSBCZXppZXIgY3VydmUgY29udHJvbCB2ZWN0b3IuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0ZW1wb3JhcnkgdmFsdWUgb2YgeCBjb29yZGluYXRlIG9mIHRoZSBCZXppZXIgY3VydmUgY29udHJvbAorICAgICAgICAgKiB2ZWN0b3IuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUga3g7CiAKLSAgICAgICAgLyoqIFRoZSB0ZW1wb3JhcnkgdmFsdWUgb2YgeSBjb29yZGluYXRlIG9mIHRoZSBCZXppZXIgY3VydmUgY29udHJvbCB2ZWN0b3IuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGVtcG9yYXJ5IHZhbHVlIG9mIHkgY29vcmRpbmF0ZSBvZiB0aGUgQmV6aWVyIGN1cnZlIGNvbnRyb2wKKyAgICAgICAgICogdmVjdG9yLgorICAgICAgICAgKi8KICAgICAgICAgZG91YmxlIGt5OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBhdGggcG9pbnQgKE1PVkVfVE8pLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwYXRoIHBvaW50IChNT1ZFX1RPKS4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSBteDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwYXRoIHBvaW50IChNT1ZFX1RPKS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcGF0aCBwb2ludCAoTU9WRV9UTykuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUgbXk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgQXJjMkQuSXRlcmF0b3IgZm9yIGdpdmVuIGxpbmUgYW5kIHRyYW5zZm9ybWF0aW9uCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gYSAtIHRoZSBzb3VyY2UgQXJjMkQgb2JqZWN0Ci0gICAgICAgICAqIEBwYXJhbSB0IHRoZSBBZmZpbmVUcmFuc2Zvcm1hdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgc291cmNlIEFyYzJEIG9iamVjdC4KKyAgICAgICAgICogQHBhcmFtIHQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgQWZmaW5lVHJhbnNmb3JtYXRpb24uCiAgICAgICAgICAqLwogICAgICAgICBJdGVyYXRvcihBcmMyRCBhLCBBZmZpbmVUcmFuc2Zvcm0gdCkgewogICAgICAgICAgICAgaWYgKHdpZHRoIDwgMCB8fCBoZWlnaHQgPCAwKSB7CkBAIC00NjIsOCArNTU2LDcgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgYXJjQ291bnQgPSAoaW50KU1hdGgucmludChNYXRoLmFicyhleHRlbnQpIC8gOTAuMCk7CiAgICAgICAgICAgICAgICAgc3RlcCA9IE1hdGgudG9SYWRpYW5zKGV4dGVudCAvIGFyY0NvdW50KTsKLSAgICAgICAgICAgICAgICBrID0gNC4wIC8gMy4wICogKDEuMCAtIE1hdGguY29zKHN0ZXAgLyAyLjApKQotICAgICAgICAgICAgICAgICAgICAgICAgLyBNYXRoLnNpbihzdGVwIC8gMi4wKTsKKyAgICAgICAgICAgICAgICBrID0gNC4wIC8gMy4wICogKDEuMCAtIE1hdGguY29zKHN0ZXAgLyAyLjApKSAvIE1hdGguc2luKHN0ZXAgLyAyLjApOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBsaW5lQ291bnQgPSAwOwpAQCAtNTc4LDEzICs2NzEsMTYgQEAKIAogICAgIH0KIAotICAgIC8qKiBUaGUgY2xvc3VyZSB0eXBlIG9mIHRoZSBhcmMuICovCisgICAgLyoqCisgICAgICogVGhlIGNsb3N1cmUgdHlwZSBvZiB0aGUgYXJjLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IHR5cGU7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgYXJjMkQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIGNsb3N1cmUgdHlwZS4KKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGNsb3N1cmUgdHlwZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQXJjMkQoaW50IHR5cGUpIHsKICAgICAgICAgc2V0QXJjVHlwZSh0eXBlKTsKQEAgLTU5NSwxMSArNjkxLDE2IEBACiAgICAgICogb2JqZWN0IHdpdGggdmFsdWVzIGVpdGhlciBvZiB0eXBlIGZsb2F0IG9yIG9mIHR5cGUgZG91YmxlIGRlcGVuZGluZyBvbgogICAgICAqIHdoZXRoZXIgdGhpcyBBcmMyRCBpbnN0YW5jZSBpcyBvZiB0eXBlIEZsb2F0IG9yIERvdWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcKKyAgICAgKiAgICAgICAgICAgIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nCisgICAgICogICAgICAgICAgICByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCiAgICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBSZWN0YW5nbGUyRCBvYmplY3QuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFJlY3RhbmdsZTJEIG1ha2VCb3VuZHMoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQpOwpAQCAtNjIxLDM5ICs3MjIsNDYgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBzdGFydCBhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIG5ldyBzdGFydCBhbmdsZS4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgc3RhcnQgYW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QW5nbGVTdGFydChkb3VibGUgc3RhcnQpOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgd2lkdGggYW5nbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV4dGVudCB0aGUgbmV3IHdpZHRoIGFuZ2xlLgorICAgICAqIEBwYXJhbSBleHRlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgd2lkdGggYW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QW5nbGVFeHRlbnQoZG91YmxlIGV4dGVudCk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBkYXRhIHZhbHVlcyB0aGF0IGRlZmluZSB0aGUgYXJjLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUgdGhhdAotICAgICAqIGNvbnRhaW5zIHRoZSBhcmMuCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSB0aGF0Ci0gICAgICogY29udGFpbnMgdGhlIGFyYy4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgdGhhdAotICAgICAqIGNvbnRhaW5zIHRoZSBhcmMuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgdGhhdAotICAgICAqIGNvbnRhaW5zIHRoZSBhcmMuCi0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCi0gICAgICogQHBhcmFtIGV4dGVudCB0aGUgd2lkdGggYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgotICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBuZXcgQXJjMkQsIGVpdGhlciB7QGxpbmsgQXJjMkQjT1BFTn0sIAotICAgICAqIHtAbGluayBBcmMyRCNDSE9SRH0sIG9yIHtAbGluayBBcmMyRCNQSUV9LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogICAgICAgICAgICB0aGF0IGNvbnRhaW5zIHRoZSBhcmMuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiAgICAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIGFyYy4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQgY29udGFpbnMgdGhlIGFyYy4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgdGhhdCBjb250YWlucyB0aGUgYXJjLgorICAgICAqIEBwYXJhbSBzdGFydAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KKyAgICAgKiBAcGFyYW0gZXh0ZW50CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgbmV3IEFyYzJELCBlaXRoZXIge0BsaW5rIEFyYzJEI09QRU59LAorICAgICAqICAgICAgICAgICAge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3Ige0BsaW5rIEFyYzJEI1BJRX0uCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QXJjKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLAotICAgICAgICAgICAgZG91YmxlIGhlaWdodCwgZG91YmxlIHN0YXJ0LCBkb3VibGUgZXh0ZW50LCBpbnQgdHlwZSk7CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QXJjKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0LCBkb3VibGUgc3RhcnQsCisgICAgICAgICAgICBkb3VibGUgZXh0ZW50LCBpbnQgdHlwZSk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhcmMgdHlwZSwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwgCi0gICAgICoge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3Ige0BsaW5rIEFyYzJEI1BJRX0uCisgICAgICogR2V0cyB0aGUgYXJjIHR5cGUsIGVpdGhlciB7QGxpbmsgQXJjMkQjT1BFTn0sIHtAbGluayBBcmMyRCNDSE9SRH0sIG9yCisgICAgICoge0BsaW5rIEFyYzJEI1BJRX0uCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYXJjIHR5cGUuCiAgICAgICovCkBAIC02NjIsMTAgKzc3MCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFyYyB0eXBlLCBlaXRoZXIge0BsaW5rIEFyYzJEI09QRU59LCAKLSAgICAgKiB7QGxpbmsgQXJjMkQjQ0hPUkR9LCBvciB7QGxpbmsgQXJjMkQjUElFfS4KKyAgICAgKiBTZXRzIHRoZSBhcmMgdHlwZSwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3IKKyAgICAgKiB7QGxpbmsgQXJjMkQjUElFfS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgbmV3IGFyYyB0eXBlLgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGFyYyB0eXBlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEFyY1R5cGUoaW50IHR5cGUpIHsKICAgICAgICAgaWYgKHR5cGUgIT0gT1BFTiAmJiB0eXBlICE9IENIT1JEICYmIHR5cGUgIT0gUElFKSB7CkBAIC02ODIsOSArNzkxLDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgUG9pbnQyRCBnZXRTdGFydFBvaW50KCkgewogICAgICAgICBkb3VibGUgYSA9IE1hdGgudG9SYWRpYW5zKGdldEFuZ2xlU3RhcnQoKSk7Ci0gICAgICAgIHJldHVybiBuZXcgUG9pbnQyRC5Eb3VibGUoCi0gICAgICAgICAgICAgICAgZ2V0WCgpICsgKDEuMCArIE1hdGguY29zKGEpKSAqIGdldFdpZHRoKCkgLyAyLjAsCi0gICAgICAgICAgICAgICAgZ2V0WSgpICsgKDEuMCAtIE1hdGguc2luKGEpKSAqIGdldEhlaWdodCgpIC8gMi4wKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQb2ludDJELkRvdWJsZShnZXRYKCkgKyAoMS4wICsgTWF0aC5jb3MoYSkpICogZ2V0V2lkdGgoKSAvIDIuMCwgZ2V0WSgpCisgICAgICAgICAgICAgICAgKyAoMS4wIC0gTWF0aC5zaW4oYSkpICogZ2V0SGVpZ2h0KCkgLyAyLjApOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjk0LDkgKzgwMiw4IEBACiAgICAgICovCiAgICAgcHVibGljIFBvaW50MkQgZ2V0RW5kUG9pbnQoKSB7CiAgICAgICAgIGRvdWJsZSBhID0gTWF0aC50b1JhZGlhbnMoZ2V0QW5nbGVTdGFydCgpICsgZ2V0QW5nbGVFeHRlbnQoKSk7Ci0gICAgICAgIHJldHVybiBuZXcgUG9pbnQyRC5Eb3VibGUoCi0gICAgICAgICAgICAgICAgZ2V0WCgpICsgKDEuMCArIE1hdGguY29zKGEpKSAqIGdldFdpZHRoKCkgLyAyLjAsCi0gICAgICAgICAgICAgICAgZ2V0WSgpICsgKDEuMCAtIE1hdGguc2luKGEpKSAqIGdldEhlaWdodCgpIC8gMi4wKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQb2ludDJELkRvdWJsZShnZXRYKCkgKyAoMS4wICsgTWF0aC5jb3MoYSkpICogZ2V0V2lkdGgoKSAvIDIuMCwgZ2V0WSgpCisgICAgICAgICAgICAgICAgKyAoMS4wIC0gTWF0aC5zaW4oYSkpICogZ2V0SGVpZ2h0KCkgLyAyLjApOwogICAgIH0KIAogICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRCb3VuZHMyRCgpIHsKQEAgLTcxMiw4ICs4MTksOCBAQAogICAgICAgICBQb2ludDJEIHAyID0gZ2V0RW5kUG9pbnQoKTsKIAogICAgICAgICBkb3VibGUgYngxID0gY29udGFpbnNBbmdsZSgxODAuMCkgPyByeDEgOiBNYXRoLm1pbihwMS5nZXRYKCksIHAyLmdldFgoKSk7Ci0gICAgICAgIGRvdWJsZSBieTEgPSBjb250YWluc0FuZ2xlKDkwLjApICA/IHJ5MSA6IE1hdGgubWluKHAxLmdldFkoKSwgcDIuZ2V0WSgpKTsKLSAgICAgICAgZG91YmxlIGJ4MiA9IGNvbnRhaW5zQW5nbGUoMC4wKSAgID8gcngyIDogTWF0aC5tYXgocDEuZ2V0WCgpLCBwMi5nZXRYKCkpOworICAgICAgICBkb3VibGUgYnkxID0gY29udGFpbnNBbmdsZSg5MC4wKSA/IHJ5MSA6IE1hdGgubWluKHAxLmdldFkoKSwgcDIuZ2V0WSgpKTsKKyAgICAgICAgZG91YmxlIGJ4MiA9IGNvbnRhaW5zQW5nbGUoMC4wKSA/IHJ4MiA6IE1hdGgubWF4KHAxLmdldFgoKSwgcDIuZ2V0WCgpKTsKICAgICAgICAgZG91YmxlIGJ5MiA9IGNvbnRhaW5zQW5nbGUoMjcwLjApID8gcnkyIDogTWF0aC5tYXgocDEuZ2V0WSgpLCBwMi5nZXRZKCkpOwogCiAgICAgICAgIGlmICh0eXBlID09IFBJRSkgewpAQCAtNzM1LDEyICs4NDIsMTcgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBkYXRhIHRoYXQgZGVmaW5lcyB0aGUgYXJjLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwb2ludCB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgotICAgICAqIEBwYXJhbSBleHRlbnQgdGhlIGFuZ2xlIHdpdGR0aCBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIGNsb3N1cmUgdHlwZSwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwgCi0gICAgICoge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3Ige0BsaW5rIEFyYzJEI1BJRX0uCisgICAgICogQHBhcmFtIHBvaW50CisgICAgICogICAgICAgICAgICB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCisgICAgICogQHBhcmFtIGV4dGVudAorICAgICAqICAgICAgICAgICAgdGhlIGFuZ2xlIHdpZHRoIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGNsb3N1cmUgdHlwZSwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBBcmMyRCNDSE9SRH0sIG9yIHtAbGluayBBcmMyRCNQSUV9LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEFyYyhQb2ludDJEIHBvaW50LCBEaW1lbnNpb24yRCBzaXplLCBkb3VibGUgc3RhcnQsIGRvdWJsZSBleHRlbnQsIGludCB0eXBlKSB7CiAgICAgICAgIHNldEFyYyhwb2ludC5nZXRYKCksIHBvaW50LmdldFkoKSwgc2l6ZS5nZXRXaWR0aCgpLCBzaXplLmdldEhlaWdodCgpLCBzdGFydCwgZXh0ZW50LCB0eXBlKTsKQEAgLTc0OSwxMSArODYxLDE1IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZGF0YSB0aGF0IGRlZmluZXMgdGhlIGFyYy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVjdCB0aGUgYXJjJ3MgYm91bmRpbmcgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgotICAgICAqIEBwYXJhbSBleHRlbnQgdGhlIGFuZ2xlIHdpdGR0aCBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIGNsb3N1cmUgdHlwZSwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwgCi0gICAgICoge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3Ige0BsaW5rIEFyYzJEI1BJRX0uCisgICAgICogQHBhcmFtIHJlY3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcmMncyBib3VuZGluZyByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgorICAgICAqIEBwYXJhbSBleHRlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbmdsZSB3aWR0aCBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbG9zdXJlIHR5cGUsIGVpdGhlciB7QGxpbmsgQXJjMkQjT1BFTn0sCisgICAgICogICAgICAgICAgICB7QGxpbmsgQXJjMkQjQ0hPUkR9LCBvciB7QGxpbmsgQXJjMkQjUElFfS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRBcmMoUmVjdGFuZ2xlMkQgcmVjdCwgZG91YmxlIHN0YXJ0LCBkb3VibGUgZXh0ZW50LCBpbnQgdHlwZSkgewogICAgICAgICBzZXRBcmMocmVjdC5nZXRYKCksIHJlY3QuZ2V0WSgpLCByZWN0LmdldFdpZHRoKCksIHJlY3QuZ2V0SGVpZ2h0KCksIHN0YXJ0LCBleHRlbnQsIHR5cGUpOwpAQCAtNzYyLDQ3ICs4NzgsNjAgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBkYXRhIHRoYXQgZGVmaW5lcyB0aGUgYXJjIGJ5IGNvcHlpbmcgaXQgZnJvbSBhbm90aGVyIEFyYzJELgogICAgICAqIAotICAgICAqIEBwYXJhbSBhcmMgdGhlIGFyYyB3aG9zZSBkYXRhIGlzIGNvcGllZCBpbnRvIHRoaXMgYXJjLgorICAgICAqIEBwYXJhbSBhcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcmMgd2hvc2UgZGF0YSBpcyBjb3BpZWQgaW50byB0aGlzIGFyYy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRBcmMoQXJjMkQgYXJjKSB7Ci0gICAgICAgIHNldEFyYyhhcmMuZ2V0WCgpLCBhcmMuZ2V0WSgpLCBhcmMuZ2V0V2lkdGgoKSwgYXJjLmdldEhlaWdodCgpLCBhcmMKLSAgICAgICAgICAgICAgICAuZ2V0QW5nbGVTdGFydCgpLCBhcmMuZ2V0QW5nbGVFeHRlbnQoKSwgYXJjLmdldEFyY1R5cGUoKSk7CisgICAgICAgIHNldEFyYyhhcmMuZ2V0WCgpLCBhcmMuZ2V0WSgpLCBhcmMuZ2V0V2lkdGgoKSwgYXJjLmdldEhlaWdodCgpLCBhcmMuZ2V0QW5nbGVTdGFydCgpLCBhcmMKKyAgICAgICAgICAgICAgICAuZ2V0QW5nbGVFeHRlbnQoKSwgYXJjLmdldEFyY1R5cGUoKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZGF0YSBmb3IgYSBjaXJjdWxhciBhcmMgYnkgZ2l2aW5nIGl0cyBjZW50ZXIgYW5kIHJhZGl1cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS4KLSAgICAgKiBAcGFyYW0gcmFkaXVzIHRoZSByYWRpdXMgb2YgdGhlIGNpcmNsZS4KLSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KLSAgICAgKiBAcGFyYW0gZXh0ZW50IHRoZSBhbmdsZSB3aXRkdGggb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgotICAgICAqIEBwYXJhbSB0eXBlIHRoZSBjbG9zdXJlIHR5cGUsIGVpdGhlciB7QGxpbmsgQXJjMkQjT1BFTn0sIAotICAgICAqIHtAbGluayBBcmMyRCNDSE9SRH0sIG9yIHtAbGluayBBcmMyRCNQSUV9LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBjaXJjbGUuCisgICAgICogQHBhcmFtIHJhZGl1cworICAgICAqICAgICAgICAgICAgdGhlIHJhZGl1cyBvZiB0aGUgY2lyY2xlLgorICAgICAqIEBwYXJhbSBzdGFydAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KKyAgICAgKiBAcGFyYW0gZXh0ZW50CisgICAgICogICAgICAgICAgICB0aGUgYW5nbGUgd2lkdGggb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgY2xvc3VyZSB0eXBlLCBlaXRoZXIge0BsaW5rIEFyYzJEI09QRU59LAorICAgICAqICAgICAgICAgICAge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3Ige0BsaW5rIEFyYzJEI1BJRX0uCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QXJjQnlDZW50ZXIoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgcmFkaXVzLCBkb3VibGUgc3RhcnQsIGRvdWJsZSBleHRlbnQsIGludCB0eXBlKSB7CisgICAgcHVibGljIHZvaWQgc2V0QXJjQnlDZW50ZXIoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgcmFkaXVzLCBkb3VibGUgc3RhcnQsIGRvdWJsZSBleHRlbnQsCisgICAgICAgICAgICBpbnQgdHlwZSkgewogICAgICAgICBzZXRBcmMoeCAtIHJhZGl1cywgeSAtIHJhZGl1cywgcmFkaXVzICogMi4wLCByYWRpdXMgKiAyLjAsIHN0YXJ0LCBleHRlbnQsIHR5cGUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFyYyBkYXRhIGZvciBhIGNpcmN1bGFyIGFyYyBiYXNlZCBvbiB0d28gdGFuZ2VudCBsaW5lcwotICAgICAqIGFuZCB0aGUgcmFkaXVzLiBUaGUgdHdvIHRhbmdlbnQgbGluZXMgYXJlIHRoZSBsaW5lcyBmcm9tIHAxIAotICAgICAqIHRvIHAyIGFuZCBmcm9tIHAyIHRvIHAzLCB3aGljaCBkZXRlcm1pbmUgYSB1bmlxdWUgY2lyY2xlIAotICAgICAqIHdpdGggdGhlIGdpdmVuIHJhZGl1cy4gVGhlIHN0YXJ0IGFuZCBlbmQgcG9pbnRzIG9mIHRoZSBhcmMgCi0gICAgICogYXJlIHRoZSBwb2ludHMgd2hlcmUgdGhlIGNpcmNsZSB0b3VjaGVzIHRoZSB0d28gbGluZXMsIGFuZCAKLSAgICAgKiB0aGUgYXJjIGl0c2VsZiBpcyB0aGUgc2hvcnRlciBvZiB0aGUgdHdvIGNpcmNsZSBzZWdtZW50cyAKLSAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSB0d28gcG9pbnRzIChpbiBvdGhlciB3b3JkcywgaXQgaXMgdGhlIAotICAgICAqIHBpZWNlIG9mIHRoZSBjaXJjbGUgdGhhdCBpcyBjbG9zZXIgdG8gdGhlIGxpbmVzJyBpbnRlcnNlY3Rpb24gCi0gICAgICogcG9pbnQgcDIgYW5kIGZvcm1zIGEgY29uY2F2ZSBzaGFwZSB3aXRoIHRoZSBzZWdtZW50cyBmcm9tIHAxIHRvIHAyIAotICAgICAqIGFuZCBmcm9tIHAyIHRvIHAzKS4KKyAgICAgKiBTZXRzIHRoZSBhcmMgZGF0YSBmb3IgYSBjaXJjdWxhciBhcmMgYmFzZWQgb24gdHdvIHRhbmdlbnQgbGluZXMgYW5kIHRoZQorICAgICAqIHJhZGl1cy4gVGhlIHR3byB0YW5nZW50IGxpbmVzIGFyZSB0aGUgbGluZXMgZnJvbSBwMSB0byBwMiBhbmQgZnJvbSBwMiB0bworICAgICAqIHAzLCB3aGljaCBkZXRlcm1pbmUgYSB1bmlxdWUgY2lyY2xlIHdpdGggdGhlIGdpdmVuIHJhZGl1cy4gVGhlIHN0YXJ0IGFuZAorICAgICAqIGVuZCBwb2ludHMgb2YgdGhlIGFyYyBhcmUgdGhlIHBvaW50cyB3aGVyZSB0aGUgY2lyY2xlIHRvdWNoZXMgdGhlIHR3bworICAgICAqIGxpbmVzLCBhbmQgdGhlIGFyYyBpdHNlbGYgaXMgdGhlIHNob3J0ZXIgb2YgdGhlIHR3byBjaXJjbGUgc2VnbWVudHMKKyAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSB0d28gcG9pbnRzIChpbiBvdGhlciB3b3JkcywgaXQgaXMgdGhlIHBpZWNlIG9mIHRoZQorICAgICAqIGNpcmNsZSB0aGF0IGlzIGNsb3NlciB0byB0aGUgbGluZXMnIGludGVyc2VjdGlvbiBwb2ludCBwMiBhbmQgZm9ybXMgYQorICAgICAqIGNvbmNhdmUgc2hhcGUgd2l0aCB0aGUgc2VnbWVudHMgZnJvbSBwMSB0byBwMiBhbmQgZnJvbSBwMiB0byBwMykuCiAgICAgICogCi0gICAgICogQHBhcmFtIHAxIGEgcG9pbnQgd2hpY2ggZGV0ZXJtaW5lcyBvbmUgb2YgdGhlIHR3byB0YW5nZXQgbGluZXMgKHdpdGggcDIpLgotICAgICAqIEBwYXJhbSBwMiB0aGUgcG9pbnQgb2YgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gdGFuZ2VudCBsaW5lcy4KLSAgICAgKiBAcGFyYW0gcDMgYSBwb2ludCB3aGljaCBkZXRlcm1pbmVzIG9uZSBvZiB0aGUgdHdvIHRhbmdldCBsaW5lcyAod2l0aCBwMikuCi0gICAgICogQHBhcmFtIHJhZGl1cyB0aGUgcmFkaXVzIG9mIHRoZSBjaXJjdWxhciBhcmMuCisgICAgICogQHBhcmFtIHAxCisgICAgICogICAgICAgICAgICBhIHBvaW50IHdoaWNoIGRldGVybWluZXMgb25lIG9mIHRoZSB0d28gdGFuZ2VudCBsaW5lcyAod2l0aAorICAgICAqICAgICAgICAgICAgcDIpLgorICAgICAqIEBwYXJhbSBwMgorICAgICAqICAgICAgICAgICAgdGhlIHBvaW50IG9mIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIHRhbmdlbnQgbGluZXMuCisgICAgICogQHBhcmFtIHAzCisgICAgICogICAgICAgICAgICBhIHBvaW50IHdoaWNoIGRldGVybWluZXMgb25lIG9mIHRoZSB0d28gdGFuZ2VudCBsaW5lcyAod2l0aAorICAgICAqICAgICAgICAgICAgcDIpLgorICAgICAqIEBwYXJhbSByYWRpdXMKKyAgICAgKiAgICAgICAgICAgIHRoZSByYWRpdXMgb2YgdGhlIGNpcmN1bGFyIGFyYy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRBcmNCeVRhbmdlbnQoUG9pbnQyRCBwMSwgUG9pbnQyRCBwMiwgUG9pbnQyRCBwMywgZG91YmxlIHJhZGl1cykgewotICAgICAgICAvLyBVc2VkIHNpbXBsZSBnZW9tZXRyaWMgY2FsY3VsYXRpb25zIG9mIGFyYyBjZW50ZXIsIHJhZGl1cyBhbmQgYW5nbGVzIGJ5IHRhbmdlbnRzCisgICAgICAgIC8vIFVzZWQgc2ltcGxlIGdlb21ldHJpYyBjYWxjdWxhdGlvbnMgb2YgYXJjIGNlbnRlciwgcmFkaXVzIGFuZCBhbmdsZXMKKyAgICAgICAgLy8gYnkgdGFuZ2VudHMKICAgICAgICAgZG91YmxlIGExID0gLU1hdGguYXRhbjIocDEuZ2V0WSgpIC0gcDIuZ2V0WSgpLCBwMS5nZXRYKCkgLSBwMi5nZXRYKCkpOwogICAgICAgICBkb3VibGUgYTIgPSAtTWF0aC5hdGFuMihwMy5nZXRZKCkgLSBwMi5nZXRZKCksIHAzLmdldFgoKSAtIHAyLmdldFgoKSk7CiAgICAgICAgIGRvdWJsZSBhbSA9IChhMSArIGEyKSAvIDIuMDsKQEAgLTgyMSwxMCArOTUwLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIG5ldyBzdGFydCBhbmdsZSB0byBiZSB0aGUgYW5nbGUgZ2l2ZW4gYnkgdGhlIHRoZSB2ZWN0b3IgCi0gICAgICogZnJvbSB0aGUgY3VycmVudCBjZW50ZXIgcG9pbnQgdG8gdGhlIHNwZWNpZmllZCBwb2ludC4KKyAgICAgKiBTZXRzIGEgbmV3IHN0YXJ0IGFuZ2xlIHRvIGJlIHRoZSBhbmdsZSBnaXZlbiBieSB0aGUgdGhlIHZlY3RvciBmcm9tIHRoZQorICAgICAqIGN1cnJlbnQgY2VudGVyIHBvaW50IHRvIHRoZSBzcGVjaWZpZWQgcG9pbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBvaW50IHRoZSBwb2ludCB0aGF0IGRldGVybWluZXMgdGhlIG5ldyBzdGFydCBhbmdsZS4KKyAgICAgKiBAcGFyYW0gcG9pbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2ludCB0aGF0IGRldGVybWluZXMgdGhlIG5ldyBzdGFydCBhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRBbmdsZVN0YXJ0KFBvaW50MkQgcG9pbnQpIHsKICAgICAgICAgZG91YmxlIGFuZ2xlID0gTWF0aC5hdGFuMihwb2ludC5nZXRZKCkgLSBnZXRDZW50ZXJZKCksIHBvaW50LmdldFgoKSAtIGdldENlbnRlclgoKSk7CkBAIC04MzIsMjAgKzk2MiwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFuZ2xlcyBpbiB0ZXJtcyBvZiB2ZWN0b3JzIGZyb20gdGhlIGN1cnJlbnQgYXJjIGNlbnRlciAKLSAgICAgKiB0byB0aGUgcG9pbnRzICh4MSwgeTEpIGFuZCAoeDIsIHkyKS4gVGhlIHN0YXJ0IGFuZ2xlIGlzIGdpdmVuIAotICAgICAqIGJ5IHRoZSB2ZWN0b3IgZnJvbSB0aGUgY3VycmVudCBjZW50ZXIgdG8gdGhlIHBvaW50ICh4MSwgeTEpIGFuZAotICAgICAqIHRoZSBlbmQgYW5nbGUgaXMgZ2l2ZW4gYnkgdGhlIHZlY3RvciBmcm9tIHRoZSBjZW50ZXIgdG8gdGhlIHBvaW50Ci0gICAgICogKHgyLCB5MikuCisgICAgICogU2V0cyB0aGUgYW5nbGVzIGluIHRlcm1zIG9mIHZlY3RvcnMgZnJvbSB0aGUgY3VycmVudCBhcmMgY2VudGVyIHRvIHRoZQorICAgICAqIHBvaW50cyAoeDEsIHkxKSBhbmQgKHgyLCB5MikuIFRoZSBzdGFydCBhbmdsZSBpcyBnaXZlbiBieSB0aGUgdmVjdG9yIGZyb20KKyAgICAgKiB0aGUgY3VycmVudCBjZW50ZXIgdG8gdGhlIHBvaW50ICh4MSwgeTEpIGFuZCB0aGUgZW5kIGFuZ2xlIGlzIGdpdmVuIGJ5CisgICAgICogdGhlIHZlY3RvciBmcm9tIHRoZSBjZW50ZXIgdG8gdGhlIHBvaW50ICh4MiwgeTIpLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB3aG9zZSB2ZWN0b3IgZnJvbSB0aGUgY2VudGVyCi0gICAgICogcG9pbnQgZGV0ZXJtaW5lcyB0aGUgbmV3IHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMuCi0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHdob3NlIHZlY3RvciBmcm9tIHRoZSBjZW50ZXIKLSAgICAgKiBwb2ludCBkZXRlcm1pbmVzIHRoZSBuZXcgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYy4KLSAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgd2hvc2UgdmVjdG9yIGZyb20gdGhlIGNlbnRlcgotICAgICAqIHBvaW50IGRldGVybWluZXMgdGhlIG5ldyBlbmQgYW5nbGUgb2YgdGhlIGFyYy4KLSAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgd2hvc2UgdmVjdG9yIGZyb20gdGhlIGNlbnRlcgotICAgICAqIHBvaW50IGRldGVybWluZXMgdGhlIG5ldyBlbmQgYW5nbGUgb2YgdGhlIGFyYy4KKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHdob3NlIHZlY3RvciBmcm9tIHRoZSBjZW50ZXIKKyAgICAgKiAgICAgICAgICAgIHBvaW50IGRldGVybWluZXMgdGhlIG5ldyBzdGFydCBhbmdsZSBvZiB0aGUgYXJjLgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgd2hvc2UgdmVjdG9yIGZyb20gdGhlIGNlbnRlcgorICAgICAqICAgICAgICAgICAgcG9pbnQgZGV0ZXJtaW5lcyB0aGUgbmV3IHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB3aG9zZSB2ZWN0b3IgZnJvbSB0aGUgY2VudGVyCisgICAgICogICAgICAgICAgICBwb2ludCBkZXRlcm1pbmVzIHRoZSBuZXcgZW5kIGFuZ2xlIG9mIHRoZSBhcmMuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB3aG9zZSB2ZWN0b3IgZnJvbSB0aGUgY2VudGVyCisgICAgICogICAgICAgICAgICBwb2ludCBkZXRlcm1pbmVzIHRoZSBuZXcgZW5kIGFuZ2xlIG9mIHRoZSBhcmMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0QW5nbGVzKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MikgewogICAgICAgICBkb3VibGUgY3ggPSBnZXRDZW50ZXJYKCk7CkBAIC04NjEsMjkgKzk5NCwzMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFuZ2xlcyBpbiB0ZXJtcyBvZiB2ZWN0b3JzIGZyb20gdGhlIGN1cnJlbnQgYXJjIGNlbnRlciAKLSAgICAgKiB0byB0aGUgcG9pbnRzIHAxIGFuZCBwMi4gVGhlIHN0YXJ0IGFuZ2xlIGlzIGdpdmVuIAotICAgICAqIGJ5IHRoZSB2ZWN0b3IgZnJvbSB0aGUgY3VycmVudCBjZW50ZXIgdG8gdGhlIHBvaW50IHAxIGFuZAotICAgICAqIHRoZSBlbmQgYW5nbGUgaXMgZ2l2ZW4gYnkgdGhlIHZlY3RvciBmcm9tIHRoZSBjZW50ZXIgdG8gdGhlIHBvaW50Ci0gICAgICogcDIuCisgICAgICogU2V0cyB0aGUgYW5nbGVzIGluIHRlcm1zIG9mIHZlY3RvcnMgZnJvbSB0aGUgY3VycmVudCBhcmMgY2VudGVyIHRvIHRoZQorICAgICAqIHBvaW50cyBwMSBhbmQgcDIuIFRoZSBzdGFydCBhbmdsZSBpcyBnaXZlbiBieSB0aGUgdmVjdG9yIGZyb20gdGhlIGN1cnJlbnQKKyAgICAgKiBjZW50ZXIgdG8gdGhlIHBvaW50IHAxIGFuZCB0aGUgZW5kIGFuZ2xlIGlzIGdpdmVuIGJ5IHRoZSB2ZWN0b3IgZnJvbSB0aGUKKyAgICAgKiBjZW50ZXIgdG8gdGhlIHBvaW50IHAyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwMSB0aGUgcG9pbnQgd2hvc2UgdmVjdG9yIGZyb20gdGhlIGNlbnRlcgotICAgICAqIHBvaW50IGRldGVybWluZXMgdGhlIG5ldyBzdGFydCBhbmdsZSBvZiB0aGUgYXJjLgotICAgICAqIEBwYXJhbSBwMiB0aGUgcG9pbnQgd2hvc2UgdmVjdG9yIGZyb20gdGhlIGNlbnRlcgotICAgICAqIHBvaW50IGRldGVybWluZXMgdGhlIG5ldyBlbmQgYW5nbGUgb2YgdGhlIGFyYy4KKyAgICAgKiBAcGFyYW0gcDEKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2ludCB3aG9zZSB2ZWN0b3IgZnJvbSB0aGUgY2VudGVyIHBvaW50IGRldGVybWluZXMgdGhlCisgICAgICogICAgICAgICAgICBuZXcgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYy4KKyAgICAgKiBAcGFyYW0gcDIKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2ludCB3aG9zZSB2ZWN0b3IgZnJvbSB0aGUgY2VudGVyIHBvaW50IGRldGVybWluZXMgdGhlCisgICAgICogICAgICAgICAgICBuZXcgZW5kIGFuZ2xlIG9mIHRoZSBhcmMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0QW5nbGVzKFBvaW50MkQgcDEsIFBvaW50MkQgcDIpIHsKICAgICAgICAgc2V0QW5nbGVzKHAxLmdldFgoKSwgcDEuZ2V0WSgpLCBwMi5nZXRYKCksIHAyLmdldFkoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTm9ybWFsaXplcyB0aGUgYW5nbGUgYnkgcmVtb3ZpbmcgZXh0cmEgd2luZGluZyAocGFzdCAzNjAgZGVncmVlcykKLSAgICAgKiBhbmQgcGxhY2luZyBpdCBpbiB0aGUgcG9zaXRpdmUgZGVncmVlIHJhbmdlLgorICAgICAqIE5vcm1hbGl6ZXMgdGhlIGFuZ2xlIGJ5IHJlbW92aW5nIGV4dHJhIHdpbmRpbmcgKHBhc3QgMzYwIGRlZ3JlZXMpIGFuZAorICAgICAqIHBsYWNpbmcgaXQgaW4gdGhlIHBvc2l0aXZlIGRlZ3JlZSByYW5nZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYW5nbGUgLSB0aGUgc291cmNlIGFuZ2xlIGluIGRlZ3JlZXMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFuZ2xlIGJldHdlZW4gMCBhbmQgMzYwIGRlZ3JlZXMgd2hpY2ggY29ycmVzcG9uZHMKLSAgICAgKiB0byB0aGUgc2FtZSBkaXJlY3Rpb24gdmVjdG9yIGFzIHRoZSBzb3VyY2UgYW5nbGUuCisgICAgICogQHBhcmFtIGFuZ2xlCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGFuZ2xlIGluIGRlZ3JlZXMuCisgICAgICogQHJldHVybiBhbiBhbmdsZSBiZXR3ZWVuIDAgYW5kIDM2MCBkZWdyZWVzIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBzYW1lCisgICAgICogICAgICAgICBkaXJlY3Rpb24gdmVjdG9yIGFzIHRoZSBzb3VyY2UgYW5nbGUuCiAgICAgICovCiAgICAgZG91YmxlIGdldE5vcm1BbmdsZShkb3VibGUgYW5nbGUpIHsKICAgICAgICAgZG91YmxlIG4gPSBNYXRoLmZsb29yKGFuZ2xlIC8gMzYwLjApOwpAQCAtODkzLDEwICsxMDI3LDEwIEBACiAgICAgLyoqCiAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBhbmdsZSBpcyBjb250YWluZWQgaW4gdGhlIHNwYW4gb2YgdGhlIGFyYy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYW5nbGUgdGhlIGFuZ2xlIHRvIHRlc3QgaW4gZGVncmVlcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBnaXZlbiBhbmdsZSBpcyBiZXR3ZWVuIHRoZSBzdGFydCBhbmdsZSBhbmQgCi0gICAgICogdGhlIGVuZCBhbmdsZSBvZiB0aGUgYXJjLgorICAgICAqIEBwYXJhbSBhbmdsZQorICAgICAqICAgICAgICAgICAgdGhlIGFuZ2xlIHRvIHRlc3QgaW4gZGVncmVlcy4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBnaXZlbiBhbmdsZSBpcyBiZXR3ZWVuIHRoZSBzdGFydCBhbmdsZSBhbmQgdGhlIGVuZAorICAgICAqICAgICAgICAgYW5nbGUgb2YgdGhlIGFyYy4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FuZ2xlKGRvdWJsZSBhbmdsZSkgewogICAgICAgICBkb3VibGUgZXh0ZW50ID0gZ2V0QW5nbGVFeHRlbnQoKTsKQEAgLTkxMiw4ICsxMDQ2LDcgQEAKICAgICAgICAgaWYgKGEyIDwgMC4wKSB7CiAgICAgICAgICAgICByZXR1cm4gYW5nbGUgPj0gYTIgKyAzNjAuMCB8fCBhbmdsZSA8PSBhMTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZXh0ZW50ID4gMC4wID8gYTEgPD0gYW5nbGUgJiYgYW5nbGUgPD0gYTIgOiBhMiA8PSBhbmdsZQotICAgICAgICAgICAgICAgICYmIGFuZ2xlIDw9IGExOworICAgICAgICByZXR1cm4gZXh0ZW50ID4gMC4wID8gYTEgPD0gYW5nbGUgJiYgYW5nbGUgPD0gYTIgOiBhMiA8PSBhbmdsZSAmJiBhbmdsZSA8PSBhMTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhkb3VibGUgcHgsIGRvdWJsZSBweSkgewpAQCAtOTMxLDggKzEwNjQsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICBib29sZWFuIGNvbnRhaW5zQW5nbGUgPSBjb250YWluc0FuZ2xlKE1hdGgudG9EZWdyZWVzKC1NYXRoCi0gICAgICAgICAgICAgICAgLmF0YW4yKG55LCBueCkpKTsKKyAgICAgICAgYm9vbGVhbiBjb250YWluc0FuZ2xlID0gY29udGFpbnNBbmdsZShNYXRoLnRvRGVncmVlcygtTWF0aC5hdGFuMihueSwgbngpKSk7CiAgICAgICAgIGlmICh0eXBlID09IFBJRSkgewogICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zQW5nbGU7CiAgICAgICAgIH0KQEAgLTk0MywxNCArMTA3NSwxMyBAQAogICAgICAgICBMaW5lMkQgbCA9IG5ldyBMaW5lMkQuRG91YmxlKGdldFN0YXJ0UG9pbnQoKSwgZ2V0RW5kUG9pbnQoKSk7CiAgICAgICAgIGludCBjY3cxID0gbC5yZWxhdGl2ZUNDVyhweCwgcHkpOwogICAgICAgICBpbnQgY2N3MiA9IGwucmVsYXRpdmVDQ1coZ2V0Q2VudGVyWCgpLCBnZXRDZW50ZXJZKCkpOwotICAgICAgICByZXR1cm4gY2N3MSA9PSAwIHx8IGNjdzIgPT0gMAotICAgICAgICAgICAgICAgIHx8ICgoY2N3MSArIGNjdzIpID09IDAgXiBhYnNFeHRlbnQgPiAxODAuMCk7CisgICAgICAgIHJldHVybiBjY3cxID09IDAgfHwgY2N3MiA9PSAwIHx8ICgoY2N3MSArIGNjdzIpID09IDAgXiBhYnNFeHRlbnQgPiAxODAuMCk7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoZG91YmxlIHJ4LCBkb3VibGUgcnksIGRvdWJsZSBydywgZG91YmxlIHJoKSB7CiAKLSAgICAgICAgaWYgKCEoY29udGFpbnMocngsIHJ5KSAmJiBjb250YWlucyhyeCArIHJ3LCByeSkKLSAgICAgICAgICAgICAgICAmJiBjb250YWlucyhyeCArIHJ3LCByeSArIHJoKSAmJiBjb250YWlucyhyeCwgcnkgKyByaCkpKSB7CisgICAgICAgIGlmICghKGNvbnRhaW5zKHJ4LCByeSkgJiYgY29udGFpbnMocnggKyBydywgcnkpICYmIGNvbnRhaW5zKHJ4ICsgcncsIHJ5ICsgcmgpICYmIGNvbnRhaW5zKAorICAgICAgICAgICAgICAgIHJ4LCByeSArIHJoKSkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCkBAIC0xMDAzLDkgKzExMzQsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKHR5cGUgPT0gUElFKSB7Ci0gICAgICAgICAgICBpZiAoci5pbnRlcnNlY3RzTGluZShwMS5nZXRYKCksIHAxLmdldFkoKSwgY3gsIGN5KSB8fAotICAgICAgICAgICAgICAgIHIuaW50ZXJzZWN0c0xpbmUocDIuZ2V0WCgpLCBwMi5nZXRZKCksIGN4LCBjeSkpCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoci5pbnRlcnNlY3RzTGluZShwMS5nZXRYKCksIHAxLmdldFkoKSwgY3gsIGN5KQorICAgICAgICAgICAgICAgICAgICB8fCByLmludGVyc2VjdHNMaW5lKHAyLmdldFgoKSwgcDIuZ2V0WSgpLCBjeCwgY3kpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CkBAIC0xMDI1LDQgKzExNTUsMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZ2VvbS9BcmVhLmphdmEgYi9hd3QvamF2YS9hd3QvZ2VvbS9BcmVhLmphdmEKaW5kZXggYmMyN2Q0ZS4uZTY2MTllMyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2dlb20vQXJlYS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9nZW9tL0FyZWEuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBEZW5pcyBNLiBLaXNoZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZ2VvbTsKIAogaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKQEAgLTI3LDEzICsyOCwxOCBAQAogaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbjsKIAogLyoqCiAgKiBUaGUgQ2xhc3MgQXJlYSBwcm92aWRlcyBhIG1pbmltYWwgaW1wbGVtZW50YXRpb24gZm9yIGEgZ2VuZXJpYyBzaGFwZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBBcmVhIGltcGxlbWVudHMgU2hhcGUsIENsb25lYWJsZSB7CiAKLSAgICAvKiogVGhlIHNvdXJjZSBTaGFwZSBvYmplY3QuICovCisgICAgLyoqCisgICAgICogVGhlIHNvdXJjZSBTaGFwZSBvYmplY3QuCisgICAgICovCiAgICAgU2hhcGUgczsKIAogICAgIC8qKgpAQCAtODAsNyArODYsOCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBhcmVhIHdpdGggZGF0YSBnaXZlbiBieSB0aGUgc3BlY2lmaWVkIHNoYXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSBzaGFwZSB0aGF0IGdpdmVzIHRoZSBkYXRhIGZvciB0aGlzIEFyZWEKKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIHNoYXBlIHRoYXQgZ2l2ZXMgdGhlIGRhdGEgZm9yIHRoaXMgQXJlYS4KICAgICAgKi8KICAgICBwdWJsaWMgQXJlYShTaGFwZSBzKSB7CiAgICAgICAgIGlmIChzID09IG51bGwpIHsKQEAgLTExNCwxMSArMTIxLDExIEBACiAgICAgLyoqCiAgICAgICogVGVzdHMgd2hldGhlciB0aGUgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgQXJlYS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gY29tcGFyZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bAotICAgICAqIAotICAgICAqIEB0aHJvd3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb21wYXJlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bC4KKyAgICAgKiBAdGhyb3dzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhBcmVhIG9iaikgdGhyb3dzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKQEAgLTE0MCw3ICsxNDcsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRCb3VuZHMyRCgpIHsKLSAgICAgICAgcmV0dXJuIHMgPT0gbnVsbCA/IG5ldyBSZWN0YW5nbGUyRC5Eb3VibGUoKTogcy5nZXRCb3VuZHMyRCgpOworICAgICAgICByZXR1cm4gcyA9PSBudWxsID8gbmV3IFJlY3RhbmdsZTJELkRvdWJsZSgpIDogcy5nZXRCb3VuZHMyRCgpOwogICAgIH0KIAogICAgIHB1YmxpYyBQYXRoSXRlcmF0b3IgZ2V0UGF0aEl0ZXJhdG9yKEFmZmluZVRyYW5zZm9ybSB0KSB7CkBAIC0xNTQsMzIgKzE2MSwzNCBAQAogICAgIC8qKgogICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBhcmVhIHRvIHRoaXMgYXJlYS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXJlYSB0aGUgYXJlYSB0byBhZGQgdG8gdGhpcyBhcmVhCi0gICAgICogCi0gICAgICogQHRocm93cyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQKKyAgICAgKiBAcGFyYW0gYXJlYQorICAgICAqICAgICAgICAgICAgdGhlIGFyZWEgdG8gYWRkIHRvIHRoaXMgYXJlYS4KKyAgICAgKiBAdGhyb3dzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZChBcmVhIGFyZWEpIHRocm93cyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGVyZm9ybXMgYW4gZXhjbHVzaXZlIG9yIG9wZXJhdGlvbiBiZXR3ZWVuIHRoaXMgc2hhcGUgYW5kIHRoZQotICAgICAqIHNwZWNpZmllZCBzaGFwZS4KKyAgICAgKiBQZXJmb3JtcyBhbiBleGNsdXNpdmUgb3Igb3BlcmF0aW9uIGJldHdlZW4gdGhpcyBzaGFwZSBhbmQgdGhlIHNwZWNpZmllZAorICAgICAqIHNoYXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhcmVhIHRoZSBhcmVhIHRvIFhPUiBhZ2FpbnN0IHRoaXMgYXJlYQotICAgICAqIAotICAgICAqIEB0aHJvd3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkCisgICAgICogQHBhcmFtIGFyZWEKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcmVhIHRvIFhPUiBhZ2FpbnN0IHRoaXMgYXJlYS4KKyAgICAgKiBAdGhyb3dzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4Y2x1c2l2ZU9yKEFyZWEgYXJlYSkgdGhyb3dzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFeHRyYWN0cyBhIFJlY3RhbmdsZTJEIGZyb20gdGhlIHNvdXJjZSBzaGFwZSBpZiB0aGUgdW5kZXJseWluZyBzaGFwZQotICAgICAqIGRhdGEgZGVzY3JpYmVzIGEgcmVjdGFuZ2xlLgorICAgICAqIEV4dHJhY3RzIGEgUmVjdGFuZ2xlMkQgZnJvbSB0aGUgc291cmNlIHNoYXBlIGlmIHRoZSB1bmRlcmx5aW5nIHNoYXBlIGRhdGEKKyAgICAgKiBkZXNjcmliZXMgYSByZWN0YW5nbGUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIFJlY3RhbmdsZTJEIG9iamVjdCBpZiB0aGUgc291cmNlIHNoYXBlIGlzIHJlY3RhbmdsZSwgCi0gICAgICogb3IgbnVsbCBpZiBzaGFwZSBpcyBlbXB0eSBvciBub3QgcmVjdGFuZ2xlLgorICAgICAqIEByZXR1cm4gYSBSZWN0YW5nbGUyRCBvYmplY3QgaWYgdGhlIHNvdXJjZSBzaGFwZSBpcyByZWN0YW5nbGUsIG9yIG51bGwgaWYKKyAgICAgKiAgICAgICAgIHNoYXBlIGlzIGVtcHR5IG9yIG5vdCByZWN0YW5nbGUuCiAgICAgICovCiAgICAgUmVjdGFuZ2xlMkQgZXh0cmFjdFJlY3RhbmdsZSgpIHsKICAgICAgICAgaWYgKHMgPT0gbnVsbCkgewpAQCAtMTg5LDcgKzE5OCw3IEBACiAgICAgICAgIGludCBjb3VudCA9IDA7CiAgICAgICAgIFBhdGhJdGVyYXRvciBwID0gcy5nZXRQYXRoSXRlcmF0b3IobnVsbCk7CiAgICAgICAgIGZsb2F0W10gY29vcmRzID0gbmV3IGZsb2F0WzZdOwotICAgICAgICB3aGlsZSghcC5pc0RvbmUoKSkgeworICAgICAgICB3aGlsZSAoIXAuaXNEb25lKCkpIHsKICAgICAgICAgICAgIGludCB0eXBlID0gcC5jdXJyZW50U2VnbWVudChjb29yZHMpOwogICAgICAgICAgICAgaWYgKGNvdW50ID4gMTIgfHwgdHlwZSA9PSBQYXRoSXRlcmF0b3IuU0VHX1FVQURUTyB8fCB0eXBlID09IFBhdGhJdGVyYXRvci5TRUdfQ1VCSUNUTykgewogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMTk4LDIxICsyMDcsMjIgQEAKICAgICAgICAgICAgIHBvaW50c1tjb3VudCsrXSA9IGNvb3Jkc1sxXTsKICAgICAgICAgICAgIHAubmV4dCgpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwb2ludHNbMF0gPT0gcG9pbnRzWzZdICYmIHBvaW50c1s2XSA9PSBwb2ludHNbOF0gJiYgcG9pbnRzWzJdID09IHBvaW50c1s0XSAmJgotICAgICAgICAgICAgcG9pbnRzWzFdID09IHBvaW50c1szXSAmJiBwb2ludHNbM10gPT0gcG9pbnRzWzldICYmIHBvaW50c1s1XSA9PSBwb2ludHNbN10pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlMkQuRmxvYXQocG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSAtIHBvaW50c1swXSwgcG9pbnRzWzddIC0gcG9pbnRzWzFdKTsKKyAgICAgICAgaWYgKHBvaW50c1swXSA9PSBwb2ludHNbNl0gJiYgcG9pbnRzWzZdID09IHBvaW50c1s4XSAmJiBwb2ludHNbMl0gPT0gcG9pbnRzWzRdCisgICAgICAgICAgICAgICAgJiYgcG9pbnRzWzFdID09IHBvaW50c1szXSAmJiBwb2ludHNbM10gPT0gcG9pbnRzWzldICYmIHBvaW50c1s1XSA9PSBwb2ludHNbN10pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlMkQuRmxvYXQocG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSAtIHBvaW50c1swXSwgcG9pbnRzWzddCisgICAgICAgICAgICAgICAgICAgIC0gcG9pbnRzWzFdKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBSZWR1Y2VzIHRoZSBzaXplIG9mIHRoaXMgQXJlYSBieSBpbnRlcnNlY3RpbmcgaXQgd2l0aCB0aGUgCi0gICAgICogc3BlY2lmaWVkIEFyZWEgaWYgdGhleSBhcmUgYm90aCByZWN0YW5nbGVzLgorICAgICAqIFJlZHVjZXMgdGhlIHNpemUgb2YgdGhpcyBBcmVhIGJ5IGludGVyc2VjdGluZyBpdCB3aXRoIHRoZSBzcGVjaWZpZWQgQXJlYQorICAgICAqIGlmIHRoZXkgYXJlIGJvdGggcmVjdGFuZ2xlcy4KICAgICAgKiAKLSAgICAgKiBAc2VlIGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQjaW50ZXJzZWN0KFJlY3RhbmdsZTJELCBSZWN0YW5nbGUyRCwgUmVjdGFuZ2xlMkQpCi0gICAgICogCi0gICAgICogQHBhcmFtIGFyZWEgdGhlIGFyZWEKKyAgICAgKiBAc2VlIGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQjaW50ZXJzZWN0KFJlY3RhbmdsZTJELCBSZWN0YW5nbGUyRCwKKyAgICAgKiAgICAgIFJlY3RhbmdsZTJEKQorICAgICAqIEBwYXJhbSBhcmVhCisgICAgICogICAgICAgICAgICB0aGUgYXJlYS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBpbnRlcnNlY3QoQXJlYSBhcmVhKSB7CiAgICAgICAgIFJlY3RhbmdsZTJEIHNyYzEgPSBleHRyYWN0UmVjdGFuZ2xlKCk7CkBAIC0yMjUsOSArMjM1LDEwIEBACiAgICAgLyoqCiAgICAgICogU3VidHJhY3QgdGhlIHNwZWNpZmllZCBhcmVhIGZyb20gdGhpcyBhcmVhLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhcmVhIHRoZSBhcmVhIHRvIHN1YnRyYWN0Ci0gICAgICogCi0gICAgICogQHRocm93cyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQKKyAgICAgKiBAcGFyYW0gYXJlYQorICAgICAqICAgICAgICAgICAgdGhlIGFyZWEgdG8gc3VidHJhY3QuCisgICAgICogQHRocm93cyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzdWJ0cmFjdChBcmVhIGFyZWEpIHRocm93cyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCkBAIC0yMzYsOSArMjQ3LDkgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhpcyBBcmVhIGlzIGVtcHR5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBBcmVhIGlzIGVtcHR5Ci0gICAgICogCi0gICAgICogQHRocm93cyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgQXJlYSBpcyBlbXB0eS4KKyAgICAgKiBAdGhyb3dzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB0aHJvd3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJApAQCAtMjQ3LDkgKzI1OCw5IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoaXMgQXJlYSBpcyBwb2x5Z29uYWwuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIEFyZWEgaXMgcG9seWdvbmFsCi0gICAgICogCi0gICAgICogQHRocm93cyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgQXJlYSBpcyBwb2x5Z29uYWwuCisgICAgICogQHRocm93cyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1BvbHlnb25hbCgpIHRocm93cyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCkBAIC0yNTgsOSArMjY5LDkgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhpcyBBcmVhIGlzIHJlY3Rhbmd1bGFyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBBcmVhIGlzIHJlY3Rhbmd1bGFyCi0gICAgICogCi0gICAgICogQHRocm93cyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgQXJlYSBpcyByZWN0YW5ndWxhci4KKyAgICAgKiBAdGhyb3dzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzUmVjdGFuZ3VsYXIoKSB0aHJvd3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJApAQCAtMjY5LDkgKzI4MCw5IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoaXMgQXJlYSBpcyBzaW5ndWxhci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgQXJlYSBpcyBzaW5ndWxhcgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIEFyZWEgaXMgc2luZ3VsYXIuCisgICAgICogQHRocm93cyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1Npbmd1bGFyKCkgdGhyb3dzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKQEAgLTI4MCwzMCArMjkxLDMyIEBACiAgICAgLyoqCiAgICAgICogUmVzZXRzIHRoZSBkYXRhIG9mIHRoaXMgQXJlYS4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZAorICAgICAqIEB0aHJvd3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRyYW5zZm9ybXMgdGhlIGRhdGEgb2YgdGhpcyBBcmVhIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIAorICAgICAqIFRyYW5zZm9ybXMgdGhlIGRhdGEgb2YgdGhpcyBBcmVhIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCiAgICAgICogQWZmaW5lVHJhbnNmb3JtLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0IHRoZSB0cmFuc2Zvcm0gdG8gdXNlIHRvIHRyYW5zZm9ybSB0aGUgZGF0YQorICAgICAqIEBwYXJhbSB0CisgICAgICogICAgICAgICAgICB0aGUgdHJhbnNmb3JtIHRvIHVzZSB0byB0cmFuc2Zvcm0gdGhlIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdHJhbnNmb3JtKEFmZmluZVRyYW5zZm9ybSB0KSB7CiAgICAgICAgIHMgPSB0LmNyZWF0ZVRyYW5zZm9ybWVkU2hhcGUocyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBBcmVhIHRoYXQgaXMgdGhlIHJlc3VsdCBvZiB0cmFuc2Zvcm1pbmcgdGhlIGRhdGEgCi0gICAgICogb2YgdGhpcyBBcmVhIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIEFmZmluZVRyYW5zZm9ybS4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IEFyZWEgdGhhdCBpcyB0aGUgcmVzdWx0IG9mIHRyYW5zZm9ybWluZyB0aGUgZGF0YSBvZiB0aGlzCisgICAgICogQXJlYSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHQgdGhlIHRyYW5zZm9ybSB0byB1c2UgdG8gdHJhbnNmb3JtIHRoZSBkYXRhCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IEFyZWEgdGhhdCBpcyB0aGUgcmVzdWx0IG9mIHRyYW5zZm9ybWluZyB0aGUgZGF0YSAKLSAgICAgKiBvZiB0aGlzIEFyZWEgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgQWZmaW5lVHJhbnNmb3JtLgorICAgICAqIEBwYXJhbSB0CisgICAgICogICAgICAgICAgICB0aGUgdHJhbnNmb3JtIHRvIHVzZSB0byB0cmFuc2Zvcm0gdGhlIGRhdGEuCisgICAgICogQHJldHVybiB0aGUgbmV3IEFyZWEgdGhhdCBpcyB0aGUgcmVzdWx0IG9mIHRyYW5zZm9ybWluZyB0aGUgZGF0YSBvZiB0aGlzCisgICAgICogICAgICAgICBBcmVhIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIEFmZmluZVRyYW5zZm9ybS4KICAgICAgKi8KICAgICBwdWJsaWMgQXJlYSBjcmVhdGVUcmFuc2Zvcm1lZEFyZWEoQWZmaW5lVHJhbnNmb3JtIHQpIHsKICAgICAgICAgcmV0dXJuIHMgPT0gbnVsbCA/IG5ldyBBcmVhKCkgOiBuZXcgQXJlYSh0LmNyZWF0ZVRyYW5zZm9ybWVkU2hhcGUocykpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2dlb20vQ3ViaWNDdXJ2ZTJELmphdmEgYi9hd3QvamF2YS9hd3QvZ2VvbS9DdWJpY0N1cnZlMkQuamF2YQppbmRleCAzZTQ0MGM4Li4xZGRlZGYzIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZ2VvbS9DdWJpY0N1cnZlMkQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZ2VvbS9DdWJpY0N1cnZlMkQuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBEZW5pcyBNLiBLaXNoZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZ2VvbTsKIAogaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKQEAgLTI4LDQ5ICsyOSw2OSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBDbGFzcyBDdWJpY0N1cnZlMkQgaXMgYSBTaGFwZSB0aGF0IHJlcHJlc2VudHMgYSBzZWdtZW50IG9mIGEgCi0gKiBxdWFkcmF0aWMgKEJlemllcikgY3VydmUuIFRoZSBjdXJ2ZWQgc2VnbWVudCBpcyBkZXRlcm1pbmVkIGJ5IGZvdXIgcG9pbnRzOgotICogYSBzdGFydCBwb2ludCwgYW4gZW5kIHBvaW50LCBhbmQgdHdvIGNvbnRyb2wgcG9pbnRzLiAKLSAqIFRoZSBjb250cm9sIHBvaW50cyBnaXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YW5nZW50IGFuZCBuZXh0IAotICogZGVyaXZhdGl2ZSBhdCB0aGUgZW5kcG9pbnRzIGFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQgdGhlb3J5IG9mIAotICogQmV6aWVyIGN1cnZlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gQmV6aWVyIGN1cnZlcywgCi0gKiBzZWUgPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CJUMzJUE5emllcl9jdXJ2ZSI+dGhpcyBhcnRpY2xlPC9hPi4KKyAqIFRoZSBDbGFzcyBDdWJpY0N1cnZlMkQgaXMgYSBTaGFwZSB0aGF0IHJlcHJlc2VudHMgYSBzZWdtZW50IG9mIGEgcXVhZHJhdGljCisgKiAoQmV6aWVyKSBjdXJ2ZS4gVGhlIGN1cnZlZCBzZWdtZW50IGlzIGRldGVybWluZWQgYnkgZm91ciBwb2ludHM6IGEgc3RhcnQKKyAqIHBvaW50LCBhbiBlbmQgcG9pbnQsIGFuZCB0d28gY29udHJvbCBwb2ludHMuIFRoZSBjb250cm9sIHBvaW50cyBnaXZlCisgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFuZ2VudCBhbmQgbmV4dCBkZXJpdmF0aXZlIGF0IHRoZSBlbmRwb2ludHMgYWNjb3JkaW5nCisgKiB0byB0aGUgc3RhbmRhcmQgdGhlb3J5IG9mIEJlemllciBjdXJ2ZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIEJlemllcgorICogY3VydmVzLCBzZWUgPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CJUMzJUE5emllcl9jdXJ2ZSI+dGhpcworICogYXJ0aWNsZTwvYT4uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ3ViaWNDdXJ2ZTJEIGltcGxlbWVudHMgU2hhcGUsIENsb25lYWJsZSB7CiAKICAgICAvKioKLSAgICAgKiBUaGUgQ2xhc3MgRmxvYXQgaXMgdGhlIHN1YmNsYXNzIG9mIEN1YmljQ3VydmUyRCB0aGF0IGhhcyBhbGwgCi0gICAgICogb2YgaXRzIGRhdGEgdmFsdWVzIHN0b3JlZCB3aXRoIGZsb2F0LWxldmVsIHByZWNpc2lvbi4KKyAgICAgKiBUaGUgQ2xhc3MgRmxvYXQgaXMgdGhlIHN1YmNsYXNzIG9mIEN1YmljQ3VydmUyRCB0aGF0IGhhcyBhbGwgb2YgaXRzIGRhdGEKKyAgICAgKiB2YWx1ZXMgc3RvcmVkIHdpdGggZmxvYXQtbGV2ZWwgcHJlY2lzaW9uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmxvYXQgZXh0ZW5kcyBDdWJpY0N1cnZlMkQgewogCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IHgxOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB5MTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IGN0cmx4MTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IGN0cmx5MTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgY3RybHgyOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCBjdHJseTI7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeDI7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeTI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBmbG9hdC12YWx1ZWQgQ3ViaWNDdXJ2ZTJEIHdpdGggYWxsIGNvb3JkaW5hdGUgdmFsdWVzCi0gICAgICAgICAqIHNldCB0byB6ZXJvLgorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxvYXQtdmFsdWVkIEN1YmljQ3VydmUyRCB3aXRoIGFsbCBjb29yZGluYXRlCisgICAgICAgICAqIHZhbHVlcyBzZXQgdG8gemVyby4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBGbG9hdCgpIHsKICAgICAgICAgfQpAQCAtNzksMTYgKzEwMCwyNSBAQAogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxvYXQtdmFsdWVkIEN1YmljQ3VydmUyRCB3aXRoIHRoZSBzcGVjaWZpZWQKICAgICAgICAgICogY29vcmRpbmF0ZSB2YWx1ZXMuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0geDEgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSBjdHJseDEgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAgICAgKiBAcGFyYW0gY3RybHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIGN0cmx4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludAotICAgICAgICAgKiBAcGFyYW0gY3RybHkyIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSB4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIHkyIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludAorICAgICAgICAgKiBAcGFyYW0geDEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIHkxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSBjdHJseDEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0gY3RybHkxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIGN0cmx4MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0gY3RybHkyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSB4MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIHkyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEZsb2F0KGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgY3RybHgxLCBmbG9hdCBjdHJseTEsIGZsb2F0IGN0cmx4MiwgZmxvYXQgY3RybHkyLCBmbG9hdCB4MiwgZmxvYXQgeTIpIHsKKyAgICAgICAgcHVibGljIEZsb2F0KGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgY3RybHgxLCBmbG9hdCBjdHJseTEsIGZsb2F0IGN0cmx4MiwgZmxvYXQgY3RybHkyLAorICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MikgewogICAgICAgICAgICAgc2V0Q3VydmUoeDEsIHkxLCBjdHJseDEsIGN0cmx5MSwgY3RybHgyLCBjdHJseTIsIHgyLCB5Mik7CiAgICAgICAgIH0KIApAQCAtMTUzLDkgKzE4Myw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q3VydmUoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSBjdHJseDEsIGRvdWJsZSBjdHJseTEsCi0gICAgICAgICAgICAgICAgZG91YmxlIGN0cmx4MiwgZG91YmxlIGN0cmx5MiwgZG91YmxlIHgyLCBkb3VibGUgeTIpCi0gICAgICAgIHsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q3VydmUoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSBjdHJseDEsIGRvdWJsZSBjdHJseTEsIGRvdWJsZSBjdHJseDIsCisgICAgICAgICAgICAgICAgZG91YmxlIGN0cmx5MiwgZG91YmxlIHgyLCBkb3VibGUgeTIpIHsKICAgICAgICAgICAgIHRoaXMueDEgPSAoZmxvYXQpeDE7CiAgICAgICAgICAgICB0aGlzLnkxID0gKGZsb2F0KXkxOwogICAgICAgICAgICAgdGhpcy5jdHJseDEgPSAoZmxvYXQpY3RybHgxOwpAQCAtMTY5LDE4ICsxOTgsMjUgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFNldHMgdGhlIGRhdGEgdmFsdWVzIG9mIHRoZSBjdXJ2ZS4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAotICAgICAgICAgKiBAcGFyYW0geTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIGN0cmx4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSBjdHJseTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAgICAgKiBAcGFyYW0gY3RybHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSBjdHJseTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludAotICAgICAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50CisgICAgICAgICAqIEBwYXJhbSB4MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0geTEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIGN0cmx4MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSBjdHJseTEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0gY3RybHgyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSBjdHJseTIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIHgyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0geTIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDdXJ2ZShmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IGN0cmx4MSwgZmxvYXQgY3RybHkxLAotICAgICAgICAgICAgICAgIGZsb2F0IGN0cmx4MiwgZmxvYXQgY3RybHkyLCBmbG9hdCB4MiwgZmxvYXQgeTIpCi0gICAgICAgIHsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q3VydmUoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCBjdHJseDEsIGZsb2F0IGN0cmx5MSwgZmxvYXQgY3RybHgyLAorICAgICAgICAgICAgICAgIGZsb2F0IGN0cmx5MiwgZmxvYXQgeDIsIGZsb2F0IHkyKSB7CiAgICAgICAgICAgICB0aGlzLngxID0geDE7CiAgICAgICAgICAgICB0aGlzLnkxID0geTE7CiAgICAgICAgICAgICB0aGlzLmN0cmx4MSA9IGN0cmx4MTsKQEAgLTIwMSwzOCArMjM3LDU2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIERvdWJsZSBpcyB0aGUgc3ViY2xhc3Mgb2YgQ3ViaWNDdXJ2ZTJEIHRoYXQgaGFzIGFsbCAKLSAgICAgKiBvZiBpdHMgZGF0YSB2YWx1ZXMgc3RvcmVkIHdpdGggZG91YmxlLWxldmVsIHByZWNpc2lvbi4KKyAgICAgKiBUaGUgQ2xhc3MgRG91YmxlIGlzIHRoZSBzdWJjbGFzcyBvZiBDdWJpY0N1cnZlMkQgdGhhdCBoYXMgYWxsIG9mIGl0cyBkYXRhCisgICAgICogdmFsdWVzIHN0b3JlZCB3aXRoIGRvdWJsZS1sZXZlbCBwcmVjaXNpb24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEb3VibGUgZXh0ZW5kcyBDdWJpY0N1cnZlMkQgewogCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSB4MTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIHkxOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIGN0cmx4MTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSBjdHJseTE7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSBjdHJseDI7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSBjdHJseTI7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIHgyOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSB5MjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRvdWJsZS12YWx1ZWQgQ3ViaWNDdXJ2ZTJEIHdpdGggYWxsIGNvb3JkaW5hdGUgdmFsdWVzCi0gICAgICAgICAqIHNldCB0byB6ZXJvLgorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZG91YmxlLXZhbHVlZCBDdWJpY0N1cnZlMkQgd2l0aCBhbGwgY29vcmRpbmF0ZQorICAgICAgICAgKiB2YWx1ZXMgc2V0IHRvIHplcm8uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRG91YmxlKCkgewogICAgICAgICB9CkBAIC0yNDEsMTcgKzI5NSwyNSBAQAogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZG91YmxlLXZhbHVlZCBDdWJpY0N1cnZlMkQgd2l0aCB0aGUgc3BlY2lmaWVkCiAgICAgICAgICAqIGNvb3JkaW5hdGUgdmFsdWVzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAotICAgICAgICAgKiBAcGFyYW0gY3RybHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIGN0cmx5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSBjdHJseDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIGN0cmx5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludAotICAgICAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQKKyAgICAgICAgICogQHBhcmFtIHgxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSB5MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0gY3RybHgxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIGN0cmx5MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSBjdHJseDIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIGN0cmx5MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0geDIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSB5MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBEb3VibGUoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSBjdHJseDEsIGRvdWJsZSBjdHJseTEsCi0gICAgICAgICAgICAgICAgZG91YmxlIGN0cmx4MiwgZG91YmxlIGN0cmx5MiwgZG91YmxlIHgyLCBkb3VibGUgeTIpIHsKKyAgICAgICAgcHVibGljIERvdWJsZShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIGN0cmx4MSwgZG91YmxlIGN0cmx5MSwgZG91YmxlIGN0cmx4MiwKKyAgICAgICAgICAgICAgICBkb3VibGUgY3RybHkyLCBkb3VibGUgeDIsIGRvdWJsZSB5MikgewogICAgICAgICAgICAgc2V0Q3VydmUoeDEsIHkxLCBjdHJseDEsIGN0cmx5MSwgY3RybHgyLCBjdHJseTIsIHgyLCB5Mik7CiAgICAgICAgIH0KIApAQCAtMzE2LDkgKzM3OCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q3VydmUoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSBjdHJseDEsIGRvdWJsZSBjdHJseTEsCi0gICAgICAgICAgICAgICAgZG91YmxlIGN0cmx4MiwgZG91YmxlIGN0cmx5MiwgZG91YmxlIHgyLCBkb3VibGUgeTIpCi0gICAgICAgIHsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q3VydmUoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSBjdHJseDEsIGRvdWJsZSBjdHJseTEsIGRvdWJsZSBjdHJseDIsCisgICAgICAgICAgICAgICAgZG91YmxlIGN0cmx5MiwgZG91YmxlIHgyLCBkb3VibGUgeTIpIHsKICAgICAgICAgICAgIHRoaXMueDEgPSB4MTsKICAgICAgICAgICAgIHRoaXMueTEgPSB5MTsKICAgICAgICAgICAgIHRoaXMuY3RybHgxID0gY3RybHgxOwpAQCAtMzM5LDI3ICs0MDAsMzYgQEAKICAgICB9CiAKICAgICAvKgotICAgICAqIEN1YmljQ3VydmUyRCBwYXRoIGl0ZXJhdG9yIAorICAgICAqIEN1YmljQ3VydmUyRCBwYXRoIGl0ZXJhdG9yCiAgICAgICovCiAgICAgLyoqCiAgICAgICogVGhlIEl0ZXJhdG9yIGNsYXNzIGZvciB0aGUgU2hhcGUgQ3ViaWNDdXJ2ZTJELgogICAgICAqLwogICAgIGNsYXNzIEl0ZXJhdG9yIGltcGxlbWVudHMgUGF0aEl0ZXJhdG9yIHsKIAotICAgICAgICAvKiogVGhlIHNvdXJjZSBDdWJpY0N1cnZlMkQgb2JqZWN0LiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNvdXJjZSBDdWJpY0N1cnZlMkQgb2JqZWN0LgorICAgICAgICAgKi8KICAgICAgICAgQ3ViaWNDdXJ2ZTJEIGM7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHBhdGggaXRlcmF0b3IgdHJhbnNmb3JtYXRpb24uICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwYXRoIGl0ZXJhdG9yIHRyYW5zZm9ybWF0aW9uLgorICAgICAgICAgKi8KICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHQ7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGN1cnJlbnQgc2VnbWVuZXQgaW5kZXguICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjdXJyZW50IHNlZ21lbnQgaW5kZXguCisgICAgICAgICAqLwogICAgICAgICBpbnQgaW5kZXg7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgQ3ViaWNDdXJ2ZTJELkl0ZXJhdG9yIGZvciBnaXZlbiBsaW5lIGFuZCB0cmFuc2Zvcm1hdGlvbgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEN1YmljQ3VydmUyRC5JdGVyYXRvciBmb3IgZ2l2ZW4gbGluZSBhbmQKKyAgICAgICAgICogdHJhbnNmb3JtYXRpb24KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBjIC0gdGhlIHNvdXJjZSBDdWJpY0N1cnZlMkQgb2JqZWN0Ci0gICAgICAgICAqIEBwYXJhbSB0IHRoZSB0CisgICAgICAgICAqIEBwYXJhbSBjCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBDdWJpY0N1cnZlMkQgb2JqZWN0LgorICAgICAgICAgKiBAcGFyYW0gdAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBhZmZpbmUgdHJhbnNmb3JtYXRpb24gb2JqZWN0LgogICAgICAgICAgKi8KICAgICAgICAgSXRlcmF0b3IoQ3ViaWNDdXJ2ZTJEIGMsIEFmZmluZVRyYW5zZm9ybSB0KSB7CiAgICAgICAgICAgICB0aGlzLmMgPSBjOwpAQCAtNDQzLDQyICs1MTMsNDIgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQKKyAgICAgKiBAcmV0dXJuIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0WDEoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRZMSgpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc3RhcnRpbmcgcG9pbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3RhcnRpbmcgcG9pbnQKKyAgICAgKiBAcmV0dXJuIHRoZSBzdGFydGluZyBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgUG9pbnQyRCBnZXRQMSgpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldEN0cmxYMSgpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldEN0cmxZMSgpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKKyAgICAgKiBAcmV0dXJuIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgUG9pbnQyRCBnZXRDdHJsUDEoKTsKIApAQCAtNDk5LDQyICs1NjksNTAgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBQb2ludDJEIGdldEN0cmxQMigpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQKKyAgICAgKiBAcmV0dXJuIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldFgyKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0WTIoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGVuZCBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbmQgcG9pbnQKKyAgICAgKiBAcmV0dXJuIHRoZSBlbmQgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFBvaW50MkQgZ2V0UDIoKTsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGRhdGEgb2YgdGhlIGN1cnZlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAotICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAotICAgICAqIEBwYXJhbSBjdHJseDEgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSBjdHJseTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSBjdHJseDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0gY3RybHkyIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludAotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQKKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICogQHBhcmFtIGN0cmx4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0gY3RybHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSBjdHJseDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSBjdHJseTIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEN1cnZlKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgY3RybHgxLCBkb3VibGUgY3RybHkxLAogICAgICAgICAgICAgZG91YmxlIGN0cmx4MiwgZG91YmxlIGN0cmx5MiwgZG91YmxlIHgyLCBkb3VibGUgeTIpOwpAQCAtNTQyLDIyNCArNjIwLDIzOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGRhdGEgb2YgdGhlIGN1cnZlIGFzIHBvaW50IG9iamVjdHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHAxIHRoZSBzdGFydGluZyBwb2ludAotICAgICAqIEBwYXJhbSBjcDEgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0gY3AyIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSBwMiB0aGUgZW5kIHBvaW50Ci0gICAgICogCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIHBvaW50cyBpcyBudWxsLgorICAgICAqIEBwYXJhbSBwMQorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAqIEBwYXJhbSBjcDEKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSBjcDIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0gcDIKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgcG9pbnQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFueSBvZiB0aGUgcG9pbnRzIGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q3VydmUoUG9pbnQyRCBwMSwgUG9pbnQyRCBjcDEsIFBvaW50MkQgY3AyLCBQb2ludDJEIHAyKSB7Ci0gICAgICAgIHNldEN1cnZlKAotICAgICAgICAgICAgICAgIHAxLmdldFgoKSwgcDEuZ2V0WSgpLAotICAgICAgICAgICAgICAgIGNwMS5nZXRYKCksIGNwMS5nZXRZKCksCi0gICAgICAgICAgICAgICAgY3AyLmdldFgoKSwgY3AyLmdldFkoKSwKLSAgICAgICAgICAgICAgICBwMi5nZXRYKCksIHAyLmdldFkoKSk7CisgICAgICAgIHNldEN1cnZlKHAxLmdldFgoKSwgcDEuZ2V0WSgpLCBjcDEuZ2V0WCgpLCBjcDEuZ2V0WSgpLCBjcDIuZ2V0WCgpLCBjcDIuZ2V0WSgpLCBwMi5nZXRYKCksCisgICAgICAgICAgICAgICAgcDIuZ2V0WSgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkYXRhIG9mIHRoZSBjdXJ2ZSBieSByZWFkaW5nIHRoZSBkYXRhIGZyb20gYW4gYXJyYXkKLSAgICAgKiBvZiB2YWx1ZXMuIFRoZSB2YWx1ZXMgYXJlIHJlYWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGFyZ3VtZW50cwotICAgICAqIG9mIHRoZSBtZXRob2Qge0BsaW5rIEN1YmljQ3VydmUyRCNzZXRDdXJ2ZShkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSl9LgorICAgICAqIFNldHMgdGhlIGRhdGEgb2YgdGhlIGN1cnZlIGJ5IHJlYWRpbmcgdGhlIGRhdGEgZnJvbSBhbiBhcnJheSBvZiB2YWx1ZXMuCisgICAgICogVGhlIHZhbHVlcyBhcmUgcmVhZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QKKyAgICAgKiB7QGxpbmsgQ3ViaWNDdXJ2ZTJEI3NldEN1cnZlKGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKX0KKyAgICAgKiAuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvb3JkcyB0aGUgYXJyYXkgb2YgdmFsdWVzIGNvbnRhaW5pbmcgdGhlIG5ldyBjb29yZGluYXRlcwotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byByZWFkIHdpdGhpbiB0aGUgYXJyYXkKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBjb29yZHMubGVuZ3RoIDwgb2Zmc2V0ICsgOC4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBjb29yZGluYXRlIGFycmF5IGlzIG51bGwuCisgICAgICogQHBhcmFtIGNvb3JkcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHZhbHVlcyBjb250YWluaW5nIHRoZSBuZXcgY29vcmRpbmF0ZXMuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byByZWFkIHdpdGhpbiB0aGUgYXJyYXkuCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgY29vcmRzLmxlbmd0aH0gPCBvZmZzZXQgKyA4LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY29vcmRpbmF0ZSBhcnJheSBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEN1cnZlKGRvdWJsZVtdIGNvb3JkcywgaW50IG9mZnNldCkgewotICAgICAgICBzZXRDdXJ2ZSgKLSAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgMF0sIGNvb3Jkc1tvZmZzZXQgKyAxXSwKLSAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgMl0sIGNvb3Jkc1tvZmZzZXQgKyAzXSwKLSAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgNF0sIGNvb3Jkc1tvZmZzZXQgKyA1XSwKLSAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgNl0sIGNvb3Jkc1tvZmZzZXQgKyA3XSk7CisgICAgICAgIHNldEN1cnZlKGNvb3Jkc1tvZmZzZXQgKyAwXSwgY29vcmRzW29mZnNldCArIDFdLCBjb29yZHNbb2Zmc2V0ICsgMl0sIGNvb3Jkc1tvZmZzZXQgKyAzXSwKKyAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgNF0sIGNvb3Jkc1tvZmZzZXQgKyA1XSwgY29vcmRzW29mZnNldCArIDZdLCBjb29yZHNbb2Zmc2V0ICsgN10pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRhdGEgb2YgdGhlIGN1cnZlIGJ5IHJlYWRpbmcgdGhlIGRhdGEgZnJvbSBhbiBhcnJheQotICAgICAqIG9mIHBvaW50cy4gVGhlIHZhbHVlcyBhcmUgcmVhZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgYXJndW1lbnRzCi0gICAgICogb2YgdGhlIG1ldGhvZCB7QGxpbmsgQ3ViaWNDdXJ2ZTJEI3NldEN1cnZlKFBvaW50MkQsIFBvaW50MkQsIFBvaW50MkQsIFBvaW50MkQpfQorICAgICAqIFNldHMgdGhlIGRhdGEgb2YgdGhlIGN1cnZlIGJ5IHJlYWRpbmcgdGhlIGRhdGEgZnJvbSBhbiBhcnJheSBvZiBwb2ludHMuCisgICAgICogVGhlIHZhbHVlcyBhcmUgcmVhZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QKKyAgICAgKiB7QGxpbmsgQ3ViaWNDdXJ2ZTJEI3NldEN1cnZlKFBvaW50MkQsIFBvaW50MkQsIFBvaW50MkQsIFBvaW50MkQpfQogICAgICAqIAotICAgICAqIEBwYXJhbSBwb2ludHMgdGhlIGFycmF5IG9mIHBvaW50cyBjb250YWluaW5nIHRoZSBuZXcgY29vcmRpbmF0ZXMKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgdG8gcmVhZCB3aXRoaW4gdGhlIGFycmF5Ci0gICAgICogCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgcG9pbnRzLmxlbmd0aCA8IG9mZnNldCArIC4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBwb2ludCBhcnJheSBpcyBudWxsLgorICAgICAqIEBwYXJhbSBwb2ludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBwb2ludHMgY29udGFpbmluZyB0aGUgbmV3IGNvb3JkaW5hdGVzLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgdG8gcmVhZCB3aXRoaW4gdGhlIGFycmF5LgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHBvaW50cy5sZW5ndGh9IDwgb2Zmc2V0ICsgLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcG9pbnQgYXJyYXkgaXMgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDdXJ2ZShQb2ludDJEW10gcG9pbnRzLCBpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIHNldEN1cnZlKAotICAgICAgICAgICAgICAgIHBvaW50c1tvZmZzZXQgKyAwXS5nZXRYKCksIHBvaW50c1tvZmZzZXQgKyAwXS5nZXRZKCksCi0gICAgICAgICAgICAgICAgcG9pbnRzW29mZnNldCArIDFdLmdldFgoKSwgcG9pbnRzW29mZnNldCArIDFdLmdldFkoKSwKLSAgICAgICAgICAgICAgICBwb2ludHNbb2Zmc2V0ICsgMl0uZ2V0WCgpLCBwb2ludHNbb2Zmc2V0ICsgMl0uZ2V0WSgpLAorICAgICAgICBzZXRDdXJ2ZShwb2ludHNbb2Zmc2V0ICsgMF0uZ2V0WCgpLCBwb2ludHNbb2Zmc2V0ICsgMF0uZ2V0WSgpLCBwb2ludHNbb2Zmc2V0ICsgMV0uZ2V0WCgpLAorICAgICAgICAgICAgICAgIHBvaW50c1tvZmZzZXQgKyAxXS5nZXRZKCksIHBvaW50c1tvZmZzZXQgKyAyXS5nZXRYKCksIHBvaW50c1tvZmZzZXQgKyAyXS5nZXRZKCksCiAgICAgICAgICAgICAgICAgcG9pbnRzW29mZnNldCArIDNdLmdldFgoKSwgcG9pbnRzW29mZnNldCArIDNdLmdldFkoKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgY3VydmUgYnkgY29weWluZyBpdCBmcm9tIGFub3RoZXIgQ3ViaWNDdXJ2ZTJELgogICAgICAqIAotICAgICAqIEBwYXJhbSBjdXJ2ZSB0aGUgY3VydmUgdG8gY29weSB0aGUgZGF0YSBwb2ludHMgZnJvbQotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGN1cnZlIGlzIG51bGwuCisgICAgICogQHBhcmFtIGN1cnZlCisgICAgICogICAgICAgICAgICB0aGUgY3VydmUgdG8gY29weSB0aGUgZGF0YSBwb2ludHMgZnJvbS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGN1cnZlIGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q3VydmUoQ3ViaWNDdXJ2ZTJEIGN1cnZlKSB7Ci0gICAgICAgIHNldEN1cnZlKAotICAgICAgICAgICAgICAgIGN1cnZlLmdldFgxKCksIGN1cnZlLmdldFkxKCksCi0gICAgICAgICAgICAgICAgY3VydmUuZ2V0Q3RybFgxKCksIGN1cnZlLmdldEN0cmxZMSgpLAotICAgICAgICAgICAgICAgIGN1cnZlLmdldEN0cmxYMigpLCBjdXJ2ZS5nZXRDdHJsWTIoKSwKLSAgICAgICAgICAgICAgICBjdXJ2ZS5nZXRYMigpLCBjdXJ2ZS5nZXRZMigpKTsKKyAgICAgICAgc2V0Q3VydmUoY3VydmUuZ2V0WDEoKSwgY3VydmUuZ2V0WTEoKSwgY3VydmUuZ2V0Q3RybFgxKCksIGN1cnZlLmdldEN0cmxZMSgpLCBjdXJ2ZQorICAgICAgICAgICAgICAgIC5nZXRDdHJsWDIoKSwgY3VydmUuZ2V0Q3RybFkyKCksIGN1cnZlLmdldFgyKCksIGN1cnZlLmdldFkyKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNxdWFyZSBvZiB0aGUgZmxhdG5lc3Mgb2YgdGhpcyBjdXJ2ZSwgd2hlcmUgdGhlIGZsYXRuZXNzIGlzIHRoZSAKLSAgICAgKiBtYXhpbXVtIGRpc3RhbmNlIGZyb20gdGhlIGN1cnZlcyBjb250cm9sIHBvaW50cyB0byB0aGUgCi0gICAgICogbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHR3byBwb2ludHMuCisgICAgICogR2V0cyB0aGUgc3F1YXJlIG9mIHRoZSBmbGF0bmVzcyBvZiB0aGlzIGN1cnZlLCB3aGVyZSB0aGUgZmxhdG5lc3MgaXMgdGhlCisgICAgICogbWF4aW11bSBkaXN0YW5jZSBmcm9tIHRoZSBjdXJ2ZXMgY29udHJvbCBwb2ludHMgdG8gdGhlIGxpbmUgc2VnbWVudAorICAgICAqIGNvbm5lY3RpbmcgdGhlIHR3byBwb2ludHMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBmbGF0bmVzcworICAgICAqIEByZXR1cm4gdGhlIHNxdWFyZSBvZiB0aGUgZmxhdG5lc3MuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZSBnZXRGbGF0bmVzc1NxKCkgewotICAgICAgICByZXR1cm4gZ2V0RmxhdG5lc3NTcSgKLSAgICAgICAgICAgICAgICBnZXRYMSgpLCBnZXRZMSgpLAotICAgICAgICAgICAgICAgIGdldEN0cmxYMSgpLCBnZXRDdHJsWTEoKSwKLSAgICAgICAgICAgICAgICBnZXRDdHJsWDIoKSwgZ2V0Q3RybFkyKCksCisgICAgICAgIHJldHVybiBnZXRGbGF0bmVzc1NxKGdldFgxKCksIGdldFkxKCksIGdldEN0cmxYMSgpLCBnZXRDdHJsWTEoKSwgZ2V0Q3RybFgyKCksIGdldEN0cmxZMigpLAogICAgICAgICAgICAgICAgIGdldFgyKCksIGdldFkyKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNxdWFyZSBvZiB0aGUgZmxhdG5lc3Mgb2YgdGhlIGN1YmljIGN1cnZlIHNlZ21lbnQgCi0gICAgICogZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkIHZhbHVlcy4KKyAgICAgKiBHZXRzIHRoZSBzcXVhcmUgb2YgdGhlIGZsYXRuZXNzIG9mIHRoZSBjdWJpYyBjdXJ2ZSBzZWdtZW50IGRlZmluZWQgYnkgdGhlCisgICAgICogc3BlY2lmaWVkIHZhbHVlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQKLSAgICAgKiBAcGFyYW0geTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQKLSAgICAgKiBAcGFyYW0gY3RybHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0gY3RybHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0gY3RybHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIGN0cmx5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQKLSAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBmbGF0bmVzcworICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgKiBAcGFyYW0gY3RybHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSBjdHJseTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIGN0cmx4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIGN0cmx5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBmbGF0bmVzcy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRGbGF0bmVzc1NxKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgY3RybHgxLCBkb3VibGUgY3RybHkxLAotICAgICAgICAgICAgZG91YmxlIGN0cmx4MiwgZG91YmxlIGN0cmx5MiwgZG91YmxlIHgyLCBkb3VibGUgeTIpCi0gICAgewotICAgICAgICByZXR1cm4gTWF0aC5tYXgoCi0gICAgICAgICAgICAgICAgTGluZTJELnB0U2VnRGlzdFNxKHgxLCB5MSwgeDIsIHkyLCBjdHJseDEsIGN0cmx5MSksCi0gICAgICAgICAgICAgICAgTGluZTJELnB0U2VnRGlzdFNxKHgxLCB5MSwgeDIsIHkyLCBjdHJseDIsIGN0cmx5MikpOworICAgICAgICAgICAgZG91YmxlIGN0cmx4MiwgZG91YmxlIGN0cmx5MiwgZG91YmxlIHgyLCBkb3VibGUgeTIpIHsKKyAgICAgICAgcmV0dXJuIE1hdGgubWF4KExpbmUyRC5wdFNlZ0Rpc3RTcSh4MSwgeTEsIHgyLCB5MiwgY3RybHgxLCBjdHJseTEpLCBMaW5lMkQucHRTZWdEaXN0U3EoeDEsCisgICAgICAgICAgICAgICAgeTEsIHgyLCB5MiwgY3RybHgyLCBjdHJseTIpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzcXVhcmUgb2YgdGhlIGZsYXRuZXNzIG9mIHRoZSBjdWJpYyBjdXJ2ZSBzZWdtZW50IAotICAgICAqIGRlZmluZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZXMuIFRoZSB2YWx1ZXMgYXJlIHJlYWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGFyZ3VtZW50cwotICAgICAqIG9mIHRoZSBtZXRob2Qge0BsaW5rIEN1YmljQ3VydmUyRCNnZXRGbGF0bmVzc1NxKGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKX0uCisgICAgICogR2V0cyB0aGUgc3F1YXJlIG9mIHRoZSBmbGF0bmVzcyBvZiB0aGUgY3ViaWMgY3VydmUgc2VnbWVudCBkZWZpbmVkIGJ5IHRoZQorICAgICAqIHNwZWNpZmllZCB2YWx1ZXMuIFRoZSB2YWx1ZXMgYXJlIHJlYWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGFyZ3VtZW50cworICAgICAqIG9mIHRoZSBtZXRob2QKKyAgICAgKiB7QGxpbmsgQ3ViaWNDdXJ2ZTJEI2dldEZsYXRuZXNzU3EoZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpfQorICAgICAqIC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29vcmRzIHRoZSBhcnJheSBvZiBwb2ludHMgY29udGFpbmluZyB0aGUgbmV3IGNvb3JkaW5hdGVzCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHRvIHJlYWQgd2l0aGluIHRoZSBhcnJheQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNxdWFyZSBvZiB0aGUgZmxhdG5lc3MKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBwb2ludHMubGVuZ3RoIDwgb2Zmc2V0ICsgLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHBvaW50IGFycmF5IGlzIG51bGwuCisgICAgICogQHBhcmFtIGNvb3JkcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHBvaW50cyBjb250YWluaW5nIHRoZSBuZXcgY29vcmRpbmF0ZXMuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byByZWFkIHdpdGhpbiB0aGUgYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBmbGF0bmVzcy4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHBvaW50cy5sZW5ndGggPCBvZmZzZXQgKyAuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwb2ludCBhcnJheSBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGdldEZsYXRuZXNzU3EoZG91YmxlIGNvb3Jkc1tdLCBpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBnZXRGbGF0bmVzc1NxKAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyAwXSwgY29vcmRzW29mZnNldCArIDFdLAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyAyXSwgY29vcmRzW29mZnNldCArIDNdLAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyA0XSwgY29vcmRzW29mZnNldCArIDVdLAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyA2XSwgY29vcmRzW29mZnNldCArIDddKTsKKyAgICAgICAgcmV0dXJuIGdldEZsYXRuZXNzU3EoY29vcmRzW29mZnNldCArIDBdLCBjb29yZHNbb2Zmc2V0ICsgMV0sIGNvb3Jkc1tvZmZzZXQgKyAyXSwKKyAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgM10sIGNvb3Jkc1tvZmZzZXQgKyA0XSwgY29vcmRzW29mZnNldCArIDVdLCBjb29yZHNbb2Zmc2V0ICsgNl0sCisgICAgICAgICAgICAgICAgY29vcmRzW29mZnNldCArIDddKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmbGF0bmVzcyBvZiB0aGlzIGN1cnZlLCB3aGVyZSB0aGUgZmxhdG5lc3MgaXMgdGhlIAotICAgICAqIG1heGltdW0gZGlzdGFuY2UgZnJvbSB0aGUgY3VydmVzIGNvbnRyb2wgcG9pbnRzIHRvIHRoZSAKLSAgICAgKiBsaW5lIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgdHdvIHBvaW50cy4KKyAgICAgKiBHZXRzIHRoZSBmbGF0bmVzcyBvZiB0aGlzIGN1cnZlLCB3aGVyZSB0aGUgZmxhdG5lc3MgaXMgdGhlIG1heGltdW0KKyAgICAgKiBkaXN0YW5jZSBmcm9tIHRoZSBjdXJ2ZXMgY29udHJvbCBwb2ludHMgdG8gdGhlIGxpbmUgc2VnbWVudCBjb25uZWN0aW5nCisgICAgICogdGhlIHR3byBwb2ludHMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmxhdG5lc3Mgb2YgdGhpcyBjdXJ2ZQorICAgICAqIEByZXR1cm4gdGhlIGZsYXRuZXNzIG9mIHRoaXMgY3VydmUuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZSBnZXRGbGF0bmVzcygpIHsKLSAgICAgICAgcmV0dXJuIGdldEZsYXRuZXNzKAotICAgICAgICAgICAgICAgIGdldFgxKCksIGdldFkxKCksCi0gICAgICAgICAgICAgICAgZ2V0Q3RybFgxKCksIGdldEN0cmxZMSgpLAotICAgICAgICAgICAgICAgIGdldEN0cmxYMigpLCBnZXRDdHJsWTIoKSwKKyAgICAgICAgcmV0dXJuIGdldEZsYXRuZXNzKGdldFgxKCksIGdldFkxKCksIGdldEN0cmxYMSgpLCBnZXRDdHJsWTEoKSwgZ2V0Q3RybFgyKCksIGdldEN0cmxZMigpLAogICAgICAgICAgICAgICAgIGdldFgyKCksIGdldFkyKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZsYXRuZXNzIG9mIHRoZSBjdWJpYyBjdXJ2ZSBzZWdtZW50IAotICAgICAqIGRlZmluZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZXMuCisgICAgICogR2V0cyB0aGUgZmxhdG5lc3Mgb2YgdGhlIGN1YmljIGN1cnZlIHNlZ21lbnQgZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkCisgICAgICogdmFsdWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAotICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAotICAgICAqIEBwYXJhbSBjdHJseDEgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSBjdHJseTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSBjdHJseDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0gY3RybHkyIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludAotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmbGF0bmVzcworICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgKiBAcGFyYW0gY3RybHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSBjdHJseTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIGN0cmx4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIGN0cmx5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgZmxhdG5lc3MuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0RmxhdG5lc3MoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSBjdHJseDEsIGRvdWJsZSBjdHJseTEsCi0gICAgICAgICAgICBkb3VibGUgY3RybHgyLCBkb3VibGUgY3RybHkyLCBkb3VibGUgeDIsIGRvdWJsZSB5MikKLSAgICB7CisgICAgICAgICAgICBkb3VibGUgY3RybHgyLCBkb3VibGUgY3RybHkyLCBkb3VibGUgeDIsIGRvdWJsZSB5MikgewogICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KGdldEZsYXRuZXNzU3EoeDEsIHkxLCBjdHJseDEsIGN0cmx5MSwgY3RybHgyLCBjdHJseTIsIHgyLCB5MikpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZsYXRuZXNzIG9mIHRoZSBjdWJpYyBjdXJ2ZSBzZWdtZW50IAotICAgICAqIGRlZmluZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZXMuIFRoZSB2YWx1ZXMgYXJlIHJlYWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGFyZ3VtZW50cwotICAgICAqIG9mIHRoZSBtZXRob2Qge0BsaW5rIEN1YmljQ3VydmUyRCNnZXRGbGF0bmVzcyhkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSl9LgorICAgICAqIEdldHMgdGhlIGZsYXRuZXNzIG9mIHRoZSBjdWJpYyBjdXJ2ZSBzZWdtZW50IGRlZmluZWQgYnkgdGhlIHNwZWNpZmllZAorICAgICAqIHZhbHVlcy4gVGhlIHZhbHVlcyBhcmUgcmVhZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgYXJndW1lbnRzIG9mIHRoZQorICAgICAqIG1ldGhvZAorICAgICAqIHtAbGluayBDdWJpY0N1cnZlMkQjZ2V0RmxhdG5lc3MoZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpfQorICAgICAqIC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29vcmRzIHRoZSBhcnJheSBvZiBwb2ludHMgY29udGFpbmluZyB0aGUgbmV3IGNvb3JkaW5hdGVzCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHRvIHJlYWQgd2l0aGluIHRoZSBhcnJheQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZsYXRuZXNzCi0gICAgICogCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgcG9pbnRzLmxlbmd0aCA8IG9mZnNldCArIC4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBwb2ludCBhcnJheSBpcyBudWxsLgorICAgICAqIEBwYXJhbSBjb29yZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBwb2ludHMgY29udGFpbmluZyB0aGUgbmV3IGNvb3JkaW5hdGVzLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgdG8gcmVhZCB3aXRoaW4gdGhlIGFycmF5LgorICAgICAqIEByZXR1cm4gdGhlIGZsYXRuZXNzLgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcG9pbnRzLmxlbmd0aCA8IG9mZnNldCArIC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHBvaW50IGFycmF5IGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0RmxhdG5lc3MoZG91YmxlIGNvb3Jkc1tdLCBpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBnZXRGbGF0bmVzcygKLSAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgMF0sIGNvb3Jkc1tvZmZzZXQgKyAxXSwKLSAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgMl0sIGNvb3Jkc1tvZmZzZXQgKyAzXSwKLSAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgNF0sIGNvb3Jkc1tvZmZzZXQgKyA1XSwKLSAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgNl0sIGNvb3Jkc1tvZmZzZXQgKyA3XSk7CisgICAgICAgIHJldHVybiBnZXRGbGF0bmVzcyhjb29yZHNbb2Zmc2V0ICsgMF0sIGNvb3Jkc1tvZmZzZXQgKyAxXSwgY29vcmRzW29mZnNldCArIDJdLAorICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyAzXSwgY29vcmRzW29mZnNldCArIDRdLCBjb29yZHNbb2Zmc2V0ICsgNV0sIGNvb3Jkc1tvZmZzZXQgKyA2XSwKKyAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgN10pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGRhdGEgZm9yIHR3byBjdWJpYyBjdXJ2ZXMgYnkgZGl2aWRpbmcgdGhpcwotICAgICAqIGN1cnZlIGluIHR3by4gVGhlIGRpdmlzaW9uIHBvaW50IGlzIHRoZSBwb2ludCBvbiB0aGUgY3VydmUgCi0gICAgICogdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBhdmVyYWdlIG9mIGN1cnZlJ3MgdHdvIGNvbnRyb2wgcG9pbnRzLiAKLSAgICAgKiBUaGUgdHdvIG5ldyBjb250cm9sIHBvaW50cyAobmVhcmVzdCB0aGUgbmV3IGVuZHBvaW50KSBhcmUgY29tcHV0ZWQKLSAgICAgKiBieSBhdmVyYWdpbmcgdGhlIG9yaWdpbmFsIGNvbnRyb2wgcG9pbnRzIHdpdGggdGhlIG5ldyBlbmRwb2ludC4KLSAgICAgKiBUaGUgZGF0YSBvZiB0aGlzIGN1cnZlIGlzIGxlZnQgdW5jaGFuZ2VkLgorICAgICAqIENyZWF0ZXMgdGhlIGRhdGEgZm9yIHR3byBjdWJpYyBjdXJ2ZXMgYnkgZGl2aWRpbmcgdGhpcyBjdXJ2ZSBpbiB0d28uIFRoZQorICAgICAqIGRpdmlzaW9uIHBvaW50IGlzIHRoZSBwb2ludCBvbiB0aGUgY3VydmUgdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBhdmVyYWdlCisgICAgICogb2YgY3VydmUncyB0d28gY29udHJvbCBwb2ludHMuIFRoZSB0d28gbmV3IGNvbnRyb2wgcG9pbnRzIChuZWFyZXN0IHRoZQorICAgICAqIG5ldyBlbmRwb2ludCkgYXJlIGNvbXB1dGVkIGJ5IGF2ZXJhZ2luZyB0aGUgb3JpZ2luYWwgY29udHJvbCBwb2ludHMgd2l0aAorICAgICAqIHRoZSBuZXcgZW5kcG9pbnQuIFRoZSBkYXRhIG9mIHRoaXMgY3VydmUgaXMgbGVmdCB1bmNoYW5nZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxlZnQgdGhlIEN1YmljQ3VydmUyRCB3aGVyZSB0aGUgbGVmdCAoc3RhcnQpIHNlZ21lbnQncyAKLSAgICAgKiBkYXRhIGlzIHdyaXR0ZW4KLSAgICAgKiBAcGFyYW0gcmlnaHQgdGhlIEN1YmljQ3VydmUyRCB3aGVyZSB0aGUgcmlnaHQgKGVuZCkgc2VnbWVudCdzIAotICAgICAqIGRhdGEgaXMgd3JpdHRlbgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgZWl0aGVyIGN1cnZlIGlzIG51bGwuCisgICAgICogQHBhcmFtIGxlZnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBDdWJpY0N1cnZlMkQgd2hlcmUgdGhlIGxlZnQgKHN0YXJ0KSBzZWdtZW50J3MgZGF0YSBpcworICAgICAqICAgICAgICAgICAgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gcmlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBDdWJpY0N1cnZlMkQgd2hlcmUgdGhlIHJpZ2h0IChlbmQpIHNlZ21lbnQncyBkYXRhIGlzCisgICAgICogICAgICAgICAgICB3cml0dGVuLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBlaXRoZXIgY3VydmUgaXMgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzdWJkaXZpZGUoQ3ViaWNDdXJ2ZTJEIGxlZnQsIEN1YmljQ3VydmUyRCByaWdodCkgewogICAgICAgICBzdWJkaXZpZGUodGhpcywgbGVmdCwgcmlnaHQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGRhdGEgZm9yIHR3byBjdWJpYyBjdXJ2ZXMgYnkgZGl2aWRpbmcgdGhlIHNwZWNpZmllZAotICAgICAqIGN1cnZlIGluIHR3by4gVGhlIGRpdmlzaW9uIHBvaW50IGlzIHRoZSBwb2ludCBvbiB0aGUgY3VydmUgCi0gICAgICogdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBhdmVyYWdlIG9mIGN1cnZlJ3MgdHdvIGNvbnRyb2wgcG9pbnRzLiAKLSAgICAgKiBUaGUgdHdvIG5ldyBjb250cm9sIHBvaW50cyAobmVhcmVzdCB0aGUgbmV3IGVuZHBvaW50KSBhcmUgY29tcHV0ZWQKLSAgICAgKiBieSBhdmVyYWdpbmcgdGhlIG9yaWdpbmFsIGNvbnRyb2wgcG9pbnRzIHdpdGggdGhlIG5ldyBlbmRwb2ludC4KLSAgICAgKiBUaGUgZGF0YSBvZiB0aGUgc291cmNlIGN1cnZlIGlzIGxlZnQgdW5jaGFuZ2VkLgorICAgICAqIENyZWF0ZXMgdGhlIGRhdGEgZm9yIHR3byBjdWJpYyBjdXJ2ZXMgYnkgZGl2aWRpbmcgdGhlIHNwZWNpZmllZCBjdXJ2ZSBpbgorICAgICAqIHR3by4gVGhlIGRpdmlzaW9uIHBvaW50IGlzIHRoZSBwb2ludCBvbiB0aGUgY3VydmUgdGhhdCBpcyBjbG9zZXN0IHRvIHRoZQorICAgICAqIGF2ZXJhZ2Ugb2YgY3VydmUncyB0d28gY29udHJvbCBwb2ludHMuIFRoZSB0d28gbmV3IGNvbnRyb2wgcG9pbnRzCisgICAgICogKG5lYXJlc3QgdGhlIG5ldyBlbmRwb2ludCkgYXJlIGNvbXB1dGVkIGJ5IGF2ZXJhZ2luZyB0aGUgb3JpZ2luYWwgY29udHJvbAorICAgICAqIHBvaW50cyB3aXRoIHRoZSBuZXcgZW5kcG9pbnQuIFRoZSBkYXRhIG9mIHRoZSBzb3VyY2UgY3VydmUgaXMgbGVmdAorICAgICAqIHVuY2hhbmdlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBvcmlnaW5hbCBjdXJ2ZSB0byBiZSBkaXZpZGVkIGluIHR3bwotICAgICAqIEBwYXJhbSBsZWZ0IHRoZSBDdWJpY0N1cnZlMkQgd2hlcmUgdGhlIGxlZnQgKHN0YXJ0KSBzZWdtZW50J3MgCi0gICAgICogZGF0YSBpcyB3cml0dGVuCi0gICAgICogQHBhcmFtIHJpZ2h0IHRoZSBDdWJpY0N1cnZlMkQgd2hlcmUgdGhlIHJpZ2h0IChlbmQpIHNlZ21lbnQncyAKLSAgICAgKiBkYXRhIGlzIHdyaXR0ZW4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGVpdGhlciBjdXJ2ZSBpcyBudWxsLgorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBjdXJ2ZSB0byBiZSBkaXZpZGVkIGluIHR3by4KKyAgICAgKiBAcGFyYW0gbGVmdAorICAgICAqICAgICAgICAgICAgdGhlIEN1YmljQ3VydmUyRCB3aGVyZSB0aGUgbGVmdCAoc3RhcnQpIHNlZ21lbnQncyBkYXRhIGlzCisgICAgICogICAgICAgICAgICB3cml0dGVuLgorICAgICAqIEBwYXJhbSByaWdodAorICAgICAqICAgICAgICAgICAgdGhlIEN1YmljQ3VydmUyRCB3aGVyZSB0aGUgcmlnaHQgKGVuZCkgc2VnbWVudCdzIGRhdGEgaXMKKyAgICAgKiAgICAgICAgICAgIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGVpdGhlciBjdXJ2ZSBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdWJkaXZpZGUoQ3ViaWNDdXJ2ZTJEIHNyYywgQ3ViaWNDdXJ2ZTJEIGxlZnQsIEN1YmljQ3VydmUyRCByaWdodCkgewogICAgICAgICBkb3VibGUgeDEgPSBzcmMuZ2V0WDEoKTsKQEAgLTc5MSwyNyArODgzLDM2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZGF0YSBmb3IgdHdvIGN1YmljIGN1cnZlcyBieSBkaXZpZGluZyB0aGUgc3BlY2lmaWVkCi0gICAgICogY3VydmUgaW4gdHdvLiBUaGUgZGl2aXNpb24gcG9pbnQgaXMgdGhlIHBvaW50IG9uIHRoZSBjdXJ2ZSAKLSAgICAgKiB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhlIGF2ZXJhZ2Ugb2YgY3VydmUncyB0d28gY29udHJvbCBwb2ludHMuIAotICAgICAqIFRoZSB0d28gbmV3IGNvbnRyb2wgcG9pbnRzIChuZWFyZXN0IHRoZSBuZXcgZW5kcG9pbnQpIGFyZSBjb21wdXRlZAotICAgICAqIGJ5IGF2ZXJhZ2luZyB0aGUgb3JpZ2luYWwgY29udHJvbCBwb2ludHMgd2l0aCB0aGUgbmV3IGVuZHBvaW50LgotICAgICAqIFRoZSBkYXRhIG9mIHRoZSBzb3VyY2UgY3VydmUgaXMgbGVmdCB1bmNoYW5nZWQuIFRoZSBkYXRhIGZvciB0aGUgCi0gICAgICogdGhyZWUgY3VydmVzIGlzIHJlYWQvd3JpdHRlbiBpbiB0aGUgdXN1YWwgb3JkZXI6IHsgeDEsIHkxLCAKLSAgICAgKiBjdHJseDEsIGN0cmx5MSwgY3RybHgyLCBjcnRyeTIsIHgyLCB5MyB9CisgICAgICogQ3JlYXRlcyB0aGUgZGF0YSBmb3IgdHdvIGN1YmljIGN1cnZlcyBieSBkaXZpZGluZyB0aGUgc3BlY2lmaWVkIGN1cnZlIGluCisgICAgICogdHdvLiBUaGUgZGl2aXNpb24gcG9pbnQgaXMgdGhlIHBvaW50IG9uIHRoZSBjdXJ2ZSB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhlCisgICAgICogYXZlcmFnZSBvZiBjdXJ2ZSdzIHR3byBjb250cm9sIHBvaW50cy4gVGhlIHR3byBuZXcgY29udHJvbCBwb2ludHMKKyAgICAgKiAobmVhcmVzdCB0aGUgbmV3IGVuZHBvaW50KSBhcmUgY29tcHV0ZWQgYnkgYXZlcmFnaW5nIHRoZSBvcmlnaW5hbCBjb250cm9sCisgICAgICogcG9pbnRzIHdpdGggdGhlIG5ldyBlbmRwb2ludC4gVGhlIGRhdGEgb2YgdGhlIHNvdXJjZSBjdXJ2ZSBpcyBsZWZ0CisgICAgICogdW5jaGFuZ2VkLiBUaGUgZGF0YSBmb3IgdGhlIHRocmVlIGN1cnZlcyBpcyByZWFkL3dyaXR0ZW4gaW4gdGhlIHVzdWFsCisgICAgICogb3JkZXI6IHsgeDEsIHkxLCBjdHJseDEsIGN0cmx5MSwgY3RybHgyLCBjcnRyeTIsIHgyLCB5MyB9CiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgYXJyYXkgdGhhdCBnaXZlcyB0aGUgZGF0YSB2YWx1ZXMgZm9yIHRoZSBzb3VyY2UgY3VydmUKLSAgICAgKiBAcGFyYW0gc3JjT2ZmIHRoZSBvZmZzZXQgaW4gdGhlIHNyYyBhcnJheSB0byByZWFkIHRoZSB2YWx1ZXMgZnJvbQotICAgICAqIEBwYXJhbSBsZWZ0IHRoZSBhcnJheSB3aGVyZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHN0YXJ0IGN1cnZlIHNob3VsZCBiZSB3cml0dGVuCi0gICAgICogQHBhcmFtIGxlZnRPZmYgdGhlIG9mZnNldCBpbiB0aGUgbGVmdCBhcnJheSB0byBzdGFydCB3cml0aW5nIHRoZSB2YWx1ZXMKLSAgICAgKiBAcGFyYW0gcmlnaHQgdGhlIGFycmF5IHdoZXJlIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgZW5kIGN1cnZlIHNob3VsZCBiZSB3cml0dGVuCi0gICAgICogQHBhcmFtIHJpZ2h0T2ZmIHRoZSBvZmZzZXQgaW4gdGhlIHJpZ2h0IGFycmF5IHRvIHN0YXJ0IHdyaXRpbmcgdGhlIHZhbHVlcwotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHNyYy5sZW5ndGggPCBzcmNvZmYgKyA4Ci0gICAgICogb3IgaWYgbGVmdC5sZW5ndGggPCBsZWZ0T2ZmICsgOCBvciBpZiByaWdodC5sZW5ndGggPCByaWdodE9mZiArIDguCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBvbmUgb2YgdGhlIGFycmF5cyBpcyBudWxsLgorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB0aGF0IGdpdmVzIHRoZSBkYXRhIHZhbHVlcyBmb3IgdGhlIHNvdXJjZSBjdXJ2ZS4KKyAgICAgKiBAcGFyYW0gc3JjT2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBzcmMgYXJyYXkgdG8gcmVhZCB0aGUgdmFsdWVzIGZyb20uCisgICAgICogQHBhcmFtIGxlZnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB3aGVyZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHN0YXJ0IGN1cnZlIHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gbGVmdE9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgbGVmdCBhcnJheSB0byBzdGFydCB3cml0aW5nIHRoZSB2YWx1ZXMuCisgICAgICogQHBhcmFtIHJpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgd2hlcmUgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBlbmQgY3VydmUgc2hvdWxkIGJlCisgICAgICogICAgICAgICAgICB3cml0dGVuLgorICAgICAqIEBwYXJhbSByaWdodE9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgcmlnaHQgYXJyYXkgdG8gc3RhcnQgd3JpdGluZyB0aGUgdmFsdWVzLgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgc3JjLmxlbmd0aCA8IHNyY29mZiArIDggb3IgaWYgbGVmdC5sZW5ndGggPCBsZWZ0T2ZmICsgOCBvcgorICAgICAqICAgICAgICAgICAgIGlmIHJpZ2h0Lmxlbmd0aCA8IHJpZ2h0T2ZmICsgOC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgb25lIG9mIHRoZSBhcnJheXMgaXMgbnVsbC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3ViZGl2aWRlKGRvdWJsZSBzcmNbXSwgaW50IHNyY09mZiwgZG91YmxlIGxlZnRbXSwgaW50IGxlZnRPZmYsIGRvdWJsZSByaWdodFtdLCBpbnQgcmlnaHRPZmYpIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3ViZGl2aWRlKGRvdWJsZSBzcmNbXSwgaW50IHNyY09mZiwgZG91YmxlIGxlZnRbXSwgaW50IGxlZnRPZmYsCisgICAgICAgICAgICBkb3VibGUgcmlnaHRbXSwgaW50IHJpZ2h0T2ZmKSB7CiAgICAgICAgIGRvdWJsZSB4MSA9IHNyY1tzcmNPZmYgKyAwXTsKICAgICAgICAgZG91YmxlIHkxID0gc3JjW3NyY09mZiArIDFdOwogICAgICAgICBkb3VibGUgY3gxID0gc3JjW3NyY09mZiArIDJdOwpAQCAtODU1LDQyICs5NTYsNDMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGaW5kcyB0aGUgcm9vdHMgb2YgdGhlIGN1YmljIHBvbHlub21pYWwuIFRoaXMgaXMgCi0gICAgICogYWNjb21wbGlzaGVkIGJ5IGZpbmRpbmcgdGhlIChyZWFsKSB2YWx1ZXMgb2YgeCB0aGF0IHNvbHZlCi0gICAgICogdGhlIGZvbGxvd2luZyBlcXVhdGlvbjogZXFuWzNdKngqeCp4ICsgZXFuWzJdKngqeCArIGVxblsxXSp4ICsgZXFuWzBdID0gMC4KLSAgICAgKiBUaGUgc29sdXRpb25zIGFyZSB3cml0dGVuIGJhY2sgaW50byB0aGUgYXJyYXkgZXFuIHN0YXJ0aW5nCi0gICAgICogZnJvbSB0aGUgaW5kZXggMCBpbiB0aGUgYXJyYXkuIFRoZSByZXR1cm4gdmFsdWUgdGVsbHMgaG93IAotICAgICAqIG1hbnkgYXJyYXkgZWxlbWVudHMgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgdGhpcyBtZXRob2QgY2FsbC4KKyAgICAgKiBGaW5kcyB0aGUgcm9vdHMgb2YgdGhlIGN1YmljIHBvbHlub21pYWwuIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IGZpbmRpbmcKKyAgICAgKiB0aGUgKHJlYWwpIHZhbHVlcyBvZiB4IHRoYXQgc29sdmUgdGhlIGZvbGxvd2luZyBlcXVhdGlvbjogZXFuWzNdKngqeCp4ICsKKyAgICAgKiBlcW5bMl0qeCp4ICsgZXFuWzFdKnggKyBlcW5bMF0gPSAwLiBUaGUgc29sdXRpb25zIGFyZSB3cml0dGVuIGJhY2sgaW50bworICAgICAqIHRoZSBhcnJheSBlcW4gc3RhcnRpbmcgZnJvbSB0aGUgaW5kZXggMCBpbiB0aGUgYXJyYXkuIFRoZSByZXR1cm4gdmFsdWUKKyAgICAgKiB0ZWxscyBob3cgbWFueSBhcnJheSBlbGVtZW50cyBoYXZlIGJlZW4gY2hhbmdlZCBieSB0aGlzIG1ldGhvZCBjYWxsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlcW4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSAKLSAgICAgKiBjdWJpYyBwb2x5bm9taWFsIHRvIHNvbHZlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByb290cyBvZiB0aGUgY3ViaWMgcG9seW5vbWlhbAotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGVxbi5sZW5ndGggPCA0LgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGFycmF5IGlzIG51bGwuCisgICAgICogQHBhcmFtIGVxbgorICAgICAqICAgICAgICAgICAgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSBjdWJpYyBwb2x5bm9taWFsCisgICAgICogICAgICAgICAgICB0byBzb2x2ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygcm9vdHMgb2YgdGhlIGN1YmljIHBvbHlub21pYWwuCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBlcW4ubGVuZ3RoIDwgNC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGFycmF5IGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgc29sdmVDdWJpYyhkb3VibGUgZXFuW10pIHsKICAgICAgICAgcmV0dXJuIHNvbHZlQ3ViaWMoZXFuLCBlcW4pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSByb290cyBvZiB0aGUgY3ViaWMgcG9seW5vbWlhbC4gVGhpcyBpcyAKLSAgICAgKiBhY2NvbXBsaXNoZWQgYnkgZmluZGluZyB0aGUgKHJlYWwpIHZhbHVlcyBvZiB4IHRoYXQgc29sdmUKLSAgICAgKiB0aGUgZm9sbG93aW5nIGVxdWF0aW9uOiBlcW5bM10qeCp4KnggKyBlcW5bMl0qeCp4ICsgZXFuWzFdKnggKyBlcW5bMF0gPSAwLgotICAgICAqIFRoZSBzb2x1dGlvbnMgYXJlIHdyaXR0ZW4gaW50byB0aGUgYXJyYXkgcmVzIHN0YXJ0aW5nCi0gICAgICogZnJvbSB0aGUgaW5kZXggMCBpbiB0aGUgYXJyYXkuIFRoZSByZXR1cm4gdmFsdWUgdGVsbHMgaG93IAotICAgICAqIG1hbnkgYXJyYXkgZWxlbWVudHMgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgdGhpcyBtZXRob2QgY2FsbC4KKyAgICAgKiBGaW5kcyB0aGUgcm9vdHMgb2YgdGhlIGN1YmljIHBvbHlub21pYWwuIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IGZpbmRpbmcKKyAgICAgKiB0aGUgKHJlYWwpIHZhbHVlcyBvZiB4IHRoYXQgc29sdmUgdGhlIGZvbGxvd2luZyBlcXVhdGlvbjogZXFuWzNdKngqeCp4ICsKKyAgICAgKiBlcW5bMl0qeCp4ICsgZXFuWzFdKnggKyBlcW5bMF0gPSAwLiBUaGUgc29sdXRpb25zIGFyZSB3cml0dGVuIGludG8gdGhlCisgICAgICogYXJyYXkgcmVzIHN0YXJ0aW5nIGZyb20gdGhlIGluZGV4IDAgaW4gdGhlIGFycmF5LiBUaGUgcmV0dXJuIHZhbHVlIHRlbGxzCisgICAgICogaG93IG1hbnkgYXJyYXkgZWxlbWVudHMgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgdGhpcyBtZXRob2QgY2FsbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXFuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50cyBvZiB0aGUgCi0gICAgICogY3ViaWMgcG9seW5vbWlhbCB0byBzb2x2ZS4KLSAgICAgKiBAcGFyYW0gcmVzIHRoZSBhcnJheSB0aGF0IHRoaXMgbWV0aG9kIHdyaXRlcyB0aGUgcmVzdWx0cyBpbnRvCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJvb3RzIG9mIHRoZSBjdWJpYyBwb2x5bm9taWFsCi0gICAgICogCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgZXFuLmxlbmd0aCA8IDQgb3IgCi0gICAgICogaWYgcmVzLmxlbmd0aCBpcyBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiByb290cy4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGVpdGhlciBhcnJheSBpcyBudWxsLgorICAgICAqIEBwYXJhbSBlcW4KKyAgICAgKiAgICAgICAgICAgIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50cyBvZiB0aGUgY3ViaWMgcG9seW5vbWlhbAorICAgICAqICAgICAgICAgICAgdG8gc29sdmUuCisgICAgICogQHBhcmFtIHJlcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHRoYXQgdGhpcyBtZXRob2Qgd3JpdGVzIHRoZSByZXN1bHRzIGludG8uCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJvb3RzIG9mIHRoZSBjdWJpYyBwb2x5bm9taWFsLgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZXFuLmxlbmd0aCA8IDQgb3IgaWYgcmVzLmxlbmd0aCBpcyBsZXNzIHRoYW4gdGhlIG51bWJlciBvZgorICAgICAqICAgICAgICAgICAgIHJvb3RzLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBlaXRoZXIgYXJyYXkgaXMgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBzb2x2ZUN1YmljKGRvdWJsZSBlcW5bXSwgZG91YmxlIHJlc1tdKSB7CiAgICAgICAgIHJldHVybiBDcm9zc2luZy5zb2x2ZUN1YmljKGVxbiwgcmVzKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9nZW9tL0RpbWVuc2lvbjJELmphdmEgYi9hd3QvamF2YS9hd3QvZ2VvbS9EaW1lbnNpb24yRC5qYXZhCmluZGV4IGVlZjYzZTYuLmVhMDgxYzUgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9nZW9tL0RpbWVuc2lvbjJELmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2dlb20vRGltZW5zaW9uMkQuamF2YQpAQCAtMTgsMTIgKzE4LDE1IEBACiAgKiBAYXV0aG9yIERlbmlzIE0uIEtpc2hlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5nZW9tOwogCiAvKioKLSAqIFRoZSBDbGFzcyBEaW1lbnNpb24yRCByZXByZXNlbnRzIGEgc2l6ZSAod2lkdGggYW5kIGhlaWdodCkgb2YgYSAKLSAqIGdlb21ldHJpYyBvYmplY3QuIEl0IHN0b3JlcyBkb3VibGUtdmFsdWVkIGRhdGEgaW4gb3JkZXIgdG8gYmUgY29tcGF0aWJsZQotICogd2l0aCBoaWdoLXByZWNpc2lvbiBnZW9tZXRyaWMgb3BlcmF0aW9ucy4KKyAqIFRoZSBDbGFzcyBEaW1lbnNpb24yRCByZXByZXNlbnRzIGEgc2l6ZSAod2lkdGggYW5kIGhlaWdodCkgb2YgYSBnZW9tZXRyaWMKKyAqIG9iamVjdC4gSXQgc3RvcmVzIGRvdWJsZS12YWx1ZWQgZGF0YSBpbiBvcmRlciB0byBiZSBjb21wYXRpYmxlIHdpdGgKKyAqIGhpZ2gtcHJlY2lzaW9uIGdlb21ldHJpYyBvcGVyYXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIERpbWVuc2lvbjJEIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKIApAQCAtMzYsMzEgKzM5LDM0IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgd2lkdGguCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgd2lkdGgKKyAgICAgKiBAcmV0dXJuIHRoZSB3aWR0aC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldFdpZHRoKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBoZWlnaHQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaGVpZ2h0CisgICAgICogQHJldHVybiB0aGUgaGVpZ2h0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0SGVpZ2h0KCk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGgKLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQKKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aC4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFNpemUoZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0KTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgYmFzZWQgb24gdGhlIGRhdGEgb2YgYW5vdGhlciAKLSAgICAgKiBEaW1lbnNpb24yRCBvYmplY3QuCisgICAgICogU2V0cyB0aGUgd2lkdGggYW5kIGhlaWdodCBiYXNlZCBvbiB0aGUgZGF0YSBvZiBhbm90aGVyIERpbWVuc2lvbjJECisgICAgICogb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBkIHRoZSBEaW1lbnNpb24yRCBvYmplY3QgcHJvdmlkaW5nIHRoZSBkYXRhIHRvIGNvcHkgCi0gICAgICogaW50byB0aGlzIERpbWVuc2lvbjJEIG9iamVjdAorICAgICAqIEBwYXJhbSBkCisgICAgICogICAgICAgICAgICB0aGUgRGltZW5zaW9uMkQgb2JqZWN0IHByb3ZpZGluZyB0aGUgZGF0YSB0byBjb3B5IGludG8gdGhpcworICAgICAqICAgICAgICAgICAgRGltZW5zaW9uMkQgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNpemUoRGltZW5zaW9uMkQgZCkgewogICAgICAgICBzZXRTaXplKGQuZ2V0V2lkdGgoKSwgZC5nZXRIZWlnaHQoKSk7CkBAIC03NSw0ICs4MSwzIEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9nZW9tL0VsbGlwc2UyRC5qYXZhIGIvYXd0L2phdmEvYXd0L2dlb20vRWxsaXBzZTJELmphdmEKaW5kZXggMzM0NjRhZi4uODlmZDBkMCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2dlb20vRWxsaXBzZTJELmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2dlb20vRWxsaXBzZTJELmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0Lmdlb207CiAKIGltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKQEAgLTI1LDI5ICsyNiw0MSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBDbGFzcyBFbGxpcHNlMkQgZGVzY3JpYmVzIGFuIGVsbGlwc2UgZGVmaW5lZCBieSBhIHJlY3Rhbmd1bGFyCi0gKiBhcmVhIGluIHdoaWNoIGl0IGlzIGluc2NyaWJlZC4KKyAqIFRoZSBDbGFzcyBFbGxpcHNlMkQgZGVzY3JpYmVzIGFuIGVsbGlwc2UgZGVmaW5lZCBieSBhIHJlY3Rhbmd1bGFyIGFyZWEgaW4KKyAqIHdoaWNoIGl0IGlzIGluc2NyaWJlZC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbGxpcHNlMkQgZXh0ZW5kcyBSZWN0YW5ndWxhclNoYXBlIHsKIAogICAgIC8qKgotICAgICAqIFRoZSBDbGFzcyBGbG9hdCBpcyB0aGUgc3ViY2xhc3Mgb2YgRWxsaXBzZTJEIHRoYXQgaGFzIGFsbCAKLSAgICAgKiBvZiBpdHMgZGF0YSB2YWx1ZXMgc3RvcmVkIHdpdGggZmxvYXQtbGV2ZWwgcHJlY2lzaW9uLgorICAgICAqIFRoZSBDbGFzcyBGbG9hdCBpcyB0aGUgc3ViY2xhc3Mgb2YgRWxsaXBzZTJEIHRoYXQgaGFzIGFsbCBvZiBpdHMgZGF0YQorICAgICAqIHZhbHVlcyBzdG9yZWQgd2l0aCBmbG9hdC1sZXZlbCBwcmVjaXNpb24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGbG9hdCBleHRlbmRzIEVsbGlwc2UyRCB7CiAKLSAgICAgICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBlbGxpcHNlJ3MKLSAgICAgICAgICogYm91bmRpbmcgcmVjdGFuZ2xlLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGVsbGlwc2UncyBib3VuZGluZworICAgICAgICAgKiByZWN0YW5nbGUuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZWxsaXBzZSdzCi0gICAgICAgICAqIGJvdW5kaW5nIHJlY3RhbmdsZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGVsbGlwc2UncyBib3VuZGluZworICAgICAgICAgKiByZWN0YW5nbGUuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIGVsbGlwc2UncyBib3VuZGluZyByZWN0YW5nbGUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgZWxsaXBzZSdzIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB3aWR0aDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSBlbGxpcHNlJ3MgYm91bmRpbmcgcmVjdGFuZ2xlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBlbGxpcHNlJ3MgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IGhlaWdodDsKIAogICAgICAgICAvKioKQEAgLTU5LDEyICs3MiwxNiBAQAogICAgICAgICAvKioKICAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZsb2F0LXZhbHVlZCBFbGxpcHNlMkQgd2l0aCB0aGUgc3BlY2lmaWVkIGRhdGEuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZWxsaXBzZSdzCi0gICAgICAgICAqIGJvdW5kaW5nIHJlY3RhbmdsZQotICAgICAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZWxsaXBzZSdzCi0gICAgICAgICAqIGJvdW5kaW5nIHJlY3RhbmdsZQotICAgICAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBlbGxpcHNlJ3MgYm91bmRpbmcgcmVjdGFuZ2xlCi0gICAgICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgZWxsaXBzZSdzIGJvdW5kaW5nIHJlY3RhbmdsZQorICAgICAgICAgKiBAcGFyYW0geAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBlbGxpcHNlJ3MKKyAgICAgICAgICogICAgICAgICAgICBib3VuZGluZyByZWN0YW5nbGUuCisgICAgICAgICAqIEBwYXJhbSB5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGVsbGlwc2UncworICAgICAgICAgKiAgICAgICAgICAgIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICAgICAgICogQHBhcmFtIHdpZHRoCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBlbGxpcHNlJ3MgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgZWxsaXBzZSdzIGJvdW5kaW5nIHJlY3RhbmdsZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBGbG9hdChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0KSB7CiAgICAgICAgICAgICBzZXRGcmFtZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKQEAgLTk4LDEyICsxMTUsMTYgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFNldHMgdGhlIGRhdGEgb2YgdGhlIGVsbGlwc2UncyBib3VuZGluZyByZWN0YW5nbGUuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZWxsaXBzZSdzCi0gICAgICAgICAqIGJvdW5kaW5nIHJlY3RhbmdsZQotICAgICAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZWxsaXBzZSdzCi0gICAgICAgICAqIGJvdW5kaW5nIHJlY3RhbmdsZQotICAgICAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBlbGxpcHNlJ3MgYm91bmRpbmcgcmVjdGFuZ2xlCi0gICAgICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgZWxsaXBzZSdzIGJvdW5kaW5nIHJlY3RhbmdsZQorICAgICAgICAgKiBAcGFyYW0geAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBlbGxpcHNlJ3MKKyAgICAgICAgICogICAgICAgICAgICBib3VuZGluZyByZWN0YW5nbGUuCisgICAgICAgICAqIEBwYXJhbSB5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGVsbGlwc2UncworICAgICAgICAgKiAgICAgICAgICAgIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICAgICAgICogQHBhcmFtIHdpZHRoCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBlbGxpcHNlJ3MgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgZWxsaXBzZSdzIGJvdW5kaW5nIHJlY3RhbmdsZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldEZyYW1lKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQpIHsKICAgICAgICAgICAgIHRoaXMueCA9IHg7CkBAIC0xMjYsMjMgKzE0NywzMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoZSBDbGFzcyBEb3VibGUgaXMgdGhlIHN1YmNsYXNzIG9mIEVsbGlwc2UyRCB0aGF0IGhhcyBhbGwgCi0gICAgICogb2YgaXRzIGRhdGEgdmFsdWVzIHN0b3JlZCB3aXRoIGRvdWJsZS1sZXZlbCBwcmVjaXNpb24uCisgICAgICogVGhlIENsYXNzIERvdWJsZSBpcyB0aGUgc3ViY2xhc3Mgb2YgRWxsaXBzZTJEIHRoYXQgaGFzIGFsbCBvZiBpdHMgZGF0YQorICAgICAqIHZhbHVlcyBzdG9yZWQgd2l0aCBkb3VibGUtbGV2ZWwgcHJlY2lzaW9uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRG91YmxlIGV4dGVuZHMgRWxsaXBzZTJEIHsKIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGVsbGlwc2UncwotICAgICAgICAgKiBib3VuZGluZyByZWN0YW5nbGUuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZWxsaXBzZSdzIGJvdW5kaW5nCisgICAgICAgICAqIHJlY3RhbmdsZS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgeDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZWxsaXBzZSdzCi0gICAgICAgICAqIGJvdW5kaW5nIHJlY3RhbmdsZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGVsbGlwc2UncyBib3VuZGluZworICAgICAgICAgKiByZWN0YW5nbGUuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIHk7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHdpZHRoIG9mIHRoZSBlbGxpcHNlJ3MgYm91bmRpbmcgcmVjdGFuZ2xlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIGVsbGlwc2UncyBib3VuZGluZyByZWN0YW5nbGUuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIHdpZHRoOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBoZWlnaHQgb2YgdGhlIGVsbGlwc2UncyBib3VuZGluZyByZWN0YW5nbGUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIGVsbGlwc2UncyBib3VuZGluZyByZWN0YW5nbGUuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIGhlaWdodDsKIAogICAgICAgICAvKioKQEAgLTE1MiwxNSArMTgzLDE4IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRvdWJsZS12YWx1ZWQgRWxsaXBzZTJEIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAgICAgKiBkYXRhLgorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZG91YmxlLXZhbHVlZCBFbGxpcHNlMkQgd2l0aCB0aGUgc3BlY2lmaWVkIGRhdGEuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZWxsaXBzZSdzCi0gICAgICAgICAqIGJvdW5kaW5nIHJlY3RhbmdsZQotICAgICAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZWxsaXBzZSdzCi0gICAgICAgICAqIGJvdW5kaW5nIHJlY3RhbmdsZQotICAgICAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBlbGxpcHNlJ3MgYm91bmRpbmcgcmVjdGFuZ2xlCi0gICAgICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgZWxsaXBzZSdzIGJvdW5kaW5nIHJlY3RhbmdsZQorICAgICAgICAgKiBAcGFyYW0geAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBlbGxpcHNlJ3MKKyAgICAgICAgICogICAgICAgICAgICBib3VuZGluZyByZWN0YW5nbGUuCisgICAgICAgICAqIEBwYXJhbSB5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGVsbGlwc2UncworICAgICAgICAgKiAgICAgICAgICAgIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICAgICAgICogQHBhcmFtIHdpZHRoCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBlbGxpcHNlJ3MgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgZWxsaXBzZSdzIGJvdW5kaW5nIHJlY3RhbmdsZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBEb3VibGUoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQpIHsKICAgICAgICAgICAgIHNldEZyYW1lKHgsIHksIHdpZHRoLCBoZWlnaHQpOwpAQCAtMjA1LDcgKzIzOSw3IEBACiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBFbGxpcHNlMkQgcGF0aCBpdGVyYXRvciAKKyAgICAgKiBFbGxpcHNlMkQgcGF0aCBpdGVyYXRvcgogICAgICAqLwogICAgIC8qKgogICAgICAqIFRoZSBzdWJjbGFzcyBvZiBQYXRoSXRlcmF0b3IgdG8gdHJhdmVyc2UgYW4gRWxsaXBzZTJELgpAQCAtMjEzLDQ2ICsyNDcsNzIgQEAKICAgICBjbGFzcyBJdGVyYXRvciBpbXBsZW1lbnRzIFBhdGhJdGVyYXRvciB7CiAKICAgICAgICAgLyoKLSAgICAgICAgICogRWxsaXBzZSBpcyBzdWJkaXZpZGVkIGludG8gZm91ciBxdWFydGVycyBieSB4IGFuZCB5IGF4aXMuIEVhY2ggcGFydCBhcHByb3hpbWF0ZWQgYnkKLSAgICAgICAgICogY3ViaWMgQmV6aWVyIGN1cnZlLiBBcmMgaW4gZmlyc3QgcXVhcnRlciBpcyBzdGFydGVkIGluIChhLCAwKSBhbmQgZmluaXNoZWQgaW4gKDAsIGIpIHBvaW50cy4KLSAgICAgICAgICogQ29udHJvbCBwb2ludHMgZm9yIGN1YmljIGN1cnZlIHdpaWwgYmUgKGEsIDApLCAoYSwgbSksIChuLCBiKSBhbmQgKDAsIGIpIHdoZXJlIG4gYW5kIG0gYXJlCi0gICAgICAgICAqIGNhbGN1bGF0ZWQgYmFzZWQgb24gcmVxdWlyZW1lbnQgQmV6aWVyIGN1cnZlIGluIHBvaW50IDAuNSBzaG91bGQgbGF5IG9uIHRoZSBhcmMuCisgICAgICAgICAqIEVsbGlwc2UgaXMgc3ViZGl2aWRlZCBpbnRvIGZvdXIgcXVhcnRlcnMgYnkgeCBhbmQgeSBheGlzLiBFYWNoIHBhcnQKKyAgICAgICAgICogYXBwcm94aW1hdGVkIGJ5IGN1YmljIEJlemllciBjdXJ2ZS4gQXJjIGluIGZpcnN0IHF1YXJ0ZXIgaXMgc3RhcnRlZAorICAgICAgICAgKiBpbiAoYSwgMCkgYW5kIGZpbmlzaGVkIGluICgwLCBiKSBwb2ludHMuIENvbnRyb2wgcG9pbnRzIGZvciBjdWJpYworICAgICAgICAgKiBjdXJ2ZSB3aWlsIGJlIChhLCAwKSwgKGEsIG0pLCAobiwgYikgYW5kICgwLCBiKSB3aGVyZSBuIGFuZCBtIGFyZQorICAgICAgICAgKiBjYWxjdWxhdGVkIGJhc2VkIG9uIHJlcXVpcmVtZW50IEJlemllciBjdXJ2ZSBpbiBwb2ludCAwLjUgc2hvdWxkIGxheQorICAgICAgICAgKiBvbiB0aGUgYXJjLgogICAgICAgICAgKi8KIAotICAgICAgICAvKiogVGhlIGNvZWZmaWNpZW50IHRvIGNhbGN1bGF0ZSBjb250cm9sIHBvaW50cyBvZiBCZXppZXIgY3VydmVzLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvZWZmaWNpZW50IHRvIGNhbGN1bGF0ZSBjb250cm9sIHBvaW50cyBvZiBCZXppZXIgY3VydmVzLgorICAgICAgICAgKi8KICAgICAgICAgZmluYWwgZG91YmxlIHUgPSAyLjAgLyAzLjAgKiAoTWF0aC5zcXJ0KDIuMCkgLSAxLjApOwogCi0gICAgICAgIC8qKiBUaGUgcG9pbnRzIGNvb3JkaW5hdGVzIGNhbGN1bGF0aW9uIHRhYmxlLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBvaW50cyBjb29yZGluYXRlcyBjYWxjdWxhdGlvbiB0YWJsZS4KKyAgICAgICAgICovCiAgICAgICAgIGZpbmFsIGRvdWJsZSBwb2ludHNbXVtdID0gewotICAgICAgICAgICAgICAgIHsgMS4wLCAwLjUgKyB1LCAwLjUgKyB1LCAxLjAsIDAuNSwgMS4wIH0sCi0gICAgICAgICAgICAgICAgeyAwLjUgLSB1LCAxLjAsIDAuMCwgMC41ICsgdSwgMC4wLCAwLjUgfSwKLSAgICAgICAgICAgICAgICB7IDAuMCwgMC41IC0gdSwgMC41IC0gdSwgMC4wLCAwLjUsIDAuMCB9LAotICAgICAgICAgICAgICAgIHsgMC41ICsgdSwgMC4wLCAxLjAsIDAuNSAtIHUsIDEuMCwgMC41IH0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAxLjAsIDAuNSArIHUsIDAuNSArIHUsIDEuMCwgMC41LCAxLjAKKyAgICAgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICAgICAgICAgICAwLjUgLSB1LCAxLjAsIDAuMCwgMC41ICsgdSwgMC4wLCAwLjUKKyAgICAgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICAgICAgICAgICAwLjAsIDAuNSAtIHUsIDAuNSAtIHUsIDAuMCwgMC41LCAwLjAKKyAgICAgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICAgICAgICAgICAwLjUgKyB1LCAwLjAsIDEuMCwgMC41IC0gdSwgMS4wLCAwLjUKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAKLSAgICAgICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgbGVmdC11cHBlciBjb3JuZXIgb2YgdGhlIGVsbGlwc2UgYm91bmRzLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiBsZWZ0LXVwcGVyIGNvcm5lciBvZiB0aGUgZWxsaXBzZSBib3VuZHMuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUgeDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIGxlZnQtdXBwZXIgY29ybmVyIG9mIHRoZSBlbGxpcHNlIGJvdW5kcy4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiBsZWZ0LXVwcGVyIGNvcm5lciBvZiB0aGUgZWxsaXBzZSBib3VuZHMuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUgeTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIGVsbGlwc2UgYm91bmRzLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIGVsbGlwc2UgYm91bmRzLgorICAgICAgICAgKi8KICAgICAgICAgZG91YmxlIHdpZHRoOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBoZWlnaHQgb2YgdGhlIGVsbGlwc2UgYm91bmRzLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBlbGxpcHNlIGJvdW5kcy4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSBoZWlnaHQ7CiAKLSAgICAgICAgLyoqIFRoZSBwYXRoIGl0ZXJhdG9yIHRyYW5zZm9ybWF0aW9uLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBhdGggaXRlcmF0b3IgdHJhbnNmb3JtYXRpb24uCisgICAgICAgICAqLwogICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdDsKIAotICAgICAgICAvKiogVGhlIGN1cnJlbnQgc2VnbWVuZXQgaW5kZXguICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY3VycmVudCBzZWdtZW50IGluZGV4LgorICAgICAgICAgKi8KICAgICAgICAgaW50IGluZGV4OwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEVsbGlwc2UyRC5JdGVyYXRvciBmb3IgZ2l2ZW4gZWxsaXBzZSBhbmQgdHJhbnNmb3JtYXRpb24KKyAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBFbGxpcHNlMkQuSXRlcmF0b3IgZm9yIGdpdmVuIGVsbGlwc2UgYW5kCisgICAgICAgICAqIHRyYW5zZm9ybWF0aW9uCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gZSAtIHRoZSBzb3VyY2UgRWxsaXBzZTJEIG9iamVjdAotICAgICAgICAgKiBAcGFyYW0gdCB0aGUgdAorICAgICAgICAgKiBAcGFyYW0gZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgRWxsaXBzZTJEIG9iamVjdC4KKyAgICAgICAgICogQHBhcmFtIHQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgYWZmaW5lIHRyYW5zZm9ybWF0aW9uIG9iamVjdC4KICAgICAgICAgICovCiAgICAgICAgIEl0ZXJhdG9yKEVsbGlwc2UyRCBlLCBBZmZpbmVUcmFuc2Zvcm0gdCkgewogICAgICAgICAgICAgdGhpcy54ID0gZS5nZXRYKCk7CkBAIC0zODksMTUgKzQ0OSwxMCBAQAogICAgICAgICBkb3VibGUgcngyID0gcnggKyBydzsKICAgICAgICAgZG91YmxlIHJ5MiA9IHJ5ICsgcmg7CiAKLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBjb250YWlucyhyeDEsIHJ5MSkgJiYKLSAgICAgICAgICAgIGNvbnRhaW5zKHJ4MiwgcnkxKSAmJgotICAgICAgICAgICAgY29udGFpbnMocngyLCByeTIpICYmCi0gICAgICAgICAgICBjb250YWlucyhyeDEsIHJ5Mik7CisgICAgICAgIHJldHVybiBjb250YWlucyhyeDEsIHJ5MSkgJiYgY29udGFpbnMocngyLCByeTEpICYmIGNvbnRhaW5zKHJ4MiwgcnkyKSAmJiBjb250YWlucyhyeDEsIHJ5Mik7CiAgICAgfQogCiAgICAgcHVibGljIFBhdGhJdGVyYXRvciBnZXRQYXRoSXRlcmF0b3IoQWZmaW5lVHJhbnNmb3JtIGF0KSB7CiAgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgYXQpOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2dlb20vRmxhdHRlbmluZ1BhdGhJdGVyYXRvci5qYXZhIGIvYXd0L2phdmEvYXd0L2dlb20vRmxhdHRlbmluZ1BhdGhJdGVyYXRvci5qYXZhCmluZGV4IGNhNWM3YzIuLjgyMDhmMzkgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9nZW9tL0ZsYXR0ZW5pbmdQYXRoSXRlcmF0b3IuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZ2VvbS9GbGF0dGVuaW5nUGF0aEl0ZXJhdG9yLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0Lmdlb207CiAKIGltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKQEAgLTI1LDEwNCArMjYsMTM5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIENsYXNzIEZsYXR0ZW5pbmdQYXRoSXRlcmF0b3IgdGFrZXMgYSBQYXRoSXRlcmF0b3IgZm9yIHRyYXZlcnNpbmcgCi0gKiBhIGN1cnZlZCBzaGFwZSBhbmQgZmxhdHRlbnMgaXQgYnkgZXN0aW1hdGluZyB0aGUgY3VydmUgYXMgYSBzZXJpZXMgCi0gKiBvZiBsaW5lIHNlZ21lbnRzLiBUaGUgZmxhdHRlbmluZyBmYWN0b3IgaW5kaWNhdGVzIGhvdyBmYXIgdGhlIAotICogZXN0aW1hdGluZyBsaW5lIHNlZ21lbnRzIGFyZSBhbGxvd2VkIHRvIGJlIGZyb20gdGhlIGFjdHVhbCBjdXJ2ZToKLSAqIHRoZSBGbGF0dGVuaW5nUGF0aEl0ZXJhdG9yIHdpbGwga2VlcCBkaXZpZGluZyBlYWNoIGN1cnZlZCBzZWdtZW50IAotICogaW50byBzbWFsbGVyIGFuZCBzbWFsbGVyIGZsYXQgc2VnbWVudHMgdW50aWwgZWl0aGVyIHRoZSBzZWdtZW50cyAKLSAqIGFyZSB3aXRoaW5nIHRoZSBmbGF0dGVuaW5nIGZhY3RvciBvZiB0aGUgY3VydmUgb3IgdW50aWwgdGhlIGJ1ZmZlcgotICogbGltaXQgaXMgcmVhY2hlZC4KKyAqIFRoZSBDbGFzcyBGbGF0dGVuaW5nUGF0aEl0ZXJhdG9yIHRha2VzIGEgUGF0aEl0ZXJhdG9yIGZvciB0cmF2ZXJzaW5nIGEgY3VydmVkCisgKiBzaGFwZSBhbmQgZmxhdHRlbnMgaXQgYnkgZXN0aW1hdGluZyB0aGUgY3VydmUgYXMgYSBzZXJpZXMgb2YgbGluZSBzZWdtZW50cy4KKyAqIFRoZSBmbGF0dGVuaW5nIGZhY3RvciBpbmRpY2F0ZXMgaG93IGZhciB0aGUgZXN0aW1hdGluZyBsaW5lIHNlZ21lbnRzIGFyZQorICogYWxsb3dlZCB0byBiZSBmcm9tIHRoZSBhY3R1YWwgY3VydmU6IHRoZSBGbGF0dGVuaW5nUGF0aEl0ZXJhdG9yIHdpbGwga2VlcAorICogZGl2aWRpbmcgZWFjaCBjdXJ2ZWQgc2VnbWVudCBpbnRvIHNtYWxsZXIgYW5kIHNtYWxsZXIgZmxhdCBzZWdtZW50cyB1bnRpbAorICogZWl0aGVyIHRoZSBzZWdtZW50cyBhcmUgd2l0aGluIHRoZSBmbGF0dGVuaW5nIGZhY3RvciBvZiB0aGUgY3VydmUgb3IgdW50aWwKKyAqIHRoZSBidWZmZXIgbGltaXQgaXMgcmVhY2hlZC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBGbGF0dGVuaW5nUGF0aEl0ZXJhdG9yIGltcGxlbWVudHMgUGF0aEl0ZXJhdG9yIHsKIAotICAgIC8qKiBUaGUgZGVmYXVsdCBwb2ludHMgYnVmZmVyIHNpemUuICovCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgcG9pbnRzIGJ1ZmZlciBzaXplLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDE2OwotICAgIAotICAgIC8qKiBUaGUgZGVmYXVsdCBjdXJ2ZSBzdWJkaXZpc2lvbiBsaW1pdC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGN1cnZlIHN1YmRpdmlzaW9uIGxpbWl0LgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfTElNSVQgPSAxNjsKIAotICAgIC8qKiBUaGUgcG9pbnRzIGJ1ZmZlciBjYXBhY2l0eS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcG9pbnRzIGJ1ZmZlciBjYXBhY2l0eS4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX0NBUEFDSVRZID0gMTY7Ci0gICAgCi0gICAgLyoqIFRoZSB0eXBlIG9mIGN1cnJlbnQgc2VnbWVudCB0byBiZSBmbGF0LiAqLworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgY3VycmVudCBzZWdtZW50IHRvIGJlIGZsYXQuCisgICAgICovCiAgICAgaW50IGJ1ZlR5cGU7Ci0gICAgCi0gICAgLyoqIFRoZSBjdXJ2ZSBzdWJkaXZpc2lvbiBsaW1pdC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBjdXJ2ZSBzdWJkaXZpc2lvbiBsaW1pdC4KKyAgICAgKi8KICAgICBpbnQgYnVmTGltaXQ7Ci0gICAgCi0gICAgLyoqIFRoZSBjdXJyZW50IHBvaW50cyBidWZmZXIgc2l6ZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IHBvaW50cyBidWZmZXIgc2l6ZS4KKyAgICAgKi8KICAgICBpbnQgYnVmU2l6ZTsKLSAgICAKLSAgICAvKiogVGhlIGlubmVyIGN1cnNvciBwb3NpdGlvbiBpbiBwb2ludHMgYnVmZmVyLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGlubmVyIGN1cnNvciBwb3NpdGlvbiBpbiBwb2ludHMgYnVmZmVyLgorICAgICAqLwogICAgIGludCBidWZJbmRleDsKLSAgICAKLSAgICAvKiogVGhlIGN1cnJlbnQgc3ViZGl2aXNpb24gY291bnQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBzdWJkaXZpc2lvbiBjb3VudC4KKyAgICAgKi8KICAgICBpbnQgYnVmU3ViZGl2OwogCi0gICAgLyoqIFRoZSBwb2ludHMgYnVmZmVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBwb2ludHMgYnVmZmVyLgorICAgICAqLwogICAgIGRvdWJsZSBidWZbXTsKLSAgICAKLSAgICAvKiogVGhlIGluZGljYXRvciBvZiBlbXB0eSBwb2ludHMgYnVmZmVyLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGluZGljYXRvciBvZiBlbXB0eSBwb2ludHMgYnVmZmVyLgorICAgICAqLwogICAgIGJvb2xlYW4gYnVmRW1wdHkgPSB0cnVlOwotICAgIAotICAgIC8qKiBUaGUgc291cmNlIFBhdGhJdGVyYXRvci4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBzb3VyY2UgUGF0aEl0ZXJhdG9yLgorICAgICAqLwogICAgIFBhdGhJdGVyYXRvciBwOwotICAgIAotICAgIC8qKiBUaGUgZmxhdG5lc3Mgb2YgbmV3IHBhdGguICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZmxhdG5lc3Mgb2YgbmV3IHBhdGguCisgICAgICovCiAgICAgZG91YmxlIGZsYXRuZXNzOwotICAgIAotICAgIC8qKiBUaGUgc3F1YXJlIG9mIGZsYXRuZXNzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHNxdWFyZSBvZiBmbGF0bmVzcy4KKyAgICAgKi8KICAgICBkb3VibGUgZmxhdG5lc3MyOwotICAgIAotICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHByZXZpb3VzIHBhdGggc2VnbWVudC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgcHJldmlvdXMgcGF0aCBzZWdtZW50LgorICAgICAqLwogICAgIGRvdWJsZSBweDsKIAotICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHByZXZpb3VzIHBhdGggc2VnbWVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHByZXZpb3VzIHBhdGggc2VnbWVudC4KKyAgICAgKi8KICAgICBkb3VibGUgcHk7Ci0gICAgCi0gICAgLyoqIFRoZSB0YW1wb3JhcnkgYnVmZmVyIGZvciBnZXR0aW5nIHBvaW50cyBmcm9tIFBhdGhJdGVyYXRvci4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSB0ZW1wb3JhcnkgYnVmZmVyIGZvciBnZXR0aW5nIHBvaW50cyBmcm9tIFBhdGhJdGVyYXRvci4KKyAgICAgKi8KICAgICBkb3VibGUgY29vcmRzW10gPSBuZXcgZG91YmxlWzZdOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZsYXR0ZW5pbmcgcGF0aCBpdGVyYXRvciBnaXZlbiB0aGUgcGF0aCAKLSAgICAgKiBpdGVyYXRvciBmb3IgYSAocG9zc2libHkpIGN1cnZlZCBwYXRoIGFuZCBhIGZsYXR0ZW5pbmcgZmFjdG9yCi0gICAgICogd2hpY2ggaW5kaWNhdGVzIGhvdyBjbG9zZSB0b2dldGhlciB0aGUgcG9pbnRzIG9uIHRoZSBjdXJ2ZSAKLSAgICAgKiBzaG91bGQgYmUgY2hvc2VuLiBUaGUgYnVmZmVyIGxpbWl0IGRlZmF1bHRzIHRvIDE2IHdoaWNoIG1lYW5zIAotICAgICAqIHRoYXQgZWFjaCBjdXJ2ZSB3aWxsIGJlIGRpdmlkZWQgaW50byBubyBtb3JlIHRoYW4gMTYgc2VnbWVudHMgCi0gICAgICogcmVnYXJkbGVzcyBvZiB0aGUgZmxhdHRlbmluZyBmYWN0b3IuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZsYXR0ZW5pbmcgcGF0aCBpdGVyYXRvciBnaXZlbiB0aGUgcGF0aCBpdGVyYXRvciBmb3IgYQorICAgICAqIChwb3NzaWJseSkgY3VydmVkIHBhdGggYW5kIGEgZmxhdHRlbmluZyBmYWN0b3Igd2hpY2ggaW5kaWNhdGVzIGhvdyBjbG9zZQorICAgICAqIHRvZ2V0aGVyIHRoZSBwb2ludHMgb24gdGhlIGN1cnZlIHNob3VsZCBiZSBjaG9zZW4uIFRoZSBidWZmZXIgbGltaXQKKyAgICAgKiBkZWZhdWx0cyB0byAxNiB3aGljaCBtZWFucyB0aGF0IGVhY2ggY3VydmUgd2lsbCBiZSBkaXZpZGVkIGludG8gbm8gbW9yZQorICAgICAqIHRoYW4gMTYgc2VnbWVudHMgcmVnYXJkbGVzcyBvZiB0aGUgZmxhdHRlbmluZyBmYWN0b3IuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBhdGggdGhlIHBhdGggaXRlcmF0b3Igb2YgdGhlIG9yaWdpbmFsIGN1cnZlCi0gICAgICogQHBhcmFtIGZsYXRuZXNzIHRoZSBmbGF0dGVuaW5nIGZhY3RvciB0aGF0IGluZGljYXRlcyBob3cgZmFyIHRoZSAKLSAgICAgKiBmbGF0IHBhdGggaXMgYWxsb3dlZCB0byBiZSBmcm9tIHRoZSBhY3R1YWwgY3VydmUgaW4gb3JkZXIgdG8gCi0gICAgICogZGVjaWRlIHdoZW4gdG8gc3RvcCBkaXZpZGluZyB0aGUgcGF0aCBpbnRvIHNtYWxsZXIgYW5kIHNtYWxsZXIKLSAgICAgKiBzZWdtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZmxhdG5lc3MgaXMgbGVzcyB0aGFuIHplcm8uCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgcGF0aCBpcyBudWxsLgorICAgICAqIEBwYXJhbSBwYXRoCisgICAgICogICAgICAgICAgICB0aGUgcGF0aCBpdGVyYXRvciBvZiB0aGUgb3JpZ2luYWwgY3VydmUuCisgICAgICogQHBhcmFtIGZsYXRuZXNzCisgICAgICogICAgICAgICAgICB0aGUgZmxhdHRlbmluZyBmYWN0b3IgdGhhdCBpbmRpY2F0ZXMgaG93IGZhciB0aGUgZmxhdCBwYXRoIGlzCisgICAgICogICAgICAgICAgICBhbGxvd2VkIHRvIGJlIGZyb20gdGhlIGFjdHVhbCBjdXJ2ZSBpbiBvcmRlciB0byBkZWNpZGUgd2hlbiB0bworICAgICAqICAgICAgICAgICAgc3RvcCBkaXZpZGluZyB0aGUgcGF0aCBpbnRvIHNtYWxsZXIgYW5kIHNtYWxsZXIgc2VnbWVudHMuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZmxhdG5lc3MgaXMgbGVzcyB0aGFuIHplcm8uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwYXRoIGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIEZsYXR0ZW5pbmdQYXRoSXRlcmF0b3IoUGF0aEl0ZXJhdG9yIHBhdGgsIGRvdWJsZSBmbGF0bmVzcykgewogICAgICAgICB0aGlzKHBhdGgsIGZsYXRuZXNzLCBCVUZGRVJfTElNSVQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBmbGF0dGVuaW5nIHBhdGggaXRlcmF0b3IgZ2l2ZW4gdGhlIHBhdGggCi0gICAgICogaXRlcmF0b3IgZm9yIGEgKHBvc3NpYmx5KSBjdXJ2ZWQgcGF0aCBhbmQgYSBmbGF0dGVuaW5nIGZhY3RvcgotICAgICAqIGFuZCBhIGJ1ZmZlciBsaW1pdC4gVGhlIEZsYXR0ZW5pbmdQYXRoSXRlcmF0b3Igd2lsbCBrZWVwIAotICAgICAqIGRpdmlkaW5nIGVhY2ggY3VydmVkIHNlZ21lbnQgaW50byBzbWFsbGVyIGFuZCBzbWFsbGVyIGZsYXQgc2VnbWVudHMgCi0gICAgICogdW50aWwgZWl0aGVyIHRoZSBzZWdtZW50cyBhcmUgd2l0aGluZyB0aGUgZmxhdHRlbmluZyBmYWN0b3Igb2YgdGhlIAotICAgICAqIGN1cnZlIG9yIHVudGlsIHRoZSBidWZmZXIgbGltaXQgaXMgcmVhY2hlZC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxhdHRlbmluZyBwYXRoIGl0ZXJhdG9yIGdpdmVuIHRoZSBwYXRoIGl0ZXJhdG9yIGZvciBhCisgICAgICogKHBvc3NpYmx5KSBjdXJ2ZWQgcGF0aCBhbmQgYSBmbGF0dGVuaW5nIGZhY3RvciBhbmQgYSBidWZmZXIgbGltaXQuIFRoZQorICAgICAqIEZsYXR0ZW5pbmdQYXRoSXRlcmF0b3Igd2lsbCBrZWVwIGRpdmlkaW5nIGVhY2ggY3VydmVkIHNlZ21lbnQgaW50bworICAgICAqIHNtYWxsZXIgYW5kIHNtYWxsZXIgZmxhdCBzZWdtZW50cyB1bnRpbCBlaXRoZXIgdGhlIHNlZ21lbnRzIGFyZSB3aXRoaW4KKyAgICAgKiB0aGUgZmxhdHRlbmluZyBmYWN0b3Igb2YgdGhlIGN1cnZlIG9yIHVudGlsIHRoZSBidWZmZXIgbGltaXQgaXMgcmVhY2hlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCBpdGVyYXRvciBvZiB0aGUgb3JpZ2luYWwgY3VydmUKLSAgICAgKiBAcGFyYW0gZmxhdG5lc3MgdGhlIGZsYXR0ZW5pbmcgZmFjdG9yIHRoYXQgaW5kaWNhdGVzIGhvdyBmYXIgdGhlIAotICAgICAqIGZsYXQgcGF0aCBpcyBhbGxvd2VkIHRvIGJlIGZyb20gdGhlIGFjdHVhbCBjdXJ2ZSBpbiBvcmRlciB0byAKLSAgICAgKiBkZWNpZGUgd2hlbiB0byBzdG9wIGRpdmlkaW5nIHRoZSBwYXRoIGludG8gc21hbGxlciBhbmQgc21hbGxlcgotICAgICAqIHNlZ21lbnRzLgotICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZmxhdCBzZWdtZW50cyB0byBkaXZpZGUgZWFjaCAKLSAgICAgKiBjdXJ2ZSBpbnRvCi0gICAgICogCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGZsYXRuZXNzIG9yIGxpbWl0IGlzIGxlc3MgdGhhbiB6ZXJvLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHBhdGggaXMgbnVsbC4KKyAgICAgKiBAcGFyYW0gcGF0aAorICAgICAqICAgICAgICAgICAgdGhlIHBhdGggaXRlcmF0b3Igb2YgdGhlIG9yaWdpbmFsIGN1cnZlLgorICAgICAqIEBwYXJhbSBmbGF0bmVzcworICAgICAqICAgICAgICAgICAgdGhlIGZsYXR0ZW5pbmcgZmFjdG9yIHRoYXQgaW5kaWNhdGVzIGhvdyBmYXIgdGhlIGZsYXQgcGF0aCBpcworICAgICAqICAgICAgICAgICAgYWxsb3dlZCB0byBiZSBmcm9tIHRoZSBhY3R1YWwgY3VydmUgaW4gb3JkZXIgdG8gZGVjaWRlIHdoZW4gdG8KKyAgICAgKiAgICAgICAgICAgIHN0b3AgZGl2aWRpbmcgdGhlIHBhdGggaW50byBzbWFsbGVyIGFuZCBzbWFsbGVyIHNlZ21lbnRzLgorICAgICAqIEBwYXJhbSBsaW1pdAorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZsYXQgc2VnbWVudHMgdG8gZGl2aWRlIGVhY2ggY3VydmUgaW50by4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmbGF0bmVzcyBvciBsaW1pdCBpcyBsZXNzIHRoYW4gemVyby4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHBhdGggaXMgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgRmxhdHRlbmluZ1BhdGhJdGVyYXRvcihQYXRoSXRlcmF0b3IgcGF0aCwgZG91YmxlIGZsYXRuZXNzLCBpbnQgbGltaXQpIHsKICAgICAgICAgaWYgKGZsYXRuZXNzIDwgMC4wKSB7CkBAIC0xNDksNyArMTg1LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBmbGF0dGVuaW5nIGZhY3Rvci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmbGF0dGVuaW5nIGZhY3RvcgorICAgICAqIEByZXR1cm4gdGhlIGZsYXR0ZW5pbmcgZmFjdG9yLgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgZ2V0RmxhdG5lc3MoKSB7CiAgICAgICAgIHJldHVybiBmbGF0bmVzczsKQEAgLTE1OCw3ICsxOTQsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN1YmRpdmlzaW9ucyBwZXIgY3VydmVkIHNlZ21lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3ViZGl2aXNpb25zIHBlciBjdXJ2ZWQgc2VnbWVudAorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIHN1YmRpdmlzaW9ucyBwZXIgY3VydmVkIHNlZ21lbnQuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRSZWN1cnNpb25MaW1pdCgpIHsKICAgICAgICAgcmV0dXJuIGJ1ZkxpbWl0OwpAQCAtMTczLDEyICsyMDksMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDYWxjdWxhdGVzIGZsYXQgcGF0aCBwb2ludHMgZm9yIGN1cnJlbnQgc2VnbWVudCBvZiB0aGUgc291cmNlIHNoYXBlLgotICAgICAqIAotICAgICAqIExpbmUgc2VnbWVudCBpcyBmbGF0IGJ5IGl0c2VsZi4gRmxhdG5lc3Mgb2YgcXVhZCBhbmQgY3ViaWMgY3VydmVzIGV2YWx1YXRlZCBieSBnZXRGbGF0bmVzc1NxKCkgbWV0aG9kLgotICAgICAqIEN1cnZlcyBzdWJkaXZpZGVkIHVudGlsIGN1cnJlbnQgZmxhdG5lc3MgaXMgYmlnZ2VyIHRoYW4gdXNlciBkZWZpbmVkIGFuZCBzdWJkaXZpc2lvbiBsaW1pdCBpc24ndCBleGhhdXN0ZWQuCi0gICAgICogU2luZ2xlIHNvdXJjZSBzZWdtZW50IHRyYW5zbGF0ZWQgdG8gc2VyaWVzIG9mIGJ1ZmZlciBwb2ludHMuIFRoZSBsZXNzIGZsYXRuZXNzIHRoZSBiaWdnZXIgc2Vycmllcy4KLSAgICAgKiBFdmVyeSBjdXJyZW50U2VnbWVudCgpIGNhbGwgZXh0cmFjdCBvbmUgcG9pbnQgZnJvbSB0aGUgYnVmZmVyLiBXaGVuIHNlcmllcyBjb21wbGV0ZWQgZXZhbHVhdGUoKSB0YWtlcyBuZXh0IHNvdXJjZSBzaGFwZSBzZWdtZW50LgorICAgICAqIENhbGN1bGF0ZXMgZmxhdCBwYXRoIHBvaW50cyBmb3IgY3VycmVudCBzZWdtZW50IG9mIHRoZSBzb3VyY2Ugc2hhcGUuIExpbmUKKyAgICAgKiBzZWdtZW50IGlzIGZsYXQgYnkgaXRzZWxmLiBGbGF0bmVzcyBvZiBxdWFkIGFuZCBjdWJpYyBjdXJ2ZXMgZXZhbHVhdGVkIGJ5CisgICAgICogZ2V0RmxhdG5lc3NTcSgpIG1ldGhvZC4gQ3VydmVzIHN1YmRpdmlkZWQgdW50aWwgY3VycmVudCBmbGF0bmVzcyBpcworICAgICAqIGJpZ2dlciB0aGFuIHVzZXIgZGVmaW5lZCBhbmQgc3ViZGl2aXNpb24gbGltaXQgaXNuJ3QgZXhoYXVzdGVkLiBTaW5nbGUKKyAgICAgKiBzb3VyY2Ugc2VnbWVudCB0cmFuc2xhdGVkIHRvIHNlcmllcyBvZiBidWZmZXIgcG9pbnRzLiBUaGUgbGVzcyBmbGF0bmVzcworICAgICAqIHRoZSBiaWdnZXIgc2VyaWVzLiBFdmVyeSBjdXJyZW50U2VnbWVudCgpIGNhbGwgZXh0cmFjdCBvbmUgcG9pbnQgZnJvbSB0aGUKKyAgICAgKiBidWZmZXIuIFdoZW4gc2VyaWVzIGNvbXBsZXRlZCBldmFsdWF0ZSgpIHRha2VzIG5leHQgc291cmNlIHNoYXBlIHNlZ21lbnQuCiAgICAgICovCiAgICAgdm9pZCBldmFsdWF0ZSgpIHsKICAgICAgICAgaWYgKGJ1ZkVtcHR5KSB7CkBAIC0xODYsOTkgKzIyMyw5NSBAQAogICAgICAgICB9CiAKICAgICAgICAgc3dpdGNoIChidWZUeXBlKSB7Ci0gICAgICAgIGNhc2UgU0VHX01PVkVUTzoKLSAgICAgICAgY2FzZSBTRUdfTElORVRPOgotICAgICAgICAgICAgcHggPSBjb29yZHNbMF07Ci0gICAgICAgICAgICBweSA9IGNvb3Jkc1sxXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNFR19RVUFEVE86Ci0gICAgICAgICAgICBpZiAoYnVmRW1wdHkpIHsKLSAgICAgICAgICAgICAgICBidWZJbmRleCAtPSA2OwotICAgICAgICAgICAgICAgIGJ1ZltidWZJbmRleCArIDBdID0gcHg7Ci0gICAgICAgICAgICAgICAgYnVmW2J1ZkluZGV4ICsgMV0gPSBweTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNvb3JkcywgMCwgYnVmLCBidWZJbmRleCArIDIsIDQpOwotICAgICAgICAgICAgICAgIGJ1ZlN1YmRpdiA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdoaWxlIChidWZTdWJkaXYgPCBidWZMaW1pdCkgewotICAgICAgICAgICAgICAgIGlmIChRdWFkQ3VydmUyRC5nZXRGbGF0bmVzc1NxKGJ1ZiwgYnVmSW5kZXgpIDwgZmxhdG5lc3MyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRUdfTU9WRVRPOgorICAgICAgICAgICAgY2FzZSBTRUdfTElORVRPOgorICAgICAgICAgICAgICAgIHB4ID0gY29vcmRzWzBdOworICAgICAgICAgICAgICAgIHB5ID0gY29vcmRzWzFdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRUdfUVVBRFRPOgorICAgICAgICAgICAgICAgIGlmIChidWZFbXB0eSkgeworICAgICAgICAgICAgICAgICAgICBidWZJbmRleCAtPSA2OworICAgICAgICAgICAgICAgICAgICBidWZbYnVmSW5kZXggKyAwXSA9IHB4OworICAgICAgICAgICAgICAgICAgICBidWZbYnVmSW5kZXggKyAxXSA9IHB5OworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNvb3JkcywgMCwgYnVmLCBidWZJbmRleCArIDIsIDQpOworICAgICAgICAgICAgICAgICAgICBidWZTdWJkaXYgPSAwOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIC8vIFJlYWxsb2MgYnVmZmVyCi0gICAgICAgICAgICAgICAgaWYgKGJ1ZkluZGV4IDw9IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRtcFtdID0gbmV3IGRvdWJsZVtidWZTaXplICsgQlVGRkVSX0NBUEFDSVRZXTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGJ1ZkluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCwgYnVmSW5kZXggKyBCVUZGRVJfQ0FQQUNJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSAtIGJ1ZkluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgYnVmID0gdG1wOwotICAgICAgICAgICAgICAgICAgICBidWZTaXplICs9IEJVRkZFUl9DQVBBQ0lUWTsKLSAgICAgICAgICAgICAgICAgICAgYnVmSW5kZXggKz0gQlVGRkVSX0NBUEFDSVRZOworICAgICAgICAgICAgICAgIHdoaWxlIChidWZTdWJkaXYgPCBidWZMaW1pdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoUXVhZEN1cnZlMkQuZ2V0RmxhdG5lc3NTcShidWYsIGJ1ZkluZGV4KSA8IGZsYXRuZXNzMikgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBSZWFsbG9jIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICBpZiAoYnVmSW5kZXggPD0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRtcFtdID0gbmV3IGRvdWJsZVtidWZTaXplICsgQlVGRkVSX0NBUEFDSVRZXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLCBidWZJbmRleCwgdG1wLCBidWZJbmRleCArIEJVRkZFUl9DQVBBQ0lUWSwgYnVmU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJ1ZkluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IHRtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlNpemUgKz0gQlVGRkVSX0NBUEFDSVRZOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmSW5kZXggKz0gQlVGRkVSX0NBUEFDSVRZOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgUXVhZEN1cnZlMkQuc3ViZGl2aWRlKGJ1ZiwgYnVmSW5kZXgsIGJ1ZiwgYnVmSW5kZXggLSA0LCBidWYsIGJ1ZkluZGV4KTsKKworICAgICAgICAgICAgICAgICAgICBidWZJbmRleCAtPSA0OworICAgICAgICAgICAgICAgICAgICBidWZTdWJkaXYrKzsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBRdWFkQ3VydmUyRC5zdWJkaXZpZGUoYnVmLCBidWZJbmRleCwgYnVmLCBidWZJbmRleCAtIDQsIGJ1ZiwgYnVmSW5kZXgpOworICAgICAgICAgICAgICAgIGJ1ZkluZGV4ICs9IDQ7CisgICAgICAgICAgICAgICAgcHggPSBidWZbYnVmSW5kZXhdOworICAgICAgICAgICAgICAgIHB5ID0gYnVmW2J1ZkluZGV4ICsgMV07CiAKLSAgICAgICAgICAgICAgICBidWZJbmRleCAtPSA0OwotICAgICAgICAgICAgICAgIGJ1ZlN1YmRpdisrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBidWZJbmRleCArPSA0OwotICAgICAgICAgICAgcHggPSBidWZbYnVmSW5kZXhdOwotICAgICAgICAgICAgcHkgPSBidWZbYnVmSW5kZXggKyAxXTsKLQotICAgICAgICAgICAgYnVmRW1wdHkgPSAoYnVmSW5kZXggPT0gYnVmU2l6ZSAtIDIpOwotICAgICAgICAgICAgaWYgKGJ1ZkVtcHR5KSB7Ci0gICAgICAgICAgICAgICAgYnVmSW5kZXggPSBidWZTaXplOwotICAgICAgICAgICAgICAgIGJ1ZlR5cGUgPSBTRUdfTElORVRPOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZTdWJkaXYtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNFR19DVUJJQ1RPOgotICAgICAgICAgICAgaWYgKGJ1ZkVtcHR5KSB7Ci0gICAgICAgICAgICAgICAgYnVmSW5kZXggLT0gODsKLSAgICAgICAgICAgICAgICBidWZbYnVmSW5kZXggKyAwXSA9IHB4OwotICAgICAgICAgICAgICAgIGJ1ZltidWZJbmRleCArIDFdID0gcHk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjb29yZHMsIDAsIGJ1ZiwgYnVmSW5kZXggKyAyLCA2KTsKLSAgICAgICAgICAgICAgICBidWZTdWJkaXYgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3aGlsZSAoYnVmU3ViZGl2IDwgYnVmTGltaXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoQ3ViaWNDdXJ2ZTJELmdldEZsYXRuZXNzU3EoYnVmLCBidWZJbmRleCkgPCBmbGF0bmVzczIpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgYnVmRW1wdHkgPSAoYnVmSW5kZXggPT0gYnVmU2l6ZSAtIDIpOworICAgICAgICAgICAgICAgIGlmIChidWZFbXB0eSkgeworICAgICAgICAgICAgICAgICAgICBidWZJbmRleCA9IGJ1ZlNpemU7CisgICAgICAgICAgICAgICAgICAgIGJ1ZlR5cGUgPSBTRUdfTElORVRPOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZlN1YmRpdi0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0VHX0NVQklDVE86CisgICAgICAgICAgICAgICAgaWYgKGJ1ZkVtcHR5KSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZkluZGV4IC09IDg7CisgICAgICAgICAgICAgICAgICAgIGJ1ZltidWZJbmRleCArIDBdID0gcHg7CisgICAgICAgICAgICAgICAgICAgIGJ1ZltidWZJbmRleCArIDFdID0gcHk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY29vcmRzLCAwLCBidWYsIGJ1ZkluZGV4ICsgMiwgNik7CisgICAgICAgICAgICAgICAgICAgIGJ1ZlN1YmRpdiA9IDA7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgLy8gUmVhbGxvYyBidWZmZXIKLSAgICAgICAgICAgICAgICBpZiAoYnVmSW5kZXggPD0gNikgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG1wW10gPSBuZXcgZG91YmxlW2J1ZlNpemUgKyBCVUZGRVJfQ0FQQUNJVFldOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYnVmSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wLCBidWZJbmRleCArIEJVRkZFUl9DQVBBQ0lUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZTaXplIC0gYnVmSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBidWYgPSB0bXA7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZlNpemUgKz0gQlVGRkVSX0NBUEFDSVRZOwotICAgICAgICAgICAgICAgICAgICBidWZJbmRleCArPSBCVUZGRVJfQ0FQQUNJVFk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGJ1ZlN1YmRpdiA8IGJ1ZkxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChDdWJpY0N1cnZlMkQuZ2V0RmxhdG5lc3NTcShidWYsIGJ1ZkluZGV4KSA8IGZsYXRuZXNzMikgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBSZWFsbG9jIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICBpZiAoYnVmSW5kZXggPD0gNikgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRtcFtdID0gbmV3IGRvdWJsZVtidWZTaXplICsgQlVGRkVSX0NBUEFDSVRZXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLCBidWZJbmRleCwgdG1wLCBidWZJbmRleCArIEJVRkZFUl9DQVBBQ0lUWSwgYnVmU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJ1ZkluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IHRtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlNpemUgKz0gQlVGRkVSX0NBUEFDSVRZOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmSW5kZXggKz0gQlVGRkVSX0NBUEFDSVRZOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQ3ViaWNDdXJ2ZTJELnN1YmRpdmlkZShidWYsIGJ1ZkluZGV4LCBidWYsIGJ1ZkluZGV4IC0gNiwgYnVmLCBidWZJbmRleCk7CisKKyAgICAgICAgICAgICAgICAgICAgYnVmSW5kZXggLT0gNjsKKyAgICAgICAgICAgICAgICAgICAgYnVmU3ViZGl2Kys7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgQ3ViaWNDdXJ2ZTJELnN1YmRpdmlkZShidWYsIGJ1ZkluZGV4LCBidWYsIGJ1ZkluZGV4IC0gNiwgYnVmLCBidWZJbmRleCk7CisgICAgICAgICAgICAgICAgYnVmSW5kZXggKz0gNjsKKyAgICAgICAgICAgICAgICBweCA9IGJ1ZltidWZJbmRleF07CisgICAgICAgICAgICAgICAgcHkgPSBidWZbYnVmSW5kZXggKyAxXTsKIAotICAgICAgICAgICAgICAgIGJ1ZkluZGV4IC09IDY7Ci0gICAgICAgICAgICAgICAgYnVmU3ViZGl2Kys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1ZkluZGV4ICs9IDY7Ci0gICAgICAgICAgICBweCA9IGJ1ZltidWZJbmRleF07Ci0gICAgICAgICAgICBweSA9IGJ1ZltidWZJbmRleCArIDFdOwotCi0gICAgICAgICAgICBidWZFbXB0eSA9IChidWZJbmRleCA9PSBidWZTaXplIC0gMik7Ci0gICAgICAgICAgICBpZiAoYnVmRW1wdHkpIHsKLSAgICAgICAgICAgICAgICBidWZJbmRleCA9IGJ1ZlNpemU7Ci0gICAgICAgICAgICAgICAgYnVmVHlwZSA9IFNFR19MSU5FVE87Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1ZlN1YmRpdi0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgYnVmRW1wdHkgPSAoYnVmSW5kZXggPT0gYnVmU2l6ZSAtIDIpOworICAgICAgICAgICAgICAgIGlmIChidWZFbXB0eSkgeworICAgICAgICAgICAgICAgICAgICBidWZJbmRleCA9IGJ1ZlNpemU7CisgICAgICAgICAgICAgICAgICAgIGJ1ZlR5cGUgPSBTRUdfTElORVRPOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZlN1YmRpdi0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgfQpAQCAtMzIzLDQgKzM1NiwzIEBACiAgICAgICAgIHJldHVybiB0eXBlOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2dlb20vR2VuZXJhbFBhdGguamF2YSBiL2F3dC9qYXZhL2F3dC9nZW9tL0dlbmVyYWxQYXRoLmphdmEKaW5kZXggMzZiMDFjNC4uMDY2OWJjNyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2dlb20vR2VuZXJhbFBhdGguamF2YQorKysgYi9hd3QvamF2YS9hd3QvZ2VvbS9HZW5lcmFsUGF0aC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIERlbmlzIE0uIEtpc2hlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5nZW9tOwogCiBpbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwpAQCAtMjgsODEgKzI5LDExNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBDbGFzcyBHZW5lcmFsUGF0aCByZXByZXNlbnRzIGEgc2hhcGUgd2hvc2Ugb3V0bGluZSBpcyBnaXZlbiAKLSAqIGJ5IGRpZmZlcmVudCB0eXBlcyBvZiBjdXJ2ZWQgYW5kIHN0cmFpZ2h0IHNlZ21lbnRzLgorICogVGhlIGNsYXNzIEdlbmVyYWxQYXRoIHJlcHJlc2VudHMgYSBzaGFwZSB3aG9zZSBvdXRsaW5lIGlzIGdpdmVuIGJ5IGRpZmZlcmVudAorICogdHlwZXMgb2YgY3VydmVkIGFuZCBzdHJhaWdodCBzZWdtZW50cy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBHZW5lcmFsUGF0aCBpbXBsZW1lbnRzIFNoYXBlLCBDbG9uZWFibGUgewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBXSU5EX0VWRU5fT0REIHNlZSB7QGxpbmsgUGF0aEl0ZXJhdG9yI1dJTkRfRVZFTl9PRER9LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBXSU5EX0VWRU5fT0REIHNlZSB7QGxpbmsgUGF0aEl0ZXJhdG9yI1dJTkRfRVZFTl9PRER9LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJTkRfRVZFTl9PREQgPSBQYXRoSXRlcmF0b3IuV0lORF9FVkVOX09ERDsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IFdJTkRfTk9OX1pFUk8gc2VlIHtAbGluayBQYXRoSXRlcmF0b3IjV0lORF9OT05fWkVST30uICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgV0lORF9OT05fWkVSTyBzZWUge0BsaW5rIFBhdGhJdGVyYXRvciNXSU5EX05PTl9aRVJPfS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSU5EX05PTl9aRVJPID0gUGF0aEl0ZXJhdG9yLldJTkRfTk9OX1pFUk87CiAKLSAgICAvKiogVGhlIGJ1ZmZlcnMgc2l6ZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgYnVmZmVycyBzaXplLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDEwOwotICAgIAotICAgIC8qKiBUaGUgYnVmZmVycyBjYXBhY2l0eS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBidWZmZXJzIGNhcGFjaXR5LgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfQ0FQQUNJVFkgPSAxMDsKIAotICAgIC8qKiBUaGUgcG9pbnQncyB0eXBlcyBidWZmZXIuICovCisgICAgLyoqCisgICAgICogVGhlIHBvaW50J3MgdHlwZXMgYnVmZmVyLgorICAgICAqLwogICAgIGJ5dGVbXSB0eXBlczsKLSAgICAKLSAgICAvKiogVGhlIHBvaW50cyBidWZmZXIuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgcG9pbnRzIGJ1ZmZlci4KKyAgICAgKi8KICAgICBmbG9hdFtdIHBvaW50czsKLSAgICAKLSAgICAvKiogVGhlIHBvaW50J3MgdHlwZSBidWZmZXIgc2l6ZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBwb2ludCdzIHR5cGUgYnVmZmVyIHNpemUuCisgICAgICovCiAgICAgaW50IHR5cGVTaXplOwotICAgIAotICAgIC8qKiBUaGUgcG9pbnRzIGJ1ZmZlciBzaXplLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHBvaW50cyBidWZmZXIgc2l6ZS4KKyAgICAgKi8KICAgICBpbnQgcG9pbnRTaXplOwotICAgIAotICAgIC8qKiBUaGUgcGF0aCBydWxlLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHBhdGggcnVsZS4KKyAgICAgKi8KICAgICBpbnQgcnVsZTsKIAotICAgIC8qKiBUaGUgc3BhY2UgYW1vdW50IGluIHBvaW50cyBidWZmZXIgZm9yIGRpZmZlcmVudCBzZWdtZW5ldCdzIHR5cGVzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzcGFjZSBhbW91bnQgaW4gcG9pbnRzIGJ1ZmZlciBmb3IgZGlmZmVyZW50IHNlZ21lbmV0J3MgdHlwZXMuCisgICAgICovCiAgICAgc3RhdGljIGludCBwb2ludFNoaWZ0W10gPSB7Ci0gICAgICAgICAgICAyLCAgLy8gTU9WRVRPCi0gICAgICAgICAgICAyLCAgLy8gTElORVRPCi0gICAgICAgICAgICA0LCAgLy8gUVVBRFRPCi0gICAgICAgICAgICA2LCAgLy8gQ1VCSUNUTwotICAgICAgICAgICAgMH07IC8vIENMT1NFCisgICAgICAgICAgICAyLCAvLyBNT1ZFVE8KKyAgICAgICAgICAgIDIsIC8vIExJTkVUTworICAgICAgICAgICAgNCwgLy8gUVVBRFRPCisgICAgICAgICAgICA2LCAvLyBDVUJJQ1RPCisgICAgICAgICAgICAwCisgICAgfTsgLy8gQ0xPU0UKIAogICAgIC8qCi0gICAgICogR2VuZXJhbFBhdGggcGF0aCBpdGVyYXRvciAKKyAgICAgKiBHZW5lcmFsUGF0aCBwYXRoIGl0ZXJhdG9yCiAgICAgICovCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIEl0ZXJhdG9yIGlzIHRoZSBzdWJjbGFzcyBvZiBJdGVyYXRvciBmb3IgdHJhdmVyc2luZyB0aGUgCi0gICAgICogb3V0bGluZSBvZiBhIEdlbmVyYWxQYXRoLgorICAgICAqIFRoZSBDbGFzcyBJdGVyYXRvciBpcyB0aGUgc3ViY2xhc3Mgb2YgSXRlcmF0b3IgZm9yIHRyYXZlcnNpbmcgdGhlIG91dGxpbmUKKyAgICAgKiBvZiBhIEdlbmVyYWxQYXRoLgogICAgICAqLwogICAgIGNsYXNzIEl0ZXJhdG9yIGltcGxlbWVudHMgUGF0aEl0ZXJhdG9yIHsKIAotICAgICAgICAvKiogVGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIGluIHR5cGVzIGJ1ZmZlci4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBpbiB0eXBlcyBidWZmZXIuCisgICAgICAgICAqLwogICAgICAgICBpbnQgdHlwZUluZGV4OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBpbiBwb2ludHMgYnVmZmVyLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gaW4gcG9pbnRzIGJ1ZmZlci4KKyAgICAgICAgICovCiAgICAgICAgIGludCBwb2ludEluZGV4OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBzb3VyY2UgR2VuZXJhbFBhdGggb2JqZWN0LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc291cmNlIEdlbmVyYWxQYXRoIG9iamVjdC4KKyAgICAgICAgICovCiAgICAgICAgIEdlbmVyYWxQYXRoIHA7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHBhdGggaXRlcmF0b3IgdHJhbnNmb3JtYXRpb24uICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwYXRoIGl0ZXJhdG9yIHRyYW5zZm9ybWF0aW9uLgorICAgICAgICAgKi8KICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHQ7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgR2VuZXJhbFBhdGguSXRlcmF0b3IgZm9yIGdpdmVuIGdlbmVyYWwgcGF0aAorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEdlbmVyYWxQYXRoLkl0ZXJhdG9yIGZvciBnaXZlbiBnZW5lcmFsIHBhdGguCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gcGF0aCAtIHRoZSBzb3VyY2UgR2VuZXJhbFBhdGggb2JqZWN0CisgICAgICAgICAqIEBwYXJhbSBwYXRoCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBHZW5lcmFsUGF0aCBvYmplY3QuCiAgICAgICAgICAqLwogICAgICAgICBJdGVyYXRvcihHZW5lcmFsUGF0aCBwYXRoKSB7CiAgICAgICAgICAgICB0aGlzKHBhdGgsIG51bGwpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgR2VuZXJhbFBhdGguSXRlcmF0b3IgZm9yIGdpdmVuIGdlbmVyYWwgcGF0aCBhbmQgdHJhbnNmb3JtYXRpb24KKyAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBHZW5lcmFsUGF0aC5JdGVyYXRvciBmb3IgZ2l2ZW4gZ2VuZXJhbCBwYXRoIGFuZAorICAgICAgICAgKiB0cmFuc2Zvcm1hdGlvbi4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBwYXRoIC0gdGhlIHNvdXJjZSBHZW5lcmFsUGF0aCBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIGF0IC0gdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgdG8gYXBwbHkgcmVjdGFuZ2xlIHBhdGgKKyAgICAgICAgICogQHBhcmFtIHBhdGgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgc291cmNlIEdlbmVyYWxQYXRoIG9iamVjdC4KKyAgICAgICAgICogQHBhcmFtIGF0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgdG8gYXBwbHkgcmVjdGFuZ2xlIHBhdGguCiAgICAgICAgICAqLwogICAgICAgICBJdGVyYXRvcihHZW5lcmFsUGF0aCBwYXRoLCBBZmZpbmVUcmFuc2Zvcm0gYXQpIHsKICAgICAgICAgICAgIHRoaXMucCA9IHBhdGg7CkBAIC0xNTYsMzMgKzE5MiwzNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBnZW5lcmFsIHBhdGggd2l0aCB0aGUgd2luZGluZyBydWxlIHNldCAKLSAgICAgKiB0byB7QGxpbmsgUGF0aEl0ZXJhdG9yI1dJTkRfTk9OX1pFUk99IGFuZCB0aGUgaW5pdGlhbCBjYXBhY2l0eQotICAgICAqIChudW1iZXIgb2Ygc2VnbWVudHMpIHNldCB0byB0aGUgZGVmYXVsdCB2YWx1ZSAxMC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZ2VuZXJhbCBwYXRoIHdpdGggdGhlIHdpbmRpbmcgcnVsZSBzZXQgdG8KKyAgICAgKiB7QGxpbmsgUGF0aEl0ZXJhdG9yI1dJTkRfTk9OX1pFUk99IGFuZCB0aGUgaW5pdGlhbCBjYXBhY2l0eSAobnVtYmVyIG9mCisgICAgICogc2VnbWVudHMpIHNldCB0byB0aGUgZGVmYXVsdCB2YWx1ZSAxMC4KICAgICAgKi8KICAgICBwdWJsaWMgR2VuZXJhbFBhdGgoKSB7CiAgICAgICAgIHRoaXMoV0lORF9OT05fWkVSTywgQlVGRkVSX1NJWkUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBnZW5lcmFsIHBhdGggd2l0aCB0aGUgZ2l2ZW4gd2luZGluZyBydWxlCi0gICAgICogIGFuZCB0aGUgaW5pdGlhbCBjYXBhY2l0eSAobnVtYmVyIG9mIHNlZ21lbnRzKSBzZXQgdG8gdGhlIAotICAgICAqICBkZWZhdWx0IHZhbHVlIDEwLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBnZW5lcmFsIHBhdGggd2l0aCB0aGUgZ2l2ZW4gd2luZGluZyBydWxlIGFuZCB0aGUKKyAgICAgKiBpbml0aWFsIGNhcGFjaXR5IChudW1iZXIgb2Ygc2VnbWVudHMpIHNldCB0byB0aGUgZGVmYXVsdCB2YWx1ZSAxMC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcnVsZSB0aGUgd2luZGluZyBydWxlLCBlaXRoZXIge0BsaW5rIFBhdGhJdGVyYXRvciNXSU5EX0VWRU5fT0REfQotICAgICAqIG9yIHtAbGluayBQYXRoSXRlcmF0b3IjV0lORF9OT05fWkVST30KKyAgICAgKiBAcGFyYW0gcnVsZQorICAgICAqICAgICAgICAgICAgdGhlIHdpbmRpbmcgcnVsZSwgZWl0aGVyIHtAbGluayBQYXRoSXRlcmF0b3IjV0lORF9FVkVOX09ERH0gb3IKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBQYXRoSXRlcmF0b3IjV0lORF9OT05fWkVST30uCiAgICAgICovCiAgICAgcHVibGljIEdlbmVyYWxQYXRoKGludCBydWxlKSB7CiAgICAgICAgIHRoaXMocnVsZSwgQlVGRkVSX1NJWkUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBnZW5lcmFsIHBhdGggd2l0aCB0aGUgZ2l2ZW4gd2luZGluZyBydWxlCi0gICAgICogYW5kIGluaXRpYWwgY2FwYWNpdHkgKG51bWJlciBvZiBzZWdtZW50cykuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGdlbmVyYWwgcGF0aCB3aXRoIHRoZSBnaXZlbiB3aW5kaW5nIHJ1bGUgYW5kIGluaXRpYWwKKyAgICAgKiBjYXBhY2l0eSAobnVtYmVyIG9mIHNlZ21lbnRzKS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcnVsZSB0aGUgd2luZGluZyBydWxlLCBlaXRoZXIge0BsaW5rIFBhdGhJdGVyYXRvciNXSU5EX0VWRU5fT0REfQotICAgICAqIG9yIHtAbGluayBQYXRoSXRlcmF0b3IjV0lORF9OT05fWkVST30KLSAgICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBudW1iZXIgb2Ygc2VnbWVudHMgdGhlIHBhdGggaXMgc2V0IHRvIGhvbGQKKyAgICAgKiBAcGFyYW0gcnVsZQorICAgICAqICAgICAgICAgICAgdGhlIHdpbmRpbmcgcnVsZSwgZWl0aGVyIHtAbGluayBQYXRoSXRlcmF0b3IjV0lORF9FVkVOX09ERH0gb3IKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBQYXRoSXRlcmF0b3IjV0lORF9OT05fWkVST30uCisgICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eQorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBzZWdtZW50cyB0aGUgcGF0aCBpcyBzZXQgdG8gaG9sZC4KICAgICAgKi8KICAgICBwdWJsaWMgR2VuZXJhbFBhdGgoaW50IHJ1bGUsIGludCBpbml0aWFsQ2FwYWNpdHkpIHsKICAgICAgICAgc2V0V2luZGluZ1J1bGUocnVsZSk7CkBAIC0xOTMsNyArMjMxLDggQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgbmV3IEdlbmVyYWxQYXRoIGZyb20gdGhlIG91dGxpbmUgb2YgdGhlIGdpdmVuIHNoYXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaGFwZSB0aGUgc2hhcGUKKyAgICAgKiBAcGFyYW0gc2hhcGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaGFwZS4KICAgICAgKi8KICAgICBwdWJsaWMgR2VuZXJhbFBhdGgoU2hhcGUgc2hhcGUpIHsKICAgICAgICAgdGhpcyhXSU5EX05PTl9aRVJPLCBCVUZGRVJfU0laRSk7CkBAIC0yMDMsMTQgKzI0MiwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHdpbmRpbmcgcnVsZSwgd2hpY2ggZGV0ZXJtaW5lcyBob3cgdG8gZGVjaWRlIHdoZXRoZXIgCi0gICAgICogYSBwb2ludCB0aGF0IGlzbid0IG9uIHRoZSBwYXRoIGl0c2VsZiBpcyBpbnNpZGUgb3Igb3V0c2lkZSBvZiAKLSAgICAgKiB0aGUgc2hhcGUuCisgICAgICogU2V0cyB0aGUgd2luZGluZyBydWxlLCB3aGljaCBkZXRlcm1pbmVzIGhvdyB0byBkZWNpZGUgd2hldGhlciBhIHBvaW50CisgICAgICogdGhhdCBpc24ndCBvbiB0aGUgcGF0aCBpdHNlbGYgaXMgaW5zaWRlIG9yIG91dHNpZGUgb2YgdGhlIHNoYXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBydWxlIHRoZSBuZXcgd2luZGluZyBydWxlCi0gICAgICogCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHdpbmRpbmcgcnVsZSBpcyBuZWl0aGVyCi0gICAgICoge0BsaW5rIFBhdGhJdGVyYXRvciNXSU5EX0VWRU5fT0REfSBub3Ige0BsaW5rIFBhdGhJdGVyYXRvciNXSU5EX05PTl9aRVJPfS4KKyAgICAgKiBAcGFyYW0gcnVsZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB3aW5kaW5nIHJ1bGUuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgd2luZGluZyBydWxlIGlzIG5laXRoZXIKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgUGF0aEl0ZXJhdG9yI1dJTkRfRVZFTl9PRER9IG5vcgorICAgICAqICAgICAgICAgICAgIHtAbGluayBQYXRoSXRlcmF0b3IjV0lORF9OT05fWkVST30uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0V2luZGluZ1J1bGUoaW50IHJ1bGUpIHsKICAgICAgICAgaWYgKHJ1bGUgIT0gV0lORF9FVkVOX09ERCAmJiBydWxlICE9IFdJTkRfTk9OX1pFUk8pIHsKQEAgLTIyMyw4ICsyNjMsOCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHdpbmRpbmcgcnVsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB3aW5kaW5nIHJ1bGUsIGVpdGhlciB7QGxpbmsgUGF0aEl0ZXJhdG9yI1dJTkRfRVZFTl9PRER9Ci0gICAgICogb3Ige0BsaW5rIFBhdGhJdGVyYXRvciNXSU5EX05PTl9aRVJPfQorICAgICAqIEByZXR1cm4gdGhlIHdpbmRpbmcgcnVsZSwgZWl0aGVyIHtAbGluayBQYXRoSXRlcmF0b3IjV0lORF9FVkVOX09ERH0gb3IKKyAgICAgKiAgICAgICAgIHtAbGluayBQYXRoSXRlcmF0b3IjV0lORF9OT05fWkVST30uCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRXaW5kaW5nUnVsZSgpIHsKICAgICAgICAgcmV0dXJuIHJ1bGU7CkBAIC0yMzIsMTUgKzI3MiwxNiBAQAogCiAgICAgLyoqCiAgICAgICogQ2hlY2tzIHRoZSBwb2ludCBkYXRhIGJ1ZmZlciBzaXplcyB0byBzZWUgd2hldGhlciBwb2ludENvdW50IGFkZGl0aW9uYWwKLSAgICAgKiBwb2ludC1kYXRhIGVsZW1lbnRzIGNhbiBmaXQuIChOb3RlIHRoYXQgdGhlIG51bWJlciBvZiBwb2ludCBkYXRhIAotICAgICAqIGVsZW1lbnRzIHRvIGFkZCBpcyBtb3JlIHRoYW4gb25lIHBlciBwb2ludCAtLSBpdCBkZXBlbmRzIG9uIHRoZSB0eXBlIAotICAgICAqIG9mIHBvaW50IGJlaW5nIGFkZGVkLikgUmVhbGxvY2F0ZXMgdGhlIGJ1ZmZlcnMgdG8gZW5sYXJnZSB0aGUgc2l6ZSBpZiBuZWNlc3NhcnkuCisgICAgICogcG9pbnQtZGF0YSBlbGVtZW50cyBjYW4gZml0LiAoTm90ZSB0aGF0IHRoZSBudW1iZXIgb2YgcG9pbnQgZGF0YSBlbGVtZW50cworICAgICAqIHRvIGFkZCBpcyBtb3JlIHRoYW4gb25lIHBlciBwb2ludCAtLSBpdCBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHBvaW50CisgICAgICogYmVpbmcgYWRkZWQuKSBSZWFsbG9jYXRlcyB0aGUgYnVmZmVycyB0byBlbmxhcmdlIHRoZSBzaXplIGlmIG5lY2Vzc2FyeS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcG9pbnRDb3VudCAtIHRoZSBudW1iZXIgb2YgcG9pbnQgZGF0YSBlbGVtZW50cyB0byBiZSBhZGRlZAotICAgICAqIEBwYXJhbSBjaGVja01vdmUgd2hldGhlciB0byBjaGVjayBmb3IgZXhpc3RpbmcgcG9pbnRzCi0gICAgICogCi0gICAgICogQHRocm93cyBJbGxlZ2FsUGF0aFN0YXRlRXhjZXB0aW9uIGNoZWNrTW92ZSBpcyB0cnVlIGFuZCB0aGUgCi0gICAgICogcGF0aCBpcyBjdXJyZW50bHkgZW1wdHkuCisgICAgICogQHBhcmFtIHBvaW50Q291bnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcG9pbnQgZGF0YSBlbGVtZW50cyB0byBiZSBhZGRlZC4KKyAgICAgKiBAcGFyYW0gY2hlY2tNb3ZlCisgICAgICogICAgICAgICAgICB3aGV0aGVyIHRvIGNoZWNrIGZvciBleGlzdGluZyBwb2ludHMuCisgICAgICogQHRocm93cyBJbGxlZ2FsUGF0aFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgY2hlY2tNb3ZlIGlzIHRydWUgYW5kIHRoZSBwYXRoIGlzIGN1cnJlbnRseSBlbXB0eS4KICAgICAgKi8KICAgICB2b2lkIGNoZWNrQnVmKGludCBwb2ludENvdW50LCBib29sZWFuIGNoZWNrTW92ZSkgewogICAgICAgICBpZiAoY2hlY2tNb3ZlICYmIHR5cGVTaXplID09IDApIHsKQEAgLTI2MCwxMSArMzAxLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXBwZW5kcyBhIG5ldyBwb2ludCB0byB0aGUgZW5kIG9mIHRoaXMgZ2VuZXJhbCBwYXRoLCBkaXNjb25uZWN0ZWQKLSAgICAgKiBmcm9tIHRoZSBleGlzdGluZyBwYXRoLgorICAgICAqIEFwcGVuZHMgYSBuZXcgcG9pbnQgdG8gdGhlIGVuZCBvZiB0aGlzIGdlbmVyYWwgcGF0aCwgZGlzY29ubmVjdGVkIGZyb20KKyAgICAgKiB0aGUgZXhpc3RpbmcgcGF0aC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBuZXh0IHBvaW50IHRvIGFwcGVuZAotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIG5leHQgcG9pbnQgdG8gYXBwZW5kCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIG5leHQgcG9pbnQgdG8gYXBwZW5kLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBuZXh0IHBvaW50IHRvIGFwcGVuZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBtb3ZlVG8oZmxvYXQgeCwgZmxvYXQgeSkgewogICAgICAgICBpZiAodHlwZVNpemUgPiAwICYmIHR5cGVzW3R5cGVTaXplIC0gMV0gPT0gUGF0aEl0ZXJhdG9yLlNFR19NT1ZFVE8pIHsKQEAgLTI3OSwxMiArMzIyLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXBwZW5kcyBhIG5ldyBzZWdtZW50IHRvIHRoZSBlbmQgb2YgdGhpcyBnZW5lcmFsIHBhdGggYnkgbWFraW5nIAotICAgICAqIGEgc3RyYWlnaHQgbGluZSBzZWdtZW50IGZyb20gdGhlIGN1cnJlbnQgZW5kcG9pbnQgdG8gdGhlIAotICAgICAqIGdpdmVuIG5ldyBwb2ludC4KKyAgICAgKiBBcHBlbmRzIGEgbmV3IHNlZ21lbnQgdG8gdGhlIGVuZCBvZiB0aGlzIGdlbmVyYWwgcGF0aCBieSBtYWtpbmcgYQorICAgICAqIHN0cmFpZ2h0IGxpbmUgc2VnbWVudCBmcm9tIHRoZSBjdXJyZW50IGVuZHBvaW50IHRvIHRoZSBnaXZlbiBuZXcgcG9pbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbmV4dCBwb2ludCB0byBhcHBlbmQKLSAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBuZXh0IHBvaW50IHRvIGFwcGVuZAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBuZXh0IHBvaW50IHRvIGFwcGVuZC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbmV4dCBwb2ludCB0byBhcHBlbmQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbGluZVRvKGZsb2F0IHgsIGZsb2F0IHkpIHsKICAgICAgICAgY2hlY2tCdWYoMiwgdHJ1ZSk7CkBAIC0yOTQsMTQgKzMzOCwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFwcGVuZHMgYSBuZXcgc2VnbWVudCB0byB0aGUgZW5kIG9mIHRoaXMgZ2VuZXJhbCBwYXRoIGJ5IG1ha2luZyAKLSAgICAgKiBhIHF1YWRyYXRpYyBjdXJ2ZSBmcm9tIHRoZSBjdXJyZW50IGVuZHBvaW50IHRvIHRoZSBwb2ludCAoeDIsIHkyKQotICAgICAqIHVzaW5nIHRoZSBwb2ludCAoeDEsIHkxKSBhcyB0aGUgcXVhZHJhdGljIGN1cnZlJ3MgY29udHJvbCBwb2ludC4KKyAgICAgKiBBcHBlbmRzIGEgbmV3IHNlZ21lbnQgdG8gdGhlIGVuZCBvZiB0aGlzIGdlbmVyYWwgcGF0aCBieSBtYWtpbmcgYQorICAgICAqIHF1YWRyYXRpYyBjdXJ2ZSBmcm9tIHRoZSBjdXJyZW50IGVuZHBvaW50IHRvIHRoZSBwb2ludCAoeDIsIHkyKSB1c2luZyB0aGUKKyAgICAgKiBwb2ludCAoeDEsIHkxKSBhcyB0aGUgcXVhZHJhdGljIGN1cnZlJ3MgY29udHJvbCBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcXVhZHJhdGljIGN1cnZlJ3MgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBxdWFkcmF0aWMgY3VydmUncyBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHF1YWRyYXRpYyBjdXJ2ZSdzIGVuZCBwb2ludAotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBxdWFkcmF0aWMgY3VydmUncyBlbmQgcG9pbnQKKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHF1YWRyYXRpYyBjdXJ2ZSdzIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBxdWFkcmF0aWMgY3VydmUncyBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcXVhZHJhdGljIGN1cnZlJ3MgZW5kIHBvaW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcXVhZHJhdGljIGN1cnZlJ3MgZW5kIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHF1YWRUbyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MikgewogICAgICAgICBjaGVja0J1Zig0LCB0cnVlKTsKQEAgLTMxMywxOCArMzYxLDI3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXBwZW5kcyBhIG5ldyBzZWdtZW50IHRvIHRoZSBlbmQgb2YgdGhpcyBnZW5lcmFsIHBhdGggYnkgbWFraW5nIAotICAgICAqIGEgY3ViaWMgY3VydmUgZnJvbSB0aGUgY3VycmVudCBlbmRwb2ludCB0byB0aGUgcG9pbnQgKHgzLCB5MykKLSAgICAgKiB1c2luZyAoeDEsIHkxKSBhbmQgKHgyLCB5MikgYXMgY29udHJvbCBwb2ludHMuCisgICAgICogQXBwZW5kcyBhIG5ldyBzZWdtZW50IHRvIHRoZSBlbmQgb2YgdGhpcyBnZW5lcmFsIHBhdGggYnkgbWFraW5nIGEgY3ViaWMKKyAgICAgKiBjdXJ2ZSBmcm9tIHRoZSBjdXJyZW50IGVuZHBvaW50IHRvIHRoZSBwb2ludCAoeDMsIHkzKSB1c2luZyAoeDEsIHkxKSBhbmQKKyAgICAgKiAoeDIsIHkyKSBhcyBjb250cm9sIHBvaW50cy4KICAgICAgKiAKICAgICAgKiBAc2VlIGphdmEuYXd0Lmdlb20uQ3ViaWNDdXJ2ZTJECi0gICAgICogCi0gICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBjdWJpYyBzZWdtZW50J3MgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBuZXcgY3ViaWMgc2VnbWVudCdzIGZpcnN0IGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbmV3IGN1YmljIHNlZ21lbnQncyBzZWNvbmQgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBuZXcgY3ViaWMgc2VnbWVudCdzIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHgzIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBjdWJpYyBzZWdtZW50J3MgZW5kIHBvaW50Ci0gICAgICogQHBhcmFtIHkzIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBjdWJpYyBzZWdtZW50J3MgZW5kIHBvaW50CisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBuZXcgY3ViaWMgc2VnbWVudCdzIGZpcnN0IGNvbnRyb2wKKyAgICAgKiAgICAgICAgICAgIHBvaW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbmV3IGN1YmljIHNlZ21lbnQncyBmaXJzdCBjb250cm9sCisgICAgICogICAgICAgICAgICBwb2ludC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBjdWJpYyBzZWdtZW50J3Mgc2Vjb25kIGNvbnRyb2wKKyAgICAgKiAgICAgICAgICAgIHBvaW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbmV3IGN1YmljIHNlZ21lbnQncyBzZWNvbmQgY29udHJvbAorICAgICAqICAgICAgICAgICAgcG9pbnQuCisgICAgICogQHBhcmFtIHgzCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBuZXcgY3ViaWMgc2VnbWVudCdzIGVuZCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTMKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBjdWJpYyBzZWdtZW50J3MgZW5kIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGN1cnZlVG8oZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHgzLCBmbG9hdCB5MykgewogICAgICAgICBjaGVja0J1Zig2LCB0cnVlKTsKQEAgLTMzOCw4ICszOTUsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFwcGVuZHMgdGhlIHR5cGUgaW5mb3JtYXRpb24gdG8gZGVjbGFyZSB0aGF0IHRoZSBjdXJyZW50Ci0gICAgICogZW5kcG9pbnQgY2xvc2VzIHRoZSBjdXJ2ZS4KKyAgICAgKiBBcHBlbmRzIHRoZSB0eXBlIGluZm9ybWF0aW9uIHRvIGRlY2xhcmUgdGhhdCB0aGUgY3VycmVudCBlbmRwb2ludCBjbG9zZXMKKyAgICAgKiB0aGUgY3VydmUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xvc2VQYXRoKCkgewogICAgICAgICBpZiAodHlwZVNpemUgPT0gMCB8fCB0eXBlc1t0eXBlU2l6ZSAtIDFdICE9IFBhdGhJdGVyYXRvci5TRUdfQ0xPU0UpIHsKQEAgLTM0OSwxNSArNDA2LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXBwZW5kcyB0aGUgb3V0bGluZSBvZiB0aGUgc3BlY2lmaWVkIHNoYXBlIG9udG8gdGhlIGVuZCAKLSAgICAgKiBvZiB0aGlzIEdlbmVyYWxQYXRoLgorICAgICAqIEFwcGVuZHMgdGhlIG91dGxpbmUgb2YgdGhlIHNwZWNpZmllZCBzaGFwZSBvbnRvIHRoZSBlbmQgb2YgdGhpcworICAgICAqIEdlbmVyYWxQYXRoLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaGFwZSB0aGUgc2hhcGUgd2hvc2Ugb3V0bGluZSBpcyB0byBiZSBhcHBlbmRlZAotICAgICAqIEBwYXJhbSBjb25uZWN0IHRydWUgdG8gY29ubmVjdCB0aGlzIHBhdGgncyBjdXJyZW50IAotICAgICAqIGVuZHBvaW50IHRvIHRoZSBmaXJzdCBwb2ludCBvZiB0aGUgc2hhcGUncyBvdXRsaW5lIG9yIAotICAgICAqIGZhbHNlIHRvIGFwcGVuZCB0aGUgc2hhcGUncyBvdXRsaW5lIHdpdGhvdXQgY29ubmVjdGluZyBpdAotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHNoYXBlIHBhcmFtZXRlciBpcyBudWxsCisgICAgICogQHBhcmFtIHNoYXBlCisgICAgICogICAgICAgICAgICB0aGUgc2hhcGUgd2hvc2Ugb3V0bGluZSBpcyB0byBiZSBhcHBlbmRlZC4KKyAgICAgKiBAcGFyYW0gY29ubmVjdAorICAgICAqICAgICAgICAgICAgdHJ1ZSB0byBjb25uZWN0IHRoaXMgcGF0aCdzIGN1cnJlbnQgZW5kcG9pbnQgdG8gdGhlIGZpcnN0CisgICAgICogICAgICAgICAgICBwb2ludCBvZiB0aGUgc2hhcGUncyBvdXRsaW5lIG9yIGZhbHNlIHRvIGFwcGVuZCB0aGUgc2hhcGUncworICAgICAqICAgICAgICAgICAgb3V0bGluZSB3aXRob3V0IGNvbm5lY3RpbmcgaXQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaGFwZSBwYXJhbWV0ZXIgaXMgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhcHBlbmQoU2hhcGUgc2hhcGUsIGJvb2xlYW4gY29ubmVjdCkgewogICAgICAgICBQYXRoSXRlcmF0b3IgcCA9IHNoYXBlLmdldFBhdGhJdGVyYXRvcihudWxsKTsKQEAgLTM2NSw0MiArNDI0LDQzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXBwZW5kcyB0aGUgcGF0aCBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQgUGF0aEl0ZXJhdG9yIG9udG8gdGhlIGVuZCAKLSAgICAgKiBvZiB0aGlzIEdlbmVyYWxQYXRoLgorICAgICAqIEFwcGVuZHMgdGhlIHBhdGggZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkIFBhdGhJdGVyYXRvciBvbnRvIHRoZSBlbmQgb2YKKyAgICAgKiB0aGlzIEdlbmVyYWxQYXRoLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwYXRoIHRoZSBQYXRoSXRlcmF0b3IgdGhhdCBkZWZpbmVzIHRoZSBuZXcgcGF0aCB0byBhcHBlbmQKLSAgICAgKiBAcGFyYW0gY29ubmVjdCB0cnVlIHRvIGNvbm5lY3QgdGhpcyBwYXRoJ3MgY3VycmVudCAKLSAgICAgKiBlbmRwb2ludCB0byB0aGUgZmlyc3QgcG9pbnQgb2YgdGhlIHNoYXBlJ3Mgb3V0bGluZSBvciAKLSAgICAgKiBmYWxzZSB0byBhcHBlbmQgdGhlIHNoYXBlJ3Mgb3V0bGluZSB3aXRob3V0IGNvbm5lY3RpbmcgaXQKKyAgICAgKiBAcGFyYW0gcGF0aAorICAgICAqICAgICAgICAgICAgdGhlIFBhdGhJdGVyYXRvciB0aGF0IGRlZmluZXMgdGhlIG5ldyBwYXRoIHRvIGFwcGVuZC4KKyAgICAgKiBAcGFyYW0gY29ubmVjdAorICAgICAqICAgICAgICAgICAgdHJ1ZSB0byBjb25uZWN0IHRoaXMgcGF0aCdzIGN1cnJlbnQgZW5kcG9pbnQgdG8gdGhlIGZpcnN0CisgICAgICogICAgICAgICAgICBwb2ludCBvZiB0aGUgc2hhcGUncyBvdXRsaW5lIG9yIGZhbHNlIHRvIGFwcGVuZCB0aGUgc2hhcGUncworICAgICAqICAgICAgICAgICAgb3V0bGluZSB3aXRob3V0IGNvbm5lY3RpbmcgaXQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYXBwZW5kKFBhdGhJdGVyYXRvciBwYXRoLCBib29sZWFuIGNvbm5lY3QpIHsKICAgICAgICAgd2hpbGUgKCFwYXRoLmlzRG9uZSgpKSB7CiAgICAgICAgICAgICBmbG9hdCBjb29yZHNbXSA9IG5ldyBmbG9hdFs2XTsKICAgICAgICAgICAgIHN3aXRjaCAocGF0aC5jdXJyZW50U2VnbWVudChjb29yZHMpKSB7Ci0gICAgICAgICAgICBjYXNlIFBhdGhJdGVyYXRvci5TRUdfTU9WRVRPOgotICAgICAgICAgICAgICAgIGlmICghY29ubmVjdCB8fCB0eXBlU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vdmVUbyhjb29yZHNbMF0sIGNvb3Jkc1sxXSk7CisgICAgICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX01PVkVUTzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25uZWN0IHx8IHR5cGVTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVUbyhjb29yZHNbMF0sIGNvb3Jkc1sxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodHlwZXNbdHlwZVNpemUgLSAxXSAhPSBQYXRoSXRlcmF0b3IuU0VHX0NMT1NFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcG9pbnRzW3BvaW50U2l6ZSAtIDJdID09IGNvb3Jkc1swXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBvaW50c1twb2ludFNpemUgLSAxXSA9PSBjb29yZHNbMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIE5PIEJSRUFLOworICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19MSU5FVE86CisgICAgICAgICAgICAgICAgICAgIGxpbmVUbyhjb29yZHNbMF0sIGNvb3Jkc1sxXSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodHlwZXNbdHlwZVNpemUgLSAxXSAhPSBQYXRoSXRlcmF0b3IuU0VHX0NMT1NFICYmCi0gICAgICAgICAgICAgICAgICAgIHBvaW50c1twb2ludFNpemUgLSAyXSA9PSBjb29yZHNbMF0gJiYKLSAgICAgICAgICAgICAgICAgICAgcG9pbnRzW3BvaW50U2l6ZSAtIDFdID09IGNvb3Jkc1sxXSkKLSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX1FVQURUTzoKKyAgICAgICAgICAgICAgICAgICAgcXVhZFRvKGNvb3Jkc1swXSwgY29vcmRzWzFdLCBjb29yZHNbMl0sIGNvb3Jkc1szXSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIE5PIEJSRUFLOwotICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0xJTkVUTzoKLSAgICAgICAgICAgICAgICBsaW5lVG8oY29vcmRzWzBdLCBjb29yZHNbMV0pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX1FVQURUTzoKLSAgICAgICAgICAgICAgICBxdWFkVG8oY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3Jkc1syXSwgY29vcmRzWzNdKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19DVUJJQ1RPOgotICAgICAgICAgICAgICAgIGN1cnZlVG8oY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3Jkc1syXSwgY29vcmRzWzNdLCBjb29yZHNbNF0sIGNvb3Jkc1s1XSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBhdGhJdGVyYXRvci5TRUdfQ0xPU0U6Ci0gICAgICAgICAgICAgICAgY2xvc2VQYXRoKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0NVQklDVE86CisgICAgICAgICAgICAgICAgICAgIGN1cnZlVG8oY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3Jkc1syXSwgY29vcmRzWzNdLCBjb29yZHNbNF0sIGNvb3Jkc1s1XSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19DTE9TRToKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcGF0aC5uZXh0KCk7CiAgICAgICAgICAgICBjb25uZWN0ID0gZmFsc2U7CkBAIC00MTAsNyArNDcwLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGVuZCBwb2ludCBvZiB0aGUgcGF0aC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGVuZCBwb2ludCBvZiB0aGUgcGF0aAorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgZW5kIHBvaW50IG9mIHRoZSBwYXRoLgogICAgICAqLwogICAgIHB1YmxpYyBQb2ludDJEIGdldEN1cnJlbnRQb2ludCgpIHsKICAgICAgICAgaWYgKHR5cGVTaXplID09IDApIHsKQEAgLTQzMSw5ICs0OTEsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlc2V0cyB0aGUgR2VuZXJhbFBhdGggdG8gYmVpbmcgYW4gZW1wdHkgcGF0aC4gVGhlIHVuZGVybHlpbmcKLSAgICAgKiBwb2ludCBhbmQgc2VnbWVudCBkYXRhIGlzIG5vdCBkZWxldGVkIGJ1dCByYXRoZXIgdGhlIGVuZCBpbmRpY2VzCi0gICAgICogb2YgdGhlIGRhdGEgYXJyYXlzIGFyZSBzZXQgdG8gemVyby4KKyAgICAgKiBSZXNldHMgdGhlIEdlbmVyYWxQYXRoIHRvIGJlaW5nIGFuIGVtcHR5IHBhdGguIFRoZSB1bmRlcmx5aW5nIHBvaW50IGFuZAorICAgICAqIHNlZ21lbnQgZGF0YSBpcyBub3QgZGVsZXRlZCBidXQgcmF0aGVyIHRoZSBlbmQgaW5kaWNlcyBvZiB0aGUgZGF0YSBhcnJheXMKKyAgICAgKiBhcmUgc2V0IHRvIHplcm8uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CiAgICAgICAgIHR5cGVTaXplID0gMDsKQEAgLTQ0MSwyMyArNTAxLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVHJhbnNmb3JtIGFsbCBvZiB0aGUgY29vcmRpbmF0ZXMgb2YgdGhpcyBwYXRoIGFjY29yZGluZyB0byB0aGUKLSAgICAgKiBzcGVjaWZpZWQgQWZmaW5lVHJhbnNmb3JtLgorICAgICAqIFRyYW5zZm9ybSBhbGwgb2YgdGhlIGNvb3JkaW5hdGVzIG9mIHRoaXMgcGF0aCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIEFmZmluZVRyYW5zZm9ybS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdCB0aGUgQWZmaW5lVHJhbnNmb3JtCisgICAgICogQHBhcmFtIHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBBZmZpbmVUcmFuc2Zvcm0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdHJhbnNmb3JtKEFmZmluZVRyYW5zZm9ybSB0KSB7CiAgICAgICAgIHQudHJhbnNmb3JtKHBvaW50cywgMCwgcG9pbnRzLCAwLCBwb2ludFNpemUgLyAyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEdlbmVyYWxQYXRoIHdob3NlIGRhdGEgaXMgZ2l2ZW4gYnkgdGhpcyBwYXRoJ3MgCi0gICAgICogZGF0YSB0cmFuc2Zvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0uCisgICAgICogQ3JlYXRlcyBhIG5ldyBHZW5lcmFsUGF0aCB3aG9zZSBkYXRhIGlzIGdpdmVuIGJ5IHRoaXMgcGF0aCdzIGRhdGEKKyAgICAgKiB0cmFuc2Zvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHQgdGhlIEFmZmluZVRyYW5zZm9ybQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBHZW5lcmFsUGF0aCB3aG9zZSBkYXRhIGlzIGdpdmVuIGJ5IHRoaXMgcGF0aCdzIAotICAgICAqIGRhdGEgdHJhbnNmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgQWZmaW5lVHJhbnNmb3JtCisgICAgICogQHBhcmFtIHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBBZmZpbmVUcmFuc2Zvcm0uCisgICAgICogQHJldHVybiB0aGUgbmV3IEdlbmVyYWxQYXRoIHdob3NlIGRhdGEgaXMgZ2l2ZW4gYnkgdGhpcyBwYXRoJ3MgZGF0YQorICAgICAqICAgICAgICAgdHJhbnNmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgQWZmaW5lVHJhbnNmb3JtLgogICAgICAqLwogICAgIHB1YmxpYyBTaGFwZSBjcmVhdGVUcmFuc2Zvcm1lZFNoYXBlKEFmZmluZVRyYW5zZm9ybSB0KSB7CiAgICAgICAgIEdlbmVyYWxQYXRoIHAgPSAoR2VuZXJhbFBhdGgpY2xvbmUoKTsKQEAgLTQ4MCwxNiArNTQxLDE0IEBACiAgICAgICAgICAgICAgICAgZmxvYXQgeCA9IHBvaW50c1tpLS1dOwogICAgICAgICAgICAgICAgIGlmICh4IDwgcngxKSB7CiAgICAgICAgICAgICAgICAgICAgIHJ4MSA9IHg7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGlmICh4ID4gcngyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByeDIgPSB4OwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh4ID4gcngyKSB7CisgICAgICAgICAgICAgICAgICAgIHJ4MiA9IHg7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICh5IDwgcnkxKSB7CiAgICAgICAgICAgICAgICAgICAgIHJ5MSA9IHk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGlmICh5ID4gcnkyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByeTIgPSB5OwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5ID4gcnkyKSB7CisgICAgICAgICAgICAgICAgICAgIHJ5MiA9IHk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlMkQuRmxvYXQocngxLCByeTEsIHJ4MiAtIHJ4MSwgcnkyIC0gcnkxKTsKQEAgLTUwMCwxNCArNTU5LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHRoZSBjcm9zcyBjb3VudCAobnVtYmVyIG9mIHRpbWVzIGEgcmF5IGZyb20gdGhlIHBvaW50IAotICAgICAqIGNyb3NzZXMgdGhlIHNoYXBlJ3MgYm91bmRhcnkpIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBudW1iZXIgCi0gICAgICogb2YgY3Jvc3NpbmdzIGNvcnJlc3BvbmRzIHRvIGEgcG9pbnQgaW5zaWRlIHRoZSBzaGFwZSBvciBub3QKLSAgICAgKiAoYWNjb3JkaW5nIHRvIHRoZSBzaGFwZSdzIHBhdGggcnVsZSkuCisgICAgICogQ2hlY2tzIHRoZSBjcm9zcyBjb3VudCAobnVtYmVyIG9mIHRpbWVzIGEgcmF5IGZyb20gdGhlIHBvaW50IGNyb3NzZXMgdGhlCisgICAgICogc2hhcGUncyBib3VuZGFyeSkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG51bWJlciBvZiBjcm9zc2luZ3MKKyAgICAgKiBjb3JyZXNwb25kcyB0byBhIHBvaW50IGluc2lkZSB0aGUgc2hhcGUgb3Igbm90IChhY2NvcmRpbmcgdG8gdGhlIHNoYXBlJ3MKKyAgICAgKiBwYXRoIHJ1bGUpLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjcm9zcyAtIHRoZSBwb2ludCdzIGNyb3NzIGNvdW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwb2ludCBpcyBpbnNpZGUgdGhlIHBhdGgsIG9yIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEBwYXJhbSBjcm9zcworICAgICAqICAgICAgICAgICAgdGhlIHBvaW50J3MgY3Jvc3MgY291bnQuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwb2ludCBpcyBpbnNpZGUgdGhlIHBhdGgsIG9yIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBib29sZWFuIGlzSW5zaWRlKGludCBjcm9zcykgewogICAgICAgICBpZiAocnVsZSA9PSBXSU5EX05PTl9aRVJPKSB7CkBAIC01NTMsNyArNjEyLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgR2VuZXJhbFBhdGggcCA9IChHZW5lcmFsUGF0aCkgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgICAgIEdlbmVyYWxQYXRoIHAgPSAoR2VuZXJhbFBhdGgpc3VwZXIuY2xvbmUoKTsKICAgICAgICAgICAgIHAudHlwZXMgPSB0eXBlcy5jbG9uZSgpOwogICAgICAgICAgICAgcC5wb2ludHMgPSBwb2ludHMuY2xvbmUoKTsKICAgICAgICAgICAgIHJldHVybiBwOwpAQCAtNTYzLDQgKzYyMiwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9nZW9tL0lsbGVnYWxQYXRoU3RhdGVFeGNlcHRpb24uamF2YSBiL2F3dC9qYXZhL2F3dC9nZW9tL0lsbGVnYWxQYXRoU3RhdGVFeGNlcHRpb24uamF2YQppbmRleCA3ZjQ1OWU3Li43NTBiYTI5IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZ2VvbS9JbGxlZ2FsUGF0aFN0YXRlRXhjZXB0aW9uLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2dlb20vSWxsZWdhbFBhdGhTdGF0ZUV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwxNiArMTgsMjEgQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0Lmdlb207CiAKIC8qKgotICogVGhlIENsYXNzIElsbGVnYWxQYXRoU3RhdGVFeGNlcHRpb24gaW5kaWNhdGVzIGVycm9ycyB3aGVyZSB0aGUgCi0gKiBjdXJyZW50IHN0YXRlIG9mIGEgcGF0aCBvYmplY3QgaXMgaW1jb21wYXRpYmxlIHdpdGggdGhlIGRlc2lyZWQgCi0gKiBhY3Rpb24sIHN1Y2ggYXMgcGVyZm9ybWluZyBub24tdHJpdmlhbCBhY3Rpb25zIG9uIGFuIGVtcHR5IHBhdGguCisgKiBUaGUgQ2xhc3MgSWxsZWdhbFBhdGhTdGF0ZUV4Y2VwdGlvbiBpbmRpY2F0ZXMgZXJyb3JzIHdoZXJlIHRoZSBjdXJyZW50IHN0YXRlCisgKiBvZiBhIHBhdGggb2JqZWN0IGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBkZXNpcmVkIGFjdGlvbiwgc3VjaCBhcyBwZXJmb3JtaW5nCisgKiBub24tdHJpdmlhbCBhY3Rpb25zIG9uIGFuIGVtcHR5IHBhdGguCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSWxsZWdhbFBhdGhTdGF0ZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MTU4MDg0MjA1MjIwNDgxMDk0TDsKIAogICAgIC8qKgpAQCAtMzcsMTQgKzQyLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGlsbGVnYWwgcGF0aCBzdGF0ZSBleGNlcHRpb24gd2l0aCB0aGUgCi0gICAgICogc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBpbGxlZ2FsIHBhdGggc3RhdGUgZXhjZXB0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBkZXRhaWwKKyAgICAgKiBtZXNzYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSBkZXRhaWxzIG9mIHRoZSBlcnJvcgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlscyBvZiB0aGUgZXJyb3IuCiAgICAgICovCiAgICAgcHVibGljIElsbGVnYWxQYXRoU3RhdGVFeGNlcHRpb24oU3RyaW5nIHMpIHsKICAgICAgICAgc3VwZXIocyk7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9nZW9tL0xpbmUyRC5qYXZhIGIvYXd0L2phdmEvYXd0L2dlb20vTGluZTJELmphdmEKaW5kZXggYTUzYzQ3MC4uZmNkNTFiNiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2dlb20vTGluZTJELmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2dlb20vTGluZTJELmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0Lmdlb207CiAKIGltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7CkBAIC0yNyw1NSArMjgsNzEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgTGluZTJEIHJlcHJlc2VudHMgYSBsaW5lIHdob3NlIGRhdGEgaXMgZ2l2ZW4gaW4gCi0gKiBoaWdoLXByZWNpc2lvbiB2YWx1ZXMgYXBwcm9wcmlhdGUgZm9yIGdyYXBoaWNhbCBvcGVyYXRpb25zLgorICogVGhlIENsYXNzIExpbmUyRCByZXByZXNlbnRzIGEgbGluZSB3aG9zZSBkYXRhIGlzIGdpdmVuIGluIGhpZ2gtcHJlY2lzaW9uCisgKiB2YWx1ZXMgYXBwcm9wcmlhdGUgZm9yIGdyYXBoaWNhbCBvcGVyYXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIExpbmUyRCBpbXBsZW1lbnRzIFNoYXBlLCBDbG9uZWFibGUgewogCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIEZsb2F0IGlzIHRoZSBzdWJjbGFzcyBvZiBMaW5lMkQgdGhhdCBoYXMgYWxsIAotICAgICAqIG9mIGl0cyBkYXRhIHZhbHVlcyBzdG9yZWQgd2l0aCBmbG9hdC1sZXZlbCBwcmVjaXNpb24uCisgICAgICogVGhlIENsYXNzIEZsb2F0IGlzIHRoZSBzdWJjbGFzcyBvZiBMaW5lMkQgdGhhdCBoYXMgYWxsIG9mIGl0cyBkYXRhIHZhbHVlcworICAgICAqIHN0b3JlZCB3aXRoIGZsb2F0LWxldmVsIHByZWNpc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZsb2F0IGV4dGVuZHMgTGluZTJEIHsKIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB4MTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeTE7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeDI7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeTI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBmbG9hdC12YWx1ZWQgTGluZTJEIHdpdGgKLSAgICAgICAgICogaXRzIGRhdGEgdmFsdWVzIHNldCB0byB6ZXJvLgorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxvYXQtdmFsdWVkIExpbmUyRCB3aXRoIGl0cyBkYXRhIHZhbHVlcyBzZXQgdG8KKyAgICAgICAgICogemVyby4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBGbG9hdCgpIHsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxvYXQtdmFsdWVkIExpbmUyRCB3aXRoCi0gICAgICAgICAqIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnRzLgorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxvYXQtdmFsdWVkIExpbmUyRCB3aXRoIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnRzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAotICAgICAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQKKyAgICAgICAgICogQHBhcmFtIHgxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSB5MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0geDIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSB5MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBGbG9hdChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MikgewogICAgICAgICAgICAgc2V0TGluZSh4MSwgeTEsIHgyLCB5Mik7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZsb2F0LXZhbHVlZCBMaW5lMkQgd2l0aAotICAgICAgICAgKiB0aGUgc3BlY2lmaWVkIGVuZHBvaW50cy4KKyAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZsb2F0LXZhbHVlZCBMaW5lMkQgd2l0aCB0aGUgc3BlY2lmaWVkIGVuZHBvaW50cy4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBwMSB0aGUgc3RhcnRpbmcgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIHAyIHRoZSBlbmQgcG9pbnQKKyAgICAgICAgICogQHBhcmFtIHAxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0gcDIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZW5kIHBvaW50LgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEZsb2F0KFBvaW50MkQgcDEsIFBvaW50MkQgcDIpIHsKICAgICAgICAgICAgIHNldExpbmUocDEsIHAyKTsKQEAgLTEyMiwxMCArMTM5LDE0IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBTZXRzIHRoZSBkYXRhIHZhbHVlcyB0aGF0IGRlZmluZSB0aGUgbGluZS4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAotICAgICAgICAgKiBAcGFyYW0geTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludAotICAgICAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50CisgICAgICAgICAqIEBwYXJhbSB4MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0geTEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIHgyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0geTIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBzZXRMaW5lKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyKSB7CiAgICAgICAgICAgICB0aGlzLngxID0geDE7CkBAIC0xNTUsNDkgKzE3Niw2MyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoZSBDbGFzcyBEb3VibGUgaXMgdGhlIHN1YmNsYXNzIG9mIExpbmUyRCB0aGF0IGhhcyBhbGwgCi0gICAgICogb2YgaXRzIGRhdGEgdmFsdWVzIHN0b3JlZCB3aXRoIGRvdWJsZS1sZXZlbCBwcmVjaXNpb24uCisgICAgICogVGhlIENsYXNzIERvdWJsZSBpcyB0aGUgc3ViY2xhc3Mgb2YgTGluZTJEIHRoYXQgaGFzIGFsbCBvZiBpdHMgZGF0YQorICAgICAqIHZhbHVlcyBzdG9yZWQgd2l0aCBkb3VibGUtbGV2ZWwgcHJlY2lzaW9uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRG91YmxlIGV4dGVuZHMgTGluZTJEIHsKIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgeDE7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSB5MTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgeDI7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIHkyOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZG91YmxlLXZhbHVlZCAgTGluZTJEIHdpdGgKLSAgICAgICAgICogaXRzIGRhdGEgdmFsdWVzIHNldCB0byB6ZXJvLgorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZG91YmxlLXZhbHVlZCBMaW5lMkQgd2l0aCBpdHMgZGF0YSB2YWx1ZXMgc2V0IHRvCisgICAgICAgICAqIHplcm8uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRG91YmxlKCkgewogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkb3VibGUtdmFsdWVkIExpbmUyRCB3aXRoCi0gICAgICAgICAqIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnRzLgorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZG91YmxlLXZhbHVlZCBMaW5lMkQgd2l0aCB0aGUgc3BlY2lmaWVkIGVuZHBvaW50cy4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAotICAgICAgICAgKiBAcGFyYW0geTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludAotICAgICAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50CisgICAgICAgICAqIEBwYXJhbSB4MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0geTEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIHgyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0geTIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRG91YmxlKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MikgewogICAgICAgICAgICAgc2V0TGluZSh4MSwgeTEsIHgyLCB5Mik7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRvdWJsZS12YWx1ZWQgTGluZTJEIHdpdGgKLSAgICAgICAgICogdGhlIHNwZWNpZmllZCBlbmRwb2ludHMuCisgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkb3VibGUtdmFsdWVkIExpbmUyRCB3aXRoIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnRzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHAxIHRoZSBzdGFydGluZyBwb2ludAotICAgICAgICAgKiBAcGFyYW0gcDIgdGhlIGVuZCBwb2ludAorICAgICAgICAgKiBAcGFyYW0gcDEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSBwMgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgcG9pbnQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRG91YmxlKFBvaW50MkQgcDEsIFBvaW50MkQgcDIpIHsKICAgICAgICAgICAgIHNldExpbmUocDEsIHAyKTsKQEAgLTI2MiwzNiArMjk3LDUwIEBACiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBMaW5lMkQgcGF0aCBpdGVyYXRvciAKKyAgICAgKiBMaW5lMkQgcGF0aCBpdGVyYXRvcgogICAgICAqLwogICAgIC8qKgogICAgICAqIFRoZSBzdWJjbGFzcyBvZiBQYXRoSXRlcmF0b3IgdG8gdHJhdmVyc2UgYSBMaW5lMkQuCiAgICAgICovCiAgICAgY2xhc3MgSXRlcmF0b3IgaW1wbGVtZW50cyBQYXRoSXRlcmF0b3IgewogCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydCBsaW5lIHBvaW50LiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnQgbGluZSBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSB4MTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydCBsaW5lIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydCBsaW5lIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgZG91YmxlIHkxOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBsaW5lIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgbGluZSBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSB4MjsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgbGluZSBwb2ludC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIGxpbmUgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUgeTI7CiAKLSAgICAgICAgLyoqIFRoZSBwYXRoIGl0ZXJhdG9yIHRyYW5zZm9ybWF0aW9uLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBhdGggaXRlcmF0b3IgdHJhbnNmb3JtYXRpb24uCisgICAgICAgICAqLwogICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdDsKIAotICAgICAgICAvKiogVGhlIGN1cnJlbnQgc2VnbWVuZXQgaW5kZXguICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY3VycmVudCBzZWdtZW50IGluZGV4LgorICAgICAgICAgKi8KICAgICAgICAgaW50IGluZGV4OwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IExpbmUyRC5JdGVyYXRvciBmb3IgZ2l2ZW4gbGluZSBhbmQgdHJhbnNmb3JtYXRpb24KKyAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBMaW5lMkQuSXRlcmF0b3IgZm9yIGdpdmVuIGxpbmUgYW5kIHRyYW5zZm9ybWF0aW9uLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGwgLSB0aGUgc291cmNlIExpbmUyRCBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIGF0IC0gdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgdG8gYXBwbHkgcmVjdGFuZ2xlIHBhdGgKKyAgICAgICAgICogQHBhcmFtIGwKKyAgICAgICAgICogICAgICAgICAgICB0aGUgc291cmNlIExpbmUyRCBvYmplY3QuCisgICAgICAgICAqIEBwYXJhbSBhdAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBBZmZpbmVUcmFuc2Zvcm0gb2JqZWN0IHRvIGFwcGx5IHJlY3RhbmdsZSBwYXRoLgogICAgICAgICAgKi8KICAgICAgICAgSXRlcmF0b3IoTGluZTJEIGwsIEFmZmluZVRyYW5zZm9ybSBhdCkgewogICAgICAgICAgICAgdGhpcy54MSA9IGwuZ2V0WDEoKTsKQEAgLTM2Niw2MCArNDE1LDY2IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50CisgICAgICogQHJldHVybiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldFgxKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQKKyAgICAgKiBAcmV0dXJuIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0WTEoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHgyCisgICAgICogQHJldHVybiB0aGUgeDIuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRYMigpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQKKyAgICAgKiBAcmV0dXJuIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldFkyKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBwIHRoZSBzdGFydGluZyBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwIHRoZSBzdGFydGluZyBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIHAgdGhlIHN0YXJ0aW5nIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBQb2ludDJEIGdldFAxKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBwIGVuZCBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwIGVuZCBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIHAgZW5kIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBQb2ludDJEIGdldFAyKCk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBsaW5lJ3MgZW5kcG9pbnRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAotICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAotICAgICAqIEBwYXJhbSB4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQKLSAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50CisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldExpbmUoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyKTsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGxpbmUncyBlbmRwb2ludHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHAxIHRoZSBzdGFydGluZyBwb2ludAotICAgICAqIEBwYXJhbSBwMiB0aGUgZW5kIHBvaW50CisgICAgICogQHBhcmFtIHAxCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICogQHBhcmFtIHAyCisgICAgICogICAgICAgICAgICB0aGUgZW5kIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExpbmUoUG9pbnQyRCBwMSwgUG9pbnQyRCBwMikgewogICAgICAgICBzZXRMaW5lKHAxLmdldFgoKSwgcDEuZ2V0WSgpLCBwMi5nZXRYKCksIHAyLmdldFkoKSk7CkBAIC00MjgsMzkgKzQ4Myw0NCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGxpbmUncyBlbmRwb2ludHMgYnkgY29weWluZyB0aGUgZGF0YSBmcm9tIGFub3RoZXIgTGluZTJELgogICAgICAqIAotICAgICAqIEBwYXJhbSBsaW5lIHRoZSBMaW5lMkQgdG8gY29weSB0aGUgZW5kcG9pbnQgZGF0YSBmcm9tCisgICAgICogQHBhcmFtIGxpbmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBMaW5lMkQgdG8gY29weSB0aGUgZW5kcG9pbnQgZGF0YSBmcm9tLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExpbmUoTGluZTJEIGxpbmUpIHsKICAgICAgICAgc2V0TGluZShsaW5lLmdldFgxKCksIGxpbmUuZ2V0WTEoKSwgbGluZS5nZXRYMigpLCBsaW5lLmdldFkyKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKCkgewotICAgIHJldHVybiBnZXRCb3VuZHMyRCgpLmdldEJvdW5kcygpOworICAgICAgICByZXR1cm4gZ2V0Qm91bmRzMkQoKS5nZXRCb3VuZHMoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUZWxscyB3aGVyZSB0aGUgcG9pbnQgaXMgd2l0aCByZXNwZWN0IHRvIHRoZSBsaW5lIHNlZ21lbnQsIAotICAgICAqIGdpdmVuIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgbGluZSBzZWdtZW50LiBJZiB0aGUgcmF5IAotICAgICAqIGZvdW5kIGJ5IGV4dGVuZGluZyB0aGUgbGluZSBzZWdtZW50IGZyb20gaXRzIHN0YXJ0aW5nIHBvaW50IAotICAgICAqIGlzIHJvdGF0ZWQsIHRoaXMgbWV0aG9kIHRlbGxzIHdoZXRoZXIgdGhlIHJheQotICAgICAqIHNob3VsZCByb3RhdGUgaW4gYSBjbG9ja3dpc2UgZGlyZWN0aW9uIG9yIGEgY291bnRlci1jbG9ja3dpc2UKLSAgICAgKiBkaXJlY3Rpb24gdG8gaGl0IHRoZSBwb2ludCBmaXJzdC4gVGhlIHJldHVybiB2YWx1ZSBpcyAwIGlmIHRoZSAKLSAgICAgKiBwb2ludCBpcyBvbiB0aGUgbGluZSBzZWdtZW50LCBpdCdzIDEgaWYgdGhlIHBvaW50IGlzIG9uIHRoZSByYXkgCi0gICAgICogb3IgaWYgdGhlIHJheSBzaG91bGQgcm90YXRlIGluIGEgY291bnRlci1jbG9ja3dpc2UgZGlyZWN0aW9uIHRvIGdldCB0byB0aGUKLSAgICAgKiBwb2ludCwgYW5kIGl0J3MgLTEgaWYgdGhlIHJheSBzaG91bGQgcm90YXRlIGluIGEgY2xvY2t3aXNlIAotICAgICAqIGRpcmVjdGlvbiB0byBnZXQgdG8gdGhlIHBvaW50IG9yIGlmIHRoZSBwb2ludCBpcyBvbiB0aGUgbGluZSAKLSAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBsaW5lIHNlZ21lbnQgYnV0IG5vdCBvbiB0aGUgcmF5IGZyb20gdGhlIAotICAgICAqIHNlZ21lbnQncyBzdGFydGluZyBwb2ludCBhbmQgdGhyb3VnaCBpdHMgZW5kIHBvaW50LgorICAgICAqIFRlbGxzIHdoZXJlIHRoZSBwb2ludCBpcyB3aXRoIHJlc3BlY3QgdG8gdGhlIGxpbmUgc2VnbWVudCwgZ2l2ZW4gdGhlCisgICAgICogb3JpZW50YXRpb24gb2YgdGhlIGxpbmUgc2VnbWVudC4gSWYgdGhlIHJheSBmb3VuZCBieSBleHRlbmRpbmcgdGhlIGxpbmUKKyAgICAgKiBzZWdtZW50IGZyb20gaXRzIHN0YXJ0aW5nIHBvaW50IGlzIHJvdGF0ZWQsIHRoaXMgbWV0aG9kIHRlbGxzIHdoZXRoZXIgdGhlCisgICAgICogcmF5IHNob3VsZCByb3RhdGUgaW4gYSBjbG9ja3dpc2UgZGlyZWN0aW9uIG9yIGEgY291bnRlci1jbG9ja3dpc2UKKyAgICAgKiBkaXJlY3Rpb24gdG8gaGl0IHRoZSBwb2ludCBmaXJzdC4gVGhlIHJldHVybiB2YWx1ZSBpcyAwIGlmIHRoZSBwb2ludCBpcworICAgICAqIG9uIHRoZSBsaW5lIHNlZ21lbnQsIGl0J3MgMSBpZiB0aGUgcG9pbnQgaXMgb24gdGhlIHJheSBvciBpZiB0aGUgcmF5CisgICAgICogc2hvdWxkIHJvdGF0ZSBpbiBhIGNvdW50ZXItY2xvY2t3aXNlIGRpcmVjdGlvbiB0byBnZXQgdG8gdGhlIHBvaW50LCBhbmQKKyAgICAgKiBpdCdzIC0xIGlmIHRoZSByYXkgc2hvdWxkIHJvdGF0ZSBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24gdG8gZ2V0IHRvIHRoZQorICAgICAqIHBvaW50IG9yIGlmIHRoZSBwb2ludCBpcyBvbiB0aGUgbGluZSBkZXRlcm1pbmVkIGJ5IHRoZSBsaW5lIHNlZ21lbnQgYnV0CisgICAgICogbm90IG9uIHRoZSByYXkgZnJvbSB0aGUgc2VnbWVudCdzIHN0YXJ0aW5nIHBvaW50IGFuZCB0aHJvdWdoIGl0cyBlbmQKKyAgICAgKiBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudAotICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50Ci0gICAgICogQHBhcmFtIHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50Ci0gICAgICogQHBhcmFtIHkyIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50Ci0gICAgICogQHBhcmFtIHB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQKLSAgICAgKiBAcGFyYW0gcHkgdGhlIHAgY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHRoYXQgZGVzY3JpYmVzIHdoZXJlIHRoZSBwb2ludCBpcyB3aXRoIHJlc3BlY3QgdG8gdGhlIGxpbmUgc2VnbWVudCwgCi0gICAgICogZ2l2ZW4gdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBsaW5lIHNlZ21lbnQKKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50LgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0gcHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHBhcmFtIHB5CisgICAgICogICAgICAgICAgICB0aGUgcCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50LgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHRoYXQgZGVzY3JpYmVzIHdoZXJlIHRoZSBwb2ludCBpcyB3aXRoIHJlc3BlY3QgdG8gdGhlCisgICAgICogICAgICAgICBsaW5lIHNlZ21lbnQsIGdpdmVuIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgbGluZSBzZWdtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IHJlbGF0aXZlQ0NXKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MiwgZG91YmxlIHB4LCBkb3VibGUgcHkpIHsKICAgICAgICAgLyoKQEAgLTQ4Nyw0NyArNTQ3LDQ2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGVsbHMgd2hlcmUgdGhlIHBvaW50IGlzIHdpdGggcmVzcGVjdCB0byB0aGlzIGxpbmUgc2VnbWVudCwgCi0gICAgICogZ2l2ZW4gdGhlIG9yaWVudGF0aW9uIG9mIHRoaXMgbGluZSBzZWdtZW50LiBJZiB0aGUgcmF5IAotICAgICAqIGZvdW5kIGJ5IGV4dGVuZGluZyB0aGUgbGluZSBzZWdtZW50IGZyb20gaXRzIHN0YXJ0aW5nIHBvaW50IAotICAgICAqIGlzIHJvdGF0ZWQsIHRoaXMgbWV0aG9kIHRlbGxzIHdoZXRoZXIgdGhlIHJheQotICAgICAqIHNob3VsZCByb3RhdGUgaW4gYSBjbG9ja3dpc2UgZGlyZWN0aW9uIG9yIGEgY291bnRlci1jbG9ja3dpc2UKLSAgICAgKiBkaXJlY3Rpb24gdG8gaGl0IHRoZSBwb2ludCBmaXJzdC4gVGhlIHJldHVybiB2YWx1ZSBpcyAwIGlmIHRoZSAKLSAgICAgKiBwb2ludCBpcyBvbiB0aGUgbGluZSBzZWdtZW50LCBpdCdzIDEgaWYgdGhlIHBvaW50IGlzIG9uIHRoZSByYXkgCi0gICAgICogb3IgaWYgdGhlIHJheSBzaG91bGQgcm90YXRlIGluIGEgY291bnRlci1jbG9ja3dpc2UgZGlyZWN0aW9uIHRvIGdldCB0byB0aGUKLSAgICAgKiBwb2ludCwgYW5kIGl0J3MgLTEgaWYgdGhlIHJheSBzaG91bGQgcm90YXRlIGluIGEgY2xvY2t3aXNlIAotICAgICAqIGRpcmVjdGlvbiB0byBnZXQgdG8gdGhlIHBvaW50IG9yIGlmIHRoZSBwb2ludCBpcyBvbiB0aGUgbGluZSAKLSAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBsaW5lIHNlZ21lbnQgYnV0IG5vdCBvbiB0aGUgcmF5IGZyb20gdGhlIAotICAgICAqIHNlZ21lbnQncyBzdGFydGluZyBwb2ludCBhbmQgdGhyb3VnaCBpdHMgZW5kIHBvaW50LgorICAgICAqIFRlbGxzIHdoZXJlIHRoZSBwb2ludCBpcyB3aXRoIHJlc3BlY3QgdG8gdGhpcyBsaW5lIHNlZ21lbnQsIGdpdmVuIHRoZQorICAgICAqIG9yaWVudGF0aW9uIG9mIHRoaXMgbGluZSBzZWdtZW50LiBJZiB0aGUgcmF5IGZvdW5kIGJ5IGV4dGVuZGluZyB0aGUgbGluZQorICAgICAqIHNlZ21lbnQgZnJvbSBpdHMgc3RhcnRpbmcgcG9pbnQgaXMgcm90YXRlZCwgdGhpcyBtZXRob2QgdGVsbHMgd2hldGhlciB0aGUKKyAgICAgKiByYXkgc2hvdWxkIHJvdGF0ZSBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24gb3IgYSBjb3VudGVyLWNsb2Nrd2lzZQorICAgICAqIGRpcmVjdGlvbiB0byBoaXQgdGhlIHBvaW50IGZpcnN0LiBUaGUgcmV0dXJuIHZhbHVlIGlzIDAgaWYgdGhlIHBvaW50IGlzCisgICAgICogb24gdGhlIGxpbmUgc2VnbWVudCwgaXQncyAxIGlmIHRoZSBwb2ludCBpcyBvbiB0aGUgcmF5IG9yIGlmIHRoZSByYXkKKyAgICAgKiBzaG91bGQgcm90YXRlIGluIGEgY291bnRlci1jbG9ja3dpc2UgZGlyZWN0aW9uIHRvIGdldCB0byB0aGUgcG9pbnQsIGFuZAorICAgICAqIGl0J3MgLTEgaWYgdGhlIHJheSBzaG91bGQgcm90YXRlIGluIGEgY2xvY2t3aXNlIGRpcmVjdGlvbiB0byBnZXQgdG8gdGhlCisgICAgICogcG9pbnQgb3IgaWYgdGhlIHBvaW50IGlzIG9uIHRoZSBsaW5lIGRldGVybWluZWQgYnkgdGhlIGxpbmUgc2VnbWVudCBidXQKKyAgICAgKiBub3Qgb24gdGhlIHJheSBmcm9tIHRoZSBzZWdtZW50J3Mgc3RhcnRpbmcgcG9pbnQgYW5kIHRocm91Z2ggaXRzIGVuZAorICAgICAqIHBvaW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBweCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50Ci0gICAgICogQHBhcmFtIHB5IHRoZSBwIGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSB0aGF0IGRlc2NyaWJlcyB3aGVyZSB0aGUgcG9pbnQgaXMgd2l0aCByZXNwZWN0IHRvIAotICAgICAqIHRoaXMgbGluZSBzZWdtZW50LCBnaXZlbiB0aGUgb3JpZW50YXRpb24gb2YgdGhpcyBsaW5lIHNlZ21lbnQKKyAgICAgKiBAcGFyYW0gcHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHBhcmFtIHB5CisgICAgICogICAgICAgICAgICB0aGUgcCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50LgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHRoYXQgZGVzY3JpYmVzIHdoZXJlIHRoZSBwb2ludCBpcyB3aXRoIHJlc3BlY3QgdG8gdGhpcworICAgICAqICAgICAgICAgbGluZSBzZWdtZW50LCBnaXZlbiB0aGUgb3JpZW50YXRpb24gb2YgdGhpcyBsaW5lIHNlZ21lbnQuCiAgICAgICovCiAgICAgcHVibGljIGludCByZWxhdGl2ZUNDVyhkb3VibGUgcHgsIGRvdWJsZSBweSkgewogICAgICAgICByZXR1cm4gcmVsYXRpdmVDQ1coZ2V0WDEoKSwgZ2V0WTEoKSwgZ2V0WDIoKSwgZ2V0WTIoKSwgcHgsIHB5KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUZWxscyB3aGVyZSB0aGUgcG9pbnQgaXMgd2l0aCByZXNwZWN0IHRvIHRoaXMgbGluZSBzZWdtZW50LCAKLSAgICAgKiBnaXZlbiB0aGUgb3JpZW50YXRpb24gb2YgdGhpcyBsaW5lIHNlZ21lbnQuIElmIHRoZSByYXkgCi0gICAgICogZm91bmQgYnkgZXh0ZW5kaW5nIHRoZSBsaW5lIHNlZ21lbnQgZnJvbSBpdHMgc3RhcnRpbmcgcG9pbnQgCi0gICAgICogaXMgcm90YXRlZCwgdGhpcyBtZXRob2QgdGVsbHMgd2hldGhlciB0aGUgcmF5Ci0gICAgICogc2hvdWxkIHJvdGF0ZSBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24gb3IgYSBjb3VudGVyLWNsb2Nrd2lzZQotICAgICAqIGRpcmVjdGlvbiB0byBoaXQgdGhlIHBvaW50IGZpcnN0LiBUaGUgcmV0dXJuIHZhbHVlIGlzIDAgaWYgdGhlIAotICAgICAqIHBvaW50IGlzIG9uIHRoZSBsaW5lIHNlZ21lbnQsIGl0J3MgMSBpZiB0aGUgcG9pbnQgaXMgb24gdGhlIHJheSAKLSAgICAgKiBvciBpZiB0aGUgcmF5IHNob3VsZCByb3RhdGUgaW4gYSBjb3VudGVyLWNsb2Nrd2lzZSBkaXJlY3Rpb24gdG8gZ2V0IHRvIHRoZQotICAgICAqIHBvaW50LCBhbmQgaXQncyAtMSBpZiB0aGUgcmF5IHNob3VsZCByb3RhdGUgaW4gYSBjbG9ja3dpc2UgCi0gICAgICogZGlyZWN0aW9uIHRvIGdldCB0byB0aGUgcG9pbnQgb3IgaWYgdGhlIHBvaW50IGlzIG9uIHRoZSBsaW5lIAotICAgICAqIGRldGVybWluZWQgYnkgdGhlIGxpbmUgc2VnbWVudCBidXQgbm90IG9uIHRoZSByYXkgZnJvbSB0aGUgCi0gICAgICogc2VnbWVudCdzIHN0YXJ0aW5nIHBvaW50IGFuZCB0aHJvdWdoIGl0cyBlbmQgcG9pbnQuCisgICAgICogVGVsbHMgd2hlcmUgdGhlIHBvaW50IGlzIHdpdGggcmVzcGVjdCB0byB0aGlzIGxpbmUgc2VnbWVudCwgZ2l2ZW4gdGhlCisgICAgICogb3JpZW50YXRpb24gb2YgdGhpcyBsaW5lIHNlZ21lbnQuIElmIHRoZSByYXkgZm91bmQgYnkgZXh0ZW5kaW5nIHRoZSBsaW5lCisgICAgICogc2VnbWVudCBmcm9tIGl0cyBzdGFydGluZyBwb2ludCBpcyByb3RhdGVkLCB0aGlzIG1ldGhvZCB0ZWxscyB3aGV0aGVyIHRoZQorICAgICAqIHJheSBzaG91bGQgcm90YXRlIGluIGEgY2xvY2t3aXNlIGRpcmVjdGlvbiBvciBhIGNvdW50ZXItY2xvY2t3aXNlCisgICAgICogZGlyZWN0aW9uIHRvIGhpdCB0aGUgcG9pbnQgZmlyc3QuIFRoZSByZXR1cm4gdmFsdWUgaXMgMCBpZiB0aGUgcG9pbnQgaXMKKyAgICAgKiBvbiB0aGUgbGluZSBzZWdtZW50LCBpdCdzIDEgaWYgdGhlIHBvaW50IGlzIG9uIHRoZSByYXkgb3IgaWYgdGhlIHJheQorICAgICAqIHNob3VsZCByb3RhdGUgaW4gYSBjb3VudGVyLWNsb2Nrd2lzZSBkaXJlY3Rpb24gdG8gZ2V0IHRvIHRoZSBwb2ludCwgYW5kCisgICAgICogaXQncyAtMSBpZiB0aGUgcmF5IHNob3VsZCByb3RhdGUgaW4gYSBjbG9ja3dpc2UgZGlyZWN0aW9uIHRvIGdldCB0byB0aGUKKyAgICAgKiBwb2ludCBvciBpZiB0aGUgcG9pbnQgaXMgb24gdGhlIGxpbmUgZGV0ZXJtaW5lZCBieSB0aGUgbGluZSBzZWdtZW50IGJ1dAorICAgICAqIG5vdCBvbiB0aGUgcmF5IGZyb20gdGhlIHNlZ21lbnQncyBzdGFydGluZyBwb2ludCBhbmQgdGhyb3VnaCBpdHMgZW5kCisgICAgICogcG9pbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHAgdGhlIHRlc3QgcG9pbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSB0aGF0IGRlc2NyaWJlcyB3aGVyZSB0aGUgcG9pbnQgaXMgd2l0aCByZXNwZWN0IHRvIAotICAgICAqIHRoaXMgbGluZSBzZWdtZW50LCBnaXZlbiB0aGUgb3JpZW50YXRpb24gb2YgdGhpcyBsaW5lIHNlZ21lbnQKKyAgICAgKiBAcGFyYW0gcAorICAgICAqICAgICAgICAgICAgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgdGhhdCBkZXNjcmliZXMgd2hlcmUgdGhlIHBvaW50IGlzIHdpdGggcmVzcGVjdCB0byB0aGlzCisgICAgICogICAgICAgICBsaW5lIHNlZ21lbnQsIGdpdmVuIHRoZSBvcmllbnRhdGlvbiBvZiB0aGlzIGxpbmUgc2VnbWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IHJlbGF0aXZlQ0NXKFBvaW50MkQgcCkgewogICAgICAgICByZXR1cm4gcmVsYXRpdmVDQ1coZ2V0WDEoKSwgZ2V0WTEoKSwgZ2V0WDIoKSwgZ2V0WTIoKSwgcC5nZXRYKCksIHAuZ2V0WSgpKTsKQEAgLTUzNiwyOCArNTk1LDMxIEBACiAgICAgLyoqCiAgICAgICogVGVsbHMgd2hldGhlciB0aGUgdHdvIGxpbmUgc2VnbWVudHMgY3Jvc3MuCiAgICAgICogCi0gICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBmaXJzdCBzZWdtZW50Ci0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBmaXJzdCBzZWdtZW50Ci0gICAgICogQHBhcmFtIHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgZmlyc3Qgc2VnbWVudAotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGZpcnN0IHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geDMgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIHNlY29uZCBzZWdtZW50Ci0gICAgICogQHBhcmFtIHkzIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBzZWNvbmQgc2VnbWVudAotICAgICAqIEBwYXJhbSB4NCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIHNlY29uZCBzZWdtZW50Ci0gICAgICogQHBhcmFtIHk0IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgc2Vjb25kIHNlZ21lbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSB0d28gbGluZSBzZWdtZW50cyBjcm9zcworICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGZpcnN0IHNlZ21lbnQuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgZmlyc3Qgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgZmlyc3Qgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgZmlyc3Qgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0geDMKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBzZWNvbmQgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0geTMKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBzZWNvbmQgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0geDQKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgc2Vjb25kIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHk0CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIHNlY29uZCBzZWdtZW50LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHR3byBsaW5lIHNlZ21lbnRzIGNyb3NzLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBsaW5lc0ludGVyc2VjdChkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLAotICAgICAgICAgICAgZG91YmxlIHkyLCBkb3VibGUgeDMsIGRvdWJsZSB5MywgZG91YmxlIHg0LCBkb3VibGUgeTQpCi0gICAgeworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBsaW5lc0ludGVyc2VjdChkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIsIGRvdWJsZSB4MywKKyAgICAgICAgICAgIGRvdWJsZSB5MywgZG91YmxlIHg0LCBkb3VibGUgeTQpIHsKICAgICAgICAgLyoKICAgICAgICAgICogQSA9ICh4Mi14MSwgeTIteTEpIEIgPSAoeDMteDEsIHkzLXkxKSBDID0gKHg0LXgxLCB5NC15MSkgRCA9ICh4NC14MywKLSAgICAgICAgICogeTQteTMpID0gQy1CIEUgPSAoeDEteDMsIHkxLXkzKSA9IC1CIEYgPSAoeDIteDMsIHkyLXkzKSA9IEEtQgotICAgICAgICAgKgotICAgICAgICAgKiBSZXN1bHQgaXMgKChBeEIpICogKEF4QykgPD0wKSBhbmQgKChEeEUpICogKER4RikgPD0gMCkKLSAgICAgICAgICoKLSAgICAgICAgICogRHhFID0gKEMtQil4KC1CKSA9IEJ4Qi1DeEIgPSBCeEMgRHhGID0gKEMtQil4KEEtQikgPSBDeEEtQ3hCLUJ4QStCeEIgPQotICAgICAgICAgKiBBeEIrQnhDLUF4QworICAgICAgICAgKiB5NC15MykgPSBDLUIgRSA9ICh4MS14MywgeTEteTMpID0gLUIgRiA9ICh4Mi14MywgeTIteTMpID0gQS1CIFJlc3VsdAorICAgICAgICAgKiBpcyAoKEF4QikgKEF4QykgPD0wKSBhbmQgKChEeEUpIChEeEYpIDw9IDApIER4RSA9IChDLUIpeCgtQikgPQorICAgICAgICAgKiBCeEItQ3hCID0gQnhDIER4RiA9IChDLUIpeChBLUIpID0gQ3hBLUN4Qi1CeEErQnhCID0gQXhCK0J4Qy1BeEMKICAgICAgICAgICovCiAKICAgICAgICAgeDIgLT0geDE7IC8vIEEKQEAgLTU3MywxNiArNjM1LDE0IEBACiAgICAgICAgIC8vIE9ubGluZQogICAgICAgICBpZiAoQXZCID09IDAuMCAmJiBBdkMgPT0gMC4wKSB7CiAgICAgICAgICAgICBpZiAoeDIgIT0gMC4wKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgICh4NCAqIHgzIDw9IDAuMCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKCh4MyAqIHgyID49IDAuMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICh4MiA+IDAuMCA/IHgzIDw9IHgyIHx8IHg0IDw9IHgyIDogeDMgPj0geDIgfHwgeDQgPj0geDIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHg0ICogeDMgPD0gMC4wKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCh4MyAqIHgyID49IDAuMCkgJiYgKHgyID4gMC4wID8geDMgPD0geDIgfHwgeDQgPD0geDIgOiB4MyA+PSB4MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4NCA+PSB4MikpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHkyICE9IDAuMCkgewotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICAoeTQgKiB5MyA8PSAwLjApIHx8Ci0gICAgICAgICAgICAgICAgICAgICgoeTMgKiB5MiA+PSAwLjApICYmCi0gICAgICAgICAgICAgICAgICAgICAoeTIgPiAwLjAgPyB5MyA8PSB5MiB8fCB5NCA8PSB5MiA6IHkzID49IHkyIHx8IHk0ID49IHkyKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuICh5NCAqIHkzIDw9IDAuMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoeTMgKiB5MiA+PSAwLjApICYmICh5MiA+IDAuMCA/IHkzIDw9IHkyIHx8IHk0IDw9IHkyIDogeTMgPj0geTIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgeTQgPj0geTIpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtNTk1LDEyICs2NTUsMTUgQEAKICAgICAvKioKICAgICAgKiBUZWxscyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbGluZSBzZWdtZW50cyBjcm9zc2VzIHRoaXMgbGluZSBzZWdtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgdGVzdCBzZWdtZW50Ci0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSB0ZXN0IHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSB0ZXN0IHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSB0ZXN0IHNlZ21lbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgbGluZSBzZWdtZW50cyBjcm9zc2VzIHRoaXMgbGluZSBzZWdtZW50CisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgdGVzdCBzZWdtZW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIHRlc3Qgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgdGVzdCBzZWdtZW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSB0ZXN0IHNlZ21lbnQuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIGxpbmUgc2VnbWVudHMgY3Jvc3NlcyB0aGlzIGxpbmUgc2VnbWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3RzTGluZShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIpIHsKICAgICAgICAgcmV0dXJuIGxpbmVzSW50ZXJzZWN0KHgxLCB5MSwgeDIsIHkyLCBnZXRYMSgpLCBnZXRZMSgpLCBnZXRYMigpLCBnZXRZMigpKTsKQEAgLTYwOSwzMSArNjcyLDM3IEBACiAgICAgLyoqCiAgICAgICogVGVsbHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGxpbmUgc2VnbWVudHMgY3Jvc3NlcyB0aGlzIGxpbmUgc2VnbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgdGVzdCBzZWdtZW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIGxpbmUgc2VnbWVudHMgY3Jvc3NlcyB0aGlzIGxpbmUgc2VnbWVudAotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgbCBpcyBudWxsCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSB0ZXN0IHNlZ21lbnQuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIGxpbmUgc2VnbWVudHMgY3Jvc3NlcyB0aGlzIGxpbmUgc2VnbWVudC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgbCBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGludGVyc2VjdHNMaW5lKExpbmUyRCBsKSB7Ci0gICAgICAgIHJldHVybiBsaW5lc0ludGVyc2VjdChsLmdldFgxKCksIGwuZ2V0WTEoKSwgbC5nZXRYMigpLCBsLmdldFkyKCksIGdldFgxKCksIGdldFkxKCksIGdldFgyKCksIGdldFkyKCkpOworICAgICAgICByZXR1cm4gbGluZXNJbnRlcnNlY3QobC5nZXRYMSgpLCBsLmdldFkxKCksIGwuZ2V0WDIoKSwgbC5nZXRZMigpLCBnZXRYMSgpLCBnZXRZMSgpLAorICAgICAgICAgICAgICAgIGdldFgyKCksIGdldFkyKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdpdmVzIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgCi0gICAgICogbGluZSBzZWdtZW50LgorICAgICAqIEdpdmVzIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgbGluZSBzZWdtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50Ci0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0gcHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludAotICAgICAqIEBwYXJhbSBweSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSAKLSAgICAgKiBsaW5lIHNlZ21lbnQKKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50LgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0gcHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHBhcmFtIHB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50LgorICAgICAqIEByZXR1cm4gdGhlIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgbGluZQorICAgICAqICAgICAgICAgc2VnbWVudC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBwdFNlZ0Rpc3RTcShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIsIGRvdWJsZSBweCwgZG91YmxlIHB5KSB7CisgICAgcHVibGljIHN0YXRpYyBkb3VibGUgcHRTZWdEaXN0U3EoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBkb3VibGUgcHgsCisgICAgICAgICAgICBkb3VibGUgcHkpIHsKICAgICAgICAgLyoKICAgICAgICAgICogQSA9ICh4MiAtIHgxLCB5MiAtIHkxKSBQID0gKHB4IC0geDEsIHB5IC0geTEpCiAgICAgICAgICAqLwpAQCAtNjYxLDkyICs3MzAsOTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHaXZlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSAKLSAgICAgKiBsaW5lIHNlZ21lbnQuCisgICAgICogR2l2ZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgbGluZSBzZWdtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50Ci0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0gcHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludAotICAgICAqIEBwYXJhbSBweSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgCi0gICAgICogbGluZSBzZWdtZW50CisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50LgorICAgICAqIEBwYXJhbSBweQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSBsaW5lIHNlZ21lbnQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgcHRTZWdEaXN0KGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MiwgZG91YmxlIHB4LCBkb3VibGUgcHkpIHsKICAgICAgICAgcmV0dXJuIE1hdGguc3FydChwdFNlZ0Rpc3RTcSh4MSwgeTEsIHgyLCB5MiwgcHgsIHB5KSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZXMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoaXMgCi0gICAgICogbGluZSBzZWdtZW50LgorICAgICAqIEdpdmVzIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGlzIGxpbmUgc2VnbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludAotICAgICAqIEBwYXJhbSBweSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoaXMgCi0gICAgICogbGluZSBzZWdtZW50CisgICAgICogQHBhcmFtIHB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50LgorICAgICAqIEBwYXJhbSBweQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhpcyBsaW5lCisgICAgICogICAgICAgICBzZWdtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgcHRTZWdEaXN0U3EoZG91YmxlIHB4LCBkb3VibGUgcHkpIHsKICAgICAgICAgcmV0dXJuIHB0U2VnRGlzdFNxKGdldFgxKCksIGdldFkxKCksIGdldFgyKCksIGdldFkyKCksIHB4LCBweSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZXMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoaXMgCi0gICAgICogbGluZSBzZWdtZW50LgorICAgICAqIEdpdmVzIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGlzIGxpbmUgc2VnbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgdGVzdCBwb2ludAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoaXMgCi0gICAgICogbGluZSBzZWdtZW50CisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSB0ZXN0IHBvaW50LgorICAgICAqIEByZXR1cm4gdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoaXMgbGluZQorICAgICAqICAgICAgICAgc2VnbWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlIHB0U2VnRGlzdFNxKFBvaW50MkQgcCkgewogICAgICAgICByZXR1cm4gcHRTZWdEaXN0U3EoZ2V0WDEoKSwgZ2V0WTEoKSwgZ2V0WDIoKSwgZ2V0WTIoKSwgcC5nZXRYKCksIHAuZ2V0WSgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHaXZlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoaXMgCi0gICAgICogbGluZSBzZWdtZW50LgorICAgICAqIEdpdmVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhpcyBsaW5lIHNlZ21lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQKLSAgICAgKiBAcGFyYW0gcHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGlzIAotICAgICAqIGxpbmUgc2VnbWVudAorICAgICAqIEBwYXJhbSBweAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludC4KKyAgICAgKiBAcGFyYW0gcHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoaXMgbGluZSBzZWdtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgcHRTZWdEaXN0KGRvdWJsZSBweCwgZG91YmxlIHB5KSB7CiAgICAgICAgIHJldHVybiBwdFNlZ0Rpc3QoZ2V0WDEoKSwgZ2V0WTEoKSwgZ2V0WDIoKSwgZ2V0WTIoKSwgcHgsIHB5KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHaXZlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoaXMgCi0gICAgICogbGluZSBzZWdtZW50LgorICAgICAqIEdpdmVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhpcyBsaW5lIHNlZ21lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHAgdGhlIHRlc3QgcG9pbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhpcyAKLSAgICAgKiBsaW5lIHNlZ21lbnQKKyAgICAgKiBAcGFyYW0gcAorICAgICAqICAgICAgICAgICAgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoaXMgbGluZSBzZWdtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgcHRTZWdEaXN0KFBvaW50MkQgcCkgewogICAgICAgICByZXR1cm4gcHRTZWdEaXN0KGdldFgxKCksIGdldFkxKCksIGdldFgyKCksIGdldFkyKCksIHAuZ2V0WCgpLCBwLmdldFkoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZXMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSAKLSAgICAgKiBsaW5lLgorICAgICAqIEdpdmVzIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgbGluZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudAotICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50Ci0gICAgICogQHBhcmFtIHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50Ci0gICAgICogQHBhcmFtIHkyIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50Ci0gICAgICogQHBhcmFtIHB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQKLSAgICAgKiBAcGFyYW0gcHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSAKLSAgICAgKiBsaW5lCisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50LgorICAgICAqIEBwYXJhbSBweQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgbGluZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBwdExpbmVEaXN0U3EoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBkb3VibGUgcHgsIGRvdWJsZSBweSkgeworICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHB0TGluZURpc3RTcShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIsIGRvdWJsZSBweCwKKyAgICAgICAgICAgIGRvdWJsZSBweSkgewogICAgICAgICB4MiAtPSB4MTsKICAgICAgICAgeTIgLT0geTE7CiAgICAgICAgIHB4IC09IHgxOwpAQCAtNzU2LDcyICs4MjgsNzcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHaXZlcyB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIAotICAgICAqIGxpbmUuCisgICAgICogR2l2ZXMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSBsaW5lLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50Ci0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0gcHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludAotICAgICAqIEBwYXJhbSBweSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIAotICAgICAqIGxpbmUKKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50LgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0gcHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHBhcmFtIHB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50LgorICAgICAqIEByZXR1cm4gdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSBsaW5lLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHB0TGluZURpc3QoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBkb3VibGUgcHgsIGRvdWJsZSBweSkgewogICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHB0TGluZURpc3RTcSh4MSwgeTEsIHgyLCB5MiwgcHgsIHB5KSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZXMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSAKLSAgICAgKiBsaW5lIGRldGVybWluZWQgYnkgdGhpcyBMaW5lMkQuCisgICAgICogR2l2ZXMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSBsaW5lCisgICAgICogZGV0ZXJtaW5lZCBieSB0aGlzIExpbmUyRC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludAotICAgICAqIEBwYXJhbSBweSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIAotICAgICAqIGxpbmUgZGV0ZXJtaW5lZCBieSB0aGlzIExpbmUyRAorICAgICAqIEBwYXJhbSBweAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludC4KKyAgICAgKiBAcGFyYW0gcHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIGxpbmUKKyAgICAgKiAgICAgICAgIGRldGVybWluZWQgYnkgdGhpcyBMaW5lMkQuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZSBwdExpbmVEaXN0U3EoZG91YmxlIHB4LCBkb3VibGUgcHkpIHsKICAgICAgICAgcmV0dXJuIHB0TGluZURpc3RTcShnZXRYMSgpLCBnZXRZMSgpLCBnZXRYMigpLCBnZXRZMigpLCBweCwgcHkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdpdmVzIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgCi0gICAgICogbGluZSBkZXRlcm1pbmVkIGJ5IHRoaXMgTGluZTJELgorICAgICAqIEdpdmVzIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgbGluZQorICAgICAqIGRldGVybWluZWQgYnkgdGhpcyBMaW5lMkQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHAgdGhlIHRlc3QgcG9pbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgCi0gICAgICogbGluZSBkZXRlcm1pbmVkIGJ5IHRoaXMgTGluZTJECisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSB0ZXN0IHBvaW50LgorICAgICAqIEByZXR1cm4gdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSBsaW5lCisgICAgICogICAgICAgICBkZXRlcm1pbmVkIGJ5IHRoaXMgTGluZTJELgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgcHRMaW5lRGlzdFNxKFBvaW50MkQgcCkgewogICAgICAgICByZXR1cm4gcHRMaW5lRGlzdFNxKGdldFgxKCksIGdldFkxKCksIGdldFgyKCksIGdldFkyKCksIHAuZ2V0WCgpLCBwLmdldFkoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgCi0gICAgICogbGluZSBkZXRlcm1pbmVkIGJ5IHRoaXMgTGluZTJELgorICAgICAqIEdpdmVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIGxpbmUgZGV0ZXJtaW5lZCBieSB0aGlzCisgICAgICogTGluZTJELgogICAgICAqIAotICAgICAqIEBwYXJhbSBweCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50Ci0gICAgICogQHBhcmFtIHB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIAotICAgICAqIGxpbmUgZGV0ZXJtaW5lZCBieSB0aGlzIExpbmUyRAorICAgICAqIEBwYXJhbSBweAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludC4KKyAgICAgKiBAcGFyYW0gcHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSBsaW5lIGRldGVybWluZWQgYnkgdGhpcworICAgICAqICAgICAgICAgTGluZTJELgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgcHRMaW5lRGlzdChkb3VibGUgcHgsIGRvdWJsZSBweSkgewogICAgICAgICByZXR1cm4gcHRMaW5lRGlzdChnZXRYMSgpLCBnZXRZMSgpLCBnZXRYMigpLCBnZXRZMigpLCBweCwgcHkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdpdmVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIAotICAgICAqIGxpbmUgZGV0ZXJtaW5lZCBieSB0aGlzIExpbmUyRC4KKyAgICAgKiBHaXZlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSBsaW5lIGRldGVybWluZWQgYnkgdGhpcworICAgICAqIExpbmUyRC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgdGVzdCBwb2ludAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgCi0gICAgICogbGluZSBkZXRlcm1pbmVkIGJ5IHRoaXMgTGluZTJECisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSB0ZXN0IHBvaW50LgorICAgICAqIEByZXR1cm4gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgbGluZSBkZXRlcm1pbmVkIGJ5IHRoaXMKKyAgICAgKiAgICAgICAgIExpbmUyRC4KICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlIHB0TGluZURpc3QoUG9pbnQyRCBwKSB7CiAgICAgICAgIHJldHVybiBwdExpbmVEaXN0KGdldFgxKCksIGdldFkxKCksIGdldFgyKCksIGdldFkyKCksIHAuZ2V0WCgpLCBwLmdldFkoKSk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZ2VvbS9Ob25pbnZlcnRpYmxlVHJhbnNmb3JtRXhjZXB0aW9uLmphdmEgYi9hd3QvamF2YS9hd3QvZ2VvbS9Ob25pbnZlcnRpYmxlVHJhbnNmb3JtRXhjZXB0aW9uLmphdmEKaW5kZXggMmI3YjU0Mi4uYTRlNmYwZiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2dlb20vTm9uaW52ZXJ0aWJsZVRyYW5zZm9ybUV4Y2VwdGlvbi5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9nZW9tL05vbmludmVydGlibGVUcmFuc2Zvcm1FeGNlcHRpb24uamF2YQpAQCAtMTgsMjYgKzE4LDMxIEBACiAgKiBAYXV0aG9yIERlbmlzIE0uIEtpc2hlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5nZW9tOwogCiAvKioKLSAqIFRoZSBDbGFzcyBOb25pbnZlcnRpYmxlVHJhbnNmb3JtRXhjZXB0aW9uIGlzIHRoZSBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gCi0gKiB3aGVuIGFuIGFjdGlvbiByZXF1aXJlcyBpbnZlcnRpbmcgYW4ge0BsaW5rIEFmZmluZVRyYW5zZm9ybX0gdGhhdCBpcyAKLSAqIG5vdCBpbnZlcnRpYmxlIChoYXMgZGV0ZXJtaW5hbnQgMCkuCisgKiBUaGUgQ2xhc3MgTm9uaW52ZXJ0aWJsZVRyYW5zZm9ybUV4Y2VwdGlvbiBpcyB0aGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duCisgKiB3aGVuIGFuIGFjdGlvbiByZXF1aXJlcyBpbnZlcnRpbmcgYW4ge0BsaW5rIEFmZmluZVRyYW5zZm9ybX0gdGhhdCBpcyBub3QKKyAqIGludmVydGlibGUgKGhhcyBkZXRlcm1pbmFudCAwKS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBOb25pbnZlcnRpYmxlVHJhbnNmb3JtRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbiB7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjEzNzIyNTI0MDUwMzk5MDQ2Nkw7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgbm9uaW52ZXJ0aWJsZSB0cmFuc2Zvcm0gZXhjZXB0aW9uLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBub24taW52ZXJ0aWJsZSB0cmFuc2Zvcm0gZXhjZXB0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSBlcnJvciBtZXNzYWdlCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBOb25pbnZlcnRpYmxlVHJhbnNmb3JtRXhjZXB0aW9uKFN0cmluZyBzKSB7CiAgICAgICAgIHN1cGVyKHMpOwogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZ2VvbS9QYXRoSXRlcmF0b3IuamF2YSBiL2F3dC9qYXZhL2F3dC9nZW9tL1BhdGhJdGVyYXRvci5qYXZhCmluZGV4IDVhOTgwODMuLjJkMWMwZmYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9nZW9tL1BhdGhJdGVyYXRvci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9nZW9tL1BhdGhJdGVyYXRvci5qYXZhCkBAIC0xOCw3MiArMTgsODcgQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0Lmdlb207CiAKIC8qKgotICogVGhlIEludGVyZmFjZSBQYXRoSXRlcmF0b3IgcmVwcmVzZW50cyBhbiBpdGVyYXRvciBvYmplY3QgdGhhdCBjYW4gCi0gKiBiZSB1c2VkIHRvIHRyYXZlcnNlIHRoZSBvdXRsaW5lIG9mIGEge0BsaW5rIGphdmEuYXd0LlNoYXBlfS4gCi0gKiBJdCByZXR1cm5zIHBvaW50cyBhbG9uZyB0aGUgYm91bmRhcnkgb2YgdGhlIFNoYXBlIAotICogd2hpY2ggbWF5IGJlIGFjdHVhbCB2ZXJ0aWNlcyAoaW4gdGhlIGNhc2Ugb2YgYSBzaGFwZSBtYWRlIG9mIGxpbmUgCi0gKiBzZWdtZW50cykgb3IgbWF5IGJlIHBvaW50cyBvbiBhIGN1cnZlZCBzZWdtZW50IHdpdGggdGhlIGRpc3RhbmNlIAotICogYmV0d2VlbiB0aGUgcG9pbnRzIGRldGVybWluZWQgYnkgYSBjaG9zZW4gZmxhdHRlbmluZyBmYWN0b3IuIAorICogVGhlIEludGVyZmFjZSBQYXRoSXRlcmF0b3IgcmVwcmVzZW50cyBhbiBpdGVyYXRvciBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0bworICogdHJhdmVyc2UgdGhlIG91dGxpbmUgb2YgYSB7QGxpbmsgamF2YS5hd3QuU2hhcGV9LiBJdCByZXR1cm5zIHBvaW50cyBhbG9uZyB0aGUKKyAqIGJvdW5kYXJ5IG9mIHRoZSBTaGFwZSB3aGljaCBtYXkgYmUgYWN0dWFsIHZlcnRpY2VzIChpbiB0aGUgY2FzZSBvZiBhIHNoYXBlCisgKiBtYWRlIG9mIGxpbmUgc2VnbWVudHMpIG9yIG1heSBiZSBwb2ludHMgb24gYSBjdXJ2ZWQgc2VnbWVudCB3aXRoIHRoZSBkaXN0YW5jZQorICogYmV0d2VlbiB0aGUgcG9pbnRzIGRldGVybWluZWQgYnkgYSBjaG9zZW4gZmxhdHRlbmluZyBmYWN0b3IuCiAgKiA8cD4KLSAqIElmIHRoZSBzaGFwZSBpcyBjbG9zZWQsIHRoZSBvdXRsaW5lIGlzIHRyYXZlcnNlZCBpbiB0aGUgY291bnRlci1jbG9ja3dpc2UgCi0gKiBkaXJlY3Rpb24uIFRoYXQgbWVhbnMgdGhhdCBtb3ZpbmcgZm9yd2FyZCBhbG9uZyB0aGUgYm91bmRhcnkgaXMgdG8gdHJhdmVsIAotICogaW4gc3VjaCBhIHdheSB0aGF0IHRoZSBpbnRlcmlvciBvZiB0aGUgc2hhcGUgaXMgdG8gdGhlIGxlZnQgb2YgdGhlIAotICogb3V0bGluZSBwYXRoIGFuZCB0aGUgZXh0ZXJpb3Igb2YgdGhlIHNoYXBlIGlzIHRvIHRoZSByaWdodCBvZiB0aGUgb3V0bGluZQotICogcGF0aC4gVGhlIGludGVyaW9yIGFuZCBleHRlcmlvciBvZiB0aGUgc2hhcGUgYXJlIGRldGVybWluZWQgYnkgYSAKLSAqIHdpbmRpbmcgcnVsZS4gCisgKiBJZiB0aGUgc2hhcGUgaXMgY2xvc2VkLCB0aGUgb3V0bGluZSBpcyB0cmF2ZXJzZWQgaW4gdGhlIGNvdW50ZXItY2xvY2t3aXNlCisgKiBkaXJlY3Rpb24uIFRoYXQgbWVhbnMgdGhhdCBtb3ZpbmcgZm9yd2FyZCBhbG9uZyB0aGUgYm91bmRhcnkgaXMgdG8gdHJhdmVsIGluCisgKiBzdWNoIGEgd2F5IHRoYXQgdGhlIGludGVyaW9yIG9mIHRoZSBzaGFwZSBpcyB0byB0aGUgbGVmdCBvZiB0aGUgb3V0bGluZSBwYXRoCisgKiBhbmQgdGhlIGV4dGVyaW9yIG9mIHRoZSBzaGFwZSBpcyB0byB0aGUgcmlnaHQgb2YgdGhlIG91dGxpbmUgcGF0aC4gVGhlCisgKiBpbnRlcmlvciBhbmQgZXh0ZXJpb3Igb2YgdGhlIHNoYXBlIGFyZSBkZXRlcm1pbmVkIGJ5IGEgd2luZGluZyBydWxlLgorICogPC9wPgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBQYXRoSXRlcmF0b3IgewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBXSU5EX0VWRU5fT0REIGluZGljYXRlcyB0aGUgd2luZGluZyBydWxlIHRoYXQgc2F5cyAKLSAgICAgKiB0aGF0IGEgcG9pbnQgaXMgb3V0c2lkZSB0aGUgc2hhcGUgaWYgYW55IGluZmluaXRlIHJheSBmcm9tIHRoZSBwb2ludCAKLSAgICAgKiBjcm9zc2VzIHRoZSBvdXRsaW5lIG9mIHRoZSBzaGFwZSBhbiBldmVuIG51bWJlciBvZiB0aW1lcywgb3RoZXJ3aXNlCi0gICAgICogaXQgaXMgaW5zaWRlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBXSU5EX0VWRU5fT0REIGluZGljYXRlcyB0aGUgd2luZGluZyBydWxlIHRoYXQgc2F5cyB0aGF0IGEKKyAgICAgKiBwb2ludCBpcyBvdXRzaWRlIHRoZSBzaGFwZSBpZiBhbnkgaW5maW5pdGUgcmF5IGZyb20gdGhlIHBvaW50IGNyb3NzZXMgdGhlCisgICAgICogb3V0bGluZSBvZiB0aGUgc2hhcGUgYW4gZXZlbiBudW1iZXIgb2YgdGltZXMsIG90aGVyd2lzZSBpdCBpcyBpbnNpZGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lORF9FVkVOX09ERCA9IDA7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBXSU5EX05PTl9aRVJPIGluZGljYXRlcyB0aGUgd2luZGluZyBydWxlIHRoYXQgc2F5cyB0aGF0Ci0gICAgICogYSBwb2ludCBpcyBpbnNpZGUgdGhlIHNoYXBlIGlmIGV2ZXJ5IGluZmluaXRlIHJheSBzdGFydGluZyBmcm9tIHRoYXQKLSAgICAgKiBwb2ludCBjcm9zc2VzIHRoZSBvdXRsaW5lIG9mIHRoZSBzaGFwZSBhIG5vbi16ZXJvIG51bWJlciBvZiB0aW1lcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBXSU5EX05PTl9aRVJPIGluZGljYXRlcyB0aGUgd2luZGluZyBydWxlIHRoYXQgc2F5cyB0aGF0IGEKKyAgICAgKiBwb2ludCBpcyBpbnNpZGUgdGhlIHNoYXBlIGlmIGV2ZXJ5IGluZmluaXRlIHJheSBzdGFydGluZyBmcm9tIHRoYXQgcG9pbnQKKyAgICAgKiBjcm9zc2VzIHRoZSBvdXRsaW5lIG9mIHRoZSBzaGFwZSBhIG5vbi16ZXJvIG51bWJlciBvZiB0aW1lcy4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSU5EX05PTl9aRVJPID0gMTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgU0VHX01PVkVUTyBpbmRpY2F0ZXMgdGhhdCB0byBmb2xsb3cgdGhlIHNoYXBlJ3Mgb3V0bGluZQotICAgICAqIGZyb20gdGhlIHByZXZpb3VzIHBvaW50IHRvIHRoZSBjdXJyZW50IHBvaW50LCB0aGUgY3Vyc29yICh0cmF2ZXJzYWwgCi0gICAgICogcG9pbnQpIHNob3VsZCBiZSBwbGFjZWQgZGlyZWN0bHkgb24gdGhlIGN1cnJlbnQgcG9pbnQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VHX01PVkVUTyAgPSAwOwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgU0VHX0xJTkVUTyBpbmRpY2F0ZXMgdGhhdCB0byBmb2xsb3cgdGhlIHNoYXBlJ3Mgb3V0bGluZQotICAgICAqIGZyb20gdGhlIHByZXZpb3VzIHBvaW50IHRvIHRoZSBjdXJyZW50IHBvaW50LCB0aGUgY3Vyc29yICh0cmF2ZXJzYWwgCi0gICAgICogcG9pbnQpIHNob3VsZCBmb2xsb3cgYSBzdHJhaWdodCBsaW5lLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFR19MSU5FVE8gID0gMTsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IFNFR19RVUFEVE8gaW5kaWNhdGVzIHRoYXQgdG8gZm9sbG93IHRoZSBzaGFwZSdzIG91dGxpbmUKLSAgICAgKiBmcm9tIHRoZSBwcmV2aW91cyBwb2ludCB0byB0aGUgY3VycmVudCBwb2ludCwgdGhlIGN1cnNvciAodHJhdmVyc2FsIAotICAgICAqIHBvaW50KSBzaG91bGQgZm9sbG93IGEgcXVhZHJhdGljIGN1cnZlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFR19RVUFEVE8gID0gMjsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IFNFR19DVUJJQ1RPIGluZGljYXRlcyB0aGF0IHRvIGZvbGxvdyB0aGUgc2hhcGUncyBvdXRsaW5lCi0gICAgICogZnJvbSB0aGUgcHJldmlvdXMgcG9pbnQgdG8gdGhlIGN1cnJlbnQgcG9pbnQsIHRoZSBjdXJzb3IgKHRyYXZlcnNhbCAKLSAgICAgKiBwb2ludCkgc2hvdWxkIGZvbGxvdyBhIGN1YmljIGN1cnZlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBTRUdfTU9WRVRPIGluZGljYXRlcyB0aGF0IHRvIGZvbGxvdyB0aGUgc2hhcGUncyBvdXRsaW5lIGZyb20KKyAgICAgKiB0aGUgcHJldmlvdXMgcG9pbnQgdG8gdGhlIGN1cnJlbnQgcG9pbnQsIHRoZSBjdXJzb3IgKHRyYXZlcnNhbCBwb2ludCkKKyAgICAgKiBzaG91bGQgYmUgcGxhY2VkIGRpcmVjdGx5IG9uIHRoZSBjdXJyZW50IHBvaW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFR19NT1ZFVE8gPSAwOworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNFR19MSU5FVE8gaW5kaWNhdGVzIHRoYXQgdG8gZm9sbG93IHRoZSBzaGFwZSdzIG91dGxpbmUgZnJvbQorICAgICAqIHRoZSBwcmV2aW91cyBwb2ludCB0byB0aGUgY3VycmVudCBwb2ludCwgdGhlIGN1cnNvciAodHJhdmVyc2FsIHBvaW50KQorICAgICAqIHNob3VsZCBmb2xsb3cgYSBzdHJhaWdodCBsaW5lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFR19MSU5FVE8gPSAxOworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNFR19RVUFEVE8gaW5kaWNhdGVzIHRoYXQgdG8gZm9sbG93IHRoZSBzaGFwZSdzIG91dGxpbmUgZnJvbQorICAgICAqIHRoZSBwcmV2aW91cyBwb2ludCB0byB0aGUgY3VycmVudCBwb2ludCwgdGhlIGN1cnNvciAodHJhdmVyc2FsIHBvaW50KQorICAgICAqIHNob3VsZCBmb2xsb3cgYSBxdWFkcmF0aWMgY3VydmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VHX1FVQURUTyA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU0VHX0NVQklDVE8gaW5kaWNhdGVzIHRoYXQgdG8gZm9sbG93IHRoZSBzaGFwZSdzIG91dGxpbmUKKyAgICAgKiBmcm9tIHRoZSBwcmV2aW91cyBwb2ludCB0byB0aGUgY3VycmVudCBwb2ludCwgdGhlIGN1cnNvciAodHJhdmVyc2FsCisgICAgICogcG9pbnQpIHNob3VsZCBmb2xsb3cgYSBjdWJpYyBjdXJ2ZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUdfQ1VCSUNUTyA9IDM7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBTRUdfQ0xPU0UgaW5kaWNhdGVzIHRoYXQgdGhlIHByZXZpb3VzIHBvaW50IHdhcyB0aGUgZW5kCi0gICAgICogb2YgdGhlIHNoYXBlJ3Mgb3V0bGluZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUdfQ0xPU0UgICA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU0VHX0NMT1NFIGluZGljYXRlcyB0aGF0IHRoZSBwcmV2aW91cyBwb2ludCB3YXMgdGhlIGVuZCBvZgorICAgICAqIHRoZSBzaGFwZSdzIG91dGxpbmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VHX0NMT1NFID0gNDsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHdpbmRpbmcgcnVsZSwgZWl0aGVyIHtAbGluayBQYXRoSXRlcmF0b3IjV0lORF9FVkVOX09ERH0gb3IKICAgICAgKiB7QGxpbmsgUGF0aEl0ZXJhdG9yI1dJTkRfTk9OX1pFUk99LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHdpbmRpbmcgcnVsZQorICAgICAqIEByZXR1cm4gdGhlIHdpbmRpbmcgcnVsZS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFdpbmRpbmdSdWxlKCk7CiAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhpcyBQYXRoSXRlcmF0b3IgaGFzIGJlZW4gY29tcGxldGVseSB0cmF2ZXJzZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIFBhdGhJdGVyYXRvciBoYXMgYmVlbiBjb21wbGV0ZWx5IHRyYXZlcnNlZAorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBQYXRoSXRlcmF0b3IgaGFzIGJlZW4gY29tcGxldGVseSB0cmF2ZXJzZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNEb25lKCk7CiAKQEAgLTkzLDQwICsxMDgsMzkgQEAKICAgICBwdWJsaWMgdm9pZCBuZXh0KCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgbmV4dCB2ZXJ0ZXggcG9pbnQgYWxvbmcgdGhlIHNoYXBlJ3Mgb3V0bGluZSAKLSAgICAgKiBhbmQgYSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoYXQga2luZCBvZiBzZWdtZW50IHRvIHVzZSBpbiBvcmRlciB0byAKLSAgICAgKiBjb25uZWN0IHRoZSBwcmV2aW91cyB2ZXJ0ZXggcG9pbnQgdG8gdGhlIGN1cnJlbnQgdmVydGV4IHBvaW50IHRvIGZvcm0gCi0gICAgICogdGhlIGN1cnJlbnQgc2VnbWVudC4KKyAgICAgKiBHZXRzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgbmV4dCB2ZXJ0ZXggcG9pbnQgYWxvbmcgdGhlIHNoYXBlJ3Mgb3V0bGluZQorICAgICAqIGFuZCBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hhdCBraW5kIG9mIHNlZ21lbnQgdG8gdXNlIGluIG9yZGVyIHRvIGNvbm5lY3QKKyAgICAgKiB0aGUgcHJldmlvdXMgdmVydGV4IHBvaW50IHRvIHRoZSBjdXJyZW50IHZlcnRleCBwb2ludCB0byBmb3JtIHRoZSBjdXJyZW50CisgICAgICogc2VnbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29vcmRzIHRoZSBhcnJheSB0aGF0IHRoZSBjb29yZGluYXRlcyBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJyZW50IAotICAgICAqIHNlZ21lbnQgYXJlIHdyaXR0ZW4gaW50by4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmbGFnIHRoYXQgaW5kaWNhdGVzIGhvdyB0byBmb2xsb3cgdGhlIHNoYXBlJ3Mgb3V0bGluZQotICAgICAqIGZyb20gdGhlIHByZXZpb3VzIHBvaW50IHRvIHRoZSBjdXJyZW50IG9uZSwgY2hvc2VuIGZyb20gCi0gICAgICogdGhlIGZvbGxvd2luZyBjb25zdGFudHM6Ci0gICAgICoge0BsaW5rIFBhdGhJdGVyYXRvciNTRUdfTU9WRVRPfSwge0BsaW5rIFBhdGhJdGVyYXRvciNTRUdfTElORVRPfSwgCi0gICAgICoge0BsaW5rIFBhdGhJdGVyYXRvciNTRUdfUVVBRFRPfSwge0BsaW5rIFBhdGhJdGVyYXRvciNTRUdfQ1VCSUNUT30sIAotICAgICAqIG9yIHtAbGluayBQYXRoSXRlcmF0b3IjU0VHX0NMT1NFfQorICAgICAqIEBwYXJhbSBjb29yZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB0aGF0IHRoZSBjb29yZGluYXRlcyBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJyZW50CisgICAgICogICAgICAgICAgICBzZWdtZW50IGFyZSB3cml0dGVuIGludG8uCisgICAgICogQHJldHVybiB0aGUgZmxhZyB0aGF0IGluZGljYXRlcyBob3cgdG8gZm9sbG93IHRoZSBzaGFwZSdzIG91dGxpbmUgZnJvbQorICAgICAqICAgICAgICAgdGhlIHByZXZpb3VzIHBvaW50IHRvIHRoZSBjdXJyZW50IG9uZSwgY2hvc2VuIGZyb20gdGhlIGZvbGxvd2luZworICAgICAqICAgICAgICAgY29uc3RhbnRzOiB7QGxpbmsgUGF0aEl0ZXJhdG9yI1NFR19NT1ZFVE99LAorICAgICAqICAgICAgICAge0BsaW5rIFBhdGhJdGVyYXRvciNTRUdfTElORVRPfSwge0BsaW5rIFBhdGhJdGVyYXRvciNTRUdfUVVBRFRPfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBQYXRoSXRlcmF0b3IjU0VHX0NVQklDVE99LCBvcgorICAgICAqICAgICAgICAge0BsaW5rIFBhdGhJdGVyYXRvciNTRUdfQ0xPU0V9LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY3VycmVudFNlZ21lbnQoZmxvYXRbXSBjb29yZHMpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIG5leHQgdmVydGV4IHBvaW50IGFsb25nIHRoZSBzaGFwZSdzIG91dGxpbmUgCi0gICAgICogYW5kIGEgZmxhZyB0aGF0IGluZGljYXRlcyB3aGF0IGtpbmQgb2Ygc2VnbWVudCB0byB1c2UgaW4gb3JkZXIgdG8gCi0gICAgICogY29ubmVjdCB0aGUgcHJldmlvdXMgdmVydGV4IHBvaW50IHRvIHRoZSBjdXJyZW50IHZlcnRleCBwb2ludCB0byBmb3JtIAotICAgICAqIHRoZSBjdXJyZW50IHNlZ21lbnQuCisgICAgICogR2V0cyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIG5leHQgdmVydGV4IHBvaW50IGFsb25nIHRoZSBzaGFwZSdzIG91dGxpbmUKKyAgICAgKiBhbmQgYSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoYXQga2luZCBvZiBzZWdtZW50IHRvIHVzZSBpbiBvcmRlciB0byBjb25uZWN0CisgICAgICogdGhlIHByZXZpb3VzIHZlcnRleCBwb2ludCB0byB0aGUgY3VycmVudCB2ZXJ0ZXggcG9pbnQgdG8gZm9ybSB0aGUgY3VycmVudAorICAgICAqIHNlZ21lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvb3JkcyB0aGUgYXJyYXkgdGhhdCB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VycmVudCAKLSAgICAgKiBzZWdtZW50IGFyZSB3cml0dGVuIGludG8uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmxhZyB0aGF0IGluZGljYXRlcyBob3cgdG8gZm9sbG93IHRoZSBzaGFwZSdzIG91dGxpbmUKLSAgICAgKiBmcm9tIHRoZSBwcmV2aW91cyBwb2ludCB0byB0aGUgY3VycmVudCBvbmUsIGNob3NlbiBmcm9tIAotICAgICAqIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgotICAgICAqIHtAbGluayBQYXRoSXRlcmF0b3IjU0VHX01PVkVUT30sIHtAbGluayBQYXRoSXRlcmF0b3IjU0VHX0xJTkVUT30sIAotICAgICAqIHtAbGluayBQYXRoSXRlcmF0b3IjU0VHX1FVQURUT30sIHtAbGluayBQYXRoSXRlcmF0b3IjU0VHX0NVQklDVE99LCAKLSAgICAgKiBvciB7QGxpbmsgUGF0aEl0ZXJhdG9yI1NFR19DTE9TRX0KKyAgICAgKiBAcGFyYW0gY29vcmRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgdGhhdCB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VycmVudAorICAgICAqICAgICAgICAgICAgc2VnbWVudCBhcmUgd3JpdHRlbiBpbnRvLgorICAgICAqIEByZXR1cm4gdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgaG93IHRvIGZvbGxvdyB0aGUgc2hhcGUncyBvdXRsaW5lIGZyb20KKyAgICAgKiAgICAgICAgIHRoZSBwcmV2aW91cyBwb2ludCB0byB0aGUgY3VycmVudCBvbmUsIGNob3NlbiBmcm9tIHRoZSBmb2xsb3dpbmcKKyAgICAgKiAgICAgICAgIGNvbnN0YW50czoge0BsaW5rIFBhdGhJdGVyYXRvciNTRUdfTU9WRVRPfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBQYXRoSXRlcmF0b3IjU0VHX0xJTkVUT30sIHtAbGluayBQYXRoSXRlcmF0b3IjU0VHX1FVQURUT30sCisgICAgICogICAgICAgICB7QGxpbmsgUGF0aEl0ZXJhdG9yI1NFR19DVUJJQ1RPfSwgb3IKKyAgICAgKiAgICAgICAgIHtAbGluayBQYXRoSXRlcmF0b3IjU0VHX0NMT1NFfS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGN1cnJlbnRTZWdtZW50KGRvdWJsZVtdIGNvb3Jkcyk7CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2dlb20vUG9pbnQyRC5qYXZhIGIvYXd0L2phdmEvYXd0L2dlb20vUG9pbnQyRC5qYXZhCmluZGV4IDc3MTllNjcuLmY3MDI2YzggMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9nZW9tL1BvaW50MkQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZ2VvbS9Qb2ludDJELmphdmEKQEAgLTE4LDQwICsxOCw1MSBAQAogICogQGF1dGhvciBEZW5pcyBNLiBLaXNoZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZ2VvbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5taXNjLkhhc2hDb2RlOwogCiAvKioKLSAqIFRoZSBDbGFzcyBQb2ludDJEIHJlcHJlc2VudHMgYSBwb2ludCB3aG9zZSBkYXRhIGlzIGdpdmVuIGluIAotICogaGlnaC1wcmVjaXNpb24gdmFsdWVzIGFwcHJvcHJpYXRlIGZvciBncmFwaGljYWwgb3BlcmF0aW9ucy4KKyAqIFRoZSBDbGFzcyBQb2ludDJEIHJlcHJlc2VudHMgYSBwb2ludCB3aG9zZSBkYXRhIGlzIGdpdmVuIGluIGhpZ2gtcHJlY2lzaW9uCisgKiB2YWx1ZXMgYXBwcm9wcmlhdGUgZm9yIGdyYXBoaWNhbCBvcGVyYXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFBvaW50MkQgaW1wbGVtZW50cyBDbG9uZWFibGUgewogCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIEZsb2F0IGlzIHRoZSBzdWJjbGFzcyBvZiBQb2ludDJEIHRoYXQgaGFzIGFsbCAKLSAgICAgKiBvZiBpdHMgZGF0YSB2YWx1ZXMgc3RvcmVkIHdpdGggZmxvYXQtbGV2ZWwgcHJlY2lzaW9uLgorICAgICAqIFRoZSBDbGFzcyBGbG9hdCBpcyB0aGUgc3ViY2xhc3Mgb2YgUG9pbnQyRCB0aGF0IGhhcyBhbGwgb2YgaXRzIGRhdGEKKyAgICAgKiB2YWx1ZXMgc3RvcmVkIHdpdGggZmxvYXQtbGV2ZWwgcHJlY2lzaW9uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmxvYXQgZXh0ZW5kcyBQb2ludDJEIHsKIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IHk7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBmbG9hdC12YWx1ZWQgUG9pbnQyRCB3aXRoIGl0cyBkYXRhIAotICAgICAgICAgKiBzZXQgdG8gemVyby4KKyAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZsb2F0LXZhbHVlZCBQb2ludDJEIHdpdGggaXRzIGRhdGEgc2V0IHRvIHplcm8uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRmxvYXQoKSB7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZsb2F0LXZhbHVlZCBQb2ludDJEIHdpdGggdGhlIHNwZWNpZmllZCBjb29yZGluYXRlcy4KKyAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZsb2F0LXZhbHVlZCBQb2ludDJEIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAgICAgKiBjb29yZGluYXRlcy4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUKLSAgICAgICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZQorICAgICAgICAgKiBAcGFyYW0geAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUuCisgICAgICAgICAqIEBwYXJhbSB5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBGbG9hdChmbG9hdCB4LCBmbG9hdCB5KSB7CiAgICAgICAgICAgICB0aGlzLnggPSB4OwpAQCAtNzEsOCArODIsMTAgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFNldHMgdGhlIHBvaW50J3MgY29vcmRpbmF0ZXMuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlCi0gICAgICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUKKyAgICAgICAgICogQHBhcmFtIHgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlLgorICAgICAgICAgKiBAcGFyYW0geQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihmbG9hdCB4LCBmbG9hdCB5KSB7CiAgICAgICAgICAgICB0aGlzLnggPSB4OwpAQCAtOTIsMjkgKzEwNSwzNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoZSBDbGFzcyBEb3VibGUgaXMgdGhlIHN1YmNsYXNzIG9mIFBvaW50MkQgdGhhdCBoYXMgYWxsIAotICAgICAqIG9mIGl0cyBkYXRhIHZhbHVlcyBzdG9yZWQgd2l0aCBkb3VibGUtbGV2ZWwgcHJlY2lzaW9uLgorICAgICAqIFRoZSBDbGFzcyBEb3VibGUgaXMgdGhlIHN1YmNsYXNzIG9mIFBvaW50MkQgdGhhdCBoYXMgYWxsIG9mIGl0cyBkYXRhCisgICAgICogdmFsdWVzIHN0b3JlZCB3aXRoIGRvdWJsZS1sZXZlbCBwcmVjaXNpb24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEb3VibGUgZXh0ZW5kcyBQb2ludDJEIHsKIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIHg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHkgY29vcmRpbmF0ZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgeTsKIAogICAgICAgICAvKioKLSAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRvdWJsZS12YWx1ZWQgUG9pbnQyRCB3aXRoIGl0cyBkYXRhIAotICAgICAgICAgKiBzZXQgdG8gemVyby4KKyAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRvdWJsZS12YWx1ZWQgUG9pbnQyRCB3aXRoIGl0cyBkYXRhIHNldCB0byB6ZXJvLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIERvdWJsZSgpIHsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZG91YmxlLXZhbHVlZCBQb2ludDJEIHdpdGggdGhlIHNwZWNpZmllZCBjb29yZGluYXRlcy4KKyAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRvdWJsZS12YWx1ZWQgUG9pbnQyRCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgICogY29vcmRpbmF0ZXMuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlCi0gICAgICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUKKyAgICAgICAgICogQHBhcmFtIHgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlLgorICAgICAgICAgKiBAcGFyYW0geQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRG91YmxlKGRvdWJsZSB4LCBkb3VibGUgeSkgewogICAgICAgICAgICAgdGhpcy54ID0geDsKQEAgLTE1MiwyOSArMTczLDMyIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgeCBjb29yZGluYXRlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHggY29vcmRpbmF0ZQorICAgICAqIEByZXR1cm4gdGhlIHggY29vcmRpbmF0ZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldFgoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHkgY29vcmRpbmF0ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB5IGNvb3JkaW5hdGUKKyAgICAgKiBAcmV0dXJuIHRoZSB5IGNvb3JkaW5hdGUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRZKCk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBwb2ludCdzIGNvb3JkaW5hdGVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUKLSAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TG9jYXRpb24oZG91YmxlIHgsIGRvdWJsZSB5KTsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHBvaW50J3MgY29vcmRpbmF0ZXMgYnkgY29weWluZyB0aGVtIGZyb20gYW5vdGhlciBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgcG9pbnQgdG8gY29weSB0aGUgZGF0YSBmcm9tCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2ludCB0byBjb3B5IHRoZSBkYXRhIGZyb20uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oUG9pbnQyRCBwKSB7CiAgICAgICAgIHNldExvY2F0aW9uKHAuZ2V0WCgpLCBwLmdldFkoKSk7CkBAIC0xODMsMTIgKzIwNywxNSBAQAogICAgIC8qKgogICAgICAqIEZpbmRzIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBzcGVjaWZpZWQgcG9pbnRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludAotICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludAotICAgICAqIEBwYXJhbSB4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQKLSAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gc3BlY2lmaWVkIHBvaW50cworICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBzcGVjaWZpZWQgcG9pbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGRpc3RhbmNlU3EoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyKSB7CiAgICAgICAgIHgyIC09IHgxOwpAQCAtMTk3LDIzICsyMjQsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGaW5kcyB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgcG9pbnQgYW5kIHRoZSBzcGVjaWZpZWQgcG9pbnQuCisgICAgICogRmluZHMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIHBvaW50IGFuZCB0aGUgc3BlY2lmaWVkCisgICAgICogcG9pbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50Ci0gICAgICogQHBhcmFtIHB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgcG9pbnQgYW5kIHRoZSBzcGVjaWZpZWQgcG9pbnQKKyAgICAgKiBAcGFyYW0gcHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LgorICAgICAqIEBwYXJhbSBweQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgcG9pbnQgYW5kIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgZGlzdGFuY2VTcShkb3VibGUgcHgsIGRvdWJsZSBweSkgewogICAgICAgICByZXR1cm4gUG9pbnQyRC5kaXN0YW5jZVNxKGdldFgoKSwgZ2V0WSgpLCBweCwgcHkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhpcyBwb2ludCBhbmQgdGhlIHNwZWNpZmllZCBwb2ludC4KKyAgICAgKiBGaW5kcyB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgcG9pbnQgYW5kIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgb3RoZXIgcG9pbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhpcyBwb2ludCBhbmQgdGhlIHNwZWNpZmllZCBwb2ludAorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgb3RoZXIgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgcG9pbnQgYW5kIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgZGlzdGFuY2VTcShQb2ludDJEIHApIHsKICAgICAgICAgcmV0dXJuIFBvaW50MkQuZGlzdGFuY2VTcShnZXRYKCksIGdldFkoKSwgcC5nZXRYKCksIHAuZ2V0WSgpKTsKQEAgLTIyMiwxMiArMjU0LDE1IEBACiAgICAgLyoqCiAgICAgICogRmluZHMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBzcGVjaWZpZWQgcG9pbnRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludAotICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludAotICAgICAqIEBwYXJhbSB4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQKLSAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHNwZWNpZmllZCBwb2ludHMKKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHNwZWNpZmllZCBwb2ludHMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgZGlzdGFuY2UoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyKSB7CiAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoZGlzdGFuY2VTcSh4MSwgeTEsIHgyLCB5MikpOwpAQCAtMjM2LDEwICsyNzEsMTEgQEAKICAgICAvKioKICAgICAgKiBGaW5kcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIHBvaW50IGFuZCB0aGUgc3BlY2lmaWVkIHBvaW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBweCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBwb2ludAotICAgICAqIEBwYXJhbSBweSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBwb2ludAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhpcyBwb2ludCBhbmQgdGhlIHNwZWNpZmllZCBwb2ludAorICAgICAqIEBwYXJhbSBweAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuCisgICAgICogQHBhcmFtIHB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgcG9pbnQgYW5kIHRoZSBzcGVjaWZpZWQgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZSBkaXN0YW5jZShkb3VibGUgcHgsIGRvdWJsZSBweSkgewogICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KGRpc3RhbmNlU3EocHgsIHB5KSk7CkBAIC0yNDgsOSArMjg0LDkgQEAKICAgICAvKioKICAgICAgKiBGaW5kcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIHBvaW50IGFuZCB0aGUgc3BlY2lmaWVkIHBvaW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIHRoZSBvdGhlciBwb2ludAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhpcyBwb2ludCBhbmQgdGhlIHNwZWNpZmllZCBwb2ludAorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgb3RoZXIgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIHBvaW50IGFuZCB0aGUgc3BlY2lmaWVkIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgZGlzdGFuY2UoUG9pbnQyRCBwKSB7CiAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoZGlzdGFuY2VTcShwKSk7CkBAIC0yNzksMTAgKzMxNSw5IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUG9pbnQyRCkgewotICAgICAgICAgICAgUG9pbnQyRCBwID0gKFBvaW50MkQpIG9iajsKKyAgICAgICAgICAgIFBvaW50MkQgcCA9IChQb2ludDJEKW9iajsKICAgICAgICAgICAgIHJldHVybiBnZXRYKCkgPT0gcC5nZXRYKCkgJiYgZ2V0WSgpID09IHAuZ2V0WSgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9nZW9tL1F1YWRDdXJ2ZTJELmphdmEgYi9hd3QvamF2YS9hd3QvZ2VvbS9RdWFkQ3VydmUyRC5qYXZhCmluZGV4IDY0ZWE2ZDYuLjdhODZhNDggMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9nZW9tL1F1YWRDdXJ2ZTJELmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2dlb20vUXVhZEN1cnZlMkQuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBEZW5pcyBNLiBLaXNoZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZ2VvbTsKIAogaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKQEAgLTI4LDQyICsyOSw1OCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBDbGFzcyBRdWFkQ3VydmUyRCBpcyBhIFNoYXBlIHRoYXQgcmVwcmVzZW50cyBhIHNlZ21lbnQgb2YgYSAKLSAqIHF1YWRyYXRpYyAoQmV6aWVyKSBjdXJ2ZS4gVGhlIGN1cnZlZCBzZWdtZW50IGlzIGRldGVybWluZWQgYnkgdGhyZWUgcG9pbnRzOgotICogYSBzdGFydCBwb2ludCwgYW4gZW5kIHBvaW50LCBhbmQgYSBjb250cm9sIHBvaW50LiAgVGhlIGxpbmUgZnJvbSB0aGUgY29udHJvbCAKLSAqIHBvaW50IHRvIHRoZSBzdGFydGluZyBwb2ludCBnaXZlcyB0aGUgdGFuZ2VudCB0byB0aGUgY3VydmUgYXQgdGhlCi0gKiBzdGFydGluZyBwb2ludCwgYW5kIHRoZSBsaW5lIGZyb20gdGhlIGNvbnRyb2wgcG9pbnQgdG8gdGhlIGVuZCBwb2ludCAKLSAqIGdpdmVzIHRoZSB0YW5nZW50IHRvIHRoZSBjdXJ2ZSBhdCB0aGUgZW5kIHBvaW50LgorICogVGhlIENsYXNzIFF1YWRDdXJ2ZTJEIGlzIGEgU2hhcGUgdGhhdCByZXByZXNlbnRzIGEgc2VnbWVudCBvZiBhIHF1YWRyYXRpYworICogKEJlemllcikgY3VydmUuIFRoZSBjdXJ2ZWQgc2VnbWVudCBpcyBkZXRlcm1pbmVkIGJ5IHRocmVlIHBvaW50czogYSBzdGFydAorICogcG9pbnQsIGFuIGVuZCBwb2ludCwgYW5kIGEgY29udHJvbCBwb2ludC4gVGhlIGxpbmUgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0bworICogdGhlIHN0YXJ0aW5nIHBvaW50IGdpdmVzIHRoZSB0YW5nZW50IHRvIHRoZSBjdXJ2ZSBhdCB0aGUgc3RhcnRpbmcgcG9pbnQsIGFuZAorICogdGhlIGxpbmUgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUgZW5kIHBvaW50IGdpdmVzIHRoZSB0YW5nZW50IHRvIHRoZQorICogY3VydmUgYXQgdGhlIGVuZCBwb2ludC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBRdWFkQ3VydmUyRCBpbXBsZW1lbnRzIFNoYXBlLCBDbG9uZWFibGUgewogCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIEZsb2F0IGlzIHRoZSBzdWJjbGFzcyBvZiBRdWFkQ3VydmUyRCB0aGF0IGhhcyBhbGwgCi0gICAgICogb2YgaXRzIGRhdGEgdmFsdWVzIHN0b3JlZCB3aXRoIGZsb2F0LWxldmVsIHByZWNpc2lvbi4KKyAgICAgKiBUaGUgQ2xhc3MgRmxvYXQgaXMgdGhlIHN1YmNsYXNzIG9mIFF1YWRDdXJ2ZTJEIHRoYXQgaGFzIGFsbCBvZiBpdHMgZGF0YQorICAgICAqIHZhbHVlcyBzdG9yZWQgd2l0aCBmbG9hdC1sZXZlbCBwcmVjaXNpb24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGbG9hdCBleHRlbmRzIFF1YWRDdXJ2ZTJEIHsKIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IHgxOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IHkxOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuICAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IGN0cmx4OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgY3RybHk7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB4MjsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IHkyOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxvYXQtdmFsdWVkIFF1YWRDdXJ2ZTJEIHdpdGggYWxsIGNvb3JkaW5hdGUgdmFsdWVzCi0gICAgICAgICAqIHNldCB0byB6ZXJvLgorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxvYXQtdmFsdWVkIFF1YWRDdXJ2ZTJEIHdpdGggYWxsIGNvb3JkaW5hdGUKKyAgICAgICAgICogdmFsdWVzIHNldCB0byB6ZXJvLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEZsb2F0KCkgewogICAgICAgICB9CkBAIC03MiwxMiArODksMjAgQEAKICAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZsb2F0LXZhbHVlZCBRdWFkQ3VydmUyRCB3aXRoIHRoZSBzcGVjaWZpZWQKICAgICAgICAgICogY29vcmRpbmF0ZSB2YWx1ZXMuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0geDEgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50Ci0gICAgICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQKLSAgICAgICAgICogQHBhcmFtIGN0cmx4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIGN0cmx5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQKLSAgICAgICAgICogQHBhcmFtIHkyIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQKKyAgICAgICAgICogQHBhcmFtIHgxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZAorICAgICAgICAgKiAgICAgICAgICAgIHNlZ21lbnQuCisgICAgICAgICAqIEBwYXJhbSB5MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQKKyAgICAgICAgICogICAgICAgICAgICBzZWdtZW50LgorICAgICAgICAgKiBAcGFyYW0gY3RybHgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0gY3RybHkKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0geDIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAgICAgKiBAcGFyYW0geTIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEZsb2F0KGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgY3RybHgsIGZsb2F0IGN0cmx5LCBmbG9hdCB4MiwgZmxvYXQgeTIpIHsKICAgICAgICAgICAgIHNldEN1cnZlKHgxLCB5MSwgY3RybHgsIGN0cmx5LCB4MiwgeTIpOwpAQCAtMTQxLDEyICsxNjYsMjAgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFNldHMgdGhlIGRhdGEgdmFsdWVzIG9mIHRoZSBjdXJ2ZS4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQKLSAgICAgICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAgICAgKiBAcGFyYW0gY3RybHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludAotICAgICAgICAgKiBAcGFyYW0gY3RybHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludAotICAgICAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAorICAgICAgICAgKiBAcGFyYW0geDEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkCisgICAgICAgICAqICAgICAgICAgICAgc2VnbWVudC4KKyAgICAgICAgICogQHBhcmFtIHkxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZAorICAgICAgICAgKiAgICAgICAgICAgIHNlZ21lbnQuCisgICAgICAgICAqIEBwYXJhbSBjdHJseAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSBjdHJseQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSB4MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCisgICAgICAgICAqIEBwYXJhbSB5MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBzZXRDdXJ2ZShmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IGN0cmx4LCBmbG9hdCBjdHJseSwgZmxvYXQgeDIsIGZsb2F0IHkyKSB7CiAgICAgICAgICAgICB0aGlzLngxID0geDE7CkBAIC0xNjcsMzIgKzIwMCw0NiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoZSBDbGFzcyBEb3VibGUgaXMgdGhlIHN1YmNsYXNzIG9mIFF1YWRDdXJ2ZTJEIHRoYXQgaGFzIGFsbCAKLSAgICAgKiBvZiBpdHMgZGF0YSB2YWx1ZXMgc3RvcmVkIHdpdGggZG91YmxlLWxldmVsIHByZWNpc2lvbi4KKyAgICAgKiBUaGUgQ2xhc3MgRG91YmxlIGlzIHRoZSBzdWJjbGFzcyBvZiBRdWFkQ3VydmUyRCB0aGF0IGhhcyBhbGwgb2YgaXRzIGRhdGEKKyAgICAgKiB2YWx1ZXMgc3RvcmVkIHdpdGggZG91YmxlLWxldmVsIHByZWNpc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERvdWJsZSBleHRlbmRzIFF1YWRDdXJ2ZTJEIHsKIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSB4MTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgeTE7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgY3RybHg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgY3RybHk7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgeDI7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgeTI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkb3VibGUtdmFsdWVkIFF1YWRDdXJ2ZTJEIHdpdGggYWxsIGNvb3JkaW5hdGUgdmFsdWVzCi0gICAgICAgICAqIHNldCB0byB6ZXJvLgorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZG91YmxlLXZhbHVlZCBRdWFkQ3VydmUyRCB3aXRoIGFsbCBjb29yZGluYXRlCisgICAgICAgICAqIHZhbHVlcyBzZXQgdG8gemVyby4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBEb3VibGUoKSB7CiAgICAgICAgIH0KQEAgLTIwMSwxMiArMjQ4LDIwIEBACiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkb3VibGUtdmFsdWVkIFF1YWRDdXJ2ZTJEIHdpdGggdGhlIHNwZWNpZmllZAogICAgICAgICAgKiBjb29yZGluYXRlIHZhbHVlcy4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQKLSAgICAgICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAgICAgKiBAcGFyYW0gY3RybHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludAotICAgICAgICAgKiBAcGFyYW0gY3RybHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludAotICAgICAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAorICAgICAgICAgKiBAcGFyYW0geDEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkCisgICAgICAgICAqICAgICAgICAgICAgc2VnbWVudC4KKyAgICAgICAgICogQHBhcmFtIHkxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZAorICAgICAgICAgKiAgICAgICAgICAgIHNlZ21lbnQuCisgICAgICAgICAqIEBwYXJhbSBjdHJseAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSBjdHJseQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSB4MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCisgICAgICAgICAqIEBwYXJhbSB5MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRG91YmxlKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgY3RybHgsIGRvdWJsZSBjdHJseSwgZG91YmxlIHgyLCBkb3VibGUgeTIpIHsKICAgICAgICAgICAgIHNldEN1cnZlKHgxLCB5MSwgY3RybHgsIGN0cmx5LCB4MiwgeTIpOwpAQCAtMjc3LDI4ICszMzIsMzcgQEAKICAgICB9CiAKICAgICAvKgotICAgICAqIFF1YWRDdXJ2ZTJEIHBhdGggaXRlcmF0b3IgCisgICAgICogUXVhZEN1cnZlMkQgcGF0aCBpdGVyYXRvcgogICAgICAqLwogICAgIC8qKgogICAgICAqIFRoZSBQYXRoSXRlcmF0b3IgZm9yIGEgUXVhZDJEIGN1cnZlLgogICAgICAqLwogICAgIGNsYXNzIEl0ZXJhdG9yIGltcGxlbWVudHMgUGF0aEl0ZXJhdG9yIHsKIAotICAgICAgICAvKiogVGhlIHNvdXJjZSBRdWFkQ3VydmUyRCBvYmplY3QuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc291cmNlIFF1YWRDdXJ2ZTJEIG9iamVjdC4KKyAgICAgICAgICovCiAgICAgICAgIFF1YWRDdXJ2ZTJEIGM7CiAKLSAgICAgICAgLyoqIFRoZSBwYXRoIGl0ZXJhdG9yIHRyYW5zZm9ybWF0aW9uLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBhdGggaXRlcmF0b3IgdHJhbnNmb3JtYXRpb24uCisgICAgICAgICAqLwogICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdDsKIAotICAgICAgICAvKiogVGhlIGN1cnJlbnQgc2VnbWVudCBpbmRleC4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjdXJyZW50IHNlZ21lbnQgaW5kZXguCisgICAgICAgICAqLwogICAgICAgICBpbnQgaW5kZXg7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUXVhZEN1cnZlMkQuSXRlcmF0b3IgZm9yIGdpdmVuIGN1cnZlIGFuZCB0cmFuc2Zvcm1hdGlvbgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFF1YWRDdXJ2ZTJELkl0ZXJhdG9yIGZvciBnaXZlbiBjdXJ2ZSBhbmQKKyAgICAgICAgICogdHJhbnNmb3JtYXRpb24KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBxIC0gdGhlIHNvdXJjZSBRdWFkQ3VydmUyRCBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIHQgdGhlIEFmZmluZVRyYW5zZm9ybSB0aGF0IGFjdHMgb24gdGhlIGNvb3JkaW5hdGVzIGJlZm9yZSAKLSAgICAgICAgICogcmV0dXJuaW5nIHRoZW0gKG9yIG51bGwpCisgICAgICAgICAqIEBwYXJhbSBxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBRdWFkQ3VydmUyRCBvYmplY3QuCisgICAgICAgICAqIEBwYXJhbSB0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIEFmZmluZVRyYW5zZm9ybSB0aGF0IGFjdHMgb24gdGhlIGNvb3JkaW5hdGVzIGJlZm9yZQorICAgICAgICAgKiAgICAgICAgICAgIHJldHVybmluZyB0aGVtIChvciBudWxsKS4KICAgICAgICAgICovCiAgICAgICAgIEl0ZXJhdG9yKFF1YWRDdXJ2ZTJEIHEsIEFmZmluZVRyYW5zZm9ybSB0KSB7CiAgICAgICAgICAgICB0aGlzLmMgPSBxOwpAQCAtMzgwLDI4NCArNDQ0LDMwNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRYMSgpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50CisgICAgICogQHJldHVybiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldFkxKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBzdGFydGluZyBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdGFydGluZyBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBQb2ludDJEIGdldFAxKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50CisgICAgICogQHJldHVybiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0Q3RybFgoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHkgY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludAorICAgICAqIEByZXR1cm4geSBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0Q3RybFkoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGNvbnRyb2wgcG9pbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udHJvbCBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIGNvbnRyb2wgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFBvaW50MkQgZ2V0Q3RybFB0KCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0WDIoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50CisgICAgICogQHJldHVybiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRZMigpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZW5kIHBvaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGVuZCBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIGVuZCBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgUG9pbnQyRCBnZXRQMigpOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgY3VydmUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0gY3RybHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSBjdHJseSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAorICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAqIEBwYXJhbSBjdHJseAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0gY3RybHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDdXJ2ZShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIGN0cmx4LCBkb3VibGUgY3RybHksIGRvdWJsZSB4MiwgZG91YmxlIHkyKTsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDdXJ2ZShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIGN0cmx4LCBkb3VibGUgY3RybHksIGRvdWJsZSB4MiwKKyAgICAgICAgICAgIGRvdWJsZSB5Mik7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBkYXRhIG9mIHRoZSBjdXJ2ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcDEgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAqIEBwYXJhbSBjcCB0aGUgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSBwMiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYW55IG9mIHRoZSB0aHJlZSBwb2ludHMgaXMgbnVsbC4KKyAgICAgKiBAcGFyYW0gcDEKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCisgICAgICogQHBhcmFtIGNwCisgICAgICogICAgICAgICAgICB0aGUgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0gcDIKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbnkgb2YgdGhlIHRocmVlIHBvaW50cyBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEN1cnZlKFBvaW50MkQgcDEsIFBvaW50MkQgY3AsIFBvaW50MkQgcDIpIHsKICAgICAgICAgc2V0Q3VydmUocDEuZ2V0WCgpLCBwMS5nZXRZKCksIGNwLmdldFgoKSwgY3AuZ2V0WSgpLCBwMi5nZXRYKCksIHAyLmdldFkoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgY3VydmUgYnkgcmVhZGluZyB0aGUgZGF0YSBmcm9tIGFuIGFycmF5Ci0gICAgICogb2YgdmFsdWVzLiBUaGUgdmFsdWVzIGFyZSByZWFkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBhcmd1bWVudHMKLSAgICAgKiBvZiB0aGUgbWV0aG9kIHtAbGluayBRdWFkQ3VydmUyRCNzZXRDdXJ2ZShkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKX0uCisgICAgICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgY3VydmUgYnkgcmVhZGluZyB0aGUgZGF0YSBmcm9tIGFuIGFycmF5IG9mIHZhbHVlcy4KKyAgICAgKiBUaGUgdmFsdWVzIGFyZSByZWFkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZAorICAgICAqIHtAbGluayBRdWFkQ3VydmUyRCNzZXRDdXJ2ZShkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKX0KKyAgICAgKiAuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvb3JkcyB0aGUgYXJyYXkgb2YgdmFsdWVzIGNvbnRhaW5pbmcgdGhlIG5ldyBjb29yZGluYXRlcwotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byByZWFkIHdpdGhpbiB0aGUgYXJyYXkKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBjb29yZHMubGVuZ3RoIDwgb2Zmc2V0ICsgNi4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBjb29yZGluYXRlIGFycmF5IGlzIG51bGwuCisgICAgICogQHBhcmFtIGNvb3JkcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHZhbHVlcyBjb250YWluaW5nIHRoZSBuZXcgY29vcmRpbmF0ZXMuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byByZWFkIHdpdGhpbiB0aGUgYXJyYXkuCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgY29vcmRzLmxlbmd0aH0gPCBvZmZzZXQgKyA2LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY29vcmRpbmF0ZSBhcnJheSBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEN1cnZlKGRvdWJsZVtdIGNvb3JkcywgaW50IG9mZnNldCkgewotICAgICAgICBzZXRDdXJ2ZSgKLSAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgMF0sIGNvb3Jkc1tvZmZzZXQgKyAxXSwKLSAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgMl0sIGNvb3Jkc1tvZmZzZXQgKyAzXSwKKyAgICAgICAgc2V0Q3VydmUoY29vcmRzW29mZnNldCArIDBdLCBjb29yZHNbb2Zmc2V0ICsgMV0sIGNvb3Jkc1tvZmZzZXQgKyAyXSwgY29vcmRzW29mZnNldCArIDNdLAogICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyA0XSwgY29vcmRzW29mZnNldCArIDVdKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkYXRhIG9mIHRoZSBjdXJ2ZSBieSByZWFkaW5nIHRoZSBkYXRhIGZyb20gYW4gYXJyYXkKLSAgICAgKiBvZiBwb2ludHMuIFRoZSB2YWx1ZXMgYXJlIHJlYWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGFyZ3VtZW50cwotICAgICAqIG9mIHRoZSBtZXRob2Qge0BsaW5rIFF1YWRDdXJ2ZTJEI3NldEN1cnZlKFBvaW50MkQsIFBvaW50MkQsIFBvaW50MkQpfQorICAgICAqIFNldHMgdGhlIGRhdGEgb2YgdGhlIGN1cnZlIGJ5IHJlYWRpbmcgdGhlIGRhdGEgZnJvbSBhbiBhcnJheSBvZiBwb2ludHMuCisgICAgICogVGhlIHZhbHVlcyBhcmUgcmVhZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QKKyAgICAgKiB7QGxpbmsgUXVhZEN1cnZlMkQjc2V0Q3VydmUoUG9pbnQyRCwgUG9pbnQyRCwgUG9pbnQyRCl9LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwb2ludHMgdGhlIGFycmF5IG9mIHBvaW50cyBjb250YWluaW5nIHRoZSBuZXcgY29vcmRpbmF0ZXMKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgdG8gcmVhZCB3aXRoaW4gdGhlIGFycmF5Ci0gICAgICogCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgcG9pbnRzLmxlbmd0aCA8IG9mZnNldCArIDMuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgcG9pbnQgYXJyYXkgaXMgbnVsbC4KKyAgICAgKiBAcGFyYW0gcG9pbnRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcG9pbnRzIGNvbnRhaW5pbmcgdGhlIG5ldyBjb29yZGluYXRlcy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHRvIHJlYWQgd2l0aGluIHRoZSBhcnJheS4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHBvaW50cy5sZW5ndGggPCBvZmZzZXQgKyAzLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcG9pbnQgYXJyYXkgaXMgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDdXJ2ZShQb2ludDJEW10gcG9pbnRzLCBpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIHNldEN1cnZlKAotICAgICAgICAgICAgICAgIHBvaW50c1tvZmZzZXQgKyAwXS5nZXRYKCksIHBvaW50c1tvZmZzZXQgKyAwXS5nZXRZKCksCi0gICAgICAgICAgICAgICAgcG9pbnRzW29mZnNldCArIDFdLmdldFgoKSwgcG9pbnRzW29mZnNldCArIDFdLmdldFkoKSwKLSAgICAgICAgICAgICAgICBwb2ludHNbb2Zmc2V0ICsgMl0uZ2V0WCgpLCBwb2ludHNbb2Zmc2V0ICsgMl0uZ2V0WSgpKTsKKyAgICAgICAgc2V0Q3VydmUocG9pbnRzW29mZnNldCArIDBdLmdldFgoKSwgcG9pbnRzW29mZnNldCArIDBdLmdldFkoKSwgcG9pbnRzW29mZnNldCArIDFdLmdldFgoKSwKKyAgICAgICAgICAgICAgICBwb2ludHNbb2Zmc2V0ICsgMV0uZ2V0WSgpLCBwb2ludHNbb2Zmc2V0ICsgMl0uZ2V0WCgpLCBwb2ludHNbb2Zmc2V0ICsgMl0uZ2V0WSgpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBkYXRhIG9mIHRoZSBjdXJ2ZSBieSBjb3B5aW5nIGl0IGZyb20gYW5vdGhlciBRdWFkQ3VydmUyRC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY3VydmUgdGhlIGN1cnZlIHRvIGNvcHkgdGhlIGRhdGEgcG9pbnRzIGZyb20KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBjdXJ2ZSBpcyBudWxsLgorICAgICAqIEBwYXJhbSBjdXJ2ZQorICAgICAqICAgICAgICAgICAgdGhlIGN1cnZlIHRvIGNvcHkgdGhlIGRhdGEgcG9pbnRzIGZyb20uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjdXJ2ZSBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEN1cnZlKFF1YWRDdXJ2ZTJEIGN1cnZlKSB7Ci0gICAgICAgIHNldEN1cnZlKAotICAgICAgICAgICAgICAgIGN1cnZlLmdldFgxKCksIGN1cnZlLmdldFkxKCksCi0gICAgICAgICAgICAgICAgY3VydmUuZ2V0Q3RybFgoKSwgY3VydmUuZ2V0Q3RybFkoKSwKLSAgICAgICAgICAgICAgICBjdXJ2ZS5nZXRYMigpLCBjdXJ2ZS5nZXRZMigpKTsKKyAgICAgICAgc2V0Q3VydmUoY3VydmUuZ2V0WDEoKSwgY3VydmUuZ2V0WTEoKSwgY3VydmUuZ2V0Q3RybFgoKSwgY3VydmUuZ2V0Q3RybFkoKSwgY3VydmUuZ2V0WDIoKSwKKyAgICAgICAgICAgICAgICBjdXJ2ZS5nZXRZMigpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNvbnRyb2wgcG9pbnQgdG8gdGhlCi0gICAgICogc3RyYWlnaHQgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHN0YXJ0IHBvaW50IGFuZCB0aGUgZW5kIHBvaW50Ci0gICAgICogZm9yIHRoaXMgY3VydmUuCisgICAgICogR2V0cyB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvIHRoZSBzdHJhaWdodAorICAgICAqIGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSBzdGFydCBwb2ludCBhbmQgdGhlIGVuZCBwb2ludCBmb3IgdGhpcyBjdXJ2ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNvbnRyb2wgcG9pbnQgdG8gdGhlCi0gICAgICogc3RyYWlnaHQgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHN0YXJ0IHBvaW50IGFuZCB0aGUgZW5kIHBvaW50LgorICAgICAqIEByZXR1cm4gdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUgc3RyYWlnaHQKKyAgICAgKiAgICAgICAgIGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSBzdGFydCBwb2ludCBhbmQgdGhlIGVuZCBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlIGdldEZsYXRuZXNzU3EoKSB7Ci0gICAgICAgIHJldHVybiBMaW5lMkQucHRTZWdEaXN0U3EoCi0gICAgICAgICAgICAgICAgZ2V0WDEoKSwgZ2V0WTEoKSwKLSAgICAgICAgICAgICAgICBnZXRYMigpLCBnZXRZMigpLAotICAgICAgICAgICAgICAgIGdldEN0cmxYKCksIGdldEN0cmxZKCkpOworICAgICAgICByZXR1cm4gTGluZTJELnB0U2VnRGlzdFNxKGdldFgxKCksIGdldFkxKCksIGdldFgyKCksIGdldFkyKCksIGdldEN0cmxYKCksIGdldEN0cmxZKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUKLSAgICAgKiBzdHJhaWdodCBsaW5lIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgc3RhcnQgcG9pbnQgYW5kIHRoZSBlbmQgcG9pbnQuCisgICAgICogR2V0cyB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvIHRoZSBzdHJhaWdodAorICAgICAqIGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSBzdGFydCBwb2ludCBhbmQgdGhlIGVuZCBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50Ci0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAqIEBwYXJhbSBjdHJseCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIGN0cmx5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvIHRoZQotICAgICAqIHN0cmFpZ2h0IGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSBzdGFydCBwb2ludCBhbmQgdGhlIGVuZCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0gY3RybHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIGN0cmx5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCisgICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvIHRoZSBzdHJhaWdodAorICAgICAqICAgICAgICAgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHN0YXJ0IHBvaW50IGFuZCB0aGUgZW5kIHBvaW50LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGdldEZsYXRuZXNzU3EoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSBjdHJseCwgZG91YmxlIGN0cmx5LCBkb3VibGUgeDIsIGRvdWJsZSB5MikgeworICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGdldEZsYXRuZXNzU3EoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSBjdHJseCwgZG91YmxlIGN0cmx5LCBkb3VibGUgeDIsCisgICAgICAgICAgICBkb3VibGUgeTIpIHsKICAgICAgICAgcmV0dXJuIExpbmUyRC5wdFNlZ0Rpc3RTcSh4MSwgeTEsIHgyLCB5MiwgY3RybHgsIGN0cmx5KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNvbnRyb2wgcG9pbnQgdG8gdGhlCi0gICAgICogc3RyYWlnaHQgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHN0YXJ0IHBvaW50IGFuZCB0aGUgZW5kIHBvaW50Ci0gICAgICogYnkgcmVhZGluZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHBvaW50cyBmcm9tIGFuIGFycmF5IG9mIHZhbHVlcy4KLSAgICAgKiBUaGUgdmFsdWVzIGFyZSByZWFkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBhcmd1bWVudHMKLSAgICAgKiBvZiB0aGUgbWV0aG9kIHtAbGluayBRdWFkQ3VydmUyRCNnZXRGbGF0bmVzc1NxKGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpfS4KKyAgICAgKiBHZXRzIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNvbnRyb2wgcG9pbnQgdG8gdGhlIHN0cmFpZ2h0CisgICAgICogbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHN0YXJ0IHBvaW50IGFuZCB0aGUgZW5kIHBvaW50IGJ5IHJlYWRpbmcgdGhlCisgICAgICogY29vcmRpbmF0ZXMgb2YgdGhlIHBvaW50cyBmcm9tIGFuIGFycmF5IG9mIHZhbHVlcy4gVGhlIHZhbHVlcyBhcmUgcmVhZCBpbgorICAgICAqIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZAorICAgICAqIHtAbGluayBRdWFkQ3VydmUyRCNnZXRGbGF0bmVzc1NxKGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpfQorICAgICAqIC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29vcmRzIHRoZSBhcnJheSBvZiBwb2ludHMgY29udGFpbmluZyB0aGUgY29vcmRpbmF0ZXMgdG8gdXNlIGZvciAKLSAgICAgKiB0aGUgY2FsY3VsYXRpb24KLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgdG8gcmVhZCB3aXRoaW4gdGhlIGFycmF5Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvIHRoZQotICAgICAqIHN0cmFpZ2h0IGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSBzdGFydCBwb2ludCBhbmQgdGhlIGVuZCBwb2ludC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBjb29yZHMubGVuZ3RoIDwgb2Zmc2V0ICsgNi4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBjb29yZGluYXRlIGFycmF5IGlzIG51bGwuCisgICAgICogQHBhcmFtIGNvb3JkcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHBvaW50cyBjb250YWluaW5nIHRoZSBjb29yZGluYXRlcyB0byB1c2UgZm9yIHRoZQorICAgICAqICAgICAgICAgICAgY2FsY3VsYXRpb24KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHRvIHJlYWQgd2l0aGluIHRoZSBhcnJheQorICAgICAqIEByZXR1cm4gdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUgc3RyYWlnaHQKKyAgICAgKiAgICAgICAgIGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSBzdGFydCBwb2ludCBhbmQgdGhlIGVuZCBwb2ludC4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjb29yZHMubGVuZ3RofSA8IG9mZnNldCArIDYuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjb29yZGluYXRlIGFycmF5IGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0RmxhdG5lc3NTcShkb3VibGUgY29vcmRzW10sIGludCBvZmZzZXQpIHsKLSAgICAgICAgcmV0dXJuIExpbmUyRC5wdFNlZ0Rpc3RTcSgKLSAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgMF0sIGNvb3Jkc1tvZmZzZXQgKyAxXSwKLSAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgNF0sIGNvb3Jkc1tvZmZzZXQgKyA1XSwKLSAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgMl0sIGNvb3Jkc1tvZmZzZXQgKyAzXSk7CisgICAgICAgIHJldHVybiBMaW5lMkQucHRTZWdEaXN0U3EoY29vcmRzW29mZnNldCArIDBdLCBjb29yZHNbb2Zmc2V0ICsgMV0sIGNvb3Jkc1tvZmZzZXQgKyA0XSwKKyAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgNV0sIGNvb3Jkc1tvZmZzZXQgKyAyXSwgY29vcmRzW29mZnNldCArIDNdKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvIHRoZQotICAgICAqIHN0cmFpZ2h0IGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSBzdGFydCBwb2ludCBhbmQgdGhlIGVuZCBwb2ludAotICAgICAqIG9mIHRoaXMgUXVhZEN1cnZlMkQuCisgICAgICogR2V0cyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUgc3RyYWlnaHQgbGluZSBzZWdtZW50CisgICAgICogY29ubmVjdGluZyB0aGUgc3RhcnQgcG9pbnQgYW5kIHRoZSBlbmQgcG9pbnQgb2YgdGhpcyBRdWFkQ3VydmUyRC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUKLSAgICAgKiBzdHJhaWdodCBsaW5lIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgc3RhcnQgcG9pbnQgYW5kIHRoZSBlbmQgcG9pbnQKLSAgICAgKiBvZiB0aGlzIFF1YWRDdXJ2ZTJECisgICAgICogQHJldHVybiB0aGUgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNvbnRyb2wgcG9pbnQgdG8gdGhlIHN0cmFpZ2h0IGxpbmUKKyAgICAgKiAgICAgICAgIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgc3RhcnQgcG9pbnQgYW5kIHRoZSBlbmQgcG9pbnQgb2YgdGhpcworICAgICAqICAgICAgICAgUXVhZEN1cnZlMkQuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZSBnZXRGbGF0bmVzcygpIHsKICAgICAgICAgcmV0dXJuIExpbmUyRC5wdFNlZ0Rpc3QoZ2V0WDEoKSwgZ2V0WTEoKSwgZ2V0WDIoKSwgZ2V0WTIoKSwgZ2V0Q3RybFgoKSwgZ2V0Q3RybFkoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUKLSAgICAgKiBzdHJhaWdodCBsaW5lIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgc3RhcnQgcG9pbnQgYW5kIHRoZSBlbmQgcG9pbnQuCisgICAgICogR2V0cyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUgc3RyYWlnaHQgbGluZSBzZWdtZW50CisgICAgICogY29ubmVjdGluZyB0aGUgc3RhcnQgcG9pbnQgYW5kIHRoZSBlbmQgcG9pbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0gY3RybHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSBjdHJseSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvIHRoZQotICAgICAqIHN0cmFpZ2h0IGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSBzdGFydCBwb2ludCBhbmQgdGhlIGVuZCBwb2ludAorICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAqIEBwYXJhbSBjdHJseAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0gY3RybHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUgc3RyYWlnaHQgbGluZQorICAgICAqICAgICAgICAgc2VnbWVudCBjb25uZWN0aW5nIHRoZSBzdGFydCBwb2ludCBhbmQgdGhlIGVuZCBwb2ludC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRGbGF0bmVzcyhkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIGN0cmx4LAotICAgICAgICAgICAgZG91YmxlIGN0cmx5LCBkb3VibGUgeDIsIGRvdWJsZSB5MikKLSAgICB7CisgICAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0RmxhdG5lc3MoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSBjdHJseCwgZG91YmxlIGN0cmx5LCBkb3VibGUgeDIsCisgICAgICAgICAgICBkb3VibGUgeTIpIHsKICAgICAgICAgcmV0dXJuIExpbmUyRC5wdFNlZ0Rpc3QoeDEsIHkxLCB4MiwgeTIsIGN0cmx4LCBjdHJseSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNvbnRyb2wgcG9pbnQgdG8gdGhlCi0gICAgICogc3RyYWlnaHQgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHN0YXJ0IHBvaW50IGFuZCB0aGUgZW5kIHBvaW50LgotICAgICAqIFRoZSB2YWx1ZXMgYXJlIHJlYWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGFyZ3VtZW50cwotICAgICAqIG9mIHRoZSBtZXRob2Qge0BsaW5rIFF1YWRDdXJ2ZTJEI2dldEZsYXRuZXNzKGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpfS4KKyAgICAgKiBHZXRzIHRoZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUgc3RyYWlnaHQgbGluZSBzZWdtZW50CisgICAgICogY29ubmVjdGluZyB0aGUgc3RhcnQgcG9pbnQgYW5kIHRoZSBlbmQgcG9pbnQuIFRoZSB2YWx1ZXMgYXJlIHJlYWQgaW4gdGhlCisgICAgICogc2FtZSBvcmRlciBhcyB0aGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QKKyAgICAgKiB7QGxpbmsgUXVhZEN1cnZlMkQjZ2V0RmxhdG5lc3MoZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSl9CisgICAgICogLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb29yZHMgdGhlIGFycmF5IG9mIHBvaW50cyBjb250YWluaW5nIHRoZSBjb29yZGluYXRlcyB0byB1c2UgZm9yIAotICAgICAqIHRoZSBjYWxjdWxhdGlvbgotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byByZWFkIHdpdGhpbiB0aGUgYXJyYXkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUKLSAgICAgKiBzdHJhaWdodCBsaW5lIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgc3RhcnQgcG9pbnQgYW5kIHRoZSBlbmQgcG9pbnQKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBjb29yZHMubGVuZ3RoIDwgb2Zmc2V0ICsgNi4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBjb29yZGluYXRlIGFycmF5IGlzIG51bGwuCisgICAgICogQHBhcmFtIGNvb3JkcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHBvaW50cyBjb250YWluaW5nIHRoZSBjb29yZGluYXRlcyB0byB1c2UgZm9yIHRoZQorICAgICAqICAgICAgICAgICAgY2FsY3VsYXRpb24uCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byByZWFkIHdpdGhpbiB0aGUgYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNvbnRyb2wgcG9pbnQgdG8gdGhlIHN0cmFpZ2h0IGxpbmUKKyAgICAgKiAgICAgICAgIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgc3RhcnQgcG9pbnQgYW5kIHRoZSBlbmQgcG9pbnQuCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7Y29kZSBjb29yZHMubGVuZ3RofSA8IG9mZnNldCArIDYuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjb29yZGluYXRlIGFycmF5IGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0RmxhdG5lc3MoZG91YmxlIGNvb3Jkc1tdLCBpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBMaW5lMkQucHRTZWdEaXN0KAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyAwXSwgY29vcmRzW29mZnNldCArIDFdLAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyA0XSwgY29vcmRzW29mZnNldCArIDVdLAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyAyXSwgY29vcmRzW29mZnNldCArIDNdKTsKKyAgICAgICAgcmV0dXJuIExpbmUyRC5wdFNlZ0Rpc3QoY29vcmRzW29mZnNldCArIDBdLCBjb29yZHNbb2Zmc2V0ICsgMV0sIGNvb3Jkc1tvZmZzZXQgKyA0XSwKKyAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgNV0sIGNvb3Jkc1tvZmZzZXQgKyAyXSwgY29vcmRzW29mZnNldCArIDNdKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBkYXRhIGZvciB0d28gcXVhZHJhdGljIGN1cnZlcyBieSBkaXZpZGluZyB0aGlzCi0gICAgICogY3VydmUgaW4gdHdvLiBUaGUgZGl2aXNpb24gcG9pbnQgaXMgdGhlIHBvaW50IG9uIHRoZSBjdXJ2ZSAKLSAgICAgKiB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhpcyBjdXJ2ZSdzIGNvbnRyb2wgcG9pbnQuIFRoZSBkYXRhIG9mIAotICAgICAqIHRoaXMgY3VydmUgaXMgbGVmdCB1bmNoYW5nZWQuCisgICAgICogQ3JlYXRlcyB0aGUgZGF0YSBmb3IgdHdvIHF1YWRyYXRpYyBjdXJ2ZXMgYnkgZGl2aWRpbmcgdGhpcyBjdXJ2ZSBpbiB0d28uCisgICAgICogVGhlIGRpdmlzaW9uIHBvaW50IGlzIHRoZSBwb2ludCBvbiB0aGUgY3VydmUgdGhhdCBpcyBjbG9zZXN0IHRvIHRoaXMKKyAgICAgKiBjdXJ2ZSdzIGNvbnRyb2wgcG9pbnQuIFRoZSBkYXRhIG9mIHRoaXMgY3VydmUgaXMgbGVmdCB1bmNoYW5nZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxlZnQgdGhlIFF1YWRDdXJ2ZTJEIHdoZXJlIHRoZSBsZWZ0IChzdGFydCkgc2VnbWVudCdzIAotICAgICAqIGRhdGEgaXMgd3JpdHRlbgotICAgICAqIEBwYXJhbSByaWdodCB0aGUgUXVhZEN1cnZlMkQgd2hlcmUgdGhlIHJpZ2h0IChlbmQpIHNlZ21lbnQncyAKLSAgICAgKiBkYXRhIGlzIHdyaXR0ZW4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGVpdGhlciBjdXJ2ZSBpcyBudWxsLgorICAgICAqIEBwYXJhbSBsZWZ0CisgICAgICogICAgICAgICAgICB0aGUgUXVhZEN1cnZlMkQgd2hlcmUgdGhlIGxlZnQgKHN0YXJ0KSBzZWdtZW50J3MgZGF0YSBpcworICAgICAqICAgICAgICAgICAgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gcmlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBRdWFkQ3VydmUyRCB3aGVyZSB0aGUgcmlnaHQgKGVuZCkgc2VnbWVudCdzIGRhdGEgaXMKKyAgICAgKiAgICAgICAgICAgIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGVpdGhlciBjdXJ2ZSBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN1YmRpdmlkZShRdWFkQ3VydmUyRCBsZWZ0LCBRdWFkQ3VydmUyRCByaWdodCkgewogICAgICAgICBzdWJkaXZpZGUodGhpcywgbGVmdCwgcmlnaHQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGRhdGEgZm9yIHR3byBxdWFkcmF0aWMgY3VydmVzIGJ5IGRpdmlkaW5nIGEgc291cmNlCi0gICAgICogY3VydmUgaW4gdHdvLiBUaGUgZGl2aXNpb24gcG9pbnQgaXMgdGhlIHBvaW50IG9uIHRoZSBjdXJ2ZSAKLSAgICAgKiB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhlIHNvdXJjZSBjdXJ2ZSdzIGNvbnRyb2wgcG9pbnQuIFRoZSBkYXRhIG9mIAotICAgICAqIHRoZSBzb3VyY2UgY3VydmUgaXMgbGVmdCB1bmNoYW5nZWQuCisgICAgICogQ3JlYXRlcyB0aGUgZGF0YSBmb3IgdHdvIHF1YWRyYXRpYyBjdXJ2ZXMgYnkgZGl2aWRpbmcgYSBzb3VyY2UgY3VydmUgaW4KKyAgICAgKiB0d28uIFRoZSBkaXZpc2lvbiBwb2ludCBpcyB0aGUgcG9pbnQgb24gdGhlIGN1cnZlIHRoYXQgaXMgY2xvc2VzdCB0byB0aGUKKyAgICAgKiBzb3VyY2UgY3VydmUncyBjb250cm9sIHBvaW50LiBUaGUgZGF0YSBvZiB0aGUgc291cmNlIGN1cnZlIGlzIGxlZnQKKyAgICAgKiB1bmNoYW5nZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgY3VydmUgdGhhdCBwcm92aWRlcyB0aGUgaW5pdGlhbCBkYXRhCi0gICAgICogQHBhcmFtIGxlZnQgdGhlIFF1YWRDdXJ2ZTJEIHdoZXJlIHRoZSBsZWZ0IChzdGFydCkgc2VnbWVudCdzIAotICAgICAqIGRhdGEgaXMgd3JpdHRlbgotICAgICAqIEBwYXJhbSByaWdodCB0aGUgUXVhZEN1cnZlMkQgd2hlcmUgdGhlIHJpZ2h0IChlbmQpIHNlZ21lbnQncyAKLSAgICAgKiBkYXRhIGlzIHdyaXR0ZW4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIG9uZSBvZiB0aGUgY3VydmVzIGlzIG51bGwuCisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIGN1cnZlIHRoYXQgcHJvdmlkZXMgdGhlIGluaXRpYWwgZGF0YS4KKyAgICAgKiBAcGFyYW0gbGVmdAorICAgICAqICAgICAgICAgICAgdGhlIFF1YWRDdXJ2ZTJEIHdoZXJlIHRoZSBsZWZ0IChzdGFydCkgc2VnbWVudCdzIGRhdGEgaXMKKyAgICAgKiAgICAgICAgICAgIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIHJpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgUXVhZEN1cnZlMkQgd2hlcmUgdGhlIHJpZ2h0IChlbmQpIHNlZ21lbnQncyBkYXRhIGlzCisgICAgICogICAgICAgICAgICB3cml0dGVuLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBvbmUgb2YgdGhlIGN1cnZlcyBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdWJkaXZpZGUoUXVhZEN1cnZlMkQgc3JjLCBRdWFkQ3VydmUyRCBsZWZ0LCBRdWFkQ3VydmUyRCByaWdodCkgewogICAgICAgICBkb3VibGUgeDEgPSBzcmMuZ2V0WDEoKTsKQEAgLTY4MSwyNiArNzY4LDMzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZGF0YSBmb3IgdHdvIHF1YWRyYXRpYyBjdXJ2ZXMgYnkgZGl2aWRpbmcgYSBzb3VyY2UKLSAgICAgKiBjdXJ2ZSBpbiB0d28uIFRoZSBkaXZpc2lvbiBwb2ludCBpcyB0aGUgcG9pbnQgb24gdGhlIGN1cnZlIAotICAgICAqIHRoYXQgaXMgY2xvc2VzdCB0byB0aGUgc291cmNlIGN1cnZlJ3MgY29udHJvbCBwb2ludC4gVGhlIGRhdGEKLSAgICAgKiBmb3IgdGhlIHRocmVlIGN1cnZlcyBpcyByZWFkIGFuZCB3cml0dGVuIGZyb20gYXJyYXlzIG9mIHZhbHVlcyBpbiAKLSAgICAgKiB0aGUgdXN1YWwgb3JkZXI6IHgxLCB5MSwgY3gsIGN5LCB4MiwgeTIuCi0gICAgICogIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIGFycmF5IHRoYXQgZ2l2ZXMgdGhlIGRhdGEgdmFsdWVzIGZvciB0aGUgc291cmNlIGN1cnZlCi0gICAgICogQHBhcmFtIHNyY29mZiB0aGUgb2Zmc2V0IGluIHRoZSBzcmMgYXJyYXkgdG8gcmVhZCB0aGUgdmFsdWVzIGZyb20KLSAgICAgKiBAcGFyYW0gbGVmdCB0aGUgYXJyYXkgd2hlcmUgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBzdGFydCBjdXJ2ZSBzaG91bGQgYmUgd3JpdHRlbgotICAgICAqIEBwYXJhbSBsZWZ0T2ZmIHRoZSBvZmZzZXQgaW4gdGhlIGxlZnQgYXJyYXkgdG8gc3RhcnQgd3JpdGluZyB0aGUgdmFsdWVzCi0gICAgICogQHBhcmFtIHJpZ2h0IHRoZSBhcnJheSB3aGVyZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGVuZCBjdXJ2ZSBzaG91bGQgYmUgd3JpdHRlbgotICAgICAqIEBwYXJhbSByaWdodE9mZiB0aGUgb2Zmc2V0IGluIHRoZSByaWdodCBhcnJheSB0byBzdGFydCB3cml0aW5nIHRoZSB2YWx1ZXMKKyAgICAgKiBDcmVhdGVzIHRoZSBkYXRhIGZvciB0d28gcXVhZHJhdGljIGN1cnZlcyBieSBkaXZpZGluZyBhIHNvdXJjZSBjdXJ2ZSBpbgorICAgICAqIHR3by4gVGhlIGRpdmlzaW9uIHBvaW50IGlzIHRoZSBwb2ludCBvbiB0aGUgY3VydmUgdGhhdCBpcyBjbG9zZXN0IHRvIHRoZQorICAgICAqIHNvdXJjZSBjdXJ2ZSdzIGNvbnRyb2wgcG9pbnQuIFRoZSBkYXRhIGZvciB0aGUgdGhyZWUgY3VydmVzIGlzIHJlYWQgYW5kCisgICAgICogd3JpdHRlbiBmcm9tIGFycmF5cyBvZiB2YWx1ZXMgaW4gdGhlIHVzdWFsIG9yZGVyOiB4MSwgeTEsIGN4LCBjeSwgeDIsIHkyLgogICAgICAqIAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHNyYy5sZW5ndGggPCBzcmNvZmYgKyA2Ci0gICAgICogb3IgaWYgbGVmdC5sZW5ndGggPCBsZWZ0T2ZmICsgNiBvciBpZiByaWdodC5sZW5ndGggPCByaWdodE9mZiArIDYuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBvbmUgb2YgdGhlIGFycmF5cyBpcyBudWxsLgorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB0aGF0IGdpdmVzIHRoZSBkYXRhIHZhbHVlcyBmb3IgdGhlIHNvdXJjZSBjdXJ2ZS4KKyAgICAgKiBAcGFyYW0gc3Jjb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBzcmMgYXJyYXkgdG8gcmVhZCB0aGUgdmFsdWVzIGZyb20uCisgICAgICogQHBhcmFtIGxlZnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB3aGVyZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHN0YXJ0IGN1cnZlIHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gbGVmdE9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgbGVmdCBhcnJheSB0byBzdGFydCB3cml0aW5nIHRoZSB2YWx1ZXMuCisgICAgICogQHBhcmFtIHJpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgd2hlcmUgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBlbmQgY3VydmUgc2hvdWxkIGJlCisgICAgICogICAgICAgICAgICB3cml0dGVuLgorICAgICAqIEBwYXJhbSByaWdodE9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgcmlnaHQgYXJyYXkgdG8gc3RhcnQgd3JpdGluZyB0aGUgdmFsdWVzLgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIHNyYy5sZW5ndGh9IDwgc3Jjb2ZmICsgNiBvciBpZiB7QGNvZGUgbGVmdC5sZW5ndGh9CisgICAgICogICAgICAgICAgICAgPCBsZWZ0T2ZmICsgNiBvciBpZiB7QGNvZGUgcmlnaHQubGVuZ3RofSA8IHJpZ2h0T2ZmICsgNi4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgb25lIG9mIHRoZSBhcnJheXMgaXMgbnVsbC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3ViZGl2aWRlKGRvdWJsZSBzcmNbXSwgaW50IHNyY29mZiwgZG91YmxlIGxlZnRbXSwKLSAgICAgICAgICAgIGludCBsZWZ0T2ZmLCBkb3VibGUgcmlnaHRbXSwgaW50IHJpZ2h0T2ZmKQotICAgIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3ViZGl2aWRlKGRvdWJsZSBzcmNbXSwgaW50IHNyY29mZiwgZG91YmxlIGxlZnRbXSwgaW50IGxlZnRPZmYsCisgICAgICAgICAgICBkb3VibGUgcmlnaHRbXSwgaW50IHJpZ2h0T2ZmKSB7CiAgICAgICAgIGRvdWJsZSB4MSA9IHNyY1tzcmNvZmYgKyAwXTsKICAgICAgICAgZG91YmxlIHkxID0gc3JjW3NyY29mZiArIDFdOwogICAgICAgICBkb3VibGUgY3ggPSBzcmNbc3Jjb2ZmICsgMl07CkBAIC03MzIsNDIgKzgyNiw0MyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSByb290cyBvZiB0aGUgcXVhZHJhdGljIHBvbHlub21pYWwuIFRoaXMgaXMgCi0gICAgICogYWNjb21wbGlzaGVkIGJ5IGZpbmRpbmcgdGhlIChyZWFsKSB2YWx1ZXMgb2YgeCB0aGF0IHNvbHZlCi0gICAgICogdGhlIGZvbGxvd2luZyBlcXVhdGlvbjogZXFuWzJdKngqeCArIGVxblsxXSp4ICsgZXFuWzBdID0gMC4KLSAgICAgKiBUaGUgc29sdXRpb25zIGFyZSB3cml0dGVuIGJhY2sgaW50byB0aGUgYXJyYXkgZXFuIHN0YXJ0aW5nCi0gICAgICogZnJvbSB0aGUgaW5kZXggMCBpbiB0aGUgYXJyYXkuIFRoZSByZXR1cm4gdmFsdWUgdGVsbHMgaG93IAotICAgICAqIG1hbnkgYXJyYXkgZWxlbWVudHMgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgdGhpcyBtZXRob2QgY2FsbC4KKyAgICAgKiBGaW5kcyB0aGUgcm9vdHMgb2YgdGhlIHF1YWRyYXRpYyBwb2x5bm9taWFsLiBUaGlzIGlzIGFjY29tcGxpc2hlZCBieQorICAgICAqIGZpbmRpbmcgdGhlIChyZWFsKSB2YWx1ZXMgb2YgeCB0aGF0IHNvbHZlIHRoZSBmb2xsb3dpbmcgZXF1YXRpb246CisgICAgICogZXFuWzJdKngqeCArIGVxblsxXSp4ICsgZXFuWzBdID0gMC4gVGhlIHNvbHV0aW9ucyBhcmUgd3JpdHRlbiBiYWNrIGludG8KKyAgICAgKiB0aGUgYXJyYXkgZXFuIHN0YXJ0aW5nIGZyb20gdGhlIGluZGV4IDAgaW4gdGhlIGFycmF5LiBUaGUgcmV0dXJuIHZhbHVlCisgICAgICogdGVsbHMgaG93IG1hbnkgYXJyYXkgZWxlbWVudHMgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgdGhpcyBtZXRob2QgY2FsbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXFuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50cyBvZiB0aGUgCi0gICAgICogcXVhZHJhdGljIHBvbHlub21pYWwgdG8gc29sdmUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJvb3RzIG9mIHRoZSBxdWFkcmF0aWMgcG9seW5vbWlhbAotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGVxbi5sZW5ndGggPCAzLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGFycmF5IGlzIG51bGwuCisgICAgICogQHBhcmFtIGVxbgorICAgICAqICAgICAgICAgICAgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSBxdWFkcmF0aWMKKyAgICAgKiAgICAgICAgICAgIHBvbHlub21pYWwgdG8gc29sdmUuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJvb3RzIG9mIHRoZSBxdWFkcmF0aWMgcG9seW5vbWlhbC4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBlcW4ubGVuZ3RofSA8IDMuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBhcnJheSBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IHNvbHZlUXVhZHJhdGljKGRvdWJsZSBlcW5bXSkgewogICAgICAgICByZXR1cm4gc29sdmVRdWFkcmF0aWMoZXFuLCBlcW4pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSByb290cyBvZiB0aGUgcXVhZHJhdGljIHBvbHlub21pYWwuIFRoaXMgaXMgCi0gICAgICogYWNjb21wbGlzaGVkIGJ5IGZpbmRpbmcgdGhlIChyZWFsKSB2YWx1ZXMgb2YgeCB0aGF0IHNvbHZlCi0gICAgICogdGhlIGZvbGxvd2luZyBlcXVhdGlvbjogZXFuWzJdKngqeCArIGVxblsxXSp4ICsgZXFuWzBdID0gMC4KLSAgICAgKiBUaGUgc29sdXRpb25zIGFyZSB3cml0dGVuIGludG8gdGhlIGFycmF5IHJlcyBzdGFydGluZwotICAgICAqIGZyb20gdGhlIGluZGV4IDAgaW4gdGhlIGFycmF5LiBUaGUgcmV0dXJuIHZhbHVlIHRlbGxzIGhvdyAKLSAgICAgKiBtYW55IGFycmF5IGVsZW1lbnRzIGhhdmUgYmVlbiB3cml0dGVuIGJ5IHRoaXMgbWV0aG9kIGNhbGwuCisgICAgICogRmluZHMgdGhlIHJvb3RzIG9mIHRoZSBxdWFkcmF0aWMgcG9seW5vbWlhbC4gVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkKKyAgICAgKiBmaW5kaW5nIHRoZSAocmVhbCkgdmFsdWVzIG9mIHggdGhhdCBzb2x2ZSB0aGUgZm9sbG93aW5nIGVxdWF0aW9uOgorICAgICAqIGVxblsyXSp4KnggKyBlcW5bMV0qeCArIGVxblswXSA9IDAuIFRoZSBzb2x1dGlvbnMgYXJlIHdyaXR0ZW4gaW50byB0aGUKKyAgICAgKiBhcnJheSByZXMgc3RhcnRpbmcgZnJvbSB0aGUgaW5kZXggMCBpbiB0aGUgYXJyYXkuIFRoZSByZXR1cm4gdmFsdWUgdGVsbHMKKyAgICAgKiBob3cgbWFueSBhcnJheSBlbGVtZW50cyBoYXZlIGJlZW4gd3JpdHRlbiBieSB0aGlzIG1ldGhvZCBjYWxsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlcW4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSAKLSAgICAgKiBxdWFkcmF0aWMgcG9seW5vbWlhbCB0byBzb2x2ZS4KLSAgICAgKiBAcGFyYW0gcmVzIHRoZSBhcnJheSB0aGF0IHRoaXMgbWV0aG9kIHdyaXRlcyB0aGUgcmVzdWx0cyBpbnRvCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJvb3RzIG9mIHRoZSBxdWFkcmF0aWMgcG9seW5vbWlhbAotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGVxbi5sZW5ndGggPCAzIG9yIAotICAgICAqIGlmIHJlcy5sZW5ndGggaXMgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2Ygcm9vdHMuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBlaXRoZXIgYXJyYXkgaXMgbnVsbC4KKyAgICAgKiBAcGFyYW0gZXFuCisgICAgICogICAgICAgICAgICBhbiBhcnJheSBjb250YWluaW5nIHRoZSBjb2VmZmljaWVudHMgb2YgdGhlIHF1YWRyYXRpYworICAgICAqICAgICAgICAgICAgcG9seW5vbWlhbCB0byBzb2x2ZS4KKyAgICAgKiBAcGFyYW0gcmVzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgdGhhdCB0aGlzIG1ldGhvZCB3cml0ZXMgdGhlIHJlc3VsdHMgaW50by4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygcm9vdHMgb2YgdGhlIHF1YWRyYXRpYyBwb2x5bm9taWFsLgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGVxbi5sZW5ndGh9IDwgMyBvciBpZiB7QGNvZGUgcmVzLmxlbmd0aH0gaXMgbGVzcworICAgICAqICAgICAgICAgICAgIHRoYW4gdGhlIG51bWJlciBvZiByb290cy4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZWl0aGVyIGFycmF5IGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgc29sdmVRdWFkcmF0aWMoZG91YmxlIGVxbltdLCBkb3VibGUgcmVzW10pIHsKICAgICAgICAgcmV0dXJuIENyb3NzaW5nLnNvbHZlUXVhZChlcW4sIHJlcyk7CkBAIC04MjEsNCArOTE2LDMgQEAKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2dlb20vUmVjdGFuZ2xlMkQuamF2YSBiL2F3dC9qYXZhL2F3dC9nZW9tL1JlY3RhbmdsZTJELmphdmEKaW5kZXggZDMzZGQ5MS4uODE2NjEzNCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2dlb20vUmVjdGFuZ2xlMkQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZ2VvbS9SZWN0YW5nbGUyRC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIERlbmlzIE0uIEtpc2hlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5nZW9tOwogCiBpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CkBAIC0yNiw0NCArMjcsNjQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubWlzYy5IYXNoQ29kZTsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgUmVjdGFuZ2xlMkQgcmVwcmVzZW50cyBhIHJlY3RhbmdsZSB3aG9zZSBjb29yZGluYXRlcyBhcmUgZ2l2ZW4gCi0gKiB3aXRoIHRoZSBjb3JyZWN0IHByZWNpc2lvbiB0byBiZSB1c2VkIHdpdGggdGhlIEdyYXBoaWNzMkQgY2xhc3Nlcy4KKyAqIFRoZSBDbGFzcyBSZWN0YW5nbGUyRCByZXByZXNlbnRzIGEgcmVjdGFuZ2xlIHdob3NlIGNvb3JkaW5hdGVzIGFyZSBnaXZlbiB3aXRoCisgKiB0aGUgY29ycmVjdCBwcmVjaXNpb24gdG8gYmUgdXNlZCB3aXRoIHRoZSBHcmFwaGljczJEIGNsYXNzZXMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVjdGFuZ2xlMkQgZXh0ZW5kcyBSZWN0YW5ndWxhclNoYXBlIHsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgT1VUX0xFRlQgaXMgYSBtYXNrIHRoYXQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgCi0gICAgICogZ2l2ZW4gcG9pbnQgaXMgb3V0c2lkZSB0aGUgcmVjdGFuZ2xlIGFuZCB0byBpdHMgbGVmdC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRfTEVGVCAgID0gMTsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IE9VVF9UT1AgaXMgYSBtYXNrIHRoYXQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgCi0gICAgICogZ2l2ZW4gcG9pbnQgaXMgb3V0c2lkZSB0aGUgcmVjdGFuZ2xlIGFuZCBhYm92ZSBpdC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRfVE9QICAgID0gMjsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IE9VVF9SSUdIVCBpcyBhIG1hc2sgdGhhdCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSAKLSAgICAgKiBnaXZlbiBwb2ludCBpcyBvdXRzaWRlIHRoZSByZWN0YW5nbGUgYW5kIHRvIGl0cyByaWdodC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRfUklHSFQgID0gNDsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IE9VVF9CT1RUT00gaXMgYSBtYXNrIHRoYXQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgCi0gICAgICogZ2l2ZW4gcG9pbnQgaXMgb3V0c2lkZSB0aGUgcmVjdGFuZ2xlIGFuZCBhYm92ZSBpdC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgT1VUX0xFRlQgaXMgYSBtYXNrIHRoYXQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgZ2l2ZW4KKyAgICAgKiBwb2ludCBpcyBvdXRzaWRlIHRoZSByZWN0YW5nbGUgYW5kIHRvIGl0cyBsZWZ0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9MRUZUID0gMTsKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBPVVRfVE9QIGlzIGEgbWFzayB0aGF0IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGdpdmVuCisgICAgICogcG9pbnQgaXMgb3V0c2lkZSB0aGUgcmVjdGFuZ2xlIGFuZCBhYm92ZSBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRfVE9QID0gMjsKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBPVVRfUklHSFQgaXMgYSBtYXNrIHRoYXQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgZ2l2ZW4KKyAgICAgKiBwb2ludCBpcyBvdXRzaWRlIHRoZSByZWN0YW5nbGUgYW5kIHRvIGl0cyByaWdodC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRfUklHSFQgPSA0OworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IE9VVF9CT1RUT00gaXMgYSBtYXNrIHRoYXQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgZ2l2ZW4KKyAgICAgKiBwb2ludCBpcyBvdXRzaWRlIHRoZSByZWN0YW5nbGUgYW5kIGFib3ZlIGl0LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9CT1RUT00gPSA4OwogCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIEZsb2F0IGlzIHRoZSBzdWJjbGFzcyBvZiBSZWN0YW5nbGUyRCB0aGF0IHJlcHJlc2VudHMgYSAKKyAgICAgKiBUaGUgQ2xhc3MgRmxvYXQgaXMgdGhlIHN1YmNsYXNzIG9mIFJlY3RhbmdsZTJEIHRoYXQgcmVwcmVzZW50cyBhCiAgICAgICogcmVjdGFuZ2xlIHdob3NlIGRhdGEgdmFsdWVzIGFyZSBnaXZlbiBhcyBmbG9hdHMgKHdpdGggZmxvYXQtbGV2ZWwKICAgICAgKiBwcmVjaXNpb24pLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmxvYXQgZXh0ZW5kcyBSZWN0YW5nbGUyRCB7CiAKLSAgICAgICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgd2lkdGg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgaGVpZ2h0OwogCiAgICAgICAgIC8qKgpAQCAtNzUsMTAgKzk2LDE0IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcmVjdGFuZ2xlIHdpdGggdGhlIHNwZWNpZmllZCBmbG9hdC1wcmVjaXNpb24gZGF0YS4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyCi0gICAgICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyCi0gICAgICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZQotICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZQorICAgICAgICAgKiBAcGFyYW0geAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAgICAgKiBAcGFyYW0geQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgICAgICogQHBhcmFtIGhlaWdodAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBGbG9hdChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0KSB7CiAgICAgICAgICAgICBzZXRSZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpOwpAQCAtMTEyLDEwICsxMzcsMTQgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFNldHMgdGhlIHJlY3RhbmdsZSdzIGRhdGEgdG8gdGhlIGdpdmVuIHZhbHVlcy4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyCi0gICAgICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyCi0gICAgICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZQotICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZQorICAgICAgICAgKiBAcGFyYW0geAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAgICAgKiBAcGFyYW0geQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgICAgICogQHBhcmFtIGhlaWdodAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldFJlY3QoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCkgewogICAgICAgICAgICAgdGhpcy54ID0geDsKQEAgLTE0NiwyMyArMTc1LDE5IEBACiAKICAgICAgICAgICAgIGlmICh3aWR0aCA8PSAwLjBmKSB7CiAgICAgICAgICAgICAgICAgY29kZSB8PSBPVVRfTEVGVCB8IE9VVF9SSUdIVDsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGlmIChweCA8IHgpIHsKLSAgICAgICAgICAgICAgICAgICAgY29kZSB8PSBPVVRfTEVGVDsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHB4ID4geCArIHdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlIHw9IE9VVF9SSUdIVDsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChweCA8IHgpIHsKKyAgICAgICAgICAgICAgICBjb2RlIHw9IE9VVF9MRUZUOworICAgICAgICAgICAgfSBlbHNlIGlmIChweCA+IHggKyB3aWR0aCkgeworICAgICAgICAgICAgICAgIGNvZGUgfD0gT1VUX1JJR0hUOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoaGVpZ2h0IDw9IDAuMGYpIHsKICAgICAgICAgICAgICAgICBjb2RlIHw9IE9VVF9UT1AgfCBPVVRfQk9UVE9NOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgaWYgKHB5IDwgeSkgewotICAgICAgICAgICAgICAgICAgICBjb2RlIHw9IE9VVF9UT1A7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChweSA+IHkgKyBoZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgfD0gT1VUX0JPVFRPTTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChweSA8IHkpIHsKKyAgICAgICAgICAgICAgICBjb2RlIHw9IE9VVF9UT1A7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHB5ID4geSArIGhlaWdodCkgeworICAgICAgICAgICAgICAgIGNvZGUgfD0gT1VUX0JPVFRPTTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIGNvZGU7CiAgICAgICAgIH0KQEAgLTE5OCwyOSArMjIzLDQxIEBACiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICAvLyBUaGUgb3V0cHV0IGZvcm1hdCBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvdXIuIEl0IGNvdWxkIGJlIG9idGFpbmVkIGluIHRoZSBmb2xsb3dpbmcgd2F5CisgICAgICAgICAgICAvLyBUaGUgb3V0cHV0IGZvcm1hdCBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvdXIuIEl0IGNvdWxkIGJlCisgICAgICAgICAgICAvLyBvYnRhaW5lZCBpbiB0aGUgZm9sbG93aW5nIHdheQogICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKG5ldyBSZWN0YW5nbGUyRC5GbG9hdCgpLnRvU3RyaW5nKCkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiW3g9IiArIHggKyAiLHk9IiArIHkgKyAiLHdpZHRoPSIgKyB3aWR0aCArICIsaGVpZ2h0PSIgKyBoZWlnaHQgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAorICAgICAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIlt4PSIgKyB4ICsgIix5PSIgKyB5ICsgIix3aWR0aD0iICsgd2lkdGggKyAiLGhlaWdodD0iICsgaGVpZ2h0ICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoZSBDbGFzcyBEb3VibGUgaXMgdGhlIHN1YmNsYXNzIG9mIFJlY3RhbmdsZTJEIHRoYXQgcmVwcmVzZW50cyBhIAotICAgICAqIHJlY3RhbmdsZSB3aG9zZSBkYXRhIHZhbHVlcyBhcmUgZ2l2ZW4gYXMgZG91YmxlcyAod2l0aCBkb3VibGUtcHJlY2lzaW9uLWxldmVsCi0gICAgICogcHJlY2lzaW9uKS4KKyAgICAgKiBUaGUgQ2xhc3MgRG91YmxlIGlzIHRoZSBzdWJjbGFzcyBvZiBSZWN0YW5nbGUyRCB0aGF0IHJlcHJlc2VudHMgYQorICAgICAqIHJlY3RhbmdsZSB3aG9zZSBkYXRhIHZhbHVlcyBhcmUgZ2l2ZW4gYXMgZG91YmxlcyAod2l0aAorICAgICAqIGRvdWJsZS1wcmVjaXNpb24tbGV2ZWwgcHJlY2lzaW9uKS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERvdWJsZSBleHRlbmRzIFJlY3RhbmdsZTJEIHsKIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgeDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIHk7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSB3aWR0aDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgaGVpZ2h0OwogCiAgICAgICAgIC8qKgpAQCAtMjMyLDEwICsyNjksMTQgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyByZWN0YW5nbGUgd2l0aCB0aGUgZ2l2ZW4gZG91YmxlIHZhbHVlcy4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyCi0gICAgICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyCi0gICAgICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZQotICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZQorICAgICAgICAgKiBAcGFyYW0geAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAgICAgKiBAcGFyYW0geQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgICAgICogQHBhcmFtIGhlaWdodAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBEb3VibGUoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQpIHsKICAgICAgICAgICAgIHNldFJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7CkBAIC0yODgsMjMgKzMyOSwxOSBAQAogCiAgICAgICAgICAgICBpZiAod2lkdGggPD0gMC4wKSB7CiAgICAgICAgICAgICAgICAgY29kZSB8PSBPVVRfTEVGVCB8IE9VVF9SSUdIVDsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGlmIChweCA8IHgpIHsKLSAgICAgICAgICAgICAgICAgICAgY29kZSB8PSBPVVRfTEVGVDsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHB4ID4geCArIHdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlIHw9IE9VVF9SSUdIVDsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChweCA8IHgpIHsKKyAgICAgICAgICAgICAgICBjb2RlIHw9IE9VVF9MRUZUOworICAgICAgICAgICAgfSBlbHNlIGlmIChweCA+IHggKyB3aWR0aCkgeworICAgICAgICAgICAgICAgIGNvZGUgfD0gT1VUX1JJR0hUOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoaGVpZ2h0IDw9IDAuMCkgewogICAgICAgICAgICAgICAgIGNvZGUgfD0gT1VUX1RPUCB8IE9VVF9CT1RUT007Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBpZiAocHkgPCB5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGUgfD0gT1VUX1RPUDsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHB5ID4geSArIGhlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSB8PSBPVVRfQk9UVE9NOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHB5IDwgeSkgeworICAgICAgICAgICAgICAgIGNvZGUgfD0gT1VUX1RPUDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocHkgPiB5ICsgaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgY29kZSB8PSBPVVRfQk9UVE9NOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gY29kZTsKICAgICAgICAgfQpAQCAtMzMwLDQ1ICszNjcsNjAgQEAKIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIC8vIFRoZSBvdXRwdXQgZm9ybWF0IGJhc2VkIG9uIDEuNSByZWxlYXNlIGJlaGF2aW91ci4gSXQgY291bGQgYmUgb2J0YWluZWQgaW4gdGhlIGZvbGxvd2luZyB3YXkKKyAgICAgICAgICAgIC8vIFRoZSBvdXRwdXQgZm9ybWF0IGJhc2VkIG9uIDEuNSByZWxlYXNlIGJlaGF2aW91ci4gSXQgY291bGQgYmUKKyAgICAgICAgICAgIC8vIG9idGFpbmVkIGluIHRoZSBmb2xsb3dpbmcgd2F5CiAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4obmV3IFJlY3RhbmdsZTJELkRvdWJsZSgpLnRvU3RyaW5nKCkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiW3g9IiArIHggKyAiLHk9IiArIHkgKyAiLHdpZHRoPSIgKyB3aWR0aCArICIsaGVpZ2h0PSIgKyBoZWlnaHQgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAorICAgICAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIlt4PSIgKyB4ICsgIix5PSIgKyB5ICsgIix3aWR0aD0iICsgd2lkdGggKyAiLGhlaWdodD0iICsgaGVpZ2h0ICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoZSBDbGFzcyBJdGVyYXRvciBwcm92aWRlcyAKLSAgICAgKiBhY2Nlc3MgdG8gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBSZWN0YW5nbGUyRCdzIGJvdW5kYXJ5IG1vZGlmaWVkIAotICAgICAqIGJ5IGFuIEFmZmluZVRyYW5zZm9ybS4gCisgICAgICogVGhlIENsYXNzIEl0ZXJhdG9yIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlCisgICAgICogUmVjdGFuZ2xlMkQncyBib3VuZGFyeSBtb2RpZmllZCBieSBhbiBBZmZpbmVUcmFuc2Zvcm0uCiAgICAgICovCiAgICAgY2xhc3MgSXRlcmF0b3IgaW1wbGVtZW50cyBQYXRoSXRlcmF0b3IgewogCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4gKi8KLSAgICAgICAgZG91YmxlIHg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuICovCi0gICAgICAgIGRvdWJsZSB5OwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4gKi8KLSAgICAgICAgZG91YmxlIHdpZHRoOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4gKi8KLSAgICAgICAgZG91YmxlIGhlaWdodDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBBZmZpbmVUcmFuc2Zvcm0gdGhhdCBpcyB1c2VkIHRvIG1vZGlmeSB0aGUgY29vcmRpbmF0ZXMgCi0gICAgICAgICAqIHRoYXQgYXJlIHJldHVybmVkIGJ5IHRoZSBwYXRoIGl0ZXJhdG9yLiAqLwotICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgY3VycmVudCBzZWdtZW50IGluZGV4LiAqLwotICAgICAgICBpbnQgaW5kZXg7Ci0gICAgICAgIAogICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBSZWN0YW5nbGUyRC5JdGVyYXRvciBmb3IgZ2l2ZW4gcmVjdGFuZ2xlIGFuZCB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICAgICAqLworICAgICAgICBkb3VibGUgeDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICAgICAqLworICAgICAgICBkb3VibGUgeTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICAgICAqLworICAgICAgICBkb3VibGUgd2lkdGg7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgICAgICovCisgICAgICAgIGRvdWJsZSBoZWlnaHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBBZmZpbmVUcmFuc2Zvcm0gdGhhdCBpcyB1c2VkIHRvIG1vZGlmeSB0aGUgY29vcmRpbmF0ZXMgdGhhdCBhcmUKKyAgICAgICAgICogcmV0dXJuZWQgYnkgdGhlIHBhdGggaXRlcmF0b3IuCisgICAgICAgICAqLworICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGN1cnJlbnQgc2VnbWVudCBpbmRleC4KKyAgICAgICAgICovCisgICAgICAgIGludCBpbmRleDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBSZWN0YW5nbGUyRC5JdGVyYXRvciBmb3IgZ2l2ZW4gcmVjdGFuZ2xlIGFuZAorICAgICAgICAgKiB0cmFuc2Zvcm1hdGlvbi4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSByIC0gdGhlIHNvdXJjZSBSZWN0YW5nbGUyRCBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIGF0IC0gdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgdG8gYXBwbHkgdG8gdGhlIGNvb3JkaW5hdGVzIAotICAgICAgICAgKiBiZWZvcmUgcmV0dXJuaW5nIHRoZW0KKyAgICAgICAgICogQHBhcmFtIHIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgc291cmNlIFJlY3RhbmdsZTJEIG9iamVjdC4KKyAgICAgICAgICogQHBhcmFtIGF0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgdG8gYXBwbHkgdG8gdGhlIGNvb3JkaW5hdGVzCisgICAgICAgICAqICAgICAgICAgICAgYmVmb3JlIHJldHVybmluZyB0aGVtLgogICAgICAgICAgKi8KICAgICAgICAgSXRlcmF0b3IoUmVjdGFuZ2xlMkQgciwgQWZmaW5lVHJhbnNmb3JtIGF0KSB7CiAgICAgICAgICAgICB0aGlzLnggPSByLmdldFgoKTsKQEAgLTQwNywyMyArNDU5LDIzIEBACiAgICAgICAgICAgICAgICAgY29vcmRzWzFdID0geTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdHlwZSA9IFNFR19MSU5FVE87Ci0gICAgICAgICAgICAgICAgc3dpdGNoKGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBjb29yZHNbMF0gPSB4ICsgd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIGNvb3Jkc1sxXSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgY29vcmRzWzBdID0geCArIHdpZHRoOwotICAgICAgICAgICAgICAgICAgICBjb29yZHNbMV0gPSB5ICsgaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgIGNvb3Jkc1swXSA9IHg7Ci0gICAgICAgICAgICAgICAgICAgIGNvb3Jkc1sxXSA9IHkgKyBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgY29vcmRzWzBdID0geDsKLSAgICAgICAgICAgICAgICAgICAgY29vcmRzWzFdID0geTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjb29yZHNbMF0gPSB4ICsgd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBjb29yZHNbMV0gPSB5OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvb3Jkc1swXSA9IHggKyB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvb3Jkc1sxXSA9IHkgKyBoZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRzWzBdID0geDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvb3Jkc1sxXSA9IHkgKyBoZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRzWzBdID0geDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvb3Jkc1sxXSA9IHk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodCAhPSBudWxsKSB7CkBAIC00NDYsMjMgKzQ5OCwyMyBAQAogICAgICAgICAgICAgICAgIHR5cGUgPSBTRUdfTU9WRVRPOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0eXBlID0gU0VHX0xJTkVUTzsKLSAgICAgICAgICAgICAgICBzd2l0Y2goaW5kZXgpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIGNvb3Jkc1swXSA9IChmbG9hdCkoeCArIHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgY29vcmRzWzFdID0gKGZsb2F0KXk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgY29vcmRzWzBdID0gKGZsb2F0KSh4ICsgd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBjb29yZHNbMV0gPSAoZmxvYXQpKHkgKyBoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgIGNvb3Jkc1swXSA9IChmbG9hdCl4OwotICAgICAgICAgICAgICAgICAgICBjb29yZHNbMV0gPSAoZmxvYXQpKHkgKyBoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgIGNvb3Jkc1swXSA9IChmbG9hdCl4OwotICAgICAgICAgICAgICAgICAgICBjb29yZHNbMV0gPSAoZmxvYXQpeTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjb29yZHNbMF0gPSAoZmxvYXQpKHggKyB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb29yZHNbMV0gPSAoZmxvYXQpeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjb29yZHNbMF0gPSAoZmxvYXQpKHggKyB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb29yZHNbMV0gPSAoZmxvYXQpKHkgKyBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvb3Jkc1swXSA9IChmbG9hdCl4OworICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRzWzFdID0gKGZsb2F0KSh5ICsgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjb29yZHNbMF0gPSAoZmxvYXQpeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvb3Jkc1sxXSA9IChmbG9hdCl5OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCkgewpAQCAtNDc0LDcgKzUyNiw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHJlY3RhbmdsZTIgZC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgUmVjdGFuZ2xlMkQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFJlY3RhbmdsZTJEKCkgewogICAgIH0KQEAgLTQ4Miw1OCArNTM0LDY0IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcmVjdGFuZ2xlJ3MgbG9jYXRpb24gYW5kIGRpbWVuc2lvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lcgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFJlY3QoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIHBvaW50IHdpdGggcmVzcGVjdCB0byB0aGUgcmVjdGFuZ2xlIGFuZCAKLSAgICAgKiBwYWNrcyB0aGUgaW5mb3JtYXRpb24gaW50byBhIHNpbmdsZSBpbnQgdXNpbmcgdGhlIGJpdG1hc2tzIAotICAgICAqIHtAbGluayBSZWN0YW5nbGUyRCNPVVRfTEVGVH0sIHtAbGluayBSZWN0YW5nbGUyRCNPVVRfUklHSFR9LCAKLSAgICAgKiB7QGxpbmsgUmVjdGFuZ2xlMkQjT1VUX1RPUH0sIGFuZCB7QGxpbmsgUmVjdGFuZ2xlMkQjT1VUX0JPVFRPTX0uCi0gICAgICogSWYgdGhlIHJlY3RhbmdsZSBoYXMgemVybyBvciBuZWdhdGl2ZSB3aWR0aCwgdGhlbiBldmVyeSBwb2ludAotICAgICAqIGlzIHJlZ2FyZGVkIGFzIGJlaW5nIGJvdGggdG8gdGhlIGxlZnQgYW5kIHRvIHRoZSByaWdodCBvZiB0aGUKLSAgICAgKiByZWN0YW5nbGUuIFNpbWlsYXJseSwgaWYgdGhlIGhlaWdodCBpcyB6ZXJvIG9yIG5lZ2F0aXZlIHRoZW4gCi0gICAgICogYWxsIHBvaW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBib3RoIGJvdGggYWJvdmUgYW5kIGJlbG93IGl0LgorICAgICAqIEdldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBwb2ludCB3aXRoIHJlc3BlY3QgdG8gdGhlIHJlY3RhbmdsZSBhbmQgcGFja3MKKyAgICAgKiB0aGUgaW5mb3JtYXRpb24gaW50byBhIHNpbmdsZSBpbnRlZ2VyIHVzaW5nIHRoZSBiaXRtYXNrcworICAgICAqIHtAbGluayBSZWN0YW5nbGUyRCNPVVRfTEVGVH0sIHtAbGluayBSZWN0YW5nbGUyRCNPVVRfUklHSFR9LAorICAgICAqIHtAbGluayBSZWN0YW5nbGUyRCNPVVRfVE9QfSwgYW5kIHtAbGluayBSZWN0YW5nbGUyRCNPVVRfQk9UVE9NfS4gSWYgdGhlCisgICAgICogcmVjdGFuZ2xlIGhhcyB6ZXJvIG9yIG5lZ2F0aXZlIHdpZHRoLCB0aGVuIGV2ZXJ5IHBvaW50IGlzIHJlZ2FyZGVkIGFzCisgICAgICogYmVpbmcgYm90aCB0byB0aGUgbGVmdCBhbmQgdG8gdGhlIHJpZ2h0IG9mIHRoZSByZWN0YW5nbGUuIFNpbWlsYXJseSwgaWYKKyAgICAgKiB0aGUgaGVpZ2h0IGlzIHplcm8gb3IgbmVnYXRpdmUgdGhlbiBhbGwgcG9pbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGJvdGgKKyAgICAgKiBib3RoIGFib3ZlIGFuZCBiZWxvdyBpdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjawotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIGNoZWNrCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIGNoZWNrLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay4KICAgICAgKiBAcmV0dXJuIHRoZSBwb2ludCdzIGxvY2F0aW9uIHdpdGggcmVzcGVjdCB0byB0aGUgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgb3V0Y29kZShkb3VibGUgeCwgZG91YmxlIHkpOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBuZXcgcmVjdGFuZ2xlIHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHJlY3RhbmdsZQotICAgICAqIHdpdGggdGhlIGdpdmVuIHJlY3RhbmdsZS4gVGhlIHJlc3VsdGluZyByZWN0YW5nbGUgbWF5IGJlIGVtcHR5LiAKLSAgICAgKiBUaGUgZGF0YSBvZiB0aGlzIHJlY3RhbmdsZSBpcyBsZWZ0IHVuY2hhbmdlZC4KKyAgICAgKiBDcmVhdGVzIGFuIG5ldyByZWN0YW5nbGUgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgcmVjdGFuZ2xlIHdpdGgKKyAgICAgKiB0aGUgZ2l2ZW4gcmVjdGFuZ2xlLiBUaGUgcmVzdWx0aW5nIHJlY3RhbmdsZSBtYXkgYmUgZW1wdHkuIFRoZSBkYXRhIG9mCisgICAgICogdGhpcyByZWN0YW5nbGUgaXMgbGVmdCB1bmNoYW5nZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIHJlY3RhbmdsZSB0byBpbnRlcnNlY3Qgd2l0aCB0aGlzIHJlY3RhbmdsZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIHJlY3RhbmdsZSB0byBpbnRlcnNlY3Qgd2l0aCB0aGlzIHJlY3RhbmdsZS4KICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgcmVjdGFuZ2xlIGdpdmVuIGJ5IGludGVyc2VjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgUmVjdGFuZ2xlMkQgY3JlYXRlSW50ZXJzZWN0aW9uKFJlY3RhbmdsZTJEIHIpOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBuZXcgcmVjdGFuZ2xlIHRoYXQgaXMgdGhlIHVuaW9uIG9mIHRoaXMgcmVjdGFuZ2xlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gcmVjdGFuZ2xlLiBUaGUgbmV3IHJlY3RhbmdsZSBpcyB0aGUgc21hbGxlc3QgCi0gICAgICogcmVjdGFuZ2xlIHdoaWNoIGNvbnRhaW5zIGJvdGggdGhpcyByZWN0YW5nbGUgYW5kIHRoZSByZWN0YW5nbGUKLSAgICAgKiBzcGVjaWZpZWQgYXMgYSBwYXJhbWV0ZXIuIFRoZSBkYXRhIG9mIHRoaXMgcmVjdGFuZ2xlIGlzIGxlZnQgdW5jaGFuZ2VkLgorICAgICAqIENyZWF0ZXMgYW4gbmV3IHJlY3RhbmdsZSB0aGF0IGlzIHRoZSB1bmlvbiBvZiB0aGlzIHJlY3RhbmdsZSB3aXRoIHRoZQorICAgICAqIGdpdmVuIHJlY3RhbmdsZS4gVGhlIG5ldyByZWN0YW5nbGUgaXMgdGhlIHNtYWxsZXN0IHJlY3RhbmdsZSB3aGljaAorICAgICAqIGNvbnRhaW5zIGJvdGggdGhpcyByZWN0YW5nbGUgYW5kIHRoZSByZWN0YW5nbGUgc3BlY2lmaWVkIGFzIGEgcGFyYW1ldGVyLgorICAgICAqIFRoZSBkYXRhIG9mIHRoaXMgcmVjdGFuZ2xlIGlzIGxlZnQgdW5jaGFuZ2VkLgogICAgICAqIAotICAgICAqIEBwYXJhbSByIHRoZSByZWN0YW5nbGUgdG8gY29tYmluZSB3aXRoIHRoaXMgcmVjdGFuZ2xlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IHJlY3RhbmdsZSBnaXZlbiBieSB1bmlvbgorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgcmVjdGFuZ2xlIHRvIGNvbWJpbmUgd2l0aCB0aGlzIHJlY3RhbmdsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgcmVjdGFuZ2xlIGdpdmVuIGJ5IHVuaW9uLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBSZWN0YW5nbGUyRCBjcmVhdGVVbmlvbihSZWN0YW5nbGUyRCByKTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRhdGEgb2YgdGhpcyByZWN0YW5nbGUgdG8gbWF0Y2ggdGhlIGRhdGEgb2YgdGhlIGdpdmVuIAotICAgICAqIHJlY3RhbmdsZS4KKyAgICAgKiBTZXRzIHRoZSBkYXRhIG9mIHRoaXMgcmVjdGFuZ2xlIHRvIG1hdGNoIHRoZSBkYXRhIG9mIHRoZSBnaXZlbiByZWN0YW5nbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIHJlY3RhbmdsZSB3aG9zZSBkYXRhIGlzIHRvIGJlIGNvcGllZCBpbnRvIHRoaXMgcmVjdGFuZ2xlJ3MgZmllbGRzLgorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgcmVjdGFuZ2xlIHdob3NlIGRhdGEgaXMgdG8gYmUgY29waWVkIGludG8gdGhpcyByZWN0YW5nbGUncworICAgICAqICAgICAgICAgICAgZmllbGRzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFJlY3QoUmVjdGFuZ2xlMkQgcikgewogICAgICAgICBzZXRSZWN0KHIuZ2V0WCgpLCByLmdldFkoKSwgci5nZXRXaWR0aCgpLCByLmdldEhlaWdodCgpKTsKQEAgLTU0OSw2MSArNjA3LDYzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFueSBwYXJ0IG9mIHRoZSBsaW5lIHNlZ21lbnQgIGJldHdlZW4gKGFuZCBpbmNsdWRpbmcpIAotICAgICAqIHRoZSB0d28gZ2l2ZW4gcG9pbnRzIHRvdWNoZXMgYW55IAotICAgICAqIHBhcnQgb2YgdGhlIHJlY3RhbmdsZSwgaW5jbHVkaW5nIGl0cyBib3VuZGFyeS4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW55IHBhcnQgb2YgdGhlIGxpbmUgc2VnbWVudCBiZXR3ZWVuIChhbmQgaW5jbHVkaW5nKQorICAgICAqIHRoZSB0d28gZ2l2ZW4gcG9pbnRzIHRvdWNoZXMgYW55IHBhcnQgb2YgdGhlIHJlY3RhbmdsZSwgaW5jbHVkaW5nIGl0cworICAgICAqIGJvdW5kYXJ5LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIG9uZSBvZiB0aGUgcG9pbnRzIHRoYXQgZGV0ZXJtaW5lcyB0aGUgCi0gICAgICogbGluZSBzZWdtZW50IHRvIHRlc3QKLSAgICAgKiBAcGFyYW0geTEgdGhlIHkgY29vcmRpbmF0ZSBvZiBvbmUgb2YgdGhlIHBvaW50cyB0aGF0IGRldGVybWluZXMgdGhlIAotICAgICAqIGxpbmUgc2VnbWVudCB0byB0ZXN0Ci0gICAgICogQHBhcmFtIHgyIHRoZSB4IGNvb3JkaW5hdGUgb2Ygb25lIG9mIHRoZSBwb2ludHMgdGhhdCBkZXRlcm1pbmVzIHRoZSAKLSAgICAgKiBsaW5lIHNlZ21lbnQgdG8gdGVzdAotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIG9uZSBvZiB0aGUgcG9pbnRzIHRoYXQgZGV0ZXJtaW5lcyB0aGUgCi0gICAgICogbGluZSBzZWdtZW50IHRvIHRlc3QKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGF0IGxlYXN0IG9uZSBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50IGJldHdlZW4gdGhlIAotICAgICAqIHR3byBwb2ludHMgbWF0Y2hlcyBhbnkgcG9pbnQgb2YgdGhlIGludGVyaW9yIG9mIHRoZSByZWN0YW5nbGUgb3IgdGhlCi0gICAgICogcmVjdGFuZ2xlJ3MgYm91bmRhcnkuCisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIG9uZSBvZiB0aGUgcG9pbnRzIHRoYXQgZGV0ZXJtaW5lcyB0aGUgbGluZQorICAgICAqICAgICAgICAgICAgc2VnbWVudCB0byB0ZXN0LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiBvbmUgb2YgdGhlIHBvaW50cyB0aGF0IGRldGVybWluZXMgdGhlIGxpbmUKKyAgICAgKiAgICAgICAgICAgIHNlZ21lbnQgdG8gdGVzdC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2Ygb25lIG9mIHRoZSBwb2ludHMgdGhhdCBkZXRlcm1pbmVzIHRoZSBsaW5lCisgICAgICogICAgICAgICAgICBzZWdtZW50IHRvIHRlc3QuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIG9uZSBvZiB0aGUgcG9pbnRzIHRoYXQgZGV0ZXJtaW5lcyB0aGUgbGluZQorICAgICAqICAgICAgICAgICAgc2VnbWVudCB0byB0ZXN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYXQgbGVhc3Qgb25lIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQgYmV0d2VlbiB0aGUgdHdvCisgICAgICogICAgICAgICBwb2ludHMgbWF0Y2hlcyBhbnkgcG9pbnQgb2YgdGhlIGludGVyaW9yIG9mIHRoZSByZWN0YW5nbGUgb3IgdGhlCisgICAgICogICAgICAgICByZWN0YW5nbGUncyBib3VuZGFyeS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3RzTGluZShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIpIHsKICAgICAgICAgZG91YmxlIHJ4MSA9IGdldFgoKTsKICAgICAgICAgZG91YmxlIHJ5MSA9IGdldFkoKTsKICAgICAgICAgZG91YmxlIHJ4MiA9IHJ4MSArIGdldFdpZHRoKCk7CiAgICAgICAgIGRvdWJsZSByeTIgPSByeTEgKyBnZXRIZWlnaHQoKTsKLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAocngxIDw9IHgxICYmIHgxIDw9IHJ4MiAmJiByeTEgPD0geTEgJiYgeTEgPD0gcnkyKSB8fAotICAgICAgICAgICAgKHJ4MSA8PSB4MiAmJiB4MiA8PSByeDIgJiYgcnkxIDw9IHkyICYmIHkyIDw9IHJ5MikgfHwKLSAgICAgICAgICAgIExpbmUyRC5saW5lc0ludGVyc2VjdChyeDEsIHJ5MSwgcngyLCByeTIsIHgxLCB5MSwgeDIsIHkyKSB8fAotICAgICAgICAgICAgTGluZTJELmxpbmVzSW50ZXJzZWN0KHJ4MiwgcnkxLCByeDEsIHJ5MiwgeDEsIHkxLCB4MiwgeTIpOworICAgICAgICByZXR1cm4gKHJ4MSA8PSB4MSAmJiB4MSA8PSByeDIgJiYgcnkxIDw9IHkxICYmIHkxIDw9IHJ5MikKKyAgICAgICAgICAgICAgICB8fCAocngxIDw9IHgyICYmIHgyIDw9IHJ4MiAmJiByeTEgPD0geTIgJiYgeTIgPD0gcnkyKQorICAgICAgICAgICAgICAgIHx8IExpbmUyRC5saW5lc0ludGVyc2VjdChyeDEsIHJ5MSwgcngyLCByeTIsIHgxLCB5MSwgeDIsIHkyKQorICAgICAgICAgICAgICAgIHx8IExpbmUyRC5saW5lc0ludGVyc2VjdChyeDIsIHJ5MSwgcngxLCByeTIsIHgxLCB5MSwgeDIsIHkyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW55IHBhcnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lIHNlZ21lbnQgdG91Y2hlcyBhbnkgCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFueSBwYXJ0IG9mIHRoZSBzcGVjaWZpZWQgbGluZSBzZWdtZW50IHRvdWNoZXMgYW55CiAgICAgICogcGFydCBvZiB0aGUgcmVjdGFuZ2xlLCBpbmNsdWRpbmcgaXRzIGJvdW5kYXJ5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSBsaW5lIHNlZ21lbnQgdG8gdGVzdAotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYXQgbGVhc3Qgb25lIHBvaW50IG9mIHRoZSBnaXZlbiBsaW5lIHNlZ21lbnQgCi0gICAgICogbWF0Y2hlcyBhbnkgcG9pbnQgb2YgdGhlIGludGVyaW9yIG9mIHRoZSByZWN0YW5nbGUgb3IgdGhlCi0gICAgICogcmVjdGFuZ2xlJ3MgYm91bmRhcnkuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaW5lIHNlZ21lbnQgdG8gdGVzdC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGF0IGxlYXN0IG9uZSBwb2ludCBvZiB0aGUgZ2l2ZW4gbGluZSBzZWdtZW50IG1hdGNoZXMgYW55CisgICAgICogICAgICAgICBwb2ludCBvZiB0aGUgaW50ZXJpb3Igb2YgdGhlIHJlY3RhbmdsZSBvciB0aGUgcmVjdGFuZ2xlJ3MKKyAgICAgKiAgICAgICAgIGJvdW5kYXJ5LgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGludGVyc2VjdHNMaW5lKExpbmUyRCBsKSB7CiAgICAgICAgIHJldHVybiBpbnRlcnNlY3RzTGluZShsLmdldFgxKCksIGwuZ2V0WTEoKSwgbC5nZXRYMigpLCBsLmdldFkyKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBwb2ludCB3aXRoIHJlc3BlY3QgdG8gdGhlIHJlY3RhbmdsZSBhbmQgCi0gICAgICogcGFja3MgdGhlIGluZm9ybWF0aW9uIGludG8gYSBzaW5nbGUgaW50IHVzaW5nIHRoZSBiaXRtYXNrcyAKLSAgICAgKiB7QGxpbmsgUmVjdGFuZ2xlMkQjT1VUX0xFRlR9LCB7QGxpbmsgUmVjdGFuZ2xlMkQjT1VUX1JJR0hUfSwgCi0gICAgICoge0BsaW5rIFJlY3RhbmdsZTJEI09VVF9UT1B9LCBhbmQge0BsaW5rIFJlY3RhbmdsZTJEI09VVF9CT1RUT019LgotICAgICAqIElmIHRoZSByZWN0YW5nbGUgaGFzIHplcm8gb3IgbmVnYXRpdmUgd2lkdGgsIHRoZW4gZXZlcnkgcG9pbnQKLSAgICAgKiBpcyByZWdhcmRlZCBhcyBiZWluZyBib3RoIHRvIHRoZSBsZWZ0IGFuZCB0byB0aGUgcmlnaHQgb2YgdGhlCi0gICAgICogcmVjdGFuZ2xlLiBTaW1pbGFybHksIGlmIHRoZSBoZWlnaHQgaXMgemVybyBvciBuZWdhdGl2ZSB0aGVuIAotICAgICAqIGFsbCBwb2ludHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYm90aCBib3RoIGFib3ZlIGFuZCBiZWxvdyBpdC4KKyAgICAgKiBHZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgcG9pbnQgd2l0aCByZXNwZWN0IHRvIHRoZSByZWN0YW5nbGUgYW5kIHBhY2tzCisgICAgICogdGhlIGluZm9ybWF0aW9uIGludG8gYSBzaW5nbGUgaW50ZWdlciB1c2luZyB0aGUgYml0bWFza3MKKyAgICAgKiB7QGxpbmsgUmVjdGFuZ2xlMkQjT1VUX0xFRlR9LCB7QGxpbmsgUmVjdGFuZ2xlMkQjT1VUX1JJR0hUfSwKKyAgICAgKiB7QGxpbmsgUmVjdGFuZ2xlMkQjT1VUX1RPUH0sIGFuZCB7QGxpbmsgUmVjdGFuZ2xlMkQjT1VUX0JPVFRPTX0uIElmIHRoZQorICAgICAqIHJlY3RhbmdsZSBoYXMgemVybyBvciBuZWdhdGl2ZSB3aWR0aCwgdGhlbiBldmVyeSBwb2ludCBpcyByZWdhcmRlZCBhcworICAgICAqIGJlaW5nIGJvdGggdG8gdGhlIGxlZnQgYW5kIHRvIHRoZSByaWdodCBvZiB0aGUgcmVjdGFuZ2xlLiBTaW1pbGFybHksIGlmCisgICAgICogdGhlIGhlaWdodCBpcyB6ZXJvIG9yIG5lZ2F0aXZlIHRoZW4gYWxsIHBvaW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBib3RoCisgICAgICogYm90aCBhYm92ZSBhbmQgYmVsb3cgaXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHAgdGhlIHBvaW50IHRvIGNoZWNrCi0gICAgICogCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2ludCB0byBjaGVjay4KICAgICAgKiBAcmV0dXJuIHRoZSBwb2ludCdzIGxvY2F0aW9uIHdpdGggcmVzcGVjdCB0byB0aGUgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgb3V0Y29kZShQb2ludDJEIHApIHsKQEAgLTYyMCw5ICs2ODAsNyBAQAogICAgICAgICBkb3VibGUgeDIgPSB4MSArIGdldFdpZHRoKCk7CiAgICAgICAgIGRvdWJsZSB5MiA9IHkxICsgZ2V0SGVpZ2h0KCk7CiAKLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICB4MSA8PSB4ICYmIHggPCB4MiAmJgotICAgICAgICAgICAgeTEgPD0geSAmJiB5IDwgeTI7CisgICAgICAgIHJldHVybiB4MSA8PSB4ICYmIHggPCB4MiAmJiB5MSA8PSB5ICYmIHkgPCB5MjsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3RzKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0KSB7CkBAIC02MzUsOSArNjkzLDcgQEAKICAgICAgICAgZG91YmxlIHgyID0geDEgKyBnZXRXaWR0aCgpOwogICAgICAgICBkb3VibGUgeTIgPSB5MSArIGdldEhlaWdodCgpOwogCi0gICAgICAgIHJldHVybgotICAgICAgICAgICAgeCArIHdpZHRoID4geDEgJiYgeCA8IHgyICYmCi0gICAgICAgICAgICB5ICsgaGVpZ2h0ID4geTEgJiYgeSA8IHkyOworICAgICAgICByZXR1cm4geCArIHdpZHRoID4geDEgJiYgeCA8IHgyICYmIHkgKyBoZWlnaHQgPiB5MSAmJiB5IDwgeTI7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQpIHsKQEAgLTY1MCwxOSArNzA2LDIxIEBACiAgICAgICAgIGRvdWJsZSB4MiA9IHgxICsgZ2V0V2lkdGgoKTsKICAgICAgICAgZG91YmxlIHkyID0geTEgKyBnZXRIZWlnaHQoKTsKIAotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIHgxIDw9IHggJiYgeCArIHdpZHRoIDw9IHgyICYmCi0gICAgICAgICAgICB5MSA8PSB5ICYmIHkgKyBoZWlnaHQgPD0geTI7CisgICAgICAgIHJldHVybiB4MSA8PSB4ICYmIHggKyB3aWR0aCA8PSB4MiAmJiB5MSA8PSB5ICYmIHkgKyBoZWlnaHQgPD0geTI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hhbmdlcyB0aGUgZGF0YSB2YWx1ZXMgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZSB0byBtYXRjaCAKLSAgICAgKiB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gc291cmNlIHJlY3RhbmdsZXMsIGxlYXZpbmcgdGhlIAotICAgICAqIHR3byBzb3VyY2UgcmVjdGFuZ2xlcyB1bmNoYW5nZWQuIFRoZSByZXN1bHRpbmcgcmVjdGFuZ2xlIG1heSBiZSBlbXB0eS4gCisgICAgICogQ2hhbmdlcyB0aGUgZGF0YSB2YWx1ZXMgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZSB0byBtYXRjaCB0aGUKKyAgICAgKiBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBzb3VyY2UgcmVjdGFuZ2xlcywgbGVhdmluZyB0aGUgdHdvIHNvdXJjZQorICAgICAqIHJlY3RhbmdsZXMgdW5jaGFuZ2VkLiBUaGUgcmVzdWx0aW5nIHJlY3RhbmdsZSBtYXkgYmUgZW1wdHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYzEgb25lIG9mIHRoZSB0d28gc291cmNlIHJlY3RhbmdsZXMgZ2l2aW5nIHRoZSBkYXRhIHRvIGludGVyc2VjdAotICAgICAqIEBwYXJhbSBzcmMyIG9uZSBvZiB0aGUgdHdvIHNvdXJjZSByZWN0YW5nbGVzIGdpdmluZyB0aGUgZGF0YSB0byBpbnRlcnNlY3QKLSAgICAgKiBAcGFyYW0gZHN0IHRoZSBkZXN0aW5hdGlvbiBvYmplY3Qgd2hlcmUgdGhlIGRhdGEgb2YgdGhlIGludGVyc2VjdGlvbiBpcyB3cml0dGVuCisgICAgICogQHBhcmFtIHNyYzEKKyAgICAgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgdHdvIHNvdXJjZSByZWN0YW5nbGVzIGdpdmluZyB0aGUgZGF0YSB0byBpbnRlcnNlY3QuCisgICAgICogQHBhcmFtIHNyYzIKKyAgICAgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgdHdvIHNvdXJjZSByZWN0YW5nbGVzIGdpdmluZyB0aGUgZGF0YSB0byBpbnRlcnNlY3QuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIG9iamVjdCB3aGVyZSB0aGUgZGF0YSBvZiB0aGUgaW50ZXJzZWN0aW9uIGlzCisgICAgICogICAgICAgICAgICB3cml0dGVuLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnRlcnNlY3QoUmVjdGFuZ2xlMkQgc3JjMSwgUmVjdGFuZ2xlMkQgc3JjMiwgUmVjdGFuZ2xlMkQgZHN0KSB7CiAgICAgICAgIGRvdWJsZSB4MSA9IE1hdGgubWF4KHNyYzEuZ2V0TWluWCgpLCBzcmMyLmdldE1pblgoKSk7CkBAIC02NzMsMTQgKzczMSwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoYW5nZXMgdGhlIGRhdGEgdmFsdWVzIG9mIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUgdG8gbWF0Y2ggCi0gICAgICogdGhlIHVuaW9uIG9mIHRoZSB0d28gc291cmNlIHJlY3RhbmdsZXMsIGxlYXZpbmcgdGhlIAotICAgICAqIHR3byBzb3VyY2UgcmVjdGFuZ2xlcyB1bmNoYW5nZWQuIFRoZSB1bmlvbiBpcyB0aGUgc21hbGxlc3QgcmVjdGFuZ2xlCi0gICAgICogdGhhIGNvbXBsZXRlbHkgY292ZXJzIHRoZSB0d28gc291cmNlIHJlY3RhbmdsZXMuIAorICAgICAqIENoYW5nZXMgdGhlIGRhdGEgdmFsdWVzIG9mIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUgdG8gbWF0Y2ggdGhlIHVuaW9uCisgICAgICogb2YgdGhlIHR3byBzb3VyY2UgcmVjdGFuZ2xlcywgbGVhdmluZyB0aGUgdHdvIHNvdXJjZSByZWN0YW5nbGVzCisgICAgICogdW5jaGFuZ2VkLiBUaGUgdW5pb24gaXMgdGhlIHNtYWxsZXN0IHJlY3RhbmdsZSB0aGF0IGNvbXBsZXRlbHkgY292ZXJzIHRoZQorICAgICAqIHR3byBzb3VyY2UgcmVjdGFuZ2xlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjMSBvbmUgb2YgdGhlIHR3byBzb3VyY2UgcmVjdGFuZ2xlcyBnaXZpbmcgdGhlIGRhdGEKLSAgICAgKiBAcGFyYW0gc3JjMiBvbmUgb2YgdGhlIHR3byBzb3VyY2UgcmVjdGFuZ2xlcyBnaXZpbmcgdGhlIGRhdGEKLSAgICAgKiBAcGFyYW0gZHN0IHRoZSBkZXN0aW5hdGlvbiBvYmplY3Qgd2hlcmUgdGhlIGRhdGEgb2YgdGhlIHVuaW9uIGlzIHdyaXR0ZW4KKyAgICAgKiBAcGFyYW0gc3JjMQorICAgICAqICAgICAgICAgICAgb25lIG9mIHRoZSB0d28gc291cmNlIHJlY3RhbmdsZXMgZ2l2aW5nIHRoZSBkYXRhLgorICAgICAqIEBwYXJhbSBzcmMyCisgICAgICogICAgICAgICAgICBvbmUgb2YgdGhlIHR3byBzb3VyY2UgcmVjdGFuZ2xlcyBnaXZpbmcgdGhlIGRhdGEuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIG9iamVjdCB3aGVyZSB0aGUgZGF0YSBvZiB0aGUgdW5pb24gaXMgd3JpdHRlbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdW5pb24oUmVjdGFuZ2xlMkQgc3JjMSwgUmVjdGFuZ2xlMkQgc3JjMiwgUmVjdGFuZ2xlMkQgZHN0KSB7CiAgICAgICAgIGRvdWJsZSB4MSA9IE1hdGgubWluKHNyYzEuZ2V0TWluWCgpLCBzcmMyLmdldE1pblgoKSk7CkBAIC02OTMsOCArNzU0LDEyIEBACiAgICAgLyoqCiAgICAgICogRW5sYXJnZXMgdGhlIHJlY3RhbmdsZSBzbyB0aGF0IGl0IGluY2x1ZGVzIHRoZSBnaXZlbiBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBuZXcgcG9pbnQgdG8gYmUgY292ZXJlZCBieSB0aGUgcmVjdGFuZ2xlCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbmV3IHBvaW50IHRvIGJlIGNvdmVyZWQgYnkgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBuZXcgcG9pbnQgdG8gYmUgY292ZXJlZCBieSB0aGUKKyAgICAgKiAgICAgICAgICAgIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbmV3IHBvaW50IHRvIGJlIGNvdmVyZWQgYnkgdGhlCisgICAgICogICAgICAgICAgICByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkKGRvdWJsZSB4LCBkb3VibGUgeSkgewogICAgICAgICBkb3VibGUgeDEgPSBNYXRoLm1pbihnZXRNaW5YKCksIHgpOwpAQCAtNzA3LDcgKzc3Miw4IEBACiAgICAgLyoqCiAgICAgICogRW5sYXJnZXMgdGhlIHJlY3RhbmdsZSBzbyB0aGF0IGl0IGluY2x1ZGVzIHRoZSBnaXZlbiBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgbmV3IHBvaW50IHRvIGJlIGNvdmVyZWQgYnkgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHBvaW50IHRvIGJlIGNvdmVyZWQgYnkgdGhlIHJlY3RhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGQoUG9pbnQyRCBwKSB7CiAgICAgICAgIGFkZChwLmdldFgoKSwgcC5nZXRZKCkpOwpAQCAtNzE2LDcgKzc4Miw4IEBACiAgICAgLyoqCiAgICAgICogRW5sYXJnZXMgdGhlIHJlY3RhbmdsZSBzbyB0aGF0IGl0IGNvdmVycyB0aGUgZ2l2ZW4gcmVjdGFuZ2xlLgogICAgICAqIAotICAgICAqIEBwYXJhbSByIHRoZSBuZXcgcmVjdGFuZ2xlIHRvIGJlIGNvdmVyZWQgYnkgdGhpcyByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyByZWN0YW5nbGUgdG8gYmUgY292ZXJlZCBieSB0aGlzIHJlY3RhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGQoUmVjdGFuZ2xlMkQgcikgewogICAgICAgICB1bmlvbih0aGlzLCByLCB0aGlzKTsKQEAgLTc0OCwxNCArODE1LDEwIEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlY3RhbmdsZTJEKSB7CiAgICAgICAgICAgICBSZWN0YW5nbGUyRCByID0gKFJlY3RhbmdsZTJEKW9iajsKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIGdldFgoKSA9PSByLmdldFgoKSAmJgotICAgICAgICAgICAgICAgIGdldFkoKSA9PSByLmdldFkoKSAmJgotICAgICAgICAgICAgICAgIGdldFdpZHRoKCkgPT0gci5nZXRXaWR0aCgpICYmCi0gICAgICAgICAgICAgICAgZ2V0SGVpZ2h0KCkgPT0gci5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRYKCkgPT0gci5nZXRYKCkgJiYgZ2V0WSgpID09IHIuZ2V0WSgpICYmIGdldFdpZHRoKCkgPT0gci5nZXRXaWR0aCgpCisgICAgICAgICAgICAgICAgICAgICYmIGdldEhlaWdodCgpID09IHIuZ2V0SGVpZ2h0KCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZ2VvbS9SZWN0YW5ndWxhclNoYXBlLmphdmEgYi9hd3QvamF2YS9hd3QvZ2VvbS9SZWN0YW5ndWxhclNoYXBlLmphdmEKaW5kZXggMGE3N2RmZC4uMGIwZDA1YyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2dlb20vUmVjdGFuZ3VsYXJTaGFwZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9nZW9tL1JlY3Rhbmd1bGFyU2hhcGUuamF2YQpAQCAtMTgsMTcgKzE4LDE5IEBACiAgKiBAYXV0aG9yIERlbmlzIE0uIEtpc2hlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5nZW9tOwogCiBpbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwogaW1wb3J0IGphdmEuYXd0LlNoYXBlOwogCiAvKioKLSAqIFRoZSBDbGFzcyBSZWN0YW5ndWxhclNoYXBlIHJlcHJlc2VudHMgYSBTaGFwZSB3aG9zZSBkYXRhIGlzIAotICogKGF0IGxlYXN0IHBhcnRpYWxseSkgZGVzY3JpYmVkIGJ5IGEgcmVjdGFuZ3VsYXIgZnJhbWUuIFRoaXMgaW5jbHVkZXMgCi0gKiBzaGFwZXMgd2hpY2ggYXJlIG9idmlvdXNseSByZWN0YW5ndWxhciAoc3VjaCBhcyBSZWN0YW5nbGUyRCkgYXMgd2VsbCBhcwotICogc2hhcGVzIGxpa2UgQXJjMkQgd2hpY2ggYXJlIGxhcmdlbHkgZGV0ZXJtaW5lZCBieSB0aGUgcmVjdGFuZ2xlIHRoZXkgCi0gKiBmaXQgaW5zaWRlLgorICogVGhlIENsYXNzIFJlY3Rhbmd1bGFyU2hhcGUgcmVwcmVzZW50cyBhIFNoYXBlIHdob3NlIGRhdGEgaXMgKGF0IGxlYXN0CisgKiBwYXJ0aWFsbHkpIGRlc2NyaWJlZCBieSBhIHJlY3Rhbmd1bGFyIGZyYW1lLiBUaGlzIGluY2x1ZGVzIHNoYXBlcyB3aGljaCBhcmUKKyAqIG9idmlvdXNseSByZWN0YW5ndWxhciAoc3VjaCBhcyBSZWN0YW5nbGUyRCkgYXMgd2VsbCBhcyBzaGFwZXMgbGlrZSBBcmMyRAorICogd2hpY2ggYXJlIGxhcmdlbHkgZGV0ZXJtaW5lZCBieSB0aGUgcmVjdGFuZ2xlIHRoZXkgZml0IGluc2lkZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWN0YW5ndWxhclNoYXBlIGltcGxlbWVudHMgU2hhcGUsIENsb25lYWJsZSB7CiAKQEAgLTY3LDI1ICs2OSwzMCBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0SGVpZ2h0KCk7CiAKICAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhpcyBpcyBhbiBlbXB0eSByZWN0YW5nbGU6IG9uZSB3aXRoIHplcm8gYXMgaXRzIHdpZHRoIG9yIGhlaWdodC4KKyAgICAgKiBDaGVja3MgaWYgdGhpcyBpcyBhbiBlbXB0eSByZWN0YW5nbGU6IG9uZSB3aXRoIHplcm8gYXMgaXRzIHdpZHRoIG9yCisgICAgICogaGVpZ2h0LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHdpZHRoIG9yIGhlaWdodCBpcyBlbXB0eS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0VtcHR5KCk7CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkYXRhIGZvciB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGluIHRlcm1zIG9mIGRvdWJsZSB2YWx1ZXMuIAorICAgICAqIFNldHMgdGhlIGRhdGEgZm9yIHRoZSBib3VuZGluZyByZWN0YW5nbGUgaW4gdGVybXMgb2YgZG91YmxlIHZhbHVlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEZyYW1lKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHcsIGRvdWJsZSBoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1pbmltdW0geCB2YWx1ZSBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlICh0aGUgeCAKLSAgICAgKiBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlKS4KKyAgICAgKiBHZXRzIHRoZSBtaW5pbXVtIHggdmFsdWUgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAodGhlIHggY29vcmRpbmF0ZSBvZgorICAgICAqIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlKS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIHggdmFsdWUgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KICAgICAgKi8KQEAgLTk0LDggKzEwMSw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWluaW11bSB5IHZhbHVlIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgKHRoZSB5IAotICAgICAqIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUpLgorICAgICAqIEdldHMgdGhlIG1pbmltdW0geSB2YWx1ZSBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlICh0aGUgeSBjb29yZGluYXRlIG9mCisgICAgICogdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUpLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0geSB2YWx1ZSBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgogICAgICAqLwpAQCAtMTA0LDkgKzExMSw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWF4aW11bSB4IHZhbHVlIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgKHRoZSB4Ci0gICAgICogY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSBwbHVzIHRoZSAKLSAgICAgKiByZWN0YW5nbGUncyB3aWR0aCkuCisgICAgICogR2V0cyB0aGUgbWF4aW11bSB4IHZhbHVlIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgKHRoZSB4IGNvb3JkaW5hdGUgb2YKKyAgICAgKiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSBwbHVzIHRoZSByZWN0YW5nbGUncyB3aWR0aCkuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgbWF4aW11bSB4IHZhbHVlIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCiAgICAgICovCkBAIC0xMTUsOSArMTIxLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHkgdmFsdWUgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAodGhlIHkKLSAgICAgKiBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlIHBsdXMgdGhlIAotICAgICAqIHJlY3RhbmdsZSdzIGhlaWdodCkuCisgICAgICogR2V0cyB0aGUgbWF4aW11bSB5IHZhbHVlIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgKHRoZSB5IGNvb3JkaW5hdGUgb2YKKyAgICAgKiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSBwbHVzIHRoZSByZWN0YW5nbGUncyBoZWlnaHQpLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0geSB2YWx1ZSBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgogICAgICAqLwpAQCAtMTQ0LDggKzE0OSw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGxhY2VzIHRoZSByZWN0YW5nbGUncyBzaXplIGFuZCBsb2NhdGlvbiBkYXRhIGluIGEgbmV3IFJlY3RhbmdsZTJECi0gICAgICogb2JqZWN0IGFuZCByZXR1cm5zIGl0LgorICAgICAqIFBsYWNlcyB0aGUgcmVjdGFuZ2xlJ3Mgc2l6ZSBhbmQgbG9jYXRpb24gZGF0YSBpbiBhIG5ldyBSZWN0YW5nbGUyRCBvYmplY3QKKyAgICAgKiBhbmQgcmV0dXJucyBpdC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBib3VuZGluZyByZWN0YW5nbGUgYXMgYSBuZXcgUmVjdGFuZ2xlMkQgb2JqZWN0LgogICAgICAqLwpAQCAtMTU0LDIxICsxNTksMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBib3VuZGluZyByZWN0YW5nbGUgaW4gdGVybXMgb2YgYSBQb2ludDJEIHdoaWNoIGdpdmVzIGl0cwotICAgICAqIHVwcGVyIGxlZnQgY29ybmVyIGFuZCBhIERpbWVuc2lvbjJEIG9iamVjdCBnaXZpbmcgaXRzIHdpZHRoIGFuZCBoZWlnaHQuCisgICAgICogU2V0cyB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGluIHRlcm1zIG9mIGEgUG9pbnQyRCB3aGljaCBnaXZlcyBpdHMgdXBwZXIKKyAgICAgKiBsZWZ0IGNvcm5lciBhbmQgYSBEaW1lbnNpb24yRCBvYmplY3QgZ2l2aW5nIGl0cyB3aWR0aCBhbmQgaGVpZ2h0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBsb2MgdGhlIG5ldyB1cHBlciBsZWZ0IGNvcm5lciBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSBzaXplIHRoZSBuZXcgc2l6ZSBkaW1lbnNpb25zLgorICAgICAqIEBwYXJhbSBsb2MKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdXBwZXIgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBzaXplIGRpbWVuc2lvbnMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RnJhbWUoUG9pbnQyRCBsb2MsIERpbWVuc2lvbjJEIHNpemUpIHsKICAgICAgICAgc2V0RnJhbWUobG9jLmdldFgoKSwgbG9jLmdldFkoKSwgc2l6ZS5nZXRXaWR0aCgpLCBzaXplLmdldEhlaWdodCgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBib3VuZGluZyByZWN0YW5nbGUgdG8gbWF0Y2ggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgUmVjdGFuZ2xlMkQuCisgICAgICogU2V0cyB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIHRvIG1hdGNoIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogUmVjdGFuZ2xlMkQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIHJlY3RhbmdsZSB0aGF0IGdpdmVzIHRoZSBuZXcgZnJhbWUgZGF0YS4KKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIHJlY3RhbmdsZSB0aGF0IGdpdmVzIHRoZSBuZXcgZnJhbWUgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGcmFtZShSZWN0YW5nbGUyRCByKSB7CiAgICAgICAgIHNldEZyYW1lKHIuZ2V0WCgpLCByLmdldFkoKSwgci5nZXRXaWR0aCgpLCByLmdldEhlaWdodCgpKTsKQEAgLTE3NiwxMiArMTg0LDE3IEBACiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBmcmFtaW5nIHJlY3RhbmdsZSBnaXZlbiB0d28gb3Bwb3NpdGUgY29ybmVycy4gQW55IHR3byBjb3JuZXJzCi0gICAgICogbWF5IGJlIHVzZWQgaW4gYW55IG9yZGVyIGFzIGxvbmcgYXMgdGhleSBhcmUgZGlhZ29uYWxseSBvcHBvc2l0ZSBvbmUgYW5vdGhlci4KKyAgICAgKiBtYXkgYmUgdXNlZCBpbiBhbnkgb3JkZXIgYXMgbG9uZyBhcyB0aGV5IGFyZSBkaWFnb25hbGx5IG9wcG9zaXRlIG9uZQorICAgICAqIGFub3RoZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2Ygb25lIG9mIHRoZSBjb3JuZXIgcG9pbnRzLgotICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIG9uZSBvZiB0aGUgY29ybmVyIHBvaW50cy4KLSAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgb3RoZXIgY29ybmVyIHBvaW50LgotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBvdGhlciBjb3JuZXIgcG9pbnQuCisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIG9uZSBvZiB0aGUgY29ybmVyIHBvaW50cy4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2Ygb25lIG9mIHRoZSBjb3JuZXIgcG9pbnRzLgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgb3RoZXIgY29ybmVyIHBvaW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgb3RoZXIgY29ybmVyIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZyYW1lRnJvbURpYWdvbmFsKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MikgewogICAgICAgICBkb3VibGUgcngsIHJ5LCBydywgcmg7CkBAIC0yMDQsMTAgKzIxNywxMyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZnJhbWluZyByZWN0YW5nbGUgZ2l2ZW4gdHdvIG9wcG9zaXRlIGNvcm5lcnMuIEFueSB0d28gY29ybmVycwotICAgICAqIG1heSBiZSB1c2VkIGluIGFueSBvcmRlciBhcyBsb25nIGFzIHRoZXkgYXJlIGRpYWdvbmFsbHkgb3Bwb3NpdGUgb25lIGFub3RoZXIuCisgICAgICogbWF5IGJlIHVzZWQgaW4gYW55IG9yZGVyIGFzIGxvbmcgYXMgdGhleSBhcmUgZGlhZ29uYWxseSBvcHBvc2l0ZSBvbmUKKyAgICAgKiBhbm90aGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwMSBvbmUgb2YgdGhlIGNvcm5lciBwb2ludHMuCi0gICAgICogQHBhcmFtIHAyIHRoZSBvdGhlciBjb3JuZXIgcG9pbnQuCisgICAgICogQHBhcmFtIHAxCisgICAgICogICAgICAgICAgICBvbmUgb2YgdGhlIGNvcm5lciBwb2ludHMuCisgICAgICogQHBhcmFtIHAyCisgICAgICogICAgICAgICAgICB0aGUgb3RoZXIgY29ybmVyIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZyYW1lRnJvbURpYWdvbmFsKFBvaW50MkQgcDEsIFBvaW50MkQgcDIpIHsKICAgICAgICAgc2V0RnJhbWVGcm9tRGlhZ29uYWwocDEuZ2V0WCgpLCBwMS5nZXRZKCksIHAyLmdldFgoKSwgcDIuZ2V0WSgpKTsKQEAgLTIxNywxMCArMjMzLDE0IEBACiAgICAgICogU2V0cyB0aGUgZnJhbWluZyByZWN0YW5nbGUgZ2l2ZW4gdGhlIGNlbnRlciBwb2ludCBhbmQgb25lIGNvcm5lci4gQW55CiAgICAgICogY29ybmVyIG1heSBiZSB1c2VkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjZW50ZXJYIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBwb2ludC4KLSAgICAgKiBAcGFyYW0gY2VudGVyWSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgcG9pbnQuCi0gICAgICogQHBhcmFtIGNvcm5lclggdGhlIHggY29vcmRpbmF0ZSBvZiBvbmUgb2YgdGhlIGNvcm5lciBwb2ludHMuCi0gICAgICogQHBhcmFtIGNvcm5lclkgdGhlIHkgY29vcmRpbmF0ZSBvZiBvbmUgb2YgdGhlIGNvcm5lciBwb2ludHMuCisgICAgICogQHBhcmFtIGNlbnRlclgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBwb2ludC4KKyAgICAgKiBAcGFyYW0gY2VudGVyWQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIHBvaW50LgorICAgICAqIEBwYXJhbSBjb3JuZXJYCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIG9uZSBvZiB0aGUgY29ybmVyIHBvaW50cy4KKyAgICAgKiBAcGFyYW0gY29ybmVyWQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiBvbmUgb2YgdGhlIGNvcm5lciBwb2ludHMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RnJhbWVGcm9tQ2VudGVyKGRvdWJsZSBjZW50ZXJYLCBkb3VibGUgY2VudGVyWSwgZG91YmxlIGNvcm5lclgsIGRvdWJsZSBjb3JuZXJZKSB7CiAgICAgICAgIGRvdWJsZSB3aWR0aCA9IE1hdGguYWJzKGNvcm5lclggLSBjZW50ZXJYKTsKQEAgLTIzMiw4ICsyNTIsMTAgQEAKICAgICAgKiBTZXRzIHRoZSBmcmFtaW5nIHJlY3RhbmdsZSBnaXZlbiB0aGUgY2VudGVyIHBvaW50IGFuZCBvbmUgY29ybmVyLiBBbnkKICAgICAgKiBjb3JuZXIgbWF5IGJlIHVzZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNlbnRlciB0aGUgY2VudGVyIHBvaW50LgotICAgICAqIEBwYXJhbSBjb3JuZXIgYSBjb3JuZXIgcG9pbnQuCisgICAgICogQHBhcmFtIGNlbnRlcgorICAgICAqICAgICAgICAgICAgdGhlIGNlbnRlciBwb2ludC4KKyAgICAgKiBAcGFyYW0gY29ybmVyCisgICAgICogICAgICAgICAgICBhIGNvcm5lciBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGcmFtZUZyb21DZW50ZXIoUG9pbnQyRCBjZW50ZXIsIFBvaW50MkQgY29ybmVyKSB7CiAgICAgICAgIHNldEZyYW1lRnJvbUNlbnRlcihjZW50ZXIuZ2V0WCgpLCBjZW50ZXIuZ2V0WSgpLCBjb3JuZXIuZ2V0WCgpLCBjb3JuZXIuZ2V0WSgpKTsKQEAgLTI3Myw0ICsyOTUsMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZ2VvbS9Sb3VuZFJlY3RhbmdsZTJELmphdmEgYi9hd3QvamF2YS9hd3QvZ2VvbS9Sb3VuZFJlY3RhbmdsZTJELmphdmEKaW5kZXggNjgwYTE0Ni4uOGZiZGRkNiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2dlb20vUm91bmRSZWN0YW5nbGUyRC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9nZW9tL1JvdW5kUmVjdGFuZ2xlMkQuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBEZW5pcyBNLiBLaXNoZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZ2VvbTsKIAogaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwpAQCAtMjUsNTMgKzI2LDc0IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIENsYXNzIFJvdW5kUmVjdGFuZ2xlMkQgZGVzY3JpYmVzIGEgcmVjdGFuZ2xlIHdpdGggcm91bmRlZCAKLSAqIGNvcm5lcnMgd2l0aCBoaWdoLXByZWNpc2lvbiBkYXRhIHRoYXQgaXMgYXBwcm9wcmlhdGUgZm9yIGdlb21ldHJpYwotICogb3BlcmF0aW9ucy4KKyAqIFRoZSBDbGFzcyBSb3VuZFJlY3RhbmdsZTJEIGRlc2NyaWJlcyBhIHJlY3RhbmdsZSB3aXRoIHJvdW5kZWQgY29ybmVycyB3aXRoCisgKiBoaWdoLXByZWNpc2lvbiBkYXRhIHRoYXQgaXMgYXBwcm9wcmlhdGUgZm9yIGdlb21ldHJpYyBvcGVyYXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFJvdW5kUmVjdGFuZ2xlMkQgZXh0ZW5kcyBSZWN0YW5ndWxhclNoYXBlIHsKIAogICAgIC8qKgotICAgICAqIFRoZSBDbGFzcyBGbG9hdCBpcyB0aGUgc3ViY2xhc3Mgb2YgUm91bmRSZWN0YW5nbGUyRCB0aGF0IGhhcyBhbGwgCi0gICAgICogb2YgaXRzIGRhdGEgdmFsdWVzIHN0b3JlZCB3aXRoIGZsb2F0LWxldmVsIHByZWNpc2lvbi4KKyAgICAgKiBUaGUgQ2xhc3MgRmxvYXQgaXMgdGhlIHN1YmNsYXNzIG9mIFJvdW5kUmVjdGFuZ2xlMkQgdGhhdCBoYXMgYWxsIG9mIGl0cworICAgICAqIGRhdGEgdmFsdWVzIHN0b3JlZCB3aXRoIGZsb2F0LWxldmVsIHByZWNpc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZsb2F0IGV4dGVuZHMgUm91bmRSZWN0YW5nbGUyRCB7CiAKLSAgICAgICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgd2lkdGg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgaGVpZ2h0OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBhcmN3aWR0aCBvZiB0aGUgcm91bmRlZCBjb3JuZXJzLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYXJjIHdpZHRoIG9mIHRoZSByb3VuZGVkIGNvcm5lcnMuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgYXJjd2lkdGg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGFyY2hlaWdodCBvZiB0aGUgcm91bmRlZCBjb3JuZXJzLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYXJjIGhlaWdodCBvZiB0aGUgcm91bmRlZCBjb3JuZXJzLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IGFyY2hlaWdodDsKIAogICAgICAgICAvKioKLSAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZsb2F0LXZhbHVlZCBSb3VuZFJlY3RhbmdsZTJEIHdpdGggCi0gICAgICAgICAqIGl0cyBkYXRhLXZhbHVlcyBzZXQgdG8gemVyby4KKyAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZsb2F0LXZhbHVlZCBSb3VuZFJlY3RhbmdsZTJEIHdpdGggaXRzIGRhdGEtdmFsdWVzCisgICAgICAgICAqIHNldCB0byB6ZXJvLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEZsb2F0KCkgewogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBmbG9hdC12YWx1ZWQgUm91bmRSZWN0YW5nbGUyRCB3aXRoIAotICAgICAgICAgKiB0aGUgc3BlY2lmaWVkIGRhdGEgdmFsdWVzCisgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBmbG9hdC12YWx1ZWQgUm91bmRSZWN0YW5nbGUyRCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgICogZGF0YSB2YWx1ZXMuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lcgotICAgICAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lcgotICAgICAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUKLSAgICAgICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUKLSAgICAgICAgICogQHBhcmFtIGFyY3dpZHRoIHRoZSBhcmN3aWR0aCBvZiB0aGUgcm91bmRlZCBjb3JuZXJzCi0gICAgICAgICAqIEBwYXJhbSBhcmNoZWlnaHQgdGhlIGFyY2hlaWdodCBvZiB0aGUgcm91bmRlZCBjb3JuZXJzCisgICAgICAgICAqIEBwYXJhbSB4CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICAgICAqIEBwYXJhbSB5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAgICAgKiBAcGFyYW0gYXJjd2lkdGgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgYXJjIHdpZHRoIG9mIHRoZSByb3VuZGVkIGNvcm5lcnMuCisgICAgICAgICAqIEBwYXJhbSBhcmNoZWlnaHQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgYXJjIGhlaWdodCBvZiB0aGUgcm91bmRlZCBjb3JuZXJzLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEZsb2F0KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQsIGZsb2F0IGFyY3dpZHRoLCBmbG9hdCBhcmNoZWlnaHQpIHsKICAgICAgICAgICAgIHNldFJvdW5kUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBhcmN3aWR0aCwgYXJjaGVpZ2h0KTsKQEAgLTExMywxNiArMTM1LDIzIEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgcm91bmQgcmVjdC4KKyAgICAgICAgICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgcm91bmQgcmVjdGFuZ2xlLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIKLSAgICAgICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIKLSAgICAgICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlCi0gICAgICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlCi0gICAgICAgICAqIEBwYXJhbSBhcmN3aWR0aCB0aGUgYXJjd2lkdGggb2YgdGhlIHJvdW5kZWQgY29ybmVycwotICAgICAgICAgKiBAcGFyYW0gYXJjaGVpZ2h0IHRoZSBhcmNoZWlnaHQgb2YgdGhlIHJvdW5kZWQgY29ybmVycworICAgICAgICAgKiBAcGFyYW0geAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAgICAgKiBAcGFyYW0geQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgICAgICogQHBhcmFtIGhlaWdodAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgICAgICogQHBhcmFtIGFyY3dpZHRoCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGFyYyB3aWR0aCBvZiB0aGUgcm91bmRlZCBjb3JuZXJzLgorICAgICAgICAgKiBAcGFyYW0gYXJjaGVpZ2h0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGFyYyBoZWlnaHQgb2YgdGhlIHJvdW5kZWQgY29ybmVycy4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFJvdW5kUmVjdChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0LCBmbG9hdCBhcmN3aWR0aCwgZmxvYXQgYXJjaGVpZ2h0KSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHNldFJvdW5kUmVjdChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0LCBmbG9hdCBhcmN3aWR0aCwKKyAgICAgICAgICAgICAgICBmbG9hdCBhcmNoZWlnaHQpIHsKICAgICAgICAgICAgIHRoaXMueCA9IHg7CiAgICAgICAgICAgICB0aGlzLnkgPSB5OwogICAgICAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOwpAQCAtMTMyLDcgKzE2MSw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Um91bmRSZWN0KGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0LCBkb3VibGUgYXJjd2lkdGgsIGRvdWJsZSBhcmNoZWlnaHQpIHsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Um91bmRSZWN0KGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0LCBkb3VibGUgYXJjd2lkdGgsCisgICAgICAgICAgICAgICAgZG91YmxlIGFyY2hlaWdodCkgewogICAgICAgICAgICAgdGhpcy54ID0gKGZsb2F0KXg7CiAgICAgICAgICAgICB0aGlzLnkgPSAoZmxvYXQpeTsKICAgICAgICAgICAgIHRoaXMud2lkdGggPSAoZmxvYXQpd2lkdGg7CkBAIC0xNTcsNDggKzE4Nyw2OSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoZSBDbGFzcyBEb3VibGUgaXMgdGhlIHN1YmNsYXNzIG9mIFJvdW5kUmVjdGFuZ2xlMkQgdGhhdCBoYXMgYWxsIAotICAgICAqIG9mIGl0cyBkYXRhIHZhbHVlcyBzdG9yZWQgd2l0aCBkb3VibGUtbGV2ZWwgcHJlY2lzaW9uLgorICAgICAqIFRoZSBDbGFzcyBEb3VibGUgaXMgdGhlIHN1YmNsYXNzIG9mIFJvdW5kUmVjdGFuZ2xlMkQgdGhhdCBoYXMgYWxsIG9mIGl0cworICAgICAqIGRhdGEgdmFsdWVzIHN0b3JlZCB3aXRoIGRvdWJsZS1sZXZlbCBwcmVjaXNpb24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEb3VibGUgZXh0ZW5kcyBSb3VuZFJlY3RhbmdsZTJEIHsKIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgeDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIHk7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSB3aWR0aDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgaGVpZ2h0OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBhcmN3aWR0aCBvZiB0aGUgcm91bmRlZCBjb3JuZXJzLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYXJjIHdpZHRoIG9mIHRoZSByb3VuZGVkIGNvcm5lcnMuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIGFyY3dpZHRoOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBhcmNoZWlnaHQgb2YgdGhlIHJvdW5kZWQgY29ybmVycy4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGFyYyBoZWlnaHQgb2YgdGhlIHJvdW5kZWQgY29ybmVycy4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgYXJjaGVpZ2h0OwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZG91YmxlLXZhbHVlZCBSb3VuZFJlY3RhbmdsZTJEIHdpdGggCi0gICAgICAgICAqIGl0cyBkYXRhLXZhbHVlcyBzZXQgdG8gemVyby4KKyAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRvdWJsZS12YWx1ZWQgUm91bmRSZWN0YW5nbGUyRCB3aXRoIGl0cworICAgICAgICAgKiBkYXRhLXZhbHVlcyBzZXQgdG8gemVyby4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBEb3VibGUoKSB7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRvdWJsZS12YWx1ZWQgUm91bmRSZWN0YW5nbGUyRCB3aXRoIAotICAgICAgICAgKiB0aGUgc3BlY2lmaWVkIGRhdGEgdmFsdWVzLgorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZG91YmxlLXZhbHVlZCBSb3VuZFJlY3RhbmdsZTJEIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAgICAgKiBkYXRhIHZhbHVlcy4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyCi0gICAgICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyCi0gICAgICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZQotICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZQotICAgICAgICAgKiBAcGFyYW0gYXJjd2lkdGggdGhlIGFyY3dpZHRoIG9mIHRoZSByb3VuZGVkIGNvcm5lcnMKLSAgICAgICAgICogQHBhcmFtIGFyY2hlaWdodCB0aGUgYXJjaGVpZ2h0IG9mIHRoZSByb3VuZGVkIGNvcm5lcnMKKyAgICAgICAgICogQHBhcmFtIHgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgICAgICogQHBhcmFtIHkKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgICAgICogQHBhcmFtIHdpZHRoCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCisgICAgICAgICAqIEBwYXJhbSBhcmN3aWR0aAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBhcmMgd2lkdGggb2YgdGhlIHJvdW5kZWQgY29ybmVycy4KKyAgICAgICAgICogQHBhcmFtIGFyY2hlaWdodAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBhcmMgaGVpZ2h0IG9mIHRoZSByb3VuZGVkIGNvcm5lcnMuCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRG91YmxlKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0LCBkb3VibGUgYXJjd2lkdGgsIGRvdWJsZSBhcmNoZWlnaHQpIHsKKyAgICAgICAgcHVibGljIERvdWJsZShkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCwgZG91YmxlIGFyY3dpZHRoLAorICAgICAgICAgICAgICAgIGRvdWJsZSBhcmNoZWlnaHQpIHsKICAgICAgICAgICAgIHNldFJvdW5kUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBhcmN3aWR0aCwgYXJjaGVpZ2h0KTsKICAgICAgICAgfQogCkBAIC0yMzgsNyArMjg5LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRSb3VuZFJlY3QoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQsIGRvdWJsZSBhcmN3aWR0aCwgZG91YmxlIGFyY2hlaWdodCkgeworICAgICAgICBwdWJsaWMgdm9pZCBzZXRSb3VuZFJlY3QoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQsIGRvdWJsZSBhcmN3aWR0aCwKKyAgICAgICAgICAgICAgICBkb3VibGUgYXJjaGVpZ2h0KSB7CiAgICAgICAgICAgICB0aGlzLnggPSB4OwogICAgICAgICAgICAgdGhpcy55ID0geTsKICAgICAgICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDsKQEAgLTI2Myw3ICszMTUsNyBAQAogICAgIH0KIAogICAgIC8qCi0gICAgICogUm91bmRSZWN0YW5nbGUyRCBwYXRoIGl0ZXJhdG9yIAorICAgICAqIFJvdW5kUmVjdGFuZ2xlMkQgcGF0aCBpdGVyYXRvcgogICAgICAqLwogICAgIC8qKgogICAgICAqIFRoZSBzdWJjbGFzcyBvZiBQYXRoSXRlcmF0b3IgdG8gdHJhdmVyc2UgYSBSb3VuZFJlY3RhbmdsZTJELgpAQCAtMjc0LDcwICszMjYsMTAxIEBACiAgICAgICAgICAqIFBhdGggZm9yIHJvdW5kIGNvcm5lcnMgZ2VuZXJhdGVkIHRoZSBzYW1lIHdheSBhcyBFbGxpcHNlMkQKICAgICAgICAgICovCiAKLSAgICAgICAgLyoqIFRoZSBjb2VmZmljaWVudCB0byBjYWxjdWxhdGUgY29udHJvbCBwb2ludHMgb2YgQmV6aWVyIGN1cnZlcy4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb2VmZmljaWVudCB0byBjYWxjdWxhdGUgY29udHJvbCBwb2ludHMgb2YgQmV6aWVyIGN1cnZlcy4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSB1ID0gMC41IC0gMi4wIC8gMy4wICogKE1hdGguc3FydCgyLjApIC0gMS4wKTsKIAotICAgICAgICAvKiogVGhlIHBvaW50cyBjb29yZGluYXRlcyBjYWxjdWxhdGlvbiB0YWJsZS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwb2ludHMgY29vcmRpbmF0ZXMgY2FsY3VsYXRpb24gdGFibGUuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUgcG9pbnRzW11bXSA9IHsKLSAgICAgICAgICAgICAgICB7IDAuMCwgIDAuNSwgMC4wLCAgMC4wIH0sIC8vIE1PVkVUTwotICAgICAgICAgICAgICAgIHsgMS4wLCAtMC41LCAwLjAsICAwLjAgfSwgLy8gTElORVRPCi0gICAgICAgICAgICAgICAgeyAxLjAsICAgLXUsIDAuMCwgIDAuMCwgICAvLyBDVUJJQ1RPCi0gICAgICAgICAgICAgICAgICAxLjAsICAwLjAsIDAuMCwgICAgdSwKLSAgICAgICAgICAgICAgICAgIDEuMCwgIDAuMCwgMC4wLCAgMC41IH0sCi0gICAgICAgICAgICAgICAgeyAxLjAsICAwLjAsIDEuMCwgLTAuNSB9LCAvLyBMSU5FVE8KLSAgICAgICAgICAgICAgICB7IDEuMCwgIDAuMCwgMS4wLCAgIC11LCAgIC8vIENVQklDVE8KLSAgICAgICAgICAgICAgICAgIDEuMCwgICAtdSwgMS4wLCAgMC4wLAotICAgICAgICAgICAgICAgICAgMS4wLCAtMC41LCAxLjAsICAwLjAgfSwKLSAgICAgICAgICAgICAgICB7IDAuMCwgIDAuNSwgMS4wLCAgMC4wIH0sIC8vIExJTkVUTwotICAgICAgICAgICAgICAgIHsgMC4wLCAgICB1LCAxLjAsICAwLjAsICAgLy8gQ1VCSUNUTwotICAgICAgICAgICAgICAgICAgMC4wLCAgMC4wLCAxLjAsICAgLXUsCi0gICAgICAgICAgICAgICAgICAwLjAsICAwLjAsIDEuMCwgLTAuNSB9LAotICAgICAgICAgICAgICAgIHsgMC4wLCAgMC4wLCAwLjAsICAwLjUgfSwgLy8gTElORVRPCi0gICAgICAgICAgICAgICAgeyAwLjAsICAwLjAsIDAuMCwgICAgdSwgICAvLyBDVUJJQ1RPCi0gICAgICAgICAgICAgICAgICAwLjAsICAgIHUsIDAuMCwgIDAuMCwKLSAgICAgICAgICAgICAgICAgIDAuMCwgIDAuNSwgMC4wLCAgMC4wIH0gfTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAwLjAsIDAuNSwgMC4wLCAwLjAKKyAgICAgICAgICAgICAgICB9LCAvLyBNT1ZFVE8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAxLjAsIC0wLjUsIDAuMCwgMC4wCisgICAgICAgICAgICAgICAgfSwgLy8gTElORVRPCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgMS4wLCAtdSwgMC4wLCAwLjAsIC8vIENVQklDVE8KKyAgICAgICAgICAgICAgICAgICAgICAgIDEuMCwgMC4wLCAwLjAsIHUsIDEuMCwgMC4wLCAwLjAsIDAuNQorICAgICAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDEuMCwgMC4wLCAxLjAsIC0wLjUKKyAgICAgICAgICAgICAgICB9LCAvLyBMSU5FVE8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAxLjAsIDAuMCwgMS4wLCAtdSwgLy8gQ1VCSUNUTworICAgICAgICAgICAgICAgICAgICAgICAgMS4wLCAtdSwgMS4wLCAwLjAsIDEuMCwgLTAuNSwgMS4wLCAwLjAKKyAgICAgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICAgICAgICAgICAwLjAsIDAuNSwgMS4wLCAwLjAKKyAgICAgICAgICAgICAgICB9LCAvLyBMSU5FVE8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAwLjAsIHUsIDEuMCwgMC4wLCAvLyBDVUJJQ1RPCisgICAgICAgICAgICAgICAgICAgICAgICAwLjAsIDAuMCwgMS4wLCAtdSwgMC4wLCAwLjAsIDEuMCwgLTAuNQorICAgICAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMC4wLCAwLjAsIDAuNQorICAgICAgICAgICAgICAgIH0sIC8vIExJTkVUTworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMC4wLCAwLjAsIHUsIC8vIENVQklDVE8KKyAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgdSwgMC4wLCAwLjAsIDAuMCwgMC41LCAwLjAsIDAuMAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfTsKIAotICAgICAgICAvKiogVGhlIHNlZ21lbnQgdHlwZXMgY29ycmVzcG9uZCB0byBwb2ludHMgYXJyYXkuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc2VnbWVudCB0eXBlcyBjb3JyZXNwb25kIHRvIHBvaW50cyBhcnJheS4KKyAgICAgICAgICovCiAgICAgICAgIGludCB0eXBlc1tdID0gewotICAgICAgICAgICAgICAgIFNFR19NT1ZFVE8sCi0gICAgICAgICAgICAgICAgU0VHX0xJTkVUTywKLSAgICAgICAgICAgICAgICBTRUdfQ1VCSUNUTywKLSAgICAgICAgICAgICAgICBTRUdfTElORVRPLAotICAgICAgICAgICAgICAgIFNFR19DVUJJQ1RPLAotICAgICAgICAgICAgICAgIFNFR19MSU5FVE8sCi0gICAgICAgICAgICAgICAgU0VHX0NVQklDVE8sCi0gICAgICAgICAgICAgICAgU0VHX0xJTkVUTywKLSAgICAgICAgICAgICAgICBTRUdfQ1VCSUNUT307CisgICAgICAgICAgICAgICAgU0VHX01PVkVUTywgU0VHX0xJTkVUTywgU0VHX0NVQklDVE8sIFNFR19MSU5FVE8sIFNFR19DVUJJQ1RPLCBTRUdfTElORVRPLAorICAgICAgICAgICAgICAgIFNFR19DVUJJQ1RPLCBTRUdfTElORVRPLCBTRUdfQ1VCSUNUTworICAgICAgICB9OwogCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIGxlZnQtdXBwZXIgY29ybmVyIG9mIHRoZSByb3VuZCByZWN0YW5nbGUgYm91bmRzLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiBsZWZ0LXVwcGVyIGNvcm5lciBvZiB0aGUgcm91bmQgcmVjdGFuZ2xlIGJvdW5kcy4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSB4OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgbGVmdC11cHBlciBjb3JuZXIgb2YgdGhlIHJvdW5kIHJlY3RhbmdsZSBib3VuZHMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgbGVmdC11cHBlciBjb3JuZXIgb2YgdGhlIHJvdW5kIHJlY3RhbmdsZSBib3VuZHMuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUgeTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHJvdW5kIHJlY3RhbmdsZSBib3VuZHMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgcm91bmQgcmVjdGFuZ2xlIGJvdW5kcy4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSB3aWR0aDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSByb3VuZCByZWN0YW5nbGUgYm91bmRzLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSByb3VuZCByZWN0YW5nbGUgYm91bmRzLgorICAgICAgICAgKi8KICAgICAgICAgZG91YmxlIGhlaWdodDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgd2lkdGggb2YgYXJjIGNvcm5lcnMgb2YgdGhlIHJvdW5kIHJlY3RhbmdsZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHdpZHRoIG9mIGFyYyBjb3JuZXJzIG9mIHRoZSByb3VuZCByZWN0YW5nbGUuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUgYXc7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGhlaWdodCBvZiBhcmMgY29ybmVycyBvZiB0aGUgcm91bmQgcmVjdGFuZ2xlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIGFyYyBjb3JuZXJzIG9mIHRoZSByb3VuZCByZWN0YW5nbGUuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUgYWg7CiAKLSAgICAgICAgLyoqIFRoZSBwYXRoIGl0ZXJhdG9yIHRyYW5zZm9ybWF0aW9uLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBhdGggaXRlcmF0b3IgdHJhbnNmb3JtYXRpb24uCisgICAgICAgICAqLwogICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdDsKIAotICAgICAgICAvKiogVGhlIGN1cnJlbnQgc2VnbWVuZXQgaW5kZXguICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY3VycmVudCBzZWdtZW50IGluZGV4LgorICAgICAgICAgKi8KICAgICAgICAgaW50IGluZGV4OwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFJvdW5kUmVjdGFuZ2xlMkQuSXRlcmF0b3IgZm9yIGdpdmVuIHJvdW5kIHJlY3RhbmdsZSBhbmQgdHJhbnNmb3JtYXRpb24uCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUm91bmRSZWN0YW5nbGUyRC5JdGVyYXRvciBmb3IgZ2l2ZW4gcm91bmQgcmVjdGFuZ2xlCisgICAgICAgICAqIGFuZCB0cmFuc2Zvcm1hdGlvbi4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSByciAtIHRoZSBzb3VyY2UgUm91bmRSZWN0YW5nbGUyRCBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIGF0IC0gdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgdG8gYXBwbHkgcmVjdGFuZ2xlIHBhdGgKKyAgICAgICAgICogQHBhcmFtIHJyCisgICAgICAgICAqICAgICAgICAgICAgLSB0aGUgc291cmNlIFJvdW5kUmVjdGFuZ2xlMkQgb2JqZWN0CisgICAgICAgICAqIEBwYXJhbSBhdAorICAgICAgICAgKiAgICAgICAgICAgIC0gdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgdG8gYXBwbHkgcmVjdGFuZ2xlIHBhdGgKICAgICAgICAgICovCiAgICAgICAgIEl0ZXJhdG9yKFJvdW5kUmVjdGFuZ2xlMkQgcnIsIEFmZmluZVRyYW5zZm9ybSBhdCkgewogICAgICAgICAgICAgdGhpcy54ID0gcnIuZ2V0WCgpOwpAQCAtNDE1LDQxICs0OTgsNDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBhcmMgd2lkdGguCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJjIHdpZHRoCisgICAgICogQHJldHVybiB0aGUgYXJjIHdpZHRoLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0QXJjV2lkdGgoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGFyYyBoZWlnaHQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJjIGhlaWdodAorICAgICAqIEByZXR1cm4gdGhlIGFyYyBoZWlnaHQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRBcmNIZWlnaHQoKTsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGRhdGEgb2YgdGhlIFJvdW5kUmVjdGFuZ2xlMkQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIKLSAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lcgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZQotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlCi0gICAgICogQHBhcmFtIGFyY1dpZHRoIHRoZSBhcmN3aWR0aCBvZiB0aGUgcm91bmRlZCBjb3JuZXJzCi0gICAgICogQHBhcmFtIGFyY0hlaWdodCB0aGUgYXJjaGVpZ2h0IG9mIHRoZSByb3VuZGVkIGNvcm5lcnMKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBhcmNXaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIGFyYyB3aWR0aCBvZiB0aGUgcm91bmRlZCBjb3JuZXJzLgorICAgICAqIEBwYXJhbSBhcmNIZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcmMgaGVpZ2h0IG9mIHRoZSByb3VuZGVkIGNvcm5lcnMuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Um91bmRSZWN0KGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0LAogICAgICAgICAgICAgZG91YmxlIGFyY1dpZHRoLCBkb3VibGUgYXJjSGVpZ2h0KTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRhdGEgb2YgdGhlIFJvdW5kUmVjdGFuZ2xlMkQgYnkgY29weWluZyB0aGUgdmFsdWVzCi0gICAgICogZnJvbSBhbiBleGlzdGluZyBSb3VuZFJlY3RhbmdsZTJELgorICAgICAqIFNldHMgdGhlIGRhdGEgb2YgdGhlIFJvdW5kUmVjdGFuZ2xlMkQgYnkgY29weWluZyB0aGUgdmFsdWVzIGZyb20gYW4KKyAgICAgKiBleGlzdGluZyBSb3VuZFJlY3RhbmdsZTJELgogICAgICAqIAotICAgICAqIEBwYXJhbSByciB0aGUgcm91bmQgcmVjdGFuZ2xlIHRvIGNvcHkgdGhlIGRhdGEgZnJvbQotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgcnIgaXMgbnVsbAorICAgICAqIEBwYXJhbSBycgorICAgICAqICAgICAgICAgICAgdGhlIHJvdW5kIHJlY3RhbmdsZSB0byBjb3B5IHRoZSBkYXRhIGZyb20uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHJyIGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Um91bmRSZWN0KFJvdW5kUmVjdGFuZ2xlMkQgcnIpIHsKLSAgICAgICAgc2V0Um91bmRSZWN0KHJyLmdldFgoKSwgcnIuZ2V0WSgpLCByci5nZXRXaWR0aCgpLCByci5nZXRIZWlnaHQoKSwgcnIKLSAgICAgICAgICAgICAgICAuZ2V0QXJjV2lkdGgoKSwgcnIuZ2V0QXJjSGVpZ2h0KCkpOworICAgICAgICBzZXRSb3VuZFJlY3QocnIuZ2V0WCgpLCByci5nZXRZKCksIHJyLmdldFdpZHRoKCksIHJyLmdldEhlaWdodCgpLCByci5nZXRBcmNXaWR0aCgpLCBycgorICAgICAgICAgICAgICAgIC5nZXRBcmNIZWlnaHQoKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC00NzgsMjEgKzU2OCwxOSBAQAogCiAgICAgICAgIGlmIChweCA8IHJ4MSArIGF3KSB7CiAgICAgICAgICAgICBjeCA9IHJ4MSArIGF3OwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGlmIChweCA+IHJ4MiAtIGF3KSB7Ci0gICAgICAgICAgICAgICAgY3ggPSByeDIgLSBhdzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocHggPiByeDIgLSBhdykgeworICAgICAgICAgICAgY3ggPSByeDIgLSBhdzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CiAKICAgICAgICAgaWYgKHB5IDwgcnkxICsgYWgpIHsKICAgICAgICAgICAgIGN5ID0gcnkxICsgYWg7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgaWYgKHB5ID4gcnkyIC0gYWgpIHsKLSAgICAgICAgICAgICAgICBjeSA9IHJ5MiAtIGFoOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChweSA+IHJ5MiAtIGFoKSB7CisgICAgICAgICAgICBjeSA9IHJ5MiAtIGFoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KIAogICAgICAgICBweCA9IChweCAtIGN4KSAvIGF3OwogICAgICAgICBweSA9IChweSAtIGN5KSAvIGFoOwpAQCAtNTM3LDExICs2MjUsNyBAQAogICAgICAgICBkb3VibGUgcngyID0gcnggKyBydzsKICAgICAgICAgZG91YmxlIHJ5MiA9IHJ5ICsgcmg7CiAKLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBjb250YWlucyhyeDEsIHJ5MSkgJiYKLSAgICAgICAgICAgIGNvbnRhaW5zKHJ4MiwgcnkxKSAmJgotICAgICAgICAgICAgY29udGFpbnMocngyLCByeTIpICYmCi0gICAgICAgICAgICBjb250YWlucyhyeDEsIHJ5Mik7CisgICAgICAgIHJldHVybiBjb250YWlucyhyeDEsIHJ5MSkgJiYgY29udGFpbnMocngyLCByeTEpICYmIGNvbnRhaW5zKHJ4MiwgcnkyKSAmJiBjb250YWlucyhyeDEsIHJ5Mik7CiAgICAgfQogCiAgICAgcHVibGljIFBhdGhJdGVyYXRvciBnZXRQYXRoSXRlcmF0b3IoQWZmaW5lVHJhbnNmb3JtIGF0KSB7CkBAIC01NDksNCArNjMzLDMgQEAKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2dlb20vcGFja2FnZS5odG1sIGIvYXd0L2phdmEvYXd0L2dlb20vcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYTIzNmUKLS0tIC9kZXYvbnVsbAorKysgYi9hd3QvamF2YS9hd3QvZ2VvbS9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGJvZHk+CisgICAgPHA+CisgICAgICBUaGlzIHBhY2thZ2UgY29udGFpbnMgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyByZWxhdGVkIHRvIEphdmEyRCBzaGFwZXMgYW5kIGdlb21ldHJ5LgorICAgIDwvcD4KKyAgICBAc2luY2UgQW5kcm9pZCAxLjAKKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltL0lucHV0Q29udGV4dC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltL0lucHV0Q29udGV4dC5qYXZhCmluZGV4IDM0Njg0NzQuLmNjZTUxNDggMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbS9JbnB1dENvbnRleHQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW0vSW5wdXRDb250ZXh0LmphdmEKQEAgLTI2LDYgKzI2LDEyIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmltLklucHV0TWV0aG9kQ29udGV4dDsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIElucHV0Q29udGV4dCB7CiAgICAgcHJvdGVjdGVkIElucHV0Q29udGV4dCgpIHsKICAgICB9CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW0vSW5wdXRNZXRob2RIaWdobGlnaHQuamF2YSBiL2F3dC9qYXZhL2F3dC9pbS9JbnB1dE1ldGhvZEhpZ2hsaWdodC5qYXZhCmluZGV4IDUzYmIyMGIuLjg2NWQ0N2MgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbS9JbnB1dE1ldGhvZEhpZ2hsaWdodC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbS9JbnB1dE1ldGhvZEhpZ2hsaWdodC5qYXZhCkBAIC0yNSw2ICsyNSwxMiBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBjbGFzcyBJbnB1dE1ldGhvZEhpZ2hsaWdodCB7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQVdfVEVYVCA9IDA7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW0vSW5wdXRNZXRob2RSZXF1ZXN0cy5qYXZhIGIvYXd0L2phdmEvYXd0L2ltL0lucHV0TWV0aG9kUmVxdWVzdHMuamF2YQppbmRleCBiZGQyNWU2Li5iMTJkMzk3IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW0vSW5wdXRNZXRob2RSZXF1ZXN0cy5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbS9JbnB1dE1ldGhvZFJlcXVlc3RzLmphdmEKQEAgLTI0LDYgKzI0LDEyIEBACiBpbXBvcnQgamF2YS5hd3QuZm9udC5UZXh0SGl0SW5mbzsKIGltcG9ydCBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yOwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgaW50ZXJmYWNlIElucHV0TWV0aG9kUmVxdWVzdHMgewogCiAgICAgcHVibGljIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciBjYW5jZWxMYXRlc3RDb21taXR0ZWRUZXh0KEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci5BdHRyaWJ1dGVbXSBhdHRyaWJ1dGVzKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbS9JbnB1dFN1YnNldC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltL0lucHV0U3Vic2V0LmphdmEKaW5kZXggMDJhMTA0OS4uNzA4ODgxZSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltL0lucHV0U3Vic2V0LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltL0lucHV0U3Vic2V0LmphdmEKQEAgLTIwLDYgKzIwLDEyIEBACiAgKi8KIHBhY2thZ2UgamF2YS5hd3QuaW07CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBJbnB1dFN1YnNldCBleHRlbmRzIENoYXJhY3Rlci5TdWJzZXQgewogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnB1dFN1YnNldCBMQVRJTiA9IG5ldyBJbnB1dFN1YnNldCgiTEFUSU4iKTsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltL3NwaS9JbnB1dE1ldGhvZC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltL3NwaS9JbnB1dE1ldGhvZC5qYXZhCmluZGV4IDJjOThjNDYuLjY3YTg4MzQgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbS9zcGkvSW5wdXRNZXRob2QuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW0vc3BpL0lucHV0TWV0aG9kLmphdmEKQEAgLTI0LDYgKzI0LDEyIEBACiBpbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSW5wdXRNZXRob2QgewogCiAgICAgcHVibGljIHZvaWQgYWN0aXZhdGUoKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbS9zcGkvSW5wdXRNZXRob2RDb250ZXh0LmphdmEgYi9hd3QvamF2YS9hd3QvaW0vc3BpL0lucHV0TWV0aG9kQ29udGV4dC5qYXZhCmluZGV4IGNhMzNlODcuLmJmYzc3M2MgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbS9zcGkvSW5wdXRNZXRob2RDb250ZXh0LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltL3NwaS9JbnB1dE1ldGhvZENvbnRleHQuamF2YQpAQCAtMjYsNiArMjYsMTIgQEAKIGltcG9ydCBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yOwogLy8/Pz9BV1Q6IGltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSW5wdXRNZXRob2RDb250ZXh0IGV4dGVuZHMgSW5wdXRNZXRob2RSZXF1ZXN0cyB7CiAKIC8vICAgID8/P0FXVDogcHVibGljIEpGcmFtZSBjcmVhdGVJbnB1dE1ldGhvZEpGcmFtZShTdHJpbmcgdGl0bGUsIGJvb2xlYW4gYXR0YWNoVG9JbnB1dENvbnRleHQpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltL3NwaS9JbnB1dE1ldGhvZERlc2NyaXB0b3IuamF2YSBiL2F3dC9qYXZhL2F3dC9pbS9zcGkvSW5wdXRNZXRob2REZXNjcmlwdG9yLmphdmEKaW5kZXggMzA2OGNhYy4uYzgwMGJjMSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltL3NwaS9JbnB1dE1ldGhvZERlc2NyaXB0b3IuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW0vc3BpL0lucHV0TWV0aG9kRGVzY3JpcHRvci5qYXZhCkBAIC0yNCw2ICsyNCwxMiBAQAogaW1wb3J0IGphdmEuYXd0LkltYWdlOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSW5wdXRNZXRob2REZXNjcmlwdG9yIHsKIAogICAgIHB1YmxpYyBMb2NhbGVbXSBnZXRBdmFpbGFibGVMb2NhbGVzKCkgdGhyb3dzIEFXVEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9BZmZpbmVUcmFuc2Zvcm1PcC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0FmZmluZVRyYW5zZm9ybU9wLmphdmEKaW5kZXggNTQ2ODM3YS4uZGIyNWUxYSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0FmZmluZVRyYW5zZm9ybU9wLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0FmZmluZVRyYW5zZm9ybU9wLmphdmEKQEAgLTMyLDUwICszMiw2MCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBBZmZpbmVUcmFuc2Zvcm0gY2xhc3MgdHJhbnNsYXRlcyBjb29yZGluYXRlcyBmcm9tIDJEIGNvb3JkaW5hdGVzIAotICogaW4gdGhlIHNvdXJjZSBpbWFnZSBvciBSYXN0ZXIgdG8gMkQgY29vcmRpbmF0ZXMgaW4gdGhlIGRlc3RpbmF0aW9uIAotICogaW1hZ2Ugb3IgUmFzdGVyIHVzaW5nIEFmZmluZSB0cmFuc2Zvcm1hdGlvbi4gVGhlIG51bWJlciBvZiBiYW5kcyBpbiAKLSAqIHRoZSBzb3VyY2UgUmFzdGVyIHNob3VsZCBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGJhbmRzIGluIHRoZSBkZXN0aW5hdGlvbgotICogUmFzdGVyLgorICogVGhlIEFmZmluZVRyYW5zZm9ybSBjbGFzcyB0cmFuc2xhdGVzIGNvb3JkaW5hdGVzIGZyb20gMkQgY29vcmRpbmF0ZXMgaW4gdGhlCisgKiBzb3VyY2UgaW1hZ2Ugb3IgUmFzdGVyIHRvIDJEIGNvb3JkaW5hdGVzIGluIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSBvciBSYXN0ZXIKKyAqIHVzaW5nIGFmZmluZSB0cmFuc2Zvcm1hdGlvbi4gVGhlIG51bWJlciBvZiBiYW5kcyBpbiB0aGUgc291cmNlIFJhc3RlciBzaG91bGQKKyAqIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYmFuZHMgaW4gdGhlIGRlc3RpbmF0aW9uIFJhc3Rlci4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBBZmZpbmVUcmFuc2Zvcm1PcCBpbXBsZW1lbnRzIEJ1ZmZlcmVkSW1hZ2VPcCwgUmFzdGVyT3AgewotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9ORUFSRVNUX05FSUdIQk9SIGluZGljYXRlcyBuZWFyZXN0LW5laWdoYm9yIAotICAgICAqIGludGVycG9sYXRpb24gdHlwZS4gCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9ORUFSRVNUX05FSUdIQk9SIGluZGljYXRlcyBuZWFyZXN0LW5laWdoYm9yCisgICAgICogaW50ZXJwb2xhdGlvbiB0eXBlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfTkVBUkVTVF9ORUlHSEJPUiA9IDE7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0JJTElORUFSIGluZGljYXRlcyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUuIAorCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfQklMSU5FQVIgaW5kaWNhdGVzIGJpbGluZWFyIGludGVycG9sYXRpb24gdHlwZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0JJTElORUFSID0gMjsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfQklDVUJJQyBpbmRpY2F0ZXMgYmljdWJpYyBpbnRlcnBvbGF0aW9uIHR5cGUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9CSUNVQklDIGluZGljYXRlcyBiaS1jdWJpYyBpbnRlcnBvbGF0aW9uIHR5cGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9CSUNVQklDID0gMzsKIAotICAgIC8qKiBUaGUgaSB0eXBlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBpIHR5cGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgaVR5cGU7IC8vIGludGVycG9sYXRpb24gdHlwZQotICAgIAotICAgIC8qKiBUaGUgYXQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXQuCisgICAgICovCiAgICAgcHJpdmF0ZSBBZmZpbmVUcmFuc2Zvcm0gYXQ7Ci0gICAgCi0gICAgLyoqIFRoZSBoaW50cy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBoaW50cy4KKyAgICAgKi8KICAgICBwcml2YXRlIFJlbmRlcmluZ0hpbnRzIGhpbnRzOwogCiAgICAgc3RhdGljIHsKICAgICAgICAgLy8gVE9ETyAtIHVuY29tbWVudAotICAgICAgICAvL1N5c3RlbS5sb2FkTGlicmFyeSgiaW1hZ2VvcHMiKTsKKyAgICAgICAgLy8gU3lzdGVtLmxvYWRMaWJyYXJ5KCJpbWFnZW9wcyIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBZmZpbmVUcmFuc2Zvcm1PcCB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBBZmZpbmVUcmFuc2Zvcm0gYW5kIFJlbmRlcmluZ0hpbnRzIG9iamVjdCB3aGljaCBkZWZpbmVzIAotICAgICAqIHRoZSBpbnRlcnBvbGF0aW9uIHR5cGUuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEFmZmluZVRyYW5zZm9ybU9wIHdpdGggdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0KKyAgICAgKiBhbmQgUmVuZGVyaW5nSGludHMgb2JqZWN0IHdoaWNoIGRlZmluZXMgdGhlIGludGVycG9sYXRpb24gdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geGZvcm0gdGhlIEFmZmluZVRyYW5zZm9ybS4KLSAgICAgKiBAcGFyYW0gaGludHMgdGhlIFJlbmRlcmluZ0hpbnRzIG9iamVjdCB3aGljaCBkZWZpbmVzIAotICAgICAqIHRoZSBpbnRlcnBvbGF0aW9uIHR5cGUuCisgICAgICogQHBhcmFtIHhmb3JtCisgICAgICogICAgICAgICAgICB0aGUgQWZmaW5lVHJhbnNmb3JtLgorICAgICAqIEBwYXJhbSBoaW50cworICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmluZ0hpbnRzIG9iamVjdCB3aGljaCBkZWZpbmVzIHRoZSBpbnRlcnBvbGF0aW9uCisgICAgICogICAgICAgICAgICB0eXBlLgogICAgICAqLwogICAgIHB1YmxpYyBBZmZpbmVUcmFuc2Zvcm1PcChBZmZpbmVUcmFuc2Zvcm0geGZvcm0sIFJlbmRlcmluZ0hpbnRzIGhpbnRzKSB7CiAgICAgICAgIHRoaXMoeGZvcm0sIFRZUEVfTkVBUkVTVF9ORUlHSEJPUik7CkBAIC05NSwyMCArMTA1LDIyIEBACiAgICAgICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGZyb20gcmVuZGVyaW5nIHF1YWxpdHkKICAgICAgICAgICAgICAgICBpZiAoaGludCA9PSBSZW5kZXJpbmdIaW50cy5WQUxVRV9SRU5ERVJfUVVBTElUWSkgewogICAgICAgICAgICAgICAgICAgICB0aGlzLmlUeXBlID0gVFlQRV9CSUxJTkVBUjsKLSAgICAgICAgICAgICAgICAvLyBGb3Igc3BlZWQgdXNlIG5lYXJlc3QgbmVpZ2hib3IKKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHNwZWVkIHVzZSBuZWFyZXN0IG5laWdoYm9yCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEFmZmluZVRyYW5zZm9ybU9wIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIEFmZmluZVRyYW5zZm9ybSBhbmQgYSBzcGVjaWZpZWQgaW50ZXJwb2xhdGlvbiB0eXBlIGZyb20gdGhlIAotICAgICAqIGxpc3Qgb2YgcHJlZGVmaW5lZCBpbnRlcnBvbGF0aW9uIHR5cGVzLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBZmZpbmVUcmFuc2Zvcm1PcCB3aXRoIHRoZSBzcGVjaWZpZWQgQWZmaW5lVHJhbnNmb3JtCisgICAgICogYW5kIGEgc3BlY2lmaWVkIGludGVycG9sYXRpb24gdHlwZSBmcm9tIHRoZSBsaXN0IG9mIHByZWRlZmluZWQKKyAgICAgKiBpbnRlcnBvbGF0aW9uIHR5cGVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4Zm9ybSB0aGUgQWZmaW5lVHJhbnNmb3JtLgotICAgICAqIEBwYXJhbSBpbnRlcnAgdGhlIG9uZSBvZiBwcmVkZWZpbmVkIGludGVycG9sYXRpb24gdHlwZXM6Ci0gICAgICogVFlQRV9ORUFSRVNUX05FSUdIQk9SLCBUWVBFX0JJTElORUFSLCBvciBUWVBFX0JJQ1VCSUMuCisgICAgICogQHBhcmFtIHhmb3JtCisgICAgICogICAgICAgICAgICB0aGUgQWZmaW5lVHJhbnNmb3JtLgorICAgICAqIEBwYXJhbSBpbnRlcnAKKyAgICAgKiAgICAgICAgICAgIHRoZSBvbmUgb2YgcHJlZGVmaW5lZCBpbnRlcnBvbGF0aW9uIHR5cGVzOgorICAgICAqICAgICAgICAgICAgVFlQRV9ORUFSRVNUX05FSUdIQk9SLCBUWVBFX0JJTElORUFSLCBvciBUWVBFX0JJQ1VCSUMuCiAgICAgICovCiAgICAgcHVibGljIEFmZmluZVRyYW5zZm9ybU9wKEFmZmluZVRyYW5zZm9ybSB4Zm9ybSwgaW50IGludGVycCkgewogICAgICAgICBpZiAoTWF0aC5hYnMoeGZvcm0uZ2V0RGV0ZXJtaW5hbnQoKSkgPD0gRG91YmxlLk1JTl9WQUxVRSkgewpAQCAtMTE2LDcgKzEyOCw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI0RiIsIHhmb3JtKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIHRoaXMuYXQgPSAoQWZmaW5lVHJhbnNmb3JtKSB4Zm9ybS5jbG9uZSgpOworICAgICAgICB0aGlzLmF0ID0gKEFmZmluZVRyYW5zZm9ybSl4Zm9ybS5jbG9uZSgpOwogCiAgICAgICAgIGlmIChpbnRlcnAgIT0gVFlQRV9ORUFSRVNUX05FSUdIQk9SICYmIGludGVycCAhPSBUWVBFX0JJTElORUFSICYmIGludGVycCAhPSBUWVBFX0JJQ1VCSUMpIHsKICAgICAgICAgICAgIC8vIGF3dC4yNTA9VW5rbm93biBpbnRlcnBvbGF0aW9uIHR5cGU6IHswfQpAQCAtMTI5LDcgKzE0MSw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgaW50ZXJwb2xhdGlvbiB0eXBlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludGVycG9sYXRpb24gdHlwZQorICAgICAqIEByZXR1cm4gdGhlIGludGVycG9sYXRpb24gdHlwZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldEludGVycG9sYXRpb25UeXBlKCkgewogICAgICAgICByZXR1cm4gaVR5cGU7CkBAIC0xNjUsNyArMTc3LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBBZmZpbmVUcmFuc2Zvcm0uCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIEFmZmluZVRyYW5zZm9ybSBnZXRUcmFuc2Zvcm0oKSB7Ci0gICAgICAgIHJldHVybiAoQWZmaW5lVHJhbnNmb3JtKSBhdC5jbG9uZSgpOworICAgICAgICByZXR1cm4gKEFmZmluZVRyYW5zZm9ybSlhdC5jbG9uZSgpOwogICAgIH0KIAogICAgIHB1YmxpYyBmaW5hbCBQb2ludDJEIGdldFBvaW50MkQoUG9pbnQyRCBzcmNQdCwgUG9pbnQyRCBkc3RQdCkgewpAQCAtMTc3LDIxICsxODksMTkgQEAKICAgICB9CiAKICAgICBwdWJsaWMgZmluYWwgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzMkQoUmFzdGVyIHNyYykgewotICAgICAgICAvLyBXZSBwb3NpdGlvbiBzb3VyY2UgcmFzdGVyIHRvICgwLDApIGV2ZW4gaWYgaXQgaXMgdHJhbnNsYXRlZCBjaGlsZCByYXN0ZXIuCisgICAgICAgIC8vIFdlIHBvc2l0aW9uIHNvdXJjZSByYXN0ZXIgdG8gKDAsMCkgZXZlbiBpZiBpdCBpcyB0cmFuc2xhdGVkIGNoaWxkCisgICAgICAgIC8vIHJhc3Rlci4KICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHdlIG5lZWQgb25seSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzcmMKICAgICAgICAgaW50IHdpZHRoID0gc3JjLmdldFdpZHRoKCk7CiAgICAgICAgIGludCBoZWlnaHQgPSBzcmMuZ2V0SGVpZ2h0KCk7CiAKICAgICAgICAgZmxvYXRbXSBjb3JuZXJzID0gewotICAgICAgICAgICAgMCwgMCwKLSAgICAgICAgICAgIHdpZHRoLCAwLAotICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgIDAsIGhlaWdodAorICAgICAgICAgICAgICAgIDAsIDAsIHdpZHRoLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCBoZWlnaHQKICAgICAgICAgfTsKIAogICAgICAgICBhdC50cmFuc2Zvcm0oY29ybmVycywgMCwgY29ybmVycywgMCwgNCk7CiAKLSAgICAgICAgUmVjdGFuZ2xlMkQuRmxvYXQgYm91bmRzID0gbmV3IFJlY3RhbmdsZTJELkZsb2F0KGNvcm5lcnNbMF0sIGNvcm5lcnNbMV0sIDAgLCAwKTsKKyAgICAgICAgUmVjdGFuZ2xlMkQuRmxvYXQgYm91bmRzID0gbmV3IFJlY3RhbmdsZTJELkZsb2F0KGNvcm5lcnNbMF0sIGNvcm5lcnNbMV0sIDAsIDApOwogICAgICAgICBib3VuZHMuYWRkKGNvcm5lcnNbMl0sIGNvcm5lcnNbM10pOwogICAgICAgICBib3VuZHMuYWRkKGNvcm5lcnNbNF0sIGNvcm5lcnNbNV0pOwogICAgICAgICBib3VuZHMuYWRkKGNvcm5lcnNbNl0sIGNvcm5lcnNbN10pOwpAQCAtMjA4LDE3ICsyMTgsMTQgQEAKICAgICAgICAgZG91YmxlIGRzdEhlaWdodCA9IG5ld0JvdW5kcy5nZXRZKCkgKyBuZXdCb3VuZHMuZ2V0SGVpZ2h0KCk7CiAKICAgICAgICAgaWYgKGRzdFdpZHRoIDw9IDAgfHwgZHN0SGVpZ2h0IDw9IDApIHsKLSAgICAgICAgICAgIC8vIGF3dC4yNTE9VHJhbnNmb3JtZWQgd2lkdGggKHswfSkgYW5kIGhlaWdodCAoezF9KSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAKLSAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI1MSIsIGRzdFdpZHRoLCBkc3RIZWlnaHQpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgLy8gYXd0LjI1MT1UcmFuc2Zvcm1lZCB3aWR0aCAoezB9KSBhbmQgaGVpZ2h0ICh7MX0pIHNob3VsZCBiZQorICAgICAgICAgICAgLy8gZ3JlYXRlciB0aGFuIDAKKyAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjUxIiwgZHN0V2lkdGgsIGRzdEhlaWdodCkpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZGVzdENNICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRJbWFnZShkZXN0Q00sCi0gICAgICAgICAgICAgICAgICAgIGRlc3RDTS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoKGludClkc3RXaWR0aCwgKGludClkc3RIZWlnaHQpLAotICAgICAgICAgICAgICAgICAgICBkZXN0Q00uaXNBbHBoYVByZW11bHRpcGxpZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbAotICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRJbWFnZShkZXN0Q00sIGRlc3RDTS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoKGludClkc3RXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgKGludClkc3RIZWlnaHQpLCBkZXN0Q00uaXNBbHBoYVByZW11bHRpcGxpZWQoKSwgbnVsbCk7CiAgICAgICAgIH0KIAogICAgICAgICBDb2xvck1vZGVsIGNtID0gc3JjLmdldENvbG9yTW9kZWwoKTsKQEAgLTIyOSwyMyArMjM2LDE4IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBPSywgd2UgY2FuIGdldCBzb3VyY2UgY29sb3IgbW9kZWwKLSAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZEltYWdlKGNtLAotICAgICAgICAgICAgICAgIHNyYy5nZXRSYXN0ZXIoKS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoKGludClkc3RXaWR0aCwgKGludClkc3RIZWlnaHQpLAotICAgICAgICAgICAgICAgIGNtLmlzQWxwaGFQcmVtdWx0aXBsaWVkKCksCi0gICAgICAgICAgICAgICAgbnVsbAotICAgICAgICApOworICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkSW1hZ2UoY20sIHNyYy5nZXRSYXN0ZXIoKS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoKGludClkc3RXaWR0aCwKKyAgICAgICAgICAgICAgICAoaW50KWRzdEhlaWdodCksIGNtLmlzQWxwaGFQcmVtdWx0aXBsaWVkKCksIG51bGwpOwogICAgIH0KIAotICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVDb21wYXRpYmxlRGVzdFJhc3RlciAoUmFzdGVyIHNyYykgeworICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVDb21wYXRpYmxlRGVzdFJhc3RlcihSYXN0ZXIgc3JjKSB7CiAgICAgICAgIC8vIEhlcmUgYXBwcm9hY2ggaXMgb3RoZXIgdGhlbiBpbiBjcmVhdGVDb21wYXRpYmxlRGVzdEltYWdlIC0KICAgICAgICAgLy8gZGVzdGluYXRpb24gc2hvdWxkIGluY2x1ZGUgb25seQogICAgICAgICAvLyB0cmFuc2Zvcm1lZCBpbWFnZSwgYnV0IG5vdCAoMCwwKSBpbiBzb3VyY2UgY29vcmRpbmF0ZSBzeXN0ZW0KIAogICAgICAgICBSZWN0YW5nbGUyRCBuZXdCb3VuZHMgPSBnZXRCb3VuZHMyRChzcmMpOwotICAgICAgICByZXR1cm4gc3JjLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcigKLSAgICAgICAgICAgICAgICAoaW50KSBuZXdCb3VuZHMuZ2V0WCgpLCAoaW50KSBuZXdCb3VuZHMuZ2V0WSgpLAotICAgICAgICAgICAgICAgIChpbnQpIG5ld0JvdW5kcy5nZXRXaWR0aCgpLCAoaW50KW5ld0JvdW5kcy5nZXRIZWlnaHQoKQotICAgICAgICApOworICAgICAgICByZXR1cm4gc3JjLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcigoaW50KW5ld0JvdW5kcy5nZXRYKCksIChpbnQpbmV3Qm91bmRzLmdldFkoKSwKKyAgICAgICAgICAgICAgICAoaW50KW5ld0JvdW5kcy5nZXRXaWR0aCgpLCAoaW50KW5ld0JvdW5kcy5nZXRIZWlnaHQoKSk7CiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIEJ1ZmZlcmVkSW1hZ2UgZmlsdGVyKEJ1ZmZlcmVkSW1hZ2Ugc3JjLCBCdWZmZXJlZEltYWdlIGRzdCkgewpAQCAtMjU3LDEwICsyNTksOCBAQAogICAgICAgICBDb2xvck1vZGVsIHNyY0NNID0gc3JjLmdldENvbG9yTW9kZWwoKTsKICAgICAgICAgQnVmZmVyZWRJbWFnZSBmaW5hbERzdCA9IG51bGw7CiAKLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgIHNyY0NNIGluc3RhbmNlb2YgSW5kZXhDb2xvck1vZGVsICYmCi0gICAgICAgICAgICAgICAgKGlUeXBlICE9IFRZUEVfTkVBUkVTVF9ORUlHSEJPUiB8fCBzcmNDTS5nZXRQaXhlbFNpemUoKSAlIDggIT0gMCkKLSAgICAgICAgKSB7CisgICAgICAgIGlmIChzcmNDTSBpbnN0YW5jZW9mIEluZGV4Q29sb3JNb2RlbAorICAgICAgICAgICAgICAgICYmIChpVHlwZSAhPSBUWVBFX05FQVJFU1RfTkVJR0hCT1IgfHwgc3JjQ00uZ2V0UGl4ZWxTaXplKCkgJSA4ICE9IDApKSB7CiAgICAgICAgICAgICBzcmMgPSAoKEluZGV4Q29sb3JNb2RlbClzcmNDTSkuY29udmVydFRvSW50RGlzY3JldGUoc3JjLmdldFJhc3RlcigpLCB0cnVlKTsKICAgICAgICAgICAgIHNyY0NNID0gc3JjLmdldENvbG9yTW9kZWwoKTsKICAgICAgICAgfQpAQCAtMjY5LDE1ICsyNjksMTAgQEAKICAgICAgICAgICAgIGRzdCA9IGNyZWF0ZUNvbXBhdGlibGVEZXN0SW1hZ2Uoc3JjLCBzcmNDTSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoIXNyY0NNLmVxdWFscyhkc3QuZ2V0Q29sb3JNb2RlbCgpKSkgewotICAgICAgICAgICAgICAgIC8vIFRyZWF0IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCIGFuZCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IgYXMgc2FtZQotICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAhKAotICAgICAgICAgICAgICAgICAgICAgKHNyYy5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IgfHwKLSAgICAgICAgICAgICAgICAgICAgICBzcmMuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQikgJiYKLSAgICAgICAgICAgICAgICAgICAgIChkc3QuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgZHN0LmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpCi0gICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAvLyBUcmVhdCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQiBhbmQKKyAgICAgICAgICAgICAgICAvLyBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IgYXMgc2FtZQorICAgICAgICAgICAgICAgIGlmICghKChzcmMuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCIHx8IHNyYy5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKSAmJiAoZHN0CisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCIHx8IGRzdC5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKSkpIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWxEc3QgPSBkc3Q7CiAgICAgICAgICAgICAgICAgICAgIGRzdCA9IGNyZWF0ZUNvbXBhdGlibGVEZXN0SW1hZ2Uoc3JjLCBzcmNDTSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjg3LDEwICsyODIsMTEgQEAKICAgICAgICAgLy8gU2tpcCBhbHBoYSBjaGFubmVsIGZvciBUWVBFX0lOVF9SR0IgaW1hZ2VzCiAgICAgICAgIGlmIChzbG93RmlsdGVyKHNyYy5nZXRSYXN0ZXIoKSwgZHN0LmdldFJhc3RlcigpKSAhPSAwKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjFGPVVuYWJsZSB0byB0cmFuc2Zvcm0gc291cmNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uIChNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMUYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgLy8gVE9ETyAtIHVuY29tbWVudAotICAgICAgICAvL2lmIChpcHBGaWx0ZXIoc3JjLmdldFJhc3RlcigpLCBkc3QuZ2V0UmFzdGVyKCksIHNyYy5nZXRUeXBlKCkpICE9IDApCi0gICAgICAgICAgICAvL3Rocm93IG5ldyBJbWFnaW5nT3BFeGNlcHRpb24gKCJVbmFibGUgdG8gdHJhbnNmb3JtIHNvdXJjZSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdpbmdPcEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMUYiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIC8vIFRPRE8gLSB1bmNvbW1lbnQKKyAgICAgICAgICAgIC8vIGlmIChpcHBGaWx0ZXIoc3JjLmdldFJhc3RlcigpLCBkc3QuZ2V0UmFzdGVyKCksIHNyYy5nZXRUeXBlKCkpICE9CisgICAgICAgICAgICAvLyAwKQorICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEltYWdpbmdPcEV4Y2VwdGlvbiAoIlVuYWJsZSB0byB0cmFuc2Zvcm0gc291cmNlIik7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZmluYWxEc3QgIT0gbnVsbCkgewpAQCAtMzIwLDkgKzMxNiw5IEBACiAgICAgICAgIGlmIChzbG93RmlsdGVyKHNyYywgZHN0KSAhPSAwKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjFGPVVuYWJsZSB0byB0cmFuc2Zvcm0gc291cmNlCiAgICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxRiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAvLyBUT0RPIC0gdW5jb21tZW50Ci0gICAgICAgIC8vaWYgKGlwcEZpbHRlcihzcmMsIGRzdCwgQnVmZmVyZWRJbWFnZS5UWVBFX0NVU1RPTSkgIT0gMCkKLSAgICAgICAgLy8gICAgdGhyb3cgbmV3IEltYWdpbmdPcEV4Y2VwdGlvbigiVW5hYmxlIHRvIHRyYW5zZm9ybSBzb3VyY2UiKTsKKyAgICAgICAgICAgIC8vIFRPRE8gLSB1bmNvbW1lbnQKKyAgICAgICAgICAgIC8vIGlmIChpcHBGaWx0ZXIoc3JjLCBkc3QsIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9DVVNUT00pICE9IDApCisgICAgICAgICAgICAvLyB0aHJvdyBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uKCJVbmFibGUgdG8gdHJhbnNmb3JtIHNvdXJjZSIpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGRzdDsKQEAgLTMzMiwxMSArMzI4LDEzIEBACiAgICAgLyoqCiAgICAgICogSXBwIGZpbHRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBzcmMKLSAgICAgKiBAcGFyYW0gZHN0IHRoZSBkc3QKLSAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlIHRoZSBpbWFnZSB0eXBlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50CisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIHNyYy4KKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICB0aGUgZHN0LgorICAgICAqIEBwYXJhbSBpbWFnZVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0eXBlLgorICAgICAqIEByZXR1cm4gdGhlIGludC4KICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKICAgICBwcml2YXRlIGludCBpcHBGaWx0ZXIoUmFzdGVyIHNyYywgV3JpdGFibGVSYXN0ZXIgZHN0LCBpbnQgaW1hZ2VUeXBlKSB7CkBAIC0zNDksOCArMzQ3LDggQEAKICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0I6CiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQkdSOiB7CiAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSA0OwotICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpKjQ7Ci0gICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkqNDsKKyAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSBzcmMuZ2V0V2lkdGgoKSAqIDQ7CisgICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkgKiA0OwogICAgICAgICAgICAgICAgIHNraXBDaGFubmVsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTM2MCw4ICszNTgsOCBAQAogICAgICAgICAgICAgY2FzZSBCdWZmZXJlZEltYWdlLlRZUEVfNEJZVEVfQUJHUjoKICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFXzRCWVRFX0FCR1JfUFJFOiB7CiAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSA0OwotICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpKjQ7Ci0gICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkqNDsKKyAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSBzcmMuZ2V0V2lkdGgoKSAqIDQ7CisgICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkgKiA0OwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0zNzUsMTIgKzM3MywxMyBAQAogCiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV8zQllURV9CR1I6IHsKICAgICAgICAgICAgICAgICBjaGFubmVscyA9IDM7Ci0gICAgICAgICAgICAgICAgc3JjU3RyaWRlID0gc3JjLmdldFdpZHRoKCkqMzsKLSAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSBkc3QuZ2V0V2lkdGgoKSozOworICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpICogMzsKKyAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSBkc3QuZ2V0V2lkdGgoKSAqIDM7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFX1VTSE9SVF9HUkFZOiAvLyBUT0RPIC0gY291bGQgYmUgZG9uZSBpbiBuYXRpdmUgY29kZT8KKyAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFX1VTSE9SVF9HUkFZOiAvLyBUT0RPIC0gY291bGQgYmUgZG9uZSBpbgorICAgICAgICAgICAgICAgIC8vIG5hdGl2ZSBjb2RlPwogICAgICAgICAgICAgY2FzZSBCdWZmZXJlZEltYWdlLlRZUEVfVVNIT1JUXzU2NV9SR0I6CiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9VU0hPUlRfNTU1X1JHQjoKICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFX0JZVEVfQklOQVJZOiB7CkBAIC0zOTEsMzQgKzM5MCwyOSBAQAogICAgICAgICAgICAgICAgIFNhbXBsZU1vZGVsIHNyY1NNID0gc3JjLmdldFNhbXBsZU1vZGVsKCk7CiAgICAgICAgICAgICAgICAgU2FtcGxlTW9kZWwgZHN0U00gPSBkc3QuZ2V0U2FtcGxlTW9kZWwoKTsKIAotICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NNIGluc3RhbmNlb2YgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RTTSBpbnN0YW5jZW9mIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbAotICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIGlmIChzcmNTTSBpbnN0YW5jZW9mIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZHN0U00gaW5zdGFuY2VvZiBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsCi0gICAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTTS5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U00uZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURQotICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyY1NNLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkc3RTTS5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2xvd0ZpbHRlcihzcmMsIGRzdCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9IHNyY1NNLmdldE51bUJhbmRzKCk7IC8vIEhhdmUgSVBQIGZ1bmN0aW9ucyBmb3IgMSwgMyBhbmQgNCBjaGFubmVscworICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9IHNyY1NNLmdldE51bUJhbmRzKCk7IC8vIEhhdmUgSVBQIGZ1bmN0aW9ucyBmb3IgMSwKKyAgICAgICAgICAgICAgICAgICAgLy8gMyBhbmQgNCBjaGFubmVscwogICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbHMgIT0gMSAmJiBjaGFubmVscyAhPSAzICYmIGNoYW5uZWxzICE9IDQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzbG93RmlsdGVyKHNyYywgZHN0KTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGludCBkYXRhVHlwZVNpemUgPSBEYXRhQnVmZmVyLmdldERhdGFUeXBlU2l6ZShzcmNTTS5nZXREYXRhVHlwZSgpKSAvIDg7CiAKLSAgICAgICAgICAgICAgICAgICAgc3JjU3RyaWRlID0gKChDb21wb25lbnRTYW1wbGVNb2RlbCkgc3JjU00pLmdldFNjYW5saW5lU3RyaWRlKCkgKiBkYXRhVHlwZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGRzdFN0cmlkZSA9ICgoQ29tcG9uZW50U2FtcGxlTW9kZWwpIGRzdFNNKS5nZXRTY2FubGluZVN0cmlkZSgpICogZGF0YVR5cGVTaXplOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoCi0gICAgICAgICAgICAgICAgICAgICAgICBzcmNTTSBpbnN0YW5jZW9mIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFNNIGluc3RhbmNlb2YgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbAotICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSAoKENvbXBvbmVudFNhbXBsZU1vZGVsKXNyY1NNKS5nZXRTY2FubGluZVN0cmlkZSgpICogZGF0YVR5cGVTaXplOworICAgICAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSAoKENvbXBvbmVudFNhbXBsZU1vZGVsKWRzdFNNKS5nZXRTY2FubGluZVN0cmlkZSgpICogZGF0YVR5cGVTaXplOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjU00gaW5zdGFuY2VvZiBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBkc3RTTSBpbnN0YW5jZW9mIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbAotICAgICAgICAgICAgICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNwcHNtMSA9IChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKSBzcmNTTTsKLSAgICAgICAgICAgICAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBzcHBzbTIgPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkgZHN0U007CisgICAgICAgICAgICAgICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgc3Bwc20xID0gKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpc3JjU007CisgICAgICAgICAgICAgICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgc3Bwc20yID0gKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpZHN0U007CiAKICAgICAgICAgICAgICAgICAgICAgLy8gTm8gSVBQIGZ1bmN0aW9uIGZvciB0aGlzIHR5cGUKICAgICAgICAgICAgICAgICAgICAgaWYgKHNwcHNtMS5nZXREYXRhVHlwZSgpID09IERhdGFCdWZmZXIuVFlQRV9VU0hPUlQpIHsKQEAgLTQzMiwxNSArNDI2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBjb21wYXRpYmlsaXR5IG9mIHNhbXBsZSBtb2RlbHMKLSAgICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcHNtMS5nZXREYXRhVHlwZSgpICE9IHNwcHNtMi5nZXREYXRhVHlwZSgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIUFycmF5cy5lcXVhbHMoc3Bwc20xLmdldEJpdE9mZnNldHMoKSwgc3Bwc20yLmdldEJpdE9mZnNldHMoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhQXJyYXlzLmVxdWFscyhzcHBzbTEuZ2V0Qml0TWFza3MoKSwgc3Bwc20yLmdldEJpdE1hc2tzKCkpCi0gICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3Bwc20xLmdldERhdGFUeXBlKCkgIT0gc3Bwc20yLmdldERhdGFUeXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhQXJyYXlzLmVxdWFscyhzcHBzbTEuZ2V0Qml0T2Zmc2V0cygpLCBzcHBzbTIuZ2V0Qml0T2Zmc2V0cygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRNYXNrcygpLCBzcHBzbTIuZ2V0Qml0TWFza3MoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzbG93RmlsdGVyKHNyYywgZHN0KTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwcHNtMS5nZXRTYW1wbGVTaXplKGkpICE9IDgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2xvd0ZpbHRlcihzcmMsIGRzdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC00NjAsMTIgKzQ1Miw5IEBACiAKICAgICAgICAgICAgICAgICAvLyBGaWxsIG9mZnNldHMgaWYgdGhlcmUncyBhIGNoaWxkIHJhc3RlcgogICAgICAgICAgICAgICAgIGlmIChzcmMuZ2V0UGFyZW50KCkgIT0gbnVsbCB8fCBkc3QuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpICE9IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgIT0gMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSAhPSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpICE9IDAKLSAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgIT0gMCB8fCBzcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgIT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRzdC5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZHN0LmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHMgPSBuZXcgaW50WzRdOwogICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0c1swXSA9IC1zcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgKyBzcmMuZ2V0TWluWCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0c1sxXSA9IC1zcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgKyBzcmMuZ2V0TWluWSgpOwpAQCAtNDkyLDIwICs0ODEsMTkgQEAKICAgICAgICAgICAgIHJldHVybiAtMTsgLy8gVW5rbm93biBkYXRhIGJ1ZmZlciB0eXBlCiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gaXBwQWZmaW5lVHJhbnNmb3JtKAotICAgICAgICAgICAgbTAwLCBtMDEsIG0wMiwgbTEwLCBtMTEsIG0xMiwKLSAgICAgICAgICAgIHNyY0RhdGEsIHNyYy5nZXRXaWR0aCgpLCBzcmMuZ2V0SGVpZ2h0KCksIHNyY1N0cmlkZSwKLSAgICAgICAgICAgIGRzdERhdGEsIGRzdC5nZXRXaWR0aCgpLCBkc3QuZ2V0SGVpZ2h0KCksIGRzdFN0cmlkZSwKLSAgICAgICAgICAgIGlUeXBlLCBjaGFubmVscywgc2tpcENoYW5uZWwsIG9mZnNldHMpOworICAgICAgICByZXR1cm4gaXBwQWZmaW5lVHJhbnNmb3JtKG0wMCwgbTAxLCBtMDIsIG0xMCwgbTExLCBtMTIsIHNyY0RhdGEsIHNyYy5nZXRXaWR0aCgpLCBzcmMKKyAgICAgICAgICAgICAgICAuZ2V0SGVpZ2h0KCksIHNyY1N0cmlkZSwgZHN0RGF0YSwgZHN0LmdldFdpZHRoKCksIGRzdC5nZXRIZWlnaHQoKSwgZHN0U3RyaWRlLAorICAgICAgICAgICAgICAgIGlUeXBlLCBjaGFubmVscywgc2tpcENoYW5uZWwsIG9mZnNldHMpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFNsb3cgZmlsdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIHNyYwotICAgICAqIEBwYXJhbSBkc3QgdGhlIGRzdAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludAorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIGRzdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgc2xvd0ZpbHRlcihSYXN0ZXIgc3JjLCBXcml0YWJsZVJhc3RlciBkc3QpIHsKICAgICAgICAgLy8gVE9ETzogbWFrZSBjb3JyZWN0IGludGVycG9sYXRpb24KQEAgLTUxOCw3ICs1MDYsNyBAQAogCiAgICAgICAgIEFmZmluZVRyYW5zZm9ybSBpbnYgPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgIGludiA9IGF0LmNyZWF0ZUludmVyc2UoKTsKKyAgICAgICAgICAgIGludiA9IGF0LmNyZWF0ZUludmVyc2UoKTsKICAgICAgICAgfSBjYXRjaCAoTm9uaW52ZXJ0aWJsZVRyYW5zZm9ybUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KQEAgLTU1Miw3ICs1NDAsNyBAQAogICAgICAgICAgICAgICAgICAgICBpbnQgcHggPSBzeCA+PiA4OwogICAgICAgICAgICAgICAgICAgICBpbnQgcHkgPSBzeSA+PiA4OwogICAgICAgICAgICAgICAgICAgICBpZiAocHggPj0gbWluU3JjWCAmJiBweSA+PSBtaW5TcmNZICYmIHB4IDwgbWF4U3JjWCAmJiBweSA8IG1heFNyY1kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWwgPSBzcmMuZ2V0RGF0YUVsZW1lbnRzKHB4ICwgcHkgLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWwgPSBzcmMuZ2V0RGF0YUVsZW1lbnRzKHB4LCBweSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBkc3Quc2V0RGF0YUVsZW1lbnRzKHgsIHksIHZhbCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc3ggKz0gaHg7CkBAIC01ODUsMzMgKzU3Myw0NiBAQAogICAgIC8qKgogICAgICAqIElwcCBhZmZpbmUgdHJhbnNmb3JtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBtMDAgdGhlIG0wMAotICAgICAqIEBwYXJhbSBtMDEgdGhlIG0wMQotICAgICAqIEBwYXJhbSBtMDIgdGhlIG0wMgotICAgICAqIEBwYXJhbSBtMTAgdGhlIG0xMAotICAgICAqIEBwYXJhbSBtMTEgdGhlIG0xMQotICAgICAqIEBwYXJhbSBtMTIgdGhlIG0xMgotICAgICAqIEBwYXJhbSBzcmMgdGhlIHNyYwotICAgICAqIEBwYXJhbSBzcmNXaWR0aCB0aGUgc3JjIHdpZHRoCi0gICAgICogQHBhcmFtIHNyY0hlaWdodCB0aGUgc3JjIGhlaWdodAotICAgICAqIEBwYXJhbSBzcmNTdHJpZGUgdGhlIHNyYyBzdHJpZGUKLSAgICAgKiBAcGFyYW0gZHN0IHRoZSBkc3QKLSAgICAgKiBAcGFyYW0gZHN0V2lkdGggdGhlIGRzdCB3aWR0aAotICAgICAqIEBwYXJhbSBkc3RIZWlnaHQgdGhlIGRzdCBoZWlnaHQKLSAgICAgKiBAcGFyYW0gZHN0U3RyaWRlIHRoZSBkc3Qgc3RyaWRlCi0gICAgICogQHBhcmFtIGlUeXBlIHRoZSBpIHR5cGUKLSAgICAgKiBAcGFyYW0gY2hhbm5lbHMgdGhlIGNoYW5uZWxzCi0gICAgICogQHBhcmFtIHNraXBDaGFubmVsIHRoZSBza2lwIGNoYW5uZWwKLSAgICAgKiBAcGFyYW0gb2Zmc2V0cyB0aGUgb2Zmc2V0cwotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludAorICAgICAqIEBwYXJhbSBtMDAKKyAgICAgKiAgICAgICAgICAgIHRoZSBtMDAuCisgICAgICogQHBhcmFtIG0wMQorICAgICAqICAgICAgICAgICAgdGhlIG0wMS4KKyAgICAgKiBAcGFyYW0gbTAyCisgICAgICogICAgICAgICAgICB0aGUgbTAyLgorICAgICAqIEBwYXJhbSBtMTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBtMTAuCisgICAgICogQHBhcmFtIG0xMQorICAgICAqICAgICAgICAgICAgdGhlIG0xMS4KKyAgICAgKiBAcGFyYW0gbTEyCisgICAgICogICAgICAgICAgICB0aGUgbTEyLgorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMuCisgICAgICogQHBhcmFtIHNyY1dpZHRoCisgICAgICogICAgICAgICAgICB0aGUgc3JjIHdpZHRoLgorICAgICAqIEBwYXJhbSBzcmNIZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMgaGVpZ2h0LgorICAgICAqIEBwYXJhbSBzcmNTdHJpZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMgc3RyaWRlLgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3QuCisgICAgICogQHBhcmFtIGRzdFdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgZHN0IHdpZHRoLgorICAgICAqIEBwYXJhbSBkc3RIZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3QgaGVpZ2h0LgorICAgICAqIEBwYXJhbSBkc3RTdHJpZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3Qgc3RyaWRlLgorICAgICAqIEBwYXJhbSBpVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGkgdHlwZS4KKyAgICAgKiBAcGFyYW0gY2hhbm5lbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFubmVscy4KKyAgICAgKiBAcGFyYW0gc2tpcENoYW5uZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBza2lwIGNoYW5uZWwuCisgICAgICogQHBhcmFtIG9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXRzLgorICAgICAqIEByZXR1cm4gdGhlIGludC4KICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSBpbnQgaXBwQWZmaW5lVHJhbnNmb3JtKAotICAgICAgICAgICAgZG91YmxlIG0wMCwgZG91YmxlIG0wMSwKLSAgICAgICAgICAgIGRvdWJsZSBtMDIsIGRvdWJsZSBtMTAsCi0gICAgICAgICAgICBkb3VibGUgbTExLCBkb3VibGUgbTEyLAotICAgICAgICAgICAgT2JqZWN0IHNyYywgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LCBpbnQgc3JjU3RyaWRlLAotICAgICAgICAgICAgT2JqZWN0IGRzdCwgaW50IGRzdFdpZHRoLCBpbnQgZHN0SGVpZ2h0LCBpbnQgZHN0U3RyaWRlLAotICAgICAgICAgICAgaW50IGlUeXBlLCBpbnQgY2hhbm5lbHMsIGJvb2xlYW4gc2tpcENoYW5uZWwsCi0gICAgICAgICAgICBpbnQgb2Zmc2V0c1tdKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgaXBwQWZmaW5lVHJhbnNmb3JtKGRvdWJsZSBtMDAsIGRvdWJsZSBtMDEsIGRvdWJsZSBtMDIsIGRvdWJsZSBtMTAsCisgICAgICAgICAgICBkb3VibGUgbTExLCBkb3VibGUgbTEyLCBPYmplY3Qgc3JjLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsIGludCBzcmNTdHJpZGUsCisgICAgICAgICAgICBPYmplY3QgZHN0LCBpbnQgZHN0V2lkdGgsIGludCBkc3RIZWlnaHQsIGludCBkc3RTdHJpZGUsIGludCBpVHlwZSwgaW50IGNoYW5uZWxzLAorICAgICAgICAgICAgYm9vbGVhbiBza2lwQ2hhbm5lbCwgaW50IG9mZnNldHNbXSk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0FyZWFBdmVyYWdpbmdTY2FsZUZpbHRlci5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0FyZWFBdmVyYWdpbmdTY2FsZUZpbHRlci5qYXZhCmluZGV4IGY0OTMzZGIuLjdmYjEzOGUgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9BcmVhQXZlcmFnaW5nU2NhbGVGaWx0ZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQXJlYUF2ZXJhZ2luZ1NjYWxlRmlsdGVyLmphdmEKQEAgLTE4LDcyICsxOCwxMDEgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAotCiAvKioKLSAqIFRoZSBBcmVhQXZlcmFnaW5nU2NhbGVGaWx0ZXIgY2xhc3Mgc2NhbGVzIHRoZSBzb3VyY2UgaW1hZ2UgdXNpbmcKLSAqIGFyZWEgYXZlcmFnaW5nIGFsZ29yaXRobS4gVGhpcyBhbGdvcml0aG0gcHJvdmlkZXMgYSBzb3VyY2UgaW1hZ2UKLSAqIHdpdGggYSBuZXcgaW1hZ2UgY29udGFpbmluZyB0aGUgcmVzYW1wbGVkIGltYWdlLiAKKyAqIFRoZSBBcmVhQXZlcmFnaW5nU2NhbGVGaWx0ZXIgY2xhc3Mgc2NhbGVzIHRoZSBzb3VyY2UgaW1hZ2UgdXNpbmcgYXJlYQorICogYXZlcmFnaW5nIGFsZ29yaXRobS4gVGhpcyBhbGdvcml0aG0gcHJvdmlkZXMgYSBzb3VyY2UgaW1hZ2Ugd2l0aCBhIG5ldyBpbWFnZQorICogY29udGFpbmluZyB0aGUgcmVzYW1wbGVkIGltYWdlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEFyZWFBdmVyYWdpbmdTY2FsZUZpbHRlciBleHRlbmRzIFJlcGxpY2F0ZVNjYWxlRmlsdGVyIHsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgcmdiQ00uICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHJnYkNNLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yTW9kZWwgcmdiQ00gPSBDb2xvck1vZGVsLmdldFJHQmRlZmF1bHQoKTsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IGF2ZXJhZ2luZ0ZsYWdzLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBhdmVyYWdpbmdGbGFncyA9IChJbWFnZUNvbnN1bWVyLlRPUERPV05MRUZUUklHSFQgfAotICAgICAgICAgICAgSW1hZ2VDb25zdW1lci5DT01QTEVURVNDQU5MSU5FUyk7CiAKLSAgICAvKiogVGhlIHJlc2V0LiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiByZXNldCA9IHRydWU7ICAgLy8gRmxhZyBmb3IgdXNlZCBzdXBlcmNsYXNzIGZpbHRlcgotICAgIAotICAgIC8qKiBUaGUgaW5pdGVkLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBhdmVyYWdpbmdGbGFncy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgYXZlcmFnaW5nRmxhZ3MgPSAoSW1hZ2VDb25zdW1lci5UT1BET1dOTEVGVFJJR0hUIHwgSW1hZ2VDb25zdW1lci5DT01QTEVURVNDQU5MSU5FUyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlc2V0ID0gdHJ1ZTsgLy8gRmxhZyBmb3IgdXNlZCBzdXBlcmNsYXNzIGZpbHRlcgorCisgICAgLyoqCisgICAgICogVGhlIGluaXRlZC4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gaW5pdGVkID0gZmFsc2U7IC8vIEFsbCBkYXRhIGluaXRlZAogCi0gICAgLyoqIFRoZSBzdW1fci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgc3VtX3IuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgc3VtX3JbXTsgLy8gQXJyYXkgZm9yIGF2ZXJhZ2UgUmVkIHNhbXBsZXMKLSAgICAKLSAgICAvKiogVGhlIHN1bV9nLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHN1bV9nLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IHN1bV9nW107IC8vIEFycmF5IGZvciBhdmVyYWdlIEdyZWVuIHNhbXBsZXMKLSAgICAKLSAgICAvKiogVGhlIHN1bV9iLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHN1bV9iLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IHN1bV9iW107IC8vIEFycmF5IGZvciBhdmVyYWdlIEJsdWUgc2FtcGxlcwotICAgIAotICAgIC8qKiBUaGUgc3VtX2EuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3VtX2EuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgc3VtX2FbXTsgLy8gQXJyYXkgZm9yIGF2ZXJhZ2UgQWxwaGEgc2FtcGxlcwogCi0gICAgLyoqIFRoZSBidWZmLiAqLwotICAgIHByaXZhdGUgaW50IGJ1ZmZbXTsgIC8vIFN0cmlkZSBidWZmZXIKLSAgICAKLSAgICAvKiogVGhlIGF2ZyBmYWN0b3IuICovCi0gICAgcHJpdmF0ZSBpbnQgYXZnRmFjdG9yOyAgLy8gR2xvYmFsIGF2ZXJhZ2luZyBmYWN0b3IKLQotICAgIC8qKiBUaGUgY2FjaGVkIGR5LiAqLwotICAgIHByaXZhdGUgaW50IGNhY2hlZERZOyAgICAgIC8vIENhY2hlZCBudW1iZXIgb2YgdGhlIGRlc3RpbmF0aW9uIHNjYW5saW5lIAotICAgIAotICAgIC8qKiBUaGUgY2FjaGVkIGR2IHJlc3QuICovCi0gICAgcHJpdmF0ZSBpbnQgY2FjaGVkRFZSZXN0OyAgLy8gQ2FjaGVkIHZhbHVlIG9mIHJlc3Qgc3JjIHNjYW5saW5lcyBmb3Igc3VtIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpeGVsIHNhbXBsZXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmVjYXVzZSBkYXRhIGlmIHRyYW5zZmVyaW5nIGJ5IHdob2xlIHNjYW5saW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBjYWNoaW5nIG9ubHkgWSBjb29yZGluYXRlIHZhbHVlcwotICAgIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBcmVhQXZlcmFnaW5nU2NhbGVGaWx0ZXIgb2JqZWN0IHdoaWNoIHNjYWxlcwotICAgICAqIGEgc291cmNlIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LgorICAgICAqIFRoZSBidWZmLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGJ1ZmZbXTsgLy8gU3RyaWRlIGJ1ZmZlcgorCisgICAgLyoqCisgICAgICogVGhlIGF2ZyBmYWN0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgYXZnRmFjdG9yOyAvLyBHbG9iYWwgYXZlcmFnaW5nIGZhY3RvcgorCisgICAgLyoqCisgICAgICogVGhlIGNhY2hlZCBkeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBjYWNoZWREWTsgLy8gQ2FjaGVkIG51bWJlciBvZiB0aGUgZGVzdGluYXRpb24gc2NhbmxpbmUKKworICAgIC8qKgorICAgICAqIFRoZSBjYWNoZWQgZHYgcmVzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBjYWNoZWREVlJlc3Q7IC8vIENhY2hlZCB2YWx1ZSBvZiByZXN0IHNyYyBzY2FubGluZXMgZm9yIHN1bQorCisgICAgLy8gcGl4ZWwgc2FtcGxlcworICAgIC8vIEJlY2F1c2UgZGF0YSBpZiB0cmFuc2ZlcnJpbmcgYnkgd2hvbGUgc2NhbmxpbmVzCisgICAgLy8gd2UgYXJlIGNhY2hpbmcgb25seSBZIGNvb3JkaW5hdGUgdmFsdWVzCisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQXJlYUF2ZXJhZ2luZ1NjYWxlRmlsdGVyIG9iamVjdCB3aGljaCBzY2FsZXMgYSBzb3VyY2UKKyAgICAgKiBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgd2lkdGggYW5kIGhlaWdodC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHNjYWxlZCB3aWR0aCBvZiB0aGUgaW1hZ2UuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgc2NhbGVkIGhlaWdodCBvZiB0aGUgaW1hZ2UuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgc2NhbGVkIHdpZHRoIG9mIHRoZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgc2NhbGVkIGhlaWdodCBvZiB0aGUgaW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIEFyZWFBdmVyYWdpbmdTY2FsZUZpbHRlcihpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgICAgICAgc3VwZXIod2lkdGgsIGhlaWdodCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBDb2xvck1vZGVsIG1vZGVsLCBpbnRbXSBwaXhlbHMsIGludCBvZmYsIGludCBzY2Fuc2l6ZSkgewotICAgICAgICBpZihyZXNldCkgeworICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBtb2RlbCwgaW50W10gcGl4ZWxzLCBpbnQgb2ZmLAorICAgICAgICAgICAgaW50IHNjYW5zaXplKSB7CisgICAgICAgIGlmIChyZXNldCkgewogICAgICAgICAgICAgc3VwZXIuc2V0UGl4ZWxzKHgsIHksIHcsIGgsIG1vZGVsLCBwaXhlbHMsIG9mZiwgc2NhbnNpemUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2V0RmlsdGVyZWRQaXhlbHMoeCwgeSwgdywgaCwgbW9kZWwsIHBpeGVscywgb2ZmLCBzY2Fuc2l6ZSk7CkBAIC05MSw4ICsxMjAsOSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBtb2RlbCwgYnl0ZVtdIHBpeGVscywgaW50IG9mZiwgaW50IHNjYW5zaXplKSB7Ci0gICAgICAgIGlmKHJlc2V0KSB7CisgICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBDb2xvck1vZGVsIG1vZGVsLCBieXRlW10gcGl4ZWxzLCBpbnQgb2ZmLAorICAgICAgICAgICAgaW50IHNjYW5zaXplKSB7CisgICAgICAgIGlmIChyZXNldCkgewogICAgICAgICAgICAgc3VwZXIuc2V0UGl4ZWxzKHgsIHksIHcsIGgsIG1vZGVsLCBwaXhlbHMsIG9mZiwgc2NhbnNpemUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2V0RmlsdGVyZWRQaXhlbHMoeCwgeSwgdywgaCwgbW9kZWwsIHBpeGVscywgb2ZmLCBzY2Fuc2l6ZSk7CkBAIC0xMDYsMzcgKzEzNiw0NCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGltcGxlbWVudHMgdGhlIEFyZWEgQXZlcmFnaW5nIFNjYWxlIGZpbHRlci4KLSAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgYWxnb3JpdGhtIGlzIHByZXNlbnRlZCBpbiBKYXZhIEFQSSBTcGVjaWZpY2F0aW9uLgorICAgICAqIFRoaXMgbWV0aG9kIGltcGxlbWVudHMgdGhlIEFyZWEgQXZlcmFnaW5nIFNjYWxlIGZpbHRlci4gVGhlIGRlc2NyaXB0aW9uCisgICAgICogb2YgYWxnb3JpdGhtIGlzIHByZXNlbnRlZCBpbiBKYXZhIEFQSSBTcGVjaWZpY2F0aW9uLiBBcnJheXMgc3VtX3IsIHN1bV9nLAorICAgICAqIHN1bV9iLCBzdW1fYSBoYXZlIGxlbmd0aCBlcXVhbHMgd2lkdGggb2YgZGVzdGluYXRpb24gaW1hZ2UuIEluIGVhY2gKKyAgICAgKiBhcnJheSdzIGVsZW1lbnQgaXMgYWNjdW11bGF0aW5nIHBpeGVsJ3MgY29tcG9uZW50IHZhbHVlcywgcHJvcG9ydGlvbmFsIHRvCisgICAgICogdGhlIGFyZWEgd2hpY2ggc291cmNlIHBpeGVscyB3aWxsIG9jY3VweSBpbiBkZXN0aW5hdGlvbiBpbWFnZS4gVGhlbiB0aGF0CisgICAgICogdmFsdWVzIHdpbGwgZGl2aWRlIGJ5IEdsb2JhbCBhdmVyYWdpbmcgZmFjdG9yIChhcmVhIG9mIHRoZSBkZXN0aW5hdGlvbgorICAgICAqIGltYWdlKSBmb3IgcmVjZWl2aW5nIGF2ZXJhZ2UgdmFsdWVzIG9mIGRlc3RpbmF0aW9uIHBpeGVscy4KICAgICAgKiAKLSAgICAgKiBBcnJheXMgc3VtX3IsIHN1bV9nLCBzdW1fYiwgc3VtX2EgaGF2ZSBsZW5ndGggZXF1YWxzIHdpZHRoIG9mIGRlc3RpbmF0aW9uCi0gICAgICogaW1hZ2UuIEluIGVhY2ggYXJyYXkncyBlbGVtZW50IGlzIGFjY3VtdWxhdGluZyBwaXhlbCdzIGNvbXBvbmVudCB2YWx1ZXMsCi0gICAgICogcHJvcG9ydGlvbmFsIHRvIHRoZSBhcmVhIHdoaWNoIHNvdXJjZSBwaXhlbHMgd2lsbCBvY2N1cHkgaW4gZGVzdGluYXRpb24KLSAgICAgKiBpbWFnZS4gVGhlbiB0aGF0IHZhbHVlcyB3aWxsIGRpdmlkZSBieSBHbG9iYWwgYXZlcmFnaW5nCi0gICAgICogZmFjdG9yIChhcmVhIG9mIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSkgZm9yIHJlY2VpdmluZwotICAgICAqIGF2ZXJhZ2UgdmFsdWVzIG9mIGRlc3RpbmF0aW9uIHBpeGVscy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0geCAtIFNyYyBwaXhlbHMgWCBjb29yZGluYXRlCi0gICAgICogQHBhcmFtIHkgLSBTcmMgcGl4ZWxzIFkgY29vcmRpbmF0ZQotICAgICAqIEBwYXJhbSB3IC0gd2lkdGggb2YgdGhlIGFyZWEgb2YgU3JjIHBpeGVscwotICAgICAqIEBwYXJhbSBoIC0gaGVpZ2h0IG9mIHRoZSBhcmVhIG9mIFNyYyBwaXhlbHMKLSAgICAgKiBAcGFyYW0gbW9kZWwgLSBDb2xvciBNb2RlbCBvZiBTcmMgcGl4ZWxzCi0gICAgICogQHBhcmFtIHBpeGVscyAtIGFycmF5IG9mIFNyYyBwaXhlbHMKLSAgICAgKiBAcGFyYW0gb2ZmIC0gb2Zmc2V0IGludG8gdGhlIFNyYyBwaXhlbHMgYXJyYXkKLSAgICAgKiBAcGFyYW0gc2NhbnNpemUgLSBsZW5ndGggb2Ygc2NhbmxpbmUgaW4gdGhlIHBpeGVscyBhcnJheQorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIHBpeGVscyBYIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgcGl4ZWxzIFkgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBhcmVhIG9mIHRoZSBzb3VyY2UgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBhcmVhIG9mIHRoZSBzb3VyY2UgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBtb2RlbAorICAgICAqICAgICAgICAgICAgdGhlIGNvbG9yIG1vZGVsIG9mIHRoZSBzb3VyY2UgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBwaXhlbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBzb3VyY2UgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW50byB0aGUgc291cmNlIHBpeGVscyBhcnJheS4KKyAgICAgKiBAcGFyYW0gc2NhbnNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2Ygc2NhbmxpbmUgaW4gdGhlIHBpeGVscyBhcnJheS4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0RmlsdGVyZWRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgbW9kZWwsIE9iamVjdCBwaXhlbHMsIGludCBvZmYsIGludCBzY2Fuc2l6ZSl7Ci0gICAgICAgIGlmKCFpbml0ZWQpeworICAgIHByaXZhdGUgdm9pZCBzZXRGaWx0ZXJlZFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBtb2RlbCwgT2JqZWN0IHBpeGVscywKKyAgICAgICAgICAgIGludCBvZmYsIGludCBzY2Fuc2l6ZSkgeworICAgICAgICBpZiAoIWluaXRlZCkgewogICAgICAgICAgICAgaW5pdGlhbGl6ZSgpOwogICAgICAgICB9CiAKICAgICAgICAgaW50IHNyY1gsIHNyY1ksIGR4LCBkeTsKICAgICAgICAgaW50IHN2UmVzdCwgZHZSZXN0LCBzaFJlc3QsIGRoUmVzdCwgdkRpZiwgaERpZjsKIAotICAgICAgICBpZih5ID09IDApeworICAgICAgICBpZiAoeSA9PSAwKSB7CiAgICAgICAgICAgICBkeSA9IDA7CiAgICAgICAgICAgICBkdlJlc3QgPSBzcmNIZWlnaHQ7Ci0gICAgICAgIH1lbHNleworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZHkgPSBjYWNoZWREWTsKICAgICAgICAgICAgIGR2UmVzdCA9IGNhY2hlZERWUmVzdDsKICAgICAgICAgfQpAQCAtMTY2LDkgKzIwMyw5IEBACiAKICAgICAgICAgICAgICAgICBpbnQgcmdiLCBwaXg7CiAgICAgICAgICAgICAgICAgaWYgKHBpeGVscyBpbnN0YW5jZW9mIGludFtdKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBpeCA9ICgoaW50W10pIHBpeGVscylbc3JjT2ZmICsgc3JjWF07CisgICAgICAgICAgICAgICAgICAgIHBpeCA9ICgoaW50W10pcGl4ZWxzKVtzcmNPZmYgKyBzcmNYXTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwaXggPSAoKGJ5dGVbXSkgcGl4ZWxzKVtzcmNPZmYgKyBzcmNYXSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgICAgIHBpeCA9ICgoYnl0ZVtdKXBpeGVscylbc3JjT2ZmICsgc3JjWF0gJiAweGZmOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHJnYiA9IG1vZGVsLmdldFJHQihwaXgpOwpAQCAtMjA4LDcgKzI0NSw3IEBACiAKICAgICAgICAgICAgIGlmIChkdlJlc3QgPT0gMCkgewogICAgICAgICAgICAgICAgIC8vIGF2ZXJhZ2luZyBkZXN0aW5hdGlvbiBwaXhlbCdzIHZhbHVlcwotICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBkZXN0V2lkdGg7IGkrKyl7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXN0V2lkdGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBpbnQgYSA9IChzdW1fYVtpXSAvIGF2Z0ZhY3RvcikgJiAweGZmOwogICAgICAgICAgICAgICAgICAgICBpbnQgciA9IChzdW1fcltpXSAvIGF2Z0ZhY3RvcikgJiAweGZmOwogICAgICAgICAgICAgICAgICAgICBpbnQgZyA9IChzdW1fZ1tpXSAvIGF2Z0ZhY3RvcikgJiAweGZmOwpAQCAtMjE2LDggKzI1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIGludCBmcmdiID0gKGEgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOwogICAgICAgICAgICAgICAgICAgICBidWZmW2ldID0gZnJnYjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29uc3VtZXIuc2V0UGl4ZWxzKDAsIGR5LCBkZXN0V2lkdGgsIDEsIHJnYkNNLCBidWZmLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFdpZHRoKTsKKyAgICAgICAgICAgICAgICBjb25zdW1lci5zZXRQaXhlbHMoMCwgZHksIGRlc3RXaWR0aCwgMSwgcmdiQ00sIGJ1ZmYsIDAsIGRlc3RXaWR0aCk7CiAgICAgICAgICAgICAgICAgZHkrKzsKICAgICAgICAgICAgICAgICBkdlJlc3QgPSBzcmNIZWlnaHQ7CiAgICAgICAgICAgICAgICAgQXJyYXlzLmZpbGwoc3VtX2EsIDApOwpAQCAtMjM2LDE4ICsyNzIsMTcgQEAKICAgICAvKioKICAgICAgKiBJbml0aWFsaXphdGlvbiBvZiB0aGUgYXV4aWxpYXJ5IGRhdGEuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKXsKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKIAotICAgICAgICBzdW1fYSA9IG5ldyBpbnRbZGVzdFdpZHRoXTsgCi0gICAgICAgIHN1bV9yID0gbmV3IGludFtkZXN0V2lkdGhdOyAKLSAgICAgICAgc3VtX2cgPSBuZXcgaW50W2Rlc3RXaWR0aF07IAotICAgICAgICBzdW1fYiA9IG5ldyBpbnRbZGVzdFdpZHRoXTsgCisgICAgICAgIHN1bV9hID0gbmV3IGludFtkZXN0V2lkdGhdOworICAgICAgICBzdW1fciA9IG5ldyBpbnRbZGVzdFdpZHRoXTsKKyAgICAgICAgc3VtX2cgPSBuZXcgaW50W2Rlc3RXaWR0aF07CisgICAgICAgIHN1bV9iID0gbmV3IGludFtkZXN0V2lkdGhdOwogCi0gICAgICAgIGJ1ZmYgPSBuZXcgaW50W2Rlc3RXaWR0aF07ICAKKyAgICAgICAgYnVmZiA9IG5ldyBpbnRbZGVzdFdpZHRoXTsKICAgICAgICAgb3V0cGl4YnVmID0gYnVmZjsKLSAgICAgICAgYXZnRmFjdG9yID0gc3JjV2lkdGggKiBzcmNIZWlnaHQ7IAorICAgICAgICBhdmdGYWN0b3IgPSBzcmNXaWR0aCAqIHNyY0hlaWdodDsKIAogICAgICAgICBpbml0ZWQgPSB0cnVlOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0F3dEltYWdlQmFja2Rvb3JBY2Nlc3NvckltcGwuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9Bd3RJbWFnZUJhY2tkb29yQWNjZXNzb3JJbXBsLmphdmEKaW5kZXggY2U4NWRkZC4uNmRmZmVlOCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0F3dEltYWdlQmFja2Rvb3JBY2Nlc3NvckltcGwuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQXd0SW1hZ2VCYWNrZG9vckFjY2Vzc29ySW1wbC5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiAgKiBDcmVhdGVkIG9uIDIzLjExLjIwMDUKICAqCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEuYXd0LkltYWdlOwpAQCAtNDAsNDEgKzQxLDQzIEBACiAvKioKICAqIFRoaXMgY2xhc3Mgbm90IHBhcnQgb2YgcHVibGljIEFQSS4gSXQgdXNlZnVsIGZvciByZWNlaXZpbmcgcGFja2FnZSBwcml2YXRlCiAgKiBkYXRhIGZyb20gb3RoZXIgcGFja2FnZXMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBjbGFzcyBBd3RJbWFnZUJhY2tkb29yQWNjZXNzb3JJbXBsIGV4dGVuZHMgQXd0SW1hZ2VCYWNrZG9vckFjY2Vzc29yIHsKIAotICAgIHN0YXRpYyB2b2lkIGluaXQoKXsKKyAgICBzdGF0aWMgdm9pZCBpbml0KCkgewogICAgICAgICBpbnN0ID0gbmV3IEF3dEltYWdlQmFja2Rvb3JBY2Nlc3NvckltcGwoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3VyZmFjZSBnZXRJbWFnZVN1cmZhY2UoSW1hZ2UgaW1hZ2UpIHsKLSAgICAgICAgaWYgKGltYWdlIGluc3RhbmNlb2YgQnVmZmVyZWRJbWFnZSl7CisgICAgICAgIGlmIChpbWFnZSBpbnN0YW5jZW9mIEJ1ZmZlcmVkSW1hZ2UpIHsKICAgICAgICAgICAgIHJldHVybiAoKEJ1ZmZlcmVkSW1hZ2UpaW1hZ2UpLmdldEltYWdlU3VyZmFjZSgpOwotICAgICAgICB9IGVsc2UgaWYgKGltYWdlIGluc3RhbmNlb2YgR0xWb2xhdGlsZUltYWdlKXsKKyAgICAgICAgfSBlbHNlIGlmIChpbWFnZSBpbnN0YW5jZW9mIEdMVm9sYXRpbGVJbWFnZSkgewogICAgICAgICAgICAgcmV0dXJuICgoR0xWb2xhdGlsZUltYWdlKWltYWdlKS5nZXRJbWFnZVN1cmZhY2UoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dyYXlQYWxsZXRlKEluZGV4Q29sb3JNb2RlbCBpY20peworICAgIHB1YmxpYyBib29sZWFuIGlzR3JheVBhbGxldGUoSW5kZXhDb2xvck1vZGVsIGljbSkgewogICAgICAgICByZXR1cm4gaWNtLmlzR3JheVBhbGxldGUoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGdldERhdGEoRGF0YUJ1ZmZlciBkYikgewotICAgICAgICBpZiAoZGIgaW5zdGFuY2VvZiBEYXRhQnVmZmVyQnl0ZSl7CisgICAgICAgIGlmIChkYiBpbnN0YW5jZW9mIERhdGFCdWZmZXJCeXRlKSB7CiAgICAgICAgICAgICByZXR1cm4gKChEYXRhQnVmZmVyQnl0ZSlkYikuZ2V0RGF0YSgpOwotICAgICAgICB9IGVsc2UgaWYgKGRiIGluc3RhbmNlb2YgRGF0YUJ1ZmZlclVTaG9ydCl7CisgICAgICAgIH0gZWxzZSBpZiAoZGIgaW5zdGFuY2VvZiBEYXRhQnVmZmVyVVNob3J0KSB7CiAgICAgICAgICAgICByZXR1cm4gKChEYXRhQnVmZmVyVVNob3J0KWRiKS5nZXREYXRhKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGIgaW5zdGFuY2VvZiBEYXRhQnVmZmVyU2hvcnQpeworICAgICAgICB9IGVsc2UgaWYgKGRiIGluc3RhbmNlb2YgRGF0YUJ1ZmZlclNob3J0KSB7CiAgICAgICAgICAgICByZXR1cm4gKChEYXRhQnVmZmVyU2hvcnQpZGIpLmdldERhdGEoKTsKLSAgICAgICAgfSBlbHNlIGlmIChkYiBpbnN0YW5jZW9mIERhdGFCdWZmZXJJbnQpeworICAgICAgICB9IGVsc2UgaWYgKGRiIGluc3RhbmNlb2YgRGF0YUJ1ZmZlckludCkgewogICAgICAgICAgICAgcmV0dXJuICgoRGF0YUJ1ZmZlckludClkYikuZ2V0RGF0YSgpOwotICAgICAgICB9IGVsc2UgaWYgKGRiIGluc3RhbmNlb2YgRGF0YUJ1ZmZlckZsb2F0KXsKKyAgICAgICAgfSBlbHNlIGlmIChkYiBpbnN0YW5jZW9mIERhdGFCdWZmZXJGbG9hdCkgewogICAgICAgICAgICAgcmV0dXJuICgoRGF0YUJ1ZmZlckZsb2F0KWRiKS5nZXREYXRhKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGIgaW5zdGFuY2VvZiBEYXRhQnVmZmVyRG91YmxlKXsKKyAgICAgICAgfSBlbHNlIGlmIChkYiBpbnN0YW5jZW9mIERhdGFCdWZmZXJEb3VibGUpIHsKICAgICAgICAgICAgIHJldHVybiAoKERhdGFCdWZmZXJEb3VibGUpZGIpLmdldERhdGEoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGF3dC4yMzU9V3JvbmcgRGF0YSBCdWZmZXIgdHlwZSA6IHswfQpAQCAtODUsNyArODgsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludFtdIGdldERhdGFJbnQoRGF0YUJ1ZmZlciBkYikgewotICAgICAgICBpZiAoZGIgaW5zdGFuY2VvZiBEYXRhQnVmZmVySW50KXsKKyAgICAgICAgaWYgKGRiIGluc3RhbmNlb2YgRGF0YUJ1ZmZlckludCkgewogICAgICAgICAgICAgcmV0dXJuICgoRGF0YUJ1ZmZlckludClkYikuZ2V0RGF0YSgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwpAQCAtOTMsNyArOTYsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJ5dGVbXSBnZXREYXRhQnl0ZShEYXRhQnVmZmVyIGRiKSB7Ci0gICAgICAgIGlmIChkYiBpbnN0YW5jZW9mIERhdGFCdWZmZXJCeXRlKXsKKyAgICAgICAgaWYgKGRiIGluc3RhbmNlb2YgRGF0YUJ1ZmZlckJ5dGUpIHsKICAgICAgICAgICAgIHJldHVybiAoKERhdGFCdWZmZXJCeXRlKWRiKS5nZXREYXRhKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0xMDEsNyArMTA0LDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzaG9ydFtdIGdldERhdGFTaG9ydChEYXRhQnVmZmVyIGRiKSB7Ci0gICAgICAgIGlmIChkYiBpbnN0YW5jZW9mIERhdGFCdWZmZXJTaG9ydCl7CisgICAgICAgIGlmIChkYiBpbnN0YW5jZW9mIERhdGFCdWZmZXJTaG9ydCkgewogICAgICAgICAgICAgcmV0dXJuICgoRGF0YUJ1ZmZlclNob3J0KWRiKS5nZXREYXRhKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0xMDksNyArMTEyLDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzaG9ydFtdIGdldERhdGFVU2hvcnQoRGF0YUJ1ZmZlciBkYikgewotICAgICAgICBpZiAoZGIgaW5zdGFuY2VvZiBEYXRhQnVmZmVyVVNob3J0KXsKKyAgICAgICAgaWYgKGRiIGluc3RhbmNlb2YgRGF0YUJ1ZmZlclVTaG9ydCkgewogICAgICAgICAgICAgcmV0dXJuICgoRGF0YUJ1ZmZlclVTaG9ydClkYikuZ2V0RGF0YSgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMTE3LDcgKzEyMCw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZG91YmxlW10gZ2V0RGF0YURvdWJsZShEYXRhQnVmZmVyIGRiKSB7Ci0gICAgICAgIGlmIChkYiBpbnN0YW5jZW9mIERhdGFCdWZmZXJEb3VibGUpeworICAgICAgICBpZiAoZGIgaW5zdGFuY2VvZiBEYXRhQnVmZmVyRG91YmxlKSB7CiAgICAgICAgICAgICByZXR1cm4gKChEYXRhQnVmZmVyRG91YmxlKWRiKS5nZXREYXRhKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0xMjUsNyArMTI4LDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmbG9hdFtdIGdldERhdGFGbG9hdChEYXRhQnVmZmVyIGRiKSB7Ci0gICAgICAgIGlmIChkYiBpbnN0YW5jZW9mIERhdGFCdWZmZXJGbG9hdCl7CisgICAgICAgIGlmIChkYiBpbnN0YW5jZW9mIERhdGFCdWZmZXJGbG9hdCkgewogICAgICAgICAgICAgcmV0dXJuICgoRGF0YUJ1ZmZlckZsb2F0KWRiKS5nZXREYXRhKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvQmFuZENvbWJpbmVPcC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0JhbmRDb21iaW5lT3AuamF2YQppbmRleCBjZDc3YTIxLi5kYTJjYzg5IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvQmFuZENvbWJpbmVPcC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9CYW5kQ29tYmluZU9wLmphdmEKQEAgLTMyLDgyICszMiwxMjQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgQmFuZENvbWJpbmVPcCBjbGFzcyB0cmFuc2xhdGVzIGNvb3JkaW5hdGVzIGZyb20gCi0gKiBjb29yZGluYXRlcyBpbiB0aGUgc291cmNlIFJhc3RlciB0byBjb29yZGluYXRlcyBpbiAKLSAqIHRoZSBkZXN0aW5hdGlvbiBSYXN0ZXIgYnkgYW4gYXJiaXRyYXJ5IGxpbmVhciBjb21iaW5hdGlvbiAKLSAqIG9mIHRoZSBiYW5kcyBpbiBhIHNvdXJjZSBSYXN0ZXIsIHVzaW5nIGEgc3BlY2lmaWVkIG1hdHJpeC4KLSAqIFRoZSBudW1iZXIgb2YgYmFuZHMgaW4gdGhlIG1hdHJpeCBzaG91bGQgZXF1YWwgdG8gCi0gKiB0aGUgbnVtYmVyIG9mIGJhbmRzIGluIHRoZSBzb3VyY2UgUmFzdGVyIHBsdXMgMS4KKyAqIFRoZSBCYW5kQ29tYmluZU9wIGNsYXNzIHRyYW5zbGF0ZXMgY29vcmRpbmF0ZXMgZnJvbSBjb29yZGluYXRlcyBpbiB0aGUgc291cmNlCisgKiBSYXN0ZXIgdG8gY29vcmRpbmF0ZXMgaW4gdGhlIGRlc3RpbmF0aW9uIFJhc3RlciBieSBhbiBhcmJpdHJhcnkgbGluZWFyCisgKiBjb21iaW5hdGlvbiBvZiB0aGUgYmFuZHMgaW4gYSBzb3VyY2UgUmFzdGVyLCB1c2luZyBhIHNwZWNpZmllZCBtYXRyaXguIFRoZQorICogbnVtYmVyIG9mIGJhbmRzIGluIHRoZSBtYXRyaXggc2hvdWxkIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYmFuZHMgaW4gdGhlCisgKiBzb3VyY2UgUmFzdGVyIHBsdXMgMS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBCYW5kQ29tYmluZU9wIGltcGxlbWVudHMgUmFzdGVyT3AgewotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgb2Zmc2V0czNjLiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgb2Zmc2V0czNjW10gPSB7MTYsIDgsIDB9OwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgb2Zmc2V0czRhYy4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IG9mZnNldHM0YWNbXSA9IHsxNiwgOCwgMCwgMjR9OwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgbWFza3MzYy4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IG1hc2tzM2NbXSA9IHsweEZGMDAwMCwgMHhGRjAwLCAweEZGfTsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IG1hc2tzNGFjLiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgbWFza3M0YWNbXSA9IHsweEZGMDAwMCwgMHhGRjAwLCAweEZGLCAweEZGMDAwMDAwfTsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IHBpT2Zmc2V0cy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgcGlPZmZzZXRzW10gPSB7MCwgMSwgMn07Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBwaUludk9mZnNldHMuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHBpSW52T2Zmc2V0c1tdID0gezIsIDEsIDB9OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX0JZVEUzQy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgb2Zmc2V0czNjLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgb2Zmc2V0czNjW10gPSB7CisgICAgICAgICAgICAxNiwgOCwgMAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgb2Zmc2V0czRhYy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IG9mZnNldHM0YWNbXSA9IHsKKyAgICAgICAgICAgIDE2LCA4LCAwLCAyNAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgbWFza3MzYy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IG1hc2tzM2NbXSA9IHsKKyAgICAgICAgICAgIDB4RkYwMDAwLCAweEZGMDAsIDB4RkYKKyAgICB9OworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IG1hc2tzNGFjLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgbWFza3M0YWNbXSA9IHsKKyAgICAgICAgICAgIDB4RkYwMDAwLCAweEZGMDAsIDB4RkYsIDB4RkYwMDAwMDAKKyAgICB9OworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHBpT2Zmc2V0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgcGlPZmZzZXRzW10gPSB7CisgICAgICAgICAgICAwLCAxLCAyCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBwaUludk9mZnNldHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHBpSW52T2Zmc2V0c1tdID0geworICAgICAgICAgICAgMiwgMSwgMAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9CWVRFM0MuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfQllURTNDID0gMDsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfQllURTRBQy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0JZVEU0QUMuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfQllURTRBQyA9IDE7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX1VTSE9SVDNDLiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfVVNIT1JUM0MuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfVVNIT1JUM0MgPSAyOwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9TSE9SVDNDLiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfU0hPUlQzQy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TSE9SVDNDID0gMzsKIAotICAgIC8qKiBUaGUgbXggd2lkdGguICovCisgICAgLyoqCisgICAgICogVGhlIG14IHdpZHRoLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IG14V2lkdGg7Ci0gICAgCi0gICAgLyoqIFRoZSBteCBoZWlnaHQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbXggaGVpZ2h0LgorICAgICAqLwogICAgIHByaXZhdGUgaW50IG14SGVpZ2h0OwotICAgIAotICAgIC8qKiBUaGUgbWF0cml4LiAqLworCisgICAgLyoqCisgICAgICogVGhlIG1hdHJpeC4KKyAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0IG1hdHJpeFtdW107Ci0gICAgCi0gICAgLyoqIFRoZSByIGhpbnRzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHIgaGludHMuCisgICAgICovCiAgICAgcHJpdmF0ZSBSZW5kZXJpbmdIaW50cyBySGludHM7CiAKICAgICBzdGF0aWMgewogICAgICAgICAvLyBYWFggLSB0b2RvCi0gICAgICAgIC8vU3lzdGVtLmxvYWRMaWJyYXJ5KCJpbWFnZW9wcyIpOworICAgICAgICAvLyBTeXN0ZW0ubG9hZExpYnJhcnkoImltYWdlb3BzIik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJhbmRDb21iaW5lT3Agb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIG1hdHJpeC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQmFuZENvbWJpbmVPcCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG1hdHJpeC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWF0cml4IHRoZSBzcGVjaWZpZWQgbWF0cml4IGZvciBiYW5kIGNvbWJpbmluZy4KLSAgICAgKiBAcGFyYW0gaGludHMgdGhlIFJlbmRlcmluZ0hpbnRzLgorICAgICAqIEBwYXJhbSBtYXRyaXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgbWF0cml4IGZvciBiYW5kIGNvbWJpbmluZy4KKyAgICAgKiBAcGFyYW0gaGludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBSZW5kZXJpbmdIaW50cy4KICAgICAgKi8KICAgICBwdWJsaWMgQmFuZENvbWJpbmVPcChmbG9hdCBtYXRyaXhbXVtdLCBSZW5kZXJpbmdIaW50cyBoaW50cykgewogICAgICAgICB0aGlzLm14SGVpZ2h0ID0gbWF0cml4Lmxlbmd0aDsKICAgICAgICAgdGhpcy5teFdpZHRoID0gbWF0cml4WzBdLmxlbmd0aDsKICAgICAgICAgdGhpcy5tYXRyaXggPSBuZXcgZmxvYXRbbXhIZWlnaHRdW214V2lkdGhdOwogCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxteEhlaWdodDsgaSsrKXsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBteEhlaWdodDsgaSsrKSB7CiAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1hdHJpeFtpXSwgMCwgdGhpcy5tYXRyaXhbaV0sIDAsIG14V2lkdGgpOwogICAgICAgICB9CiAKICAgICAgICAgdGhpcy5ySGludHMgPSBoaW50czsKICAgICB9CiAKLSAgICBwdWJsaWMgZmluYWwgUmVuZGVyaW5nSGludHMgZ2V0UmVuZGVyaW5nSGludHMoKXsKKyAgICBwdWJsaWMgZmluYWwgUmVuZGVyaW5nSGludHMgZ2V0UmVuZGVyaW5nSGludHMoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLnJIaW50czsKICAgICB9CiAKQEAgLTExOSwxNCArMTYxLDE0IEBACiAgICAgcHVibGljIGZpbmFsIGZsb2F0W11bXSBnZXRNYXRyaXgoKSB7CiAgICAgICAgIGZsb2F0IHJlc1tdW10gPSBuZXcgZmxvYXRbbXhIZWlnaHRdW214V2lkdGhdOwogCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxteEhlaWdodDsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXhIZWlnaHQ7IGkrKykgewogICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtYXRyaXhbaV0sIDAsIHJlc1tpXSwgMCwgbXhXaWR0aCk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIHB1YmxpYyBmaW5hbCBQb2ludDJEIGdldFBvaW50MkQgKFBvaW50MkQgc3JjUG9pbnQsIFBvaW50MkQgZHN0UG9pbnQpIHsKKyAgICBwdWJsaWMgZmluYWwgUG9pbnQyRCBnZXRQb2ludDJEKFBvaW50MkQgc3JjUG9pbnQsIFBvaW50MkQgZHN0UG9pbnQpIHsKICAgICAgICAgaWYgKGRzdFBvaW50ID09IG51bGwpIHsKICAgICAgICAgICAgIGRzdFBvaW50ID0gbmV3IFBvaW50MkQuRmxvYXQoKTsKICAgICAgICAgfQpAQCAtMTM1LDE3ICsxNzcsMTkgQEAKICAgICAgICAgcmV0dXJuIGRzdFBvaW50OwogICAgIH0KIAotICAgIHB1YmxpYyBmaW5hbCBSZWN0YW5nbGUyRCBnZXRCb3VuZHMyRChSYXN0ZXIgc3JjKXsKKyAgICBwdWJsaWMgZmluYWwgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzMkQoUmFzdGVyIHNyYykgewogICAgICAgICByZXR1cm4gc3JjLmdldEJvdW5kcygpOwogICAgIH0KIAotICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVDb21wYXRpYmxlRGVzdFJhc3RlciAoUmFzdGVyIHNyYykgeworICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVDb21wYXRpYmxlRGVzdFJhc3RlcihSYXN0ZXIgc3JjKSB7CiAgICAgICAgIGludCBudW1CYW5kcyA9IHNyYy5nZXROdW1CYW5kcygpOwotICAgICAgICBpZiAobXhXaWR0aCAhPSBudW1CYW5kcyAmJiBteFdpZHRoICE9IChudW1CYW5kcysxKSB8fCBudW1CYW5kcyAhPSBteEhlaWdodCkgeworICAgICAgICBpZiAobXhXaWR0aCAhPSBudW1CYW5kcyAmJiBteFdpZHRoICE9IChudW1CYW5kcyArIDEpIHx8IG51bUJhbmRzICE9IG14SGVpZ2h0KSB7CiAgICAgICAgICAgICAvLyBhd3QuMjU0PU51bWJlciBvZiBiYW5kcyBpbiB0aGUgc291cmNlIHJhc3RlciAoezB9KSBpcwotICAgICAgICAgICAgLy8gICAgICAgICAgaW5jb21wYXRpYmxlIHdpdGggdGhlIG1hdHJpeCBbezF9eHsyfV0KKyAgICAgICAgICAgIC8vIGluY29tcGF0aWJsZSB3aXRoIHRoZSBtYXRyaXggW3sxfXh7Mn1dCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI1NCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde251bUJhbmRzLCBteFdpZHRoLCBteEhlaWdodH0pKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1CYW5kcywgbXhXaWR0aCwgbXhIZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHNyYy5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSk7CkBAIC0xNTQsMjcgKzE5OCwzMSBAQAogICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBmaWx0ZXIoUmFzdGVyIHNyYywgV3JpdGFibGVSYXN0ZXIgZHN0KSB7CiAgICAgICAgIGludCBudW1CYW5kcyA9IHNyYy5nZXROdW1CYW5kcygpOwogCi0gICAgICAgIGlmIChteFdpZHRoICE9IG51bUJhbmRzICYmIG14V2lkdGggIT0gKG51bUJhbmRzKzEpKSB7CisgICAgICAgIGlmIChteFdpZHRoICE9IG51bUJhbmRzICYmIG14V2lkdGggIT0gKG51bUJhbmRzICsgMSkpIHsKICAgICAgICAgICAgIC8vIGF3dC4yNTQ9TnVtYmVyIG9mIGJhbmRzIGluIHRoZSBzb3VyY2UgcmFzdGVyICh7MH0pIGlzCi0gICAgICAgICAgICAvLyAgICAgICAgICBpbmNvbXBhdGlibGUgd2l0aCB0aGUgbWF0cml4IFt7MX14ezJ9XQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjU0IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117bnVtQmFuZHMsIG14V2lkdGgsIG14SGVpZ2h0fSkpOworICAgICAgICAgICAgLy8gaW5jb21wYXRpYmxlIHdpdGggdGhlIG1hdHJpeCBbezF9eHsyfV0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjU0IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUJhbmRzLCBteFdpZHRoLCBteEhlaWdodAorICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZHN0ID09IG51bGwpIHsKICAgICAgICAgICAgIGRzdCA9IGNyZWF0ZUNvbXBhdGlibGVEZXN0UmFzdGVyKHNyYyk7CiAgICAgICAgIH0gZWxzZSBpZiAoZHN0LmdldE51bUJhbmRzKCkgIT0gbXhIZWlnaHQpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yNTU9TnVtYmVyIG9mIGJhbmRzIGluIHRoZSBkZXN0aW5hdGlvbiByYXN0ZXIgKHswfSkgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIG1hdHJpeCBbezF9eHsyfV0KKyAgICAgICAgICAgIC8vIGF3dC4yNTU9TnVtYmVyIG9mIGJhbmRzIGluIHRoZSBkZXN0aW5hdGlvbiByYXN0ZXIgKHswfSkgaXMKKyAgICAgICAgICAgIC8vIGluY29tcGF0aWJsZSB3aXRoIHRoZSBtYXRyaXggW3sxfXh7Mn1dCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI1NSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde2RzdC5nZXROdW1CYW5kcygpLCBteFdpZHRoLCBteEhlaWdodH0pKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QuZ2V0TnVtQmFuZHMoKSwgbXhXaWR0aCwgbXhIZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gWFhYIC0gdG9kbwotICAgICAgICAvL2lmIChpcHBGaWx0ZXIoc3JjLCBkc3QpICE9IDApCisgICAgICAgIC8vIGlmIChpcHBGaWx0ZXIoc3JjLCBkc3QpICE9IDApCiAgICAgICAgIGlmICh2ZXJ5U2xvd0ZpbHRlcihzcmMsIGRzdCkgIT0gMCkgewogICAgICAgICAgICAgLy8gYXd0LjIxRj1VbmFibGUgdG8gdHJhbnNmb3JtIHNvdXJjZQotICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdpbmdPcEV4Y2VwdGlvbiAoTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjFGIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxRiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGRzdDsKQEAgLTE4NCwyMyArMjMyLDI5IEBACiAgICAgICogVGhlIENsYXNzIFNhbXBsZU1vZGVsSW5mby4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTYW1wbGVNb2RlbEluZm8gewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBjaGFubmVscy4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNoYW5uZWxzLgorICAgICAgICAgKi8KICAgICAgICAgaW50IGNoYW5uZWxzOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBjaGFubmVscyBvcmRlci4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNoYW5uZWxzIG9yZGVyLgorICAgICAgICAgKi8KICAgICAgICAgaW50IGNoYW5uZWxzT3JkZXJbXTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgc3RyaWRlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc3RyaWRlLgorICAgICAgICAgKi8KICAgICAgICAgaW50IHN0cmlkZTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDaGVjayBzYW1wbGUgbW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNtIHRoZSBzbQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNhbXBsZSBtb2RlbCBpbmZvCisgICAgICogQHBhcmFtIHNtCisgICAgICogICAgICAgICAgICB0aGUgc20uCisgICAgICogQHJldHVybiB0aGUgc2FtcGxlIG1vZGVsIGluZm8uCiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBTYW1wbGVNb2RlbEluZm8gY2hlY2tTYW1wbGVNb2RlbChTYW1wbGVNb2RlbCBzbSkgewogICAgICAgICBTYW1wbGVNb2RlbEluZm8gcmV0ID0gbmV3IFNhbXBsZU1vZGVsSW5mbygpOwpAQCAtMjEyLDEyICsyNjYsMTIgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0LmNoYW5uZWxzID0gc20uZ2V0TnVtQmFuZHMoKTsKLSAgICAgICAgICAgIHJldC5zdHJpZGUgPSAoKENvbXBvbmVudFNhbXBsZU1vZGVsKSBzbSkuZ2V0U2NhbmxpbmVTdHJpZGUoKTsKLSAgICAgICAgICAgIHJldC5jaGFubmVsc09yZGVyID0gKChDb21wb25lbnRTYW1wbGVNb2RlbCkgc20pLmdldEJhbmRPZmZzZXRzKCk7CisgICAgICAgICAgICByZXQuc3RyaWRlID0gKChDb21wb25lbnRTYW1wbGVNb2RlbClzbSkuZ2V0U2NhbmxpbmVTdHJpZGUoKTsKKyAgICAgICAgICAgIHJldC5jaGFubmVsc09yZGVyID0gKChDb21wb25lbnRTYW1wbGVNb2RlbClzbSkuZ2V0QmFuZE9mZnNldHMoKTsKIAogICAgICAgICB9IGVsc2UgaWYgKHNtIGluc3RhbmNlb2YgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkgewogICAgICAgICAgICAgLy8gQ2hlY2sgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbAotICAgICAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBzcHBzbTEgPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkgc207CisgICAgICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNwcHNtMSA9IChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKXNtOwogCiAgICAgICAgICAgICByZXQuY2hhbm5lbHMgPSBzcHBzbTEuZ2V0TnVtQmFuZHMoKTsKICAgICAgICAgICAgIGlmIChzcHBzbTEuZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfSU5UKSB7CkBAIC0yMjUsNyArMjc5LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gQ2hlY2sgc2FtcGxlIG1vZGVscwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHJldC5jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJldC5jaGFubmVsczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHNwcHNtMS5nZXRTYW1wbGVTaXplKGkpICE9IDgpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjMzLDcgKzI4Nyw3IEBACiAKICAgICAgICAgICAgIHJldC5jaGFubmVsc09yZGVyID0gbmV3IGludFtyZXQuY2hhbm5lbHNdOwogICAgICAgICAgICAgaW50IGJpdE9mZnNldHNbXSA9IHNwcHNtMS5nZXRCaXRPZmZzZXRzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8cmV0LmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmV0LmNoYW5uZWxzOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZiAoYml0T2Zmc2V0c1tpXSAlIDggIT0gMCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICB9CkBAIC0yNTMsMTAgKzMwNywxMSBAQAogICAgIC8qKgogICAgICAqIFNsb3cgZmlsdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIHNyYwotICAgICAqIEBwYXJhbSBkc3QgdGhlIGRzdAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludAorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIGRzdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgc2xvd0ZpbHRlcihSYXN0ZXIgc3JjLCBXcml0YWJsZVJhc3RlciBkc3QpIHsKICAgICAgICAgaW50IHJlcyA9IDA7CkBAIC0yNzIsOCArMzI3LDggQEAKIAogICAgICAgICAvLyBGaWxsIG9mZnNldHMgaWYgdGhlcmUncyBhIGNoaWxkIHJhc3RlcgogICAgICAgICBpZiAoc3JjLmdldFBhcmVudCgpICE9IG51bGwgfHwgZHN0LmdldFBhcmVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChzcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgIT0gMCB8fCBzcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgIT0gMCB8fAotICAgICAgICAgICAgICAgICAgICBkc3QuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgIT0gMCB8fCBkc3QuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSAhPSAwIHx8IHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSAhPSAwCisgICAgICAgICAgICAgICAgICAgIHx8IGRzdC5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSAhPSAwIHx8IGRzdC5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgb2Zmc2V0cyA9IG5ldyBpbnRbNF07CiAgICAgICAgICAgICAgICAgb2Zmc2V0c1swXSA9IC1zcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgKyBzcmMuZ2V0TWluWCgpOwogICAgICAgICAgICAgICAgIG9mZnNldHNbMV0gPSAtc3JjLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpICsgc3JjLmdldE1pblkoKTsKQEAgLTI4MiwyMyArMzM3LDIyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgcm14V2lkdGggPSAoc3JjSW5mby5jaGFubmVscysxKTsgLy8gd2lkdGggb2YgdGhlIHJlb3JkZXJlZCBtYXRyaXgKLSAgICAgICAgZmxvYXQgcmVvcmRlcmVkTWF0cml4W10gPSBuZXcgZmxvYXRbcm14V2lkdGgqZHN0SW5mby5jaGFubmVsc107Ci0gICAgICAgIGZvciAoaW50IGo9MDsgajxkc3RJbmZvLmNoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgaW50IHJteFdpZHRoID0gKHNyY0luZm8uY2hhbm5lbHMgKyAxKTsgLy8gd2lkdGggb2YgdGhlIHJlb3JkZXJlZCBtYXRyaXgKKyAgICAgICAgZmxvYXQgcmVvcmRlcmVkTWF0cml4W10gPSBuZXcgZmxvYXRbcm14V2lkdGggKiBkc3RJbmZvLmNoYW5uZWxzXTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkc3RJbmZvLmNoYW5uZWxzOyBqKyspIHsKICAgICAgICAgICAgIGlmIChqID49IGRzdEluZm8uY2hhbm5lbHNPcmRlci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNyY0luZm8uY2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNJbmZvLmNoYW5uZWxzOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZiAoaSA+PSBzcmNJbmZvLmNoYW5uZWxzT3JkZXIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHJlb3JkZXJlZE1hdHJpeFtkc3RJbmZvLmNoYW5uZWxzT3JkZXJbal0qcm14V2lkdGggKyBzcmNJbmZvLmNoYW5uZWxzT3JkZXJbaV1dID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeFtqXVtpXTsKKyAgICAgICAgICAgICAgICByZW9yZGVyZWRNYXRyaXhbZHN0SW5mby5jaGFubmVsc09yZGVyW2pdICogcm14V2lkdGggKyBzcmNJbmZvLmNoYW5uZWxzT3JkZXJbaV1dID0gbWF0cml4W2pdW2ldOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG14V2lkdGggPT0gcm14V2lkdGgpIHsKLSAgICAgICAgICAgICAgICByZW9yZGVyZWRNYXRyaXhbKGRzdEluZm8uY2hhbm5lbHNPcmRlcltqXSsxKSpybXhXaWR0aCAtIDFdID0gbWF0cml4W2pdW214V2lkdGgtMV07CisgICAgICAgICAgICAgICAgcmVvcmRlcmVkTWF0cml4Wyhkc3RJbmZvLmNoYW5uZWxzT3JkZXJbal0gKyAxKSAqIHJteFdpZHRoIC0gMV0gPSBtYXRyaXhbal1bbXhXaWR0aCAtIDFdOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTMxMSwxMSArMzY1LDkgQEAKICAgICAgICAgICAgIHJldHVybiAtMTsgLy8gVW5rbm93biBkYXRhIGJ1ZmZlciB0eXBlCiAgICAgICAgIH0KIAotICAgICAgICBzaW1wbGVDb21iaW5lQmFuZHMoCi0gICAgICAgICAgICAgICAgc3JjRGF0YSwgc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSwgc3JjSW5mby5zdHJpZGUsIHNyY0luZm8uY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgZHN0RGF0YSwgZHN0SW5mby5zdHJpZGUsIGRzdEluZm8uY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgcmVvcmRlcmVkTWF0cml4LCBvZmZzZXRzCi0gICAgICAgICk7CisgICAgICAgIHNpbXBsZUNvbWJpbmVCYW5kcyhzcmNEYXRhLCBzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpLCBzcmNJbmZvLnN0cmlkZSwKKyAgICAgICAgICAgICAgICBzcmNJbmZvLmNoYW5uZWxzLCBkc3REYXRhLCBkc3RJbmZvLnN0cmlkZSwgZHN0SW5mby5jaGFubmVscywgcmVvcmRlcmVkTWF0cml4LAorICAgICAgICAgICAgICAgIG9mZnNldHMpOwogCiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQpAQCAtMzIzLDEwICszNzUsMTEgQEAKICAgICAvKioKICAgICAgKiBWZXJ5IHNsb3cgZmlsdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIHNyYwotICAgICAqIEBwYXJhbSBkc3QgdGhlIGRzdAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludAorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIGRzdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgdmVyeVNsb3dGaWx0ZXIoUmFzdGVyIHNyYywgV3JpdGFibGVSYXN0ZXIgZHN0KSB7CiAgICAgICAgIGludCBudW1CYW5kcyA9IHNyYy5nZXROdW1CYW5kcygpOwpAQCAtMzM3LDMzICszOTAsMzUgQEAKICAgICAgICAgaW50IGRzdE1pblggPSBkc3QuZ2V0TWluWCgpOwogICAgICAgICBpbnQgZHN0WSA9IGRzdC5nZXRNaW5ZKCk7CiAKLSAgICAgICAgaW50IGRYID0gc3JjLmdldFdpZHRoKCk7Ly88IGRzdC5nZXRXaWR0aCgpID8gc3JjLmdldFdpZHRoKCkgOiBkc3QuZ2V0V2lkdGgoKTsKLSAgICAgICAgaW50IGRZID0gc3JjLmdldEhlaWdodCgpOy8vPCBkc3QuZ2V0SGVpZ2h0KCkgPyBzcmMuZ2V0SGVpZ2h0KCkgOiBkc3QuZ2V0SGVpZ2h0KCk7CisgICAgICAgIGludCBkWCA9IHNyYy5nZXRXaWR0aCgpOy8vIDwgZHN0LmdldFdpZHRoKCkgPyBzcmMuZ2V0V2lkdGgoKSA6CisgICAgICAgIC8vIGRzdC5nZXRXaWR0aCgpOworICAgICAgICBpbnQgZFkgPSBzcmMuZ2V0SGVpZ2h0KCk7Ly8gPCBkc3QuZ2V0SGVpZ2h0KCkgPyBzcmMuZ2V0SGVpZ2h0KCkgOgorICAgICAgICAvLyBkc3QuZ2V0SGVpZ2h0KCk7CiAKICAgICAgICAgZmxvYXQgc2FtcGxlOwotICAgICAgICBpbnQgc3JjUGl4ZWxzW10gPSBuZXcgaW50W251bUJhbmRzKmRYKmRZXTsKLSAgICAgICAgaW50IGRzdFBpeGVsc1tdID0gbmV3IGludFtteEhlaWdodCpkWCpkWV07CisgICAgICAgIGludCBzcmNQaXhlbHNbXSA9IG5ldyBpbnRbbnVtQmFuZHMgKiBkWCAqIGRZXTsKKyAgICAgICAgaW50IGRzdFBpeGVsc1tdID0gbmV3IGludFtteEhlaWdodCAqIGRYICogZFldOwogCiAgICAgICAgIHNyY1BpeGVscyA9IHNyYy5nZXRQaXhlbHMoc3JjTWluWCwgc3JjWSwgZFgsIGRZLCBzcmNQaXhlbHMpOwogCiAgICAgICAgIGlmIChudW1CYW5kcyA9PSBteFdpZHRoKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTAsIGo9MDsgaTxzcmNQaXhlbHMubGVuZ3RoOyBpKz1udW1CYW5kcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGogPSAwOyBpIDwgc3JjUGl4ZWxzLmxlbmd0aDsgaSArPSBudW1CYW5kcykgewogICAgICAgICAgICAgICAgIGZvciAoaW50IGRzdEIgPSAwOyBkc3RCIDwgbXhIZWlnaHQ7IGRzdEIrKykgewogICAgICAgICAgICAgICAgICAgICBzYW1wbGUgPSAwZjsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgc3JjQiA9IDA7IHNyY0IgPCBudW1CYW5kczsgc3JjQisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUgKz0gbWF0cml4W2RzdEJdW3NyY0JdICogc3JjUGl4ZWxzW2krc3JjQl07CisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUgKz0gbWF0cml4W2RzdEJdW3NyY0JdICogc3JjUGl4ZWxzW2kgKyBzcmNCXTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkc3RQaXhlbHNbaisrXSA9IChpbnQpIHNhbXBsZTsKKyAgICAgICAgICAgICAgICAgICAgZHN0UGl4ZWxzW2orK10gPSAoaW50KXNhbXBsZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTAsIGo9MDsgaTxzcmNQaXhlbHMubGVuZ3RoOyBpKz1udW1CYW5kcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGogPSAwOyBpIDwgc3JjUGl4ZWxzLmxlbmd0aDsgaSArPSBudW1CYW5kcykgewogICAgICAgICAgICAgICAgIGZvciAoaW50IGRzdEIgPSAwOyBkc3RCIDwgbXhIZWlnaHQ7IGRzdEIrKykgewogICAgICAgICAgICAgICAgICAgICBzYW1wbGUgPSAwZjsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgc3JjQiA9IDA7IHNyY0IgPCBudW1CYW5kczsgc3JjQisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUgKz0gbWF0cml4W2RzdEJdW3NyY0JdICogc3JjUGl4ZWxzW2krc3JjQl07CisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUgKz0gbWF0cml4W2RzdEJdW3NyY0JdICogc3JjUGl4ZWxzW2kgKyBzcmNCXTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkc3RQaXhlbHNbaisrXSA9IChpbnQpIChzYW1wbGUgKyBtYXRyaXhbZHN0Ql1bbnVtQmFuZHNdKTsKKyAgICAgICAgICAgICAgICAgICAgZHN0UGl4ZWxzW2orK10gPSAoaW50KShzYW1wbGUgKyBtYXRyaXhbZHN0Ql1bbnVtQmFuZHNdKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTM3MywxNCArNDI4LDE1IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIC8vVE9ETyByZW1vdmUgd2hlbiBtZXRob2QgaXMgdXNlZAorICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gbWV0aG9kIGlzIHVzZWQKICAgICAvKioKICAgICAgKiBJcHAgZmlsdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIHNyYwotICAgICAqIEBwYXJhbSBkc3QgdGhlIGRzdAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludAorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIGRzdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiAgICAgcHJpdmF0ZSBpbnQgaXBwRmlsdGVyKFJhc3RlciBzcmMsIFdyaXRhYmxlUmFzdGVyIGRzdCkgewpAQCAtMzkzLDU2ICs0NDksMzkgQEAKICAgICAgICAgaW50IHNyY0JhbmRzID0gc3JjLmdldE51bUJhbmRzKCk7CiAgICAgICAgIGludCBkc3RCYW5kcyA9IGRzdC5nZXROdW1CYW5kcygpOwogCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICBkc3RCYW5kcyAhPSAzIHx8Ci0gICAgICAgICAgICAgICAgKHNyY0JhbmRzICE9IDMgJiYKLSAgICAgICAgICAgICAgICAhKHNyY0JhbmRzID09IDQgJiYKLSAgICAgICAgICAgICAgICAgIG1hdHJpeFswXVszXSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICBtYXRyaXhbMV1bM10gPT0gMCAmJgotICAgICAgICAgICAgICAgICAgbWF0cml4WzJdWzNdID09IDApCi0gICAgICAgICAgICAgICAgKQotICAgICAgICApIHsKKyAgICAgICAgaWYgKGRzdEJhbmRzICE9IDMKKyAgICAgICAgICAgICAgICB8fCAoc3JjQmFuZHMgIT0gMyAmJiAhKHNyY0JhbmRzID09IDQgJiYgbWF0cml4WzBdWzNdID09IDAgJiYgbWF0cml4WzFdWzNdID09IDAgJiYgbWF0cml4WzJdWzNdID09IDApKSkgewogICAgICAgICAgICAgcmV0dXJuIHNsb3dGaWx0ZXIoc3JjLCBkc3QpOwogICAgICAgICB9CiAKICAgICAgICAgU2FtcGxlTW9kZWwgc3JjU00gPSBzcmMuZ2V0U2FtcGxlTW9kZWwoKTsKICAgICAgICAgU2FtcGxlTW9kZWwgZHN0U00gPSBkc3QuZ2V0U2FtcGxlTW9kZWwoKTsKIAotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgc3JjU00gaW5zdGFuY2VvZiBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsICYmCi0gICAgICAgICAgICAgICAgZHN0U00gaW5zdGFuY2VvZiBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsCi0gICAgICAgICkgeworICAgICAgICBpZiAoc3JjU00gaW5zdGFuY2VvZiBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsCisgICAgICAgICAgICAgICAgJiYgZHN0U00gaW5zdGFuY2VvZiBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKSB7CiAgICAgICAgICAgICAvLyBDaGVjayBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsCi0gICAgICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNwcHNtMSA9IChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKSBzcmNTTTsKLSAgICAgICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgc3Bwc20yID0gKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpIGRzdFNNOworICAgICAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBzcHBzbTEgPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbClzcmNTTTsKKyAgICAgICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgc3Bwc20yID0gKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpZHN0U007CiAKLSAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgc3Bwc20xLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVCB8fAotICAgICAgICAgICAgICAgICAgICBzcHBzbTIuZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfSU5UCi0gICAgICAgICAgICApIHsKKyAgICAgICAgICAgIGlmIChzcHBzbTEuZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfSU5UCisgICAgICAgICAgICAgICAgICAgIHx8IHNwcHNtMi5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9JTlQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gc2xvd0ZpbHRlcihzcmMsIGRzdCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIENoZWNrIHNhbXBsZSBtb2RlbHMKLSAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgIUFycmF5cy5lcXVhbHMoc3Bwc20yLmdldEJpdE9mZnNldHMoKSwgb2Zmc2V0czNjKSB8fAotICAgICAgICAgICAgICAgICAgICAhQXJyYXlzLmVxdWFscyhzcHBzbTIuZ2V0Qml0TWFza3MoKSwgbWFza3MzYykKLSAgICAgICAgICAgICkgeworICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKHNwcHNtMi5nZXRCaXRPZmZzZXRzKCksIG9mZnNldHMzYykKKyAgICAgICAgICAgICAgICAgICAgfHwgIUFycmF5cy5lcXVhbHMoc3Bwc20yLmdldEJpdE1hc2tzKCksIG1hc2tzM2MpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNsb3dGaWx0ZXIoc3JjLCBkc3QpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoc3JjQmFuZHMgPT0gMykgewotICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgICFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRPZmZzZXRzKCksIG9mZnNldHMzYykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRNYXNrcygpLCBtYXNrczNjKQotICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhzcHBzbTEuZ2V0Qml0T2Zmc2V0cygpLCBvZmZzZXRzM2MpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhQXJyYXlzLmVxdWFscyhzcHBzbTEuZ2V0Qml0TWFza3MoKSwgbWFza3MzYykpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNsb3dGaWx0ZXIoc3JjLCBkc3QpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjQmFuZHMgPT0gNCkgewotICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgICFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRPZmZzZXRzKCksIG9mZnNldHM0YWMpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhQXJyYXlzLmVxdWFscyhzcHBzbTEuZ2V0Qml0TWFza3MoKSwgbWFza3M0YWMpCi0gICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRPZmZzZXRzKCksIG9mZnNldHM0YWMpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhQXJyYXlzLmVxdWFscyhzcHBzbTEuZ2V0Qml0TWFza3MoKSwgbWFza3M0YWMpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzbG93RmlsdGVyKHNyYywgZHN0KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC00NTIsMTAgKzQ5MSw4IEBACiAKICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNwcHNtMS5nZXRTY2FubGluZVN0cmlkZSgpICogNDsKICAgICAgICAgICAgIGRzdFN0cmlkZSA9IHNwcHNtMi5nZXRTY2FubGluZVN0cmlkZSgpICogNDsKLSAgICAgICAgfSBlbHNlIGlmICgKLSAgICAgICAgICAgIHNyY1NNIGluc3RhbmNlb2YgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsICYmCi0gICAgICAgICAgICBkc3RTTSBpbnN0YW5jZW9mIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbAotICAgICAgICApIHsKKyAgICAgICAgfSBlbHNlIGlmIChzcmNTTSBpbnN0YW5jZW9mIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbAorICAgICAgICAgICAgICAgICYmIGRzdFNNIGluc3RhbmNlb2YgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsKSB7CiAgICAgICAgICAgICBpZiAoc3JjQmFuZHMgIT0gMykgewogICAgICAgICAgICAgICAgIHJldHVybiBzbG93RmlsdGVyKHNyYywgZHN0KTsKICAgICAgICAgICAgIH0KQEAgLTQ3NywxNSArNTE0LDEyIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIENoZWNrIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbAotICAgICAgICAgICAgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsIHBpc20xID0gKFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCkgc3JjU007Ci0gICAgICAgICAgICBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwgcGlzbTIgPSAoUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsKSBkc3RTTTsKKyAgICAgICAgICAgIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCBwaXNtMSA9IChQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwpc3JjU007CisgICAgICAgICAgICBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwgcGlzbTIgPSAoUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsKWRzdFNNOwogCi0gICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAgIHNyY0RhdGFUeXBlICE9IHBpc20yLmdldERhdGFUeXBlKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgcGlzbTEuZ2V0UGl4ZWxTdHJpZGUoKSAhPSAzIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBpc20yLmdldFBpeGVsU3RyaWRlKCkgIT0gMyB8fAotICAgICAgICAgICAgICAgICAgICAhQXJyYXlzLmVxdWFscyhwaXNtMS5nZXRCYW5kT2Zmc2V0cygpLCBwaXNtMi5nZXRCYW5kT2Zmc2V0cygpKQotICAgICAgICAgICAgKSB7CisgICAgICAgICAgICBpZiAoc3JjRGF0YVR5cGUgIT0gcGlzbTIuZ2V0RGF0YVR5cGUoKSB8fCBwaXNtMS5nZXRQaXhlbFN0cmlkZSgpICE9IDMKKyAgICAgICAgICAgICAgICAgICAgfHwgcGlzbTIuZ2V0UGl4ZWxTdHJpZGUoKSAhPSAzCisgICAgICAgICAgICAgICAgICAgIHx8ICFBcnJheXMuZXF1YWxzKHBpc20xLmdldEJhbmRPZmZzZXRzKCksIHBpc20yLmdldEJhbmRPZmZzZXRzKCkpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNsb3dGaWx0ZXIoc3JjLCBkc3QpOwogICAgICAgICAgICAgfQogCkBAIC01MDcsOCArNTQxLDggQEAKIAogICAgICAgICAvLyBGaWxsIG9mZnNldHMgaWYgdGhlcmUncyBhIGNoaWxkIHJhc3RlcgogICAgICAgICBpZiAoc3JjLmdldFBhcmVudCgpICE9IG51bGwgfHwgZHN0LmdldFBhcmVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChzcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgIT0gMCB8fCBzcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgIT0gMCB8fAotICAgICAgICAgICAgICAgZHN0LmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpICE9IDAgfHwgZHN0LmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChzcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgIT0gMCB8fCBzcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgIT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBkc3QuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgIT0gMCB8fCBkc3QuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgIT0gMCkgewogICAgICAgICAgICAgICAgIG9mZnNldHMgPSBuZXcgaW50WzRdOwogICAgICAgICAgICAgICAgIG9mZnNldHNbMF0gPSAtc3JjLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpICsgc3JjLmdldE1pblgoKTsKICAgICAgICAgICAgICAgICBvZmZzZXRzWzFdID0gLXNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSArIHNyYy5nZXRNaW5ZKCk7CkBAIC01MzIsNzkgKzU2Niw5MyBAQAogICAgICAgICAgICAgLy8gSVBQIHRyZWF0cyBiaWcgZW5kaWFuIGludGVnZXJzIGxpa2UgQkdSLCBzbyB3ZSBoYXZlIHRvCiAgICAgICAgICAgICAvLyBzd2FwIGNvbHVtbnMgMSBhbmQgMyBhbmQgcm93cyAxIGFuZCAzCiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG14SGVpZ2h0OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpcHBNYXRyaXhbaSo0XSA9IG1hdHJpeFsyLWldWzJdOwotICAgICAgICAgICAgICAgIGlwcE1hdHJpeFtpKjQrMV0gPSBtYXRyaXhbMi1pXVsxXTsKLSAgICAgICAgICAgICAgICBpcHBNYXRyaXhbaSo0KzJdID0gbWF0cml4WzItaV1bMF07CisgICAgICAgICAgICAgICAgaXBwTWF0cml4W2kgKiA0XSA9IG1hdHJpeFsyIC0gaV1bMl07CisgICAgICAgICAgICAgICAgaXBwTWF0cml4W2kgKiA0ICsgMV0gPSBtYXRyaXhbMiAtIGldWzFdOworICAgICAgICAgICAgICAgIGlwcE1hdHJpeFtpICogNCArIDJdID0gbWF0cml4WzIgLSBpXVswXTsKIAogICAgICAgICAgICAgICAgIGlmIChteFdpZHRoID09IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgaXBwTWF0cml4W2kqNCszXSA9IG1hdHJpeFsyLWldWzNdOworICAgICAgICAgICAgICAgICAgICBpcHBNYXRyaXhbaSAqIDQgKyAzXSA9IG1hdHJpeFsyIC0gaV1bM107CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChteFdpZHRoID09IDUpIHsKLSAgICAgICAgICAgICAgICAgICAgaXBwTWF0cml4W2kqNCszXSA9IG1hdHJpeFsyLWldWzRdOworICAgICAgICAgICAgICAgICAgICBpcHBNYXRyaXhbaSAqIDQgKyAzXSA9IG1hdHJpeFsyIC0gaV1bNF07CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBteEhlaWdodDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaXBwTWF0cml4W2kqNF0gPSBtYXRyaXhbaV1bMF07Ci0gICAgICAgICAgICAgICAgaXBwTWF0cml4W2kqNCsxXSA9IG1hdHJpeFtpXVsxXTsKLSAgICAgICAgICAgICAgICBpcHBNYXRyaXhbaSo0KzJdID0gbWF0cml4W2ldWzJdOworICAgICAgICAgICAgICAgIGlwcE1hdHJpeFtpICogNF0gPSBtYXRyaXhbaV1bMF07CisgICAgICAgICAgICAgICAgaXBwTWF0cml4W2kgKiA0ICsgMV0gPSBtYXRyaXhbaV1bMV07CisgICAgICAgICAgICAgICAgaXBwTWF0cml4W2kgKiA0ICsgMl0gPSBtYXRyaXhbaV1bMl07CiAKICAgICAgICAgICAgICAgICBpZiAobXhXaWR0aCA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlwcE1hdHJpeFtpKjQrM10gPSBtYXRyaXhbaV1bM107CisgICAgICAgICAgICAgICAgICAgIGlwcE1hdHJpeFtpICogNCArIDNdID0gbWF0cml4W2ldWzNdOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobXhXaWR0aCA9PSA1KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlwcE1hdHJpeFtpKjQrM10gPSBtYXRyaXhbaV1bNF07CisgICAgICAgICAgICAgICAgICAgIGlwcE1hdHJpeFtpICogNCArIDNdID0gbWF0cml4W2ldWzRdOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBpcHBDb2xvclR3aXN0KAotICAgICAgICAgICAgICAgIHNyY0RhdGEsIHNyYy5nZXRXaWR0aCgpLCBzcmMuZ2V0SGVpZ2h0KCksIHNyY1N0cmlkZSwKLSAgICAgICAgICAgICAgICBkc3REYXRhLCBkc3QuZ2V0V2lkdGgoKSwgZHN0LmdldEhlaWdodCgpLCBkc3RTdHJpZGUsCi0gICAgICAgICAgICAgICAgaXBwTWF0cml4LCB0eXBlLCBvZmZzZXRzLCBpblBsYWNlKTsKKyAgICAgICAgcmV0dXJuIGlwcENvbG9yVHdpc3Qoc3JjRGF0YSwgc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSwgc3JjU3RyaWRlLCBkc3REYXRhLCBkc3QKKyAgICAgICAgICAgICAgICAuZ2V0V2lkdGgoKSwgZHN0LmdldEhlaWdodCgpLCBkc3RTdHJpZGUsIGlwcE1hdHJpeCwgdHlwZSwgb2Zmc2V0cywgaW5QbGFjZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogSXBwIGNvbG9yIHR3aXN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmNEYXRhIHRoZSBzcmMgZGF0YQotICAgICAqIEBwYXJhbSBzcmNXaWR0aCB0aGUgc3JjIHdpZHRoCi0gICAgICogQHBhcmFtIHNyY0hlaWdodCB0aGUgc3JjIGhlaWdodAotICAgICAqIEBwYXJhbSBzcmNTdHJpZGUgdGhlIHNyYyBzdHJpZGUKLSAgICAgKiBAcGFyYW0gZHN0RGF0YSB0aGUgZHN0IGRhdGEKLSAgICAgKiBAcGFyYW0gZHN0V2lkdGggdGhlIGRzdCB3aWR0aAotICAgICAqIEBwYXJhbSBkc3RIZWlnaHQgdGhlIGRzdCBoZWlnaHQKLSAgICAgKiBAcGFyYW0gZHN0U3RyaWRlIHRoZSBkc3Qgc3RyaWRlCi0gICAgICogQHBhcmFtIGlwcE1hdHJpeCB0aGUgaXBwIG1hdHJpeAotICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlCi0gICAgICogQHBhcmFtIG9mZnNldHMgdGhlIG9mZnNldHMKLSAgICAgKiBAcGFyYW0gaW5QbGFjZSB0aGUgaW4gcGxhY2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQKKyAgICAgKiBAcGFyYW0gc3JjRGF0YQorICAgICAqICAgICAgICAgICAgdGhlIHNyYyBkYXRhLgorICAgICAqIEBwYXJhbSBzcmNXaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHNyYyB3aWR0aC4KKyAgICAgKiBAcGFyYW0gc3JjSGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgc3JjIGhlaWdodC4KKyAgICAgKiBAcGFyYW0gc3JjU3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgc3JjIHN0cmlkZS4KKyAgICAgKiBAcGFyYW0gZHN0RGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGRzdCBkYXRhLgorICAgICAqIEBwYXJhbSBkc3RXaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIGRzdCB3aWR0aC4KKyAgICAgKiBAcGFyYW0gZHN0SGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgZHN0IGhlaWdodC4KKyAgICAgKiBAcGFyYW0gZHN0U3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgZHN0IHN0cmlkZS4KKyAgICAgKiBAcGFyYW0gaXBwTWF0cml4CisgICAgICogICAgICAgICAgICB0aGUgaXBwIG1hdHJpeC4KKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHR5cGUuCisgICAgICogQHBhcmFtIG9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXRzLgorICAgICAqIEBwYXJhbSBpblBsYWNlCisgICAgICogICAgICAgICAgICB0aGUgaW4gcGxhY2UuCisgICAgICogQHJldHVybiB0aGUgaW50LgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIGludCBpcHBDb2xvclR3aXN0KAotICAgICAgICAgICAgT2JqZWN0IHNyY0RhdGEsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwgaW50IHNyY1N0cmlkZSwKLSAgICAgICAgICAgIE9iamVjdCBkc3REYXRhLCBpbnQgZHN0V2lkdGgsIGludCBkc3RIZWlnaHQsIGludCBkc3RTdHJpZGUsCi0gICAgICAgICAgICBmbG9hdCBpcHBNYXRyaXhbXSwgaW50IHR5cGUsIGludCBvZmZzZXRzW10sIGJvb2xlYW4gaW5QbGFjZQotICAgICk7CisgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgaW50IGlwcENvbG9yVHdpc3QoT2JqZWN0IHNyY0RhdGEsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKKyAgICAgICAgICAgIGludCBzcmNTdHJpZGUsIE9iamVjdCBkc3REYXRhLCBpbnQgZHN0V2lkdGgsIGludCBkc3RIZWlnaHQsIGludCBkc3RTdHJpZGUsCisgICAgICAgICAgICBmbG9hdCBpcHBNYXRyaXhbXSwgaW50IHR5cGUsIGludCBvZmZzZXRzW10sIGJvb2xlYW4gaW5QbGFjZSk7CiAKICAgICAvKioKICAgICAgKiBTaW1wbGUgY29tYmluZSBiYW5kcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjRGF0YSB0aGUgc3JjIGRhdGEKLSAgICAgKiBAcGFyYW0gc3JjV2lkdGggdGhlIHNyYyB3aWR0aAotICAgICAqIEBwYXJhbSBzcmNIZWlnaHQgdGhlIHNyYyBoZWlnaHQKLSAgICAgKiBAcGFyYW0gc3JjU3RyaWRlIHRoZSBzcmMgc3RyaWRlCi0gICAgICogQHBhcmFtIHNyY0NoYW5uZWxzIHRoZSBzcmMgY2hhbm5lbHMKLSAgICAgKiBAcGFyYW0gZHN0RGF0YSB0aGUgZHN0IGRhdGEKLSAgICAgKiBAcGFyYW0gZHN0U3RyaWRlIHRoZSBkc3Qgc3RyaWRlCi0gICAgICogQHBhcmFtIGRzdENoYW5uZWxzIHRoZSBkc3QgY2hhbm5lbHMKLSAgICAgKiBAcGFyYW0gbSB0aGUgbQotICAgICAqIEBwYXJhbSBvZmZzZXRzIHRoZSBvZmZzZXRzCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50CisgICAgICogQHBhcmFtIHNyY0RhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMgZGF0YS4KKyAgICAgKiBAcGFyYW0gc3JjV2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMgd2lkdGguCisgICAgICogQHBhcmFtIHNyY0hlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIHNyYyBoZWlnaHQuCisgICAgICogQHBhcmFtIHNyY1N0cmlkZQorICAgICAqICAgICAgICAgICAgdGhlIHNyYyBzdHJpZGUuCisgICAgICogQHBhcmFtIHNyY0NoYW5uZWxzCisgICAgICogICAgICAgICAgICB0aGUgc3JjIGNoYW5uZWxzLgorICAgICAqIEBwYXJhbSBkc3REYXRhCisgICAgICogICAgICAgICAgICB0aGUgZHN0IGRhdGEuCisgICAgICogQHBhcmFtIGRzdFN0cmlkZQorICAgICAqICAgICAgICAgICAgdGhlIGRzdCBzdHJpZGUuCisgICAgICogQHBhcmFtIGRzdENoYW5uZWxzCisgICAgICogICAgICAgICAgICB0aGUgZHN0IGNoYW5uZWxzLgorICAgICAqIEBwYXJhbSBtCisgICAgICogICAgICAgICAgICB0aGUgbS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldHMuCisgICAgICogQHJldHVybiB0aGUgaW50LgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIGludCBzaW1wbGVDb21iaW5lQmFuZHMoCi0gICAgICAgICAgICBPYmplY3Qgc3JjRGF0YSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LCBpbnQgc3JjU3RyaWRlLCBpbnQgc3JjQ2hhbm5lbHMsCi0gICAgICAgICAgICBPYmplY3QgZHN0RGF0YSwgaW50IGRzdFN0cmlkZSwgaW50IGRzdENoYW5uZWxzLAotICAgICAgICAgICAgZmxvYXQgbVtdLCBpbnQgb2Zmc2V0c1tdCi0gICAgKTsKKyAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBpbnQgc2ltcGxlQ29tYmluZUJhbmRzKE9iamVjdCBzcmNEYXRhLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCisgICAgICAgICAgICBpbnQgc3JjU3RyaWRlLCBpbnQgc3JjQ2hhbm5lbHMsIE9iamVjdCBkc3REYXRhLCBpbnQgZHN0U3RyaWRlLCBpbnQgZHN0Q2hhbm5lbHMsCisgICAgICAgICAgICBmbG9hdCBtW10sIGludCBvZmZzZXRzW10pOwogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0JhbmRlZFNhbXBsZU1vZGVsLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQmFuZGVkU2FtcGxlTW9kZWwuamF2YQppbmRleCAzOTJlNDRjLi4wYWEzMGQ3IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvQmFuZGVkU2FtcGxlTW9kZWwuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQmFuZGVkU2FtcGxlTW9kZWwuamF2YQpAQCAtMTgsMjQgKzE4LDI2IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBCYW5kZWRTYW1wbGVNb2RlbCBjbGFzcyBwcm92aWRlcyBzYW1wbGVzIG9mIHBpeGVscyBpbiBhbiBpbWFnZSAKLSAqIHdoaWNoIGlzIHN0b3JlZCBpbiBhIGJhbmQgaW50ZXJsZWF2ZWQgbWV0aG9kLiBFYWNoIHBpeGVsJ3Mgc2FtcGxlIAotICogdGFrZXMgb25lIGRhdGEgZWxlbWVudCBvZiB0aGUgRGF0YUJ1ZmZlci4gVGhlIHBpeGVsIHN0cmlkZSBmb3IgYSAKLSAqIEJhbmRlZFNhbXBsZU1vZGVsIGlzIG9uZS4gCisgKiBUaGUgQmFuZGVkU2FtcGxlTW9kZWwgY2xhc3MgcHJvdmlkZXMgc2FtcGxlcyBvZiBwaXhlbHMgaW4gYW4gaW1hZ2Ugd2hpY2ggaXMKKyAqIHN0b3JlZCBpbiBhIGJhbmQgaW50ZXJsZWF2ZWQgbWV0aG9kLiBFYWNoIHBpeGVsJ3Mgc2FtcGxlIHRha2VzIG9uZSBkYXRhCisgKiBlbGVtZW50IG9mIHRoZSBEYXRhQnVmZmVyLiBUaGUgcGl4ZWwgc3RyaWRlIGZvciBhIEJhbmRlZFNhbXBsZU1vZGVsIGlzIG9uZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBCYW5kZWRTYW1wbGVNb2RlbCBleHRlbmRzIENvbXBvbmVudFNhbXBsZU1vZGVsIHsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgdGhlIGluZGljZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIG51bUJhbmRzIHRoZSBudW0gYmFuZHMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnRbXQorICAgICAqIEBwYXJhbSBudW1CYW5kcworICAgICAqICAgICAgICAgICAgdGhlIG51bSBiYW5kcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRbXS4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBjcmVhdGVJbmRpY2VzKGludCBudW1CYW5kcykgewogICAgICAgICBpbnQgaW5kaWNlc1tdID0gbmV3IGludFtudW1CYW5kc107CkBAIC00OCw5ICs1MCw5IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgb2Zmc2V0cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbnVtQmFuZHMgdGhlIG51bSBiYW5kcwotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludFtdCisgICAgICogQHBhcmFtIG51bUJhbmRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtIGJhbmRzLgorICAgICAqIEByZXR1cm4gdGhlIGludFtdLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGludFtdIGNyZWF0ZU9mZnNldHMoaW50IG51bUJhbmRzKSB7CiAgICAgICAgIGludCBvZmZzZXRzW10gPSBuZXcgaW50W251bUJhbmRzXTsKQEAgLTYxLDQxICs2Myw0OCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBCYW5kZWRTYW1wbGVNb2RlbCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIAotICAgICAqIGRhdGEgdHlwZSBvZiBzYW1wbGVzLCB0aGUgd2lkdGgsIGhlaWdodCBhbmQgYmFuZHMgbnVtYmVyCi0gICAgICogb2YgaW1hZ2UgZGF0YS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQmFuZGVkU2FtcGxlTW9kZWwgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBkYXRhIHR5cGUKKyAgICAgKiBvZiBzYW1wbGVzLCB0aGUgd2lkdGgsIGhlaWdodCBhbmQgYmFuZHMgbnVtYmVyIG9mIGltYWdlIGRhdGEuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUgb2Ygc2FtcGxlcy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIG51bUJhbmRzIHRoZSBudW1iZXIgb2YgYmFuZHMuCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlIG9mIHNhbXBsZXMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIG51bUJhbmRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJhbmRzLgogICAgICAqLwogICAgIHB1YmxpYyBCYW5kZWRTYW1wbGVNb2RlbChpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwgaW50IG51bUJhbmRzKSB7Ci0gICAgICAgIHRoaXMoZGF0YVR5cGUsIHcsIGgsIHcsIEJhbmRlZFNhbXBsZU1vZGVsLmNyZWF0ZUluZGljZXMobnVtQmFuZHMpLAotICAgICAgICAgICAgICAgIEJhbmRlZFNhbXBsZU1vZGVsLmNyZWF0ZU9mZnNldHMobnVtQmFuZHMpKTsKKyAgICAgICAgdGhpcyhkYXRhVHlwZSwgdywgaCwgdywgQmFuZGVkU2FtcGxlTW9kZWwuY3JlYXRlSW5kaWNlcyhudW1CYW5kcyksIEJhbmRlZFNhbXBsZU1vZGVsCisgICAgICAgICAgICAgICAgLmNyZWF0ZU9mZnNldHMobnVtQmFuZHMpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQmFuZGVkU2FtcGxlTW9kZWwgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCAKLSAgICAgKiBkYXRhIHR5cGUgb2Ygc2FtcGxlcywgdGhlIHdpZHRoLCBoZWlnaHQgYW5kIGJhbmRzIG51bWJlcgotICAgICAqIG9mIGltYWdlIGRhdGEuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJhbmRlZFNhbXBsZU1vZGVsIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgZGF0YSB0eXBlCisgICAgICogb2Ygc2FtcGxlcywgdGhlIHdpZHRoLCBoZWlnaHQgYW5kIGJhbmRzIG51bWJlciBvZiBpbWFnZSBkYXRhLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0aGUgZGF0YSB0eXBlIG9mIHNhbXBsZXMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZSB0aGUgc2NhbmxpbmUgc3RyaWRlIG9mIHRoZSBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gYmFua0luZGljZXMgdGhlIGFycmF5IG9mIHRoZSBiYW5rIGluZGVjaWVzLgotICAgICAqIEBwYXJhbSBiYW5kT2Zmc2V0cyB0aGUgYXJyYXkgb2YgdGhlIGJhbmQgb2Zmc2V0cy4KKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUgb2Ygc2FtcGxlcy4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gc2NhbmxpbmVTdHJpZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2FubGluZSBzdHJpZGUgb2YgdGhlIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBiYW5rSW5kaWNlcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHRoZSBiYW5rIGluZGljZXMuCisgICAgICogQHBhcmFtIGJhbmRPZmZzZXRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgdGhlIGJhbmQgb2Zmc2V0cy4KICAgICAgKi8KLSAgICBwdWJsaWMgQmFuZGVkU2FtcGxlTW9kZWwoaW50IGRhdGFUeXBlLCBpbnQgdywgaW50IGgsIGludCBzY2FubGluZVN0cmlkZSwKLSAgICAgICAgICAgIGludCBiYW5rSW5kaWNlc1tdLCBpbnQgYmFuZE9mZnNldHNbXSkgeworICAgIHB1YmxpYyBCYW5kZWRTYW1wbGVNb2RlbChpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwgaW50IHNjYW5saW5lU3RyaWRlLCBpbnQgYmFua0luZGljZXNbXSwKKyAgICAgICAgICAgIGludCBiYW5kT2Zmc2V0c1tdKSB7CiAgICAgICAgIHN1cGVyKGRhdGFUeXBlLCB3LCBoLCAxLCBzY2FubGluZVN0cmlkZSwgYmFua0luZGljZXMsIGJhbmRPZmZzZXRzKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU2FtcGxlTW9kZWwgY3JlYXRlQ29tcGF0aWJsZVNhbXBsZU1vZGVsKGludCB3LCBpbnQgaCkgewotICAgICAgICByZXR1cm4gbmV3IEJhbmRlZFNhbXBsZU1vZGVsKGRhdGFUeXBlLCB3LCBoLCB3LCBiYW5rSW5kaWNlcywKLSAgICAgICAgICAgICAgICBiYW5kT2Zmc2V0cyk7CisgICAgICAgIHJldHVybiBuZXcgQmFuZGVkU2FtcGxlTW9kZWwoZGF0YVR5cGUsIHcsIGgsIHcsIGJhbmtJbmRpY2VzLCBiYW5kT2Zmc2V0cyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMDQsMjIgKzExMywyMiBAQAogICAgICAgICBpbnQgc2l6ZSA9IHNjYW5saW5lU3RyaWRlICogaGVpZ2h0OwogCiAgICAgICAgIHN3aXRjaCAoZGF0YVR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckJ5dGUoc2l6ZSwgbnVtQmFua3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOgotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJTaG9ydChzaXplLCBudW1CYW5rcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVySW50KHNpemUsIG51bUJhbmtzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDoKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckZsb2F0KHNpemUsIG51bUJhbmtzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJEb3VibGUoc2l6ZSwgbnVtQmFua3MpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckJ5dGUoc2l6ZSwgbnVtQmFua3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyU2hvcnQoc2l6ZSwgbnVtQmFua3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckludChzaXplLCBudW1CYW5rcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJGbG9hdChzaXplLCBudW1CYW5rcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyRG91YmxlKHNpemUsIG51bUJhbmtzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBkYXRhOwpAQCAtMTI5LDcgKzEzOCw4IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNhbXBsZU1vZGVsIGNyZWF0ZVN1YnNldFNhbXBsZU1vZGVsKGludFtdIGJhbmRzKSB7CiAgICAgICAgIGlmIChiYW5kcy5sZW5ndGggPiBudW1CYW5kcykgewotICAgICAgICAgICAgLy8gYXd0LjY0PVRoZSBudW1iZXIgb2YgdGhlIGJhbmRzIGluIHRoZSBzdWJzZXQgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgYmFuZHMgaW4gdGhlIHNhbXBsZSBtb2RlbAorICAgICAgICAgICAgLy8gYXd0LjY0PVRoZSBudW1iZXIgb2YgdGhlIGJhbmRzIGluIHRoZSBzdWJzZXQgaXMgZ3JlYXRlciB0aGFuIHRoZQorICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGJhbmRzIGluIHRoZSBzYW1wbGUgbW9kZWwKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjQiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCkBAIC0xNDEsOTQgKzE1MSw5MyBAQAogICAgICAgICAgICAgb2Zmc2V0c1tpXSA9IGJhbmRPZmZzZXRzW2JhbmRzW2ldXTsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBuZXcgQmFuZGVkU2FtcGxlTW9kZWwoZGF0YVR5cGUsIHdpZHRoLCBoZWlnaHQsIHNjYW5saW5lU3RyaWRlLAotICAgICAgICAgICAgICAgIGluZGljZXMsIG9mZnNldHMpOworICAgICAgICByZXR1cm4gbmV3IEJhbmRlZFNhbXBsZU1vZGVsKGRhdGFUeXBlLCB3aWR0aCwgaGVpZ2h0LCBzY2FubGluZVN0cmlkZSwgaW5kaWNlcywgb2Zmc2V0cyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBnZXREYXRhRWxlbWVudHMoaW50IHgsIGludCB5LCBPYmplY3Qgb2JqLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgc3dpdGNoIChkYXRhVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOiB7Ci0gICAgICAgICAgICBieXRlIGJkYXRhW107CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOiB7CisgICAgICAgICAgICAgICAgYnl0ZSBiZGF0YVtdOwogCi0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiZGF0YSA9IG5ldyBieXRlW251bUJhbmRzXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmRhdGEgPSAoYnl0ZVtdKSBvYmo7CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJkYXRhID0gbmV3IGJ5dGVbbnVtQmFuZHNdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJkYXRhID0gKGJ5dGVbXSlvYmo7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJkYXRhW2ldID0gKGJ5dGUpZ2V0U2FtcGxlKHgsIHksIGksIGRhdGEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9iaiA9IGJkYXRhOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6IHsKKyAgICAgICAgICAgICAgICBzaG9ydCBzZGF0YVtdOwogCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBiZGF0YVtpXSA9IChieXRlKSBnZXRTYW1wbGUoeCwgeSwgaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNkYXRhID0gbmV3IHNob3J0W251bUJhbmRzXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZGF0YSA9IChzaG9ydFtdKW9iajsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2RhdGFbaV0gPSAoc2hvcnQpZ2V0U2FtcGxlKHgsIHksIGksIGRhdGEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9iaiA9IHNkYXRhOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOiB7CisgICAgICAgICAgICAgICAgaW50IGlkYXRhW107CiAKLSAgICAgICAgICAgIG9iaiA9IGJkYXRhOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDogewotICAgICAgICAgICAgc2hvcnQgc2RhdGFbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWRhdGEgPSBuZXcgaW50W251bUJhbmRzXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZGF0YSA9IChpbnRbXSlvYmo7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZGF0YSA9IG5ldyBzaG9ydFtudW1CYW5kc107Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNkYXRhID0gKHNob3J0W10pIG9iajsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWRhdGFbaV0gPSBnZXRTYW1wbGUoeCwgeSwgaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgb2JqID0gaWRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDogeworICAgICAgICAgICAgICAgIGZsb2F0IGZkYXRhW107CiAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgewotICAgICAgICAgICAgICAgIHNkYXRhW2ldID0gKHNob3J0KSBnZXRTYW1wbGUoeCwgeSwgaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZkYXRhID0gbmV3IGZsb2F0W251bUJhbmRzXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmZGF0YSA9IChmbG9hdFtdKW9iajsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmRhdGFbaV0gPSBnZXRTYW1wbGVGbG9hdCh4LCB5LCBpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvYmogPSBmZGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRTogeworICAgICAgICAgICAgICAgIGRvdWJsZSBkZGF0YVtdOwogCi0gICAgICAgICAgICBvYmogPSBzZGF0YTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDogewotICAgICAgICAgICAgaW50IGlkYXRhW107CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRkYXRhID0gbmV3IGRvdWJsZVtudW1CYW5kc107CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGRhdGEgPSAoZG91YmxlW10pb2JqOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWRhdGEgPSBuZXcgaW50W251bUJhbmRzXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWRhdGEgPSAoaW50W10pIG9iajsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZGRhdGFbaV0gPSBnZXRTYW1wbGVEb3VibGUoeCwgeSwgaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgb2JqID0gZGRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgewotICAgICAgICAgICAgICAgIGlkYXRhW2ldID0gZ2V0U2FtcGxlKHgsIHksIGksIGRhdGEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvYmogPSBpZGF0YTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOiB7Ci0gICAgICAgICAgICBmbG9hdCBmZGF0YVtdOwotCi0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmZGF0YSA9IG5ldyBmbG9hdFtudW1CYW5kc107Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZkYXRhID0gKGZsb2F0W10pIG9iajsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmRhdGFbaV0gPSBnZXRTYW1wbGVGbG9hdCh4LCB5LCBpLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2JqID0gZmRhdGE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6IHsKLSAgICAgICAgICAgIGRvdWJsZSBkZGF0YVtdOwotCi0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkZGF0YSA9IG5ldyBkb3VibGVbbnVtQmFuZHNdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZGF0YSA9IChkb3VibGVbXSkgb2JqOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkZGF0YVtpXSA9IGdldFNhbXBsZURvdWJsZSh4LCB5LCBpLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2JqID0gZGRhdGE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIG9iajsKQEAgLTI1Nyw4ICsyNjYsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGRhdGEuZ2V0RWxlbShiYW5rSW5kaWNlc1tiXSwgeSAqIHNjYW5saW5lU3RyaWRlICsgeCArCi0gICAgICAgICAgICAgICBiYW5kT2Zmc2V0c1tiXSk7CisgICAgICAgIHJldHVybiBkYXRhLmdldEVsZW0oYmFua0luZGljZXNbYl0sIHkgKiBzY2FubGluZVN0cmlkZSArIHggKyBiYW5kT2Zmc2V0c1tiXSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yNjgsOCArMjc2LDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBkYXRhLmdldEVsZW1Eb3VibGUoYmFua0luZGljZXNbYl0sIHkgKiBzY2FubGluZVN0cmlkZSArIHggKwotICAgICAgICAgICAgICAgYmFuZE9mZnNldHNbYl0pOworICAgICAgICByZXR1cm4gZGF0YS5nZXRFbGVtRG91YmxlKGJhbmtJbmRpY2VzW2JdLCB5ICogc2NhbmxpbmVTdHJpZGUgKyB4ICsgYmFuZE9mZnNldHNbYl0pOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjc5LDEzICsyODYsMTEgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBkYXRhLmdldEVsZW1GbG9hdChiYW5rSW5kaWNlc1tiXSwgeSAqIHNjYW5saW5lU3RyaWRlICsgeCArCi0gICAgICAgICAgICAgICBiYW5kT2Zmc2V0c1tiXSk7CisgICAgICAgIHJldHVybiBkYXRhLmdldEVsZW1GbG9hdChiYW5rSW5kaWNlc1tiXSwgeSAqIHNjYW5saW5lU3RyaWRlICsgeCArIGJhbmRPZmZzZXRzW2JdKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50W10gZ2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGludCBpQXJyYXlbXSwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSkgeworICAgIHB1YmxpYyBpbnRbXSBnZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwgaW50IGlBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaW50IHNhbXBsZXNbXTsKICAgICAgICAgaW50IGlkeCA9IDA7CiAKQEAgLTMxNyw0MSArMzIyLDQxIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RGF0YUVsZW1lbnRzKGludCB4LCBpbnQgeSwgT2JqZWN0IG9iaiwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIHN3aXRjaCAoZGF0YVR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGJ5dGUgYmRhdGFbXSA9IChieXRlW10pIG9iajsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgewotICAgICAgICAgICAgICAgIHNldFNhbXBsZSh4LCB5LCBpLCBiZGF0YVtpXSAmIDB4ZmYsIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGJ5dGUgYmRhdGFbXSA9IChieXRlW10pb2JqOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzZXRTYW1wbGUoeCwgeSwgaSwgYmRhdGFbaV0gJiAweGZmLCBkYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIHNob3J0IHNkYXRhW10gPSAoc2hvcnRbXSkgb2JqOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2V0U2FtcGxlKHgsIHksIGksIHNkYXRhW2ldICYgMHhmZmZmLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgc2hvcnQgc2RhdGFbXSA9IChzaG9ydFtdKW9iajsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0U2FtcGxlKHgsIHksIGksIHNkYXRhW2ldICYgMHhmZmZmLCBkYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgaW50IGlkYXRhW10gPSAoaW50W10pIG9iajsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgewotICAgICAgICAgICAgICAgIHNldFNhbXBsZSh4LCB5LCBpLCBpZGF0YVtpXSwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpbnQgaWRhdGFbXSA9IChpbnRbXSlvYmo7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFNhbXBsZSh4LCB5LCBpLCBpZGF0YVtpXSwgZGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgotICAgICAgICAgICAgZmxvYXQgZmRhdGFbXSA9IChmbG9hdFtdKSBvYmo7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzZXRTYW1wbGUoeCwgeSwgaSwgZmRhdGFbaV0sIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICBmbG9hdCBmZGF0YVtdID0gKGZsb2F0W10pb2JqOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzZXRTYW1wbGUoeCwgeSwgaSwgZmRhdGFbaV0sIGRhdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBkb3VibGUgZGRhdGFbXSA9IChkb3VibGVbXSkgb2JqOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2V0U2FtcGxlKHgsIHksIGksIGRkYXRhW2ldLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIGRvdWJsZSBkZGF0YVtdID0gKGRvdWJsZVtdKW9iajsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0U2FtcGxlKHgsIHksIGksIGRkYXRhW2ldLCBkYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM2Myw4ICszNjgsNyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGlBcnJheVtdLAotICAgICAgICAgICAgRGF0YUJ1ZmZlciBkYXRhKSB7CisgICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgaUFycmF5W10sIERhdGFCdWZmZXIgZGF0YSkgewogICAgICAgICBpbnQgaWR4ID0gMDsKIAogICAgICAgICBmb3IgKGludCBpID0geTsgaSA8IHkgKyBoOyBpKyspIHsKQEAgLTM4Myw4ICszODcsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgZGF0YS5zZXRFbGVtRG91YmxlKGJhbmtJbmRpY2VzW2JdLCB5ICogc2NhbmxpbmVTdHJpZGUgKyB4ICsKLSAgICAgICAgICAgICAgIGJhbmRPZmZzZXRzW2JdLCBzKTsKKyAgICAgICAgZGF0YS5zZXRFbGVtRG91YmxlKGJhbmtJbmRpY2VzW2JdLCB5ICogc2NhbmxpbmVTdHJpZGUgKyB4ICsgYmFuZE9mZnNldHNbYl0sIHMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMzk0LDggKzM5Nyw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBkYXRhLnNldEVsZW1GbG9hdChiYW5rSW5kaWNlc1tiXSwgeSAqIHNjYW5saW5lU3RyaWRlICsgeCArCi0gICAgICAgICAgICAgICBiYW5kT2Zmc2V0c1tiXSwgcyk7CisgICAgICAgIGRhdGEuc2V0RWxlbUZsb2F0KGJhbmtJbmRpY2VzW2JdLCB5ICogc2NhbmxpbmVTdHJpZGUgKyB4ICsgYmFuZE9mZnNldHNbYl0sIHMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNDA1LDEzICs0MDcsMTEgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIGRhdGEuc2V0RWxlbShiYW5rSW5kaWNlc1tiXSwgeSAqIHNjYW5saW5lU3RyaWRlICsgeCArCi0gICAgICAgICAgICAgICAgICAgICAgIGJhbmRPZmZzZXRzW2JdLCBzKTsKKyAgICAgICAgZGF0YS5zZXRFbGVtKGJhbmtJbmRpY2VzW2JdLCB5ICogc2NhbmxpbmVTdHJpZGUgKyB4ICsgYmFuZE9mZnNldHNbYl0sIHMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLCBpbnQgaUFycmF5W10sCi0gICAgICAgICAgICBEYXRhQnVmZmVyIGRhdGEpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwgaW50IGlBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaW50IGlkeCA9IDA7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IHk7IGkgPCB5ICsgaDsgaSsrKSB7CkBAIC00MjMsNCArNDIzLDMgQEAKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0J1ZmZlclN0cmF0ZWd5LmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQnVmZmVyU3RyYXRlZ3kuamF2YQppbmRleCBlMDUwOGYwLi4zYzg3NzlkIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvQnVmZmVyU3RyYXRlZ3kuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQnVmZmVyU3RyYXRlZ3kuamF2YQpAQCAtMTgsMzUgKzE4LDM3IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEuYXd0LkJ1ZmZlckNhcGFiaWxpdGllczsKIGltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKIAogLyoqCi0gKiBUaGUgQnVmZmVyU3RyYXRlZ3kgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgYW4gb3Bwb3J0dW5pdHkgCi0gKiB0byBvcmdhbml6ZSB0aGUgYnVmZmVycyBmb3IgYSBDYW52YXMgb3IgV2luZG93LiBUaGUgQnVmZmVyU3RyYXRlZ3kKLSAqIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24gaGFyZHdhcmUgYW5kIHNvZnR3YXJlIGxpbWl0YXRpb25zLgotICogVGhlc2UgbGltaXRhdGlvbnMgYXJlIGRldGVjdGlibGUgdGhyb3VnaCB0aGUgY2FwYWJpbGl0aWVzIAotICogb2JqZWN0IHdoaWNoIGNhbiBiZSBvYnRhaW5lZCBieSB0aGUgR3JhcGhpY3NDb25maWd1cmF0aW9uIG9mIHRoZSBDYW52YXMgCi0gKiBvciBXaW5kb3cuCisgKiBUaGUgQnVmZmVyU3RyYXRlZ3kgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgYW4gb3Bwb3J0dW5pdHkgdG8gb3JnYW5pemUgdGhlCisgKiBidWZmZXJzIGZvciBhIENhbnZhcyBvciBXaW5kb3cuIFRoZSBCdWZmZXJTdHJhdGVneSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRzIG9uCisgKiBoYXJkd2FyZSBhbmQgc29mdHdhcmUgbGltaXRhdGlvbnMuIFRoZXNlIGxpbWl0YXRpb25zIGFyZSBkZXRlY3RhYmxlIHRocm91Z2gKKyAqIHRoZSBjYXBhYmlsaXRpZXMgb2JqZWN0IHdoaWNoIGNhbiBiZSBvYnRhaW5lZCBieSB0aGUgR3JhcGhpY3NDb25maWd1cmF0aW9uIG9mCisgKiB0aGUgQ2FudmFzIG9yIFdpbmRvdy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCdWZmZXJTdHJhdGVneSB7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRyYXdpbmcgYnVmZmVyIHdhcyBsb3N0IHNpbmNlIHRoZSBsYXN0IGNhbGwgCi0gICAgICogb2YgZ2V0RHJhd0dyYXBoaWNzLiAKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRyYXdpbmcgYnVmZmVyIHdhcyBsb3N0IHNpbmNlIHRoZSBsYXN0IGNhbGwgb2YKKyAgICAgKiBnZXREcmF3R3JhcGhpY3MuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkcmF3aW5nIGJ1ZmZlciB3YXMgbG9zdCBzaW5jZSB0aGUgbGFzdCBjYWxsIAotICAgICAqIG9mIGdldERyYXdHcmFwaGljcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZHJhd2luZyBidWZmZXIgd2FzIGxvc3Qgc2luY2UgdGhlIGxhc3QgY2FsbCBvZgorICAgICAqICAgICAgICAgZ2V0RHJhd0dyYXBoaWNzLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY29udGVudHNMb3N0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRyYXdpbmcgYnVmZmVyIGlzIHJlc3RvcmVkIGZyb20gYSBsb3N0IHN0YXRlLiAKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRyYXdpbmcgYnVmZmVyIGlzIHJlc3RvcmVkIGZyb20gYSBsb3N0IHN0YXRlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZHJhd2luZyBidWZmZXIgaXMgcmVzdG9yZWQgZnJvbSBhIGxvc3Qgc3RhdGUsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZHJhd2luZyBidWZmZXIgaXMgcmVzdG9yZWQgZnJvbSBhIGxvc3Qgc3RhdGUsIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY29udGVudHNSZXN0b3JlZCgpOwogCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvQnVmZmVyZWRJbWFnZS5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0J1ZmZlcmVkSW1hZ2UuamF2YQppbmRleCBkMzA1ZDY2Li5jOWQ1OGQ5IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvQnVmZmVyZWRJbWFnZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9CdWZmZXJlZEltYWdlLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXd0LkFuZHJvaWRHcmFwaGljczJEOwpAQCAtMzksMTg0ICs0MCwyMTUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmdsLmltYWdlLkJ1ZmZlcmVkSW1hZ2VTb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKLQogLyoqCi0gKiBUaGUgQnVmZmVyZWRJbWFnZSBjbGFzcyBkZXNjcmliZXMgYW4gSW1hZ2Ugd2hpY2ggY29udGFpbnMgYSBidWZmZXIgCi0gKiBvZiBpbWFnZSBkYXRhIGFuZCBpbmNsdWRlcyBhIENvbG9yTW9kZWwgYW5kIGEgUmFzdGVyIGZvciB0aGlzIGRhdGEuCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIG1ldGhvZHMgZm9yIG9idGFpbmluZyBhbmQgc2V0dGluZyB0aGUgUmFzdGVyCi0gKiBhbmQgZm9yIG1hbmlwdWxhdGluZyB0aGUgQ29sb3JNb2RlbCBwYXJhbWV0ZXJzLgorICogVGhlIEJ1ZmZlcmVkSW1hZ2UgY2xhc3MgZGVzY3JpYmVzIGFuIEltYWdlIHdoaWNoIGNvbnRhaW5zIGEgYnVmZmVyIG9mIGltYWdlCisgKiBkYXRhIGFuZCBpbmNsdWRlcyBhIENvbG9yTW9kZWwgYW5kIGEgUmFzdGVyIGZvciB0aGlzIGRhdGEuIFRoaXMgY2xhc3MKKyAqIHByb3ZpZGVzIG1ldGhvZHMgZm9yIG9idGFpbmluZyBhbmQgc2V0dGluZyB0aGUgUmFzdGVyIGFuZCBmb3IgbWFuaXB1bGF0aW5nCisgKiB0aGUgQ29sb3JNb2RlbCBwYXJhbWV0ZXJzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwotcHVibGljIGNsYXNzIEJ1ZmZlcmVkSW1hZ2UgZXh0ZW5kcyAKLUltYWdlIGltcGxlbWVudHMgV3JpdGFibGVSZW5kZXJlZEltYWdlLCBUcmFuc3BhcmVuY3l7CitwdWJsaWMgY2xhc3MgQnVmZmVyZWRJbWFnZSBleHRlbmRzIEltYWdlIGltcGxlbWVudHMgV3JpdGFibGVSZW5kZXJlZEltYWdlLCBUcmFuc3BhcmVuY3kgewogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0NVU1RPTSBpbmRpY2F0ZXMgdGhhdCBJbWFnZSB0eXBlIAotICAgICAqIGlzIHVua25vd24uIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0NVU1RPTSBpbmRpY2F0ZXMgdGhhdCBJbWFnZSB0eXBlIGlzIHVua25vd24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9DVVNUT00gPSAwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0lOVF9SR0IgaW5kaWNhdGVzIGFuIGltYWdlIHdpdGggCi0gICAgICogOCBiaXQgUkdCIGNvbG9yIGNvbXBvbmVudHMsIGl0IGhhcyBhIERpcmVjdENvbG9yTW9kZWwgCi0gICAgICogd2l0aG91dCBhbHBoYS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfSU5UX1JHQiBpbmRpY2F0ZXMgYW4gaW1hZ2Ugd2l0aCA4IGJpdCBSR0IgY29sb3IKKyAgICAgKiBjb21wb25lbnRzLCBpdCBoYXMgYSBEaXJlY3RDb2xvck1vZGVsIHdpdGhvdXQgYWxwaGEuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JTlRfUkdCID0gMTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9JTlRfQVJHQiBpbmRpY2F0ZXMgYW4gaW1hZ2Ugd2l0aCAKLSAgICAgKiA4IGJpdCBSR0JBIGNvbG9yIGNvbXBvbmVudHMsIGl0IGhhcyBhIERpcmVjdENvbG9yTW9kZWwgCi0gICAgICogd2l0aCBhbHBoYS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfSU5UX0FSR0IgaW5kaWNhdGVzIGFuIGltYWdlIHdpdGggOCBiaXQgUkdCQSBjb2xvcgorICAgICAqIGNvbXBvbmVudHMsIGl0IGhhcyBhIERpcmVjdENvbG9yTW9kZWwgd2l0aCBhbHBoYS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0lOVF9BUkdCID0gMjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9JTlRfQVJHQl9QUkUgaW5kaWNhdGVzIGFuIGltYWdlIHdpdGggCi0gICAgICogOCBiaXQgUkdCQSBjb2xvciBjb21wb25lbnRzLCBpdCBoYXMgYSBEaXJlY3RDb2xvck1vZGVsIAotICAgICAqIHdpdGggYWxwaGEsIGFuZCBpbWFnZSBkYXRhIGlzIHByZW11bHRpcGxpZWQgYnkgYWxwaGEuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0lOVF9BUkdCX1BSRSBpbmRpY2F0ZXMgYW4gaW1hZ2Ugd2l0aCA4IGJpdCBSR0JBIGNvbG9yCisgICAgICogY29tcG9uZW50cywgaXQgaGFzIGEgRGlyZWN0Q29sb3JNb2RlbCB3aXRoIGFscGhhLCBhbmQgaW1hZ2UgZGF0YSBpcworICAgICAqIHByZS1tdWx0aXBsaWVkIGJ5IGFscGhhLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSU5UX0FSR0JfUFJFID0gMzsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9JTlRfQkdSIGluZGljYXRlcyBhbiBpbWFnZSB3aXRoIAotICAgICAqIDggYml0IFJHQiBjb2xvciBjb21wb25lbnRzLCBCR1IgY29sb3IgbW9kZWwgCi0gICAgICogKHdpdGggdGhlIGNvbG9ycyBCbHVlLCBHcmVlbiwgYW5kIFJlZCkuIFRoZXJlIGlzIG5vIAotICAgICAqIGFscGhhLiBUaGUgaW1hZ2UgaGFzIGEgRGlyZWN0Q29sb3JNb2RlbC4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfSU5UX0JHUiBpbmRpY2F0ZXMgYW4gaW1hZ2Ugd2l0aCA4IGJpdCBSR0IgY29sb3IKKyAgICAgKiBjb21wb25lbnRzLCBCR1IgY29sb3IgbW9kZWwgKHdpdGggdGhlIGNvbG9ycyBCbHVlLCBHcmVlbiwgYW5kIFJlZCkuIFRoZXJlCisgICAgICogaXMgbm8gYWxwaGEuIFRoZSBpbWFnZSBoYXMgYSBEaXJlY3RDb2xvck1vZGVsLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSU5UX0JHUiA9IDQ7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRZUEVfM0JZVEVfQkdSIGluZGljYXRlcyBhbiBpbWFnZSB3aXRoIAotICAgICAqIDggYml0IFJHQiBjb2xvciBjb21wb25lbnRzLCBCR1IgY29sb3IgbW9kZWwgCi0gICAgICogKHdpdGggdGhlIGNvbG9ycyBCbHVlLCBHcmVlbiwgYW5kIFJlZCBzdG9yZWQgaW4gMyBieXRlcykuIAotICAgICAqIFRoZXJlIGlzIG5vIGFscGhhLiBUaGUgaW1hZ2UgaGFzIGEgQ29tcG9uZW50Q29sb3JNb2RlbC4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfM0JZVEVfQkdSIGluZGljYXRlcyBhbiBpbWFnZSB3aXRoIDggYml0IFJHQiBjb2xvcgorICAgICAqIGNvbXBvbmVudHMsIEJHUiBjb2xvciBtb2RlbCAod2l0aCB0aGUgY29sb3JzIEJsdWUsIEdyZWVuLCBhbmQgUmVkIHN0b3JlZAorICAgICAqIGluIDMgYnl0ZXMpLiBUaGVyZSBpcyBubyBhbHBoYS4gVGhlIGltYWdlIGhhcyBhIENvbXBvbmVudENvbG9yTW9kZWwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV8zQllURV9CR1IgPSA1OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUWVBFXzRCWVRFX0FCR1IgaW5kaWNhdGVzIGFuIGltYWdlIHdpdGggCi0gICAgICogOCBiaXQgUkdCQSBjb2xvciBjb21wb25lbnRzIHN0b3JlZCBpbiAzIGJ5dGVzIGFuZCAxIGJ5dGUgb2YgYWxwaGEuCi0gICAgICogSXQgaGFzIGEgQ29tcG9uZW50Q29sb3JNb2RlbCB3aXRoIGFscGhhLiAgCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfNEJZVEVfQUJHUiBpbmRpY2F0ZXMgYW4gaW1hZ2Ugd2l0aCA4IGJpdCBSR0JBIGNvbG9yCisgICAgICogY29tcG9uZW50cyBzdG9yZWQgaW4gMyBieXRlcyBhbmQgMSBieXRlIG9mIGFscGhhLiBJdCBoYXMgYQorICAgICAqIENvbXBvbmVudENvbG9yTW9kZWwgd2l0aCBhbHBoYS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFXzRCWVRFX0FCR1IgPSA2OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUWVBFXzRCWVRFX0FCR1JfUFJFIGluZGljYXRlcyBhbiBpbWFnZSB3aXRoIAotICAgICAqIDggYml0IFJHQkEgY29sb3IgY29tcG9uZW50cyBzdG9yZWQgaW4gMyBieXRlcyBhbmQgMSBieXRlIAotICAgICAqIGZvciBhbHBoYS4gVGhlIGltYWdlIGhhcyBhIENvbXBvbmVudENvbG9yTW9kZWwgd2l0aCBhbHBoYS4gCi0gICAgICogVGhlIGNvbG9yIGRhdGEgaXMgcHJlbXVsdGlwbGllZCB3aXRoIGFscGhhLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFXzRCWVRFX0FCR1JfUFJFIGluZGljYXRlcyBhbiBpbWFnZSB3aXRoIDggYml0IFJHQkEgY29sb3IKKyAgICAgKiBjb21wb25lbnRzIHN0b3JlZCBpbiAzIGJ5dGVzIGFuZCAxIGJ5dGUgZm9yIGFscGhhLiBUaGUgaW1hZ2UgaGFzIGEKKyAgICAgKiBDb21wb25lbnRDb2xvck1vZGVsIHdpdGggYWxwaGEuIFRoZSBjb2xvciBkYXRhIGlzIHByZS1tdWx0aXBsaWVkIHdpdGgKKyAgICAgKiBhbHBoYS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFXzRCWVRFX0FCR1JfUFJFID0gNzsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9VU0hPUlRfNTY1X1JHQiBpbmRpY2F0ZXMgYW4gaW1hZ2Ugd2l0aCAKLSAgICAgKiA1NjUgUkdCIGNvbG9yIGNvbXBvbmVudHMgKDUtYml0cyByZWQsIDYtYml0cyBncmVlbiwgNS1iaXRzIGJsdWUpIAotICAgICAqIHdpdGggbm8gYWxwaGEuIFRoaXMgaW1hZ2UgaGFzIGEgRGlyZWN0Q29sb3JNb2RlbC4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfVVNIT1JUXzU2NV9SR0IgaW5kaWNhdGVzIGFuIGltYWdlIHdpdGggNTY1IFJHQiBjb2xvcgorICAgICAqIGNvbXBvbmVudHMgKDUtYml0cyByZWQsIDYtYml0cyBncmVlbiwgNS1iaXRzIGJsdWUpIHdpdGggbm8gYWxwaGEuIFRoaXMKKyAgICAgKiBpbWFnZSBoYXMgYSBEaXJlY3RDb2xvck1vZGVsLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVVNIT1JUXzU2NV9SR0IgPSA4OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUWVBFX1VTSE9SVF81NTVfUkdCIGluZGljYXRlcyBhbiBpbWFnZSB3aXRoIAotICAgICAqIDU1NSBSR0IgY29sb3IgY29tcG9uZW50cyAoNS1iaXRzIHJlZCwgNS1iaXRzIGdyZWVuLCA1LWJpdHMgYmx1ZSkgCi0gICAgICogd2l0aCBubyBhbHBoYS4gVGhpcyBpbWFnZSBoYXMgYSBEaXJlY3RDb2xvck1vZGVsLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9VU0hPUlRfNTU1X1JHQiBpbmRpY2F0ZXMgYW4gaW1hZ2Ugd2l0aCA1NTUgUkdCIGNvbG9yCisgICAgICogY29tcG9uZW50cyAoNS1iaXRzIHJlZCwgNS1iaXRzIGdyZWVuLCA1LWJpdHMgYmx1ZSkgd2l0aCBubyBhbHBoYS4gVGhpcworICAgICAqIGltYWdlIGhhcyBhIERpcmVjdENvbG9yTW9kZWwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9VU0hPUlRfNTU1X1JHQiA9IDk7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRZUEVfQllURV9HUkFZIGluZGljYXRlcyBhIHVuc2lnbmVkIGJ5dGUgCi0gICAgICogaW1hZ2UuIFRoaXMgaW1hZ2UgaGFzIGEgQ29tcG9uZW50Q29sb3JNb2RlbCB3aXRoIAotICAgICAqIGEgQ1NfR1JBWSBDb2xvclNwYWNlLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9CWVRFX0dSQVkgaW5kaWNhdGVzIGEgdW5zaWduZWQgYnl0ZSBpbWFnZS4gVGhpcyBpbWFnZQorICAgICAqIGhhcyBhIENvbXBvbmVudENvbG9yTW9kZWwgd2l0aCBhIENTX0dSQVkgQ29sb3JTcGFjZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0JZVEVfR1JBWSA9IDEwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUWVBFX1VTSE9SVF9HUkFZIGluZGljYXRlcyBhbiB1bnNpZ25lZCBzaG9ydCAKLSAgICAgKiBpbWFnZS4gVGhpcyBpbWFnZSBoYXMgYSBDb21wb25lbnRDb2xvck1vZGVsIHdpdGggYSBDU19HUkFZIAotICAgICAqIENvbG9yU3BhY2UuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX1VTSE9SVF9HUkFZIGluZGljYXRlcyBhbiB1bnNpZ25lZCBzaG9ydCBpbWFnZS4gVGhpcworICAgICAqIGltYWdlIGhhcyBhIENvbXBvbmVudENvbG9yTW9kZWwgd2l0aCBhIENTX0dSQVkgQ29sb3JTcGFjZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1VTSE9SVF9HUkFZID0gMTE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRZUEVfQllURV9CSU5BUlkgaW5kaWNhdGVzIGFuIG9wYXF1ZSBieXRlLXBhY2tlZAotICAgICAqIDEsIDIgb3IgNCBiaXQgaW1hZ2UuIFRoZSBpbWFnZSBoYXMgYW4gSW5kZXhDb2xvck1vZGVsIHdpdGhvdXQgCi0gICAgICogYWxwaGEuICAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9CWVRFX0JJTkFSWSBpbmRpY2F0ZXMgYW4gb3BhcXVlIGJ5dGUtcGFja2VkIDEsIDIgb3IgNAorICAgICAqIGJpdCBpbWFnZS4gVGhlIGltYWdlIGhhcyBhbiBJbmRleENvbG9yTW9kZWwgd2l0aG91dCBhbHBoYS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0JZVEVfQklOQVJZID0gMTI7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRZUEVfQllURV9JTkRFWEVEIGluZGljYXRlcyBhbiBpbmRleGVkIGJ5dGUgaW1hZ2UuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0JZVEVfSU5ERVhFRCBpbmRpY2F0ZXMgYW4gaW5kZXhlZCBieXRlIGltYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQllURV9JTkRFWEVEID0gMTM7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEFMUEhBX01BU0suICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEFMUEhBX01BU0suCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFMUEhBX01BU0sgPSAweGZmMDAwMDAwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBSRURfTUFTSy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUkVEX01BU0suCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFRF9NQVNLID0gMHgwMGZmMDAwMDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgR1JFRU5fTUFTSy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgR1JFRU5fTUFTSy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JFRU5fTUFTSyA9IDB4MDAwMGZmMDA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEJMVUVfTUFTSy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQkxVRV9NQVNLLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCTFVFX01BU0sgPSAweDAwMDAwMGZmOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBSRURfQkdSX01BU0suICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFJFRF9CR1JfTUFTSy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVEX0JHUl9NQVNLID0gMHgwMDAwMDBmZjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgR1JFRU5fQkdSX01BU0suICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEdSRUVOX0JHUl9NQVNLLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUkVFTl9CR1JfTUFTSyA9IDB4MDAwMGZmMDA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEJMVUVfQkdSX01BU0suICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEJMVUVfQkdSX01BU0suCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJMVUVfQkdSX01BU0sgPSAweDAwZmYwMDAwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBSRURfNTY1X01BU0suICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFJFRF81NjVfTUFTSy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVEXzU2NV9NQVNLID0gMHhmODAwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBHUkVFTl81NjVfTUFTSy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgR1JFRU5fNTY1X01BU0suCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSRUVOXzU2NV9NQVNLID0gMHgwN2UwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBCTFVFXzU2NV9NQVNLLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBCTFVFXzU2NV9NQVNLLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCTFVFXzU2NV9NQVNLID0gMHgwMDFmOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBSRURfNTU1X01BU0suICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFJFRF81NTVfTUFTSy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVEXzU1NV9NQVNLID0gMHg3YzAwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBHUkVFTl81NTVfTUFTSy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgR1JFRU5fNTU1X01BU0suCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSRUVOXzU1NV9NQVNLID0gMHgwM2UwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBCTFVFXzU1NV9NQVNLLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBCTFVFXzU1NV9NQVNLLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCTFVFXzU1NV9NQVNLID0gMHgwMDFmOwogCi0gICAgLyoqIFRoZSBjbS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY20uCisgICAgICovCiAgICAgcHJpdmF0ZSBDb2xvck1vZGVsIGNtOwogCi0gICAgLyoqIFRoZSByYXN0ZXIuICovCisgICAgLyoqCisgICAgICogVGhlIHJhc3Rlci4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIFdyaXRhYmxlUmFzdGVyIHJhc3RlcjsKIAotICAgIC8qKiBUaGUgaW1hZ2UgdHlwZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaW1hZ2UgdHlwZS4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIGludCBpbWFnZVR5cGU7CiAKLSAgICAvKiogVGhlIHByb3BlcnRpZXMuICovCisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnRpZXMuCisgICAgICovCiAgICAgcHJpdmF0ZSBIYXNodGFibGU8PywgPz4gcHJvcGVydGllczsKIAotICAgIC8vIFN1cmZhY2Ugb2YgdGhlIEJ1ZmZlcmVkIEltYWdlIC0gdXNlZCBmb3IgYmxpdHRpbmcgb25lIEJ1ZmZlcmVkIEltYWdlIAorICAgIC8vIFN1cmZhY2Ugb2YgdGhlIEJ1ZmZlcmVkIEltYWdlIC0gdXNlZCBmb3IgYmxpdHRpbmcgb25lIEJ1ZmZlcmVkIEltYWdlCiAgICAgLy8gb24gdGhlIG90aGVyIG9uZSBvciBvbiB0aGUgQ29tcG9uZW50Ci0gICAgLyoqIFRoZSBpbWFnZSBzdXJmLiAqLworICAgIC8qKgorICAgICAqIFRoZSBpbWFnZSBzdXJmLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgSW1hZ2VTdXJmYWNlIGltYWdlU3VyZjsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBCdWZmZXJlZEltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBDb2xvck1vZGVsLAotICAgICAqIGFuZCBXcml0YWJsZVJhc3RlciBvYmplY3RzLiBUaGUgUmFzdGVyIGRhdGEgY2FuIGJlCi0gICAgICogYmUgZGl2aWRlZCBvciBtdWx0aXBsaWVkIGJ5IGFscGhhLiBJdCBkZXBlbmRzIG9uIHRoZSAKLSAgICAgKiBhbHBoYVByZW11bHRpcGxpZWQgc3RhdGUgaW4gdGhlIENvbG9yTW9kZWwuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJ1ZmZlcmVkSW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIENvbG9yTW9kZWwsIGFuZAorICAgICAqIFdyaXRhYmxlUmFzdGVyIG9iamVjdHMuIFRoZSBSYXN0ZXIgZGF0YSBjYW4gYmUgYmUgZGl2aWRlZCBvciBtdWx0aXBsaWVkCisgICAgICogYnkgYWxwaGEuIEl0IGRlcGVuZHMgb24gdGhlIGFscGhhUHJlbXVsdGlwbGllZCBzdGF0ZSBpbiB0aGUgQ29sb3JNb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY20gdGhlIENvbG9yTW9kZWwgb2YgdGhlIG5ldyBpbWFnZS4KLSAgICAgKiBAcGFyYW0gcmFzdGVyIHRoZSBXcml0YWJsZVJhc3RlciBvZiB0aGUgbmV3IGltYWdlLgotICAgICAqIEBwYXJhbSBpc1Jhc3RlclByZW11bHRpcGxpZWQgaWYgdHJ1ZSB0aGUgZGF0YSBvZiB0aGUgc3BlY2lmaWVkCi0gICAgICogUmFzdGVyIGlzIHByZW11bHRpcGxpZWQgYnkgYWxwaGEuCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXMgdGhlIHByb3BlcnRpZXMgb2YgbmV3IEltYWdlLgorICAgICAqIEBwYXJhbSBjbQorICAgICAqICAgICAgICAgICAgdGhlIENvbG9yTW9kZWwgb2YgdGhlIG5ldyBpbWFnZS4KKyAgICAgKiBAcGFyYW0gcmFzdGVyCisgICAgICogICAgICAgICAgICB0aGUgV3JpdGFibGVSYXN0ZXIgb2YgdGhlIG5ldyBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaXNSYXN0ZXJQcmVtdWx0aXBsaWVkCisgICAgICogICAgICAgICAgICBpZiB0cnVlIHRoZSBkYXRhIG9mIHRoZSBzcGVjaWZpZWQgUmFzdGVyIGlzIHByZS1tdWx0aXBsaWVkIGJ5CisgICAgICogICAgICAgICAgICBhbHBoYS4KKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcworICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnRpZXMgb2YgbmV3IEltYWdlLgogICAgICAqLwotICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlKENvbG9yTW9kZWwgY20sIFdyaXRhYmxlUmFzdGVyIHJhc3RlciwKLSAgICAgICAgICAgIGJvb2xlYW4gaXNSYXN0ZXJQcmVtdWx0aXBsaWVkLCBIYXNodGFibGU8PywgPz4gcHJvcGVydGllcykgeworICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlKENvbG9yTW9kZWwgY20sIFdyaXRhYmxlUmFzdGVyIHJhc3RlciwgYm9vbGVhbiBpc1Jhc3RlclByZW11bHRpcGxpZWQsCisgICAgICAgICAgICBIYXNodGFibGU8PywgPz4gcHJvcGVydGllcykgewogICAgICAgICBpZiAoIWNtLmlzQ29tcGF0aWJsZVJhc3RlcihyYXN0ZXIpKSB7CiAgICAgICAgICAgICAvLyBhd3QuNEQ9VGhlIHJhc3RlciBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGlzIENvbG9yTW9kZWwKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNEQiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTIyNyw3ICsyNTksNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMjgiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIHRoaXMuY20gID0gY207CisgICAgICAgIHRoaXMuY20gPSBjbTsKICAgICAgICAgdGhpcy5yYXN0ZXIgPSByYXN0ZXI7CiAgICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CiAKQEAgLTI0MCw0NyArMjcyLDUyIEBACiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQnVmZmVyZWRJbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgd2lkdGgsIGhlaWdodAotICAgICAqIHByZWRlZmluZWQgaW1hZ2UgdHlwZSAoVFlQRV9CWVRFX0JJTkFSWSBvciBUWVBFX0JZVEVfSU5ERVhFRCkgCi0gICAgICogYW5kIHRoZSBzcGVjaWZpZWQgSW5kZXhDb2xvck1vZGVsLgorICAgICAqIHByZWRlZmluZWQgaW1hZ2UgdHlwZSAoVFlQRV9CWVRFX0JJTkFSWSBvciBUWVBFX0JZVEVfSU5ERVhFRCkgYW5kIHRoZQorICAgICAqIHNwZWNpZmllZCBJbmRleENvbG9yTW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiBuZXcgaW1hZ2UuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIG5ldyBpbWFnZS4KLSAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlIHRoZSBwcmVkZWZpbmVkIGltYWdlIHR5cGUuIAotICAgICAqIEBwYXJhbSBjbSB0aGUgc3BlY2lmaWVkIEluZGV4Q29sb3JNb2RlbC4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBuZXcgaW1hZ2UuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiBuZXcgaW1hZ2UuCisgICAgICogQHBhcmFtIGltYWdlVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHByZWRlZmluZWQgaW1hZ2UgdHlwZS4KKyAgICAgKiBAcGFyYW0gY20KKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgSW5kZXhDb2xvck1vZGVsLgogICAgICAqLwotICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGltYWdlVHlwZSwKLSAgICAgICAgICAgIEluZGV4Q29sb3JNb2RlbCBjbSkgeworICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGltYWdlVHlwZSwgSW5kZXhDb2xvck1vZGVsIGNtKSB7CiAgICAgICAgIHN3aXRjaCAoaW1hZ2VUeXBlKSB7Ci0gICAgICAgIGNhc2UgVFlQRV9CWVRFX0JJTkFSWToKLSAgICAgICAgICAgIGlmIChjbS5oYXNBbHBoYSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjIyNz1UaGlzIGltYWdlIHR5cGUgY2FuJ3QgaGF2ZSBhbHBoYQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjI3IikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgcGl4ZWxfYml0cyA9IDA7Ci0gICAgICAgICAgICBpbnQgbWFwU2l6ZSA9IGNtLmdldE1hcFNpemUoKTsKLSAgICAgICAgICAgIGlmIChtYXBTaXplIDw9IDIpIHsKLSAgICAgICAgICAgICAgICBwaXhlbF9iaXRzID0gMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWFwU2l6ZSA8PSA0KSB7Ci0gICAgICAgICAgICAgICAgcGl4ZWxfYml0cyA9IDI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1hcFNpemUgPD0gMTYpIHsKLSAgICAgICAgICAgICAgICBwaXhlbF9iaXRzID0gNDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjIyMT1UaGUgaW1hZ2VUeXBlIGlzIFRZUEVfQllURV9CSU5BUlkgYW5kIHRoZSBjb2xvciBtYXAgaGFzIG1vcmUgdGhhbiAxNiBlbnRyaWVzCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMjEiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgVFlQRV9CWVRFX0JJTkFSWToKKyAgICAgICAgICAgICAgICBpZiAoY20uaGFzQWxwaGEoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBhd3QuMjI3PVRoaXMgaW1hZ2UgdHlwZSBjYW4ndCBoYXZlIGFscGhhCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjI3IikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBwaXhlbF9iaXRzID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgbWFwU2l6ZSA9IGNtLmdldE1hcFNpemUoKTsKKyAgICAgICAgICAgICAgICBpZiAobWFwU2l6ZSA8PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX2JpdHMgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWFwU2l6ZSA8PSA0KSB7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX2JpdHMgPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWFwU2l6ZSA8PSAxNikgeworICAgICAgICAgICAgICAgICAgICBwaXhlbF9iaXRzID0gNDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBhd3QuMjIxPVRoZSBpbWFnZVR5cGUgaXMgVFlQRV9CWVRFX0JJTkFSWSBhbmQgdGhlIGNvbG9yCisgICAgICAgICAgICAgICAgICAgIC8vIG1hcCBoYXMgbW9yZSB0aGFuIDE2IGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMjEiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHJhc3RlciA9IFJhc3Rlci5jcmVhdGVQYWNrZWRSYXN0ZXIoRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIDEsIHBpeGVsX2JpdHMsIG51bGwpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgcmFzdGVyID0gUmFzdGVyLmNyZWF0ZVBhY2tlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfQllURSwgd2lkdGgsIGhlaWdodCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX2JpdHMsIG51bGwpOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgVFlQRV9CWVRFX0lOREVYRUQ6Ci0gICAgICAgICAgICByYXN0ZXIgPSBSYXN0ZXIuY3JlYXRlSW50ZXJsZWF2ZWRSYXN0ZXIoRGF0YUJ1ZmZlci5UWVBFX0JZVEUsCi0gICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIDEsIG51bGwpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRZUEVfQllURV9JTkRFWEVEOgorICAgICAgICAgICAgICAgIHJhc3RlciA9IFJhc3Rlci5jcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfQllURSwgd2lkdGgsIGhlaWdodCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBhd3QuMjIyPVRoZSBpbWFnZVR5cGUgaXMgbm90IFRZUEVfQllURV9CSU5BUlkgb3IgVFlQRV9CWVRFX0lOREVYRUQKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjIyIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIGF3dC4yMjI9VGhlIGltYWdlVHlwZSBpcyBub3QgVFlQRV9CWVRFX0JJTkFSWSBvcgorICAgICAgICAgICAgICAgIC8vIFRZUEVfQllURV9JTkRFWEVECisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMjIiKSk7IC8vJE5PTi1OTFMtMSQKIAogICAgICAgICB9CiAKQEAgLTI5NiwxODcgKzMzMywxNTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQnVmZmVyZWRJbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgd2lkdGgsIGhlaWdodAotICAgICAqIGFuZCBwcmVkZWZpbmVkIGltYWdlIHR5cGUuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJ1ZmZlcmVkSW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoLCBoZWlnaHQgYW5kCisgICAgICogcHJlZGVmaW5lZCBpbWFnZSB0eXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgbmV3IGltYWdlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiBuZXcgaW1hZ2UuCi0gICAgICogQHBhcmFtIGltYWdlVHlwZSB0aGUgcHJlZGVmaW5lZCBpbWFnZSB0eXBlLiAKKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBuZXcgaW1hZ2UuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiBuZXcgaW1hZ2UuCisgICAgICogQHBhcmFtIGltYWdlVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHByZWRlZmluZWQgaW1hZ2UgdHlwZS4KICAgICAgKi8KICAgICBwdWJsaWMgQnVmZmVyZWRJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBpbWFnZVR5cGUpIHsKIAogICAgICAgICBzd2l0Y2ggKGltYWdlVHlwZSkgewotICAgICAgICBjYXNlIFRZUEVfSU5UX1JHQjoKLSAgICAgICAgICAgIGNtID0gbmV3IERpcmVjdENvbG9yTW9kZWwoMjQsIFJFRF9NQVNLLCBHUkVFTl9NQVNLLCBCTFVFX01BU0spOwotICAgICAgICAgICAgcmFzdGVyID0gY20uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRZUEVfSU5UX1JHQjoKKyAgICAgICAgICAgICAgICBjbSA9IG5ldyBEaXJlY3RDb2xvck1vZGVsKDI0LCBSRURfTUFTSywgR1JFRU5fTUFTSywgQkxVRV9NQVNLKTsKKyAgICAgICAgICAgICAgICByYXN0ZXIgPSBjbS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBUWVBFX0lOVF9BUkdCOgotICAgICAgICAgICAgY20gPSBDb2xvck1vZGVsLmdldFJHQmRlZmF1bHQoKTsKLSAgICAgICAgICAgIHJhc3RlciA9IGNtLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3Rlcih3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUWVBFX0lOVF9BUkdCOgorICAgICAgICAgICAgICAgIGNtID0gQ29sb3JNb2RlbC5nZXRSR0JkZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgcmFzdGVyID0gY20uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgVFlQRV9JTlRfQVJHQl9QUkU6Ci0gICAgICAgICAgICBjbSA9IG5ldyBEaXJlY3RDb2xvck1vZGVsKAotICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1Nfc1JHQiksCi0gICAgICAgICAgICAgICAgICAgIDMyLAotICAgICAgICAgICAgICAgICAgICBSRURfTUFTSywKLSAgICAgICAgICAgICAgICAgICAgR1JFRU5fTUFTSywKLSAgICAgICAgICAgICAgICAgICAgQkxVRV9NQVNLLAotICAgICAgICAgICAgICAgICAgICBBTFBIQV9NQVNLLAotICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICBEYXRhQnVmZmVyLlRZUEVfSU5UKTsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9JTlRfQVJHQl9QUkU6CisgICAgICAgICAgICAgICAgY20gPSBuZXcgRGlyZWN0Q29sb3JNb2RlbChDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1Nfc1JHQiksIDMyLCBSRURfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgIEdSRUVOX01BU0ssIEJMVUVfTUFTSywgQUxQSEFfTUFTSywgdHJ1ZSwgRGF0YUJ1ZmZlci5UWVBFX0lOVCk7CiAKLSAgICAgICAgICAgIHJhc3RlciA9IGNtLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3Rlcih3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHJhc3RlciA9IGNtLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3Rlcih3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIFRZUEVfSU5UX0JHUjoKLSAgICAgICAgICAgIGNtID0gbmV3IERpcmVjdENvbG9yTW9kZWwoMjQsCi0gICAgICAgICAgICAgICAgICAgIFJFRF9CR1JfTUFTSywKLSAgICAgICAgICAgICAgICAgICAgR1JFRU5fQkdSX01BU0ssCi0gICAgICAgICAgICAgICAgICAgIEJMVUVfQkdSX01BU0spOworICAgICAgICAgICAgY2FzZSBUWVBFX0lOVF9CR1I6CisgICAgICAgICAgICAgICAgY20gPSBuZXcgRGlyZWN0Q29sb3JNb2RlbCgyNCwgUkVEX0JHUl9NQVNLLCBHUkVFTl9CR1JfTUFTSywgQkxVRV9CR1JfTUFTSyk7CiAKLSAgICAgICAgICAgIHJhc3RlciA9IGNtLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3Rlcih3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHJhc3RlciA9IGNtLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3Rlcih3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIFRZUEVfM0JZVEVfQkdSOiB7Ci0gICAgICAgICAgICBpbnQgYml0c1tdID0geyA4LCA4LCA4IH07Ci0gICAgICAgICAgICBpbnQgYmFuZE9mZnNldHNbXSA9IHsgMiwgMSwgMCB9OwotICAgICAgICAgICAgY20gPSBuZXcgQ29tcG9uZW50Q29sb3JNb2RlbCgKLSAgICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IpLAotICAgICAgICAgICAgICAgICAgICBiaXRzLCAKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsIAotICAgICAgICAgICAgICAgICAgICBmYWxzZSwgCi0gICAgICAgICAgICAgICAgICAgIFRyYW5zcGFyZW5jeS5PUEFRVUUsIAotICAgICAgICAgICAgICAgICAgICBEYXRhQnVmZmVyLlRZUEVfQllURSk7CisgICAgICAgICAgICBjYXNlIFRZUEVfM0JZVEVfQkdSOiB7CisgICAgICAgICAgICAgICAgaW50IGJpdHNbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDgsIDgsIDgKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGludCBiYW5kT2Zmc2V0c1tdID0geworICAgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgMAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgY20gPSBuZXcgQ29tcG9uZW50Q29sb3JNb2RlbChDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1Nfc1JHQiksIGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIFRyYW5zcGFyZW5jeS5PUEFRVUUsIERhdGFCdWZmZXIuVFlQRV9CWVRFKTsKIAotICAgICAgICAgICAgcmFzdGVyID0gUmFzdGVyLmNyZWF0ZUludGVybGVhdmVkUmFzdGVyKERhdGFCdWZmZXIuVFlQRV9CWVRFLAotICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCB3aWR0aCAqIDMsIDMsIGJhbmRPZmZzZXRzLCBudWxsKTsKKyAgICAgICAgICAgICAgICByYXN0ZXIgPSBSYXN0ZXIuY3JlYXRlSW50ZXJsZWF2ZWRSYXN0ZXIoRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCAqIDMsIDMsIGJhbmRPZmZzZXRzLCBudWxsKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgVFlQRV80QllURV9BQkdSOiB7Ci0gICAgICAgICAgICBpbnQgYml0c1tdID0geyA4LCA4LCA4LCA4IH07Ci0gICAgICAgICAgICBpbnQgYmFuZE9mZnNldHNbXSA9IHsgMywgMiwgMSwgMCB9OwotICAgICAgICAgICAgY20gPSBuZXcgQ29tcG9uZW50Q29sb3JNb2RlbCgKLSAgICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IpLAotICAgICAgICAgICAgICAgICAgICBiaXRzLCAKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlLCAKLSAgICAgICAgICAgICAgICAgICAgVHJhbnNwYXJlbmN5LlRSQU5TTFVDRU5ULCAKLSAgICAgICAgICAgICAgICAgICAgRGF0YUJ1ZmZlci5UWVBFX0JZVEUpOworICAgICAgICAgICAgY2FzZSBUWVBFXzRCWVRFX0FCR1I6IHsKKyAgICAgICAgICAgICAgICBpbnQgYml0c1tdID0geworICAgICAgICAgICAgICAgICAgICAgICAgOCwgOCwgOCwgOAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgaW50IGJhbmRPZmZzZXRzW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAzLCAyLCAxLCAwCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBjbSA9IG5ldyBDb21wb25lbnRDb2xvck1vZGVsKENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCKSwgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlLCBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQsIERhdGFCdWZmZXIuVFlQRV9CWVRFKTsKIAotICAgICAgICAgICAgcmFzdGVyID0gUmFzdGVyLmNyZWF0ZUludGVybGVhdmVkUmFzdGVyKERhdGFCdWZmZXIuVFlQRV9CWVRFLAotICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCB3aWR0aCAqIDQsIDQsIGJhbmRPZmZzZXRzLCBudWxsKTsKKyAgICAgICAgICAgICAgICByYXN0ZXIgPSBSYXN0ZXIuY3JlYXRlSW50ZXJsZWF2ZWRSYXN0ZXIoRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCAqIDQsIDQsIGJhbmRPZmZzZXRzLCBudWxsKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgVFlQRV80QllURV9BQkdSX1BSRTogewotICAgICAgICAgICAgaW50IGJpdHNbXSA9IHsgOCwgOCwgOCwgOCB9OwotICAgICAgICAgICAgaW50IGJhbmRPZmZzZXRzW10gPSB7IDMsIDIsIDEsIDAgfTsKLSAgICAgICAgICAgIGNtID0gbmV3IENvbXBvbmVudENvbG9yTW9kZWwoCi0gICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCKSwKLSAgICAgICAgICAgICAgICAgICAgYml0cywgCi0gICAgICAgICAgICAgICAgICAgIHRydWUsIAotICAgICAgICAgICAgICAgICAgICB0cnVlLCAKLSAgICAgICAgICAgICAgICAgICAgVHJhbnNwYXJlbmN5LlRSQU5TTFVDRU5ULCBEYXRhQnVmZmVyLlRZUEVfQllURSk7CisgICAgICAgICAgICBjYXNlIFRZUEVfNEJZVEVfQUJHUl9QUkU6IHsKKyAgICAgICAgICAgICAgICBpbnQgYml0c1tdID0geworICAgICAgICAgICAgICAgICAgICAgICAgOCwgOCwgOCwgOAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgaW50IGJhbmRPZmZzZXRzW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAzLCAyLCAxLCAwCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBjbSA9IG5ldyBDb21wb25lbnRDb2xvck1vZGVsKENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCKSwgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIHRydWUsIFRyYW5zcGFyZW5jeS5UUkFOU0xVQ0VOVCwgRGF0YUJ1ZmZlci5UWVBFX0JZVEUpOwogCi0gICAgICAgICAgICByYXN0ZXIgPSBSYXN0ZXIuY3JlYXRlSW50ZXJsZWF2ZWRSYXN0ZXIoRGF0YUJ1ZmZlci5UWVBFX0JZVEUsCi0gICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHdpZHRoICogNCwgNCwgYmFuZE9mZnNldHMsIG51bGwpOworICAgICAgICAgICAgICAgIHJhc3RlciA9IFJhc3Rlci5jcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfQllURSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoICogNCwgNCwgYmFuZE9mZnNldHMsIG51bGwpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBUWVBFX1VTSE9SVF81NjVfUkdCOgotICAgICAgICAgICAgY20gPSBuZXcgRGlyZWN0Q29sb3JNb2RlbCgKLSAgICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IpLAotICAgICAgICAgICAgICAgICAgICAxNiwKLSAgICAgICAgICAgICAgICAgICAgUkVEXzU2NV9NQVNLLAotICAgICAgICAgICAgICAgICAgICBHUkVFTl81NjVfTUFTSywKLSAgICAgICAgICAgICAgICAgICAgQkxVRV81NjVfTUFTSywKLSAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQpOworICAgICAgICAgICAgY2FzZSBUWVBFX1VTSE9SVF81NjVfUkdCOgorICAgICAgICAgICAgICAgIGNtID0gbmV3IERpcmVjdENvbG9yTW9kZWwoQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IpLCAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJFRF81NjVfTUFTSywgR1JFRU5fNTY1X01BU0ssIEJMVUVfNTY1X01BU0ssIDAsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCk7CiAKLSAgICAgICAgICAgIHJhc3RlciA9IGNtLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3Rlcih3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHJhc3RlciA9IGNtLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3Rlcih3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIFRZUEVfVVNIT1JUXzU1NV9SR0I6Ci0gICAgICAgICAgICBjbSA9IG5ldyBEaXJlY3RDb2xvck1vZGVsKAotICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1Nfc1JHQiksCi0gICAgICAgICAgICAgICAgICAgIDE1LAotICAgICAgICAgICAgICAgICAgICBSRURfNTU1X01BU0ssCi0gICAgICAgICAgICAgICAgICAgIEdSRUVOXzU1NV9NQVNLLAotICAgICAgICAgICAgICAgICAgICBCTFVFXzU1NV9NQVNLLAotICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCk7CisgICAgICAgICAgICBjYXNlIFRZUEVfVVNIT1JUXzU1NV9SR0I6CisgICAgICAgICAgICAgICAgY20gPSBuZXcgRGlyZWN0Q29sb3JNb2RlbChDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1Nfc1JHQiksIDE1LAorICAgICAgICAgICAgICAgICAgICAgICAgUkVEXzU1NV9NQVNLLCBHUkVFTl81NTVfTUFTSywgQkxVRV81NTVfTUFTSywgMCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUKTsKIAotICAgICAgICAgICAgcmFzdGVyID0gY20uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgcmFzdGVyID0gY20uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgVFlQRV9CWVRFX0dSQVk6IHsKLSAgICAgICAgICAgIGludCBiaXRzW10gPSB7IDggfTsKLSAgICAgICAgICAgIGNtID0gbmV3IENvbXBvbmVudENvbG9yTW9kZWwoCi0gICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19HUkFZKSwKLSAgICAgICAgICAgICAgICAgICAgYml0cywgCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlLCAKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsIAotICAgICAgICAgICAgICAgICAgICBUcmFuc3BhcmVuY3kuT1BBUVVFLCAKLSAgICAgICAgICAgICAgICAgICAgRGF0YUJ1ZmZlci5UWVBFX0JZVEUpOworICAgICAgICAgICAgY2FzZSBUWVBFX0JZVEVfR1JBWTogeworICAgICAgICAgICAgICAgIGludCBiaXRzW10gPSB7CisgICAgICAgICAgICAgICAgICAgIDgKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGNtID0gbmV3IENvbXBvbmVudENvbG9yTW9kZWwoQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX0dSQVkpLCBiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBUcmFuc3BhcmVuY3kuT1BBUVVFLCBEYXRhQnVmZmVyLlRZUEVfQllURSk7CiAKLSAgICAgICAgICAgIHJhc3RlciA9IGNtLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3Rlcih3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICByYXN0ZXIgPSBjbS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIod2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIFRZUEVfVVNIT1JUX0dSQVk6IHsKLSAgICAgICAgICAgIGludCBiaXRzW10gPSB7IDE2IH07Ci0gICAgICAgICAgICBjbSA9IG5ldyBDb21wb25lbnRDb2xvck1vZGVsKAotICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1NfR1JBWSksCi0gICAgICAgICAgICAgICAgICAgIGJpdHMsIAotICAgICAgICAgICAgICAgICAgICBmYWxzZSwgCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlLCAKLSAgICAgICAgICAgICAgICAgICAgVHJhbnNwYXJlbmN5Lk9QQVFVRSwgCi0gICAgICAgICAgICAgICAgICAgIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQpOwotICAgICAgICAgICAgcmFzdGVyID0gY20uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgY2FzZSBUWVBFX1VTSE9SVF9HUkFZOiB7CisgICAgICAgICAgICAgICAgaW50IGJpdHNbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgMTYKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGNtID0gbmV3IENvbXBvbmVudENvbG9yTW9kZWwoQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX0dSQVkpLCBiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBUcmFuc3BhcmVuY3kuT1BBUVVFLCBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUKTsKKyAgICAgICAgICAgICAgICByYXN0ZXIgPSBjbS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIod2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIFRZUEVfQllURV9CSU5BUlk6IHsKLSAgICAgICAgICAgIGludCBjb2xvck1hcFtdID0geyAwLCAweGZmZmZmZiB9OwotICAgICAgICAgICAgY20gPSBuZXcgSW5kZXhDb2xvck1vZGVsKDEsIDIsIGNvbG9yTWFwLCAwLCBmYWxzZSwgLTEsCi0gICAgICAgICAgICAgICAgICAgIERhdGFCdWZmZXIuVFlQRV9CWVRFKTsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9CWVRFX0JJTkFSWTogeworICAgICAgICAgICAgICAgIGludCBjb2xvck1hcFtdID0geworICAgICAgICAgICAgICAgICAgICAgICAgMCwgMHhmZmZmZmYKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGNtID0gbmV3IEluZGV4Q29sb3JNb2RlbCgxLCAyLCBjb2xvck1hcCwgMCwgZmFsc2UsIC0xLCBEYXRhQnVmZmVyLlRZUEVfQllURSk7CiAKLSAgICAgICAgICAgIHJhc3RlciA9IFJhc3Rlci5jcmVhdGVQYWNrZWRSYXN0ZXIoRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIDEsIDEsIG51bGwpOworICAgICAgICAgICAgICAgIHJhc3RlciA9IFJhc3Rlci5jcmVhdGVQYWNrZWRSYXN0ZXIoRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIHdpZHRoLCBoZWlnaHQsIDEsIDEsIG51bGwpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBUWVBFX0JZVEVfSU5ERVhFRDogewotICAgICAgICAgICAgaW50IGNvbG9yTWFwW10gPSBuZXcgaW50WzI1Nl07Ci0gICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCByID0gMDsgciA8IDI1NjsgciArPSA1MSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGcgPSAwOyBnIDwgMjU2OyBnICs9IDUxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgMjU2OyBiICs9IDUxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2xvck1hcFtpXSA9IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9CWVRFX0lOREVYRUQ6IHsKKyAgICAgICAgICAgICAgICBpbnQgY29sb3JNYXBbXSA9IG5ldyBpbnRbMjU2XTsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCAyNTY7IHIgKz0gNTEpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgZyA9IDA7IGcgPCAyNTY7IGcgKz0gNTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgMjU2OyBiICs9IDUxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JNYXBbaV0gPSAociA8PCAxNikgfCAoZyA8PCA4KSB8IGI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQgZ3JheSA9IDB4MTI7Ci0gICAgICAgICAgICBmb3IgKDsgaSA8IDI1NjsgaSsrLCBncmF5ICs9IDYpIHsKLSAgICAgICAgICAgICAgICBjb2xvck1hcFtpXSA9IChncmF5IDw8IDE2KSB8IChncmF5IDw8IDgpIHwgZ3JheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNtID0gbmV3IEluZGV4Q29sb3JNb2RlbCg4LCAyNTYsIGNvbG9yTWFwLCAwLCBmYWxzZSwgLTEsCi0gICAgICAgICAgICAgICAgICAgIERhdGFCdWZmZXIuVFlQRV9CWVRFKTsKLSAgICAgICAgICAgIHJhc3RlciA9IFJhc3Rlci5jcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfQllURSwKLSAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgMSwgbnVsbCk7CisgICAgICAgICAgICAgICAgaW50IGdyYXkgPSAweDEyOworICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgMjU2OyBpKyssIGdyYXkgKz0gNikgeworICAgICAgICAgICAgICAgICAgICBjb2xvck1hcFtpXSA9IChncmF5IDw8IDE2KSB8IChncmF5IDw8IDgpIHwgZ3JheTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY20gPSBuZXcgSW5kZXhDb2xvck1vZGVsKDgsIDI1NiwgY29sb3JNYXAsIDAsIGZhbHNlLCAtMSwgRGF0YUJ1ZmZlci5UWVBFX0JZVEUpOworICAgICAgICAgICAgICAgIHJhc3RlciA9IFJhc3Rlci5jcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfQllURSwgd2lkdGgsIGhlaWdodCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwogCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGF3dC4yMjQ9VW5rbm93biBpbWFnZSB0eXBlCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIyNCIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjI0PVVua25vd24gaW1hZ2UgdHlwZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjI0IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgdGhpcy5pbWFnZVR5cGUgPSBpbWFnZVR5cGU7CiAgICAgICAgIGltYWdlU3VyZiA9IGNyZWF0ZUltYWdlU3VyZmFjZShpbWFnZVR5cGUpOwpAQCAtNDg4LDcgKzQ5Nyw3IEBACiAgICAgfQogCiAgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotICAgICAgICBpZihuYW1lID09IG51bGwpIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gYXd0LjIyNT1Qcm9wZXJ0eSBuYW1lIGlzIG51bGwKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMjUiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQpAQCAtNTA0LDkgKzUxMyw4IEBACiAKICAgICBwdWJsaWMgV3JpdGFibGVSYXN0ZXIgY29weURhdGEoV3JpdGFibGVSYXN0ZXIgb3V0UmFzdGVyKSB7CiAgICAgICAgIGlmIChvdXRSYXN0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgb3V0UmFzdGVyID0gUmFzdGVyLmNyZWF0ZVdyaXRhYmxlUmFzdGVyKHJhc3Rlci5nZXRTYW1wbGVNb2RlbCgpLAotICAgICAgICAgICAgICAgICAgICBuZXcgUG9pbnQocmFzdGVyLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSkpOworICAgICAgICAgICAgb3V0UmFzdGVyID0gUmFzdGVyLmNyZWF0ZVdyaXRhYmxlUmFzdGVyKHJhc3Rlci5nZXRTYW1wbGVNb2RlbCgpLCBuZXcgUG9pbnQocmFzdGVyCisgICAgICAgICAgICAgICAgICAgIC5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSwgcmFzdGVyLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQgdyA9IG91dFJhc3Rlci5nZXRXaWR0aCgpOwpAQCAtNTMwLDggKzUzOCw3IEBACiAKICAgICAgICAgU2FtcGxlTW9kZWwgc20gPSByYXN0ZXIuZ2V0U2FtcGxlTW9kZWwoKTsKICAgICAgICAgU2FtcGxlTW9kZWwgbnNtID0gc20uY3JlYXRlQ29tcGF0aWJsZVNhbXBsZU1vZGVsKHcsIGgpOwotICAgICAgICBXcml0YWJsZVJhc3RlciBvdXRyID0gUmFzdGVyLmNyZWF0ZVdyaXRhYmxlUmFzdGVyKG5zbSwgCi0gICAgICAgICAgICAgICAgcmVjdC5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgV3JpdGFibGVSYXN0ZXIgb3V0ciA9IFJhc3Rlci5jcmVhdGVXcml0YWJsZVJhc3Rlcihuc20sIHJlY3QuZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIE9iamVjdCBkYXRhID0gbnVsbDsKIAogICAgICAgICBkYXRhID0gcmFzdGVyLmdldERhdGFFbGVtZW50cyhtaW5YLCBtaW5ZLCB3LCBoLCBkYXRhKTsKQEAgLTU1MCw3ICs1NTcsNyBAQAogICAgICAgICBWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CiAgICAgICAgIGZvciAoRW51bWVyYXRpb248Pz4gZSA9IHByb3BlcnRpZXMua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB2LmFkZCgoU3RyaW5nKSBlLm5leHRFbGVtZW50KCkpOworICAgICAgICAgICAgICAgIHYuYWRkKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01NzMsNyArNTgwLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gIkJ1ZmZlcmVkSW1hZ2VAIiArIEludGVnZXIudG9IZXhTdHJpbmcoaGFzaENvZGUoKSkgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiOiB0eXBlID0gIiArIGltYWdlVHlwZSArICIgIiArIGNtICsgIiAiICsgcmFzdGVyOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorICAgICAgICAgICAgICAgICI6IHR5cGUgPSAiICsgaW1hZ2VUeXBlICsgIiAiICsgY20gKyAiICIgKyByYXN0ZXI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCiAgICAgfQogCiAgICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGdldFdyaXRhYmxlVGlsZShpbnQgdGlsZVgsIGludCB0aWxlWSkgewpAQCAtNTkwLDEzICs1OTcsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgV3JpdGFibGVSYXN0ZXIgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBhbHBoYSBjaGFubmVsIG9mIAotICAgICAqIEJ1ZmZlcmVkSW1hZ2Ugb2JqZWN0IHdpdGggQ29sb3JNb2RlbCBvYmplY3RzIHRoYXQgc3VwcG9ydHMgCi0gICAgICogYSBzZXBhcmF0ZSBhbHBoYSBjaGFubmVsIHN1Y2ggYXMgQ29tcG9uZW50Q29sb3JNb2RlbCAKLSAgICAgKiBvciBEaXJlY3RDb2xvck1vZGVsLgorICAgICAqIEdldHMgYSBXcml0YWJsZVJhc3RlciBvYmplY3Qgd2hpY2ggY29udGFpbnMgdGhlIGFscGhhIGNoYW5uZWwgb2YKKyAgICAgKiBCdWZmZXJlZEltYWdlIG9iamVjdCB3aXRoIENvbG9yTW9kZWwgb2JqZWN0cyB0aGF0IHN1cHBvcnRzIGEgc2VwYXJhdGUKKyAgICAgKiBhbHBoYSBjaGFubmVsIHN1Y2ggYXMgQ29tcG9uZW50Q29sb3JNb2RlbCBvciBEaXJlY3RDb2xvck1vZGVsLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFdyaXRhYmxlUmFzdGVyIG9iamVjdCB3aGljaCBjb250YWlucyB0aGUgYWxwaGEgCi0gICAgICogY2hhbm5lbCBvZiB0aGlzIEJ1ZmZlcmVkSW1hZ2UuIAorICAgICAqIEByZXR1cm4gdGhlIFdyaXRhYmxlUmFzdGVyIG9iamVjdCB3aGljaCBjb250YWlucyB0aGUgYWxwaGEgY2hhbm5lbCBvZgorICAgICAqICAgICAgICAgdGhpcyBCdWZmZXJlZEltYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBnZXRBbHBoYVJhc3RlcigpIHsKICAgICAgICAgcmV0dXJuIGNtLmdldEFscGhhUmFzdGVyKHJhc3Rlcik7CkBAIC02NDMsMTAgKzY0OSw4IEBACiAgICAgICAgIGludCBtaW5YID0gcmFzdGVyLmdldE1pblgoKTsKICAgICAgICAgaW50IG1pblkgPSByYXN0ZXIuZ2V0TWluWSgpOwogCi0gICAgICAgIFdyaXRhYmxlUmFzdGVyIG91dHIgPSBSYXN0ZXIuY3JlYXRlV3JpdGFibGVSYXN0ZXIoCi0gICAgICAgICAgICAgICAgcmFzdGVyLmdldFNhbXBsZU1vZGVsKCksCi0gICAgICAgICAgICAgICAgbmV3IFBvaW50KHJhc3Rlci5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSwKLSAgICAgICAgICAgICAgICByYXN0ZXIuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkpKTsKKyAgICAgICAgV3JpdGFibGVSYXN0ZXIgb3V0ciA9IFJhc3Rlci5jcmVhdGVXcml0YWJsZVJhc3RlcihyYXN0ZXIuZ2V0U2FtcGxlTW9kZWwoKSwgbmV3IFBvaW50KHJhc3RlcgorICAgICAgICAgICAgICAgIC5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSwgcmFzdGVyLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpKSk7CiAKICAgICAgICAgT2JqZWN0IGRhdGEgPSBudWxsOwogCkBAIC02NzgsMTEgKzY4MiwxNCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgdGhpcyBCdWZmZXJlZEltYWdlIGFzIGEgc3ViaW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgc3ViaW1hZ2UuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgc3ViaW1hZ2UuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgc3ViaW1hZ2UuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHN1YmltYWdlLgogICAgICAqIEByZXR1cm4gdGhlIEJ1ZmZlcmVkSW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIEJ1ZmZlcmVkSW1hZ2UgZ2V0U3ViaW1hZ2UoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpIHsKQEAgLTY5NywxOCArNzA0LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgR3JhcGhpY3MyRCBvYmplY3Qgd2hpY2ggYWxsb3dzIHRvIGRyYXcgaW50byAKLSAgICAgKiB0aGlzIEJ1ZmZlcmVkSW1hZ2UuCisgICAgICogQ3JlYXRlcyB0aGUgR3JhcGhpY3MyRCBvYmplY3Qgd2hpY2ggYWxsb3dzIHRvIGRyYXcgaW50byB0aGlzCisgICAgICogQnVmZmVyZWRJbWFnZS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBncmFwaGljczJEIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgR3JhcGhpY3MyRCBjcmVhdGVHcmFwaGljcygpIHsKLSAgICAgICAgR3JhcGhpY3NFbnZpcm9ubWVudCBnZSA9IAotICAgICAgICAgICAgR3JhcGhpY3NFbnZpcm9ubWVudC5nZXRMb2NhbEdyYXBoaWNzRW52aXJvbm1lbnQoKTsKLSAgICAgICAgLy9yZXR1cm4gZ2UuY3JlYXRlR3JhcGhpY3ModGhpcyk7Ci0gICAgICAgIC8vPz8/QVdUIGhhY2ssIEZJWE1FCi0gICAgICAgIC8vcmV0dXJuIEFuZHJvaWRHcmFwaGljczJELmdldEluc3RhbmNlKCk7Ci0gICAgICAgIC8vdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCEiKTsKKyAgICAgICAgR3JhcGhpY3NFbnZpcm9ubWVudCBnZSA9IEdyYXBoaWNzRW52aXJvbm1lbnQuZ2V0TG9jYWxHcmFwaGljc0Vudmlyb25tZW50KCk7CisgICAgICAgIC8vIHJldHVybiBnZS5jcmVhdGVHcmFwaGljcyh0aGlzKTsKKyAgICAgICAgLy8gPz8/QVdUIGhhY2ssIEZJWE1FCisgICAgICAgIC8vIHJldHVybiBBbmRyb2lkR3JhcGhpY3MyRC5nZXRJbnN0YW5jZSgpOworICAgICAgICAvLyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkISIpOwogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKQEAgLTcxOCwzOCArNzI0LDQ0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29lcmNlcyB0aGUgZGF0YSB0byBhY2hpZXZlIHRoZSBzdGF0ZSB3aGljaCBpcyBzcGVjaWZpZWQgYnkgCi0gICAgICogdGhlIGlzQWxwaGFQcmVtdWx0aXBsaWVkIHZhcmlhYmxlLiAKKyAgICAgKiBDb2VyY2VzIHRoZSBkYXRhIHRvIGFjaGlldmUgdGhlIHN0YXRlIHdoaWNoIGlzIHNwZWNpZmllZCBieSB0aGUKKyAgICAgKiBpc0FscGhhUHJlbXVsdGlwbGllZCB2YXJpYWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXNBbHBoYVByZW11bHRpcGxpZWQgdGhlIGlzIGFscGhhIHByZW11bHRpcGxpZWQgc3RhdGUuCisgICAgICogQHBhcmFtIGlzQWxwaGFQcmVtdWx0aXBsaWVkCisgICAgICogICAgICAgICAgICB0aGUgaXMgYWxwaGEgcHJlLW11bHRpcGxpZWQgc3RhdGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY29lcmNlRGF0YShib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7Ci0gICAgICAgIGlmIChjbS5oYXNBbHBoYSgpICYmIAotICAgICAgICAgICAgICAgIGNtLmlzQWxwaGFQcmVtdWx0aXBsaWVkKCkgIT0gaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKKyAgICAgICAgaWYgKGNtLmhhc0FscGhhKCkgJiYgY20uaXNBbHBoYVByZW11bHRpcGxpZWQoKSAhPSBpc0FscGhhUHJlbXVsdGlwbGllZCkgewogICAgICAgICAgICAgY20gPSBjbS5jb2VyY2VEYXRhKHJhc3RlciwgaXNBbHBoYVByZW11bHRpcGxpZWQpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiBjb2xvcnMgaW4gdGhlIFRZUEVfSU5UX0FSR0IgY29sb3IgbW9kZWwgYW5kIAotICAgICAqIGRlZmF1bHQgc1JHQiBjb2xvcnNwYWNlIG9mIHRoZSBzcGVjaWZpZWQgYXJlYSBvZiB0aGlzCi0gICAgICogQnVmZmVyZWRJbWFnZS4gVGhlIHJlc3VsdCBhcnJheSBpcyBjb21wb3NlZCBieSB0aGUgZm9sbG93aW5nCi0gICAgICogYWxnaXJpdGhtOgotICAgICAqIDxwPiAKLSAgICAgKiBwaXhlbCAgID0gcmdiQXJyYXlbb2Zmc2V0ICsgKHktc3RhcnRZKSpzY2Fuc2l6ZSArICh4LXN0YXJ0WCldCisgICAgICogR2V0cyBhbiBhcnJheSBvZiBjb2xvcnMgaW4gdGhlIFRZUEVfSU5UX0FSR0IgY29sb3IgbW9kZWwgYW5kIGRlZmF1bHQgc1JHQgorICAgICAqIGNvbG9yIHNwYWNlIG9mIHRoZSBzcGVjaWZpZWQgYXJlYSBvZiB0aGlzIEJ1ZmZlcmVkSW1hZ2UuIFRoZSByZXN1bHQgYXJyYXkKKyAgICAgKiBpcyBjb21wb3NlZCBieSB0aGUgZm9sbG93aW5nIGFsZ29yaXRobToKKyAgICAgKiA8cD4KKyAgICAgKiBwaXhlbCA9IHJnYkFycmF5W29mZnNldCArICh5LXN0YXJ0WSkqc2NhbnNpemUgKyAoeC1zdGFydFgpXQorICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RhcnRYIHRoZSBzdGFydCBYIGFyZWEgY29vcmRpbmF0ZS4gCi0gICAgICogQHBhcmFtIHN0YXJ0WSB0aGUgc3RhcnQgWSBhcmVhIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBhcmVhLiAKLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBhcmVhLgotICAgICAqIEBwYXJhbSByZ2JBcnJheSB0aGUgcmVzdWx0IGFycmF5IHdpbGwgYmUgc3RvcmVkIHRvIHRoaXMgYXJyYXkuCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IG9mIHRoZSByZ2JBcnJheSBhcnJheS4gCi0gICAgICogQHBhcmFtIHNjYW5zaXplIHRoZSBzY2FubGluZSBzdHJpZGUgZm9yIHRoZSByZ2JBcnJheS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RhcnRYCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgWCBhcmVhIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHN0YXJ0WQorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IFkgYXJlYSBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGFyZWEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGFyZWEuCisgICAgICogQHBhcmFtIHJnYkFycmF5CisgICAgICogICAgICAgICAgICB0aGUgcmVzdWx0IGFycmF5IHdpbGwgYmUgc3RvcmVkIHRvIHRoaXMgYXJyYXkuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgcmdiQXJyYXkgYXJyYXkuCisgICAgICogQHBhcmFtIHNjYW5zaXplCisgICAgICogICAgICAgICAgICB0aGUgc2NhbmxpbmUgc3RyaWRlIGZvciB0aGUgcmdiQXJyYXkuCiAgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBjb2xvcnMgZm9yIHRoZSBzcGVjaWZpZWQgYXJlYS4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50W10gZ2V0UkdCKGludCBzdGFydFgsIGludCBzdGFydFksIGludCB3LCBpbnQgaCwgaW50W10gcmdiQXJyYXksCi0gICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgc2NhbnNpemUpIHsKKyAgICBwdWJsaWMgaW50W10gZ2V0UkdCKGludCBzdGFydFgsIGludCBzdGFydFksIGludCB3LCBpbnQgaCwgaW50W10gcmdiQXJyYXksIGludCBvZmZzZXQsCisgICAgICAgICAgICBpbnQgc2NhbnNpemUpIHsKICAgICAgICAgaWYgKHJnYkFycmF5ID09IG51bGwpIHsKICAgICAgICAgICAgIHJnYkFycmF5ID0gbmV3IGludFtvZmZzZXQgKyBoICogc2NhbnNpemVdOwogICAgICAgICB9CkBAIC03NjUsMzggKzc3Nyw0NyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgUkdCIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgdG8gdGhlIHNwZWNpZmllZAotICAgICAqIEJ1ZmZlcmVkSW1hZ2UgYXJlYS4gVGhlIHBpeGVscyBhcmUgaW4gdGhlIGRlZmF1bHQgUkdCIGNvbG9yIG1vZGVsIAotICAgICAqIChUWVBFX0lOVF9BUkdCKSBhbmQgZGVmYXVsdCBzUkdCIGNvbG9yIHNwYWNlLgorICAgICAqIFNldHMgUkdCIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgdG8gdGhlIHNwZWNpZmllZCBCdWZmZXJlZEltYWdlCisgICAgICogYXJlYS4gVGhlIHBpeGVscyBhcmUgaW4gdGhlIGRlZmF1bHQgUkdCIGNvbG9yIG1vZGVsIChUWVBFX0lOVF9BUkdCKSBhbmQKKyAgICAgKiBkZWZhdWx0IHNSR0IgY29sb3Igc3BhY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0YXJ0WCB0aGUgc3RhcnQgWCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSBzdGFydFkgdGhlIHN0YXJ0IFkgY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIEJ1ZmZlcmVkSW1hZ2UgYXJlYS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBCdWZmZXJlZEltYWdlIGFyZWEuCi0gICAgICogQHBhcmFtIHJnYkFycmF5IHRoZSBhcnJheSBvZiBSR0IgdmFsdWVzLgotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBvZiB0aGUgcmdiQXJyYXkgYXJyYXkuIAotICAgICAqIEBwYXJhbSBzY2Fuc2l6ZSB0aGUgc2NhbmxpbmUgc3RyaWRlIGZvciB0aGUgcmdiQXJyYXkuCisgICAgICogQHBhcmFtIHN0YXJ0WAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IFggY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0gc3RhcnRZCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgWSBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIEJ1ZmZlcmVkSW1hZ2UgYXJlYS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgQnVmZmVyZWRJbWFnZSBhcmVhLgorICAgICAqIEBwYXJhbSByZ2JBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIFJHQiB2YWx1ZXMuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgcmdiQXJyYXkgYXJyYXkuCisgICAgICogQHBhcmFtIHNjYW5zaXplCisgICAgICogICAgICAgICAgICB0aGUgc2NhbmxpbmUgc3RyaWRlIGZvciB0aGUgcmdiQXJyYXkuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UkdCKGludCBzdGFydFgsIGludCBzdGFydFksIGludCB3LCBpbnQgaCwgaW50W10gcmdiQXJyYXksCi0gICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgc2NhbnNpemUpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRSR0IoaW50IHN0YXJ0WCwgaW50IHN0YXJ0WSwgaW50IHcsIGludCBoLCBpbnRbXSByZ2JBcnJheSwgaW50IG9mZnNldCwKKyAgICAgICAgICAgIGludCBzY2Fuc2l6ZSkgewogICAgICAgICBpbnQgb2ZmID0gb2Zmc2V0OwogICAgICAgICBmb3IgKGludCB5ID0gc3RhcnRZOyB5IDwgc3RhcnRZICsgaDsgeSsrLCBvZmYgKz0gc2NhbnNpemUpIHsKICAgICAgICAgICAgIGludCBpID0gb2ZmOwogICAgICAgICAgICAgZm9yIChpbnQgeCA9IHN0YXJ0WDsgeCA8IHN0YXJ0WCArIHc7IHgrKywgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcmFzdGVyLnNldERhdGFFbGVtZW50cyh4LCB5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNtLmdldERhdGFFbGVtZW50cyhyZ2JBcnJheVtpXSwgbnVsbCkpOworICAgICAgICAgICAgICAgIHJhc3Rlci5zZXREYXRhRWxlbWVudHMoeCwgeSwgY20uZ2V0RGF0YUVsZW1lbnRzKHJnYkFycmF5W2ldLCBudWxsKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGEgdGhlIHNwZWNpZmllZCBSR0IgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBwaXhlbCBvZgotICAgICAqIHRoaXMgQnVmZmVyZWRJbWFnZS4gVGhlIHBpeGVsIHNob3VsZCBiZSBpbiB0aGUgZGVmYXVsdCAKLSAgICAgKiBSR0IgY29sb3IgbW9kZWwgKFRZUEVfSU5UX0FSR0IpIGFuZCBkZWZhdWx0IHNSR0IgY29sb3Igc3BhY2UuIAotICAgICAqICAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KLSAgICAgKiBAcGFyYW0gcmdiIHRoZSBSR0IgdmFsdWUgdG8gYmUgc2V0LgorICAgICAqIFNldHMgYSB0aGUgc3BlY2lmaWVkIFJHQiB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHBpeGVsIG9mIHRoaXMKKyAgICAgKiBCdWZmZXJlZEltYWdlLiBUaGUgcGl4ZWwgc2hvdWxkIGJlIGluIHRoZSBkZWZhdWx0IFJHQiBjb2xvciBtb2RlbAorICAgICAqIChUWVBFX0lOVF9BUkdCKSBhbmQgZGVmYXVsdCBzUkdCIGNvbG9yIHNwYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIHJnYgorICAgICAqICAgICAgICAgICAgdGhlIFJHQiB2YWx1ZSB0byBiZSBzZXQuCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFJHQihpbnQgeCwgaW50IHksIGludCByZ2IpIHsKICAgICAgICAgcmFzdGVyLnNldERhdGFFbGVtZW50cyh4LCB5LCBjbS5nZXREYXRhRWxlbWVudHMocmdiLCBudWxsKSk7CkBAIC04MTQsMjUgKzgzNSwyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYSBjb2xvciBpbiB0aGUgVFlQRV9JTlRfQVJHQiBjb2xvciBtb2RlbCBhbmQgZGVmYXVsdCAKLSAgICAgKiBzUkdCIGNvbG9yc3BhY2Ugb2YgdGhlIHNwZWNpZmllZCBwaXhlbC4gCisgICAgICogR2V0cyBhIGNvbG9yIGluIHRoZSBUWVBFX0lOVF9BUkdCIGNvbG9yIG1vZGVsIGFuZCBkZWZhdWx0IHNSR0IgY29sb3IKKyAgICAgKiBzcGFjZSBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbG9yIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwgaW4gdGhlIFRZUEVfSU5UX0FSR0IgCi0gICAgICogY29sb3IgbW9kZWwgYW5kIGRlZmF1bHQgc1JHQiBjb2xvcnNwYWNlLiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgorICAgICAqIEByZXR1cm4gdGhlIGNvbG9yIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwgaW4gdGhlIFRZUEVfSU5UX0FSR0IgY29sb3IgbW9kZWwKKyAgICAgKiAgICAgICAgIGFuZCBkZWZhdWx0IHNSR0IgY29sb3Igc3BhY2UuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRSR0IoaW50IHgsIGludCB5KSB7CiAgICAgICAgIHJldHVybiBjbS5nZXRSR0IocmFzdGVyLmdldERhdGFFbGVtZW50cyh4LCB5LCBudWxsKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuZXMgdHJ1ZSBpZiBhbHBoYSBpcyBwcmVtdWx0aXBsaWVkLCAKLSAgICAgKiBmYWxzZSBpZiBhbHBoYSBpcyBub3QgcHJlbXVsdGlwbGllZCBvciB0aGVyZSBpcyBubyBhbHBoYS4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgYWxwaGEgaXMgcHJlLW11bHRpcGxpZWQsIGZhbHNlIGlmIGFscGhhIGlzIG5vdAorICAgICAqIHByZS1tdWx0aXBsaWVkIG9yIHRoZXJlIGlzIG5vIGFscGhhLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbHBoYSBpcyBwcmVtdWx0aXBsaWVkLCAKLSAgICAgKiBmYWxzZSBpZiBhbHBoYSBpcyBub3QgcHJlbXVsdGlwbGllZCBvciB0aGVyZSBpcyBubyBhbHBoYS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYWxwaGEgaXMgcHJlLW11bHRpcGxpZWQsIGZhbHNlIGlmIGFscGhhIGlzIG5vdAorICAgICAqICAgICAgICAgcHJlLW11bHRpcGxpZWQgb3IgdGhlcmUgaXMgbm8gYWxwaGEuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQoKSB7CiAgICAgICAgIHJldHVybiBjbS5pc0FscGhhUHJlbXVsdGlwbGllZCgpOwpAQCAtOTA3LDkgKzkyOSw5IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgaW1hZ2Ugc3VyZmFjZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGltYWdlIHN1cmZhY2UKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgaW1hZ2Ugc3VyZmFjZS4KICAgICAgKi8KICAgICBwcml2YXRlIEltYWdlU3VyZmFjZSBjcmVhdGVJbWFnZVN1cmZhY2UoaW50IHR5cGUpIHsKICAgICAgICAgcmV0dXJuIG5ldyBJbWFnZVN1cmZhY2UoZ2V0Q29sb3JNb2RlbCgpLCBnZXRSYXN0ZXIoKSwgdHlwZSk7CkBAIC05MTgsNyArOTQwLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBpbWFnZSBzdXJmYWNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGltYWdlIHN1cmZhY2UKKyAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZSBzdXJmYWNlLgogICAgICAqLwogICAgIEltYWdlU3VyZmFjZSBnZXRJbWFnZVN1cmZhY2UoKSB7CiAgICAgICAgIHJldHVybiBpbWFnZVN1cmY7CkBAIC05MjgsNCArOTUwLDMgQEAKICAgICAgICAgcmV0dXJuIGNtLmdldFRyYW5zcGFyZW5jeSgpOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0J1ZmZlcmVkSW1hZ2VGaWx0ZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9CdWZmZXJlZEltYWdlRmlsdGVyLmphdmEKaW5kZXggNDRiM2MyZS4uOGI2ZmNmMCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0J1ZmZlcmVkSW1hZ2VGaWx0ZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQnVmZmVyZWRJbWFnZUZpbHRlci5qYXZhCkBAIC0yNyw0OSArMjcsNzIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgQnVmZmVyZWRJbWFnZUZpbHRlciBjbGFzcyBwcm92aWRlcyBmaWx0ZXJpbmcgb3BlcmF0aW9ucyB0byAKLSAqIHRoZSBCdWZmZXJlZEltYWdlIG9iamVjdHMgdXNpbmcgb3BlcmF0b3JzIHdoaWNoIGltcGxlbWVudAotICogQnVmZmVyZWRJbWFnZU9wIGludGVyZmFjZS4KKyAqIFRoZSBCdWZmZXJlZEltYWdlRmlsdGVyIGNsYXNzIHByb3ZpZGVzIGZpbHRlcmluZyBvcGVyYXRpb25zIHRvIHRoZQorICogQnVmZmVyZWRJbWFnZSBvYmplY3RzIHVzaW5nIG9wZXJhdG9ycyB3aGljaCBpbXBsZW1lbnQgQnVmZmVyZWRJbWFnZU9wCisgKiBpbnRlcmZhY2UuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQnVmZmVyZWRJbWFnZUZpbHRlciBleHRlbmRzIEltYWdlRmlsdGVyIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IGFjY2Vzc29yLiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGFjY2Vzc29yLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF3dEltYWdlQmFja2Rvb3JBY2Nlc3NvciBhY2Nlc3NvciA9IEF3dEltYWdlQmFja2Rvb3JBY2Nlc3Nvci5nZXRJbnN0YW5jZSgpOwogCi0gICAgLyoqIFRoZSBvcC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgb3AuCisgICAgICovCiAgICAgcHJpdmF0ZSBCdWZmZXJlZEltYWdlT3Agb3A7CiAKLSAgICAvKiogVGhlIHJhc3Rlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcmFzdGVyLgorICAgICAqLwogICAgIHByaXZhdGUgV3JpdGFibGVSYXN0ZXIgcmFzdGVyOwogCi0gICAgLyoqIFRoZSBpIGRhdGEuICovCisgICAgLyoqCisgICAgICogVGhlIGkgZGF0YS4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBpRGF0YVtdOwotICAgIAotICAgIC8qKiBUaGUgYiBkYXRhLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGIgZGF0YS4KKyAgICAgKi8KICAgICBwcml2YXRlIGJ5dGUgYkRhdGFbXTsKIAotICAgIC8qKiBUaGUgd2lkdGguICovCisgICAgLyoqCisgICAgICogVGhlIHdpZHRoLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IHdpZHRoOwotICAgIAotICAgIC8qKiBUaGUgaGVpZ2h0LiAqLworCisgICAgLyoqCisgICAgICogVGhlIGhlaWdodC4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBoZWlnaHQ7CiAKLSAgICAvKiogVGhlIGNtLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjbS4KKyAgICAgKi8KICAgICBwcml2YXRlIENvbG9yTW9kZWwgY207CiAKLSAgICAvKiogVGhlIGZvcmNlZCByZ2IuICovCisgICAgLyoqCisgICAgICogVGhlIGZvcmNlZCByZ2IuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGZvcmNlZFJHQiA9IGZhbHNlOwotICAgIAotICAgIC8qKiBUaGUgdHJhbnNmZXIgdHlwZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSB0cmFuc2ZlciB0eXBlLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IHRyYW5zZmVyVHlwZSA9IERhdGFCdWZmZXIuVFlQRV9VTkRFRklORUQ7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQnVmZmVyZWRJbWFnZUZpbHRlciB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBCdWZmZXJlZEltYWdlT3Agb3BlcmF0b3IuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJ1ZmZlcmVkSW1hZ2VGaWx0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIEJ1ZmZlcmVkSW1hZ2VPcAorICAgICAqIG9wZXJhdG9yLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvcCB0aGUgc3BlY2lmaWVkIEJ1ZmZlcmVkSW1hZ2VPcCBvcGVyYXRvci4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIEJ1ZmZlcmVkSW1hZ2VPcCBpcyBudWxsLgorICAgICAqIEBwYXJhbSBvcAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBCdWZmZXJlZEltYWdlT3Agb3BlcmF0b3IuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIEJ1ZmZlcmVkSW1hZ2VPcCBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlRmlsdGVyKEJ1ZmZlcmVkSW1hZ2VPcCBvcCkgewogICAgICAgICBpZiAob3AgPT0gbnVsbCkgewpAQCAtNzksMTEgKzEwMiwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIEJ1ZmZlcmVkSW1hZ2VPcCBvcGVyYXRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyAKKyAgICAgKiBHZXRzIHRoZSBCdWZmZXJlZEltYWdlT3Agb3BlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMKICAgICAgKiBCdWZmZXJlZEltYWdlRmlsdGVyIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBCdWZmZXJlZEltYWdlT3AgYXNzb2NpYXRlZCB3aXRoIHRoaXMgCi0gICAgICogQnVmZmVyZWRJbWFnZUZpbHRlciBvYmplY3QuCisgICAgICogQHJldHVybiB0aGUgQnVmZmVyZWRJbWFnZU9wIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJ1ZmZlcmVkSW1hZ2VGaWx0ZXIKKyAgICAgKiAgICAgICAgIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgQnVmZmVyZWRJbWFnZU9wIGdldEJ1ZmZlcmVkSW1hZ2VPcCgpIHsKICAgICAgICAgcmV0dXJuIG9wOwpAQCAtMTEwLDIyICsxMzMsMTQgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoCi0gICAgICAgICAgICBpbnQgeCwgaW50IHksIGludAotICAgICAgICAgICAgdywgaW50IGgsCi0gICAgICAgICAgICBDb2xvck1vZGVsIG1vZGVsLCBieXRlW10gcGl4ZWxzLAotICAgICAgICAgICAgaW50IG9mZiwgaW50IHNjYW5zaXplCi0gICAgKSB7CisgICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBDb2xvck1vZGVsIG1vZGVsLCBieXRlW10gcGl4ZWxzLCBpbnQgb2ZmLAorICAgICAgICAgICAgaW50IHNjYW5zaXplKSB7CiAgICAgICAgIHNldFBpeGVscyh4LCB5LCB3LCBoLCBtb2RlbCwgcGl4ZWxzLCBvZmYsIHNjYW5zaXplLCB0cnVlKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoCi0gICAgICAgICAgICBpbnQgeCwgaW50IHksCi0gICAgICAgICAgICBpbnQgdywgaW50IGgsCi0gICAgICAgICAgICBDb2xvck1vZGVsIG1vZGVsLCBpbnRbXSBwaXhlbHMsCi0gICAgICAgICAgICBpbnQgb2ZmLCBpbnQgc2NhbnNpemUKLSAgICApIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgbW9kZWwsIGludFtdIHBpeGVscywgaW50IG9mZiwKKyAgICAgICAgICAgIGludCBzY2Fuc2l6ZSkgewogICAgICAgICBzZXRQaXhlbHMoeCwgeSwgdywgaCwgbW9kZWwsIHBpeGVscywgb2ZmLCBzY2Fuc2l6ZSwgZmFsc2UpOwogICAgIH0KIApAQCAtMTYzLDIyICsxNzgsMjcgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBwaXhlbHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHgKLSAgICAgKiBAcGFyYW0geSB0aGUgeQotICAgICAqIEBwYXJhbSB3IHRoZSB3Ci0gICAgICogQHBhcmFtIGggdGhlIGgKLSAgICAgKiBAcGFyYW0gbW9kZWwgdGhlIG1vZGVsCi0gICAgICogQHBhcmFtIHBpeGVscyB0aGUgcGl4ZWxzCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2ZmCi0gICAgICogQHBhcmFtIHNjYW5zaXplIHRoZSBzY2Fuc2l6ZQotICAgICAqIEBwYXJhbSBpc0J5dGVEYXRhIHRoZSBpcyBieXRlIGRhdGEKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHguCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5LgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgdy4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGguCisgICAgICogQHBhcmFtIG1vZGVsCisgICAgICogICAgICAgICAgICB0aGUgbW9kZWwuCisgICAgICogQHBhcmFtIHBpeGVscworICAgICAqICAgICAgICAgICAgdGhlIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2ZmLgorICAgICAqIEBwYXJhbSBzY2Fuc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIHNjYW5zaXplLgorICAgICAqIEBwYXJhbSBpc0J5dGVEYXRhCisgICAgICogICAgICAgICAgICB0aGUgaXMgYnl0ZSBkYXRhLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRQaXhlbHMoCi0gICAgICAgICAgICBpbnQgeCwgaW50IHksCi0gICAgICAgICAgICBpbnQgdywgaW50IGgsCi0gICAgICAgICAgICBDb2xvck1vZGVsIG1vZGVsLCBPYmplY3QgcGl4ZWxzLAotICAgICAgICAgICAgaW50IG9mZiwgaW50IHNjYW5zaXplLCBib29sZWFuIGlzQnl0ZURhdGEKLSAgICApIHsKKyAgICBwcml2YXRlIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBDb2xvck1vZGVsIG1vZGVsLCBPYmplY3QgcGl4ZWxzLCBpbnQgb2ZmLAorICAgICAgICAgICAgaW50IHNjYW5zaXplLCBib29sZWFuIGlzQnl0ZURhdGEpIHsKICAgICAgICAgLy8gQ2hlY2sgYm91bmRzCiAgICAgICAgIC8vIE5lZWQgdG8gY29weSBvbmx5IHRoZSBwaXhlbHMgdGhhdCB3aWxsIGZpdCBpbnRvIHRoZSBkZXN0aW5hdGlvbiBhcmVhCiAgICAgICAgIGlmICh4IDwgMCkgewpAQCAtMjE2LDIzICsyMzYsMjQgQEAKIAogICAgICAgICBib29sZWFuIGNhbkFycmF5Y29weTsKICAgICAgICAgLy8gUHJvY2VzcyBwaXhlbHMKLSAgICAgICAgc3dpdGNoKHRyYW5zZmVyVHlwZSkgeworICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewogICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVU5ERUZJTkVEOiB7CiAgICAgICAgICAgICAgICAgaWYgKGlzQnl0ZURhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlID0gRGF0YUJ1ZmZlci5UWVBFX0JZVEU7CiAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJhc3Rlcih0cmFuc2ZlclR5cGUpOwotICAgICAgICAgICAgICAgICAgICAvL2JEYXRhID0gbmV3IGJ5dGVbd2lkdGgqaGVpZ2h0XTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYkRhdGEgPSBuZXcgYnl0ZVt3aWR0aCpoZWlnaHRdOwogICAgICAgICAgICAgICAgICAgICBjYW5BcnJheWNvcHkgPSAhZm9yY2VkUkdCOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlID0gRGF0YUJ1ZmZlci5UWVBFX0lOVDsKICAgICAgICAgICAgICAgICBjcmVhdGVSYXN0ZXIodHJhbnNmZXJUeXBlKTsKLSAgICAgICAgICAgICAgICAvL2lEYXRhID0gbmV3IGludFt3aWR0aCpoZWlnaHRdOworICAgICAgICAgICAgICAgIC8vIGlEYXRhID0gbmV3IGludFt3aWR0aCpoZWlnaHRdOwogICAgICAgICAgICAgICAgIGNhbkFycmF5Y29weSA9ICFmb3JjZWRSR0IgfHwgbW9kZWwuZXF1YWxzKENvbG9yTW9kZWwuZ2V0UkdCZGVmYXVsdCgpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0gLy8gQW5kIHByb2NlZWQgdG8gY29weSB0aGUgcGl4ZWxzCiAgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6IHsKLSAgICAgICAgICAgICAgICBpZiAoaXNCeXRlRGF0YSkgeyAvLyBUaGVyZSBhcmUgaW50IGRhdGEgYWxyZWFkeSBidXQgdGhlIG5ldyBkYXRhIGFyZSBieXRlcworICAgICAgICAgICAgICAgIGlmIChpc0J5dGVEYXRhKSB7IC8vIFRoZXJlIGFyZSBpbnQgZGF0YSBhbHJlYWR5IGJ1dCB0aGUgbmV3IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgLy8gYXJlIGJ5dGVzCiAgICAgICAgICAgICAgICAgICAgIGZvcmNlUkdCKCk7CiAgICAgICAgICAgICAgICAgICAgIGNhbkFycmF5Y29weSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI1MCw3ICsyNzEsOCBAQAogICAgICAgICAgICAgICAgIC8vIFJHQiBjb252ZXJzaW9uCiAgICAgICAgICAgICAgICAgY2FuQXJyYXljb3B5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjA2IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI2MCw3ICsyODIsNyBAQAogICAgICAgICBpbnQgZHN0T2Zmc2V0ID0geCArIHkgKiB3aWR0aDsKIAogICAgICAgICBpZiAoY2FuQXJyYXljb3B5KSB7Ci0gICAgICAgICAgICBPYmplY3QgZHN0QXJyYXkgPSBpc0J5dGVEYXRhID8gKE9iamVjdCkgYkRhdGEgOiAoT2JqZWN0KSBpRGF0YTsKKyAgICAgICAgICAgIE9iamVjdCBkc3RBcnJheSA9IGlzQnl0ZURhdGEgPyAoT2JqZWN0KWJEYXRhIDogKE9iamVjdClpRGF0YTsKICAgICAgICAgICAgIGZvciAoOyBvZmYgPCBtYXhPZmZzZXQ7IG9mZiArPSBzY2Fuc2l6ZSwgZHN0T2Zmc2V0ICs9IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwaXhlbHMsIG9mZiwgZHN0QXJyYXksIGRzdE9mZnNldCwgdyk7CiAgICAgICAgICAgICB9CkBAIC0yNzEsMTEgKzI5Myw4IEBACiAgICAgICAgICAgICAgICAgaW50IGRzdFBvcyA9IGRzdE9mZnNldDsKICAgICAgICAgICAgICAgICBpbnQgbWF4RHN0UG9zID0gZHN0T2Zmc2V0ICsgdzsKICAgICAgICAgICAgICAgICBmb3IgKDsgZHN0UG9zIDwgbWF4RHN0UG9zOyBkc3RQb3MrKywgc3JjUG9zKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaURhdGFbZHN0UG9zXSA9IG1vZGVsLmdldFJHQigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0J5dGVEYXRhID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJ5dGVbXSlwaXhlbHMpW3NyY1Bvc10gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50W10pcGl4ZWxzKVtzcmNQb3NdCi0gICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIGlEYXRhW2RzdFBvc10gPSBtb2RlbC5nZXRSR0IoaXNCeXRlRGF0YSA/ICgoYnl0ZVtdKXBpeGVscylbc3JjUG9zXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKChpbnRbXSlwaXhlbHMpW3NyY1Bvc10pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjg3LDIyICszMDYsMjQgQEAKICAgICBwcml2YXRlIHZvaWQgZm9yY2VSR0IoKSB7CiAgICAgICAgIGlmICghZm9yY2VkUkdCKSB7CiAgICAgICAgICAgICBmb3JjZWRSR0IgPSB0cnVlOwotICAgICAgICAgICAgaW50IHNpemUgPSB3aWR0aCpoZWlnaHQ7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IHdpZHRoICogaGVpZ2h0OwogICAgICAgICAgICAgaW50IHJnYkRhdGFbXSA9IG5ldyBpbnRbc2l6ZV07CiAKICAgICAgICAgICAgIGlmIChiRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHJnYkRhdGFbaV0gPSBjbS5nZXRSR0IoYkRhdGFbaV0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoaURhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICAgICAgICAgICAgICByZ2JEYXRhW2ldID0gY20uZ2V0UkdCKGlEYXRhW2ldKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNtID0gQ29sb3JNb2RlbC5nZXRSR0JkZWZhdWx0KCk7CiAgICAgICAgICAgICBEYXRhQnVmZmVySW50IGRiID0gbmV3IERhdGFCdWZmZXJJbnQocmdiRGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICBpbnQgbWFza3NbXSA9IG5ldyBpbnRbXSB7MHgwMGZmMDAwMCwgMHgwMDAwZmYwMCwgMHgwMDAwMDBmZiwgMHhmZjAwMDAwMH07CisgICAgICAgICAgICBpbnQgbWFza3NbXSA9IG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgICAgIDB4MDBmZjAwMDAsIDB4MDAwMGZmMDAsIDB4MDAwMDAwZmYsIDB4ZmYwMDAwMDAKKyAgICAgICAgICAgIH07CiAgICAgICAgICAgICByYXN0ZXIgPSBSYXN0ZXIuY3JlYXRlUGFja2VkUmFzdGVyKGRiLCB3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgbWFza3MsIG51bGwpOwogICAgICAgICAgICAgaURhdGEgPSBhY2Nlc3Nvci5nZXREYXRhSW50KGRiKTsKICAgICAgICAgICAgIGJEYXRhID0gbnVsbDsKQEAgLTMyNywxMSArMzQ4LDEyIEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgcmFzdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0aGUgZGF0YSB0eXBlCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBjcmVhdGVSYXN0ZXIoaW50IGRhdGFUeXBlKSB7CiAgICAgICAgIGJvb2xlYW4gY3JlYXRlZFZhbGlkQnVmZmVyID0gZmFsc2U7Ci0gICAgICAgIHRyeXsKKyAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJhc3RlciA9IGNtLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3Rlcih3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgIGludCByYXN0ZXJUeXBlID0gcmFzdGVyLmdldERhdGFCdWZmZXIoKS5nZXREYXRhVHlwZSgpOwogICAgICAgICAgICAgaWYgKHJhc3RlclR5cGUgPT0gZGF0YVR5cGUpIHsKQEAgLTM1NCwxMyArMzc2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkVmFsaWRCdWZmZXIgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZihjbSA9PSBDb2xvck1vZGVsLmdldFJHQmRlZmF1bHQoKSl7CisgICAgICAgICAgICAgICAgaWYgKGNtID09IENvbG9yTW9kZWwuZ2V0UkdCZGVmYXVsdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvcmNlZFJHQiA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBjcmVhdGVkVmFsaWRCdWZmZXIgPSBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgY3JlYXRlZFZhbGlkQnVmZmVyID0gZmFsc2U7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0J1ZmZlcmVkSW1hZ2VPcC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0J1ZmZlcmVkSW1hZ2VPcC5qYXZhCmluZGV4IDg1YjlmNGUuLjg4M2EzOWQgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9CdWZmZXJlZEltYWdlT3AuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQnVmZmVyZWRJbWFnZU9wLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgQWxleGV5IEEuIFBldHJlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEuYXd0LlJlbmRlcmluZ0hpbnRzOwpAQCAtMjcsMzIgKzI4LDM2IEBACiAvKioKICAqIFRoZSBCdWZmZXJlZEltYWdlT3AgaW50ZXJmYWNlIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHBlcmZvcm1pbmcgdHJhbnNmb3JtYXRpb25zCiAgKiBmcm9tIHNvdXJjZSBkYXRhIHRvIGRlc3RpbmF0aW9uIGRhdGEgZm9yIEJ1ZmZlcmVkSW1hZ2Ugb2JqZWN0cy4gQW4gb2JqZWN0Ci0gKiBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIHBhc3NlZCBpbnRvIGEgQnVmZmVyZWRJbWFnZUZpbHRlciAKLSAqIHRvIG9wZXJhdGUgb24gYSBCdWZmZXJlZEltYWdlLgorICogaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSBwYXNzZWQgaW50byBhIEJ1ZmZlcmVkSW1hZ2VGaWx0ZXIgdG8KKyAqIG9wZXJhdGUgb24gYSBCdWZmZXJlZEltYWdlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBCdWZmZXJlZEltYWdlT3AgewotICAgIAorCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIGRlc3RpbmF0aW9uIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBCdWZmZXJlZEltYWdlIGFuZAotICAgICAqIENvbG9yTW9kZWw7IHRoaXMgZGVzdGluYXRpb24gaW1hZ2UgaXMgZW1wdHkgYW5kIGhhcyB0aGUgY29ycmVjdCBzaXplIAotICAgICAqIGFuZCBudW1iZXIgb2YgYmFuZHMuICAgCisgICAgICogQ29sb3JNb2RlbDsgdGhpcyBkZXN0aW5hdGlvbiBpbWFnZSBpcyBlbXB0eSBhbmQgaGFzIHRoZSBjb3JyZWN0IHNpemUgYW5kCisgICAgICogbnVtYmVyIG9mIGJhbmRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIHNvdXJjZSBCdWZmZXJlZEltYWdlLgotICAgICAqIEBwYXJhbSBkZXN0Q00gdGhlIGRlc3RpbmF0aW9uIENvbG9yTW9kZWwuCi0gICAgICogCisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBCdWZmZXJlZEltYWdlLgorICAgICAqIEBwYXJhbSBkZXN0Q00KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBDb2xvck1vZGVsLgogICAgICAqIEByZXR1cm4gdGhlIEJ1ZmZlcmVkSW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIEJ1ZmZlcmVkSW1hZ2UgY3JlYXRlQ29tcGF0aWJsZURlc3RJbWFnZShCdWZmZXJlZEltYWdlIHNyYywgQ29sb3JNb2RlbCBkZXN0Q00pOwogCiAgICAgLyoqCi0gICAgICogUGVyZm9ybXMgYSBmaWx0ZXIgb3BlcmF0aW9uIG9uIHRoZSBzb3VyY2UgQnVmZmVyZWRJbWFnZSBhbmQgc3RvcmVzIAotICAgICAqIHRoZSByZXN1bHRpbmcgQnVmZmVyZWRJbWFnZSB0byB0aGUgZGVzdGluYXRpb24gQnVmZmVyZWRJbWFnZS4gSWYgCi0gICAgICogdGhlIGRlc3RpbmF0aW9uIEJ1ZmZlcmVkSW1hZ2UgaXMgbnVsbCwgYSBCdWZmZXJlZEltYWdlIHdpdGggYW4gCi0gICAgICogYXBwcm9wcmlhdGUgQ29sb3JNb2RlbCBpcyBjcmVhdGVkLgorICAgICAqIFBlcmZvcm1zIGEgZmlsdGVyIG9wZXJhdGlvbiBvbiB0aGUgc291cmNlIEJ1ZmZlcmVkSW1hZ2UgYW5kIHN0b3JlcyB0aGUKKyAgICAgKiByZXN1bHRpbmcgQnVmZmVyZWRJbWFnZSB0byB0aGUgZGVzdGluYXRpb24gQnVmZmVyZWRJbWFnZS4gSWYgdGhlCisgICAgICogZGVzdGluYXRpb24gQnVmZmVyZWRJbWFnZSBpcyBudWxsLCBhIEJ1ZmZlcmVkSW1hZ2Ugd2l0aCBhbiBhcHByb3ByaWF0ZQorICAgICAqIENvbG9yTW9kZWwgaXMgY3JlYXRlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBzb3VyY2UgQnVmZmVyZWRJbWFnZS4KLSAgICAgKiBAcGFyYW0gZGVzdCB0aGUgZGVzdGluYXRpb24gQnVmZmVyZWRJbWFnZSwgd2hlcmUgdGhlIHJlc3VsdCBpcyBzdG9yZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBCdWZmZXJlZEltYWdlLgorICAgICAqIEBwYXJhbSBkZXN0CisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gQnVmZmVyZWRJbWFnZSwgd2hlcmUgdGhlIHJlc3VsdCBpcyBzdG9yZWQuCiAgICAgICogQHJldHVybiB0aGUgZmlsdGVyZWQgQnVmZmVyZWRJbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgQnVmZmVyZWRJbWFnZSBmaWx0ZXIoQnVmZmVyZWRJbWFnZSBzcmMsIEJ1ZmZlcmVkSW1hZ2UgZGVzdCk7CkBAIC02MCwxOSArNjUsMjAgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBib3VuZHMgb2YgZmlsdGVyZWQgaW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc291cmNlIEJ1ZmZlcmVkSW1hZ2UgdG8gYmUgZmlsdGVyZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBCdWZmZXJlZEltYWdlIHRvIGJlIGZpbHRlcmVkLgogICAgICAqIEByZXR1cm4gdGhlIHJlY3RhbmdsZSBib3VuZHMgb2YgZmlsdGVyZWQgaW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIFJlY3RhbmdsZTJEIGdldEJvdW5kczJEKEJ1ZmZlcmVkSW1hZ2Ugc3JjKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHBvaW50IG9mIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSB3aGljaCBjb3JyZXNwb25kcwotICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgcG9pbnQgaW4gdGhlIHNvdXJjZSBpbWFnZS4gCisgICAgICogR2V0cyB0aGUgcG9pbnQgb2YgdGhlIGRlc3RpbmF0aW9uIGltYWdlIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAqIHNwZWNpZmllZCBwb2ludCBpbiB0aGUgc291cmNlIGltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmNQdCB0aGUgcG9pbnQgb2YgdGhlIHNvdXJjZSBpbWFnZS4KLSAgICAgKiBAcGFyYW0gZHN0UHQgdGhlIHBvaW50IHdoZXJlIHRoZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIHNyY1B0CisgICAgICogICAgICAgICAgICB0aGUgcG9pbnQgb2YgdGhlIHNvdXJjZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gZHN0UHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2ludCB3aGVyZSB0aGUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkLgogICAgICAqIEByZXR1cm4gdGhlIGRlc3RpbmF0aW9uIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBQb2ludDJEIGdldFBvaW50MkQoUG9pbnQyRCBzcmNQdCwgUG9pbnQyRCBkc3RQdCk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvQnl0ZUxvb2t1cFRhYmxlLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQnl0ZUxvb2t1cFRhYmxlLmphdmEKaW5kZXggMDQzYjUzMy4uMjdjZWUzMCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0J5dGVMb29rdXBUYWJsZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9CeXRlTG9va3VwVGFibGUuamF2YQpAQCAtMjQsMjUgKzI0LDI5IEBACiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiAvKioKLSAqIFRoZSBCeXRlTG9va3VwVGFibGUgY2xhc3MgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgbG9va3VwIG9wZXJhdGlvbnMsIAotICogYW5kIGlzIGRlZmluZWQgYnkgYW4gaW5wdXQgYnl0ZSBhcnJheSBmb3IgYmFuZHMgb3IgY29tcG9uZW50cyBvZiAKLSAqIGltYWdlIGFuZCBhbiBvZmZzZXQgdmFsdWUuCi0gKiBUaGUgb2Zmc2V0IHZhbHVlIHdpbGwgYmUgc3VidHJhY3RlZCBmcm9tIHRoZSBpbnB1dCB2YWx1ZXMgYmVmb3JlIAotICogaW5kZXhpbmcgdGhlIGlucHV0IGFycmF5cy4gVGhlIG91dHB1dCBvZiBhIGxvb2t1cCBvcGVyYXRpb24gaXMgCisgKiBUaGUgQnl0ZUxvb2t1cFRhYmxlIGNsYXNzIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIGxvb2t1cCBvcGVyYXRpb25zLCBhbmQKKyAqIGlzIGRlZmluZWQgYnkgYW4gaW5wdXQgYnl0ZSBhcnJheSBmb3IgYmFuZHMgb3IgY29tcG9uZW50cyBvZiBpbWFnZSBhbmQgYW4KKyAqIG9mZnNldCB2YWx1ZS4gVGhlIG9mZnNldCB2YWx1ZSB3aWxsIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgdmFsdWVzCisgKiBiZWZvcmUgaW5kZXhpbmcgdGhlIGlucHV0IGFycmF5cy4gVGhlIG91dHB1dCBvZiBhIGxvb2t1cCBvcGVyYXRpb24gaXMKICAqIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IG9mIHVuc2lnbmVkIGJ5dGVzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEJ5dGVMb29rdXBUYWJsZSBleHRlbmRzIExvb2t1cFRhYmxlIHsKLSAgICAKLSAgICAvKiogVGhlIGRhdGEuICovCi0gICAgcHJpdmF0ZSBieXRlIGRhdGFbXVtdOwotICAgIAorCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJ5dGVMb29rdXBUYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2Zmc2V0IHZhbHVlCi0gICAgICogYW5kIHRoZSBzcGVjaWZpZWQgYnl0ZSBhcnJheSB3aGljaCByZXByZXNlbnRzIHRoZSBsb29rdXAgdGFibGUgZm9yCi0gICAgICogYWxsIGJhbmRzLgorICAgICAqIFRoZSBkYXRhLgorICAgICAqLworICAgIHByaXZhdGUgYnl0ZSBkYXRhW11bXTsKKworICAgIC8qKgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBCeXRlTG9va3VwVGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9mZnNldCB2YWx1ZSBhbmQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGJ5dGUgYXJyYXkgd2hpY2ggcmVwcmVzZW50cyB0aGUgbG9va3VwIHRhYmxlIGZvciBhbGwgYmFuZHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHZhbHVlLgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIGFycmF5IG9mIGJ5dGVzLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgdmFsdWUuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5IG9mIGJ5dGVzLgogICAgICAqLwogICAgIHB1YmxpYyBCeXRlTG9va3VwVGFibGUoaW50IG9mZnNldCwgYnl0ZVtdIGRhdGEpIHsKICAgICAgICAgc3VwZXIob2Zmc2V0LCAxKTsKQEAgLTU0LDEyICs1OCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBCeXRlTG9va3VwVGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9mZnNldCB2YWx1ZQotICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIGJ5dGUgYXJyYXkgb2YgYXJyYXlzIHdoaWNoIHJlcHJlc2VudHMgdGhlIGxvb2t1cCB0YWJsZQotICAgICAqIGZvciBlYWNoIGJhbmQuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJ5dGVMb29rdXBUYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2Zmc2V0IHZhbHVlIGFuZAorICAgICAqIHRoZSBzcGVjaWZpZWQgYnl0ZSBhcnJheSBvZiBhcnJheXMgd2hpY2ggcmVwcmVzZW50cyB0aGUgbG9va3VwIHRhYmxlIGZvcgorICAgICAqIGVhY2ggYmFuZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdmFsdWUuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgYXJyYXkgb2YgYnl0ZXMgYXJyYXkgZm9yIGVhY2ggYmFuZC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHZhbHVlLgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSBvZiBieXRlcyBhcnJheSBmb3IgZWFjaCBiYW5kLgogICAgICAqLwogICAgIHB1YmxpYyBCeXRlTG9va3VwVGFibGUoaW50IG9mZnNldCwgYnl0ZVtdW10gZGF0YSkgewogICAgICAgICBzdXBlcihvZmZzZXQsIGRhdGEubGVuZ3RoKTsKQEAgLTcxLDkgKzc3LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb29rdXAgdGFibGUgb2YgdGhpcyBCeXRlTG9va3VwVGFibGUgb2JqZWN0LiBJZiAKLSAgICAgKiB0aGlzIEJ5dGVMb29rdXBUYWJsZSBvYmplY3QgaGFzIG9uZSBieXRlIGFycmF5IGZvciBhbGwgYmFuZHMsIAotICAgICAqIHRoZSByZXR1cm5lZCBhcnJheSBsZW5ndGggaXMgb25lLgorICAgICAqIEdldHMgdGhlIGxvb2t1cCB0YWJsZSBvZiB0aGlzIEJ5dGVMb29rdXBUYWJsZSBvYmplY3QuIElmIHRoaXMKKyAgICAgKiBCeXRlTG9va3VwVGFibGUgb2JqZWN0IGhhcyBvbmUgYnl0ZSBhcnJheSBmb3IgYWxsIGJhbmRzLCB0aGUgcmV0dXJuZWQKKyAgICAgKiBhcnJheSBsZW5ndGggaXMgb25lLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGxvb2t1cCB0YWJsZSBvZiB0aGlzIEJ5dGVMb29rdXBUYWJsZSBvYmplY3QuCiAgICAgICovCkBAIC05MSwxMSArOTcsMTEgQEAKICAgICAgICAgaW50IG9mZnNldCA9IGdldE9mZnNldCgpOwogICAgICAgICBpZiAoZ2V0TnVtQ29tcG9uZW50cygpID09IDEpIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZHN0W2ldID0gZGF0YVswXVtzcmNbaV0tb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBkYXRhWzBdW3NyY1tpXSAtIG9mZnNldF07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdldE51bUNvbXBvbmVudHMoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZHN0W2ldID0gZGF0YVtpXVtzcmNbaV0tb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBkYXRhW2ldW3NyY1tpXSAtIG9mZnNldF07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTAzLDE0ICsxMDksMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYnl0ZSBhcnJheSB3aGljaCBjb250YWlucyBzYW1wbGVzIG9mIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBwaXhlbCB3aGljaCBpcyB0cmFuc2xhdGVkIHdpdGggdGhlIGxvb2t1cCB0YWJsZSBvZiB0aGlzIAotICAgICAqIEJ5dGVMb29rdXBUYWJsZSBvYmplY3QuIFRoZSByZXN1bHRlZCBhcnJheSBpcyBzdG9yZWQgdG8KLSAgICAgKiB0aGUgZHN0IGFycmF5LgorICAgICAqIFJldHVybnMgYSBieXRlIGFycmF5IHdoaWNoIGNvbnRhaW5zIHNhbXBsZXMgb2YgdGhlIHNwZWNpZmllZCBwaXhlbCB3aGljaAorICAgICAqIGlzIHRyYW5zbGF0ZWQgd2l0aCB0aGUgbG9va3VwIHRhYmxlIG9mIHRoaXMgQnl0ZUxvb2t1cFRhYmxlIG9iamVjdC4gVGhlCisgICAgICogcmVzdWx0ZWQgYXJyYXkgaXMgc3RvcmVkIHRvIHRoZSBkc3QgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc291cmNlIGFycmF5LgotICAgICAqIEBwYXJhbSBkc3QgdGhlIGRlc3RpbmF0aW9uIGFycmF5IHdoZXJlIHRoZSByZXN1bHQgY2FuIGJlIHN0b3JlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGFycmF5LgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGVyZSB0aGUgcmVzdWx0IGNhbiBiZSBzdG9yZWQuCiAgICAgICogQHJldHVybiB0aGUgYnl0ZSBhcnJheSBvZiB0cmFuc2xhdGVkIHNhbXBsZXMgb2YgYSBwaXhlbC4KICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGxvb2t1cFBpeGVsKGJ5dGVbXSBzcmMsIGJ5dGVbXSBkc3QpIHsKQEAgLTEyMSwxMSArMTI3LDExIEBACiAgICAgICAgIGludCBvZmZzZXQgPSBnZXRPZmZzZXQoKTsKICAgICAgICAgaWYgKGdldE51bUNvbXBvbmVudHMoKSA9PSAxKSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNyYy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGRzdFtpXSA9IGRhdGFbMF1bc3JjW2ldLW9mZnNldF07CisgICAgICAgICAgICAgICAgZHN0W2ldID0gZGF0YVswXVtzcmNbaV0gLSBvZmZzZXRdOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXROdW1Db21wb25lbnRzKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGRzdFtpXSA9IGRhdGFbaV1bc3JjW2ldLW9mZnNldF07CisgICAgICAgICAgICAgICAgZHN0W2ldID0gZGF0YVtpXVtzcmNbaV0gLSBvZmZzZXRdOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9Db2xvckNvbnZlcnRPcC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0NvbG9yQ29udmVydE9wLmphdmEKaW5kZXggNmQ1MDNkNy4uMWExNzAwYiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0NvbG9yQ29udmVydE9wLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0NvbG9yQ29udmVydE9wLmphdmEKQEAgLTE3LDkgKzE3LDkgQEAKIC8qKiAKICAqIEBhdXRob3IgT2xlZyBWLiBLaGFzY2hhbnNreQogICogQHZlcnNpb24gJFJldmlzaW9uJAotICovICAKLXBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CisgKi8KIAorcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7CiBpbXBvcnQgamF2YS5hd3QuUG9pbnQ7CkBAIC0zNyw3NiArMzcsOTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgQ29sb3JDb252ZXJ0T3AgY2xhc3MgY29udmVydHMgdGhlIHBpeGVscyBvZiB0aGUgZGF0YSBpbiB0aGUKLSAqIHNvdXJjZSBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgQ29sb3JTcGFjZSBvYmplY3RzIG9yIGFuIGFycmF5IAotICogb2YgSUNDX1Byb2ZpbGUgb2JqZWN0cy4gVGhlIHJlc3VsdCBwaXhlbHMgYXJlIHNjYWxlZCB0byB0aGUgcHJlY2lzaW9uCi0gKiBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2UuCisgKiBUaGUgQ29sb3JDb252ZXJ0T3AgY2xhc3MgY29udmVydHMgdGhlIHBpeGVscyBvZiB0aGUgZGF0YSBpbiB0aGUgc291cmNlIGltYWdlCisgKiB3aXRoIHRoZSBzcGVjaWZpZWQgQ29sb3JTcGFjZSBvYmplY3RzIG9yIGFuIGFycmF5IG9mIElDQ19Qcm9maWxlIG9iamVjdHMuIFRoZQorICogcmVzdWx0IHBpeGVscyBhcmUgc2NhbGVkIHRvIHRoZSBwcmVjaXNpb24gb2YgdGhlIGRlc3RpbmF0aW9uIGltYWdlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIENvbG9yQ29udmVydE9wIGltcGxlbWVudHMgQnVmZmVyZWRJbWFnZU9wLCBSYXN0ZXJPcCB7CiAgICAgLy8gVW51c2VkIGJ1dCByZXF1aXJlZCBieSBpbnRlcmZhY2VzCi0gICAgLyoqIFRoZSByZW5kZXJpbmcgaGludHMuICovCisgICAgLyoqCisgICAgICogVGhlIHJlbmRlcmluZyBoaW50cy4KKyAgICAgKi8KICAgICBSZW5kZXJpbmdIaW50cyByZW5kZXJpbmdIaW50czsKLSAgICAgICAgCi0gICAgLy8gU2VxdWVuY2UgY29uc2lzdGluZyBvZiBDb2xvclNwYWNlIGFuZCBJQ0NfUHJvZmlsZSBlbGVtZW50cwotICAgIC8qKiBUaGUgY29udmVyc2lvbiBzZXF1ZW5jZS4gKi8KLSAgICBPYmplY3QgY29udmVyc2lvblNlcXVlbmNlW10gPSBuZXcgSUNDX1Byb2ZpbGVbMF07IC8vIFRvIGVsaW1pbmF0ZSBjaGVja3MgZm9yIG51bGwKLSAgICAKLSAgICAvLyBOb3QgbnVsbCBpZiBDb2xvckNvbnZlcnRPcCBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBhcnJheSBvZiBJQ0MgcHJvZmlsZXMKLSAgICAvKiogVGhlIG1pZCBwcm9maWxlcy4gKi8KLSAgICBwcml2YXRlIElDQ19Qcm9maWxlIG1pZFByb2ZpbGVzW107ICAgCiAKLSAgICAvKiogVGhlIGNjLiAqLworICAgIC8vIFNlcXVlbmNlIGNvbnNpc3Rpbmcgb2YgQ29sb3JTcGFjZSBhbmQgSUNDX1Byb2ZpbGUgZWxlbWVudHMKKyAgICAvKioKKyAgICAgKiBUaGUgY29udmVyc2lvbiBzZXF1ZW5jZS4KKyAgICAgKi8KKyAgICBPYmplY3QgY29udmVyc2lvblNlcXVlbmNlW10gPSBuZXcgSUNDX1Byb2ZpbGVbMF07IC8vIFRvIGVsaW1pbmF0ZSBjaGVja3MgZm9yCisKKyAgICAvLyBudWxsCisKKyAgICAvLyBOb3QgbnVsbCBpZiBDb2xvckNvbnZlcnRPcCBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBhcnJheSBvZiBJQ0MgcHJvZmlsZXMKKyAgICAvKioKKyAgICAgKiBUaGUgbWlkIHByb2ZpbGVzLgorICAgICAqLworICAgIHByaXZhdGUgSUNDX1Byb2ZpbGUgbWlkUHJvZmlsZXNbXTsKKworICAgIC8qKgorICAgICAqIFRoZSBjYy4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIENvbG9yQ29udmVydGVyIGNjID0gbmV3IENvbG9yQ29udmVydGVyKCk7Ci0gICAgCi0gICAgLyoqIFRoZSB0IGNyZWF0b3IuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgdCBjcmVhdG9yLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgSUNDX1RyYW5zZm9tQ3JlYXRvciB0Q3JlYXRvciA9IG5ldyBJQ0NfVHJhbnNmb21DcmVhdG9yKCk7Ci0gICAgCi0gICAgLyoqIFRoZSBpcyBpY2MuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgaXMgaWNjLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBpc0lDQyA9IHRydWU7Ci0gICAgCi0gICAgCisKICAgICAvLyBDYWNoZWQgSUNDX1RyYW5zZm9ybQogICAgIC8qKgogICAgICAqIFRoZSBDbGFzcyBJQ0NfVHJhbnNmb21DcmVhdG9yLgogICAgICAqLwogICAgIHByaXZhdGUgY2xhc3MgSUNDX1RyYW5zZm9tQ3JlYXRvciB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHRyYW5zZm9ybS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRyYW5zZm9ybS4KKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgSUNDX1RyYW5zZm9ybSB0cmFuc2Zvcm07Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIG1heCBjb21wb25lbnRzLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWF4IGNvbXBvbmVudHMuCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIGludCBtYXhDb21wb25lbnRzOwotICAgICAgICAKKwogICAgICAgICAvKioKICAgICAgICAgICogRm9yIHRoZSBmdWxsIElDQyBjYXNlLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHNyYyB0aGUgc3JjCi0gICAgICAgICAqIEBwYXJhbSBkc3QgdGhlIGRzdAotICAgICAgICAgKiBAcGFyYW0gY29udlNlcSB0aGUgY29udiBzZXEKLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybQorICAgICAgICAgKiBAcGFyYW0gc3JjCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHNyYy4KKyAgICAgICAgICogQHBhcmFtIGRzdAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBkc3QuCisgICAgICAgICAqIEBwYXJhbSBjb252U2VxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGNvbnYgc2VxLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm0uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgSUNDX1RyYW5zZm9ybSBnZXRUcmFuc2Zvcm0oSUNDX1Byb2ZpbGUgc3JjLCBJQ0NfUHJvZmlsZSBkc3QsIElDQ19Qcm9maWxlIGNvbnZTZXFbXSkgewotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICBzcmMgPT0gdHJhbnNmb3JtLmdldFNyYygpICYmIAotICAgICAgICAgICAgICAgZHN0ID09IHRyYW5zZm9ybS5nZXREc3QoKSkgeworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybSAhPSBudWxsICYmIHNyYyA9PSB0cmFuc2Zvcm0uZ2V0U3JjKCkgJiYgZHN0ID09IHRyYW5zZm9ybS5nZXREc3QoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm07CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaW50IGxlbmd0aCA9IGNvbnZTZXEubGVuZ3RoOwogICAgICAgICAgICAgaW50IHNyY0ZsZyA9IDAsIGRzdEZsZyA9IDA7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwIHx8IHNyYyAhPSBjb252U2VxWzBdKSB7CiAgICAgICAgICAgICAgICAgaWYgKHNyYyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIHNyY0ZsZyA9IDE7IC8vIG5lZWQgc3JjIHByb2ZpbGUKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGVuZ3RoID09IDAgfHwgZHN0ICE9IGNvbnZTZXFbbGVuZ3RoLTFdKSB7CisgICAgICAgICAgICBpZiAobGVuZ3RoID09IDAgfHwgZHN0ICE9IGNvbnZTZXFbbGVuZ3RoIC0gMV0pIHsKICAgICAgICAgICAgICAgICBpZiAoZHN0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgZHN0RmxnID0gMTsgLy8gbmVlZCBkc3QgcHJvZmlsZQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBJQ0NfUHJvZmlsZSBwcm9maWxlc1tdOwogICAgICAgICAgICAgaW50IG5Qcm9maWxlcyA9IGxlbmd0aCArIHNyY0ZsZyArIGRzdEZsZzsKICAgICAgICAgICAgIGlmIChuUHJvZmlsZXMgPT0gbGVuZ3RoKSB7CkBAIC0xMTcsMzAgKzEzNSwzMSBAQAogICAgICAgICAgICAgICAgIGlmIChzcmNGbGcgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBwcm9maWxlc1twb3MrK10gPSBzcmM7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXNbcG9zKytdID0gY29udlNlcVtpXTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGRzdEZsZyAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzW3BvcysrXSA9IGRzdDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybSA9IG5ldyBJQ0NfVHJhbnNmb3JtKHByb2ZpbGVzKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvKioKLSAgICAgICAgICogVXNlZCBvbmx5IHdoZW4gdGhlcmUgYXJlIG5vbi1JQ0MgY29sb3Igc3BhY2VzLgotICAgICAgICAgKiBSZXR1cm5zIHNlcXVlbmNlIG9mIG5vbi1JQ0MgY29sb3Igc3BhY2VzIGFuZCBJQ0MgdHJhbnNmb3JtcwotICAgICAgICAgKiBtYWRlIGZyb20gc3JjLCBkc3QgYW5kIGNvbnZlcnNpb25TZXF1ZW5jZS4KKyAgICAgICAgICogVXNlZCBvbmx5IHdoZW4gdGhlcmUgYXJlIG5vbi1JQ0MgY29sb3Igc3BhY2VzLiBSZXR1cm5zIHNlcXVlbmNlIG9mCisgICAgICAgICAqIG5vbi1JQ0MgY29sb3Igc3BhY2VzIGFuZCBJQ0MgdHJhbnNmb3JtcyBtYWRlIGZyb20gc3JjLCBkc3QgYW5kCisgICAgICAgICAqIGNvbnZlcnNpb25TZXF1ZW5jZS4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBzcmMgdGhlIHNyYwotICAgICAgICAgKiBAcGFyYW0gZHN0IHRoZSBkc3QKLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHNlcXVlbmNlCisgICAgICAgICAqIEBwYXJhbSBzcmMKKyAgICAgICAgICogICAgICAgICAgICB0aGUgc3JjLgorICAgICAgICAgKiBAcGFyYW0gZHN0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGRzdC4KKyAgICAgICAgICogQHJldHVybiB0aGUgc2VxdWVuY2UuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0U2VxdWVuY2UoT2JqZWN0IHNyYywgT2JqZWN0IGRzdCkgewogICAgICAgICAgICAgQXJyYXlMaXN0PE9iamVjdD4gcHJvZmlsZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oMTApOwotICAgICAgICAgICAgQXJyYXlMaXN0PE9iamVjdD4gc2VxdWVuY2UgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oMTApOyAgICAgICAgIAorICAgICAgICAgICAgQXJyYXlMaXN0PE9iamVjdD4gc2VxdWVuY2UgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oMTApOwogCiAgICAgICAgICAgICAvLyBXZSBuZWVkIHRoaXMgcHJvZmlsZSBhbnl3YXkKICAgICAgICAgICAgIElDQ19Qcm9maWxlIHh5elByb2ZpbGUgPSBJQ0NfUHJvZmlsZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX0NJRVhZWik7CkBAIC0xNDksNDEgKzE2OCw0MiBAQAogICAgICAgICAgICAgaW50IGNvbnZlcnNpb25MZW5ndGggPSBjb252ZXJzaW9uU2VxdWVuY2UubGVuZ3RoOwogICAgICAgICAgICAgaWYgKGNvbnZlcnNpb25MZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgY29udmVyc2lvbkZpcnN0ID0gY29udmVyc2lvblNlcXVlbmNlWzBdOwotICAgICAgICAgICAgICAgIGNvbnZlcnNpb25MYXN0ID0gY29udmVyc2lvblNlcXVlbmNlW2NvbnZlcnNpb25MZW5ndGgtMV07CisgICAgICAgICAgICAgICAgY29udmVyc2lvbkxhc3QgPSBjb252ZXJzaW9uU2VxdWVuY2VbY29udmVyc2lvbkxlbmd0aCAtIDFdOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBib29sZWFuIGljY1NlcXVlbmNlU3RhcnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmIChzcmMgIT0gY29udmVyc2lvbkZpcnN0ICYmIHNyYyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaWYgKHNyYyBpbnN0YW5jZW9mIElDQ19Qcm9maWxlKSB7CiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChzcmMpOwogICAgICAgICAgICAgICAgICAgICBpY2NTZXF1ZW5jZVN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZCh4eXpQcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UuYWRkKHNyYyk7IC8vIEFkZCBub24tSUNDIGNvbG9yIHNwYWNlIHRvIHRoZSBzZXF1ZW5jZQotICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlLmFkZChzcmMpOyAvLyBBZGQgbm9uLUlDQyBjb2xvciBzcGFjZSB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VxdWVuY2UKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZCh4eXpQcm9maWxlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNvbnZlcnNpb25MZW5ndGg7IGkrKykgeworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnZlcnNpb25MZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgIGlmIChjb252ZXJzaW9uU2VxdWVuY2VbaV0gaW5zdGFuY2VvZiBJQ0NfUHJvZmlsZSkgewogICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQoY29udmVyc2lvblNlcXVlbmNlW2ldKTsKICAgICAgICAgICAgICAgICAgICAgaWNjU2VxdWVuY2VTdGFydGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGljY1NlcXVlbmNlU3RhcnRlZCkgewogICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQoeHl6UHJvZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgICAgIC8vIEVsaW1pbmF0ZSBzYW1lIHByb2ZpbGVzIGlmIHRoZXJlIGFyZSBhbnkKICAgICAgICAgICAgICAgICAgICAgLy8gKGUuZy4geHl6UHJvZmlsZSBtYXkgb2NjdXIgc2V2ZXJhbCB0aW1lcykKICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHByZXYgPSBwcm9maWxlcy5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGs9MTsgazxwcm9maWxlcy5zaXplKCk7IGsrKykgeyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMTsgayA8IHByb2ZpbGVzLnNpemUoKTsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBwcm9maWxlcy5nZXQoaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMucmVtb3ZlKGspOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9IHByb2ZpbGVzLmdldChrKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgICAgICAvLyBJZiBvbmx5IG9uZSBwcm9maWxlIGxlZnQgd2Ugc2tpcCB0aGUgdHJhbnNmb3JtIC0KICAgICAgICAgICAgICAgICAgICAgLy8gaXQgY2FuIGJlIG9ubHkgQ0lFWFlaCiAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlcy5zaXplKCkgPiAxKSB7CkBAIC0xOTIsMTA5ICsyMTIsMTExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgbm9uLUlDQyBjb2xvciBzcGFjZSB0byB0aGUgc2VxdWVuY2UKICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlLmFkZChjb252ZXJzaW9uU2VxdWVuY2VbaV0pOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZCh4eXpQcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgaWNjU2VxdWVuY2VTdGFydGVkID0gZmFsc2U7IC8vIFNlcXVlbmNlIG9mIElDQyBwcm9maWxlcyBpcyBwcm9jZXNzZWQKKyAgICAgICAgICAgICAgICAgICAgaWNjU2VxdWVuY2VTdGFydGVkID0gZmFsc2U7IC8vIFNlcXVlbmNlIG9mIElDQyBwcm9maWxlcyBpcworICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzZWQKICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBBZGQgbm9uLUlDQyBjb2xvciBzcGFjZSB0byB0aGUgc2VxdWVuY2UKLSAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UuYWRkKGNvbnZlcnNpb25TZXF1ZW5jZVtpXSk7IAotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UuYWRkKGNvbnZlcnNpb25TZXF1ZW5jZVtpXSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZHN0ICE9IGNvbnZlcnNpb25MYXN0ICYmIGRzdCAhPSBudWxsKSB7IC8vIEFkZCBsYXN0IHByb2ZpbGUgaWYgbmVlZGVkCisKKyAgICAgICAgICAgIGlmIChkc3QgIT0gY29udmVyc2lvbkxhc3QgJiYgZHN0ICE9IG51bGwpIHsgLy8gQWRkIGxhc3QgcHJvZmlsZSBpZgorICAgICAgICAgICAgICAgIC8vIG5lZWRlZAogICAgICAgICAgICAgICAgIGlmIChkc3QgaW5zdGFuY2VvZiBJQ0NfUHJvZmlsZSkgewogICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQoZHN0KTsKICAgICAgICAgICAgICAgICAgICAgaWNjU2VxdWVuY2VTdGFydGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGljY1NlcXVlbmNlU3RhcnRlZCkgewogICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQoeHl6UHJvZmlsZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UuYWRkKGRzdCk7IC8vIEFkZCBsYXN0IG5vbi1JQ0MgY29sb3Igc3BhY2UgdG8gdGhlIHNlcXVlbmNlCisgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlLmFkZChkc3QpOyAvLyBBZGQgbGFzdCBub24tSUNDIGNvbG9yIHNwYWNlIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBzZXF1ZW5jZQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAoaWNjU2VxdWVuY2VTdGFydGVkKSB7IC8vIE1ha2UgbGFzdCB0cmFuc2Zvcm0gaWYgbmVlZGVkCiAgICAgICAgICAgICAgICAgc2VxdWVuY2UuYWRkKG5ldyBJQ0NfVHJhbnNmb3JtKHByb2ZpbGVzLnRvQXJyYXkobmV3IElDQ19Qcm9maWxlWzBdKSkpOwogICAgICAgICAgICAgICAgIGlmIChkc3QgIT0gbnVsbCAmJiAhKGRzdCBpbnN0YW5jZW9mIElDQ19Qcm9maWxlKSkgewogICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZS5hZGQoZHN0KTsgLy8gQWRkIGxhc3Qgbm9uLUlDQyBjb2xvciBzcGFjZSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICAvLyBzZXF1ZW5jZQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIG1heCBudW1iZXIgb2YgY29tcG9uZW50cwogICAgICAgICAgICAgLy8gVGhpcyBudW1iZXIgd2lsbCBiZSB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbgogICAgICAgICAgICAgbWF4Q29tcG9uZW50cyA9IDA7Ci0gICAgICAgICAgICBPYmplY3QgbzsgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChpbnQgaT0wLCBzaXplID0gc2VxdWVuY2Uuc2l6ZSgpOyBpPHNpemU7IGkrKykgeworICAgICAgICAgICAgT2JqZWN0IG87CisgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgc2l6ZSA9IHNlcXVlbmNlLnNpemUoKTsgaSA8IHNpemU7IGkrKykgewogICAgICAgICAgICAgICAgIG8gPSBzZXF1ZW5jZS5nZXQoaSk7CiAgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJQ0NfVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgICAgICAgIElDQ19UcmFuc2Zvcm0gdCA9IChJQ0NfVHJhbnNmb3JtKSBvOyAKLSAgICAgICAgICAgICAgICAgICAgbWF4Q29tcG9uZW50cyA9IAotICAgICAgICAgICAgICAgICAgICAgICAgKG1heENvbXBvbmVudHMgPiB0LmdldE51bUlucHV0Q2hhbm5lbHMoKSArIDEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhDb21wb25lbnRzIDogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXROdW1JbnB1dENoYW5uZWxzKCkgKyAxOwotICAgICAgICAgICAgICAgICAgICBtYXhDb21wb25lbnRzID0gCi0gICAgICAgICAgICAgICAgICAgICAgICAobWF4Q29tcG9uZW50cyA+IHQuZ2V0TnVtT3V0cHV0Q2hhbm5lbHMoKSArIDEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhDb21wb25lbnRzIDogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXROdW1PdXRwdXRDaGFubmVscygpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgSUNDX1RyYW5zZm9ybSB0ID0gKElDQ19UcmFuc2Zvcm0pbzsKKyAgICAgICAgICAgICAgICAgICAgbWF4Q29tcG9uZW50cyA9IChtYXhDb21wb25lbnRzID4gdC5nZXROdW1JbnB1dENoYW5uZWxzKCkgKyAxKSA/IG1heENvbXBvbmVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHQuZ2V0TnVtSW5wdXRDaGFubmVscygpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgbWF4Q29tcG9uZW50cyA9IChtYXhDb21wb25lbnRzID4gdC5nZXROdW1PdXRwdXRDaGFubmVscygpICsgMSkgPyBtYXhDb21wb25lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0LmdldE51bU91dHB1dENoYW5uZWxzKCkgKyAxOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2UgY3MgPSAoQ29sb3JTcGFjZSkgbzsKLSAgICAgICAgICAgICAgICAgICAgbWF4Q29tcG9uZW50cyA9IAotICAgICAgICAgICAgICAgICAgICAgICAgKG1heENvbXBvbmVudHMgPiBjcy5nZXROdW1Db21wb25lbnRzKCkgKyAxKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Q29tcG9uZW50cyA6IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzLmdldE51bUNvbXBvbmVudHMoKSArIDE7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlIGNzID0gKENvbG9yU3BhY2UpbzsKKyAgICAgICAgICAgICAgICAgICAgbWF4Q29tcG9uZW50cyA9IChtYXhDb21wb25lbnRzID4gY3MuZ2V0TnVtQ29tcG9uZW50cygpICsgMSkgPyBtYXhDb21wb25lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjcy5nZXROdW1Db21wb25lbnRzKCkgKyAxOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICByZXR1cm4gc2VxdWVuY2UudG9BcnJheSgpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IENvbG9yQ29udmVydE9wIG9iamVjdCB1c2luZyB0d28gc3BlY2lmaWVkCi0gICAgICogQ29sb3JTcGFjZSBvYmplY3RzLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBDb2xvckNvbnZlcnRPcCBvYmplY3QgdXNpbmcgdHdvIHNwZWNpZmllZCBDb2xvclNwYWNlCisgICAgICogb2JqZWN0cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjQ1MgdGhlIHNvdXJjZSBDb2xvclNwYWNlLgotICAgICAqIEBwYXJhbSBkc3RDUyB0aGUgZGVzdGluYXRpb24gQ29sb3JTcGFjZS4KLSAgICAgKiBAcGFyYW0gaGludHMgdGhlIFJlbmRlcmluZ0hpbnRzIG9iamVjdCB1c2VkIGZvciAKLSAgICAgKiB0aGUgY29sb3IgY29udmVyc2lvbiwgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gc3JjQ1MKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgQ29sb3JTcGFjZS4KKyAgICAgKiBAcGFyYW0gZHN0Q1MKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBDb2xvclNwYWNlLgorICAgICAqIEBwYXJhbSBoaW50cworICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmluZ0hpbnRzIG9iamVjdCB1c2VkIGZvciB0aGUgY29sb3IgY29udmVyc2lvbiwgb3IKKyAgICAgKiAgICAgICAgICAgIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIENvbG9yQ29udmVydE9wKENvbG9yU3BhY2Ugc3JjQ1MsIENvbG9yU3BhY2UgZHN0Q1MsIFJlbmRlcmluZ0hpbnRzIGhpbnRzKSB7CiAgICAgICAgIGlmIChzcmNDUyA9PSBudWxsIHx8IGRzdENTID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNUIiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICByZW5kZXJpbmdIaW50cyA9IGhpbnRzOwotICAgICAgICAKKwogICAgICAgICBib29sZWFuIHNyY0lDQyA9IHNyY0NTIGluc3RhbmNlb2YgSUNDX0NvbG9yU3BhY2U7CiAgICAgICAgIGJvb2xlYW4gZHN0SUNDID0gZHN0Q1MgaW5zdGFuY2VvZiBJQ0NfQ29sb3JTcGFjZTsKLSAgICAgICAgCisKICAgICAgICAgaWYgKHNyY0lDQyAmJiBkc3RJQ0MpIHsKICAgICAgICAgICAgIGNvbnZlcnNpb25TZXF1ZW5jZSA9IG5ldyBJQ0NfUHJvZmlsZVsyXTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNvbnZlcnNpb25TZXF1ZW5jZSA9IG5ldyBPYmplY3RbMl07CiAgICAgICAgICAgICBpc0lDQyA9IGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGlmIChzcmNJQ0MpIHsKLSAgICAgICAgICAgIGNvbnZlcnNpb25TZXF1ZW5jZVswXSA9ICgoSUNDX0NvbG9yU3BhY2UpIHNyY0NTKS5nZXRQcm9maWxlKCk7CisgICAgICAgICAgICBjb252ZXJzaW9uU2VxdWVuY2VbMF0gPSAoKElDQ19Db2xvclNwYWNlKXNyY0NTKS5nZXRQcm9maWxlKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjb252ZXJzaW9uU2VxdWVuY2VbMF0gPSBzcmNDUzsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBpZiAoZHN0SUNDKSB7Ci0gICAgICAgICAgICBjb252ZXJzaW9uU2VxdWVuY2VbMV0gPSAoKElDQ19Db2xvclNwYWNlKSBkc3RDUykuZ2V0UHJvZmlsZSgpOworICAgICAgICAgICAgY29udmVyc2lvblNlcXVlbmNlWzFdID0gKChJQ0NfQ29sb3JTcGFjZSlkc3RDUykuZ2V0UHJvZmlsZSgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY29udmVyc2lvblNlcXVlbmNlWzFdID0gZHN0Q1M7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQ29sb3JDb252ZXJ0T3Agb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZCAKLSAgICAgKiBJQ0NfUHJvZmlsZSBvYmplY3RzLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBDb2xvckNvbnZlcnRPcCBvYmplY3QgZnJvbSB0aGUgc3BlY2lmaWVkIElDQ19Qcm9maWxlCisgICAgICogb2JqZWN0cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvZmlsZXMgdGhlIGFycmF5IG9mIElDQ19Qcm9maWxlIG9iamVjdHMuCi0gICAgICogQHBhcmFtIGhpbnRzIHRoZSBSZW5kZXJpbmdIaW50cyBvYmplY3QgdXNlZCBmb3IgCi0gICAgICogdGhlIGNvbG9yIGNvbnZlcnNpb24sIG9yIG51bGwuCisgICAgICogQHBhcmFtIHByb2ZpbGVzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgSUNDX1Byb2ZpbGUgb2JqZWN0cy4KKyAgICAgKiBAcGFyYW0gaGludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBSZW5kZXJpbmdIaW50cyBvYmplY3QgdXNlZCBmb3IgdGhlIGNvbG9yIGNvbnZlcnNpb24sIG9yCisgICAgICogICAgICAgICAgICBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBDb2xvckNvbnZlcnRPcChJQ0NfUHJvZmlsZSBwcm9maWxlc1tdLCBSZW5kZXJpbmdIaW50cyBoaW50cykgewogICAgICAgICBpZiAocHJvZmlsZXMgPT0gbnVsbCkgewpAQCAtMzAyLDM3ICszMjQsMzkgQEAKICAgICAgICAgfQogCiAgICAgICAgIHJlbmRlcmluZ0hpbnRzID0gaGludHM7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIFRoaXMgYXJyYXkgaXMgbm90IHVzZWQgaW4gdGhlIHByb2dyYW0gbG9naWMsIHNvIGRvbid0IG5lZWQgdG8gY29weSBpdAogICAgICAgICAvLyBTdG9yZSBpdCBvbmx5IHRvIHJldHVybiBiYWNrCi0gICAgICAgIG1pZFByb2ZpbGVzID0gcHJvZmlsZXM7ICAKLSAgICAgICAgCisgICAgICAgIG1pZFByb2ZpbGVzID0gcHJvZmlsZXM7CisKICAgICAgICAgY29udmVyc2lvblNlcXVlbmNlID0gbmV3IElDQ19Qcm9maWxlW21pZFByb2ZpbGVzLmxlbmd0aF07Ci0gICAgICAgIAorCiAgICAgICAgIC8vIEFkZCBwcm9maWxlcyB0byB0aGUgY29udmVyc2lvbiBzZXF1ZW5jZQotICAgICAgICBmb3IgKGludCBpPTAsIGxlbmd0aD1taWRQcm9maWxlcy5sZW5ndGg7IGk8bGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1pZFByb2ZpbGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBjb252ZXJzaW9uU2VxdWVuY2VbaV0gPSBtaWRQcm9maWxlc1tpXTsKLSAgICAgICAgfSAgICAgICAKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBDb2xvckNvbnZlcnRPcCBvYmplY3QgdXNpbmcgdGhlIHNwZWNpZmllZAotICAgICAqIENvbG9yU3BhY2Ugb2JqZWN0LgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBDb2xvckNvbnZlcnRPcCBvYmplY3QgdXNpbmcgdGhlIHNwZWNpZmllZCBDb2xvclNwYWNlCisgICAgICogb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjcyB0aGUgZGVzdGluYXRpb24gQ29sb3JTcGFjZSBvciBhbiBpbnRlcm1lZGlhdGUgQ29sb3JTcGFjZS4KLSAgICAgKiBAcGFyYW0gaGludHMgdGhlIFJlbmRlcmluZ0hpbnRzIG9iamVjdCB1c2VkIGZvciAKLSAgICAgKiB0aGUgY29sb3IgY29udmVyc2lvbiwgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gY3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBDb2xvclNwYWNlIG9yIGFuIGludGVybWVkaWF0ZSBDb2xvclNwYWNlLgorICAgICAqIEBwYXJhbSBoaW50cworICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmluZ0hpbnRzIG9iamVjdCB1c2VkIGZvciB0aGUgY29sb3IgY29udmVyc2lvbiwgb3IKKyAgICAgKiAgICAgICAgICAgIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIENvbG9yQ29udmVydE9wKENvbG9yU3BhY2UgY3MsIFJlbmRlcmluZ0hpbnRzIGhpbnRzKSB7CiAgICAgICAgIGlmIChjcyA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjVCIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcmVuZGVyaW5nSGludHMgPSBoaW50czsKLSAgICAgICAgICAgICAgICAgICAgICAgIAorCiAgICAgICAgIGlmIChjcyBpbnN0YW5jZW9mIElDQ19Db2xvclNwYWNlKSB7CiAgICAgICAgICAgICBjb252ZXJzaW9uU2VxdWVuY2UgPSBuZXcgSUNDX1Byb2ZpbGVbMV07Ci0gICAgICAgICAgICBjb252ZXJzaW9uU2VxdWVuY2VbMF0gPSAoKElDQ19Db2xvclNwYWNlKSBjcykuZ2V0UHJvZmlsZSgpOworICAgICAgICAgICAgY29udmVyc2lvblNlcXVlbmNlWzBdID0gKChJQ0NfQ29sb3JTcGFjZSljcykuZ2V0UHJvZmlsZSgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY29udmVyc2lvblNlcXVlbmNlID0gbmV3IE9iamVjdFsxXTsKICAgICAgICAgICAgIGNvbnZlcnNpb25TZXF1ZW5jZVswXSA9IGNzOwpAQCAtMzQxLDExICszNjUsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQ29sb3JDb252ZXJ0T3Agb2JqZWN0IHdoaWNoIGNvbnZlcnRzIGZyb20gCi0gICAgICogYSBzb3VyY2UgY29sb3Igc3BhY2UgdG8gYSBkZXN0aW5hdGlvbiBjb2xvciBzcGFjZS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQ29sb3JDb252ZXJ0T3Agb2JqZWN0IHdoaWNoIGNvbnZlcnRzIGZyb20gYSBzb3VyY2UKKyAgICAgKiBjb2xvciBzcGFjZSB0byBhIGRlc3RpbmF0aW9uIGNvbG9yIHNwYWNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBoaW50cyB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0IHVzZWQgZm9yIAotICAgICAqIHRoZSBjb2xvciBjb252ZXJzaW9uLCBvciBudWxsLgorICAgICAqIEBwYXJhbSBoaW50cworICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmluZ0hpbnRzIG9iamVjdCB1c2VkIGZvciB0aGUgY29sb3IgY29udmVyc2lvbiwgb3IKKyAgICAgKiAgICAgICAgICAgIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIENvbG9yQ29udmVydE9wKFJlbmRlcmluZ0hpbnRzIGhpbnRzKSB7CiAgICAgICAgIHJlbmRlcmluZ0hpbnRzID0gaGludHM7CkBAIC0zNjAsMjYgKzM4NSwyNiBAQAogICAgICAgICBpbnQgblNyY0NvbG9yQ29tcHMsIG5Ec3RDb2xvckNvbXBzOwogICAgICAgICBPYmplY3QgZmlyc3QgPSBjb252ZXJzaW9uU2VxdWVuY2VbMF07CiAgICAgICAgIE9iamVjdCBsYXN0ID0gY29udmVyc2lvblNlcXVlbmNlW2NvbnZlcnNpb25TZXF1ZW5jZS5sZW5ndGggLSAxXTsKLSAgICAgICAgCisKICAgICAgICAgLy8gR2V0IHRoZSBudW1iZXIgb2YgaW5wdXQvb3V0cHV0IGNvbG9yIGNvbXBvbmVudHMKICAgICAgICAgaWYgKGlzSUNDKSB7Ci0gICAgICAgICAgICBzcmNQZiA9IChJQ0NfUHJvZmlsZSkgZmlyc3Q7Ci0gICAgICAgICAgICBkc3RQZiA9IChJQ0NfUHJvZmlsZSkgbGFzdDsKKyAgICAgICAgICAgIHNyY1BmID0gKElDQ19Qcm9maWxlKWZpcnN0OworICAgICAgICAgICAgZHN0UGYgPSAoSUNDX1Byb2ZpbGUpbGFzdDsKICAgICAgICAgICAgIG5TcmNDb2xvckNvbXBzID0gc3JjUGYuZ2V0TnVtQ29tcG9uZW50cygpOwogICAgICAgICAgICAgbkRzdENvbG9yQ29tcHMgPSBkc3RQZi5nZXROdW1Db21wb25lbnRzKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoZmlyc3QgaW5zdGFuY2VvZiBJQ0NfUHJvZmlsZSkgewotICAgICAgICAgICAgICAgIHNyY1BmID0gKElDQ19Qcm9maWxlKSBmaXJzdDsKKyAgICAgICAgICAgICAgICBzcmNQZiA9IChJQ0NfUHJvZmlsZSlmaXJzdDsKICAgICAgICAgICAgICAgICBuU3JjQ29sb3JDb21wcyA9IHNyY1BmLmdldE51bUNvbXBvbmVudHMoKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgblNyY0NvbG9yQ29tcHMgPSAoKENvbG9yU3BhY2UpIGZpcnN0KS5nZXROdW1Db21wb25lbnRzKCk7CisgICAgICAgICAgICAgICAgblNyY0NvbG9yQ29tcHMgPSAoKENvbG9yU3BhY2UpZmlyc3QpLmdldE51bUNvbXBvbmVudHMoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAobGFzdCBpbnN0YW5jZW9mIElDQ19Qcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgZHN0UGYgPSAoSUNDX1Byb2ZpbGUpIGxhc3Q7CisgICAgICAgICAgICAgICAgZHN0UGYgPSAoSUNDX1Byb2ZpbGUpbGFzdDsKICAgICAgICAgICAgICAgICBuRHN0Q29sb3JDb21wcyA9IGRzdFBmLmdldE51bUNvbXBvbmVudHMoKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbkRzdENvbG9yQ29tcHMgPSAoKENvbG9yU3BhY2UpIGxhc3QpLmdldE51bUNvbXBvbmVudHMoKTsKKyAgICAgICAgICAgICAgICBuRHN0Q29sb3JDb21wcyA9ICgoQ29sb3JTcGFjZSlsYXN0KS5nZXROdW1Db21wb25lbnRzKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzg3LDUxICs0MTIsNDUgQEAKICAgICAgICAgLy8gdHJhbnNmb3JtcyBhbmQgd2l0aCBlYWNoIG90aGVyCiAgICAgICAgIGlmIChzcmMuZ2V0TnVtQmFuZHMoKSAhPSBuU3JjQ29sb3JDb21wcykgewogICAgICAgICAgICAgLy8gYXd0LjI1RT1JbmNvcnJlY3QgbnVtYmVyIG9mIHNvdXJjZSByYXN0ZXIgYmFuZHMuIFNob3VsZCBiZSBlcXVhbAotICAgICAgICAgICAgLy8gICAgICAgICAgdG8gdGhlIG51bWJlciBvZiBjb2xvciBjb21wb25lbnRzIG9mIHNvdXJjZSBjb2xvcnNwYWNlLgorICAgICAgICAgICAgLy8gdG8gdGhlIG51bWJlciBvZiBjb2xvciBjb21wb25lbnRzIG9mIHNvdXJjZSBjb2xvcnNwYWNlLgogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNUUiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBpZiAoZHN0ICE9IG51bGwpIHsgLy8gQ2hlY2sgZGVzdGluYXRpb24gcmFzdGVyCi0gICAgICAgICAgICBpZiAoZHN0LmdldE51bUJhbmRzKCkgIT0KLSAgICAgICAgICAgICAgICBuRHN0Q29sb3JDb21wcykgeworICAgICAgICAgICAgaWYgKGRzdC5nZXROdW1CYW5kcygpICE9IG5Ec3RDb2xvckNvbXBzKSB7CiAgICAgICAgICAgICAgICAgLy8gYXd0LjI1Rj1JbmNvcnJlY3QgbnVtYmVyIG9mIGRlc3RpbmF0aW9uIHJhc3RlciBiYW5kcy4gU2hvdWxkCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjb2xvciBjb21wb25lbnRzIG9mIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgY29sb3JzcGFjZS4KKyAgICAgICAgICAgICAgICAvLyBiZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGNvbG9yIGNvbXBvbmVudHMgb2YgZGVzdGluYXRpb24KKyAgICAgICAgICAgICAgICAvLyBjb2xvcnNwYWNlLgogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjVGIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzcmMuZ2V0V2lkdGgoKSAhPSBkc3QuZ2V0V2lkdGgoKSB8fAotICAgICAgICAgICAgICAgc3JjLmdldEhlaWdodCgpICE9IGRzdC5nZXRIZWlnaHQoKSkgeworCisgICAgICAgICAgICBpZiAoc3JjLmdldFdpZHRoKCkgIT0gZHN0LmdldFdpZHRoKCkgfHwgc3JjLmdldEhlaWdodCgpICE9IGRzdC5nZXRIZWlnaHQoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjYwIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGRzdCA9IGNyZWF0ZUNvbXBhdGlibGVEZXN0UmFzdGVyKHNyYyk7CisgICAgICAgICAgICBkc3QgPSBjcmVhdGVDb21wYXRpYmxlRGVzdFJhc3RlcihzcmMpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGlmIChpc0lDQykgewogICAgICAgICAgICAgLy8gQ3JlYXRlIHRyYW5zZm9ybQotICAgICAgICAgICAgSUNDX1RyYW5zZm9ybSB0ID0gdENyZWF0b3IuZ2V0VHJhbnNmb3JtKHNyY1BmLCBkc3RQZiwgCi0gICAgICAgICAgICAgICAgICAgIChJQ0NfUHJvZmlsZVtdKWNvbnZlcnNpb25TZXF1ZW5jZSk7IAotICAgICAgICAgICAgY2MudHJhbnNsYXRlQ29sb3IodCwgc3JjLCBkc3QpOyAgICAgICAgIAorICAgICAgICAgICAgSUNDX1RyYW5zZm9ybSB0ID0gdENyZWF0b3IKKyAgICAgICAgICAgICAgICAgICAgLmdldFRyYW5zZm9ybShzcmNQZiwgZHN0UGYsIChJQ0NfUHJvZmlsZVtdKWNvbnZlcnNpb25TZXF1ZW5jZSk7CisgICAgICAgICAgICBjYy50cmFuc2xhdGVDb2xvcih0LCBzcmMsIGRzdCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBPYmplY3RbXSBzZXF1ZW5jZSA9IHRDcmVhdG9yLmdldFNlcXVlbmNlKG51bGwsIG51bGwpOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIC8vIEdldCBkYXRhIGZyb20gdGhlIHNvdXJjZSByYXN0ZXIKICAgICAgICAgICAgIENvbG9yU2NhbGVyIHNjYWxlciA9IG5ldyBDb2xvclNjYWxlcigpOwogICAgICAgICAgICAgc2NhbGVyLmxvYWRTY2FsaW5nRGF0YShzcmMsIG51bGwpOwogICAgICAgICAgICAgZmxvYXQgdG1wRGF0YVtdW10gPSBzY2FsZXIuc2NhbGVOb3JtYWxpemUoc3JjKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAvLyBHZXQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBjb2xvciBzcGFjZXMKLSAgICAgICAgICAgIENvbG9yU3BhY2Ugc3JjQ1MgPSAoc3JjUGYgPT0gbnVsbCkgPyAKLSAgICAgICAgICAgICAgICAgICAgKENvbG9yU3BhY2UpIGZpcnN0OgotICAgICAgICAgICAgICAgICAgICBuZXcgSUNDX0NvbG9yU3BhY2Uoc3JjUGYpOwotICAgICAgICAgICAgQ29sb3JTcGFjZSBkc3RDUyA9IChkc3RQZiA9PSBudWxsKSA/IAotICAgICAgICAgICAgICAgICAgICAoQ29sb3JTcGFjZSkgbGFzdDoKLSAgICAgICAgICAgICAgICAgICAgbmV3IElDQ19Db2xvclNwYWNlKGRzdFBmKTsKLSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBDb2xvclNwYWNlIHNyY0NTID0gKHNyY1BmID09IG51bGwpID8gKENvbG9yU3BhY2UpZmlyc3QgOiBuZXcgSUNDX0NvbG9yU3BhY2Uoc3JjUGYpOworICAgICAgICAgICAgQ29sb3JTcGFjZSBkc3RDUyA9IChkc3RQZiA9PSBudWxsKSA/IChDb2xvclNwYWNlKWxhc3QgOiBuZXcgSUNDX0NvbG9yU3BhY2UoZHN0UGYpOworCiAgICAgICAgICAgICBhcHBseVNlcXVlbmNlKHNlcXVlbmNlLCB0bXBEYXRhLCBzcmNDUywgZHN0Q1MpOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIHNjYWxlci5sb2FkU2NhbGluZ0RhdGEoZHN0LCBudWxsKTsKICAgICAgICAgICAgIHNjYWxlci51bnNjYWxlTm9ybWFsaXplZChkc3QsIHRtcERhdGEpOwogICAgICAgICB9CkBAIC00NDIsMzYgKzQ2MSwyNyBAQAogICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlIGNyZWF0ZUNvbXBhdGlibGVEZXN0SW1hZ2UoQnVmZmVyZWRJbWFnZSBzcmMsIENvbG9yTW9kZWwgZGVzdENNKSB7CiAgICAgICAgIC8vIElmIGRlc3RpbmF0aW9uIGNvbG9yIG1vZGVsIGlzIHBhc3NlZCBvbmx5IG9uZSBsaW5lIG5lZWRlZAogICAgICAgICBpZiAoZGVzdENNICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRJbWFnZShkZXN0Q00sCi0gICAgICAgICAgICAgICAgICAgIGRlc3RDTS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSksCi0gICAgICAgICAgICAgICAgICAgIGRlc3RDTS5pc0FscGhhUHJlbXVsdGlwbGllZCgpLCAKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkSW1hZ2UoZGVzdENNLCBkZXN0Q00uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHNyYy5nZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICBzcmMuZ2V0SGVpZ2h0KCkpLCBkZXN0Q00uaXNBbHBoYVByZW11bHRpcGxpZWQoKSwgbnVsbCk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgaW50IG5TcGFjZXMgPSBjb252ZXJzaW9uU2VxdWVuY2UubGVuZ3RoOwotICAgICAgICAKKwogICAgICAgICBpZiAoblNwYWNlcyA8IDEpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjYxIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgLy8gR2V0IGRlc3RpbmF0aW9uIGNvbG9yIHNwYWNlCi0gICAgICAgIE9iamVjdCBkZXN0aW5hdGlvbiA9IGNvbnZlcnNpb25TZXF1ZW5jZVtuU3BhY2VzLTFdOwotICAgICAgICBDb2xvclNwYWNlIGRzdENTID0gCi0gICAgICAgICAgICAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBDb2xvclNwYWNlKSA/IAotICAgICAgICAgICAgICAgICAgICAoQ29sb3JTcGFjZSkgZGVzdGluYXRpb24gOiAKLSAgICAgICAgICAgICAgICAgICAgbmV3IElDQ19Db2xvclNwYWNlKChJQ0NfUHJvZmlsZSkgZGVzdGluYXRpb24pOwotICAgICAgICAKLSAgICAgICAgQ29sb3JNb2RlbCBzcmNDTSA9IHNyYy5nZXRDb2xvck1vZGVsKCk7ICAgICAKLSAgICAgICAgQ29sb3JNb2RlbCBkc3RDTSA9IG5ldyBDb21wb25lbnRDb2xvck1vZGVsKGRzdENTLCAKLSAgICAgICAgICAgICAgICBzcmNDTS5oYXNBbHBoYSgpLCAKLSAgICAgICAgICAgICAgICBzcmNDTS5pc0FscGhhUHJlbXVsdGlwbGllZCgpLAotICAgICAgICAgICAgICAgIHNyY0NNLmdldFRyYW5zcGFyZW5jeSgpLAotICAgICAgICAgICAgICAgIHNyY0NNLmdldFRyYW5zZmVyVHlwZSgpKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRJbWFnZShkc3RDTSwKLSAgICAgICAgICAgICAgICBkZXN0Q00uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHNyYy5nZXRXaWR0aCgpLCBzcmMuZ2V0SGVpZ2h0KCkpLAotICAgICAgICAgICAgICAgIGRlc3RDTS5pc0FscGhhUHJlbXVsdGlwbGllZCgpLCAKLSAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgT2JqZWN0IGRlc3RpbmF0aW9uID0gY29udmVyc2lvblNlcXVlbmNlW25TcGFjZXMgLSAxXTsKKyAgICAgICAgQ29sb3JTcGFjZSBkc3RDUyA9IChkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIENvbG9yU3BhY2UpID8gKENvbG9yU3BhY2UpZGVzdGluYXRpb24KKyAgICAgICAgICAgICAgICA6IG5ldyBJQ0NfQ29sb3JTcGFjZSgoSUNDX1Byb2ZpbGUpZGVzdGluYXRpb24pOworCisgICAgICAgIENvbG9yTW9kZWwgc3JjQ00gPSBzcmMuZ2V0Q29sb3JNb2RlbCgpOworICAgICAgICBDb2xvck1vZGVsIGRzdENNID0gbmV3IENvbXBvbmVudENvbG9yTW9kZWwoZHN0Q1MsIHNyY0NNLmhhc0FscGhhKCksIHNyY0NNCisgICAgICAgICAgICAgICAgLmlzQWxwaGFQcmVtdWx0aXBsaWVkKCksIHNyY0NNLmdldFRyYW5zcGFyZW5jeSgpLCBzcmNDTS5nZXRUcmFuc2ZlclR5cGUoKSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZEltYWdlKGRzdENNLCBkZXN0Q00uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHNyYy5nZXRXaWR0aCgpLCBzcmMKKyAgICAgICAgICAgICAgICAuZ2V0SGVpZ2h0KCkpLCBkZXN0Q00uaXNBbHBoYVByZW11bHRpcGxpZWQoKSwgbnVsbCk7CiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIEJ1ZmZlcmVkSW1hZ2UgZmlsdGVyKEJ1ZmZlcmVkSW1hZ2Ugc3JjLCBCdWZmZXJlZEltYWdlIGRzdCkgewpAQCAtNDgxLDMyICs0OTEsMzEgQEAKIAogICAgICAgICBDb2xvck1vZGVsIHNyY0NNID0gc3JjLmdldENvbG9yTW9kZWwoKTsKICAgICAgICAgLy8gRmlyc3QgaGFuZGxlIGluZGV4IGNvbG9yIG1vZGVsCi0gICAgICAgIGlmIChzcmNDTSBpbnN0YW5jZW9mIEluZGV4Q29sb3JNb2RlbCkgeyAgICAgICAgICAgIAotICAgICAgICAgICAgc3JjID0gKChJbmRleENvbG9yTW9kZWwpIHNyY0NNKS5jb252ZXJ0VG9JbnREaXNjcmV0ZShzcmMuZ2V0UmFzdGVyKCksIGZhbHNlKTsKKyAgICAgICAgaWYgKHNyY0NNIGluc3RhbmNlb2YgSW5kZXhDb2xvck1vZGVsKSB7CisgICAgICAgICAgICBzcmMgPSAoKEluZGV4Q29sb3JNb2RlbClzcmNDTSkuY29udmVydFRvSW50RGlzY3JldGUoc3JjLmdldFJhc3RlcigpLCBmYWxzZSk7CiAgICAgICAgIH0KLSAgICAgICAgQ29sb3JTcGFjZSBzcmNDUyA9IHNyY0NNLmdldENvbG9yU3BhY2UoKTsgICAgICAgIAotICAgICAgICAgICAgICAgIAorICAgICAgICBDb2xvclNwYWNlIHNyY0NTID0gc3JjQ00uZ2V0Q29sb3JTcGFjZSgpOworCiAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgcmVzOwogICAgICAgICBib29sZWFuIGlzRHN0SW5kZXggPSBmYWxzZTsKICAgICAgICAgaWYgKGRzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKHNyYy5nZXRXaWR0aCgpICE9IGRzdC5nZXRXaWR0aCgpIHx8Ci0gICAgICAgICAgICAgc3JjLmdldEhlaWdodCgpICE9IGRzdC5nZXRIZWlnaHQoKSkgewotICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI2MyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNyYy5nZXRXaWR0aCgpICE9IGRzdC5nZXRXaWR0aCgpIHx8IHNyYy5nZXRIZWlnaHQoKSAhPSBkc3QuZ2V0SGVpZ2h0KCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI2MyIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZHN0LmdldENvbG9yTW9kZWwoKSBpbnN0YW5jZW9mIEluZGV4Q29sb3JNb2RlbCkgewogICAgICAgICAgICAgICAgIGlzRHN0SW5kZXggPSB0cnVlOwogICAgICAgICAgICAgICAgIHJlcyA9IGNyZWF0ZUNvbXBhdGlibGVEZXN0SW1hZ2Uoc3JjLCBudWxsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXMgPSBkc3Q7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJlcyA9IGNyZWF0ZUNvbXBhdGlibGVEZXN0SW1hZ2Uoc3JjLCBudWxsKTsKICAgICAgICAgfQogICAgICAgICBDb2xvck1vZGVsIGRzdENNID0gcmVzLmdldENvbG9yTW9kZWwoKTsKICAgICAgICAgQ29sb3JTcGFjZSBkc3RDUyA9IGRzdENNLmdldENvbG9yU3BhY2UoKTsKLSAgICAgICAgCisKICAgICAgICAgSUNDX1Byb2ZpbGUgc3JjUGYgPSBudWxsLCBkc3RQZiA9IG51bGw7CiAgICAgICAgIGlmIChzcmNDUyBpbnN0YW5jZW9mIElDQ19Db2xvclNwYWNlKSB7CiAgICAgICAgICAgICBzcmNQZiA9ICgoSUNDX0NvbG9yU3BhY2Upc3JjQ1MpLmdldFByb2ZpbGUoKTsKQEAgLTUxNCwzMSArNTIzLDI3IEBACiAgICAgICAgIGlmIChkc3RDUyBpbnN0YW5jZW9mIElDQ19Db2xvclNwYWNlKSB7CiAgICAgICAgICAgICBkc3RQZiA9ICgoSUNDX0NvbG9yU3BhY2UpZHN0Q1MpLmdldFByb2ZpbGUoKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBib29sZWFuIGlzRnVsbElDQyA9IGlzSUNDICYmIHNyY1BmICE9IG51bGwgJiYgZHN0UGYgIT0gbnVsbDsKLSAgICAgICAgCisKICAgICAgICAgaWYgKGlzRnVsbElDQykgewotICAgICAgICAgICAgSUNDX1RyYW5zZm9ybSB0ID0KLSAgICAgICAgICAgICAgICAgICAgdENyZWF0b3IuZ2V0VHJhbnNmb3JtKHNyY1BmLCBkc3RQZiwgKElDQ19Qcm9maWxlW10pIGNvbnZlcnNpb25TZXF1ZW5jZSk7CisgICAgICAgICAgICBJQ0NfVHJhbnNmb3JtIHQgPSB0Q3JlYXRvcgorICAgICAgICAgICAgICAgICAgICAuZ2V0VHJhbnNmb3JtKHNyY1BmLCBkc3RQZiwgKElDQ19Qcm9maWxlW10pY29udmVyc2lvblNlcXVlbmNlKTsKICAgICAgICAgICAgIGNjLnRyYW5zbGF0ZUNvbG9yKHQsIHNyYywgcmVzKTsKICAgICAgICAgfSBlbHNlIHsgLy8gUGVyZm9ybSBub24tSUNDIHRyYW5zZm9ybQotICAgICAgICAgICAgT2JqZWN0IHNlcXVlbmNlW10gPSB0Q3JlYXRvci5nZXRTZXF1ZW5jZSgKLSAgICAgICAgICAgICAgICAgICAgc3JjUGYgPT0gbnVsbCA/IChPYmplY3QpIHNyY0NTIDogc3JjUGYsCi0gICAgICAgICAgICAgICAgICAgIGRzdFBmID09IG51bGwgPyAoT2JqZWN0KSBkc3RDUyA6IGRzdFBmKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIAorICAgICAgICAgICAgT2JqZWN0IHNlcXVlbmNlW10gPSB0Q3JlYXRvci5nZXRTZXF1ZW5jZShzcmNQZiA9PSBudWxsID8gKE9iamVjdClzcmNDUyA6IHNyY1BmLAorICAgICAgICAgICAgICAgICAgICBkc3RQZiA9PSBudWxsID8gKE9iamVjdClkc3RDUyA6IGRzdFBmKTsKKwogICAgICAgICAgICAgaW50IHNyY1cgPSBzcmMuZ2V0V2lkdGgoKTsKICAgICAgICAgICAgIGludCBzcmNIID0gc3JjLmdldEhlaWdodCgpOwotICAgICAgICAgICAgaW50IG51bVBpeGVscyA9IHNyY1cqc3JjSDsKKyAgICAgICAgICAgIGludCBudW1QaXhlbHMgPSBzcmNXICogc3JjSDsKIAotICAgICAgICAgICAgLy8gTG9hZCBhbGwgcGl4ZWwgZGF0YSBpbnRvIGFycmF5IHRtcERhdGEgCi0gICAgICAgICAgICBmbG9hdCB0bXBEYXRhW11bXSA9IAotICAgICAgICAgICAgICAgIG5ldyBmbG9hdFtudW1QaXhlbHNdW3RDcmVhdG9yLm1heENvbXBvbmVudHNdOwotICAgICAgICAgICAgZm9yIChpbnQgcm93PTAsIGRhdGFQb3M9MDsgcm93PHNyY1c7IHJvdysrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sPTA7IGNvbDxzcmNIOyBjb2wrKykgewotICAgICAgICAgICAgICAgICAgICB0bXBEYXRhW2RhdGFQb3NdID0gCi0gICAgICAgICAgICAgICAgICAgICAgICBzcmNDTS5nZXROb3JtYWxpemVkQ29tcG9uZW50cygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLmdldFJhc3RlcigpLmdldERhdGFFbGVtZW50cyhyb3csIGNvbCwgbnVsbCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBEYXRhW2RhdGFQb3NdLCAwKTsKKyAgICAgICAgICAgIC8vIExvYWQgYWxsIHBpeGVsIGRhdGEgaW50byBhcnJheSB0bXBEYXRhCisgICAgICAgICAgICBmbG9hdCB0bXBEYXRhW11bXSA9IG5ldyBmbG9hdFtudW1QaXhlbHNdW3RDcmVhdG9yLm1heENvbXBvbmVudHNdOworICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMCwgZGF0YVBvcyA9IDA7IHJvdyA8IHNyY1c7IHJvdysrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgc3JjSDsgY29sKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wRGF0YVtkYXRhUG9zXSA9IHNyY0NNLmdldE5vcm1hbGl6ZWRDb21wb25lbnRzKHNyYy5nZXRSYXN0ZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREYXRhRWxlbWVudHMocm93LCBjb2wsIG51bGwpLCB0bXBEYXRhW2RhdGFQb3NdLCAwKTsKICAgICAgICAgICAgICAgICAgICAgZGF0YVBvcysrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTU0OCwxMSArNTUzLDExIEBACiAgICAgICAgICAgICBpbnQgYWxwaGFJZHggPSBzcmNDTS5udW1Db21wb25lbnRzIC0gMTsKICAgICAgICAgICAgIGlmIChzcmNDTS5oYXNBbHBoYSgpICYmIGRzdENNLmhhc0FscGhhKCkpIHsKICAgICAgICAgICAgICAgICBhbHBoYSA9IG5ldyBmbG9hdFtudW1QaXhlbHNdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1QaXhlbHM7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUGl4ZWxzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgYWxwaGFbaV0gPSB0bXBEYXRhW2ldW2FscGhhSWR4XTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgLy8gVHJhbnNsYXRlIGNvbG9ycwogICAgICAgICAgICAgYXBwbHlTZXF1ZW5jZShzZXF1ZW5jZSwgdG1wRGF0YSwgc3JjQ1MsIGRzdENTKTsKIApAQCAtNTYwLDI0ICs1NjUsMjQgQEAKICAgICAgICAgICAgIGlmIChkc3RDTS5oYXNBbHBoYSgpKSB7CiAgICAgICAgICAgICAgICAgYWxwaGFJZHggPSBkc3RDTS5udW1Db21wb25lbnRzIC0gMTsKICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtUGl4ZWxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1QaXhlbHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgdG1wRGF0YVtpXVthbHBoYUlkeF0gPSBhbHBoYVtpXTsKLSAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1QaXhlbHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVBpeGVsczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0bXBEYXRhW2ldW2FscGhhSWR4XSA9IDFmOwotICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFN0b3JlIGRhdGEgYmFjayB0byB0aGUgaW1hZ2UgICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoaW50IHJvdz0wLCBkYXRhUG9zPTA7IHJvdzxzcmNXOyByb3crKykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbD0wOyBjb2w8c3JjSDsgY29sKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzLmdldFJhc3RlcigpLnNldERhdGFFbGVtZW50cyhyb3csIGNvbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q00uZ2V0RGF0YUVsZW1lbnRzKHRtcERhdGFbZGF0YVBvcysrXSwgMCAsIG51bGwpKTsKKworICAgICAgICAgICAgLy8gU3RvcmUgZGF0YSBiYWNrIHRvIHRoZSBpbWFnZQorICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMCwgZGF0YVBvcyA9IDA7IHJvdyA8IHNyY1c7IHJvdysrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgc3JjSDsgY29sKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzLmdldFJhc3RlcigpLnNldERhdGFFbGVtZW50cyhyb3csIGNvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RDTS5nZXREYXRhRWxlbWVudHModG1wRGF0YVtkYXRhUG9zKytdLCAwLCBudWxsKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAgICAgICAgCisgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNEc3RJbmRleCkgeyAvLyBDb252ZXJ0IGltYWdlIGludG8gaW5kZXhlZCBjb2xvcgogICAgICAgICAgICAgR3JhcGhpY3MyRCBnMmQgPSBkc3QuY3JlYXRlR3JhcGhpY3MoKTsKQEAgLTU4NSw1OSArNTkwLDU5IEBACiAgICAgICAgICAgICBnMmQuZGlzcG9zZSgpOwogICAgICAgICAgICAgcmV0dXJuIGRzdDsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEFwcGx5IHNlcXVlbmNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzZXF1ZW5jZSB0aGUgc2VxdWVuY2UKLSAgICAgKiBAcGFyYW0gdG1wRGF0YSB0aGUgdG1wIGRhdGEKLSAgICAgKiBAcGFyYW0gc3JjQ1MgdGhlIHNyYyBjcwotICAgICAqIEBwYXJhbSBkc3RDUyB0aGUgZHN0IGNzCisgICAgICogQHBhcmFtIHNlcXVlbmNlCisgICAgICogICAgICAgICAgICB0aGUgc2VxdWVuY2UuCisgICAgICogQHBhcmFtIHRtcERhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSB0bXAgZGF0YS4KKyAgICAgKiBAcGFyYW0gc3JjQ1MKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMgY3MuCisgICAgICogQHBhcmFtIGRzdENTCisgICAgICogICAgICAgICAgICB0aGUgZHN0IGNzLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhcHBseVNlcXVlbmNlKAotICAgICAgICAgICAgT2JqZWN0IHNlcXVlbmNlW10sIAotICAgICAgICAgICAgZmxvYXQgdG1wRGF0YVtdW10sCi0gICAgICAgICAgICBDb2xvclNwYWNlIHNyY0NTLCAKLSAgICAgICAgICAgIENvbG9yU3BhY2UgZHN0Q1MKLSAgICAgICAgICAgICkgeworICAgIHByaXZhdGUgdm9pZCBhcHBseVNlcXVlbmNlKE9iamVjdCBzZXF1ZW5jZVtdLCBmbG9hdCB0bXBEYXRhW11bXSwgQ29sb3JTcGFjZSBzcmNDUywKKyAgICAgICAgICAgIENvbG9yU3BhY2UgZHN0Q1MpIHsKICAgICAgICAgQ29sb3JTcGFjZSB4eXpDUyA9IENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19DSUVYWVopOwotICAgICAgICAKKwogICAgICAgICBpbnQgbnVtUGl4ZWxzID0gdG1wRGF0YS5sZW5ndGg7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIEZpcnN0IHRyYW5zZm9ybS4uLgogICAgICAgICBpZiAoc2VxdWVuY2VbMF0gaW5zdGFuY2VvZiBJQ0NfVHJhbnNmb3JtKSB7IC8vIElDQwogICAgICAgICAgICAgSUNDX1RyYW5zZm9ybSB0ID0gKElDQ19UcmFuc2Zvcm0pc2VxdWVuY2VbMF07CiAgICAgICAgICAgICBjYy50cmFuc2xhdGVDb2xvcih0LCB0bXBEYXRhLCBzcmNDUywgeHl6Q1MsIG51bVBpeGVscyk7CiAgICAgICAgIH0gZWxzZSB7IC8vIG5vbiBJQ0MKLSAgICAgICAgICAgIGZvciAoaW50IGs9MDsgazxudW1QaXhlbHM7IGsrKykgewotICAgICAgICAgICAgICAgIHRtcERhdGFba10gPSBzcmNDUy50b0NJRVhZWih0bXBEYXRhW2tdKTsgCisgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IG51bVBpeGVsczsgaysrKSB7CisgICAgICAgICAgICAgICAgdG1wRGF0YVtrXSA9IHNyY0NTLnRvQ0lFWFlaKHRtcERhdGFba10pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2MubG9hZFNjYWxpbmdEYXRhKHh5ekNTKTsgLy8gcHJlcGFyZSBmb3Igc2NhbGluZyBYWVoKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogc2VxdWVuY2UpIHsKICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNDX1RyYW5zZm9ybSkgewogICAgICAgICAgICAgICAgIElDQ19UcmFuc2Zvcm0gdCA9IChJQ0NfVHJhbnNmb3JtKWVsZW1lbnQ7CiAgICAgICAgICAgICAgICAgY2MudHJhbnNsYXRlQ29sb3IodCwgdG1wRGF0YSwgbnVsbCwgbnVsbCwgbnVtUGl4ZWxzKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ29sb3JTcGFjZSBjcyA9IChDb2xvclNwYWNlKSBlbGVtZW50OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGs9MDsgazxudW1QaXhlbHM7IGsrKykgeworICAgICAgICAgICAgICAgIENvbG9yU3BhY2UgY3MgPSAoQ29sb3JTcGFjZSllbGVtZW50OworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbnVtUGl4ZWxzOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICAgdG1wRGF0YVtrXSA9IGNzLmZyb21DSUVYWVoodG1wRGF0YVtrXSk7Ci0gICAgICAgICAgICAgICAgICAgIHRtcERhdGFba10gPSBjcy50b0NJRVhZWih0bXBEYXRhW2tdKTsgCisgICAgICAgICAgICAgICAgICAgIHRtcERhdGFba10gPSBjcy50b0NJRVhZWih0bXBEYXRhW2tdKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgLy8gTGFzdCB0cmFuc2Zvcm0uLi4KLSAgICAgICAgaWYgKHNlcXVlbmNlW3NlcXVlbmNlLmxlbmd0aC0xXSBpbnN0YW5jZW9mIElDQ19UcmFuc2Zvcm0pIHsgLy8gSUNDCi0gICAgICAgICAgICBJQ0NfVHJhbnNmb3JtIHQgPSAoSUNDX1RyYW5zZm9ybSlzZXF1ZW5jZVtzZXF1ZW5jZS5sZW5ndGgtMV07CisgICAgICAgIGlmIChzZXF1ZW5jZVtzZXF1ZW5jZS5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIElDQ19UcmFuc2Zvcm0pIHsgLy8gSUNDCisgICAgICAgICAgICBJQ0NfVHJhbnNmb3JtIHQgPSAoSUNDX1RyYW5zZm9ybSlzZXF1ZW5jZVtzZXF1ZW5jZS5sZW5ndGggLSAxXTsKICAgICAgICAgICAgIGNjLnRyYW5zbGF0ZUNvbG9yKHQsIHRtcERhdGEsIHh5ekNTLCBkc3RDUywgbnVtUGl4ZWxzKTsKICAgICAgICAgfSBlbHNlIHsgLy8gbm9uIElDQwotICAgICAgICAgICAgZm9yIChpbnQgaz0wOyBrPG51bVBpeGVsczsgaysrKSB7Ci0gICAgICAgICAgICAgICAgdG1wRGF0YVtrXSA9IGRzdENTLmZyb21DSUVYWVoodG1wRGF0YVtrXSk7IAorICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBudW1QaXhlbHM7IGsrKykgeworICAgICAgICAgICAgICAgIHRtcERhdGFba10gPSBkc3RDUy5mcm9tQ0lFWFlaKHRtcERhdGFba10pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNjQ3LDM4ICs2NTIsMzIgQEAKICAgICAgICAgICAgIGRzdFB0LnNldExvY2F0aW9uKHNyY1B0KTsKICAgICAgICAgICAgIHJldHVybiBkc3RQdDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFBvaW50MkQuRmxvYXQoKGZsb2F0KSBzcmNQdC5nZXRYKCksIChmbG9hdCkgc3JjUHQuZ2V0WSgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQb2ludDJELkZsb2F0KChmbG9hdClzcmNQdC5nZXRYKCksIChmbG9hdClzcmNQdC5nZXRZKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVDb21wYXRpYmxlRGVzdFJhc3RlcihSYXN0ZXIgc3JjKSB7CiAgICAgICAgIGludCBuQ29tcHMgPSAwOwogICAgICAgICBpbnQgblNwYWNlcyA9IGNvbnZlcnNpb25TZXF1ZW5jZS5sZW5ndGg7Ci0gICAgICAgIAorCiAgICAgICAgIGlmIChuU3BhY2VzIDwgMikgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNjEiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgT2JqZWN0IGxhc3RDUyA9IGNvbnZlcnNpb25TZXF1ZW5jZVtuU3BhY2VzLTFdOworCisgICAgICAgIE9iamVjdCBsYXN0Q1MgPSBjb252ZXJzaW9uU2VxdWVuY2VbblNwYWNlcyAtIDFdOwogICAgICAgICBpZiAobGFzdENTIGluc3RhbmNlb2YgQ29sb3JTcGFjZSkgewotICAgICAgICAgICAgbkNvbXBzID0gKChDb2xvclNwYWNlKSBsYXN0Q1MpLmdldE51bUNvbXBvbmVudHMoKTsKKyAgICAgICAgICAgIG5Db21wcyA9ICgoQ29sb3JTcGFjZSlsYXN0Q1MpLmdldE51bUNvbXBvbmVudHMoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5Db21wcyA9ICgoSUNDX1Byb2ZpbGUpIGxhc3RDUykuZ2V0TnVtQ29tcG9uZW50cygpOyAKKyAgICAgICAgICAgIG5Db21wcyA9ICgoSUNDX1Byb2ZpbGUpbGFzdENTKS5nZXROdW1Db21wb25lbnRzKCk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgLy8gQ2FsY3VsYXRlIGNvcnJlY3QgZGF0YSB0eXBlCiAgICAgICAgIGludCBkc3REYXRhVHlwZSA9IHNyYy5nZXREYXRhQnVmZmVyKCkuZ2V0RGF0YVR5cGUoKTsKLSAgICAgICAgaWYgKGRzdERhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFICYmCi0gICAgICAgICAgIGRzdERhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9TSE9SVCkgewotICAgICAgICAgICAgICAgIGRzdERhdGFUeXBlID0gRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOworICAgICAgICBpZiAoZHN0RGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUgJiYgZHN0RGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1NIT1JUKSB7CisgICAgICAgICAgICBkc3REYXRhVHlwZSA9IERhdGFCdWZmZXIuVFlQRV9TSE9SVDsKICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIFJhc3Rlci5jcmVhdGVJbnRlcmxlYXZlZFJhc3RlcigKLSAgICAgICAgICAgICAgICBkc3REYXRhVHlwZSwgCi0gICAgICAgICAgICAgICAgc3JjLmdldFdpZHRoKCksCi0gICAgICAgICAgICAgICAgc3JjLmdldEhlaWdodCgpLAotICAgICAgICAgICAgICAgIG5Db21wcywKLSAgICAgICAgICAgICAgICBuZXcgUG9pbnQoc3JjLmdldE1pblgoKSwgc3JjLmdldE1pblkoKSkKLSAgICAgICAgICAgICk7CisKKyAgICAgICAgcmV0dXJuIFJhc3Rlci5jcmVhdGVJbnRlcmxlYXZlZFJhc3Rlcihkc3REYXRhVHlwZSwgc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSwgbkNvbXBzLAorICAgICAgICAgICAgICAgIG5ldyBQb2ludChzcmMuZ2V0TWluWCgpLCBzcmMuZ2V0TWluWSgpKSk7CiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIFJlY3RhbmdsZTJEIGdldEJvdW5kczJEKFJhc3RlciBzcmMpIHsKQEAgLTY5MCwxMyArNjg5LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiBJQ0NfUHJvZmlsZXMgb2JqZWN0cyB3aGljaCBjb25zdHJ1Y3RzCi0gICAgICogdGhpcyBDb2xvckNvbnZlcnRPcCBvYmplY3Qgb3IgcmV0dXJucyBudWxsIGlmIHRoaXMgQ29sb3JDb252ZXJ0T3AgCi0gICAgICogaXMgbm90IGNvbnN0cnVjdGVkIGZyb20gYXJyYXkgb2YgSUNDX1Byb2ZpbGVzLgorICAgICAqIEdldHMgYW4gYXJyYXkgb2YgSUNDX1Byb2ZpbGVzIG9iamVjdHMgd2hpY2ggY29uc3RydWN0cyB0aGlzCisgICAgICogQ29sb3JDb252ZXJ0T3Agb2JqZWN0IG9yIHJldHVybnMgbnVsbCBpZiB0aGlzIENvbG9yQ29udmVydE9wIGlzIG5vdAorICAgICAqIGNvbnN0cnVjdGVkIGZyb20gYXJyYXkgb2YgSUNDX1Byb2ZpbGVzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgSUNDX1Byb2ZpbGVzIG9iamVjdHMgd2hpY2ggY29uc3RydWN0cwotICAgICAqIHRoaXMgQ29sb3JDb252ZXJ0T3Agb2JqZWN0IG9yIHJldHVybnMgbnVsbCBpZiB0aGlzIENvbG9yQ29udmVydE9wIAotICAgICAqIGlzIG5vdCBjb25zdHJ1Y3RlZCBmcm9tIGFycmF5IG9mIElDQ19Qcm9maWxlcy4KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIElDQ19Qcm9maWxlcyBvYmplY3RzIHdoaWNoIGNvbnN0cnVjdHMgdGhpcworICAgICAqICAgICAgICAgQ29sb3JDb252ZXJ0T3Agb2JqZWN0IG9yIHJldHVybnMgbnVsbCBpZiB0aGlzIENvbG9yQ29udmVydE9wIGlzCisgICAgICogICAgICAgICBub3QgY29uc3RydWN0ZWQgZnJvbSBhcnJheSBvZiBJQ0NfUHJvZmlsZXMuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIElDQ19Qcm9maWxlW10gZ2V0SUNDX1Byb2ZpbGVzKCkgewogICAgICAgICBpZiAobWlkUHJvZmlsZXMgIT0gbnVsbCkgewpAQCAtNzA3LDUgKzcwNiw1IEBACiAKICAgICBwdWJsaWMgZmluYWwgUmVuZGVyaW5nSGludHMgZ2V0UmVuZGVyaW5nSGludHMoKSB7CiAgICAgICAgIHJldHVybiByZW5kZXJpbmdIaW50czsKLSAgICB9ICAgIAorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9Db2xvck1vZGVsLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQ29sb3JNb2RlbC5qYXZhCmluZGV4IDk0NWMwODcuLjFiMDg0ZTEgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9Db2xvck1vZGVsLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0NvbG9yTW9kZWwuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIGltcG9ydCBqYXZhLmF3dC5UcmFuc3BhcmVuY3k7CkBAIC0yNyw2MiArMjgsOTUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgQ29sb3JNb2RlbC4KKyAqIFRoZSBjbGFzcyBDb2xvck1vZGVsLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENvbG9yTW9kZWwgaW1wbGVtZW50cyBUcmFuc3BhcmVuY3kgewogCi0gICAgLyoqIFRoZSBwaXhlbF9iaXRzLiAqLwotICAgIHByb3RlY3RlZCBpbnQgcGl4ZWxfYml0czsgIC8vIFBpeGVsIGxlbmd0aCBpbiBiaXRzCisgICAgLyoqCisgICAgICogVGhlIHBpeGVsX2JpdHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBwaXhlbF9iaXRzOyAvLyBQaXhlbCBsZW5ndGggaW4gYml0cwogCi0gICAgLyoqIFRoZSB0cmFuc2ZlciB0eXBlLiAqLworICAgIC8qKgorICAgICAqIFRoZSB0cmFuc2ZlciB0eXBlLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgdHJhbnNmZXJUeXBlOwogCi0gICAgLyoqIFRoZSBjcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY3MuCisgICAgICovCiAgICAgQ29sb3JTcGFjZSBjczsKIAotICAgIC8qKiBUaGUgaGFzIGFscGhhLiAqLworICAgIC8qKgorICAgICAqIFRoZSBoYXMgYWxwaGEuCisgICAgICovCiAgICAgYm9vbGVhbiBoYXNBbHBoYTsKIAotICAgIC8qKiBUaGUgaXMgYWxwaGEgcHJlbXVsdGlwbGllZC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaXMgYWxwaGEgcHJlbXVsdGlwbGllZC4KKyAgICAgKi8KICAgICBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkOwogCi0gICAgLyoqIFRoZSB0cmFuc3BhcmVuY3kuICovCisgICAgLyoqCisgICAgICogVGhlIHRyYW5zcGFyZW5jeS4KKyAgICAgKi8KICAgICBpbnQgdHJhbnNwYXJlbmN5OwogCi0gICAgLyoqIFRoZSBudW0gY29sb3IgY29tcG9uZW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbnVtIGNvbG9yIGNvbXBvbmVudHMuCisgICAgICovCiAgICAgaW50IG51bUNvbG9yQ29tcG9uZW50czsKIAotICAgIC8qKiBUaGUgbnVtIGNvbXBvbmVudHMuICovCisgICAgLyoqCisgICAgICogVGhlIG51bSBjb21wb25lbnRzLgorICAgICAqLwogICAgIGludCBudW1Db21wb25lbnRzOwogCi0gICAgLyoqIFRoZSBiaXRzLiAqLwotICAgIGludFtdIGJpdHM7ICAgICAgICAgICAgIC8vIEFycmF5IG9mIGNvbXBvbmVudHMgbWFza3MgCisgICAgLyoqCisgICAgICogVGhlIGJpdHMuCisgICAgICovCisgICAgaW50W10gYml0czsgLy8gQXJyYXkgb2YgY29tcG9uZW50cyBtYXNrcwogCi0gICAgLyoqIFRoZSBtYXggdmFsdWVzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBtYXggdmFsdWVzLgorICAgICAqLwogICAgIGludFtdIG1heFZhbHVlcyA9IG51bGw7IC8vIE1heCB2YWx1ZXMgdGhhdCBtYXkgYmUgcmVwcmVzZW50IGJ5IGNvbG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9uZW50cwogCi0gICAgLyoqIFRoZSBtYXggYml0IGxlbmd0aC4gKi8KLSAgICBpbnQgbWF4Qml0TGVuZ3RoOyAgICAgICAvLyBNYXggbGVuZ3RoIGNvbG9yIGNvbXBvbmVudHMgaW4gYml0cworICAgIC8vIGNvbXBvbmVudHMKIAotICAgIC8qKiBUaGUgUkcgYmRlZmF1bHQuICovCisgICAgLyoqCisgICAgICogVGhlIG1heCBiaXQgbGVuZ3RoLgorICAgICAqLworICAgIGludCBtYXhCaXRMZW5ndGg7IC8vIE1heCBsZW5ndGggY29sb3IgY29tcG9uZW50cyBpbiBiaXRzCisKKyAgICAvKioKKyAgICAgKiBUaGUgUkcgYmRlZmF1bHQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ29sb3JNb2RlbCBSR0JkZWZhdWx0OwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGNvbG9yIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBpeGVsX2JpdHMgdGhlIHBpeGVsIGxlbmd0aCBpbiBiaXRzCi0gICAgICogQHBhcmFtIGJpdHMgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcwotICAgICAqIEBwYXJhbSBjc3BhY2UgdGhlIGNvbG9yc3BhY2UKLSAgICAgKiBAcGFyYW0gaGFzQWxwaGEgd2hldGhlciB0aGUgY29sb3IgbW9kZWwgaGFzIGFscGhhCi0gICAgICogQHBhcmFtIGlzQWxwaGFQcmVtdWx0aXBsaWVkIHdoZXRoZXIgdGhlIGFscGhhIGlzIHByZW11bHRpcGxpZWQKLSAgICAgKiBAcGFyYW0gdHJhbnNwYXJlbmN5IHRoZSB0cmFuc3BhcmVuY3kgc3RyYXRlZ3ksIEBzZWUgamF2YS5hd3QuVHJhbnNwYXJlbmN5Ci0gICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZSB0aGUgdHJhbnNmZXIgdHlwZSAocHJpbWl0aXZlIGphdmEgdHlwZSAKLSAgICAgKiB0byB1c2UgZm9yIHRoZSBjb21wb25lbnRzKQorICAgICAqIEBwYXJhbSBwaXhlbF9iaXRzCisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwgbGVuZ3RoIGluIGJpdHMuCisgICAgICogQHBhcmFtIGJpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBjb21wb25lbnQgbWFza3MuCisgICAgICogQHBhcmFtIGNzcGFjZQorICAgICAqICAgICAgICAgICAgdGhlIGNvbG9yIHNwYWNlLgorICAgICAqIEBwYXJhbSBoYXNBbHBoYQorICAgICAqICAgICAgICAgICAgd2hldGhlciB0aGUgY29sb3IgbW9kZWwgaGFzIGFscGhhLgorICAgICAqIEBwYXJhbSBpc0FscGhhUHJlbXVsdGlwbGllZAorICAgICAqICAgICAgICAgICAgd2hldGhlciB0aGUgYWxwaGEgaXMgcHJlLW11bHRpcGxpZWQuCisgICAgICogQHBhcmFtIHRyYW5zcGFyZW5jeQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zcGFyZW5jeSBzdHJhdGVneSwgQHNlZSBqYXZhLmF3dC5UcmFuc3BhcmVuY3kuCisgICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zZmVyIHR5cGUgKHByaW1pdGl2ZSBqYXZhIHR5cGUgdG8gdXNlIGZvciB0aGUKKyAgICAgKiAgICAgICAgICAgIGNvbXBvbmVudHMpLgogICAgICAqLwotICAgIHByb3RlY3RlZCBDb2xvck1vZGVsKGludCBwaXhlbF9iaXRzLCBpbnRbXSBiaXRzLCBDb2xvclNwYWNlIGNzcGFjZSwKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzQWxwaGEsIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQsIGludCB0cmFuc3BhcmVuY3ksCi0gICAgICAgICAgICBpbnQgdHJhbnNmZXJUeXBlKSB7CisgICAgcHJvdGVjdGVkIENvbG9yTW9kZWwoaW50IHBpeGVsX2JpdHMsIGludFtdIGJpdHMsIENvbG9yU3BhY2UgY3NwYWNlLCBib29sZWFuIGhhc0FscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBpc0FscGhhUHJlbXVsdGlwbGllZCwgaW50IHRyYW5zcGFyZW5jeSwgaW50IHRyYW5zZmVyVHlwZSkgewogCiAgICAgICAgIGlmIChwaXhlbF9iaXRzIDwgMSkgewogICAgICAgICAgICAgLy8gYXd0LjI2Qj1UaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIHBpeGVsIHZhbHVlcyBpcyBsZXNzIHRoYW4gMQpAQCAtMTEzLDggKzE0Nyw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI2RiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHRyYW5zcGFyZW5jeSA8IFRyYW5zcGFyZW5jeS5PUEFRVUUgfHwKLSAgICAgICAgICAgICAgIHRyYW5zcGFyZW5jeSA+IFRyYW5zcGFyZW5jeS5UUkFOU0xVQ0VOVCkgeworICAgICAgICBpZiAodHJhbnNwYXJlbmN5IDwgVHJhbnNwYXJlbmN5Lk9QQVFVRSB8fCB0cmFuc3BhcmVuY3kgPiBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQpIHsKICAgICAgICAgICAgIC8vIGF3dC4yNzA9VGhlIHRyYW5zcGFyZW5jeSBpcyBub3QgYSB2YWxpZCB2YWx1ZQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNzAiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQpAQCAtMTQ4LDExICsxODEsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgY29sb3IgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHBpeGVsIGJpdCBkZXB0aC4KLSAgICAgKiBUaGUgdHJhbnNmZXJUeXBlIGlzIGNob3NlbiBiYXNlZCBvbiB0aGUgcGl4ZWwgYml0cywgYW5kIHRoZSBvdGhlcgotICAgICAqIGRhdGEgZmllbGRzIGFyZSBnaXZlbiBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgY29sb3IgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHBpeGVsIGJpdCBkZXB0aC4gVGhlCisgICAgICogdHJhbnNmZXJUeXBlIGlzIGNob3NlbiBiYXNlZCBvbiB0aGUgcGl4ZWwgYml0cywgYW5kIHRoZSBvdGhlciBkYXRhIGZpZWxkcworICAgICAqIGFyZSBnaXZlbiBkZWZhdWx0IHZhbHVlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYml0cyB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzCisgICAgICogQHBhcmFtIGJpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBjb21wb25lbnQgbWFza3MuCiAgICAgICovCiAgICAgcHVibGljIENvbG9yTW9kZWwoaW50IGJpdHMpIHsKIApAQCAtMTc4LDE0ICsyMTIsMTcgQEAKICAgICAgKiBHZXRzIHRoZSBkYXRhIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBjb21wb25lbnQgYXJyYXksIHRyYW5zZm9ybWluZwogICAgICAqIHRoZW0gYWNjb3JkaW5nIHRvIHJ1bGVzIG9mIHRoZSBjb2xvciBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50cyB0aGUgY29tcG9uZW50cwotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBpbiB0aGUgbm9ybUNvbXBvbmVudHMgYXJyYXkKLSAgICAgKiBAcGFyYW0gb2JqIHRoZSBhcnJheSB0aGF0IHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0bzogYW4gYXJyYXkgb2YgdmFsdWVzCi0gICAgICogd2hvc2UgbGVuZ3RoIG11c3QgYmUgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIHVzZWQgYnkgdGhlIGNvbG9yIG1vZGVsIGFuZCAKLSAgICAgKiB3aG9zZSB0eXBlIGRlcGVuZHMgb24gdGhlIHRyYW5zZmVyIHR5cGUgKGJhc2VkIG9uIHRoZSBwaXhlbCBiaXQgZGVwdGgpLAotICAgICAqIG9yIG51bGwgdG8gaGF2ZSB0aGUgYXBwcm9wcmlhdGUgYXJyYXkgY3JlYXRlZAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGRhdGEgZWxlbWVudHMKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgdGhlIGNvbXBvbmVudHMuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgbm9ybUNvbXBvbmVudHMgYXJyYXkuCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHRoYXQgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvOiBhbiBhcnJheSBvZiB2YWx1ZXMKKyAgICAgKiAgICAgICAgICAgIHdob3NlIGxlbmd0aCBtdXN0IGJlIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyB1c2VkIGJ5IHRoZQorICAgICAqICAgICAgICAgICAgY29sb3IgbW9kZWwgYW5kIHdob3NlIHR5cGUgZGVwZW5kcyBvbiB0aGUgdHJhbnNmZXIgdHlwZSAoYmFzZWQKKyAgICAgKiAgICAgICAgICAgIG9uIHRoZSBwaXhlbCBiaXQgZGVwdGgpLCBvciBudWxsIHRvIGhhdmUgdGhlIGFwcHJvcHJpYXRlIGFycmF5CisgICAgICogICAgICAgICAgICBjcmVhdGVkLgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGRhdGEgZWxlbWVudHMuCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXREYXRhRWxlbWVudHMoaW50W10gY29tcG9uZW50cywgaW50IG9mZnNldCwgT2JqZWN0IG9iaikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgbWV0aG9kIGlzIG5vdCAiICsgLy8kTk9OLU5MUy0xJApAQCAtMTk1LDMzICsyMzIsMzYgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkYXRhIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBvZiBub3JtYWxpemVkIGNvbXBvbmVudHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5vcm1Db21wb25lbnRzIHRoZSBhcnJheSBub3JtYWxpemVkIGNvbXBvbmVudHMKLSAgICAgKiBAcGFyYW0gbm9ybU9mZnNldCB0aGUgb2Zmc2V0IGluIHRoZSBub3JtQ29tcG9uZW50cyBhcnJheQotICAgICAqIEBwYXJhbSBvYmogdGhlIGFycmF5IHRoYXQgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvOiBhbiBhcnJheSBvZiB2YWx1ZXMKLSAgICAgKiB3aG9zZSBsZW5ndGggbXVzdCBiZSB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgdXNlZCBieSB0aGUgY29sb3IgbW9kZWwgYW5kIAotICAgICAqIHdob3NlIHR5cGUgZGVwZW5kcyBvbiB0aGUgdHJhbnNmZXIgdHlwZSAoYmFzZWQgb24gdGhlIHBpeGVsIGJpdCBkZXB0aCksCi0gICAgICogb3IgbnVsbCB0byBoYXZlIHRoZSBhcHByb3ByaWF0ZSBhcnJheSBjcmVhdGVkCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgZGF0YSBlbGVtZW50cworICAgICAqIEBwYXJhbSBub3JtQ29tcG9uZW50cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG5vcm1hbGl6ZWQgY29tcG9uZW50cy4KKyAgICAgKiBAcGFyYW0gbm9ybU9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgbm9ybUNvbXBvbmVudHMgYXJyYXkuCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHRoYXQgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvOiBhbiBhcnJheSBvZiB2YWx1ZXMKKyAgICAgKiAgICAgICAgICAgIHdob3NlIGxlbmd0aCBtdXN0IGJlIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyB1c2VkIGJ5IHRoZQorICAgICAqICAgICAgICAgICAgY29sb3IgbW9kZWwgYW5kIHdob3NlIHR5cGUgZGVwZW5kcyBvbiB0aGUgdHJhbnNmZXIgdHlwZSAoYmFzZWQKKyAgICAgKiAgICAgICAgICAgIG9uIHRoZSBwaXhlbCBiaXQgZGVwdGgpLCBvciBudWxsIHRvIGhhdmUgdGhlIGFwcHJvcHJpYXRlIGFycmF5CisgICAgICogICAgICAgICAgICBjcmVhdGVkLgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGRhdGEgZWxlbWVudHMuCiAgICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXREYXRhRWxlbWVudHMoZmxvYXRbXSBub3JtQ29tcG9uZW50cywgaW50IG5vcm1PZmZzZXQsCi0gICAgICAgICAgICBPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGludCB1bm5vcm1Db21wb25lbnRzW10gPSBnZXRVbm5vcm1hbGl6ZWRDb21wb25lbnRzKG5vcm1Db21wb25lbnRzLAotICAgICAgICAgICAgICAgIG5vcm1PZmZzZXQsIG51bGwsIDApOworICAgIHB1YmxpYyBPYmplY3QgZ2V0RGF0YUVsZW1lbnRzKGZsb2F0W10gbm9ybUNvbXBvbmVudHMsIGludCBub3JtT2Zmc2V0LCBPYmplY3Qgb2JqKSB7CisgICAgICAgIGludCB1bm5vcm1Db21wb25lbnRzW10gPSBnZXRVbm5vcm1hbGl6ZWRDb21wb25lbnRzKG5vcm1Db21wb25lbnRzLCBub3JtT2Zmc2V0LCBudWxsLCAwKTsKICAgICAgICAgcmV0dXJuIGdldERhdGFFbGVtZW50cyh1bm5vcm1Db21wb25lbnRzLCAwLCBvYmopOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRhdGEgZWxlbWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgcGl4ZWwgZGV0ZXJtaW5lZCBieSB0aGUgCi0gICAgICogUkdCIGRhdGEuCisgICAgICogR2V0cyB0aGUgZGF0YSBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwaXhlbCBkZXRlcm1pbmVkIGJ5IHRoZSBSR0IKKyAgICAgKiBkYXRhLgogICAgICAqIAotICAgICAqIEBwYXJhbSByZ2IgdGhlIHJnYiBpbnQgdGhhdCBkZWZpbmVzIHRoZSBwaXhlbAotICAgICAqIEBwYXJhbSBwaXhlbCB0aGUgYXJyYXkgdGhhdCB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG86IGFuIGFycmF5IG9mIHZhbHVlcwotICAgICAqIHdob3NlIGxlbmd0aCBtdXN0IGJlIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyB1c2VkIGJ5IHRoZSBjb2xvciBtb2RlbCBhbmQgCi0gICAgICogd2hvc2UgdHlwZSBkZXBlbmRzIG9uIHRoZSB0cmFuc2ZlciB0eXBlIChiYXNlZCBvbiB0aGUgcGl4ZWwgYml0IGRlcHRoKSwKLSAgICAgKiBvciBudWxsIHRvIGhhdmUgdGhlIGFwcHJvcHJpYXRlIGFycmF5IGNyZWF0ZWQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBkYXRhIGVsZW1lbnRzCisgICAgICogQHBhcmFtIHJnYgorICAgICAqICAgICAgICAgICAgdGhlIFJHQiBpbnRlZ2VyIHZhbHVlIHRoYXQgZGVmaW5lcyB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIHBpeGVsCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgdGhhdCB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG86IGFuIGFycmF5IG9mIHZhbHVlcworICAgICAqICAgICAgICAgICAgd2hvc2UgbGVuZ3RoIG11c3QgYmUgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIHVzZWQgYnkgdGhlCisgICAgICogICAgICAgICAgICBjb2xvciBtb2RlbCBhbmQgd2hvc2UgdHlwZSBkZXBlbmRzIG9uIHRoZSB0cmFuc2ZlciB0eXBlIChiYXNlZAorICAgICAqICAgICAgICAgICAgb24gdGhlIHBpeGVsIGJpdCBkZXB0aCksIG9yIG51bGwgdG8gaGF2ZSB0aGUgYXBwcm9wcmlhdGUgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIGNyZWF0ZWQuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgZGF0YSBlbGVtZW50cy4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldERhdGFFbGVtZW50cyhpbnQgcmdiLCBPYmplY3QgcGl4ZWwpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCBpcyBub3QgIiArIC8vJE5PTi1OTFMtMSQKQEAgLTIyOSwzOCArMjY5LDM4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgY2hpbGQgcmFzdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFscGhhIGNoYW5uZWwgb2YgdGhlIAotICAgICAqIHNwZWNpZmllZCB3cml0YWJsZSByYXN0ZXIsIG9yIG51bGwgaWYgYWxwaGEgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBHZXRzIHRoZSBjaGlsZCByYXN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgYWxwaGEgY2hhbm5lbCBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogd3JpdGFibGUgcmFzdGVyLCBvciBudWxsIGlmIGFscGhhIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJhc3RlciB0aGUgcmFzdGVyCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYWxwaGEgcmFzdGVyCisgICAgICogQHBhcmFtIHJhc3RlcgorICAgICAqICAgICAgICAgICAgdGhlIHJhc3Rlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBhbHBoYSByYXN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGdldEFscGhhUmFzdGVyKFdyaXRhYmxlUmFzdGVyIHJhc3RlcikgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbG9yIG1vZGVsIGJ5IGNvZXJjaW5nIHRoZSBkYXRhIGluIHRoZSB3cml0YWJsZSByYXN0ZXIgCi0gICAgICogaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBhbHBoYSBzdHJhdGVneSBvZiB0aGlzIGNvbG9yIG1vZGVsLgorICAgICAqIENyZWF0ZXMgYSBuZXcgY29sb3IgbW9kZWwgYnkgY29lcmNpbmcgdGhlIGRhdGEgaW4gdGhlIHdyaXRhYmxlIHJhc3RlciBpbgorICAgICAqIGFjY29yZGFuY2Ugd2l0aCB0aGUgYWxwaGEgc3RyYXRlZ3kgb2YgdGhpcyBjb2xvciBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmFzdGVyIHRoZSByYXN0ZXIKLSAgICAgKiBAcGFyYW0gaXNBbHBoYVByZW11bHRpcGxpZWQgd2hldGhlciB0aGUgYWxwaGEgaXMgcHJlbXVsdGlwbGllZCBpbiB0aGlzIAotICAgICAqIGNvbG9yIG1vZGVsCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IGNvbG9yIG1vZGVsCisgICAgICogQHBhcmFtIHJhc3RlcgorICAgICAqICAgICAgICAgICAgdGhlIHJhc3Rlci4KKyAgICAgKiBAcGFyYW0gaXNBbHBoYVByZW11bHRpcGxpZWQKKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGFscGhhIGlzIHByZS1tdWx0aXBsaWVkIGluIHRoaXMgY29sb3IgbW9kZWwKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgY29sb3IgbW9kZWwuCiAgICAgICovCi0gICAgcHVibGljIENvbG9yTW9kZWwgY29lcmNlRGF0YShXcml0YWJsZVJhc3RlciByYXN0ZXIsCi0gICAgICAgICAgICBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7CisgICAgcHVibGljIENvbG9yTW9kZWwgY29lcmNlRGF0YShXcml0YWJsZVJhc3RlciByYXN0ZXIsIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCBpcyBub3QgIiArIC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICAic3VwcG9ydGVkIGJ5IHRoaXMgQ29sb3JNb2RlbCIpOyAvLyROT04tTkxTLTEkCiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgLy8gVGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3VyLiAKKyAgICAgICAgLy8gVGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3IuCiAgICAgICAgIC8vIEl0IGNvdWxkIGJlIHJldmVsZWQgc3VjaCB3YXk6Ci0gICAgICAgIC8vIENvbG9yTW9kZWwgY20gPSBuZXcgQ29tcG9uZW50Q29sb3JNb2RlbChDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1Nfc1JHQiwKKyAgICAgICAgLy8gQ29sb3JNb2RlbCBjbSA9IG5ldworICAgICAgICAvLyBDb21wb25lbnRDb2xvck1vZGVsKENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCLAogICAgICAgICAvLyBmYWxzZSwgZmFsc2UsIFRyYW5zcGFyZW5jeS5PUEFRVUUsIERhdGFCdWZmZXIuVFlQRV9CWVRFKTsKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKGNtLnRvU3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gIkNvbG9yTW9kZWw6IENvbG9yIFNwYWNlID0gIiArIGNzLnRvU3RyaW5nKCkgKyAiOyBoYXMgYWxwaGEgPSAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtMjc0LDE1ICszMTQsMTcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBjb21wb25lbnRzIG9mIHRoZSBwaXhlbCBkZXRlcm1pbmVkIGJ5IHRoZSBkYXRhIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwaXhlbCB0aGUgZGF0YSBhcnJheSB0aGF0IGRlZmluZXMgdGhlIHBpeGVsICh3aG9zZSAKLSAgICAgKiBwcmltaXRpdmUgdHlwZSBjb3JyZXNwb25kcyB0byB0aGUgcGl4ZWwgbGVuZ3RoIGluIGJpdHMsIAorICAgICAqIEBwYXJhbSBwaXhlbAorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXkgdGhhdCBkZWZpbmVzIHRoZSBwaXhlbCAod2hvc2UgcHJpbWl0aXZlIHR5cGUKKyAgICAgKiAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBwaXhlbCBsZW5ndGggaW4gYml0cy4KICAgICAgKiBAc2VlIENvbG9yTW9kZWwjZ2V0VHJhbnNmZXJUeXBlKCkKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50cyB0aGUgdGhlIGFycmF5IHdoZXJlIHRoZSByZXN1bHRpbmcgY29tcG9uZW50cwotICAgICAqIGFyZSB3cml0dGVuIChvciBudWxsIHRvIHByb21wdCB0aGUgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgcmV0dXJuIGFycmF5KQotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0aGF0IHRlbGxzIHdoZXJlIHRoZSByZXN1bHRzIHNob3VsZCBiZSB3cml0dGVuCi0gICAgICogaW4gdGhlIHJldHVybiBhcnJheQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGNvbXBvbmVudHMKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgdGhlIHRoZSBhcnJheSB3aGVyZSB0aGUgcmVzdWx0aW5nIGNvbXBvbmVudHMgYXJlIHdyaXR0ZW4gKG9yCisgICAgICogICAgICAgICAgICBudWxsIHRvIHByb21wdCB0aGUgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgcmV0dXJuIGFycmF5KS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHRoYXQgdGVsbHMgd2hlcmUgdGhlIHJlc3VsdHMgc2hvdWxkIGJlIHdyaXR0ZW4gaW4KKyAgICAgKiAgICAgICAgICAgIHRoZSByZXR1cm4gYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgY29tcG9uZW50cy4KICAgICAgKi8KICAgICBwdWJsaWMgaW50W10gZ2V0Q29tcG9uZW50cyhPYmplY3QgcGl4ZWwsIGludFtdIGNvbXBvbmVudHMsIGludCBvZmZzZXQpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCBpcyBub3QgIiArIC8vJE5PTi1OTFMtMSQKQEAgLTI5MiwxOCArMzM0LDIwIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbm9ybWFsaXplZCBjb21wb25lbnRzIG9mIHRoZSBwaXhlbCBkZXRlcm1pbmVkIGJ5IHRoZSBkYXRhIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwaXhlbCB0aGUgZGF0YSBhcnJheSB0aGF0IGRlZmluZXMgdGhlIHBpeGVsICh3aG9zZSAKLSAgICAgKiBwcmltaXRpdmUgdHlwZSBjb3JyZXNwb25kcyB0byB0aGUgcGl4ZWwgbGVuZ3RoIGluIGJpdHMsIAorICAgICAqIEBwYXJhbSBwaXhlbAorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXkgdGhhdCBkZWZpbmVzIHRoZSBwaXhlbCAod2hvc2UgcHJpbWl0aXZlIHR5cGUKKyAgICAgKiAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBwaXhlbCBsZW5ndGggaW4gYml0cy4KICAgICAgKiBAc2VlIENvbG9yTW9kZWwjZ2V0VHJhbnNmZXJUeXBlKCkKLSAgICAgKiBAcGFyYW0gbm9ybUNvbXBvbmVudHMgdGhlIGFycmF5IHdoZXJlIHRoZSByZXN1bHRpbmcgbm9ybWFsaXNlZCBjb21wb25lbnRzCi0gICAgICogYXJlIHdyaXR0ZW4gKG9yIG51bGwgdG8gcHJvbXB0IHRoZSBtZXRob2QgdG8gY3JlYXRlIHRoZSByZXR1cm4gYXJyYXkpCi0gICAgICogQHBhcmFtIG5vcm1PZmZzZXQgdGhlIG9mZnNldCB0aGF0IHRlbGxzIHdoZXJlIHRoZSByZXN1bHRzIHNob3VsZCBiZSB3cml0dGVuCi0gICAgICogaW4gdGhlIHJldHVybiBhcnJheQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIG5vcm1hbGl6ZWQgY29tcG9uZW50cworICAgICAqIEBwYXJhbSBub3JtQ29tcG9uZW50cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdoZXJlIHRoZSByZXN1bHRpbmcgbm9ybWFsaXplZCBjb21wb25lbnRzIGFyZQorICAgICAqICAgICAgICAgICAgd3JpdHRlbiAob3IgbnVsbCB0byBwcm9tcHQgdGhlIG1ldGhvZCB0byBjcmVhdGUgdGhlIHJldHVybgorICAgICAqICAgICAgICAgICAgYXJyYXkpLgorICAgICAqIEBwYXJhbSBub3JtT2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHRoYXQgdGVsbHMgd2hlcmUgdGhlIHJlc3VsdHMgc2hvdWxkIGJlIHdyaXR0ZW4gaW4KKyAgICAgKiAgICAgICAgICAgIHRoZSByZXR1cm4gYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2Ygbm9ybWFsaXplZCBjb21wb25lbnRzLgogICAgICAqLwotICAgIHB1YmxpYyBmbG9hdFtdIGdldE5vcm1hbGl6ZWRDb21wb25lbnRzKE9iamVjdCBwaXhlbCwKLSAgICAgICAgICAgIGZsb2F0W10gbm9ybUNvbXBvbmVudHMsIGludCBub3JtT2Zmc2V0KSB7CisgICAgcHVibGljIGZsb2F0W10gZ2V0Tm9ybWFsaXplZENvbXBvbmVudHMoT2JqZWN0IHBpeGVsLCBmbG9hdFtdIG5vcm1Db21wb25lbnRzLCBpbnQgbm9ybU9mZnNldCkgewogCiAgICAgICAgIGlmIChwaXhlbCA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjk0PXBpeGVsIGlzIG51bGwKQEAgLTMxMSw4ICszNTUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50IHVubm9ybUNvbXBvbmVudHNbXSA9IGdldENvbXBvbmVudHMocGl4ZWwsIG51bGwsIDApOwotICAgICAgICByZXR1cm4gZ2V0Tm9ybWFsaXplZENvbXBvbmVudHModW5ub3JtQ29tcG9uZW50cywgMCwgbm9ybUNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgbm9ybU9mZnNldCk7CisgICAgICAgIHJldHVybiBnZXROb3JtYWxpemVkQ29tcG9uZW50cyh1bm5vcm1Db21wb25lbnRzLCAwLCBub3JtQ29tcG9uZW50cywgbm9ybU9mZnNldCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zMjAsNTQgKzM2Myw1MiBAQAogICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBDb2xvck1vZGVsKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIENvbG9yTW9kZWwgY20gPSAoQ29sb3JNb2RlbCkgb2JqOworICAgICAgICBDb2xvck1vZGVsIGNtID0gKENvbG9yTW9kZWwpb2JqOwogCi0gICAgICAgIHJldHVybiAocGl4ZWxfYml0cyA9PSBjbS5nZXRQaXhlbFNpemUoKSAmJgotICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlID09IGNtLmdldFRyYW5zZmVyVHlwZSgpICYmCi0gICAgICAgICAgICAgICBjcy5nZXRUeXBlKCkgPT0gY20uZ2V0Q29sb3JTcGFjZSgpLmdldFR5cGUoKSAmJgotICAgICAgICAgICAgICAgaGFzQWxwaGEgPT0gY20uaGFzQWxwaGEoKSAmJgotICAgICAgICAgICAgICAgaXNBbHBoYVByZW11bHRpcGxpZWQgPT0gY20uaXNBbHBoYVByZW11bHRpcGxpZWQoKSAmJgotICAgICAgICAgICAgICAgdHJhbnNwYXJlbmN5ID09IGNtLmdldFRyYW5zcGFyZW5jeSgpICYmCi0gICAgICAgICAgICAgICBudW1Db2xvckNvbXBvbmVudHMgPT0gY20uZ2V0TnVtQ29sb3JDb21wb25lbnRzKCkgJiYKLSAgICAgICAgICAgICAgIG51bUNvbXBvbmVudHMgPT0gY20uZ2V0TnVtQ29tcG9uZW50cygpICYmCi0gICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKGJpdHMsIGNtLmdldENvbXBvbmVudFNpemUoKSkpOworICAgICAgICByZXR1cm4gKHBpeGVsX2JpdHMgPT0gY20uZ2V0UGl4ZWxTaXplKCkgJiYgdHJhbnNmZXJUeXBlID09IGNtLmdldFRyYW5zZmVyVHlwZSgpCisgICAgICAgICAgICAgICAgJiYgY3MuZ2V0VHlwZSgpID09IGNtLmdldENvbG9yU3BhY2UoKS5nZXRUeXBlKCkgJiYgaGFzQWxwaGEgPT0gY20uaGFzQWxwaGEoKQorICAgICAgICAgICAgICAgICYmIGlzQWxwaGFQcmVtdWx0aXBsaWVkID09IGNtLmlzQWxwaGFQcmVtdWx0aXBsaWVkKCkKKyAgICAgICAgICAgICAgICAmJiB0cmFuc3BhcmVuY3kgPT0gY20uZ2V0VHJhbnNwYXJlbmN5KCkKKyAgICAgICAgICAgICAgICAmJiBudW1Db2xvckNvbXBvbmVudHMgPT0gY20uZ2V0TnVtQ29sb3JDb21wb25lbnRzKCkKKyAgICAgICAgICAgICAgICAmJiBudW1Db21wb25lbnRzID09IGNtLmdldE51bUNvbXBvbmVudHMoKSAmJiBBcnJheXMuZXF1YWxzKGJpdHMsIGNtCisgICAgICAgICAgICAgICAgLmdldENvbXBvbmVudFNpemUoKSkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHJlZCBjb21wb25lbnQgb2YgdGhlIHBpeGVsIGRldGVybWluZWQgYnkgdGhlIGRhdGEgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGluRGF0YSB0aGUgZGF0YSBhcnJheSB0aGF0IGRlZmluZXMgdGhlIHBpeGVsICh3aG9zZSAKLSAgICAgKiBwcmltaXRpdmUgdHlwZSBjb3JyZXNwb25kcyB0byB0aGUgcGl4ZWwgbGVuZ3RoIGluIGJpdHMsIAorICAgICAqIEBwYXJhbSBpbkRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5IHRoYXQgZGVmaW5lcyB0aGUgcGl4ZWwgKHdob3NlIHByaW1pdGl2ZSB0eXBlCisgICAgICogICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgcGl4ZWwgbGVuZ3RoIGluIGJpdHMuCiAgICAgICogQHNlZSBDb2xvck1vZGVsI2dldFRyYW5zZmVyVHlwZSgpCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVkCisgICAgICogQHJldHVybiB0aGUgcmVkLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0UmVkKE9iamVjdCBpbkRhdGEpIHsKICAgICAgICAgcmV0dXJuIGdldFJlZChjb25zdHJ1Y3RQaXhlbChpbkRhdGEpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBSR0IgaW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBpeGVsIGRlZmluZWQgYnkgdGhlIGRhdGEgYXJyYXkuCisgICAgICogR2V0cyB0aGUgUkdCIGludGVnZXIgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgcGl4ZWwgZGVmaW5lZCBieSB0aGUgZGF0YQorICAgICAqIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbkRhdGEgdGhlIGRhdGEgYXJyYXkgdGhhdCBkZWZpbmVzIHRoZSBwaXhlbCAod2hvc2UgCi0gICAgICogcHJpbWl0aXZlIHR5cGUgY29ycmVzcG9uZHMgdG8gdGhlIHBpeGVsIGxlbmd0aCBpbiBiaXRzLCAKKyAgICAgKiBAcGFyYW0gaW5EYXRhCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSB0aGF0IGRlZmluZXMgdGhlIHBpeGVsICh3aG9zZSBwcmltaXRpdmUgdHlwZQorICAgICAqICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIHBpeGVsIGxlbmd0aCBpbiBiaXRzLgogICAgICAqIEBzZWUgQ29sb3JNb2RlbCNnZXRUcmFuc2ZlclR5cGUoKQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludCB0aGF0IGdpdmVzIHRoZSBwaXhlbCdzIGNvbG9ycyBpbiBSR0IgZm9ybWF0CisgICAgICogQHJldHVybiB0aGUgaW50ZWdlciB2YWx1ZSB0aGF0IGdpdmVzIHRoZSBwaXhlbCdzIGNvbG9ycyBpbiBSR0IgZm9ybWF0LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0UkdCKE9iamVjdCBpbkRhdGEpIHsKLSAgICAgICAgcmV0dXJuIChnZXRBbHBoYShpbkRhdGEpIDw8IDI0IHwgZ2V0UmVkKGluRGF0YSkgPDwgMTYgfAotICAgICAgICAgICAgICAgZ2V0R3JlZW4oaW5EYXRhKSA8PCA4IHwgZ2V0Qmx1ZShpbkRhdGEpKTsKKyAgICAgICAgcmV0dXJuIChnZXRBbHBoYShpbkRhdGEpIDw8IDI0IHwgZ2V0UmVkKGluRGF0YSkgPDwgMTYgfCBnZXRHcmVlbihpbkRhdGEpIDw8IDggfCBnZXRCbHVlKGluRGF0YSkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUgcGl4ZWwgZGVmaW5lZCBieSB0aGUgZGF0YSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5EYXRhIHRoZSBkYXRhIGFycmF5IHRoYXQgZGVmaW5lcyB0aGUgcGl4ZWwgKHdob3NlIAotICAgICAqIHByaW1pdGl2ZSB0eXBlIGNvcnJlc3BvbmRzIHRvIHRoZSBwaXhlbCBsZW5ndGggaW4gYml0cywgCisgICAgICogQHBhcmFtIGluRGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXkgdGhhdCBkZWZpbmVzIHRoZSBwaXhlbCAod2hvc2UgcHJpbWl0aXZlIHR5cGUKKyAgICAgKiAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBwaXhlbCBsZW5ndGggaW4gYml0cy4KICAgICAgKiBAc2VlIENvbG9yTW9kZWwjZ2V0VHJhbnNmZXJUeXBlKCkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBncmVlbgorICAgICAqIEByZXR1cm4gdGhlIGdyZWVuLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0R3JlZW4oT2JqZWN0IGluRGF0YSkgewogICAgICAgICByZXR1cm4gZ2V0R3JlZW4oY29uc3RydWN0UGl4ZWwoaW5EYXRhKSk7CkBAIC0zNzYsMTEgKzQxNywxMSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBwaXhlbCBkZWZpbmVkIGJ5IHRoZSBkYXRhIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbkRhdGEgdGhlIGRhdGEgYXJyYXkgdGhhdCBkZWZpbmVzIHRoZSBwaXhlbCAod2hvc2UgCi0gICAgICogcHJpbWl0aXZlIHR5cGUgY29ycmVzcG9uZHMgdG8gdGhlIHBpeGVsIGxlbmd0aCBpbiBiaXRzLCAKKyAgICAgKiBAcGFyYW0gaW5EYXRhCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSB0aGF0IGRlZmluZXMgdGhlIHBpeGVsICh3aG9zZSBwcmltaXRpdmUgdHlwZQorICAgICAqICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIHBpeGVsIGxlbmd0aCBpbiBiaXRzLgogICAgICAqIEBzZWUgQ29sb3JNb2RlbCNnZXRUcmFuc2ZlclR5cGUoKQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJsdWUKKyAgICAgKiBAcmV0dXJuIHRoZSBibHVlLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0Qmx1ZShPYmplY3QgaW5EYXRhKSB7CiAgICAgICAgIHJldHVybiBnZXRCbHVlKGNvbnN0cnVjdFBpeGVsKGluRGF0YSkpOwpAQCAtMzg5LDExICs0MzAsMTEgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBhbHBoYSBjb21wb25lbnQgb2YgdGhlIHBpeGVsIGRlZmluZWQgYnkgdGhlIGRhdGEgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGluRGF0YSB0aGUgZGF0YSBhcnJheSB0aGF0IGRlZmluZXMgdGhlIHBpeGVsICh3aG9zZSAKLSAgICAgKiBwcmltaXRpdmUgdHlwZSBjb3JyZXNwb25kcyB0byB0aGUgcGl4ZWwgbGVuZ3RoIGluIGJpdHMsIAorICAgICAqIEBwYXJhbSBpbkRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5IHRoYXQgZGVmaW5lcyB0aGUgcGl4ZWwgKHdob3NlIHByaW1pdGl2ZSB0eXBlCisgICAgICogICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgcGl4ZWwgbGVuZ3RoIGluIGJpdHMuCiAgICAgICogQHNlZSBDb2xvck1vZGVsI2dldFRyYW5zZmVyVHlwZSgpCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYWxwaGEKKyAgICAgKiBAcmV0dXJuIHRoZSBhbHBoYS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEFscGhhKE9iamVjdCBpbkRhdGEpIHsKICAgICAgICAgcmV0dXJuIGdldEFscGhhKGNvbnN0cnVjdFBpeGVsKGluRGF0YSkpOwpAQCAtNDAyLDEwICs0NDMsMTEgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgY29tcGF0aWJsZSB3cml0YWJsZSByYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBkZXNpcmVkIHdyaXRhYmxlIHJhc3RlcgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIGRlc2lyZWQgd3JpdGFibGUgcmFzdGVyCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgd3JpdGFibGUgcmFzdGVyCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgZGVzaXJlZCB3cml0YWJsZSByYXN0ZXIuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGRlc2lyZWQgd3JpdGFibGUgcmFzdGVyLgorICAgICAqIEByZXR1cm4gdGhlIHdyaXRhYmxlIHJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKGludCB3LCBpbnQgaCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgbWV0aG9kIGlzIG5vdCAiICsgLy8kTk9OLU5MUy0xJApAQCAtNDE1LDkgKzQ1Nyw5IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoZSBzYW1wbGUgbW9kZWwgaXMgY29tcGF0aWJsZSB3aXRoIHRoaXMgY29sb3IgbW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNtIHRoZSBzYW1wbGUgbW9kZWwKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzYW1wbGUgbW9kZWwgaXMgY29tcGF0aWJsZSB3aXRoIHRoaXMgY29sb3IgbW9kZWwKKyAgICAgKiBAcGFyYW0gc20KKyAgICAgKiAgICAgICAgICAgIHRoZSBzYW1wbGUgbW9kZWwuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc2FtcGxlIG1vZGVsIGlzIGNvbXBhdGlibGUgd2l0aCB0aGlzIGNvbG9yIG1vZGVsLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZVNhbXBsZU1vZGVsKFNhbXBsZU1vZGVsIHNtKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhpcyBtZXRob2QgaXMgbm90ICIgKyAvLyROT04tTkxTLTEkCkBAIC00MjcsMTAgKzQ2OSwxMSBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgdGhlIGNvbXBhdGlibGUgc2FtcGxlIG1vZGVsLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgZGVzaXJlZCBzYW1wbGUgbW9kZWwKLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBkZXNpcmVkIHNhbXBsZSBtb2RlbAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNhbXBsZSBtb2RlbAorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGRlc2lyZWQgc2FtcGxlIG1vZGVsLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBkZXNpcmVkIHNhbXBsZSBtb2RlbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzYW1wbGUgbW9kZWwuCiAgICAgICovCiAgICAgcHVibGljIFNhbXBsZU1vZGVsIGNyZWF0ZUNvbXBhdGlibGVTYW1wbGVNb2RlbChpbnQgdywgaW50IGgpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCBpcyBub3QgIiArIC8vJE5PTi1OTFMtMSQKQEAgLTQ0MCw5ICs0ODMsOSBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIHJhc3RlciBpcyBjb21wYXRpYmxlIHdpdGggdGhpcyBjb2xvciBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmFzdGVyIHRoZSByYXN0ZXIgdG8gaW5zcGVjdAotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHJhc3RlciBpcyBjb21wYXRpYmxlIHdpdGggdGhpcyBjb2xvciBtb2RlbAorICAgICAqIEBwYXJhbSByYXN0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSByYXN0ZXIgdG8gaW5zcGVjdC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSByYXN0ZXIgaXMgY29tcGF0aWJsZSB3aXRoIHRoaXMgY29sb3IgbW9kZWwuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlUmFzdGVyKFJhc3RlciByYXN0ZXIpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCBpcyBub3QgIiArIC8vJE5PTi1OTFMtMSQKQEAgLTQ1MiwyOCArNDk1LDMyIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgY29sb3Igc3BhY2Ugb2YgdGhpcyBjb2xvciBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb2xvciBzcGFjZQorICAgICAqIEByZXR1cm4gdGhlIGNvbG9yIHNwYWNlLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBDb2xvclNwYWNlIGdldENvbG9yU3BhY2UoKSB7CiAgICAgICAgIHJldHVybiBjczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBub3JtYWxpemVkIGNvbXBvbmVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIAorICAgICAqIEdldHMgdGhlIG5vcm1hbGl6ZWQgY29tcG9uZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQKICAgICAgKiB1bm5vcm1hbGl6ZWQgY29tcG9uZW50cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50cyB0aGUgYXJyYXkgb2YgdW5ub3JtYWxpemVkIGNvbXBvbmVudHMKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgd2hlcmUgdGhlIGNvbXBvbmVudHMgc2hvdWxkIGJlIHJlYWQgCi0gICAgICogZnJvbSB0aGUgYXJyYXkgb2YgdW5ub3JtYWxpemVkIGNvbXBvbmVudHMKLSAgICAgKiBAcGFyYW0gbm9ybUNvbXBvbmVudHMgdGhlIGFycmF5IHdoZXJlIHRoZSByZXN1bHRpbmcgbm9ybWFsaXNlZCBjb21wb25lbnRzCi0gICAgICogYXJlIHdyaXR0ZW4gKG9yIG51bGwgdG8gcHJvbXB0IHRoZSBtZXRob2QgdG8gY3JlYXRlIHRoZSByZXR1cm4gYXJyYXkpCi0gICAgICogQHBhcmFtIG5vcm1PZmZzZXQgdGhlIG9mZnNldCB0aGF0IHRlbGxzIHdoZXJlIHRoZSByZXN1bHRzIHNob3VsZCBiZSB3cml0dGVuCi0gICAgICogaW4gdGhlIHJldHVybiBhcnJheQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5vcm1hbGl6ZWQgY29tcG9uZW50cworICAgICAqIEBwYXJhbSBjb21wb25lbnRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgdW5ub3JtYWxpemVkIGNvbXBvbmVudHMuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCB3aGVyZSB0aGUgY29tcG9uZW50cyBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBhcnJheQorICAgICAqICAgICAgICAgICAgb2YgdW5ub3JtYWxpemVkIGNvbXBvbmVudHMuCisgICAgICogQHBhcmFtIG5vcm1Db21wb25lbnRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgd2hlcmUgdGhlIHJlc3VsdGluZyBub3JtYWxpemVkIGNvbXBvbmVudHMgYXJlCisgICAgICogICAgICAgICAgICB3cml0dGVuIChvciBudWxsIHRvIHByb21wdCB0aGUgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgcmV0dXJuCisgICAgICogICAgICAgICAgICBhcnJheSkuCisgICAgICogQHBhcmFtIG5vcm1PZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgdGhhdCB0ZWxscyB3aGVyZSB0aGUgcmVzdWx0cyBzaG91bGQgYmUgd3JpdHRlbiBpbgorICAgICAqICAgICAgICAgICAgdGhlIHJldHVybiBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoZSBub3JtYWxpemVkIGNvbXBvbmVudHMuCiAgICAgICovCi0gICAgcHVibGljIGZsb2F0W10gZ2V0Tm9ybWFsaXplZENvbXBvbmVudHMoaW50W10gY29tcG9uZW50cywgaW50IG9mZnNldCwKLSAgICAgICAgICAgIGZsb2F0IG5vcm1Db21wb25lbnRzW10sIGludCBub3JtT2Zmc2V0KSB7CisgICAgcHVibGljIGZsb2F0W10gZ2V0Tm9ybWFsaXplZENvbXBvbmVudHMoaW50W10gY29tcG9uZW50cywgaW50IG9mZnNldCwgZmxvYXQgbm9ybUNvbXBvbmVudHNbXSwKKyAgICAgICAgICAgIGludCBub3JtT2Zmc2V0KSB7CiAgICAgICAgIGlmIChiaXRzID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGF3dC4yNkM9Yml0cyBpcyBudWxsCiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjZDIikpOyAvLyROT04tTkxTLTEkCkBAIC00ODQsMTQgKzUzMSwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGhhc0FscGhhICYmIGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7Ci0gICAgICAgICAgICBmbG9hdCBub3JtQWxwaGEgPQotICAgICAgICAgICAgICAgIChmbG9hdCkgY29tcG9uZW50c1tvZmZzZXQgKyBudW1Db2xvckNvbXBvbmVudHNdIC8KLSAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c107CisgICAgICAgICAgICBmbG9hdCBub3JtQWxwaGEgPSAoZmxvYXQpY29tcG9uZW50c1tvZmZzZXQgKyBudW1Db2xvckNvbXBvbmVudHNdCisgICAgICAgICAgICAgICAgICAgIC8gbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c107CiAgICAgICAgICAgICBpZiAobm9ybUFscGhhICE9IDAuMGYpIHsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbG9yQ29tcG9uZW50czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQgKyBpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzW29mZnNldCArIGldIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm9ybUFscGhhICogbWF4VmFsdWVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgbm9ybUNvbXBvbmVudHNbbm9ybU9mZnNldCArIGldID0gY29tcG9uZW50c1tvZmZzZXQgKyBpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKG5vcm1BbHBoYSAqIG1heFZhbHVlc1tpXSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQgKyBudW1Db2xvckNvbXBvbmVudHNdID0gbm9ybUFscGhhOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTUwMSw5ICs1NDYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db21wb25lbnRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBub3JtQ29tcG9uZW50c1tub3JtT2Zmc2V0ICsgaV0gPQotICAgICAgICAgICAgICAgICAgICAoZmxvYXQpIGNvbXBvbmVudHNbb2Zmc2V0ICsgaV0gLwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVzW2ldOworICAgICAgICAgICAgICAgIG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQgKyBpXSA9IChmbG9hdCljb21wb25lbnRzW29mZnNldCArIGldIC8gbWF4VmFsdWVzW2ldOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTUxMywxMSArNTU2LDEyIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZGF0YSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVubm9ybWFsaXplZCBjb21wb25lbnRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSBjb21wb25lbnRzCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRvIHN0YXJ0IHJlYWRpbmcgdGhlIGNvbXBvbmVudHMgZnJvbSB0aGUgCi0gICAgICogYXJyYXkgb2YgY29tcG9uZW50cwotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRhdGEgZWxlbWVudAorICAgICAqIEBwYXJhbSBjb21wb25lbnRzCisgICAgICogICAgICAgICAgICB0aGUgY29tcG9uZW50cy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHRvIHN0YXJ0IHJlYWRpbmcgdGhlIGNvbXBvbmVudHMgZnJvbSB0aGUgYXJyYXkgb2YKKyAgICAgKiAgICAgICAgICAgIGNvbXBvbmVudHMuCisgICAgICogQHJldHVybiB0aGUgZGF0YSBlbGVtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RGF0YUVsZW1lbnQoaW50W10gY29tcG9uZW50cywgaW50IG9mZnNldCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgbWV0aG9kIGlzIG5vdCAiICsgLy8kTk9OLU5MUy0xJApAQCAtNTI1LDIxICs1NjksMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB1bm5vcm1hbGl6ZWQgY29tcG9uZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgCisgICAgICogR2V0cyB0aGUgdW5ub3JtYWxpemVkIGNvbXBvbmVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkCiAgICAgICogbm9ybWFsaXplZCBjb21wb25lbnRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBub3JtQ29tcG9uZW50cyB0aGUgYXJyYXkgb2Ygbm9ybWFsaXplZCBjb21wb25lbnRzCi0gICAgICogQHBhcmFtIG5vcm1PZmZzZXQgdGhlIG9mZnNldCB3aGVyZSB0aGUgY29tcG9uZW50cyBzaG91bGQgYmUgcmVhZCAKLSAgICAgKiBmcm9tIHRoZSBhcnJheSBvZiBub3JtYWxpemVkIGNvbXBvbmVudHMKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50cyB0aGUgYXJyYXkgd2hlcmUgdGhlIHJlc3VsdGluZyB1bm5vcm1hbGlzZWQgY29tcG9uZW50cwotICAgICAqIGFyZSB3cml0dGVuIChvciBudWxsIHRvIHByb21wdCB0aGUgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgcmV0dXJuIGFycmF5KQotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0aGF0IHRlbGxzIHdoZXJlIHRoZSByZXN1bHRzIHNob3VsZCBiZSB3cml0dGVuCi0gICAgICogaW4gdGhlIHJldHVybiBhcnJheQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHVubm9ybWFsaXplZCBjb21wb25lbnRzCisgICAgICogQHBhcmFtIG5vcm1Db21wb25lbnRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2Ygbm9ybWFsaXplZCBjb21wb25lbnRzLgorICAgICAqIEBwYXJhbSBub3JtT2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHdoZXJlIHRoZSBjb21wb25lbnRzIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIGFycmF5CisgICAgICogICAgICAgICAgICBvZiBub3JtYWxpemVkIGNvbXBvbmVudHMuCisgICAgICogQHBhcmFtIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB3aGVyZSB0aGUgcmVzdWx0aW5nIHVubm9ybWFsaXplZCBjb21wb25lbnRzIGFyZQorICAgICAqICAgICAgICAgICAgd3JpdHRlbiAob3IgbnVsbCB0byBwcm9tcHQgdGhlIG1ldGhvZCB0byBjcmVhdGUgdGhlIHJldHVybgorICAgICAqICAgICAgICAgICAgYXJyYXkpLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgdGhhdCB0ZWxscyB3aGVyZSB0aGUgcmVzdWx0cyBzaG91bGQgYmUgd3JpdHRlbiBpbgorICAgICAqICAgICAgICAgICAgdGhlIHJldHVybiBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoZSB1bm5vcm1hbGl6ZWQgY29tcG9uZW50cy4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50W10gZ2V0VW5ub3JtYWxpemVkQ29tcG9uZW50cyhmbG9hdCBub3JtQ29tcG9uZW50c1tdLAotICAgICAgICAgICAgaW50IG5vcm1PZmZzZXQsIGludCBjb21wb25lbnRzW10sIGludCBvZmZzZXQpIHsKKyAgICBwdWJsaWMgaW50W10gZ2V0VW5ub3JtYWxpemVkQ29tcG9uZW50cyhmbG9hdCBub3JtQ29tcG9uZW50c1tdLCBpbnQgbm9ybU9mZnNldCwKKyAgICAgICAgICAgIGludCBjb21wb25lbnRzW10sIGludCBvZmZzZXQpIHsKIAogICAgICAgICBpZiAoYml0cyA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjZDPWJpdHMgaXMgbnVsbApAQCAtNTQ3LDcgKzU5NSw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAobm9ybUNvbXBvbmVudHMubGVuZ3RoIC0gbm9ybU9mZnNldCA8IG51bUNvbXBvbmVudHMpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yNzM9VGhlIGxlbmd0aCBvZiBub3JtQ29tcG9uZW50cyBtaW51cyBub3JtT2Zmc2V0IGlzIGxlc3MgdGhhbiBudW1Db21wb25lbnRzCisgICAgICAgICAgICAvLyBhd3QuMjczPVRoZSBsZW5ndGggb2Ygbm9ybUNvbXBvbmVudHMgbWludXMgbm9ybU9mZnNldCBpcyBsZXNzCisgICAgICAgICAgICAvLyB0aGFuIG51bUNvbXBvbmVudHMKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjczIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIApAQCAtNTU1LDcgKzYwNCw4IEBACiAgICAgICAgICAgICBjb21wb25lbnRzID0gbmV3IGludFtudW1Db21wb25lbnRzICsgb2Zmc2V0XTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChjb21wb25lbnRzLmxlbmd0aCAtIG9mZnNldCA8IG51bUNvbXBvbmVudHMpIHsKLSAgICAgICAgICAgICAgICAvLyBhd3QuMjcyPVRoZSBsZW5ndGggb2YgY29tcG9uZW50cyBtaW51cyBvZmZzZXQgaXMgbGVzcyB0aGFuIG51bUNvbXBvbmVudHMKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjcyPVRoZSBsZW5ndGggb2YgY29tcG9uZW50cyBtaW51cyBvZmZzZXQgaXMgbGVzcyB0aGFuCisgICAgICAgICAgICAgICAgLy8gbnVtQ29tcG9uZW50cwogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjcyIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTU2MywxNyArNjEzLDE1IEBACiAgICAgICAgIGlmIChoYXNBbHBoYSAmJiBpc0FscGhhUHJlbXVsdGlwbGllZCkgewogICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBub3JtQ29tcG9uZW50c1tub3JtT2Zmc2V0ICsgbnVtQ29sb3JDb21wb25lbnRzXTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sb3JDb21wb25lbnRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRzW29mZnNldCArIGldID0gKGludCkgKG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQgKyBpXQotICAgICAgICAgICAgICAgICAgICAgICAgKiBtYXhWYWx1ZXNbaV0gKiBhbHBoYSArIDAuNWYpOworICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbb2Zmc2V0ICsgaV0gPSAoaW50KShub3JtQ29tcG9uZW50c1tub3JtT2Zmc2V0ICsgaV0gKiBtYXhWYWx1ZXNbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICogYWxwaGEgKyAwLjVmKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbXBvbmVudHNbb2Zmc2V0ICsgbnVtQ29sb3JDb21wb25lbnRzXSA9Ci0gICAgICAgICAgICAgICAgKGludCkgKG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQgKyBudW1Db2xvckNvbXBvbmVudHNdICoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdICsgMC41Zik7CisgICAgICAgICAgICBjb21wb25lbnRzW29mZnNldCArIG51bUNvbG9yQ29tcG9uZW50c10gPSAoaW50KShub3JtQ29tcG9uZW50c1tub3JtT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICsgbnVtQ29sb3JDb21wb25lbnRzXQorICAgICAgICAgICAgICAgICAgICAqIG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdICsgMC41Zik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbb2Zmc2V0ICsgaV0gPQotICAgICAgICAgICAgICAgICAgICAoaW50KSAobm9ybUNvbXBvbmVudHNbbm9ybU9mZnNldCArIGldICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZXNbaV0gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzW29mZnNldCArIGldID0gKGludCkobm9ybUNvbXBvbmVudHNbbm9ybU9mZnNldCArIGldICogbWF4VmFsdWVzW2ldICsgMC41Zik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNTgzLDMwICs2MzEsMzIgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkYXRhIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgbm9ybWFsaXplZCBjb21wb25lbnRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBub3JtQ29tcG9uZW50cyB0aGUgbm9ybWFsaXplZCBjb21wb25lbnRzCi0gICAgICogQHBhcmFtIG5vcm1PZmZzZXQgdGhlIG9mZnNldCB3aGVyZSB0aGUgbm9ybWFsaXplZCBjb21wb25lbnRzIHNob3VsZAotICAgICAqIGJlIHJlYWQgZnJvbSB0aGUgbm9ybWFsaXplZCBjb21wb25lbnQgYXJyYXkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gbm9ybUNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBub3JtYWxpemVkIGNvbXBvbmVudHMuCisgICAgICogQHBhcmFtIG5vcm1PZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgd2hlcmUgdGhlIG5vcm1hbGl6ZWQgY29tcG9uZW50cyBzaG91bGQgYmUgcmVhZCBmcm9tCisgICAgICogICAgICAgICAgICB0aGUgbm9ybWFsaXplZCBjb21wb25lbnQgYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgZGF0YSBlbGVtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RGF0YUVsZW1lbnQoZmxvYXQgbm9ybUNvbXBvbmVudHNbXSwgaW50IG5vcm1PZmZzZXQpIHsKLSAgICAgICAgaW50IHVubm9ybUNvbXBvbmVudHNbXSA9IGdldFVubm9ybWFsaXplZENvbXBvbmVudHMobm9ybUNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgbm9ybU9mZnNldCwgbnVsbCwgMCk7CisgICAgICAgIGludCB1bm5vcm1Db21wb25lbnRzW10gPSBnZXRVbm5vcm1hbGl6ZWRDb21wb25lbnRzKG5vcm1Db21wb25lbnRzLCBub3JtT2Zmc2V0LCBudWxsLCAwKTsKICAgICAgICAgcmV0dXJuIGdldERhdGFFbGVtZW50KHVubm9ybUNvbXBvbmVudHMsIDApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRha2VzIGEgcGl4ZWwgd2hvc2UgZGF0YSBpcyBkZWZpbmVkIGJ5IGFuIGludCwgYW5kIHdyaXRlcyB0aGUgCi0gICAgICogY29ycmVzcG9uZGluZyBjb21wb25lbnRzIGludG8gdGhlIGNvbXBvbmVudHMgYXJyYXksIHN0YXJ0aW5nIAotICAgICAqIGZyb20gdGhlIGluZGV4IG9mZnNldC4KKyAgICAgKiBUYWtlcyBhIHBpeGVsIHdob3NlIGRhdGEgaXMgZGVmaW5lZCBieSBhbiBpbnRlZ2VyLCBhbmQgd3JpdGVzIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgY29tcG9uZW50cyBpbnRvIHRoZSBjb21wb25lbnRzIGFycmF5LCBzdGFydGluZyBmcm9tIHRoZQorICAgICAqIGluZGV4IG9mZnNldC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGl4ZWwgdGhlIHBpeGVsIGRhdGEKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50cyB0aGUgZGF0YSBhcnJheSB0byB3cml0ZSB0aGUgY29tcG9uZW50cyB0byAob3IKLSAgICAgKiBudWxsIHRvIGhhdmUgdGhlIG1ldGhvZCBjcmVhdGUgdGhlIHJldHVybiBhcnJheSkKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdGhhdCBkZXRlcm1pbmVzIHdoZXJlIHRoZSByZXN1bHRzIGFyZSAKLSAgICAgKiB3cml0dGVuIGluIHRoZSBjb21wb25lbnRzIGFycmF5Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgY29tcG9uZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwaXhlbAorICAgICAqIEBwYXJhbSBwaXhlbAorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsIGRhdGEuCisgICAgICogQHBhcmFtIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5IHRvIHdyaXRlIHRoZSBjb21wb25lbnRzIHRvIChvciBudWxsIHRvIGhhdmUgdGhlCisgICAgICogICAgICAgICAgICBtZXRob2QgY3JlYXRlIHRoZSByZXR1cm4gYXJyYXkpLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgdGhhdCBkZXRlcm1pbmVzIHdoZXJlIHRoZSByZXN1bHRzIGFyZSB3cml0dGVuIGluCisgICAgICogICAgICAgICAgICB0aGUgY29tcG9uZW50cyBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBjb21wb25lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBpeGVsLgogICAgICAqLwogICAgIHB1YmxpYyBpbnRbXSBnZXRDb21wb25lbnRzKGludCBwaXhlbCwgaW50IGNvbXBvbmVudHNbXSwgaW50IG9mZnNldCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgbWV0aG9kIGlzIG5vdCAiICsgLy8kTk9OLU5MUy0xJApAQCAtNjE2LDQ1ICs2NjYsNDUgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBwaXhlbCBkZXRlcm1pbmVkIGJ5IHRoZSBwaXhlbCBkYXRhLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwaXhlbCB0aGUgcGl4ZWwgZGF0YQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlZCBjb21wb25lbnQgb2YgdGhlIHBpeGVsCisgICAgICogQHBhcmFtIHBpeGVsCisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwuCisgICAgICogQHJldHVybiB0aGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gcGl4ZWwuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRSZWQoaW50IHBpeGVsKTsKIAogICAgIC8qKgotICAgICAqIFRha2VzIHRoZSBwaXhlbCBkYXRhIGFuZCByZXR1cm5zIHRoZSBpbnQgY29ycmVzcG9uZGluZyAKLSAgICAgKiB0byB0aGUgcGl4ZWwncyBjb2xvciBpbiBSR0IgZm9ybWF0LgorICAgICAqIFRha2VzIHRoZSBwaXhlbCBkYXRhIGFuZCByZXR1cm5zIHRoZSBpbnRlZ2VyIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICAgICogcGl4ZWwncyBjb2xvciBpbiBSR0IgZm9ybWF0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwaXhlbCB0aGUgcGl4ZWwgZGF0YQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgUkdCIGludAorICAgICAqIEBwYXJhbSBwaXhlbAorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsIGRhdGEuCisgICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBSR0IgaW50ZWdlciB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFJHQihpbnQgcGl4ZWwpIHsKLSAgICAgICAgcmV0dXJuIChnZXRBbHBoYShwaXhlbCkgPDwgMjQgfCBnZXRSZWQocGl4ZWwpIDw8IDE2Ci0gICAgICAgICAgICAgICAgfCBnZXRHcmVlbihwaXhlbCkgPDwgOCB8IGdldEJsdWUocGl4ZWwpKTsKKyAgICAgICAgcmV0dXJuIChnZXRBbHBoYShwaXhlbCkgPDwgMjQgfCBnZXRSZWQocGl4ZWwpIDw8IDE2IHwgZ2V0R3JlZW4ocGl4ZWwpIDw8IDggfCBnZXRCbHVlKHBpeGVsKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBwaXhlbCBkZXRlcm1pbmVkIGJ5IHRoZSBwaXhlbCBkYXRhLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwaXhlbCB0aGUgcGl4ZWwgZGF0YQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUgcGl4ZWwKKyAgICAgKiBAcGFyYW0gcGl4ZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBncmVlbiBjb21wb25lbnQgb2YgdGhlIGdpdmVuIHBpeGVsLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0R3JlZW4oaW50IHBpeGVsKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIGRlc2lyZWQgY29tcG9uZW50IG9mIHRoaXMgY29sb3IgbW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbXBvbmVudElkeCB0aGUgaW5kZXggdGhhdCBkZXRlcm1pbmVzIHdoaWNoIGNvbXBvbmVudCBzaXplIHRvIGdldAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbXBvbmVudCBzaXplIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGluZGV4Ci0gICAgICogCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGlzIGNvbG9yIG1vZGVsIGRvZXNuJ3Qgc3VwcG9ydAotICAgICAqIGFuIGFycmF5IG9mIHNlcGFyYXRlIGNvbXBvbmVudHMuCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG5lZ2F0aXZlIG9yCi0gICAgICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cworICAgICAqIEBwYXJhbSBjb21wb25lbnRJZHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCB0aGF0IGRldGVybWluZXMgd2hpY2ggY29tcG9uZW50IHNpemUgdG8gZ2V0LgorICAgICAqIEByZXR1cm4gdGhlIGNvbXBvbmVudCBzaXplIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGluZGV4LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGNvbG9yIG1vZGVsIGRvZXNuJ3Qgc3VwcG9ydCBhbiBhcnJheSBvZiBzZXBhcmF0ZQorICAgICAqICAgICAgICAgICAgIGNvbXBvbmVudHMuCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgaW5kZXggaXMgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZQorICAgICAqICAgICAgICAgICAgIG51bWJlciBvZiBjb21wb25lbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0Q29tcG9uZW50U2l6ZShpbnQgY29tcG9uZW50SWR4KSB7CiAgICAgICAgIGlmIChiaXRzID09IG51bGwpIHsKQEAgLTY2Myw3ICs3MTMsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGNvbXBvbmVudElkeCA8IDAgfHwgY29tcG9uZW50SWR4ID49IGJpdHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjc0PWNvbXBvbmVudElkeCBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBjb21wb25lbnRzIG9yIGxlc3MgdGhhbiB6ZXJvCisgICAgICAgICAgICAvLyBhd3QuMjc0PWNvbXBvbmVudElkeCBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBjb21wb25lbnRzIG9yCisgICAgICAgICAgICAvLyBsZXNzIHRoYW4gemVybwogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNzQiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCkBAIC02NzMsMjUgKzcyNCwyNSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBwaXhlbCBkZXRlcm1pbmVkIGJ5IHRoZSBwaXhlbCBkYXRhLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwaXhlbCB0aGUgcGl4ZWwKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBibHVlIGNvbXBvbmVudCBvZiB0aGUgcGl4ZWwKKyAgICAgKiBAcGFyYW0gcGl4ZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBibHVlIGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gcGl4ZWwuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRCbHVlKGludCBwaXhlbCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBhbHBoYSBjb21wb25lbnQgb2YgdGhlIHBpeGVsIGRldGVybWluZWQgYnkgdGhlIHBpeGVsIGRhdGEuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBpeGVsIHRoZSBwaXhlbAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFscGhhIGNvbXBvbmVudCBvZiB0aGUgcGl4ZWwKKyAgICAgKiBAcGFyYW0gcGl4ZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhbHBoYSBjb21wb25lbnQgb2YgdGhlIGdpdmVuIHBpeGVsLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QWxwaGEoaW50IHBpeGVsKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGFycmF5IG9mIHNpemVzIG9mIHRoZSBkaWZmZXJlbnQgY29tcG9uZW50cy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBzaXplcyBvZiB0aGUgZGlmZmVyZW50IGNvbXBvbmVudHMKKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBzaXplcyBvZiB0aGUgZGlmZmVyZW50IGNvbXBvbmVudHMuCiAgICAgICovCiAgICAgcHVibGljIGludFtdIGdldENvbXBvbmVudFNpemUoKSB7CiAgICAgICAgIGlmIChiaXRzICE9IG51bGwpIHsKQEAgLTcwMSw5ICs3NTIsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgYWxwaGEgY29tcG9uZW50IGlzIHByZW11bHRpcGxpZWQuCisgICAgICogQ2hlY2tzIGlmIHRoZSBhbHBoYSBjb21wb25lbnQgaXMgcHJlLW11bHRpcGxpZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgYWxwaGEgY29tcG9uZW50IGlzIHByZW11bHRpcGxpZWQKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBhbHBoYSBjb21wb25lbnQgaXMgcHJlLW11bHRpcGxpZWQuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQoKSB7CiAgICAgICAgIHJldHVybiBpc0FscGhhUHJlbXVsdGlwbGllZDsKQEAgLTcxMiw3ICs3NjMsNyBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIHRoaXMgY29sb3IgbW9kZWwgc3VwcG9ydHMgYWxwaGEuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIGNvbG9yIG1vZGVsIGhhcyBhbHBoYQorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBjb2xvciBtb2RlbCBoYXMgYWxwaGEuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQWxwaGEoKSB7CiAgICAgICAgIHJldHVybiBoYXNBbHBoYTsKQEAgLTc3NiwxMiArODI3LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHJhbnNmZXIgdHlwZSwgd2hpY2ggaXMgdGhlIHR5cGUgb2YgSmF2YSBwcmltaXRpdmUKLSAgICAgKiB2YWx1ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBiaXQgbGVuZ3RoIHBlciBwaXhlbDogZWl0aGVyIAotICAgICAqIHtAbGluayBEYXRhQnVmZmVyI1RZUEVfQllURX0sIHtAbGluayBEYXRhQnVmZmVyI1RZUEVfVVNIT1JUfSwgCisgICAgICogR2V0cyB0aGUgdHJhbnNmZXIgdHlwZSwgd2hpY2ggaXMgdGhlIHR5cGUgb2YgSmF2YSBwcmltaXRpdmUgdmFsdWUgdGhhdAorICAgICAqIGNvcnJlc3BvbmRzIHRvIHRoZSBiaXQgbGVuZ3RoIHBlciBwaXhlbDogZWl0aGVyCisgICAgICoge0BsaW5rIERhdGFCdWZmZXIjVFlQRV9CWVRFfSwge0BsaW5rIERhdGFCdWZmZXIjVFlQRV9VU0hPUlR9LAogICAgICAqIHtAbGluayBEYXRhQnVmZmVyI1RZUEVfSU5UfSwgb3Ige0BsaW5rIERhdGFCdWZmZXIjVFlQRV9VTkRFRklORUR9LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZmVyIHR5cGUKKyAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2ZlciB0eXBlLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VHJhbnNmZXJUeXBlKCkgewogICAgICAgICByZXR1cm4gdHJhbnNmZXJUeXBlOwpAQCAtNzkwLDcgKzg0MSw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgcGl4ZWwgc2l6ZSBpbiBiaXRzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBpeGVsIHNpemUKKyAgICAgKiBAcmV0dXJuIHRoZSBwaXhlbCBzaXplLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0UGl4ZWxTaXplKCkgewogICAgICAgICByZXR1cm4gcGl4ZWxfYml0czsKQEAgLTc5OSw3ICs4NTAsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIG9mIHRoaXMgY29sb3IgbW9kZWwuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cy4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE51bUNvbXBvbmVudHMoKSB7CiAgICAgICAgIHJldHVybiBudW1Db21wb25lbnRzOwpAQCAtODA4LDcgKzg1OSw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGNvbG9yIGNvbXBvbmVudHMgb2YgdGhpcyBjb2xvciBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgY29sb3IgY29tcG9uZW50cworICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBjb2xvciBjb21wb25lbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TnVtQ29sb3JDb21wb25lbnRzKCkgewogICAgICAgICByZXR1cm4gbnVtQ29sb3JDb21wb25lbnRzOwpAQCAtODE3LDEyICs4NjgsMTEgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IFJHQiBjb2xvciBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IFJHQiBjb2xvciBtb2RlbAorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgUkdCIGNvbG9yIG1vZGVsLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ29sb3JNb2RlbCBnZXRSR0JkZWZhdWx0KCkgewogICAgICAgICBpZiAoUkdCZGVmYXVsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBSR0JkZWZhdWx0ID0gbmV3IERpcmVjdENvbG9yTW9kZWwoMzIsIDB4MDBmZjAwMDAsIDB4MDAwMGZmMDAsCi0gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwZmYsIDB4ZmYwMDAwMDApOworICAgICAgICAgICAgUkdCZGVmYXVsdCA9IG5ldyBEaXJlY3RDb2xvck1vZGVsKDMyLCAweDAwZmYwMDAwLCAweDAwMDBmZjAwLCAweDAwMDAwMGZmLCAweGZmMDAwMDAwKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gUkdCZGVmYXVsdDsKICAgICB9CkBAIC04MzAsNjYgKzg4MCw2OSBAQAogICAgIC8qCiAgICAgICogQ29uc3RydWN0IElOVCBwaXhlbCByZXByZXNlbnRhdGlvbiBmcm9tIE9iamVjdAogICAgICAqIEBwYXJhbSBvYmoKLSAgICAgKgogICAgICAqIEByZXR1cm4KICAgICAgKi8KICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgcGl4ZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9iaiB0aGUgb2JqCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50CisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIG9iai4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgY29uc3RydWN0UGl4ZWwoT2JqZWN0IG9iaikgewogICAgICAgICBpbnQgcGl4ZWwgPSAwOwogCiAgICAgICAgIHN3aXRjaCAoZ2V0VHJhbnNmZXJUeXBlKCkpIHsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZVtdIGJQaXhlbCA9IChieXRlW10pIG9iajsKLSAgICAgICAgICAgIGlmKGJQaXhlbC5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjI3NT1UaGlzIHBpeGVsIHJlcHJlc2VudGF0aW9uIGlzIG5vdCBzdXVwb3J0ZWQgYnkgdGlzIENvbG9yIE1vZGVsCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3NSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGl4ZWwgPSBiUGl4ZWxbMF0gJiAweGZmOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGJ5dGVbXSBiUGl4ZWwgPSAoYnl0ZVtdKW9iajsKKyAgICAgICAgICAgICAgICBpZiAoYlBpeGVsLmxlbmd0aCA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXd0LjI3NT1UaGlzIHBpeGVsIHJlcHJlc2VudGF0aW9uIGlzIG5vdCBzdXVwb3J0ZWQgYnkgdGlzCisgICAgICAgICAgICAgICAgICAgIC8vIENvbG9yIE1vZGVsCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNzUiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGl4ZWwgPSBiUGl4ZWxbMF0gJiAweGZmOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIHNob3J0W10gc1BpeGVsID0gKHNob3J0W10pIG9iajsKLSAgICAgICAgICAgIGlmKHNQaXhlbC5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjI3NT1UaGlzIHBpeGVsIHJlcHJlc2VudGF0aW9uIGlzIG5vdCBzdXVwb3J0ZWQgYnkgdGlzIENvbG9yIE1vZGVsCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3NSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGl4ZWwgPSBzUGl4ZWxbMF0gJiAweGZmZmY7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydFtdIHNQaXhlbCA9IChzaG9ydFtdKW9iajsKKyAgICAgICAgICAgICAgICBpZiAoc1BpeGVsLmxlbmd0aCA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXd0LjI3NT1UaGlzIHBpeGVsIHJlcHJlc2VudGF0aW9uIGlzIG5vdCBzdXVwb3J0ZWQgYnkgdGlzCisgICAgICAgICAgICAgICAgICAgIC8vIENvbG9yIE1vZGVsCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNzUiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGl4ZWwgPSBzUGl4ZWxbMF0gJiAweGZmZmY7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgaW50W10gaVBpeGVsID0gKGludFtdKSBvYmo7Ci0gICAgICAgICAgICBpZihpUGl4ZWwubGVuZ3RoID4gMSkgewotICAgICAgICAgICAgICAgIC8vIGF3dC4yNzU9VGhpcyBwaXhlbCByZXByZXNlbnRhdGlvbiBpcyBub3Qgc3V1cG9ydGVkIGJ5IHRpcyBDb2xvciBNb2RlbAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNzUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBpeGVsID0gaVBpeGVsWzBdOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgaW50W10gaVBpeGVsID0gKGludFtdKW9iajsKKyAgICAgICAgICAgICAgICBpZiAoaVBpeGVsLmxlbmd0aCA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXd0LjI3NT1UaGlzIHBpeGVsIHJlcHJlc2VudGF0aW9uIGlzIG5vdCBzdXVwb3J0ZWQgYnkgdGlzCisgICAgICAgICAgICAgICAgICAgIC8vIENvbG9yIE1vZGVsCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNzUiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGl4ZWwgPSBpUGl4ZWxbMF07CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGF3dC4yMkQ9VGhpcyB0cmFuc2ZlclR5cGUgKCB7MH0gKSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29sb3IgbW9kZWwKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMkQiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlKSk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIGF3dC4yMkQ9VGhpcyB0cmFuc2ZlclR5cGUgKCB7MH0gKSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMKKyAgICAgICAgICAgICAgICAvLyBjb2xvciBtb2RlbAorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMkQiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlclR5cGUpKTsKIAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBwaXhlbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0cmFuc2ZlciB0eXBlLCB3aGljaCBpcyB0aGUgdHlwZSBvZiBKYXZhIHByaW1pdGl2ZQotICAgICAqIHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGJpdCBsZW5ndGggcGVyIHBpeGVsOiBlaXRoZXIgCi0gICAgICoge0BsaW5rIERhdGFCdWZmZXIjVFlQRV9CWVRFfSwge0BsaW5rIERhdGFCdWZmZXIjVFlQRV9VU0hPUlR9LCAKKyAgICAgKiBHZXRzIHRoZSB0cmFuc2ZlciB0eXBlLCB3aGljaCBpcyB0aGUgdHlwZSBvZiBKYXZhIHByaW1pdGl2ZSB2YWx1ZSB0aGF0CisgICAgICogY29ycmVzcG9uZHMgdG8gdGhlIGJpdCBsZW5ndGggcGVyIHBpeGVsOiBlaXRoZXIKKyAgICAgKiB7QGxpbmsgRGF0YUJ1ZmZlciNUWVBFX0JZVEV9LCB7QGxpbmsgRGF0YUJ1ZmZlciNUWVBFX1VTSE9SVH0sCiAgICAgICoge0BsaW5rIERhdGFCdWZmZXIjVFlQRV9JTlR9LCBvciB7QGxpbmsgRGF0YUJ1ZmZlciNUWVBFX1VOREVGSU5FRH0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGJpdHMgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcwotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZmVyIHR5cGUKKyAgICAgKiBAcGFyYW0gYml0cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcy4KKyAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2ZlciB0eXBlLgogICAgICAqLwogICAgIHN0YXRpYyBpbnQgZ2V0VHJhbnNmZXJUeXBlKGludCBiaXRzKSB7CiAgICAgICAgIGlmIChiaXRzIDw9IDgpIHsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9Db21wb25lbnRDb2xvck1vZGVsLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQ29tcG9uZW50Q29sb3JNb2RlbC5qYXZhCmluZGV4IGExNTJmNTUuLjQzMjhmZDMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9Db21wb25lbnRDb2xvck1vZGVsLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0NvbXBvbmVudENvbG9yTW9kZWwuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIGltcG9ydCBqYXZhLmF3dC5jb2xvci5Db2xvclNwYWNlOwpAQCAtMjYsMTU0ICsyNywyMDIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgQ29tcG9uZW50Q29sb3JNb2RlbCByZXByZXNlbnRzIGEgY29sb3IgbW9kZWwgdGhhdCBpcyBkZWZpbmVkIAotICogaW4gdGVybXMgb2YgaXRzIGNvbXBvbmVudHMuCisgKiBUaGUgQ2xhc3MgQ29tcG9uZW50Q29sb3JNb2RlbCByZXByZXNlbnRzIGEgY29sb3IgbW9kZWwgdGhhdCBpcyBkZWZpbmVkIGluCisgKiB0ZXJtcyBvZiBpdHMgY29tcG9uZW50cy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDb21wb25lbnRDb2xvck1vZGVsIGV4dGVuZHMgQ29sb3JNb2RlbCB7CiAKLSAgICAvKiogVGhlIHNpZ25lZC4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2lnbmVkOyAgIC8vIFBpeGVsIHNhbXBsZXMgYXJlIHNpZ25lZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbXBsZXMgd2l0aCBUcmFuc2ZlclR5cGUgRGF0YUJ1ZmZlci5UWVBFX0JZVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCBEYXRhQnVmZmVyLlRZUEVfSU5UIC0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnNpZ25lZC4gU2FtcGxlcyB3aXRoIG90aGVycyBUcmFuc2ZlclR5cGUgLSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25lZC4KKyAgICAvKioKKyAgICAgKiBUaGUgc2lnbmVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzaWduZWQ7IC8vIFBpeGVsIHNhbXBsZXMgYXJlIHNpZ25lZC4KIAotICAgIC8qKiBUaGUgaW50ZWdyYWwuICovCisgICAgLy8gU2FtcGxlcyB3aXRoIFRyYW5zZmVyVHlwZSBEYXRhQnVmZmVyLlRZUEVfQllURSwKKyAgICAvLyBEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCBEYXRhQnVmZmVyLlRZUEVfSU5UIC0KKyAgICAvLyB1bnNpZ25lZC4gU2FtcGxlcyB3aXRoIG90aGVycyBUcmFuc2ZlclR5cGUgLQorICAgIC8vIHNpZ25lZC4KKworICAgIC8qKgorICAgICAqIFRoZSBpbnRlZ3JhbC4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gaW50ZWdyYWw7IC8vIFBpeGVsIHNhbXBsZXMgYXJlIGludGVncmFsLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtcGxlcyB3aXRoIFRyYW5zZmVyVHlwZSBEYXRhQnVmZmVyLlRZUEVfQllURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIERhdGFCdWZmZXIuU2hvcnQgYW5kIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YUJ1ZmZlci5UWVBFX0lOVCAtIGludGVncmFsLgogCi0gICAgLyoqIFRoZSBzY2FsZSBmYWN0b3JzLiAqLwotICAgIHByaXZhdGUgZmxvYXQgc2NhbGVGYWN0b3JzW107IC8vIEFycmF5IG9mIGZhY3RvcnMgZm9yIHJlZHVjdGlvbiBjb21wb25lbnRzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlcyBpbnRvIHRoZSBmb3JtIHNjYWxlZCBmcm9tIDAgdG8gMjU1CisgICAgLy8gU2FtcGxlcyB3aXRoIFRyYW5zZmVyVHlwZSBEYXRhQnVmZmVyLlRZUEVfQllURSwKKyAgICAvLyBEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCBEYXRhQnVmZmVyLlNob3J0IGFuZAorICAgIC8vIERhdGFCdWZmZXIuVFlQRV9JTlQgLSBpbnRlZ3JhbC4KIAotICAgIC8qKiBUaGUgZG9ub3Qgc3VwcG9ydCB1bm5vcm1hbGl6ZWQuICovCisgICAgLyoqCisgICAgICogVGhlIHNjYWxlIGZhY3RvcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBzY2FsZUZhY3RvcnNbXTsgLy8gQXJyYXkgb2YgZmFjdG9ycyBmb3IgcmVkdWN0aW9uIGNvbXBvbmVudHMKKworICAgIC8vIHZhbHVlcyBpbnRvIHRoZSBmb3JtIHNjYWxlZCBmcm9tIDAgdG8gMjU1CisKKyAgICAvKioKKyAgICAgKiBUaGUgZG9ub3Qgc3VwcG9ydCB1bm5vcm1hbGl6ZWQuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGRvbm90U3VwcG9ydFVubm9ybWFsaXplZDsgLy8gVGhpcyBDb2xvciBNb2RlbCBkb24ndCBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5ub3Jtb2xpemVkIGZvcm0gCiAKLSAgICAvKiogVGhlIG5lZWQgYWxwaGEgZGl2aWRlLiAqLworICAgIC8vIHVubm9ybW9saXplZCBmb3JtCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmVlZCBhbHBoYSBkaXZpZGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIG5lZWRBbHBoYURpdmlkZTsgLy8gaGFzQWxwaGEgJiYgaXNBbHBoYVByZW11bHRpcGxpZWQKIAotICAgIC8qKiBUaGUgY2FsYyB2YWx1ZS4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY2FsY1ZhbHVlOyAgICAgICAvLyBWYWx1ZSB3YXMgY3VsY3VsYXRlZAorICAgIC8qKgorICAgICAqIFRoZSBjYWxjIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjYWxjVmFsdWU7IC8vIFZhbHVlIHdhcyBjdWxjdWxhdGVkCiAKLSAgICAvKiogVGhlIG5lZWQgc2NhbGUuICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG5lZWRTY2FsZTsgICAgICAgLy8gTm9ybWFsaXplZCB2YWx1ZSBuZWVkIHRvIHNjYWxlCisgICAgLyoqCisgICAgICogVGhlIG5lZWQgc2NhbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG5lZWRTY2FsZTsgLy8gTm9ybWFsaXplZCB2YWx1ZSBuZWVkIHRvIHNjYWxlCiAKLSAgICAvKiogVGhlIG1pbiB2YWxzLiAqLwotICAgIHByaXZhdGUgZmxvYXQgbWluVmFsc1tdOyAgICAgICAgIC8vIEFycmF5IG9mIE1pbiBub3JtYWxpemVkIHZhbHVlcworICAgIC8qKgorICAgICAqIFRoZSBtaW4gdmFscy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1pblZhbHNbXTsgLy8gQXJyYXkgb2YgTWluIG5vcm1hbGl6ZWQgdmFsdWVzCiAKLSAgICAvKiogVGhlIHJhbmdlcy4gKi8KLSAgICBwcml2YXRlIGZsb2F0IHJhbmdlc1tdOyAgICAgICAgICAvLyBBcnJheSBvZiByYW5nZSBub3JtYWxpemVkIHZhbHVlcyAgCisgICAgLyoqCisgICAgICogVGhlIHJhbmdlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IHJhbmdlc1tdOyAvLyBBcnJheSBvZiByYW5nZSBub3JtYWxpemVkIHZhbHVlcwogCi0gICAgLyoqIFRoZSBhbHBoYSBsdXQuICovCi0gICAgcHJpdmF0ZSBieXRlIGFscGhhTFVUW107ICAgICAgICAgLy8gTG9va3VwIHRhYmxlIGZvciBzY2FsZSBhbHBoYSB2YWx1ZQorICAgIC8qKgorICAgICAqIFRoZSBhbHBoYSBsdXQuCisgICAgICovCisgICAgcHJpdmF0ZSBieXRlIGFscGhhTFVUW107IC8vIExvb2t1cCB0YWJsZSBmb3Igc2NhbGUgYWxwaGEgdmFsdWUKIAotICAgIC8qKiBUaGUgY29sb3IgbHUgdHMuICovCi0gICAgcHJpdmF0ZSBieXRlIGNvbG9yTFVUc1tdW107ICAgICAgLy8gTG9va3VwIHRhYmxlcyBmb3Igc2NhbGUgY29sb3IgdmFsdWVzCisgICAgLyoqCisgICAgICogVGhlIGNvbG9yIGx1IHRzLgorICAgICAqLworICAgIHByaXZhdGUgYnl0ZSBjb2xvckxVVHNbXVtdOyAvLyBMb29rdXAgdGFibGVzIGZvciBzY2FsZSBjb2xvciB2YWx1ZXMKIAotICAgIC8qKiBUaGUgZnJvbV8gbGluZWEgcl8gcmcgYl8gbHV0LiAqLwotICAgIHByaXZhdGUgYnl0ZSBmcm9tX0xJTkVBUl9SR0JfTFVUW107ICAvLyBMb29rdXAgdGFibGUgZm9yIGNvbnZlcnNpb24gZnJvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMaW5lYXIgUkdCIENvbG9yIFNwYWNlIGludG8gc1JHQgorICAgIC8qKgorICAgICAqIFRoZSBmcm9tXyBsaW5lYSByXyByZyBiXyBsdXQuCisgICAgICovCisgICAgcHJpdmF0ZSBieXRlIGZyb21fTElORUFSX1JHQl9MVVRbXTsgLy8gTG9va3VwIHRhYmxlIGZvciBjb252ZXJzaW9uIGZyb20KIAotICAgIC8qKiBUaGUgdG9fIGxpbmVhIHJfOCByZyBiXyBsdXQuICovCi0gICAgcHJpdmF0ZSBieXRlIHRvX0xJTkVBUl84UkdCX0xVVFtdOyAgIC8vIExvb2t1cCB0YWJsZSBmb3IgY29udmVyc2lvbiBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNSR0IgQ29sb3IgU3BhY2UgaW50byBMaW5lYXIgUkdCIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA4IGJpdCAKKyAgICAvLyBMaW5lYXIgUkdCIENvbG9yIFNwYWNlIGludG8gc1JHQgogCi0gICAgLyoqIFRoZSB0b18gbGluZWEgcl8xNiByZyBiXyBsdXQuICovCisgICAgLyoqCisgICAgICogVGhlIHRvXyBsaW5lYSByXzggcmcgYl8gbHV0LgorICAgICAqLworICAgIHByaXZhdGUgYnl0ZSB0b19MSU5FQVJfOFJHQl9MVVRbXTsgLy8gTG9va3VwIHRhYmxlIGZvciBjb252ZXJzaW9uIGZyb20KKworICAgIC8vIHNSR0IgQ29sb3IgU3BhY2UgaW50byBMaW5lYXIgUkdCCisgICAgLy8gOCBiaXQKKworICAgIC8qKgorICAgICAqIFRoZSB0b18gbGluZWEgcl8xNiByZyBiXyBsdXQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzaG9ydCB0b19MSU5FQVJfMTZSR0JfTFVUW107IC8vIExvb2t1cCB0YWJsZSBmb3IgY29udmVyc2lvbiBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNSR0IgQ29sb3IgU3BhY2UgaW50byBMaW5lYXIgUkdCIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxNiBiaXQgCiAKLSAgICAvKiogVGhlIExJTkVBIHJfIHJnIGJfIGxlbmd0aC4gKi8KLSAgICBwcml2YXRlIGludCBMSU5FQVJfUkdCX0xlbmd0aDsgICAgICAgLy8gTGluZWFyIFJHQiBiaXQgbGVuZ3RoCisgICAgLy8gc1JHQiBDb2xvciBTcGFjZSBpbnRvIExpbmVhciBSR0IKKyAgICAvLyAxNiBiaXQKIAotICAgIC8qKiBUaGUgZmFjdG9yLiAqLwotICAgIHByaXZhdGUgZmxvYXQgZkZhY3RvcjsgICAgICAgICAgICAgICAvLyBTY2FsZSBmYWN0b3IKKyAgICAvKioKKyAgICAgKiBUaGUgTElORUEgcl8gcmcgYl8gbGVuZ3RoLgorICAgICAqLworICAgIHByaXZhdGUgaW50IExJTkVBUl9SR0JfTGVuZ3RoOyAvLyBMaW5lYXIgUkdCIGJpdCBsZW5ndGgKIAotICAgIC8qKiBUaGUgaXNfcyByZ2IuICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzX3NSR0I7ICAgICAgICAgICAgIC8vIENvbG9yTW9kZWwgaGFzIHNSR0IgQ29sb3JTcGFjZSAgCisgICAgLyoqCisgICAgICogVGhlIGZhY3Rvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGZGYWN0b3I7IC8vIFNjYWxlIGZhY3RvcgogCi0gICAgLyoqIFRoZSBpc18gbGluZWEgcl8gcmdiLiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc19MSU5FQVJfUkdCOyAgICAgICAvLyBDb2xvciBNb2RlbCBoYXMgTGluZWFyIFJHQiBDb2xvciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3BhY2UgCisgICAgLyoqCisgICAgICogVGhlIGlzX3MgcmdiLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc19zUkdCOyAvLyBDb2xvck1vZGVsIGhhcyBzUkdCIENvbG9yU3BhY2UKKworICAgIC8qKgorICAgICAqIFRoZSBpc18gbGluZWEgcl8gcmdiLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc19MSU5FQVJfUkdCOyAvLyBDb2xvciBNb2RlbCBoYXMgTGluZWFyIFJHQiBDb2xvcgorCisgICAgLy8gU3BhY2UKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBjb21wb25lbnQgY29sb3IgbW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yU3BhY2UgdGhlIGNvbG9yIHNwYWNlCi0gICAgICogQHBhcmFtIGJpdHMgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcwotICAgICAqIEBwYXJhbSBoYXNBbHBoYSB3aGV0aGVyIHRoZSBjb2xvciBtb2RlbCBoYXMgYWxwaGEKLSAgICAgKiBAcGFyYW0gaXNBbHBoYVByZW11bHRpcGxpZWQgd2hldGhlciB0aGUgYWxwaGEgaXMgcHJlbXVsdGlwbGllZAotICAgICAqIEBwYXJhbSB0cmFuc3BhcmVuY3kgdGhlIHRyYW5zcGFyZW5jeSBzdHJhdGVneSwgQHNlZSBqYXZhLmF3dC5UcmFuc3BhcmVuY3kKLSAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlIHRoZSB0cmFuc2ZlciB0eXBlIChwcmltaXRpdmUgamF2YSB0eXBlIAotICAgICAqIHRvIHVzZSBmb3IgdGhlIGNvbXBvbmVudHMpCisgICAgICogQHBhcmFtIGNvbG9yU3BhY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xvciBzcGFjZS4KKyAgICAgKiBAcGFyYW0gYml0cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcy4KKyAgICAgKiBAcGFyYW0gaGFzQWxwaGEKKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGNvbG9yIG1vZGVsIGhhcyBhbHBoYS4KKyAgICAgKiBAcGFyYW0gaXNBbHBoYVByZW11bHRpcGxpZWQKKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGFscGhhIGlzIHByZS1tdWx0aXBsaWVkLgorICAgICAqIEBwYXJhbSB0cmFuc3BhcmVuY3kKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc3BhcmVuY3kgc3RyYXRlZ3ksIEBzZWUgamF2YS5hd3QuVHJhbnNwYXJlbmN5LgorICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc2ZlciB0eXBlIChwcmltaXRpdmUgamF2YSB0eXBlIHRvIHVzZSBmb3IgdGhlCisgICAgICogICAgICAgICAgICBjb21wb25lbnRzKS4KICAgICAgKi8KLSAgICAgcHVibGljIENvbXBvbmVudENvbG9yTW9kZWwoQ29sb3JTcGFjZSBjb2xvclNwYWNlLCBpbnQgYml0c1tdLAotICAgICAgICAgICAgYm9vbGVhbiBoYXNBbHBoYSwgYm9vbGVhbiBpc0FscGhhUHJlbXVsdGlwbGllZCwgaW50IHRyYW5zcGFyZW5jeSwKLSAgICAgICAgICAgIGludCB0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgc3VwZXIoY3JlYXRlUGl4ZWxCaXRzKGNvbG9yU3BhY2UsIGhhc0FscGhhLCB0cmFuc2ZlclR5cGUpLAotICAgICAgICAgICAgICAgIHZhbGlkYXRlQml0cyhiaXRzLCBjb2xvclNwYWNlLCBoYXNBbHBoYSwgdHJhbnNmZXJUeXBlKSwKLSAgICAgICAgICAgICAgICBjb2xvclNwYWNlLCBoYXNBbHBoYSwgaXNBbHBoYVByZW11bHRpcGxpZWQsIHRyYW5zcGFyZW5jeSwKKyAgICBwdWJsaWMgQ29tcG9uZW50Q29sb3JNb2RlbChDb2xvclNwYWNlIGNvbG9yU3BhY2UsIGludCBiaXRzW10sIGJvb2xlYW4gaGFzQWxwaGEsCisgICAgICAgICAgICBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkLCBpbnQgdHJhbnNwYXJlbmN5LCBpbnQgdHJhbnNmZXJUeXBlKSB7CisgICAgICAgIHN1cGVyKGNyZWF0ZVBpeGVsQml0cyhjb2xvclNwYWNlLCBoYXNBbHBoYSwgdHJhbnNmZXJUeXBlKSwgdmFsaWRhdGVCaXRzKGJpdHMsIGNvbG9yU3BhY2UsCisgICAgICAgICAgICAgICAgaGFzQWxwaGEsIHRyYW5zZmVyVHlwZSksIGNvbG9yU3BhY2UsIGhhc0FscGhhLCBpc0FscGhhUHJlbXVsdGlwbGllZCwgdHJhbnNwYXJlbmN5LAogICAgICAgICAgICAgICAgIHRyYW5zZmVyVHlwZSk7CiAKICAgICAgICAgbmVlZFNjYWxlID0gZmFsc2U7CiAgICAgICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgc2lnbmVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnRlZ3JhbCA9IHRydWU7Ci0gICAgICAgICAgICBkb25vdFN1cHBvcnRVbm5vcm1hbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHNjYWxlRmFjdG9ycyA9IG5ldyBmbG9hdFtudW1Db21wb25lbnRzXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sb3JDb21wb25lbnRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzY2FsZUZhY3RvcnNbaV0gPSAxLjBmIC8gbWF4VmFsdWVzW2ldOwotICAgICAgICAgICAgICAgIGlmIChjcy5nZXRNaW5WYWx1ZShpKSAhPSAwLjBmIHx8IGNzLmdldE1heFZhbHVlKGkpICE9IDEuMGYpIHsKLSAgICAgICAgICAgICAgICAgICAgZG9ub3RTdXBwb3J0VW5ub3JtYWxpemVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaGFzQWxwaGEpIHsKLSAgICAgICAgICAgICAgICBtYXhWYWx1ZXNbbnVtQ29sb3JDb21wb25lbnRzXSA9Ci0gICAgICAgICAgICAgICAgICAgICgxIDw8IGJpdHNbbnVtQ29sb3JDb21wb25lbnRzXSkgLSAxOwotICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yc1tudW1Db2xvckNvbXBvbmVudHNdID0KLSAgICAgICAgICAgICAgICAgICAgMS4wZiAvIG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOgotICAgICAgICAgICAgc2lnbmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGludGVncmFsID0gdHJ1ZTsKLSAgICAgICAgICAgIGRvbm90U3VwcG9ydFVubm9ybWFsaXplZCA9IHRydWU7Ci0gICAgICAgICAgICBzY2FsZUZhY3RvcnMgPSBuZXcgZmxvYXRbbnVtQ29tcG9uZW50c107Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKykgewotICAgICAgICAgICAgICAgIG1heFZhbHVlc1tpXSA9IFNob3J0Lk1BWF9WQUxVRTsKLSAgICAgICAgICAgICAgICBzY2FsZUZhY3RvcnNbaV0gPSAxLjBmIC8gbWF4VmFsdWVzW2ldOwotICAgICAgICAgICAgICAgIGlmIChjcy5nZXRNaW5WYWx1ZShpKSAhPSAwLjBmIHx8IGNzLmdldE1heFZhbHVlKGkpICE9IDEuMGYpIHsKLSAgICAgICAgICAgICAgICAgICAgbmVlZFNjYWxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobmVlZFNjYWxlKSB7Ci0gICAgICAgICAgICAgICAgbWluVmFscyA9IG5ldyBmbG9hdFtudW1Db2xvckNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgIHJhbmdlcyA9IG5ldyBmbG9hdFtudW1Db2xvckNvbXBvbmVudHNdOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBzaWduZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpbnRlZ3JhbCA9IHRydWU7CisgICAgICAgICAgICAgICAgZG9ub3RTdXBwb3J0VW5ub3JtYWxpemVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JzID0gbmV3IGZsb2F0W251bUNvbXBvbmVudHNdOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sb3JDb21wb25lbnRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbWluVmFsc1tpXSA9IGNzLmdldE1pblZhbHVlKGkpOwotICAgICAgICAgICAgICAgICAgICByYW5nZXNbaV0gPSBjcy5nZXRNYXhWYWx1ZShpKSAtIG1pblZhbHNbaV07CisgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yc1tpXSA9IDEuMGYgLyBtYXhWYWx1ZXNbaV07CisgICAgICAgICAgICAgICAgICAgIGlmIChjcy5nZXRNaW5WYWx1ZShpKSAhPSAwLjBmIHx8IGNzLmdldE1heFZhbHVlKGkpICE9IDEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbm90U3VwcG9ydFVubm9ybWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRkxPQVQ6Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKLSAgICAgICAgICAgIHNpZ25lZCA9IHRydWU7Ci0gICAgICAgICAgICBpbnRlZ3JhbCA9IGZhbHNlOwotICAgICAgICAgICAgZG9ub3RTdXBwb3J0VW5ub3JtYWxpemVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYXd0LjIxNT10cmFuc2ZlclR5cGUgaXMgbm90IG9uZSBvZiBEYXRhQnVmZmVyLlRZUEVfQllURSwKLSAgICAgICAgICAgIC8vICAgICAgICAgIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIERhdGFCdWZmZXIuVFlQRV9JTlQsCi0gICAgICAgICAgICAvLyAgICAgICAgICBEYXRhQnVmZmVyLlRZUEVfU0hPUlQsIERhdGFCdWZmZXIuVFlQRV9GTE9BVCwgb3IKLSAgICAgICAgICAgIC8vICAgICAgICAgIERhdGFCdWZmZXIuVFlQRV9ET1VCTEUKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE1IikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgaWYgKGhhc0FscGhhKSB7CisgICAgICAgICAgICAgICAgICAgIG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdID0gKDEgPDwgYml0c1tudW1Db2xvckNvbXBvbmVudHNdKSAtIDE7CisgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yc1tudW1Db2xvckNvbXBvbmVudHNdID0gMS4wZiAvIG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOgorICAgICAgICAgICAgICAgIHNpZ25lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgaW50ZWdyYWwgPSB0cnVlOworICAgICAgICAgICAgICAgIGRvbm90U3VwcG9ydFVubm9ybWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JzID0gbmV3IGZsb2F0W251bUNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG1heFZhbHVlc1tpXSA9IFNob3J0Lk1BWF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JzW2ldID0gMS4wZiAvIG1heFZhbHVlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNzLmdldE1pblZhbHVlKGkpICE9IDAuMGYgfHwgY3MuZ2V0TWF4VmFsdWUoaSkgIT0gMS4wZikgeworICAgICAgICAgICAgICAgICAgICAgICAgbmVlZFNjYWxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobmVlZFNjYWxlKSB7CisgICAgICAgICAgICAgICAgICAgIG1pblZhbHMgPSBuZXcgZmxvYXRbbnVtQ29sb3JDb21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgcmFuZ2VzID0gbmV3IGZsb2F0W251bUNvbG9yQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sb3JDb21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pblZhbHNbaV0gPSBjcy5nZXRNaW5WYWx1ZShpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlc1tpXSA9IGNzLmdldE1heFZhbHVlKGkpIC0gbWluVmFsc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIHNpZ25lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgaW50ZWdyYWwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBkb25vdFN1cHBvcnRVbm5vcm1hbGl6ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjE1PXRyYW5zZmVyVHlwZSBpcyBub3Qgb25lIG9mIERhdGFCdWZmZXIuVFlQRV9CWVRFLAorICAgICAgICAgICAgICAgIC8vIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIERhdGFCdWZmZXIuVFlQRV9JTlQsCisgICAgICAgICAgICAgICAgLy8gRGF0YUJ1ZmZlci5UWVBFX1NIT1JULCBEYXRhQnVmZmVyLlRZUEVfRkxPQVQsIG9yCisgICAgICAgICAgICAgICAgLy8gRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE1IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAogICAgICAgICBuZWVkQWxwaGFEaXZpZGUgPSBoYXNBbHBoYSAmJiBpc0FscGhhUHJlbXVsdGlwbGllZDsKQEAgLTE4MywzNiArMjMyLDQwIEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGNvbXBvbmVudCBjb2xvciBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3JTcGFjZSB0aGUgY29sb3Igc3BhY2UKLSAgICAgKiBAcGFyYW0gaGFzQWxwaGEgd2hldGhlciB0aGUgY29sb3IgbW9kZWwgaGFzIGFscGhhCi0gICAgICogQHBhcmFtIGlzQWxwaGFQcmVtdWx0aXBsaWVkIHdoZXRoZXIgdGhlIGFscGhhIGlzIHByZW11bHRpcGxpZWQKLSAgICAgKiBAcGFyYW0gdHJhbnNwYXJlbmN5IHRoZSB0cmFuc3BhcmVuY3kgc3RyYXRlZ3ksIEBzZWUgamF2YS5hd3QuVHJhbnNwYXJlbmN5Ci0gICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZSB0aGUgdHJhbnNmZXIgdHlwZSAocHJpbWl0aXZlIGphdmEgdHlwZSAKLSAgICAgKiB0byB1c2UgZm9yIHRoZSBjb21wb25lbnRzKQorICAgICAqIEBwYXJhbSBjb2xvclNwYWNlCisgICAgICogICAgICAgICAgICB0aGUgY29sb3Igc3BhY2UuCisgICAgICogQHBhcmFtIGhhc0FscGhhCisgICAgICogICAgICAgICAgICB3aGV0aGVyIHRoZSBjb2xvciBtb2RlbCBoYXMgYWxwaGEuCisgICAgICogQHBhcmFtIGlzQWxwaGFQcmVtdWx0aXBsaWVkCisgICAgICogICAgICAgICAgICB3aGV0aGVyIHRoZSBhbHBoYSBpcyBwcmUtbXVsdGlwbGllZC4KKyAgICAgKiBAcGFyYW0gdHJhbnNwYXJlbmN5CisgICAgICogICAgICAgICAgICB0aGUgdHJhbnNwYXJlbmN5IHN0cmF0ZWd5LCBAc2VlIGphdmEuYXd0LlRyYW5zcGFyZW5jeS4KKyAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlCisgICAgICogICAgICAgICAgICB0aGUgdHJhbnNmZXIgdHlwZSAocHJpbWl0aXZlIGphdmEgdHlwZSB0byB1c2UgZm9yIHRoZQorICAgICAqICAgICAgICAgICAgY29tcG9uZW50cykuCiAgICAgICovCiAgICAgcHVibGljIENvbXBvbmVudENvbG9yTW9kZWwoQ29sb3JTcGFjZSBjb2xvclNwYWNlLCBib29sZWFuIGhhc0FscGhhLAogICAgICAgICAgICAgYm9vbGVhbiBpc0FscGhhUHJlbXVsdGlwbGllZCwgaW50IHRyYW5zcGFyZW5jeSwgaW50IHRyYW5zZmVyVHlwZSkgewotICAgICAgICAKLSAgICAgICAgdGhpcyhjb2xvclNwYWNlLCAKLSAgICAgICAgICAgICAgICBjcmVhdGVQaXhlbEJpdHNBcnJheShjb2xvclNwYWNlLCBoYXNBbHBoYSwgdHJhbnNmZXJUeXBlKSwgCi0gICAgICAgICAgICAgICAgaGFzQWxwaGEsIAotICAgICAgICAgICAgICAgIGlzQWxwaGFQcmVtdWx0aXBsaWVkLCAKLSAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3ksCi0gICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlKTsKKworICAgICAgICB0aGlzKGNvbG9yU3BhY2UsIGNyZWF0ZVBpeGVsQml0c0FycmF5KGNvbG9yU3BhY2UsIGhhc0FscGhhLCB0cmFuc2ZlclR5cGUpLCBoYXNBbHBoYSwKKyAgICAgICAgICAgICAgICBpc0FscGhhUHJlbXVsdGlwbGllZCwgdHJhbnNwYXJlbmN5LCB0cmFuc2ZlclR5cGUpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFZhbGlkYXRlIGJpdHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJpdHMgdGhlIGJpdHMKLSAgICAgKiBAcGFyYW0gY29sb3JTcGFjZSB0aGUgY29sb3Igc3BhY2UKLSAgICAgKiBAcGFyYW0gaGFzQWxwaGEgdGhlIGhhcyBhbHBoYQotICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUgdGhlIHRyYW5zZmVyIHR5cGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnRbXQorICAgICAqIEBwYXJhbSBiaXRzCisgICAgICogICAgICAgICAgICB0aGUgYml0cy4KKyAgICAgKiBAcGFyYW0gY29sb3JTcGFjZQorICAgICAqICAgICAgICAgICAgdGhlIGNvbG9yIHNwYWNlLgorICAgICAqIEBwYXJhbSBoYXNBbHBoYQorICAgICAqICAgICAgICAgICAgdGhlIGhhcyBhbHBoYS4KKyAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlCisgICAgICogICAgICAgICAgICB0aGUgdHJhbnNmZXIgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRbXS4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSB2YWxpZGF0ZUJpdHMoaW50IGJpdHNbXSwgQ29sb3JTcGFjZSBjb2xvclNwYWNlLAotICAgICAgICAgICAgYm9vbGVhbiBoYXNBbHBoYSwgaW50IHRyYW5zZmVyVHlwZSkgeworICAgIHByaXZhdGUgc3RhdGljIGludFtdIHZhbGlkYXRlQml0cyhpbnQgYml0c1tdLCBDb2xvclNwYWNlIGNvbG9yU3BhY2UsIGJvb2xlYW4gaGFzQWxwaGEsCisgICAgICAgICAgICBpbnQgdHJhbnNmZXJUeXBlKSB7CiAgICAgICAgIGlmIChiaXRzICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBiaXRzOwogICAgICAgICB9CkBAIC0yMzUsMTQgKzI4OCwxNSBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgdGhlIHBpeGVsIGJpdHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yU3BhY2UgdGhlIGNvbG9yIHNwYWNlCi0gICAgICogQHBhcmFtIGhhc0FscGhhIHRoZSBoYXMgYWxwaGEKLSAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlIHRoZSB0cmFuc2ZlciB0eXBlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50CisgICAgICogQHBhcmFtIGNvbG9yU3BhY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xvciBzcGFjZS4KKyAgICAgKiBAcGFyYW0gaGFzQWxwaGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBoYXMgYWxwaGEuCisgICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zZmVyIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgaW50LgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBjcmVhdGVQaXhlbEJpdHMoQ29sb3JTcGFjZSBjb2xvclNwYWNlLCBib29sZWFuIGhhc0FscGhhLAotICAgICAgICAgICAgaW50IHRyYW5zZmVyVHlwZSkgeworICAgIHByaXZhdGUgc3RhdGljIGludCBjcmVhdGVQaXhlbEJpdHMoQ29sb3JTcGFjZSBjb2xvclNwYWNlLCBib29sZWFuIGhhc0FscGhhLCBpbnQgdHJhbnNmZXJUeXBlKSB7CiAgICAgICAgIGludCBudW1Db21wb25lbnRzID0gY29sb3JTcGFjZS5nZXROdW1Db21wb25lbnRzKCk7CiAgICAgICAgIGlmIChoYXNBbHBoYSkgewogICAgICAgICAgICAgbnVtQ29tcG9uZW50cysrOwpAQCAtMjU0LDIyICszMDgsMjQgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIHRoZSBwaXhlbCBiaXRzIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xvclNwYWNlIHRoZSBjb2xvciBzcGFjZQotICAgICAqIEBwYXJhbSBoYXNBbHBoYSB0aGUgaGFzIGFscGhhCi0gICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZSB0aGUgdHJhbnNmZXIgdHlwZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludFtdCisgICAgICogQHBhcmFtIGNvbG9yU3BhY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xvciBzcGFjZS4KKyAgICAgKiBAcGFyYW0gaGFzQWxwaGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBoYXMgYWxwaGEuCisgICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zZmVyIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgaW50W10uCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gY3JlYXRlUGl4ZWxCaXRzQXJyYXkoQ29sb3JTcGFjZSBjb2xvclNwYWNlLCAKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzQWxwaGEsIGludCB0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gY3JlYXRlUGl4ZWxCaXRzQXJyYXkoQ29sb3JTcGFjZSBjb2xvclNwYWNlLCBib29sZWFuIGhhc0FscGhhLAorICAgICAgICAgICAgaW50IHRyYW5zZmVyVHlwZSkgeworCiAgICAgICAgIGludCBudW1Db21wb25lbnRzID0gY29sb3JTcGFjZS5nZXROdW1Db21wb25lbnRzKCk7CiAgICAgICAgIGlmIChoYXNBbHBoYSkgewogICAgICAgICAgICAgbnVtQ29tcG9uZW50cysrOwogICAgICAgICB9CiAKICAgICAgICAgaW50IGJpdHNbXSA9IG5ldyBpbnRbbnVtQ29tcG9uZW50c107Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1Db21wb25lbnRzOyBpKyspeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKykgewogICAgICAgICAgICAgYml0c1tpXSA9IERhdGFCdWZmZXIuZ2V0RGF0YVR5cGVTaXplKHRyYW5zZmVyVHlwZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGJpdHM7CkBAIC0yNzgsMjE3ICszMzQsMjAwIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBnZXREYXRhRWxlbWVudHMoaW50IGNvbXBvbmVudHNbXSwgaW50IG9mZnNldCwgT2JqZWN0IG9iaikgewogICAgICAgICBpZiAoZG9ub3RTdXBwb3J0VW5ub3JtYWxpemVkKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjEzPVRoaXMgQ29tcG9uZW50Q29sb3JNb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSB1bm5vcm1hbGl6ZWQgZm9ybQorICAgICAgICAgICAgLy8gYXd0LjIxMz1UaGlzIENvbXBvbmVudENvbG9yTW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUKKyAgICAgICAgICAgIC8vIHVubm9ybWFsaXplZCBmb3JtCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxMyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKICAgICAgICAgaWYgKG9mZnNldCArIG51bUNvbXBvbmVudHMgPiBjb21wb25lbnRzLmxlbmd0aCkgewotICAgICAgICAgICAgLy8gYXd0LjIxNj1UaGUgY29tcG9uZW50cyBhcnJheSBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHRoZSBjb2xvciBhbmQgYWxwaGEgY29tcG9uZW50cworICAgICAgICAgICAgLy8gYXd0LjIxNj1UaGUgY29tcG9uZW50cyBhcnJheSBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHRoZQorICAgICAgICAgICAgLy8gY29sb3IgYW5kIGFscGhhIGNvbXBvbmVudHMKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE2IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAogICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZSBiYVtdOwotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYmEgPSBuZXcgYnl0ZVtudW1Db21wb25lbnRzXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmEgPSAoYnl0ZVtdKSBvYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gb2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsgaSsrLCBpZHgrKykgewotICAgICAgICAgICAgICAgIGJhW2ldID0gKGJ5dGUpIGNvbXBvbmVudHNbaWR4XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBiYTsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgc2hvcnQgc2FbXTsKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNhID0gbmV3IHNob3J0W251bUNvbXBvbmVudHNdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYSA9IChzaG9ydFtdKSBvYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gb2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsgaSsrLCBpZHgrKykgewotICAgICAgICAgICAgICAgIHNhW2ldID0gKHNob3J0KSBjb21wb25lbnRzW2lkeF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2E7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGludCBpYVtdOwotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWEgPSBuZXcgaW50W251bUNvbXBvbmVudHNdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpYSA9IChpbnRbXSkgb2JqOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKLSAgICAgICAgICAgICAgICBpYVtpXSA9IGNvbXBvbmVudHNbaWR4XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpYTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGF3dC4yMTc9VGhlIHRyYW5zZmVyIHR5cGUgb2YgdGhpcyBDb21wb25lbnRDb2xvck1vZGVsIGlzIG5vdCBvbmUKLSAgICAgICAgICAgIC8vICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdHJhbnNmZXIgdHlwZXM6IERhdGFCdWZmZXIuVFlQRV9CWVRFLAotICAgICAgICAgICAgLy8gICAgICAgICAgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwgb3IgRGF0YUJ1ZmZlci5UWVBFX0lOVAotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoImF3dC4yMTciKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgYnl0ZSBiYVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBiYSA9IG5ldyBieXRlW251bUNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJhID0gKGJ5dGVbXSlvYmo7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBvZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJhW2ldID0gKGJ5dGUpY29tcG9uZW50c1tpZHhdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gYmE7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgc2hvcnQgc2FbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2EgPSBuZXcgc2hvcnRbbnVtQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2EgPSAoc2hvcnRbXSlvYmo7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBvZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNhW2ldID0gKHNob3J0KWNvbXBvbmVudHNbaWR4XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGludCBpYVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpYSA9IG5ldyBpbnRbbnVtQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWEgPSAoaW50W10pb2JqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gb2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsgaSsrLCBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICBpYVtpXSA9IGNvbXBvbmVudHNbaWR4XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGlhOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjE3PVRoZSB0cmFuc2ZlciB0eXBlIG9mIHRoaXMgQ29tcG9uZW50Q29sb3JNb2RlbCBpcyBub3QKKyAgICAgICAgICAgICAgICAvLyBvbmUKKyAgICAgICAgICAgICAgICAvLyBvZiB0aGUgZm9sbG93aW5nIHRyYW5zZmVyIHR5cGVzOiBEYXRhQnVmZmVyLlRZUEVfQllURSwKKyAgICAgICAgICAgICAgICAvLyBEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCBvciBEYXRhQnVmZmVyLlRZUEVfSU5UCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxNyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXREYXRhRWxlbWVudHMoZmxvYXQgbm9ybUNvbXBvbmVudHNbXSwgaW50IG5vcm1PZmZzZXQsCi0gICAgICAgICAgICBPYmplY3Qgb2JqKSB7CisgICAgcHVibGljIE9iamVjdCBnZXREYXRhRWxlbWVudHMoZmxvYXQgbm9ybUNvbXBvbmVudHNbXSwgaW50IG5vcm1PZmZzZXQsIE9iamVjdCBvYmopIHsKICAgICAgICAgaWYgKG5lZWRTY2FsZSkgewogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IDA7IGkgPCBudW1Db2xvckNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKLSAgICAgICAgICAgICAgICBub3JtQ29tcG9uZW50c1tpZHhdID0KLSAgICAgICAgICAgICAgICAgICAgKG5vcm1Db21wb25lbnRzW2lkeF0gLSBtaW5WYWxzW2ldKSAvIHJhbmdlc1tpXTsKKyAgICAgICAgICAgICAgICBub3JtQ29tcG9uZW50c1tpZHhdID0gKG5vcm1Db21wb25lbnRzW2lkeF0gLSBtaW5WYWxzW2ldKSAvIHJhbmdlc1tpXTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBieXRlIGJhW107Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiYSA9IG5ldyBieXRlW251bUNvbXBvbmVudHNdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiYSA9IChieXRlW10pIG9iajsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5lZWRBbHBoYURpdmlkZSkgewotICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0gbm9ybUNvbXBvbmVudHNbbm9ybU9mZnNldCArIG51bUNvbG9yQ29tcG9uZW50c107Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db2xvckNvbXBvbmVudHM7Ci0gICAgICAgICAgICAgICAgICAgIGkrKywgaWR4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgYmFbaV0gPSAoYnl0ZSkgKG5vcm1Db21wb25lbnRzW2lkeF0gKiBhbHBoYSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVzW2ldICsgMC41Zik7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGJ5dGUgYmFbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmEgPSBuZXcgYnl0ZVtudW1Db21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBiYSA9IChieXRlW10pb2JqOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBiYVtudW1Db2xvckNvbXBvbmVudHNdID0KLSAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIChub3JtQ29tcG9uZW50c1tub3JtT2Zmc2V0ICsgbnVtQ29sb3JDb21wb25lbnRzXSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c10gKyAwLjVmKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOwotICAgICAgICAgICAgICAgICAgICBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJhW2lkeF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIChub3JtQ29tcG9uZW50c1tpZHhdICogbWF4VmFsdWVzW2ldICsgMC41Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJhOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIHNob3J0IHVzYVtdOwotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXNhID0gbmV3IHNob3J0W251bUNvbXBvbmVudHNdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1c2EgPSAoc2hvcnRbXSkgb2JqOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBub3JtQ29tcG9uZW50c1tub3JtT2Zmc2V0ICsgbnVtQ29sb3JDb21wb25lbnRzXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gMDsgaSA8IG51bUNvbG9yQ29tcG9uZW50czsgaSsrLCBpZHgrKykgewotICAgICAgICAgICAgICAgICAgICB1c2FbaV0gPSAoc2hvcnQpIChub3JtQ29tcG9uZW50c1tpZHhdICogYWxwaGEgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFZhbHVlc1tpXSArIDAuNWYpOworICAgICAgICAgICAgICAgIGlmIChuZWVkQWxwaGFEaXZpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBub3JtQ29tcG9uZW50c1tub3JtT2Zmc2V0ICsgbnVtQ29sb3JDb21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db2xvckNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhW2ldID0gKGJ5dGUpKG5vcm1Db21wb25lbnRzW2lkeF0gKiBhbHBoYSAqIG1heFZhbHVlc1tpXSArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJhW251bUNvbG9yQ29tcG9uZW50c10gPSAoYnl0ZSkobm9ybUNvbXBvbmVudHNbbm9ybU9mZnNldCArIG51bUNvbG9yQ29tcG9uZW50c10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdICsgMC41Zik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiYVtpZHhdID0gKGJ5dGUpKG5vcm1Db21wb25lbnRzW2lkeF0gKiBtYXhWYWx1ZXNbaV0gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1c2FbbnVtQ29sb3JDb21wb25lbnRzXSA9IChzaG9ydCkgKGFscGhhICoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdICsgMC41Zik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBub3JtT2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsKLSAgICAgICAgICAgICAgICAgICAgaSsrLCBpZHgrKykgewotICAgICAgICAgICAgICAgICAgICB1c2FbaV0gPSAoc2hvcnQpIChub3JtQ29tcG9uZW50c1tpZHhdICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZXNbaV0gKyAwLjVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdXNhOworICAgICAgICAgICAgICAgIHJldHVybiBiYTsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBpbnQgaWFbXTsKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlhID0gbmV3IGludFtudW1Db21wb25lbnRzXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWEgPSAoaW50W10pIG9iajsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5lZWRBbHBoYURpdmlkZSkgewotICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0gbm9ybUNvbXBvbmVudHNbbm9ybU9mZnNldCArIG51bUNvbG9yQ29tcG9uZW50c107Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IDA7IGkgPCBudW1Db2xvckNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWFbaV0gPSAoaW50KSAobm9ybUNvbXBvbmVudHNbaWR4XSAqIGFscGhhICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZXNbaV0gKyAwLjVmKTsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCB1c2FbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdXNhID0gbmV3IHNob3J0W251bUNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVzYSA9IChzaG9ydFtdKW9iajsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWFbbnVtQ29sb3JDb21wb25lbnRzXSA9IChpbnQpIChhbHBoYSAqCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZXNbbnVtQ29sb3JDb21wb25lbnRzXSArIDAuNWYpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7Ci0gICAgICAgICAgICAgICAgICAgIGkrKywgaWR4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWFbaV0gPSAoaW50KSAobm9ybUNvbXBvbmVudHNbaWR4XSAqIG1heFZhbHVlc1tpXSArIDAuNWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpYTsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKLSAgICAgICAgICAgIHNob3J0IHNhW107Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzYSA9IG5ldyBzaG9ydFtudW1Db21wb25lbnRzXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2EgPSAoc2hvcnRbXSkgb2JqOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBub3JtQ29tcG9uZW50c1tub3JtT2Zmc2V0ICsgbnVtQ29sb3JDb21wb25lbnRzXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gMDsgaSA8IG51bUNvbG9yQ29tcG9uZW50czsgaSsrLCBpZHgrKykgewotICAgICAgICAgICAgICAgICAgICBzYVtpXSA9IChzaG9ydCkgKG5vcm1Db21wb25lbnRzW2lkeF0gKiBhbHBoYSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVzW2ldICsgMC41Zik7CisgICAgICAgICAgICAgICAgaWYgKG5lZWRBbHBoYURpdmlkZSkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQgKyBudW1Db2xvckNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gMDsgaSA8IG51bUNvbG9yQ29tcG9uZW50czsgaSsrLCBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNhW2ldID0gKHNob3J0KShub3JtQ29tcG9uZW50c1tpZHhdICogYWxwaGEgKiBtYXhWYWx1ZXNbaV0gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1c2FbbnVtQ29sb3JDb21wb25lbnRzXSA9IChzaG9ydCkoYWxwaGEgKiBtYXhWYWx1ZXNbbnVtQ29sb3JDb21wb25lbnRzXSArIDAuNWYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBub3JtT2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsgaSsrLCBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNhW2ldID0gKHNob3J0KShub3JtQ29tcG9uZW50c1tpZHhdICogbWF4VmFsdWVzW2ldICsgMC41Zik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2FbbnVtQ29sb3JDb21wb25lbnRzXSA9IChzaG9ydCkgKGFscGhhICoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdICsgMC41Zik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBub3JtT2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsKLSAgICAgICAgICAgICAgICAgICAgaSsrLCBpZHgrKykgewotICAgICAgICAgICAgICAgICAgICBzYVtpXSA9IChzaG9ydCkgKG5vcm1Db21wb25lbnRzW2lkeF0gKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFZhbHVlc1tpXSArIDAuNWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzYTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdXNhOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgotICAgICAgICAgICAgZmxvYXQgZmFbXTsKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhID0gbmV3IGZsb2F0W251bUNvbXBvbmVudHNdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmYSA9IChmbG9hdFtdKSBvYmo7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuZWVkQWxwaGFEaXZpZGUpIHsKLSAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQgKyBudW1Db2xvckNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSAwOyBpIDwgbnVtQ29sb3JDb21wb25lbnRzOyBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhW2ldID0gbm9ybUNvbXBvbmVudHNbaWR4XSAqIGFscGhhOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGludCBpYVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpYSA9IG5ldyBpbnRbbnVtQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWEgPSAoaW50W10pb2JqOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmYVtudW1Db2xvckNvbXBvbmVudHNdID0gYWxwaGE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBub3JtT2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsKLSAgICAgICAgICAgICAgICAgICAgaSsrLCBpZHgrKykgewotICAgICAgICAgICAgICAgICAgICBmYVtpXSA9IG5vcm1Db21wb25lbnRzW2lkeF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKLSAgICAgICAgICAgIGRvdWJsZSBkYVtdOwotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZGEgPSBuZXcgZG91YmxlW251bUNvbXBvbmVudHNdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkYSA9IChkb3VibGVbXSkgb2JqOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGFscGhhID0gbm9ybUNvbXBvbmVudHNbbm9ybU9mZnNldCArIG51bUNvbG9yQ29tcG9uZW50c107Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IDA7IGkgPCBudW1Db2xvckNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgZGFbaV0gPSBub3JtQ29tcG9uZW50c1tpZHhdICogYWxwaGE7CisgICAgICAgICAgICAgICAgaWYgKG5lZWRBbHBoYURpdmlkZSkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQgKyBudW1Db2xvckNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gMDsgaSA8IG51bUNvbG9yQ29tcG9uZW50czsgaSsrLCBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWFbaV0gPSAoaW50KShub3JtQ29tcG9uZW50c1tpZHhdICogYWxwaGEgKiBtYXhWYWx1ZXNbaV0gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpYVtudW1Db2xvckNvbXBvbmVudHNdID0gKGludCkoYWxwaGEgKiBtYXhWYWx1ZXNbbnVtQ29sb3JDb21wb25lbnRzXSArIDAuNWYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBub3JtT2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsgaSsrLCBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWFbaV0gPSAoaW50KShub3JtQ29tcG9uZW50c1tpZHhdICogbWF4VmFsdWVzW2ldICsgMC41Zik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGFbbnVtQ29sb3JDb21wb25lbnRzXSA9IGFscGhhOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7Ci0gICAgICAgICAgICAgICAgICAgIGkrKywgaWR4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgZGFbaV0gPSBub3JtQ29tcG9uZW50c1tpZHhdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBkYTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaWE7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGF3dC4yMTM9VGhpcyBDb21wb25lbnRDb2xvck1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlIHVubm9ybWFsaXplZCBmb3JtCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxMyIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6CisgICAgICAgICAgICAgICAgc2hvcnQgc2FbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2EgPSBuZXcgc2hvcnRbbnVtQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2EgPSAoc2hvcnRbXSlvYmo7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5lZWRBbHBoYURpdmlkZSkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQgKyBudW1Db2xvckNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gMDsgaSA8IG51bUNvbG9yQ29tcG9uZW50czsgaSsrLCBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2FbaV0gPSAoc2hvcnQpKG5vcm1Db21wb25lbnRzW2lkeF0gKiBhbHBoYSAqIG1heFZhbHVlc1tpXSArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNhW251bUNvbG9yQ29tcG9uZW50c10gPSAoc2hvcnQpKGFscGhhICogbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c10gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhW2ldID0gKHNob3J0KShub3JtQ29tcG9uZW50c1tpZHhdICogbWF4VmFsdWVzW2ldICsgMC41Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhOworCisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICBmbG9hdCBmYVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmYSA9IG5ldyBmbG9hdFtudW1Db21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmYSA9IChmbG9hdFtdKW9iajsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0gbm9ybUNvbXBvbmVudHNbbm9ybU9mZnNldCArIG51bUNvbG9yQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSAwOyBpIDwgbnVtQ29sb3JDb21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYVtpXSA9IG5vcm1Db21wb25lbnRzW2lkeF0gKiBhbHBoYTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmYVtudW1Db2xvckNvbXBvbmVudHNdID0gYWxwaGE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYVtpXSA9IG5vcm1Db21wb25lbnRzW2lkeF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhOworCisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgZG91YmxlIGRhW107CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRhID0gbmV3IGRvdWJsZVtudW1Db21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkYSA9IChkb3VibGVbXSlvYmo7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5lZWRBbHBoYURpdmlkZSkgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgYWxwaGEgPSBub3JtQ29tcG9uZW50c1tub3JtT2Zmc2V0ICsgbnVtQ29sb3JDb21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IDA7IGkgPCBudW1Db2xvckNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhW2ldID0gbm9ybUNvbXBvbmVudHNbaWR4XSAqIGFscGhhOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRhW251bUNvbG9yQ29tcG9uZW50c10gPSBhbHBoYTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhW2ldID0gbm9ybUNvbXBvbmVudHNbaWR4XTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZGE7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gYXd0LjIxMz1UaGlzIENvbXBvbmVudENvbG9yTW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUKKyAgICAgICAgICAgICAgICAvLyB1bm5vcm1hbGl6ZWQgZm9ybQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjEzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICB9CiAKQEAgLTU0NCw3ICs1ODMsNyBAQAogICAgICAgICAgICAgICAgIG5vcm1Db21wW251bUNvbG9yQ29tcG9uZW50c10gPSBub3JtQWxwaGE7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYoaGFzQWxwaGEgJiYgaXNBbHBoYVByZW11bHRpcGxpZWQpeworICAgICAgICBpZiAoaGFzQWxwaGEgJiYgaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKICAgICAgICAgICAgIG5vcm1Db21wWzBdICo9IG5vcm1Db21wW251bUNvbG9yQ29tcG9uZW50c107CiAgICAgICAgICAgICBub3JtQ29tcFsxXSAqPSBub3JtQ29tcFtudW1Db2xvckNvbXBvbmVudHNdOwogICAgICAgICAgICAgbm9ybUNvbXBbMl0gKj0gbm9ybUNvbXBbbnVtQ29sb3JDb21wb25lbnRzXTsKQEAgLTU1NSw3ICs1OTQsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGdldEFscGhhUmFzdGVyKFdyaXRhYmxlUmFzdGVyIHJhc3RlcikgewotICAgICAgICBpZighaGFzQWxwaGEpIHsKKyAgICAgICAgaWYgKCFoYXNBbHBoYSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIApAQCAtNTY0LDEzICs2MDMsMTIgQEAKICAgICAgICAgaW50IGJhbmRMaXN0W10gPSBuZXcgaW50WzFdOwogICAgICAgICBiYW5kTGlzdFswXSA9IHJhc3Rlci5nZXROdW1CYW5kcygpIC0gMTsKIAotICAgICAgICByZXR1cm4gcmFzdGVyLmNyZWF0ZVdyaXRhYmxlQ2hpbGQoeCwgeSwgcmFzdGVyLmdldFdpZHRoKCksCi0gICAgICAgICAgICAgICAgcmFzdGVyLmdldEhlaWdodCgpLCB4LCB5LCBiYW5kTGlzdCk7CisgICAgICAgIHJldHVybiByYXN0ZXIuY3JlYXRlV3JpdGFibGVDaGlsZCh4LCB5LCByYXN0ZXIuZ2V0V2lkdGgoKSwgcmFzdGVyLmdldEhlaWdodCgpLCB4LCB5LAorICAgICAgICAgICAgICAgIGJhbmRMaXN0KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29sb3JNb2RlbCBjb2VyY2VEYXRhKFdyaXRhYmxlUmFzdGVyIHJhc3RlciwKLSAgICAgICAgICAgIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKKyAgICBwdWJsaWMgQ29sb3JNb2RlbCBjb2VyY2VEYXRhKFdyaXRhYmxlUmFzdGVyIHJhc3RlciwgYm9vbGVhbiBpc0FscGhhUHJlbXVsdGlwbGllZCkgewogICAgICAgICBpZiAoIWhhc0FscGhhIHx8IHRoaXMuaXNBbHBoYVByZW11bHRpcGxpZWQgPT0gaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CkBAIC01ODIsMzMzICs2MjAsMzExIEBACiAKICAgICAgICAgaWYgKGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7CiAgICAgICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewotICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYUZhY3RvciA9IG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgIGludCBpQ29tcG9uZW50c1tdID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpbnQgaVRyYW5zcGFyZW50Q29tcG9uZW50c1tdID0gbmV3IGludFtudW1Db21wb25lbnRzXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKywgbWluWSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwLCB4ID0gbWluWDsgaiA8IHc7IGorKywgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpQ29tcG9uZW50cyA9IHJhc3Rlci5nZXRQaXhlbCh4LCBtaW5ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaUNvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldFBpeGVsKHgsIG1pblksIGlUcmFuc3BhcmVudENvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFGYWN0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1Db2xvckNvbXBvbmVudHM7IG4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ29tcG9uZW50c1tuXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoYWxwaGEgKiBpQ29tcG9uZW50c1tuXSArIDAuNWYpOworICAgICAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGFGYWN0b3IgPSBtYXhWYWx1ZXNbbnVtQ29sb3JDb21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlDb21wb25lbnRzW10gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpbnQgaVRyYW5zcGFyZW50Q29tcG9uZW50c1tdID0gbmV3IGludFtudW1Db21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoOyBpKyssIG1pblkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAsIHggPSBtaW5YOyBqIDwgdzsgaisrLCB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ29tcG9uZW50cyA9IHJhc3Rlci5nZXRQaXhlbCh4LCBtaW5ZLCBpQ29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0UGl4ZWwoeCwgbWluWSwgaVRyYW5zcGFyZW50Q29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBpQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdIC8gYWxwaGFGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ29sb3JDb21wb25lbnRzOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb21wb25lbnRzW25dID0gKGludCkoYWxwaGEgKiBpQ29tcG9uZW50c1tuXSArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCBpQ29tcG9uZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCBpQ29tcG9uZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgZmxvYXQgc0FscGhhRmFjdG9yID0gbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c107Ci0gICAgICAgICAgICAgICAgc2hvcnQgc0NvbXBvbmVudHNbXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgc2hvcnQgc1RyYW5zcGFyZW50Q29tcG9uZW50c1tdID0gbmV3IHNob3J0W251bUNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrLCBtaW5ZKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAsIHggPSBtaW5YOyBqIDwgdzsgaisrLCB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNDb21wb25lbnRzID0gKHNob3J0W10pIHJhc3Rlci5nZXREYXRhRWxlbWVudHMoeCwgbWluWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0NvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXREYXRhRWxlbWVudHMoeCwgbWluWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNUcmFuc3BhcmVudENvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQWxwaGFGYWN0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1Db2xvckNvbXBvbmVudHM7IG4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29tcG9uZW50c1tuXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgKGFscGhhICogc0NvbXBvbmVudHNbbl0gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgc0FscGhhRmFjdG9yID0gbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgICAgIHNob3J0IHNDb21wb25lbnRzW10gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBzaG9ydCBzVHJhbnNwYXJlbnRDb21wb25lbnRzW10gPSBuZXcgc2hvcnRbbnVtQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrLCBtaW5ZKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwLCB4ID0gbWluWDsgaiA8IHc7IGorKywgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0NvbXBvbmVudHMgPSAoc2hvcnRbXSlyYXN0ZXIuZ2V0RGF0YUVsZW1lbnRzKHgsIG1pblksIHNDb21wb25lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc0NvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXREYXRhRWxlbWVudHMoeCwgbWluWSwgc1RyYW5zcGFyZW50Q29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBzQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdIC8gc0FscGhhRmFjdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUNvbG9yQ29tcG9uZW50czsgbisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29tcG9uZW50c1tuXSA9IChieXRlKShhbHBoYSAqIHNDb21wb25lbnRzW25dICsgMC41Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldERhdGFFbGVtZW50cyh4LCBtaW5ZLCBzQ29tcG9uZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXREYXRhRWxlbWVudHMoeCwgbWluWSwgc0NvbXBvbmVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgotICAgICAgICAgICAgICAgIGZsb2F0IGZDb21wb25lbnRzW10gPSBudWxsOwotICAgICAgICAgICAgICAgIGZsb2F0IGZUcmFuc3BhcmVudENvbXBvbmVudHNbXSA9IG5ldyBmbG9hdFtudW1Db21wb25lbnRzXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKywgbWluWSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwLCB4ID0gbWluWDsgaiA8IHc7IGorKywgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmQ29tcG9uZW50cyA9IHJhc3Rlci5nZXRQaXhlbCh4LCBtaW5ZLCBmQ29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZkNvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXSA9PSAwLjBmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldERhdGFFbGVtZW50cyh4LCBtaW5ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlRyYW5zcGFyZW50Q29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0gZkNvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUNvbG9yQ29tcG9uZW50czsgbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb21wb25lbnRzW25dID0gZkNvbXBvbmVudHNbbl0gKiBhbHBoYTsKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZkNvbXBvbmVudHNbXSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZUcmFuc3BhcmVudENvbXBvbmVudHNbXSA9IG5ldyBmbG9hdFtudW1Db21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoOyBpKyssIG1pblkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAsIHggPSBtaW5YOyBqIDwgdzsgaisrLCB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ29tcG9uZW50cyA9IHJhc3Rlci5nZXRQaXhlbCh4LCBtaW5ZLCBmQ29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gPT0gMC4wZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0RGF0YUVsZW1lbnRzKHgsIG1pblksIGZUcmFuc3BhcmVudENvbXBvbmVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0gZkNvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1Db2xvckNvbXBvbmVudHM7IG4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNvbXBvbmVudHNbbl0gPSBmQ29tcG9uZW50c1tuXSAqIGFscGhhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCBmQ29tcG9uZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCBmQ29tcG9uZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgICAgIGRvdWJsZSBkQ29tcG9uZW50c1tdID0gbnVsbDsKLSAgICAgICAgICAgICAgICBkb3VibGUgZFRyYW5zcGFyZW50Q29tcG9uZW50c1tdID0gbmV3IGRvdWJsZVtudW1Db21wb25lbnRzXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKywgbWluWSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwLCB4ID0gbWluWDsgaiA8IHc7IGorKywgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkQ29tcG9uZW50cyA9IHJhc3Rlci5nZXRQaXhlbCh4LCBtaW5ZLCBkQ29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZENvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXSA9PSAwLjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0UGl4ZWwoeCwgbWluWSwgZFRyYW5zcGFyZW50Q29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhbHBoYSA9IGRDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1Db2xvckNvbXBvbmVudHM7IG4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkQ29tcG9uZW50c1tuXSA9IGRDb21wb25lbnRzW25dICogYWxwaGE7CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICBkb3VibGUgZENvbXBvbmVudHNbXSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkVHJhbnNwYXJlbnRDb21wb25lbnRzW10gPSBuZXcgZG91YmxlW251bUNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKywgbWluWSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMCwgeCA9IG1pblg7IGogPCB3OyBqKyssIHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRDb21wb25lbnRzID0gcmFzdGVyLmdldFBpeGVsKHgsIG1pblksIGRDb21wb25lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZENvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXSA9PSAwLjApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldFBpeGVsKHgsIG1pblksIGRUcmFuc3BhcmVudENvbXBvbmVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhbHBoYSA9IGRDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ29sb3JDb21wb25lbnRzOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRDb21wb25lbnRzW25dID0gZENvbXBvbmVudHNbbl0gKiBhbHBoYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0UGl4ZWwoeCwgbWluWSwgZENvbXBvbmVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0UGl4ZWwoeCwgbWluWSwgZENvbXBvbmVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjIxOT1UaGlzIHRyYW5zZmVyVHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29sb3IgbW9kZWwKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE5IikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gYXd0LjIxOT1UaGlzIHRyYW5zZmVyVHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29sb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gbW9kZWwKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxOSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICAgICAgZmxvYXQgYWxwaGFGYWN0b3IgPSBtYXhWYWx1ZXNbbnVtQ29sb3JDb21wb25lbnRzXTsKLSAgICAgICAgICAgICAgICBpbnQgaUNvbXBvbmVudHNbXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaW50IGlUcmFuc3BhcmVudENvbXBvbmVudHNbXSA9IG5ldyBpbnRbbnVtQ29tcG9uZW50c107Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoOyBpKyssIG1pblkrKykgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMCwgeCA9IG1pblg7IGogPCB3OyBqKyssIHgrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaUNvbXBvbmVudHMgPSByYXN0ZXIuZ2V0UGl4ZWwoeCwgbWluWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCBpVHJhbnNwYXJlbnRDb21wb25lbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhRmFjdG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ29sb3JDb21wb25lbnRzOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNvbXBvbmVudHNbbl0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGlDb21wb25lbnRzW25dIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgKyAwLjVmKTsKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhRmFjdG9yID0gbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgICAgIGludCBpQ29tcG9uZW50c1tdID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlUcmFuc3BhcmVudENvbXBvbmVudHNbXSA9IG5ldyBpbnRbbnVtQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrLCBtaW5ZKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwLCB4ID0gbWluWDsgaiA8IHc7IGorKywgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNvbXBvbmVudHMgPSByYXN0ZXIuZ2V0UGl4ZWwoeCwgbWluWSwgaUNvbXBvbmVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldFBpeGVsKHgsIG1pblksIGlUcmFuc3BhcmVudENvbXBvbmVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0gaUNvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXSAvIGFscGhhRmFjdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUNvbG9yQ29tcG9uZW50czsgbisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ29tcG9uZW50c1tuXSA9IChpbnQpKGlDb21wb25lbnRzW25dIC8gYWxwaGEgKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0UGl4ZWwoeCwgbWluWSwgaUNvbXBvbmVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0UGl4ZWwoeCwgbWluWSwgaUNvbXBvbmVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOgotICAgICAgICAgICAgICAgIGZsb2F0IHNBbHBoYUZhY3RvciA9IG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgIHNob3J0IHNDb21wb25lbnRzW10gPSBudWxsOwotICAgICAgICAgICAgICAgIHNob3J0IHNUcmFuc3BhcmVudENvbXBvbmVudHNbXSA9IG5ldyBzaG9ydFtudW1Db21wb25lbnRzXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKywgbWluWSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwLCB4ID0gbWluWDsgaiA8IHc7IGorKywgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzQ29tcG9uZW50cyA9IChzaG9ydFtdKSByYXN0ZXIuZ2V0RGF0YUVsZW1lbnRzKHgsIG1pblksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb21wb25lbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0RGF0YUVsZW1lbnRzKHgsIG1pblksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVHJhbnNwYXJlbnRDb21wb25lbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNBbHBoYUZhY3RvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUNvbG9yQ29tcG9uZW50czsgbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb21wb25lbnRzW25dID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKSAoc0NvbXBvbmVudHNbbl0gLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSArIDAuNWYpOworICAgICAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOgorICAgICAgICAgICAgICAgICAgICBmbG9hdCBzQWxwaGFGYWN0b3IgPSBtYXhWYWx1ZXNbbnVtQ29sb3JDb21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgc2hvcnQgc0NvbXBvbmVudHNbXSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHNob3J0IHNUcmFuc3BhcmVudENvbXBvbmVudHNbXSA9IG5ldyBzaG9ydFtudW1Db21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoOyBpKyssIG1pblkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAsIHggPSBtaW5YOyBqIDwgdzsgaisrLCB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29tcG9uZW50cyA9IChzaG9ydFtdKXJhc3Rlci5nZXREYXRhRWxlbWVudHMoeCwgbWluWSwgc0NvbXBvbmVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldERhdGFFbGVtZW50cyh4LCBtaW5ZLCBzVHJhbnNwYXJlbnRDb21wb25lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IHNDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gLyBzQWxwaGFGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ29sb3JDb21wb25lbnRzOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb21wb25lbnRzW25dID0gKGJ5dGUpKHNDb21wb25lbnRzW25dIC8gYWxwaGEgKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0RGF0YUVsZW1lbnRzKHgsIG1pblksIHNDb21wb25lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldERhdGFFbGVtZW50cyh4LCBtaW5ZLCBzQ29tcG9uZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgZmxvYXQgZkNvbXBvbmVudHNbXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZmxvYXQgZlRyYW5zcGFyZW50Q29tcG9uZW50c1tdID0gbmV3IGZsb2F0W251bUNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrLCBtaW5ZKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAsIHggPSBtaW5YOyBqIDwgdzsgaisrLCB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZDb21wb25lbnRzID0gcmFzdGVyLmdldFBpeGVsKHgsIG1pblksIGZDb21wb25lbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdID09IDAuMGYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0RGF0YUVsZW1lbnRzKHgsIG1pblksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmVHJhbnNwYXJlbnRDb21wb25lbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBmQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ29sb3JDb21wb25lbnRzOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNvbXBvbmVudHNbbl0gPSBmQ29tcG9uZW50c1tuXSAvIGFscGhhOworICAgICAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgICAgICBmbG9hdCBmQ29tcG9uZW50c1tdID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZlRyYW5zcGFyZW50Q29tcG9uZW50c1tdID0gbmV3IGZsb2F0W251bUNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKywgbWluWSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMCwgeCA9IG1pblg7IGogPCB3OyBqKyssIHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb21wb25lbnRzID0gcmFzdGVyLmdldFBpeGVsKHgsIG1pblksIGZDb21wb25lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZkNvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXSA9PSAwLjBmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXREYXRhRWxlbWVudHMoeCwgbWluWSwgZlRyYW5zcGFyZW50Q29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBmQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUNvbG9yQ29tcG9uZW50czsgbisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ29tcG9uZW50c1tuXSA9IGZDb21wb25lbnRzW25dIC8gYWxwaGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldFBpeGVsKHgsIG1pblksIGZDb21wb25lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldFBpeGVsKHgsIG1pblksIGZDb21wb25lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICAgICAgZG91YmxlIGRDb21wb25lbnRzW10gPSBudWxsOwotICAgICAgICAgICAgICAgIGRvdWJsZSBkVHJhbnNwYXJlbnRDb21wb25lbnRzW10gPSBuZXcgZG91YmxlW251bUNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrLCBtaW5ZKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAsIHggPSBtaW5YOyBqIDwgdzsgaisrLCB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRDb21wb25lbnRzID0gcmFzdGVyLmdldFBpeGVsKHgsIG1pblksIGRDb21wb25lbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdID09IDAuMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCBkVHJhbnNwYXJlbnRDb21wb25lbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFscGhhID0gZENvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUNvbG9yQ29tcG9uZW50czsgbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRDb21wb25lbnRzW25dID0gZENvbXBvbmVudHNbbl0gLyBhbHBoYTsKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkQ29tcG9uZW50c1tdID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRUcmFuc3BhcmVudENvbXBvbmVudHNbXSA9IG5ldyBkb3VibGVbbnVtQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrLCBtaW5ZKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwLCB4ID0gbWluWDsgaiA8IHc7IGorKywgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZENvbXBvbmVudHMgPSByYXN0ZXIuZ2V0UGl4ZWwoeCwgbWluWSwgZENvbXBvbmVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdID09IDAuMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0UGl4ZWwoeCwgbWluWSwgZFRyYW5zcGFyZW50Q29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFscGhhID0gZENvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1Db2xvckNvbXBvbmVudHM7IG4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZENvbXBvbmVudHNbbl0gPSBkQ29tcG9uZW50c1tuXSAvIGFscGhhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCBkQ29tcG9uZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCBkQ29tcG9uZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjIxOT1UaGlzIHRyYW5zZmVyVHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29sb3IgbW9kZWwKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE5IikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gYXd0LjIxOT1UaGlzIHRyYW5zZmVyVHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29sb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gbW9kZWwKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxOSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFzaWduZWQpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50Q29sb3JNb2RlbChjcywgYml0cywgaGFzQWxwaGEsCi0gICAgICAgICAgICAgICAgICAgIGlzQWxwaGFQcmVtdWx0aXBsaWVkLCB0cmFuc3BhcmVuY3ksIHRyYW5zZmVyVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudENvbG9yTW9kZWwoY3MsIGJpdHMsIGhhc0FscGhhLCBpc0FscGhhUHJlbXVsdGlwbGllZCwgdHJhbnNwYXJlbmN5LAorICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlclR5cGUpOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRDb2xvck1vZGVsKGNzLCBudWxsLCBoYXNBbHBoYSwKLSAgICAgICAgICAgICAgICBpc0FscGhhUHJlbXVsdGlwbGllZCwgdHJhbnNwYXJlbmN5LCB0cmFuc2ZlclR5cGUpOworICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudENvbG9yTW9kZWwoY3MsIG51bGwsIGhhc0FscGhhLCBpc0FscGhhUHJlbXVsdGlwbGllZCwgdHJhbnNwYXJlbmN5LAorICAgICAgICAgICAgICAgIHRyYW5zZmVyVHlwZSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludFtdIGdldENvbXBvbmVudHMoT2JqZWN0IHBpeGVsLCBpbnRbXSBjb21wb25lbnRzLCBpbnQgb2Zmc2V0KSB7CiAgICAgICAgIGlmIChkb25vdFN1cHBvcnRVbm5vcm1hbGl6ZWQpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yMTM9VGhpcyBDb21wb25lbnRDb2xvck1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlIHVubm9ybWFsaXplZCBmb3JtCisgICAgICAgICAgICAvLyBhd3QuMjEzPVRoaXMgQ29tcG9uZW50Q29sb3JNb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHRoZQorICAgICAgICAgICAgLy8gdW5ub3JtYWxpemVkIGZvcm0KICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjEzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAogICAgICAgICBpZiAoY29tcG9uZW50cyA9PSBudWxsKSB7CiAgICAgICAgICAgICBjb21wb25lbnRzID0gbmV3IGludFtvZmZzZXQgKyBudW1Db21wb25lbnRzXTsKICAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQgKyBudW1Db21wb25lbnRzID4gY29tcG9uZW50cy5sZW5ndGgpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yMTg9VGhlIGNvbXBvbmVudHMgYXJyYXkgaXMgbm90IGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCB0aGUgY29sb3IgYW5kIGFscGhhIGNvbXBvbmVudHMKKyAgICAgICAgICAgIC8vIGF3dC4yMTg9VGhlIGNvbXBvbmVudHMgYXJyYXkgaXMgbm90IGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCB0aGUKKyAgICAgICAgICAgIC8vIGNvbG9yIGFuZCBhbHBoYSBjb21wb25lbnRzCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxOCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKICAgICAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10pIHBpeGVsOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBieXRlIGJhW10gPSAoYnl0ZVtdKXBpeGVsOwogCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gb2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsgaSsrLCBpZHgrKykgewotICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbaWR4XSA9IGJhW2ldICYgMHhmZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRzOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBvZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbaWR4XSA9IGJhW2ldICYgMHhmZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgc2hvcnQgc2FbXSA9IChzaG9ydFtdKSBwaXhlbDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBvZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50c1tpZHhdID0gc2FbaV0gJiAweGZmZmY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50czsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10pcGl4ZWw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50c1tpZHhdID0gc2FbaV0gJiAweGZmZmY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRzOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKSBwaXhlbDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBvZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50c1tpZHhdID0gaWFbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50czsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpbnQgaWFbXSA9IChpbnRbXSlwaXhlbDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gb2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsgaSsrLCBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzW2lkeF0gPSBpYVtpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGF3dC4yMTc9VGhlIHRyYW5zZmVyIHR5cGUgb2YgdGhpcyBDb21wb25lbnRDb2xvck1vZGVsIGlzIG5vdCBvbmUKLSAgICAgICAgICAgIC8vICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdHJhbnNmZXIgdHlwZXM6IERhdGFCdWZmZXIuVFlQRV9CWVRFLAotICAgICAgICAgICAgLy8gICAgICAgICAgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwgb3IgRGF0YUJ1ZmZlci5UWVBFX0lOVAotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoImF3dC4yMTciKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gYXd0LjIxNz1UaGUgdHJhbnNmZXIgdHlwZSBvZiB0aGlzIENvbXBvbmVudENvbG9yTW9kZWwgaXMgbm90CisgICAgICAgICAgICAgICAgLy8gb25lCisgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGZvbGxvd2luZyB0cmFuc2ZlciB0eXBlczogRGF0YUJ1ZmZlci5UWVBFX0JZVEUsCisgICAgICAgICAgICAgICAgLy8gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwgb3IgRGF0YUJ1ZmZlci5UWVBFX0lOVAorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0W10gZ2V0Tm9ybWFsaXplZENvbXBvbmVudHMoT2JqZWN0IHBpeGVsLAotICAgICAgICAgICAgZmxvYXQgbm9ybUNvbXBvbmVudHNbXSwgaW50IG5vcm1PZmZzZXQpIHsKKyAgICBwdWJsaWMgZmxvYXRbXSBnZXROb3JtYWxpemVkQ29tcG9uZW50cyhPYmplY3QgcGl4ZWwsIGZsb2F0IG5vcm1Db21wb25lbnRzW10sIGludCBub3JtT2Zmc2V0KSB7CiAKICAgICAgICAgaWYgKG5vcm1Db21wb25lbnRzID09IG51bGwpIHsKICAgICAgICAgICAgIG5vcm1Db21wb25lbnRzID0gbmV3IGZsb2F0W251bUNvbXBvbmVudHMgKyBub3JtT2Zmc2V0XTsKICAgICAgICAgfQogCiAgICAgICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBieXRlIGJhW10gPSAoYnl0ZVtdKSBwaXhlbDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBub3JtT2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsgaSsrLCBpZHgrKykgewotICAgICAgICAgICAgICAgIG5vcm1Db21wb25lbnRzW2lkeF0gPSAoYmFbaV0gJiAweGZmKSAqIHNjYWxlRmFjdG9yc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBieXRlIGJhW10gPSAoYnl0ZVtdKXBpeGVsOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBub3JtT2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsgaSsrLCBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICBub3JtQ29tcG9uZW50c1tpZHhdID0gKGJhW2ldICYgMHhmZikgKiBzY2FsZUZhY3RvcnNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIHNob3J0IHVzYVtdID0gKHNob3J0W10pIHBpeGVsOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgbm9ybUNvbXBvbmVudHNbaWR4XSA9ICh1c2FbaV0gJiAweGZmZmYpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHNjYWxlRmFjdG9yc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIHNob3J0IHVzYVtdID0gKHNob3J0W10pcGl4ZWw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIG5vcm1Db21wb25lbnRzW2lkeF0gPSAodXNhW2ldICYgMHhmZmZmKSAqIHNjYWxlRmFjdG9yc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10pIHBpeGVsOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgbm9ybUNvbXBvbmVudHNbaWR4XSA9IGlhW2ldICogc2NhbGVGYWN0b3JzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10pcGl4ZWw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIG5vcm1Db21wb25lbnRzW2lkeF0gPSBpYVtpXSAqIHNjYWxlRmFjdG9yc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6Ci0gICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10pIHBpeGVsOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgbm9ybUNvbXBvbmVudHNbaWR4XSA9IHNhW2ldICogc2NhbGVGYWN0b3JzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10pcGl4ZWw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIG5vcm1Db21wb25lbnRzW2lkeF0gPSBzYVtpXSAqIHNjYWxlRmFjdG9yc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRkxPQVQ6Ci0gICAgICAgICAgICBmbG9hdCBmYVtdID0gKGZsb2F0W10pIHBpeGVsOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgbm9ybUNvbXBvbmVudHNbaWR4XSA9IGZhW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICBmbG9hdCBmYVtdID0gKGZsb2F0W10pcGl4ZWw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIG5vcm1Db21wb25lbnRzW2lkeF0gPSBmYVtpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgZG91YmxlIGRhW10gPSAoZG91YmxlW10pIHBpeGVsOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgbm9ybUNvbXBvbmVudHNbaWR4XSA9IChmbG9hdCkgZGFbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICBkb3VibGUgZGFbXSA9IChkb3VibGVbXSlwaXhlbDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgbm9ybUNvbXBvbmVudHNbaWR4XSA9IChmbG9hdClkYVtpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGF3dC4yMUE9VGhpcyBDb21wb25lbnRDb2xvck1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhpcyB0cmFuc2ZlclR5cGUKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjFBIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIGF3dC4yMUE9VGhpcyBDb21wb25lbnRDb2xvck1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhpcworICAgICAgICAgICAgICAgIC8vIHRyYW5zZmVyVHlwZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjFBIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAogICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7CiAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQgKyBudW1Db2xvckNvbXBvbmVudHNdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db2xvckNvbXBvbmVudHM7Ci0gICAgICAgICAgICAgICAgaSsrLCBpZHgrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db2xvckNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKICAgICAgICAgICAgICAgICBub3JtQ29tcG9uZW50c1tpZHhdIC89IGFscGhhOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKG5lZWRTY2FsZSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db2xvckNvbXBvbmVudHM7Ci0gICAgICAgICAgICAgICAgaSsrLCBpZHgrKykgewotICAgICAgICAgICAgICAgIG5vcm1Db21wb25lbnRzW2lkeF0gPSBtaW5WYWxzW2ldICsKLSAgICAgICAgICAgICAgICAgICAgcmFuZ2VzW2ldICogbm9ybUNvbXBvbmVudHNbaWR4XTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBub3JtT2Zmc2V0OyBpIDwgbnVtQ29sb3JDb21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgbm9ybUNvbXBvbmVudHNbaWR4XSA9IG1pblZhbHNbaV0gKyByYW5nZXNbaV0gKiBub3JtQ29tcG9uZW50c1tpZHhdOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBub3JtQ29tcG9uZW50czsKQEAgLTkzNCw4ICs5NTAsNyBAQAogICAgICAgICAgICAgaW50IGdyYXkgPSBnZXRSZWQoaW5EYXRhKTsKICAgICAgICAgICAgIHJldHVybiAoYWxwaGEgPDwgMjQgfCBncmF5IDw8IDE2IHwgZ3JheSA8PCA4IHwgZ3JheSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChhbHBoYSA8PCAyNCB8IGdldFJlZChpbkRhdGEpIDw8IDE2IHwgZ2V0R3JlZW4oaW5EYXRhKSA8PCA4IHwKLSAgICAgICAgICAgICAgICBnZXRCbHVlKGluRGF0YSkpOworICAgICAgICByZXR1cm4gKGFscGhhIDw8IDI0IHwgZ2V0UmVkKGluRGF0YSkgPDwgMTYgfCBnZXRHcmVlbihpbkRhdGEpIDw8IDggfCBnZXRCbHVlKGluRGF0YSkpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtOTU2LDUwICs5NzEsNTAgQEAKICAgICAgICAgaW50IGFscGhhID0gMDsKIAogICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOiB7Ci0gICAgICAgICAgICBieXRlIGJhW10gPSAoYnl0ZVtdKSBpbkRhdGE7Ci0gICAgICAgICAgICBhbHBoYSA9IGJhW251bUNvbG9yQ29tcG9uZW50c10gJiAweGZmOwotICAgICAgICAgICAgaWYgKGJpdHNbbnVtQ29sb3JDb21wb25lbnRzXSAhPSA4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFscGhhTFVUW2FscGhhXSAmIDB4ZmY7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOiB7CisgICAgICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSlpbkRhdGE7CisgICAgICAgICAgICAgICAgYWxwaGEgPSBiYVtudW1Db2xvckNvbXBvbmVudHNdICYgMHhmZjsKKyAgICAgICAgICAgICAgICBpZiAoYml0c1tudW1Db2xvckNvbXBvbmVudHNdICE9IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFscGhhTFVUW2FscGhhXSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBhbHBoYTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBhbHBoYTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6IHsKLSAgICAgICAgICAgIHNob3J0IHVzYVtdID0gKHNob3J0W10pIGluRGF0YTsKLSAgICAgICAgICAgIGFscGhhID0gdXNhW251bUNvbG9yQ29tcG9uZW50c10gJiAweGZmZmY7Ci0gICAgICAgICAgICBpZiAoYml0c1tudW1Db2xvckNvbXBvbmVudHNdICE9IDgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWxwaGFMVVRbYWxwaGFdICYgMHhmZjsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDogeworICAgICAgICAgICAgICAgIHNob3J0IHVzYVtdID0gKHNob3J0W10paW5EYXRhOworICAgICAgICAgICAgICAgIGFscGhhID0gdXNhW251bUNvbG9yQ29tcG9uZW50c10gJiAweGZmZmY7CisgICAgICAgICAgICAgICAgaWYgKGJpdHNbbnVtQ29sb3JDb21wb25lbnRzXSAhPSA4KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbHBoYUxVVFthbHBoYV0gJiAweGZmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gYWxwaGE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYWxwaGE7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOiB7Ci0gICAgICAgICAgICBpbnQgaWFbXSA9IChpbnRbXSkgaW5EYXRhOwotICAgICAgICAgICAgYWxwaGEgPSBpYVtudW1Db2xvckNvbXBvbmVudHNdOwotICAgICAgICAgICAgaWYgKGJpdHNbbnVtQ29sb3JDb21wb25lbnRzXSAhPSA4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFscGhhTFVUW2FscGhhXSAmIDB4ZmY7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6IHsKKyAgICAgICAgICAgICAgICBpbnQgaWFbXSA9IChpbnRbXSlpbkRhdGE7CisgICAgICAgICAgICAgICAgYWxwaGEgPSBpYVtudW1Db2xvckNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgIGlmIChiaXRzW251bUNvbG9yQ29tcG9uZW50c10gIT0gOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxwaGFMVVRbYWxwaGFdICYgMHhmZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGFscGhhOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGFscGhhOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOiB7Ci0gICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10pIGluRGF0YTsKLSAgICAgICAgICAgIGFscGhhID0gc2FbbnVtQ29sb3JDb21wb25lbnRzXTsKLSAgICAgICAgICAgIGlmIChiaXRzW251bUNvbG9yQ29tcG9uZW50c10gIT0gOCkgewotICAgICAgICAgICAgICAgIHJldHVybiBhbHBoYUxVVFthbHBoYV0gJiAweGZmOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6IHsKKyAgICAgICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10paW5EYXRhOworICAgICAgICAgICAgICAgIGFscGhhID0gc2FbbnVtQ29sb3JDb21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICBpZiAoYml0c1tudW1Db2xvckNvbXBvbmVudHNdICE9IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFscGhhTFVUW2FscGhhXSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBhbHBoYTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBhbHBoYTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDogewotICAgICAgICAgICAgZmxvYXQgZmFbXSA9IChmbG9hdFtdKSBpbkRhdGE7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgKGZhW251bUNvbG9yQ29tcG9uZW50c10gKiAyNTUuMGYgKyAwLjVmKTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6IHsKLSAgICAgICAgICAgIGRvdWJsZSBkYVtdID0gKGRvdWJsZVtdKSBpbkRhdGE7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgKGRhW251bUNvbG9yQ29tcG9uZW50c10gKiAyNTUuMCArIDAuNSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgLy8gYXd0LjIxND1UaGlzIENvbG9yIE1vZGVsIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHRyYW5zZmVyVHlwZQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxNCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDogeworICAgICAgICAgICAgICAgIGZsb2F0IGZhW10gPSAoZmxvYXRbXSlpbkRhdGE7CisgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQpKGZhW251bUNvbG9yQ29tcG9uZW50c10gKiAyNTUuMGYgKyAwLjVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRTogeworICAgICAgICAgICAgICAgIGRvdWJsZSBkYVtdID0gKGRvdWJsZVtdKWluRGF0YTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludCkoZGFbbnVtQ29sb3JDb21wb25lbnRzXSAqIDI1NS4wICsgMC41KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjE0PVRoaXMgQ29sb3IgTW9kZWwgZG9lc24ndCBzdXBwb3J0IHRoaXMgdHJhbnNmZXJUeXBlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxNCIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDMyLDE0ICsxMDQ3LDE0IEBACiAgICAgICAgIH0KIAogICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCh0cmFuc2ZlclR5cGUsIHcsIGgsCi0gICAgICAgICAgICAgICAgICAgIG51bUNvbXBvbmVudHMsIHcgKiBudW1Db21wb25lbnRzLCBiYW5kT2Zmc2V0cyk7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsKHRyYW5zZmVyVHlwZSwgdywgaCwgbnVtQ29tcG9uZW50cywgdworICAgICAgICAgICAgICAgICAgICAgICAgKiBudW1Db21wb25lbnRzLCBiYW5kT2Zmc2V0cyk7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50U2FtcGxlTW9kZWwodHJhbnNmZXJUeXBlLCB3LCBoLCBudW1Db21wb25lbnRzLAotICAgICAgICAgICAgICAgICAgICB3ICogbnVtQ29tcG9uZW50cywgYmFuZE9mZnNldHMpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudFNhbXBsZU1vZGVsKHRyYW5zZmVyVHlwZSwgdywgaCwgbnVtQ29tcG9uZW50cywgdworICAgICAgICAgICAgICAgICAgICAgICAgKiBudW1Db21wb25lbnRzLCBiYW5kT2Zmc2V0cyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwNjcsMTUgKzEwODIsMTUgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXRbXSBnZXROb3JtYWxpemVkQ29tcG9uZW50cyhpbnQgY29tcG9uZW50c1tdLCBpbnQgb2Zmc2V0LAotICAgICAgICAgICAgZmxvYXQgbm9ybUNvbXBvbmVudHNbXSwgaW50IG5vcm1PZmZzZXQpIHsKKyAgICBwdWJsaWMgZmxvYXRbXSBnZXROb3JtYWxpemVkQ29tcG9uZW50cyhpbnQgY29tcG9uZW50c1tdLCBpbnQgb2Zmc2V0LCBmbG9hdCBub3JtQ29tcG9uZW50c1tdLAorICAgICAgICAgICAgaW50IG5vcm1PZmZzZXQpIHsKICAgICAgICAgaWYgKGRvbm90U3VwcG9ydFVubm9ybWFsaXplZCkgewotICAgICAgICAgICAgLy8gYXd0LjIxMz1UaGlzIENvbXBvbmVudENvbG9yTW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgdW5ub3JtYWxpemVkIGZvcm0KKyAgICAgICAgICAgIC8vIGF3dC4yMTM9VGhpcyBDb21wb25lbnRDb2xvck1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlCisgICAgICAgICAgICAvLyB1bm5vcm1hbGl6ZWQgZm9ybQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBzdXBlci5nZXROb3JtYWxpemVkQ29tcG9uZW50cyhjb21wb25lbnRzLCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgbm9ybUNvbXBvbmVudHMsIG5vcm1PZmZzZXQpOworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Tm9ybWFsaXplZENvbXBvbmVudHMoY29tcG9uZW50cywgb2Zmc2V0LCBub3JtQ29tcG9uZW50cywgbm9ybU9mZnNldCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMDg1LDI4ICsxMTAwLDMwIEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxMiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIGlmIChkb25vdFN1cHBvcnRVbm5vcm1hbGl6ZWQpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yMTM9VGhpcyBDb21wb25lbnRDb2xvck1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlIHVubm9ybWFsaXplZCBmb3JtCisgICAgICAgICAgICAvLyBhd3QuMjEzPVRoaXMgQ29tcG9uZW50Q29sb3JNb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHRoZQorICAgICAgICAgICAgLy8gdW5ub3JtYWxpemVkIGZvcm0KICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjEzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHNbb2Zmc2V0XTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50W10gZ2V0VW5ub3JtYWxpemVkQ29tcG9uZW50cyhmbG9hdFtdIG5vcm1Db21wb25lbnRzLAotICAgICAgICAgICAgaW50IG5vcm1PZmZzZXQsIGludFtdIGNvbXBvbmVudHMsIGludCBvZmZzZXQpIHsKKyAgICBwdWJsaWMgaW50W10gZ2V0VW5ub3JtYWxpemVkQ29tcG9uZW50cyhmbG9hdFtdIG5vcm1Db21wb25lbnRzLCBpbnQgbm9ybU9mZnNldCwKKyAgICAgICAgICAgIGludFtdIGNvbXBvbmVudHMsIGludCBvZmZzZXQpIHsKIAogICAgICAgICBpZiAoZG9ub3RTdXBwb3J0VW5ub3JtYWxpemVkKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjEzPVRoaXMgQ29tcG9uZW50Q29sb3JNb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSB1bm5vcm1hbGl6ZWQgZm9ybQorICAgICAgICAgICAgLy8gYXd0LjIxMz1UaGlzIENvbXBvbmVudENvbG9yTW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUKKyAgICAgICAgICAgIC8vIHVubm9ybWFsaXplZCBmb3JtCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxMyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKICAgICAgICAgaWYgKG5vcm1Db21wb25lbnRzLmxlbmd0aCAtIG5vcm1PZmZzZXQgPCBudW1Db21wb25lbnRzKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjFCPVRoZSBsZW5ndGggb2Ygbm9ybUNvbXBvbmVudHMgbWludXMgbm9ybU9mZnNldCBpcyBsZXNzIHRoYW4gbnVtQ29tcG9uZW50cworICAgICAgICAgICAgLy8gYXd0LjIxQj1UaGUgbGVuZ3RoIG9mIG5vcm1Db21wb25lbnRzIG1pbnVzIG5vcm1PZmZzZXQgaXMgbGVzcworICAgICAgICAgICAgLy8gdGhhbiBudW1Db21wb25lbnRzCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxQiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFVubm9ybWFsaXplZENvbXBvbmVudHMobm9ybUNvbXBvbmVudHMsIG5vcm1PZmZzZXQsCi0gICAgICAgICAgICAgICAgY29tcG9uZW50cywgb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldFVubm9ybWFsaXplZENvbXBvbmVudHMobm9ybUNvbXBvbmVudHMsIG5vcm1PZmZzZXQsIGNvbXBvbmVudHMsIG9mZnNldCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMTIzLDE5ICsxMTQwLDE5IEBACiAgICAgICAgIE9iamVjdCBwaXhlbCA9IGdldERhdGFFbGVtZW50cyhub3JtQ29tcG9uZW50cywgbm9ybU9mZnNldCwgbnVsbCk7CiAKICAgICAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10pIHBpeGVsOwotICAgICAgICAgICAgcmV0dXJuIGJhWzBdICYgMHhmZjsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgc2hvcnQgc2FbXSA9IChzaG9ydFtdKSBwaXhlbDsKLSAgICAgICAgICAgIHJldHVybiBzYVswXSAmIDB4ZmZmZjsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10pIHBpeGVsOwotICAgICAgICAgICAgcmV0dXJuIGlhWzBdOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYXd0LjIxMT1QaXhlbCB2YWx1ZXMgZm9yIHRoaXMgQ29sb3JNb2RlbCBhcmUgbm90IGNvbnZlbmllbnRseQotICAgICAgICAgICAgLy8gICAgICAgICAgcmVwcmVzZW50YWJsZSBhcyBhIHNpbmdsZSBpbnQKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjExIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10pcGl4ZWw7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJhWzBdICYgMHhmZjsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10pcGl4ZWw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhWzBdICYgMHhmZmZmOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKXBpeGVsOworICAgICAgICAgICAgICAgIHJldHVybiBpYVswXTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gYXd0LjIxMT1QaXhlbCB2YWx1ZXMgZm9yIHRoaXMgQ29sb3JNb2RlbCBhcmUgbm90IGNvbnZlbmllbnRseQorICAgICAgICAgICAgICAgIC8vIHJlcHJlc2VudGFibGUgYXMgYSBzaW5nbGUgaW50CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTEiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgIH0KIApAQCAtMTE0Niw3ICsxMTYzLDggQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjEyIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgaWYgKGRvbm90U3VwcG9ydFVubm9ybWFsaXplZCkgewotICAgICAgICAgICAgLy8gYXd0LjIxMz1UaGlzIENvbXBvbmVudENvbG9yTW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgdW5ub3JtYWxpemVkIGZvcm0KKyAgICAgICAgICAgIC8vIGF3dC4yMTM9VGhpcyBDb21wb25lbnRDb2xvck1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlCisgICAgICAgICAgICAvLyB1bm5vcm1hbGl6ZWQgZm9ybQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCkBAIC0xMTYxLDMxICsxMTc5LDMxIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRSZWQoaW50IHBpeGVsKSB7CiAgICAgICAgIGZsb2F0IHJnYltdID0gdG9SR0IocGl4ZWwpOwotICAgICAgICByZXR1cm4gKGludCkgKHJnYlswXSAqIDI1NS4wZiArIDAuNWYpOworICAgICAgICByZXR1cm4gKGludCkocmdiWzBdICogMjU1LjBmICsgMC41Zik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRSR0IoaW50IHBpeGVsKSB7Ci0gICAgICAgIHJldHVybiAoZ2V0QWxwaGEocGl4ZWwpIDw8IDI0KSB8IChnZXRSZWQocGl4ZWwpIDw8IDE2KSB8Ci0gICAgICAgICAgICAgICAoZ2V0R3JlZW4ocGl4ZWwpIDw8IDgpIHwgZ2V0Qmx1ZShwaXhlbCk7CisgICAgICAgIHJldHVybiAoZ2V0QWxwaGEocGl4ZWwpIDw8IDI0KSB8IChnZXRSZWQocGl4ZWwpIDw8IDE2KSB8IChnZXRHcmVlbihwaXhlbCkgPDwgOCkKKyAgICAgICAgICAgICAgICB8IGdldEJsdWUocGl4ZWwpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0R3JlZW4oaW50IHBpeGVsKSB7CiAgICAgICAgIGZsb2F0IHJnYltdID0gdG9SR0IocGl4ZWwpOwotICAgICAgICByZXR1cm4gKGludCkgKHJnYlsxXSAqIDI1NS4wZiArIDAuNWYpOworICAgICAgICByZXR1cm4gKGludCkocmdiWzFdICogMjU1LjBmICsgMC41Zik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRCbHVlKGludCBwaXhlbCkgewogICAgICAgICBmbG9hdCByZ2JbXSA9IHRvUkdCKHBpeGVsKTsKLSAgICAgICAgcmV0dXJuIChpbnQpIChyZ2JbMl0gKiAyNTUuMGYgKyAwLjVmKTsKKyAgICAgICAgcmV0dXJuIChpbnQpKHJnYlsyXSAqIDI1NS4wZiArIDAuNWYpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0QWxwaGEoaW50IHBpeGVsKSB7CiAKLSAgICAgICAgLy8gVGhpcyBtZXRob2QgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGFjY29yZGluZyB0byAKKyAgICAgICAgLy8gVGhpcyBtZXRob2QgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGFjY29yZGluZyB0bwogICAgICAgICAvLyBKYXZhIEFQSSBTcGFjaWZpY2F0aW9uCiAgICAgICAgIGlmIChzaWduZWQpIHsKICAgICAgICAgICAgIC8vIGF3dC4yMTA9VGhlIGNvbXBvbmVudCB2YWx1ZSBmb3IgdGhpcyBDb2xvck1vZGVsIGlzIHNpZ25lZApAQCAtMTIxMCwyNCArMTIyOCwxOSBAQAogICAgICAgICBpZiAoaGFzQWxwaGEgJiYgYml0c1tudW1Db2xvckNvbXBvbmVudHNdICE9IDggJiYgaW50ZWdyYWwpIHsKICAgICAgICAgICAgIGFscGhhTFVUID0gbmV3IGJ5dGVbbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c10gKyAxXTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhbHBoYUxVVFtpXSA9IChieXRlKSAoc2NhbGVGYWN0b3JzW251bUNvbG9yQ29tcG9uZW50c10gKiBpICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAwLjVmKTsKKyAgICAgICAgICAgICAgICBhbHBoYUxVVFtpXSA9IChieXRlKShzY2FsZUZhY3RvcnNbbnVtQ29sb3JDb21wb25lbnRzXSAqIGkgKyAwLjVmKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChpc19MSU5FQVJfUkdCKSB7CiAgICAgICAgICAgICBpZiAobWF4Qml0TGVuZ3RoID4gOCkgewogICAgICAgICAgICAgICAgIExJTkVBUl9SR0JfTGVuZ3RoID0gMTY7Ci0gICAgICAgICAgICAgICAgZnJvbV9MSU5FQVJfUkdCX0xVVCA9Ci0gICAgICAgICAgICAgICAgICAgIExVVENvbG9yQ29udmVydGVyLmdldEZyb20xNmxSR0J0b3NSR0JfTFVUKCk7Ci0gICAgICAgICAgICAgICAgdG9fTElORUFSXzE2UkdCX0xVVCA9Ci0gICAgICAgICAgICAgICAgICAgIExVVENvbG9yQ29udmVydGVyLmdldEZyb21zUkdCdG8xNmxSR0JfTFVUKCk7CisgICAgICAgICAgICAgICAgZnJvbV9MSU5FQVJfUkdCX0xVVCA9IExVVENvbG9yQ29udmVydGVyLmdldEZyb20xNmxSR0J0b3NSR0JfTFVUKCk7CisgICAgICAgICAgICAgICAgdG9fTElORUFSXzE2UkdCX0xVVCA9IExVVENvbG9yQ29udmVydGVyLmdldEZyb21zUkdCdG8xNmxSR0JfTFVUKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIExJTkVBUl9SR0JfTGVuZ3RoID0gODsKLSAgICAgICAgICAgICAgICBmcm9tX0xJTkVBUl9SR0JfTFVUID0KLSAgICAgICAgICAgICAgICAgICAgTFVUQ29sb3JDb252ZXJ0ZXIuZ2V0RnJvbThsUkdCdG9zUkdCX0xVVCgpOwotICAgICAgICAgICAgICAgIHRvX0xJTkVBUl84UkdCX0xVVCA9Ci0gICAgICAgICAgICAgICAgICAgIExVVENvbG9yQ29udmVydGVyLmdldEZyb21zUkdCdG84bFJHQl9MVVQoKTsKKyAgICAgICAgICAgICAgICBmcm9tX0xJTkVBUl9SR0JfTFVUID0gTFVUQ29sb3JDb252ZXJ0ZXIuZ2V0RnJvbThsUkdCdG9zUkdCX0xVVCgpOworICAgICAgICAgICAgICAgIHRvX0xJTkVBUl84UkdCX0xVVCA9IExVVENvbG9yQ29udmVydGVyLmdldEZyb21zUkdCdG84bFJHQl9MVVQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZGYWN0b3IgPSAoKDEgPDwgTElORUFSX1JHQl9MZW5ndGgpIC0gMSk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0xMjQ4LDggKzEyNjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JMVVRzW2ldID0gbmV3IGJ5dGVbbWF4VmFsdWVzW2ldICsgMV07CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8PSBtYXhWYWx1ZXNbMF07IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTFVUc1tpXVtqXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKSAoc2NhbGVGYWN0b3JzW2ldICogaiArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTFVUc1tpXVtqXSA9IChieXRlKShzY2FsZUZhY3RvcnNbaV0gKiBqICsgMC41Zik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0xMjY5LDEwICsxMjgxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDw9IG1heFZhbHVlc1swXTsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTElORUFSX1JHQl9MZW5ndGggPT0gOCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAoaW50KSAoc2NhbGVGYWN0b3JzW2ldICogaiArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAoaW50KShzY2FsZUZhY3RvcnNbaV0gKiBqICsgMC41Zik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gKGludCkgKHNjYWxlRmFjdG9yc1tpXSAqIGogKiAyNTcuMGYgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAoaW50KShzY2FsZUZhY3RvcnNbaV0gKiBqICogMjU3LjBmICsgMC41Zik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTFVUc1tpXVtqXSA9IGZyb21fTElORUFSX1JHQl9MVVRbaWR4XTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEyODYsMTMgKzEyOTcsMTMgQEAKICAgICAvKioKICAgICAgKiBUbyByZ2IuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBpeGVsIC0gaW50IHJlcHJlc2VudGF0aW9uIG9mIHBpeGVsCi0gICAgICogCi0gICAgICogQHJldHVybiAtIGFycmF5IG9mIG5vcm1hbGl6ZWQgc1JHQiBjb21wb25lbnRzCisgICAgICogQHBhcmFtIHBpeGVsCisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGl4ZWwuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2Ygbm9ybWFsaXplZCBzUkdCIGNvbXBvbmVudHMuCiAgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdFtdIHRvUkdCKGludCBwaXhlbCkgewotICAgICAgICAKLSAgICAgICAgLy8gVGhpcyBtZXRob2QgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGFjY29yZGluZyB0byAKKworICAgICAgICAvLyBUaGlzIG1ldGhvZCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gYWNjb3JkaW5nIHRvCiAgICAgICAgIC8vIEphdmEgQVBJIFNwYWNpZmljYXRpb24KICAgICAgICAgaWYgKHNpZ25lZCkgewogICAgICAgICAgICAgLy8gYXd0LjIxMD1UaGUgY29tcG9uZW50IHZhbHVlIGZvciB0aGlzIENvbG9yTW9kZWwgaXMgc2lnbmVkCkBAIC0xMzA3LDIzICsxMzE4LDIzIEBACiAgICAgICAgIE9iamVjdCBvYmogPSBudWxsOwogCiAgICAgICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBieXRlIGJhW10gPSBuZXcgYnl0ZVsxXTsKLSAgICAgICAgICAgIGJhWzBdID0gKGJ5dGUpIHBpeGVsOwotICAgICAgICAgICAgb2JqID0gYmE7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgYnl0ZSBiYVtdID0gbmV3IGJ5dGVbMV07CisgICAgICAgICAgICAgICAgYmFbMF0gPSAoYnl0ZSlwaXhlbDsKKyAgICAgICAgICAgICAgICBvYmogPSBiYTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBzaG9ydCBzYVtdID0gbmV3IHNob3J0WzFdOwotICAgICAgICAgICAgc2FbMF0gPSAoc2hvcnQpIHBpeGVsOwotICAgICAgICAgICAgb2JqID0gc2E7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzYVtdID0gbmV3IHNob3J0WzFdOworICAgICAgICAgICAgICAgIHNhWzBdID0gKHNob3J0KXBpeGVsOworICAgICAgICAgICAgICAgIG9iaiA9IHNhOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGludCBpYVtdID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgIGlhWzBdID0gcGl4ZWw7Ci0gICAgICAgICAgICBvYmogPSBpYTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGludCBpYVtdID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgICAgICBpYVswXSA9IHBpeGVsOworICAgICAgICAgICAgICAgIG9iaiA9IGlhOworICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIH0KIApAQCAtMTMzMSwxMiArMTM0MiwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJnYiBjb21wb25lbnQuCisgICAgICogR2V0cyB0aGUgUkdCIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGl4ZWwgLSBwaXhlbAotICAgICAqIEBwYXJhbSBpZHggLSBpbmRleCBvZiBjb21wb25lbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIC0gUkdCIHZhbHVlIGZyb20gMCB0byAyNTUgcGl4ZWwncyBjb21wb25lbnQKKyAgICAgKiBAcGFyYW0gcGl4ZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0gaWR4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgY29tcG9uZW50LgorICAgICAqIEByZXR1cm4gdGhlIFJHQiB2YWx1ZSBmcm9tIDAgdG8gMjU1IHBpeGVsJ3MgY29tcG9uZW50LgogICAgICAqLwogICAgIHByaXZhdGUgaW50IGdldFJHQkNvbXBvbmVudChPYmplY3QgcGl4ZWwsIGludCBpZHgpIHsKICAgICAgICAgaWYgKGlzX3NSR0IpIHsKQEAgLTEzNTUsMTE3ICsxMzY3LDExNiBAQAogCiAgICAgICAgIGZsb2F0IG5vcm1Db21wW10gPSBnZXROb3JtYWxpemVkQ29tcG9uZW50cyhwaXhlbCwgbnVsbCwgMCk7CiAgICAgICAgIGZsb2F0IHJnYkNvbXBbXSA9IGNzLnRvUkdCKG5vcm1Db21wKTsKLSAgICAgICAgcmV0dXJuIChpbnQpIChyZ2JDb21wW2lkeF0gKiAyNTUuMGYgKyAwLjVmKTsKKyAgICAgICAgcmV0dXJuIChpbnQpKHJnYkNvbXBbaWR4XSAqIDI1NS4wZiArIDAuNWYpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRlZiBjb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBpeGVsIC0gcGl4ZWwKLSAgICAgKiBAcGFyYW0gaWR4IC0gaW5kZXggb2YgY29tcG9uZW50Ci0gICAgICogCi0gICAgICogQHJldHVybiAtIHRlbnRhdGl2ZSB2YWx1ZSBvZiB0aGUgcGl4ZWwgY29tcG9uZW50CisgICAgICogQHBhcmFtIHBpeGVsCisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIGlkeAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIGNvbXBvbmVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSB0ZW50YXRpdmUgdmFsdWUgb2YgdGhlIHBpeGVsIGNvbXBvbmVudC4KICAgICAgKi8KICAgICBwcml2YXRlIGludCBnZXREZWZDb21wb25lbnQoT2JqZWN0IHBpeGVsLCBpbnQgaWR4KSB7CiAgICAgICAgIGludCBjb21wID0gMDsKICAgICAgICAgY2FsY1ZhbHVlID0gZmFsc2U7CiAKICAgICAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10pIHBpeGVsOwotICAgICAgICAgICAgY29tcCA9IGJhW2lkeF0gJiAweGZmOwotICAgICAgICAgICAgaWYgKG5lZWRBbHBoYURpdmlkZSkgewotICAgICAgICAgICAgICAgIGludCBhbHBoYSA9IGJhW251bUNvbG9yQ29tcG9uZW50c10gJiAweGZmOwotICAgICAgICAgICAgICAgIGlmIChhbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXAgPSAwOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBieXRlIGJhW10gPSAoYnl0ZVtdKXBpeGVsOworICAgICAgICAgICAgICAgIGNvbXAgPSBiYVtpZHhdICYgMHhmZjsKKyAgICAgICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSA9IGJhW251bUNvbG9yQ29tcG9uZW50c10gJiAweGZmOworICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBub3JtQWxwaGEgPSBzY2FsZUZhY3RvcnNbbnVtQ29sb3JDb21wb25lbnRzXSAqIGFscGhhOworICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9IChpbnQpKGNvbXAgKiBmRmFjdG9yIC8gbm9ybUFscGhhICsgMC41Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FsY1ZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXA7CisKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCB1c2FbXSA9IChzaG9ydFtdKXBpeGVsOworICAgICAgICAgICAgICAgIGNvbXAgPSB1c2FbaWR4XSAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSA9IHVzYVtudW1Db2xvckNvbXBvbmVudHNdICYgMHhmZmZmOworICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBub3JtQWxwaGEgPSBzY2FsZUZhY3RvcnNbbnVtQ29sb3JDb21wb25lbnRzXSAqIGFscGhhOworICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9IChpbnQpKGNvbXAgKiBmRmFjdG9yIC8gbm9ybUFscGhhICsgMC41Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FsY1ZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXA7CisKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpbnQgaWFbXSA9IChpbnRbXSlwaXhlbDsKKyAgICAgICAgICAgICAgICBjb21wID0gaWFbaWR4XTsKKyAgICAgICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSA9IGlhW251bUNvbG9yQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG5vcm1BbHBoYSA9IHNjYWxlRmFjdG9yc1tudW1Db2xvckNvbXBvbmVudHNdICogYWxwaGE7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wID0gKGludCkoY29tcCAqIGZGYWN0b3IgLyBub3JtQWxwaGEgKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYWxjVmFsdWUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcDsKKworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6CisgICAgICAgICAgICAgICAgc2hvcnQgc2FbXSA9IChzaG9ydFtdKXBpeGVsOworICAgICAgICAgICAgICAgIGNvbXAgPSBzYVtpZHhdOworICAgICAgICAgICAgICAgIGlmIChuZWVkQWxwaGFEaXZpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhID0gc2FbbnVtQ29sb3JDb21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbm9ybUFscGhhID0gc2NhbGVGYWN0b3JzW251bUNvbG9yQ29tcG9uZW50c10gKiBhbHBoYTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPSAoaW50KShjb21wICogZkZhY3RvciAvIG5vcm1BbHBoYSArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhbGNWYWx1ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBjb21wOworCisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICBmbG9hdCBmYVtdID0gKGZsb2F0W10pcGl4ZWw7CisgICAgICAgICAgICAgICAgaWYgKG5lZWRBbHBoYURpdmlkZSkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IGZhW251bUNvbG9yQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgICAgIGlmIChmYVtudW1Db2xvckNvbXBvbmVudHNdID09IDAuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9IChpbnQpKGZhW2lkeF0gKiBmRmFjdG9yIC8gYWxwaGEgKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IG5vcm1BbHBoYSA9IHNjYWxlRmFjdG9yc1tudW1Db2xvckNvbXBvbmVudHNdICogYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXAgPSAoaW50KSAoY29tcCAqIGZGYWN0b3IgLyBub3JtQWxwaGEgKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgY29tcCA9IChpbnQpKGZhW2lkeF0gKiBmRmFjdG9yICsgMC41Zik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhbGNWYWx1ZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29tcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcDsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBzaG9ydCB1c2FbXSA9IChzaG9ydFtdKSBwaXhlbDsKLSAgICAgICAgICAgIGNvbXAgPSB1c2FbaWR4XSAmIDB4ZmZmZjsKLSAgICAgICAgICAgIGlmIChuZWVkQWxwaGFEaXZpZGUpIHsKLSAgICAgICAgICAgICAgICBpbnQgYWxwaGEgPSB1c2FbbnVtQ29sb3JDb21wb25lbnRzXSAmIDB4ZmZmZjsKLSAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb21wID0gMDsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICBkb3VibGUgZGFbXSA9IChkb3VibGVbXSlwaXhlbDsKKyAgICAgICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYVtudW1Db2xvckNvbXBvbmVudHNdID09IDAuMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wID0gKGludCkoZGFbaWR4XSAqIGZGYWN0b3IgLyBkYVtudW1Db2xvckNvbXBvbmVudHNdICsgMC41KTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IG5vcm1BbHBoYSA9IHNjYWxlRmFjdG9yc1tudW1Db2xvckNvbXBvbmVudHNdICogYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXAgPSAoaW50KSAoY29tcCAqIGZGYWN0b3IgLyBub3JtQWxwaGEgKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgY29tcCA9IChpbnQpKGRhW2lkeF0gKiBmRmFjdG9yICsgMC41KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FsY1ZhbHVlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb21wOworICAgICAgICAgICAgICAgIHJldHVybiBjb21wOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKSBwaXhlbDsKLSAgICAgICAgICAgIGNvbXAgPSBpYVtpZHhdOwotICAgICAgICAgICAgaWYgKG5lZWRBbHBoYURpdmlkZSkgewotICAgICAgICAgICAgICAgIGludCBhbHBoYSA9IGlhW251bUNvbG9yQ29tcG9uZW50c107Ci0gICAgICAgICAgICAgICAgaWYgKGFscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcCA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgbm9ybUFscGhhID0gc2NhbGVGYWN0b3JzW251bUNvbG9yQ29tcG9uZW50c10gKiBhbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgY29tcCA9IChpbnQpIChjb21wICogZkZhY3RvciAvIG5vcm1BbHBoYSArIDAuNWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYWxjVmFsdWUgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbXA7Ci0KLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6Ci0gICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10pIHBpeGVsOwotICAgICAgICAgICAgY29tcCA9IHNhW2lkeF07Ci0gICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7Ci0gICAgICAgICAgICAgICAgaW50IGFscGhhID0gc2FbbnVtQ29sb3JDb21wb25lbnRzXTsKLSAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb21wID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBub3JtQWxwaGEgPSBzY2FsZUZhY3RvcnNbbnVtQ29sb3JDb21wb25lbnRzXSAqIGFscGhhOwotICAgICAgICAgICAgICAgICAgICBjb21wID0gKGludCkgKGNvbXAgKiBmRmFjdG9yIC8gbm9ybUFscGhhICsgMC41Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhbGNWYWx1ZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29tcDsKLQotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDoKLSAgICAgICAgICAgIGZsb2F0IGZhW10gPSAoZmxvYXRbXSkgcGl4ZWw7Ci0gICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBmYVtudW1Db2xvckNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgIGlmIChmYVtudW1Db2xvckNvbXBvbmVudHNdID09IDAuMGYpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcCA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcCA9IChpbnQpIChmYVtpZHhdICogZkZhY3RvciAvIGFscGhhICsgMC41Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb21wID0gKGludCkgKGZhW2lkeF0gKiBmRmFjdG9yICsgMC41Zik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYWxjVmFsdWUgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIGNvbXA7Ci0KLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgZG91YmxlIGRhW10gPSAoZG91YmxlW10pIHBpeGVsOwotICAgICAgICAgICAgaWYgKG5lZWRBbHBoYURpdmlkZSkgewotICAgICAgICAgICAgICAgIGlmIChkYVtudW1Db2xvckNvbXBvbmVudHNdID09IDAuMCkgewotICAgICAgICAgICAgICAgICAgICBjb21wID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb21wID0gKGludCkgKGRhW2lkeF0gKiBmRmFjdG9yIC8gZGFbbnVtQ29sb3JDb21wb25lbnRzXSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb21wID0gKGludCkgKGRhW2lkeF0gKiBmRmFjdG9yICsgMC41KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhbGNWYWx1ZSA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gY29tcDsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYXd0LjIxND1UaGlzIENvbG9yIE1vZGVsIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHRyYW5zZmVyVHlwZQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxNCIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjE0PVRoaXMgQ29sb3IgTW9kZWwgZG9lc24ndCBzdXBwb3J0IHRoaXMgdHJhbnNmZXJUeXBlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxNCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9Db21wb25lbnRTYW1wbGVNb2RlbC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0NvbXBvbmVudFNhbXBsZU1vZGVsLmphdmEKaW5kZXggMmZmNGYxYS4uN2Y4MTQwOSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0NvbXBvbmVudFNhbXBsZU1vZGVsLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0NvbXBvbmVudFNhbXBsZU1vZGVsLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKQEAgLTI1LDU1ICsyNiw3MyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBDb21wb25lbnRTYW1wbGVNb2RlbCBjbGFzcyByZXByZXNlbnRzIGEgc2V0IG9mIGltYWdlIGRhdGEgd2hvc2UgCi0gKiBlYWNoIGVsZW1lbnQgLSB0aGUgc2FtcGxlIG9mIGEgcGl4ZWwgLSB0YWtlcyBvbmUgZGF0YSBlbGVtZW50IG9mIAotICogdGhlIERhdGFCdWZmZXIuIAorICogVGhlIENvbXBvbmVudFNhbXBsZU1vZGVsIGNsYXNzIHJlcHJlc2VudHMgYSBzZXQgb2YgaW1hZ2UgZGF0YSB3aG9zZSBlYWNoCisgKiBlbGVtZW50IC0gdGhlIHNhbXBsZSBvZiBhIHBpeGVsIC0gdGFrZXMgb25lIGRhdGEgZWxlbWVudCBvZiB0aGUgRGF0YUJ1ZmZlci4KICAqIDxwPgotICogVGhlIEJhbmsgaW5kaWNlcyBkZW5vdGUgdGhlIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gdGhlIGJhbmsgb2YgZGF0YSAKLSAqIGJ1ZmZlcnMgYW5kIGEgYmFuZCBvZiBpbWFnZSBkYXRhLiBUaGUgUGl4ZWwgc3RyaWRlIGlzIHRoZSBudW1iZXIgb2YgZGF0YSAKLSAqIGFycmF5IGVsZW1lbnRzIGJldHdlZW4gdHdvIHNhbXBsZXMgZm9yIHRoZSBzYW1lIGJhbmQgb24gdGhlIHNhbWUgCi0gKiBzY2FubGluZS4gVGhlIHBpeGVsIHN0cmlkZSBmb3IgYSBCYW5kZWRTYW1wbGVNb2RlbCBpcyBvbmUuIFRoZSBTY2FubGluZSAKLSAqIHN0cmlkZSByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgZGF0YSBhcnJheSBlbGVtZW50cyBiZXR3ZWVuIGEgIAotICogc3BlY2lmaWVkIHNhbXBsZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc2FtcGxlIGluIHRoZSBzYW1lIGNvbHVtbiBpbiAKLSAqIHRoZSBuZXh0IHNjYW5saW5lLiBUaGUgYXJyYXkgb2YgYmFuZCBvZmZzZXRzIGdpdmVzIHRoZSBzdGFydGluZyAKLSAqIG9mZnNldHMgd2l0aGluIGVhY2ggZGF0YSBiYW5rcyBvZiB0aGUgaW4gdGhlIERhdGFCdWZmZXIuIFRoZSBiYW5rIAotICogaW5kaWNlcyByZXByZXNlbnRzIHRoZSBpbmRpY2VzIHdpdGhpbiBlYWNoIGJhbmsgb2YgdGhlIERhdGFCdWZmZXIgCi0gKiBjb3JyZXNwb25kaW5nIHRvIGEgYmFuZCBvZiBpbWFnZSBkYXRhLgorICogVGhlIEJhbmsgaW5kaWNlcyBkZW5vdGUgdGhlIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gdGhlIGJhbmsgb2YgZGF0YSBidWZmZXJzCisgKiBhbmQgYSBiYW5kIG9mIGltYWdlIGRhdGEuIFRoZSBQaXhlbCBzdHJpZGUgaXMgdGhlIG51bWJlciBvZiBkYXRhIGFycmF5CisgKiBlbGVtZW50cyBiZXR3ZWVuIHR3byBzYW1wbGVzIGZvciB0aGUgc2FtZSBiYW5kIG9uIHRoZSBzYW1lIHNjYW5saW5lLiBUaGUKKyAqIHBpeGVsIHN0cmlkZSBmb3IgYSBCYW5kZWRTYW1wbGVNb2RlbCBpcyBvbmUuIFRoZSBzY2FubGluZSBzdHJpZGUgcmVwcmVzZW50cworICogdGhlIG51bWJlciBvZiBkYXRhIGFycmF5IGVsZW1lbnRzIGJldHdlZW4gYSBzcGVjaWZpZWQgc2FtcGxlIGFuZCB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgc2FtcGxlIGluIHRoZSBzYW1lIGNvbHVtbiBpbiB0aGUgbmV4dCBzY2FubGluZS4gVGhlIGFycmF5IG9mCisgKiBiYW5kIG9mZnNldHMgZ2l2ZXMgdGhlIHN0YXJ0aW5nIG9mZnNldHMgd2l0aGluIGVhY2ggZGF0YSBiYW5rcyBvZiB0aGUgaW4gdGhlCisgKiBEYXRhQnVmZmVyLiBUaGUgYmFuayBpbmRpY2VzIHJlcHJlc2VudHMgdGhlIGluZGljZXMgd2l0aGluIGVhY2ggYmFuayBvZiB0aGUKKyAqIERhdGFCdWZmZXIgY29ycmVzcG9uZGluZyB0byBhIGJhbmQgb2YgaW1hZ2UgZGF0YS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDb21wb25lbnRTYW1wbGVNb2RlbCBleHRlbmRzIFNhbXBsZU1vZGVsIHsKIAotICAgIC8qKiBUaGUgYmFuZCBvZmZzZXRzIGFycmF5IG9mIHRoaXMgQ29tcG9uZW50U2FtcGxlTW9kZWwuICovCisgICAgLyoqCisgICAgICogVGhlIGJhbmQgb2Zmc2V0cyBhcnJheSBvZiB0aGlzIENvbXBvbmVudFNhbXBsZU1vZGVsLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgYmFuZE9mZnNldHNbXTsKIAotICAgIC8qKiBUaGUgYmFuayBpbmRpY2VzIGFycmF5IG9mIHRoaXMgQ29tcG9uZW50U2FtcGxlTW9kZWwuICovCisgICAgLyoqCisgICAgICogVGhlIGJhbmsgaW5kaWNlcyBhcnJheSBvZiB0aGlzIENvbXBvbmVudFNhbXBsZU1vZGVsLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgYmFua0luZGljZXNbXTsKIAotICAgIC8qKiBUaGUgbnVtYmVyIG9mIGJhbmRzIGluIHRoaXMgQ29tcG9uZW50U2FtcGxlTW9kZWwuICovCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBiYW5kcyBpbiB0aGlzIENvbXBvbmVudFNhbXBsZU1vZGVsLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgbnVtQmFuZHM7CiAKLSAgICAvKiogVGhlIG51bWJlciBiYW5rcyBvZiB0aGlzIENvbXBvbmVudFNhbXBsZU1vZGVsLiAqLworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgYmFua3Mgb2YgdGhpcyBDb21wb25lbnRTYW1wbGVNb2RlbC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IG51bUJhbmtzOwogCi0gICAgLyoqIFRoZSBzY2FubGluZSBzdHJpZGUgb2YgdGhpcyBDb21wb25lbnRTYW1wbGVNb2RlbC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgc2NhbmxpbmUgc3RyaWRlIG9mIHRoaXMgQ29tcG9uZW50U2FtcGxlTW9kZWwuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBzY2FubGluZVN0cmlkZTsKIAotICAgIC8qKiBUaGUgcGl4ZWwgc3RyaWRlIG9mIHRoaXMgQ29tcG9uZW50U2FtcGxlTW9kZWwuICovCisgICAgLyoqCisgICAgICogVGhlIHBpeGVsIHN0cmlkZSBvZiB0aGlzIENvbXBvbmVudFNhbXBsZU1vZGVsLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgcGl4ZWxTdHJpZGU7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQ29tcG9uZW50U2FtcGxlTW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICogcHJvcGVydGllcy4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQ29tcG9uZW50U2FtcGxlTW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUgb2Ygc2FtcGxlcy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gcGl4ZWxTdHJpZGUgdGhlIHBpeGVsIHN0cmlkZSBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gc2NhbmxpbmVTdHJpZGUgdGhlIHNjYW5saW5lIHN0cmlkZSBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gYmFua0luZGljZXMgdGhlIGFycmF5IG9mIHRoZSBiYW5rIGluZGljZXMuCi0gICAgICogQHBhcmFtIGJhbmRPZmZzZXRzIHRoZSBhcnJheSBvZiB0aGUgYmFuZCBvZmZzZXRzLgorICAgICAqIEBwYXJhbSBkYXRhVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHlwZSBvZiBzYW1wbGVzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHBpeGVsU3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwgc3RyaWRlIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZQorICAgICAqICAgICAgICAgICAgdGhlIHNjYW5saW5lIHN0cmlkZSBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gYmFua0luZGljZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiB0aGUgYmFuayBpbmRpY2VzLgorICAgICAqIEBwYXJhbSBiYW5kT2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHRoZSBiYW5kIG9mZnNldHMuCiAgICAgICovCi0gICAgcHVibGljIENvbXBvbmVudFNhbXBsZU1vZGVsKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLCBpbnQgcGl4ZWxTdHJpZGUsCi0gICAgICAgICAgICBpbnQgc2NhbmxpbmVTdHJpZGUsIGludCBiYW5rSW5kaWNlc1tdLCBpbnQgYmFuZE9mZnNldHNbXSkgeworICAgIHB1YmxpYyBDb21wb25lbnRTYW1wbGVNb2RlbChpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwgaW50IHBpeGVsU3RyaWRlLCBpbnQgc2NhbmxpbmVTdHJpZGUsCisgICAgICAgICAgICBpbnQgYmFua0luZGljZXNbXSwgaW50IGJhbmRPZmZzZXRzW10pIHsKIAogICAgICAgICBzdXBlcihkYXRhVHlwZSwgdywgaCwgYmFuZE9mZnNldHMubGVuZ3RoKTsKIApAQCAtMTEzLDE4ICsxMzIsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQ29tcG9uZW50U2FtcGxlTW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICogcHJvcGVydGllcy4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQ29tcG9uZW50U2FtcGxlTW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHNhbXBsZXMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIHBpeGVsU3RyaWRlIHRoZSBwaXhlbCBzdHJpZGUgb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIHNjYW5saW5lU3RyaWRlIHRoZSBzY2FubGluZSBzdHJpZGUgb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGJhbmRPZmZzZXRzIHRoZSBiYW5kIG9mZnNldHMuCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlIG9mIHRoZSBzYW1wbGVzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHBpeGVsU3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwgc3RyaWRlIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZQorICAgICAqICAgICAgICAgICAgdGhlIHNjYW5saW5lIHN0cmlkZSBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gYmFuZE9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYW5kIG9mZnNldHMuCiAgICAgICovCi0gICAgcHVibGljIENvbXBvbmVudFNhbXBsZU1vZGVsKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLCBpbnQgcGl4ZWxTdHJpZGUsCi0gICAgICAgICAgICBpbnQgc2NhbmxpbmVTdHJpZGUsIGludCBiYW5kT2Zmc2V0c1tdKSB7CisgICAgcHVibGljIENvbXBvbmVudFNhbXBsZU1vZGVsKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLCBpbnQgcGl4ZWxTdHJpZGUsIGludCBzY2FubGluZVN0cmlkZSwKKyAgICAgICAgICAgIGludCBiYW5kT2Zmc2V0c1tdKSB7CiAKICAgICAgICAgc3VwZXIoZGF0YVR5cGUsIHcsIGgsIGJhbmRPZmZzZXRzLmxlbmd0aCk7CiAgICAgICAgIGlmIChwaXhlbFN0cmlkZSA8IDApIHsKQEAgLTE1Niw4MSArMTgwLDgxIEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgc3dpdGNoIChkYXRhVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZSBiZGF0YVtdOwotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYmRhdGEgPSBuZXcgYnl0ZVtudW1CYW5kc107Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJkYXRhID0gKGJ5dGVbXSkgb2JqOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBieXRlIGJkYXRhW107CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJkYXRhID0gbmV3IGJ5dGVbbnVtQmFuZHNdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJkYXRhID0gKGJ5dGVbXSlvYmo7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBiZGF0YVtpXSA9IChieXRlKSBnZXRTYW1wbGUoeCwgeSwgaSwgZGF0YSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJkYXRhW2ldID0gKGJ5dGUpZ2V0U2FtcGxlKHgsIHksIGksIGRhdGEpOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb2JqID0gYmRhdGE7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBvYmogPSBiZGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgc2hvcnQgc2RhdGFbXTsKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNkYXRhID0gbmV3IHNob3J0W251bUJhbmRzXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2RhdGEgPSAoc2hvcnRbXSkgb2JqOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgc2hvcnQgc2RhdGFbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2RhdGEgPSBuZXcgc2hvcnRbbnVtQmFuZHNdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNkYXRhID0gKHNob3J0W10pb2JqOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2RhdGFbaV0gPSAoc2hvcnQpIGdldFNhbXBsZSh4LCB5LCBpLCBkYXRhKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2RhdGFbaV0gPSAoc2hvcnQpZ2V0U2FtcGxlKHgsIHksIGksIGRhdGEpOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb2JqID0gc2RhdGE7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBvYmogPSBzZGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBpbnQgaWRhdGFbXTsKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlkYXRhID0gbmV3IGludFtudW1CYW5kc107Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlkYXRhID0gKGludFtdKSBvYmo7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgaW50IGlkYXRhW107CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlkYXRhID0gbmV3IGludFtudW1CYW5kc107CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWRhdGEgPSAoaW50W10pb2JqOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWRhdGFbaV0gPSBnZXRTYW1wbGUoeCwgeSwgaSwgZGF0YSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlkYXRhW2ldID0gZ2V0U2FtcGxlKHgsIHksIGksIGRhdGEpOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb2JqID0gaWRhdGE7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBvYmogPSBpZGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDoKLSAgICAgICAgICAgIGZsb2F0IGZkYXRhW107Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmZGF0YSA9IG5ldyBmbG9hdFtudW1CYW5kc107Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZkYXRhID0gKGZsb2F0W10pIG9iajsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgIGZsb2F0IGZkYXRhW107CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZkYXRhID0gbmV3IGZsb2F0W251bUJhbmRzXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmZGF0YSA9IChmbG9hdFtdKW9iajsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgewotICAgICAgICAgICAgICAgIGZkYXRhW2ldID0gZ2V0U2FtcGxlRmxvYXQoeCwgeSwgaSwgZGF0YSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZkYXRhW2ldID0gZ2V0U2FtcGxlRmxvYXQoeCwgeSwgaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvYmogPSBmZGF0YTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG9iaiA9IGZkYXRhOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKLSAgICAgICAgICAgIGRvdWJsZSBkZGF0YVtdOwotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZGRhdGEgPSBuZXcgZG91YmxlW251bUJhbmRzXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGRhdGEgPSAoZG91YmxlW10pIG9iajsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICBkb3VibGUgZGRhdGFbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZGRhdGEgPSBuZXcgZG91YmxlW251bUJhbmRzXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZGF0YSA9IChkb3VibGVbXSlvYmo7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkZGF0YVtpXSA9IGdldFNhbXBsZURvdWJsZSh4LCB5LCBpLCBkYXRhKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZGRhdGFbaV0gPSBnZXRTYW1wbGVEb3VibGUoeCwgeSwgaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvYmogPSBkZGF0YTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG9iaiA9IGRkYXRhOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIG9iajsKQEAgLTI0Myw3NiArMjY3LDc1IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgc3dpdGNoIChkYXRhVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZSBiYXJyW10gPSAoYnl0ZVtdKSBvYmo7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzZXRTYW1wbGUoeCwgeSwgaSwgYmFycltpXSAmIDB4ZmYsIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGJ5dGUgYmFycltdID0gKGJ5dGVbXSlvYmo7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFNhbXBsZSh4LCB5LCBpLCBiYXJyW2ldICYgMHhmZiwgZGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOgotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBzaG9ydCBzYXJyW10gPSAoc2hvcnRbXSkgb2JqOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2V0U2FtcGxlKHgsIHksIGksIHNhcnJbaV0gJiAweGZmZmYsIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzYXJyW10gPSAoc2hvcnRbXSlvYmo7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFNhbXBsZSh4LCB5LCBpLCBzYXJyW2ldICYgMHhmZmZmLCBkYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgaW50IGlhcnJbXSA9IChpbnRbXSkgb2JqOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2V0U2FtcGxlKHgsIHksIGksIGlhcnJbaV0sIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgaW50IGlhcnJbXSA9IChpbnRbXSlvYmo7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFNhbXBsZSh4LCB5LCBpLCBpYXJyW2ldLCBkYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRkxPQVQ6Ci0gICAgICAgICAgICBmbG9hdCBmYXJyW10gPSAoZmxvYXRbXSkgb2JqOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2V0U2FtcGxlKHgsIHksIGksIGZhcnJbaV0sIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICBmbG9hdCBmYXJyW10gPSAoZmxvYXRbXSlvYmo7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFNhbXBsZSh4LCB5LCBpLCBmYXJyW2ldLCBkYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgZG91YmxlIGRhcnJbXSA9IChkb3VibGVbXSkgb2JqOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2V0U2FtcGxlKHgsIHksIGksIGRhcnJbaV0sIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgZG91YmxlIGRhcnJbXSA9IChkb3VibGVbXSlvYmo7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFNhbXBsZSh4LCB5LCBpLCBkYXJyW2ldLCBkYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBDb21wYXJlcyB0aGlzIENvbXBvbmVudFNhbXBsZU1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBPYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG8gdGhlIE9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBvYmplY3QgaXMgYSBDb21wb25lbnRTYW1wbGVNb2RlbCB3aXRoIAotICAgICAqIGlkZW50aWNhbCBkYXRhIHZhbHVlcyB0byB0aGlzIENvbXBvbmVudFNhbXBsZU1vZGVsLCBmYWxzZSBvdGhlcndpc2UuIAorICAgICAqIEBwYXJhbSBvCisgICAgICogICAgICAgICAgICB0aGUgT2JqZWN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIG9iamVjdCBpcyBhIENvbXBvbmVudFNhbXBsZU1vZGVsIHdpdGggaWRlbnRpY2FsIGRhdGEKKyAgICAgKiAgICAgICAgIHZhbHVlcyB0byB0aGlzIENvbXBvbmVudFNhbXBsZU1vZGVsLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAgICAgICAgIGlmICgobyA9PSBudWxsKSB8fCAhKG8gaW5zdGFuY2VvZiBDb21wb25lbnRTYW1wbGVNb2RlbCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBDb21wb25lbnRTYW1wbGVNb2RlbCBtb2RlbCA9IChDb21wb25lbnRTYW1wbGVNb2RlbCkgbzsKLSAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggPT0gbW9kZWwud2lkdGggJiYgdGhpcy5oZWlnaHQgPT0gbW9kZWwuaGVpZ2h0ICYmCi0gICAgICAgICAgICAgICB0aGlzLm51bUJhbmRzID09IG1vZGVsLm51bUJhbmRzICYmCi0gICAgICAgICAgICAgICB0aGlzLmRhdGFUeXBlID09IG1vZGVsLmRhdGFUeXBlICYmCi0gICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKHRoaXMuYmFuZE9mZnNldHMsIG1vZGVsLmJhbmRPZmZzZXRzKSAmJgotICAgICAgICAgICAgICAgQXJyYXlzLmVxdWFscyh0aGlzLmJhbmtJbmRpY2VzLCBtb2RlbC5iYW5rSW5kaWNlcykgJiYKLSAgICAgICAgICAgICAgIHRoaXMubnVtQmFuZHMgPT0gbW9kZWwubnVtQmFuZHMgJiYKLSAgICAgICAgICAgICAgIHRoaXMubnVtQmFua3MgPT0gbW9kZWwubnVtQmFua3MgJiYKLSAgICAgICAgICAgICAgIHRoaXMuc2NhbmxpbmVTdHJpZGUgPT0gbW9kZWwuc2NhbmxpbmVTdHJpZGUgJiYKLSAgICAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJpZGUgPT0gbW9kZWwucGl4ZWxTdHJpZGU7CisgICAgICAgIENvbXBvbmVudFNhbXBsZU1vZGVsIG1vZGVsID0gKENvbXBvbmVudFNhbXBsZU1vZGVsKW87CisgICAgICAgIHJldHVybiB0aGlzLndpZHRoID09IG1vZGVsLndpZHRoICYmIHRoaXMuaGVpZ2h0ID09IG1vZGVsLmhlaWdodAorICAgICAgICAgICAgICAgICYmIHRoaXMubnVtQmFuZHMgPT0gbW9kZWwubnVtQmFuZHMgJiYgdGhpcy5kYXRhVHlwZSA9PSBtb2RlbC5kYXRhVHlwZQorICAgICAgICAgICAgICAgICYmIEFycmF5cy5lcXVhbHModGhpcy5iYW5kT2Zmc2V0cywgbW9kZWwuYmFuZE9mZnNldHMpCisgICAgICAgICAgICAgICAgJiYgQXJyYXlzLmVxdWFscyh0aGlzLmJhbmtJbmRpY2VzLCBtb2RlbC5iYW5rSW5kaWNlcykKKyAgICAgICAgICAgICAgICAmJiB0aGlzLm51bUJhbmRzID09IG1vZGVsLm51bUJhbmRzICYmIHRoaXMubnVtQmFua3MgPT0gbW9kZWwubnVtQmFua3MKKyAgICAgICAgICAgICAgICAmJiB0aGlzLnNjYW5saW5lU3RyaWRlID09IG1vZGVsLnNjYW5saW5lU3RyaWRlCisgICAgICAgICAgICAgICAgJiYgdGhpcy5waXhlbFN0cmlkZSA9PSBtb2RlbC5waXhlbFN0cmlkZTsKICAgICB9CiAKLSAgICAvKiogCisgICAgLyoqCiAgICAgICogQHNlZSBqYXZhLmF3dC5pbWFnZS5TYW1wbGVNb2RlbCNjcmVhdGVTdWJzZXRTYW1wbGVNb2RlbChpbnRbXSkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU2FtcGxlTW9kZWwgY3JlYXRlU3Vic2V0U2FtcGxlTW9kZWwoaW50IGJhbmRzW10pIHsKICAgICAgICAgaWYgKGJhbmRzLmxlbmd0aCA+IHRoaXMubnVtQmFuZHMpIHsKLSAgICAgICAgICAgIC8vIGF3dC42ND1UaGUgbnVtYmVyIG9mIHRoZSBiYW5kcyBpbiB0aGUgc3Vic2V0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJhbmRzIGluIHRoZSBzYW1wbGUgbW9kZWwKKyAgICAgICAgICAgIC8vIGF3dC42ND1UaGUgbnVtYmVyIG9mIHRoZSBiYW5kcyBpbiB0aGUgc3Vic2V0IGlzIGdyZWF0ZXIgdGhhbiB0aGUKKyAgICAgICAgICAgIC8vIG51bWJlciBvZiBiYW5kcyBpbiB0aGUgc2FtcGxlIG1vZGVsCiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjY0IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIApAQCAtMzI0LDE1ICszNDcsMTUgQEAKICAgICAgICAgICAgIG9mZnNldHNbaV0gPSBiYW5kT2Zmc2V0c1tiYW5kc1tpXV07CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudFNhbXBsZU1vZGVsKGRhdGFUeXBlLCB3aWR0aCwgaGVpZ2h0LCBwaXhlbFN0cmlkZSwKLSAgICAgICAgICAgICAgICBzY2FubGluZVN0cmlkZSwgaW5kaWNlcywgb2Zmc2V0cyk7CisgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50U2FtcGxlTW9kZWwoZGF0YVR5cGUsIHdpZHRoLCBoZWlnaHQsIHBpeGVsU3RyaWRlLCBzY2FubGluZVN0cmlkZSwKKyAgICAgICAgICAgICAgICBpbmRpY2VzLCBvZmZzZXRzKTsKIAogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTYW1wbGVNb2RlbCBjcmVhdGVDb21wYXRpYmxlU2FtcGxlTW9kZWwoaW50IHcsIGludCBoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50U2FtcGxlTW9kZWwoZGF0YVR5cGUsIHcsIGgsIHBpeGVsU3RyaWRlLAotICAgICAgICAgICAgICAgIHBpeGVsU3RyaWRlICogdywgYmFua0luZGljZXMsIGJhbmRPZmZzZXRzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRTYW1wbGVNb2RlbChkYXRhVHlwZSwgdywgaCwgcGl4ZWxTdHJpZGUsIHBpeGVsU3RyaWRlICogdywgYmFua0luZGljZXMsCisgICAgICAgICAgICAgICAgYmFuZE9mZnNldHMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMzY2LDggKzM4OSw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gZGF0YS5nZXRFbGVtKGJhbmtJbmRpY2VzW2JdLCB5ICogc2NhbmxpbmVTdHJpZGUgKwotICAgICAgICAgICAgICAgIHggKiBwaXhlbFN0cmlkZSArIGJhbmRPZmZzZXRzW2JdKTsKKyAgICAgICAgcmV0dXJuIGRhdGEuZ2V0RWxlbShiYW5rSW5kaWNlc1tiXSwgeSAqIHNjYW5saW5lU3RyaWRlICsgeCAqIHBpeGVsU3RyaWRlICsgYmFuZE9mZnNldHNbYl0pOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMzc3LDggKzM5OSw4IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gZGF0YS5nZXRFbGVtRmxvYXQoYmFua0luZGljZXNbYl0sIHkgKiBzY2FubGluZVN0cmlkZSArCi0gICAgICAgICAgICAgICAgeCAqIHBpeGVsU3RyaWRlICsgYmFuZE9mZnNldHNbYl0pOworICAgICAgICByZXR1cm4gZGF0YS5nZXRFbGVtRmxvYXQoYmFua0luZGljZXNbYl0sIHkgKiBzY2FubGluZVN0cmlkZSArIHggKiBwaXhlbFN0cmlkZQorICAgICAgICAgICAgICAgICsgYmFuZE9mZnNldHNbYl0pOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMzg4LDE1ICs0MTAsMTQgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBkYXRhLmdldEVsZW1Eb3VibGUoYmFua0luZGljZXNbYl0sIHkgKiBzY2FubGluZVN0cmlkZSArCi0gICAgICAgICAgICAgICAgeCAqIHBpeGVsU3RyaWRlICsgYmFuZE9mZnNldHNbYl0pOworICAgICAgICByZXR1cm4gZGF0YS5nZXRFbGVtRG91YmxlKGJhbmtJbmRpY2VzW2JdLCB5ICogc2NhbmxpbmVTdHJpZGUgKyB4ICogcGl4ZWxTdHJpZGUKKyAgICAgICAgICAgICAgICArIGJhbmRPZmZzZXRzW2JdKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50W10gZ2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgaUFycmF5W10sCi0gICAgICAgICAgICBEYXRhQnVmZmVyIGRhdGEpIHsKLSAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggPiB0aGlzLndpZHRoIHx8IHggKyB3ID4gdGhpcy53aWR0aAotICAgICAgICAgICAgICAgIHx8IHkgPiB0aGlzLmhlaWdodCB8fCB5ICsgaCA+IHRoaXMuaGVpZ2h0KSB7CisgICAgcHVibGljIGludFtdIGdldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGlBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKKyAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggPiB0aGlzLndpZHRoIHx8IHggKyB3ID4gdGhpcy53aWR0aCB8fCB5ID4gdGhpcy5oZWlnaHQKKyAgICAgICAgICAgICAgICB8fCB5ICsgaCA+IHRoaXMuaGVpZ2h0KSB7CiAgICAgICAgICAgICAvLyBhd3QuNjM9Q29vcmRpbmF0ZXMgYXJlIG5vdCBpbiBib3VuZHMKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQpAQCAtNDIxLDggKzQ0Miw3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgaUFycmF5W10sCi0gICAgICAgICAgICBEYXRhQnVmZmVyIGRhdGEpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBpQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCB4ICsgdyA+IHRoaXMud2lkdGggfHwgeSArIGggPiB0aGlzLmhlaWdodCkgewogICAgICAgICAgICAgLy8gYXd0LjYzPUNvb3JkaW5hdGVzIGFyZSBub3QgaW4gYm91bmRzCiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCkBAIC00NDQsMTMgKzQ2NCwxMSBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgZGF0YS5zZXRFbGVtKGJhbmtJbmRpY2VzW2JdLCB5ICogc2NhbmxpbmVTdHJpZGUgKyB4ICogcGl4ZWxTdHJpZGUKLSAgICAgICAgICAgICAgICArIGJhbmRPZmZzZXRzW2JdLCBzKTsKKyAgICAgICAgZGF0YS5zZXRFbGVtKGJhbmtJbmRpY2VzW2JdLCB5ICogc2NhbmxpbmVTdHJpZGUgKyB4ICogcGl4ZWxTdHJpZGUgKyBiYW5kT2Zmc2V0c1tiXSwgcyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludFtdIGdldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLCBpbnQgaUFycmF5W10sCi0gICAgICAgICAgICBEYXRhQnVmZmVyIGRhdGEpIHsKKyAgICBwdWJsaWMgaW50W10gZ2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGludCBpQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCB4ICsgdyA+IHRoaXMud2lkdGggfHwgeSArIGggPiB0aGlzLmhlaWdodCkgewogICAgICAgICAgICAgLy8gYXd0LjYzPUNvb3JkaW5hdGVzIGFyZSBub3QgaW4gYm91bmRzCiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCkBAIC00NjMsNyArNDgxLDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNhbXBsZXMgPSBpQXJyYXk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gYXd0LjI5NT1kYXRhIGlzIG51bGwKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yOTUiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTQ3OSw4ICs0OTcsNyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLCBpbnQgaUFycmF5W10sCi0gICAgICAgICAgICBEYXRhQnVmZmVyIGRhdGEpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwgaW50IGlBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggKyB3ID4gdGhpcy53aWR0aCB8fCB5ICsgaCA+IHRoaXMuaGVpZ2h0KSB7CiAgICAgICAgICAgICAvLyBhd3QuNjM9Q29vcmRpbmF0ZXMgYXJlIG5vdCBpbiBib3VuZHMKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTUwMCw4ICs1MTcsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgZGF0YS5zZXRFbGVtRmxvYXQoYmFua0luZGljZXNbYl0sIHkgKiBzY2FubGluZVN0cmlkZSArCi0gICAgICAgICAgICAgICAgeCAqIHBpeGVsU3RyaWRlICsgYmFuZE9mZnNldHNbYl0sIHMpOworICAgICAgICBkYXRhLnNldEVsZW1GbG9hdChiYW5rSW5kaWNlc1tiXSwgeSAqIHNjYW5saW5lU3RyaWRlICsgeCAqIHBpeGVsU3RyaWRlICsgYmFuZE9mZnNldHNbYl0sIHMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNTExLDggKzUyNyw5IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBkYXRhLnNldEVsZW1Eb3VibGUoYmFua0luZGljZXNbYl0sIHkgKiBzY2FubGluZVN0cmlkZSArCi0gICAgICAgICAgICAgICAgeCAqIHBpeGVsU3RyaWRlICsgYmFuZE9mZnNldHNbYl0sIHMpOworICAgICAgICBkYXRhCisgICAgICAgICAgICAgICAgLnNldEVsZW1Eb3VibGUoYmFua0luZGljZXNbYl0sIHkgKiBzY2FubGluZVN0cmlkZSArIHggKiBwaXhlbFN0cmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgKyBiYW5kT2Zmc2V0c1tiXSwgcyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC01MjUsMjggKzU0MiwyNyBAQAogICAgICAgICAgICAgICAgIG1heE9mZnNldCA9IGJhbmRPZmZzZXRzW2ldOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGludCBzaXplID0gKGhlaWdodCAtIDEpICogc2NhbmxpbmVTdHJpZGUgKwotICAgICAgICAod2lkdGggLSAxKSAqIHBpeGVsU3RyaWRlICsgbWF4T2Zmc2V0ICsgMTsKKyAgICAgICAgaW50IHNpemUgPSAoaGVpZ2h0IC0gMSkgKiBzY2FubGluZVN0cmlkZSArICh3aWR0aCAtIDEpICogcGl4ZWxTdHJpZGUgKyBtYXhPZmZzZXQgKyAxOwogCiAgICAgICAgIHN3aXRjaCAoZGF0YVR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckJ5dGUoc2l6ZSwgbnVtQmFua3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOgotICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyU2hvcnQoc2l6ZSwgbnVtQmFua3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlclVTaG9ydChzaXplLCBudW1CYW5rcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVySW50KHNpemUsIG51bUJhbmtzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDoKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckZsb2F0KHNpemUsIG51bUJhbmtzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJEb3VibGUoc2l6ZSwgbnVtQmFua3MpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckJ5dGUoc2l6ZSwgbnVtQmFua3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyU2hvcnQoc2l6ZSwgbnVtQmFua3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlclVTaG9ydChzaXplLCBudW1CYW5rcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVySW50KHNpemUsIG51bUJhbmtzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckZsb2F0KHNpemUsIG51bUJhbmtzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJEb3VibGUoc2l6ZSwgbnVtQmFua3MpOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGRhdGE7CkBAIC01NTYsMTAgKzU3MiwxMiBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG9mZnNldCBvZiB0aGUgc3BlY2lmaWVkIGJhbmQgb2YgdGhlIHNwZWNpZmllZCBwaXhlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4gCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogQHBhcmFtIGIgdGhlIGJhbmQuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJhbmQuCiAgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBzcGVjaWZpZWQgYmFuZCBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0KGludCB4LCBpbnQgeSwgaW50IGIpIHsKQEAgLTU2OSw5ICs1ODcsMTAgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGJhbmQgb2YgdGhlIHNwZWNpZmllZCBwaXhlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLiAKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHBpeGVsLgotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHBpeGVsLgogICAgICAqIEByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgYmFuZCBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0KGludCB4LCBpbnQgeSkgewpAQCAtNTk1LDggKzYxNCw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiBiYW5rIGluZGljZXMgY29ycmVzcG9uZGluZyB0byB0aGlzIAotICAgICAqIENvbXBvbmVudFNhbXBsZU1vZGVsLgorICAgICAqIEdldHMgYW4gYXJyYXkgb2YgYmFuayBpbmRpY2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBDb21wb25lbnRTYW1wbGVNb2RlbC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBiYW5rIGluZGljZXMuCiAgICAgICovCkBAIC02MDUsNyArNjIzLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHRoZSBiYW5kIG9mZnNldHMgY29ycmVzcG9uZGluZyB0byB0aGlzIAorICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdGhlIGJhbmQgb2Zmc2V0cyBjb3JyZXNwb25kaW5nIHRvIHRoaXMKICAgICAgKiBDb21wb25lbnRTYW1wbGVNb2RlbC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBiYW5kIG9mZnNldHMuCkBAIC02NzMsNyArNjkxLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBwaXhlbCBzdHJpZGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcGl4ZWwgc3RyaWRlCisgICAgICogQHJldHVybiB0aGUgcGl4ZWwgc3RyaWRlLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGl4ZWxTdHJpZGUoKSB7CiAgICAgICAgIHJldHVybiBwaXhlbFN0cmlkZTsKQEAgLTY4NSw2ICs3MDMsMyBAQAogICAgIH0KIAogfQotCi0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0NvbnZvbHZlT3AuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9Db252b2x2ZU9wLmphdmEKaW5kZXggYmI1ODhiYy4uNmViODkwOSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0NvbnZvbHZlT3AuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQ29udm9sdmVPcC5qYXZhCkBAIC0zMiw0NyArMzIsNTcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgQ29udm9sdmVPcCBjbGFzcyBjb252b2x2ZXMgZnJvbSB0aGUgc291cmNlIGRhdGEKLSAqIHRvIHRoZSBkZXN0aW5hdGlvbiB1c2luZyBhIGNvbnZvbHV0aW9uIGtlcm5lbC4gCi0gKiBFYWNoIG91dHB1dCBwaXhlbCBpcyByZXByZXNlbnRlZCBhcyB0aGUgcmVzdWx0IG9mIG11bHRpcGx5aW5nIAotICogdGhlIGtlcm5lbCBhbmQgdGhlIHN1cnJvdW5kIG9mIHRoZSBpbnB1dCBwaXhlbC4KKyAqIFRoZSBDb252b2x2ZU9wIGNsYXNzIGNvbnZvbHZlcyBmcm9tIHRoZSBzb3VyY2UgZGF0YSB0byB0aGUgZGVzdGluYXRpb24gdXNpbmcKKyAqIGEgY29udm9sdXRpb24ga2VybmVsLiBFYWNoIG91dHB1dCBwaXhlbCBpcyByZXByZXNlbnRlZCBhcyB0aGUgcmVzdWx0IG9mCisgKiBtdWx0aXBseWluZyB0aGUga2VybmVsIGFuZCB0aGUgc3Vycm91bmQgb2YgdGhlIGlucHV0IHBpeGVsLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIENvbnZvbHZlT3AgaW1wbGVtZW50cyBCdWZmZXJlZEltYWdlT3AsIFJhc3Rlck9wIHsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgRURHRV9aRVJPX0ZJTEwgaW5kaWNhdGVzIHRoYXQgcGl4ZWxzIGF0IHRoZSBlZGdlIG9mIAotICAgICAqIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSBhcmUgc2V0IHRvIHplcm8uIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBFREdFX1pFUk9fRklMTCBpbmRpY2F0ZXMgdGhhdCBwaXhlbHMgYXQgdGhlIGVkZ2Ugb2YgdGhlCisgICAgICogZGVzdGluYXRpb24gaW1hZ2UgYXJlIHNldCB0byB6ZXJvLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVER0VfWkVST19GSUxMID0gMDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgRURHRV9OT19PUCBpbmRpY2F0ZXMgdGhhdCBwaXhlbHMgYXQgdGhlIGVkZ2Ugb2YgCi0gICAgICogdGhlIHNvdXJjZSBpbWFnZSBhcmUgY29udmVydGVkIHRvIHRoZSBlZGdlIHBpeGVscyBpbiB0aGUgCi0gICAgICogZGVzdGluYXRpb24gd2l0aG91dCBtb2RpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEVER0VfTk9fT1AgaW5kaWNhdGVzIHRoYXQgcGl4ZWxzIGF0IHRoZSBlZGdlIG9mIHRoZSBzb3VyY2UKKyAgICAgKiBpbWFnZSBhcmUgY29udmVydGVkIHRvIHRoZSBlZGdlIHBpeGVscyBpbiB0aGUgZGVzdGluYXRpb24gd2l0aG91dAorICAgICAqIG1vZGlmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFREdFX05PX09QID0gMTsKIAotICAgIC8qKiBUaGUga2VybmVsLiAqLworICAgIC8qKgorICAgICAqIFRoZSBrZXJuZWwuCisgICAgICovCiAgICAgcHJpdmF0ZSBLZXJuZWwga2VybmVsOwotICAgIAotICAgIC8qKiBUaGUgZWRnZSBjb25kLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGVkZ2UgY29uZC4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBlZGdlQ29uZDsKLSAgICAKLSAgICAvKiogVGhlIHJocy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSByaHMuCisgICAgICovCiAgICAgcHJpdmF0ZSBSZW5kZXJpbmdIaW50cyByaHMgPSBudWxsOwogCiAgICAgc3RhdGljIHsKICAgICAgICAgLy8gVE9ETwotICAgICAgICAvL1N5c3RlbS5sb2FkTGlicmFyeSgiaW1hZ2VvcHMiKTsKKyAgICAgICAgLy8gU3lzdGVtLmxvYWRMaWJyYXJ5KCJpbWFnZW9wcyIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBDb252b2x2ZU9wIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgS2VybmVsCi0gICAgICogYW5kIHNwZWNpZmllZCBlZGdlcyBjb25kaXRpb24uCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IENvbnZvbHZlT3Agb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBLZXJuZWwgYW5kCisgICAgICogc3BlY2lmaWVkIGVkZ2VzIGNvbmRpdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2VybmVsIHRoZSBzcGVjaWZpZWQgS2VybmVsLgotICAgICAqIEBwYXJhbSBlZGdlQ29uZGl0aW9uIHRoZSBzcGVjaWZpZWQgZWRnZSBjb25kaXRpb24uCi0gICAgICogQHBhcmFtIGhpbnRzIHRoZSBSZW5kZXJpbmdIaW50cyBvYmplY3QsIG9yIG51bGwuCisgICAgICogQHBhcmFtIGtlcm5lbAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBLZXJuZWwuCisgICAgICogQHBhcmFtIGVkZ2VDb25kaXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgZWRnZSBjb25kaXRpb24uCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0LCBvciBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBDb252b2x2ZU9wKEtlcm5lbCBrZXJuZWwsIGludCBlZGdlQ29uZGl0aW9uLCBSZW5kZXJpbmdIaW50cyBoaW50cykgewogICAgICAgICB0aGlzLmtlcm5lbCA9IGtlcm5lbDsKQEAgLTgxLDEwICs5MSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBDb252b2x2ZU9wIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgS2VybmVsCi0gICAgICogYW5kIEVER0VfWkVST19GSUxMIGVkZ2UgY29uZGl0aW9uLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBDb252b2x2ZU9wIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgS2VybmVsIGFuZAorICAgICAqIEVER0VfWkVST19GSUxMIGVkZ2UgY29uZGl0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBrZXJuZWwgdGhlIHNwZWNpZmllZCBLZXJuZWwuCisgICAgICogQHBhcmFtIGtlcm5lbAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBLZXJuZWwuCiAgICAgICovCiAgICAgcHVibGljIENvbnZvbHZlT3AoS2VybmVsIGtlcm5lbCkgewogICAgICAgICB0aGlzLmtlcm5lbCA9IGtlcm5lbDsKQEAgLTk3LDcgKzEwOCw3IEBACiAgICAgICogQHJldHVybiB0aGUgS2VybmVsIG9iamVjdCBvZiB0aGlzIENvbnZvbHZlT3AuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIEtlcm5lbCBnZXRLZXJuZWwoKSB7Ci0gICAgICAgIHJldHVybiAoS2VybmVsKSBrZXJuZWwuY2xvbmUoKTsKKyAgICAgICAgcmV0dXJuIChLZXJuZWwpa2VybmVsLmNsb25lKCk7CiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIFJlbmRlcmluZ0hpbnRzIGdldFJlbmRlcmluZ0hpbnRzKCkgewpAQCAtMTQzLDE3ICsxNTQsMTEgQEAKICAgICAgICAgICAgIGRzdENNID0gQ29sb3JNb2RlbC5nZXRSR0JkZWZhdWx0KCk7CiAgICAgICAgIH0KIAotICAgICAgICBXcml0YWJsZVJhc3RlciByID0KLSAgICAgICAgICAgICAgICBkc3RDTS5pc0NvbXBhdGlibGVTYW1wbGVNb2RlbChzcmMuZ2V0U2FtcGxlTW9kZWwoKSkgPwotICAgICAgICAgICAgICAgIHNyYy5nZXRSYXN0ZXIoKS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSkgOgotICAgICAgICAgICAgICAgIGRzdENNLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpKTsKKyAgICAgICAgV3JpdGFibGVSYXN0ZXIgciA9IGRzdENNLmlzQ29tcGF0aWJsZVNhbXBsZU1vZGVsKHNyYy5nZXRTYW1wbGVNb2RlbCgpKSA/IHNyYy5nZXRSYXN0ZXIoKQorICAgICAgICAgICAgICAgIC5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSkgOiBkc3RDTQorICAgICAgICAgICAgICAgIC5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSk7CiAKLSAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZEltYWdlKAotICAgICAgICAgICAgICAgIGRzdENNLAotICAgICAgICAgICAgICAgIHIsCi0gICAgICAgICAgICAgICAgZHN0Q00uaXNBbHBoYVByZW11bHRpcGxpZWQoKSwKLSAgICAgICAgICAgICAgICBudWxsCi0gICAgICAgICk7CisgICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRJbWFnZShkc3RDTSwgciwgZHN0Q00uaXNBbHBoYVByZW11bHRpcGxpZWQoKSwgbnVsbCk7CiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIFdyaXRhYmxlUmFzdGVyIGZpbHRlcihSYXN0ZXIgc3JjLCBXcml0YWJsZVJhc3RlciBkc3QpIHsKQEAgLTE2Miw3ICsxNjcsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI1NiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHNyYyA9PSBkc3QpeworICAgICAgICBpZiAoc3JjID09IGRzdCkgewogICAgICAgICAgICAgLy8gYXd0LjI1Nz1Tb3VyY2UgcmFzdGVyIGlzIGVxdWFsIHRvIGRlc3RpbmF0aW9uCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI1NyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CkBAIC0xNzAsMTcgKzE3NSwxOCBAQAogICAgICAgICBpZiAoZHN0ID09IG51bGwpIHsKICAgICAgICAgICAgIGRzdCA9IGNyZWF0ZUNvbXBhdGlibGVEZXN0UmFzdGVyKHNyYyk7CiAgICAgICAgIH0gZWxzZSBpZiAoc3JjLmdldE51bUJhbmRzKCkgIT0gZHN0LmdldE51bUJhbmRzKCkpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yNTg9TnVtYmVyIG9mIHNvdXJjZSBiYW5kcyAoezB9KSBpcyBub3QgZXF1YWwgdG8gbnVtYmVyIG9mIGRlc3RpbmF0aW9uIGJhbmRzICh7MX0pCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI1OCIsIHNyYy5nZXROdW1CYW5kcygpLCBkc3QuZ2V0TnVtQmFuZHMoKSkpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAvLyBhd3QuMjU4PU51bWJlciBvZiBzb3VyY2UgYmFuZHMgKHswfSkgaXMgbm90IGVxdWFsIHRvIG51bWJlciBvZgorICAgICAgICAgICAgLy8gZGVzdGluYXRpb24gYmFuZHMgKHsxfSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAiYXd0LjI1OCIsIHNyYy5nZXROdW1CYW5kcygpLCBkc3QuZ2V0TnVtQmFuZHMoKSkpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAogICAgICAgICAvLyBUT0RPCi0gICAgICAgIC8vaWYgKGlwcEZpbHRlcihzcmMsIGRzdCwgQnVmZmVyZWRJbWFnZS5UWVBFX0NVU1RPTSkgIT0gMCkKLSAgICAgICAgICAgIGlmIChzbG93RmlsdGVyKHNyYywgZHN0KSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjIxRj1VbmFibGUgdG8gdHJhbnNmb3JtIHNvdXJjZQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbWFnaW5nT3BFeGNlcHRpb24gKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxRiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQorICAgICAgICAvLyBpZiAoaXBwRmlsdGVyKHNyYywgZHN0LCBCdWZmZXJlZEltYWdlLlRZUEVfQ1VTVE9NKSAhPSAwKQorICAgICAgICBpZiAoc2xvd0ZpbHRlcihzcmMsIGRzdCkgIT0gMCkgeworICAgICAgICAgICAgLy8gYXd0LjIxRj1VbmFibGUgdG8gdHJhbnNmb3JtIHNvdXJjZQorICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdpbmdPcEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMUYiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBkc3Q7CiAgICAgfQpAQCAtMTg4LDEwICsxOTQsMTEgQEAKICAgICAvKioKICAgICAgKiBTbG93IGZpbHRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBzcmMKLSAgICAgKiBAcGFyYW0gZHN0IHRoZSBkc3QKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQKKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgc3JjLgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3QuCisgICAgICogQHJldHVybiB0aGUgaW50LgogICAgICAqLwogICAgIHByaXZhdGUgaW50IHNsb3dGaWx0ZXIoUmFzdGVyIHNyYywgV3JpdGFibGVSYXN0ZXIgZHN0KSB7CiAgICAgICAgIHRyeSB7CkBAIC0yMTksNyArMjI2LDcgQEAKICAgICAgICAgICAgIGludFtdIG1hc2tzID0gbmV3IGludFtudW1CYW5kc107CiAgICAgICAgICAgICBpbnRbXSBzYW1wbGVTaXplcyA9IHNtLmdldFNhbXBsZVNpemUoKTsKIAotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgbnVtQmFuZHM7IGkrKyl7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKICAgICAgICAgICAgICAgICBtYXhWYWx1ZXNbaV0gPSAoMSA8PCBzYW1wbGVTaXplc1tpXSkgLSAxOwogICAgICAgICAgICAgICAgIG1hc2tzW2ldID0gfihtYXhWYWx1ZXNbaV0pOwogICAgICAgICAgICAgfQpAQCAtMjI4LDYxICsyMzUsNTYgQEAKICAgICAgICAgICAgIGZsb2F0W10gcGl4ZWxzID0gbnVsbDsKICAgICAgICAgICAgIHBpeGVscyA9IHNyYy5nZXRQaXhlbHMoc3JjTWluWCwgc3JjTWluWSwgc3JjV2lkdGgsIHNyY0hlaWdodCwgcGl4ZWxzKTsKICAgICAgICAgICAgIGZsb2F0W10gbmV3UGl4ZWxzID0gbmV3IGZsb2F0W3BpeGVscy5sZW5ndGhdOwotICAgICAgICAgICAgaW50IHJvd0xlbmd0aCA9IHNyY1dpZHRoKm51bUJhbmRzOwotICAgICAgICAgICAgaWYgKHRoaXMuZWRnZUNvbmQgPT0gQ29udm9sdmVPcC5FREdFX05PX09QKXsKKyAgICAgICAgICAgIGludCByb3dMZW5ndGggPSBzcmNXaWR0aCAqIG51bUJhbmRzOworICAgICAgICAgICAgaWYgKHRoaXMuZWRnZUNvbmQgPT0gQ29udm9sdmVPcC5FREdFX05PX09QKSB7CiAgICAgICAgICAgICAgICAgLy8gdG9wCiAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0geU9yaWdpbipyb3dMZW5ndGg7CisgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IHlPcmlnaW4gKiByb3dMZW5ndGg7CiAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwaXhlbHMsIHN0YXJ0LCBuZXdQaXhlbHMsIHN0YXJ0LCBsZW5ndGgpOwogICAgICAgICAgICAgICAgIC8vIGJvdHRvbQotICAgICAgICAgICAgICAgIHN0YXJ0ID0gKHNyY0hlaWdodCAtIChrSGVpZ2h0IC0geU9yaWdpbiAtIDEpKSpyb3dMZW5ndGg7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoID0gKGtIZWlnaHQgLSB5T3JpZ2luIC0gMSkqcm93TGVuZ3RoOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gKHNyY0hlaWdodCAtIChrSGVpZ2h0IC0geU9yaWdpbiAtIDEpKSAqIHJvd0xlbmd0aDsKKyAgICAgICAgICAgICAgICBsZW5ndGggPSAoa0hlaWdodCAtIHlPcmlnaW4gLSAxKSAqIHJvd0xlbmd0aDsKICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBpeGVscywgc3RhcnQsIG5ld1BpeGVscywgc3RhcnQsIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgLy8gbWlkZGxlCi0gICAgICAgICAgICAgICAgbGVuZ3RoID0geE9yaWdpbipudW1CYW5kczsKLSAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoMSA9IChrV2lkdGggLSB4T3JpZ2luIC0gMSkqbnVtQmFuZHM7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSB5T3JpZ2luKnJvd0xlbmd0aDsKLSAgICAgICAgICAgICAgICBpbnQgc3RhcnQxID0gKHlPcmlnaW4rMSkqcm93TGVuZ3RoIC0gbGVuZ3RoMTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0geU9yaWdpbjsgaSA8IChzcmNIZWlnaHQgLSAoa0hlaWdodCAtIHlPcmlnaW4gLSAxKSk7IGkgKyspIHsKKyAgICAgICAgICAgICAgICBsZW5ndGggPSB4T3JpZ2luICogbnVtQmFuZHM7CisgICAgICAgICAgICAgICAgaW50IGxlbmd0aDEgPSAoa1dpZHRoIC0geE9yaWdpbiAtIDEpICogbnVtQmFuZHM7CisgICAgICAgICAgICAgICAgc3RhcnQgPSB5T3JpZ2luICogcm93TGVuZ3RoOworICAgICAgICAgICAgICAgIGludCBzdGFydDEgPSAoeU9yaWdpbiArIDEpICogcm93TGVuZ3RoIC0gbGVuZ3RoMTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0geU9yaWdpbjsgaSA8IChzcmNIZWlnaHQgLSAoa0hlaWdodCAtIHlPcmlnaW4gLSAxKSk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBpeGVscywgc3RhcnQsIG5ld1BpeGVscywgc3RhcnQsIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocGl4ZWxzLCBzdGFydDEsIG5ld1BpeGVscywgc3RhcnQxLCBsZW5ndGgxKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz1yb3dMZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0MSArPXJvd0xlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gcm93TGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBzdGFydDEgKz0gcm93TGVuZ3RoOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBDeWNsZSBvdmVyIHBpeGVscyB0byBiZSBjYWxjdWxhdGVkCi0gICAgICAgICAgICBmb3IgKGludCBpID0geU9yaWdpbjsgaSA8IHNyY0NvbnZNYXhZOyBpKyspewotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB4T3JpZ2luOyBqIDwgc3JjQ29udk1heFg7IGorKyl7CisgICAgICAgICAgICBmb3IgKGludCBpID0geU9yaWdpbjsgaSA8IHNyY0NvbnZNYXhZOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0geE9yaWdpbjsgaiA8IHNyY0NvbnZNYXhYOyBqKyspIHsKIAogICAgICAgICAgICAgICAgICAgICAvLyBUYWtlIGtlcm5lbCBkYXRhIGluIGJhY2t3YXJkIGRpcmVjdGlvbiwgY29udm9sdXRpb24KICAgICAgICAgICAgICAgICAgICAgaW50IGtlcm5lbElkeCA9IGRhdGEubGVuZ3RoIC0gMTsKIAogICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxJbmRleCA9IGkgKiByb3dMZW5ndGggKyBqICogbnVtQmFuZHM7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGhJZHggPSAwLCByYXN0ZXJISWR4ID0gaSAtIHlPcmlnaW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaElkeCA8IGtIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaElkeCsrLCByYXN0ZXJISWR4KysKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgd0lkeCA9IDAsIHJhc3RlcldJZHggPSBqIC0geE9yaWdpbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0lkeCA8IGtXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0lkeCsrLCByYXN0ZXJXSWR4KysKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKXsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaElkeCA9IDAsIHJhc3RlckhJZHggPSBpIC0geU9yaWdpbjsgaElkeCA8IGtIZWlnaHQ7IGhJZHgrKywgcmFzdGVySElkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCB3SWR4ID0gMCwgcmFzdGVyV0lkeCA9IGogLSB4T3JpZ2luOyB3SWR4IDwga1dpZHRoOyB3SWR4KyssIHJhc3RlcldJZHgrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdXJJbmRleCA9IHJhc3RlckhJZHggKiByb3dMZW5ndGggKyByYXN0ZXJXSWR4ICogbnVtQmFuZHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaWR4PTA7IGlkeCA8IG51bUJhbmRzOyBpZHgrKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BpeGVsc1twaXhlbEluZGV4K2lkeF0gKz0gZGF0YVtrZXJuZWxJZHhdICogcGl4ZWxzW2N1ckluZGV4K2lkeF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgbnVtQmFuZHM7IGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BpeGVsc1twaXhlbEluZGV4ICsgaWR4XSArPSBkYXRhW2tlcm5lbElkeF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBpeGVsc1tjdXJJbmRleCArIGlkeF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbElkeC0tOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIG92ZXJmbG93IG5vdwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpZHg9MDsgaWR4IDwgbnVtQmFuZHM7IGlkeCsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGludCluZXdQaXhlbHNbcGl4ZWxJbmRleCtpZHhdICYgbWFza3NbaWR4XSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdQaXhlbHNbcGl4ZWxJbmRleCtpZHhdIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQaXhlbHNbcGl4ZWxJbmRleCtpZHhdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgbnVtQmFuZHM7IGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChpbnQpbmV3UGl4ZWxzW3BpeGVsSW5kZXggKyBpZHhdICYgbWFza3NbaWR4XSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdQaXhlbHNbcGl4ZWxJbmRleCArIGlkeF0gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BpeGVsc1twaXhlbEluZGV4ICsgaWR4XSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGl4ZWxzW3BpeGVsSW5kZXgraWR4XSA9IG1heFZhbHVlc1tpZHhdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQaXhlbHNbcGl4ZWxJbmRleCArIGlkeF0gPSBtYXhWYWx1ZXNbaWR4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTMwMiw3ICszMDQsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI1OSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHNyYyA9PSBkc3QpeworICAgICAgICBpZiAoc3JjID09IGRzdCkgewogICAgICAgICAgICAgLy8gYXd0LjI1QT1Tb3VyY2UgZXF1YWxzIHRvIGRlc3RpbmF0aW9uCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI1QSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CkBAIC0zMTksMTMgKzMyMSwxMCBAQAogICAgICAgICAgICAgZHN0ID0gY3JlYXRlQ29tcGF0aWJsZURlc3RJbWFnZShzcmMsIHNyY0NNKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmICghc3JjQ00uZXF1YWxzKGRzdC5nZXRDb2xvck1vZGVsKCkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVHJlYXQgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IgYW5kIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQiBhcyBzYW1lCi0gICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAgICAgISgoc3JjLmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChkc3QuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQikpCi0gICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgLy8gVHJlYXQgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IgYW5kCisgICAgICAgICAgICAgICAgLy8gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCIGFzIHNhbWUKKyAgICAgICAgICAgICAgICBpZiAoISgoc3JjLmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQiB8fCBzcmMuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQikgJiYgKGRzdAorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQiB8fCBkc3QuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQikpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsRHN0ID0gZHN0OwogICAgICAgICAgICAgICAgICAgICBkc3QgPSBjcmVhdGVDb21wYXRpYmxlRGVzdEltYWdlKHNyYywgc3JjQ00pOwogICAgICAgICAgICAgICAgIH0KQEAgLTMzNCwxMSArMzMzLDExIEBACiAKICAgICAgICAgLy8gU2tpcCBhbHBoYSBjaGFubmVsIGZvciBUWVBFX0lOVF9SR0IgaW1hZ2VzCiAgICAgICAgIC8vIFRPRE8KLSAgICAgICAgLy9pZiAoaXBwRmlsdGVyKHNyYy5nZXRSYXN0ZXIoKSwgZHN0LmdldFJhc3RlcigpLCBzcmMuZ2V0VHlwZSgpKSAhPSAwKQotICAgICAgICAgICAgaWYgKHNsb3dGaWx0ZXIoc3JjLmdldFJhc3RlcigpLCBkc3QuZ2V0UmFzdGVyKCkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBhd3QuMjFGPVVuYWJsZSB0byB0cmFuc2Zvcm0gc291cmNlCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdpbmdPcEV4Y2VwdGlvbiAoTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjFGIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9CisgICAgICAgIC8vIGlmIChpcHBGaWx0ZXIoc3JjLmdldFJhc3RlcigpLCBkc3QuZ2V0UmFzdGVyKCksIHNyYy5nZXRUeXBlKCkpICE9IDApCisgICAgICAgIGlmIChzbG93RmlsdGVyKHNyYy5nZXRSYXN0ZXIoKSwgZHN0LmdldFJhc3RlcigpKSAhPSAwKSB7CisgICAgICAgICAgICAvLyBhd3QuMjFGPVVuYWJsZSB0byB0cmFuc2Zvcm0gc291cmNlCisgICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxRiIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CiAKICAgICAgICAgaWYgKGZpbmFsRHN0ICE9IG51bGwpIHsKICAgICAgICAgICAgIEdyYXBoaWNzMkQgZyA9IGZpbmFsRHN0LmNyZWF0ZUdyYXBoaWNzKCk7CkBAIC0zNTUsMTEgKzM1NCwxMyBAQAogICAgIC8qKgogICAgICAqIElwcCBmaWx0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc3JjCi0gICAgICogQHBhcmFtIGRzdCB0aGUgZHN0Ci0gICAgICogQHBhcmFtIGltYWdlVHlwZSB0aGUgaW1hZ2UgdHlwZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludAorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIGRzdC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiAgICAgcHJpdmF0ZSBpbnQgaXBwRmlsdGVyKFJhc3RlciBzcmMsIFdyaXRhYmxlUmFzdGVyIGRzdCwgaW50IGltYWdlVHlwZSkgewpAQCAtMzcyLDggKzM3Myw4IEBACiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCOgogICAgICAgICAgICAgY2FzZSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0JHUjogewogICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gNDsKLSAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSBzcmMuZ2V0V2lkdGgoKSo0OwotICAgICAgICAgICAgICAgIGRzdFN0cmlkZSA9IGRzdC5nZXRXaWR0aCgpKjQ7CisgICAgICAgICAgICAgICAgc3JjU3RyaWRlID0gc3JjLmdldFdpZHRoKCkgKiA0OworICAgICAgICAgICAgICAgIGRzdFN0cmlkZSA9IGRzdC5nZXRXaWR0aCgpICogNDsKICAgICAgICAgICAgICAgICBza2lwQ2hhbm5lbCA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0zODMsOCArMzg0LDggQEAKICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFXzRCWVRFX0FCR1I6CiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV80QllURV9BQkdSX1BSRTogewogICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gNDsKLSAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSBzcmMuZ2V0V2lkdGgoKSo0OwotICAgICAgICAgICAgICAgIGRzdFN0cmlkZSA9IGRzdC5nZXRXaWR0aCgpKjQ7CisgICAgICAgICAgICAgICAgc3JjU3RyaWRlID0gc3JjLmdldFdpZHRoKCkgKiA0OworICAgICAgICAgICAgICAgIGRzdFN0cmlkZSA9IGRzdC5nZXRXaWR0aCgpICogNDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMzk3LDEyICszOTgsMTMgQEAKIAogICAgICAgICAgICAgY2FzZSBCdWZmZXJlZEltYWdlLlRZUEVfM0JZVEVfQkdSOiB7CiAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSAzOwotICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpKjM7Ci0gICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkqMzsKKyAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSBzcmMuZ2V0V2lkdGgoKSAqIDM7CisgICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkgKiAzOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9VU0hPUlRfR1JBWTogLy8gVE9ETyAtIGNvdWxkIGJlIGRvbmUgaW4gbmF0aXZlIGNvZGU/CisgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9VU0hPUlRfR1JBWTogLy8gVE9ETyAtIGNvdWxkIGJlIGRvbmUgaW4KKyAgICAgICAgICAgICAgICAvLyBuYXRpdmUgY29kZT8KICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFX1VTSE9SVF81NjVfUkdCOgogICAgICAgICAgICAgY2FzZSBCdWZmZXJlZEltYWdlLlRZUEVfVVNIT1JUXzU1NV9SR0I6CiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9CWVRFX0JJTkFSWTogewpAQCAtNDEzLDU5ICs0MTUsNTEgQEAKICAgICAgICAgICAgICAgICBTYW1wbGVNb2RlbCBzcmNTTSA9IHNyYy5nZXRTYW1wbGVNb2RlbCgpOwogICAgICAgICAgICAgICAgIFNhbXBsZU1vZGVsIGRzdFNNID0gZHN0LmdldFNhbXBsZU1vZGVsKCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAgICAgICBzcmNTTSBpbnN0YW5jZW9mIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgZHN0U00gaW5zdGFuY2VvZiBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwKLSAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBpZiAoc3JjU00gaW5zdGFuY2VvZiBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGRzdFNNIGluc3RhbmNlb2YgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbAotICAgICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjU00uZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFNNLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUKLSAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcmNTTS5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZHN0U00uZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNsb3dGaWx0ZXIoc3JjLCBkc3QpOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSBzcmNTTS5nZXROdW1CYW5kcygpOyAvLyBIYXZlIElQUCBmdW5jdGlvbnMgZm9yIDEsIDMgYW5kIDQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSBzcmNTTS5nZXROdW1CYW5kcygpOyAvLyBIYXZlIElQUCBmdW5jdGlvbnMgZm9yIDEsCisgICAgICAgICAgICAgICAgICAgIC8vIDMgYW5kIDQgY2hhbm5lbHMKICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY2hhbm5lbHMgPT0gMSB8fCBjaGFubmVscyA9PSAzIHx8IGNoYW5uZWxzID09IDQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2xvd0ZpbHRlcihzcmMsIGRzdCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSAoKENvbXBvbmVudFNhbXBsZU1vZGVsKSBzcmNTTSkuZ2V0U2NhbmxpbmVTdHJpZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gKChDb21wb25lbnRTYW1wbGVNb2RlbCkgZHN0U00pLmdldFNjYW5saW5lU3RyaWRlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NNIGluc3RhbmNlb2YgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgZHN0U00gaW5zdGFuY2VvZiBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsCi0gICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9ICgoQ29tcG9uZW50U2FtcGxlTW9kZWwpc3JjU00pLmdldFNjYW5saW5lU3RyaWRlKCk7CisgICAgICAgICAgICAgICAgICAgIGRzdFN0cmlkZSA9ICgoQ29tcG9uZW50U2FtcGxlTW9kZWwpZHN0U00pLmdldFNjYW5saW5lU3RyaWRlKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNTTSBpbnN0YW5jZW9mIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGRzdFNNIGluc3RhbmNlb2YgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkgewogICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsCi0gICAgICAgICAgICAgICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgc3Bwc20xID0gKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpIHNyY1NNOwotICAgICAgICAgICAgICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNwcHNtMiA9IChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKSBkc3RTTTsKKyAgICAgICAgICAgICAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBzcHBzbTEgPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbClzcmNTTTsKKyAgICAgICAgICAgICAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBzcHBzbTIgPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbClkc3RTTTsKIAogICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9IHNwcHNtMS5nZXROdW1CYW5kcygpOwogCi0gICAgICAgICAgICAgICAgICAgICAvLyBUWVBFX0lOVF9SR0IsIFRZUEVfSU5UX0FSR0IuLi4KLSAgICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcHNtMS5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9JTlQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHBzbTIuZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfSU5UIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShjaGFubmVscyA9PSAzIHx8IGNoYW5uZWxzID09IDQpCi0gICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICAvLyBUWVBFX0lOVF9SR0IsIFRZUEVfSU5UX0FSR0IuLi4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwcHNtMS5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9JTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzcHBzbTIuZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfSU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIShjaGFubmVscyA9PSAzIHx8IGNoYW5uZWxzID09IDQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2xvd0ZpbHRlcihzcmMsIGRzdCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBjb21wYXRpYmlsaXR5IG9mIHNhbXBsZSBtb2RlbHMKLSAgICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRPZmZzZXRzKCksIHNwcHNtMi5nZXRCaXRPZmZzZXRzKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIUFycmF5cy5lcXVhbHMoc3Bwc20xLmdldEJpdE1hc2tzKCksIHNwcHNtMi5nZXRCaXRNYXNrcygpKQotICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRPZmZzZXRzKCksIHNwcHNtMi5nZXRCaXRPZmZzZXRzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIUFycmF5cy5lcXVhbHMoc3Bwc20xLmdldEJpdE1hc2tzKCksIHNwcHNtMi5nZXRCaXRNYXNrcygpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNsb3dGaWx0ZXIoc3JjLCBkc3QpOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Bwc20xLmdldFNhbXBsZVNpemUoaSkgIT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzbG93RmlsdGVyKHNyYywgZHN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaGFubmVscyA9PSAzKSB7IC8vIENhbm5vdCBza2lwIGNoYW5uZWwsIGRvbid0IGtub3cgd2hpY2ggaXMgYWxwaGEuLi4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxzID09IDMpIHsgLy8gQ2Fubm90IHNraXAgY2hhbm5lbCwgZG9uJ3Qga25vdworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaXMgYWxwaGEuLi4KICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gNDsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC00NzcsMTIgKzQ3MSw5IEBACiAKICAgICAgICAgICAgICAgICAvLyBGaWxsIG9mZnNldHMgaWYgdGhlcmUncyBhIGNoaWxkIHJhc3RlcgogICAgICAgICAgICAgICAgIGlmIChzcmMuZ2V0UGFyZW50KCkgIT0gbnVsbCB8fCBkc3QuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpICE9IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgIT0gMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSAhPSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpICE9IDAKLSAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgIT0gMCB8fCBzcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgIT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRzdC5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZHN0LmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHMgPSBuZXcgaW50WzRdOwogICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0c1swXSA9IC1zcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgKyBzcmMuZ2V0TWluWCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0c1sxXSA9IC1zcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgKyBzcmMuZ2V0TWluWSgpOwpAQCAtNTAyLDQ0ICs0OTMsNTMgQEAKICAgICAgICAgICAgIHJldHVybiAtMTsgLy8gVW5rbm93biBkYXRhIGJ1ZmZlciB0eXBlCiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gaXBwRmlsdGVyMzJmKAotICAgICAgICAgICAga2VybmVsLmRhdGEsIGtlcm5lbC5nZXRXaWR0aCgpLCBrZXJuZWwuZ2V0SGVpZ2h0KCksCi0gICAgICAgICAgICBrZXJuZWwuZ2V0WE9yaWdpbigpLCBrZXJuZWwuZ2V0WU9yaWdpbigpLCBlZGdlQ29uZCwKLSAgICAgICAgICAgIHNyY0RhdGEsIHNyYy5nZXRXaWR0aCgpLCBzcmMuZ2V0SGVpZ2h0KCksIHNyY1N0cmlkZSwKLSAgICAgICAgICAgIGRzdERhdGEsIGRzdC5nZXRXaWR0aCgpLCBkc3QuZ2V0SGVpZ2h0KCksIGRzdFN0cmlkZSwKLSAgICAgICAgICAgIGNoYW5uZWxzLCBza2lwQ2hhbm5lbCwgb2Zmc2V0cwotICAgICAgICApOworICAgICAgICByZXR1cm4gaXBwRmlsdGVyMzJmKGtlcm5lbC5kYXRhLCBrZXJuZWwuZ2V0V2lkdGgoKSwga2VybmVsLmdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgIGtlcm5lbC5nZXRYT3JpZ2luKCksIGtlcm5lbC5nZXRZT3JpZ2luKCksIGVkZ2VDb25kLCBzcmNEYXRhLCBzcmMuZ2V0V2lkdGgoKSwgc3JjCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SGVpZ2h0KCksIHNyY1N0cmlkZSwgZHN0RGF0YSwgZHN0LmdldFdpZHRoKCksIGRzdC5nZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICBkc3RTdHJpZGUsIGNoYW5uZWxzLCBza2lwQ2hhbm5lbCwgb2Zmc2V0cyk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogSXBwIGZpbHRlcjMyZi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2VybmVsIHRoZSBrZXJuZWwKLSAgICAgKiBAcGFyYW0ga1dpZHRoIHRoZSBrIHdpZHRoCi0gICAgICogQHBhcmFtIGtIZWlnaHQgdGhlIGsgaGVpZ2h0Ci0gICAgICogQHBhcmFtIGFuY2hvclggdGhlIGFuY2hvciB4Ci0gICAgICogQHBhcmFtIGFuY2hvclkgdGhlIGFuY2hvciB5Ci0gICAgICogQHBhcmFtIGJvcmRlclR5cGUgdGhlIGJvcmRlciB0eXBlCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc3JjCi0gICAgICogQHBhcmFtIHNyY1dpZHRoIHRoZSBzcmMgd2lkdGgKLSAgICAgKiBAcGFyYW0gc3JjSGVpZ2h0IHRoZSBzcmMgaGVpZ2h0Ci0gICAgICogQHBhcmFtIHNyY1N0cmlkZSB0aGUgc3JjIHN0cmlkZQotICAgICAqIEBwYXJhbSBkc3QgdGhlIGRzdAotICAgICAqIEBwYXJhbSBkc3RXaWR0aCB0aGUgZHN0IHdpZHRoCi0gICAgICogQHBhcmFtIGRzdEhlaWdodCB0aGUgZHN0IGhlaWdodAotICAgICAqIEBwYXJhbSBkc3RTdHJpZGUgdGhlIGRzdCBzdHJpZGUKLSAgICAgKiBAcGFyYW0gY2hhbm5lbHMgdGhlIGNoYW5uZWxzCi0gICAgICogQHBhcmFtIHNraXBDaGFubmVsIHRoZSBza2lwIGNoYW5uZWwKLSAgICAgKiBAcGFyYW0gb2Zmc2V0cyB0aGUgb2Zmc2V0cwotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludAorICAgICAqIEBwYXJhbSBrZXJuZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXJuZWwuCisgICAgICogQHBhcmFtIGtXaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIGsgd2lkdGguCisgICAgICogQHBhcmFtIGtIZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBrIGhlaWdodC4KKyAgICAgKiBAcGFyYW0gYW5jaG9yWAorICAgICAqICAgICAgICAgICAgdGhlIGFuY2hvciB4LgorICAgICAqIEBwYXJhbSBhbmNob3JZCisgICAgICogICAgICAgICAgICB0aGUgYW5jaG9yIHkuCisgICAgICogQHBhcmFtIGJvcmRlclR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBib3JkZXIgdHlwZS4KKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgc3JjLgorICAgICAqIEBwYXJhbSBzcmNXaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHNyYyB3aWR0aC4KKyAgICAgKiBAcGFyYW0gc3JjSGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgc3JjIGhlaWdodC4KKyAgICAgKiBAcGFyYW0gc3JjU3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgc3JjIHN0cmlkZS4KKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICB0aGUgZHN0LgorICAgICAqIEBwYXJhbSBkc3RXaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIGRzdCB3aWR0aC4KKyAgICAgKiBAcGFyYW0gZHN0SGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgZHN0IGhlaWdodC4KKyAgICAgKiBAcGFyYW0gZHN0U3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgZHN0IHN0cmlkZS4KKyAgICAgKiBAcGFyYW0gY2hhbm5lbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFubmVscy4KKyAgICAgKiBAcGFyYW0gc2tpcENoYW5uZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBza2lwIGNoYW5uZWwuCisgICAgICogQHBhcmFtIG9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXRzLgorICAgICAqIEByZXR1cm4gdGhlIGludC4KICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSBpbnQgaXBwRmlsdGVyMzJmKAotICAgICAgICAgICAgICAgIGZsb2F0IGtlcm5lbFtdLCBpbnQga1dpZHRoLCBpbnQga0hlaWdodCwKLSAgICAgICAgICAgICAgICBpbnQgYW5jaG9yWCwgaW50IGFuY2hvclksIGludCBib3JkZXJUeXBlLAotICAgICAgICAgICAgICAgIE9iamVjdCBzcmMsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwgaW50IHNyY1N0cmlkZSwKLSAgICAgICAgICAgICAgICBPYmplY3QgZHN0LCBpbnQgZHN0V2lkdGgsIGludCBkc3RIZWlnaHQsIGludCBkc3RTdHJpZGUsCi0gICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzLCBib29sZWFuIHNraXBDaGFubmVsLCBpbnQgb2Zmc2V0c1tdCi0gICAgICAgICAgICApOworICAgIHByaXZhdGUgbmF0aXZlIGludCBpcHBGaWx0ZXIzMmYoZmxvYXQga2VybmVsW10sIGludCBrV2lkdGgsIGludCBrSGVpZ2h0LCBpbnQgYW5jaG9yWCwKKyAgICAgICAgICAgIGludCBhbmNob3JZLCBpbnQgYm9yZGVyVHlwZSwgT2JqZWN0IHNyYywgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LCBpbnQgc3JjU3RyaWRlLAorICAgICAgICAgICAgT2JqZWN0IGRzdCwgaW50IGRzdFdpZHRoLCBpbnQgZHN0SGVpZ2h0LCBpbnQgZHN0U3RyaWRlLCBpbnQgY2hhbm5lbHMsCisgICAgICAgICAgICBib29sZWFuIHNraXBDaGFubmVsLCBpbnQgb2Zmc2V0c1tdKTsKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0Nyb3BJbWFnZUZpbHRlci5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0Nyb3BJbWFnZUZpbHRlci5qYXZhCmluZGV4IGU5MGM0NGEuLjJmNGNhNzggMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9Dcm9wSW1hZ2VGaWx0ZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQ3JvcEltYWdlRmlsdGVyLmphdmEKQEAgLTE4LDI4ICsxOCwzNiBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogCiAvKioKLSAqIFRoZSBDcm9wSW1hZ2VGaWx0ZXIgY2xhc3MgY3JvcHMgYSByZWN0YW5ndWxhciByZWdpb24gb2YgYW4gc291cmNlCi0gKiBJbWFnZSBhbmQgcHJvdmlkZXMgYSBzb3VyY2UgZm9yIGEgbmV3IGltYWdlIGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCAKLSAqIHJlZ2lvbi4KKyAqIFRoZSBDcm9wSW1hZ2VGaWx0ZXIgY2xhc3MgY3JvcHMgYSByZWN0YW5ndWxhciByZWdpb24gb2YgYW4gc291cmNlIEltYWdlIGFuZAorICogcHJvdmlkZXMgYSBzb3VyY2UgZm9yIGEgbmV3IGltYWdlIGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCByZWdpb24uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ3JvcEltYWdlRmlsdGVyIGV4dGVuZHMgSW1hZ2VGaWx0ZXIgewogCi0gICAgLyoqIFRoZSBIRUlHSFQuICovCisgICAgLyoqCisgICAgICogVGhlIEhFSUdIVC4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIGludCBYLCBZLCBXSURUSCwgSEVJR0hUOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IENyb3BJbWFnZUZpbHRlciBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICogcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQ3JvcEltYWdlRmlsdGVyIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIKKyAgICAgKiBhcmVhLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgcmVjdGFuZ3VsYXIgYXJlYS4gCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3Rhbmd1bGFyIGFyZWEuCiAgICAgICovCiAgICAgcHVibGljIENyb3BJbWFnZUZpbHRlcihpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkgewogICAgICAgICBYID0geDsKQEAgLTUyLDIwICs2MCwyMCBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoSGFzaHRhYmxlPD8sID8+IHByb3BzKSB7CiAgICAgICAgIEhhc2h0YWJsZTxPYmplY3QsIE9iamVjdD4gZnByb3BzOwotICAgICAgICBpZihwcm9wcyA9PSBudWxsKSB7CisgICAgICAgIGlmIChwcm9wcyA9PSBudWxsKSB7CiAgICAgICAgICAgICBmcHJvcHMgPSBuZXcgSGFzaHRhYmxlPE9iamVjdCwgT2JqZWN0PigpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZnByb3BzID0gKEhhc2h0YWJsZTxPYmplY3QsIE9iamVjdD4pIHByb3BzLmNsb25lKCk7CisgICAgICAgICAgICBmcHJvcHMgPSAoSGFzaHRhYmxlPE9iamVjdCwgT2JqZWN0Pilwcm9wcy5jbG9uZSgpOwogICAgICAgICB9CiAgICAgICAgIFN0cmluZyBwcm9wTmFtZSA9ICJDcm9wIEZpbHRlcnMiOyAvLyROT04tTkxTLTEkCiAgICAgICAgIFN0cmluZyBwcm9wID0gIng9IiArIFggKyAiOyB5PSIgKyBZICsgIjsgd2lkdGg9IiArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICAgIFdJRFRIICsgIjsgaGVpZ2h0PSIgKyBIRUlHSFQ7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICBXSURUSCArICI7IGhlaWdodD0iICsgSEVJR0hUOyAvLyROT04tTkxTLTEkCiAgICAgICAgIE9iamVjdCBvID0gZnByb3BzLmdldChwcm9wTmFtZSk7Ci0gICAgICAgIGlmKG8gIT0gbnVsbCl7Ci0gICAgICAgICAgICBpZihvIGluc3RhbmNlb2YgU3RyaW5nKXsKKyAgICAgICAgaWYgKG8gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKICAgICAgICAgICAgICAgICBwcm9wID0gKFN0cmluZylvICsgIjsgIiArIHByb3A7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIHByb3AgPSAgby50b1N0cmluZygpICsgIjsgIiArIHByb3A7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJvcCA9IG8udG9TdHJpbmcoKSArICI7ICIgKyBwcm9wOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZnByb3BzLnB1dChwcm9wTmFtZSwgcHJvcCk7CkBAIC03MywxNSArODEsMTQgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgbW9kZWwsIGludFtdIHBpeGVscywgaW50IG9mZiwgaW50IHNjYW5zaXplKSB7CisgICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBDb2xvck1vZGVsIG1vZGVsLCBpbnRbXSBwaXhlbHMsIGludCBvZmYsCisgICAgICAgICAgICBpbnQgc2NhbnNpemUpIHsKIAotICAgICAgICBpZih4ICsgdyA8IFggfHwgWCArIFdJRFRIIDwgeCB8fAotICAgICAgICAgICAgICAgIHkgKyBoIDwgWSB8fCBZICsgSEVJR0hUIDwgeSkgeworICAgICAgICBpZiAoeCArIHcgPCBYIHx8IFggKyBXSURUSCA8IHggfHwgeSArIGggPCBZIHx8IFkgKyBIRUlHSFQgPCB5KSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgZGVzdFgsIGRlc3RZLCBkZXN0V2lkdGgsIGRlc3RIZWlnaHQsIGVuZFgsIGVuZFksCi0gICAgICAgIHNyY0VuZFgsIHNyY0VuZFk7CisgICAgICAgIGludCBkZXN0WCwgZGVzdFksIGRlc3RXaWR0aCwgZGVzdEhlaWdodCwgZW5kWCwgZW5kWSwgc3JjRW5kWCwgc3JjRW5kWTsKIAogICAgICAgICBpbnQgbmV3T2Zmc2V0ID0gb2ZmOwogCkBAIC05MSwzNyArOTgsMzYgQEAKICAgICAgICAgc3JjRW5kWCA9IHggKyB3OwogICAgICAgICBzcmNFbmRZID0geSArIGg7CiAKLSAgICAgICAgaWYoeCA8PSBYKXsKKyAgICAgICAgaWYgKHggPD0gWCkgewogICAgICAgICAgICAgZGVzdFggPSAwOwogICAgICAgICAgICAgbmV3T2Zmc2V0ICs9IFg7Ci0gICAgICAgICAgICBpZihlbmRYID49IHNyY0VuZFgpeworICAgICAgICAgICAgaWYgKGVuZFggPj0gc3JjRW5kWCkgewogICAgICAgICAgICAgICAgIGRlc3RXaWR0aCA9IHNyY0VuZFggLSBYOwotICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGRlc3RXaWR0aCA9IFdJRFRIOwogICAgICAgICAgICAgfQotICAgICAgICB9ZWxzZXsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGRlc3RYID0geCAtIFg7Ci0gICAgICAgICAgICBpZihlbmRYID49IHNyY0VuZFgpeworICAgICAgICAgICAgaWYgKGVuZFggPj0gc3JjRW5kWCkgewogICAgICAgICAgICAgICAgIGRlc3RXaWR0aCA9IHc7Ci0gICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZGVzdFdpZHRoID0gZW5kWCAtIHg7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotCi0gICAgICAgIGlmKHkgPD0gWSl7CisgICAgICAgIGlmICh5IDw9IFkpIHsKICAgICAgICAgICAgIG5ld09mZnNldCArPSBzY2Fuc2l6ZSAqIChZIC0geSk7CiAgICAgICAgICAgICBkZXN0WSA9IDA7Ci0gICAgICAgICAgICBpZihlbmRZID49IHNyY0VuZFkpeworICAgICAgICAgICAgaWYgKGVuZFkgPj0gc3JjRW5kWSkgewogICAgICAgICAgICAgICAgIGRlc3RIZWlnaHQgPSBzcmNFbmRZIC0gWTsKLSAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBkZXN0SGVpZ2h0ID0gSEVJR0hUOwogICAgICAgICAgICAgfQotICAgICAgICB9ZWxzZXsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGRlc3RZID0geSAtIFk7Ci0gICAgICAgICAgICBpZihlbmRZID49IHNyY0VuZFkpeworICAgICAgICAgICAgaWYgKGVuZFkgPj0gc3JjRW5kWSkgewogICAgICAgICAgICAgICAgIGRlc3RIZWlnaHQgPSBoOwotICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGRlc3RIZWlnaHQgPSBlbmRZIC0geTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTI5LDE1ICsxMzUsMTQgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgbW9kZWwsIGJ5dGVbXSBwaXhlbHMsIGludCBvZmYsIGludCBzY2Fuc2l6ZSkgeworICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBtb2RlbCwgYnl0ZVtdIHBpeGVscywgaW50IG9mZiwKKyAgICAgICAgICAgIGludCBzY2Fuc2l6ZSkgewogCi0gICAgICAgIGlmKHggKyB3IDwgWCB8fCBYICsgV0lEVEggPCB4IHx8Ci0gICAgICAgICAgICAgICAgeSArIGggPCBZIHx8IFkgKyBIRUlHSFQgPCB5KSB7CisgICAgICAgIGlmICh4ICsgdyA8IFggfHwgWCArIFdJRFRIIDwgeCB8fCB5ICsgaCA8IFkgfHwgWSArIEhFSUdIVCA8IHkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGludCBkZXN0WCwgZGVzdFksIGRlc3RXaWR0aCwgZGVzdEhlaWdodCwgZW5kWCwgZW5kWSwKLSAgICAgICAgc3JjRW5kWCwgc3JjRW5kWTsKKyAgICAgICAgaW50IGRlc3RYLCBkZXN0WSwgZGVzdFdpZHRoLCBkZXN0SGVpZ2h0LCBlbmRYLCBlbmRZLCBzcmNFbmRYLCBzcmNFbmRZOwogCiAgICAgICAgIGludCBuZXdPZmZzZXQgPSBvZmY7CiAKQEAgLTE0NywzNyArMTUyLDM2IEBACiAgICAgICAgIHNyY0VuZFggPSB4ICsgdzsKICAgICAgICAgc3JjRW5kWSA9IHkgKyBoOwogCi0gICAgICAgIGlmKHggPD0gWCl7CisgICAgICAgIGlmICh4IDw9IFgpIHsKICAgICAgICAgICAgIGRlc3RYID0gMDsKICAgICAgICAgICAgIG5ld09mZnNldCArPSBYOwotICAgICAgICAgICAgaWYoZW5kWCA+PSBzcmNFbmRYKXsKKyAgICAgICAgICAgIGlmIChlbmRYID49IHNyY0VuZFgpIHsKICAgICAgICAgICAgICAgICBkZXN0V2lkdGggPSBzcmNFbmRYIC0gWDsKLSAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBkZXN0V2lkdGggPSBXSURUSDsKICAgICAgICAgICAgIH0KLSAgICAgICAgfWVsc2V7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkZXN0WCA9IHggLSBYOwotICAgICAgICAgICAgaWYoZW5kWCA+PSBzcmNFbmRYKXsKKyAgICAgICAgICAgIGlmIChlbmRYID49IHNyY0VuZFgpIHsKICAgICAgICAgICAgICAgICBkZXN0V2lkdGggPSB3OwotICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGRlc3RXaWR0aCA9IGVuZFggLSB4OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLQotICAgICAgICBpZih5IDw9IFkpeworICAgICAgICBpZiAoeSA8PSBZKSB7CiAgICAgICAgICAgICBuZXdPZmZzZXQgKz0gc2NhbnNpemUgKiAoWSAtIHkpOwogICAgICAgICAgICAgZGVzdFkgPSAwOwotICAgICAgICAgICAgaWYoZW5kWSA+PSBzcmNFbmRZKXsKKyAgICAgICAgICAgIGlmIChlbmRZID49IHNyY0VuZFkpIHsKICAgICAgICAgICAgICAgICBkZXN0SGVpZ2h0ID0gc3JjRW5kWSAtIFk7Ci0gICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZGVzdEhlaWdodCA9IEhFSUdIVDsKICAgICAgICAgICAgIH0KLSAgICAgICAgfWVsc2V7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkZXN0WSA9IHkgLSBZOwotICAgICAgICAgICAgaWYoZW5kWSA+PSBzcmNFbmRZKXsKKyAgICAgICAgICAgIGlmIChlbmRZID49IHNyY0VuZFkpIHsKICAgICAgICAgICAgICAgICBkZXN0SGVpZ2h0ID0gaDsKLSAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBkZXN0SGVpZ2h0ID0gZW5kWSAtIHk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE5MCw0ICsxOTQsMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvRGF0YUJ1ZmZlci5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0RhdGFCdWZmZXIuamF2YQppbmRleCA2ODU2YWVlLi45MmY5MDBmIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvRGF0YUJ1ZmZlci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVyLmphdmEKQEAgLTE4LDY1ICsxOCw5NyBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmdsLmltYWdlLkRhdGFCdWZmZXJMaXN0ZW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgRGF0YUJ1ZmZlciBpcyBhIHdyYXBwZXIgY2xhc3MgZm9yIGEgZGF0YSBhcnJheQotICogdG8gYmUgdXNlZCBmb3IgdGhlIHNpdHVhdGlvbiB3aGVyZSBhIHN1aXRlIG9mIGZ1bmN0aW9uYWxpdHkKLSAqIGFjdHMgb24gYSBzZXQgb2YgZGF0YSBpbiBhIGNvbnNpc3RlbnQgd2F5IGV2ZW4gdGhvdWdoIHRoZSAKLSAqIHByaW1pdGl2ZSB0eXBlIG9mIHRoZSBkYXRhIG1heSB2YXJ5IGZyb20gb25lIHVzZSB0byB0aGUgbmV4dC4gCisgKiBUaGUgQ2xhc3MgRGF0YUJ1ZmZlciBpcyBhIHdyYXBwZXIgY2xhc3MgZm9yIGEgZGF0YSBhcnJheSB0byBiZSB1c2VkIGZvciB0aGUKKyAqIHNpdHVhdGlvbiB3aGVyZSBhIHN1aXRlIG9mIGZ1bmN0aW9uYWxpdHkgYWN0cyBvbiBhIHNldCBvZiBkYXRhIGluIGEKKyAqIGNvbnNpc3RlbnQgd2F5IGV2ZW4gdGhvdWdoIHRoZSBwcmltaXRpdmUgdHlwZSBvZiB0aGUgZGF0YSBtYXkgdmFyeSBmcm9tIG9uZQorICogdXNlIHRvIHRoZSBuZXh0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIERhdGFCdWZmZXIgewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX0JZVEUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfQllURS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0JZVEUgPSAwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX1VTSE9SVC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9VU0hPUlQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9VU0hPUlQgPSAxOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX1NIT1JULiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX1NIT1JULgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfU0hPUlQgPSAyOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX0lOVC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9JTlQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JTlQgPSAzOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX0ZMT0FULiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0ZMT0FULgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRkxPQVQgPSA0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX0RPVUJMRS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9ET1VCTEUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9ET1VCTEUgPSA1OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX1VOREVGSU5FRC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9VTkRFRklORUQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9VTkRFRklORUQgPSAzMjsKIAotICAgIC8qKiBUaGUgZGF0YSB0eXBlIGluZGljYXRlcyB0aGUgcHJpbWl0aXZlIHR5cGUgb2YgdGhlIAotICAgICAqIGRhdGEgaW4gdGhpcyBEYXRhQnVmZmVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBkYXRhIHR5cGUgaW5kaWNhdGVzIHRoZSBwcmltaXRpdmUgdHlwZSBvZiB0aGUgZGF0YSBpbiB0aGlzCisgICAgICogRGF0YUJ1ZmZlci4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IGRhdGFUeXBlOwogCi0gICAgLyoqIFRoZSBudW1iZXIgb2YgZGF0YSBhcnJheXMgaW4gdGhpcyBEYXRhQnVmZmVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgZGF0YSBhcnJheXMgaW4gdGhpcyBEYXRhQnVmZmVyLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgYmFua3M7CiAKLSAgICAvKiogVGhlIHN0YXJ0aW5nIGluZGV4IGZvciByZWFkaW5nIHRoZSAKLSAgICAgKiBkYXRhIGZyb20gdGhlIGZpcnN0IChvciBvbmx5KSBpbnRlcm5hbCBkYXRhIGFycmF5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBzdGFydGluZyBpbmRleCBmb3IgcmVhZGluZyB0aGUgZGF0YSBmcm9tIHRoZSBmaXJzdCAob3Igb25seSkgaW50ZXJuYWwKKyAgICAgKiBkYXRhIGFycmF5LgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgb2Zmc2V0OwogCi0gICAgLyoqIFRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgb2YgdGhlIGRhdGEgYXJyYXlzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgb2YgdGhlIGRhdGEgYXJyYXlzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgc2l6ZTsKIAotICAgIC8qKiBUaGUgc3RhcnRpbmcgaW5kaWNlcyBmb3IgcmVhZGluZyB0aGUgCi0gICAgICogZGF0YSBmcm9tIHRoZSBpbnRlcm5hbCBkYXRhIGFycmF5cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgc3RhcnRpbmcgaW5kaWNlcyBmb3IgcmVhZGluZyB0aGUgZGF0YSBmcm9tIHRoZSBpbnRlcm5hbCBkYXRhIGFycmF5cy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IG9mZnNldHNbXTsKLSAgICAKLSAgICAvKiogVGhlIGRhdGEgY2hhbmdlZC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBkYXRhIGNoYW5nZWQuCisgICAgICovCiAgICAgYm9vbGVhbiBkYXRhQ2hhbmdlZCA9IHRydWU7Ci0gICAgCi0gICAgLyoqIFRoZSBkYXRhIHRha2VuLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGRhdGEgdGFrZW4uCisgICAgICovCiAgICAgYm9vbGVhbiBkYXRhVGFrZW4gPSBmYWxzZTsKLSAgICAKLSAgICAvKiogVGhlIGxpc3RlbmVyLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGxpc3RlbmVyLgorICAgICAqLwogICAgIERhdGFCdWZmZXJMaXN0ZW5lciBsaXN0ZW5lcjsKIAogICAgIHN0YXRpYyB7CkBAIC04NiwxMSArMTE4LDE1IEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0aGUgZGF0YSB0eXBlCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSBvZiB0aGUgZGF0YSBhcnJheXMKLSAgICAgKiBAcGFyYW0gbnVtQmFua3MgdGhlIG51bWJlciBvZiBkYXRhIGFycmF5cyB0byBjcmVhdGUKLSAgICAgKiBAcGFyYW0gb2Zmc2V0cyB0aGUgc3RhcnRpbmcgaW5kaWNlcyBmb3IgcmVhZGluZyB0aGUgCi0gICAgICogZGF0YSBmcm9tIHRoZSBpbnRlcm5hbCBkYXRhIGFycmF5cworICAgICAqIEBwYXJhbSBkYXRhVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHlwZS4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSBvZiB0aGUgZGF0YSBhcnJheXMuCisgICAgICogQHBhcmFtIG51bUJhbmtzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGRhdGEgYXJyYXlzIHRvIGNyZWF0ZS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIGluZGljZXMgZm9yIHJlYWRpbmcgdGhlIGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwKKyAgICAgKiAgICAgICAgICAgIGRhdGEgYXJyYXlzLgogICAgICAqLwogICAgIHByb3RlY3RlZCBEYXRhQnVmZmVyKGludCBkYXRhVHlwZSwgaW50IHNpemUsIGludCBudW1CYW5rcywgaW50W10gb2Zmc2V0cykgewogICAgICAgICB0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7CkBAIC0xMDEsMTMgKzEzNywxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciB3aXRoIGFsbCBvZiB0aGUgCi0gICAgICogZGF0YSBhcnJheXMgc3RhcnRpbmcgYXQgdGhlIHNhbWUgaW5kZXguCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIHdpdGggYWxsIG9mIHRoZSBkYXRhIGFycmF5cyBzdGFydGluZyBhdAorICAgICAqIHRoZSBzYW1lIGluZGV4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0aGUgZGF0YSB0eXBlCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSBvZiB0aGUgZGF0YSBhcnJheXMKLSAgICAgKiBAcGFyYW0gbnVtQmFua3MgdGhlIG51bWJlciBvZiBkYXRhIGFycmF5cyB0byBjcmVhdGUKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gdXNlIGZvciBhbGwgb2YgdGhlIGRhdGEgYXJyYXlzCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIG9mIHRoZSBkYXRhIGFycmF5cy4KKyAgICAgKiBAcGFyYW0gbnVtQmFua3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGF0YSBhcnJheXMgdG8gY3JlYXRlLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgdG8gdXNlIGZvciBhbGwgb2YgdGhlIGRhdGEgYXJyYXlzLgogICAgICAqLwogICAgIHByb3RlY3RlZCBEYXRhQnVmZmVyKGludCBkYXRhVHlwZSwgaW50IHNpemUsIGludCBudW1CYW5rcywgaW50IG9mZnNldCkgewogICAgICAgICB0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7CkBAIC0xMjIsMTIgKzE2MiwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciB3aXRoIGFsbCBvZiB0aGUgCi0gICAgICogZGF0YSBhcnJheXMgcmVhZCBmcm9tIHRoZSBiZWdpbm5pbmcgKGF0IG9mZnNldCB6ZXJvKS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgd2l0aCBhbGwgb2YgdGhlIGRhdGEgYXJyYXlzIHJlYWQgZnJvbSB0aGUKKyAgICAgKiBiZWdpbm5pbmcgKGF0IG9mZnNldCB6ZXJvKS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGRhdGEgdHlwZQotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgb2YgdGhlIGRhdGEgYXJyYXlzCi0gICAgICogQHBhcmFtIG51bUJhbmtzIHRoZSBudW1iZXIgb2YgZGF0YSBhcnJheXMgdG8gY3JlYXRlCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIG9mIHRoZSBkYXRhIGFycmF5cy4KKyAgICAgKiBAcGFyYW0gbnVtQmFua3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGF0YSBhcnJheXMgdG8gY3JlYXRlLgogICAgICAqLwogICAgIHByb3RlY3RlZCBEYXRhQnVmZmVyKGludCBkYXRhVHlwZSwgaW50IHNpemUsIGludCBudW1CYW5rcykgewogICAgICAgICB0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7CkBAIC0xMzgsMTEgKzE4MSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciB3aXRoIG9uZSBpbnRlcm5hbCBkYXRhIGFycmF5Ci0gICAgICogcmVhZCBmcm9tIHRoZSBiZWdpbm5pbmcgKGF0IG9mZnNldCB6ZXJvKS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgd2l0aCBvbmUgaW50ZXJuYWwgZGF0YSBhcnJheSByZWFkIGZyb20gdGhlCisgICAgICogYmVnaW5uaW5nIChhdCBvZmZzZXQgemVybykuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIG9mIHRoZSBkYXRhIGFycmF5cworICAgICAqIEBwYXJhbSBkYXRhVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHlwZS4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSBvZiB0aGUgZGF0YSBhcnJheXMuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIERhdGFCdWZmZXIoaW50IGRhdGFUeXBlLCBpbnQgc2l6ZSkgewogICAgICAgICB0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7CkBAIC0xNTMsMTY1ICsxOTgsMTYxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGF0YSB2YWx1ZSBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IGF0IHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgaW5kZXguCisgICAgICogU2V0cyB0aGUgZGF0YSB2YWx1ZSBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGJhbmsgdGhlIGludGVybmFsIGFycmF5IHRvIHRoZSBkYXRhIHRvCi0gICAgICogQHBhcmFtIGkgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEKLSAgICAgKiBzaG91bGQgYmUgd3JpdHRlbgotICAgICAqIEBwYXJhbSB2YWwgdGhlIHZhbHVlIHRvIHdyaXRlIGludG8gdGhlIGFycmF5CisgICAgICogQHBhcmFtIGJhbmsKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBhcnJheSB0byB0aGUgZGF0YSB0by4KKyAgICAgKiBAcGFyYW0gaQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIHZhbAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHdyaXRlIGludG8gdGhlIGFycmF5LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVsZW0oaW50IGJhbmssIGludCBpLCBpbnQgdmFsKTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZsb2F0IGRhdGEgdmFsdWUgaW4gdGhlIHNwZWNpZmllZCBhcnJheSBhdCB0aGUgCi0gICAgICogc3BlY2lmaWVkIGluZGV4LgorICAgICAqIFNldHMgdGhlIGZsb2F0IGRhdGEgdmFsdWUgaW4gdGhlIHNwZWNpZmllZCBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBiYW5rIHRoZSBpbnRlcm5hbCBhcnJheSB0byB0aGUgZGF0YSB0bwotICAgICAqIEBwYXJhbSBpIHRoZSBpbmRleCB3aXRoaW4gdGhlIGFycmF5IHdoZXJlIHRoZSBkYXRhCi0gICAgICogc2hvdWxkIGJlIHdyaXR0ZW4KLSAgICAgKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSB0byB3cml0ZSBpbnRvIHRoZSBhcnJheQorICAgICAqIEBwYXJhbSBiYW5rCisgICAgICogICAgICAgICAgICB0aGUgaW50ZXJuYWwgYXJyYXkgdG8gdGhlIGRhdGEgdG8uCisgICAgICogQHBhcmFtIGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCB3aXRoaW4gdGhlIGFycmF5IHdoZXJlIHRoZSBkYXRhIHNob3VsZCBiZSB3cml0dGVuLgorICAgICAqIEBwYXJhbSB2YWwKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB3cml0ZSBpbnRvIHRoZSBhcnJheS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRFbGVtRmxvYXQoaW50IGJhbmssIGludCBpLCBmbG9hdCB2YWwpIHsKLSAgICAgICAgc2V0RWxlbShiYW5rLCBpLCAoaW50KSB2YWwpOworICAgICAgICBzZXRFbGVtKGJhbmssIGksIChpbnQpdmFsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkb3VibGUgZGF0YSB2YWx1ZSBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IGF0IHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgaW5kZXguCisgICAgICogU2V0cyB0aGUgZG91YmxlIGRhdGEgdmFsdWUgaW4gdGhlIHNwZWNpZmllZCBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBiYW5rIHRoZSBpbnRlcm5hbCBhcnJheSB0byB0aGUgZGF0YSB0bwotICAgICAqIEBwYXJhbSBpIHRoZSBpbmRleCB3aXRoaW4gdGhlIGFycmF5IHdoZXJlIHRoZSBkYXRhCi0gICAgICogc2hvdWxkIGJlIHdyaXR0ZW4KLSAgICAgKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSB0byB3cml0ZSBpbnRvIHRoZSBhcnJheQorICAgICAqIEBwYXJhbSBiYW5rCisgICAgICogICAgICAgICAgICB0aGUgaW50ZXJuYWwgYXJyYXkgdG8gdGhlIGRhdGEgdG8uCisgICAgICogQHBhcmFtIGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCB3aXRoaW4gdGhlIGFycmF5IHdoZXJlIHRoZSBkYXRhIHNob3VsZCBiZSB3cml0dGVuLgorICAgICAqIEBwYXJhbSB2YWwKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB3cml0ZSBpbnRvIHRoZSBhcnJheS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRFbGVtRG91YmxlKGludCBiYW5rLCBpbnQgaSwgZG91YmxlIHZhbCkgewotICAgICAgICBzZXRFbGVtKGJhbmssIGksIChpbnQpIHZhbCk7CisgICAgICAgIHNldEVsZW0oYmFuaywgaSwgKGludCl2YWwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRhdGEgdmFsdWUgaW4gdGhlIGZpcnN0IGFycmF5IGF0IHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgaW5kZXguCisgICAgICogU2V0cyB0aGUgZGF0YSB2YWx1ZSBpbiB0aGUgZmlyc3QgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaSB0aGUgaW5kZXggd2l0aGluIHRoZSBhcnJheSB3aGVyZSB0aGUgZGF0YQotICAgICAqIHNob3VsZCBiZSB3cml0dGVuCi0gICAgICogQHBhcmFtIHZhbCB0aGUgdmFsdWUgdG8gd3JpdGUgaW50byB0aGUgYXJyYXkKKyAgICAgKiBAcGFyYW0gaQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIHZhbAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHdyaXRlIGludG8gdGhlIGFycmF5LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEVsZW0oaW50IGksIGludCB2YWwpIHsKICAgICAgICAgc2V0RWxlbSgwLCBpLCB2YWwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRhdGEgdmFsdWUgZnJvbSB0aGUgc3BlY2lmaWVkIGRhdGEgYXJyYXkgYXQgdGhlIAotICAgICAqIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKiBHZXRzIHRoZSBkYXRhIHZhbHVlIGZyb20gdGhlIHNwZWNpZmllZCBkYXRhIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGJhbmsgdGhlIGRhdGEgYXJyYXkgdG8gcmVhZCBmcm9tCi0gICAgICogQHBhcmFtIGkgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEKLSAgICAgKiBzaG91bGQgYmUgcmVhZAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRhdGEgZWxlbWVudAorICAgICAqIEBwYXJhbSBiYW5rCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSB0byByZWFkIGZyb20uCisgICAgICogQHBhcmFtIGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCB3aXRoaW4gdGhlIGFycmF5IHdoZXJlIHRoZSBkYXRhIHNob3VsZCBiZSByZWFkLgorICAgICAqIEByZXR1cm4gdGhlIGRhdGEgZWxlbWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEVsZW0oaW50IGJhbmssIGludCBpKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZsb2F0LXR5cGUgZGF0YSB2YWx1ZSBmcm9tIHRoZSBzcGVjaWZpZWQgCi0gICAgICogZGF0YSBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAqIEdldHMgdGhlIGZsb2F0LXR5cGUgZGF0YSB2YWx1ZSBmcm9tIHRoZSBzcGVjaWZpZWQgZGF0YSBhcnJheSBhdCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGJhbmsgdGhlIGRhdGEgYXJyYXkgdG8gcmVhZCBmcm9tCi0gICAgICogQHBhcmFtIGkgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEKLSAgICAgKiBzaG91bGQgYmUgcmVhZAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRhdGEgZWxlbWVudAorICAgICAqIEBwYXJhbSBiYW5rCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSB0byByZWFkIGZyb20uCisgICAgICogQHBhcmFtIGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCB3aXRoaW4gdGhlIGFycmF5IHdoZXJlIHRoZSBkYXRhIHNob3VsZCBiZSByZWFkLgorICAgICAqIEByZXR1cm4gdGhlIGRhdGEgZWxlbWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0RWxlbUZsb2F0KGludCBiYW5rLCBpbnQgaSkgewogICAgICAgICByZXR1cm4gZ2V0RWxlbShiYW5rLCBpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkb3VibGUtdHlwZSBkYXRhIHZhbHVlIGZyb20gdGhlIHNwZWNpZmllZCAKLSAgICAgKiBkYXRhIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAgICogR2V0cyB0aGUgZG91YmxlLXR5cGUgZGF0YSB2YWx1ZSBmcm9tIHRoZSBzcGVjaWZpZWQgZGF0YSBhcnJheSBhdCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGJhbmsgdGhlIGRhdGEgYXJyYXkgdG8gcmVhZCBmcm9tCi0gICAgICogQHBhcmFtIGkgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEKLSAgICAgKiBzaG91bGQgYmUgcmVhZAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRhdGEgZWxlbWVudAorICAgICAqIEBwYXJhbSBiYW5rCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSB0byByZWFkIGZyb20uCisgICAgICogQHBhcmFtIGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCB3aXRoaW4gdGhlIGFycmF5IHdoZXJlIHRoZSBkYXRhIHNob3VsZCBiZSByZWFkLgorICAgICAqIEByZXR1cm4gdGhlIGRhdGEgZWxlbWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlIGdldEVsZW1Eb3VibGUoaW50IGJhbmssIGludCBpKSB7CiAgICAgICAgIHJldHVybiBnZXRFbGVtKGJhbmssIGkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZsb2F0IGRhdGEgdmFsdWUgaW4gdGhlIGZpcnN0IGFycmF5IGF0IHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgaW5kZXguCisgICAgICogU2V0cyB0aGUgZmxvYXQgZGF0YSB2YWx1ZSBpbiB0aGUgZmlyc3QgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaSB0aGUgaW5kZXggd2l0aGluIHRoZSBhcnJheSB3aGVyZSB0aGUgZGF0YQotICAgICAqIHNob3VsZCBiZSB3cml0dGVuCi0gICAgICogQHBhcmFtIHZhbCB0aGUgdmFsdWUgdG8gd3JpdGUgaW50byB0aGUgYXJyYXkKKyAgICAgKiBAcGFyYW0gaQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIHZhbAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHdyaXRlIGludG8gdGhlIGFycmF5LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEVsZW1GbG9hdChpbnQgaSwgZmxvYXQgdmFsKSB7CiAgICAgICAgIHNldEVsZW1GbG9hdCgwLCBpLCB2YWwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRvdWJsZSBkYXRhIHZhbHVlIGluIHRoZSBmaXJzdCBhcnJheSBhdCB0aGUgCi0gICAgICogc3BlY2lmaWVkIGluZGV4LgorICAgICAqIFNldHMgdGhlIGRvdWJsZSBkYXRhIHZhbHVlIGluIHRoZSBmaXJzdCBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpIHRoZSBpbmRleCB3aXRoaW4gdGhlIGFycmF5IHdoZXJlIHRoZSBkYXRhCi0gICAgICogc2hvdWxkIGJlIHdyaXR0ZW4KLSAgICAgKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSB0byB3cml0ZSBpbnRvIHRoZSBhcnJheQorICAgICAqIEBwYXJhbSBpCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggd2l0aGluIHRoZSBhcnJheSB3aGVyZSB0aGUgZGF0YSBzaG91bGQgYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gdmFsCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gd3JpdGUgaW50byB0aGUgYXJyYXkuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RWxlbURvdWJsZShpbnQgaSwgZG91YmxlIHZhbCkgewogICAgICAgICBzZXRFbGVtRG91YmxlKDAsIGksIHZhbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGF0YSB2YWx1ZSBmcm9tIHRoZSBmaXJzdCAKLSAgICAgKiBkYXRhIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggYW5kIHJldHVybnMgaXQKLSAgICAgKiBhcyBhbiBpbnQuCisgICAgICogR2V0cyB0aGUgZGF0YSB2YWx1ZSBmcm9tIHRoZSBmaXJzdCBkYXRhIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggYW5kCisgICAgICogcmV0dXJucyBpdCBhcyBhbiBpbnRlZ2VyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpIHRoZSBpbmRleCB3aXRoaW4gdGhlIGFycmF5IHdoZXJlIHRoZSBkYXRhCi0gICAgICogc2hvdWxkIGJlIHJlYWQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gaQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIHJlYWQuCisgICAgICogQHJldHVybiB0aGUgZGF0YSBlbGVtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RWxlbShpbnQgaSkgewogICAgICAgICByZXR1cm4gZ2V0RWxlbSgwLCBpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkYXRhIHZhbHVlIGZyb20gdGhlIGZpcnN0IAotICAgICAqIGRhdGEgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBhbmQgcmV0dXJucyBpdAotICAgICAqIGFzIGEgZmxvYXQuCisgICAgICogR2V0cyB0aGUgZGF0YSB2YWx1ZSBmcm9tIHRoZSBmaXJzdCBkYXRhIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggYW5kCisgICAgICogcmV0dXJucyBpdCBhcyBhIGZsb2F0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpIHRoZSBpbmRleCB3aXRoaW4gdGhlIGFycmF5IHdoZXJlIHRoZSBkYXRhCi0gICAgICogc2hvdWxkIGJlIHJlYWQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gaQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIHJlYWQuCisgICAgICogQHJldHVybiB0aGUgZGF0YSBlbGVtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRFbGVtRmxvYXQoaW50IGkpIHsKICAgICAgICAgcmV0dXJuIGdldEVsZW0oMCwgaSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGF0YSB2YWx1ZSBmcm9tIHRoZSBmaXJzdCAKLSAgICAgKiBkYXRhIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggYW5kIHJldHVybnMgaXQKLSAgICAgKiBhcyBhIGRvdWJsZS4KKyAgICAgKiBHZXRzIHRoZSBkYXRhIHZhbHVlIGZyb20gdGhlIGZpcnN0IGRhdGEgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBhbmQKKyAgICAgKiByZXR1cm5zIGl0IGFzIGEgZG91YmxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpIHRoZSBpbmRleCB3aXRoaW4gdGhlIGFycmF5IHdoZXJlIHRoZSBkYXRhCi0gICAgICogc2hvdWxkIGJlIHJlYWQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gaQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIHJlYWQuCisgICAgICogQHJldHVybiB0aGUgZGF0YSBlbGVtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgZ2V0RWxlbURvdWJsZShpbnQgaSkgewogICAgICAgICByZXR1cm4gZ2V0RWxlbShpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhcnJheSBnaXZpbmcgdGhlIG9mZnNldHMgY29ycmVzcG9uZGluZyAKLSAgICAgKiB0byB0aGUgaW50ZXJuYWwgZGF0YSBhcnJheXMuCisgICAgICogR2V0cyB0aGUgYXJyYXkgZ2l2aW5nIHRoZSBvZmZzZXRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGludGVybmFsIGRhdGEKKyAgICAgKiBhcnJheXMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2Ygb2Zmc2V0cworICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIG9mZnNldHMuCiAgICAgICovCiAgICAgcHVibGljIGludFtdIGdldE9mZnNldHMoKSB7CiAgICAgICAgIHJldHVybiBvZmZzZXRzOwpAQCAtMzIwLDE4ICszNjEsMTYgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBzaXplIGluIGJpdHMgb2YgdGhlIHByaW1pdGl2ZSBkYXRhIHR5cGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2l6ZSBpbiBiaXRzIG9mIHRoZSBwcmltaXRpdmUgZGF0YSB0eXBlCi0KKyAgICAgKiBAcmV0dXJuIHRoZSBzaXplIGluIGJpdHMgb2YgdGhlIHByaW1pdGl2ZSBkYXRhIHR5cGUuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRTaXplKCkgewogICAgICAgICByZXR1cm4gc2l6ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBvZmZzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgaW50ZXJuYWwgCi0gICAgICogZGF0YSBhcnJheS4KKyAgICAgKiBHZXRzIHRoZSBvZmZzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgaW50ZXJuYWwgZGF0YSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQKKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRPZmZzZXQoKSB7CiAgICAgICAgIHJldHVybiBvZmZzZXQ7CkBAIC0zNDAsNyArMzc5LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgZGF0YSBhcnJheXMgaW4gdGhpcyBEYXRhQnVmZmVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBkYXRhIGFycmF5cworICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBkYXRhIGFycmF5cy4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE51bUJhbmtzKCkgewogICAgICAgICByZXR1cm4gYmFua3M7CkBAIC0zNDksNyArMzg4LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBwcmltaXRpdmUgdHlwZSBvZiB0aGlzIGJ1ZmZlcidzIGRhdGEuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGF0YSB0eXBlCisgICAgICogQHJldHVybiB0aGUgZGF0YSB0eXBlLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RGF0YVR5cGUoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLmRhdGFUeXBlOwpAQCAtMzU4LDg1ICszOTcsODUgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBzaXplIGluIGJpdHMgb2YgdGhlIHByaW1pdGl2ZSBkYXRhIHR5cGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIHByaW1pdGl2ZSB0eXBlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2l6ZSBpbiBiaXRzIG9mIHRoZSBwcmltaXRpdmUgZGF0YSB0eXBlCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmltaXRpdmUgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzaXplIGluIGJpdHMgb2YgdGhlIHByaW1pdGl2ZSBkYXRhIHR5cGUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RGF0YVR5cGVTaXplKGludCB0eXBlKSB7CiAgICAgICAgIHN3aXRjaCAodHlwZSkgewogCi0gICAgICAgIGNhc2UgVFlQRV9CWVRFOgotICAgICAgICAgICAgcmV0dXJuIDg7CisgICAgICAgICAgICBjYXNlIFRZUEVfQllURToKKyAgICAgICAgICAgICAgICByZXR1cm4gODsKIAotICAgICAgICBjYXNlIFRZUEVfVVNIT1JUOgotICAgICAgICBjYXNlIFRZUEVfU0hPUlQ6Ci0gICAgICAgICAgICByZXR1cm4gMTY7CisgICAgICAgICAgICBjYXNlIFRZUEVfVVNIT1JUOgorICAgICAgICAgICAgY2FzZSBUWVBFX1NIT1JUOgorICAgICAgICAgICAgICAgIHJldHVybiAxNjsKIAotICAgICAgICBjYXNlIFRZUEVfSU5UOgotICAgICAgICBjYXNlIFRZUEVfRkxPQVQ6Ci0gICAgICAgICAgICByZXR1cm4gMzI7CisgICAgICAgICAgICBjYXNlIFRZUEVfSU5UOgorICAgICAgICAgICAgY2FzZSBUWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgIHJldHVybiAzMjsKIAotICAgICAgICBjYXNlIFRZUEVfRE9VQkxFOgotICAgICAgICAgICAgcmV0dXJuIDY0OworICAgICAgICAgICAgY2FzZSBUWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gNjQ7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGF3dC4yMkM9VW5rbm93biBkYXRhIHR5cGUgezB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIyQyIsIHR5cGUpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjJDPVVua25vd24gZGF0YSB0eXBlIHswfQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjJDIiwgdHlwZSkpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBOb3RpZmllcyB0aGUgbGlzdGVuZXIgdGhhdCB0aGUgZGF0YSBoYXMgY2hhbmdlZC4KICAgICAgKi8KLSAgICB2b2lkIG5vdGlmeUNoYW5nZWQoKXsKLSAgICAgICAgaWYobGlzdGVuZXIgIT0gbnVsbCAmJiAhZGF0YUNoYW5nZWQpeworICAgIHZvaWQgbm90aWZ5Q2hhbmdlZCgpIHsKKyAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwgJiYgIWRhdGFDaGFuZ2VkKSB7CiAgICAgICAgICAgICBkYXRhQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICBsaXN0ZW5lci5kYXRhQ2hhbmdlZCgpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogTm90aWZpZXMgdGhlIGxpc3RlbmVyIHRoYXQgdGhlIGRhdGEgaGFzIGJlZW4gcmVsZWFzZWQuCiAgICAgICovCi0gICAgdm9pZCBub3RpZnlUYWtlbigpewotICAgICAgICBpZihsaXN0ZW5lciAhPSBudWxsICYmICFkYXRhVGFrZW4peworICAgIHZvaWQgbm90aWZ5VGFrZW4oKSB7CisgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsICYmICFkYXRhVGFrZW4pIHsKICAgICAgICAgICAgIGRhdGFUYWtlbiA9IHRydWU7CiAgICAgICAgICAgICBsaXN0ZW5lci5kYXRhVGFrZW4oKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJlbGVhc2UgdGhlIGRhdGEuCiAgICAgICovCi0gICAgdm9pZCByZWxlYXNlRGF0YSgpewotICAgICAgICBpZihsaXN0ZW5lciAhPSBudWxsICYmIGRhdGFUYWtlbil7CisgICAgdm9pZCByZWxlYXNlRGF0YSgpIHsKKyAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwgJiYgZGF0YVRha2VuKSB7CiAgICAgICAgICAgICBkYXRhVGFrZW4gPSBmYWxzZTsKICAgICAgICAgICAgIGxpc3RlbmVyLmRhdGFSZWxlYXNlZCgpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgZGF0YSBidWZmZXIgbGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgorICAgICAqIEBwYXJhbSBsaXN0ZW5lcgorICAgICAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyLgogICAgICAqLwotICAgIHZvaWQgYWRkRGF0YUJ1ZmZlckxpc3RlbmVyKERhdGFCdWZmZXJMaXN0ZW5lciBsaXN0ZW5lcil7CisgICAgdm9pZCBhZGREYXRhQnVmZmVyTGlzdGVuZXIoRGF0YUJ1ZmZlckxpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBkYXRhIGJ1ZmZlciBsaXN0ZW5lci4KICAgICAgKi8KLSAgICB2b2lkIHJlbW92ZURhdGFCdWZmZXJMaXN0ZW5lcigpeworICAgIHZvaWQgcmVtb3ZlRGF0YUJ1ZmZlckxpc3RlbmVyKCkgewogICAgICAgICBsaXN0ZW5lciA9IG51bGw7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogVmFsaWRhdGUuCiAgICAgICovCi0gICAgdm9pZCB2YWxpZGF0ZSgpeworICAgIHZvaWQgdmFsaWRhdGUoKSB7CiAgICAgICAgIGRhdGFDaGFuZ2VkID0gZmFsc2U7CiAgICAgfQotICAgIAotfQogCit9CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvRGF0YUJ1ZmZlckJ5dGUuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVyQnl0ZS5qYXZhCmluZGV4IDRkMjljOWMuLjM0MDdkZTggMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVyQnl0ZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVyQnl0ZS5qYXZhCkBAIC0xOCwyNSArMTgsMzIgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiAvKioKLSAqIFRoZSBDbGFzcyBEYXRhQnVmZmVyQnl0ZSBpcyB0aGUgc3ViY2xhc3Mgb2YgRGF0YUJ1ZmZlcgotICogZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB1bmRlcmx5aW5nIGRhdGEgaXMgb2YgdHlwZSBieXRlLgorICogVGhlIENsYXNzIERhdGFCdWZmZXJCeXRlIGlzIHRoZSBzdWJjbGFzcyBvZiBEYXRhQnVmZmVyIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUKKyAqIHVuZGVybHlpbmcgZGF0YSBpcyBvZiB0eXBlIGJ5dGUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRGF0YUJ1ZmZlckJ5dGUgZXh0ZW5kcyBEYXRhQnVmZmVyIHsKIAotICAgIC8qKiBUaGUgZGF0YS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZGF0YS4KKyAgICAgKi8KICAgICBieXRlIGRhdGFbXVtdOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgdW5zaWduZWQgc2hvcnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFBcnJheXMgdGhlIGRhdGEgYXJyYXlzIHRvIGNvcHkgdGhlIGRhdGEgZnJvbQotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAotICAgICAqIGZyb20gdGhlIGRhdGEgYXJyYXlzCi0gICAgICogQHBhcmFtIG9mZnNldHMgdGhlIHN0YXJ0aW5nIGluZGljZXMgZm9yIHJlYWRpbmcgdGhlIAotICAgICAqIGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwgZGF0YSBhcnJheXMKKyAgICAgKiBAcGFyYW0gZGF0YUFycmF5cworICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXlzIHRvIGNvcHkgdGhlIGRhdGEgZnJvbS4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgZnJvbSB0aGUgZGF0YSBhcnJheXMuCisgICAgICogQHBhcmFtIG9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBpbmRpY2VzIGZvciByZWFkaW5nIHRoZSBkYXRhIGZyb20gdGhlIGludGVybmFsCisgICAgICogICAgICAgICAgICBkYXRhIGFycmF5cy4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckJ5dGUoYnl0ZSBkYXRhQXJyYXlzW11bXSwgaW50IHNpemUsIGludCBvZmZzZXRzW10pIHsKICAgICAgICAgc3VwZXIoVFlQRV9CWVRFLCBzaXplLCBkYXRhQXJyYXlzLmxlbmd0aCwgb2Zmc2V0cyk7CkBAIC00Niw5ICs1MywxMCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIHVuc2lnbmVkIHNob3J0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzIHRoZSBkYXRhIGFycmF5cyB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBmcm9tIHRoZSBkYXRhIGFycmF5cworICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheXMgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSBmcm9tIHRoZSBkYXRhIGFycmF5cy4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckJ5dGUoYnl0ZSBkYXRhQXJyYXlzW11bXSwgaW50IHNpemUpIHsKICAgICAgICAgc3VwZXIoVFlQRV9CWVRFLCBzaXplLCBkYXRhQXJyYXlzLmxlbmd0aCk7CkBAIC01NiwxMiArNjQsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSB1bnNpZ25lZCBzaG9ydAotICAgICAqIHdpdGggYSBzaW5nbGUgdW5kZXJseWluZyBhcnJheSBvZiBkYXRhLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIHVuc2lnbmVkIHNob3J0IHdpdGggYSBzaW5nbGUKKyAgICAgKiB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFBcnJheSB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBzdGFydGluZyBpbmRleCB0byB1c2Ugd2hlbiByZWFkaW5nIHRoZSBkYXRhCisgICAgICogQHBhcmFtIGRhdGFBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXkgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgaW5kZXggdG8gdXNlIHdoZW4gcmVhZGluZyB0aGUgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckJ5dGUoYnl0ZSBkYXRhQXJyYXlbXSwgaW50IHNpemUsIGludCBvZmZzZXQpIHsKICAgICAgICAgc3VwZXIoVFlQRV9CWVRFLCBzaXplLCAxLCBvZmZzZXQpOwpAQCAtNzAsMTIgKzgxLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgdW5zaWduZWQgc2hvcnQKLSAgICAgKiB3aXRoIGEgc2luZ2xlIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YSBzdGFydGluZyBhdAotICAgICAqIGluZGV4IDAuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgdW5zaWduZWQgc2hvcnQgd2l0aCBhIHNpbmdsZQorICAgICAqIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YSBzdGFydGluZyBhdCBpbmRleCAwLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQXJyYXkgdGhlIGRhdGEgYXJyYXkgdG8gY29weSB0aGUgZGF0YSBmcm9tCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCisgICAgICogQHBhcmFtIGRhdGFBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXkgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZS4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckJ5dGUoYnl0ZSBkYXRhQXJyYXlbXSwgaW50IHNpemUpIHsKICAgICAgICAgc3VwZXIoVFlQRV9CWVRFLCBzaXplKTsKQEAgLTg0LDEyICs5NiwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBlbXB0eSBkYXRhIGJ1ZmZlciBvZiB0eXBlIHVuc2lnbmVkIHNob3J0Ci0gICAgICogd2l0aCBvZmZzZXRzIGVxdWFsIHRvIHplcm8uCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGVtcHR5IGRhdGEgYnVmZmVyIG9mIHR5cGUgdW5zaWduZWQgc2hvcnQgd2l0aCBvZmZzZXRzCisgICAgICogZXF1YWwgdG8gemVyby4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBmcm9tIHRoZSBkYXRhIGFycmF5cwotICAgICAqIEBwYXJhbSBudW1CYW5rcyB0aGUgbnVtYmVyIG9mIGRhdGEgYXJyYXlzIHRvIGNyZWF0ZQorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSBmcm9tIHRoZSBkYXRhIGFycmF5cy4KKyAgICAgKiBAcGFyYW0gbnVtQmFua3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGF0YSBhcnJheXMgdG8gY3JlYXRlLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyQnl0ZShpbnQgc2l6ZSwgaW50IG51bUJhbmtzKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfQllURSwgc2l6ZSwgbnVtQmFua3MpOwpAQCAtMTAxLDExICsxMTQsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZW1wdHkgZGF0YSBidWZmZXIgb2YgdHlwZSB1bnNpZ25lZCBzaG9ydAotICAgICAqIHdpdGggYSBzaW5nbGUgdW5kZXJseWluZyBhcnJheSBvZiBkYXRhIHN0YXJ0aW5nIGF0Ci0gICAgICogaW5kZXggMC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZW1wdHkgZGF0YSBidWZmZXIgb2YgdHlwZSB1bnNpZ25lZCBzaG9ydCB3aXRoIGEgc2luZ2xlCisgICAgICogdW5kZXJseWluZyBhcnJheSBvZiBkYXRhIHN0YXJ0aW5nIGF0IGluZGV4IDAuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyQnl0ZShpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihUWVBFX0JZVEUsIHNpemUpOwpAQCAtMTE1LDEzICsxMjgsMTMgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEVsZW0oaW50IGJhbmssIGludCBpLCBpbnQgdmFsKSB7Ci0gICAgICAgIGRhdGFbYmFua11bb2Zmc2V0c1tiYW5rXSArIGldID0gKGJ5dGUpIHZhbDsKKyAgICAgICAgZGF0YVtiYW5rXVtvZmZzZXRzW2JhbmtdICsgaV0gPSAoYnl0ZSl2YWw7CiAgICAgICAgIG5vdGlmeUNoYW5nZWQoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRFbGVtKGludCBpLCBpbnQgdmFsKSB7Ci0gICAgICAgIGRhdGFbMF1bb2Zmc2V0ICsgaV0gPSAoYnl0ZSkgdmFsOworICAgICAgICBkYXRhWzBdW29mZnNldCArIGldID0gKGJ5dGUpdmFsOwogICAgICAgICBub3RpZnlDaGFuZ2VkKCk7CiAgICAgfQogCkBAIC0xMzMsOSArMTQ2LDkgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkYXRhIG9mIHRoZSBzcGVjaWZpZWQgaW50ZXJuYWwgZGF0YSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFuayB0aGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgZGF0YSBhcnJheQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRhdGEKKyAgICAgKiBAcGFyYW0gYmFuaworICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBkZXNpcmVkIGRhdGEgYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdldERhdGEoaW50IGJhbmspIHsKICAgICAgICAgbm90aWZ5VGFrZW4oKTsKQEAgLTE1MCw3ICsxNjMsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGJhbmsgZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBiYW5rIGRhdGEKKyAgICAgKiBAcmV0dXJuIHRoZSBiYW5rIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXVtdIGdldEJhbmtEYXRhKCkgewogICAgICAgICBub3RpZnlUYWtlbigpOwpAQCAtMTYwLDcgKzE3Myw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZGF0YSBvZiB0aGUgZmlyc3QgZGF0YSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkYXRhCisgICAgICogQHJldHVybiB0aGUgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdldERhdGEoKSB7CiAgICAgICAgIG5vdGlmeVRha2VuKCk7CkBAIC0xNjgsNCArMTgxLDMgQEAKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0RhdGFCdWZmZXJEb3VibGUuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVyRG91YmxlLmphdmEKaW5kZXggZmEzZDMyNC4uNWQwYTUxNiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0RhdGFCdWZmZXJEb3VibGUuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvRGF0YUJ1ZmZlckRvdWJsZS5qYXZhCkBAIC0xOCwyNiArMTgsMzMgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiAvKioKLSAqIFRoZSBDbGFzcyBEYXRhQnVmZmVyRG91YmxlIGlzIHRoZSBzdWJjbGFzcyBvZiBEYXRhQnVmZmVyCi0gKiBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHVuZGVybHlpbmcgZGF0YSBpcyBvZiB0eXBlIGRvdWJsZS4KKyAqIFRoZSBDbGFzcyBEYXRhQnVmZmVyRG91YmxlIGlzIHRoZSBzdWJjbGFzcyBvZiBEYXRhQnVmZmVyIGZvciB0aGUgY2FzZSB3aGVyZQorICogdGhlIHVuZGVybHlpbmcgZGF0YSBpcyBvZiB0eXBlIGRvdWJsZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBEYXRhQnVmZmVyRG91YmxlIGV4dGVuZHMgRGF0YUJ1ZmZlciB7CiAKLSAgICAvKiogVGhlIGRhdGEuICovCisgICAgLyoqCisgICAgICogVGhlIGRhdGEuCisgICAgICovCiAgICAgZG91YmxlIGRhdGFbXVtdOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgZG91YmxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzIHRoZSBkYXRhIGFycmF5cyB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBmcm9tIHRoZSBkYXRhIGFycmF5cwotICAgICAqIEBwYXJhbSBvZmZzZXRzIHRoZSBzdGFydGluZyBpbmRpY2VzIGZvciByZWFkaW5nIHRoZSAKLSAgICAgKiBkYXRhIGZyb20gdGhlIGludGVybmFsIGRhdGEgYXJyYXlzCi0gICAgKi8KKyAgICAgKiBAcGFyYW0gZGF0YUFycmF5cworICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXlzIHRvIGNvcHkgdGhlIGRhdGEgZnJvbS4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgZnJvbSB0aGUgZGF0YSBhcnJheXMuCisgICAgICogQHBhcmFtIG9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBpbmRpY2VzIGZvciByZWFkaW5nIHRoZSBkYXRhIGZyb20gdGhlIGludGVybmFsCisgICAgICogICAgICAgICAgICBkYXRhIGFycmF5cy4KKyAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckRvdWJsZShkb3VibGUgZGF0YUFycmF5c1tdW10sIGludCBzaXplLCBpbnQgb2Zmc2V0c1tdKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfRE9VQkxFLCBzaXplLCBkYXRhQXJyYXlzLmxlbmd0aCwgb2Zmc2V0cyk7CiAgICAgICAgIGRhdGEgPSBkYXRhQXJyYXlzLmNsb25lKCk7CkBAIC00Niw5ICs1MywxMCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIGRvdWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YUFycmF5cyB0aGUgZGF0YSBhcnJheXMgdG8gY29weSB0aGUgZGF0YSBmcm9tCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCi0gICAgICogZnJvbSB0aGUgZGF0YSBhcnJheXMKKyAgICAgKiBAcGFyYW0gZGF0YUFycmF5cworICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXlzIHRvIGNvcHkgdGhlIGRhdGEgZnJvbS4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgZnJvbSB0aGUgZGF0YSBhcnJheXMuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJEb3VibGUoZG91YmxlIGRhdGFBcnJheXNbXVtdLCBpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihUWVBFX0RPVUJMRSwgc2l6ZSwgZGF0YUFycmF5cy5sZW5ndGgpOwpAQCAtNTYsMTIgKzY0LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgZG91YmxlCi0gICAgICogd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgZG91YmxlIHdpdGggYSBzaW5nbGUgdW5kZXJseWluZworICAgICAqIGFycmF5IG9mIGRhdGEuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFBcnJheSB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBzdGFydGluZyBpbmRleCB0byB1c2Ugd2hlbiByZWFkaW5nIHRoZSBkYXRhCisgICAgICogQHBhcmFtIGRhdGFBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXkgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgaW5kZXggdG8gdXNlIHdoZW4gcmVhZGluZyB0aGUgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckRvdWJsZShkb3VibGUgZGF0YUFycmF5W10sIGludCBzaXplLCBpbnQgb2Zmc2V0KSB7CiAgICAgICAgIHN1cGVyKFRZUEVfRE9VQkxFLCBzaXplLCAxLCBvZmZzZXQpOwpAQCAtNzAsMTIgKzgxLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgZG91YmxlCi0gICAgICogd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEgc3RhcnRpbmcgYXQKLSAgICAgKiBpbmRleCAwLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIGRvdWJsZSB3aXRoIGEgc2luZ2xlIHVuZGVybHlpbmcKKyAgICAgKiBhcnJheSBvZiBkYXRhIHN0YXJ0aW5nIGF0IGluZGV4IDAuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFBcnJheSB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKKyAgICAgKiBAcGFyYW0gZGF0YUFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyRG91YmxlKGRvdWJsZSBkYXRhQXJyYXlbXSwgaW50IHNpemUpIHsKICAgICAgICAgc3VwZXIoVFlQRV9ET1VCTEUsIHNpemUpOwpAQCAtODQsMTIgKzk2LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGVtcHR5IGRhdGEgYnVmZmVyIG9mIHR5cGUgZG91YmxlCi0gICAgICogd2l0aCBvZmZzZXRzIGVxdWFsIHRvIHplcm8uCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGVtcHR5IGRhdGEgYnVmZmVyIG9mIHR5cGUgZG91YmxlIHdpdGggb2Zmc2V0cyBlcXVhbCB0bworICAgICAqIHplcm8uCiAgICAgICogCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCi0gICAgICogZnJvbSB0aGUgZGF0YSBhcnJheXMKLSAgICAgKiBAcGFyYW0gbnVtQmFua3MgdGhlIG51bWJlciBvZiBkYXRhIGFycmF5cyB0byBjcmVhdGUKKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgZnJvbSB0aGUgZGF0YSBhcnJheXMuCisgICAgICogQHBhcmFtIG51bUJhbmtzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGRhdGEgYXJyYXlzIHRvIGNyZWF0ZS4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckRvdWJsZShpbnQgc2l6ZSwgaW50IG51bUJhbmtzKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfRE9VQkxFLCBzaXplLCBudW1CYW5rcyk7CkBAIC0xMDEsMTEgKzExNCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBlbXB0eSBkYXRhIGJ1ZmZlciBvZiB0eXBlIGRvdWJsZQotICAgICAqIHdpdGggYSBzaW5nbGUgdW5kZXJseWluZyBhcnJheSBvZiBkYXRhIHN0YXJ0aW5nIGF0Ci0gICAgICogaW5kZXggMC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZW1wdHkgZGF0YSBidWZmZXIgb2YgdHlwZSBkb3VibGUgd2l0aCBhIHNpbmdsZQorICAgICAqIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YSBzdGFydGluZyBhdCBpbmRleCAwLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZS4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckRvdWJsZShpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihUWVBFX0RPVUJMRSwgc2l6ZSk7CkBAIC0xMzksMTIgKzE1MiwxMiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRFbGVtKGludCBiYW5rLCBpbnQgaSkgewotICAgICAgICByZXR1cm4gKGludCkgKGRhdGFbYmFua11bb2Zmc2V0c1tiYW5rXSArIGldKTsKKyAgICAgICAgcmV0dXJuIChpbnQpKGRhdGFbYmFua11bb2Zmc2V0c1tiYW5rXSArIGldKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmxvYXQgZ2V0RWxlbUZsb2F0KGludCBiYW5rLCBpbnQgaSkgewotICAgICAgICByZXR1cm4gKGZsb2F0KSAoZGF0YVtiYW5rXVtvZmZzZXRzW2JhbmtdICsgaV0pOworICAgICAgICByZXR1cm4gKGZsb2F0KShkYXRhW2JhbmtdW29mZnNldHNbYmFua10gKyBpXSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNjcsOSArMTgwLDkgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkYXRhIG9mIHRoZSBzcGVjaWZpZWQgaW50ZXJuYWwgZGF0YSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFuayB0aGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgZGF0YSBhcnJheQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRhdGEKKyAgICAgKiBAcGFyYW0gYmFuaworICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBkZXNpcmVkIGRhdGEgYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlW10gZ2V0RGF0YShpbnQgYmFuaykgewogICAgICAgICBub3RpZnlUYWtlbigpOwpAQCAtMTc4LDEyICsxOTEsMTIgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0RWxlbShpbnQgaSkgewotICAgICAgICByZXR1cm4gKGludCkgKGRhdGFbMF1bb2Zmc2V0ICsgaV0pOworICAgICAgICByZXR1cm4gKGludCkoZGF0YVswXVtvZmZzZXQgKyBpXSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZsb2F0IGdldEVsZW1GbG9hdChpbnQgaSkgewotICAgICAgICByZXR1cm4gKGZsb2F0KSAoZGF0YVswXVtvZmZzZXQgKyBpXSk7CisgICAgICAgIHJldHVybiAoZmxvYXQpKGRhdGFbMF1bb2Zmc2V0ICsgaV0pOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTk0LDcgKzIwNyw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYmFuayBkYXRhLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJhbmsgZGF0YQorICAgICAqIEByZXR1cm4gdGhlIGJhbmsgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlW11bXSBnZXRCYW5rRGF0YSgpIHsKICAgICAgICAgbm90aWZ5VGFrZW4oKTsKQEAgLTIwNCwxMSArMjE3LDEwIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZGF0YSBvZiB0aGUgZmlyc3QgZGF0YSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkYXRhCisgICAgICogQHJldHVybiB0aGUgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlW10gZ2V0RGF0YSgpIHsKICAgICAgICAgbm90aWZ5VGFrZW4oKTsKICAgICAgICAgcmV0dXJuIGRhdGFbMF07CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvRGF0YUJ1ZmZlckZsb2F0LmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvRGF0YUJ1ZmZlckZsb2F0LmphdmEKaW5kZXggZTM0MjQ1Yy4uOWE0YTZiZiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0RhdGFCdWZmZXJGbG9hdC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVyRmxvYXQuamF2YQpAQCAtMTgsMjUgKzE4LDMyIEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgRGF0YUJ1ZmZlckZsb2F0IGlzIHRoZSBzdWJjbGFzcyBvZiBEYXRhQnVmZmVyCi0gKiBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHVuZGVybHlpbmcgZGF0YSBpcyBmbG9hdC4KKyAqIFRoZSBDbGFzcyBEYXRhQnVmZmVyRmxvYXQgaXMgdGhlIHN1YmNsYXNzIG9mIERhdGFCdWZmZXIgZm9yIHRoZSBjYXNlIHdoZXJlCisgKiB0aGUgdW5kZXJseWluZyBkYXRhIGlzIGZsb2F0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIERhdGFCdWZmZXJGbG9hdCBleHRlbmRzIERhdGFCdWZmZXIgewogCi0gICAgLyoqIFRoZSBkYXRhLiAqLworICAgIC8qKgorICAgICAqIFRoZSBkYXRhLgorICAgICAqLwogICAgIGZsb2F0IGRhdGFbXVtdOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgZmxvYXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFBcnJheXMgdGhlIGRhdGEgYXJyYXlzIHRvIGNvcHkgdGhlIGRhdGEgZnJvbQotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAotICAgICAqIGZyb20gdGhlIGRhdGEgYXJyYXlzCi0gICAgICogQHBhcmFtIG9mZnNldHMgdGhlIHN0YXJ0aW5nIGluZGljZXMgZm9yIHJlYWRpbmcgdGhlIAotICAgICAqIGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwgZGF0YSBhcnJheXMKKyAgICAgKiBAcGFyYW0gZGF0YUFycmF5cworICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXlzIHRvIGNvcHkgdGhlIGRhdGEgZnJvbS4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgZnJvbSB0aGUgZGF0YSBhcnJheXMuCisgICAgICogQHBhcmFtIG9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBpbmRpY2VzIGZvciByZWFkaW5nIHRoZSBkYXRhIGZyb20gdGhlIGludGVybmFsCisgICAgICogICAgICAgICAgICBkYXRhIGFycmF5cy4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckZsb2F0KGZsb2F0IGRhdGFBcnJheXNbXVtdLCBpbnQgc2l6ZSwgaW50IG9mZnNldHNbXSkgewogICAgICAgICBzdXBlcihUWVBFX0ZMT0FULCBzaXplLCBkYXRhQXJyYXlzLmxlbmd0aCwgb2Zmc2V0cyk7CkBAIC00Niw5ICs1MywxMCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIGZsb2F0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzIHRoZSBkYXRhIGFycmF5cyB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBmcm9tIHRoZSBkYXRhIGFycmF5cworICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheXMgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSBmcm9tIHRoZSBkYXRhIGFycmF5cy4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckZsb2F0KGZsb2F0IGRhdGFBcnJheXNbXVtdLCBpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihUWVBFX0ZMT0FULCBzaXplLCBkYXRhQXJyYXlzLmxlbmd0aCk7CkBAIC01NiwxMiArNjQsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBmbG9hdAotICAgICAqIHdpdGggYSBzaW5nbGUgdW5kZXJseWluZyBhcnJheSBvZiBkYXRhLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIGZsb2F0IHdpdGggYSBzaW5nbGUgdW5kZXJseWluZworICAgICAqIGFycmF5IG9mIGRhdGEuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFBcnJheSB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBzdGFydGluZyBpbmRleCB0byB1c2Ugd2hlbiByZWFkaW5nIHRoZSBkYXRhCisgICAgICogQHBhcmFtIGRhdGFBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXkgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgaW5kZXggdG8gdXNlIHdoZW4gcmVhZGluZyB0aGUgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckZsb2F0KGZsb2F0IGRhdGFBcnJheVtdLCBpbnQgc2l6ZSwgaW50IG9mZnNldCkgewogICAgICAgICBzdXBlcihUWVBFX0ZMT0FULCBzaXplLCAxLCBvZmZzZXQpOwpAQCAtNzAsMTIgKzgxLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgZmxvYXQKLSAgICAgKiB3aXRoIGEgc2luZ2xlIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YSBzdGFydGluZyBhdAotICAgICAqIGluZGV4IDAuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgZmxvYXQgd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nCisgICAgICogYXJyYXkgb2YgZGF0YSBzdGFydGluZyBhdCBpbmRleCAwLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQXJyYXkgdGhlIGRhdGEgYXJyYXkgdG8gY29weSB0aGUgZGF0YSBmcm9tCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCisgICAgICogQHBhcmFtIGRhdGFBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXkgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZS4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckZsb2F0KGZsb2F0IGRhdGFBcnJheVtdLCBpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihUWVBFX0ZMT0FULCBzaXplKTsKQEAgLTg0LDEyICs5NiwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBlbXB0eSBkYXRhIGJ1ZmZlciBvZiB0eXBlIGZsb2F0Ci0gICAgICogd2l0aCBvZmZzZXRzIGVxdWFsIHRvIHplcm8uCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGVtcHR5IGRhdGEgYnVmZmVyIG9mIHR5cGUgZmxvYXQgd2l0aCBvZmZzZXRzIGVxdWFsIHRvCisgICAgICogemVyby4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBmcm9tIHRoZSBkYXRhIGFycmF5cwotICAgICAqIEBwYXJhbSBudW1CYW5rcyB0aGUgbnVtYmVyIG9mIGRhdGEgYXJyYXlzIHRvIGNyZWF0ZQorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSBmcm9tIHRoZSBkYXRhIGFycmF5cy4KKyAgICAgKiBAcGFyYW0gbnVtQmFua3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGF0YSBhcnJheXMgdG8gY3JlYXRlLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyRmxvYXQoaW50IHNpemUsIGludCBudW1CYW5rcykgewogICAgICAgICBzdXBlcihUWVBFX0ZMT0FULCBzaXplLCBudW1CYW5rcyk7CkBAIC0xMDEsMTEgKzExNCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBlbXB0eSBkYXRhIGJ1ZmZlciBvZiB0eXBlIGZsb2F0Ci0gICAgICogd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEgc3RhcnRpbmcgYXQKLSAgICAgKiBpbmRleCAwLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBlbXB0eSBkYXRhIGJ1ZmZlciBvZiB0eXBlIGZsb2F0IHdpdGggYSBzaW5nbGUKKyAgICAgKiB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEgc3RhcnRpbmcgYXQgaW5kZXggMC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJGbG9hdChpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihUWVBFX0ZMT0FULCBzaXplKTsKQEAgLTEyNyw3ICsxNDAsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RWxlbURvdWJsZShpbnQgYmFuaywgaW50IGksIGRvdWJsZSB2YWwpIHsKLSAgICAgICAgZGF0YVtiYW5rXVtvZmZzZXRzW2JhbmtdICsgaV0gPSAoZmxvYXQpIHZhbDsKKyAgICAgICAgZGF0YVtiYW5rXVtvZmZzZXRzW2JhbmtdICsgaV0gPSAoZmxvYXQpdmFsOwogICAgICAgICBub3RpZnlDaGFuZ2VkKCk7CiAgICAgfQogCkBAIC0xMzksNyArMTUyLDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0RWxlbShpbnQgYmFuaywgaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIChpbnQpIChkYXRhW2JhbmtdW29mZnNldHNbYmFua10gKyBpXSk7CisgICAgICAgIHJldHVybiAoaW50KShkYXRhW2JhbmtdW29mZnNldHNbYmFua10gKyBpXSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNjAsMTYgKzE3MywxNiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RWxlbURvdWJsZShpbnQgaSwgZG91YmxlIHZhbCkgewotICAgICAgICBkYXRhWzBdW29mZnNldCArIGldID0gKGZsb2F0KSB2YWw7CisgICAgICAgIGRhdGFbMF1bb2Zmc2V0ICsgaV0gPSAoZmxvYXQpdmFsOwogICAgICAgICBub3RpZnlDaGFuZ2VkKCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZGF0YSBvZiB0aGUgc3BlY2lmaWVkIGludGVybmFsIGRhdGEgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJhbmsgdGhlIGluZGV4IG9mIHRoZSBkZXNpcmVkIGFycmF5Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGF0YQorICAgICAqIEBwYXJhbSBiYW5rCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXRbXSBnZXREYXRhKGludCBiYW5rKSB7CiAgICAgICAgIG5vdGlmeVRha2VuKCk7CkBAIC0xNzgsNyArMTkxLDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0RWxlbShpbnQgaSkgewotICAgICAgICByZXR1cm4gKGludCkgKGRhdGFbMF1bb2Zmc2V0ICsgaV0pOworICAgICAgICByZXR1cm4gKGludCkoZGF0YVswXVtvZmZzZXQgKyBpXSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xOTQsNyArMjA3LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBiYW5rIGRhdGEuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYmFuayBkYXRhCisgICAgICogQHJldHVybiB0aGUgYmFuayBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdFtdW10gZ2V0QmFua0RhdGEoKSB7CiAgICAgICAgIG5vdGlmeVRha2VuKCk7CkBAIC0yMDQsMTEgKzIxNywxMCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRhdGEgb2YgdGhlIGZpcnN0IGRhdGEgYXJyYXkuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGF0YQorICAgICAqIEByZXR1cm4gdGhlIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0W10gZ2V0RGF0YSgpIHsKICAgICAgICAgbm90aWZ5VGFrZW4oKTsKICAgICAgICAgcmV0dXJuIGRhdGFbMF07CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvRGF0YUJ1ZmZlckludC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0RhdGFCdWZmZXJJbnQuamF2YQppbmRleCA0M2RjMTg4Li4zODBhMTI3IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvRGF0YUJ1ZmZlckludC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVySW50LmphdmEKQEAgLTE4LDI1ICsxOCwzMiBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIC8qKgotICogVGhlIENsYXNzIERhdGFCdWZmZXJJbnQgaXMgdGhlIHN1YmNsYXNzIG9mIERhdGFCdWZmZXIKLSAqIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgdW5kZXJseWluZyBkYXRhIGlzIG9mIHR5cGUgaW50LgorICogVGhlIENsYXNzIERhdGFCdWZmZXJJbnQgaXMgdGhlIHN1YmNsYXNzIG9mIERhdGFCdWZmZXIgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZQorICogdW5kZXJseWluZyBkYXRhIGlzIG9mIHR5cGUgaW50ZWdlci4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBEYXRhQnVmZmVySW50IGV4dGVuZHMgRGF0YUJ1ZmZlciB7CiAKLSAgICAvKiogVGhlIGRhdGEuICovCisgICAgLyoqCisgICAgICogVGhlIGRhdGEuCisgICAgICovCiAgICAgaW50IGRhdGFbXVtdOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgaW50LgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIGludGVnZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFBcnJheXMgdGhlIGRhdGEgYXJyYXlzIHRvIGNvcHkgdGhlIGRhdGEgZnJvbQotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAotICAgICAqIGZyb20gdGhlIGRhdGEgYXJyYXlzCi0gICAgICogQHBhcmFtIG9mZnNldHMgdGhlIHN0YXJ0aW5nIGluZGljZXMgZm9yIHJlYWRpbmcgdGhlIAotICAgICAqIGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwgZGF0YSBhcnJheXMKKyAgICAgKiBAcGFyYW0gZGF0YUFycmF5cworICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXlzIHRvIGNvcHkgdGhlIGRhdGEgZnJvbS4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgZnJvbSB0aGUgZGF0YSBhcnJheXMuCisgICAgICogQHBhcmFtIG9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBpbmRpY2VzIGZvciByZWFkaW5nIHRoZSBkYXRhIGZyb20gdGhlIGludGVybmFsCisgICAgICogICAgICAgICAgICBkYXRhIGFycmF5cy4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckludChpbnQgZGF0YUFycmF5c1tdW10sIGludCBzaXplLCBpbnQgb2Zmc2V0c1tdKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfSU5ULCBzaXplLCBkYXRhQXJyYXlzLmxlbmd0aCwgb2Zmc2V0cyk7CkBAIC00NCwxMSArNTEsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBpbnQuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgaW50ZWdlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YUFycmF5cyB0aGUgZGF0YSBhcnJheXMgdG8gY29weSB0aGUgZGF0YSBmcm9tCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCi0gICAgICogZnJvbSB0aGUgZGF0YSBhcnJheXMKKyAgICAgKiBAcGFyYW0gZGF0YUFycmF5cworICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXlzIHRvIGNvcHkgdGhlIGRhdGEgZnJvbS4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgZnJvbSB0aGUgZGF0YSBhcnJheXMuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJJbnQoaW50IGRhdGFBcnJheXNbXVtdLCBpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihUWVBFX0lOVCwgc2l6ZSwgZGF0YUFycmF5cy5sZW5ndGgpOwpAQCAtNTYsMTIgKzY0LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgaW50Ci0gICAgICogd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgaW50ZWdlciB3aXRoIGEgc2luZ2xlIHVuZGVybHlpbmcKKyAgICAgKiBhcnJheSBvZiBkYXRhLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQXJyYXkgdGhlIGRhdGEgYXJyYXkgdG8gY29weSB0aGUgZGF0YSBmcm9tCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgc3RhcnRpbmcgaW5kZXggdG8gdXNlIHdoZW4gcmVhZGluZyB0aGUgZGF0YQorICAgICAqIEBwYXJhbSBkYXRhQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5IHRvIGNvcHkgdGhlIGRhdGEgZnJvbS4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIGluZGV4IHRvIHVzZSB3aGVuIHJlYWRpbmcgdGhlIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJJbnQoaW50IGRhdGFBcnJheVtdLCBpbnQgc2l6ZSwgaW50IG9mZnNldCkgewogICAgICAgICBzdXBlcihUWVBFX0lOVCwgc2l6ZSwgMSwgb2Zmc2V0KTsKQEAgLTcwLDEyICs4MSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIGludAotICAgICAqIHdpdGggYSBzaW5nbGUgdW5kZXJseWluZyBhcnJheSBvZiBkYXRhIHN0YXJ0aW5nIGF0Ci0gICAgICogaW5kZXggMC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBpbnRlZ2VyIHdpdGggYSBzaW5nbGUgdW5kZXJseWluZworICAgICAqIGFycmF5IG9mIGRhdGEgc3RhcnRpbmcgYXQgaW5kZXggMC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YUFycmF5IHRoZSBkYXRhIGFycmF5IHRvIGNvcHkgdGhlIGRhdGEgZnJvbQotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAorICAgICAqIEBwYXJhbSBkYXRhQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5IHRvIGNvcHkgdGhlIGRhdGEgZnJvbS4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJJbnQoaW50IGRhdGFBcnJheVtdLCBpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihUWVBFX0lOVCwgc2l6ZSk7CkBAIC04NCwxMiArOTYsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZW1wdHkgZGF0YSBidWZmZXIgb2YgdHlwZSBpbnQKLSAgICAgKiB3aXRoIG9mZnNldHMgZXF1YWwgdG8gemVyby4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZW1wdHkgZGF0YSBidWZmZXIgb2YgdHlwZSBpbnRlZ2VyIHdpdGggb2Zmc2V0cyBlcXVhbAorICAgICAqIHRvIHplcm8uCiAgICAgICogCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCi0gICAgICogZnJvbSB0aGUgZGF0YSBhcnJheXMKLSAgICAgKiBAcGFyYW0gbnVtQmFua3MgdGhlIG51bWJlciBvZiBkYXRhIGFycmF5cyB0byBjcmVhdGUKKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgZnJvbSB0aGUgZGF0YSBhcnJheXMuCisgICAgICogQHBhcmFtIG51bUJhbmtzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGRhdGEgYXJyYXlzIHRvIGNyZWF0ZS4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckludChpbnQgc2l6ZSwgaW50IG51bUJhbmtzKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfSU5ULCBzaXplLCBudW1CYW5rcyk7CkBAIC0xMDEsMTEgKzExNCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBlbXB0eSBkYXRhIGJ1ZmZlciBvZiB0eXBlIGludAotICAgICAqIHdpdGggYSBzaW5nbGUgdW5kZXJseWluZyBhcnJheSBvZiBkYXRhIHN0YXJ0aW5nIGF0Ci0gICAgICogaW5kZXggMC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZW1wdHkgZGF0YSBidWZmZXIgb2YgdHlwZSBpbnRlZ2VyIHdpdGggYSBzaW5nbGUKKyAgICAgKiB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEgc3RhcnRpbmcgYXQgaW5kZXggMC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJJbnQoaW50IHNpemUpIHsKICAgICAgICAgc3VwZXIoVFlQRV9JTlQsIHNpemUpOwpAQCAtMTMzLDkgKzE0Niw5IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZGF0YSBvZiB0aGUgc3BlY2lmaWVkIGludGVybmFsIGRhdGEgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJhbmsgdGhlIGluZGV4IG9mIHRoZSBkZXNpcmVkIGRhdGEgYXJyYXkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkYXRhCisgICAgICogQHBhcmFtIGJhbmsKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBkYXRhIGFycmF5LgorICAgICAqIEByZXR1cm4gdGhlIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIGludFtdIGdldERhdGEoaW50IGJhbmspIHsKICAgICAgICAgbm90aWZ5VGFrZW4oKTsKQEAgLTE1MCw3ICsxNjMsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGJhbmsgZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBiYW5rIGRhdGEKKyAgICAgKiBAcmV0dXJuIHRoZSBiYW5rIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIGludFtdW10gZ2V0QmFua0RhdGEoKSB7CiAgICAgICAgIG5vdGlmeVRha2VuKCk7CkBAIC0xNjAsMTEgKzE3MywxMCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRhdGEgb2YgdGhlIGZpcnN0IGRhdGEgYXJyYXkuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGF0YQorICAgICAqIEByZXR1cm4gdGhlIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIGludFtdIGdldERhdGEoKSB7CiAgICAgICAgIG5vdGlmeVRha2VuKCk7CiAgICAgICAgIHJldHVybiBkYXRhWzBdOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0RhdGFCdWZmZXJTaG9ydC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0RhdGFCdWZmZXJTaG9ydC5qYXZhCmluZGV4IDgxOWJhNGEuLjFiMTFiMjkgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVyU2hvcnQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvRGF0YUJ1ZmZlclNob3J0LmphdmEKQEAgLTE4LDI1ICsxOCwzMiBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIC8qKgotICogVGhlIENsYXNzIERhdGFCdWZmZXJTaG9ydCBpcyB0aGUgc3ViY2xhc3Mgb2YgRGF0YUJ1ZmZlcgotICogZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB1bmRlcmx5aW5nIGRhdGEgaXMgc2hvcnQuCisgKiBUaGUgQ2xhc3MgRGF0YUJ1ZmZlclNob3J0IGlzIHRoZSBzdWJjbGFzcyBvZiBEYXRhQnVmZmVyIGZvciB0aGUgY2FzZSB3aGVyZQorICogdGhlIHVuZGVybHlpbmcgZGF0YSBpcyBzaG9ydC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBEYXRhQnVmZmVyU2hvcnQgZXh0ZW5kcyBEYXRhQnVmZmVyIHsKIAotICAgIC8qKiBUaGUgZGF0YS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZGF0YS4KKyAgICAgKi8KICAgICBzaG9ydCBkYXRhW11bXTsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIHNob3J0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzIHRoZSBkYXRhIGFycmF5cyB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBmcm9tIHRoZSBkYXRhIGFycmF5cwotICAgICAqIEBwYXJhbSBvZmZzZXRzIHRoZSBzdGFydGluZyBpbmRpY2VzIGZvciByZWFkaW5nIHRoZSAKLSAgICAgKiBkYXRhIGZyb20gdGhlIGludGVybmFsIGRhdGEgYXJyYXlzCisgICAgICogQHBhcmFtIGRhdGFBcnJheXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5cyB0byBjb3B5IHRoZSBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIGZyb20gdGhlIGRhdGEgYXJyYXlzLgorICAgICAqIEBwYXJhbSBvZmZzZXRzCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgaW5kaWNlcyBmb3IgcmVhZGluZyB0aGUgZGF0YSBmcm9tIHRoZSBpbnRlcm5hbAorICAgICAqICAgICAgICAgICAgZGF0YSBhcnJheXMuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJTaG9ydChzaG9ydCBkYXRhQXJyYXlzW11bXSwgaW50IHNpemUsIGludCBvZmZzZXRzW10pIHsKICAgICAgICAgc3VwZXIoVFlQRV9TSE9SVCwgc2l6ZSwgZGF0YUFycmF5cy5sZW5ndGgsIG9mZnNldHMpOwpAQCAtNDYsOSArNTMsMTAgQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBzaG9ydC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YUFycmF5cyB0aGUgZGF0YSBhcnJheXMgdG8gY29weSB0aGUgZGF0YSBmcm9tCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCi0gICAgICogZnJvbSB0aGUgZGF0YSBhcnJheXMKKyAgICAgKiBAcGFyYW0gZGF0YUFycmF5cworICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXlzIHRvIGNvcHkgdGhlIGRhdGEgZnJvbS4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgZnJvbSB0aGUgZGF0YSBhcnJheXMuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJTaG9ydChzaG9ydCBkYXRhQXJyYXlzW11bXSwgaW50IHNpemUpIHsKICAgICAgICAgc3VwZXIoVFlQRV9TSE9SVCwgc2l6ZSwgZGF0YUFycmF5cy5sZW5ndGgpOwpAQCAtNTYsMTMgKzY0LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgc2hvcnQKLSAgICAgKiB3aXRoIGEgc2luZ2xlIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBzaG9ydCB3aXRoIGEgc2luZ2xlIHVuZGVybHlpbmcKKyAgICAgKiBhcnJheSBvZiBkYXRhLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQXJyYXkgdGhlIGRhdGEgYXJyYXkgdG8gY29weSB0aGUgZGF0YSBmcm9tCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgc3RhcnRpbmcgaW5kZXggdG8gdXNlIHdoZW4gcmVhZGluZyB0aGUgZGF0YQotCisgICAgICogQHBhcmFtIGRhdGFBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXkgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgaW5kZXggdG8gdXNlIHdoZW4gcmVhZGluZyB0aGUgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlclNob3J0KHNob3J0IGRhdGFBcnJheVtdLCBpbnQgc2l6ZSwgaW50IG9mZnNldCkgewogICAgICAgICBzdXBlcihUWVBFX1NIT1JULCBzaXplLCAxLCBvZmZzZXQpOwpAQCAtNzEsMTMgKzgxLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgc2hvcnQKLSAgICAgKiB3aXRoIGEgc2luZ2xlIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YSBzdGFydGluZyBhdAotICAgICAqIGluZGV4IDAuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgc2hvcnQgd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nCisgICAgICogYXJyYXkgb2YgZGF0YSBzdGFydGluZyBhdCBpbmRleCAwLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQXJyYXkgdGhlIGRhdGEgYXJyYXkgdG8gY29weSB0aGUgZGF0YSBmcm9tCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCi0KKyAgICAgKiBAcGFyYW0gZGF0YUFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyU2hvcnQoc2hvcnQgZGF0YUFycmF5W10sIGludCBzaXplKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfU0hPUlQsIHNpemUpOwpAQCAtODYsMTIgKzk2LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgc2hvcnQKLSAgICAgKiB3aXRoIG9mZnNldHMgZXF1YWwgdG8gemVyby4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBzaG9ydCB3aXRoIG9mZnNldHMgZXF1YWwgdG8gemVyby4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBmcm9tIHRoZSBkYXRhIGFycmF5cwotICAgICAqIEBwYXJhbSBudW1CYW5rcyB0aGUgbnVtYmVyIG9mIGRhdGEgYXJyYXlzIHRvIGNyZWF0ZQorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSBmcm9tIHRoZSBkYXRhIGFycmF5cy4KKyAgICAgKiBAcGFyYW0gbnVtQmFua3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGF0YSBhcnJheXMgdG8gY3JlYXRlLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyU2hvcnQoaW50IHNpemUsIGludCBudW1CYW5rcykgewogICAgICAgICBzdXBlcihUWVBFX1NIT1JULCBzaXplLCBudW1CYW5rcyk7CkBAIC0xMDMsMTEgKzExMywxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBlbXB0eSBkYXRhIGJ1ZmZlciBvZiB0eXBlIHNob3J0Ci0gICAgICogd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEgc3RhcnRpbmcgYXQKLSAgICAgKiBpbmRleCAwLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBlbXB0eSBkYXRhIGJ1ZmZlciBvZiB0eXBlIHNob3J0IHdpdGggYSBzaW5nbGUKKyAgICAgKiB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEgc3RhcnRpbmcgYXQgaW5kZXggMC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJTaG9ydChpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihUWVBFX1NIT1JULCBzaXplKTsKQEAgLTExNywxMyArMTI3LDEzIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRFbGVtKGludCBiYW5rLCBpbnQgaSwgaW50IHZhbCkgewotICAgICAgICBkYXRhW2JhbmtdW29mZnNldHNbYmFua10gKyBpXSA9IChzaG9ydCkgdmFsOworICAgICAgICBkYXRhW2JhbmtdW29mZnNldHNbYmFua10gKyBpXSA9IChzaG9ydCl2YWw7CiAgICAgICAgIG5vdGlmeUNoYW5nZWQoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRFbGVtKGludCBpLCBpbnQgdmFsKSB7Ci0gICAgICAgIGRhdGFbMF1bb2Zmc2V0ICsgaV0gPSAoc2hvcnQpIHZhbDsKKyAgICAgICAgZGF0YVswXVtvZmZzZXQgKyBpXSA9IChzaG9ydCl2YWw7CiAgICAgICAgIG5vdGlmeUNoYW5nZWQoKTsKICAgICB9CiAKQEAgLTEzNSw5ICsxNDUsOSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRhdGEgb2YgdGhlIHNwZWNpZmllZCBpbnRlcm5hbCBkYXRhIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBiYW5rIHRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBkYXRhIGFycmF5Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGF0YQorICAgICAqIEBwYXJhbSBiYW5rCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgZGF0YSBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBzaG9ydFtdIGdldERhdGEoaW50IGJhbmspIHsKICAgICAgICAgbm90aWZ5VGFrZW4oKTsKQEAgLTE1Miw3ICsxNjIsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGJhbmsgZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBiYW5rIGRhdGEKKyAgICAgKiBAcmV0dXJuIHRoZSBiYW5rIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHNob3J0W11bXSBnZXRCYW5rRGF0YSgpIHsKICAgICAgICAgbm90aWZ5VGFrZW4oKTsKQEAgLTE2MiwxMSArMTcyLDEwIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZGF0YSBvZiB0aGUgZmlyc3QgZGF0YSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkYXRhCisgICAgICogQHJldHVybiB0aGUgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgc2hvcnRbXSBnZXREYXRhKCkgewogICAgICAgICBub3RpZnlUYWtlbigpOwogICAgICAgICByZXR1cm4gZGF0YVswXTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVyVVNob3J0LmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvRGF0YUJ1ZmZlclVTaG9ydC5qYXZhCmluZGV4IDc5ODI2NzguLjU4ZDlkODMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVyVVNob3J0LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0RhdGFCdWZmZXJVU2hvcnQuamF2YQpAQCAtMTgsMzQgKzE4LDQyIEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBDbGFzcyBEYXRhQnVmZmVyVVNob3J0IGlzIHRoZSBzdWJjbGFzcyBvZiBEYXRhQnVmZmVyCi0gKiBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHVuZGVybHlpbmcgZGF0YSBpcyB1bnNpZ25lZCBzaG9ydC4KKyAqIFRoZSBDbGFzcyBEYXRhQnVmZmVyVVNob3J0IGlzIHRoZSBzdWJjbGFzcyBvZiBEYXRhQnVmZmVyIGZvciB0aGUgY2FzZSB3aGVyZQorICogdGhlIHVuZGVybHlpbmcgZGF0YSBpcyB1bnNpZ25lZCBzaG9ydC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBEYXRhQnVmZmVyVVNob3J0IGV4dGVuZHMgRGF0YUJ1ZmZlciB7CiAKLSAgICAvKiogVGhlIGRhdGEuICovCisgICAgLyoqCisgICAgICogVGhlIGRhdGEuCisgICAgICovCiAgICAgc2hvcnQgZGF0YVtdW107CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSB1bnNpZ25lZCBzaG9ydC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YUFycmF5cyB0aGUgZGF0YSBhcnJheXMgdG8gY29weSB0aGUgZGF0YSBmcm9tCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCi0gICAgICogZnJvbSB0aGUgZGF0YSBhcnJheXMKLSAgICAgKiBAcGFyYW0gb2Zmc2V0cyB0aGUgc3RhcnRpbmcgaW5kaWNlcyBmb3IgcmVhZGluZyB0aGUgCi0gICAgICogZGF0YSBmcm9tIHRoZSBpbnRlcm5hbCBkYXRhIGFycmF5cworICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheXMgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSBmcm9tIHRoZSBkYXRhIGFycmF5cy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIGluZGljZXMgZm9yIHJlYWRpbmcgdGhlIGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwKKyAgICAgKiAgICAgICAgICAgIGRhdGEgYXJyYXlzLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyVVNob3J0KHNob3J0IGRhdGFBcnJheXNbXVtdLCBpbnQgc2l6ZSwgaW50IG9mZnNldHNbXSkgewogICAgICAgICBzdXBlcihUWVBFX1VTSE9SVCwgc2l6ZSwgZGF0YUFycmF5cy5sZW5ndGgsIG9mZnNldHMpOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgZGF0YUFycmF5cy5sZW5ndGg7IGkrKyl7Ci0gICAgICAgICAgICBpZihkYXRhQXJyYXlzW2ldLmxlbmd0aCA8IG9mZnNldHNbaV0gKyBzaXplKXsKLSAgICAgICAgICAgICAgICAvLyBhd3QuMjhkPUxlbmd0aCBvZiBkYXRhQXJyYXlbezB9XSBpcyBsZXNzIHRoYW4gc2l6ZSArIG9mZnNldFt7MX1dCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yOEQiLCBpLCBpKSk7ICAvLyROT04tTkxTLTEkCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YUFycmF5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGRhdGFBcnJheXNbaV0ubGVuZ3RoIDwgb2Zmc2V0c1tpXSArIHNpemUpIHsKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjhkPUxlbmd0aCBvZiBkYXRhQXJyYXlbezB9XSBpcyBsZXNzIHRoYW4gc2l6ZSArCisgICAgICAgICAgICAgICAgLy8gb2Zmc2V0W3sxfV0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI4RCIsIGksIGkpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGRhdGEgPSBkYXRhQXJyYXlzLmNsb25lKCk7CkBAIC01NCw5ICs2MiwxMCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIHVuc2lnbmVkIHNob3J0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzIHRoZSBkYXRhIGFycmF5cyB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBmcm9tIHRoZSBkYXRhIGFycmF5cworICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheXMgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSBmcm9tIHRoZSBkYXRhIGFycmF5cy4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlclVTaG9ydChzaG9ydCBkYXRhQXJyYXlzW11bXSwgaW50IHNpemUpIHsKICAgICAgICAgc3VwZXIoVFlQRV9VU0hPUlQsIHNpemUsIGRhdGFBcnJheXMubGVuZ3RoKTsKQEAgLTY0LDE2ICs3MywxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIHVuc2lnbmVkIHNob3J0Ci0gICAgICogd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgdW5zaWduZWQgc2hvcnQgd2l0aCBhIHNpbmdsZQorICAgICAqIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YUFycmF5IHRoZSBkYXRhIGFycmF5IHRvIGNvcHkgdGhlIGRhdGEgZnJvbQotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIHN0YXJ0aW5nIGluZGV4IHRvIHVzZSB3aGVuIHJlYWRpbmcgdGhlIGRhdGEKKyAgICAgKiBAcGFyYW0gZGF0YUFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBpbmRleCB0byB1c2Ugd2hlbiByZWFkaW5nIHRoZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyVVNob3J0KHNob3J0IGRhdGFBcnJheVtdLCBpbnQgc2l6ZSwgaW50IG9mZnNldCkgewogICAgICAgICBzdXBlcihUWVBFX1VTSE9SVCwgc2l6ZSwgMSwgb2Zmc2V0KTsKLSAgICAgICAgaWYoZGF0YUFycmF5Lmxlbmd0aCA8IHNpemUgKyBvZmZzZXQpeworICAgICAgICBpZiAoZGF0YUFycmF5Lmxlbmd0aCA8IHNpemUgKyBvZmZzZXQpIHsKICAgICAgICAgICAgIC8vIGF3dC4yOEU9TGVuZ3RoIG9mIGRhdGFBcnJheSBpcyBsZXNzIHRoYW4gc2l6ZSArIG9mZnNldAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yOEUiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQpAQCAtODIsMTIgKzk0LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgdW5zaWduZWQgc2hvcnQKLSAgICAgKiB3aXRoIGEgc2luZ2xlIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YSBzdGFydGluZyBhdAotICAgICAqIGluZGV4IDAuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgdW5zaWduZWQgc2hvcnQgd2l0aCBhIHNpbmdsZQorICAgICAqIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YSBzdGFydGluZyBhdCBpbmRleCAwLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQXJyYXkgdGhlIGRhdGEgYXJyYXkgdG8gY29weSB0aGUgZGF0YSBmcm9tCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCisgICAgICogQHBhcmFtIGRhdGFBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXkgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZS4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlclVTaG9ydChzaG9ydCBkYXRhQXJyYXlbXSwgaW50IHNpemUpIHsKICAgICAgICAgc3VwZXIoVFlQRV9VU0hPUlQsIHNpemUpOwpAQCAtOTYsMjggKzEwOSwyOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBlbXB0eSBkYXRhIGJ1ZmZlciBvZiB0eXBlIHVuc2lnbmVkIHNob3J0Ci0gICAgICogd2l0aCBvZmZzZXRzIGVxdWFsIHRvIHplcm8uCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGVtcHR5IGRhdGEgYnVmZmVyIG9mIHR5cGUgdW5zaWduZWQgc2hvcnQgd2l0aCBvZmZzZXRzCisgICAgICogZXF1YWwgdG8gemVyby4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBmcm9tIHRoZSBkYXRhIGFycmF5cwotICAgICAqIEBwYXJhbSBudW1CYW5rcyB0aGUgbnVtYmVyIG9mIGRhdGEgYXJyYXlzIHRvIGNyZWF0ZQorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSBmcm9tIHRoZSBkYXRhIGFycmF5cy4KKyAgICAgKiBAcGFyYW0gbnVtQmFua3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGF0YSBhcnJheXMgdG8gY3JlYXRlLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyVVNob3J0KGludCBzaXplLCBpbnQgbnVtQmFua3MpIHsKICAgICAgICAgc3VwZXIoVFlQRV9VU0hPUlQsIHNpemUsIG51bUJhbmtzKTsKICAgICAgICAgZGF0YSA9IG5ldyBzaG9ydFtudW1CYW5rc11bXTsKLSAgICAgICAgaW50IGk9IDA7Ci0gICAgICAgIHdoaWxlKCBpIDwgbnVtQmFua3MpIHsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoaSA8IG51bUJhbmtzKSB7CiAgICAgICAgICAgICBkYXRhW2krK10gPSBuZXcgc2hvcnRbc2l6ZV07CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZW1wdHkgZGF0YSBidWZmZXIgb2YgdHlwZSB1bnNpZ25lZCBzaG9ydAotICAgICAqIHdpdGggYSBzaW5nbGUgdW5kZXJseWluZyBhcnJheSBvZiBkYXRhIHN0YXJ0aW5nIGF0Ci0gICAgICogaW5kZXggMC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZW1wdHkgZGF0YSBidWZmZXIgb2YgdHlwZSB1bnNpZ25lZCBzaG9ydCB3aXRoIGEgc2luZ2xlCisgICAgICogdW5kZXJseWluZyBhcnJheSBvZiBkYXRhIHN0YXJ0aW5nIGF0IGluZGV4IDAuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyVVNob3J0KGludCBzaXplKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfVVNIT1JULCBzaXplKTsKQEAgLTE0NSw5ICsxNTksOSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRhdGEgb2YgdGhlIHNwZWNpZmllZCBpbnRlcm5hbCBkYXRhIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBiYW5rIHRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBkYXRhIGFycmF5Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGF0YQorICAgICAqIEBwYXJhbSBiYW5rCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgZGF0YSBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBzaG9ydFtdIGdldERhdGEoaW50IGJhbmspIHsKICAgICAgICAgbm90aWZ5VGFrZW4oKTsKQEAgLTE2Miw3ICsxNzYsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGJhbmsgZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBiYW5rIGRhdGEKKyAgICAgKiBAcmV0dXJuIHRoZSBiYW5rIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHNob3J0W11bXSBnZXRCYW5rRGF0YSgpIHsKICAgICAgICAgbm90aWZ5VGFrZW4oKTsKQEAgLTE3MiwxMSArMTg2LDEwIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZGF0YSBvZiB0aGUgZmlyc3QgZGF0YSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkYXRhCisgICAgICogQHJldHVybiB0aGUgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgc2hvcnRbXSBnZXREYXRhKCkgewogICAgICAgICBub3RpZnlUYWtlbigpOwogICAgICAgICByZXR1cm4gZGF0YVswXTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9EaXJlY3RDb2xvck1vZGVsLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvRGlyZWN0Q29sb3JNb2RlbC5qYXZhCmluZGV4IDdhMjg3YzAuLjcwMGViN2EgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9EaXJlY3RDb2xvck1vZGVsLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0RpcmVjdENvbG9yTW9kZWwuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIGltcG9ydCBqYXZhLmF3dC5jb2xvci5Db2xvclNwYWNlOwpAQCAtMjgsMTA0ICsyOSwxNDEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgRGlyZWN0Q29sb3JNb2RlbCByZXByZXNlbnRzIGEgc3RhbmRhcmQgKHBhY2tlZCkgUkdCCi0gKiBjb2xvciBtb2RlbCB3aXRoIGFkZGl0aW9uYWwgc3VwcG9ydCBmb3IgY29udmVydGluZyBiZXR3ZWVuIHNSR0IKLSAqIGNvbG9yIHNwYWNlIGFuZCA4IG9yIDE2IGJpdCBsaW5lYXIgUkdCIGNvbG9yIHNwYWNlIHVzaW5nIGxvb2t1cCB0YWJsZXMuCisgKiBUaGUgQ2xhc3MgRGlyZWN0Q29sb3JNb2RlbCByZXByZXNlbnRzIGEgc3RhbmRhcmQgKHBhY2tlZCkgUkdCIGNvbG9yIG1vZGVsCisgKiB3aXRoIGFkZGl0aW9uYWwgc3VwcG9ydCBmb3IgY29udmVydGluZyBiZXR3ZWVuIHNSR0IgY29sb3Igc3BhY2UgYW5kIDggb3IgMTYKKyAqIGJpdCBsaW5lYXIgUkdCIGNvbG9yIHNwYWNlIHVzaW5nIGxvb2t1cCB0YWJsZXMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRGlyZWN0Q29sb3JNb2RlbCBleHRlbmRzIFBhY2tlZENvbG9yTW9kZWwgewogCi0gICAgLyoqIFRoZSBmcm9tXyBsaW5lYSByXyByZyBiXyBsdXQuICovCisgICAgLyoqCisgICAgICogVGhlIGZyb21fIGxpbmVhIHJfIHJnIGJfIGx1dC4KKyAgICAgKi8KICAgICBwcml2YXRlIGJ5dGUgZnJvbV9MSU5FQVJfUkdCX0xVVFtdOyAvLyBMb29rdXAgdGFibGUgZm9yIGNvbnZlcnNpb24gZnJvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExpbmVhciBSR0IgQ29sb3IgU3BhY2UgaW50byBzUkdCCiAKLSAgICAvKiogVGhlIHRvXyBsaW5lYSByXzggcmcgYl8gbHV0LiAqLwotICAgIHByaXZhdGUgYnl0ZSB0b19MSU5FQVJfOFJHQl9MVVRbXTsgIC8vIExvb2t1cCB0YWJsZSBmb3IgY29udmVyc2lvbiBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc1JHQiBDb2xvciBTcGFjZSBpbnRvIExpbmVhciBSR0IgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOCBiaXQKKyAgICAvLyBMaW5lYXIgUkdCIENvbG9yIFNwYWNlIGludG8gc1JHQgogCi0gICAgLyoqIFRoZSB0b18gbGluZWEgcl8xNiByZyBiXyBsdXQuICovCi0gICAgcHJpdmF0ZSBzaG9ydCB0b19MSU5FQVJfMTZSR0JfTFVUW107ICAvLyBMb29rdXAgdGFibGUgZm9yIGNvbnZlcnNpb24gZnJvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc1JHQiBDb2xvciBTcGFjZSBpbnRvIExpbmVhciBSR0IgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxNiBiaXQgCisgICAgLyoqCisgICAgICogVGhlIHRvXyBsaW5lYSByXzggcmcgYl8gbHV0LgorICAgICAqLworICAgIHByaXZhdGUgYnl0ZSB0b19MSU5FQVJfOFJHQl9MVVRbXTsgLy8gTG9va3VwIHRhYmxlIGZvciBjb252ZXJzaW9uIGZyb20KIAotICAgIC8qKiBUaGUgYWxwaGEgbHV0LiAqLwotICAgIHByaXZhdGUgYnl0ZSBhbHBoYUxVVFtdOyAgICAgICAgICAgIC8vIExvb2t1cCB0YWJsZSBmb3Igc2NhbGUgYWxwaGEgdmFsdWUgIAorICAgIC8vIHNSR0IgQ29sb3IgU3BhY2UgaW50byBMaW5lYXIgUkdCCisgICAgLy8gOCBiaXQKIAotICAgIC8qKiBUaGUgY29sb3IgbHUgdHMuICovCi0gICAgcHJpdmF0ZSBieXRlIGNvbG9yTFVUc1tdW107ICAgICAgICAgLy8gTG9va3VwIHRhYmxlcyBmb3Igc2NhbGUgY29sb3IgdmFsdWVzIAorICAgIC8qKgorICAgICAqIFRoZSB0b18gbGluZWEgcl8xNiByZyBiXyBsdXQuCisgICAgICovCisgICAgcHJpdmF0ZSBzaG9ydCB0b19MSU5FQVJfMTZSR0JfTFVUW107IC8vIExvb2t1cCB0YWJsZSBmb3IgY29udmVyc2lvbiBmcm9tCiAKLSAgICAvKiogVGhlIGlzX3MgcmdiLiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc19zUkdCOyAgICAgICAgICAgIC8vIENvbG9yTW9kZWwgaGFzIHNSR0IgQ29sb3JTcGFjZQorICAgIC8vIHNSR0IgQ29sb3IgU3BhY2UgaW50byBMaW5lYXIgUkdCCisgICAgLy8gMTYgYml0CiAKLSAgICAvKiogVGhlIGlzXyBsaW5lYSByXyByZ2IuICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzX0xJTkVBUl9SR0I7ICAgICAgLy8gQ29sb3IgTW9kZWwgaGFzIExpbmVhciBSR0IgQ29sb3IgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3BhY2UKKyAgICAvKioKKyAgICAgKiBUaGUgYWxwaGEgbHV0LgorICAgICAqLworICAgIHByaXZhdGUgYnl0ZSBhbHBoYUxVVFtdOyAvLyBMb29rdXAgdGFibGUgZm9yIHNjYWxlIGFscGhhIHZhbHVlCiAKLSAgICAvKiogVGhlIExJTkVBIHJfIHJnIGJfIGxlbmd0aC4gKi8KLSAgICBwcml2YXRlIGludCBMSU5FQVJfUkdCX0xlbmd0aDsgICAgICAvLyBMaW5lYXIgUkdCIGJpdCBsZW5ndGgKKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3IgbHUgdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBieXRlIGNvbG9yTFVUc1tdW107IC8vIExvb2t1cCB0YWJsZXMgZm9yIHNjYWxlIGNvbG9yIHZhbHVlcwogCi0gICAgLyoqIFRoZSBmYWN0b3IuICovCi0gICAgcHJpdmF0ZSBmbG9hdCBmRmFjdG9yOyAgICAgICAgICAgICAgLy8gU2NhbGUgZmFjdG9yCisgICAgLyoqCisgICAgICogVGhlIGlzX3MgcmdiLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc19zUkdCOyAvLyBDb2xvck1vZGVsIGhhcyBzUkdCIENvbG9yU3BhY2UKKworICAgIC8qKgorICAgICAqIFRoZSBpc18gbGluZWEgcl8gcmdiLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc19MSU5FQVJfUkdCOyAvLyBDb2xvciBNb2RlbCBoYXMgTGluZWFyIFJHQiBDb2xvcgorCisgICAgLy8gU3BhY2UKKworICAgIC8qKgorICAgICAqIFRoZSBMSU5FQSByXyByZyBiXyBsZW5ndGguCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgTElORUFSX1JHQl9MZW5ndGg7IC8vIExpbmVhciBSR0IgYml0IGxlbmd0aAorCisgICAgLyoqCisgICAgICogVGhlIGZhY3Rvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGZGYWN0b3I7IC8vIFNjYWxlIGZhY3RvcgogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRpcmVjdCBjb2xvciBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3BhY2UgdGhlIGNvbG9yIHNwYWNlCi0gICAgICogQHBhcmFtIGJpdHMgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcwotICAgICAqIEBwYXJhbSBybWFzayB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSByZWQgYmFuZAotICAgICAqIEBwYXJhbSBnbWFzayB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSBncmVlbiBiYW5kCi0gICAgICogQHBhcmFtIGJtYXNrIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJsdWUgYmFuZAotICAgICAqIEBwYXJhbSBhbWFzayB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSBhbHBoYSBiYW5kCi0gICAgICogQHBhcmFtIGlzQWxwaGFQcmVtdWx0aXBsaWVkIHdoZXRoZXIgdGhlIGFscGhhIGlzIHByZW11bHRpcGxpZWQgaW4gdGhpcyBjb2xvciBtb2RlbAotICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUgdGhlIHRyYW5zZmVyIHR5cGUgKHByaW1pdGl2ZSBqYXZhIHR5cGUgCi0gICAgICogdG8gdXNlIGZvciB0aGUgY29tcG9uZW50cykKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGNvbWJpbmVkIAotICAgICAqIGJpdG1hc2tzIGZvciB0aGUgY29sb3IgYmFuZHMgaXMgbGVzcyB0aGFuIG9uZSBvciBncmVhdGVyIHRoYW4gMzIKKyAgICAgKiBAcGFyYW0gc3BhY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xvciBzcGFjZS4KKyAgICAgKiBAcGFyYW0gYml0cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcy4KKyAgICAgKiBAcGFyYW0gcm1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZCBiYW5kLgorICAgICAqIEBwYXJhbSBnbWFzaworICAgICAqICAgICAgICAgICAgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgZ3JlZW4gYmFuZC4KKyAgICAgKiBAcGFyYW0gYm1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJsdWUgYmFuZC4KKyAgICAgKiBAcGFyYW0gYW1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFscGhhIGJhbmQuCisgICAgICogQHBhcmFtIGlzQWxwaGFQcmVtdWx0aXBsaWVkCisgICAgICogICAgICAgICAgICB3aGV0aGVyIHRoZSBhbHBoYSBpcyBwcmUtbXVsdGlwbGllZCBpbiB0aGlzIGNvbG9yIG1vZGVsLgorICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc2ZlciB0eXBlIChwcmltaXRpdmUgamF2YSB0eXBlIHRvIHVzZSBmb3IgdGhlCisgICAgICogICAgICAgICAgICBjb21wb25lbnRzKS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgY29tYmluZWQgYml0bWFza3MgZm9yIHRoZSBjb2xvcgorICAgICAqICAgICAgICAgICAgIGJhbmRzIGlzIGxlc3MgdGhhbiBvbmUgb3IgZ3JlYXRlciB0aGFuIDMyLgogICAgICAqLwotICAgIHB1YmxpYyBEaXJlY3RDb2xvck1vZGVsKENvbG9yU3BhY2Ugc3BhY2UsIGludCBiaXRzLCBpbnQgcm1hc2ssIGludCBnbWFzaywKLSAgICAgICAgICAgIGludCBibWFzaywgaW50IGFtYXNrLCBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkLAotICAgICAgICAgICAgaW50IHRyYW5zZmVyVHlwZSkgeworICAgIHB1YmxpYyBEaXJlY3RDb2xvck1vZGVsKENvbG9yU3BhY2Ugc3BhY2UsIGludCBiaXRzLCBpbnQgcm1hc2ssIGludCBnbWFzaywgaW50IGJtYXNrLCBpbnQgYW1hc2ssCisgICAgICAgICAgICBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkLCBpbnQgdHJhbnNmZXJUeXBlKSB7CiAKICAgICAgICAgc3VwZXIoc3BhY2UsIGJpdHMsIHJtYXNrLCBnbWFzaywgYm1hc2ssIGFtYXNrLCBpc0FscGhhUHJlbXVsdGlwbGllZCwKLSAgICAgICAgICAgICAgICAoYW1hc2sgPT0gMCA/IFRyYW5zcGFyZW5jeS5PUEFRVUUgOiBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQpLAotICAgICAgICAgICAgICAgIHRyYW5zZmVyVHlwZSk7CisgICAgICAgICAgICAgICAgKGFtYXNrID09IDAgPyBUcmFuc3BhcmVuY3kuT1BBUVVFIDogVHJhbnNwYXJlbmN5LlRSQU5TTFVDRU5UKSwgdHJhbnNmZXJUeXBlKTsKIAogICAgICAgICBpbml0TFVUcygpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkaXJlY3QgY29sb3IgbW9kZWwsIGRldGVybWluaW5nIHRoZSB0cmFuc2ZlciAKLSAgICAgKiB0eXBlIGZyb20gdGhlIGJpdHMgYXJyYXksIHRoZSB0cmFuc3BhcmVuY3kgZnJvbSB0aGUgYWxwaGEgbWFzaywgCi0gICAgICogYW5kIHRoZSBkZWZhdWx0IGNvbG9yIHNwYWNlIHtAbGluayBDb2xvclNwYWNlI0NTX3NSR0J9LgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkaXJlY3QgY29sb3IgbW9kZWwsIGRldGVybWluaW5nIHRoZSB0cmFuc2ZlciB0eXBlIGZyb20KKyAgICAgKiB0aGUgYml0cyBhcnJheSwgdGhlIHRyYW5zcGFyZW5jeSBmcm9tIHRoZSBhbHBoYSBtYXNrLCBhbmQgdGhlIGRlZmF1bHQKKyAgICAgKiBjb2xvciBzcGFjZSB7QGxpbmsgQ29sb3JTcGFjZSNDU19zUkdCfS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYml0cyB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzCi0gICAgICogQHBhcmFtIHJtYXNrIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZCBiYW5kCi0gICAgICogQHBhcmFtIGdtYXNrIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdyZWVuIGJhbmQKLSAgICAgKiBAcGFyYW0gYm1hc2sgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgYmx1ZSBiYW5kCi0gICAgICogQHBhcmFtIGFtYXNrIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFscGhhIGJhbmQKKyAgICAgKiBAcGFyYW0gYml0cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcy4KKyAgICAgKiBAcGFyYW0gcm1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZCBiYW5kLgorICAgICAqIEBwYXJhbSBnbWFzaworICAgICAqICAgICAgICAgICAgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgZ3JlZW4gYmFuZC4KKyAgICAgKiBAcGFyYW0gYm1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJsdWUgYmFuZC4KKyAgICAgKiBAcGFyYW0gYW1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFscGhhIGJhbmQuCiAgICAgICovCi0gICAgcHVibGljIERpcmVjdENvbG9yTW9kZWwoaW50IGJpdHMsIGludCBybWFzaywgaW50IGdtYXNrLCBpbnQgYm1hc2ssCi0gICAgICAgICAgICBpbnQgYW1hc2spIHsKKyAgICBwdWJsaWMgRGlyZWN0Q29sb3JNb2RlbChpbnQgYml0cywgaW50IHJtYXNrLCBpbnQgZ21hc2ssIGludCBibWFzaywgaW50IGFtYXNrKSB7CiAKLSAgICAgICAgc3VwZXIoQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IpLCBiaXRzLCBybWFzaywgZ21hc2ssCi0gICAgICAgICAgICAgICAgYm1hc2ssIGFtYXNrLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAoYW1hc2sgPT0gMCA/IFRyYW5zcGFyZW5jeS5PUEFRVUUgOiBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQpLAotICAgICAgICAgICAgICAgIENvbG9yTW9kZWwuZ2V0VHJhbnNmZXJUeXBlKGJpdHMpKTsKKyAgICAgICAgc3VwZXIoQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IpLCBiaXRzLCBybWFzaywgZ21hc2ssIGJtYXNrLCBhbWFzaywgZmFsc2UsCisgICAgICAgICAgICAgICAgKGFtYXNrID09IDAgPyBUcmFuc3BhcmVuY3kuT1BBUVVFIDogVHJhbnNwYXJlbmN5LlRSQU5TTFVDRU5UKSwgQ29sb3JNb2RlbAorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRyYW5zZmVyVHlwZShiaXRzKSk7CiAKICAgICAgICAgaW5pdExVVHMoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGlyZWN0IGNvbG9yIG1vZGVsIHdpdGggbm8gYWxwaGEgY2hhbm5lbCwgCi0gICAgICogZGV0ZXJtaW5pbmcgdGhlIHRyYW5zZmVyIHR5cGUgZnJvbSB0aGUgYml0cyBhcnJheSwgCi0gICAgICogdGhlIGRlZmF1bHQgY29sb3Igc3BhY2Uge0BsaW5rIENvbG9yU3BhY2UjQ1Nfc1JHQn0sIAotICAgICAqIGFuZCB3aXRoIHRoZSB0cmFuc3BhcmVuY3kgc2V0IHRvIHtAbGluayBUcmFuc3BhcmVuY3kjT1BBUVVFfS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGlyZWN0IGNvbG9yIG1vZGVsIHdpdGggbm8gYWxwaGEgY2hhbm5lbCwgZGV0ZXJtaW5pbmcKKyAgICAgKiB0aGUgdHJhbnNmZXIgdHlwZSBmcm9tIHRoZSBiaXRzIGFycmF5LCB0aGUgZGVmYXVsdCBjb2xvciBzcGFjZQorICAgICAqIHtAbGluayBDb2xvclNwYWNlI0NTX3NSR0J9LCBhbmQgd2l0aCB0aGUgdHJhbnNwYXJlbmN5IHNldCB0bworICAgICAqIHtAbGluayBUcmFuc3BhcmVuY3kjT1BBUVVFfS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYml0cyB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzCi0gICAgICogQHBhcmFtIHJtYXNrIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZCBiYW5kCi0gICAgICogQHBhcmFtIGdtYXNrIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdyZWVuIGJhbmQKLSAgICAgKiBAcGFyYW0gYm1hc2sgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgYmx1ZSBiYW5kCisgICAgICogQHBhcmFtIGJpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBjb21wb25lbnQgbWFza3MuCisgICAgICogQHBhcmFtIHJtYXNrCisgICAgICogICAgICAgICAgICB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSByZWQgYmFuZC4KKyAgICAgKiBAcGFyYW0gZ21hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdyZWVuIGJhbmQuCisgICAgICogQHBhcmFtIGJtYXNrCisgICAgICogICAgICAgICAgICB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSBibHVlIGJhbmQuCiAgICAgICovCiAgICAgcHVibGljIERpcmVjdENvbG9yTW9kZWwoaW50IGJpdHMsIGludCBybWFzaywgaW50IGdtYXNrLCBpbnQgYm1hc2spIHsKICAgICAgICAgdGhpcyhiaXRzLCBybWFzaywgZ21hc2ssIGJtYXNrLCAwKTsKQEAgLTEzOSw0MiArMTc3LDQyIEBACiAgICAgICAgIH0KIAogICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZSBiYVtdOwotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYmEgPSBuZXcgYnl0ZVsxXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmEgPSAoYnl0ZVtdKSBvYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiYVswXSA9IChieXRlKSBwaXhlbDsKLSAgICAgICAgICAgIG9iaiA9IGJhOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGJ5dGUgYmFbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmEgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBiYSA9IChieXRlW10pb2JqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiYVswXSA9IChieXRlKXBpeGVsOworICAgICAgICAgICAgICAgIG9iaiA9IGJhOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIHNob3J0IHNhW107Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzYSA9IG5ldyBzaG9ydFsxXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2EgPSAoc2hvcnRbXSkgb2JqOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2FbMF0gPSAoc2hvcnQpIHBpeGVsOwotICAgICAgICAgICAgb2JqID0gc2E7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzYVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzYSA9IG5ldyBzaG9ydFsxXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzYSA9IChzaG9ydFtdKW9iajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2FbMF0gPSAoc2hvcnQpcGl4ZWw7CisgICAgICAgICAgICAgICAgb2JqID0gc2E7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgaW50IGlhW107Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpYSA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlhID0gKGludFtdKSBvYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpYVswXSA9IHBpeGVsOwotICAgICAgICAgICAgb2JqID0gaWE7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpbnQgaWFbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWEgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlhID0gKGludFtdKW9iajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWFbMF0gPSBwaXhlbDsKKyAgICAgICAgICAgICAgICBvYmogPSBpYTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYXd0LjIxND1UaGlzIENvbG9yIE1vZGVsIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHRyYW5zZmVyVHlwZQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxNCIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjE0PVRoaXMgQ29sb3IgTW9kZWwgZG9lc24ndCBzdXBwb3J0IHRoaXMgdHJhbnNmZXJUeXBlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxNCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIG9iajsKQEAgLTE4Nyw3ICsyMjUsNyBAQAogICAgICAgICAgICAgaWYgKHBpeGVsID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBpYSA9IG5ldyBpbnRbMV07CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlhID0gKGludFtdKSBwaXhlbDsKKyAgICAgICAgICAgICAgICBpYSA9IChpbnRbXSlwaXhlbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlhWzBdID0gcmdiOwogICAgICAgICAgICAgcmV0dXJuIGlhOwpAQCAtMjQ2LDY3ICsyODQsNjYgQEAKICAgICAgICAgaW50IHB4bCA9IDA7CiAgICAgICAgIGlmIChoYXNBbHBoYSkgewogICAgICAgICAgICAgZmxvYXQgbm9ybUFscGhhID0gbm9ybUNvbXBbbnVtQ29sb3JDb21wb25lbnRzXTsKLSAgICAgICAgICAgIGFscGhhID0gKGludCkgKG5vcm1BbHBoYSAqIG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdICsgMC41Zik7CisgICAgICAgICAgICBhbHBoYSA9IChpbnQpKG5vcm1BbHBoYSAqIG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdICsgMC41Zik7CiAgICAgICAgICAgICBpZiAoaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKLSAgICAgICAgICAgICAgICByZWQgPSAoaW50KSAobm9ybUNvbXBbMF0gKiBub3JtQWxwaGEgKiBtYXhWYWx1ZXNbMF0gKyAwLjVmKTsKLSAgICAgICAgICAgICAgICBncmVlbiA9IChpbnQpIChub3JtQ29tcFsxXSAqIG5vcm1BbHBoYSAqIG1heFZhbHVlc1sxXSArIDAuNWYpOwotICAgICAgICAgICAgICAgIGJsdWUgPSAoaW50KSAobm9ybUNvbXBbMl0gKiBub3JtQWxwaGEgKiBtYXhWYWx1ZXNbMl0gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICByZWQgPSAoaW50KShub3JtQ29tcFswXSAqIG5vcm1BbHBoYSAqIG1heFZhbHVlc1swXSArIDAuNWYpOworICAgICAgICAgICAgICAgIGdyZWVuID0gKGludCkobm9ybUNvbXBbMV0gKiBub3JtQWxwaGEgKiBtYXhWYWx1ZXNbMV0gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICBibHVlID0gKGludCkobm9ybUNvbXBbMl0gKiBub3JtQWxwaGEgKiBtYXhWYWx1ZXNbMl0gKyAwLjVmKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVkID0gKGludCkgKG5vcm1Db21wWzBdICogbWF4VmFsdWVzWzBdICsgMC41Zik7Ci0gICAgICAgICAgICAgICAgZ3JlZW4gPSAoaW50KSAobm9ybUNvbXBbMV0gKiBtYXhWYWx1ZXNbMV0gKyAwLjVmKTsKLSAgICAgICAgICAgICAgICBibHVlID0gKGludCkgKG5vcm1Db21wWzJdICogbWF4VmFsdWVzWzJdICsgMC41Zik7CisgICAgICAgICAgICAgICAgcmVkID0gKGludCkobm9ybUNvbXBbMF0gKiBtYXhWYWx1ZXNbMF0gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICBncmVlbiA9IChpbnQpKG5vcm1Db21wWzFdICogbWF4VmFsdWVzWzFdICsgMC41Zik7CisgICAgICAgICAgICAgICAgYmx1ZSA9IChpbnQpKG5vcm1Db21wWzJdICogbWF4VmFsdWVzWzJdICsgMC41Zik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBweGwgPSAoYWxwaGEgPDwgb2Zmc2V0c1szXSkgJiBjb21wb25lbnRNYXNrc1szXTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlZCA9IChpbnQpIChub3JtQ29tcFswXSAqIG1heFZhbHVlc1swXSArIDAuNWYpOwotICAgICAgICAgICAgZ3JlZW4gPSAoaW50KSAobm9ybUNvbXBbMV0gKiBtYXhWYWx1ZXNbMV0gKyAwLjVmKTsKLSAgICAgICAgICAgIGJsdWUgPSAoaW50KSAobm9ybUNvbXBbMl0gKiBtYXhWYWx1ZXNbMl0gKyAwLjVmKTsKKyAgICAgICAgICAgIHJlZCA9IChpbnQpKG5vcm1Db21wWzBdICogbWF4VmFsdWVzWzBdICsgMC41Zik7CisgICAgICAgICAgICBncmVlbiA9IChpbnQpKG5vcm1Db21wWzFdICogbWF4VmFsdWVzWzFdICsgMC41Zik7CisgICAgICAgICAgICBibHVlID0gKGludCkobm9ybUNvbXBbMl0gKiBtYXhWYWx1ZXNbMl0gKyAwLjVmKTsKICAgICAgICAgfQogCi0gICAgICAgIHB4bCB8PSAoKHJlZCA8PCBvZmZzZXRzWzBdKSAmIGNvbXBvbmVudE1hc2tzWzBdKSB8Ci0gICAgICAgICAgICAgICAoKGdyZWVuIDw8IG9mZnNldHNbMV0pICYgY29tcG9uZW50TWFza3NbMV0pIHwKLSAgICAgICAgICAgICAgICgoYmx1ZSA8PCBvZmZzZXRzWzJdKSAmIGNvbXBvbmVudE1hc2tzWzJdKTsKKyAgICAgICAgcHhsIHw9ICgocmVkIDw8IG9mZnNldHNbMF0pICYgY29tcG9uZW50TWFza3NbMF0pCisgICAgICAgICAgICAgICAgfCAoKGdyZWVuIDw8IG9mZnNldHNbMV0pICYgY29tcG9uZW50TWFza3NbMV0pCisgICAgICAgICAgICAgICAgfCAoKGJsdWUgPDwgb2Zmc2V0c1syXSkgJiBjb21wb25lbnRNYXNrc1syXSk7CiAKICAgICAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGJ5dGUgYmFbXTsKLSAgICAgICAgICAgIGlmIChwaXhlbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYmEgPSBuZXcgYnl0ZVsxXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmEgPSAoYnl0ZVtdKSBwaXhlbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJhWzBdID0gKGJ5dGUpIHB4bDsKLSAgICAgICAgICAgIHJldHVybiBiYTsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgYnl0ZSBiYVtdOworICAgICAgICAgICAgICAgIGlmIChwaXhlbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJhID0gbmV3IGJ5dGVbMV07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYmEgPSAoYnl0ZVtdKXBpeGVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiYVswXSA9IChieXRlKXB4bDsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmE7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgc2hvcnQgc2FbXTsKLSAgICAgICAgICAgIGlmIChwaXhlbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2EgPSBuZXcgc2hvcnRbMV07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNhID0gKHNob3J0W10pIHBpeGVsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2FbMF0gPSAoc2hvcnQpIHB4bDsKLSAgICAgICAgICAgIHJldHVybiBzYTsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzYVtdOworICAgICAgICAgICAgICAgIGlmIChwaXhlbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNhID0gbmV3IHNob3J0WzFdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNhID0gKHNob3J0W10pcGl4ZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNhWzBdID0gKHNob3J0KXB4bDsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2E7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgaW50IGlhW107Ci0gICAgICAgICAgICBpZiAocGl4ZWwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlhID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWEgPSAoaW50W10pIHBpeGVsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWFbMF0gPSBweGw7Ci0gICAgICAgICAgICByZXR1cm4gaWE7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgaW50IGlhW107CisgICAgICAgICAgICAgICAgaWYgKHBpeGVsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWEgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlhID0gKGludFtdKXBpeGVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpYVswXSA9IHB4bDsKKyAgICAgICAgICAgICAgICByZXR1cm4gaWE7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGF3dC4yMTQ9VGhpcyBDb2xvciBNb2RlbCBkb2Vzbid0IHN1cHBvcnQgdGhpcyB0cmFuc2ZlclR5cGUKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTQiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gYXd0LjIxND1UaGlzIENvbG9yIE1vZGVsIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHRyYW5zZmVyVHlwZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTQiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBDb2xvck1vZGVsIGNvZXJjZURhdGEoV3JpdGFibGVSYXN0ZXIgcmFzdGVyLAotICAgICAgICAgICAgYm9vbGVhbiBpc0FscGhhUHJlbXVsdGlwbGllZCkgeworICAgIHB1YmxpYyBmaW5hbCBDb2xvck1vZGVsIGNvZXJjZURhdGEoV3JpdGFibGVSYXN0ZXIgcmFzdGVyLCBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7CiAKICAgICAgICAgaWYgKCFoYXNBbHBoYSB8fCB0aGlzLmlzQWxwaGFQcmVtdWx0aXBsaWVkID09IGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7CiAgICAgICAgICAgICByZXR1cm4gdGhpczsKQEAgLTMyNCw4NiArMzYxLDgyIEBACiAKICAgICAgICAgaWYgKGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7CiAgICAgICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewotICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKywgbWluWSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwLCB4ID0gbWluWDsgaiA8IHc7IGorKywgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzID0gcmFzdGVyLmdldFBpeGVsKHgsIG1pblksIGNvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldFBpeGVsKHgsIG1pblksIHRyYW5zcGFyZW50Q29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhRmFjdG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ29sb3JDb21wb25lbnRzOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50c1tuXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoYWxwaGEgKiBjb21wb25lbnRzW25dICsgMC41Zik7CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKywgbWluWSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMCwgeCA9IG1pblg7IGogPCB3OyBqKyssIHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMgPSByYXN0ZXIuZ2V0UGl4ZWwoeCwgbWluWSwgY29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCB0cmFuc3BhcmVudENvbXBvbmVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0gY29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdIC8gYWxwaGFGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ29sb3JDb21wb25lbnRzOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbbl0gPSAoaW50KShhbHBoYSAqIGNvbXBvbmVudHNbbl0gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0UGl4ZWwoeCwgbWluWSwgY29tcG9uZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCBjb21wb25lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8vIGF3dC4yMTQ9VGhpcyBDb2xvciBNb2RlbCBkb2Vzbid0IHN1cHBvcnQgdGhpcyB0cmFuc2ZlclR5cGUKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE0IikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gYXd0LjIxND1UaGlzIENvbG9yIE1vZGVsIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzCisgICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zZmVyVHlwZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE0IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewotICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKywgbWluWSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwLCB4ID0gbWluWDsgaiA8IHc7IGorKywgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzID0gcmFzdGVyLmdldFBpeGVsKHgsIG1pblksIGNvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUZhY3RvciAvIGNvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUNvbG9yQ29tcG9uZW50czsgbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbbl0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGFscGhhICogY29tcG9uZW50c1tuXSArIDAuNWYpOworICAgICAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoOyBpKyssIG1pblkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAsIHggPSBtaW5YOyBqIDwgdzsgaisrLCB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzID0gcmFzdGVyLmdldFBpeGVsKHgsIG1pblksIGNvbXBvbmVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IGFscGhhRmFjdG9yIC8gY29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUNvbG9yQ29tcG9uZW50czsgbisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzW25dID0gKGludCkoYWxwaGEgKiBjb21wb25lbnRzW25dICsgMC41Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldFBpeGVsKHgsIG1pblksIGNvbXBvbmVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0UGl4ZWwoeCwgbWluWSwgY29tcG9uZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvLyBhd3QuMjE0PVRoaXMgQ29sb3IgTW9kZWwgZG9lc24ndCBzdXBwb3J0IHRoaXMgdHJhbnNmZXJUeXBlCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxNCIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8vIGF3dC4yMTQ9VGhpcyBDb2xvciBNb2RlbCBkb2Vzbid0IHN1cHBvcnQgdGhpcworICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2ZlclR5cGUKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxNCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQogCiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gbmV3IERpcmVjdENvbG9yTW9kZWwoY3MsIHBpeGVsX2JpdHMsIGNvbXBvbmVudE1hc2tzWzBdLAotICAgICAgICAgICAgICAgIGNvbXBvbmVudE1hc2tzWzFdLCBjb21wb25lbnRNYXNrc1syXSwgY29tcG9uZW50TWFza3NbM10sCi0gICAgICAgICAgICAgICAgaXNBbHBoYVByZW11bHRpcGxpZWQsIHRyYW5zZmVyVHlwZSk7CisgICAgICAgIHJldHVybiBuZXcgRGlyZWN0Q29sb3JNb2RlbChjcywgcGl4ZWxfYml0cywgY29tcG9uZW50TWFza3NbMF0sIGNvbXBvbmVudE1hc2tzWzFdLAorICAgICAgICAgICAgICAgIGNvbXBvbmVudE1hc2tzWzJdLCBjb21wb25lbnRNYXNrc1szXSwgaXNBbHBoYVByZW11bHRpcGxpZWQsIHRyYW5zZmVyVHlwZSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgLy8gVGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3VyLiAKKyAgICAgICAgLy8gVGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3VyLgogICAgICAgICAvLyBJdCBjb3VsZCBiZSByZXZlbGVkIHN1Y2ggd2F5OgotICAgICAgICAvLyBCdWZmZXJlZEltYWdlIGJpID0gbmV3IEJ1ZmZlcmVkSW1hZ2UoMSwgMSwgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKTsKKyAgICAgICAgLy8gQnVmZmVyZWRJbWFnZSBiaSA9IG5ldyBCdWZmZXJlZEltYWdlKDEsIDEsCisgICAgICAgIC8vIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQik7CiAgICAgICAgIC8vIENvbG9yTW9kZWwgY20gPSBiaS5nZXRDb2xvck1vZGVsKCk7CiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihjbS50b1N0cmluZygpKTsKICAgICAgICAgU3RyaW5nIHN0ciA9ICJEaXJlY3RDb2xvck1vZGVsOiIgKyAiIHJtYXNrID0gIiArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhjb21wb25lbnRNYXNrc1swXSkgKyAiIGdtYXNrID0gIiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgIEludGVnZXIudG9IZXhTdHJpbmcoY29tcG9uZW50TWFza3NbMV0pICsgIiBibWFzayA9ICIgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNvbXBvbmVudE1hc2tzWzJdKSArICIgYW1hc2sgPSAiICsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgKCFoYXNBbHBoYSA/ICIwIiA6IEludGVnZXIudG9IZXhTdHJpbmcoY29tcG9uZW50TWFza3NbM10pKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIEludGVnZXIudG9IZXhTdHJpbmcoY29tcG9uZW50TWFza3NbMF0pICsgIiBnbWFzayA9ICIgKyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhjb21wb25lbnRNYXNrc1sxXSkgKyAiIGJtYXNrID0gIiArIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNvbXBvbmVudE1hc2tzWzJdKSArICIgYW1hc2sgPSAiICsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICghaGFzQWxwaGEgPyAiMCIgOiBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNvbXBvbmVudE1hc2tzWzNdKSk7IC8vJE5PTi1OTFMtMSQKIAogICAgICAgICByZXR1cm4gc3RyOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBpbnRbXSBnZXRDb21wb25lbnRzKE9iamVjdCBwaXhlbCwgaW50IGNvbXBvbmVudHNbXSwKLSAgICAgICAgICAgIGludCBvZmZzZXQpIHsKKyAgICBwdWJsaWMgZmluYWwgaW50W10gZ2V0Q29tcG9uZW50cyhPYmplY3QgcGl4ZWwsIGludCBjb21wb25lbnRzW10sIGludCBvZmZzZXQpIHsKIAogICAgICAgICBpZiAoY29tcG9uZW50cyA9PSBudWxsKSB7CiAgICAgICAgICAgICBjb21wb25lbnRzID0gbmV3IGludFtudW1Db21wb25lbnRzICsgb2Zmc2V0XTsKQEAgLTQxMiwyNSArNDQ1LDI2IEBACiAgICAgICAgIGludCBpbnRQaXhlbCA9IDA7CiAKICAgICAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10pIHBpeGVsOwotICAgICAgICAgICAgaW50UGl4ZWwgPSBiYVswXSAmIDB4ZmY7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSlwaXhlbDsKKyAgICAgICAgICAgICAgICBpbnRQaXhlbCA9IGJhWzBdICYgMHhmZjsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10pIHBpeGVsOwotICAgICAgICAgICAgaW50UGl4ZWwgPSBzYVswXSAmIDB4ZmZmZjsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIHNob3J0IHNhW10gPSAoc2hvcnRbXSlwaXhlbDsKKyAgICAgICAgICAgICAgICBpbnRQaXhlbCA9IHNhWzBdICYgMHhmZmZmOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKSBwaXhlbDsKLSAgICAgICAgICAgIGludFBpeGVsID0gaWFbMF07Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpbnQgaWFbXSA9IChpbnRbXSlwaXhlbDsKKyAgICAgICAgICAgICAgICBpbnRQaXhlbCA9IGlhWzBdOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBhd3QuMjJEPVRoaXMgdHJhbnNmZXJUeXBlICggezB9ICkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNvbG9yIG1vZGVsCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjJEIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyVHlwZSkpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjJEPVRoaXMgdHJhbnNmZXJUeXBlICggezB9ICkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzCisgICAgICAgICAgICAgICAgLy8gY29sb3IgbW9kZWwKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjJEIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlKSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50cyhpbnRQaXhlbCwgY29tcG9uZW50cywgb2Zmc2V0KTsKQEAgLTQ0MCwyNCArNDc0LDI0IEBACiAgICAgcHVibGljIGludCBnZXRSZWQoT2JqZWN0IGluRGF0YSkgewogICAgICAgICBpbnQgcGl4ZWwgPSAwOwogICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSkgaW5EYXRhOwotICAgICAgICAgICAgcGl4ZWwgPSBiYVswXSAmIDB4ZmY7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSlpbkRhdGE7CisgICAgICAgICAgICAgICAgcGl4ZWwgPSBiYVswXSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgc2hvcnQgc2FbXSA9IChzaG9ydFtdKSBpbkRhdGE7Ci0gICAgICAgICAgICBwaXhlbCA9IHNhWzBdICYgMHhmZmZmOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgc2hvcnQgc2FbXSA9IChzaG9ydFtdKWluRGF0YTsKKyAgICAgICAgICAgICAgICBwaXhlbCA9IHNhWzBdICYgMHhmZmZmOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKSBpbkRhdGE7Ci0gICAgICAgICAgICBwaXhlbCA9IGlhWzBdOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10paW5EYXRhOworICAgICAgICAgICAgICAgIHBpeGVsID0gaWFbMF07CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGF3dC4yMTQ9VGhpcyBDb2xvciBNb2RlbCBkb2Vzbid0IHN1cHBvcnQgdGhpcyB0cmFuc2ZlclR5cGUKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTQiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gYXd0LjIxND1UaGlzIENvbG9yIE1vZGVsIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHRyYW5zZmVyVHlwZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTQiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZ2V0UmVkKHBpeGVsKTsKICAgICB9CkBAIC00NjYsMjQgKzUwMCwyNCBAQAogICAgIHB1YmxpYyBpbnQgZ2V0UkdCKE9iamVjdCBpbkRhdGEpIHsKICAgICAgICAgaW50IHBpeGVsID0gMDsKICAgICAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10pIGluRGF0YTsKLSAgICAgICAgICAgIHBpeGVsID0gYmFbMF0gJiAweGZmOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10paW5EYXRhOworICAgICAgICAgICAgICAgIHBpeGVsID0gYmFbMF0gJiAweGZmOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIHNob3J0IHNhW10gPSAoc2hvcnRbXSkgaW5EYXRhOwotICAgICAgICAgICAgcGl4ZWwgPSBzYVswXSAmIDB4ZmZmZjsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIHNob3J0IHNhW10gPSAoc2hvcnRbXSlpbkRhdGE7CisgICAgICAgICAgICAgICAgcGl4ZWwgPSBzYVswXSAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBpbnQgaWFbXSA9IChpbnRbXSkgaW5EYXRhOwotICAgICAgICAgICAgcGl4ZWwgPSBpYVswXTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKWluRGF0YTsKKyAgICAgICAgICAgICAgICBwaXhlbCA9IGlhWzBdOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBhd3QuMjE0PVRoaXMgQ29sb3IgTW9kZWwgZG9lc24ndCBzdXBwb3J0IHRoaXMgdHJhbnNmZXJUeXBlCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE0IikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIGF3dC4yMTQ9VGhpcyBDb2xvciBNb2RlbCBkb2Vzbid0IHN1cHBvcnQgdGhpcyB0cmFuc2ZlclR5cGUKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE0IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGdldFJHQihwaXhlbCk7CiAgICAgfQpAQCAtNDkyLDI0ICs1MjYsMjQgQEAKICAgICBwdWJsaWMgaW50IGdldEdyZWVuKE9iamVjdCBpbkRhdGEpIHsKICAgICAgICAgaW50IHBpeGVsID0gMDsKICAgICAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10pIGluRGF0YTsKLSAgICAgICAgICAgIHBpeGVsID0gYmFbMF0gJiAweGZmOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10paW5EYXRhOworICAgICAgICAgICAgICAgIHBpeGVsID0gYmFbMF0gJiAweGZmOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIHNob3J0IHNhW10gPSAoc2hvcnRbXSkgaW5EYXRhOwotICAgICAgICAgICAgcGl4ZWwgPSBzYVswXSAmIDB4ZmZmZjsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIHNob3J0IHNhW10gPSAoc2hvcnRbXSlpbkRhdGE7CisgICAgICAgICAgICAgICAgcGl4ZWwgPSBzYVswXSAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBpbnQgaWFbXSA9IChpbnRbXSkgaW5EYXRhOwotICAgICAgICAgICAgcGl4ZWwgPSBpYVswXTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKWluRGF0YTsKKyAgICAgICAgICAgICAgICBwaXhlbCA9IGlhWzBdOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBhd3QuMjE0PVRoaXMgQ29sb3IgTW9kZWwgZG9lc24ndCBzdXBwb3J0IHRoaXMgdHJhbnNmZXJUeXBlCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE0IikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIGF3dC4yMTQ9VGhpcyBDb2xvciBNb2RlbCBkb2Vzbid0IHN1cHBvcnQgdGhpcyB0cmFuc2ZlclR5cGUKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE0IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGdldEdyZWVuKHBpeGVsKTsKICAgICB9CkBAIC01MTgsMjQgKzU1MiwyNCBAQAogICAgIHB1YmxpYyBpbnQgZ2V0Qmx1ZShPYmplY3QgaW5EYXRhKSB7CiAgICAgICAgIGludCBwaXhlbCA9IDA7CiAgICAgICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBieXRlIGJhW10gPSAoYnl0ZVtdKSBpbkRhdGE7Ci0gICAgICAgICAgICBwaXhlbCA9IGJhWzBdICYgMHhmZjsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBieXRlIGJhW10gPSAoYnl0ZVtdKWluRGF0YTsKKyAgICAgICAgICAgICAgICBwaXhlbCA9IGJhWzBdICYgMHhmZjsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10pIGluRGF0YTsKLSAgICAgICAgICAgIHBpeGVsID0gc2FbMF0gJiAweGZmZmY7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10paW5EYXRhOworICAgICAgICAgICAgICAgIHBpeGVsID0gc2FbMF0gJiAweGZmZmY7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10pIGluRGF0YTsKLSAgICAgICAgICAgIHBpeGVsID0gaWFbMF07Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpbnQgaWFbXSA9IChpbnRbXSlpbkRhdGE7CisgICAgICAgICAgICAgICAgcGl4ZWwgPSBpYVswXTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYXd0LjIxND1UaGlzIENvbG9yIE1vZGVsIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHRyYW5zZmVyVHlwZQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxNCIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjE0PVRoaXMgQ29sb3IgTW9kZWwgZG9lc24ndCBzdXBwb3J0IHRoaXMgdHJhbnNmZXJUeXBlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxNCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBnZXRCbHVlKHBpeGVsKTsKICAgICB9CkBAIC01NDQsMjQgKzU3OCwyNCBAQAogICAgIHB1YmxpYyBpbnQgZ2V0QWxwaGEoT2JqZWN0IGluRGF0YSkgewogICAgICAgICBpbnQgcGl4ZWwgPSAwOwogICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSkgaW5EYXRhOwotICAgICAgICAgICAgcGl4ZWwgPSBiYVswXSAmIDB4ZmY7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSlpbkRhdGE7CisgICAgICAgICAgICAgICAgcGl4ZWwgPSBiYVswXSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgc2hvcnQgc2FbXSA9IChzaG9ydFtdKSBpbkRhdGE7Ci0gICAgICAgICAgICBwaXhlbCA9IHNhWzBdICYgMHhmZmZmOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgc2hvcnQgc2FbXSA9IChzaG9ydFtdKWluRGF0YTsKKyAgICAgICAgICAgICAgICBwaXhlbCA9IHNhWzBdICYgMHhmZmZmOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKSBpbkRhdGE7Ci0gICAgICAgICAgICBwaXhlbCA9IGlhWzBdOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10paW5EYXRhOworICAgICAgICAgICAgICAgIHBpeGVsID0gaWFbMF07CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGF3dC4yMTQ9VGhpcyBDb2xvciBNb2RlbCBkb2Vzbid0IHN1cHBvcnQgdGhpcyB0cmFuc2ZlclR5cGUKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTQiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gYXd0LjIxND1UaGlzIENvbG9yIE1vZGVsIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHRyYW5zZmVyVHlwZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTQiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZ2V0QWxwaGEocGl4ZWwpOwogICAgIH0KQEAgLTU3NiwxNCArNjEwLDExIEBACiAgICAgICAgIGludCBiYW5kTWFza3NbXSA9IGNvbXBvbmVudE1hc2tzLmNsb25lKCk7CiAKICAgICAgICAgaWYgKHBpeGVsX2JpdHMgPiAxNikgewotICAgICAgICAgICAgcmV0dXJuIFJhc3Rlci5jcmVhdGVQYWNrZWRSYXN0ZXIoRGF0YUJ1ZmZlci5UWVBFX0lOVCwgdywgaCwKLSAgICAgICAgICAgICAgICAgICAgYmFuZE1hc2tzLCBudWxsKTsKKyAgICAgICAgICAgIHJldHVybiBSYXN0ZXIuY3JlYXRlUGFja2VkUmFzdGVyKERhdGFCdWZmZXIuVFlQRV9JTlQsIHcsIGgsIGJhbmRNYXNrcywgbnVsbCk7CiAgICAgICAgIH0gZWxzZSBpZiAocGl4ZWxfYml0cyA+IDgpIHsKLSAgICAgICAgICAgIHJldHVybiBSYXN0ZXIuY3JlYXRlUGFja2VkUmFzdGVyKERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIHcsIGgsCi0gICAgICAgICAgICAgICAgICAgIGJhbmRNYXNrcywgbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gUmFzdGVyLmNyZWF0ZVBhY2tlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCB3LCBoLCBiYW5kTWFza3MsIG51bGwpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFJhc3Rlci5jcmVhdGVQYWNrZWRSYXN0ZXIoRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIHcsIGgsCi0gICAgICAgICAgICAgICAgICAgIGJhbmRNYXNrcywgbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gUmFzdGVyLmNyZWF0ZVBhY2tlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfQllURSwgdywgaCwgYmFuZE1hc2tzLCBudWxsKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTk0LDcgKzYyNSw3IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNwcHNtID0gKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpIHNtOworICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNwcHNtID0gKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpc207CiAKICAgICAgICAgaWYgKHNwcHNtLmdldE51bUJhbmRzKCkgIT0gbnVtQ29tcG9uZW50cykgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNjQwLDggKzY3MSw4IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmluYWwgaW50IGdldFJHQihpbnQgcGl4ZWwpIHsKLSAgICAgICAgcmV0dXJuIChnZXRBbHBoYShwaXhlbCkgPDwgMjQpIHwgKGdldFJlZChwaXhlbCkgPDwgMTYpIHwKLSAgICAgICAgICAgICAgIChnZXRHcmVlbihwaXhlbCkgPDwgOCkgfCBnZXRCbHVlKHBpeGVsKTsKKyAgICAgICAgcmV0dXJuIChnZXRBbHBoYShwaXhlbCkgPDwgMjQpIHwgKGdldFJlZChwaXhlbCkgPDwgMTYpIHwgKGdldEdyZWVuKHBpeGVsKSA8PCA4KQorICAgICAgICAgICAgICAgIHwgZ2V0Qmx1ZShwaXhlbCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC02ODEsNyArNzEyLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSByZWQgbWFzay4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWQgbWFzaworICAgICAqIEByZXR1cm4gdGhlIHJlZCBtYXNrLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UmVkTWFzaygpIHsKICAgICAgICAgcmV0dXJuIGNvbXBvbmVudE1hc2tzWzBdOwpAQCAtNjkwLDcgKzcyMSw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZ3JlZW4gbWFzay4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBncmVlbiBtYXNrCisgICAgICogQHJldHVybiB0aGUgZ3JlZW4gbWFzay4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldEdyZWVuTWFzaygpIHsKICAgICAgICAgcmV0dXJuIGNvbXBvbmVudE1hc2tzWzFdOwpAQCAtNjk5LDcgKzczMCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYmx1ZSBtYXNrLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJsdWUgbWFzaworICAgICAqIEByZXR1cm4gdGhlIGJsdWUgbWFzay4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldEJsdWVNYXNrKCkgewogICAgICAgICByZXR1cm4gY29tcG9uZW50TWFza3NbMl07CkBAIC03MDgsNyArNzM5LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBhbHBoYSBtYXNrLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFscGhhIG1hc2sKKyAgICAgKiBAcmV0dXJuIHRoZSBhbHBoYSBtYXNrLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0QWxwaGFNYXNrKCkgewogICAgICAgICBpZiAoaGFzQWxwaGEpIHsKQEAgLTcyNywxNiArNzU4LDEyIEBACiAgICAgICAgIGlmIChpc19MSU5FQVJfUkdCKSB7CiAgICAgICAgICAgICBpZiAobWF4Qml0TGVuZ3RoID4gOCkgewogICAgICAgICAgICAgICAgIExJTkVBUl9SR0JfTGVuZ3RoID0gMTY7Ci0gICAgICAgICAgICAgICAgZnJvbV9MSU5FQVJfUkdCX0xVVCA9Ci0gICAgICAgICAgICAgICAgICAgIExVVENvbG9yQ29udmVydGVyLmdldEZyb20xNmxSR0J0b3NSR0JfTFVUKCk7Ci0gICAgICAgICAgICAgICAgdG9fTElORUFSXzE2UkdCX0xVVCA9Ci0gICAgICAgICAgICAgICAgICAgIExVVENvbG9yQ29udmVydGVyLmdldEZyb21zUkdCdG8xNmxSR0JfTFVUKCk7CisgICAgICAgICAgICAgICAgZnJvbV9MSU5FQVJfUkdCX0xVVCA9IExVVENvbG9yQ29udmVydGVyLmdldEZyb20xNmxSR0J0b3NSR0JfTFVUKCk7CisgICAgICAgICAgICAgICAgdG9fTElORUFSXzE2UkdCX0xVVCA9IExVVENvbG9yQ29udmVydGVyLmdldEZyb21zUkdCdG8xNmxSR0JfTFVUKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIExJTkVBUl9SR0JfTGVuZ3RoID0gODsKLSAgICAgICAgICAgICAgICBmcm9tX0xJTkVBUl9SR0JfTFVUID0KLSAgICAgICAgICAgICAgICAgICAgTFVUQ29sb3JDb252ZXJ0ZXIuZ2V0RnJvbThsUkdCdG9zUkdCX0xVVCgpOwotICAgICAgICAgICAgICAgIHRvX0xJTkVBUl84UkdCX0xVVCA9Ci0gICAgICAgICAgICAgICAgICAgIExVVENvbG9yQ29udmVydGVyLmdldEZyb21zUkdCdG84bFJHQl9MVVQoKTsKKyAgICAgICAgICAgICAgICBmcm9tX0xJTkVBUl9SR0JfTFVUID0gTFVUQ29sb3JDb252ZXJ0ZXIuZ2V0RnJvbThsUkdCdG9zUkdCX0xVVCgpOworICAgICAgICAgICAgICAgIHRvX0xJTkVBUl84UkdCX0xVVCA9IExVVENvbG9yQ29udmVydGVyLmdldEZyb21zUkdCdG84bFJHQl9MVVQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZGYWN0b3IgPSAoKDEgPDwgTElORUFSX1JHQl9MZW5ndGgpIC0gMSk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC03NDYsNyArNzczLDcgQEAKICAgICAgICAgaWYgKGhhc0FscGhhICYmIGJpdHNbM10gIT0gOCkgewogICAgICAgICAgICAgYWxwaGFMVVQgPSBuZXcgYnl0ZVttYXhWYWx1ZXNbM10gKyAxXTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IG1heFZhbHVlc1szXTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYWxwaGFMVVRbaV0gPSAoYnl0ZSkgKHNjYWxlc1szXSAqIGkgKyAwLjVmKTsKKyAgICAgICAgICAgICAgICBhbHBoYUxVVFtpXSA9IChieXRlKShzY2FsZXNbM10gKiBpICsgMC41Zik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgfQpAQCAtNzY1LDcgKzc5Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvckxVVHNbaV0gPSBuZXcgYnl0ZVttYXhWYWx1ZXNbaV0gKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDw9IG1heFZhbHVlc1tpXTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JMVVRzW2ldW2pdID0gKGJ5dGUpIChzY2FsZXNbaV0gKiBqICsgMC41Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JMVVRzW2ldW2pdID0gKGJ5dGUpKHNjYWxlc1tpXSAqIGogKyAwLjVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTc4NCw5ICs4MTEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPD0gbWF4VmFsdWVzWzBdOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMSU5FQVJfUkdCX0xlbmd0aCA9PSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IChpbnQpIChzY2FsZXNbaV0gKiBqICsgMC41Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IChpbnQpKHNjYWxlc1tpXSAqIGogKyAwLjVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAoaW50KSAoc2NhbGVzW2ldICogaiAqIDI1Ny4wZiArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAoaW50KShzY2FsZXNbaV0gKiBqICogMjU3LjBmICsgMC41Zik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTFVUc1tpXVtqXSA9IGZyb21fTElORUFSX1JHQl9MVVRbaWR4XTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTc5OCwyMCArODI1LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgcmV0dXJuIFJHQiBjb21wb25lbnQgdmFsdWUgaWYgQ29sb3IgTW9kZWwgaGFzCi0gICAgICogc1JHQiBDb2xvclNwYWNlLgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybiBSR0IgY29tcG9uZW50IHZhbHVlIGlmIENvbG9yIE1vZGVsIGhhcyBzUkdCCisgICAgICogQ29sb3JTcGFjZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGl4ZWwgLSBJTlQgcmVwcmVzZW50YXRpb24gb2YgcGl4ZWwKLSAgICAgKiBAcGFyYW0gaWR4IC0gaW5kZXggb2YgcGl4ZWwgY29tcG9uZW50Ci0gICAgICogCi0gICAgICogQHJldHVybiAtIHZhbHVlIG9mIHRoZSBwaXhlbCBjb21wb25lbnQgc2NhbGVkIGZybyAwIHRvIDI1NQorICAgICAqIEBwYXJhbSBwaXhlbAorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSBpZHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgcGl4ZWwgY29tcG9uZW50LgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwaXhlbCBjb21wb25lbnQgc2NhbGVkIGZyb20gMCB0byAyNTUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgZ2V0Q29tcG9uZW50RnJvbV9zUkdCKGludCBwaXhlbCwgaW50IGlkeCkgewogICAgICAgICBpbnQgY29tcCA9IChwaXhlbCAmIGNvbXBvbmVudE1hc2tzW2lkeF0pID4+IG9mZnNldHNbaWR4XTsKICAgICAgICAgaWYgKGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7CiAgICAgICAgICAgICBpbnQgYWxwaGEgPSAocGl4ZWwgJiBjb21wb25lbnRNYXNrc1szXSkgPj4+IG9mZnNldHNbM107Ci0gICAgICAgICAgICBjb21wID0gYWxwaGEgPT0gMCA/IDAgOiAoaW50KSAoc2NhbGVzW2lkeF0gKiBjb21wICogMjU1LjBmIC8KLSAgICAgICAgICAgICAgICAgICAgKHNjYWxlc1szXSAqIGFscGhhKSArIDAuNWYpOworICAgICAgICAgICAgY29tcCA9IGFscGhhID09IDAgPyAwIDogKGludCkoc2NhbGVzW2lkeF0gKiBjb21wICogMjU1LjBmIC8gKHNjYWxlc1szXSAqIGFscGhhKSArIDAuNWYpOwogICAgICAgICB9IGVsc2UgaWYgKGJpdHNbaWR4XSAhPSA4KSB7CiAgICAgICAgICAgICBjb21wID0gY29sb3JMVVRzW2lkeF1bY29tcF0gJiAweGZmOwogICAgICAgICB9CkBAIC04MTksMjEgKzg0NiwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybiBSR0IgY29tcG9uZW50IHZhbHVlIGlmIENvbG9yIE1vZGVsIGhhcwotICAgICAqIExpbmVhciBSR0IgQ29sb3JTcGFjZS4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm4gUkdCIGNvbXBvbmVudCB2YWx1ZSBpZiBDb2xvciBNb2RlbCBoYXMgTGluZWFyIFJHQgorICAgICAqIENvbG9yU3BhY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBpeGVsIC0gSU5UIHJlcHJlc2VudGF0aW9uIG9mIHBpeGVsCi0gICAgICogQHBhcmFtIGlkeCAtIGluZGV4IG9mIHBpeGVsIGNvbXBvbmVudAotICAgICAqIAotICAgICAqIEByZXR1cm4gLSB2YWx1ZSBvZiB0aGUgcGl4ZWwgY29tcG9uZW50IHNjYWxlZCBmcm8gMCB0byAyNTUKKyAgICAgKiBAcGFyYW0gcGl4ZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0gaWR4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHBpeGVsIGNvbXBvbmVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcGl4ZWwgY29tcG9uZW50IHNjYWxlZCBmcm9tIDAgdG8gMjU1LgogICAgICAqLwogICAgIHByaXZhdGUgaW50IGdldENvbXBvbmVudEZyb21fTElORUFSX1JHQihpbnQgcGl4ZWwsIGludCBpZHgpIHsKICAgICAgICAgaW50IGNvbXAgPSAocGl4ZWwgJiBjb21wb25lbnRNYXNrc1tpZHhdKSA+PiBvZmZzZXRzW2lkeF07CiAgICAgICAgIGlmIChpc0FscGhhUHJlbXVsdGlwbGllZCkgewogICAgICAgICAgICAgZmxvYXQgZmFjdG9yID0gKCgxIDw8IExJTkVBUl9SR0JfTGVuZ3RoKSAtIDEpOwogICAgICAgICAgICAgaW50IGFscGhhID0gKHBpeGVsICYgY29tcG9uZW50TWFza3NbM10pID4+IG9mZnNldHNbM107Ci0gICAgICAgICAgICBjb21wID0gYWxwaGEgPT0gMCA/IDAgOiAoaW50KSAoc2NhbGVzW2lkeF0gKiBjb21wICogZmFjdG9yIC8KLSAgICAgICAgICAgICAgICAgICAgKHNjYWxlc1szXSAqIGFscGhhKSArIDAuNWYpOworICAgICAgICAgICAgY29tcCA9IGFscGhhID09IDAgPyAwIDogKGludCkoc2NhbGVzW2lkeF0gKiBjb21wICogZmFjdG9yIC8gKHNjYWxlc1szXSAqIGFscGhhKSArIDAuNWYpOwogICAgICAgICB9IGVsc2UgaWYgKGJpdHNbaWR4XSAhPSBMSU5FQVJfUkdCX0xlbmd0aCkgewogICAgICAgICAgICAgY29tcCA9IGNvbG9yTFVUc1tpZHhdW2NvbXBdICYgMHhmZjsKICAgICAgICAgfSBlbHNlIHsKQEAgLTg0MywyMCArODcwLDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgcmV0dXJuIFJHQiBjb21wb25lbnQgdmFsdWUgaWYgQ29sb3IgTW9kZWwgaGFzCi0gICAgICogYXJiaXRyYXJ5IFJHQiBDb2xvclNhcGNlLgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybiBSR0IgY29tcG9uZW50IHZhbHVlIGlmIENvbG9yIE1vZGVsIGhhcyBhcmJpdHJhcnkgUkdCCisgICAgICogQ29sb3JTYXBjZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGl4ZWwgLSBJTlQgcmVwcmVzZW50YXRpb24gb2YgcGl4ZWwKLSAgICAgKiBAcGFyYW0gaWR4IC0gaW5kZXggb2YgcGl4ZWwgY29tcG9uZW50Ci0gICAgICogCi0gICAgICogQHJldHVybiAtIHZhbHVlIG9mIHRoZSBwaXhlbCBjb21wb25lbnQgc2NhbGVkIGZybyAwIHRvIDI1NQorICAgICAqIEBwYXJhbSBwaXhlbAorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSBpZHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgcGl4ZWwgY29tcG9uZW50LgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwaXhlbCBjb21wb25lbnQgc2NhbGVkIGZyb20gMCB0byAyNTUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgZ2V0Q29tcG9uZW50RnJvbV9SR0IoaW50IHBpeGVsLCBpbnQgaWR4KSB7CiAgICAgICAgIGludCBjb21wb25lbnRzW10gPSBnZXRDb21wb25lbnRzKHBpeGVsLCBudWxsLCAwKTsKICAgICAgICAgZmxvYXRbXSBub3JtQ29tcG9uZW50cyA9IGdldE5vcm1hbGl6ZWRDb21wb25lbnRzKGNvbXBvbmVudHMsIDAsIG51bGwsIDApOwogICAgICAgICBmbG9hdFtdIHNSR0Jjb21wb25lbnRzID0gY3MudG9SR0Iobm9ybUNvbXBvbmVudHMpOwotICAgICAgICByZXR1cm4gKGludCkgKHNSR0Jjb21wb25lbnRzW2lkeF0gKiAyNTUuMGYgKyAwLjVmKTsKKyAgICAgICAgcmV0dXJuIChpbnQpKHNSR0Jjb21wb25lbnRzW2lkeF0gKiAyNTUuMGYgKyAwLjVmKTsKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0ZpbHRlcmVkSW1hZ2VTb3VyY2UuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9GaWx0ZXJlZEltYWdlU291cmNlLmphdmEKaW5kZXggNmE0MWZhNy4uZWQ4NTU4ZCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0ZpbHRlcmVkSW1hZ2VTb3VyY2UuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvRmlsdGVyZWRJbWFnZVNvdXJjZS5qYXZhCkBAIC0xOCwzMiArMTgsNDIgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKIAotCiAvKioKLSAqIFRoZSBGaWx0ZXJlZEltYWdlU291cmNlIGNsYXNzIGlzIHVzZWQgZm9yIHByb2R1Y2luZyBpbWFnZSBkYXRhIGZvciBhIG5ldyAKLSAqIGZpbHRlcmVkIHZlcnNpb24gb2YgdGhlIG9yaWdpbmFsIGltYWdlIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsdGVyIG9iamVjdC4gCisgKiBUaGUgRmlsdGVyZWRJbWFnZVNvdXJjZSBjbGFzcyBpcyB1c2VkIGZvciBwcm9kdWNpbmcgaW1hZ2UgZGF0YSBmb3IgYSBuZXcKKyAqIGZpbHRlcmVkIHZlcnNpb24gb2YgdGhlIG9yaWdpbmFsIGltYWdlIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsdGVyIG9iamVjdC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBGaWx0ZXJlZEltYWdlU291cmNlIGltcGxlbWVudHMgSW1hZ2VQcm9kdWNlciB7CiAKLSAgICAvKiogVGhlIHNvdXJjZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgSW1hZ2VQcm9kdWNlciBzb3VyY2U7Ci0gICAgCi0gICAgLyoqIFRoZSBmaWx0ZXIuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsdGVyLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgSW1hZ2VGaWx0ZXIgZmlsdGVyOwogCi0gICAgLyoqIFRoZSBjb25zIHRhYmxlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb25zIHRhYmxlLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgSGFzaHRhYmxlPEltYWdlQ29uc3VtZXIsIEltYWdlQ29uc3VtZXI+IGNvbnNUYWJsZSA9IG5ldyBIYXNodGFibGU8SW1hZ2VDb25zdW1lciwgSW1hZ2VDb25zdW1lcj4oKTsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBGaWx0ZXJlZEltYWdlU291cmNlIG9iamVjdCB3aXRoIAotICAgICAqIHRoZSBzcGVjaWZpZWQgSW1hZ2VQcm9kdWNlciBhbmQgdGhlIEltYWdlRmlsdGVyIG9iamVjdHMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEZpbHRlcmVkSW1hZ2VTb3VyY2Ugb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIEltYWdlUHJvZHVjZXIgYW5kIHRoZSBJbWFnZUZpbHRlciBvYmplY3RzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvcmlnIHRoZSBzcGVjaWZpZWQgSW1hZ2VQcm9kdWNlci4KLSAgICAgKiBAcGFyYW0gaW1nZiB0aGUgc3BlY2lmaWVkIEltYWdlRmlsdGVyLgorICAgICAqIEBwYXJhbSBvcmlnCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIEltYWdlUHJvZHVjZXIuCisgICAgICogQHBhcmFtIGltZ2YKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgSW1hZ2VGaWx0ZXIuCiAgICAgICovCiAgICAgcHVibGljIEZpbHRlcmVkSW1hZ2VTb3VyY2UoSW1hZ2VQcm9kdWNlciBvcmlnLCBJbWFnZUZpbHRlciBpbWdmKSB7CiAgICAgICAgIHNvdXJjZSA9IG9yaWc7CkBAIC01MSw3ICs2MSw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQ29uc3VtZXIoSW1hZ2VDb25zdW1lciBpYykgewotICAgICAgICBpZihpYyAhPSBudWxsKSB7CisgICAgICAgIGlmIChpYyAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gY29uc1RhYmxlLmNvbnRhaW5zS2V5KGljKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC02NCwxNCArNzQsMTQgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0VG9wRG93bkxlZnRSaWdodFJlc2VuZChJbWFnZUNvbnN1bWVyIGljKSB7Ci0gICAgICAgIGlmKGljICE9IG51bGwgJiYgaXNDb25zdW1lcihpYykpewotICAgICAgICAgICAgSW1hZ2VGaWx0ZXIgZmljID0gKEltYWdlRmlsdGVyKSBjb25zVGFibGUuZ2V0KGljKTsKKyAgICAgICAgaWYgKGljICE9IG51bGwgJiYgaXNDb25zdW1lcihpYykpIHsKKyAgICAgICAgICAgIEltYWdlRmlsdGVyIGZpYyA9IChJbWFnZUZpbHRlciljb25zVGFibGUuZ2V0KGljKTsKICAgICAgICAgICAgIGZpYy5yZXNlbmRUb3BEb3duTGVmdFJpZ2h0KHNvdXJjZSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQ29uc3VtZXIoSW1hZ2VDb25zdW1lciBpYykgewotICAgICAgICBpZihpYyAhPSBudWxsICYmIGlzQ29uc3VtZXIoaWMpKXsKKyAgICAgICAgaWYgKGljICE9IG51bGwgJiYgaXNDb25zdW1lcihpYykpIHsKICAgICAgICAgICAgIEltYWdlQ29uc3VtZXIgZmljID0gY29uc1RhYmxlLmdldChpYyk7CiAgICAgICAgICAgICBzb3VyY2UucmVtb3ZlQ29uc3VtZXIoZmljKTsKICAgICAgICAgICAgIGNvbnNUYWJsZS5yZW1vdmUoaWMpOwpAQCAtNzksNyArODksNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDb25zdW1lcihJbWFnZUNvbnN1bWVyIGljKSB7Ci0gICAgICAgIGlmKGljICE9IG51bGwgJiYgIWlzQ29uc3VtZXIoaWMpKXsKKyAgICAgICAgaWYgKGljICE9IG51bGwgJiYgIWlzQ29uc3VtZXIoaWMpKSB7CiAgICAgICAgICAgICBJbWFnZUNvbnN1bWVyIGZpYyA9IGZpbHRlci5nZXRGaWx0ZXJJbnN0YW5jZShpYyk7CiAgICAgICAgICAgICBzb3VyY2UuYWRkQ29uc3VtZXIoZmljKTsKICAgICAgICAgICAgIGNvbnNUYWJsZS5wdXQoaWMsIGZpYyk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvSW1hZ2VDb25zdW1lci5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0ltYWdlQ29uc3VtZXIuamF2YQppbmRleCAyZWJhMjkwLi5jYWY4N2QxIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvSW1hZ2VDb25zdW1lci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9JbWFnZUNvbnN1bWVyLmphdmEKQEAgLTE4LDE0OCArMTgsMTY4IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CiAKIC8qKgotICogVGhlIEltYWdlQ29uc3VtZXIgaW50ZXJmYWNlIHByb3ZpZGVzIHRoZSBkYXRhIGFib3V0IHRoZSBpbWFnZQotICogYW5kIGFib3V0IGhvdyBpdHMgZGF0YSBpcyBkZWxpdmVyZWQuICBBIEltYWdlUHJvZHVjZXIgcHJvdmlkZXMgCi0gKiBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbWFnZSB1c2luZyAKLSAqIHRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UuCisgKiBUaGUgSW1hZ2VDb25zdW1lciBpbnRlcmZhY2UgcHJvdmlkZXMgdGhlIGRhdGEgYWJvdXQgdGhlIGltYWdlIGFuZCBhYm91dCBob3cKKyAqIGl0cyBkYXRhIGlzIGRlbGl2ZXJlZC4gQSBJbWFnZVByb2R1Y2VyIHByb3ZpZGVzIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gYWJvdXQKKyAqIHRoZSBpbWFnZSB1c2luZyB0aGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJbWFnZUNvbnN1bWVyIHsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgUkFORE9NUElYRUxPUkRFUiBpbmRpY2F0ZXMgdGhhdCB0aGUgcGl4ZWxzIGFyZSAKLSAgICAgKiBkZWxpdmVyZWQgaW4gYSByYW5kb20gb3JkZXIuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFJBTkRPTVBJWEVMT1JERVIgaW5kaWNhdGVzIHRoYXQgdGhlIHBpeGVscyBhcmUgZGVsaXZlcmVkIGluCisgICAgICogYSByYW5kb20gb3JkZXIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkFORE9NUElYRUxPUkRFUiA9IDE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRPUERPV05MRUZUUklHSFQgaW5kaWNhdGVzIHRoYXQgdGhlIHBpeGVscyBhcmUgCi0gICAgICogZGVsaXZlcmVkIGluIHRvcC1kb3duLCBsZWZ0LXRvLXJpZ2h0IG9yZGVyLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVE9QRE9XTkxFRlRSSUdIVCBpbmRpY2F0ZXMgdGhhdCB0aGUgcGl4ZWxzIGFyZSBkZWxpdmVyZWQgaW4KKyAgICAgKiB0b3AtZG93biwgbGVmdC10by1yaWdodCBvcmRlci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1BET1dOTEVGVFJJR0hUID0gMjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgQ09NUExFVEVTQ0FOTElORVMgaW5kaWNhdGVzIHRoYXQgdGhlIHBpeGVscyBhcmUKLSAgICAgKiBkZWxpdmVyZWQgaW4gY29tcGxldGUgc2NhbmxpbmUuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDT01QTEVURVNDQU5MSU5FUyBpbmRpY2F0ZXMgdGhhdCB0aGUgcGl4ZWxzIGFyZSBkZWxpdmVyZWQgaW4KKyAgICAgKiBjb21wbGV0ZSBzY2FubGluZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QTEVURVNDQU5MSU5FUyA9IDQ7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFNJTkdMRVBBU1MgaW5kaWNhdGVzIHRoYXQgcGl4ZWxzIGFyZSBkZWxpdmVyZWQgCi0gICAgICogaW4gYSBzaW5nbGUgcGFzcy4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNJTkdMRVBBU1MgaW5kaWNhdGVzIHRoYXQgcGl4ZWxzIGFyZSBkZWxpdmVyZWQgaW4gYSBzaW5nbGUKKyAgICAgKiBwYXNzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTkdMRVBBU1MgPSA4OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBTSU5HTEVGUkFNRSBpbmRpY2F0ZXMgdGhhdCBpbWFnZSBjb25zaXN0cyBvZgotICAgICAqIHNpbmdsZSBmcmFtZS4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU0lOR0xFRlJBTUUgaW5kaWNhdGVzIHRoYXQgaW1hZ2UgY29uc2lzdHMgb2Ygc2luZ2xlIGZyYW1lLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTkdMRUZSQU1FID0gMTY7CiAKLSAgICAvKiogCisgICAgLyoqCiAgICAgICogVGhlIENvbnN0YW50IElNQUdFRVJST1IgaW5kaWNhdGVzIGFuIGltYWdlIGVycm9yIGR1cmluZyBpbWFnZSBwcm9kdWNpbmcuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1BR0VFUlJPUiA9IDE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFNJTkdMRUZSQU1FRE9ORSBpbmRpY2F0ZXMgdGhhdCBvbmx5IG9uZSBvZiB0aGUgCi0gICAgICogaW1hZ2UncyBmcmFtZXMgaXMgY29tcGxldGVkLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU0lOR0xFRlJBTUVET05FIGluZGljYXRlcyB0aGF0IG9ubHkgb25lIG9mIHRoZSBpbWFnZSdzCisgICAgICogZnJhbWVzIGlzIGNvbXBsZXRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU5HTEVGUkFNRURPTkUgPSAyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBTVEFUSUNJTUFHRURPTkUgaW5kaWNhdGVzIHRoYXQgdGhlIGltYWdlIGlzIGNvbXBsZXRlZC4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNUQVRJQ0lNQUdFRE9ORSBpbmRpY2F0ZXMgdGhhdCB0aGUgaW1hZ2UgaXMgY29tcGxldGVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRJQ0lNQUdFRE9ORSA9IDM7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IElNQUdFQUJPUlRFRCBpbmRpY2F0ZXMgdGhhdCB0aGUgaW1hZ2UgcHJvZHVjaW5nIAotICAgICAqIHByb2Nlc3MgaXMgYWJvcnRlZC4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IElNQUdFQUJPUlRFRCBpbmRpY2F0ZXMgdGhhdCB0aGUgaW1hZ2UgcHJvZHVjaW5nIHByb2Nlc3MgaXMKKyAgICAgKiBhYm9ydGVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNQUdFQUJPUlRFRCA9IDQ7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSW1hZ2VDb25zdW1lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcHMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggCi0gICAgICogdGhpcyBJbWFnZUNvbnN1bWVyLgorICAgICAqIEBwYXJhbSBwcm9wcworICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqICAgICAgICAgICAgSW1hZ2VDb25zdW1lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKEhhc2h0YWJsZTw/LCA/PiBwcm9wcyk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBDb2xvck1vZGVsIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbW9kZWwgdGhlIG5ldyBDb2xvck1vZGVsLgorICAgICAqIEBwYXJhbSBtb2RlbAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBDb2xvck1vZGVsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbG9yTW9kZWwoQ29sb3JNb2RlbCBtb2RlbCk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBwaXhlbHMgZm9yIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZiB0aGUgaW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHJlY3Rhbmd1bGFyIGFyZWEuCi0gICAgICogQHBhcmFtIG1vZGVsIHRoZSBzcGVjaWZpZWQgQ29sb3JNb2RlbCB0byBiZSB1c2VkIGZvciBwaXhlbHMKLSAgICAgKiBjb252ZXJ0aW5nLiAgCi0gICAgICogQHBhcmFtIHBpeGVscyB0aGUgYXJyYXkgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldCBvZiBwaXhlbHMgYXJyYXkuCi0gICAgICogQHBhcmFtIHNjYW5zaXplIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBvbmUgcm93IG9mIHBpeGVscwotICAgICAqIHRvIHRoZSBuZXh0IHJvdyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0gbW9kZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgQ29sb3JNb2RlbCB0byBiZSB1c2VkIGZvciBwaXhlbHMgY29udmVydGluZy4KKyAgICAgKiBAcGFyYW0gcGl4ZWxzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgcGl4ZWxzIGFycmF5LgorICAgICAqIEBwYXJhbSBzY2Fuc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIGZyb20gdGhlIG9uZSByb3cgb2YgcGl4ZWxzIHRvIHRoZSBuZXh0IHJvdyBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHNwZWNpZmllZCBhcnJheS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgbW9kZWwsCi0gICAgICAgICAgICBpbnRbXSBwaXhlbHMsIGludCBvZmYsIGludCBzY2Fuc2l6ZSk7CisgICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBDb2xvck1vZGVsIG1vZGVsLCBpbnRbXSBwaXhlbHMsIGludCBvZmYsCisgICAgICAgICAgICBpbnQgc2NhbnNpemUpOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcGl4ZWxzIGZvciB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YgdGhlIGltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSBtb2RlbCB0aGUgc3BlY2lmaWVkIENvbG9yTW9kZWwgdG8gYmUgdXNlZCBmb3IgcGl4ZWxzCi0gICAgICogY29udmVydGluZy4gIAotICAgICAqIEBwYXJhbSBwaXhlbHMgdGhlIGFycmF5IG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmZzZXQgb2YgcGl4ZWxzIGFycmF5LgotICAgICAqIEBwYXJhbSBzY2Fuc2l6ZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgb25lIHJvdyBvZiBwaXhlbHMKLSAgICAgKiB0byB0aGUgbmV4dCByb3cgaW4gdGhlIHNwZWNpZmllZCBhcnJheS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIG1vZGVsCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIENvbG9yTW9kZWwgdG8gYmUgdXNlZCBmb3IgcGl4ZWxzIGNvbnZlcnRpbmcuCisgICAgICogQHBhcmFtIHBpeGVscworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHBpeGVscyBhcnJheS4KKyAgICAgKiBAcGFyYW0gc2NhbnNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBvbmUgcm93IG9mIHBpeGVscyB0byB0aGUgbmV4dCByb3cgaW4gdGhlCisgICAgICogICAgICAgICAgICBzcGVjaWZpZWQgYXJyYXkuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBDb2xvck1vZGVsIG1vZGVsLAotICAgICAgICAgICAgYnl0ZVtdIHBpeGVscywgaW50IG9mZiwgaW50IHNjYW5zaXplKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgbW9kZWwsIGJ5dGVbXSBwaXhlbHMsIGludCBvZmYsCisgICAgICAgICAgICBpbnQgc2NhbnNpemUpOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZGltZW5zaW9ucyBvZiBhIHNvdXJjZSBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBpbWFnZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREaW1lbnNpb25zKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBoaW50IGZsYWdzIG9mIHBpeGVscyBvcmRlciwgd2hpY2ggaXMgdXNlZCBieSAKLSAgICAgKiB0aGUgSW1hZ2VDb25zdW1lciBmb3Igb2J0YWluaW5nIHBpeGVscyBmcm9tIHRoZSBJbWFnZVByb2R1Y2VyCi0gICAgICogZm9yIHdoaWNoIHRoaXMgSW1hZ2VDb25zdW1lciBpcyBhZGRlZC4KKyAgICAgKiBTZXRzIHRoZSBoaW50IGZsYWdzIG9mIHBpeGVscyBvcmRlciwgd2hpY2ggaXMgdXNlZCBieSB0aGUgSW1hZ2VDb25zdW1lcgorICAgICAqIGZvciBvYnRhaW5pbmcgcGl4ZWxzIGZyb20gdGhlIEltYWdlUHJvZHVjZXIgZm9yIHdoaWNoIHRoaXMgSW1hZ2VDb25zdW1lcgorICAgICAqIGlzIGFkZGVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBoaW50ZmxhZ3MgdGhlIG1hc2sgb2YgaGludCBmbGFncy4gCisgICAgICogQHBhcmFtIGhpbnRmbGFncworICAgICAqICAgICAgICAgICAgdGhlIG1hc2sgb2YgaGludCBmbGFncy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRIaW50cyhpbnQgaGludGZsYWdzKTsKIAogICAgIC8qKgogICAgICAqIFRIaXMgbWV0aG9kIGlzIGNhbGxlZCBpbiB0aGUgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXM6CiAgICAgICogPHVsPgotICAgICAqIDxsaT5UaGUgSW1hZ2VQcm9kdWNlciAoZm9yIHdoaWNoIHRoaXMgSW1hZ2VDb25zdW1lciBpcyBhZGRlZCkgCi0gICAgICogaGFzIGJlZW4gZGVsaXZlcmVkIGFsbCBwaXhlbHMgb2YgdGhlIHNvdXJjZSBpbWFnZS4gPC9saT4KLSAgICAgKiA8bGk+QSBvbmUgZnJhbWUgb2YgYW4gYW5pbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gPC9saT4gCi0gICAgICogPGxpPiBBbiBlcnJvciB3aGlsZSBsb2FkaW5nIG9yIHByb2R1Y2luZyBvZiB0aGUgaW1hZ2UgaGFzIG9jY3VyZWQuCi0gICAgICogPC91bD4gCisgICAgICogPGxpPlRoZSBJbWFnZVByb2R1Y2VyIChmb3Igd2hpY2ggdGhpcyBJbWFnZUNvbnN1bWVyIGlzIGFkZGVkKSBoYXMgYmVlbgorICAgICAqIGRlbGl2ZXJlZCBhbGwgcGl4ZWxzIG9mIHRoZSBzb3VyY2UgaW1hZ2UuPC9saT4KKyAgICAgKiA8bGk+QSBvbmUgZnJhbWUgb2YgYW4gYW5pbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC48L2xpPgorICAgICAqIDxsaT5BbiBlcnJvciB3aGlsZSBsb2FkaW5nIG9yIHByb2R1Y2luZyBvZiB0aGUgaW1hZ2UgaGFzIG9jY3VycmVkLgorICAgICAqIDwvdWw+CiAgICAgICogCi0gICAgICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIG9mIGltYWdlIHByb2R1Y2luZy4KKyAgICAgKiBAcGFyYW0gc3RhdHVzCisgICAgICogICAgICAgICAgICB0aGUgc3RhdHVzIG9mIGltYWdlIHByb2R1Y2luZy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBpbWFnZUNvbXBsZXRlKGludCBzdGF0dXMpOwogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9JbWFnZUZpbHRlci5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0ltYWdlRmlsdGVyLmphdmEKaW5kZXggZTM4NmQ2NS4uZDJjOWY1MCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0ltYWdlRmlsdGVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0ltYWdlRmlsdGVyLmphdmEKQEAgLTE4LDE3ICsxOCwyMiBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogCiAvKioKLSAqIFRoZSBJbWFnZUZpbHRlciBjbGFzcyBwcm92aWRlcyBhIGZpbHRlciBmb3IgZGVsaXZlcmluZyBpbWFnZSBkYXRhIAotICogZnJvbSBhbiBJbWFnZVByb2R1Y2VyIHRvIGFuIEltYWdlQ29uc3VtZXIuCisgKiBUaGUgSW1hZ2VGaWx0ZXIgY2xhc3MgcHJvdmlkZXMgYSBmaWx0ZXIgZm9yIGRlbGl2ZXJpbmcgaW1hZ2UgZGF0YSBmcm9tIGFuCisgKiBJbWFnZVByb2R1Y2VyIHRvIGFuIEltYWdlQ29uc3VtZXIuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSW1hZ2VGaWx0ZXIgaW1wbGVtZW50cyBJbWFnZUNvbnN1bWVyLCBDbG9uZWFibGUgewogCi0gICAgLyoqIFRoZSBjb25zdW1lci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29uc3VtZXIuCisgICAgICovCiAgICAgcHJvdGVjdGVkIEltYWdlQ29uc3VtZXIgY29uc3VtZXI7CiAKICAgICAvKioKQEAgLTM5LDE2ICs0NCwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gaW5zdGFuY2Ugb2YgYW4gSW1hZ2VGaWx0ZXIgb2JqZWN0IHdoaWNoIHBlcmZvcm1zCi0gICAgICogdGhlIGZpbHRlcmluZyBmb3IgdGhlIHNwZWNpZmllZCBJbWFnZUNvbnN1bWVyLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gaWMgdGhlIHNwZWNpZmllZCBJbWFnZUNvbnN1bWVyLgorICAgICAqIEdldHMgYW4gaW5zdGFuY2Ugb2YgYW4gSW1hZ2VGaWx0ZXIgb2JqZWN0IHdoaWNoIHBlcmZvcm1zIHRoZSBmaWx0ZXJpbmcKKyAgICAgKiBmb3IgdGhlIHNwZWNpZmllZCBJbWFnZUNvbnN1bWVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gSW1hZ2VGaWx0ZXIgdXNlZCB0byBwZXJmb3JtIHRoZSBmaWx0ZXJpbmcgZm9yIAotICAgICAqIHRoZSBzcGVjaWZpZWQgSW1hZ2VDb25zdW1lci4KKyAgICAgKiBAcGFyYW0gaWMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgSW1hZ2VDb25zdW1lci4KKyAgICAgKiBAcmV0dXJuIGFuIEltYWdlRmlsdGVyIHVzZWQgdG8gcGVyZm9ybSB0aGUgZmlsdGVyaW5nIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBJbWFnZUNvbnN1bWVyLgogICAgICAqLwogICAgIHB1YmxpYyBJbWFnZUZpbHRlciBnZXRGaWx0ZXJJbnN0YW5jZShJbWFnZUNvbnN1bWVyIGljKSB7Ci0gICAgICAgIEltYWdlRmlsdGVyIGZpbHRlciA9IChJbWFnZUZpbHRlcikgY2xvbmUoKTsKKyAgICAgICAgSW1hZ2VGaWx0ZXIgZmlsdGVyID0gKEltYWdlRmlsdGVyKWNsb25lKCk7CiAgICAgICAgIGZpbHRlci5jb25zdW1lciA9IGljOwogICAgICAgICByZXR1cm4gZmlsdGVyOwogICAgIH0KQEAgLTU5LDE0ICs2NCwxNCBAQAogICAgICAgICBpZiAocHJvcHMgPT0gbnVsbCkgewogICAgICAgICAgICAgZnByb3BzID0gbmV3IEhhc2h0YWJsZTxPYmplY3QsIE9iamVjdD4oKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZwcm9wcyA9IChIYXNodGFibGU8T2JqZWN0LCBPYmplY3Q+KSBwcm9wcy5jbG9uZSgpOworICAgICAgICAgICAgZnByb3BzID0gKEhhc2h0YWJsZTxPYmplY3QsIE9iamVjdD4pcHJvcHMuY2xvbmUoKTsKICAgICAgICAgfQogICAgICAgICBTdHJpbmcgcHJvcE5hbWUgPSAiRmlsdGVycyI7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgU3RyaW5nIHByb3AgPSAiTnVsbCBmaWx0ZXIiOyAvLyROT04tTkxTLTEkCiAgICAgICAgIE9iamVjdCBvID0gZnByb3BzLmdldChwcm9wTmFtZSk7CiAgICAgICAgIGlmIChvICE9IG51bGwpIHsKICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgcHJvcCA9IChTdHJpbmcpIG8gKyAiOyAiICsgcHJvcDsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIHByb3AgPSAoU3RyaW5nKW8gKyAiOyAiICsgcHJvcDsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBwcm9wID0gby50b1N0cmluZygpICsgIjsgIiArIHByb3A7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KQEAgLTkwLDExICs5NSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlc3BvbmRzIHRvIGEgcmVxdWVzdCBmb3IgYSBUb3AtRG93bi1MZWZ0LVJpZ2h0IG9yZGVyZWQgCi0gICAgICogcmVzZW5kIG9mIHRoZSBwaXhlbCBkYXRhIGZyb20gYW4gSW1hZ2VDb25zdW1lci4gCisgICAgICogUmVzcG9uZHMgdG8gYSByZXF1ZXN0IGZvciBhIFRvcC1Eb3duLUxlZnQtUmlnaHQgb3JkZXJlZCByZXNlbmQgb2YgdGhlCisgICAgICogcGl4ZWwgZGF0YSBmcm9tIGFuIEltYWdlQ29uc3VtZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGlwIHRoZSBJbWFnZVByb2R1Y2VyIHRoYXQgcHJvdmlkZXMgdGhpcyBpbnN0YW5jZSBvZiAKLSAgICAgKiB0aGUgZmlsdGVyLgorICAgICAqIEBwYXJhbSBpcAorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlUHJvZHVjZXIgdGhhdCBwcm92aWRlcyB0aGlzIGluc3RhbmNlIG9mIHRoZSBmaWx0ZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVzZW5kVG9wRG93bkxlZnRSaWdodChJbWFnZVByb2R1Y2VyIGlwKSB7CiAgICAgICAgIGlwLnJlcXVlc3RUb3BEb3duTGVmdFJpZ2h0UmVzZW5kKHRoaXMpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0ltYWdlT2JzZXJ2ZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9JbWFnZU9ic2VydmVyLmphdmEKaW5kZXggNDE4YmQwNy4uMjFlYzQxYiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0ltYWdlT2JzZXJ2ZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvSW1hZ2VPYnNlcnZlci5qYXZhCkBAIC0xOCw4MiArMTgsODQgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgamF2YS5hd3QuSW1hZ2U7CiAKIC8qKgotICogdGhlIEltYWdlT2JzZXJ2ZXIgaW50ZXJmYWNlIGlzIGFuIGFzeW5jaHJvbm91cyB1cGRhdGUgaW50ZXJmYWNlIAotICogZm9yIHJlY2VpdmluZyBub3RpZmljYXRpb25zIGFib3V0IEltYWdlIGNvbnN0cnVjdGlvbiBzdGF0dXMuCisgKiB0aGUgSW1hZ2VPYnNlcnZlciBpbnRlcmZhY2UgaXMgYW4gYXN5bmNocm9ub3VzIHVwZGF0ZSBpbnRlcmZhY2UgZm9yIHJlY2VpdmluZworICogbm90aWZpY2F0aW9ucyBhYm91dCBJbWFnZSBjb25zdHJ1Y3Rpb24gc3RhdHVzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJbWFnZU9ic2VydmVyIHsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgV0lEVEggaW5kaWNhdGVzIHRoYXQgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBpcyAKLSAgICAgKiBhdmFpbGFibGUuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBXSURUSCBpbmRpY2F0ZXMgdGhhdCB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGlzIGF2YWlsYWJsZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSURUSCA9IDE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEhFSUdIVCBpbmRpY2F0ZXMgdGhhdCB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGlzIAotICAgICAqIGF2YWlsYWJsZS4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgSEVJR0hUIGluZGljYXRlcyB0aGF0IHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgaXMgYXZhaWxhYmxlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFSUdIVCA9IDI7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFBST1BFUlRJRVMgaW5kaWNhdGVzIHRoYXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGltYWdlCi0gICAgICogYXJlIGF2YWlsYWJsZS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFBST1BFUlRJRVMgaW5kaWNhdGVzIHRoYXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGltYWdlIGFyZQorICAgICAqIGF2YWlsYWJsZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUSUVTID0gNDsKIAogICAgIC8qKgotICAgICAqICBUaGUgQ29uc3RhbnQgU09NRUJJVFMgaW5kaWNhdGVzIHRoYXQgbW9yZSBiaXRzIG5lZWRlZCBmb3IgCi0gICAgICogIGRyYXdpbmcgYSBzY2FsZWQgdmFyaWF0aW9uIG9mIHRoZSBpbWFnZSBwaXhlbHMgYXJlIGF2YWlsYWJsZS4KKyAgICAgKiBUaGUgQ29uc3RhbnQgU09NRUJJVFMgaW5kaWNhdGVzIHRoYXQgbW9yZSBiaXRzIG5lZWRlZCBmb3IgZHJhd2luZyBhCisgICAgICogc2NhbGVkIHZhcmlhdGlvbiBvZiB0aGUgaW1hZ2UgcGl4ZWxzIGFyZSBhdmFpbGFibGUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09NRUJJVFMgPSA4OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBGUkFNRUJJVFMgaW5kaWNhdGVzIHRoYXQgY29tcGxldGUgZnJhbWUgb2YgCi0gICAgICogYSBpbWFnZSB3aGljaCB3YXMgcHJldmlvdXNseSBkcmF3biBpcyBub3cgYXZhaWxhYmxlCi0gICAgICogZm9yIGRyYXdpbmcgYWdhaW4uIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBGUkFNRUJJVFMgaW5kaWNhdGVzIHRoYXQgY29tcGxldGUgZnJhbWUgb2YgYSBpbWFnZSB3aGljaCB3YXMKKyAgICAgKiBwcmV2aW91c2x5IGRyYXduIGlzIG5vdyBhdmFpbGFibGUgZm9yIGRyYXdpbmcgYWdhaW4uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlJBTUVCSVRTID0gMTY7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEFMTEJJVFMgaW5kaWNhdGVzIHRoYXQgYW4gaW1hZ2Ugd2hpY2ggCi0gICAgICogd2FzIHByZXZpb3VzbHkgZHJhd24gaXMgbm93IGNvbXBsZXRlIGFuZCBjYW4gYmUgZHJhd24gYWdhaW4uIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBBTExCSVRTIGluZGljYXRlcyB0aGF0IGFuIGltYWdlIHdoaWNoIHdhcyBwcmV2aW91c2x5IGRyYXduCisgICAgICogaXMgbm93IGNvbXBsZXRlIGFuZCBjYW4gYmUgZHJhd24gYWdhaW4uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMQklUUyA9IDMyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBFUlJPUiBpbmRpY2F0ZXMgdGhhdCBlcnJvciBvY2N1cmVkLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRVJST1IgaW5kaWNhdGVzIHRoYXQgZXJyb3Igb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSA2NDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgQUJPUlQgaW5kaWNhdGVzIHRoYXQgdGhlIGltYWdlIHByb2R1Y2luZyBpcyAKLSAgICAgKiBhYm9ydGVkLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBBQk9SVCBpbmRpY2F0ZXMgdGhhdCB0aGUgaW1hZ2UgcHJvZHVjaW5nIGlzIGFib3J0ZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJPUlQgPSAxMjg7CiAKICAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBpbmZvcm1hdGlvbiBhYm91dCBhbiBJbWFnZQotICAgICAqIGludGVyZmFjZSBiZWNvbWVzIGF2YWlsYWJsZS4gVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIAotICAgICAqIGlmIGZ1cnRoZXIgdXBkYXRlcyBhcmUgbmVlZGVkLCBmYWxzZSBpZiBub3QuCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gaW5mb3JtYXRpb24gYWJvdXQgYW4gSW1hZ2UgaW50ZXJmYWNlIGJlY29tZXMKKyAgICAgKiBhdmFpbGFibGUuIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiBmdXJ0aGVyIHVwZGF0ZXMgYXJlIG5lZWRlZCwgZmFsc2UKKyAgICAgKiBpZiBub3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltZyB0aGUgaW1hZ2UgdG8gYmUgb2JzZXJ2ZWQuCi0gICAgICogQHBhcmFtIGluZm9mbGFncyB0aGUgYml0d2lzZSBPUiBjb21iaW5hdGlvbiBvZiBpbmZvcm1hdGlvbiBmbGFnczoKLSAgICAgKiBBQk9SVCwgQUxMQklUUywgRVJST1IsIEZSQU1FQklUUywgSEVJR0hULCBQUk9QRVJUSUVTLCBTT01FQklUUywgCi0gICAgICogV0lEVEguCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGguCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0LgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbWcKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byBiZSBvYnNlcnZlZC4KKyAgICAgKiBAcGFyYW0gaW5mb2ZsYWdzCisgICAgICogICAgICAgICAgICB0aGUgYml0d2lzZSBPUiBjb21iaW5hdGlvbiBvZiBpbmZvcm1hdGlvbiBmbGFnczogQUJPUlQsCisgICAgICogICAgICAgICAgICBBTExCSVRTLCBFUlJPUiwgRlJBTUVCSVRTLCBIRUlHSFQsIFBST1BFUlRJRVMsIFNPTUVCSVRTLAorICAgICAqICAgICAgICAgICAgV0lEVEguCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGguCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodC4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgZnVydGhlciB1cGRhdGVzIGFyZSBuZWVkZWQsIGZhbHNlIGlmIG5vdC4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpbWFnZVVwZGF0ZShJbWFnZSBpbWcsIGludCBpbmZvZmxhZ3MsIGludCB4LCBpbnQgeSwKLSAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgICAgcHVibGljIGJvb2xlYW4gaW1hZ2VVcGRhdGUoSW1hZ2UgaW1nLCBpbnQgaW5mb2ZsYWdzLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0ltYWdlUHJvZHVjZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9JbWFnZVByb2R1Y2VyLmphdmEKaW5kZXggNTU3YWUwOC4uOTEzOGJlMiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0ltYWdlUHJvZHVjZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvSW1hZ2VQcm9kdWNlci5qYXZhCkBAIC0xOCw1NyArMTgsNjIgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCi0KIC8qKgotICogVGhlIEltYWdlUHJvZHVjZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBvYmplY3RzIHdoaWNoIHByb2R1Y2UKLSAqIHRoZSBpbWFnZSBkYXRhLiBJbWFnZVByb2R1Y2VyIGlzIHVzZWQgZm9yIHJlY29uc3RydWN0aW5nIHRoZSAKLSAqIGltYWdlLiBFYWNoIGltYWdlIGNvbnRhaW5zIGFuIEltYWdlUHJvZHVjZXIuIAorICogVGhlIEltYWdlUHJvZHVjZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBvYmplY3RzIHdoaWNoIHByb2R1Y2UgdGhlIGltYWdlCisgKiBkYXRhLiBJbWFnZVByb2R1Y2VyIGlzIHVzZWQgZm9yIHJlY29uc3RydWN0aW5nIHRoZSBpbWFnZS4gRWFjaCBpbWFnZSBjb250YWlucworICogYW4gSW1hZ2VQcm9kdWNlci4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSW1hZ2VQcm9kdWNlciB7CiAKICAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBJbWFnZUNvbnN1bWVyIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIAorICAgICAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIEltYWdlQ29uc3VtZXIgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMKICAgICAgKiBJbWFnZVByb3ZpZGVyIG9yIG5vdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWMgdGhlIEltYWdlQ29uc3VtZXIgdG8gYmUgY2hlY2tlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgSW1hZ2VDb25zdW1lciBpcyByZWdpc3RlcmVkIHdpdGggdGhpcyAKLSAgICAgKiBJbWFnZVByb3ZpZGVyLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIGljCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VDb25zdW1lciB0byBiZSBjaGVja2VkLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBJbWFnZUNvbnN1bWVyIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzCisgICAgICogICAgICAgICBJbWFnZVByb3ZpZGVyLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNDb25zdW1lcihJbWFnZUNvbnN1bWVyIGljKTsKIAogICAgIC8qKgotICAgICAqIFN0YXJ0cyBhIHJlY29uc3RydWN0aW9uIG9mIHRoZSBpbWFnZSBkYXRhIHdoaWNoIHdpbGwgCi0gICAgICogYmUgZGVsaXZlcmVkIHRvIHRoaXMgY29uc3VtZXIuIFRoaXMgbWV0aG9kIGFkZGVzIHRoZQotICAgICAqIHNwZWNpZmllZCBJbWFnZUNvbnN1bWVyIGJlZm9yZSByZWNvbnN0cnVjdGluZyB0aGUgaW1hZ2UuICAKKyAgICAgKiBTdGFydHMgYSByZWNvbnN0cnVjdGlvbiBvZiB0aGUgaW1hZ2UgZGF0YSB3aGljaCB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGlzCisgICAgICogY29uc3VtZXIuIFRoaXMgbWV0aG9kIGFkZHMgdGhlIHNwZWNpZmllZCBJbWFnZUNvbnN1bWVyIGJlZm9yZQorICAgICAqIHJlY29uc3RydWN0aW5nIHRoZSBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWMgdGhlIHNwZWNpZmllZCBJbWFnZUNvbnN1bWVyLgorICAgICAqIEBwYXJhbSBpYworICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBJbWFnZUNvbnN1bWVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJvZHVjdGlvbihJbWFnZUNvbnN1bWVyIGljKTsKIAogICAgIC8qKgotICAgICAqIFJlcXVlc3RzIHRoZSBJbWFnZVByb2R1Y2VyIHRvIHJlc2VuZCB0aGUgaW1hZ2UgZGF0YSAKLSAgICAgKiBpbiBJbWFnZUNvbnN1bWVyLlRPUERPV05MRUZUUklHSFQgb3JkZXIuCisgICAgICogUmVxdWVzdHMgdGhlIEltYWdlUHJvZHVjZXIgdG8gcmVzZW5kIHRoZSBpbWFnZSBkYXRhIGluCisgICAgICogSW1hZ2VDb25zdW1lci5UT1BET1dOTEVGVFJJR0hUIG9yZGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpYyB0aGUgc3BlY2lmaWVkIEltYWdlQ29uc3VtZXIuCisgICAgICogQHBhcmFtIGljCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIEltYWdlQ29uc3VtZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVxdWVzdFRvcERvd25MZWZ0UmlnaHRSZXNlbmQoSW1hZ2VDb25zdW1lciBpYyk7CiAKICAgICAvKioKICAgICAgKiBEZXJlZ2lzdGVycyB0aGUgc3BlY2lmaWVkIEltYWdlQ29uc3VtZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGljIHRoZSBzcGVjaWZpZWQgSW1hZ2VDb25zdW1lci4KKyAgICAgKiBAcGFyYW0gaWMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgSW1hZ2VDb25zdW1lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmVDb25zdW1lcihJbWFnZUNvbnN1bWVyIGljKTsKIAogICAgIC8qKgogICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBJbWFnZUNvbnN1bWVyIG9iamVjdCB0byB0aGlzIEltYWdlUHJvZHVjZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGljIHRoZSBzcGVjaWZpZWQgSW1hZ2VDb25zdW1lci4KKyAgICAgKiBAcGFyYW0gaWMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgSW1hZ2VDb25zdW1lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRDb25zdW1lcihJbWFnZUNvbnN1bWVyIGljKTsKIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvSW1hZ2luZ09wRXhjZXB0aW9uLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvSW1hZ2luZ09wRXhjZXB0aW9uLmphdmEKaW5kZXggZWJjYWJhNC4uZTBjMDEyNyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0ltYWdpbmdPcEV4Y2VwdGlvbi5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9JbWFnaW5nT3BFeGNlcHRpb24uamF2YQpAQCAtMjQsMTkgKzI0LDI0IEBACiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiAvKioKLSAqIFRoZSBJbWFnaW5nT3BFeGNlcHRpb24gY2xhc3MgcHJvdmlkZXMgZXJyb3Igbm90aWZpY2F0aW9uIHdoZW4gCi0gKiB0aGUgQnVmZmVyZWRJbWFnZU9wIG9yIFJhc3Rlck9wIGZpbHRlciBtZXRob2RzIGNhbiBub3QgcGVyZm9ybQotICogdGhlIGRlc2lyZWQgZmlsdGVyIG9wZXJhdGlvbi4KKyAqIFRoZSBJbWFnaW5nT3BFeGNlcHRpb24gY2xhc3MgcHJvdmlkZXMgZXJyb3Igbm90aWZpY2F0aW9uIHdoZW4gdGhlCisgKiBCdWZmZXJlZEltYWdlT3Agb3IgUmFzdGVyT3AgZmlsdGVyIG1ldGhvZHMgY2FuIG5vdCBwZXJmb3JtIHRoZSBkZXNpcmVkIGZpbHRlcgorICogb3BlcmF0aW9uLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEltYWdpbmdPcEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDgwMjYyODg0ODE4NDYyNzY2NThMOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEltYWdpbmdPcEV4Y2VwdGlvbiB3aXRoIGEgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIGRldGFpbCBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UuCiAgICAgICovCiAgICAgcHVibGljIEltYWdpbmdPcEV4Y2VwdGlvbihTdHJpbmcgcykgewogICAgICAgICBzdXBlcihzKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9JbmRleENvbG9yTW9kZWwuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9JbmRleENvbG9yTW9kZWwuamF2YQppbmRleCBhNzA0M2Y0Li4wYjA2YWNkIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvSW5kZXhDb2xvck1vZGVsLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0luZGV4Q29sb3JNb2RlbC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEuYXd0LlRyYW5zcGFyZW5jeTsKQEAgLTI3LDY0ICsyOCw5MiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBDbGFzcyBJbmRleENvbG9yTW9kZWwgcmVwcmVzZW50cyBhIGNvbG9yIG1vZGVsIGluIHdoaWNoIHRoZSAKLSAqIGNvbG9yIHZhbHVlcyBvZiB0aGUgcGl4ZWxzIGFyZSByZWFkIGZyb20gYSBwYWxldHRlLgorICogVGhlIENsYXNzIEluZGV4Q29sb3JNb2RlbCByZXByZXNlbnRzIGEgY29sb3IgbW9kZWwgaW4gd2hpY2ggdGhlIGNvbG9yIHZhbHVlcworICogb2YgdGhlIHBpeGVscyBhcmUgcmVhZCBmcm9tIGEgcGFsZXR0ZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbmRleENvbG9yTW9kZWwgZXh0ZW5kcyBDb2xvck1vZGVsIHsKIAotICAgIC8qKiBUaGUgY29sb3IgbWFwLiAqLwotICAgIHByaXZhdGUgaW50IGNvbG9yTWFwW107ICAgICAgICAvLyBDb2xvciBNYXAgIAorICAgIC8qKgorICAgICAqIFRoZSBjb2xvciBtYXAuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY29sb3JNYXBbXTsgLy8gQ29sb3IgTWFwCiAKLSAgICAvKiogVGhlIG1hcCBzaXplLiAqLwotICAgIHByaXZhdGUgaW50IG1hcFNpemU7ICAgICAgICAgICAvLyBDb2xvciBNYXAgc2l6ZQorICAgIC8qKgorICAgICAqIFRoZSBtYXAgc2l6ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtYXBTaXplOyAvLyBDb2xvciBNYXAgc2l6ZQogCi0gICAgLyoqIFRoZSB0cmFuc3BhcmVudCBpbmRleC4gKi8KLSAgICBwcml2YXRlIGludCB0cmFuc3BhcmVudEluZGV4OyAgLy8gSW5kZXggb2YgZnVsbHkgdHJhbnNwYXJlbnQgcGl4ZWwKKyAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNwYXJlbnQgaW5kZXguCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgdHJhbnNwYXJlbnRJbmRleDsgLy8gSW5kZXggb2YgZnVsbHkgdHJhbnNwYXJlbnQgcGl4ZWwKIAotICAgIC8qKiBUaGUgZ3JheSBwYWxldHRlLiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBncmF5UGFsZXR0ZTsgICAvLyBDb2xvciBNb2RlbCBoYXMgQ29sb3IgTWFwIHdpdGggR3JheSBQYWxsZXRlCisgICAgLyoqCisgICAgICogVGhlIGdyYXkgcGFsZXR0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZ3JheVBhbGV0dGU7IC8vIENvbG9yIE1vZGVsIGhhcyBDb2xvciBNYXAgd2l0aCBHcmF5IFBhbGxldGUKIAotICAgIC8qKiBUaGUgdmFsaWQgYml0cy4gKi8KLSAgICBwcml2YXRlIEJpZ0ludGVnZXIgdmFsaWRCaXRzOyAgLy8gU3BlY2lmeSB2YWxpZCBDb2xvciBNYXAgdmFsdWVzCisgICAgLyoqCisgICAgICogVGhlIHZhbGlkIGJpdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIHZhbGlkQml0czsgLy8gU3BlY2lmeSB2YWxpZCBDb2xvciBNYXAgdmFsdWVzCiAKLSAgICAvKiogVGhlIENvbnN0YW50IENBQ0hFU0laRS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVTSVpFID0gMjA7IC8vIENhY2hlIHNpemUuIENhY2hlIHVzZWQgZm9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wcm92aW5nIHBlcmZvcm1hY2Ugb2Ygc2VsZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWFyZXN0IGNvbG9yIGluIENvbG9yIE1hcAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDQUNIRVNJWkUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBQ0hFU0laRSA9IDIwOyAvLyBDYWNoZSBzaXplLiBDYWNoZSB1c2VkIGZvcgogCi0gICAgLyoqIFRoZSBjYWNoZXRhYmxlLiAqLwotICAgIHByaXZhdGUgZmluYWwgaW50IGNhY2hldGFibGVbXSA9IG5ldyBpbnRbQ0FDSEVTSVpFICogMl07IC8vIENhY2hlIHRhYmxlIC0gdXNlZCBmb3IgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmluZyBSR0IgdmFsdWVzIGFuZCB0aGF0IGFwcHJvcHJpYXRlIGluZGljZXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIENvbG9yIE1hcCAKLSAgICAgICAgICAgICAgICAgICAgCisgICAgLy8gaW1wcm92aW5nIHBlcmZvcm1hY2Ugb2Ygc2VsZWN0aW9uCisgICAgLy8gbmVhcmVzdCBjb2xvciBpbiBDb2xvciBNYXAKIAotICAgIC8qKiBUaGUgbmV4dCBpbnNlcnQgaWR4LiAqLwotICAgIHByaXZhdGUgaW50IG5leHRJbnNlcnRJZHggPSAwOyAgLy8gTmV4dCBpbmRleCBmb3IgaW5zZXJ0aW9uIGludG8gQ2FjaGUgdGFibGUKKyAgICAvKioKKyAgICAgKiBUaGUgY2FjaGV0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBjYWNoZXRhYmxlW10gPSBuZXcgaW50W0NBQ0hFU0laRSAqIDJdOyAvLyBDYWNoZSB0YWJsZSAtCiAKLSAgICAvKiogVGhlIHRvdGFsIGluc2VydGVkLiAqLwotICAgIHByaXZhdGUgaW50IHRvdGFsSW5zZXJ0ZWQgPSAwOyAgLy8gTnVtYmVyIG9mIGluc2VydGVkIHZhbHVlcyBpbnRvIENhY2hlIHRhYmxlCisgICAgLy8gdXNlZCBmb3IKKworICAgIC8vIHN0b3JpbmcgUkdCIHZhbHVlcyBhbmQgdGhhdCBhcHByb3ByaWF0ZSBpbmRpY2VzCisgICAgLy8gaW4gdGhlIENvbG9yIE1hcAorCisgICAgLyoqCisgICAgICogVGhlIG5leHQgaW5zZXJ0IGlkeC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBuZXh0SW5zZXJ0SWR4ID0gMDsgLy8gTmV4dCBpbmRleCBmb3IgaW5zZXJ0aW9uIGludG8gQ2FjaGUgdGFibGUKKworICAgIC8qKgorICAgICAqIFRoZSB0b3RhbCBpbnNlcnRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCB0b3RhbEluc2VydGVkID0gMDsgLy8gTnVtYmVyIG9mIGluc2VydGVkIHZhbHVlcyBpbnRvIENhY2hlIHRhYmxlCiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgaW5kZXggY29sb3IgbW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJpdHMgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcwotICAgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAKLSAgICAgKiBAcGFyYW0gY21hcCB0aGUgYXJyYXkgdGhhdCBnaXZlcyB0aGUgY29sb3IgbWFwcGluZwotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIGNvbG9yIG1hcHBpbmcgZGF0YSB3aXRoaW4gdGhlIGNtYXAgYXJyYXkKLSAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlIHRoZSB0cmFuc2ZlciB0eXBlIChwcmltaXRpdmUgamF2YSB0eXBlIAotICAgICAqIHRvIHVzZSBmb3IgdGhlIGNvbXBvbmVudHMpCi0gICAgICogQHBhcmFtIHZhbGlkQml0cyBhIGxpc3Qgb2Ygd2hpY2ggYml0cyByZXByZXNlbnQgdmFsaWQgY29sb3JtYXAgCi0gICAgICogdmFsdWVzLCBvciBudWxsIGlmIGFsbCBhcmUgdmFsaWQKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwIGlzCi0gICAgICogbGVzcyB0aGFuIG9uZQorICAgICAqIEBwYXJhbSBiaXRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwLgorICAgICAqIEBwYXJhbSBjbWFwCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgdGhhdCBnaXZlcyB0aGUgY29sb3IgbWFwcGluZy4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgY29sb3IgbWFwcGluZyBkYXRhIHdpdGhpbiB0aGUgY21hcAorICAgICAqICAgICAgICAgICAgYXJyYXkuCisgICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zZmVyIHR5cGUgKHByaW1pdGl2ZSBqYXZhIHR5cGUgdG8gdXNlIGZvciB0aGUKKyAgICAgKiAgICAgICAgICAgIGNvbXBvbmVudHMpLgorICAgICAqIEBwYXJhbSB2YWxpZEJpdHMKKyAgICAgKiAgICAgICAgICAgIGEgbGlzdCBvZiB3aGljaCBiaXRzIHJlcHJlc2VudCB2YWxpZCBjb2xvcm1hcCB2YWx1ZXMsIG9yIG51bGwKKyAgICAgKiAgICAgICAgICAgIGlmIGFsbCBhcmUgdmFsaWQuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwIGlzIGxlc3MgdGhhbiBvbmUuCiAgICAgICovCi0gICAgcHVibGljIEluZGV4Q29sb3JNb2RlbChpbnQgYml0cywgaW50IHNpemUsIGludCBjbWFwW10sIGludCBzdGFydCwKLSAgICAgICAgICAgIGludCB0cmFuc2ZlclR5cGUsIEJpZ0ludGVnZXIgdmFsaWRCaXRzKSB7CisgICAgcHVibGljIEluZGV4Q29sb3JNb2RlbChpbnQgYml0cywgaW50IHNpemUsIGludCBjbWFwW10sIGludCBzdGFydCwgaW50IHRyYW5zZmVyVHlwZSwKKyAgICAgICAgICAgIEJpZ0ludGVnZXIgdmFsaWRCaXRzKSB7CiAKLSAgICAgICAgc3VwZXIoYml0cywgSW5kZXhDb2xvck1vZGVsLmNyZWF0ZUJpdHModHJ1ZSksCi0gICAgICAgICAgICAgICAgQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IpLCB0cnVlLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBUcmFuc3BhcmVuY3kuT1BBUVVFLCB2YWxpZGF0ZVRyYW5zZmVyVHlwZSh0cmFuc2ZlclR5cGUpKTsKKyAgICAgICAgc3VwZXIoYml0cywgSW5kZXhDb2xvck1vZGVsLmNyZWF0ZUJpdHModHJ1ZSksIENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCKSwKKyAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSwgVHJhbnNwYXJlbmN5Lk9QQVFVRSwgdmFsaWRhdGVUcmFuc2ZlclR5cGUodHJhbnNmZXJUeXBlKSk7CiAKICAgICAgICAgaWYgKHNpemUgPCAxKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjY0PVNpemUgb2YgdGhlIGNvbG9yIG1hcCBpcyBsZXNzIHRoYW4gMQpAQCAtMTIyLDggKzE1MSw3IEBACiAgICAgICAgICAgICAgICAgaWYgKHRyYW5zcGFyZW5jeSA9PSBUcmFuc3BhcmVuY3kuT1BBUVVFKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyYW5zcGFyZW5jeSA9IFRyYW5zcGFyZW5jeS5CSVRNQVNLOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWxwaGEgIT0gYWxwaGFNYXNrICYmCi0gICAgICAgICAgICAgICAgICAgIHRyYW5zcGFyZW5jeSAhPSBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWxwaGEgIT0gYWxwaGFNYXNrICYmIHRyYW5zcGFyZW5jeSAhPSBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQpIHsKICAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3kgPSBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQ7CiAgICAgICAgICAgICB9CiAKQEAgLTEzNSwyNSArMTYzLDMxIEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGluZGV4IGNvbG9yIG1vZGVsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBiaXRzIHRoZSBhcnJheSBvZiBjb21wb25lbnQgbWFza3MKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwCi0gICAgICogQHBhcmFtIGNtYXAgdGhlIGFycmF5IHRoYXQgZ2l2ZXMgdGhlIGNvbG9yIG1hcHBpbmcKLSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSBjb2xvciBtYXBwaW5nIGRhdGEgd2l0aGluIHRoZSBjbWFwIGFycmF5Ci0gICAgICogQHBhcmFtIGhhc2FscGhhIHdoZXRoZXIgdGhpcyBjb2xvciBtb2RlbCB1c2VzIGFscGhhCi0gICAgICogQHBhcmFtIHRyYW5zIHRoZSB0cmFuc3BhcmVuY3kgc3VwcG9ydGVkLCBAc2VlIGphdmEuYXd0LlRyYW5zcGFyZW5jeQotICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUgdGhlIHRyYW5zZmVyIHR5cGUgKHByaW1pdGl2ZSBqYXZhIHR5cGUgCi0gICAgICogdG8gdXNlIGZvciB0aGUgY29tcG9uZW50cykKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwIGlzCi0gICAgICogbGVzcyB0aGFuIG9uZQorICAgICAqIEBwYXJhbSBiaXRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwLgorICAgICAqIEBwYXJhbSBjbWFwCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgdGhhdCBnaXZlcyB0aGUgY29sb3IgbWFwcGluZy4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgY29sb3IgbWFwcGluZyBkYXRhIHdpdGhpbiB0aGUgY21hcAorICAgICAqICAgICAgICAgICAgYXJyYXkuCisgICAgICogQHBhcmFtIGhhc2FscGhhCisgICAgICogICAgICAgICAgICB3aGV0aGVyIHRoaXMgY29sb3IgbW9kZWwgdXNlcyBhbHBoYS4KKyAgICAgKiBAcGFyYW0gdHJhbnMKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc3BhcmVuY3kgc3VwcG9ydGVkLCBAc2VlIGphdmEuYXd0LlRyYW5zcGFyZW5jeS4KKyAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlCisgICAgICogICAgICAgICAgICB0aGUgdHJhbnNmZXIgdHlwZSAocHJpbWl0aXZlIGphdmEgdHlwZSB0byB1c2UgZm9yIHRoZQorICAgICAqICAgICAgICAgICAgY29tcG9uZW50cykuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwIGlzIGxlc3MgdGhhbiBvbmUuCiAgICAgICovCi0gICAgcHVibGljIEluZGV4Q29sb3JNb2RlbChpbnQgYml0cywgaW50IHNpemUsIGludCBjbWFwW10sIGludCBzdGFydCwKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzYWxwaGEsIGludCB0cmFucywgaW50IHRyYW5zZmVyVHlwZSkgeworICAgIHB1YmxpYyBJbmRleENvbG9yTW9kZWwoaW50IGJpdHMsIGludCBzaXplLCBpbnQgY21hcFtdLCBpbnQgc3RhcnQsIGJvb2xlYW4gaGFzYWxwaGEsIGludCB0cmFucywKKyAgICAgICAgICAgIGludCB0cmFuc2ZlclR5cGUpIHsKIAotICAgICAgICBzdXBlcihiaXRzLCBJbmRleENvbG9yTW9kZWwuY3JlYXRlQml0cyhoYXNhbHBoYSB8fCAodHJhbnMgPj0gMCkpLAotICAgICAgICAgICAgICAgIENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCKSwKLSAgICAgICAgICAgICAgICAoaGFzYWxwaGEgfHwgKHRyYW5zID49IDApKSwgZmFsc2UsIFRyYW5zcGFyZW5jeS5PUEFRVUUsCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVUcmFuc2ZlclR5cGUodHJhbnNmZXJUeXBlKSk7CisgICAgICAgIHN1cGVyKGJpdHMsIEluZGV4Q29sb3JNb2RlbC5jcmVhdGVCaXRzKGhhc2FscGhhIHx8ICh0cmFucyA+PSAwKSksIENvbG9yU3BhY2UKKyAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCKSwgKGhhc2FscGhhIHx8ICh0cmFucyA+PSAwKSksIGZhbHNlLAorICAgICAgICAgICAgICAgIFRyYW5zcGFyZW5jeS5PUEFRVUUsIHZhbGlkYXRlVHJhbnNmZXJUeXBlKHRyYW5zZmVyVHlwZSkpOwogCiAgICAgICAgIGlmIChzaXplIDwgMSkgewogICAgICAgICAgICAgLy8gYXd0LjI2ND1TaXplIG9mIHRoZSBjb2xvciBtYXAgaXMgbGVzcyB0aGFuIDEKQEAgLTE5Miw4ICsyMjYsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNwYXJlbmN5ID09IFRyYW5zcGFyZW5jeS5PUEFRVUUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcGFyZW5jeSA9IFRyYW5zcGFyZW5jeS5CSVRNQVNLOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbHBoYSAhPSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB0cmFuc3BhcmVuY3kgIT0gVHJhbnNwYXJlbmN5LlRSQU5TTFVDRU5UKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbHBoYSAhPSAwICYmIHRyYW5zcGFyZW5jeSAhPSBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQpIHsKICAgICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbmN5ID0gVHJhbnNwYXJlbmN5LlRSQU5TTFVDRU5UOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yMDUsNTUgKzIzOCw3MCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBpbmRleCBjb2xvciBtb2RlbCBieSBidWlsZGluZyB0aGUgY29sb3IgbWFwIAotICAgICAqIGZyb20gYXJyYXlzIG9mIHJlZCwgZ3JlZW4sIGJsdWUsIGFuZCBhbHBoYSB2YWx1ZXMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGluZGV4IGNvbG9yIG1vZGVsIGJ5IGJ1aWxkaW5nIHRoZSBjb2xvciBtYXAgZnJvbQorICAgICAqIGFycmF5cyBvZiByZWQsIGdyZWVuLCBibHVlLCBhbmQgYWxwaGEgdmFsdWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBiaXRzIHRoZSBhcnJheSBvZiBjb21wb25lbnQgbWFza3MKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwCi0gICAgICogQHBhcmFtIHIgdGhlIGFycmF5IGdpdmluZyB0aGUgcmVkIGNvbXBvbmVudHMgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGNvbG9yIG1hcAotICAgICAqIEBwYXJhbSBnIHRoZSBhcnJheSBnaXZpbmcgdGhlIGdyZWVuIGNvbXBvbmVudHMgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGNvbG9yIG1hcAotICAgICAqIEBwYXJhbSBiIHRoZSBhcnJheSBnaXZpbmcgdGhlIGJsdWUgY29tcG9uZW50cyBvZiB0aGUgZW50cmllcyBpbiB0aGUgY29sb3IgbWFwCi0gICAgICogQHBhcmFtIGEgdGhlIGFycmF5IGdpdmluZyB0aGUgYWxwaGEgY29tcG9uZW50cyBvZiB0aGUgZW50cmllcyBpbiB0aGUgY29sb3IgbWFwCi0gICAgICogCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpemUgb2YgdGhlIGNvbG9yIG1hcCBpcwotICAgICAqIGxlc3MgdGhhbiBvbmUKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgc2l6ZSBvZiBvbmUgb2YgdGhlIAotICAgICAqIGNvbXBvbmVudCBhcnJheXMgaXMgbGVzcyB0aGFuIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAKKyAgICAgKiBAcGFyYW0gYml0cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcy4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGNvbG9yIG1hcC4KKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IGdpdmluZyB0aGUgcmVkIGNvbXBvbmVudHMgb2YgdGhlIGVudHJpZXMgaW4gdGhlCisgICAgICogICAgICAgICAgICBjb2xvciBtYXAuCisgICAgICogQHBhcmFtIGcKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBnaXZpbmcgdGhlIGdyZWVuIGNvbXBvbmVudHMgb2YgdGhlIGVudHJpZXMgaW4gdGhlCisgICAgICogICAgICAgICAgICBjb2xvciBtYXAuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBnaXZpbmcgdGhlIGJsdWUgY29tcG9uZW50cyBvZiB0aGUgZW50cmllcyBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIGNvbG9yIG1hcC4KKyAgICAgKiBAcGFyYW0gYQorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IGdpdmluZyB0aGUgYWxwaGEgY29tcG9uZW50cyBvZiB0aGUgZW50cmllcyBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIGNvbG9yIG1hcC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAgaXMgbGVzcyB0aGFuIG9uZS4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIG9uZSBvZiB0aGUgY29tcG9uZW50IGFycmF5cyBpcyBsZXNzIHRoYW4gdGhlCisgICAgICogICAgICAgICAgICAgc2l6ZSBvZiB0aGUgY29sb3IgbWFwLgogICAgICAqLwotICAgIHB1YmxpYyBJbmRleENvbG9yTW9kZWwoaW50IGJpdHMsIGludCBzaXplLCBieXRlIHJbXSwgYnl0ZSBnW10sIGJ5dGUgYltdLAotICAgICAgICAgICAgYnl0ZSBhW10pIHsKKyAgICBwdWJsaWMgSW5kZXhDb2xvck1vZGVsKGludCBiaXRzLCBpbnQgc2l6ZSwgYnl0ZSByW10sIGJ5dGUgZ1tdLCBieXRlIGJbXSwgYnl0ZSBhW10pIHsKIAotICAgICAgICBzdXBlcihiaXRzLCBJbmRleENvbG9yTW9kZWwuY3JlYXRlQml0cyh0cnVlKSwKLSAgICAgICAgICAgICAgICBDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1Nfc1JHQiksIHRydWUsIGZhbHNlLAotICAgICAgICAgICAgICAgIFRyYW5zcGFyZW5jeS5PUEFRVUUsCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVUcmFuc2ZlclR5cGUoQ29sb3JNb2RlbC5nZXRUcmFuc2ZlclR5cGUoYml0cykpKTsKKyAgICAgICAgc3VwZXIoYml0cywgSW5kZXhDb2xvck1vZGVsLmNyZWF0ZUJpdHModHJ1ZSksIENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCKSwKKyAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSwgVHJhbnNwYXJlbmN5Lk9QQVFVRSwgdmFsaWRhdGVUcmFuc2ZlclR5cGUoQ29sb3JNb2RlbAorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRyYW5zZmVyVHlwZShiaXRzKSkpOwogCiAgICAgICAgIGNyZWF0ZUNvbG9yTWFwKHNpemUsIHIsIGcsIGIsIGEsIC0xKTsKICAgICAgICAgY2hlY2tQYWxldHRlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGluZGV4IGNvbG9yIG1vZGVsIGJ5IGJ1aWxkaW5nIHRoZSBjb2xvciBtYXAgCi0gICAgICogZnJvbSBhcnJheXMgb2YgcmVkLCBncmVlbiwgYW5kIGJsdWUgdmFsdWVzLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBpbmRleCBjb2xvciBtb2RlbCBieSBidWlsZGluZyB0aGUgY29sb3IgbWFwIGZyb20KKyAgICAgKiBhcnJheXMgb2YgcmVkLCBncmVlbiwgYW5kIGJsdWUgdmFsdWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBiaXRzIHRoZSBhcnJheSBvZiBjb21wb25lbnQgbWFza3MKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwCi0gICAgICogQHBhcmFtIHIgdGhlIGFycmF5IGdpdmluZyB0aGUgcmVkIGNvbXBvbmVudHMgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGNvbG9yIG1hcAotICAgICAqIEBwYXJhbSBnIHRoZSBhcnJheSBnaXZpbmcgdGhlIGdyZWVuIGNvbXBvbmVudHMgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGNvbG9yIG1hcAotICAgICAqIEBwYXJhbSBiIHRoZSBhcnJheSBnaXZpbmcgdGhlIGJsdWUgY29tcG9uZW50cyBvZiB0aGUgZW50cmllcyBpbiB0aGUgY29sb3IgbWFwCi0gICAgICogQHBhcmFtIHRyYW5zIHRoZSB0cmFuc3BhcmVuY3kgc3VwcG9ydGVkLCBAc2VlIGphdmEuYXd0LlRyYW5zcGFyZW5jeQotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAgaXMKLSAgICAgKiBsZXNzIHRoYW4gb25lCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIHNpemUgb2Ygb25lIG9mIHRoZSAKLSAgICAgKiBjb21wb25lbnQgYXJyYXlzIGlzIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwCisgICAgICogQHBhcmFtIGJpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBjb21wb25lbnQgbWFza3MuCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAuCisgICAgICogQHBhcmFtIHIKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBnaXZpbmcgdGhlIHJlZCBjb21wb25lbnRzIG9mIHRoZSBlbnRyaWVzIGluIHRoZQorICAgICAqICAgICAgICAgICAgY29sb3IgbWFwLgorICAgICAqIEBwYXJhbSBnCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgZ2l2aW5nIHRoZSBncmVlbiBjb21wb25lbnRzIG9mIHRoZSBlbnRyaWVzIGluIHRoZQorICAgICAqICAgICAgICAgICAgY29sb3IgbWFwLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgZ2l2aW5nIHRoZSBibHVlIGNvbXBvbmVudHMgb2YgdGhlIGVudHJpZXMgaW4gdGhlCisgICAgICogICAgICAgICAgICBjb2xvciBtYXAuCisgICAgICogQHBhcmFtIHRyYW5zCisgICAgICogICAgICAgICAgICB0aGUgdHJhbnNwYXJlbmN5IHN1cHBvcnRlZCwgQHNlZSBqYXZhLmF3dC5UcmFuc3BhcmVuY3kuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwIGlzIGxlc3MgdGhhbiBvbmUuCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2l6ZSBvZiBvbmUgb2YgdGhlIGNvbXBvbmVudCBhcnJheXMgaXMgbGVzcyB0aGFuIHRoZQorICAgICAqICAgICAgICAgICAgIHNpemUgb2YgdGhlIGNvbG9yIG1hcC4KICAgICAgKi8KLSAgICBwdWJsaWMgSW5kZXhDb2xvck1vZGVsKGludCBiaXRzLCBpbnQgc2l6ZSwgYnl0ZSByW10sIGJ5dGUgZ1tdLCBieXRlIGJbXSwKLSAgICAgICAgICAgIGludCB0cmFucykgeworICAgIHB1YmxpYyBJbmRleENvbG9yTW9kZWwoaW50IGJpdHMsIGludCBzaXplLCBieXRlIHJbXSwgYnl0ZSBnW10sIGJ5dGUgYltdLCBpbnQgdHJhbnMpIHsKIAotICAgICAgICBzdXBlcihiaXRzLCBJbmRleENvbG9yTW9kZWwuY3JlYXRlQml0cygodHJhbnMgPj0gMCkpLAotICAgICAgICAgICAgICAgIENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCKSwgKHRyYW5zID49IDApLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBUcmFuc3BhcmVuY3kuT1BBUVVFLAorICAgICAgICBzdXBlcihiaXRzLCBJbmRleENvbG9yTW9kZWwuY3JlYXRlQml0cygodHJhbnMgPj0gMCkpLCBDb2xvclNwYWNlCisgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1Nfc1JHQiksICh0cmFucyA+PSAwKSwgZmFsc2UsIFRyYW5zcGFyZW5jeS5PUEFRVUUsCiAgICAgICAgICAgICAgICAgdmFsaWRhdGVUcmFuc2ZlclR5cGUoQ29sb3JNb2RlbC5nZXRUcmFuc2ZlclR5cGUoYml0cykpKTsKIAogICAgICAgICBjcmVhdGVDb2xvck1hcChzaXplLCByLCBnLCBiLCBudWxsLCB0cmFucyk7CkBAIC0yNjEsMjUgKzMwOSwzMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBpbmRleCBjb2xvciBtb2RlbCBieSBidWlsZGluZyB0aGUgY29sb3IgbWFwIAotICAgICAqIGZyb20gYXJyYXlzIG9mIHJlZCwgZ3JlZW4sIGFuZCBibHVlIHZhbHVlcy4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgaW5kZXggY29sb3IgbW9kZWwgYnkgYnVpbGRpbmcgdGhlIGNvbG9yIG1hcCBmcm9tCisgICAgICogYXJyYXlzIG9mIHJlZCwgZ3JlZW4sIGFuZCBibHVlIHZhbHVlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYml0cyB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzCi0gICAgICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIGNvbG9yIG1hcAotICAgICAqIEBwYXJhbSByIHRoZSBhcnJheSBnaXZpbmcgdGhlIHJlZCBjb21wb25lbnRzIG9mIHRoZSBlbnRyaWVzIGluIHRoZSBjb2xvciBtYXAKLSAgICAgKiBAcGFyYW0gZyB0aGUgYXJyYXkgZ2l2aW5nIHRoZSBncmVlbiBjb21wb25lbnRzIG9mIHRoZSBlbnRyaWVzIGluIHRoZSBjb2xvciBtYXAKLSAgICAgKiBAcGFyYW0gYiB0aGUgYXJyYXkgZ2l2aW5nIHRoZSBibHVlIGNvbXBvbmVudHMgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGNvbG9yIG1hcAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAgaXMKLSAgICAgKiBsZXNzIHRoYW4gb25lCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIHNpemUgb2Ygb25lIG9mIHRoZSAKLSAgICAgKiBjb21wb25lbnQgYXJyYXlzIGlzIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwCisgICAgICogQHBhcmFtIGJpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBjb21wb25lbnQgbWFza3MuCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAuCisgICAgICogQHBhcmFtIHIKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBnaXZpbmcgdGhlIHJlZCBjb21wb25lbnRzIG9mIHRoZSBlbnRyaWVzIGluIHRoZQorICAgICAqICAgICAgICAgICAgY29sb3IgbWFwLgorICAgICAqIEBwYXJhbSBnCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgZ2l2aW5nIHRoZSBncmVlbiBjb21wb25lbnRzIG9mIHRoZSBlbnRyaWVzIGluIHRoZQorICAgICAqICAgICAgICAgICAgY29sb3IgbWFwLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgZ2l2aW5nIHRoZSBibHVlIGNvbXBvbmVudHMgb2YgdGhlIGVudHJpZXMgaW4gdGhlCisgICAgICogICAgICAgICAgICBjb2xvciBtYXAuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwIGlzIGxlc3MgdGhhbiBvbmUuCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2l6ZSBvZiBvbmUgb2YgdGhlIGNvbXBvbmVudCBhcnJheXMgaXMgbGVzcyB0aGFuIHRoZQorICAgICAqICAgICAgICAgICAgIHNpemUgb2YgdGhlIGNvbG9yIG1hcC4KICAgICAgKi8KICAgICBwdWJsaWMgSW5kZXhDb2xvck1vZGVsKGludCBiaXRzLCBpbnQgc2l6ZSwgYnl0ZSByW10sIGJ5dGUgZ1tdLCBieXRlIGJbXSkgewotICAgICAgICBzdXBlcihiaXRzLCBJbmRleENvbG9yTW9kZWwuY3JlYXRlQml0cyhmYWxzZSksCi0gICAgICAgICAgICAgICAgQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IpLCBmYWxzZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgVHJhbnNwYXJlbmN5Lk9QQVFVRSwKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVRyYW5zZmVyVHlwZShDb2xvck1vZGVsLmdldFRyYW5zZmVyVHlwZShiaXRzKSkpOworICAgICAgICBzdXBlcihiaXRzLCBJbmRleENvbG9yTW9kZWwuY3JlYXRlQml0cyhmYWxzZSksIENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCKSwKKyAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIFRyYW5zcGFyZW5jeS5PUEFRVUUsIHZhbGlkYXRlVHJhbnNmZXJUeXBlKENvbG9yTW9kZWwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUcmFuc2ZlclR5cGUoYml0cykpKTsKIAogICAgICAgICBjcmVhdGVDb2xvck1hcChzaXplLCByLCBnLCBiLCBudWxsLCAtMSk7CiAgICAgICAgIGNoZWNrUGFsZXR0ZSgpOwpAQCAtMjg4LDIzICszNDMsMjcgQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgaW5kZXggY29sb3IgbW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJpdHMgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcwotICAgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAKLSAgICAgKiBAcGFyYW0gY21hcCB0aGUgYXJyYXkgdGhhdCBnaXZlcyB0aGUgY29sb3IgbWFwcGluZwotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIGNvbG9yIG1hcHBpbmcgZGF0YSB3aXRoaW4gdGhlIGNtYXAgYXJyYXkKLSAgICAgKiBAcGFyYW0gaGFzYWxwaGEgd2hldGhlciB0aGlzIGNvbG9yIG1vZGVsIHVzZXMgYWxwaGEKLSAgICAgKiBAcGFyYW0gdHJhbnMgdGhlIHRyYW5zcGFyZW5jeSBzdXBwb3J0ZWQsIEBzZWUgamF2YS5hd3QuVHJhbnNwYXJlbmN5Ci0gICAgICogCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpemUgb2YgdGhlIGNvbG9yIG1hcCBpcwotICAgICAqIGxlc3MgdGhhbiBvbmUKKyAgICAgKiBAcGFyYW0gYml0cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcy4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGNvbG9yIG1hcC4KKyAgICAgKiBAcGFyYW0gY21hcAorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHRoYXQgZ2l2ZXMgdGhlIGNvbG9yIG1hcHBpbmcuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIGNvbG9yIG1hcHBpbmcgZGF0YSB3aXRoaW4gdGhlIGNtYXAKKyAgICAgKiAgICAgICAgICAgIGFycmF5LgorICAgICAqIEBwYXJhbSBoYXNhbHBoYQorICAgICAqICAgICAgICAgICAgd2hldGhlciB0aGlzIGNvbG9yIG1vZGVsIHVzZXMgYWxwaGEuCisgICAgICogQHBhcmFtIHRyYW5zCisgICAgICogICAgICAgICAgICB0aGUgdHJhbnNwYXJlbmN5IHN1cHBvcnRlZCwgQHNlZSBqYXZhLmF3dC5UcmFuc3BhcmVuY3kuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwIGlzIGxlc3MgdGhhbiBvbmUuCiAgICAgICovCi0gICAgcHVibGljIEluZGV4Q29sb3JNb2RlbChpbnQgYml0cywgaW50IHNpemUsIGJ5dGUgY21hcFtdLCBpbnQgc3RhcnQsCi0gICAgICAgICAgICBib29sZWFuIGhhc2FscGhhLCBpbnQgdHJhbnMpIHsKKyAgICBwdWJsaWMgSW5kZXhDb2xvck1vZGVsKGludCBiaXRzLCBpbnQgc2l6ZSwgYnl0ZSBjbWFwW10sIGludCBzdGFydCwgYm9vbGVhbiBoYXNhbHBoYSwgaW50IHRyYW5zKSB7CiAKLSAgICAgICAgc3VwZXIoYml0cywgSW5kZXhDb2xvck1vZGVsLmNyZWF0ZUJpdHMoaGFzYWxwaGEgfHwgKHRyYW5zID49IDApKSwKLSAgICAgICAgICAgICAgICBDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1Nfc1JHQiksCi0gICAgICAgICAgICAgICAgKGhhc2FscGhhIHx8ICh0cmFucyA+PSAwKSksIGZhbHNlLCBUcmFuc3BhcmVuY3kuT1BBUVVFLAotICAgICAgICAgICAgICAgIHZhbGlkYXRlVHJhbnNmZXJUeXBlKENvbG9yTW9kZWwuZ2V0VHJhbnNmZXJUeXBlKGJpdHMpKSk7CisgICAgICAgIHN1cGVyKGJpdHMsIEluZGV4Q29sb3JNb2RlbC5jcmVhdGVCaXRzKGhhc2FscGhhIHx8ICh0cmFucyA+PSAwKSksIENvbG9yU3BhY2UKKyAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCKSwgKGhhc2FscGhhIHx8ICh0cmFucyA+PSAwKSksIGZhbHNlLAorICAgICAgICAgICAgICAgIFRyYW5zcGFyZW5jeS5PUEFRVUUsIHZhbGlkYXRlVHJhbnNmZXJUeXBlKENvbG9yTW9kZWwuZ2V0VHJhbnNmZXJUeXBlKGJpdHMpKSk7CiAKICAgICAgICAgaWYgKHNpemUgPCAxKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjY0PVNpemUgb2YgdGhlIGNvbG9yIG1hcCBpcyBsZXNzIHRoYW4gMQpAQCAtMzE5LDEzICszNzgsMTMgQEAKICAgICAgICAgaW50IGFscGhhID0gMHhmZjAwMDAwMDsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcFNpemU7IGkrKykgewotICAgICAgICAgICAgY29sb3JNYXBbaV0gPSAoY21hcFtzdGFydCsrXSAmIDB4ZmYpIDw8IDE2IHwKLSAgICAgICAgICAgICAgICAgICAoY21hcFtzdGFydCsrXSAmIDB4ZmYpIDw8IDggfCAoY21hcFtzdGFydCsrXSAmIDB4ZmYpOworICAgICAgICAgICAgY29sb3JNYXBbaV0gPSAoY21hcFtzdGFydCsrXSAmIDB4ZmYpIDw8IDE2IHwgKGNtYXBbc3RhcnQrK10gJiAweGZmKSA8PCA4CisgICAgICAgICAgICAgICAgICAgIHwgKGNtYXBbc3RhcnQrK10gJiAweGZmKTsKICAgICAgICAgICAgIGlmICh0cmFucyA9PSBpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHRyYW5zcGFyZW5jeSA9PSBUcmFuc3BhcmVuY3kuT1BBUVVFKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyYW5zcGFyZW5jeSA9IFRyYW5zcGFyZW5jeS5CSVRNQVNLOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihoYXNhbHBoYSkgeworICAgICAgICAgICAgICAgIGlmIChoYXNhbHBoYSkgewogICAgICAgICAgICAgICAgICAgICBzdGFydCsrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTM0MCw4ICszOTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhICE9IDB4ZmYgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcGFyZW5jeSAhPSBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhICE9IDB4ZmYgJiYgdHJhbnNwYXJlbmN5ICE9IFRyYW5zcGFyZW5jeS5UUkFOU0xVQ0VOVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbmN5ID0gVHJhbnNwYXJlbmN5LlRSQU5TTFVDRU5UOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMzYwLDI1ICs0MTgsMjkgQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgaW5kZXggY29sb3IgbW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJpdHMgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcwotICAgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAKLSAgICAgKiBAcGFyYW0gY21hcCB0aGUgYXJyYXkgdGhhdCBnaXZlcyB0aGUgY29sb3IgbWFwcGluZwotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIGNvbG9yIG1hcHBpbmcgZGF0YSB3aXRoaW4gdGhlIGNtYXAgYXJyYXkKLSAgICAgKiBAcGFyYW0gaGFzYWxwaGEgd2hldGhlciB0aGlzIGNvbG9yIG1vZGVsIHVzZXMgYWxwaGEKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwIGlzCi0gICAgICogbGVzcyB0aGFuIG9uZQorICAgICAqIEBwYXJhbSBiaXRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwLgorICAgICAqIEBwYXJhbSBjbWFwCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgdGhhdCBnaXZlcyB0aGUgY29sb3IgbWFwcGluZy4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgY29sb3IgbWFwcGluZyBkYXRhIHdpdGhpbiB0aGUgY21hcAorICAgICAqICAgICAgICAgICAgYXJyYXkuCisgICAgICogQHBhcmFtIGhhc2FscGhhCisgICAgICogICAgICAgICAgICB3aGV0aGVyIHRoaXMgY29sb3IgbW9kZWwgdXNlcyBhbHBoYS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAgaXMgbGVzcyB0aGFuIG9uZS4KICAgICAgKi8KLSAgICBwdWJsaWMgSW5kZXhDb2xvck1vZGVsKGludCBiaXRzLCBpbnQgc2l6ZSwgYnl0ZSBjbWFwW10sIGludCBzdGFydCwKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzYWxwaGEpIHsKKyAgICBwdWJsaWMgSW5kZXhDb2xvck1vZGVsKGludCBiaXRzLCBpbnQgc2l6ZSwgYnl0ZSBjbWFwW10sIGludCBzdGFydCwgYm9vbGVhbiBoYXNhbHBoYSkgewogCiAgICAgICAgIHRoaXMoYml0cywgc2l6ZSwgY21hcCwgc3RhcnQsIGhhc2FscGhhLCAtMSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBnZXREYXRhRWxlbWVudHMoaW50W10gY29tcG9uZW50cywgaW50IG9mZnNldCwgT2JqZWN0IHBpeGVsKSB7Ci0gICAgICAgIGludCByZ2IgPSAoY29tcG9uZW50c1tvZmZzZXRdIDw8IDE2KSB8IChjb21wb25lbnRzW29mZnNldCArIDFdKSA8PCA4IHwKLSAgICAgICAgICAgICAgIGNvbXBvbmVudHNbb2Zmc2V0ICsgMl07CisgICAgICAgIGludCByZ2IgPSAoY29tcG9uZW50c1tvZmZzZXRdIDw8IDE2KSB8IChjb21wb25lbnRzW29mZnNldCArIDFdKSA8PCA4CisgICAgICAgICAgICAgICAgfCBjb21wb25lbnRzW29mZnNldCArIDJdOwogICAgICAgICBpZiAoaGFzQWxwaGEpIHsKICAgICAgICAgICAgIHJnYiB8PSBjb21wb25lbnRzW29mZnNldCArIDNdIDw8IDI0OwogICAgICAgICB9IGVsc2UgewpAQCAtNDE5LDcgKzQ4MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoYWxwaGEgPT0gMCAmJiB0cmFuc3BhcmVudEluZGV4ID4gLTEpIHsKICAgICAgICAgICAgIHBpeElkeCA9IHRyYW5zcGFyZW50SW5kZXg7Ci0gICAgICAgIH0gZWxzZSAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaW50IG1pbkFscGhhRXJyb3IgPSAyNTU7CiAgICAgICAgICAgICBpbnQgbWluRXJyb3IgPSAxOTUwNzU7IC8vIDI1NV4yICsgMjU1XjIgKyAyNTVeMgogICAgICAgICAgICAgaW50IGFscGhhRXJyb3I7CkBAIC00NzAsMTkgKzUzMiwxOSBAQAogICAgIC8qKgogICAgICAqIENvbnZlcnRzIGFuIGltYWdlIGZyb20gaW5kZXhlZCB0byBSR0IgZm9ybWF0LgogICAgICAqIAotICAgICAqIEBwYXJhbSByYXN0ZXIgdGhlIHJhc3RlciBjb250YWluaW5nIHRoZSBzb3VyY2UgaW1hZ2UKLSAgICAgKiBAcGFyYW0gZm9yY2VBUkdCIHdoZXRoZXIgdG8gdXNlIHRoZSBkZWZhdWx0IFJHQiBjb2xvciBtb2RlbAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJ1ZmZlcmVkIGltYWdlCi0gICAgICogCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHJhc3RlciBpcyBub3QgY29tcGF0aWJsZSB3aXRoIAotICAgICAqIHRoaXMgY29sb3IgbW9kZWwKKyAgICAgKiBAcGFyYW0gcmFzdGVyCisgICAgICogICAgICAgICAgICB0aGUgcmFzdGVyIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gZm9yY2VBUkdCCisgICAgICogICAgICAgICAgICB3aGV0aGVyIHRvIHVzZSB0aGUgZGVmYXVsdCBSR0IgY29sb3IgbW9kZWwuCisgICAgICogQHJldHVybiB0aGUgYnVmZmVyZWQgaW1hZ2UuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcmFzdGVyIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyBjb2xvciBtb2RlbC4KICAgICAgKi8KLSAgICBwdWJsaWMgQnVmZmVyZWRJbWFnZSBjb252ZXJ0VG9JbnREaXNjcmV0ZShSYXN0ZXIgcmFzdGVyLAotICAgICAgICAgICAgYm9vbGVhbiBmb3JjZUFSR0IpIHsKKyAgICBwdWJsaWMgQnVmZmVyZWRJbWFnZSBjb252ZXJ0VG9JbnREaXNjcmV0ZShSYXN0ZXIgcmFzdGVyLCBib29sZWFuIGZvcmNlQVJHQikgewogCiAgICAgICAgIGlmICghaXNDb21wYXRpYmxlUmFzdGVyKHJhc3RlcikpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yNjU9VGhlIHJhc3RlciBhcmd1bWVudCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgSW5kZXhDb2xvck1vZGVsCisgICAgICAgICAgICAvLyBhd3QuMjY1PVRoZSByYXN0ZXIgYXJndW1lbnQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzCisgICAgICAgICAgICAvLyBJbmRleENvbG9yTW9kZWwKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjY1IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIApAQCAtNDkwLDggKzU1Miw3IEBACiAgICAgICAgIGlmIChmb3JjZUFSR0IgfHwgdHJhbnNwYXJlbmN5ID09IFRyYW5zcGFyZW5jeS5UUkFOU0xVQ0VOVCkgewogICAgICAgICAgICAgbW9kZWwgPSBDb2xvck1vZGVsLmdldFJHQmRlZmF1bHQoKTsKICAgICAgICAgfSBlbHNlIGlmICh0cmFuc3BhcmVuY3kgPT0gVHJhbnNwYXJlbmN5LkJJVE1BU0spIHsKLSAgICAgICAgICAgIG1vZGVsID0gbmV3IERpcmVjdENvbG9yTW9kZWwoMjUsIDB4MDBmZjAwMDAsIDB4MDAwMGZmMDAsCi0gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwZmYsIDB4MDEwMDAwMDApOworICAgICAgICAgICAgbW9kZWwgPSBuZXcgRGlyZWN0Q29sb3JNb2RlbCgyNSwgMHgwMGZmMDAwMCwgMHgwMDAwZmYwMCwgMHgwMDAwMDBmZiwgMHgwMTAwMDAwMCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtb2RlbCA9IG5ldyBEaXJlY3RDb2xvck1vZGVsKDI0LCAweDAwZmYwMDAwLCAweDAwMDBmZjAwLCAweDAwMDAwMGZmKTsKICAgICAgICAgfQpAQCAtNTEwLDcgKzU3MSw3IEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrLCBtaW5ZKyspIHsKICAgICAgICAgICAgIG9iaiA9IHJhc3Rlci5nZXREYXRhRWxlbWVudHMobWluWCwgbWluWSwgdywgMSwgb2JqKTsKICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBieXRlW10pIHsKLSAgICAgICAgICAgICAgICBieXRlIGJhW10gPSAoYnl0ZVtdKSBvYmo7CisgICAgICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSlvYmo7CiAgICAgICAgICAgICAgICAgaWYgKHBpeGVscyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIHBpeGVscyA9IG5ldyBpbnRbYmEubGVuZ3RoXTsKICAgICAgICAgICAgICAgICB9CkBAIC01MTgsNyArNTc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW2pdID0gY29sb3JNYXBbYmFbal0gJiAweGZmXTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIHNob3J0W10pIHsKLSAgICAgICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10pIG9iajsKKyAgICAgICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10pb2JqOwogICAgICAgICAgICAgICAgIGlmIChwaXhlbHMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBwaXhlbHMgPSBuZXcgaW50W3NhLmxlbmd0aF07CiAgICAgICAgICAgICAgICAgfQpAQCAtNTI3LDcgKzU4OCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIGludFtdKSB7Ci0gICAgICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10pIG9iajsKKyAgICAgICAgICAgICAgICBpbnQgaWFbXSA9IChpbnRbXSlvYmo7CiAgICAgICAgICAgICAgICAgaWYgKHBpeGVscyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIHBpeGVscyA9IG5ldyBpbnRbaWEubGVuZ3RoXTsKICAgICAgICAgICAgICAgICB9CkBAIC01NDUsNyArNjA2LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB2YWxpZCBwaXhlbHMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsaWQgcGl4ZWxzCisgICAgICogQHJldHVybiB0aGUgdmFsaWQgcGl4ZWxzLgogICAgICAqLwogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbGlkUGl4ZWxzKCkgewogICAgICAgICByZXR1cm4gdmFsaWRCaXRzOwpAQCAtNTUzLDE0ICs2MTQsMTUgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIC8vIFRoZSBvdXRwdXQgZm9ybWF0IGJhc2VkIG9uIDEuNSByZWxlYXNlIGJlaGF2aW91ci4gCisgICAgICAgIC8vIFRoZSBvdXRwdXQgZm9ybWF0IGJhc2VkIG9uIDEuNSByZWxlYXNlIGJlaGF2aW91ci4KICAgICAgICAgLy8gSXQgY291bGQgYmUgcmV2ZWxlZCBzdWNoIHdheToKLSAgICAgICAgLy8gQnVmZmVyZWRJbWFnZSBiaSA9IG5ldyBCdWZmZXJlZEltYWdlKDEsIDEsIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9CWVRFX0lOREVYRUQpOworICAgICAgICAvLyBCdWZmZXJlZEltYWdlIGJpID0gbmV3IEJ1ZmZlcmVkSW1hZ2UoMSwgMSwKKyAgICAgICAgLy8gQnVmZmVyZWRJbWFnZS5UWVBFX0JZVEVfSU5ERVhFRCk7CiAgICAgICAgIC8vIENvbG9yTW9kZWwgY20gPSBiaS5nZXRDb2xvck1vZGVsKCk7CiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihjbS50b1N0cmluZygpKTsKICAgICAgICAgU3RyaW5nIHN0ciA9ICJJbmRleENvbG9yTW9kZWw6ICNwaXhlbF9iaXRzID0gIiArIHBpeGVsX2JpdHMgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAiIG51bUNvbXBvbmVudHMgPSAiICsgbnVtQ29tcG9uZW50cyArICIgY29sb3Igc3BhY2UgPSAiICsgY3MgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICIgdHJhbnNwYXJlbmN5ID0gIjsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICIgbnVtQ29tcG9uZW50cyA9ICIgKyBudW1Db21wb25lbnRzICsgIiBjb2xvciBzcGFjZSA9ICIgKyBjcyArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICAgICAgICAgICIgdHJhbnNwYXJlbmN5ID0gIjsgLy8kTk9OLU5MUy0xJAogCiAgICAgICAgIGlmICh0cmFuc3BhcmVuY3kgPT0gVHJhbnNwYXJlbmN5Lk9QQVFVRSkgewogICAgICAgICAgICAgc3RyID0gc3RyICsgIlRyYW5zcGFyZW5jeS5PUEFRVUUiOyAvLyROT04tTkxTLTEkCkBAIC01NzEsNyArNjMzLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHN0ciA9IHN0ciArICIgdHJhbnNJbmRleCA9ICIgKyB0cmFuc3BhcmVudEluZGV4ICsgIiBoYXMgYWxwaGEgPSAiICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICBoYXNBbHBoYSArICIgaXNBbHBoYVByZSA9ICIgKyBpc0FscGhhUHJlbXVsdGlwbGllZDsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIGhhc0FscGhhICsgIiBpc0FscGhhUHJlID0gIiArIGlzQWxwaGFQcmVtdWx0aXBsaWVkOyAvLyROT04tTkxTLTEkCiAKICAgICAgICAgcmV0dXJuIHN0cjsKICAgICB9CkBAIC01ODAsMTMgKzY0MiwxMyBAQAogICAgIHB1YmxpYyBpbnRbXSBnZXRDb21wb25lbnRzKE9iamVjdCBwaXhlbCwgaW50IGNvbXBvbmVudHNbXSwgaW50IG9mZnNldCkgewogICAgICAgICBpbnQgcGl4SWR4ID0gLTE7CiAgICAgICAgIGlmIChwaXhlbCBpbnN0YW5jZW9mIGJ5dGVbXSkgewotICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSkgcGl4ZWw7CisgICAgICAgICAgICBieXRlIGJhW10gPSAoYnl0ZVtdKXBpeGVsOwogICAgICAgICAgICAgcGl4SWR4ID0gYmFbMF0gJiAweGZmOwogICAgICAgICB9IGVsc2UgaWYgKHBpeGVsIGluc3RhbmNlb2Ygc2hvcnRbXSkgewotICAgICAgICAgICAgc2hvcnQgc2FbXSA9IChzaG9ydFtdKSBwaXhlbDsKKyAgICAgICAgICAgIHNob3J0IHNhW10gPSAoc2hvcnRbXSlwaXhlbDsKICAgICAgICAgICAgIHBpeElkeCA9IHNhWzBdICYgMHhmZmZmOwogICAgICAgICB9IGVsc2UgaWYgKHBpeGVsIGluc3RhbmNlb2YgaW50W10pIHsKLSAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKSBwaXhlbDsKKyAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKXBpeGVsOwogICAgICAgICAgICAgcGl4SWR4ID0gaWFbMF07CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBhd3QuMjE5PVRoaXMgdHJhbnNmZXJUeXBlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjb2xvciBtb2RlbApAQCAtNjAwLDE0ICs2NjIsMTEgQEAKICAgICBwdWJsaWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKGludCB3LCBpbnQgaCkgewogICAgICAgICBXcml0YWJsZVJhc3RlciByYXN0ZXI7CiAgICAgICAgIGlmIChwaXhlbF9iaXRzID09IDEgfHwgcGl4ZWxfYml0cyA9PSAyIHx8IHBpeGVsX2JpdHMgPT0gNCkgewotICAgICAgICAgICAgcmFzdGVyID0gUmFzdGVyLmNyZWF0ZVBhY2tlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfQllURSwgdywgaCwgMSwKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfYml0cywgbnVsbCk7CisgICAgICAgICAgICByYXN0ZXIgPSBSYXN0ZXIuY3JlYXRlUGFja2VkUmFzdGVyKERhdGFCdWZmZXIuVFlQRV9CWVRFLCB3LCBoLCAxLCBwaXhlbF9iaXRzLCBudWxsKTsKICAgICAgICAgfSBlbHNlIGlmIChwaXhlbF9iaXRzIDw9IDgpIHsKLSAgICAgICAgICAgIHJhc3RlciA9IFJhc3Rlci5jcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfQllURSwgdywgaCwKLSAgICAgICAgICAgICAgICAgICAgMSwgbnVsbCk7CisgICAgICAgICAgICByYXN0ZXIgPSBSYXN0ZXIuY3JlYXRlSW50ZXJsZWF2ZWRSYXN0ZXIoRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIHcsIGgsIDEsIG51bGwpOwogICAgICAgICB9IGVsc2UgaWYgKHBpeGVsX2JpdHMgPD0gMTYpIHsKLSAgICAgICAgICAgIHJhc3RlciA9IFJhc3Rlci5jcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCB3LAotICAgICAgICAgICAgICAgICAgICBoLCAxLCBudWxsKTsKKyAgICAgICAgICAgIHJhc3RlciA9IFJhc3Rlci5jcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCB3LCBoLCAxLCBudWxsKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGF3dC4yNjY9VGhlIG51bWJlciBvZiBiaXRzIGluIGEgcGl4ZWwgaXMgZ3JlYXRlciB0aGFuIDE2CiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjY2IikpOyAvLyROT04tTkxTLTEkCkBAIC02MjIsOCArNjgxLDcgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghKHNtIGluc3RhbmNlb2YgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKQotICAgICAgICAgICAgICAgICYmICEoc20gaW5zdGFuY2VvZiBDb21wb25lbnRTYW1wbGVNb2RlbCkpIHsKKyAgICAgICAgaWYgKCEoc20gaW5zdGFuY2VvZiBNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpICYmICEoc20gaW5zdGFuY2VvZiBDb21wb25lbnRTYW1wbGVNb2RlbCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCkBAIC02NDAsNDggKzY5OCw0NSBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTYW1wbGVNb2RlbCBjcmVhdGVDb21wYXRpYmxlU2FtcGxlTW9kZWwoaW50IHcsIGludCBoKSB7CiAgICAgICAgIGlmIChwaXhlbF9iaXRzID09IDEgfHwgcGl4ZWxfYml0cyA9PSAyIHx8IHBpeGVsX2JpdHMgPT0gNCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwoRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIHcsIGgsCi0gICAgICAgICAgICAgICAgICAgIHBpeGVsX2JpdHMpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwoRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIHcsIGgsIHBpeGVsX2JpdHMpOwogICAgICAgICB9CiAgICAgICAgIGludCBiYW5kT2Zmc2V0c1tdID0gbmV3IGludFsxXTsKICAgICAgICAgYmFuZE9mZnNldHNbMF0gPSAwOwotICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudFNhbXBsZU1vZGVsKHRyYW5zZmVyVHlwZSwgdywgaCwgMSwgdywKLSAgICAgICAgICAgICAgICBiYW5kT2Zmc2V0cyk7CisgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50U2FtcGxlTW9kZWwodHJhbnNmZXJUeXBlLCB3LCBoLCAxLCB3LCBiYW5kT2Zmc2V0cyk7CiAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGVSYXN0ZXIoUmFzdGVyIHJhc3RlcikgewogICAgICAgICBpbnQgc2FtcGxlU2l6ZSA9IHJhc3Rlci5nZXRTYW1wbGVNb2RlbCgpLmdldFNhbXBsZVNpemUoMCk7Ci0gICAgICAgIHJldHVybiAocmFzdGVyLmdldFRyYW5zZmVyVHlwZSgpID09IHRyYW5zZmVyVHlwZSAmJgotICAgICAgICAgICAgICAgcmFzdGVyLmdldE51bUJhbmRzKCkgPT0gMSAmJiAoMSA8PCBzYW1wbGVTaXplKSA+PSBtYXBTaXplKTsKKyAgICAgICAgcmV0dXJuIChyYXN0ZXIuZ2V0VHJhbnNmZXJUeXBlKCkgPT0gdHJhbnNmZXJUeXBlICYmIHJhc3Rlci5nZXROdW1CYW5kcygpID09IDEgJiYgKDEgPDwgc2FtcGxlU2l6ZSkgPj0gbWFwU2l6ZSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXREYXRhRWxlbWVudChpbnQgY29tcG9uZW50c1tdLCBpbnQgb2Zmc2V0KSB7CiAgICAgICAgIGludCByZ2IgPSAoY29tcG9uZW50c1tvZmZzZXRdIDw8IDE2KSB8IChjb21wb25lbnRzW29mZnNldCArIDFdKSA8PCA4CiAgICAgICAgICAgICAgICAgfCBjb21wb25lbnRzW29mZnNldCArIDJdOwotICAgICAgICAKKwogICAgICAgICBpZiAoaGFzQWxwaGEpIHsKICAgICAgICAgICAgIHJnYiB8PSBjb21wb25lbnRzW29mZnNldCArIDNdIDw8IDI0OwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmdiIHw9IDB4ZmYwMDAwMDA7CiAgICAgICAgIH0KLSAKKwogICAgICAgICBpbnQgcGl4ZWw7CiAKICAgICAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10pIGdldERhdGFFbGVtZW50cyhyZ2IsIG51bGwpOwotICAgICAgICAgICAgcGl4ZWwgPSBiYVswXSAmIDB4ZmY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgc2hvcnQgc2FbXSA9IChzaG9ydFtdKSBnZXREYXRhRWxlbWVudHMocmdiLCBudWxsKTsKLSAgICAgICAgICAgIHBpeGVsID0gc2FbMF0gJiAweGZmZmY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGF3dC4yNjc9VGhlIHRyYW5zZmVyVHlwZSBpcyBpbnZhbGlkCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjY3IikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10pZ2V0RGF0YUVsZW1lbnRzKHJnYiwgbnVsbCk7CisgICAgICAgICAgICAgICAgcGl4ZWwgPSBiYVswXSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgc2hvcnQgc2FbXSA9IChzaG9ydFtdKWdldERhdGFFbGVtZW50cyhyZ2IsIG51bGwpOworICAgICAgICAgICAgICAgIHBpeGVsID0gc2FbMF0gJiAweGZmZmY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIGF3dC4yNjc9VGhlIHRyYW5zZmVyVHlwZSBpcyBpbnZhbGlkCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI2NyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHBpeGVsOwpAQCAtNjkwLDcgKzc0NSw4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgY29sb3IgbWFwLgogICAgICAqIAotICAgICAqIEBwYXJhbSByZ2IgdGhlIGRlc3RpbmF0aW9uIGFycmF5IHdoZXJlIHRoZSBjb2xvciBtYXAgaXMgd3JpdHRlbgorICAgICAqIEBwYXJhbSByZ2IKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGVyZSB0aGUgY29sb3IgbWFwIGlzIHdyaXR0ZW4uCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgZ2V0UkdCcyhpbnQgcmdiW10pIHsKICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjb2xvck1hcCwgMCwgcmdiLCAwLCBtYXBTaXplKTsKQEAgLTY5OSw0NCArNzU1LDQ4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgY29sb3IgbWFwLgogICAgICAqIAotICAgICAqIEBwYXJhbSByIHRoZSBkZXN0aW5hdGlvbiBhcnJheQorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gYXJyYXkuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgZ2V0UmVkcyhieXRlIHJbXSkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcFNpemU7IGkrKykgewotICAgICAgICAgICAgcltpXSA9IChieXRlKSAoY29sb3JNYXBbaV0gPj4gMTYpOworICAgICAgICAgICAgcltpXSA9IChieXRlKShjb2xvck1hcFtpXSA+PiAxNik7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBncmVlbiBjb21wb25lbnQgb2YgdGhlIGNvbG9yIG1hcC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZyB0aGUgZGVzdGluYXRpb24gYXJyYXkKKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGFycmF5LgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGdldEdyZWVucyhieXRlIGdbXSkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcFNpemU7IGkrKykgewotICAgICAgICAgICAgZ1tpXSA9IChieXRlKSAoY29sb3JNYXBbaV0gPj4gOCk7CisgICAgICAgICAgICBnW2ldID0gKGJ5dGUpKGNvbG9yTWFwW2ldID4+IDgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIGNvbG9yIG1hcC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYiB0aGUgZGVzdGluYXRpb24gYXJyYXkKKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGFycmF5LgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGdldEJsdWVzKGJ5dGUgYltdKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBiW2ldID0gKGJ5dGUpIGNvbG9yTWFwW2ldOworICAgICAgICAgICAgYltpXSA9IChieXRlKWNvbG9yTWFwW2ldOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYWxwaGEgY29tcG9uZW50IG9mIHRoZSBjb2xvciBtYXAuCiAgICAgICogCi0gICAgICogQHBhcmFtIGEgdGhlIGRlc3RpbmF0aW9uIGFycmF5CisgICAgICogQHBhcmFtIGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBnZXRBbHBoYXMoYnl0ZSBhW10pIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBTaXplOyBpKyspIHsKLSAgICAgICAgICAgIGFbaV0gPSAoYnl0ZSkgKGNvbG9yTWFwW2ldID4+IDI0KTsKKyAgICAgICAgICAgIGFbaV0gPSAoYnl0ZSkoY29sb3JNYXBbaV0gPj4gMjQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03NTksOSArODE5LDkgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBwaXhlbCBpcyB2YWxpZCBmb3IgdGhpcyBjb2xvciBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGl4ZWwgdGhlIHBpeGVsCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcGl4ZWwgaXMgdmFsaWQKKyAgICAgKiBAcGFyYW0gcGl4ZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBwaXhlbCBpcyB2YWxpZC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKGludCBwaXhlbCkgewogICAgICAgICBpZiAodmFsaWRCaXRzID09IG51bGwpIHsKQEAgLTgwMyw3ICs4NjMsNyBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiB0aGlzIGNvbG9yIG1vZGVsIHZhbGlkYXRlcyBwaXhlbHMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBhbGwgcGl4ZWxzIGFyZSB2YWxpZCwgb3RoZXJ3aXNlIGZhbHNlCisgICAgICogQHJldHVybiB0cnVlLCBpZiBhbGwgcGl4ZWxzIGFyZSB2YWxpZCwgb3RoZXJ3aXNlIGZhbHNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7CiAgICAgICAgIHJldHVybiAodmFsaWRCaXRzID09IG51bGwpOwpAQCAtODE4LDcgKzg3OCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgaW5kZXggdGhhdCByZXByZXNlbnRzIHRoZSB0cmFuc3BhcmVudCBwaXhlbC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCB0aGF0IHJlcHJlc2VudHMgdGhlIHRyYW5zcGFyZW50IHBpeGVsCisgICAgICogQHJldHVybiB0aGUgaW5kZXggdGhhdCByZXByZXNlbnRzIHRoZSB0cmFuc3BhcmVudCBwaXhlbC4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldFRyYW5zcGFyZW50UGl4ZWwoKSB7CiAgICAgICAgIHJldHVybiB0cmFuc3BhcmVudEluZGV4OwpAQCAtODMyLDcgKzg5Miw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1hcCBzaXplCisgICAgICogQHJldHVybiB0aGUgbWFwIHNpemUuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRNYXBTaXplKCkgewogICAgICAgICByZXR1cm4gbWFwU2l6ZTsKQEAgLTg0MSwxNSArOTAxLDIwIEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgY29sb3IgbWFwLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplCi0gICAgICogQHBhcmFtIHIgdGhlIHIKLSAgICAgKiBAcGFyYW0gZyB0aGUgZwotICAgICAqIEBwYXJhbSBiIHRoZSBiCi0gICAgICogQHBhcmFtIGEgdGhlIGEKLSAgICAgKiBAcGFyYW0gdHJhbnMgdGhlIHRyYW5zCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaXplLgorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgci4KKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIGcuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBiLgorICAgICAqIEBwYXJhbSBhCisgICAgICogICAgICAgICAgICB0aGUgYS4KKyAgICAgKiBAcGFyYW0gdHJhbnMKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFucy4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ29sb3JNYXAoaW50IHNpemUsIGJ5dGUgcltdLCBieXRlIGdbXSwgYnl0ZSBiW10sCi0gICAgICAgICAgICBieXRlIGFbXSwgaW50IHRyYW5zKSB7CisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbG9yTWFwKGludCBzaXplLCBieXRlIHJbXSwgYnl0ZSBnW10sIGJ5dGUgYltdLCBieXRlIGFbXSwgaW50IHRyYW5zKSB7CiAgICAgICAgIGlmIChzaXplIDwgMSkgewogICAgICAgICAgICAgLy8gYXd0LjI2ND1TaXplIG9mIHRoZSBjb2xvciBtYXAgaXMgbGVzcyB0aGFuIDEKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjY0IikpOyAvLyROT04tTkxTLTEkCkBAIC04NjcsOCArOTMyLDcgQEAKICAgICAgICAgaW50IGFscGhhID0gMDsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcFNpemU7IGkrKykgewotICAgICAgICAgICAgY29sb3JNYXBbaV0gPSAoKHJbaV0gJiAweGZmKSA8PCAxNikgfCAoKGdbaV0gJiAweGZmKSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgKGJbaV0gJiAweGZmKTsKKyAgICAgICAgICAgIGNvbG9yTWFwW2ldID0gKChyW2ldICYgMHhmZikgPDwgMTYpIHwgKChnW2ldICYgMHhmZikgPDwgOCkgfCAoYltpXSAmIDB4ZmYpOwogCiAgICAgICAgICAgICBpZiAodHJhbnMgPT0gaSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtOTAwLDcgKzk2NCw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgY2hlY2tpbmcsIGlmIENvbG9yIE1hcCBoYXMgR3JheSBQYWxldHRlLgorICAgICAqIFRoaXMgbWV0aG9kIGNoZWNraW5nLCBpZiBDb2xvciBNYXAgaGFzIEdyYXkgcGFsZXR0ZS4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgY2hlY2tQYWxldHRlKCkgewogICAgICAgICBncmF5UGFsZXR0ZSA9IGZhbHNlOwpAQCAtOTExLDggKzk3NSw3IEBACiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBTaXplOyBpKyspIHsKICAgICAgICAgICAgIHJnYiA9IGNvbG9yTWFwW2ldOwotICAgICAgICAgICAgaWYgKCgocmdiID4+IDE2KSAmIDB4ZmYpICE9ICgocmdiID4+IDgpICYgMHhmZikgfHwKLSAgICAgICAgICAgICAgICAgICAoKHJnYiA+PiA4KSAmIDB4ZmYpICE9IChyZ2IgJiAweGZmKSkgeworICAgICAgICAgICAgaWYgKCgocmdiID4+IDE2KSAmIDB4ZmYpICE9ICgocmdiID4+IDgpICYgMHhmZikgfHwgKChyZ2IgPj4gOCkgJiAweGZmKSAhPSAocmdiICYgMHhmZikpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTkyMiw0MCArOTg1LDM5IEBACiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0aW9uIGFuIGFycmF5IHBpeGVsIHJlcHJlc2VudGF0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xvck1hcElkeCAtIGluZGV4IGludG8gQ29sb3IgTWFwCi0gICAgICogQHBhcmFtIHBpeGVsIC0gcGl4ZWwKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIC0gYW4gYXJyYXkgcGl4ZWwgcmVwcmVzZW50YXRpb24KKyAgICAgKiBAcGFyYW0gY29sb3JNYXBJZHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBpbnRvIENvbG9yIE1hcC4KKyAgICAgKiBAcGFyYW0gcGl4ZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbAorICAgICAqIEByZXR1cm4gdGhlIHBpeGVsIHJlcHJlc2VudGF0aW9uIGFycmF5LgogICAgICAqLwogICAgIHByaXZhdGUgT2JqZWN0IGNyZWF0ZURhdGFPYmplY3QoaW50IGNvbG9yTWFwSWR4LCBPYmplY3QgcGl4ZWwpIHsKICAgICAgICAgaWYgKHBpeGVsID09IG51bGwpIHsKICAgICAgICAgICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgICAgIGJ5dGVbXSBiYSA9IG5ldyBieXRlWzFdOwotICAgICAgICAgICAgICAgIGJhWzBdID0gKGJ5dGUpIGNvbG9yTWFwSWR4OwotICAgICAgICAgICAgICAgIHBpeGVsID0gYmE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICAgICAgc2hvcnRbXSBzYSA9IG5ldyBzaG9ydFsxXTsKLSAgICAgICAgICAgICAgICBzYVswXSA9IChzaG9ydCkgY29sb3JNYXBJZHg7Ci0gICAgICAgICAgICAgICAgcGl4ZWwgPSBzYTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjI2Nz1UaGUgdHJhbnNmZXJUeXBlIGlzIGludmFsaWQKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjY3IikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJhID0gbmV3IGJ5dGVbMV07CisgICAgICAgICAgICAgICAgICAgIGJhWzBdID0gKGJ5dGUpY29sb3JNYXBJZHg7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsID0gYmE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICAgICAgc2hvcnRbXSBzYSA9IG5ldyBzaG9ydFsxXTsKKyAgICAgICAgICAgICAgICAgICAgc2FbMF0gPSAoc2hvcnQpY29sb3JNYXBJZHg7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsID0gc2E7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8vIGF3dC4yNjc9VGhlIHRyYW5zZmVyVHlwZSBpcyBpbnZhbGlkCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNjciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwaXhlbCBpbnN0YW5jZW9mIGJ5dGVbXQotICAgICAgICAgICAgICAgICYmIHRyYW5zZmVyVHlwZSA9PSBEYXRhQnVmZmVyLlRZUEVfQllURSkgewotICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSkgcGl4ZWw7Ci0gICAgICAgICAgICBiYVswXSA9IChieXRlKSBjb2xvck1hcElkeDsKKyAgICAgICAgfSBlbHNlIGlmIChwaXhlbCBpbnN0YW5jZW9mIGJ5dGVbXSAmJiB0cmFuc2ZlclR5cGUgPT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUpIHsKKyAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10pcGl4ZWw7CisgICAgICAgICAgICBiYVswXSA9IChieXRlKWNvbG9yTWFwSWR4OwogICAgICAgICAgICAgcGl4ZWwgPSBiYTsKLSAgICAgICAgfSBlbHNlIGlmIChwaXhlbCBpbnN0YW5jZW9mIHNob3J0W10mJgotICAgICAgICAgICAgICAgIHRyYW5zZmVyVHlwZSA9PSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUKSB7Ci0gICAgICAgICAgICBzaG9ydFtdIHNhID0gKHNob3J0W10pIHBpeGVsOwotICAgICAgICAgICAgc2FbMF0gPSAoc2hvcnQpIGNvbG9yTWFwSWR4OworICAgICAgICB9IGVsc2UgaWYgKHBpeGVsIGluc3RhbmNlb2Ygc2hvcnRbXSAmJiB0cmFuc2ZlclR5cGUgPT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCkgeworICAgICAgICAgICAgc2hvcnRbXSBzYSA9IChzaG9ydFtdKXBpeGVsOworICAgICAgICAgICAgc2FbMF0gPSAoc2hvcnQpY29sb3JNYXBJZHg7CiAgICAgICAgICAgICBwaXhlbCA9IHNhOwogICAgICAgICB9IGVsc2UgaWYgKHBpeGVsIGluc3RhbmNlb2YgaW50W10pIHsKLSAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKSBwaXhlbDsKKyAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKXBpeGVsOwogICAgICAgICAgICAgaWFbMF0gPSBjb2xvck1hcElkeDsKICAgICAgICAgICAgIHBpeGVsID0gaWE7CiAgICAgICAgIH0gZWxzZSB7CkBAIC05NjgsOSArMTAzMCw5IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgYml0cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGFzQWxwaGEgdGhlIGhhcyBhbHBoYQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludFtdCisgICAgICogQHBhcmFtIGhhc0FscGhhCisgICAgICogICAgICAgICAgICB0aGUgaGFzIGFscGhhLgorICAgICAqIEByZXR1cm4gdGhlIGludFtdLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGludFtdIGNyZWF0ZUJpdHMoYm9vbGVhbiBoYXNBbHBoYSkgewogCkBAIC05OTMsMjggKzEwNTUsMjYgQEAKICAgICAvKioKICAgICAgKiBWYWxpZGF0ZSB0cmFuc2ZlciB0eXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUgdGhlIHRyYW5zZmVyIHR5cGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQKKyAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlCisgICAgICogICAgICAgICAgICB0aGUgdHJhbnNmZXIgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHZhbGlkYXRlVHJhbnNmZXJUeXBlKGludCB0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgaWYgKHRyYW5zZmVyVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURSAmJgotICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9VU0hPUlQpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yNjk9VGhlIHRyYW5zZmVyVHlwZSBpcyBub3Qgb25lIG9mIERhdGFCdWZmZXIuVFlQRV9CWVRFIG9yIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQKKyAgICAgICAgaWYgKHRyYW5zZmVyVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURSAmJiB0cmFuc2ZlclR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCkgeworICAgICAgICAgICAgLy8gYXd0LjI2OT1UaGUgdHJhbnNmZXJUeXBlIGlzIG5vdCBvbmUgb2YgRGF0YUJ1ZmZlci5UWVBFX0JZVEUgb3IKKyAgICAgICAgICAgIC8vIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjY5IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRyYW5zZmVyVHlwZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgaXMgZ3JheSBwYWxsZXRlLgorICAgICAqIENoZWNrcyBpZiBpcyBncmF5IHBhbGV0dGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBpcyBncmF5IHBhbGxldGUKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGdyYXkgcGFsZXR0ZS4KICAgICAgKi8KLSAgICBib29sZWFuIGlzR3JheVBhbGxldGUoKXsKKyAgICBib29sZWFuIGlzR3JheVBhbGxldGUoKSB7CiAgICAgICAgIHJldHVybiBncmF5UGFsZXR0ZTsKICAgICB9CiAKIH0KLQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvS2VybmVsLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvS2VybmVsLmphdmEKaW5kZXggYzZmMDBlMi4uYTU5ZDI3YSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0tlcm5lbC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9LZXJuZWwuamF2YQpAQCAtMjcsMzggKzI3LDUzIEBACiAKIC8qKgogICogVGhlIEtlcm5lbCBjbGFzcyBwcm92aWRlcyBhIG1hdHJpeC4gVGhpcyBtYXRyaXggaXMgc3RvcmVkIGFzIGEgZmxvYXQgYXJyYXkKLSAqIHdoaWNoIGRlc2NyaWJlcyBob3cgYSBzcGVjaWZpZWQgcGl4ZWwgYWZmZWN0cyB0aGUgdmFsdWUgY2FsY3VsYXRlZCBmb3IgCi0gKiB0aGUgcGl4ZWwncyBwb3NpdGlvbiBpbiB0aGUgb3V0cHV0IGltYWdlIG9mIGEgZmlsdGVyaW5nIG9wZXJhdGlvbi4gCi0gKiBUaGUgWCwgWSBvcmlnaW5zIGluZGljYXRlIHRoZSBrZXJuZWwgbWF0cml4IGVsZW1lbnQgd2hpY2ggY29ycmVzcG9uZHMgdG8gCi0gKiB0aGUgcGl4ZWwgcG9zaXRpb24gZm9yIHdoaWNoIGFuIG91dHB1dCB2YWx1ZSBpcyBiZWluZyBjYWxjdWxhdGVkLgorICogd2hpY2ggZGVzY3JpYmVzIGhvdyBhIHNwZWNpZmllZCBwaXhlbCBhZmZlY3RzIHRoZSB2YWx1ZSBjYWxjdWxhdGVkIGZvciB0aGUKKyAqIHBpeGVsJ3MgcG9zaXRpb24gaW4gdGhlIG91dHB1dCBpbWFnZSBvZiBhIGZpbHRlcmluZyBvcGVyYXRpb24uIFRoZSBYLCBZCisgKiBvcmlnaW5zIGluZGljYXRlIHRoZSBrZXJuZWwgbWF0cml4IGVsZW1lbnQgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHBpeGVsCisgKiBwb3NpdGlvbiBmb3Igd2hpY2ggYW4gb3V0cHV0IHZhbHVlIGlzIGJlaW5nIGNhbGN1bGF0ZWQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgS2VybmVsIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLSAgICAKLSAgICAvKiogVGhlIHggb3JpZ2luLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHggb3JpZ2luLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgaW50IHhPcmlnaW47Ci0gICAgCi0gICAgLyoqIFRoZSB5IG9yaWdpbi4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSB5IG9yaWdpbi4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIGludCB5T3JpZ2luOwotICAgIAotICAgIC8qKiBUaGUgd2lkdGguICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgd2lkdGguCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgd2lkdGg7Ci0gICAgCi0gICAgLyoqIFRoZSBoZWlnaHQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgaGVpZ2h0LgorICAgICAqLwogICAgIHByaXZhdGUgaW50IGhlaWdodDsKLSAgICAKLSAgICAvKiogVGhlIGRhdGEuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGF0YS4KKyAgICAgKi8KICAgICBmbG9hdCBkYXRhW107CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgS2VybmVsIHdpdGggdGhlIHNwZWNpZmllZCBmbG9hdCBhcnJheS4KLSAgICAgKiBUaGUgd2lkdGgqaGVpZ2h0IGVsZW1lbnRzIG9mIHRoZSBkYXRhIGFycmF5IGFyZSBjb3BpZWQuIAorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBLZXJuZWwgd2l0aCB0aGUgc3BlY2lmaWVkIGZsb2F0IGFycmF5LiBUaGUKKyAgICAgKiB3aWR0aCpoZWlnaHQgZWxlbWVudHMgb2YgdGhlIGRhdGEgYXJyYXkgYXJlIGNvcGllZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBLZXJuZWwuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBLZXJuZWwuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgb2YgS2VybmVsLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBLZXJuZWwuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgS2VybmVsLgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBvZiBLZXJuZWwuCiAgICAgICovCiAgICAgcHVibGljIEtlcm5lbChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGZsb2F0W10gZGF0YSkgewotICAgICAgICBpbnQgZGF0YUxlbmd0aCA9IHdpZHRoKmhlaWdodDsKKyAgICAgICAgaW50IGRhdGFMZW5ndGggPSB3aWR0aCAqIGhlaWdodDsKICAgICAgICAgaWYgKGRhdGEubGVuZ3RoIDwgZGF0YUxlbmd0aCkgewogICAgICAgICAgICAgLy8gYXd0LjIyQj1MZW5ndGggb2YgZGF0YSBzaG91bGQgbm90IGJlIGxlc3MgdGhhbiB3aWR0aCpoZWlnaHQKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjJCIikpOyAvLyROT04tTkxTLTEkCkBAIC03MCw4ICs4NSw4IEBACiAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBmbG9hdFtkYXRhTGVuZ3RoXTsKICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCB0aGlzLmRhdGEsIDAsIGRhdGFMZW5ndGgpOwogCi0gICAgICAgIHhPcmlnaW4gPSAod2lkdGgtMSkvMjsKLSAgICAgICAgeU9yaWdpbiA9IChoZWlnaHQtMSkvMjsKKyAgICAgICAgeE9yaWdpbiA9ICh3aWR0aCAtIDEpIC8gMjsKKyAgICAgICAgeU9yaWdpbiA9IChoZWlnaHQgLSAxKSAvIDI7CiAgICAgfQogCiAgICAgLyoqCkBAIC05NSw4ICsxMTAsOCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGZsb2F0IGRhdGEgYXJyYXkgb2YgdGhpcyBLZXJuZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGZsb2F0IGFycmF5IHdoZXJlIHRoZSByZXN1bHRlZCBkYXRhIHdpbGwgYmUgc3RvcmVkLgotICAgICAqIAorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgYXJyYXkgd2hlcmUgdGhlIHJlc3VsdGVkIGRhdGEgd2lsbCBiZSBzdG9yZWQuCiAgICAgICogQHJldHVybiB0aGUgZmxvYXQgZGF0YSBhcnJheSBvZiB0aGlzIEtlcm5lbC4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgZmxvYXRbXSBnZXRLZXJuZWxEYXRhKGZsb2F0W10gZGF0YSkgewpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0xvb2t1cE9wLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvTG9va3VwT3AuamF2YQppbmRleCBmOWJkMmM3Li4zMzYyYzVjIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvTG9va3VwT3AuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvTG9va3VwT3AuamF2YQpAQCAtMzIsNTYgKzMyLDc2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIExvb2t1cE9wIGNsYXNzIHBlcmZvbXMgYSBsb29rdXAgb3BlcmF0aW9uIHdoaWNoIHRyYW5zZm9ybXMgYSAKLSAqIHNvdXJjZSBpbWFnZSBieSBmaWx0ZXJpbmcgZWFjaCBiYW5kIHVzaW5nIGEgdGFibGUgb2YgZGF0YS4gCi0gKiBUaGUgdGFibGUgbWF5IGNvbnRhaW4gYSBzaW5nbGUgYXJyYXkgb3IgaXQgbWF5IGNvbnRhaW4gYSAKLSAqIGRpZmZlcmVudCBkYXRhIGFycmF5IGZvciBlYWNoIGJhbmQgb2YgdGhlIGltYWdlLgorICogVGhlIExvb2t1cE9wIGNsYXNzIHBlcmZvcm1zIGEgbG9va3VwIG9wZXJhdGlvbiB3aGljaCB0cmFuc2Zvcm1zIGEgc291cmNlCisgKiBpbWFnZSBieSBmaWx0ZXJpbmcgZWFjaCBiYW5kIHVzaW5nIGEgdGFibGUgb2YgZGF0YS4gVGhlIHRhYmxlIG1heSBjb250YWluIGEKKyAqIHNpbmdsZSBhcnJheSBvciBpdCBtYXkgY29udGFpbiBhIGRpZmZlcmVudCBkYXRhIGFycmF5IGZvciBlYWNoIGJhbmQgb2YgdGhlCisgKiBpbWFnZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBMb29rdXBPcCBpbXBsZW1lbnRzIEJ1ZmZlcmVkSW1hZ2VPcCwgUmFzdGVyT3AgewotICAgIAotICAgIC8qKiBUaGUgbHV0LiAqLworCisgICAgLyoqCisgICAgICogVGhlIGx1dC4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIExvb2t1cFRhYmxlIGx1dDsKLSAgICAKLSAgICAvKiogVGhlIGhpbnRzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGhpbnRzLgorICAgICAqLwogICAgIHByaXZhdGUgUmVuZGVyaW5nSGludHMgaGludHM7Ci0gICAgCisKICAgICAvLyBUT0RPIHJlbW92ZSB3aGVuIHRoaXMgZmllbGQgaXMgdXNlZAotICAgIC8qKiBUaGUgY2FuIHVzZSBpcHAuICovCisgICAgLyoqCisgICAgICogVGhlIGNhbiB1c2UgaXBwLgorICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjYW5Vc2VJcHA7CiAKICAgICAvLyBXZSBkb24ndCBjcmVhdGUgbGV2ZWxzL3ZhbHVlcyB3aGVuIGl0IGlzIHBvc3NpYmxlIHRvIHJldXNlIG9sZAotICAgIC8qKiBUaGUgY2FjaGVkIGxldmVscy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY2FjaGVkIGxldmVscy4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBjYWNoZWRMZXZlbHNbXTsKLSAgICAKLSAgICAvKiogVGhlIGNhY2hlZCB2YWx1ZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2FjaGVkIHZhbHVlcy4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBjYWNoZWRWYWx1ZXNbXTsKKwogICAgIC8vIE51bWJlciBvZiBjaGFubmVscyBmb3Igd2hpY2ggY2FjaGUgaXMgdmFsaWQuCi0gICAgLy8gSWYgbmVnYXRpdmUgbnVtYmVyIG9mIGNoYW5uZWxzIGlzIHNhbWUgYXMgcG9zaXRpdmUgYnV0IHNraXBBbHBoYSB3YXMgc3BlY2lmaWVkCi0gICAgLyoqIFRoZSB2YWxpZCBmb3IgY2hhbm5lbHMuICovCisgICAgLy8gSWYgbmVnYXRpdmUgbnVtYmVyIG9mIGNoYW5uZWxzIGlzIHNhbWUgYXMgcG9zaXRpdmUgYnV0IHNraXBBbHBoYSB3YXMKKyAgICAvLyBzcGVjaWZpZWQKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsaWQgZm9yIGNoYW5uZWxzLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IHZhbGlkRm9yQ2hhbm5lbHM7CiAKLSAgICAvKiogVGhlIGxldmVsIGluaXRpYWxpemVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBsZXZlbCBpbml0aWFsaXplci4KKyAgICAgKi8KICAgICBzdGF0aWMgaW50IGxldmVsSW5pdGlhbGl6ZXJbXSA9IG5ldyBpbnRbMHgxMDAwMF07CiAKICAgICBzdGF0aWMgewogICAgICAgICAvLyBUT0RPCiAgICAgICAgIC8vIFN5c3RlbS5sb2FkTGlicmFyeSgiaW1hZ2VvcHMiKTsKIAotICAgICAgICBmb3IgKGludCBpPTE7IGk8PTB4MTAwMDA7IGkrKykgewotICAgICAgICAgICAgbGV2ZWxJbml0aWFsaXplcltpLTFdID0gaTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMHgxMDAwMDsgaSsrKSB7CisgICAgICAgICAgICBsZXZlbEluaXRpYWxpemVyW2kgLSAxXSA9IGk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgTG9va3VwT3Agb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZCAKLSAgICAgKiBMb29rdXBUYWJsZSBvYmplY3QgYW5kIGEgUmVuZGVyaW5nSGludHMgb2JqZWN0LgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBMb29rdXBPcCBvYmplY3QgZnJvbSB0aGUgc3BlY2lmaWVkIExvb2t1cFRhYmxlIG9iamVjdAorICAgICAqIGFuZCBhIFJlbmRlcmluZ0hpbnRzIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbG9va3VwIHRoZSBzcGVjaWZpZWQgTG9va3VwVGFibGUgb2JqZWN0LiAKLSAgICAgKiBAcGFyYW0gaGludHMgdGhlIFJlbmRlcmluZ0hpbnRzIG9iamVjdCBvciBudWxsLgorICAgICAqIEBwYXJhbSBsb29rdXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgTG9va3VwVGFibGUgb2JqZWN0LgorICAgICAqIEBwYXJhbSBoaW50cworICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmluZ0hpbnRzIG9iamVjdCBvciBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBMb29rdXBPcChMb29rdXBUYWJsZSBsb29rdXAsIFJlbmRlcmluZ0hpbnRzIGhpbnRzKSB7Ci0gICAgICAgIGlmIChsb29rdXAgPT0gbnVsbCl7CisgICAgICAgIGlmIChsb29rdXAgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjAxIiwgImxvb2t1cCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAgICAgICAgIH0KICAgICAgICAgbHV0ID0gbG9va3VwOwpAQCAtMTM2LDI3ICsxNTYsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlID0gRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGRzdENNID0gbmV3IENvbXBvbmVudENvbG9yTW9kZWwoCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RDTS5jcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdENNLmhhc0FscGhhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RDTS5pc0FscGhhUHJlbXVsdGlwbGllZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdENNLnRyYW5zcGFyZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyVHlwZQotICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgZHN0Q00gPSBuZXcgQ29tcG9uZW50Q29sb3JNb2RlbChkc3RDTS5jcywgZHN0Q00uaGFzQWxwaGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdENNLmlzQWxwaGFQcmVtdWx0aXBsaWVkLCBkc3RDTS50cmFuc3BhcmVuY3ksIHRyYW5zZmVyVHlwZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBXcml0YWJsZVJhc3RlciByID0KLSAgICAgICAgICAgICAgICBkc3RDTS5pc0NvbXBhdGlibGVTYW1wbGVNb2RlbChzcmMuZ2V0U2FtcGxlTW9kZWwoKSkgPwotICAgICAgICAgICAgICAgIHNyYy5nZXRSYXN0ZXIoKS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSkgOgotICAgICAgICAgICAgICAgIGRzdENNLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpKTsKKyAgICAgICAgV3JpdGFibGVSYXN0ZXIgciA9IGRzdENNLmlzQ29tcGF0aWJsZVNhbXBsZU1vZGVsKHNyYy5nZXRTYW1wbGVNb2RlbCgpKSA/IHNyYy5nZXRSYXN0ZXIoKQorICAgICAgICAgICAgICAgIC5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSkgOiBkc3RDTQorICAgICAgICAgICAgICAgIC5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSk7CiAKLSAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZEltYWdlKAotICAgICAgICAgICAgICAgIGRzdENNLAotICAgICAgICAgICAgICAgIHIsCi0gICAgICAgICAgICAgICAgZHN0Q00uaXNBbHBoYVByZW11bHRpcGxpZWQoKSwKLSAgICAgICAgICAgICAgICBudWxsCi0gICAgICAgICk7CisgICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRJbWFnZShkc3RDTSwgciwgZHN0Q00uaXNBbHBoYVByZW11bHRpcGxpZWQoKSwgbnVsbCk7CiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIFdyaXRhYmxlUmFzdGVyIGZpbHRlcihSYXN0ZXIgc3JjLCBXcml0YWJsZVJhc3RlciBkc3QpIHsKQEAgLTE2NiwyNSArMTc1LDI3IEBACiAgICAgICAgICAgICBpZiAoc3JjLmdldE51bUJhbmRzKCkgIT0gZHN0LmdldE51bUJhbmRzKCkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIzNyIpKTsgLy8kTk9OLU5MUy0xJCAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmMuZ2V0V2lkdGgoKSAhPSBkc3QuZ2V0V2lkdGgoKSl7CisgICAgICAgICAgICBpZiAoc3JjLmdldFdpZHRoKCkgIT0gZHN0LmdldFdpZHRoKCkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI4RiIpKTsgLy8kTk9OLU5MUy0xJCAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmMuZ2V0SGVpZ2h0KCkgIT0gZHN0LmdldEhlaWdodCgpKXsKKyAgICAgICAgICAgIGlmIChzcmMuZ2V0SGVpZ2h0KCkgIT0gZHN0LmdldEhlaWdodCgpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yOTAiKSk7IC8vJE5PTi1OTFMtMSQgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobHV0LmdldE51bUNvbXBvbmVudHMoKSAhPSAxICYmIGx1dC5nZXROdW1Db21wb25lbnRzKCkgIT0gc3JjLmdldE51bUJhbmRzKCkpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yMzg9VGhlIG51bWJlciBvZiBhcnJheXMgaW4gdGhlIExvb2t1cFRhYmxlIGRvZXMgbm90IG1lZXQgdGhlIHJlc3RyaWN0aW9ucworICAgICAgICAgICAgLy8gYXd0LjIzOD1UaGUgbnVtYmVyIG9mIGFycmF5cyBpbiB0aGUgTG9va3VwVGFibGUgZG9lcyBub3QgbWVldCB0aGUKKyAgICAgICAgICAgIC8vIHJlc3RyaWN0aW9ucwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMzgiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCiAgICAgICAgIC8vIFRPRE8KLSAgICAgICAgLy8gaWYgKCFjYW5Vc2VJcHAgfHwgaXBwRmlsdGVyKHNyYywgZHN0LCBCdWZmZXJlZEltYWdlLlRZUEVfQ1VTVE9NLCBmYWxzZSkgIT0gMCkKLSAgICAgICAgICAgIGlmIChzbG93RmlsdGVyKHNyYywgZHN0LCBmYWxzZSkgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGF3dC4yMUY9VW5hYmxlIHRvIHRyYW5zZm9ybSBzb3VyY2UKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uIChNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMUYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KKyAgICAgICAgLy8gaWYgKCFjYW5Vc2VJcHAgfHwgaXBwRmlsdGVyKHNyYywgZHN0LCBCdWZmZXJlZEltYWdlLlRZUEVfQ1VTVE9NLAorICAgICAgICAvLyBmYWxzZSkgIT0gMCkKKyAgICAgICAgaWYgKHNsb3dGaWx0ZXIoc3JjLCBkc3QsIGZhbHNlKSAhPSAwKSB7CisgICAgICAgICAgICAvLyBhd3QuMjFGPVVuYWJsZSB0byB0cmFuc2Zvcm0gc291cmNlCisgICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxRiIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGRzdDsKICAgICB9CkBAIC0yMDIsMTggKzIxMywyMCBAQAogICAgICAgICBpbnQgbkxVVENvbXBvbmVudHMgPSBsdXQuZ2V0TnVtQ29tcG9uZW50cygpOwogICAgICAgICBib29sZWFuIHNraXBBbHBoYTsKICAgICAgICAgaWYgKHNyY0NNLmhhc0FscGhhKCkpIHsKLSAgICAgICAgICAgIGlmIChuTFVUQ29tcG9uZW50cyA9PSAxIHx8IG5MVVRDb21wb25lbnRzID09IG5Db21wb25lbnRzLTEpIHsKKyAgICAgICAgICAgIGlmIChuTFVUQ29tcG9uZW50cyA9PSAxIHx8IG5MVVRDb21wb25lbnRzID09IG5Db21wb25lbnRzIC0gMSkgewogICAgICAgICAgICAgICAgIHNraXBBbHBoYSA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5MVVRDb21wb25lbnRzID09IG5Db21wb25lbnRzKSB7CiAgICAgICAgICAgICAgICAgc2tpcEFscGhhID0gZmFsc2U7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGF3dC4yMjk9TnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gdGhlIExVVCBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGJhbmRzCisgICAgICAgICAgICAgICAgLy8gYXd0LjIyOT1OdW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aGUgTFVUIGRvZXMgbm90IG1hdGNoIHRoZQorICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBiYW5kcwogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjI5IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobkxVVENvbXBvbmVudHMgPT0gMSB8fCBuTFVUQ29tcG9uZW50cyA9PSBuQ29tcG9uZW50cykgewogICAgICAgICAgICAgc2tpcEFscGhhID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjI5PU51bWJlciBvZiBjb21wb25lbnRzIGluIHRoZSBMVVQgZG9lcyBub3QgbWF0Y2ggdGhlIG51bWJlciBvZiBiYW5kcworICAgICAgICAgICAgLy8gYXd0LjIyOT1OdW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aGUgTFVUIGRvZXMgbm90IG1hdGNoIHRoZSBudW1iZXIKKyAgICAgICAgICAgIC8vIG9mIGJhbmRzCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIyOSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKQEAgLTIyMiwyMSArMjM1LDE5IEBACiAgICAgICAgICAgICBmaW5hbERzdCA9IGRzdDsKICAgICAgICAgICAgIGRzdCA9IGNyZWF0ZUNvbXBhdGlibGVEZXN0SW1hZ2Uoc3JjLCBudWxsKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChzcmMuZ2V0V2lkdGgoKSAhPSBkc3QuZ2V0V2lkdGgoKSl7CisgICAgICAgICAgICBpZiAoc3JjLmdldFdpZHRoKCkgIT0gZHN0LmdldFdpZHRoKCkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI5MSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoc3JjLmdldEhlaWdodCgpICE9IGRzdC5nZXRIZWlnaHQoKSl7CisgICAgICAgICAgICBpZiAoc3JjLmdldEhlaWdodCgpICE9IGRzdC5nZXRIZWlnaHQoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjkyIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmICghc3JjQ00uZXF1YWxzKGRzdC5nZXRDb2xvck1vZGVsKCkpKSB7CiAgICAgICAgICAgICAgICAgLy8gVHJlYXQgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IgYW5kCiAgICAgICAgICAgICAgICAgLy8gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCIGFzIHNhbWUKLSAgICAgICAgICAgICAgICBpZiAoISgoc3JjLmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQiB8fCBzcmMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKSAmJiAoZHN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCIHx8IGRzdAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpKSkgeworICAgICAgICAgICAgICAgIGlmICghKChzcmMuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCIHx8IHNyYy5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKSAmJiAoZHN0CisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCIHx8IGRzdC5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKSkpIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWxEc3QgPSBkc3Q7CiAgICAgICAgICAgICAgICAgICAgIGRzdCA9IGNyZWF0ZUNvbXBhdGlibGVEZXN0SW1hZ2Uoc3JjLCBudWxsKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yNDQsMTEgKzI1NSwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gVE9ETwotICAgICAgICAvL2lmICghY2FuVXNlSXBwIHx8IGlwcEZpbHRlcihzcmMuZ2V0UmFzdGVyKCksIGRzdC5nZXRSYXN0ZXIoKSwgc3JjLmdldFR5cGUoKSwgc2tpcEFscGhhKSAhPSAwKQotICAgICAgICAgICAgaWYgKHNsb3dGaWx0ZXIoc3JjLmdldFJhc3RlcigpLCBkc3QuZ2V0UmFzdGVyKCksIHNraXBBbHBoYSkgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGF3dC4yMUY9VW5hYmxlIHRvIHRyYW5zZm9ybSBzb3VyY2UKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uIChNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMUYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KKyAgICAgICAgLy8gaWYgKCFjYW5Vc2VJcHAgfHwgaXBwRmlsdGVyKHNyYy5nZXRSYXN0ZXIoKSwgZHN0LmdldFJhc3RlcigpLAorICAgICAgICAvLyBzcmMuZ2V0VHlwZSgpLCBza2lwQWxwaGEpICE9IDApCisgICAgICAgIGlmIChzbG93RmlsdGVyKHNyYy5nZXRSYXN0ZXIoKSwgZHN0LmdldFJhc3RlcigpLCBza2lwQWxwaGEpICE9IDApIHsKKyAgICAgICAgICAgIC8vIGF3dC4yMUY9VW5hYmxlIHRvIHRyYW5zZm9ybSBzb3VyY2UKKyAgICAgICAgICAgIHRocm93IG5ldyBJbWFnaW5nT3BFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjFGIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0KIAogICAgICAgICBpZiAoZmluYWxEc3QgIT0gbnVsbCkgewogICAgICAgICAgICAgR3JhcGhpY3MyRCBnID0gZmluYWxEc3QuY3JlYXRlR3JhcGhpY3MoKTsKQEAgLTI2NCwxMSArMjc2LDEzIEBACiAgICAgLyoqCiAgICAgICogU2xvdyBmaWx0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc3JjCi0gICAgICogQHBhcmFtIGRzdCB0aGUgZHN0Ci0gICAgICogQHBhcmFtIHNraXBBbHBoYSB0aGUgc2tpcCBhbHBoYQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludAorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIGRzdC4KKyAgICAgKiBAcGFyYW0gc2tpcEFscGhhCisgICAgICogICAgICAgICAgICB0aGUgc2tpcCBhbHBoYS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgc2xvd0ZpbHRlcihSYXN0ZXIgc3JjLCBXcml0YWJsZVJhc3RlciBkc3QsIGJvb2xlYW4gc2tpcEFscGhhKSB7CiAgICAgICAgIGludCBtaW5TcmNYID0gc3JjLmdldE1pblgoKTsKQEAgLTI4NiwzOSArMzAwLDM5IEBACiAgICAgICAgIGludFtdIHBpeGVscyA9IG51bGw7CiAgICAgICAgIGludCBvZmZzZXQgPSBsdXQuZ2V0T2Zmc2V0KCk7CiAKLSAgICAgICAgaWYgKGx1dCBpbnN0YW5jZW9mIEJ5dGVMb29rdXBUYWJsZSl7CisgICAgICAgIGlmIChsdXQgaW5zdGFuY2VvZiBCeXRlTG9va3VwVGFibGUpIHsKICAgICAgICAgICAgIGJ5dGVbXVtdIGJ5dGVEYXRhID0gKChCeXRlTG9va3VwVGFibGUpbHV0KS5nZXRUYWJsZSgpOwogICAgICAgICAgICAgcGl4ZWxzID0gc3JjLmdldFBpeGVscyhtaW5TcmNYLCBtaW5TcmNZLCBzcmNXaWR0aCwgc3JjSGVpZ2h0LCBwaXhlbHMpOwogCi0gICAgICAgICAgICBpZiAobHV0LmdldE51bUNvbXBvbmVudHMoKSAhPSAxKXsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBwaXhlbHMubGVuZ3RoOyBpKz0gbnVtQmFuZHMpewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8IG51bUJhbmRzMlByb2Nlc3M7IGIrKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNbaStiXSA9IGJ5dGVEYXRhW2JdW3BpeGVsc1tpK2JdLW9mZnNldF0gJiAweEZGOworICAgICAgICAgICAgaWYgKGx1dC5nZXROdW1Db21wb25lbnRzKCkgIT0gMSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzLmxlbmd0aDsgaSArPSBudW1CYW5kcykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8IG51bUJhbmRzMlByb2Nlc3M7IGIrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW2kgKyBiXSA9IGJ5dGVEYXRhW2JdW3BpeGVsc1tpICsgYl0gLSBvZmZzZXRdICYgMHhGRjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgcGl4ZWxzLmxlbmd0aDsgaSs9IG51bUJhbmRzKXsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBudW1CYW5kczJQcm9jZXNzOyBiKyspewotICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW2krYl0gPSBieXRlRGF0YVswXVtwaXhlbHNbaStiXS1vZmZzZXRdICYgMHhGRjsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVscy5sZW5ndGg7IGkgKz0gbnVtQmFuZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBudW1CYW5kczJQcm9jZXNzOyBiKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1tpICsgYl0gPSBieXRlRGF0YVswXVtwaXhlbHNbaSArIGJdIC0gb2Zmc2V0XSAmIDB4RkY7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGRzdC5zZXRQaXhlbHMobWluRHN0WCwgbWluRHN0WSwgc3JjV2lkdGgsIHNyY0hlaWdodCwgcGl4ZWxzKTsKLSAgICAgICAgfSBlbHNlIGlmIChsdXQgaW5zdGFuY2VvZiBTaG9ydExvb2t1cFRhYmxlKXsKLSAgICAgICAgICAgIHNob3J0W11bXSBzaG9ydERhdGEgID0gKChTaG9ydExvb2t1cFRhYmxlKWx1dCkuZ2V0VGFibGUoKTsKKyAgICAgICAgfSBlbHNlIGlmIChsdXQgaW5zdGFuY2VvZiBTaG9ydExvb2t1cFRhYmxlKSB7CisgICAgICAgICAgICBzaG9ydFtdW10gc2hvcnREYXRhID0gKChTaG9ydExvb2t1cFRhYmxlKWx1dCkuZ2V0VGFibGUoKTsKICAgICAgICAgICAgIHBpeGVscyA9IHNyYy5nZXRQaXhlbHMobWluU3JjWCwgbWluU3JjWSwgc3JjV2lkdGgsIHNyY0hlaWdodCwgcGl4ZWxzKTsKIAotICAgICAgICAgICAgaWYgKGx1dC5nZXROdW1Db21wb25lbnRzKCkgIT0gMSl7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgcGl4ZWxzLmxlbmd0aDsgaSs9IG51bUJhbmRzKXsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBudW1CYW5kczJQcm9jZXNzOyBiKyspewotICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW2krYl0gPSBzaG9ydERhdGFbYl1bcGl4ZWxzW2krYl0tb2Zmc2V0XSAmIDB4RkZGRjsKKyAgICAgICAgICAgIGlmIChsdXQuZ2V0TnVtQ29tcG9uZW50cygpICE9IDEpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVscy5sZW5ndGg7IGkgKz0gbnVtQmFuZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBudW1CYW5kczJQcm9jZXNzOyBiKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1tpICsgYl0gPSBzaG9ydERhdGFbYl1bcGl4ZWxzW2kgKyBiXSAtIG9mZnNldF0gJiAweEZGRkY7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHBpeGVscy5sZW5ndGg7IGkrPSBudW1CYW5kcyl7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgbnVtQmFuZHMyUHJvY2VzczsgYisrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1tpK2JdID0gc2hvcnREYXRhWzBdW3BpeGVsc1tpK2JdLW9mZnNldF0gJiAweEZGRkY7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHMubGVuZ3RoOyBpICs9IG51bUJhbmRzKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgbnVtQmFuZHMyUHJvY2VzczsgYisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNbaSArIGJdID0gc2hvcnREYXRhWzBdW3BpeGVsc1tpICsgYl0gLSBvZmZzZXRdICYgMHhGRkZGOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMzI4LDggKzM0Miw4IEBACiAgICAgICAgICAgICBpbnQgcGl4ZWxbXSA9IG5ldyBpbnRbc3JjLmdldE51bUJhbmRzKCldOwogICAgICAgICAgICAgaW50IG1heFkgPSBtaW5TcmNZICsgc3JjSGVpZ2h0OwogICAgICAgICAgICAgaW50IG1heFggPSBtaW5TcmNYICsgc3JjV2lkdGg7Ci0gICAgICAgICAgICBmb3IgKGludCBzcmNZPW1pblNyY1ksIGRzdFkgPSBtaW5Ec3RZOyBzcmNZIDwgbWF4WTsgc3JjWSsrLCBkc3RZKyspewotICAgICAgICAgICAgICAgIGZvciAoaW50IHNyY1g9bWluU3JjWCwgZHN0WCA9IG1pbkRzdFg7IHNyY1ggPCBtYXhYOyBzcmNYKyssIGRzdFgrKyl7CisgICAgICAgICAgICBmb3IgKGludCBzcmNZID0gbWluU3JjWSwgZHN0WSA9IG1pbkRzdFk7IHNyY1kgPCBtYXhZOyBzcmNZKyssIGRzdFkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IHNyY1ggPSBtaW5TcmNYLCBkc3RYID0gbWluRHN0WDsgc3JjWCA8IG1heFg7IHNyY1grKywgZHN0WCsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHNyYy5nZXRQaXhlbChzcmNYLCBzcmNZLCBwaXhlbCk7CiAgICAgICAgICAgICAgICAgICAgIGx1dC5sb29rdXBQaXhlbChwaXhlbCwgcGl4ZWwpOwogICAgICAgICAgICAgICAgICAgICBkc3Quc2V0UGl4ZWwoZHN0WCwgZHN0WSwgcGl4ZWwpOwpAQCAtMzQzLDE2ICszNTcsMTkgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIHRoZSBieXRlIGxldmVscy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2hhbm5lbHMgdGhlIGNoYW5uZWxzCi0gICAgICogQHBhcmFtIHNraXBBbHBoYSB0aGUgc2tpcCBhbHBoYQotICAgICAqIEBwYXJhbSBsZXZlbHMgdGhlIGxldmVscwotICAgICAqIEBwYXJhbSB2YWx1ZXMgdGhlIHZhbHVlcwotICAgICAqIEBwYXJhbSBjaGFubmVsc09yZGVyIHRoZSBjaGFubmVscyBvcmRlcgorICAgICAqIEBwYXJhbSBjaGFubmVscworICAgICAqICAgICAgICAgICAgdGhlIGNoYW5uZWxzLgorICAgICAqIEBwYXJhbSBza2lwQWxwaGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBza2lwIGFscGhhLgorICAgICAqIEBwYXJhbSBsZXZlbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbHMuCisgICAgICogQHBhcmFtIHZhbHVlcworICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlcy4KKyAgICAgKiBAcGFyYW0gY2hhbm5lbHNPcmRlcgorICAgICAqICAgICAgICAgICAgdGhlIGNoYW5uZWxzIG9yZGVyLgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVCeXRlTGV2ZWxzKAotICAgICAgICAgICAgaW50IGNoYW5uZWxzLCBib29sZWFuIHNraXBBbHBoYSwKLSAgICAgICAgICAgIGludCBsZXZlbHNbXSwgaW50IHZhbHVlc1tdLCBpbnQgY2hhbm5lbHNPcmRlcltdCi0gICAgKSB7CisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNyZWF0ZUJ5dGVMZXZlbHMoaW50IGNoYW5uZWxzLCBib29sZWFuIHNraXBBbHBoYSwgaW50IGxldmVsc1tdLAorICAgICAgICAgICAgaW50IHZhbHVlc1tdLCBpbnQgY2hhbm5lbHNPcmRlcltdKSB7CiAgICAgICAgIGJ5dGUgZGF0YVtdW10gPSAoKEJ5dGVMb29rdXBUYWJsZSlsdXQpLmdldFRhYmxlKCk7CiAgICAgICAgIGludCBuTGV2ZWxzID0gZGF0YVswXS5sZW5ndGg7CiAgICAgICAgIGludCBvZmZzZXQgPSBsdXQuZ2V0T2Zmc2V0KCk7CkBAIC0zNjAsMTggKzM3NywxOCBAQAogICAgICAgICAvLyBVc2Ugb25lIGRhdGEgYXJyYXkgZm9yIGFsbCBjaGFubmVscyBvciB1c2Ugc2V2ZXJhbCBkYXRhIGFycmF5cwogICAgICAgICBpbnQgZGF0YUluY3JlbWVudCA9IGRhdGEubGVuZ3RoID4gMSA/IDEgOiAwOwogCi0gICAgICAgIGZvciAoaW50IGNoID0gMCwgZGF0YUlkeCA9IDA7IGNoPGNoYW5uZWxzOyBkYXRhSWR4Kz1kYXRhSW5jcmVtZW50LCBjaCsrKSB7CisgICAgICAgIGZvciAoaW50IGNoID0gMCwgZGF0YUlkeCA9IDA7IGNoIDwgY2hhbm5lbHM7IGRhdGFJZHggKz0gZGF0YUluY3JlbWVudCwgY2grKykgewogICAgICAgICAgICAgaW50IGNoYW5uZWxPZmZzZXQgPSBjaGFubmVsc09yZGVyID09IG51bGwgPyBjaCA6IGNoYW5uZWxzT3JkZXJbY2hdOwogICAgICAgICAgICAgaW50IGNoYW5uZWxCYXNlID0gbkxldmVscyAqIGNoYW5uZWxPZmZzZXQ7CiAKICAgICAgICAgICAgIC8vIFNraXAgbGFzdCBjaGFubmVsIGlmIG5lZWRlZCwgemVybyB2YWx1ZXMgYXJlIE9LIC0KICAgICAgICAgICAgIC8vIG5vIGNoYW5nZXMgdG8gdGhlIGNoYW5uZWwgaW5mb3JtYXRpb24gd2lsbCBiZSBkb25lIGluIElQUAotICAgICAgICAgICAgaWYgKChjaGFubmVsT2Zmc2V0ID09IGNoYW5uZWxzLTEgJiYgc2tpcEFscGhhKSB8fCAoZGF0YUlkeCA+PSBkYXRhLmxlbmd0aCkpIHsKKyAgICAgICAgICAgIGlmICgoY2hhbm5lbE9mZnNldCA9PSBjaGFubmVscyAtIDEgJiYgc2tpcEFscGhhKSB8fCAoZGF0YUlkeCA+PSBkYXRhLmxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShsZXZlbEluaXRpYWxpemVyLCBvZmZzZXQsIGxldmVscywgY2hhbm5lbEJhc2UsIG5MZXZlbHMpOwotICAgICAgICAgICAgZm9yIChpbnQgZnJvbT0wLCB0bz1jaGFubmVsQmFzZTsgZnJvbTxuTGV2ZWxzOyBmcm9tKyssIHRvKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGZyb20gPSAwLCB0byA9IGNoYW5uZWxCYXNlOyBmcm9tIDwgbkxldmVsczsgZnJvbSsrLCB0bysrKSB7CiAgICAgICAgICAgICAgICAgdmFsdWVzW3RvXSA9IGRhdGFbZGF0YUlkeF1bZnJvbV0gJiAweEZGOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zODAsMTYgKzM5NywxOSBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgdGhlIHNob3J0IGxldmVscy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2hhbm5lbHMgdGhlIGNoYW5uZWxzCi0gICAgICogQHBhcmFtIHNraXBBbHBoYSB0aGUgc2tpcCBhbHBoYQotICAgICAqIEBwYXJhbSBsZXZlbHMgdGhlIGxldmVscwotICAgICAqIEBwYXJhbSB2YWx1ZXMgdGhlIHZhbHVlcwotICAgICAqIEBwYXJhbSBjaGFubmVsc09yZGVyIHRoZSBjaGFubmVscyBvcmRlcgorICAgICAqIEBwYXJhbSBjaGFubmVscworICAgICAqICAgICAgICAgICAgdGhlIGNoYW5uZWxzLgorICAgICAqIEBwYXJhbSBza2lwQWxwaGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBza2lwIGFscGhhLgorICAgICAqIEBwYXJhbSBsZXZlbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbHMuCisgICAgICogQHBhcmFtIHZhbHVlcworICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlcy4KKyAgICAgKiBAcGFyYW0gY2hhbm5lbHNPcmRlcgorICAgICAqICAgICAgICAgICAgdGhlIGNoYW5uZWxzIG9yZGVyLgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVTaG9ydExldmVscygKLSAgICAgICAgICAgIGludCBjaGFubmVscywgYm9vbGVhbiBza2lwQWxwaGEsCi0gICAgICAgICAgICBpbnQgbGV2ZWxzW10sIGludCB2YWx1ZXNbXSwgaW50IGNoYW5uZWxzT3JkZXJbXQotICAgICkgeworICAgIHByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVTaG9ydExldmVscyhpbnQgY2hhbm5lbHMsIGJvb2xlYW4gc2tpcEFscGhhLCBpbnQgbGV2ZWxzW10sCisgICAgICAgICAgICBpbnQgdmFsdWVzW10sIGludCBjaGFubmVsc09yZGVyW10pIHsKICAgICAgICAgc2hvcnQgZGF0YVtdW10gPSAoKFNob3J0TG9va3VwVGFibGUpbHV0KS5nZXRUYWJsZSgpOwogICAgICAgICBpbnQgbkxldmVscyA9IGRhdGFbMF0ubGVuZ3RoOwogICAgICAgICBpbnQgb2Zmc2V0ID0gbHV0LmdldE9mZnNldCgpOwpAQCAtMzk3LDE4ICs0MTcsMTggQEAKICAgICAgICAgLy8gVXNlIG9uZSBkYXRhIGFycmF5IGZvciBhbGwgY2hhbm5lbHMgb3IgdXNlIHNldmVyYWwgZGF0YSBhcnJheXMKICAgICAgICAgaW50IGRhdGFJbmNyZW1lbnQgPSBkYXRhLmxlbmd0aCA+IDEgPyAxIDogMDsKIAotICAgICAgICBmb3IgKGludCBjaCA9IDAsIGRhdGFJZHggPSAwOyBjaDxjaGFubmVsczsgZGF0YUlkeCs9ZGF0YUluY3JlbWVudCwgY2grKykgeworICAgICAgICBmb3IgKGludCBjaCA9IDAsIGRhdGFJZHggPSAwOyBjaCA8IGNoYW5uZWxzOyBkYXRhSWR4ICs9IGRhdGFJbmNyZW1lbnQsIGNoKyspIHsKICAgICAgICAgICAgIGludCBjaGFubmVsT2Zmc2V0ID0gY2hhbm5lbHNPcmRlciA9PSBudWxsID8gY2ggOiBjaGFubmVsc09yZGVyW2NoXTsKIAogICAgICAgICAgICAgLy8gU2tpcCBsYXN0IGNoYW5uZWwgaWYgbmVlZGVkLCB6ZXJvIHZhbHVlcyBhcmUgT0sgLQogICAgICAgICAgICAgLy8gbm8gY2hhbmdlcyB0byB0aGUgY2hhbm5lbCBpbmZvcm1hdGlvbiB3aWxsIGJlIGRvbmUgaW4gSVBQCi0gICAgICAgICAgICBpZiAoKGNoYW5uZWxPZmZzZXQgPT0gY2hhbm5lbHMtMSAmJiBza2lwQWxwaGEpIHx8IChkYXRhSWR4ID49IGRhdGEubGVuZ3RoKSkgeworICAgICAgICAgICAgaWYgKChjaGFubmVsT2Zmc2V0ID09IGNoYW5uZWxzIC0gMSAmJiBza2lwQWxwaGEpIHx8IChkYXRhSWR4ID49IGRhdGEubGVuZ3RoKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQgY2hhbm5lbEJhc2UgPSBuTGV2ZWxzICogY2hhbm5lbE9mZnNldDsKICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobGV2ZWxJbml0aWFsaXplciwgb2Zmc2V0LCBsZXZlbHMsIGNoYW5uZWxCYXNlLCBuTGV2ZWxzKTsKLSAgICAgICAgICAgIGZvciAoaW50IGZyb209MCwgdG89Y2hhbm5lbEJhc2U7IGZyb208bkxldmVsczsgZnJvbSsrLCB0bysrKSB7CisgICAgICAgICAgICBmb3IgKGludCBmcm9tID0gMCwgdG8gPSBjaGFubmVsQmFzZTsgZnJvbSA8IG5MZXZlbHM7IGZyb20rKywgdG8rKykgewogICAgICAgICAgICAgICAgIHZhbHVlc1t0b10gPSBkYXRhW2RhdGFJZHhdW2Zyb21dICYgMHhGRkZGOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00MTgsMTggKzQzOCwxOCBAQAogICAgIC8qKgogICAgICAqIElwcCBmaWx0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc3JjCi0gICAgICogQHBhcmFtIGRzdCB0aGUgZHN0Ci0gICAgICogQHBhcmFtIGltYWdlVHlwZSB0aGUgaW1hZ2UgdHlwZQotICAgICAqIEBwYXJhbSBza2lwQWxwaGEgdGhlIHNraXAgYWxwaGEKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQKKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgc3JjLgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3QuCisgICAgICogQHBhcmFtIGltYWdlVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIHR5cGUuCisgICAgICogQHBhcmFtIHNraXBBbHBoYQorICAgICAqICAgICAgICAgICAgdGhlIHNraXAgYWxwaGEuCisgICAgICogQHJldHVybiB0aGUgaW50LgogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgZmluYWwgaW50IGlwcEZpbHRlcigKLSAgICAgICAgICAgIFJhc3RlciBzcmMsIFdyaXRhYmxlUmFzdGVyIGRzdCwKLSAgICAgICAgICAgIGludCBpbWFnZVR5cGUsIGJvb2xlYW4gc2tpcEFscGhhCi0gICAgKSB7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaXBwRmlsdGVyKFJhc3RlciBzcmMsIFdyaXRhYmxlUmFzdGVyIGRzdCwgaW50IGltYWdlVHlwZSwgYm9vbGVhbiBza2lwQWxwaGEpIHsKICAgICAgICAgaW50IHJlczsKIAogICAgICAgICBpbnQgc3JjU3RyaWRlLCBkc3RTdHJpZGU7CkBAIC00NDIsOSArNDYyLDExIEBACiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQl9QUkU6CiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCOiB7CiAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSA0OwotICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpKjQ7Ci0gICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkqNDsKLSAgICAgICAgICAgICAgICBjaGFubmVsc09yZGVyID0gbmV3IGludFtdIHsyLCAxLCAwLCAzfTsKKyAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSBzcmMuZ2V0V2lkdGgoKSAqIDQ7CisgICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkgKiA0OworICAgICAgICAgICAgICAgIGNoYW5uZWxzT3JkZXIgPSBuZXcgaW50W10geworICAgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgMCwgMworICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTQ1Miw4ICs0NzQsOCBAQAogICAgICAgICAgICAgY2FzZSBCdWZmZXJlZEltYWdlLlRZUEVfNEJZVEVfQUJHUl9QUkU6CiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQkdSOiB7CiAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSA0OwotICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpKjQ7Ci0gICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkqNDsKKyAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSBzcmMuZ2V0V2lkdGgoKSAqIDQ7CisgICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkgKiA0OwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC00NjYsOSArNDg4LDExIEBACiAKICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFXzNCWVRFX0JHUjogewogICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gMzsKLSAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSBzcmMuZ2V0V2lkdGgoKSozOwotICAgICAgICAgICAgICAgIGRzdFN0cmlkZSA9IGRzdC5nZXRXaWR0aCgpKjM7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbHNPcmRlciA9IG5ldyBpbnRbXSB7MiwgMSwgMH07CisgICAgICAgICAgICAgICAgc3JjU3RyaWRlID0gc3JjLmdldFdpZHRoKCkgKiAzOworICAgICAgICAgICAgICAgIGRzdFN0cmlkZSA9IGRzdC5nZXRXaWR0aCgpICogMzsKKyAgICAgICAgICAgICAgICBjaGFubmVsc09yZGVyID0gbmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDIsIDEsIDAKKyAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC00ODMsMTUgKzUwNywxMSBAQAogICAgICAgICAgICAgICAgIFNhbXBsZU1vZGVsIHNyY1NNID0gc3JjLmdldFNhbXBsZU1vZGVsKCk7CiAgICAgICAgICAgICAgICAgU2FtcGxlTW9kZWwgZHN0U00gPSBkc3QuZ2V0U2FtcGxlTW9kZWwoKTsKIAotICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NNIGluc3RhbmNlb2YgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RTTSBpbnN0YW5jZW9mIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbAotICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIGlmIChzcmNTTSBpbnN0YW5jZW9mIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZHN0U00gaW5zdGFuY2VvZiBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsCi0gICAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTTS5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U00uZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURQotICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyY1NNLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkc3RTTS5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2xvd0ZpbHRlcihzcmMsIGRzdCwgc2tpcEFscGhhKTsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC01MDEsNDAgKzUyMSwzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNsb3dGaWx0ZXIoc3JjLCBkc3QsIHNraXBBbHBoYSk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSAoKENvbXBvbmVudFNhbXBsZU1vZGVsKSBzcmNTTSkuZ2V0U2NhbmxpbmVTdHJpZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gKChDb21wb25lbnRTYW1wbGVNb2RlbCkgZHN0U00pLmdldFNjYW5saW5lU3RyaWRlKCk7CisgICAgICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9ICgoQ29tcG9uZW50U2FtcGxlTW9kZWwpc3JjU00pLmdldFNjYW5saW5lU3RyaWRlKCk7CisgICAgICAgICAgICAgICAgICAgIGRzdFN0cmlkZSA9ICgoQ29tcG9uZW50U2FtcGxlTW9kZWwpZHN0U00pLmdldFNjYW5saW5lU3RyaWRlKCk7CiAKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNPcmRlciA9ICgoQ29tcG9uZW50U2FtcGxlTW9kZWwpIHNyY1NNKS5nZXRCYW5kT2Zmc2V0cygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoCi0gICAgICAgICAgICAgICAgICAgICAgICBzcmNTTSBpbnN0YW5jZW9mIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFNNIGluc3RhbmNlb2YgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbAotICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBjaGFubmVsc09yZGVyID0gKChDb21wb25lbnRTYW1wbGVNb2RlbClzcmNTTSkuZ2V0QmFuZE9mZnNldHMoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNyY1NNIGluc3RhbmNlb2YgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZHN0U00gaW5zdGFuY2VvZiBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwKLSAgICAgICAgICAgICAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBzcHBzbTEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKSBzcmNTTTsKLSAgICAgICAgICAgICAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBzcHBzbTIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKSBkc3RTTTsKKyAgICAgICAgICAgICAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBzcHBzbTEgPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbClzcmNTTTsKKyAgICAgICAgICAgICAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBzcHBzbTIgPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbClkc3RTTTsKIAogICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9IHNwcHNtMS5nZXROdW1CYW5kcygpOwogCi0gICAgICAgICAgICAgICAgICAgICAvLyBUWVBFX0lOVF9SR0IsIFRZUEVfSU5UX0FSR0IuLi4KLSAgICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcHNtMS5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9JTlQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHBzbTIuZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfSU5UIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShjaGFubmVscyA9PSAzIHx8IGNoYW5uZWxzID09IDQpCi0gICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICAvLyBUWVBFX0lOVF9SR0IsIFRZUEVfSU5UX0FSR0IuLi4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwcHNtMS5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9JTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzcHBzbTIuZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfSU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIShjaGFubmVscyA9PSAzIHx8IGNoYW5uZWxzID09IDQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2xvd0ZpbHRlcihzcmMsIGRzdCwgc2tpcEFscGhhKTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGNvbXBhdGliaWxpdHkgb2Ygc2FtcGxlIG1vZGVscwotICAgICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIUFycmF5cy5lcXVhbHMoc3Bwc20xLmdldEJpdE9mZnNldHMoKSwgc3Bwc20yLmdldEJpdE9mZnNldHMoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhQXJyYXlzLmVxdWFscyhzcHBzbTEuZ2V0Qml0TWFza3MoKSwgc3Bwc20yLmdldEJpdE1hc2tzKCkpCi0gICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoc3Bwc20xLmdldEJpdE9mZnNldHMoKSwgc3Bwc20yLmdldEJpdE9mZnNldHMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhQXJyYXlzLmVxdWFscyhzcHBzbTEuZ2V0Qml0TWFza3MoKSwgc3Bwc20yLmdldEJpdE1hc2tzKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2xvd0ZpbHRlcihzcmMsIGRzdCwgc2tpcEFscGhhKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwcHNtMS5nZXRTYW1wbGVTaXplKGkpICE9IDgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2xvd0ZpbHRlcihzcmMsIGRzdCwgc2tpcEFscGhhKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU0MiwxMSArNTU0LDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNPcmRlciA9IG5ldyBpbnRbY2hhbm5lbHNdOwogICAgICAgICAgICAgICAgICAgICBpbnQgYml0T2Zmc2V0c1tdID0gc3Bwc20xLmdldEJpdE9mZnNldHMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsc09yZGVyW2ldID0gYml0T2Zmc2V0c1tpXSAvIDg7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbHMgPT0gMykgeyAvLyBEb24ndCBza2lwIGNoYW5uZWwgbm93LCBjb3VsZCBiZSBvcHRpbWl6ZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxzID09IDMpIHsgLy8gRG9uJ3Qgc2tpcCBjaGFubmVsIG5vdywgY291bGQgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGltaXplZAogICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSA0OwogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTU1OCwxMiArNTcxLDkgQEAKIAogICAgICAgICAgICAgICAgIC8vIEZpbGwgb2Zmc2V0cyBpZiB0aGVyZSdzIGEgY2hpbGQgcmFzdGVyCiAgICAgICAgICAgICAgICAgaWYgKHNyYy5nZXRQYXJlbnQoKSAhPSBudWxsIHx8IGRzdC5nZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgIT0gMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSAhPSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpICE9IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgIT0gMAotICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSAhPSAwIHx8IHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZHN0LmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkc3QuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0cyA9IG5ldyBpbnRbNF07CiAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzWzBdID0gLXNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSArIHNyYy5nZXRNaW5YKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzWzFdID0gLXNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSArIHNyYy5nZXRNaW5ZKCk7CkBAIC01NzYsMjQgKzU4NiwyNSBAQAogCiAgICAgICAgIGludCBsZXZlbHNbXSA9IG51bGwsIHZhbHVlc1tdID0gbnVsbDsKICAgICAgICAgaW50IGNoYW5uZWxNdWx0aXBsaWVyID0gc2tpcEFscGhhID8gLTEgOiAxOwotICAgICAgICBpZiAoY2hhbm5lbE11bHRpcGxpZXIqY2hhbm5lbHMgPT0gdmFsaWRGb3JDaGFubmVscykgeyAvLyB1c2UgZXhpc3RpbmcgbGV2ZWxzL3ZhbHVlcworICAgICAgICBpZiAoY2hhbm5lbE11bHRpcGxpZXIgKiBjaGFubmVscyA9PSB2YWxpZEZvckNoYW5uZWxzKSB7IC8vIHVzZSBleGlzdGluZworICAgICAgICAgICAgLy8gbGV2ZWxzL3ZhbHVlcwogICAgICAgICAgICAgbGV2ZWxzID0gY2FjaGVkTGV2ZWxzOwogICAgICAgICAgICAgdmFsdWVzID0gY2FjaGVkVmFsdWVzOwogICAgICAgICB9IGVsc2UgeyAvLyBjcmVhdGUgbmV3IGxldmVscy92YWx1ZXMKICAgICAgICAgICAgIGlmIChsdXQgaW5zdGFuY2VvZiBCeXRlTG9va3VwVGFibGUpIHsKICAgICAgICAgICAgICAgICBieXRlIGRhdGFbXVtdID0gKChCeXRlTG9va3VwVGFibGUpbHV0KS5nZXRUYWJsZSgpOwotICAgICAgICAgICAgICAgIGxldmVscyA9IG5ldyBpbnRbY2hhbm5lbHMqZGF0YVswXS5sZW5ndGhdOwotICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBpbnRbY2hhbm5lbHMqZGF0YVswXS5sZW5ndGhdOworICAgICAgICAgICAgICAgIGxldmVscyA9IG5ldyBpbnRbY2hhbm5lbHMgKiBkYXRhWzBdLmxlbmd0aF07CisgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IGludFtjaGFubmVscyAqIGRhdGFbMF0ubGVuZ3RoXTsKICAgICAgICAgICAgICAgICBjcmVhdGVCeXRlTGV2ZWxzKGNoYW5uZWxzLCBza2lwQWxwaGEsIGxldmVscywgdmFsdWVzLCBjaGFubmVsc09yZGVyKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobHV0IGluc3RhbmNlb2YgU2hvcnRMb29rdXBUYWJsZSkgewogICAgICAgICAgICAgICAgIHNob3J0IGRhdGFbXVtdID0gKChTaG9ydExvb2t1cFRhYmxlKWx1dCkuZ2V0VGFibGUoKTsKLSAgICAgICAgICAgICAgICBsZXZlbHMgPSBuZXcgaW50W2NoYW5uZWxzKmRhdGFbMF0ubGVuZ3RoXTsKLSAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgaW50W2NoYW5uZWxzKmRhdGFbMF0ubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBsZXZlbHMgPSBuZXcgaW50W2NoYW5uZWxzICogZGF0YVswXS5sZW5ndGhdOworICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBpbnRbY2hhbm5lbHMgKiBkYXRhWzBdLmxlbmd0aF07CiAgICAgICAgICAgICAgICAgY3JlYXRlU2hvcnRMZXZlbHMoY2hhbm5lbHMsIHNraXBBbHBoYSwgbGV2ZWxzLCB2YWx1ZXMsIGNoYW5uZWxzT3JkZXIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBjYWNoZSBsZXZlbHMvdmFsdWVzCi0gICAgICAgICAgICB2YWxpZEZvckNoYW5uZWxzID0gY2hhbm5lbE11bHRpcGxpZXIqY2hhbm5lbHM7CisgICAgICAgICAgICB2YWxpZEZvckNoYW5uZWxzID0gY2hhbm5lbE11bHRpcGxpZXIgKiBjaGFubmVsczsKICAgICAgICAgICAgIGNhY2hlZExldmVscyA9IGxldmVsczsKICAgICAgICAgICAgIGNhY2hlZFZhbHVlcyA9IHZhbHVlczsKICAgICAgICAgfQpAQCAtNjA3LDEzICs2MTgsOCBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOyAvLyBVbmtub3duIGRhdGEgYnVmZmVyIHR5cGUKICAgICAgICAgfQogCi0gICAgICAgIHJlcyA9IGlwcExVVCgKLSAgICAgICAgICAgIHNyY0RhdGEsIHNyYy5nZXRXaWR0aCgpLCBzcmMuZ2V0SGVpZ2h0KCksIHNyY1N0cmlkZSwKLSAgICAgICAgICAgIGRzdERhdGEsIGRzdC5nZXRXaWR0aCgpLCBkc3QuZ2V0SGVpZ2h0KCksIGRzdFN0cmlkZSwKLSAgICAgICAgICAgIGxldmVscywgdmFsdWVzLAotICAgICAgICAgICAgY2hhbm5lbHMsIG9mZnNldHMsCi0gICAgICAgICAgICBmYWxzZQotICAgICAgICApOworICAgICAgICByZXMgPSBpcHBMVVQoc3JjRGF0YSwgc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSwgc3JjU3RyaWRlLCBkc3REYXRhLCBkc3QuZ2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICBkc3QuZ2V0SGVpZ2h0KCksIGRzdFN0cmlkZSwgbGV2ZWxzLCB2YWx1ZXMsIGNoYW5uZWxzLCBvZmZzZXRzLCBmYWxzZSk7CiAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CkBAIC02MjEsMjcgKzYyNywzNSBAQAogICAgIC8qKgogICAgICAqIElwcCBsdXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc3JjCi0gICAgICogQHBhcmFtIHNyY1dpZHRoIHRoZSBzcmMgd2lkdGgKLSAgICAgKiBAcGFyYW0gc3JjSGVpZ2h0IHRoZSBzcmMgaGVpZ2h0Ci0gICAgICogQHBhcmFtIHNyY1N0cmlkZSB0aGUgc3JjIHN0cmlkZQotICAgICAqIEBwYXJhbSBkc3QgdGhlIGRzdAotICAgICAqIEBwYXJhbSBkc3RXaWR0aCB0aGUgZHN0IHdpZHRoCi0gICAgICogQHBhcmFtIGRzdEhlaWdodCB0aGUgZHN0IGhlaWdodAotICAgICAqIEBwYXJhbSBkc3RTdHJpZGUgdGhlIGRzdCBzdHJpZGUKLSAgICAgKiBAcGFyYW0gbGV2ZWxzIHRoZSBsZXZlbHMKLSAgICAgKiBAcGFyYW0gdmFsdWVzIHRoZSB2YWx1ZXMKLSAgICAgKiBAcGFyYW0gY2hhbm5lbHMgdGhlIGNoYW5uZWxzCi0gICAgICogQHBhcmFtIG9mZnNldHMgdGhlIG9mZnNldHMKLSAgICAgKiBAcGFyYW0gbGluZWFyIHRoZSBsaW5lYXIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQKKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgc3JjLgorICAgICAqIEBwYXJhbSBzcmNXaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHNyYyB3aWR0aC4KKyAgICAgKiBAcGFyYW0gc3JjSGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgc3JjIGhlaWdodC4KKyAgICAgKiBAcGFyYW0gc3JjU3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgc3JjIHN0cmlkZS4KKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICB0aGUgZHN0LgorICAgICAqIEBwYXJhbSBkc3RXaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIGRzdCB3aWR0aC4KKyAgICAgKiBAcGFyYW0gZHN0SGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgZHN0IGhlaWdodC4KKyAgICAgKiBAcGFyYW0gZHN0U3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgZHN0IHN0cmlkZS4KKyAgICAgKiBAcGFyYW0gbGV2ZWxzCisgICAgICogICAgICAgICAgICB0aGUgbGV2ZWxzLgorICAgICAqIEBwYXJhbSB2YWx1ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZXMuCisgICAgICogQHBhcmFtIGNoYW5uZWxzCisgICAgICogICAgICAgICAgICB0aGUgY2hhbm5lbHMuCisgICAgICogQHBhcmFtIG9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXRzLgorICAgICAqIEBwYXJhbSBsaW5lYXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaW5lYXIuCisgICAgICogQHJldHVybiB0aGUgaW50LgogICAgICAqLwotICAgIGZpbmFsIHN0YXRpYyBuYXRpdmUgaW50IGlwcExVVCgKLSAgICAgICAgICAgIE9iamVjdCBzcmMsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwgaW50IHNyY1N0cmlkZSwKLSAgICAgICAgICAgIE9iamVjdCBkc3QsIGludCBkc3RXaWR0aCwgaW50IGRzdEhlaWdodCwgaW50IGRzdFN0cmlkZSwKLSAgICAgICAgICAgIGludCBsZXZlbHNbXSwgaW50IHZhbHVlc1tdLAotICAgICAgICAgICAgaW50IGNoYW5uZWxzLCBpbnQgb2Zmc2V0c1tdLAotICAgICAgICAgICAgYm9vbGVhbiBsaW5lYXIKLSAgICApOworICAgIGZpbmFsIHN0YXRpYyBuYXRpdmUgaW50IGlwcExVVChPYmplY3Qgc3JjLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsIGludCBzcmNTdHJpZGUsCisgICAgICAgICAgICBPYmplY3QgZHN0LCBpbnQgZHN0V2lkdGgsIGludCBkc3RIZWlnaHQsIGludCBkc3RTdHJpZGUsIGludCBsZXZlbHNbXSwgaW50IHZhbHVlc1tdLAorICAgICAgICAgICAgaW50IGNoYW5uZWxzLCBpbnQgb2Zmc2V0c1tdLCBib29sZWFuIGxpbmVhcik7CiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvTG9va3VwVGFibGUuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9Mb29rdXBUYWJsZS5qYXZhCmluZGV4IGQxNWYyM2MuLmU0NjVhNTQgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9Mb29rdXBUYWJsZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9Mb29rdXBUYWJsZS5qYXZhCkBAIC0yNiwyNiArMjYsMzMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGlzIGFic3RyYWN0IExvb2t1cFRhYmxlIGNsYXNzIHJlcHJlc2VudHMgbG9va3VwIHRhYmxlIHdoaWNoCi0gKiBpcyBkZWZpbmVkIHdpdGggdGhlIG51bWJlciBvZiBjb21wb25lbnRzIGFuZCBvZmZzZXQgdmFsdWUuCi0gKiBCeXRlTG9va3VwVGFibGUgYW5kIFNob3J0TG9va3VwVGFibGUgY2xhc3NlcyBhcmUgc3ViY2xhc3NlcyBvZgotICogTG9va3VwVGFibGUgd2hpY2ggY29udGFpbnMgYnl0ZSBhbmQgc2hvcnQgZGF0YSB0YWJsZXMgYXMKLSAqIGFuIGlucHV0IGFycmF5cyBmb3IgYmFuZHMgb3IgY29tcG9uZW50cyBvZiBpbWFnZS4KKyAqIFRoaXMgYWJzdHJhY3QgTG9va3VwVGFibGUgY2xhc3MgcmVwcmVzZW50cyBsb29rdXAgdGFibGUgd2hpY2ggaXMgZGVmaW5lZCB3aXRoCisgKiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgYW5kIG9mZnNldCB2YWx1ZS4gQnl0ZUxvb2t1cFRhYmxlIGFuZAorICogU2hvcnRMb29rdXBUYWJsZSBjbGFzc2VzIGFyZSBzdWJjbGFzc2VzIG9mIExvb2t1cFRhYmxlIHdoaWNoIGNvbnRhaW5zIGJ5dGUKKyAqIGFuZCBzaG9ydCBkYXRhIHRhYmxlcyBhcyBhbiBpbnB1dCBhcnJheXMgZm9yIGJhbmRzIG9yIGNvbXBvbmVudHMgb2YgaW1hZ2UuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTG9va3VwVGFibGUgewotICAgIAotICAgIC8qKiBUaGUgb2Zmc2V0LiAqLworCisgICAgLyoqCisgICAgICogVGhlIG9mZnNldC4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBvZmZzZXQ7Ci0gICAgCi0gICAgLyoqIFRoZSBudW0gY29tcG9uZW50cy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBudW0gY29tcG9uZW50cy4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBudW1Db21wb25lbnRzOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IExvb2t1cFRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBvZmZzZXQgdmFsdWUKLSAgICAgKiBhbmQgbnVtYmVyIG9mIGNvbXBvbmVudHMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IExvb2t1cFRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBvZmZzZXQgdmFsdWUgYW5kIG51bWJlcgorICAgICAqIG9mIGNvbXBvbmVudHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHZhbHVlLgotICAgICAqIEBwYXJhbSBudW1Db21wb25lbnRzIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHZhbHVlLgorICAgICAqIEBwYXJhbSBudW1Db21wb25lbnRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIExvb2t1cFRhYmxlKGludCBvZmZzZXQsIGludCBudW1Db21wb25lbnRzKSB7CiAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7CkBAIC04MCwxNCArODcsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgaW50IGFycmF5IHdoaWNoIGNvbnRhaW5zIHNhbXBsZXMgb2YgdGhlIHNwZWNpZmllZAotICAgICAqIHBpeGVsIHdoaWNoIGlzIHRyYW5zbGF0ZWQgd2l0aCB0aGUgbG9va3VwIHRhYmxlIG9mIHRoaXMgCi0gICAgICogTG9va3VwVGFibGUuIFRoZSByZXN1bHRlZCBhcnJheSBpcyBzdG9yZWQgdG8gdGhlIGRzdCBhcnJheS4KKyAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgYXJyYXkgd2hpY2ggY29udGFpbnMgc2FtcGxlcyBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsIHdoaWNoCisgICAgICogaXMgdHJhbnNsYXRlZCB3aXRoIHRoZSBsb29rdXAgdGFibGUgb2YgdGhpcyBMb29rdXBUYWJsZS4gVGhlIHJlc3VsdGVkCisgICAgICogYXJyYXkgaXMgc3RvcmVkIHRvIHRoZSBkc3QgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc291cmNlIGFycmF5LgotICAgICAqIEBwYXJhbSBkc3QgdGhlIGRlc3RpbmF0aW9uIGFycmF5IHdoZXJlIHRoZSByZXN1bHQgY2FuIGJlIHN0b3JlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQgYXJyYXkgb2YgdHJhbnNsYXRlZCBzYW1wbGVzIG9mIGEgcGl4ZWwuCisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2hlcmUgdGhlIHJlc3VsdCBjYW4gYmUgc3RvcmVkLgorICAgICAqIEByZXR1cm4gdGhlIGludGVnZXIgYXJyYXkgb2YgdHJhbnNsYXRlZCBzYW1wbGVzIG9mIGEgcGl4ZWwuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludFtdIGxvb2t1cFBpeGVsKGludFtdIHNyYywgaW50W10gZHN0KTsKIH0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9NZW1vcnlJbWFnZVNvdXJjZS5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL01lbW9yeUltYWdlU291cmNlLmphdmEKaW5kZXggOTgzZjE5ZS4uNjQ0ZmQ0MGYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9NZW1vcnlJbWFnZVNvdXJjZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9NZW1vcnlJbWFnZVNvdXJjZS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CkBAIC0yNiwxNTQgKzI3LDIxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBNZW1vcnlJbWFnZVNvdXJjZSBjbGFzcyBpcyB1c2VkIHRvIHByb2R1Y2VzIHBpeGVscyBvZiBhbiBpbWFnZSBmcm9tCi0gKiBhbiBhcnJheS4gVGhpcyBjbGFzcyBjYW4gbWFuYWdlIGEgbWVtb3J5IGltYWdlIHdoaWNoIAotICogY29udGFpbnMgYW4gYW5pbWF0aW9uIG9yIGN1c3RvbSByZW5kZXJpbmcuCisgKiBUaGUgTWVtb3J5SW1hZ2VTb3VyY2UgY2xhc3MgaXMgdXNlZCB0byBwcm9kdWNlcyBwaXhlbHMgb2YgYW4gaW1hZ2UgZnJvbSBhbgorICogYXJyYXkuIFRoaXMgY2xhc3MgY2FuIG1hbmFnZSBhIG1lbW9yeSBpbWFnZSB3aGljaCBjb250YWlucyBhbiBhbmltYXRpb24gb3IKKyAqIGN1c3RvbSByZW5kZXJpbmcuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTWVtb3J5SW1hZ2VTb3VyY2UgaW1wbGVtZW50cyBJbWFnZVByb2R1Y2VyIHsKIAotICAgIC8qKiBUaGUgd2lkdGguICovCisgICAgLyoqCisgICAgICogVGhlIHdpZHRoLgorICAgICAqLwogICAgIGludCB3aWR0aDsKLSAgICAKLSAgICAvKiogVGhlIGhlaWdodC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBoZWlnaHQuCisgICAgICovCiAgICAgaW50IGhlaWdodDsKLSAgICAKLSAgICAvKiogVGhlIGNtLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGNtLgorICAgICAqLwogICAgIENvbG9yTW9kZWwgY207Ci0gICAgCi0gICAgLyoqIFRoZSBiIGRhdGEuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgYiBkYXRhLgorICAgICAqLwogICAgIGJ5dGUgYkRhdGFbXTsKLSAgICAKLSAgICAvKiogVGhlIGkgZGF0YS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBpIGRhdGEuCisgICAgICovCiAgICAgaW50IGlEYXRhW107Ci0gICAgCi0gICAgLyoqIFRoZSBvZmZzZXQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgb2Zmc2V0LgorICAgICAqLwogICAgIGludCBvZmZzZXQ7Ci0gICAgCi0gICAgLyoqIFRoZSBzY2FubGluZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBzY2FubGluZS4KKyAgICAgKi8KICAgICBpbnQgc2NhbmxpbmU7Ci0gICAgCi0gICAgLyoqIFRoZSBwcm9wZXJ0aWVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnRpZXMuCisgICAgICovCiAgICAgSGFzaHRhYmxlPD8sID8+IHByb3BlcnRpZXM7Ci0gICAgCi0gICAgLyoqIFRoZSBjb25zdW1lcnMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uc3VtZXJzLgorICAgICAqLwogICAgIFZlY3RvcjxJbWFnZUNvbnN1bWVyPiBjb25zdW1lcnM7Ci0gICAgCi0gICAgLyoqIFRoZSBhbmltYXRlZC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBhbmltYXRlZC4KKyAgICAgKi8KICAgICBib29sZWFuIGFuaW1hdGVkOwotICAgIAotICAgIC8qKiBUaGUgZnVsbGJ1ZmZlcnMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZnVsbGJ1ZmZlcnMuCisgICAgICovCiAgICAgYm9vbGVhbiBmdWxsYnVmZmVyczsKLSAgICAKLSAgICAvKiogVGhlIGRhdGEgdHlwZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBkYXRhIHR5cGUuCisgICAgICovCiAgICAgaW50IGRhdGFUeXBlOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBEQVRBX1RZUEVfQllURS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgREFUQV9UWVBFX0JZVEUuCisgICAgICovCiAgICAgc3RhdGljIGZpbmFsIGludCBEQVRBX1RZUEVfQllURSA9IDA7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBEQVRBX1RZUEVfSU5ULiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IERBVEFfVFlQRV9JTlQuCisgICAgICovCiAgICAgc3RhdGljIGZpbmFsIGludCBEQVRBX1RZUEVfSU5UID0gMTsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBNZW1vcnlJbWFnZVNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBwYXJhbWV0ZXJzLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBNZW1vcnlJbWFnZVNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBjbSB0aGUgc3BlY2lmaWVkIENvbG9yTW9kZWwuCi0gICAgICogQHBhcmFtIHBpeCB0aGUgcGl4ZWwgYXJyYXkuCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0IGluIHRoZSBwaXhlbCBhcnJheS4KLSAgICAgKiBAcGFyYW0gc2NhbiB0aGUgZGlzdGFuY2UgZnJvbSBvbmUgcGl4ZWwncyByb3cgdG8gdGhlIG5leHQgCi0gICAgICogaW4gdGhlIHBpeGVsIGFycmF5LgotICAgICAqIEBwYXJhbSBwcm9wcyB0aGUgc2V0IG9mIHByb3BlcnRpZXMgdG8gYmUgdXNlZCBmb3IgaW1hZ2UKLSAgICAgKiBwcm9jZXNzaW5nLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gY20KKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgQ29sb3JNb2RlbC4KKyAgICAgKiBAcGFyYW0gcGl4CisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwgYXJyYXkuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgcGl4ZWwgYXJyYXkuCisgICAgICogQHBhcmFtIHNjYW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0YW5jZSBmcm9tIG9uZSBwaXhlbCdzIHJvdyB0byB0aGUgbmV4dCBpbiB0aGUgcGl4ZWwKKyAgICAgKiAgICAgICAgICAgIGFycmF5LgorICAgICAqIEBwYXJhbSBwcm9wcworICAgICAqICAgICAgICAgICAgdGhlIHNldCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHVzZWQgZm9yIGltYWdlIHByb2Nlc3NpbmcuCiAgICAgICovCi0gICAgcHVibGljIE1lbW9yeUltYWdlU291cmNlKGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBjbSwgaW50IHBpeFtdLAotICAgICAgICAgICAgaW50IG9mZiwgaW50IHNjYW4sIEhhc2h0YWJsZTw/LCA/PiBwcm9wcykgewotICAgICAgICBpbml0KHcsIGgsIGNtLCBwaXgsIG9mZiwgc2NhbiwgcHJvcHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBNZW1vcnlJbWFnZVNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBwYXJhbWV0ZXJzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGNtIHRoZSBzcGVjaWZpZWQgQ29sb3JNb2RlbC4KLSAgICAgKiBAcGFyYW0gcGl4IHRoZSBwaXhlbCBhcnJheS4KLSAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmZzZXQgaW4gdGhlIHBpeGVsIGFycmF5LgotICAgICAqIEBwYXJhbSBzY2FuIHRoZSBkaXN0YW5jZSBmcm9tIG9uZSBwaXhlbCdzIHJvdyB0byB0aGUgbmV4dCAKLSAgICAgKiBpbiB0aGUgcGl4ZWwgYXJyYXkuCi0gICAgICogQHBhcmFtIHByb3BzIHRoZSBzZXQgb2YgcHJvcGVydGllcyB0byBiZSB1c2VkIGZvciBpbWFnZQotICAgICAqIHByb2Nlc3NpbmcuCi0gICAgICovCi0gICAgcHVibGljIE1lbW9yeUltYWdlU291cmNlKGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBjbSwgYnl0ZSBwaXhbXSwKLSAgICAgICAgICAgIGludCBvZmYsIGludCBzY2FuLCBIYXNodGFibGU8PywgPz4gcHJvcHMpIHsKLSAgICAgICAgaW5pdCh3LCBoLCBjbSwgcGl4LCBvZmYsIHNjYW4sIHByb3BzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgTWVtb3J5SW1hZ2VTb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICogcGFyYW1ldGVycyBhbmQgZGVmYXVsdCBSR0IgQ29sb3JNb2RlbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBwaXggdGhlIHBpeGVsIGFycmF5LgotICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldCBpbiB0aGUgcGl4ZWwgYXJyYXkuCi0gICAgICogQHBhcmFtIHNjYW4gdGhlIGRpc3RhbmNlIGZyb20gb25lIHBpeGVsJ3Mgcm93IHRvIHRoZSBuZXh0IAotICAgICAqIGluIHRoZSBwaXhlbCBhcnJheS4KLSAgICAgKiBAcGFyYW0gcHJvcHMgdGhlIHNldCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHVzZWQgZm9yIGltYWdlCi0gICAgICogcHJvY2Vzc2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVtb3J5SW1hZ2VTb3VyY2UoaW50IHcsIGludCBoLCBpbnQgcGl4W10sIGludCBvZmYsIGludCBzY2FuLAorICAgIHB1YmxpYyBNZW1vcnlJbWFnZVNvdXJjZShpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgY20sIGludCBwaXhbXSwgaW50IG9mZiwgaW50IHNjYW4sCiAgICAgICAgICAgICBIYXNodGFibGU8PywgPz4gcHJvcHMpIHsKKyAgICAgICAgaW5pdCh3LCBoLCBjbSwgcGl4LCBvZmYsIHNjYW4sIHByb3BzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgTWVtb3J5SW1hZ2VTb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisgICAgICogCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBjbQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBDb2xvck1vZGVsLgorICAgICAqIEBwYXJhbSBwaXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbCBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBwaXhlbCBhcnJheS4KKyAgICAgKiBAcGFyYW0gc2NhbgorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIGZyb20gb25lIHBpeGVsJ3Mgcm93IHRvIHRoZSBuZXh0IGluIHRoZSBwaXhlbAorICAgICAqICAgICAgICAgICAgYXJyYXkuCisgICAgICogQHBhcmFtIHByb3BzCisgICAgICogICAgICAgICAgICB0aGUgc2V0IG9mIHByb3BlcnRpZXMgdG8gYmUgdXNlZCBmb3IgaW1hZ2UgcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtb3J5SW1hZ2VTb3VyY2UoaW50IHcsIGludCBoLCBDb2xvck1vZGVsIGNtLCBieXRlIHBpeFtdLCBpbnQgb2ZmLCBpbnQgc2NhbiwKKyAgICAgICAgICAgIEhhc2h0YWJsZTw/LCA/PiBwcm9wcykgeworICAgICAgICBpbml0KHcsIGgsIGNtLCBwaXgsIG9mZiwgc2NhbiwgcHJvcHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBNZW1vcnlJbWFnZVNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBhbmQKKyAgICAgKiBkZWZhdWx0IFJHQiBDb2xvck1vZGVsLgorICAgICAqIAorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gcGl4CisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwgYXJyYXkuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgcGl4ZWwgYXJyYXkuCisgICAgICogQHBhcmFtIHNjYW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0YW5jZSBmcm9tIG9uZSBwaXhlbCdzIHJvdyB0byB0aGUgbmV4dCBpbiB0aGUgcGl4ZWwKKyAgICAgKiAgICAgICAgICAgIGFycmF5LgorICAgICAqIEBwYXJhbSBwcm9wcworICAgICAqICAgICAgICAgICAgdGhlIHNldCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHVzZWQgZm9yIGltYWdlIHByb2Nlc3NpbmcuCisgICAgICovCisgICAgcHVibGljIE1lbW9yeUltYWdlU291cmNlKGludCB3LCBpbnQgaCwgaW50IHBpeFtdLCBpbnQgb2ZmLCBpbnQgc2NhbiwgSGFzaHRhYmxlPD8sID8+IHByb3BzKSB7CiAgICAgICAgIGluaXQodywgaCwgQ29sb3JNb2RlbC5nZXRSR0JkZWZhdWx0KCksIHBpeCwgb2ZmLCBzY2FuLCBwcm9wcyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IE1lbW9yeUltYWdlU291cmNlIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIHBhcmFtZXRlcnMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IE1lbW9yeUltYWdlU291cmNlIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGNtIHRoZSBzcGVjaWZpZWQgQ29sb3JNb2RlbC4KLSAgICAgKiBAcGFyYW0gcGl4IHRoZSBwaXhlbCBhcnJheS4KLSAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmZzZXQgaW4gdGhlIHBpeGVsIGFycmF5LgotICAgICAqIEBwYXJhbSBzY2FuIHRoZSBkaXN0YW5jZSBmcm9tIG9uZSBwaXhlbCdzIHJvdyB0byB0aGUgbmV4dCAKLSAgICAgKiBpbiB0aGUgcGl4ZWwgYXJyYXkuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBjbQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBDb2xvck1vZGVsLgorICAgICAqIEBwYXJhbSBwaXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbCBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBwaXhlbCBhcnJheS4KKyAgICAgKiBAcGFyYW0gc2NhbgorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIGZyb20gb25lIHBpeGVsJ3Mgcm93IHRvIHRoZSBuZXh0IGluIHRoZSBwaXhlbAorICAgICAqICAgICAgICAgICAgYXJyYXkuCiAgICAgICovCi0gICAgcHVibGljIE1lbW9yeUltYWdlU291cmNlKGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBjbSwgaW50IHBpeFtdLAotICAgICAgICAgICAgaW50IG9mZiwgaW50IHNjYW4pIHsKKyAgICBwdWJsaWMgTWVtb3J5SW1hZ2VTb3VyY2UoaW50IHcsIGludCBoLCBDb2xvck1vZGVsIGNtLCBpbnQgcGl4W10sIGludCBvZmYsIGludCBzY2FuKSB7CiAgICAgICAgIGluaXQodywgaCwgY20sIHBpeCwgb2ZmLCBzY2FuLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgTWVtb3J5SW1hZ2VTb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICogcGFyYW1ldGVycy4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgTWVtb3J5SW1hZ2VTb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gY20gdGhlIHNwZWNpZmllZCBDb2xvck1vZGVsLgotICAgICAqIEBwYXJhbSBwaXggdGhlIHBpeGVsIGFycmF5LgotICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldCBpbiB0aGUgcGl4ZWwgYXJyYXkuCi0gICAgICogQHBhcmFtIHNjYW4gdGhlIGRpc3RhbmNlIGZyb20gb25lIHBpeGVsJ3Mgcm93IHRvIHRoZSBuZXh0IAotICAgICAqIGluIHRoZSBwaXhlbCBhcnJheS4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGNtCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIENvbG9yTW9kZWwuCisgICAgICogQHBhcmFtIHBpeAorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsIGFycmF5LgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIHBpeGVsIGFycmF5LgorICAgICAqIEBwYXJhbSBzY2FuCisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgZnJvbSBvbmUgcGl4ZWwncyByb3cgdG8gdGhlIG5leHQgaW4gdGhlIHBpeGVsCisgICAgICogICAgICAgICAgICBhcnJheS4KICAgICAgKi8KLSAgICBwdWJsaWMgTWVtb3J5SW1hZ2VTb3VyY2UoaW50IHcsIGludCBoLCBDb2xvck1vZGVsIGNtLCBieXRlIHBpeFtdLAotICAgICAgICAgICAgaW50IG9mZiwgaW50IHNjYW4pIHsKKyAgICBwdWJsaWMgTWVtb3J5SW1hZ2VTb3VyY2UoaW50IHcsIGludCBoLCBDb2xvck1vZGVsIGNtLCBieXRlIHBpeFtdLCBpbnQgb2ZmLCBpbnQgc2NhbikgewogICAgICAgICBpbml0KHcsIGgsIGNtLCBwaXgsIG9mZiwgc2NhbiwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IE1lbW9yeUltYWdlU291cmNlIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIHBhcmFtZXRlcnMgYW5kIGRlZmF1bHQgUkdCIENvbG9yTW9kZWwuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IE1lbW9yeUltYWdlU291cmNlIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGFuZAorICAgICAqIGRlZmF1bHQgUkdCIENvbG9yTW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gcGl4IHRoZSBwaXhlbHMgYXJyYXkuCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0IGluIHRoZSBwaXhlbCBhcnJheS4KLSAgICAgKiBAcGFyYW0gc2NhbiB0aGUgZGlzdGFuY2UgZnJvbSBvbmUgcGl4ZWwncyByb3cgdG8gdGhlIG5leHQgCi0gICAgICogaW4gdGhlIHBpeGVsIGFycmF5LgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gcGl4CisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWxzIGFycmF5LgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIHBpeGVsIGFycmF5LgorICAgICAqIEBwYXJhbSBzY2FuCisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgZnJvbSBvbmUgcGl4ZWwncyByb3cgdG8gdGhlIG5leHQgaW4gdGhlIHBpeGVsCisgICAgICogICAgICAgICAgICBhcnJheS4KICAgICAgKi8KICAgICBwdWJsaWMgTWVtb3J5SW1hZ2VTb3VyY2UoaW50IHcsIGludCBoLCBpbnQgcGl4W10sIGludCBvZmYsIGludCBzY2FuKSB7CiAgICAgICAgIGluaXQodywgaCwgQ29sb3JNb2RlbC5nZXRSR0JkZWZhdWx0KCksIHBpeCwgb2ZmLCBzY2FuLCBudWxsKTsKQEAgLTE4NCwyNSArMjQyLDI1IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3RhcnRQcm9kdWN0aW9uKEltYWdlQ29uc3VtZXIgaWMpIHsKLSAgICAgICAgaWYoIWlzQ29uc3VtZXIoaWMpICYmIGljICE9IG51bGwpIHsKKyAgICAgICAgaWYgKCFpc0NvbnN1bWVyKGljKSAmJiBpYyAhPSBudWxsKSB7CiAgICAgICAgICAgICBjb25zdW1lcnMuYWRkRWxlbWVudChpYyk7CiAgICAgICAgIH0KLSAgICAgICAgdHJ5eworICAgICAgICB0cnkgewogICAgICAgICAgICAgc2V0SGVhZGVyKGljKTsKICAgICAgICAgICAgIHNldFBpeGVscyhpYywgMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICBpZihhbmltYXRlZCl7CisgICAgICAgICAgICBpZiAoYW5pbWF0ZWQpIHsKICAgICAgICAgICAgICAgICBpYy5pbWFnZUNvbXBsZXRlKEltYWdlQ29uc3VtZXIuU0lOR0xFRlJBTUVET05FKTsKLSAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpYy5pbWFnZUNvbXBsZXRlKEltYWdlQ29uc3VtZXIuU1RBVElDSU1BR0VET05FKTsKLSAgICAgICAgICAgICAgICBpZihpc0NvbnN1bWVyKGljKSkgeworICAgICAgICAgICAgICAgIGlmIChpc0NvbnN1bWVyKGljKSkgewogICAgICAgICAgICAgICAgICAgICByZW1vdmVDb25zdW1lcihpYyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgaWYoaXNDb25zdW1lcihpYykpIHsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChpc0NvbnN1bWVyKGljKSkgewogICAgICAgICAgICAgICAgIGljLmltYWdlQ29tcGxldGUoSW1hZ2VDb25zdW1lci5JTUFHRUVSUk9SKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGlzQ29uc3VtZXIoaWMpKSB7CisgICAgICAgICAgICBpZiAoaXNDb25zdW1lcihpYykpIHsKICAgICAgICAgICAgICAgICByZW1vdmVDb25zdW1lcihpYyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIxNiwyNiArMjc0LDI5IEBACiAgICAgfQogCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENvbnN1bWVyKEltYWdlQ29uc3VtZXIgaWMpIHsKLSAgICAgICAgaWYoaWMgPT0gbnVsbCB8fCBjb25zdW1lcnMuY29udGFpbnMoaWMpKSB7CisgICAgICAgIGlmIChpYyA9PSBudWxsIHx8IGNvbnN1bWVycy5jb250YWlucyhpYykpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBjb25zdW1lcnMuYWRkRWxlbWVudChpYyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVwbGFjZXMgdGhlIHBpeGVsIGRhdGEgd2l0aCBhIG5ldyBwaXhlbCBhcnJheSBmb3IgaG9sZGluZyAKLSAgICAgKiB0aGUgcGl4ZWxzIGZvciB0aGlzIGltYWdlLiBJZiBhbiBhbmltYXRpb24gCi0gICAgICogZmxhZyBpcyBzZXQgdG8gdHJ1ZSB2YWx1ZSBieSB0aGUgc2V0QW5pbWF0ZWQoKSBtZXRob2QsIAotICAgICAqIHRoZSBuZXcgcGl4ZWxzIHdpbGwgYmUgaW1tZWRpYXRlbHkgZGVsaXZlcmVkIHRvIHRoZSBJbWFnZUNvbnN1bWVycy4gCisgICAgICogUmVwbGFjZXMgdGhlIHBpeGVsIGRhdGEgd2l0aCBhIG5ldyBwaXhlbCBhcnJheSBmb3IgaG9sZGluZyB0aGUgcGl4ZWxzIGZvcgorICAgICAqIHRoaXMgaW1hZ2UuIElmIGFuIGFuaW1hdGlvbiBmbGFnIGlzIHNldCB0byB0cnVlIHZhbHVlIGJ5IHRoZQorICAgICAqIHNldEFuaW1hdGVkKCkgbWV0aG9kLCB0aGUgbmV3IHBpeGVscyB3aWxsIGJlIGltbWVkaWF0ZWx5IGRlbGl2ZXJlZCB0byB0aGUKKyAgICAgKiBJbWFnZUNvbnN1bWVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3cGl4IHRoZSBuZXcgcGl4ZWwgYXJyYXkuCi0gICAgICogQHBhcmFtIG5ld21vZGVsIHRoZSBuZXcgQ29sb3JNb2RlbC4KLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW4gdGhlIGFycmF5LgotICAgICAqIEBwYXJhbSBzY2Fuc2l6ZSB0aGUgZGlzdGFuY2UgZnJvbSBvbmUgcm93IG9mIHBpeGVscyB0byB0aGUgbmV4dCByb3cKLSAgICAgKiBpbiB0aGUgcGl4ZWwgYXJyYXkKKyAgICAgKiBAcGFyYW0gbmV3cGl4CisgICAgICogICAgICAgICAgICB0aGUgbmV3IHBpeGVsIGFycmF5LgorICAgICAqIEBwYXJhbSBuZXdtb2RlbAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBDb2xvck1vZGVsLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIGFycmF5LgorICAgICAqIEBwYXJhbSBzY2Fuc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIGZyb20gb25lIHJvdyBvZiBwaXhlbHMgdG8gdGhlIG5leHQgcm93IGluIHRoZQorICAgICAqICAgICAgICAgICAgcGl4ZWwgYXJyYXkuCiAgICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG5ld1BpeGVscyhpbnQgbmV3cGl4W10sIENvbG9yTW9kZWwgbmV3bW9kZWwsCi0gICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgc2NhbnNpemUpIHsKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbmV3UGl4ZWxzKGludCBuZXdwaXhbXSwgQ29sb3JNb2RlbCBuZXdtb2RlbCwgaW50IG9mZnNldCwgaW50IHNjYW5zaXplKSB7CiAgICAgICAgIHRoaXMuZGF0YVR5cGUgPSBEQVRBX1RZUEVfSU5UOwogICAgICAgICB0aGlzLmlEYXRhID0gbmV3cGl4OwogICAgICAgICB0aGlzLmNtID0gbmV3bW9kZWw7CkBAIC0yNDUsMTkgKzMwNiwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcGxhY2VzIHRoZSBwaXhlbCBkYXRhIHdpdGggYSBuZXcgcGl4ZWwgYXJyYXkgZm9yIGhvbGRpbmcgCi0gICAgICogdGhlIHBpeGVscyBmb3IgdGhpcyBpbWFnZS4gSWYgYW4gYW5pbWF0aW9uIAotICAgICAqIGZsYWcgaXMgc2V0IHRvIHRydWUgdmFsdWUgYnkgdGhlIHNldEFuaW1hdGVkKCkgbWV0aG9kLCAKLSAgICAgKiB0aGUgbmV3IHBpeGVscyB3aWxsIGJlIGltbWVkaWF0ZWx5IGRlbGl2ZXJlZCB0byB0aGUgSW1hZ2VDb25zdW1lcnMuIAorICAgICAqIFJlcGxhY2VzIHRoZSBwaXhlbCBkYXRhIHdpdGggYSBuZXcgcGl4ZWwgYXJyYXkgZm9yIGhvbGRpbmcgdGhlIHBpeGVscyBmb3IKKyAgICAgKiB0aGlzIGltYWdlLiBJZiBhbiBhbmltYXRpb24gZmxhZyBpcyBzZXQgdG8gdHJ1ZSB2YWx1ZSBieSB0aGUKKyAgICAgKiBzZXRBbmltYXRlZCgpIG1ldGhvZCwgdGhlIG5ldyBwaXhlbHMgd2lsbCBiZSBpbW1lZGlhdGVseSBkZWxpdmVyZWQgdG8gdGhlCisgICAgICogSW1hZ2VDb25zdW1lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5ld3BpeCB0aGUgbmV3IHBpeGVsIGFycmF5LgotICAgICAqIEBwYXJhbSBuZXdtb2RlbCB0aGUgbmV3IENvbG9yTW9kZWwuCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGluIHRoZSBhcnJheS4KLSAgICAgKiBAcGFyYW0gc2NhbnNpemUgdGhlIGRpc3RhbmNlIGZyb20gb25lIHJvdyBvZiBwaXhlbHMgdG8gdGhlIG5leHQgcm93Ci0gICAgICogaW4gdGhlIHBpeGVsIGFycmF5CisgICAgICogQHBhcmFtIG5ld3BpeAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBwaXhlbCBhcnJheS4KKyAgICAgKiBAcGFyYW0gbmV3bW9kZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgQ29sb3JNb2RlbC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gc2NhbnNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0YW5jZSBmcm9tIG9uZSByb3cgb2YgcGl4ZWxzIHRvIHRoZSBuZXh0IHJvdyBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBpeGVsIGFycmF5LgogICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBuZXdQaXhlbHMoYnl0ZSBuZXdwaXhbXSwgQ29sb3JNb2RlbCBuZXdtb2RlbCwKLSAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBzY2Fuc2l6ZSkgeworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBuZXdQaXhlbHMoYnl0ZSBuZXdwaXhbXSwgQ29sb3JNb2RlbCBuZXdtb2RlbCwgaW50IG9mZnNldCwgaW50IHNjYW5zaXplKSB7CiAgICAgICAgIHRoaXMuZGF0YVR5cGUgPSBEQVRBX1RZUEVfQllURTsKICAgICAgICAgdGhpcy5iRGF0YSA9IG5ld3BpeDsKICAgICAgICAgdGhpcy5jbSA9IG5ld21vZGVsOwpAQCAtMjY3LDMzICszMzEsMzMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmdWxsIGJ1ZmZlciB1cGRhdGVzIGZsYWcgdG8gdHJ1ZS4gSWYgdGhpcyBpcyBhbiAKLSAgICAgKiBhbmltYXRlZCBpbWFnZSwgdGhlIGltYWdlIGNvbnN1bWVycyBoaW50cyBhcmUgdXBkYXRlZAotICAgICAqIGFjY29yZGluZ2x5LgorICAgICAqIFNldHMgdGhlIGZ1bGwgYnVmZmVyIHVwZGF0ZXMgZmxhZyB0byB0cnVlLiBJZiB0aGlzIGlzIGFuIGFuaW1hdGVkIGltYWdlLAorICAgICAqIHRoZSBpbWFnZSBjb25zdW1lcnMgaGludHMgYXJlIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZ1bGxidWZmZXJzIHRoZSB0cnVlIGlmIHRoZSBwaXhlbCBidWZmZXIgc2hvdWxkIGJlIHNlbnQgYWx3YXlzLgorICAgICAqIEBwYXJhbSBmdWxsYnVmZmVycworICAgICAqICAgICAgICAgICAgdGhlIHRydWUgaWYgdGhlIHBpeGVsIGJ1ZmZlciBzaG91bGQgYmUgc2VudCBhbHdheXMuCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEZ1bGxCdWZmZXJVcGRhdGVzKGJvb2xlYW4gZnVsbGJ1ZmZlcnMpIHsKLSAgICAgICAgaWYodGhpcy5mdWxsYnVmZmVycyA9PSBmdWxsYnVmZmVycykgeworICAgICAgICBpZiAodGhpcy5mdWxsYnVmZmVycyA9PSBmdWxsYnVmZmVycykgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIHRoaXMuZnVsbGJ1ZmZlcnMgPSBmdWxsYnVmZmVyczsKLSAgICAgICAgaWYoYW5pbWF0ZWQpeworICAgICAgICBpZiAoYW5pbWF0ZWQpIHsKICAgICAgICAgICAgIE9iamVjdCBjb25zQXJbXSA9IGNvbnN1bWVycy50b0FycmF5KCk7CiAgICAgICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogY29uc0FyKSB7CiAgICAgICAgICAgICAgICAgSW1hZ2VDb25zdW1lciBjb24gPSAoSW1hZ2VDb25zdW1lcillbGVtZW50OwotICAgICAgICAgICAgICAgIHRyeXsKLSAgICAgICAgICAgICAgICAgICAgaWYoZnVsbGJ1ZmZlcnMpewotICAgICAgICAgICAgICAgICAgICAgICAgY29uLnNldEhpbnRzKEltYWdlQ29uc3VtZXIuVE9QRE9XTkxFRlRSSUdIVCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlQ29uc3VtZXIuQ09NUExFVEVTQ0FOTElORVMpOwotICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbGJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbi5zZXRIaW50cyhJbWFnZUNvbnN1bWVyLlRPUERPV05MRUZUUklHSFQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbWFnZUNvbnN1bWVyLkNPTVBMRVRFU0NBTkxJTkVTKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbi5zZXRIaW50cyhJbWFnZUNvbnN1bWVyLlJBTkRPTVBJWEVMT1JERVIpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgICAgICAgICAgaWYoaXNDb25zdW1lcihjb24pKSB7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29uc3VtZXIoY29uKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29uLmltYWdlQ29tcGxldGUoSW1hZ2VDb25zdW1lci5JTUFHRUVSUk9SKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihpc0NvbnN1bWVyKGNvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29uc3VtZXIoY29uKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ29uc3VtZXIoY29uKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTMwMiwyNyArMzY2LDI4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmxhZyB0aGF0IHRlbGxzIHdoZXRoZXIgdGhpcyBtZW1vcnkgaW1hZ2UgaGFzIG1vcmUgCi0gICAgICogdGhhbiBvbmUgZnJhbWUgKGZvciBhbmltYXRpb24pOiB0cnVlIGZvciBtdWx0aXBsZSBmcmFtZXMsCi0gICAgICogZmFsc2UgaWYgdGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc2luZ2xlIGZyYW1lIGltYWdlLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gYW5pbWF0ZWQgd2hldGhlciB0aGlzIGltYWdlIHJlcHJlc2VudHMgYW4gYW5pbWF0aW9uLgorICAgICAqIFNldHMgdGhlIGZsYWcgdGhhdCB0ZWxscyB3aGV0aGVyIHRoaXMgbWVtb3J5IGltYWdlIGhhcyBtb3JlIHRoYW4gb25lCisgICAgICogZnJhbWUgKGZvciBhbmltYXRpb24pOiB0cnVlIGZvciBtdWx0aXBsZSBmcmFtZXMsIGZhbHNlIGlmIHRoaXMgY2xhc3MKKyAgICAgKiByZXByZXNlbnRzIGEgc2luZ2xlIGZyYW1lIGltYWdlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhbmltYXRlZAorICAgICAqICAgICAgICAgICAgd2hldGhlciB0aGlzIGltYWdlIHJlcHJlc2VudHMgYW4gYW5pbWF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBbmltYXRlZChib29sZWFuIGFuaW1hdGVkKSB7Ci0gICAgICAgIGlmKHRoaXMuYW5pbWF0ZWQgPT0gYW5pbWF0ZWQpIHsKKyAgICAgICAgaWYgKHRoaXMuYW5pbWF0ZWQgPT0gYW5pbWF0ZWQpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBPYmplY3QgY29uc0FyW10gPSBjb25zdW1lcnMudG9BcnJheSgpOwogICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogY29uc0FyKSB7CiAgICAgICAgICAgICBJbWFnZUNvbnN1bWVyIGNvbiA9IChJbWFnZUNvbnN1bWVyKWVsZW1lbnQ7Ci0gICAgICAgICAgICB0cnl7CisgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGNvbi5pbWFnZUNvbXBsZXRlKEltYWdlQ29uc3VtZXIuU1RBVElDSU1BR0VET05FKTsKLSAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgaWYoaXNDb25zdW1lcihjb24pKSB7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChpc0NvbnN1bWVyKGNvbikpIHsKICAgICAgICAgICAgICAgICAgICAgY29uLmltYWdlQ29tcGxldGUoSW1hZ2VDb25zdW1lci5JTUFHRUVSUk9SKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihpc0NvbnN1bWVyKGNvbikpeworICAgICAgICAgICAgaWYgKGlzQ29uc3VtZXIoY29uKSkgewogICAgICAgICAgICAgICAgIHJlbW92ZUNvbnN1bWVyKGNvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTMzMCw2MCArMzk1LDYzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VuZHMgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mIHRoZSBidWZmZXIgdG8gCi0gICAgICogSW1hZ2VDb25zdW1lcnMgYW5kIG5vdGlmaWVzIHRoZW0gdGhhdCBhbiBhbmltYXRpb24gZnJhbWUgCi0gICAgICogaXMgY29tcGxldGVkIG9ubHkgaWYgZnJhbWVub3RpZnkgcGFyYW1ldGVyIGlzIHRydWUuCi0gICAgICogVGhhdCB3b3JrcyBvbmx5IGlmIHRoZSBhbmltYXRlZCBmbGFnIGhhcyBiZWVuIHNldCB0byB0cnVlIAotICAgICAqIGJ5IHRoZSBzZXRBbmltYXRlZCgpIG1ldGhvZC4gSWYgdGhlIGZ1bGwgYnVmZmVyIHVwZGF0ZSBmbGFnIAotICAgICAqIGhhcyBiZWVuIHNldCB0byB0cnVlIGJ5IHRoZSBzZXRGdWxsQnVmZmVyVXBkYXRlcygpIG1ldGhvZCwgCi0gICAgICogdGhlbiB0aGUgZW50aXJlIGJ1ZmZlciB3aWxsIGFsd2F5cyBiZSBzZW50IGlnbm9yaW5nIHBhcmFtZXRlcnMuCisgICAgICogU2VuZHMgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mIHRoZSBidWZmZXIgdG8gSW1hZ2VDb25zdW1lcnMgYW5kCisgICAgICogbm90aWZpZXMgdGhlbSB0aGF0IGFuIGFuaW1hdGlvbiBmcmFtZSBpcyBjb21wbGV0ZWQgb25seSBpZiB0aGUge0Bjb2RlCisgICAgICogZnJhbWVub3RpZnl9IHBhcmFtZXRlciBpcyB0cnVlLiBUaGF0IHdvcmtzIG9ubHkgaWYgdGhlIGFuaW1hdGVkIGZsYWcgaGFzCisgICAgICogYmVlbiBzZXQgdG8gdHJ1ZSBieSB0aGUgc2V0QW5pbWF0ZWQoKSBtZXRob2QuIElmIHRoZSBmdWxsIGJ1ZmZlciB1cGRhdGUKKyAgICAgKiBmbGFnIGhhcyBiZWVuIHNldCB0byB0cnVlIGJ5IHRoZSBzZXRGdWxsQnVmZmVyVXBkYXRlcygpIG1ldGhvZCwgdGhlbiB0aGUKKyAgICAgKiBlbnRpcmUgYnVmZmVyIHdpbGwgYWx3YXlzIGJlIHNlbnQgaWdub3JpbmcgcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgcnRoZSBlY3Rhbmd1bGFyIGFyZWEuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEuIAotICAgICAqIEBwYXJhbSBmcmFtZW5vdGlmeSB0cnVlIGlmIGEgU0lOR0xFRlJBTUVET05FIG5vdGlmaWNhdGlvbgotICAgICAqIHNob3VsZCBiZSBzZW50IHRvIHRoZSByZWdpc3RlcmVkIGNvbnN1bWVycywgZmFsc2Ugb3RoZXJ3aXNlLiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSBmcmFtZW5vdGlmeQorICAgICAqICAgICAgICAgICAgdHJ1ZSBpZiBhIFNJTkdMRUZSQU1FRE9ORSBub3RpZmljYXRpb24gc2hvdWxkIGJlIHNlbnQgdG8gdGhlCisgICAgICogICAgICAgICAgICByZWdpc3RlcmVkIGNvbnN1bWVycywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBuZXdQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCi0gICAgICAgICAgICBib29sZWFuIGZyYW1lbm90aWZ5KSB7Ci0gICAgICAgIGlmKGFuaW1hdGVkKXsKLSAgICAgICAgICAgIGlmKGZ1bGxidWZmZXJzKXsKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbmV3UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBib29sZWFuIGZyYW1lbm90aWZ5KSB7CisgICAgICAgIGlmIChhbmltYXRlZCkgeworICAgICAgICAgICAgaWYgKGZ1bGxidWZmZXJzKSB7CiAgICAgICAgICAgICAgICAgeCA9IDA7CiAgICAgICAgICAgICAgICAgeSA9IDA7CiAgICAgICAgICAgICAgICAgdyA9IHdpZHRoOwogICAgICAgICAgICAgICAgIGggPSBoZWlnaHQ7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBpZih4IDwgMCl7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh4IDwgMCkgewogICAgICAgICAgICAgICAgICAgICB3ICs9IHg7CiAgICAgICAgICAgICAgICAgICAgIHggPSAwOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZih3ID4gd2lkdGgpIHsKKyAgICAgICAgICAgICAgICBpZiAodyA+IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgIHcgPSB3aWR0aCAtIHg7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHkgPCAwKXsKKyAgICAgICAgICAgICAgICBpZiAoeSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgaCArPSB5OwogICAgICAgICAgICAgICAgICAgICB5ID0gMDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihoID4gaGVpZ2h0KSB7CisgICAgICAgICAgICBpZiAoaCA+IGhlaWdodCkgewogICAgICAgICAgICAgICAgIGggPSBoZWlnaHQgLSB5OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgT2JqZWN0IGNvbnNBcltdID0gY29uc3VtZXJzLnRvQXJyYXkoKTsKICAgICAgICAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiBjb25zQXIpIHsKICAgICAgICAgICAgICAgICBJbWFnZUNvbnN1bWVyIGNvbiA9IChJbWFnZUNvbnN1bWVyKWVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgdHJ5ewotICAgICAgICAgICAgICAgICAgICBpZih3ID4gMCAmJiBoID4gMCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3ID4gMCAmJiBoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGl4ZWxzKGNvbiwgeCwgeSwgdywgaCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWVub3RpZnkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lbm90aWZ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb24uaW1hZ2VDb21wbGV0ZShJbWFnZUNvbnN1bWVyLlNJTkdMRUZSQU1FRE9ORSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGV4KXsKLSAgICAgICAgICAgICAgICAgICAgaWYoaXNDb25zdW1lcihjb24pKSB7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbnN1bWVyKGNvbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbi5pbWFnZUNvbXBsZXRlKEltYWdlQ29uc3VtZXIuSU1BR0VFUlJPUik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoaXNDb25zdW1lcihjb24pKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbnN1bWVyKGNvbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNvbnN1bWVyKGNvbik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0zOTIsMjYgKzQ2MCwyOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNlbmRzIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZiB0aGUgYnVmZmVyIHRvIAotICAgICAqIHRoZSBJbWFnZUNvbnN1bWVycyBhbmQgbm90aWZpZXMgdGhlbSB0aGF0IGFuIGFuaW1hdGlvbiBmcmFtZSAKLSAgICAgKiBpcyBjb21wbGV0ZWQgaWYgdGhlIGFuaW1hdGVkIGZsYWcgaGFzIGJlZW4gc2V0IHRvIHRydWUgCi0gICAgICogYnkgdGhlIHNldEFuaW1hdGVkKCkgbWV0aG9kLiBJZiB0aGUgZnVsbCBidWZmZXIgdXBkYXRlIGZsYWcgCi0gICAgICogaGFzIGJlZW4gc2V0IHRvIHRydWUgYnkgdGhlIHNldEZ1bGxCdWZmZXJVcGRhdGVzKCkgbWV0aG9kLCAKKyAgICAgKiBTZW5kcyB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YgdGhlIGJ1ZmZlciB0byB0aGUgSW1hZ2VDb25zdW1lcnMKKyAgICAgKiBhbmQgbm90aWZpZXMgdGhlbSB0aGF0IGFuIGFuaW1hdGlvbiBmcmFtZSBpcyBjb21wbGV0ZWQgaWYgdGhlIGFuaW1hdGVkCisgICAgICogZmxhZyBoYXMgYmVlbiBzZXQgdG8gdHJ1ZSBieSB0aGUgc2V0QW5pbWF0ZWQoKSBtZXRob2QuIElmIHRoZSBmdWxsIGJ1ZmZlcgorICAgICAqIHVwZGF0ZSBmbGFnIGhhcyBiZWVuIHNldCB0byB0cnVlIGJ5IHRoZSBzZXRGdWxsQnVmZmVyVXBkYXRlcygpIG1ldGhvZCwKICAgICAgKiB0aGVuIHRoZSBlbnRpcmUgYnVmZmVyIHdpbGwgYWx3YXlzIGJlIHNlbnQgaWdub3JpbmcgcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEuIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEuCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG5ld1BpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkgewogICAgICAgICBuZXdQaXhlbHMoeCwgeSwgdywgaCwgdHJ1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VuZHMgYSBuZXcgYnVmZmVyIG9mIHBpeGVscyB0byB0aGUgSW1hZ2VDb25zdW1lcnMgCi0gICAgICogYW5kIG5vdGlmaWVzIHRoZW0gdGhhdCBhbiBhbmltYXRpb24gZnJhbWUgaXMgY29tcGxldGVkIGlmCi0gICAgICogdGhlIGFuaW1hdGVkIGZsYWcgaGFzIGJlZW4gc2V0IHRvIHRydWUgYnkgdGhlIHNldEFuaW1hdGVkKCkgbWV0aG9kLiAKKyAgICAgKiBTZW5kcyBhIG5ldyBidWZmZXIgb2YgcGl4ZWxzIHRvIHRoZSBJbWFnZUNvbnN1bWVycyBhbmQgbm90aWZpZXMgdGhlbSB0aGF0CisgICAgICogYW4gYW5pbWF0aW9uIGZyYW1lIGlzIGNvbXBsZXRlZCBpZiB0aGUgYW5pbWF0ZWQgZmxhZyBoYXMgYmVlbiBzZXQgdG8gdHJ1ZQorICAgICAqIGJ5IHRoZSBzZXRBbmltYXRlZCgpIG1ldGhvZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBuZXdQaXhlbHMoKSB7CiAgICAgICAgIG5ld1BpeGVscygwLCAwLCB3aWR0aCwgaGVpZ2h0LCB0cnVlKTsKQEAgLTQyMCwxNiArNDkxLDIzIEBACiAgICAgLyoqCiAgICAgICogSW5pdHMgdGhlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGgKLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQKLSAgICAgKiBAcGFyYW0gbW9kZWwgdGhlIG1vZGVsCi0gICAgICogQHBhcmFtIHBpeGVscyB0aGUgcGl4ZWxzCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2ZmCi0gICAgICogQHBhcmFtIHNjYW4gdGhlIHNjYW4KLSAgICAgKiBAcGFyYW0gcHJvcCB0aGUgcHJvcAorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQuCisgICAgICogQHBhcmFtIG1vZGVsCisgICAgICogICAgICAgICAgICB0aGUgbW9kZWwuCisgICAgICogQHBhcmFtIHBpeGVscworICAgICAqICAgICAgICAgICAgdGhlIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2ZmLgorICAgICAqIEBwYXJhbSBzY2FuCisgICAgICogICAgICAgICAgICB0aGUgc2Nhbi4KKyAgICAgKiBAcGFyYW0gcHJvcAorICAgICAqICAgICAgICAgICAgdGhlIHByb3AuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBDb2xvck1vZGVsIG1vZGVsLCBieXRlIHBpeGVsc1tdLAotICAgICAgICAgICAgaW50IG9mZiwgaW50IHNjYW4sIEhhc2h0YWJsZTw/LCA/PiBwcm9wKXsKKyAgICBwcml2YXRlIHZvaWQgaW5pdChpbnQgd2lkdGgsIGludCBoZWlnaHQsIENvbG9yTW9kZWwgbW9kZWwsIGJ5dGUgcGl4ZWxzW10sIGludCBvZmYsIGludCBzY2FuLAorICAgICAgICAgICAgSGFzaHRhYmxlPD8sID8+IHByb3ApIHsKIAogICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7CiAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OwpAQCAtNDQ2LDE2ICs1MjQsMjMgQEAKICAgICAvKioKICAgICAgKiBJbml0cyB0aGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aAotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodAotICAgICAqIEBwYXJhbSBtb2RlbCB0aGUgbW9kZWwKLSAgICAgKiBAcGFyYW0gcGl4ZWxzIHRoZSBwaXhlbHMKLSAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmYKLSAgICAgKiBAcGFyYW0gc2NhbiB0aGUgc2NhbgotICAgICAqIEBwYXJhbSBwcm9wIHRoZSBwcm9wCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGguCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodC4KKyAgICAgKiBAcGFyYW0gbW9kZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBtb2RlbC4KKyAgICAgKiBAcGFyYW0gcGl4ZWxzCisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmYuCisgICAgICogQHBhcmFtIHNjYW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2FuLgorICAgICAqIEBwYXJhbSBwcm9wCisgICAgICogICAgICAgICAgICB0aGUgcHJvcC4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdChpbnQgd2lkdGgsIGludCBoZWlnaHQsIENvbG9yTW9kZWwgbW9kZWwsIGludCBwaXhlbHNbXSwKLSAgICAgICAgICAgIGludCBvZmYsIGludCBzY2FuLCBIYXNodGFibGU8PywgPz4gcHJvcCl7CisgICAgcHJpdmF0ZSB2b2lkIGluaXQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBDb2xvck1vZGVsIG1vZGVsLCBpbnQgcGl4ZWxzW10sIGludCBvZmYsIGludCBzY2FuLAorICAgICAgICAgICAgSGFzaHRhYmxlPD8sID8+IHByb3ApIHsKIAogICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7CiAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OwpAQCAtNDcxLDQyICs1NTYsNDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBwaXhlbHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbiB0aGUgY29uCi0gICAgICogQHBhcmFtIHggdGhlIHgKLSAgICAgKiBAcGFyYW0geSB0aGUgeQotICAgICAqIEBwYXJhbSB3IHRoZSB3Ci0gICAgICogQHBhcmFtIGggdGhlIGgKKyAgICAgKiBAcGFyYW0gY29uCisgICAgICogICAgICAgICAgICB0aGUgY29uLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3LgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaC4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0UGl4ZWxzKEltYWdlQ29uc3VtZXIgY29uLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCl7CisgICAgcHJpdmF0ZSB2b2lkIHNldFBpeGVscyhJbWFnZUNvbnN1bWVyIGNvbiwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpIHsKICAgICAgICAgaW50IHBpeGVsT2ZmID0gc2NhbmxpbmUgKiB5ICsgb2Zmc2V0ICsgeDsKIAotICAgICAgICBzd2l0Y2goZGF0YVR5cGUpewotICAgICAgICBjYXNlIERBVEFfVFlQRV9CWVRFOgotICAgICAgICAgICAgY29uLnNldFBpeGVscyh4LCB5LCB3LCBoLCBjbSwgYkRhdGEsIHBpeGVsT2ZmLCBzY2FubGluZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEQVRBX1RZUEVfSU5UOgotICAgICAgICAgICAgY29uLnNldFBpeGVscyh4LCB5LCB3LCBoLCBjbSwgaURhdGEsIHBpeGVsT2ZmLCBzY2FubGluZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGF3dC4yMkE9V3JvbmcgdHlwZSBvZiBwaXhlbHMgYXJyYXkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjJBIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgIHN3aXRjaCAoZGF0YVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgREFUQV9UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgY29uLnNldFBpeGVscyh4LCB5LCB3LCBoLCBjbSwgYkRhdGEsIHBpeGVsT2ZmLCBzY2FubGluZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERBVEFfVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgY29uLnNldFBpeGVscyh4LCB5LCB3LCBoLCBjbSwgaURhdGEsIHBpeGVsT2ZmLCBzY2FubGluZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIGF3dC4yMkE9V3JvbmcgdHlwZSBvZiBwaXhlbHMgYXJyYXkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIyQSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgaGVhZGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb24gdGhlIG5ldyBoZWFkZXIKKyAgICAgKiBAcGFyYW0gY29uCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGhlYWRlci4KICAgICAgKi8KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldEhlYWRlcihJbWFnZUNvbnN1bWVyIGNvbil7CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRIZWFkZXIoSW1hZ2VDb25zdW1lciBjb24pIHsKICAgICAgICAgY29uLnNldERpbWVuc2lvbnMod2lkdGgsIGhlaWdodCk7CiAgICAgICAgIGNvbi5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwogICAgICAgICBjb24uc2V0Q29sb3JNb2RlbChjbSk7Ci0gICAgICAgIGNvbi5zZXRIaW50cyhhbmltYXRlZCA/IChmdWxsYnVmZmVycyA/IChJbWFnZUNvbnN1bWVyLlRPUERPV05MRUZUUklHSFQgfAotICAgICAgICAgICAgICAgIEltYWdlQ29uc3VtZXIuQ09NUExFVEVTQ0FOTElORVMpIDogSW1hZ2VDb25zdW1lci5SQU5ET01QSVhFTE9SREVSKSA6Ci0gICAgICAgICAgICAgICAgKEltYWdlQ29uc3VtZXIuVE9QRE9XTkxFRlRSSUdIVCB8IEltYWdlQ29uc3VtZXIuQ09NUExFVEVTQ0FOTElORVMgfAotICAgICAgICAgICAgICAgICBJbWFnZUNvbnN1bWVyLlNJTkdMRVBBU1MgfCBJbWFnZUNvbnN1bWVyLlNJTkdMRUZSQU1FKSk7CisgICAgICAgIGNvbgorICAgICAgICAgICAgICAgIC5zZXRIaW50cyhhbmltYXRlZCA/IChmdWxsYnVmZmVycyA/IChJbWFnZUNvbnN1bWVyLlRPUERPV05MRUZUUklHSFQgfCBJbWFnZUNvbnN1bWVyLkNPTVBMRVRFU0NBTkxJTkVTKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBJbWFnZUNvbnN1bWVyLlJBTkRPTVBJWEVMT1JERVIpCisgICAgICAgICAgICAgICAgICAgICAgICA6IChJbWFnZUNvbnN1bWVyLlRPUERPV05MRUZUUklHSFQgfCBJbWFnZUNvbnN1bWVyLkNPTVBMRVRFU0NBTkxJTkVTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSW1hZ2VDb25zdW1lci5TSU5HTEVQQVNTIHwgSW1hZ2VDb25zdW1lci5TSU5HTEVGUkFNRSkpOwogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsLmphdmEKaW5kZXggZGQ0NGI0OS4uM2RjMTNkOCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL011bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9NdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwuamF2YQpAQCAtMTgsNzIgKzE4LDkzIEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgY2xhc3MgcmVwcmVzZW50cyBpbWFnZSBkYXRhIHdpdGggb25lCi0gKiBiYW5kLiBUaGlzIGNsYXNzIHBhY2tzIG11bHRpcGxlIHBpeGVscyB3aXRoIG9uZSBzYW1wbGUgaW4gb25lIGRhdGEgCi0gKiBlbGVtZW50IGFuZCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGRhdGEgdHlwZXM6IERhdGFCdWZmZXIuVFlQRV9CWVRFLCAKLSAqIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIG9yIERhdGFCdWZmZXIuVFlQRV9JTlQuIAorICogVGhlIE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBjbGFzcyByZXByZXNlbnRzIGltYWdlIGRhdGEgd2l0aCBvbmUgYmFuZC4KKyAqIFRoaXMgY2xhc3MgcGFja3MgbXVsdGlwbGUgcGl4ZWxzIHdpdGggb25lIHNhbXBsZSBpbiBvbmUgZGF0YSBlbGVtZW50IGFuZAorICogc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBkYXRhIHR5cGVzOiBEYXRhQnVmZmVyLlRZUEVfQllURSwKKyAqIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIG9yIERhdGFCdWZmZXIuVFlQRV9JTlQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIGV4dGVuZHMgU2FtcGxlTW9kZWwgewogCi0gICAgLyoqIFRoZSBwaXhlbCBiaXQgc3RyaWRlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBwaXhlbCBiaXQgc3RyaWRlLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IHBpeGVsQml0U3RyaWRlOwogCi0gICAgLyoqIFRoZSBzY2FubGluZSBzdHJpZGUuICovCisgICAgLyoqCisgICAgICogVGhlIHNjYW5saW5lIHN0cmlkZS4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBzY2FubGluZVN0cmlkZTsKIAotICAgIC8qKiBUaGUgZGF0YSBiaXQgb2Zmc2V0LiAqLworICAgIC8qKgorICAgICAqIFRoZSBkYXRhIGJpdCBvZmZzZXQuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgZGF0YUJpdE9mZnNldDsKIAotICAgIC8qKiBUaGUgYml0IG1hc2suICovCisgICAgLyoqCisgICAgICogVGhlIGJpdCBtYXNrLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IGJpdE1hc2s7CiAKLSAgICAvKiogVGhlIGRhdGEgZWxlbWVudCBzaXplLiAqLworICAgIC8qKgorICAgICAqIFRoZSBkYXRhIGVsZW1lbnQgc2l6ZS4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBkYXRhRWxlbWVudFNpemU7CiAKLSAgICAvKiogVGhlIHBpeGVscyBwZXIgZGF0YSBlbGVtZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBwaXhlbHMgcGVyIGRhdGEgZWxlbWVudC4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBwaXhlbHNQZXJEYXRhRWxlbWVudDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkCiAgICAgICogcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGRhdGEgdHlwZSBvZiB0aGUgc2FtcGxlcy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gbnVtYmVyT2ZCaXRzIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwuCi0gICAgICogQHBhcmFtIHNjYW5saW5lU3RyaWRlIHRoZSBzY2FubGluZSBzdHJpZGUgb2YgdGhlIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBkYXRhQml0T2Zmc2V0IHRoZSBhcnJheSBvZiB0aGUgYmFuZCBvZmZzZXRzLgorICAgICAqIEBwYXJhbSBkYXRhVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHlwZSBvZiB0aGUgc2FtcGxlcy4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBudW1iZXJPZkJpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwuCisgICAgICogQHBhcmFtIHNjYW5saW5lU3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgc2NhbmxpbmUgc3RyaWRlIG9mIHRoZSBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gZGF0YUJpdE9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHRoZSBiYW5kIG9mZnNldHMuCiAgICAgICovCi0gICAgcHVibGljIE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbChpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgIGludCBudW1iZXJPZkJpdHMsIGludCBzY2FubGluZVN0cmlkZSwgaW50IGRhdGFCaXRPZmZzZXQpIHsKKyAgICBwdWJsaWMgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLCBpbnQgbnVtYmVyT2ZCaXRzLAorICAgICAgICAgICAgaW50IHNjYW5saW5lU3RyaWRlLCBpbnQgZGF0YUJpdE9mZnNldCkgewogCiAgICAgICAgIHN1cGVyKGRhdGFUeXBlLCB3LCBoLCAxKTsKLSAgICAgICAgaWYgKGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFICYmCi0gICAgICAgICAgICAgICBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUICYmCi0gICAgICAgICAgICAgICBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfSU5UKSB7CisgICAgICAgIGlmIChkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURSAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUCisgICAgICAgICAgICAgICAgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVCkgewogICAgICAgICAgICAgLy8gYXd0LjYxPVVuc3VwcG9ydGVkIGRhdGEgdHlwZTogezB9CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYxIiwgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZSkpOwogICAgICAgICB9CiAKICAgICAgICAgdGhpcy5zY2FubGluZVN0cmlkZSA9IHNjYW5saW5lU3RyaWRlOwotICAgICAgICBpZihudW1iZXJPZkJpdHMgPT0gMCkgeworICAgICAgICBpZiAobnVtYmVyT2ZCaXRzID09IDApIHsKICAgICAgICAgICAgIC8vIGF3dC4yMEM9TnVtYmVyIG9mIEJpdHMgZXF1YWxzIHRvIHplcm8KICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjBDIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgdGhpcy5waXhlbEJpdFN0cmlkZSA9IG51bWJlck9mQml0czsKICAgICAgICAgdGhpcy5kYXRhRWxlbWVudFNpemUgPSBEYXRhQnVmZmVyLmdldERhdGFUeXBlU2l6ZShkYXRhVHlwZSk7Ci0gICAgICAgIGlmKGRhdGFFbGVtZW50U2l6ZSAlIHBpeGVsQml0U3RyaWRlICE9IDApIHsKLSAgICAgICAgICAgIC8vIGF3dC4yMEQ9VGhlIG51bWJlciBvZiBiaXRzIHBlciBwaXhlbCBpcyBub3QgYSBwb3dlciBvZiAyIG9yIHBpeGVscyBzcGFuIGRhdGEgZWxlbWVudCBib3VuZGFyaWVzCisgICAgICAgIGlmIChkYXRhRWxlbWVudFNpemUgJSBwaXhlbEJpdFN0cmlkZSAhPSAwKSB7CisgICAgICAgICAgICAvLyBhd3QuMjBEPVRoZSBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwgaXMgbm90IGEgcG93ZXIgb2YgMiBvcgorICAgICAgICAgICAgLy8gcGl4ZWxzIHNwYW4gZGF0YSBlbGVtZW50IGJvdW5kYXJpZXMKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjBEIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZihkYXRhQml0T2Zmc2V0ICUgbnVtYmVyT2ZCaXRzICE9IDApIHsKKyAgICAgICAgaWYgKGRhdGFCaXRPZmZzZXQgJSBudW1iZXJPZkJpdHMgIT0gMCkgewogICAgICAgICAgICAgLy8gYXd0LjIwRT1EYXRhIEJpdCBvZmZzZXQgaXMgbm90IGEgbXVsdGlwbGUgb2YgcGl4ZWwgYml0IHN0cmlkZQogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMEUiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQpAQCAtOTcsMTcgKzExOCwyMCBAQAogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkCiAgICAgICogcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGRhdGEgdHlwZSBvZiB0aGUgc2FtcGxlcy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gbnVtYmVyT2ZCaXRzIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwuCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlIG9mIHRoZSBzYW1wbGVzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIG51bWJlck9mQml0cworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBiaXRzIHBlciBwaXhlbC4KICAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLAotICAgICAgICAgICAgaW50IG51bWJlck9mQml0cykgeworICAgIHB1YmxpYyBNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwoaW50IGRhdGFUeXBlLCBpbnQgdywgaW50IGgsIGludCBudW1iZXJPZkJpdHMpIHsKIAotICAgICAgICB0aGlzKGRhdGFUeXBlLCB3LCBoLCBudW1iZXJPZkJpdHMsIChudW1iZXJPZkJpdHMgKiB3ICsKLSAgICAgICAgICAgICAgIERhdGFCdWZmZXIuZ2V0RGF0YVR5cGVTaXplKGRhdGFUeXBlKSAtIDEpIC8KLSAgICAgICAgICAgICAgIERhdGFCdWZmZXIuZ2V0RGF0YVR5cGVTaXplKGRhdGFUeXBlKSwgMCk7CisgICAgICAgIHRoaXMoZGF0YVR5cGUsIHcsIGgsIG51bWJlck9mQml0cywKKyAgICAgICAgICAgICAgICAobnVtYmVyT2ZCaXRzICogdyArIERhdGFCdWZmZXIuZ2V0RGF0YVR5cGVTaXplKGRhdGFUeXBlKSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAvIERhdGFCdWZmZXIuZ2V0RGF0YVR5cGVTaXplKGRhdGFUeXBlKSwgMCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMTcsMzYgKzE0MSwzNiBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIHN3aXRjaCAoZ2V0VHJhbnNmZXJUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGJ5dGUgYmRhdGFbXTsKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJkYXRhID0gbmV3IGJ5dGVbMV07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJkYXRhID0gKGJ5dGVbXSkgb2JqOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmRhdGFbMF0gPSAoYnl0ZSkgZ2V0U2FtcGxlKHgsIHksIDAsIGRhdGEpOwotICAgICAgICAgICAgb2JqID0gYmRhdGE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgc2hvcnQgc2RhdGFbXTsKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNkYXRhID0gbmV3IHNob3J0WzFdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZGF0YSA9IChzaG9ydFtdKSBvYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZGF0YVswXSA9IChzaG9ydCkgZ2V0U2FtcGxlKHgsIHksIDAsIGRhdGEpOwotICAgICAgICAgICAgb2JqID0gc2RhdGE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgaW50IGlkYXRhW107Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZGF0YSA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlkYXRhID0gKGludFtdKSBvYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZGF0YVswXSA9IGdldFNhbXBsZSh4LCB5LCAwLCBkYXRhKTsKLSAgICAgICAgICAgIG9iaiA9IGlkYXRhOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGJ5dGUgYmRhdGFbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmRhdGEgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBiZGF0YSA9IChieXRlW10pb2JqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiZGF0YVswXSA9IChieXRlKWdldFNhbXBsZSh4LCB5LCAwLCBkYXRhKTsKKyAgICAgICAgICAgICAgICBvYmogPSBiZGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzZGF0YVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzZGF0YSA9IG5ldyBzaG9ydFsxXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZGF0YSA9IChzaG9ydFtdKW9iajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2RhdGFbMF0gPSAoc2hvcnQpZ2V0U2FtcGxlKHgsIHksIDAsIGRhdGEpOworICAgICAgICAgICAgICAgIG9iaiA9IHNkYXRhOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGludCBpZGF0YVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZGF0YSA9IG5ldyBpbnRbMV07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWRhdGEgPSAoaW50W10pb2JqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZGF0YVswXSA9IGdldFNhbXBsZSh4LCB5LCAwLCBkYXRhKTsKKyAgICAgICAgICAgICAgICBvYmogPSBpZGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBvYmo7CkBAIC0xNTgsMTQgKzE4MiwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoaXMgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIG9iamVjdCB3aXRoIAotICAgICAqIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgorICAgICAqIENvbXBhcmVzIHRoaXMgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG8gdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBvYmplY3QgaXMgYSBNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgCi0gICAgICogd2l0aCB0aGUgc2FtZSBkYXRhIHBhcmFtZXRlciB2YWx1ZXMgYXMgdGhpcyBNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBvCisgICAgICogICAgICAgICAgICB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIG9iamVjdCBpcyBhIE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCB3aXRoIHRoZQorICAgICAqICAgICAgICAgc2FtZSBkYXRhIHBhcmFtZXRlciB2YWx1ZXMgYXMgdGhpcyBNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwsCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CkBAIC0xNzMsMTcgKzE5NywxNCBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIG1vZGVsID0gKE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkgbzsKLSAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggPT0gbW9kZWwud2lkdGggJiYKLSAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID09IG1vZGVsLmhlaWdodCAmJgotICAgICAgICAgICAgICAgdGhpcy5udW1CYW5kcyA9PSBtb2RlbC5udW1CYW5kcyAmJgotICAgICAgICAgICAgICAgdGhpcy5kYXRhVHlwZSA9PSBtb2RlbC5kYXRhVHlwZSAmJgotICAgICAgICAgICAgICAgdGhpcy5waXhlbEJpdFN0cmlkZSA9PSBtb2RlbC5waXhlbEJpdFN0cmlkZSAmJgotICAgICAgICAgICAgICAgdGhpcy5iaXRNYXNrID09IG1vZGVsLmJpdE1hc2sgJiYKLSAgICAgICAgICAgICAgIHRoaXMucGl4ZWxzUGVyRGF0YUVsZW1lbnQgPT0gbW9kZWwucGl4ZWxzUGVyRGF0YUVsZW1lbnQgJiYKLSAgICAgICAgICAgICAgIHRoaXMuZGF0YUVsZW1lbnRTaXplID09IG1vZGVsLmRhdGFFbGVtZW50U2l6ZSAmJgotICAgICAgICAgICAgICAgdGhpcy5kYXRhQml0T2Zmc2V0ID09IG1vZGVsLmRhdGFCaXRPZmZzZXQgJiYKLSAgICAgICAgICAgICAgIHRoaXMuc2NhbmxpbmVTdHJpZGUgPT0gbW9kZWwuc2NhbmxpbmVTdHJpZGU7CisgICAgICAgIE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBtb2RlbCA9IChNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpbzsKKyAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggPT0gbW9kZWwud2lkdGggJiYgdGhpcy5oZWlnaHQgPT0gbW9kZWwuaGVpZ2h0CisgICAgICAgICAgICAgICAgJiYgdGhpcy5udW1CYW5kcyA9PSBtb2RlbC5udW1CYW5kcyAmJiB0aGlzLmRhdGFUeXBlID09IG1vZGVsLmRhdGFUeXBlCisgICAgICAgICAgICAgICAgJiYgdGhpcy5waXhlbEJpdFN0cmlkZSA9PSBtb2RlbC5waXhlbEJpdFN0cmlkZSAmJiB0aGlzLmJpdE1hc2sgPT0gbW9kZWwuYml0TWFzaworICAgICAgICAgICAgICAgICYmIHRoaXMucGl4ZWxzUGVyRGF0YUVsZW1lbnQgPT0gbW9kZWwucGl4ZWxzUGVyRGF0YUVsZW1lbnQKKyAgICAgICAgICAgICAgICAmJiB0aGlzLmRhdGFFbGVtZW50U2l6ZSA9PSBtb2RlbC5kYXRhRWxlbWVudFNpemUKKyAgICAgICAgICAgICAgICAmJiB0aGlzLmRhdGFCaXRPZmZzZXQgPT0gbW9kZWwuZGF0YUJpdE9mZnNldAorICAgICAgICAgICAgICAgICYmIHRoaXMuc2NhbmxpbmVTdHJpZGUgPT0gbW9kZWwuc2NhbmxpbmVTdHJpZGU7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yMzEsOCArMjUyLDcgQEAKIAogICAgICAgICBpbnQgYml0bnVtID0gZGF0YUJpdE9mZnNldCArIHggKiBwaXhlbEJpdFN0cmlkZTsKICAgICAgICAgaW50IGVsZW0gPSBkYXRhLmdldEVsZW0oeSAqIHNjYW5saW5lU3RyaWRlICsgYml0bnVtIC8gZGF0YUVsZW1lbnRTaXplKTsKLSAgICAgICAgaW50IHNoaWZ0ID0gZGF0YUVsZW1lbnRTaXplIC0gKGJpdG51bSAmIChkYXRhRWxlbWVudFNpemUgLSAxKSkgLQotICAgICAgICAgICAgICAgIHBpeGVsQml0U3RyaWRlOworICAgICAgICBpbnQgc2hpZnQgPSBkYXRhRWxlbWVudFNpemUgLSAoYml0bnVtICYgKGRhdGFFbGVtZW50U2l6ZSAtIDEpKSAtIHBpeGVsQml0U3RyaWRlOwogCiAgICAgICAgIHJldHVybiAoZWxlbSA+PiBzaGlmdCkgJiBiaXRNYXNrOwogICAgIH0KQEAgLTI1MywxNSArMjczLDE1IEBACiAgICAgICAgIGludCBzaXplID0gc2NhbmxpbmVTdHJpZGUgKiBoZWlnaHQ7CiAKICAgICAgICAgc3dpdGNoIChkYXRhVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgZGF0YUJ1ZmZlciA9IG5ldyBEYXRhQnVmZmVyQnl0ZShzaXplICsgKGRhdGFCaXRPZmZzZXQgKyA3KSAvIDgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIGRhdGFCdWZmZXIgPSBuZXcgRGF0YUJ1ZmZlclVTaG9ydChzaXplICsgKGRhdGFCaXRPZmZzZXQgKyAxNSkgLyAxNik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgZGF0YUJ1ZmZlciA9IG5ldyBEYXRhQnVmZmVySW50KHNpemUgKyAoZGF0YUJpdE9mZnNldCArIDMxKSAvIDMyKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBkYXRhQnVmZmVyID0gbmV3IERhdGFCdWZmZXJCeXRlKHNpemUgKyAoZGF0YUJpdE9mZnNldCArIDcpIC8gOCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgZGF0YUJ1ZmZlciA9IG5ldyBEYXRhQnVmZmVyVVNob3J0KHNpemUgKyAoZGF0YUJpdE9mZnNldCArIDE1KSAvIDE2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBkYXRhQnVmZmVyID0gbmV3IERhdGFCdWZmZXJJbnQoc2l6ZSArIChkYXRhQml0T2Zmc2V0ICsgMzEpIC8gMzIpOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBkYXRhQnVmZmVyOwogICAgIH0KQEAgLTI2OSwxNCArMjg5LDE0IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwgaW4gdGhlIGRhdGEgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHNwZWNpZmllZCBwaXhlbC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwuCiAgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRPZmZzZXQoaW50IHgsIGludCB5KSB7Ci0gICAgICAgIHJldHVybiB5ICogc2NhbmxpbmVTdHJpZGUgKyAoeCAqIHBpeGVsQml0U3RyaWRlICsgZGF0YUJpdE9mZnNldCkgLwotICAgICAgICAgICAgICAgZGF0YUVsZW1lbnRTaXplOworICAgICAgICByZXR1cm4geSAqIHNjYW5saW5lU3RyaWRlICsgKHggKiBwaXhlbEJpdFN0cmlkZSArIGRhdGFCaXRPZmZzZXQpIC8gZGF0YUVsZW1lbnRTaXplOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjg1LDExICszMDUsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBiaXQgb2Zmc2V0IGluIHRoZSBkYXRhIGVsZW1lbnQgd2hpY2ggCi0gICAgICogaXMgc3RvcmVkIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIG9mIGEgc2NhbmxpbmUuCisgICAgICogR2V0cyB0aGUgYml0IG9mZnNldCBpbiB0aGUgZGF0YSBlbGVtZW50IHdoaWNoIGlzIHN0b3JlZCBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIHBpeGVsIG9mIGEgc2NhbmxpbmUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHBpeGVsLgotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwuCiAgICAgICogQHJldHVybiB0aGUgYml0IG9mZnNldCBvZiB0aGUgcGl4ZWwgaW4gdGhlIGRhdGEgZWxlbWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEJpdE9mZnNldChpbnQgeCkgewpAQCAtMjk4LDcgKzMxOCw5IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50W10gZ2V0U2FtcGxlU2l6ZSgpIHsKLSAgICAgICAgaW50IHNhbXBsZVNpemVzW10gPSB7IHBpeGVsQml0U3RyaWRlIH07CisgICAgICAgIGludCBzYW1wbGVTaXplc1tdID0geworICAgICAgICAgICAgcGl4ZWxCaXRTdHJpZGUKKyAgICAgICAgfTsKICAgICAgICAgcmV0dXJuIHNhbXBsZVNpemVzOwogICAgIH0KIApAQCAtMzk2LDU0ICs0MTgsNTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IG90aGVyIG1ldGhvZHMgb2YgdGhpcyBjbGFzcy4gVGhlIGJlaGF2aW91ciBvZgotICAgICAqIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24gdGhlIG1ldGhvZCB3aGljaCBoYXMgYmVlbiBpbnZva2UgdGhpcyBvbmUuIFRoZQotICAgICAqIGFyZ3VtZW50IG1ldGhvZElkIGlzIHVzZWQgdG8gY2hvb3NlIHZhbGlkIGJlaGF2aW91ciBpbiBhIHBhcnRpY3VsYXIgY2FzZS4KLSAgICAgKiBJZiBtZXRob2RJZCBpcyBlcXVhbCB0byAxIGl0IG1lYW5zIHRoYXQgdGhpcyBtZXRob2QgaGFzIGJlZW4gaW52b2tlZCBieQotICAgICAqIHRoZSBzZXREYXRhRWxlbWVudHMoKSBtZXRob2QsIDIgLSBtZWFucyBzZXRQaXhlbCgpLCBhbmQgc2V0U2FtcGxlKCkgaW4KLSAgICAgKiBhbnkgb3RoZXIgY2FzZXMuCisgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBvdGhlciBtZXRob2RzIG9mIHRoaXMgY2xhc3MuIFRoZSBiZWhhdmlvciBvZiB0aGlzCisgICAgICogbWV0aG9kIGRlcGVuZHMgb24gdGhlIG1ldGhvZCB3aGljaCBoYXMgYmVlbiBpbnZva2UgdGhpcyBvbmUuIFRoZSBhcmd1bWVudAorICAgICAqIG1ldGhvZElkIGlzIHVzZWQgdG8gY2hvb3NlIHZhbGlkIGJlaGF2aW9yIGluIGEgcGFydGljdWxhciBjYXNlLiBJZgorICAgICAqIG1ldGhvZElkIGlzIGVxdWFsIHRvIDEgaXQgbWVhbnMgdGhhdCB0aGlzIG1ldGhvZCBoYXMgYmVlbiBpbnZva2VkIGJ5IHRoZQorICAgICAqIHNldERhdGFFbGVtZW50cygpIG1ldGhvZCwgMiAtIG1lYW5zIHNldFBpeGVsKCksIGFuZCBzZXRTYW1wbGUoKSBpbiBhbnkKKyAgICAgKiBvdGhlciBjYXNlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgeAotICAgICAqIEBwYXJhbSB5IHRoZSB5Ci0gICAgICogQHBhcmFtIG9iaiB0aGUgb2JqCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGRhdGEKLSAgICAgKiBAcGFyYW0gbWV0aG9kSWQgdGhlIG1ldGhvZCBpZAotICAgICAqIEBwYXJhbSBzIHRoZSBzCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4LgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeS4KKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICB0aGUgb2JqLgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgZGF0YS4KKyAgICAgKiBAcGFyYW0gbWV0aG9kSWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXRob2QgaWQuCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRTYW1wbGUoZmluYWwgaW50IHgsIGZpbmFsIGludCB5LCBmaW5hbCBPYmplY3Qgb2JqLAotICAgICAgICAgICAgZmluYWwgRGF0YUJ1ZmZlciBkYXRhLCBmaW5hbCBpbnQgbWV0aG9kSWQsIGludCBzKSB7CisgICAgcHJpdmF0ZSB2b2lkIHNldFNhbXBsZShmaW5hbCBpbnQgeCwgZmluYWwgaW50IHksIGZpbmFsIE9iamVjdCBvYmosIGZpbmFsIERhdGFCdWZmZXIgZGF0YSwKKyAgICAgICAgICAgIGZpbmFsIGludCBtZXRob2RJZCwgaW50IHMpIHsKICAgICAgICAgaWYgKCh4IDwgMCkgfHwgKHkgPCAwKSB8fCAoeCA+PSB0aGlzLndpZHRoKSB8fCAoeSA+PSB0aGlzLmhlaWdodCkpIHsKICAgICAgICAgICAgIC8vIGF3dC42Mz1Db29yZGluYXRlcyBhcmUgbm90IGluIGJvdW5kcwotICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIGludCBiaXRudW0gPSBkYXRhQml0T2Zmc2V0ICsgeCAqIHBpeGVsQml0U3RyaWRlOwogICAgICAgICBmaW5hbCBpbnQgaWR4ID0geSAqIHNjYW5saW5lU3RyaWRlICsgYml0bnVtIC8gZGF0YUVsZW1lbnRTaXplOwotICAgICAgICBmaW5hbCBpbnQgc2hpZnQgPSBkYXRhRWxlbWVudFNpemUgLSAoYml0bnVtICYgKGRhdGFFbGVtZW50U2l6ZSAtIDEpKQotICAgICAgICAgICAgICAgIC0gcGl4ZWxCaXRTdHJpZGU7CisgICAgICAgIGZpbmFsIGludCBzaGlmdCA9IGRhdGFFbGVtZW50U2l6ZSAtIChiaXRudW0gJiAoZGF0YUVsZW1lbnRTaXplIC0gMSkpIC0gcGl4ZWxCaXRTdHJpZGU7CiAgICAgICAgIGZpbmFsIGludCBtYXNrID0gfihiaXRNYXNrIDw8IHNoaWZ0KTsKICAgICAgICAgaW50IGVsZW0gPSBkYXRhLmdldEVsZW0oaWR4KTsKIAogICAgICAgICBzd2l0Y2ggKG1ldGhvZElkKSB7Ci0gICAgICAgIGNhc2UgMTogeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludm9rZWQgZnJvbSBzZXREYXRhRWxlbWVudHMoKQotICAgICAgICAgICAgc3dpdGNoIChnZXRUcmFuc2ZlclR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgICAgICBzID0gKChieXRlW10pIG9iailbMF0gJiAweGZmOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgICAgIHMgPSAoKHNob3J0W10pIG9iailbMF0gJiAweGZmZmY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICAgICAgcyA9ICgoaW50W10pIG9iailbMF07CisgICAgICAgICAgICBjYXNlIDE6IHsgLy8gSW52b2tlZCBmcm9tIHNldERhdGFFbGVtZW50cygpCisgICAgICAgICAgICAgICAgc3dpdGNoIChnZXRUcmFuc2ZlclR5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICgoYnl0ZVtdKW9iailbMF0gJiAweGZmOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAoKHNob3J0W10pb2JqKVswXSAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gKChpbnRbXSlvYmopWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSAyOiB7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52b2tlZCBmcm9tIHNldFBpeGVsKCkKLSAgICAgICAgICAgIHMgPSAoKGludFtdKSBvYmopWzBdOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgMjogeyAvLyBJbnZva2VkIGZyb20gc2V0UGl4ZWwoKQorICAgICAgICAgICAgICAgIHMgPSAoKGludFtdKW9iailbMF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBlbGVtICY9IG1hc2s7CkBAIC00NTEsNCArNDc3LDMgQEAKICAgICAgICAgZGF0YS5zZXRFbGVtKGlkeCwgZWxlbSk7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvUGFja2VkQ29sb3JNb2RlbC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL1BhY2tlZENvbG9yTW9kZWwuamF2YQppbmRleCA3YWFlZmJmLi40ZDFjMmU1IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvUGFja2VkQ29sb3JNb2RlbC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9QYWNrZWRDb2xvck1vZGVsLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgamF2YS5hd3QuVHJhbnNwYXJlbmN5OwpAQCAtMjcsNDQgKzI4LDU3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIENsYXNzIFBhY2tlZENvbG9yTW9kZWwgcmVwcmVzZW50cyBhIGNvbG9yIG1vZGVsIHdoZXJlIHRoZSAKLSAqIGNvbXBvbmVudHMgYXJlIGp1c3QgdGhlIHJlZCwgZ3JlZW4sIGFuZCBibHVlIGJhbmRzLCBwbHVzIGFuIGFscGhhCi0gKiBiYW5kIGlmIGFscGhhIGlzIHN1cHBvcnRlZC4KKyAqIFRoZSBjbGFzcyBQYWNrZWRDb2xvck1vZGVsIHJlcHJlc2VudHMgYSBjb2xvciBtb2RlbCB3aGVyZSB0aGUgY29tcG9uZW50cyBhcmUKKyAqIGp1c3QgdGhlIHJlZCwgZ3JlZW4sIGFuZCBibHVlIGJhbmRzLCBwbHVzIGFuIGFscGhhIGJhbmQgaWYgYWxwaGEgaXMKKyAqIHN1cHBvcnRlZC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYWNrZWRDb2xvck1vZGVsIGV4dGVuZHMgQ29sb3JNb2RlbCB7CiAKLSAgICAvKiogVGhlIGNvbXBvbmVudCBtYXNrcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29tcG9uZW50IG1hc2tzLgorICAgICAqLwogICAgIGludCBjb21wb25lbnRNYXNrc1tdOwogCi0gICAgLyoqIFRoZSBvZmZzZXRzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBvZmZzZXRzLgorICAgICAqLwogICAgIGludCBvZmZzZXRzW107CiAKLSAgICAvKiogVGhlIHNjYWxlcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgc2NhbGVzLgorICAgICAqLwogICAgIGZsb2F0IHNjYWxlc1tdOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHBhY2tlZCBjb2xvciBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3BhY2UgdGhlIGNvbG9yIHNwYWNlCi0gICAgICogQHBhcmFtIGJpdHMgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcwotICAgICAqIEBwYXJhbSBjb2xvck1hc2tBcnJheSB0aGUgYXJyYXkgdGhhdCBnaXZlcyB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nCi0gICAgICogdG8gZWFjaCBjb2xvciBiYW5kIChyZWQsIGdyZWVuLCBhbmQgYmx1ZSkKLSAgICAgKiBAcGFyYW0gYWxwaGFNYXNrIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFscGhhIGJhbmQKLSAgICAgKiBAcGFyYW0gaXNBbHBoYVByZW11bHRpcGxpZWQgd2hldGhlciB0aGUgYWxwaGEgaXMgcHJlbXVsdGlwbGllZCBpbiB0aGlzIGNvbG9yIG1vZGVsCi0gICAgICogQHBhcmFtIHRyYW5zIHRoZSB0cmFuc3BhcmVuY3kgc3RyYXRlZ3ksIEBzZWUgamF2YS5hd3QuVHJhbnNwYXJlbmN5Ci0gICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZSB0aGUgdHJhbnNmZXIgdHlwZSAocHJpbWl0aXZlIGphdmEgdHlwZSAKLSAgICAgKiB0byB1c2UgZm9yIHRoZSBjb21wb25lbnRzKQotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgY29tYmluZWQgCi0gICAgICogYml0bWFza3MgZm9yIHRoZSBjb2xvciBiYW5kcyBpcyBsZXNzIHRoYW4gb25lIG9yIGdyZWF0ZXIgdGhhbiAzMgorICAgICAqIEBwYXJhbSBzcGFjZQorICAgICAqICAgICAgICAgICAgdGhlIGNvbG9yIHNwYWNlLgorICAgICAqIEBwYXJhbSBiaXRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzLgorICAgICAqIEBwYXJhbSBjb2xvck1hc2tBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHRoYXQgZ2l2ZXMgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byBlYWNoIGNvbG9yCisgICAgICogICAgICAgICAgICBiYW5kIChyZWQsIGdyZWVuLCBhbmQgYmx1ZSkuCisgICAgICogQHBhcmFtIGFscGhhTWFzaworICAgICAqICAgICAgICAgICAgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgYWxwaGEgYmFuZC4KKyAgICAgKiBAcGFyYW0gaXNBbHBoYVByZW11bHRpcGxpZWQKKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGFscGhhIGlzIHByZS1tdWx0aXBsaWVkIGluIHRoaXMgY29sb3IgbW9kZWwuCisgICAgICogQHBhcmFtIHRyYW5zCisgICAgICogICAgICAgICAgICB0aGUgdHJhbnNwYXJlbmN5IHN0cmF0ZWd5LCBAc2VlIGphdmEuYXd0LlRyYW5zcGFyZW5jeS4KKyAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlCisgICAgICogICAgICAgICAgICB0aGUgdHJhbnNmZXIgdHlwZSAocHJpbWl0aXZlIGphdmEgdHlwZSB0byB1c2UgZm9yIHRoZQorICAgICAqICAgICAgICAgICAgY29tcG9uZW50cykuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGNvbWJpbmVkIGJpdG1hc2tzIGZvciB0aGUgY29sb3IKKyAgICAgKiAgICAgICAgICAgICBiYW5kcyBpcyBsZXNzIHRoYW4gb25lIG9yIGdyZWF0ZXIgdGhhbiAzMi4KICAgICAgKi8KLSAgICBwdWJsaWMgUGFja2VkQ29sb3JNb2RlbChDb2xvclNwYWNlIHNwYWNlLCBpbnQgYml0cywgaW50IGNvbG9yTWFza0FycmF5W10sCi0gICAgICAgICAgICBpbnQgYWxwaGFNYXNrLCBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkLCBpbnQgdHJhbnMsCi0gICAgICAgICAgICBpbnQgdHJhbnNmZXJUeXBlKSB7CisgICAgcHVibGljIFBhY2tlZENvbG9yTW9kZWwoQ29sb3JTcGFjZSBzcGFjZSwgaW50IGJpdHMsIGludCBjb2xvck1hc2tBcnJheVtdLCBpbnQgYWxwaGFNYXNrLAorICAgICAgICAgICAgYm9vbGVhbiBpc0FscGhhUHJlbXVsdGlwbGllZCwgaW50IHRyYW5zLCBpbnQgdHJhbnNmZXJUeXBlKSB7CiAKLSAgICAgICAgc3VwZXIoYml0cywgY3JlYXRlQml0cyhjb2xvck1hc2tBcnJheSwgYWxwaGFNYXNrKSwgc3BhY2UsCi0gICAgICAgICAgICAgICAgKGFscGhhTWFzayA9PSAwID8gZmFsc2UgOiB0cnVlKSwgaXNBbHBoYVByZW11bHRpcGxpZWQsIHRyYW5zLAotICAgICAgICAgICAgICAgIHZhbGlkYXRlVHJhbnNmZXJUeXBlKHRyYW5zZmVyVHlwZSkpOworICAgICAgICBzdXBlcihiaXRzLCBjcmVhdGVCaXRzKGNvbG9yTWFza0FycmF5LCBhbHBoYU1hc2spLCBzcGFjZSwgKGFscGhhTWFzayA9PSAwID8gZmFsc2UgOiB0cnVlKSwKKyAgICAgICAgICAgICAgICBpc0FscGhhUHJlbXVsdGlwbGllZCwgdHJhbnMsIHZhbGlkYXRlVHJhbnNmZXJUeXBlKHRyYW5zZmVyVHlwZSkpOwogCiAgICAgICAgIGlmIChwaXhlbF9iaXRzIDwgMSB8fCBwaXhlbF9iaXRzID4gMzIpIHsKICAgICAgICAgICAgIC8vIGF3dC4yMzY9VGhlIGJpdHMgaXMgbGVzcyB0aGFuIDEgb3IgZ3JlYXRlciB0aGFuIDMyCkBAIC04OSwyNyArMTAzLDM0IEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHBhY2tlZCBjb2xvciBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3BhY2UgdGhlIGNvbG9yIHNwYWNlCi0gICAgICogQHBhcmFtIGJpdHMgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcwotICAgICAqIEBwYXJhbSBybWFzayB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSByZWQgYmFuZAotICAgICAqIEBwYXJhbSBnbWFzayB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSBncmVlbiBiYW5kCi0gICAgICogQHBhcmFtIGJtYXNrIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJsdWUgYmFuZAotICAgICAqIEBwYXJhbSBhbWFzayB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSBhbHBoYSBiYW5kCi0gICAgICogQHBhcmFtIGlzQWxwaGFQcmVtdWx0aXBsaWVkIHdoZXRoZXIgdGhlIGFscGhhIGlzIHByZW11bHRpcGxpZWQgaW4gdGhpcyBjb2xvciBtb2RlbAotICAgICAqIEBwYXJhbSB0cmFucyB0aGUgdHJhbnNwYXJlbmN5IHN0cmF0ZWd5LCBAc2VlIGphdmEuYXd0LlRyYW5zcGFyZW5jeQotICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUgdGhlIHRyYW5zZmVyIHR5cGUgKHByaW1pdGl2ZSBqYXZhIHR5cGUgCi0gICAgICogdG8gdXNlIGZvciB0aGUgY29tcG9uZW50cykKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGNvbWJpbmVkIAotICAgICAqIGJpdG1hc2tzIGZvciB0aGUgY29sb3IgYmFuZHMgaXMgbGVzcyB0aGFuIG9uZSBvciBncmVhdGVyIHRoYW4gMzIKKyAgICAgKiBAcGFyYW0gc3BhY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xvciBzcGFjZS4KKyAgICAgKiBAcGFyYW0gYml0cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcy4KKyAgICAgKiBAcGFyYW0gcm1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZCBiYW5kLgorICAgICAqIEBwYXJhbSBnbWFzaworICAgICAqICAgICAgICAgICAgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgZ3JlZW4gYmFuZC4KKyAgICAgKiBAcGFyYW0gYm1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJsdWUgYmFuZC4KKyAgICAgKiBAcGFyYW0gYW1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFscGhhIGJhbmQuCisgICAgICogQHBhcmFtIGlzQWxwaGFQcmVtdWx0aXBsaWVkCisgICAgICogICAgICAgICAgICB3aGV0aGVyIHRoZSBhbHBoYSBpcyBwcmUtbXVsdGlwbGllZCBpbiB0aGlzIGNvbG9yIG1vZGVsLgorICAgICAqIEBwYXJhbSB0cmFucworICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zcGFyZW5jeSBzdHJhdGVneSwgQHNlZSBqYXZhLmF3dC5UcmFuc3BhcmVuY3kuCisgICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zZmVyIHR5cGUgKHByaW1pdGl2ZSBqYXZhIHR5cGUgdG8gdXNlIGZvciB0aGUKKyAgICAgKiAgICAgICAgICAgIGNvbXBvbmVudHMpLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBjb21iaW5lZCBiaXRtYXNrcyBmb3IgdGhlIGNvbG9yCisgICAgICogICAgICAgICAgICAgYmFuZHMgaXMgbGVzcyB0aGFuIG9uZSBvciBncmVhdGVyIHRoYW4gMzIuCiAgICAgICovCi0gICAgcHVibGljIFBhY2tlZENvbG9yTW9kZWwoQ29sb3JTcGFjZSBzcGFjZSwgaW50IGJpdHMsIGludCBybWFzaywgaW50IGdtYXNrLAotICAgICAgICAgICAgaW50IGJtYXNrLCBpbnQgYW1hc2ssIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQsIGludCB0cmFucywKLSAgICAgICAgICAgIGludCB0cmFuc2ZlclR5cGUpIHsKKyAgICBwdWJsaWMgUGFja2VkQ29sb3JNb2RlbChDb2xvclNwYWNlIHNwYWNlLCBpbnQgYml0cywgaW50IHJtYXNrLCBpbnQgZ21hc2ssIGludCBibWFzaywgaW50IGFtYXNrLAorICAgICAgICAgICAgYm9vbGVhbiBpc0FscGhhUHJlbXVsdGlwbGllZCwgaW50IHRyYW5zLCBpbnQgdHJhbnNmZXJUeXBlKSB7CiAKLSAgICAgICAgc3VwZXIoYml0cywgY3JlYXRlQml0cyhybWFzaywgZ21hc2ssIGJtYXNrLCBhbWFzayksIHNwYWNlLAotICAgICAgICAgICAgICAgIChhbWFzayA9PSAwID8gZmFsc2UgOiB0cnVlKSwgaXNBbHBoYVByZW11bHRpcGxpZWQsIHRyYW5zLAotICAgICAgICAgICAgICAgIHZhbGlkYXRlVHJhbnNmZXJUeXBlKHRyYW5zZmVyVHlwZSkpOworICAgICAgICBzdXBlcihiaXRzLCBjcmVhdGVCaXRzKHJtYXNrLCBnbWFzaywgYm1hc2ssIGFtYXNrKSwgc3BhY2UsIChhbWFzayA9PSAwID8gZmFsc2UgOiB0cnVlKSwKKyAgICAgICAgICAgICAgICBpc0FscGhhUHJlbXVsdGlwbGllZCwgdHJhbnMsIHZhbGlkYXRlVHJhbnNmZXJUeXBlKHRyYW5zZmVyVHlwZSkpOwogCiAgICAgICAgIGlmIChwaXhlbF9iaXRzIDwgMSB8fCBwaXhlbF9iaXRzID4gMzIpIHsKICAgICAgICAgICAgIC8vIGF3dC4yMzY9VGhlIGJpdHMgaXMgbGVzcyB0aGFuIDEgb3IgZ3JlYXRlciB0aGFuIDMyCkBAIC0xMjMsNyArMTQ0LDggQEAKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbG9yQ29tcG9uZW50czsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoY3MuZ2V0TWluVmFsdWUoaSkgIT0gMC4wZiB8fCBjcy5nZXRNYXhWYWx1ZShpKSAhPSAxLjBmKSB7Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjIzQT1UaGUgbWluL21heCBub3JtYWxpemVkIGNvbXBvbmVudCB2YWx1ZXMgYXJlIG5vdCAwLjAvMS4wCisgICAgICAgICAgICAgICAgLy8gYXd0LjIzQT1UaGUgbWluL21heCBub3JtYWxpemVkIGNvbXBvbmVudCB2YWx1ZXMgYXJlIG5vdAorICAgICAgICAgICAgICAgIC8vIDAuMC8xLjAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIzQSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNDQsNyArMTY2LDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBnZXRBbHBoYVJhc3RlcihXcml0YWJsZVJhc3RlciByYXN0ZXIpIHsKLSAgICAgICAgaWYoIWhhc0FscGhhKSB7CisgICAgICAgIGlmICghaGFzQWxwaGEpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKQEAgLTE2NSwxOCArMTg3LDE2IEBACiAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFBhY2tlZENvbG9yTW9kZWwpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgUGFja2VkQ29sb3JNb2RlbCBjbSA9IChQYWNrZWRDb2xvck1vZGVsKSBvYmo7CisgICAgICAgIFBhY2tlZENvbG9yTW9kZWwgY20gPSAoUGFja2VkQ29sb3JNb2RlbClvYmo7CiAKLSAgICAgICAgcmV0dXJuIChwaXhlbF9iaXRzID09IGNtLmdldFBpeGVsU2l6ZSgpICYmCi0gICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlID09IGNtLmdldFRyYW5zZmVyVHlwZSgpICYmCi0gICAgICAgICAgICAgICAgY3MuZ2V0VHlwZSgpID09IGNtLmdldENvbG9yU3BhY2UoKS5nZXRUeXBlKCkgJiYKLSAgICAgICAgICAgICAgICBoYXNBbHBoYSA9PSBjbS5oYXNBbHBoYSgpICYmCi0gICAgICAgICAgICAgICAgaXNBbHBoYVByZW11bHRpcGxpZWQgPT0gY20uaXNBbHBoYVByZW11bHRpcGxpZWQoKSAmJgotICAgICAgICAgICAgICAgIHRyYW5zcGFyZW5jeSA9PSBjbS5nZXRUcmFuc3BhcmVuY3koKSAmJgotICAgICAgICAgICAgICAgIG51bUNvbG9yQ29tcG9uZW50cyA9PSBjbS5nZXROdW1Db2xvckNvbXBvbmVudHMoKSYmCi0gICAgICAgICAgICAgICAgbnVtQ29tcG9uZW50cyA9PSBjbS5nZXROdW1Db21wb25lbnRzKCkgJiYKLSAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKGJpdHMsIGNtLmdldENvbXBvbmVudFNpemUoKSkgJiYKLSAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKGNvbXBvbmVudE1hc2tzLCBjbS5nZXRNYXNrcygpKSk7CisgICAgICAgIHJldHVybiAocGl4ZWxfYml0cyA9PSBjbS5nZXRQaXhlbFNpemUoKSAmJiB0cmFuc2ZlclR5cGUgPT0gY20uZ2V0VHJhbnNmZXJUeXBlKCkKKyAgICAgICAgICAgICAgICAmJiBjcy5nZXRUeXBlKCkgPT0gY20uZ2V0Q29sb3JTcGFjZSgpLmdldFR5cGUoKSAmJiBoYXNBbHBoYSA9PSBjbS5oYXNBbHBoYSgpCisgICAgICAgICAgICAgICAgJiYgaXNBbHBoYVByZW11bHRpcGxpZWQgPT0gY20uaXNBbHBoYVByZW11bHRpcGxpZWQoKQorICAgICAgICAgICAgICAgICYmIHRyYW5zcGFyZW5jeSA9PSBjbS5nZXRUcmFuc3BhcmVuY3koKQorICAgICAgICAgICAgICAgICYmIG51bUNvbG9yQ29tcG9uZW50cyA9PSBjbS5nZXROdW1Db2xvckNvbXBvbmVudHMoKQorICAgICAgICAgICAgICAgICYmIG51bUNvbXBvbmVudHMgPT0gY20uZ2V0TnVtQ29tcG9uZW50cygpCisgICAgICAgICAgICAgICAgJiYgQXJyYXlzLmVxdWFscyhiaXRzLCBjbS5nZXRDb21wb25lbnRTaXplKCkpICYmIEFycmF5cy5lcXVhbHMoY29tcG9uZW50TWFza3MsIGNtCisgICAgICAgICAgICAgICAgLmdldE1hc2tzKCkpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE4NywyNSArMjA3LDIzIEBACiAgICAgICAgIGlmICghKHNtIGluc3RhbmNlb2YgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIGVzbSA9IChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKSBzbTsKKyAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBlc20gPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbClzbTsKIAotICAgICAgICByZXR1cm4gKChlc20uZ2V0TnVtQmFuZHMoKSA9PSBudW1Db21wb25lbnRzKSAmJgotICAgICAgICAgICAgICAgIChlc20uZ2V0VHJhbnNmZXJUeXBlKCkgPT0gdHJhbnNmZXJUeXBlKSAmJgotICAgICAgICAgICAgICAgIEFycmF5cy5lcXVhbHMoZXNtLmdldEJpdE1hc2tzKCksIGNvbXBvbmVudE1hc2tzKSk7CisgICAgICAgIHJldHVybiAoKGVzbS5nZXROdW1CYW5kcygpID09IG51bUNvbXBvbmVudHMpICYmIChlc20uZ2V0VHJhbnNmZXJUeXBlKCkgPT0gdHJhbnNmZXJUeXBlKSAmJiBBcnJheXMKKyAgICAgICAgICAgICAgICAuZXF1YWxzKGVzbS5nZXRCaXRNYXNrcygpLCBjb21wb25lbnRNYXNrcykpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTYW1wbGVNb2RlbCBjcmVhdGVDb21wYXRpYmxlU2FtcGxlTW9kZWwoaW50IHcsIGludCBoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCh0cmFuc2ZlclR5cGUsIHcsIGgsCi0gICAgICAgICAgICAgICAgY29tcG9uZW50TWFza3MpOworICAgICAgICByZXR1cm4gbmV3IFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwodHJhbnNmZXJUeXBlLCB3LCBoLCBjb21wb25lbnRNYXNrcyk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgY29sb3IgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgY29sb3IKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXNrCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgY29sb3IuCisgICAgICogQHJldHVybiB0aGUgbWFzay4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldE1hc2soaW50IGluZGV4KSB7CiAgICAgICAgIHJldHVybiBjb21wb25lbnRNYXNrc1tpbmRleF07CkBAIC0yMTQsNyArMjMyLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBiaXRtYXNrcyBvZiB0aGUgY29tcG9uZW50cy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXNrcworICAgICAqIEByZXR1cm4gdGhlIG1hc2tzLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnRbXSBnZXRNYXNrcygpIHsKICAgICAgICAgcmV0dXJuIChjb21wb25lbnRNYXNrcy5jbG9uZSgpKTsKQEAgLTIyMywxMCArMjQxLDExIEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgYml0cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3JNYXNrQXJyYXkgdGhlIGNvbG9yIG1hc2sgYXJyYXkKLSAgICAgKiBAcGFyYW0gYWxwaGFNYXNrIHRoZSBhbHBoYSBtYXNrCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50W10KKyAgICAgKiBAcGFyYW0gY29sb3JNYXNrQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xvciBtYXNrIGFycmF5LgorICAgICAqIEBwYXJhbSBhbHBoYU1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbHBoYSBtYXNrLgorICAgICAqIEByZXR1cm4gdGhlIGludFtdLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGludFtdIGNyZWF0ZUJpdHMoaW50IGNvbG9yTWFza0FycmF5W10sIGludCBhbHBoYU1hc2spIHsKICAgICAgICAgaW50IGJpdHNbXTsKQEAgLTI2MiwxNSArMjgxLDE3IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgYml0cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcm1hc2sgdGhlIHJtYXNrCi0gICAgICogQHBhcmFtIGdtYXNrIHRoZSBnbWFzawotICAgICAqIEBwYXJhbSBibWFzayB0aGUgYm1hc2sKLSAgICAgKiBAcGFyYW0gYW1hc2sgdGhlIGFtYXNrCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50W10KKyAgICAgKiBAcGFyYW0gcm1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBybWFzay4KKyAgICAgKiBAcGFyYW0gZ21hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBnbWFzay4KKyAgICAgKiBAcGFyYW0gYm1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBibWFzay4KKyAgICAgKiBAcGFyYW0gYW1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbWFzay4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRbXS4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBjcmVhdGVCaXRzKGludCBybWFzaywgaW50IGdtYXNrLCBpbnQgYm1hc2ssCi0gICAgICAgICAgICBpbnQgYW1hc2spIHsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBjcmVhdGVCaXRzKGludCBybWFzaywgaW50IGdtYXNrLCBpbnQgYm1hc2ssIGludCBhbWFzaykgewogCiAgICAgICAgIGludCBudW1Db21wOwogICAgICAgICBpZiAoYW1hc2sgPT0gMCkgewpAQCAtMzEyLDkgKzMzMyw5IEBACiAgICAgLyoqCiAgICAgICogQ291bnQgY29tcCBiaXRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wTWFzayB0aGUgY29tcCBtYXNrCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50CisgICAgICogQHBhcmFtIGNvbXBNYXNrCisgICAgICogICAgICAgICAgICB0aGUgY29tcCBtYXNrLgorICAgICAqIEByZXR1cm4gdGhlIGludC4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBpbnQgY291bnRDb21wQml0cyhpbnQgY29tcE1hc2spIHsKICAgICAgICAgaW50IGJpdHMgPSAwOwpAQCAtMzQwLDIwICszNjEsMTkgQEAKICAgICAvKioKICAgICAgKiBWYWxpZGF0ZSB0cmFuc2ZlciB0eXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUgdGhlIHRyYW5zZmVyIHR5cGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQKKyAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlCisgICAgICogICAgICAgICAgICB0aGUgdHJhbnNmZXIgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHZhbGlkYXRlVHJhbnNmZXJUeXBlKGludCB0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgaWYgKHRyYW5zZmVyVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURSAmJgotICAgICAgICAgICAgICAgIHRyYW5zZmVyVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUICYmCi0gICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9JTlQpIHsKKyAgICAgICAgaWYgKHRyYW5zZmVyVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURSAmJiB0cmFuc2ZlclR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVAorICAgICAgICAgICAgICAgICYmIHRyYW5zZmVyVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfSU5UKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjQwPVRoZSB0cmFuc2ZlclR5cGUgbm90IGlzIG9uZSBvZiBEYXRhQnVmZmVyLlRZUEVfQllURSwKLSAgICAgICAgICAgIC8vICAgICAgICAgIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQgb3IgRGF0YUJ1ZmZlci5UWVBFX0lOVAorICAgICAgICAgICAgLy8gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCBvciBEYXRhQnVmZmVyLlRZUEVfSU5UCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI0MCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cmFuc2ZlclR5cGU7Ci19CisgICAgfQogCiAgICAgLyoqCiAgICAgICogUGFyc2VzIHRoZSBjb21wb25lbnRzLgpAQCAtMzgwLDQgKzQwMCwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9QaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9QaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwuamF2YQppbmRleCBlNDE0NzNlLi44ZTY0NmY4IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL1BpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbC5qYXZhCkBAIC0xOCwzMCArMTgsMzkgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCBjbGFzcyByZXByZXNlbnRzIGltYWdlIGRhdGEgCi0gKiBhcyByZXByZXNlbnRlZCBhcyBpbnRlcmxlYXZlZCBwaXhlbHMgYW5kIGZvciB3aGljaCBlYWNoIHNhbXBsZSBvZiAKLSAqIGEgcGl4ZWwgdGFrZXMgb25lIGRhdGEgZWxlbWVudCBvZiB0aGUgRGF0YUJ1ZmZlci4KKyAqIFRoZSBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwgY2xhc3MgcmVwcmVzZW50cyBpbWFnZSBkYXRhIGFzIHJlcHJlc2VudGVkIGFzCisgKiBpbnRlcmxlYXZlZCBwaXhlbHMgYW5kIGZvciB3aGljaCBlYWNoIHNhbXBsZSBvZiBhIHBpeGVsIHRha2VzIG9uZSBkYXRhCisgKiBlbGVtZW50IG9mIHRoZSBEYXRhQnVmZmVyLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCBleHRlbmRzIENvbXBvbmVudFNhbXBsZU1vZGVsIHsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwgd2l0aCB0aGUgCi0gICAgICogc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0aGUgZGF0YSB0eXBlIG9mIHRoZSBzYW1wbGVzLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBwaXhlbFN0cmlkZSB0aGUgcGl4ZWwgc3RyaWRlIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZSB0aGUgc2NhbmxpbmUgc3RyaWRlIG9mIHRoZSBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gYmFuZE9mZnNldHMgdGhlIGFycmF5IG9mIHRoZSBiYW5kIG9mZnNldHMuCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlIG9mIHRoZSBzYW1wbGVzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHBpeGVsU3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwgc3RyaWRlIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZQorICAgICAqICAgICAgICAgICAgdGhlIHNjYW5saW5lIHN0cmlkZSBvZiB0aGUgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGJhbmRPZmZzZXRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgdGhlIGJhbmQgb2Zmc2V0cy4KICAgICAgKi8KLSAgICBwdWJsaWMgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLAotICAgICAgICAgICAgaW50IHBpeGVsU3RyaWRlLCBpbnQgc2NhbmxpbmVTdHJpZGUsIGludCBiYW5kT2Zmc2V0c1tdKSB7CisgICAgcHVibGljIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbChpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwgaW50IHBpeGVsU3RyaWRlLAorICAgICAgICAgICAgaW50IHNjYW5saW5lU3RyaWRlLCBpbnQgYmFuZE9mZnNldHNbXSkgewogCiAgICAgICAgIHN1cGVyKGRhdGFUeXBlLCB3LCBoLCBwaXhlbFN0cmlkZSwgc2NhbmxpbmVTdHJpZGUsIGJhbmRPZmZzZXRzKTsKIApAQCAtNTksNyArNjgsOCBAQAogICAgICAgICBtYXhPZmZzZXQgLT0gbWluT2Zmc2V0OwogCiAgICAgICAgIGlmIChtYXhPZmZzZXQgPiBzY2FubGluZVN0cmlkZSkgewotICAgICAgICAgICAgLy8gYXd0LjI0MT1Bbnkgb2Zmc2V0IGJldHdlZW4gYmFuZHMgaXMgZ3JlYXRlciB0aGFuIHRoZSBTY2FubGluZSBzdHJpZGUKKyAgICAgICAgICAgIC8vIGF3dC4yNDE9QW55IG9mZnNldCBiZXR3ZWVuIGJhbmRzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgU2NhbmxpbmUKKyAgICAgICAgICAgIC8vIHN0cmlkZQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNDEiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCkBAIC02OSw3ICs3OSw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAocGl4ZWxTdHJpZGUgKiB3ID4gc2NhbmxpbmVTdHJpZGUpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yNDM9UHJvZHVjdCBvZiBQaXhlbCBzdHJpZGUgYW5kIHcgaXMgZ3JlYXRlciB0aGFuIFNjYW5saW5lIHN0cmlkZQorICAgICAgICAgICAgLy8gYXd0LjI0Mz1Qcm9kdWN0IG9mIFBpeGVsIHN0cmlkZSBhbmQgdyBpcyBncmVhdGVyIHRoYW4gU2NhbmxpbmUKKyAgICAgICAgICAgIC8vIHN0cmlkZQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNDMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCkBAIC04Miw4ICs5Myw4IEBACiAgICAgICAgICAgICBuZXdPZmZzZXRzW2ldID0gYmFuZE9mZnNldHNbYmFuZHNbaV1dOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIG5ldyBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwoZGF0YVR5cGUsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgcGl4ZWxTdHJpZGUsIHNjYW5saW5lU3RyaWRlLCBuZXdPZmZzZXRzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwoZGF0YVR5cGUsIHdpZHRoLCBoZWlnaHQsIHBpeGVsU3RyaWRlLAorICAgICAgICAgICAgICAgIHNjYW5saW5lU3RyaWRlLCBuZXdPZmZzZXRzKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTEwNiw4ICsxMTcsOCBAQAogICAgICAgICAgICAgbmV3T2Zmc2V0cyA9IGJhbmRPZmZzZXRzOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIG5ldyBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwoZGF0YVR5cGUsIHcsIGgsIHBpeGVsU3RyaWRlLAotICAgICAgICAgICAgICAgIHBpeGVsU3RyaWRlICogdywgbmV3T2Zmc2V0cyk7CisgICAgICAgIHJldHVybiBuZXcgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsKGRhdGFUeXBlLCB3LCBoLCBwaXhlbFN0cmlkZSwgcGl4ZWxTdHJpZGUgKiB3LAorICAgICAgICAgICAgICAgIG5ld09mZnNldHMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTIxLDQgKzEzMiwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9SR0JJbWFnZUZpbHRlci5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL1JHQkltYWdlRmlsdGVyLmphdmEKaW5kZXggOWE3Njk5Ny4uZjVmZTVkOSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL1JHQkltYWdlRmlsdGVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL1JHQkltYWdlRmlsdGVyLmphdmEKQEAgLTE4LDQ2ICsxOCw0OCBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKLQogLyoqCi0gKiBUaGUgUkdCSW1hZ2VGaWx0ZXIgY2xhc3MgcmVwcmVzZW50cyBhIGZpbHRlciB3aGljaCBtb2RpZmllcwotICogcGl4ZWxzIG9mIGFuIGltYWdlIGluIHRoZSBkZWZhdWx0IFJHQiBDb2xvck1vZGVsLiAKKyAqIFRoZSBSR0JJbWFnZUZpbHRlciBjbGFzcyByZXByZXNlbnRzIGEgZmlsdGVyIHdoaWNoIG1vZGlmaWVzIHBpeGVscyBvZiBhbgorICogaW1hZ2UgaW4gdGhlIGRlZmF1bHQgUkdCIENvbG9yTW9kZWwuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUkdCSW1hZ2VGaWx0ZXIgZXh0ZW5kcyBJbWFnZUZpbHRlciB7CiAKLSAgICAvKiogCi0gICAgICogVGhlIG9yaWdtb2RlbCBpcyB0aGUgQ29sb3JNb2RlbCB0byBiZSByZXBsYWNlZCBieSBuZXdtb2RlbCAKLSAgICAgKiB3aGVuIHN1YnN0aXR1dGVDb2xvck1vZGVsIGlzIGNhbGxlZC4KKyAgICAvKioKKyAgICAgKiBUaGUgb3JpZ2luYWwgbW9kZWwgaXMgdGhlIENvbG9yTW9kZWwgdG8gYmUgcmVwbGFjZWQgYnkgdGhlIG5ldyBtb2RlbCB3aGVuCisgICAgICogc3Vic3RpdHV0ZUNvbG9yTW9kZWwgaXMgY2FsbGVkLgogICAgICAqLwogICAgIHByb3RlY3RlZCBDb2xvck1vZGVsIG9yaWdtb2RlbDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgbmV3bW9kZWwgaXMgdGhlIENvbG9yTW9kZWwgd2l0aCB3aGljaCB0byByZXBsYWNlIG9yaWdtb2RlbCAKLSAgICAgKiB3aGVuIHN1YnN0aXR1dGVDb2xvck1vZGVsIGlzIGNhbGxlZC4gCisgICAgLyoqCisgICAgICogVGhlIG5ldyBtb2RlbCBpcyB0aGUgQ29sb3JNb2RlbCB3aXRoIHdoaWNoIHRvIHJlcGxhY2UgdGhlIG9yaWdpbmFsIG1vZGVsCisgICAgICogd2hlbiBzdWJzdGl0dXRlQ29sb3JNb2RlbCBpcyBjYWxsZWQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIENvbG9yTW9kZWwgbmV3bW9kZWw7CiAKLSAgICAvKiogCi0gICAgICogVGhlIGNhbkZpbHRlckluZGV4Q29sb3JNb2RlbCBpbmRpY2F0ZXMgaWYgaXQgaXMgCi0gICAgICogYWNjZXB0YWJsZSB0byBhcHBseSB0aGUgY29sb3IgZmlsdGVyaW5nIG9mIHRoZSBmaWx0ZXJSR0IgCi0gICAgICogbWV0aG9kIHRvIHRoZSBjb2xvciB0YWJsZSBlbnRyaWVzIG9mIGFuIEluZGV4Q29sb3JNb2RlbCAKLSAgICAgKiBvYmplY3QuCi0gICAgICogKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY2FuRmlsdGVySW5kZXhDb2xvck1vZGVsIGluZGljYXRlcyBpZiBpdCBpcyBhY2NlcHRhYmxlIHRvIGFwcGx5IHRoZQorICAgICAqIGNvbG9yIGZpbHRlcmluZyBvZiB0aGUgZmlsdGVyUkdCIG1ldGhvZCB0byB0aGUgY29sb3IgdGFibGUgZW50cmllcyBvZiBhbgorICAgICAqIEluZGV4Q29sb3JNb2RlbCBvYmplY3QuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuRmlsdGVySW5kZXhDb2xvck1vZGVsOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFJHQkltYWdlRmlsdGVyLgogICAgICAqLwotICAgIHB1YmxpYyBSR0JJbWFnZUZpbHRlcigpIHt9CisgICAgcHVibGljIFJHQkltYWdlRmlsdGVyKCkgeworICAgIH0KIAogICAgIC8qKgotICAgICAqIEZpbHRlcnMgYW4gSW5kZXhDb2xvck1vZGVsIG9iamVjdCBieSBjYWxsaW5nIGZpbHRlclJHQiBmdW5jdGlvbiBmb3IKLSAgICAgKiBlYWNoIGVudHJ5IG9mIEluZGV4Q29sb3JNb2RlbC4KKyAgICAgKiBGaWx0ZXJzIGFuIEluZGV4Q29sb3JNb2RlbCBvYmplY3QgYnkgY2FsbGluZyBmaWx0ZXJSR0IgZnVuY3Rpb24gZm9yIGVhY2gKKyAgICAgKiBlbnRyeSBvZiBJbmRleENvbG9yTW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGljbSB0aGUgSW5kZXhDb2xvck1vZGVsIHRvIGJlIGZpbHRlcmVkLgotICAgICAqIAorICAgICAqIEBwYXJhbSBpY20KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbmRleENvbG9yTW9kZWwgdG8gYmUgZmlsdGVyZWQuCiAgICAgICogQHJldHVybiB0aGUgSW5kZXhDb2xvck1vZGVsLgogICAgICAqLwogICAgIHB1YmxpYyBJbmRleENvbG9yTW9kZWwgZmlsdGVySW5kZXhDb2xvck1vZGVsKEluZGV4Q29sb3JNb2RlbCBpY20pIHsKQEAgLTY5LDI4ICs3MSwzMCBAQAogICAgICAgICBpY20uZ2V0UkdCcyhjb2xvck1hcCk7CiAgICAgICAgIGludCB0cmFucyA9IC0xOwogICAgICAgICBib29sZWFuIGhhc0FscGhhID0gZmFsc2U7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBtYXBTaXplOyBpKyspeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcFNpemU7IGkrKykgewogICAgICAgICAgICAgZmlsdGVyZWRDb2xvck1hcFtpXSA9IGZpbHRlclJHQigtMSwgLTEsIGNvbG9yTWFwW2ldKTsKICAgICAgICAgICAgIGludCBhbHBoYSA9IGZpbHRlcmVkQ29sb3JNYXBbaV0gPj4+IDI0OwotICAgICAgICAgICAgaWYoYWxwaGEgIT0gMHhmZil7Ci0gICAgICAgICAgICAgICAgaWYoIWhhc0FscGhhKSB7CisgICAgICAgICAgICBpZiAoYWxwaGEgIT0gMHhmZikgeworICAgICAgICAgICAgICAgIGlmICghaGFzQWxwaGEpIHsKICAgICAgICAgICAgICAgICAgICAgaGFzQWxwaGEgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihhbHBoYSA9PSAwICYmIHRyYW5zIDwgMCkgeworICAgICAgICAgICAgICAgIGlmIChhbHBoYSA9PSAwICYmIHRyYW5zIDwgMCkgewogICAgICAgICAgICAgICAgICAgICB0cmFucyA9IGk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIG5ldyBJbmRleENvbG9yTW9kZWwoYml0cywgbWFwU2l6ZSwgZmlsdGVyZWRDb2xvck1hcCwgMCwKLSAgICAgICAgICAgICAgICBoYXNBbHBoYSwgdHJhbnMsIHRyYW5zZmVyVHlwZSk7CisgICAgICAgIHJldHVybiBuZXcgSW5kZXhDb2xvck1vZGVsKGJpdHMsIG1hcFNpemUsIGZpbHRlcmVkQ29sb3JNYXAsIDAsIGhhc0FscGhhLCB0cmFucywKKyAgICAgICAgICAgICAgICB0cmFuc2ZlclR5cGUpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJlcGxhY2VzIHRoZSBvcmlnaW5hbCBjb2xvciBtb2RlbCBhbmQgdGhlIG5ldyBvbmUuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9sZGNtIHRoZSBvbGQgQ29sb3JNb2RlbC4KLSAgICAgKiBAcGFyYW0gbmV3Y20gdGhlIG5ldyBDb2xvck1vZGVsLgorICAgICAqIEBwYXJhbSBvbGRjbQorICAgICAqICAgICAgICAgICAgdGhlIG9sZCBDb2xvck1vZGVsLgorICAgICAqIEBwYXJhbSBuZXdjbQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBDb2xvck1vZGVsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN1YnN0aXR1dGVDb2xvck1vZGVsKENvbG9yTW9kZWwgb2xkY20sIENvbG9yTW9kZWwgbmV3Y20pIHsKICAgICAgICAgb3JpZ21vZGVsID0gb2xkY207CkBAIC05OSwyOSArMTAzLDI3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRDb2xvck1vZGVsKENvbG9yTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgaWYobW9kZWwgaW5zdGFuY2VvZiBJbmRleENvbG9yTW9kZWwgJiYKLSAgICAgICAgICAgICAgICBjYW5GaWx0ZXJJbmRleENvbG9yTW9kZWwpewotICAgICAgICAgICAgSW5kZXhDb2xvck1vZGVsIGljbSA9IChJbmRleENvbG9yTW9kZWwpIG1vZGVsOworICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJbmRleENvbG9yTW9kZWwgJiYgY2FuRmlsdGVySW5kZXhDb2xvck1vZGVsKSB7CisgICAgICAgICAgICBJbmRleENvbG9yTW9kZWwgaWNtID0gKEluZGV4Q29sb3JNb2RlbCltb2RlbDsKICAgICAgICAgICAgIENvbG9yTW9kZWwgZmlsdGVyZWRNb2RlbCA9IGZpbHRlckluZGV4Q29sb3JNb2RlbChpY20pOwogICAgICAgICAgICAgc3Vic3RpdHV0ZUNvbG9yTW9kZWwobW9kZWwsIGZpbHRlcmVkTW9kZWwpOwogICAgICAgICAgICAgY29uc3VtZXIuc2V0Q29sb3JNb2RlbChmaWx0ZXJlZE1vZGVsKTsKLSAgICAgICAgfWVsc2V7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjb25zdW1lci5zZXRDb2xvck1vZGVsKENvbG9yTW9kZWwuZ2V0UkdCZGVmYXVsdCgpKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBtb2RlbCwgCi0gICAgICAgICAgICBpbnRbXSBwaXhlbHMsIGludCBvZmYsIGludCBzY2Fuc2l6ZSkgewotICAgICAgICAKLSAgICAgICAgaWYobW9kZWwgPT0gbnVsbCB8fCBtb2RlbCA9PSBvcmlnbW9kZWwpeworICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBtb2RlbCwgaW50W10gcGl4ZWxzLCBpbnQgb2ZmLAorICAgICAgICAgICAgaW50IHNjYW5zaXplKSB7CisKKyAgICAgICAgaWYgKG1vZGVsID09IG51bGwgfHwgbW9kZWwgPT0gb3JpZ21vZGVsKSB7CiAgICAgICAgICAgICBjb25zdW1lci5zZXRQaXhlbHMoeCwgeSwgdywgaCwgbmV3bW9kZWwsIHBpeGVscywgb2ZmLCBzY2Fuc2l6ZSk7Ci0gICAgICAgIH1lbHNleworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaW50IHJnYlBpeGVsc1tdID0gbmV3IGludFt3XTsKLSAgICAgICAgICAgIGZvcihpbnQgc3kgPSB5LCBwaXhlbHNPZmYgPSBvZmY7IHN5IDwgeSArIGg7IAotICAgICAgICAgICAgICAgIHN5KyssIHBpeGVsc09mZiArPSBzY2Fuc2l6ZSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKGludCBzeCA9IHgsIGlkeCA9IDA7IHN4IDwgeCArIHc7IHN4KyssIGlkeCsrKXsKKyAgICAgICAgICAgIGZvciAoaW50IHN5ID0geSwgcGl4ZWxzT2ZmID0gb2ZmOyBzeSA8IHkgKyBoOyBzeSsrLCBwaXhlbHNPZmYgKz0gc2NhbnNpemUpIHsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IHN4ID0geCwgaWR4ID0gMDsgc3ggPCB4ICsgdzsgc3grKywgaWR4KyspIHsKICAgICAgICAgICAgICAgICAgICAgcmdiUGl4ZWxzW2lkeF0gPSBtb2RlbC5nZXRSR0IocGl4ZWxzW3BpeGVsc09mZiArIGlkeF0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmaWx0ZXJSR0JQaXhlbHMoeCwgc3ksIHcsIDEsIHJnYlBpeGVscywgMCwgdyk7CkBAIC0xMzAsMTkgKzEzMiwxNyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBtb2RlbCwgCi0gICAgICAgICAgICBieXRlW10gcGl4ZWxzLCBpbnQgb2ZmLCBpbnQgc2NhbnNpemUpIHsKLSAgICAgICAgCi0gICAgICAgIGlmKG1vZGVsID09IG51bGwgfHwgbW9kZWwgPT0gb3JpZ21vZGVsKXsKKyAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgbW9kZWwsIGJ5dGVbXSBwaXhlbHMsIGludCBvZmYsCisgICAgICAgICAgICBpbnQgc2NhbnNpemUpIHsKKworICAgICAgICBpZiAobW9kZWwgPT0gbnVsbCB8fCBtb2RlbCA9PSBvcmlnbW9kZWwpIHsKICAgICAgICAgICAgIGNvbnN1bWVyLnNldFBpeGVscyh4LCB5LCB3LCBoLCBuZXdtb2RlbCwgcGl4ZWxzLCBvZmYsIHNjYW5zaXplKTsKLSAgICAgICAgfWVsc2V7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpbnQgcmdiUGl4ZWxzW10gPSBuZXcgaW50W3ddOwotICAgICAgICAgICAgZm9yKGludCBzeSA9IHksIHBpeGVsc09mZiA9IG9mZjsgc3kgPCB5ICsgaDsgCi0gICAgICAgICAgICAgICAgc3krKywgcGl4ZWxzT2ZmICs9IHNjYW5zaXplKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoaW50IHN4ID0geCwgaWR4ID0gMDsgc3ggPCB4ICsgdzsgc3grKywgaWR4KyspewotICAgICAgICAgICAgICAgICAgICByZ2JQaXhlbHNbaWR4XSA9IAotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZ2V0UkdCKHBpeGVsc1twaXhlbHNPZmYgKyBpZHhdICYgMHhmZik7CisgICAgICAgICAgICBmb3IgKGludCBzeSA9IHksIHBpeGVsc09mZiA9IG9mZjsgc3kgPCB5ICsgaDsgc3krKywgcGl4ZWxzT2ZmICs9IHNjYW5zaXplKSB7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBzeCA9IHgsIGlkeCA9IDA7IHN4IDwgeCArIHc7IHN4KyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHJnYlBpeGVsc1tpZHhdID0gbW9kZWwuZ2V0UkdCKHBpeGVsc1twaXhlbHNPZmYgKyBpZHhdICYgMHhmZik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZpbHRlclJHQlBpeGVscyh4LCBzeSwgdywgMSwgcmdiUGl4ZWxzLCAwLCB3KTsKICAgICAgICAgICAgIH0KQEAgLTE1MCw0MSArMTUwLDQ2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRmlsdGVycyBhIHJlZ2lvbiBvZiBwaXhlbHMgaW4gdGhlIGRlZmF1bHQgUkdCIENvbG9yTW9kZWwgCi0gICAgICogYnkgY2FsbGluZyB0aGUgZmlsdGVyUkdCIG1ldGhvZCBmb3IgdGhlbS4KKyAgICAgKiBGaWx0ZXJzIGEgcmVnaW9uIG9mIHBpeGVscyBpbiB0aGUgZGVmYXVsdCBSR0IgQ29sb3JNb2RlbCBieSBjYWxsaW5nIHRoZQorICAgICAqIGZpbHRlclJHQiBtZXRob2QgZm9yIHRoZW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiByZWdpb24uCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiByZWdpb24uCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mcmVnaW9uLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgcmVnaW9uLgotICAgICAqIEBwYXJhbSBwaXhlbHMgdGhlIHBpeGVscyBhcnJheS4KLSAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmZzZXQgb2YgYXJyYXkuCi0gICAgICogQHBhcmFtIHNjYW5zaXplIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHJvd3Mgb2YgcGl4ZWxzIGluIHRoZSBhcnJheS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiByZWdpb24uCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgcmVnaW9uLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgcmVnaW9uLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlZ2lvbi4KKyAgICAgKiBAcGFyYW0gcGl4ZWxzCisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWxzIGFycmF5LgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgYXJyYXkuCisgICAgICogQHBhcmFtIHNjYW5zaXplCisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgYmV0d2VlbiByb3dzIG9mIHBpeGVscyBpbiB0aGUgYXJyYXkuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgZmlsdGVyUkdCUGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCAKLSAgICAgICAgICAgIGludFtdIHBpeGVscywgaW50IG9mZiwgaW50IHNjYW5zaXplKSB7Ci0gICAgICAgIAotICAgICAgICBmb3IoaW50IHN5ID0geSwgbGluZU9mZiA9IG9mZjsgc3kgPCB5ICsgaDsgc3krKywgbGluZU9mZiArPSBzY2Fuc2l6ZSl7Ci0gICAgICAgICAgICBmb3IoaW50IHN4ID0geCwgaWR4ID0gMDsgc3ggPCB4ICsgdzsgc3grKywgaWR4KyspewotICAgICAgICAgICAgICAgIHBpeGVsc1tsaW5lT2ZmICsgaWR4XSA9IAotICAgICAgICAgICAgICAgICAgICBmaWx0ZXJSR0Ioc3gsIHN5LCBwaXhlbHNbbGluZU9mZiArIGlkeF0pOworICAgIHB1YmxpYyB2b2lkIGZpbHRlclJHQlBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50W10gcGl4ZWxzLCBpbnQgb2ZmLCBpbnQgc2NhbnNpemUpIHsKKworICAgICAgICBmb3IgKGludCBzeSA9IHksIGxpbmVPZmYgPSBvZmY7IHN5IDwgeSArIGg7IHN5KyssIGxpbmVPZmYgKz0gc2NhbnNpemUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IHN4ID0geCwgaWR4ID0gMDsgc3ggPCB4ICsgdzsgc3grKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICBwaXhlbHNbbGluZU9mZiArIGlkeF0gPSBmaWx0ZXJSR0Ioc3gsIHN5LCBwaXhlbHNbbGluZU9mZiArIGlkeF0pOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGNvbnN1bWVyLnNldFBpeGVscyh4LCB5LCB3LCBoLCBDb2xvck1vZGVsLmdldFJHQmRlZmF1bHQoKSwgCi0gICAgICAgICAgICAgICAgcGl4ZWxzLCBvZmYsIHNjYW5zaXplKTsKKyAgICAgICAgY29uc3VtZXIuc2V0UGl4ZWxzKHgsIHksIHcsIGgsIENvbG9yTW9kZWwuZ2V0UkdCZGVmYXVsdCgpLCBwaXhlbHMsIG9mZiwgc2NhbnNpemUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvdmVydHMgYSBzaW5nbGUgaW5wdXQgcGl4ZWwgaW4gdGhlIGRlZmF1bHQgUkdCIENvbG9yTW9kZWwgCi0gICAgICogdG8gYSBzaW5nbGUgb3V0cHV0IHBpeGVsLgorICAgICAqIENvbnZlcnRzIGEgc2luZ2xlIGlucHV0IHBpeGVsIGluIHRoZSBkZWZhdWx0IFJHQiBDb2xvck1vZGVsIHRvIGEgc2luZ2xlCisgICAgICogb3V0cHV0IHBpeGVsLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIHBpeGVsJ3MgY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBwaXhlbCdzIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHJnYiBhIHBpeGVsIGluIHRoZSBkZWZhdWx0IFJHQiBjb2xvciBtb2RlbC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggcGl4ZWwncyBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBwaXhlbCdzIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHJnYgorICAgICAqICAgICAgICAgICAgYSBwaXhlbCBpbiB0aGUgZGVmYXVsdCBSR0IgY29sb3IgbW9kZWwuCiAgICAgICogQHJldHVybiBhIGZpbHRlcmVkIHBpeGVsIGluIHRoZSBkZWZhdWx0IFJHQiBjb2xvciBtb2RlbC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGZpbHRlclJHQihpbnQgeCwgaW50IHksIGludCByZ2IpOwogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9SYXN0ZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9SYXN0ZXIuamF2YQppbmRleCA0YjI0MjZlLi42NzQ5ZmRlIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvUmFzdGVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL1Jhc3Rlci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEuYXd0LlBvaW50OwpAQCAtMjcsNzAgKzI4LDk1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIFJhc3RlciBjbGFzcyByZXByZXNlbnRzIGEgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCi0gKiBUaGlzIGNsYXNzIGlzIGRlZmluZWQgYnkgRGF0YUJ1ZmZlciBhbmQgU2FtcGxlTW9kZWwgb2JqZWN0cy4gCi0gKiBUaGUgRGF0YUJ1ZmZlciBvYmplY3Qgc3RvcmVzIHNhbXBsZSB2YWx1ZXMgYW5kIERTYW1wbGVNb2RlbCBkZWZpbmVzIAotICogdGhlIGxvY2F0aW9uIG9mIHNhbXBsZSBpbiB0aGlzIERhdGFCdWZmZXIuIAorICogVGhlIFJhc3RlciBjbGFzcyByZXByZXNlbnRzIGEgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuIFRoaXMgY2xhc3MgaXMKKyAqIGRlZmluZWQgYnkgRGF0YUJ1ZmZlciBhbmQgU2FtcGxlTW9kZWwgb2JqZWN0cy4gVGhlIERhdGFCdWZmZXIgb2JqZWN0IHN0b3JlcworICogc2FtcGxlIHZhbHVlcyBhbmQgRFNhbXBsZU1vZGVsIGRlZmluZXMgdGhlIGxvY2F0aW9uIG9mIHNhbXBsZSBpbiB0aGlzCisgKiBEYXRhQnVmZmVyLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFJhc3RlciB7CiAKLSAgICAvKiogVGhlIERhdGFCdWZmZXIgb2YgdGhpcyBSYXN0ZXIuICovCisgICAgLyoqCisgICAgICogVGhlIERhdGFCdWZmZXIgb2YgdGhpcyBSYXN0ZXIuCisgICAgICovCiAgICAgcHJvdGVjdGVkIERhdGFCdWZmZXIgZGF0YUJ1ZmZlcjsKIAotICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoaXMgUmFzdGVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBoZWlnaHQgb2YgdGhpcyBSYXN0ZXIuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBoZWlnaHQ7CiAKLSAgICAvKiogVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBwaXhlbCBpbiB0aGlzIFJhc3Rlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IHBpeGVsIGluIHRoaXMgUmFzdGVyLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgbWluWDsKIAotICAgIC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IHBpeGVsIGluIHRoaXMgUmFzdGVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgcGl4ZWwgaW4gdGhpcyBSYXN0ZXIuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBtaW5ZOwogCi0gICAgLyoqIFRoZSBudW1iZXIgb2YgYmFuZHMgaW4gdGhpcyBSYXN0ZXIuICovCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBiYW5kcyBpbiB0aGlzIFJhc3Rlci4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IG51bUJhbmRzOwogCi0gICAgLyoqIFRoZSBudW1iZXIgb2YgZGF0YSBlbGVtZW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGRhdGEgZWxlbWVudHMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBudW1EYXRhRWxlbWVudHM7CiAKLSAgICAvKiogVGhlIHBhcmVudCBvZiB0aGlzIFJhc3Rlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcGFyZW50IG9mIHRoaXMgUmFzdGVyLgorICAgICAqLwogICAgIHByb3RlY3RlZCBSYXN0ZXIgcGFyZW50OwogCi0gICAgLyoqIFRoZSBTYW1wbGVNb2RlbCBvZiB0aGlzIFJhc3Rlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgU2FtcGxlTW9kZWwgb2YgdGhpcyBSYXN0ZXIuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFNhbXBsZU1vZGVsIHNhbXBsZU1vZGVsOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBYIHRyYW5zbGF0aW9uIGZyb20gdGhlIGNvb3JkaW5hdGUgc3BhY2Ugb2YgdGhlIAotICAgICAqIFNhbXBsZU1vZGVsIG9mIHRoaXMgUmFzdGVyLgorICAgIC8qKgorICAgICAqIFRoZSBYIHRyYW5zbGF0aW9uIGZyb20gdGhlIGNvb3JkaW5hdGUgc3BhY2Ugb2YgdGhlIFNhbXBsZU1vZGVsIG9mIHRoaXMKKyAgICAgKiBSYXN0ZXIuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBzYW1wbGVNb2RlbFRyYW5zbGF0ZVg7CiAKLSAgICAvKiogCi0gICAgICogVGhlIFkgdHJhbnNsYXRpb24gZnJvbSB0aGUgY29vcmRpbmF0ZSBzcGFjZSBvZiB0aGUgCi0gICAgICogU2FtcGxlTW9kZWwgb2YgdGhpcyBSYXN0ZXIuCisgICAgLyoqCisgICAgICogVGhlIFkgdHJhbnNsYXRpb24gZnJvbSB0aGUgY29vcmRpbmF0ZSBzcGFjZSBvZiB0aGUgU2FtcGxlTW9kZWwgb2YgdGhpcworICAgICAqIFJhc3Rlci4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHNhbXBsZU1vZGVsVHJhbnNsYXRlWTsKIAotICAgIC8qKiBUaGUgd2lkdGggb2YgdGhpcyBSYXN0ZXIuICovCisgICAgLyoqCisgICAgICogVGhlIHdpZHRoIG9mIHRoaXMgUmFzdGVyLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgd2lkdGg7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUmFzdGVyIG9iamVjdCB3aXRoIGEgQmFuZGVkU2FtcGxlTW9kZWwgYW5kIHRoZSBzcGVjaWZpZWQgCisgICAgICogQ3JlYXRlcyBhIFJhc3RlciBvYmplY3Qgd2l0aCBhIEJhbmRlZFNhbXBsZU1vZGVsIGFuZCB0aGUgc3BlY2lmaWVkCiAgICAgICogRGF0YUJ1ZmZlci4gVGhlIG51bWJlciBvZiBiYW5kcyBpcyBkZWZpbmVkIGJ5IHRoZSBsZW5ndGggb2YgYmFuZE9mZnNldHMKICAgICAgKiBvciBiYW5rSW5kaWNlcyBhcnJheXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFCdWZmZXIgdGhlIHNwZWNpZmllZCBEYXRhQnVmZmVyLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLiAKLSAgICAgKiBAcGFyYW0gYmFua0luZGljZXMgdGhlIGJhbmsgaW5kaWNlcyBvZiBiYW5kcy4KLSAgICAgKiBAcGFyYW0gYmFuZE9mZnNldHMgdGhlIGJhbmQgb2Zmc2V0cyBvZiBiYW5kcy4KLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIAotICAgICAqIG9mIFJhc3Rlci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0YUJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBEYXRhQnVmZmVyLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHNjYW5saW5lU3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgc2NhbmxpbmUgc3RyaWRlIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBiYW5rSW5kaWNlcworICAgICAqICAgICAgICAgICAgdGhlIGJhbmsgaW5kaWNlcyBvZiBiYW5kcy4KKyAgICAgKiBAcGFyYW0gYmFuZE9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYW5kIG9mZnNldHMgb2YgYmFuZHMuCisgICAgICogQHBhcmFtIGxvY2F0aW9uCisgICAgICogICAgICAgICAgICB0aGUgbG9jYXRpb24gd2hpY2ggZGVmaW5lcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgUmFzdGVyLgogICAgICAqIEByZXR1cm4gdGhlIFdyaXRhYmxlUmFzdGVyIG9iamVjdC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZUJhbmRlZFJhc3RlcihEYXRhQnVmZmVyIGRhdGFCdWZmZXIsCi0gICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBzY2FubGluZVN0cmlkZSwgaW50IGJhbmtJbmRpY2VzW10sCi0gICAgICAgICAgICBpbnQgYmFuZE9mZnNldHNbXSwgUG9pbnQgbG9jYXRpb24pIHsKKyAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZUJhbmRlZFJhc3RlcihEYXRhQnVmZmVyIGRhdGFCdWZmZXIsIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgIGludCBzY2FubGluZVN0cmlkZSwgaW50IGJhbmtJbmRpY2VzW10sIGludCBiYW5kT2Zmc2V0c1tdLCBQb2ludCBsb2NhdGlvbikgewogCiAgICAgICAgIGlmICh3IDw9IDAgfHwgaCA8PSAwKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjJFPXcgb3IgaCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybwpAQCAtMTAxLDkgKzEyNyw5IEBACiAgICAgICAgICAgICBsb2NhdGlvbiA9IG5ldyBQb2ludCgwLCAwKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgobG9uZykgbG9jYXRpb24ueCArIHcgPiBJbnRlZ2VyLk1BWF9WQUxVRQotICAgICAgICAgICAgICAgIHx8IChsb25nKSBsb2NhdGlvbi55ICsgaCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjc2PWxvY2F0aW9uLnggKyB3IG9yIGxvY2F0aW9uLnkgKyBoIHJlc3VsdHMgaW4gaW50ZWdlciBvdmVyZmxvdworICAgICAgICBpZiAoKGxvbmcpbG9jYXRpb24ueCArIHcgPiBJbnRlZ2VyLk1BWF9WQUxVRSB8fCAobG9uZylsb2NhdGlvbi55ICsgaCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAvLyBhd3QuMjc2PWxvY2F0aW9uLnggKyB3IG9yIGxvY2F0aW9uLnkgKyBoIHJlc3VsdHMgaW4gaW50ZWdlcgorICAgICAgICAgICAgLy8gb3ZlcmZsb3cKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjc2IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIApAQCAtMTE5LDM5ICsxNDUsNDMgQEAKIAogICAgICAgICBpbnQgZGF0YVR5cGUgPSBkYXRhQnVmZmVyLmdldERhdGFUeXBlKCk7CiAKLSAgICAgICAgaWYgKGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFCi0gICAgICAgICAgICAgICAgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVAorICAgICAgICBpZiAoZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVAogICAgICAgICAgICAgICAgICYmIGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9JTlQpIHsKICAgICAgICAgICAgIC8vIGF3dC4yMzA9ZGF0YVR5cGUgaXMgbm90IG9uZSBvZiB0aGUgc3VwcG9ydGVkIGRhdGEgdHlwZXMKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjMwIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBCYW5kZWRTYW1wbGVNb2RlbCBzYW1wbGVNb2RlbCA9IG5ldyBCYW5kZWRTYW1wbGVNb2RlbChkYXRhVHlwZSwgdywgaCwKLSAgICAgICAgICAgICAgICBzY2FubGluZVN0cmlkZSwgYmFua0luZGljZXMsIGJhbmRPZmZzZXRzKTsKKyAgICAgICAgQmFuZGVkU2FtcGxlTW9kZWwgc2FtcGxlTW9kZWwgPSBuZXcgQmFuZGVkU2FtcGxlTW9kZWwoZGF0YVR5cGUsIHcsIGgsIHNjYW5saW5lU3RyaWRlLAorICAgICAgICAgICAgICAgIGJhbmtJbmRpY2VzLCBiYW5kT2Zmc2V0cyk7CiAKICAgICAgICAgcmV0dXJuIG5ldyBPcmRpbmFyeVdyaXRhYmxlUmFzdGVyKHNhbXBsZU1vZGVsLCBkYXRhQnVmZmVyLCBsb2NhdGlvbik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFJhc3RlciBvYmplY3Qgd2l0aCBhIEJhbmRlZFNhbXBsZU1vZGVsIGFuZCB0aGUgc3BlY2lmaWVkCi0gICAgICogZGF0YSB0eXBlLiBUaGUgRGF0YSB0eXBlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gICAgICogVFlQRV9CWVRFLCBUWVBFX1VTSE9SVCwgb3IgVFlQRV9JTlQuIAorICAgICAqIENyZWF0ZXMgYSBSYXN0ZXIgb2JqZWN0IHdpdGggYSBCYW5kZWRTYW1wbGVNb2RlbCBhbmQgdGhlIHNwZWNpZmllZCBkYXRhCisgICAgICogdHlwZS4gVGhlIERhdGEgdHlwZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBUWVBFX0JZVEUsCisgICAgICogVFlQRV9VU0hPUlQsIG9yIFRZUEVfSU5ULgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0aGUgZGF0YSB0eXBlIG9mIHRoZSBzYW1wbGVzOgotICAgICAqIFRZUEVfQllURSwgVFlQRV9VU0hPUlQsIG9yIFRZUEVfSU5ULiAKLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4gCi0gICAgICogQHBhcmFtIHNjYW5saW5lU3RyaWRlIHRoZSBzY2FubGluZSBzdHJpZGUgb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGJhbmtJbmRpY2VzIHRoZSBiYW5rIGluZGljZXMgb2YgYmFuZHMuCi0gICAgICogQHBhcmFtIGJhbmRPZmZzZXRzIHRoZSBiYW5kIG9mZnNldHMgb2YgYmFuZHMuCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiB3aGljaCBkZWZpbmVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciAKLSAgICAgKiBvZiB0aGUgUmFzdGVyLgotICAgICAqIAorICAgICAqIEBwYXJhbSBkYXRhVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHlwZSBvZiB0aGUgc2FtcGxlczogVFlQRV9CWVRFLCBUWVBFX1VTSE9SVCwgb3IKKyAgICAgKiAgICAgICAgICAgIFRZUEVfSU5ULgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHNjYW5saW5lU3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgc2NhbmxpbmUgc3RyaWRlIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBiYW5rSW5kaWNlcworICAgICAqICAgICAgICAgICAgdGhlIGJhbmsgaW5kaWNlcyBvZiBiYW5kcy4KKyAgICAgKiBAcGFyYW0gYmFuZE9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYW5kIG9mZnNldHMgb2YgYmFuZHMuCisgICAgICogQHBhcmFtIGxvY2F0aW9uCisgICAgICogICAgICAgICAgICB0aGUgbG9jYXRpb24gd2hpY2ggZGVmaW5lcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlCisgICAgICogICAgICAgICAgICBSYXN0ZXIuCiAgICAgICogQHJldHVybiB0aGUgV3JpdGFibGVSYXN0ZXIgb2JqZWN0LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlQmFuZGVkUmFzdGVyKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLAotICAgICAgICAgICAgaW50IHNjYW5saW5lU3RyaWRlLCBpbnQgYmFua0luZGljZXNbXSwgaW50IGJhbmRPZmZzZXRzW10sCi0gICAgICAgICAgICBQb2ludCBsb2NhdGlvbikgeworICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlQmFuZGVkUmFzdGVyKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLCBpbnQgc2NhbmxpbmVTdHJpZGUsCisgICAgICAgICAgICBpbnQgYmFua0luZGljZXNbXSwgaW50IGJhbmRPZmZzZXRzW10sIFBvaW50IGxvY2F0aW9uKSB7CiAKICAgICAgICAgaWYgKHcgPD0gMCB8fCBoIDw9IDApIHsKICAgICAgICAgICAgIC8vIGF3dC4yMkU9dyBvciBoIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvCkBAIC0xNjIsOSArMTkyLDkgQEAKICAgICAgICAgICAgIGxvY2F0aW9uID0gbmV3IFBvaW50KDAsIDApOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChsb25nKSBsb2NhdGlvbi54ICsgdyA+IEludGVnZXIuTUFYX1ZBTFVFCi0gICAgICAgICAgICAgICAgfHwgKGxvbmcpIGxvY2F0aW9uLnkgKyBoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yNzY9bG9jYXRpb24ueCArIHcgb3IgbG9jYXRpb24ueSArIGggcmVzdWx0cyBpbiBpbnRlZ2VyIG92ZXJmbG93CisgICAgICAgIGlmICgobG9uZylsb2NhdGlvbi54ICsgdyA+IEludGVnZXIuTUFYX1ZBTFVFIHx8IChsb25nKWxvY2F0aW9uLnkgKyBoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIC8vIGF3dC4yNzY9bG9jYXRpb24ueCArIHcgb3IgbG9jYXRpb24ueSArIGggcmVzdWx0cyBpbiBpbnRlZ2VyCisgICAgICAgICAgICAvLyBvdmVyZmxvdwogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNzYiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCkBAIC0xNzMsOCArMjAzLDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjc3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUKLSAgICAgICAgICAgICAgICAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUCisgICAgICAgIGlmIChkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURSAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUCiAgICAgICAgICAgICAgICAgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVCkgewogICAgICAgICAgICAgLy8gYXd0LjIzMD1kYXRhVHlwZSBpcyBub3Qgb25lIG9mIHRoZSBzdXBwb3J0ZWQgZGF0YSB0eXBlcwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMzAiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTE5OCwzNyArMjI3LDQwIEBACiAgICAgICAgIERhdGFCdWZmZXIgZGF0YSA9IG51bGw7CiAKICAgICAgICAgc3dpdGNoIChkYXRhVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyQnl0ZShkYXRhU2l6ZSwgbnVtQmFua3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlclVTaG9ydChkYXRhU2l6ZSwgbnVtQmFua3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckludChkYXRhU2l6ZSwgbnVtQmFua3MpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckJ5dGUoZGF0YVNpemUsIG51bUJhbmtzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJVU2hvcnQoZGF0YVNpemUsIG51bUJhbmtzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJJbnQoZGF0YVNpemUsIG51bUJhbmtzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlQmFuZGVkUmFzdGVyKGRhdGEsIHcsIGgsIHNjYW5saW5lU3RyaWRlLCBiYW5rSW5kaWNlcywKLSAgICAgICAgICAgICAgICBiYW5kT2Zmc2V0cywgbG9jYXRpb24pOworICAgICAgICByZXR1cm4gY3JlYXRlQmFuZGVkUmFzdGVyKGRhdGEsIHcsIGgsIHNjYW5saW5lU3RyaWRlLCBiYW5rSW5kaWNlcywgYmFuZE9mZnNldHMsIGxvY2F0aW9uKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUmFzdGVyIG9iamVjdCB3aXRoIGEgQmFuZGVkU2FtcGxlTW9kZWwgYW5kIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBkYXRhIHR5cGUuIFRoZSBEYXRhIHR5cGUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAgICAgKiBUWVBFX0JZVEUsIFRZUEVfVVNIT1JULCBvciBUWVBFX0lOVC4gCisgICAgICogQ3JlYXRlcyBhIFJhc3RlciBvYmplY3Qgd2l0aCBhIEJhbmRlZFNhbXBsZU1vZGVsIGFuZCB0aGUgc3BlY2lmaWVkIGRhdGEKKyAgICAgKiB0eXBlLiBUaGUgRGF0YSB0eXBlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IFRZUEVfQllURSwKKyAgICAgKiBUWVBFX1VTSE9SVCwgb3IgVFlQRV9JTlQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHNhbXBsZXM6Ci0gICAgICogVFlQRV9CWVRFLCBUWVBFX1VTSE9SVCwgb3IgVFlQRV9JTlQuIAotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLiAKLSAgICAgKiBAcGFyYW0gYmFuZHMgdGhlIG51bWJlciBvZiBiYW5kcy4KLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIAotICAgICAqIG9mIHRoZSBSYXN0ZXIuCi0gICAgICogCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlIG9mIHRoZSBzYW1wbGVzOiBUWVBFX0JZVEUsIFRZUEVfVVNIT1JULCBvcgorICAgICAqICAgICAgICAgICAgVFlQRV9JTlQuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gYmFuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYmFuZHMuCisgICAgICogQHBhcmFtIGxvY2F0aW9uCisgICAgICogICAgICAgICAgICB0aGUgbG9jYXRpb24gd2hpY2ggZGVmaW5lcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlCisgICAgICogICAgICAgICAgICBSYXN0ZXIuCiAgICAgICogQHJldHVybiB0aGUgV3JpdGFibGVSYXN0ZXIgb2JqZWN0LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlQmFuZGVkUmFzdGVyKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLAotICAgICAgICAgICAgaW50IGJhbmRzLCBQb2ludCBsb2NhdGlvbikgeworICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlQmFuZGVkUmFzdGVyKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLCBpbnQgYmFuZHMsCisgICAgICAgICAgICBQb2ludCBsb2NhdGlvbikgewogCiAgICAgICAgIGlmICh3IDw9IDAgfHwgaCA8PSAwKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjJFPXcgb3IgaCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybwpAQCAtMjM5LDkgKzI3MSw5IEBACiAgICAgICAgICAgICBsb2NhdGlvbiA9IG5ldyBQb2ludCgwLCAwKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgobG9uZykgbG9jYXRpb24ueCArIHcgPiBJbnRlZ2VyLk1BWF9WQUxVRQotICAgICAgICAgICAgICAgIHx8IChsb25nKSBsb2NhdGlvbi55ICsgaCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjc2PWxvY2F0aW9uLnggKyB3IG9yIGxvY2F0aW9uLnkgKyBoIHJlc3VsdHMgaW4gaW50ZWdlciBvdmVyZmxvdworICAgICAgICBpZiAoKGxvbmcpbG9jYXRpb24ueCArIHcgPiBJbnRlZ2VyLk1BWF9WQUxVRSB8fCAobG9uZylsb2NhdGlvbi55ICsgaCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAvLyBhd3QuMjc2PWxvY2F0aW9uLnggKyB3IG9yIGxvY2F0aW9uLnkgKyBoIHJlc3VsdHMgaW4gaW50ZWdlcgorICAgICAgICAgICAgLy8gb3ZlcmZsb3cKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjc2IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIApAQCAtMjU3LDI4ICsyODksMzIgQEAKICAgICAgICAgICAgIGJhbmRPZmZzZXRzW2ldID0gMDsKICAgICAgICAgICAgIGJhbmtJbmRpY2VzW2ldID0gaTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlQmFuZGVkUmFzdGVyKGRhdGFUeXBlLCB3LCBoLCB3LCBiYW5rSW5kaWNlcywgYmFuZE9mZnNldHMsCi0gICAgICAgICAgICAgICAgbG9jYXRpb24pOworICAgICAgICByZXR1cm4gY3JlYXRlQmFuZGVkUmFzdGVyKGRhdGFUeXBlLCB3LCBoLCB3LCBiYW5rSW5kaWNlcywgYmFuZE9mZnNldHMsIGxvY2F0aW9uKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUmFzdGVyIG9iamVjdCB3aXRoIGEgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsIAotICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIERhdGFCdWZmZXIuIAorICAgICAqIENyZWF0ZXMgYSBSYXN0ZXIgb2JqZWN0IHdpdGggYSBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwgYW5kIHRoZQorICAgICAqIHNwZWNpZmllZCBEYXRhQnVmZmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQnVmZmVyIHRoZSBEYXRhQnVmZmVyLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gc2NhbmxpbmVTdHJpZGUgdGhlIHNjYW5saW5lIHN0cmlkZSBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gcGl4ZWxTdHJpZGUgdGhlIHBpeGVsIHN0cmlkZSBvZiBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBiYW5kT2Zmc2V0cyB0aGUgYmFuZCBvZmZzZXRzIG9mIGJhbmRzLgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gd2hpY2ggZGVmaW5lcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgCi0gICAgICogb2YgdGhlIFJhc3Rlci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0YUJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIERhdGFCdWZmZXIuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHNjYW5saW5lU3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgc2NhbmxpbmUgc3RyaWRlIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBwaXhlbFN0cmlkZQorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsIHN0cmlkZSBvZiBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBiYW5kT2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIGJhbmQgb2Zmc2V0cyBvZiBiYW5kcy4KKyAgICAgKiBAcGFyYW0gbG9jYXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhdGlvbiB3aGljaCBkZWZpbmVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgIFJhc3Rlci4KICAgICAgKiBAcmV0dXJuIHRoZSBXcml0YWJsZVJhc3RlciBvYmplY3QuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihEYXRhQnVmZmVyIGRhdGFCdWZmZXIsCi0gICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBzY2FubGluZVN0cmlkZSwgaW50IHBpeGVsU3RyaWRlLAotICAgICAgICAgICAgaW50IGJhbmRPZmZzZXRzW10sIFBvaW50IGxvY2F0aW9uKSB7CisgICAgcHVibGljIHN0YXRpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihEYXRhQnVmZmVyIGRhdGFCdWZmZXIsIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgIGludCBzY2FubGluZVN0cmlkZSwgaW50IHBpeGVsU3RyaWRlLCBpbnQgYmFuZE9mZnNldHNbXSwgUG9pbnQgbG9jYXRpb24pIHsKIAogICAgICAgICBpZiAodyA8PSAwIHx8IGggPD0gMCkgewogICAgICAgICAgICAgLy8gYXd0LjIyRT13IG9yIGggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8KQEAgLTI4OSw5ICszMjUsOSBAQAogICAgICAgICAgICAgbG9jYXRpb24gPSBuZXcgUG9pbnQoMCwgMCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKGxvbmcpIGxvY2F0aW9uLnggKyB3ID4gSW50ZWdlci5NQVhfVkFMVUUKLSAgICAgICAgICAgICAgICB8fCAobG9uZykgbG9jYXRpb24ueSArIGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewotICAgICAgICAgICAgLy8gYXd0LjI3Nj1sb2NhdGlvbi54ICsgdyBvciBsb2NhdGlvbi55ICsgaCByZXN1bHRzIGluIGludGVnZXIgb3ZlcmZsb3cKKyAgICAgICAgaWYgKChsb25nKWxvY2F0aW9uLnggKyB3ID4gSW50ZWdlci5NQVhfVkFMVUUgfHwgKGxvbmcpbG9jYXRpb24ueSArIGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgLy8gYXd0LjI3Nj1sb2NhdGlvbi54ICsgdyBvciBsb2NhdGlvbi55ICsgaCByZXN1bHRzIGluIGludGVnZXIKKyAgICAgICAgICAgIC8vIG92ZXJmbG93CiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3NiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKQEAgLTMwMSw4ICszMzcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50IGRhdGFUeXBlID0gZGF0YUJ1ZmZlci5nZXREYXRhVHlwZSgpOwotICAgICAgICBpZiAoZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUKLSAgICAgICAgICAgICAgICAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUKSB7CisgICAgICAgIGlmIChkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURSAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjMwPWRhdGFUeXBlIGlzIG5vdCBvbmUgb2YgdGhlIHN1cHBvcnRlZCBkYXRhIHR5cGVzCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIzMCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CkBAIC0zMTcsMzUgKzM1MiwzOCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3QiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsIHNhbXBsZU1vZGVsID0gCi0gICAgICAgICAgICBuZXcgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsKGRhdGFUeXBlLCB3LCBoLCAKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxTdHJpZGUsIHNjYW5saW5lU3RyaWRlLCBiYW5kT2Zmc2V0cyk7CisgICAgICAgIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCBzYW1wbGVNb2RlbCA9IG5ldyBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwoZGF0YVR5cGUsIHcsIGgsCisgICAgICAgICAgICAgICAgcGl4ZWxTdHJpZGUsIHNjYW5saW5lU3RyaWRlLCBiYW5kT2Zmc2V0cyk7CiAKICAgICAgICAgcmV0dXJuIG5ldyBPcmRpbmFyeVdyaXRhYmxlUmFzdGVyKHNhbXBsZU1vZGVsLCBkYXRhQnVmZmVyLCBsb2NhdGlvbik7CiAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUmFzdGVyIG9iamVjdCB3aXRoIGEgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsIAotICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIGRhdGEgdHlwZS4gVGhlIERhdGEgdHlwZSBjYW4gYmUgb25lIG9mIHRoZSAKLSAgICAgKiBmb2xsb3dpbmcgdmFsdWVzOgotICAgICAqIFRZUEVfQllURSwgVFlQRV9VU0hPUlQsIG9yIFRZUEVfSU5ULiAKKyAgICAgKiBDcmVhdGVzIGEgUmFzdGVyIG9iamVjdCB3aXRoIGEgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsIGFuZCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgZGF0YSB0eXBlLiBUaGUgRGF0YSB0eXBlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICAgICogVFlQRV9CWVRFLCBUWVBFX1VTSE9SVCwgb3IgVFlQRV9JTlQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHNhbXBsZXM6Ci0gICAgICogVFlQRV9CWVRFLCBUWVBFX1VTSE9SVCwgb3IgVFlQRV9JTlQuIAotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gc2NhbmxpbmVTdHJpZGUgdGhlIHNjYW5saW5lIHN0cmlkZSBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gcGl4ZWxTdHJpZGUgdGhlIHBpeGVsIHN0cmlkZSBvZiBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBiYW5kT2Zmc2V0cyB0aGUgYmFuZCBvZmZzZXRzIG9mIGJhbmRzLgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gd2hpY2ggZGVmaW5lcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgCi0gICAgICogb2YgdGhlIFJhc3Rlci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHNhbXBsZXM6IFRZUEVfQllURSwgVFlQRV9VU0hPUlQsIG9yCisgICAgICogICAgICAgICAgICBUWVBFX0lOVC4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gc2NhbmxpbmVTdHJpZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2FubGluZSBzdHJpZGUgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHBpeGVsU3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwgc3RyaWRlIG9mIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGJhbmRPZmZzZXRzCisgICAgICogICAgICAgICAgICB0aGUgYmFuZCBvZmZzZXRzIG9mIGJhbmRzLgorICAgICAqIEBwYXJhbSBsb2NhdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZQorICAgICAqICAgICAgICAgICAgUmFzdGVyLgogICAgICAqIEByZXR1cm4gdGhlIFdyaXRhYmxlUmFzdGVyIG9iamVjdC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZUludGVybGVhdmVkUmFzdGVyKGludCBkYXRhVHlwZSwgaW50IHcsCi0gICAgICAgICAgICBpbnQgaCwgaW50IHNjYW5saW5lU3RyaWRlLCBpbnQgcGl4ZWxTdHJpZGUsIGludCBiYW5kT2Zmc2V0c1tdLAotICAgICAgICAgICAgUG9pbnQgbG9jYXRpb24pIHsKKyAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZUludGVybGVhdmVkUmFzdGVyKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLAorICAgICAgICAgICAgaW50IHNjYW5saW5lU3RyaWRlLCBpbnQgcGl4ZWxTdHJpZGUsIGludCBiYW5kT2Zmc2V0c1tdLCBQb2ludCBsb2NhdGlvbikgewogCiAgICAgICAgIGlmICh3IDw9IDAgfHwgaCA8PSAwKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjJFPXcgb3IgaCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybwpAQCAtMzU2LDE0ICszOTQsMTMgQEAKICAgICAgICAgICAgIGxvY2F0aW9uID0gbmV3IFBvaW50KDAsIDApOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChsb25nKSBsb2NhdGlvbi54ICsgdyA+IEludGVnZXIuTUFYX1ZBTFVFCi0gICAgICAgICAgICAgICAgfHwgKGxvbmcpIGxvY2F0aW9uLnkgKyBoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yNzY9bG9jYXRpb24ueCArIHcgb3IgbG9jYXRpb24ueSArIGggcmVzdWx0cyBpbiBpbnRlZ2VyIG92ZXJmbG93CisgICAgICAgIGlmICgobG9uZylsb2NhdGlvbi54ICsgdyA+IEludGVnZXIuTUFYX1ZBTFVFIHx8IChsb25nKWxvY2F0aW9uLnkgKyBoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIC8vIGF3dC4yNzY9bG9jYXRpb24ueCArIHcgb3IgbG9jYXRpb24ueSArIGggcmVzdWx0cyBpbiBpbnRlZ2VyCisgICAgICAgICAgICAvLyBvdmVyZmxvdwogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNzYiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIGlmIChkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURQotICAgICAgICAgICAgICAgICYmIGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9VU0hPUlQpIHsKKyAgICAgICAgaWYgKGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFICYmIGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9VU0hPUlQpIHsKICAgICAgICAgICAgIC8vIGF3dC4yMzA9ZGF0YVR5cGUgaXMgbm90IG9uZSBvZiB0aGUgc3VwcG9ydGVkIGRhdGEgdHlwZXMKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjMwIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KQEAgLTM4MywzNiArNDIwLDM4IEBACiAgICAgICAgIERhdGFCdWZmZXIgZGF0YSA9IG51bGw7CiAKICAgICAgICAgc3dpdGNoIChkYXRhVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyQnl0ZShzaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJVU2hvcnQoc2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyQnl0ZShzaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJVU2hvcnQoc2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gY3JlYXRlSW50ZXJsZWF2ZWRSYXN0ZXIoZGF0YSwgdywgaCwgc2NhbmxpbmVTdHJpZGUsIHBpeGVsU3RyaWRlLAotICAgICAgICAgICAgICAgIGJhbmRPZmZzZXRzLCBsb2NhdGlvbik7CisgICAgICAgIHJldHVybiBjcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihkYXRhLCB3LCBoLCBzY2FubGluZVN0cmlkZSwgcGl4ZWxTdHJpZGUsIGJhbmRPZmZzZXRzLAorICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUmFzdGVyIG9iamVjdCB3aXRoIGEgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsIAotICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIGRhdGEgdHlwZS4gVGhlIERhdGEgdHlwZSBjYW4gYmUgb25lIG9mIHRoZSAKLSAgICAgKiBmb2xsb3dpbmcgdmFsdWVzOgotICAgICAqIFRZUEVfQllURSwgVFlQRV9VU0hPUlQsIG9yIFRZUEVfSU5ULiAKKyAgICAgKiBDcmVhdGVzIGEgUmFzdGVyIG9iamVjdCB3aXRoIGEgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsIGFuZCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgZGF0YSB0eXBlLiBUaGUgRGF0YSB0eXBlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICAgICogVFlQRV9CWVRFLCBUWVBFX1VTSE9SVCwgb3IgVFlQRV9JTlQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUgb2Ygc2FtcGxlczoKLSAgICAgKiBUWVBFX0JZVEUsIFRZUEVfVVNIT1JULCBvciBUWVBFX0lOVC4gCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBiYW5kcyB0aGUgbnVtYmVyIG9mIGJhbmRzLgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gd2hpY2ggZGVmaW5lcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgCi0gICAgICogb2YgdGhlIFJhc3Rlci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUgb2Ygc2FtcGxlczogVFlQRV9CWVRFLCBUWVBFX1VTSE9SVCwgb3IgVFlQRV9JTlQuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGJhbmRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJhbmRzLgorICAgICAqIEBwYXJhbSBsb2NhdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZQorICAgICAqICAgICAgICAgICAgUmFzdGVyLgogICAgICAqIEByZXR1cm4gdGhlIFdyaXRhYmxlUmFzdGVyLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlSW50ZXJsZWF2ZWRSYXN0ZXIoaW50IGRhdGFUeXBlLCBpbnQgdywKLSAgICAgICAgICAgIGludCBoLCBpbnQgYmFuZHMsIFBvaW50IGxvY2F0aW9uKSB7CisgICAgcHVibGljIHN0YXRpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwgaW50IGJhbmRzLAorICAgICAgICAgICAgUG9pbnQgbG9jYXRpb24pIHsKIAogICAgICAgICBpZiAodyA8PSAwIHx8IGggPD0gMCkgewogICAgICAgICAgICAgLy8gYXd0LjIyRT13IG9yIGggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8KQEAgLTQyMywxNCArNDYyLDEzIEBACiAgICAgICAgICAgICBsb2NhdGlvbiA9IG5ldyBQb2ludCgwLCAwKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgobG9uZykgbG9jYXRpb24ueCArIHcgPiBJbnRlZ2VyLk1BWF9WQUxVRQotICAgICAgICAgICAgICAgIHx8IChsb25nKSBsb2NhdGlvbi55ICsgaCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjc2PWxvY2F0aW9uLnggKyB3IG9yIGxvY2F0aW9uLnkgKyBoIHJlc3VsdHMgaW4gaW50ZWdlciBvdmVyZmxvdworICAgICAgICBpZiAoKGxvbmcpbG9jYXRpb24ueCArIHcgPiBJbnRlZ2VyLk1BWF9WQUxVRSB8fCAobG9uZylsb2NhdGlvbi55ICsgaCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAvLyBhd3QuMjc2PWxvY2F0aW9uLnggKyB3IG9yIGxvY2F0aW9uLnkgKyBoIHJlc3VsdHMgaW4gaW50ZWdlcgorICAgICAgICAgICAgLy8gb3ZlcmZsb3cKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjc2IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUKLSAgICAgICAgICAgICAgICAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUKSB7CisgICAgICAgIGlmIChkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURSAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjMwPWRhdGFUeXBlIGlzIG5vdCBvbmUgb2YgdGhlIHN1cHBvcnRlZCBkYXRhIHR5cGVzCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIzMCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CkBAIC00NDAsMjYgKzQ3OCwzMCBAQAogICAgICAgICAgICAgYmFuZE9mZnNldHNbaV0gPSBpOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVybGVhdmVkUmFzdGVyKGRhdGFUeXBlLCB3LCBoLCB3ICogYmFuZHMsIGJhbmRzLAotICAgICAgICAgICAgICAgIGJhbmRPZmZzZXRzLCBsb2NhdGlvbik7CisgICAgICAgIHJldHVybiBjcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihkYXRhVHlwZSwgdywgaCwgdyAqIGJhbmRzLCBiYW5kcywgYmFuZE9mZnNldHMsIGxvY2F0aW9uKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUmFzdGVyIG9iamVjdCB3aXRoIGEgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCAgCi0gICAgICogYW5kIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlci4gCisgICAgICogQ3JlYXRlcyBhIFJhc3RlciBvYmplY3Qgd2l0aCBhIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgYW5kIHRoZQorICAgICAqIHNwZWNpZmllZCBEYXRhQnVmZmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQnVmZmVyIHRoZSBEYXRhQnVmZmVyLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZSB0aGUgc2NhbmxpbmUgc3RyaWRlIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBiYW5kTWFza3MgdGhlIGJhbmQgbWFza3MuCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiB3aGljaCBkZWZpbmVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciAKLSAgICAgKiBvZiB0aGUgUmFzdGVyLgotICAgICAqIAorICAgICAqIEBwYXJhbSBkYXRhQnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgRGF0YUJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZQorICAgICAqICAgICAgICAgICAgdGhlIHNjYW5saW5lIHN0cmlkZSBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gYmFuZE1hc2tzCisgICAgICogICAgICAgICAgICB0aGUgYmFuZCBtYXNrcy4KKyAgICAgKiBAcGFyYW0gbG9jYXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhdGlvbiB3aGljaCBkZWZpbmVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgIFJhc3Rlci4KICAgICAgKiBAcmV0dXJuIHRoZSBXcml0YWJsZVJhc3Rlci4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZVBhY2tlZFJhc3RlcihEYXRhQnVmZmVyIGRhdGFCdWZmZXIsCi0gICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBzY2FubGluZVN0cmlkZSwgaW50IGJhbmRNYXNrc1tdLCBQb2ludCBsb2NhdGlvbikgeworICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlUGFja2VkUmFzdGVyKERhdGFCdWZmZXIgZGF0YUJ1ZmZlciwgaW50IHcsIGludCBoLAorICAgICAgICAgICAgaW50IHNjYW5saW5lU3RyaWRlLCBpbnQgYmFuZE1hc2tzW10sIFBvaW50IGxvY2F0aW9uKSB7CiAgICAgICAgIGlmIChkYXRhQnVmZmVyID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGF3dC4yNzg9ZGF0YUJ1ZmZlciBpcyBudWxsCiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjc4IikpOyAvLyROT04tTkxTLTEkCkBAIC00NzQsOSArNTE2LDkgQEAKICAgICAgICAgICAgIGxvY2F0aW9uID0gbmV3IFBvaW50KDAsIDApOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChsb25nKSBsb2NhdGlvbi54ICsgdyA+IEludGVnZXIuTUFYX1ZBTFVFCi0gICAgICAgICAgICAgICAgfHwgKGxvbmcpIGxvY2F0aW9uLnkgKyBoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yNzY9bG9jYXRpb24ueCArIHcgb3IgbG9jYXRpb24ueSArIGggcmVzdWx0cyBpbiBpbnRlZ2VyIG92ZXJmbG93CisgICAgICAgIGlmICgobG9uZylsb2NhdGlvbi54ICsgdyA+IEludGVnZXIuTUFYX1ZBTFVFIHx8IChsb25nKWxvY2F0aW9uLnkgKyBoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIC8vIGF3dC4yNzY9bG9jYXRpb24ueCArIHcgb3IgbG9jYXRpb24ueSArIGggcmVzdWx0cyBpbiBpbnRlZ2VyCisgICAgICAgICAgICAvLyBvdmVyZmxvdwogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNzYiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCkBAIC00OTEsMzUgKzUzMywzNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50IGRhdGFUeXBlID0gZGF0YUJ1ZmZlci5nZXREYXRhVHlwZSgpOwotICAgICAgICBpZiAoZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUKLSAgICAgICAgICAgICAgICAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUCisgICAgICAgIGlmIChkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURSAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUCiAgICAgICAgICAgICAgICAgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVCkgewogICAgICAgICAgICAgLy8gYXd0LjIzMD1kYXRhVHlwZSBpcyBub3Qgb25lIG9mIHRoZSBzdXBwb3J0ZWQgZGF0YSB0eXBlcwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMzAiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgc2FtcGxlTW9kZWwgPSAKLSAgICAgICAgICAgIG5ldyBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKGRhdGFUeXBlLCB3LCBoLCAKLSAgICAgICAgICAgICAgICAgICAgc2NhbmxpbmVTdHJpZGUsIGJhbmRNYXNrcyk7CisgICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgc2FtcGxlTW9kZWwgPSBuZXcgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbChkYXRhVHlwZSwgdywgaCwKKyAgICAgICAgICAgICAgICBzY2FubGluZVN0cmlkZSwgYmFuZE1hc2tzKTsKIAogICAgICAgICByZXR1cm4gbmV3IE9yZGluYXJ5V3JpdGFibGVSYXN0ZXIoc2FtcGxlTW9kZWwsIGRhdGFCdWZmZXIsIGxvY2F0aW9uKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUmFzdGVyIG9iamVjdCB3aXRoIGEgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsICAgCi0gICAgICogYW5kIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlci4KKyAgICAgKiBDcmVhdGVzIGEgUmFzdGVyIG9iamVjdCB3aXRoIGEgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIGFuZCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgRGF0YUJ1ZmZlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YUJ1ZmZlciB0aGUgRGF0YUJ1ZmZlci4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gYml0c1BlclBpeGVsIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwuCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiB3aGljaCBkZWZpbmVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciAKLSAgICAgKiBvZiB0aGUgUmFzdGVyLgotICAgICAqIAorICAgICAqIEBwYXJhbSBkYXRhQnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgRGF0YUJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBiaXRzUGVyUGl4ZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwuCisgICAgICogQHBhcmFtIGxvY2F0aW9uCisgICAgICogICAgICAgICAgICB0aGUgbG9jYXRpb24gd2hpY2ggZGVmaW5lcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlCisgICAgICogICAgICAgICAgICBSYXN0ZXIuCiAgICAgICogQHJldHVybiB0aGUgV3JpdGFibGVSYXN0ZXIuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVQYWNrZWRSYXN0ZXIoRGF0YUJ1ZmZlciBkYXRhQnVmZmVyLAotICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgYml0c1BlclBpeGVsLCBQb2ludCBsb2NhdGlvbikgeworICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlUGFja2VkUmFzdGVyKERhdGFCdWZmZXIgZGF0YUJ1ZmZlciwgaW50IHcsIGludCBoLAorICAgICAgICAgICAgaW50IGJpdHNQZXJQaXhlbCwgUG9pbnQgbG9jYXRpb24pIHsKIAogICAgICAgICBpZiAodyA8PSAwIHx8IGggPD0gMCkgewogICAgICAgICAgICAgLy8gYXd0LjIyRT13IG9yIGggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8KQEAgLTUzMCw5ICs1NzQsOSBAQAogICAgICAgICAgICAgbG9jYXRpb24gPSBuZXcgUG9pbnQoMCwgMCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKGxvbmcpIGxvY2F0aW9uLnggKyB3ID4gSW50ZWdlci5NQVhfVkFMVUUKLSAgICAgICAgICAgICAgICB8fCAobG9uZykgbG9jYXRpb24ueSArIGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewotICAgICAgICAgICAgLy8gYXd0LjI3Nj1sb2NhdGlvbi54ICsgdyBvciBsb2NhdGlvbi55ICsgaCByZXN1bHRzIGluIGludGVnZXIgb3ZlcmZsb3cKKyAgICAgICAgaWYgKChsb25nKWxvY2F0aW9uLnggKyB3ID4gSW50ZWdlci5NQVhfVkFMVUUgfHwgKGxvbmcpbG9jYXRpb24ueSArIGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgLy8gYXd0LjI3Nj1sb2NhdGlvbi54ICsgdyBvciBsb2NhdGlvbi55ICsgaCByZXN1bHRzIGluIGludGVnZXIKKyAgICAgICAgICAgIC8vIG92ZXJmbG93CiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3NiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKQEAgLTU0NywzNyArNTkxLDQwIEBACiAgICAgICAgIH0KIAogICAgICAgICBpbnQgZGF0YVR5cGUgPSBkYXRhQnVmZmVyLmdldERhdGFUeXBlKCk7Ci0gICAgICAgIGlmIChkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURQotICAgICAgICAgICAgICAgICYmIGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9VU0hPUlQKKyAgICAgICAgaWYgKGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFICYmIGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9VU0hPUlQKICAgICAgICAgICAgICAgICAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfSU5UKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjMwPWRhdGFUeXBlIGlzIG5vdCBvbmUgb2YgdGhlIHN1cHBvcnRlZCBkYXRhIHR5cGVzCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIzMCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNhbXBsZU1vZGVsID0gCi0gICAgICAgICAgICBuZXcgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKGRhdGFUeXBlLCB3LCBoLCBiaXRzUGVyUGl4ZWwpOworICAgICAgICBNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgc2FtcGxlTW9kZWwgPSBuZXcgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKGRhdGFUeXBlLCB3LCBoLAorICAgICAgICAgICAgICAgIGJpdHNQZXJQaXhlbCk7CiAKICAgICAgICAgcmV0dXJuIG5ldyBPcmRpbmFyeVdyaXRhYmxlUmFzdGVyKHNhbXBsZU1vZGVsLCBkYXRhQnVmZmVyLCBsb2NhdGlvbik7CiAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUmFzdGVyIG9iamVjdCB3aXRoIGEgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsICAgCi0gICAgICogYW5kIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlci4KKyAgICAgKiBDcmVhdGVzIGEgUmFzdGVyIG9iamVjdCB3aXRoIGEgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIGFuZCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgRGF0YUJ1ZmZlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGRhdGEgdHlwZSBvZiBzYW1wbGVzOgotICAgICAqIFRZUEVfQllURSwgVFlQRV9VU0hPUlQsIG9yIFRZUEVfSU5ULiAKLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gYmFuZHMgdGhlIG51bWJlciBvZiBiYW5kcy4KLSAgICAgKiBAcGFyYW0gYml0c1BlckJhbmQgdGhlIG51bWJlciBvZiBiaXRzIHBlciBiYW5kLgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gd2hpY2ggZGVmaW5lcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgCi0gICAgICogb2YgdGhlIFJhc3Rlci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUgb2Ygc2FtcGxlczogVFlQRV9CWVRFLCBUWVBFX1VTSE9SVCwgb3IgVFlQRV9JTlQuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gYmFuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYmFuZHMuCisgICAgICogQHBhcmFtIGJpdHNQZXJCYW5kCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIGJhbmQuCisgICAgICogQHBhcmFtIGxvY2F0aW9uCisgICAgICogICAgICAgICAgICB0aGUgbG9jYXRpb24gd2hpY2ggZGVmaW5lcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlCisgICAgICogICAgICAgICAgICBSYXN0ZXIuCiAgICAgICogQHJldHVybiB0aGUgV3JpdGFibGVSYXN0ZXIuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVQYWNrZWRSYXN0ZXIoaW50IGRhdGFUeXBlLCBpbnQgdywgaW50IGgsCi0gICAgICAgICAgICBpbnQgYmFuZHMsIGludCBiaXRzUGVyQmFuZCwgUG9pbnQgbG9jYXRpb24pIHsKKyAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZVBhY2tlZFJhc3RlcihpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwgaW50IGJhbmRzLAorICAgICAgICAgICAgaW50IGJpdHNQZXJCYW5kLCBQb2ludCBsb2NhdGlvbikgewogCiAgICAgICAgIGlmICh3IDw9IDAgfHwgaCA8PSAwKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjJFPXcgb3IgaCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybwpAQCAtNTg4LDkgKzYzNSw5IEBACiAgICAgICAgICAgICBsb2NhdGlvbiA9IG5ldyBQb2ludCgwLCAwKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgobG9uZykgbG9jYXRpb24ueCArIHcgPiBJbnRlZ2VyLk1BWF9WQUxVRQotICAgICAgICAgICAgICAgIHx8IChsb25nKSBsb2NhdGlvbi55ICsgaCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjc2PWxvY2F0aW9uLnggKyB3IG9yIGxvY2F0aW9uLnkgKyBoIHJlc3VsdHMgaW4gaW50ZWdlciBvdmVyZmxvdworICAgICAgICBpZiAoKGxvbmcpbG9jYXRpb24ueCArIHcgPiBJbnRlZ2VyLk1BWF9WQUxVRSB8fCAobG9uZylsb2NhdGlvbi55ICsgaCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAvLyBhd3QuMjc2PWxvY2F0aW9uLnggKyB3IG9yIGxvY2F0aW9uLnkgKyBoIHJlc3VsdHMgaW4gaW50ZWdlcgorICAgICAgICAgICAgLy8gb3ZlcmZsb3cKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjc2IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIApAQCAtNTk5LDE1ICs2NDYsMTUgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjdEIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUKLSAgICAgICAgICAgICAgICAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUCisgICAgICAgIGlmIChkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURSAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUCiAgICAgICAgICAgICAgICAgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVCkgewogICAgICAgICAgICAgLy8gYXd0LjIzMD1kYXRhVHlwZSBpcyBub3Qgb25lIG9mIHRoZSBzdXBwb3J0ZWQgZGF0YSB0eXBlcwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMzAiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCiAgICAgICAgIGlmIChiaXRzUGVyQmFuZCAqIGJhbmRzID4gRGF0YUJ1ZmZlci5nZXREYXRhVHlwZVNpemUoZGF0YVR5cGUpKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjdFPVRoZSBwcm9kdWN0IG9mIGJpdHNQZXJCYW5kIGFuZCBiYW5kcyBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBiaXRzIGhlbGQgYnkgZGF0YVR5cGUKKyAgICAgICAgICAgIC8vIGF3dC4yN0U9VGhlIHByb2R1Y3Qgb2YgYml0c1BlckJhbmQgYW5kIGJhbmRzIGlzIGdyZWF0ZXIgdGhhbiB0aGUKKyAgICAgICAgICAgIC8vIG51bWJlciBvZiBiaXRzIGhlbGQgYnkgZGF0YVR5cGUKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjdFIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIApAQCAtNjIzLDQzICs2NzAsNDUgQEAKICAgICAgICAgICAgIHJldHVybiBjcmVhdGVQYWNrZWRSYXN0ZXIoZGF0YVR5cGUsIHcsIGgsIGJhbmRNYXNrcywgbG9jYXRpb24pOwogICAgICAgICB9CiAgICAgICAgIERhdGFCdWZmZXIgZGF0YSA9IG51bGw7Ci0gICAgICAgIGludCBzaXplID0gKChiaXRzUGVyQmFuZCAqIHcgKyAKLSAgICAgICAgICAgICAgICBEYXRhQnVmZmVyLmdldERhdGFUeXBlU2l6ZShkYXRhVHlwZSkgLSAxKSAvIAotICAgICAgICAgICAgICAgIERhdGFCdWZmZXIuZ2V0RGF0YVR5cGVTaXplKGRhdGFUeXBlKSkgKiBoOworICAgICAgICBpbnQgc2l6ZSA9ICgoYml0c1BlckJhbmQgKiB3ICsgRGF0YUJ1ZmZlci5nZXREYXRhVHlwZVNpemUoZGF0YVR5cGUpIC0gMSkgLyBEYXRhQnVmZmVyCisgICAgICAgICAgICAgICAgLmdldERhdGFUeXBlU2l6ZShkYXRhVHlwZSkpCisgICAgICAgICAgICAgICAgKiBoOwogCiAgICAgICAgIHN3aXRjaCAoZGF0YVR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckJ5dGUoc2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyVVNob3J0KHNpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckludChzaXplKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJCeXRlKHNpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlclVTaG9ydChzaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJJbnQoc2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNyZWF0ZVBhY2tlZFJhc3RlcihkYXRhLCB3LCBoLCBiaXRzUGVyQmFuZCwgbG9jYXRpb24pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBSYXN0ZXIgb2JqZWN0IHdpdGggYSBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsICAgIAotICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIERhdGFCdWZmZXIuCisgICAgICogQ3JlYXRlcyBhIFJhc3RlciBvYmplY3Qgd2l0aCBhIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgYW5kIHRoZQorICAgICAqIHNwZWNpZmllZCBEYXRhQnVmZmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0aGUgZGF0YSB0eXBlIG9mIHNhbXBsZXM6Ci0gICAgICogVFlQRV9CWVRFLCBUWVBFX1VTSE9SVCwgb3IgVFlQRV9JTlQuIAotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBiYW5kTWFza3MgdGhlIGJhbmQgbWFza3MuCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiB3aGljaCBkZWZpbmVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciAKLSAgICAgKiBvZiB0aGUgUmFzdGVyLgotICAgICAqIAorICAgICAqIEBwYXJhbSBkYXRhVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHlwZSBvZiBzYW1wbGVzOiBUWVBFX0JZVEUsIFRZUEVfVVNIT1JULCBvciBUWVBFX0lOVC4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBiYW5kTWFza3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYW5kIG1hc2tzLgorICAgICAqIEBwYXJhbSBsb2NhdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZQorICAgICAqICAgICAgICAgICAgUmFzdGVyLgogICAgICAqIEByZXR1cm4gdGhlIFdyaXRhYmxlUmFzdGVyLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlUGFja2VkUmFzdGVyKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLAotICAgICAgICAgICAgaW50IGJhbmRNYXNrc1tdLCBQb2ludCBsb2NhdGlvbikgewotICAgICAgICAKLSAgICAgICAgaWYgKGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFCi0gICAgICAgICAgICAgICAgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVAorICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlUGFja2VkUmFzdGVyKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLCBpbnQgYmFuZE1hc2tzW10sCisgICAgICAgICAgICBQb2ludCBsb2NhdGlvbikgeworCisgICAgICAgIGlmIChkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURSAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUCiAgICAgICAgICAgICAgICAgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVCkgewogICAgICAgICAgICAgLy8gYXd0LjIzMD1kYXRhVHlwZSBpcyBub3Qgb25lIG9mIHRoZSBzdXBwb3J0ZWQgZGF0YSB0eXBlcwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMzAiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTY3NCw5ICs3MjMsOSBAQAogICAgICAgICAgICAgbG9jYXRpb24gPSBuZXcgUG9pbnQoMCwgMCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKGxvbmcpIGxvY2F0aW9uLnggKyB3ID4gSW50ZWdlci5NQVhfVkFMVUUKLSAgICAgICAgICAgICAgICB8fCAobG9uZykgbG9jYXRpb24ueSArIGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewotICAgICAgICAgICAgLy8gYXd0LjI3Nj1sb2NhdGlvbi54ICsgdyBvciBsb2NhdGlvbi55ICsgaCByZXN1bHRzIGluIGludGVnZXIgb3ZlcmZsb3cKKyAgICAgICAgaWYgKChsb25nKWxvY2F0aW9uLnggKyB3ID4gSW50ZWdlci5NQVhfVkFMVUUgfHwgKGxvbmcpbG9jYXRpb24ueSArIGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgLy8gYXd0LjI3Nj1sb2NhdGlvbi54ICsgdyBvciBsb2NhdGlvbi55ICsgaCByZXN1bHRzIGluIGludGVnZXIKKyAgICAgICAgICAgIC8vIG92ZXJmbG93CiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3NiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKQEAgLTY4OCwxNSArNzM3LDE1IEBACiAgICAgICAgIERhdGFCdWZmZXIgZGF0YSA9IG51bGw7CiAKICAgICAgICAgc3dpdGNoIChkYXRhVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyQnl0ZSh3ICogaCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyVVNob3J0KHcgKiBoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJJbnQodyAqIGgpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckJ5dGUodyAqIGgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlclVTaG9ydCh3ICogaCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVySW50KHcgKiBoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBjcmVhdGVQYWNrZWRSYXN0ZXIoZGF0YSwgdywgaCwgdywgYmFuZE1hc2tzLCBsb2NhdGlvbik7CkBAIC03MDUsMTUgKzc1NCwxNiBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBSYXN0ZXIgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBEYXRhQnVmZmVyIGFuZCBTYW1wbGVNb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc20gdGhlIHNwZWNpZmllZCBTYW1wbGVNb2RlbC4KLSAgICAgKiBAcGFyYW0gZGIgdGhlIHNwZWNpZmllZCBEYXRhQnVmZmVyLgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gd2hpY2ggZGVmaW5lcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgCi0gICAgICogb2YgdGhlIFJhc3Rlci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc20KKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwuCisgICAgICogQHBhcmFtIGRiCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIERhdGFCdWZmZXIuCisgICAgICogQHBhcmFtIGxvY2F0aW9uCisgICAgICogICAgICAgICAgICB0aGUgbG9jYXRpb24gd2hpY2ggZGVmaW5lcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlCisgICAgICogICAgICAgICAgICBSYXN0ZXIuCiAgICAgICogQHJldHVybiB0aGUgUmFzdGVyLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmFzdGVyIGNyZWF0ZVJhc3RlcihTYW1wbGVNb2RlbCBzbSwgRGF0YUJ1ZmZlciBkYiwKLSAgICAgICAgICAgIFBvaW50IGxvY2F0aW9uKSB7CisgICAgcHVibGljIHN0YXRpYyBSYXN0ZXIgY3JlYXRlUmFzdGVyKFNhbXBsZU1vZGVsIHNtLCBEYXRhQnVmZmVyIGRiLCBQb2ludCBsb2NhdGlvbikgewogCiAgICAgICAgIGlmIChzbSA9PSBudWxsIHx8IGRiID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGF3dC4yN0Y9U2FtcGxlTW9kZWwgb3IgRGF0YUJ1ZmZlciBpcyBudWxsCkBAIC03MzAsMTUgKzc4MCwxNiBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBXcml0YWJsZVJhc3RlciB3aXRoIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwgYW5kIERhdGFCdWZmZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNtIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwuCi0gICAgICogQHBhcmFtIGRiIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlci4KLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIAotICAgICAqIG9mIHRoZSBSYXN0ZXIuCi0gICAgICogCisgICAgICogQHBhcmFtIHNtCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFNhbXBsZU1vZGVsLgorICAgICAqIEBwYXJhbSBkYgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBEYXRhQnVmZmVyLgorICAgICAqIEBwYXJhbSBsb2NhdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZQorICAgICAqICAgICAgICAgICAgUmFzdGVyLgogICAgICAqIEByZXR1cm4gdGhlIFdyaXRhYmxlUmFzdGVyLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlV3JpdGFibGVSYXN0ZXIoU2FtcGxlTW9kZWwgc20sCi0gICAgICAgICAgICBEYXRhQnVmZmVyIGRiLCBQb2ludCBsb2NhdGlvbikgeworICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlV3JpdGFibGVSYXN0ZXIoU2FtcGxlTW9kZWwgc20sIERhdGFCdWZmZXIgZGIsIFBvaW50IGxvY2F0aW9uKSB7CiAKICAgICAgICAgaWYgKHNtID09IG51bGwgfHwgZGIgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gYXd0LjI3Rj1TYW1wbGVNb2RlbCBvciBEYXRhQnVmZmVyIGlzIG51bGwKQEAgLTc1NSwxNCArODA2LDE0IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIFdyaXRhYmxlUmFzdGVyIHdpdGggdGhlIHNwZWNpZmllZCBTYW1wbGVNb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc20gdGhlIHNwZWNpZmllZCBTYW1wbGVNb2RlbC4KLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIAotICAgICAqIG9mIHRoZSBSYXN0ZXIuCi0gICAgICogCisgICAgICogQHBhcmFtIHNtCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFNhbXBsZU1vZGVsLgorICAgICAqIEBwYXJhbSBsb2NhdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZQorICAgICAqICAgICAgICAgICAgUmFzdGVyLgogICAgICAqIEByZXR1cm4gdGhlIFdyaXRhYmxlUmFzdGVyLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlV3JpdGFibGVSYXN0ZXIoU2FtcGxlTW9kZWwgc20sCi0gICAgICAgICAgICBQb2ludCBsb2NhdGlvbikgeworICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlV3JpdGFibGVSYXN0ZXIoU2FtcGxlTW9kZWwgc20sIFBvaW50IGxvY2F0aW9uKSB7CiAKICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGF3dC4yODA9U2FtcGxlTW9kZWwgaXMgbnVsbApAQCAtNzgwLDM0ICs4MzEsNDIgQEAKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgUmFzdGVyIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwgYW5kCiAgICAgICogRGF0YUJ1ZmZlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2FtcGxlTW9kZWwgdGhlIHNwZWNpZmllZCBTYW1wbGVNb2RlbC4KLSAgICAgKiBAcGFyYW0gZGF0YUJ1ZmZlciB0aGUgc3BlY2lmaWVkICBEYXRhQnVmZmVyLgotICAgICAqIEBwYXJhbSBvcmlnaW4gdGhlIHNwZWNpZmllZCBvcmlnaW4uCisgICAgICogQHBhcmFtIHNhbXBsZU1vZGVsCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFNhbXBsZU1vZGVsLgorICAgICAqIEBwYXJhbSBkYXRhQnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIERhdGFCdWZmZXIuCisgICAgICogQHBhcmFtIG9yaWdpbgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBvcmlnaW4uCiAgICAgICovCi0gICAgcHJvdGVjdGVkIFJhc3RlcihTYW1wbGVNb2RlbCBzYW1wbGVNb2RlbCwgRGF0YUJ1ZmZlciBkYXRhQnVmZmVyLAotICAgICAgICAgICAgUG9pbnQgb3JpZ2luKSB7CisgICAgcHJvdGVjdGVkIFJhc3RlcihTYW1wbGVNb2RlbCBzYW1wbGVNb2RlbCwgRGF0YUJ1ZmZlciBkYXRhQnVmZmVyLCBQb2ludCBvcmlnaW4pIHsKIAotICAgICAgICB0aGlzKHNhbXBsZU1vZGVsLCBkYXRhQnVmZmVyLCBuZXcgUmVjdGFuZ2xlKG9yaWdpbi54LCBvcmlnaW4ueSwKLSAgICAgICAgICAgICAgICBzYW1wbGVNb2RlbC5nZXRXaWR0aCgpLCBzYW1wbGVNb2RlbC5nZXRIZWlnaHQoKSksIG9yaWdpbiwgbnVsbCk7CisgICAgICAgIHRoaXMoc2FtcGxlTW9kZWwsIGRhdGFCdWZmZXIsIG5ldyBSZWN0YW5nbGUob3JpZ2luLngsIG9yaWdpbi55LCBzYW1wbGVNb2RlbC5nZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgIHNhbXBsZU1vZGVsLmdldEhlaWdodCgpKSwgb3JpZ2luLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgUmFzdGVyIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwsCi0gICAgICogRGF0YUJ1ZmZlciwgcmVjdGFuZ3VsYXIgcmVnaW9uIGFuZCBwYXJlbnQgUmFzdGVyLiAKKyAgICAgKiBEYXRhQnVmZmVyLCByZWN0YW5ndWxhciByZWdpb24gYW5kIHBhcmVudCBSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNhbXBsZU1vZGVsIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwuCi0gICAgICogQHBhcmFtIGRhdGFCdWZmZXIgdGhlIHNwZWNpZmllZCBEYXRhQnVmZmVyLgotICAgICAqIEBwYXJhbSBhUmVnaW9uIHRoZSBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiB3aGljaCBkZWZpbmVzIHRoZSBuZXcgaW1hZ2UgYm91bmRzLiAKLSAgICAgKiBAcGFyYW0gc2FtcGxlTW9kZWxUcmFuc2xhdGUgdGhpcyBwb2ludCBkZWZpbmVzIHRoZSB0cmFuc2xhdGlvbiBwb2ludAotICAgICAqIGZyb20gdGhlIFNhbXBsZU1vZGVsIGNvb3JkaW5hdGVzIHRvIHRoZSBuZXcgUmFzdGVyIGNvb3JkaW5hdGVzLgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBvZiB0aGlzIFJhc3Rlci4KKyAgICAgKiBAcGFyYW0gc2FtcGxlTW9kZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwuCisgICAgICogQHBhcmFtIGRhdGFCdWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gYVJlZ2lvbgorICAgICAqICAgICAgICAgICAgdGhlIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIHdoaWNoIGRlZmluZXMgdGhlIG5ldyBpbWFnZSBib3VuZHMuCisgICAgICogQHBhcmFtIHNhbXBsZU1vZGVsVHJhbnNsYXRlCisgICAgICogICAgICAgICAgICB0aGlzIHBvaW50IGRlZmluZXMgdGhlIHRyYW5zbGF0aW9uIHBvaW50IGZyb20gdGhlIFNhbXBsZU1vZGVsCisgICAgICogICAgICAgICAgICBjb29yZGluYXRlcyB0byB0aGUgbmV3IFJhc3RlciBjb29yZGluYXRlcy4KKyAgICAgKiBAcGFyYW0gcGFyZW50CisgICAgICogICAgICAgICAgICB0aGUgcGFyZW50IG9mIHRoaXMgUmFzdGVyLgogICAgICAqLwotICAgIHByb3RlY3RlZCBSYXN0ZXIoU2FtcGxlTW9kZWwgc2FtcGxlTW9kZWwsIERhdGFCdWZmZXIgZGF0YUJ1ZmZlciwKLSAgICAgICAgICAgIFJlY3RhbmdsZSBhUmVnaW9uLCBQb2ludCBzYW1wbGVNb2RlbFRyYW5zbGF0ZSwgUmFzdGVyIHBhcmVudCkgeworICAgIHByb3RlY3RlZCBSYXN0ZXIoU2FtcGxlTW9kZWwgc2FtcGxlTW9kZWwsIERhdGFCdWZmZXIgZGF0YUJ1ZmZlciwgUmVjdGFuZ2xlIGFSZWdpb24sCisgICAgICAgICAgICBQb2ludCBzYW1wbGVNb2RlbFRyYW5zbGF0ZSwgUmFzdGVyIHBhcmVudCkgewogCiAgICAgICAgIGlmIChzYW1wbGVNb2RlbCA9PSBudWxsIHx8IGRhdGFCdWZmZXIgPT0gbnVsbCB8fCBhUmVnaW9uID09IG51bGwKICAgICAgICAgICAgICAgICB8fCBzYW1wbGVNb2RlbFRyYW5zbGF0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjgxPXNhbXBsZU1vZGVsLCBkYXRhQnVmZmVyLCBhUmVnaW9uIG9yIHNhbXBsZU1vZGVsVHJhbnNsYXRlIGlzIG51bGwKKyAgICAgICAgICAgIC8vIGF3dC4yODE9c2FtcGxlTW9kZWwsIGRhdGFCdWZmZXIsIGFSZWdpb24gb3Igc2FtcGxlTW9kZWxUcmFuc2xhdGUKKyAgICAgICAgICAgIC8vIGlzIG51bGwKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yODEiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCkBAIC04MTYsMjcgKzg3NSwyNSBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yODIiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIGlmICgobG9uZykgYVJlZ2lvbi54ICsgKGxvbmcpIGFSZWdpb24ud2lkdGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICBpZiAoKGxvbmcpYVJlZ2lvbi54ICsgKGxvbmcpYVJlZ2lvbi53aWR0aCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjgzPU92ZXJmbG93IFggY29vcmRpbmF0ZSBvZiBSYXN0ZXIKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjgzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKGxvbmcpIGFSZWdpb24ueSArIChsb25nKSBhUmVnaW9uLmhlaWdodCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgIGlmICgobG9uZylhUmVnaW9uLnkgKyAobG9uZylhUmVnaW9uLmhlaWdodCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjg0PU92ZXJmbG93IFkgY29vcmRpbmF0ZSBvZiBSYXN0ZXIKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjg0IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgaWYgKHNhbXBsZU1vZGVsIGluc3RhbmNlb2YgQ29tcG9uZW50U2FtcGxlTW9kZWwpIHsKICAgICAgICAgICAgIHZhbGlkYXRlRGF0YUJ1ZmZlcihkYXRhQnVmZmVyLCBhUmVnaW9uLndpZHRoLCBhUmVnaW9uLmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgKChDb21wb25lbnRTYW1wbGVNb2RlbCkgc2FtcGxlTW9kZWwpLmdldFNjYW5saW5lU3RyaWRlKCkpOworICAgICAgICAgICAgICAgICAgICAoKENvbXBvbmVudFNhbXBsZU1vZGVsKXNhbXBsZU1vZGVsKS5nZXRTY2FubGluZVN0cmlkZSgpKTsKICAgICAgICAgfSBlbHNlIGlmIChzYW1wbGVNb2RlbCBpbnN0YW5jZW9mIE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkgewogICAgICAgICAgICAgdmFsaWRhdGVEYXRhQnVmZmVyKGRhdGFCdWZmZXIsIGFSZWdpb24ud2lkdGgsIGFSZWdpb24uaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAoKE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkgc2FtcGxlTW9kZWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNjYW5saW5lU3RyaWRlKCkpOworICAgICAgICAgICAgICAgICAgICAoKE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbClzYW1wbGVNb2RlbCkuZ2V0U2NhbmxpbmVTdHJpZGUoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAoc2FtcGxlTW9kZWwgaW5zdGFuY2VvZiBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKSB7CiAgICAgICAgICAgICB2YWxpZGF0ZURhdGFCdWZmZXIoZGF0YUJ1ZmZlciwgYVJlZ2lvbi53aWR0aCwgYVJlZ2lvbi5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICgoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkgc2FtcGxlTW9kZWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNjYW5saW5lU3RyaWRlKCkpOworICAgICAgICAgICAgICAgICAgICAoKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpc2FtcGxlTW9kZWwpLmdldFNjYW5saW5lU3RyaWRlKCkpOwogICAgICAgICB9CiAKICAgICAgICAgdGhpcy5zYW1wbGVNb2RlbCA9IHNhbXBsZU1vZGVsOwpAQCAtODU2LDM2ICs5MTMsNDQgQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgUmFzdGVyIHdpdGggdGhlIHNwZWNpZmllZCBTYW1wbGVNb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2FtcGxlTW9kZWwgdGhlIHNwZWNpZmllZCBTYW1wbGVNb2RlbC4KLSAgICAgKiBAcGFyYW0gb3JpZ2luIHRoZSBvcmlnaW4uCisgICAgICogQHBhcmFtIHNhbXBsZU1vZGVsCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFNhbXBsZU1vZGVsLgorICAgICAqIEBwYXJhbSBvcmlnaW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBvcmlnaW4uCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFJhc3RlcihTYW1wbGVNb2RlbCBzYW1wbGVNb2RlbCwgUG9pbnQgb3JpZ2luKSB7Ci0gICAgICAgIHRoaXMoc2FtcGxlTW9kZWwsIHNhbXBsZU1vZGVsLmNyZWF0ZURhdGFCdWZmZXIoKSwgbmV3IFJlY3RhbmdsZSgKLSAgICAgICAgICAgICAgICBvcmlnaW4ueCwgb3JpZ2luLnksIHNhbXBsZU1vZGVsLmdldFdpZHRoKCksIHNhbXBsZU1vZGVsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SGVpZ2h0KCkpLCBvcmlnaW4sIG51bGwpOworICAgICAgICB0aGlzKHNhbXBsZU1vZGVsLCBzYW1wbGVNb2RlbC5jcmVhdGVEYXRhQnVmZmVyKCksIG5ldyBSZWN0YW5nbGUob3JpZ2luLngsIG9yaWdpbi55LAorICAgICAgICAgICAgICAgIHNhbXBsZU1vZGVsLmdldFdpZHRoKCksIHNhbXBsZU1vZGVsLmdldEhlaWdodCgpKSwgb3JpZ2luLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIHRoZSBjaGlsZCBvZiB0aGlzIFJhc3RlciBieSBzaGFyaW5nIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIKLSAgICAgKiBhcmVhIGluIHRoaXMgUmFzdGUuIFRoZSBwYXJlbnRYLCBwYXJlbnRZLCB3aWR0aCAKLSAgICAgKiBhbmQgaGVpZ2h0IHBhcmFtZXRlcnMgc3BlY2lmeSB0aGUgcmVjdGFuZ3VsYXIgYXJlYSB0byBiZSBzaGFyZWQuCisgICAgICogYXJlYSBpbiB0aGlzIHJhc3Rlci4gVGhlIHBhcmVudFgsIHBhcmVudFksIHdpZHRoIGFuZCBoZWlnaHQgcGFyYW1ldGVycworICAgICAqIHNwZWNpZnkgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgdG8gYmUgc2hhcmVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnRYIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoaXMgUmFzdGVyLiAKLSAgICAgKiBAcGFyYW0gcGFyZW50WSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGlzIFJhc3Rlci4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBjaGlsZCBhcmVhLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgY2hpbGQgYXJlYS4KLSAgICAgKiBAcGFyYW0gY2hpbGRNaW5YIHRoZSBYIGNvb3JkaW5hdGUgb2YgY2hpbGQgYXJlYSBtYXBwZWQgdG8gdGhlIHBhcmVudFgKLSAgICAgKiBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSBjaGlsZE1pblkgdGhlIFkgY29vcmRpbmF0ZSBvZiBjaGlsZCBhcmVhIG1hcHBlZCB0byB0aGUgcGFyZW50WQotICAgICAqIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIGJhbmRMaXN0IHRoZSBhcnJheSBvZiBiYW5kIGluZGljaWVzLgotICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJlbnRYCisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGlzIFJhc3Rlci4KKyAgICAgKiBAcGFyYW0gcGFyZW50WQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhpcyBSYXN0ZXIuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGNoaWxkIGFyZWEuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgY2hpbGQgYXJlYS4KKyAgICAgKiBAcGFyYW0gY2hpbGRNaW5YCisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIGNoaWxkIGFyZWEgbWFwcGVkIHRvIHRoZSBwYXJlbnRYCisgICAgICogICAgICAgICAgICBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSBjaGlsZE1pblkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgY2hpbGQgYXJlYSBtYXBwZWQgdG8gdGhlIHBhcmVudFkKKyAgICAgKiAgICAgICAgICAgIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIGJhbmRMaXN0CisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgYmFuZCBpbmRpY2VzLgogICAgICAqIEByZXR1cm4gdGhlIFJhc3Rlci4KICAgICAgKi8KLSAgICBwdWJsaWMgUmFzdGVyIGNyZWF0ZUNoaWxkKGludCBwYXJlbnRYLCBpbnQgcGFyZW50WSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgaW50IGNoaWxkTWluWCwgaW50IGNoaWxkTWluWSwgaW50IGJhbmRMaXN0W10pIHsKKyAgICBwdWJsaWMgUmFzdGVyIGNyZWF0ZUNoaWxkKGludCBwYXJlbnRYLCBpbnQgcGFyZW50WSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgY2hpbGRNaW5YLAorICAgICAgICAgICAgaW50IGNoaWxkTWluWSwgaW50IGJhbmRMaXN0W10pIHsKICAgICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHsKLSAgICAgICAgICAgIC8vIGF3dC4yODU9V2lkdGggb3IgSGVpZ2h0IG9mIGNoaWxkIFJhc3RlciBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybworICAgICAgICAgICAgLy8gYXd0LjI4NT1XaWR0aCBvciBIZWlnaHQgb2YgY2hpbGQgUmFzdGVyIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0bworICAgICAgICAgICAgLy8gemVybwogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yODUiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCkBAIC04OTksMjIgKzk2NCwyMiBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yODciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIGlmICgobG9uZykgcGFyZW50WCArIHdpZHRoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgaWYgKChsb25nKXBhcmVudFggKyB3aWR0aCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjg4PXBhcmVudFggKyB3aWR0aCByZXN1bHRzIGluIGludGVnZXIgb3ZlcmZsb3cKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjg4IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKGxvbmcpIHBhcmVudFkgKyBoZWlnaHQgPiBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICBpZiAoKGxvbmcpcGFyZW50WSArIGhlaWdodCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjg5PXBhcmVudFkgKyBoZWlnaHQgcmVzdWx0cyBpbiBpbnRlZ2VyIG92ZXJmbG93CiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI4OSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChsb25nKSBjaGlsZE1pblggKyB3aWR0aCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgIGlmICgobG9uZyljaGlsZE1pblggKyB3aWR0aCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjhBPWNoaWxkTWluWCArIHdpZHRoIHJlc3VsdHMgaW4gaW50ZWdlciBvdmVyZmxvdwogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yOEEiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIGlmICgobG9uZykgY2hpbGRNaW5ZICsgaGVpZ2h0ID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgaWYgKChsb25nKWNoaWxkTWluWSArIGhlaWdodCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjhCPWNoaWxkTWluWSArIGhlaWdodCByZXN1bHRzIGluIGludGVnZXIgb3ZlcmZsb3cKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjhCIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KQEAgLTkzMCwxNSArOTk1LDE0IEBACiAgICAgICAgIGludCBjaGlsZFRyYW5zbGF0ZVggPSBjaGlsZE1pblggLSBwYXJlbnRYOwogICAgICAgICBpbnQgY2hpbGRUcmFuc2xhdGVZID0gY2hpbGRNaW5ZIC0gcGFyZW50WTsKIAotICAgICAgICByZXR1cm4gbmV3IFJhc3RlcihjaGlsZE1vZGVsLCBkYXRhQnVmZmVyLCBuZXcgUmVjdGFuZ2xlKGNoaWxkTWluWCwKLSAgICAgICAgICAgICAgICBjaGlsZE1pblksIHdpZHRoLCBoZWlnaHQpLCBuZXcgUG9pbnQoY2hpbGRUcmFuc2xhdGVYCi0gICAgICAgICAgICAgICAgKyBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIGNoaWxkVHJhbnNsYXRlWQotICAgICAgICAgICAgICAgICsgc2FtcGxlTW9kZWxUcmFuc2xhdGVZKSwgdGhpcyk7CisgICAgICAgIHJldHVybiBuZXcgUmFzdGVyKGNoaWxkTW9kZWwsIGRhdGFCdWZmZXIsCisgICAgICAgICAgICAgICAgbmV3IFJlY3RhbmdsZShjaGlsZE1pblgsIGNoaWxkTWluWSwgd2lkdGgsIGhlaWdodCksIG5ldyBQb2ludChjaGlsZFRyYW5zbGF0ZVgKKyAgICAgICAgICAgICAgICAgICAgICAgICsgc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCBjaGlsZFRyYW5zbGF0ZVkgKyBzYW1wbGVNb2RlbFRyYW5zbGF0ZVkpLCB0aGlzKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBjb21wYXRpYmxlIFdyaXRhYmxlUmFzdGVyIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyAKLSAgICAgKiBhcyB0aGlzIFJhc3Rlci4KKyAgICAgKiBDcmVhdGUgYSBjb21wYXRpYmxlIFdyaXRhYmxlUmFzdGVyIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyBhcyB0aGlzCisgICAgICogUmFzdGVyLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIFdyaXRhYmxlUmFzdGVyLgogICAgICAqLwpAQCAtOTQ3LDEyICsxMDExLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgY29tcGF0aWJsZSBXcml0YWJsZVJhc3RlciB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgCi0gICAgICogYXMgdGhpcyBSYXN0ZXIgYW5kIHRoZSBzcGVjaWZpZWQgc2l6ZS4KKyAgICAgKiBDcmVhdGUgYSBjb21wYXRpYmxlIFdyaXRhYmxlUmFzdGVyIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyBhcyB0aGlzCisgICAgICogUmFzdGVyIGFuZCB0aGUgc3BlY2lmaWVkIHNpemUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBuZXcgV3JpdGFibGVSYXN0ZXIuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgbmV3IFdyaXRhYmxlUmFzdGVyLgotICAgICAqIAorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIG5ldyBXcml0YWJsZVJhc3Rlci4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgbmV3IFdyaXRhYmxlUmFzdGVyLgogICAgICAqIEByZXR1cm4gdGhlIFdyaXRhYmxlUmFzdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoaW50IHcsIGludCBoKSB7CkBAIC05NjcsMTggKzEwMzIsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBjb21wYXRpYmxlIFdyaXRhYmxlUmFzdGVyIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyAKLSAgICAgKiBhcyB0aGlzIFJhc3RlciBhbmQgdGhlIHNwZWNpZmllZCBzaXplIGFuZCBsb2NhdGlvbi4KKyAgICAgKiBDcmVhdGUgYSBjb21wYXRpYmxlIFdyaXRhYmxlUmFzdGVyIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyBhcyB0aGlzCisgICAgICogUmFzdGVyIGFuZCB0aGUgc3BlY2lmaWVkIHNpemUgYW5kIGxvY2F0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBXcml0YWJsZVJhc3Rlci4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBuZXcgV3JpdGFibGVSYXN0ZXIuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBuZXcgV3JpdGFibGVSYXN0ZXIuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgbmV3IFdyaXRhYmxlUmFzdGVyLgotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBuZXcgV3JpdGFibGVSYXN0ZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBXcml0YWJsZVJhc3Rlci4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBuZXcgV3JpdGFibGVSYXN0ZXIuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIG5ldyBXcml0YWJsZVJhc3Rlci4KICAgICAgKiBAcmV0dXJuIHRoZSBXcml0YWJsZVJhc3Rlci4KICAgICAgKi8KLSAgICBwdWJsaWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKGludCB4LCBpbnQgeSwgaW50IHcsCi0gICAgICAgICAgICBpbnQgaCkgeworICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpIHsKIAogICAgICAgICBXcml0YWJsZVJhc3RlciByYXN0ZXIgPSBjcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIodywgaCk7CiAKQEAgLTk4NiwxMiArMTA1MywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGNvbXBhdGlibGUgV3JpdGFibGVSYXN0ZXIgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzIAotICAgICAqIGFzIHRoaXMgUmFzdGVyIGFuZCB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSB3aGljaCBkZXRlcm1pbmVzCi0gICAgICogbmV3IFdyaXRhYmxlUmFzdGVyJ3MgbG9jYXRpb24gYW5kIHNpemUuCisgICAgICogQ3JlYXRlIGEgY29tcGF0aWJsZSBXcml0YWJsZVJhc3RlciB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgdGhpcworICAgICAqIFJhc3RlciBhbmQgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgd2hpY2ggZGV0ZXJtaW5lcyBuZXcgV3JpdGFibGVSYXN0ZXIncworICAgICAqIGxvY2F0aW9uIGFuZCBzaXplLgogICAgICAqIAotICAgICAqIEBwYXJhbSByZWN0IHRoZSBzcGVjaWZpZWQgUmVjdGFuZ2xlLgotICAgICAqIAorICAgICAqIEBwYXJhbSByZWN0CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFJlY3RhbmdsZS4KICAgICAgKiBAcmV0dXJuIHRoZSBXcml0YWJsZVJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKFJlY3RhbmdsZSByZWN0KSB7CkBAIC0xMDAwLDIzICsxMDY3LDIxIEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjhDIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLAotICAgICAgICAgICAgICAgIHJlY3QuaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHRyYW5zbGF0ZWQgY2hpbGQgb2YgdGhpcyBSYXN0ZXIuIFRoZSBOZXcgUmFzdGVyCi0gICAgICogb2JqZWN0IGlzIGEgcmVmZXJlbmNlIHRvIHRoZSB0aGlzIFJhc3RlciB3aXRoIGEgCi0gICAgICogZGlmZmVyZW50IGxvY2F0aW9uLiAKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGNoaWxkTWluWCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBuZXcgUmFzdGVyLgotICAgICAqIEBwYXJhbSBjaGlsZE1pblkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgbmV3IFJhc3Rlci4KKyAgICAgKiBDcmVhdGVzIHRoZSB0cmFuc2xhdGVkIGNoaWxkIG9mIHRoaXMgUmFzdGVyLiBUaGUgTmV3IFJhc3RlciBvYmplY3QgaXMgYQorICAgICAqIHJlZmVyZW5jZSB0byB0aGUgdGhpcyBSYXN0ZXIgd2l0aCBhIGRpZmZlcmVudCBsb2NhdGlvbi4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2hpbGRNaW5YCisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBuZXcgUmFzdGVyLgorICAgICAqIEBwYXJhbSBjaGlsZE1pblkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBSYXN0ZXIuCiAgICAgICogQHJldHVybiB0aGUgUmFzdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBSYXN0ZXIgY3JlYXRlVHJhbnNsYXRlZENoaWxkKGludCBjaGlsZE1pblgsIGludCBjaGlsZE1pblkpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUNoaWxkKG1pblgsIG1pblksIHdpZHRoLCBoZWlnaHQsIGNoaWxkTWluWCwgY2hpbGRNaW5ZLAotICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICByZXR1cm4gY3JlYXRlQ2hpbGQobWluWCwgbWluWSwgd2lkdGgsIGhlaWdodCwgY2hpbGRNaW5YLCBjaGlsZE1pblksIG51bGwpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTAzOCw0MSArMTEwMyw0NiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRhdGEgZWxlbWVudHMgd2hpY2ggcmVwcmVzZW50IHRoZSBwaXhlbCBkYXRhIG9mIHRoZSBzcGVjaWZpZWQgCi0gICAgICogcmVjdGFuZ2xlIGFyZWEgYXMgYSBwcmltaXRpdmUgYXJyYXkuIFRoZSBmb2xsb3dpbmcgaW1hZ2UgZGF0YSB0eXBlcwotICAgICAqIGFyZSBzdXBwb3J0ZWQ6IERhdGFCdWZmZXIuVFlQRV9CWVRFLCBEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCAKLSAgICAgKiBEYXRhQnVmZmVyLlRZUEVfSU5ULCBEYXRhQnVmZmVyLlRZUEVfU0hPUlQsIERhdGFCdWZmZXIuVFlQRV9GTE9BVCwgCi0gICAgICogb3IgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRS4KKyAgICAgKiBHZXRzIHRoZSBkYXRhIGVsZW1lbnRzIHdoaWNoIHJlcHJlc2VudCB0aGUgcGl4ZWwgZGF0YSBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogcmVjdGFuZ2xlIGFyZWEgYXMgYSBwcmltaXRpdmUgYXJyYXkuIFRoZSBmb2xsb3dpbmcgaW1hZ2UgZGF0YSB0eXBlcyBhcmUKKyAgICAgKiBzdXBwb3J0ZWQ6IERhdGFCdWZmZXIuVFlQRV9CWVRFLCBEYXRhQnVmZmVyLlRZUEVfVVNIT1JULAorICAgICAqIERhdGFCdWZmZXIuVFlQRV9JTlQsIERhdGFCdWZmZXIuVFlQRV9TSE9SVCwgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FULCBvcgorICAgICAqIERhdGFCdWZmZXIuVFlQRV9ET1VCTEUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gb3V0RGF0YSB0aGUgcmVzdWx0aW5nIGFycmF5LgotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBvdXREYXRhCisgICAgICogICAgICAgICAgICB0aGUgcmVzdWx0aW5nIGFycmF5LgogICAgICAqIEByZXR1cm4gdGhlIGRhdGEgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZCBhcmVhIG9mIHRoaXMgUmFzdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0RGF0YUVsZW1lbnRzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBPYmplY3Qgb3V0RGF0YSkgewotICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWwuZ2V0RGF0YUVsZW1lbnRzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkKLSAgICAgICAgICAgICAgICAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywgaCwgb3V0RGF0YSwgZGF0YUJ1ZmZlcik7CisgICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXREYXRhRWxlbWVudHMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywKKyAgICAgICAgICAgICAgICBoLCBvdXREYXRhLCBkYXRhQnVmZmVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkYXRhIGVsZW1lbnRzIHdoaWNoIHJlcHJlc2VudCB0aGUgc3BlY2lmaWVkIHBpeGVsIG9mIAotICAgICAqIHRoaXMgUmFzdGVyIGFzIGEgcHJpbWl0aXZlIGFycmF5LiBUaGUgZm9sbG93aW5nIGltYWdlIGRhdGEgdHlwZXMKLSAgICAgKiBhcmUgc3VwcG9ydGVkOiBEYXRhQnVmZmVyLlRZUEVfQllURSwgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwgCi0gICAgICogRGF0YUJ1ZmZlci5UWVBFX0lOVCwgRGF0YUJ1ZmZlci5UWVBFX1NIT1JULCBEYXRhQnVmZmVyLlRZUEVfRkxPQVQsIAotICAgICAqIG9yIERhdGFCdWZmZXIuVFlQRV9ET1VCTEUuCisgICAgICogR2V0cyB0aGUgZGF0YSBlbGVtZW50cyB3aGljaCByZXByZXNlbnQgdGhlIHNwZWNpZmllZCBwaXhlbCBvZiB0aGlzIFJhc3RlcgorICAgICAqIGFzIGEgcHJpbWl0aXZlIGFycmF5LiBUaGUgZm9sbG93aW5nIGltYWdlIGRhdGEgdHlwZXMgYXJlIHN1cHBvcnRlZDoKKyAgICAgKiBEYXRhQnVmZmVyLlRZUEVfQllURSwgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwgRGF0YUJ1ZmZlci5UWVBFX0lOVCwKKyAgICAgKiBEYXRhQnVmZmVyLlRZUEVfU0hPUlQsIERhdGFCdWZmZXIuVFlQRV9GTE9BVCwgb3IgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KLSAgICAgKiBAcGFyYW0gb3V0RGF0YSB0aGUgcmVzdWx0aW5nIGRhdGEuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0gb3V0RGF0YQorICAgICAqICAgICAgICAgICAgdGhlIHJlc3VsdGluZyBkYXRhLgogICAgICAqIEByZXR1cm4gdGhlIGRhdGEgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZCBwaXhlbCBvZiB0aGlzIFJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldERhdGFFbGVtZW50cyhpbnQgeCwgaW50IHksIE9iamVjdCBvdXREYXRhKSB7Ci0gICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXREYXRhRWxlbWVudHMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeQotICAgICAgICAgICAgICAgIC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBvdXREYXRhLCBkYXRhQnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldERhdGFFbGVtZW50cyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLAorICAgICAgICAgICAgICAgIG91dERhdGEsIGRhdGFCdWZmZXIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTEyMSw3ICsxMTkxLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwYXJlbnQgUmFzdGVyIGZvciB0aGlzIFJhc3RlciBvYmplY3QuIAorICAgICAqIEdldHMgdGhlIHBhcmVudCBSYXN0ZXIgZm9yIHRoaXMgUmFzdGVyIG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQgUmFzdGVyIGZvciB0aGlzIFJhc3RlciBvYmplY3QuCiAgICAgICovCkBAIC0xMTMwLDE1MCArMTIwMCwxNzMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgZG91YmxlIGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgaW4gdGhpcyBSYXN0ZXIuIAorICAgICAqIEdldHMgYSBkb3VibGUgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBpbiB0aGlzIFJhc3Rlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgcGl4ZWwncyBYIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHkgdGhlIHBpeGVsJ3MgWSBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSBkQXJyYXkgdGhlIGRvdWJsZSBhcnJheSB3aGVyZSByZXN1bHQgYXJyYXkgd2lsbCBiZSBzdG9yZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZG91YmxlIGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgaW4gCi0gICAgICogdGhpcyBSYXN0ZXIuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbCdzIFggY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsJ3MgWSBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSBkQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgYXJyYXkgd2hlcmUgcmVzdWx0IGFycmF5IHdpbGwgYmUgc3RvcmVkLgorICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIGluIHRoaXMKKyAgICAgKiAgICAgICAgIFJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlW10gZ2V0UGl4ZWwoaW50IHgsIGludCB5LCBkb3VibGUgZEFycmF5W10pIHsKLSAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldFBpeGVsKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkKLSAgICAgICAgICAgICAgICAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgZEFycmF5LCBkYXRhQnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldFBpeGVsKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIGRBcnJheSwKKyAgICAgICAgICAgICAgICBkYXRhQnVmZmVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgZmxvYXQgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBpbiB0aGlzIFJhc3Rlci4gCisgICAgICogR2V0cyBhIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgaW4gdGhpcyBSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHBpeGVsJ3MgWCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB5IHRoZSBwaXhlbCdzIFkgY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0gZkFycmF5IHRoZSBmbG9hdCBhcnJheSB3aGVyZSB0aGUgcmVzdWx0IGFycmF5IHdpbGwgYmUgc3RvcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgaW4gCi0gICAgICogdGhpcyBSYXN0ZXIuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbCdzIFggY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsJ3MgWSBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSBmQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBhcnJheSB3aGVyZSB0aGUgcmVzdWx0IGFycmF5IHdpbGwgYmUgc3RvcmVkLgorICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgaW4gdGhpcworICAgICAqICAgICAgICAgUmFzdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdFtdIGdldFBpeGVsKGludCB4LCBpbnQgeSwgZmxvYXQgZkFycmF5W10pIHsKLSAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldFBpeGVsKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkKLSAgICAgICAgICAgICAgICAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgZkFycmF5LCBkYXRhQnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldFBpeGVsKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIGZBcnJheSwKKyAgICAgICAgICAgICAgICBkYXRhQnVmZmVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGludCBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIGluIHRoaXMgUmFzdGVyLiAKKyAgICAgKiBHZXRzIGFuIGludGVnZXIgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBpbiB0aGlzIFJhc3Rlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgcGl4ZWwncyBYIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHkgdGhlIHBpeGVsJ3MgWSBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSBpQXJyYXkgdGhlIGludCBhcnJheSB3aGVyZSB0aGUgcmVzdWx0IGFycmF5IHdpbGwgYmUgc3RvcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludCBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIGluIAotICAgICAqIHRoaXMgUmFzdGVyLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwncyBYIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbCdzIFkgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0gaUFycmF5CisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciBhcnJheSB3aGVyZSB0aGUgcmVzdWx0IGFycmF5IHdpbGwgYmUgc3RvcmVkLgorICAgICAqIEByZXR1cm4gdGhlIGludGVnZXIgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBpbiB0aGlzCisgICAgICogICAgICAgICBSYXN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIGludFtdIGdldFBpeGVsKGludCB4LCBpbnQgeSwgaW50IGlBcnJheVtdKSB7Ci0gICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXRQaXhlbCh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5Ci0gICAgICAgICAgICAgICAgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIGlBcnJheSwgZGF0YUJ1ZmZlcik7CisgICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXRQaXhlbCh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBpQXJyYXksCisgICAgICAgICAgICAgICAgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBkb3VibGUgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhcgotICAgICAqIGFyZWEgb2YgcGl4ZWxzIGluIHRoaXMgUmFzdGVyLgorICAgICAqIEdldHMgYW4gZG91YmxlIGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZgorICAgICAqIHBpeGVscyBpbiB0aGlzIFJhc3Rlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBkQXJyYXkgdGhlIHJlc3VsdGluZyBhcnJheS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkb3VibGUgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhcgotICAgICAqIGFyZWEgb2YgcGl4ZWxzIGluIHRoaXMgUmFzdGVyLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBkQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXN1bHRpbmcgYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgZG91YmxlIGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZgorICAgICAqICAgICAgICAgcGl4ZWxzIGluIHRoaXMgUmFzdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGVbXSBnZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGRvdWJsZSBkQXJyYXlbXSkgewotICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWwuZ2V0UGl4ZWxzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkKLSAgICAgICAgICAgICAgICAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywgaCwgZEFycmF5LCBkYXRhQnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldFBpeGVscyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCB3LCBoLAorICAgICAgICAgICAgICAgIGRBcnJheSwgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBmbG9hdCBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyCi0gICAgICogYXJlYSBvZiBwaXhlbHMgaW4gdGhpcyBSYXN0ZXIuCisgICAgICogR2V0cyBhbiBmbG9hdCBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YKKyAgICAgKiBwaXhlbHMgaW4gdGhpcyBSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gZkFycmF5IHRoZSByZXN1bHRpbmcgYXJyYXkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmxvYXQgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhcgotICAgICAqIGFyZWEgb2YgcGl4ZWxzIGluIHRoaXMgUmFzdGVyLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBmQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXN1bHRpbmcgYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgZmxvYXQgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mCisgICAgICogICAgICAgICBwaXhlbHMgaW4gdGhpcyBSYXN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0W10gZ2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBmbG9hdCBmQXJyYXlbXSkgewotICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWwuZ2V0UGl4ZWxzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkKLSAgICAgICAgICAgICAgICAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywgaCwgZkFycmF5LCBkYXRhQnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldFBpeGVscyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCB3LCBoLAorICAgICAgICAgICAgICAgIGZBcnJheSwgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBpbnQgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhcgotICAgICAqIGFyZWEgb2YgcGl4ZWxzIGluIHRoaXMgUmFzdGVyLgorICAgICAqIEdldHMgYW4gaW50ZWdlciBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YKKyAgICAgKiBwaXhlbHMgaW4gdGhpcyByYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHBpeGVsJ3MgdGhlIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgcGl4ZWwncyB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGlBcnJheSB0aGUgcmVzdWx0aW5nIGFycmF5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludCBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyCi0gICAgICogYXJlYSBvZiBwaXhlbHMgaW4gdGhpcyBSYXN0ZXIuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHBpeGVsJ3MgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHBpeGVsJ3MgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBpQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXN1bHRpbmcgYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgaW50ZWdlciBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEKKyAgICAgKiAgICAgICAgIG9mIHBpeGVscyBpbiB0aGlzIFJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgaW50W10gZ2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgaUFycmF5W10pIHsKLSAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldFBpeGVscyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5Ci0gICAgICAgICAgICAgICAgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsIGgsIGlBcnJheSwgZGF0YUJ1ZmZlcik7CisgICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXRQaXhlbHMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywgaCwKKyAgICAgICAgICAgICAgICBpQXJyYXksIGRhdGFCdWZmZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNhbXBsZSBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIG9mIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBwaXhlbCBhcyBhbiBpbnQuCisgICAgICogR2V0cyB0aGUgc2FtcGxlIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgb2YgdGhlIHNwZWNpZmllZCBwaXhlbCBhcyBhbgorICAgICAqIGludGVnZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogQHBhcmFtIGIgdGhlIGJhbmQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2FtcGxlIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgb2YgdGhlIHNwZWNpZmllZAotICAgICAqIHBpeGVsIGFzIGFuIGludC4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYmFuZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzYW1wbGUgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsIGFzIGFuCisgICAgICogICAgICAgICBpbnRlZ2VyLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0U2FtcGxlKGludCB4LCBpbnQgeSwgaW50IGIpIHsKLSAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldFNhbXBsZSh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5Ci0gICAgICAgICAgICAgICAgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIGIsIGRhdGFCdWZmZXIpOworICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWwuZ2V0U2FtcGxlKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIGIsCisgICAgICAgICAgICAgICAgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2FtcGxlIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgb2YgdGhlIHNwZWNpZmllZAotICAgICAqIHBpeGVsIGFzIGEgZG91YmxlLgorICAgICAqIEdldHMgdGhlIHNhbXBsZSBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwgYXMgYQorICAgICAqIGRvdWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KLSAgICAgKiBAcGFyYW0gYiB0aGUgYmFuZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzYW1wbGUgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCBvZiB0aGUgc3BlY2lmaWVkCi0gICAgICogcGl4ZWwgYXMgYSBkb3VibGUuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJhbmQuCisgICAgICogQHJldHVybiB0aGUgc2FtcGxlIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgb2YgdGhlIHNwZWNpZmllZCBwaXhlbCBhcyBhCisgICAgICogICAgICAgICBkb3VibGUuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZSBnZXRTYW1wbGVEb3VibGUoaW50IHgsIGludCB5LCBpbnQgYikgewotICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWwuZ2V0U2FtcGxlRG91YmxlKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkKLSAgICAgICAgICAgICAgICAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgYiwgZGF0YUJ1ZmZlcik7CisgICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXRTYW1wbGVEb3VibGUoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgYiwKKyAgICAgICAgICAgICAgICBkYXRhQnVmZmVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzYW1wbGUgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCBvZiB0aGUgc3BlY2lmaWVkCi0gICAgICogcGl4ZWwgYXMgYSBmbG9hdC4KKyAgICAgKiBHZXRzIHRoZSBzYW1wbGUgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsIGFzIGEgZmxvYXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogQHBhcmFtIGIgdGhlIGJhbmQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2FtcGxlIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgb2YgdGhlIHNwZWNpZmllZAotICAgICAqIHBpeGVsIGFzIGEgZmxvYXQuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJhbmQuCisgICAgICogQHJldHVybiB0aGUgc2FtcGxlIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgb2YgdGhlIHNwZWNpZmllZCBwaXhlbCBhcyBhCisgICAgICogICAgICAgICBmbG9hdC4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0U2FtcGxlRmxvYXQoaW50IHgsIGludCB5LCBpbnQgYikgewotICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWwuZ2V0U2FtcGxlRmxvYXQoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeQotICAgICAgICAgICAgICAgIC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBiLCBkYXRhQnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldFNhbXBsZUZsb2F0KHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIGIsCisgICAgICAgICAgICAgICAgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjg2LDk3ICsxMzc5LDEwNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBYIGNvb3JkaW5hdGUgZnJvbSB0aGUgU2FtcGxlTW9kZWwKLSAgICAgKiBjb29yZGluYXRlIHN5c3RlbSB0byB0aGUgUmFzdGVycydzIGNvb3JkaW5hdGUgc3lzdGVtLgorICAgICAqIEdldHMgdGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBYIGNvb3JkaW5hdGUgZnJvbSB0aGUgU2FtcGxlTW9kZWwgY29vcmRpbmF0ZQorICAgICAqIHN5c3RlbSB0byB0aGUgUmFzdGVycydzIGNvb3JkaW5hdGUgc3lzdGVtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSB0cmFuc2xhdGlvbiBvZiB0aGUgWCBjb29yZGluYXRlIGZyb20gCi0gICAgICogdGhlIFNhbXBsZU1vZGVsIGNvb3JkaW5hdGUgc3lzdGVtIHRvIHRoZSBSYXN0ZXJzJ3MgCi0gICAgICogY29vcmRpbmF0ZSBzeXN0ZW0uCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBYIGNvb3JkaW5hdGUgZnJvbSB0aGUKKyAgICAgKiAgICAgICAgIFNhbXBsZU1vZGVsIGNvb3JkaW5hdGUgc3lzdGVtIHRvIHRoZSBSYXN0ZXJzJ3MgY29vcmRpbmF0ZSBzeXN0ZW0uCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSB7CiAgICAgICAgIHJldHVybiBzYW1wbGVNb2RlbFRyYW5zbGF0ZVg7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHJhbnNsYXRpb24gb2YgdGhlIFkgY29vcmRpbmF0ZSBmcm9tIHRoZSBTYW1wbGVNb2RlbAotICAgICAqIGNvb3JkaW5hdGUgc3lzdGVtIHRvIHRoZSBSYXN0ZXJzJ3MgY29vcmRpbmF0ZSBzeXN0ZW0uCisgICAgICogR2V0cyB0aGUgdHJhbnNsYXRpb24gb2YgdGhlIFkgY29vcmRpbmF0ZSBmcm9tIHRoZSBTYW1wbGVNb2RlbCBjb29yZGluYXRlCisgICAgICogc3lzdGVtIHRvIHRoZSBSYXN0ZXJzJ3MgY29vcmRpbmF0ZSBzeXN0ZW0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBZIGNvb3JkaW5hdGUgZnJvbSAKLSAgICAgKiB0aGUgU2FtcGxlTW9kZWwgY29vcmRpbmF0ZSBzeXN0ZW0gdG8gdGhlIFJhc3RlcnMncyAKLSAgICAgKiBjb29yZGluYXRlIHN5c3RlbS4KLQorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSB0cmFuc2xhdGlvbiBvZiB0aGUgWSBjb29yZGluYXRlIGZyb20gdGhlCisgICAgICogICAgICAgICBTYW1wbGVNb2RlbCBjb29yZGluYXRlIHN5c3RlbSB0byB0aGUgUmFzdGVycydzIGNvb3JkaW5hdGUgc3lzdGVtLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgewogICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWxUcmFuc2xhdGVZOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgCi0gICAgICogb2YgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscyBpbiB0aGlzIFJhc3RlcgotICAgICAqIGFzIGEgZG91YmxlIGFycmF5LgorICAgICAqIEdldHMgdGhlIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgb2YgdGhlIHNwZWNpZmllZAorICAgICAqIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzIGluIHRoaXMgUmFzdGVyIGFzIGEgZG91YmxlIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLiAKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBiIHRoZSBiYW5kLgotICAgICAqIEBwYXJhbSBkQXJyYXkgdGhlIHJlc3VsdGluZyBkb3VibGUgYXJyYXkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZG91YmxlIGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCAKLSAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYmFuZC4KKyAgICAgKiBAcGFyYW0gZEFycmF5CisgICAgICogICAgICAgICAgICB0aGUgcmVzdWx0aW5nIGRvdWJsZSBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoZSBkb3VibGUgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIG9mIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgogICAgICAqLwotICAgIHB1YmxpYyBkb3VibGVbXSBnZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwKLSAgICAgICAgICAgIGRvdWJsZSBkQXJyYXlbXSkgeworICAgIHB1YmxpYyBkb3VibGVbXSBnZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwgZG91YmxlIGRBcnJheVtdKSB7CiAKLSAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldFNhbXBsZXMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeQotICAgICAgICAgICAgICAgIC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCB3LCBoLCBiLCBkQXJyYXksIGRhdGFCdWZmZXIpOworICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWwuZ2V0U2FtcGxlcyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCB3LCBoLAorICAgICAgICAgICAgICAgIGIsIGRBcnJheSwgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZmxvYXQgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIAotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgaW4gdGhpcyBSYXN0ZXIKLSAgICAgKiBhcyBhIGZsb2F0IGFycmF5LgorICAgICAqIEdldHMgdGhlIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgaW4gdGhpcyBSYXN0ZXIgYXMgYSBmbG9hdCBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4gCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gYiB0aGUgYmFuZC4KLSAgICAgKiBAcGFyYW0gZkFycmF5IHRoZSByZXN1bHRpbmcgZmxvYXQgYXJyYXkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmxvYXQgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIAotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYW5kLgorICAgICAqIEBwYXJhbSBmQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXN1bHRpbmcgZmxvYXQgYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgZmxvYXQgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIG9mIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdFtdIGdldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLCBmbG9hdCBmQXJyYXlbXSkgewogCi0gICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXRTYW1wbGVzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkKLSAgICAgICAgICAgICAgICAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywgaCwgYiwgZkFycmF5LCBkYXRhQnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldFNhbXBsZXMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywgaCwKKyAgICAgICAgICAgICAgICBiLCBmQXJyYXksIGRhdGFCdWZmZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGludCBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgCi0gICAgICogb2YgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscyBpbiB0aGlzIFJhc3RlcgotICAgICAqIGFzIGEgaW50IGFycmF5LgorICAgICAqIEdldHMgdGhlIGludGVnZXIgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscyBpbiB0aGlzIFJhc3RlciBhcyBhIGludGVnZXIgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuIAotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGIgdGhlIGJhbmQuCi0gICAgICogQHBhcmFtIGlBcnJheSB0aGUgcmVzdWx0aW5nIGludCBhcnJheS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIAotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYW5kLgorICAgICAqIEBwYXJhbSBpQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXN1bHRpbmcgaW50ZWdlciBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCBvZiB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KICAgICAgKi8KICAgICBwdWJsaWMgaW50W10gZ2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGludCBpQXJyYXlbXSkgewotICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWwuZ2V0U2FtcGxlcyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5Ci0gICAgICAgICAgICAgICAgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsIGgsIGIsIGlBcnJheSwgZGF0YUJ1ZmZlcik7CisgICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXRTYW1wbGVzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsIGgsCisgICAgICAgICAgICAgICAgYiwgaUFycmF5LCBkYXRhQnVmZmVyKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB0cmFuc2ZlciB0eXBlIGZvciBwaXhlbHMgb2YgdGhpcyBSYXN0ZXIuCi0gICAgICogQHNlZSBTYW1wbGVNb2RlbCNnZXRUcmFuc2ZlclR5cGUoKQogICAgICAqIAorICAgICAqIEBzZWUgU2FtcGxlTW9kZWwjZ2V0VHJhbnNmZXJUeXBlKCkKICAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2ZlciB0eXBlIGZvciBwaXhlbHMgb2YgdGhpcyBSYXN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRUcmFuc2ZlclR5cGUoKSB7CkBAIC0xMzk1LDE4ICsxNDk2LDIwIEBACiAgICAgLyoqCiAgICAgICogVmFsaWRhdGUgZGF0YSBidWZmZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFCdWZmZXIgdGhlIGRhdGEgYnVmZmVyCi0gICAgICogQHBhcmFtIHcgdGhlIHcKLSAgICAgKiBAcGFyYW0gaCB0aGUgaAotICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZSB0aGUgc2NhbmxpbmUgc3RyaWRlCisgICAgICogQHBhcmFtIGRhdGFCdWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHcuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoLgorICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZQorICAgICAqICAgICAgICAgICAgdGhlIHNjYW5saW5lIHN0cmlkZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlRGF0YUJ1ZmZlcihmaW5hbCBEYXRhQnVmZmVyIGRhdGFCdWZmZXIsIGZpbmFsIGludCB3LAotICAgICAgICAgICAgZmluYWwgaW50IGgsIGZpbmFsIGludCBzY2FubGluZVN0cmlkZSkgeworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVEYXRhQnVmZmVyKGZpbmFsIERhdGFCdWZmZXIgZGF0YUJ1ZmZlciwgZmluYWwgaW50IHcsIGZpbmFsIGludCBoLAorICAgICAgICAgICAgZmluYWwgaW50IHNjYW5saW5lU3RyaWRlKSB7CiAgICAgICAgIGlmIChkYXRhQnVmZmVyLmdldFNpemUoKSA8IChzY2FubGluZVN0cmlkZSAqIChoIC0gMSkgKyB3IC0gMSkpIHsKICAgICAgICAgICAgIC8vIGF3dC4yOTg9ZGF0YUJ1ZmZlciBpcyB0b28gc21hbGwKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjk4IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICB9CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL1Jhc3RlckZvcm1hdEV4Y2VwdGlvbi5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL1Jhc3RlckZvcm1hdEV4Y2VwdGlvbi5qYXZhCmluZGV4IDg1NzdkYWQuLmM2NjcxNDEgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9SYXN0ZXJGb3JtYXRFeGNlcHRpb24uamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvUmFzdGVyRm9ybWF0RXhjZXB0aW9uLmphdmEKQEAgLTE4LDI4ICsxOCwzMSBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKLQogLyoqCi0gKiBUaGUgUmFzdGVyRm9ybWF0RXhjZXB0aW9uIGNsYXNzIHJlcHJlc2VudHMgdGhlIGV4Y2VwdGlvbiAKLSAqIHRoYXQgaXMgdGhyb3duIHdoZW4gdGhlcmUncyBhbiBpbnZhbGlkIGxheW91dAotICogaW4gdGhlIFJhc3Rlci4KKyAqIFRoZSBSYXN0ZXJGb3JtYXRFeGNlcHRpb24gY2xhc3MgcmVwcmVzZW50cyB0aGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIHdoZW4KKyAqIHRoZXJlJ3MgYW4gaW52YWxpZCBsYXlvdXQgaW4gdGhlIFJhc3Rlci4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA5NjU5ODk5NjExNjE2NDMxNUw7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uIHdpdGggdGhlIAotICAgICAqIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBkZXRhaWwKKyAgICAgKiBtZXNzYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSBkZXRhaWwgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oU3RyaW5nIHMpIHsKICAgICAgICAgc3VwZXIocyk7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9SYXN0ZXJPcC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL1Jhc3Rlck9wLmphdmEKaW5kZXggZTg5MzNlZS4uMTlhODRjOSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL1Jhc3Rlck9wLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL1Jhc3Rlck9wLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgQWxleGV5IEEuIFBldHJlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEuYXd0LlJlbmRlcmluZ0hpbnRzOwpAQCAtMjUsMjAgKzI2LDIyIEBACiBpbXBvcnQgamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRDsKIAogLyoqCi0gKiBUaGUgUmFzdGVyT3AgaW50ZXJmYWNlIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHBlcmZvcm1pbmcgdHJhbnNmb3JtYXRpb25zCi0gKiBmcm9tIHNvdXJjZSBkYXRhIHRvIGRlc3RpbmF0aW9uIGRhdGEgZm9yIFJhc3RlciBvYmplY3RzLiBUaGUgc291cmNlIGFuZCAKLSAqIGRlc3RpbmF0aW9uIG9iamVjdHMgc2hvdWxkIGNvbnRhaW4gdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBiYW5kcyBmb3IgCi0gKiB0aGUgcGFydGljdWxhciBjbGFzc2VzIHdoaWNoIGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KKyAqIFRoZSBSYXN0ZXJPcCBpbnRlcmZhY2UgcHJvdmlkZXMgbWV0aG9kcyBmb3IgcGVyZm9ybWluZyB0cmFuc2Zvcm1hdGlvbnMgZnJvbQorICogc291cmNlIGRhdGEgdG8gZGVzdGluYXRpb24gZGF0YSBmb3IgUmFzdGVyIG9iamVjdHMuIFRoZSBzb3VyY2UgYW5kCisgKiBkZXN0aW5hdGlvbiBvYmplY3RzIHNob3VsZCBjb250YWluIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYmFuZHMgZm9yIHRoZQorICogcGFydGljdWxhciBjbGFzc2VzIHdoaWNoIGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUmFzdGVyT3AgewotICAgIAorCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGRlc3RpbmF0aW9uIFdyaXRhYmxlUmFzdGVyIHdpdGggdGhlIHNwZWNpZmllZCBSYXN0ZXI7Ci0gICAgICogdGhpcyBkZXN0aW5hdGlvbiBpbWFnZSBkYXRhIGlzIGVtcHR5IGFuZCBoYXMgdGhlIGNvcnJlY3Qgc2l6ZSAKLSAgICAgKiBhbmQgbnVtYmVyIG9mIGJhbmRzLiAgIAorICAgICAqIENyZWF0ZXMgYSBkZXN0aW5hdGlvbiBXcml0YWJsZVJhc3RlciB3aXRoIHRoZSBzcGVjaWZpZWQgUmFzdGVyOyB0aGlzCisgICAgICogZGVzdGluYXRpb24gaW1hZ2UgZGF0YSBpcyBlbXB0eSBhbmQgaGFzIHRoZSBjb3JyZWN0IHNpemUgYW5kIG51bWJlciBvZgorICAgICAqIGJhbmRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIHNvdXJjZSBSYXN0ZXIuCi0gICAgICogCisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBSYXN0ZXIuCiAgICAgICogQHJldHVybiB0aGUgV3JpdGFibGVSYXN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZUNvbXBhdGlibGVEZXN0UmFzdGVyKFJhc3RlciBzcmMpOwpAQCAtNDcsOSArNTAsMTAgQEAKICAgICAgKiBQZXJmb3JtcyBhIGZpbHRlciBvcGVyYXRpb24gb24gdGhlIHNvdXJjZSBSYXN0ZXIgYW5kIHN0b3JlcyB0aGUgcmVzdWx0aW5nCiAgICAgICogaW1hZ2UgZGF0YSB0byB0aGUgZGVzdGluYXRpb24gV3JpdGFibGVSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc291cmNlIFJhc3Rlci4KLSAgICAgKiBAcGFyYW0gZHN0IHRoZSBkZXN0aW5hdGlvbiBXcml0YWJsZVJhc3Rlciwgd2hlcmUgdGhlIHJlc3VsdCBpcyBzdG9yZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBSYXN0ZXIuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIFdyaXRhYmxlUmFzdGVyLCB3aGVyZSB0aGUgcmVzdWx0IGlzIHN0b3JlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBmaWx0ZXJlZCBXcml0YWJsZVJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgV3JpdGFibGVSYXN0ZXIgZmlsdGVyKFJhc3RlciBzcmMsIFdyaXRhYmxlUmFzdGVyIGRzdCk7CkBAIC01NywxOSArNjEsMjAgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBib3VuZHMgb2YgdGhlIGZpbHRlcmVkIFJhc3Rlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBzb3VyY2UgUmFzdGVyIHRvIGJlIGZpbHRlcmVkLgotICAgICAqIAorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgUmFzdGVyIHRvIGJlIGZpbHRlcmVkLgogICAgICAqIEByZXR1cm4gdGhlIHJlY3RhbmdsZSBib3VuZHMgb2YgdGhlIGZpbHRlcmVkIFJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzMkQoUmFzdGVyIHNyYyk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwb2ludCBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugd2hpY2ggY29ycmVzcG9uZHMKLSAgICAgKiB0byB0aGUgc3BlY2lmaWVkIHBvaW50IGluIHRoZSBzb3VyY2UgcmFzdGVyLgorICAgICAqIEdldHMgdGhlIHBvaW50IG9mIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgcG9pbnQgaW4gdGhlIHNvdXJjZSByYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyY1BvaW50IHRoZSBwb2ludCBvZiB0aGUgc291cmNlIHJhc3Rlci4KLSAgICAgKiBAcGFyYW0gZHN0UG9pbnQgdGhlIHBvaW50IHdoZXJlIHRoZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIHNyY1BvaW50CisgICAgICogICAgICAgICAgICB0aGUgcG9pbnQgb2YgdGhlIHNvdXJjZSByYXN0ZXIuCisgICAgICogQHBhcmFtIGRzdFBvaW50CisgICAgICogICAgICAgICAgICB0aGUgcG9pbnQgd2hlcmUgdGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBkZXN0aW5hdGlvbiBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgUG9pbnQyRCBnZXRQb2ludDJEKFBvaW50MkQgc3JjUG9pbnQsIFBvaW50MkQgZHN0UG9pbnQpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL1JlbmRlcmVkSW1hZ2UuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9SZW5kZXJlZEltYWdlLmphdmEKaW5kZXggZGIzYTRjOC4uNWVhZmE2NCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL1JlbmRlcmVkSW1hZ2UuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvUmVuZGVyZWRJbWFnZS5qYXZhCkBAIC0xOCwzNSArMTgsMzcgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIC8qKgotICogVGhlIFJlbmRlcmVkSW1hZ2UgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgb2JqZWN0cyB3aGljaCAKLSAqIGNvbnRhaW5zIGltYWdlIGRhdGEuIFRoZSBpbWFnZSBkYXRhIGlzIHJlcHJlc2VudGVkIGFzIGEgc2luZ2xlIHRpbGUgb3IgCi0gKiBhbiBhcnJheSBvZiB0aWxlcy4KKyAqIFRoZSBSZW5kZXJlZEltYWdlIGludGVyZmFjZSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgYWxsIG9iamVjdHMgd2hpY2gKKyAqIGNvbnRhaW5zIGltYWdlIGRhdGEuIFRoZSBpbWFnZSBkYXRhIGlzIHJlcHJlc2VudGVkIGFzIGEgc2luZ2xlIHRpbGUgb3IgYW4KKyAqIGFycmF5IG9mIHRpbGVzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBSZW5kZXJlZEltYWdlIHsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGZyb20gdGhlIHByb3BlcnR5IHNldCAKLSAgICAgKiBvZiB0aGlzIFJlbmRlcmVkSW1hZ2UuCisgICAgICogR2V0cyB0aGUgcHJvcGVydHkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgZnJvbSB0aGUgcHJvcGVydHkgc2V0IG9mIHRoaXMKKyAgICAgKiBSZW5kZXJlZEltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBwcm9wZXJ0eSdzIG5hbWUuCi0gICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSdzIG5hbWUuCiAgICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgY29ycmVzcG9uZGVkIHRvIHRoaXMgcHJvcGVydHkncyBuYW1lLgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpOwogCiAgICAgLyoqCi0gICAgICogQ29waWVzIHRoZSByZWdpb24gb2YgdGhpcyBSZW5kZXJlZEltYWdlIHRvIHRoZSBzcGVjaWZpZWQgCi0gICAgICogV3JpdGFibGVSYXN0ZXIuIFRoZSBib3VuZHMgb2YgdGhlIHJlZ2lvbiBhcmUgdGhlIGJvdW5kcyBvZiB0aGUgCi0gICAgICogV3JpdGFibGVSYXN0ZXIuCisgICAgICogQ29waWVzIHRoZSByZWdpb24gb2YgdGhpcyBSZW5kZXJlZEltYWdlIHRvIHRoZSBzcGVjaWZpZWQgV3JpdGFibGVSYXN0ZXIuCisgICAgICogVGhlIGJvdW5kcyBvZiB0aGUgcmVnaW9uIGFyZSB0aGUgYm91bmRzIG9mIHRoZSBXcml0YWJsZVJhc3Rlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmFzdGVyIHRoZSBXcml0YWJsZVJhc3Rlci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmFzdGVyCisgICAgICogICAgICAgICAgICB0aGUgV3JpdGFibGVSYXN0ZXIuCiAgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBXcml0YWJsZVJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgV3JpdGFibGVSYXN0ZXIgY29weURhdGEoV3JpdGFibGVSYXN0ZXIgcmFzdGVyKTsKQEAgLTU0LDE5ICs1NiwxOSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGltYWdlIGRhdGEgb2YgdGhlIGltYWdlJ3MgcmVnaW9uIGFzIG9uZSB0aWxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSByZWN0IHRoZSByZWN0YW5ndWxhciByZWdpb24gb2YgUmVuZGVyZWRJbWFnZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVjdAorICAgICAqICAgICAgICAgICAgdGhlIHJlY3Rhbmd1bGFyIHJlZ2lvbiBvZiBSZW5kZXJlZEltYWdlLgogICAgICAqIEByZXR1cm4gdGhlIGltYWdlIGRhdGEgb2YgdGhlIGltYWdlJ3MgcmVnaW9uIGFzIG9uZSB0aWxlLgogICAgICAqLwogICAgIHB1YmxpYyBSYXN0ZXIgZ2V0RGF0YShSZWN0YW5nbGUgcmVjdCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFsbCBSZW5kZXJlZEltYWdlIG9iamVjdHMgd2hpY2ggYXJlIHRoZSBzb3VyY2Ugb2YgdGhpcwotICAgICAqIFJlbmRlcmVkSW1hZ2Ugb2JqZWN0LgorICAgICAqIEdldHMgYWxsIFJlbmRlcmVkSW1hZ2Ugb2JqZWN0cyB3aGljaCBhcmUgdGhlIHNvdXJjZSBvZiB0aGlzIFJlbmRlcmVkSW1hZ2UKKyAgICAgKiBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIFZlY3RvciBvZiBSZW5kZXJlZEltYWdlIG9iamVjdHMgd2hpY2ggYXJlIHRoZSBzb3VyY2UgCi0gICAgICogb2YgdGhpcyBSZW5kZXJlZEltYWdlIG9iamVjdCBvciBudWxsLCBpZiB0aGVyZSBpcyBubyBpbmZvcm1hdGlvbgotICAgICAqIGFib3V0IHRoZW0uCisgICAgICogQHJldHVybiBhIFZlY3RvciBvZiBSZW5kZXJlZEltYWdlIG9iamVjdHMgd2hpY2ggYXJlIHRoZSBzb3VyY2Ugb2YgdGhpcworICAgICAqICAgICAgICAgUmVuZGVyZWRJbWFnZSBvYmplY3Qgb3IgbnVsbCwgaWYgdGhlcmUgaXMgbm8gaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgKiAgICAgICAgIHRoZW0uCiAgICAgICovCiAgICAgcHVibGljIFZlY3RvcjxSZW5kZXJlZEltYWdlPiBnZXRTb3VyY2VzKCk7CiAKQEAgLTg1LDE0ICs4NywxMyBAQAogICAgIHB1YmxpYyBTYW1wbGVNb2RlbCBnZXRTYW1wbGVNb2RlbCgpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGlsZSBjb3JyZXNwb25kZWQgdG8gdGhlIHNwZWNpZmllZCBpbmRpY2VzIGluIHRoZSB0aWxlCi0gICAgICogYXJyYXkuCisgICAgICogR2V0cyB0aGUgdGlsZSBjb3JyZXNwb25kZWQgdG8gdGhlIHNwZWNpZmllZCBpbmRpY2VzIGluIHRoZSB0aWxlIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSB0aWxlWCB0aGUgWCBpbmRleCBvZiB0aGUgdGlsZS4gIAotICAgICAqIEBwYXJhbSB0aWxlWSB0aGUgWSBpbmRleCBvZiB0aGUgdGlsZS4gCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdGlsZSBjb3JyZXNwb25kZWQgdG8gdGhlIHNwZWNpZmllZCBpbmRpY2VzIGluIHRoZSB0aWxlCi0gICAgICogYXJyYXkuCisgICAgICogQHBhcmFtIHRpbGVYCisgICAgICogICAgICAgICAgICB0aGUgWCBpbmRleCBvZiB0aGUgdGlsZS4KKyAgICAgKiBAcGFyYW0gdGlsZVkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGluZGV4IG9mIHRoZSB0aWxlLgorICAgICAqIEByZXR1cm4gdGhlIHRpbGUgY29ycmVzcG9uZGVkIHRvIHRoZSBzcGVjaWZpZWQgaW5kaWNlcyBpbiB0aGUgdGlsZSBhcnJheS4KICAgICAgKi8KICAgICBwdWJsaWMgUmFzdGVyIGdldFRpbGUoaW50IHRpbGVYLCBpbnQgdGlsZVkpOwogCkBAIC0xOTUsNCArMTk2LDMgQEAKICAgICBwdWJsaWMgaW50IGdldEhlaWdodCgpOwogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9SZXBsaWNhdGVTY2FsZUZpbHRlci5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL1JlcGxpY2F0ZVNjYWxlRmlsdGVyLmphdmEKaW5kZXggOTI5ODEyNS4uNTFjMGY0OSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL1JlcGxpY2F0ZVNjYWxlRmlsdGVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL1JlcGxpY2F0ZVNjYWxlRmlsdGVyLmphdmEKQEAgLTE4LDUzICsxOCw2OSBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKLQogLyoqCi0gKiBUaGUgUmVwbGljYXRlU2NhbGVGaWx0ZXIgY2xhc3Mgc2NhbGVzIGFuIHNvdXJjZSBpbWFnZSAKLSAqIGJ5IHJlcGxpY2F0aW5nIHJvd3MgYW5kIGNvbHVtbnMgb2YgcGl4ZWxzIHRvIHNjYWxlIHVwIG9yIAotICogb21pdHRpbmcgcm93cyBhbmQgY29sdW1ucyBvZiBwaXhlbHMgdG8gc2NhbGUgZG93bi4KKyAqIFRoZSBSZXBsaWNhdGVTY2FsZUZpbHRlciBjbGFzcyBzY2FsZXMgYW4gc291cmNlIGltYWdlIGJ5IHJlcGxpY2F0aW5nIHJvd3MgYW5kCisgKiBjb2x1bW5zIG9mIHBpeGVscyB0byBzY2FsZSB1cCBvciBvbWl0dGluZyByb3dzIGFuZCBjb2x1bW5zIG9mIHBpeGVscyB0byBzY2FsZQorICogZG93bi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBSZXBsaWNhdGVTY2FsZUZpbHRlciBleHRlbmRzIEltYWdlRmlsdGVyIHsKIAotICAgIC8qKiBUaGUgd2lkdGggb2YgYSBzb3VyY2UgaW1hZ2UuICovCisgICAgLyoqCisgICAgICogVGhlIHdpZHRoIG9mIGEgc291cmNlIGltYWdlLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgc3JjV2lkdGg7CiAKLSAgICAvKiogVGhlIGhlaWdodCBvZiBhIHNvdXJjZSBpbWFnZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaGVpZ2h0IG9mIGEgc291cmNlIGltYWdlLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgc3JjSGVpZ2h0OwogCi0gICAgLyoqIFRoZSB3aWR0aCBvZiBhIGRlc3RpbmF0aW9uIGltYWdlLiAqLworICAgIC8qKgorICAgICAqIFRoZSB3aWR0aCBvZiBhIGRlc3RpbmF0aW9uIGltYWdlLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgZGVzdFdpZHRoOwogCi0gICAgLyoqIFRoZSBoZWlnaHQgb2YgYSBkZXN0aW5hdGlvbiBpbWFnZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaGVpZ2h0IG9mIGEgZGVzdGluYXRpb24gaW1hZ2UuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBkZXN0SGVpZ2h0OwogCi0gICAgLyoqIFRoZSBpbnQgYXJyYXkgb2Ygc291cmNlIHJvd3MuICovCisgICAgLyoqCisgICAgICogVGhlIGludGVnZXIgYXJyYXkgb2Ygc291cmNlIHJvd3MuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludFtdIHNyY3Jvd3M7CiAKLSAgICAvKiogVGhlIGludCBhcnJheSBvZiBzb3VyY2UgY29sdW1ucy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaW50ZWdlciBhcnJheSBvZiBzb3VyY2UgY29sdW1ucy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50W10gc3JjY29sczsKIAotICAgIC8qKiAKLSAgICAgKiBBbiBPYmplY3QgKGJ5dGUgYXJyYXkgd2l0aCBhIGRlc3RpbmF0aW9uIHdpZHRoKSBwcm92aWRlcyAKLSAgICAgKiBhIHJvdyBvZiBwaXhlbCBkYXRhIHRvIHRoZSBJbWFnZUNvbnN1bWVyLiAKKyAgICAvKioKKyAgICAgKiBBbiBPYmplY3QgKGJ5dGUgYXJyYXkgd2l0aCBhIGRlc3RpbmF0aW9uIHdpZHRoKSBwcm92aWRlcyBhIHJvdyBvZiBwaXhlbAorICAgICAqIGRhdGEgdG8gdGhlIEltYWdlQ29uc3VtZXIuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIE9iamVjdCBvdXRwaXhidWY7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgUmVwbGljYXRlU2NhbGVGaWx0ZXIgdGhhdCBmaWx0ZXJzIAotICAgICAqIHRoZSBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgd2lkdGggYW5kIGhlaWdodC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgUmVwbGljYXRlU2NhbGVGaWx0ZXIgdGhhdCBmaWx0ZXJzIHRoZSBpbWFnZSB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2Ygc2NhbGVkIGltYWdlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiBzY2FsZWQgaW1hZ2UuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2Ygc2NhbGVkIGltYWdlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2Ygc2NhbGVkIGltYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBSZXBsaWNhdGVTY2FsZUZpbHRlcihpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgaWYod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkgeworICAgICAgICBpZiAod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkgewogICAgICAgICAgICAgLy8gYXd0LjIzND1XaWR0aCBvciBIZWlnaHQgZXF1YWxzIHplcm8KICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjM0IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KQEAgLTc3LDQwICs5Myw0MCBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoSGFzaHRhYmxlPD8sID8+IHByb3BzKSB7CiAgICAgICAgIEhhc2h0YWJsZTxPYmplY3QsIE9iamVjdD4gZnByb3BzOwotICAgICAgICBpZihwcm9wcyA9PSBudWxsKSB7CisgICAgICAgIGlmIChwcm9wcyA9PSBudWxsKSB7CiAgICAgICAgICAgICBmcHJvcHMgPSBuZXcgSGFzaHRhYmxlPE9iamVjdCwgT2JqZWN0PigpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZnByb3BzID0gKEhhc2h0YWJsZTxPYmplY3QsIE9iamVjdD4pIHByb3BzLmNsb25lKCk7CisgICAgICAgICAgICBmcHJvcHMgPSAoSGFzaHRhYmxlPE9iamVjdCwgT2JqZWN0Pilwcm9wcy5jbG9uZSgpOwogICAgICAgICB9CiAgICAgICAgIFN0cmluZyBwcm9wTmFtZSA9ICJSZXNjYWxlIEZpbHRlcnMiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBwcm9wID0gImRlc3RXaWR0aD0iICsgZGVzdFdpZHRoICsgIjsgIiArICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgImRlc3RIZWlnaHQ9IiArIGRlc3RIZWlnaHQ7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgU3RyaW5nIHByb3AgPSAiZGVzdFdpZHRoPSIgKyBkZXN0V2lkdGggKyAiOyAiICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgICAgICAgICAgImRlc3RIZWlnaHQ9IiArIGRlc3RIZWlnaHQ7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgT2JqZWN0IG8gPSBmcHJvcHMuZ2V0KHByb3BOYW1lKTsKLSAgICAgICAgaWYobyAhPSBudWxsKXsKLSAgICAgICAgICAgIGlmKG8gaW5zdGFuY2VvZiBTdHJpbmcpeworICAgICAgICBpZiAobyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFN0cmluZykgewogICAgICAgICAgICAgICAgIHByb3AgPSAoU3RyaW5nKW8gKyAiOyAiICsgcHJvcDsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgcHJvcCA9ICBvLnRvU3RyaW5nKCkgKyAiOyAiICsgcHJvcDsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcm9wID0gby50b1N0cmluZygpICsgIjsgIiArIHByb3A7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBmcHJvcHMucHV0KHByb3BOYW1lLCBwcm9wKTsKICAgICAgICAgY29uc3VtZXIuc2V0UHJvcGVydGllcyhmcHJvcHMpOwotICAgICB9CisgICAgfQogCiAgICAgLy8gc2V0UGl4ZWxzIG1ldGhvZHMgcHJvZHVjZSBwaXhlbHMgYWNjb3JkaW5nIHRvIEphdmEgQVBJIFNwYWNpZmljYXRpb24KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgCi0gICAgICAgICAgICBDb2xvck1vZGVsIG1vZGVsLCBpbnRbXSBwaXhlbHMsIGludCBvZmYsIGludCBzY2Fuc2l6ZSkgewotICAgICAgICAKLSAgICAgICAgaWYoc3JjY29scyA9PSBudWxsKSB7CisgICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBDb2xvck1vZGVsIG1vZGVsLCBpbnRbXSBwaXhlbHMsIGludCBvZmYsCisgICAgICAgICAgICBpbnQgc2NhbnNpemUpIHsKKworICAgICAgICBpZiAoc3JjY29scyA9PSBudWxsKSB7CiAgICAgICAgICAgICBpbml0QXJyYXlzKCk7CiAgICAgICAgIH0KICAgICAgICAgaW50IGJ1ZmZbXTsKLSAgICAgICAgaWYob3V0cGl4YnVmID09IG51bGwgfHwgIShvdXRwaXhidWYgaW5zdGFuY2VvZiBpbnRbXSkpeworICAgICAgICBpZiAob3V0cGl4YnVmID09IG51bGwgfHwgIShvdXRwaXhidWYgaW5zdGFuY2VvZiBpbnRbXSkpIHsKICAgICAgICAgICAgIGJ1ZmYgPSBuZXcgaW50W2Rlc3RXaWR0aF07CiAgICAgICAgICAgICBvdXRwaXhidWYgPSBidWZmOwotICAgICAgICB9ZWxzZXsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ1ZmYgPSAoaW50W10pb3V0cGl4YnVmOwogICAgICAgICB9CiAKQEAgLTEyMSwzMiArMTM3LDMxIEBACiAKICAgICAgICAgaW50IHN4LCBzeSwgZHgsIGR5OwogICAgICAgICBkeSA9IGRzdFk7Ci0gICAgICAgIHdoaWxlKChkeSA8IGRlc3RIZWlnaHQpICYmICgoc3kgPSBzcmNyb3dzW2R5XSkgPCB5ICsgaCkpeworICAgICAgICB3aGlsZSAoKGR5IDwgZGVzdEhlaWdodCkgJiYgKChzeSA9IHNyY3Jvd3NbZHldKSA8IHkgKyBoKSkgewogICAgICAgICAgICAgZHggPSBkc3RYOwogICAgICAgICAgICAgaW50IHNyY09mZiA9IG9mZiArIChzeSAtIHkpICogc2NhbnNpemU7Ci0gICAgICAgICAgICB3aGlsZSgoZHggPCBkZXN0V2lkdGgpICYmICgoc3ggPSBzcmNjb2xzW2R4XSkgPCB4ICsgdykpeworICAgICAgICAgICAgd2hpbGUgKChkeCA8IGRlc3RXaWR0aCkgJiYgKChzeCA9IHNyY2NvbHNbZHhdKSA8IHggKyB3KSkgewogICAgICAgICAgICAgICAgIGJ1ZmZbZHhdID0gcGl4ZWxzW3NyY09mZiArIChzeCAtIHgpXTsKICAgICAgICAgICAgICAgICBkeCsrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjb25zdW1lci5zZXRQaXhlbHMoZHN0WCwgZHksIGR4IC0gZHN0WCwgMSwgbW9kZWwsIGJ1ZmYsIAotICAgICAgICAgICAgICAgICAgICBkc3RYLCBkZXN0V2lkdGgpOworICAgICAgICAgICAgY29uc3VtZXIuc2V0UGl4ZWxzKGRzdFgsIGR5LCBkeCAtIGRzdFgsIDEsIG1vZGVsLCBidWZmLCBkc3RYLCBkZXN0V2lkdGgpOwogICAgICAgICAgICAgZHkrKzsKICAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgCi0gICAgICAgICAgICBDb2xvck1vZGVsIG1vZGVsLCBieXRlW10gcGl4ZWxzLCBpbnQgb2ZmLCBpbnQgc2NhbnNpemUpIHsKLSAgICAgICAgCi0gICAgICAgIGlmKHNyY2NvbHMgPT0gbnVsbCkgeworICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBtb2RlbCwgYnl0ZVtdIHBpeGVscywgaW50IG9mZiwKKyAgICAgICAgICAgIGludCBzY2Fuc2l6ZSkgeworCisgICAgICAgIGlmIChzcmNjb2xzID09IG51bGwpIHsKICAgICAgICAgICAgIGluaXRBcnJheXMoKTsKICAgICAgICAgfQogICAgICAgICBieXRlIGJ1ZmZbXTsKLSAgICAgICAgaWYob3V0cGl4YnVmID09IG51bGwgfHwgIShvdXRwaXhidWYgaW5zdGFuY2VvZiBieXRlW10pKXsKKyAgICAgICAgaWYgKG91dHBpeGJ1ZiA9PSBudWxsIHx8ICEob3V0cGl4YnVmIGluc3RhbmNlb2YgYnl0ZVtdKSkgewogICAgICAgICAgICAgYnVmZiA9IG5ldyBieXRlW2Rlc3RXaWR0aF07CiAgICAgICAgICAgICBvdXRwaXhidWYgPSBidWZmOwotICAgICAgICB9ZWxzZXsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ1ZmYgPSAoYnl0ZVtdKW91dHBpeGJ1ZjsKICAgICAgICAgfQogCkBAIC0xNTcsMTYgKzE3MiwxNSBAQAogCiAgICAgICAgIGludCBzeCwgc3ksIGR4LCBkeTsKICAgICAgICAgZHkgPSBkc3RZOwotICAgICAgICB3aGlsZSgoZHkgPCBkZXN0SGVpZ2h0KSAmJiAoKHN5ID0gc3Jjcm93c1tkeV0pIDwgeSArIGgpKXsKKyAgICAgICAgd2hpbGUgKChkeSA8IGRlc3RIZWlnaHQpICYmICgoc3kgPSBzcmNyb3dzW2R5XSkgPCB5ICsgaCkpIHsKICAgICAgICAgICAgIGR4ID0gZHN0WDsKICAgICAgICAgICAgIGludCBzcmNPZmYgPSBvZmYgKyAoc3kgLSB5KSAqIHNjYW5zaXplOwotICAgICAgICAgICAgd2hpbGUoKGR4IDwgZGVzdFdpZHRoKSAmJiAoKHN4ID0gc3JjY29sc1tkeF0pIDwgeCArIHcpKXsKKyAgICAgICAgICAgIHdoaWxlICgoZHggPCBkZXN0V2lkdGgpICYmICgoc3ggPSBzcmNjb2xzW2R4XSkgPCB4ICsgdykpIHsKICAgICAgICAgICAgICAgICBidWZmW2R4XSA9IHBpeGVsc1tzcmNPZmYgKyAoc3ggLSB4KV07CiAgICAgICAgICAgICAgICAgZHgrKzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY29uc3VtZXIuc2V0UGl4ZWxzKGRzdFgsIGR5LCBkeCAtIGRzdFgsIDEsIG1vZGVsLCBidWZmLCAKLSAgICAgICAgICAgICAgICAgICAgZHN0WCwgZGVzdFdpZHRoKTsKKyAgICAgICAgICAgIGNvbnN1bWVyLnNldFBpeGVscyhkc3RYLCBkeSwgZHggLSBkc3RYLCAxLCBtb2RlbCwgYnVmZiwgZHN0WCwgZGVzdFdpZHRoKTsKICAgICAgICAgICAgIGR5Kys7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNzYsMTIgKzE5MCwxMiBAQAogICAgICAgICBzcmNXaWR0aCA9IHc7CiAgICAgICAgIHNyY0hlaWdodCA9IGg7CiAKLSAgICAgICAgaWYoZGVzdFdpZHRoIDwgMCAmJiBkZXN0SGVpZ2h0IDwgMCl7CisgICAgICAgIGlmIChkZXN0V2lkdGggPCAwICYmIGRlc3RIZWlnaHQgPCAwKSB7CiAgICAgICAgICAgICBkZXN0V2lkdGggPSBzcmNXaWR0aDsKICAgICAgICAgICAgIGRlc3RIZWlnaHQgPSBzcmNIZWlnaHQ7Ci0gICAgICAgIH1lbHNlIGlmKGRlc3RXaWR0aCA8IDApeworICAgICAgICB9IGVsc2UgaWYgKGRlc3RXaWR0aCA8IDApIHsKICAgICAgICAgICAgIGRlc3RXaWR0aCA9IGRlc3RIZWlnaHQgKiBzcmNXaWR0aCAvIHNyY0hlaWdodDsKLSAgICAgICAgfWVsc2UgaWYoZGVzdEhlaWdodCA8IDApeworICAgICAgICB9IGVsc2UgaWYgKGRlc3RIZWlnaHQgPCAwKSB7CiAgICAgICAgICAgICBkZXN0SGVpZ2h0ID0gZGVzdFdpZHRoICogc3JjSGVpZ2h0IC8gc3JjV2lkdGg7CiAgICAgICAgIH0KICAgICAgICAgY29uc3VtZXIuc2V0RGltZW5zaW9ucyhkZXN0V2lkdGgsIGRlc3RIZWlnaHQpOwpAQCAtMTkwLDI0ICsyMDQsMjIgQEAKICAgICAvKioKICAgICAgKiBJbml0aWFsaXphdGlvbiBvZiBzcmNjb2xzIGFuZCBzcmNyb3dzIGFycmF5cy4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdEFycmF5cygpeworICAgIHByaXZhdGUgdm9pZCBpbml0QXJyYXlzKCkgewogICAgICAgICBpZiAoKGRlc3RXaWR0aCA8IDApIHx8IChkZXN0SGVpZ2h0IDwgMCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgc3JjY29scyA9IG5ldyBpbnRbZGVzdFdpZHRoXTsKICAgICAgICAgaW50IGNhID0gc3JjV2lkdGggPj4+IDE7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBkZXN0V2lkdGg7IGkrKyl7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzdFdpZHRoOyBpKyspIHsKICAgICAgICAgICAgIHNyY2NvbHNbaV0gPSAoaSAqIHNyY1dpZHRoICsgY2EpIC8gZGVzdFdpZHRoOwogICAgICAgICB9CiAKICAgICAgICAgc3Jjcm93cyA9IG5ldyBpbnRbZGVzdEhlaWdodF07CiAgICAgICAgIGludCByYSA9IHNyY0hlaWdodCA+Pj4gMTsKLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGRlc3RIZWlnaHQ7IGkrKyl7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzdEhlaWdodDsgaSsrKSB7CiAgICAgICAgICAgICBzcmNyb3dzW2ldID0gKGkgKiBzcmNIZWlnaHQgKyByYSkgLyBkZXN0SGVpZ2h0OwogICAgICAgICB9CiAgICAgfQogCiB9Ci0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL1Jlc2NhbGVPcC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL1Jlc2NhbGVPcC5qYXZhCmluZGV4IDBlOTYwMzEuLmQ3ZTJiZDcgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9SZXNjYWxlT3AuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvUmVzY2FsZU9wLmphdmEKQEAgLTMyLDMzICszMiw0MyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBDbGFzcyBSZXNjYWxlT3AgcGVyZm9ybXMgcmVzY2FsaW5nIG9mIHRoZSBzb3VyY2UgaW1hZ2UgZGF0YQotICogYnkgbXVsdGlwbHlpbmcgdGhlIHBpeGVsIHZhbHVlcyB3aXRoIGEgc2NhbGUgZmFjdG9yIAotICogYW5kIHRoZW4gYWRkaW5nIGFuIG9mZnNldC4KKyAqIFRoZSBDbGFzcyBSZXNjYWxlT3AgcGVyZm9ybXMgcmVzY2FsaW5nIG9mIHRoZSBzb3VyY2UgaW1hZ2UgZGF0YSBieQorICogbXVsdGlwbHlpbmcgdGhlIHBpeGVsIHZhbHVlcyB3aXRoIGEgc2NhbGUgZmFjdG9yIGFuZCB0aGVuIGFkZGluZyBhbiBvZmZzZXQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUmVzY2FsZU9wIGltcGxlbWVudHMgQnVmZmVyZWRJbWFnZU9wLCBSYXN0ZXJPcCB7Ci0gICAgCi0gICAgLyoqIFRoZSBzY2FsZSBmYWN0b3JzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHNjYWxlIGZhY3RvcnMuCisgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCBzY2FsZUZhY3RvcnNbXTsKLSAgICAKLSAgICAvKiogVGhlIG9mZnNldHMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgb2Zmc2V0cy4KKyAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0IG9mZnNldHNbXTsKLSAgICAKLSAgICAvKiogVGhlIGhpbnRzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGhpbnRzLgorICAgICAqLwogICAgIHByaXZhdGUgUmVuZGVyaW5nSGludHMgaGludHM7CiAKICAgICBzdGF0aWMgewogICAgICAgICAvLyBUT0RPCi0gICAgICAgIC8vU3lzdGVtLmxvYWRMaWJyYXJ5KCJpbWFnZW9wcyIpOworICAgICAgICAvLyBTeXN0ZW0ubG9hZExpYnJhcnkoImltYWdlb3BzIik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFJlc2NhbGVPcCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIAotICAgICAqIHNjYWxlIGZhY3RvcnMgYW5kIG9mZnNldHMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFJlc2NhbGVPcCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHNjYWxlIGZhY3RvcnMgYW5kCisgICAgICogb2Zmc2V0cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2NhbGVGYWN0b3JzIHRoZSBhcnJheSBvZiBzY2FsZSBmYWN0b3IgdmFsdWVzLgotICAgICAqIEBwYXJhbSBvZmZzZXRzIHRoZSBhcnJheSBvZiBvZmZzZXQgdmFsdWVzLgotICAgICAqIEBwYXJhbSBoaW50cyB0aGUgUmVuZGVyaW5nSGludHMgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gc2NhbGVGYWN0b3JzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2Ygc2NhbGUgZmFjdG9yIHZhbHVlcy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIG9mZnNldCB2YWx1ZXMuCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgUmVuZGVyaW5nSGludHMgb3IgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgUmVzY2FsZU9wKGZsb2F0W10gc2NhbGVGYWN0b3JzLCBmbG9hdFtdIG9mZnNldHMsIFJlbmRlcmluZ0hpbnRzIGhpbnRzKSB7CiAgICAgICAgIGludCBudW1GYWN0b3JzID0gTWF0aC5taW4oc2NhbGVGYWN0b3JzLmxlbmd0aCwgb2Zmc2V0cy5sZW5ndGgpOwpAQCAtNzMsMTIgKzgzLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFJlc2NhbGVPcCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIAotICAgICAqIHNjYWxlIGZhY3RvciBhbmQgb2Zmc2V0LgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBSZXNjYWxlT3Agb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBzY2FsZSBmYWN0b3IgYW5kCisgICAgICogb2Zmc2V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzY2FsZUZhY3RvciB0aGUgc2NhbGUgZmFjdG9yLgotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldC4KLSAgICAgKiBAcGFyYW0gaGludHMgdGhlIFJlbmRlcmluZ0hpbnRzIG9yIG51bGwuCisgICAgICogQHBhcmFtIHNjYWxlRmFjdG9yCisgICAgICogICAgICAgICAgICB0aGUgc2NhbGUgZmFjdG9yLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQuCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgUmVuZGVyaW5nSGludHMgb3IgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgUmVzY2FsZU9wKGZsb2F0IHNjYWxlRmFjdG9yLCBmbG9hdCBvZmZzZXQsIFJlbmRlcmluZ0hpbnRzIGhpbnRzKSB7CiAgICAgICAgIHNjYWxlRmFjdG9ycyA9IG5ldyBmbG9hdFsxXTsKQEAgLTEwNiw5ICsxMTksOCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHNjYWxlIGZhY3RvcnMgb2YgdGhpcyBSZXNjYWxlT3AuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNjYWxlRmFjdG9ycyB0aGUgZGVzaXJlZCBzY2FsZSBmYWN0b3JzIGFycmF5IHdpbGwgYmUgY29waWVkIAotICAgICAqIHRvIHRoaXMgYXJyYXkuCi0gICAgICogCisgICAgICogQHBhcmFtIHNjYWxlRmFjdG9ycworICAgICAqICAgICAgICAgICAgdGhlIGRlc2lyZWQgc2NhbGUgZmFjdG9ycyBhcnJheSB3aWxsIGJlIGNvcGllZCB0byB0aGlzIGFycmF5LgogICAgICAqIEByZXR1cm4gdGhlIHNjYWxlIGZhY3RvcnMgYXJyYXkuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGZsb2F0W10gZ2V0U2NhbGVGYWN0b3JzKGZsb2F0W10gc2NhbGVGYWN0b3JzKSB7CkBAIC0xMjQsOCArMTM2LDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBvZmZzZXRzIGFycmF5IG9mIHRoaXMgUmVzY2FsZU9wLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvZmZzZXRzIHRoZSBkZXNpcmVkIG9mZnNldHMgYXJyYXkgd2lsbCBiZSBjb3BpZWQgdG8gdGhpcyBhcnJheS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIGRlc2lyZWQgb2Zmc2V0cyBhcnJheSB3aWxsIGJlIGNvcGllZCB0byB0aGlzIGFycmF5LgogICAgICAqIEByZXR1cm4gdGhlIG9mZnNldHMgYXJyYXkgb2YgdGhpcyBSZXNjYWxlT3AuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGZsb2F0W10gZ2V0T2Zmc2V0cyhmbG9hdFtdIG9mZnNldHMpIHsKQEAgLTE2OCwxNyArMTgwLDExIEBACiAgICAgICAgICAgICBkc3RDTSA9IENvbG9yTW9kZWwuZ2V0UkdCZGVmYXVsdCgpOwogICAgICAgICB9CiAKLSAgICAgICAgV3JpdGFibGVSYXN0ZXIgciA9Ci0gICAgICAgICAgICAgICAgZHN0Q00uaXNDb21wYXRpYmxlU2FtcGxlTW9kZWwoc3JjLmdldFNhbXBsZU1vZGVsKCkpID8KLSAgICAgICAgICAgICAgICBzcmMuZ2V0UmFzdGVyKCkuY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHNyYy5nZXRXaWR0aCgpLCBzcmMuZ2V0SGVpZ2h0KCkpIDoKLSAgICAgICAgICAgICAgICBkc3RDTS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSk7CisgICAgICAgIFdyaXRhYmxlUmFzdGVyIHIgPSBkc3RDTS5pc0NvbXBhdGlibGVTYW1wbGVNb2RlbChzcmMuZ2V0U2FtcGxlTW9kZWwoKSkgPyBzcmMuZ2V0UmFzdGVyKCkKKyAgICAgICAgICAgICAgICAuY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHNyYy5nZXRXaWR0aCgpLCBzcmMuZ2V0SGVpZ2h0KCkpIDogZHN0Q00KKyAgICAgICAgICAgICAgICAuY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHNyYy5nZXRXaWR0aCgpLCBzcmMuZ2V0SGVpZ2h0KCkpOwogCi0gICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRJbWFnZSgKLSAgICAgICAgICAgICAgICBkc3RDTSwKLSAgICAgICAgICAgICAgICByLAotICAgICAgICAgICAgICAgIGRzdENNLmlzQWxwaGFQcmVtdWx0aXBsaWVkKCksCi0gICAgICAgICAgICAgICAgbnVsbAotICAgICAgICApOworICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkSW1hZ2UoZHN0Q00sIHIsIGRzdENNLmlzQWxwaGFQcmVtdWx0aXBsaWVkKCksIG51bGwpOwogICAgIH0KIAogICAgIHB1YmxpYyBmaW5hbCBXcml0YWJsZVJhc3RlciBmaWx0ZXIoUmFzdGVyIHNyYywgV3JpdGFibGVSYXN0ZXIgZHN0KSB7CkBAIC0xODYsMjYgKzE5MiwyNSBAQAogICAgICAgICAgICAgZHN0ID0gY3JlYXRlQ29tcGF0aWJsZURlc3RSYXN0ZXIoc3JjKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChzcmMuZ2V0TnVtQmFuZHMoKSAhPSBkc3QuZ2V0TnVtQmFuZHMoKSkgewotICAgICAgICAgICAgICAgIC8vIGF3dC4yMUQ9TnVtYmVyIG9mIHNyYyBiYW5kcyAoezB9KSBkb2VzIG5vdCBtYXRjaCBudW1iZXIgb2YgZHN0IGJhbmRzICh7MX0pCisgICAgICAgICAgICAgICAgLy8gYXd0LjIxRD1OdW1iZXIgb2Ygc3JjIGJhbmRzICh7MH0pIGRvZXMgbm90IG1hdGNoIG51bWJlciBvZgorICAgICAgICAgICAgICAgIC8vIGRzdCBiYW5kcyAoezF9KQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjFEIiwgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICAgICAgICAgc3JjLmdldE51bUJhbmRzKCksIGRzdC5nZXROdW1CYW5kcygpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgdGhpcy5zY2FsZUZhY3RvcnMubGVuZ3RoICE9IDEgJiYKLSAgICAgICAgICAgICAgICB0aGlzLnNjYWxlRmFjdG9ycy5sZW5ndGggIT0gc3JjLmdldE51bUJhbmRzKCkKLSAgICAgICAgKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjFFPU51bWJlciBvZiBzY2FsaW5nIGNvbnN0YW50cyBpcyBub3QgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBiYW5kcworICAgICAgICBpZiAodGhpcy5zY2FsZUZhY3RvcnMubGVuZ3RoICE9IDEgJiYgdGhpcy5zY2FsZUZhY3RvcnMubGVuZ3RoICE9IHNyYy5nZXROdW1CYW5kcygpKSB7CisgICAgICAgICAgICAvLyBhd3QuMjFFPU51bWJlciBvZiBzY2FsaW5nIGNvbnN0YW50cyBpcyBub3QgZXF1YWwgdG8gdGhlIG51bWJlciBvZgorICAgICAgICAgICAgLy8gYmFuZHMKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjFFIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAogICAgICAgICAvLyBUT0RPCi0gICAgICAgIC8vaWYgKGlwcEZpbHRlcihzcmMsIGRzdCwgQnVmZmVyZWRJbWFnZS5UWVBFX0NVU1RPTSwgZmFsc2UpICE9IDApCi0gICAgICAgICAgICBpZiAoc2xvd0ZpbHRlcihzcmMsIGRzdCwgZmFsc2UpICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBhd3QuMjFGPVVuYWJsZSB0byB0cmFuc2Zvcm0gc291cmNlCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdpbmdPcEV4Y2VwdGlvbiAoTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjFGIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9CisgICAgICAgIC8vIGlmIChpcHBGaWx0ZXIoc3JjLCBkc3QsIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9DVVNUT00sIGZhbHNlKSAhPSAwKQorICAgICAgICBpZiAoc2xvd0ZpbHRlcihzcmMsIGRzdCwgZmFsc2UpICE9IDApIHsKKyAgICAgICAgICAgIC8vIGF3dC4yMUY9VW5hYmxlIHRvIHRyYW5zZm9ybSBzb3VyY2UKKyAgICAgICAgICAgIHRocm93IG5ldyBJbWFnaW5nT3BFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjFGIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gZHN0OwogICAgIH0KQEAgLTIxMywxMSArMjE4LDEzIEBACiAgICAgLyoqCiAgICAgICogU2xvdyBmaWx0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc3JjCi0gICAgICogQHBhcmFtIGRzdCB0aGUgZHN0Ci0gICAgICogQHBhcmFtIHNraXBBbHBoYSB0aGUgc2tpcCBhbHBoYQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludAorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIGRzdC4KKyAgICAgKiBAcGFyYW0gc2tpcEFscGhhCisgICAgICogICAgICAgICAgICB0aGUgc2tpcCBhbHBoYS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgc2xvd0ZpbHRlcihSYXN0ZXIgc3JjLCBXcml0YWJsZVJhc3RlciBkc3QsIGJvb2xlYW4gc2tpcEFscGhhKSB7CiAgICAgICAgIFNhbXBsZU1vZGVsIHNtID0gc3JjLmdldFNhbXBsZU1vZGVsKCk7CkBAIC0yMzUsNyArMjQyLDcgQEAKICAgICAgICAgaW50W10gbWFza3MgPSBuZXcgaW50W251bUJhbmRzXTsKICAgICAgICAgaW50W10gc2FtcGxlU2l6ZXMgPSBzbS5nZXRTYW1wbGVTaXplKCk7CiAKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgbnVtQmFuZHM7IGkrKyl7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgewogICAgICAgICAgICAgbWF4VmFsdWVzW2ldID0gKDEgPDwgc2FtcGxlU2l6ZXNbaV0pIC0gMTsKICAgICAgICAgICAgIG1hc2tzW2ldID0gfihtYXhWYWx1ZXNbaV0pOwogICAgICAgICB9CkBAIC0yNDcsOCArMjU0LDggQEAKICAgICAgICAgLy8gQ3ljbGUgb3ZlciBwaXhlbHMgdG8gYmUgY2FsY3VsYXRlZAogICAgICAgICBpZiAoc2tpcEFscGhhKSB7IC8vIEFsd2F5cyBzdXBwb3NlIHRoYXQgYWxwaGEgY2hhbm5lbCBpcyB0aGUgbGFzdCBiYW5kCiAgICAgICAgICAgICBpZiAoc2NhbGVGYWN0b3JzLmxlbmd0aCA+IDEpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVscy5sZW5ndGg7ICl7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGJhbmRJZHggPSAwOyBiYW5kSWR4IDwgbnVtQmFuZHMtMTsgYmFuZElkeCsrLCBpKyspeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzLmxlbmd0aDspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYmFuZElkeCA9IDA7IGJhbmRJZHggPCBudW1CYW5kcyAtIDE7IGJhbmRJZHgrKywgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNbaV0gPSBwaXhlbHNbaV0gKiBzY2FsZUZhY3RvcnNbYmFuZElkeF0gKyBvZmZzZXRzW2JhbmRJZHhdOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIG92ZXJmbG93IG5vdwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoaW50KXBpeGVsc1tpXSAmIG1hc2tzW2JhbmRJZHhdKSAhPSAwKSB7CkBAIC0yNjMsOCArMjcwLDggQEAKICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHMubGVuZ3RoOyApewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBiYW5kSWR4ID0gMDsgYmFuZElkeCA8IG51bUJhbmRzLTE7IGJhbmRJZHgrKywgaSsrKXsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVscy5sZW5ndGg7KSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGJhbmRJZHggPSAwOyBiYW5kSWR4IDwgbnVtQmFuZHMgLSAxOyBiYW5kSWR4KyssIGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW2ldID0gcGl4ZWxzW2ldICogc2NhbGVGYWN0b3JzWzBdICsgb2Zmc2V0c1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBvdmVyZmxvdyBub3cKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGludClwaXhlbHNbaV0gJiBtYXNrc1tiYW5kSWR4XSkgIT0gMCkgewpAQCAtMjgxLDggKzI4OCw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoc2NhbGVGYWN0b3JzLmxlbmd0aCA+IDEpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVscy5sZW5ndGg7ICl7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGJhbmRJZHggPSAwOyBiYW5kSWR4IDwgbnVtQmFuZHM7IGJhbmRJZHgrKywgaSsrKXsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVscy5sZW5ndGg7KSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGJhbmRJZHggPSAwOyBiYW5kSWR4IDwgbnVtQmFuZHM7IGJhbmRJZHgrKywgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNbaV0gPSBwaXhlbHNbaV0gKiBzY2FsZUZhY3RvcnNbYmFuZElkeF0gKyBvZmZzZXRzW2JhbmRJZHhdOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIG92ZXJmbG93IG5vdwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoaW50KXBpeGVsc1tpXSAmIG1hc2tzW2JhbmRJZHhdKSAhPSAwKSB7CkBAIC0yOTUsOCArMzAyLDggQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHMubGVuZ3RoOyApewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBiYW5kSWR4ID0gMDsgYmFuZElkeCA8IG51bUJhbmRzOyBiYW5kSWR4KyssIGkrKyl7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHMubGVuZ3RoOykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBiYW5kSWR4ID0gMDsgYmFuZElkeCA8IG51bUJhbmRzOyBiYW5kSWR4KyssIGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW2ldID0gcGl4ZWxzW2ldICogc2NhbGVGYWN0b3JzWzBdICsgb2Zmc2V0c1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBvdmVyZmxvdyBub3cKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGludClwaXhlbHNbaV0gJiBtYXNrc1tiYW5kSWR4XSkgIT0gMCkgewpAQCAtMzI4LDE4ICszMzUsMjAgQEAKICAgICAgICAgaW50IG5Db21wb25lbnRzID0gc3JjQ00uZ2V0TnVtQ29tcG9uZW50cygpOwogICAgICAgICBib29sZWFuIHNraXBBbHBoYTsKICAgICAgICAgaWYgKHNyY0NNLmhhc0FscGhhKCkpIHsKLSAgICAgICAgICAgIGlmIChzY2FsZUZhY3RvcnMubGVuZ3RoID09IDEgfHwgc2NhbGVGYWN0b3JzLmxlbmd0aCA9PSBuQ29tcG9uZW50cy0xKSB7CisgICAgICAgICAgICBpZiAoc2NhbGVGYWN0b3JzLmxlbmd0aCA9PSAxIHx8IHNjYWxlRmFjdG9ycy5sZW5ndGggPT0gbkNvbXBvbmVudHMgLSAxKSB7CiAgICAgICAgICAgICAgICAgc2tpcEFscGhhID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NhbGVGYWN0b3JzLmxlbmd0aCA9PSBuQ29tcG9uZW50cykgewogICAgICAgICAgICAgICAgIHNraXBBbHBoYSA9IGZhbHNlOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBhd3QuMjFFPU51bWJlciBvZiBzY2FsaW5nIGNvbnN0YW50cyBpcyBub3QgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBiYW5kcworICAgICAgICAgICAgICAgIC8vIGF3dC4yMUU9TnVtYmVyIG9mIHNjYWxpbmcgY29uc3RhbnRzIGlzIG5vdCBlcXVhbCB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgYmFuZHMKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxRSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKHNjYWxlRmFjdG9ycy5sZW5ndGggPT0gMSB8fCBzY2FsZUZhY3RvcnMubGVuZ3RoID09IG5Db21wb25lbnRzKSB7CiAgICAgICAgICAgICBza2lwQWxwaGEgPSBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGF3dC4yMUU9TnVtYmVyIG9mIHNjYWxpbmcgY29uc3RhbnRzIGlzIG5vdCBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGJhbmRzCisgICAgICAgICAgICAvLyBhd3QuMjFFPU51bWJlciBvZiBzY2FsaW5nIGNvbnN0YW50cyBpcyBub3QgZXF1YWwgdG8gdGhlIG51bWJlciBvZgorICAgICAgICAgICAgLy8gYmFuZHMKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjFFIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIApAQCAtMzQ4LDI0ICszNTcsMjIgQEAKICAgICAgICAgICAgIGZpbmFsRHN0ID0gZHN0OwogICAgICAgICAgICAgZHN0ID0gY3JlYXRlQ29tcGF0aWJsZURlc3RJbWFnZShzcmMsIHNyY0NNKTsKICAgICAgICAgfSBlbHNlIGlmICghc3JjQ00uZXF1YWxzKGRzdC5nZXRDb2xvck1vZGVsKCkpKSB7Ci0gICAgICAgICAgICAvLyBUcmVhdCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQiBhbmQgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCIGFzIHNhbWUKLSAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgISgoc3JjLmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQiB8fAotICAgICAgICAgICAgICAgICAgICAgICBzcmMuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAoZHN0LmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQiB8fAotICAgICAgICAgICAgICAgICAgICAgICBkc3QuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQikpCi0gICAgICAgICAgICApIHsKKyAgICAgICAgICAgIC8vIFRyZWF0IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCIGFuZCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IKKyAgICAgICAgICAgIC8vIGFzIHNhbWUKKyAgICAgICAgICAgIGlmICghKChzcmMuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCIHx8IHNyYy5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKSAmJiAoZHN0CisgICAgICAgICAgICAgICAgICAgIC5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IgfHwgZHN0LmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpKSkgewogICAgICAgICAgICAgICAgIGZpbmFsRHN0ID0gZHN0OwogICAgICAgICAgICAgICAgIGRzdCA9IGNyZWF0ZUNvbXBhdGlibGVEZXN0SW1hZ2Uoc3JjLCBzcmNDTSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBUT0RPCi0gICAgICAgIC8vaWYgKGlwcEZpbHRlcihzcmMuZ2V0UmFzdGVyKCksIGRzdC5nZXRSYXN0ZXIoKSwgc3JjLmdldFR5cGUoKSwgc2tpcEFscGhhKSAhPSAwKQotICAgICAgICAgICAgaWYgKHNsb3dGaWx0ZXIoc3JjLmdldFJhc3RlcigpLCBkc3QuZ2V0UmFzdGVyKCksIHNraXBBbHBoYSkgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGF3dC4yMUY9VW5hYmxlIHRvIHRyYW5zZm9ybSBzb3VyY2UKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uIChNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMUYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KKyAgICAgICAgLy8gaWYgKGlwcEZpbHRlcihzcmMuZ2V0UmFzdGVyKCksIGRzdC5nZXRSYXN0ZXIoKSwgc3JjLmdldFR5cGUoKSwKKyAgICAgICAgLy8gc2tpcEFscGhhKSAhPSAwKQorICAgICAgICBpZiAoc2xvd0ZpbHRlcihzcmMuZ2V0UmFzdGVyKCksIGRzdC5nZXRSYXN0ZXIoKSwgc2tpcEFscGhhKSAhPSAwKSB7CisgICAgICAgICAgICAvLyBhd3QuMjFGPVVuYWJsZSB0byB0cmFuc2Zvcm0gc291cmNlCisgICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxRiIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CiAKICAgICAgICAgaWYgKGZpbmFsRHN0ICE9IG51bGwpIHsKICAgICAgICAgICAgIEdyYXBoaWNzMkQgZyA9IGZpbmFsRHN0LmNyZWF0ZUdyYXBoaWNzKCk7CkBAIC0zNzgsMjEgKzM4NSwyNiBAQAogICAgICAgICByZXR1cm4gZmluYWxEc3Q7CiAgICAgfQogCi0gICAgLy8gRG9uJ3QgZm9yZ2V0IHRvIHBhc3MgYWxsb2NhdGVkIGFycmF5cyBmb3IgbGV2ZWxzIGFuZCB2YWx1ZXMsIHNpemUgc2hvdWxkIGJlIG51bUJhbmRzKjQKKyAgICAvLyBEb24ndCBmb3JnZXQgdG8gcGFzcyBhbGxvY2F0ZWQgYXJyYXlzIGZvciBsZXZlbHMgYW5kIHZhbHVlcywgc2l6ZSBzaG91bGQKKyAgICAvLyBiZSBudW1CYW5kcyo0CiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgbGV2ZWxzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzbSB0aGUgc20KLSAgICAgKiBAcGFyYW0gbnVtQmFuZHMgdGhlIG51bSBiYW5kcwotICAgICAqIEBwYXJhbSBza2lwQWxwaGEgdGhlIHNraXAgYWxwaGEKLSAgICAgKiBAcGFyYW0gbGV2ZWxzIHRoZSBsZXZlbHMKLSAgICAgKiBAcGFyYW0gdmFsdWVzIHRoZSB2YWx1ZXMKLSAgICAgKiBAcGFyYW0gY2hhbm5lbHNPcmRlciB0aGUgY2hhbm5lbHMgb3JkZXIKKyAgICAgKiBAcGFyYW0gc20KKyAgICAgKiAgICAgICAgICAgIHRoZSBzbS4KKyAgICAgKiBAcGFyYW0gbnVtQmFuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW0gYmFuZHMuCisgICAgICogQHBhcmFtIHNraXBBbHBoYQorICAgICAqICAgICAgICAgICAgdGhlIHNraXAgYWxwaGEuCisgICAgICogQHBhcmFtIGxldmVscworICAgICAqICAgICAgICAgICAgdGhlIGxldmVscy4KKyAgICAgKiBAcGFyYW0gdmFsdWVzCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWVzLgorICAgICAqIEBwYXJhbSBjaGFubmVsc09yZGVyCisgICAgICogICAgICAgICAgICB0aGUgY2hhbm5lbHMgb3JkZXIuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNyZWF0ZUxldmVscygKLSAgICAgICAgICAgIFNhbXBsZU1vZGVsIHNtLCBpbnQgbnVtQmFuZHMsIGJvb2xlYW4gc2tpcEFscGhhLAotICAgICAgICAgICAgaW50IGxldmVsc1tdLCBpbnQgdmFsdWVzW10sIGludCBjaGFubmVsc09yZGVyW10KLSAgICApIHsKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgY3JlYXRlTGV2ZWxzKFNhbXBsZU1vZGVsIHNtLCBpbnQgbnVtQmFuZHMsIGJvb2xlYW4gc2tpcEFscGhhLCBpbnQgbGV2ZWxzW10sCisgICAgICAgICAgICBpbnQgdmFsdWVzW10sIGludCBjaGFubmVsc09yZGVyW10pIHsKICAgICAgICAgLy8gU3VwcG9zZSBzYW1lIHNhbXBsZSBzaXplIGZvciBhbGwgY2hhbm5lbHMsIG90aGVyd2lzZSB1c2Ugc2xvdyBmaWx0ZXIKICAgICAgICAgaW50IG1heFZhbHVlID0gKDEgPDwgc20uZ2V0U2FtcGxlU2l6ZSgwKSkgLSAxOwogCkBAIC00MTEsMTcgKzQyMywxNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKHNraXBBbHBoYSkgewotICAgICAgICAgICAgZXh0U2NhbGVGYWN0b3JzW251bUJhbmRzLTFdID0gMTsKLSAgICAgICAgICAgIGV4dE9mZnNldHNbbnVtQmFuZHMtMV0gPSAwOworICAgICAgICAgICAgZXh0U2NhbGVGYWN0b3JzW251bUJhbmRzIC0gMV0gPSAxOworICAgICAgICAgICAgZXh0T2Zmc2V0c1tudW1CYW5kcyAtIDFdID0gMDsKICAgICAgICAgfQogCiAgICAgICAgIC8vIENyZWF0ZSBhIGxldmVscwotICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtQmFuZHM7IGkrKykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKICAgICAgICAgICAgIGlmIChleHRTY2FsZUZhY3RvcnNbaV0gPT0gMCkgewotICAgICAgICAgICAgICAgIGxldmVsc1tpKjRdID0gMDsKLSAgICAgICAgICAgICAgICBsZXZlbHNbaSo0KzFdID0gMDsKLSAgICAgICAgICAgICAgICBsZXZlbHNbaSo0KzJdID0gbWF4VmFsdWUrMTsKLSAgICAgICAgICAgICAgICBsZXZlbHNbaSo0KzNdID0gbWF4VmFsdWUrMTsKKyAgICAgICAgICAgICAgICBsZXZlbHNbaSAqIDRdID0gMDsKKyAgICAgICAgICAgICAgICBsZXZlbHNbaSAqIDQgKyAxXSA9IDA7CisgICAgICAgICAgICAgICAgbGV2ZWxzW2kgKiA0ICsgMl0gPSBtYXhWYWx1ZSArIDE7CisgICAgICAgICAgICAgICAgbGV2ZWxzW2kgKiA0ICsgM10gPSBtYXhWYWx1ZSArIDE7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGZsb2F0IG1pbkxldmVsID0gLWV4dE9mZnNldHNbaV0gLyBleHRTY2FsZUZhY3RvcnNbaV07CkBAIC00MjksMzMgKzQ0MSwzMyBAQAogCiAgICAgICAgICAgICBpZiAobWluTGV2ZWwgPCAwKSB7CiAgICAgICAgICAgICAgICAgbWluTGV2ZWwgPSAwOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtaW5MZXZlbCA+IG1heFZhbHVlKXsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWluTGV2ZWwgPiBtYXhWYWx1ZSkgewogICAgICAgICAgICAgICAgIG1pbkxldmVsID0gbWF4VmFsdWU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtYXhMZXZlbCA8IDApIHsKICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1heExldmVsID4gbWF4VmFsdWUpeworICAgICAgICAgICAgfSBlbHNlIGlmIChtYXhMZXZlbCA+IG1heFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBtYXhWYWx1ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbGV2ZWxzW2kqNF0gPSAwOworICAgICAgICAgICAgbGV2ZWxzW2kgKiA0XSA9IDA7CiAgICAgICAgICAgICBpZiAobWluTGV2ZWwgPiBtYXhMZXZlbCkgewotICAgICAgICAgICAgICAgIGxldmVsc1tpKjQrMV0gPSAoaW50KSBtYXhMZXZlbDsKLSAgICAgICAgICAgICAgICBsZXZlbHNbaSo0KzJdID0gKGludCkgbWluTGV2ZWw7CisgICAgICAgICAgICAgICAgbGV2ZWxzW2kgKiA0ICsgMV0gPSAoaW50KW1heExldmVsOworICAgICAgICAgICAgICAgIGxldmVsc1tpICogNCArIDJdID0gKGludCltaW5MZXZlbDsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbGV2ZWxzW2kqNCsxXSA9IChpbnQpIG1pbkxldmVsOwotICAgICAgICAgICAgICAgIGxldmVsc1tpKjQrMl0gPSAoaW50KSBtYXhMZXZlbDsKKyAgICAgICAgICAgICAgICBsZXZlbHNbaSAqIDQgKyAxXSA9IChpbnQpbWluTGV2ZWw7CisgICAgICAgICAgICAgICAgbGV2ZWxzW2kgKiA0ICsgMl0gPSAoaW50KW1heExldmVsOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbGV2ZWxzW2kqNCszXSA9IG1heFZhbHVlKzE7CisgICAgICAgICAgICBsZXZlbHNbaSAqIDQgKyAzXSA9IG1heFZhbHVlICsgMTsKIAogICAgICAgICAgICAgLy8gRmlsbCB2YWx1ZXMKLSAgICAgICAgICAgIGZvciAoaW50IGs9MDsgazw0OyBrKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgaWR4ID0gaSo0K2s7Ci0gICAgICAgICAgICAgICAgdmFsdWVzW2lkeF0gPSAoaW50KSAoZXh0U2NhbGVGYWN0b3JzW2ldICogbGV2ZWxzW2lkeF0gKyBleHRPZmZzZXRzW2ldKTsKKyAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IGkgKiA0ICsgazsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbaWR4XSA9IChpbnQpKGV4dFNjYWxlRmFjdG9yc1tpXSAqIGxldmVsc1tpZHhdICsgZXh0T2Zmc2V0c1tpXSk7CiAgICAgICAgICAgICAgICAgaWYgKHZhbHVlc1tpZHhdIDwgMCkgewogICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaWR4XSA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZXNbaWR4XSA+IG1heFZhbHVlKXsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlc1tpZHhdID4gbWF4VmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2lkeF0gPSBtYXhWYWx1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC00NjMsMTQgKzQ3NSwxNCBAQAogCiAgICAgICAgIC8vIFJlb3JkZXIgZGF0YSBpZiBjaGFubmVscyBhcmUgc3RvcmVkIGluIGRpZmZlcmVudCBvcmRlcgogICAgICAgICBpZiAoY2hhbm5lbHNPcmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgbGVuID0gbnVtQmFuZHMqNDsKKyAgICAgICAgICAgIGludCBsZW4gPSBudW1CYW5kcyAqIDQ7CiAgICAgICAgICAgICBpbnQgc2F2ZWRMZXZlbHNbXSA9IG5ldyBpbnRbbGVuXTsKICAgICAgICAgICAgIGludCBzYXZlZFZhbHVlc1tdID0gbmV3IGludFtsZW5dOwogICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShsZXZlbHMsIDAsIHNhdmVkTGV2ZWxzLCAwLCBsZW4pOwogICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh2YWx1ZXMsIDAsIHNhdmVkVmFsdWVzLCAwLCBsZW4pOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVsc09yZGVyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShzYXZlZExldmVscywgaSo0LCBsZXZlbHMsIGNoYW5uZWxzT3JkZXJbaV0qNCwgNCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShzYXZlZFZhbHVlcywgaSo0LCB2YWx1ZXMsIGNoYW5uZWxzT3JkZXJbaV0qNCwgNCk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShzYXZlZExldmVscywgaSAqIDQsIGxldmVscywgY2hhbm5lbHNPcmRlcltpXSAqIDQsIDQpOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc2F2ZWRWYWx1ZXMsIGkgKiA0LCB2YWx1ZXMsIGNoYW5uZWxzT3JkZXJbaV0gKiA0LCA0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTQ3OSwxOCArNDkxLDE4IEBACiAgICAgLyoqCiAgICAgICogSXBwIGZpbHRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBzcmMKLSAgICAgKiBAcGFyYW0gZHN0IHRoZSBkc3QKLSAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlIHRoZSBpbWFnZSB0eXBlCi0gICAgICogQHBhcmFtIHNraXBBbHBoYSB0aGUgc2tpcCBhbHBoYQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludAorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIGRzdC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgdHlwZS4KKyAgICAgKiBAcGFyYW0gc2tpcEFscGhhCisgICAgICogICAgICAgICAgICB0aGUgc2tpcCBhbHBoYS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgaXBwRmlsdGVyKAotICAgICAgICAgICAgUmFzdGVyIHNyYywgV3JpdGFibGVSYXN0ZXIgZHN0LAotICAgICAgICAgICAgaW50IGltYWdlVHlwZSwgYm9vbGVhbiBza2lwQWxwaGEKLSAgICApIHsKKyAgICBwcml2YXRlIGZpbmFsIGludCBpcHBGaWx0ZXIoUmFzdGVyIHNyYywgV3JpdGFibGVSYXN0ZXIgZHN0LCBpbnQgaW1hZ2VUeXBlLCBib29sZWFuIHNraXBBbHBoYSkgewogICAgICAgICBpbnQgcmVzOwogCiAgICAgICAgIGludCBzcmNTdHJpZGUsIGRzdFN0cmlkZTsKQEAgLTUwMyw5ICs1MTUsMTEgQEAKICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCX1BSRToKICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0I6IHsKICAgICAgICAgICAgICAgICBjaGFubmVscyA9IDQ7Ci0gICAgICAgICAgICAgICAgc3JjU3RyaWRlID0gc3JjLmdldFdpZHRoKCkqNDsKLSAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSBkc3QuZ2V0V2lkdGgoKSo0OwotICAgICAgICAgICAgICAgIGNoYW5uZWxzT3JkZXIgPSBuZXcgaW50W10gezIsIDEsIDAsIDN9OworICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpICogNDsKKyAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSBkc3QuZ2V0V2lkdGgoKSAqIDQ7CisgICAgICAgICAgICAgICAgY2hhbm5lbHNPcmRlciA9IG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAyLCAxLCAwLCAzCisgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtNTEzLDggKzUyNyw4IEBACiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV80QllURV9BQkdSX1BSRToKICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9CR1I6IHsKICAgICAgICAgICAgICAgICBjaGFubmVscyA9IDQ7Ci0gICAgICAgICAgICAgICAgc3JjU3RyaWRlID0gc3JjLmdldFdpZHRoKCkqNDsKLSAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSBkc3QuZ2V0V2lkdGgoKSo0OworICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpICogNDsKKyAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSBkc3QuZ2V0V2lkdGgoKSAqIDQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTUyNyw5ICs1NDEsMTEgQEAKIAogICAgICAgICAgICAgY2FzZSBCdWZmZXJlZEltYWdlLlRZUEVfM0JZVEVfQkdSOiB7CiAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSAzOwotICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpKjM7Ci0gICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkqMzsKLSAgICAgICAgICAgICAgICBjaGFubmVsc09yZGVyID0gbmV3IGludFtdIHsyLCAxLCAwfTsKKyAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSBzcmMuZ2V0V2lkdGgoKSAqIDM7CisgICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkgKiAzOworICAgICAgICAgICAgICAgIGNoYW5uZWxzT3JkZXIgPSBuZXcgaW50W10geworICAgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgMAorICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTU0NCw1NSArNTYwLDQ2IEBACiAgICAgICAgICAgICAgICAgU2FtcGxlTW9kZWwgc3JjU00gPSBzcmMuZ2V0U2FtcGxlTW9kZWwoKTsKICAgICAgICAgICAgICAgICBTYW1wbGVNb2RlbCBkc3RTTSA9IGRzdC5nZXRTYW1wbGVNb2RlbCgpOwogCi0gICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAgICAgc3JjU00gaW5zdGFuY2VvZiBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFNNIGluc3RhbmNlb2YgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsCi0gICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgaWYgKHNyY1NNIGluc3RhbmNlb2YgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBkc3RTTSBpbnN0YW5jZW9mIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCkgewogICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwKLSAgICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NNLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTTS5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFCi0gICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3JjU00uZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRzdFNNLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzbG93RmlsdGVyKHNyYywgZHN0LCBza2lwQWxwaGEpOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSBzcmNTTS5nZXROdW1CYW5kcygpOyAvLyBIYXZlIElQUCBmdW5jdGlvbnMgZm9yIDEsIDMgYW5kIDQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSBzcmNTTS5nZXROdW1CYW5kcygpOyAvLyBIYXZlIElQUCBmdW5jdGlvbnMgZm9yIDEsCisgICAgICAgICAgICAgICAgICAgIC8vIDMgYW5kIDQgY2hhbm5lbHMKICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY2hhbm5lbHMgPT0gMSB8fCBjaGFubmVscyA9PSAzIHx8IGNoYW5uZWxzID09IDQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2xvd0ZpbHRlcihzcmMsIGRzdCwgc2tpcEFscGhhKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9ICgoQ29tcG9uZW50U2FtcGxlTW9kZWwpIHNyY1NNKS5nZXRTY2FubGluZVN0cmlkZSgpOwotICAgICAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSAoKENvbXBvbmVudFNhbXBsZU1vZGVsKSBkc3RTTSkuZ2V0U2NhbmxpbmVTdHJpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgc3JjU3RyaWRlID0gKChDb21wb25lbnRTYW1wbGVNb2RlbClzcmNTTSkuZ2V0U2NhbmxpbmVTdHJpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gKChDb21wb25lbnRTYW1wbGVNb2RlbClkc3RTTSkuZ2V0U2NhbmxpbmVTdHJpZGUoKTsKIAotICAgICAgICAgICAgICAgICAgICBjaGFubmVsc09yZGVyID0gKChDb21wb25lbnRTYW1wbGVNb2RlbCkgc3JjU00pLmdldEJhbmRPZmZzZXRzKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NNIGluc3RhbmNlb2YgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgZHN0U00gaW5zdGFuY2VvZiBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsCi0gICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzT3JkZXIgPSAoKENvbXBvbmVudFNhbXBsZU1vZGVsKXNyY1NNKS5nZXRCYW5kT2Zmc2V0cygpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjU00gaW5zdGFuY2VvZiBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBkc3RTTSBpbnN0YW5jZW9mIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbAotICAgICAgICAgICAgICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNwcHNtMSA9IChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKSBzcmNTTTsKLSAgICAgICAgICAgICAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBzcHBzbTIgPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkgZHN0U007CisgICAgICAgICAgICAgICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgc3Bwc20xID0gKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpc3JjU007CisgICAgICAgICAgICAgICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgc3Bwc20yID0gKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpZHN0U007CiAKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSBzcHBzbTEuZ2V0TnVtQmFuZHMoKTsKIAotICAgICAgICAgICAgICAgICAgICAgLy8gVFlQRV9JTlRfUkdCLCBUWVBFX0lOVF9BUkdCLi4uCi0gICAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHBzbTEuZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfSU5UIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bwc20yLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoY2hhbm5lbHMgPT0gMyB8fCBjaGFubmVscyA9PSA0KQotICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVFlQRV9JTlRfUkdCLCBUWVBFX0lOVF9BUkdCLi4uCisgICAgICAgICAgICAgICAgICAgIGlmIChzcHBzbTEuZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfSU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3Bwc20yLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEoY2hhbm5lbHMgPT0gMyB8fCBjaGFubmVscyA9PSA0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNsb3dGaWx0ZXIoc3JjLCBkc3QsIHNraXBBbHBoYSk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBjb21wYXRpYmlsaXR5IG9mIHNhbXBsZSBtb2RlbHMKLSAgICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRPZmZzZXRzKCksIHNwcHNtMi5nZXRCaXRPZmZzZXRzKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIUFycmF5cy5lcXVhbHMoc3Bwc20xLmdldEJpdE1hc2tzKCksIHNwcHNtMi5nZXRCaXRNYXNrcygpKQotICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRPZmZzZXRzKCksIHNwcHNtMi5nZXRCaXRPZmZzZXRzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIUFycmF5cy5lcXVhbHMoc3Bwc20xLmdldEJpdE1hc2tzKCksIHNwcHNtMi5nZXRCaXRNYXNrcygpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNsb3dGaWx0ZXIoc3JjLCBkc3QsIHNraXBBbHBoYSk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcHBzbTEuZ2V0U2FtcGxlU2l6ZShpKSAhPSA4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNsb3dGaWx0ZXIoc3JjLCBkc3QsIHNraXBBbHBoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC02MDAsMTEgKzYwNywxMiBAQAogCiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzT3JkZXIgPSBuZXcgaW50W2NoYW5uZWxzXTsKICAgICAgICAgICAgICAgICAgICAgaW50IGJpdE9mZnNldHNbXSA9IHNwcHNtMS5nZXRCaXRPZmZzZXRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNPcmRlcltpXSA9IGJpdE9mZnNldHNbaV0gLyA4OwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxzID09IDMpIHsgLy8gRG9uJ3Qgc2tpcCBjaGFubmVsIG5vdywgY291bGQgYmUgb3B0aW1pemVkCisgICAgICAgICAgICAgICAgICAgIGlmIChjaGFubmVscyA9PSAzKSB7IC8vIERvbid0IHNraXAgY2hhbm5lbCBub3csIGNvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpbWl6ZWQKICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gNDsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC02MTYsMTIgKzYyNCw5IEBACiAKICAgICAgICAgICAgICAgICAvLyBGaWxsIG9mZnNldHMgaWYgdGhlcmUncyBhIGNoaWxkIHJhc3RlcgogICAgICAgICAgICAgICAgIGlmIChzcmMuZ2V0UGFyZW50KCkgIT0gbnVsbCB8fCBkc3QuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpICE9IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgIT0gMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSAhPSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpICE9IDAKLSAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgIT0gMCB8fCBzcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgIT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRzdC5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZHN0LmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHMgPSBuZXcgaW50WzRdOwogICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0c1swXSA9IC1zcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgKyBzcmMuZ2V0TWluWCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0c1sxXSA9IC1zcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgKyBzcmMuZ2V0TWluWSgpOwpAQCAtNjMyLDggKzYzNyw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgbGV2ZWxzW10gPSBuZXcgaW50WzQqY2hhbm5lbHNdOwotICAgICAgICBpbnQgdmFsdWVzW10gPSBuZXcgaW50WzQqY2hhbm5lbHNdOworICAgICAgICBpbnQgbGV2ZWxzW10gPSBuZXcgaW50WzQgKiBjaGFubmVsc107CisgICAgICAgIGludCB2YWx1ZXNbXSA9IG5ldyBpbnRbNCAqIGNoYW5uZWxzXTsKIAogICAgICAgICBjcmVhdGVMZXZlbHMoc3JjLmdldFNhbXBsZU1vZGVsKCksIGNoYW5uZWxzLCBza2lwQWxwaGEsIGxldmVscywgdmFsdWVzLCBjaGFubmVsc09yZGVyKTsKIApAQCAtNjQ2LDEzICs2NTEsOCBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOyAvLyBVbmtub3duIGRhdGEgYnVmZmVyIHR5cGUKICAgICAgICAgfQogCi0gICAgICAgIHJlcyA9IExvb2t1cE9wLmlwcExVVCgKLSAgICAgICAgICAgIHNyY0RhdGEsIHNyYy5nZXRXaWR0aCgpLCBzcmMuZ2V0SGVpZ2h0KCksIHNyY1N0cmlkZSwKLSAgICAgICAgICAgIGRzdERhdGEsIGRzdC5nZXRXaWR0aCgpLCBkc3QuZ2V0SGVpZ2h0KCksIGRzdFN0cmlkZSwKLSAgICAgICAgICAgIGxldmVscywgdmFsdWVzLAotICAgICAgICAgICAgY2hhbm5lbHMsIG9mZnNldHMsCi0gICAgICAgICAgICB0cnVlCi0gICAgICAgICk7CisgICAgICAgIHJlcyA9IExvb2t1cE9wLmlwcExVVChzcmNEYXRhLCBzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpLCBzcmNTdHJpZGUsIGRzdERhdGEsIGRzdAorICAgICAgICAgICAgICAgIC5nZXRXaWR0aCgpLCBkc3QuZ2V0SGVpZ2h0KCksIGRzdFN0cmlkZSwgbGV2ZWxzLCB2YWx1ZXMsIGNoYW5uZWxzLCBvZmZzZXRzLCB0cnVlKTsKIAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9TYW1wbGVNb2RlbC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL1NhbXBsZU1vZGVsLmphdmEKaW5kZXggNDQwNTlhMC4uYzk2N2ZhNiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL1NhbXBsZU1vZGVsLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL1NhbXBsZU1vZGVsLmphdmEKQEAgLTE4LDQ0ICsxOCw1NyBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgU2FtcGxlTW9kZWwgY2xhc3MgaXMgYWJzdHJhY3QgY2xhc3MgZm9yIHJldHJpZXZpbmcgcGl4ZWwncyBzYW1wbGVzCi0gKiBpbiB0aGUgZGF0YSBvZiBhbiBpbWFnZS4gRWFjaCBwaXhlbCBjb250YWlucyBzZXZlcmFsIHNhbXBsZXMuIEEgCi0gKiBzYW1wbGUgaXMgdGhlIHNldCBvZiB2YWx1ZXMgb2YgdGhlIGJhbmRzIGZvciBzaW5nbGUgcGl4ZWwuIAotICogRm9yIGV4YW1wbGUsIGVhY2ggcGl4ZWwgaW4gdGhlIFJHQiBtb2RlbCBjb250YWlucyB0aHJlZSBzYW1wbGVzIAotICogYW5kIHRoZXJlIGFyZSB0aHJlZSBjb3JyZXNwb25kaW5nIGJhbmRzIGluIHRoZSBpbWFnZSAKLSAqIGRhdGEgb2Ygc3VjaCBwaXhlbHMgcmVwcmVzZW50aW5nIHJlZCwgZ3JlZW4gYW5kIGJsdWUgY29tcG9uZW50cy4KLSAqIDxwPiAKLSAqIFRoZSBpbWFnZSBkYXRhIGlzIHJlcHJlc2VudGVkIGFzIGEgUmFzdGVyIHdpdGggYSBEYXRhQnVmZmVyIAotICogYW5kIGEgU2FtcGxlTW9kZWwuIFRoZSBTYW1wbGVNb2RlbCBhbGxvd3MgYWNjZXNzIHRvIHRoZSBzYW1wbGVzIGluIHRoZSAKLSAqIERhdGFCdWZmZXIuIAorICogVGhlIFNhbXBsZU1vZGVsIGNsYXNzIGlzIGFic3RyYWN0IGNsYXNzIGZvciByZXRyaWV2aW5nIHBpeGVsJ3Mgc2FtcGxlcyBpbiB0aGUKKyAqIGRhdGEgb2YgYW4gaW1hZ2UuIEVhY2ggcGl4ZWwgY29udGFpbnMgc2V2ZXJhbCBzYW1wbGVzLiBBIHNhbXBsZSBpcyB0aGUgc2V0IG9mCisgKiB2YWx1ZXMgb2YgdGhlIGJhbmRzIGZvciBzaW5nbGUgcGl4ZWwuIEZvciBleGFtcGxlLCBlYWNoIHBpeGVsIGluIHRoZSBSR0IKKyAqIG1vZGVsIGNvbnRhaW5zIHRocmVlIHNhbXBsZXMgYW5kIHRoZXJlIGFyZSB0aHJlZSBjb3JyZXNwb25kaW5nIGJhbmRzIGluIHRoZQorICogaW1hZ2UgZGF0YSBvZiBzdWNoIHBpeGVscyByZXByZXNlbnRpbmcgcmVkLCBncmVlbiBhbmQgYmx1ZSBjb21wb25lbnRzLgorICogPHA+CisgKiBUaGUgaW1hZ2UgZGF0YSBpcyByZXByZXNlbnRlZCBhcyBhIFJhc3RlciB3aXRoIGEgRGF0YUJ1ZmZlciBhbmQgYQorICogU2FtcGxlTW9kZWwuIFRoZSBTYW1wbGVNb2RlbCBhbGxvd3MgYWNjZXNzIHRvIHRoZSBzYW1wbGVzIGluIHRoZSBEYXRhQnVmZmVyLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFNhbXBsZU1vZGVsIHsKIAotICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEgd2hpY2ggdGhpcyBTYW1wbGVNb2RlbCBkZXNjcmliZXMuICovCisgICAgLyoqCisgICAgICogVGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhIHdoaWNoIHRoaXMgU2FtcGxlTW9kZWwgZGVzY3JpYmVzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgd2lkdGg7CiAKLSAgICAvKiogVGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YSB3aGljaCB0aGlzIFNhbXBsZU1vZGVsIGRlc2NyaWJlcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhIHdoaWNoIHRoaXMgU2FtcGxlTW9kZWwgZGVzY3JpYmVzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgaGVpZ2h0OwogCi0gICAgLyoqIFRoZSBudW1iZXIgb2YgYmFuZHMgb2YgaW1hZ2UgZGF0YSB3aGljaCB0aGlzIFNhbXBsZU1vZGVsIGRlc2NyaWJlcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGJhbmRzIG9mIGltYWdlIGRhdGEgd2hpY2ggdGhpcyBTYW1wbGVNb2RlbCBkZXNjcmliZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBudW1CYW5kczsKIAotICAgIC8qKiBUaGUgZGF0YSB0eXBlIG9mIHRoZSBpbWFnZSBkYXRhIHdoaWNoIHRoaXMgU2FtcGxlTW9kZWwgZGVzY3JpYmVzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGltYWdlIGRhdGEgd2hpY2ggdGhpcyBTYW1wbGVNb2RlbCBkZXNjcmliZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBkYXRhVHlwZTsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBTYW1wbGVNb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgZGF0YSB0eXBlLAotICAgICAqIHdpZHRoLCBoZWlnaHQgYW5kIG51bWJlciBvZiBiYW5kcy4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgU2FtcGxlTW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIGRhdGEgdHlwZSwgd2lkdGgsCisgICAgICogaGVpZ2h0IGFuZCBudW1iZXIgb2YgYmFuZHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUgb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIG51bUJhbmRzIHRoZSBudW1iZXIgb2YgYmFuZHMgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIG51bUJhbmRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJhbmRzIG9mIHRoZSBpbWFnZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBTYW1wbGVNb2RlbChpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwgaW50IG51bUJhbmRzKSB7CiAgICAgICAgIGlmICh3IDw9IDAgfHwgaCA8PSAwKSB7CkBAIC02MywxNSArNzYsMTQgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjJFIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBkb3VibGUgc3F1cmUgPSAoKGRvdWJsZSkgdykgKiAoKGRvdWJsZSkgaCk7CisgICAgICAgIGRvdWJsZSBzcXVyZSA9ICgoZG91YmxlKXcpICogKChkb3VibGUpaCk7CiAgICAgICAgIGlmIChzcXVyZSA+PSBJbnRlZ2VyLk1BWF9WQUxVRSkgewogICAgICAgICAgICAgLy8gYXd0LjIyRj1UaGUgcHJvZHVjdCBvZiB3IGFuZCBoIGlzIGdyZWF0ZXIgdGhhbiBJbnRlZ2VyLk1BWF9WQUxVRQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMkYiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIGlmIChkYXRhVHlwZSA8IERhdGFCdWZmZXIuVFlQRV9CWVRFIHx8Ci0gICAgICAgICAgICAgICAgZGF0YVR5cGUgPiBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFICYmCi0gICAgICAgICAgICAgICAgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VOREVGSU5FRCkgeworICAgICAgICBpZiAoZGF0YVR5cGUgPCBEYXRhQnVmZmVyLlRZUEVfQllURSB8fCBkYXRhVHlwZSA+IERhdGFCdWZmZXIuVFlQRV9ET1VCTEUKKyAgICAgICAgICAgICAgICAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVU5ERUZJTkVEKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjMwPWRhdGFUeXBlIGlzIG5vdCBvbmUgb2YgdGhlIHN1cHBvcnRlZCBkYXRhIHR5cGVzCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIzMCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CkBAIC04OSwxNTQgKzEwMSwxNTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkYXRhIGFycmF5IGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIG9mIHRoZSBzcGVjaWZpZWQgCi0gICAgICogRGF0YUJ1ZmZlciB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzOiAKLSAgICAgKiBEYXRhQnVmZmVyLlRZUEVfQllURSwgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwgCi0gICAgICogRGF0YUJ1ZmZlci5UWVBFX0lOVCwgRGF0YUJ1ZmZlci5UWVBFX1NIT1JULCAKKyAgICAgKiBHZXRzIHRoZSBkYXRhIGFycmF5IGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIG9mIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlcgorICAgICAqIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXM6IERhdGFCdWZmZXIuVFlQRV9CWVRFLAorICAgICAqIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIERhdGFCdWZmZXIuVFlQRV9JTlQsIERhdGFCdWZmZXIuVFlQRV9TSE9SVCwKICAgICAgKiBEYXRhQnVmZmVyLlRZUEVfRkxPQVQsIG9yIERhdGFCdWZmZXIuVFlQRV9ET1VCTEUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiBwaXhlbC4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHBpeGVsLgotICAgICAqIEBwYXJhbSBvYmogdGhlIE9iamVjdCBpcyBhIGRhdGEgd2hlcmUgdGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZC4KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIGFycmF5IGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIG9mIHRoZSBzcGVjaWZpZWQgCi0gICAgICogRGF0YUJ1ZmZlci4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiBwaXhlbC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiBwaXhlbC4KKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICB0aGUgT2JqZWN0IGlzIGEgZGF0YSB3aGVyZSB0aGUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkLgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIGFycmF5IGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIERhdGFCdWZmZXIuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXREYXRhRWxlbWVudHMoaW50IHgsIGludCB5LCBPYmplY3Qgb2JqLAotICAgICAgICAgICAgRGF0YUJ1ZmZlciBkYXRhKTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldERhdGFFbGVtZW50cyhpbnQgeCwgaW50IHksIE9iamVjdCBvYmosIERhdGFCdWZmZXIgZGF0YSk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhcnJheSBvZiBwaXhlbCBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIAotICAgICAqIGFyZWEgb2YgcGl4ZWxzIG9mIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlciB3aXRoIG9uZSBvZiAKLSAgICAgKiB0aGUgZm9sbG93aW5nIHR5cGVzOiAKLSAgICAgKiBEYXRhQnVmZmVyLlRZUEVfQllURSwgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwgCi0gICAgICogRGF0YUJ1ZmZlci5UWVBFX0lOVCwgRGF0YUJ1ZmZlci5UWVBFX1NIT1JULCAKLSAgICAgKiBEYXRhQnVmZmVyLlRZUEVfRkxPQVQsIG9yIERhdGFCdWZmZXIuVFlQRV9ET1VCTEUuCisgICAgICogR2V0cyB0aGUgYXJyYXkgb2YgcGl4ZWwgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscworICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlciB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzOgorICAgICAqIERhdGFCdWZmZXIuVFlQRV9CWVRFLCBEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCBEYXRhQnVmZmVyLlRZUEVfSU5ULAorICAgICAqIERhdGFCdWZmZXIuVFlQRV9TSE9SVCwgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FULCBvciBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFLgogICAgICAqIAotICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3Rhbmd1bGFyIHBpeGVsIGFyZWEuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ3VsYXIgcGl4ZWwgYXJlYS4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIHJlY3Rhbmd1bGFyIHBpeGVsIGFyZWEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgcGl4ZWwgYXJlYS4KLSAgICAgKiBAcGFyYW0gb2JqIHRoZSBPYmplY3QgaXMgYW4gYXJyYXkgd2l0aCB0aGUgcHJpbWl0aXZlIHR5cGUsCi0gICAgICogd2hlcmUgdGhlIHJlc3VsdCBhcnJheSB3aWxsIGJlIHN0b3JlZC4KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBwaXhlbCBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIAotICAgICAqIGFyZWEgb2YgcGl4ZWxzIG9mIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlciBvYmplY3QuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3Rhbmd1bGFyIHBpeGVsIGFyZWEuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3Rhbmd1bGFyIHBpeGVsIGFyZWEuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgcGl4ZWwgYXJlYS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgcGl4ZWwgYXJlYS4KKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICB0aGUgT2JqZWN0IGlzIGFuIGFycmF5IHdpdGggdGhlIHByaW1pdGl2ZSB0eXBlLCB3aGVyZSB0aGUKKyAgICAgKiAgICAgICAgICAgIHJlc3VsdCBhcnJheSB3aWxsIGJlIHN0b3JlZC4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgcGl4ZWwgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mCisgICAgICogICAgICAgICBwaXhlbHMgb2YgdGhlIHNwZWNpZmllZCBEYXRhQnVmZmVyIG9iamVjdC4KICAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldERhdGFFbGVtZW50cyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgT2JqZWN0IG9iaiwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSkgeworICAgIHB1YmxpYyBPYmplY3QgZ2V0RGF0YUVsZW1lbnRzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBPYmplY3Qgb2JqLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaW50IG51bURhdGFFbGVtZW50cyA9IGdldE51bURhdGFFbGVtZW50cygpOwogICAgICAgICBpbnQgaWR4ID0gMDsKIAogICAgICAgICBzd2l0Y2ggKGdldFRyYW5zZmVyVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBieXRlIGJkYXRhW107Ci0gICAgICAgICAgICBieXRlIGJidWZbXSA9IG51bGw7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGJ5dGUgYmRhdGFbXTsKKyAgICAgICAgICAgICAgICBieXRlIGJidWZbXSA9IG51bGw7CiAKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJkYXRhID0gbmV3IGJ5dGVbbnVtRGF0YUVsZW1lbnRzICogdyAqIGhdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiZGF0YSA9IChieXRlW10pIG9iajsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmRhdGEgPSBuZXcgYnl0ZVtudW1EYXRhRWxlbWVudHMgKiB3ICogaF07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYmRhdGEgPSAoYnl0ZVtdKW9iajsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSB5OyBpIDwgeSArIGg7IGkrKykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB4OyBqIDwgeCArIHc7IGorKykgewotICAgICAgICAgICAgICAgICAgICBiYnVmID0gKGJ5dGVbXSkgZ2V0RGF0YUVsZW1lbnRzKGosIGksIGJidWYsIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bURhdGFFbGVtZW50czsgbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZGF0YVtpZHgrK10gPSBiYnVmW25dOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSB5OyBpIDwgeSArIGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0geDsgaiA8IHggKyB3OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJidWYgPSAoYnl0ZVtdKWdldERhdGFFbGVtZW50cyhqLCBpLCBiYnVmLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtRGF0YUVsZW1lbnRzOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZGF0YVtpZHgrK10gPSBiYnVmW25dOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2JqID0gYmRhdGE7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBvYmogPSBiZGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgc2hvcnQgc2RhdGFbXTsKLSAgICAgICAgICAgIHNob3J0IHNidWZbXSA9IG51bGw7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzZGF0YVtdOworICAgICAgICAgICAgICAgIHNob3J0IHNidWZbXSA9IG51bGw7CiAKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNkYXRhID0gbmV3IHNob3J0W251bURhdGFFbGVtZW50cyAqIHcgKiBoXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2RhdGEgPSAoc2hvcnRbXSkgb2JqOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzZGF0YSA9IG5ldyBzaG9ydFtudW1EYXRhRWxlbWVudHMgKiB3ICogaF07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2RhdGEgPSAoc2hvcnRbXSlvYmo7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKGludCBpID0geTsgaSA8IHkgKyBoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0geDsgaiA8IHggKyB3OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc2J1ZiA9IChzaG9ydFtdKSBnZXREYXRhRWxlbWVudHMoaiwgaSwgc2J1ZiwgZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtRGF0YUVsZW1lbnRzOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNkYXRhW2lkeCsrXSA9IHNidWZbbl07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHk7IGkgPCB5ICsgaDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB4OyBqIDwgeCArIHc7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2J1ZiA9IChzaG9ydFtdKWdldERhdGFFbGVtZW50cyhqLCBpLCBzYnVmLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtRGF0YUVsZW1lbnRzOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGF0YVtpZHgrK10gPSBzYnVmW25dOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2JqID0gc2RhdGE7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBvYmogPSBzZGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBpbnQgaWRhdGFbXTsKLSAgICAgICAgICAgIGludCBpYnVmW10gPSBudWxsOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGludCBpZGF0YVtdOworICAgICAgICAgICAgICAgIGludCBpYnVmW10gPSBudWxsOwogCi0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZGF0YSA9IG5ldyBpbnRbbnVtRGF0YUVsZW1lbnRzICogdyAqIGhdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZGF0YSA9IChpbnRbXSkgb2JqOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZGF0YSA9IG5ldyBpbnRbbnVtRGF0YUVsZW1lbnRzICogdyAqIGhdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlkYXRhID0gKGludFtdKW9iajsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSB5OyBpIDwgeSArIGg7IGkrKykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB4OyBqIDwgeCArIHc7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpYnVmID0gKGludFtdKSBnZXREYXRhRWxlbWVudHMoaiwgaSwgaWJ1ZiwgZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtRGF0YUVsZW1lbnRzOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlkYXRhW2lkeCsrXSA9IGlidWZbbl07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHk7IGkgPCB5ICsgaDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB4OyBqIDwgeCArIHc7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWJ1ZiA9IChpbnRbXSlnZXREYXRhRWxlbWVudHMoaiwgaSwgaWJ1ZiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bURhdGFFbGVtZW50czsgbisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRhdGFbaWR4KytdID0gaWJ1ZltuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9iaiA9IGlkYXRhOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgb2JqID0gaWRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRkxPQVQ6Ci0gICAgICAgICAgICBmbG9hdCBmZGF0YVtdOwotICAgICAgICAgICAgZmxvYXQgZmJ1ZltdID0gbnVsbDsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgIGZsb2F0IGZkYXRhW107CisgICAgICAgICAgICAgICAgZmxvYXQgZmJ1ZltdID0gbnVsbDsKIAotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmRhdGEgPSBuZXcgZmxvYXRbbnVtRGF0YUVsZW1lbnRzICogdyAqIGhdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmZGF0YSA9IChmbG9hdFtdKSBvYmo7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZkYXRhID0gbmV3IGZsb2F0W251bURhdGFFbGVtZW50cyAqIHcgKiBoXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmZGF0YSA9IChmbG9hdFtdKW9iajsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSB5OyBpIDwgeSArIGg7IGkrKykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB4OyBqIDwgeCArIHc7IGorKykgewotICAgICAgICAgICAgICAgICAgICBmYnVmID0gKGZsb2F0W10pIGdldERhdGFFbGVtZW50cyhqLCBpLCBmYnVmLCBkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1EYXRhRWxlbWVudHM7IG4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZmRhdGFbaWR4KytdID0gZmJ1ZltuXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0geTsgaSA8IHkgKyBoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHg7IGogPCB4ICsgdzsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYnVmID0gKGZsb2F0W10pZ2V0RGF0YUVsZW1lbnRzKGosIGksIGZidWYsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1EYXRhRWxlbWVudHM7IG4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkYXRhW2lkeCsrXSA9IGZidWZbbl07CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvYmogPSBmZGF0YTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG9iaiA9IGZkYXRhOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKLSAgICAgICAgICAgIGRvdWJsZSBkZGF0YVtdOwotICAgICAgICAgICAgZG91YmxlIGRidWZbXSA9IG51bGw7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgZG91YmxlIGRkYXRhW107CisgICAgICAgICAgICAgICAgZG91YmxlIGRidWZbXSA9IG51bGw7CiAKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRkYXRhID0gbmV3IGRvdWJsZVtudW1EYXRhRWxlbWVudHMgKiB3ICogaF07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRkYXRhID0gKGRvdWJsZVtdKSBvYmo7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRkYXRhID0gbmV3IGRvdWJsZVtudW1EYXRhRWxlbWVudHMgKiB3ICogaF07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGRhdGEgPSAoZG91YmxlW10pb2JqOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHk7IGkgPCB5ICsgaDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHg7IGogPCB4ICsgdzsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRidWYgPSAoZG91YmxlW10pIGdldERhdGFFbGVtZW50cyhqLCBpLCBkYnVmLCBkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1EYXRhRWxlbWVudHM7IG4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZGRhdGFbaWR4KytdID0gZGJ1ZltuXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0geTsgaSA8IHkgKyBoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHg7IGogPCB4ICsgdzsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYnVmID0gKGRvdWJsZVtdKWdldERhdGFFbGVtZW50cyhqLCBpLCBkYnVmLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtRGF0YUVsZW1lbnRzOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZGF0YVtpZHgrK10gPSBkYnVmW25dOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2JqID0gZGRhdGE7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBvYmogPSBkZGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICB9CiAKQEAgLTI0NCwxNDAgKzI1OCwxNDUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkYXRhIGZvciBhIHNpbmdsZSBwaXhlbCBpbiB0aGUgc3BlY2lmaWVkIERhdGFCdWZmZXIKLSAgICAgKiBmcm9tIGEgcHJpbWl0aXZlIGFycmF5IHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXM6IAotICAgICAqIERhdGFCdWZmZXIuVFlQRV9CWVRFLCBEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCAKLSAgICAgKiBEYXRhQnVmZmVyLlRZUEVfSU5ULCBEYXRhQnVmZmVyLlRZUEVfU0hPUlQsIAotICAgICAqIERhdGFCdWZmZXIuVFlQRV9GTE9BVCwgb3IgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRS4gCisgICAgICogU2V0cyB0aGUgZGF0YSBmb3IgYSBzaW5nbGUgcGl4ZWwgaW4gdGhlIHNwZWNpZmllZCBEYXRhQnVmZmVyIGZyb20gYQorICAgICAqIHByaW1pdGl2ZSBhcnJheSB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzOiBEYXRhQnVmZmVyLlRZUEVfQllURSwKKyAgICAgKiBEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCBEYXRhQnVmZmVyLlRZUEVfSU5ULCBEYXRhQnVmZmVyLlRZUEVfU0hPUlQsCisgICAgICogRGF0YUJ1ZmZlci5UWVBFX0ZMT0FULCBvciBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiBwaXhlbC4KLSAgICAgKiBAcGFyYW0gb2JqIHRoZSBPYmplY3QgLSB0aGUgYXJyYXkgb2YgcHJpbWl0aXZlIHBpeGVsIGRhdGEKLSAgICAgKiB0byBiZSBzZXQuIAotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QgLSB0aGUgYXJyYXkgb2YgcHJpbWl0aXZlIHBpeGVsIGRhdGEgdG8gYmUgc2V0LgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGF0YS4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREYXRhRWxlbWVudHMoaW50IHgsIGludCB5LCBPYmplY3Qgb2JqLAotICAgICAgICAgICAgRGF0YUJ1ZmZlciBkYXRhKTsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREYXRhRWxlbWVudHMoaW50IHgsIGludCB5LCBPYmplY3Qgb2JqLCBEYXRhQnVmZmVyIGRhdGEpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGF0YSBlbGVtZW50cyBmb3IgYSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscyBpbiAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIERhdGFCdWZmZXIgZnJvbSBhIHByaW1pdGl2ZSBhcnJheSB3aXRoIG9uZSBvZiAKLSAgICAgKiB0aGUgZm9sbG93aW5nIHR5cGVzOiBEYXRhQnVmZmVyLlRZUEVfQllURSwgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwgCi0gICAgICogRGF0YUJ1ZmZlci5UWVBFX0lOVCwgRGF0YUJ1ZmZlci5UWVBFX1NIT1JULCAKLSAgICAgKiBEYXRhQnVmZmVyLlRZUEVfRkxPQVQsIG9yIERhdGFCdWZmZXIuVFlQRV9ET1VCTEUuIAorICAgICAqIFNldHMgdGhlIGRhdGEgZWxlbWVudHMgZm9yIGEgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIERhdGFCdWZmZXIgZnJvbSBhIHByaW1pdGl2ZSBhcnJheSB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzOgorICAgICAqIERhdGFCdWZmZXIuVFlQRV9CWVRFLCBEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCBEYXRhQnVmZmVyLlRZUEVfSU5ULAorICAgICAqIERhdGFCdWZmZXIuVFlQRV9TSE9SVCwgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FULCBvciBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIG9iaiB0aGUgT2JqZWN0IC0gdGhlIGFycmF5IG9mIHByaW1pdGl2ZSBwaXhlbCBkYXRhCi0gICAgICogdG8gYmUgc2V0LiAKLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICB0aGUgT2JqZWN0IC0gdGhlIGFycmF5IG9mIHByaW1pdGl2ZSBwaXhlbCBkYXRhIHRvIGJlIHNldC4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YUVsZW1lbnRzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBPYmplY3Qgb2JqLAotICAgICAgICAgICAgRGF0YUJ1ZmZlciBkYXRhKSB7CisgICAgcHVibGljIHZvaWQgc2V0RGF0YUVsZW1lbnRzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBPYmplY3Qgb2JqLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaW50IG51bURhdGFFbGVtZW50cyA9IGdldE51bURhdGFFbGVtZW50cygpOwogICAgICAgICBpbnQgaWR4ID0gMDsKIAogICAgICAgICBzd2l0Y2ggKGdldFRyYW5zZmVyVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBieXRlIGJidWZbXSA9IG5ldyBieXRlW251bURhdGFFbGVtZW50c107Ci0gICAgICAgICAgICBmb3IgKGludCBpID0geTsgaSA8IHkgKyBoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0geDsgaiA8IHggKyB3OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1EYXRhRWxlbWVudHM7IG4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgYmJ1ZltuXSA9ICgoYnl0ZVtdKSBvYmopW2lkeCsrXTsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgYnl0ZSBiYnVmW10gPSBuZXcgYnl0ZVtudW1EYXRhRWxlbWVudHNdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSB5OyBpIDwgeSArIGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0geDsgaiA8IHggKyB3OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtRGF0YUVsZW1lbnRzOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYnVmW25dID0gKChieXRlW10pb2JqKVtpZHgrK107CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzZXREYXRhRWxlbWVudHMoaiwgaSwgYmJ1ZiwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2V0RGF0YUVsZW1lbnRzKGosIGksIGJidWYsIGRhdGEpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIHNob3J0IHNidWZbXSA9IG5ldyBzaG9ydFtudW1EYXRhRWxlbWVudHNdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHk7IGkgPCB5ICsgaDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHg7IGogPCB4ICsgdzsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtRGF0YUVsZW1lbnRzOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNidWZbbl0gPSAoKHNob3J0W10pIG9iailbaWR4KytdOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgc2hvcnQgc2J1ZltdID0gbmV3IHNob3J0W251bURhdGFFbGVtZW50c107CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHk7IGkgPCB5ICsgaDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB4OyBqIDwgeCArIHc7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1EYXRhRWxlbWVudHM7IG4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNidWZbbl0gPSAoKHNob3J0W10pb2JqKVtpZHgrK107CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzZXREYXRhRWxlbWVudHMoaiwgaSwgc2J1ZiwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2V0RGF0YUVsZW1lbnRzKGosIGksIHNidWYsIGRhdGEpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGludCBpYnVmW10gPSBuZXcgaW50W251bURhdGFFbGVtZW50c107Ci0gICAgICAgICAgICBmb3IgKGludCBpID0geTsgaSA8IHkgKyBoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0geDsgaiA8IHggKyB3OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1EYXRhRWxlbWVudHM7IG4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWJ1ZltuXSA9ICgoaW50W10pIG9iailbaWR4KytdOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGludCBpYnVmW10gPSBuZXcgaW50W251bURhdGFFbGVtZW50c107CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHk7IGkgPCB5ICsgaDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB4OyBqIDwgeCArIHc7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1EYXRhRWxlbWVudHM7IG4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlidWZbbl0gPSAoKGludFtdKW9iailbaWR4KytdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGF0YUVsZW1lbnRzKGosIGksIGlidWYsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNldERhdGFFbGVtZW50cyhqLCBpLCBpYnVmLCBkYXRhKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDoKLSAgICAgICAgICAgIGZsb2F0IGZidWZbXSA9IG5ldyBmbG9hdFtudW1EYXRhRWxlbWVudHNdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHk7IGkgPCB5ICsgaDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHg7IGogPCB4ICsgdzsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtRGF0YUVsZW1lbnRzOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZidWZbbl0gPSAoKGZsb2F0W10pIG9iailbaWR4KytdOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRkxPQVQ6CisgICAgICAgICAgICAgICAgZmxvYXQgZmJ1ZltdID0gbmV3IGZsb2F0W251bURhdGFFbGVtZW50c107CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHk7IGkgPCB5ICsgaDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB4OyBqIDwgeCArIHc7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1EYXRhRWxlbWVudHM7IG4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZidWZbbl0gPSAoKGZsb2F0W10pb2JqKVtpZHgrK107CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzZXREYXRhRWxlbWVudHMoaiwgaSwgZmJ1ZiwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2V0RGF0YUVsZW1lbnRzKGosIGksIGZidWYsIGRhdGEpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKLSAgICAgICAgICAgIGRvdWJsZSBkYnVmW10gPSBuZXcgZG91YmxlW251bURhdGFFbGVtZW50c107Ci0gICAgICAgICAgICBmb3IgKGludCBpID0geTsgaSA8IHkgKyBoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0geDsgaiA8IHggKyB3OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1EYXRhRWxlbWVudHM7IG4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZGJ1ZltuXSA9ICgoZG91YmxlW10pIG9iailbaWR4KytdOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIGRvdWJsZSBkYnVmW10gPSBuZXcgZG91YmxlW251bURhdGFFbGVtZW50c107CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHk7IGkgPCB5ICsgaDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB4OyBqIDwgeCArIHc7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1EYXRhRWxlbWVudHM7IG4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidWZbbl0gPSAoKGRvdWJsZVtdKW9iailbaWR4KytdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGF0YUVsZW1lbnRzKGosIGksIGRidWYsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNldERhdGFFbGVtZW50cyhqLCBpLCBkYnVmLCBkYXRhKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBTYW1wbGVNb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgYmFuZHMgb2YgCi0gICAgICogdGhpcyBTYW1wbGVNb2RlbC4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IFNhbXBsZU1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBiYW5kcyBvZiB0aGlzIFNhbXBsZU1vZGVsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBiYW5kcyB0aGUgYXJyYXkgb2YgYmFuZHMgZnJvbSB0aGlzIFNhbXBsZU1vZGVsLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFNhbXBsZU1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBiYW5kcyBvZiAKLSAgICAgKiB0aGlzIFNhbXBsZU1vZGVsLgorICAgICAqIEBwYXJhbSBiYW5kcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGJhbmRzIGZyb20gdGhpcyBTYW1wbGVNb2RlbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBTYW1wbGVNb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgYmFuZHMgb2YgdGhpcyBTYW1wbGVNb2RlbC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU2FtcGxlTW9kZWwgY3JlYXRlU3Vic2V0U2FtcGxlTW9kZWwoaW50IGJhbmRzW10pOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgU2FtcGxlTW9kZWwgd2hpY2ggaGFzIHRoZSBzYW1lIGRhdGEgYXMgaW4gCi0gICAgICogdGhpcyBTYW1wbGVNb2RlbCB3aXRoIGEgZGlmZmVyZW50IHdpZHRoIGFuZCBoZWlnaHQuCisgICAgICogQ3JlYXRlcyB0aGUgU2FtcGxlTW9kZWwgd2hpY2ggaGFzIHRoZSBzYW1lIGRhdGEgYXMgaW4gdGhpcyBTYW1wbGVNb2RlbAorICAgICAqIHdpdGggYSBkaWZmZXJlbnQgd2lkdGggYW5kIGhlaWdodC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBhMSB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFNhbXBsZU1vZGVsIHdoaWNoIGhhcyB0aGUgc2FtZSBkYXRhIGFzIGluIAotICAgICAqIHRoaXMgU2FtcGxlTW9kZWwgd2l0aCBhIGRpZmZlcmVudCB3aWR0aCBhbmQgaGVpZ2h0LgorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBhMQorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcmV0dXJuIHRoZSBTYW1wbGVNb2RlbCB3aGljaCBoYXMgdGhlIHNhbWUgZGF0YSBhcyBpbiB0aGlzIFNhbXBsZU1vZGVsCisgICAgICogICAgICAgICB3aXRoIGEgZGlmZmVyZW50IHdpZHRoIGFuZCBoZWlnaHQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNhbXBsZU1vZGVsIGNyZWF0ZUNvbXBhdGlibGVTYW1wbGVNb2RlbChpbnQgYTAsIGludCBhMSk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzYW1wbGVzIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwgYXMgYSBpbnQgYXJyYXkuCisgICAgICogR2V0cyB0aGUgc2FtcGxlcyBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsIGFzIGFuIGludGVnZXIgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiBwaXhlbC4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHBpeGVsLgotICAgICAqIEBwYXJhbSBpQXJyYXkgdGhlIGludCBhcnJheSB3aGVyZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50IGFycmF5IHdpdGggdGhlIHNhbXBsZXMgb2YgdGhlIHNwZWNpZmllZCBwaXhlbC4KLQorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSBpQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIGFycmF5IHdoZXJlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZC4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHJldHVybiB0aGUgaW50ZWdlciBhcnJheSB3aXRoIHRoZSBzYW1wbGVzIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwuCiAgICAgICovCiAgICAgcHVibGljIGludFtdIGdldFBpeGVsKGludCB4LCBpbnQgeSwgaW50IGlBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggPj0gdGhpcy53aWR0aCB8fCB5ID49IHRoaXMuaGVpZ2h0KSB7CkBAIC00MDAsMTIgKzQxOSwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgYSBwaXhlbCBvZiB0aGUgRGF0YUJ1ZmZlciBmcm9tIGEgaW50IGFycmF5IG9mIHNhbXBsZXMuIAorICAgICAqIFNldHMgYSBwaXhlbCBvZiB0aGUgRGF0YUJ1ZmZlciBmcm9tIGEgaW50ZWdlciBhcnJheSBvZiBzYW1wbGVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiBwaXhlbC4KLSAgICAgKiBAcGFyYW0gaUFycmF5IHRoZSBpbnQgYXJyYXkuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCisgICAgICogQHBhcmFtIGlBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgYXJyYXkuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFBpeGVsKGludCB4LCBpbnQgeSwgaW50IGlBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggPj0gdGhpcy53aWR0aCB8fCB5ID49IHRoaXMuaGVpZ2h0KSB7CkBAIC00MjAsMTEgKzQ0MywxNCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHNhbXBsZXMgb2YgdGhlIHNwZWNpZmllZCBwaXhlbCBhcyBhIGZsb2F0IGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiBwaXhlbC4KLSAgICAgKiBAcGFyYW0gZkFycmF5IHRoZSBmbG9hdCBhcnJheSB3aGVyZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCisgICAgICogQHBhcmFtIGZBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IGFycmF5IHdoZXJlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZC4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCiAgICAgICogQHJldHVybiB0aGUgZmxvYXQgYXJyYXkgd2l0aCB0aGUgc2FtcGxlcyBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdFtdIGdldFBpeGVsKGludCB4LCBpbnQgeSwgZmxvYXQgZkFycmF5W10sIERhdGFCdWZmZXIgZGF0YSkgewpAQCAtNDQ4LDEyICs0NzQsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGEgcGl4ZWwgb2YgdGhlIERhdGFCdWZmZXIgZnJvbSBhIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMuIAorICAgICAqIFNldHMgYSBwaXhlbCBvZiB0aGUgRGF0YUJ1ZmZlciBmcm9tIGEgZmxvYXQgYXJyYXkgb2Ygc2FtcGxlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCi0gICAgICogQHBhcmFtIGZBcnJheSB0aGUgZmxvYXQgYXJyYXkuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCisgICAgICogQHBhcmFtIGZBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IGFycmF5LgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbChpbnQgeCwgaW50IHksIGZsb2F0IGZBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggPj0gdGhpcy53aWR0aCB8fCB5ID49IHRoaXMuaGVpZ2h0KSB7CkBAIC00NjgsMTEgKzQ5OCwxNCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHNhbXBsZXMgb2YgdGhlIHNwZWNpZmllZCBwaXhlbCBhcyBhIGRvdWJsZSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCi0gICAgICogQHBhcmFtIGRBcnJheSB0aGUgZG91YmxlIGFycmF5IHdoZXJlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZC4KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiBwaXhlbC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiBwaXhlbC4KKyAgICAgKiBAcGFyYW0gZEFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZG91YmxlIGFycmF5IHdoZXJlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZC4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCiAgICAgICogQHJldHVybiB0aGUgZG91YmxlIGFycmF5IHdpdGggdGhlIHNhbXBsZXMgb2YgdGhlIHNwZWNpZmllZCBwaXhlbC4KICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlW10gZ2V0UGl4ZWwoaW50IHgsIGludCB5LCBkb3VibGUgZEFycmF5W10sIERhdGFCdWZmZXIgZGF0YSkgewpAQCAtNDk2LDEyICs1MjksMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGEgcGl4ZWwgb2YgdGhlIERhdGFCdWZmZXIgZnJvbSBhIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzLiAKKyAgICAgKiBTZXRzIGEgcGl4ZWwgb2YgdGhlIERhdGFCdWZmZXIgZnJvbSBhIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiBwaXhlbC4KLSAgICAgKiBAcGFyYW0gZEFycmF5IHRoZSBkb3VibGUgYXJyYXkuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCisgICAgICogQHBhcmFtIGRBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UGl4ZWwoaW50IHgsIGludCB5LCBkb3VibGUgZEFycmF5W10sIERhdGFCdWZmZXIgZGF0YSkgewogICAgICAgICBpZiAoeCA8IDAgfHwgeSA8IDAgfHwgeCA+PSB0aGlzLndpZHRoIHx8IHkgPj0gdGhpcy5oZWlnaHQpIHsKQEAgLTUxNCw0MyArNTUxLDQ5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2FtcGxlIG9mIGEgc3BlY2lmaWVkIGJhbmQgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwKLSAgICAgKiBhcyBhbiBpbnQuCisgICAgICogR2V0cyB0aGUgc2FtcGxlIG9mIGEgc3BlY2lmaWVkIGJhbmQgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgYXMgYW4KKyAgICAgKiBpbnRlZ2VyLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiBwaXhlbC4KLSAgICAgKiBAcGFyYW0gYiB0aGUgc3BlY2lmaWVkIGJhbmQuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgYmFuZC4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCiAgICAgICogQHJldHVybiB0aGUgc2FtcGxlIG9mIGEgc3BlY2lmaWVkIGJhbmQgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRTYW1wbGUoaW50IHgsIGludCB5LCBpbnQgYiwgRGF0YUJ1ZmZlciBkYXRhKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNhbXBsZSBvZiBhIHNwZWNpZmllZCBiYW5kIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsCi0gICAgICogYXMgYSBmbG9hdC4KKyAgICAgKiBHZXRzIHRoZSBzYW1wbGUgb2YgYSBzcGVjaWZpZWQgYmFuZCBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBhcyBhIGZsb2F0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiBwaXhlbC4KLSAgICAgKiBAcGFyYW0gYiB0aGUgc3BlY2lmaWVkIGJhbmQuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgYmFuZC4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCiAgICAgICogQHJldHVybiB0aGUgc2FtcGxlIG9mIGEgc3BlY2lmaWVkIGJhbmQgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwuCi0KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0U2FtcGxlRmxvYXQoaW50IHgsIGludCB5LCBpbnQgYiwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIHJldHVybiBnZXRTYW1wbGUoeCwgeSwgYiwgZGF0YSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2FtcGxlIG9mIGEgc3BlY2lmaWVkIGJhbmQgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwKLSAgICAgKiBhcyBhIGRvdWJsZS4KKyAgICAgKiBHZXRzIHRoZSBzYW1wbGUgb2YgYSBzcGVjaWZpZWQgYmFuZCBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBhcyBhIGRvdWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCi0gICAgICogQHBhcmFtIGIgdGhlIHNwZWNpZmllZCBiYW5kLgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGJhbmQuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgogICAgICAqIEByZXR1cm4gdGhlIHNhbXBsZSBvZiBhIHNwZWNpZmllZCBiYW5kIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsLgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgZ2V0U2FtcGxlRG91YmxlKGludCB4LCBpbnQgeSwgaW50IGIsIERhdGFCdWZmZXIgZGF0YSkgewpAQCAtNTU4LDIxICs2MDEsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzYW1wbGVzIG9mIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMKLSAgICAgKiBhcyBhIGludCBhcnJheS4KKyAgICAgKiBHZXRzIHRoZSBzYW1wbGVzIG9mIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgYXMgYW4KKyAgICAgKiBpbnRlZ2VyIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gaUFycmF5IHRoZSBpbnQgYXJyYXkgd2hlcmUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkLgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludCBhcnJheSB3aXRoIHRoZSBzYW1wbGVzIG9mIHRoZSBzcGVjaWZpZWQgCi0gICAgICogcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gaUFycmF5CisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciBhcnJheSB3aGVyZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEByZXR1cm4gdGhlIGludGVnZXIgYXJyYXkgd2l0aCB0aGUgc2FtcGxlcyBvZiB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyCisgICAgICogICAgICAgICBhcmVhIG9mIHBpeGVscy4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50W10gZ2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgaUFycmF5W10sCi0gICAgICAgICAgICBEYXRhQnVmZmVyIGRhdGEpIHsKKyAgICBwdWJsaWMgaW50W10gZ2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgaUFycmF5W10sIERhdGFCdWZmZXIgZGF0YSkgewogICAgICAgICBpZiAoeCA8IDAgfHwgeSA8IDAgfHwgeCArIHcgPiB0aGlzLndpZHRoIHx8IHkgKyBoID4gdGhpcy5oZWlnaHQpIHsKICAgICAgICAgICAgIC8vIGF3dC42Mz1Db29yZGluYXRlcyBhcmUgbm90IGluIGJvdW5kcwogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJApAQCAtNTk3LDE4ICs2NDQsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGFsbCBvZiB0aGUgc2FtcGxlcyBmb3IgYSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscyBvZiB0aGUgRGF0YUJ1ZmZlcgotICAgICAqIGZyb20gYW4gaW50IGFycmF5LiAKKyAgICAgKiBTZXRzIGFsbCBvZiB0aGUgc2FtcGxlcyBmb3IgYSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscyBvZiB0aGUKKyAgICAgKiBEYXRhQnVmZmVyIGZyb20gYW4gaW50ZWdlciBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGlBcnJheSB0aGUgaW50IGFycmF5LgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGlBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgYXJyYXkuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGlBcnJheVtdLAotICAgICAgICAgICAgRGF0YUJ1ZmZlciBkYXRhKSB7CisgICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgaUFycmF5W10sIERhdGFCdWZmZXIgZGF0YSkgewogICAgICAgICBpZiAoeCA8IDAgfHwgeSA8IDAgfHwgeCArIHcgPiB0aGlzLndpZHRoIHx8IHkgKyBoID4gdGhpcy5oZWlnaHQpIHsKICAgICAgICAgICAgIC8vIGF3dC42Mz1Db29yZGluYXRlcyBhcmUgbm90IGluIGJvdW5kcwogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJApAQCAtNjI0LDIxICs2NzYsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzYW1wbGVzIG9mIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgCi0gICAgICogYXMgYSBmbG9hdCBhcnJheS4KKyAgICAgKiBHZXRzIHRoZSBzYW1wbGVzIG9mIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgYXMgYSBmbG9hdAorICAgICAqIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gZkFycmF5IHRoZSBmbG9hdCBhcnJheSB3aGVyZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmxvYXQgYXJyYXkgd2l0aCB0aGUgc2FtcGxlcyBvZiB0aGUgc3BlY2lmaWVkIAotICAgICAqIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGZBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IGFycmF5IHdoZXJlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZC4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHJldHVybiB0aGUgZmxvYXQgYXJyYXkgd2l0aCB0aGUgc2FtcGxlcyBvZiB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyCisgICAgICogICAgICAgICBhcmVhIG9mIHBpeGVscy4KICAgICAgKi8KLSAgICBwdWJsaWMgZmxvYXRbXSBnZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGZsb2F0IGZBcnJheVtdLAotICAgICAgICAgICAgRGF0YUJ1ZmZlciBkYXRhKSB7CisgICAgcHVibGljIGZsb2F0W10gZ2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBmbG9hdCBmQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCB4ICsgdyA+IHRoaXMud2lkdGggfHwgeSArIGggPiB0aGlzLmhlaWdodCkgewogICAgICAgICAgICAgLy8gYXd0LjYzPUNvb3JkaW5hdGVzIGFyZSBub3QgaW4gYm91bmRzCiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCkBAIC02NjMsMTggKzcxOSwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgYWxsIG9mIHRoZSBzYW1wbGVzIGZvciBhIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzIG9mIHRoZSBEYXRhQnVmZmVyCi0gICAgICogZnJvbSBhIGZsb2F0IGFycmF5LiAKKyAgICAgKiBTZXRzIGFsbCBvZiB0aGUgc2FtcGxlcyBmb3IgYSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscyBvZiB0aGUKKyAgICAgKiBEYXRhQnVmZmVyIGZyb20gYSBmbG9hdCBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGZBcnJheSB0aGUgZmxvYXQgYXJyYXkuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gZkFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgYXJyYXkuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgZmxvYXQgZkFycmF5W10sCi0gICAgICAgICAgICBEYXRhQnVmZmVyIGRhdGEpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGZsb2F0IGZBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggKyB3ID4gdGhpcy53aWR0aCB8fCB5ICsgaCA+IHRoaXMuaGVpZ2h0KSB7CiAgICAgICAgICAgICAvLyBhd3QuNjM9Q29vcmRpbmF0ZXMgYXJlIG5vdCBpbiBib3VuZHMKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTY5MCwyMSArNzUxLDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2FtcGxlcyBvZiB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzIAotICAgICAqIGFzIGEgZG91YmxlIGFycmF5LgorICAgICAqIEdldHMgdGhlIHNhbXBsZXMgb2YgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscyBhcyBhIGRvdWJsZQorICAgICAqIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gZEFycmF5IHRoZSBkb3VibGUgYXJyYXkgd2hlcmUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkLgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZSBhcnJheSB3aXRoIHRoZSBzYW1wbGVzIG9mIHRoZSBzcGVjaWZpZWQgCi0gICAgICogcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gZEFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZG91YmxlIGFycmF5IHdoZXJlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZC4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHJldHVybiB0aGUgZG91YmxlIGFycmF5IHdpdGggdGhlIHNhbXBsZXMgb2YgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhcgorICAgICAqICAgICAgICAgYXJlYSBvZiBwaXhlbHMuCiAgICAgICovCi0gICAgcHVibGljIGRvdWJsZVtdIGdldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgZG91YmxlIGRBcnJheVtdLAotICAgICAgICAgICAgRGF0YUJ1ZmZlciBkYXRhKSB7CisgICAgcHVibGljIGRvdWJsZVtdIGdldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgZG91YmxlIGRBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggKyB3ID4gdGhpcy53aWR0aCB8fCB5ICsgaCA+IHRoaXMuaGVpZ2h0KSB7CiAgICAgICAgICAgICAvLyBhd3QuNjM9Q29vcmRpbmF0ZXMgYXJlIG5vdCBpbiBib3VuZHMKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTcyOSwxOCArNzk0LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhbGwgb2YgdGhlIHNhbXBsZXMgZm9yIGEgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgb2YgdGhlIERhdGFCdWZmZXIKLSAgICAgKiBmcm9tIGEgZG91YmxlIGFycmF5LiAKKyAgICAgKiBTZXRzIGFsbCBvZiB0aGUgc2FtcGxlcyBmb3IgYSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscyBvZiB0aGUKKyAgICAgKiBEYXRhQnVmZmVyIGZyb20gYSBkb3VibGUgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBkQXJyYXkgdGhlIGRvdWJsZSBhcnJheS4KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBkQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgYXJyYXkuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgZG91YmxlIGRBcnJheVtdLAotICAgICAgICAgICAgRGF0YUJ1ZmZlciBkYXRhKSB7CisgICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBkb3VibGUgZEFycmF5W10sIERhdGFCdWZmZXIgZGF0YSkgewogICAgICAgICBpZiAoeCA8IDAgfHwgeSA8IDAgfHwgeCArIHcgPiB0aGlzLndpZHRoIHx8IHkgKyBoID4gdGhpcy5oZWlnaHQpIHsKICAgICAgICAgICAgIC8vIGF3dC42Mz1Db29yZGluYXRlcyBhcmUgbm90IGluIGJvdW5kcwogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJApAQCAtNzU2LDM0ICs4MjYsNDQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGEgc2FtcGxlIG9mIHRoZSBzcGVjaWZpZWQgYmFuZCBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbAotICAgICAqIGluIHRoZSBEYXRhQnVmZmVyIGFzIGludCB2YWx1ZS4KKyAgICAgKiBTZXRzIGEgc2FtcGxlIG9mIHRoZSBzcGVjaWZpZWQgYmFuZCBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBpbiB0aGUKKyAgICAgKiBEYXRhQnVmZmVyIGFzIGludGVnZXIgdmFsdWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogQHBhcmFtIGIgdGhlIHNwZWNpZmllZCBiYW5kLgotICAgICAqIEBwYXJhbSBzIHRoZSBzYW1wbGUgYXMgYW4gaW50IHZhbHVlLgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgYmFuZC4KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIHNhbXBsZSBhcyBhbiBpbnRlZ2VyIHZhbHVlLgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTYW1wbGUoaW50IHgsIGludCB5LCBpbnQgYiwgaW50IHMsIERhdGFCdWZmZXIgZGF0YSk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzYW1wbGVzIG9mIGEgc3BlY2lmaWVkIGJhbmQgZm9yIGEgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyCi0gICAgICogYXJlYSBvZiBwaXhlbHMgYXMgYSBpbnQgYXJyYXkuCisgICAgICogR2V0cyB0aGUgc2FtcGxlcyBvZiBhIHNwZWNpZmllZCBiYW5kIGZvciBhIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mCisgICAgICogcGl4ZWxzIGFzIGEgaW50ZWdlciBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gYiB0aGUgc3BlY2lmaWVkIGJhbmQuCi0gICAgICogQHBhcmFtIGlBcnJheSB0aGUgaW50IGFycmF5IHdoZXJlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZC4KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzYW1wbGVzIG9mIGEgc3BlY2lmaWVkIGJhbmQgZm9yIGEgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyCi0gICAgICogYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGJhbmQuCisgICAgICogQHBhcmFtIGlBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgYXJyYXkgd2hlcmUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkLgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzYW1wbGVzIG9mIGEgc3BlY2lmaWVkIGJhbmQgZm9yIGEgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEKKyAgICAgKiAgICAgICAgIG9mIHBpeGVscy4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50W10gZ2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGludCBpQXJyYXlbXSwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSkgeworICAgIHB1YmxpYyBpbnRbXSBnZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwgaW50IGlBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaW50IHNhbXBsZXNbXTsKICAgICAgICAgaW50IGlkeCA9IDA7CiAKQEAgLTgwMywxOSArODgzLDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2FtcGxlcyBmcm9tIGFuIGludCBhcnJheSBpbiB0aGUgc3BlY2lmaWVkIGJhbmQgZm9yIAotICAgICAqIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBTZXRzIHRoZSBzYW1wbGVzIGZyb20gYW4gaW50ZWdlciBhcnJheSBpbiB0aGUgc3BlY2lmaWVkIGJhbmQgZm9yIHRoZQorICAgICAqIHNwZWNpZmllZCByZWN0YW5nbGUgb2YgcGl4ZWxzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBiIHRoZSBzcGVjaWZpZWQgYmFuZC4KLSAgICAgKiBAcGFyYW0gaUFycmF5IHRoZSBpbnQgYXJyYXkuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGJhbmQuCisgICAgICogQHBhcmFtIGlBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgYXJyYXkuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLCBpbnQgaUFycmF5W10sCi0gICAgICAgICAgICBEYXRhQnVmZmVyIGRhdGEpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwgaW50IGlBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaW50IGlkeCA9IDA7CiAgICAgICAgIGZvciAoaW50IGkgPSB5OyBpIDwgeSArIGg7IGkrKykgewogICAgICAgICAgICAgZm9yIChpbnQgaiA9IHg7IGogPCB4ICsgdzsgaisrKSB7CkBAIC04MjUsMjIgKzkxMSwyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNhbXBsZXMgb2YgYSBzcGVjaWZpZWQgYmFuZCBmb3IgYSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIKLSAgICAgKiBhcmVhIG9mIHBpeGVscyBhcyBhIGZsb2F0IGFycmF5LgorICAgICAqIEdldHMgdGhlIHNhbXBsZXMgb2YgYSBzcGVjaWZpZWQgYmFuZCBmb3IgYSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZgorICAgICAqIHBpeGVscyBhcyBhIGZsb2F0IGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBiIHRoZSBzcGVjaWZpZWQgYmFuZC4KLSAgICAgKiBAcGFyYW0gZkFycmF5IHRoZSBmbG9hdCBhcnJheSB3aGVyZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2FtcGxlcyBvZiBhIHNwZWNpZmllZCBiYW5kIGZvciBhIHNwZWNpZmllZCByZWN0YW5ndWxhcgotICAgICAqIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBiYW5kLgorICAgICAqIEBwYXJhbSBmQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBhcnJheSB3aGVyZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEByZXR1cm4gdGhlIHNhbXBsZXMgb2YgYSBzcGVjaWZpZWQgYmFuZCBmb3IgYSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYQorICAgICAqICAgICAgICAgb2YgcGl4ZWxzLgogICAgICAqLwotICAgIHB1YmxpYyBmbG9hdFtdIGdldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLAotICAgICAgICAgICAgZmxvYXQgZkFycmF5W10sIERhdGFCdWZmZXIgZGF0YSkgeworICAgIHB1YmxpYyBmbG9hdFtdIGdldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLCBmbG9hdCBmQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIGZsb2F0IHNhbXBsZXNbXTsKICAgICAgICAgaW50IGlkeCA9IDA7CiAKQEAgLTg2MCwxOSArOTUxLDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2FtcGxlcyBmcm9tIGFuIGZsb2F0IGFycmF5IGluIHRoZSBzcGVjaWZpZWQgYmFuZCBmb3IgCi0gICAgICogdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIFNldHMgdGhlIHNhbXBsZXMgZnJvbSBhbiBmbG9hdCBhcnJheSBpbiB0aGUgc3BlY2lmaWVkIGJhbmQgZm9yIHRoZQorICAgICAqIHNwZWNpZmllZCByZWN0YW5nbGUgb2YgcGl4ZWxzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBiIHRoZSBzcGVjaWZpZWQgYmFuZC4KLSAgICAgKiBAcGFyYW0gZkFycmF5IHRoZSBmbG9hdCBhcnJheQotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBiYW5kLgorICAgICAqIEBwYXJhbSBmQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBhcnJheS4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGZsb2F0IGZBcnJheVtdLAotICAgICAgICAgICAgRGF0YUJ1ZmZlciBkYXRhKSB7CisgICAgcHVibGljIHZvaWQgc2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGZsb2F0IGZBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaW50IGlkeCA9IDA7CiAgICAgICAgIGZvciAoaW50IGkgPSB5OyBpIDwgeSArIGg7IGkrKykgewogICAgICAgICAgICAgZm9yIChpbnQgaiA9IHg7IGogPCB4ICsgdzsgaisrKSB7CkBAIC04ODIsMjIgKzk3OSwyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNhbXBsZXMgb2YgYSBzcGVjaWZpZWQgYmFuZCBmb3IgYSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIKLSAgICAgKiBhcmVhIG9mIHBpeGVscyBhcyBhIGRvdWJsZSBhcnJheS4KKyAgICAgKiBHZXRzIHRoZSBzYW1wbGVzIG9mIGEgc3BlY2lmaWVkIGJhbmQgZm9yIGEgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YKKyAgICAgKiBwaXhlbHMgYXMgYSBkb3VibGUgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGIgdGhlIHNwZWNpZmllZCBiYW5kLgotICAgICAqIEBwYXJhbSBkQXJyYXkgdGhlIGRvdWJsZSBhcnJheSB3aGVyZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2FtcGxlcyBvZiBhIHNwZWNpZmllZCBiYW5kIGZvciBhIHNwZWNpZmllZCByZWN0YW5ndWxhcgotICAgICAqIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBiYW5kLgorICAgICAqIEBwYXJhbSBkQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgYXJyYXkgd2hlcmUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkLgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzYW1wbGVzIG9mIGEgc3BlY2lmaWVkIGJhbmQgZm9yIGEgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEKKyAgICAgKiAgICAgICAgIG9mIHBpeGVscy4KICAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlW10gZ2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsCi0gICAgICAgICAgICBkb3VibGUgZEFycmF5W10sIERhdGFCdWZmZXIgZGF0YSkgeworICAgIHB1YmxpYyBkb3VibGVbXSBnZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwgZG91YmxlIGRBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgZG91YmxlIHNhbXBsZXNbXTsKICAgICAgICAgaW50IGlkeCA9IDA7CiAKQEAgLTkxNywxOSArMTAxOSwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNhbXBsZXMgZnJvbSBhbiBkb3VibGUgYXJyYXkgaW4gdGhlIHNwZWNpZmllZCBiYW5kIGZvciAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogU2V0cyB0aGUgc2FtcGxlcyBmcm9tIGFuIGRvdWJsZSBhcnJheSBpbiB0aGUgc3BlY2lmaWVkIGJhbmQgZm9yIHRoZQorICAgICAqIHNwZWNpZmllZCByZWN0YW5nbGUgb2YgcGl4ZWxzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBiIHRoZSBzcGVjaWZpZWQgYmFuZC4KLSAgICAgKiBAcGFyYW0gZEFycmF5IHRoZSBkb3VibGUgYXJyYXkKLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgYmFuZC4KKyAgICAgKiBAcGFyYW0gZEFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZG91YmxlIGFycmF5LgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGF0YS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwgZG91YmxlIGRBcnJheVtdLAotICAgICAgICAgICAgRGF0YUJ1ZmZlciBkYXRhKSB7CisgICAgcHVibGljIHZvaWQgc2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGRvdWJsZSBkQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIGludCBpZHggPSAwOwogICAgICAgICBmb3IgKGludCBpID0geTsgaSA8IHkgKyBoOyBpKyspIHsKICAgICAgICAgICAgIGZvciAoaW50IGogPSB4OyBqIDwgeCArIHc7IGorKykgewpAQCAtOTM5LDUzICsxMDQ3LDYyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIHNhbXBsZSBvZiB0aGUgc3BlY2lmaWVkIGJhbmQgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwKLSAgICAgKiBpbiB0aGUgRGF0YUJ1ZmZlciBhcyBmbG9hdCB2YWx1ZS4KKyAgICAgKiBTZXRzIGEgc2FtcGxlIG9mIHRoZSBzcGVjaWZpZWQgYmFuZCBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBpbiB0aGUKKyAgICAgKiBEYXRhQnVmZmVyIGFzIGZsb2F0IHZhbHVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgotICAgICAqIEBwYXJhbSBiIHRoZSBzcGVjaWZpZWQgYmFuZC4KLSAgICAgKiBAcGFyYW0gcyB0aGUgc2FtcGxlIGFzIGZsb2F0IHZhbHVlLgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgYmFuZC4KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIHNhbXBsZSBhcyBmbG9hdCB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2FtcGxlKGludCB4LCBpbnQgeSwgaW50IGIsIGZsb2F0IHMsIERhdGFCdWZmZXIgZGF0YSkgewotICAgICAgICBzZXRTYW1wbGUoeCwgeSwgYiwgKGludCkgcywgZGF0YSk7CisgICAgICAgIHNldFNhbXBsZSh4LCB5LCBiLCAoaW50KXMsIGRhdGEpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgYSBzYW1wbGUgb2YgdGhlIHNwZWNpZmllZCBiYW5kIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsCi0gICAgICogaW4gdGhlIERhdGFCdWZmZXIgYXMgZG91YmxlIHZhbHVlLgorICAgICAqIFNldHMgYSBzYW1wbGUgb2YgdGhlIHNwZWNpZmllZCBiYW5kIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIGluIHRoZQorICAgICAqIERhdGFCdWZmZXIgYXMgZG91YmxlIHZhbHVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgotICAgICAqIEBwYXJhbSBiIHRoZSBzcGVjaWZpZWQgYmFuZC4KLSAgICAgKiBAcGFyYW0gcyB0aGUgc2FtcGxlIGFzIGRvdWJsZSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGJhbmQuCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzYW1wbGUgYXMgZG91YmxlIHZhbHVlLgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTYW1wbGUoaW50IHgsIGludCB5LCBpbnQgYiwgZG91YmxlIHMsIERhdGFCdWZmZXIgZGF0YSkgewotICAgICAgICBzZXRTYW1wbGUoeCwgeSwgYiwgKGludCkgcywgZGF0YSk7CisgICAgICAgIHNldFNhbXBsZSh4LCB5LCBiLCAoaW50KXMsIGRhdGEpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBEYXRhQnVmZmVyIG9iamVjdCB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgU2FtcGxlTW9kZWwuIAotICAgICAqICAKLSAgICAgKiBAcmV0dXJuIHRoZSBEYXRhQnVmZmVyIG9iamVjdCB3aGljaCBjb3JyZXNwb25kcyB0byAKLSAgICAgKiB0aGUgU2FtcGxlTW9kZWwuCisgICAgICogQ3JlYXRlcyBhIERhdGFCdWZmZXIgb2JqZWN0IHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBTYW1wbGVNb2RlbC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBEYXRhQnVmZmVyIG9iamVjdCB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgU2FtcGxlTW9kZWwuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IERhdGFCdWZmZXIgY3JlYXRlRGF0YUJ1ZmZlcigpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc2FtcGxlIHNpemUgaW4gYml0cyBmb3IgdGhlIHNwZWNpZmllZCBiYW5kLgogICAgICAqIAotICAgICAqIEBwYXJhbSBiYW5kIHRoZSBzcGVjaWZpZWQgYmFuZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYmFuZAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBiYW5kLgogICAgICAqIEByZXR1cm4gdGhlIHNhbXBsZSBzaXplIGluIGJpdHMgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFNhbXBsZVNpemUoaW50IGJhbmQpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgc2FtcGxlIHNpemUgaW4gYml0cyBmb3IgYWxsIGJhbmRzLgotICAgICAqICAKKyAgICAgKiAKICAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBzYW1wbGUgc2l6ZSBpbiBiaXRzIGZvciBhbGwgYmFuZHMuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludFtdIGdldFNhbXBsZVNpemUoKTsKQEAgLTEwMDAsMTAgKzExMTcsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRyYW5zZmVyIHR5cGUgdXNlZCB0byB0cmFuc2ZlciBwaXhlbHMgdmlhIAotICAgICAqIHRoZSBnZXREYXRhRWxlbWVudHMgYW5kIHNldERhdGFFbGVtZW50cyBtZXRob2RzLgotICAgICAqIFRyYW5zZmVyIHR5cGUgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgcHJlZGVmaW5lZCB0eXBlIAotICAgICAqIGZyb20gRGF0YUJ1ZmZlciBjbGFzcyBvciBub3QuCisgICAgICogR2V0cyB0aGUgdHJhbnNmZXIgdHlwZSB1c2VkIHRvIHRyYW5zZmVyIHBpeGVscyB2aWEgdGhlIGdldERhdGFFbGVtZW50cworICAgICAqIGFuZCBzZXREYXRhRWxlbWVudHMgbWV0aG9kcy4gVHJhbnNmZXIgdHlwZSB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZQorICAgICAqIHByZWRlZmluZWQgdHlwZSBmcm9tIERhdGFCdWZmZXIgY2xhc3Mgb3Igbm90LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZmVyIHR5cGUuCiAgICAgICovCkBAIC0xMDEyLDIwICsxMTI4LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRhdGEgZWxlbWVudHMgZm9yIHBpeGVsIHRyYW5zZmVyaW5nCi0gICAgICogdmlhIHRoZSBnZXREYXRhRWxlbWVudHMgYW5kIHNldERhdGFFbGVtZW50cyBtZXRob2RzLiAKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF0YSBlbGVtZW50cyBmb3IgcGl4ZWwgdHJhbnNmZXJyaW5nIHZpYSB0aGUKKyAgICAgKiBnZXREYXRhRWxlbWVudHMgYW5kIHNldERhdGFFbGVtZW50cyBtZXRob2RzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBkYXRhIGVsZW1lbnRzIGZvciBwaXhlbCB0cmFuc2ZlcmluZwotICAgICAqIHZpYSB0aGUgZ2V0RGF0YUVsZW1lbnRzIGFuZCBzZXREYXRhRWxlbWVudHMgbWV0aG9kcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZGF0YSBlbGVtZW50cyBmb3IgcGl4ZWwgdHJhbnNmZXJyaW5nIHZpYSB0aGUKKyAgICAgKiAgICAgICAgIGdldERhdGFFbGVtZW50cyBhbmQgc2V0RGF0YUVsZW1lbnRzIG1ldGhvZHMuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXROdW1EYXRhRWxlbWVudHMoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBiYW5kcyBpbiB0aGUgaW1hZ2UgZGF0YSBvZiB0aGlzIAotICAgICAqIFNhbXBsZU1vZGVsIG9iamVjdC4KKyAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYmFuZHMgaW4gdGhlIGltYWdlIGRhdGEgb2YgdGhpcyBTYW1wbGVNb2RlbCBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJhbmRzIGluIHRoZSBpbWFnZSBkYXRhIG9mIHRoaXMgCi0gICAgICogU2FtcGxlTW9kZWwgb2JqZWN0LgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBiYW5kcyBpbiB0aGUgaW1hZ2UgZGF0YSBvZiB0aGlzIFNhbXBsZU1vZGVsIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldE51bUJhbmRzKCkgewogICAgICAgICByZXR1cm4gbnVtQmFuZHM7CkBAIC0xMDUwLDQgKzExNjQsMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvU2hvcnRMb29rdXBUYWJsZS5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL1Nob3J0TG9va3VwVGFibGUuamF2YQppbmRleCA3N2M5YzQ1Li40MzE5ZDU4IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvU2hvcnRMb29rdXBUYWJsZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9TaG9ydExvb2t1cFRhYmxlLmphdmEKQEAgLTIzLDI3ICsyMywzMCBAQAogCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCi0KIC8qKgotICogVGhlIFNob3J0TG9va3VwVGFibGUgY2xhc3MgcHJvdmlkZXMgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgCi0gKiBsb29rdXAgb3BlcmF0aW9ucywgYW5kIGlzIGRlZmluZWQgYnkgYW4gaW5wdXQgc2hvcnQgYXJyYXkgZm9yIAotICogYmFuZHMgb3IgY29tcG9uZW50cyBvZiBpbWFnZSBhbmQgYW4gb2Zmc2V0IHZhbHVlLgotICogVGhlIG9mZnNldCB2YWx1ZSB3aWxsIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgdmFsdWVzIGJlZm9yZSAKLSAqIGluZGV4aW5nIHRoZSBpbnB1dCBhcnJheXMuIFRoZSBvdXRwdXQgb2YgYSBsb29rdXAgb3BlcmF0aW9uIGlzIAorICogVGhlIFNob3J0TG9va3VwVGFibGUgY2xhc3MgcHJvdmlkZXMgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgbG9va3VwCisgKiBvcGVyYXRpb25zLCBhbmQgaXMgZGVmaW5lZCBieSBhbiBpbnB1dCBzaG9ydCBhcnJheSBmb3IgYmFuZHMgb3IgY29tcG9uZW50cyBvZgorICogaW1hZ2UgYW5kIGFuIG9mZnNldCB2YWx1ZS4gVGhlIG9mZnNldCB2YWx1ZSB3aWxsIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQKKyAqIHZhbHVlcyBiZWZvcmUgaW5kZXhpbmcgdGhlIGlucHV0IGFycmF5cy4gVGhlIG91dHB1dCBvZiBhIGxvb2t1cCBvcGVyYXRpb24gaXMKICAqIHJlcHJlc2VudGVkIGFzIGFuIHVuc2lnbmVkIHNob3J0IGFycmF5LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFNob3J0TG9va3VwVGFibGUgZXh0ZW5kcyBMb29rdXBUYWJsZSB7Ci0gICAgCi0gICAgLyoqIFRoZSBkYXRhLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGRhdGEuCisgICAgICovCiAgICAgcHJpdmF0ZSBzaG9ydCBkYXRhW11bXTsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBTaG9ydExvb2t1cFRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBvZmZzZXQgdmFsdWUKLSAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBzaG9ydCBhcnJheSB3aGljaCByZXByZXNlbnRzIGxvb2t1cCB0YWJsZSBmb3IKLSAgICAgKiBhbGwgYmFuZHMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFNob3J0TG9va3VwVGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9mZnNldCB2YWx1ZSBhbmQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHNob3J0IGFycmF5IHdoaWNoIHJlcHJlc2VudHMgbG9va3VwIHRhYmxlIGZvciBhbGwgYmFuZHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHZhbHVlLgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIGFycmF5LgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgdmFsdWUuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5LgogICAgICAqLwogICAgIHB1YmxpYyBTaG9ydExvb2t1cFRhYmxlKGludCBvZmZzZXQsIHNob3J0W10gZGF0YSkgewogICAgICAgICBzdXBlcihvZmZzZXQsIDEpOwpAQCAtNTMsMTIgKzU2LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFNob3J0TG9va3VwVGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9mZnNldCB2YWx1ZQotICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIHNob3J0IGFycmF5IG9mIGFycmF5cyB3aGljaCByZXByZXNlbnRzIGxvb2t1cCB0YWJsZQotICAgICAqIGZvciBlYWNoIGJhbmQuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFNob3J0TG9va3VwVGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9mZnNldCB2YWx1ZSBhbmQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHNob3J0IGFycmF5IG9mIGFycmF5cyB3aGljaCByZXByZXNlbnRzIGxvb2t1cCB0YWJsZSBmb3IKKyAgICAgKiBlYWNoIGJhbmQuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHZhbHVlLgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIGFycmF5IG9mIGFycmF5cyBmb3IgZWFjaCBiYW5kLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgdmFsdWUuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5IG9mIGFycmF5cyBmb3IgZWFjaCBiYW5kLgogICAgICAqLwogICAgIHB1YmxpYyBTaG9ydExvb2t1cFRhYmxlKGludCBvZmZzZXQsIHNob3J0W11bXSBkYXRhKSB7CiAgICAgICAgIHN1cGVyKG9mZnNldCwgZGF0YS5sZW5ndGgpOwpAQCAtNzAsOSArNzUsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxvb2t1cCB0YWJsZSBvZiB0aGlzIFNob3J0TG9va3VwVGFibGUgb2JqZWN0LiBJZiAKLSAgICAgKiB0aGlzIFNob3J0TG9va3VwVGFibGUgb2JqZWN0IGhhcyBvbmUgc2hvcnQgYXJyYXkgZm9yIGFsbCBiYW5kcywgCi0gICAgICogdGhlIHJldHVybmVkIGFycmF5IGxlbmd0aCBpcyBvbmUuCisgICAgICogR2V0cyB0aGUgbG9va3VwIHRhYmxlIG9mIHRoaXMgU2hvcnRMb29rdXBUYWJsZSBvYmplY3QuIElmIHRoaXMKKyAgICAgKiBTaG9ydExvb2t1cFRhYmxlIG9iamVjdCBoYXMgb25lIHNob3J0IGFycmF5IGZvciBhbGwgYmFuZHMsIHRoZSByZXR1cm5lZAorICAgICAqIGFycmF5IGxlbmd0aCBpcyBvbmUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgbG9va3VwIHRhYmxlIG9mIHRoaXMgU2hvcnRMb29rdXBUYWJsZSBvYmplY3QuCiAgICAgICovCkBAIC04MSwxNCArODYsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2hvcnQgYXJyYXkgd2hpY2ggY29udGFpbnMgc2FtcGxlcyBvZiB0aGUgc3BlY2lmaWVkCi0gICAgICogcGl4ZWwgd2hpY2ggaXMgdHJhbnNsYXRlZCB3aXRoIHRoZSBsb29rdXAgdGFibGUgb2YgdGhpcyAKLSAgICAgKiBTaG9ydExvb2t1cFRhYmxlIG9iamVjdC4gVGhlIHJlc3VsdGVkIGFycmF5IGlzIHN0b3JlZCB0bwotICAgICAqIHRoZSBkc3QgYXJyYXkuCisgICAgICogUmV0dXJucyBhIHNob3J0IGFycmF5IHdoaWNoIGNvbnRhaW5zIHNhbXBsZXMgb2YgdGhlIHNwZWNpZmllZCBwaXhlbCB3aGljaAorICAgICAqIGlzIHRyYW5zbGF0ZWQgd2l0aCB0aGUgbG9va3VwIHRhYmxlIG9mIHRoaXMgU2hvcnRMb29rdXBUYWJsZSBvYmplY3QuIFRoZQorICAgICAqIHJlc3VsdGVkIGFycmF5IGlzIHN0b3JlZCB0byB0aGUgZHN0IGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIHNvdXJjZSBhcnJheS4KLSAgICAgKiBAcGFyYW0gZHN0IHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGVyZSB0aGUgcmVzdWx0IGNhbiBiZSBzdG9yZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2hlcmUgdGhlIHJlc3VsdCBjYW4gYmUgc3RvcmVkLgogICAgICAqIEByZXR1cm4gdGhlIHNob3J0IGFycmF5IG9mIHRyYW5zbGF0ZWQgc2FtcGxlcyBvZiBhIHBpeGVsLgogICAgICAqLwogICAgIHB1YmxpYyBzaG9ydFtdIGxvb2t1cFBpeGVsKHNob3J0W10gc3JjLCBzaG9ydFtdIGRzdCkgewpAQCAtOTksMTEgKzEwNCwxMSBAQAogICAgICAgICBpbnQgb2Zmc2V0ID0gZ2V0T2Zmc2V0KCk7CiAgICAgICAgIGlmIChnZXROdW1Db21wb25lbnRzKCkgPT0gMSkgewogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkc3RbaV0gPSBkYXRhWzBdW3NyY1tpXS1vZmZzZXRdOworICAgICAgICAgICAgICAgIGRzdFtpXSA9IGRhdGFbMF1bc3JjW2ldIC0gb2Zmc2V0XTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0TnVtQ29tcG9uZW50cygpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkc3RbaV0gPSBkYXRhW2ldW3NyY1tpXS1vZmZzZXRdOworICAgICAgICAgICAgICAgIGRzdFtpXSA9IGRhdGFbaV1bc3JjW2ldIC0gb2Zmc2V0XTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMTksMTEgKzEyNCwxMSBAQAogICAgICAgICBpbnQgb2Zmc2V0ID0gZ2V0T2Zmc2V0KCk7CiAgICAgICAgIGlmIChnZXROdW1Db21wb25lbnRzKCkgPT0gMSkgewogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkc3RbaV0gPSBkYXRhWzBdW3NyY1tpXS1vZmZzZXRdOworICAgICAgICAgICAgICAgIGRzdFtpXSA9IGRhdGFbMF1bc3JjW2ldIC0gb2Zmc2V0XTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0TnVtQ29tcG9uZW50cygpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkc3RbaV0gPSBkYXRhW2ldW3NyY1tpXS1vZmZzZXRdOworICAgICAgICAgICAgICAgIGRzdFtpXSA9IGRhdGFbaV1bc3JjW2ldIC0gb2Zmc2V0XTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL1NpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwuamF2YQppbmRleCAzMTEzOTVhLi42OWYzMzUzIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9TaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKQEAgLTI1LDM5ICsyNiw1NCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIGNsYXNzIHJlcHJlc2VudHMgcGl4ZWwgZGF0YSAKLSAqIHdoZXJlIHNldmVyYWwgc2FtcGxlcyBjb21iaW5lIHRvIGNyZWF0ZSBhIHNpbmdsZSBwaXhlbCBhbmQgCi0gKiBhcmUgc3RvcmVkIGluIGEgc2luZ2xlIGRhdGEgYXJyYXkgZWxlbWVudC4gVGhpcyBjbGFzcyAKLSAqIHN1cHBvcnRzIFRZUEVfQllURSwgVFlQRV9VU0hPUlQsIFRZUEVfSU5UIGRhdGEgdHlwZXMuIAorICogVGhlIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgY2xhc3MgcmVwcmVzZW50cyBwaXhlbCBkYXRhIHdoZXJlIHNldmVyYWwKKyAqIHNhbXBsZXMgY29tYmluZSB0byBjcmVhdGUgYSBzaW5nbGUgcGl4ZWwgYW5kIGFyZSBzdG9yZWQgaW4gYSBzaW5nbGUgZGF0YQorICogYXJyYXkgZWxlbWVudC4gVGhpcyBjbGFzcyBzdXBwb3J0cyBUWVBFX0JZVEUsIFRZUEVfVVNIT1JULCBUWVBFX0lOVCBkYXRhCisgKiB0eXBlcy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIGV4dGVuZHMgU2FtcGxlTW9kZWwgewogCi0gICAgLyoqIFRoZSBiaXQgbWFza3MuICovCisgICAgLyoqCisgICAgICogVGhlIGJpdCBtYXNrcy4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBiaXRNYXNrc1tdOwogCi0gICAgLyoqIFRoZSBiaXQgb2Zmc2V0cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgYml0IG9mZnNldHMuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgYml0T2Zmc2V0c1tdOwogCi0gICAgLyoqIFRoZSBiaXQgc2l6ZXMuICovCisgICAgLyoqCisgICAgICogVGhlIGJpdCBzaXplcy4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBiaXRTaXplc1tdOwogCi0gICAgLyoqIFRoZSBzY2FubGluZSBzdHJpZGUuICovCisgICAgLyoqCisgICAgICogVGhlIHNjYW5saW5lIHN0cmlkZS4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBzY2FubGluZVN0cmlkZTsKIAotICAgIC8qKiBUaGUgbWF4IGJpdCBzaXplLiAqLworICAgIC8qKgorICAgICAqIFRoZSBtYXggYml0IHNpemUuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgbWF4Qml0U2l6ZTsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHdpdGggdGhlIHNwZWNpZmllZAogICAgICAqIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUgb2Ygc2FtcGxlcy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gYml0TWFza3MgdGhlIGJpdCBtYXNrcyBmb3IgYWxsIHRoZSBiYW5kcy4KKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUgb2Ygc2FtcGxlcy4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBiaXRNYXNrcworICAgICAqICAgICAgICAgICAgdGhlIGJpdCBtYXNrcyBmb3IgYWxsIHRoZSBiYW5kcy4KICAgICAgKi8KLSAgICBwdWJsaWMgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbChpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgIGludCBiaXRNYXNrc1tdKSB7CisgICAgcHVibGljIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwoaW50IGRhdGFUeXBlLCBpbnQgdywgaW50IGgsIGludCBiaXRNYXNrc1tdKSB7CiAgICAgICAgIHRoaXMoZGF0YVR5cGUsIHcsIGgsIHcsIGJpdE1hc2tzKTsKICAgICB9CiAKQEAgLTY1LDIwICs4MSwyNCBAQAogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHdpdGggdGhlIHNwZWNpZmllZAogICAgICAqIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHNhbXBsZXMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIHNjYW5saW5lU3RyaWRlIFRoZSBzY2FubGluZSBzdHJpZGUgb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGJpdE1hc2tzIHRoZSBiaXQgbWFza3MgZm9yIGFsbCB0aGUgYmFuZHMuCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlIG9mIHRoZSBzYW1wbGVzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHNjYW5saW5lU3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgc2NhbmxpbmUgc3RyaWRlIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBiaXRNYXNrcworICAgICAqICAgICAgICAgICAgdGhlIGJpdCBtYXNrcyBmb3IgYWxsIHRoZSBiYW5kcy4KICAgICAgKi8KLSAgICBwdWJsaWMgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbChpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgIGludCBzY2FubGluZVN0cmlkZSwgaW50IGJpdE1hc2tzW10pIHsKKyAgICBwdWJsaWMgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbChpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwgaW50IHNjYW5saW5lU3RyaWRlLAorICAgICAgICAgICAgaW50IGJpdE1hc2tzW10pIHsKIAogICAgICAgICBzdXBlcihkYXRhVHlwZSwgdywgaCwgYml0TWFza3MubGVuZ3RoKTsKIAotICAgICAgICBpZiAoZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUgJiYKLSAgICAgICAgICAgICAgICBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUICYmCi0gICAgICAgICAgICAgICAgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVCkgeworICAgICAgICBpZiAoZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVAorICAgICAgICAgICAgICAgICYmIGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9JTlQpIHsKICAgICAgICAgICAgIC8vIGF3dC42MT1VbnN1cHBvcnRlZCBkYXRhIHR5cGU6IHswfQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MSIsIC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGUpKTsKQEAgLTEwOSw4ICsxMjksNyBAQAogCiAgICAgICAgICAgICAgICAgaWYgKG1hc2sgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAvLyBhd3QuNjI9V3JvbmcgbWFzayA6IHswfQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXd0LjYyIiwgYml0TWFza3NbaV0pKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYyIiwgYml0TWFza3NbaV0pKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMTMyLDM5ICsxNTEsMzkgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICBzd2l0Y2ggKGdldFRyYW5zZmVyVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBieXRlIGJkYXRhW107Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiZGF0YSA9IG5ldyBieXRlWzFdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiZGF0YSA9IChieXRlW10pIG9iajsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgYnl0ZSBiZGF0YVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBiZGF0YSA9IG5ldyBieXRlWzFdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJkYXRhID0gKGJ5dGVbXSlvYmo7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBiZGF0YVswXSA9IChieXRlKSBkYXRhLmdldEVsZW0oeSAqIHNjYW5saW5lU3RyaWRlICsgeCk7Ci0gICAgICAgICAgICBvYmogPSBiZGF0YTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBzaG9ydCBzZGF0YVtdOwotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2RhdGEgPSBuZXcgc2hvcnRbMV07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNkYXRhID0gKHNob3J0W10pIG9iajsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiZGF0YVswXSA9IChieXRlKWRhdGEuZ2V0RWxlbSh5ICogc2NhbmxpbmVTdHJpZGUgKyB4KTsKKyAgICAgICAgICAgICAgICBvYmogPSBiZGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzZGF0YVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzZGF0YSA9IG5ldyBzaG9ydFsxXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZGF0YSA9IChzaG9ydFtdKW9iajsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHNkYXRhWzBdID0gKHNob3J0KSBkYXRhLmdldEVsZW0oeSAqIHNjYW5saW5lU3RyaWRlICsgeCk7Ci0gICAgICAgICAgICBvYmogPSBzZGF0YTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBpbnQgaWRhdGFbXTsKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlkYXRhID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWRhdGEgPSAoaW50W10pIG9iajsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZGF0YVswXSA9IChzaG9ydClkYXRhLmdldEVsZW0oeSAqIHNjYW5saW5lU3RyaWRlICsgeCk7CisgICAgICAgICAgICAgICAgb2JqID0gc2RhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgaW50IGlkYXRhW107CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlkYXRhID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZGF0YSA9IChpbnRbXSlvYmo7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZGF0YVswXSA9IGRhdGEuZ2V0RWxlbSh5ICogc2NhbmxpbmVTdHJpZGUgKyB4KTsKLSAgICAgICAgICAgIG9iaiA9IGlkYXRhOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWRhdGFbMF0gPSBkYXRhLmdldEVsZW0oeSAqIHNjYW5saW5lU3RyaWRlICsgeCk7CisgICAgICAgICAgICAgICAgb2JqID0gaWRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG9iajsKICAgICB9CkBAIC0xNzYsMjYgKzE5NSwyNiBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIHN3aXRjaCAoZ2V0VHJhbnNmZXJUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGRhdGEuc2V0RWxlbSh5ICogc2NhbmxpbmVTdHJpZGUgKyB4LCAoKGJ5dGVbXSkgb2JqKVswXSAmIDB4ZmYpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIGRhdGEuc2V0RWxlbSh5ICogc2NhbmxpbmVTdHJpZGUgKyB4LCAoKHNob3J0W10pIG9iailbMF0gJiAweGZmZmYpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGRhdGEuc2V0RWxlbSh5ICogc2NhbmxpbmVTdHJpZGUgKyB4LCAoKGludFtdKSBvYmopWzBdKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBkYXRhLnNldEVsZW0oeSAqIHNjYW5saW5lU3RyaWRlICsgeCwgKChieXRlW10pb2JqKVswXSAmIDB4ZmYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIGRhdGEuc2V0RWxlbSh5ICogc2NhbmxpbmVTdHJpZGUgKyB4LCAoKHNob3J0W10pb2JqKVswXSAmIDB4ZmZmZik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgZGF0YS5zZXRFbGVtKHkgKiBzY2FubGluZVN0cmlkZSArIHgsICgoaW50W10pb2JqKVswXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGlzIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgb2JqZWN0IHdpdGggCi0gICAgICogdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAgICogQ29tcGFyZXMgdGhpcyBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG8gdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBvYmplY3QgaXMgCi0gICAgICogZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gbworICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBvYmplY3QgaXMgZXF1YWwgdG8gdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CkBAIC0yMDMsMjEgKzIyMiwyMCBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBtb2RlbCA9IChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKSBvOwotICAgICAgICByZXR1cm4gdGhpcy53aWR0aCA9PSBtb2RlbC53aWR0aCAmJgotICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID09IG1vZGVsLmhlaWdodCAmJgotICAgICAgICAgICAgICAgIHRoaXMubnVtQmFuZHMgPT0gbW9kZWwubnVtQmFuZHMgJiYKLSAgICAgICAgICAgICAgICB0aGlzLmRhdGFUeXBlID09IG1vZGVsLmRhdGFUeXBlICYmCi0gICAgICAgICAgICAgICAgQXJyYXlzLmVxdWFscyh0aGlzLmJpdE1hc2tzLCBtb2RlbC5iaXRNYXNrcykgJiYKLSAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKHRoaXMuYml0T2Zmc2V0cywgbW9kZWwuYml0T2Zmc2V0cykgJiYKLSAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKHRoaXMuYml0U2l6ZXMsIG1vZGVsLmJpdFNpemVzKSAmJgotICAgICAgICAgICAgICAgIHRoaXMuc2NhbmxpbmVTdHJpZGUgPT0gbW9kZWwuc2NhbmxpbmVTdHJpZGU7CisgICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgbW9kZWwgPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbClvOworICAgICAgICByZXR1cm4gdGhpcy53aWR0aCA9PSBtb2RlbC53aWR0aCAmJiB0aGlzLmhlaWdodCA9PSBtb2RlbC5oZWlnaHQKKyAgICAgICAgICAgICAgICAmJiB0aGlzLm51bUJhbmRzID09IG1vZGVsLm51bUJhbmRzICYmIHRoaXMuZGF0YVR5cGUgPT0gbW9kZWwuZGF0YVR5cGUKKyAgICAgICAgICAgICAgICAmJiBBcnJheXMuZXF1YWxzKHRoaXMuYml0TWFza3MsIG1vZGVsLmJpdE1hc2tzKQorICAgICAgICAgICAgICAgICYmIEFycmF5cy5lcXVhbHModGhpcy5iaXRPZmZzZXRzLCBtb2RlbC5iaXRPZmZzZXRzKQorICAgICAgICAgICAgICAgICYmIEFycmF5cy5lcXVhbHModGhpcy5iaXRTaXplcywgbW9kZWwuYml0U2l6ZXMpCisgICAgICAgICAgICAgICAgJiYgdGhpcy5zY2FubGluZVN0cmlkZSA9PSBtb2RlbC5zY2FubGluZVN0cmlkZTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU2FtcGxlTW9kZWwgY3JlYXRlU3Vic2V0U2FtcGxlTW9kZWwoaW50IGJhbmRzW10pIHsKICAgICAgICAgaWYgKGJhbmRzLmxlbmd0aCA+IHRoaXMubnVtQmFuZHMpIHsKLSAgICAgICAgICAgIC8vIGF3dC42ND1UaGUgbnVtYmVyIG9mIHRoZSBiYW5kcyBpbiB0aGUgc3Vic2V0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJhbmRzIGluIHRoZSBzYW1wbGUgbW9kZWwKKyAgICAgICAgICAgIC8vIGF3dC42ND1UaGUgbnVtYmVyIG9mIHRoZSBiYW5kcyBpbiB0aGUgc3Vic2V0IGlzIGdyZWF0ZXIgdGhhbiB0aGUKKyAgICAgICAgICAgIC8vIG51bWJlciBvZiBiYW5kcyBpbiB0aGUgc2FtcGxlIG1vZGVsCiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjY0IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIApAQCAtMjI1LDE0ICsyNDMsMTMgQEAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiYW5kcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgbWFza3NbaV0gPSB0aGlzLmJpdE1hc2tzW2JhbmRzW2ldXTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwodGhpcy5kYXRhVHlwZSwgdGhpcy53aWR0aCwKLSAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCwgdGhpcy5zY2FubGluZVN0cmlkZSwgbWFza3MpOworICAgICAgICByZXR1cm4gbmV3IFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwodGhpcy5kYXRhVHlwZSwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsCisgICAgICAgICAgICAgICAgdGhpcy5zY2FubGluZVN0cmlkZSwgbWFza3MpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTYW1wbGVNb2RlbCBjcmVhdGVDb21wYXRpYmxlU2FtcGxlTW9kZWwoaW50IHcsIGludCBoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCh0aGlzLmRhdGFUeXBlLCB3LCBoLAotICAgICAgICAgICAgICAgIHRoaXMuYml0TWFza3MpOworICAgICAgICByZXR1cm4gbmV3IFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwodGhpcy5kYXRhVHlwZSwgdywgaCwgdGhpcy5iaXRNYXNrcyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yNzcsMTAgKzI5NCw5IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludFtdIGdldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGlBcnJheVtdLAotICAgICAgICAgICAgRGF0YUJ1ZmZlciBkYXRhKSB7Ci0gICAgICAgIGlmICgoeCA8IDApIHx8ICh5IDwgMCkgfHwgKChsb25nKSB4ICsgKGxvbmcpIHcgPiB0aGlzLndpZHRoKQotICAgICAgICAgICAgICAgIHx8ICgobG9uZykgeSArIChsb25nKSBoID4gdGhpcy5oZWlnaHQpKSB7CisgICAgcHVibGljIGludFtdIGdldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGlBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKKyAgICAgICAgaWYgKCh4IDwgMCkgfHwgKHkgPCAwKSB8fCAoKGxvbmcpeCArIChsb25nKXcgPiB0aGlzLndpZHRoKQorICAgICAgICAgICAgICAgIHx8ICgobG9uZyl5ICsgKGxvbmcpaCA+IHRoaXMuaGVpZ2h0KSkgewogICAgICAgICAgICAgLy8gYXd0LjYzPUNvb3JkaW5hdGVzIGFyZSBub3QgaW4gYm91bmRzCiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KQEAgLTMwNiwxMyArMzIyLDExIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgaUFycmF5W10sCi0gICAgICAgICAgICBEYXRhQnVmZmVyIGRhdGEpIHsKLSAgICAgICAgaWYgKCh4IDwgMCkgfHwgKHkgPCAwKSB8fCAoKGxvbmcpIHggKyAobG9uZykgdyA+IHRoaXMud2lkdGgpCi0gICAgICAgICAgICAgICAgfHwgKChsb25nKSB5ICsgKGxvbmcpIGggPiB0aGlzLmhlaWdodCkpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBpQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CisgICAgICAgIGlmICgoeCA8IDApIHx8ICh5IDwgMCkgfHwgKChsb25nKXggKyAobG9uZyl3ID4gdGhpcy53aWR0aCkKKyAgICAgICAgICAgICAgICB8fCAoKGxvbmcpeSArIChsb25nKWggPiB0aGlzLmhlaWdodCkpIHsKICAgICAgICAgICAgIC8vIGF3dC42Mz1Db29yZGluYXRlcyBhcmUgbm90IGluIGJvdW5kcwotICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCiAgICAgICAgIGludCBpZHggPSAwOwpAQCAtMzM5LDEzICszNTMsMTEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50W10gZ2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGludCBpQXJyYXlbXSwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSkgewotICAgICAgICBpZiAoKHggPCAwKSB8fCAoeSA8IDApIHx8ICgobG9uZykgeCArIChsb25nKSB3ID4gdGhpcy53aWR0aCkKLSAgICAgICAgICAgICAgICB8fCAoKGxvbmcpIHkgKyAobG9uZykgaCA+IHRoaXMuaGVpZ2h0KSkgeworICAgIHB1YmxpYyBpbnRbXSBnZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwgaW50IGlBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKKyAgICAgICAgaWYgKCh4IDwgMCkgfHwgKHkgPCAwKSB8fCAoKGxvbmcpeCArIChsb25nKXcgPiB0aGlzLndpZHRoKQorICAgICAgICAgICAgICAgIHx8ICgobG9uZyl5ICsgKGxvbmcpaCA+IHRoaXMuaGVpZ2h0KSkgewogICAgICAgICAgICAgLy8gYXd0LjYzPUNvb3JkaW5hdGVzIGFyZSBub3QgaW4gYm91bmRzCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKICAgICAgICAgaW50IHNhbXBsZXNbXTsKQEAgLTM2NywxMCArMzc5LDkgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwgaW50IGlBcnJheVtdLAotICAgICAgICAgICAgRGF0YUJ1ZmZlciBkYXRhKSB7Ci0gICAgICAgIGlmICgoeCA8IDApIHx8ICh5IDwgMCkgfHwgKChsb25nKSB4ICsgKGxvbmcpIHcgPiB0aGlzLndpZHRoKQotICAgICAgICAgICAgICAgIHx8ICgobG9uZykgeSArIChsb25nKSBoID4gdGhpcy5oZWlnaHQpKSB7CisgICAgcHVibGljIHZvaWQgc2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGludCBpQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CisgICAgICAgIGlmICgoeCA8IDApIHx8ICh5IDwgMCkgfHwgKChsb25nKXggKyAobG9uZyl3ID4gdGhpcy53aWR0aCkKKyAgICAgICAgICAgICAgICB8fCAoKGxvbmcpeSArIChsb25nKWggPiB0aGlzLmhlaWdodCkpIHsKICAgICAgICAgICAgIC8vIGF3dC42Mz1Db29yZGluYXRlcyBhcmUgbm90IGluIGJvdW5kcwogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CkBAIC0zODksMTUgKzQwMCwxNSBAQAogICAgICAgICBpbnQgc2l6ZSA9ICh0aGlzLmhlaWdodCAtIDEpICogc2NhbmxpbmVTdHJpZGUgKyB3aWR0aDsKIAogICAgICAgICBzd2l0Y2ggKHRoaXMuZGF0YVR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckJ5dGUoc2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyVVNob3J0KHNpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckludChzaXplKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJCeXRlKHNpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlclVTaG9ydChzaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJJbnQoc2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgfQpAQCAtNDA1LDkgKzQxNiwxMCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG9mZnNldCBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsIGluIHRoZSBkYXRhIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHNwZWNpZmllZCBwaXhlbC4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHNwZWNpZmllZCBwaXhlbC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsLgogICAgICAqIEByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0KGludCB4LCBpbnQgeSkgewpAQCAtNDI1LDcgKzQzNyw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgYml0IG9mZnNldHMgb2YgdGhlIGRhdGEgYXJyYXkgZWxlbWVudHMuIAorICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdGhlIGJpdCBvZmZzZXRzIG9mIHRoZSBkYXRhIGFycmF5IGVsZW1lbnRzLgogICAgICAqIAogICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGJpdCBvZmZzZXRzLgogICAgICAqLwpAQCAtNTA1LDQgKzUxNywzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9UaWxlT2JzZXJ2ZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9UaWxlT2JzZXJ2ZXIuamF2YQppbmRleCAzOWRlZDAyLi43ZGQ5N2UyIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvVGlsZU9ic2VydmVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL1RpbGVPYnNlcnZlci5qYXZhCkBAIC0xOCwyNyArMTgsMzIgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCi0KIC8qKgotICogQW4gYXN5bmNocm9ub3VzIHVwZGF0ZSBpbnRlcmZhY2UgZm9yIHJlY2VpdmluZyBub3RpZmljYXRpb25zCi0gKiBhYm91dCB0aWxlIGluZm9ybWF0aW9uIHdoZW4gdGlsZXMgb2YgYSBXcml0YWJsZVJlbmRlcmVkSW1hZ2UgCi0gKiBiZWNvbWUgbW9kaWZpYWJsZSBvciB1bm1vZGlmaWFibGUuCisgKiBBbiBhc3luY2hyb25vdXMgdXBkYXRlIGludGVyZmFjZSBmb3IgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbnMgYWJvdXQgdGlsZQorICogaW5mb3JtYXRpb24gd2hlbiB0aWxlcyBvZiBhIFdyaXRhYmxlUmVuZGVyZWRJbWFnZSBiZWNvbWUgbW9kaWZpYWJsZSBvcgorICogdW5tb2RpZmlhYmxlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBUaWxlT2JzZXJ2ZXIgewogCiAgICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gaW5mb3JtYXRpb24gYWJvdXQgYSB0aWxlCi0gICAgICogdXBkYXRlIGlzIGF2YWlsYWJsZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBpbmZvcm1hdGlvbiBhYm91dCBhIHRpbGUgdXBkYXRlIGlzIGF2YWlsYWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2UgaW1hZ2UuCi0gICAgICogQHBhcmFtIHRpbGVYIHRoZSBYIGluZGV4IG9mIHRoZSB0aWxlLgotICAgICAqIEBwYXJhbSB0aWxlWSB0aGUgWSBpbmRleCBvZiB0aGUgdGlsZS4KLSAgICAgKiBAcGFyYW0gd2lsbEJlV3JpdGFibGUgcGFyYW1ldGVyIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyCi0gICAgICogdGhlIHRpbGUgd2lsbCBiZSBncmFiYmVkIGZvciB3cml0aW5nIG9yIGJlIHJlbGVhc2VkLgorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgaW1hZ2UuCisgICAgICogQHBhcmFtIHRpbGVYCisgICAgICogICAgICAgICAgICB0aGUgWCBpbmRleCBvZiB0aGUgdGlsZS4KKyAgICAgKiBAcGFyYW0gdGlsZVkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGluZGV4IG9mIHRoZSB0aWxlLgorICAgICAqIEBwYXJhbSB3aWxsQmVXcml0YWJsZQorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSB0aWxlIHdpbGwgYmUgZ3JhYmJlZCBmb3IKKyAgICAgKiAgICAgICAgICAgIHdyaXRpbmcgb3IgYmUgcmVsZWFzZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGlsZVVwZGF0ZShXcml0YWJsZVJlbmRlcmVkSW1hZ2Ugc291cmNlLCBpbnQgdGlsZVgsIGludCB0aWxlWSwgYm9vbGVhbiB3aWxsQmVXcml0YWJsZSk7CisgICAgcHVibGljIHZvaWQgdGlsZVVwZGF0ZShXcml0YWJsZVJlbmRlcmVkSW1hZ2Ugc291cmNlLCBpbnQgdGlsZVgsIGludCB0aWxlWSwKKyAgICAgICAgICAgIGJvb2xlYW4gd2lsbEJlV3JpdGFibGUpOwogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9Wb2xhdGlsZUltYWdlLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvVm9sYXRpbGVJbWFnZS5qYXZhCmluZGV4IDNiMGNmYjIuLmYyNGU4NjYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9Wb2xhdGlsZUltYWdlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL1ZvbGF0aWxlSW1hZ2UuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBBbGV4ZXkgQS4gUGV0cmVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7CkBAIC0yOCwzNSArMjksMzYgQEAKIGltcG9ydCBqYXZhLmF3dC5UcmFuc3BhcmVuY3k7CiAKIC8qKgotICogVGhlIFZvbGF0aWxlSW1hZ2UgYWJzdHJhY3QgY2xhc3MgcmVwcmVzZW50cyBhbiBpbWFnZSB3aGljaCBjYW4gbG9zZSAKLSAqIGl0cyBjb250ZW50cyBhdCBhbnkgcG9pbnQuIFZvbGF0aWxlSW1hZ2Ugb2JqZWN0cyBhcmUgZGV2aWNlIHNwZWNpZmljLgotICogVGhpcyBjbGFzcyBwcm92aWVzIG1ldGhvZHMgZm9yIGNoZWNraW5nIGlmIG9wZXJhdGlvbiBvZiB0aGlzIGltYWdlCi0gKiBhcmUgY29tcGF0aWJsZSBmb3IgdGhlIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4gCisgKiBUaGUgVm9sYXRpbGVJbWFnZSBhYnN0cmFjdCBjbGFzcyByZXByZXNlbnRzIGFuIGltYWdlIHdoaWNoIGNhbiBsb3NlIGl0cworICogY29udGVudHMgYXQgYW55IHBvaW50LiBWb2xhdGlsZUltYWdlIG9iamVjdHMgYXJlIGRldmljZSBzcGVjaWZpYy4gVGhpcyBjbGFzcworICogcHJvdmlkZXMgbWV0aG9kcyBmb3IgY2hlY2tpbmcgaWYgb3BlcmF0aW9uIG9mIHRoaXMgaW1hZ2UgYXJlIGNvbXBhdGlibGUgZm9yCisgKiB0aGUgR3JhcGhpY3NDb25maWd1cmF0aW9uLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFZvbGF0aWxlSW1hZ2UgZXh0ZW5kcyBJbWFnZQotICAgIC8vIFZvbGF0aWxlIGltYWdlIGltcGxlbWVudHMgVHJhbnNwYXJlbmN5IHNpbmNlIDEuNQotICAgIGltcGxlbWVudHMgVHJhbnNwYXJlbmN5IHsKLSAgICAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IElNQUdFX0lOQ09NUEFUSUJMRSBpbmRpY2F0ZXMgdGhhdCB0aGlzIFZvbGF0aWxlSW1hZ2UgCi0gICAgICogaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gb2JqZWN0LiAKKy8vIFZvbGF0aWxlIGltYWdlIGltcGxlbWVudHMgVHJhbnNwYXJlbmN5IHNpbmNlIDEuNQorICAgICAgICBpbXBsZW1lbnRzIFRyYW5zcGFyZW5jeSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgSU1BR0VfSU5DT01QQVRJQkxFIGluZGljYXRlcyB0aGF0IHRoaXMgVm9sYXRpbGVJbWFnZSBpcyBub3QKKyAgICAgKiBhcHBsaWNhYmxlIGZvciB0aGUgR3JhcGhpY3NDb25maWd1cmF0aW9uIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTUFHRV9JTkNPTVBBVElCTEUgPSAyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBJTUFHRV9PSyBpbmRpY2F0ZXMgdGhhdCBWb2xhdGlsZUltYWdlIGlzIHJlYWR5IAotICAgICAqIGZvciB1c2luZy4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgSU1BR0VfT0sgaW5kaWNhdGVzIHRoYXQgVm9sYXRpbGVJbWFnZSBpcyByZWFkeSBmb3IgdXNpbmcuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfT0sgPSAwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBJTUFHRV9SRVNUT1JFRCBpbmRpY2F0ZXMgdGhhdCBWb2xhdGlsZUltYWdlCi0gICAgICogd2lsbCBiZSByZWFkeSB0byB1c2UgYWZ0ZXIgcmVzdG9yaW5nLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgSU1BR0VfUkVTVE9SRUQgaW5kaWNhdGVzIHRoYXQgVm9sYXRpbGVJbWFnZSB3aWxsIGJlIHJlYWR5IHRvCisgICAgICogdXNlIGFmdGVyIHJlc3RvcmluZy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTUFHRV9SRVNUT1JFRCA9IDE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIHRyYW5zcGFyZW5jeSB2YWx1ZSBvZiB0aGlzIGltYWdlLiAKKyAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNwYXJlbmN5IHZhbHVlIG9mIHRoaXMgaW1hZ2UuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludCB0cmFuc3BhcmVuY3kgPSBPUEFRVUU7CiAKQEAgLTY4LDggKzcwLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgcmVuZGVyaW5nIGRhdGEgaXMgbG9zdCBkdXJpbmcgdmFsaWRhdGluZy4KLSAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHJlbmRlcmluZyBvcGVyYXRpb24gb2YgaW1hZ2UuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHJlbmRlcmluZyBkYXRhIGlzIGxvc3QgZHVyaW5nIHZhbGlkYXRpbmcuIFRoaXMgbWV0aG9kCisgICAgICogc2hvdWxkIGJlIGNhbGxlZCBhZnRlciByZW5kZXJpbmcgb3BlcmF0aW9uIG9mIGltYWdlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgY29udGVudHMgbG9zdCBkdXJpbmcgdmFsaWRhdGluZywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwpAQCAtOTgsOCArMTAwLDggQEAKICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEhlaWdodCgpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIEJ1ZmZlcmVkSW1hZ2UgcmVwcmVzZW50YXRpb24gb2YgY3VycmVudCBWb2xhdGlsZUltYWdlIHRoYXQKLSAgICAgKiB3b24ndCBiZSBhZmZlY3RlZCBieSBhbnkgY2hhbmdlcyB0byB0aGlzIFZvbGF0aWxlSW1hZ2UuCisgICAgICogR2V0cyBhIEJ1ZmZlcmVkSW1hZ2UgcmVwcmVzZW50YXRpb24gb2YgY3VycmVudCBWb2xhdGlsZUltYWdlIHRoYXQgd29uJ3QKKyAgICAgKiBiZSBhZmZlY3RlZCBieSBhbnkgY2hhbmdlcyB0byB0aGlzIFZvbGF0aWxlSW1hZ2UuCiAgICAgICogCiAgICAgICogQHJldHVybiBhIEJ1ZmZlcmVkSW1hZ2UgcmVwcmVzZW50YXRpb24gb2YgY3VycmVudCBWb2xhdGlsZUltYWdlLgogICAgICAqLwpAQCAtMTEzLDE0ICsxMTUsMTQgQEAKICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFdpZHRoKCk7CiAKICAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIGRyYXdpbmcgc3VyZmFjZSBvZiB0aGUgaW1hZ2UgaWYgdGhlIHN1cmZhY2UgaGFkIGJlZW4gCi0gICAgICogbG9zdCBhbmQgaWYgdGhlIHNwYWNpZmllZCBHcmFwaGljc0NvbmZpZ3VyYXRpb24gb2JqZWN0IGlzICAKLSAgICAgKiBhcHBsaWNhYmxlIHRvIHRoaXMgaW1hZ2UuIAorICAgICAqIFZhbGlkYXRlcyB0aGUgZHJhd2luZyBzdXJmYWNlIG9mIHRoZSBpbWFnZSBpZiB0aGUgc3VyZmFjZSBoYWQgYmVlbiBsb3N0CisgICAgICogYW5kIGlmIHRoZSBzcGVjaWZpZWQgR3JhcGhpY3NDb25maWd1cmF0aW9uIG9iamVjdCBpcyBhcHBsaWNhYmxlIHRvIHRoaXMKKyAgICAgKiBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZ2MgR3JhcGhpY3NDb25maWd1cmF0aW9uIG9iamVjdC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2MKKyAgICAgKiAgICAgICAgICAgIHRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gb2JqZWN0LgogICAgICAqIEByZXR1cm4gb25lIG9mIHRoZSBpbWFnZSBzdGF0dXMgY29uc3RhbnRzOiBJTUFHRV9PSywgSU1BR0VfUkVTVE9SRUQgb3IKLSAgICAgKiBJTUFHRV9JTkNPTVBBVElCTEUuCisgICAgICogICAgICAgICBJTUFHRV9JTkNPTVBBVElCTEUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCB2YWxpZGF0ZShHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2MpOwogCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvV3JpdGFibGVSYXN0ZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9Xcml0YWJsZVJhc3Rlci5qYXZhCmluZGV4IDA4OTM5MTUuLjUxMzY2ZWUgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9Xcml0YWJsZVJhc3Rlci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9Xcml0YWJsZVJhc3Rlci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEuYXd0LlBvaW50OwpAQCAtMjYsMTE0ICsyNywxMzYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgV3JpdGFibGVSYXN0ZXIgY2xhc3MgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgCi0gKiB3cml0aW5nIHNhbXBsZXMgYW5kIHBpeGVsIGNhcGFiaWxpdGllcyB0byB0aGUgUmFzdGVyLgorICogVGhlIFdyaXRhYmxlUmFzdGVyIGNsYXNzIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIHdyaXRpbmcgc2FtcGxlcyBhbmQgcGl4ZWwKKyAqIGNhcGFiaWxpdGllcyB0byB0aGUgUmFzdGVyLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFdyaXRhYmxlUmFzdGVyIGV4dGVuZHMgUmFzdGVyIHsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBXcml0YWJsZVJhc3RlciBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIAotICAgICAqIFNhbXBsZU1vZGVsLCBEYXRhQnVmZmVyLCByZWN0YW5ndWxhciByZWdpb24gYW5kIHBhcmVudCAKLSAgICAgKiBXcml0YWJsZVJhc3Rlci4gCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFdyaXRhYmxlUmFzdGVyIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwsCisgICAgICogRGF0YUJ1ZmZlciwgcmVjdGFuZ3VsYXIgcmVnaW9uIGFuZCBwYXJlbnQgV3JpdGFibGVSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNhbXBsZU1vZGVsIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwuCi0gICAgICogQHBhcmFtIGRhdGFCdWZmZXIgdGhlIHNwZWNpZmllZCBEYXRhQnVmZmVyLgotICAgICAqIEBwYXJhbSBhUmVnaW9uIHRoZSByZWN0YW5ndWxhciByZWdpb24gd2hpY2ggZGVmaW5lcyB0aGUgbmV3IGltYWdlIGJvdW5kcy4gCi0gICAgICogQHBhcmFtIHNhbXBsZU1vZGVsVHJhbnNsYXRlIHRoaXMgcG9pbnQgZGVmaW5lcyB0aGUgdHJhbnNsYXRpb24gcG9pbnQKLSAgICAgKiBmcm9tIHRoZSBTYW1wbGVNb2RlbCB0byB0aGUgbmV3IFdyaXRhYmxlUmFzdGVyIGNvb3JkaW5hdGVzLgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBvZiB0aGlzIFdyaXRhYmxlUmFzdGVyLgorICAgICAqIEBwYXJhbSBzYW1wbGVNb2RlbAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBTYW1wbGVNb2RlbC4KKyAgICAgKiBAcGFyYW0gZGF0YUJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBEYXRhQnVmZmVyLgorICAgICAqIEBwYXJhbSBhUmVnaW9uCisgICAgICogICAgICAgICAgICB0aGUgcmVjdGFuZ3VsYXIgcmVnaW9uIHdoaWNoIGRlZmluZXMgdGhlIG5ldyBpbWFnZSBib3VuZHMuCisgICAgICogQHBhcmFtIHNhbXBsZU1vZGVsVHJhbnNsYXRlCisgICAgICogICAgICAgICAgICB0aGlzIHBvaW50IGRlZmluZXMgdGhlIHRyYW5zbGF0aW9uIHBvaW50IGZyb20gdGhlIFNhbXBsZU1vZGVsCisgICAgICogICAgICAgICAgICB0byB0aGUgbmV3IFdyaXRhYmxlUmFzdGVyIGNvb3JkaW5hdGVzLgorICAgICAqIEBwYXJhbSBwYXJlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgb2YgdGhpcyBXcml0YWJsZVJhc3Rlci4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgV3JpdGFibGVSYXN0ZXIoU2FtcGxlTW9kZWwgc2FtcGxlTW9kZWwsIERhdGFCdWZmZXIgZGF0YUJ1ZmZlciwKLSAgICAgICAgICAgIFJlY3RhbmdsZSBhUmVnaW9uLCBQb2ludCBzYW1wbGVNb2RlbFRyYW5zbGF0ZSwKLSAgICAgICAgICAgIFdyaXRhYmxlUmFzdGVyIHBhcmVudCkgeworICAgIHByb3RlY3RlZCBXcml0YWJsZVJhc3RlcihTYW1wbGVNb2RlbCBzYW1wbGVNb2RlbCwgRGF0YUJ1ZmZlciBkYXRhQnVmZmVyLCBSZWN0YW5nbGUgYVJlZ2lvbiwKKyAgICAgICAgICAgIFBvaW50IHNhbXBsZU1vZGVsVHJhbnNsYXRlLCBXcml0YWJsZVJhc3RlciBwYXJlbnQpIHsKICAgICAgICAgc3VwZXIoc2FtcGxlTW9kZWwsIGRhdGFCdWZmZXIsIGFSZWdpb24sIHNhbXBsZU1vZGVsVHJhbnNsYXRlLCBwYXJlbnQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBXcml0YWJsZVJhc3RlciBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICogU2FtcGxlTW9kZWwgd2hpY2ggZGVmaW5lcyBhIGxheW91dCBvZiB0aGlzIFdyaXRhYmxlUmFzdGVyIGFuZCAKLSAgICAgKiBEYXRhQnVmZmVyIG9iamVjdHMgd2hpY2ggZGVmaW5lcyB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgV3JpdGFibGVSYXN0ZXIgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBTYW1wbGVNb2RlbAorICAgICAqIHdoaWNoIGRlZmluZXMgYSBsYXlvdXQgb2YgdGhpcyBXcml0YWJsZVJhc3RlciBhbmQgRGF0YUJ1ZmZlciBvYmplY3RzCisgICAgICogd2hpY2ggZGVmaW5lcyB0aGUgaW1hZ2UgZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2FtcGxlTW9kZWwgdGhlIHNwZWNpZmllZCBTYW1wbGVNb2RlbC4KLSAgICAgKiBAcGFyYW0gZGF0YUJ1ZmZlciB0aGUgc3BlY2lmaWVkIERhdGFCdWZmZXIuCi0gICAgICogQHBhcmFtIG9yaWdpbiB0aGUgcG9pbnQgb2Ygb3JpZ2luLgorICAgICAqIEBwYXJhbSBzYW1wbGVNb2RlbAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBTYW1wbGVNb2RlbC4KKyAgICAgKiBAcGFyYW0gZGF0YUJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBEYXRhQnVmZmVyLgorICAgICAqIEBwYXJhbSBvcmlnaW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2ludCBvZiBvcmlnaW4uCiAgICAgICovCi0gICAgcHJvdGVjdGVkIFdyaXRhYmxlUmFzdGVyKFNhbXBsZU1vZGVsIHNhbXBsZU1vZGVsLCBEYXRhQnVmZmVyIGRhdGFCdWZmZXIsCi0gICAgICAgICAgICBQb2ludCBvcmlnaW4pIHsKLSAgICAgICAgdGhpcyhzYW1wbGVNb2RlbCwgZGF0YUJ1ZmZlciwgbmV3IFJlY3RhbmdsZShvcmlnaW4ueCwgb3JpZ2luLnksCi0gICAgICAgICAgICAgICAgc2FtcGxlTW9kZWwud2lkdGgsIHNhbXBsZU1vZGVsLmhlaWdodCksIG9yaWdpbiwgbnVsbCk7CisgICAgcHJvdGVjdGVkIFdyaXRhYmxlUmFzdGVyKFNhbXBsZU1vZGVsIHNhbXBsZU1vZGVsLCBEYXRhQnVmZmVyIGRhdGFCdWZmZXIsIFBvaW50IG9yaWdpbikgeworICAgICAgICB0aGlzKHNhbXBsZU1vZGVsLCBkYXRhQnVmZmVyLCBuZXcgUmVjdGFuZ2xlKG9yaWdpbi54LCBvcmlnaW4ueSwgc2FtcGxlTW9kZWwud2lkdGgsCisgICAgICAgICAgICAgICAgc2FtcGxlTW9kZWwuaGVpZ2h0KSwgb3JpZ2luLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgV3JpdGFibGVSYXN0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIFNhbXBsZU1vZGVsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzYW1wbGVNb2RlbCB0aGUgc3BlY2lmaWVkIFNhbXBsZU1vZGVsLgotICAgICAqIEBwYXJhbSBvcmlnaW4gdGhlIG9yaWdpbi4KKyAgICAgKiBAcGFyYW0gc2FtcGxlTW9kZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwuCisgICAgICogQHBhcmFtIG9yaWdpbgorICAgICAqICAgICAgICAgICAgdGhlIG9yaWdpbi4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgV3JpdGFibGVSYXN0ZXIoU2FtcGxlTW9kZWwgc2FtcGxlTW9kZWwsIFBvaW50IG9yaWdpbikgewotICAgICAgICB0aGlzKHNhbXBsZU1vZGVsLCBzYW1wbGVNb2RlbC5jcmVhdGVEYXRhQnVmZmVyKCksIG5ldyBSZWN0YW5nbGUoCi0gICAgICAgICAgICAgICAgb3JpZ2luLngsIG9yaWdpbi55LCBzYW1wbGVNb2RlbC53aWR0aCwgc2FtcGxlTW9kZWwuaGVpZ2h0KSwKLSAgICAgICAgICAgICAgICBvcmlnaW4sIG51bGwpOworICAgICAgICB0aGlzKHNhbXBsZU1vZGVsLCBzYW1wbGVNb2RlbC5jcmVhdGVEYXRhQnVmZmVyKCksIG5ldyBSZWN0YW5nbGUob3JpZ2luLngsIG9yaWdpbi55LAorICAgICAgICAgICAgICAgIHNhbXBsZU1vZGVsLndpZHRoLCBzYW1wbGVNb2RlbC5oZWlnaHQpLCBvcmlnaW4sIG51bGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRhdGEgZm9yIGEgc2luZ2xlIHBpeGVsIGZyb20gYW4gaW5wdXQgT2JqZWN0IHdoaWNoIAotICAgICAqIHJlcHJlc2VudHMgYW4gYXJyYXkgb2YgcHJpbWl0aXZlIHR5cGVzOiBEYXRhQnVmZmVyLlRZUEVfQllURSwgCi0gICAgICogRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwgRGF0YUJ1ZmZlci5UWVBFX0lOVCwgRGF0YUJ1ZmZlci5UWVBFX1NIT1JULCAKLSAgICAgKiBEYXRhQnVmZmVyLlRZUEVfRkxPQVQsIG9yIERhdGFCdWZmZXIuVFlQRV9ET1VCTEUuCisgICAgICogU2V0cyB0aGUgZGF0YSBmb3IgYSBzaW5nbGUgcGl4ZWwgZnJvbSBhbiBpbnB1dCBPYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBhbgorICAgICAqIGFycmF5IG9mIHByaW1pdGl2ZSB0eXBlczogRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsCisgICAgICogRGF0YUJ1ZmZlci5UWVBFX0lOVCwgRGF0YUJ1ZmZlci5UWVBFX1NIT1JULCBEYXRhQnVmZmVyLlRZUEVfRkxPQVQsIG9yCisgICAgICogRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KLSAgICAgKiBAcGFyYW0gaW5EYXRhIHRoZSBpbnB1dCBkYXRhLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIGluRGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RGF0YUVsZW1lbnRzKGludCB4LCBpbnQgeSwgT2JqZWN0IGluRGF0YSkgewotICAgICAgICBzYW1wbGVNb2RlbC5zZXREYXRhRWxlbWVudHMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwKLSAgICAgICAgICAgICAgICB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBpbkRhdGEsIGRhdGFCdWZmZXIpOworICAgICAgICBzYW1wbGVNb2RlbC5zZXREYXRhRWxlbWVudHMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgaW5EYXRhLAorICAgICAgICAgICAgICAgIGRhdGFCdWZmZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRhdGEgZWxlbWVudHMgd2hpY2ggcmVwcmVzZW50IHBpeGVsIGRhdGEgdG8gdGhlIHNwZWNpZmllZCAKLSAgICAgKiByZWN0YW5nbGUgYXJlYSBhcyBhIHByaW1pdGl2ZSBhcnJheS4gVGhlIGZvbGxvd2luZyBpbWFnZSBkYXRhIHR5cGVzCi0gICAgICogYXJlIHN1cHBvcnRlZDogRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIAotICAgICAqIERhdGFCdWZmZXIuVFlQRV9JTlQsIERhdGFCdWZmZXIuVFlQRV9TSE9SVCwgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FULCAKLSAgICAgKiBvciBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFLgorICAgICAqIFNldHMgdGhlIGRhdGEgZWxlbWVudHMgd2hpY2ggcmVwcmVzZW50IHBpeGVsIGRhdGEgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIHJlY3RhbmdsZSBhcmVhIGFzIGEgcHJpbWl0aXZlIGFycmF5LiBUaGUgZm9sbG93aW5nIGltYWdlIGRhdGEgdHlwZXMgYXJlCisgICAgICogc3VwcG9ydGVkOiBEYXRhQnVmZmVyLlRZUEVfQllURSwgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwKKyAgICAgKiBEYXRhQnVmZmVyLlRZUEVfSU5ULCBEYXRhQnVmZmVyLlRZUEVfU0hPUlQsIERhdGFCdWZmZXIuVFlQRV9GTE9BVCwgb3IKKyAgICAgKiBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gaW5EYXRhIHRoZSBhcnJheSBvZiBwcmltaXRpdmUgdHlwZSBkYXRhIHRvIGJlIHNldCB0byB0aGUKLSAgICAgKiBzcGVjaWZpZWQgYXJlYS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBpbkRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBwcmltaXRpdmUgdHlwZSBkYXRhIHRvIGJlIHNldCB0byB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICAgICBhcmVhLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERhdGFFbGVtZW50cyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgT2JqZWN0IGluRGF0YSkgewotICAgICAgICBzYW1wbGVNb2RlbC5zZXREYXRhRWxlbWVudHMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwKLSAgICAgICAgICAgICAgICB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCB3LCBoLCBpbkRhdGEsIGRhdGFCdWZmZXIpOworICAgICAgICBzYW1wbGVNb2RlbC5zZXREYXRhRWxlbWVudHMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywgaCwKKyAgICAgICAgICAgICAgICBpbkRhdGEsIGRhdGFCdWZmZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGNoaWxkIG9mIHRoaXMgV3JpdGFibGVSYXN0ZXIgYnkgc2hhcmluZyB0aGUgc3BlY2lmaWVkIAotICAgICAqIHJlY3Rhbmd1bGFyIGFyZWEgaW4gdGhpcyBXcml0YWJsZVJhc3Rlci4gCi0gICAgICogVGhlIHBhcmVudFgsIHBhcmVudFksIHdpZHRoIGFuZCBoZWlnaHQgcGFyYW1ldGVycyBzcGVjaWZ5IHJlY3Rhbmd1bGFyCi0gICAgICogYXJlYSB0byBiZSBzaGFyZWQuCisgICAgICogQ3JlYXRlcyB0aGUgY2hpbGQgb2YgdGhpcyBXcml0YWJsZVJhc3RlciBieSBzaGFyaW5nIHRoZSBzcGVjaWZpZWQKKyAgICAgKiByZWN0YW5ndWxhciBhcmVhIGluIHRoaXMgV3JpdGFibGVSYXN0ZXIuIFRoZSBwYXJlbnRYLCBwYXJlbnRZLCB3aWR0aCBhbmQKKyAgICAgKiBoZWlnaHQgcGFyYW1ldGVycyBzcGVjaWZ5IHJlY3Rhbmd1bGFyIGFyZWEgdG8gYmUgc2hhcmVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnRYIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIAotICAgICAqIHRoZSBzaGFyZWQgcmVjdGFuZ2xlIHdpdGggcmVzcGVjdCB0byB0aGlzIFdyaXRhYmxlUmFzdGVyJyBjb29yZGluYXRlcy4gCi0gICAgICogQHBhcmFtIHBhcmVudFkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgCi0gICAgICogdGhlIHNoYXJlZCByZWN0YW5nbGUgd2l0aCByZXNwZWN0IHRvIHRoaXMgV3JpdGFibGVSYXN0ZXInIGNvb3JkaW5hdGVzLiAKLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGNoaWxkIGFyZWEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgY2hpbGQgYXJlYS4KLSAgICAgKiBAcGFyYW0gY2hpbGRNaW5YIHRoZSBYIGNvb3JkaW5hdGUgb2YgY2hpbGQgYXJlYSBtYXBwZWQgdG8gdGhlIHBhcmVudFgKLSAgICAgKiBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSBjaGlsZE1pblkgdGhlIFkgY29vcmRpbmF0ZSBvZiBjaGlsZCBhcmVhIG1hcHBlZCB0byB0aGUgcGFyZW50WQotICAgICAqIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIGJhbmRMaXN0IHRoZSBhcnJheSBvZiBiYW5kIGluZGljaWVzLgotICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJlbnRYCisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgc2hhcmVkCisgICAgICogICAgICAgICAgICByZWN0YW5nbGUgd2l0aCByZXNwZWN0IHRvIHRoaXMgV3JpdGFibGVSYXN0ZXInIGNvb3JkaW5hdGVzLgorICAgICAqIEBwYXJhbSBwYXJlbnRZCisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgc2hhcmVkCisgICAgICogICAgICAgICAgICByZWN0YW5nbGUgd2l0aCByZXNwZWN0IHRvIHRoaXMgV3JpdGFibGVSYXN0ZXInIGNvb3JkaW5hdGVzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGNoaWxkIGFyZWEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGNoaWxkIGFyZWEuCisgICAgICogQHBhcmFtIGNoaWxkTWluWAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiBjaGlsZCBhcmVhIG1hcHBlZCB0byB0aGUgcGFyZW50WAorICAgICAqICAgICAgICAgICAgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0gY2hpbGRNaW5ZCisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIGNoaWxkIGFyZWEgbWFwcGVkIHRvIHRoZSBwYXJlbnRZCisgICAgICogICAgICAgICAgICBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSBiYW5kTGlzdAorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGJhbmQgaW5kaWNlcy4KICAgICAgKiBAcmV0dXJuIHRoZSBjaGlsZCBXcml0YWJsZVJhc3Rlci4KICAgICAgKi8KLSAgICBwdWJsaWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlV3JpdGFibGVDaGlsZChpbnQgcGFyZW50WCwgaW50IHBhcmVudFksIGludCB3LAotICAgICAgICAgICAgaW50IGgsIGludCBjaGlsZE1pblgsIGludCBjaGlsZE1pblksIGludCBiYW5kTGlzdFtdKSB7CisgICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZVdyaXRhYmxlQ2hpbGQoaW50IHBhcmVudFgsIGludCBwYXJlbnRZLCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICBpbnQgY2hpbGRNaW5YLCBpbnQgY2hpbGRNaW5ZLCBpbnQgYmFuZExpc3RbXSkgewogICAgICAgICBpZiAodyA8PSAwIHx8IGggPD0gMCkgewotICAgICAgICAgICAgLy8gYXd0LjI0ND1XaWR0aCBvciBIZWlnaHQgb2YgY2hpbGQgUmFzdGVyIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvCisgICAgICAgICAgICAvLyBhd3QuMjQ0PVdpZHRoIG9yIEhlaWdodCBvZiBjaGlsZCBSYXN0ZXIgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvCisgICAgICAgICAgICAvLyB6ZXJvCiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI0NCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKQEAgLTE0NywyMiArMTcwLDIyIEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI0NiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChsb25nKSBwYXJlbnRYICsgdyA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgIGlmICgobG9uZylwYXJlbnRYICsgdyA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjQ3PXBhcmVudFggKyB3IHJlc3VsdHMgaW4gaW50ZWdlciBvdmVyZmxvdwogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNDciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIGlmICgobG9uZykgcGFyZW50WSArIGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICBpZiAoKGxvbmcpcGFyZW50WSArIGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewogICAgICAgICAgICAgLy8gYXd0LjI0OD1wYXJlbnRZICsgaCByZXN1bHRzIGluIGludGVnZXIgb3ZlcmZsb3cKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjQ4IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKGxvbmcpIGNoaWxkTWluWCArIHcgPiBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICBpZiAoKGxvbmcpY2hpbGRNaW5YICsgdyA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjQ5PWNoaWxkTWluWCArIHcgcmVzdWx0cyBpbiBpbnRlZ2VyIG92ZXJmbG93CiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI0OSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChsb25nKSBjaGlsZE1pblkgKyBoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgaWYgKChsb25nKWNoaWxkTWluWSArIGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewogICAgICAgICAgICAgLy8gYXd0LjI0QT1jaGlsZE1pblkgKyBoIHJlc3VsdHMgaW4gaW50ZWdlciBvdmVyZmxvdwogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNEEiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQpAQCAtMTc5LDU5ICsyMDIsNjAgQEAKICAgICAgICAgaW50IGNoaWxkVHJhbnNsYXRlWSA9IGNoaWxkTWluWSAtIHBhcmVudFk7CiAKICAgICAgICAgcmV0dXJuIG5ldyBXcml0YWJsZVJhc3RlcihjaGlsZE1vZGVsLCBkYXRhQnVmZmVyLAotICAgICAgICAgICAgICAgIG5ldyBSZWN0YW5nbGUoY2hpbGRNaW5YLCBjaGlsZE1pblksIHcsIGgpLAotICAgICAgICAgICAgICAgIG5ldyBQb2ludChjaGlsZFRyYW5zbGF0ZVggKyBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFRyYW5zbGF0ZVkgKyBzYW1wbGVNb2RlbFRyYW5zbGF0ZVkpLAotICAgICAgICAgICAgICAgIHRoaXMpOworICAgICAgICAgICAgICAgIG5ldyBSZWN0YW5nbGUoY2hpbGRNaW5YLCBjaGlsZE1pblksIHcsIGgpLCBuZXcgUG9pbnQoY2hpbGRUcmFuc2xhdGVYCisgICAgICAgICAgICAgICAgICAgICAgICArIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgY2hpbGRUcmFuc2xhdGVZICsgc2FtcGxlTW9kZWxUcmFuc2xhdGVZKSwgdGhpcyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgdHJhbnNsYXRlZCBjaGlsZCBvZiB0aGlzIFdyaXRhYmxlUmFzdGVyLiAKLSAgICAgKiBOZXcgV3JpdGFibGVSYXN0ZXIgb2JqZWN0IGlzIGEgcmVmZXJlbmNlIHRvIHRoZSB0aGlzIAotICAgICAqIFdyaXRhYmxlUmFzdGVyIGFuZCB3aXRoIGRpZmZlcmVudCBsb2NhdGlvbi4gCi0gICAgICogIAotICAgICAqIEBwYXJhbSBjaGlsZE1pblggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgbmV3IFdyaXRhYmxlUmFzdGVyLgotICAgICAqIEBwYXJhbSBjaGlsZE1pblkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgbmV3IFdyaXRhYmxlUmFzdGVyLgorICAgICAqIENyZWF0ZXMgdGhlIHRyYW5zbGF0ZWQgY2hpbGQgb2YgdGhpcyBXcml0YWJsZVJhc3Rlci4gTmV3IFdyaXRhYmxlUmFzdGVyCisgICAgICogb2JqZWN0IGlzIGEgcmVmZXJlbmNlIHRvIHRoZSB0aGlzIFdyaXRhYmxlUmFzdGVyIGFuZCB3aXRoIGRpZmZlcmVudAorICAgICAqIGxvY2F0aW9uLgogICAgICAqIAorICAgICAqIEBwYXJhbSBjaGlsZE1pblgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBXcml0YWJsZVJhc3Rlci4KKyAgICAgKiBAcGFyYW0gY2hpbGRNaW5ZCisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBuZXcgV3JpdGFibGVSYXN0ZXIuCiAgICAgICogQHJldHVybiB0aGUgV3JpdGFibGVSYXN0ZXIuCiAgICAgICovCi0gICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZVdyaXRhYmxlVHJhbnNsYXRlZENoaWxkKGludCBjaGlsZE1pblgsCi0gICAgICAgICAgICBpbnQgY2hpbGRNaW5ZKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVXcml0YWJsZUNoaWxkKG1pblgsIG1pblksIHdpZHRoLCBoZWlnaHQsIGNoaWxkTWluWCwKLSAgICAgICAgICAgICAgICBjaGlsZE1pblksIG51bGwpOworICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVXcml0YWJsZVRyYW5zbGF0ZWRDaGlsZChpbnQgY2hpbGRNaW5YLCBpbnQgY2hpbGRNaW5ZKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVXcml0YWJsZUNoaWxkKG1pblgsIG1pblksIHdpZHRoLCBoZWlnaHQsIGNoaWxkTWluWCwgY2hpbGRNaW5ZLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwYXJlbnQgV3JpdGFibGVSYXN0ZXIgZm9yIHRoaXMgV3JpdGFibGVSYXN0ZXIgb2JqZWN0LiAKKyAgICAgKiBHZXRzIHRoZSBwYXJlbnQgV3JpdGFibGVSYXN0ZXIgZm9yIHRoaXMgV3JpdGFibGVSYXN0ZXIgb2JqZWN0LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCBXcml0YWJsZVJhc3RlciBmb3IgdGhpcyBXcml0YWJsZVJhc3RlciBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGdldFdyaXRhYmxlUGFyZW50KCkgewotICAgICAgICByZXR1cm4gKFdyaXRhYmxlUmFzdGVyKSBwYXJlbnQ7CisgICAgICAgIHJldHVybiAoV3JpdGFibGVSYXN0ZXIpcGFyZW50OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgcGl4ZWxzIGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgUmFzdGVyIHNyY1Jhc3RlciB0byB0aGlzIAorICAgICAqIFNldHMgcGl4ZWxzIGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgUmFzdGVyIHNyY1Jhc3RlciB0byB0aGlzCiAgICAgICogV3JpdGFibGVSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyY1Jhc3RlciB0aGUgc291cmNlIFJhc3Rlci4KKyAgICAgKiBAcGFyYW0gc3JjUmFzdGVyCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIFJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRSZWN0KFJhc3RlciBzcmNSYXN0ZXIpIHsKICAgICAgICAgc2V0UmVjdCgwLCAwLCBzcmNSYXN0ZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgcGl4ZWxzIGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgUmFzdGVyIHNyY1Jhc3RlciB0byB0aGlzIAotICAgICAqIFdyaXRhYmxlUmFzdGVyLiBFYWNoIHBpeGVsIHdpdGggKHgsIHkpIGNvb3JkaW5hdGVzIGZyb20gdGhlIHNvdXJjZSAKLSAgICAgKiBSYXN0ZXIgaXMgY29waWVkIHRvIHBpeGVsIHdpdGggKHgrZHgsIHkrZHkpIGNvb3JkaW5hdGVzIGluIHRoaXMKLSAgICAgKiBXcml0YWJsZVJhc3Rlci4gVGhlIHBpeGVscyB3aXRoICh4K2R4LCB5K2R5KSBjb29yZGluYXRlcyB3aGljaAotICAgICAqIGFyZSBvdXQgdGhlIGJvdW5kcyBvZiB0aGlzIHJhc3RlciBhcmUgaWdub3JlZC4gCi0gICAgICogIAotICAgICAqIEBwYXJhbSBkeCB0aGUgZGlzdGFuY2UgdGhlIHBpeGVsJ3MgWCBjb29yZGluYXRlIGluIHRoZSBzb3VyY2UKLSAgICAgKiBSYXN0ZXIgaXMgdHJhbnNsYXRlZCB3aGVuIHdyaXR0aWVuIHRvIHRoaXMgV3JpdGFibGVSYXN0ZXIuIAotICAgICAqIEBwYXJhbSBkeSB0aGUgZGlzdGFuY2UgdGhlIHBpeGVsJ3MgWSBjb29yZGluYXRlIGluIHRoZSBzb3VyY2UKLSAgICAgKiBSYXN0ZXIgaXMgdHJhbnNsYXRlZCB3aGVuIHdyaXR0aWVuIHRvIHRoaXMgV3JpdGFibGVSYXN0ZXIuCi0gICAgICogQHBhcmFtIHNyY1Jhc3RlciB0aGUgc291cmNlIFJhc3Rlci4KKyAgICAgKiBTZXRzIHBpeGVscyBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIFJhc3RlciBzcmNSYXN0ZXIgdG8gdGhpcworICAgICAqIFdyaXRhYmxlUmFzdGVyLiBFYWNoIHBpeGVsIHdpdGggKHgsIHkpIGNvb3JkaW5hdGVzIGZyb20gdGhlIHNvdXJjZSBSYXN0ZXIKKyAgICAgKiBpcyBjb3BpZWQgdG8gcGl4ZWwgd2l0aCAoeCtkeCwgeStkeSkgY29vcmRpbmF0ZXMgaW4gdGhpcyBXcml0YWJsZVJhc3Rlci4KKyAgICAgKiBUaGUgcGl4ZWxzIHdpdGggKHgrZHgsIHkrZHkpIGNvb3JkaW5hdGVzIHdoaWNoIGFyZSBvdXQgdGhlIGJvdW5kcyBvZiB0aGlzCisgICAgICogcmFzdGVyIGFyZSBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkeAorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIHRoZSBwaXhlbCdzIFggY29vcmRpbmF0ZSBpbiB0aGUgc291cmNlIFJhc3RlciBpcworICAgICAqICAgICAgICAgICAgdHJhbnNsYXRlZCB3aGVuIHdyaXR0aWVuIHRvIHRoaXMgV3JpdGFibGVSYXN0ZXIuCisgICAgICogQHBhcmFtIGR5CisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgdGhlIHBpeGVsJ3MgWSBjb29yZGluYXRlIGluIHRoZSBzb3VyY2UgUmFzdGVyIGlzCisgICAgICogICAgICAgICAgICB0cmFuc2xhdGVkIHdoZW4gd3JpdHRpZW4gdG8gdGhpcyBXcml0YWJsZVJhc3Rlci4KKyAgICAgKiBAcGFyYW0gc3JjUmFzdGVyCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIFJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRSZWN0KGludCBkeCwgaW50IGR5LCBSYXN0ZXIgc3JjUmFzdGVyKSB7CiAgICAgICAgIGludCB3ID0gc3JjUmFzdGVyLmdldFdpZHRoKCk7CkBAIC0yNzIsNDcgKzI5Niw0NyBAQAogICAgICAgICB9CiAKICAgICAgICAgc3dpdGNoIChzYW1wbGVNb2RlbC5nZXREYXRhVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOgotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGludCBpUGl4ZWxzTGluZVtdID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaVBpeGVsc0xpbmUgPSBzcmNSYXN0ZXIuZ2V0UGl4ZWxzKHNyY1gsIHNyY1kgKyBpLCB3LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgaVBpeGVsc0xpbmUpOwotICAgICAgICAgICAgICAgIHNldFBpeGVscyhkc3RYLCBkc3RZICsgaSwgdywgMSwgaVBpeGVsc0xpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgaW50IGlQaXhlbHNMaW5lW10gPSBudWxsOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlQaXhlbHNMaW5lID0gc3JjUmFzdGVyLmdldFBpeGVscyhzcmNYLCBzcmNZICsgaSwgdywgMSwgaVBpeGVsc0xpbmUpOworICAgICAgICAgICAgICAgICAgICBzZXRQaXhlbHMoZHN0WCwgZHN0WSArIGksIHcsIDEsIGlQaXhlbHNMaW5lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRkxPQVQ6Ci0gICAgICAgICAgICBmbG9hdCBmUGl4ZWxzTGluZVtdID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZlBpeGVsc0xpbmUgPSBzcmNSYXN0ZXIuZ2V0UGl4ZWxzKHNyY1gsIHNyY1kgKyBpLCB3LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgZlBpeGVsc0xpbmUpOwotICAgICAgICAgICAgICAgIHNldFBpeGVscyhkc3RYLCBkc3RZICsgaSwgdywgMSwgZlBpeGVsc0xpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICBmbG9hdCBmUGl4ZWxzTGluZVtdID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmUGl4ZWxzTGluZSA9IHNyY1Jhc3Rlci5nZXRQaXhlbHMoc3JjWCwgc3JjWSArIGksIHcsIDEsIGZQaXhlbHNMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0UGl4ZWxzKGRzdFgsIGRzdFkgKyBpLCB3LCAxLCBmUGl4ZWxzTGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKLSAgICAgICAgICAgIGRvdWJsZSBkUGl4ZWxzTGluZVtdID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZFBpeGVsc0xpbmUgPSBzcmNSYXN0ZXIuZ2V0UGl4ZWxzKHNyY1gsIHNyY1kgKyBpLCB3LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgZFBpeGVsc0xpbmUpOwotICAgICAgICAgICAgICAgIHNldFBpeGVscyhkc3RYLCBkc3RZICsgaSwgdywgMSwgZFBpeGVsc0xpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgZG91YmxlIGRQaXhlbHNMaW5lW10gPSBudWxsOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRQaXhlbHNMaW5lID0gc3JjUmFzdGVyLmdldFBpeGVscyhzcmNYLCBzcmNZICsgaSwgdywgMSwgZFBpeGVsc0xpbmUpOworICAgICAgICAgICAgICAgICAgICBzZXRQaXhlbHMoZHN0WCwgZHN0WSArIGksIHcsIDEsIGRQaXhlbHNMaW5lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkYXRhIGZvciBhIHJlY3RhbmdsZSBvZiBwaXhlbHMgZnJvbSBhbiBpbnB1dCBSYXN0ZXIgdG8KLSAgICAgKiB0aGlzIFdyaXRhYmxlUmFzdGVyLgorICAgICAqIFNldHMgdGhlIGRhdGEgZm9yIGEgcmVjdGFuZ2xlIG9mIHBpeGVscyBmcm9tIGFuIGlucHV0IFJhc3RlciB0byB0aGlzCisgICAgICogV3JpdGFibGVSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgd2hlcmUgdGhlIGRhdGEgb2YgCi0gICAgICogdGhlIGlucHV0IFJhc3RlciBpcyB0byBiZSB3cml0dGVuLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHdoZXJlIHRoZSBkYXRhIG9mIAotICAgICAqIHRoZSBpbnB1dCBSYXN0ZXIgaXMgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0gaW5SYXN0ZXIgdGhlIGlucHV0IFJhc3Rlci4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgd2hlcmUgdGhlIGRhdGEgb2YgdGhlIGlucHV0CisgICAgICogICAgICAgICAgICBSYXN0ZXIgaXMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgd2hlcmUgdGhlIGRhdGEgb2YgdGhlIGlucHV0CisgICAgICogICAgICAgICAgICBSYXN0ZXIgaXMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gaW5SYXN0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBSYXN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RGF0YUVsZW1lbnRzKGludCB4LCBpbnQgeSwgUmFzdGVyIGluUmFzdGVyKSB7CiAgICAgICAgIGludCBkc3RYID0geCArIGluUmFzdGVyLmdldE1pblgoKTsKQEAgLTMyMSw4ICszNDUsOCBAQAogICAgICAgICBpbnQgdyA9IGluUmFzdGVyLmdldFdpZHRoKCk7CiAgICAgICAgIGludCBoID0gaW5SYXN0ZXIuZ2V0SGVpZ2h0KCk7CiAKLSAgICAgICAgaWYgKGRzdFggPCB0aGlzLm1pblggfHwgZHN0WCArIHcgPiB0aGlzLm1pblggKyB0aGlzLndpZHRoIHx8Ci0gICAgICAgICAgICAgICAgZHN0WSA8IHRoaXMubWluWSB8fCBkc3RZICsgaCA+IHRoaXMubWluWSArIHRoaXMuaGVpZ2h0KSB7CisgICAgICAgIGlmIChkc3RYIDwgdGhpcy5taW5YIHx8IGRzdFggKyB3ID4gdGhpcy5taW5YICsgdGhpcy53aWR0aCB8fCBkc3RZIDwgdGhpcy5taW5ZCisgICAgICAgICAgICAgICAgfHwgZHN0WSArIGggPiB0aGlzLm1pblkgKyB0aGlzLmhlaWdodCkgewogICAgICAgICAgICAgLy8gYXd0LjYzPUNvb3JkaW5hdGVzIGFyZSBub3QgaW4gYm91bmRzCiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KQEAgLTMzOCwxNzkgKzM2MiwyMzEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGEgaW50IGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgCi0gICAgICogaW4gdGhpcyBXcml0YWJsZVJhc3Rlci4gCisgICAgICogU2V0cyBhbiBpbnRlZ2VyIGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgaW4gdGhpcworICAgICAqIFdyaXRhYmxlUmFzdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBwaXhlbCdzIFggY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgcGl4ZWwncyBZIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIGlBcnJheSB0aGUgaW50IGFycmF5IG9mIHNhbXBsZXMuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbCdzIFggY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsJ3MgWSBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSBpQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIGFycmF5IG9mIHNhbXBsZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UGl4ZWwoaW50IHgsIGludCB5LCBpbnQgaUFycmF5W10pIHsKLSAgICAgICAgc2FtcGxlTW9kZWwuc2V0UGl4ZWwoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwKLSAgICAgICAgICAgICAgICB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBpQXJyYXksIGRhdGFCdWZmZXIpOworICAgICAgICBzYW1wbGVNb2RlbC5zZXRQaXhlbCh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBpQXJyYXksCisgICAgICAgICAgICAgICAgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgCi0gICAgICogaW4gdGhpcyBXcml0YWJsZVJhc3Rlci4gCisgICAgICogU2V0cyBhIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgaW4gdGhpcworICAgICAqIFdyaXRhYmxlUmFzdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBwaXhlbCdzIFggY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgcGl4ZWwncyBZIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIGZBcnJheSB0aGUgZmxvYXQgYXJyYXkgb2Ygc2FtcGxlcy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsJ3MgWCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwncyBZIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIGZBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UGl4ZWwoaW50IHgsIGludCB5LCBmbG9hdCBmQXJyYXlbXSkgewotICAgICAgICBzYW1wbGVNb2RlbC5zZXRQaXhlbCh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLAotICAgICAgICAgICAgICAgIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIGZBcnJheSwgZGF0YUJ1ZmZlcik7CisgICAgICAgIHNhbXBsZU1vZGVsLnNldFBpeGVsKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIGZBcnJheSwKKyAgICAgICAgICAgICAgICBkYXRhQnVmZmVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGEgZG91YmxlIGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgCi0gICAgICogaW4gdGhpcyBXcml0YWJsZVJhc3Rlci4gCisgICAgICogU2V0cyBhIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIGluIHRoaXMKKyAgICAgKiBXcml0YWJsZVJhc3Rlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgcGl4ZWwncyBYIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHkgdGhlIHBpeGVsJ3MgWSBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSBkQXJyYXkgdGhlIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwncyBYIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbCdzIFkgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0gZEFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZG91YmxlIGFycmF5IG9mIHNhbXBsZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UGl4ZWwoaW50IHgsIGludCB5LCBkb3VibGUgZEFycmF5W10pIHsKLSAgICAgICAgc2FtcGxlTW9kZWwuc2V0UGl4ZWwoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwKLSAgICAgICAgICAgICAgICB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBkQXJyYXksIGRhdGFCdWZmZXIpOworICAgICAgICBzYW1wbGVNb2RlbC5zZXRQaXhlbCh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBkQXJyYXksCisgICAgICAgICAgICAgICAgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIGludCBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEKLSAgICAgKiBvZiBwaXhlbHMgaW4gdGhpcyBXcml0YWJsZVJhc3Rlci4gCisgICAgICogU2V0cyBhIGludGVnZXIgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mCisgICAgICogcGl4ZWxzIGluIHRoaXMgV3JpdGFibGVSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHJlY3Rhbmd1bGFyIGFyZWEuCi0gICAgICogQHBhcmFtIGlBcnJheSB0aGUgaW50IGFycmF5IG9mIHNhbXBsZXMuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSBpQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIGFycmF5IG9mIHNhbXBsZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgaUFycmF5W10pIHsKLSAgICAgICAgc2FtcGxlTW9kZWwuc2V0UGl4ZWxzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsCi0gICAgICAgICAgICAgICAgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywgaCwgaUFycmF5LCBkYXRhQnVmZmVyKTsKKyAgICAgICAgc2FtcGxlTW9kZWwuc2V0UGl4ZWxzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsIGgsIGlBcnJheSwKKyAgICAgICAgICAgICAgICBkYXRhQnVmZmVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGEgZmxvYXQgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhCi0gICAgICogb2YgcGl4ZWxzIGluIHRoaXMgV3JpdGFibGVSYXN0ZXIuIAorICAgICAqIFNldHMgYSBmbG9hdCBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YKKyAgICAgKiBwaXhlbHMgaW4gdGhpcyBXcml0YWJsZVJhc3Rlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0gZkFycmF5IHRoZSBmbG9hdCBhcnJheSBvZiBzYW1wbGVzLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0gZkFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgYXJyYXkgb2Ygc2FtcGxlcy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGZsb2F0IGZBcnJheVtdKSB7Ci0gICAgICAgIHNhbXBsZU1vZGVsLnNldFBpeGVscyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLAotICAgICAgICAgICAgICAgIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsIGgsIGZBcnJheSwgZGF0YUJ1ZmZlcik7CisgICAgICAgIHNhbXBsZU1vZGVsLnNldFBpeGVscyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCB3LCBoLCBmQXJyYXksCisgICAgICAgICAgICAgICAgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEKLSAgICAgKiBvZiBwaXhlbHMgaW4gdGhpcyBXcml0YWJsZVJhc3Rlci4gCisgICAgICogU2V0cyBhIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YKKyAgICAgKiBwaXhlbHMgaW4gdGhpcyBXcml0YWJsZVJhc3Rlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0gZEFycmF5IHRoZSBkb3VibGUgYXJyYXkgb2Ygc2FtcGxlcy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIGRBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgZG91YmxlIGRBcnJheVtdKSB7Ci0gICAgICAgIHNhbXBsZU1vZGVsLnNldFBpeGVscyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLAotICAgICAgICAgICAgICAgIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsIGgsIGRBcnJheSwgZGF0YUJ1ZmZlcik7CisgICAgICAgIHNhbXBsZU1vZGVsLnNldFBpeGVscyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCB3LCBoLCBkQXJyYXksCisgICAgICAgICAgICAgICAgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIGFuZCB0aGUgc3BlY2lmaWVkCi0gICAgICogcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgd2l0aCBhbiBpbnQgYXJyYXkgb2Ygc2FtcGxlcy4KKyAgICAgKiBTZXRzIHRoZSBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgYW5kIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIKKyAgICAgKiBhcmVhIG9mIHBpeGVscyB3aXRoIGFuIGludGVnZXIgYXJyYXkgb2Ygc2FtcGxlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBiIHRoZSBzcGVjaWZpZWQgYmFuZC4KLSAgICAgKiBAcGFyYW0gaUFycmF5IHRoZSBpbnQgYXJyYXkgb2Ygc2FtcGxlcy4KLQorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGJhbmQuCisgICAgICogQHBhcmFtIGlBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgYXJyYXkgb2Ygc2FtcGxlcy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwgaW50IGlBcnJheVtdKSB7Ci0gICAgICAgIHNhbXBsZU1vZGVsLnNldFNhbXBsZXMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwKLSAgICAgICAgICAgICAgICB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCB3LCBoLCBiLCBpQXJyYXksIGRhdGFCdWZmZXIpOworICAgICAgICBzYW1wbGVNb2RlbC5zZXRTYW1wbGVzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsIGgsIGIsCisgICAgICAgICAgICAgICAgaUFycmF5LCBkYXRhQnVmZmVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgYW5kIHRoZSBzcGVjaWZpZWQKLSAgICAgKiByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscyB3aXRoIGEgZmxvYXQgYXJyYXkgb2Ygc2FtcGxlcy4KKyAgICAgKiBTZXRzIHRoZSBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgYW5kIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIKKyAgICAgKiBhcmVhIG9mIHBpeGVscyB3aXRoIGEgZmxvYXQgYXJyYXkgb2Ygc2FtcGxlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBiIHRoZSBzcGVjaWZpZWQgYmFuZC4KLSAgICAgKiBAcGFyYW0gZkFycmF5IHRoZSBmbG9hdCBhcnJheSBvZiBzYW1wbGVzLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGJhbmQuCisgICAgICogQHBhcmFtIGZBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGZsb2F0IGZBcnJheVtdKSB7Ci0gICAgICAgIHNhbXBsZU1vZGVsLnNldFNhbXBsZXMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwKLSAgICAgICAgICAgICAgICB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCB3LCBoLCBiLCBmQXJyYXksIGRhdGFCdWZmZXIpOworICAgICAgICBzYW1wbGVNb2RlbC5zZXRTYW1wbGVzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsIGgsIGIsCisgICAgICAgICAgICAgICAgZkFycmF5LCBkYXRhQnVmZmVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgYW5kIHRoZSBzcGVjaWZpZWQKLSAgICAgKiByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscyB3aXRoIGEgZG91YmxlIGFycmF5IG9mIHNhbXBsZXMuCisgICAgICogU2V0cyB0aGUgc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIGFuZCB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyCisgICAgICogYXJlYSBvZiBwaXhlbHMgd2l0aCBhIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGIgdGhlIHNwZWNpZmllZCBiYW5kLgotICAgICAqIEBwYXJhbSBkQXJyYXkgdGhlIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGJhbmQuCisgICAgICogQHBhcmFtIGRBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLCBkb3VibGUgZEFycmF5W10pIHsKLSAgICAgICAgc2FtcGxlTW9kZWwuc2V0U2FtcGxlcyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLAotICAgICAgICAgICAgICAgIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsIGgsIGIsIGRBcnJheSwgZGF0YUJ1ZmZlcik7CisgICAgICAgIHNhbXBsZU1vZGVsLnNldFNhbXBsZXMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywgaCwgYiwKKyAgICAgICAgICAgICAgICBkQXJyYXksIGRhdGFCdWZmZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNhbXBsZSBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIGFuZCB0aGUgc3BlY2lmaWVkCi0gICAgICogcGl4ZWwgd2l0aCBhbiBpbnQgc2FtcGxlLgorICAgICAqIFNldHMgdGhlIHNhbXBsZSBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIGFuZCB0aGUgc3BlY2lmaWVkIHBpeGVsIHdpdGggYW4KKyAgICAgKiBpbnRlZ2VyIHNhbXBsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KLSAgICAgKiBAcGFyYW0gYiB0aGUgc3BlY2lmaWVkIGJhbmQuCi0gICAgICogQHBhcmFtIHMgdGhlIHNhbXBsZSB0byBiZSBzZXQuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBiYW5kLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgc2FtcGxlIHRvIGJlIHNldC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTYW1wbGUoaW50IHgsIGludCB5LCBpbnQgYiwgaW50IHMpIHsKLSAgICAgICAgc2FtcGxlTW9kZWwuc2V0U2FtcGxlKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsCi0gICAgICAgICAgICAgICAgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgYiwgcywgZGF0YUJ1ZmZlcik7CisgICAgICAgIHNhbXBsZU1vZGVsLnNldFNhbXBsZSh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBiLCBzLAorICAgICAgICAgICAgICAgIGRhdGFCdWZmZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNhbXBsZSBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIGFuZCB0aGUgc3BlY2lmaWVkCi0gICAgICogcGl4ZWwgd2l0aCBhIGZsb2F0IHNhbXBsZS4KKyAgICAgKiBTZXRzIHRoZSBzYW1wbGUgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCBhbmQgdGhlIHNwZWNpZmllZCBwaXhlbCB3aXRoIGEKKyAgICAgKiBmbG9hdCBzYW1wbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogQHBhcmFtIGIgdGhlIHNwZWNpZmllZCBiYW5kLgotICAgICAqIEBwYXJhbSBzIHRoZSBzYW1wbGUgdG8gYmUgc2V0LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgYmFuZC4KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIHNhbXBsZSB0byBiZSBzZXQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2FtcGxlKGludCB4LCBpbnQgeSwgaW50IGIsIGZsb2F0IHMpIHsKLSAgICAgICAgc2FtcGxlTW9kZWwuc2V0U2FtcGxlKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsCi0gICAgICAgICAgICAgICAgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgYiwgcywgZGF0YUJ1ZmZlcik7CisgICAgICAgIHNhbXBsZU1vZGVsLnNldFNhbXBsZSh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBiLCBzLAorICAgICAgICAgICAgICAgIGRhdGFCdWZmZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNhbXBsZSBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIGFuZCB0aGUgc3BlY2lmaWVkCi0gICAgICogcGl4ZWwgd2l0aCBhIGludCBzYW1wbGUuCisgICAgICogU2V0cyB0aGUgc2FtcGxlIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgYW5kIHRoZSBzcGVjaWZpZWQgcGl4ZWwgd2l0aCBhbgorICAgICAqIGludGVnZXIgc2FtcGxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgotICAgICAqIEBwYXJhbSBiIHRoZSBzcGVjaWZpZWQgYmFuZC4KLSAgICAgKiBAcGFyYW0gcyB0aGUgc2FtcGxlIHRvIGJlIHNldC4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGJhbmQuCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzYW1wbGUgdG8gYmUgc2V0LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNhbXBsZShpbnQgeCwgaW50IHksIGludCBiLCBkb3VibGUgcykgewotICAgICAgICBzYW1wbGVNb2RlbC5zZXRTYW1wbGUoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwKLSAgICAgICAgICAgICAgICB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBiLCBzLCBkYXRhQnVmZmVyKTsKKyAgICAgICAgc2FtcGxlTW9kZWwuc2V0U2FtcGxlKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIGIsIHMsCisgICAgICAgICAgICAgICAgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9Xcml0YWJsZVJlbmRlcmVkSW1hZ2UuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9Xcml0YWJsZVJlbmRlcmVkSW1hZ2UuamF2YQppbmRleCBlZTFjYjllLi4wNTIzNTNiIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvV3JpdGFibGVSZW5kZXJlZEltYWdlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL1dyaXRhYmxlUmVuZGVyZWRJbWFnZS5qYXZhCkBAIC0xOCwyMyArMTgsMjcgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgamF2YS5hd3QuUG9pbnQ7CiAKIC8qKgotICogVGhlIFdyaXRlYWJsZVJlbmRlcmVkSW1hZ2UgaW50ZXJmYWNlIGlzIGludGVyZmFjZSBmb3Igb2JqZWN0cyB3aGljaAotICogY29udGFpbnMgUmFzdGVyIGRhdGEgb2Ygb25lIG9yIHNldmVyYWwgdGlsZXMuIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzCi0gKiBub3RpZmljYXRpb24gbWVoYW5pc20gZm9yIG9idGFpbmluZyB0aWxlJ3Mgd3JpdGluZyBzdGF0dXMuICAgIAorICogVGhlIFdyaXRlYWJsZVJlbmRlcmVkSW1hZ2UgaW50ZXJmYWNlIGlzIGludGVyZmFjZSBmb3Igb2JqZWN0cyB3aGljaCBjb250YWlucworICogUmFzdGVyIGRhdGEgb2Ygb25lIG9yIHNldmVyYWwgdGlsZXMuIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIG5vdGlmaWNhdGlvbgorICogbWVjaGFuaXNtIGZvciBvYnRhaW5pbmcgdGlsZSdzIHdyaXRpbmcgc3RhdHVzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBXcml0YWJsZVJlbmRlcmVkSW1hZ2UgZXh0ZW5kcyBSZW5kZXJlZEltYWdlIHsKIAogICAgIC8qKgotICAgICAqIEdldHMgYW5kIGNoZWNrcyBvdXQgdGhlIHdyaXRhYmxlIHRpbGUgZm9yIHdyaXRpbmcuIAorICAgICAqIEdldHMgYW5kIGNoZWNrcyBvdXQgdGhlIHdyaXRhYmxlIHRpbGUgZm9yIHdyaXRpbmcuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRpbGVYIHRoZSBYIGluZGV4IG9mIHRoZSB0aWxlLiAKLSAgICAgKiBAcGFyYW0gdGlsZVkgdGhlIFkgaW5kZXggb2YgdGhlIHRpbGUuCi0gICAgICogCisgICAgICogQHBhcmFtIHRpbGVYCisgICAgICogICAgICAgICAgICB0aGUgWCBpbmRleCBvZiB0aGUgdGlsZS4KKyAgICAgKiBAcGFyYW0gdGlsZVkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGluZGV4IG9mIHRoZSB0aWxlLgogICAgICAqIEByZXR1cm4gdGhlIFdyaXRhYmxlUmFzdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBnZXRXcml0YWJsZVRpbGUoaW50IHRpbGVYLCBpbnQgdGlsZVkpOwpAQCAtNDIsNjAgKzQ2LDY0IEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgcmVnaXN0ZXJlZCBUaWxlT2JzZXJ2ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRvIHRoZSBUaWxlT2JzZXJ2ZXIgd2hpY2ggaXMgcmVnaXN0ZXJlZCBmb3IgdGhpcwotICAgICAqIFdyaXRhYmxlUmVuZGVyZWRJbWFnZS4KKyAgICAgKiBAcGFyYW0gdG8KKyAgICAgKiAgICAgICAgICAgIHRoZSBUaWxlT2JzZXJ2ZXIgd2hpY2ggaXMgcmVnaXN0ZXJlZCBmb3IgdGhpcworICAgICAqICAgICAgICAgICAgV3JpdGFibGVSZW5kZXJlZEltYWdlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRpbGVPYnNlcnZlcihUaWxlT2JzZXJ2ZXIgdG8pOwogCiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIFRpbGVPYnNlcnZlciB0byB0aGlzIFdyaXRhYmxlUmVuZGVyZWRJbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdG8gdGhlIFRpbGVPYnNlcnZlciBvYmplY3QgdG8gYmUgYWRkZWQuCisgICAgICogQHBhcmFtIHRvCisgICAgICogICAgICAgICAgICB0aGUgVGlsZU9ic2VydmVyIG9iamVjdCB0byBiZSBhZGRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRUaWxlT2JzZXJ2ZXIoVGlsZU9ic2VydmVyIHRvKTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhpcyBpbWFnZSB0byB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBSYXN0ZXIuICAKKyAgICAgKiBTZXRzIHRoaXMgaW1hZ2UgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgUmFzdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSByIHRoZSBzcGVjaWZpZWQgUmFzdGVyLgorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREYXRhKFJhc3RlciByKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGFycmF5IG9mIHBvaW50cyB3aWNoIHJlcHJlc2VudCBpbmRpY2VzIG9mIHRpbGVzIHdoaWNoCi0gICAgICogYXJlIGNoZWNrIG91dCBmb3Igd3JpdGluZy4KKyAgICAgKiBHZXRzIHRoZSBhcnJheSBvZiBwb2ludHMgd2hpY2ggcmVwcmVzZW50IGluZGljZXMgb2YgdGlsZXMgd2hpY2ggYXJlIGNoZWNrCisgICAgICogb3V0IGZvciB3cml0aW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIFBvaW50cy4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBwb2ludHMuCiAgICAgICovCiAgICAgcHVibGljIFBvaW50W10gZ2V0V3JpdGFibGVUaWxlSW5kaWNlcygpOwogCiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgdGlsZSBpcyB3cml0YWJsZSBvciBub3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRpbGVYIHRoZSBYIGluZGV4IG9mIHRpbGUuIAotICAgICAqIEBwYXJhbSB0aWxlWSB0aGUgWSBpbmRleCBvZiB0aWxlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCB0aWxlIGlzIHdyaXRhYmxlLAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gdGlsZVgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGluZGV4IG9mIHRpbGUuCisgICAgICogQHBhcmFtIHRpbGVZCisgICAgICogICAgICAgICAgICB0aGUgWSBpbmRleCBvZiB0aWxlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCB0aWxlIGlzIHdyaXRhYmxlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNUaWxlV3JpdGFibGUoaW50IHRpbGVYLCBpbnQgdGlsZVkpOwogCiAgICAgLyoqCi0gICAgICogUmVsZWFzZSB0aGUgc3BlY2lmaWVkIHdyaXRhYmxlIHRpbGUuIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIHdyaXRlciAKLSAgICAgKiBmcm9tIHRoZSB0aWxlLgorICAgICAqIFJlbGVhc2UgdGhlIHNwZWNpZmllZCB3cml0YWJsZSB0aWxlLiBUaGlzIG1ldGhvZCByZW1vdmVzIHRoZSB3cml0ZXIgZnJvbQorICAgICAqIHRoZSB0aWxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0aWxlWCB0aGUgWCBpbmRleCBvZiB0aGUgdGlsZS4gCi0gICAgICogQHBhcmFtIHRpbGVZIHRoZSBZIGluZGV4IG9mIHRoZSB0aWxlLgorICAgICAqIEBwYXJhbSB0aWxlWAorICAgICAqICAgICAgICAgICAgdGhlIFggaW5kZXggb2YgdGhlIHRpbGUuCisgICAgICogQHBhcmFtIHRpbGVZCisgICAgICogICAgICAgICAgICB0aGUgWSBpbmRleCBvZiB0aGUgdGlsZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWxlYXNlV3JpdGFibGVUaWxlKGludCB0aWxlWCwgaW50IHRpbGVZKTsKIAogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiB0aGVyZSBpcyBhIHRpbGUgd2hpY2ggaXMgY2hlY2tlZCBvdXQgZm9yIHdyaXRpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBhbnkgdGlsZSBpcyBjaGVja2VkIG91dCBmb3Igd3JpdGluZywgZmFsc2UgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBzdWNoIHRpbGUuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBhbnkgdGlsZSBpcyBjaGVja2VkIG91dCBmb3Igd3JpdGluZywgZmFsc2UgaWYgdGhlcmUgaXMKKyAgICAgKiAgICAgICAgIG5vIHN1Y2ggdGlsZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNUaWxlV3JpdGVycygpOwogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9wYWNrYWdlLmh0bWwgYi9hd3QvamF2YS9hd3QvaW1hZ2UvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDZlZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxib2R5PgorICAgIDxwPgorICAgICAgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgdGhhdCBhbGxvdyB0byBtb2RpZnkgZXhpc3RpbmcgaW1hZ2VzIG9yIHRvIGNyZWF0ZSBhIG5ldyBpbWFnZSByYXRoZXIgdGhhbiBsb2FkaW5nIGl0IGZyb20gYSBmaWxlLgorICAgIDwvcD4KKyAgIEBzaW5jZSBBbmRyb2lkIDEuMAorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9Db250ZXh0dWFsUmVuZGVyZWRJbWFnZUZhY3RvcnkuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL0NvbnRleHR1YWxSZW5kZXJlZEltYWdlRmFjdG9yeS5qYXZhCmluZGV4IDNlOTY2MzcuLjE4ODFhMGMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL0NvbnRleHR1YWxSZW5kZXJlZEltYWdlRmFjdG9yeS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL0NvbnRleHR1YWxSZW5kZXJlZEltYWdlRmFjdG9yeS5qYXZhCkBAIC0xOCw3MiArMTgsODAgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlLnJlbmRlcmFibGU7CiAKIGltcG9ydCBqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEOwogaW1wb3J0IGphdmEuYXd0LmltYWdlLlJlbmRlcmVkSW1hZ2U7CiAKIC8qKgotICogQSBmYWN0b3J5IGZvciBjcmVhdGluZyBDb250ZXh0dWFsUmVuZGVyZWRJbWFnZSBvYmplY3RzIHdpdGggdXRpbGl0aWVzIAotICogZm9yIG1hbmlwdWxhdGluZyB0aGUgcHJvcGVydGllcyBpbiB0aGUgcGFyYW1ldGVyIGJsb2NrLgorICogQSBmYWN0b3J5IGZvciBjcmVhdGluZyBDb250ZXh0dWFsUmVuZGVyZWRJbWFnZSBvYmplY3RzIHdpdGggdXRpbGl0aWVzIGZvcgorICogbWFuaXB1bGF0aW5nIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBwYXJhbWV0ZXIgYmxvY2suCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIENvbnRleHR1YWxSZW5kZXJlZEltYWdlRmFjdG9yeSBleHRlbmRzIFJlbmRlcmVkSW1hZ2VGYWN0b3J5IHsKIAogICAgIC8qKgogICAgICAqIE1hcHMgYSByZW5kZXIgY29udGV4dCB0byBhIHBhcmFtZXRlciBibG9jayBhbmQgYSByZW5kZXJhYmxlIGltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhMCB0aGUgaW5kZXgKLSAgICAgKiBAcGFyYW0gYTEgdGhlIFJlbmRlckNvbnRleHQKLSAgICAgKiBAcGFyYW0gYTIgdGhlIFBhcmFtZXRlckJsb2NrCi0gICAgICogQHBhcmFtIGEzIHRoZSBSZW5kZXJhYmxlSW1hZ2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZW5kZXIgY29udGV4dAorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LgorICAgICAqIEBwYXJhbSBhMQorICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlckNvbnRleHQuCisgICAgICogQHBhcmFtIGEyCisgICAgICogICAgICAgICAgICB0aGUgUGFyYW1ldGVyQmxvY2suCisgICAgICogQHBhcmFtIGEzCisgICAgICogICAgICAgICAgICB0aGUgUmVuZGVyYWJsZUltYWdlLgorICAgICAqIEByZXR1cm4gdGhlIHJlbmRlciBjb250ZXh0LgogICAgICAqLwotICAgIHB1YmxpYyBSZW5kZXJDb250ZXh0IG1hcFJlbmRlckNvbnRleHQoaW50IGEwLCBSZW5kZXJDb250ZXh0IGExLCBQYXJhbWV0ZXJCbG9jayBhMiwgUmVuZGVyYWJsZUltYWdlIGEzKTsKKyAgICBwdWJsaWMgUmVuZGVyQ29udGV4dCBtYXBSZW5kZXJDb250ZXh0KGludCBhMCwgUmVuZGVyQ29udGV4dCBhMSwgUGFyYW1ldGVyQmxvY2sgYTIsCisgICAgICAgICAgICBSZW5kZXJhYmxlSW1hZ2UgYTMpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGZyb20gdGhlIHBhcmFtZXRlciBibG9jay4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIHBhcmFtZXRlciBibG9jayB0byBleGFtaW5lIHRvIGZpbmQgdGhlIHByb3BlcnR5Ci0gICAgICogQHBhcmFtIGExIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBibG9jayB0byBleGFtaW5lIHRvIGZpbmQgdGhlIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSBhMQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFBhcmFtZXRlckJsb2NrIGEwLCBTdHJpbmcgYTEpOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgcmVuZGVyZWQgaW1hZ2UgZGV0ZXJtaW5lZCBieSB0aGUgcmVuZGVyIGNvbnRleHQgYW5kCi0gICAgICogcGFyYW1ldGVyIGJsb2NrLgorICAgICAqIENyZWF0ZXMgdGhlIHJlbmRlcmVkIGltYWdlIGRldGVybWluZWQgYnkgdGhlIHJlbmRlciBjb250ZXh0IGFuZCBwYXJhbWV0ZXIKKyAgICAgKiBibG9jay4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIFJlbmRlckNvbnRleHQKLSAgICAgKiBAcGFyYW0gYTEgdGhlIFBhcmFtZXRlckJsb2NrCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVuZGVyZWQgaW1hZ2UKKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBSZW5kZXJDb250ZXh0LgorICAgICAqIEBwYXJhbSBhMQorICAgICAqICAgICAgICAgICAgdGhlIFBhcmFtZXRlckJsb2NrLgorICAgICAqIEByZXR1cm4gdGhlIHJlbmRlcmVkIGltYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBSZW5kZXJlZEltYWdlIGNyZWF0ZShSZW5kZXJDb250ZXh0IGEwLCBQYXJhbWV0ZXJCbG9jayBhMSk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBib3VuZGluZyByZWN0YW5nbGUgZnJvbSB0aGUgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhMCB0aGUgcGFyYW1ldGVyIGJsb2NrIHRvIHJlYWQgdGhlIGJvdW5kcyBmcm9tCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGEwCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGJsb2NrIHRvIHJlYWQgdGhlIGJvdW5kcyBmcm9tLgorICAgICAqIEByZXR1cm4gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzMkQoUGFyYW1ldGVyQmxvY2sgYTApOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbmFtZXMgb2YgYWxsIG9mIHRoZSBzdXBwb3J0ZWQgcHJvcGVydGllcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBuYW1lcworICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IG5hbWVzLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQcm9wZXJ0eU5hbWVzKCk7CiAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhpcyBpbWFnZSBmYWN0b3J5IGlzIGR5bmFtaWMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIGltYWdlIGZhY3RvcnkgaXMgZHluYW1pYworICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBpbWFnZSBmYWN0b3J5IGlzIGR5bmFtaWMuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNEeW5hbWljKCk7CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL3JlbmRlcmFibGUvUGFyYW1ldGVyQmxvY2suamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL1BhcmFtZXRlckJsb2NrLmphdmEKaW5kZXggMTU1NWY0NS4uN2RkZTczYSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL3JlbmRlcmFibGUvUGFyYW1ldGVyQmxvY2suamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9QYXJhbWV0ZXJCbG9jay5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZS5yZW5kZXJhYmxlOwogCiBpbXBvcnQgamF2YS5hd3QuaW1hZ2UuUmVuZGVyZWRJbWFnZTsKQEAgLTI1LDI4ICsyNiwzNiBAQAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIC8qKgotICogVGhlIENsYXNzIFBhcmFtZXRlckJsb2NrIGdyb3VwcyBhbiBpbmRleGVkIHNldCBvZiBwYXJhbWV0ZXIgZGF0YSAKLSAqIHdpdGggYSBzZXQgb2YgcmVuZGVyYWJsZSAoc291cmNlKSBpbWFnZXMuICBUaGUgbWFwcGluZyBiZXR3ZWVuCi0gKiB0aGUgaW5kZXhlZCBwYXJhbWV0ZXJzIGFuZCB0aGVpciBwcm9wZXJ0eSBuYW1lcyBpcyBwcm92aWRlZCAKLSAqIGJ5IGEge0BsaW5rIENvbnRleHR1YWxSZW5kZXJlZEltYWdlRmFjdG9yeX0KKyAqIFRoZSBjbGFzcyBQYXJhbWV0ZXJCbG9jayBncm91cHMgYW4gaW5kZXhlZCBzZXQgb2YgcGFyYW1ldGVyIGRhdGEgd2l0aCBhIHNldAorICogb2YgcmVuZGVyYWJsZSAoc291cmNlKSBpbWFnZXMuIFRoZSBtYXBwaW5nIGJldHdlZW4gdGhlIGluZGV4ZWQgcGFyYW1ldGVycyBhbmQKKyAqIHRoZWlyIHByb3BlcnR5IG5hbWVzIGlzIHByb3ZpZGVkIGJ5IGEge0BsaW5rIENvbnRleHR1YWxSZW5kZXJlZEltYWdlRmFjdG9yeX0uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUGFyYW1ldGVyQmxvY2sgaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZSB7CiAKLQotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzU3NzExNTU1MTc4NTI0MDc1MEw7CiAKLSAgICAvKiogVGhlIHNvdXJjZXMgKHJlbmRlcmFibGUgaW1hZ2VzKS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlcyAocmVuZGVyYWJsZSBpbWFnZXMpLgorICAgICAqLwogICAgIHByb3RlY3RlZCBWZWN0b3I8T2JqZWN0PiBzb3VyY2VzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CiAKLSAgICAvKiogVGhlIHBhcmFtZXRlcnMuICovCisgICAgLyoqCisgICAgICogVGhlIHBhcmFtZXRlcnMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFZlY3RvcjxPYmplY3Q+IHBhcmFtZXRlcnMgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZXMgdGhlIHZlY3RvciBvZiBzb3VyY2UgaW1hZ2VzCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgdGhlIHZlY3RvciBvZiBwYXJhbWV0ZXJzCisgICAgICogQHBhcmFtIHNvdXJjZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZWN0b3Igb2Ygc291cmNlIGltYWdlcy4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgdGhlIHZlY3RvciBvZiBwYXJhbWV0ZXJzLgogICAgICAqLwogICAgIHB1YmxpYyBQYXJhbWV0ZXJCbG9jayhWZWN0b3I8T2JqZWN0PiBzb3VyY2VzLCBWZWN0b3I8T2JqZWN0PiBwYXJhbWV0ZXJzKSB7CiAgICAgICAgIHNldFNvdXJjZXMoc291cmNlcyk7CkBAIC01Niw3ICs2NSw4IEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHBhcmFtZXRlciBibG9jayB3aXRoIG5vIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZXMgdGhlIHZlY3RvciBvZiBzb3VyY2UgaW1hZ2VzCisgICAgICogQHBhcmFtIHNvdXJjZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZWN0b3Igb2Ygc291cmNlIGltYWdlcy4KICAgICAgKi8KICAgICBwdWJsaWMgUGFyYW1ldGVyQmxvY2soVmVjdG9yPE9iamVjdD4gc291cmNlcykgewogICAgICAgICBzZXRTb3VyY2VzKHNvdXJjZXMpOwpAQCAtNjUsMTggKzc1LDIwIEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHBhcmFtZXRlciBibG9jayB3aXRoIG5vIGltYWdlIG9yIHBhcmFtZXRlciB2ZWN0b3JzLgogICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXJCbG9jaygpIHt9CisgICAgcHVibGljIFBhcmFtZXRlckJsb2NrKCkgeworICAgIH0KIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHNvdXJjZSBpbWFnZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBpbWFnZQotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggd2hlcmUgdGhlIHNvdXJjZSB3aWxsIGJlIHBsYWNlZAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2sKKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGltYWdlLgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHdoZXJlIHRoZSBzb3VyY2Ugd2lsbCBiZSBwbGFjZWQuCisgICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jay4KICAgICAgKi8KICAgICBwdWJsaWMgUGFyYW1ldGVyQmxvY2sgc2V0U291cmNlKE9iamVjdCBzb3VyY2UsIGludCBpbmRleCkgewotICAgICAgICBpZihzb3VyY2VzLnNpemUoKSA8IGluZGV4ICsgMSl7CisgICAgICAgIGlmIChzb3VyY2VzLnNpemUoKSA8IGluZGV4ICsgMSkgewogICAgICAgICAgICAgc291cmNlcy5zZXRTaXplKGluZGV4ICsgMSk7CiAgICAgICAgIH0KICAgICAgICAgc291cmNlcy5zZXRFbGVtZW50QXQoc291cmNlLCBpbmRleCk7CkBAIC04NiwxNCArOTgsMTUgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBwYXJhbWV0ZXIgdmFsdWUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIG9iaiB0aGUgcGFyYW1ldGVyIHZhbHVlIHRvIHBsYWNlIGF0IHRoZSBkZXNpcmVkIGluZGV4Ci0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCB3aGVyZSB0aGUgb2JqZWN0IGlzIHRvIGJlIHBsYWNlZCBpbiB0aGUgCi0gICAgICogdmVjdG9yIG9mIHBhcmFtZXRlcnMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciB2YWx1ZSB0byBwbGFjZSBhdCB0aGUgZGVzaXJlZCBpbmRleC4KKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCB3aGVyZSB0aGUgb2JqZWN0IGlzIHRvIGJlIHBsYWNlZCBpbiB0aGUgdmVjdG9yIG9mCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXJzLgorICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICovCiAgICAgcHVibGljIFBhcmFtZXRlckJsb2NrIHNldChPYmplY3Qgb2JqLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYocGFyYW1ldGVycy5zaXplKCkgPCBpbmRleCArIDEpeworICAgICAgICBpZiAocGFyYW1ldGVycy5zaXplKCkgPCBpbmRleCArIDEpIHsKICAgICAgICAgICAgIHBhcmFtZXRlcnMuc2V0U2l6ZShpbmRleCArIDEpOwogICAgICAgICB9CiAgICAgICAgIHBhcmFtZXRlcnMuc2V0RWxlbWVudEF0KG9iaiwgaW5kZXgpOwpAQCAtMTAzLDkgKzExNiw5IEBACiAgICAgLyoqCiAgICAgICogQWRkcyBhIHNvdXJjZSB0byB0aGUgdmVjdG9yIG9mIHNvdXJjZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHRvIGFkZAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2sKKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIHRvIGFkZC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqLwogICAgIHB1YmxpYyBQYXJhbWV0ZXJCbG9jayBhZGRTb3VyY2UoT2JqZWN0IHNvdXJjZSkgewogICAgICAgICBzb3VyY2VzLmFkZEVsZW1lbnQoc291cmNlKTsKQEAgLTExNSw5ICsxMjgsOSBAQAogICAgIC8qKgogICAgICAqIEFkZHMgdGhlIG9iamVjdCB0byB0aGUgdmVjdG9yIG9mIHBhcmFtZXRlciB2YWx1ZXMKICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmogdG8gYWRkCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jaworICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmogdG8gYWRkLgorICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICovCiAgICAgcHVibGljIFBhcmFtZXRlckJsb2NrIGFkZChPYmplY3Qgb2JqKSB7CiAgICAgICAgIHBhcmFtZXRlcnMuYWRkRWxlbWVudChvYmopOwpAQCAtMTI1LDIwICsxMzgsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2ZWN0b3Igb2Ygc291cmNlcywgcmVwbGFjaW5nIHRoZSBleGlzdGluZwotICAgICAqIHZlY3RvciBvZiBzb3VyY2VzLCBpZiBhbnkuCisgICAgICogU2V0cyB0aGUgdmVjdG9yIG9mIHNvdXJjZXMsIHJlcGxhY2luZyB0aGUgZXhpc3RpbmcgdmVjdG9yIG9mIHNvdXJjZXMsIGlmCisgICAgICogYW55LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2VzIHRoZSBuZXcgc291cmNlcworICAgICAqIEBwYXJhbSBzb3VyY2VzCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHNvdXJjZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U291cmNlcyhWZWN0b3I8T2JqZWN0PiBzb3VyY2VzKSB7CiAgICAgICAgIHRoaXMuc291cmNlcyA9IHNvdXJjZXM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmVjdG9yIG9mIHBhcmFtZXRlcnMsIHJlcGxhY2luZyB0aGUgZXhpc3RpbmcKLSAgICAgKiB2ZWN0b3Igb2YgcGFyYW1ldGVycywgaWYgYW55LgorICAgICAqIFNldHMgdGhlIHZlY3RvciBvZiBwYXJhbWV0ZXJzLCByZXBsYWNpbmcgdGhlIGV4aXN0aW5nIHZlY3RvciBvZgorICAgICAqIHBhcmFtZXRlcnMsIGlmIGFueS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyB0aGUgbmV3IHBhcmFtZXRlcnMKKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgdGhlIG5ldyBwYXJhbWV0ZXJzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoVmVjdG9yPE9iamVjdD4gcGFyYW1ldGVycykgewogICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOwpAQCAtMTQ3LDcgKzE2Miw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgdmVjdG9yIG9mIHNvdXJjZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc291cmNlcworICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZXMuCiAgICAgICovCiAgICAgcHVibGljIFZlY3RvcjxPYmplY3Q+IGdldFNvdXJjZXMoKSB7CiAgICAgICAgIHJldHVybiBzb3VyY2VzOwpAQCAtMTU2LDcgKzE3MSw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgdmVjdG9yIG9mIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVycworICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcnMuCiAgICAgICovCiAgICAgcHVibGljIFZlY3RvcjxPYmplY3Q+IGdldFBhcmFtZXRlcnMoKSB7CiAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOwpAQCAtMTY1LDkgKzE4MCw5IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc291cmNlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZSBvYmplY3QgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleAorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LgorICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZSBvYmplY3QgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldFNvdXJjZShpbnQgaW5kZXgpIHsKICAgICAgICAgcmV0dXJuIHNvdXJjZXMuZWxlbWVudEF0KGluZGV4KTsKQEAgLTE3Niw5ICsxOTEsOSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG9iamVjdCBwYXJhbWV0ZXIgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVyIG9iamVjdCBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4CisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXguCisgICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVyIG9iamVjdCBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0UGFyYW1ldGVyKGludCBpbmRleCkgewogICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5lbGVtZW50QXQoaW5kZXgpOwpAQCAtMTg3LDMyOCArMjAyLDMzMyBAQAogICAgIC8qKgogICAgICAqIFNoYWxsb3cgY2xvbmUgKGNsb25lcyB1c2luZyB0aGUgc3VwZXJjbGFzcyBjbG9uZSBtZXRob2QpLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNsb25lIG9mIHRoaXMgb2JqZWN0CisgICAgICogQHJldHVybiB0aGUgY2xvbmUgb2YgdGhpcyBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBzaGFsbG93Q2xvbmUoKSB7Ci0gICAgICAgIHRyeXsKKyAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiBzdXBlci5jbG9uZSgpOwotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIFBhcmFtZXRlckJsb2NrIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGlkZW50aWNhbCBjb3B5IG9mIHRoaXMgaW5zdGFuY2UuCisgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKICAgICAgICAgUGFyYW1ldGVyQmxvY2sgcmVwbGljYTsKLSAgICAgICAgdHJ5eworICAgICAgICB0cnkgewogICAgICAgICAgICAgcmVwbGljYSA9IChQYXJhbWV0ZXJCbG9jaylzdXBlci5jbG9uZSgpOwotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgaWYoc291cmNlcyAhPSBudWxsKXsKKyAgICAgICAgaWYgKHNvdXJjZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgcmVwbGljYS5zZXRTb3VyY2VzKChWZWN0b3I8T2JqZWN0Pikoc291cmNlcy5jbG9uZSgpKSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYocGFyYW1ldGVycyAhPSBudWxsKXsKKyAgICAgICAgaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICAgICAgICAgcmVwbGljYS5zZXRQYXJhbWV0ZXJzKChWZWN0b3I8T2JqZWN0PikocGFyYW1ldGVycy5jbG9uZSgpKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlcGxpY2E7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiBjbGFzc2VzIGNvcnJlc3BvbmRpbmcgdG8gYWxsIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiB2YWx1ZXMgZm91bmQgaW4gdGhlIGFycmF5IG9mIHBhcmFtZXRlcnMsIGluIG9yZGVyLgorICAgICAqIEdldHMgYW4gYXJyYXkgb2YgY2xhc3NlcyBjb3JyZXNwb25kaW5nIHRvIGFsbCBvZiB0aGUgcGFyYW1ldGVyIHZhbHVlcworICAgICAqIGZvdW5kIGluIHRoZSBhcnJheSBvZiBwYXJhbWV0ZXJzLCBpbiBvcmRlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgY2xhc3NlcworICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlciBjbGFzc2VzLgogICAgICAqLwogICAgIHB1YmxpYyBDbGFzc1tdIGdldFBhcmFtQ2xhc3NlcygpIHsKICAgICAgICAgaW50IGNvdW50ID0gcGFyYW1ldGVycy5zaXplKCk7CiAgICAgICAgIENsYXNzIHBhcmFtQ2xhc3Nlc1tdID0gbmV3IENsYXNzW2NvdW50XTsKIAotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKyl7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgcGFyYW1DbGFzc2VzW2ldID0gcGFyYW1ldGVycy5lbGVtZW50QXQoaSkuZ2V0Q2xhc3MoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcGFyYW1DbGFzc2VzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJlbmRlcmFibGUgc291cmNlIGltYWdlIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKLSAgICAgKiBpbiB0aGUgc291cmNlIGFycmF5LgorICAgICAqIEdldHMgdGhlIHJlbmRlcmFibGUgc291cmNlIGltYWdlIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggaW4gdGhlCisgICAgICogc291cmNlIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXgKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZW5kZXJhYmxlIHNvdXJjZSBpbWFnZQorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LgorICAgICAqIEByZXR1cm4gdGhlIHJlbmRlcmFibGUgc291cmNlIGltYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBSZW5kZXJhYmxlSW1hZ2UgZ2V0UmVuZGVyYWJsZVNvdXJjZShpbnQgaW5kZXgpIHsKICAgICAgICAgcmV0dXJuIChSZW5kZXJhYmxlSW1hZ2Upc291cmNlcy5lbGVtZW50QXQoaW5kZXgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyYXBzIHRoZSBzaG9ydCB2YWx1ZSBpbiBhIFNob3J0IGFuZCBwbGFjZXMgaXQgaW4gdGhlIAotICAgICAqIHBhcmFtZXRlciBibG9jayBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAqIFdyYXBzIHRoZSBzaG9ydCB2YWx1ZSBpbiBhIFNob3J0IGFuZCBwbGFjZXMgaXQgaW4gdGhlIHBhcmFtZXRlciBibG9jayBhdAorICAgICAqIHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIHNob3J0IHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jaworICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgc2hvcnQgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqLwogICAgIHB1YmxpYyBQYXJhbWV0ZXJCbG9jayBzZXQoc2hvcnQgcywgaW50IGluZGV4KSB7CiAgICAgICAgIHJldHVybiBzZXQobmV3IFNob3J0KHMpLCBpbmRleCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JhcHMgdGhlIHNob3J0IHZhbHVlIGluIGEgU2hvcnQgYW5kIGFkZHMgaXQgdG8gdGhlIAotICAgICAqIHBhcmFtZXRlciBibG9jay4KKyAgICAgKiBXcmFwcyB0aGUgc2hvcnQgdmFsdWUgaW4gYSBTaG9ydCBhbmQgYWRkcyBpdCB0byB0aGUgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSBzaG9ydCB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jaworICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgc2hvcnQgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqLwogICAgIHB1YmxpYyBQYXJhbWV0ZXJCbG9jayBhZGQoc2hvcnQgcykgewogICAgICAgICByZXR1cm4gYWRkKG5ldyBTaG9ydChzKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JhcHMgdGhlIGxvbmcgdmFsdWUgaW4gYSBMb25nIGFuZCBwbGFjZXMgaXQgaW4gdGhlIAotICAgICAqIHBhcmFtZXRlciBibG9jayBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAqIFdyYXBzIHRoZSBsb25nIHZhbHVlIGluIGEgTG9uZyBhbmQgcGxhY2VzIGl0IGluIHRoZSBwYXJhbWV0ZXIgYmxvY2sgYXQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSBsb25nIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jaworICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgbG9uZyB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LgorICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICovCiAgICAgcHVibGljIFBhcmFtZXRlckJsb2NrIHNldChsb25nIGwsIGludCBpbmRleCkgewogICAgICAgICByZXR1cm4gc2V0KG5ldyBMb25nKGwpLCBpbmRleCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JhcHMgdGhlIGxvbmcgdmFsdWUgaW4gYSBMb25nIGFuZCBhZGRzIGl0IHRvIHRoZSAKLSAgICAgKiBwYXJhbWV0ZXIgYmxvY2suCisgICAgICogV3JhcHMgdGhlIGxvbmcgdmFsdWUgaW4gYSBMb25nIGFuZCBhZGRzIGl0IHRvIHRoZSBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIGxvbmcgdmFsdWUgb2YgdGhlIHBhcmFtZXRlcgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2sKKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqLwogICAgIHB1YmxpYyBQYXJhbWV0ZXJCbG9jayBhZGQobG9uZyBsKSB7CiAgICAgICAgIHJldHVybiBhZGQobmV3IExvbmcobCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyYXBzIHRoZSBpbnQgdmFsdWUgaW4gYW4gSW50ZWdlciBhbmQgcGxhY2VzIGl0IGluIHRoZSAKLSAgICAgKiBwYXJhbWV0ZXIgYmxvY2sgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKiBXcmFwcyB0aGUgaW50ZWdlciB2YWx1ZSBpbiBhbiBJbnRlZ2VyIGFuZCBwbGFjZXMgaXQgaW4gdGhlIHBhcmFtZXRlcgorICAgICAqIGJsb2NrIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGkgdGhlIGludCB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2sKKyAgICAgKiBAcGFyYW0gaQorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqLwogICAgIHB1YmxpYyBQYXJhbWV0ZXJCbG9jayBzZXQoaW50IGksIGludCBpbmRleCkgewogICAgICAgICByZXR1cm4gc2V0KG5ldyBJbnRlZ2VyKGkpLCBpbmRleCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JhcHMgdGhlIGludCB2YWx1ZSBpbiBhbiBJbnRlZ2VyIGFuZCBhZGRzIGl0IHRvIHRoZSAKLSAgICAgKiBwYXJhbWV0ZXIgYmxvY2suCisgICAgICogV3JhcHMgdGhlIGludGVnZXIgdmFsdWUgaW4gYW4gSW50ZWdlciBhbmQgYWRkcyBpdCB0byB0aGUgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpIHRoZSBpbnQgdmFsdWUgb2YgdGhlIHBhcmFtZXRlcgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2sKKyAgICAgKiBAcGFyYW0gaQorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqLwogICAgIHB1YmxpYyBQYXJhbWV0ZXJCbG9jayBhZGQoaW50IGkpIHsKICAgICAgICAgcmV0dXJuIGFkZChuZXcgSW50ZWdlcihpKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JhcHMgdGhlIGZsb2F0IHZhbHVlIGluIGEgRmxvYXQgYW5kIHBsYWNlcyBpdCBpbiB0aGUgCi0gICAgICogcGFyYW1ldGVyIGJsb2NrIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAgICogV3JhcHMgdGhlIGZsb2F0IHZhbHVlIGluIGEgRmxvYXQgYW5kIHBsYWNlcyBpdCBpbiB0aGUgcGFyYW1ldGVyIGJsb2NrIGF0CisgICAgICogdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZiB0aGUgZmxvYXQgdmFsdWUgb2YgdGhlIHBhcmFtZXRlcgotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXgKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrCisgICAgICogQHBhcmFtIGYKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LgorICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICovCiAgICAgcHVibGljIFBhcmFtZXRlckJsb2NrIHNldChmbG9hdCBmLCBpbnQgaW5kZXgpIHsKICAgICAgICAgcmV0dXJuIHNldChuZXcgRmxvYXQoZiksIGluZGV4KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcmFwcyB0aGUgZmxvYXQgdmFsdWUgaW4gYSBGbG9hdCBhbmQgYWRkcyBpdCB0byB0aGUgCi0gICAgICogcGFyYW1ldGVyIGJsb2NrLgorICAgICAqIFdyYXBzIHRoZSBmbG9hdCB2YWx1ZSBpbiBhIEZsb2F0IGFuZCBhZGRzIGl0IHRvIHRoZSBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICogCi0gICAgICogQHBhcmFtIGYgdGhlIGZsb2F0IHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrCisgICAgICogQHBhcmFtIGYKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLgorICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICovCiAgICAgcHVibGljIFBhcmFtZXRlckJsb2NrIGFkZChmbG9hdCBmKSB7CiAgICAgICAgIHJldHVybiBhZGQobmV3IEZsb2F0KGYpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcmFwcyB0aGUgZG91YmxlIHZhbHVlIGluIGEgRG91YmxlIGFuZCBwbGFjZXMgaXQgaW4gdGhlIAotICAgICAqIHBhcmFtZXRlciBibG9jayBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAqIFdyYXBzIHRoZSBkb3VibGUgdmFsdWUgaW4gYSBEb3VibGUgYW5kIHBsYWNlcyBpdCBpbiB0aGUgcGFyYW1ldGVyIGJsb2NrCisgICAgICogYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZCB0aGUgZG91YmxlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jaworICAgICAqIEBwYXJhbSBkCisgICAgICogICAgICAgICAgICB0aGUgZG91YmxlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXguCisgICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jay4KICAgICAgKi8KICAgICBwdWJsaWMgUGFyYW1ldGVyQmxvY2sgc2V0KGRvdWJsZSBkLCBpbnQgaW5kZXgpIHsKICAgICAgICAgcmV0dXJuIHNldChuZXcgRG91YmxlKGQpLCBpbmRleCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JhcHMgdGhlIGRvdWJsZSB2YWx1ZSBpbiBhIERvdWJsZSBhbmQgYWRkcyBpdCB0byB0aGUgCi0gICAgICogcGFyYW1ldGVyIGJsb2NrLgorICAgICAqIFdyYXBzIHRoZSBkb3VibGUgdmFsdWUgaW4gYSBEb3VibGUgYW5kIGFkZHMgaXQgdG8gdGhlIHBhcmFtZXRlciBibG9jay4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZCB0aGUgZG91YmxlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrCisgICAgICogQHBhcmFtIGQKKyAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqLwogICAgIHB1YmxpYyBQYXJhbWV0ZXJCbG9jayBhZGQoZG91YmxlIGQpIHsKICAgICAgICAgcmV0dXJuIGFkZChuZXcgRG91YmxlKGQpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcmFwcyB0aGUgY2hhciB2YWx1ZSBpbiBhIENoYXJhY3RlciBhbmQgcGxhY2VzIGl0IGluIHRoZSAKLSAgICAgKiBwYXJhbWV0ZXIgYmxvY2sgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKiBXcmFwcyB0aGUgY2hhciB2YWx1ZSBpbiBhIENoYXJhY3RlciBhbmQgcGxhY2VzIGl0IGluIHRoZSBwYXJhbWV0ZXIgYmxvY2sKKyAgICAgKiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjIHRoZSBjaGFyIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jaworICAgICAqIEBwYXJhbSBjCisgICAgICogICAgICAgICAgICB0aGUgY2hhciB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LgorICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICovCiAgICAgcHVibGljIFBhcmFtZXRlckJsb2NrIHNldChjaGFyIGMsIGludCBpbmRleCkgewogICAgICAgICByZXR1cm4gc2V0KG5ldyBDaGFyYWN0ZXIoYyksIGluZGV4KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcmFwcyB0aGUgY2hhciB2YWx1ZSBpbiBhIENoYXJhY3RlciBhbmQgYWRkcyBpdCB0byB0aGUgCi0gICAgICogcGFyYW1ldGVyIGJsb2NrLgorICAgICAqIFdyYXBzIHRoZSBjaGFyIHZhbHVlIGluIGEgQ2hhcmFjdGVyIGFuZCBhZGRzIGl0IHRvIHRoZSBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICogCi0gICAgICogQHBhcmFtIGMgdGhlIGNoYXIgdmFsdWUgb2YgdGhlIHBhcmFtZXRlcgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2sKKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIGNoYXIgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqLwogICAgIHB1YmxpYyBQYXJhbWV0ZXJCbG9jayBhZGQoY2hhciBjKSB7CiAgICAgICAgIHJldHVybiBhZGQobmV3IENoYXJhY3RlcihjKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JhcHMgdGhlIGJ5dGUgdmFsdWUgaW4gYSBCeXRlIGFuZCBwbGFjZXMgaXQgaW4gdGhlIAotICAgICAqIHBhcmFtZXRlciBibG9jayBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAqIFdyYXBzIHRoZSBieXRlIHZhbHVlIGluIGEgQnl0ZSBhbmQgcGxhY2VzIGl0IGluIHRoZSBwYXJhbWV0ZXIgYmxvY2sgYXQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBiIHRoZSBieXRlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jaworICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LgorICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICovCiAgICAgcHVibGljIFBhcmFtZXRlckJsb2NrIHNldChieXRlIGIsIGludCBpbmRleCkgewogICAgICAgICByZXR1cm4gc2V0KG5ldyBCeXRlKGIpLCBpbmRleCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JhcHMgdGhlIGJ5dGUgdmFsdWUgaW4gYSBCeXRlIGFuZCBhZGRzIGl0IHRvIHRoZSAKLSAgICAgKiBwYXJhbWV0ZXIgYmxvY2suCisgICAgICogV3JhcHMgdGhlIGJ5dGUgdmFsdWUgaW4gYSBCeXRlIGFuZCBhZGRzIGl0IHRvIHRoZSBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICogCi0gICAgICogQHBhcmFtIGIgdGhlIGJ5dGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlcgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlciBibG9jaworICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLgorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlciBibG9jay4KICAgICAgKi8KICAgICBwdWJsaWMgUGFyYW1ldGVyQmxvY2sgYWRkKGJ5dGUgYikgewogICAgICAgICByZXR1cm4gYWRkKG5ldyBCeXRlKGIpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBSZW5kZXJlZEltYWdlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGUgCi0gICAgICogdmVjdG9yIG9mIHNvdXJjZSBpbWFnZXMuCisgICAgICogR2V0cyB0aGUgUmVuZGVyZWRJbWFnZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhlIHZlY3RvciBvZiBzb3VyY2UKKyAgICAgKiBpbWFnZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlbmRlcmVkIGltYWdlCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXguCisgICAgICogQHJldHVybiB0aGUgcmVuZGVyZWQgaW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIFJlbmRlcmVkSW1hZ2UgZ2V0UmVuZGVyZWRTb3VyY2UoaW50IGluZGV4KSB7CiAgICAgICAgIHJldHVybiAoUmVuZGVyZWRJbWFnZSlzb3VyY2VzLmVsZW1lbnRBdChpbmRleCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2hvcnQtdmFsdWVkIHBhcmFtZXRlciBmb3VuZCBhdCB0aGUgZGVzaXJlZCBpbmRleAotICAgICAqIGluIHRoZSB2ZWN0b3Igb2YgcGFyYW1ldGVyIHZhbHVlcy4KKyAgICAgKiBHZXRzIHRoZSBzaG9ydC12YWx1ZWQgcGFyYW1ldGVyIGZvdW5kIGF0IHRoZSBkZXNpcmVkIGluZGV4IGluIHRoZSB2ZWN0b3IKKyAgICAgKiBvZiBwYXJhbWV0ZXIgdmFsdWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXgKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaG9ydCBwYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzaG9ydCBwYXJhbWV0ZXIuCiAgICAgICovCiAgICAgcHVibGljIHNob3J0IGdldFNob3J0UGFyYW1ldGVyKGludCBpbmRleCkgewogICAgICAgICByZXR1cm4gKChTaG9ydClwYXJhbWV0ZXJzLmVsZW1lbnRBdChpbmRleCkpLnNob3J0VmFsdWUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb25nLXZhbHVlZCBwYXJhbWV0ZXIgZm91bmQgYXQgdGhlIGRlc2lyZWQgaW5kZXgKLSAgICAgKiBpbiB0aGUgdmVjdG9yIG9mIHBhcmFtZXRlciB2YWx1ZXMuCisgICAgICogR2V0cyB0aGUgbG9uZy12YWx1ZWQgcGFyYW1ldGVyIGZvdW5kIGF0IHRoZSBkZXNpcmVkIGluZGV4IGluIHRoZSB2ZWN0b3IKKyAgICAgKiBvZiBwYXJhbWV0ZXIgdmFsdWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXgKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsb25nIHBhcmFtZXRlcgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LgorICAgICAqIEByZXR1cm4gdGhlIGxvbmcgcGFyYW1ldGVyLgogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldExvbmdQYXJhbWV0ZXIoaW50IGluZGV4KSB7CiAgICAgICAgIHJldHVybiAoKExvbmcpcGFyYW1ldGVycy5lbGVtZW50QXQoaW5kZXgpKS5sb25nVmFsdWUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBpbnQtdmFsdWVkIHBhcmFtZXRlciBmb3VuZCBhdCB0aGUgZGVzaXJlZCBpbmRleAotICAgICAqIGluIHRoZSB2ZWN0b3Igb2YgcGFyYW1ldGVyIHZhbHVlcy4KKyAgICAgKiBHZXRzIHRoZSBpbnRlZ2VyLXZhbHVlZCBwYXJhbWV0ZXIgZm91bmQgYXQgdGhlIGRlc2lyZWQgaW5kZXggaW4gdGhlCisgICAgICogdmVjdG9yIG9mIHBhcmFtZXRlciB2YWx1ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludCBwYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIHBhcmFtZXRlci4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEludFBhcmFtZXRlcihpbnQgaW5kZXgpIHsKICAgICAgICAgcmV0dXJuICgoSW50ZWdlcilwYXJhbWV0ZXJzLmVsZW1lbnRBdChpbmRleCkpLmludFZhbHVlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZmxvYXQtdmFsdWVkIHBhcmFtZXRlciBmb3VuZCBhdCB0aGUgZGVzaXJlZCBpbmRleAotICAgICAqIGluIHRoZSB2ZWN0b3Igb2YgcGFyYW1ldGVyIHZhbHVlcy4KKyAgICAgKiBHZXRzIHRoZSBmbG9hdC12YWx1ZWQgcGFyYW1ldGVyIGZvdW5kIGF0IHRoZSBkZXNpcmVkIGluZGV4IGluIHRoZSB2ZWN0b3IKKyAgICAgKiBvZiBwYXJhbWV0ZXIgdmFsdWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXgKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdCBwYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdCBwYXJhbWV0ZXIuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldEZsb2F0UGFyYW1ldGVyKGludCBpbmRleCkgewogICAgICAgICByZXR1cm4gKChGbG9hdClwYXJhbWV0ZXJzLmVsZW1lbnRBdChpbmRleCkpLmZsb2F0VmFsdWUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkb3VibGUtdmFsdWVkIHBhcmFtZXRlciBmb3VuZCBhdCB0aGUgZGVzaXJlZCBpbmRleAotICAgICAqIGluIHRoZSB2ZWN0b3Igb2YgcGFyYW1ldGVyIHZhbHVlcy4KKyAgICAgKiBHZXRzIHRoZSBkb3VibGUtdmFsdWVkIHBhcmFtZXRlciBmb3VuZCBhdCB0aGUgZGVzaXJlZCBpbmRleCBpbiB0aGUgdmVjdG9yCisgICAgICogb2YgcGFyYW1ldGVyIHZhbHVlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZG91YmxlIHBhcmFtZXRlcgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LgorICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZSBwYXJhbWV0ZXIuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZSBnZXREb3VibGVQYXJhbWV0ZXIoaW50IGluZGV4KSB7CiAgICAgICAgIHJldHVybiAoKERvdWJsZSlwYXJhbWV0ZXJzLmVsZW1lbnRBdChpbmRleCkpLmRvdWJsZVZhbHVlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgY2hhci12YWx1ZWQgcGFyYW1ldGVyIGZvdW5kIGF0IHRoZSBkZXNpcmVkIGluZGV4Ci0gICAgICogaW4gdGhlIHZlY3RvciBvZiBwYXJhbWV0ZXIgdmFsdWVzLgorICAgICAqIEdldHMgdGhlIGNoYXItdmFsdWVkIHBhcmFtZXRlciBmb3VuZCBhdCB0aGUgZGVzaXJlZCBpbmRleCBpbiB0aGUgdmVjdG9yCisgICAgICogb2YgcGFyYW1ldGVyIHZhbHVlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hhciBwYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoZSBjaGFyIHBhcmFtZXRlci4KICAgICAgKi8KICAgICBwdWJsaWMgY2hhciBnZXRDaGFyUGFyYW1ldGVyKGludCBpbmRleCkgewogICAgICAgICByZXR1cm4gKChDaGFyYWN0ZXIpcGFyYW1ldGVycy5lbGVtZW50QXQoaW5kZXgpKS5jaGFyVmFsdWUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBieXRlLXZhbHVlZCBwYXJhbWV0ZXIgZm91bmQgYXQgdGhlIGRlc2lyZWQgaW5kZXgKLSAgICAgKiBpbiB0aGUgdmVjdG9yIG9mIHBhcmFtZXRlciB2YWx1ZXMuCisgICAgICogR2V0cyB0aGUgYnl0ZS12YWx1ZWQgcGFyYW1ldGVyIGZvdW5kIGF0IHRoZSBkZXNpcmVkIGluZGV4IGluIHRoZSB2ZWN0b3IKKyAgICAgKiBvZiBwYXJhbWV0ZXIgdmFsdWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXgKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBieXRlIHBhcmFtZXRlcgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LgorICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgcGFyYW1ldGVyLgogICAgICAqLwogICAgIHB1YmxpYyBieXRlIGdldEJ5dGVQYXJhbWV0ZXIoaW50IGluZGV4KSB7CiAgICAgICAgIHJldHVybiAoKEJ5dGUpcGFyYW1ldGVycy5lbGVtZW50QXQoaW5kZXgpKS5ieXRlVmFsdWUoKTsKQEAgLTUzMSw3ICs1NTEsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdmVjdG9yIG9mIHNvdXJjZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3Igb2Ygc291cmNlcworICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdmVjdG9yIG9mIHNvdXJjZXMuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXROdW1Tb3VyY2VzKCkgewogICAgICAgICByZXR1cm4gc291cmNlcy5zaXplKCk7CkBAIC01NDAsNyArNTYwLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHZlY3RvciBvZiBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdmVjdG9yIG9mIHBhcmFtZXRlcnMKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHZlY3RvciBvZiBwYXJhbWV0ZXJzLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TnVtUGFyYW1ldGVycygpIHsKICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMuc2l6ZSgpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL3JlbmRlcmFibGUvUmVuZGVyQ29udGV4dC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL3JlbmRlcmFibGUvUmVuZGVyQ29udGV4dC5qYXZhCmluZGV4IDNhM2I5M2MuLjBkYjUxMmYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL1JlbmRlckNvbnRleHQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9SZW5kZXJDb250ZXh0LmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlLnJlbmRlcmFibGU7CiAKIGltcG9ydCBqYXZhLmF3dC5SZW5kZXJpbmdIaW50czsKQEAgLTI1LDI3ICsyNiwzNyBAQAogaW1wb3J0IGphdmEuYXd0Lmdlb20uQWZmaW5lVHJhbnNmb3JtOwogCiAvKioKLSAqIFRoZSBDbGFzcyBSZW5kZXJDb250ZXh0IHN0b3JlcyBkYXRhIG9uIGhvdyBhbiBpbWFnZSBpcyB0byBiZSAKLSAqIHJlbmRlcmVkOiB0aGUgYWZmaW5lIHRyYW5zZm9ybSwgdGhlIGFyZWEgb2YgaW50ZXJlc3QsIGFuZCAKLSAqIHRoZSByZW5kZXJpbmcgaGludHMuCisgKiBUaGUgQ2xhc3MgUmVuZGVyQ29udGV4dCBzdG9yZXMgZGF0YSBvbiBob3cgYW4gaW1hZ2UgaXMgdG8gYmUgcmVuZGVyZWQ6IHRoZQorICogYWZmaW5lIHRyYW5zZm9ybSwgdGhlIGFyZWEgb2YgaW50ZXJlc3QsIGFuZCB0aGUgcmVuZGVyaW5nIGhpbnRzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFJlbmRlckNvbnRleHQgaW1wbGVtZW50cyBDbG9uZWFibGUgewogCi0gICAgLyoqIFRoZSBhZmZpbmUgdHJhbnNmb3JtLiAqLworICAgIC8qKgorICAgICAqIFRoZSBhZmZpbmUgdHJhbnNmb3JtLgorICAgICAqLwogICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm07Ci0gICAgCi0gICAgLyoqIFRoZSBhcmVhIG9mIGludGVyZXN0LiAqLworCisgICAgLyoqCisgICAgICogVGhlIGFyZWEgb2YgaW50ZXJlc3QuCisgICAgICovCiAgICAgU2hhcGUgYW9pOwotICAgIAotICAgIC8qKiBUaGUgcmVuZGVyaW5nIGhpbnRzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHJlbmRlcmluZyBoaW50cy4KKyAgICAgKi8KICAgICBSZW5kZXJpbmdIaW50cyBoaW50czsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyByZW5kZXIgY29udGV4dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXNyMmRldiB0aGUgYWZmaW5lIHRyYW5zZm9ybQotICAgICAqIEBwYXJhbSBhb2kgdGhlIGFyZWEgb2YgaW50ZXJlc3QKLSAgICAgKiBAcGFyYW0gaGludHMgdGhlIHJlbmRlcmluZyBoaW50cworICAgICAqIEBwYXJhbSB1c3IyZGV2CisgICAgICogICAgICAgICAgICB0aGUgYWZmaW5lIHRyYW5zZm9ybS4KKyAgICAgKiBAcGFyYW0gYW9pCisgICAgICogICAgICAgICAgICB0aGUgYXJlYSBvZiBpbnRlcmVzdC4KKyAgICAgKiBAcGFyYW0gaGludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSByZW5kZXJpbmcgaGludHMuCiAgICAgICovCiAgICAgcHVibGljIFJlbmRlckNvbnRleHQoQWZmaW5lVHJhbnNmb3JtIHVzcjJkZXYsIFNoYXBlIGFvaSwgUmVuZGVyaW5nSGludHMgaGludHMpIHsKICAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSAoQWZmaW5lVHJhbnNmb3JtKXVzcjJkZXYuY2xvbmUoKTsKQEAgLTU2LDggKzY3LDEwIEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHJlbmRlciBjb250ZXh0IHdpdGggbm8gc3BlY2lmaWVkIGhpbnRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB1c3IyZGV2IHRoZSBhZmZpbmUgdHJhbnNmb3JtCi0gICAgICogQHBhcmFtIGFvaSB0aGUgYXJlYSBvZiBpbnRlcmVzdAorICAgICAqIEBwYXJhbSB1c3IyZGV2CisgICAgICogICAgICAgICAgICB0aGUgYWZmaW5lIHRyYW5zZm9ybS4KKyAgICAgKiBAcGFyYW0gYW9pCisgICAgICogICAgICAgICAgICB0aGUgYXJlYSBvZiBpbnRlcmVzdC4KICAgICAgKi8KICAgICBwdWJsaWMgUmVuZGVyQ29udGV4dChBZmZpbmVUcmFuc2Zvcm0gdXNyMmRldiwgU2hhcGUgYW9pKSB7CiAgICAgICAgIHRoaXModXNyMmRldiwgYW9pLCBudWxsKTsKQEAgLTY2LDE4ICs3OSwyMSBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyByZW5kZXIgY29udGV4dCB3aXRoIG5vIHNwZWNpZmllZCBhcmVhIG9mIGludGVyZXN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB1c3IyZGV2IHRoZSBhZmZpbmUgdHJhbnNmb3JtCi0gICAgICogQHBhcmFtIGhpbnRzIHRoZSByZW5kZXJpbmcgaGludHMKKyAgICAgKiBAcGFyYW0gdXNyMmRldgorICAgICAqICAgICAgICAgICAgdGhlIGFmZmluZSB0cmFuc2Zvcm0uCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgcmVuZGVyaW5nIGhpbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBSZW5kZXJDb250ZXh0KEFmZmluZVRyYW5zZm9ybSB1c3IyZGV2LCBSZW5kZXJpbmdIaW50cyBoaW50cykgewogICAgICAgICB0aGlzKHVzcjJkZXYsIG51bGwsIGhpbnRzKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcmVuZGVyIGNvbnRleHQgd2l0aCBubyByZW5kZXJpbmcgaGludHMgb3IgCi0gICAgICogYXJlYSBvZiBpbnRlcmVzdC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcmVuZGVyIGNvbnRleHQgd2l0aCBubyByZW5kZXJpbmcgaGludHMgb3IgYXJlYSBvZgorICAgICAqIGludGVyZXN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB1c3IyZGV2IHRoZSBhZmZpbmUgdHJhbnNmb3JtCisgICAgICogQHBhcmFtIHVzcjJkZXYKKyAgICAgKiAgICAgICAgICAgIHRoZSBhZmZpbmUgdHJhbnNmb3JtLgogICAgICAqLwogICAgIHB1YmxpYyBSZW5kZXJDb250ZXh0KEFmZmluZVRyYW5zZm9ybSB1c3IyZGV2KSB7CiAgICAgICAgIHRoaXModXNyMmRldiwgbnVsbCwgbnVsbCk7CkBAIC05MSwzNiArMTA3LDM2IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgYWZmaW5lIHRyYW5zZm9ybSBmb3IgdGhpcyByZW5kZXIgY29udGV4dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3VHJhbnNmb3JtIHRoZSBuZXcgYWZmaW5lIHRyYW5zZm9ybQorICAgICAqIEBwYXJhbSBuZXdUcmFuc2Zvcm0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgYWZmaW5lIHRyYW5zZm9ybS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2Zvcm0oQWZmaW5lVHJhbnNmb3JtIG5ld1RyYW5zZm9ybSkgewogICAgICAgICB0cmFuc2Zvcm0gPSAoQWZmaW5lVHJhbnNmb3JtKW5ld1RyYW5zZm9ybS5jbG9uZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbmNhdGVuYXRlcyB0aGUgY3VycmVudCB0cmFuc2Zvcm0gd2l0aCB0aGUgc3BlY2lmaWVkIHRyYW5zZm9ybQotICAgICAqIChzbyB0aGV5IGFyZSBhcHBsaWVkIHdpdGggdGhlIHNwZWNpZmllZCB0cmFuc2Zvcm0gYWN0aW5nIGZpcnN0KQotICAgICAqIGFuZCBzZXRzIHRoZSByZXN1bHRpbmcgdHJhbnNmb3JtIGFzIHRoZSBhZmZpbmUgdHJhbnNmb3JtIG9mIAotICAgICAqIHRoaXMgcmVuZGVyaW5nIGNvbnRleHQuCisgICAgICogQ29uY2F0ZW5hdGVzIHRoZSBjdXJyZW50IHRyYW5zZm9ybSB3aXRoIHRoZSBzcGVjaWZpZWQgdHJhbnNmb3JtIChzbyB0aGV5CisgICAgICogYXJlIGFwcGxpZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHRyYW5zZm9ybSBhY3RpbmcgZmlyc3QpIGFuZCBzZXRzIHRoZQorICAgICAqIHJlc3VsdGluZyB0cmFuc2Zvcm0gYXMgdGhlIGFmZmluZSB0cmFuc2Zvcm0gb2YgdGhpcyByZW5kZXJpbmcgY29udGV4dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbW9kVHJhbnNmb3JtIHRoZSBuZXcgdHJhbnNmb3JtIHdoaWNoIG1vZGlmaWVzIHRoZSAKLSAgICAgKiBjdXJyZW50IHRyYW5zZm9ybQotICAgICAqIAotICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgUmVuZGVyQ29udGV4dCNwcmVDb25jYXRlbmF0ZVRyYW5zZm9ybShBZmZpbmVUcmFuc2Zvcm0pfQorICAgICAqIEBwYXJhbSBtb2RUcmFuc2Zvcm0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdHJhbnNmb3JtIHdoaWNoIG1vZGlmaWVzIHRoZSBjdXJyZW50IHRyYW5zZm9ybS4KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgUmVuZGVyQ29udGV4dCNwcmVDb25jYXRlbmF0ZVRyYW5zZm9ybShBZmZpbmVUcmFuc2Zvcm0pfQorICAgICAqICAgICAgICAgICAgIC4KICAgICAgKi8KLSAgICBARGVwcmVjYXRlZCAgICAKKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHByZUNvbmNldGVuYXRlVHJhbnNmb3JtKEFmZmluZVRyYW5zZm9ybSBtb2RUcmFuc2Zvcm0pIHsKICAgICAgICAgcHJlQ29uY2F0ZW5hdGVUcmFuc2Zvcm0obW9kVHJhbnNmb3JtKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25jYXRlbmF0ZXMgdGhlIGN1cnJlbnQgdHJhbnNmb3JtIHdpdGggdGhlIHNwZWNpZmllZCB0cmFuc2Zvcm0KLSAgICAgKiAoc28gdGhleSBhcmUgYXBwbGllZCB3aXRoIHRoZSBzcGVjaWZpZWQgdHJhbnNmb3JtIGFjdGluZyBmaXJzdCkKLSAgICAgKiBhbmQgc2V0cyB0aGUgcmVzdWx0aW5nIHRyYW5zZm9ybSBhcyB0aGUgYWZmaW5lIHRyYW5zZm9ybSBvZiAKLSAgICAgKiB0aGlzIHJlbmRlcmluZyBjb250ZXh0LgorICAgICAqIENvbmNhdGVuYXRlcyB0aGUgY3VycmVudCB0cmFuc2Zvcm0gd2l0aCB0aGUgc3BlY2lmaWVkIHRyYW5zZm9ybSAoc28gdGhleQorICAgICAqIGFyZSBhcHBsaWVkIHdpdGggdGhlIHNwZWNpZmllZCB0cmFuc2Zvcm0gYWN0aW5nIGZpcnN0KSBhbmQgc2V0cyB0aGUKKyAgICAgKiByZXN1bHRpbmcgdHJhbnNmb3JtIGFzIHRoZSBhZmZpbmUgdHJhbnNmb3JtIG9mIHRoaXMgcmVuZGVyaW5nIGNvbnRleHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIG1vZFRyYW5zZm9ybSB0aGUgbmV3IHRyYW5zZm9ybSB3aGljaCBtb2RpZmllcyB0aGUgCi0gICAgICogY3VycmVudCB0cmFuc2Zvcm0KKyAgICAgKiBAcGFyYW0gbW9kVHJhbnNmb3JtCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHRyYW5zZm9ybSB3aGljaCBtb2RpZmllcyB0aGUgY3VycmVudCB0cmFuc2Zvcm0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHJlQ29uY2F0ZW5hdGVUcmFuc2Zvcm0oQWZmaW5lVHJhbnNmb3JtIG1vZFRyYW5zZm9ybSkgewogICAgICAgICB0cmFuc2Zvcm0ucHJlQ29uY2F0ZW5hdGUobW9kVHJhbnNmb3JtKTsKQEAgLTEyOSwxMCArMTQ1LDEwIEBACiAgICAgLyoqCiAgICAgICogQ29uY2F0ZW5hdGUgdGhlIHNwZWNpZmllZCB0cmFuc2Zvcm0gd2l0aCB0aGUgY3VycmVudCB0cmFuc2Zvcm0uCiAgICAgICogCi0gICAgICogQHBhcmFtIG1vZFRyYW5zZm9ybSB0aGUgbmV3IHRyYW5zZm9ybSB3aGljaCBtb2RpZmllcyB0aGUgCi0gICAgICogY3VycmVudCB0cmFuc2Zvcm0KLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIFJlbmRlckNvbnRleHQjY29uY2F0ZW5hdGVUcmFuc2Zvcm0oQWZmaW5lVHJhbnNmb3JtKX0KKyAgICAgKiBAcGFyYW0gbW9kVHJhbnNmb3JtCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHRyYW5zZm9ybSB3aGljaCBtb2RpZmllcyB0aGUgY3VycmVudCB0cmFuc2Zvcm0uCisgICAgICogQGRlcHJlY2F0ZWQgdXNlCisgICAgICogICAgICAgICAgICAge0BsaW5rIFJlbmRlckNvbnRleHQjY29uY2F0ZW5hdGVUcmFuc2Zvcm0oQWZmaW5lVHJhbnNmb3JtKX0uCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBjb25jZXRlbmF0ZVRyYW5zZm9ybShBZmZpbmVUcmFuc2Zvcm0gbW9kVHJhbnNmb3JtKSB7CkBAIC0xNDIsOCArMTU4LDggQEAKICAgICAvKioKICAgICAgKiBDb25jYXRlbmF0ZSB0aGUgc3BlY2lmaWVkIHRyYW5zZm9ybSB3aXRoIHRoZSBjdXJyZW50IHRyYW5zZm9ybS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbW9kVHJhbnNmb3JtIHRoZSBuZXcgdHJhbnNmb3JtIHdoaWNoIG1vZGlmaWVzIHRoZSAKLSAgICAgKiBjdXJyZW50IHRyYW5zZm9ybQorICAgICAqIEBwYXJhbSBtb2RUcmFuc2Zvcm0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdHJhbnNmb3JtIHdoaWNoIG1vZGlmaWVzIHRoZSBjdXJyZW50IHRyYW5zZm9ybS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb25jYXRlbmF0ZVRyYW5zZm9ybShBZmZpbmVUcmFuc2Zvcm0gbW9kVHJhbnNmb3JtKSB7CiAgICAgICAgIHRyYW5zZm9ybS5jb25jYXRlbmF0ZShtb2RUcmFuc2Zvcm0pOwpAQCAtMTUyLDcgKzE2OCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgdHJhbnNmb3JtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybQorICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybS4KICAgICAgKi8KICAgICBwdWJsaWMgQWZmaW5lVHJhbnNmb3JtIGdldFRyYW5zZm9ybSgpIHsKICAgICAgICAgcmV0dXJuIChBZmZpbmVUcmFuc2Zvcm0pdHJhbnNmb3JtLmNsb25lKCk7CkBAIC0xNjEsNyArMTc3LDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBhcmVhIG9mIGludGVyZXN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBuZXdBb2kgdGhlIG5ldyBhcmVhIG9mIGludGVyZXN0CisgICAgICogQHBhcmFtIG5ld0FvaQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBhcmVhIG9mIGludGVyZXN0LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEFyZWFPZkludGVyZXN0KFNoYXBlIG5ld0FvaSkgewogICAgICAgICBhb2kgPSBuZXdBb2k7CkBAIC0xNzAsNyArMTg3LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBhcmVhIG9mIGludGVyZXN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFyZWEgb2YgaW50ZXJlc3QKKyAgICAgKiBAcmV0dXJuIHRoZSBhcmVhIG9mIGludGVyZXN0LgogICAgICAqLwogICAgIHB1YmxpYyBTaGFwZSBnZXRBcmVhT2ZJbnRlcmVzdCgpIHsKICAgICAgICAgcmV0dXJuIGFvaTsKQEAgLTE3OSw3ICsxOTYsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHJlbmRlcmluZyBoaW50cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGludHMgdGhlIG5ldyByZW5kZXJpbmcgaGludHMKKyAgICAgKiBAcGFyYW0gaGludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgcmVuZGVyaW5nIGhpbnRzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFJlbmRlcmluZ0hpbnRzKFJlbmRlcmluZ0hpbnRzIGhpbnRzKSB7CiAgICAgICAgIHRoaXMuaGludHMgPSBoaW50czsKQEAgLTE4OCw3ICsyMDYsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHJlbmRlcmluZyBoaW50cy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZW5kZXJpbmcgaGludHMKKyAgICAgKiBAcmV0dXJuIHRoZSByZW5kZXJpbmcgaGludHMuCiAgICAgICovCiAgICAgcHVibGljIFJlbmRlcmluZ0hpbnRzIGdldFJlbmRlcmluZ0hpbnRzKCkgewogICAgICAgICByZXR1cm4gaGludHM7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9SZW5kZXJhYmxlSW1hZ2UuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL1JlbmRlcmFibGVJbWFnZS5qYXZhCmluZGV4IDg4NWRjMDYuLjIxMzMyZjcgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL1JlbmRlcmFibGVJbWFnZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL1JlbmRlcmFibGVJbWFnZS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZS5yZW5kZXJhYmxlOwogCiBpbXBvcnQgamF2YS5hd3QuUmVuZGVyaW5nSGludHM7CkBAIC0yNSwxMDggKzI2LDExMyBAQAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIC8qKgotICogVGhlIEludGVyZmFjZSBSZW5kZXJhYmxlSW1hZ2UgaXMgaW1wbGVtZW50ZWQgYnkgYW4gb2JqZWN0IHRoYXQKLSAqIGNvbGxlY3RzIGFsbCBvZiB0aGUgaW1hZ2Utc3BlY2lmaWMgZGF0YSB0aGF0IGRlZmluZXMgYSBzaW5nbGUgaW1hZ2UgCi0gKiB0aGF0IGNvdWxkIGJlIHJlbmRlcmVkIHRvIGRpZmZlcmVudCByZW5kZXJpbmcgdGFyZ2V0cy4KKyAqIFRoZSBJbnRlcmZhY2UgUmVuZGVyYWJsZUltYWdlIGlzIGltcGxlbWVudGVkIGJ5IGFuIG9iamVjdCB0aGF0IGNvbGxlY3RzIGFsbAorICogb2YgdGhlIGltYWdlLXNwZWNpZmljIGRhdGEgdGhhdCBkZWZpbmVzIGEgc2luZ2xlIGltYWdlIHRoYXQgY291bGQgYmUgcmVuZGVyZWQKKyAqIHRvIGRpZmZlcmVudCByZW5kZXJpbmcgdGFyZ2V0cy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyYWJsZUltYWdlIHsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgSElOVFNfT0JTRVJWRUQgaW5kaWNhdGVzIHRoYXQgdGhlIHJlbmRlcmluZwotICAgICAqIGhpbnRzIGFyZSBhcHBsaWVkIHJhdGhlciB0aGFuIGlnbm9yZWQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEhJTlRTX09CU0VSVkVEIGluZGljYXRlcyB0aGF0IHRoZSByZW5kZXJpbmcgaGludHMgYXJlCisgICAgICogYXBwbGllZCByYXRoZXIgdGhhbiBpZ25vcmVkLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhJTlRTX09CU0VSVkVEID0gIkhJTlRTX09CU0VSVkVEIjsgLy8kTk9OLU5MUy0xJAogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgcHJvcGVydHkgZnJvbSB0aGUgUmVuZGVyYWJsZUltYWdlJ3MgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5CisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgcmVuZGVyZWQgaW1hZ2UgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCAKLSAgICAgKiBpbiB0aGUgcGFyYW1ldGVycyBhbmQgdGhlIHJlbmRlciBjb250ZXh0LgorICAgICAqIENyZWF0ZXMgdGhlIHJlbmRlcmVkIGltYWdlIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlCisgICAgICogcGFyYW1ldGVycyBhbmQgdGhlIHJlbmRlciBjb250ZXh0LgogICAgICAqIAotICAgICAqIEBwYXJhbSByZW5kZXJDb250ZXh0IHRoZSByZW5kZXIgY29udGV4dCBnaXZpbmcgcmVuZGVyaW5nIHNwZWNpZmljYXRpb25zCi0gICAgICogc3VjaCBhcyB0cmFuc2Zvcm1hdGlvbnMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZW5kZXJlZCBpbWFnZQorICAgICAqIEBwYXJhbSByZW5kZXJDb250ZXh0CisgICAgICogICAgICAgICAgICB0aGUgcmVuZGVyIGNvbnRleHQgZ2l2aW5nIHJlbmRlcmluZyBzcGVjaWZpY2F0aW9ucyBzdWNoIGFzCisgICAgICogICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbnMuCisgICAgICogQHJldHVybiB0aGUgcmVuZGVyZWQgaW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIFJlbmRlcmVkSW1hZ2UgY3JlYXRlUmVuZGVyaW5nKFJlbmRlckNvbnRleHQgcmVuZGVyQ29udGV4dCk7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBzY2FsZWQgcmVuZGVyZWQgaW1hZ2UgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCAKLSAgICAgKiBpbiB0aGUgcGFyYW1ldGVycyBhbmQgdGhlIHJlbmRlciBjb250ZXh0LgorICAgICAqIENyZWF0ZXMgdGhlIHNjYWxlZCByZW5kZXJlZCBpbWFnZSBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGluCisgICAgICogdGhlIHBhcmFtZXRlcnMgYW5kIHRoZSByZW5kZXIgY29udGV4dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdyB0aGUgZGVzaXJlZCB3aWR0aCBhZnRlciBzY2FsaW5nIG9yIHplcm8gaWYgdGhlIHNjYWxpbmcgCi0gICAgICogc2hvdWxkIGJlIHByb3BvcnRpb25hbCwgYmFzZWQgb24gdGhlIGhlaWdodAotICAgICAqIEBwYXJhbSBoIHRoZSBkZXNpcmVkIGhlaWdodCBhZnRlciBzY2FsaW5nIG9yIHplcm8gaWYgdGhlIHNjYWxpbmcgCi0gICAgICogc2hvdWxkIGJlIHByb3BvcnRpb25hbCwgYmFzZWQgb24gdGhlIHdpZHRoCi0gICAgICogQHBhcmFtIGhpbnRzIHRoZSByZW5kZXJpbmcgaGludHMgdG8gdXNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVuZGVyZWQgaW1hZ2UKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBib3RoIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGFyZSB6ZXJvCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXNpcmVkIHdpZHRoIGFmdGVyIHNjYWxpbmcgb3IgemVybyBpZiB0aGUgc2NhbGluZyBzaG91bGQKKyAgICAgKiAgICAgICAgICAgIGJlIHByb3BvcnRpb25hbCwgYmFzZWQgb24gdGhlIGhlaWdodC4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGRlc2lyZWQgaGVpZ2h0IGFmdGVyIHNjYWxpbmcgb3IgemVybyBpZiB0aGUgc2NhbGluZyBzaG91bGQKKyAgICAgKiAgICAgICAgICAgIGJlIHByb3BvcnRpb25hbCwgYmFzZWQgb24gdGhlIHdpZHRoLgorICAgICAqIEBwYXJhbSBoaW50cworICAgICAqICAgICAgICAgICAgdGhlIHJlbmRlcmluZyBoaW50cyB0byB1c2UuCisgICAgICogQHJldHVybiB0aGUgcmVuZGVyZWQgaW1hZ2UuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBib3RoIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGFyZSB6ZXJvLgogICAgICAqLwogICAgIHB1YmxpYyBSZW5kZXJlZEltYWdlIGNyZWF0ZVNjYWxlZFJlbmRlcmluZyhpbnQgdywgaW50IGgsIFJlbmRlcmluZ0hpbnRzIGhpbnRzKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHZlY3RvciBvZiBzb3VyY2VzIGZyb20gdGhlIHBhcmFtZXRlciBibG9jay4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2VzCisgICAgICogQHJldHVybiB0aGUgc291cmNlcy4KICAgICAgKi8KICAgICBwdWJsaWMgVmVjdG9yPFJlbmRlcmFibGVJbWFnZT4gZ2V0U291cmNlcygpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbmFtZXMgb2YgYWxsIG9mIHRoZSBzdXBwb3J0ZWQgcHJvcGVydGllcyBpbiB0aGUgY3VycmVudCBjb250ZXh0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IG5hbWVzCisgICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgbmFtZXMuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIGdldFByb3BlcnR5TmFtZXMoKTsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgcmVuZGVyaW5nICh1c2luZyB0aGUgaWRlbnRpdHkgdHJhbnNmb3JtCi0gICAgICogYW5kIGRlZmF1bHQgcmVuZGVyIGNvbnRleHQpLgorICAgICAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgcmVuZGVyaW5nICh1c2luZyB0aGUgaWRlbnRpdHkgdHJhbnNmb3JtIGFuZCBkZWZhdWx0CisgICAgICogcmVuZGVyIGNvbnRleHQpLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlbmRlcmVkIGltYWdlCisgICAgICogQHJldHVybiB0aGUgcmVuZGVyZWQgaW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIFJlbmRlcmVkSW1hZ2UgY3JlYXRlRGVmYXVsdFJlbmRlcmluZygpOwogCiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoaXMgY29udGV4dCBzdXBwb3J0cyBkeW5hbWljIHJlbmRlcmluZy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgY29udGV4dCBzdXBwb3J0cyBkeW5hbWljIHJlbmRlcmluZworICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBjb250ZXh0IHN1cHBvcnRzIGR5bmFtaWMgcmVuZGVyaW5nLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRHluYW1pYygpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgd2lkdGggb2YgdGhlIGltYWdlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSBpbWFnZQorICAgICAqIEByZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSBpbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0V2lkdGgoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lcgorICAgICAqIEByZXR1cm4gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldE1pblkoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lcgorICAgICAqIEByZXR1cm4gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldE1pblgoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZQorICAgICAqIEByZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldEhlaWdodCgpOwogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL1JlbmRlcmFibGVJbWFnZU9wLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9SZW5kZXJhYmxlSW1hZ2VPcC5qYXZhCmluZGV4IDk5M2JhNWYuLmRjNDUzNzIgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL1JlbmRlcmFibGVJbWFnZU9wLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL3JlbmRlcmFibGUvUmVuZGVyYWJsZUltYWdlT3AuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2UucmVuZGVyYWJsZTsKIAogaW1wb3J0IGphdmEuYXd0LlJlbmRlcmluZ0hpbnRzOwpAQCAtMjksMzUgKzMwLDQ0IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIENsYXNzIFJlbmRlcmFibGVJbWFnZU9wIGlzIGEgYmFzaWMgaW1wbGVtZW50YXRpb24gb2YgUmVuZGVyYWJsZUltYWdlLCAKLSAqIHdpdGggbWV0aG9kcyB0byBhY2Nlc3MgdGhlIHBhcmFtZXRlciBkYXRhIGFuZCBwZXJmb3JtIHJlbmRlcmluZwotICogb3BlcmF0aW9ucy4KKyAqIFRoZSBDbGFzcyBSZW5kZXJhYmxlSW1hZ2VPcCBpcyBhIGJhc2ljIGltcGxlbWVudGF0aW9uIG9mIFJlbmRlcmFibGVJbWFnZSwKKyAqIHdpdGggbWV0aG9kcyB0byBhY2Nlc3MgdGhlIHBhcmFtZXRlciBkYXRhIGFuZCBwZXJmb3JtIHJlbmRlcmluZyBvcGVyYXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFJlbmRlcmFibGVJbWFnZU9wIGltcGxlbWVudHMgUmVuZGVyYWJsZUltYWdlIHsKIAotICAgIC8qKiBUaGUgQ1JJRi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ1JJRi4KKyAgICAgKi8KICAgICBDb250ZXh0dWFsUmVuZGVyZWRJbWFnZUZhY3RvcnkgQ1JJRjsKLSAgICAKLSAgICAvKiogVGhlIHBhcmFtIGJsb2NrLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHBhcmFtIGJsb2NrLgorICAgICAqLwogICAgIFBhcmFtZXRlckJsb2NrIHBhcmFtQmxvY2s7Ci0gICAgCi0gICAgLyoqIFRoZSBoZWlnaHQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgaGVpZ2h0LgorICAgICAqLwogICAgIGZsb2F0IG1pblgsIG1pblksIHdpZHRoLCBoZWlnaHQ7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcmVuZGVyYWJsZSBpbWFnZSBvcC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gQ1JJRiB0aGUgY1JJRgotICAgICAqIEBwYXJhbSBwYXJhbUJsb2NrIHRoZSBwYXJhbSBibG9jaworICAgICAqIEBwYXJhbSBDUklGCisgICAgICogICAgICAgICAgICB0aGUgY1JJRi4KKyAgICAgKiBAcGFyYW0gcGFyYW1CbG9jaworICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtIGJsb2NrLgogICAgICAqLwogICAgIHB1YmxpYyBSZW5kZXJhYmxlSW1hZ2VPcChDb250ZXh0dWFsUmVuZGVyZWRJbWFnZUZhY3RvcnkgQ1JJRiwgUGFyYW1ldGVyQmxvY2sgcGFyYW1CbG9jaykgewogICAgICAgICB0aGlzLkNSSUYgPSBDUklGOwotICAgICAgICB0aGlzLnBhcmFtQmxvY2sgPSAoUGFyYW1ldGVyQmxvY2spIHBhcmFtQmxvY2suY2xvbmUoKTsKKyAgICAgICAgdGhpcy5wYXJhbUJsb2NrID0gKFBhcmFtZXRlckJsb2NrKXBhcmFtQmxvY2suY2xvbmUoKTsKICAgICAgICAgUmVjdGFuZ2xlMkQgciA9IENSSUYuZ2V0Qm91bmRzMkQocGFyYW1CbG9jayk7Ci0gICAgICAgIG1pblggPSAoZmxvYXQpIHIuZ2V0TWluWCgpOwotICAgICAgICBtaW5ZID0gKGZsb2F0KSByLmdldE1pblkoKTsKLSAgICAgICAgd2lkdGggPSAoZmxvYXQpIHIuZ2V0V2lkdGgoKTsKLSAgICAgICAgaGVpZ2h0ID0gKGZsb2F0KSByLmdldEhlaWdodCgpOworICAgICAgICBtaW5YID0gKGZsb2F0KXIuZ2V0TWluWCgpOworICAgICAgICBtaW5ZID0gKGZsb2F0KXIuZ2V0TWluWSgpOworICAgICAgICB3aWR0aCA9IChmbG9hdClyLmdldFdpZHRoKCk7CisgICAgICAgIGhlaWdodCA9IChmbG9hdClyLmdldEhlaWdodCgpOwogICAgIH0KIAogICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKQEAgLTY3LDI3ICs3NywyNyBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHBhcmFtZXRlciBibG9jay4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW1CbG9jayB0aGUgcGFyYW0gYmxvY2sKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgYmxvY2sKKyAgICAgKiBAcGFyYW0gcGFyYW1CbG9jaworICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtIGJsb2NrLgorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlciBibG9jay4KICAgICAgKi8KICAgICBwdWJsaWMgUGFyYW1ldGVyQmxvY2sgc2V0UGFyYW1ldGVyQmxvY2soUGFyYW1ldGVyQmxvY2sgcGFyYW1CbG9jaykgewogICAgICAgICBQYXJhbWV0ZXJCbG9jayBvbGRQYXJhbSA9IHRoaXMucGFyYW1CbG9jazsKLSAgICAgICAgdGhpcy5wYXJhbUJsb2NrID0gKFBhcmFtZXRlckJsb2NrKSBwYXJhbUJsb2NrLmNsb25lKCk7CisgICAgICAgIHRoaXMucGFyYW1CbG9jayA9IChQYXJhbWV0ZXJCbG9jaylwYXJhbUJsb2NrLmNsb25lKCk7CiAgICAgICAgIHJldHVybiBvbGRQYXJhbTsKICAgICB9CiAKICAgICBwdWJsaWMgUmVuZGVyZWRJbWFnZSBjcmVhdGVSZW5kZXJpbmcoUmVuZGVyQ29udGV4dCByZW5kZXJDb250ZXh0KSB7CiAKICAgICAgICAgVmVjdG9yPFJlbmRlcmFibGVJbWFnZT4gc291cmNlcyA9IGdldFNvdXJjZXMoKTsKLSAgICAgICAgUGFyYW1ldGVyQmxvY2sgcmRQYXJhbSA9IChQYXJhbWV0ZXJCbG9jaykgcGFyYW1CbG9jay5jbG9uZSgpOworICAgICAgICBQYXJhbWV0ZXJCbG9jayByZFBhcmFtID0gKFBhcmFtZXRlckJsb2NrKXBhcmFtQmxvY2suY2xvbmUoKTsKIAogICAgICAgICBpZiAoc291cmNlcyAhPSBudWxsKSB7CiAgICAgICAgICAgICBWZWN0b3I8T2JqZWN0PiByZFNvdXJjZXMgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKICAgICAgICAgICAgIGludCBpID0gMDsKICAgICAgICAgICAgIHdoaWxlIChpIDwgc291cmNlcy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBSZW5kZXJDb250ZXh0IG5ld0NvbnRleHQgPSBDUklGLm1hcFJlbmRlckNvbnRleHQoaSwgcmVuZGVyQ29udGV4dCwgcGFyYW1CbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOworICAgICAgICAgICAgICAgIFJlbmRlckNvbnRleHQgbmV3Q29udGV4dCA9IENSSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBSZW5kZXJDb250ZXh0KGksIHJlbmRlckNvbnRleHQsIHBhcmFtQmxvY2ssIHRoaXMpOwogICAgICAgICAgICAgICAgIFJlbmRlcmVkSW1hZ2UgcmRpbSA9IHNvdXJjZXMuZWxlbWVudEF0KGkpLmNyZWF0ZVJlbmRlcmluZyhuZXdDb250ZXh0KTsKIAogICAgICAgICAgICAgICAgIGlmIChyZGltICE9IG51bGwpIHsKQEAgLTEwMywyMCArMTEzLDIwIEBACiAgICAgfQogCiAgICAgcHVibGljIFJlbmRlcmVkSW1hZ2UgY3JlYXRlU2NhbGVkUmVuZGVyaW5nKGludCB3LCBpbnQgaCwgUmVuZGVyaW5nSGludHMgaGludHMpIHsKLSAgICAgICAgaWYodyA9PSAwICYmIGggPT0gMCkgeworICAgICAgICBpZiAodyA9PSAwICYmIGggPT0gMCkgewogICAgICAgICAgICAgLy8gYXd0LjYwPVdpZHRoIGFuZCBIZWlnaHQgbXVzdG4ndCBiZSBlcXVhbCB6ZXJvIGJvdGgKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjAiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQotICAgICAgICBpZih3ID09IDApewotICAgICAgICAgICAgdyA9IE1hdGgucm91bmQoaCooZ2V0V2lkdGgoKS9nZXRIZWlnaHQoKSkpOworICAgICAgICBpZiAodyA9PSAwKSB7CisgICAgICAgICAgICB3ID0gTWF0aC5yb3VuZChoICogKGdldFdpZHRoKCkgLyBnZXRIZWlnaHQoKSkpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYoaCA9PSAwKXsKLSAgICAgICAgICAgIGggPSBNYXRoLnJvdW5kKHcqKGdldEhlaWdodCgpL2dldFdpZHRoKCkpKTsKKyAgICAgICAgaWYgKGggPT0gMCkgeworICAgICAgICAgICAgaCA9IE1hdGgucm91bmQodyAqIChnZXRIZWlnaHQoKSAvIGdldFdpZHRoKCkpKTsKICAgICAgICAgfQogCi0gICAgICAgIGRvdWJsZSBzeCA9IChkb3VibGUpdy9nZXRXaWR0aCgpOwotICAgICAgICBkb3VibGUgc3kgPSAoZG91YmxlKWgvZ2V0SGVpZ2h0KCk7CisgICAgICAgIGRvdWJsZSBzeCA9IChkb3VibGUpdyAvIGdldFdpZHRoKCk7CisgICAgICAgIGRvdWJsZSBzeSA9IChkb3VibGUpaCAvIGdldEhlaWdodCgpOwogCiAgICAgICAgIEFmZmluZVRyYW5zZm9ybSBhdCA9IEFmZmluZVRyYW5zZm9ybS5nZXRTY2FsZUluc3RhbmNlKHN4LCBzeSk7CiAgICAgICAgIFJlbmRlckNvbnRleHQgY29udGV4dCA9IG5ldyBSZW5kZXJDb250ZXh0KGF0LCBoaW50cyk7CkBAIC0xMjQsMTUgKzEzNCwxNSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBWZWN0b3I8UmVuZGVyYWJsZUltYWdlPiBnZXRTb3VyY2VzKCkgewotICAgICAgICBpZihwYXJhbUJsb2NrLmdldE51bVNvdXJjZXMoKSA9PSAwKSB7CisgICAgICAgIGlmIChwYXJhbUJsb2NrLmdldE51bVNvdXJjZXMoKSA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgICAgICBWZWN0b3I8UmVuZGVyYWJsZUltYWdlPiB2ID0gbmV3IFZlY3RvcjxSZW5kZXJhYmxlSW1hZ2U+KCk7Ci0gICAgICAgIGludCAgaSA9IDA7Ci0gICAgICAgIHdoaWxlKGkgPCBwYXJhbUJsb2NrLmdldE51bVNvdXJjZXMoKSl7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBwYXJhbUJsb2NrLmdldE51bVNvdXJjZXMoKSkgewogICAgICAgICAgICAgT2JqZWN0IG8gPSBwYXJhbUJsb2NrLmdldFNvdXJjZShpKTsKLSAgICAgICAgICAgIGlmKG8gaW5zdGFuY2VvZiBSZW5kZXJhYmxlSW1hZ2UpewotICAgICAgICAgICAgICAgIHYuYWRkRWxlbWVudCgoUmVuZGVyYWJsZUltYWdlKSBvKTsKKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgUmVuZGVyYWJsZUltYWdlKSB7CisgICAgICAgICAgICAgICAgdi5hZGRFbGVtZW50KChSZW5kZXJhYmxlSW1hZ2Upbyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpKys7CiAgICAgICAgIH0KQEAgLTE3OSw0ICsxODksMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9SZW5kZXJhYmxlSW1hZ2VQcm9kdWNlci5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL3JlbmRlcmFibGUvUmVuZGVyYWJsZUltYWdlUHJvZHVjZXIuamF2YQppbmRleCA3ZmRhOThjLi5lODNlYmM3IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9SZW5kZXJhYmxlSW1hZ2VQcm9kdWNlci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL1JlbmRlcmFibGVJbWFnZVByb2R1Y2VyLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlLnJlbmRlcmFibGU7CiAKIGltcG9ydCBqYXZhLmF3dC5pbWFnZS5Db2xvck1vZGVsOwpAQCAtMjgsMjUgKzI5LDM1IEBACiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgUmVuZGVyYWJsZUltYWdlUHJvZHVjZXIgcHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciAKLSAqIHRoZSBpbWFnZSByZW5kZXJpbmcuCisgKiBUaGUgQ2xhc3MgUmVuZGVyYWJsZUltYWdlUHJvZHVjZXIgcHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgaW1hZ2UKKyAqIHJlbmRlcmluZy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBSZW5kZXJhYmxlSW1hZ2VQcm9kdWNlciBpbXBsZW1lbnRzIEltYWdlUHJvZHVjZXIsIFJ1bm5hYmxlIHsKIAotICAgIC8qKiBUaGUgcmJsLiAqLworICAgIC8qKgorICAgICAqIFRoZSByYmwuCisgICAgICovCiAgICAgUmVuZGVyYWJsZUltYWdlIHJibDsKLSAgICAKLSAgICAvKiogVGhlIHJjLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHJjLgorICAgICAqLwogICAgIFJlbmRlckNvbnRleHQgcmM7Ci0gICAgCi0gICAgLyoqIFRoZSBjb25zdW1lcnMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uc3VtZXJzLgorICAgICAqLwogICAgIFZlY3RvcjxJbWFnZUNvbnN1bWVyPiBjb25zdW1lcnMgPSBuZXcgVmVjdG9yPEltYWdlQ29uc3VtZXI+KCk7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcmVuZGVyYWJsZSBpbWFnZSBwcm9kdWNlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmRibEltYWdlIHRoZSByZGJsIGltYWdlCi0gICAgICogQHBhcmFtIHJjIHRoZSByYworICAgICAqIEBwYXJhbSByZGJsSW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSByZGJsIGltYWdlLgorICAgICAqIEBwYXJhbSByYworICAgICAqICAgICAgICAgICAgdGhlIHJjLgogICAgICAqLwogICAgIHB1YmxpYyBSZW5kZXJhYmxlSW1hZ2VQcm9kdWNlcihSZW5kZXJhYmxlSW1hZ2UgcmRibEltYWdlLCBSZW5kZXJDb250ZXh0IHJjKSB7CiAgICAgICAgIHRoaXMucmJsID0gcmRibEltYWdlOwpAQCAtNTYsNyArNjcsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHJlbmRlciBjb250ZXh0LgogICAgICAqIAotICAgICAqIEBwYXJhbSByYyB0aGUgbmV3IHJlbmRlciBjb250ZXh0CisgICAgICogQHBhcmFtIHJjCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHJlbmRlciBjb250ZXh0LgogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRSZW5kZXJDb250ZXh0KFJlbmRlckNvbnRleHQgcmMpIHsKICAgICAgICAgdGhpcy5yYyA9IHJjOwpAQCAtNzIsMTYgKzg0LDE3IEBACiAgICAgICAgIHQuc3RhcnQoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0VG9wRG93bkxlZnRSaWdodFJlc2VuZChJbWFnZUNvbnN1bWVyIGljKSB7fQorICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RUb3BEb3duTGVmdFJpZ2h0UmVzZW5kKEltYWdlQ29uc3VtZXIgaWMpIHsKKyAgICB9CiAKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQ29uc3VtZXIoSW1hZ2VDb25zdW1lciBpYykgewotICAgICAgICBpZihpYyAhPSBudWxsKSB7CisgICAgICAgIGlmIChpYyAhPSBudWxsKSB7CiAgICAgICAgICAgICBjb25zdW1lcnMucmVtb3ZlRWxlbWVudChpYyk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQ29uc3VtZXIoSW1hZ2VDb25zdW1lciBpYykgewotICAgICAgICBpZihpYyAhPSBudWxsICYmICFjb25zdW1lcnMuY29udGFpbnMoaWMpKXsKKyAgICAgICAgaWYgKGljICE9IG51bGwgJiYgIWNvbnN1bWVycy5jb250YWlucyhpYykpIHsKICAgICAgICAgICAgIGNvbnN1bWVycy5hZGRFbGVtZW50KGljKTsKICAgICAgICAgfQogICAgIH0KQEAgLTkwLDE5ICsxMDMsMTkgQEAKICAgICAgKiBDcmVhdGVzIHRoZSByZW5kZXJlZCBpbWFnZSBpbiBhIG5ldyB0aHJlYWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBpZihyYmwgPT0gbnVsbCkgeworICAgICAgICBpZiAocmJsID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIFJlbmRlcmVkSW1hZ2UgcmQ7Ci0gICAgICAgIGlmKHJjICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHJjICE9IG51bGwpIHsKICAgICAgICAgICAgIHJkID0gcmJsLmNyZWF0ZVJlbmRlcmluZyhyYyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZCA9IHJibC5jcmVhdGVEZWZhdWx0UmVuZGVyaW5nKCk7CiAgICAgICAgIH0KIAogICAgICAgICBDb2xvck1vZGVsIGNtID0gcmQuZ2V0Q29sb3JNb2RlbCgpOwotICAgICAgICBpZihjbSA9PSBudWxsKSB7CisgICAgICAgIGlmIChjbSA9PSBudWxsKSB7CiAgICAgICAgICAgICBjbSA9IENvbG9yTW9kZWwuZ2V0UkdCZGVmYXVsdCgpOwogICAgICAgICB9CiAKQEAgLTExMiwxNyArMTI1LDE1IEBACiAKICAgICAgICAgZm9yIChJbWFnZUNvbnN1bWVyIGMgOiBjb25zdW1lcnMpIHsKICAgICAgICAgICAgIGMuc2V0RGltZW5zaW9ucyh3LCBoKTsKLSAgICAgICAgICAgIGMuc2V0SGludHMoSW1hZ2VDb25zdW1lci5UT1BET1dOTEVGVFJJR0hUIHwKLSAgICAgICAgICAgICAgICAgICAgSW1hZ2VDb25zdW1lci5DT01QTEVURVNDQU5MSU5FUyB8Ci0gICAgICAgICAgICAgICAgICAgIEltYWdlQ29uc3VtZXIuU0lOR0xFRlJBTUUgfAotICAgICAgICAgICAgICAgICAgICBJbWFnZUNvbnN1bWVyLlNJTkdMRVBBU1MpOworICAgICAgICAgICAgYy5zZXRIaW50cyhJbWFnZUNvbnN1bWVyLlRPUERPV05MRUZUUklHSFQgfCBJbWFnZUNvbnN1bWVyLkNPTVBMRVRFU0NBTkxJTkVTCisgICAgICAgICAgICAgICAgICAgIHwgSW1hZ2VDb25zdW1lci5TSU5HTEVGUkFNRSB8IEltYWdlQ29uc3VtZXIuU0lOR0xFUEFTUyk7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQgc2NhbkxpbmVbXSA9IG5ldyBpbnRbd107CiAgICAgICAgIGludCBwaXhlbFtdID0gbnVsbDsKIAotICAgICAgICBmb3IoaW50IHkgPSAwOyB5IDwgaDsgeSsrKXsKLSAgICAgICAgICAgIGZvcihpbnQgeCA9IDA7IHggPCB3OyB4KyspeworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKICAgICAgICAgICAgICAgICBwaXhlbCA9IHIuZ2V0UGl4ZWwoeCwgeSwgcGl4ZWwpOwogICAgICAgICAgICAgICAgIHNjYW5MaW5lW3hdID0gY20uZ2V0RGF0YUVsZW1lbnQocGl4ZWwsIDApOwogICAgICAgICAgICAgfQpAQCAtMTM4LDQgKzE0OSwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL1JlbmRlcmVkSW1hZ2VGYWN0b3J5LmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9SZW5kZXJlZEltYWdlRmFjdG9yeS5qYXZhCmluZGV4IDM0NWQ4MmMuLjg4MWE0MGEgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL1JlbmRlcmVkSW1hZ2VGYWN0b3J5LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL3JlbmRlcmFibGUvUmVuZGVyZWRJbWFnZUZhY3RvcnkuamF2YQpAQCAtMTgsMjYgKzE4LDI5IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZS5yZW5kZXJhYmxlOwogCiBpbXBvcnQgamF2YS5hd3QuUmVuZGVyaW5nSGludHM7CiBpbXBvcnQgamF2YS5hd3QuaW1hZ2UuUmVuZGVyZWRJbWFnZTsKIAogLyoqCi0gKiBBIGZhY3RvcnkgZm9yIGNyZWF0aW5nIFJlbmRlcmVkSW1hZ2Ugb2JqZWN0cyBiYXNlZCBvbiBwYXJhbWV0ZXJzCi0gKiBhbmQgcmVuZGVyaW5nIGhpbnRzLgorICogQSBmYWN0b3J5IGZvciBjcmVhdGluZyBSZW5kZXJlZEltYWdlIG9iamVjdHMgYmFzZWQgb24gcGFyYW1ldGVycyBhbmQKKyAqIHJlbmRlcmluZyBoaW50cy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZWRJbWFnZUZhY3RvcnkgewogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgcmVuZGVyZWQgaW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGEwIHRoZSBQYXJhbWV0ZXJCbG9jawotICAgICAqIEBwYXJhbSBhMSB0aGUgUmVuZGVyaW5nSGludHMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZW5kZXJlZCBpbWFnZQorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIFBhcmFtZXRlckJsb2NrLgorICAgICAqIEBwYXJhbSBhMQorICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmluZ0hpbnRzLgorICAgICAqIEByZXR1cm4gdGhlIHJlbmRlcmVkIGltYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBSZW5kZXJlZEltYWdlIGNyZWF0ZShQYXJhbWV0ZXJCbG9jayBhMCwgUmVuZGVyaW5nSGludHMgYTEpOwogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL3BhY2thZ2UuaHRtbCBiL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2FhYWJjCi0tLSAvZGV2L251bGwKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL3JlbmRlcmFibGUvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxib2R5PgorICAgIDxwPgorICAgICAgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGNsYXNzZXMgdG8gY3JlYXRlIGltYWdlcyB3aGljaCBhcmUgcmVuZGVyaW5nLWluZGVwZW5kZW50LgorICAgIDwvcD4KKyAgICBAc2luY2UgQW5kcm9pZCAxLjAKKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L3BhY2thZ2UuaHRtbCBiL2F3dC9qYXZhL2F3dC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE2ZjlmMAotLS0gL2Rldi9udWxsCisrKyBiL2F3dC9qYXZhL2F3dC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGJvZHk+CisgICAgPHA+CisgICAgICBUaGlzIHBhY2thZ2UgY29udGFpbnMgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyBmb3IgY3JlYXRpbmcgKGdyYXBoaWNhbCkgdXNlciBpbnRlcmZhY2VzIChHVUkpLCBwYWludGluZyAyRCBncmFwaGljcyBhbmQgY3JlYXRpbmcsIG1hbmlwdWxhdGluZyBhbmQgZHJhd2luZyBpbWFnZXMuIAorICAgIDwvcD4KKyAgQHNpbmNlIEFuZHJvaWQgMS4wCisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2JlYW5zL0luZGV4ZWRQcm9wZXJ0eUNoYW5nZUV2ZW50LmphdmEgYi9hd3QvamF2YS9iZWFucy9JbmRleGVkUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTA4NGM2Li4wMDAwMDAwCi0tLSBhL2F3dC9qYXZhL2JlYW5zL0luZGV4ZWRQcm9wZXJ0eUNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgamF2YS5iZWFuczsKLQotLyoqCi0gKiBBIHR5cGUgb2Yge0BsaW5rIFByb3BlcnR5Q2hhbmdlRXZlbnR9IHRoYXQgaW5kaWNhdGVzIHRoYXQgYW4gaW5kZXhlZCBwcm9wZXJ0eQotICogaGFzIGNoYW5nZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIEluZGV4ZWRQcm9wZXJ0eUNoYW5nZUV2ZW50IGV4dGVuZHMgUHJvcGVydHlDaGFuZ2VFdmVudCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzIwMjI3NDQ4NDk1ODA2ODcwTDsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IGluZGV4OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBwcm9wZXJ0eSBjaGFuZ2VkIGV2ZW50IHdpdGggYW4gaW5kaWNhdGlvbiBvZiB0aGUgcHJvcGVydHkKLSAgICAgKiBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlCi0gICAgICogICAgICAgICAgICB0aGUgY2hhbmdlZCBiZWFuLgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFuZ2VkIHByb3BlcnR5LCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBpbmRpY2F0ZSBhbgotICAgICAqICAgICAgICAgICAgdW5zcGVjaWZpZWQgc2V0IG9mIHRoZSBwcm9wZXJ0aWVzIGhhdmUgY2hhbmdlZC4KLSAgICAgKiBAcGFyYW0gb2xkVmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgcHJvcGVydHksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0gICAgICogICAgICAgICAgICB0aGUgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciB0aGUKLSAgICAgKiAgICAgICAgICAgIHByZXZpb3VzIHZhbHVlIGlzIHVua25vd24uCi0gICAgICogQHBhcmFtIG5ld1ZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0gICAgICogICAgICAgICAgICA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIHRoZSBuZXcKLSAgICAgKiAgICAgICAgICAgIHZhbHVlIGlzIHVua25vd24uLgotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW5kZXhlZFByb3BlcnR5Q2hhbmdlRXZlbnQoT2JqZWN0IHNvdXJjZSwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgc3VwZXIoc291cmNlLCBwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbnN3ZXIgdGhlIGluZGV4IG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBjaGFuZ2VkIGluIHRoaXMgZXZlbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgcHJvcGVydHkgZWxlbWVudCBpbmRleC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgewotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYmVhbnMvUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhIGIvYXd0L2phdmEvYmVhbnMvUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2M3MDNhLi4wMDAwMDAwCi0tLSBhL2F3dC9qYXZhL2JlYW5zL1Byb3BlcnR5Q2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgamF2YS5iZWFuczsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MDQyNjkzNjg4OTM5NjQ4MTIzTDsKLQotICAgIFN0cmluZyBwcm9wZXJ0eU5hbWU7Ci0KLSAgICBPYmplY3Qgb2xkVmFsdWU7Ci0KLSAgICBPYmplY3QgbmV3VmFsdWU7Ci0KLSAgICBPYmplY3QgcHJvcGFnYXRpb25JZDsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eUNoYW5nZUV2ZW50KE9iamVjdCBzb3VyY2UsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBzdXBlcihzb3VyY2UpOwotCi0gICAgICAgIHRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotICAgICAgICB0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7Ci0gICAgICAgIHRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wYWdhdGlvbklkKE9iamVjdCBwcm9wYWdhdGlvbklkKSB7Ci0gICAgICAgIHRoaXMucHJvcGFnYXRpb25JZCA9IHByb3BhZ2F0aW9uSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wYWdhdGlvbklkKCkgewotICAgICAgICByZXR1cm4gcHJvcGFnYXRpb25JZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9sZFZhbHVlKCkgewotICAgICAgICByZXR1cm4gb2xkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXROZXdWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ld1ZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2JlYW5zL1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIuamF2YSBiL2F3dC9qYXZhL2JlYW5zL1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0MjJjMC4uMDAwMDAwMAotLS0gYS9hd3QvamF2YS9iZWFucy9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGphdmEuYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2JlYW5zL1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eS5qYXZhIGIvYXd0L2phdmEvYmVhbnMvUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZjNhZWMuLjAwMDAwMDAKLS0tIGEvYXd0L2phdmEvYmVhbnMvUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGphdmEuYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lclByb3h5OwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclByb3h5IGV4dGVuZHMgRXZlbnRMaXN0ZW5lclByb3h5IGltcGxlbWVudHMKLSAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0KLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lOwotCi0gICAgcHVibGljIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eShTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBzdXBlcihsaXN0ZW5lcik7Ci0gICAgICAgIHRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotICAgICAgICByZXR1cm4gcHJvcGVydHlOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKSBnZXRMaXN0ZW5lcigpOwotICAgICAgICBsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYmVhbnMvUHJvcGVydHlDaGFuZ2VTdXBwb3J0LmphdmEgYi9hd3QvamF2YS9iZWFucy9Qcm9wZXJ0eUNoYW5nZVN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU2ZTYzYS4uMDAwMDAwMAotLS0gYS9hd3QvamF2YS9iZWFucy9Qcm9wZXJ0eUNoYW5nZVN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGphdmEuYmVhbnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY0MDEyNTM3NzM3Nzk5NTE4MDNsOwotCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgT2JqZWN0IHNvdXJjZUJlYW47Ci0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGFsbFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPigpOwotCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgTWFwPFN0cmluZywgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4KLSAgICAgICAgICAgIHNlbGVjdGVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycyA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4+KCk7Ci0KLSAgICAvLyBmaWVsZHMgZm9yIHNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eQotICAgIHByaXZhdGUgSGFzaHRhYmxlPFN0cmluZywgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4gY2hpbGRyZW47Ci0KLSAgICBwcml2YXRlIE9iamVjdCBzb3VyY2U7Ci0KLSAgICBwcml2YXRlIGludCBwcm9wZXJ0eUNoYW5nZVN1cHBvcnRTZXJpYWxpemVkRGF0YVZlcnNpb24gPSAxOwotCi0gICAgcHVibGljIFByb3BlcnR5Q2hhbmdlU3VwcG9ydChPYmplY3Qgc291cmNlQmVhbikgewotICAgICAgICBpZiAoc291cmNlQmVhbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnNvdXJjZUJlYW4gPSBzb3VyY2VCZWFuOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsCi0gICAgICAgICAgICBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCA9IGNyZWF0ZVByb3BlcnR5Q2hhbmdlRXZlbnQocHJvcGVydHlOYW1lLAotICAgICAgICAgICAgICAgIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0gICAgICAgIGRvRmlyZVByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaXJlSW5kZXhlZFByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBpbmRleCwKLSAgICAgICAgICAgIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0KLSAgICAgICAgLy8gbnVsbHMgYW5kIGVxdWFscyBjaGVjayBkb25lIGluIGRvRmlyZS4uLgotICAgICAgICBkb0ZpcmVQcm9wZXJ0eUNoYW5nZShuZXcgSW5kZXhlZFByb3BlcnR5Q2hhbmdlRXZlbnQoc291cmNlQmVhbiwKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBpZiAoKHByb3BlcnR5TmFtZSAhPSBudWxsKSAmJiAobGlzdGVuZXIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzLmdldChwcm9wZXJ0eU5hbWUpOwotCi0gICAgICAgICAgICBpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGlmICgobGlzdGVuZXIgIT0gbnVsbCkgJiYgKHByb3BlcnR5TmFtZSAhPSBudWxsKSkgewotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPQotICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMuZ2V0KHByb3BlcnR5TmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4oKTsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMucHV0KHByb3BlcnR5TmFtZSwgbGlzdGVuZXJzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUkkgY29tcGF0aWJpbGl0eQotICAgICAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclByb3h5KSB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclByb3h5IHByb3h5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyUHJveHkpIGxpc3RlbmVyOwotCi0gICAgICAgICAgICAgICAgbGlzdGVuZXJzLmFkZChuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclByb3h5KAotICAgICAgICAgICAgICAgICAgICAgICAgcHJveHkuZ2V0UHJvcGVydHlOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikgcHJveHkuZ2V0TGlzdGVuZXIoKSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIGdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKAotICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lcnMgPSBzZWxlY3RlZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMuZ2V0KHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKGxpc3RlbmVycyA9PSBudWxsKSA/IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10ge30KLSAgICAgICAgICAgICAgICA6IGxpc3RlbmVycy50b0FycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbbGlzdGVuZXJzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIG9sZFZhbHVlLAotICAgICAgICAgICAgYm9vbGVhbiBuZXdWYWx1ZSkgewotICAgICAgICBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ID0gY3JlYXRlUHJvcGVydHlDaGFuZ2VFdmVudChwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICAgICAgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLSAgICAgICAgZG9GaXJlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpcmVJbmRleGVkUHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGluZGV4LAotICAgICAgICAgICAgYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCi0gICAgICAgIGlmIChvbGRWYWx1ZSAhPSBuZXdWYWx1ZSkgewotICAgICAgICAgICAgZmlyZUluZGV4ZWRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eU5hbWUsIGluZGV4LCBCb29sZWFuCi0gICAgICAgICAgICAgICAgICAgIC52YWx1ZU9mKG9sZFZhbHVlKSwgQm9vbGVhbi52YWx1ZU9mKG5ld1ZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IG9sZFZhbHVlLAotICAgICAgICAgICAgaW50IG5ld1ZhbHVlKSB7Ci0gICAgICAgIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBjcmVhdGVQcm9wZXJ0eUNoYW5nZUV2ZW50KHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgICAgICBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotICAgICAgICBkb0ZpcmVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmlyZUluZGV4ZWRQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgaW5kZXgsCi0gICAgICAgICAgICBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCi0gICAgICAgIGlmIChvbGRWYWx1ZSAhPSBuZXdWYWx1ZSkgewotICAgICAgICAgICAgZmlyZUluZGV4ZWRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eU5hbWUsIGluZGV4LAotICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihvbGRWYWx1ZSksIG5ldyBJbnRlZ2VyKG5ld1ZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBhbGxQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzLnNpemUoKSA+IDA7Ci0gICAgICAgIGlmICghcmVzdWx0ICYmIChwcm9wZXJ0eU5hbWUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzLmdldChwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbGlzdGVuZXJzLnNpemUoKSA+IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLSAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyUHJveHkpIGxpc3RlbmVyKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5TmFtZSgpOwotICAgICAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHN0ID0gKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eSkgbGlzdGVuZXIpLmdldExpc3RlbmVyKCk7Ci0KLSAgICAgICAgICAgICAgICByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG5hbWUsIGxzdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFsbFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclByb3h5KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eSkgbGlzdGVuZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsc3QgPSAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLSAgICAgICAgICAgICAgICAgICAgICAgICgoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclByb3h5KSBsaXN0ZW5lcikuZ2V0TGlzdGVuZXIoKTsKLSAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG5hbWUsIGxzdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFsbFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIGdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCkgewotICAgICAgICBBcnJheUxpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gcmVzdWx0ID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+KAotICAgICAgICAgICAgICAgICAgICAgICAgYWxsUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycyk7Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogc2VsZWN0ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IHNlbGVjdGVkTGlzdGVuZXJzID0KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzLmdldChwcm9wZXJ0eU5hbWUpOwotCi0gICAgICAgICAgICBpZiAoc2VsZWN0ZWRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgZm9yIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogc2VsZWN0ZWRMaXN0ZW5lcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclByb3h5KHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQudG9BcnJheShuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltyZXN1bHQuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gYWxsU2VyaWFsaXplZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4oKTsKLQotICAgICAgICBmb3IgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcGNsIDogYWxsUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycykgewotICAgICAgICAgICAgaWYgKHBjbCBpbnN0YW5jZW9mIFNlcmlhbGl6YWJsZSkgewotICAgICAgICAgICAgICAgIGFsbFNlcmlhbGl6ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzLmFkZChwY2wpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPFN0cmluZywgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4KLSAgICAgICAgICAgICAgICBzZWxlY3RlZFNlcmlhbGl6ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4oKTsKLQotICAgICAgICBmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiBzZWxlY3RlZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4ga2V5VmFsdWVzID0KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzLmdldChwcm9wZXJ0eU5hbWUpOwotCi0gICAgICAgICAgICBpZiAoa2V5VmFsdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IHNlcmlhbGl6ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4oKTsKLQotICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwY2wgOiBrZXlWYWx1ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBjbCBpbnN0YW5jZW9mIFNlcmlhbGl6YWJsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMuYWRkKHBjbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXNlcmlhbGl6ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFNlcmlhbGl6ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUsIHNlcmlhbGl6ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjaGlsZHJlbiA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+PigKLSAgICAgICAgICAgICAgICBzZWxlY3RlZFNlcmlhbGl6ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzKTsKLSAgICAgICAgY2hpbGRyZW4ucHV0KCIiLCBhbGxTZXJpYWxpemVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgb29zLndyaXRlT2JqZWN0KGNoaWxkcmVuKTsKLQotICAgICAgICBPYmplY3Qgc291cmNlID0gbnVsbDsKLSAgICAgICAgaWYgKHNvdXJjZUJlYW4gaW5zdGFuY2VvZiBTZXJpYWxpemFibGUpIHsKLSAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZUJlYW47Ci0gICAgICAgIH0KLSAgICAgICAgb29zLndyaXRlT2JqZWN0KHNvdXJjZSk7Ci0KLSAgICAgICAgb29zLndyaXRlSW50KHByb3BlcnR5Q2hhbmdlU3VwcG9ydFNlcmlhbGl6ZWREYXRhVmVyc2lvbik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gb2lzKSB0aHJvd3MgSU9FeGNlcHRpb24sCi0gICAgICAgICAgICBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgY2hpbGRyZW4gPSAoSGFzaHRhYmxlPFN0cmluZywgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4pIG9pcwotICAgICAgICAgICAgICAgIC5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgc2VsZWN0ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+PigKLSAgICAgICAgICAgICAgICBjaGlsZHJlbik7Ci0gICAgICAgIGFsbFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMgPSBzZWxlY3RlZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMKLSAgICAgICAgICAgICAgICAucmVtb3ZlKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoYWxsUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhbGxQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPigpOwotICAgICAgICB9Ci0KLSAgICAgICAgc291cmNlQmVhbiA9IG9pcy5yZWFkT2JqZWN0KCk7Ci0gICAgICAgIHByb3BlcnR5Q2hhbmdlU3VwcG9ydFNlcmlhbGl6ZWREYXRhVmVyc2lvbiA9IG9pcy5yZWFkSW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgZG9GaXJlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBjcmVhdGVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQoc291cmNlQmVhbiwgcHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwKLSAgICAgICAgICAgICAgICBuZXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGNyZWF0ZVByb3BlcnR5Q2hhbmdlRXZlbnQoU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHNvdXJjZUJlYW4sIHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsCi0gICAgICAgICAgICAgICAgbmV3VmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBjcmVhdGVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQoc291cmNlQmVhbiwgcHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwKLSAgICAgICAgICAgICAgICBuZXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvRmlyZVByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotICAgICAgICBPYmplY3Qgb2xkVmFsdWUgPSBldmVudC5nZXRPbGRWYWx1ZSgpOwotICAgICAgICBPYmplY3QgbmV3VmFsdWUgPSBldmVudC5nZXROZXdWYWx1ZSgpOwotCi0gICAgICAgIGlmICgobmV3VmFsdWUgIT0gbnVsbCkgJiYgKG9sZFZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgJiYgbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ29weSB0aGUgbGlzdGVuZXJzIGNvbGxlY3Rpb25zIHNvIHRoZXkgY2FuIGJlIG1vZGlmaWVkIHdoaWxlIHdlIGZpcmUKLSAgICAgICAgICogZXZlbnRzLgotICAgICAgICAgKi8KLQotICAgICAgICAvLyBMaXN0ZW5lcnMgdG8gYWxsIHByb3BlcnR5IGNoYW5nZSBldmVudHMKLSAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIGxpc3RlbnNUb0FsbDsKLSAgICAgICAgLy8gTGlzdGVucyB0byBhIGdpdmVuIHByb3BlcnR5IGNoYW5nZQotICAgICAgICBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gbGlzdGVuc1RvT25lID0gbnVsbDsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBsaXN0ZW5zVG9BbGwgPSBhbGxQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzCi0gICAgICAgICAgICAgICAgICAgIC50b0FycmF5KG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW2FsbFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2l6ZSgpXSk7Ci0KLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gc2VsZWN0ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzCi0gICAgICAgICAgICAgICAgICAgIC5nZXQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxpc3RlbnNUb09uZSA9IGxpc3RlbmVycwotICAgICAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkobmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbbGlzdGVuZXJzLnNpemUoKV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmlyZSB0aGUgbGlzdGVuZXJzCi0gICAgICAgIGZvciAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbnNUb0FsbCkgewotICAgICAgICAgICAgbGlzdGVuZXIucHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsaXN0ZW5zVG9PbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuc1RvT25lKSB7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXIucHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9JSU9FeGNlcHRpb24uamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL0lJT0V4Y2VwdGlvbi5qYXZhCmluZGV4IGZiZmViNDIuLmM3NzcxNmMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL0lJT0V4Y2VwdGlvbi5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL0lJT0V4Y2VwdGlvbi5qYXZhCkBAIC0xOCwyMiArMTgsMjggQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW87CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiAvKioKICAqIFRoZSBJSU9FeGNlcHRpb24gY2xhc3MgaW5kaWNhdGVzIGVycm9ycyBpbiByZWFkaW5nL3dyaXRpbmcgb3BlcmF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJSU9FeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTMyMTYyMTA3MTg2Mzg5ODUyNTFMOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IElJT0V4Y2VwdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZGV0YWlsZWQgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbGVkIG1lc3NhZ2UuCiAgICAgICovCiAgICAgcHVibGljIElJT0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewogICAgICAgICBzdXBlcihtZXNzYWdlKTsKQEAgLTQyLDggKzQ4LDEwIEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IElJT0V4Y2VwdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZGV0YWlsZWQgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gY2F1c2UgdGhlIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBtZXNzYWdlCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsZWQgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgSUlPRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKICAgICAgICAgc3VwZXIobWVzc2FnZSk7CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9JSU9JbWFnZS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vSUlPSW1hZ2UuamF2YQppbmRleCBlMTdhOWZjLi5lOWU1MTMwIDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9JSU9JbWFnZS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL0lJT0ltYWdlLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW87CiAKIGltcG9ydCBqYXZheC5pbWFnZWlvLm1ldGFkYXRhLklJT01ldGFkYXRhOwpAQCAtMjcsMzMgKzI4LDQ3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgotICogVGhlIElJT0ltYWdlIGNsYXNzIGNvbWJpbmVzIHRoZSBpbWFnZSwgaW1hZ2UncyB0aHVtYm5haWwgYW5kIGltYWdlJ3MgbWV0YWRhdGEuCi0gKiBUaGUgaW1hZ2UgY2FuIGJlIHByZXNlbnRlZCBhcyBSZW5kZXJlZEltYWdlIG9yIFJhc3RlciBvYmplY3QuCisgKiBUaGUgSUlPSW1hZ2UgY2xhc3MgY29tYmluZXMgdGhlIGltYWdlLCBpbWFnZSdzIHRodW1ibmFpbCBhbmQgaW1hZ2UncworICogbWV0YWRhdGEuIFRoZSBpbWFnZSBjYW4gYmUgcHJlc2VudGVkIGFzIFJlbmRlcmVkSW1hZ2Ugb3IgUmFzdGVyIG9iamVjdC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJSU9JbWFnZSB7CiAKLSAgICAvKiogVGhlIGltYWdlIG9mIHRoaXMgSUlPSW1hZ2UuICovCisgICAgLyoqCisgICAgICogVGhlIGltYWdlIG9mIHRoaXMgSUlPSW1hZ2UuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFJlbmRlcmVkSW1hZ2UgaW1hZ2U7Ci0gICAgCi0gICAgLyoqIFRoZSByYXN0ZXIgb2YgdGhpcyBJSU9JbWFnZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSByYXN0ZXIgb2YgdGhpcyBJSU9JbWFnZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgUmFzdGVyIHJhc3RlcjsKLSAgICAKLSAgICAvKiogVGhlIGxpc3Qgd2l0aCB0aHVtYm5haWxzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW1hZ2UuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCB3aXRoIHRodW1ibmFpbHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbWFnZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgTGlzdDw/IGV4dGVuZHMgQnVmZmVyZWRJbWFnZT4gdGh1bWJuYWlsczsKLSAgICAKLSAgICAvKiogVGhlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW1hZ2UuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbWFnZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgSUlPTWV0YWRhdGEgbWV0YWRhdGE7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSUlPSW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIFJlbmRlcmVkSW1hZ2UsIAotICAgICAqIGxpc3Qgb2YgdGh1bWJuYWlscyBhbmQgbWV0YWRhdGEuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IElJT0ltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBSZW5kZXJlZEltYWdlLCBsaXN0IG9mCisgICAgICogdGh1bWJuYWlscyBhbmQgbWV0YWRhdGEuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlIHRoZSBpbWFnZSBzcGVjaWZpZWQgYnkgUmVuZGVyZWRJbWFnZS4KLSAgICAgKiBAcGFyYW0gdGh1bWJuYWlscyB0aGUgbGlzdCBvZiBCdWZmZXJlZEltYWdlIG9iamVjdHMgd2hpY2ggCi0gICAgICogcmVwcmVzZW50IHRoZSB0aHVtYm5haWxzIG9mIHRoZSBpbWFnZS4KLSAgICAgKiBAcGFyYW0gbWV0YWRhdGEgdGhlIG1ldGFkYXRhIG9mIHRoZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBzcGVjaWZpZWQgYnkgUmVuZGVyZWRJbWFnZS4KKyAgICAgKiBAcGFyYW0gdGh1bWJuYWlscworICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgQnVmZmVyZWRJbWFnZSBvYmplY3RzIHdoaWNoIHJlcHJlc2VudCB0aGUKKyAgICAgKiAgICAgICAgICAgIHRodW1ibmFpbHMgb2YgdGhlIGltYWdlLgorICAgICAqIEBwYXJhbSBtZXRhZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIG1ldGFkYXRhIG9mIHRoZSBpbWFnZS4KICAgICAgKi8KLSAgICBwdWJsaWMgSUlPSW1hZ2UoUmVuZGVyZWRJbWFnZSBpbWFnZSwgTGlzdDw/IGV4dGVuZHMgQnVmZmVyZWRJbWFnZT4gdGh1bWJuYWlscywgSUlPTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICBwdWJsaWMgSUlPSW1hZ2UoUmVuZGVyZWRJbWFnZSBpbWFnZSwgTGlzdDw/IGV4dGVuZHMgQnVmZmVyZWRJbWFnZT4gdGh1bWJuYWlscywKKyAgICAgICAgICAgIElJT01ldGFkYXRhIG1ldGFkYXRhKSB7CiAgICAgICAgIGlmIChpbWFnZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbWFnZSBzaG91bGQgbm90IGJlIE5VTEwiKTsKICAgICAgICAgfQpAQCAtNjQsMTMgKzc5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IElJT0ltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBSYXN0ZXIsIGxpc3Qgb2YKLSAgICAgKiB0aHVtYm5haWxzIGFuZCBtZXRhZGF0YS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSUlPSW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIFJhc3RlciwgbGlzdCBvZiB0aHVtYm5haWxzCisgICAgICogYW5kIG1ldGFkYXRhLgogICAgICAqIAotICAgICAqIEBwYXJhbSByYXN0ZXIgdGhlIFJhc3Rlci4KLSAgICAgKiBAcGFyYW0gdGh1bWJuYWlscyB0aGUgbGlzdCBvZiBCdWZmZXJlZEltYWdlIG9iamVjdHMgd2hpY2ggCi0gICAgICogcmVwcmVzZW50IHRoZSB0aHVtYm5haWxzIG9mIFJhc3RlciBkYXRhLgotICAgICAqIEBwYXJhbSBtZXRhZGF0YSB0aGUgbWV0YWRhdGEuCisgICAgICogQHBhcmFtIHJhc3RlcgorICAgICAqICAgICAgICAgICAgdGhlIFJhc3Rlci4KKyAgICAgKiBAcGFyYW0gdGh1bWJuYWlscworICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgQnVmZmVyZWRJbWFnZSBvYmplY3RzIHdoaWNoIHJlcHJlc2VudCB0aGUKKyAgICAgKiAgICAgICAgICAgIHRodW1ibmFpbHMgb2YgUmFzdGVyIGRhdGEuCisgICAgICogQHBhcmFtIG1ldGFkYXRhCisgICAgICogICAgICAgICAgICB0aGUgbWV0YWRhdGEuCiAgICAgICovCiAgICAgcHVibGljIElJT0ltYWdlKFJhc3RlciByYXN0ZXIsIExpc3Q8PyBleHRlbmRzIEJ1ZmZlcmVkSW1hZ2U+IHRodW1ibmFpbHMsIElJT01ldGFkYXRhIG1ldGFkYXRhKSB7CiAgICAgICAgIGlmIChyYXN0ZXIgPT0gbnVsbCkgewpAQCAtODMsMTEgKzEwMSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIFJlbmRlcmVkSW1hZ2Ugb2JqZWN0IG9yIHJldHVybnMgbnVsbCBpZiB0aGlzIElJT0ltYWdlIAotICAgICAqIG9iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggYSBSYXN0ZXIuCisgICAgICogR2V0cyB0aGUgUmVuZGVyZWRJbWFnZSBvYmplY3Qgb3IgcmV0dXJucyBudWxsIGlmIHRoaXMgSUlPSW1hZ2Ugb2JqZWN0IGlzCisgICAgICogYXNzb2NpYXRlZCB3aXRoIGEgUmFzdGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFJlbmRlcmVkSW1hZ2Ugb2JqZWN0IG9yIG51bGwgaWYgdGhpcyBJSU9JbWFnZSAKLSAgICAgKiBvYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGEgUmFzdGVyLgorICAgICAqIEByZXR1cm4gdGhlIFJlbmRlcmVkSW1hZ2Ugb2JqZWN0IG9yIG51bGwgaWYgdGhpcyBJSU9JbWFnZSBvYmplY3QgaXMKKyAgICAgKiAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBhIFJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgUmVuZGVyZWRJbWFnZSBnZXRSZW5kZXJlZEltYWdlKCkgewogICAgICAgICByZXR1cm4gaW1hZ2U7CkBAIC05Niw3ICsxMTQsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIFJlbmRlcmVkSW1hZ2UgdG8gdGhpcyBJSU9JbWFnZSBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlIHRoZSBSZW5kZXJlZEltYWdlIHRvIGJlIHNldCB0byB0aGlzIElJT0ltYWdlLgorICAgICAqIEBwYXJhbSBpbWFnZQorICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmVkSW1hZ2UgdG8gYmUgc2V0IHRvIHRoaXMgSUlPSW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UmVuZGVyZWRJbWFnZShSZW5kZXJlZEltYWdlIGltYWdlKSB7CiAgICAgICAgIGlmIChpbWFnZSA9PSBudWxsKSB7CkBAIC0xMDcsMTEgKzEyNiwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgSUlPSW1hZ2Ugb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIFJhc3Rlciwgb3IgCi0gICAgICogZmFsc2UgaWYgaXQncyBhc3NvY2lhdGVkIHdpdGggYSBSZW5kZXJlZEltYWdlLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgSUlPSW1hZ2Ugb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIFJhc3Rlciwgb3IgZmFsc2UgaWYKKyAgICAgKiBpdCdzIGFzc29jaWF0ZWQgd2l0aCBhIFJlbmRlcmVkSW1hZ2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBJSU9JbWFnZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgUmFzdGVyLCBvciAKLSAgICAgKiBmYWxzZSBpZiBpdCdzIGFzc29jaWF0ZWQgd2l0aCBhIFJlbmRlcmVkSW1hZ2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgSUlPSW1hZ2Ugb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIFJhc3Rlciwgb3IgZmFsc2UKKyAgICAgKiAgICAgICAgIGlmIGl0J3MgYXNzb2NpYXRlZCB3aXRoIGEgUmVuZGVyZWRJbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNSYXN0ZXIoKSB7CiAgICAgICAgIHJldHVybiByYXN0ZXIgIT0gbnVsbDsKQEAgLTEyMSw4ICsxNDAsOCBAQAogICAgICAqIEdldHMgdGhlIFJhc3RlciBvYmplY3Qgb3IgcmV0dXJucyBudWxsIGlmIHRoaXMgSUlPSW1hZ2Ugb2JqZWN0IGlzCiAgICAgICogYXNzb2NpYXRlZCB3aXRoIGEgUmVuZGVyZWRJbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBSYXN0ZXIgb3IgbnVsbCBpZiB0aGlzIElJT0ltYWdlIG9iamVjdAotICAgICAqIGlzIGFzc29jaWF0ZWQgd2l0aCBhIFJlbmRlcmVkSW1hZ2UuCisgICAgICogQHJldHVybiB0aGUgUmFzdGVyIG9yIG51bGwgaWYgdGhpcyBJSU9JbWFnZSBvYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGEKKyAgICAgKiAgICAgICAgIFJlbmRlcmVkSW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIFJhc3RlciBnZXRSYXN0ZXIoKSB7CiAgICAgICAgIHJldHVybiByYXN0ZXI7CkBAIC0xMzEsNyArMTUwLDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBSYXN0ZXIgdG8gdGhlIElJT0ltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSByYXN0ZXIgdGhlIG5ldyBSYXN0ZXIgdG8gdGhlIElJT0ltYWdlLgorICAgICAqIEBwYXJhbSByYXN0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgUmFzdGVyIHRvIHRoZSBJSU9JbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRSYXN0ZXIoUmFzdGVyIHJhc3RlcikgewogICAgICAgICBpZiAocmFzdGVyID09IG51bGwpIHsKQEAgLTE1Myw4ICsxNzMsOCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHRodW1ibmFpbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggaW4gdGhlIGxpc3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgdGh1bWJuYWlsIGluIHRoZSBsaXN0LgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSB0aHVtYm5haWwgaW4gdGhlIGxpc3QuCiAgICAgICogQHJldHVybiB0aGUgdGh1bWJuYWlsIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleCBpbiB0aGUgbGlzdC4KICAgICAgKi8KICAgICBwdWJsaWMgQnVmZmVyZWRJbWFnZSBnZXRUaHVtYm5haWwoaW50IGluZGV4KSB7CkBAIC0xNzYsOCArMTk2LDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIHRodW1ibmFpbHMgaW1hZ2VzIHRvIHRoaXMgSUlPSW1hZ2Ugb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB0aHVtYm5haWxzIHRoZSBsaXN0IG9mIEJ1ZmZlcmVkSW1hZ2Ugd2hpY2ggcmVwcmVzZW50Ci0gICAgICogdGh1bWJuYWlscy4KKyAgICAgKiBAcGFyYW0gdGh1bWJuYWlscworICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgQnVmZmVyZWRJbWFnZSB3aGljaCByZXByZXNlbnQgdGh1bWJuYWlscy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUaHVtYm5haWxzKExpc3Q8PyBleHRlbmRzIEJ1ZmZlcmVkSW1hZ2U+IHRodW1ibmFpbHMpIHsKICAgICAgICAgdGhpcy50aHVtYm5haWxzID0gdGh1bWJuYWlsczsKQEAgLTE5NSw3ICsyMTUsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIG1ldGFkYXRhIHRvIHRoaXMgSUlPSW1hZ2Ugb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBtZXRhZGF0YSB0aGUgSUlPTWV0YWRhdGEsIG9yIG51bGwuCisgICAgICogQHBhcmFtIG1ldGFkYXRhCisgICAgICogICAgICAgICAgICB0aGUgSUlPTWV0YWRhdGEsIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TWV0YWRhdGEoSUlPTWV0YWRhdGEgbWV0YWRhdGEpIHsKICAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vSUlPUGFyYW0uamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL0lJT1BhcmFtLmphdmEKaW5kZXggZDk5OGI2ZS4uMmNjYzk0NSAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vSUlPUGFyYW0uamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9JSU9QYXJhbS5qYXZhCkBAIC0xOCw1NiArMTgsODAgQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW87CiAKIGltcG9ydCBqYXZhLmF3dC4qOwogCiAvKioKLSAqIFRoZSBJSU9QYXJhbSBhYnN0cmFjdCBjbGFzcyBpcyBzdXBlcmNsYXNzIGZvciAgICAgCi0gKiBJbWFnZVJlYWRQYXJhbSBhbmQgSW1hZ2VXcml0ZVBhcmFtIGNsYXNzZXMgYW5kIHByb3ZpZGVzIAotICogbWV0aG9kcyBhbmQgdmFyaWFibGVzIHdoaWNoIHRoZXkgc2hhcmUuCisgKiBUaGUgSUlPUGFyYW0gYWJzdHJhY3QgY2xhc3MgaXMgc3VwZXJjbGFzcyBmb3IgSW1hZ2VSZWFkUGFyYW0gYW5kCisgKiBJbWFnZVdyaXRlUGFyYW0gY2xhc3NlcyBhbmQgcHJvdmlkZXMgbWV0aG9kcyBhbmQgdmFyaWFibGVzIHdoaWNoIHRoZXkgc2hhcmUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSUlPUGFyYW0gewotICAgIAotICAgIC8qKiBUaGUgc291cmNlIHJlZ2lvbi4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBzb3VyY2UgcmVnaW9uLgorICAgICAqLwogICAgIHByb3RlY3RlZCBSZWN0YW5nbGUgc291cmNlUmVnaW9uOwotICAgIAotICAgIC8qKiBUaGUgc291cmNlIHggc3Vic2FtcGxpbmcuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlIHggc3Vic2FtcGxpbmcuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBzb3VyY2VYU3Vic2FtcGxpbmcgPSAxOwotICAgIAotICAgIC8qKiBUaGUgc291cmNlIHkgc3Vic2FtcGxpbmcuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlIHkgc3Vic2FtcGxpbmcuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBzb3VyY2VZU3Vic2FtcGxpbmcgPSAxOwotICAgIAotICAgIC8qKiBUaGUgc3Vic2FtcGxpbmcgeCBvZmZzZXQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3Vic2FtcGxpbmcgeCBvZmZzZXQuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBzdWJzYW1wbGluZ1hPZmZzZXQ7Ci0gICAgCi0gICAgLyoqIFRoZSBzdWJzYW1wbGluZyB5IG9mZnNldC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBzdWJzYW1wbGluZyB5IG9mZnNldC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHN1YnNhbXBsaW5nWU9mZnNldDsKLSAgICAKLSAgICAvKiogVGhlIHNvdXJjZSBiYW5kcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBzb3VyY2UgYmFuZHMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludFtdIHNvdXJjZUJhbmRzOwotICAgIAotICAgIC8qKiBUaGUgZGVzdGluYXRpb24gdHlwZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBkZXN0aW5hdGlvbiB0eXBlLgorICAgICAqLwogICAgIHByb3RlY3RlZCBJbWFnZVR5cGVTcGVjaWZpZXIgZGVzdGluYXRpb25UeXBlOwotICAgIAotICAgIC8qKiBUaGUgZGVzdGluYXRpb24gb2Zmc2V0LiAqLworCisgICAgLyoqCisgICAgICogVGhlIGRlc3RpbmF0aW9uIG9mZnNldC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgUG9pbnQgZGVzdGluYXRpb25PZmZzZXQgPSBuZXcgUG9pbnQoMCwgMCk7Ci0gICAgCi0gICAgLyoqIFRoZSBkZWZhdWx0IGNvbnRyb2xsZXIuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBjb250cm9sbGVyLgorICAgICAqLwogICAgIHByb3RlY3RlZCBJSU9QYXJhbUNvbnRyb2xsZXIgZGVmYXVsdENvbnRyb2xsZXI7Ci0gICAgCi0gICAgLyoqIFRoZSBjb250cm9sbGVyLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGNvbnRyb2xsZXIuCisgICAgICovCiAgICAgcHJvdGVjdGVkIElJT1BhcmFtQ29udHJvbGxlciBjb250cm9sbGVyOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IElJT1BhcmFtLgogICAgICAqLwotICAgIHByb3RlY3RlZCBJSU9QYXJhbSgpIHt9CisgICAgcHJvdGVjdGVkIElJT1BhcmFtKCkgeworICAgIH0KIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHNvdXJjZSByZWdpb24gYXMgYSBSZWN0YW5nbGUgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2VSZWdpb24gdGhlIFJlY3RhbmdsZSB3aGljaCBzcGVjaWZpZXMgdGhlIHNvdXJjZSByZWdpb24uCisgICAgICogQHBhcmFtIHNvdXJjZVJlZ2lvbgorICAgICAqICAgICAgICAgICAgdGhlIFJlY3RhbmdsZSB3aGljaCBzcGVjaWZpZXMgdGhlIHNvdXJjZSByZWdpb24uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U291cmNlUmVnaW9uKFJlY3RhbmdsZSBzb3VyY2VSZWdpb24pIHsKICAgICAgICAgaWYgKHNvdXJjZVJlZ2lvbiAhPSBudWxsKSB7CkBAIC05MSw4ICsxMTUsOCBAQAogICAgICAgICAgICAgaWYgKHNvdXJjZVJlZ2lvbi5oZWlnaHQgPD0gc3Vic2FtcGxpbmdZT2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaGVpZ2h0IDw9IHN1YnNhbXBsaW5nWE9mZnNldCIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8tLSBjbG9uZSBpdCB0byBhdm9pZCB1bmV4cGVjdGVkIG1vZGlmaWNhdGlvbnMKLSAgICAgICAgICAgIHRoaXMuc291cmNlUmVnaW9uID0gKFJlY3RhbmdsZSkgc291cmNlUmVnaW9uLmNsb25lKCk7CisgICAgICAgICAgICAvLyAtLSBjbG9uZSBpdCB0byBhdm9pZCB1bmV4cGVjdGVkIG1vZGlmaWNhdGlvbnMKKyAgICAgICAgICAgIHRoaXMuc291cmNlUmVnaW9uID0gKFJlY3RhbmdsZSlzb3VyY2VSZWdpb24uY2xvbmUoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRoaXMuc291cmNlUmVnaW9uID0gbnVsbDsKICAgICAgICAgfQpAQCAtMTA3LDI0ICsxMzEsMjYgQEAKICAgICAgICAgaWYgKHNvdXJjZVJlZ2lvbiA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICAvLy0tIGNsb25lIGl0IHRvIGF2b2lkIHVuZXhwZWN0ZWQgbW9kaWZpY2F0aW9ucwotICAgICAgICByZXR1cm4gKFJlY3RhbmdsZSkgc291cmNlUmVnaW9uLmNsb25lKCk7CisgICAgICAgIC8vIC0tIGNsb25lIGl0IHRvIGF2b2lkIHVuZXhwZWN0ZWQgbW9kaWZpY2F0aW9ucworICAgICAgICByZXR1cm4gKFJlY3RhbmdsZSlzb3VyY2VSZWdpb24uY2xvbmUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzb3VyY2Ugc3Vic2FtcGxpbmcuIFRoZSBzb3VyY2VYU3Vic2FtcGxpbmcgYW5kIAotICAgICAqIHNvdXJjZVlTdWJzYW1wbGluZyBwYXJhbWV0ZXJzIHNwZWNpZnkgdGhlIG51bWJlciBvZiByb3dzIAotICAgICAqIGFuZCBjb2x1bW5zIHRvIGFkdmFuY2UgYWZ0ZXIgZXZlcnkgc291cmNlIHBpeGVsLgorICAgICAqIFNldHMgdGhlIHNvdXJjZSBzdWJzYW1wbGluZy4gVGhlIHNvdXJjZVhTdWJzYW1wbGluZyBhbmQKKyAgICAgKiBzb3VyY2VZU3Vic2FtcGxpbmcgcGFyYW1ldGVycyBzcGVjaWZ5IHRoZSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyB0bworICAgICAqIGFkdmFuY2UgYWZ0ZXIgZXZlcnkgc291cmNlIHBpeGVsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2VYU3Vic2FtcGxpbmcgdGhlIHNvdXJjZSBYIHN1YnNhbXBsaW5nLgotICAgICAqIEBwYXJhbSBzb3VyY2VZU3Vic2FtcGxpbmcgdGhlIHNvdXJjZSBZIHN1YnNhbXBsaW5nLgotICAgICAqIEBwYXJhbSBzdWJzYW1wbGluZ1hPZmZzZXQgdGhlIHN1YnNhbXBsaW5nIFggb2Zmc2V0LgotICAgICAqIEBwYXJhbSBzdWJzYW1wbGluZ1lPZmZzZXQgdGhlIHN1YnNhbXBsaW5nIFkgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBzb3VyY2VYU3Vic2FtcGxpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgWCBzdWJzYW1wbGluZy4KKyAgICAgKiBAcGFyYW0gc291cmNlWVN1YnNhbXBsaW5nCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIFkgc3Vic2FtcGxpbmcuCisgICAgICogQHBhcmFtIHN1YnNhbXBsaW5nWE9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIHN1YnNhbXBsaW5nIFggb2Zmc2V0LgorICAgICAqIEBwYXJhbSBzdWJzYW1wbGluZ1lPZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdWJzYW1wbGluZyBZIG9mZnNldC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VTdWJzYW1wbGluZyhpbnQgc291cmNlWFN1YnNhbXBsaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZVlTdWJzYW1wbGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJzYW1wbGluZ1hPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Vic2FtcGxpbmdZT2Zmc2V0KSB7CisgICAgcHVibGljIHZvaWQgc2V0U291cmNlU3Vic2FtcGxpbmcoaW50IHNvdXJjZVhTdWJzYW1wbGluZywgaW50IHNvdXJjZVlTdWJzYW1wbGluZywKKyAgICAgICAgICAgIGludCBzdWJzYW1wbGluZ1hPZmZzZXQsIGludCBzdWJzYW1wbGluZ1lPZmZzZXQpIHsKIAogICAgICAgICBpZiAoc291cmNlWFN1YnNhbXBsaW5nIDw9IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNvdXJjZVhTdWJzYW1wbGluZyA8PSAwIik7CkBAIC0xNDEsMTAgKzE2NywxMCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic3Vic2FtcGxpbmdZT2Zmc2V0IGlzIHdyb25nIik7CiAgICAgICAgIH0KIAotICAgICAgICAvLy0tIGRvZXMgcmVnaW9uIGNvbnRhaW4gcGl4ZWxzCisgICAgICAgIC8vIC0tIGRvZXMgcmVnaW9uIGNvbnRhaW4gcGl4ZWxzCiAgICAgICAgIGlmIChzb3VyY2VSZWdpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHNvdXJjZVJlZ2lvbi53aWR0aCA8PSBzdWJzYW1wbGluZ1hPZmZzZXQgfHwKLSAgICAgICAgICAgICAgICAgICAgc291cmNlUmVnaW9uLmhlaWdodCA8PSBzdWJzYW1wbGluZ1lPZmZzZXQpIHsKKyAgICAgICAgICAgIGlmIChzb3VyY2VSZWdpb24ud2lkdGggPD0gc3Vic2FtcGxpbmdYT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgIHx8IHNvdXJjZVJlZ2lvbi5oZWlnaHQgPD0gc3Vic2FtcGxpbmdZT2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGhlcmUgYXJlIG5vIHBpeGVscyBpbiByZWdpb24iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTU2LDggKzE4Miw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc291cmNlIFggc3Vic2FtcGxpbmcgLSB0aGUgbnVtYmVyIG9mIHNvdXJjZSAKLSAgICAgKiBjb2x1bW5zIHRvIGFkdmFuY2UgZm9yIGVhY2ggcGl4ZWwuCisgICAgICogR2V0cyB0aGUgc291cmNlIFggc3Vic2FtcGxpbmcgLSB0aGUgbnVtYmVyIG9mIHNvdXJjZSBjb2x1bW5zIHRvIGFkdmFuY2UKKyAgICAgKiBmb3IgZWFjaCBwaXhlbC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2UgWCBzdWJzYW1wbGluZy4KICAgICAgKi8KQEAgLTE2Niw4ICsxOTIsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNvdXJjZSBZIHN1YnNhbXBsaW5nIC0gdGhlIG51bWJlciBvZiBzb3VyY2UgCi0gICAgICogcm93cyB0byBhZHZhbmNlIGZvciBlYWNoIHBpeGVsLgorICAgICAqIEdldHMgdGhlIHNvdXJjZSBZIHN1YnNhbXBsaW5nIC0gdGhlIG51bWJlciBvZiBzb3VyY2Ugcm93cyB0byBhZHZhbmNlIGZvcgorICAgICAqIGVhY2ggcGl4ZWwuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgc291cmNlIFkgc3Vic2FtcGxpbmcuCiAgICAgICovCkBAIC0xOTYsNyArMjIyLDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBpbmRpY2VzIG9mIHRoZSBzb3VyY2UgYmFuZHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZUJhbmRzIHRoZSBpbmRpY2VzIG9mIHRoZSBzb3VyY2UgYmFuZHMuCisgICAgICogQHBhcmFtIHNvdXJjZUJhbmRzCisgICAgICogICAgICAgICAgICB0aGUgaW5kaWNlcyBvZiB0aGUgc291cmNlIGJhbmRzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZUJhbmRzKGludFtdIHNvdXJjZUJhbmRzKSB7CiAgICAgICAgIC8vIFRPRE8gaW1wbGVtZW50CkBAIC0yMTYsNyArMjQzLDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgSW1hZ2VUeXBlU3BlY2lmaWVyIGZvciB0aGUgZGVzdGluYXRpb24gaW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uVHlwZSB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyLgorICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvblR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVR5cGVTcGVjaWZpZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RGVzdGluYXRpb25UeXBlKEltYWdlVHlwZVNwZWNpZmllciBkZXN0aW5hdGlvblR5cGUpIHsKICAgICAgICAgLy8gVE9ETyBpbXBsZW1lbnQKQEAgLTIyNSw3ICsyNTMsNyBAQAogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2UgYXMgYW4gSW1hZ2VUeXBlU3BlY2lmaWVyLiAuCi0gICAgICogIAorICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIEltYWdlVHlwZVNwZWNpZmllci4KICAgICAgKi8KICAgICBwdWJsaWMgSW1hZ2VUeXBlU3BlY2lmaWVyIGdldERlc3RpbmF0aW9uVHlwZSgpIHsKQEAgLTIzNCwxOCArMjYyLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSB3aGVyZSAKLSAgICAgKiB0aGUgZGVjb2RlZCBwaXhlbHMgYXJlIHBsYWNlZCBhcyBhIHJlc3VsdCBvZiByZWFkaW5nLCAKLSAgICAgKiBvciBzcGVjaWZpZWQgYW4gYXJlYSB0byBiZSB3cml0dGVuIHdoaWxlIHdyaXRpbmcgb3BlcmF0aW9uLgorICAgICAqIFNldHMgdGhlIG9mZnNldCBpbiB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugd2hlcmUgdGhlIGRlY29kZWQgcGl4ZWxzIGFyZQorICAgICAqIHBsYWNlZCBhcyBhIHJlc3VsdCBvZiByZWFkaW5nLCBvciBzcGVjaWZpZWQgYW4gYXJlYSB0byBiZSB3cml0dGVuIHdoaWxlCisgICAgICogd3JpdGluZyBvcGVyYXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uT2Zmc2V0IHRoZSBkZXN0aW5hdGlvbiBvZmZzZXQuCisgICAgICogQHBhcmFtIGRlc3RpbmF0aW9uT2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gb2Zmc2V0LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERlc3RpbmF0aW9uT2Zmc2V0KFBvaW50IGRlc3RpbmF0aW9uT2Zmc2V0KSB7CiAgICAgICAgIGlmIChkZXN0aW5hdGlvbk9mZnNldCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkZXN0aW5hdGlvbk9mZnNldCA9PSBudWxsISIpOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLmRlc3RpbmF0aW9uT2Zmc2V0ID0gKFBvaW50KSBkZXN0aW5hdGlvbk9mZnNldC5jbG9uZSgpOworCisgICAgICAgIHRoaXMuZGVzdGluYXRpb25PZmZzZXQgPSAoUG9pbnQpZGVzdGluYXRpb25PZmZzZXQuY2xvbmUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI1NCwxNCArMjgzLDE1IEBACiAgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgUG9pbnQgZ2V0RGVzdGluYXRpb25PZmZzZXQoKSB7Ci0gICAgICAgIHJldHVybiAoUG9pbnQpIGRlc3RpbmF0aW9uT2Zmc2V0LmNsb25lKCk7ICAgICAgICAKKyAgICAgICAgcmV0dXJuIChQb2ludClkZXN0aW5hdGlvbk9mZnNldC5jbG9uZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIElJT1BhcmFtQ29udHJvbGxlciB0byB0aGlzIElJT1BhcmFtIG9iamVjdCBmb3IKLSAgICAgKiBwcm92aWRpbmcgc2V0dGluZ3MgdG8gdGhpcyBJSU9QYXJhbS4KKyAgICAgKiBTZXRzIHRoZSBJSU9QYXJhbUNvbnRyb2xsZXIgdG8gdGhpcyBJSU9QYXJhbSBvYmplY3QgZm9yIHByb3ZpZGluZworICAgICAqIHNldHRpbmdzIHRvIHRoaXMgSUlPUGFyYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbnRyb2xsZXIgdGhlIG5ldyBJSU9QYXJhbUNvbnRyb2xsZXIuCisgICAgICogQHBhcmFtIGNvbnRyb2xsZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgSUlPUGFyYW1Db250cm9sbGVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbnRyb2xsZXIoSUlPUGFyYW1Db250cm9sbGVyIGNvbnRyb2xsZXIpIHsKICAgICAgICAgLy8gVE9ETyBpbXBsZW1lbnQKQEAgLTI2OSwxMSArMjk5LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50IElJT1BhcmFtQ29udHJvbGxlciBjb250cm9sbGVyIAotICAgICAqIGZvciB0aGlzIElJT1BhcmFtLgorICAgICAqIEdldHMgdGhlIGN1cnJlbnQgSUlPUGFyYW1Db250cm9sbGVyIGNvbnRyb2xsZXIgZm9yIHRoaXMgSUlPUGFyYW0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBJSU9QYXJhbUNvbnRyb2xsZXIgY29udHJvbGxlciAKLSAgICAgKiBmb3IgdGhpcyBJSU9QYXJhbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IElJT1BhcmFtQ29udHJvbGxlciBjb250cm9sbGVyIGZvciB0aGlzIElJT1BhcmFtLgogICAgICAqLwogICAgIHB1YmxpYyBJSU9QYXJhbUNvbnRyb2xsZXIgZ2V0Q29udHJvbGxlcigpIHsKICAgICAgICAgLy8gVE9ETyBpbXBsZW1lbnQKQEAgLTI4MSwxMSArMzA5LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVmYXVsdCBJSU9QYXJhbUNvbnRyb2xsZXIgY29udHJvbGxlciAKLSAgICAgKiBmb3IgdGhpcyBJSU9QYXJhbS4KKyAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IElJT1BhcmFtQ29udHJvbGxlciBjb250cm9sbGVyIGZvciB0aGlzIElJT1BhcmFtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgSUlPUGFyYW1Db250cm9sbGVyIGNvbnRyb2xsZXIgCi0gICAgICogZm9yIHRoaXMgSUlPUGFyYW0sIG9yIG51bGwuCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBJSU9QYXJhbUNvbnRyb2xsZXIgY29udHJvbGxlciBmb3IgdGhpcyBJSU9QYXJhbSwgb3IKKyAgICAgKiAgICAgICAgIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIElJT1BhcmFtQ29udHJvbGxlciBnZXREZWZhdWx0Q29udHJvbGxlcigpIHsKICAgICAgICAgLy8gVE9ETyBpbXBsZW1lbnQKQEAgLTI5MywxMSArMzIwLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIElJT1BhcmFtQ29udHJvbGxlciBpcyBpbnN0YWxsZWQgZm9yIAotICAgICAqIHRoaXMgSUlPUGFyYW0uIAorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBJSU9QYXJhbUNvbnRyb2xsZXIgaXMgaW5zdGFsbGVkIGZvciB0aGlzIElJT1BhcmFtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBJSU9QYXJhbUNvbnRyb2xsZXIgaXMgaW5zdGFsbGVkIGZvciAKLSAgICAgKiB0aGlzIElJT1BhcmFtLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBJSU9QYXJhbUNvbnRyb2xsZXIgaXMgaW5zdGFsbGVkIGZvciB0aGlzIElJT1BhcmFtLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbnRyb2xsZXIoKSB7CiAgICAgICAgIC8vIFRPRE8gaW1wbGVtZW50CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9JSU9QYXJhbUNvbnRyb2xsZXIuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL0lJT1BhcmFtQ29udHJvbGxlci5qYXZhCmluZGV4IDMxNTIyYzEuLjMzOGNiMjUgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL0lJT1BhcmFtQ29udHJvbGxlci5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL0lJT1BhcmFtQ29udHJvbGxlci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIFNlcmdleSBJLiBTYWxpc2hldgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjIgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2VpbzsKIAogLyogCkBAIC0yNiwxOCArMjcsMTkgQEAKICAqLwogCiAvKioKLSAqIFRoZSBJSU9QYXJhbUNvbnRyb2xsZXIgc3BlY2lmaWVzIGFuIGFjdGl2YXRlIG1ldGhvZCB0aGF0IGludm9rZXMgdGhlIAorICogVGhlIElJT1BhcmFtQ29udHJvbGxlciBzcGVjaWZpZXMgYW4gYWN0aXZhdGUgbWV0aG9kIHRoYXQgaW52b2tlcyB0aGUKICAqIGNvbnRyb2xsZXIuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElJT1BhcmFtQ29udHJvbGxlciB7CiAKICAgICAvKioKLSAgICAgKiBBY3RpdmF0ZXMgdGhlIGNvbnRyb2xsZXIuIAorICAgICAqIEFjdGl2YXRlcyB0aGUgY29udHJvbGxlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIElJT1BhcmFtLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgSUlPUGFyYW0gaGFzIGJlZW4gbW9kaWZpZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJSU9QYXJhbS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBJSU9QYXJhbSBoYXMgYmVlbiBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIGJvb2xlYW4gYWN0aXZhdGUoSUlPUGFyYW0gcGFyYW0pOwogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9JbWFnZUlPLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9JbWFnZUlPLmphdmEKaW5kZXggZDRjZDFkZC4uZTBkN2VjOSAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vSW1hZ2VJTy5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlSU8uamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBSdXN0ZW0gVi4gUmFmaWtvdgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2VpbzsKIAogaW1wb3J0IGphdmF4LmltYWdlaW8uc3RyZWFtLkltYWdlSW5wdXRTdHJlYW07CkBAIC0zNCw0NCArMzUsNDcgQEAKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiAKIC8qKgotICogVGhlIEltYWdlSU8gY2xhc3MgcHJvdmlkZXMgc3RhdGljIG1ldGhvZHMgdG8gcGVyZm9tIAotICogcmVhZGluZyBhbmQgd3JpdGluZyBvcGVyYXRpb25zIHVzaW5nIHJlZ2lzdGVyZWQKLSAqIEltYWdlUmVhZGVyIGFuZCBJbWFnZVdyaXRlciBvYmplY3RzLgorICogVGhlIEltYWdlSU8gY2xhc3MgcHJvdmlkZXMgc3RhdGljIG1ldGhvZHMgdG8gcGVyZm9ybSByZWFkaW5nIGFuZCB3cml0aW5nCisgKiBvcGVyYXRpb25zIHVzaW5nIHJlZ2lzdGVyZWQgSW1hZ2VSZWFkZXIgYW5kIEltYWdlV3JpdGVyIG9iamVjdHMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgSW1hZ2VJTyB7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IHJlZ2lzdHJ5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb25zdGFudCByZWdpc3RyeS4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJSU9SZWdpc3RyeSByZWdpc3RyeSA9IElJT1JlZ2lzdHJ5LmdldERlZmF1bHRJbnN0YW5jZSgpOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGltYWdlIGlvLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbWFnZUlPLgogICAgICAqLwotICAgIHByaXZhdGUgSW1hZ2VJTygpIHt9Ci0gICAgCisgICAgcHJpdmF0ZSBJbWFnZUlPKCkgeworICAgIH0KIAogICAgIC8qKgotICAgICAqIFNjYW5zIGZvciBwbHVnLWlucyBpbiB0aGUgY2xhc3MgcGF0aCwgCi0gICAgICogbG9hZHMgc3BpIGNsYXNzZXMsIGFuZCByZWdpc3RlcnMgdGhlbSB3aXRoIHRoZSBJSU9SZWdpc3RyeS4KKyAgICAgKiBTY2FucyBmb3IgcGx1Zy1pbnMgaW4gdGhlIGNsYXNzIHBhdGgsIGxvYWRzIHNwaSBjbGFzc2VzLCBhbmQgcmVnaXN0ZXJzCisgICAgICogdGhlbSB3aXRoIHRoZSBJSU9SZWdpc3RyeS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2NhbkZvclBsdWdpbnMoKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgYSBjYWNoZSBmaWxlIGlzIHVzZWQgd2hlbiAKLSAgICAgKiBjcmVhdGluZyBJbWFnZUlucHV0U3RyZWFtcyBhbmQgSW1hZ2VPdXRwdXRTdHJlYW1zIG9yIG5vdC4KKyAgICAgKiBTZXRzIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgYSBjYWNoZSBmaWxlIGlzIHVzZWQgd2hlbiBjcmVhdGluZworICAgICAqIEltYWdlSW5wdXRTdHJlYW1zIGFuZCBJbWFnZU91dHB1dFN0cmVhbXMgb3Igbm90LgogICAgICAqIAotICAgICAqIEBwYXJhbSB1c2VDYWNoZSB0aGUgdXNlIGNhY2hlIGZsYWcuCisgICAgICogQHBhcmFtIHVzZUNhY2hlCisgICAgICogICAgICAgICAgICB0aGUgdXNlIGNhY2hlIGZsYWcuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVzZUNhY2hlKGJvb2xlYW4gdXNlQ2FjaGUpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgYSBjYWNoZSBmaWxlIGlzIHVzZWQgd2hlbiAKLSAgICAgKiBjcmVhdGluZyBJbWFnZUlucHV0U3RyZWFtcyBhbmQgSW1hZ2VPdXRwdXRTdHJlYW1zIG9yIG5vdC4KLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIHdoaWNoIGlzIHNldCBieSBzZXRVc2VDYWNoZQotICAgICAqIG1ldGhvZC4KKyAgICAgKiBHZXRzIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIGEgY2FjaGUgZmlsZSBpcyB1c2VkIHdoZW4gY3JlYXRpbmcKKyAgICAgKiBJbWFnZUlucHV0U3RyZWFtcyBhbmQgSW1hZ2VPdXRwdXRTdHJlYW1zIG9yIG5vdC4gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUKKyAgICAgKiBjdXJyZW50IHZhbHVlIHdoaWNoIGlzIHNldCBieSBzZXRVc2VDYWNoZSBtZXRob2QuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgdXNlIGNhY2hlIGZsYWcuCiAgICAgICovCkBAIC04Myw0NCArODcsNDQgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBjYWNoZSBkaXJlY3RvcnkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNhY2hlRGlyZWN0b3J5IHRoZSBGaWxlIHdoaWNoIHNwZWNpZmllcyBhIGNhY2hlIGRpcmVjdG9yeS4KKyAgICAgKiBAcGFyYW0gY2FjaGVEaXJlY3RvcnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBGaWxlIHdoaWNoIHNwZWNpZmllcyBhIGNhY2hlIGRpcmVjdG9yeS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2FjaGVEaXJlY3RvcnkoRmlsZSBjYWNoZURpcmVjdG9yeSkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGlyZWN0b3J5IHdoZXJlIGNhY2hlIGZpbGVzIGFyZSBjcmVhdGVkLCByZXR1cm5lZAotICAgICAqIHRoZSBmaWxlIHdoaWNoIGlzIHNldCBieSBzZXRDYWNoZURpcmVjdG9yeSBtZXRob2QsIG9yIG51bGwuCisgICAgICogR2V0cyB0aGUgZGlyZWN0b3J5IHdoZXJlIGNhY2hlIGZpbGVzIGFyZSBjcmVhdGVkLCByZXR1cm5lZCB0aGUgZmlsZSB3aGljaAorICAgICAqIGlzIHNldCBieSBzZXRDYWNoZURpcmVjdG9yeSBtZXRob2QsIG9yIG51bGwuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgRmlsZSBvYmplY3Qgd2hpY2ggaXMgc2V0IGJ5IHNldENhY2hlRGlyZWN0b3J5IG1ldGhvZCwgCi0gICAgICogb3IgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBGaWxlIG9iamVjdCB3aGljaCBpcyBzZXQgYnkgc2V0Q2FjaGVEaXJlY3RvcnkgbWV0aG9kLCBvcgorICAgICAqICAgICAgICAgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0Q2FjaGVEaXJlY3RvcnkoKSB7CiAgICAgICAgIC8vIFRPRE8gaW1wbGVtZW50Ci0gICAgICAgIC8vLS0gbnVsbCBpbmRpY2F0ZXMgc3lzdGVtLWRlcCBkZWZhdWx0IHRlbXBvcmFyeSBkaXJlY3RvcnkKKyAgICAgICAgLy8gLS0gbnVsbCBpbmRpY2F0ZXMgc3lzdGVtLWRlcCBkZWZhdWx0IHRlbXBvcmFyeSBkaXJlY3RvcnkKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBJbWFnZUlucHV0U3RyZWFtIGZyb20gdGhlIHNwZWNpZmllZCBPYmplY3QuCi0gICAgICogVGhlIHNwZWNpZmllZCBPYmplY3Qgc2hvdWxkIG9idGFpbiB0aGUgaW5wdXQgc291cmNlCi0gICAgICogc3VjaCBhcyBGaWxlLCBvciBJbnB1dFN0cmVhbS4gICAKKyAgICAgKiBDcmVhdGVzIGFuIEltYWdlSW5wdXRTdHJlYW0gZnJvbSB0aGUgc3BlY2lmaWVkIE9iamVjdC4gVGhlIHNwZWNpZmllZAorICAgICAqIE9iamVjdCBzaG91bGQgb2J0YWluIHRoZSBpbnB1dCBzb3VyY2Ugc3VjaCBhcyBGaWxlLCBvciBJbnB1dFN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IE9iamVjdCBzdWNoIGFzIEZpbGUsIG9yIElucHV0U3RyZWFtLiAgIAotICAgICAqIAorICAgICAqIEBwYXJhbSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IE9iamVjdCBzdWNoIGFzIEZpbGUsIG9yIElucHV0U3RyZWFtLgogICAgICAqIEByZXR1cm4gdGhlIEltYWdlSW5wdXRTdHJlYW0gb2JqZWN0LCBvciBudWxsLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gc2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlSW5wdXRTdHJlYW0gY3JlYXRlSW1hZ2VJbnB1dFN0cmVhbShPYmplY3QgaW5wdXQpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VJbnB1dFN0cmVhbSBjcmVhdGVJbWFnZUlucHV0U3RyZWFtKE9iamVjdCBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW5wdXQgc291cmNlIGNhbm5vdCBiZSBOVUxMIik7CiAgICAgICAgIH0KIAotICAgICAgICBJdGVyYXRvcjxJbWFnZUlucHV0U3RyZWFtU3BpPiBpdCA9IHJlZ2lzdHJ5LmdldFNlcnZpY2VQcm92aWRlcnMoSW1hZ2VJbnB1dFN0cmVhbVNwaS5jbGFzcywgdHJ1ZSk7CisgICAgICAgIEl0ZXJhdG9yPEltYWdlSW5wdXRTdHJlYW1TcGk+IGl0ID0gcmVnaXN0cnkuZ2V0U2VydmljZVByb3ZpZGVycyhJbWFnZUlucHV0U3RyZWFtU3BpLmNsYXNzLAorICAgICAgICAgICAgICAgIHRydWUpOwogCiAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgIEltYWdlSW5wdXRTdHJlYW1TcGkgc3BpID0gaXQubmV4dCgpOwpAQCAtMTMyLDIzICsxMzYsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIEltYWdlT3V0cHV0U3RyZWFtIHVzaW5nIHRoZSBzcGVjaWZpZWQgT2JqZWN0LgotICAgICAqIFRoZSBzcGVjaWZpZWQgT2JqZWN0IHNob3VsZCBvYnRhaW4gdGhlIG91dHB1dCBzb3VyY2UKLSAgICAgKiBzdWNoIGFzIEZpbGUsIG9yIE91dHB1dFN0cmVhbS4gICAKKyAgICAgKiBDcmVhdGVzIGFuIEltYWdlT3V0cHV0U3RyZWFtIHVzaW5nIHRoZSBzcGVjaWZpZWQgT2JqZWN0LiBUaGUgc3BlY2lmaWVkCisgICAgICogT2JqZWN0IHNob3VsZCBvYnRhaW4gdGhlIG91dHB1dCBzb3VyY2Ugc3VjaCBhcyBGaWxlLCBvciBPdXRwdXRTdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIG91dHB1dCB0aGUgb3V0cHV0IE9iamVjdCBzdWNoIGFzIEZpbGUsIG9yIE91dHB1dFN0cmVhbS4gICAKLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3V0cHV0CisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IE9iamVjdCBzdWNoIGFzIEZpbGUsIG9yIE91dHB1dFN0cmVhbS4KICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZU91dHB1dFN0cmVhbSBvYmplY3QsIG9yIG51bGwuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBzaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VPdXRwdXRTdHJlYW0gY3JlYXRlSW1hZ2VPdXRwdXRTdHJlYW0oT2JqZWN0IG91dHB1dCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHN0YXRpYyBJbWFnZU91dHB1dFN0cmVhbSBjcmVhdGVJbWFnZU91dHB1dFN0cmVhbShPYmplY3Qgb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAob3V0cHV0ID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm91dHB1dCBkZXN0aW5hdGlvbiBjYW5ub3QgYmUgTlVMTCIpOwogICAgICAgICB9CiAKLSAgICAgICAgSXRlcmF0b3I8SW1hZ2VPdXRwdXRTdHJlYW1TcGk+IGl0ID0gcmVnaXN0cnkuZ2V0U2VydmljZVByb3ZpZGVycyhJbWFnZU91dHB1dFN0cmVhbVNwaS5jbGFzcywgdHJ1ZSk7CisgICAgICAgIEl0ZXJhdG9yPEltYWdlT3V0cHV0U3RyZWFtU3BpPiBpdCA9IHJlZ2lzdHJ5LmdldFNlcnZpY2VQcm92aWRlcnMoCisgICAgICAgICAgICAgICAgSW1hZ2VPdXRwdXRTdHJlYW1TcGkuY2xhc3MsIHRydWUpOwogCiAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgIEltYWdlT3V0cHV0U3RyZWFtU3BpIHNwaSA9IGl0Lm5leHQoKTsKQEAgLTE2MSw4ICsxNjQsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGFycmF5IG9mIGZvcm1hdCBuYW1lcyBhcyBTdHJpbmcgd2hpY2ggY2FuIGJlIAotICAgICAqIGRlY29kZWQgYnkgcmVnaXN0ZXJlZCBJbWFnZVJlYWRlciBvYmplY3RzLgorICAgICAqIEdldHMgdGhlIGFycmF5IG9mIGZvcm1hdCBuYW1lcyBhcyBTdHJpbmcgd2hpY2ggY2FuIGJlIGRlY29kZWQgYnkKKyAgICAgKiByZWdpc3RlcmVkIEltYWdlUmVhZGVyIG9iamVjdHMuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgZm9ybWF0IG5hbWVzLgogICAgICAqLwpAQCAtMTcxLDggKzE3NCw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgYXJyYXkgb2YgTUlNRSB0eXBlcyBhcyBTdHJpbmcgd2hpY2ggY2FuIGJlIAotICAgICAqIGRlY29kZWQgYnkgcmVnaXN0ZXJlZCBJbWFnZVJlYWRlciBvYmplY3RzLgorICAgICAqIEdldHMgdGhlIGFycmF5IG9mIE1JTUUgdHlwZXMgYXMgU3RyaW5nIHdoaWNoIGNhbiBiZSBkZWNvZGVkIGJ5IHJlZ2lzdGVyZWQKKyAgICAgKiBJbWFnZVJlYWRlciBvYmplY3RzLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIE1JTUUgdHlwZXMuCiAgICAgICovCkBAIC0xODEsMTMgKzE4NCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIEl0ZXJhdG9yIG9mIHJlZ2lzdGVyZWQgSW1hZ2VSZWFkZXIgd2hpY2ggYXJlIGFibGUgdG8gCi0gICAgICogZGVjb2RlIGFuIGltcHV0IGRhdGEgc3BlY2lmaWVkIGJ5IGlucHV0IE9iamVjdC4KKyAgICAgKiBHZXRzIHRoZSBJdGVyYXRvciBvZiByZWdpc3RlcmVkIEltYWdlUmVhZGVyIHdoaWNoIGFyZSBhYmxlIHRvIGRlY29kZSBhbgorICAgICAqIGlucHV0IGRhdGEgc3BlY2lmaWVkIGJ5IGlucHV0IE9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IE9iamVjdCB3aXRoIGVuY29kZWQgZGF0YSBzdWNoIGFzIAotICAgICAqIEltYWdlSW5wdXRTdHJlYW0gb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEl0ZXJhdG9yIG9mIHJlZ2lzdGVyZWQgSW1hZ2VSZWFkZXIuIAorICAgICAqIEBwYXJhbSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IE9iamVjdCB3aXRoIGVuY29kZWQgZGF0YSBzdWNoIGFzIEltYWdlSW5wdXRTdHJlYW0KKyAgICAgKiAgICAgICAgICAgIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBJdGVyYXRvciBvZiByZWdpc3RlcmVkIEltYWdlUmVhZGVyLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8SW1hZ2VSZWFkZXI+IGdldEltYWdlUmVhZGVycyhPYmplY3QgaW5wdXQpIHsKICAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHsKQEAgLTIwMSwxMSArMjA0LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgSXRlcmF0b3Igb2YgcmVnaXN0ZXJlZCBJbWFnZVJlYWRlciB3aGljaCBhcmUgYWJsZSB0byAKLSAgICAgKiBkZWNvZGUgdGhlIHNwZWNpZmllZCBmb3JtYXQuCisgICAgICogR2V0cyB0aGUgSXRlcmF0b3Igb2YgcmVnaXN0ZXJlZCBJbWFnZVJlYWRlciB3aGljaCBhcmUgYWJsZSB0byBkZWNvZGUgdGhlCisgICAgICogc3BlY2lmaWVkIGZvcm1hdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9ybWF0TmFtZSB0aGUgZm9ybWF0IG5hbWUgc3VjaCBhcyAianBlZyIsIG9yICJnaWYiLgotICAgICAqIAorICAgICAqIEBwYXJhbSBmb3JtYXROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZm9ybWF0IG5hbWUgc3VjaCBhcyAianBlZyIsIG9yICJnaWYiLgogICAgICAqIEByZXR1cm4gdGhlIEl0ZXJhdG9yIG9mIHJlZ2lzdGVyZWQgSW1hZ2VSZWFkZXIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJdGVyYXRvcjxJbWFnZVJlYWRlcj4gZ2V0SW1hZ2VSZWFkZXJzQnlGb3JtYXROYW1lKFN0cmluZyBmb3JtYXROYW1lKSB7CkBAIC0yMjAsMTEgKzIyMywxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIEl0ZXJhdG9yIHdoaWNoIGxpc3RzIHRoZSByZWdpc3RlcmVkIEltYWdlUmVhZGVyIG9iamVjdHMgdGhhdAotICAgICAqIGFyZSBhYmxlIHRvIGRlY29kZSBmaWxlcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LgorICAgICAqIEdldHMgdGhlIEl0ZXJhdG9yIHdoaWNoIGxpc3RzIHRoZSByZWdpc3RlcmVkIEltYWdlUmVhZGVyIG9iamVjdHMgdGhhdCBhcmUKKyAgICAgKiBhYmxlIHRvIGRlY29kZSBmaWxlcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlU3VmZml4IHRoZSBmaWxlIHN1ZmZpeCBzdWNoIGFzICJqcGciLgotICAgICAqIAorICAgICAqIEBwYXJhbSBmaWxlU3VmZml4CisgICAgICogICAgICAgICAgICB0aGUgZmlsZSBzdWZmaXggc3VjaCBhcyAianBnIi4KICAgICAgKiBAcmV0dXJuIHRoZSBJdGVyYXRvciBvZiByZWdpc3RlcmVkIEltYWdlUmVhZGVycy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEltYWdlUmVhZGVyPiBnZXRJbWFnZVJlYWRlcnNCeVN1ZmZpeChTdHJpbmcgZmlsZVN1ZmZpeCkgewpAQCAtMjM4LDExICsyNDEsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBJdGVyYXRvciBvZiByZWdpc3RlcmVkIEltYWdlUmVhZGVyIG9iamVjdHMgdGhhdAotICAgICAqIGFyZSBhYmxlIHRvIGRlY29kZSBmaWxlcyB3aXRoIHRoZSBzcGVjaWZpZWQgTUlNRSB0eXBlLgorICAgICAqIEdldHMgdGhlIEl0ZXJhdG9yIG9mIHJlZ2lzdGVyZWQgSW1hZ2VSZWFkZXIgb2JqZWN0cyB0aGF0IGFyZSBhYmxlIHRvCisgICAgICogZGVjb2RlIGZpbGVzIHdpdGggdGhlIHNwZWNpZmllZCBNSU1FIHR5cGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIE1JTUVUeXBlIHRoZSBNSU1FIHR5cGUgc3VjaCBhcyAiaW1hZ2UvanBlZyIuCi0gICAgICogCisgICAgICogQHBhcmFtIE1JTUVUeXBlCisgICAgICogICAgICAgICAgICB0aGUgTUlNRSB0eXBlIHN1Y2ggYXMgImltYWdlL2pwZWciLgogICAgICAqIEByZXR1cm4gdGhlIEl0ZXJhdG9yIG9mIHJlZ2lzdGVyZWQgSW1hZ2VSZWFkZXJzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8SW1hZ2VSZWFkZXI+IGdldEltYWdlUmVhZGVyc0J5TUlNRVR5cGUoU3RyaW5nIE1JTUVUeXBlKSB7CkBAIC0yNTAsOCArMjUzLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIFN0cmluZ3MgZ2l2aW5nIHRoZSBuYW1lcyBvZiB0aGUgZm9ybWF0cyBzdXBwb3J0ZWQgCi0gICAgICogYnkgcmVnaXN0ZXJlZCBJbWFnZVdyaXRlciBvYmplY3RzLgorICAgICAqIEdldHMgYW4gYXJyYXkgb2YgU3RyaW5ncyBnaXZpbmcgdGhlIG5hbWVzIG9mIHRoZSBmb3JtYXRzIHN1cHBvcnRlZCBieQorICAgICAqIHJlZ2lzdGVyZWQgSW1hZ2VXcml0ZXIgb2JqZWN0cy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBmb3JtYXQgbmFtZXMuCiAgICAgICovCkBAIC0yNjAsNyArMjYzLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIFN0cmluZ3MgZ2l2aW5nIHRoZSBNSU1FIHR5cGVzIG9mIHRoZSBmb3JtYXRzIHN1cHBvcnRlZCAKKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIFN0cmluZ3MgZ2l2aW5nIHRoZSBNSU1FIHR5cGVzIG9mIHRoZSBmb3JtYXRzIHN1cHBvcnRlZAogICAgICAqIGJ5IHJlZ2lzdGVyZWQgSW1hZ2VXcml0ZXIgb2JqZWN0cy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBNSU1FIHR5cGVzLgpAQCAtMjcwLDExICsyNzMsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBJdGVyYXRvciB3aGljaCBsaXN0cyB0aGUgcmVnaXN0ZXJlZCBJbWFnZVJlYWRlciBvYmplY3RzIHRoYXQKLSAgICAgKiBhcmUgYWJsZSB0byBlbmNvZGUgdGhlIHNwZWNpZmllZCBpbWFnZSBmb3JtYXQuCisgICAgICogR2V0cyB0aGUgSXRlcmF0b3Igd2hpY2ggbGlzdHMgdGhlIHJlZ2lzdGVyZWQgSW1hZ2VSZWFkZXIgb2JqZWN0cyB0aGF0IGFyZQorICAgICAqIGFibGUgdG8gZW5jb2RlIHRoZSBzcGVjaWZpZWQgaW1hZ2UgZm9ybWF0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBmb3JtYXROYW1lIHRoZSBpbWFnZSBmb3JtYXQgbmFtZSBzdWNoIGFzICJqcGVnIi4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZm9ybWF0TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGZvcm1hdCBuYW1lIHN1Y2ggYXMgImpwZWciLgogICAgICAqIEByZXR1cm4gdGhlIEl0ZXJhdG9yIG9mIHJlZ2lzdGVyZWQgSW1hZ2VXcml0ZXIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJdGVyYXRvcjxJbWFnZVdyaXRlcj4gZ2V0SW1hZ2VXcml0ZXJzQnlGb3JtYXROYW1lKFN0cmluZyBmb3JtYXROYW1lKSB7CkBAIC0yODksMTEgKzI5MiwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIEl0ZXJhdG9yIHdoaWNoIGxpc3RzIHRoZSByZWdpc3RlcmVkIEltYWdlUmVhZGVyIG9iamVjdHMgdGhhdAotICAgICAqIGFyZSBhYmxlIHRvIGVuY29kZSB0aGUgc3BlY2lmaWVkIHN1ZmZpeC4KKyAgICAgKiBHZXRzIHRoZSBJdGVyYXRvciB3aGljaCBsaXN0cyB0aGUgcmVnaXN0ZXJlZCBJbWFnZVJlYWRlciBvYmplY3RzIHRoYXQgYXJlCisgICAgICogYWJsZSB0byBlbmNvZGUgdGhlIHNwZWNpZmllZCBzdWZmaXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGZpbGVTdWZmaXggdGhlIGZpbGUgc3VmZml4IHN1Y2ggYXMgImpwZyIuCi0gICAgICogCisgICAgICogQHBhcmFtIGZpbGVTdWZmaXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlIHN1ZmZpeCBzdWNoIGFzICJqcGciLgogICAgICAqIEByZXR1cm4gdGhlIEl0ZXJhdG9yIG9mIHJlZ2lzdGVyZWQgSW1hZ2VXcml0ZXIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJdGVyYXRvcjxJbWFnZVdyaXRlcj4gZ2V0SW1hZ2VXcml0ZXJzQnlTdWZmaXgoU3RyaW5nIGZpbGVTdWZmaXgpIHsKQEAgLTMwNiwxMSArMzA5LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgSXRlcmF0b3Igd2hpY2ggbGlzdHMgdGhlIHJlZ2lzdGVyZWQgSW1hZ2VSZWFkZXIgb2JqZWN0cyB0aGF0Ci0gICAgICogYXJlIGFibGUgdG8gZW5jb2RlIHRoZSBzcGVjaWZpZWQgTUlNRSB0eXBlLgorICAgICAqIEdldHMgdGhlIEl0ZXJhdG9yIHdoaWNoIGxpc3RzIHRoZSByZWdpc3RlcmVkIEltYWdlUmVhZGVyIG9iamVjdHMgdGhhdCBhcmUKKyAgICAgKiBhYmxlIHRvIGVuY29kZSB0aGUgc3BlY2lmaWVkIE1JTUUgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gTUlNRVR5cGUgdGhlIE1JTUUgdHlwZSBzdWNoIGFzICJpbWFnZS9qcGVnIi4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gTUlNRVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBNSU1FIHR5cGUgc3VjaCBhcyAiaW1hZ2UvanBlZyIuCiAgICAgICogQHJldHVybiB0aGUgSXRlcmF0b3Igb2YgcmVnaXN0ZXJlZCBJbWFnZVdyaXRlci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEltYWdlV3JpdGVyPiBnZXRJbWFnZVdyaXRlcnNCeU1JTUVUeXBlKFN0cmluZyBNSU1FVHlwZSkgewpAQCAtMzE4LDEyICszMjEsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIEltYWdlV3JpdGVyIG9iamVjdCB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgCi0gICAgICogc3BlY2lmaWVkIEltYWdlUmVhZGVyLCBvciByZXR1cm5zIG51bGwgaWYgdGhlIHNwZWNpZmllZAotICAgICAqIEltYWdlUmVhZGVyIGlzIG5vdCByZWdpc3RlcmVkLiAKKyAgICAgKiBHZXRzIGFuIEltYWdlV3JpdGVyIG9iamVjdCB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgc3BlY2lmaWVkCisgICAgICogSW1hZ2VSZWFkZXIsIG9yIHJldHVybnMgbnVsbCBpZiB0aGUgc3BlY2lmaWVkIEltYWdlUmVhZGVyIGlzIG5vdAorICAgICAqIHJlZ2lzdGVyZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJlYWRlciB0aGUgc3BlY2lmaWVkIEltYWdlUmVhZGVyLgotICAgICAqIAorICAgICAqIEBwYXJhbSByZWFkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgSW1hZ2VSZWFkZXIuCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2VXcml0ZXIsIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJbWFnZVdyaXRlciBnZXRJbWFnZVdyaXRlcihJbWFnZVJlYWRlciByZWFkZXIpIHsKQEAgLTMzMSwxMiArMzM0LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIAotICAgICAqIHNwZWNpZmllZCBJbWFnZVdyaXRlciwgb3IgcmV0dXJucyBudWxsIGlmIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBJbWFnZVdyaXRlciBpcyBub3QgcmVnaXN0ZXJlZC4gCisgICAgICogR2V0cyBhbiBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIEltYWdlV3JpdGVyLCBvciByZXR1cm5zIG51bGwgaWYgdGhlIHNwZWNpZmllZCBJbWFnZVdyaXRlciBpcyBub3QKKyAgICAgKiByZWdpc3RlcmVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3cml0ZXIgdGhlIHJlZ2lzdGVyZWQgSW1hZ2VXcml0ZXIgb2JqZWN0LgotICAgICAqIAorICAgICAqIEBwYXJhbSB3cml0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWdpc3RlcmVkIEltYWdlV3JpdGVyIG9iamVjdC4KICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZVJlYWRlci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEltYWdlUmVhZGVyIGdldEltYWdlUmVhZGVyKEltYWdlV3JpdGVyIHdyaXRlcikgewpAQCAtMzQ0LDE3ICszNDcsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBJdGVyYXRvciBvZiBJbWFnZVdyaXRlciBvYmplY3RzIHdoaWNoIGFyZSBhYmxlIHRvCi0gICAgICogZW5jb2RlIGltYWdlcyB3aXRoIHRoZSBzcGVjaWZpZWQgSW1hZ2VUeXBlU3BlY2lmaWVyIGFuZAotICAgICAqIGZvcm1hdC4KKyAgICAgKiBHZXRzIHRoZSBJdGVyYXRvciBvZiBJbWFnZVdyaXRlciBvYmplY3RzIHdoaWNoIGFyZSBhYmxlIHRvIGVuY29kZSBpbWFnZXMKKyAgICAgKiB3aXRoIHRoZSBzcGVjaWZpZWQgSW1hZ2VUeXBlU3BlY2lmaWVyIGFuZCBmb3JtYXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIEltYWdlVHlwZVNwZWNpZmllciwgd2hpY2ggZGVmaW5lcyBsYXlvdXQuCi0gICAgICogQHBhcmFtIGZvcm1hdE5hbWUgdGhlIGZvcm1hdCBuYW1lLgotICAgICAqIAorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyLCB3aGljaCBkZWZpbmVzIGxheW91dC4KKyAgICAgKiBAcGFyYW0gZm9ybWF0TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGZvcm1hdCBuYW1lLgogICAgICAqIEByZXR1cm4gdGhlIEl0ZXJhdG9yIG9mIEltYWdlV3JpdGVyIG9iamVjdHMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJdGVyYXRvcjxJbWFnZVdyaXRlcj4gZ2V0SW1hZ2VXcml0ZXJzKEltYWdlVHlwZVNwZWNpZmllciB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmb3JtYXROYW1lKSB7CisgICAgcHVibGljIHN0YXRpYyBJdGVyYXRvcjxJbWFnZVdyaXRlcj4gZ2V0SW1hZ2VXcml0ZXJzKEltYWdlVHlwZVNwZWNpZmllciB0eXBlLCBTdHJpbmcgZm9ybWF0TmFtZSkgewogICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInR5cGUgY2Fubm90IGJlIE5VTEwiKTsKICAgICAgICAgfQpAQCAtMzcwLDMxICszNzIsMzEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBJdGVyYXRvciBvZiByZWdpc3RlcmVkIEltYWdlVHJhbnNjb2RlcnMgd2hpY2ggCi0gICAgICogYXJlIGFibGUgdG8gdHJhbnNjb2RlIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3BlY2lmaWVkCi0gICAgICogSW1hZ2VSZWFkZXIgb2JqZWN0IHRvIGEgc3VpdGFibGUgb2JqZWN0IGZvciBlbmNvZGluZyAKLSAgICAgKiBieSB0aGUgc3BlY2lmaWVkIEltYWdlV3JpdGVyLgorICAgICAqIEdldHMgdGhlIEl0ZXJhdG9yIG9mIHJlZ2lzdGVyZWQgSW1hZ2VUcmFuc2NvZGVycyB3aGljaCBhcmUgYWJsZSB0bworICAgICAqIHRyYW5zY29kZSB0aGUgbWV0YWRhdGEgb2YgdGhlIHNwZWNpZmllZCBJbWFnZVJlYWRlciBvYmplY3QgdG8gYSBzdWl0YWJsZQorICAgICAqIG9iamVjdCBmb3IgZW5jb2RpbmcgYnkgdGhlIHNwZWNpZmllZCBJbWFnZVdyaXRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVhZGVyIHRoZSBzcGVjaWZpZWQgSW1hZ2VSZWFkZXIuCi0gICAgICogQHBhcmFtIHdyaXRlciB0aGUgc3BlY2lmaWVkIEltYWdlV3JpdGVyLgotICAgICAqIAorICAgICAqIEBwYXJhbSByZWFkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgSW1hZ2VSZWFkZXIuCisgICAgICogQHBhcmFtIHdyaXRlcgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBJbWFnZVdyaXRlci4KICAgICAgKiBAcmV0dXJuIHRoZSBJdGVyYXRvciBvZiByZWdpc3RlcmVkIEltYWdlVHJhbnNjb2RlcnMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJdGVyYXRvcjxJbWFnZVRyYW5zY29kZXI+IGdldEltYWdlVHJhbnNjb2RlcnMoSW1hZ2VSZWFkZXIgcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZVdyaXRlciB3cml0ZXIpIHsKKyAgICAgICAgICAgIEltYWdlV3JpdGVyIHdyaXRlcikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgaW1hZ2UgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgRmlsZSBhbmQgZGVjb2RlcyBpdCB1c2luZyAKLSAgICAgKiB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXJlZCBJbWFnZVJlYWRlciBvYmplY3QuIAotICAgICAqIFRoZSBGaWxlIGlzIHdyYXBwZWQgaW4gYW4gSW1hZ2VJbnB1dFN0cmVhbS4KKyAgICAgKiBSZWFkcyBpbWFnZSBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBGaWxlIGFuZCBkZWNvZGVzIGl0IHVzaW5nIHRoZQorICAgICAqIGFwcHJvcHJpYXRlIHJlZ2lzdGVyZWQgSW1hZ2VSZWFkZXIgb2JqZWN0LiBUaGUgRmlsZSBpcyB3cmFwcGVkIGluIGFuCisgICAgICogSW1hZ2VJbnB1dFN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIEZpbGUgdG8gYmUgcmVhZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBGaWxlIHRvIGJlIHJlYWQuCiAgICAgICogQHJldHVybiB0aGUgQnVmZmVyZWRJbWFnZSBkZWNvZGVkIGZyb20gdGhlIHNwZWNpZmllZCBGaWxlLCBvciBudWxsLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlcmVkSW1hZ2UgcmVhZChGaWxlIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkgewpAQCAtNDA2LDE1ICs0MDgsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBpbWFnZSBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBJbnB1dFN0cmVhbSBhbmQgZGVjb2RlcyBpdCAKLSAgICAgKiB1c2luZyBhbiBhcHByb3ByaWF0ZSByZWdpc3RlcmVkIGFuIEltYWdlUmVhZGVyIG9iamVjdC4KKyAgICAgKiBSZWFkcyBpbWFnZSBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBJbnB1dFN0cmVhbSBhbmQgZGVjb2RlcyBpdCB1c2luZyBhbgorICAgICAqIGFwcHJvcHJpYXRlIHJlZ2lzdGVyZWQgYW4gSW1hZ2VSZWFkZXIgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgSW5wdXRTdHJlYW0uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgQnVmZmVyZWRJbWFnZSBkZWNvZGVkIGZyb20gdGhlIHNwZWNpZmllZCBJbnB1dFN0cmVhbSwKLSAgICAgKiBvciBudWxsLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIElucHV0U3RyZWFtLgorICAgICAqIEByZXR1cm4gdGhlIEJ1ZmZlcmVkSW1hZ2UgZGVjb2RlZCBmcm9tIHRoZSBzcGVjaWZpZWQgSW5wdXRTdHJlYW0sIG9yCisgICAgICogICAgICAgICBudWxsLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlcmVkSW1hZ2UgcmVhZChJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHsKQEAgLTQyNiwxNCArNDI4LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgaW1hZ2UgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMIGFuZCBkZWNvZGVzIGl0IHVzaW5nIAotICAgICAqIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcmVkIEltYWdlUmVhZGVyIG9iamVjdC4gCi0gICAgICogIAotICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgVVJMIHRvIGJlIHJlYWQuCisgICAgICogUmVhZHMgaW1hZ2UgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMIGFuZCBkZWNvZGVzIGl0IHVzaW5nIHRoZQorICAgICAqIGFwcHJvcHJpYXRlIHJlZ2lzdGVyZWQgSW1hZ2VSZWFkZXIgb2JqZWN0LgogICAgICAqIAorICAgICAqIEBwYXJhbSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIFVSTCB0byBiZSByZWFkLgogICAgICAqIEByZXR1cm4gdGhlIEJ1ZmZlcmVkSW1hZ2UgZGVjb2RlZCBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMLCBvciBudWxsLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlcmVkSW1hZ2UgcmVhZChVUkwgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7CkBAIC00NDMsMjAgKzQ0NSwyMCBAQAogICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBpbnB1dC5vcGVuU3RyZWFtKCk7CiAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgcmVzID0gcmVhZChzdHJlYW0pOwogICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBpbWFnZSBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBJbWFnZUlucHV0U3RyZWFtIGFuZCBkZWNvZGVzIGl0IAotICAgICAqIHVzaW5nIGFwcHJvcHJpYXRlIHJlZ2lzdGVyZWQgYW4gSW1hZ2VSZWFkZXIgb2JqZWN0LgorICAgICAqIFJlYWRzIGltYWdlIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIEltYWdlSW5wdXRTdHJlYW0gYW5kIGRlY29kZXMgaXQgdXNpbmcKKyAgICAgKiBhcHByb3ByaWF0ZSByZWdpc3RlcmVkIGFuIEltYWdlUmVhZGVyIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyZWFtIHRoZSBJbWFnZUlucHV0U3RyZWFtLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEJ1ZmZlcmVkSW1hZ2UgZGVjb2RlZCBmcm9tIHRoZSBzcGVjaWZpZWQgSW1hZ2VJbnB1dFN0cmVhbSwKLSAgICAgKiBvciBudWxsLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZUlucHV0U3RyZWFtLgorICAgICAqIEByZXR1cm4gdGhlIEJ1ZmZlcmVkSW1hZ2UgZGVjb2RlZCBmcm9tIHRoZSBzcGVjaWZpZWQgSW1hZ2VJbnB1dFN0cmVhbSwgb3IKKyAgICAgKiAgICAgICAgIG51bGwuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQnVmZmVyZWRJbWFnZSByZWFkKEltYWdlSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpIHsKQEAgLTQ3OCwyNSArNDgwLDI1IEBACiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIFN0cmVhbSBjb3VsZCBiZSBhbHJlYWR5IGNsb3NlZCwgcHJvY2VlZCBzaWxlbnRseSBpbiB0aGlzIGNhc2UKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIGltYWdlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0ICh1c2luZyBhbiAKLSAgICAgKiBhcHByb3ByaWF0ZSBJbWFnZVdyaXRlcikgdG8gdGhlIHNwZWNpZmllZCBJbWFnZU91dHB1dFN0cmVhbS4KKyAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBpbWFnZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCAodXNpbmcgYW4gYXBwcm9wcmlhdGUKKyAgICAgKiBJbWFnZVdyaXRlcikgdG8gdGhlIHNwZWNpZmllZCBJbWFnZU91dHB1dFN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW0gdGhlIFJlbmRlcmVkSW1hZ2UuCi0gICAgICogQHBhcmFtIGZvcm1hdE5hbWUgdGhlIGZvcm1hdCBuYW1lLgotICAgICAqIEBwYXJhbSBvdXRwdXQgdGhlIEltYWdlT3V0cHV0U3RyZWFtIHdoZXJlIEltYWdlIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogCisgICAgICogQHBhcmFtIGltCisgICAgICogICAgICAgICAgICB0aGUgUmVuZGVyZWRJbWFnZS4KKyAgICAgKiBAcGFyYW0gZm9ybWF0TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGZvcm1hdCBuYW1lLgorICAgICAqIEBwYXJhbSBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZU91dHB1dFN0cmVhbSB3aGVyZSBJbWFnZSB0byBiZSB3cml0dGVuLgogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgSW1hZ2UgaXMgd3JpdHRlbiBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHdyaXRlKFJlbmRlcmVkSW1hZ2UgaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmb3JtYXROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZU91dHB1dFN0cmVhbSBvdXRwdXQpCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHdyaXRlKFJlbmRlcmVkSW1hZ2UgaW0sIFN0cmluZyBmb3JtYXROYW1lLCBJbWFnZU91dHB1dFN0cmVhbSBvdXRwdXQpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAgICAgICAgIGlmIChpbSA9PSBudWxsKSB7CkBAIC01MDksNyArNTExLDggQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm91dHB1dCBjYW5ub3QgYmUgTlVMTCIpOwogICAgICAgICB9CiAKLSAgICAgICAgSXRlcmF0b3I8SW1hZ2VXcml0ZXI+IGl0ID0gZ2V0SW1hZ2VXcml0ZXJzKEltYWdlVHlwZVNwZWNpZmllci5jcmVhdGVGcm9tUmVuZGVyZWRJbWFnZShpbSksIGZvcm1hdE5hbWUpOworICAgICAgICBJdGVyYXRvcjxJbWFnZVdyaXRlcj4gaXQgPSBnZXRJbWFnZVdyaXRlcnMoSW1hZ2VUeXBlU3BlY2lmaWVyLmNyZWF0ZUZyb21SZW5kZXJlZEltYWdlKGltKSwKKyAgICAgICAgICAgICAgICBmb3JtYXROYW1lKTsKICAgICAgICAgaWYgKGl0Lmhhc05leHQoKSkgewogICAgICAgICAgICAgSW1hZ2VXcml0ZXIgd3JpdGVyID0gaXQubmV4dCgpOwogICAgICAgICAgICAgd3JpdGVyLnNldE91dHB1dChvdXRwdXQpOwpAQCAtNTIyLDIwICs1MjUsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBpbWFnZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCAodXNpbmcgYW4gCi0gICAgICogYXBwcm9wcmlhdGUgSW1hZ2VXcml0ZXIpIHRvIHRoZSBzcGVjaWZpZWQgRmlsZS4KKyAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBpbWFnZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCAodXNpbmcgYW4gYXBwcm9wcmlhdGUKKyAgICAgKiBJbWFnZVdyaXRlcikgdG8gdGhlIHNwZWNpZmllZCBGaWxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbSB0aGUgUmVuZGVyZWRJbWFnZS4KLSAgICAgKiBAcGFyYW0gZm9ybWF0TmFtZSB0aGUgZm9ybWF0IG5hbWUuCi0gICAgICogQHBhcmFtIG91dHB1dCB0aGUgb3V0cHV0IEZpbGUgd2hlcmUgSW1hZ2UgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBSZW5kZXJlZEltYWdlLgorICAgICAqIEBwYXJhbSBmb3JtYXROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZm9ybWF0IG5hbWUuCisgICAgICogQHBhcmFtIG91dHB1dAorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBGaWxlIHdoZXJlIEltYWdlIHRvIGJlIHdyaXR0ZW4uCiAgICAgICogQHJldHVybiB0cnVlLCBpZiBJbWFnZSBpcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gd3JpdGUoUmVuZGVyZWRJbWFnZSBpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgb3V0cHV0KQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3cml0ZShSZW5kZXJlZEltYWdlIGltLCBTdHJpbmcgZm9ybWF0TmFtZSwgRmlsZSBvdXRwdXQpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAgICAgICAgIGlmIChvdXRwdXQgPT0gbnVsbCkgewpAQCAtNTUzLDIwICs1NTYsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBpbWFnZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCAodXNpbmcgYW4gCi0gICAgICogYXBwcm9wcmlhdGUgSW1hZ2VXcml0ZXIpIHRvIHRoZSBzcGVjaWZpZWQgT3V0cHV0U3RyZWFtLgorICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIGltYWdlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0ICh1c2luZyBhbiBhcHByb3ByaWF0ZQorICAgICAqIEltYWdlV3JpdGVyKSB0byB0aGUgc3BlY2lmaWVkIE91dHB1dFN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW0gdGhlIFJlbmRlcmVkSW1hZ2UuCi0gICAgICogQHBhcmFtIGZvcm1hdE5hbWUgdGhlIGZvcm1hdCBuYW1lLgotICAgICAqIEBwYXJhbSBvdXRwdXQgdGhlIE91dHB1dFN0cmVhbSB3aGVyZSBJbWFnZSBpcyB0byBiZSB3cml0dGVuLgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbQorICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmVkSW1hZ2UuCisgICAgICogQHBhcmFtIGZvcm1hdE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmb3JtYXQgbmFtZS4KKyAgICAgKiBAcGFyYW0gb3V0cHV0CisgICAgICogICAgICAgICAgICB0aGUgT3V0cHV0U3RyZWFtIHdoZXJlIEltYWdlIGlzIHRvIGJlIHdyaXR0ZW4uCiAgICAgICogQHJldHVybiB0cnVlLCBpZiBJbWFnZSBpcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gd3JpdGUoUmVuZGVyZWRJbWFnZSBpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXQpCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHdyaXRlKFJlbmRlcmVkSW1hZ2UgaW0sIFN0cmluZyBmb3JtYXROYW1lLCBPdXRwdXRTdHJlYW0gb3V0cHV0KQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogICAgICAgICBpZiAob3V0cHV0ID09IG51bGwpIHsKQEAgLTU3OSwyNiArNTgyLDI4IEBACiAgICAgICAgIHJldHVybiBydDsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIEZpbHRlciB0byBtYXRjaCBzcGkgYnkgZm9ybWF0IG5hbWUuCiAgICAgICovCiAgICAgc3RhdGljIGNsYXNzIEZvcm1hdEZpbHRlciBpbXBsZW1lbnRzIFNlcnZpY2VSZWdpc3RyeS5GaWx0ZXIgewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBuYW1lLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmFtZS4KKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBmb3JtYXQgZmlsdGVyLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKKyAgICAgICAgICogQHBhcmFtIG5hbWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbmFtZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBGb3JtYXRGaWx0ZXIoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBmaWx0ZXIoT2JqZWN0IHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICBJbWFnZVJlYWRlcldyaXRlclNwaSBzcGkgPSAoSW1hZ2VSZWFkZXJXcml0ZXJTcGkpIHByb3ZpZGVyOworICAgICAgICAgICAgSW1hZ2VSZWFkZXJXcml0ZXJTcGkgc3BpID0gKEltYWdlUmVhZGVyV3JpdGVyU3BpKXByb3ZpZGVyOwogICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3Qoc3BpLmdldEZvcm1hdE5hbWVzKCkpLmNvbnRhaW5zKG5hbWUpOwogICAgICAgICB9CiAgICAgfQpAQCAtNjA4LDE0ICs2MTMsMTggQEAKICAgICAgKi8KICAgICBzdGF0aWMgY2xhc3MgRm9ybWF0QW5kRW5jb2RlRmlsdGVyIGV4dGVuZHMgRm9ybWF0RmlsdGVyIHsKIAotICAgICAgICAvKiogVGhlIHR5cGUuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdHlwZS4KKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgSW1hZ2VUeXBlU3BlY2lmaWVyIHR5cGU7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBmb3JtYXQgYW5kIGVuY29kZSBmaWx0ZXIuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQotICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQorICAgICAgICAgKiBAcGFyYW0gdHlwZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlLgorICAgICAgICAgKiBAcGFyYW0gbmFtZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEZvcm1hdEFuZEVuY29kZUZpbHRlcihJbWFnZVR5cGVTcGVjaWZpZXIgdHlwZSwgU3RyaW5nIG5hbWUpIHsKICAgICAgICAgICAgIHN1cGVyKG5hbWUpOwpAQCAtNjI0LDcgKzYzMyw3IEBACiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGZpbHRlcihPYmplY3QgcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIEltYWdlV3JpdGVyU3BpIHNwaSA9IChJbWFnZVdyaXRlclNwaSkgcHJvdmlkZXI7CisgICAgICAgICAgICBJbWFnZVdyaXRlclNwaSBzcGkgPSAoSW1hZ2VXcml0ZXJTcGkpcHJvdmlkZXI7CiAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZmlsdGVyKHByb3ZpZGVyKSAmJiBzcGkuY2FuRW5jb2RlSW1hZ2UodHlwZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC02MzMsMjEgKzY0MiwyNCBAQAogICAgICAqIEZpbHRlciB0byBtYXRjaCBzcGkgYnkgc3VmZml4LgogICAgICAqLwogICAgIHN0YXRpYyBjbGFzcyBTdWZmaXhGaWx0ZXIgaW1wbGVtZW50cyBTZXJ2aWNlUmVnaXN0cnkuRmlsdGVyIHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgc3VmLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc3VmLgorICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3VmOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgc3VmZml4IGZpbHRlci4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBzdWYgdGhlIHN1ZgorICAgICAgICAgKiBAcGFyYW0gc3VmCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHN1Zi4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBTdWZmaXhGaWx0ZXIoU3RyaW5nIHN1ZikgewogICAgICAgICAgICAgdGhpcy5zdWYgPSBzdWY7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBmaWx0ZXIoT2JqZWN0IHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICBJbWFnZVJlYWRlcldyaXRlclNwaSBzcGkgPSAoSW1hZ2VSZWFkZXJXcml0ZXJTcGkpIHByb3ZpZGVyOworICAgICAgICAgICAgSW1hZ2VSZWFkZXJXcml0ZXJTcGkgc3BpID0gKEltYWdlUmVhZGVyV3JpdGVyU3BpKXByb3ZpZGVyOwogICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3Qoc3BpLmdldEZpbGVTdWZmaXhlcygpKS5jb250YWlucyhzdWYpOwogICAgICAgICB9CiAgICAgfQpAQCAtNjU2LDIxICs2NjgsMjQgQEAKICAgICAgKiBGaWx0ZXIgdG8gbWF0Y2ggc3BpIGJ5IGRlY29kaW5nIHBvc3NpYmlsaXR5LgogICAgICAqLwogICAgIHN0YXRpYyBjbGFzcyBDYW5SZWFkRmlsdGVyIGltcGxlbWVudHMgU2VydmljZVJlZ2lzdHJ5LkZpbHRlciB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGlucHV0LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaW5wdXQuCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIE9iamVjdCBpbnB1dDsKIAogICAgICAgICAvKioKICAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGNhbiByZWFkIGZpbHRlci4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQKKyAgICAgICAgICogQHBhcmFtIGlucHV0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGlucHV0LgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIENhblJlYWRGaWx0ZXIoT2JqZWN0IGlucHV0KSB7CiAgICAgICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBmaWx0ZXIoT2JqZWN0IHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICBJbWFnZVJlYWRlclNwaSBzcGkgPSAoSW1hZ2VSZWFkZXJTcGkpIHByb3ZpZGVyOworICAgICAgICAgICAgSW1hZ2VSZWFkZXJTcGkgc3BpID0gKEltYWdlUmVhZGVyU3BpKXByb3ZpZGVyOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByZXR1cm4gc3BpLmNhbkRlY29kZUlucHV0KGlucHV0KTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKQEAgLTY4NCwxMyArNjk5LDE2IEBACiAgICAgICovCiAgICAgc3RhdGljIGNsYXNzIFNwaUl0ZXJhdG9yVG9Xcml0ZXJzSXRlcmF0b3JXcmFwcGVyIGltcGxlbWVudHMgSXRlcmF0b3I8SW1hZ2VXcml0ZXI+IHsKIAotICAgICAgICAvKiogVGhlIGJhY2tlbmQuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYmFja2VuZC4KKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgSXRlcmF0b3I8SW1hZ2VXcml0ZXJTcGk+IGJhY2tlbmQ7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBzcGkgaXRlcmF0b3IgdG8gd3JpdGVycyBpdGVyYXRvciB3cmFwcGVyLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGJhY2tlbmQgdGhlIGJhY2tlbmQKKyAgICAgICAgICogQHBhcmFtIGJhY2tlbmQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgYmFja2VuZC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBTcGlJdGVyYXRvclRvV3JpdGVyc0l0ZXJhdG9yV3JhcHBlcihJdGVyYXRvcjxJbWFnZVdyaXRlclNwaT4gYmFja2VuZCkgewogICAgICAgICAgICAgdGhpcy5iYWNrZW5kID0gYmFja2VuZDsKQEAgLTY5OSw3ICs3MTcsNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogTmV4dC4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGltYWdlIHdyaXRlcgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZSB3cml0ZXIuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgSW1hZ2VXcml0ZXIgbmV4dCgpIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC03MTMsNyArNzMxLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENoZWNrcyBmb3IgbmV4dC4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bAorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewogICAgICAgICAgICAgcmV0dXJuIGJhY2tlbmQuaGFzTmV4dCgpOwpAQCAtNzIzLDcgKzc0MSw4IEBACiAgICAgICAgICAqIFJlbW92ZXMgdGhlLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVc2UgZGVyZWdpc3RlclNlcnZpY2Vwcm92aWRlciBpbnN0ZWFkIG9mIEl0ZXJhdG9yLnJlbW92ZSgpIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJVc2UgZGVyZWdpc3RlclNlcnZpY2Vwcm92aWRlciBpbnN0ZWFkIG9mIEl0ZXJhdG9yLnJlbW92ZSgpIik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTczMSwxNCArNzUwLDE3IEBACiAgICAgICogV3JhcHMgc3BpJ3MgaXRlcmF0b3IgdG8gSW1hZ2VSZWFkZXIgaXRlcmF0b3IuCiAgICAgICovCiAgICAgc3RhdGljIGNsYXNzIFNwaUl0ZXJhdG9yVG9SZWFkZXJzSXRlcmF0b3JXcmFwcGVyIGltcGxlbWVudHMgSXRlcmF0b3I8SW1hZ2VSZWFkZXI+IHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgYmFja2VuZC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGJhY2tlbmQuCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIEl0ZXJhdG9yPEltYWdlUmVhZGVyU3BpPiBiYWNrZW5kOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgc3BpIGl0ZXJhdG9yIHRvIHJlYWRlcnMgaXRlcmF0b3Igd3JhcHBlci4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBiYWNrZW5kIHRoZSBiYWNrZW5kCisgICAgICAgICAqIEBwYXJhbSBiYWNrZW5kCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGJhY2tlbmQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgU3BpSXRlcmF0b3JUb1JlYWRlcnNJdGVyYXRvcldyYXBwZXIoSXRlcmF0b3I8SW1hZ2VSZWFkZXJTcGk+IGJhY2tlbmQpIHsKICAgICAgICAgICAgIHRoaXMuYmFja2VuZCA9IGJhY2tlbmQ7CkBAIC03NDcsNyArNzY5LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIE5leHQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZSByZWFkZXIKKyAgICAgICAgICogQHJldHVybiB0aGUgaW1hZ2UgcmVhZGVyLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEltYWdlUmVhZGVyIG5leHQoKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtNzYxLDcgKzc4Myw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDaGVja3MgZm9yIG5leHQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKICAgICAgICAgICAgIHJldHVybiBiYWNrZW5kLmhhc05leHQoKTsKQEAgLTc3MSw3ICs3OTMsOCBAQAogICAgICAgICAgKiBSZW1vdmVzIHRoZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVXNlIGRlcmVnaXN0ZXJTZXJ2aWNlcHJvdmlkZXIgaW5zdGVhZCBvZiBJdGVyYXRvci5yZW1vdmUoKSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiVXNlIGRlcmVnaXN0ZXJTZXJ2aWNlcHJvdmlkZXIgaW5zdGVhZCBvZiBJdGVyYXRvci5yZW1vdmUoKSIpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vSW1hZ2VSZWFkUGFyYW0uamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlUmVhZFBhcmFtLmphdmEKaW5kZXggZTY3ZWQ3ZC4uOWNjNWM1ZiAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vSW1hZ2VSZWFkUGFyYW0uamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9JbWFnZVJlYWRQYXJhbS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIFNlcmdleSBJLiBTYWxpc2hldgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjIgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2VpbzsKIAogaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKQEAgLTI5LDQ1ICszMCw1MCBAQAogICovCiAKIC8qKgotICogVGhlIEltYWdlUmVhZFBhcmFtIGNsYXNzIHByb3ZpZGVzIGluZm9ybWF0aW9uIHRvIHRoZSBJbWFnZVJlYWRlciBhYm91dAotICogaG93IGFuIGltYWdlIGlzIHRvIGJlIGRlY29kZWQuCisgKiBUaGUgSW1hZ2VSZWFkUGFyYW0gY2xhc3MgcHJvdmlkZXMgaW5mb3JtYXRpb24gdG8gdGhlIEltYWdlUmVhZGVyIGFib3V0IGhvdyBhbgorICogaW1hZ2UgaXMgdG8gYmUgZGVjb2RlZC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLQogcHVibGljIGNsYXNzIEltYWdlUmVhZFBhcmFtIGV4dGVuZHMgSUlPUGFyYW0gewogCi0gICAgLyoqIAotICAgICAqIFRoaXMgZmxhZyBpbmRpY2F0ZXMgaWYgdGhpcyBJbWFnZVJlYWRQYXJhbSBzdXBwb3J0cyBzZXR0aW5nIHRoZSBzb3VyY2UgCi0gICAgICogcmVuZGVyaW5nIHNpemUuICAKKyAgICAvKioKKyAgICAgKiBUaGlzIGZsYWcgaW5kaWNhdGVzIGlmIHRoaXMgSW1hZ2VSZWFkUGFyYW0gc3VwcG9ydHMgc2V0dGluZyB0aGUgc291cmNlCisgICAgICogcmVuZGVyaW5nIHNpemUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuU2V0U291cmNlUmVuZGVyU2l6ZTsKLSAgICAKLSAgICAvKiogCi0gICAgICogVGhlIGRlc3RpbmF0aW9uIEJ1ZmZlcmVkSW1hZ2UuIAorCisgICAgLyoqCisgICAgICogVGhlIGRlc3RpbmF0aW9uIEJ1ZmZlcmVkSW1hZ2UuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEJ1ZmZlcmVkSW1hZ2UgZGVzdGluYXRpb247Ci0gICAgCi0gICAgLyoqIFRoZSBkZXN0aW5hdGlvbiBiYW5kcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBkZXN0aW5hdGlvbiBiYW5kcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50W10gZGVzdGluYXRpb25CYW5kczsKLSAgICAKLSAgICAvKiogCi0gICAgICogVGhlIG1pbmltdW0gcHJvZ3Jlc3NpdmUgcGFzcy4gIAorCisgICAgLyoqCisgICAgICogVGhlIG1pbmltdW0gcHJvZ3Jlc3NpdmUgcGFzcy4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IG1pblByb2dyZXNzaXZlUGFzczsKLSAgICAKLSAgICAvKiogCi0gICAgICogVGhlIG51bWJlciBvZiBwcm9ncmVzc2l2ZSBwYXNzZXMuICAKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgcHJvZ3Jlc3NpdmUgcGFzc2VzLgogICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgbnVtUHJvZ3Jlc3NpdmVQYXNzZXM7Ci0gICAgCi0gICAgLyoqIFRoZSBzb3VyY2UgcmVuZGVyIHNpemUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlIHJlbmRlciBzaXplLgorICAgICAqLwogICAgIHByb3RlY3RlZCBEaW1lbnNpb24gc291cmNlUmVuZGVyU2l6ZTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIEltYWdlUmVhZGVyUGFyYW0gc3VwcG9ydHMgcmVuZGVyaW5nIGEKLSAgICAgKiBzb3VyY2UgaW1hZ2UgYXQgYW4gYXJiaXRyYXJ5IHNpemUuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgSW1hZ2VSZWFkZXJQYXJhbSBzdXBwb3J0cyByZW5kZXJpbmcgYSBzb3VyY2UgaW1hZ2UKKyAgICAgKiBhdCBhbiBhcmJpdHJhcnkgc2l6ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBJbWFnZVJlYWRlclBhcmFtIHN1cHBvcnRzIHJlbmRlcmluZyBhCi0gICAgICogc291cmNlIGltYWdlIGF0IGFuIGFyYml0cmFyeSBzaXplLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIEltYWdlUmVhZGVyUGFyYW0gc3VwcG9ydHMgcmVuZGVyaW5nIGEgc291cmNlIGltYWdlCisgICAgICogICAgICAgICBhdCBhbiBhcmJpdHJhcnkgc2l6ZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNhblNldFNvdXJjZVJlbmRlclNpemUoKSB7CiAgICAgICAgIHJldHVybiBjYW5TZXRTb3VyY2VSZW5kZXJTaXplOwpAQCAtOTIsMTEgKzk4LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBpbmRleCBvZiB0aGUgbWF4aW11bSBwYXNzIHRvIGJlIGRlY29kZWQuCi0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBJbnRlZ2VyLk1BWF9WQUxVRSwgaWYgCi0gICAgICogZ2V0U291cmNlTnVtUHJvZ3Jlc3NpdmVQYXNzZXMoKSBtZXRob2QgcmV0dXJucyB2YWx1ZQotICAgICAqIHRoYXQgaXMgZXF1YWwgdG8gSW50ZWdlci5NQVhfVkFMVUUuIE90aGVyd2lzZQotICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgCisgICAgICogR2V0cyB0aGUgaW5kZXggb2YgdGhlIG1heGltdW0gcGFzcyB0byBiZSBkZWNvZGVkLiBUaGlzIG1ldGhvZCByZXR1cm5zCisgICAgICogSW50ZWdlci5NQVhfVkFMVUUsIGlmIGdldFNvdXJjZU51bVByb2dyZXNzaXZlUGFzc2VzKCkgbWV0aG9kIHJldHVybnMKKyAgICAgKiB2YWx1ZSB0aGF0IGlzIGVxdWFsIHRvIEludGVnZXIuTUFYX1ZBTFVFLiBPdGhlcndpc2UgdGhpcyBtZXRob2QgcmV0dXJucwogICAgICAqIGdldFNvdXJjZU1pblByb2dyZXNzaXZlUGFzcygpICsgZ2V0U291cmNlTnVtUHJvZ3Jlc3NpdmVQYXNzZXMoKSAtIDEuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIG1heGltdW0gcGFzcyB0byBiZSBkZWNvZGVkLgpAQCAtMTA5LDE5ICsxMTMsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBpbmRleCBvZiB0aGUgbWluaW11bSBwcm9ncmVzc2l2ZSBwYXNzIHRoYXQgaXMgZGVjb2RlZCwKLSAgICAgKiBkZWZhdWx0IGlzIDAuIAorICAgICAqIEdldHMgdGhlIGluZGV4IG9mIHRoZSBtaW5pbXVtIHByb2dyZXNzaXZlIHBhc3MgdGhhdCBpcyBkZWNvZGVkLCBkZWZhdWx0CisgICAgICogaXMgMC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbWluaW11bSBwcm9ncmVzc2l2ZSBwYXNzIHRoYXQgaXMgZGVjb2RlZCwKLSAgICAgKiBkZWZhdWx0IGlzIDAuCisgICAgICogICAgICAgICBkZWZhdWx0IGlzIDAuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRTb3VyY2VNaW5Qcm9ncmVzc2l2ZVBhc3MoKSB7CiAgICAgICAgIHJldHVybiBtaW5Qcm9ncmVzc2l2ZVBhc3M7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHByb2dyZXNzaXZlIHBhc3Nlcy4KLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBJbnRlZ2VyLk1BWF9WQUxVRS4gCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHByb2dyZXNzaXZlIHBhc3Nlcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKKyAgICAgKiBJbnRlZ2VyLk1BWF9WQUxVRS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcHJvZ3Jlc3NpdmUgcGFzc2VzLgogICAgICAqLwpAQCAtMTMwLDggKzEzNCw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGltZW5zaW9uIG9mIHNvdXJjZSBpbWFnZSB3aGljaCB3aWxsIGJlIHJlbmRlcmVkCi0gICAgICogZHVyaW5nIGRlY29kaW5nIHByb2Nlc3MuCisgICAgICogR2V0cyB0aGUgZGltZW5zaW9uIG9mIHNvdXJjZSBpbWFnZSB3aGljaCB3aWxsIGJlIHJlbmRlcmVkIGR1cmluZyBkZWNvZGluZworICAgICAqIHByb2Nlc3MuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgc291cmNlIHJlbmRlciBzaXplLgogICAgICAqLwpAQCAtMTQwLDExICsxNDQsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24gaW1hZ2UuCi0gICAgICogVGhpcyBpbWFnZSB3aWxsIGJlIHVzZWQgYnkgcmVhZCwgcmVhZEFsbCwgYW5kIHJlYWRSYXN0ZXIgbWV0aG9kcywKLSAgICAgKiBhbmQgYSByZWZlcmVuY2UgdG8gaXQgd2lsbCBiZSByZXR1cm5lZCBieSB0aG9zZSBtZXRob2RzLgorICAgICAqIFNldHMgdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbiBpbWFnZS4gVGhpcyBpbWFnZSB3aWxsIGJlIHVzZWQgYnkgcmVhZCwKKyAgICAgKiByZWFkQWxsLCBhbmQgcmVhZFJhc3RlciBtZXRob2RzLCBhbmQgYSByZWZlcmVuY2UgdG8gaXQgd2lsbCBiZSByZXR1cm5lZAorICAgICAqIGJ5IHRob3NlIG1ldGhvZHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIHRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KKyAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvbihCdWZmZXJlZEltYWdlIGRlc3RpbmF0aW9uKSB7CiAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKQEAgLTE1Myw3ICsxNTgsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGluZGljZXMgb2YgdGhlIGRlc3RpbmF0aW9uIGJhbmRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbkJhbmRzIHRoZSBpbmRpY2VzIG9mIHRoZSBkZXN0aW5hdGlvbiBiYW5kcy4KKyAgICAgKiBAcGFyYW0gZGVzdGluYXRpb25CYW5kcworICAgICAqICAgICAgICAgICAgdGhlIGluZGljZXMgb2YgdGhlIGRlc3RpbmF0aW9uIGJhbmRzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERlc3RpbmF0aW9uQmFuZHMoaW50W10gZGVzdGluYXRpb25CYW5kcykgewogICAgICAgICB0aGlzLmRlc3RpbmF0aW9uQmFuZHMgPSBkZXN0aW5hdGlvbkJhbmRzOwpAQCAtMTY3LDggKzE3MywxMCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHNvdXJjZSBwcm9ncmVzc2l2ZSBwYXNzZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIG1pblBhc3MgdGhlIGluZGV4IG9mIHRoZSBtaW5pbXVtIHBhc3MgdG8gYmUgZGVjb2RlZC4KLSAgICAgKiBAcGFyYW0gbnVtUGFzc2VzIHRoZSBudW1iZXIgb2YgcGFzc2VzIHRvIGJlIGRlY29kZWQuCisgICAgICogQHBhcmFtIG1pblBhc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgbWluaW11bSBwYXNzIHRvIGJlIGRlY29kZWQuCisgICAgICogQHBhcmFtIG51bVBhc3NlcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBwYXNzZXMgdG8gYmUgZGVjb2RlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VQcm9ncmVzc2l2ZVBhc3NlcyhpbnQgbWluUGFzcywgaW50IG51bVBhc3NlcykgewogICAgICAgICBtaW5Qcm9ncmVzc2l2ZVBhc3MgPSBtaW5QYXNzOwpAQCAtMTc2LDE4ICsxODQsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkaW1lbnNpb24gc2l6ZSBvZiBzb3VyY2UgaW1hZ2UgaWYgYW4KLSAgICAgKiBpbWFnZSBjYW4gYmUgcmVuZGVyZWQgYXQgYW4gYXJiaXRyYXJ5IHNpemUuCisgICAgICogU2V0cyB0aGUgZGltZW5zaW9uIHNpemUgb2Ygc291cmNlIGltYWdlIGlmIGFuIGltYWdlIGNhbiBiZSByZW5kZXJlZCBhdCBhbgorICAgICAqIGFyYml0cmFyeSBzaXplLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHJlbmRlcmVkIGltYWdlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gdGhlIHVuc3VwcG9ydGVkIG9wZXJhdGlvbiBleGNlcHRpb24KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgcmVuZGVyZWQgaW1hZ2UuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHRoZSB1bnN1cHBvcnRlZCBvcGVyYXRpb24gZXhjZXB0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZVJlbmRlclNpemUoRGltZW5zaW9uIHNpemUpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghY2FuU2V0U291cmNlUmVuZGVyU2l6ZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW4ndCBzZXQgc291cmNlIHJlbmRlcmVyIHNpemUiKTsKICAgICAgICAgfQotICAgICAgICBzb3VyY2VSZW5kZXJTaXplID0gc2l6ZTsgICAgICAgIAorICAgICAgICBzb3VyY2VSZW5kZXJTaXplID0gc2l6ZTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlUmVhZGVyLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9JbWFnZVJlYWRlci5qYXZhCmluZGV4IDc4MGRlMjYuLmNmMjgyZWQgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlUmVhZGVyLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vSW1hZ2VSZWFkZXIuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBSdXN0ZW0gVi4gUmFmaWtvdgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2VpbzsKIAogaW1wb3J0IGphdmF4LmltYWdlaW8uc3BpLkltYWdlUmVhZGVyU3BpOwpAQCAtMzcsNTYgKzM4LDc3IEBACiBpbXBvcnQgamF2YS5hd3QuKjsKIAogLyoqCi0gKiBUaGUgSW1hZ2VSZWFkZXIgY2xhc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIGRlY29kaW5nIGltYWdlcy4KLSAqIEltYWdlUmVhZGVyIG9iamVjdHMgYXJlIGluc3RhbnRpYXRlZCBieSB0aGUgc2VydmljZSBwcm92aWRlciAKLSAqIGludGVyZmFjZSwgSW1hZ2VSZWFkZXJTcGkgY2xhc3MsIGZvciB0aGUgc3BlY2lmaWMgZm9ybWF0LiAKLSAqIEltYWdlUmVhZGVyU3BpIGNsYXNzIHNob3VsZCBiZSByZWdpc3RlcmVkIHdpdGggdGhlIElJT1JlZ2lzdHJ5LCAKLSAqIHdoaWNoIHVzZXMgdGhlbSBmb3IgZm9ybWF0IHJlY29nbml0aW9uIGFuZCBwcmVzZW50YXRpb24gb2YgYXZhaWxhYmxlIAotICogZm9ybWF0IHJlYWRlcnMgYW5kIHdyaXRlcnMuCisgKiBUaGUgSW1hZ2VSZWFkZXIgY2xhc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIGRlY29kaW5nIGltYWdlcy4gSW1hZ2VSZWFkZXIKKyAqIG9iamVjdHMgYXJlIGluc3RhbnRpYXRlZCBieSB0aGUgc2VydmljZSBwcm92aWRlciBpbnRlcmZhY2UsIEltYWdlUmVhZGVyU3BpCisgKiBjbGFzcywgZm9yIHRoZSBzcGVjaWZpYyBmb3JtYXQuIEltYWdlUmVhZGVyU3BpIGNsYXNzIHNob3VsZCBiZSByZWdpc3RlcmVkCisgKiB3aXRoIHRoZSBJSU9SZWdpc3RyeSwgd2hpY2ggdXNlcyB0aGVtIGZvciBmb3JtYXQgcmVjb2duaXRpb24gYW5kIHByZXNlbnRhdGlvbgorICogb2YgYXZhaWxhYmxlIGZvcm1hdCByZWFkZXJzIGFuZCB3cml0ZXJzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEltYWdlUmVhZGVyIHsKIAotICAgIC8qKiBUaGUgb3JpZ2luYXRpbmcgcHJvdmlkZXIuICovCisgICAgLyoqCisgICAgICogVGhlIG9yaWdpbmF0aW5nIHByb3ZpZGVyLgorICAgICAqLwogICAgIHByb3RlY3RlZCBJbWFnZVJlYWRlclNwaSBvcmlnaW5hdGluZ1Byb3ZpZGVyOwogCi0gICAgLyoqIFRoZSBpbnB1dCBvYmplY3Qgc3VjaCBhcyBJbWFnZUlucHV0U3RyZWFtLiAqLworICAgIC8qKgorICAgICAqIFRoZSBpbnB1dCBvYmplY3Qgc3VjaCBhcyBJbWFnZUlucHV0U3RyZWFtLgorICAgICAqLwogICAgIHByb3RlY3RlZCBPYmplY3QgaW5wdXQ7CiAKLSAgICAvKiogVGhlIHNlZWsgZm9yd2FyZCBvbmx5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBzZWVrIGZvcndhcmQgb25seS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzZWVrRm9yd2FyZE9ubHk7CiAKLSAgICAvKiogCi0gICAgICogVGhlIGlnbm9yZSBtZXRhZGF0YSBmbGFnIGluZGljYXRlcyB3aGV0aGVyIGN1cnJlbnQgaW5wdXQgc291cmNlIAotICAgICAqIGhhcyBiZWVuIG1hcmtlZCBhcyBtZXRhZGF0YSBpcyBhbGxvd2VkIHRvIGJlIGlnbm9yZWQgYnkgc2V0SW5wdXQuIAorICAgIC8qKgorICAgICAqIFRoZSBpZ25vcmUgbWV0YWRhdGEgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciBjdXJyZW50IGlucHV0IHNvdXJjZSBoYXMgYmVlbgorICAgICAqIG1hcmtlZCBhcyBtZXRhZGF0YSBpcyBhbGxvd2VkIHRvIGJlIGlnbm9yZWQgYnkgc2V0SW5wdXQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaWdub3JlTWV0YWRhdGE7CiAKLSAgICAvKiogVGhlIG1pbmltdW0gaW5kZXguICovCisgICAgLyoqCisgICAgICogVGhlIG1pbmltdW0gaW5kZXguCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBtaW5JbmRleDsKIAotICAgIC8qKiBUaGUgYXZhaWxhYmxlIGxvY2FsZXMuICovCisgICAgLyoqCisgICAgICogVGhlIGF2YWlsYWJsZSBsb2NhbGVzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBMb2NhbGVbXSBhdmFpbGFibGVMb2NhbGVzOwogCi0gICAgLyoqIFRoZSBsb2NhbGUuICovCisgICAgLyoqCisgICAgICogVGhlIGxvY2FsZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgTG9jYWxlIGxvY2FsZTsKIAotICAgIC8qKiBUaGUgbGlzdCBvZiB3YXJuaW5nIGxpc3RlbmVycy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBvZiB3YXJuaW5nIGxpc3RlbmVycy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgTGlzdDxJSU9SZWFkV2FybmluZ0xpc3RlbmVyPiB3YXJuaW5nTGlzdGVuZXJzOwogCi0gICAgLyoqIFRoZSBsaXN0IG9mIHdhcm5pbmcgbG9jYWxlcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBvZiB3YXJuaW5nIGxvY2FsZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIExpc3Q8TG9jYWxlPiB3YXJuaW5nTG9jYWxlczsKIAotICAgIC8qKiBUaGUgbGlzdCBvZiBwcm9ncmVzcyBsaXN0ZW5lcnMuICovCisgICAgLyoqCisgICAgICogVGhlIGxpc3Qgb2YgcHJvZ3Jlc3MgbGlzdGVuZXJzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBMaXN0PElJT1JlYWRQcm9ncmVzc0xpc3RlbmVyPiBwcm9ncmVzc0xpc3RlbmVyczsKIAotICAgIC8qKiBUaGUgbGlzdCBvZiB1cGRhdGUgbGlzdGVuZXJzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBsaXN0IG9mIHVwZGF0ZSBsaXN0ZW5lcnMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIExpc3Q8SUlPUmVhZFVwZGF0ZUxpc3RlbmVyPiB1cGRhdGVMaXN0ZW5lcnM7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2VSZWFkZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9yaWdpbmF0aW5nUHJvdmlkZXIgdGhlIEltYWdlUmVhZGVyU3BpIHdoaWNoIAotICAgICAqIGluc3RhbnRpZXMgdGhpcyBJbWFnZVJlYWRlci4KKyAgICAgKiBAcGFyYW0gb3JpZ2luYXRpbmdQcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlUmVhZGVyU3BpIHdoaWNoIGluc3RhbnRpYXRlcyB0aGlzIEltYWdlUmVhZGVyLgogICAgICAqLwogICAgIHByb3RlY3RlZCBJbWFnZVJlYWRlcihJbWFnZVJlYWRlclNwaSBvcmlnaW5hdGluZ1Byb3ZpZGVyKSB7CiAgICAgICAgIHRoaXMub3JpZ2luYXRpbmdQcm92aWRlciA9IG9yaWdpbmF0aW5nUHJvdmlkZXI7CkBAIC05NiwxNSArMTE4LDE1IEBACiAgICAgICogR2V0cyB0aGUgZm9ybWF0IG5hbWUgb2YgdGhpcyBpbnB1dCBzb3VyY2UuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgZm9ybWF0IG5hbWUgb2YgdGhpcyBpbnB1dCBzb3VyY2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWF0TmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBvcmlnaW5hdGluZ1Byb3ZpZGVyLmdldEZvcm1hdE5hbWVzKClbMF07CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgSW1hZ2VSZWFkZXJTcGkgd2hpY2ggaW5zdGFudGlhdGVkIHRoaXMgSW1hZ2VSZWFkZXIuIAorICAgICAqIEdldHMgdGhlIEltYWdlUmVhZGVyU3BpIHdoaWNoIGluc3RhbnRpYXRlZCB0aGlzIEltYWdlUmVhZGVyLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIEltYWdlUmVhZGVyU3BpLgogICAgICAqLwpAQCAtMTEzLDE0ICsxMzUsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgT2JqZWN0IGFzIHRoZSBpbnB1dCBzb3VyY2Ugb2YgdGhpcyBJbWFnZVJlYWRlci4gCisgICAgICogU2V0cyB0aGUgc3BlY2lmaWVkIE9iamVjdCBhcyB0aGUgaW5wdXQgc291cmNlIG9mIHRoaXMgSW1hZ2VSZWFkZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBzb3VyY2UsIGl0IGNhbiAKLSAgICAgKiBiZSBhbiBJbWFnZUlucHV0U3RyZWFtIG9yIG90aGVyIHN1cHBvcnRlZCBvYmplY3RzLgotICAgICAqIEBwYXJhbSBzZWVrRm9yd2FyZE9ubHkgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBtdXN0Ci0gICAgICogYmUgcmVhZCBzZXF1ZW50aWFsbHkgZnJvbSBpdHMgY3VycmVudCBzdGFydGluZyBwb2ludC4KLSAgICAgKiBAcGFyYW0gaWdub3JlTWV0YWRhdGEgcGFyYW1ldGVyIHdoaWNoIGluZGljYXRlcwotICAgICAqIGlmIG1ldGFkYXRhIG1heSBiZSBpZ25vcmVkIGR1cmluZyByZWFkcyBvciBub3QuCisgICAgICogQHBhcmFtIGlucHV0CisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgc291cmNlLCBpdCBjYW4gYmUgYW4gSW1hZ2VJbnB1dFN0cmVhbSBvciBvdGhlcgorICAgICAqICAgICAgICAgICAgc3VwcG9ydGVkIG9iamVjdHMuCisgICAgICogQHBhcmFtIHNlZWtGb3J3YXJkT25seQorICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBtdXN0IGJlIHJlYWQgc2VxdWVudGlhbGx5IGZyb20KKyAgICAgKiAgICAgICAgICAgIGl0cyBjdXJyZW50IHN0YXJ0aW5nIHBvaW50LgorICAgICAqIEBwYXJhbSBpZ25vcmVNZXRhZGF0YQorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyIHdoaWNoIGluZGljYXRlcyBpZiBtZXRhZGF0YSBtYXkgYmUgaWdub3JlZCBkdXJpbmcKKyAgICAgKiAgICAgICAgICAgIHJlYWRzIG9yIG5vdC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQsIGJvb2xlYW4gc2Vla0ZvcndhcmRPbmx5LCBib29sZWFuIGlnbm9yZU1ldGFkYXRhKSB7CiAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CkBAIC0xMzcsOSArMTYyLDkgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgaXMgc3VwcG9ydGVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIHN1cHBvcnRlZAorICAgICAqIEBwYXJhbSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgc3VwcG9ydGVkLgogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1cHBvcnRlZChPYmplY3QgaW5wdXQpIHsKICAgICAgICAgSW1hZ2VSZWFkZXJTcGkgc3BpID0gZ2V0T3JpZ2luYXRpbmdQcm92aWRlcigpOwpAQCAtMTU4LDEwICsxODMsMTIgQEAKICAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgT2JqZWN0IGFzIHRoZSBpbnB1dCBzb3VyY2Ugb2YgdGhpcyBJbWFnZVJlYWRlci4KICAgICAgKiBNZXRhZGF0YSBpcyBub3QgaWdub3JlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IHNvdXJjZSwgaXQgY2FuIAotICAgICAqIGJlIGFuIEltYWdlSW5wdXRTdHJlYW0gb3Igb3RoZXIgc3VwcG9ydGVkIG9iamVjdHMuCi0gICAgICogQHBhcmFtIHNlZWtGb3J3YXJkT25seSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RyZWFtIG11c3QKLSAgICAgKiBiZSByZWFkIHNlcXVlbnRpYWxseSBmcm9tIGl0cyBjdXJyZW50IHN0YXJ0aW5nIHBvaW50LgorICAgICAqIEBwYXJhbSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IHNvdXJjZSwgaXQgY2FuIGJlIGFuIEltYWdlSW5wdXRTdHJlYW0gb3Igb3RoZXIKKyAgICAgKiAgICAgICAgICAgIHN1cHBvcnRlZCBvYmplY3RzLgorICAgICAqIEBwYXJhbSBzZWVrRm9yd2FyZE9ubHkKKyAgICAgKiAgICAgICAgICAgIGluZGljYXRlcyB3aGV0aGVyIHRoZSBzdHJlYW0gbXVzdCBiZSByZWFkIHNlcXVlbnRpYWxseSBmcm9tCisgICAgICogICAgICAgICAgICBpdHMgY3VycmVudCBzdGFydGluZyBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQsIGJvb2xlYW4gc2Vla0ZvcndhcmRPbmx5KSB7CiAgICAgICAgIHNldElucHV0KGlucHV0LCBzZWVrRm9yd2FyZE9ubHksIGZhbHNlKTsKQEAgLTE3MSw4ICsxOTgsOCBAQAogICAgICAqIFNldHMgdGhlIHNwZWNpZmllZCBPYmplY3QgYXMgdGhlIGlucHV0IHNvdXJjZSBvZiB0aGlzIEltYWdlUmVhZGVyLgogICAgICAqIE1ldGFkYXRhIGlzIG5vdCBpZ25vcmVkIGFuZCBmb3J3YXJkIHNlZWtpbmcgaXMgbm90IHJlcXVpcmVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgc291cmNlLCBpdCBjYW4gCi0gICAgICogYmUgSW1hZ2VJbnB1dFN0cmVhbSBvciBvdGhlciBvYmplY3RzLgorICAgICAqIEBwYXJhbSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IHNvdXJjZSwgaXQgY2FuIGJlIEltYWdlSW5wdXRTdHJlYW0gb3Igb3RoZXIgb2JqZWN0cy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpIHsKICAgICAgICAgc2V0SW5wdXQoaW5wdXQsIGZhbHNlLCBmYWxzZSk7CkBAIC0xODEsOCArMjA4LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBpbnB1dCBzb3VyY2Ugb2JqZWN0IG9mIHRoaXMgSW1hZ2VSZWFkZXIsIG9yIHJldHVybnMgbnVsbC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0aGUgaW5wdXQgc291cmNlIG9iamVjdCBzdWNoIGFzIEltYWdlSW5wdXRTdHJlYW0sCi0gICAgICogb3IgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnB1dCBzb3VyY2Ugb2JqZWN0IHN1Y2ggYXMgSW1hZ2VJbnB1dFN0cmVhbSwgb3IgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldElucHV0KCkgewogICAgICAgICByZXR1cm4gaW5wdXQ7CkBAIC0xOTEsMzIgKzIxNywzMSBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiB0aGUgaW5wdXQgc291cmNlIHN1cHBvcnRzIG9ubHkgZm9yd2FyZCByZWFkaW5nLCBvciBub3QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgaW5wdXQgc291cmNlIHN1cHBvcnRzIG9ubHkgZm9yd2FyZCByZWFkaW5nLCAKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgaW5wdXQgc291cmNlIHN1cHBvcnRzIG9ubHkgZm9yd2FyZCByZWFkaW5nLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU2Vla0ZvcndhcmRPbmx5KCkgewogICAgICAgICByZXR1cm4gc2Vla0ZvcndhcmRPbmx5OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBpbnB1dCBzb3VyY2UgYWxsb3dzIAotICAgICAqIHRvIG1ldGFkYXRhIHRvIGJlIGlnbm9yZWQgYnkgcGFzc2luZyB0cnVlIGFzIAotICAgICAqIHRoZSBpZ25vcmVNZXRhZGF0YSBhcmd1bWVudCB0byB0aGUgc2V0SW5wdXQgbWV0aG9kLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBpbnB1dCBzb3VyY2UgYWxsb3dzIHRvIG1ldGFkYXRhIHRvIGJlIGlnbm9yZWQKKyAgICAgKiBieSBwYXNzaW5nIHRydWUgYXMgdGhlIGlnbm9yZU1ldGFkYXRhIGFyZ3VtZW50IHRvIHRoZSBzZXRJbnB1dCBtZXRob2QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0cnVlIGlmIHRoZSBjdXJyZW50IGlucHV0IHNvdXJjZSBhbGxvd3MgCi0gICAgICogdG8gbWV0YWRhdGEgdG8gYmUgaWdub3JlZCBieSBwYXNzaW5nIHRydWUgYXMgCi0gICAgICogdGhlIGlnbm9yZU1ldGFkYXRhIGFyZ3VtZW50IHRvIHRoZSBzZXRJbnB1dCBtZXRob2QuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgY3VycmVudCBpbnB1dCBzb3VyY2UgYWxsb3dzIHRvIG1ldGFkYXRhIHRvIGJlCisgICAgICogICAgICAgICBpZ25vcmVkIGJ5IHBhc3NpbmcgdHJ1ZSBhcyB0aGUgaWdub3JlTWV0YWRhdGEgYXJndW1lbnQgdG8gdGhlCisgICAgICogICAgICAgICBzZXRJbnB1dCBtZXRob2QuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmluZ01ldGFkYXRhKCkgewogICAgICAgICByZXR1cm4gaWdub3JlTWV0YWRhdGE7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWluaW11bSB2YWxpZCBpbmRleCBmb3IgcmVhZGluZyBhbiBpbWFnZSwgdGh1bWJuYWlsLCAKLSAgICAgKiBvciBpbWFnZSBtZXRhZGF0YS4gCisgICAgICogR2V0cyB0aGUgbWluaW11bSB2YWxpZCBpbmRleCBmb3IgcmVhZGluZyBhbiBpbWFnZSwgdGh1bWJuYWlsLCBvciBpbWFnZQorICAgICAqIG1ldGFkYXRhLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gdmFsaWQgaW5kZXggZm9yIHJlYWRpbmcgYW4gaW1hZ2UsIHRodW1ibmFpbCwgCi0gICAgICogb3IgaW1hZ2UgbWV0YWRhdGEuCisgICAgICogQHJldHVybiB0aGUgbWluaW11bSB2YWxpZCBpbmRleCBmb3IgcmVhZGluZyBhbiBpbWFnZSwgdGh1bWJuYWlsLCBvciBpbWFnZQorICAgICAqICAgICAgICAgbWV0YWRhdGEuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNaW5JbmRleCgpIHsKICAgICAgICAgcmV0dXJuIG1pbkluZGV4OwpAQCAtMjM0LDcgKzI1OSw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbG9jYWxlIHRvIHRoaXMgSW1hZ2VSZWFkZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxvY2FsZSB0aGUgTG9jYWxlLgorICAgICAqIEBwYXJhbSBsb2NhbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBMb2NhbGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CkBAIC0yNTIsODkgKzI3OCw4OCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBpbWFnZXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGlucHV0IHNvdXJjZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWxsb3dTZWFyY2ggdGhlIHBhcmFtZXRlciB3aGljaCBpbmRpY2F0ZXMgd2hhdAotICAgICAqIGEgc2VhcmNoIGlzIHJlcXVpcmVkOyBpZiBmYWxzZSwgdGhlIHJlYWRlciBtYXkgcmV0dXJuIC0xICAKLSAgICAgKiB3aXRob3V0IHNlYXJjaGluZy4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWxsb3dTZWFyY2gKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgd2hpY2ggaW5kaWNhdGVzIHdoYXQgYSBzZWFyY2ggaXMgcmVxdWlyZWQ7IGlmCisgICAgICogICAgICAgICAgICBmYWxzZSwgdGhlIHJlYWRlciBtYXkgcmV0dXJuIC0xIHdpdGhvdXQgc2VhcmNoaW5nLgogICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBpbWFnZXMuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TnVtSW1hZ2VzKGJvb2xlYW4gYWxsb3dTZWFyY2gpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHdpZHRoIG9mIHRoZSBzcGVjaWZpZWQgaW1hZ2UgaW4gaW5wdXQgc291cmNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSBpbmRleC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGluZGV4LgogICAgICAqIEByZXR1cm4gdGhlIHdpZHRoIGluIHBpeGVscy4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRXaWR0aChpbnQgaW1hZ2VJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBzcGVjaWZpZWQgaW1hZ2UgaW4gaW5wdXQgc291cmNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSBpbmRleC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGluZGV4LgogICAgICAqIEByZXR1cm4gdGhlIGhlaWdodCBpbiBwaXhlbHMuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SGVpZ2h0KGludCBpbWFnZUluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIHN0b3JhZ2UgZm9ybWF0IG9mIHRoZSBzcGVjaWZpZWQgaW1hZ2UgcGxhY2VzIAotICAgICAqIGFuIGltcGVkaW1lbnQgb24gcmFuZG9tIHBpeGVscyBhY2Nlc3Mgb3Igbm90LiAKKyAgICAgKiBDaGVja3MgaWYgdGhlIHN0b3JhZ2UgZm9ybWF0IG9mIHRoZSBzcGVjaWZpZWQgaW1hZ2UgcGxhY2VzIGFuIGltcGVkaW1lbnQKKyAgICAgKiBvbiByYW5kb20gcGl4ZWxzIGFjY2VzcyBvciBub3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlJ3MgaW5kZXguCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3RvcmFnZSBmb3JtYXQgb2YgdGhlIHNwZWNpZmllZCBpbWFnZSBwbGFjZXMgCi0gICAgICogYW4gaW1wZWRpbWVudCBvbiByYW5kb20gcGl4ZWxzIGFjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UncyBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzdG9yYWdlIGZvcm1hdCBvZiB0aGUgc3BlY2lmaWVkIGltYWdlIHBsYWNlcyBhbgorICAgICAqICAgICAgICAgaW1wZWRpbWVudCBvbiByYW5kb20gcGl4ZWxzIGFjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1JhbmRvbUFjY2Vzc0Vhc3koaW50IGltYWdlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsgLy9kZWYKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBkZWYKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBhc3BlY3QgcmF0aW8gKHdpZHRoIGRldmlkZWQgYnkgaGVpZ2h0KSBvZiB0aGUgaW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlIGluZGV4LgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgaW5kZXguCiAgICAgICogQHJldHVybiB0aGUgYXNwZWN0IHJhdGlvIG9mIHRoZSBpbWFnZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldEFzcGVjdFJhdGlvKGludCBpbWFnZUluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKGZsb2F0KSBnZXRXaWR0aChpbWFnZUluZGV4KSAvIGdldEhlaWdodChpbWFnZUluZGV4KTsKKyAgICAgICAgcmV0dXJuIChmbG9hdClnZXRXaWR0aChpbWFnZUluZGV4KSAvIGdldEhlaWdodChpbWFnZUluZGV4KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIEltYWdlVHlwZVNwZWNpZmllciB3aGljaCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGhlIAotICAgICAqIHNwZWNpZmllZCBpbWFnZS4KKyAgICAgKiBHZXRzIGFuIEltYWdlVHlwZVNwZWNpZmllciB3aGljaCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZAorICAgICAqIGltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSdzIGluZGV4LgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UncyBpbmRleC4KICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZVR5cGVTcGVjaWZpZXIuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBJbWFnZVR5cGVTcGVjaWZpZXIgZ2V0UmF3SW1hZ2VUeXBlKGludCBpbWFnZUluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIEl0ZXJhdG9yIG9mIEltYWdlVHlwZVNwZWNpZmllciBvYmplY3RzIHdoaWNoIGFyZSBhc3NvY2lhdGVkCi0gICAgICogd2l0aCBpbWFnZSB0eXBlcyB0aGF0IG1heSBiZSB1c2VkIHdoZW4gZGVjb2Rpbmcgc3BlY2lmaWVkIGltYWdlLgorICAgICAqIEdldHMgYW4gSXRlcmF0b3Igb2YgSW1hZ2VUeXBlU3BlY2lmaWVyIG9iamVjdHMgd2hpY2ggYXJlIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIGltYWdlIHR5cGVzIHRoYXQgbWF5IGJlIHVzZWQgd2hlbiBkZWNvZGluZyBzcGVjaWZpZWQgaW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlIGluZGV4LgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgaW5kZXguCiAgICAgICogQHJldHVybiBhbiBJdGVyYXRvciBvZiBJbWFnZVR5cGVTcGVjaWZpZXIgb2JqZWN0cy4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEl0ZXJhdG9yPEltYWdlVHlwZVNwZWNpZmllcj4gZ2V0SW1hZ2VUeXBlcyhpbnQgaW1hZ2VJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCkBAIC0zNTEsMjEgKzM3NiwyMiBAQAogICAgICAqIEdldHMgYW4gSUlPTWV0YWRhdGEgb2JqZWN0IGZvciB0aGlzIGlucHV0IHNvdXJjZS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBJSU9NZXRhZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IElJT01ldGFkYXRhIGdldFN0cmVhbU1ldGFkYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogR2V0cyBhbiBJSU9NZXRhZGF0YSBvYmplY3QgZm9yIHRoaXMgaW5wdXQgc291cmNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBmb3JtYXROYW1lIHRoZSBkZXNpcmVkIG1ldGFkYXRhIGZvcm1hdCB0byBiZSB1c2VkIGluIHRoZSAKLSAgICAgKiByZXR1cm5lZCBJSU9NZXRhZGF0YSBvYmplY3QuCi0gICAgICogQHBhcmFtIG5vZGVOYW1lcyB0aGUgbm9kZSBuYW1lcyBvZiB0aGUgZG9jdW1lbnQuCi0gICAgICogCisgICAgICogQHBhcmFtIGZvcm1hdE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXNpcmVkIG1ldGFkYXRhIGZvcm1hdCB0byBiZSB1c2VkIGluIHRoZSByZXR1cm5lZAorICAgICAqICAgICAgICAgICAgSUlPTWV0YWRhdGEgb2JqZWN0LgorICAgICAqIEBwYXJhbSBub2RlTmFtZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBub2RlIG5hbWVzIG9mIHRoZSBkb2N1bWVudC4KICAgICAgKiBAcmV0dXJuIHRoZSBJSU9NZXRhZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIElJT01ldGFkYXRhIGdldFN0cmVhbU1ldGFkYXRhKFN0cmluZyBmb3JtYXROYW1lLCBTZXQ8U3RyaW5nPiBub2RlTmFtZXMpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMzc1LDgzICs0MDEsODYgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBpbWFnZSBtZXRhZGF0YSBvZiB0aGUgc3BlY2lmaWVkIGltYWdlIGluIGlucHV0IHNvdXJjZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UgaW5kZXguCi0gICAgICogCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBpbmRleC4KICAgICAgKiBAcmV0dXJuIHRoZSBJSU9NZXRhZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IElJT01ldGFkYXRhIGdldEltYWdlTWV0YWRhdGEoaW50IGltYWdlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGltYWdlIG1ldGFkYXRhIG9mIHRoZSBzcGVjaWZpZWQgaW1hZ2UgaW5wdXQgc291cmNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSBpbmRleC4KLSAgICAgKiBAcGFyYW0gZm9ybWF0TmFtZSB0aGUgZGVzaXJlZCBtZXRhZGF0YSBmb3JtYXQgdG8gYmUgdXNlZCBpbiB0aGUgCi0gICAgICogcmV0dXJuZWQgSUlPTWV0YWRhdGEgb2JqZWN0LgotICAgICAqIEBwYXJhbSBub2RlTmFtZXMgdGhlIG5vZGUgbmFtZXMgd2hpY2ggY2FuIGJlIGNvbnRhaW5lZCBpbgotICAgICAqIHRoZSBkb2N1bWVudC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGluZGV4LgorICAgICAqIEBwYXJhbSBmb3JtYXROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZGVzaXJlZCBtZXRhZGF0YSBmb3JtYXQgdG8gYmUgdXNlZCBpbiB0aGUgcmV0dXJuZWQKKyAgICAgKiAgICAgICAgICAgIElJT01ldGFkYXRhIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gbm9kZU5hbWVzCisgICAgICogICAgICAgICAgICB0aGUgbm9kZSBuYW1lcyB3aGljaCBjYW4gYmUgY29udGFpbmVkIGluIHRoZSBkb2N1bWVudC4KICAgICAgKiBAcmV0dXJuIHRoZSBJSU9NZXRhZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCi0gICAgcHVibGljIElJT01ldGFkYXRhIGdldEltYWdlTWV0YWRhdGEoaW50IGltYWdlSW5kZXgsIFN0cmluZyBmb3JtYXROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IG5vZGVOYW1lcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgSUlPTWV0YWRhdGEgZ2V0SW1hZ2VNZXRhZGF0YShpbnQgaW1hZ2VJbmRleCwgU3RyaW5nIGZvcm1hdE5hbWUsIFNldDxTdHJpbmc+IG5vZGVOYW1lcykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgaW1hZ2UgYW5kIHJldHVybnMgaXQgYXMgYSBCdWZmZXJlZEltYWdlCi0gICAgICogdXNpbmcgdGhlIGRlZmF1bHQgSW1hZ2VSZWFkUGFyYW0uCi0gICAgICogIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSBpbmRleC4KKyAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIGltYWdlIGFuZCByZXR1cm5zIGl0IGFzIGEgQnVmZmVyZWRJbWFnZSB1c2luZyB0aGUKKyAgICAgKiBkZWZhdWx0IEltYWdlUmVhZFBhcmFtLgogICAgICAqIAorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgaW5kZXguCiAgICAgICogQHJldHVybiB0aGUgQnVmZmVyZWRJbWFnZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIEJ1ZmZlcmVkSW1hZ2UgcmVhZChpbnQgaW1hZ2VJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIHJlYWQoaW1hZ2VJbmRleCwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBpbWFnZSBhbmQgcmV0dXJucyBpdCBhcyBhIEJ1ZmZlcmVkSW1hZ2UKLSAgICAgKiB1c2luZyB0aGUgc3BlY2lmaWVkIEltYWdlUmVhZFBhcmFtLgorICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgaW1hZ2UgYW5kIHJldHVybnMgaXQgYXMgYSBCdWZmZXJlZEltYWdlIHVzaW5nIHRoZQorICAgICAqIHNwZWNpZmllZCBJbWFnZVJlYWRQYXJhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UgaW5kZXguCi0gICAgICogQHBhcmFtIHBhcmFtIHRoZSBJbWFnZVJlYWRQYXJhbS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGluZGV4LgorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlUmVhZFBhcmFtLgogICAgICAqIEByZXR1cm4gdGhlIEJ1ZmZlcmVkSW1hZ2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBCdWZmZXJlZEltYWdlIHJlYWQoaW50IGltYWdlSW5kZXgsIEltYWdlUmVhZFBhcmFtIHBhcmFtKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIGltYWdlIGFuZCByZXR1cm5zIGFuIElJT0ltYWdlIHdpdGggdGhpcyBpbWFnZSwKLSAgICAgKiB0aHVtYm5haWxzLCBhbmQgbWV0YWRhdGEgZm9yIHRoaXMgaW1hZ2UsIHVzaW5nIAotICAgICAqIHRoZSBzcGVjaWZpZWQgSW1hZ2VSZWFkUGFyYW0uCisgICAgICogdGh1bWJuYWlscywgYW5kIG1ldGFkYXRhIGZvciB0aGlzIGltYWdlLCB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICogSW1hZ2VSZWFkUGFyYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlIGluZGV4LgotICAgICAqIEBwYXJhbSBwYXJhbSB0aGUgSW1hZ2VSZWFkUGFyYW0uCi0gICAgICogCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBpbmRleC4KKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVJlYWRQYXJhbS4KICAgICAgKiBAcmV0dXJuIHRoZSBJSU9JbWFnZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIElJT0ltYWdlIHJlYWRBbGwoaW50IGltYWdlSW5kZXgsIEltYWdlUmVhZFBhcmFtIHBhcmFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIEl0ZXJhdG9yIG9mIElJT0ltYWdlcyBmcm9tIHRoZSBpbnB1dCBzb3VyY2UuIAorICAgICAqIFJldHVybnMgYW4gSXRlcmF0b3Igb2YgSUlPSW1hZ2VzIGZyb20gdGhlIGlucHV0IHNvdXJjZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW1zIHRoZSBJdGVyYXRvciBvZiBJbWFnZVJlYWRQYXJhbSBvYmplY3RzLgotICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJhbXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBJdGVyYXRvciBvZiBJbWFnZVJlYWRQYXJhbSBvYmplY3RzLgogICAgICAqIEByZXR1cm4gdGhlIGl0ZXJhdG9yIG9mIElJT0ltYWdlcy4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIEl0ZXJhdG9yPElJT0ltYWdlPiByZWFkQWxsKEl0ZXJhdG9yPD8gZXh0ZW5kcyBJbWFnZVJlYWRQYXJhbT4gcGFyYW1zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKQEAgLTQ2MCwyMyArNDg5LDIzIEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgcGx1Zy1pbiBzdXBwb3J0cyByZWFkaW5nIGEgUmFzdGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBwbHVnLWluIHN1cHBvcnRzIHJlYWRpbmcgYSBSYXN0ZXIsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBwbHVnLWluIHN1cHBvcnRzIHJlYWRpbmcgYSBSYXN0ZXIsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjYW5SZWFkUmFzdGVyKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7IC8vZGVmCisgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZGVmCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSBuZXcgUmFzdGVyIG9iamVjdCB3aGljaCBjb250YWlucyB0aGUgcmF3IHBpeGVsIGRhdGEgZnJvbSAKLSAgICAgKiB0aGUgaW1hZ2UuIAorICAgICAqIFJlYWRzIGEgbmV3IFJhc3RlciBvYmplY3Qgd2hpY2ggY29udGFpbnMgdGhlIHJhdyBwaXhlbCBkYXRhIGZyb20gdGhlCisgICAgICogaW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlIGluZGV4LgotICAgICAqIEBwYXJhbSBwYXJhbSB0aGUgSW1hZ2VSZWFkUGFyYW0uCi0gICAgICogCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBpbmRleC4KKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVJlYWRQYXJhbS4KICAgICAgKiBAcmV0dXJuIHRoZSBSYXN0ZXIuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBSYXN0ZXIgcmVhZFJhc3RlcihpbnQgaW1hZ2VJbmRleCwgSW1hZ2VSZWFkUGFyYW0gcGFyYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQiKTsKQEAgLTQ4NSwyMjAgKzUxNCwyMjYgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBpbWFnZSBoYXMgdGlsZXMgb3Igbm90LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSdzIGluZGV4LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBpbWFnZSBoYXMgdGlsZXMsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UncyBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgaW1hZ2UgaGFzIHRpbGVzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzSW1hZ2VUaWxlZChpbnQgaW1hZ2VJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAvL2RlZgorICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGRlZgogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHRpbGUgd2lkdGggaW4gdGhlIHNwZWNpZmllZCBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UncyBpbmRleC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlJ3MgaW5kZXguCiAgICAgICogQHJldHVybiB0aGUgdGlsZSB3aWR0aC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRUaWxlV2lkdGgoaW50IGltYWdlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRXaWR0aChpbWFnZUluZGV4KTsgLy9kZWYKKyAgICAgICAgcmV0dXJuIGdldFdpZHRoKGltYWdlSW5kZXgpOyAvLyBkZWYKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB0aWxlIGhlaWdodCBpbiB0aGUgc3BlY2lmaWVkIGltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSdzIGluZGV4LgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UncyBpbmRleC4KICAgICAgKiBAcmV0dXJuIHRoZSB0aWxlIGhlaWdodC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRUaWxlSGVpZ2h0KGludCBpbWFnZUluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0SGVpZ2h0KGltYWdlSW5kZXgpOyAvL2RlZgorICAgICAgICByZXR1cm4gZ2V0SGVpZ2h0KGltYWdlSW5kZXgpOyAvLyBkZWYKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSB0aWxlIGdyaWQgaW4gdGhlIAorICAgICAqIEdldHMgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHRpbGUgZ3JpZCBpbiB0aGUKICAgICAgKiBzcGVjaWZpZWQgaW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlJ3MgaW5kZXguCi0gICAgICogCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSdzIGluZGV4LgogICAgICAqIEByZXR1cm4gdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHRpbGUgZ3JpZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRUaWxlR3JpZFhPZmZzZXQoaW50IGltYWdlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAwOyAvL2RlZgorICAgICAgICByZXR1cm4gMDsgLy8gZGVmCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgdGlsZSBncmlkIGluIHRoZSAKKyAgICAgKiBHZXRzIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSB0aWxlIGdyaWQgaW4gdGhlCiAgICAgICogc3BlY2lmaWVkIGltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSdzIGluZGV4LgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UncyBpbmRleC4KICAgICAgKiBAcmV0dXJuIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSB0aWxlIGdyaWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VGlsZUdyaWRZT2Zmc2V0KGludCBpbWFnZUluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gMDsgLy9kZWYKKyAgICAgICAgcmV0dXJuIDA7IC8vIGRlZgogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSB0aWxlIHNwZWNpZmllZCBieSB0aGUgdGlsZVggYW5kIHRpbGVZIHBhcmFtZXRlcnMKLSAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIGltYWdlIGFuZCByZXR1cm5zIGl0IGFzIGEgQnVmZmVyZWRJbWFnZS4gCisgICAgICogUmVhZHMgdGhlIHRpbGUgc3BlY2lmaWVkIGJ5IHRoZSB0aWxlWCBhbmQgdGlsZVkgcGFyYW1ldGVycyBvZiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgaW1hZ2UgYW5kIHJldHVybnMgaXQgYXMgYSBCdWZmZXJlZEltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSBpbmRleC4KLSAgICAgKiBAcGFyYW0gdGlsZVggdGhlIFggaW5kZXggb2YgdGlsZS4KLSAgICAgKiBAcGFyYW0gdGlsZVkgdGhlIFkgaW5kZXggb2YgdGlsZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGluZGV4LgorICAgICAqIEBwYXJhbSB0aWxlWAorICAgICAqICAgICAgICAgICAgdGhlIFggaW5kZXggb2YgdGlsZS4KKyAgICAgKiBAcGFyYW0gdGlsZVkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGluZGV4IG9mIHRpbGUuCiAgICAgICogQHJldHVybiB0aGUgQnVmZmVyZWRJbWFnZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIEJ1ZmZlcmVkSW1hZ2UgcmVhZFRpbGUoaW50IGltYWdlSW5kZXgsIGludCB0aWxlWCwgaW50IHRpbGVZKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgdGlsZSBzcGVjaWZpZWQgYnkgdGhlIHRpbGVYIGFuZCB0aWxlWSBwYXJhbWV0ZXJzCi0gICAgICogb2YgdGhlIHNwZWNpZmllZCBpbWFnZSBhbmQgcmV0dXJucyBpdCBhcyBhIFJhc3Rlci4gCisgICAgICogUmVhZHMgdGhlIHRpbGUgc3BlY2lmaWVkIGJ5IHRoZSB0aWxlWCBhbmQgdGlsZVkgcGFyYW1ldGVycyBvZiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgaW1hZ2UgYW5kIHJldHVybnMgaXQgYXMgYSBSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlIGluZGV4LgotICAgICAqIEBwYXJhbSB0aWxlWCB0aGUgWCBpbmRleCBvZiB0aWxlLgotICAgICAqIEBwYXJhbSB0aWxlWSB0aGUgWSBpbmRleCBvZiB0aWxlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgaW5kZXguCisgICAgICogQHBhcmFtIHRpbGVYCisgICAgICogICAgICAgICAgICB0aGUgWCBpbmRleCBvZiB0aWxlLgorICAgICAqIEBwYXJhbSB0aWxlWQorICAgICAqICAgICAgICAgICAgdGhlIFkgaW5kZXggb2YgdGlsZS4KICAgICAgKiBAcmV0dXJuIHRoZSBSYXN0ZXIuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBSYXN0ZXIgcmVhZFRpbGVSYXN0ZXIoaW50IGltYWdlSW5kZXgsIGludCB0aWxlWCwgaW50IHRpbGVZKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIGltYWdlIHVzaW5nIHRoZSBzcGVjaWZpZWQgCi0gICAgICogSW1hZ2VSZWFkUGFyYW0gYW5kIHJldHVybnMgaXQgYXMgYSBSZW5kZXJlZEltYWdlLgorICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgaW1hZ2UgdXNpbmcgdGhlIHNwZWNpZmllZCBJbWFnZVJlYWRQYXJhbSBhbmQgcmV0dXJucworICAgICAqIGl0IGFzIGEgUmVuZGVyZWRJbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UgaW5kZXguCi0gICAgICogQHBhcmFtIHBhcmFtIHRoZSBJbWFnZVJlYWRQYXJhbS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGluZGV4LgorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlUmVhZFBhcmFtLgogICAgICAqIEByZXR1cm4gdGhlIFJlbmRlcmVkSW1hZ2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwotICAgIHB1YmxpYyBSZW5kZXJlZEltYWdlIHJlYWRBc1JlbmRlcmVkSW1hZ2UoaW50IGltYWdlSW5kZXgsIEltYWdlUmVhZFBhcmFtIHBhcmFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyBSZW5kZXJlZEltYWdlIHJlYWRBc1JlbmRlcmVkSW1hZ2UoaW50IGltYWdlSW5kZXgsIEltYWdlUmVhZFBhcmFtIHBhcmFtKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIHJlYWQoaW1hZ2VJbmRleCwgcGFyYW0pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW1hZ2UgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGlzIHJlYWRlciAKLSAgICAgKiBzdXBwb3J0cyB0aHVtYm5haWwgcHJldmlldyBpbWFnZXMuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBpbWFnZSBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoaXMgcmVhZGVyIHN1cHBvcnRzCisgICAgICogdGh1bWJuYWlsIHByZXZpZXcgaW1hZ2VzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaW1hZ2UgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGlzIHJlYWRlciAKLSAgICAgKiBzdXBwb3J0cyB0aHVtYm5haWwgcHJldmlldyBpbWFnZXMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBpbWFnZSBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoaXMgcmVhZGVyIHN1cHBvcnRzCisgICAgICogICAgICAgICB0aHVtYm5haWwgcHJldmlldyBpbWFnZXMsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZWFkZXJTdXBwb3J0c1RodW1ibmFpbHMoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsgLy9kZWYKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBkZWYKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBpbWFnZSBoYXMgdGh1bWJuYWlscyBvciBub3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlJ3MgaW5kZXguCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIGltYWdlIGhhcyB0aHVtYm5haWxzLAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlJ3MgaW5kZXguCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIGltYWdlIGhhcyB0aHVtYm5haWxzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc1RodW1ibmFpbHMoaW50IGltYWdlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXROdW1UaHVtYm5haWxzKGltYWdlSW5kZXgpID4gMDsgLy9kZWYKKyAgICAgICAgcmV0dXJuIGdldE51bVRodW1ibmFpbHMoaW1hZ2VJbmRleCkgPiAwOyAvLyBkZWYKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgdGh1bWJuYWlscyBmb3IgdGhlIHNwZWNpZmllZCBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UncyBpbmRleC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlJ3MgaW5kZXguCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHRodW1ibmFpbHMuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TnVtVGh1bWJuYWlscyhpbnQgaW1hZ2VJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIDA7IC8vZGVmCisgICAgICAgIHJldHVybiAwOyAvLyBkZWYKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB3aWR0aCBvZiB0aGUgc3BlY2lmaWVkIHRodW1ibmFpbCBmb3IgdGhlIHNwZWNpZmllZCBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UncyBpbmRleC4KLSAgICAgKiBAcGFyYW0gdGh1bWJuYWlsSW5kZXggdGhlIHRodW1ibmFpbCdzIGluZGV4LgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UncyBpbmRleC4KKyAgICAgKiBAcGFyYW0gdGh1bWJuYWlsSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSB0aHVtYm5haWwncyBpbmRleC4KICAgICAgKiBAcmV0dXJuIHRoZSB0aHVtYm5haWwgd2lkdGguCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VGh1bWJuYWlsV2lkdGgoaW50IGltYWdlSW5kZXgsIGludCB0aHVtYm5haWxJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJlYWRUaHVtYm5haWwoaW1hZ2VJbmRleCwgdGh1bWJuYWlsSW5kZXgpLmdldFdpZHRoKCk7ICAvL2RlZgorICAgICAgICByZXR1cm4gcmVhZFRodW1ibmFpbChpbWFnZUluZGV4LCB0aHVtYm5haWxJbmRleCkuZ2V0V2lkdGgoKTsgLy8gZGVmCiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBzcGVjaWZpZWQgdGh1bWJuYWlsIGZvciB0aGUgc3BlY2lmaWVkIGltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSdzIGluZGV4LgotICAgICAqIEBwYXJhbSB0aHVtYm5haWxJbmRleCB0aGUgdGh1bWJuYWlsJ3MgaW5kZXguCi0gICAgICogCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSdzIGluZGV4LgorICAgICAqIEBwYXJhbSB0aHVtYm5haWxJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIHRodW1ibmFpbCdzIGluZGV4LgogICAgICAqIEByZXR1cm4gdGhlIHRodW1ibmFpbCBoZWlnaHQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VGh1bWJuYWlsSGVpZ2h0KGludCBpbWFnZUluZGV4LCBpbnQgdGh1bWJuYWlsSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiByZWFkVGh1bWJuYWlsKGltYWdlSW5kZXgsIHRodW1ibmFpbEluZGV4KS5nZXRIZWlnaHQoKTsgIC8vZGVmCisgICAgICAgIHJldHVybiByZWFkVGh1bWJuYWlsKGltYWdlSW5kZXgsIHRodW1ibmFpbEluZGV4KS5nZXRIZWlnaHQoKTsgLy8gZGVmCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgdGhlIHRodW1ibmFpbCBpbWFnZSBmb3IgdGhlIHNwZWNpZmllZCBpbWFnZQotICAgICAqIGFzIGEgQnVmZmVyZWRJbWFnZS4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlIGluZGV4LgotICAgICAqIEBwYXJhbSB0aHVtYm5haWxJbmRleCB0aGUgdGh1bWJuYWlsIGluZGV4LgorICAgICAqIFJlYWRzIHRoZSB0aHVtYm5haWwgaW1hZ2UgZm9yIHRoZSBzcGVjaWZpZWQgaW1hZ2UgYXMgYSBCdWZmZXJlZEltYWdlLgogICAgICAqIAorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgaW5kZXguCisgICAgICogQHBhcmFtIHRodW1ibmFpbEluZGV4CisgICAgICogICAgICAgICAgICB0aGUgdGh1bWJuYWlsIGluZGV4LgogICAgICAqIEByZXR1cm4gdGhlIEJ1ZmZlcmVkSW1hZ2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlIHJlYWRUaHVtYm5haWwoaW50IGltYWdlSW5kZXgsIGludCB0aHVtYm5haWxJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCIpOyAvL2RlZgorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuc3VwcG9ydGVkIik7IC8vIGRlZgogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcXVlc3RzIGFuIGFib3J0IG9wZXJhdGlvbiBmb3IgY3VycmVudCByZWFkaW5nIG9wZXJhdGlvbi4gCisgICAgICogUmVxdWVzdHMgYW4gYWJvcnQgb3BlcmF0aW9uIGZvciBjdXJyZW50IHJlYWRpbmcgb3BlcmF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFib3J0KCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgYSByZXF1ZXN0IHRvIGFib3J0IHRoZSBjdXJyZW50IHJlYWQgb3BlcmF0aW9uIAotICAgICAqIGhhcyBiZWVuIG1hZGUgc3VjY2Vzc2Z1bGx5LgorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCBhIHJlcXVlc3QgdG8gYWJvcnQgdGhlIGN1cnJlbnQgcmVhZCBvcGVyYXRpb24gaGFzCisgICAgICogYmVlbiBtYWRlIHN1Y2Nlc3NmdWxseS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSByZXF1ZXN0IHRvIGFib3J0IHRoZSBjdXJyZW50IHJlYWQgb3BlcmF0aW9uIAotICAgICAqIGhhcyBiZWVuIG1hZGUgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcmVxdWVzdCB0byBhYm9ydCB0aGUgY3VycmVudCByZWFkIG9wZXJhdGlvbiBoYXMgYmVlbgorICAgICAqICAgICAgICAgbWFkZSBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhYm9ydFJlcXVlc3RlZCgpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xlYXJzIGFsbCBwcmV2aW91cyBhYm9ydCByZXF1ZXN0LCBhbmQgYWJvcnRSZXF1ZXN0ZWQgcmV0dXJucyBmYWxzZQotICAgICAqIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICogQ2xlYXJzIGFsbCBwcmV2aW91cyBhYm9ydCByZXF1ZXN0LCBhbmQgYWJvcnRSZXF1ZXN0ZWQgcmV0dXJucyBmYWxzZSBhZnRlcgorICAgICAqIGNhbGxpbmcgdGhpcyBtZXRob2QuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgY2xlYXJBYm9ydFJlcXVlc3QoKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwpAQCAtNzA3LDcgKzc0Miw4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgSUlPUmVhZFdhcm5pbmdMaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIElJT1JlYWRXYXJuaW5nTGlzdGVuZXIuCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICB0aGUgSUlPUmVhZFdhcm5pbmdMaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRJSU9SZWFkV2FybmluZ0xpc3RlbmVyKElJT1JlYWRXYXJuaW5nTGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CkBAIC03MTYsNyArNzUyLDggQEAKICAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgSUlPUmVhZFdhcm5pbmdMaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIElJT1JlYWRXYXJuaW5nTGlzdGVuZXIgdG8gYmUgcmVtb3ZlZC4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBJSU9SZWFkV2FybmluZ0xpc3RlbmVyIHRvIGJlIHJlbW92ZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlSUlPUmVhZFdhcm5pbmdMaXN0ZW5lcihJSU9SZWFkV2FybmluZ0xpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwpAQCAtNzMyLDcgKzc2OSw4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgSUlPUmVhZFByb2dyZXNzTGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lcihJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKQEAgLTc0MSw3ICs3NzksOCBAQAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIElJT1JlYWRQcm9ncmVzc0xpc3RlbmVyIHRvIGJlIHJlbW92ZWQuCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICB0aGUgSUlPUmVhZFByb2dyZXNzTGlzdGVuZXIgdG8gYmUgcmVtb3ZlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmVJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lcihJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKQEAgLTc1Nyw3ICs3OTYsOCBAQAogICAgIC8qKgogICAgICAqIEFkZHMgdGhlIElJT1JlYWRVcGRhdGVMaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIElJT1JlYWRVcGRhdGVMaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBJSU9SZWFkVXBkYXRlTGlzdGVuZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkSUlPUmVhZFVwZGF0ZUxpc3RlbmVyKElJT1JlYWRVcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKQEAgLTc2Niw3ICs4MDYsOCBAQAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBJSU9SZWFkVXBkYXRlTGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBJSU9SZWFkVXBkYXRlTGlzdGVuZXIgdG8gYmUgcmVtb3ZlZC4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBJSU9SZWFkVXBkYXRlTGlzdGVuZXIgdG8gYmUgcmVtb3ZlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmVJSU9SZWFkVXBkYXRlTGlzdGVuZXIoSUlPUmVhZFVwZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwpAQCAtNzgwLDIyOSArODIxLDI0MyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgc3RhcnQgb2YgYW4gc2VxdWVuY2Ugb2YgaW1hZ2UgcmVhZHMKLSAgICAgKiBieSBjYWxsaW5nIHRoZSBzZXF1ZW5jZVN0YXJ0ZWQgbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIAotICAgICAqIElJT1JlYWRQcm9ncmVzc0xpc3RlbmVycy4gCisgICAgICogUHJvY2Vzc2VzIHRoZSBzdGFydCBvZiBhbiBzZXF1ZW5jZSBvZiBpbWFnZSByZWFkcyBieSBjYWxsaW5nIHRoZQorICAgICAqIHNlcXVlbmNlU3RhcnRlZCBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSUlPUmVhZFByb2dyZXNzTGlzdGVuZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBtaW5JbmRleCB0aGUgbWluaW11bSBpbmRleC4KKyAgICAgKiBAcGFyYW0gbWluSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIGluZGV4LgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NTZXF1ZW5jZVN0YXJ0ZWQoaW50IG1pbkluZGV4KSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgY29tcGxldGlvbiBvZiBhbiBzZXF1ZW5jZSBvZiBpbWFnZSByZWFkcwotICAgICAqIGJ5IGNhbGxpbmcgc2VxdWVuY2VDb21wbGV0ZSBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgCi0gICAgICogSUlPUmVhZFByb2dyZXNzTGlzdGVuZXJzLiAKKyAgICAgKiBQcm9jZXNzZXMgdGhlIGNvbXBsZXRpb24gb2YgYW4gc2VxdWVuY2Ugb2YgaW1hZ2UgcmVhZHMgYnkgY2FsbGluZworICAgICAqIHNlcXVlbmNlQ29tcGxldGUgbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIElJT1JlYWRQcm9ncmVzc0xpc3RlbmVycy4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzU2VxdWVuY2VDb21wbGV0ZSgpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIHRoZSBzdGFydCBvZiBhbiBpbWFnZSByZWFkIGJ5IGNhbGxpbmcgdGhlIGltYWdlU3RhcnRlZAotICAgICAqIG1ldGhvZCBvbiBhbGwgcmVnaXN0ZXJlZCBJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lcnMuCisgICAgICogUHJvY2Vzc2VzIHRoZSBzdGFydCBvZiBhbiBpbWFnZSByZWFkIGJ5IGNhbGxpbmcgdGhlIGltYWdlU3RhcnRlZCBtZXRob2QKKyAgICAgKiBvbiBhbGwgcmVnaXN0ZXJlZCBJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlIGluZGV4LgorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgaW5kZXguCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ltYWdlU3RhcnRlZChpbnQgaW1hZ2VJbmRleCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhlIGN1cnJlbnQgcGVyY2VudGFnZSBvZiBpbWFnZSBjb21wbGV0aW9uIGJ5IGNhbGxpbmcgCi0gICAgICogdGhlIGltYWdlUHJvZ3Jlc3MgbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIElJT1JlYWRQcm9ncmVzc0xpc3RlbmVycy4KKyAgICAgKiBQcm9jZXNzZXMgdGhlIGN1cnJlbnQgcGVyY2VudGFnZSBvZiBpbWFnZSBjb21wbGV0aW9uIGJ5IGNhbGxpbmcgdGhlCisgICAgICogaW1hZ2VQcm9ncmVzcyBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSUlPUmVhZFByb2dyZXNzTGlzdGVuZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwZXJjZW50YWdlRG9uZSB0aGUgcGVyY2VudGFnZSBkb25lLgorICAgICAqIEBwYXJhbSBwZXJjZW50YWdlRG9uZQorICAgICAqICAgICAgICAgICAgdGhlIHBlcmNlbnRhZ2UgZG9uZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW1hZ2VQcm9ncmVzcyhmbG9hdCBwZXJjZW50YWdlRG9uZSkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgaW1hZ2UgY29tcGxldGlvbiBieSBjYWxsaW5nIHRoZSBpbWFnZUNvbXBsZXRlIG1ldGhvZAotICAgICAqIG9uIGFsbCByZWdpc3RlcmVkIElJT1JlYWRQcm9ncmVzc0xpc3RlbmVycy4gCisgICAgICogUHJvY2Vzc2VzIGltYWdlIGNvbXBsZXRpb24gYnkgY2FsbGluZyB0aGUgaW1hZ2VDb21wbGV0ZSBtZXRob2Qgb24gYWxsCisgICAgICogcmVnaXN0ZXJlZCBJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lcnMuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ltYWdlQ29tcGxldGUoKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgc3RhcnQgb2YgYSB0aHVtYm5haWwgcmVhZCBieSBjYWxsaW5nIHRoZQotICAgICAqIHRodW1ibmFpbFN0YXJ0ZWQgbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIElJT1JlYWRQcm9ncmVzc0xpc3RlbmVycy4gCisgICAgICogUHJvY2Vzc2VzIHRoZSBzdGFydCBvZiBhIHRodW1ibmFpbCByZWFkIGJ5IGNhbGxpbmcgdGhlIHRodW1ibmFpbFN0YXJ0ZWQKKyAgICAgKiBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSUlPUmVhZFByb2dyZXNzTGlzdGVuZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSBpbmRleC4KLSAgICAgKiBAcGFyYW0gdGh1bWJuYWlsSW5kZXggdGhlIHRodW1ibmFpbCBpbmRleC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGluZGV4LgorICAgICAqIEBwYXJhbSB0aHVtYm5haWxJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIHRodW1ibmFpbCBpbmRleC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVGh1bWJuYWlsU3RhcnRlZChpbnQgaW1hZ2VJbmRleCwgaW50IHRodW1ibmFpbEluZGV4KSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgY3VycmVudCBwZXJjZW50YWdlIG9mIHRodW1ibmFpbCBjb21wbGV0aW9uIAotICAgICAqIGJ5IGNhbGxpbmcgdGhlIHRodW1ibmFpbFByb2dyZXNzIG1ldGhvZCBvbiBhbGwgcmVnaXN0ZXJlZCAKLSAgICAgKiBJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lcnMuCisgICAgICogUHJvY2Vzc2VzIHRoZSBjdXJyZW50IHBlcmNlbnRhZ2Ugb2YgdGh1bWJuYWlsIGNvbXBsZXRpb24gYnkgY2FsbGluZyB0aGUKKyAgICAgKiB0aHVtYm5haWxQcm9ncmVzcyBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSUlPUmVhZFByb2dyZXNzTGlzdGVuZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwZXJjZW50YWdlRG9uZSB0aGUgcGVyY2VudGFnZSBkb25lLgorICAgICAqIEBwYXJhbSBwZXJjZW50YWdlRG9uZQorICAgICAqICAgICAgICAgICAgdGhlIHBlcmNlbnRhZ2UgZG9uZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVGh1bWJuYWlsUHJvZ3Jlc3MoZmxvYXQgcGVyY2VudGFnZURvbmUpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIHRoZSBjb21wbGV0aW9uIG9mIGEgdGh1bWJuYWlsIHJlYWQgCi0gICAgICogYnkgY2FsbGluZyB0aGUgdGh1bWJuYWlsQ29tcGxldGUgbWV0aG9kIAotICAgICAqIG9uIGFsbCByZWdpc3RlcmVkIElJT1JlYWRQcm9ncmVzc0xpc3RlbmVycy4gCisgICAgICogUHJvY2Vzc2VzIHRoZSBjb21wbGV0aW9uIG9mIGEgdGh1bWJuYWlsIHJlYWQgYnkgY2FsbGluZyB0aGUKKyAgICAgKiB0aHVtYm5haWxDb21wbGV0ZSBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSUlPUmVhZFByb2dyZXNzTGlzdGVuZXJzLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NUaHVtYm5haWxDb21wbGV0ZSgpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgcmVhZCBhYm9ydGVkIGV2ZW50IGJ5IGNhbGxpbmcgdGhlIHJlYWRBYm9ydGVkIAotICAgICAqIG1ldGhvZCBvbiBhbGwgcmVnaXN0ZXJlZCBJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lcnMuCisgICAgICogUHJvY2Vzc2VzIGEgcmVhZCBhYm9ydGVkIGV2ZW50IGJ5IGNhbGxpbmcgdGhlIHJlYWRBYm9ydGVkIG1ldGhvZCBvbiBhbGwKKyAgICAgKiByZWdpc3RlcmVkIElJT1JlYWRQcm9ncmVzc0xpc3RlbmVycy4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUmVhZEFib3J0ZWQoKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgYmVnaW5uaW5nIG9mIGEgcHJvZ3Jlc3NpdmUgcGFzcyBieSBjYWxsaW5nIAotICAgICAqIHRoZSBwYXNzU3RhcnRlZCBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSUlPUmVhZFVwZGF0ZUxpc3RlbmVycy4KKyAgICAgKiBQcm9jZXNzZXMgdGhlIGJlZ2lubmluZyBvZiBhIHByb2dyZXNzaXZlIHBhc3MgYnkgY2FsbGluZyB0aGUgcGFzc1N0YXJ0ZWQKKyAgICAgKiBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSUlPUmVhZFVwZGF0ZUxpc3RlbmVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGhlSW1hZ2UgdGhlIGltYWdlIHRvIGJlIHVwZGF0ZWQuCi0gICAgICogQHBhcmFtIHBhc3MgdGhlIGN1cnJlbnQgcGFzcyBpbmRleC4KLSAgICAgKiBAcGFyYW0gbWluUGFzcyB0aGUgbWluaW11bSBwYXNzIGluZGV4LgotICAgICAqIEBwYXJhbSBtYXhQYXNzIHRoZSBtYXhpbXVtIHBhc3MgaW5kZXguCi0gICAgICogQHBhcmFtIG1pblggdGhlIFggY29vcmRpbmF0ZSBvZiBvZiB0aGUgdXBwZXIgbGVmdCBwaXhlbC4gCi0gICAgICogQHBhcmFtIG1pblkgdGhlIFkgY29vcmRpbmF0ZSBvZiBvZiB0aGUgdXBwZXIgbGVmdCBwaXhlbC4KLSAgICAgKiBAcGFyYW0gcGVyaW9kWCB0aGUgaG9yaXpvbnRhbCBzZXBhcmF0aW9uIGJldHdlZW4gcGl4ZWxzLgotICAgICAqIEBwYXJhbSBwZXJpb2RZIHRoZSB2ZXJ0aWNhbCBzZXBhcmF0aW9uIGJldHdlZW4gcGl4ZWxzLgotICAgICAqIEBwYXJhbSBiYW5kcyB0aGUgbnVtYmVyIG9mIGFmZmVjdGVkIGJhbmRzLgorICAgICAqIEBwYXJhbSB0aGVJbWFnZQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIHRvIGJlIHVwZGF0ZWQuCisgICAgICogQHBhcmFtIHBhc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHBhc3MgaW5kZXguCisgICAgICogQHBhcmFtIG1pblBhc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIHBhc3MgaW5kZXguCisgICAgICogQHBhcmFtIG1heFBhc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIHBhc3MgaW5kZXguCisgICAgICogQHBhcmFtIG1pblgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2Ygb2YgdGhlIHVwcGVyIGxlZnQgcGl4ZWwuCisgICAgICogQHBhcmFtIG1pblkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2Ygb2YgdGhlIHVwcGVyIGxlZnQgcGl4ZWwuCisgICAgICogQHBhcmFtIHBlcmlvZFgKKyAgICAgKiAgICAgICAgICAgIHRoZSBob3Jpem9udGFsIHNlcGFyYXRpb24gYmV0d2VlbiBwaXhlbHMuCisgICAgICogQHBhcmFtIHBlcmlvZFkKKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZXJ0aWNhbCBzZXBhcmF0aW9uIGJldHdlZW4gcGl4ZWxzLgorICAgICAqIEBwYXJhbSBiYW5kcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBhZmZlY3RlZCBiYW5kcy4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUGFzc1N0YXJ0ZWQoQnVmZmVyZWRJbWFnZSB0aGVJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluUGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4UGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGVyaW9kWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGVyaW9kWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSBiYW5kcykgeworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NQYXNzU3RhcnRlZChCdWZmZXJlZEltYWdlIHRoZUltYWdlLCBpbnQgcGFzcywgaW50IG1pblBhc3MsIGludCBtYXhQYXNzLAorICAgICAgICAgICAgaW50IG1pblgsIGludCBtaW5ZLCBpbnQgcGVyaW9kWCwgaW50IHBlcmlvZFksIGludFtdIGJhbmRzKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgdXBkYXRlIG9mIGEgc2V0IG9mIHNhbXBsZXMgYnkgY2FsbGluZyAKLSAgICAgKiB0aGUgaW1hZ2VVcGRhdGUgbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIElJT1JlYWRVcGRhdGVMaXN0ZW5lcnMuICAKKyAgICAgKiBQcm9jZXNzZXMgdGhlIHVwZGF0ZSBvZiBhIHNldCBvZiBzYW1wbGVzIGJ5IGNhbGxpbmcgdGhlIGltYWdlVXBkYXRlCisgICAgICogbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIElJT1JlYWRVcGRhdGVMaXN0ZW5lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRoZUltYWdlIHRoZSBpbWFnZSB0byBiZSB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBtaW5YIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgcGl4ZWwuCi0gICAgICogQHBhcmFtIG1pblkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBwaXhlbC4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHVwZGF0ZWQgYXJlYS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdXBkYXRlZCBhcmVhLgotICAgICAqIEBwYXJhbSBwZXJpb2RYIHRoZSBob3Jpem9udGFsIHNlcGFyYXRpb24gYmV0d2VlbiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHBlcmlvZFkgdGhlIHZlcnRpY2FsIHNlcGFyYXRpb24gYmV0d2VlbiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGJhbmRzIHRoZSBudW1iZXIgb2YgYWZmZWN0ZWQgYmFuZHMuCisgICAgICogQHBhcmFtIHRoZUltYWdlCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgdG8gYmUgdXBkYXRlZC4KKyAgICAgKiBAcGFyYW0gbWluWAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBwaXhlbC4KKyAgICAgKiBAcGFyYW0gbWluWQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBwaXhlbC4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB1cGRhdGVkIGFyZWEuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB1cGRhdGVkIGFyZWEuCisgICAgICogQHBhcmFtIHBlcmlvZFgKKyAgICAgKiAgICAgICAgICAgIHRoZSBob3Jpem9udGFsIHNlcGFyYXRpb24gYmV0d2VlbiBwaXhlbHMuCisgICAgICogQHBhcmFtIHBlcmlvZFkKKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZXJ0aWNhbCBzZXBhcmF0aW9uIGJldHdlZW4gcGl4ZWxzLgorICAgICAqIEBwYXJhbSBiYW5kcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBhZmZlY3RlZCBiYW5kcy4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW1hZ2VVcGRhdGUoQnVmZmVyZWRJbWFnZSB0aGVJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGVyaW9kWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGVyaW9kWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSBiYW5kcykgeworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbWFnZVVwZGF0ZShCdWZmZXJlZEltYWdlIHRoZUltYWdlLCBpbnQgbWluWCwgaW50IG1pblksIGludCB3aWR0aCwKKyAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBwZXJpb2RYLCBpbnQgcGVyaW9kWSwgaW50W10gYmFuZHMpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIHRoZSBlbmQgb2YgYSBwcm9ncmVzc2l2ZSBwYXNzIGJ5IGNhbGxpbmcgcGFzc0NvbXBsZXRlCi0gICAgICogbWV0aG9kIG9mIHJlZ2lzdGVyZWQgSUlPUmVhZFVwZGF0ZUxpc3RlbmVycy4KKyAgICAgKiBQcm9jZXNzZXMgdGhlIGVuZCBvZiBhIHByb2dyZXNzaXZlIHBhc3MgYnkgY2FsbGluZyBwYXNzQ29tcGxldGUgbWV0aG9kIG9mCisgICAgICogcmVnaXN0ZXJlZCBJSU9SZWFkVXBkYXRlTGlzdGVuZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0aGVJbWFnZSB0aGUgaW1hZ2UgdG8gYmUgdXBkYXRlZC4KKyAgICAgKiBAcGFyYW0gdGhlSW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byBiZSB1cGRhdGVkLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NQYXNzQ29tcGxldGUoQnVmZmVyZWRJbWFnZSB0aGVJbWFnZSkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhlIGJlZ2lubmluZyBvZiBhIHRodW1ibmFpbCBwcm9ncmVzc2l2ZSBwYXNzCi0gICAgICogYnkgY2FsbGluZyB0aGUgdGh1bWJuYWlsUGFzc1N0YXJ0ZWQgbWV0aG9kIG9uIGFsbCAKLSAgICAgKiByZWdpc3RlcmVkIElJT1JlYWRVcGRhdGVMaXN0ZW5lcnMuCisgICAgICogUHJvY2Vzc2VzIHRoZSBiZWdpbm5pbmcgb2YgYSB0aHVtYm5haWwgcHJvZ3Jlc3NpdmUgcGFzcyBieSBjYWxsaW5nIHRoZQorICAgICAqIHRodW1ibmFpbFBhc3NTdGFydGVkIG1ldGhvZCBvbiBhbGwgcmVnaXN0ZXJlZCBJSU9SZWFkVXBkYXRlTGlzdGVuZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0aGVUaHVtYm5haWwgdGhlIHRoZSB0aHVtYm5haWwgdG8gYmUgdXBkYXRlZC4KLSAgICAgKiBAcGFyYW0gcGFzcyB0aGUgY3VycmVudCBwYXNzIGluZGV4LgotICAgICAqIEBwYXJhbSBtaW5QYXNzIHRoZSBtaW5pbXVtIHBhc3MgaW5kZXguCi0gICAgICogQHBhcmFtIG1heFBhc3MgdGhlIG1heGltdW0gcGFzcyBpbmRleC4KLSAgICAgKiBAcGFyYW0gbWluWCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IHBpeGVsLiAKLSAgICAgKiBAcGFyYW0gbWluWSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IHBpeGVsLgotICAgICAqIEBwYXJhbSBwZXJpb2RYIHRoZSBob3Jpem9udGFsIHNlcGFyYXRpb24gYmV0d2VlbiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHBlcmlvZFkgdGhlIHZlcnRpY2FsIHNlcGFyYXRpb24gYmV0d2VlbiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGJhbmRzIHRoZSBudW1iZXIgb2YgYWZmZWN0ZWQgYmFuZHMuCisgICAgICogQHBhcmFtIHRoZVRodW1ibmFpbAorICAgICAqICAgICAgICAgICAgdGhlIHRodW1ibmFpbCB0byBiZSB1cGRhdGVkLgorICAgICAqIEBwYXJhbSBwYXNzCisgICAgICogICAgICAgICAgICB0aGUgY3VycmVudCBwYXNzIGluZGV4LgorICAgICAqIEBwYXJhbSBtaW5QYXNzCisgICAgICogICAgICAgICAgICB0aGUgbWluaW11bSBwYXNzIGluZGV4LgorICAgICAqIEBwYXJhbSBtYXhQYXNzCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBwYXNzIGluZGV4LgorICAgICAqIEBwYXJhbSBtaW5YCisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IHBpeGVsLgorICAgICAqIEBwYXJhbSBtaW5ZCisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IHBpeGVsLgorICAgICAqIEBwYXJhbSBwZXJpb2RYCisgICAgICogICAgICAgICAgICB0aGUgaG9yaXpvbnRhbCBzZXBhcmF0aW9uIGJldHdlZW4gcGl4ZWxzLgorICAgICAqIEBwYXJhbSBwZXJpb2RZCisgICAgICogICAgICAgICAgICB0aGUgdmVydGljYWwgc2VwYXJhdGlvbiBiZXR3ZWVuIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gYmFuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYWZmZWN0ZWQgYmFuZHMuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1RodW1ibmFpbFBhc3NTdGFydGVkKEJ1ZmZlcmVkSW1hZ2UgdGhlVGh1bWJuYWlsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5QYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhQYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5YLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwZXJpb2RYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwZXJpb2RZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIGJhbmRzKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1RodW1ibmFpbFBhc3NTdGFydGVkKEJ1ZmZlcmVkSW1hZ2UgdGhlVGh1bWJuYWlsLCBpbnQgcGFzcywgaW50IG1pblBhc3MsCisgICAgICAgICAgICBpbnQgbWF4UGFzcywgaW50IG1pblgsIGludCBtaW5ZLCBpbnQgcGVyaW9kWCwgaW50IHBlcmlvZFksIGludFtdIGJhbmRzKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgdXBkYXRlIG9mIGEgc2V0IG9mIHNhbXBsZXMgaW4gYSB0aHVtYm5haWwgCi0gICAgICogaW1hZ2UgYnkgY2FsbGluZyB0aGUgdGh1bWJuYWlsVXBkYXRlIG1ldGhvZCBvbiBhbGwKLSAgICAgKiByZWdpc3RlcmVkIElJT1JlYWRVcGRhdGVMaXN0ZW5lcnMuIAorICAgICAqIFByb2Nlc3NlcyB0aGUgdXBkYXRlIG9mIGEgc2V0IG9mIHNhbXBsZXMgaW4gYSB0aHVtYm5haWwgaW1hZ2UgYnkgY2FsbGluZworICAgICAqIHRoZSB0aHVtYm5haWxVcGRhdGUgbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIElJT1JlYWRVcGRhdGVMaXN0ZW5lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRoZVRodW1ibmFpbCB0aGUgdGhlIHRodW1ibmFpbCB0byBiZSB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBtaW5YIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgcGl4ZWwuIAotICAgICAqIEBwYXJhbSBtaW5ZIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgcGl4ZWwuCi0gICAgICogQHBhcmFtIHBlcmlvZFggdGhlIGhvcml6b250YWwgc2VwYXJhdGlvbiBiZXR3ZWVuIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gcGVyaW9kWSB0aGUgdmVydGljYWwgc2VwYXJhdGlvbiBiZXR3ZWVuIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gYmFuZHMgdGhlIG51bWJlciBvZiBhZmZlY3RlZCBiYW5kcy4KKyAgICAgKiBAcGFyYW0gdGhlVGh1bWJuYWlsCisgICAgICogICAgICAgICAgICB0aGUgdGh1bWJuYWlsIHRvIGJlIHVwZGF0ZWQuCisgICAgICogQHBhcmFtIG1pblgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgcGl4ZWwuCisgICAgICogQHBhcmFtIG1pblkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgcGl4ZWwuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgdG90YWwgd2lkdGggb2YgdGhlIHVwZGF0ZWQgYXJlYS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgdG90YWwgaGVpZ2h0IG9mIHRoZSB1cGRhdGVkIGFyZWEuCisgICAgICogQHBhcmFtIHBlcmlvZFgKKyAgICAgKiAgICAgICAgICAgIHRoZSBob3Jpem9udGFsIHNlcGFyYXRpb24gYmV0d2VlbiBwaXhlbHMuCisgICAgICogQHBhcmFtIHBlcmlvZFkKKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZXJ0aWNhbCBzZXBhcmF0aW9uIGJldHdlZW4gcGl4ZWxzLgorICAgICAqIEBwYXJhbSBiYW5kcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBhZmZlY3RlZCBiYW5kcy4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVGh1bWJuYWlsVXBkYXRlKEJ1ZmZlcmVkSW1hZ2UgdGhlVGh1bWJuYWlsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pblksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBlcmlvZFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwZXJpb2RZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gYmFuZHMpIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVGh1bWJuYWlsVXBkYXRlKEJ1ZmZlcmVkSW1hZ2UgdGhlVGh1bWJuYWlsLCBpbnQgbWluWCwgaW50IG1pblksCisgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwZXJpb2RYLCBpbnQgcGVyaW9kWSwgaW50W10gYmFuZHMpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIHRoZSBlbmQgb2YgYSB0aHVtYm5haWwgcHJvZ3Jlc3NpdmUgcGFzcyAKLSAgICAgKiBieSBjYWxsaW5nIHRoZSB0aHVtYm5haWxQYXNzQ29tcGxldGUgbWV0aG9kCi0gICAgICogb24gYWxsIHJlZ2lzdGVyZWQgSUlPUmVhZFVwZGF0ZUxpc3RlbmVycy4gCisgICAgICogUHJvY2Vzc2VzIHRoZSBlbmQgb2YgYSB0aHVtYm5haWwgcHJvZ3Jlc3NpdmUgcGFzcyBieSBjYWxsaW5nIHRoZQorICAgICAqIHRodW1ibmFpbFBhc3NDb21wbGV0ZSBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSUlPUmVhZFVwZGF0ZUxpc3RlbmVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGhlVGh1bWJuYWlsIHRoZSB0aHVtYm5haWwgdG8gYmUgdXBkYXRlZC4KKyAgICAgKiBAcGFyYW0gdGhlVGh1bWJuYWlsCisgICAgICogICAgICAgICAgICB0aGUgdGh1bWJuYWlsIHRvIGJlIHVwZGF0ZWQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1RodW1ibmFpbFBhc3NDb21wbGV0ZShCdWZmZXJlZEltYWdlIHRoZVRodW1ibmFpbCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSB3YXJuaW5nIG1lc3NhZ2UgYnkgY2FsbGluZyB3YXJuaW5nT2NjdXJyZWQgbWV0aG9kCi0gICAgICogb2YgcmVnaXN0ZXJlZCBJSU9SZWFkV2FybmluZ0xpc3RlbmVycy4KKyAgICAgKiBQcm9jZXNzZXMgYSB3YXJuaW5nIG1lc3NhZ2UgYnkgY2FsbGluZyB3YXJuaW5nT2NjdXJyZWQgbWV0aG9kIG9mCisgICAgICogcmVnaXN0ZXJlZCBJSU9SZWFkV2FybmluZ0xpc3RlbmVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2FybmluZyB0aGUgd2FybmluZy4KKyAgICAgKiBAcGFyYW0gd2FybmluZworICAgICAqICAgICAgICAgICAgdGhlIHdhcm5pbmcuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1dhcm5pbmdPY2N1cnJlZChTdHJpbmcgd2FybmluZykgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSB3YXJuaW5nIGJ5IGNhbGxpbmcgdGhlIHdhcm5pbmdPY2N1cnJlZCBtZXRob2QgCi0gICAgICogb2Ygb24gYWxsIHJlZ2lzdGVyZWQgSUlPUmVhZFdhcm5pbmdMaXN0ZW5lcnMuCisgICAgICogUHJvY2Vzc2VzIGEgd2FybmluZyBieSBjYWxsaW5nIHRoZSB3YXJuaW5nT2NjdXJyZWQgbWV0aG9kIG9mIG9uIGFsbAorICAgICAqIHJlZ2lzdGVyZWQgSUlPUmVhZFdhcm5pbmdMaXN0ZW5lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJhc2VOYW1lIHRoZSBiYXNlIG5hbWUgb2YgUmVzb3VyY2VCdW5kbGVzLgotICAgICAqIEBwYXJhbSBrZXl3b3JkIHRoZSBrZXl3b3JkIHRvIGluZGV4IHRoZSB3YXJuaW5nIGFtb25nIFJlc291cmNlQnVuZGxlcy4KKyAgICAgKiBAcGFyYW0gYmFzZU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYXNlIG5hbWUgb2YgUmVzb3VyY2VCdW5kbGVzLgorICAgICAqIEBwYXJhbSBrZXl3b3JkCisgICAgICogICAgICAgICAgICB0aGUga2V5d29yZCB0byBpbmRleCB0aGUgd2FybmluZyBhbW9uZyBSZXNvdXJjZUJ1bmRsZXMuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1dhcm5pbmdPY2N1cnJlZChTdHJpbmcgYmFzZU5hbWUsIFN0cmluZyBrZXl3b3JkKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwpAQCAtMTAyOSwxMyArMTA4NCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJlZ2lvbiBvZiBzb3VyY2UgaW1hZ2UgdGhhdCBzaG91bGQgYmUgcmVhZCB3aXRoIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgd2lkdGgsIGhlaWdodCBhbmQgSW1hZ2VSZWFkUGFyYW0uIAorICAgICAqIEdldHMgdGhlIHJlZ2lvbiBvZiBzb3VyY2UgaW1hZ2UgdGhhdCBzaG91bGQgYmUgcmVhZCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB3aWR0aCwgaGVpZ2h0IGFuZCBJbWFnZVJlYWRQYXJhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIEltYWdlUmVhZFBhcmFtIG9iamVjdCwgb3IgbnVsbC4KLSAgICAgKiBAcGFyYW0gc3JjV2lkdGggdGhlIHNvdXJjZSBpbWFnZSdzIHdpZHRoLgotICAgICAqIEBwYXJhbSBzcmNIZWlnaHQgdGhlIHNvdXJjZSBpbWFnZSdzICBoZWlnaHQuCi0gICAgICogCisgICAgICogQHBhcmFtIHBhcmFtCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VSZWFkUGFyYW0gb2JqZWN0LCBvciBudWxsLgorICAgICAqIEBwYXJhbSBzcmNXaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBpbWFnZSdzIHdpZHRoLgorICAgICAqIEBwYXJhbSBzcmNIZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgaW1hZ2UncyBoZWlnaHQuCiAgICAgICogQHJldHVybiB0aGUgUmVjdGFuZ2xlIG9mIHNvdXJjZSByZWdpb24uCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBSZWN0YW5nbGUgZ2V0U291cmNlUmVnaW9uKEltYWdlUmVhZFBhcmFtIHBhcmFtLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQpIHsKQEAgLTEwNDMsNTggKzExMDAsNjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wdXRlcyB0aGUgc3BlY2lmaWVkIHNvdXJjZSByZWdpb24gYW5kIHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24gCi0gICAgICogcmVnaW9uIHdpdGggdGhlIHNwZWNpZmllZCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc291cmNlIGltYWdlLAotICAgICAqIGFuIG9wdGlvbmFsIGRlc3RpbmF0aW9uIGltYWdlLCBhbmQgYW4gSW1hZ2VSZWFkUGFyYW0uIAorICAgICAqIENvbXB1dGVzIHRoZSBzcGVjaWZpZWQgc291cmNlIHJlZ2lvbiBhbmQgdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbiByZWdpb24KKyAgICAgKiB3aXRoIHRoZSBzcGVjaWZpZWQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHNvdXJjZSBpbWFnZSwgYW4gb3B0aW9uYWwKKyAgICAgKiBkZXN0aW5hdGlvbiBpbWFnZSwgYW5kIGFuIEltYWdlUmVhZFBhcmFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJhbSB0aGUgYW4gSW1hZ2VSZWFkUGFyYW0gb2JqZWN0LCBvciBudWxsLgotICAgICAqIEBwYXJhbSBzcmNXaWR0aCB0aGUgc291cmNlIGltYWdlJ3Mgd2lkdGguCi0gICAgICogQHBhcmFtIHNyY0hlaWdodCB0aGUgc291cmNlIGltYWdlJ3MgaGVpZ2h0LgotICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgZGVzdGluYXRpb24gaW1hZ2UuCi0gICAgICogQHBhcmFtIHNyY1JlZ2lvbiB0aGUgc291cmNlIHJlZ2lvbi4KLSAgICAgKiBAcGFyYW0gZGVzdFJlZ2lvbiB0aGUgZGVzdGluYXRpb24gcmVnaW9uLgorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIGFuIEltYWdlUmVhZFBhcmFtIG9iamVjdCwgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gc3JjV2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgaW1hZ2UncyB3aWR0aC4KKyAgICAgKiBAcGFyYW0gc3JjSGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGltYWdlJ3MgaGVpZ2h0LgorICAgICAqIEBwYXJhbSBpbWFnZQorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGltYWdlLgorICAgICAqIEBwYXJhbSBzcmNSZWdpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgcmVnaW9uLgorICAgICAqIEBwYXJhbSBkZXN0UmVnaW9uCisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gcmVnaW9uLgogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBjb21wdXRlUmVnaW9ucyhJbWFnZVJlYWRQYXJhbSBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZEltYWdlIGltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBzcmNSZWdpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGRlc3RSZWdpb24pIHsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY29tcHV0ZVJlZ2lvbnMoSW1hZ2VSZWFkUGFyYW0gcGFyYW0sIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKKyAgICAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgaW1hZ2UsIFJlY3RhbmdsZSBzcmNSZWdpb24sIFJlY3RhbmdsZSBkZXN0UmVnaW9uKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgdmFsaWRpdHkgb2YgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYmFuZCBhbmQgaXMgY2FsbGVkCi0gICAgICogd2hlbiB0aGUgcmVhZGVyIGtub3dzIHRoZSBudW1iZXIgb2YgYmFuZHMgb2YgdGhlIHNvdXJjZSBpbWFnZSBhbmQgCi0gICAgICogdGhlIG51bWJlciBvZiBiYW5kcyBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2UuIAorICAgICAqIENoZWNrcyB0aGUgdmFsaWRpdHkgb2YgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYmFuZCBhbmQgaXMgY2FsbGVkIHdoZW4KKyAgICAgKiB0aGUgcmVhZGVyIGtub3dzIHRoZSBudW1iZXIgb2YgYmFuZHMgb2YgdGhlIHNvdXJjZSBpbWFnZSBhbmQgdGhlIG51bWJlcgorICAgICAqIG9mIGJhbmRzIG9mIHRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIEltYWdlUmVhZFBhcmFtIGZvciByZWFkaW5nIHRoZSBJbWFnZS4KLSAgICAgKiBAcGFyYW0gbnVtU3JjQmFuZHMgdGhlIG51bWJlciBvZiBiYW5kcyBpbiB0aGUgc291cmNlLgotICAgICAqIEBwYXJhbSBudW1Ec3RCYW5kcyB0aGUgbnVtYmVyIG9mIGJhbmRzIGluIHRoZSBkZXN0aW5hdGlvbi4KKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVJlYWRQYXJhbSBmb3IgcmVhZGluZyB0aGUgSW1hZ2UuCisgICAgICogQHBhcmFtIG51bVNyY0JhbmRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJhbmRzIGluIHRoZSBzb3VyY2UuCisgICAgICogQHBhcmFtIG51bURzdEJhbmRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJhbmRzIGluIHRoZSBkZXN0aW5hdGlvbi4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY2hlY2tSZWFkUGFyYW1CYW5kU2V0dGluZ3MoSW1hZ2VSZWFkUGFyYW0gcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bVNyY0JhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1Ec3RCYW5kcykgeworICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBjaGVja1JlYWRQYXJhbUJhbmRTZXR0aW5ncyhJbWFnZVJlYWRQYXJhbSBwYXJhbSwgaW50IG51bVNyY0JhbmRzLAorICAgICAgICAgICAgaW50IG51bURzdEJhbmRzKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRlc3RpbmF0aW9uIGltYWdlIHdoZXJlIHRoZSBkZWNvZGVkIGRhdGEgaXMgd3JpdHRlbi4gCisgICAgICogR2V0cyB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugd2hlcmUgdGhlIGRlY29kZWQgZGF0YSBpcyB3cml0dGVuLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJhbSB0aGUgSW1hZ2VSZWFkUGFyYW0uCi0gICAgICogQHBhcmFtIGltYWdlVHlwZXMgdGhlIGl0ZXJhdG9yIG9mIEltYWdlVHlwZVNwZWNpZmllciBvYmplY3RzLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGJlaW5nIGRlY29kZWQuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBiZWluZyBkZWNvZGVkLgotICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlUmVhZFBhcmFtLgorICAgICAqIEBwYXJhbSBpbWFnZVR5cGVzCisgICAgICogICAgICAgICAgICB0aGUgaXRlcmF0b3Igb2YgSW1hZ2VUeXBlU3BlY2lmaWVyIG9iamVjdHMuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGJlaW5nIGRlY29kZWQuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgYmVpbmcgZGVjb2RlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBCdWZmZXJlZEltYWdlIHdoZXJlIGRlY29kZWQgcGl4ZWxzIHNob3VsZCBiZSB3cml0dGVuLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSUlPRXhjZXB0aW9uIHRoZSBJSU9FeGNlcHRpb24gaXMgdGhyb3duIGlmIAotICAgICAqIHRoZXJlIGlzIG5vIHN1aXRhYmxlIEltYWdlVHlwZVNwZWNpZmllci4KKyAgICAgKiBAdGhyb3dzIElJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHRoZSBJSU9FeGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZXJlIGlzIG5vIHN1aXRhYmxlCisgICAgICogICAgICAgICAgICAgSW1hZ2VUeXBlU3BlY2lmaWVyLgogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgQnVmZmVyZWRJbWFnZSBnZXREZXN0aW5hdGlvbihJbWFnZVJlYWRQYXJhbSBwYXJhbSwgSXRlcmF0b3I8SW1hZ2VUeXBlU3BlY2lmaWVyPiBpbWFnZVR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElJT0V4Y2VwdGlvbiB7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBCdWZmZXJlZEltYWdlIGdldERlc3RpbmF0aW9uKEltYWdlUmVhZFBhcmFtIHBhcmFtLAorICAgICAgICAgICAgSXRlcmF0b3I8SW1hZ2VUeXBlU3BlY2lmaWVyPiBpbWFnZVR5cGVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHRocm93cyBJSU9FeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9JbWFnZVRyYW5zY29kZXIuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlVHJhbnNjb2Rlci5qYXZhCmluZGV4IDFhMGRlNzYuLjYzMmQ4OTAgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlVHJhbnNjb2Rlci5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlVHJhbnNjb2Rlci5qYXZhCkBAIC0xOCw0MyArMTgsNTAgQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW87CiAKIGltcG9ydCBqYXZheC5pbWFnZWlvLm1ldGFkYXRhLklJT01ldGFkYXRhOwogaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VUeXBlU3BlY2lmaWVyOwogCiAvKioKLSAqIFRoZSBJbWFnZVRyYW5zY29kZXIgaW50ZXJmYWNlIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdAotICogcGVyZm9ybSBpbWFnZSB0cmFuc2NvZGluZyBvcGVyYXRpb25zLCB0aGF0IGlzLCB0YWtlIGltYWdlcyB3cml0dGVuCi0gKiBpbiBvbmUgZm9ybWF0IGFuZCB3cml0ZSB0aGVtIGluIGFub3RoZXIgZm9ybWF0IHVzaW5nCi0gKiByZWFkL3dyaXRlIG9wZXJhdGlvbnMuIFNvbWUgaW1hZ2UgZGF0YSBjYW4gYmUgbG9zdCBpbiBzdWNoIHByb2Nlc3Nlcy4KLSAqIFRoZSBJbWFnZVRyYW5zY29kZXIgaW50ZXJmYWNlIGNvbnZlcnRzIG1ldGFkYXRhIG9iamVjdHMgKElJT01ldGFkYXRhKQotICogb2YgSW1hZ2VSZWFkZXIgdG8gYXByb3ByaWF0ZSBtZXRhZGF0YSBvYmplY3QgZm9yIEltYWdlV3JpdGVyLgorICogVGhlIEltYWdlVHJhbnNjb2RlciBpbnRlcmZhY2UgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHBlcmZvcm0KKyAqIGltYWdlIHRyYW5zY29kaW5nIG9wZXJhdGlvbnMsIHRoYXQgaXMsIHRha2UgaW1hZ2VzIHdyaXR0ZW4gaW4gb25lIGZvcm1hdCBhbmQKKyAqIHdyaXRlIHRoZW0gaW4gYW5vdGhlciBmb3JtYXQgdXNpbmcgcmVhZC93cml0ZSBvcGVyYXRpb25zLiBTb21lIGltYWdlIGRhdGEgY2FuCisgKiBiZSBsb3N0IGluIHN1Y2ggcHJvY2Vzc2VzLiBUaGUgSW1hZ2VUcmFuc2NvZGVyIGludGVyZmFjZSBjb252ZXJ0cyBtZXRhZGF0YQorICogb2JqZWN0cyAoSUlPTWV0YWRhdGEpIG9mIEltYWdlUmVhZGVyIHRvIGFwcHJvcHJpYXRlIG1ldGFkYXRhIG9iamVjdCBmb3IKKyAqIEltYWdlV3JpdGVyLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJbWFnZVRyYW5zY29kZXIgewotICAgIAorCiAgICAgLyoqCiAgICAgICogQ29udmVydHMgdGhlIHNwZWNpZmllZCBJSU9NZXRhZGF0YSBvYmplY3QgdXNpbmcgdGhlIHNwZWNpZmllZAogICAgICAqIEltYWdlV3JpdGVQYXJhbSBmb3Igb2J0YWluaW5nIHdyaXRlcidzIG1ldGFkYXRhIHN0cnVjdHVyZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5EYXRhIHRoZSBJSU9NZXRhZGF0YS4KLSAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIEltYWdlV3JpdGVQYXJhbS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5EYXRhCisgICAgICogICAgICAgICAgICB0aGUgSUlPTWV0YWRhdGEuCisgICAgICogQHBhcmFtIHBhcmFtCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VXcml0ZVBhcmFtLgogICAgICAqIEByZXR1cm4gdGhlIElJT01ldGFkYXRhLCBvciBudWxsLgogICAgICAqLwogICAgIElJT01ldGFkYXRhIGNvbnZlcnRTdHJlYW1NZXRhZGF0YShJSU9NZXRhZGF0YSBpbkRhdGEsIEltYWdlV3JpdGVQYXJhbSBwYXJhbSk7CiAKICAgICAvKioKICAgICAgKiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIElJT01ldGFkYXRhIG9iamVjdCB1c2luZyB0aGUgc3BlY2lmaWVkCi0gICAgICogSW1hZ2VXcml0ZVBhcmFtIGZvciBvYnRhaW5pbmcgd3JpdGVyJ3MgbWV0YWRhdGEgc3RydWN0dXJlIAotICAgICAqIGFuZCBJbWFnZVR5cGVTcGVjaWZpZXIgb2JqZWN0IGZvciBvYnRhaW5pbmcgdGhlIGxheW91dCBhbmQgCi0gICAgICogY29sb3IgaW5mb3JtYXRpb24gb2YgdGhlIGltYWdlIGZvciB0aGlzIG1ldGFkYXRhLgorICAgICAqIEltYWdlV3JpdGVQYXJhbSBmb3Igb2J0YWluaW5nIHdyaXRlcidzIG1ldGFkYXRhIHN0cnVjdHVyZSBhbmQKKyAgICAgKiBJbWFnZVR5cGVTcGVjaWZpZXIgb2JqZWN0IGZvciBvYnRhaW5pbmcgdGhlIGxheW91dCBhbmQgY29sb3IgaW5mb3JtYXRpb24KKyAgICAgKiBvZiB0aGUgaW1hZ2UgZm9yIHRoaXMgbWV0YWRhdGEuCiAgICAgICogCi0gICAgICogQHBhcmFtIGluRGF0YSB0aGUgSUlPTWV0YWRhdGEuCi0gICAgICogQHBhcmFtIGltYWdlVHlwZSB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyLgotICAgICAqIEBwYXJhbSBwYXJhbSB0aGUgSW1hZ2VXcml0ZVBhcmFtLgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbkRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBJSU9NZXRhZGF0YS4KKyAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyLgorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlV3JpdGVQYXJhbS4KICAgICAgKiBAcmV0dXJuIHRoZSBJSU9NZXRhZGF0YSwgb3IgbnVsbC4KICAgICAgKi8KLSAgICBJSU9NZXRhZGF0YSBjb252ZXJ0SW1hZ2VNZXRhZGF0YShJSU9NZXRhZGF0YSBpbkRhdGEsIEltYWdlVHlwZVNwZWNpZmllciBpbWFnZVR5cGUsIEltYWdlV3JpdGVQYXJhbSBwYXJhbSk7CisgICAgSUlPTWV0YWRhdGEgY29udmVydEltYWdlTWV0YWRhdGEoSUlPTWV0YWRhdGEgaW5EYXRhLCBJbWFnZVR5cGVTcGVjaWZpZXIgaW1hZ2VUeXBlLAorICAgICAgICAgICAgSW1hZ2VXcml0ZVBhcmFtIHBhcmFtKTsKIH0KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlVHlwZVNwZWNpZmllci5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vSW1hZ2VUeXBlU3BlY2lmaWVyLmphdmEKaW5kZXggYzkzZjI2OS4uNTA1YjFjNCAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vSW1hZ2VUeXBlU3BlY2lmaWVyLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vSW1hZ2VUeXBlU3BlY2lmaWVyLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW87CiAKIGltcG9ydCBqYXZhLmF3dC5pbWFnZS5Db2xvck1vZGVsOwpAQCAtMjcsMjcgKzI4LDMxIEBACiBpbXBvcnQgamF2YS5hd3QuY29sb3IuQ29sb3JTcGFjZTsKIAogLyoqCi0gKiBUaGUgSW1hZ2VUeXBlU3BlY2lmaWVyIGNsYXNzIHBlcmZvcm1zIGNvbnZlcnNpb24gb3BlcmF0aW9ucwotICogb24gdGhlIFNhbXBsZU1vZGVsIGFuZCB0aGUgQ29sb3JNb2RlbCBvZiBhbiBpbWFnZS4KKyAqIFRoZSBJbWFnZVR5cGVTcGVjaWZpZXIgY2xhc3MgcGVyZm9ybXMgY29udmVyc2lvbiBvcGVyYXRpb25zIG9uIHRoZQorICogU2FtcGxlTW9kZWwgYW5kIHRoZSBDb2xvck1vZGVsIG9mIGFuIGltYWdlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEltYWdlVHlwZVNwZWNpZmllciB7Ci0gICAgCi0gICAgLyoqIAorCisgICAgLyoqCiAgICAgICogVGhlIENvbG9yTW9kZWwgb2YgdGhpcyBJbWFnZVR5cGVTcGVjaWZpZXIuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIENvbG9yTW9kZWwgY29sb3JNb2RlbDsKLSAgICAKLSAgICAvKiogCi0gICAgICogVGhlIFNhbXBsZU1vZGVsIG9mIHRoaXMgSW1hZ2VUeXBlU3BlY2lmaWVyLiAKKworICAgIC8qKgorICAgICAqIFRoZSBTYW1wbGVNb2RlbCBvZiB0aGlzIEltYWdlVHlwZVNwZWNpZmllci4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgU2FtcGxlTW9kZWwgc2FtcGxlTW9kZWw7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2VUeXBlU3BlY2lmaWVyIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIENvbG9yTW9kZWwgYW5kIFNhbXBsZU1vZGVsIG9iamVjdHMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEltYWdlVHlwZVNwZWNpZmllciB3aXRoIHRoZSBzcGVjaWZpZWQgQ29sb3JNb2RlbCBhbmQKKyAgICAgKiBTYW1wbGVNb2RlbCBvYmplY3RzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xvck1vZGVsIHRoZSBDb2xvck1vZGVsLgotICAgICAqIEBwYXJhbSBzYW1wbGVNb2RlbCB0aGUgU2FtcGxlTW9kZWwuCisgICAgICogQHBhcmFtIGNvbG9yTW9kZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBDb2xvck1vZGVsLgorICAgICAqIEBwYXJhbSBzYW1wbGVNb2RlbAorICAgICAqICAgICAgICAgICAgdGhlIFNhbXBsZU1vZGVsLgogICAgICAqLwogICAgIHB1YmxpYyBJbWFnZVR5cGVTcGVjaWZpZXIoQ29sb3JNb2RlbCBjb2xvck1vZGVsLCBTYW1wbGVNb2RlbCBzYW1wbGVNb2RlbCkgewogICAgICAgICBpZiAoY29sb3JNb2RlbCA9PSBudWxsKSB7CkBAIC02NSwxMCArNzAsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2VUeXBlU3BlY2lmaWVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgCi0gICAgICogUmVuZGVyZWRJbWFnZS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2VUeXBlU3BlY2lmaWVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgUmVuZGVyZWRJbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVuZGVyZWRJbWFnZSB0aGUgUmVuZGVyZWRJbWFnZS4KKyAgICAgKiBAcGFyYW0gcmVuZGVyZWRJbWFnZQorICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmVkSW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIEltYWdlVHlwZVNwZWNpZmllcihSZW5kZXJlZEltYWdlIHJlbmRlcmVkSW1hZ2UpIHsKICAgICAgICAgaWYgKHJlbmRlcmVkSW1hZ2UgPT0gbnVsbCkgewpAQCAtNzksMTM2ICs4NCwxMzkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIEltYWdlVHlwZVNwZWNpZmllciB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBEaXJlY3RDb2xvck1vZGVsIGFuZCBhIHBhY2tlZCBTYW1wbGVNb2RlbC4KKyAgICAgKiBDcmVhdGVzIGFuIEltYWdlVHlwZVNwZWNpZmllciB3aXRoIHRoZSBzcGVjaWZpZWQgRGlyZWN0Q29sb3JNb2RlbCBhbmQgYQorICAgICAqIHBhY2tlZCBTYW1wbGVNb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3JTcGFjZSB0aGUgQ29sb3JTcGFjZS4KLSAgICAgKiBAcGFyYW0gcmVkTWFzayB0aGUgcmVkIG1hc2suCi0gICAgICogQHBhcmFtIGdyZWVuTWFzayB0aGUgZ3JlZW4gbWFzay4KLSAgICAgKiBAcGFyYW0gYmx1ZU1hc2sgdGhlIGJsdWUgbWFzay4KLSAgICAgKiBAcGFyYW0gYWxwaGFNYXNrIHRoZSBhbHBoYSBtYXNrLgotICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUgdGhlIHRyYW5zZmVyIHR5cGUuCi0gICAgICogQHBhcmFtIGlzQWxwaGFQcmVtdWx0aXBsaWVkIHRoZSBwYXJhbWV0ZXIgaW5kaWNhdGVzCi0gICAgICogaWYgdGhlIGNvbG9yIGNoYW5uZWwgaXMgcHJlbXVsdGlwbGllZCBieSBhbHBoYS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29sb3JTcGFjZQorICAgICAqICAgICAgICAgICAgdGhlIENvbG9yU3BhY2UuCisgICAgICogQHBhcmFtIHJlZE1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWQgbWFzay4KKyAgICAgKiBAcGFyYW0gZ3JlZW5NYXNrCisgICAgICogICAgICAgICAgICB0aGUgZ3JlZW4gbWFzay4KKyAgICAgKiBAcGFyYW0gYmx1ZU1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBibHVlIG1hc2suCisgICAgICogQHBhcmFtIGFscGhhTWFzaworICAgICAqICAgICAgICAgICAgdGhlIGFscGhhIG1hc2suCisgICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zZmVyIHR5cGUuCisgICAgICogQHBhcmFtIGlzQWxwaGFQcmVtdWx0aXBsaWVkCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGluZGljYXRlcyBpZiB0aGUgY29sb3IgY2hhbm5lbCBpcyBwcmUtbXVsdGlwbGllZAorICAgICAqICAgICAgICAgICAgYnkgYWxwaGEuCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VUeXBlU3BlY2lmaWVyIGNyZWF0ZVBhY2tlZChDb2xvclNwYWNlIGNvbG9yU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWRNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JlZW5NYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmx1ZU1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYU1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc2ZlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKKyAgICBwdWJsaWMgc3RhdGljIEltYWdlVHlwZVNwZWNpZmllciBjcmVhdGVQYWNrZWQoQ29sb3JTcGFjZSBjb2xvclNwYWNlLCBpbnQgcmVkTWFzaywKKyAgICAgICAgICAgIGludCBncmVlbk1hc2ssIGludCBibHVlTWFzaywgaW50IGFscGhhTWFzaywgaW50IHRyYW5zZmVyVHlwZSwKKyAgICAgICAgICAgIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gSW1hZ2VUeXBlU3BlY2lmaWVyIHdpdGggc3BlY2lmaWVkCi0gICAgICogQ29tcG9uZW50Q29sb3JNb2RlbCBhbmQgYSBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwuCisgICAgICogQ3JlYXRlcyBhbiBJbWFnZVR5cGVTcGVjaWZpZXIgd2l0aCBzcGVjaWZpZWQgQ29tcG9uZW50Q29sb3JNb2RlbCBhbmQgYQorICAgICAqIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3JTcGFjZSB0aGUgQ29sb3JTcGFjZS4KLSAgICAgKiBAcGFyYW0gYmFuZE9mZnNldHMgdGhlIGJhbmQgb2Zmc2V0cy4KLSAgICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGRhdGEgdHlwZS4KLSAgICAgKiBAcGFyYW0gaGFzQWxwaGEgdGhlIHBhcmFtZXRlciBpbmRpY2F0ZXMgaWYgYWxwaGEgY2hhbm5lbAotICAgICAqIGlzIG5lZWRlZC4KLSAgICAgKiBAcGFyYW0gaXNBbHBoYVByZW11bHRpcGxpZWQgdGhlIHBhcmFtZXRlciBpbmRpY2F0ZXMKLSAgICAgKiBpZiB0aGUgY29sb3IgY2hhbm5lbCBpcyBwcmVtdWx0aXBsaWVkIGJ5IGFscGhhLgotICAgICAqIAorICAgICAqIEBwYXJhbSBjb2xvclNwYWNlCisgICAgICogICAgICAgICAgICB0aGUgQ29sb3JTcGFjZS4KKyAgICAgKiBAcGFyYW0gYmFuZE9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYW5kIG9mZnNldHMuCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlLgorICAgICAqIEBwYXJhbSBoYXNBbHBoYQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBpbmRpY2F0ZXMgaWYgYWxwaGEgY2hhbm5lbCBpcyBuZWVkZWQuCisgICAgICogQHBhcmFtIGlzQWxwaGFQcmVtdWx0aXBsaWVkCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGluZGljYXRlcyBpZiB0aGUgY29sb3IgY2hhbm5lbCBpcyBwcmUtbXVsdGlwbGllZAorICAgICAqICAgICAgICAgICAgYnkgYWxwaGEuCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VUeXBlU3BlY2lmaWVyIGNyZWF0ZUludGVybGVhdmVkKENvbG9yU3BhY2UgY29sb3JTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSBiYW5kT2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGF0YVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNBbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7CisgICAgcHVibGljIHN0YXRpYyBJbWFnZVR5cGVTcGVjaWZpZXIgY3JlYXRlSW50ZXJsZWF2ZWQoQ29sb3JTcGFjZSBjb2xvclNwYWNlLCBpbnRbXSBiYW5kT2Zmc2V0cywKKyAgICAgICAgICAgIGludCBkYXRhVHlwZSwgYm9vbGVhbiBoYXNBbHBoYSwgYm9vbGVhbiBpc0FscGhhUHJlbXVsdGlwbGllZCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0Iik7CiAgICAgfQogCi0KICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgSW1hZ2VUeXBlU3BlY2lmaWVyIGZvciBhIGltYWdlIHdpdGggYSAKLSAgICAgKiBCYW5kZWRTYW1wbGVNb2RlbCBhbmQgYSBDb21wb25lbnRDb2xvck1vZGVsLgorICAgICAqIENyZWF0ZXMgYSBJbWFnZVR5cGVTcGVjaWZpZXIgZm9yIGEgaW1hZ2Ugd2l0aCBhIEJhbmRlZFNhbXBsZU1vZGVsIGFuZCBhCisgICAgICogQ29tcG9uZW50Q29sb3JNb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3JTcGFjZSB0aGUgQ29sb3JTcGFjZS4KLSAgICAgKiBAcGFyYW0gYmFua0luZGljZXMgdGhlIGJhbmsgaW5kaWNlcy4KLSAgICAgKiBAcGFyYW0gYmFuZE9mZnNldHMgdGhlIGJhbmQgb2Zmc2V0cy4KLSAgICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGRhdGEgdHlwZS4KLSAgICAgKiBAcGFyYW0gaGFzQWxwaGEgdGhlIHBhcmFtZXRlciBpbmRpY2F0ZXMgYSBwcmVzZW5jZSBvZiBhbHBoYSBjaGFubmVsLgotICAgICAqIEBwYXJhbSBpc0FscGhhUHJlbXVsdGlwbGllZCB0aGUgcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyCi0gICAgICogb3Igbm90IGNvbG9yIGNoYW5uZWwgaXMgYWxwaGEgcHJlbXVsdGlwbGllZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29sb3JTcGFjZQorICAgICAqICAgICAgICAgICAgdGhlIENvbG9yU3BhY2UuCisgICAgICogQHBhcmFtIGJhbmtJbmRpY2VzCisgICAgICogICAgICAgICAgICB0aGUgYmFuayBpbmRpY2VzLgorICAgICAqIEBwYXJhbSBiYW5kT2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIGJhbmQgb2Zmc2V0cy4KKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUuCisgICAgICogQHBhcmFtIGhhc0FscGhhCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGluZGljYXRlcyBhIHByZXNlbmNlIG9mIGFscGhhIGNoYW5uZWwuCisgICAgICogQHBhcmFtIGlzQWxwaGFQcmVtdWx0aXBsaWVkCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBjb2xvciBjaGFubmVsIGlzIGFscGhhCisgICAgICogICAgICAgICAgICBwcmUtbXVsdGlwbGllZC4KICAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZSB0eXBlIHNwZWNpZmllcgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VUeXBlU3BlY2lmaWVyIGNyZWF0ZUJhbmRlZChDb2xvclNwYWNlIGNvbG9yU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIGJhbmtJbmRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSBiYW5kT2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRhdGFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc0FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7CisgICAgcHVibGljIHN0YXRpYyBJbWFnZVR5cGVTcGVjaWZpZXIgY3JlYXRlQmFuZGVkKENvbG9yU3BhY2UgY29sb3JTcGFjZSwgaW50W10gYmFua0luZGljZXMsCisgICAgICAgICAgICBpbnRbXSBiYW5kT2Zmc2V0cywgaW50IGRhdGFUeXBlLCBib29sZWFuIGhhc0FscGhhLCBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgSW1hZ2VUeXBlU3BlY2lmaWVyIGZvciBhIGdyYXlzY2FsZSBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYml0cyB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIGdyYXkgdmFsdWUuCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUuCi0gICAgICogQHBhcmFtIGlzU2lnbmVkIGEgc2lnbmVkIGZsYWcuCi0gICAgICogCisgICAgICogQHBhcmFtIGJpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgZ3JheSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUuCisgICAgICogQHBhcmFtIGlzU2lnbmVkCisgICAgICogICAgICAgICAgICBhIHNpZ25lZCBmbGFnLgogICAgICAqIEByZXR1cm4gdGhlIEltYWdlVHlwZVNwZWNpZmllci4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlVHlwZVNwZWNpZmllciBjcmVhdGVHcmF5c2NhbGUoaW50IGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYXRhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1NpZ25lZCkgeworICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VUeXBlU3BlY2lmaWVyIGNyZWF0ZUdyYXlzY2FsZShpbnQgYml0cywgaW50IGRhdGFUeXBlLCBib29sZWFuIGlzU2lnbmVkKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgSW1hZ2VUeXBlU3BlY2lmaWVyIGZvciBhIGdyYXlzY2FsZSBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYml0cyB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIGdyYXkgdmFsdWUuCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUuCi0gICAgICogQHBhcmFtIGlzU2lnbmVkIGEgc2lnbmVkIGZsYWcuCi0gICAgICogQHBhcmFtIGlzQWxwaGFQcmVtdWx0aXBsaWVkIHRoZSBwYXJhbWV0ZXIgaW5kaWNhdGVzCi0gICAgICogaWYgY29sb3IgY2hhbm5lbCBpcyBwcmVtdWx0aXBsaWVkIGJ5IGFscGhhLCBvciBub3QuCi0gICAgICogCisgICAgICogQHBhcmFtIGJpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgZ3JheSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUuCisgICAgICogQHBhcmFtIGlzU2lnbmVkCisgICAgICogICAgICAgICAgICBhIHNpZ25lZCBmbGFnLgorICAgICAqIEBwYXJhbSBpc0FscGhhUHJlbXVsdGlwbGllZAorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBpbmRpY2F0ZXMgaWYgY29sb3IgY2hhbm5lbCBpcyBwcmUtbXVsdGlwbGllZCBieQorICAgICAqICAgICAgICAgICAgYWxwaGEsIG9yIG5vdC4KICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZVR5cGVTcGVjaWZpZXIuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZVR5cGVTcGVjaWZpZXIgY3JlYXRlR3JheXNjYWxlKGludCBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGF0YVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTaWduZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKKyAgICBwdWJsaWMgc3RhdGljIEltYWdlVHlwZVNwZWNpZmllciBjcmVhdGVHcmF5c2NhbGUoaW50IGJpdHMsIGludCBkYXRhVHlwZSwgYm9vbGVhbiBpc1NpZ25lZCwKKyAgICAgICAgICAgIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBJbWFnZVR5cGVTcGVjaWZpZXIgd2l0aCB0aGUgaW5kZXhlZCBpbWFnZSBmb3JtYXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJlZExVVCB0aGUgcmVkIHZhbHVlcyBvZiBpbmRlY2llcy4KLSAgICAgKiBAcGFyYW0gZ3JlZW5MVVQgdGhlIGdyZWVuIHZhbHVlcyBvZiBpbmRlY2llcy4KLSAgICAgKiBAcGFyYW0gYmx1ZUxVVCB0aGUgYmx1ZSB2YWx1ZXMgb2YgaW5kZWNpZXMuCi0gICAgICogQHBhcmFtIGFscGhhTFVUIHRoZSBhbHBoYSB2YWx1ZXMgb2YgaW5kZWNpZXMuCi0gICAgICogQHBhcmFtIGJpdHMgdGhlIGJpdHMgbnVtYmVyIGZvciBlYWNoIGluZGV4LgotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0aGUgZGF0YSB0eXBlLgotICAgICAqIAorICAgICAqIEBwYXJhbSByZWRMVVQKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWQgdmFsdWVzIG9mIGluZGljZXMuCisgICAgICogQHBhcmFtIGdyZWVuTFVUCisgICAgICogICAgICAgICAgICB0aGUgZ3JlZW4gdmFsdWVzIG9mIGluZGljZXMuCisgICAgICogQHBhcmFtIGJsdWVMVVQKKyAgICAgKiAgICAgICAgICAgIHRoZSBibHVlIHZhbHVlcyBvZiBpbmRpY2VzLgorICAgICAqIEBwYXJhbSBhbHBoYUxVVAorICAgICAqICAgICAgICAgICAgdGhlIGFscGhhIHZhbHVlcyBvZiBpbmRpY2VzLgorICAgICAqIEBwYXJhbSBiaXRzCisgICAgICogICAgICAgICAgICB0aGUgYml0cyBudW1iZXIgZm9yIGVhY2ggaW5kZXguCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlLgogICAgICAqIEByZXR1cm4gdGhlIEltYWdlVHlwZVNwZWNpZmllci4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlVHlwZVNwZWNpZmllciBjcmVhdGVJbmRleGVkKGJ5dGVbXSByZWRMVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gZ3JlZW5MVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYmx1ZUxVVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBhbHBoYUxVVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRhdGFUeXBlKSB7CisgICAgcHVibGljIHN0YXRpYyBJbWFnZVR5cGVTcGVjaWZpZXIgY3JlYXRlSW5kZXhlZChieXRlW10gcmVkTFVULCBieXRlW10gZ3JlZW5MVVQsIGJ5dGVbXSBibHVlTFVULAorICAgICAgICAgICAgYnl0ZVtdIGFscGhhTFVULCBpbnQgYml0cywgaW50IGRhdGFUeXBlKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBJbWFnZVR5cGVTcGVjaWZpZXIgZnJvbSAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGJ1ZmZlcmVkIGltYWdlIHR5cGUuCisgICAgICogQ3JlYXRlcyB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyIGZyb20gdGhlIHNwZWNpZmllZCBidWZmZXJlZCBpbWFnZSB0eXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBidWZmZXJlZEltYWdlVHlwZSB0aGUgYnVmZmVyZWQgaW1hZ2UgdHlwZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYnVmZmVyZWRJbWFnZVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXJlZCBpbWFnZSB0eXBlLgogICAgICAqIEByZXR1cm4gdGhlIEltYWdlVHlwZVNwZWNpZmllci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEltYWdlVHlwZVNwZWNpZmllciBjcmVhdGVGcm9tQnVmZmVyZWRJbWFnZVR5cGUoaW50IGJ1ZmZlcmVkSW1hZ2VUeXBlKSB7CkBAIC0yMTYsMTEgKzIyNCwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIEltYWdlVHlwZVNwZWNpZmllciBmcm9tIAotICAgICAqIHRoZSBzcGVjaWZpZWQgUmVuZGVyZWRJbWFnZS4KKyAgICAgKiBDcmVhdGVzIHRoZSBJbWFnZVR5cGVTcGVjaWZpZXIgZnJvbSB0aGUgc3BlY2lmaWVkIFJlbmRlcmVkSW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlIHRoZSBSZW5kZXJlZEltYWdlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbWFnZQorICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmVkSW1hZ2UuCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VUeXBlU3BlY2lmaWVyIGNyZWF0ZUZyb21SZW5kZXJlZEltYWdlKFJlbmRlcmVkSW1hZ2UgaW1hZ2UpIHsKQEAgLTI0Miw3ICsyNDksNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBjb21wb25lbnRzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjb21wb25lbnRzCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXROdW1Db21wb25lbnRzKCkgewogICAgICAgICByZXR1cm4gY29sb3JNb2RlbC5nZXROdW1Db21wb25lbnRzKCk7CkBAIC0yNTEsNyArMjU4LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYmFuZHMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJhbmRzCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJhbmRzLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TnVtQmFuZHMoKSB7CiAgICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXROdW1CYW5kcygpOwpAQCAtMjYwLDggKzI2Nyw4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIHRoZSBzcGVjaWZpZWQgYmFuZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFuZCB0aGUgaW5kZXggb2YgYmFuZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYmFuZAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIGJhbmQuCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIHRoZSBzcGVjaWZpZWQgYmFuZC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEJpdHNQZXJCYW5kKGludCBiYW5kKSB7CkBAIC0yODMsMTMgKzI5MCwxNCBAQAogICAgIC8qKgogICAgICAqIEdldHMgYSBjb21wYXRpYmxlIFNhbXBsZU1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGguCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0LgotICAgICAqIAorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQuCiAgICAgICogQHJldHVybiB0aGUgU2FtcGxlTW9kZWwuCiAgICAgICovCiAgICAgcHVibGljIFNhbXBsZU1vZGVsIGdldFNhbXBsZU1vZGVsKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBpZiAoKGxvbmcpd2lkdGgqaGVpZ2h0ID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgaWYgKChsb25nKXdpZHRoICogaGVpZ2h0ID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndpZHRoICogaGVpZ2h0ID4gSW50ZWdlci5NQVhfVkFMVUUiKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWwuY3JlYXRlQ29tcGF0aWJsZVNhbXBsZU1vZGVsKHdpZHRoLCBoZWlnaHQpOwpAQCAtMjk4LDIwICszMDYsMjEgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBDb2xvck1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEltYWdlVHlwZVNwZWNpZmllci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBDb2xvck1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEltYWdlVHlwZVNwZWNpZmllci4gCisgICAgICogQHJldHVybiB0aGUgQ29sb3JNb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJbWFnZVR5cGVTcGVjaWZpZXIuCiAgICAgICovCiAgICAgcHVibGljIENvbG9yTW9kZWwgZ2V0Q29sb3JNb2RlbCgpIHsKICAgICAgICAgcmV0dXJuIGNvbG9yTW9kZWw7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgQnVmZmVyZWRJbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgd2lkdGggYW5kIGhlaWdodCAKLSAgICAgKiBhbmQgdGhlIENvbG9yTWFkZWwgYW5kIFNhbXBsZU1vZGVsIHdoaWNoIGFyZSBzcGVjaWZpZWQgYnkgdGhpcyAKKyAgICAgKiBDcmVhdGVzIHRoZSBCdWZmZXJlZEltYWdlIHdpdGggdGhlIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0IGFuZCB0aGUKKyAgICAgKiBDb2xvck1hZGVsIGFuZCBTYW1wbGVNb2RlbCB3aGljaCBhcmUgc3BlY2lmaWVkIGJ5IHRoaXMKICAgICAgKiBJbWFnZVR5cGVTcGVjaWZpZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgQnVmZmVyZWRJbWFnZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIEJ1ZmZlcmVkSW1hZ2UuCi0gICAgICogCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIEJ1ZmZlcmVkSW1hZ2UuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgQnVmZmVyZWRJbWFnZS4KICAgICAgKiBAcmV0dXJuIHRoZSBCdWZmZXJlZEltYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlIGNyZWF0ZUJ1ZmZlcmVkSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CkBAIC0zMTksMTkgKzMyOCwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoaXMgSW1hZ2VUeXBlU3BlY2lmaWVyIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgCi0gICAgICogb2JqZWN0LgorICAgICAqIENvbXBhcmVzIHRoaXMgSW1hZ2VUeXBlU3BlY2lmaWVyIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBvIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgb2JqZWN0IGlzIGFuIEltYWdlVHlwZVNwZWNpZmllciB3aXRoIHRoZSBzYW1lCi0gICAgICogZGF0YSBhcyB0aGlzIEltYWdlVHlwZVNwZWNpZmllciwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBvCisgICAgICogICAgICAgICAgICB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIG9iamVjdCBpcyBhbiBJbWFnZVR5cGVTcGVjaWZpZXIgd2l0aCB0aGUgc2FtZSBkYXRhCisgICAgICogICAgICAgICBhcyB0aGlzIEltYWdlVHlwZVNwZWNpZmllciwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogICAgICAgICBib29sZWFuIHJ0ID0gZmFsc2U7CiAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgSW1hZ2VUeXBlU3BlY2lmaWVyKSB7Ci0gICAgICAgICAgICBJbWFnZVR5cGVTcGVjaWZpZXIgdHMgPSAoSW1hZ2VUeXBlU3BlY2lmaWVyKSBvOworICAgICAgICAgICAgSW1hZ2VUeXBlU3BlY2lmaWVyIHRzID0gKEltYWdlVHlwZVNwZWNpZmllcilvOwogICAgICAgICAgICAgcnQgPSBjb2xvck1vZGVsLmVxdWFscyh0cy5jb2xvck1vZGVsKSAmJiBzYW1wbGVNb2RlbC5lcXVhbHModHMuc2FtcGxlTW9kZWwpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBydDsKZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlV3JpdGVQYXJhbS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vSW1hZ2VXcml0ZVBhcmFtLmphdmEKaW5kZXggZDMyZmE1OS4uZDY2MTg4OSAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vSW1hZ2VXcml0ZVBhcmFtLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vSW1hZ2VXcml0ZVBhcmFtLmphdmEKQEAgLTE4LDEwMyArMTgsMTQxIEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvOwogCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLmF3dC4qOwogCiAvKioKLSAqIFRoZSBJbWFnZVdyaXRlUGFyYW0gY2xhc3MgcHJvdmlkZXMgaW5mb3JtYXRpb24gdG8gYW4gSW1hZ2VXcml0ZXIgCi0gKiBhYm91dCBob3cgYW4gaW1hZ2UgaXMgdG8gYmUgZW5jb2RlZC4KKyAqIFRoZSBJbWFnZVdyaXRlUGFyYW0gY2xhc3MgcHJvdmlkZXMgaW5mb3JtYXRpb24gdG8gYW4gSW1hZ2VXcml0ZXIgYWJvdXQgaG93IGFuCisgKiBpbWFnZSBpcyB0byBiZSBlbmNvZGVkLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEltYWdlV3JpdGVQYXJhbSBleHRlbmRzIElJT1BhcmFtIHsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgTU9ERV9ESVNBQkxFRCBpbmRpY2F0ZXMgdGhhdCAKLSAgICAgKiBzdHJlYW0gaXMgbm90IHRpbGVkLCBwcm9ncmVzc2l2ZSwgb3IgY29tcHJlc3NlZC4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTU9ERV9ESVNBQkxFRCBpbmRpY2F0ZXMgdGhhdCBzdHJlYW0gaXMgbm90IHRpbGVkLAorICAgICAqIHByb2dyZXNzaXZlLCBvciBjb21wcmVzc2VkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfRElTQUJMRUQgPSAwOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgTU9ERV9ERUZBVUxUIGluZGljYXRlcyB0aGF0IHRoZSBzdHJlYW0gd2lsbCBiZSB0aWxlZCwgCi0gICAgICogcHJvZ3Jlc3NpdmUsIG9yIGNvbXByZXNzZWQgYWNjb3JkaW5nIHRvIHRoZSBwbHVnLWluJ3MgZGVmYXVsdC4gCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTU9ERV9ERUZBVUxUIGluZGljYXRlcyB0aGF0IHRoZSBzdHJlYW0gd2lsbCBiZSB0aWxlZCwKKyAgICAgKiBwcm9ncmVzc2l2ZSwgb3IgY29tcHJlc3NlZCBhY2NvcmRpbmcgdG8gdGhlIHBsdWctaW4ncyBkZWZhdWx0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfREVGQVVMVCA9IDE7Ci0gICAgCi0gICAgLyoqIAorCisgICAgLyoqCiAgICAgICogVGhlIENvbnN0YW50IE1PREVfRVhQTElDSVQgaW5kaWNhdGVzIHRoYXQgdGhlIHN0cmVhbSB3aWxsIGJlIHRpbGVkLAotICAgICAqIHByb2dyZXNzaXZlLCBvciBjb21wcmVzc2VkIGFjY29yZGluZyB0byBjdXJyZW50IHNldHRpbmdzCi0gICAgICogd2hpY2ggYXJlIGRlZmluZWQgYnkgc2V0IG1ldGhvZHMuIAorICAgICAqIHByb2dyZXNzaXZlLCBvciBjb21wcmVzc2VkIGFjY29yZGluZyB0byBjdXJyZW50IHNldHRpbmdzIHdoaWNoIGFyZQorICAgICAqIGRlZmluZWQgYnkgc2V0IG1ldGhvZHMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9FWFBMSUNJVCA9IDI7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBNT0RFX0NPUFlfRlJPTV9NRVRBREFUQSBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RyZWFtCi0gICAgICogd2lsbCBiZSB0aWxlZCwgcHJvZ3Jlc3NpdmUsIG9yIGNvbXByZXNzZWQgYWNjb3JkaW5nIHRvCi0gICAgICogc3RyZWFtIG9yIGltYWdlIG1ldGFkYXRhLiAKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBNT0RFX0NPUFlfRlJPTV9NRVRBREFUQSBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RyZWFtIHdpbGwgYmUKKyAgICAgKiB0aWxlZCwgcHJvZ3Jlc3NpdmUsIG9yIGNvbXByZXNzZWQgYWNjb3JkaW5nIHRvIHN0cmVhbSBvciBpbWFnZSBtZXRhZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0NPUFlfRlJPTV9NRVRBREFUQSA9IDM7Ci0gICAgCi0gICAgLyoqIFdoZXRoZXIgdGhlIEltYWdlV3JpdGVyIGNhbiB3cml0ZSB0aWxlcy4gKi8KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIEltYWdlV3JpdGVyIGNhbiB3cml0ZSB0aWxlcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5Xcml0ZVRpbGVzID0gZmFsc2U7Ci0gICAgCi0gICAgLyoqIFRoZSB0aWxpbmcgbW9kZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSB0aWxpbmcgbW9kZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHRpbGluZ01vZGUgPSBNT0RFX0NPUFlfRlJPTV9NRVRBREFUQTsKLSAgICAKLSAgICAvKiogVGhlIHByZWZlcnJlZCB0aWxlIHNpemVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHByZWZlcnJlZCB0aWxlIHNpemVzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBEaW1lbnNpb25bXSBwcmVmZXJyZWRUaWxlU2l6ZXMgPSBudWxsOwotICAgIAotICAgIC8qKiBUaGUgdGlsaW5nIHNldC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSB0aWxpbmcgc2V0LgorICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIHRpbGluZ1NldCA9IGZhbHNlOwotICAgIAotICAgIC8qKiBUaGUgdGlsZSB3aWR0aC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSB0aWxlIHdpZHRoLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgdGlsZVdpZHRoID0gMDsKLSAgICAKLSAgICAvKiogVGhlIHRpbGUgaGVpZ2h0LiAqLworCisgICAgLyoqCisgICAgICogVGhlIHRpbGUgaGVpZ2h0LgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgdGlsZUhlaWdodCA9IDA7Ci0gICAgCi0gICAgLyoqIFdoZXRoZXIgdGhlIEltYWdlV3JpdGVyIGNhbiBvZmZzZXQgdGlsZXMuICovCisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBJbWFnZVdyaXRlciBjYW4gb2Zmc2V0IHRpbGVzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIGNhbk9mZnNldFRpbGVzID0gZmFsc2U7Ci0gICAgCi0gICAgLyoqIFRoZSB0aWxlIGdyaWQgeCBvZmZzZXQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGlsZSBncmlkIHggb2Zmc2V0LgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgdGlsZUdyaWRYT2Zmc2V0ID0gMDsKLSAgICAKLSAgICAvKiogVGhlIHRpbGUgZ3JpZCB5IG9mZnNldC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSB0aWxlIGdyaWQgeSBvZmZzZXQuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCB0aWxlR3JpZFlPZmZzZXQgPSAwOwotICAgIAotICAgIC8qKiBXaGV0aGVyIHRoZSBJbWFnZVdyaXRlciBjYW4gd3JpdGUgaW4gcHJvZ3Jlc3NpdmUgbW9kZS4gKi8KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIEltYWdlV3JpdGVyIGNhbiB3cml0ZSBpbiBwcm9ncmVzc2l2ZSBtb2RlLgorICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIGNhbldyaXRlUHJvZ3Jlc3NpdmUgPSBmYWxzZTsKLSAgICAKLSAgICAvKiogVGhlIHByb2dyZXNzaXZlIG1vZGUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvZ3Jlc3NpdmUgbW9kZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHByb2dyZXNzaXZlTW9kZSA9IE1PREVfQ09QWV9GUk9NX01FVEFEQVRBOwotICAgIAotICAgIC8qKiBXaGV0aGVyIHRoZSBJbWFnZVdyaXRlciBjYW4gd3JpdGUgaW4gY29tcHJlc3NlZCBtb2RlLiAqLworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgSW1hZ2VXcml0ZXIgY2FuIHdyaXRlIGluIGNvbXByZXNzZWQgbW9kZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5Xcml0ZUNvbXByZXNzZWQgPSBmYWxzZTsKLSAgICAKLSAgICAvKiogVGhlIGNvbXByZXNzaW9uIG1vZGUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tcHJlc3Npb24gbW9kZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IGNvbXByZXNzaW9uTW9kZSA9IE1PREVfQ09QWV9GUk9NX01FVEFEQVRBOwotICAgIAotICAgIC8qKiBUaGUgY29tcHJlc3Npb24gdHlwZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tcHJlc3Npb24gdHlwZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGNvbXByZXNzaW9uVHlwZXMgPSBudWxsOwotICAgIAotICAgIC8qKiBUaGUgY29tcHJlc3Npb24gdHlwZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBjb21wcmVzc2lvbiB0eXBlLgorICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHJlc3Npb25UeXBlID0gbnVsbDsKLSAgICAKLSAgICAvKiogVGhlIGNvbXByZXNzaW9uIHF1YWxpdHkuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tcHJlc3Npb24gcXVhbGl0eS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmxvYXQgY29tcHJlc3Npb25RdWFsaXR5ID0gMS4wZjsKLSAgICAKLSAgICAvKiogVGhlIGxvY2FsZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBsb2NhbGUuCisgICAgICovCiAgICAgcHJvdGVjdGVkIExvY2FsZSBsb2NhbGUgPSBudWxsOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEltYWdlV3JpdGVQYXJhbS4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSW1hZ2VXcml0ZVBhcmFtKCkge30KKyAgICBwcm90ZWN0ZWQgSW1hZ2VXcml0ZVBhcmFtKCkgeworICAgIH0KIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbWFnZVdyaXRlUGFyYW0gd2l0aCB0aGUgc3BlY2lmaWVkIExvY2FsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbG9jYWxlIHRoZSBMb2NhbGUuCisgICAgICogQHBhcmFtIGxvY2FsZQorICAgICAqICAgICAgICAgICAgdGhlIExvY2FsZS4KICAgICAgKi8KICAgICBwdWJsaWMgSW1hZ2VXcml0ZVBhcmFtKExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7CkBAIC0xMjIsNyArMTYwLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtb2RlIGZvciB3cml0aW5nIHRoZSBzdHJlYW0gaW4gYSBwcm9ncmVzc2l2ZSBzZXF1ZW5jZS4gCisgICAgICogR2V0cyB0aGUgbW9kZSBmb3Igd3JpdGluZyB0aGUgc3RyZWFtIGluIGEgcHJvZ3Jlc3NpdmUgc2VxdWVuY2UuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgY3VycmVudCBwcm9ncmVzc2l2ZSBtb2RlLgogICAgICAqLwpAQCAtMTM0LDI0ICsxNzIsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgaW1hZ2VzIGNhbiBiZSB3cml0dGVuIHVzaW5nIAotICAgICAqIGluY3JlYXNpbmcgcXVhbGl0eSBwYXNzZXMgYnkgcHJvZ3Jlc3NpdmUuICAKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgaW1hZ2VzIGNhbiBiZSB3cml0dGVuIHVzaW5nIGluY3JlYXNpbmcgcXVhbGl0eSBwYXNzZXMgYnkKKyAgICAgKiBwcm9ncmVzc2l2ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgaW1hZ2VzIGNhbiBiZSB3cml0dGVuIHVzaW5nIAotICAgICAqIGluY3JlYXNpbmcgcXVhbGl0eSBwYXNzZXMgYnkgcHJvZ3Jlc3NpdmUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgaW1hZ2VzIGNhbiBiZSB3cml0dGVuIHVzaW5nIGluY3JlYXNpbmcgcXVhbGl0eSBwYXNzZXMgYnkKKyAgICAgKiAgICAgICAgIHByb2dyZXNzaXZlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuV3JpdGVQcm9ncmVzc2l2ZSgpIHsKICAgICAgICAgcmV0dXJuIGNhbldyaXRlUHJvZ3Jlc3NpdmU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJvZ3Jlc3NpdmUgbW9kZSB3aGljaCBkZWZpbmVzIHdoZXRoZXIgdGhlIHN0cmVhbSAKLSAgICAgKiBjb250YWlucyBhIHByb2dyZXNzaXZlIHNlcXVlbmNlIG9mIGluY3JlYXNpbmcgcXVhbGl0eQotICAgICAqIGR1cmluZyB3cml0aW5nLiBUaGUgcHJvZ3Jlc3NpdmUgbW9kZSBzaG91bGQgYmUgb25lIG9mCi0gICAgICogdGhlIGZvbGxvd2luZyB2YWx1ZXM6IE1PREVfRElTQUJMRUQsIE1PREVfREVGQVVMVCwgb3IKLSAgICAgKiBNT0RFX0NPUFlfRlJPTV9NRVRBREFUQS4KKyAgICAgKiBTZXRzIHRoZSBwcm9ncmVzc2l2ZSBtb2RlIHdoaWNoIGRlZmluZXMgd2hldGhlciB0aGUgc3RyZWFtIGNvbnRhaW5zIGEKKyAgICAgKiBwcm9ncmVzc2l2ZSBzZXF1ZW5jZSBvZiBpbmNyZWFzaW5nIHF1YWxpdHkgZHVyaW5nIHdyaXRpbmcuIFRoZQorICAgICAqIHByb2dyZXNzaXZlIG1vZGUgc2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogTU9ERV9ESVNBQkxFRCwKKyAgICAgKiBNT0RFX0RFRkFVTFQsIG9yIE1PREVfQ09QWV9GUk9NX01FVEFEQVRBLgogICAgICAqIAotICAgICAqIEBwYXJhbSBtb2RlIHRoZSBuZXcgcHJvZ3Jlc3NpdmUgbW9kZS4KKyAgICAgKiBAcGFyYW0gbW9kZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBwcm9ncmVzc2l2ZSBtb2RlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFByb2dyZXNzaXZlTW9kZShpbnQgbW9kZSkgewogICAgICAgICBpZiAoY2FuV3JpdGVQcm9ncmVzc2l2ZSgpKSB7CkBAIC0xNjQsMjIgKzIwMiwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd3JpdGVyIGNhbiB1c2UgdGlsZXMgd2l0aCBub24gemVybyAKLSAgICAgKiBncmlkIG9mZnNldHMgd2hpbGUgd3JpdGluZy4gCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3cml0ZXIgY2FuIHVzZSB0aWxlcyB3aXRoIG5vbiB6ZXJvIGdyaWQgb2Zmc2V0cyB3aGlsZQorICAgICAqIHdyaXRpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB3cml0ZXIgY2FuIHVzZSB0aWxlcyB3aXRoIG5vbiB6ZXJvIAotICAgICAqIGdyaWQgb2Zmc2V0cyB3aGlsZSB3cml0aW5nLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgd3JpdGVyIGNhbiB1c2UgdGlsZXMgd2l0aCBub24gemVybyBncmlkIG9mZnNldHMKKyAgICAgKiAgICAgICAgIHdoaWxlIHdyaXRpbmcsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjYW5PZmZzZXRUaWxlcygpIHsKICAgICAgICAgcmV0dXJuIGNhbk9mZnNldFRpbGVzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHdyaXRlciBjYW4gd3JpdGUgaW1hZ2VzIHdpdGggCi0gICAgICogY29tcHJlc3Npb24uICAKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB3cml0ZXIgY2FuIHdyaXRlIGltYWdlcyB3aXRoIGNvbXByZXNzaW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgdHJ1ZSBpZiB0aGlzIHdyaXRlciBjYW4gd3JpdGUgaW1hZ2VzIHdpdGggCi0gICAgICogY29tcHJlc3Npb24sIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgd3JpdGVyIGNhbiB3cml0ZSBpbWFnZXMgd2l0aCBjb21wcmVzc2lvbiwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjYW5Xcml0ZUNvbXByZXNzZWQoKSB7CiAgICAgICAgIHJldHVybiBjYW5Xcml0ZUNvbXByZXNzZWQ7CkBAIC0xODgsNyArMjI1LDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdyaXRlciBjYW4gd3JpdGUgdGlsZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB3cml0ZXIgY2FuIHdyaXRlIHRpbGVzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgd3JpdGVyIGNhbiB3cml0ZSB0aWxlcywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNhbldyaXRlVGlsZXMoKSB7CiAgICAgICAgIHJldHVybiBjYW5Xcml0ZVRpbGVzOwpAQCAtMjQ3LDggKzI4NCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgY3VycmVudCBjb21wcmVzc2lvbiB0eXBlLCBvciByZXR1cm5zIG51bGwuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBjb21wcmVzc2lvbiB0eXBlLCBvciByZXR1cm5zIG51bGwgCi0gICAgICogaWYgaXQgaXMgbm90IHNldC4KKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGNvbXByZXNzaW9uIHR5cGUsIG9yIHJldHVybnMgbnVsbCBpZiBpdCBpcyBub3Qgc2V0LgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcHJlc3Npb25UeXBlKCkgewogICAgICAgICBjaGVja1dyaXRlQ29tcHJlc3NlZCgpOwpAQCAtMjU3LDE0ICsyOTMsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgYml0IHJhdGUgd2hpY2ggcmVwcmVzZW50cyBhbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGJpdHMgCi0gICAgICogb2Ygb3V0cHV0IGRhdGEgZm9yIGVhY2ggYml0IG9mIGlucHV0IGltYWdlIGRhdGEgd2l0aCB0aGUgc3BlY2lmaWVkIAotICAgICAqIHF1YWxpdHkuCisgICAgICogR2V0cyBhIGJpdCByYXRlIHdoaWNoIHJlcHJlc2VudHMgYW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBiaXRzIG9mCisgICAgICogb3V0cHV0IGRhdGEgZm9yIGVhY2ggYml0IG9mIGlucHV0IGltYWdlIGRhdGEgd2l0aCB0aGUgc3BlY2lmaWVkIHF1YWxpdHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHF1YWxpdHkgdGhlIHF1YWxpdHkuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBlc3RpbWF0ZSBvZiB0aGUgYml0IHJhdGUsIG9yIC0xLjBGIGlmIHRoZXJlIGlzIG5vIAotICAgICAqIGVzdGltYXRlLiAKKyAgICAgKiBAcGFyYW0gcXVhbGl0eQorICAgICAqICAgICAgICAgICAgdGhlIHF1YWxpdHkuCisgICAgICogQHJldHVybiBhbiBlc3RpbWF0ZSBvZiB0aGUgYml0IHJhdGUsIG9yIC0xLjBGIGlmIHRoZXJlIGlzIG5vIGVzdGltYXRlLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRCaXRSYXRlKGZsb2F0IHF1YWxpdHkpIHsKICAgICAgICAgY2hlY2tXcml0ZUNvbXByZXNzZWQoKTsKQEAgLTMwMSw4ICszMzUsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gYXJyYXkgb2YgZmxvYXRzIHdoaWNoIGRlY3JpYmUgCi0gICAgICogY29tcHJlc3Npb24gcXVhbGl0eSBsZXZlbHMuIAorICAgICAqIEdldHMgYW4gYXJyYXkgb2YgZmxvYXRzIHdoaWNoIGRlc2NyaWJlcyBjb21wcmVzc2lvbiBxdWFsaXR5IGxldmVscy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBjb21wcmVzc2lvbiBxdWFsaXR5IHZhbHVlcy4KICAgICAgKi8KQEAgLTMyMyw3ICszNTYsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGN1cnJlbnQgY29tcHJlc3Npb24gdHlwZSB1c2luZyB0aGUgY3VycmVudCBMb2NhbGUuIAorICAgICAqIEdldHMgdGhlIGN1cnJlbnQgY29tcHJlc3Npb24gdHlwZSB1c2luZyB0aGUgY3VycmVudCBMb2NhbGUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgY3VycmVudCBjb21wcmVzc2lvbiB0eXBlIHVzaW5nIHRoZSBjdXJyZW50IExvY2FsZS4KICAgICAgKi8KQEAgLTM3Nyw4ICs0MTAsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gYXJyYXkgb2YgRGltZW5zaW9ucyBnaXZpbmcgdGhlIHNpemVzIG9mIHRoZSB0aWxlcyBhcyAKLSAgICAgKiB0aGV5IGFyZSBlbmNvZGVkIGluIHRoZSBvdXRwdXQgZmlsZSBvciBzdHJlYW0uIAorICAgICAqIEdldHMgYW4gYXJyYXkgb2YgRGltZW5zaW9ucyBnaXZpbmcgdGhlIHNpemVzIG9mIHRoZSB0aWxlcyBhcyB0aGV5IGFyZQorICAgICAqIGVuY29kZWQgaW4gdGhlIG91dHB1dCBmaWxlIG9yIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBwcmVmZXJyZWQgdGlsZSBzaXplcy4KICAgICAgKi8KQEAgLTQyMCwxMSArNDUzLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGlsZSBoZWlnaHQgaW4gYW4gaW1hZ2UgYXMgaXQgaXMgd3JpdHRlbiB0byB0aGUgCi0gICAgICogb3V0cHV0IHN0cmVhbS4KKyAgICAgKiBHZXRzIHRoZSB0aWxlIGhlaWdodCBpbiBhbiBpbWFnZSBhcyBpdCBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRpbGUgaGVpZ2h0IGluIGFuIGltYWdlIGFzIGl0IGlzIHdyaXR0ZW4gdG8gdGhlIAotICAgICAqIG91dHB1dCBzdHJlYW0uCisgICAgICogQHJldHVybiB0aGUgdGlsZSBoZWlnaHQgaW4gYW4gaW1hZ2UgYXMgaXQgaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0CisgICAgICogICAgICAgICBzdHJlYW0uCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRUaWxlSGVpZ2h0KCkgewogICAgICAgICBjaGVja1RpbGluZygpOwpAQCAtNDM0LDExICs0NjYsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbGUgd2lkdGggaW4gYW4gaW1hZ2UgYXMgaXQgaXMgd3JpdHRlbiB0byB0aGUgCi0gICAgICogb3V0cHV0IHN0cmVhbS4KKyAgICAgKiBHZXRzIHRoZSB0aWxlIHdpZHRoIGluIGFuIGltYWdlIGFzIGl0IGlzIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgdGlsZSB3aWR0aCBpbiBhbiBpbWFnZSBhcyBpdCBpcyB3cml0dGVuIHRvIHRoZSAKLSAgICAgKiBvdXRwdXQgc3RyZWFtLgorICAgICAqIEByZXR1cm4gdGhlIHRpbGUgd2lkdGggaW4gYW4gaW1hZ2UgYXMgaXQgaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFRpbGVXaWR0aCgpIHsKICAgICAgICAgY2hlY2tUaWxpbmcoKTsKQEAgLTQ0OCwxMSArNDc4LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGNvbXByZXNzaW9uIHR5cGUgaGFzIGxvc3NsZXNzIAotICAgICAqIGNvbXByZXNzaW9uIG9yIG5vdC4gCisgICAgICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGNvbXByZXNzaW9uIHR5cGUgaGFzIGxvc3NsZXNzIGNvbXByZXNzaW9uIG9yIG5vdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBjdXJyZW50IGNvbXByZXNzaW9uIHR5cGUgaGFzIGxvc3NsZXNzIAotICAgICAqIGNvbXByZXNzaW9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgY3VycmVudCBjb21wcmVzc2lvbiB0eXBlIGhhcyBsb3NzbGVzcyBjb21wcmVzc2lvbiwKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXByZXNzaW9uTG9zc2xlc3MoKSB7CiAgICAgICAgIGNoZWNrV3JpdGVDb21wcmVzc2VkKCk7CkBAIC00NzIsMTIgKzUwMSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbXByZXNzaW9uIG1vZGUgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLSAgICAgKiBUaGUgc3BlY2lmaWVkIG1vZGUgY2FuIGJlIG9uZSBvZiB0aGUgcHJlZGVmaW5lZAotICAgICAqIGNvbnN0YW50czogTU9ERV9ERUZBVUxULCBNT0RFX0RJU0FCTEVELCBNT0RFX0VYUExJQ0lULCAKLSAgICAgKiBvciBNT0RFX0NPUFlfRlJPTV9NRVRBREFUQS4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIG1vZGUgdGhlIG5ldyBjb21wcmVzc2lvbiBtb2RlIHRvIGJlIHNldC4KKyAgICAgKiBTZXRzIHRoZSBjb21wcmVzc2lvbiBtb2RlIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIFRoZSBzcGVjaWZpZWQgbW9kZSBjYW4KKyAgICAgKiBiZSBvbmUgb2YgdGhlIHByZWRlZmluZWQgY29uc3RhbnRzOiBNT0RFX0RFRkFVTFQsIE1PREVfRElTQUJMRUQsCisgICAgICogTU9ERV9FWFBMSUNJVCwgb3IgTU9ERV9DT1BZX0ZST01fTUVUQURBVEEuCisgICAgICogCisgICAgICogQHBhcmFtIG1vZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgY29tcHJlc3Npb24gbW9kZSB0byBiZSBzZXQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29tcHJlc3Npb25Nb2RlKGludCBtb2RlKSB7CiAgICAgICAgIGNoZWNrV3JpdGVDb21wcmVzc2VkKCk7CkBAIC01MDIsOCArNTMxLDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBjb21wcmVzc2lvbiBxdWFsaXR5LiBUaGUgdmFsdWUgc2hvdWxkIGJlIGJldHdlZW4gMCBhbmQgMS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcXVhbGl0eSB0aGUgbmV3IGNvbXByZXNzaW9uIHF1YWxpdHksIAotICAgICAqIGZsb2F0IHZhbHVlIGJldHdlZW4gMCBhbmQgMS4gCisgICAgICogQHBhcmFtIHF1YWxpdHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgY29tcHJlc3Npb24gcXVhbGl0eSwgZmxvYXQgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbXByZXNzaW9uUXVhbGl0eShmbG9hdCBxdWFsaXR5KSB7CiAgICAgICAgIGNoZWNrV3JpdGVDb21wcmVzc2VkKCk7CkBAIC01MTYsMTEgKzU0NSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbXByZXNzaW9uIHR5cGUuIFRoZSBzcGVjaWZpZWQgc3RyaW5nCi0gICAgICogc2hvdWxkIGJlIG9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIAotICAgICAqIGJ5IGdldENvbXByZXNzaW9uVHlwZXMgbWV0aG9kLgorICAgICAqIFNldHMgdGhlIGNvbXByZXNzaW9uIHR5cGUuIFRoZSBzcGVjaWZpZWQgc3RyaW5nIHNob3VsZCBiZSBvbmUgb2YgdGhlCisgICAgICogdmFsdWVzIHJldHVybmVkIGJ5IGdldENvbXByZXNzaW9uVHlwZXMgbWV0aG9kLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wcmVzc2lvblR5cGUgdGhlIG5ldyBjb21wcmVzc2lvbiB0eXBlLgorICAgICAqIEBwYXJhbSBjb21wcmVzc2lvblR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgY29tcHJlc3Npb24gdHlwZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb21wcmVzc2lvblR5cGUoU3RyaW5nIGNvbXByZXNzaW9uVHlwZSkgewogICAgICAgICBjaGVja1dyaXRlQ29tcHJlc3NlZCgpOwpAQCAtNTQ3LDEzICs1NzYsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpbnN0cnVjdGlvbiB0aGF0IHRpbGluZyBzaG91bGQgYmUgcGVyZm9ybWVkIGZvciAKLSAgICAgKiB0aGUgaW1hZ2UgaW4gdGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuIAorICAgICAqIFNldHMgdGhlIGluc3RydWN0aW9uIHRoYXQgdGlsaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQgZm9yIHRoZSBpbWFnZSBpbiB0aGUKKyAgICAgKiBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0aWxlV2lkdGggdGhlIHRpbGUncyB3aWR0aC4KLSAgICAgKiBAcGFyYW0gdGlsZUhlaWdodCB0aGUgdGlsZSdzIGhlaWdodC4KLSAgICAgKiBAcGFyYW0gdGlsZUdyaWRYT2Zmc2V0IHRoZSB0aWxlIGdyaWQncyB4IG9mZnNldC4KLSAgICAgKiBAcGFyYW0gdGlsZUdyaWRZT2Zmc2V0IHRoZSB0aWxlIGdyaWQncyB5IG9mZnNldC4KKyAgICAgKiBAcGFyYW0gdGlsZVdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgdGlsZSdzIHdpZHRoLgorICAgICAqIEBwYXJhbSB0aWxlSGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgdGlsZSdzIGhlaWdodC4KKyAgICAgKiBAcGFyYW0gdGlsZUdyaWRYT2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgdGlsZSBncmlkJ3MgeCBvZmZzZXQuCisgICAgICogQHBhcmFtIHRpbGVHcmlkWU9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIHRpbGUgZ3JpZCdzIHkgb2Zmc2V0LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRpbGluZyhpbnQgdGlsZVdpZHRoLCBpbnQgdGlsZUhlaWdodCwgaW50IHRpbGVHcmlkWE9mZnNldCwgaW50IHRpbGVHcmlkWU9mZnNldCkgewogICAgICAgICBjaGVja1RpbGluZygpOwpAQCAtNTYzLDE5ICs1OTYsMTcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3Qgb2Zmc2V0IHRpbGVzISIpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHRpbGVXaWR0aCA8PTAgfHwgdGlsZUhlaWdodCA8PSAwKSB7CisgICAgICAgIGlmICh0aWxlV2lkdGggPD0gMCB8fCB0aWxlSGVpZ2h0IDw9IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRpbGUgZGltZW5zaW9ucyBhcmUgbm9uLXBvc2l0aXZlISIpOwogICAgICAgICB9CiAKICAgICAgICAgRGltZW5zaW9uIHByZWZlcnJlZFRpbGVTaXplc1tdID0gZ2V0UHJlZmVycmVkVGlsZVNpemVzKCk7CiAgICAgICAgIGlmIChwcmVmZXJyZWRUaWxlU2l6ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVmZXJyZWRUaWxlU2l6ZXMubGVuZ3RoOyBpKz0yKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByZWZlcnJlZFRpbGVTaXplcy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAgICAgIERpbWVuc2lvbiBtaW5TaXplID0gcHJlZmVycmVkVGlsZVNpemVzW2ldOwotICAgICAgICAgICAgICAgIERpbWVuc2lvbiBtYXhTaXplID0gcHJlZmVycmVkVGlsZVNpemVzW2krMV07Ci0gICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAgICAgdGlsZVdpZHRoIDwgbWluU2l6ZS53aWR0aCB8fCB0aWxlV2lkdGggPiBtYXhTaXplLndpZHRoIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aWxlSGVpZ2h0IDwgbWluU2l6ZS5oZWlnaHQgfHwgdGlsZUhlaWdodCA+IG1heFNpemUuaGVpZ2h0Ci0gICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgRGltZW5zaW9uIG1heFNpemUgPSBwcmVmZXJyZWRUaWxlU2l6ZXNbaSArIDFdOworICAgICAgICAgICAgICAgIGlmICh0aWxlV2lkdGggPCBtaW5TaXplLndpZHRoIHx8IHRpbGVXaWR0aCA+IG1heFNpemUud2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRpbGVIZWlnaHQgPCBtaW5TaXplLmhlaWdodCB8fCB0aWxlSGVpZ2h0ID4gbWF4U2l6ZS5oZWlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCB0aWxlIHNpemUhIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNjAzLDExICs2MzQsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0aWxpbmcgbW9kZS4gVGhlIHNwZWNpZmllZCBtb2RlIHNob3VsZCBiZSBvbmUgb2YgdGhlIAotICAgICAqIGZvbGxvd2luZyB2YWx1ZXM6IE1PREVfRElTQUJMRUQsIE1PREVfREVGQVVMVCwgTU9ERV9FWFBMSUNJVCwKLSAgICAgKiBvciBNT0RFX0NPUFlfRlJPTV9NRVRBREFUQS4KKyAgICAgKiBTZXRzIHRoZSB0aWxpbmcgbW9kZS4gVGhlIHNwZWNpZmllZCBtb2RlIHNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZworICAgICAqIHZhbHVlczogTU9ERV9ESVNBQkxFRCwgTU9ERV9ERUZBVUxULCBNT0RFX0VYUExJQ0lULCBvcgorICAgICAqIE1PREVfQ09QWV9GUk9NX01FVEFEQVRBLgogICAgICAqIAotICAgICAqIEBwYXJhbSBtb2RlIHRoZSBuZXcgdGlsaW5nIG1vZGUuCisgICAgICogQHBhcmFtIG1vZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdGlsaW5nIG1vZGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGlsaW5nTW9kZShpbnQgbW9kZSkgewogICAgICAgICBjaGVja1RpbGluZygpOwpAQCAtNjMwLDQgKzY2MiwzIEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlV3JpdGVyLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9JbWFnZVdyaXRlci5qYXZhCmluZGV4IGQ2MTE5YjAuLjg2ODc5ZTAgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlV3JpdGVyLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vSW1hZ2VXcml0ZXIuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBSdXN0ZW0gVi4gUmFmaWtvdgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2VpbzsKIAogaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKQEAgLTQwLDM0ICs0MSw0OSBAQAogaW1wb3J0IGphdmF4LmltYWdlaW8uc3BpLkltYWdlV3JpdGVyU3BpOwogCiAvKioKLSAqIFRoZSBJbWFnZVdyaXRlciBjbGFzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBmb3IgZW5jb2RpbmcgaW1hZ2VzLgotICogSW1hZ2VXcml0ZXIgb2JqZWN0cyBhcmUgaW5zdGFudGlhdGVkIGJ5IHRoZSBzZXJ2aWNlIHByb3ZpZGVyIAotICogaW50ZXJmYWNlLCBJbWFnZVdyaXRlclNwaSBjbGFzcywgZm9yIHRoZSBzcGVjaWZpYyBmb3JtYXQuIAotICogSW1hZ2VXcml0ZXJTcGkgY2xhc3Mgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgSUlPUmVnaXN0cnksIAotICogd2hpY2ggdXNlcyB0aGVtIGZvciBmb3JtYXQgcmVjb2duaXRpb24gYW5kIHByZXNlbnRhdGlvbiBvZiBhdmFpbGFibGUgCi0gKiBmb3JtYXQgcmVhZGVycyBhbmQgd3JpdGVycy4KKyAqIFRoZSBJbWFnZVdyaXRlciBjbGFzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBmb3IgZW5jb2RpbmcgaW1hZ2VzLiBJbWFnZVdyaXRlcgorICogb2JqZWN0cyBhcmUgaW5zdGFudGlhdGVkIGJ5IHRoZSBzZXJ2aWNlIHByb3ZpZGVyIGludGVyZmFjZSwgSW1hZ2VXcml0ZXJTcGkKKyAqIGNsYXNzLCBmb3IgdGhlIHNwZWNpZmljIGZvcm1hdC4gSW1hZ2VXcml0ZXJTcGkgY2xhc3Mgc2hvdWxkIGJlIHJlZ2lzdGVyZWQKKyAqIHdpdGggdGhlIElJT1JlZ2lzdHJ5LCB3aGljaCB1c2VzIHRoZW0gZm9yIGZvcm1hdCByZWNvZ25pdGlvbiBhbmQgcHJlc2VudGF0aW9uCisgKiBvZiBhdmFpbGFibGUgZm9ybWF0IHJlYWRlcnMgYW5kIHdyaXRlcnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW1hZ2VXcml0ZXIgaW1wbGVtZW50cyBJbWFnZVRyYW5zY29kZXIgewogCi0gICAgLyoqIFRoZSBhdmFpbGFibGUgbG9jYWxlcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgYXZhaWxhYmxlIGxvY2FsZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIExvY2FsZVtdIGF2YWlsYWJsZUxvY2FsZXM7Ci0gICAgCi0gICAgLyoqIFRoZSBsb2NhbGUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9jYWxlLgorICAgICAqLwogICAgIHByb3RlY3RlZCBMb2NhbGUgbG9jYWxlOwotICAgIAotICAgIC8qKiBUaGUgb3JpZ2luYXRpbmcgcHJvdmlkZXIuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgb3JpZ2luYXRpbmcgcHJvdmlkZXIuCisgICAgICovCiAgICAgcHJvdGVjdGVkIEltYWdlV3JpdGVyU3BpIG9yaWdpbmF0aW5nUHJvdmlkZXI7Ci0gICAgCi0gICAgLyoqIFRoZSBvdXRwdXQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgb3V0cHV0LgorICAgICAqLwogICAgIHByb3RlY3RlZCBPYmplY3Qgb3V0cHV0OwotICAgIAotICAgIC8qKiBUaGUgcHJvZ3Jlc3MgbGlzdGVuZXJzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHByb2dyZXNzIGxpc3RlbmVycy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgTGlzdDxJSU9Xcml0ZVByb2dyZXNzTGlzdGVuZXI+IHByb2dyZXNzTGlzdGVuZXJzOwotICAgIAotICAgIC8qKiBUaGUgd2FybmluZyBsaXN0ZW5lcnMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgd2FybmluZyBsaXN0ZW5lcnMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIExpc3Q8SUlPV3JpdGVXYXJuaW5nTGlzdGVuZXI+IHdhcm5pbmdMaXN0ZW5lcnM7Ci0gICAgCi0gICAgLyoqIFRoZSB3YXJuaW5nIGxvY2FsZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgd2FybmluZyBsb2NhbGVzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBMaXN0PExvY2FsZT4gd2FybmluZ0xvY2FsZXM7CiAKICAgICAvLyBJbmRpY2F0ZXMgdGhhdCBhYm9ydCBvcGVyYXRpb24gaXMgcmVxdWVzdGVkCkBAIC03OCwyMiArOTQsMjEgQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2VXcml0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9yaWdpbmF0aW5nUHJvdmlkZXIgdGhlIEltYWdlV3JpdGVyU3BpIHdoaWNoIAotICAgICAqIGluc3RhbnRpZXMgdGhpcyBJbWFnZVdyaXRlci4KKyAgICAgKiBAcGFyYW0gb3JpZ2luYXRpbmdQcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlV3JpdGVyU3BpIHdoaWNoIGluc3RhbnRpYXRlcyB0aGlzIEltYWdlV3JpdGVyLgogICAgICAqLwogICAgIHByb3RlY3RlZCBJbWFnZVdyaXRlcihJbWFnZVdyaXRlclNwaSBvcmlnaW5hdGluZ1Byb3ZpZGVyKSB7CiAgICAgICAgIHRoaXMub3JpZ2luYXRpbmdQcm92aWRlciA9IG9yaWdpbmF0aW5nUHJvdmlkZXI7CiAgICAgfQogCiAgICAgcHVibGljIGFic3RyYWN0IElJT01ldGFkYXRhIGNvbnZlcnRTdHJlYW1NZXRhZGF0YShJSU9NZXRhZGF0YSBpaW9NZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlV3JpdGVQYXJhbSBpbWFnZVdyaXRlUGFyYW0pOworICAgICAgICAgICAgSW1hZ2VXcml0ZVBhcmFtIGltYWdlV3JpdGVQYXJhbSk7CiAKICAgICBwdWJsaWMgYWJzdHJhY3QgSUlPTWV0YWRhdGEgY29udmVydEltYWdlTWV0YWRhdGEoSUlPTWV0YWRhdGEgaWlvTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlVHlwZVNwZWNpZmllciBpbWFnZVR5cGVTcGVjaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlV3JpdGVQYXJhbSBpbWFnZVdyaXRlUGFyYW0pOworICAgICAgICAgICAgSW1hZ2VUeXBlU3BlY2lmaWVyIGltYWdlVHlwZVNwZWNpZmllciwgSW1hZ2VXcml0ZVBhcmFtIGltYWdlV3JpdGVQYXJhbSk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBJbWFnZVdyaXRlclNwaSB3aGljaCBpbnN0YW50aWF0ZWQgdGhpcyBJbWFnZVdyaXRlci4gCisgICAgICogR2V0cyB0aGUgSW1hZ2VXcml0ZXJTcGkgd2hpY2ggaW5zdGFudGlhdGVkIHRoaXMgSW1hZ2VXcml0ZXIuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2VXcml0ZXJTcGkuCiAgICAgICovCkBAIC0xMDIsMTAgKzExNywxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgc3RhcnQgb2YgYW4gaW1hZ2UgcmVhZCBieSBjYWxsaW5nIHRoZWlyIGltYWdlU3RhcnRlZAotICAgICAqIG1ldGhvZCBvZiByZWdpc3RlcmVkIElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lcnMuCisgICAgICogUHJvY2Vzc2VzIHRoZSBzdGFydCBvZiBhbiBpbWFnZSByZWFkIGJ5IGNhbGxpbmcgdGhlaXIgaW1hZ2VTdGFydGVkIG1ldGhvZAorICAgICAqIG9mIHJlZ2lzdGVyZWQgSUlPV3JpdGVQcm9ncmVzc0xpc3RlbmVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UgaW5kZXguCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBpbmRleC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW1hZ2VTdGFydGVkKGludCBpbWFnZUluZGV4KSB7CiAgICAgICAgIGlmIChudWxsICE9IHByb2dyZXNzTGlzdGVuZXJzKSB7CkBAIC0xMTYsMTAgKzEzMiwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgY3VycmVudCBwZXJjZW50YWdlIG9mIGltYWdlIGNvbXBsZXRpb24gYnkgY2FsbGluZyAKKyAgICAgKiBQcm9jZXNzZXMgdGhlIGN1cnJlbnQgcGVyY2VudGFnZSBvZiBpbWFnZSBjb21wbGV0aW9uIGJ5IGNhbGxpbmcKICAgICAgKiBpbWFnZVByb2dyZXNzIG1ldGhvZCBvZiByZWdpc3RlcmVkIElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGVyY2VudGFnZURvbmUgdGhlIHBlcmNlbnRhZ2UgZG9uZS4KKyAgICAgKiBAcGFyYW0gcGVyY2VudGFnZURvbmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwZXJjZW50YWdlIGRvbmUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ltYWdlUHJvZ3Jlc3MoZmxvYXQgcGVyY2VudGFnZURvbmUpIHsKICAgICAgICAgaWYgKG51bGwgIT0gcHJvZ3Jlc3NMaXN0ZW5lcnMpIHsKQEAgLTEzMCw4ICsxNDcsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBpbWFnZSBjb21wbGV0aW9uIGJ5IGNhbGxpbmcgaW1hZ2VDb21wbGV0ZSBtZXRob2QKLSAgICAgKiBvZiByZWdpc3RlcmVkIElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lcnMuIAorICAgICAqIFByb2Nlc3NlcyBpbWFnZSBjb21wbGV0aW9uIGJ5IGNhbGxpbmcgaW1hZ2VDb21wbGV0ZSBtZXRob2Qgb2YgcmVnaXN0ZXJlZAorICAgICAqIElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lcnMuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ltYWdlQ29tcGxldGUoKSB7CiAgICAgICAgIGlmIChudWxsICE9IHByb2dyZXNzTGlzdGVuZXJzKSB7CkBAIC0xNDIsMTEgKzE1OSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBhIHdhcm5pbmcgbWVzc2FnZSBieSBjYWxsaW5nIHdhcm5pbmdPY2N1cnJlZCBtZXRob2QKLSAgICAgKiBvZiByZWdpc3RlcmVkIElJT1dyaXRlV2FybmluZ0xpc3RlbmVycy4KKyAgICAgKiBQcm9jZXNzZXMgYSB3YXJuaW5nIG1lc3NhZ2UgYnkgY2FsbGluZyB3YXJuaW5nT2NjdXJyZWQgbWV0aG9kIG9mCisgICAgICogcmVnaXN0ZXJlZCBJSU9Xcml0ZVdhcm5pbmdMaXN0ZW5lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlIGluZGV4LgotICAgICAqIEBwYXJhbSB3YXJuaW5nIHRoZSB3YXJuaW5nLgorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgaW5kZXguCisgICAgICogQHBhcmFtIHdhcm5pbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3YXJuaW5nLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NXYXJuaW5nT2NjdXJyZWQoaW50IGltYWdlSW5kZXgsIFN0cmluZyB3YXJuaW5nKSB7CiAgICAgICAgIGlmIChudWxsID09IHdhcm5pbmcpIHsKQEAgLTE2MCwxMyArMTc5LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgd2FybmluZyBtZXNzYWdlIGJ5IGNhbGxpbmcgd2FybmluZ09jY3VycmVkIG1ldGhvZAotICAgICAqIG9mIHJlZ2lzdGVyZWQgSUlPV3JpdGVXYXJuaW5nTGlzdGVuZXJzIHdpdGggc3RyaW5nIGZyb20gCi0gICAgICogUmVzb3VyY2VCdW5kbGUuCisgICAgICogUHJvY2Vzc2VzIGEgd2FybmluZyBtZXNzYWdlIGJ5IGNhbGxpbmcgd2FybmluZ09jY3VycmVkIG1ldGhvZCBvZgorICAgICAqIHJlZ2lzdGVyZWQgSUlPV3JpdGVXYXJuaW5nTGlzdGVuZXJzIHdpdGggc3RyaW5nIGZyb20gUmVzb3VyY2VCdW5kbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlIGluZGV4LgotICAgICAqIEBwYXJhbSBidW5kbGUgdGhlIG5hbWUgb2YgUmVzb3VyY2VCdW5kbGUuCi0gICAgICogQHBhcmFtIGtleSB0aGUga2V5d29yZC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGluZGV4LgorICAgICAqIEBwYXJhbSBidW5kbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIFJlc291cmNlQnVuZGxlLgorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXl3b3JkLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NXYXJuaW5nT2NjdXJyZWQoaW50IGltYWdlSW5kZXgsIFN0cmluZyBidW5kbGUsIFN0cmluZyBrZXkpIHsKICAgICAgICAgaWYgKHdhcm5pbmdMaXN0ZW5lcnMgIT0gbnVsbCkgeyAvLyBEb24ndCBjaGVjayB0aGUgcGFyYW1ldGVycwpAQCAtMTgwLDE3ICsyMDEsMTggQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleXdvcmQgPT0gbnVsbCEiKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIEdldCB0aGUgY29udGV4dCBjbGFzcyBsb2FkZXIgYW5kIHRyeSB0byBsb2NhdGUgdGhlIGJ1bmRsZSB3aXRoIGl0IGZpcnN0Ci0gICAgICAgIENsYXNzTG9hZGVyIGNvbnRleHRDbGFzc2xvYWRlciA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uPENsYXNzTG9hZGVyPigpIHsKKyAgICAgICAgLy8gR2V0IHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlciBhbmQgdHJ5IHRvIGxvY2F0ZSB0aGUgYnVuZGxlIHdpdGggaXQKKyAgICAgICAgLy8gZmlyc3QKKyAgICAgICAgQ2xhc3NMb2FkZXIgY29udGV4dENsYXNzbG9hZGVyID0gQWNjZXNzQ29udHJvbGxlcgorICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248Q2xhc3NMb2FkZXI+KCkgewogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgcnVuKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGJvdGggbGlzdGVuZXJzIGFuZCBsb2NhbGVzCiAgICAgICAgIGludCBuID0gd2FybmluZ0xpc3RlbmVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IG47IGkrKykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgICAgSUlPV3JpdGVXYXJuaW5nTGlzdGVuZXIgbGlzdGVuZXIgPSB3YXJuaW5nTGlzdGVuZXJzLmdldChpKTsKICAgICAgICAgICAgIExvY2FsZSBsb2NhbGUgPSB3YXJuaW5nTG9jYWxlcy5nZXQoaSk7CiAKQEAgLTIxOCwxMCArMjQwLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3BlY2lmaWVkIE9iamVjdCB0byB0aGUgb3V0cHV0IG9mIHRoaXMgSW1hZ2VXcml0ZXIuIAorICAgICAqIFNldHMgdGhlIHNwZWNpZmllZCBPYmplY3QgdG8gdGhlIG91dHB1dCBvZiB0aGlzIEltYWdlV3JpdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvdXRwdXQgdGhlIE9iamVjdCB3aGljaCByZXByZXNlbnRzIGRlc3RpbmF0aW9uLCBpdCBjYW4gCi0gICAgICogYmUgSW1hZ2VPdXRwdXRTdHJlYW0gb3Igb3RoZXIgb2JqZWN0cy4KKyAgICAgKiBAcGFyYW0gb3V0cHV0CisgICAgICogICAgICAgICAgICB0aGUgT2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgZGVzdGluYXRpb24sIGl0IGNhbiBiZQorICAgICAqICAgICAgICAgICAgSW1hZ2VPdXRwdXRTdHJlYW0gb3Igb3RoZXIgb2JqZWN0cy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoT2JqZWN0IG91dHB1dCkgewogICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpIHsKQEAgLTI0NCwyNiArMjY3LDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgY29tcGxldGVkIGltYWdlIHN0cmVhbSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgaW1hZ2UsIAorICAgICAqIFdyaXRlcyBhIGNvbXBsZXRlZCBpbWFnZSBzdHJlYW0gdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGltYWdlLAogICAgICAqIGRlZmF1bHQgbWV0YWRhdGEsIGFuZCB0aHVtYm5haWxzIHRvIHRoZSBvdXRwdXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlIHRoZSBzcGVjaWZpZWQgaW1hZ2UgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZAotICAgICAqIGR1cmluZyB3cml0dGluZy4KKyAgICAgKiBAcGFyYW0gaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgaW1hZ2UgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgZHVyaW5nIHdyaXRpbmcuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGUoSUlPSW1hZ2UgaW1hZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHdyaXRlKG51bGwsIGltYWdlLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBjb21wbGV0ZWQgaW1hZ2Ugc3RyZWFtIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCAKLSAgICAgKiByZW5kZXJlZCBpbWFnZSwgZGVmYXVsdCBtZXRhZGF0YSwgYW5kIHRodW1ibmFpbHMgdG8gdGhlIG91dHB1dC4KKyAgICAgKiBXcml0ZXMgYSBjb21wbGV0ZWQgaW1hZ2Ugc3RyZWFtIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCByZW5kZXJlZAorICAgICAqIGltYWdlLCBkZWZhdWx0IG1ldGFkYXRhLCBhbmQgdGh1bWJuYWlscyB0byB0aGUgb3V0cHV0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgc3BlY2lmaWVkIFJlbmRlcmVkSW1hZ2UgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZAotICAgICAqIGR1cmluZyB3cml0dGluZy4KKyAgICAgKiBAcGFyYW0gaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgUmVuZGVyZWRJbWFnZSB0byBiZSB3cml0dGVuLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCBkdXJpbmcgd3JpdGluZy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZShSZW5kZXJlZEltYWdlIGltYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB3cml0ZShudWxsLCBuZXcgSUlPSW1hZ2UoaW1hZ2UsIG51bGwsIG51bGwpLCBudWxsKTsKQEAgLTI3MywxNiArMjk2LDE4IEBACiAgICAgICogV3JpdGVzIGEgY29tcGxldGVkIGltYWdlIHN0cmVhbSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgaW1hZ2UsCiAgICAgICogbWV0YWRhdGEgYW5kIHRodW1ibmFpbHMgdG8gdGhlIG91dHB1dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyZWFtTWV0YWRhdGEgdGhlIHN0cmVhbSBtZXRhZGF0YSwgb3IgbnVsbC4KLSAgICAgKiBAcGFyYW0gaW1hZ2UgdGhlIHNwZWNpZmllZCBpbWFnZSB0byBiZSB3cml0dGVuLCBpZgotICAgICAqIGNhbldyaXRlUmFzdGVyKCkgbWV0aG9kIHJldHVybnMgZmFsc2UsIHRoZW4gSW1hZ2UgbXVzdCBjb250YWluIAotICAgICAqIG9ubHkgUmVuZGVyZWRJbWFnZS4KLSAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIEltYWdlV3JpdGVQYXJhbSwgb3IgbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0gaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB3cml0aW5nLgorICAgICAqIEBwYXJhbSBzdHJlYW1NZXRhZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSBtZXRhZGF0YSwgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgaW1hZ2UgdG8gYmUgd3JpdHRlbiwgaWYgY2FuV3JpdGVSYXN0ZXIoKSBtZXRob2QKKyAgICAgKiAgICAgICAgICAgIHJldHVybnMgZmFsc2UsIHRoZW4gSW1hZ2UgbXVzdCBjb250YWluIG9ubHkgUmVuZGVyZWRJbWFnZS4KKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVdyaXRlUGFyYW0sIG9yIG51bGwuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgd3JpdGluZy4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZShJSU9NZXRhZGF0YSBzdHJlYW1NZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSU9JbWFnZSBpbWFnZSwgSW1hZ2VXcml0ZVBhcmFtIHBhcmFtKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGUoSUlPTWV0YWRhdGEgc3RyZWFtTWV0YWRhdGEsIElJT0ltYWdlIGltYWdlLCBJbWFnZVdyaXRlUGFyYW0gcGFyYW0pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBEaXNwb3NlcyBvZiBhbnkgcmVzb3VyY2VzLgpAQCAtMjkyLDI2ICszMTcsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXF1ZXN0cyBhbiBhYm9ydCBvcGVyYXRpb24gZm9yIGN1cnJlbnQgd3JpdGluZyBvcGVyYXRpb24uIAorICAgICAqIFJlcXVlc3RzIGFuIGFib3J0IG9wZXJhdGlvbiBmb3IgY3VycmVudCB3cml0aW5nIG9wZXJhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWJvcnQoKSB7CiAgICAgICAgIGFib3J0ZWQgPSB0cnVlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCBhIHJlcXVlc3QgdG8gYWJvcnQgdGhlIGN1cnJlbnQgd3JpdGUgb3BlcmF0aW9uIAotICAgICAqIGhhcyBiZWVuIG1hZGUgc3VjY2Vzc2Z1bGx5LgorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCBhIHJlcXVlc3QgdG8gYWJvcnQgdGhlIGN1cnJlbnQgd3JpdGUgb3BlcmF0aW9uIGhhcworICAgICAqIGJlZW4gbWFkZSBzdWNjZXNzZnVsbHkuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcmVxdWVzdCB0byBhYm9ydCB0aGUgY3VycmVudCB3cml0ZSBvcGVyYXRpb24gCi0gICAgICogaGFzIGJlZW4gbWFkZSBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSByZXF1ZXN0IHRvIGFib3J0IHRoZSBjdXJyZW50IHdyaXRlIG9wZXJhdGlvbiBoYXMKKyAgICAgKiAgICAgICAgIGJlZW4gbWFkZSBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGJvb2xlYW4gYWJvcnRSZXF1ZXN0ZWQoKSB7CiAgICAgICAgIHJldHVybiBhYm9ydGVkOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsZWFycyBhbGwgcHJldmlvdXMgYWJvcnQgcmVxdWVzdCwgYW5kIGFib3J0UmVxdWVzdGVkIHJldHVybnMgZmFsc2UKLSAgICAgKiBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLgorICAgICAqIENsZWFycyBhbGwgcHJldmlvdXMgYWJvcnQgcmVxdWVzdCwgYW5kIGFib3J0UmVxdWVzdGVkIHJldHVybnMgZmFsc2UgYWZ0ZXIKKyAgICAgKiBjYWxsaW5nIHRoaXMgbWV0aG9kLgogICAgICAqLwogICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhckFib3J0UmVxdWVzdCgpIHsKICAgICAgICAgYWJvcnRlZCA9IGZhbHNlOwpAQCAtMzIwLDcgKzM0NSw4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgSUlPV3JpdGVQcm9ncmVzc0xpc3RlbmVyIGxpc3RlbmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgSUlPV3JpdGVQcm9ncmVzc0xpc3RlbmVyIGxpc3RlbmVyLgorICAgICAqIEBwYXJhbSBsaXN0ZW5lcgorICAgICAqICAgICAgICAgICAgdGhlIElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRJSU9Xcml0ZVByb2dyZXNzTGlzdGVuZXIoSUlPV3JpdGVQcm9ncmVzc0xpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7CkBAIC0zMzcsNyArMzYzLDggQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBJSU9Xcml0ZVdhcm5pbmdMaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIElJT1dyaXRlV2FybmluZ0xpc3RlbmVyIGxpc3RlbmVyLgorICAgICAqIEBwYXJhbSBsaXN0ZW5lcgorICAgICAqICAgICAgICAgICAgdGhlIElJT1dyaXRlV2FybmluZ0xpc3RlbmVyIGxpc3RlbmVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZElJT1dyaXRlV2FybmluZ0xpc3RlbmVyKElJT1dyaXRlV2FybmluZ0xpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7CkBAIC0zNTYsOCArMzgzLDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBvdXRwdXQgb2JqZWN0IHRoYXQgd2FzIHNldCBieSBzZXRPdXRwdXQgbWV0aG9kLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG91dHB1dCBvYmplY3Qgc3VjaCBhcyBJbWFnZU91dHB1dFN0cmVhbSwgb3IgbnVsbCBpZgotICAgICAqIGl0IGlzIG5vdCBzZXQuCisgICAgICogQHJldHVybiB0aGUgb3V0cHV0IG9iamVjdCBzdWNoIGFzIEltYWdlT3V0cHV0U3RyZWFtLCBvciBudWxsIGlmIGl0IGlzIG5vdAorICAgICAqICAgICAgICAgc2V0LgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0T3V0cHV0KCkgewogICAgICAgICByZXR1cm4gb3V0cHV0OwpAQCAtMzY2LDcgKzM5Myw3IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2sgb3V0cHV0IHJldHVybiBmYWxzZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwuCiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNoZWNrT3V0cHV0UmV0dXJuRmFsc2UoKSB7CiAgICAgICAgIGlmIChnZXRPdXRwdXQoKSA9PSBudWxsKSB7CkBAIC0zODUsMTI0ICs0MTIsMTIyIEBACiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgd3JpdGUgdmFyaWFudCEiKTsKICAgICB9CiAKLQogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhIG5ldyBlbXB0eSBpbWFnZSBjYW4gYmUgaW5zZXJ0ZWQgYXQgCi0gICAgICogdGhlIHNwZWNpZmllZCBpbmRleC4gCisgICAgICogUmV0dXJucyB0cnVlIGlmIGEgbmV3IGVtcHR5IGltYWdlIGNhbiBiZSBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgaW1hZ2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgbmV3IGVtcHR5IGltYWdlIGNhbiBiZSBpbnNlcnRlZCBhdCAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGluZGV4LCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgaW1hZ2UuCisgICAgICogQHJldHVybiB0cnVlIGlmIGEgbmV3IGVtcHR5IGltYWdlIGNhbiBiZSBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuSW5zZXJ0RW1wdHkoaW50IGltYWdlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBjaGVja091dHB1dFJldHVybkZhbHNlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIGEgbmV3IGltYWdlIGNhbiBiZSBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LiAKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgYSBuZXcgaW1hZ2UgY2FuIGJlIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIHNwZWNpZmllZCBpbmRleCBvZiBpbWFnZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBuZXcgaW1hZ2UgY2FuIGJlIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBpbmRleCBvZiBpbWFnZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBuZXcgaW1hZ2UgY2FuIGJlIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjYW5JbnNlcnRJbWFnZShpbnQgaW1hZ2VJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGNoZWNrT3V0cHV0UmV0dXJuRmFsc2UoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5lcyB0cnVlIGlmIHRoZSBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggY2FuIGJlIHJlbW92ZWQuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggY2FuIGJlIHJlbW92ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIHNwZWNpZmllZCBpbmRleCBvZiBpbWFnZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleCBjYW4gYmUgcmVtb3ZlZCwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgaW1hZ2UuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggY2FuIGJlIHJlbW92ZWQsIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmVJbWFnZShpbnQgaW1hZ2VJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGNoZWNrT3V0cHV0UmV0dXJuRmFsc2UoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgbWV0YWRhdGEgb2YgdGhlIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleAotICAgICAqIGNhbiBiZSByZXBsYWNlZC4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgbWV0YWRhdGEgb2YgdGhlIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleCBjYW4gYmUKKyAgICAgKiByZXBsYWNlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgc3BlY2lmaWVkIGltYWdlIGluZGV4LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBtZXRhZGF0YSBvZiB0aGUgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0gICAgICogY2FuIGJlIHJlcGxhY2VkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgaW1hZ2UgaW5kZXguCisgICAgICogQHJldHVybiB0cnVlIGlmIG1ldGFkYXRhIG9mIHRoZSBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggY2FuIGJlCisgICAgICogICAgICAgICByZXBsYWNlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjYW5SZXBsYWNlSW1hZ2VNZXRhZGF0YShpbnQgaW1hZ2VJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGNoZWNrT3V0cHV0UmV0dXJuRmFsc2UoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgcGl4ZWxzIG9mIHRoZSBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggCi0gICAgICogY2FuIGJlIHJlcGxhY2VkIGJ5IHRoZSByZXBsYWNlUGl4ZWxzICBtZXRob2RzLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBwaXhlbHMgb2YgdGhlIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleCBjYW4gYmUKKyAgICAgKiByZXBsYWNlZCBieSB0aGUgcmVwbGFjZVBpeGVscyBtZXRob2RzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSdzIGluZGV4LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBwaXhlbHMgb2YgdGhlIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleCAKLSAgICAgKiBjYW4gYmUgcmVwbGFjZWQgYnkgdGhlIHJlcGxhY2VQaXhlbHMgIG1ldGhvZHMsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlJ3MgaW5kZXguCisgICAgICogQHJldHVybiB0cnVlIGlmIHBpeGVscyBvZiB0aGUgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4IGNhbiBiZQorICAgICAqICAgICAgICAgcmVwbGFjZWQgYnkgdGhlIHJlcGxhY2VQaXhlbHMgbWV0aG9kcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuUmVwbGFjZVBpeGVscyhpbnQgaW1hZ2VJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGNoZWNrT3V0cHV0UmV0dXJuRmFsc2UoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHN0cmVhbSBtZXRhZGF0YSBwcmVzZW50ZWQgaW4gdGhlIG91dHB1dAotICAgICAqIGNhbiBiZSByZW1vdmVkLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyZWFtIG1ldGFkYXRhIHByZXNlbnRlZCBpbiB0aGUgb3V0cHV0IGNhbiBiZQorICAgICAqIHJlbW92ZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJlYW0gbWV0YWRhdGEgcHJlc2VudGVkIGluIHRoZSBvdXRwdXQKLSAgICAgKiBjYW4gYmUgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyZWFtIG1ldGFkYXRhIHByZXNlbnRlZCBpbiB0aGUgb3V0cHV0IGNhbiBiZQorICAgICAqICAgICAgICAgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjYW5SZXBsYWNlU3RyZWFtTWV0YWRhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gY2hlY2tPdXRwdXRSZXR1cm5GYWxzZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd3JpdGluZyBvZiBhIGNvbXBsZXRlIGltYWdlIHN0cmVhbSB3aGljaAotICAgICAqIGNvbnRhaW5zIGEgc2luZ2xlIGltYWdlIGlzIHN1cHBvcnRlZCB3aXRoIHVuZGVmaW5lZCBwaXhlbCAKLSAgICAgKiB2YWx1ZXMgYW5kIGFzc29jaWF0ZWQgbWV0YWRhdGEgYW5kIHRodW1ibmFpbHMgdG8gdGhlIG91dHB1dC4gCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3cml0aW5nIG9mIGEgY29tcGxldGUgaW1hZ2Ugc3RyZWFtIHdoaWNoIGNvbnRhaW5zIGEKKyAgICAgKiBzaW5nbGUgaW1hZ2UgaXMgc3VwcG9ydGVkIHdpdGggdW5kZWZpbmVkIHBpeGVsIHZhbHVlcyBhbmQgYXNzb2NpYXRlZAorICAgICAqIG1ldGFkYXRhIGFuZCB0aHVtYm5haWxzIHRvIHRoZSBvdXRwdXQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB3cml0aW5nIG9mIGEgY29tcGxldGUgaW1hZ2Ugc3RyZWFtIHdoaWNoCi0gICAgICogY29udGFpbnMgYSBzaW5nbGUgaW1hZ2UgaXMgc3VwcG9ydGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB3cml0aW5nIG9mIGEgY29tcGxldGUgaW1hZ2Ugc3RyZWFtIHdoaWNoIGNvbnRhaW5zIGEKKyAgICAgKiAgICAgICAgIHNpbmdsZSBpbWFnZSBpcyBzdXBwb3J0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuV3JpdGVFbXB0eSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBjaGVja091dHB1dFJldHVybkZhbHNlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBtZXRob2RzIHdoaWNoIHRha2VuIGFuIElJT0ltYWdlUGFyYW1ldGVyIAotICAgICAqIGNhbiBkZWFsIHdpdGggYSBSYXN0ZXIgc291cmNlIGltYWdlLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWV0aG9kcyB3aGljaCB0YWtlbiBhbiBJSU9JbWFnZVBhcmFtZXRlciBjYW4gZGVhbAorICAgICAqIHdpdGggYSBSYXN0ZXIgc291cmNlIGltYWdlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kcyB3aGljaCB0YWtlbiBhbiBJSU9JbWFnZVBhcmFtZXRlciAKLSAgICAgKiBjYW4gZGVhbCB3aXRoIGEgUmFzdGVyIHNvdXJjZSBpbWFnZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kcyB3aGljaCB0YWtlbiBhbiBJSU9JbWFnZVBhcmFtZXRlciBjYW4gZGVhbAorICAgICAqICAgICAgICAgd2l0aCBhIFJhc3RlciBzb3VyY2UgaW1hZ2UsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjYW5Xcml0ZVJhc3RlcnMoKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdyaXRlciBjYW4gYWRkIGFuIGltYWdlIHRvIHN0cmVhbSB0aGF0Ci0gICAgICogYWxyZWFkeSBjb250YWlucyBoZWFkZXIgaW5mb3JtYXRpb24uCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3cml0ZXIgY2FuIGFkZCBhbiBpbWFnZSB0byBzdHJlYW0gdGhhdCBhbHJlYWR5CisgICAgICogY29udGFpbnMgaGVhZGVyIGluZm9ybWF0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gaWYgdGhlIHdyaXRlciBjYW4gYWRkIGFuIGltYWdlIHRvIHN0cmVhbSB0aGF0Ci0gICAgICogYWxyZWFkeSBjb250YWlucyBoZWFkZXIgaW5mb3JtYXRpb24sIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIGlmIHRoZSB3cml0ZXIgY2FuIGFkZCBhbiBpbWFnZSB0byBzdHJlYW0gdGhhdCBhbHJlYWR5IGNvbnRhaW5zCisgICAgICogICAgICAgICBoZWFkZXIgaW5mb3JtYXRpb24sIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjYW5Xcml0ZVNlcXVlbmNlKCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC01MTEsMTYgKzUzNiwxOCBAQAogICAgIC8qKgogICAgICAqIEVuZHMgdGhlIGluc2VydGlvbiBvZiBhIG5ldyBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5kSW5zZXJ0RW1wdHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB1bnN1cHBvcnRlZE9wZXJhdGlvbigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVuZHMgdGhlIHJlcGFsY2UgcGl4ZWxzIG9wZXJhdGlvbi4KKyAgICAgKiBFbmRzIHRoZSByZXBsYWNlIHBpeGVscyBvcGVyYXRpb24uCiAgICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGVuZFJlcGxhY2VQaXhlbHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB1bnN1cHBvcnRlZE9wZXJhdGlvbigpOwpAQCAtNTI5LDcgKzU1Niw4IEBACiAgICAgLyoqCiAgICAgICogRW5kcyBhbiBlbXB0eSB3cml0ZSBvcGVyYXRpb24uCiAgICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGVuZFdyaXRlRW1wdHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB1bnN1cHBvcnRlZE9wZXJhdGlvbigpOwpAQCAtNTM4LDcgKzU2Niw4IEBACiAgICAgLyoqCiAgICAgICogRW5kcyB0aGUgc2VxdWVuY2Ugb2Ygd3JpdGUgb3BlcmF0aW9ucy4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5kV3JpdGVTZXF1ZW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHVuc3VwcG9ydGVkT3BlcmF0aW9uKCk7CkBAIC01NTgsMjUgKzU4NywyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gSUlPTWV0YWRhdGEgb2JqZWN0IHRoYXQgY29udGFpbnMgZGVmYXVsdCB2YWx1ZXMgCi0gICAgICogZm9yIGVuY29kaW5nIGFuIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCB0eXBlLiAKKyAgICAgKiBHZXRzIGFuIElJT01ldGFkYXRhIG9iamVjdCB0aGF0IGNvbnRhaW5zIGRlZmF1bHQgdmFsdWVzIGZvciBlbmNvZGluZyBhbgorICAgICAqIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCB0eXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZVR5cGUgdGhlIEltYWdlVHlwZVNwZWNpZmllci4KLSAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIEltYWdlV3JpdGVQYXJhbS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyLgorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlV3JpdGVQYXJhbS4KICAgICAgKiBAcmV0dXJuIHRoZSBJSU9NZXRhZGF0YSBvYmplY3QuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IElJT01ldGFkYXRhIGdldERlZmF1bHRJbWFnZU1ldGFkYXRhKAotICAgICAgICAgICAgSW1hZ2VUeXBlU3BlY2lmaWVyIGltYWdlVHlwZSwKLSAgICAgICAgICAgIEltYWdlV3JpdGVQYXJhbSBwYXJhbQotICAgICk7CisgICAgcHVibGljIGFic3RyYWN0IElJT01ldGFkYXRhIGdldERlZmF1bHRJbWFnZU1ldGFkYXRhKEltYWdlVHlwZVNwZWNpZmllciBpbWFnZVR5cGUsCisgICAgICAgICAgICBJbWFnZVdyaXRlUGFyYW0gcGFyYW0pOwogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBJSU9NZXRhZGF0YSBvYmplY3QgdGhhdCBjb250YWlucyBkZWZhdWx0IHZhbHVlcyAKLSAgICAgKiBmb3IgZW5jb2RpbmcgYSBzdHJlYW0gb2YgaW1hZ2VzLgorICAgICAqIEdldHMgYW4gSUlPTWV0YWRhdGEgb2JqZWN0IHRoYXQgY29udGFpbnMgZGVmYXVsdCB2YWx1ZXMgZm9yIGVuY29kaW5nIGEKKyAgICAgKiBzdHJlYW0gb2YgaW1hZ2VzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJhbSB0aGUgSW1hZ2VXcml0ZVBhcmFtLgotICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlV3JpdGVQYXJhbS4KICAgICAgKiBAcmV0dXJuIHRoZSBJSU9NZXRhZGF0YSBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IElJT01ldGFkYXRhIGdldERlZmF1bHRTdHJlYW1NZXRhZGF0YShJbWFnZVdyaXRlUGFyYW0gcGFyYW0pOwpAQCAtNTkxLDkgKzYxOSw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVmYXVsdCB3cml0ZSBwYXJhbS4KLSAgICAgKiBHZXRzIGEgbmV3IEltYWdlV3JpdGVQYXJhbSBvYmplY3QgZm9yIHRoaXMgSW1hZ2VXcml0ZXIgd2l0aCB0aGUKLSAgICAgKiBjdXJyZW50IExvY2FsZS4KKyAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHdyaXRlIHBhcmFtLiBHZXRzIGEgbmV3IEltYWdlV3JpdGVQYXJhbSBvYmplY3QgZm9yIHRoaXMKKyAgICAgKiBJbWFnZVdyaXRlciB3aXRoIHRoZSBjdXJyZW50IExvY2FsZS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIGEgbmV3IEltYWdlV3JpdGVQYXJhbSBvYmplY3QgZm9yIHRoaXMgSW1hZ2VXcml0ZXIuCiAgICAgICovCkBAIC02MDIsMTI0ICs2MjksMTMxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHRodW1ibmFpbHMgc3Vwb3J0ZWQgYnkgdGhlIGZvcm1hdCAKLSAgICAgKiBiZWluZyB3cml0dGVuIHdpdGggc3VwcG9ydGVkIGltYWdlIHR5cGUsIGltYWdlIHdyaXRlIAotICAgICAqIHBhcmFtZXRlcnMsIHN0cmVhbSwgYW5kIGltYWdlIG1ldGFkYXRhIG9iamVjdHMuCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHRodW1ibmFpbHMgc3VwcG9ydGVkIGJ5IHRoZSBmb3JtYXQgYmVpbmcgd3JpdHRlbiB3aXRoCisgICAgICogc3VwcG9ydGVkIGltYWdlIHR5cGUsIGltYWdlIHdyaXRlIHBhcmFtZXRlcnMsIHN0cmVhbSwgYW5kIGltYWdlIG1ldGFkYXRhCisgICAgICogb2JqZWN0cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlIHRoZSBJbWFnZVR5cGVTcGVjaWZpZXIuCi0gICAgICogQHBhcmFtIHBhcmFtIHRoZSBpbWFnZSdzIHBhcmFtZXRlcnMuCi0gICAgICogQHBhcmFtIHN0cmVhbU1ldGFkYXRhIHRoZSBzdHJlYW0gbWV0YWRhdGEuCi0gICAgICogQHBhcmFtIGltYWdlTWV0YWRhdGEgdGhlIGltYWdlIG1ldGFkYXRhLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB0aHVtYm5haWxzIHN1cHBvcnRlZAorICAgICAqIEBwYXJhbSBpbWFnZVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVR5cGVTcGVjaWZpZXIuCisgICAgICogQHBhcmFtIHBhcmFtCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UncyBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBzdHJlYW1NZXRhZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSBtZXRhZGF0YS4KKyAgICAgKiBAcGFyYW0gaW1hZ2VNZXRhZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIG1ldGFkYXRhLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB0aHVtYm5haWxzIHN1cHBvcnRlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE51bVRodW1ibmFpbHNTdXBwb3J0ZWQoCi0gICAgICAgICAgICBJbWFnZVR5cGVTcGVjaWZpZXIgaW1hZ2VUeXBlLAotICAgICAgICAgICAgSW1hZ2VXcml0ZVBhcmFtIHBhcmFtLAotICAgICAgICAgICAgSUlPTWV0YWRhdGEgc3RyZWFtTWV0YWRhdGEsCi0gICAgICAgICAgICBJSU9NZXRhZGF0YSBpbWFnZU1ldGFkYXRhCi0gICAgKSB7CisgICAgcHVibGljIGludCBnZXROdW1UaHVtYm5haWxzU3VwcG9ydGVkKEltYWdlVHlwZVNwZWNpZmllciBpbWFnZVR5cGUsIEltYWdlV3JpdGVQYXJhbSBwYXJhbSwKKyAgICAgICAgICAgIElJT01ldGFkYXRhIHN0cmVhbU1ldGFkYXRhLCBJSU9NZXRhZGF0YSBpbWFnZU1ldGFkYXRhKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByZWZlcnJlZCB0aHVtYm5haWwgc2l6ZXMuCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiBEaW1lbnNpb25zIHdpdGggdGhlIHNpemVzIGZvciB0aHVtYm5haWwgaW1hZ2VzIAotICAgICAqIGFzIHRoZXkgYXJlIGVuY29kZWQgaW4gdGhlIG91dHB1dCBmaWxlIG9yIHN0cmVhbS4gCisgICAgICogR2V0cyB0aGUgcHJlZmVycmVkIHRodW1ibmFpbCBzaXplcy4gR2V0cyBhbiBhcnJheSBvZiBEaW1lbnNpb25zIHdpdGggdGhlCisgICAgICogc2l6ZXMgZm9yIHRodW1ibmFpbCBpbWFnZXMgYXMgdGhleSBhcmUgZW5jb2RlZCBpbiB0aGUgb3V0cHV0IGZpbGUgb3IKKyAgICAgKiBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlVHlwZSB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyLgotICAgICAqIEBwYXJhbSBwYXJhbSB0aGUgSW1hZ2VXcml0ZVBhcmFtLgotICAgICAqIEBwYXJhbSBzdHJlYW1NZXRhZGF0YSB0aGUgc3RyZWFtIG1ldGFkYXRhLgotICAgICAqIEBwYXJhbSBpbWFnZU1ldGFkYXRhIHRoZSBpbWFnZSBtZXRhZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVmZXJyZWQgdGh1bWJuYWlsIHNpemVzCisgICAgICogQHBhcmFtIGltYWdlVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlVHlwZVNwZWNpZmllci4KKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVdyaXRlUGFyYW0uCisgICAgICogQHBhcmFtIHN0cmVhbU1ldGFkYXRhCisgICAgICogICAgICAgICAgICB0aGUgc3RyZWFtIG1ldGFkYXRhLgorICAgICAqIEBwYXJhbSBpbWFnZU1ldGFkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgbWV0YWRhdGEuCisgICAgICogQHJldHVybiB0aGUgcHJlZmVycmVkIHRodW1ibmFpbCBzaXplcy4KICAgICAgKi8KLSAgICBwdWJsaWMgRGltZW5zaW9uW10gZ2V0UHJlZmVycmVkVGh1bWJuYWlsU2l6ZXMoCi0gICAgICAgICAgICBJbWFnZVR5cGVTcGVjaWZpZXIgaW1hZ2VUeXBlLAotICAgICAgICAgICAgSW1hZ2VXcml0ZVBhcmFtIHBhcmFtLAotICAgICAgICAgICAgSUlPTWV0YWRhdGEgc3RyZWFtTWV0YWRhdGEsCi0gICAgICAgICAgICBJSU9NZXRhZGF0YSBpbWFnZU1ldGFkYXRhCi0gICAgKSB7CisgICAgcHVibGljIERpbWVuc2lvbltdIGdldFByZWZlcnJlZFRodW1ibmFpbFNpemVzKEltYWdlVHlwZVNwZWNpZmllciBpbWFnZVR5cGUsCisgICAgICAgICAgICBJbWFnZVdyaXRlUGFyYW0gcGFyYW0sIElJT01ldGFkYXRhIHN0cmVhbU1ldGFkYXRhLCBJSU9NZXRhZGF0YSBpbWFnZU1ldGFkYXRhKSB7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByZXBhcmVzIGluc2VydGlvbiBvZiBhbiBlbXB0eSBpbWFnZSBieSByZXF1ZXN0aW5nIHRoZSBpbnNlcnRpb24gb2YgCi0gICAgICogYSBuZXcgaW1hZ2UgaW50byBhbiBleGlzdGluZyBpbWFnZSBzdHJlYW0uCisgICAgICogUHJlcGFyZXMgaW5zZXJ0aW9uIG9mIGFuIGVtcHR5IGltYWdlIGJ5IHJlcXVlc3RpbmcgdGhlIGluc2VydGlvbiBvZiBhIG5ldworICAgICAqIGltYWdlIGludG8gYW4gZXhpc3RpbmcgaW1hZ2Ugc3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSBpbmRleC4KLSAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlIHRoZSBpbWFnZSB0eXBlLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGltYWdlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UuCi0gICAgICogQHBhcmFtIGltYWdlTWV0YWRhdGEgdGhlIGltYWdlIG1ldGFkYXRhLCBvciBudWxsLgotICAgICAqIEBwYXJhbSB0aHVtYm5haWxzIHRoZSBhcnJheSB0aHVtYm5haWxzIGZvciB0aGlzIGltYWdlLCBvciBudWxsLgotICAgICAqIEBwYXJhbSBwYXJhbSB0aGUgSW1hZ2VXcml0ZVBhcmFtLCBvciBudWxsLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgaW5kZXguCisgICAgICogQHBhcmFtIGltYWdlVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIHR5cGUuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGltYWdlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlLgorICAgICAqIEBwYXJhbSBpbWFnZU1ldGFkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgbWV0YWRhdGEsIG9yIG51bGwuCisgICAgICogQHBhcmFtIHRodW1ibmFpbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB0aHVtYm5haWxzIGZvciB0aGlzIGltYWdlLCBvciBudWxsLgorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlV3JpdGVQYXJhbSwgb3IgbnVsbC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUluc2VydEVtcHR5KAotICAgICAgICAgICAgaW50IGltYWdlSW5kZXgsIEltYWdlVHlwZVNwZWNpZmllciBpbWFnZVR5cGUsCi0gICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICBJSU9NZXRhZGF0YSBpbWFnZU1ldGFkYXRhLCBMaXN0PD8gZXh0ZW5kcyBCdWZmZXJlZEltYWdlPiB0aHVtYm5haWxzLAotICAgICAgICAgICAgSW1hZ2VXcml0ZVBhcmFtIHBhcmFtCi0gICAgKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHByZXBhcmVJbnNlcnRFbXB0eShpbnQgaW1hZ2VJbmRleCwgSW1hZ2VUeXBlU3BlY2lmaWVyIGltYWdlVHlwZSwgaW50IHdpZHRoLAorICAgICAgICAgICAgaW50IGhlaWdodCwgSUlPTWV0YWRhdGEgaW1hZ2VNZXRhZGF0YSwgTGlzdDw/IGV4dGVuZHMgQnVmZmVyZWRJbWFnZT4gdGh1bWJuYWlscywKKyAgICAgICAgICAgIEltYWdlV3JpdGVQYXJhbSBwYXJhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdW5zdXBwb3J0ZWRPcGVyYXRpb24oKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmVwYXJlcyB0aGUgd3JpdGVyIHRvIGNhbGwgdGhlIHJlcGxhY2VQaXhlbHMgbWV0aG9kIGZvciB0aGUKLSAgICAgKiBzcGVjaWZpZWQgcmVnaW9uLiAKKyAgICAgKiBQcmVwYXJlcyB0aGUgd3JpdGVyIHRvIGNhbGwgdGhlIHJlcGxhY2VQaXhlbHMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogcmVnaW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSdzIGluZGV4LgotICAgICAqIEBwYXJhbSByZWdpb24gdGhlIHNwZWNpZmllZCByZWdpb24uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSdzIGluZGV4LgorICAgICAqIEBwYXJhbSByZWdpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgcmVnaW9uLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlUmVwbGFjZVBpeGVscyhpbnQgaW1hZ2VJbmRleCwgUmVjdGFuZ2xlIHJlZ2lvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdW5zdXBwb3J0ZWRPcGVyYXRpb24oKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmVwYXJlcyB0aGUgd3JpdGVyIGZvciB3cml0aW5nIGFuIGVtcHR5IGltYWdlIGJ5IGJlZ2lubmluZyB0aGUgCi0gICAgICogcHJvY2VzcyBvZiB3cml0aW5nIGEgY29tcGxldGUgaW1hZ2Ugc3RyZWFtIHRoYXQgY29udGFpbnMgYSBzaW5nbGUgaW1hZ2UgCi0gICAgICogd2l0aCB1bmRlZmluZWQgcGl4ZWwgdmFsdWVzLCBtZXRhZGF0YSBhbmQgdGh1bWJuYWlscywgCi0gICAgICogdG8gdGhlIG91dHB1dC4gCisgICAgICogUHJlcGFyZXMgdGhlIHdyaXRlciBmb3Igd3JpdGluZyBhbiBlbXB0eSBpbWFnZSBieSBiZWdpbm5pbmcgdGhlIHByb2Nlc3MKKyAgICAgKiBvZiB3cml0aW5nIGEgY29tcGxldGUgaW1hZ2Ugc3RyZWFtIHRoYXQgY29udGFpbnMgYSBzaW5nbGUgaW1hZ2Ugd2l0aAorICAgICAqIHVuZGVmaW5lZCBwaXhlbCB2YWx1ZXMsIG1ldGFkYXRhIGFuZCB0aHVtYm5haWxzLCB0byB0aGUgb3V0cHV0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW1NZXRhZGF0YSB0aGUgc3RyZWFtIG1ldGFkYXRhLgotICAgICAqIEBwYXJhbSBpbWFnZVR5cGUgdGhlIGltYWdlIHR5cGUuCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZS4KLSAgICAgKiBAcGFyYW0gaW1hZ2VNZXRhZGF0YSB0aGUgaW1hZ2UncyBtZXRhZGF0YSwgb3IgbnVsbC4KLSAgICAgKiBAcGFyYW0gdGh1bWJuYWlscyB0aGUgaW1hZ2UncyB0aHVtYm5haWxzLCBvciBudWxsLgotICAgICAqIEBwYXJhbSBwYXJhbSB0aGUgaW1hZ2UncyBwYXJhbWV0ZXJzLCBvciBudWxsLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBzdHJlYW1NZXRhZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSBtZXRhZGF0YS4KKyAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgdHlwZS4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UuCisgICAgICogQHBhcmFtIGltYWdlTWV0YWRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSdzIG1ldGFkYXRhLCBvciBudWxsLgorICAgICAqIEBwYXJhbSB0aHVtYm5haWxzCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UncyB0aHVtYm5haWxzLCBvciBudWxsLgorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlJ3MgcGFyYW1ldGVycywgb3IgbnVsbC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZVdyaXRlRW1wdHkoCi0gICAgICAgICAgICBJSU9NZXRhZGF0YSBzdHJlYW1NZXRhZGF0YSwgSW1hZ2VUeXBlU3BlY2lmaWVyIGltYWdlVHlwZSwKLSAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgIElJT01ldGFkYXRhIGltYWdlTWV0YWRhdGEsIExpc3Q8PyBleHRlbmRzIEJ1ZmZlcmVkSW1hZ2U+IHRodW1ibmFpbHMsCi0gICAgICAgICAgICBJbWFnZVdyaXRlUGFyYW0gcGFyYW0KLSAgICApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgcHJlcGFyZVdyaXRlRW1wdHkoSUlPTWV0YWRhdGEgc3RyZWFtTWV0YWRhdGEsIEltYWdlVHlwZVNwZWNpZmllciBpbWFnZVR5cGUsCisgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIElJT01ldGFkYXRhIGltYWdlTWV0YWRhdGEsCisgICAgICAgICAgICBMaXN0PD8gZXh0ZW5kcyBCdWZmZXJlZEltYWdlPiB0aHVtYm5haWxzLCBJbWFnZVdyaXRlUGFyYW0gcGFyYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHVuc3VwcG9ydGVkT3BlcmF0aW9uKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJlcGFyZXMgYSBzdHJlYW0gdG8gYWNjZXB0IGNhbGxzIG9mIHdyaXRlVG9TZXF1ZW5jZSBtZXRob2QgCi0gICAgICogdXNpbmcgdGhlIG1ldGFkYXRhIG9iamVjdC4gCisgICAgICogUHJlcGFyZXMgYSBzdHJlYW0gdG8gYWNjZXB0IGNhbGxzIG9mIHdyaXRlVG9TZXF1ZW5jZSBtZXRob2QgdXNpbmcgdGhlCisgICAgICogbWV0YWRhdGEgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW1NZXRhZGF0YSB0aGUgc3RyZWFtIG1ldGFkYXRhLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBzdHJlYW1NZXRhZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSBtZXRhZGF0YS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHJlcGFyZVdyaXRlU2VxdWVuY2UoSUlPTWV0YWRhdGEgc3RyZWFtTWV0YWRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHVuc3VwcG9ydGVkT3BlcmF0aW9uKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIHRoZSBjb21wbGV0aW9uIG9mIGEgdGh1bWJuYWlsIHJlYWQgCi0gICAgICogYnkgY2FsbGluZyB0aGVpciB0aHVtYm5haWxDb21wbGV0ZSBtZXRob2QgCi0gICAgICogb2YgcmVnaXN0ZXJlZCBJSU9Xcml0ZVByb2dyZXNzTGlzdGVuZXJzLiAKKyAgICAgKiBQcm9jZXNzZXMgdGhlIGNvbXBsZXRpb24gb2YgYSB0aHVtYm5haWwgcmVhZCBieSBjYWxsaW5nIHRoZWlyCisgICAgICogdGh1bWJuYWlsQ29tcGxldGUgbWV0aG9kIG9mIHJlZ2lzdGVyZWQgSUlPV3JpdGVQcm9ncmVzc0xpc3RlbmVycy4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVGh1bWJuYWlsQ29tcGxldGUoKSB7CiAgICAgICAgIGlmIChwcm9ncmVzc0xpc3RlbmVycyAhPSBudWxsKSB7CkBAIC03MzAsMTEgKzc2NCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgY3VycmVudCBwZXJjZW50YWdlIG9mIHRodW1ibmFpbCBjb21wbGV0aW9uIAotICAgICAqIGJ5IGNhbGxpbmcgdGhlaXIgdGh1bWJuYWlsUHJvZ3Jlc3MgbWV0aG9kIG9mIHJlZ2lzdGVyZWQgCi0gICAgICogSUlPV3JpdGVQcm9ncmVzc0xpc3RlbmVycy4KKyAgICAgKiBQcm9jZXNzZXMgdGhlIGN1cnJlbnQgcGVyY2VudGFnZSBvZiB0aHVtYm5haWwgY29tcGxldGlvbiBieSBjYWxsaW5nIHRoZWlyCisgICAgICogdGh1bWJuYWlsUHJvZ3Jlc3MgbWV0aG9kIG9mIHJlZ2lzdGVyZWQgSUlPV3JpdGVQcm9ncmVzc0xpc3RlbmVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGVyY2VudGFnZURvbmUgdGhlIHBlcmNlbnRhZ2UgZG9uZS4KKyAgICAgKiBAcGFyYW0gcGVyY2VudGFnZURvbmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwZXJjZW50YWdlIGRvbmUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1RodW1ibmFpbFByb2dyZXNzKGZsb2F0IHBlcmNlbnRhZ2VEb25lKSB7CiAgICAgICAgIGlmIChwcm9ncmVzc0xpc3RlbmVycyAhPSBudWxsKSB7CkBAIC03NDUsMTEgKzc3OSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgc3RhcnQgb2YgYSB0aHVtYm5haWwgcmVhZCBieSBjYWxsaW5nIAotICAgICAqIHRodW1ibmFpbFN0YXJ0ZWQgbWV0aG9kIG9mIHJlZ2lzdGVyZWQgSUlPV3JpdGVQcm9ncmVzc0xpc3RlbmVycy4gCisgICAgICogUHJvY2Vzc2VzIHRoZSBzdGFydCBvZiBhIHRodW1ibmFpbCByZWFkIGJ5IGNhbGxpbmcgdGh1bWJuYWlsU3RhcnRlZAorICAgICAqIG1ldGhvZCBvZiByZWdpc3RlcmVkIElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlIGluZGV4LgotICAgICAqIEBwYXJhbSB0aHVtYm5haWxJbmRleCB0aGUgdGh1bWJuYWlsIGluZGV4LgorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgaW5kZXguCisgICAgICogQHBhcmFtIHRodW1ibmFpbEluZGV4CisgICAgICogICAgICAgICAgICB0aGUgdGh1bWJuYWlsIGluZGV4LgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NUaHVtYm5haWxTdGFydGVkKGludCBpbWFnZUluZGV4LCBpbnQgdGh1bWJuYWlsSW5kZXgpIHsKICAgICAgICAgaWYgKHByb2dyZXNzTGlzdGVuZXJzICE9IG51bGwpIHsKQEAgLTc2MCw3ICs3OTYsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGF0IHRoZSB3cml0aW5nIGhhcyBiZWVuIGFib3J0ZWQgYnkgY2FsbGluZyB3cml0ZUFib3J0ZWQgCisgICAgICogUHJvY2Vzc2VzIHRoYXQgdGhlIHdyaXRpbmcgaGFzIGJlZW4gYWJvcnRlZCBieSBjYWxsaW5nIHdyaXRlQWJvcnRlZAogICAgICAqIG1ldGhvZCBvZiByZWdpc3RlcmVkIElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lcnMuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1dyaXRlQWJvcnRlZCgpIHsKQEAgLTc4OSw4ICs4MjUsOCBAQAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBJSU9Xcml0ZVByb2dyZXNzTGlzdGVuZXIgbGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSByZWdpc3RlcmVkIElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lciAKLSAgICAgKiB0byBiZSByZW1vdmVkLgorICAgICAqIEBwYXJhbSBsaXN0ZW5lcgorICAgICAqICAgICAgICAgICAgdGhlIHJlZ2lzdGVyZWQgSUlPV3JpdGVQcm9ncmVzc0xpc3RlbmVyIHRvIGJlIHJlbW92ZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlSUlPV3JpdGVQcm9ncmVzc0xpc3RlbmVyKElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICBpZiAocHJvZ3Jlc3NMaXN0ZW5lcnMgIT0gbnVsbCAmJiBsaXN0ZW5lciAhPSBudWxsKSB7CkBAIC04MDMsOCArODM5LDggQEAKICAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgSUlPV3JpdGVXYXJuaW5nTGlzdGVuZXIgbGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSByZWdpc3RlcmVkIElJT1dyaXRlV2FybmluZ0xpc3RlbmVyIGxpc3RlbmVyCi0gICAgICogdG8gYmUgcmVtb3ZlZC4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWdpc3RlcmVkIElJT1dyaXRlV2FybmluZ0xpc3RlbmVyIGxpc3RlbmVyIHRvIGJlIHJlbW92ZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlSUlPV3JpdGVXYXJuaW5nTGlzdGVuZXIoSUlPV3JpdGVXYXJuaW5nTGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgaWYgKHdhcm5pbmdMaXN0ZW5lcnMgPT0gbnVsbCB8fCBsaXN0ZW5lciA9PSBudWxsKSB7CkBAIC04MjYsOSArODYyLDEwIEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhlIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UncyBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlJ3MgaW5kZXguCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUltYWdlKGludCBpbWFnZUluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB1bnN1cHBvcnRlZE9wZXJhdGlvbigpOwpAQCAtODM3LDM2ICs4NzQsNDIgQEAKICAgICAvKioKICAgICAgKiBSZXBsYWNlcyBpbWFnZSBtZXRhZGF0YSBvZiB0aGUgaW1hZ2Ugd2l0aCBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlJ3MgaW5kZXguCi0gICAgICogQHBhcmFtIGltYWdlTWV0YWRhdGEgdGhlIGltYWdlIG1ldGFkYXRhLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UncyBpbmRleC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VNZXRhZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIG1ldGFkYXRhLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXBsYWNlSW1hZ2VNZXRhZGF0YShpbnQgaW1hZ2VJbmRleCwgSUlPTWV0YWRhdGEgaW1hZ2VNZXRhZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdW5zdXBwb3J0ZWRPcGVyYXRpb24oKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXBsYWNlcyBhIHBhcnQgb2YgYW4gaW1hZ2UgcHJlc2VudGVkIGluIHRoZSBvdXRwdXQKLSAgICAgKiB3aXRoIHRoZSBzcGVjaWZpZWQgUmVuZGVyZWRJbWFnZS4KKyAgICAgKiBSZXBsYWNlcyBhIHBhcnQgb2YgYW4gaW1hZ2UgcHJlc2VudGVkIGluIHRoZSBvdXRwdXQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogUmVuZGVyZWRJbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2UgdGhlIFJlbmRlcmVkSW1hZ2UuCi0gICAgICogQHBhcmFtIHBhcmFtIHRoZSBJbWFnZVdyaXRlUGFyYW0uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGltYWdlCisgICAgICogICAgICAgICAgICB0aGUgUmVuZGVyZWRJbWFnZS4KKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVdyaXRlUGFyYW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQaXhlbHMoUmVuZGVyZWRJbWFnZSBpbWFnZSwgSW1hZ2VXcml0ZVBhcmFtIHBhcmFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB1bnN1cHBvcnRlZE9wZXJhdGlvbigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcGxhY2VzIGEgcGFydCBvZiBhbiBpbWFnZSBwcmVzZW50ZWQgaW4gdGhlIG91dHB1dAotICAgICAqIHdpdGggdGhlIHNwZWNpZmllZCBSYXN0ZXIuCisgICAgICogUmVwbGFjZXMgYSBwYXJ0IG9mIGFuIGltYWdlIHByZXNlbnRlZCBpbiB0aGUgb3V0cHV0IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIFJhc3Rlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmFzdGVyIHRoZSBSYXN0ZXIuCi0gICAgICogQHBhcmFtIHBhcmFtIHRoZSBJbWFnZVdyaXRlUGFyYW0uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIHJhc3RlcgorICAgICAqICAgICAgICAgICAgdGhlIFJhc3Rlci4KKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVdyaXRlUGFyYW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQaXhlbHMoUmFzdGVyIHJhc3RlciwgSW1hZ2VXcml0ZVBhcmFtIHBhcmFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB1bnN1cHBvcnRlZE9wZXJhdGlvbigpOwpAQCAtODc1LDkgKzkxOCwxMCBAQAogICAgIC8qKgogICAgICAqIFJlcGxhY2VzIHRoZSBzdHJlYW0gbWV0YWRhdGEgb2YgdGhlIG91dHB1dCB3aXRoIG5ldyBJSU9NZXRhZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyZWFtTWV0YWRhdGEgdGhlIG5ldyBzdHJlYW0gbWV0YWRhdGEuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIHN0cmVhbU1ldGFkYXRhCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHN0cmVhbSBtZXRhZGF0YS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVwbGFjZVN0cmVhbU1ldGFkYXRhKElJT01ldGFkYXRhIHN0cmVhbU1ldGFkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB1bnN1cHBvcnRlZE9wZXJhdGlvbigpOwpAQCAtODg2LDcgKzkzMCw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbG9jYWxlIG9mIHRoaXMgSW1hZ2VXcml0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxvY2FsZSB0aGUgbmV3IGxvY2FsZS4KKyAgICAgKiBAcGFyYW0gbG9jYWxlCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGxvY2FsZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkgewogICAgICAgICBpZiAobG9jYWxlID09IG51bGwpIHsKQEAgLTkyNCwyNiArOTY5LDMxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zZXJ0cyBpbWFnZSBpbnRvIGV4aXN0aW5nIG91dHB1dCBzdHJlYW0uIAorICAgICAqIEluc2VydHMgaW1hZ2UgaW50byBleGlzdGluZyBvdXRwdXQgc3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSBpbmRleCB3aGVyZSBhbiBpbWFnZSB3aWxsIGJlIHdyaXR0ZW4uCi0gICAgICogQHBhcmFtIGltYWdlIHRoZSBzcGVjaWZpZWQgaW1hZ2UgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIEltYWdlV3JpdGVQYXJhbSwgb3IgbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGluZGV4IHdoZXJlIGFuIGltYWdlIHdpbGwgYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgaW1hZ2UgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVdyaXRlUGFyYW0sIG9yIG51bGwuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlSW5zZXJ0KGludCBpbWFnZUluZGV4LCBJSU9JbWFnZSBpbWFnZSwgSW1hZ2VXcml0ZVBhcmFtIHBhcmFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHdyaXRlSW5zZXJ0KGludCBpbWFnZUluZGV4LCBJSU9JbWFnZSBpbWFnZSwgSW1hZ2VXcml0ZVBhcmFtIHBhcmFtKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdW5zdXBwb3J0ZWRPcGVyYXRpb24oKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBpbWFnZSB0byB0aGUgc2VxdWVuY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlIHRoZSBpbWFnZSB0byBiZSB3cml0dGVuLgotICAgICAqIEBwYXJhbSBwYXJhbSB0aGUgSW1hZ2VXcml0ZVBhcmFtLCBvciBudWxsLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkIAotICAgICAqIGR1cmluZyB3cml0dGluZy4KKyAgICAgKiBAcGFyYW0gaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byBiZSB3cml0dGVuLgorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlV3JpdGVQYXJhbSwgb3IgbnVsbC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgZHVyaW5nIHdyaXRpbmcuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVUb1NlcXVlbmNlKElJT0ltYWdlIGltYWdlLCBJbWFnZVdyaXRlUGFyYW0gcGFyYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHVuc3VwcG9ydGVkT3BlcmF0aW9uKCk7CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9ldmVudC9JSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lci5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvSUlPUmVhZFByb2dyZXNzTGlzdGVuZXIuamF2YQppbmRleCAzZDY1ODA3Li4yOTQ0ODk2IDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9ldmVudC9JSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lci5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL2V2ZW50L0lJT1JlYWRQcm9ncmVzc0xpc3RlbmVyLmphdmEKQEAgLTE4LDg2ICsxOCwxMDQgQEAKICAqIEBhdXRob3IgU2VyZ2V5IEkuIFNhbGlzaGV2CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvLmV2ZW50OwogCiBpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CiBpbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZVJlYWRlcjsKIAogLyoqCi0gKiBUaGUgSUlPUmVhZFByb2dyZXNzTGlzdGVuZXIgaW50ZXJmYWNlIG5vdGlmaWVzIGNhbGxlcnMgCi0gKiBhYm91dCB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIGltYWdlIGFuZCB0aHVtYm5haWwgcmVhZGluZyBtZXRob2RzLgorICogVGhlIElJT1JlYWRQcm9ncmVzc0xpc3RlbmVyIGludGVyZmFjZSBub3RpZmllcyBjYWxsZXJzIGFib3V0IHRoZSBwcm9ncmVzcyBvZgorICogdGhlIGltYWdlIGFuZCB0aHVtYm5haWwgcmVhZGluZyBtZXRob2RzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCiAgICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IHRoZSBpbWFnZSByZWFkaW5nIGhhcyBiZWVuIGNvbXBsZXRlZC4gCisgICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IHRoZSBpbWFnZSByZWFkaW5nIGhhcyBiZWVuIGNvbXBsZXRlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KICAgICAgKi8KICAgICB2b2lkIGltYWdlQ29tcGxldGUoSW1hZ2VSZWFkZXIgc291cmNlKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgYWJvdXQgdGhlIGRlZ3JlZSBvZiBjb21wbGV0aW9uIG9mIHRoZSByZWFkIGNhbGwuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgotICAgICAqIEBwYXJhbSBwZXJjZW50YWdlRG9uZSB0aGUgcGVyY2VudGFnZSBvZiBkZWNvZGluZyBkb25lLgorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCisgICAgICogQHBhcmFtIHBlcmNlbnRhZ2VEb25lCisgICAgICogICAgICAgICAgICB0aGUgcGVyY2VudGFnZSBvZiBkZWNvZGluZyBkb25lLgogICAgICAqLwogICAgIHZvaWQgaW1hZ2VQcm9ncmVzcyhJbWFnZVJlYWRlciBzb3VyY2UsIGZsb2F0IHBlcmNlbnRhZ2VEb25lKTsKLSAgICAKKwogICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCBhbiBpbWFnZSByZWFkIG9wZXJhdGlvbiBoYXMgYmVlbiBzdGFydGVkLiAKKyAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgYW4gaW1hZ2UgcmVhZCBvcGVyYXRpb24gaGFzIGJlZW4gc3RhcnRlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGluZGV4IG9mIHRoZSBpbWFnZSBpbiBhbiBpbnB1dCBmaWxlIG9yIAotICAgICAqIHN0cmVhbSB0byBiZSByZWFkLgorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgaW1hZ2UgaW4gYW4gaW5wdXQgZmlsZSBvciBzdHJlYW0gdG8gYmUgcmVhZC4KICAgICAgKi8KICAgICB2b2lkIGltYWdlU3RhcnRlZChJbWFnZVJlYWRlciBzb3VyY2UsIGludCBpbWFnZUluZGV4KTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCBhIHJlYWQgb3BlcmF0aW9uIGhhcyBiZWVuIGFib3J0ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCiAgICAgICovCiAgICAgdm9pZCByZWFkQWJvcnRlZChJbWFnZVJlYWRlciBzb3VyY2UpOwotICAgIAorCiAgICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IGEgc2VxdWVuY2Ugb2YgcmVhZCBvcGVyYXRpb25zIGhhcyBiZWVuIGNvbXBsZXRlZC4gCisgICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IGEgc2VxdWVuY2Ugb2YgcmVhZCBvcGVyYXRpb25zIGhhcyBiZWVuCisgICAgICogY29tcGxldGVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgogICAgICAqLwogICAgIHZvaWQgc2VxdWVuY2VDb21wbGV0ZShJbWFnZVJlYWRlciBzb3VyY2UpOwotICAgIAorCiAgICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IGEgc2VxdWVuY2Ugb2YgcmVhZCBvcGVyYXRpb24gaGFzIGJlZW4gc3RhcnRlZC4gCisgICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IGEgc2VxdWVuY2Ugb2YgcmVhZCBvcGVyYXRpb24gaGFzIGJlZW4KKyAgICAgKiBzdGFydGVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KLSAgICAgKiBAcGFyYW0gbWluSW5kZXggdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpbWFnZSB0byBiZSByZWFkLgorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCisgICAgICogQHBhcmFtIG1pbkluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGltYWdlIHRvIGJlIHJlYWQuCiAgICAgICovCiAgICAgdm9pZCBzZXF1ZW5jZVN0YXJ0ZWQoSW1hZ2VSZWFkZXIgc291cmNlLCBpbnQgbWluSW5kZXgpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogTm90aWZpZXMgdGhhdCBhIHRodW1ibmFpbCByZWFkIG9wZXJhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCiAgICAgICovCiAgICAgdm9pZCB0aHVtYm5haWxDb21wbGV0ZShJbWFnZVJlYWRlciBzb3VyY2UpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciBhYm91dCB0aGUgZGVncmVlIG9mIGNvbXBsZXRpb24gb2YgdGhlIHJlYWQgY2FsbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCi0gICAgICogQHBhcmFtIHBlcmNlbnRhZ2VEb25lIHRoZSBwZXJjZW50YWdlIG9mIGRlY29kaW5nIGRvbmUuCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gcGVyY2VudGFnZURvbmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwZXJjZW50YWdlIG9mIGRlY29kaW5nIGRvbmUuCiAgICAgICovCiAgICAgdm9pZCB0aHVtYm5haWxQcm9ncmVzcyhJbWFnZVJlYWRlciBzb3VyY2UsIGZsb2F0IHBlcmNlbnRhZ2VEb25lKTsKLSAgICAKKwogICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCBhIHRodW1ibmFpbCByZWFkaW5nIG9wZXJhdGlvbiBoYXMgYmVlbiBzdGFydGVkLiAKKyAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgYSB0aHVtYm5haWwgcmVhZGluZyBvcGVyYXRpb24gaGFzIGJlZW4KKyAgICAgKiBzdGFydGVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW5kZXggb2YgdGhlIGltYWdlIGluIGFuIGlucHV0IGZpbGUgb3IgCi0gICAgICogc3RyZWFtIHRvIGJlIHJlYWQuCi0gICAgICogQHBhcmFtIHRodW1ibmFpbEluZGV4IHRoZSBpbmRleCBvZiB0aGUgdGh1bWJuYWlsIHRvIGJlIHJlYWQuCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBpbWFnZSBpbiBhbiBpbnB1dCBmaWxlIG9yIHN0cmVhbSB0byBiZSByZWFkLgorICAgICAqIEBwYXJhbSB0aHVtYm5haWxJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSB0aHVtYm5haWwgdG8gYmUgcmVhZC4KICAgICAgKi8KICAgICB2b2lkIHRodW1ibmFpbFN0YXJ0ZWQoSW1hZ2VSZWFkZXIgc291cmNlLCBpbnQgaW1hZ2VJbmRleCwgaW50IHRodW1ibmFpbEluZGV4KTsKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvSUlPUmVhZFVwZGF0ZUxpc3RlbmVyLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9ldmVudC9JSU9SZWFkVXBkYXRlTGlzdGVuZXIuamF2YQppbmRleCBjZTVlMmYxLi40OWJkYmNiIDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9ldmVudC9JSU9SZWFkVXBkYXRlTGlzdGVuZXIuamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9ldmVudC9JSU9SZWFkVXBkYXRlTGlzdGVuZXIuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBTZXJnZXkgSS4gU2FsaXNoZXYKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW8uZXZlbnQ7CiAKIGltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOwpAQCAtMzAsMTA5ICszMSwxNTIgQEAKICAqLwogCiAvKioKLSAqIFRoZSBJSU9SZWFkVXBkYXRlTGlzdGVuZXIgaW50ZXJmYWNlIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgCi0gKiB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBwaXhlbCB1cGRhdGVzIGR1cmluZyBpbWFnZSBhbmQgdGh1bWJuYWlsIAotICogcmVhZGluZyBvcGVyYXRpb25zLgorICogVGhlIElJT1JlYWRVcGRhdGVMaXN0ZW5lciBpbnRlcmZhY2UgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSB0byByZWNlaXZlCisgKiBub3RpZmljYXRpb24gb2YgcGl4ZWwgdXBkYXRlcyBkdXJpbmcgaW1hZ2UgYW5kIHRodW1ibmFpbCByZWFkaW5nIG9wZXJhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElJT1JlYWRVcGRhdGVMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCiAgICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IHRoZSBzcGVjaWZpZWQgYXJlYSBvZiB0aGUgaW1hZ2UgaGFzIGJlZW4gdXBkYXRlZC4gCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgotICAgICAqIEBwYXJhbSB0aGVJbWFnZSB0aGUgaW1hZ2UgdG8gYmUgdXBkYXRlZC4KLSAgICAgKiBAcGFyYW0gbWluWCB0aGUgbWluaW11bSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVscyBpbiB0aGUgdXBkYXRlZCBhcmVhLgotICAgICAqIEBwYXJhbSBtaW5ZIHRoZSBtaW5pbXVtIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWxzIGluIHRoZSB1cGRhdGVkIGFyZWEuCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB1cGRhdGVkIGFyZWEuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHVwZGF0ZWQgYXJlYS4KLSAgICAgKiBAcGFyYW0gcGVyaW9kWCB0aGUgaG9yaXpvbnRhbCBzcGFjaW5nIHBlcmlvZCBiZXR3ZWVuIHVwZGF0ZWQgCi0gICAgICogcGl4ZWxzLCBpZiBpdCBlcXVhbHMgMSwgdGhlcmUgaXMgbm8gc3BhY2UgYmV0d2VlbiBwaXhlbHMuIAotICAgICAqIEBwYXJhbSBwZXJpb2RZIHRoZSB2ZXJ0aWNhbCBzcGFjaW5nIHBlcmlvZCBiZXR3ZWVuIHVwZGF0ZWQgCi0gICAgICogcGl4ZWxzLCBpZiBpdCBlcXVhbHMgMSwgdGhlcmUgaXMgbm8gc3BhY2UgYmV0d2VlbiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGJhbmRzIHRoZSBhcnJheSBvZiBpbnQgdmFsdWVzIGluZGljYXRpbmcgdGhlIGJhbmRzIGJlaW5nIHVwZGF0ZWQuCi0gICAgICovCi0gICAgdm9pZCBpbWFnZVVwZGF0ZShJbWFnZVJlYWRlciBzb3VyY2UsIEJ1ZmZlcmVkSW1hZ2UgdGhlSW1hZ2UsIGludCBtaW5YLAotICAgICAgICAgICAgaW50IG1pblksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHBlcmlvZFgsIGludCBwZXJpb2RZLAotICAgICAgICAgICAgaW50W10gYmFuZHMpOwotICAgIAotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCB0aGUgY3VycmVudCByZWFkIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkIGEgCi0gICAgICogcHJvZ3Jlc3NpdmUgcGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCi0gICAgICogQHBhcmFtIHRoZUltYWdlIHRoZSBpbWFnZSB0byBiZSB1cGRhdGVkLgotICAgICAqLwotICAgIHZvaWQgcGFzc0NvbXBsZXRlKEltYWdlUmVhZGVyIHNvdXJjZSwgQnVmZmVyZWRJbWFnZSB0aGVJbWFnZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IHRoZSBjdXJyZW50IHJlYWQgb3BlcmF0aW9uIGhhcyBiZWd1biAKLSAgICAgKiBhIHByb2dyZXNzaXZlIHBhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgotICAgICAqIEBwYXJhbSB0aGVJbWFnZSB0aGUgaW1hZ2UgdG8gYmUgdXBkYXRlZC4KLSAgICAgKiBAcGFyYW0gcGFzcyB0aGUgbnVtZXIgb2YgdGhlIHBhc3MuCi0gICAgICogQHBhcmFtIG1pblBhc3MgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBwYXNzIHRoYXQgd2lsbCBiZSBkZWNvZGVkLgotICAgICAqIEBwYXJhbSBtYXhQYXNzIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBwYXNzIHRoYXQgd2lsbCBiZSBkZWNvZGVkLgotICAgICAqIEBwYXJhbSBtaW5YIHRoZSBtaW5pbXVtIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWxzIGluIHRoZSB1cGRhdGVkIGFyZWEuCi0gICAgICogQHBhcmFtIG1pblkgdGhlIG1pbmltdW0gWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbHMgaW4gdGhlIHVwZGF0ZWQgYXJlYS4KLSAgICAgKiBAcGFyYW0gcGVyaW9kWCB0aGUgaG9yaXpvbnRhbCBzcGFjaW5nIHBlcmlvZCBiZXR3ZWVuIHVwZGF0ZWQgCi0gICAgICogcGl4ZWxzLCBpZiBpdCBlcXVhbHMgMSwgdGhlcmUgaXMgbm8gc3BhY2UgYmV0d2VlbiBwaXhlbHMuIAotICAgICAgKiBAcGFyYW0gcGVyaW9kWSB0aGUgdmVydGljYWwgc3BhY2luZyBwZXJpb2QgYmV0d2VlbiB1cGRhdGVkIAotICAgICAqIHBpeGVscywgaWYgaXQgZXF1YWxzIDEsIHRoZXJlIGlzIG5vIHNwYWNlIGJldHdlZW4gcGl4ZWxzLgotICAgICAqIEBwYXJhbSBiYW5kcyB0aGUgYXJyYXkgb2YgaW50IHZhbHVlcyBpbmRpY2F0aW5nIHRoZSBiYW5kcyBiZWluZyB1cGRhdGVkLgotICAgICAqLwotICAgIHZvaWQgcGFzc1N0YXJ0ZWQoSW1hZ2VSZWFkZXIgc291cmNlLCBCdWZmZXJlZEltYWdlIHRoZUltYWdlLCBpbnQgcGFzcywKLSAgICAgICAgICAgIGludCBtaW5QYXNzLCBpbnQgbWF4UGFzcywgaW50IG1pblgsIGludCBtaW5ZLCBpbnQgcGVyaW9kWCwKLSAgICAgICAgICAgIGludCBwZXJpb2RZLCBpbnRbXSBiYW5kcyk7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgdGhlIGN1cnJlbnQgdGh1bWJuYWlsIHJlYWQgb3BlcmF0aW9uIGhhcyAgCi0gICAgICogY29tcGxldGVkIGEgcHJvZ3Jlc3NpdmUgcGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCi0gICAgICogQHBhcmFtIHRoZUltYWdlIHRoZSB0aHVtYm5haWwgdG8gYmUgdXBkYXRlZC4KLSAgICAgKi8KLSAgICB2b2lkIHRodW1ibmFpbFBhc3NDb21wbGV0ZShJbWFnZVJlYWRlciBzb3VyY2UsIEJ1ZmZlcmVkSW1hZ2UgdGhlSW1hZ2UpOwotICAgIAotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCB0aGUgY3VycmVudCB0aHVtYm5haWwgcmVhZCBvcGVyYXRpb24gaGFzICAKLSAgICAgKiBiZWd1biBhIHByb2dyZXNzaXZlIHBhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgotICAgICAqIEBwYXJhbSB0aGVUaHVtYm5haWwgdGhlIHRodW1ibmFpbCB0byBiZSB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBwYXNzIHRoZSBudW1lciBvZiB0aGUgcGFzcy4KLSAgICAgKiBAcGFyYW0gbWluUGFzcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHBhc3MgdGhhdCB3aWxsIGJlIGRlY29kZWQuCi0gICAgICogQHBhcmFtIG1heFBhc3MgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHBhc3MgdGhhdCB3aWxsIGJlIGRlY29kZWQuCi0gICAgICogQHBhcmFtIG1pblggdGhlIG1pbmltdW0gWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbHMgaW4gdGhlIHVwZGF0ZWQgYXJlYS4KLSAgICAgKiBAcGFyYW0gbWluWSB0aGUgbWluaW11bSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVscyBpbiB0aGUgdXBkYXRlZCBhcmVhLgotICAgICAqIEBwYXJhbSBwZXJpb2RYIHRoZSBob3Jpem9udGFsIHNwYWNpbmcgcGVyaW9kIGJldHdlZW4gdXBkYXRlZCAKLSAgICAgKiBwaXhlbHMsIGlmIGl0IGVxdWFscyAxLCB0aGVyZSBpcyBubyBzcGFjZSBiZXR3ZWVuIHBpeGVscy4gCi0gICAgICogQHBhcmFtIHBlcmlvZFkgdGhlIHZlcnRpY2FsIHNwYWNpbmcgcGVyaW9kIGJldHdlZW4gdXBkYXRlZCAKLSAgICAgKiBwaXhlbHMsIGlmIGl0IGVxdWFscyAxLCB0aGVyZSBpcyBubyBzcGFjZSBiZXR3ZWVuIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gYmFuZHMgdGhlIGFycmF5IG9mIGludCB2YWx1ZXMgaW5kaWNhdGluZyB0aGUgYmFuZHMgYmVpbmcgdXBkYXRlZC4KLSAgICAgKi8KLSAgICB2b2lkIHRodW1ibmFpbFBhc3NTdGFydGVkKEltYWdlUmVhZGVyIHNvdXJjZSwgQnVmZmVyZWRJbWFnZSB0aGVUaHVtYm5haWwsCi0gICAgICAgICAgICBpbnQgcGFzcywgaW50IG1pblBhc3MsIGludCBtYXhQYXNzLCBpbnQgbWluWCwgaW50IG1pblksCi0gICAgICAgICAgICBpbnQgcGVyaW9kWCwgaW50IHBlcmlvZFksIGludFtdIGJhbmRzKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgYSBzcGVjaWZpZWQgYXJlYSBvZiBhIHRodW1ibmFpbCBpbWFnZSBoYXMgYmVlbiAKKyAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgdGhlIHNwZWNpZmllZCBhcmVhIG9mIHRoZSBpbWFnZSBoYXMgYmVlbgogICAgICAqIHVwZGF0ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgotICAgICAqIEBwYXJhbSB0aGVUaHVtYm5haWwgdGhlIHRodW1ibmFpbCB0byBiZSB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBtaW5YIHRoZSBtaW5pbXVtIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWxzIGluIHRoZSB1cGRhdGVkIGFyZWEuCi0gICAgICogQHBhcmFtIG1pblkgdGhlIG1pbmltdW0gWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbHMgaW4gdGhlIHVwZGF0ZWQgYXJlYS4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHVwZGF0ZWQgYXJlYS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdXBkYXRlZCBhcmVhLgotICAgICAqIEBwYXJhbSBwZXJpb2RYIHRoZSBob3Jpem9udGFsIHNwYWNpbmcgcGVyaW9kIGJldHdlZW4gdXBkYXRlZCAKLSAgICAgKiBwaXhlbHMsIGlmIGl0IGVxdWFscyAxLCB0aGVyZSBpcyBubyBzcGFjZSBiZXR3ZWVuIHBpeGVscy4gCi0gICAgICogQHBhcmFtIHBlcmlvZFkgdGhlIHZlcnRpY2FsIHNwYWNpbmcgcGVyaW9kIGJldHdlZW4gdXBkYXRlZCAKLSAgICAgKiBwaXhlbHMsIGlmIGl0IGVxdWFscyAxLCB0aGVyZSBpcyBubyBzcGFjZSBiZXR3ZWVuIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gYmFuZHMgdGhlIGFycmF5IG9mIGludCB2YWx1ZXMgaW5kaWNhdGluZyB0aGUgYmFuZHMgYmVpbmcgdXBkYXRlZC4KKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSB0aGVJbWFnZQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIHRvIGJlIHVwZGF0ZWQuCisgICAgICogQHBhcmFtIG1pblgKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWxzIGluIHRoZSB1cGRhdGVkIGFyZWEuCisgICAgICogQHBhcmFtIG1pblkKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWxzIGluIHRoZSB1cGRhdGVkIGFyZWEuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdXBkYXRlZCBhcmVhLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdXBkYXRlZCBhcmVhLgorICAgICAqIEBwYXJhbSBwZXJpb2RYCisgICAgICogICAgICAgICAgICB0aGUgaG9yaXpvbnRhbCBzcGFjaW5nIHBlcmlvZCBiZXR3ZWVuIHVwZGF0ZWQgcGl4ZWxzLCBpZiBpdAorICAgICAqICAgICAgICAgICAgZXF1YWxzIDEsIHRoZXJlIGlzIG5vIHNwYWNlIGJldHdlZW4gcGl4ZWxzLgorICAgICAqIEBwYXJhbSBwZXJpb2RZCisgICAgICogICAgICAgICAgICB0aGUgdmVydGljYWwgc3BhY2luZyBwZXJpb2QgYmV0d2VlbiB1cGRhdGVkIHBpeGVscywgaWYgaXQKKyAgICAgKiAgICAgICAgICAgIGVxdWFscyAxLCB0aGVyZSBpcyBubyBzcGFjZSBiZXR3ZWVuIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gYmFuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBpbnRlZ2VyIHZhbHVlcyBpbmRpY2F0aW5nIHRoZSBiYW5kcyBiZWluZworICAgICAqICAgICAgICAgICAgdXBkYXRlZC4KICAgICAgKi8KLSAgICB2b2lkIHRodW1ibmFpbFVwZGF0ZShJbWFnZVJlYWRlciBzb3VyY2UsIEJ1ZmZlcmVkSW1hZ2UgdGhlVGh1bWJuYWlsLAotICAgICAgICAgICAgaW50IG1pblgsIGludCBtaW5ZLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwZXJpb2RYLAotICAgICAgICAgICAgaW50IHBlcmlvZFksIGludFtdIGJhbmRzKTsKLX0KKyAgICB2b2lkIGltYWdlVXBkYXRlKEltYWdlUmVhZGVyIHNvdXJjZSwgQnVmZmVyZWRJbWFnZSB0aGVJbWFnZSwgaW50IG1pblgsIGludCBtaW5ZLCBpbnQgd2lkdGgsCisgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgcGVyaW9kWCwgaW50IHBlcmlvZFksIGludFtdIGJhbmRzKTsKIAorICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCB0aGUgY3VycmVudCByZWFkIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkIGEKKyAgICAgKiBwcm9ncmVzc2l2ZSBwYXNzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCisgICAgICogQHBhcmFtIHRoZUltYWdlCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgdG8gYmUgdXBkYXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIHBhc3NDb21wbGV0ZShJbWFnZVJlYWRlciBzb3VyY2UsIEJ1ZmZlcmVkSW1hZ2UgdGhlSW1hZ2UpOworCisgICAgLyoqCisgICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IHRoZSBjdXJyZW50IHJlYWQgb3BlcmF0aW9uIGhhcyBiZWd1biBhCisgICAgICogcHJvZ3Jlc3NpdmUgcGFzcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSB0aGVJbWFnZQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIHRvIGJlIHVwZGF0ZWQuCisgICAgICogQHBhcmFtIHBhc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgdGhlIHBhc3MuCisgICAgICogQHBhcmFtIG1pblBhc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgcGFzcyB0aGF0IHdpbGwgYmUgZGVjb2RlZC4KKyAgICAgKiBAcGFyYW0gbWF4UGFzcworICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHBhc3MgdGhhdCB3aWxsIGJlIGRlY29kZWQuCisgICAgICogQHBhcmFtIG1pblgKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWxzIGluIHRoZSB1cGRhdGVkIGFyZWEuCisgICAgICogQHBhcmFtIG1pblkKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWxzIGluIHRoZSB1cGRhdGVkIGFyZWEuCisgICAgICogQHBhcmFtIHBlcmlvZFgKKyAgICAgKiAgICAgICAgICAgIHRoZSBob3Jpem9udGFsIHNwYWNpbmcgcGVyaW9kIGJldHdlZW4gdXBkYXRlZCBwaXhlbHMsIGlmIGl0CisgICAgICogICAgICAgICAgICBlcXVhbHMgMSwgdGhlcmUgaXMgbm8gc3BhY2UgYmV0d2VlbiBwaXhlbHMuCisgICAgICogQHBhcmFtIHBlcmlvZFkKKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZXJ0aWNhbCBzcGFjaW5nIHBlcmlvZCBiZXR3ZWVuIHVwZGF0ZWQgcGl4ZWxzLCBpZiBpdAorICAgICAqICAgICAgICAgICAgZXF1YWxzIDEsIHRoZXJlIGlzIG5vIHNwYWNlIGJldHdlZW4gcGl4ZWxzLgorICAgICAqIEBwYXJhbSBiYW5kcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGludGVnZXIgdmFsdWVzIGluZGljYXRpbmcgdGhlIGJhbmRzIGJlaW5nCisgICAgICogICAgICAgICAgICB1cGRhdGVkLgorICAgICAqLworICAgIHZvaWQgcGFzc1N0YXJ0ZWQoSW1hZ2VSZWFkZXIgc291cmNlLCBCdWZmZXJlZEltYWdlIHRoZUltYWdlLCBpbnQgcGFzcywgaW50IG1pblBhc3MsCisgICAgICAgICAgICBpbnQgbWF4UGFzcywgaW50IG1pblgsIGludCBtaW5ZLCBpbnQgcGVyaW9kWCwgaW50IHBlcmlvZFksIGludFtdIGJhbmRzKTsKKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCB0aGUgY3VycmVudCB0aHVtYm5haWwgcmVhZCBvcGVyYXRpb24gaGFzCisgICAgICogY29tcGxldGVkIGEgcHJvZ3Jlc3NpdmUgcGFzcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSB0aGVJbWFnZQorICAgICAqICAgICAgICAgICAgdGhlIHRodW1ibmFpbCB0byBiZSB1cGRhdGVkLgorICAgICAqLworICAgIHZvaWQgdGh1bWJuYWlsUGFzc0NvbXBsZXRlKEltYWdlUmVhZGVyIHNvdXJjZSwgQnVmZmVyZWRJbWFnZSB0aGVJbWFnZSk7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgdGhlIGN1cnJlbnQgdGh1bWJuYWlsIHJlYWQgb3BlcmF0aW9uIGhhcworICAgICAqIGJlZ3VuIGEgcHJvZ3Jlc3NpdmUgcGFzcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSB0aGVUaHVtYm5haWwKKyAgICAgKiAgICAgICAgICAgIHRoZSB0aHVtYm5haWwgdG8gYmUgdXBkYXRlZC4KKyAgICAgKiBAcGFyYW0gcGFzcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiB0aGUgcGFzcy4KKyAgICAgKiBAcGFyYW0gbWluUGFzcworICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBwYXNzIHRoYXQgd2lsbCBiZSBkZWNvZGVkLgorICAgICAqIEBwYXJhbSBtYXhQYXNzCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGxhc3QgcGFzcyB0aGF0IHdpbGwgYmUgZGVjb2RlZC4KKyAgICAgKiBAcGFyYW0gbWluWAorICAgICAqICAgICAgICAgICAgdGhlIG1pbmltdW0gWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbHMgaW4gdGhlIHVwZGF0ZWQgYXJlYS4KKyAgICAgKiBAcGFyYW0gbWluWQorICAgICAqICAgICAgICAgICAgdGhlIG1pbmltdW0gWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbHMgaW4gdGhlIHVwZGF0ZWQgYXJlYS4KKyAgICAgKiBAcGFyYW0gcGVyaW9kWAorICAgICAqICAgICAgICAgICAgdGhlIGhvcml6b250YWwgc3BhY2luZyBwZXJpb2QgYmV0d2VlbiB1cGRhdGVkIHBpeGVscywgaWYgaXQKKyAgICAgKiAgICAgICAgICAgIGVxdWFscyAxLCB0aGVyZSBpcyBubyBzcGFjZSBiZXR3ZWVuIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gcGVyaW9kWQorICAgICAqICAgICAgICAgICAgdGhlIHZlcnRpY2FsIHNwYWNpbmcgcGVyaW9kIGJldHdlZW4gdXBkYXRlZCBwaXhlbHMsIGlmIGl0CisgICAgICogICAgICAgICAgICBlcXVhbHMgMSwgdGhlcmUgaXMgbm8gc3BhY2UgYmV0d2VlbiBwaXhlbHMuCisgICAgICogQHBhcmFtIGJhbmRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgaW50ZWdlciB2YWx1ZXMgaW5kaWNhdGluZyB0aGUgYmFuZHMgYmVpbmcKKyAgICAgKiAgICAgICAgICAgIHVwZGF0ZWQuCisgICAgICovCisgICAgdm9pZCB0aHVtYm5haWxQYXNzU3RhcnRlZChJbWFnZVJlYWRlciBzb3VyY2UsIEJ1ZmZlcmVkSW1hZ2UgdGhlVGh1bWJuYWlsLCBpbnQgcGFzcywKKyAgICAgICAgICAgIGludCBtaW5QYXNzLCBpbnQgbWF4UGFzcywgaW50IG1pblgsIGludCBtaW5ZLCBpbnQgcGVyaW9kWCwgaW50IHBlcmlvZFksIGludFtdIGJhbmRzKTsKKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCBhIHNwZWNpZmllZCBhcmVhIG9mIGEgdGh1bWJuYWlsIGltYWdlIGhhcworICAgICAqIGJlZW4gdXBkYXRlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSB0aGVUaHVtYm5haWwKKyAgICAgKiAgICAgICAgICAgIHRoZSB0aHVtYm5haWwgdG8gYmUgdXBkYXRlZC4KKyAgICAgKiBAcGFyYW0gbWluWAorICAgICAqICAgICAgICAgICAgdGhlIG1pbmltdW0gWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbHMgaW4gdGhlIHVwZGF0ZWQgYXJlYS4KKyAgICAgKiBAcGFyYW0gbWluWQorICAgICAqICAgICAgICAgICAgdGhlIG1pbmltdW0gWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbHMgaW4gdGhlIHVwZGF0ZWQgYXJlYS4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB1cGRhdGVkIGFyZWEuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB1cGRhdGVkIGFyZWEuCisgICAgICogQHBhcmFtIHBlcmlvZFgKKyAgICAgKiAgICAgICAgICAgIHRoZSBob3Jpem9udGFsIHNwYWNpbmcgcGVyaW9kIGJldHdlZW4gdXBkYXRlZCBwaXhlbHMsIGlmIGl0CisgICAgICogICAgICAgICAgICBlcXVhbHMgMSwgdGhlcmUgaXMgbm8gc3BhY2UgYmV0d2VlbiBwaXhlbHMuCisgICAgICogQHBhcmFtIHBlcmlvZFkKKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZXJ0aWNhbCBzcGFjaW5nIHBlcmlvZCBiZXR3ZWVuIHVwZGF0ZWQgcGl4ZWxzLCBpZiBpdAorICAgICAqICAgICAgICAgICAgZXF1YWxzIDEsIHRoZXJlIGlzIG5vIHNwYWNlIGJldHdlZW4gcGl4ZWxzLgorICAgICAqIEBwYXJhbSBiYW5kcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGludGVnZXIgdmFsdWVzIGluZGljYXRpbmcgdGhlIGJhbmRzIGJlaW5nCisgICAgICogICAgICAgICAgICB1cGRhdGVkLgorICAgICAqLworICAgIHZvaWQgdGh1bWJuYWlsVXBkYXRlKEltYWdlUmVhZGVyIHNvdXJjZSwgQnVmZmVyZWRJbWFnZSB0aGVUaHVtYm5haWwsIGludCBtaW5YLCBpbnQgbWluWSwKKyAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHBlcmlvZFgsIGludCBwZXJpb2RZLCBpbnRbXSBiYW5kcyk7Cit9CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9ldmVudC9JSU9SZWFkV2FybmluZ0xpc3RlbmVyLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9ldmVudC9JSU9SZWFkV2FybmluZ0xpc3RlbmVyLmphdmEKaW5kZXggOTJmYTI3NS4uMzE4YTVkZiAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvSUlPUmVhZFdhcm5pbmdMaXN0ZW5lci5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL2V2ZW50L0lJT1JlYWRXYXJuaW5nTGlzdGVuZXIuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBTZXJnZXkgSS4gU2FsaXNoZXYKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW8uZXZlbnQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKQEAgLTI5LDE4ICszMCwyMCBAQAogICovCiAKIC8qKgotICogVGhlIElJT1JlYWRXYXJuaW5nTGlzdGVuZXIgcHJvdmlkZXMgbWV0aG9kcyB0byByZWNlaXZlIG5vdGlmaWNhdGlvbgotICogb2Ygd2FybmluZyBtZXNzYWdlcyBnZW5lcmF0ZWQgYnkgaW1hZ2UgCi0gKiBhbmQgdGh1bWJuYWlsIHJlYWRpbmcgbWV0aG9kcy4KKyAqIFRoZSBJSU9SZWFkV2FybmluZ0xpc3RlbmVyIHByb3ZpZGVzIG1ldGhvZHMgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gb2YKKyAqIHdhcm5pbmcgbWVzc2FnZXMgZ2VuZXJhdGVkIGJ5IGltYWdlIGFuZCB0aHVtYm5haWwgcmVhZGluZyBtZXRob2RzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJSU9SZWFkV2FybmluZ0xpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CiAKICAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIGFib3V0IGEgd2FybmluZyAobm9uLWZhdGFsIGVycm9yKSBkdXJpbmcgZGVjb2RpbmcuIAorICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgYWJvdXQgYSB3YXJuaW5nIChub24tZmF0YWwgZXJyb3IpIGR1cmluZyBkZWNvZGluZy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCi0gICAgICogQHBhcmFtIHdhcm5pbmcgdGhlIHN0cmluZyBkZXNjcmliaW5nIHRoZSB3YXJuaW5nLgorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCisgICAgICogQHBhcmFtIHdhcm5pbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgd2FybmluZy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nT2NjdXJyZWQoSW1hZ2VSZWFkZXIgc291cmNlLCBTdHJpbmcgd2FybmluZyk7CiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL2V2ZW50L0lJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lci5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvSUlPV3JpdGVQcm9ncmVzc0xpc3RlbmVyLmphdmEKaW5kZXggMTlhZTQ5NS4uNGEyYzU5NSAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvSUlPV3JpdGVQcm9ncmVzc0xpc3RlbmVyLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvSUlPV3JpdGVQcm9ncmVzc0xpc3RlbmVyLmphdmEKQEAgLTE4LDY5ICsxOCw4NCBAQAogICogQGF1dGhvciBSdXN0ZW0gVi4gUmFmaWtvdgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5ldmVudDsKIAogaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CiAKIC8qKgotICogVGhlIElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lciBpbnRlcmZhY2UgcHJvdmlkZXMgbWV0aG9kcyB0byAKLSAqIHJlY2VpdmUgbm90aWZpY2F0aW9uIGFib3V0IHRoZSBwcm9ncmVzcyBvZiB0aGUgaW1hZ2UgYW5kIAotICogdGh1bWJuYWlsIHdyaXRpbmcgbWV0aG9kcy4KKyAqIFRoZSBJSU9Xcml0ZVByb2dyZXNzTGlzdGVuZXIgaW50ZXJmYWNlIHByb3ZpZGVzIG1ldGhvZHMgdG8gcmVjZWl2ZQorICogbm90aWZpY2F0aW9uIGFib3V0IHRoZSBwcm9ncmVzcyBvZiB0aGUgaW1hZ2UgYW5kIHRodW1ibmFpbCB3cml0aW5nIG1ldGhvZHMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotICAgIAorCiAgICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IGFuIGltYWdlIHdyaXRlIG9wZXJhdGlvbiBoYXMgYmVlbiBzdGFydGVkLiAKKyAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgYW4gaW1hZ2Ugd3JpdGUgb3BlcmF0aW9uIGhhcyBiZWVuIHN0YXJ0ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VXcml0ZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbmRleCBvZiB0aGUgaW1hZ2UgYmVpbmcgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VXcml0ZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGltYWdlIGJlaW5nIHdyaXR0ZW4uCiAgICAgICovCiAgICAgdm9pZCBpbWFnZVN0YXJ0ZWQoSW1hZ2VXcml0ZXIgc291cmNlLCBpbnQgaW1hZ2VJbmRleCk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIGFib3V0IHRoZSBkZWdyZWUgb2YgY29tcGxldGlvbiBvZiB0aGUgd3JpdGUgY2FsbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBJbWFnZVdyaXRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCi0gICAgICogQHBhcmFtIHBlcmNlbnRhZ2VEb25lIHRoZSBwZXJjZW50YWdlIG9mIGVuY29kaW5nIGRvbmUuCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlV3JpdGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gcGVyY2VudGFnZURvbmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwZXJjZW50YWdlIG9mIGVuY29kaW5nIGRvbmUuCiAgICAgICovCiAgICAgdm9pZCBpbWFnZVByb2dyZXNzKEltYWdlV3JpdGVyIHNvdXJjZSwgZmxvYXQgcGVyY2VudGFnZURvbmUpOwotICAgIAorCiAgICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IHRoZSBpbWFnZSB3cml0aW5nIGhhcyBiZWVuIGNvbXBsZXRlZC4gCisgICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IHRoZSBpbWFnZSB3cml0aW5nIGhhcyBiZWVuIGNvbXBsZXRlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBJbWFnZVdyaXRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlV3JpdGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KICAgICAgKi8KICAgICB2b2lkIGltYWdlQ29tcGxldGUoSW1hZ2VXcml0ZXIgc291cmNlKTsKLSAgICAKKwogICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCBhIHRodW1ibmFpbCB3cml0ZSBvcGVyYXRpb24gaGFzIGJlZW4gc3RhcnRlZC4gCisgICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IGEgdGh1bWJuYWlsIHdyaXRlIG9wZXJhdGlvbiBoYXMgYmVlbiBzdGFydGVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIEltYWdlV3JpdGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW5kZXggb2YgdGhlIGltYWdlIGJlaW5nIHdyaXR0ZW4uCi0gICAgICogQHBhcmFtIHRodW1ibmFpbEluZGV4IHRoZSBpbmRleCBvZiB0aGUgdGh1bWJuYWlsIGJlaW5nIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlV3JpdGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBpbWFnZSBiZWluZyB3cml0dGVuLgorICAgICAqIEBwYXJhbSB0aHVtYm5haWxJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSB0aHVtYm5haWwgYmVpbmcgd3JpdHRlbi4KICAgICAgKi8KICAgICB2b2lkIHRodW1ibmFpbFN0YXJ0ZWQoSW1hZ2VXcml0ZXIgc291cmNlLCBpbnQgaW1hZ2VJbmRleCwgaW50IHRodW1ibmFpbEluZGV4KTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgYWJvdXQgdGhlIGRlZ3JlZSBvZiBjb21wbGV0aW9uIG9mIHRoZSB3cml0ZSBjYWxsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIEltYWdlV3JpdGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KLSAgICAgKiBAcGFyYW0gcGVyY2VudGFnZURvbmUgdGhlIHBlcmNlbnRhZ2Ugb2YgZW5jb2RpbmcgZG9uZS4KKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VXcml0ZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSBwZXJjZW50YWdlRG9uZQorICAgICAqICAgICAgICAgICAgdGhlIHBlcmNlbnRhZ2Ugb2YgZW5jb2RpbmcgZG9uZS4KICAgICAgKi8KICAgICB2b2lkIHRodW1ibmFpbFByb2dyZXNzKEltYWdlV3JpdGVyIHNvdXJjZSwgZmxvYXQgcGVyY2VudGFnZURvbmUpOwotICAgIAorCiAgICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IGEgdGh1bWJuYWlsIHdyaXRlIG9wZXJhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuCisgICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IGEgdGh1bWJuYWlsIHdyaXRlIG9wZXJhdGlvbiBoYXMgYmVlbgorICAgICAqIGNvbXBsZXRlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBJbWFnZVdyaXRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlV3JpdGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KICAgICAgKi8KICAgICB2b2lkIHRodW1ibmFpbENvbXBsZXRlKEltYWdlV3JpdGVyIHNvdXJjZSk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgd3JpdGluZyBvcGVyYXRpb24gaGFzIGJlZW4gYWJvcnRlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBJbWFnZVdyaXRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlV3JpdGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KICAgICAgKi8KICAgICB2b2lkIHdyaXRlQWJvcnRlZChJbWFnZVdyaXRlciBzb3VyY2UpOwogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvSUlPV3JpdGVXYXJuaW5nTGlzdGVuZXIuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL2V2ZW50L0lJT1dyaXRlV2FybmluZ0xpc3RlbmVyLmphdmEKaW5kZXggZjUzMGQyNS4uOGVlNDFjZCAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvSUlPV3JpdGVXYXJuaW5nTGlzdGVuZXIuamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9ldmVudC9JSU9Xcml0ZVdhcm5pbmdMaXN0ZW5lci5qYXZhCkBAIC0xOCwyMyArMTgsMjkgQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW8uZXZlbnQ7CiAKIGltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlV3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwogCiAvKioKLSAqIFRoZSBJSU9Xcml0ZVdhcm5pbmdMaXN0ZW5lciBwcm92aWRlcyBtZXRob2RzIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uCi0gKiBvZiB3YXJuaW5ncyBnZW5lcmF0ZWQgYnkgaW1hZ2UgYW5kIHRodW1ibmFpbCB3cml0aW5nIG1ldGhvZHMuCisgKiBUaGUgSUlPV3JpdGVXYXJuaW5nTGlzdGVuZXIgcHJvdmlkZXMgbWV0aG9kcyB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiBvZgorICogd2FybmluZ3MgZ2VuZXJhdGVkIGJ5IGltYWdlIGFuZCB0aHVtYm5haWwgd3JpdGluZyBtZXRob2RzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJSU9Xcml0ZVdhcm5pbmdMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotICAgIAorCiAgICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciBhYm91dCBhIHdhcm5pbmcgKG5vbi1mYXRhbCBlcnJvcikgZHVyaW5nIGVuY29kaW5nLiAKKyAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIGFib3V0IGEgd2FybmluZyAobm9uLWZhdGFsIGVycm9yKSBkdXJpbmcgZW5jb2RpbmcuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VXcml0ZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbmRleCBvZiB0aGUgaW1hZ2UgZ2VuZXJhdGluZyB0aGUgd2FybmluZy4KLSAgICAgKiBAcGFyYW0gd2FybmluZyB0aGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHdhcm5pbmcuCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlV3JpdGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBpbWFnZSBnZW5lcmF0aW5nIHRoZSB3YXJuaW5nLgorICAgICAqIEBwYXJhbSB3YXJuaW5nCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHdhcm5pbmcuCiAgICAgICovCiAgICAgdm9pZCB3YXJuaW5nT2NjdXJyZWQoSW1hZ2VXcml0ZXIgc291cmNlLCBpbnQgaW1hZ2VJbmRleCwgU3RyaW5nIHdhcm5pbmcpOwogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvcGFja2FnZS5odG1sIGIvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZmUzOWYKLS0tIC9kZXYvbnVsbAorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9ldmVudC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGJvZHk+CisgICAgPHA+CisgICAgICBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgaW50ZXJmYWNlcyB0byBoYW5kbGUgZXZlbnRzIHdoaWNoIGNhbiBiZSBmaXJlZCBkdXJpbmcgdGhlIHJlYWRpbmcgb3Igd3JpdGluZyBvZiBpbWFnZXMuCisgICAgPC9wPgorICBAc2luY2UgQW5kcm9pZCAxLjAKKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPSW52YWxpZFRyZWVFeGNlcHRpb24uamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT0ludmFsaWRUcmVlRXhjZXB0aW9uLmphdmEKaW5kZXggODY5MGIyYi4uYmE5MDY1NyAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPSW52YWxpZFRyZWVFeGNlcHRpb24uamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9JSU9JbnZhbGlkVHJlZUV4Y2VwdGlvbi5qYXZhCkBAIC0yMSwyMSArMjEsMjYgQEAKIGltcG9ydCBqYXZheC5pbWFnZWlvLklJT0V4Y2VwdGlvbjsKIAogLyoqCi0gKiBUaGUgSUlPSW52YWxpZFRyZWVFeGNlcHRpb24gcHJvdmlkZXMgbm90aWZpY2F0aW9uIGFib3V0Ci0gKiBmYWlscyBvZiBJSU9NZXRhZGF0YU5vZGVzIHRyZWUgcGFyc2luZyBieSBJSU9NZXRhZGF0YSBvYmplY3QuIAorICogVGhlIElJT0ludmFsaWRUcmVlRXhjZXB0aW9uIHByb3ZpZGVzIG5vdGlmaWNhdGlvbiBhYm91dCBmYWlscyBvZgorICogSUlPTWV0YWRhdGFOb2RlcyB0cmVlIHBhcnNpbmcgYnkgSUlPTWV0YWRhdGEgb2JqZWN0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIElJT0ludmFsaWRUcmVlRXhjZXB0aW9uIGV4dGVuZHMgSUlPRXhjZXB0aW9uIHsKLSAgICAKLSAgICAvKiogVGhlIG9mZmVuZGluZyBub2RlLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG9mZmVuZGluZyBub2RlLgorICAgICAqLwogICAgIHByb3RlY3RlZCBOb2RlIG9mZmVuZGluZ05vZGUgPSBudWxsOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGFuIElJT0ludmFsaWRUcmVlRXhjZXB0aW9uIHdpdGggdGhlCi0gICAgICogc3BlY2lmaWVkIGRldGFpbGVkIG1lc3NhZ2UgYW5kIHNwZWNpZmllZCBvZmZlbmRpbmcKLSAgICAgKiBOb2RlLgorICAgICAqIEluc3RhbnRpYXRlcyBhbiBJSU9JbnZhbGlkVHJlZUV4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgZGV0YWlsZWQKKyAgICAgKiBtZXNzYWdlIGFuZCBzcGVjaWZpZWQgb2ZmZW5kaW5nIE5vZGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGRldGFpbGVkIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIG9mZmVuZGluZ05vZGUgdGhlIG9mZmVuZGluZyBub2RlLgorICAgICAqIEBwYXJhbSBtZXNzYWdlCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsZWQgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gb2ZmZW5kaW5nTm9kZQorICAgICAqICAgICAgICAgICAgdGhlIG9mZmVuZGluZyBub2RlLgogICAgICAqLwogICAgIHB1YmxpYyBJSU9JbnZhbGlkVHJlZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgTm9kZSBvZmZlbmRpbmdOb2RlKSB7CiAgICAgICAgIHN1cGVyKG1lc3NhZ2UpOwpAQCAtNDMsMTMgKzQ4LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IElJT0ludmFsaWRUcmVlRXhjZXB0aW9uIHdpdGggdGhlCi0gICAgICogc3BlY2lmaWVkIGRldGFpbGVkIG1lc3NhZ2UgYW5kIHNwZWNpZmllZCBvZmZlbmRpbmcKLSAgICAgKiBOb2RlLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJSU9JbnZhbGlkVHJlZUV4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgZGV0YWlsZWQKKyAgICAgKiBtZXNzYWdlIGFuZCBzcGVjaWZpZWQgb2ZmZW5kaW5nIE5vZGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGRldGFpbGVkIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIGNhdXNlIHRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgKiBAcGFyYW0gb2ZmZW5kaW5nTm9kZSB0aGUgb2ZmZW5kaW5nIG5vZGUKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbGVkIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIGNhdXNlCisgICAgICogICAgICAgICAgICB0aGUgY2F1c2Ugb2YgdGhpcyBleGNlcHRpb24uCisgICAgICogQHBhcmFtIG9mZmVuZGluZ05vZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZlbmRpbmcgbm9kZS4KICAgICAgKi8KICAgICBwdWJsaWMgSUlPSW52YWxpZFRyZWVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSwgTm9kZSBvZmZlbmRpbmdOb2RlKSB7CiAgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT01ldGFkYXRhLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9JSU9NZXRhZGF0YS5qYXZhCmluZGV4IGYyMzg3Y2MuLjk2Y2ViZjkgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT01ldGFkYXRhLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPTWV0YWRhdGEuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW8ubWV0YWRhdGE7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMjIsNzMgKzIzLDkwIEBACiBpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgSUlPTWV0YWRhdGEgcmVwcmVzZW50cyB0aGUgbWV0YWRhdGEgKGJ1bmRsZWQgd2l0aCBhbiBpbWFnZSkKLSAqIGFzIGEgRG9tLXR5cGUgdHJlZS4KKyAqIFRoZSBjbGFzcyBJSU9NZXRhZGF0YSByZXByZXNlbnRzIHRoZSBtZXRhZGF0YSAoYnVuZGxlZCB3aXRoIGFuIGltYWdlKSBhcyBhCisgKiBEb20tdHlwZSB0cmVlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIElJT01ldGFkYXRhIHsKIAotICAgIC8qKiBXaGV0aGVyIHRoZSBzdGFuZGFyZCBtZXRhZGF0YSBmb3JtYXQgaXMgc3VwcG9ydGVkLiAqLworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHN0YW5kYXJkIG1ldGFkYXRhIGZvcm1hdCBpcyBzdXBwb3J0ZWQuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhbmRhcmRGb3JtYXRTdXBwb3J0ZWQ7Ci0gICAgCi0gICAgLyoqIFRoZSBuYXRpdmUgbWV0YWRhdGEgZm9ybWF0IG5hbWUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmF0aXZlIG1ldGFkYXRhIGZvcm1hdCBuYW1lLgorICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmcgbmF0aXZlTWV0YWRhdGFGb3JtYXROYW1lOwotICAgIAotICAgIC8qKiBUaGUgbmF0aXZlIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG5hdGl2ZSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hdGl2ZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lOwotICAgIAotICAgIC8qKiBUaGUgZXh0cmEgbWV0YWRhdGEgZm9ybWF0IG5hbWVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGV4dHJhIG1ldGFkYXRhIGZvcm1hdCBuYW1lcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZXh0cmFNZXRhZGF0YUZvcm1hdE5hbWVzOwotICAgIAotICAgIC8qKiBUaGUgZXh0cmEgbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGV4dHJhIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZXh0cmFNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXM7Ci0gICAgCi0gICAgLyoqIFRoZSBkZWZhdWx0IGNvbnRyb2xsZXIuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBjb250cm9sbGVyLgorICAgICAqLwogICAgIHByb3RlY3RlZCBJSU9NZXRhZGF0YUNvbnRyb2xsZXIgZGVmYXVsdENvbnRyb2xsZXI7Ci0gICAgCi0gICAgLyoqIFRoZSBjb250cm9sbGVyLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGNvbnRyb2xsZXIuCisgICAgICovCiAgICAgcHJvdGVjdGVkIElJT01ldGFkYXRhQ29udHJvbGxlciBjb250cm9sbGVyOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IElJT01ldGFkYXRhIHdpdGggbm8gZGF0YSBzZXQuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIElJT01ldGFkYXRhKCkge30KKyAgICBwcm90ZWN0ZWQgSUlPTWV0YWRhdGEoKSB7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IElJT01ldGFkYXRhIHdpdGggdGhlIHNwZWNpZmllZCBkYXRhIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0YW5kYXJkTWV0YWRhdGFGb3JtYXRTdXBwb3J0ZWQgd2hldGhlciB0aGUgc3RhbmRhcmQgbWV0YWRhdGEgZm9ybWF0IGlzIHN1cHBvcnRlZAotICAgICAqIEBwYXJhbSBuYXRpdmVNZXRhZGF0YUZvcm1hdE5hbWUgdGhlIG5hdGl2ZSBtZXRhZGF0YSBmb3JtYXQgbmFtZQotICAgICAqIEBwYXJhbSBuYXRpdmVNZXRhZGF0YUZvcm1hdENsYXNzTmFtZSB0aGUgbmF0aXZlIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lCi0gICAgICogQHBhcmFtIGV4dHJhTWV0YWRhdGFGb3JtYXROYW1lcyB0aGUgZXh0cmEgbWV0YWRhdGEgZm9ybWF0IG5hbWVzCi0gICAgICogQHBhcmFtIGV4dHJhTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzIHRoZSBleHRyYSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZXMKKyAgICAgKiBAcGFyYW0gc3RhbmRhcmRNZXRhZGF0YUZvcm1hdFN1cHBvcnRlZAorICAgICAqICAgICAgICAgICAgd2hldGhlciB0aGUgc3RhbmRhcmQgbWV0YWRhdGEgZm9ybWF0IGlzIHN1cHBvcnRlZC4KKyAgICAgKiBAcGFyYW0gbmF0aXZlTWV0YWRhdGFGb3JtYXROYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmF0aXZlIG1ldGFkYXRhIGZvcm1hdCBuYW1lLgorICAgICAqIEBwYXJhbSBuYXRpdmVNZXRhZGF0YUZvcm1hdENsYXNzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hdGl2ZSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gZXh0cmFNZXRhZGF0YUZvcm1hdE5hbWVzCisgICAgICogICAgICAgICAgICB0aGUgZXh0cmEgbWV0YWRhdGEgZm9ybWF0IG5hbWVzLgorICAgICAqIEBwYXJhbSBleHRyYU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcworICAgICAqICAgICAgICAgICAgdGhlIGV4dHJhIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lcy4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSUlPTWV0YWRhdGEoYm9vbGVhbiBzdGFuZGFyZE1ldGFkYXRhRm9ybWF0U3VwcG9ydGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmF0aXZlTWV0YWRhdGFGb3JtYXROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmF0aXZlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGV4dHJhTWV0YWRhdGFGb3JtYXROYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZXh0cmFNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMpIHsKKyAgICBwcm90ZWN0ZWQgSUlPTWV0YWRhdGEoYm9vbGVhbiBzdGFuZGFyZE1ldGFkYXRhRm9ybWF0U3VwcG9ydGVkLCBTdHJpbmcgbmF0aXZlTWV0YWRhdGFGb3JtYXROYW1lLAorICAgICAgICAgICAgU3RyaW5nIG5hdGl2ZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lLCBTdHJpbmdbXSBleHRyYU1ldGFkYXRhRm9ybWF0TmFtZXMsCisgICAgICAgICAgICBTdHJpbmdbXSBleHRyYU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcykgewogICAgICAgICBzdGFuZGFyZEZvcm1hdFN1cHBvcnRlZCA9IHN0YW5kYXJkTWV0YWRhdGFGb3JtYXRTdXBwb3J0ZWQ7CiAgICAgICAgIHRoaXMubmF0aXZlTWV0YWRhdGFGb3JtYXROYW1lID0gbmF0aXZlTWV0YWRhdGFGb3JtYXROYW1lOwogICAgICAgICB0aGlzLm5hdGl2ZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lID0gbmF0aXZlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWU7CiAgICAgICAgIGlmIChleHRyYU1ldGFkYXRhRm9ybWF0TmFtZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKGV4dHJhTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgImV4dHJhTWV0YWRhdGFGb3JtYXROYW1lcyA9PSBudWxsICYmIGV4dHJhTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzICE9IG51bGwhIgotICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICAiZXh0cmFNZXRhZGF0YUZvcm1hdE5hbWVzID09IG51bGwgJiYgZXh0cmFNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMgIT0gbnVsbCEiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChleHRyYU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJleHRyYU1ldGFkYXRhRm9ybWF0TmFtZXMgIT0gbnVsbCAmJiBleHRyYU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcyA9PSBudWxsISIKLSAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgImV4dHJhTWV0YWRhdGFGb3JtYXROYW1lcyAhPSBudWxsICYmIGV4dHJhTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzID09IG51bGwhIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZXh0cmFNZXRhZGF0YUZvcm1hdE5hbWVzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXh0cmFNZXRhZGF0YUZvcm1hdE5hbWVzLmxlbmd0aCA9PSAwISIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGV4dHJhTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzLmxlbmd0aCAhPSBleHRyYU1ldGFkYXRhRm9ybWF0TmFtZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJleHRyYU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcy5sZW5ndGggIT0gZXh0cmFNZXRhZGF0YUZvcm1hdE5hbWVzLmxlbmd0aCEiCi0gICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICJleHRyYU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcy5sZW5ndGggIT0gZXh0cmFNZXRhZGF0YUZvcm1hdE5hbWVzLmxlbmd0aCEiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRoaXMuZXh0cmFNZXRhZGF0YUZvcm1hdE5hbWVzID0gZXh0cmFNZXRhZGF0YUZvcm1hdE5hbWVzLmNsb25lKCk7CiAgICAgICAgICAgICB0aGlzLmV4dHJhTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzID0gZXh0cmFNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMuY2xvbmUoKTsKQEAgLTk4LDMwICsxMTYsMzIgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBhcyB0cmVlLXR5cGUgZG9jdW1lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZvcm1hdE5hbWUgdGhlIGZvcm1hdCBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbm9kZSBpbiB0cmVlIGZvcm1hdAorICAgICAqIEBwYXJhbSBmb3JtYXROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZm9ybWF0IG5hbWUuCisgICAgICogQHJldHVybiB0aGUgbm9kZSBpbiB0cmVlIGZvcm1hdC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgTm9kZSBnZXRBc1RyZWUoU3RyaW5nIGZvcm1hdE5hbWUpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoZSBtZXRhZGF0YSBpcyByZWFkIG9ubHkuCiAgICAgICogCiAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgbWV0YWRhdGEgaXMgcmVhZCBvbmx5LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUmVhZE9ubHkoKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIE1lcmdlcyB0aGUgc3BlY2lmaWVkIHRyZWUgd2l0aCB0aGlzIG1ldGFkYXRhIHRyZWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZvcm1hdE5hbWUgdGhlIGZvcm1hdCBvZiB0aGUgc3BlY2lmaWVkIHRyZWUKLSAgICAgKiBAcGFyYW0gcm9vdCB0aGUgcm9vdCBub2RlIG9mIHRoZSBtZXRhZGF0YSB0cmVlCi0gICAgICogCi0gICAgICogQHRocm93cyBJSU9JbnZhbGlkVHJlZUV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIHRyZWUKLSAgICAgKiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgdGhpcyBtZXRhZGF0YSB0cmVlLgorICAgICAqIEBwYXJhbSBmb3JtYXROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZm9ybWF0IG9mIHRoZSBzcGVjaWZpZWQgdHJlZS4KKyAgICAgKiBAcGFyYW0gcm9vdAorICAgICAqICAgICAgICAgICAgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgbWV0YWRhdGEgdHJlZS4KKyAgICAgKiBAdGhyb3dzIElJT0ludmFsaWRUcmVlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCB0cmVlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSB0aGlzIG1ldGFkYXRhCisgICAgICogICAgICAgICAgICAgdHJlZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBtZXJnZVRyZWUoU3RyaW5nIGZvcm1hdE5hbWUsIE5vZGUgcm9vdCkgdGhyb3dzIElJT0ludmFsaWRUcmVlRXhjZXB0aW9uOwotICAgIAorCiAgICAgLyoqCiAgICAgICogUmVzZXRzIHRoZSBjb250cm9sbGVyLgogICAgICAqLwpAQCAtMTMwLDcgKzE1MCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgY29udHJvbGxlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZXRhZGF0YSBkb2N1bWVudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250cm9sbGVyCisgICAgICogQHJldHVybiB0aGUgY29udHJvbGxlci4KICAgICAgKi8KICAgICBwdWJsaWMgSUlPTWV0YWRhdGFDb250cm9sbGVyIGdldENvbnRyb2xsZXIoKSB7CiAgICAgICAgIHJldHVybiBjb250cm9sbGVyOwpAQCAtMTM5LDcgKzE1OSw3IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBtZXRhZGF0YSBoYXMgYSBjb250cm9sbGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBtZXRhZGF0YSBoYXMgYSBjb250cm9sbGVyCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIG1ldGFkYXRhIGhhcyBhIGNvbnRyb2xsZXIuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzQ29udHJvbGxlcigpIHsKICAgICAgICAgcmV0dXJuIGdldENvbnRyb2xsZXIoKSAhPSBudWxsOwpAQCAtMTQ4LDcgKzE2OCw3IEBACiAgICAgLyoqCiAgICAgICogQWN0aXZhdGUgdGhlIGNvbnRyb2xsZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsCisgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGFjdGl2YXRlQ29udHJvbGxlcigpIHsKICAgICAgICAgaWYgKCFoYXNDb250cm9sbGVyKCkpIHsKQEAgLTE2MCw3ICsxODAsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRlZmF1bHQgY29udHJvbGxlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGNvbnRyb2xsZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGNvbnRyb2xsZXIuCiAgICAgICovCiAgICAgcHVibGljIElJT01ldGFkYXRhQ29udHJvbGxlciBnZXREZWZhdWx0Q29udHJvbGxlcigpIHsKICAgICAgICAgcmV0dXJuIGRlZmF1bHRDb250cm9sbGVyOwpAQCAtMTY5LDcgKzE4OSw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZXh0cmEgbWV0YWRhdGEgZm9ybWF0IG5hbWVzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGV4dHJhIG1ldGFkYXRhIGZvcm1hdCBuYW1lcworICAgICAqIEByZXR1cm4gdGhlIGV4dHJhIG1ldGFkYXRhIGZvcm1hdCBuYW1lcy4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXh0cmFNZXRhZGF0YUZvcm1hdE5hbWVzKCkgewogICAgICAgICByZXR1cm4gZXh0cmFNZXRhZGF0YUZvcm1hdE5hbWVzID09IG51bGwgPyBudWxsIDogZXh0cmFNZXRhZGF0YUZvcm1hdE5hbWVzLmNsb25lKCk7CkBAIC0xNzgsMjMgKzE5OCwyMCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIGZvcm1hdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9ybWF0TmFtZSB0aGUgZm9ybWF0IG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhZGF0YSBmb3JtYXQKKyAgICAgKiBAcGFyYW0gZm9ybWF0TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGZvcm1hdCBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIG1ldGFkYXRhIGZvcm1hdC4KICAgICAgKi8KICAgICBwdWJsaWMgSUlPTWV0YWRhdGFGb3JtYXQgZ2V0TWV0YWRhdGFGb3JtYXQoU3RyaW5nIGZvcm1hdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIElJT01ldGFkYXRhVXRpbHMuaW5zdGFudGlhdGVNZXRhZGF0YUZvcm1hdCgKLSAgICAgICAgICAgICAgICBmb3JtYXROYW1lLAotICAgICAgICAgICAgICAgIHN0YW5kYXJkRm9ybWF0U3VwcG9ydGVkLAotICAgICAgICAgICAgICAgIG5hdGl2ZU1ldGFkYXRhRm9ybWF0TmFtZSwgbmF0aXZlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgZXh0cmFNZXRhZGF0YUZvcm1hdE5hbWVzLCBleHRyYU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcwotICAgICAgICApOworICAgICAgICByZXR1cm4gSUlPTWV0YWRhdGFVdGlscy5pbnN0YW50aWF0ZU1ldGFkYXRhRm9ybWF0KGZvcm1hdE5hbWUsIHN0YW5kYXJkRm9ybWF0U3VwcG9ydGVkLAorICAgICAgICAgICAgICAgIG5hdGl2ZU1ldGFkYXRhRm9ybWF0TmFtZSwgbmF0aXZlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUsIGV4dHJhTWV0YWRhdGFGb3JtYXROYW1lcywKKyAgICAgICAgICAgICAgICBleHRyYU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcyk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbmF0aXZlIG1ldGFkYXRhIGZvcm1hdCBuYW1lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hdGl2ZSBtZXRhZGF0YSBmb3JtYXQgbmFtZQorICAgICAqIEByZXR1cm4gdGhlIG5hdGl2ZSBtZXRhZGF0YSBmb3JtYXQgbmFtZS4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldE5hdGl2ZU1ldGFkYXRhRm9ybWF0TmFtZSgpIHsKICAgICAgICAgcmV0dXJuIG5hdGl2ZU1ldGFkYXRhRm9ybWF0TmFtZTsKQEAgLTIwMyw3ICsyMjAsNyBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiB0aGUgc3RhbmRhcmQgbWV0YWRhdGEgZm9ybWF0IGlzIHN1cHBvcnRlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzdGFuZGFyZCBtZXRhZGF0YSBmb3JtYXQgaXMgc3VwcG9ydGVkCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3RhbmRhcmQgbWV0YWRhdGEgZm9ybWF0IGlzIHN1cHBvcnRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YW5kYXJkTWV0YWRhdGFGb3JtYXRTdXBwb3J0ZWQoKSB7CiAgICAgICAgIHJldHVybiBzdGFuZGFyZEZvcm1hdFN1cHBvcnRlZDsKQEAgLTIxMiw3ICsyMjksNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIGZvcm1hdCBuYW1lcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhZGF0YSBmb3JtYXQgbmFtZXMKKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRhZGF0YSBmb3JtYXQgbmFtZXMuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIGdldE1ldGFkYXRhRm9ybWF0TmFtZXMoKSB7CiAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHJlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwpAQCAtMjM5LDcgKzI1Niw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc3RhbmRhcmQgY2hyb21hIG5vZGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3RhbmRhcmQgY2hyb21hIG5vZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBzdGFuZGFyZCBjaHJvbWEgbm9kZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgSUlPTWV0YWRhdGFOb2RlIGdldFN0YW5kYXJkQ2hyb21hTm9kZSgpIHsKICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0yNDgsNyArMjY1LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBzdGFuZGFyZCBjb21wcmVzc2lvbiBub2RlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0YW5kYXJkIGNvbXByZXNzaW9uIG5vZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBzdGFuZGFyZCBjb21wcmVzc2lvbiBub2RlLgogICAgICAqLwogICAgIHByb3RlY3RlZCBJSU9NZXRhZGF0YU5vZGUgZ2V0U3RhbmRhcmRDb21wcmVzc2lvbk5vZGUoKSB7CiAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMjU3LDcgKzI3NCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc3RhbmRhcmQgZGF0YSBub2RlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0YW5kYXJkIGRhdGEgbm9kZQorICAgICAqIEByZXR1cm4gdGhlIHN0YW5kYXJkIGRhdGEgbm9kZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgSUlPTWV0YWRhdGFOb2RlIGdldFN0YW5kYXJkRGF0YU5vZGUoKSB7CiAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMjY2LDcgKzI4Myw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc3RhbmRhcmQgZGltZW5zaW9uIG5vZGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3RhbmRhcmQgZGltZW5zaW9uIG5vZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBzdGFuZGFyZCBkaW1lbnNpb24gbm9kZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgSUlPTWV0YWRhdGFOb2RlIGdldFN0YW5kYXJkRGltZW5zaW9uTm9kZSgpIHsKICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0yNzUsNyArMjkyLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBzdGFuZGFyZCBkb2N1bWVudCBub2RlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0YW5kYXJkIGRvY3VtZW50IG5vZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBzdGFuZGFyZCBkb2N1bWVudCBub2RlLgogICAgICAqLwogICAgIHByb3RlY3RlZCBJSU9NZXRhZGF0YU5vZGUgZ2V0U3RhbmRhcmREb2N1bWVudE5vZGUoKSB7CiAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMjg0LDcgKzMwMSw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc3RhbmRhcmQgdGV4dCBub2RlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0YW5kYXJkIHRleHQgbm9kZQorICAgICAqIEByZXR1cm4gdGhlIHN0YW5kYXJkIHRleHQgbm9kZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgSUlPTWV0YWRhdGFOb2RlIGdldFN0YW5kYXJkVGV4dE5vZGUoKSB7CiAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMjkzLDcgKzMxMCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc3RhbmRhcmQgdGlsZSBub2RlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0YW5kYXJkIHRpbGUgbm9kZQorICAgICAqIEByZXR1cm4gdGhlIHN0YW5kYXJkIHRpbGUgbm9kZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgSUlPTWV0YWRhdGFOb2RlIGdldFN0YW5kYXJkVGlsZU5vZGUoKSB7CiAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMzAyLDcgKzMxOSw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc3RhbmRhcmQgdHJhbnNwYXJlbmN5IG5vZGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3RhbmRhcmQgdHJhbnNwYXJlbmN5IG5vZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBzdGFuZGFyZCB0cmFuc3BhcmVuY3kgbm9kZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgSUlPTWV0YWRhdGFOb2RlIGdldFN0YW5kYXJkVHJhbnNwYXJlbmN5Tm9kZSgpIHsKICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0zMTEsNyArMzI4LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBhcyBhIHRyZWUgaW4gc3RhbmRhcmQgZm9ybWF0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1ldGFkYXRhIGFzIGEgdHJlZSBpbiBzdGFuZGFyZCBmb3JtYXQKKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRhZGF0YSBhcyBhIHRyZWUgaW4gc3RhbmRhcmQgZm9ybWF0LgogICAgICAqLwogICAgIHByb3RlY3RlZCBmaW5hbCBJSU9NZXRhZGF0YU5vZGUgZ2V0U3RhbmRhcmRUcmVlKCkgewogICAgICAgICAvLyBDcmVhdGUgcm9vdCBub2RlCkBAIC0zNDIsMTQgKzM1OSwxNSBAQAogICAgICAgICBpZiAoKG5vZGUgPSBnZXRTdGFuZGFyZFRyYW5zcGFyZW5jeU5vZGUoKSkgIT0gbnVsbCkgewogICAgICAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChub2RlKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICByZXR1cm4gcm9vdDsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBjb250cm9sbGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb250cm9sbGVyIHRoZSBuZXcgY29udHJvbGxlcgorICAgICAqIEBwYXJhbSBjb250cm9sbGVyCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGNvbnRyb2xsZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29udHJvbGxlcihJSU9NZXRhZGF0YUNvbnRyb2xsZXIgY29udHJvbGxlcikgewogICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwpAQCAtMzU4LDExICszNzYsMTMgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBmcm9tIHRyZWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZvcm1hdE5hbWUgdGhlIG5hbWUgb2YgdGhlIG1ldGF0ZGF0YSBmb3JtYXQgb2YgdGhlIGZyb20gdHJlZQotICAgICAqIEBwYXJhbSByb290IHRoZSByb290IG5vZGUgb2YgdGhlIGZyb20gdHJlZQotICAgICAqIAotICAgICAqIEB0aHJvd3MgSUlPSW52YWxpZFRyZWVFeGNlcHRpb24gaWYgdGhlIHRyZWUgb3IgaXRzIGZvcm1hdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIAotICAgICAqIHRoaXMgbWV0YWRhdGEuCisgICAgICogQHBhcmFtIGZvcm1hdE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBtZXRhdGRhdGEgZm9ybWF0IG9mIHRoZSBmcm9tIHRyZWUuCisgICAgICogQHBhcmFtIHJvb3QKKyAgICAgKiAgICAgICAgICAgIHRoZSByb290IG5vZGUgb2YgdGhlIGZyb20gdHJlZS4KKyAgICAgKiBAdGhyb3dzIElJT0ludmFsaWRUcmVlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHRyZWUgb3IgaXRzIGZvcm1hdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMKKyAgICAgKiAgICAgICAgICAgICBtZXRhZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGcm9tVHJlZShTdHJpbmcgZm9ybWF0TmFtZSwgTm9kZSByb290KSB0aHJvd3MgSUlPSW52YWxpZFRyZWVFeGNlcHRpb24gewogICAgICAgICByZXNldCgpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPTWV0YWRhdGFDb250cm9sbGVyLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9JSU9NZXRhZGF0YUNvbnRyb2xsZXIuamF2YQppbmRleCBkZmQ0ZTVjLi4xNDA1OTQ4IDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9JSU9NZXRhZGF0YUNvbnRyb2xsZXIuamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9JSU9NZXRhZGF0YUNvbnRyb2xsZXIuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBTZXJnZXkgSS4gU2FsaXNoZXYKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW8ubWV0YWRhdGE7CiAKIC8qIApAQCAtMjYsMjAgKzI3LDIwIEBACiAgKi8KIAogLyoqCi0gKiBUaGUgSUlPTWV0YWRhdGFDb250cm9sbGVyIGludGVyZmFjZSBwcm92aWRlcyBhIG1ldGhvZCBmb3IgCi0gKiBpbXBsZW1lbnRpbmcgb2JqZWN0cyB0byBhY3RpdmF0ZSB0aGUgY29udHJvbGxlciB3aXRob3V0IAotICogZGVmaW5pbmcgaG93IHRoZSBjb250cm9sbGVyIG9idGFpbnMgdmFsdWVzLgorICogVGhlIElJT01ldGFkYXRhQ29udHJvbGxlciBpbnRlcmZhY2UgcHJvdmlkZXMgYSBtZXRob2QgZm9yIGltcGxlbWVudGluZworICogb2JqZWN0cyB0byBhY3RpdmF0ZSB0aGUgY29udHJvbGxlciB3aXRob3V0IGRlZmluaW5nIGhvdyB0aGUgY29udHJvbGxlcgorICogb2J0YWlucyB2YWx1ZXMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElJT01ldGFkYXRhQ29udHJvbGxlciB7CiAKICAgICAvKioKICAgICAgKiBBY3RpdmF0ZXMgYSBjb250cm9sbGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBtZXRhZGF0YSB0aGUgbWV0YWRhdGEgdG8gYmUgbW9kaWZpZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBJSU9NZXRhZGF0YSBoYXMgYmVlbiBtb2RpZmllZCwgCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBtZXRhZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIG1ldGFkYXRhIHRvIGJlIG1vZGlmaWVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIElJT01ldGFkYXRhIGhhcyBiZWVuIG1vZGlmaWVkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gYWN0aXZhdGUoSUlPTWV0YWRhdGEgbWV0YWRhdGEpOwogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9JSU9NZXRhZGF0YUZvcm1hdC5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPTWV0YWRhdGFGb3JtYXQuamF2YQppbmRleCA5ZTI0NmI0Li4wZTdlNjk3IDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9JSU9NZXRhZGF0YUZvcm1hdC5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT01ldGFkYXRhRm9ybWF0LmphdmEKQEAgLTIxLDMyNyArMjEsMzg0IEBACiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogLyoqCi0gKiBUaGUgSW50ZXJmYWNlIElJT01ldGFkYXRhRm9ybWF0IGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCAKLSAqIGRlc2NyaWJlIHRoZSBydWxlcyBhbmQgYWxsb3dlZCBlbGVtZW50cyBmb3IgYSBtZXRhZGF0YSBkb2N1bWVudAotICogdHJlZS4KKyAqIFRoZSBJbnRlcmZhY2UgSUlPTWV0YWRhdGFGb3JtYXQgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IGRlc2NyaWJlIHRoZQorICogcnVsZXMgYW5kIGFsbG93ZWQgZWxlbWVudHMgZm9yIGEgbWV0YWRhdGEgZG9jdW1lbnQgdHJlZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUlPTWV0YWRhdGFGb3JtYXQgewogCi0gICAgLyoqIFRoZSBDSElMRF9QT0xJQ1lfRU1QVFkuICovCisgICAgLyoqCisgICAgICogVGhlIENISUxEX1BPTElDWV9FTVBUWS4KKyAgICAgKi8KICAgICBpbnQgQ0hJTERfUE9MSUNZX0VNUFRZID0gMDsKLSAgICAKLSAgICAvKiogVGhlIENISUxEX1BPTElDWV9BTEwuICovCi0gICAgaW50IENISUxEX1BPTElDWV9BTEwgPSAxOwotICAgIAotICAgIC8qKiBUaGUgQ0hJTERfUE9MSUNZX1NPTUUuICovCi0gICAgaW50IENISUxEX1BPTElDWV9TT01FID0gMjsKLSAgICAKLSAgICAvKiogVGhlIENISUxEX1BPTElDWV9DSE9JQ0UuICovCi0gICAgaW50IENISUxEX1BPTElDWV9DSE9JQ0UgPSAzOwotICAgIAotICAgIC8qKiBUaGUgQ0hJTERfUE9MSUNZX1NFUVVFTkNFLiAqLwotICAgIGludCBDSElMRF9QT0xJQ1lfU0VRVUVOQ0UgPSA0OwotICAgIAotICAgIC8qKiBUaGUgQ0hJTERfUE9MSUNZX1JFUEVBVC4gKi8KLSAgICBpbnQgQ0hJTERfUE9MSUNZX1JFUEVBVCA9IDU7Ci0gICAgCi0gICAgLyoqIFRoZSBtYXhpbXVtIHZhbHVlIGZvciB0aGUgY2hpbGQgcG9saWN5LiAqLwotICAgIGludCBDSElMRF9QT0xJQ1lfTUFYID0gQ0hJTERfUE9MSUNZX1JFUEVBVDsKLQotICAgIC8qKiBUaGUgREFUQVRZUEVfU1RSSU5HLiAqLwotICAgIGludCBEQVRBVFlQRV9TVFJJTkcgPSAwOwotICAgIAotICAgIC8qKiBUaGUgREFUQVRZUEVfQk9PTEVBTi4gKi8KLSAgICBpbnQgREFUQVRZUEVfQk9PTEVBTiA9IDE7Ci0gICAgCi0gICAgLyoqIFRoZSBEQVRBVFlQRV9JTlRFR0VSLiAqLwotICAgIGludCBEQVRBVFlQRV9JTlRFR0VSID0gMjsKLSAgICAKLSAgICAvKiogVGhlIERBVEFUWVBFX0ZMT0FULiAqLwotICAgIGludCBEQVRBVFlQRV9GTE9BVCA9IDM7Ci0gICAgCi0gICAgLyoqIFRoZSBEQVRBVFlQRV9ET1VCTEUuICovCi0gICAgaW50IERBVEFUWVBFX0RPVUJMRSA9IDQ7Ci0KLSAgICAvKiogVGhlIFZBTFVFX05PTkUuICovCi0gICAgaW50IFZBTFVFX05PTkUgPSAwOwotICAgIAotICAgIC8qKiBUaGUgVkFMVUVfQVJCSVRSQVJZLiAqLwotICAgIGludCBWQUxVRV9BUkJJVFJBUlkgPSAxOwotICAgIAotICAgIC8qKiBUaGUgVkFMVUVfUkFOR0UuICovCi0gICAgaW50IFZBTFVFX1JBTkdFID0gMjsKLSAgICAKLSAgICAvKiogVGhlIFZBTFVFX1JBTkdFX01JTl9JTkNMVVNJVkVfTUFTSy4gKi8KLSAgICBpbnQgVkFMVUVfUkFOR0VfTUlOX0lOQ0xVU0lWRV9NQVNLID0gNDsKLSAgICAKLSAgICAvKiogVGhlIFZBTFVFX1JBTkdFX01BWF9JTkNMVVNJVkVfTUFTSy4gKi8KLSAgICBpbnQgVkFMVUVfUkFOR0VfTUFYX0lOQ0xVU0lWRV9NQVNLID0gODsKLSAgICAKLSAgICAvKiogVGhlIFZBTFVFX0VOVU1FUkFUSU9OLiAqLwotICAgIGludCBWQUxVRV9FTlVNRVJBVElPTiA9IDE2OwotICAgIAotICAgIC8qKiBUaGUgVkFMVUVfTElTVC4gKi8KLSAgICBpbnQgVkFMVUVfTElTVCA9IDMyOwotICAgIAotICAgIC8qKiBUaGUgVkFMVUVfUkFOR0VfTUlOX0lOQ0xVU0lWRS4gKi8KLSAgICBpbnQgVkFMVUVfUkFOR0VfTUlOX0lOQ0xVU0lWRSA9IFZBTFVFX1JBTkdFIHwgVkFMVUVfUkFOR0VfTUlOX0lOQ0xVU0lWRV9NQVNLOwotICAgIAotICAgIC8qKiBUaGUgVkFMVUVfUkFOR0VfTUFYX0lOQ0xVU0lWRS4gKi8KLSAgICBpbnQgVkFMVUVfUkFOR0VfTUFYX0lOQ0xVU0lWRSA9IFZBTFVFX1JBTkdFIHwgVkFMVUVfUkFOR0VfTUFYX0lOQ0xVU0lWRV9NQVNLOwotICAgIAotICAgIC8qKiBUaGUgVkFMVUVfUkFOR0VfTUlOX01BWF9JTkNMVVNJVkUuICovCi0gICAgaW50IFZBTFVFX1JBTkdFX01JTl9NQVhfSU5DTFVTSVZFID0KLSAgICAgICAgICAgIFZBTFVFX1JBTkdFIHwgVkFMVUVfUkFOR0VfTUlOX0lOQ0xVU0lWRV9NQVNLIHwgVkFMVUVfUkFOR0VfTUFYX0lOQ0xVU0lWRV9NQVNLOwogCiAgICAgLyoqCi0gICAgICogVGVsbHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaXMgYWxsb3dlZCBmb3IgdGhlIHNwZWNpZmllZCAKLSAgICAgKiBpbWFnZSB0eXBlLgorICAgICAqIFRoZSBDSElMRF9QT0xJQ1lfQUxMLgorICAgICAqLworICAgIGludCBDSElMRF9QT0xJQ1lfQUxMID0gMTsKKworICAgIC8qKgorICAgICAqIFRoZSBDSElMRF9QT0xJQ1lfU09NRS4KKyAgICAgKi8KKyAgICBpbnQgQ0hJTERfUE9MSUNZX1NPTUUgPSAyOworCisgICAgLyoqCisgICAgICogVGhlIENISUxEX1BPTElDWV9DSE9JQ0UuCisgICAgICovCisgICAgaW50IENISUxEX1BPTElDWV9DSE9JQ0UgPSAzOworCisgICAgLyoqCisgICAgICogVGhlIENISUxEX1BPTElDWV9TRVFVRU5DRS4KKyAgICAgKi8KKyAgICBpbnQgQ0hJTERfUE9MSUNZX1NFUVVFTkNFID0gNDsKKworICAgIC8qKgorICAgICAqIFRoZSBDSElMRF9QT0xJQ1lfUkVQRUFULgorICAgICAqLworICAgIGludCBDSElMRF9QT0xJQ1lfUkVQRUFUID0gNTsKKworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIHZhbHVlIGZvciB0aGUgY2hpbGQgcG9saWN5LgorICAgICAqLworICAgIGludCBDSElMRF9QT0xJQ1lfTUFYID0gQ0hJTERfUE9MSUNZX1JFUEVBVDsKKworICAgIC8qKgorICAgICAqIFRoZSBEQVRBVFlQRV9TVFJJTkcuCisgICAgICovCisgICAgaW50IERBVEFUWVBFX1NUUklORyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgREFUQVRZUEVfQk9PTEVBTi4KKyAgICAgKi8KKyAgICBpbnQgREFUQVRZUEVfQk9PTEVBTiA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgREFUQVRZUEVfSU5URUdFUi4KKyAgICAgKi8KKyAgICBpbnQgREFUQVRZUEVfSU5URUdFUiA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgREFUQVRZUEVfRkxPQVQuCisgICAgICovCisgICAgaW50IERBVEFUWVBFX0ZMT0FUID0gMzsKKworICAgIC8qKgorICAgICAqIFRoZSBEQVRBVFlQRV9ET1VCTEUuCisgICAgICovCisgICAgaW50IERBVEFUWVBFX0RPVUJMRSA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgVkFMVUVfTk9ORS4KKyAgICAgKi8KKyAgICBpbnQgVkFMVUVfTk9ORSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgVkFMVUVfQVJCSVRSQVJZLgorICAgICAqLworICAgIGludCBWQUxVRV9BUkJJVFJBUlkgPSAxOworCisgICAgLyoqCisgICAgICogVGhlIFZBTFVFX1JBTkdFLgorICAgICAqLworICAgIGludCBWQUxVRV9SQU5HRSA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgVkFMVUVfUkFOR0VfTUlOX0lOQ0xVU0lWRV9NQVNLLgorICAgICAqLworICAgIGludCBWQUxVRV9SQU5HRV9NSU5fSU5DTFVTSVZFX01BU0sgPSA0OworCisgICAgLyoqCisgICAgICogVGhlIFZBTFVFX1JBTkdFX01BWF9JTkNMVVNJVkVfTUFTSy4KKyAgICAgKi8KKyAgICBpbnQgVkFMVUVfUkFOR0VfTUFYX0lOQ0xVU0lWRV9NQVNLID0gODsKKworICAgIC8qKgorICAgICAqIFRoZSBWQUxVRV9FTlVNRVJBVElPTi4KKyAgICAgKi8KKyAgICBpbnQgVkFMVUVfRU5VTUVSQVRJT04gPSAxNjsKKworICAgIC8qKgorICAgICAqIFRoZSBWQUxVRV9MSVNULgorICAgICAqLworICAgIGludCBWQUxVRV9MSVNUID0gMzI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgVkFMVUVfUkFOR0VfTUlOX0lOQ0xVU0lWRS4KKyAgICAgKi8KKyAgICBpbnQgVkFMVUVfUkFOR0VfTUlOX0lOQ0xVU0lWRSA9IFZBTFVFX1JBTkdFIHwgVkFMVUVfUkFOR0VfTUlOX0lOQ0xVU0lWRV9NQVNLOworCisgICAgLyoqCisgICAgICogVGhlIFZBTFVFX1JBTkdFX01BWF9JTkNMVVNJVkUuCisgICAgICovCisgICAgaW50IFZBTFVFX1JBTkdFX01BWF9JTkNMVVNJVkUgPSBWQUxVRV9SQU5HRSB8IFZBTFVFX1JBTkdFX01BWF9JTkNMVVNJVkVfTUFTSzsKKworICAgIC8qKgorICAgICAqIFRoZSBWQUxVRV9SQU5HRV9NSU5fTUFYX0lOQ0xVU0lWRS4KKyAgICAgKi8KKyAgICBpbnQgVkFMVUVfUkFOR0VfTUlOX01BWF9JTkNMVVNJVkUgPSBWQUxVRV9SQU5HRSB8IFZBTFVFX1JBTkdFX01JTl9JTkNMVVNJVkVfTUFTSworICAgICAgICAgICAgfCBWQUxVRV9SQU5HRV9NQVhfSU5DTFVTSVZFX01BU0s7CisKKyAgICAvKioKKyAgICAgKiBUZWxscyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpcyBhbGxvd2VkIGZvciB0aGUgc3BlY2lmaWVkIGltYWdlCisgICAgICogdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIEBwYXJhbSBpbWFnZVR5cGUgdGhlIGltYWdlIHR5cGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpcyBhbGxvd2VkIGZvciB0aGUgc3BlY2lmaWVkIAotICAgICAqIGltYWdlIHR5cGUKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHBhcmFtIGltYWdlVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIHR5cGUuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaXMgYWxsb3dlZCBmb3IgdGhlIHNwZWNpZmllZCBpbWFnZQorICAgICAqICAgICAgICAgdHlwZS4KICAgICAgKi8KICAgICBib29sZWFuIGNhbk5vZGVBcHBlYXIoU3RyaW5nIGVsZW1lbnROYW1lLCBJbWFnZVR5cGVTcGVjaWZpZXIgaW1hZ2VUeXBlKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgZGF0YSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIEBwYXJhbSBhdHRyTmFtZSB0aGUgYXR0cmlidXRlIG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUncyBkYXRhIHR5cGUKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHBhcmFtIGF0dHJOYW1lCisgICAgICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIG5hbWUuCisgICAgICogQHJldHVybiB0aGUgYXR0cmlidXRlJ3MgZGF0YSB0eXBlLgogICAgICAqLwogICAgIGludCBnZXRBdHRyaWJ1dGVEYXRhVHlwZShTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyTmFtZSk7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KKyAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBlbGVtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lCi0gICAgICogQHBhcmFtIGF0dHJOYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSdzIGRlZmF1bHQgdmFsdWUKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHBhcmFtIGF0dHJOYW1lCisgICAgICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIG5hbWUuCisgICAgICogQHJldHVybiB0aGUgYXR0cmlidXRlJ3MgZGVmYXVsdCB2YWx1ZS4KICAgICAgKi8KICAgICBTdHJpbmcgZ2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJOYW1lKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHVzZXItZnJpZW5kbHkgZGVzY3JpcHRpb24gb2YgdGhlIGF0dHJpYnV0ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIEBwYXJhbSBhdHRyTmFtZSB0aGUgYXR0cmlidXRlIG5hbWUKLSAgICAgKiBAcGFyYW0gbG9jYWxlIHRoZSBsb2NhbGUgZ2l2aW5nIHRoZSBkZXNpcmVkIGxhbmd1YWdlIGZvciB0aGUKLSAgICAgKiBkZXNjcmlwdGlvbgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbgorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcGFyYW0gYXR0ck5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKiBAcGFyYW0gbG9jYWxlCisgICAgICogICAgICAgICAgICB0aGUgbG9jYWxlIGdpdmluZyB0aGUgZGVzaXJlZCBsYW5ndWFnZSBmb3IgdGhlIGRlc2NyaXB0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbi4KICAgICAgKi8KICAgICBTdHJpbmcgZ2V0QXR0cmlidXRlRGVzY3JpcHRpb24oU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0ck5hbWUsIExvY2FsZSBsb2NhbGUpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYXR0cmlidXRlIGVudW1lcmF0aW9ucy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIEBwYXJhbSBhdHRyTmFtZSB0aGUgYXR0cmlidXRlIG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgZW51bWVyYXRpb25zCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEBwYXJhbSBhdHRyTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBlbnVtZXJhdGlvbnMuCiAgICAgICovCiAgICAgU3RyaW5nW10gZ2V0QXR0cmlidXRlRW51bWVyYXRpb25zKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJOYW1lKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUgbGlzdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIEBwYXJhbSBhdHRyTmFtZSB0aGUgYXR0cmlidXRlIG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlIGxpc3QKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHBhcmFtIGF0dHJOYW1lCisgICAgICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIG5hbWUuCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIGF0dHJpYnV0ZSBsaXN0LgogICAgICAqLwogICAgIGludCBnZXRBdHRyaWJ1dGVMaXN0TWF4TGVuZ3RoKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJOYW1lKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG1pbmltdW0gbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUgbGlzdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIEBwYXJhbSBhdHRyTmFtZSB0aGUgYXR0cmlidXRlIG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlIGxpc3QKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHBhcmFtIGF0dHJOYW1lCisgICAgICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIG5hbWUuCisgICAgICogQHJldHVybiB0aGUgbWluaW11bSBsZW5ndGggb2YgdGhlIGF0dHJpYnV0ZSBsaXN0LgogICAgICAqLwogICAgIGludCBnZXRBdHRyaWJ1dGVMaXN0TWluTGVuZ3RoKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJOYW1lKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG1heGltdW0gdmFsdWUgYWxsb3dlZCBmb3IgdGhlIGF0dHJpYnV0ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIEBwYXJhbSBhdHRyTmFtZSB0aGUgYXR0cmlidXRlIG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIGFsbG93ZWQgZm9yIHRoZSBhdHRyaWJ1dGUKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHBhcmFtIGF0dHJOYW1lCisgICAgICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIG5hbWUuCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSB2YWx1ZSBhbGxvd2VkIGZvciB0aGUgYXR0cmlidXRlLgogICAgICAqLwogICAgIFN0cmluZyBnZXRBdHRyaWJ1dGVNYXhWYWx1ZShTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyTmFtZSk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBtaW5pbXVtIHZhbHVlIGFsbG93ZWQgZm9yIHRoZSBhdHRyaWJ1dGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiBAcGFyYW0gYXR0ck5hbWUgdGhlIGF0dHJpYnV0ZSBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWluaW11bSB2YWx1ZSBhbGxvd2VkIGZvciB0aGUgYXR0cmlidXRlCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEBwYXJhbSBhdHRyTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gdmFsdWUgYWxsb3dlZCBmb3IgdGhlIGF0dHJpYnV0ZS4KICAgICAgKi8KICAgICBTdHJpbmcgZ2V0QXR0cmlidXRlTWluVmFsdWUoU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0ck5hbWUpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYXR0cmlidXRlIG5hbWVzIGFsbG93ZWQgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBuYW1lcworICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgbmFtZXMuCiAgICAgICovCiAgICAgU3RyaW5nW10gZ2V0QXR0cmlidXRlTmFtZXMoU3RyaW5nIGVsZW1lbnROYW1lKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0eXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lCi0gICAgICogQHBhcmFtIGF0dHJOYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0eXBlCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEBwYXJhbSBhdHRyTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0eXBlLgogICAgICAqLwogICAgIGludCBnZXRBdHRyaWJ1dGVWYWx1ZVR5cGUoU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0ck5hbWUpOwotICAgIAorCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgCi0gICAgICogZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIGVsZW1lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiBAcGFyYW0gYXR0ck5hbWUgdGhlIGF0dHJpYnV0ZSBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBmb3IgdGhlIAotICAgICAqIHNwZWNpZmllZCBlbGVtZW50CisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEBwYXJhbSBhdHRyTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBuYW1lLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIGVsZW1lbnQuCiAgICAgICovCiAgICAgYm9vbGVhbiBpc0F0dHJpYnV0ZVJlcXVpcmVkKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJOYW1lKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG5hbWVzIG9mIHRoZSBwb3NzaWJsZSBjaGlsZCBlbGVtZW50cyBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjaGlsZCBuYW1lcworICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjaGlsZCBuYW1lcy4KICAgICAgKi8KICAgICBTdHJpbmdbXSBnZXRDaGlsZE5hbWVzKFN0cmluZyBlbGVtZW50TmFtZSk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBjb25zdGFudCBkZXNjcmliaW5nIHRoZSBlbGVtZW50J3MgY2hpbGQgcG9saWN5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hpbGQgcG9saWN5CisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIGNoaWxkIHBvbGljeS4KICAgICAgKi8KICAgICBpbnQgZ2V0Q2hpbGRQb2xpY3koU3RyaW5nIGVsZW1lbnROYW1lKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHVzZXItZnJpZW5kbHkgZGVzY3JpcHRpb24gb2YgdGhlIGVsZW1lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiBAcGFyYW0gbG9jYWxlIHRoZSBsb2NhbGUgZ2l2aW5nIHRoZSBkZXNpcmVkIGxhbmd1YWdlIGZvciB0aGUKLSAgICAgKiBkZXNjcmlwdGlvbgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgZGVzY3JpcHRpb24KKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHBhcmFtIGxvY2FsZQorICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsZSBnaXZpbmcgdGhlIGRlc2lyZWQgbGFuZ3VhZ2UgZm9yIHRoZSBkZXNjcmlwdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGRlc2NyaXB0aW9uLgogICAgICAqLwogICAgIFN0cmluZyBnZXRFbGVtZW50RGVzY3JpcHRpb24oU3RyaW5nIGVsZW1lbnROYW1lLCBMb2NhbGUgbG9jYWxlKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoaWxkcmVuIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hpbGRyZW4gYWxsb3dlZCBmb3IgdGhlIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hpbGRyZW4gYWxsb3dlZCBmb3IgdGhlIGVsZW1lbnQuCiAgICAgICovCiAgICAgaW50IGdldEVsZW1lbnRNYXhDaGlsZHJlbihTdHJpbmcgZWxlbWVudE5hbWUpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hpbGRyZW4gYWxsb3dlZCBmb3IgdGhlIGVsZW1lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGlsZHJlbiBhbGxvd2VkIGZvciB0aGUgZWxlbWVudAorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGlsZHJlbiBhbGxvd2VkIGZvciB0aGUgZWxlbWVudC4KICAgICAgKi8KICAgICBpbnQgZ2V0RWxlbWVudE1pbkNoaWxkcmVuKFN0cmluZyBlbGVtZW50TmFtZSk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIG9iamVjdCBhcnJheSBsZW5ndGggYWxsb3dlZCBmb3IgdGhlIGVsZW1lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIG9iamVjdCBhcnJheSBsZW5ndGggYWxsb3dlZCBmb3IgdGhlIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBvYmplY3QgYXJyYXkgbGVuZ3RoIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50LgogICAgICAqLwogICAgIGludCBnZXRPYmplY3RBcnJheU1heExlbmd0aChTdHJpbmcgZWxlbWVudE5hbWUpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbWluaW11bSBvYmplY3QgYXJyYXkgbGVuZ3RoIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWluaW11bSBvYmplY3QgYXJyYXkgbGVuZ3RoIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50CisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gb2JqZWN0IGFycmF5IGxlbmd0aCBhbGxvd2VkIGZvciB0aGUgZWxlbWVudC4KICAgICAgKi8KICAgICBpbnQgZ2V0T2JqZWN0QXJyYXlNaW5MZW5ndGgoU3RyaW5nIGVsZW1lbnROYW1lKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG9iamVjdCBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZWxlbWVudAorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCiAgICAgICovCiAgICAgQ2xhc3M8Pz4gZ2V0T2JqZWN0Q2xhc3MoU3RyaW5nIGVsZW1lbnROYW1lKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG9iamVjdCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZWxlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZWxlbWVudAorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGVsZW1lbnQuCiAgICAgICovCiAgICAgT2JqZWN0IGdldE9iamVjdERlZmF1bHRWYWx1ZShTdHJpbmcgZWxlbWVudE5hbWUpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgb2JqZWN0IGVudW1lcmF0aW9ucy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBlbnVtZXJhdGlvbnMKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGVudW1lcmF0aW9ucy4KICAgICAgKi8KICAgICBPYmplY3RbXSBnZXRPYmplY3RFbnVtZXJhdGlvbnMoU3RyaW5nIGVsZW1lbnROYW1lKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG1heGltdW0gdmFsdWUgYWxsb3dlZCBmb3IgdGhlIGVsZW1lbnQncyBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50J3Mgb2JqZWN0CisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gdmFsdWUgYWxsb3dlZCBmb3IgdGhlIGVsZW1lbnQncyBvYmplY3QuCiAgICAgICovCiAgICAgQ29tcGFyYWJsZTw/PiBnZXRPYmplY3RNYXhWYWx1ZShTdHJpbmcgZWxlbWVudE5hbWUpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbWluaW11bSB2YWx1ZSBhbGxvd2VkIGZvciB0aGUgZWxlbWVudCdzIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gdmFsdWUgYWxsb3dlZCBmb3IgdGhlIGVsZW1lbnQncyBvYmplY3QKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHJldHVybiB0aGUgbWluaW11bSB2YWx1ZSBhbGxvd2VkIGZvciB0aGUgZWxlbWVudCdzIG9iamVjdC4KICAgICAgKi8KICAgICBDb21wYXJhYmxlPD8+IGdldE9iamVjdE1pblZhbHVlKFN0cmluZyBlbGVtZW50TmFtZSk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBjb25zdGFudCB0aGF0IGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudCdzIHZhbHVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29uc3RhbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQncyB2YWx1ZQorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb25zdGFudCB0aGF0IGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudCdzIHZhbHVlLgogICAgICAqLwogICAgIGludCBnZXRPYmplY3RWYWx1ZVR5cGUoU3RyaW5nIGVsZW1lbnROYW1lKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIHJvb3QgZWxlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSByb290IGVsZW1lbnQKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSByb290IGVsZW1lbnQuCiAgICAgICovCiAgICAgU3RyaW5nIGdldFJvb3ROYW1lKCk7CiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9JSU9NZXRhZGF0YUZvcm1hdEltcGwuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT01ldGFkYXRhRm9ybWF0SW1wbC5qYXZhCmluZGV4IDQzOGFlOTAuLjFhNmU1NjggMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT01ldGFkYXRhRm9ybWF0SW1wbC5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT01ldGFkYXRhRm9ybWF0SW1wbC5qYXZhCkBAIC0yMyw0NSArMjMsNjAgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CiAKIC8qKgotICogVGhlIElJT01ldGFkYXRhRm9ybWF0SW1wbCBjbGFzcyBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgCisgKiBUaGUgSUlPTWV0YWRhdGFGb3JtYXRJbXBsIGNsYXNzIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZQogICogSUlPTWV0YWRhdGFGb3JtYXQgaW50ZXJmYWNlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIElJT01ldGFkYXRhRm9ybWF0SW1wbCBpbXBsZW1lbnRzIElJT01ldGFkYXRhRm9ybWF0IHsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IHN0YW5kYXJkTWV0YWRhdGFGb3JtYXROYW1lLiAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiQ29uc3RhbnREZWNsYXJlZEluQWJzdHJhY3RDbGFzcyJ9KQorCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHN0YW5kYXJkTWV0YWRhdGFGb3JtYXROYW1lLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCB7CisgICAgICAgICJDb25zdGFudERlY2xhcmVkSW5BYnN0cmFjdENsYXNzIgorICAgIH0pCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3RhbmRhcmRNZXRhZGF0YUZvcm1hdE5hbWUgPSAiamF2YXhfaW1hZ2Vpb18xLjAiOwogCi0gICAgLyoqIFRoZSBzdGFuZGFyZCBmb3JtYXQuICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJTdGF0aWNOb25GaW5hbEZpZWxkIn0pCisgICAgLyoqCisgICAgICogVGhlIHN0YW5kYXJkIGZvcm1hdC4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyggeworICAgICAgICAiU3RhdGljTm9uRmluYWxGaWVsZCIKKyAgICB9KQogICAgIHByaXZhdGUgc3RhdGljIElJT01ldGFkYXRhRm9ybWF0SW1wbCBzdGFuZGFyZEZvcm1hdDsKIAotICAgIC8qKiBUaGUgcm9vdCBuYW1lLiAqLworICAgIC8qKgorICAgICAqIFRoZSByb290IG5hbWUuCisgICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgcm9vdE5hbWU7Ci0gICAgCi0gICAgLyoqIFRoZSBlbGVtZW50IGhhc2guICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZWxlbWVudCBoYXNoLgorICAgICAqLwogICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIEVsZW1lbnQ+IGVsZW1lbnRIYXNoID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBFbGVtZW50PigpOwogCi0gICAgLyoqIFRoZSByZXNvdXJjZSBiYXNlIG5hbWUuICovCisgICAgLyoqCisgICAgICogVGhlIHJlc291cmNlIGJhc2UgbmFtZS4KKyAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyByZXNvdXJjZUJhc2VOYW1lID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiUmVzb3VyY2VzIjsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhbiBJSU9NZXRhZGF0YUZvcm1hdEltcGwgd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QKLSAgICAgKiBuYW1lIGFuZCBjaGlsZCBwb2xpY3kgKG5vdCBDSElMRF9QT0xJQ1lfUkVQRUFUKS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYW4gSUlPTWV0YWRhdGFGb3JtYXRJbXBsIHdpdGggdGhlIHNwZWNpZmllZCByb290IG5hbWUgYW5kCisgICAgICogY2hpbGQgcG9saWN5IChub3QgQ0hJTERfUE9MSUNZX1JFUEVBVCkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJvb3ROYW1lIHRoZSBuYW1lIG9mIHJvb3QgZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gY2hpbGRQb2xpY3kgdGhlIGNoaWxkIHBvbGljeSBkZWZpbmVkIGJ5IG9uZSBvZiB0aGUgCi0gICAgICogQ0hJTERfUE9MSUNZXyogY29uc3RhbnRzICAoZXhjZXB0IENISUxEX1BPTElDWV9SRVBFQVQpLgorICAgICAqIEBwYXJhbSByb290TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2Ygcm9vdCBlbGVtZW50LgorICAgICAqIEBwYXJhbSBjaGlsZFBvbGljeQorICAgICAqICAgICAgICAgICAgdGhlIGNoaWxkIHBvbGljeSBkZWZpbmVkIGJ5IG9uZSBvZiB0aGUgQ0hJTERfUE9MSUNZXyoKKyAgICAgKiAgICAgICAgICAgIGNvbnN0YW50cyAoZXhjZXB0IENISUxEX1BPTElDWV9SRVBFQVQpLgogICAgICAqLwogICAgIHB1YmxpYyBJSU9NZXRhZGF0YUZvcm1hdEltcGwoU3RyaW5nIHJvb3ROYW1lLCBpbnQgY2hpbGRQb2xpY3kpIHsKICAgICAgICAgaWYgKHJvb3ROYW1lID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvb3ROYW1lIGlzIG51bGwiKTsKICAgICAgICAgfQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgY2hpbGRQb2xpY3kgPCBDSElMRF9QT0xJQ1lfRU1QVFkgfHwKLSAgICAgICAgICAgICAgICBjaGlsZFBvbGljeSA+IENISUxEX1BPTElDWV9NQVggfHwKLSAgICAgICAgICAgICAgICBjaGlsZFBvbGljeSA9PSBDSElMRF9QT0xJQ1lfUkVQRUFUCi0gICAgICAgICkgeworICAgICAgICBpZiAoY2hpbGRQb2xpY3kgPCBDSElMRF9QT0xJQ1lfRU1QVFkgfHwgY2hpbGRQb2xpY3kgPiBDSElMRF9QT0xJQ1lfTUFYCisgICAgICAgICAgICAgICAgfHwgY2hpbGRQb2xpY3kgPT0gQ0hJTERfUE9MSUNZX1JFUEVBVCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2hpbGRQb2xpY3kgaXMgbm90IG9uZSBvZiB0aGUgcHJlZGVmaW5lZCBjb25zdGFudHMiKTsKICAgICAgICAgfQogCkBAIC03MywxMiArODgsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYW4gSUlPTWV0YWRhdGFGb3JtYXRJbXBsIHdpdGggdGhlIHNwZWNpZmllZCByb290Ci0gICAgICogbmFtZSBhbmQgQ0hJTERfUE9MSUNZX1JFUEVBVCBjaGlsZCBwb2xpY3kuCisgICAgICogSW5zdGFudGlhdGVzIGFuIElJT01ldGFkYXRhRm9ybWF0SW1wbCB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdCBuYW1lIGFuZAorICAgICAqIENISUxEX1BPTElDWV9SRVBFQVQgY2hpbGQgcG9saWN5LgogICAgICAqIAotICAgICAqIEBwYXJhbSByb290TmFtZSB0aGUgbmFtZSBvZiByb290IGVsZW1lbnQuCi0gICAgICogQHBhcmFtIG1pbkNoaWxkcmVuIHRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGlsZHJlbi4KLSAgICAgKiBAcGFyYW0gbWF4Q2hpbGRyZW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoaWxkcmVuCisgICAgICogQHBhcmFtIHJvb3ROYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiByb290IGVsZW1lbnQuCisgICAgICogQHBhcmFtIG1pbkNoaWxkcmVuCisgICAgICogICAgICAgICAgICB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hpbGRyZW4uCisgICAgICogQHBhcmFtIG1heENoaWxkcmVuCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hpbGRyZW4KICAgICAgKi8KICAgICBwdWJsaWMgSUlPTWV0YWRhdGFGb3JtYXRJbXBsKFN0cmluZyByb290TmFtZSwgaW50IG1pbkNoaWxkcmVuLCBpbnQgbWF4Q2hpbGRyZW4pIHsKICAgICAgICAgaWYgKHJvb3ROYW1lID09IG51bGwpIHsKQEAgLTEwMCwyNSArMTE4LDMxIEBACiAgICAgICAgIGVsZW1lbnRIYXNoLnB1dChyb290TmFtZSwgcm9vdCk7CiAgICAgfQogCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJBYnN0cmFjdE1ldGhvZE92ZXJyaWRlc0Fic3RyYWN0TWV0aG9kIn0pCisgICAgQFN1cHByZXNzV2FybmluZ3MoIHsKKyAgICAgICAgIkFic3RyYWN0TWV0aG9kT3ZlcnJpZGVzQWJzdHJhY3RNZXRob2QiCisgICAgfSkKICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjYW5Ob2RlQXBwZWFyKFN0cmluZyBlbGVtZW50TmFtZSwgSW1hZ2VUeXBlU3BlY2lmaWVyIGltYWdlVHlwZSk7CiAKICAgICAvKioKICAgICAgKiBBZGRzIGEgbmV3IGF0dHJpYnV0ZSB0byBhbiBleGlzdGluZyBlbGVtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgbmV3IGF0dHJpYnV0ZQotICAgICAqIHdpbGwgYmUgYWRkZWQuCi0gICAgICogQHBhcmFtIGF0dHJOYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZS4KLSAgICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGRhdGEgdHlwZSBvZiB0aGUgbmV3IGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gcmVxdWlyZWQgdGhlIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUKLSAgICAgKiBtdXN0IGJlIHByZXNlbnQuCi0gICAgICogQHBhcmFtIGxpc3RNaW5MZW5ndGggdGhlIG1pbmltdW0gbGVnYWwgbnVtYmVyIG9mIGxpc3QgaXRlbXMuCi0gICAgICogQHBhcmFtIGxpc3RNYXhMZW5ndGggdGhlIHRoZSBtYXhpbXVtIGxlZ2FsIG51bWJlciBvZiBsaXN0IGl0ZW1zLgorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIG5ldyBhdHRyaWJ1dGUgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgYWRkZWQuCisgICAgICogQHBhcmFtIGF0dHJOYW1lCisgICAgICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIG5hbWUuCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlIG9mIHRoZSBuZXcgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSByZXF1aXJlZAorICAgICAqICAgICAgICAgICAgdGhlIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUgbXVzdCBiZQorICAgICAqICAgICAgICAgICAgcHJlc2VudC4KKyAgICAgKiBAcGFyYW0gbGlzdE1pbkxlbmd0aAorICAgICAqICAgICAgICAgICAgdGhlIG1pbmltdW0gbGVnYWwgbnVtYmVyIG9mIGxpc3QgaXRlbXMuCisgICAgICogQHBhcmFtIGxpc3RNYXhMZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB0aGUgbWF4aW11bSBsZWdhbCBudW1iZXIgb2YgbGlzdCBpdGVtcy4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGUoCi0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyTmFtZSwgaW50IGRhdGFUeXBlLAotICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlZCwgaW50IGxpc3RNaW5MZW5ndGgsIGludCBsaXN0TWF4TGVuZ3RoCi0gICAgKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJOYW1lLCBpbnQgZGF0YVR5cGUsCisgICAgICAgICAgICBib29sZWFuIHJlcXVpcmVkLCBpbnQgbGlzdE1pbkxlbmd0aCwgaW50IGxpc3RNYXhMZW5ndGgpIHsKICAgICAgICAgaWYgKGF0dHJOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImF0dHJOYW1lID09IG51bGwhIik7CiAgICAgICAgIH0KQEAgLTE0NCwxOCArMTY4LDIxIEBACiAgICAgLyoqCiAgICAgICogQWRkcyBhIG5ldyBhdHRyaWJ1dGUgdG8gYW4gZXhpc3RpbmcgZWxlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIG5ldyBhdHRyaWJ1dGUKLSAgICAgKiB3aWxsIGJlIGFkZGVkLgotICAgICAqIEBwYXJhbSBhdHRyTmFtZSB0aGUgYXR0cmlidXRlIG5hbWUuCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUgb2YgdGhlIG5ldyBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIHJlcXVpcmVkIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgYXR0cmlidXRlCi0gICAgICogbXVzdCBiZSBwcmVzZW50LgotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBuZXcgYXR0cmlidXRlIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgIGFkZGVkLgorICAgICAqIEBwYXJhbSBhdHRyTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBuYW1lLgorICAgICAqIEBwYXJhbSBkYXRhVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHlwZSBvZiB0aGUgbmV3IGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gcmVxdWlyZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgYXR0cmlidXRlIG11c3QgYmUKKyAgICAgKiAgICAgICAgICAgIHByZXNlbnQuCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGUoCi0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyTmFtZSwgaW50IGRhdGFUeXBlLAotICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlZCwgU3RyaW5nIGRlZmF1bHRWYWx1ZQotICAgICkgeworICAgIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyTmFtZSwgaW50IGRhdGFUeXBlLAorICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlZCwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewogICAgICAgICBpZiAoYXR0ck5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXR0ck5hbWUgPT0gbnVsbCEiKTsKICAgICAgICAgfQpAQCAtMTc3LDIwICsyMDQsMjMgQEAKICAgICAvKioKICAgICAgKiBBZGRzIGEgbmV3IGF0dHJpYnV0ZSB0byBhbiBleGlzdGluZyBlbGVtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgbmV3IGF0dHJpYnV0ZQotICAgICAqIHdpbGwgYmUgYWRkZWQuCi0gICAgICogQHBhcmFtIGF0dHJOYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZS4KLSAgICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGRhdGEgdHlwZSBvZiB0aGUgbmV3IGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gcmVxdWlyZWQgdGhlIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUKLSAgICAgKiBtdXN0IGJlIHByZXNlbnQuCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSBlbnVtZXJhdGVkVmFsdWVzIHRoZSBsZWdhbCB2YWx1ZXMgZm9yIHRoZSBhdHRyaWJ1dGUgYXMgCi0gICAgICogYSBsaXN0IG9mIHN0cmluZ3MuCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgbmV3IGF0dHJpYnV0ZSB3aWxsIGJlCisgICAgICogICAgICAgICAgICBhZGRlZC4KKyAgICAgKiBAcGFyYW0gYXR0ck5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUgb2YgdGhlIG5ldyBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHJlcXVpcmVkCisgICAgICogICAgICAgICAgICB0aGUgZmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBtdXN0IGJlCisgICAgICogICAgICAgICAgICBwcmVzZW50LgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGVudW1lcmF0ZWRWYWx1ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZWdhbCB2YWx1ZXMgZm9yIHRoZSBhdHRyaWJ1dGUgYXMgYSBsaXN0IG9mIHN0cmluZ3MuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0ck5hbWUsIGludCBkYXRhVHlwZSwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVxdWlyZWQsIFN0cmluZyBkZWZhdWx0VmFsdWUsIExpc3Q8U3RyaW5nPiBlbnVtZXJhdGVkVmFsdWVzCi0gICAgKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJOYW1lLCBpbnQgZGF0YVR5cGUsCisgICAgICAgICAgICBib29sZWFuIHJlcXVpcmVkLCBTdHJpbmcgZGVmYXVsdFZhbHVlLCBMaXN0PFN0cmluZz4gZW51bWVyYXRlZFZhbHVlcykgewogICAgICAgICBpZiAoYXR0ck5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXR0ck5hbWUgPT0gbnVsbCEiKTsKICAgICAgICAgfQpAQCAtMjI2LDI2ICsyNTYsMzAgQEAKICAgICAvKioKICAgICAgKiBBZGRzIGEgbmV3IGF0dHJpYnV0ZSB0byBhbiBleGlzdGluZyBlbGVtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgbmV3IGF0dHJpYnV0ZQotICAgICAqIHdpbGwgYmUgYWRkZWQuCi0gICAgICogQHBhcmFtIGF0dHJOYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZS4KLSAgICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGRhdGEgdHlwZSBvZiB0aGUgbmV3IGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gcmVxdWlyZWQgdGhlIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUKLSAgICAgKiBtdXN0IGJlIHByZXNlbnQuCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIG1pblZhbHVlIHRoZSBtaW5pbXVtIGxlZ2FsIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gbWF4VmFsdWUgdGhlIG1heGltdW0gbGVnYWwgdmFsdWUgb2YgYW4gYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSBtaW5JbmNsdXNpdmUgdGhlIGZsYWcgd2hpY2ggaW5kaWNhdGVzICAKLSAgICAgKiB3aGV0aGVyIHRoZSBtaW5WYWx1ZSBpcyBpbmNsdXNpdmUuCi0gICAgICogQHBhcmFtIG1heEluY2x1c2l2ZSB0aGUgZmxhZyB3aGljaCBpbmRpY2F0ZXMgIAotICAgICAqIHdoZXRoZXIgdGhlIG1heFZhbHVlIGlzIGluY2x1c2l2ZS4KKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBuZXcgYXR0cmlidXRlIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgIGFkZGVkLgorICAgICAqIEBwYXJhbSBhdHRyTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBuYW1lLgorICAgICAqIEBwYXJhbSBkYXRhVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHlwZSBvZiB0aGUgbmV3IGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gcmVxdWlyZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgYXR0cmlidXRlIG11c3QgYmUKKyAgICAgKiAgICAgICAgICAgIHByZXNlbnQuCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBtaW5WYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG1pbmltdW0gbGVnYWwgdmFsdWUgb2YgYW4gYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBtYXhWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbGVnYWwgdmFsdWUgb2YgYW4gYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBtaW5JbmNsdXNpdmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSBtaW5WYWx1ZSBpcyBpbmNsdXNpdmUuCisgICAgICogQHBhcmFtIG1heEluY2x1c2l2ZQorICAgICAqICAgICAgICAgICAgdGhlIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG1heFZhbHVlIGlzIGluY2x1c2l2ZS4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGUoCi0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyTmFtZSwgaW50IGRhdGFUeXBlLAotICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlZCwgU3RyaW5nIGRlZmF1bHRWYWx1ZSwKLSAgICAgICAgICAgIFN0cmluZyBtaW5WYWx1ZSwgU3RyaW5nIG1heFZhbHVlLAotICAgICAgICAgICAgYm9vbGVhbiBtaW5JbmNsdXNpdmUsIGJvb2xlYW4gbWF4SW5jbHVzaXZlCi0gICAgKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJOYW1lLCBpbnQgZGF0YVR5cGUsCisgICAgICAgICAgICBib29sZWFuIHJlcXVpcmVkLCBTdHJpbmcgZGVmYXVsdFZhbHVlLCBTdHJpbmcgbWluVmFsdWUsIFN0cmluZyBtYXhWYWx1ZSwKKyAgICAgICAgICAgIGJvb2xlYW4gbWluSW5jbHVzaXZlLCBib29sZWFuIG1heEluY2x1c2l2ZSkgewogICAgICAgICBpZiAoYXR0ck5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXR0ck5hbWUgPT0gbnVsbCEiKTsKICAgICAgICAgfQpAQCAtMjcyLDIwICszMDYsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBZGRzIGEgbmV3IGF0dHJpYnV0ZSB3aXRoIGJvb2xlYW4gZGF0YSB0eXBlIHRvIGFuIGV4aXN0aW5nIAotICAgICAqIGVsZW1lbnQuCisgICAgICogQWRkcyBhIG5ldyBhdHRyaWJ1dGUgd2l0aCBib29sZWFuIGRhdGEgdHlwZSB0byBhbiBleGlzdGluZyBlbGVtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgbmV3IGF0dHJpYnV0ZQotICAgICAqIHdpbGwgYmUgYWRkZWQuCi0gICAgICogQHBhcmFtIGF0dHJOYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZS4KLSAgICAgKiBAcGFyYW0gaGFzRGVmYXVsdFZhbHVlIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgYXR0cmlidXRlCi0gICAgICogbXVzdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIG5ldyBhdHRyaWJ1dGUgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgYWRkZWQuCisgICAgICogQHBhcmFtIGF0dHJOYW1lCisgICAgICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIG5hbWUuCisgICAgICogQHBhcmFtIGhhc0RlZmF1bHRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUgbXVzdCBoYXZlIGEKKyAgICAgKiAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUuCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQm9vbGVhbkF0dHJpYnV0ZSgKLSAgICAgICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJOYW1lLAotICAgICAgICAgICAgYm9vbGVhbiBoYXNEZWZhdWx0VmFsdWUsIGJvb2xlYW4gZGVmYXVsdFZhbHVlCi0gICAgKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgYWRkQm9vbGVhbkF0dHJpYnV0ZShTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyTmFtZSwKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzRGVmYXVsdFZhbHVlLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewogICAgICAgICBTdHJpbmcgZGVmYXVsdFZhbCA9IGhhc0RlZmF1bHRWYWx1ZSA/IChkZWZhdWx0VmFsdWUgPyAiVFJVRSIgOiAiRkFMU0UiKSA6IG51bGw7CiAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigyKTsKICAgICAgICAgdmFsdWVzLmFkZCgiVFJVRSIpOwpAQCAtMjk1LDExICszMzAsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBZGRzIGFuIGV4aXN0aW5nIGVsZW1lbnQgdG8gdGhlIGxpc3Qgb2YgY2hpbGQgZWxlbWVudHMgCi0gICAgICogb2YgdGhlIHNwZWNpZmllZCBwYXJlbnQgZWxlbWVudC4KKyAgICAgKiBBZGRzIGFuIGV4aXN0aW5nIGVsZW1lbnQgdG8gdGhlIGxpc3Qgb2YgY2hpbGQgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZAorICAgICAqIHBhcmVudCBlbGVtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBiZSBhZGRlZC4KLSAgICAgKiBAcGFyYW0gcGFyZW50TmFtZSB0aGUgcGFyZW50IGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIGJlIGFkZGVkLgorICAgICAqIEBwYXJhbSBwYXJlbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgcGFyZW50IGVsZW1lbnQgbmFtZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZEVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgcGFyZW50TmFtZSkgewogICAgICAgICBFbGVtZW50IHBhcmVudCA9IGZpbmRFbGVtZW50KHBhcmVudE5hbWUpOwpAQCAtMzA4LDIzICszNDUsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBZGRzIGEgbmV3IGVsZW1lbnQgdHlwZSB0byB0aGlzIElJT01ldGFkYXRhRm9ybWF0IHdpdGggCi0gICAgICogYSBjaGlsZCBwb2xpY3kgKGlmIHBvbGljeSBpcyBub3QgQ0hJTERfUE9MSUNZX1JFUEVBVCkuCisgICAgICogQWRkcyBhIG5ldyBlbGVtZW50IHR5cGUgdG8gdGhpcyBJSU9NZXRhZGF0YUZvcm1hdCB3aXRoIGEgY2hpbGQgcG9saWN5IChpZgorICAgICAqIHBvbGljeSBpcyBub3QgQ0hJTERfUE9MSUNZX1JFUEVBVCkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIGJlIGFkZGVkLgotICAgICAqIEBwYXJhbSBwYXJlbnROYW1lIHRoZSBwYXJlbnQgZWxlbWVudCBuYW1lLgotICAgICAqIEBwYXJhbSBjaGlsZFBvbGljeSBvbmUgb2YgdGhlIENISUxEX1BPTElDWV8qIGNvbnN0YW50cyBkZWZpbmVkCi0gICAgICogYnkgSUlPTWV0YWRhdGFGb3JtYXQuCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBiZSBhZGRlZC4KKyAgICAgKiBAcGFyYW0gcGFyZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCBlbGVtZW50IG5hbWUuCisgICAgICogQHBhcmFtIGNoaWxkUG9saWN5CisgICAgICogICAgICAgICAgICBvbmUgb2YgdGhlIENISUxEX1BPTElDWV8qIGNvbnN0YW50cyBkZWZpbmVkIGJ5CisgICAgICogICAgICAgICAgICBJSU9NZXRhZGF0YUZvcm1hdC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRFbGVtZW50KFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIHBhcmVudE5hbWUsIGludCBjaGlsZFBvbGljeSkgewotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgY2hpbGRQb2xpY3kgPCBDSElMRF9QT0xJQ1lfRU1QVFkgfHwKLSAgICAgICAgICAgICAgICBjaGlsZFBvbGljeSA+IENISUxEX1BPTElDWV9NQVggfHwKLSAgICAgICAgICAgICAgICBjaGlsZFBvbGljeSA9PSBDSElMRF9QT0xJQ1lfUkVQRUFUCi0gICAgICAgICkgeworICAgICAgICBpZiAoY2hpbGRQb2xpY3kgPCBDSElMRF9QT0xJQ1lfRU1QVFkgfHwgY2hpbGRQb2xpY3kgPiBDSElMRF9QT0xJQ1lfTUFYCisgICAgICAgICAgICAgICAgfHwgY2hpbGRQb2xpY3kgPT0gQ0hJTERfUE9MSUNZX1JFUEVBVCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2hpbGRQb2xpY3kgaXMgbm90IG9uZSBvZiB0aGUgcHJlZGVmaW5lZCBjb25zdGFudHMiKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBFbGVtZW50IHBhcmVudCA9IGZpbmRFbGVtZW50KHBhcmVudE5hbWUpOwogICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBuZXcgRWxlbWVudCgpOwogICAgICAgICBlbGVtZW50Lm5hbWUgPSBlbGVtZW50TmFtZTsKQEAgLTMzNCwxOSArMzcxLDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyBlbGVtZW50IHR5cGUgdG8gdGhpcyBJSU9NZXRhZGF0YUZvcm1hdCB3aXRoIAotICAgICAqIENISUxEX1BPTElDWV9SRVBFQVQgYW5kIHRoZSBzcGVjaWZpZWQgbWluaW11bSBhbmQgbWF4aW11bQotICAgICAqIG51bWJlciBvZiBjaGlsZCBlbGVtZW50cy4KKyAgICAgKiBBZGRzIGEgbmV3IGVsZW1lbnQgdHlwZSB0byB0aGlzIElJT01ldGFkYXRhRm9ybWF0IHdpdGgKKyAgICAgKiBDSElMRF9QT0xJQ1lfUkVQRUFUIGFuZCB0aGUgc3BlY2lmaWVkIG1pbmltdW0gYW5kIG1heGltdW0gbnVtYmVyIG9mIGNoaWxkCisgICAgICogZWxlbWVudHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUgdG8gYmUgYWRkZWQuCi0gICAgICogQHBhcmFtIHBhcmVudE5hbWUgdGhlIHBhcmVudCBlbGVtZW50IG5hbWUuCi0gICAgICogQHBhcmFtIG1pbkNoaWxkcmVuIHRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGlsZCBlbGVtZW50cy4KLSAgICAgKiBAcGFyYW0gbWF4Q2hpbGRyZW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoaWxkIGVsZW1lbnRzLgorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZSB0byBiZSBhZGRlZC4KKyAgICAgKiBAcGFyYW0gcGFyZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCBlbGVtZW50IG5hbWUuCisgICAgICogQHBhcmFtIG1pbkNoaWxkcmVuCisgICAgICogICAgICAgICAgICB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hpbGQgZWxlbWVudHMuCisgICAgICogQHBhcmFtIG1heENoaWxkcmVuCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hpbGQgZWxlbWVudHMuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkRWxlbWVudCgKLSAgICAgICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIHBhcmVudE5hbWUsCi0gICAgICAgICAgICBpbnQgbWluQ2hpbGRyZW4sIGludCBtYXhDaGlsZHJlbgotICAgICkgeworICAgIHByb3RlY3RlZCB2b2lkIGFkZEVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgcGFyZW50TmFtZSwgaW50IG1pbkNoaWxkcmVuLAorICAgICAgICAgICAgaW50IG1heENoaWxkcmVuKSB7CiAgICAgICAgIGlmIChtaW5DaGlsZHJlbiA8IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1pbkNoaWxkcmVuIDwgMCEiKTsKICAgICAgICAgfQpAQCAtMzY1LDE5ICs0MDQsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBZGRzIGFuIE9iamVjdCByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzIHR5cGUgdG8gYmUgCi0gICAgICogc3RvcmVkIGFzIGVsZW1lbnQncyB2YWx1ZS4gCisgICAgICogQWRkcyBhbiBPYmplY3QgcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcyB0eXBlIHRvIGJlIHN0b3JlZCBhcworICAgICAqIGVsZW1lbnQncyB2YWx1ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZS4KLSAgICAgKiBAcGFyYW0gY2xhc3NUeXBlIHRoZSBjbGFzcyBpbmRpY2F0ZXMgdGhlIGxlZ2FsIHR5cGVzIGZvciAKLSAgICAgKiB0aGUgb2JqZWN0J3MgdmFsdWUuCi0gICAgICogQHBhcmFtIGFycmF5TWluTGVuZ3RoIHRoZSBtaW5pbXVtIGxlZ2FsIGxlbmd0aCBmb3IgdGhlIGFycmF5LgotICAgICAqIEBwYXJhbSBhcnJheU1heExlbmd0aCB0aGUgbWF4aW11bSBsZWdhbCBsZW5ndGggZm9yIHRoZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHBhcmFtIGNsYXNzVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIGluZGljYXRlcyB0aGUgbGVnYWwgdHlwZXMgZm9yIHRoZSBvYmplY3QncyB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gYXJyYXlNaW5MZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIGxlZ2FsIGxlbmd0aCBmb3IgdGhlIGFycmF5LgorICAgICAqIEBwYXJhbSBhcnJheU1heExlbmd0aAorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbGVnYWwgbGVuZ3RoIGZvciB0aGUgYXJyYXkuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkT2JqZWN0VmFsdWUoCi0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUsIENsYXNzPD8+IGNsYXNzVHlwZSwKLSAgICAgICAgICAgIGludCBhcnJheU1pbkxlbmd0aCwgaW50IGFycmF5TWF4TGVuZ3RoCi0gICAgKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgYWRkT2JqZWN0VmFsdWUoU3RyaW5nIGVsZW1lbnROYW1lLCBDbGFzczw/PiBjbGFzc1R5cGUsIGludCBhcnJheU1pbkxlbmd0aCwKKyAgICAgICAgICAgIGludCBhcnJheU1heExlbmd0aCkgewogICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBmaW5kRWxlbWVudChlbGVtZW50TmFtZSk7CiAKICAgICAgICAgT2JqZWN0VmFsdWUgb2JqVmFsID0gbmV3IE9iamVjdFZhbHVlKCk7CkBAIC0zOTAsMjAgKzQzMCwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZHMgYW4gT2JqZWN0IHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MgdHlwZSB0byBiZSAKLSAgICAgKiBzdG9yZWQgYXMgYW4gZWxlbWVudCdzIHZhbHVlLiAKKyAgICAgKiBBZGRzIGFuIE9iamVjdCByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzIHR5cGUgdG8gYmUgc3RvcmVkIGFzIGFuCisgICAgICogZWxlbWVudCdzIHZhbHVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lLgotICAgICAqIEBwYXJhbSBjbGFzc1R5cGUgdGhlIGNsYXNzIGluZGljYXRlcyB0aGUgbGVnYWwgdHlwZXMgZm9yIAotICAgICAqIHRoZSBvYmplY3QncyB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gcmVxdWlyZWQgYSBmbGFnIGluZGljYXRlZCB0aGF0IHRoaXMgb2JqZWN0IHZhbHVlIAotICAgICAqIG11c3QgYmUgcHJlc2VudC4KLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlLCBvciBudWxsLgorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcGFyYW0gY2xhc3NUeXBlCisgICAgICogICAgICAgICAgICB0aGUgY2xhc3MgaW5kaWNhdGVzIHRoZSBsZWdhbCB0eXBlcyBmb3IgdGhlIG9iamVjdCdzIHZhbHVlLgorICAgICAqIEBwYXJhbSByZXF1aXJlZAorICAgICAqICAgICAgICAgICAgYSBmbGFnIGluZGljYXRlZCB0aGF0IHRoaXMgb2JqZWN0IHZhbHVlIG11c3QgYmUgcHJlc2VudC4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSwgb3IgbnVsbC4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgPFQ+IHZvaWQgYWRkT2JqZWN0VmFsdWUoCi0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUsIENsYXNzPFQ+IGNsYXNzVHlwZSwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVxdWlyZWQsIFQgZGVmYXVsdFZhbHVlCi0gICAgKSB7CisgICAgcHJvdGVjdGVkIDxUPiB2b2lkIGFkZE9iamVjdFZhbHVlKFN0cmluZyBlbGVtZW50TmFtZSwgQ2xhc3M8VD4gY2xhc3NUeXBlLCBib29sZWFuIHJlcXVpcmVkLAorICAgICAgICAgICAgVCBkZWZhdWx0VmFsdWUpIHsKICAgICAgICAgLy8gbm90ZTogcmVxaXJlZCBpcyBhbiB1bnVzZWQgcGFyYW1ldGVyCiAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGZpbmRFbGVtZW50KGVsZW1lbnROYW1lKTsKIApAQCAtNDE2LDIyICs0NTYsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBZGRzIGFuIE9iamVjdCByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzIHR5cGUgdG8gYmUgCi0gICAgICogc3RvcmVkIGFzIHRoZSBlbGVtZW50J3MgdmFsdWUuIAorICAgICAqIEFkZHMgYW4gT2JqZWN0IHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MgdHlwZSB0byBiZSBzdG9yZWQgYXMKKyAgICAgKiB0aGUgZWxlbWVudCdzIHZhbHVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lLgotICAgICAqIEBwYXJhbSBjbGFzc1R5cGUgdGhlIGNsYXNzIGluZGljYXRlcyB0aGUgbGVnYWwgdHlwZXMgZm9yIAotICAgICAqIHRoZSBvYmplY3QgdmFsdWUuCi0gICAgICogQHBhcmFtIHJlcXVpcmVkIGEgZmxhZyBpbmRpY2F0ZWQgdGhhdCB0aGlzIG9iamVjdCB2YWx1ZSAKLSAgICAgKiBtdXN0IGJlIHByZXNlbnQuCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSwgb3IgbnVsbC4KLSAgICAgKiBAcGFyYW0gZW51bWVyYXRlZFZhbHVlcyB0aGUgbGlzdCBvZiBsZWdhbCB2YWx1ZXMgZm9yIHRoZSBvYmplY3QuCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEBwYXJhbSBjbGFzc1R5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyBpbmRpY2F0ZXMgdGhlIGxlZ2FsIHR5cGVzIGZvciB0aGUgb2JqZWN0IHZhbHVlLgorICAgICAqIEBwYXJhbSByZXF1aXJlZAorICAgICAqICAgICAgICAgICAgYSBmbGFnIGluZGljYXRlZCB0aGF0IHRoaXMgb2JqZWN0IHZhbHVlIG11c3QgYmUgcHJlc2VudC4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSwgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gZW51bWVyYXRlZFZhbHVlcworICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgbGVnYWwgdmFsdWVzIGZvciB0aGUgb2JqZWN0LgogICAgICAqLwotICAgIHByb3RlY3RlZCA8VD4gdm9pZCBhZGRPYmplY3RWYWx1ZSgKLSAgICAgICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSwgQ2xhc3M8VD4gY2xhc3NUeXBlLAotICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlZCwgVCBkZWZhdWx0VmFsdWUsCi0gICAgICAgICAgICBMaXN0PD8gZXh0ZW5kcyBUPiBlbnVtZXJhdGVkVmFsdWVzCi0gICAgKSB7CisgICAgcHJvdGVjdGVkIDxUPiB2b2lkIGFkZE9iamVjdFZhbHVlKFN0cmluZyBlbGVtZW50TmFtZSwgQ2xhc3M8VD4gY2xhc3NUeXBlLCBib29sZWFuIHJlcXVpcmVkLAorICAgICAgICAgICAgVCBkZWZhdWx0VmFsdWUsIExpc3Q8PyBleHRlbmRzIFQ+IGVudW1lcmF0ZWRWYWx1ZXMpIHsKICAgICAgICAgLy8gbm90ZTogcmVxaXJlZCBpcyBhbiB1bnVzZWQgcGFyYW1ldGVyCiAgICAgICAgIGlmIChlbnVtZXJhdGVkVmFsdWVzID09IG51bGwgfHwgZW51bWVyYXRlZFZhbHVlcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVudW1lcmF0ZWRWYWx1ZXMgaXMgZW1wdHkgb3IgbnVsbCIpOwpAQCAtNDQ0LDcgKzQ4NCw4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZW51bWVyYXRlZFZhbHVlcyBjb250YWlucyBhIHZhbHVlIG5vdCBvZiBjbGFzcyBjbGFzc1R5cGUhIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiZW51bWVyYXRlZFZhbHVlcyBjb250YWlucyBhIHZhbHVlIG5vdCBvZiBjbGFzcyBjbGFzc1R5cGUhIik7CiAgICAgICAgIH0KIAogICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBmaW5kRWxlbWVudChlbGVtZW50TmFtZSk7CkBAIC00NTksMjUgKzUwMCwyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZHMgYW4gT2JqZWN0IHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MgdHlwZSB0byBiZSAKLSAgICAgKiBzdG9yZWQgYXMgdGhlIGVsZW1lbnQncyB2YWx1ZS4gCisgICAgICogQWRkcyBhbiBPYmplY3QgcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcyB0eXBlIHRvIGJlIHN0b3JlZCBhcworICAgICAqIHRoZSBlbGVtZW50J3MgdmFsdWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUuCi0gICAgICogQHBhcmFtIGNsYXNzVHlwZSB0aGUgY2xhc3MgaW5kaWNhdGVzIHRoZSBsZWdhbCB0eXBlcyBmb3IgCi0gICAgICogdGhlIG9iamVjdCB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlLCBvciBudWxsLgotICAgICAqIEBwYXJhbSBtaW5WYWx1ZSB0aGUgbWluaW11bSBsZWdhbCB2YWx1ZSBmb3IgdGhlIG9iamVjdCB2YWx1ZS4gCi0gICAgICogQHBhcmFtIG1heFZhbHVlIHRoZSBtYXhpbXVtIGxlZ2FsIHZhbHVlIGZvciB0aGUgb2JqZWN0IHZhbHVlLiAKLSAgICAgKiBAcGFyYW0gbWluSW5jbHVzaXZlIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyAKLSAgICAgKiB3aGV0aGVyIHRoZSBtaW5WYWx1ZSBpcyBpbmNsdXNpdmUuCi0gICAgICogQHBhcmFtIG1heEluY2x1c2l2ZSB0aGUgZmxhZyB3aGljaCBpbmRpY2F0ZXMgCi0gICAgICogd2hldGhlciB0aGUgbWF4VmFsdWUgaXMgaW5jbHVzaXZlLgorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcGFyYW0gY2xhc3NUeXBlCisgICAgICogICAgICAgICAgICB0aGUgY2xhc3MgaW5kaWNhdGVzIHRoZSBsZWdhbCB0eXBlcyBmb3IgdGhlIG9iamVjdCB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSwgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gbWluVmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIGxlZ2FsIHZhbHVlIGZvciB0aGUgb2JqZWN0IHZhbHVlLgorICAgICAqIEBwYXJhbSBtYXhWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbGVnYWwgdmFsdWUgZm9yIHRoZSBvYmplY3QgdmFsdWUuCisgICAgICogQHBhcmFtIG1pbkluY2x1c2l2ZQorICAgICAqICAgICAgICAgICAgdGhlIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG1pblZhbHVlIGlzIGluY2x1c2l2ZS4KKyAgICAgKiBAcGFyYW0gbWF4SW5jbHVzaXZlCisgICAgICogICAgICAgICAgICB0aGUgZmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgbWF4VmFsdWUgaXMgaW5jbHVzaXZlLgogICAgICAqLwotICAgIHByb3RlY3RlZCA8VCBleHRlbmRzIE9iamVjdCAmIENvbXBhcmFibGU8PyBzdXBlciBUPj4gdm9pZCBhZGRPYmplY3RWYWx1ZSgKLSAgICAgICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSwgQ2xhc3M8VD4gY2xhc3NUeXBlLAotICAgICAgICAgICAgVCBkZWZhdWx0VmFsdWUsIENvbXBhcmFibGU8PyBzdXBlciBUPiBtaW5WYWx1ZSwgQ29tcGFyYWJsZTw/IHN1cGVyIFQ+IG1heFZhbHVlLAotICAgICAgICAgICAgYm9vbGVhbiBtaW5JbmNsdXNpdmUsIGJvb2xlYW4gbWF4SW5jbHVzaXZlCi0gICAgKSB7CisgICAgcHJvdGVjdGVkIDxUIGV4dGVuZHMgT2JqZWN0ICYgQ29tcGFyYWJsZTw/IHN1cGVyIFQ+PiB2b2lkIGFkZE9iamVjdFZhbHVlKFN0cmluZyBlbGVtZW50TmFtZSwKKyAgICAgICAgICAgIENsYXNzPFQ+IGNsYXNzVHlwZSwgVCBkZWZhdWx0VmFsdWUsIENvbXBhcmFibGU8PyBzdXBlciBUPiBtaW5WYWx1ZSwKKyAgICAgICAgICAgIENvbXBhcmFibGU8PyBzdXBlciBUPiBtYXhWYWx1ZSwgYm9vbGVhbiBtaW5JbmNsdXNpdmUsIGJvb2xlYW4gbWF4SW5jbHVzaXZlKSB7CiAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGZpbmRFbGVtZW50KGVsZW1lbnROYW1lKTsKIAogICAgICAgICBPYmplY3RWYWx1ZTxUPiBvYmpWYWwgPSBuZXcgT2JqZWN0VmFsdWU8VD4oKTsKQEAgLTU0MCw3ICs1ODMsNyBAQAogICAgICAgICBpZiAoKGF0dHIudmFsdWVUeXBlICYgVkFMVUVfUkFOR0UpID09IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkF0dHJpYnV0ZSBpcyBub3QgYSByYW5nZSEiKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gYXR0ci5tYXhWYWx1ZTsgICAgICAgIAorICAgICAgICByZXR1cm4gYXR0ci5tYXhWYWx1ZTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU1pblZhbHVlKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJOYW1lKSB7CkBAIC01NTgsMTIgKzYwMSwxMyBAQAogCiAgICAgcHVibGljIGludCBnZXRBdHRyaWJ1dGVWYWx1ZVR5cGUoU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0ck5hbWUpIHsKICAgICAgICAgQXR0bGlzdCBhdHRyID0gZmluZEF0dHJpYnV0ZShlbGVtZW50TmFtZSwgYXR0ck5hbWUpOwotICAgICAgICByZXR1cm4gYXR0ci52YWx1ZVR5cGU7ICAgICAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gYXR0ci52YWx1ZVR5cGU7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZ1tdIGdldENoaWxkTmFtZXMoU3RyaW5nIGVsZW1lbnROYW1lKSB7CiAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGZpbmRFbGVtZW50KGVsZW1lbnROYW1lKTsKLSAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGRQb2xpY3kgPT0gQ0hJTERfUE9MSUNZX0VNUFRZKSB7IC8vIEVsZW1lbnQgY2Fubm90IGhhdmUgY2hpbGRyZW4KKyAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGRQb2xpY3kgPT0gQ0hJTERfUE9MSUNZX0VNUFRZKSB7IC8vIEVsZW1lbnQgY2Fubm90IGhhdmUKKyAgICAgICAgICAgIC8vIGNoaWxkcmVuCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZWxlbWVudC5jaGlsZHJlbi50b0FycmF5KG5ldyBTdHJpbmdbZWxlbWVudC5jaGlsZHJlbi5zaXplKCldKTsKQEAgLTY4OSwxMCArNzMzLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBmcm9tIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4gCi0gICAgICogIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgbmFtZS4KLSAgICAgKiBAcGFyYW0gYXR0ck5hbWUgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGZyb20gdGhlIHNwZWNpZmllZCBlbGVtZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBlbGVtZW50IG5hbWUuCisgICAgICogQHBhcmFtIGF0dHJOYW1lCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBuYW1lLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyTmFtZSkgewogICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBmaW5kRWxlbWVudChlbGVtZW50TmFtZSk7CkBAIC03MDIsNyArNzQ4LDggQEAKICAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBmcm9tIHRoaXMgZm9ybWF0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBuYW1lLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lKSB7CiAgICAgICAgIEVsZW1lbnQgZWxlbWVudDsKQEAgLTcxNywxOCArNzY0LDIwIEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgb2JqZWN0IHZhbHVlIGZyb20gdGhlIHNwZWNpZmllZCBlbGVtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVPYmplY3RWYWx1ZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZmluZEVsZW1lbnQoZWxlbWVudE5hbWUpOwogICAgICAgICBlbGVtZW50Lm9iamVjdFZhbHVlID0gbnVsbDsKICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBTZXRzIGEgbmV3IGJhc2UgbmFtZSBmb3IgUmVzb3VyY2VCdW5kbGVzIGNvbnRhaW5pbmcgCi0gICAgICogZGVzY3JpcHRpb25zIG9mIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGZvciB0aGlzIGZvcm1hdC4KKyAgICAgKiBTZXRzIGEgbmV3IGJhc2UgbmFtZSBmb3IgUmVzb3VyY2VCdW5kbGVzIGNvbnRhaW5pbmcgZGVzY3JpcHRpb25zIG9mCisgICAgICogZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgZm9yIHRoaXMgZm9ybWF0LgogICAgICAqIAotICAgICAqIEBwYXJhbSByZXNvdXJjZUJhc2VOYW1lIHRoZSBuZXcgcmVzb3VyY2UgYmFzZSBuYW1lLgorICAgICAqIEBwYXJhbSByZXNvdXJjZUJhc2VOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHJlc291cmNlIGJhc2UgbmFtZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSZXNvdXJjZUJhc2VOYW1lKFN0cmluZyByZXNvdXJjZUJhc2VOYW1lKSB7CiAgICAgICAgIGlmIChyZXNvdXJjZUJhc2VOYW1lID09IG51bGwpIHsKQEAgLTc0MCwxMTcgKzc4OSwxODEgQEAKICAgICAvKioKICAgICAgKiBUaGUgQ2xhc3MgRWxlbWVudC4KICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkNsYXNzV2l0aG91dENvbnN0cnVjdG9yIn0pCisgICAgQFN1cHByZXNzV2FybmluZ3MoIHsKKyAgICAgICAgIkNsYXNzV2l0aG91dENvbnN0cnVjdG9yIgorICAgIH0pCiAgICAgcHJpdmF0ZSBjbGFzcyBFbGVtZW50IHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgbmFtZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUuCisgICAgICAgICAqLwogICAgICAgICBTdHJpbmcgbmFtZTsKIAotICAgICAgICAvKiogVGhlIGNoaWxkcmVuLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNoaWxkcmVuLgorICAgICAgICAgKi8KICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgYXR0cmlidXRlcy4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGF0dHJpYnV0ZXMuCisgICAgICAgICAqLwogICAgICAgICBIYXNoTWFwPFN0cmluZywgQXR0bGlzdD4gYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXR0bGlzdD4oKTsKIAotICAgICAgICAvKiogVGhlIG1pbiBjaGlsZHJlbi4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtaW4gY2hpbGRyZW4uCisgICAgICAgICAqLwogICAgICAgICBpbnQgbWluQ2hpbGRyZW47Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIG1heCBjaGlsZHJlbi4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1heCBjaGlsZHJlbi4KKyAgICAgICAgICovCiAgICAgICAgIGludCBtYXhDaGlsZHJlbjsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgY2hpbGQgcG9saWN5LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY2hpbGQgcG9saWN5LgorICAgICAgICAgKi8KICAgICAgICAgaW50IGNoaWxkUG9saWN5OwogCi0gICAgICAgIC8qKiBUaGUgb2JqZWN0IHZhbHVlLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9iamVjdCB2YWx1ZS4KKyAgICAgICAgICovCiAgICAgICAgIE9iamVjdFZhbHVlIG9iamVjdFZhbHVlOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFRoZSBDbGFzcyBBdHRsaXN0LgogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiQ2xhc3NXaXRob3V0Q29uc3RydWN0b3IifSkKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyggeworICAgICAgICAiQ2xhc3NXaXRob3V0Q29uc3RydWN0b3IiCisgICAgfSkKICAgICBwcml2YXRlIGNsYXNzIEF0dGxpc3QgewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBuYW1lLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmFtZS4KKyAgICAgICAgICovCiAgICAgICAgIFN0cmluZyBuYW1lOwogCi0gICAgICAgIC8qKiBUaGUgZGF0YSB0eXBlLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGEgdHlwZS4KKyAgICAgICAgICovCiAgICAgICAgIGludCBkYXRhVHlwZTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgcmVxdWlyZWQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSByZXF1aXJlZC4KKyAgICAgICAgICovCiAgICAgICAgIGJvb2xlYW4gcmVxdWlyZWQ7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGxpc3QgbWluIGxlbmd0aC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGxpc3QgbWluIGxlbmd0aC4KKyAgICAgICAgICovCiAgICAgICAgIGludCBsaXN0TWluTGVuZ3RoOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBsaXN0IG1heCBsZW5ndGguICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBsaXN0IG1heCBsZW5ndGguCisgICAgICAgICAqLwogICAgICAgICBpbnQgbGlzdE1heExlbmd0aDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgZGVmYXVsdCB2YWx1ZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUuCisgICAgICAgICAqLwogICAgICAgICBTdHJpbmcgZGVmYXVsdFZhbHVlOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBlbnVtZXJhdGVkIHZhbHVlcy4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGVudW1lcmF0ZWQgdmFsdWVzLgorICAgICAgICAgKi8KICAgICAgICAgTGlzdDxTdHJpbmc+IGVudW1lcmF0ZWRWYWx1ZXM7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIG1pbiB2YWx1ZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1pbiB2YWx1ZS4KKyAgICAgICAgICovCiAgICAgICAgIFN0cmluZyBtaW5WYWx1ZTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgbWF4IHZhbHVlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWF4IHZhbHVlLgorICAgICAgICAgKi8KICAgICAgICAgU3RyaW5nIG1heFZhbHVlOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBtaW4gaW5jbHVzaXZlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWluIGluY2x1c2l2ZS4KKyAgICAgICAgICovCiAgICAgICAgIGJvb2xlYW4gbWluSW5jbHVzaXZlOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBtYXggaW5jbHVzaXZlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWF4IGluY2x1c2l2ZS4KKyAgICAgICAgICovCiAgICAgICAgIGJvb2xlYW4gbWF4SW5jbHVzaXZlOwogCi0gICAgICAgIC8qKiBUaGUgdmFsdWUgdHlwZS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB2YWx1ZSB0eXBlLgorICAgICAgICAgKi8KICAgICAgICAgaW50IHZhbHVlVHlwZTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBUaGUgQ2xhc3MgT2JqZWN0VmFsdWUuCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJDbGFzc1dpdGhvdXRDb25zdHJ1Y3RvciJ9KQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCB7CisgICAgICAgICJDbGFzc1dpdGhvdXRDb25zdHJ1Y3RvciIKKyAgICB9KQogICAgIHByaXZhdGUgY2xhc3MgT2JqZWN0VmFsdWU8VD4gewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBjbGFzcyB0eXBlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY2xhc3MgdHlwZS4KKyAgICAgICAgICovCiAgICAgICAgIENsYXNzPFQ+IGNsYXNzVHlwZTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgYXJyYXkgbWluIGxlbmd0aC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGFycmF5IG1pbiBsZW5ndGguCisgICAgICAgICAqLwogICAgICAgICBpbnQgYXJyYXlNaW5MZW5ndGg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGFycmF5IG1heCBsZW5ndGguICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhcnJheSBtYXggbGVuZ3RoLgorICAgICAgICAgKi8KICAgICAgICAgaW50IGFycmF5TWF4TGVuZ3RoOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBkZWZhdWx0IHZhbHVlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAgICAgICovCiAgICAgICAgIFQgZGVmYXVsdFZhbHVlOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBlbnVtZXJhdGVkIHZhbHVlcy4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGVudW1lcmF0ZWQgdmFsdWVzLgorICAgICAgICAgKi8KICAgICAgICAgTGlzdDw/IGV4dGVuZHMgVD4gZW51bWVyYXRlZFZhbHVlczsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgbWluIHZhbHVlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWluIHZhbHVlLgorICAgICAgICAgKi8KICAgICAgICAgQ29tcGFyYWJsZTw/IHN1cGVyIFQ+IG1pblZhbHVlOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBtYXggdmFsdWUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtYXggdmFsdWUuCisgICAgICAgICAqLwogICAgICAgICBDb21wYXJhYmxlPD8gc3VwZXIgVD4gbWF4VmFsdWU7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIG1pbiBpbmNsdXNpdmUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtaW4gaW5jbHVzaXZlLgorICAgICAgICAgKi8KICAgICAgICAgYm9vbGVhbiBtaW5JbmNsdXNpdmU7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIG1heCBpbmNsdXNpdmUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtYXggaW5jbHVzaXZlLgorICAgICAgICAgKi8KICAgICAgICAgYm9vbGVhbiBtYXhJbmNsdXNpdmU7CiAKLSAgICAgICAgLyoqIFRoZSB2YWx1ZSB0eXBlLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHZhbHVlIHR5cGUuCisgICAgICAgICAqLwogICAgICAgICBpbnQgdmFsdWVUeXBlOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEZpbmQgZWxlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUuCisgICAgICogQHJldHVybiB0aGUgZWxlbWVudC4KICAgICAgKi8KICAgICBwcml2YXRlIEVsZW1lbnQgZmluZEVsZW1lbnQoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgRWxlbWVudCBlbGVtZW50OwpAQCAtODY0LDE2ICs5NzcsMTggQEAKICAgICAvKioKICAgICAgKiBGaW5kIGF0dHJpYnV0ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGF0dGxpc3QKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBhdHRsaXN0LgogICAgICAqLwogICAgIHByaXZhdGUgQXR0bGlzdCBmaW5kQXR0cmlidXRlKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZmluZEVsZW1lbnQoZWxlbWVudE5hbWUpOwogICAgICAgICBBdHRsaXN0IGF0dHJpYnV0ZTsKICAgICAgICAgaWYgKChhdHRyaWJ1dGUgPSBlbGVtZW50LmF0dHJpYnV0ZXMuZ2V0KGF0dHJpYnV0ZU5hbWUpKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhdHRyaWJ1dGUgbmFtZSBpcyBudWxsIG9yIG5vIHN1Y2ggYXR0cmlidXRlOiAiICsgYXR0cmlidXRlTmFtZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhdHRyaWJ1dGUgbmFtZSBpcyBudWxsIG9yIG5vIHN1Y2ggYXR0cmlidXRlOiAiCisgICAgICAgICAgICAgICAgICAgICsgYXR0cmlidXRlTmFtZSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gYXR0cmlidXRlOwpAQCAtODgyLDkgKzk5Nyw5IEBACiAgICAgLyoqCiAgICAgICogRmluZCBvYmplY3QgdmFsdWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgdmFsdWUKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IHZhbHVlLgogICAgICAqLwogICAgIHByaXZhdGUgT2JqZWN0VmFsdWUgZmluZE9iamVjdFZhbHVlKFN0cmluZyBlbGVtZW50TmFtZSkgewogICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBmaW5kRWxlbWVudChlbGVtZW50TmFtZSk7CkBAIC04OTgsMjMgKzEwMTMsMjUgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSByZXNvdXJjZSBzdHJpbmcuCiAgICAgICogCi0gICAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAgICogQHBhcmFtIGxvY2FsZSB0aGUgbG9jYWxlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVzb3VyY2Ugc3RyaW5nCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleS4KKyAgICAgKiBAcGFyYW0gbG9jYWxlCisgICAgICogICAgICAgICAgICB0aGUgbG9jYWxlLgorICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIHN0cmluZy4KICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKSB7CiAgICAgICAgIGlmIChsb2NhbGUgPT0gbnVsbCkgewogICAgICAgICAgICAgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIEdldCB0aGUgY29udGV4dCBjbGFzcyBsb2FkZXIgYW5kIHRyeSB0byBsb2NhdGUgdGhlIGJ1bmRsZSB3aXRoIGl0IGZpcnN0Ci0gICAgICAgIENsYXNzTG9hZGVyIGNvbnRleHRDbGFzc2xvYWRlciA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uPENsYXNzTG9hZGVyPigpIHsKKyAgICAgICAgLy8gR2V0IHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlciBhbmQgdHJ5IHRvIGxvY2F0ZSB0aGUgYnVuZGxlIHdpdGggaXQKKyAgICAgICAgLy8gZmlyc3QKKyAgICAgICAgQ2xhc3NMb2FkZXIgY29udGV4dENsYXNzbG9hZGVyID0gQWNjZXNzQ29udHJvbGxlcgorICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248Q2xhc3NMb2FkZXI+KCkgewogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgcnVuKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gTm93IHRyeSB0byBnZXQgdGhlIHJlc291cmNlIGJ1bmRsZQogICAgICAgICBSZXNvdXJjZUJ1bmRsZSByYjsKZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT01ldGFkYXRhTm9kZS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPTWV0YWRhdGFOb2RlLmphdmEKaW5kZXggZDVhYjdhNS4uYWRjNmQ2NyAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPTWV0YWRhdGFOb2RlLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPTWV0YWRhdGFOb2RlLmphdmEKQEAgLTI3LDQ3ICsyNyw3MSBAQAogaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCiAvLz8/P0FXVAogLy9pbXBvcnQgb3JnLnczYy5kb20uVHlwZUluZm87CiAvL2ltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7CiAKIC8qKgotICogVGhlIENsYXNzIElJT01ldGFkYXRhTm9kZSByZXByZXNlbnRzIGEgbm9kZSBvZiB0aGUgCi0gKiAoRE9NLXN0eWxlKSBtZXRhZGF0YSB0cmVlLgorICogVGhlIENsYXNzIElJT01ldGFkYXRhTm9kZSByZXByZXNlbnRzIGEgbm9kZSBvZiB0aGUgKERPTS1zdHlsZSkgbWV0YWRhdGEgdHJlZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJSU9NZXRhZGF0YU5vZGUgaW1wbGVtZW50cyBFbGVtZW50LCBOb2RlTGlzdCB7CiAKLSAgICAvKiogVGhlIG5vZGUgbmFtZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbm9kZSBuYW1lLgorICAgICAqLwogICAgIHByaXZhdGUgU3RyaW5nIG5vZGVOYW1lOwotICAgIAotICAgIC8qKiBUaGUgbm9kZSB2YWx1ZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBub2RlIHZhbHVlLgorICAgICAqLwogICAgIHByaXZhdGUgU3RyaW5nIG5vZGVWYWx1ZTsKLSAgICAKLSAgICAvKiogVGhlIGF0dHJpYnV0ZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXR0cmlidXRlcy4KKyAgICAgKi8KICAgICBwcml2YXRlIElJT01ldGFkYXRhTm9kZUxpc3QgYXR0cnMgPSBuZXcgSUlPTWV0YWRhdGFOb2RlTGlzdChuZXcgQXJyYXlMaXN0PElJT01ldGFkYXRhTm9kZT4oKSk7CiAKLSAgICAvKiogVGhlIHBhcmVudCBub2RlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBwYXJlbnQgbm9kZS4KKyAgICAgKi8KICAgICBwcml2YXRlIElJT01ldGFkYXRhTm9kZSBwYXJlbnQ7Ci0gICAgCi0gICAgLyoqIFRoZSBmaXJzdCBjaGlsZCBub2RlLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGZpcnN0IGNoaWxkIG5vZGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBJSU9NZXRhZGF0YU5vZGUgZmlyc3RDaGlsZDsKLSAgICAKLSAgICAvKiogVGhlIGxhc3QgY2hpbGQgbm9kZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBsYXN0IGNoaWxkIG5vZGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBJSU9NZXRhZGF0YU5vZGUgbGFzdENoaWxkOwotICAgIAotICAgIC8qKiBUaGUgcHJldmlvdXMgc2libGluZy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBwcmV2aW91cyBzaWJsaW5nLgorICAgICAqLwogICAgIHByaXZhdGUgSUlPTWV0YWRhdGFOb2RlIHByZXZpb3VzU2libGluZzsKLSAgICAKLSAgICAvKiogVGhlIG5leHQgc2libGluZy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBuZXh0IHNpYmxpbmcuCisgICAgICovCiAgICAgcHJpdmF0ZSBJSU9NZXRhZGF0YU5vZGUgbmV4dFNpYmxpbmc7CiAKLSAgICAvKiogVGhlIG51bWJlciBvZiBjaGlsZHJlbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IG5DaGlsZHJlbjsKIAotICAgIC8qKiBUaGUgdXNlciBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgdXNlciBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KKyAgICAgKi8KICAgICBwcml2YXRlIE9iamVjdCB1c2VyT2JqZWN0OwogCi0gICAgLyoqIFRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhpcyBub2RlLiAqLworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhpcyBub2RlLgorICAgICAqLwogICAgIHByaXZhdGUgU3RyaW5nIHRleHRDb250ZW50OwogCiAgICAgLyoqCkBAIC03OSwxOCArMTAzLDIwIEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGVtcHR5IG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5vZGVOYW1lIHRoZSBub2RlIG5hbWUKKyAgICAgKiBAcGFyYW0gbm9kZU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBub2RlIG5hbWUuCiAgICAgICovCiAgICAgcHVibGljIElJT01ldGFkYXRhTm9kZShTdHJpbmcgbm9kZU5hbWUpIHsKICAgICAgICAgdGhpcy5ub2RlTmFtZSA9IG5vZGVOYW1lOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJSU9NZXRhZGF0YU5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIAotICAgICAqIG5hbWUgYW5kIHZhbHVlLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJSU9NZXRhZGF0YU5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHZhbHVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBub2RlTmFtZSB0aGUgbm9kZSBuYW1lCi0gICAgICogQHBhcmFtIG5vZGVWYWx1ZSB0aGUgbm9kZSB2YWx1ZQorICAgICAqIEBwYXJhbSBub2RlTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5vZGUgbmFtZS4KKyAgICAgKiBAcGFyYW0gbm9kZVZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgbm9kZSB2YWx1ZS4KICAgICAgKi8KICAgICBwcml2YXRlIElJT01ldGFkYXRhTm9kZShTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBub2RlVmFsdWUpIHsKICAgICAgICAgdGhpcy5ub2RlTmFtZSA9IG5vZGVOYW1lOwpAQCAtMTAyLDEyICsxMjgsMTIgQEAKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotICAgICAgICBBdHRyIGF0dHJOb2RlID0gKEF0dHIpIGF0dHJzLmdldE5hbWVkSXRlbShuYW1lKTsKKyAgICAgICAgQXR0ciBhdHRyTm9kZSA9IChBdHRyKWF0dHJzLmdldE5hbWVkSXRlbShuYW1lKTsKICAgICAgICAgcmV0dXJuIChhdHRyTm9kZSA9PSBudWxsKSA/ICIiIDogYXR0ck5vZGUuZ2V0VmFsdWUoKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKSBhdHRycy5nZXROYW1lZEl0ZW0obmFtZSk7CisgICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKWF0dHJzLmdldE5hbWVkSXRlbShuYW1lKTsKICAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkgewogICAgICAgICAgICAgYXR0ci5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0xMTYsNyArMTQyLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBJSU9NZXRhZGF0YUF0dHIgYXR0ciA9IChJSU9NZXRhZGF0YUF0dHIpIGF0dHJzLmdldE5hbWVkSXRlbShuYW1lKTsKKyAgICAgICAgSUlPTWV0YWRhdGFBdHRyIGF0dHIgPSAoSUlPTWV0YWRhdGFBdHRyKWF0dHJzLmdldE5hbWVkSXRlbShuYW1lKTsKICAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkgewogICAgICAgICAgICAgYXR0ci5zZXRPd25lckVsZW1lbnQobnVsbCk7CiAgICAgICAgICAgICBhdHRycy5saXN0LnJlbW92ZShhdHRyKTsKQEAgLTEyNCwxNyArMTUwLDE5IEBACiAgICAgfQogCiAgICAgcHVibGljIEF0dHIgZ2V0QXR0cmlidXRlTm9kZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gKEF0dHIpIGF0dHJzLmdldE5hbWVkSXRlbShuYW1lKTsKKyAgICAgICAgcmV0dXJuIChBdHRyKWF0dHJzLmdldE5hbWVkSXRlbShuYW1lKTsKICAgICB9CiAKICAgICBwdWJsaWMgQXR0ciBzZXRBdHRyaWJ1dGVOb2RlKEF0dHIgbmV3QXR0cikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgYXR0cmlidXRlIGlzIGFscmVhZHkgaW4gdXNlLgogICAgICAgICBFbGVtZW50IG93bmVyID0gbmV3QXR0ci5nZXRPd25lckVsZW1lbnQoKTsKICAgICAgICAgaWYgKG93bmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChvd25lciA9PSB0aGlzKSB7IC8vIFJlcGxhY2luZyBhbiBhdHRyaWJ1dGUgbm9kZSBieSBpdHNlbGYgaGFzIG5vIGVmZmVjdAorICAgICAgICAgICAgaWYgKG93bmVyID09IHRoaXMpIHsgLy8gUmVwbGFjaW5nIGFuIGF0dHJpYnV0ZSBub2RlIGJ5IGl0c2VsZiBoYXMgbm8KKyAgICAgICAgICAgICAgICAvLyBlZmZlY3QKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5VU0VfQVRUUklCVVRFX0VSUiwgIkF0dHJpYnV0ZSBpcyBhbHJlYWR5IGluIHVzZSIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVVNFX0FUVFJJQlVURV9FUlIsCisgICAgICAgICAgICAgICAgICAgICAgICAiQXR0cmlidXRlIGlzIGFscmVhZHkgaW4gdXNlIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTQ2LDcgKzE3NCw3IEBACiAKICAgICAgICAgSUlPTWV0YWRhdGFBdHRyIGlpb0F0dHI7CiAgICAgICAgIGlmIChuZXdBdHRyIGluc3RhbmNlb2YgSUlPTWV0YWRhdGFBdHRyKSB7Ci0gICAgICAgICAgICBpaW9BdHRyID0gKElJT01ldGFkYXRhQXR0cikgbmV3QXR0cjsKKyAgICAgICAgICAgIGlpb0F0dHIgPSAoSUlPTWV0YWRhdGFBdHRyKW5ld0F0dHI7CiAgICAgICAgICAgICBpaW9BdHRyLnNldE93bmVyRWxlbWVudCh0aGlzKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlpb0F0dHIgPSBuZXcgSUlPTWV0YWRhdGFBdHRyKG5hbWUsIG5ld0F0dHIuZ2V0VmFsdWUoKSwgdGhpcyk7CkBAIC0yMDYsNyArMjM0LDggQEAKICAgICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZShsb2NhbE5hbWUpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBxdWFsaWZpZWROYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBxdWFsaWZpZWROYW1lLCBTdHJpbmcgdmFsdWUpCisgICAgICAgICAgICB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKICAgICAgICAgc2V0QXR0cmlidXRlKHF1YWxpZmllZE5hbWUsIHZhbHVlKTsKICAgICB9CiAKQEAgLTIyMiw3ICsyNTEsOCBAQAogICAgICAgICByZXR1cm4gc2V0QXR0cmlidXRlTm9kZShuZXdBdHRyKTsKICAgICB9CiAKLSAgICBwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKQorICAgICAgICAgICAgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBnZXRFbGVtZW50c0J5VGFnTmFtZShsb2NhbE5hbWUpOwogICAgIH0KIApAQCAtMjM0LDIwICsyNjQsMTA1IEBACiAgICAgICAgIHJldHVybiBoYXNBdHRyaWJ1dGUobG9jYWxOYW1lKTsKICAgICB9CiAKLSAgICAvLz8/P0FXVAorICAgIC8vID8/P0FXVAogICAgIC8qCi0gICAgcHVibGljIFR5cGVJbmZvIGdldFNjaGVtYVR5cGVJbmZvKCkgewotICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfSovCisgICAgICogcHVibGljIFR5cGVJbmZvIGdldFNjaGVtYVR5cGVJbmZvKCkgeyB0aHJvdyBuZXcKKyAgICAgKiBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsgfQorICAgICAqLwogCisgICAgLyoqCisgICAgICogPGk+RGVzY3JpcHRpb24gY29waWVkIGZyb20gaW50ZXJmYWNlOiBvcmcudzNjLmRvbS5FbGVtZW50IChET00gTGV2ZWwKKyAgICAgKiAzKTwvaT4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgcGFyYW1ldGVyIGlzSWQgaXMgdHJ1ZSwgdGhpcyBtZXRob2QgZGVjbGFyZXMgdGhlIHNwZWNpZmllZAorICAgICAqIGF0dHJpYnV0ZSB0byBiZSBhIHVzZXItZGV0ZXJtaW5lZCBJRCBhdHRyaWJ1dGUgLiBUaGlzIGFmZmVjdHMgdGhlIHZhbHVlCisgICAgICogb2YgQXR0ci5pc0lkIGFuZCB0aGUgYmVoYXZpb3Igb2YgRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQsIGJ1dCBkb2VzIG5vdAorICAgICAqIGNoYW5nZSBhbnkgc2NoZW1hIHRoYXQgbWF5IGJlIGluIHVzZSwgaW4gcGFydGljdWxhciB0aGlzIGRvZXMgbm90IGFmZmVjdAorICAgICAqIHRoZSBBdHRyLnNjaGVtYVR5cGVJbmZvIG9mIHRoZSBzcGVjaWZpZWQgQXR0ciBub2RlLiBVc2UgdGhlIHZhbHVlIGZhbHNlCisgICAgICogZm9yIHRoZSBwYXJhbWV0ZXIgaXNJZCB0byB1bmRlY2xhcmUgYW4gYXR0cmlidXRlIGZvciBiZWluZyBhCisgICAgICogdXNlci1kZXRlcm1pbmVkIElEIGF0dHJpYnV0ZS4gVG8gc3BlY2lmeSBhbiBhdHRyaWJ1dGUgYnkgbG9jYWwgbmFtZSBhbmQKKyAgICAgKiBuYW1lc3BhY2UgVVJJLCB1c2UgdGhlIHNldElkQXR0cmlidXRlTlMgbWV0aG9kLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gaXNJZAorICAgICAqICAgICAgICAgICAgdGhlIGZsYWcgd2hpY2ggZGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgYXR0cmlidXRlIGlzIG9mIHR5cGUKKyAgICAgKiAgICAgICAgICAgIElELgorICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBET00gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2V0dGluZyB0aGUgYXR0cmlidXRlIHR5cGUuCisgICAgICogICAgICAgICAgICAgPHA+CisgICAgICogICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBub2RlIGlzIHJlYWRvbmx5LgorICAgICAqICAgICAgICAgICAgIDxicj4KKyAgICAgKiAgICAgICAgICAgICBOT1RfRk9VTkRfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIG5vdCBhbgorICAgICAqICAgICAgICAgICAgIGF0dHJpYnV0ZSBvZiB0aGlzIGVsZW1lbnQuCisgICAgICogICAgICAgICAgICAgPC9wPgorICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldElkQXR0cmlidXRlKFN0cmluZyBuYW1lLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24geworICAgIC8qKgorICAgICAqIDxpPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogb3JnLnczYy5kb20uRWxlbWVudCAoRE9NIExldmVsCisgICAgICogMyk8L2k+CisgICAgICogPHA+CisgICAgICogSWYgdGhlIHBhcmFtZXRlciBpc0lkIGlzIHRydWUsIHRoaXMgbWV0aG9kIGRlY2xhcmVzIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBhdHRyaWJ1dGUgdG8gYmUgYSB1c2VyLWRldGVybWluZWQgSUQgYXR0cmlidXRlIC4gVGhpcyBhZmZlY3RzIHRoZSB2YWx1ZQorICAgICAqIG9mIEF0dHIuaXNJZCBhbmQgdGhlIGJlaGF2aW9yIG9mIERvY3VtZW50LmdldEVsZW1lbnRCeUlkLCBidXQgZG9lcyBub3QKKyAgICAgKiBjaGFuZ2UgYW55IHNjaGVtYSB0aGF0IG1heSBiZSBpbiB1c2UsIGluIHBhcnRpY3VsYXIgdGhpcyBkb2VzIG5vdCBhZmZlY3QKKyAgICAgKiB0aGUgQXR0ci5zY2hlbWFUeXBlSW5mbyBvZiB0aGUgc3BlY2lmaWVkIEF0dHIgbm9kZS4gVXNlIHRoZSB2YWx1ZSBmYWxzZQorICAgICAqIGZvciB0aGUgcGFyYW1ldGVyIGlzSWQgdG8gdW5kZWNsYXJlIGFuIGF0dHJpYnV0ZSBmb3IgYmVpbmcgYQorICAgICAqIHVzZXItZGV0ZXJtaW5lZCBJRCBhdHRyaWJ1dGUuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGxvY2FsTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gaXNJZAorICAgICAqICAgICAgICAgICAgdGhlIGZsYWcgd2hpY2ggZGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgYXR0cmlidXRlIGlzIG9mIHR5cGUKKyAgICAgKiAgICAgICAgICAgIElELgorICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBET00gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2V0dGluZyB0aGUgYXR0cmlidXRlIHR5cGUuCisgICAgICogICAgICAgICAgICAgPHA+CisgICAgICogICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBub2RlIGlzIHJlYWRvbmx5LgorICAgICAqICAgICAgICAgICAgIDxicj4KKyAgICAgKiAgICAgICAgICAgICBOT1RfRk9VTkRfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIG5vdCBhbgorICAgICAqICAgICAgICAgICAgIGF0dHJpYnV0ZSBvZiB0aGlzIGVsZW1lbnQuCisgICAgICogICAgICAgICAgICAgPC9wPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElkQXR0cmlidXRlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgYm9vbGVhbiBpc0lkKQorICAgICAgICAgICAgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiA8aT5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBpbnRlcmZhY2U6IG9yZy53M2MuZG9tLkVsZW1lbnQgKERPTSBMZXZlbAorICAgICAqIDMpPC9pPgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBwYXJhbWV0ZXIgaXNJZCBpcyB0cnVlLCB0aGlzIG1ldGhvZCBkZWNsYXJlcyB0aGUgc3BlY2lmaWVkCisgICAgICogYXR0cmlidXRlIHRvIGJlIGEgdXNlci1kZXRlcm1pbmVkIElEIGF0dHJpYnV0ZSAuIFRoaXMgYWZmZWN0cyB0aGUgdmFsdWUKKyAgICAgKiBvZiBBdHRyLmlzSWQgYW5kIHRoZSBiZWhhdmlvciBvZiBEb2N1bWVudC5nZXRFbGVtZW50QnlJZCwgYnV0IGRvZXMgbm90CisgICAgICogY2hhbmdlIGFueSBzY2hlbWEgdGhhdCBtYXkgYmUgaW4gdXNlLCBpbiBwYXJ0aWN1bGFyIHRoaXMgZG9lcyBub3QgYWZmZWN0CisgICAgICogdGhlIEF0dHIuc2NoZW1hVHlwZUluZm8gb2YgdGhlIHNwZWNpZmllZCBBdHRyIG5vZGUuIFVzZSB0aGUgdmFsdWUgZmFsc2UKKyAgICAgKiBmb3IgdGhlIHBhcmFtZXRlciBpc0lkIHRvIHVuZGVjbGFyZSBhbiBhdHRyaWJ1dGUgZm9yIGJlaW5nIGEKKyAgICAgKiB1c2VyLWRldGVybWluZWQgSUQgYXR0cmlidXRlLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaWRBdHRyCisgICAgICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIG5vZGUuCisgICAgICogQHBhcmFtIGlzSWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbGFnIHdoaWNoIGRldGVybWluZXMgd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyBvZiB0eXBlCisgICAgICogICAgICAgICAgICBJRC4KKyAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgRE9NIGVycm9yIG9jY3VycmVkIHdoaWxlIHNldHRpbmcgdGhlIGF0dHJpYnV0ZSB0eXBlLgorICAgICAqICAgICAgICAgICAgIDxwPgorICAgICAqICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyByZWFkb25seS4KKyAgICAgKiAgICAgICAgICAgICA8YnI+CisgICAgICogICAgICAgICAgICAgTk9UX0ZPVU5EX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBub3QgYW4KKyAgICAgKiAgICAgICAgICAgICBhdHRyaWJ1dGUgb2YgdGhpcyBlbGVtZW50LgorICAgICAqICAgICAgICAgICAgIDwvcD4KKyAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZU5vZGUoQXR0ciBpZEF0dHIsIGJvb2xlYW4gaXNJZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsKICAgICB9CkBAIC0zMDUsOCArNDIwLDggQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5ld0NoaWxkID09IG51bGwhIik7CiAgICAgICAgIH0KIAotICAgICAgICBJSU9NZXRhZGF0YU5vZGUgbmV3SUlPQ2hpbGQgPSAoSUlPTWV0YWRhdGFOb2RlKSBuZXdDaGlsZDsKLSAgICAgICAgSUlPTWV0YWRhdGFOb2RlIHJlZklJT0NoaWxkID0gKElJT01ldGFkYXRhTm9kZSkgcmVmQ2hpbGQ7CisgICAgICAgIElJT01ldGFkYXRhTm9kZSBuZXdJSU9DaGlsZCA9IChJSU9NZXRhZGF0YU5vZGUpbmV3Q2hpbGQ7CisgICAgICAgIElJT01ldGFkYXRhTm9kZSByZWZJSU9DaGlsZCA9IChJSU9NZXRhZGF0YU5vZGUpcmVmQ2hpbGQ7CiAKICAgICAgICAgbmV3SUlPQ2hpbGQucGFyZW50ID0gdGhpczsKIApAQCAtMzQ5LDggKzQ2NCw4IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuZXdDaGlsZCA9PSBudWxsISIpOwogICAgICAgICB9CiAKLSAgICAgICAgSUlPTWV0YWRhdGFOb2RlIG5ld0lJT0NoaWxkID0gKElJT01ldGFkYXRhTm9kZSkgbmV3Q2hpbGQ7Ci0gICAgICAgIElJT01ldGFkYXRhTm9kZSBvbGRJSU9DaGlsZCA9IChJSU9NZXRhZGF0YU5vZGUpIG9sZENoaWxkOworICAgICAgICBJSU9NZXRhZGF0YU5vZGUgbmV3SUlPQ2hpbGQgPSAoSUlPTWV0YWRhdGFOb2RlKW5ld0NoaWxkOworICAgICAgICBJSU9NZXRhZGF0YU5vZGUgb2xkSUlPQ2hpbGQgPSAoSUlPTWV0YWRhdGFOb2RlKW9sZENoaWxkOwogCiAgICAgICAgIElJT01ldGFkYXRhTm9kZSBuZXh0ID0gb2xkSUlPQ2hpbGQubmV4dFNpYmxpbmc7CiAgICAgICAgIElJT01ldGFkYXRhTm9kZSBwcmV2aW91cyA9IG9sZElJT0NoaWxkLnByZXZpb3VzU2libGluZzsKQEAgLTM4OSw3ICs1MDQsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib2xkQ2hpbGQgPT0gbnVsbCEiKTsKICAgICAgICAgfQogCi0gICAgICAgIElJT01ldGFkYXRhTm9kZSBvbGRJSU9DaGlsZCA9IChJSU9NZXRhZGF0YU5vZGUpIG9sZENoaWxkOworICAgICAgICBJSU9NZXRhZGF0YU5vZGUgb2xkSUlPQ2hpbGQgPSAoSUlPTWV0YWRhdGFOb2RlKW9sZENoaWxkOwogCiAgICAgICAgIC8vIEZpeCBuZXh0IGFuZCBwcmV2aW91cwogICAgICAgICBJSU9NZXRhZGF0YU5vZGUgcHJldmlvdXMgPSBvbGRJSU9DaGlsZC5wcmV2aW91c1NpYmxpbmc7CkBAIC00MzksNyArNTU0LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBjbG9uZWQ7ICAvL1RvIGNoYW5nZSBib2R5IG9mIGltcGxlbWVudGVkIG1ldGhvZHMgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgorICAgICAgICByZXR1cm4gY2xvbmVkOyAvLyBUbyBjaGFuZ2UgYm9keSBvZiBpbXBsZW1lbnRlZCBtZXRob2RzIHVzZSBGaWxlIHwKKyAgICAgICAgLy8gU2V0dGluZ3MgfCBGaWxlIFRlbXBsYXRlcy4KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBub3JtYWxpemUoKSB7CkBAIC00NzAsNTIgKzU4NiwzMTQgQEAKICAgICAgICAgcmV0dXJuIGF0dHJzLmxpc3Quc2l6ZSgpID4gMDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiA8aT5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBpbnRlcmZhY2U6IG9yZy53M2MuZG9tLk5vZGUgKERPTSBMZXZlbCAzKTwvaT4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgYWJzb2x1dGUgYmFzZSBVUkkgb2YgdGhpcyBub2RlIG9yIG51bGwgaWYgdGhlIGltcGxlbWVudGF0aW9uIHdhc24ndAorICAgICAqIGFibGUgdG8gb2J0YWluIGFuIGFic29sdXRlIFVSSS4gVGhpcyB2YWx1ZSBpcyBjb21wdXRlZCBhcyBkZXNjcmliZWQgaW4uCisgICAgICogSG93ZXZlciwgd2hlbiB0aGUgRG9jdW1lbnQgc3VwcG9ydHMgdGhlIGZlYXR1cmUgIkhUTUwiIFtET00gTGV2ZWwgMgorICAgICAqIEhUTUxdLCB0aGUgYmFzZSBVUkkgaXMgY29tcHV0ZWQgdXNpbmcgZmlyc3QgdGhlIHZhbHVlIG9mIHRoZSBocmVmCisgICAgICogYXR0cmlidXRlIG9mIHRoZSBIVE1MIEJBU0UgZWxlbWVudCBpZiBhbnksIGFuZCB0aGUgdmFsdWUgb2YgdGhlCisgICAgICogZG9jdW1lbnRVUkkgYXR0cmlidXRlIGZyb20gdGhlIERvY3VtZW50IGludGVyZmFjZSBvdGhlcndpc2UuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWJzb2x1dGUgYmFzZSBVUkkuCisgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRCYXNlVVJJKCkgewogICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogPGk+RGVzY3JpcHRpb24gY29waWVkIGZyb20gaW50ZXJmYWNlOiBvcmcudzNjLmRvbS5Ob2RlIChET00gTGV2ZWwgMyk8L2k+CisgICAgICogPHA+CisgICAgICogQ29tcGFyZXMgdGhlIHJlZmVyZW5jZSBub2RlLCBpLmUuIHRoZSBub2RlIG9uIHdoaWNoIHRoaXMgbWV0aG9kIGlzIGJlaW5nCisgICAgICogY2FsbGVkLCB3aXRoIGEgbm9kZSwgaS5lLiB0aGUgb25lIHBhc3NlZCBhcyBhIHBhcmFtZXRlciwgd2l0aCByZWdhcmQgdG8KKyAgICAgKiB0aGVpciBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQgYW5kIGFjY29yZGluZyB0byB0aGUgZG9jdW1lbnQgb3JkZXIuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBvdGhlcgorICAgICAqICAgICAgICAgICAgdGhlIG5vZGUgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSByZWZlcmVuY2Ugbm9kZS4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgaG93IHRoZSBub2RlIGlzIHBvc2l0aW9uZWQgcmVsYXRpdmVseSB0byB0aGUgcmVmZXJlbmNlCisgICAgICogICAgICAgICBub2RlLgorICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgTk9UX1NVUFBPUlRFRF9FUlI6IHdoZW4gdGhlIGNvbXBhcmVkIG5vZGVzIGFyZSBmcm9tIGRpZmZlcmVudAorICAgICAqICAgICAgICAgICAgIERPTSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkbyBub3QgY29vcmRpbmF0ZSB0byByZXR1cm4KKyAgICAgKiAgICAgICAgICAgICBjb25zaXN0ZW50IGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlc3VsdHMuCisgICAgICovCiAgICAgcHVibGljIHNob3J0IGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKE5vZGUgb3RoZXIpIHRocm93cyBET01FeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogPGk+RGVzY3JpcHRpb24gY29waWVkIGZyb20gaW50ZXJmYWNlOiBvcmcudzNjLmRvbS5Ob2RlIChET00gTGV2ZWwgMyk8L2k+CisgICAgICogPHA+CisgICAgICogVGhpcyBhdHRyaWJ1dGUgcmV0dXJucyB0aGUgdGV4dCBjb250ZW50IG9mIHRoaXMgbm9kZSBhbmQgaXRzIGRlc2NlbmRhbnRzLgorICAgICAqIFdoZW4gaXQgaXMgZGVmaW5lZCB0byBiZSBudWxsLCBzZXR0aW5nIGl0IGhhcyBubyBlZmZlY3QuIE9uIHNldHRpbmcsIGFueQorICAgICAqIHBvc3NpYmxlIGNoaWxkcmVuIHRoaXMgbm9kZSBtYXkgaGF2ZSBhcmUgcmVtb3ZlZCBhbmQsIGlmIGl0IHRoZSBuZXcKKyAgICAgKiBzdHJpbmcgaXMgbm90IGVtcHR5IG9yIG51bGwsIHJlcGxhY2VkIGJ5IGEgc2luZ2xlIFRleHQgbm9kZSBjb250YWluaW5nCisgICAgICogdGhlIHN0cmluZyB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8uIE9uIGdldHRpbmcsIG5vIHNlcmlhbGl6YXRpb24gaXMKKyAgICAgKiBwZXJmb3JtZWQsIHRoZSByZXR1cm5lZCBzdHJpbmcgZG9lcyBub3QgY29udGFpbiBhbnkgbWFya3VwLiBObyB3aGl0ZXNwYWNlCisgICAgICogbm9ybWFsaXphdGlvbiBpcyBwZXJmb3JtZWQgYW5kIHRoZSByZXR1cm5lZCBzdHJpbmcgZG9lcyBub3QgY29udGFpbiB0aGUKKyAgICAgKiB3aGl0ZSBzcGFjZXMgaW4gZWxlbWVudCBjb250ZW50IChzZWUgdGhlIGF0dHJpYnV0ZQorICAgICAqIFRleHQuaXNFbGVtZW50Q29udGVudFdoaXRlc3BhY2UpLiBTaW1pbGFybHksIG9uIHNldHRpbmcsIG5vIHBhcnNpbmcgaXMKKyAgICAgKiBwZXJmb3JtZWQgZWl0aGVyLCB0aGUgaW5wdXQgc3RyaW5nIGlzIHRha2VuIGFzIHB1cmUgdGV4dHVhbCBjb250ZW50LiBUaGUKKyAgICAgKiBzdHJpbmcgcmV0dXJuZWQgaXMgbWFkZSBvZiB0aGUgdGV4dCBjb250ZW50IG9mIHRoaXMgbm9kZSBkZXBlbmRpbmcgb24gaXRzCisgICAgICogdHlwZSwgYXMgZGVmaW5lZCBiZWxvdzoKKyAgICAgKiA8dGFibGU+CisgICAgICogPHRyPgorICAgICAqIDx0ZD48c3Ryb25nPk5vZGUgdHlwZTwvc3Ryb25nPjwvdGQ+CisgICAgICogPHRkPjxzdHJvbmc+Q29udGVudDwvc3Ryb25nPjwvdGQ+CisgICAgICogPC90cj4KKyAgICAgKiA8dHI+CisgICAgICogPHRkPkVMRU1FTlRfTk9ERSwgQVRUUklCVVRFX05PREUsIEVOVElUWV9OT0RFLCBFTlRJVFlfUkVGRVJFTkNFX05PREUsCisgICAgICogRE9DVU1FTlRfRlJBR01FTlRfTk9ERTwvdGQ+CisgICAgICogPHRkPmNvbmNhdGVuYXRpb24gb2YgdGhlIHRleHRDb250ZW50IGF0dHJpYnV0ZSB2YWx1ZSBvZiBldmVyeSBjaGlsZCBub2RlLAorICAgICAqIGV4Y2x1ZGluZyBDT01NRU5UX05PREUgYW5kIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSBub2Rlcy4gVGhpcyBpcyB0aGUKKyAgICAgKiBlbXB0eSBzdHJpbmcgaWYgdGhlIG5vZGUgaGFzIG5vIGNoaWxkcmVuLjwvdGQ+CisgICAgICogPC90cj4KKyAgICAgKiA8dHI+CisgICAgICogPHRkPlRFWFRfTk9ERSwgQ0RBVEFfU0VDVElPTl9OT0RFLCBDT01NRU5UX05PREUsCisgICAgICogUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFPC90ZD4KKyAgICAgKiA8dGQ+bm9kZVZhbHVlPC90ZD4KKyAgICAgKiA8L3RyPgorICAgICAqIDx0cj4KKyAgICAgKiA8dGQ+RE9DVU1FTlRfTk9ERSwgRE9DVU1FTlRfVFlQRV9OT0RFLCBOT1RBVElPTl9OT0RFPC90ZD4KKyAgICAgKiA8dGQ+bnVsbDwvdGQ+CisgICAgICogPC90cj4KKyAgICAgKiA8L3RhYmxlPgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB0ZXh0IGNvbnRlbnQgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHRoaXMgbm9kZS4KKyAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIERPTVNUUklOR19TSVpFX0VSUjogUmFpc2VkIHdoZW4gaXQgd291bGQgcmV0dXJuIG1vcmUKKyAgICAgKiAgICAgICAgICAgICBjaGFyYWN0ZXJzIHRoYW4gZml0IGluIGEgRE9NU3RyaW5nIHZhcmlhYmxlIG9uIHRoZQorICAgICAqICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHBsYXRmb3JtLgorICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dENvbnRlbnQoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIHRleHRDb250ZW50OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIDxpPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogb3JnLnczYy5kb20uTm9kZSAoRE9NIExldmVsIDMpPC9pPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYXR0cmlidXRlIHJldHVybnMgdGhlIHRleHQgY29udGVudCBvZiB0aGlzIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cy4KKyAgICAgKiBXaGVuIGl0IGlzIGRlZmluZWQgdG8gYmUgbnVsbCwgc2V0dGluZyBpdCBoYXMgbm8gZWZmZWN0LiBPbiBzZXR0aW5nLCBhbnkKKyAgICAgKiBwb3NzaWJsZSBjaGlsZHJlbiB0aGlzIG5vZGUgbWF5IGhhdmUgYXJlIHJlbW92ZWQgYW5kLCBpZiBpdCB0aGUgbmV3CisgICAgICogc3RyaW5nIGlzIG5vdCBlbXB0eSBvciBudWxsLCByZXBsYWNlZCBieSBhIHNpbmdsZSBUZXh0IG5vZGUgY29udGFpbmluZworICAgICAqIHRoZSBzdHJpbmcgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvLiBPbiBnZXR0aW5nLCBubyBzZXJpYWxpemF0aW9uIGlzCisgICAgICogcGVyZm9ybWVkLCB0aGUgcmV0dXJuZWQgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gYW55IG1hcmt1cC4gTm8gd2hpdGVzcGFjZQorICAgICAqIG5vcm1hbGl6YXRpb24gaXMgcGVyZm9ybWVkIGFuZCB0aGUgcmV0dXJuZWQgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gdGhlCisgICAgICogd2hpdGUgc3BhY2VzIGluIGVsZW1lbnQgY29udGVudCAoc2VlIHRoZSBhdHRyaWJ1dGUKKyAgICAgKiBUZXh0LmlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKS4gU2ltaWxhcmx5LCBvbiBzZXR0aW5nLCBubyBwYXJzaW5nIGlzCisgICAgICogcGVyZm9ybWVkIGVpdGhlciwgdGhlIGlucHV0IHN0cmluZyBpcyB0YWtlbiBhcyBwdXJlIHRleHR1YWwgY29udGVudC4gVGhlCisgICAgICogc3RyaW5nIHJldHVybmVkIGlzIG1hZGUgb2YgdGhlIHRleHQgY29udGVudCBvZiB0aGlzIG5vZGUgZGVwZW5kaW5nIG9uIGl0cworICAgICAqIHR5cGUsIGFzIGRlZmluZWQgYmVsb3c6CisgICAgICogPHRhYmxlPgorICAgICAqIDx0cj4KKyAgICAgKiA8dGQ+PHN0cm9uZz5Ob2RlIHR5cGU8L3N0cm9uZz48L3RkPgorICAgICAqIDx0ZD48c3Ryb25nPkNvbnRlbnQ8L3N0cm9uZz48L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgorICAgICAqIDx0ZD5FTEVNRU5UX05PREUsIEFUVFJJQlVURV9OT0RFLCBFTlRJVFlfTk9ERSwgRU5USVRZX1JFRkVSRU5DRV9OT0RFLAorICAgICAqIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU8L3RkPgorICAgICAqIDx0ZD5jb25jYXRlbmF0aW9uIG9mIHRoZSB0ZXh0Q29udGVudCBhdHRyaWJ1dGUgdmFsdWUgb2YgZXZlcnkgY2hpbGQgbm9kZSwKKyAgICAgKiBleGNsdWRpbmcgQ09NTUVOVF9OT0RFIGFuZCBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgbm9kZXMuIFRoaXMgaXMgdGhlCisgICAgICogZW1wdHkgc3RyaW5nIGlmIHRoZSBub2RlIGhhcyBubyBjaGlsZHJlbi48L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgorICAgICAqIDx0ZD5URVhUX05PREUsIENEQVRBX1NFQ1RJT05fTk9ERSwgQ09NTUVOVF9OT0RFLAorICAgICAqIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTwvdGQ+CisgICAgICogPHRkPm5vZGVWYWx1ZTwvdGQ+CisgICAgICogPC90cj4KKyAgICAgKiA8dHI+CisgICAgICogPHRkPkRPQ1VNRU5UX05PREUsIERPQ1VNRU5UX1RZUEVfTk9ERSwgTk9UQVRJT05fTk9ERTwvdGQ+CisgICAgICogPHRkPm51bGw8L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPC90YWJsZT4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIHRleHRDb250ZW50CisgICAgICogICAgICAgICAgICB0aGUgdGV4dCBjb250ZW50IGZvciB0aGlzIG5vZGUuCisgICAgICogQHRocm93cyBET01FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCB3aGVuIHRoZSBub2RlIGlzCisgICAgICogICAgICAgICAgICAgcmVhZG9ubHkuCisgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGV4dENvbnRlbnQoU3RyaW5nIHRleHRDb250ZW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHRleHRDb250ZW50OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIDxpPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogb3JnLnczYy5kb20uTm9kZSAoRE9NIExldmVsIDMpPC9pPgorICAgICAqIDxwPgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIG5vZGUgaXMgdGhlIHNhbWUgbm9kZSBhcyB0aGUgZ2l2ZW4gb25lLiBUaGlzIG1ldGhvZAorICAgICAqIHByb3ZpZGVzIGEgd2F5IHRvIGRldGVybWluZSB3aGV0aGVyIHR3byBOb2RlIHJlZmVyZW5jZXMgcmV0dXJuZWQgYnkgdGhlCisgICAgICogaW1wbGVtZW50YXRpb24gcmVmZXJlbmNlIHRoZSBzYW1lIG9iamVjdC4gV2hlbiB0d28gTm9kZSByZWZlcmVuY2VzIGFyZQorICAgICAqIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgb2JqZWN0LCBldmVuIGlmIHRocm91Z2ggYSBwcm94eSwgdGhlIHJlZmVyZW5jZXMKKyAgICAgKiBtYXkgYmUgdXNlZCBjb21wbGV0ZWx5IGludGVyY2hhbmdlYWJseSwgc3VjaCB0aGF0IGFsbCBhdHRyaWJ1dGVzIGhhdmUgdGhlCisgICAgICogc2FtZSB2YWx1ZXMgYW5kIGNhbGxpbmcgdGhlIHNhbWUgRE9NIG1ldGhvZCBvbiBlaXRoZXIgcmVmZXJlbmNlIGFsd2F5cworICAgICAqIGhhcyBleGFjdGx5IHRoZSBzYW1lIGVmZmVjdC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIG90aGVyCisgICAgICogICAgICAgICAgICB0aGUgbm9kZSB0byB0ZXN0IGFnYWluc3QuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgbm9kZXMgYXJlIHRoZSBzYW1lLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNTYW1lTm9kZShOb2RlIG90aGVyKSB7CiAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiA8aT5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBpbnRlcmZhY2U6IG9yZy53M2MuZG9tLk5vZGUgKERPTSBMZXZlbCAzKTwvaT4KKyAgICAgKiA8cD4KKyAgICAgKiBMb29rIHVwIHRoZSBwcmVmaXggYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gbmFtZXNwYWNlIFVSSSwgc3RhcnRpbmcgZnJvbQorICAgICAqIHRoaXMgbm9kZS4gVGhlIGRlZmF1bHQgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBhcmUgaWdub3JlZCBieSB0aGlzIG1ldGhvZC4KKyAgICAgKiBTZWUgZm9yIGRldGFpbHMgb24gdGhlIGFsZ29yaXRobSB1c2VkIGJ5IHRoaXMgbWV0aG9kLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCisgICAgICogICAgICAgICAgICB0aGUgbmFtZXNwYWNlIFVSSSB0byBsb29rIGZvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBhc3NvY2lhdGVkIG5hbWVzcGFjZSBwcmVmaXggaWYgZm91bmQgb3IgbnVsbCBpZiBub25lIGlzCisgICAgICogICAgICAgICBmb3VuZC4gSWYgbW9yZSB0aGFuIG9uZSBwcmVmaXggYXJlIGFzc29jaWF0ZWQgdG8gdGhlIG5hbWVzcGFjZQorICAgICAqICAgICAgICAgcHJlZml4LCB0aGUgcmV0dXJuZWQgbmFtZXNwYWNlIHByZWZpeCBpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqICAgICAgICAgZGVwZW5kZW50LgorICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgbG9va3VwUHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJNZXRob2Qgbm90IHN1cHBvcnRlZCIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIDxpPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogb3JnLnczYy5kb20uTm9kZSAoRE9NIExldmVsIDMpPC9pPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZVVSSSBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKKyAgICAgKiBvciBub3QuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lc3BhY2UgVVJJIHRvIGxvb2sgZm9yLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBuYW1lc3BhY2VVUkkgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlLAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlVVJJKSB7CiAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiA8aT5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBpbnRlcmZhY2U6IG9yZy53M2MuZG9tLk5vZGUgKERPTSBMZXZlbCAzKTwvaT4KKyAgICAgKiA8cD4KKyAgICAgKiBMb29rIHVwIHRoZSBuYW1lc3BhY2UgVVJJIGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIHByZWZpeCwgc3RhcnRpbmcgZnJvbQorICAgICAqIHRoaXMgbm9kZS4gU2VlIGZvciBkZXRhaWxzIG9uIHRoZSBhbGdvcml0aG0gdXNlZCBieSB0aGlzIG1ldGhvZC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIHByZWZpeAorICAgICAqICAgICAgICAgICAgdGhlIHByZWZpeCB0byBsb29rIGZvci4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgbnVsbCwgdGhlIG1ldGhvZAorICAgICAqICAgICAgICAgICAgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgbmFtZXNwYWNlIFVSSSBpZiBhbnkuCisgICAgICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCBuYW1lc3BhY2UgVVJJIG9yIG51bGwgaWYgbm9uZSBpcyBmb3VuZC4KKyAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGxvb2t1cE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7CiAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiA8aT5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBpbnRlcmZhY2U6IG9yZy53M2MuZG9tLk5vZGUgKERPTSBMZXZlbCAzKTwvaT4KKyAgICAgKiA8cD4KKyAgICAgKiBUZXN0cyB3aGV0aGVyIHR3byBub2RlcyBhcmUgZXF1YWwuIFRoaXMgbWV0aG9kIHRlc3RzIGZvciBlcXVhbGl0eSBvZgorICAgICAqIG5vZGVzLCBub3Qgc2FtZW5lc3MgKGkuZS4sIHdoZXRoZXIgdGhlIHR3byBub2RlcyBhcmUgcmVmZXJlbmNlcyB0byB0aGUKKyAgICAgKiBzYW1lIG9iamVjdCkgd2hpY2ggY2FuIGJlIHRlc3RlZCB3aXRoIE5vZGUuaXNTYW1lTm9kZSgpLiBBbGwgbm9kZXMgdGhhdAorICAgICAqIGFyZSB0aGUgc2FtZSB3aWxsIGFsc28gYmUgZXF1YWwsIHRob3VnaCB0aGUgcmV2ZXJzZSBtYXkgbm90IGJlIHRydWUuIFR3bworICAgICAqIG5vZGVzIGFyZSBlcXVhbCBpZiBhbmQgb25seSBpZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHNhdGlzZmllZDoKKyAgICAgKiA8cD4KKyAgICAgKiA8bGk+VGhlIHR3byBub2RlcyBhcmUgb2YgdGhlIHNhbWUgdHlwZS48L2xpPgorICAgICAqIDxsaT5UaGUgZm9sbG93aW5nIHN0cmluZyBhdHRyaWJ1dGVzIGFyZSBlcXVhbDogbm9kZU5hbWUsIGxvY2FsTmFtZSwKKyAgICAgKiBuYW1lc3BhY2VVUkksIHByZWZpeCwgbm9kZVZhbHVlIC4gVGhpcyBpczogdGhleSBhcmUgYm90aCBudWxsLCBvciB0aGV5CisgICAgICogaGF2ZSB0aGUgc2FtZSBsZW5ndGggYW5kIGFyZSBjaGFyYWN0ZXIgZm9yIGNoYXJhY3RlciBpZGVudGljYWwuPC9saT4KKyAgICAgKiA8bGk+VGhlIGF0dHJpYnV0ZXMgTmFtZWROb2RlTWFwcyBhcmUgZXF1YWwuIFRoaXMgaXM6IHRoZXkgYXJlIGJvdGggbnVsbCwKKyAgICAgKiBvciB0aGV5IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZCBmb3IgZWFjaCBub2RlIHRoYXQgZXhpc3RzIGluIG9uZSBtYXAKKyAgICAgKiB0aGVyZSBpcyBhIG5vZGUgdGhhdCBleGlzdHMgaW4gdGhlIG90aGVyIG1hcCBhbmQgaXMgZXF1YWwsIGFsdGhvdWdoIG5vdAorICAgICAqIG5lY2Vzc2FyaWx5IGF0IHRoZSBzYW1lIGluZGV4LjwvbGk+CisgICAgICogPGxpPlRoZSBjaGlsZE5vZGVzIE5vZGVMaXN0cyBhcmUgZXF1YWwuIFRoaXMgaXM6IHRoZXkgYXJlIGJvdGggbnVsbCwgb3IKKyAgICAgKiB0aGV5IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZCBjb250YWluIGVxdWFsIG5vZGVzIGF0IHRoZSBzYW1lIGluZGV4LiBOb3RlCisgICAgICogdGhhdCBub3JtYWxpemF0aW9uIGNhbiBhZmZlY3QgZXF1YWxpdHk7IHRvIGF2b2lkIHRoaXMsIG5vZGVzIHNob3VsZCBiZQorICAgICAqIG5vcm1hbGl6ZWQgYmVmb3JlIGJlaW5nIGNvbXBhcmVkLjwvbGk+CisgICAgICogPC9wPgorICAgICAqIEZvciB0d28gRG9jdW1lbnRUeXBlIG5vZGVzIHRvIGJlIGVxdWFsLCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgbXVzdAorICAgICAqIGFsc28gYmUgc2F0aXNmaWVkOgorICAgICAqIDxwPgorICAgICAqIDxsaT5UaGUgZm9sbG93aW5nIHN0cmluZyBhdHRyaWJ1dGVzIGFyZSBlcXVhbDogcHVibGljSWQsIHN5c3RlbUlkLAorICAgICAqIGludGVybmFsU3Vic2V0LjwvbGk+CisgICAgICogPGxpPlRoZSBlbnRpdGllcyBOYW1lZE5vZGVNYXBzIGFyZSBlcXVhbC48L2xpPgorICAgICAqIDxsaT5UaGUgbm90YXRpb25zIE5hbWVkTm9kZU1hcHMgYXJlIGVxdWFsLjwvbGk+CisgICAgICogPC9wPgorICAgICAqIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgZm9sbG93aW5nIGRvIG5vdCBhZmZlY3QgZXF1YWxpdHk6IHRoZQorICAgICAqIG93bmVyRG9jdW1lbnQsIGJhc2VVUkksIGFuZCBwYXJlbnROb2RlIGF0dHJpYnV0ZXMsIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBhdHRyaWJ1dGUgZm9yIEF0dHIgbm9kZXMsIHRoZSBzY2hlbWFUeXBlSW5mbyBhdHRyaWJ1dGUgZm9yIEF0dHIgYW5kCisgICAgICogRWxlbWVudCBub2RlcywgdGhlIFRleHQuaXNFbGVtZW50Q29udGVudFdoaXRlc3BhY2UgYXR0cmlidXRlIGZvciBUZXh0CisgICAgICogbm9kZXMsIGFzIHdlbGwgYXMgYW55IHVzZXIgZGF0YSBvciBldmVudCBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBvbiB0aGUKKyAgICAgKiBub2Rlcy4gPC9wPgorICAgICAqIDxwPgorICAgICAqIE5vdGU6IEFzIGEgZ2VuZXJhbCBydWxlLCBhbnl0aGluZyBub3QgbWVudGlvbmVkIGluIHRoZSBkZXNjcmlwdGlvbiBhYm92ZQorICAgICAqIGlzIG5vdCBzaWduaWZpY2FudCBpbiBjb25zaWRlcmF0aW9uIG9mIGVxdWFsaXR5IGNoZWNraW5nLiBOb3RlIHRoYXQKKyAgICAgKiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIG1heSB0YWtlIGludG8gYWNjb3VudCBtb3JlCisgICAgICogYXR0cmlidXRlcyBhbmQgaW1wbGVtZW50YXRpb25zIGNvbmZvcm0gdG8gdGhpcyBzcGVjaWZpY2F0aW9uIGFyZSBleHBlY3RlZAorICAgICAqIHRvIGJlIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBub2RlIHRvIGNvbXBhcmUgZXF1YWxpdHkgd2l0aC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBub2RlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0VxdWFsTm9kZShOb2RlIGFyZykgewogICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogPGk+RGVzY3JpcHRpb24gY29waWVkIGZyb20gaW50ZXJmYWNlOiBvcmcudzNjLmRvbS5Ob2RlIChET00gTGV2ZWwgMyk8L2k+CisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHNwZWNpYWxpemVkIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIHRoZSBzcGVjaWFsaXplZAorICAgICAqIEFQSXMgb2YgdGhlIHNwZWNpZmllZCBmZWF0dXJlIGFuZCB2ZXJzaW9uLCBhcyBzcGVjaWZpZWQgaW4uIFRoZQorICAgICAqIHNwZWNpYWxpemVkIG9iamVjdCBtYXkgYWxzbyBiZSBvYnRhaW5lZCBieSB1c2luZyBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcKKyAgICAgKiBtZXRob2RzIGJ1dCBpcyBub3QgbmVjZXNzYXJpbHkgZXhwZWN0ZWQgdG8sIGFzIGRpc2N1c3NlZCBpbi4gVGhpcyBtZXRob2QKKyAgICAgKiBhbHNvIGFsbG93IHRoZSBpbXBsZW1lbnRhdGlvbiB0byBwcm92aWRlIHNwZWNpYWxpemVkIG9iamVjdHMgd2hpY2ggZG8gbm90CisgICAgICogc3VwcG9ydCB0aGUgTm9kZSBpbnRlcmZhY2UuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBmZWF0dXJlCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSByZXF1ZXN0ZWQuIE5vdGUgdGhhdCBhbnkgcGx1cyBzaWduICIrIgorICAgICAqICAgICAgICAgICAgcHJlcGVuZGVkIHRvIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlIHdpbGwgYmUgaWdub3JlZCBzaW5jZSBpdAorICAgICAqICAgICAgICAgICAgaXMgbm90IHNpZ25pZmljYW50IGluIHRoZSBjb250ZXh0IG9mIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSB2ZXJzaW9uCisgICAgICogICAgICAgICAgICB0aGlzIGlzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZmVhdHVyZSB0byB0ZXN0LgorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIHRoZSBzcGVjaWFsaXplZCBBUElzIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIGZlYXR1cmUgYW5kIHZlcnNpb24sIGlmIGFueSwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBvYmplY3Qgd2hpY2gKKyAgICAgKiAgICAgICAgIGltcGxlbWVudHMgaW50ZXJmYWNlcyBhc3NvY2lhdGVkIHdpdGggdGhhdCBmZWF0dXJlLiBJZiB0aGUKKyAgICAgKiAgICAgICAgIERPTU9iamVjdCByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpbXBsZW1lbnRzIHRoZSBOb2RlIGludGVyZmFjZSwKKyAgICAgKiAgICAgICAgIGl0IG11c3QgZGVsZWdhdGUgdG8gdGhlIHByaW1hcnkgY29yZSBOb2RlIGFuZCBub3QgcmV0dXJuIHJlc3VsdHMKKyAgICAgKiAgICAgICAgIGluY29uc2lzdGVudCB3aXRoIHRoZSBwcmltYXJ5IGNvcmUgTm9kZSBzdWNoIGFzIGF0dHJpYnV0ZXMsCisgICAgICogICAgICAgICBjaGlsZE5vZGVzLCBldGMuCisgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewogICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7CiAgICAgfQogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHB1YmxpYyBPYmplY3Qgc2V0VXNlckRhdGEoU3RyaW5nIGtleSwgT2JqZWN0IGRhdGEsIFVzZXJEYXRhSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ki8KKyAgICAgKiBwdWJsaWMgT2JqZWN0IHNldFVzZXJEYXRhKFN0cmluZyBrZXksIE9iamVjdCBkYXRhLCBVc2VyRGF0YUhhbmRsZXIKKyAgICAgKiBoYW5kbGVyKSB7IHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLAorICAgICAqICJNZXRob2Qgbm90IHN1cHBvcnRlZCIpOyB9CisgICAgICovCiAKKyAgICAvKioKKyAgICAgKiA8aT5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBpbnRlcmZhY2U6IG9yZy53M2MuZG9tLk5vZGUgKERPTSBMZXZlbCAzKTwvaT4KKyAgICAgKiA8cD4KKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG9iamVjdCBhc3NvY2lhdGVkIHRvIGEga2V5IG9uIGEgdGhpcyBub2RlLiBUaGUgb2JqZWN0IG11c3QKKyAgICAgKiBmaXJzdCBoYXZlIGJlZW4gc2V0IHRvIHRoaXMgbm9kZSBieSBjYWxsaW5nIHNldFVzZXJEYXRhIHdpdGggdGhlIHNhbWUKKyAgICAgKiBrZXkuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgdGhlIG9iamVjdCBpcyBhc3NvY2lhdGVkIHRvLgorICAgICAqIEByZXR1cm4gdGhlIERPTVVzZXJEYXRhIGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIGtleSBvbiB0aGlzIG5vZGUsIG9yIG51bGwKKyAgICAgKiAgICAgICAgIGlmIHRoZXJlIHdhcyBub25lLgorICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0VXNlckRhdGEoU3RyaW5nIGtleSkgewogICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7CiAgICAgfQpAQCAtNTQwLDcgKzkxOCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgdXNlciBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB1c2VyIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlCisgICAgICogQHJldHVybiB0aGUgdXNlciBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldFVzZXJPYmplY3QoKSB7CiAgICAgICAgIHJldHVybiB1c2VyT2JqZWN0OwpAQCAtNTQ5LDcgKzkyNyw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgdXNlciBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXNlck9iamVjdCB0aGUgbmV3IHVzZXIgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUKKyAgICAgKiBAcGFyYW0gdXNlck9iamVjdAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB1c2VyIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFVzZXJPYmplY3QoT2JqZWN0IHVzZXJPYmplY3QpIHsKICAgICAgICAgdGhpcy51c2VyT2JqZWN0ID0gdXNlck9iamVjdDsKQEAgLTU1OSwxNiArOTM4LDIxIEBACiAgICAgICogVGhlIENsYXNzIElJT01ldGFkYXRhQXR0ci4KICAgICAgKi8KICAgICBwcml2YXRlIGNsYXNzIElJT01ldGFkYXRhQXR0ciBleHRlbmRzIElJT01ldGFkYXRhTm9kZSBpbXBsZW1lbnRzIEF0dHIgewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBvd25lciBlbGVtZW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb3duZXIgZWxlbWVudC4KKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgRWxlbWVudCBvd25lckVsZW1lbnQ7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBpSU8gbWV0YWRhdGEgYXR0ci4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCi0gICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICAgICAgICogQHBhcmFtIG93bmVyIHRoZSBvd25lcgorICAgICAgICAgKiBAcGFyYW0gbmFtZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgdmFsdWUuCisgICAgICAgICAqIEBwYXJhbSBvd25lcgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBvd25lci4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBJSU9NZXRhZGF0YUF0dHIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSwgRWxlbWVudCBvd25lcikgewogICAgICAgICAgICAgc3VwZXIobmFtZSwgdmFsdWUpOwpAQCAtNTk4LDEyICs5ODIsMTYgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFNldHMgdGhlIG93bmVyIGVsZW1lbnQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gb3duZXJFbGVtZW50IHRoZSBuZXcgb3duZXIgZWxlbWVudAorICAgICAgICAgKiBAcGFyYW0gb3duZXJFbGVtZW50CisgICAgICAgICAqICAgICAgICAgICAgdGhlIG5ldyBvd25lciBlbGVtZW50LgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHZvaWQgc2V0T3duZXJFbGVtZW50KEVsZW1lbnQgb3duZXJFbGVtZW50KSB7CiAgICAgICAgICAgICB0aGlzLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDsKICAgICAgICAgfQogCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0lkKCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJNZXRob2Qgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICB9CkBAIC02MTgsMTQgKzEwMDYsMTcgQEAKICAgICAgKiBUaGUgQ2xhc3MgSUlPTWV0YWRhdGFOb2RlTGlzdC4KICAgICAgKi8KICAgICBwcml2YXRlIGNsYXNzIElJT01ldGFkYXRhTm9kZUxpc3QgaW1wbGVtZW50cyBOb2RlTGlzdCwgTmFtZWROb2RlTWFwIHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgbGlzdC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGxpc3QuCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIExpc3Q8SUlPTWV0YWRhdGFOb2RlPiBsaXN0OwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgaUlPIG1ldGFkYXRhIG5vZGUgbGlzdC4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0CisgICAgICAgICAqIEBwYXJhbSBsaXN0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGxpc3QuCiAgICAgICAgICAqLwogICAgICAgICBJSU9NZXRhZGF0YU5vZGVMaXN0KExpc3Q8SUlPTWV0YWRhdGFOb2RlPiBsaXN0KSB7CiAgICAgICAgICAgICB0aGlzLmxpc3QgPSBsaXN0OwpAQCAtNjQ0LDcgKzEwMzUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIE5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICBmb3IoSUlPTWV0YWRhdGFOb2RlIG5vZGU6bGlzdCkgeworICAgICAgICAgICAgZm9yIChJSU9NZXRhZGF0YU5vZGUgbm9kZSA6IGxpc3QpIHsKICAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgICAgICAgICAgICB9CkBAIC02NTMsMTEgKzEwNDQsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBOb2RlIHNldE5hbWVkSXRlbShOb2RlIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsICJUaGlzIE5hbWVkTm9kZU1hcCBpcyByZWFkLW9ubHkhIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsCisgICAgICAgICAgICAgICAgICAgICJUaGlzIE5hbWVkTm9kZU1hcCBpcyByZWFkLW9ubHkhIik7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgTm9kZSByZW1vdmVOYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCAiVGhpcyBOYW1lZE5vZGVNYXAgaXMgcmVhZC1vbmx5ISIpOworICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLAorICAgICAgICAgICAgICAgICAgICAiVGhpcyBOYW1lZE5vZGVNYXAgaXMgcmVhZC1vbmx5ISIpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIE5vZGUgZ2V0TmFtZWRJdGVtTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CkBAIC02NjUsMTEgKzEwNTgsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBOb2RlIHNldE5hbWVkSXRlbU5TKE5vZGUgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgIlRoaXMgTmFtZWROb2RlTWFwIGlzIHJlYWQtb25seSEiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwKKyAgICAgICAgICAgICAgICAgICAgIlRoaXMgTmFtZWROb2RlTWFwIGlzIHJlYWQtb25seSEiKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBOb2RlIHJlbW92ZU5hbWVkSXRlbU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCAiVGhpcyBOYW1lZE5vZGVNYXAgaXMgcmVhZC1vbmx5ISIpOworICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLAorICAgICAgICAgICAgICAgICAgICAiVGhpcyBOYW1lZE5vZGVNYXAgaXMgcmVhZC1vbmx5ISIpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPU3RhbmRhcmRNZXRhZGF0YUZvcm1hdC5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPU3RhbmRhcmRNZXRhZGF0YUZvcm1hdC5qYXZhCmluZGV4IDk0ZDIxMjUuLjcwNmNiMmYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT1N0YW5kYXJkTWV0YWRhdGFGb3JtYXQuamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9JSU9TdGFuZGFyZE1ldGFkYXRhRm9ybWF0LmphdmEKQEAgLTE1LDE4ICsxNSwxOSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLQogcGFja2FnZSBqYXZheC5pbWFnZWlvLm1ldGFkYXRhOwogCiBpbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZVR5cGVTcGVjaWZpZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgSUlPU3RhbmRhcmRNZXRhZGF0YUZvcm1hdCBkZXNjcmliZXMgdGhlIHJ1bGVzIG9mIHRoZSAKLSAqIHN0YW5kYXJkIG1ldGFkYXRhIGZvcm1hdC4KKyAqIFRoZSBjbGFzcyBJSU9TdGFuZGFyZE1ldGFkYXRhRm9ybWF0IGRlc2NyaWJlcyB0aGUgcnVsZXMgb2YgdGhlIHN0YW5kYXJkCisgKiBtZXRhZGF0YSBmb3JtYXQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi1jbGFzcyBJSU9TdGFuZGFyZE1ldGFkYXRhRm9ybWF0ICBleHRlbmRzIElJT01ldGFkYXRhRm9ybWF0SW1wbCB7Ci0gICAgCitjbGFzcyBJSU9TdGFuZGFyZE1ldGFkYXRhRm9ybWF0IGV4dGVuZHMgSUlPTWV0YWRhdGFGb3JtYXRJbXBsIHsKKwogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJSU9TdGFuZGFyZE1ldGFkYXRhRm9ybWF0LgogICAgICAqLwpAQCAtNDEsNyArNDIsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEJ1aWxkcyB0aGUgZHRkIHRoYXQgZGVzY3JpYmVzIHRoZSBzdGFuZGFyZCBtZXRhZGF0YSBmb3JtYXQuCisgICAgICogQnVpbGRzIHRoZSBEVEQgdGhhdCBkZXNjcmliZXMgdGhlIHN0YW5kYXJkIG1ldGFkYXRhIGZvcm1hdC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgYnVpbGREVEQoKSB7CiAgICAgICAgIC8vIENIUk9NQQpAQCAtODAsNyArODEsMTAgQEAKICAgICAgICAgYWRkQXR0cmlidXRlKCJDb2xvclNwYWNlVHlwZSIsICJuYW1lIiwgREFUQVRZUEVfU1RSSU5HLCB0cnVlLCBudWxsLCB2YWx1ZXMpOwogCiAgICAgICAgIGFkZEVsZW1lbnQoIk51bUNoYW5uZWxzIiwgIkNocm9tYSIsIENISUxEX1BPTElDWV9FTVBUWSk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZSgiTnVtQ2hhbm5lbHMiLCAidmFsdWUiLCBEQVRBVFlQRV9JTlRFR0VSLCB0cnVlLCAwLCBJbnRlZ2VyLk1BWF9WQUxVRSk7IC8vIGxpc3QgLSB3aHk/CisgICAgICAgIGFkZEF0dHJpYnV0ZSgiTnVtQ2hhbm5lbHMiLCAidmFsdWUiLCBEQVRBVFlQRV9JTlRFR0VSLCB0cnVlLCAwLCBJbnRlZ2VyLk1BWF9WQUxVRSk7IC8vIGxpc3QKKyAgICAgICAgLy8gLQorICAgICAgICAvLyB3aHkKKyAgICAgICAgLy8gPwogCiAgICAgICAgIGFkZEVsZW1lbnQoIkdhbW1hIiwgIkNocm9tYSIsIENISUxEX1BPTElDWV9FTVBUWSk7CiAgICAgICAgIGFkZEF0dHJpYnV0ZSgiR2FtbWEiLCAidmFsdWUiLCBEQVRBVFlQRV9GTE9BVCwgdHJ1ZSwgbnVsbCk7CkBAIC0xNDIsMTAgKzE0Niw4IEBACiAgICAgICAgIGFkZEF0dHJpYnV0ZSgiQml0c1BlclNhbXBsZSIsICJ2YWx1ZSIsIERBVEFUWVBFX0lOVEVHRVIsIHRydWUsIDEsIEludGVnZXIuTUFYX1ZBTFVFKTsgLy8gbGlzdAogCiAgICAgICAgIGFkZEVsZW1lbnQoIlNpZ25pZmljYW50Qml0c1BlclNhbXBsZSIsICJEYXRhIiwgQ0hJTERfUE9MSUNZX0VNUFRZKTsKLSAgICAgICAgYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICJTaWduaWZpY2FudEJpdHNQZXJTYW1wbGUiLCAidmFsdWUiLAotICAgICAgICAgICAgICAgIERBVEFUWVBFX0lOVEVHRVIsIHRydWUsIDEsIEludGVnZXIuTUFYX1ZBTFVFCi0gICAgICAgICk7IC8vIGxpc3QKKyAgICAgICAgYWRkQXR0cmlidXRlKCJTaWduaWZpY2FudEJpdHNQZXJTYW1wbGUiLCAidmFsdWUiLCBEQVRBVFlQRV9JTlRFR0VSLCB0cnVlLCAxLAorICAgICAgICAgICAgICAgIEludGVnZXIuTUFYX1ZBTFVFKTsgLy8gbGlzdAogCiAgICAgICAgIGFkZEVsZW1lbnQoIlNhbXBsZU1TQiIsICJEYXRhIiwgQ0hJTERfUE9MSUNZX0VNUFRZKTsKICAgICAgICAgYWRkQXR0cmlidXRlKCJTYW1wbGVNU0IiLCAidmFsdWUiLCBEQVRBVFlQRV9JTlRFR0VSLCB0cnVlLCAxLCBJbnRlZ2VyLk1BWF9WQUxVRSk7IC8vIGxpc3QKQEAgLTIyNCw0OSArMjI2LDI5IEBACiAKICAgICAgICAgYWRkRWxlbWVudCgiSW1hZ2VDcmVhdGlvblRpbWUiLCAiRG9jdW1lbnQiLCBDSElMRF9QT0xJQ1lfRU1QVFkpOwogICAgICAgICBhZGRBdHRyaWJ1dGUoIkltYWdlQ3JlYXRpb25UaW1lIiwgInllYXIiLCBEQVRBVFlQRV9JTlRFR0VSLCB0cnVlLCBudWxsKTsKLSAgICAgICAgYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICJJbWFnZUNyZWF0aW9uVGltZSIsICJtb250aCIsCi0gICAgICAgICAgICAgICAgREFUQVRZUEVfSU5URUdFUiwgdHJ1ZSwgbnVsbCwgIjEiLCAiMTIiLCB0cnVlLCB0cnVlCi0gICAgICAgICk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAiSW1hZ2VDcmVhdGlvblRpbWUiLCAiZGF5IiwKLSAgICAgICAgICAgICAgICBEQVRBVFlQRV9JTlRFR0VSLCB0cnVlLCBudWxsLCAiMSIsICIzMSIsIHRydWUsIHRydWUKLSAgICAgICAgKTsKLSAgICAgICAgYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICJJbWFnZUNyZWF0aW9uVGltZSIsICJob3VyIiwKLSAgICAgICAgICAgICAgICBEQVRBVFlQRV9JTlRFR0VSLCBmYWxzZSwgIjAiLCAiMCIsICIyMyIsIHRydWUsIHRydWUKLSAgICAgICAgKTsKLSAgICAgICAgYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICJJbWFnZUNyZWF0aW9uVGltZSIsICJtaW51dGUiLAotICAgICAgICAgICAgICAgIERBVEFUWVBFX0lOVEVHRVIsIGZhbHNlLCAiMCIsICIwIiwgIjU5IiwgdHJ1ZSwgdHJ1ZQotICAgICAgICApOwotICAgICAgICBhZGRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgIkltYWdlQ3JlYXRpb25UaW1lIiwgInNlY29uZCIsCi0gICAgICAgICAgICAgICAgREFUQVRZUEVfSU5URUdFUiwgZmFsc2UsICIwIiwgIjAiLCAiNjAiLCB0cnVlLCB0cnVlCi0gICAgICAgICk7CisgICAgICAgIGFkZEF0dHJpYnV0ZSgiSW1hZ2VDcmVhdGlvblRpbWUiLCAibW9udGgiLCBEQVRBVFlQRV9JTlRFR0VSLCB0cnVlLCBudWxsLCAiMSIsICIxMiIsIHRydWUsCisgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgIGFkZEF0dHJpYnV0ZSgiSW1hZ2VDcmVhdGlvblRpbWUiLCAiZGF5IiwgREFUQVRZUEVfSU5URUdFUiwgdHJ1ZSwgbnVsbCwgIjEiLCAiMzEiLCB0cnVlLAorICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICBhZGRBdHRyaWJ1dGUoIkltYWdlQ3JlYXRpb25UaW1lIiwgImhvdXIiLCBEQVRBVFlQRV9JTlRFR0VSLCBmYWxzZSwgIjAiLCAiMCIsICIyMyIsIHRydWUsCisgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgIGFkZEF0dHJpYnV0ZSgiSW1hZ2VDcmVhdGlvblRpbWUiLCAibWludXRlIiwgREFUQVRZUEVfSU5URUdFUiwgZmFsc2UsICIwIiwgIjAiLCAiNTkiLCB0cnVlLAorICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICBhZGRBdHRyaWJ1dGUoIkltYWdlQ3JlYXRpb25UaW1lIiwgInNlY29uZCIsIERBVEFUWVBFX0lOVEVHRVIsIGZhbHNlLCAiMCIsICIwIiwgIjYwIiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICB0cnVlKTsKIAogICAgICAgICBhZGRFbGVtZW50KCJJbWFnZU1vZGlmaWNhdGlvblRpbWUiLCAiRG9jdW1lbnQiLCBDSElMRF9QT0xJQ1lfRU1QVFkpOwogICAgICAgICBhZGRBdHRyaWJ1dGUoIkltYWdlTW9kaWZpY2F0aW9uVGltZSIsICJ5ZWFyIiwgREFUQVRZUEVfSU5URUdFUiwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAiSW1hZ2VNb2RpZmljYXRpb25UaW1lIiwgIm1vbnRoIiwKLSAgICAgICAgICAgICAgICBEQVRBVFlQRV9JTlRFR0VSLCB0cnVlLCBudWxsLCAiMSIsICIxMiIsIHRydWUsIHRydWUKLSAgICAgICAgKTsKLSAgICAgICAgYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICJJbWFnZU1vZGlmaWNhdGlvblRpbWUiLCAiZGF5IiwKLSAgICAgICAgICAgICAgICBEQVRBVFlQRV9JTlRFR0VSLCB0cnVlLCBudWxsLCAiMSIsICIzMSIsIHRydWUsIHRydWUKLSAgICAgICAgKTsKLSAgICAgICAgYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICJJbWFnZU1vZGlmaWNhdGlvblRpbWUiLCAiaG91ciIsCi0gICAgICAgICAgICAgICAgREFUQVRZUEVfSU5URUdFUiwgZmFsc2UsICIwIiwgIjAiLCAiMjMiLCB0cnVlLCB0cnVlCi0gICAgICAgICk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAiSW1hZ2VNb2RpZmljYXRpb25UaW1lIiwgIm1pbnV0ZSIsCi0gICAgICAgICAgICAgICAgREFUQVRZUEVfSU5URUdFUiwgZmFsc2UsICIwIiwgIjAiLCAiNTkiLCB0cnVlLCB0cnVlCi0gICAgICAgICk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAiSW1hZ2VNb2RpZmljYXRpb25UaW1lIiwgInNlY29uZCIsCi0gICAgICAgICAgICAgICAgREFUQVRZUEVfSU5URUdFUiwgZmFsc2UsICIwIiwgIjAiLCAiNjAiLCB0cnVlLCB0cnVlCi0gICAgICAgICk7CisgICAgICAgIGFkZEF0dHJpYnV0ZSgiSW1hZ2VNb2RpZmljYXRpb25UaW1lIiwgIm1vbnRoIiwgREFUQVRZUEVfSU5URUdFUiwgdHJ1ZSwgbnVsbCwgIjEiLCAiMTIiLAorICAgICAgICAgICAgICAgIHRydWUsIHRydWUpOworICAgICAgICBhZGRBdHRyaWJ1dGUoIkltYWdlTW9kaWZpY2F0aW9uVGltZSIsICJkYXkiLCBEQVRBVFlQRV9JTlRFR0VSLCB0cnVlLCBudWxsLCAiMSIsICIzMSIsIHRydWUsCisgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgIGFkZEF0dHJpYnV0ZSgiSW1hZ2VNb2RpZmljYXRpb25UaW1lIiwgImhvdXIiLCBEQVRBVFlQRV9JTlRFR0VSLCBmYWxzZSwgIjAiLCAiMCIsICIyMyIsCisgICAgICAgICAgICAgICAgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIGFkZEF0dHJpYnV0ZSgiSW1hZ2VNb2RpZmljYXRpb25UaW1lIiwgIm1pbnV0ZSIsIERBVEFUWVBFX0lOVEVHRVIsIGZhbHNlLCAiMCIsICIwIiwgIjU5IiwKKyAgICAgICAgICAgICAgICB0cnVlLCB0cnVlKTsKKyAgICAgICAgYWRkQXR0cmlidXRlKCJJbWFnZU1vZGlmaWNhdGlvblRpbWUiLCAic2Vjb25kIiwgREFUQVRZUEVfSU5URUdFUiwgZmFsc2UsICIwIiwgIjAiLCAiNjAiLAorICAgICAgICAgICAgICAgIHRydWUsIHRydWUpOwogCiAgICAgICAgIC8vIFRFWFQKICAgICAgICAgYWRkRWxlbWVudCgiVGV4dCIsIHN0YW5kYXJkTWV0YWRhdGFGb3JtYXROYW1lLCAwLCBJbnRlZ2VyLk1BWF9WQUxVRSk7IC8vIENISUxEX1BPTElDWV9SRVBFQVQKQEAgLTMxMyw0ICsyOTUsMyBAQAogICAgICAgICBhZGRBdHRyaWJ1dGUoIk9wYXF1ZVRpbGUiLCAieSIsIERBVEFUWVBFX0lOVEVHRVIsIHRydWUsIG51bGwpOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvcGFja2FnZS5odG1sIGIvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YmQ1MWIKLS0tIC9kZXYvbnVsbAorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGJvZHk+CisgICAgPHA+CisgICAgICBUaGlzIHBhY2thZ2UgY29udGFpbnMgY2xhc3NlcyB3aGljaCBhbGxvd3MgdG8gcmVhZCBhbmQgd3JpdGUgZGVzY3JpYmluZyBtZXRhZGF0YSBvZiBpbWFnZSBmaWxlcy4KKyAgICA8L3A+CisgIEBzaW5jZSBBbmRyb2lkIDEuMAorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9wYWNrYWdlLmh0bWwgYi9hd3QvamF2YXgvaW1hZ2Vpby9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkNjE0OAotLS0gL2Rldi9udWxsCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8Ym9keT4KKyAgICA8cD4KKyAgICAgIFRoaXMgcGFja2FnZSBjb250YWlucyBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIHdoaWNoIHByb3ZpZGVzIGFuIEltYWdlIEkvTyBBUEkuIFRoZSBjb250YWluZWQgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyBhbGxvdyByZWFkaW5nIGFuZCB3cml0aW5nIGltYWdlIGZpbGVzIG9mIGRpZmZlcmVudCBmb3JtYXRzLgorICAgIDwvcD4KKyAgQHNpbmNlIEFuZHJvaWQgMS4wCisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3BsdWdpbnMvYm1wL0JNUEltYWdlV3JpdGVQYXJhbS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9ibXAvQk1QSW1hZ2VXcml0ZVBhcmFtLmphdmEKaW5kZXggMGNkNDRkYi4uZWNmYjIwYSAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9ibXAvQk1QSW1hZ2VXcml0ZVBhcmFtLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9ibXAvQk1QSW1hZ2VXcml0ZVBhcmFtLmphdmEKQEAgLTE1LDE5ICsxNSwyMSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLQogcGFja2FnZSBqYXZheC5pbWFnZWlvLnBsdWdpbnMuYm1wOwogCiBpbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZVdyaXRlUGFyYW07CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogLyoqCi0gKiBUaGUgQk1QSW1hZ2VXcml0ZVBhcmFtIGNsYXNzIGFsbG93cyBlbmNvZGluZyBhbiBpbWFnZSBpbgotICogQk1QIGZvcm1hdC4KKyAqIFRoZSBCTVBJbWFnZVdyaXRlUGFyYW0gY2xhc3MgYWxsb3dzIGVuY29kaW5nIGFuIGltYWdlIGluIEJNUCBmb3JtYXQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQk1QSW1hZ2VXcml0ZVBhcmFtIGV4dGVuZHMgSW1hZ2VXcml0ZVBhcmFtIHsKLSAgICAKLSAgICAvKiogVGhlIHRvcCBkb3duLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHRvcCBkb3duLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiB0b3BEb3duOyAvLyBEZWZhdWx0IGlzIGJvdHRvbS11cAogCiAgICAgLyoqCkBAIC00MSwzMyArNDMsMzUgQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQk1QSW1hZ2VXcml0ZVBhcmFtIHdpdGggdGhlIHNwZWNpZmllZCBMb2NhbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxvY2FsZSB0aGUgc3BlY2lmaWVkIExvY2FsZS4KKyAgICAgKiBAcGFyYW0gbG9jYWxlCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIExvY2FsZS4KICAgICAgKi8KICAgICBwdWJsaWMgQk1QSW1hZ2VXcml0ZVBhcmFtKExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgc3VwZXIobG9jYWxlKTsKIAogICAgICAgICAvLyBTZXQgdGhlIGNvbXByZXNzaW9uCiAgICAgICAgIGNhbldyaXRlQ29tcHJlc3NlZCA9IHRydWU7Ci0gICAgICAgIGNvbXByZXNzaW9uVHlwZXMgPSBuZXcgU3RyaW5nW10geyJCSV9SR0IiLCAiQklfUkxFOCIsICJCSV9STEU0IiwgIkJJX0JJVEZJRUxEUyJ9OwotICAgICAgICBjb21wcmVzc2lvblR5cGUgPSBjb21wcmVzc2lvblR5cGVzWzBdOyAKKyAgICAgICAgY29tcHJlc3Npb25UeXBlcyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAgICAgIkJJX1JHQiIsICJCSV9STEU4IiwgIkJJX1JMRTQiLCAiQklfQklURklFTERTIgorICAgICAgICB9OworICAgICAgICBjb21wcmVzc2lvblR5cGUgPSBjb21wcmVzc2lvblR5cGVzWzBdOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdHJ1ZSBpZiB0aGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gaW4gYSB0b3AtZG93biBvcmRlciwgCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIFNldHMgdHJ1ZSBpZiB0aGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gaW4gYSB0b3AtZG93biBvcmRlciwgZmFsc2UKKyAgICAgKiBvdGhlcndpc2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRvcERvd24gdGhlIG5ldyB0b3AtZG93biB2YWx1ZS4gCisgICAgICogQHBhcmFtIHRvcERvd24KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdG9wLWRvd24gdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VG9wRG93bihib29sZWFuIHRvcERvd24pIHsKICAgICAgICAgdGhpcy50b3BEb3duID0gdG9wRG93bjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRhdGEgaXMgd3JpdHRlbiBpbiB0b3AtZG93biBvcmRlciwgZmFsc2UKLSAgICAgKiBvdGhlcndpc2UuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBkYXRhIGlzIHdyaXR0ZW4gaW4gdG9wLWRvd24gb3JkZXIsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRhdGEgaXMgd3JpdHRlbiBpbiB0b3AtZG93biBvcmRlciwgZmFsc2UKLSAgICAgKiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkYXRhIGlzIHdyaXR0ZW4gaW4gdG9wLWRvd24gb3JkZXIsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1RvcERvd24oKSB7CiAgICAgICAgIHJldHVybiB0b3BEb3duOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9ibXAvcGFja2FnZS5odG1sIGIvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9ibXAvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OTRhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9wbHVnaW5zL2JtcC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGJvZHk+CisgICAgPHA+CisgICAgICBUaGlzIHBhY2thZ2UgY29udGFpbnMgYXV4aWxpYXJ5IGNsYXNzZXMgZm9yIHRoZSBidWlsdC1pbiBCTVAgaW1hZ2UgcGx1Zy1pbi4KKyAgICA8L3A+CisgIEBzaW5jZSBBbmRyb2lkIDEuMAorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9wbHVnaW5zL2pwZWcvSlBFR0h1ZmZtYW5UYWJsZS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9qcGVnL0pQRUdIdWZmbWFuVGFibGUuamF2YQppbmRleCAzOThjOTYwLi42N2I1MDRiIDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9wbHVnaW5zL2pwZWcvSlBFR0h1ZmZtYW5UYWJsZS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3BsdWdpbnMvanBlZy9KUEVHSHVmZm1hblRhYmxlLmphdmEKQEAgLTE4LDgyICsxOCw5MCBAQAogcGFja2FnZSBqYXZheC5pbWFnZWlvLnBsdWdpbnMuanBlZzsKIAogLyoqCi0gKiBUaGUgSlBFR0h1ZmZtYW5UYWJsZSBjbGFzcyByZXByZXNlbnRzIGEgc2luZ2xlIEpQRUcgSHVmZm1hbiB0YWJsZS4gCi0gKiBJdCBjb250YWlucyB0aGUgc3RhbmRhcmQgdGFibGVzIGZyb20gdGhlIEpQRUcgc3BlY2lmaWNhdGlvbi4KKyAqIFRoZSBKUEVHSHVmZm1hblRhYmxlIGNsYXNzIHJlcHJlc2VudHMgYSBzaW5nbGUgSlBFRyBIdWZmbWFuIHRhYmxlLiBJdAorICogY29udGFpbnMgdGhlIHN0YW5kYXJkIHRhYmxlcyBmcm9tIHRoZSBKUEVHIHNwZWNpZmljYXRpb24uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSlBFR0h1ZmZtYW5UYWJsZSB7Ci0gICAgCi0gICAgLyoqIFRoZSBzdGFuZGFyZCBEQyBsdW1pbmFuY2UgSHVmZm1hbiB0YWJsZSAuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBKUEVHSHVmZm1hblRhYmxlIFN0ZERDTHVtaW5hbmNlID0gbmV3IEpQRUdIdWZmbWFuVGFibGUoCi0gICAgICAgICAgICBuZXcgc2hvcnRbXSB7MCwgMSwgNSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCi0gICAgICAgICAgICBuZXcgc2hvcnRbXSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMHgwQSwgMHgwQn0sCi0gICAgICAgICAgICBmYWxzZQotICAgICk7CiAKLSAgICAvKiogVGhlIHN0YW5kYXJkIERDIGNocm9taW5hbmNlIEh1ZmZtYW4gdGFibGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBKUEVHSHVmZm1hblRhYmxlIFN0ZERDQ2hyb21pbmFuY2UgPSBuZXcgSlBFR0h1ZmZtYW5UYWJsZSgKLSAgICAgICAgICAgIG5ldyBzaG9ydFtdIHswLCAzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwfSwKLSAgICAgICAgICAgIG5ldyBzaG9ydFtdIHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAweDBBLCAweDBCfSwKLSAgICAgICAgICAgIGZhbHNlCi0gICAgKTsKKyAgICAvKioKKyAgICAgKiBUaGUgc3RhbmRhcmQgREMgbHVtaW5hbmNlIEh1ZmZtYW4gdGFibGUgLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSlBFR0h1ZmZtYW5UYWJsZSBTdGREQ0x1bWluYW5jZSA9IG5ldyBKUEVHSHVmZm1hblRhYmxlKG5ldyBzaG9ydFtdIHsKKyAgICAgICAgICAgIDAsIDEsIDUsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAKKyAgICB9LCBuZXcgc2hvcnRbXSB7CisgICAgICAgICAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAweDBBLCAweDBCCisgICAgfSwgZmFsc2UpOwogCi0gICAgLyoqIFRoZSBzdGFuZGFyZCBBQyBsdW1pbmFuY2UgSHVmZm1hbiB0YWJsZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEpQRUdIdWZmbWFuVGFibGUgU3RkQUNMdW1pbmFuY2UgPSBuZXcgSlBFR0h1ZmZtYW5UYWJsZSgKLSAgICAgICAgICAgIG5ldyBzaG9ydFtdIHswLCAyLCAxLCAzLCAzLCAyLCA0LCAzLCA1LCA1LCA0LCA0LCAwLCAwLCAxLCAweDdEfSwKLSAgICAgICAgICAgIG5ldyBzaG9ydFtdIHsKLSAgICAgICAgICAgICAgICAgICAgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwNCwgMHgxMSwgMHgwNSwgMHgxMiwgMHgyMSwgMHgzMSwgMHg0MSwgMHgwNiwKLSAgICAgICAgICAgICAgICAgICAgMHgxMywgMHg1MSwgMHg2MSwgMHgwNywgMHgyMiwgMHg3MSwgMHgxNCwgMHgzMiwgMHg4MSwgMHg5MSwgMHhBMSwgMHgwOCwKLSAgICAgICAgICAgICAgICAgICAgMHgyMywgMHg0MiwgMHhCMSwgMHhDMSwgMHgxNSwgMHg1MiwgMHhEMSwgMHhGMCwgMHgyNCwgMHgzMywgMHg2MiwgMHg3MiwKLSAgICAgICAgICAgICAgICAgICAgMHg4MiwgMHgwOSwgMHgwQSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxQSwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwKLSAgICAgICAgICAgICAgICAgICAgMHgyOSwgMHgyQSwgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwgMHgzQSwgMHg0MywgMHg0NCwgMHg0NSwKLSAgICAgICAgICAgICAgICAgICAgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0QSwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwKLSAgICAgICAgICAgICAgICAgICAgMHg1QSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwgMHg2QSwgMHg3MywgMHg3NCwgMHg3NSwKLSAgICAgICAgICAgICAgICAgICAgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3QSwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwKLSAgICAgICAgICAgICAgICAgICAgMHg4QSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5QSwgMHhBMiwgMHhBMywKLSAgICAgICAgICAgICAgICAgICAgMHhBNCwgMHhBNSwgMHhBNiwgMHhBNywgMHhBOCwgMHhBOSwgMHhBQSwgMHhCMiwgMHhCMywgMHhCNCwgMHhCNSwgMHhCNiwKLSAgICAgICAgICAgICAgICAgICAgMHhCNywgMHhCOCwgMHhCOSwgMHhCQSwgMHhDMiwgMHhDMywgMHhDNCwgMHhDNSwgMHhDNiwgMHhDNywgMHhDOCwgMHhDOSwKLSAgICAgICAgICAgICAgICAgICAgMHhDQSwgMHhEMiwgMHhEMywgMHhENCwgMHhENSwgMHhENiwgMHhENywgMHhEOCwgMHhEOSwgMHhEQSwgMHhFMSwgMHhFMiwKLSAgICAgICAgICAgICAgICAgICAgMHhFMywgMHhFNCwgMHhFNSwgMHhFNiwgMHhFNywgMHhFOCwgMHhFOSwgMHhFQSwgMHhGMSwgMHhGMiwgMHhGMywgMHhGNCwKLSAgICAgICAgICAgICAgICAgICAgMHhGNSwgMHhGNiwgMHhGNywgMHhGOCwgMHhGOSwgMHhGQQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIGZhbHNlCi0gICAgKTsKKyAgICAvKioKKyAgICAgKiBUaGUgc3RhbmRhcmQgREMgY2hyb21pbmFuY2UgSHVmZm1hbiB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEpQRUdIdWZmbWFuVGFibGUgU3RkRENDaHJvbWluYW5jZSA9IG5ldyBKUEVHSHVmZm1hblRhYmxlKG5ldyBzaG9ydFtdIHsKKyAgICAgICAgICAgIDAsIDMsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAKKyAgICB9LCBuZXcgc2hvcnRbXSB7CisgICAgICAgICAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAweDBBLCAweDBCCisgICAgfSwgZmFsc2UpOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBzdGFuZGFyZCBBQyBjaHJvbWluYW5jZSBIdWZmbWFuIHRhYmxlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSlBFR0h1ZmZtYW5UYWJsZSBTdGRBQ0Nocm9taW5hbmNlID0gbmV3IEpQRUdIdWZmbWFuVGFibGUoCi0gICAgICAgICAgICBuZXcgc2hvcnRbXSB7MCwgMiwgMSwgMiwgNCwgNCwgMywgNCwgNywgNSwgNCwgNCwgMCwgMSwgMiwgMHg3N30sCi0gICAgICAgICAgICBuZXcgc2hvcnRbXSB7Ci0gICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MTEsIDB4MDQsIDB4MDUsIDB4MjEsIDB4MzEsIDB4MDYsIDB4MTIsIDB4NDEsCi0gICAgICAgICAgICAgICAgICAgIDB4NTEsIDB4MDcsIDB4NjEsIDB4NzEsIDB4MTMsIDB4MjIsIDB4MzIsIDB4ODEsIDB4MDgsIDB4MTQsIDB4NDIsIDB4OTEsCi0gICAgICAgICAgICAgICAgICAgIDB4QTEsIDB4QjEsIDB4QzEsIDB4MDksIDB4MjMsIDB4MzMsIDB4NTIsIDB4RjAsIDB4MTUsIDB4NjIsIDB4NzIsIDB4RDEsCi0gICAgICAgICAgICAgICAgICAgIDB4MEEsIDB4MTYsIDB4MjQsIDB4MzQsIDB4RTEsIDB4MjUsIDB4RjEsIDB4MTcsIDB4MTgsIDB4MTksIDB4MUEsIDB4MjYsCi0gICAgICAgICAgICAgICAgICAgIDB4MjcsIDB4MjgsIDB4MjksIDB4MkEsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4M0EsIDB4NDMsIDB4NDQsCi0gICAgICAgICAgICAgICAgICAgIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NEEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsCi0gICAgICAgICAgICAgICAgICAgIDB4NTksIDB4NUEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NkEsIDB4NzMsIDB4NzQsCi0gICAgICAgICAgICAgICAgICAgIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N0EsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsCi0gICAgICAgICAgICAgICAgICAgIDB4ODgsIDB4ODksIDB4OEEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OUEsCi0gICAgICAgICAgICAgICAgICAgIDB4QTIsIDB4QTMsIDB4QTQsIDB4QTUsIDB4QTYsIDB4QTcsIDB4QTgsIDB4QTksIDB4QUEsIDB4QjIsIDB4QjMsIDB4QjQsCi0gICAgICAgICAgICAgICAgICAgIDB4QjUsIDB4QjYsIDB4QjcsIDB4QjgsIDB4QjksIDB4QkEsIDB4QzIsIDB4QzMsIDB4QzQsIDB4QzUsIDB4QzYsIDB4QzcsCi0gICAgICAgICAgICAgICAgICAgIDB4QzgsIDB4QzksIDB4Q0EsIDB4RDIsIDB4RDMsIDB4RDQsIDB4RDUsIDB4RDYsIDB4RDcsIDB4RDgsIDB4RDksIDB4REEsCi0gICAgICAgICAgICAgICAgICAgIDB4RTIsIDB4RTMsIDB4RTQsIDB4RTUsIDB4RTYsIDB4RTcsIDB4RTgsIDB4RTksIDB4RUEsIDB4RjIsIDB4RjMsIDB4RjQsCi0gICAgICAgICAgICAgICAgICAgIDB4RjUsIDB4RjYsIDB4RjcsIDB4RjgsIDB4RjksIDB4RkEKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBmYWxzZQotICAgICk7CisgICAgLyoqCisgICAgICogVGhlIHN0YW5kYXJkIEFDIGx1bWluYW5jZSBIdWZmbWFuIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSlBFR0h1ZmZtYW5UYWJsZSBTdGRBQ0x1bWluYW5jZSA9IG5ldyBKUEVHSHVmZm1hblRhYmxlKG5ldyBzaG9ydFtdIHsKKyAgICAgICAgICAgIDAsIDIsIDEsIDMsIDMsIDIsIDQsIDMsIDUsIDUsIDQsIDQsIDAsIDAsIDEsIDB4N0QKKyAgICB9LCBuZXcgc2hvcnRbXSB7CisgICAgICAgICAgICAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLCAweDIxLCAweDMxLCAweDQxLCAweDA2LCAweDEzLCAweDUxLAorICAgICAgICAgICAgMHg2MSwgMHgwNywgMHgyMiwgMHg3MSwgMHgxNCwgMHgzMiwgMHg4MSwgMHg5MSwgMHhBMSwgMHgwOCwgMHgyMywgMHg0MiwgMHhCMSwgMHhDMSwKKyAgICAgICAgICAgIDB4MTUsIDB4NTIsIDB4RDEsIDB4RjAsIDB4MjQsIDB4MzMsIDB4NjIsIDB4NzIsIDB4ODIsIDB4MDksIDB4MEEsIDB4MTYsIDB4MTcsIDB4MTgsCisgICAgICAgICAgICAweDE5LCAweDFBLCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJBLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAorICAgICAgICAgICAgMHgzQSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0QSwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywKKyAgICAgICAgICAgIDB4NTgsIDB4NTksIDB4NUEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NkEsIDB4NzMsIDB4NzQsIDB4NzUsCisgICAgICAgICAgICAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdBLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhBLCAweDkyLAorICAgICAgICAgICAgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5QSwgMHhBMiwgMHhBMywgMHhBNCwgMHhBNSwgMHhBNiwgMHhBNywKKyAgICAgICAgICAgIDB4QTgsIDB4QTksIDB4QUEsIDB4QjIsIDB4QjMsIDB4QjQsIDB4QjUsIDB4QjYsIDB4QjcsIDB4QjgsIDB4QjksIDB4QkEsIDB4QzIsIDB4QzMsCisgICAgICAgICAgICAweEM0LCAweEM1LCAweEM2LCAweEM3LCAweEM4LCAweEM5LCAweENBLCAweEQyLCAweEQzLCAweEQ0LCAweEQ1LCAweEQ2LCAweEQ3LCAweEQ4LAorICAgICAgICAgICAgMHhEOSwgMHhEQSwgMHhFMSwgMHhFMiwgMHhFMywgMHhFNCwgMHhFNSwgMHhFNiwgMHhFNywgMHhFOCwgMHhFOSwgMHhFQSwgMHhGMSwgMHhGMiwKKyAgICAgICAgICAgIDB4RjMsIDB4RjQsIDB4RjUsIDB4RjYsIDB4RjcsIDB4RjgsIDB4RjksIDB4RkEKKyAgICB9LCBmYWxzZSk7CiAKLSAgICAvKiogVGhlIGxlbmd0aHMuICovCisgICAgLyoqCisgICAgICogVGhlIHN0YW5kYXJkIEFDIGNocm9taW5hbmNlIEh1ZmZtYW4gdGFibGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBKUEVHSHVmZm1hblRhYmxlIFN0ZEFDQ2hyb21pbmFuY2UgPSBuZXcgSlBFR0h1ZmZtYW5UYWJsZShuZXcgc2hvcnRbXSB7CisgICAgICAgICAgICAwLCAyLCAxLCAyLCA0LCA0LCAzLCA0LCA3LCA1LCA0LCA0LCAwLCAxLCAyLCAweDc3CisgICAgfSwgbmV3IHNob3J0W10geworICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgxMSwgMHgwNCwgMHgwNSwgMHgyMSwgMHgzMSwgMHgwNiwgMHgxMiwgMHg0MSwgMHg1MSwgMHgwNywKKyAgICAgICAgICAgIDB4NjEsIDB4NzEsIDB4MTMsIDB4MjIsIDB4MzIsIDB4ODEsIDB4MDgsIDB4MTQsIDB4NDIsIDB4OTEsIDB4QTEsIDB4QjEsIDB4QzEsIDB4MDksCisgICAgICAgICAgICAweDIzLCAweDMzLCAweDUyLCAweEYwLCAweDE1LCAweDYyLCAweDcyLCAweEQxLCAweDBBLCAweDE2LCAweDI0LCAweDM0LCAweEUxLCAweDI1LAorICAgICAgICAgICAgMHhGMSwgMHgxNywgMHgxOCwgMHgxOSwgMHgxQSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyQSwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwKKyAgICAgICAgICAgIDB4MzksIDB4M0EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NEEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsCisgICAgICAgICAgICAweDU3LCAweDU4LCAweDU5LCAweDVBLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZBLCAweDczLCAweDc0LAorICAgICAgICAgICAgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3QSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwKKyAgICAgICAgICAgIDB4OEEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OUEsIDB4QTIsIDB4QTMsIDB4QTQsIDB4QTUsCisgICAgICAgICAgICAweEE2LCAweEE3LCAweEE4LCAweEE5LCAweEFBLCAweEIyLCAweEIzLCAweEI0LCAweEI1LCAweEI2LCAweEI3LCAweEI4LCAweEI5LCAweEJBLAorICAgICAgICAgICAgMHhDMiwgMHhDMywgMHhDNCwgMHhDNSwgMHhDNiwgMHhDNywgMHhDOCwgMHhDOSwgMHhDQSwgMHhEMiwgMHhEMywgMHhENCwgMHhENSwgMHhENiwKKyAgICAgICAgICAgIDB4RDcsIDB4RDgsIDB4RDksIDB4REEsIDB4RTIsIDB4RTMsIDB4RTQsIDB4RTUsIDB4RTYsIDB4RTcsIDB4RTgsIDB4RTksIDB4RUEsIDB4RjIsCisgICAgICAgICAgICAweEYzLCAweEY0LCAweEY1LCAweEY2LCAweEY3LCAweEY4LCAweEY5LCAweEZBCisgICAgfSwgZmFsc2UpOworCisgICAgLyoqCisgICAgICogVGhlIGxlbmd0aHMuCisgICAgICovCiAgICAgcHJpdmF0ZSBzaG9ydCBsZW5ndGhzW107Ci0gICAgCi0gICAgLyoqIFRoZSB2YWx1ZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWVzLgorICAgICAqLwogICAgIHByaXZhdGUgc2hvcnQgdmFsdWVzW107CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgalBFRyBodWZmbWFuIHRhYmxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsZW5ndGhzIHRoZSBsZW5ndGhzCi0gICAgICogQHBhcmFtIHZhbHVlcyB0aGUgdmFsdWVzCi0gICAgICogQHBhcmFtIGNvcHkgdGhlIGNvcHkKKyAgICAgKiBAcGFyYW0gbGVuZ3RocworICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aHMKKyAgICAgKiBAcGFyYW0gdmFsdWVzCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWVzCisgICAgICogQHBhcmFtIGNvcHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb3B5CiAgICAgICovCiAgICAgSlBFR0h1ZmZtYW5UYWJsZShzaG9ydFtdIGxlbmd0aHMsIHNob3J0W10gdmFsdWVzLCBib29sZWFuIGNvcHkpIHsKICAgICAgICAgLy8gQ29uc3RydWN0aW9uIG9mIHN0YW5kYXJkIHRhYmxlcyB3aXRob3V0IGNoZWNrcwpAQCAtMTA2LDkgKzExNCwxMSBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBKUEVHSHVmZm1hblRhYmxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsZW5ndGhzIHRoZSBhcnJheSBvZiBzaG9ydHMgbGVuZ3Rocy4KLSAgICAgKiBAcGFyYW0gdmFsdWVzIHRoZSBhcnJheSBvZiBzaG9ydHMgY29udGFpbmluZyAKLSAgICAgKiB0aGUgdmFsdWVzIGluIG9yZGVyIG9mIGluY3JlYXNpbmcgY29kZSBsZW5ndGguCisgICAgICogQHBhcmFtIGxlbmd0aHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBzaG9ydHMgbGVuZ3Rocy4KKyAgICAgKiBAcGFyYW0gdmFsdWVzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2Ygc2hvcnRzIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBpbiBvcmRlciBvZgorICAgICAqICAgICAgICAgICAgaW5jcmVhc2luZyBjb2RlIGxlbmd0aC4KICAgICAgKi8KICAgICBwdWJsaWMgSlBFR0h1ZmZtYW5UYWJsZShzaG9ydFtdIGxlbmd0aHMsIHNob3J0W10gdmFsdWVzKSB7CiAgICAgICAgIGlmIChsZW5ndGhzID09IG51bGwpIHsKQEAgLTE0NSw4ICsxNTUsOCBAQAogICAgIC8qKgogICAgICAqIEdldHMgYW4gYXJyYXkgb2YgbGVuZ3RocyBpbiB0aGUgSHVmZm1hbiB0YWJsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBzaG9ydCB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZQotICAgICAqIGxlbmd0aCB2YWx1ZXMgaW4gdGhlIEh1ZmZtYW4gdGFibGUuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2Ygc2hvcnQgdmFsdWVzIHJlcHJlc2VudGluZyB0aGUgbGVuZ3RoIHZhbHVlcyBpbiB0aGUKKyAgICAgKiAgICAgICAgIEh1ZmZtYW4gdGFibGUuCiAgICAgICovCiAgICAgcHVibGljIHNob3J0W10gZ2V0TGVuZ3RocygpIHsKICAgICAgICAgc2hvcnQgbmV3TGVuZ3Roc1tdID0gbmV3IHNob3J0W2xlbmd0aHMubGVuZ3RoXTsKQEAgLTE1NSw4ICsxNjUsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdmFsdWVzIHJlcHJlc2VudGVkIGJ5IGluY3JlYXNpbmcgbGVuZ3RoIG9mIAotICAgICAqIHRoZWlyIGNvZGVzLgorICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdmFsdWVzIHJlcHJlc2VudGVkIGJ5IGluY3JlYXNpbmcgbGVuZ3RoIG9mIHRoZWlyIGNvZGVzLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHZhbHVlcy4KICAgICAgKi8KQEAgLTE2OSw4ICsxNzgsMTAgQEAKICAgICAvKioKICAgICAgKiBDaGVjayBodWZmbWFuIHRhYmxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsZW5ndGhzIHRoZSBsZW5ndGhzCi0gICAgICogQHBhcmFtIHZhbHVlcyB0aGUgdmFsdWVzCisgICAgICogQHBhcmFtIGxlbmd0aHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGhzLgorICAgICAqIEBwYXJhbSB2YWx1ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZXMuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0h1ZmZtYW5UYWJsZShzaG9ydFtdIGxlbmd0aHMsIHNob3J0W10gdmFsdWVzKSB7CiAgICAgICAgIGludCBudW1MZWF2ZXMgPSAwOwpAQCAtMTc5LDEzICsxOTAsMTUgQEAKICAgICAgICAgICAgIG51bUxlYXZlcyArPSBsZW5ndGg7CiAgICAgICAgICAgICBwb3NzaWJsZUxlYXZlcyAtPSBsZW5ndGg7CiAgICAgICAgICAgICBpZiAocG9zc2libGVMZWF2ZXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBIdWZmbWFuIHRhYmxlIHByb3ZpZGVkLCBsZW5ndGhzIGFyZSBpbmNvcnJlY3QuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEh1ZmZtYW4gdGFibGUgcHJvdmlkZWQsIGxlbmd0aHMgYXJlIGluY29ycmVjdC4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBvc3NpYmxlTGVhdmVzIDw8PSAxOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggIT0gbnVtTGVhdmVzKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIEh1ZmZtYW4gdGFibGUgcHJvdmlkZWQsIHN1bSBvZiBsZW5ndGhzICE9IHZhbHVlcy4iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEh1ZmZtYW4gdGFibGUgcHJvdmlkZWQsIHN1bSBvZiBsZW5ndGhzICE9IHZhbHVlcy4iKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9qcGVnL0pQRUdJbWFnZVJlYWRQYXJhbS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9qcGVnL0pQRUdJbWFnZVJlYWRQYXJhbS5qYXZhCmluZGV4IGRkMDhkNTEuLjJmM2E5YTggMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3BsdWdpbnMvanBlZy9KUEVHSW1hZ2VSZWFkUGFyYW0uamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9wbHVnaW5zL2pwZWcvSlBFR0ltYWdlUmVhZFBhcmFtLmphdmEKQEAgLTIwLDE4ICsyMCwyNiBAQAogaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VSZWFkUGFyYW07CiAKIC8qKgotICogVGhlIEpQRUdJbWFnZVJlYWRQYXJhbSBjbGFzcyBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IHRvIHNldCBIdWZmbWFuIHRhYmxlcyAKLSAqIGFuZCBxdWFudGl6YXRpb24gdGFibGVzIHdoZW4gdXNpbmcgdGhlIEpQRUcgcmVhZGVyIHBsdWctaW4uCisgKiBUaGUgSlBFR0ltYWdlUmVhZFBhcmFtIGNsYXNzIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdG8gc2V0IEh1ZmZtYW4gdGFibGVzIGFuZAorICogcXVhbnRpemF0aW9uIHRhYmxlcyB3aGVuIHVzaW5nIHRoZSBKUEVHIHJlYWRlciBwbHVnLWluLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEpQRUdJbWFnZVJlYWRQYXJhbSBleHRlbmRzIEltYWdlUmVhZFBhcmFtIHsKLSAgICAKLSAgICAvKiogVGhlIHEgdGFibGVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHEgdGFibGVzLgorICAgICAqLwogICAgIHByaXZhdGUgSlBFR1FUYWJsZSBxVGFibGVzW107Ci0gICAgCi0gICAgLyoqIFRoZSBkYyBodWZmbWFuIHRhYmxlcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBkYyBodWZmbWFuIHRhYmxlcy4KKyAgICAgKi8KICAgICBwcml2YXRlIEpQRUdIdWZmbWFuVGFibGUgZGNIdWZmbWFuVGFibGVzW107Ci0gICAgCi0gICAgLyoqIFRoZSBhYyBodWZmbWFuIHRhYmxlcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBhYyBodWZmbWFuIHRhYmxlcy4KKyAgICAgKi8KICAgICBwcml2YXRlIEpQRUdIdWZmbWFuVGFibGUgYWNIdWZmbWFuVGFibGVzW107CiAKICAgICAvKioKQEAgLTQzLDI5ICs1MSwyOCBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0YWJsZXMgYXJlIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0YWJsZXMgYXJlIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGFibGVzIGFyZSBzZXQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBhcmVUYWJsZXNTZXQoKSB7CiAgICAgICAgIHJldHVybiBxVGFibGVzICE9IG51bGw7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgcXVhbnRpemF0aW9uIGFuZCBIdWZmbWFuIHRhYmxlcyBmb3IgdXNpbmcgaW4gCi0gICAgICogZGVjb2Rpbmcgc3RyZWFtcy4KKyAgICAgKiBTZXRzIHRoZSBxdWFudGl6YXRpb24gYW5kIEh1ZmZtYW4gdGFibGVzIGZvciB1c2luZyBpbiBkZWNvZGluZyBzdHJlYW1zLgogICAgICAqIAotICAgICAqIEBwYXJhbSBxVGFibGVzIHRoZSBxdWFudGl6YXRpb24gdGFibGVzLgotICAgICAqIEBwYXJhbSBEQ0h1ZmZtYW5UYWJsZXMgdGhlIHN0YW5kYXJ0IERDIEh1ZmZtYW4gdGFibGVzLgotICAgICAqIEBwYXJhbSBBQ0h1ZmZtYW5UYWJsZXMgdGhlIHN0YW5kYXJ0IEFDIGh1ZmZtYW4gdGFibGVzLgorICAgICAqIEBwYXJhbSBxVGFibGVzCisgICAgICogICAgICAgICAgICB0aGUgcXVhbnRpemF0aW9uIHRhYmxlcy4KKyAgICAgKiBAcGFyYW0gRENIdWZmbWFuVGFibGVzCisgICAgICogICAgICAgICAgICB0aGUgc3RhbmRhcnQgREMgSHVmZm1hbiB0YWJsZXMuCisgICAgICogQHBhcmFtIEFDSHVmZm1hblRhYmxlcworICAgICAqICAgICAgICAgICAgdGhlIHN0YW5kYXJ0IEFDIGh1ZmZtYW4gdGFibGVzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlY29kZVRhYmxlcygKLSAgICAgICAgICAgIEpQRUdRVGFibGVbXSBxVGFibGVzLAotICAgICAgICAgICAgSlBFR0h1ZmZtYW5UYWJsZVtdIERDSHVmZm1hblRhYmxlcywKLSAgICAgICAgICAgIEpQRUdIdWZmbWFuVGFibGVbXSBBQ0h1ZmZtYW5UYWJsZXMKLSAgICApIHsKKyAgICBwdWJsaWMgdm9pZCBzZXREZWNvZGVUYWJsZXMoSlBFR1FUYWJsZVtdIHFUYWJsZXMsIEpQRUdIdWZmbWFuVGFibGVbXSBEQ0h1ZmZtYW5UYWJsZXMsCisgICAgICAgICAgICBKUEVHSHVmZm1hblRhYmxlW10gQUNIdWZmbWFuVGFibGVzKSB7CiAgICAgICAgIGlmIChxVGFibGVzID09IG51bGwgfHwgRENIdWZmbWFuVGFibGVzID09IG51bGwgfHwgQUNIdWZmbWFuVGFibGVzID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgSlBFRyB0YWJsZSBhcnJheXMiKTsKICAgICAgICAgfQotICAgICAgICBpZihEQ0h1ZmZtYW5UYWJsZXMubGVuZ3RoICE9IEFDSHVmZm1hblRhYmxlcy5sZW5ndGgpIHsKKyAgICAgICAgaWYgKERDSHVmZm1hblRhYmxlcy5sZW5ndGggIT0gQUNIdWZmbWFuVGFibGVzLmxlbmd0aCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBKUEVHIHRhYmxlIGFycmF5cyIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChxVGFibGVzLmxlbmd0aCA+IDQgfHwgRENIdWZmbWFuVGFibGVzLmxlbmd0aCA+IDQpIHsKQEAgLTExMiw1ICsxMTksNSBAQAogICAgICAqLwogICAgIHB1YmxpYyBKUEVHSHVmZm1hblRhYmxlW10gZ2V0QUNIdWZmbWFuVGFibGVzKCkgewogICAgICAgICByZXR1cm4gYWNIdWZmbWFuVGFibGVzID09IG51bGwgPyBudWxsIDogYWNIdWZmbWFuVGFibGVzLmNsb25lKCk7Ci0gICAgfSAgICAKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9wbHVnaW5zL2pwZWcvSlBFR0ltYWdlV3JpdGVQYXJhbS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9qcGVnL0pQRUdJbWFnZVdyaXRlUGFyYW0uamF2YQppbmRleCAzNGEzY2Q5Li5iOTc5OTExIDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9wbHVnaW5zL2pwZWcvSlBFR0ltYWdlV3JpdGVQYXJhbS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3BsdWdpbnMvanBlZy9KUEVHSW1hZ2VXcml0ZVBhcmFtLmphdmEKQEAgLTIzLDM4ICsyMyw1MiBAQAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIC8qKgotICogVGhlIEpQRUdJbWFnZVdyaXRlUGFyYW0gY2xhc3MgYWxsb3dzIHRvIHNldCBKUEVHIEh1ZmZtYW4gdGFibGVzIAotICogYW5kIHF1YW50aXphdGlvbiB3aGVuIHVzaW5nIHRoZSBKUEVHIHdyaXRlciBwbHVnLWluLgorICogVGhlIEpQRUdJbWFnZVdyaXRlUGFyYW0gY2xhc3MgYWxsb3dzIHRvIHNldCBKUEVHIEh1ZmZtYW4gdGFibGVzIGFuZAorICogcXVhbnRpemF0aW9uIHdoZW4gdXNpbmcgdGhlIEpQRUcgd3JpdGVyIHBsdWctaW4uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSlBFR0ltYWdlV3JpdGVQYXJhbSBleHRlbmRzIEltYWdlV3JpdGVQYXJhbSB7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBDT01QX1FVQUxJVFlfVkFMVUVTLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0W10gQ09NUF9RVUFMSVRZX1ZBTFVFUyA9IHswLjA1ZiwgMC43NWYsIDAuOTVmfTsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IENPTVBfUVVBTElUWV9ERVNDUklQVElPTlMuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09NUF9RVUFMSVRZX0RFU0NSSVBUSU9OUyA9IHsKLSAgICAgICAgICAgICJNaW5pbXVtIHVzZWZ1bCIsCi0gICAgICAgICAgICAiVmlzdWFsbHkgbG9zc2xlc3MiLAotICAgICAgICAgICAgIk1heGltdW0gdXNlZnVsIgorCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENPTVBfUVVBTElUWV9WQUxVRVMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXRbXSBDT01QX1FVQUxJVFlfVkFMVUVTID0geworICAgICAgICAgICAgMC4wNWYsIDAuNzVmLCAwLjk1ZgogICAgIH07CiAKLSAgICAvKiogVGhlIHEgdGFibGVzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDT01QX1FVQUxJVFlfREVTQ1JJUFRJT05TLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTVBfUVVBTElUWV9ERVNDUklQVElPTlMgPSB7CisgICAgICAgICAgICAiTWluaW11bSB1c2VmdWwiLCAiVmlzdWFsbHkgbG9zc2xlc3MiLCAiTWF4aW11bSB1c2VmdWwiCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRoZSBxIHRhYmxlcy4KKyAgICAgKi8KICAgICBwcml2YXRlIEpQRUdRVGFibGVbXSBxVGFibGVzOwotICAgIAotICAgIC8qKiBUaGUgZGMgaHVmZm1hbiB0YWJsZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGMgaHVmZm1hbiB0YWJsZXMuCisgICAgICovCiAgICAgcHJpdmF0ZSBKUEVHSHVmZm1hblRhYmxlW10gZGNIdWZmbWFuVGFibGVzOwotICAgIAotICAgIC8qKiBUaGUgYWMgaHVmZm1hbiB0YWJsZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgYWMgaHVmZm1hbiB0YWJsZXMuCisgICAgICovCiAgICAgcHJpdmF0ZSBKUEVHSHVmZm1hblRhYmxlW10gYWNIdWZmbWFuVGFibGVzOwogCi0gICAgLyoqIFRoZSBvcHRpbWl6ZSBodWZmbWFuIHRhYmxlcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgb3B0aW1pemUgaHVmZm1hbiB0YWJsZXMuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIG9wdGltaXplSHVmZm1hblRhYmxlczsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBKUEVHSW1hZ2VXcml0ZVBhcmFtIG9iamVjdCB3aXRoIAotICAgICAqIHRoZSBzcGVjaWZpZWQgTG9jYWxlLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBKUEVHSW1hZ2VXcml0ZVBhcmFtIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgTG9jYWxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsb2NhbGUgdGhlIExvY2FsZS4KKyAgICAgKiBAcGFyYW0gbG9jYWxlCisgICAgICogICAgICAgICAgICB0aGUgTG9jYWxlLgogICAgICAqLwogICAgIHB1YmxpYyBKUEVHSW1hZ2VXcml0ZVBhcmFtKExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgc3VwZXIobG9jYWxlKTsKQEAgLTYzLDM3ICs3NywzOCBAQAogICAgICAgICBwcm9ncmVzc2l2ZU1vZGUgPSBJbWFnZVdyaXRlUGFyYW0uTU9ERV9ESVNBQkxFRDsKIAogICAgICAgICBjYW5Xcml0ZUNvbXByZXNzZWQgPSB0cnVlOwotICAgICAgICBjb21wcmVzc2lvblR5cGVzID0gbmV3IFN0cmluZ1tdeyJKUEVHIn07Ci0gICAgICAgIGNvbXByZXNzaW9uVHlwZSA9IGNvbXByZXNzaW9uVHlwZXNbMF07IAorICAgICAgICBjb21wcmVzc2lvblR5cGVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICJKUEVHIgorICAgICAgICB9OworICAgICAgICBjb21wcmVzc2lvblR5cGUgPSBjb21wcmVzc2lvblR5cGVzWzBdOwogICAgICAgICBjb21wcmVzc2lvblF1YWxpdHkgPSBKUEVHQ29uc3RzLkRFRkFVTFRfSlBFR19DT01QUkVTU0lPTl9RVUFMSVRZOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0YWJsZXMgYXJlIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0YWJsZXMgYXJlIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGFibGVzIGFyZSBzZXQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBhcmVUYWJsZXNTZXQoKSB7CiAgICAgICAgIHJldHVybiBxVGFibGVzICE9IG51bGw7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgcXVhbnRpemF0aW9uIGFuZCBIdWZmbWFuIHRhYmxlcyBmb3IgdXNpbmcgaW4gCi0gICAgICogZW5jb2Rpbmcgc3RyZWFtcy4KKyAgICAgKiBTZXRzIHRoZSBxdWFudGl6YXRpb24gYW5kIEh1ZmZtYW4gdGFibGVzIGZvciB1c2luZyBpbiBlbmNvZGluZyBzdHJlYW1zLgogICAgICAqIAotICAgICAqIEBwYXJhbSBxVGFibGVzIHRoZSBxdWFudGl6YXRpb24gdGFibGVzLgotICAgICAqIEBwYXJhbSBEQ0h1ZmZtYW5UYWJsZXMgdGhlIHN0YW5kYXJ0IERDIEh1ZmZtYW4gdGFibGVzLgotICAgICAqIEBwYXJhbSBBQ0h1ZmZtYW5UYWJsZXMgdGhlIHN0YW5kYXJ0IEFDIGh1ZmZtYW4gdGFibGVzLgorICAgICAqIEBwYXJhbSBxVGFibGVzCisgICAgICogICAgICAgICAgICB0aGUgcXVhbnRpemF0aW9uIHRhYmxlcy4KKyAgICAgKiBAcGFyYW0gRENIdWZmbWFuVGFibGVzCisgICAgICogICAgICAgICAgICB0aGUgc3RhbmRhcnQgREMgSHVmZm1hbiB0YWJsZXMuCisgICAgICogQHBhcmFtIEFDSHVmZm1hblRhYmxlcworICAgICAqICAgICAgICAgICAgdGhlIHN0YW5kYXJ0IEFDIGh1ZmZtYW4gdGFibGVzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kZVRhYmxlcygKLSAgICAgICAgICAgIEpQRUdRVGFibGVbXSBxVGFibGVzLAotICAgICAgICAgICAgSlBFR0h1ZmZtYW5UYWJsZVtdIERDSHVmZm1hblRhYmxlcywKLSAgICAgICAgICAgIEpQRUdIdWZmbWFuVGFibGVbXSBBQ0h1ZmZtYW5UYWJsZXMKLSAgICApIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVUYWJsZXMoSlBFR1FUYWJsZVtdIHFUYWJsZXMsIEpQRUdIdWZmbWFuVGFibGVbXSBEQ0h1ZmZtYW5UYWJsZXMsCisgICAgICAgICAgICBKUEVHSHVmZm1hblRhYmxlW10gQUNIdWZmbWFuVGFibGVzKSB7CiAgICAgICAgIGlmIChxVGFibGVzID09IG51bGwgfHwgRENIdWZmbWFuVGFibGVzID09IG51bGwgfHwgQUNIdWZmbWFuVGFibGVzID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgSlBFRyB0YWJsZSBhcnJheXMiKTsKICAgICAgICAgfQotICAgICAgICBpZihEQ0h1ZmZtYW5UYWJsZXMubGVuZ3RoICE9IEFDSHVmZm1hblRhYmxlcy5sZW5ndGgpIHsKKyAgICAgICAgaWYgKERDSHVmZm1hblRhYmxlcy5sZW5ndGggIT0gQUNIdWZmbWFuVGFibGVzLmxlbmd0aCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBKUEVHIHRhYmxlIGFycmF5cyIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChxVGFibGVzLmxlbmd0aCA+IDQgfHwgRENIdWZmbWFuVGFibGVzLmxlbmd0aCA+IDQpIHsKQEAgLTE1NSwyMSArMTcwLDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmxhZyBpbmRpY2F0ZWQgdGhhdCB0aGUgd3JpdGVyIHdpbGwgZ2VuZXJhdGUgb3B0aW1pemVkIAotICAgICAqIEh1ZmZtYW4gdGFibGVzIGZvciB0aGUgaW1hZ2UgYXMgcGFydCBvZiB0aGUgd3JpdGluZyBwcm9jZXNzLgorICAgICAqIFNldHMgdGhlIGZsYWcgaW5kaWNhdGVkIHRoYXQgdGhlIHdyaXRlciB3aWxsIGdlbmVyYXRlIG9wdGltaXplZCBIdWZmbWFuCisgICAgICogdGFibGVzIGZvciB0aGUgaW1hZ2UgYXMgcGFydCBvZiB0aGUgd3JpdGluZyBwcm9jZXNzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvcHRpbWl6ZSB0aGUgZmxhZyBvZiBvcHRpbWl6aW5nIGh1ZmZtYW4gdGFibGVzLgorICAgICAqIEBwYXJhbSBvcHRpbWl6ZQorICAgICAqICAgICAgICAgICAgdGhlIGZsYWcgb2Ygb3B0aW1pemluZyBodWZmbWFuIHRhYmxlcy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRPcHRpbWl6ZUh1ZmZtYW5UYWJsZXMoYm9vbGVhbiBvcHRpbWl6ZSkgewogICAgICAgICBvcHRpbWl6ZUh1ZmZtYW5UYWJsZXMgPSBvcHRpbWl6ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdyaXRlciBnZW5lcmF0ZXMgb3B0aW1pemVkIEh1ZmZtYW4gdGFibGVzLAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdyaXRlciBnZW5lcmF0ZXMgb3B0aW1pemVkIEh1ZmZtYW4gdGFibGVzLCBmYWxzZQorICAgICAqIG90aGVyd2lzZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0cnVlIGlmIHRoZSB3cml0ZXIgZ2VuZXJhdGVzIG9wdGltaXplZCBIdWZmbWFuIHRhYmxlcywKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgd3JpdGVyIGdlbmVyYXRlcyBvcHRpbWl6ZWQgSHVmZm1hbiB0YWJsZXMsIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0T3B0aW1pemVIdWZmbWFuVGFibGVzKCkgewogICAgICAgICByZXR1cm4gb3B0aW1pemVIdWZmbWFuVGFibGVzOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9qcGVnL0pQRUdRVGFibGUuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3BsdWdpbnMvanBlZy9KUEVHUVRhYmxlLmphdmEKaW5kZXggMGM1YjM3ZS4uMzQ2MWQ0NiAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9qcGVnL0pQRUdRVGFibGUuamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9wbHVnaW5zL2pwZWcvSlBFR1FUYWJsZS5qYXZhCkBAIC0xOCw4OCArMTgsOTIgQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW8ucGx1Z2lucy5qcGVnOwogCiAvKioKLSAqIFRoZSBKUEVHUVRhYmxlIGNsYXNzIHJlcHJlc2VudHMgYSBzaW5nbGUgSlBFRyBxdWFudGl6YXRpb24gdGFibGUgCi0gKiBhbmQgcHJvdmlkZXMgZm9yIHRoZSBzdGFuZGFyZCB0YWJsZXMgdGFrZW4gZnJvbSB0aGUgSlBFRyBzcGVjaWZpY2F0aW9uLgorICogVGhlIEpQRUdRVGFibGUgY2xhc3MgcmVwcmVzZW50cyBhIHNpbmdsZSBKUEVHIHF1YW50aXphdGlvbiB0YWJsZSBhbmQgcHJvdmlkZXMKKyAqIGZvciB0aGUgc3RhbmRhcmQgdGFibGVzIHRha2VuIGZyb20gdGhlIEpQRUcgc3BlY2lmaWNhdGlvbi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBKUEVHUVRhYmxlIHsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgU0laRS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU0laRS4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU0laRSA9IDY0OwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQkFTRUxJTkVfTUFYLiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEJBU0VMSU5FX01BWC4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQkFTRUxJTkVfTUFYID0gMjU1OwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgTUFYLiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IE1BWC4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYID0gMzI3Njc7CiAKLQotICAgIC8qKiBUaGUgdGFibGUuICovCisgICAgLyoqCisgICAgICogVGhlIHRhYmxlLgorICAgICAqLwogICAgIHByaXZhdGUgaW50W10gdGhlVGFibGU7CiAKICAgICAvKgotICAgICAqIEsxICYgSzIgdGFibGVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgSlBFRyBmb3JtYXQgc3BlY2lmaWNhdGlvbiAKLSAgICAgKiBhdCBodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9KUEVHL2l0dS10ODEucGRmCisgICAgICogSzEgJiBLMiB0YWJsZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBKUEVHIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGF0CisgICAgICogaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvSlBFRy9pdHUtdDgxLnBkZgogICAgICAqLwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBLMUx1bVRhYmxlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBLMUx1bVRhYmxlLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEsxTHVtVGFibGUgPSBuZXcgaW50W10gewotICAgICAgICAxNiwgIDExLCAgMTAsICAxNiwgIDI0LCAgNDAsICA1MSwgIDYxLAotICAgICAgICAxMiwgIDEyLCAgMTQsICAxOSwgIDI2LCAgNTgsICA2MCwgIDU1LAotICAgICAgICAxNCwgIDEzLCAgMTYsICAyNCwgIDQwLCAgNTcsICA2OSwgIDU2LAotICAgICAgICAxNCwgIDE3LCAgMjIsICAyOSwgIDUxLCAgODcsICA4MCwgIDYyLAotICAgICAgICAxOCwgIDIyLCAgMzcsICA1NiwgIDY4LCAgMTA5LCAxMDMsIDc3LAotICAgICAgICAyNCwgIDM1LCAgNTUsICA2NCwgIDgxLCAgMTA0LCAxMTMsIDkyLAotICAgICAgICA0OSwgIDY0LCAgNzgsICA4NywgIDEwMywgMTIxLCAxMjAsIDEwMSwKLSAgICAgICAgNzIsICA5MiwgIDk1LCAgOTgsICAxMTIsIDEwMCwgMTAzLCA5OQorICAgICAgICAgICAgMTYsIDExLCAxMCwgMTYsIDI0LCA0MCwgNTEsIDYxLCAxMiwgMTIsIDE0LCAxOSwgMjYsIDU4LCA2MCwgNTUsIDE0LCAxMywgMTYsIDI0LCA0MCwgNTcsCisgICAgICAgICAgICA2OSwgNTYsIDE0LCAxNywgMjIsIDI5LCA1MSwgODcsIDgwLCA2MiwgMTgsIDIyLCAzNywgNTYsIDY4LCAxMDksIDEwMywgNzcsIDI0LCAzNSwgNTUsCisgICAgICAgICAgICA2NCwgODEsIDEwNCwgMTEzLCA5MiwgNDksIDY0LCA3OCwgODcsIDEwMywgMTIxLCAxMjAsIDEwMSwgNzIsIDkyLCA5NSwgOTgsIDExMiwgMTAwLAorICAgICAgICAgICAgMTAzLCA5OQogICAgIH07CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEsyQ2hyVGFibGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEsyQ2hyVGFibGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gSzJDaHJUYWJsZSA9IG5ldyBpbnRbXSB7Ci0gICAgICAgIDE3LCAgMTgsICAyNCwgIDQ3LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgICAgIDE4LCAgMjEsICAyNiwgIDY2LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgICAgIDI0LCAgMjYsICA1NiwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgICAgIDQ3LCAgNjYsICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTkKKyAgICAgICAgICAgIDE3LCAxOCwgMjQsIDQ3LCA5OSwgOTksIDk5LCA5OSwgMTgsIDIxLCAyNiwgNjYsIDk5LCA5OSwgOTksIDk5LCAyNCwgMjYsIDU2LCA5OSwgOTksIDk5LAorICAgICAgICAgICAgOTksIDk5LCA0NywgNjYsIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksCisgICAgICAgICAgICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTkKICAgICB9OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBLMUx1bWluYW5jZSBpbmRpY2F0ZXMgc3RhbmRhcnQgdGFibGUgSy4xIGZyb20gSlBFRwotICAgICAqIHNwZWNpZmljYXRpb24gYW5kIHByb2R1Y2VzICJnb29kIiBxdWFsaXR5IG91dHB1dC4gCisgICAgLyoqCisgICAgICogVGhlIEsxTHVtaW5hbmNlIGluZGljYXRlcyBzdGFuZGFyZCB0YWJsZSBLLjEgZnJvbSBKUEVHIHNwZWNpZmljYXRpb24gYW5kCisgICAgICogcHJvZHVjZXMgImdvb2QiIHF1YWxpdHkgb3V0cHV0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSlBFR1FUYWJsZSBLMUx1bWluYW5jZSA9IG5ldyBKUEVHUVRhYmxlKEsxTHVtVGFibGUpOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgSzFEaXYyTHVtaW5hbmNlIGluZGljYXRlcyBLLjEgdGFibGUgZnJvbSBKUEVHCi0gICAgICogc3BlY2lmaWNhdGlvbiB3aXRoIGFsbCBlbGVtZW50cyBkaXZpZGVkIGJ5IDIgYW5kIHByb2R1Y2VzCi0gICAgICogInZlcnkgZ29vZCIgcXVhbGl0eSBvdXRwdXQuIAorCisgICAgLyoqCisgICAgICogVGhlIEsxRGl2Mkx1bWluYW5jZSBpbmRpY2F0ZXMgSy4xIHRhYmxlIGZyb20gSlBFRyBzcGVjaWZpY2F0aW9uIHdpdGggYWxsCisgICAgICogZWxlbWVudHMgZGl2aWRlZCBieSAyIGFuZCBwcm9kdWNlcyAidmVyeSBnb29kIiBxdWFsaXR5IG91dHB1dC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEpQRUdRVGFibGUgSzFEaXYyTHVtaW5hbmNlID0gSzFMdW1pbmFuY2UuZ2V0U2NhbGVkSW5zdGFuY2UoMC41ZiwgdHJ1ZSk7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBLMkNocm9taW5hbmNlIGluZGljYXRlcyBLLjIgdGFibGUgZnJvbSBKUEVHCi0gICAgICogc3BlY2lmaWNhdGlvbiBhbmQgcHJvZHVjZXMgImdvb2QiIHF1YWxpdHkgb3V0cHV0LiAKKworICAgIC8qKgorICAgICAqIFRoZSBLMkNocm9taW5hbmNlIGluZGljYXRlcyBLLjIgdGFibGUgZnJvbSBKUEVHIHNwZWNpZmljYXRpb24gYW5kCisgICAgICogcHJvZHVjZXMgImdvb2QiIHF1YWxpdHkgb3V0cHV0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSlBFR1FUYWJsZSBLMkNocm9taW5hbmNlID0gbmV3IEpQRUdRVGFibGUoSzJDaHJUYWJsZSk7Ci0gICAgCi0gICAgLyoqIAorCisgICAgLyoqCiAgICAgICogVGhlIENvbnN0YW50IEsyRGl2MkNocm9taW5hbmNlIGluZGljYXRlcyBLLjIgdGFibGUgZnJvbSBKUEVHCi0gICAgICogc3BlY2lmaWNhdGlvbiB3aXRoIGFsbCBlbGVtZW50cyBkaXZpZGVkIGJ5IDIgYW5kIHByb2R1Y2VzCi0gICAgICogInZlcnkgZ29vZCIgcXVhbGl0eSBvdXRwdXQuIAorICAgICAqIHNwZWNpZmljYXRpb24gd2l0aCBhbGwgZWxlbWVudHMgZGl2aWRlZCBieSAyIGFuZCBwcm9kdWNlcyAidmVyeSBnb29kIgorICAgICAqIHF1YWxpdHkgb3V0cHV0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSlBFR1FUYWJsZSBLMkRpdjJDaHJvbWluYW5jZSA9IEsyQ2hyb21pbmFuY2UuZ2V0U2NhbGVkSW5zdGFuY2UoMC41ZiwgdHJ1ZSk7OwogCi0KICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSlBFR1FUYWJsZSBmcm9tIHRoZSBhcnJheSwgd2hpY2ggCi0gICAgICogc2hvdWxkIGNvbnRhaW4gNjQgZWxlbWVudHMgaW4gbmF0dXJhbCBvcmRlci4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSlBFR1FUYWJsZSBmcm9tIHRoZSBhcnJheSwgd2hpY2ggc2hvdWxkIGNvbnRhaW4gNjQKKyAgICAgKiBlbGVtZW50cyBpbiBuYXR1cmFsIG9yZGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgcXVhbnRpemF0aW9uIHRhYmxlLgorICAgICAqIEBwYXJhbSB0YWJsZQorICAgICAqICAgICAgICAgICAgdGhlIHF1YW50aXphdGlvbiB0YWJsZS4KICAgICAgKi8KICAgICBwdWJsaWMgSlBFR1FUYWJsZShpbnRbXSB0YWJsZSkgewogICAgICAgICBpZiAodGFibGUgPT0gbnVsbCkgewpAQCAtMTEyLDIzICsxMTYsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHF1YW50aXphdGlvbiB0YWJsZSBhcyBhbiBhcnJheSBvZiBpbnQgdmFsdWVzLgorICAgICAqIEdldHMgdGhlIGN1cnJlbnQgcXVhbnRpemF0aW9uIHRhYmxlIGFzIGFuIGFycmF5IG9mIGludGVnZXIgdmFsdWVzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcXVhbnRpemF0aW9uIHRhYmxlIGFzIGFuIGFycmF5IG9mIGludCB2YWx1ZXMuCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBxdWFudGl6YXRpb24gdGFibGUgYXMgYW4gYXJyYXkgb2YgaW50ZWdlciB2YWx1ZXMuCiAgICAgICovCiAgICAgcHVibGljIGludFtdIGdldFRhYmxlKCkgewogICAgICAgICByZXR1cm4gdGhlVGFibGUuY2xvbmUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzY2FsZWQgaW5zdGFuY2UgYXMgcXVhbnRpemF0aW9uIHRhYmxlIHdoZXJlIAotICAgICAqIHRoZSB2YWx1ZXMgYXJlIG11bHRpcGxpZWQgYnkgdGhlIHNjYWxlRmFjdG9yIGFuZCB0aGVuIGNsYW1wZWQgCi0gICAgICogaWYgZm9yY2VCYXNlbGluZSBpcyB0cnVlLgorICAgICAqIEdldHMgdGhlIHNjYWxlZCBpbnN0YW5jZSBhcyBxdWFudGl6YXRpb24gdGFibGUgd2hlcmUgdGhlIHZhbHVlcyBhcmUKKyAgICAgKiBtdWx0aXBsaWVkIGJ5IHRoZSBzY2FsZUZhY3RvciBhbmQgdGhlbiBjbGFtcGVkIGlmIGZvcmNlQmFzZWxpbmUgaXMgdHJ1ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2NhbGVGYWN0b3IgdGhlIHNjYWxlIGZhY3RvciBvZiB0YWJsZS4KLSAgICAgKiBAcGFyYW0gZm9yY2VCYXNlbGluZSB0aGUgZm9yY2UgYmFzZWxpbmUgZmxhZywgdGhlIHZhbHVlcyAKLSAgICAgKiBzaG91bGQgYmUgY2xhbXBlZCBpZiB0cnVlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBzY2FsZUZhY3RvcgorICAgICAqICAgICAgICAgICAgdGhlIHNjYWxlIGZhY3RvciBvZiB0YWJsZS4KKyAgICAgKiBAcGFyYW0gZm9yY2VCYXNlbGluZQorICAgICAqICAgICAgICAgICAgdGhlIGZvcmNlIGJhc2VsaW5lIGZsYWcsIHRoZSB2YWx1ZXMgc2hvdWxkIGJlIGNsYW1wZWQgaWYgdHJ1ZS4KICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgcXVhbnRpemF0aW9uIHRhYmxlLgogICAgICAqLwogICAgIHB1YmxpYyBKUEVHUVRhYmxlIGdldFNjYWxlZEluc3RhbmNlKGZsb2F0IHNjYWxlRmFjdG9yLCBib29sZWFuIGZvcmNlQmFzZWxpbmUpIHsKQEAgLTE1Niw3ICsxNTksNyBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIC8vLS0gVE9ETyBtb3JlIGluZm9ybWF0aXZlIGluZm8KKyAgICAgICAgLy8gLS0gVE9ETyBtb3JlIGluZm9ybWF0aXZlIGluZm8KICAgICAgICAgcmV0dXJuICJKUEVHUVRhYmxlIjsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9wbHVnaW5zL2pwZWcvcGFja2FnZS5odG1sIGIvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9qcGVnL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDU3NWM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9qcGVnL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8Ym9keT4KKyAgICA8cD4KKyAgICAgIFRoaXMgcGFja2FnZSBjb250YWlucyBhdXhpbGlhcnkgY2xhc3NlcyBmb3IgdGhlIGJ1aWx0LWluIEpQRUcgaW1hZ2UgcGx1Zy1pbi4KKyAgICA8L3A+CisgIEBzaW5jZSBBbmRyb2lkIDEuMAorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSUlPUmVnaXN0cnkuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JSU9SZWdpc3RyeS5qYXZhCmluZGV4IDNjMWM5ODkuLjAxZGRlYWEgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JSU9SZWdpc3RyeS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JSU9SZWdpc3RyeS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvLnNwaTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CkBAIC0zOSwzNyArNDAsNDEgQEAKICAqLwogCiAvKioKLSAqIFRoZSBJSU9SZWdpc3RyeSBjbGFzcyByZWdpc3RlcnMgc2VydmljZSBwcm92aWRlciBpbnN0YW5jZXMgCi0gKiAoU1BJKS4gU2VydmljZSBwcm92aWRlciBpbnN0YW5jZXMgYXJlIHJlY29nbml6ZWQgYnkgc3BlY2lmaWMgCi0gKiBtZXRhLWluZm9ybWF0aW9uIGluIHRoZSBKQVIgZmlsZXMgY29udGFpbmluZyB0aGVtLiBUaGUgSkFSCi0gKiBmaWxlcyB3aXRoIFNQSSBjbGFzc2VzIGFyZSBsb2FkZWQgZnJvbSB0aGUgYXBwbGljYXRpb24gY2xhc3MgCi0gKiBwYXRoLiAKKyAqIFRoZSBJSU9SZWdpc3RyeSBjbGFzcyByZWdpc3RlcnMgc2VydmljZSBwcm92aWRlciBpbnN0YW5jZXMgKFNQSSkuIFNlcnZpY2UKKyAqIHByb3ZpZGVyIGluc3RhbmNlcyBhcmUgcmVjb2duaXplZCBieSBzcGVjaWZpYyBtZXRhLWluZm9ybWF0aW9uIGluIHRoZSBKQVIKKyAqIGZpbGVzIGNvbnRhaW5pbmcgdGhlbS4gVGhlIEpBUiBmaWxlcyB3aXRoIFNQSSBjbGFzc2VzIGFyZSBsb2FkZWQgZnJvbSB0aGUKKyAqIGFwcGxpY2F0aW9uIGNsYXNzIHBhdGguCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgSUlPUmVnaXN0cnkgZXh0ZW5kcyBTZXJ2aWNlUmVnaXN0cnkgewogCi0gICAgLyoqIFRoZSBpbnN0YW5jZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaW5zdGFuY2UuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgSUlPUmVnaXN0cnkgaW5zdGFuY2U7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IENBVEVHT1JJRVMuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENBVEVHT1JJRVMuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBDQVRFR09SSUVTID0gbmV3IENsYXNzW10gewotICAgICAgICBqYXZheC5pbWFnZWlvLnNwaS5JbWFnZVdyaXRlclNwaS5jbGFzcywKLSAgICAgICAgamF2YXguaW1hZ2Vpby5zcGkuSW1hZ2VSZWFkZXJTcGkuY2xhc3MsCi0gICAgICAgIGphdmF4LmltYWdlaW8uc3BpLkltYWdlSW5wdXRTdHJlYW1TcGkuY2xhc3MsCi0gICAgICAgIC8vamF2YXguaW1hZ2Vpby5zcGkuSW1hZ2VUcmFuc2NvZGVyU3BpLmNsYXNzLAotICAgICAgICBqYXZheC5pbWFnZWlvLnNwaS5JbWFnZU91dHB1dFN0cmVhbVNwaS5jbGFzcworICAgICAgICAgICAgamF2YXguaW1hZ2Vpby5zcGkuSW1hZ2VXcml0ZXJTcGkuY2xhc3MsIGphdmF4LmltYWdlaW8uc3BpLkltYWdlUmVhZGVyU3BpLmNsYXNzLAorICAgICAgICAgICAgamF2YXguaW1hZ2Vpby5zcGkuSW1hZ2VJbnB1dFN0cmVhbVNwaS5jbGFzcywKKyAgICAgICAgICAgIC8vIGphdmF4LmltYWdlaW8uc3BpLkltYWdlVHJhbnNjb2RlclNwaS5jbGFzcywKKyAgICAgICAgICAgIGphdmF4LmltYWdlaW8uc3BpLkltYWdlT3V0cHV0U3RyZWFtU3BpLmNsYXNzCiAgICAgfTsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBpSU8gcmVnaXN0cnkuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IElJTyByZWdpc3RyeS4KICAgICAgKi8KICAgICBwcml2YXRlIElJT1JlZ2lzdHJ5KCkgewotICAgICAgICBzdXBlcihBcnJheXMuPENsYXNzPD8+PmFzTGlzdChDQVRFR09SSUVTKS5pdGVyYXRvcigpKTsKKyAgICAgICAgc3VwZXIoQXJyYXlzLjxDbGFzczw/Pj4gYXNMaXN0KENBVEVHT1JJRVMpLml0ZXJhdG9yKCkpOwogICAgICAgICByZWdpc3RlckJ1aWx0aW5TcGlzKCk7CiAgICAgICAgIHJlZ2lzdGVyQXBwbGljYXRpb25DbGFzc3BhdGhTcGlzKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVnaXN0ZXIgYnVpbHRpbiBzcGlzLgorICAgICAqIFJlZ2lzdGVyIGJ1aWx0LWluIFNQSXMuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyQnVpbHRpblNwaXMoKSB7CiAgICAgICAgIHJlZ2lzdGVyU2VydmljZVByb3ZpZGVyKG5ldyBKUEVHSW1hZ2VXcml0ZXJTcGkoKSk7CkBAIC04MCw5ICs4NSw5IEBACiAgICAgICAgIHJlZ2lzdGVyU2VydmljZVByb3ZpZGVyKG5ldyBGaWxlSUlTU3BpKCkpOwogICAgICAgICByZWdpc3RlclNlcnZpY2VQcm92aWRlcihuZXcgUkFGSU9TU3BpKCkpOwogICAgICAgICByZWdpc3RlclNlcnZpY2VQcm92aWRlcihuZXcgUkFGSUlTU3BpKCkpOwotICAgICAgICByZWdpc3RlclNlcnZpY2VQcm92aWRlcihuZXcgT3V0cHV0U3RyZWFtSU9TU3BpKCkpOyAgICAgICAgCisgICAgICAgIHJlZ2lzdGVyU2VydmljZVByb3ZpZGVyKG5ldyBPdXRwdXRTdHJlYW1JT1NTcGkoKSk7CiAgICAgICAgIHJlZ2lzdGVyU2VydmljZVByb3ZpZGVyKG5ldyBJbnB1dFN0cmVhbUlJU1NwaSgpKTsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgIH0KIAogICAgIC8qKgpAQCAtOTEsNyArOTYsOCBAQAogICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgSUlPUmVnaXN0cnkgaW5zdGFuY2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJSU9SZWdpc3RyeSBnZXREZWZhdWx0SW5zdGFuY2UoKSB7Ci0gICAgICAgIC8vIFRPRE8gaW1wbGVtZW50IG93biBpbnN0YW5jZSBmb3IgZWFjaCBUaHJlYWRHcm91cCAoc2VlIGFsc28gVGhyZWFkTG9jYWwpCisgICAgICAgIC8vIFRPRE8gaW1wbGVtZW50IG93biBpbnN0YW5jZSBmb3IgZWFjaCBUaHJlYWRHcm91cCAoc2VlIGFsc28KKyAgICAgICAgLy8gVGhyZWFkTG9jYWwpCiAgICAgICAgIHN5bmNocm9uaXplZCAoSUlPUmVnaXN0cnkuY2xhc3MpIHsKICAgICAgICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgSUlPUmVnaXN0cnkoKTsKQEAgLTEwMSwxMCArMTA3LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYWxsIHNlcnZpY2UgcHJvdmlkZXJzIGZyb20gdGhlIGFwcGxpY2F0aW9uIGNsYXNzIAotICAgICAqIHBhdGguCisgICAgICogUmVnaXN0ZXJzIGFsbCBzZXJ2aWNlIHByb3ZpZGVycyBmcm9tIHRoZSBhcHBsaWNhdGlvbiBjbGFzcyBwYXRoLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQXBwbGljYXRpb25DbGFzc3BhdGhTcGlzKCkgewotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50IGZvciBub24tYnVpbHRpbiBwbHVnaW5zCisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50IGZvciBub24tYnVpbHRpbiBwbHVnaW5zCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vc3BpL0lJT1NlcnZpY2VQcm92aWRlci5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vc3BpL0lJT1NlcnZpY2VQcm92aWRlci5qYXZhCmluZGV4IGY1ODczYmYuLmU5NDc2NzcgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JSU9TZXJ2aWNlUHJvdmlkZXIuamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSUlPU2VydmljZVByb3ZpZGVyLmphdmEKQEAgLTE4LDI3ICsxOCwzNiBAQAogICogQGF1dGhvciBSdXN0ZW0gVi4gUmFmaWtvdgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5zcGk7CiAKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiAvKioKLSAqIFRoZSBJSU9TZXJ2aWNlUHJvdmlkZXIgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgYmFzZSBmdW5jdGlvbmFsaXR5IAotICogZm9yIGltYWdlaW8gc2VydmljZSBwcm92aWRlciBpbnRlcmZhY2VzIChTUElzKS4gCisgKiBUaGUgSUlPU2VydmljZVByb3ZpZGVyIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIGJhc2UgZnVuY3Rpb25hbGl0eSBmb3IgSW1hZ2VJTworICogc2VydmljZSBwcm92aWRlciBpbnRlcmZhY2VzIChTUElzKS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJSU9TZXJ2aWNlUHJvdmlkZXIgaW1wbGVtZW50cyBSZWdpc3RlcmFibGVTZXJ2aWNlIHsKIAotICAgIC8qKiBUaGUgdmVuZG9yIG5hbWUgb2YgdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSB2ZW5kb3IgbmFtZSBvZiB0aGlzIHNlcnZpY2UgcHJvdmlkZXIuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyB2ZW5kb3JOYW1lOwotICAgIAotICAgIC8qKiBUaGUgdmVyc2lvbiBvZiB0aGlzIHNlcnZpY2UgcHJvdmlkZXIuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGlzIHNlcnZpY2UgcHJvdmlkZXIuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IElJT1NlcnZpY2VQcm92aWRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmVuZG9yTmFtZSB0aGUgdmVuZG9yIG5hbWUgb2Ygc2VydmljZSBwcm92aWRlci4KLSAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiBvZiBzZXJ2aWNlIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSB2ZW5kb3JOYW1lCisgICAgICogICAgICAgICAgICB0aGUgdmVuZG9yIG5hbWUgb2Ygc2VydmljZSBwcm92aWRlci4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbgorICAgICAqICAgICAgICAgICAgdGhlIHZlcnNpb24gb2Ygc2VydmljZSBwcm92aWRlci4KICAgICAgKi8KICAgICBwdWJsaWMgSUlPU2VydmljZVByb3ZpZGVyKFN0cmluZyB2ZW5kb3JOYW1lLCBTdHJpbmcgdmVyc2lvbikgewogICAgICAgICBpZiAodmVuZG9yTmFtZSA9PSBudWxsKSB7CkBAIC04NSwxMiArOTQsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgZGVzY3JpcHRpb24gb2YgdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLiAgIAotICAgICAqIFRoZSByZXN1bHQgc3RyaW5nIHNob3VsZCBiZSBsb2NhbGl6ZWQgZm9yIHRoZSBzcGVjaWZpZWQgCi0gICAgICogTG9jYWxlLgorICAgICAqIEdldHMgYSBkZXNjcmlwdGlvbiBvZiB0aGlzIHNlcnZpY2UgcHJvdmlkZXIuIFRoZSByZXN1bHQgc3RyaW5nIHNob3VsZCBiZQorICAgICAqIGxvY2FsaXplZCBmb3IgdGhlIHNwZWNpZmllZCBMb2NhbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxvY2FsZSB0aGUgc3BlY2lmaWVkIExvY2FsZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gbG9jYWxlCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIExvY2FsZS4KICAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHNlcnZpY2UgcHJvdmlkZXIuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREZXNjcmlwdGlvbihMb2NhbGUgbG9jYWxlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZUlucHV0U3RyZWFtU3BpLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSW1hZ2VJbnB1dFN0cmVhbVNwaS5qYXZhCmluZGV4IDQ3ZDIxMGEuLmZjODU5YTggMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZUlucHV0U3RyZWFtU3BpLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vc3BpL0ltYWdlSW5wdXRTdHJlYW1TcGkuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBSdXN0ZW0gVi4gUmFmaWtvdgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5zcGk7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC0yNSwxMyArMjYsMTYgQEAKIGltcG9ydCBqYXZheC5pbWFnZWlvLnN0cmVhbS5JbWFnZUlucHV0U3RyZWFtOwogCiAvKioKLSAqIFRoZSBJbWFnZUlucHV0U3RyZWFtU3BpIGFic3RyYWN0IGNsYXNzIGlzIGEgc2VydmljZSBwcm92aWRlciAKLSAqIGludGVyZmFjZSAoU1BJKSBmb3IgSW1hZ2VJbnB1dFN0cmVhbXMuICAKKyAqIFRoZSBJbWFnZUlucHV0U3RyZWFtU3BpIGFic3RyYWN0IGNsYXNzIGlzIGEgc2VydmljZSBwcm92aWRlciBpbnRlcmZhY2UgKFNQSSkKKyAqIGZvciBJbWFnZUlucHV0U3RyZWFtcy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbWFnZUlucHV0U3RyZWFtU3BpIGV4dGVuZHMgSUlPU2VydmljZVByb3ZpZGVyIGltcGxlbWVudHMKLSAgICAgICAgUmVnaXN0ZXJhYmxlU2VydmljZSB7Ci0gICAgCi0gICAgLyoqIFRoZSBpbnB1dCBjbGFzcy4gKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbWFnZUlucHV0U3RyZWFtU3BpIGV4dGVuZHMgSUlPU2VydmljZVByb3ZpZGVyIGltcGxlbWVudHMgUmVnaXN0ZXJhYmxlU2VydmljZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5wdXQgY2xhc3MuCisgICAgICovCiAgICAgcHJvdGVjdGVkIENsYXNzPD8+IGlucHV0Q2xhc3M7CiAKICAgICAvKioKQEAgLTQ0LDkgKzQ4LDEyIEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEltYWdlSW5wdXRTdHJlYW1TcGkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHZlbmRvck5hbWUgdGhlIHZlbmRvciBuYW1lLgotICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uLgotICAgICAqIEBwYXJhbSBpbnB1dENsYXNzIHRoZSBpbnB1dCBjbGFzcy4KKyAgICAgKiBAcGFyYW0gdmVuZG9yTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHZlbmRvciBuYW1lLgorICAgICAqIEBwYXJhbSB2ZXJzaW9uCisgICAgICogICAgICAgICAgICB0aGUgdmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gaW5wdXRDbGFzcworICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IGNsYXNzLgogICAgICAqLwogICAgIHB1YmxpYyBJbWFnZUlucHV0U3RyZWFtU3BpKFN0cmluZyB2ZW5kb3JOYW1lLCBTdHJpbmcgdmVyc2lvbiwgQ2xhc3M8Pz4gaW5wdXRDbGFzcykgewogICAgICAgICBzdXBlcih2ZW5kb3JOYW1lLCB2ZXJzaW9uKTsKQEAgLTU0LDggKzYxLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGlucHV0IENsYXNzIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgY2xhc3Mgb3IgCi0gICAgICogaW50ZXJmYWNlIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhbiBpbnB1dCBzb3VyY2UuCisgICAgICogR2V0cyBhbiBpbnB1dCBDbGFzcyBvYmplY3QgdGhhdCByZXByZXNlbnRzIGNsYXNzIG9yIGludGVyZmFjZSB0aGF0IG11c3QKKyAgICAgKiBiZSBpbXBsZW1lbnRlZCBieSBhbiBpbnB1dCBzb3VyY2UuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgaW5wdXQgY2xhc3MuCiAgICAgICovCkBAIC02NCw2MSArNzEsNTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEltYWdlSW5wdXRTdHJlYW0gY2FuIHVzZSBhIGNhY2hlIAotICAgICAqIGZpbGUuIElmIHRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UsIHRoZSB2YWx1ZSBvZiB0aGUgCi0gICAgICogdXNlQ2FjaGUgcGFyYW1ldGVyIG9mIGNyZWF0ZUlucHV0U3RyZWFtSW5zdGFuY2Ugd2lsbCAKLSAgICAgKiBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGZhbHNlLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgSW1hZ2VJbnB1dFN0cmVhbSBjYW4gdXNlIGEgY2FjaGUgZmlsZS4gSWYgdGhpcyBtZXRob2QKKyAgICAgKiByZXR1cm5zIGZhbHNlLCB0aGUgdmFsdWUgb2YgdGhlIHVzZUNhY2hlIHBhcmFtZXRlciBvZgorICAgICAqIGNyZWF0ZUlucHV0U3RyZWFtSW5zdGFuY2Ugd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgICAqIHJldHVybnMgZmFsc2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBJbWFnZUlucHV0U3RyZWFtIGNhbiB1c2UgYSBjYWNoZSAKLSAgICAgKiBmaWxlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgSW1hZ2VJbnB1dFN0cmVhbSBjYW4gdXNlIGEgY2FjaGUgZmlsZSwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjYW5Vc2VDYWNoZUZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsgLy8tLSBkZWYKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyAtLSBkZWYKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEltYWdlSW5wdXRTdHJlYW0gaW1wbGVtZW50YXRpb24gCi0gICAgICogcmVxdWlyZXMgdGhlIHVzZSBvZiBhIGNhY2hlIGZpbGUuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIAotICAgICAqIHJldHVybnMgZmFsc2UuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBJbWFnZUlucHV0U3RyZWFtIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRoZSB1c2Ugb2YgYQorICAgICAqIGNhY2hlIGZpbGUuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgZmFsc2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBJbWFnZUlucHV0U3RyZWFtIGltcGxlbWVudGF0aW9uIAotICAgICAqIHJlcXVpcmVzIHRoZSB1c2Ugb2YgYSBjYWNoZSBmaWxlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgSW1hZ2VJbnB1dFN0cmVhbSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aGUgdXNlIG9mCisgICAgICogICAgICAgICBhIGNhY2hlIGZpbGUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc0NhY2hlRmlsZSgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBkZWYKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBJbWFnZUlucHV0U3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIAotICAgICAqIHNlcnZpY2UgcHJvdmlkZXIuIFRoZSBpbnB1dCBvYmplY3Qgc2hvdWxkCi0gICAgICogYmUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHJldHVybmVkIGJ5IHRoIGdldElucHV0Q2xhc3MgCi0gICAgICogbWV0aG9kLiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5Ci0gICAgICogZm9yIHRoZSBjYWNoZSBmaWxlIGlmIHRoZSB1c2VDYWNoZSBwYXJhbWV0ZXIgaXMgdHJ1ZS4gCisgICAgICogQ3JlYXRlcyB0aGUgSW1hZ2VJbnB1dFN0cmVhbSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLiBUaGUKKyAgICAgKiBpbnB1dCBvYmplY3Qgc2hvdWxkIGJlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyByZXR1cm5lZCBieSB0aGUKKyAgICAgKiBnZXRJbnB1dENsYXNzIG1ldGhvZC4gVGhpcyBtZXRob2QgdXNlcyB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBmb3IgdGhlCisgICAgICogY2FjaGUgZmlsZSBpZiB0aGUgdXNlQ2FjaGUgcGFyYW1ldGVyIGlzIHRydWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBPYmplY3QuCi0gICAgICogQHBhcmFtIHVzZUNhY2hlIHRoZSBmbGFnIGluZGljYXRpbmcgaWYgYSBjYWNoZSBmaWxlIAotICAgICAqIGlzIG5lZWRlZCBvciBub3QuCi0gICAgICogQHBhcmFtIGNhY2hlRGlyIHRoZSBjYWNoZSBkaXJlY3RvcnkuCi0gICAgICogCisgICAgICogQHBhcmFtIGlucHV0CisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgT2JqZWN0LgorICAgICAqIEBwYXJhbSB1c2VDYWNoZQorICAgICAqICAgICAgICAgICAgdGhlIGZsYWcgaW5kaWNhdGluZyBpZiBhIGNhY2hlIGZpbGUgaXMgbmVlZGVkIG9yIG5vdC4KKyAgICAgKiBAcGFyYW0gY2FjaGVEaXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYWNoZSBkaXJlY3RvcnkuCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2VJbnB1dFN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEltYWdlSW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW1JbnN0YW5jZShPYmplY3QgaW5wdXQsIGJvb2xlYW4gdXNlQ2FjaGUsCiAgICAgICAgICAgICBGaWxlIGNhY2hlRGlyKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBJbWFnZUlucHV0U3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIAotICAgICAqIHNlcnZpY2UgcHJvdmlkZXIuIFRoZSBpbnB1dCBvYmplY3Qgc2hvdWxkCi0gICAgICogYmUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHJldHVybmVkIGJ5IGdldElucHV0Q2xhc3MgCi0gICAgICogbWV0aG9kLiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBkZWZhdWx0IHN5c3RlbSBkaXJlY3RvcnkKLSAgICAgKiBmb3IgdGhlIGNhY2hlIGZpbGUsIGlmIGl0IGlzIG5lZWRlZC4gCisgICAgICogQ3JlYXRlcyB0aGUgSW1hZ2VJbnB1dFN0cmVhbSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLiBUaGUKKyAgICAgKiBpbnB1dCBvYmplY3Qgc2hvdWxkIGJlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyByZXR1cm5lZCBieSBnZXRJbnB1dENsYXNzCisgICAgICogbWV0aG9kLiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBkZWZhdWx0IHN5c3RlbSBkaXJlY3RvcnkgZm9yIHRoZSBjYWNoZSBmaWxlLAorICAgICAqIGlmIGl0IGlzIG5lZWRlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IE9iamVjdC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBPYmplY3QuCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2VJbnB1dFN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIEltYWdlSW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW1JbnN0YW5jZShPYmplY3QgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBjcmVhdGVJbnB1dFN0cmVhbUluc3RhbmNlKGlucHV0LCB0cnVlLCBudWxsKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZU91dHB1dFN0cmVhbVNwaS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vc3BpL0ltYWdlT3V0cHV0U3RyZWFtU3BpLmphdmEKaW5kZXggZDQ1ZTI0Yy4uYjdhOWE1YyAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vc3BpL0ltYWdlT3V0cHV0U3RyZWFtU3BpLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vc3BpL0ltYWdlT3V0cHV0U3RyZWFtU3BpLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW8uc3BpOwogCiBpbXBvcnQgamF2YXguaW1hZ2Vpby5zdHJlYW0uSW1hZ2VPdXRwdXRTdHJlYW07CkBAIC0yNSwxMyArMjYsMTcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiAKIC8qKgotICogVGhlIEltYWdlT3V0cHV0U3RyZWFtU3BpIGFic3RyYWN0IGNsYXNzIGlzIGEgc2VydmljZSBwcm92aWRlciAKLSAqIGludGVyZmFjZSAoU1BJKSBmb3IgSW1hZ2VPdXRwdXRTdHJlYW1zLiAKKyAqIFRoZSBJbWFnZU91dHB1dFN0cmVhbVNwaSBhYnN0cmFjdCBjbGFzcyBpcyBhIHNlcnZpY2UgcHJvdmlkZXIgaW50ZXJmYWNlIChTUEkpCisgKiBmb3IgSW1hZ2VPdXRwdXRTdHJlYW1zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEltYWdlT3V0cHV0U3RyZWFtU3BpIGV4dGVuZHMgSUlPU2VydmljZVByb3ZpZGVyIGltcGxlbWVudHMKICAgICAgICAgUmVnaXN0ZXJhYmxlU2VydmljZSB7Ci0gICAgCi0gICAgLyoqIFRoZSBvdXRwdXQgY2xhc3MuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgb3V0cHV0IGNsYXNzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBDbGFzczw/PiBvdXRwdXRDbGFzczsKIAogICAgIC8qKgpAQCAtNDQsOSArNDksMTIgQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2VPdXRwdXRTdHJlYW1TcGkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHZlbmRvck5hbWUgdGhlIHZlbmRvciBuYW1lLgotICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uLgotICAgICAqIEBwYXJhbSBvdXRwdXRDbGFzcyB0aGUgb3V0cHV0IGNsYXNzLgorICAgICAqIEBwYXJhbSB2ZW5kb3JOYW1lCisgICAgICogICAgICAgICAgICB0aGUgdmVuZG9yIG5hbWUuCisgICAgICogQHBhcmFtIHZlcnNpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZXJzaW9uLgorICAgICAqIEBwYXJhbSBvdXRwdXRDbGFzcworICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBjbGFzcy4KICAgICAgKi8KICAgICBwdWJsaWMgSW1hZ2VPdXRwdXRTdHJlYW1TcGkoU3RyaW5nIHZlbmRvck5hbWUsIFN0cmluZyB2ZXJzaW9uLCBDbGFzczw/PiBvdXRwdXRDbGFzcykgewogICAgICAgICBzdXBlcih2ZW5kb3JOYW1lLCB2ZXJzaW9uKTsKQEAgLTU0LDggKzYyLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIG91dHB1dCBDbGFzcyBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBjbGFzcyBvciAKLSAgICAgKiBpbnRlcmZhY2UgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGFuIG91dHB1dCBzb3VyY2UuCisgICAgICogR2V0cyBhbiBvdXRwdXQgQ2xhc3Mgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlIHRoYXQKKyAgICAgKiBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGFuIG91dHB1dCBzb3VyY2UuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgb3V0cHV0IGNsYXNzLgogICAgICAqLwpAQCAtNjQsNjMgKzcyLDYxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBJbWFnZU91dHB1dFN0cmVhbSBjYW4gdXNlIGEgY2FjaGUgCi0gICAgICogZmlsZS4gSWYgdGhpcyBtZXRob2QgcmV0dXJucyBmYWxzZSwgdGhlIHZhbHVlIG9mIHRoZSAKLSAgICAgKiB1c2VDYWNoZSBwYXJhbWV0ZXIgb2YgY3JlYXRlT3V0cHV0U3RyZWFtSW5zdGFuY2Ugd2lsbCAKLSAgICAgKiBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGZhbHNlLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgSW1hZ2VPdXRwdXRTdHJlYW0gY2FuIHVzZSBhIGNhY2hlIGZpbGUuIElmIHRoaXMKKyAgICAgKiBtZXRob2QgcmV0dXJucyBmYWxzZSwgdGhlIHZhbHVlIG9mIHRoZSB1c2VDYWNoZSBwYXJhbWV0ZXIgb2YKKyAgICAgKiBjcmVhdGVPdXRwdXRTdHJlYW1JbnN0YW5jZSB3aWxsIGJlIGlnbm9yZWQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgICogcmV0dXJucyBmYWxzZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIEltYWdlT3V0cHV0U3RyZWFtIGNhbiB1c2UgYSBjYWNoZSAKLSAgICAgKiBmaWxlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgSW1hZ2VPdXRwdXRTdHJlYW0gY2FuIHVzZSBhIGNhY2hlIGZpbGUsIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuVXNlQ2FjaGVGaWxlKCkgewogICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGRlZgogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgSW1hZ2VPdXRwdXRTdHJlYW0gIGltcGxlbWVudGF0aW9uIAotICAgICAqIHJlcXVpcmVzIHRoZSB1c2Ugb2YgYSBjYWNoZSBmaWxlLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAKLSAgICAgKiByZXR1cm5zIGZhbHNlLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgSW1hZ2VPdXRwdXRTdHJlYW0gaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGhlIHVzZSBvZgorICAgICAqIGEgY2FjaGUgZmlsZS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBmYWxzZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIEltYWdlT3V0cHV0U3RyZWFtICBpbXBsZW1lbnRhdGlvbiAKLSAgICAgKiByZXF1aXJlcyB0aGUgdXNlIG9mIGEgY2FjaGUgZmlsZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIEltYWdlT3V0cHV0U3RyZWFtIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRoZSB1c2Ugb2YKKyAgICAgKiAgICAgICAgIGEgY2FjaGUgZmlsZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIG5lZWRzQ2FjaGVGaWxlKCkgewogICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGRlZgogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIEltYWdlT3V0cHV0U3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIAotICAgICAqIHNlcnZpY2UgcHJvdmlkZXIuIFRoZSBvdXRwdXQgb2JqZWN0IHNob3VsZAotICAgICAqIGJlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyByZXR1cm5lZCBieSBnZXRPdXRwdXRDbGFzcyAKLSAgICAgKiBtZXRob2QuIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGRlZmF1bHQgc3lzdGVtIGRpcmVjdG9yeQotICAgICAqIGZvciB0aGUgY2FjaGUgZmlsZSwgaWYgaXQgaXMgbmVlZGVkLiAKKyAgICAgKiBDcmVhdGVzIHRoZSBJbWFnZU91dHB1dFN0cmVhbSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLiBUaGUKKyAgICAgKiBvdXRwdXQgb2JqZWN0IHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgcmV0dXJuZWQgYnkKKyAgICAgKiBnZXRPdXRwdXRDbGFzcyBtZXRob2QuIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGRlZmF1bHQgc3lzdGVtIGRpcmVjdG9yeSBmb3IKKyAgICAgKiB0aGUgY2FjaGUgZmlsZSwgaWYgaXQgaXMgbmVlZGVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvdXRwdXQgdGhlIG91dHB1dCBPYmplY3QuCi0gICAgICogCisgICAgICogQHBhcmFtIG91dHB1dAorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBPYmplY3QuCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2VPdXRwdXRTdHJlYW0uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBJbWFnZU91dHB1dFN0cmVhbSBjcmVhdGVPdXRwdXRTdHJlYW1JbnN0YW5jZShPYmplY3Qgb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gY3JlYXRlT3V0cHV0U3RyZWFtSW5zdGFuY2Uob3V0cHV0LCB0cnVlLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBJbWFnZU91dHB1dFN0cmVhbSBhc3NvY2lhdGVkIHdpdGggdGhpcyAKLSAgICAgKiBzZXJ2aWNlIHByb3ZpZGVyLiBUaGUgb3V0cHV0IG9iamVjdCBzaG91bGQKLSAgICAgKiBiZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgcmV0dXJuZWQgYnkgZ2V0SW5wdXRDbGFzcyAKLSAgICAgKiBtZXRob2QuIFRoaXMgbWV0aG9kIHVzZXMgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkKLSAgICAgKiBmb3IgdGhlIGNhY2hlIGZpbGUsIGlmIHRoZSB1c2VDYWNoZSBwYXJhbWV0ZXIgaXMgdHJ1ZS4gCisgICAgICogQ3JlYXRlcyB0aGUgSW1hZ2VPdXRwdXRTdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmljZSBwcm92aWRlci4gVGhlCisgICAgICogb3V0cHV0IG9iamVjdCBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHJldHVybmVkIGJ5CisgICAgICogZ2V0SW5wdXRDbGFzcyBtZXRob2QuIFRoaXMgbWV0aG9kIHVzZXMgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgZm9yIHRoZQorICAgICAqIGNhY2hlIGZpbGUsIGlmIHRoZSB1c2VDYWNoZSBwYXJhbWV0ZXIgaXMgdHJ1ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQgT2JqZWN0LgotICAgICAqIEBwYXJhbSB1c2VDYWNoZSB0aGUgZmxhZyBpbmRpY2F0aW5nIGlmIGNhY2hlIGZpbGUgCi0gICAgICogaXMgbmVlZGVkIG9yIG5vdC4KLSAgICAgKiBAcGFyYW0gY2FjaGVEaXIgdGhlIGNhY2hlIGRpcmVjdG9yeS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3V0cHV0CisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IE9iamVjdC4KKyAgICAgKiBAcGFyYW0gdXNlQ2FjaGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbGFnIGluZGljYXRpbmcgaWYgY2FjaGUgZmlsZSBpcyBuZWVkZWQgb3Igbm90LgorICAgICAqIEBwYXJhbSBjYWNoZURpcgorICAgICAqICAgICAgICAgICAgdGhlIGNhY2hlIGRpcmVjdG9yeS4KICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZU91dHB1dFN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IEltYWdlT3V0cHV0U3RyZWFtIGNyZWF0ZU91dHB1dFN0cmVhbUluc3RhbmNlKE9iamVjdCBvdXRwdXQsCi0gICAgICAgICAgICBib29sZWFuIHVzZUNhY2hlLCBGaWxlIGNhY2hlRGlyKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgcHVibGljIGFic3RyYWN0IEltYWdlT3V0cHV0U3RyZWFtIGNyZWF0ZU91dHB1dFN0cmVhbUluc3RhbmNlKE9iamVjdCBvdXRwdXQsIGJvb2xlYW4gdXNlQ2FjaGUsCisgICAgICAgICAgICBGaWxlIGNhY2hlRGlyKSB0aHJvd3MgSU9FeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSW1hZ2VSZWFkZXJTcGkuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZVJlYWRlclNwaS5qYXZhCmluZGV4IDJlMjQ4NGMuLjA1MjhkMjUgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZVJlYWRlclNwaS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZVJlYWRlclNwaS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvLnNwaTsKIAogaW1wb3J0IGphdmF4LmltYWdlaW8uc3RyZWFtLkltYWdlSW5wdXRTdHJlYW07CkBAIC0yNSwyMCArMjYsMjggQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiAvKioKLSAqIFRoZSBJbWFnZVJlYWRlclNwaSBhYnN0cmFjdCBjbGFzcyBpcyBhIHNlcnZpY2UgcHJvdmlkZXIgCi0gKiBpbnRlcmZhY2UgKFNQSSkgZm9yIEltYWdlUmVhZGVycy4KKyAqIFRoZSBJbWFnZVJlYWRlclNwaSBhYnN0cmFjdCBjbGFzcyBpcyBhIHNlcnZpY2UgcHJvdmlkZXIgaW50ZXJmYWNlIChTUEkpIGZvcgorICogSW1hZ2VSZWFkZXJzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEltYWdlUmVhZGVyU3BpIGV4dGVuZHMgSW1hZ2VSZWFkZXJXcml0ZXJTcGkgewogCi0gICAgLyoqIAotICAgICAqIFRoZSBTVEFOREFSRF9JTlBVVF9UWVBFIGNvbnRhaW5zIEltYWdlSW5wdXRTdHJlYW0uY2xhc3MuIAorICAgIC8qKgorICAgICAqIFRoZSBTVEFOREFSRF9JTlBVVF9UWVBFIGNvbnRhaW5zIEltYWdlSW5wdXRTdHJlYW0uY2xhc3MuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzc1tdIFNUQU5EQVJEX0lOUFVUX1RZUEUgPSBuZXcgQ2xhc3NbXSB7SW1hZ2VJbnB1dFN0cmVhbS5jbGFzc307CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzc1tdIFNUQU5EQVJEX0lOUFVUX1RZUEUgPSBuZXcgQ2xhc3NbXSB7CisgICAgICAgIEltYWdlSW5wdXRTdHJlYW0uY2xhc3MKKyAgICB9OwogCi0gICAgLyoqIFRoZSBpbnB1dCB0eXBlcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaW5wdXQgdHlwZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIENsYXNzW10gaW5wdXRUeXBlczsKLSAgICAKLSAgICAvKiogVGhlIHdyaXRlciBTUEkgbmFtZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgd3JpdGVyIFNQSSBuYW1lcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gd3JpdGVyU3BpTmFtZXM7CiAKICAgICAvKioKQEAgLTUxLDQ5ICs2MCw2MiBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbWFnZVJlYWRlclNwaS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmVuZG9yTmFtZSB0aGUgdmVuZG9yIG5hbWUuCi0gICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHZlcnNpb24uCi0gICAgICogQHBhcmFtIG5hbWVzIHRoZSBmb3JtYXQgbmFtZXMuCi0gICAgICogQHBhcmFtIHN1ZmZpeGVzIHRoZSBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgZmlsZSBzdWZmaXhlcy4gCi0gICAgICogQHBhcmFtIE1JTUVUeXBlcyB0aGUgYW4gYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgTUlNRSB0eXBlcy4KLSAgICAgKiBAcGFyYW0gcGx1Z2luQ2xhc3NOYW1lIHRoZSBwbHVnaW4gY2xhc3MgbmFtZS4KLSAgICAgKiBAcGFyYW0gaW5wdXRUeXBlcyB0aGUgaW5wdXQgdHlwZXMuCi0gICAgICogQHBhcmFtIHdyaXRlclNwaU5hbWVzIHRoZSBhcnJheSBvZiBzdHJpbmdzIHdpdGggY2xhc3MgbmFtZXMgb2YgYWxsIAotICAgICAqIGFzc29jaWF0ZWQgSW1hZ2VXcml0ZXJzLgotICAgICAqIEBwYXJhbSBzdXBwb3J0c1N0YW5kYXJkU3RyZWFtTWV0YWRhdGFGb3JtYXQgdGhlIHZhbHVlIGluZGljYXRpbmcKLSAgICAgKiBpZiBzdHJlYW0gbWV0YWRhdGEgY2FuIGJlIGRlc2NyaWJlZCBieSBzdGFuZGFydCBtZXRhZGF0YSBmb3JtYXQuCi0gICAgICogQHBhcmFtIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZSB0aGUgbmF0aXZlIHN0cmVhbSBtZXRhZGF0YSAKLSAgICAgKiBmb3JtYXQgbmFtZSwgcmV0dXJuZWQgYnkgZ2V0TmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lLgotICAgICAqIEBwYXJhbSBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZSB0aGUgbmF0aXZlIHN0cmVhbSAKLSAgICAgKiBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZSwgcmV0dXJuZWQgYnkgZ2V0TmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXQuCi0gICAgICogQHBhcmFtIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcyB0aGUgZXh0cmEgc3RyZWFtIG1ldGFkYXRhIAotICAgICAqIGZvcm1hdCBuYW1lcywgcmV0dXJuZWQgYnkgZ2V0RXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzLgotICAgICAqIEBwYXJhbSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcyB0aGUgZXh0cmEgc3RyZWFtIG1ldGFkYXRhIAotICAgICAqIGZvcm1hdCBjbGFzcyBuYW1lcywgcmV0dXJuZWQgYnkgZ2V0U3RyZWFtTWV0YWRhdGFGb3JtYXQuCi0gICAgICogQHBhcmFtIHN1cHBvcnRzU3RhbmRhcmRJbWFnZU1ldGFkYXRhRm9ybWF0IHRoZSB2YWx1ZSBpbmRpY2F0aW5nCi0gICAgICogaWYgaW1hZ2UgbWV0YWRhdGEgY2FuIGJlIGRlc2NyaWJlZCBieSBzdGFuZGFydCBtZXRhZGF0YSBmb3JtYXQuCi0gICAgICogQHBhcmFtIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXROYW1lIHRoZSBuYXRpdmUgaW1hZ2UgbWV0YWRhdGEgCi0gICAgICogZm9ybWF0IG5hbWUsIHJldHVybmVkIGJ5IGdldE5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXROYW1lLgotICAgICAqIEBwYXJhbSBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lIHRoZSBuYXRpdmUgaW1hZ2UKLSAgICAgKiBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZSwgcmV0dXJuZWQgYnkgZ2V0TmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdC4KLSAgICAgKiBAcGFyYW0gZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZXMgdGhlIGV4dHJhIGltYWdlIG1ldGFkYXRhIAotICAgICAqIGZvcm1hdCBuYW1lcywgcmV0dXJuZWQgYnkgZ2V0RXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZXMuCi0gICAgICogQHBhcmFtIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMgdGhlIGV4dHJhIGltYWdlIG1ldGFkYXRhIAotICAgICAqIGZvcm1hdCBjbGFzcyBuYW1lcywgcmV0dXJuZWQgYnkgZ2V0SW1hZ2VNZXRhZGF0YUZvcm1hdC4KKyAgICAgKiBAcGFyYW0gdmVuZG9yTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHZlbmRvciBuYW1lLgorICAgICAqIEBwYXJhbSB2ZXJzaW9uCisgICAgICogICAgICAgICAgICB0aGUgdmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gbmFtZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBmb3JtYXQgbmFtZXMuCisgICAgICogQHBhcmFtIHN1ZmZpeGVzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIGZpbGUgc3VmZml4ZXMuCisgICAgICogQHBhcmFtIE1JTUVUeXBlcworICAgICAqICAgICAgICAgICAgdGhlIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIE1JTUUgdHlwZXMuCisgICAgICogQHBhcmFtIHBsdWdpbkNsYXNzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHBsdWctaW4gY2xhc3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gaW5wdXRUeXBlcworICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IHR5cGVzLgorICAgICAqIEBwYXJhbSB3cml0ZXJTcGlOYW1lcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCBjbGFzcyBuYW1lcyBvZiBhbGwgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgSW1hZ2VXcml0ZXJzLgorICAgICAqIEBwYXJhbSBzdXBwb3J0c1N0YW5kYXJkU3RyZWFtTWV0YWRhdGFGb3JtYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBpbmRpY2F0aW5nIGlmIHN0cmVhbSBtZXRhZGF0YSBjYW4gYmUgZGVzY3JpYmVkIGJ5CisgICAgICogICAgICAgICAgICBzdGFuZGFyZCBtZXRhZGF0YSBmb3JtYXQuCisgICAgICogQHBhcmFtIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hdGl2ZSBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0IG5hbWUsIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICBnZXROYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWUuCisgICAgICogQHBhcmFtIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmF0aXZlIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZSwgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgIGdldE5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0LgorICAgICAqIEBwYXJhbSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBleHRyYSBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0IG5hbWVzLCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgZ2V0RXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzLgorICAgICAqIEBwYXJhbSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcworICAgICAqICAgICAgICAgICAgdGhlIGV4dHJhIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZXMsIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICBnZXRTdHJlYW1NZXRhZGF0YUZvcm1hdC4KKyAgICAgKiBAcGFyYW0gc3VwcG9ydHNTdGFuZGFyZEltYWdlTWV0YWRhdGFGb3JtYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBpbmRpY2F0aW5nIGlmIGltYWdlIG1ldGFkYXRhIGNhbiBiZSBkZXNjcmliZWQgYnkKKyAgICAgKiAgICAgICAgICAgIHN0YW5kYXJkIG1ldGFkYXRhIGZvcm1hdC4KKyAgICAgKiBAcGFyYW0gbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYXRpdmUgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0IG5hbWUsIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICBnZXROYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZS4KKyAgICAgKiBAcGFyYW0gbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hdGl2ZSBpbWFnZSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZSwgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgIGdldE5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXQuCisgICAgICogQHBhcmFtIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzCisgICAgICogICAgICAgICAgICB0aGUgZXh0cmEgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0IG5hbWVzLCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgZ2V0RXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZXMuCisgICAgICogQHBhcmFtIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBleHRyYSBpbWFnZSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZXMsIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICBnZXRJbWFnZU1ldGFkYXRhRm9ybWF0LgogICAgICAqLwogICAgIHB1YmxpYyBJbWFnZVJlYWRlclNwaShTdHJpbmcgdmVuZG9yTmFtZSwgU3RyaW5nIHZlcnNpb24sIFN0cmluZ1tdIG5hbWVzLCBTdHJpbmdbXSBzdWZmaXhlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gTUlNRVR5cGVzLCBTdHJpbmcgcGx1Z2luQ2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIGlucHV0VHlwZXMsIFN0cmluZ1tdIHdyaXRlclNwaU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN1cHBvcnRzU3RhbmRhcmRTdHJlYW1NZXRhZGF0YUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN1cHBvcnRzU3RhbmRhcmRJbWFnZU1ldGFkYXRhRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcykgeworICAgICAgICAgICAgU3RyaW5nW10gTUlNRVR5cGVzLCBTdHJpbmcgcGx1Z2luQ2xhc3NOYW1lLCBDbGFzc1tdIGlucHV0VHlwZXMsCisgICAgICAgICAgICBTdHJpbmdbXSB3cml0ZXJTcGlOYW1lcywgYm9vbGVhbiBzdXBwb3J0c1N0YW5kYXJkU3RyZWFtTWV0YWRhdGFGb3JtYXQsCisgICAgICAgICAgICBTdHJpbmcgbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lLCBTdHJpbmcgbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUsCisgICAgICAgICAgICBTdHJpbmdbXSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMsIFN0cmluZ1tdIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzLAorICAgICAgICAgICAgYm9vbGVhbiBzdXBwb3J0c1N0YW5kYXJkSW1hZ2VNZXRhZGF0YUZvcm1hdCwgU3RyaW5nIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXROYW1lLAorICAgICAgICAgICAgU3RyaW5nIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUsIFN0cmluZ1tdIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzLAorICAgICAgICAgICAgU3RyaW5nW10gZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcykgewogICAgICAgICBzdXBlcih2ZW5kb3JOYW1lLCB2ZXJzaW9uLCBuYW1lcywgc3VmZml4ZXMsIE1JTUVUeXBlcywgcGx1Z2luQ2xhc3NOYW1lLAogICAgICAgICAgICAgICAgIHN1cHBvcnRzU3RhbmRhcmRTdHJlYW1NZXRhZGF0YUZvcm1hdCwgbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lLAogICAgICAgICAgICAgICAgIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lLCBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMsCkBAIC0xMDksOCArMTMxLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIENsYXNzIG9iamVjdHMgd2hvc2UgdHlwZXMgY2FuIGJlIHVzZWQgCi0gICAgICogYXMgaW5wdXQgZm9yIHRoaXMgcmVhZGVyLgorICAgICAqIEdldHMgYW4gYXJyYXkgb2YgQ2xhc3Mgb2JqZWN0cyB3aG9zZSB0eXBlcyBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcworICAgICAqIHJlYWRlci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBpbnB1dCB0eXBlcy4KICAgICAgKi8KQEAgLTExOSw2NiArMTQxLDYyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBmb3JtYXQgb2Ygc291cmNlIG9iamVjdCBpcwotICAgICAqIHN1cHBvcnRlZCBieSB0aGlzIHJlYWRlci4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGZvcm1hdCBvZiBzb3VyY2Ugb2JqZWN0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHJlYWRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2Ugb2JqZWN0IHRvIGJlIGRlY29kZWQgCi0gICAgICogKGZvciBleGFtcGxlIGFuIEltYWdlSW5wdXRTdHJlYW0pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZm9ybWF0IG9mIHNvdXJjZSBvYmplY3QgaXMKLSAgICAgKiBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIG9iamVjdCB0byBiZSBkZWNvZGVkIChmb3IgZXhhbXBsZSBhbgorICAgICAqICAgICAgICAgICAgSW1hZ2VJbnB1dFN0cmVhbSkuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgZm9ybWF0IG9mIHNvdXJjZSBvYmplY3QgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgcmVhZGVyLAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjYW5EZWNvZGVJbnB1dChPYmplY3Qgc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBJbWFnZVJlYWRlciBpbXBsZW1lbnRhdGlvbiBmb3IKLSAgICAgKiB0aGlzIHNlcnZpY2UgcHJvdmlkZXIuCisgICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgSW1hZ2VSZWFkZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgc2VydmljZQorICAgICAqIHByb3ZpZGVyLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIEltYWdlUmVhZGVyLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgSW1hZ2VSZWFkZXIgY3JlYXRlUmVhZGVySW5zdGFuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gY3JlYXRlUmVhZGVySW5zdGFuY2UobnVsbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgSW1hZ2VSZWFkZXIgaW1wbGVtZW50YXRpb24gZm9yCi0gICAgICogdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLgorICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIEltYWdlUmVhZGVyIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHNlcnZpY2UKKyAgICAgKiBwcm92aWRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uIHRoZSBhIHBsdWdpbiBzcGVjaWZpYyBleHRlbnNpb24gb2JqZWN0LCBvciBudWxsLgotICAgICAqIAorICAgICAqIEBwYXJhbSBleHRlbnNpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBhIHBsdWctaW4gc3BlY2lmaWMgZXh0ZW5zaW9uIG9iamVjdCwgb3IgbnVsbC4KICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZVJlYWRlci4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEltYWdlUmVhZGVyIGNyZWF0ZVJlYWRlckluc3RhbmNlKE9iamVjdCBleHRlbnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIEltYWdlUmVhZGVyIG9iamVjdCAKLSAgICAgKiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgSW1hZ2VSZWFkZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgCi0gICAgICogc2VydmljZSBwcm92aWRlciBvciBub3QuCisgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgSW1hZ2VSZWFkZXIgb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mCisgICAgICogdGhlIEltYWdlUmVhZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZpY2UgcHJvdmlkZXIgb3Igbm90LgogICAgICAqIAotICAgICAqIEBwYXJhbSByZWFkZXIgdGhlIEltYWdlUmVhZGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBJbWFnZVJlYWRlciBvYmplY3QgCi0gICAgICogaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEltYWdlUmVhZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIAotICAgICAqIHNlcnZpY2UgcHJvdmlkZXIsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gcmVhZGVyCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VSZWFkZXIuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIEltYWdlUmVhZGVyIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUKKyAgICAgKiAgICAgICAgIEltYWdlUmVhZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZpY2UgcHJvdmlkZXIsIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNPd25SZWFkZXIoSW1hZ2VSZWFkZXIgcmVhZGVyKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCBuYW1lcyBvZiB0aGUgSW1hZ2VXcml0ZXJTcGkgCi0gICAgICogY2xhc3NlcyB0aGF0IHN1cHBvcnQgdGhlIGludGVybmFsIG1ldGFkYXRhIHJlcHJlc2VudGF0aW9uIAotICAgICAqIHVzZWQgYnkgdGhlIEltYWdlUmVhZGVyIG9mIHRoaXMgc2VydmljZSBwcm92aWRlciwgb3IgbnVsbCBpZiAKLSAgICAgKiB0aGVyZSBhcmUgbm8gc3VjaCBJbWFnZVdyaXRlcnMuCisgICAgICogR2V0cyBhbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggbmFtZXMgb2YgdGhlIEltYWdlV3JpdGVyU3BpIGNsYXNzZXMgdGhhdAorICAgICAqIHN1cHBvcnQgdGhlIGludGVybmFsIG1ldGFkYXRhIHJlcHJlc2VudGF0aW9uIHVzZWQgYnkgdGhlIEltYWdlUmVhZGVyIG9mCisgICAgICogdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLCBvciBudWxsIGlmIHRoZXJlIGFyZSBubyBzdWNoIEltYWdlV3JpdGVycy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCBuYW1lcyBvZiB0aGUgSW1hZ2VXcml0ZXJTcGkgCi0gICAgICogY2xhc3Nlcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBzdHJpbmdzIHdpdGggbmFtZXMgb2YgdGhlIEltYWdlV3JpdGVyU3BpIGNsYXNzZXMuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIGdldEltYWdlV3JpdGVyU3BpTmFtZXMoKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQiKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZVJlYWRlcldyaXRlclNwaS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vc3BpL0ltYWdlUmVhZGVyV3JpdGVyU3BpLmphdmEKaW5kZXggYjNjMGY5Mi4uOWNhMDhiNSAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vc3BpL0ltYWdlUmVhZGVyV3JpdGVyU3BpLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vc3BpL0ltYWdlUmVhZGVyV3JpdGVyU3BpLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW8uc3BpOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnguaW1hZ2Vpby5tZXRhZGF0YS5JSU9NZXRhZGF0YVV0aWxzOwpAQCAtMjUsOTcgKzI2LDEzOCBAQAogaW1wb3J0IGphdmF4LmltYWdlaW8ubWV0YWRhdGEuSUlPTWV0YWRhdGFGb3JtYXQ7CiAKIC8qKgotICogVGhlIEltYWdlUmVhZGVyV3JpdGVyU3BpIGNsYXNzIGlzIGEgc3VwZXJjbGFzcyBmb3IgdGhlIAotICogSW1hZ2VSZWFkZXJTcGkgYW5kIEltYWdlV3JpdGVyU3BpIFNQSXMuCisgKiBUaGUgSW1hZ2VSZWFkZXJXcml0ZXJTcGkgY2xhc3MgaXMgYSBzdXBlcmNsYXNzIGZvciB0aGUgSW1hZ2VSZWFkZXJTcGkgYW5kCisgKiBJbWFnZVdyaXRlclNwaSBTUElzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEltYWdlUmVhZGVyV3JpdGVyU3BpIGV4dGVuZHMgSUlPU2VydmljZVByb3ZpZGVyCi0gICAgICAgIGltcGxlbWVudHMgUmVnaXN0ZXJhYmxlU2VydmljZSB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW1hZ2VSZWFkZXJXcml0ZXJTcGkgZXh0ZW5kcyBJSU9TZXJ2aWNlUHJvdmlkZXIgaW1wbGVtZW50cworICAgICAgICBSZWdpc3RlcmFibGVTZXJ2aWNlIHsKIAotICAgIC8qKiBUaGUgbmFtZXMuICovCisgICAgLyoqCisgICAgICogVGhlIG5hbWVzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmdbXSBuYW1lczsKLSAgICAKLSAgICAvKiogVGhlIHN1ZmZpeGVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHN1ZmZpeGVzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmdbXSBzdWZmaXhlczsKLSAgICAKLSAgICAvKiogVGhlIE1JTUUgdHlwZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUlNRSB0eXBlcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gTUlNRVR5cGVzOwotICAgIAotICAgIC8qKiBUaGUgcGx1Z2luIGNsYXNzIG5hbWUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGx1Zy1pbiBjbGFzcyBuYW1lLgorICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmcgcGx1Z2luQ2xhc3NOYW1lOwotICAgIAotICAgIC8qKiBXaGV0aGVyIHRoZSByZWFkZXIvd3JpdGVyIHN1cHBvcnRzIHN0YW5kYXJkIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQuICovCisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSByZWFkZXIvd3JpdGVyIHN1cHBvcnRzIHN0YW5kYXJkIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNTdGFuZGFyZFN0cmVhbU1ldGFkYXRhRm9ybWF0OwotICAgIAotICAgIC8qKiBUaGUgbmF0aXZlIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgbmFtZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBuYXRpdmUgc3RyZWFtIG1ldGFkYXRhIGZvcm1hdCBuYW1lLgorICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmcgbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lOwotICAgIAotICAgIC8qKiBUaGUgbmF0aXZlIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBuYXRpdmUgc3RyZWFtIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lLgorICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmcgbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWU7Ci0gICAgCi0gICAgLyoqIFRoZSBleHRyYSBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0IG5hbWVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGV4dHJhIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgbmFtZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lczsKLSAgICAKLSAgICAvKiogVGhlIGV4dHJhIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXh0cmEgc3RyZWFtIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZXM7Ci0gICAgCi0gICAgLyoqIFdoZXRoZXIgdGhlIHJlYWRlci93cml0ZXIgc3VwcG9ydHMgc3RhbmRhcmQgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0LiAqLworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgcmVhZGVyL3dyaXRlciBzdXBwb3J0cyBzdGFuZGFyZCBpbWFnZSBtZXRhZGF0YSBmb3JtYXQuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNTdGFuZGFyZEltYWdlTWV0YWRhdGFGb3JtYXQ7Ci0gICAgCi0gICAgLyoqIFRoZSBuYXRpdmUgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0IG5hbWUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmF0aXZlIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBuYW1lLgorICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmcgbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWU7Ci0gICAgCi0gICAgLyoqIFRoZSBuYXRpdmUgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmF0aXZlIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lLgorICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmcgbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZTsKLSAgICAKLSAgICAvKiogVGhlIGV4dHJhIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBuYW1lcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBleHRyYSBpbWFnZSBtZXRhZGF0YSBmb3JtYXQgbmFtZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzOwotICAgIAotICAgIC8qKiBUaGUgZXh0cmEgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGV4dHJhIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lczsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbWFnZVJlYWRlcldyaXRlclNwaS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmVuZG9yTmFtZSB0aGUgdmVuZG9yIG5hbWUuCi0gICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHZlcnNpb24uCi0gICAgICogQHBhcmFtIG5hbWVzIHRoZSBmb3JtYXQgbmFtZXMuCi0gICAgICogQHBhcmFtIHN1ZmZpeGVzIHRoZSBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgZmlsZSBzdWZmaXhlcy4gCi0gICAgICogQHBhcmFtIE1JTUVUeXBlcyB0aGUgYW4gYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgTUlNRSB0eXBlcy4KLSAgICAgKiBAcGFyYW0gcGx1Z2luQ2xhc3NOYW1lIHRoZSBwbHVnaW4gY2xhc3MgbmFtZS4KLSAgICAgKiBAcGFyYW0gc3VwcG9ydHNTdGFuZGFyZFN0cmVhbU1ldGFkYXRhRm9ybWF0IHRoZSB2YWx1ZSBpbmRpY2F0aW5nCi0gICAgICogaWYgc3RyZWFtIG1ldGFkYXRhIGNhbiBiZSBkZXNjcmliZWQgYnkgc3RhbmRhcnQgbWV0YWRhdGEgZm9ybWF0LgotICAgICAqIEBwYXJhbSBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWUgdGhlIG5hdGl2ZSBzdHJlYW0gbWV0YWRhdGEgCi0gICAgICogZm9ybWF0IG5hbWUsIHJldHVybmVkIGJ5IGdldE5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZS4KLSAgICAgKiBAcGFyYW0gbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUgdGhlIG5hdGl2ZSBzdHJlYW0gCi0gICAgICogbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWUsIHJldHVybmVkIGJ5IGdldE5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0LgotICAgICAqIEBwYXJhbSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMgdGhlIGV4dHJhIHN0cmVhbSBtZXRhZGF0YSAKLSAgICAgKiBmb3JtYXQgbmFtZXMsIHJldHVybmVkIGJ5IGdldEV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcy4KLSAgICAgKiBAcGFyYW0gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMgdGhlIGV4dHJhIHN0cmVhbSBtZXRhZGF0YSAKLSAgICAgKiBmb3JtYXQgY2xhc3MgbmFtZXMsIHJldHVybmVkIGJ5IGdldFN0cmVhbU1ldGFkYXRhRm9ybWF0LgotICAgICAqIEBwYXJhbSBzdXBwb3J0c1N0YW5kYXJkSW1hZ2VNZXRhZGF0YUZvcm1hdCB0aGUgdmFsdWUgaW5kaWNhdGluZwotICAgICAqIGlmIGltYWdlIG1ldGFkYXRhIGNhbiBiZSBkZXNjcmliZWQgYnkgc3RhbmRhcmQgbWV0YWRhdGEgZm9ybWF0LgotICAgICAqIEBwYXJhbSBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZSB0aGUgbmF0aXZlIGltYWdlIG1ldGFkYXRhIAotICAgICAqIGZvcm1hdCBuYW1lLCByZXR1cm5lZCBieSBnZXROYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZS4KLSAgICAgKiBAcGFyYW0gbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZSB0aGUgbmF0aXZlIGltYWdlCi0gICAgICogbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWUsIHJldHVybmVkIGJ5IGdldE5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXQuCi0gICAgICogQHBhcmFtIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzIHRoZSBleHRyYSBpbWFnZSBtZXRhZGF0YSAKLSAgICAgKiBmb3JtYXQgbmFtZXMsIHJldHVybmVkIGJ5IGdldEV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzLgotICAgICAqIEBwYXJhbSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzIHRoZSBleHRyYSBpbWFnZSBtZXRhZGF0YSAKLSAgICAgKiBmb3JtYXQgY2xhc3MgbmFtZXMsIHJldHVybmVkIGJ5IGdldEltYWdlTWV0YWRhdGFGb3JtYXQuCisgICAgICogQHBhcmFtIHZlbmRvck5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZW5kb3IgbmFtZS4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbgorICAgICAqICAgICAgICAgICAgdGhlIHZlcnNpb24uCisgICAgICogQHBhcmFtIG5hbWVzCisgICAgICogICAgICAgICAgICB0aGUgZm9ybWF0IG5hbWVzLgorICAgICAqIEBwYXJhbSBzdWZmaXhlcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSBmaWxlIHN1ZmZpeGVzLgorICAgICAqIEBwYXJhbSBNSU1FVHlwZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbiBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyBNSU1FIHR5cGVzLgorICAgICAqIEBwYXJhbSBwbHVnaW5DbGFzc05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwbHVnLWluIGNsYXNzIG5hbWUuCisgICAgICogQHBhcmFtIHN1cHBvcnRzU3RhbmRhcmRTdHJlYW1NZXRhZGF0YUZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIGluZGljYXRpbmcgaWYgc3RyZWFtIG1ldGFkYXRhIGNhbiBiZSBkZXNjcmliZWQgYnkKKyAgICAgKiAgICAgICAgICAgIHN0YW5kYXJkIG1ldGFkYXRhIGZvcm1hdC4KKyAgICAgKiBAcGFyYW0gbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmF0aXZlIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgbmFtZSwgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgIGdldE5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZS4KKyAgICAgKiBAcGFyYW0gbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYXRpdmUgc3RyZWFtIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lLCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgZ2V0TmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXQuCisgICAgICogQHBhcmFtIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcworICAgICAqICAgICAgICAgICAgdGhlIGV4dHJhIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgbmFtZXMsIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICBnZXRFeHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMuCisgICAgICogQHBhcmFtIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzCisgICAgICogICAgICAgICAgICB0aGUgZXh0cmEgc3RyZWFtIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lcywgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgIGdldFN0cmVhbU1ldGFkYXRhRm9ybWF0LgorICAgICAqIEBwYXJhbSBzdXBwb3J0c1N0YW5kYXJkSW1hZ2VNZXRhZGF0YUZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIGluZGljYXRpbmcgaWYgaW1hZ2UgbWV0YWRhdGEgY2FuIGJlIGRlc2NyaWJlZCBieQorICAgICAqICAgICAgICAgICAgc3RhbmRhcmQgbWV0YWRhdGEgZm9ybWF0LgorICAgICAqIEBwYXJhbSBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hdGl2ZSBpbWFnZSBtZXRhZGF0YSBmb3JtYXQgbmFtZSwgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgIGdldE5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXROYW1lLgorICAgICAqIEBwYXJhbSBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmF0aXZlIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lLCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgZ2V0TmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdC4KKyAgICAgKiBAcGFyYW0gZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBleHRyYSBpbWFnZSBtZXRhZGF0YSBmb3JtYXQgbmFtZXMsIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICBnZXRFeHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lcy4KKyAgICAgKiBAcGFyYW0gZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcworICAgICAqICAgICAgICAgICAgdGhlIGV4dHJhIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lcywgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgIGdldEltYWdlTWV0YWRhdGFGb3JtYXQuCiAgICAgICovCiAgICAgcHVibGljIEltYWdlUmVhZGVyV3JpdGVyU3BpKFN0cmluZyB2ZW5kb3JOYW1lLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nW10gbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHN1ZmZpeGVzLCBTdHJpbmdbXSBNSU1FVHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwbHVnaW5DbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VwcG9ydHNTdGFuZGFyZFN0cmVhbU1ldGFkYXRhRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VwcG9ydHNTdGFuZGFyZEltYWdlTWV0YWRhdGFGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzKSB7CisgICAgICAgICAgICBTdHJpbmdbXSBzdWZmaXhlcywgU3RyaW5nW10gTUlNRVR5cGVzLCBTdHJpbmcgcGx1Z2luQ2xhc3NOYW1lLAorICAgICAgICAgICAgYm9vbGVhbiBzdXBwb3J0c1N0YW5kYXJkU3RyZWFtTWV0YWRhdGFGb3JtYXQsIFN0cmluZyBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWUsCisgICAgICAgICAgICBTdHJpbmcgbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUsIFN0cmluZ1tdIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcywKKyAgICAgICAgICAgIFN0cmluZ1tdIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzLAorICAgICAgICAgICAgYm9vbGVhbiBzdXBwb3J0c1N0YW5kYXJkSW1hZ2VNZXRhZGF0YUZvcm1hdCwgU3RyaW5nIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXROYW1lLAorICAgICAgICAgICAgU3RyaW5nIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUsIFN0cmluZ1tdIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzLAorICAgICAgICAgICAgU3RyaW5nW10gZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcykgewogICAgICAgICBzdXBlcih2ZW5kb3JOYW1lLCB2ZXJzaW9uKTsKIAogICAgICAgICBpZiAobmFtZXMgPT0gbnVsbCB8fCBuYW1lcy5sZW5ndGggPT0gMCkgewpAQCAtMTM3LDYwICsxNzksNTQgQEAKICAgICAgICAgdGhpcy5uYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWUgPSBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWU7CiAgICAgICAgIHRoaXMubmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUgPSBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZTsKIAotICAgICAgICB0aGlzLmV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcyA9Ci0gICAgICAgICAgICAgICAgZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzID09IG51bGwgPwotICAgICAgICAgICAgICAgIG51bGwgOiBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMuY2xvbmUoKTsKKyAgICAgICAgdGhpcy5leHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMgPSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMgPT0gbnVsbCA/IG51bGwKKyAgICAgICAgICAgICAgICA6IGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcy5jbG9uZSgpOwogCi0gICAgICAgIHRoaXMuZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMgPQotICAgICAgICAgICAgICAgIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzID09IG51bGwgPwotICAgICAgICAgICAgICAgIG51bGwgOiBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcy5jbG9uZSgpOworICAgICAgICB0aGlzLmV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzID0gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMgPT0gbnVsbCA/IG51bGwKKyAgICAgICAgICAgICAgICA6IGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzLmNsb25lKCk7CiAKICAgICAgICAgdGhpcy5zdXBwb3J0c1N0YW5kYXJkSW1hZ2VNZXRhZGF0YUZvcm1hdCA9IHN1cHBvcnRzU3RhbmRhcmRJbWFnZU1ldGFkYXRhRm9ybWF0OwogICAgICAgICB0aGlzLm5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXROYW1lID0gbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWU7CiAgICAgICAgIHRoaXMubmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZSA9IG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWU7CiAKLSAgICAgICAgdGhpcy5leHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lcyA9Ci0gICAgICAgICAgICAgICAgZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZXMgPT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgbnVsbCA6IGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzLmNsb25lKCk7CisgICAgICAgIHRoaXMuZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZXMgPSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lcyA9PSBudWxsID8gbnVsbAorICAgICAgICAgICAgICAgIDogZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZXMuY2xvbmUoKTsKIAotICAgICAgICB0aGlzLmV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMgPQotICAgICAgICAgICAgICAgIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMgPT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgbnVsbCA6IGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMuY2xvbmUoKTsKKyAgICAgICAgdGhpcy5leHRyYUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzID0gZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcyA9PSBudWxsID8gbnVsbAorICAgICAgICAgICAgICAgIDogZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcy5jbG9uZSgpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbWFnZVJlYWRlcldyaXRlclNwaS4KICAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VSZWFkZXJXcml0ZXJTcGkoKSB7fQorICAgIHB1YmxpYyBJbWFnZVJlYWRlcldyaXRlclNwaSgpIHsKKyAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIG5hbWVzIG9mIHRoZSBmb3JtYXRzIAotICAgICAqIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIEltYWdlUmVhZGVyIAotICAgICAqIG9yIEltYWdlV3JpdGVyIGltcGxlbWVudGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZpY2UgCi0gICAgICogcHJvdmlkZXIuIAorICAgICAqIEdldHMgYW4gYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgbmFtZXMgb2YgdGhlIGZvcm1hdHMgdGhhdCBjYW4gYmUKKyAgICAgKiB1c2VkIGJ5IHRoZSBJbWFnZVJlYWRlciBvciBJbWFnZVdyaXRlciBpbXBsZW1lbnRhdGlvbiBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIHNlcnZpY2UgcHJvdmlkZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgZm9ybWF0IG5hbWVzLgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHN1cHBvcnRlZCBmb3JtYXQgbmFtZXMuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIGdldEZvcm1hdE5hbWVzKCkgewogICAgICAgICByZXR1cm4gbmFtZXMuY2xvbmUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIGZpbGUgc3VmZml4ZXMgCi0gICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBmb3JtYXRzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIAotICAgICAqIEltYWdlUmVhZGVyIG9yIEltYWdlV3JpdGVyIGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiBzZXJ2aWNlIHByb3ZpZGVyLgorICAgICAqIEdldHMgYW4gYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgZmlsZSBzdWZmaXhlcyBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogZm9ybWF0cyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSBJbWFnZVJlYWRlciBvciBJbWFnZVdyaXRlciBpbXBsZW1lbnRhdGlvbgorICAgICAqIG9mIHRoaXMgc2VydmljZSBwcm92aWRlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZpbGUgc3VmZml4ZXMuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgZmlsZSBzdWZmaXhlcy4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RmlsZVN1ZmZpeGVzKCkgewogICAgICAgICByZXR1cm4gc3VmZml4ZXMgPT0gbnVsbCA/IG51bGwgOiBzdWZmaXhlcy5jbG9uZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB3aXRoIHRoZSBuYW1lcyBvZiAKLSAgICAgKiBhZGRpdGlvbmFsIGZvcm1hdHMgb2YgdGhlIGltYWdlIG1ldGFkYXRhIG9iamVjdHMgCi0gICAgICogcHJvZHVjZWQgb3IgY29uc3VtZWQgYnkgdGhpcyBwbHVnLWluLgorICAgICAqIEdldHMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB3aXRoIHRoZSBuYW1lcyBvZiBhZGRpdGlvbmFsIGZvcm1hdHMgb2YgdGhlCisgICAgICogaW1hZ2UgbWV0YWRhdGEgb2JqZWN0cyBwcm9kdWNlZCBvciBjb25zdW1lZCBieSB0aGlzIHBsdWctaW4uCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgZXh0cmEgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0IG5hbWVzLgogICAgICAqLwpAQCAtMTk5LDUyICsyMzUsNDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCB0aGUgbmFtZXMgb2YgCi0gICAgICogYWRkaXRpb25hbCBmb3JtYXRzIG9mIHRoZSBzdHJlYW0gbWV0YWRhdGEgb2JqZWN0cyAKLSAgICAgKiBwcm9kdWNlZCBvciBjb25zdW1lZCBieSB0aGlzIHBsdWctaW4uCisgICAgICogR2V0cyBhbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggdGhlIG5hbWVzIG9mIGFkZGl0aW9uYWwgZm9ybWF0cyBvZiB0aGUKKyAgICAgKiBzdHJlYW0gbWV0YWRhdGEgb2JqZWN0cyBwcm9kdWNlZCBvciBjb25zdW1lZCBieSB0aGlzIHBsdWctaW4uCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgZXh0cmEgc3RyZWFtIG1ldGFkYXRhIGZvcm1hdCBuYW1lcy4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzKCkgewotICAgICAgICByZXR1cm4gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzID09IG51bGwgPyBudWxsIDogZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzLmNsb25lKCk7CisgICAgICAgIHJldHVybiBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMgPT0gbnVsbCA/IG51bGwgOiBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMKKyAgICAgICAgICAgICAgICAuY2xvbmUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIElJT01ldGFkYXRhRm9ybWF0IG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBpbWFnZSAKLSAgICAgKiBtZXRhZGF0YSBmb3JtYXQgbmFtZS4gCisgICAgICogR2V0cyBhbiBJSU9NZXRhZGF0YUZvcm1hdCBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0CisgICAgICogbmFtZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9ybWF0TmFtZSB0aGUgZm9ybWF0IG5hbWUuCi0gICAgICogCisgICAgICogQHBhcmFtIGZvcm1hdE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmb3JtYXQgbmFtZS4KICAgICAgKiBAcmV0dXJuIHRoZSBJSU9NZXRhZGF0YUZvcm1hdCwgb3IgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgSUlPTWV0YWRhdGFGb3JtYXQgZ2V0SW1hZ2VNZXRhZGF0YUZvcm1hdChTdHJpbmcgZm9ybWF0TmFtZSkgewotICAgICAgICByZXR1cm4gSUlPTWV0YWRhdGFVdGlscy5pbnN0YW50aWF0ZU1ldGFkYXRhRm9ybWF0KAotICAgICAgICAgICAgICAgIGZvcm1hdE5hbWUsIHN1cHBvcnRzU3RhbmRhcmRJbWFnZU1ldGFkYXRhRm9ybWF0LAotICAgICAgICAgICAgICAgIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXROYW1lLCBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lLAotICAgICAgICAgICAgICAgIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzLCBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzCi0gICAgICAgICk7CisgICAgICAgIHJldHVybiBJSU9NZXRhZGF0YVV0aWxzLmluc3RhbnRpYXRlTWV0YWRhdGFGb3JtYXQoZm9ybWF0TmFtZSwKKyAgICAgICAgICAgICAgICBzdXBwb3J0c1N0YW5kYXJkSW1hZ2VNZXRhZGF0YUZvcm1hdCwgbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWUsCisgICAgICAgICAgICAgICAgbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZSwgZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZXMsCisgICAgICAgICAgICAgICAgZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBJSU9NZXRhZGF0YUZvcm1hdCBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtIAotICAgICAqIG1ldGFkYXRhIGZvcm1hdCBuYW1lLiAKKyAgICAgKiBHZXRzIGFuIElJT01ldGFkYXRhRm9ybWF0IG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0CisgICAgICogbmFtZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9ybWF0TmFtZSB0aGUgZm9ybWF0IG5hbWUuCi0gICAgICogCisgICAgICogQHBhcmFtIGZvcm1hdE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmb3JtYXQgbmFtZS4KICAgICAgKiBAcmV0dXJuIHRoZSBJSU9NZXRhZGF0YUZvcm1hdCwgb3IgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgSUlPTWV0YWRhdGFGb3JtYXQgZ2V0U3RyZWFtTWV0YWRhdGFGb3JtYXQoU3RyaW5nIGZvcm1hdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIElJT01ldGFkYXRhVXRpbHMuaW5zdGFudGlhdGVNZXRhZGF0YUZvcm1hdCgKLSAgICAgICAgICAgICAgICBmb3JtYXROYW1lLCBzdXBwb3J0c1N0YW5kYXJkU3RyZWFtTWV0YWRhdGFGb3JtYXQsCi0gICAgICAgICAgICAgICAgbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lLCBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMsIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzCi0gICAgICAgICk7CisgICAgICAgIHJldHVybiBJSU9NZXRhZGF0YVV0aWxzLmluc3RhbnRpYXRlTWV0YWRhdGFGb3JtYXQoZm9ybWF0TmFtZSwKKyAgICAgICAgICAgICAgICBzdXBwb3J0c1N0YW5kYXJkU3RyZWFtTWV0YWRhdGFGb3JtYXQsIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZSwKKyAgICAgICAgICAgICAgICBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZSwgZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzLAorICAgICAgICAgICAgICAgIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSBNSU1FIHR5cGVzIAotICAgICAqIG9mIHRoZSBmb3JtYXRzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGUgCi0gICAgICogSW1hZ2VSZWFkZXIgb3IgSW1hZ2VXcml0ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSBNSU1FIHR5cGVzIG9mIHRoZSBmb3JtYXRzIHRoYXQKKyAgICAgKiBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBJbWFnZVJlYWRlciBvciBJbWFnZVdyaXRlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCiAgICAgICogc2VydmljZSBwcm92aWRlci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBNSU1FIHR5cGVzLgpAQCAtMjU0LDMyICsyODcsMzAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBuYXRpdmUgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0IGZvciAKLSAgICAgKiB0aGlzIHJlYWRlci93cml0ZXIsIHdoaWNoIGFsbG93cyBmb3IgbG9zc2xlc3MgZW5jb2RpbmcKLSAgICAgKiBvciBkZWNvZGluZyBvZiB0aGUgaW1hZ2UgbWV0YWRhdGEgd2l0aCB0aGUgZm9ybWF0LgorICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIG5hdGl2ZSBpbWFnZSBtZXRhZGF0YSBmb3JtYXQgZm9yIHRoaXMgcmVhZGVyL3dyaXRlciwKKyAgICAgKiB3aGljaCBhbGxvd3MgZm9yIGxvc3NsZXNzIGVuY29kaW5nIG9yIGRlY29kaW5nIG9mIHRoZSBpbWFnZSBtZXRhZGF0YSB3aXRoCisgICAgICogdGhlIGZvcm1hdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgd2l0aCBuYXRpdmUgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0IG5hbWUsIAotICAgICAqIG9yIG51bGwuCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHdpdGggbmF0aXZlIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBuYW1lLCBvciBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWUoKSB7CiAgICAgICAgIHJldHVybiBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBuYXRpdmUgc3RyZWFtIG1ldGFkYXRhIGZvcm1hdCBmb3IgCi0gICAgICogdGhpcyByZWFkZXIvd3JpdGVyLCB3aGljaCBhbGxvd3MgZm9yIGxvc3NsZXNzIGVuY29kaW5nCi0gICAgICogb3IgZGVjb2Rpbmcgb2YgdGhlIHN0cmVhbSBtZXRhZGF0YSB3aXRoIHRoZSBmb3JtYXQuCisgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgbmF0aXZlIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgZm9yIHRoaXMKKyAgICAgKiByZWFkZXIvd3JpdGVyLCB3aGljaCBhbGxvd3MgZm9yIGxvc3NsZXNzIGVuY29kaW5nIG9yIGRlY29kaW5nIG9mIHRoZQorICAgICAqIHN0cmVhbSBtZXRhZGF0YSB3aXRoIHRoZSBmb3JtYXQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHdpdGggbmF0aXZlIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgbmFtZSwgCi0gICAgICogb3IgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgd2l0aCBuYXRpdmUgc3RyZWFtIG1ldGFkYXRhIGZvcm1hdCBuYW1lLCBvciBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lKCkgewogICAgICAgICByZXR1cm4gbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIEltYWdlUmVhZGVyIAotICAgICAqIG9yIEltYWdlV3JpdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZpY2UgcHJvdmlkZXIuCisgICAgICogR2V0cyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgSW1hZ2VSZWFkZXIgb3IgSW1hZ2VXcml0ZXIgYXNzb2NpYXRlZCB3aXRoCisgICAgICogdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIG5hbWUuCiAgICAgICovCkBAIC0yODgsMjYgKzMxOSwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgc3RhbmRhcmQgbWV0YWRhdGEgZm9ybWF0IGlzIHN1cHBvcnRlZCAKLSAgICAgKiBieSB0aGUgZ2V0QXNUcmVlIGFuZCBzZXRGcm9tVHJlZSBtZXRob2RzIGZvciB0aGUgCi0gICAgICogaW1hZ2UgbWV0YWRhdGEgb2JqZWN0cyBwcm9kdWNlZCBvciBjb25zdW1lZCBieSB0aGlzIAotICAgICAqIHJlYWRlciBvciB3cml0ZXIuCisgICAgICogQ2hlY2tzIGlmIHRoZSBzdGFuZGFyZCBtZXRhZGF0YSBmb3JtYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBnZXRBc1RyZWUgYW5kCisgICAgICogc2V0RnJvbVRyZWUgbWV0aG9kcyBmb3IgdGhlIGltYWdlIG1ldGFkYXRhIG9iamVjdHMgcHJvZHVjZWQgb3IgY29uc3VtZWQKKyAgICAgKiBieSB0aGlzIHJlYWRlciBvciB3cml0ZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBzdGFuZGFyZCBpbWFnZSBtZXRhZGF0YSBmb3JtYXQgaXMgCi0gICAgICogc3VwcG9ydGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBzdGFuZGFyZCBpbWFnZSBtZXRhZGF0YSBmb3JtYXQgaXMgc3VwcG9ydGVkLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbmRhcmRJbWFnZU1ldGFkYXRhRm9ybWF0U3VwcG9ydGVkKCkgewogICAgICAgICByZXR1cm4gc3VwcG9ydHNTdGFuZGFyZEltYWdlTWV0YWRhdGFGb3JtYXQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBzdGFuZGFyZCBtZXRhZGF0YSBmb3JtYXQgaXMgc3VwcG9ydGVkIAotICAgICAqIGJ5IHRoZSBnZXRBc1RyZWUgYW5kIHNldEZyb21UcmVlIG1ldGhvZHMgZm9yIHRoZSAKLSAgICAgKiBzdHJlYW0gbWV0YWRhdGEgb2JqZWN0cyBwcm9kdWNlZCBvciBjb25zdW1lZCBieSB0aGlzIAotICAgICAqIHJlYWRlciBvciB3cml0ZXIuCisgICAgICogQ2hlY2tzIGlmIHRoZSBzdGFuZGFyZCBtZXRhZGF0YSBmb3JtYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBnZXRBc1RyZWUgYW5kCisgICAgICogc2V0RnJvbVRyZWUgbWV0aG9kcyBmb3IgdGhlIHN0cmVhbSBtZXRhZGF0YSBvYmplY3RzIHByb2R1Y2VkIG9yIGNvbnN1bWVkCisgICAgICogYnkgdGhpcyByZWFkZXIgb3Igd3JpdGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3RhbmRhcmQgc3RyZWFtIG1ldGFkYXRhIGZvcm1hdCBpcyAKLSAgICAgKiBzdXBwb3J0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN0YW5kYXJkIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgaXMgc3VwcG9ydGVkLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbmRhcmRTdHJlYW1NZXRhZGF0YUZvcm1hdFN1cHBvcnRlZCgpIHsKICAgICAgICAgcmV0dXJuIHN1cHBvcnRzU3RhbmRhcmRTdHJlYW1NZXRhZGF0YUZvcm1hdDsKZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZVRyYW5zY29kZXJTcGkuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZVRyYW5zY29kZXJTcGkuamF2YQppbmRleCA2OGM0MDI0Li43NDJhZjE5IDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSW1hZ2VUcmFuc2NvZGVyU3BpLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vc3BpL0ltYWdlVHJhbnNjb2RlclNwaS5qYXZhCkBAIC0xOCwxNiArMTgsMTggQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW8uc3BpOwogCiBpbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZVRyYW5zY29kZXI7CiAKIC8qKgotICogVGhlIEltYWdlVHJhbnNjb2RlclNwaSBjbGFzcyBpcyBhIHNlcnZpY2UgcHJvdmlkZXIgaW50ZXJmYWNlIChTUEkpIAotICogZm9yIEltYWdlVHJhbnNjb2RlcnMuCisgKiBUaGUgSW1hZ2VUcmFuc2NvZGVyU3BpIGNsYXNzIGlzIGEgc2VydmljZSBwcm92aWRlciBpbnRlcmZhY2UgKFNQSSkgZm9yCisgKiBJbWFnZVRyYW5zY29kZXJzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEltYWdlVHJhbnNjb2RlclNwaSBleHRlbmRzIElJT1NlcnZpY2VQcm92aWRlcgotICAgICAgICBpbXBsZW1lbnRzIFJlZ2lzdGVyYWJsZVNlcnZpY2UgeworcHVibGljIGFic3RyYWN0IGNsYXNzIEltYWdlVHJhbnNjb2RlclNwaSBleHRlbmRzIElJT1NlcnZpY2VQcm92aWRlciBpbXBsZW1lbnRzIFJlZ2lzdGVyYWJsZVNlcnZpY2UgewogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEltYWdlVHJhbnNjb2RlclNwaS4KQEAgLTM2LDM3ICszOCwzNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbWFnZVRyYW5zY29kZXJTcGkgd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICogdmVuZG9yIG5hbWUgYW5kIHZlcnNpb24uCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEltYWdlVHJhbnNjb2RlclNwaSB3aXRoIHRoZSBzcGVjaWZpZWQgdmVuZG9yIG5hbWUgYW5kCisgICAgICogdmVyc2lvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmVuZG9yTmFtZSB0aGUgdmVuZG9yIG5hbWUuCi0gICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHZlcnNpb24uCisgICAgICogQHBhcmFtIHZlbmRvck5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZW5kb3IgbmFtZS4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbgorICAgICAqICAgICAgICAgICAgdGhlIHZlcnNpb24uCiAgICAgICovCiAgICAgcHVibGljIEltYWdlVHJhbnNjb2RlclNwaShTdHJpbmcgdmVuZG9yTmFtZSwgU3RyaW5nIHZlcnNpb24pIHsKICAgICAgICAgc3VwZXIodmVuZG9yTmFtZSwgdmVyc2lvbik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgY2xhc3MgbmFtZSBvZiBhbiBJbWFnZVJlYWRlclNwaSB0aGF0IAotICAgICAqIHByb2R1Y2VzIElJT01ldGFkYXRhIG9iamVjdHMgdGhhdCBjYW4gYmUgdXNlZCBhcyAKLSAgICAgKiBpbnB1dCB0byB0aGlzIHRyYW5zY29kZXIuCisgICAgICogR2V0cyB0aGUgY2xhc3MgbmFtZSBvZiBhbiBJbWFnZVJlYWRlclNwaSB0aGF0IHByb2R1Y2VzIElJT01ldGFkYXRhCisgICAgICogb2JqZWN0cyB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IHRvIHRoaXMgdHJhbnNjb2Rlci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBuYW1lIG9mIGFuIEltYWdlUmVhZGVyU3BpLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UmVhZGVyU2VydmljZVByb3ZpZGVyTmFtZSgpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgY2xhc3MgbmFtZSBvZiBhbiBJbWFnZVdyaXRlclNwaSB0aGF0IAotICAgICAqIHByb2R1Y2VzIElJT01ldGFkYXRhIG9iamVjdHMgdGhhdCBjYW4gYmUgdXNlZCBhcyAKLSAgICAgKiBpbnB1dCB0byB0aGlzIHRyYW5zY29kZXIuCisgICAgICogR2V0cyB0aGUgY2xhc3MgbmFtZSBvZiBhbiBJbWFnZVdyaXRlclNwaSB0aGF0IHByb2R1Y2VzIElJT01ldGFkYXRhCisgICAgICogb2JqZWN0cyB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IHRvIHRoaXMgdHJhbnNjb2Rlci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBuYW1lIG9mIGFuIEltYWdlV3JpdGVyU3BpLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0V3JpdGVyU2VydmljZVByb3ZpZGVyTmFtZSgpOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgSW1hZ2VUcmFuc2NvZGVyIGFzc29jaWF0ZWQgCi0gICAgICogd2l0aCB0aGlzIHNlcnZpY2UgcHJvdmlkZXIuCisgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgSW1hZ2VUcmFuc2NvZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZpY2UKKyAgICAgKiBwcm92aWRlci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZVRyYW5zY29kZXIgaW5zdGFuY2UuCiAgICAgICovCmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSW1hZ2VXcml0ZXJTcGkuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZVdyaXRlclNwaS5qYXZhCmluZGV4IDk3OWVmNzcuLmJmMjU0NTUgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZVdyaXRlclNwaS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZVdyaXRlclNwaS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvLnNwaTsKIAogaW1wb3J0IGphdmF4LmltYWdlaW8uc3RyZWFtLkltYWdlSW5wdXRTdHJlYW07CkBAIC0yNywxOCArMjgsMjggQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiAvKioKLSAqIFRoZSBJbWFnZVdyaXRlclNwaSBhYnN0cmFjdCBjbGFzcyBpcyBhIHNlcnZpY2UgcHJvdmlkZXIgCi0gKiBpbnRlcmZhY2UgKFNQSSkgZm9yIEltYWdlV3JpdGVycy4KKyAqIFRoZSBJbWFnZVdyaXRlclNwaSBhYnN0cmFjdCBjbGFzcyBpcyBhIHNlcnZpY2UgcHJvdmlkZXIgaW50ZXJmYWNlIChTUEkpIGZvcgorICogSW1hZ2VXcml0ZXJzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEltYWdlV3JpdGVyU3BpIGV4dGVuZHMgSW1hZ2VSZWFkZXJXcml0ZXJTcGkgewogCi0gICAgLyoqIFRoZSBTVEFOREFSRF9PVVRQVVRfVFlQRSBjb250YWlucyBJbWFnZUlucHV0U3RyZWFtLmNsYXNzLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3NbXSBTVEFOREFSRF9PVVRQVVRfVFlQRSA9IG5ldyBDbGFzc1tdIHtJbWFnZUlucHV0U3RyZWFtLmNsYXNzfTsKKyAgICAvKioKKyAgICAgKiBUaGUgU1RBTkRBUkRfT1VUUFVUX1RZUEUgY29udGFpbnMgSW1hZ2VJbnB1dFN0cmVhbS5jbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzW10gU1RBTkRBUkRfT1VUUFVUX1RZUEUgPSBuZXcgQ2xhc3NbXSB7CisgICAgICAgIEltYWdlSW5wdXRTdHJlYW0uY2xhc3MKKyAgICB9OwogCi0gICAgLyoqIFRoZSBvdXRwdXQgdHlwZXMuICovCisgICAgLyoqCisgICAgICogVGhlIG91dHB1dCB0eXBlcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgQ2xhc3NbXSBvdXRwdXRUeXBlczsKLSAgICAKLSAgICAvKiogVGhlIHJlYWRlciBzcGkgbmFtZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVhZGVyIFNQSSBuYW1lcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gcmVhZGVyU3BpTmFtZXM7CiAKICAgICAvKioKQEAgLTUxLDUwICs2Miw2MiBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbWFnZVdyaXRlclNwaSB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmVuZG9yTmFtZSB0aGUgdmVuZG9yIG5hbWUuCi0gICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHZlcnNpb24uCi0gICAgICogQHBhcmFtIG5hbWVzIHRoZSBmb3JtYXQgbmFtZXMuCi0gICAgICogQHBhcmFtIHN1ZmZpeGVzIHRoZSBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgZmlsZSBzdWZmaXhlcy4gCi0gICAgICogQHBhcmFtIE1JTUVUeXBlcyB0aGUgYW4gYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgTUlNRSB0eXBlcy4KLSAgICAgKiBAcGFyYW0gcGx1Z2luQ2xhc3NOYW1lIHRoZSBwbHVnaW4gY2xhc3MgbmFtZS4KLSAgICAgKiBAcGFyYW0gb3V0cHV0VHlwZXMgdGhlIG91dHB1dCB0eXBlcy4KLSAgICAgKiBAcGFyYW0gcmVhZGVyU3BpTmFtZXMgdGhlIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCBjbGFzcyBuYW1lcyBvZiBhbGwgCi0gICAgICogYXNzb2NpYXRlZCBJbWFnZVJlYWRlcnMuCi0gICAgICogQHBhcmFtIHN1cHBvcnRzU3RhbmRhcmRTdHJlYW1NZXRhZGF0YUZvcm1hdCB0aGUgdmFsdWUgaW5kaWNhdGluZwotICAgICAqIGlmIHN0cmVhbSBtZXRhZGF0YSBjYW4gYmUgZGVzY3JpYmVkIGJ5IHN0YW5kYXJkIG1ldGFkYXRhIGZvcm1hdC4KLSAgICAgKiBAcGFyYW0gbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lIHRoZSBuYXRpdmUgc3RyZWFtIG1ldGFkYXRhIAotICAgICAqIGZvcm1hdCBuYW1lLCByZXR1cm5lZCBieSBnZXROYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWUuCi0gICAgICogQHBhcmFtIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lIHRoZSBuYXRpdmUgc3RyZWFtIAotICAgICAqIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lLCByZXR1cm5lZCBieSBnZXROYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdC4KLSAgICAgKiBAcGFyYW0gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzIHRoZSBleHRyYSBzdHJlYW0gbWV0YWRhdGEgCi0gICAgICogZm9ybWF0IG5hbWVzLCByZXR1cm5lZCBieSBnZXRFeHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMuCi0gICAgICogQHBhcmFtIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzIHRoZSBleHRyYSBzdHJlYW0gbWV0YWRhdGEgCi0gICAgICogZm9ybWF0IGNsYXNzIG5hbWVzLCByZXR1cm5lZCBieSBnZXRTdHJlYW1NZXRhZGF0YUZvcm1hdC4KLSAgICAgKiBAcGFyYW0gc3VwcG9ydHNTdGFuZGFyZEltYWdlTWV0YWRhdGFGb3JtYXQgdGhlIHZhbHVlIGluZGljYXRpbmcKLSAgICAgKiBpZiBpbWFnZSBtZXRhZGF0YSBjYW4gYmUgZGVzY3JpYmVkIGJ5IHN0YW5kYXJkIG1ldGFkYXRhIGZvcm1hdC4KLSAgICAgKiBAcGFyYW0gbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWUgdGhlIG5hdGl2ZSBpbWFnZSBtZXRhZGF0YSAKLSAgICAgKiBmb3JtYXQgbmFtZSwgcmV0dXJuZWQgYnkgZ2V0TmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWUuCi0gICAgICogQHBhcmFtIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUgdGhlIG5hdGl2ZSBpbWFnZQotICAgICAqIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lLCByZXR1cm5lZCBieSBnZXROYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0LgotICAgICAqIEBwYXJhbSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lcyB0aGUgZXh0cmEgaW1hZ2UgbWV0YWRhdGEgCi0gICAgICogZm9ybWF0IG5hbWVzLCByZXR1cm5lZCBieSBnZXRFeHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lcy4KLSAgICAgKiBAcGFyYW0gZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcyB0aGUgZXh0cmEgaW1hZ2UgbWV0YWRhdGEgCi0gICAgICogZm9ybWF0IGNsYXNzIG5hbWVzLCByZXR1cm5lZCBieSBnZXRJbWFnZU1ldGFkYXRhRm9ybWF0LgorICAgICAqIEBwYXJhbSB2ZW5kb3JOYW1lCisgICAgICogICAgICAgICAgICB0aGUgdmVuZG9yIG5hbWUuCisgICAgICogQHBhcmFtIHZlcnNpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZXJzaW9uLgorICAgICAqIEBwYXJhbSBuYW1lcworICAgICAqICAgICAgICAgICAgdGhlIGZvcm1hdCBuYW1lcy4KKyAgICAgKiBAcGFyYW0gc3VmZml4ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgZmlsZSBzdWZmaXhlcy4KKyAgICAgKiBAcGFyYW0gTUlNRVR5cGVzCisgICAgICogICAgICAgICAgICB0aGUgYW4gYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgTUlNRSB0eXBlcy4KKyAgICAgKiBAcGFyYW0gcGx1Z2luQ2xhc3NOYW1lCisgICAgICogICAgICAgICAgICB0aGUgcGx1Zy1pbiBjbGFzcyBuYW1lLgorICAgICAqIEBwYXJhbSBvdXRwdXRUeXBlcworICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCB0eXBlcy4KKyAgICAgKiBAcGFyYW0gcmVhZGVyU3BpTmFtZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBzdHJpbmdzIHdpdGggY2xhc3MgbmFtZXMgb2YgYWxsIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIEltYWdlUmVhZGVycy4KKyAgICAgKiBAcGFyYW0gc3VwcG9ydHNTdGFuZGFyZFN0cmVhbU1ldGFkYXRhRm9ybWF0CisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgaW5kaWNhdGluZyBpZiBzdHJlYW0gbWV0YWRhdGEgY2FuIGJlIGRlc2NyaWJlZCBieQorICAgICAqICAgICAgICAgICAgc3RhbmRhcmQgbWV0YWRhdGEgZm9ybWF0LgorICAgICAqIEBwYXJhbSBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYXRpdmUgc3RyZWFtIG1ldGFkYXRhIGZvcm1hdCBuYW1lLCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgZ2V0TmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lLgorICAgICAqIEBwYXJhbSBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hdGl2ZSBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWUsIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICBnZXROYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdC4KKyAgICAgKiBAcGFyYW0gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzCisgICAgICogICAgICAgICAgICB0aGUgZXh0cmEgc3RyZWFtIG1ldGFkYXRhIGZvcm1hdCBuYW1lcywgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgIGdldEV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcy4KKyAgICAgKiBAcGFyYW0gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBleHRyYSBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWVzLCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgZ2V0U3RyZWFtTWV0YWRhdGFGb3JtYXQuCisgICAgICogQHBhcmFtIHN1cHBvcnRzU3RhbmRhcmRJbWFnZU1ldGFkYXRhRm9ybWF0CisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgaW5kaWNhdGluZyBpZiBpbWFnZSBtZXRhZGF0YSBjYW4gYmUgZGVzY3JpYmVkIGJ5CisgICAgICogICAgICAgICAgICBzdGFuZGFyZCBtZXRhZGF0YSBmb3JtYXQuCisgICAgICogQHBhcmFtIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXROYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmF0aXZlIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBuYW1lLCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgZ2V0TmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWUuCisgICAgICogQHBhcmFtIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYXRpdmUgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWUsIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICBnZXROYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0LgorICAgICAqIEBwYXJhbSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lcworICAgICAqICAgICAgICAgICAgdGhlIGV4dHJhIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBuYW1lcywgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgIGdldEV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzLgorICAgICAqIEBwYXJhbSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzCisgICAgICogICAgICAgICAgICB0aGUgZXh0cmEgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWVzLCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgZ2V0SW1hZ2VNZXRhZGF0YUZvcm1hdC4KICAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VXcml0ZXJTcGkoU3RyaW5nIHZlbmRvck5hbWUsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmdbXSBuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gc3VmZml4ZXMsIFN0cmluZ1tdIE1JTUVUeXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBsdWdpbkNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NbXSBvdXRwdXRUeXBlcywgU3RyaW5nW10gcmVhZGVyU3BpTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VwcG9ydHNTdGFuZGFyZFN0cmVhbU1ldGFkYXRhRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VwcG9ydHNTdGFuZGFyZEltYWdlTWV0YWRhdGFGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzKSB7CisgICAgcHVibGljIEltYWdlV3JpdGVyU3BpKFN0cmluZyB2ZW5kb3JOYW1lLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nW10gbmFtZXMsIFN0cmluZ1tdIHN1ZmZpeGVzLAorICAgICAgICAgICAgU3RyaW5nW10gTUlNRVR5cGVzLCBTdHJpbmcgcGx1Z2luQ2xhc3NOYW1lLCBDbGFzc1tdIG91dHB1dFR5cGVzLAorICAgICAgICAgICAgU3RyaW5nW10gcmVhZGVyU3BpTmFtZXMsIGJvb2xlYW4gc3VwcG9ydHNTdGFuZGFyZFN0cmVhbU1ldGFkYXRhRm9ybWF0LAorICAgICAgICAgICAgU3RyaW5nIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZSwgU3RyaW5nIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lLAorICAgICAgICAgICAgU3RyaW5nW10gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzLCBTdHJpbmdbXSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcywKKyAgICAgICAgICAgIGJvb2xlYW4gc3VwcG9ydHNTdGFuZGFyZEltYWdlTWV0YWRhdGFGb3JtYXQsIFN0cmluZyBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZSwKKyAgICAgICAgICAgIFN0cmluZyBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lLCBTdHJpbmdbXSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lcywKKyAgICAgICAgICAgIFN0cmluZ1tdIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMpIHsKICAgICAgICAgc3VwZXIodmVuZG9yTmFtZSwgdmVyc2lvbiwgbmFtZXMsIHN1ZmZpeGVzLCBNSU1FVHlwZXMsIHBsdWdpbkNsYXNzTmFtZSwKICAgICAgICAgICAgICAgICBzdXBwb3J0c1N0YW5kYXJkU3RyZWFtTWV0YWRhdGFGb3JtYXQsIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZSwKICAgICAgICAgICAgICAgICBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZSwgZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzLApAQCAtMTExLDggKzEzNCw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBmb3JtYXQgb2YgdGhlIHdyaXRlcidzIG91dHB1dCBpcyBsb3NzbGVzcy4gCi0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZm9ybWF0IG9mIHRoZSB3cml0ZXIncyBvdXRwdXQgaXMgbG9zc2xlc3MuIFRoZQorICAgICAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYSBmb3JtYXQgaXMgbG9zc2xlc3MsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KQEAgLTEyMSw4ICsxNDQsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gYXJyYXkgb2YgQ2xhc3Mgb2JqZWN0cyB3aG9zZSB0eXBlcyAKLSAgICAgKiBjYW4gYmUgdXNlZCBhcyBvdXRwdXQgZm9yIHRoaXMgd3JpdGVyLgorICAgICAqIEdldHMgYW4gYXJyYXkgb2YgQ2xhc3Mgb2JqZWN0cyB3aG9zZSB0eXBlcyBjYW4gYmUgdXNlZCBhcyBvdXRwdXQgZm9yIHRoaXMKKyAgICAgKiB3cml0ZXIuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgb3V0cHV0IHR5cGVzLgogICAgICAqLwpAQCAtMTMxLDc3ICsxNTQsNzIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIEltYWdlV3JpdGVyIGltcGxlbWVudGF0aW9uIGFzc29jaWF0ZWQgCi0gICAgICogd2l0aCB0aGlzIHNlcnZpY2UgcHJvdmlkZXIgY2FuIGVuY29kZSBhbiBpbWFnZSB3aXRoIAotICAgICAqIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIEltYWdlV3JpdGVyIGltcGxlbWVudGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgICogc2VydmljZSBwcm92aWRlciBjYW4gZW5jb2RlIGFuIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCB0eXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0eXBlIHRoZSBJbWFnZVR5cGVTcGVjaWZpZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBhbiBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZSBjYW4gYmUKLSAgICAgKiBlbmNvZGVkLCBmYWxzZSBvdGhlcndpc2UuIAorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYW4gaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGUgY2FuIGJlIGVuY29kZWQsIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY2FuRW5jb2RlSW1hZ2UoSW1hZ2VUeXBlU3BlY2lmaWVyIHR5cGUpOwogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBJbWFnZVdyaXRlciBpbXBsZW1lbnRhdGlvbiBhc3NvY2lhdGVkIAotICAgICAqIHdpdGggdGhpcyBzZXJ2aWNlIHByb3ZpZGVyIGNhbiBlbmNvZGUgdGhlIHNwZWNpZmllZCBSZW5kZXJlZEltYWdlLgorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgSW1hZ2VXcml0ZXIgaW1wbGVtZW50YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgKiBzZXJ2aWNlIHByb3ZpZGVyIGNhbiBlbmNvZGUgdGhlIHNwZWNpZmllZCBSZW5kZXJlZEltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbSB0aGUgUmVuZGVyZWRJbWFnZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIFJlbmRlcmVkSW1hZ2UgY2FuIGJlIGVuY29kZWQsIAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4gCisgICAgICogQHBhcmFtIGltCisgICAgICogICAgICAgICAgICB0aGUgUmVuZGVyZWRJbWFnZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIFJlbmRlcmVkSW1hZ2UgY2FuIGJlIGVuY29kZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjYW5FbmNvZGVJbWFnZShSZW5kZXJlZEltYWdlIGltKSB7CiAgICAgICAgIHJldHVybiBjYW5FbmNvZGVJbWFnZShJbWFnZVR5cGVTcGVjaWZpZXIuY3JlYXRlRnJvbVJlbmRlcmVkSW1hZ2UoaW0pKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBJbWFnZVdyaXRlciBpbXBsZW1lbnRhdGlvbiBmb3IKLSAgICAgKiB0aGlzIHNlcnZpY2UgcHJvdmlkZXIuCisgICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgSW1hZ2VXcml0ZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgc2VydmljZQorICAgICAqIHByb3ZpZGVyLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIEltYWdlV3JpdGVyLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgSW1hZ2VXcml0ZXIgY3JlYXRlV3JpdGVySW5zdGFuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gY3JlYXRlV3JpdGVySW5zdGFuY2UobnVsbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgSW1hZ2VXcml0ZXIgaW1wbGVtZW50YXRpb24gZm9yCi0gICAgICogdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLgorICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIEltYWdlV3JpdGVyIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHNlcnZpY2UKKyAgICAgKiBwcm92aWRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uIHRoZSBhIHBsdWdpbiBzcGVjaWZpYyBleHRlbnNpb24gb2JqZWN0LCBvciBudWxsLgotICAgICAqIAorICAgICAqIEBwYXJhbSBleHRlbnNpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBhIHBsdWctaW4gc3BlY2lmaWMgZXh0ZW5zaW9uIG9iamVjdCwgb3IgbnVsbC4KICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZVdyaXRlci4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEltYWdlV3JpdGVyIGNyZWF0ZVdyaXRlckluc3RhbmNlKE9iamVjdCBleHRlbnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIEltYWdlV3JpdGVyIG9iamVjdCAKLSAgICAgKiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgSW1hZ2VXcml0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgCi0gICAgICogc2VydmljZSBwcm92aWRlciBvciBub3QuCisgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgSW1hZ2VXcml0ZXIgb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mCisgICAgICogdGhlIEltYWdlV3JpdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZpY2UgcHJvdmlkZXIgb3Igbm90LgogICAgICAqIAotICAgICAqIEBwYXJhbSB3cml0ZXIgdGhlIEltYWdlV3JpdGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBJbWFnZVdyaXRlciBvYmplY3QgCi0gICAgICogaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEltYWdlV3JpdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIAotICAgICAqIHNlcnZpY2UgcHJvdmlkZXIsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gd3JpdGVyCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VXcml0ZXIuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIEltYWdlV3JpdGVyIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUKKyAgICAgKiAgICAgICAgIEltYWdlV3JpdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZpY2UgcHJvdmlkZXIsIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNPd25Xcml0ZXIoSW1hZ2VXcml0ZXIgd3JpdGVyKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCBuYW1lcyBvZiB0aGUgSW1hZ2VSZWFkZXJTcGkgCi0gICAgICogY2xhc3NlcyB0aGF0IHN1cHBvcnQgdGhlIGludGVybmFsIG1ldGFkYXRhIHJlcHJlc2VudGF0aW9uIAotICAgICAqIHVzZWQgYnkgdGhlIEltYWdlV3JpdGVyIG9mIHRoaXMgc2VydmljZSBwcm92aWRlciwgb3IgbnVsbCBpZiAKLSAgICAgKiB0aGVyZSBhcmUgbm8gc3VjaCBJbWFnZVJlYWRlcnMuCisgICAgICogR2V0cyBhbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggbmFtZXMgb2YgdGhlIEltYWdlUmVhZGVyU3BpIGNsYXNzZXMgdGhhdAorICAgICAqIHN1cHBvcnQgdGhlIGludGVybmFsIG1ldGFkYXRhIHJlcHJlc2VudGF0aW9uIHVzZWQgYnkgdGhlIEltYWdlV3JpdGVyIG9mCisgICAgICogdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLCBvciBudWxsIGlmIHRoZXJlIGFyZSBubyBzdWNoIEltYWdlUmVhZGVycy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCBuYW1lcyBvZiB0aGUgSW1hZ2VXcml0ZXJTcGkgCi0gICAgICogY2xhc3Nlcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBzdHJpbmdzIHdpdGggbmFtZXMgb2YgdGhlIEltYWdlV3JpdGVyU3BpIGNsYXNzZXMuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIGdldEltYWdlUmVhZGVyU3BpTmFtZXMoKSB7CiAgICAgICAgIHJldHVybiByZWFkZXJTcGlOYW1lczsKZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9SZWdpc3RlcmFibGVTZXJ2aWNlLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvUmVnaXN0ZXJhYmxlU2VydmljZS5qYXZhCmluZGV4IGI1MDc1NGUuLmFlMmY0ZDMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9SZWdpc3RlcmFibGVTZXJ2aWNlLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vc3BpL1JlZ2lzdGVyYWJsZVNlcnZpY2UuamF2YQpAQCAtMTgsMzMgKzE4LDM3IEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvLnNwaTsKIAogLyoqCi0gKiBUaGUgUmVnaXN0ZXJhYmxlU2VydmljZSBpbnRlcmZhY2UgcHJvdmlkZXMgc2VydmljZSBwcm92aWRlciAKLSAqIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCBieSBhIFNlcnZpY2VSZWdpc3RyeSwgYW5kIAotICogbm90aWZpY2F0aW9ucyB0aGF0IHJlZ2lzdHJhdGlvbiBhbmQgZGVyZWdpc3RyYXRpb24gaGF2ZSBiZWVuCi0gKiBwZXJmb3JtZWQuCisgKiBUaGUgUmVnaXN0ZXJhYmxlU2VydmljZSBpbnRlcmZhY2UgcHJvdmlkZXMgc2VydmljZSBwcm92aWRlciBvYmplY3RzIHRoYXQgY2FuCisgKiBiZSByZWdpc3RlcmVkIGJ5IGEgU2VydmljZVJlZ2lzdHJ5LCBhbmQgbm90aWZpY2F0aW9ucyB0aGF0IHJlZ2lzdHJhdGlvbiBhbmQKKyAqIGRlcmVnaXN0cmF0aW9uIGhhdmUgYmVlbiBwZXJmb3JtZWQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFJlZ2lzdGVyYWJsZVNlcnZpY2UgewotICAgIAorCiAgICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIHRoaXMKLSAgICAgKiBpbnRlcmZhY2UgaXMgcmVnaXN0ZXJlZCB0byB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5IG9mIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgcmVnaXN0cnkuCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIGlzCisgICAgICogcmVnaXN0ZXJlZCB0byB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5IG9mIHRoZSBzcGVjaWZpZWQgcmVnaXN0cnkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJlZ2lzdHJ5IHRoZSBTZXJ2aWNlUmVnaXN0cnkgdG8gYmUgcmVnaXN0ZXJlZC4KLSAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgdGhlIGNsYXNzIHJlcHJlc2VudGluZyBhIGNhdGVnb3J5LgorICAgICAqIEBwYXJhbSByZWdpc3RyeQorICAgICAqICAgICAgICAgICAgdGhlIFNlcnZpY2VSZWdpc3RyeSB0byBiZSByZWdpc3RlcmVkLgorICAgICAqIEBwYXJhbSBjYXRlZ29yeQorICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIHJlcHJlc2VudGluZyBhIGNhdGVnb3J5LgogICAgICAqLwogICAgIHZvaWQgb25SZWdpc3RyYXRpb24oU2VydmljZVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBDbGFzczw/PiBjYXRlZ29yeSk7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgdGhpcwotICAgICAqIGludGVyZmFjZSBpcyBkZXJlZ2lzdGVyZWQgdG8gdGhlIHNwZWNpZmllZCBjYXRlZ29yeSBvZiB0aGUgCi0gICAgICogc3BlY2lmaWVkIHJlZ2lzdHJ5LgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSBpcworICAgICAqIGRlcmVnaXN0ZXJlZCB0byB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5IG9mIHRoZSBzcGVjaWZpZWQgcmVnaXN0cnkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJlZ2lzdHJ5IHRoZSBTZXJ2aWNlUmVnaXN0cnkgdG8gYmUgcmVnaXN0ZXJlZC4KLSAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgdGhlIGNsYXNzIHJlcHJlc2VudGluZyBhIGNhdGVnb3J5LgorICAgICAqIEBwYXJhbSByZWdpc3RyeQorICAgICAqICAgICAgICAgICAgdGhlIFNlcnZpY2VSZWdpc3RyeSB0byBiZSByZWdpc3RlcmVkLgorICAgICAqIEBwYXJhbSBjYXRlZ29yeQorICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIHJlcHJlc2VudGluZyBhIGNhdGVnb3J5LgogICAgICAqLwogICAgIHZvaWQgb25EZXJlZ2lzdHJhdGlvbihTZXJ2aWNlUmVnaXN0cnkgcmVnaXN0cnksIENsYXNzPD8+IGNhdGVnb3J5KTsKIH0KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9TZXJ2aWNlUmVnaXN0cnkuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9TZXJ2aWNlUmVnaXN0cnkuamF2YQppbmRleCAxYTE4YjAyLi43OWIwMmEzIDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvU2VydmljZVJlZ2lzdHJ5LmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vc3BpL1NlcnZpY2VSZWdpc3RyeS5qYXZhCkBAIC0xOCw0OCArMTgsNTMgQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW8uc3BpOwogCiBpbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKIAogLyoqCi0gKiBUaGUgU2VydmljZVJlZ2lzdHJ5IGNsYXNzIHByb3ZpZGVzIGFiaWxpdHkgdG8gcmVnaXN0ZXIsIAotICogZGVyZWdpc3RlciwgbG9vayB1cCBhbmQgb2J0YWluIHNlcnZpY2UgcHJvdmlkZXIgaW5zdGFuY2VzIChTUElzKS4KLSAqIEEgc2VydmljZSBtZWFucyBhIHNldCBvZiBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzLCBhbmQgYSBzZXJ2aWNlIAotICogcHJvdmlkZXIgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLiBTZXJ2aWNlIHByb3ZpZGVycyBjYW4gCi0gKiBiZSBhc3NvY2lhdGVkIHdpdGggb25lIG9yIG1vcmUgY2F0ZWdvcmllcy4gRWFjaCBjYXRlZ29yeSBpcyBkZWZpbmVkIAotICogYnkgYSBjbGFzcyBvciBpbnRlcmZhY2UuIE9ubHkgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgYSBlYWNoIGNsYXNzIGlzIAotICogYWxsb3dlZCB0byBiZSByZWdpc3RlcmVkIGFzIGEgY2F0ZWdvcnkuIAorICogVGhlIFNlcnZpY2VSZWdpc3RyeSBjbGFzcyBwcm92aWRlcyBhYmlsaXR5IHRvIHJlZ2lzdGVyLCBkZXJlZ2lzdGVyLCBsb29rIHVwCisgKiBhbmQgb2J0YWluIHNlcnZpY2UgcHJvdmlkZXIgaW5zdGFuY2VzIChTUElzKS4gQSBzZXJ2aWNlIG1lYW5zIGEgc2V0IG9mCisgKiBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzLCBhbmQgYSBzZXJ2aWNlIHByb3ZpZGVyIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGEKKyAqIHNlcnZpY2UuIFNlcnZpY2UgcHJvdmlkZXJzIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggb25lIG9yIG1vcmUgY2F0ZWdvcmllcy4KKyAqIEVhY2ggY2F0ZWdvcnkgaXMgZGVmaW5lZCBieSBhIGNsYXNzIG9yIGludGVyZmFjZS4gT25seSBhIHNpbmdsZSBpbnN0YW5jZSBvZiBhCisgKiBlYWNoIGNsYXNzIGlzIGFsbG93ZWQgdG8gYmUgcmVnaXN0ZXJlZCBhcyBhIGNhdGVnb3J5LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFNlcnZpY2VSZWdpc3RyeSB7CiAKLSAgICAvKiogVGhlIGNhdGVnb3JpZXMuICovCisgICAgLyoqCisgICAgICogVGhlIGNhdGVnb3JpZXMuCisgICAgICovCiAgICAgQ2F0ZWdvcmllc01hcCBjYXRlZ29yaWVzID0gbmV3IENhdGVnb3JpZXNNYXAodGhpcyk7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgU2VydmljZVJlZ2lzdHJ5IHdpdGggdGhlIHNwZWNpZmllZCBjYXRlZ29yaWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjYXRlZ29yaWVzSXRlcmF0b3IgYW4gSXRlcmF0b3Igb2YgQ2xhc3Mgb2JqZWN0cyAKLSAgICAgKiBmb3IgZGVmaW5pbmcgb2YgY2F0ZWdvcmllcy4KKyAgICAgKiBAcGFyYW0gY2F0ZWdvcmllc0l0ZXJhdG9yCisgICAgICogICAgICAgICAgICBhbiBJdGVyYXRvciBvZiBDbGFzcyBvYmplY3RzIGZvciBkZWZpbmluZyBvZiBjYXRlZ29yaWVzLgogICAgICAqLwogICAgIHB1YmxpYyBTZXJ2aWNlUmVnaXN0cnkoSXRlcmF0b3I8Q2xhc3M8Pz4+IGNhdGVnb3JpZXNJdGVyYXRvcikgewogICAgICAgICBpZiAobnVsbCA9PSBjYXRlZ29yaWVzSXRlcmF0b3IpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhdGVnb3JpZXMgaXRlcmF0b3Igc2hvdWxkIG5vdCBiZSBOVUxMIik7CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUoY2F0ZWdvcmllc0l0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgQ2xhc3M8Pz4gYyA9ICBjYXRlZ29yaWVzSXRlcmF0b3IubmV4dCgpOworICAgICAgICB3aGlsZSAoY2F0ZWdvcmllc0l0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgQ2xhc3M8Pz4gYyA9IGNhdGVnb3JpZXNJdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICBjYXRlZ29yaWVzLmFkZENhdGVnb3J5KGMpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTG9va3MgdXAgYW5kIGluc3RhbnRpYXRlcyB0aGUgYXZhaWxhYmxlIHByb3ZpZGVycyBvZiB0aGlzIHNlcnZpY2UgdXNpbmcgCisgICAgICogTG9va3MgdXAgYW5kIGluc3RhbnRpYXRlcyB0aGUgYXZhaWxhYmxlIHByb3ZpZGVycyBvZiB0aGlzIHNlcnZpY2UgdXNpbmcKICAgICAgKiB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXJDbGFzcyB0aGUgQ2xhc3Mgb2JqZWN0IG9mIHRoZSBwcm92aWRlciB0byBiZSBsb29rZWQgdXAuCi0gICAgICogQHBhcmFtIGxvYWRlciB0aGUgY2xhc3MgbG9hZGVyIHRvIGJlIHVzZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIHByb3ZpZGVyQ2xhc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBDbGFzcyBvYmplY3Qgb2YgdGhlIHByb3ZpZGVyIHRvIGJlIGxvb2tlZCB1cC4KKyAgICAgKiBAcGFyYW0gbG9hZGVyCisgICAgICogICAgICAgICAgICB0aGUgY2xhc3MgbG9hZGVyIHRvIGJlIHVzZWQuCiAgICAgICogQHJldHVybiB0aGUgaXRlcmF0b3Igb2YgcHJvdmlkZXJzIG9iamVjdHMgZm9yIHRoaXMgc2VydmljZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIDxUPiBJdGVyYXRvcjxUPiBsb29rdXBQcm92aWRlcnMoQ2xhc3M8VD4gcHJvdmlkZXJDbGFzcywgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CkBAIC02NywxMSArNzIsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb29rcyB1cCBhbmQgaW5zdGFudGlhdGVzIHRoZSBhdmFpbGFibGUgcHJvdmlkZXJzIG9mIHRoaXMgc2VydmljZSB1c2luZyAKKyAgICAgKiBMb29rcyB1cCBhbmQgaW5zdGFudGlhdGVzIHRoZSBhdmFpbGFibGUgcHJvdmlkZXJzIG9mIHRoaXMgc2VydmljZSB1c2luZwogICAgICAqIHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXJDbGFzcyB0aGUgQ2xhc3Mgb2JqZWN0IG9mIHRoZSBwcm92aWRlciB0byBiZSBsb29rZWQgdXAuCi0gICAgICogCisgICAgICogQHBhcmFtIHByb3ZpZGVyQ2xhc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBDbGFzcyBvYmplY3Qgb2YgdGhlIHByb3ZpZGVyIHRvIGJlIGxvb2tlZCB1cC4KICAgICAgKiBAcmV0dXJuIHRoZSBpdGVyYXRvciBvZiBwcm92aWRlcnMgb2JqZWN0cyBmb3IgdGhpcyBzZXJ2aWNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEl0ZXJhdG9yPFQ+IGxvb2t1cFByb3ZpZGVycyhDbGFzczxUPiBwcm92aWRlckNsYXNzKSB7CkBAIC03OSwxNCArODQsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgdGhlIHNwZWNpZmllZCBzZXJ2aWNlIHByb3ZpZGVyIG9iamVjdCBpbiB0aGUKLSAgICAgKiBzcGVjaWZpZWQgY2F0ZWdvcmllcy4KKyAgICAgKiBSZWdpc3RlcnMgdGhlIHNwZWNpZmllZCBzZXJ2aWNlIHByb3ZpZGVyIG9iamVjdCBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogY2F0ZWdvcmllcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIHNwZWNpZmllZCBwcm92aWRlciB0byBiZSByZWdpc3RlcmVkLgotICAgICAqIEBwYXJhbSBjYXRlZ29yeSB0aGUgY2F0ZWdvcnkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIG5vIHByb3ZpZGVyIG9mIHRoZSBzYW1lIGNsYXNzIGlzIHJlZ2lzdGVyZWQgCi0gICAgICogaW4gdGhpcyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBwcm92aWRlciB0byBiZSByZWdpc3RlcmVkLgorICAgICAqIEBwYXJhbSBjYXRlZ29yeQorICAgICAqICAgICAgICAgICAgdGhlIGNhdGVnb3J5LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgbm8gcHJvdmlkZXIgb2YgdGhlIHNhbWUgY2xhc3MgaXMgcmVnaXN0ZXJlZCBpbiB0aGlzCisgICAgICogICAgICAgICBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyA8VD4gYm9vbGVhbiByZWdpc3RlclNlcnZpY2VQcm92aWRlcihUIHByb3ZpZGVyLCBDbGFzczxUPiBjYXRlZ29yeSkgewogICAgICAgICByZXR1cm4gY2F0ZWdvcmllcy5hZGRQcm92aWRlcihwcm92aWRlciwgY2F0ZWdvcnkpOwpAQCAtOTUsNyArMTAxLDggQEAKICAgICAvKioKICAgICAgKiBSZWdpc3RlcnMgYSBsaXN0IG9mIHNlcnZpY2UgcHJvdmlkZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwcm92aWRlcnMgdGhlIGxpc3Qgb2Ygc2VydmljZSBwcm92aWRlcnMuCisgICAgICogQHBhcmFtIHByb3ZpZGVycworICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2Ygc2VydmljZSBwcm92aWRlcnMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJTZXJ2aWNlUHJvdmlkZXJzKEl0ZXJhdG9yPD8+IHByb3ZpZGVycykgewogICAgICAgICBmb3IgKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yID0gcHJvdmlkZXJzOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CkBAIC0xMDQsNjcgKzExMSw3MCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgcHJvdmlkZXIgb2JqZWN0IGluIGFsbAotICAgICAqIGNhdGVnb3JpZXMuCisgICAgICogUmVnaXN0ZXJzIHRoZSBzcGVjaWZpZWQgc2VydmljZSBwcm92aWRlciBvYmplY3QgaW4gYWxsIGNhdGVnb3JpZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3ZpZGVyIHRoZSBzZXJ2aWNlIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIHNlcnZpY2UgcHJvdmlkZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJTZXJ2aWNlUHJvdmlkZXIoT2JqZWN0IHByb3ZpZGVyKSB7CiAgICAgICAgIGNhdGVnb3JpZXMuYWRkUHJvdmlkZXIocHJvdmlkZXIsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIERlcmVnaXN0ZXJzIHRoZSBzcGVjaWZpZXMgc2VydmljZSBwcm92aWRlciBmcm9tIHRoZQotICAgICAqIHNwZWNpZmllZCBjYXRlZ29yeS4KKyAgICAgKiBEZXJlZ2lzdGVycyB0aGUgc3BlY2lmaWVzIHNlcnZpY2UgcHJvdmlkZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwcm92aWRlciB0aGUgc2VydmljZSBwcm92aWRlciB0byBiZSBkZXJlZ2lzdGVyZWQuCi0gICAgICogQHBhcmFtIGNhdGVnb3J5IHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm92aWRlciB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIAotICAgICAqIGluIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZXJ2aWNlIHByb3ZpZGVyIHRvIGJlIGRlcmVnaXN0ZXJlZC4KKyAgICAgKiBAcGFyYW0gY2F0ZWdvcnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcHJvdmlkZXIgd2FzIGFscmVhZHkgcmVnaXN0ZXJlZCBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyA8VD4gYm9vbGVhbiBkZXJlZ2lzdGVyU2VydmljZVByb3ZpZGVyKFQgcHJvdmlkZXIsIENsYXNzPFQ+IGNhdGVnb3J5KSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXJlZ2lzdGVycyB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgcHJvdmlkZXIgZnJvbSBhbGwKLSAgICAgKiBjYXRlZ29yaWVzLgorICAgICAqIERlcmVnaXN0ZXJzIHRoZSBzcGVjaWZpZWQgc2VydmljZSBwcm92aWRlciBmcm9tIGFsbCBjYXRlZ29yaWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwcm92aWRlciB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgcHJvdmlkZXIuCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgcHJvdmlkZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGVyZWdpc3RlclNlcnZpY2VQcm92aWRlcihPYmplY3QgcHJvdmlkZXIpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gSXRlcmF0b3Igb2YgcmVnaXN0ZXJlZCBzZXJ2aWNlIHByb3ZpZGVycwotICAgICAqIGluIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkgd2hpY2ggc2F0aXNmeSB0aGUgc3BlY2lmaWVkIEZpbHRlci4gCi0gICAgICogVGhlIHVzZU9yZGVyaW5nIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlciB0aGUgaXRlcmF0b3Igd2lsbCAKLSAgICAgKiByZXR1cm4gYWxsIG9mIHRoZSBzZXJ2ZXIgcHJvdmlkZXIgb2JqZWN0cyBpbiBhIHNldCBvcmRlci4gCisgICAgICogR2V0cyBhbiBJdGVyYXRvciBvZiByZWdpc3RlcmVkIHNlcnZpY2UgcHJvdmlkZXJzIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjYXRlZ29yeSB3aGljaCBzYXRpc2Z5IHRoZSBzcGVjaWZpZWQgRmlsdGVyLiBUaGUgdXNlT3JkZXJpbmcgcGFyYW1ldGVyCisgICAgICogaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGl0ZXJhdG9yIHdpbGwgcmV0dXJuIGFsbCBvZiB0aGUgc2VydmVyIHByb3ZpZGVyCisgICAgICogb2JqZWN0cyBpbiBhIHNldCBvcmRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgdGhlIHNwZWNpZmllZCBjYXRlZ29yeS4KLSAgICAgKiBAcGFyYW0gZmlsdGVyIHRoZSBzcGVjaWZpZWQgZmlsdGVyLgotICAgICAqIEBwYXJhbSB1c2VPcmRlcmluZyB0aGUgZmxhZyBpbmRpY2F0aW5nIHRoYXQgcHJvdmlkZXJzIGFyZSBvcmRlcmVkCi0gICAgICogaW4gdGhlIHJldHVybmVkIEl0ZXJhdG9yLgotICAgICAqIAorICAgICAqIEBwYXJhbSBjYXRlZ29yeQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBjYXRlZ29yeS4KKyAgICAgKiBAcGFyYW0gZmlsdGVyCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGZpbHRlci4KKyAgICAgKiBAcGFyYW0gdXNlT3JkZXJpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbGFnIGluZGljYXRpbmcgdGhhdCBwcm92aWRlcnMgYXJlIG9yZGVyZWQgaW4gdGhlIHJldHVybmVkCisgICAgICogICAgICAgICAgICBJdGVyYXRvci4KICAgICAgKiBAcmV0dXJuIHRoZSBpdGVyYXRvciBvZiByZWdpc3RlcmVkIHNlcnZpY2UgcHJvdmlkZXJzLgogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyA8VD4gSXRlcmF0b3I8VD4gZ2V0U2VydmljZVByb3ZpZGVycyhDbGFzczxUPiBjYXRlZ29yeSwgRmlsdGVyIGZpbHRlciwgYm9vbGVhbiB1c2VPcmRlcmluZykgewotICAgICAgICByZXR1cm4gbmV3IEZpbHRlcmVkSXRlcmF0b3I8VD4oZmlsdGVyLCAoSXRlcmF0b3I8VD4pY2F0ZWdvcmllcy5nZXRQcm92aWRlcnMoY2F0ZWdvcnksIHVzZU9yZGVyaW5nKSk7CisgICAgICAgIHJldHVybiBuZXcgRmlsdGVyZWRJdGVyYXRvcjxUPihmaWx0ZXIsIChJdGVyYXRvcjxUPiljYXRlZ29yaWVzLmdldFByb3ZpZGVycyhjYXRlZ29yeSwKKyAgICAgICAgICAgICAgICB1c2VPcmRlcmluZykpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gSXRlcmF0b3Igb2YgYWxsIHJlZ2lzdGVyZWQgc2VydmljZSBwcm92aWRlcnMKLSAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5LiBUaGUgdXNlT3JkZXJpbmcgcGFyYW1ldGVyCi0gICAgICogaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGl0ZXJhdG9yIHdpbGwgcmV0dXJuIGFsbCBvZiB0aGUgc2VydmVyIAotICAgICAqIHByb3ZpZGVyIG9iamVjdHMgaW4gYSBzZXQgb3JkZXIuIAorICAgICAqIEdldHMgYW4gSXRlcmF0b3Igb2YgYWxsIHJlZ2lzdGVyZWQgc2VydmljZSBwcm92aWRlcnMgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIGNhdGVnb3J5LiBUaGUgdXNlT3JkZXJpbmcgcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyIHRoZSBpdGVyYXRvciB3aWxsCisgICAgICogcmV0dXJuIGFsbCBvZiB0aGUgc2VydmVyIHByb3ZpZGVyIG9iamVjdHMgaW4gYSBzZXQgb3JkZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNhdGVnb3J5IHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuCi0gICAgICogQHBhcmFtIHVzZU9yZGVyaW5nIHRoZSBmbGFnIGluZGljYXRpbmcgdGhhdCBwcm92aWRlcnMgYXJlIG9yZGVyZWQKLSAgICAgKiBpbiB0aGUgcmV0dXJuZWQgSXRlcmF0b3IuCi0gICAgICogCisgICAgICogQHBhcmFtIGNhdGVnb3J5CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5LgorICAgICAqIEBwYXJhbSB1c2VPcmRlcmluZworICAgICAqICAgICAgICAgICAgdGhlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHByb3ZpZGVycyBhcmUgb3JkZXJlZCBpbiB0aGUgcmV0dXJuZWQKKyAgICAgKiAgICAgICAgICAgIEl0ZXJhdG9yLgogICAgICAqIEByZXR1cm4gdGhlIEl0ZXJhdG9yIG9mIHNlcnZpY2UgcHJvdmlkZXJzLgogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQpAQCAtMTczLDExICsxODMsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByZWdpc3RlcmVkIHNlcnZpY2UgcHJvdmlkZXIgb2JqZWN0IHRoYXQgaGFzIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgY2xhc3MgdHlwZS4KKyAgICAgKiBHZXRzIHRoZSByZWdpc3RlcmVkIHNlcnZpY2UgcHJvdmlkZXIgb2JqZWN0IHRoYXQgaGFzIHRoZSBzcGVjaWZpZWQgY2xhc3MKKyAgICAgKiB0eXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwcm92aWRlckNsYXNzIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgY2xhc3MuCi0gICAgICogCisgICAgICogQHBhcmFtIHByb3ZpZGVyQ2xhc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgY2xhc3MuCiAgICAgICogQHJldHVybiB0aGUgc2VydmljZSBwcm92aWRlciBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIDxUPiBUIGdldFNlcnZpY2VQcm92aWRlckJ5Q2xhc3MoQ2xhc3M8VD4gcHJvdmlkZXJDbGFzcykgewpAQCAtMTg1LDI4ICsxOTUsMzIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGFuIG9yZGVyaW5nIGJldHdlZW4gdHdvIHNlcnZpY2UgcHJvdmlkZXIgb2JqZWN0cyAKLSAgICAgKiB3aXRoaW4gdGhlIHNwZWNpZmllZCBjYXRlZ29yeS4gCisgICAgICogU2V0cyBhbiBvcmRlcmluZyBiZXR3ZWVuIHR3byBzZXJ2aWNlIHByb3ZpZGVyIG9iamVjdHMgd2l0aGluIHRoZQorICAgICAqIHNwZWNpZmllZCBjYXRlZ29yeS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgdGhlIHNwZWNpZmllZCBjYXRlZ29yeS4KLSAgICAgKiBAcGFyYW0gZmlyc3RQcm92aWRlciB0aGUgZmlyc3QgcHJvdmlkZXIuCi0gICAgICogQHBhcmFtIHNlY29uZFByb3ZpZGVyIHRoZSBzZWNvbmQgcHJvdmlkZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgcHJldmlvdXNseSB1bnNldCBvcmRlciB3YXMgc2V0LgorICAgICAqIEBwYXJhbSBjYXRlZ29yeQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBjYXRlZ29yeS4KKyAgICAgKiBAcGFyYW0gZmlyc3RQcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBzZWNvbmRQcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBwcm92aWRlci4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGEgcHJldmlvdXNseSB1bnNldCBvcmRlciB3YXMgc2V0LgogICAgICAqLwogICAgIHB1YmxpYyA8VD4gYm9vbGVhbiBzZXRPcmRlcmluZyhDbGFzczxUPiBjYXRlZ29yeSwgVCBmaXJzdFByb3ZpZGVyLCBUIHNlY29uZFByb3ZpZGVyKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBVbnNldHMgYW4gb3JkZXJpbmcgYmV0d2VlbiB0d28gc2VydmljZSBwcm92aWRlciBvYmplY3RzIAotICAgICAqIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5LgorICAgICAqIFVuc2V0cyBhbiBvcmRlcmluZyBiZXR3ZWVuIHR3byBzZXJ2aWNlIHByb3ZpZGVyIG9iamVjdHMgd2l0aGluIHRoZQorICAgICAqIHNwZWNpZmllZCBjYXRlZ29yeS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgdGhlIHNwZWNpZmllZCBjYXRlZ29yeS4KLSAgICAgKiBAcGFyYW0gZmlyc3RQcm92aWRlciB0aGUgZmlyc3QgcHJvdmlkZXIuCi0gICAgICogQHBhcmFtIHNlY29uZFByb3ZpZGVyIHRoZSBzZWNvbmQgcHJvdmlkZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgcHJldmlvdXNseSB1bnNldCBvcmRlciB3YXMgcmVtb3ZlZC4KKyAgICAgKiBAcGFyYW0gY2F0ZWdvcnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuCisgICAgICogQHBhcmFtIGZpcnN0UHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwcm92aWRlci4KKyAgICAgKiBAcGFyYW0gc2Vjb25kUHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgcHJvdmlkZXIuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBhIHByZXZpb3VzbHkgdW5zZXQgb3JkZXIgd2FzIHJlbW92ZWQuCiAgICAgICovCiAgICAgcHVibGljIDxUPiBib29sZWFuIHVuc2V0T3JkZXJpbmcoQ2xhc3M8VD4gY2F0ZWdvcnksIFQgZmlyc3RQcm92aWRlciwgVCBzZWNvbmRQcm92aWRlcikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0Iik7CkBAIC0yMTUsNyArMjI5LDggQEAKICAgICAvKioKICAgICAgKiBEZXJlZ2lzdGVycyBhbGwgcHJvdmlkZXJzIGZyb20gdGhlIHNwZWNpZmllZCBjYXRlZ29yeS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgdGhlIHNwZWNpZmllZCBjYXRlZ29yeS4KKyAgICAgKiBAcGFyYW0gY2F0ZWdvcnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGVyZWdpc3RlckFsbChDbGFzczw/PiBjYXRlZ29yeSkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0Iik7CkBAIC0yMjksMzIgKzI0NCwzMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZpbmFsaXplcyB0aGlzIG9iamVjdC4gCisgICAgICogRmluYWxpemVzIHRoaXMgb2JqZWN0LgogICAgICAqIAotICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlIHRocm93cyBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIAotICAgICAqIGZpbmFsaXphdGlvbi4KKyAgICAgKiBAdGhyb3dzIFRocm93YWJsZQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgZmluYWxpemF0aW9uLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vVE9ETyB1bmNvbW1lbnQgd2hlbiBkZXJlZ2lzdGVyQWxsIGlzIGltcGxlbWVudGVkCi0gICAgICAgIC8vZGVyZWdpc3RlckFsbCgpOworICAgICAgICAvLyBUT0RPIHVuY29tbWVudCB3aGVuIGRlcmVnaXN0ZXJBbGwgaXMgaW1wbGVtZW50ZWQKKyAgICAgICAgLy8gZGVyZWdpc3RlckFsbCgpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgaGFzIGJlZW4gYWxyZWFkeSByZWdpc3RlcmVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwcm92aWRlciB0aGUgcHJvdmlkZXIgdG8gYmUgY2hlY2tlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm92aWRlciB0byBiZSBjaGVja2VkLgogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBoYXMgYmVlbiBhbHJlYWR5IHJlZ2lzdGVyZWQsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBwcm92aWRlcikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBpdGVyYXRvciBvZiBDbGFzcyBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCAKLSAgICAgKiBjYXRlZ29yaWVzLgorICAgICAqIEdldHMgYW4gaXRlcmF0b3Igb2YgQ2xhc3Mgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgY2F0ZWdvcmllcy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBJdGVyYXRvciBvZiBDbGFzcyBvYmplY3RzLgogICAgICAqLwpAQCAtMjYzLDIwICsyNzcsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGUgU2VydmljZVJlZ2lzdHJ5LkZpbHRlciBpbnRlcmZhY2UgaXMgdXNlZCBieSAKLSAgICAgKiBTZXJ2aWNlUmVnaXN0cnkuZ2V0U2VydmljZVByb3ZpZGVycyB0byBmaWx0ZXIgcHJvdmlkZXJzIGFjY29yZGluZwotICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgY3JpdGVyaW9uLiAKKyAgICAgKiBUaGUgU2VydmljZVJlZ2lzdHJ5LkZpbHRlciBpbnRlcmZhY2UgaXMgdXNlZCBieQorICAgICAqIFNlcnZpY2VSZWdpc3RyeS5nZXRTZXJ2aWNlUHJvdmlkZXJzIHRvIGZpbHRlciBwcm92aWRlcnMgYWNjb3JkaW5nIHRvIHRoZQorICAgICAqIHNwZWNpZmllZCBjcml0ZXJpb24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRmlsdGVyIHsKLSAgICAgICAgCisKICAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIHNhdGlzZmllcyB0aGUgCi0gICAgICAgICAqIGNyaXRlcmlvbiBvZiB0aGlzIEZpbHRlci4KKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgc2F0aXNmaWVzIHRoZSBjcml0ZXJpb24gb2YKKyAgICAgICAgICogdGhpcyBGaWx0ZXIuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIHByb3ZpZGVyLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgc2F0aXNmaWVzIHRoZSAKLSAgICAgICAgICogY3JpdGVyaW9uIG9mIHRoaXMgRmlsdGVyLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBwcm92aWRlci4KKyAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIHNhdGlzZmllcyB0aGUgY3JpdGVyaW9uIG9mCisgICAgICAgICAqICAgICAgICAgdGhpcyBGaWx0ZXIsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICovCiAgICAgICAgIGJvb2xlYW4gZmlsdGVyKE9iamVjdCBwcm92aWRlcik7CiAgICAgfQpAQCAtMjg1LDMwICszMDEsMzYgQEAKICAgICAgKiBUaGUgQ2xhc3MgQ2F0ZWdvcmllc01hcC4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDYXRlZ29yaWVzTWFwIHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgY2F0ZWdvcmllcy4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNhdGVnb3JpZXMuCisgICAgICAgICAqLwogICAgICAgICBNYXA8Q2xhc3M8Pz4sIFByb3ZpZGVyc01hcD4gY2F0ZWdvcmllcyA9IG5ldyBIYXNoTWFwPENsYXNzPD8+LCBQcm92aWRlcnNNYXA+KCk7CiAKLSAgICAgICAgLyoqIFRoZSByZWdpc3RyeS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSByZWdpc3RyeS4KKyAgICAgICAgICovCiAgICAgICAgIFNlcnZpY2VSZWdpc3RyeSByZWdpc3RyeTsKIAogICAgICAgICAvKioKICAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGNhdGVnb3JpZXMgbWFwLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHJlZ2lzdHJ5IHRoZSByZWdpc3RyeQorICAgICAgICAgKiBAcGFyYW0gcmVnaXN0cnkKKyAgICAgICAgICogICAgICAgICAgICB0aGUgcmVnaXN0cnkuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgQ2F0ZWdvcmllc01hcChTZXJ2aWNlUmVnaXN0cnkgcmVnaXN0cnkpIHsKICAgICAgICAgICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKICAgICAgICAgfQogCi0gICAgICAgIC8vLS0gVE9ETzogdXNlT3JkZXJpbmcKKyAgICAgICAgLy8gLS0gVE9ETzogdXNlT3JkZXJpbmcKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldHMgdGhlIHByb3ZpZGVycy4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBjYXRlZ29yeSB0aGUgY2F0ZWdvcnkKLSAgICAgICAgICogQHBhcmFtIHVzZU9yZGVyaW5nIHRoZSB1c2Ugb3JkZXJpbmcKLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVycworICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcnkKKyAgICAgICAgICogICAgICAgICAgICB0aGUgY2F0ZWdvcnkuCisgICAgICAgICAqIEBwYXJhbSB1c2VPcmRlcmluZworICAgICAgICAgKiAgICAgICAgICAgIHRoZSB1c2Ugb3JkZXJpbmcuCisgICAgICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVycy4KICAgICAgICAgICovCiAgICAgICAgIEl0ZXJhdG9yPD8+IGdldFByb3ZpZGVycyhDbGFzczw/PiBjYXRlZ29yeSwgYm9vbGVhbiB1c2VPcmRlcmluZykgewogICAgICAgICAgICAgUHJvdmlkZXJzTWFwIHByb3ZpZGVycyA9IGNhdGVnb3JpZXMuZ2V0KGNhdGVnb3J5KTsKQEAgLTMyMSw3ICszNDMsNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogTGlzdC4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGl0ZXJhdG9yPCBjbGFzczw/Pj4KKyAgICAgICAgICogQHJldHVybiB0aGUgaXRlcmF0b3I8IGNsYXNzPD8+Pi4KICAgICAgICAgICovCiAgICAgICAgIEl0ZXJhdG9yPENsYXNzPD8+PiBsaXN0KCkgewogICAgICAgICAgICAgcmV0dXJuIGNhdGVnb3JpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKQEAgLTMzMCw3ICszNTIsOCBAQAogICAgICAgICAvKioKICAgICAgICAgICogQWRkcyB0aGUgY2F0ZWdvcnkuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgdGhlIGNhdGVnb3J5CisgICAgICAgICAqIEBwYXJhbSBjYXRlZ29yeQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBjYXRlZ29yeS4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgYWRkQ2F0ZWdvcnkoQ2xhc3M8Pz4gY2F0ZWdvcnkpIHsKICAgICAgICAgICAgIGNhdGVnb3JpZXMucHV0KGNhdGVnb3J5LCBuZXcgUHJvdmlkZXJzTWFwKCkpOwpAQCAtMzQxLDEwICszNjQsMTEgQEAKICAgICAgICAgICogPGNvZGU+bnVsbDwvY29kZT4gdGhlbiB0aGUgcHJvdmlkZXIgd2lsbCBiZSBhZGRlZCB0byBhbGwgY2F0ZWdvcmllcwogICAgICAgICAgKiB3aGljaCB0aGUgcHJvdmlkZXIgaXMgYXNzaWduYWJsZSBmcm9tLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIHByb3ZpZGVyIHRvIGFkZAotICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgY2F0ZWdvcnkgdG8gYWRkIHByb3ZpZGVyIHRvCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIGlmIHRoZXJlIHdlcmUgc3VjaCBwcm92aWRlciBpbiBzb21lIGNhdGVnb3J5CisgICAgICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAgICAgKiAgICAgICAgICAgIHByb3ZpZGVyIHRvIGFkZC4KKyAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5CisgICAgICAgICAqICAgICAgICAgICAgY2F0ZWdvcnkgdG8gYWRkIHByb3ZpZGVyIHRvLgorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZXJlIHdlcmUgc3VjaCBwcm92aWRlciBpbiBzb21lIGNhdGVnb3J5LgogICAgICAgICAgKi8KICAgICAgICAgYm9vbGVhbiBhZGRQcm92aWRlcihPYmplY3QgcHJvdmlkZXIsIENsYXNzPD8+IGNhdGVnb3J5KSB7CiAgICAgICAgICAgICBpZiAocHJvdmlkZXIgPT0gbnVsbCkgewpAQCAtMzU1LDExICszNzksMTEgQEAKICAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcnQgPSBmaW5kQW5kQWRkKHByb3ZpZGVyKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcnQgID0gYWRkVG9OYW1lZChwcm92aWRlciwgY2F0ZWdvcnkpOworICAgICAgICAgICAgICAgIHJ0ID0gYWRkVG9OYW1lZChwcm92aWRlciwgY2F0ZWdvcnkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBSZWdpc3RlcmFibGVTZXJ2aWNlKSB7Ci0gICAgICAgICAgICAgICAgKChSZWdpc3RlcmFibGVTZXJ2aWNlKSBwcm92aWRlcikub25SZWdpc3RyYXRpb24ocmVnaXN0cnksIGNhdGVnb3J5KTsKKyAgICAgICAgICAgICAgICAoKFJlZ2lzdGVyYWJsZVNlcnZpY2UpcHJvdmlkZXIpLm9uUmVnaXN0cmF0aW9uKHJlZ2lzdHJ5LCBjYXRlZ29yeSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBydDsKQEAgLTM2OCwxMCArMzkyLDExIEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBBZGRzIHRoZSB0byBuYW1lZC4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBwcm92aWRlciB0aGUgcHJvdmlkZXIKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IHRoZSBjYXRlZ29yeQotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsCisgICAgICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBwcm92aWRlci4KKyAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGNhdGVnb3J5LgorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwuCiAgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gYWRkVG9OYW1lZChPYmplY3QgcHJvdmlkZXIsIENsYXNzPD8+IGNhdGVnb3J5KSB7CiAgICAgICAgICAgICBPYmplY3Qgb2JqID0gY2F0ZWdvcmllcy5nZXQoY2F0ZWdvcnkpOwpAQCAtMzgwLDE1ICs0MDUsMTUgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGNhdGVnb3J5OiAiICsgY2F0ZWdvcnkpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICByZXR1cm4gKChQcm92aWRlcnNNYXApIG9iaikuYWRkUHJvdmlkZXIocHJvdmlkZXIpOworICAgICAgICAgICAgcmV0dXJuICgoUHJvdmlkZXJzTWFwKW9iaikuYWRkUHJvdmlkZXIocHJvdmlkZXIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEZpbmQgYW5kIGFkZC4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBwcm92aWRlciB0aGUgcHJvdmlkZXIKLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bAorICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIuCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bC4KICAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBmaW5kQW5kQWRkKE9iamVjdCBwcm92aWRlcikgewogICAgICAgICAgICAgYm9vbGVhbiBydCA9IGZhbHNlOwpAQCAtNDA1LDE3ICs0MzAsMTkgQEAKICAgICAgKiBUaGUgQ2xhc3MgUHJvdmlkZXJzTWFwLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3ZpZGVyc01hcCB7Ci0gICAgICAgIC8vLS0gVE9ETzogcHJvdmlkZXJzIG9yZGVyaW5nIHN1cHBvcnQKKyAgICAgICAgLy8gLS0gVE9ETzogcHJvdmlkZXJzIG9yZGVyaW5nIHN1cHBvcnQKIAotICAgICAgICAvKiogVGhlIHByb3ZpZGVycy4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwcm92aWRlcnMuCisgICAgICAgICAqLwogICAgICAgICBNYXA8Q2xhc3M8Pz4sIE9iamVjdD4gcHJvdmlkZXJzID0gbmV3IEhhc2hNYXA8Q2xhc3M8Pz4sIE9iamVjdD4oKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogQWRkcyB0aGUgcHJvdmlkZXIuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIHByb3ZpZGVyCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHByb3ZpZGVyLgorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwuCiAgICAgICAgICAqLwogICAgICAgICBib29sZWFuIGFkZFByb3ZpZGVyKE9iamVjdCBwcm92aWRlcikgewogICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVycy5wdXQocHJvdmlkZXIuZ2V0Q2xhc3MoKSwgcHJvdmlkZXIpICE9IG51bGw7CkBAIC00MjQsMTkgKzQ1MSwxOSBAQAogICAgICAgICAvKioKICAgICAgICAgICogR2V0cyB0aGUgcHJvdmlkZXIgY2xhc3Nlcy4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIGNsYXNzZXMKKyAgICAgICAgICogQHJldHVybiB0aGUgcHJvdmlkZXIgY2xhc3Nlcy4KICAgICAgICAgICovCiAgICAgICAgIEl0ZXJhdG9yPENsYXNzPD8+PiBnZXRQcm92aWRlckNsYXNzZXMoKSB7CiAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJzLmtleVNldCgpLml0ZXJhdG9yKCk7CiAgICAgICAgIH0KIAotICAgICAgICAvLy0tIFRPRE8gb3JkZXJpbmcKKyAgICAgICAgLy8gLS0gVE9ETyBvcmRlcmluZwogICAgICAgICAvKioKICAgICAgICAgICogR2V0cyB0aGUgcHJvdmlkZXJzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHVzZXJPcmRlcmluZyB0aGUgdXNlciBvcmRlcmluZwotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgcHJvdmlkZXJzCisgICAgICAgICAqIEBwYXJhbSB1c2VyT3JkZXJpbmcKKyAgICAgICAgICogICAgICAgICAgICB0aGUgdXNlciBvcmRlcmluZy4KKyAgICAgICAgICogQHJldHVybiB0aGUgcHJvdmlkZXJzLgogICAgICAgICAgKi8KICAgICAgICAgSXRlcmF0b3I8Pz4gZ2V0UHJvdmlkZXJzKGJvb2xlYW4gdXNlck9yZGVyaW5nKSB7CiAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7CkBAIC00NDgsMjAgKzQ3NSwyOCBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZpbHRlcmVkSXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CiAKLSAgICAgICAgLyoqIFRoZSBmaWx0ZXIuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZmlsdGVyLgorICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBGaWx0ZXIgZmlsdGVyOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBiYWNrZW5kLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYmFja2VuZC4KKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgSXRlcmF0b3I8RT4gYmFja2VuZDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgbmV4dCBvYmouICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuZXh0IG9iai4KKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgRSBuZXh0T2JqOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmlsdGVyZWQgaXRlcmF0b3IuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gZmlsdGVyIHRoZSBmaWx0ZXIKLSAgICAgICAgICogQHBhcmFtIGJhY2tlbmQgdGhlIGJhY2tlbmQKKyAgICAgICAgICogQHBhcmFtIGZpbHRlcgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBmaWx0ZXIuCisgICAgICAgICAqIEBwYXJhbSBiYWNrZW5kCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGJhY2tlbmQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRmlsdGVyZWRJdGVyYXRvcihGaWx0ZXIgZmlsdGVyLCBJdGVyYXRvcjxFPiBiYWNrZW5kKSB7CiAgICAgICAgICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjsKQEAgLTQ3Miw3ICs1MDcsNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogTmV4dC4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGUKKyAgICAgICAgICogQHJldHVybiB0aGUgZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBFIG5leHQoKSB7CiAgICAgICAgICAgICBpZiAobmV4dE9iaiA9PSBudWxsKSB7CkBAIC00ODYsNyArNTIxLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENoZWNrcyBmb3IgbmV4dC4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bAorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewogICAgICAgICAgICAgcmV0dXJuIG5leHRPYmogIT0gbnVsbDsKQEAgLTUwMCw3ICs1MzUsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgbmV4dE9iaiB0byBhIG5leHQgcHJvdmlkZXIgbWF0Y2hpbmcgdGhlIGNyaXRlcmlvbiBnaXZlbiBieSB0aGUgZmlsdGVyLgorICAgICAgICAgKiBTZXRzIG5leHRPYmogdG8gYSBuZXh0IHByb3ZpZGVyIG1hdGNoaW5nIHRoZSBjcml0ZXJpb24gZ2l2ZW4gYnkgdGhlCisgICAgICAgICAqIGZpbHRlci4KICAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgdm9pZCBmaW5kTmV4dCgpIHsKICAgICAgICAgICAgIG5leHRPYmogPSBudWxsOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vc3BpL3BhY2thZ2UuaHRtbCBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjZWZmNAotLS0gL2Rldi9udWxsCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGJvZHk+CisgICAgPHA+CisgICAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIHNldmVyYWwgU2VydmljZSBQcm92aWRlciBJbnRlcmZhY2UgKFNQSSkgY2xhc3NlcyBmb3IgcmVhZGVycywgd3JpdGVycywgdHJhbnNjb2RlcnMgYW5kIHN0cmVhbXMgdG8gaGFuZGxlIGltYWdlcy4KKyAgICA8L3A+CisgIEBzaW5jZSBBbmRyb2lkIDEuMAorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vRmlsZUNhY2hlSW1hZ2VJbnB1dFN0cmVhbS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ZpbGVDYWNoZUltYWdlSW5wdXRTdHJlYW0uamF2YQppbmRleCA0N2JjMTg5Li43MTBhYzY2IDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vRmlsZUNhY2hlSW1hZ2VJbnB1dFN0cmVhbS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9GaWxlQ2FjaGVJbWFnZUlucHV0U3RyZWFtLmphdmEKQEAgLTE1LDM4ICsxNSw0MyBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLQogcGFja2FnZSBqYXZheC5pbWFnZWlvLnN0cmVhbTsKIAogaW1wb3J0IGphdmEuaW8uKjsKIAogLyoqCi0gKiBUaGUgRmlsZUNhY2hlSW1hZ2VJbnB1dFN0cmVhbSBjbGFzcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZgotICogSW1hZ2VJbnB1dFN0cmVhbSB3aGljaCByZWFkcyBmcm9tIGl0cyBJbnB1dFN0cmVhbQotICogYW5kIHVzZXMgYSB0ZW1wb3JhcnkgZmlsZSBhcyBhIGNhY2hlLiAKKyAqIFRoZSBGaWxlQ2FjaGVJbWFnZUlucHV0U3RyZWFtIGNsYXNzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEltYWdlSW5wdXRTdHJlYW0KKyAqIHdoaWNoIHJlYWRzIGZyb20gaXRzIElucHV0U3RyZWFtIGFuZCB1c2VzIGEgdGVtcG9yYXJ5IGZpbGUgYXMgYSBjYWNoZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBGaWxlQ2FjaGVJbWFnZUlucHV0U3RyZWFtIGV4dGVuZHMgSW1hZ2VJbnB1dFN0cmVhbUltcGwgewotICAgIAotICAgIC8qKiBUaGUgaXMuICovCi0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBpczsKLSAgICAKLSAgICAvKiogVGhlIGZpbGUuICovCi0gICAgcHJpdmF0ZSBGaWxlIGZpbGU7Ci0gICAgCi0gICAgLyoqIFRoZSByYWYuICovCi0gICAgcHJpdmF0ZSBSYW5kb21BY2Nlc3NGaWxlIHJhZjsKLQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEZpbGVDYWNoZUltYWdlSW5wdXRTdHJlYW0gZnJvbQotICAgICAqIHRoZSBzcGVjaWZpZWQgSW5wdXRTdHJlYW0gYW5kIHVzaW5nIHRoZSBzcGVjaWZpZWQgCi0gICAgICogRmlsZSBhcyBpdHMgY2FjaGUgZGlyZWN0b3J5LgorICAgICAqIFRoZSBpcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIElucHV0U3RyZWFtIGlzOworCisgICAgLyoqCisgICAgICogVGhlIGZpbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGZpbGU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmFmLgorICAgICAqLworICAgIHByaXZhdGUgUmFuZG9tQWNjZXNzRmlsZSByYWY7CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgRmlsZUNhY2hlSW1hZ2VJbnB1dFN0cmVhbSBmcm9tIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBJbnB1dFN0cmVhbSBhbmQgdXNpbmcgdGhlIHNwZWNpZmllZCBGaWxlIGFzIGl0cyBjYWNoZSBkaXJlY3RvcnkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0cmVhbSB0aGUgSW5wdXRTdHJlYW0gZm9yIHJlYWRpbmcuCi0gICAgICogQHBhcmFtIGNhY2hlRGlyIHRoZSBjYWNoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNoYWNoZSBmaWxlCi0gICAgICogd2lsbCBiZSBjcmVhdGVkLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbnB1dFN0cmVhbSBmb3IgcmVhZGluZy4KKyAgICAgKiBAcGFyYW0gY2FjaGVEaXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYWNoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNhY2hlIGZpbGUgd2lsbCBiZSBjcmVhdGVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgRmlsZUNhY2hlSW1hZ2VJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBzdHJlYW0sIEZpbGUgY2FjaGVEaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgewpAQCAtNTUsNyArNjAsOCBAQAogICAgICAgICBpcyA9IHN0cmVhbTsKIAogICAgICAgICBpZiAoY2FjaGVEaXIgPT0gbnVsbCB8fCBjYWNoZURpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBmaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShGaWxlQ2FjaGVJbWFnZU91dHB1dFN0cmVhbS5JSU9fVEVNUF9GSUxFX1BSRUZJWCwgbnVsbCwgY2FjaGVEaXIpOworICAgICAgICAgICAgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoRmlsZUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0uSUlPX1RFTVBfRklMRV9QUkVGSVgsIG51bGwsCisgICAgICAgICAgICAgICAgICAgIGNhY2hlRGlyKTsKICAgICAgICAgICAgIGZpbGUuZGVsZXRlT25FeGl0KCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgYSBkaXJlY3RvcnkhIik7CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vRmlsZUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0uamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9GaWxlQ2FjaGVJbWFnZU91dHB1dFN0cmVhbS5qYXZhCmluZGV4IGFlNDg1ODUuLjEzNWFmYWIgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9GaWxlQ2FjaGVJbWFnZU91dHB1dFN0cmVhbS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9GaWxlQ2FjaGVJbWFnZU91dHB1dFN0cmVhbS5qYXZhCkBAIC0xNSw3ICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotCiBwYWNrYWdlIGphdmF4LmltYWdlaW8uc3RyZWFtOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTI0LDM1ICsyMyw0OCBAQAogaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKIAogLyoqCi0gKiBUaGUgRmlsZUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0gY2xhc3MgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgCi0gKiBJbWFnZU91dHB1dFN0cmVhbSB0aGF0IHdyaXRlcyB0byBpdHMgT3V0cHV0U3RyZWFtCi0gKiB1c2luZyBhIHRlbXBvcmFyeSBmaWxlIGFzIGEgY2FjaGUuIAorICogVGhlIEZpbGVDYWNoZUltYWdlT3V0cHV0U3RyZWFtIGNsYXNzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mCisgKiBJbWFnZU91dHB1dFN0cmVhbSB0aGF0IHdyaXRlcyB0byBpdHMgT3V0cHV0U3RyZWFtIHVzaW5nIGEgdGVtcG9yYXJ5IGZpbGUgYXMgYQorICogY2FjaGUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRmlsZUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0gZXh0ZW5kcyBJbWFnZU91dHB1dFN0cmVhbUltcGwgewotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgSUlPX1RFTVBfRklMRV9QUkVGSVguICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgSUlPX1RFTVBfRklMRV9QUkVGSVguCisgICAgICovCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBJSU9fVEVNUF9GSUxFX1BSRUZJWCA9ICJpaW9DYWNoZSI7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBNQVhfQlVGRkVSX0xFTi4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBNQVhfQlVGRkVSX0xFTi4KKyAgICAgKi8KICAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9CVUZGRVJfTEVOID0gMTA0ODU3NTsgLy8gMSBNQiAtIGlzIGl0IG5vdCB0b28gbXVjaD8KIAotICAgIC8qKiBUaGUgb3MuICovCisgICAgLyoqCisgICAgICogVGhlIG9zLgorICAgICAqLwogICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIG9zOwotICAgIAotICAgIC8qKiBUaGUgZmlsZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBmaWxlLgorICAgICAqLwogICAgIHByaXZhdGUgRmlsZSBmaWxlOwotICAgIAotICAgIC8qKiBUaGUgcmFmLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHJhZi4KKyAgICAgKi8KICAgICBwcml2YXRlIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgRmlsZUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0cmVhbSB0aGUgT3V0cHV0U3RyZWFtIGZvciB3cml0aW5nLgotICAgICAqIEBwYXJhbSBjYWNoZURpciB0aGUgY2FjaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjaGFjaGUgZmlsZQotICAgICAqIHdpbGwgYmUgY3JlYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gc3RyZWFtCisgICAgICogICAgICAgICAgICB0aGUgT3V0cHV0U3RyZWFtIGZvciB3cml0aW5nLgorICAgICAqIEBwYXJhbSBjYWNoZURpcgorICAgICAqICAgICAgICAgICAgdGhlIGNhY2hlIGRpcmVjdG9yeSB3aGVyZSB0aGUgY2FjaGUgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBGaWxlQ2FjaGVJbWFnZU91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gc3RyZWFtLCBGaWxlIGNhY2hlRGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpIHsKQEAgLTk2LDcgKzEwOCw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGZsdXNoQml0cygpOyAvLyBTZWUgdGhlIGZsdXNoQml0cyBtZXRob2QgZGVzY3JpcHRpb24KLSAgICAgICAgCisKICAgICAgICAgcmFmLndyaXRlKGIpOwogICAgICAgICBzdHJlYW1Qb3MrKzsKICAgICB9CkBAIC0xNDgsNyArMTYwLDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ5dGUgYnVmZmVyW10gPSBuZXcgYnl0ZVtNQVhfQlVGRkVSX0xFTl07CiAgICAgICAgICAgICB3aGlsZSAoYnl0ZXNUb1JlYWQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gKGludCkgTWF0aC5taW4oTUFYX0JVRkZFUl9MRU4sIGJ5dGVzVG9SZWFkKTsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAoaW50KU1hdGgubWluKE1BWF9CVUZGRVJfTEVOLCBieXRlc1RvUmVhZCk7CiAgICAgICAgICAgICAgICAgcmFmLnJlYWRGdWxseShidWZmZXIsIDAsIGNvdW50KTsKICAgICAgICAgICAgICAgICBvcy53cml0ZShidWZmZXIsIDAsIGNvdW50KTsKICAgICAgICAgICAgICAgICBieXRlc1RvUmVhZCAtPSBjb3VudDsKQEAgLTE2OSw3ICsxODEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcmFmLnNlZWsocG9zKTsKLSAgICAgICAgc3RyZWFtUG9zID0gcmFmLmdldEZpbGVQb2ludGVyKCk7ICAgICAgICAKKyAgICAgICAgc3RyZWFtUG9zID0gcmFmLmdldEZpbGVQb2ludGVyKCk7CiAgICAgICAgIGJpdE9mZnNldCA9IDA7CiAgICAgfQogCkBAIC0xNzcsNyArMTg5LDcgQEAKICAgICBwdWJsaWMgbG9uZyBsZW5ndGgoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZXR1cm4gcmFmLmxlbmd0aCgpOwotICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIC0xTDsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9GaWxlSW1hZ2VJbnB1dFN0cmVhbS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ZpbGVJbWFnZUlucHV0U3RyZWFtLmphdmEKaW5kZXggNjY4MGFlMC4uYjliNjAwMiAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ZpbGVJbWFnZUlucHV0U3RyZWFtLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ZpbGVJbWFnZUlucHV0U3RyZWFtLmphdmEKQEAgLTE1LDcgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0KIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5zdHJlYW07CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMjQsMjQgKzIzLDMxIEBACiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiAKIC8qKgotICogVGhlIEZpbGVJbWFnZUlucHV0U3RyZWFtIGNsYXNzIGltcGxlbWVudHMgSW1hZ2VJbnB1dFN0cmVhbSAKLSAqIGFuZCBvYnRhaW5zIGl0cyBpbnB1dCBkYXRhIGZyb20gYSBGaWxlIG9yIFJhbmRvbUFjY2Vzc0ZpbGUuIAorICogVGhlIEZpbGVJbWFnZUlucHV0U3RyZWFtIGNsYXNzIGltcGxlbWVudHMgSW1hZ2VJbnB1dFN0cmVhbSBhbmQgb2J0YWlucyBpdHMKKyAqIGlucHV0IGRhdGEgZnJvbSBhIEZpbGUgb3IgUmFuZG9tQWNjZXNzRmlsZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBGaWxlSW1hZ2VJbnB1dFN0cmVhbSBleHRlbmRzIEltYWdlSW5wdXRTdHJlYW1JbXBsIHsKLSAgICAKLSAgICAvKiogVGhlIHJhZi4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSByYWYuCisgICAgICovCiAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWY7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgRmlsZUltYWdlSW5wdXRTdHJlYW0gZnJvbSB0aGUgc3BlY2lmaWVkIEZpbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGYgdGhlIEZpbGUgb2YgaW5wdXQgZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGZpbGUgCi0gICAgICogZG9lc24ndCBleGlzdC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gZgorICAgICAqICAgICAgICAgICAgdGhlIEZpbGUgb2YgaW5wdXQgZGF0YS4KKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgZmlsZSBkb2Vzbid0IGV4aXN0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkR1cGxpY2F0ZVRocm93cyJ9KQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCB7CisgICAgICAgICJEdXBsaWNhdGVUaHJvd3MiCisgICAgfSkKICAgICBwdWJsaWMgRmlsZUltYWdlSW5wdXRTdHJlYW0oRmlsZSBmKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChmID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImYgPT0gbnVsbCEiKTsKQEAgLTUxLDEwICs1NywxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBGaWxlSW1hZ2VJbnB1dFN0cmVhbSBmcm9tIHRoZSBzcGVjaWZpZWQgCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEZpbGVJbWFnZUlucHV0U3RyZWFtIGZyb20gdGhlIHNwZWNpZmllZAogICAgICAqIFJhbmRvbUFjY2Vzc0ZpbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJhZiB0aGUgUmFuZG9tQWNjZXNzRmlsZSBvZiBpbnB1dCBkYXRhLgorICAgICAqIEBwYXJhbSByYWYKKyAgICAgKiAgICAgICAgICAgIHRoZSBSYW5kb21BY2Nlc3NGaWxlIG9mIGlucHV0IGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIEZpbGVJbWFnZUlucHV0U3RyZWFtKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmKSB7CiAgICAgICAgIGlmIChyYWYgPT0gbnVsbCkgewpAQCAtOTEsNyArOTgsNyBAQAogICAgIHB1YmxpYyBsb25nIGxlbmd0aCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiByYWYubGVuZ3RoKCk7Ci0gICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICByZXR1cm4gLTFMOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ZpbGVJbWFnZU91dHB1dFN0cmVhbS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ZpbGVJbWFnZU91dHB1dFN0cmVhbS5qYXZhCmluZGV4IGVhYWZlMTQuLjI3MzBiYTYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9GaWxlSW1hZ2VPdXRwdXRTdHJlYW0uamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vRmlsZUltYWdlT3V0cHV0U3RyZWFtLmphdmEKQEAgLTE4LDM5ICsxOCw0NCBAQAogICogQGF1dGhvciBSdXN0ZW0gVi4gUmFmaWtvdgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5zdHJlYW07CiAKIGltcG9ydCBqYXZhLmlvLio7CiAKIC8qKgotICogVGhlIEZpbGVJbWFnZU91dHB1dFN0cmVhbSBjbGFzcyBpbXBsZW1lbnRzIEltYWdlT3V0cHV0U3RyZWFtIAotICogYW5kIHdyaXRlcyB0aGUgb3V0cHV0IGRhdGEgdG8gYSBGaWxlIG9yIFJhbmRvbUFjY2Vzc0ZpbGUuIAorICogVGhlIEZpbGVJbWFnZU91dHB1dFN0cmVhbSBjbGFzcyBpbXBsZW1lbnRzIEltYWdlT3V0cHV0U3RyZWFtIGFuZCB3cml0ZXMgdGhlCisgKiBvdXRwdXQgZGF0YSB0byBhIEZpbGUgb3IgUmFuZG9tQWNjZXNzRmlsZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBGaWxlSW1hZ2VPdXRwdXRTdHJlYW0gZXh0ZW5kcyBJbWFnZU91dHB1dFN0cmVhbUltcGwgewogCi0gICAgLyoqIFRoZSBmaWxlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBmaWxlLgorICAgICAqLwogICAgIFJhbmRvbUFjY2Vzc0ZpbGUgZmlsZTsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBGaWxlSW1hZ2VPdXRwdXRTdHJlYW0gd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICogRmlsZS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgRmlsZUltYWdlT3V0cHV0U3RyZWFtIHdpdGggdGhlIHNwZWNpZmllZCBGaWxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBmIHRoZSBvdXRwdXQgRmlsZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgZmlsZSBub3QgZm91bmQuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgRmlsZS4KKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmaWxlIG5vdCBmb3VuZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIEZpbGVJbWFnZU91dHB1dFN0cmVhbShGaWxlIGYpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyhmICE9IG51bGwKLSAgICAgICAgICAgICAgICA/IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGYsICJydyIpCi0gICAgICAgICAgICAgICAgOiBudWxsKTsKKyAgICAgICAgdGhpcyhmICE9IG51bGwgPyBuZXcgUmFuZG9tQWNjZXNzRmlsZShmLCAicnciKSA6IG51bGwpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBGaWxlSW1hZ2VPdXRwdXRTdHJlYW0gd2l0aCB0aGUgc3BlY2lmaWVkCiAgICAgICogUmFuZG9tQWNjZXNzRmlsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmFmIHRoZSBvdXRwdXQgUmFuZG9tQWNjZXNzRmlsZS4KKyAgICAgKiBAcGFyYW0gcmFmCisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IFJhbmRvbUFjY2Vzc0ZpbGUuCiAgICAgICovCiAgICAgcHVibGljIEZpbGVJbWFnZU91dHB1dFN0cmVhbShSYW5kb21BY2Nlc3NGaWxlIHJhZikgewogICAgICAgICBpZiAocmFmID09IG51bGwpIHsKQEAgLTEwMiwxNCArMTA3LDE0IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBjaGVja0Nsb3NlZCgpOwogICAgICAgICAgICAgcmV0dXJuIGZpbGUubGVuZ3RoKCk7Ci0gICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICByZXR1cm4gc3VwZXIubGVuZ3RoKCk7IC8vIC0xTAogICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2Vlayhsb25nIHBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBjaGVja0Nsb3NlZCgpIGlzIHBlcmZvcm1lZCBpbiBzdXBlci5zZWVrKCkKKyAgICAgICAgLy8gLS0gY2hlY2tDbG9zZWQoKSBpcyBwZXJmb3JtZWQgaW4gc3VwZXIuc2VlaygpCiAgICAgICAgIHN1cGVyLnNlZWsocG9zKTsKICAgICAgICAgZmlsZS5zZWVrKHBvcyk7CiAgICAgICAgIHN0cmVhbVBvcyA9IGZpbGUuZ2V0RmlsZVBvaW50ZXIoKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9JSU9CeXRlQnVmZmVyLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vSUlPQnl0ZUJ1ZmZlci5qYXZhCmluZGV4IDk2MWE3YjMuLjg2N2Q4MDggMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9JSU9CeXRlQnVmZmVyLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0lJT0J5dGVCdWZmZXIuamF2YQpAQCAtMTgsMzUgKzE4LDQ2IEBACiAgKiBAYXV0aG9yIFNlcmdleSBJLiBTYWxpc2hldgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjIgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5zdHJlYW07CiAKLS8qKiAKLSogQGF1dGhvciBTZXJnZXkgSS4gU2FsaXNoZXYKLSogQHZlcnNpb24gJFJldmlzaW9uOiAxLjIgJAotKi8KKy8vIAorLy8gQGF1dGhvciBTZXJnZXkgSS4gU2FsaXNoZXYKKy8vIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKKy8vCiAKIC8qKgotICogVGhlIElJT0J5dGVCdWZmZXIgY2xhc3MgcmVwcmVzZW50cyBhIGJ5dGUgYXJyYXkgd2l0aCBvZmZzZXQgYW5kIAotICogbGVuZ3RoIHRoYXQgaXMgdXNlZCBieSBJbWFnZUlucHV0U3RyZWFtIGZvciBvYnRhaW5pbmcgYSBzZXF1ZW5jZSAKLSAqIG9mIGJ5dGVzLgorICogVGhlIElJT0J5dGVCdWZmZXIgY2xhc3MgcmVwcmVzZW50cyBhIGJ5dGUgYXJyYXkgd2l0aCBvZmZzZXQgYW5kIGxlbmd0aCB0aGF0CisgKiBpcyB1c2VkIGJ5IEltYWdlSW5wdXRTdHJlYW0gZm9yIG9idGFpbmluZyBhIHNlcXVlbmNlIG9mIGJ5dGVzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIElJT0J5dGVCdWZmZXIgewotICAgIAotICAgIC8qKiBUaGUgZGF0YS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBkYXRhLgorICAgICAqLwogICAgIHByaXZhdGUgYnl0ZVtdIGRhdGE7Ci0gICAgCi0gICAgLyoqIFRoZSBvZmZzZXQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgb2Zmc2V0LgorICAgICAqLwogICAgIHByaXZhdGUgaW50IG9mZnNldDsKLSAgICAKLSAgICAvKiogVGhlIGxlbmd0aC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBsZW5ndGguCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgbGVuZ3RoOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IElJT0J5dGVCdWZmZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGJ5dGUgYXJyYXkuCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGluIHRoZSBhcnJheS4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBsZW5ndGggb2YgYXJyYXkuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5LgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIGFycmF5LgorICAgICAqIEBwYXJhbSBsZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgYXJyYXkuCiAgICAgICovCiAgICAgcHVibGljIElJT0J5dGVCdWZmZXIoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKQEAgLTg0LDcgKzk1LDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBuZXcgZGF0YSBhcnJheSB0byB0aGlzIElJT0J5dGVCdWZmZXIgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBuZXcgZGF0YSBhcnJheS4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBkYXRhIGFycmF5LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERhdGEoYnl0ZVtdIGRhdGEpIHsKICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKQEAgLTkzLDcgKzEwNSw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbGVuZ3RoIG9mIGRhdGEgd2hpY2ggd2lsbCBiZSB1c2VkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIG5ldyBsZW5ndGguCisgICAgICogQHBhcmFtIGxlbmd0aAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBsZW5ndGguCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpIHsKICAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7CkBAIC0xMDIsMTAgKzExNSwxMCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIG9mZnNldCBpbiB0aGUgZGF0YSBhcnJheSBvZiB0aGlzIElJT0J5dGVCdWZmZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgbmV3IG9mZnNldC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgbmV3IG9mZnNldC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRPZmZzZXQoaW50IG9mZnNldCkgewogICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9JbWFnZUlucHV0U3RyZWFtLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vSW1hZ2VJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDc3MWU5ZmYuLjNkZWM1ZDIgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9JbWFnZUlucHV0U3RyZWFtLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ltYWdlSW5wdXRTdHJlYW0uamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBSdXN0ZW0gVi4gUmFmaWtvdgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjIgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5zdHJlYW07CiAKIGltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dDsKQEAgLTI1LDIxICsyNiwyNCBAQAogaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKIAogLyoqCi0gKiBUaGUgSW1hZ2VJbnB1dFN0cmVhbSByZXByZXNlbnRzIGlucHV0IHN0cmVhbSBpbnRlcmZhY2UgdGhhdCBpcyAKLSAqIHVzZWQgYnkgSW1hZ2VSZWFkZXJzLgorICogVGhlIEltYWdlSW5wdXRTdHJlYW0gcmVwcmVzZW50cyBpbnB1dCBzdHJlYW0gaW50ZXJmYWNlIHRoYXQgaXMgdXNlZCBieQorICogSW1hZ2VSZWFkZXJzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJbWFnZUlucHV0U3RyZWFtIGV4dGVuZHMgRGF0YUlucHV0IHsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNwZWNpZmllZCBieXRlIG9yZGVyIGZvciByZWFkaW5nIG9mIGRhdGEgdmFsdWVzIAotICAgICAqIGZyb20gdGhpcyBzdHJlYW0uIAorICAgICAqIFNldHMgdGhlIHNwZWNpZmllZCBieXRlIG9yZGVyIGZvciByZWFkaW5nIG9mIGRhdGEgdmFsdWVzIGZyb20gdGhpcworICAgICAqIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnl0ZU9yZGVyIHRoZSBieXRlIG9yZGVyLgorICAgICAqIEBwYXJhbSBieXRlT3JkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIG9yZGVyLgogICAgICAqLwogICAgIHZvaWQgc2V0Qnl0ZU9yZGVyKEJ5dGVPcmRlciBieXRlT3JkZXIpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgYnl0ZSBvcmRlci4gCisgICAgICogR2V0cyB0aGUgYnl0ZSBvcmRlci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBieXRlIG9yZGVyLgogICAgICAqLwpAQCAtNDgsMTU4ICs1MiwxNTEgQEAKICAgICAvKioKICAgICAgKiBSZWFkcyBhIGJ5dGUgZnJvbSB0aGUgc3RyZWFtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgb2YgdGhlIHN0cmVhbSwgb3IgLTEgZm9yIEVPRiBpbmRpY2F0aW5nLiAKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBieXRlIG9mIHRoZSBzdHJlYW0sIG9yIC0xIGZvciBFT0YgaW5kaWNhdGluZy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBhcnJheSdzIGxlbmd0aAotICAgICAqIGFuZCBzdG9yZXMgYSByZXN1bHQgdG8gdGhpcyBhcnJheS4KKyAgICAgKiBSZWFkcyBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBhcnJheSdzIGxlbmd0aCBhbmQKKyAgICAgKiBzdG9yZXMgYSByZXN1bHQgdG8gdGhpcyBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYiB0aGUgYnl0ZSBhcnJheS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkuCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJlYWQgYnl0ZXMsIG9yIC0xIGluZGljYXRlZCBFT0YuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIGludCByZWFkKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNwZWNpZmllZCBieSBsZW4gcGFyYW1ldGVyIGZyb20gCi0gICAgICogdGhlIHN0cmVhbSBhbmQgc3RvcmVzIGEgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkKLSAgICAgKiB3aXRoIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgorICAgICAqIFJlYWRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgc3BlY2lmaWVkIGJ5IGxlbiBwYXJhbWV0ZXIgZnJvbSB0aGUgc3RyZWFtIGFuZAorICAgICAqIHN0b3JlcyBhIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBvZmZzZXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGIgdGhlIGJ5dGUgYXJyYXkuCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSByZWFkLgotICAgICAqIAorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZC4KICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcmVhZCBieXRlcywgb3IgLTEgaW5kaWNhdGVkIEVPRi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgc3BlY2lmaWVkIGJ5IGxlbiBwYXJhbWV0ZXIgCi0gICAgICogZnJvbSB0aGUgc3RyZWFtLCBhbmQgbW9kaWZpZXMgdGhlIHNwZWNpZmllZCBJSU9CeXRlQnVmZmVyIAotICAgICAqIHdpdGggdGhlIGJ5dGUgYXJyYXksIG9mZnNldCwgYW5kIGxlbmd0aC4KKyAgICAgKiBSZWFkcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNwZWNpZmllZCBieSBsZW4gcGFyYW1ldGVyIGZyb20gdGhlIHN0cmVhbSwgYW5kCisgICAgICogbW9kaWZpZXMgdGhlIHNwZWNpZmllZCBJSU9CeXRlQnVmZmVyIHdpdGggdGhlIGJ5dGUgYXJyYXksIG9mZnNldCwgYW5kCisgICAgICogbGVuZ3RoLgogICAgICAqIAotICAgICAqIEBwYXJhbSBidWYgdGhlIElJT0J5dGVCdWZmZXIuCi0gICAgICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJlYWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGJ1ZgorICAgICAqICAgICAgICAgICAgdGhlIElJT0J5dGVCdWZmZXIuCisgICAgICogQHBhcmFtIGxlbgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSByZWFkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIHJlYWRCeXRlcyhJSU9CeXRlQnVmZmVyIGJ1ZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSBieXRlIGZyb20gdGhlIHN0cmVhbSBhbmQgcmV0dXJucyBhIGJvb2xlYW4gdHJ1ZSB2YWx1ZSAKLSAgICAgKiBpZiBpdCBpcyBub24gemVybywgZmFsc2UgaWYgaXQgaXMgemVyby4KKyAgICAgKiBSZWFkcyBhIGJ5dGUgZnJvbSB0aGUgc3RyZWFtIGFuZCByZXR1cm5zIGEgYm9vbGVhbiB0cnVlIHZhbHVlIGlmIGl0IGlzCisgICAgICogbm9uIHplcm8sIGZhbHNlIGlmIGl0IGlzIHplcm8uCiAgICAgICogCi0gICAgICogQHJldHVybiBhIGJvb2xlYW4gdmFsdWUgZm9yIHJlYWQgYnl0ZS4gCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZSBmb3IgcmVhZCBieXRlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBib29sZWFuIHJlYWRCb29sZWFuKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYSBieXRlIGZyb20gdGhlIHN0cmVhbSBhbmQgcmV0dXJucyBpdHMgdmFsdWUKLSAgICAgKiBhcyBzaWduZWQgYnl0ZS4KKyAgICAgKiBSZWFkcyBhIGJ5dGUgZnJvbSB0aGUgc3RyZWFtIGFuZCByZXR1cm5zIGl0cyB2YWx1ZSBhcyBzaWduZWQgYnl0ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc2lnbmVkIGJ5dGUgdmFsdWUgZm9yIHJlYWQgYnl0ZS4gCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIGJ5dGUgdmFsdWUgZm9yIHJlYWQgYnl0ZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgYnl0ZSBmcm9tIHRoZSBzdHJlYW0gYW5kIHJldHVybnMgaXRzIHZhbHVlCi0gICAgICogYXMgaW50LgorICAgICAqIFJlYWRzIGEgYnl0ZSBmcm9tIHRoZSBzdHJlYW0gYW5kIHJldHVybnMgaXRzIHZhbHVlIGFzIGFuIGludGVnZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHVuc2lnbmVkIGJ5dGUgdmFsdWUgZm9yIHJlYWQgYnl0ZSBhcyBpbnQuIAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEByZXR1cm4gdGhlIHVuc2lnbmVkIGJ5dGUgdmFsdWUgZm9yIHJlYWQgYnl0ZSBhcyBhbiBpbnRlZ2VyLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBpbnQgcmVhZFVuc2lnbmVkQnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIDIgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IAotICAgICAqIGFzIGEgc2hvcnQuCisgICAgICogUmVhZHMgMiBieXRlcyBmcm9tIHRoZSBzdHJlYW0sIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBzaG9ydC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBzaWduZWQgc2hvcnQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBzaG9ydCByZWFkU2hvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyAyIGJ5dGVzIGZyb20gdGhlIHN0cmVhbSBhbmQgcmV0dXJucyBpdHMgdmFsdWUKLSAgICAgKiBhcyBhbiB1bnNpZ25lZCBzaG9ydC4KKyAgICAgKiBSZWFkcyAyIGJ5dGVzIGZyb20gdGhlIHN0cmVhbSBhbmQgcmV0dXJucyBpdHMgdmFsdWUgYXMgYW4gdW5zaWduZWQgc2hvcnQuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHVuc2lnbmVkIHNob3J0IHZhbHVlIGNvZGVkIGluIGFuIGludC4gCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHJldHVybiBhIHVuc2lnbmVkIHNob3J0IHZhbHVlIGNvZGVkIGluIGFuIGludGVnZXIuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIGludCByZWFkVW5zaWduZWRTaG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIDIgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtIGFuZCByZXR1cm5zIHRoZWlyIAotICAgICAqIHVuc2lnbmVkIGNoYXIgdmFsdWUuCisgICAgICogUmVhZHMgMiBieXRlcyBmcm9tIHRoZSBzdHJlYW0gYW5kIHJldHVybnMgdGhlaXIgdW5zaWduZWQgY2hhciB2YWx1ZS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSB1bnNpZ25lZCBjaGFyIHZhbHVlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBjaGFyIHJlYWRDaGFyKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgNCBieXRlcyBmcm9tIHRoZSBzdHJlYW0sIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgCi0gICAgICogYXMgYW4gaW50LgorICAgICAqIFJlYWRzIDQgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGFuIGludGVnZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2lnbmVkIGludCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIGludGVnZXIgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBpbnQgcmVhZEludCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIDQgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtIGFuZCByZXR1cm5zIGl0cyB2YWx1ZQotICAgICAqIGFzIGxvbmcuCisgICAgICogUmVhZHMgNCBieXRlcyBmcm9tIHRoZSBzdHJlYW0gYW5kIHJldHVybnMgaXRzIHZhbHVlIGFzIGxvbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHVuc2lnbmVkIGludCB2YWx1ZSBhcyBsb25nLiAKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlIGFzIGxvbmcuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIGxvbmcgcmVhZFVuc2lnbmVkSW50KCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgOCBieXRlcyBmcm9tIHRoZSBzdHJlYW0sIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgCi0gICAgICogYXMgYSBsb25nLgorICAgICAqIFJlYWRzIDggYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGEgbG9uZy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBsb25nIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgbG9uZyByZWFkTG9uZygpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIDQgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IAotICAgICAqIGFzIGEgZmxvYXQuCisgICAgICogUmVhZHMgNCBieXRlcyBmcm9tIHRoZSBzdHJlYW0sIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBmbG9hdC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIGZsb2F0IHJlYWRGbG9hdCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIDggYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IAotICAgICAqIGFzIGEgZG91YmxlLgorICAgICAqIFJlYWRzIDggYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGEgZG91YmxlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZSB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCkBAIC0yMDcsMTIwICsyMDQsMTM0IEBACiAgICAgICogUmVhZHMgYSBsaW5lIGZyb20gdGhlIHN0cmVhbS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgY29udGFpbmVkIHRoZSBsaW5lIGZyb20gdGhlIHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgU3RyaW5nIHJlYWRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtIGluIGEgc3RyaW5nIHRoYXQgaGFzIGJlZW4gZW5jb2RlZCAKLSAgICAgKiBpbiBhIG1vZGlmaWVkIFVURi04IGZvcm1hdC4KKyAgICAgKiBSZWFkcyBieXRlcyBmcm9tIHRoZSBzdHJlYW0gaW4gYSBzdHJpbmcgdGhhdCBoYXMgYmVlbiBlbmNvZGVkIGluIGEKKyAgICAgKiBtb2RpZmllZCBVVEYtOCBmb3JtYXQuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlYWQgZnJvbSBzdHJlYW0gYW5kIG1vZGlmaWVkIFVURi04IGZvcm1hdC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgU3RyaW5nIHJlYWRVVEYoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzdHJlYW0sIAotICAgICAqIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbnRvIHRoZSBzcGVjaWZpZWQgYXJyYXkgc3RhcnRpbmcgYXQgCi0gICAgICogdGhlIHNwZWNpZmllZCBpbmRleCBvZmZzZXQuIAorICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbSwgYW5kIHN0b3JlcyB0aGUKKyAgICAgKiByZXN1bHQgaW50byB0aGUgc3BlY2lmaWVkIGFycmF5IHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2Zmc2V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBiIHRoZSBieXRlIGFycmF5LgotICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldC4KLSAgICAgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldC4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJlYWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgcmVhZEZ1bGx5KGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtIHdoaWNoIGlzIGVxdWFsIHRvIAotICAgICAqIHRoZSBzcGVjaWZpZWQgYXJyYXkncyBsZW5ndGgsIGFuZCBzdG9yZXMgdGhlbSBpbnRvIAotICAgICAqIHRoaXMgYXJyYXkuCisgICAgICogUmVhZHMgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbSB3aGljaCBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCisgICAgICogYXJyYXkncyBsZW5ndGgsIGFuZCBzdG9yZXMgdGhlbSBpbnRvIHRoaXMgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGIgdGhlIGJ5dGUgYXJyYXkuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIHJlYWRGdWxseShieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc2hvcnRzIGZyb20gdGhlIHN0cmVhbSwgCi0gICAgICogYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGludG8gdGhlIHNwZWNpZmllZCBhcnJheSBzdGFydGluZyBhdCAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGluZGV4IG9mZnNldC4gCisgICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc2hvcnRzIGZyb20gdGhlIHN0cmVhbSwgYW5kIHN0b3JlcyB0aGUKKyAgICAgKiByZXN1bHQgaW50byB0aGUgc3BlY2lmaWVkIGFycmF5IHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2Zmc2V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSBzaG9ydCBhcnJheS4KLSAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmZzZXQuCi0gICAgICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIHNob3J0cyB0byBiZSByZWFkLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgc2hvcnQgYXJyYXkuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldC4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNob3J0cyB0byBiZSByZWFkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIHJlYWRGdWxseShzaG9ydFtdIHMsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJzIGZyb20gdGhlIHN0cmVhbSwgCi0gICAgICogYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGludG8gdGhlIHNwZWNpZmllZCBhcnJheSBzdGFydGluZyBhdCAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGluZGV4IG9mZnNldC4gCisgICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcnMgZnJvbSB0aGUgc3RyZWFtLCBhbmQgc3RvcmVzIHRoZQorICAgICAqIHJlc3VsdCBpbnRvIHRoZSBzcGVjaWZpZWQgYXJyYXkgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBvZmZzZXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGMgdGhlIGNoYXIgYXJyYXkuCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBjaGFycyB0byBiZSByZWFkLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBjCisgICAgICogICAgICAgICAgICB0aGUgY2hhciBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcnMgdG8gYmUgcmVhZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCByZWFkRnVsbHkoY2hhcltdIGMsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGludHMgZnJvbSB0aGUgc3RyZWFtLCAKLSAgICAgKiBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW50byB0aGUgc3BlY2lmaWVkIGFycmF5IHN0YXJ0aW5nIGF0IAotICAgICAqIHRoZSBzcGVjaWZpZWQgaW5kZXggb2Zmc2V0LiAKKyAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBpbnRlZ2VyIGZyb20gdGhlIHN0cmVhbSwgYW5kIHN0b3JlcyB0aGUKKyAgICAgKiByZXN1bHQgaW50byB0aGUgc3BlY2lmaWVkIGFycmF5IHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2Zmc2V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpIHRoZSBpbnQgYXJyYXkuCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBpbnRzIHRvIGJlIHJlYWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIGFycmF5LgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQuCisgICAgICogQHBhcmFtIGxlbgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBpbnRlZ2VyIHRvIGJlIHJlYWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgcmVhZEZ1bGx5KGludFtdIGksIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGxvbmdzIGZyb20gdGhlIHN0cmVhbSwgCi0gICAgICogYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGludG8gdGhlIHNwZWNpZmllZCBhcnJheSBzdGFydGluZyBhdCAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGluZGV4IG9mZnNldC4gCisgICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbG9uZ3MgZnJvbSB0aGUgc3RyZWFtLCBhbmQgc3RvcmVzIHRoZQorICAgICAqIHJlc3VsdCBpbnRvIHRoZSBzcGVjaWZpZWQgYXJyYXkgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBvZmZzZXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIGxvbmcgYXJyYXkuCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBsb25ncyB0byBiZSByZWFkLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgbG9uZyBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgbG9uZ3MgdG8gYmUgcmVhZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCByZWFkRnVsbHkobG9uZ1tdIGwsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGZsb2F0cyBmcm9tIHRoZSBzdHJlYW0sIAotICAgICAqIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbnRvIHRoZSBzcGVjaWZpZWQgYXJyYXkgc3RhcnRpbmcgYXQgCi0gICAgICogdGhlIHNwZWNpZmllZCBpbmRleCBvZmZzZXQuIAorICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGZsb2F0cyBmcm9tIHRoZSBzdHJlYW0sIGFuZCBzdG9yZXMgdGhlCisgICAgICogcmVzdWx0IGludG8gdGhlIHNwZWNpZmllZCBhcnJheSBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mZnNldC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZiB0aGUgZmxvYXQgYXJyYXkuCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBmbG9hdHMgdG8gYmUgcmVhZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gZgorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IGFycmF5LgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQuCisgICAgICogQHBhcmFtIGxlbgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBmbG9hdHMgdG8gYmUgcmVhZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCByZWFkRnVsbHkoZmxvYXRbXSBmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkb3VibGVzIGZyb20gdGhlIHN0cmVhbSwgCi0gICAgICogYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGludG8gdGhlIHNwZWNpZmllZCBhcnJheSBzdGFydGluZyBhdCAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGluZGV4IG9mZnNldC4gCisgICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZG91YmxlcyBmcm9tIHRoZSBzdHJlYW0sIGFuZCBzdG9yZXMgdGhlCisgICAgICogcmVzdWx0IGludG8gdGhlIHNwZWNpZmllZCBhcnJheSBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mZnNldC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZCB0aGUgZG91YmxlIGFycmF5LgotICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldC4KLSAgICAgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgZG91YmxlcyB0byBiZSByZWFkLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBkCisgICAgICogICAgICAgICAgICB0aGUgZG91YmxlIGFycmF5LgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQuCisgICAgICogQHBhcmFtIGxlbgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBkb3VibGVzIHRvIGJlIHJlYWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgcmVhZEZ1bGx5KGRvdWJsZVtdIGQsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKIApAQCAtMzI4LDggKzMzOSw4IEBACiAgICAgICogR2V0cyB0aGUgc3RyZWFtIHBvc2l0aW9uLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHN0cmVhbSBwb3NpdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgbG9uZyBnZXRTdHJlYW1Qb3NpdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbjsKIApAQCAtMzM3LDE3ICszNDgsMTggQEAKICAgICAgKiBHZXRzIHRoZSBiaXQgb2Zmc2V0LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGJpdCBvZmZzZXQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIGludCBnZXRCaXRPZmZzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBiaXQgb2Zmc2V0IHRvIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA3LiAKKyAgICAgKiBTZXRzIHRoZSBiaXQgb2Zmc2V0IHRvIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA3LgogICAgICAqIAotICAgICAqIEBwYXJhbSBiaXRPZmZzZXQgdGhlIGJpdCBvZmZzZXQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGJpdE9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIGJpdCBvZmZzZXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgc2V0Qml0T2Zmc2V0KGludCBiaXRPZmZzZXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKIApAQCAtMzU1LDkwICszNjcsOTQgQEAKICAgICAgKiBSZWFkcyBhIGJpdCBmcm9tIHRoZSBzdHJlYW0gYW5kIHJldHVybnMgdGhlIHZhbHVlIDAgb3IgMS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiBzaW5nbGUgYml0OiAwIG9yIDEuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIGludCByZWFkQml0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogUmVhZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzIGFuZCByZXR1cm5zIHRoZWlyIHZhbHVlcyBhcyBsb25nLgogICAgICAqIAotICAgICAqIEBwYXJhbSBudW1CaXRzIHRoZSBudW1iZXIgb2YgYml0cyB0byBiZSByZWFkLgotICAgICAqIAorICAgICAqIEBwYXJhbSBudW1CaXRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gYmUgcmVhZC4KICAgICAgKiBAcmV0dXJuIHRoZSBiaXQgc3RyaW5nIGFzIGEgbG9uZy4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgbG9uZyByZWFkQml0cyhpbnQgbnVtQml0cykgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJlYW0uIAotICAgICAqICAKLSAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmVhbSwgb3IgLTEgaWYgdW5rbm93bi4gCisgICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJlYW0sIG9yIC0xIGlmIHVua25vd24uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIGxvbmcgbGVuZ3RoKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2tpcGVzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGJ5IG1vdmluZyBzdHJlYW0gcG9zaXRpb24uIAorICAgICAqIFNraXBzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGJ5IG1vdmluZyBzdHJlYW0gcG9zaXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIG4gdGhlIG51bWJlciBvZiBieXRlcy4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gbgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcy4KICAgICAgKiBAcmV0dXJuIHRoZSBhY3R1YWwgc2tpcHBlZCBudW1iZXIgb2YgYnl0ZXMuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIGludCBza2lwQnl0ZXMoaW50IG4pIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNraXBlcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBieSBtb3Zpbmcgc3RyZWFtIHBvc2l0aW9uLiAKKyAgICAgKiBTa2lwcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBieSBtb3Zpbmcgc3RyZWFtIHBvc2l0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuIHRoZSBudW1iZXIgb2YgYnl0ZXMuCi0gICAgICogCisgICAgICogQHBhcmFtIG4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMuCiAgICAgICogQHJldHVybiB0aGUgYWN0dWFsIHNraXBwZWQgbnVtYmVyIG9mIGJ5dGVzLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBsb25nIHNraXBCeXRlcyhsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9uIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uIAorICAgICAqIFNldHMgdGhlIGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9uIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHBvcyBhIGZpbGUgcG9pbnRlciBwb3NpdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gcG9zCisgICAgICogICAgICAgICAgICBhIGZpbGUgcG9pbnRlciBwb3NpdGlvbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCBzZWVrKGxvbmcgcG9zKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBNYXJrcyBhIHBvc2l0aW9uIGluIHRoZSBzdHJlYW0gdG8gYmUgcmV0dXJuZWQgdG8gYnkgYSBzdWJzZXF1ZW50IAotICAgICAqIGNhbGwgdG8gcmVzZXQuIAorICAgICAqIE1hcmtzIGEgcG9zaXRpb24gaW4gdGhlIHN0cmVhbSB0byBiZSByZXR1cm5lZCB0byBieSBhIHN1YnNlcXVlbnQgY2FsbCB0bworICAgICAqIHJlc2V0LgogICAgICAqLwogICAgIHZvaWQgbWFyaygpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgZmlsZSBwb2ludGVyIHRvIGl0cyBwcmV2aW91cyBwb3NpdGlvbi4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEZsdXNoZXMgdGhlIGluaXRpYWwgcG9zaXRpb24gaW4gdGhpcyBzdHJlYW0gcHJpb3IgdG8gdGhlCi0gICAgICogc3BlY2lmaWVkIHN0cmVhbSBwb3NpdGlvbi4KKyAgICAgKiBGbHVzaGVzIHRoZSBpbml0aWFsIHBvc2l0aW9uIGluIHRoaXMgc3RyZWFtIHByaW9yIHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtCisgICAgICogcG9zaXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHBvcyB0aGUgcG9zaXRpb24uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIHBvcworICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIGZsdXNoQmVmb3JlKGxvbmcgcG9zKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBGbHVzaGVzIHRoZSBpbml0aWFsIHBvc2l0aW9uIGluIHRoaXMgc3RyZWFtIHByaW9yIHRvIHRoZQotICAgICAqIGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9uLgorICAgICAqIEZsdXNoZXMgdGhlIGluaXRpYWwgcG9zaXRpb24gaW4gdGhpcyBzdHJlYW0gcHJpb3IgdG8gdGhlIGN1cnJlbnQgc3RyZWFtCisgICAgICogcG9zaXRpb24uCiAgICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKQEAgLTQ1MCwzNiArNDY2LDM3IEBACiAgICAgbG9uZyBnZXRGbHVzaGVkUG9zaXRpb24oKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIEltYWdlSW5wdXRTdHJlYW0gY2FjaGVzIGRhdGEgaW4gb3JkZXIgCi0gICAgICogdG8gYWxsb3cgc2Vla2luZyBiYWNrd2FyZHMuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgSW1hZ2VJbnB1dFN0cmVhbSBjYWNoZXMgZGF0YSBpbiBvcmRlciB0byBhbGxvdworICAgICAqIHNlZWtpbmcgYmFja3dhcmRzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIEltYWdlSW5wdXRTdHJlYW0gY2FjaGVzIGRhdGEgaW4gb3JkZXIgCi0gICAgICogdG8gYWxsb3cgc2Vla2luZyBiYWNrd2FyZHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgSW1hZ2VJbnB1dFN0cmVhbSBjYWNoZXMgZGF0YSBpbiBvcmRlciB0byBhbGxvdworICAgICAqICAgICAgICAgc2Vla2luZyBiYWNrd2FyZHMsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBib29sZWFuIGlzQ2FjaGVkKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBJbWFnZUlucHV0U3RyZWFtIGNhY2hlcyBkYXRhIGluIG9yZGVyIAotICAgICAqIHRvIGFsbG93IHNlZWtpbmcgYmFja3dhcmRzLCBhbmQga2VlcHMgaXQgaW4gbWVtb3J5LgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIEltYWdlSW5wdXRTdHJlYW0gY2FjaGVzIGRhdGEgaW4gb3JkZXIgdG8gYWxsb3cKKyAgICAgKiBzZWVraW5nIGJhY2t3YXJkcywgYW5kIGtlZXBzIGl0IGluIG1lbW9yeS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBJbWFnZUlucHV0U3RyZWFtIGNhY2hlcyBkYXRhIGluIG9yZGVyIAotICAgICAqIHRvIGFsbG93IHNlZWtpbmcgYmFja3dhcmRzLCBhbmQga2VlcHMgaXQgaW4gbWVtb3J5LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBJbWFnZUlucHV0U3RyZWFtIGNhY2hlcyBkYXRhIGluIG9yZGVyIHRvIGFsbG93CisgICAgICogICAgICAgICBzZWVraW5nIGJhY2t3YXJkcywgYW5kIGtlZXBzIGl0IGluIG1lbW9yeS4KICAgICAgKi8KICAgICBib29sZWFuIGlzQ2FjaGVkTWVtb3J5KCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBJbWFnZUlucHV0U3RyZWFtIGNhY2hlcyBkYXRhIGluIG9yZGVyIAotICAgICAqIHRvIGFsbG93IHNlZWtpbmcgYmFja3dhcmRzLCBhbmQga2VlcHMgaXQgaW4gYSB0ZW1wb3JhcnkgZmlsZS4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBJbWFnZUlucHV0U3RyZWFtIGNhY2hlcyBkYXRhIGluIG9yZGVyIHRvIGFsbG93CisgICAgICogc2Vla2luZyBiYWNrd2FyZHMsIGFuZCBrZWVwcyBpdCBpbiBhIHRlbXBvcmFyeSBmaWxlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIEltYWdlSW5wdXRTdHJlYW0gY2FjaGVzIGRhdGEgaW4gb3JkZXIgCi0gICAgICogdG8gYWxsb3cgc2Vla2luZyBiYWNrd2FyZHMsIGFuZCBrZWVwcyBpdCBpbiBhIHRlbXBvcmFyeSBmaWxlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBJbWFnZUlucHV0U3RyZWFtIGNhY2hlcyBkYXRhIGluIG9yZGVyIHRvIGFsbG93CisgICAgICogICAgICAgICBzZWVraW5nIGJhY2t3YXJkcywgYW5kIGtlZXBzIGl0IGluIGEgdGVtcG9yYXJ5IGZpbGUuCiAgICAgICovCiAgICAgYm9vbGVhbiBpc0NhY2hlZEZpbGUoKTsKIAogICAgIC8qKgogICAgICAqIENsb3NlcyB0aGlzIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9JbWFnZUlucHV0U3RyZWFtSW1wbC5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ltYWdlSW5wdXRTdHJlYW1JbXBsLmphdmEKaW5kZXggODNhYzEzYS4uZDc5ZGE0MSAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ltYWdlSW5wdXRTdHJlYW1JbXBsLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ltYWdlSW5wdXRTdHJlYW1JbXBsLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW8uc3RyZWFtOwogCiBpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CkBAIC0yNSwzOCArMjYsNTQgQEAKIGltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7CiAKIC8qKgotICogVGhlIEltYWdlSW5wdXRTdHJlYW1JbXBsIGFic3RyYWN0IGNsYXNzIGltcGxlbWVudHMKLSAqIHRoZSBJbWFnZUlucHV0U3RyZWFtIGludGVyZmFjZS4KKyAqIFRoZSBJbWFnZUlucHV0U3RyZWFtSW1wbCBhYnN0cmFjdCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBJbWFnZUlucHV0U3RyZWFtCisgKiBpbnRlcmZhY2UuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW1hZ2VJbnB1dFN0cmVhbUltcGwgaW1wbGVtZW50cyBJbWFnZUlucHV0U3RyZWFtIHsKIAotICAgIC8qKiBUaGUgYnl0ZSBvcmRlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgYnl0ZSBvcmRlci4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgQnl0ZU9yZGVyIGJ5dGVPcmRlciA9IEJ5dGVPcmRlci5CSUdfRU5ESUFOOwogCi0gICAgLyoqIFRoZSBzdHJlYW0gcG9zaXRpb24uICovCisgICAgLyoqCisgICAgICogVGhlIHN0cmVhbSBwb3NpdGlvbi4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgbG9uZyBzdHJlYW1Qb3MgPSAwOwotICAgIAotICAgIC8qKiBUaGUgZmx1c2hlZCBwb3NpdGlvbi4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBmbHVzaGVkIHBvc2l0aW9uLgorICAgICAqLwogICAgIHByb3RlY3RlZCBsb25nIGZsdXNoZWRQb3MgPSAwOwotICAgIAotICAgIC8qKiBUaGUgYml0IG9mZnNldC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBiaXQgb2Zmc2V0LgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgYml0T2Zmc2V0ID0gMDsKIAotICAgIC8qKiBUaGUgY2xvc2VkLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjbG9zZWQuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOwogCi0gICAgLyoqIFRoZSBwb3NpdGlvbiBzdGFjay4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcG9zaXRpb24gc3RhY2suCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBQb3NpdGlvblN0YWNrIHBvc1N0YWNrID0gbmV3IFBvc2l0aW9uU3RhY2soKTsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbWFnZUlucHV0U3RyZWFtSW1wbC4KICAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VJbnB1dFN0cmVhbUltcGwoKSB7fQorICAgIHB1YmxpYyBJbWFnZUlucHV0U3RyZWFtSW1wbCgpIHsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBDaGVjayBpZiB0aGUgc3RyZWFtIGlzIGNsb3NlZCBhbmQgaWYgdHJ1ZSwgdGhyb3dzIGFuIElPRXhjZXB0aW9uLgogICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IHRoZSBzdHJlYW0gaXMgY2xvc2VkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3RyZWFtIGlzIGNsb3NlZC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBjaGVja0Nsb3NlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChjbG9zZWQpIHsKQEAgLTEwNiw3ICsxMjMsNyBAQAogICAgICAgICBpZiAoYiA8IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oIkVPRiByZWFjaGVkIik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChieXRlKSBiOworICAgICAgICByZXR1cm4gKGJ5dGUpYjsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IHJlYWRVbnNpZ25lZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTI1LDU4ICsxNDIsNTcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oIkVPRiByZWFjaGVkIik7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gYnl0ZU9yZGVyID09IEJ5dGVPcmRlci5CSUdfRU5ESUFOID8KLSAgICAgICAgICAgICAgICAoc2hvcnQpICgoYjEgPDwgOCkgfCAoYjIgJiAweGZmKSkgOgotICAgICAgICAgICAgICAgIChzaG9ydCkgKChiMiA8PCA4KSB8IChiMSAmIDB4ZmYpKTsKKyAgICAgICAgcmV0dXJuIGJ5dGVPcmRlciA9PSBCeXRlT3JkZXIuQklHX0VORElBTiA/IChzaG9ydCkoKGIxIDw8IDgpIHwgKGIyICYgMHhmZikpCisgICAgICAgICAgICAgICAgOiAoc2hvcnQpKChiMiA8PCA4KSB8IChiMSAmIDB4ZmYpKTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IHJlYWRVbnNpZ25lZFNob3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgY2hhciByZWFkQ2hhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgcHVibGljIGludCByZWFkSW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgbG9uZyByZWFkVW5zaWduZWRJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIHB1YmxpYyBsb25nIHJlYWRMb25nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgZmxvYXQgcmVhZEZsb2F0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgZG91YmxlIHJlYWREb3VibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmcgcmVhZExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmcgcmVhZFVURigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVhZEZ1bGx5KGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIApAQCAtMTg1LDMyICsyMDEsMzIgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZWFkRnVsbHkoc2hvcnRbXSBzLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlYWRGdWxseShjaGFyW10gYywgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZWFkRnVsbHkoaW50W10gaSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZWFkRnVsbHkobG9uZ1tdIGwsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVhZEZ1bGx5KGZsb2F0W10gZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZWFkRnVsbHkoZG91YmxlW10gZCwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKQEAgLTIzMCwxMiArMjQ2LDEyIEBACiAgICAgfQogCiAgICAgcHVibGljIGludCByZWFkQml0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgbG9uZyByZWFkQml0cyhpbnQgbnVtQml0cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKQEAgLTI0NCwxMiArMjYwLDEyIEBACiAgICAgfQogCiAgICAgcHVibGljIGludCBza2lwQnl0ZXMoaW50IG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgcHVibGljIGxvbmcgc2tpcEJ5dGVzKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKQEAgLTI3Miw3ICsyODgsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGJpdCBwb3MKKyAgICAgICAgLy8gLS0gVE9ETyBiaXQgcG9zCiAgICAgICAgIGlmICghcG9zU3RhY2suaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBsb25nIHAgPSBwb3NTdGFjay5wb3AoKTsKICAgICAgICAgICAgIGlmIChwIDwgZmx1c2hlZFBvcykgewpAQCAtMjkwLDcgKzMwNiw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiVHJ5aW5nIHRvIGZsdXNoIHdpdGhpbiBhbHJlYWR5IGZsdXNoZWQgcG9ydGlvbiIpOwogICAgICAgICB9CiAgICAgICAgIGZsdXNoZWRQb3MgPSBwb3M7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0zMDIsMTUgKzMxOCwxNSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGlzQ2FjaGVkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7IC8vZGVmCisgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZGVmCiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaXNDYWNoZWRNZW1vcnkoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsgLy9kZWYKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBkZWYKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhY2hlZEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsgLy9kZWYKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBkZWYKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0zMjIsNyArMzM4LDggQEAKICAgICAvKioKICAgICAgKiBGaW5hbGl6ZXMgdGhpcyBvYmplY3QuCiAgICAgICogCi0gICAgICogQHRocm93cyBUaHJvd2FibGUgaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CkBAIC0zMzksMjUgKzM1NiwzMSBAQAogICAgICAqIFRoZSBDbGFzcyBQb3NpdGlvblN0YWNrLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBvc2l0aW9uU3RhY2sgewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBDb25zdGFudCBTSVpFLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgQ29uc3RhbnQgU0laRS4KKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFID0gMTA7CiAKLSAgICAgICAgLyoqIFRoZSB2YWx1ZXMuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdmFsdWVzLgorICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBsb25nW10gdmFsdWVzID0gbmV3IGxvbmdbU0laRV07Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHBvcy4gKi8KLSAgICAgICAgcHJpdmF0ZSBpbnQgcG9zID0gMDsKIAorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBvcy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgaW50IHBvcyA9IDA7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFB1c2guCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gdiB0aGUgdgorICAgICAgICAgKiBAcGFyYW0gdgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB2LgogICAgICAgICAgKi8KICAgICAgICAgdm9pZCBwdXNoKGxvbmcgdikgewogICAgICAgICAgICAgaWYgKHBvcyA+PSB2YWx1ZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgZW5zdXJlKHBvcysxKTsKKyAgICAgICAgICAgICAgICBlbnN1cmUocG9zICsgMSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB2YWx1ZXNbcG9zKytdID0gdjsKICAgICAgICAgfQpAQCAtMzY1LDcgKzM4OCw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBQb3AuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBsb25nCisgICAgICAgICAqIEByZXR1cm4gdGhlIGxvbmcuCiAgICAgICAgICAqLwogICAgICAgICBsb25nIHBvcCgpIHsKICAgICAgICAgICAgIHJldHVybiB2YWx1ZXNbLS1wb3NdOwpAQCAtMzc0LDcgKzM5Nyw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDaGVja3MgaWYgaXMgZW1wdHkuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGVtcHR5CisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgZW1wdHkuCiAgICAgICAgICAqLwogICAgICAgICBib29sZWFuIGlzRW1wdHkoKSB7CiAgICAgICAgICAgICByZXR1cm4gcG9zID09IDA7CkBAIC0zODMsNyArNDA2LDggQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEVuc3VyZS4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplCisgICAgICAgICAqIEBwYXJhbSBzaXplCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHNpemUuCiAgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIHZvaWQgZW5zdXJlKGludCBzaXplKSB7CiAgICAgICAgICAgICBsb25nW10gYXJyID0gbmV3IGxvbmdbTWF0aC5tYXgoMiAqIHZhbHVlcy5sZW5ndGgsIHNpemUpXTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9JbWFnZU91dHB1dFN0cmVhbS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ltYWdlT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggZTU5YjY5ZC4uMjhlYzkzMiAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ltYWdlT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ltYWdlT3V0cHV0U3RyZWFtLmphdmEKQEAgLTE4LDI1MiArMTgsMjg5IEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvLnN0cmVhbTsKIAogaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dDsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiAvKioKLSAqIFRoZSBJbWFnZU91dHB1dFN0cmVhbSByZXByZXNlbnRzIG91dHB1dCBzdHJlYW0gaW50ZXJmYWNlIHRoYXQgaXMgCi0gKiB1c2VkIGJ5IEltYWdlV3JpdGVycy4KKyAqIFRoZSBJbWFnZU91dHB1dFN0cmVhbSByZXByZXNlbnRzIG91dHB1dCBzdHJlYW0gaW50ZXJmYWNlIHRoYXQgaXMgdXNlZCBieQorICogSW1hZ2VXcml0ZXJzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJbWFnZU91dHB1dFN0cmVhbSBleHRlbmRzIERhdGFPdXRwdXQsIEltYWdlSW5wdXRTdHJlYW0gewogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgc2luZ2xlIGJ5dGUgdG8gdGhlIHN0cmVhbSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4gCisgICAgICogV3JpdGVzIGEgc2luZ2xlIGJ5dGUgdG8gdGhlIHN0cmVhbSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYiB0aGUgaW50IHZhbHVlLCBvZiB3aGljaCB0aGUgOCBsb3dlc3QgYml0cyAKLSAgICAgKiB3aWxsIGJlIHdyaXR0ZW4uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIHZhbHVlLCBvZiB3aGljaCB0aGUgOCBsb3dlc3QgYml0cyB3aWxsIGJlIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFdyaXRlcyB0aGUgYnl0ZXMgYXJyYXkgdG8gdGhlIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYiB0aGUgYnl0ZSBhcnJheSB0byBiZSB3cml0dGVuLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSB0byBiZSB3cml0dGVuLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIHdyaXRlKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJ5dGUgYXJyYXkKLSAgICAgKiBiZWdnaW5pbmcgZnJvbSB0aGUgc3BlY2lmaWVkIG9mZnNldC4KKyAgICAgKiBXcml0ZXMgYSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJ5dGUgYXJyYXkgYmVnaW5uaW5nIGZyb20gdGhlCisgICAgICogc3BlY2lmaWVkIG9mZnNldC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYiB0aGUgYnl0ZSBhcnJheS4KLSAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmZzZXQuCi0gICAgICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5LgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQuCisgICAgICogQHBhcmFtIGxlbgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBib29sZWFuIHZhbHVlIHRvIHRoZSBzdHJlYW0sIDEgaWYgaXQgaXMgdHJ1ZSwKLSAgICAgKiAwIGlmIGl0IGlzIGZhbHNlLgorICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIGJvb2xlYW4gdmFsdWUgdG8gdGhlIHN0cmVhbSwgMSBpZiBpdCBpcyB0cnVlLCAwIGlmCisgICAgICogaXQgaXMgZmFsc2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGIgdGhlIGJvb2xlYW4gdmFsdWUgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJvb2xlYW4gdmFsdWUgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZUJvb2xlYW4oYm9vbGVhbiBiKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIDggbG93ZXN0IGJpdHMgb2YgdGhlIHNwZWNpZmllZCBpbnQgdmFsdWUgdG8gdGhlIHN0cmVhbS4gCisgICAgICogV3JpdGVzIHRoZSA4IGxvd2VzdCBiaXRzIG9mIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZSB0byB0aGUgc3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBiIHRoZSBzcGVjaWZpZWQgaW50IHZhbHVlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgd3JpdGVCeXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBzaG9ydCB2YWx1ZSB0byB0aGUgb3V0cHV0IHN0cmVhbS4gCisgICAgICogV3JpdGVzIGEgc2hvcnQgdmFsdWUgdG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHYgdGhlIHNob3J0IHZhbHVlIHRvIGJlIHdyaXR0ZW4uIAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSB2CisgICAgICogICAgICAgICAgICB0aGUgc2hvcnQgdmFsdWUgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZVNob3J0KGludCB2KSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIDE2IGxvd2VzdCBiaXRzIG9mIHRoZSBzcGVjaWZpZWQgaW50IHZhbHVlIHRvIHRoZSBzdHJlYW0uCisgICAgICogV3JpdGVzIHRoZSAxNiBsb3dlc3QgYml0cyBvZiB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUgdG8gdGhlIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdiB0aGUgc3BlY2lmaWVkIGludCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gdgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIHdyaXRlQ2hhcihpbnQgdikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGFuIGludGVnZXIgdmFsdWUgdG8gdGhlIG91dHB1dCBzdHJlYW0uIAorICAgICAqIFdyaXRlcyBhbiBpbnRlZ2VyIHZhbHVlIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSB2IHRoZSBpbnRlZ2VyIHZhbHVlIHRvIGJlIHdyaXR0ZW4uIAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSB2CisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciB2YWx1ZSB0byBiZSB3cml0dGVuLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIHdyaXRlSW50KGludCB2KSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBXcml0ZSBsb25nLgogICAgICAqIAotICAgICAqIEBwYXJhbSB2IHRoZSBsb25nIHZhbHVlCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIHYKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIHZhbHVlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIHdyaXRlTG9uZyhsb25nIHYpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIGZsb2F0IHZhbHVlIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiAKKyAgICAgKiBXcml0ZXMgYSBmbG9hdCB2YWx1ZSB0byB0aGUgb3V0cHV0IHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdiB0aGUgZmxvYXQgd2hpY2ggY29udGFpbnMgdmFsdWUgdG8gYmUgd3JpdHRlbi4gCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIHYKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCB3aGljaCBjb250YWlucyB2YWx1ZSB0byBiZSB3cml0dGVuLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIHdyaXRlRmxvYXQoZmxvYXQgdikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgZG91YmxlIHZhbHVlIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiAKKyAgICAgKiBXcml0ZXMgYSBkb3VibGUgdmFsdWUgdG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHYgdGhlIGRvdWJsZSB3aGljaCBjb250YWlucyB2YWx1ZSB0byBiZSB3cml0dGVuLiAKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gdgorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB3aGljaCBjb250YWlucyB2YWx1ZSB0byBiZSB3cml0dGVuLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSB2KSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyB0aGUgc3RyaW5nIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZUJ5dGVzKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBTdHJpbmcgdG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIFN0cmluZyB0byBiZSB3cml0dGVuLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgd3JpdGVDaGFycyhTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIDIgYnl0ZXMgdG8gdGhlIG91dHB1dCBzdHJlYW0gaW4gCi0gICAgICogdGhlIG1vZGlmaWVkIFVURi04ICByZXByZXNlbnRhdGlvbiBvZiBldmVyeSBjaGFyYWN0ZXIgb2YKLSAgICAgKiB0aGUgc3BlY2lmaWVkIHN0cmluZy4gICAgICAKKyAgICAgKiBXcml0ZXMgMiBieXRlcyB0byB0aGUgb3V0cHV0IHN0cmVhbSBpbiB0aGUgbW9kaWZpZWQgVVRGLTggcmVwcmVzZW50YXRpb24KKyAgICAgKiBvZiBldmVyeSBjaGFyYWN0ZXIgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcuCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZVVURihTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRmx1c2hlcyB0aGUgaW5pdGlhbCBwb3NpdGlvbiBpbiB0aGlzIHN0cmVhbSBwcmlvciB0byB0aGUKLSAgICAgKiBzcGVjaWZpZWQgc3RyZWFtIHBvc2l0aW9uLgorICAgICAqIEZsdXNoZXMgdGhlIGluaXRpYWwgcG9zaXRpb24gaW4gdGhpcyBzdHJlYW0gcHJpb3IgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0KKyAgICAgKiBwb3NpdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gcG9zCisgICAgICogICAgICAgICAgICB0aGUgcG9zaXRpb24uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgZmx1c2hCZWZvcmUobG9uZyBwb3MpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAotCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgbGVuIG51bWJlciBvZiBzaG9ydCB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5Ci0gICAgICogdG8gdGhlIHN0cmVhbS4KKyAgICAgKiBXcml0ZXMgYSBsZW4gbnVtYmVyIG9mIHNob3J0IHZhbHVlcyBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgdG8gdGhlCisgICAgICogc3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSBzaG9ydHMgYXJyYXkgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmZzZXQgaW4gdGhlIGNoYXIgYXJyYXkuCi0gICAgICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIGNoYXJzIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaG9ydHMgYXJyYXkgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBjaGFyIGFycmF5LgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgY2hhcnMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZVNob3J0cyhzaG9ydFtdIHMsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFdyaXRlcyBhIGxlbiBudW1iZXIgb2YgY2hhcnMgdG8gdGhlIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYyB0aGUgY2hhciBhcnJheSB0byBiZSB3cml0dGVuLgotICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldCBpbiB0aGUgY2hhciBhcnJheS4KLSAgICAgKiBAcGFyYW0gbGVuIHRoZSBsZW5ndGggb2YgY2hhcnMgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIGNoYXIgYXJyYXkgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBjaGFyIGFycmF5LgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgY2hhcnMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZUNoYXJzKGNoYXJbXSBjLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBsZW4gbnVtYmVyIG9mIGludCB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5Ci0gICAgICogdG8gdGhlIHN0cmVhbS4KKyAgICAgKiBXcml0ZXMgYSBsZW4gbnVtYmVyIG9mIGludGVnZXIgdmFsdWVzIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSB0byB0aGUKKyAgICAgKiBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGkgdGhlIGludCBhcnJheSB0byBiZSB3cml0dGVuLgotICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldCBpbiB0aGUgY2hhciBhcnJheS4KLSAgICAgKiBAcGFyYW0gbGVuIHRoZSBsZW5ndGggb2YgY2hhcnMgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gaQorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgYXJyYXkgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBjaGFyIGFycmF5LgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgY2hhcnMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZUludHMoaW50W10gaSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgbGVuIG51bWJlciBvZiBsb25nIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkKLSAgICAgKiB0byB0aGUgc3RyZWFtLgorICAgICAqIFdyaXRlcyBhIGxlbiBudW1iZXIgb2YgbG9uZyB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IHRvIHRoZQorICAgICAqIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgbG9uZyBhcnJheSB0byBiZSB3cml0dGVuLgotICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldCBpbiB0aGUgY2hhciBhcnJheS4KLSAgICAgKiBAcGFyYW0gbGVuIHRoZSBsZW5ndGggb2YgY2hhcnMgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgYXJyYXkgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBjaGFyIGFycmF5LgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgY2hhcnMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZUxvbmdzKGxvbmdbXSBsLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBsZW4gbnVtYmVyIG9mIGZsb2F0IHZhbHVlcyBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkKLSAgICAgKiB0byB0aGUgc3RyZWFtLgorICAgICAqIFdyaXRlcyBhIGxlbiBudW1iZXIgb2YgZmxvYXQgdmFsdWVzIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSB0byB0aGUKKyAgICAgKiBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGYgdGhlIGZsb2F0IGFycmF5IHRvIGJlIHdyaXR0ZW4uCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0IGluIHRoZSBjaGFyIGFycmF5LgotICAgICAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiBjaGFycyB0byBiZSB3cml0dGVuLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBmCisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgYXJyYXkgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBjaGFyIGFycmF5LgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgY2hhcnMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZUZsb2F0cyhmbG9hdFtdIGYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIGxlbiBudW1iZXIgb2YgZG91YmxlIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkKLSAgICAgKiB0byB0aGUgc3RyZWFtLgorICAgICAqIFdyaXRlcyBhIGxlbiBudW1iZXIgb2YgZG91YmxlIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgdG8gdGhlCisgICAgICogc3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkIHRoZSBkb3VibGUgYXJyYXkgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmZzZXQgaW4gdGhlIGNoYXIgYXJyYXkuCi0gICAgICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIGNoYXJzIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGQKKyAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgYXJyYXkgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBjaGFyIGFycmF5LgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgY2hhcnMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZURvdWJsZXMoZG91YmxlW10gZCwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogV3JpdGVzIGEgc2luZ2xlIGJpdCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYml0IHRoZSBhbiBpbnQgd2hvc2UgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGlzIHRvIGJlIAotICAgICAqIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gYml0CisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciB3aG9zZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgaXMgdG8gYmUgd3JpdHRlbiB0bworICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZUJpdChpbnQgYml0KSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBzZXF1ZW5jZSBvZiBiaXRzIGJlZ2dpbmluZyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAqIFdyaXRlcyBhIHNlcXVlbmNlIG9mIGJpdHMgYmVnaW5uaW5nIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIGJpdHMgYSBsb25nIHZhbHVlIGNvbnRhaW5pbmcgdGhlIGJpdHMgdG8gYmUgd3JpdHRlbiwKLSAgICAgKiBzdGFydGluZyB3aXRoIHRoZSBiaXQgaW4gcG9zaXRpb24gbnVtQml0cyAtIDEgZG93biB0byB0aGUgCi0gICAgICogbGVhc3Qgc2lnbmlmaWNhbnQgYml0LgotICAgICAqIEBwYXJhbSBudW1CaXRzIHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYml0ICwgCi0gICAgICogaXQgY2FuIGJlIGJldHdlZW4gMCBhbmQgNjQuIAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBiaXRzCisgICAgICogICAgICAgICAgICB0aGUgbG9uZyB2YWx1ZSBjb250YWluaW5nIHRoZSBiaXRzIHRvIGJlIHdyaXR0ZW4sIHN0YXJ0aW5nCisgICAgICogICAgICAgICAgICB3aXRoIHRoZSBiaXQgaW4gcG9zaXRpb24gbnVtQml0cyAtIDEgZG93biB0byB0aGUgbGVhc3QKKyAgICAgKiAgICAgICAgICAgIHNpZ25pZmljYW50IGJpdC4KKyAgICAgKiBAcGFyYW0gbnVtQml0cworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXQsIGl0IGNhbiBiZSBiZXR3ZWVuIDAgYW5kIDY0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIHdyaXRlQml0cyhsb25nIGJpdHMsIGludCBudW1CaXRzKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9JbWFnZU91dHB1dFN0cmVhbUltcGwuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9JbWFnZU91dHB1dFN0cmVhbUltcGwuamF2YQppbmRleCBjM2Q4MGZhLi4wZmVmNzhmIDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vSW1hZ2VPdXRwdXRTdHJlYW1JbXBsLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ltYWdlT3V0cHV0U3RyZWFtSW1wbC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvLnN0cmVhbTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0yOSwxNiArMzAsMTkgQEAKICAqLwogCiAvKioKLSAqIFRoZSBJbWFnZU91dHB1dFN0cmVhbUltcGwgYWJzdHJhY3QgY2xhc3MgaW1wbGVtZW50cwotICogdGhlIEltYWdlT3V0cHV0U3RyZWFtIGludGVyZmFjZS4KKyAqIFRoZSBJbWFnZU91dHB1dFN0cmVhbUltcGwgYWJzdHJhY3QgY2xhc3MgaW1wbGVtZW50cyB0aGUgSW1hZ2VPdXRwdXRTdHJlYW0KKyAqIGludGVyZmFjZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbWFnZU91dHB1dFN0cmVhbUltcGwgZXh0ZW5kcyBJbWFnZUlucHV0U3RyZWFtSW1wbAotICAgICAgICBpbXBsZW1lbnRzIEltYWdlT3V0cHV0U3RyZWFtIHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbWFnZU91dHB1dFN0cmVhbUltcGwgZXh0ZW5kcyBJbWFnZUlucHV0U3RyZWFtSW1wbCBpbXBsZW1lbnRzCisgICAgICAgIEltYWdlT3V0cHV0U3RyZWFtIHsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbWFnZU91dHB1dFN0cmVhbUltcGwuCiAgICAgICovCi0gICAgcHVibGljIEltYWdlT3V0cHV0U3RyZWFtSW1wbCgpIHt9CisgICAgcHVibGljIEltYWdlT3V0cHV0U3RyZWFtSW1wbCgpIHsKKyAgICB9CiAKICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uOwogCkBAIC02Miw3ICs2Niw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAKICAgICAgICAgfQotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIApAQCAtNzYsNyArODAsNyBAQAogICAgICAgICB9IGVsc2UgewogCiAgICAgICAgIH0KLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKQEAgLTg2LDcgKzkwLDcgQEAKICAgICAgICAgfSBlbHNlIHsKIAogICAgICAgICB9Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCkBAIC0xMDgsNjIgKzExMiw2MyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHdyaXRlVVRGKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHdyaXRlU2hvcnRzKHNob3J0W10gcywgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB3cml0ZUNoYXJzKGNoYXJbXSBjLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHdyaXRlSW50cyhpbnRbXSBpLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHdyaXRlTG9uZ3MobG9uZ1tdIGwsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgd3JpdGVGbG9hdHMoZmxvYXRbXSBmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHdyaXRlRG91Ymxlcyhkb3VibGVbXSBkLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHdyaXRlQml0KGludCBiaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgd3JpdGVCaXRzKGxvbmcgYml0cywgaW50IG51bUJpdHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRmx1c2hlcyB0aGUgYml0cy4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbiB0aGUgd3JpdGUKLSAgICAgKiBtZXRob2RzIGJ5IHN1YmNsYXNzZXMuCisgICAgICogRmx1c2hlcyB0aGUgYml0cy4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbiB0aGUgd3JpdGUgbWV0aG9kcyBieQorICAgICAqIHN1YmNsYXNzZXMuCiAgICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGZsdXNoQml0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChiaXRPZmZzZXQgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL01lbW9yeUNhY2hlSW1hZ2VJbnB1dFN0cmVhbS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL01lbW9yeUNhY2hlSW1hZ2VJbnB1dFN0cmVhbS5qYXZhCmluZGV4IGEzZDQ3MGIuLmQ3ZmM3OTEgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9NZW1vcnlDYWNoZUltYWdlSW5wdXRTdHJlYW0uamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vTWVtb3J5Q2FjaGVJbWFnZUlucHV0U3RyZWFtLmphdmEKQEAgLTE1LDcgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0KIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5zdHJlYW07CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkueC5pbWFnZWlvLnN0cmVhbS5SYW5kb21BY2Nlc3NNZW1vcnlDYWNoZTsKQEAgLTI0LDIyICsyMywyOSBAQAogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiAKIC8qKgotICogVGhlIE1lbW9yeUNhY2hlSW1hZ2VJbnB1dFN0cmVhbSBjbGFzcyBpbXBsZW1lbnRzIEltYWdlSW5wdXRTdHJlYW0KLSAqIHVzaW5nIGEgbWVtb3J5IGJ1ZmZlciBmb3IgY2FjaGluZyB0aGUgZGF0YS4KKyAqIFRoZSBNZW1vcnlDYWNoZUltYWdlSW5wdXRTdHJlYW0gY2xhc3MgaW1wbGVtZW50cyBJbWFnZUlucHV0U3RyZWFtIHVzaW5nIGEKKyAqIG1lbW9yeSBidWZmZXIgZm9yIGNhY2hpbmcgdGhlIGRhdGEuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi1wdWJsaWMgY2xhc3MgTWVtb3J5Q2FjaGVJbWFnZUlucHV0U3RyZWFtICBleHRlbmRzIEltYWdlSW5wdXRTdHJlYW1JbXBsIHsKLSAgICAKLSAgICAvKiogVGhlIGlzLiAqLworcHVibGljIGNsYXNzIE1lbW9yeUNhY2hlSW1hZ2VJbnB1dFN0cmVhbSBleHRlbmRzIEltYWdlSW5wdXRTdHJlYW1JbXBsIHsKKworICAgIC8qKgorICAgICAqIFRoZSBpcy4KKyAgICAgKi8KICAgICBwcml2YXRlIElucHV0U3RyZWFtIGlzOwotICAgIAotICAgIC8qKiBUaGUgcmFtYy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSByYW1jLgorICAgICAqLwogICAgIHByaXZhdGUgUmFuZG9tQWNjZXNzTWVtb3J5Q2FjaGUgcmFtYyA9IG5ldyBSYW5kb21BY2Nlc3NNZW1vcnlDYWNoZSgpOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IE1lbW9yeUNhY2hlSW1hZ2VJbnB1dFN0cmVhbQotICAgICAqIHdoaWNoIHJlYWRzIGZyb20gdGhlIHNwZWNpZmllZCBJbnB1dFN0cmVhbS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgTWVtb3J5Q2FjaGVJbWFnZUlucHV0U3RyZWFtIHdoaWNoIHJlYWRzIGZyb20gdGhlCisgICAgICogc3BlY2lmaWVkIElucHV0U3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0gdGhlIElucHV0U3RyZWFtIHRvIGJlIHJlYWQuCisgICAgICogQHBhcmFtIHN0cmVhbQorICAgICAqICAgICAgICAgICAgdGhlIElucHV0U3RyZWFtIHRvIGJlIHJlYWQuCiAgICAgICovCiAgICAgcHVibGljIE1lbW9yeUNhY2hlSW1hZ2VJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBzdHJlYW0pIHsKICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vTWVtb3J5Q2FjaGVJbWFnZU91dHB1dFN0cmVhbS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL01lbW9yeUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0uamF2YQppbmRleCA5NmRlZDQzLi4xZGY0MGEzIDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vTWVtb3J5Q2FjaGVJbWFnZU91dHB1dFN0cmVhbS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9NZW1vcnlDYWNoZUltYWdlT3V0cHV0U3RyZWFtLmphdmEKQEAgLTE1LDcgKzE1LDYgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0KIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5zdHJlYW07CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkueC5pbWFnZWlvLnN0cmVhbS5SYW5kb21BY2Nlc3NNZW1vcnlDYWNoZTsKQEAgLTIzLDI0ICsyMiwzMCBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKLQogLyoqCi0gKiBUaGUgTWVtb3J5Q2FjaGVJbWFnZU91dHB1dFN0cmVhbSBjbGFzcyBpbXBsZW1lbnRzIEltYWdlT3V0cHV0U3RyZWFtCi0gKiB1c2luZyBhIG1lbW9yeSBidWZmZXIgZm9yIGNhY2hpbmcgdGhlIGRhdGEuCisgKiBUaGUgTWVtb3J5Q2FjaGVJbWFnZU91dHB1dFN0cmVhbSBjbGFzcyBpbXBsZW1lbnRzIEltYWdlT3V0cHV0U3RyZWFtIHVzaW5nIGEKKyAqIG1lbW9yeSBidWZmZXIgZm9yIGNhY2hpbmcgdGhlIGRhdGEuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgTWVtb3J5Q2FjaGVJbWFnZU91dHB1dFN0cmVhbSBleHRlbmRzIEltYWdlT3V0cHV0U3RyZWFtSW1wbCB7Ci0gICAgCi0gICAgLyoqIFRoZSBvcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBvcy4KKyAgICAgKi8KICAgICBPdXRwdXRTdHJlYW0gb3M7Ci0gICAgCi0gICAgLyoqIFRoZSByYW1jLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHJhbWMuCisgICAgICovCiAgICAgUmFuZG9tQWNjZXNzTWVtb3J5Q2FjaGUgcmFtYyA9IG5ldyBSYW5kb21BY2Nlc3NNZW1vcnlDYWNoZSgpOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IE1lbW9yeUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0KLSAgICAgKiB3aGljaCB3cml0ZXMgdG8gdGhlIHNwZWNpZmllZCBPdXRwdXRTdHJlYW0uCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IE1lbW9yeUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0gd2hpY2ggd3JpdGVzIHRvIHRoZQorICAgICAqIHNwZWNpZmllZCBPdXRwdXRTdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0cmVhbSB0aGUgT3V0cHV0U3RyZWFtLgorICAgICAqIEBwYXJhbSBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBPdXRwdXRTdHJlYW0uCiAgICAgICovCiAgICAgcHVibGljIE1lbW9yeUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIHN0cmVhbSkgewogICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpIHsKQEAgLTEyNSw2ICsxMzAsNiBAQAogICAgICAgICByYW1jLmdldERhdGEob3MsIG5CeXRlcywgZmx1c2hlZFBvc2l0aW9uKTsKICAgICAgICAgcmFtYy5mcmVlQmVmb3JlKG5ld0ZsdXNoZWRQb3NpdGlvbik7CiAKLSAgICAgICAgb3MuZmx1c2goKTsgICAgICAgIAorICAgICAgICBvcy5mbHVzaCgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9wYWNrYWdlLmh0bWwgYi9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZjUzYzMKLS0tIC9kZXYvbnVsbAorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxib2R5PgorICAgIDxwPgorICAgICAgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgZm9yIGhhbmRsaW5nIGltYWdlcyB3aXRoIGxvdy1sZXZlbCBJL08gb3BlcmF0aW9ucy4gCisgICAgPC9wPgorICBAc2luY2UgQW5kcm9pZCAxLjAKKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYXd0L29yZy9hcGFjaGUvaGFybW9ueS9hd3QvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEgYi9hd3Qvb3JnL2FwYWNoZS9oYXJtb255L2F3dC9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQppbmRleCA5Njc2MmM5Li5jMzQwMzU4IDEwMDY0NAotLS0gYS9hd3Qvb3JnL2FwYWNoZS9oYXJtb255L2F3dC9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQorKysgYi9hd3Qvb3JnL2FwYWNoZS9oYXJtb255L2F3dC9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQpAQCAtNzEsNyArNzEsOSBAQAogICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBtZXNzYWdlIGZvciB0aGF0IGtleSBpbiB0aGUgc3lzdGVtIG1lc3NhZ2UgYnVuZGxlLgogICAgICAqLwogICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbXNnKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICByZXR1cm4gTXNnSGVscC5nZXRTdHJpbmcobXNnKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KIAogICAgIC8qKgpAQCAtMTM4LDYgKzE0MCwxMiBAQAogICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBtZXNzYWdlIGZvciB0aGF0IGtleSBpbiB0aGUgc3lzdGVtIG1lc3NhZ2UgYnVuZGxlLgogICAgICAqLwogICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbXNnLCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtY2hhbmdlZAogICAgICAgICByZXR1cm4gTXNnSGVscC5nZXRTdHJpbmcobXNnLCBhcmdzKTsKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtY2hhbmdlZAogICAgIH0KKworICAgIC8vIEJFR0lOIGFuZHJvaWQtbm90ZQorICAgIC8vIER1cGxpY2F0ZSBjb2RlIHdhcyBkcm9wcGVkIGluIGZhdm9yIG9mIHVzaW5nIE1zZ0hlbHAuCisgICAgLy8gRU5EIGFuZHJvaWQtbm90ZQogfQpkaWZmIC0tZ2l0IGEvYXd0L29yZy9hcGFjaGUvaGFybW9ueS9iZWFucy9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YSBiL2F3dC9vcmcvYXBhY2hlL2hhcm1vbnkvYmVhbnMvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKaW5kZXggNzI3Yzc1Ny4uNTFlODE2OCAxMDA2NDQKLS0tIGEvYXd0L29yZy9hcGFjaGUvaGFybW9ueS9iZWFucy9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQorKysgYi9hd3Qvb3JnL2FwYWNoZS9oYXJtb255L2JlYW5zL2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhCkBAIC0zMCw4ICszMCwxNyBAQAogaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmtlcm5lbC52bS5WTTsKLWltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZ0hlbHA7CisvLyBCRUdJTiBhbmRyb2lkLWRlbGV0ZWQKKy8qCisgKiBGb3IgQW5kcm9pZCwgdGhpcyBtb2R1bGUgaXMgYSBzZXBhcmF0ZSBsaWJyYXJ5IGFuZCBub3QgcGFydCBvZiB0aGUKKyAqIGJvb3QgY2xhc3NwYXRoLCBzbyBpdHMgcmVzb3VyY2VzIHdvbid0IGJlIGZvdW5kIG9uIHRoZSBib290IGNsYXNzcGF0aAorICogYXMgaXMgYXNzdW1lZCBieSBNc2dIZWxwLmdldFN0cmluZygpLiBXZSBpbnN0ZWFkIHVzZSBhIGxvY2FsIE1zZ0hlbHAKKyAqIHdoaWNoIGJvdHRvbXMgb3V0IGluIGEgY2FsbCB0byB0aGUgdXNlZnVsIHBhcnQgb2YgaXRzIGxvd2VyLWxldmVsCisgKiBuYW1lc2FrZS4KKyAqLworLy9pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmtlcm5lbC52bS5WTTsKKy8vaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnSGVscDsKKy8vIEVORCBhbmRyb2lkLWRlbGV0ZWQKIAogLyoqCiAgKiBUaGlzIGNsYXNzIHJldHJpZXZlcyBzdHJpbmdzIGZyb20gYSByZXNvdXJjZSBidW5kbGUgYW5kIHJldHVybnMgdGhlbSwKQEAgLTQ5LDggKzU4LDEwIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc1Jlc291cmNlID0KLSAgICAgICAgIm9yZy5hcGFjaGUuaGFybW9ueS5iZWFucy5pbnRlcm5hbC5ubHMubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisgICAgLy8gQkVHSU4gYW5kcm9pZC1kZWxldGVkCisgICAgLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNSZXNvdXJjZSA9CisgICAgLy8gICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuYmVhbnMuaW50ZXJuYWwubmxzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorICAgIC8vIEVORCBhbmRyb2lkLWRlbGV0ZWQKIAogICAgIC8qKgogICAgICAqIFJldHJpZXZlcyBhIG1lc3NhZ2Ugd2hpY2ggaGFzIG5vIGFyZ3VtZW50cy4KQEAgLTYwLDcgKzcxLDkgQEAKICAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgbWVzc2FnZSBmb3IgdGhhdCBrZXkgaW4gdGhlIHN5c3RlbSBtZXNzYWdlIGJ1bmRsZS4KICAgICAgKi8KICAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG1zZykgewotICAgICAgICByZXR1cm4gTXNnSGVscC5nZXRTdHJpbmcoc1Jlc291cmNlLCBtc2cpOworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgcmV0dXJuIE1zZ0hlbHAuZ2V0U3RyaW5nKG1zZyk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKICAgICAvKioKQEAgLTEyNyw2ICsxNDAsMTIgQEAKICAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgbWVzc2FnZSBmb3IgdGhhdCBrZXkgaW4gdGhlIHN5c3RlbSBtZXNzYWdlIGJ1bmRsZS4KICAgICAgKi8KICAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG1zZywgT2JqZWN0W10gYXJncykgewotICAgICAgICByZXR1cm4gTXNnSGVscC5nZXRTdHJpbmcoc1Jlc291cmNlLCBtc2csIGFyZ3MpOworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKKyAgICAgICAgcmV0dXJuIE1zZ0hlbHAuZ2V0U3RyaW5nKG1zZywgYXJncyk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CisKKyAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAvLyBEdXBsaWNhdGUgY29kZSB3YXMgZHJvcHBlZCBpbiBmYXZvciBvZiB1c2luZyBNc2dIZWxwLgorICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKIH0KZGlmZiAtLWdpdCBhL2F3dC9vcmcvYXBhY2hlL2hhcm1vbnkvYmVhbnMvaW50ZXJuYWwvbmxzL01zZ0hlbHAuamF2YSBiL2F3dC9vcmcvYXBhY2hlL2hhcm1vbnkvYmVhbnMvaW50ZXJuYWwvbmxzL01zZ0hlbHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGZhYWJmCi0tLSAvZGV2L251bGwKKysrIGIvYXd0L29yZy9hcGFjaGUvaGFybW9ueS9iZWFucy9pbnRlcm5hbC9ubHMvTXNnSGVscC5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBjbGFzcyBvZiB0aGUgc2FtZSBuYW1lIGluCisgKiBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYXJtb255LmJlYW5zLmludGVybmFsLm5sczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydHlSZXNvdXJjZUJ1bmRsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlciBtZXRob2RzIGZvciBsb2FkaW5nIHJlc291cmNlIGJ1bmRsZXMgYW5kCisgKiBmb3JtYXR0aW5nIGV4dGVybmFsIG1lc3NhZ2Ugc3RyaW5ncy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1zZ0hlbHAgeworICAgIC8qKiBuYW1lIG9mIHRoZSByZXNvdXJjZSBmb3IgdGhpcyBjbGFzcyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9OQU1FID0KKyAgICAgICAgIi9vcmcvYXBhY2hlL2hhcm1vbnkvYmVhbnMvaW50ZXJuYWwvbmxzL21lc3NhZ2VzLnByb3BlcnRpZXMiOworCisgICAgLyoqIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoaXMgY2xhc3MgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBUSEVfQlVORExFOworCisgICAgc3RhdGljIHsKKyAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmIgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IE1zZ0hlbHAuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgUkVTT1VSQ0VfTkFNRSk7CisgICAgICAgICAgICByYiA9IG5ldyBQcm9wZXJ0eVJlc291cmNlQnVuZGxlKGluKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nbG9iYWwud2FybmluZygiQ291bGRuJ3QgcmVhZCByZXNvdXJjZSBidW5kbGU6ICIgKworICAgICAgICAgICAgICAgICAgICBleCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIFNob3VsZG4ndCBoYXBwZW4sIGJ1dCBkZWFsIGF0IGxlYXN0IHNvbWV3aGF0IGdyYWNlZnVsbHkuCisgICAgICAgICAgICBMb2dnZXIuZ2xvYmFsLndhcm5pbmcoIkNvdWxkbid0IGZpbmQgcmVzb3VyY2UgYnVuZGxlOiAiICsKKyAgICAgICAgICAgICAgICAgICAgZXgpOworICAgICAgICB9CisKKyAgICAgICAgVEhFX0JVTkRMRSA9IHJiOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG1zZykgeworICAgICAgICBpZiAoVEhFX0JVTkRMRSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbXNnOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gVEhFX0JVTkRMRS5nZXRTdHJpbmcobXNnKTsKKyAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiAiTWlzc2luZyBtZXNzYWdlOiAiICsgbXNnOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbXNnLCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgIFN0cmluZyBmb3JtYXQgPSBtc2c7CisgICAgICAgIGlmIChUSEVfQlVORExFICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZm9ybWF0ID0gVEhFX0JVTkRMRS5nZXRTdHJpbmcobXNnKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2dIZWxwLmZvcm1hdChmb3JtYXQsIGFyZ3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2F3dC9vcmcvYXBhY2hlL2hhcm1vbnkvYmVhbnMvaW50ZXJuYWwvbmxzL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9hd3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvaGFybW9ueS9iZWFucy9pbnRlcm5hbHMvbmxzL21lc3NhZ2VzLnByb3BlcnRpZXMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGF3dC9vcmcvYXBhY2hlL2hhcm1vbnkvYmVhbnMvaW50ZXJuYWwvbmxzL21lc3NhZ2VzLnByb3BlcnRpZXMKcmVuYW1lIHRvIGF3dC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9oYXJtb255L2JlYW5zL2ludGVybmFscy9ubHMvbWVzc2FnZXMucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tayBiL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggNGU3ZDZkMi4uMmRmZTY1OSAxMDA2NDQKLS0tIGEvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5taworKysgYi9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCkBAIC00LDEyICs0LDEzIEBACiAjIFNldCBVU0VfQ0FNRVJBX1NUVUIgZm9yIG5vbi1lbXVsYXRvciBhbmQgbm9uLXNpbXVsYXRvciBidWlsZHMsIGlmIHlvdSB3YW50CiAjIHRoZSBjYW1lcmEgc2VydmljZSB0byB1c2UgdGhlIGZha2UgY2FtZXJhLiAgRm9yIGVtdWxhdG9yIG9yIHNpbXVsYXRvciBidWlsZHMsCiAjIHdlIGFsd2F5cyB1c2UgdGhlIGZha2UgY2FtZXJhLgotIwotaWZlcSAoJChCT0FSRF9DQU1FUkFfTElCUkFSSUVTKSwpCi1VU0VfQ0FNRVJBX1NUVUI6PXRydWUKLWVsc2UKKworaWZlcSAoJChVU0VfQ0FNRVJBX1NUVUIpLCkKIFVTRV9DQU1FUkFfU1RVQjo9ZmFsc2UKK2lmbmVxICgkKGZpbHRlciBzb29uZXIgZ2VuZXJpYyBzaW0sJChUQVJHRVRfREVWSUNFKSksKQorVVNFX0NBTUVSQV9TVFVCOj10cnVlCiBlbmRpZiAjbGliY2FtZXJhc3R1YgorZW5kaWYKIAogaWZlcSAoJChVU0VfQ0FNRVJBX1NUVUIpLHRydWUpCiAjCkBAIC01MSw3ICs1Miw3IEBACiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmNhbWVyYXN0dWIKIExPQ0FMX0NGTEFHUyArPSAtaW5jbHVkZSBDYW1lcmFIYXJkd2FyZVN0dWIuaAogZWxzZQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSAkKEJPQVJEX0NBTUVSQV9MSUJSQVJJRVMpCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmNhbWVyYSAKIGVuZGlmCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggNTc4NGM0Yi4uODAwZmZhNCAxMDA2NDQKLS0tIGEvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTEsNiArMSw3IEBACiAvKgogKioKLSoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKiBDb3B5cmlnaHQgKEMpIDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgSW5jLgogKioKICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTUsNyArMTYsNyBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCi0KKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhU2VydmljZSIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtMTU1LDEwICsxNTYsMjIgQEAKIHsKICAgICBMT0dEKCJDbGllbnQgRSBjb25zdHJ1Y3RvciIpOwogICAgIG1IYXJkd2FyZSA9IG9wZW5DYW1lcmFIYXJkd2FyZSgpOwotICAgIG1IYXNGcmFtZUNhbGxiYWNrID0gZmFsc2U7CisKKyAgICAvLyBDYWxsYmFjayBpcyBkaXNhYmxlZCBieSBkZWZhdWx0CisgICAgbUZyYW1lQ2FsbGJhY2tGbGFnID0gRlJBTUVfQ0FMTEJBQ0tfRkxBR19OT09QOwogICAgIExPR0QoIkNsaWVudCBYIGNvbnN0cnVjdG9yIik7CiB9CiAKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Y29ubmVjdChjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2xpZW50KQoreworICAgIC8vIHJlbXZvZSBvbGQgY2xpZW50CisgICAgTE9HRCgiY29ubmVjdCAobmV3IGNsaWVudCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1DYW1lcmFDbGllbnQgPSBjbGllbnQ7CisgICAgbUZyYW1lQ2FsbGJhY2tGbGFnID0gRlJBTUVfQ0FMTEJBQ0tfRkxBR19OT09QOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogI2lmIEhBVkVfQU5EUk9JRF9PUwogc3RhdGljIHZvaWQgKnVucmVnaXN0ZXJfc3VyZmFjZSh2b2lkICphcmcpCiB7CkBAIC0xNzAsNyArMTgzLDcgQEAKICNlbmRpZgogCiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6On5DbGllbnQoKQoteyAKK3sKICAgICAvLyBzcGluIGRvd24gaGFyZHdhcmUKICAgICBMT0dEKCJDbGllbnQgRSBkZXN0cnVjdG9yIik7CiAgICAgaWYgKG1TdXJmYWNlICE9IDApIHsKQEAgLTE3OSw3ICsxOTIsNyBAQAogICAgICAgICAvLyBXZSB1bnJlZ2lzdGVyIHRoZSBidWZmZXJzIGluIGEgZGlmZmVyZW50IHRocmVhZCBiZWNhdXNlIGJpbmRlciBkb2VzCiAgICAgICAgIC8vIG5vdCBsZXQgdXMgbWFrZSBzeWNocm9ub3VzIHRyYW5zYWN0aW9ucyBpbiBhIGJpbmRlciBkZXN0cnVjdG9yICh0aGF0CiAgICAgICAgIC8vIGlzLCB1cG9uIG91ciByZWFjaGluZyBhIHJlZmNvdW50IG9mIHplcm8uKQotICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCAKKyAgICAgICAgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgdW5yZWdpc3Rlcl9zdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZS5nZXQoKSk7CiAgICAgICAgIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpOwpAQCAtMjI3LDEyICsyNDAsMTIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLS8vIHRlbGwgdGhlIHNlcnZpY2Ugd2hldGhlciB0byBjYWxsYmFjayB3aXRoIGVhY2ggcHJldmlldyBmcmFtZQotdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnNldEhhc0ZyYW1lQ2FsbGJhY2soYm9vbCBpbnN0YWxsZWQpCisvLyBzZXQgdGhlIGZyYW1lIGNhbGxiYWNrIGZsYWcgdG8gYWZmZWN0IGhvdyB0aGUgcmVjZWl2ZWQgZnJhbWVzIGZyb20KKy8vIHByZXZpZXcgYXJlIGhhbmRsZWQuCit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c2V0RnJhbWVDYWxsYmFja0ZsYWcoaW50IGZyYW1lX2NhbGxiYWNrX2ZsYWcpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIG1IYXNGcmFtZUNhbGxiYWNrID0gaW5zdGFsbGVkOwotICAgIC8vIElmIGluc3RhbGxlZCBpcyBmYWxzZSwgbVByZXZpZXdCdWZmZXIgd2lsbCBiZSByZWxlYXNlZCBpbiBzdG9wUHJldmlldygpLgorICAgIG1GcmFtZUNhbGxiYWNrRmxhZyA9IGZyYW1lX2NhbGxiYWNrX2ZsYWc7CiB9CiAKIC8vIHN0YXJ0IHByZXZpZXcgbW9kZSwgbXVzdCBjYWxsIHNldFByZXZpZXdEaXNwbGF5IGZpcnN0CkBAIC0yNTAsMjQgKzI2MywyNCBAQAogICAgICAgICBMT0dFKCJtSGFyZHdhcmUgaXMgTlVMTCwgcmV0dXJuaW5nLiIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIAorCiAgICAgaWYgKG1TdXJmYWNlID09IDApIHsKICAgICAgICAgTE9HRSgic2V0UHJldmlld0Rpc3BsYXkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHN0YXJ0UHJldmlldyEiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICAKKwogICAgIC8vIFhYWDogVGhpcyBuZWVkcyB0byBiZSBpbXByb3ZlZC4gcmVtb3ZlIGFsbCBoYXJkY29kZWQgc3R1ZmYKLSAgICAKKwogICAgIGludCB3LCBoOwogICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKG1IYXJkd2FyZS0+Z2V0UGFyYW1ldGVycygpKTsKICAgICBwYXJhbXMuZ2V0UHJldmlld1NpemUoJncsICZoKTsKLSAgICAKKwogICAgIG1TdXJmYWNlLT51bnJlZ2lzdGVyQnVmZmVycygpOwogCiAjaWYgREVCVUdfRFVNUF9QUkVWSUVXX0ZSQU1FX1RPX0ZJTEUKICAgICBkZWJ1Z19mcmFtZV9jbnQgPSAwOwogI2VuZGlmCi0gICAgCisKICAgICBzdGF0dXNfdCByZXQgPSBtSGFyZHdhcmUtPnN0YXJ0UHJldmlldyhwcmV2aWV3Q2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYVNlcnZpY2UuZ2V0KCkpOwogICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKQEAgLTI3Nyw3ICsyOTAsNyBAQAogICAgIH0KICAgICBlbHNlIExPR0UoIm1IYXJkd2FyZS0+c3RhcnRQcmV2aWV3KCkgZmFpbGVkIHdpdGggc3RhdHVzICVkXG4iLAogICAgICAgICAgICAgICByZXQpOwotICAgIAorCiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMjk1LDcgKzMwOCw3IEBACiAKICAgICBtSGFyZHdhcmUtPnN0b3BQcmV2aWV3KCk7CiAgICAgTE9HRCgic3RvcFByZXZpZXcoKSwgaGFyZHdhcmUgc3RvcHBlZCBPSyIpOwotICAgIAorCiAgICAgaWYgKG1TdXJmYWNlICE9IDApIHsKICAgICAgICAgbVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7CiAgICAgfQpAQCAtMzYxLDYgKzM3NCw3IEBACiAvLyBwcmV2aWV3IGNhbGxiYWNrIC0gZnJhbWUgYnVmZmVyIHVwZGF0ZQogdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnByZXZpZXdDYWxsYmFjayhjb25zdCBzcDxJTWVtb3J5PiYgbWVtLCB2b2lkKiB1c2VyKQogeworICAgIExPR1YoInByZXZpZXdDYWxsYmFjaygpIik7CiAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBnZXRDbGllbnRGcm9tQ29va2llKHVzZXIpOwogICAgIGlmIChjbGllbnQgPT0gMCkgewogICAgICAgICByZXR1cm47CkBAIC0zOTUsNyArNDA5LDcgQEAKICAgICBjbGllbnQtPnBvc3RGcmFtZShtZW0pOwogCiAjaWYgREVCVUdfQ0xJRU5UX1JFRkVSRU5DRVMKLSAgICAvLyoqKiogaWYgdGhlIGNsaWVudCdzIHJlZmNvdW50IGlzIDEsIHRoZW4gd2UgYXJlIGFib3V0IHRvIGRlc3Ryb3kgaXQgaGVyZSwgCisgICAgLy8qKioqIGlmIHRoZSBjbGllbnQncyByZWZjb3VudCBpcyAxLCB0aGVuIHdlIGFyZSBhYm91dCB0byBkZXN0cm95IGl0IGhlcmUsCiAgICAgLy8gd2hpY2ggaXMgYmFkLS1wcmludCBhbGwgcmVmY291bnRzLgogICAgIGlmIChjbGllbnQtPmdldFN0cm9uZ0NvdW50KCkgPT0gMSkgewogICAgICAgICBMT0dFKCIrKysrKysrKysrKysrKysrIChQUkVWSUVXKSBUSElTIFdJTEwgQ0FVU0UgQSBMT0NLVVAhIik7CkBAIC00MzEsNyArNDQ1LDcgQEAKICAgICAgICAgTE9HRSgibUhhcmR3YXJlIGlzIE5VTEwsIHJldHVybmluZy4iKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICAKKwogICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMKQogICAgICAgICBtU3VyZmFjZS0+dW5yZWdpc3RlckJ1ZmZlcnMoKTsKIApAQCAtNDk1LDcgKzUwOSw3IEBACiAgICAgY2xpZW50LT5wb3N0UmF3KG1lbSk7CiAKICNpZiBERUJVR19DTElFTlRfUkVGRVJFTkNFUwotICAgIC8vKioqKiBpZiB0aGUgY2xpZW50J3MgcmVmY291bnQgaXMgMSwgdGhlbiB3ZSBhcmUgYWJvdXQgdG8gZGVzdHJveSBpdCBoZXJlLCAKKyAgICAvLyoqKiogaWYgdGhlIGNsaWVudCdzIHJlZmNvdW50IGlzIDEsIHRoZW4gd2UgYXJlIGFib3V0IHRvIGRlc3Ryb3kgaXQgaGVyZSwKICAgICAvLyB3aGljaCBpcyBiYWQtLXByaW50IGFsbCByZWZjb3VudHMuCiAgICAgaWYgKGNsaWVudC0+Z2V0U3Ryb25nQ291bnQoKSA9PSAxKSB7CiAgICAgICAgIExPR0UoIisrKysrKysrKysrKysrKysgKFJBVykgVEhJUyBXSUxMIENBVVNFIEEgTE9DS1VQISIpOwpAQCAtNTMyLDcgKzU0Niw3IEBACiAgICAgY2xpZW50LT5wb3N0SnBlZyhtZW0pOwogCiAjaWYgREVCVUdfQ0xJRU5UX1JFRkVSRU5DRVMKLSAgICAvLyoqKiogaWYgdGhlIGNsaWVudCdzIHJlZmNvdW50IGlzIDEsIHRoZW4gd2UgYXJlIGFib3V0IHRvIGRlc3Ryb3kgaXQgaGVyZSwgCisgICAgLy8qKioqIGlmIHRoZSBjbGllbnQncyByZWZjb3VudCBpcyAxLCB0aGVuIHdlIGFyZSBhYm91dCB0byBkZXN0cm95IGl0IGhlcmUsCiAgICAgLy8gd2hpY2ggaXMgYmFkLS1wcmludCBhbGwgcmVmY291bnRzLgogICAgIGlmIChjbGllbnQtPmdldFN0cm9uZ0NvdW50KCkgPT0gMSkgewogICAgICAgICBMT0dFKCIrKysrKysrKysrKysrKysrIChKUEVHKSBUSElTIFdJTEwgQ0FVU0UgQSBMT0NLVVAhIik7CkBAIC02MTUsMzcgKzYyOSw3NCBAQAogICAgIG1DYW1lcmFDbGllbnQtPmpwZWdDYWxsYmFjayhtZW0pOwogfQogCit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Y29weUZyYW1lQW5kUG9zdENvcGllZEZyYW1lKHNwPElNZW1vcnlIZWFwPiBoZWFwLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBMT0dWKCJjb3B5RnJhbWVBbmRQb3N0Q29waWVkRnJhbWUiKTsKKyAgICAvLyBJdCBpcyBuZWNlc3NhcnkgdG8gY29weSBvdXQgb2YgcG1lbSBiZWZvcmUgc2VuZGluZyB0aGlzIHRvCisgICAgLy8gdGhlIGNhbGxiYWNrLiBGb3IgZWZmaWNpZW5jeSwgcmV1c2UgdGhlIHNhbWUgTWVtb3J5SGVhcEJhc2UKKyAgICAvLyBwcm92aWRlZCBpdCdzIGJpZyBlbm91Z2guIERvbid0IGFsbG9jYXRlIHRoZSBtZW1vcnkgb3IKKyAgICAvLyBwZXJmb3JtIHRoZSBjb3B5IGlmIHRoZXJlJ3Mgbm8gY2FsbGJhY2suCisgICAgaWYgKG1QcmV2aWV3QnVmZmVyID09IDApIHsKKyAgICAgICAgbVByZXZpZXdCdWZmZXIgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSwgMCwgTlVMTCk7CisgICAgfSBlbHNlIGlmIChzaXplID4gbVByZXZpZXdCdWZmZXItPnZpcnR1YWxTaXplKCkpIHsKKyAgICAgICAgbVByZXZpZXdCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgbVByZXZpZXdCdWZmZXIgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSwgMCwgTlVMTCk7CisgICAgICAgIGlmIChtUHJldmlld0J1ZmZlciA9PSAwKSB7CisgICAgICAgICAgICBMT0dFKCJmYWlsZWQgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHByZXZpZXcgYnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgbWVtY3B5KG1QcmV2aWV3QnVmZmVyLT5iYXNlKCksCisgICAgICAgICAgICh1aW50OF90ICopaGVhcC0+YmFzZSgpICsgb2Zmc2V0LCBzaXplKTsKKworICAgIHNwPE1lbW9yeUJhc2U+IGZyYW1lID0gbmV3IE1lbW9yeUJhc2UobVByZXZpZXdCdWZmZXIsIDAsIHNpemUpOworICAgIGlmIChmcmFtZSA9PSAwKSB7CisgICAgICAgIExPR0UoImZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgZnJhbWUgY2FsbGJhY2siKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ2FtZXJhQ2xpZW50LT5mcmFtZUNhbGxiYWNrKGZyYW1lKTsKK30KKwogdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnBvc3RGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKQogeworICAgIExPR1YoInBvc3RGcmFtZSIpOworICAgIGlmIChtZW0gPT0gMCkgeworICAgICAgICBMT0dXKCJtZW0gaXMgYSBudWxsIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIHNzaXplX3Qgb2Zmc2V0OwogICAgIHNpemVfdCBzaXplOwogICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOwotCi0gICAgc3A8TWVtb3J5QmFzZT4gZnJhbWU7Ci0KICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBzdXJmYWNlTG9jayhtU3VyZmFjZUxvY2spOwotICAgICAgICBpZiAobVN1cmZhY2UgIT0gTlVMTCkKKyAgICAgICAgaWYgKG1TdXJmYWNlICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1TdXJmYWNlLT5wb3N0QnVmZmVyKG9mZnNldCk7Ci0gICAgfQotICAgIAotICAgIC8vIEl0IGlzIG5lY2Vzc2FyeSB0byBjb3B5IG91dCBvZiBwbWVtIGJlZm9yZSBzZW5kaW5nIHRoaXMgdG8gdGhlIGNhbGxiYWNrLgotICAgIC8vIEZvciBlZmZpY2llbmN5LCByZXVzZSB0aGUgc2FtZSBNZW1vcnlIZWFwQmFzZSBwcm92aWRlZCBpdCdzIGJpZyBlbm91Z2guCi0gICAgLy8gRG9uJ3QgYWxsb2NhdGUgdGhlIG1lbW9yeSBvciBwZXJmb3JtIHRoZSBjb3B5IGlmIHRoZXJlJ3Mgbm8gY2FsbGJhY2suCi0gICAgaWYgKG1IYXNGcmFtZUNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChtUHJldmlld0J1ZmZlciA9PSAwKSB7Ci0gICAgICAgICAgICBtUHJldmlld0J1ZmZlciA9IG5ldyBNZW1vcnlIZWFwQmFzZShzaXplLCAwLCBOVUxMKTsKLSAgICAgICAgfSBlbHNlIGlmIChzaXplID4gbVByZXZpZXdCdWZmZXItPnZpcnR1YWxTaXplKCkpIHsKLSAgICAgICAgICAgIG1QcmV2aWV3QnVmZmVyLmNsZWFyKCk7Ci0gICAgICAgICAgICBtUHJldmlld0J1ZmZlciA9IG5ldyBNZW1vcnlIZWFwQmFzZShzaXplLCAwLCBOVUxMKTsKICAgICAgICAgfQotICAgICAgICBtZW1jcHkobVByZXZpZXdCdWZmZXItPmJhc2UoKSwgKHVpbnQ4X3QgKiloZWFwLT5iYXNlKCkgKyBvZmZzZXQsIHNpemUpOwotICAgICAgICBmcmFtZSA9IG5ldyBNZW1vcnlCYXNlKG1QcmV2aWV3QnVmZmVyLCAwLCBzaXplKTsKICAgICB9Ci0gICAgCi0gICAgLy8gRG8gbm90IGhvbGQgdGhlIGNsaWVudCBsb2NrIHdoaWxlIGNhbGxpbmcgYmFjay4KLSAgICBpZiAoZnJhbWUgIT0gMCkgewotICAgICAgICBtQ2FtZXJhQ2xpZW50LT5mcmFtZUNhbGxiYWNrKGZyYW1lKTsKKworICAgIC8vIElzIHRoZSBjYWxsYmFjayBlbmFibGVkIG9yIG5vdD8KKyAgICBpZiAoIShtRnJhbWVDYWxsYmFja0ZsYWcgJiBGUkFNRV9DQUxMQkFDS19GTEFHX0VOQUJMRV9NQVNLKSkgeworICAgICAgICAvLyBJZiB0aGUgZW5hYmxlIGJpdCBpcyBvZmYsIHRoZSBjb3B5LW91dCBhbmQgb25lLXNob3QgYml0cyBhcmUgaWdub3JlZAorICAgICAgICBMT0dWKCJmcmFtZSBjYWxsYmFjayBpcyBkaWFibGVkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJcyB0aGUgcmVjZWl2ZWQgZnJhbWUgY29waWVkIG91dCBvciBub3Q/CisgICAgaWYgKG1GcmFtZUNhbGxiYWNrRmxhZyAmIEZSQU1FX0NBTExCQUNLX0ZMQUdfQ09QWV9PVVRfTUFTSykgeworICAgICAgICBMT0dWKCJmcmFtZSBpcyBjb3BpZWQgb3V0Iik7CisgICAgICAgIGNvcHlGcmFtZUFuZFBvc3RDb3BpZWRGcmFtZShoZWFwLCBvZmZzZXQsIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1YoImZyYW1lIGlzIGRpcmVjdGx5IHNlbnQgb3V0IHdpdGhvdXQgY29weWluZyIpOworICAgICAgICBtQ2FtZXJhQ2xpZW50LT5mcmFtZUNhbGxiYWNrKG1lbSk7CisgICAgfQorCisgICAgLy8gSXMgdGhpcyBpcyBvbmUtc2hvdCBvbmx5PworICAgIGlmIChtRnJhbWVDYWxsYmFja0ZsYWcgJiBGUkFNRV9DQUxMQkFDS19GTEFHX09ORV9TSE9UX01BU0spIHsKKyAgICAgICAgTE9HVigiT25lLXNob3Qgb25seSwgdGh1cyBjbGVhciB0aGUgYml0cyBhbmQgZGlzYWJsZSBmcmFtZSBjYWxsYmFjayIpOworICAgICAgICBtRnJhbWVDYWxsYmFja0ZsYWcgJj0gfihGUkFNRV9DQUxMQkFDS19GTEFHX09ORV9TSE9UX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9DQUxMQkFDS19GTEFHX0NPUFlfT1VUX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9DQUxMQkFDS19GTEFHX0VOQUJMRV9NQVNLKTsKICAgICB9CiB9CiAKQEAgLTcxMSw3ICs3NjIsNyBAQAogICAgIH0KIAogICAgIHN0YXR1c190IGVyciA9IEJuQ2FtZXJhU2VydmljZTo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIAorCiAgICAgTE9HRCgiKysrIG9uVHJhbnNhY3QgZXJyICVkIGNvZGUgJWQiLCBlcnIsIGNvZGUpOwogCiAgICAgaWYgKGVyciA9PSBVTktOT1dOX1RSQU5TQUNUSU9OIHx8IGVyciA9PSBQRVJNSVNTSU9OX0RFTklFRCkgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oIGIvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCmluZGV4IDY4M2M1MWIuLmIyMjVhYTkgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAorKysgYi9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKQEAgLTEsNiArMSw3IEBACiAvKgogKioKLSoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKiBDb3B5cmlnaHQgKEMpIDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgSW5jLgogKioKICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMjAsNiArMjEsOCBAQAogCiAjaW5jbHVkZSA8dWkvSUNhbWVyYVNlcnZpY2UuaD4KICNpbmNsdWRlIDx1aS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHVpL0NhbWVyYS5oPgorCiBjbGFzcyBhbmRyb2lkOjpNZW1vcnlIZWFwQmFzZTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzIsNyArMzUsNyBAQAogLy8gV2hlbiBlbmFibGVkLCB0aGlzIGZlYXR1cmUgYWxsb3dzIHlvdSB0byBzZW5kIGFuIGV2ZW50IHRvIHRoZSBDYW1lcmFTZXJ2aWNlCiAvLyBzbyB0aGF0IHlvdSBjYW4gY2F1c2UgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGhlYXAgb2JqZWN0IGdXZWFrSGVhcCwgZGVmaW5lZAogLy8gYmVsb3csIHRvIGJlIHByaW50ZWQuIFlvdSB3aWxsIGFsc28gbmVlZCB0byBzZXQgREVCVUdfUkVGUz0xIGFuZAotLy8gREVCVUdfUkVGU19FTkFCTEVEX0JZX0RFRkFVTFQ9MCBpbiBsaWJ1dGlscy9SZWZCYXNlLmNwcC4gWW91IGp1c3QgaGF2ZSB0byAKKy8vIERFQlVHX1JFRlNfRU5BQkxFRF9CWV9ERUZBVUxUPTAgaW4gbGlidXRpbHMvUmVmQmFzZS5jcHAuIFlvdSBqdXN0IGhhdmUgdG8KIC8vIHNldCBnV2Vha0hlYXAgdG8gdGhlIGFwcHJvcHJpYXRlIGhlYXAgeW91IHdhbnQgdG8gdHJhY2suCiAKICNkZWZpbmUgREVCVUdfSEVBUF9MRUFLUyAwCkBAIC02NywxMSArNzAsMTUgQEAKICAgICBwdWJsaWM6CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKIAorICAgICAgICAvLyBjb25uZWN0IG5ldyBjbGllbnQgd2l0aCBleGlzdGluZyBjYW1lcmEgcmVtb3RlCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNsaWVudCk7CisKICAgICAgICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgSVN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7Ci0gICAgICAgIAotICAgICAgICAvLyB0ZWxsIHRoZSBzZXJ2aWNlIHdoZXRoZXIgdG8gY2FsbGJhY2sgd2l0aCBlYWNoIHByZXZpZXcgZnJhbWUKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc2V0SGFzRnJhbWVDYWxsYmFjayhib29sIGluc3RhbGxlZCk7CisKKyAgICAgICAgLy8gc2V0IHRoZSBmcmFtZSBjYWxsYmFjayBmbGFnIHRvIGFmZmVjdCBob3cgdGhlIHJlY2VpdmVkIGZyYW1lcyBmcm9tCisgICAgICAgIC8vIHByZXZpZXcgYXJlIGhhbmRsZWQuCisgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHNldEZyYW1lQ2FsbGJhY2tGbGFnKGludCBmcmFtZV9jYWxsYmFja19mbGFnKTsKIAogICAgICAgICAvLyBzdGFydCBwcmV2aWV3IG1vZGUsIG11c3QgY2FsbCBzZXRQcmV2aWV3RGlzcGxheSBmaXJzdAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydFByZXZpZXcoKTsKQEAgLTExMiw2ICsxMTksNyBAQAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBwb3N0UmF3KGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBwb3N0SnBlZyhjb25zdCBzcDxJTWVtb3J5PiYgbWVtKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcG9zdEZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBjb3B5RnJhbWVBbmRQb3N0Q29waWVkRnJhbWUoc3A8SU1lbW9yeUhlYXA+IGhlYXAsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcG9zdEVycm9yKHN0YXR1c190IGVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcG9zdEF1dG9Gb2N1cyhib29sIGZvY3VzZWQpOwogCkBAIC0xMTksMjAgKzEyNywyMCBAQAogICAgICAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgICAgIC8vIG1TdXJmYWNlTG9jayBzeW5jaHJvbml6ZXMgYWNjZXNzIHRvIG1TdXJmYWNlIGJldHdlZW4KICAgICAgICAgLy8gc2V0UHJldmlld1N1cmZhY2UoKSBhbmQgcG9zdEZyYW1lKCkuICBOb3RlIHRoYXQgYW1vbmcKLSAgICAgICAgLy8gdGhlIHB1YmxpYyBtZXRob2RzLCBhbGwgYWNjZXNzZXMgdG8gbVN1cmZhY2UgYXJlIAorICAgICAgICAvLyB0aGUgcHVibGljIG1ldGhvZHMsIGFsbCBhY2Nlc3NlcyB0byBtU3VyZmFjZSBhcmUKICAgICAgICAgLy8gc3luY3Job25pemVkIGJ5IG1Mb2NrLiAgSG93ZXZlciwgcG9zdEZyYW1lKCkgaXMgY2FsbGVkCi0gICAgICAgIC8vIGJ5IHRoZSBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSBjYWxsYmFjaywgYW5kIG5lZWRzIHRvIAorICAgICAgICAvLyBieSB0aGUgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgY2FsbGJhY2ssIGFuZCBuZWVkcyB0bwogICAgICAgICAvLyBhY2Nlc3MgbVN1cmZhY2UuICBJdCBjYW5ub3QgaG9sZCBtTG9jaywgaG93ZXZlciwgYmVjYXVzZQogICAgICAgICAvLyBzdG9wUHJldmlldygpIG1heSBiZSBob2xkaW5nIHRoYXQgbG9jayB3aGlsZSBhdHRlbXB0aW5nCiAgICAgICAgIC8vIHRvcCBzdG9wIHByZXZpZXcsIGFuZCBzdG9wUHJldmlldyBpdHNlbGYgd2lsbCBibG9jayB3YWl0aW5nCi0gICAgICAgIC8vIGZvciBhIGNhbGxiYWNrIGZyb20gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuICBJZiB0aGlzIAorICAgICAgICAvLyBmb3IgYSBjYWxsYmFjayBmcm9tIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLiAgSWYgdGhpcwogICAgICAgICAvLyBoYXBwZW5zLCBpdCB3aWxsIGNhdXNlIGEgZGVhZGxvY2suCiAgICAgICAgIG11dGFibGUgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZUxvY2s7CiAgICAgICAgIG11dGFibGUgICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgICAgICBtUmVhZHk7CiAgICAgICAgICAgICAgICAgICAgIHNwPENhbWVyYVNlcnZpY2U+ICAgICAgICAgICBtQ2FtZXJhU2VydmljZTsKICAgICAgICAgICAgICAgICAgICAgc3A8SVN1cmZhY2U+ICAgICAgICAgICAgICAgIG1TdXJmYWNlOwogICAgICAgICAgICAgICAgICAgICBzcDxNZW1vcnlIZWFwQmFzZT4gICAgICAgICAgbVByZXZpZXdCdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSGFzRnJhbWVDYWxsYmFjazsKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZUNhbGxiYWNrRmxhZzsKIAogICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBhcmUgaW1tdXRhYmxlIG9uY2UgdGhlIG9iamVjdCBpcyBjcmVhdGVkLAogICAgICAgICAgICAgICAgICAgICAvLyB0aGV5IGRvbid0IG5lZWQgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jawpkaWZmIC0tZ2l0IGEvaW0vamF2YS9hbmRyb2lkL2ltL0JyYW5kaW5nUmVzb3VyY2VJRHMuamF2YSBiL2ltL2phdmEvYW5kcm9pZC9pbS9CcmFuZGluZ1Jlc291cmNlSURzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2MDcyMgotLS0gL2Rldi9udWxsCisrKyBiL2ltL2phdmEvYW5kcm9pZC9pbS9CcmFuZGluZ1Jlc291cmNlSURzLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuaW07CisKKy8qKgorICogQGhpZGUKKyAqIERlZmluZXMgdGhlIElEcyBvZiBicmFuZGluZyByZXNvdXJjZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQnJhbmRpbmdSZXNvdXJjZUlEcyB7CisgICAgLyoqCisgICAgICogVGhlIGxvZ28gaWNvbiBvZiB0aGUgcHJvdmlkZXIgd2hpY2ggaXMgZGlzcGxheWVkIGluIHRoZSBsYW5kaW5nIHBhZ2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFJBV0FCTEVfTE9HTyAgICAgICAgICAgICAgICA9IDEwMDsKKyAgICAvKioKKyAgICAgKiBUaGUgaWNvbiBvZiBvbmxpbmUgcHJlc2VuY2Ugc3RhdHVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERSQVdBQkxFX1BSRVNFTkNFX09OTElORSAgICAgPSAxMDI7CisgICAgLyoqCisgICAgICogVGhlIGljb24gb2YgYnVzeSBwcmVzZW5jZSBzdGF0dXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFJBV0FCTEVfUFJFU0VOQ0VfQlVTWSAgICAgICA9IDEwMzsKKyAgICAvKioKKyAgICAgKiBUaGUgaWNvbiBvZiBhd2F5IHByZXNlbmNlIHN0YXR1cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEUkFXQUJMRV9QUkVTRU5DRV9BV0FZICAgICAgID0gMTA0OworICAgIC8qKgorICAgICAqIFRoZSBpY29uIG9mIGludmlzaWJsZSBwcmVzZW5jZSBzdGF0dXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFJBV0FCTEVfUFJFU0VOQ0VfSU5WSVNJQkxFICA9IDEwNTsKKyAgICAvKioKKyAgICAgKiBUaGUgaWNvbiBvZiBvZmZsaW5lIHByZXNlbmNlIHN0YXR1cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEUkFXQUJMRV9QUkVTRU5DRV9PRkZMSU5FICAgID0gMTA2OworICAgIC8qKgorICAgICAqIFRoZSBsYWJlbCBvZiB0aGUgbWVudSB0byBnbyB0byB0aGUgY29udGFjdCBsaXN0IHNjcmVlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJJTkdfTUVOVV9DT05UQUNUX0xJU1QgICAgID0gMTA3OworCit9CmRpZmYgLS1naXQgYS9pbS9qYXZhL2FuZHJvaWQvaW0vSUltUGx1Z2luLmFpZGwgYi9pbS9qYXZhL2FuZHJvaWQvaW0vSUltUGx1Z2luLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5Y2QwZQotLS0gL2Rldi9udWxsCisrKyBiL2ltL2phdmEvYW5kcm9pZC9pbS9JSW1QbHVnaW4uYWlkbApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5pbTsKKworLyoqCisgKiBAaGlkZQorICovCitpbnRlcmZhY2UgSUltUGx1Z2luIHsKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIHBsdWdpbiB0aGUgZnJvbnQgZG9vciBhY3Rpdml0eSBpcyBjcmVhdGVkLiBUaGlzIGdpdmVzIHRoZSBwbHVnaW4gYSBjaGFuY2UgdG8KKyAgICAgKiBzdGFydCBpdHMgb3duIHNlcnZpY3MsIGV0Yy4KKyAgICAgKi8KKyAgICB2b2lkIG9uU3RhcnQoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIHBsdWdpbiB0aGUgZnJvbnQgZG9vciBhY3Rpdml0eSBpcyBzdG9wcGluZy4KKyAgICAgKi8KKyAgICB2b2lkIG9uU3RvcCgpOworCisgICAgLyoqCisgICAgICogU2lnbiBpbiB0byB0aGUgc2VydmljZSBmb3IgdGhlIGFjY291bnQgcGFzc2VkIGluLgorICAgICAqCisgICAgICogQHBhcmFtIGFjY291bnQgdGhlIGFjY291bnQgaWQgZm9yIHRoZSBhY2NvbnQgdG8gYmUgc2lnbmVkIGludG8uCisgICAgICovCisgICAgdm9pZCBzaWduSW4obG9uZyBhY2NvdW50KTsKKworICAgIC8qKgorICAgICAqIFNpZ24gb3V0IG9mIHRoZSBzZXJ2aWNlIGZvciB0aGUgYWNjb3VudCBwYXNzZWQgaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjb3VudCB0aGUgYWNjb3VudCBpZCBmb3IgdGhlIGFjY29udCB0byBiZSBzaWduZWQgb3V0IG9mLgorICAgICAqLworICAgIHZvaWQgc2lnbk91dChsb25nIGFjY291bnQpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGFja2FnZSBuYW1lIHVzZWQgdG8gbG9hZCB0aGUgcmVzb3VyY2VzIGZvciB0aGUgZ2l2ZW4gcHJvdmlkZXIgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHBhY2thZ2UgbmFtZSB0byBsb2FkIHRoZSByZXNvdXJjcyBmb3IgdGhlIGdpdmVuIHByb3ZpZGVyLgorICAgICAqLworICAgIFN0cmluZyBnZXRSZXNvdXJjZVBhY2thZ2VOYW1lRm9yUHJvdmlkZXIoU3RyaW5nIHByb3ZpZGVyTmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbWFwIG9mIGJyYW5kaW5nIHJlc291cmNlcyBmb3IgdGhlIGdpdmVuIHByb3ZpZGVyLiBUaGUga2V5cyBhcmUgZGVmaW5lZAorICAgICAqIGluIHtAbGluayBhbmRyb2lkLmltLkJyYW5kaW5nUmVzb3VyY2VJRHN9LiBUaGUgdmFsdWVzIGFyZSB0aGUgcmVzb3VyY2UgaWRlbnRpZmllcnMgZ2VuZXJhdGVkCisgICAgICogYnkgdGhlIGFhcHQgdG9vbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG1hcCBvZiBicmFuZGluZyByZXNvdXJjZXMgZm9yIHRoZSBnaXZlbiBwcm92aWRlci4KKyAgICAgKi8KKyAgICBNYXAgZ2V0UmVzb3VyY2VNYXBGb3JQcm92aWRlcihTdHJpbmcgcHJvdmlkZXJOYW1lKTsKKworICAgIC8qCisgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygc3VwcG9ydGVkIElNIHByb3ZpZGVycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBMaXN0IG9mIHN1cHBvcnRlZCBwcm92aWRlcnMuCisgICAgICovCisgICAgTGlzdCBnZXRTdXBwb3J0ZWRQcm92aWRlcnMoKTsKK30KZGlmZiAtLWdpdCBhL2ltL2phdmEvYW5kcm9pZC9pbS9JbVBsdWdpbkNvbnN0cy5qYXZhIGIvaW0vamF2YS9hbmRyb2lkL2ltL0ltUGx1Z2luQ29uc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE2NDkzZgotLS0gL2Rldi9udWxsCisrKyBiL2ltL2phdmEvYW5kcm9pZC9pbS9JbVBsdWdpbkNvbnN0cy5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuaW07CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEltUGx1Z2luQ29uc3RzIHsKKyAgICAvKioKKyAgICAgKiBUaGUgaW50ZW50IGFjdGlvbiBuYW1lIGZvciB0aGUgcGx1Z2luIHNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0FDVElPTl9OQU1FID0gImFuZHJvaWQuaW0ucGx1Z2luIjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL0dMRVMvZWdsbmF0aXZlcy5oIGIvaW5jbHVkZS9HTEVTL2VnbG5hdGl2ZXMuaAppbmRleCBmOWU1NDRjLi4xY2Q1N2QwIDEwMDY0NAotLS0gYS9pbmNsdWRlL0dMRVMvZWdsbmF0aXZlcy5oCisrKyBiL2luY2x1ZGUvR0xFUy9lZ2xuYXRpdmVzLmgKQEAgLTMzLDcgKzMzLDcgQEAKIHR5cGVkZWYgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBOYXRpdmVEaXNwbGF5VHlwZTsKIAogLyogCi0gKiBUaGlzIGEgY29udmVuaWFuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGEgTmF0aXZlV2luZG93VHlwZSBzdXJmYWNlCisgKiBUaGlzIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGEgTmF0aXZlV2luZG93VHlwZSBzdXJmYWNlCiAgKiB0aGF0IG1hcHMgdG8gdGhlIHdob2xlIHNjcmVlbgogICogVGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSBpbXBsZW1lbnRlZCBpbiBsaWJ1aS5zbwogICovCkBAIC01MCw2ICs1MCw3IEBACiB7CiAgICAgTkFUSVZFX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODggICA9IDEsCiAgICAgTkFUSVZFX1BJWEVMX0ZPUk1BVF9SR0JfNTY1ICAgICA9IDQsCisgICAgTkFUSVZFX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODggICA9IDUsCiAgICAgTkFUSVZFX1BJWEVMX0ZPUk1BVF9SR0JBXzU1NTEgICA9IDYsCiAgICAgTkFUSVZFX1BJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQgICA9IDcsCiAgICAgTkFUSVZFX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfU1A9IDB4MTAsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvb3BlbmdsZXMvZ2xfY29udGV4dC5oIGIvaW5jbHVkZS9wcml2YXRlL29wZW5nbGVzL2dsX2NvbnRleHQuaAppbmRleCA2N2Q1MGZkLi4yYWE3OGQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvb3BlbmdsZXMvZ2xfY29udGV4dC5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9vcGVuZ2xlcy9nbF9jb250ZXh0LmgKQEAgLTUzMiw2ICs1MzIsMTAgQEAKICAgICAgICAgICAgIHZlcnRleF90IGNvbnN0KiB2MSwKICAgICAgICAgICAgIHZlcnRleF90IGNvbnN0KiB2Mik7CiAKKyAgICB2b2lkIGluaXRMaW5lKAorICAgICAgICAgICAgdmVydGV4X3QgY29uc3QqIHYwLAorICAgICAgICAgICAgdmVydGV4X3QgY29uc3QqIHYxKTsKKwogICAgIGlubGluZSB2b2lkIGluaXRMZXJwKHZlcnRleF90IGNvbnN0KiB2MCwgdWludDMyX3QgZW5hYmxlcyk7CiAKICAgICBpbnQgaXRlcmF0b3JzU2NhbGUoaW50MzJfdCBpdFszXSwKQEAgLTU0Myw2ICs1NDcsOSBAQAogICAgIHZvaWQgaXRlcmF0b3JzMDAzMihpbnQzMl90IGl0WzNdLAogICAgICAgICAgICAgaW50MzJfdCBjMCwgaW50MzJfdCBjMSwgaW50MzJfdCBjMikgY29uc3Q7CiAKKyAgICB2b2lkIGl0ZXJhdG9yczAwMzIoaW50NjRfdCBpdFszXSwKKyAgICAgICAgICAgIGludDMyX3QgYzAsIGludDMyX3QgYzEsIGludDMyX3QgYzIpIGNvbnN0OworCiAgICAgR0dMY29vcmQgYXJlYSgpIGNvbnN0IHsgcmV0dXJuIG1fYXJlYTsgfQogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9CbGl0SGFyZHdhcmUuaCBiL2luY2x1ZGUvdWkvQmxpdEhhcmR3YXJlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZTFjMTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91aS9CbGl0SGFyZHdhcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0JMSVRfSEFSRFdBUkVfSAotI2RlZmluZSBBTkRST0lEX0JMSVRfSEFSRFdBUkVfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogc3VwcG9ydGVkIHBpeGVsLWZvcm1hdHMuIHRoZXNlIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoCi0gKiBncmFwaGljcy9QaXhlbEZvcm1hdC5qYXZhLCB1aS9QaXhlbEZvcm1hdC5oLCBwaXhlbGZsaW5nZXIvZm9ybWF0LmgKLSAqLwotCi1lbnVtCi17Ci0gICAgQ09QWUJJVF9SR0JBXzg4ODggICAgPSAxLAotICAgIENPUFlCSVRfUkdCXzU2NSAgICAgID0gNCwKLSAgICBDT1BZQklUX1JHQkFfNTU1MSAgICA9IDYsCi0gICAgQ09QWUJJVF9SR0JBXzQ0NDQgICAgPSA3LAotICAgIENPUFlCSVRfWUNiQ3JfNDIyX1NQID0gMHgxMCwKLSAgICBDT1BZQklUX1lDYkNyXzQyMF9TUCA9IDB4MTEKLX07Ci0KLS8qIG5hbWUgZm9yIGNvcHliaXRfc2V0X3BhcmFtZXRlciAqLwotZW51bSAKLXsKLSAgICAvKiByb3RhdGlvbiBvZiB0aGUgc291cmNlIGltYWdlIGluIGRlZ3JlZXMgKDAgdG8gMzU5KSAqLwotICAgIENPUFlCSVRfUk9UQVRJT05fREVHICAgID0gMSwKLSAgICAvKiBwbGFuZSBhbHBoYSB2YWx1ZSAqLwotICAgIENPUFlCSVRfUExBTkVfQUxQSEEgICAgID0gMiwKLSAgICAvKiBlbmFibGUgb3IgZGlzYWJsZSBkaXRoZXJpbmcgKi8KLSAgICBDT1BZQklUX0RJVEhFUiAgICAgICAgICA9IDMsCi0gICAgLyogdHJhbnNmb3JtYXRpb24gYXBwbGllZCAodGhpcyBpcyBhIHN1cGVyc2V0IG9mIENPUFlCSVRfUk9UQVRJT05fREVHKSAqLwotICAgIENPUFlCSVRfVFJBTlNGT1JNICAgICAgID0gNCwKLX07Ci0KLS8qIHZhbHVlcyBmb3IgY29weWJpdF9zZXRfcGFyYW1ldGVyKENPUFlCSVRfVFJBTlNGT1JNKSAqLwotZW51bSB7Ci0gICAgLyogZmxpcCBzb3VyY2UgaW1hZ2UgaG9yaXpvbnRhbGx5ICovCi0gICAgQ09QWUJJVF9UUkFOU0ZPUk1fRkxJUF9IICAgID0gMHgwMSwKLSAgICAvKiBmbGlwIHNvdXJjZSBpbWFnZSB2ZXJ0aWNhbGx5ICovCi0gICAgQ09QWUJJVF9UUkFOU0ZPUk1fRkxJUF9WICAgID0gMHgwMiwKLSAgICAvKiByb3RhdGUgc291cmNlIGltYWdlIDkwIGRlZ3JlcyAqLwotICAgIENPUFlCSVRfVFJBTlNGT1JNX1JPVF85MCAgICA9IDB4MDQsCi0gICAgLyogcm90YXRlIHNvdXJjZSBpbWFnZSAxODAgZGVncmVzICovCi0gICAgQ09QWUJJVF9UUkFOU0ZPUk1fUk9UXzE4MCAgID0gMHgwMywKLSAgICAvKiByb3RhdGUgc291cmNlIGltYWdlIDI3MCBkZWdyZXMgKi8KLSAgICBDT1BZQklUX1RSQU5TRk9STV9ST1RfMjcwICAgPSAweDA3LAotfTsKLQotLyogZW5hYmxlL2Rpc2FibGUgdmFsdWUgY29weWJpdF9zZXRfcGFyYW1ldGVyICovCi1lbnVtIHsKLSAgICBDT1BZQklUX0RJU0FCTEUgPSAwLAotICAgIENPUFlCSVRfRU5BQkxFICA9IDEKLX07Ci0KLS8qIHVzZSBnZXQoKSB0byBxdWVyeSBzdGF0aWMgaW5mb3JtYXRpb25zIGFib3V0IHRoZSBoYXJkd2FyZSAqLwotZW51bSB7Ci0gICAgLyogTWF4aW11bSBhbW91bnQgb2YgbWluaWZpY2F0aW9uIHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUqLwotICAgIENPUFlCSVRfTUlOSUZJQ0FUSU9OX0xJTUlUICA9IDEsCi0gICAgLyogTWF4aW11bSBhbW91bnQgb2YgbWFnbmlmaWNhdGlvbiBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlICovCi0gICAgQ09QWUJJVF9NQUdOSUZJQ0FUSU9OX0xJTUlUID0gMiwKLSAgICAvKiBOdW1iZXIgb2YgZnJhY3Rpb25hbCBiaXRzIHN1cHBvcnQgYnkgdGhlIHNjYWxpbmcgZW5naW5lICovCi0gICAgQ09QWUJJVF9TQ0FMSU5HX0ZSQUNfQklUUyAgID0gMywKLSAgICAvKiBTdXBwb3J0ZWQgcm90YXRpb24gc3RlcCBpbiBkZWdyZXMuICovCi0gICAgQ09QWUJJVF9ST1RBVElPTl9TVEVQX0RFRyAgID0gNCwKLX07Ci0KLXN0cnVjdCBjb3B5Yml0X2ltYWdlX3QgewotICAgIHVpbnQzMl90ICAgIHc7Ci0gICAgdWludDMyX3QgICAgaDsKLSAgICBpbnQzMl90ICAgICBmb3JtYXQ7Ci0gICAgdWludDMyX3QgICAgb2Zmc2V0OwotICAgIHZvaWQqICAgICAgIGJhc2U7Ci0gICAgaW50ICAgICAgICAgZmQ7Ci19OwotCi0KLXN0cnVjdCBjb3B5Yml0X3JlY3RfdCB7Ci0gICAgaW50IGw7Ci0gICAgaW50IHQ7Ci0gICAgaW50IHI7Ci0gICAgaW50IGI7Ci19OwotCi1zdHJ1Y3QgY29weWJpdF9yZWdpb25fdCB7Ci0gICAgaW50ICgqbmV4dCkoY29weWJpdF9yZWdpb25fdCBjb25zdCosIGNvcHliaXRfcmVjdF90KiByZWN0KTsgCi19OwotCi1zdHJ1Y3QgY29weWJpdF90Ci17Ci0gICAgaW50ICgqc2V0X3BhcmFtZXRlcikoc3RydWN0IGNvcHliaXRfdCogaGFuZGxlLCBpbnQgbmFtZSwgaW50IHZhbHVlKTsKLQotICAgIGludCAoKmdldCkoc3RydWN0IGNvcHliaXRfdCogaGFuZGxlLCBpbnQgbmFtZSk7Ci0gICAgCi0gICAgaW50ICgqYmxpdCkoCi0gICAgICAgICAgICBzdHJ1Y3QgY29weWJpdF90KiBoYW5kbGUsIAotICAgICAgICAgICAgc3RydWN0IGNvcHliaXRfaW1hZ2VfdCBjb25zdCogZHN0LCAKLSAgICAgICAgICAgIHN0cnVjdCBjb3B5Yml0X2ltYWdlX3QgY29uc3QqIHNyYywKLSAgICAgICAgICAgIHN0cnVjdCBjb3B5Yml0X3JlZ2lvbl90IGNvbnN0KiByZWdpb24pOwotCi0gICAgaW50ICgqc3RyZXRjaCkoCi0gICAgICAgICAgICBzdHJ1Y3QgY29weWJpdF90KiBoYW5kbGUsIAotICAgICAgICAgICAgc3RydWN0IGNvcHliaXRfaW1hZ2VfdCBjb25zdCogZHN0LCAKLSAgICAgICAgICAgIHN0cnVjdCBjb3B5Yml0X2ltYWdlX3QgY29uc3QqIHNyYywgCi0gICAgICAgICAgICBzdHJ1Y3QgY29weWJpdF9yZWN0X3QgY29uc3QqIGRzdF9yZWN0LAotICAgICAgICAgICAgc3RydWN0IGNvcHliaXRfcmVjdF90IGNvbnN0KiBzcmNfcmVjdCwKLSAgICAgICAgICAgIHN0cnVjdCBjb3B5Yml0X3JlZ2lvbl90IGNvbnN0KiByZWdpb24pOwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGNvcHliaXRfdCogY29weWJpdF9pbml0KCk7Ci0KLWludCBjb3B5Yml0X3Rlcm0oc3RydWN0IGNvcHliaXRfdCogaGFuZGxlKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAvLyBBTkRST0lEX0JMSVRfSEFSRFdBUkVfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9DYW1lcmEuaCBiL2luY2x1ZGUvdWkvQ2FtZXJhLmgKaW5kZXggNTYyYTBhMi4uMTI0ZjA3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91aS9DYW1lcmEuaAorKysgYi9pbmNsdWRlL3VpL0NhbWVyYS5oCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTIxLDYgKzIyLDM5IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLyoKKyAqIEEgc2V0IG9mIGJpdCBtYXNrcyBmb3Igc3BlY2lmeWluZyBob3cgdGhlIHJlY2VpdmVkIGZyYW1lcyBmcm9tIHByZXZpZXcgYXJlCisgKiBoYW5kbGVkIGJlZm9yZSB0aGUgZnJhbWUgY2FsbGJhY2sgY2FsbC4KKyAqCisgKiBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgMyBiaXRzIG9mIGFuICJpbnQiIHZhbHVlIGFyZSB1c2VkIGZvciB0aGlzIHB1cnBvc2U6CisgKgorICogLi4uLi4gMCAwIDAKKyAqICAgICAgIF4gXiBeCisgKiAgICAgICB8IHwgfC0tLS0tLS0tLT4gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNhbGxiYWNrIGlzIGVuYWJsZWQgb3Igbm90CisgKiAgICAgICB8IHwtLS0tLS0tLS0tLT4gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNhbGxiYWNrIGlzIG9uZS1zaG90IG9yIG5vdAorICogICAgICAgfC0tLS0tLS0tLS0tLS0+IGRldGVybWluZSB3aGV0aGVyIHRoZSBmcmFtZSBpcyBjb3BpZWQgb3V0IG9yIG5vdAorICoKKyAqIEZvciBpbnN0YW5jZSwKKyAqIDEuIDB4MDAgZGlzYWJsZXMgdGhlIGNhbGxiYWNrLiBJbiB0aGlzIGNhc2UsIGNvcHkgb3V0IGFuZCBvbmUgc2hvdCBiaXRzCisgKiAgICBhcmUgaWdub3JlZC4KKyAqIDIuIDB4MDEgZW5hYmxlcyBhIGNhbGxiYWNrIHdpdGhvdXQgY29weWluZyBvdXQgdGhlIHJlY2lldmllZCBmcmFtZXMuIEEKKyAqICAgIHR5cGljYWwgdXNlIGNhc2UgaXMgdGhlIENhbWNvcmRlciBhcHBsaWNhdGlvbiB0byBhdm9pZCBtYWtpbmcgY29zdGx5CisgKiAgICBmcmFtZSBjb3BpZXMuCisgKiAzLiAweDA1IGlzIGVuYWJsaW5nIGEgY2FsbGJhY2sgd2l0aCBmcmFtZSBjb3BpZWQgb3V0IHJlcGVhdGVkbHkuIEEgdHlwaWNhbAorICogICAgdXNlIGNhc2UgaXMgdGhlIENhbWVyYSBhcHBsaWNhdGlvbi4KKyAqIDQuIDB4MDcgaXMgZW5hYmxpbmcgYSBjYWxsYmFjayB3aXRoIGZyYW1lIGNvcGllZCBvdXQgb25seSBvbmNlLiBBIHR5cGljYWwgdXNlCisgKiAgICBjYXNlIGlzIHRoZSBCYXJjb2RlIHNjYW5uZXIgYXBwbGljYXRpb24uCisgKi8KKyNkZWZpbmUgRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSyAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBGUkFNRV9DQUxMQkFDS19GTEFHX09ORV9TSE9UX01BU0sgICAgICAgICAgICAweDAyCisjZGVmaW5lIEZSQU1FX0NBTExCQUNLX0ZMQUdfQ09QWV9PVVRfTUFTSyAgICAgICAgICAgIDB4MDQKKworLy8gVHlwaWNhbCB1c2UgY2FzZXMKKyNkZWZpbmUgRlJBTUVfQ0FMTEJBQ0tfRkxBR19OT09QICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBGUkFNRV9DQUxMQkFDS19GTEFHX0NBTUNPUkRFUiAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEZSQU1FX0NBTExCQUNLX0ZMQUdfQ0FNRVJBICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgRlJBTUVfQ0FMTEJBQ0tfRkxBR19CQVJDT0RFX1NDQU5ORVIgICAgICAgICAgMHgwNworCiBjbGFzcyBJQ2FtZXJhU2VydmljZTsKIGNsYXNzIElDYW1lcmE7CiBjbGFzcyBTdXJmYWNlOwpAQCAtMzUsMTUgKzY5LDIxIEBACiBjbGFzcyBDYW1lcmEgOiBwdWJsaWMgQm5DYW1lcmFDbGllbnQsIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAogewogcHVibGljOgorICAgICAgICAgICAgLy8gY29uc3RydWN0IGEgY2FtZXJhIGNsaWVudCBmcm9tIGFuIGV4aXN0aW5nIHJlbW90ZQorICAgICAgICAgICAgQ2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEpOworCiAgICAgc3RhdGljICBzcDxDYW1lcmE+ICBjb25uZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB+Q2FtZXJhKCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBpbml0KCk7CiAKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHJlY29ubmVjdCgpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgZGlzY29ubmVjdCgpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRTdGF0dXMoKSB7IHJldHVybiBtU3RhdHVzOyB9CiAKICAgICAgICAgICAgIC8vIHBhc3MgdGhlIGJ1ZmZlcmVkIElTdXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZQogICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKTsKIAogICAgICAgICAgICAgLy8gc3RhcnQgcHJldmlldyBtb2RlLCBtdXN0IGNhbGwgc2V0UHJldmlld0Rpc3BsYXkgZmlyc3QKICAgICAgICAgICAgIHN0YXR1c190ICAgIHN0YXJ0UHJldmlldygpOwpAQCAtNjYsNyArMTA2LDExIEBACiAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRTaHV0dGVyQ2FsbGJhY2soc2h1dHRlcl9jYWxsYmFjayBjYiwgdm9pZCAqY29va2llKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldFJhd0NhbGxiYWNrKGZyYW1lX2NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0SnBlZ0NhbGxiYWNrKGZyYW1lX2NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0RnJhbWVDYWxsYmFjayhmcmFtZV9jYWxsYmFjayBjYiwgdm9pZCAqY29va2llKTsKKworICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0RnJhbWVDYWxsYmFjayhmcmFtZV9jYWxsYmFjayBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX2NhbGxiYWNrX2ZsYWcgPSBGUkFNRV9DQUxMQkFDS19GTEFHX05PT1ApOworCiAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRFcnJvckNhbGxiYWNrKGVycm9yX2NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0QXV0b0ZvY3VzQ2FsbGJhY2soYXV0b2ZvY3VzX2NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUpOwogICAgIC8vIElDYW1lcmFDbGllbnQgaW50ZXJmYWNlCkBAIC03Nyw3ICsxMjEsOCBAQAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZXJyb3JDYWxsYmFjayhzdGF0dXNfdCBlcnJvcik7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBhdXRvRm9jdXNDYWxsYmFjayhib29sIGZvY3VzZWQpOwogCi0gICAgCisgICAgc3A8SUNhbWVyYT4gICAgICAgICByZW1vdGUoKTsKKwogcHJpdmF0ZToKICAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CkBAIC04NSwxNCArMTMwLDE0IEBACiAgICAgICAgICAgICBjbGFzcyBEZWF0aE5vdGlmaWVyOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAgICBEZWF0aE5vdGlmaWVyKCkgeyAgICAgIAorICAgICAgICAgICAgICAgIERlYXRoTm90aWZpZXIoKSB7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CiAgICAgICAgICAgICB9OwotICAgICAgICAKKwogICAgICAgICAgICAgc3RhdGljIHNwPERlYXRoTm90aWZpZXI+IG1EZWF0aE5vdGlmaWVyOwotICAgICAgICAKKwogICAgICAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIG9idGFpbiBjYW1lcmEgc2VydmljZSBoYW5kbGUKICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzcDxJQ2FtZXJhU2VydmljZT4mIGdldENhbWVyYVNlcnZpY2UoKTsKIApAQCAtMTExLDEyICsxNTYsMTIgQEAKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgKm1FcnJvckNhbGxiYWNrQ29va2llOwogICAgICAgICAgICAgYXV0b2ZvY3VzX2NhbGxiYWNrICBtQXV0b0ZvY3VzQ2FsbGJhY2s7CiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICptQXV0b0ZvY3VzQ2FsbGJhY2tDb29raWU7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZnJpZW5kIGNsYXNzIERlYXRoTm90aWZpZXI7CiAKICAgICAgICAgICAgIHN0YXRpYyAgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsKICAgICAgICAgICAgIHN0YXRpYyAgc3A8SUNhbWVyYVNlcnZpY2U+ICBtQ2FtZXJhU2VydmljZTsKLSAgICAgICAgICAgIAorCiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIGIvaW5jbHVkZS91aS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCmluZGV4IDVmYTkzM2YuLjE0YWM5NmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWkvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAorKysgYi9pbmNsdWRlL3VpL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKQEAgLTM5LDQ4ICszOSw0MiBAQAogdHlwZWRlZiB2b2lkICgqYXV0b2ZvY3VzX2NhbGxiYWNrKShib29sIGZvY3VzZWQsIHZvaWQqIHVzZXIpOwogCiAvKioKLSAqIFRoaXMgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBjYW1lcmEgaGFyZHdhcmUgYWJzdHJhY3Rpb24KLSAqIGxheWVyLiBJdCBzdXBwb3J0cyBzZXR0aW5nIGFuZCBnZXR0aW5nIHBhcmFtZXRlcnMsIGxpdmUKLSAqIHByZXZpZXdpbmcgYW5kIHRha2luZyBwaWN0dXJlcy4gSXQgaXMgYSByZWZlcmVuY2VkIGNvdW50ZWQKLSAqIGludGVyZmFjZSB3aXRoIFJlZkJhc2UgYXMgaXRzIGJhc2UgY2xhc3MuCisgKiBDYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIGRlZmluZXMgdGhlIGludGVyZmFjZSB0byB0aGUKKyAqIGNhbWVyYSBoYXJkd2FyZSBhYnN0cmFjdGlvbiBsYXllciwgdXNlZCBmb3Igc2V0dGluZyBhbmQgZ2V0dGluZworICogcGFyYW1ldGVycywgbGl2ZSBwcmV2aWV3aW5nLCBhbmQgdGFraW5nIHBpY3R1cmVzLgogICoKLSAqIFRoZSBvcGVuQ2FtZXJhSGFyZHdhcmUgZnVuY3Rpb24gaXMgdXNlZCB0bwotICogcmV0cmlldmUgYSBzdHJvbmcgcG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugb2YgdGhpcyBpbnRlcmZhY2UKLSAqIGFuZCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgorICogSXQgaXMgYSByZWZlcmVuY2VkIGNvdW50ZWQgaW50ZXJmYWNlIHdpdGggUmVmQmFzZSBhcyBpdHMgYmFzZSBjbGFzcy4KKyAqIENhbWVyYVNlcnZpY2UgY2FsbHMgb3BlbkNhbWVyYUhhcmR3YXJlKCkgdG8gcmV0cmlldmUgYSBzdHJvbmcgcG9pbnRlciB0byB0aGUKKyAqIGluc3RhbmNlIG9mIHRoaXMgaW50ZXJmYWNlIGFuZCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBUaGUKKyAqIGZvbGxvd2luZyBzdGVwcyBkZXNjcmliZSBhIHR5cGljYWwgc2VxdWVuY2U6CiAgKgotICogQWZ0ZXIgY2FsbGluZyBvcGVuQ2FtZXJhSGFyZHdhcmUgdGhlIGdldFBhcmFtZXRlcnMgYW5kCi0gKiBzZXRQYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGNhbWVyYSBpbnN0YW5jZS4KKyAqICAgLSMgQWZ0ZXIgQ2FtZXJhU2VydmljZSBjYWxscyBvcGVuQ2FtZXJhSGFyZHdhcmUoKSwgZ2V0UGFyYW1ldGVycygpIGFuZAorICogICAgICBzZXRQYXJhbWV0ZXJzKCkgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgY2FtZXJhIGluc3RhbmNlLgorICogICAgICBDYW1lcmFTZXJ2aWNlIGNhbGxzIGdldFByZXZpZXdIZWFwKCkgdG8gZXN0YWJsaXNoIGFjY2VzcyB0byB0aGUKKyAqICAgICAgcHJldmlldyBoZWFwIHNvIGl0IGNhbiBiZSByZWdpc3RlcmVkIHdpdGggU3VyZmFjZUZsaW5nZXIgZm9yCisgKiAgICAgIGVmZmljaWVudCBkaXNwbGF5IHVwZGF0aW5nIHdoaWxlIGluIHByZXZpZXcgbW9kZS4KKyAqICAgLSMgc3RhcnRQcmV2aWV3KCkgaXMgY2FsbGVkLCB3aGljaCBpcyBwYXNzZWQgYSBwcmV2aWV3X2NhbGxiYWNrKCkKKyAqICAgICAgZnVuY3Rpb24gYW5kIGEgdXNlciBwYXJhbWV0ZXIuIFRoZSBjYW1lcmEgaW5zdGFuY2UgdGhlbiBwZXJpb2RpY2FsbHkKKyAqICAgICAgY2FsbHMgcHJldmlld19jYWxsYmFjaygpIGVhY2ggdGltZSBhIG5ldyBwcmV2aWV3IGZyYW1lIGlzIGF2YWlsYWJsZS4KKyAqICAgICAgVGhlIGNhbGxiYWNrIHJvdXRpbmUgaGFzIHR3byBwYXJhbWV0ZXJzOiB0aGUgZmlyc3QgaXMgYSBwb2ludGVyIHRvCisgKiAgICAgIHRoZSBJTWVtb3J5IGNvbnRhaW5pbmcgdGhlIGZyYW1lIGFuZCB0aGUgc2Vjb25kIGEgdXNlciBwYXJhbWV0ZXIuIElmCisgKiAgICAgIHRoZSBwcmV2aWV3X2NhbGxiYWNrIGNvZGUgbmVlZHMgdG8gdXNlIHRoaXMgbWVtb3J5IGFmdGVyIHJldHVybmluZywKKyAqICAgICAgaXQgbXVzdCBjb3B5IHRoZSBkYXRhLgogICoKLSAqIFRoZW4gZ2V0UHJldmlld0hlYXAgaXMgY2FsbGVkIHRvIGdldCBhY2Nlc3MgdG8gdGhlIHByZXZpZXcKLSAqIGhlYXAgc28gaXQgY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgU3VyZmFjZUZsaW5nZXIgZm9yIGVmZmljaWVudAotICogZGlzcGxheSB1cGRhdGluZyB3aGlsZSBpbiB0aGUgcHJldmlldyBtb2RlLgorICogUHJpb3IgdG8gdGFraW5nIGEgcGljdHVyZSwgQ2FtZXJhU2VydmljZSBjYWxscyBhdXRvZm9jdXMoKSB3aXRoCisgKiBhdXRvZm9jdXNfY2FsbGJhY2soKSBhbmQgYSB1c2VyIHBhcmFtZXRlci4gV2hlbiBhdXRvIGZvY3VzaW5nIGhhcworICogY29tcGxldGVkLCB0aGUgY2FtZXJhIGluc3RhbmNlIGNhbGxzIGF1dG9mb2N1c19jYWxsYmFjaygpLCB3aGljaCBpbmZvcm1zCisgKiB0aGUgYXBwbGljYXRpb24gd2hldGhlciBmb2N1c2luZyB3YXMgc3VjY2Vzc2Z1bC4gVGhlIGNhbWVyYSBpbnN0YW5jZQorICogb25seSBjYWxscyBhdXRvZm9jdXNfY2FsbGJhY2soKSBvbmNlIGFuZCBpdCBpcyB1cCB0byB0aGUgYXBwbGljYXRpb24gdG8KKyAqIGNhbGwgYXV0b0ZvY3VzKCkgYWdhaW4gaWYgcmVmb2N1c2luZyBpcyBkZXNpcmVkLgogICoKLSAqIE5leHQgc3RhcnRQcmV2aWV3IGlzIGNhbGxlZCB3aGljaCBpcyBwYXNzZWQgYSBwcmV2aWV3X2NhbGxiYWNrCi0gKiBmdW5jdGlvbiBhbmQgYSB1c2VyIHBhcmFtZXRlci4gVGhlIGNhbWVyYSBpbnN0YW5jZSB0aGVuCi0gKiBwZXJpb2RpY2FsbHkgY2FsbHMgcHJldmlld19jYWxsYmFjayBlYWNoIHRpbWUgYSBuZXcKLSAqIHByZXZpZXcgZnJhbWUgaXMgYXZhaWxhYmxlLiBUaGUgY2FsbCBiYWNrIHJvdXRpbmUgaGFzCi0gKiB0d28gcGFyYW1ldGVycywgdGhlIGZpcnN0IGlzIGEgcG9pbnRlciB0byB0aGUgdGhlIElNZW1vcnkgY29udGFpbmluZwotICogdGhlIGZyYW1lIGFuZCB0aGUgb3RoZXIgaXMgdGhlIHVzZXIgcGFyYW1ldGVyLiBJZiB0aGUgcHJldmlld19jYWxsYmFjawotICogY29kZSBuZWVkcyB0byB1c2UgdGhpcyBtZW1vcnkgYWZ0ZXIgcmV0dXJuaW5nIGl0IG11c3QgY29weQotICogdGhlIGRhdGEuCi0gKgotICogUHJpb3IgdG8gdGFraW5nIGEgcGljdHVyZSB0aGUgYXV0b0ZvY3VzIG1ldGhvZCBpcyB1c3VhbGx5IGNhbGxlZCB3aXRoIGEKLSAqIGF1dG9mb2N1c19jYWxsYmFjayBhbmQgYSB1c2VyIHBhcmFtZXRlci4gV2hlbiBhdXRvIGZvY3VzaW5nCi0gKiBoYXMgY29tcGxldGVkIHRoZSBjYW1lcmEgaW5zdGFuY2UgY2FsbHMgYXV0b2ZvY3VzX2NhbGxiYWNrIHdoaWNoCi0gKiBpbmZvcm1zIHRoZSBhcHBsaWNhdGlvbiBpZiBmb2N1c2luZyB3YXMgc3VjY2Vzc2Z1bCBvciBub3QuCi0gKiBUaGUgY2FtZXJhIGluc3RhbmNlIG9ubHkgY2FsbHMgdGhlIGF1dG9mb2N1c19jYWxsYmFjayBvbmNlIGFuZCBpdAotICogaXMgdXAgdG8gdGhlIGFwcGxpY2F0aW9uIHRvIGNhbGwgYXV0b0ZvY3VzIGFnYWluIGlmIHJlZm9jdXNpbmcgaXMgZGVzaXJlZC4KLSAqCi0gKiBUaGUgbWV0aG9kIHRha2VQaWN0dXJlIGlzIGNhbGxlZCB0byByZXF1ZXN0IHRoYXQgdGhlIGNhbWVyYSBpbnN0YW5jZSB0YWtlIGEKLSAqIHBpY3R1cmUuIFRoaXMgbWV0aG9kIGhhcyB0aHJlZSBjYWxsYmFja3M6IHNodXR0ZXJfY2FsbGJhY2ssIHJhd19jYWxsYmFjaywKLSAqIGFuZCBqcGVnX2NhbGxiYWNrLiBBcyBzb29uIGFzIHRoZSBzaHV0dGVyIHNuYXBzIGFuZCBpdCBpcyBzYWZlIHRvIG1vdmUgdGhlCi0gKiBjYW1lcmEsIHNodXR0ZXJfY2FsbGJhY2sgaXMgY2FsbGVkLiAgVHlwaWNhbGx5LCB5b3Ugd291bGQgd2FudCB0byBwbGF5IHRoZQotICogc2h1dHRlciBzb3VuZCBhdCB0aGlzIG1vbWVudC4gTGF0ZXIsIHdoZW4gdGhlIHJhdyBpbWFnZSBpcyBhdmFpbGFibGUgdGhlCi0gKiByYXdfY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggYSBwb2ludGVyIHRvIHRoZSBJTWVtb3J5IGNvbnRhaW5pbmcgdGhlIHJhdwotICogaW1hZ2UuICBGaW5hbGx5LCB3aGVuIHRoZSBlbmNvZGVkIGpwZWcgaW1hZ2UgaXMgYXZhaWxhYmxlIHRoZSBqcGVnX2NhbGxiYWNrCi0gKiB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgcG9pbnRlciB0byB0aGUgSU1lbW9yeSBjb250YWluaW5nIHRoZSBqcGVnIGltYWdlLiAgQXMKLSAqIHdpdGggdGhlIHByZXZpZXdfY2FsbGJhY2sgdGhlIG1lbW9yeSBtdXN0IGJlIGNvcGllZCBpZiBpdCdzIG5lZWRlZCBhZnRlcgotICogcmV0dXJuaW5nLgorICogQ2FtZXJhU2VydmljZSBjYWxscyB0YWtlUGljdHVyZSgpIHRvIHJlcXVlc3QgdGhlIGNhbWVyYSBpbnN0YW5jZSB0YWtlIGEKKyAqIHBpY3R1cmUuIFRoaXMgbWV0aG9kIGhhcyB0d28gY2FsbGJhY2tzOiByYXdfY2FsbGJhY2soKSBhbmQganBlZ19jYWxsYmFjaygpLgorICogV2hlbiB0aGUgcmF3IGltYWdlIGlzIGF2YWlsYWJsZSwgcmF3X2NhbGxiYWNrKCkgaXMgY2FsbGVkIHdpdGggYSBwb2ludGVyCisgKiB0byB0aGUgSU1lbW9yeSBjb250YWluaW5nIHRoZSByYXcgaW1hZ2UuIFdoZW4gdGhlIGpwZWcgaW1hZ2UgaXMgYXZhaWxhYmxlLAorICoganBlZ19jYWxsYmFjaygpIGlzIGNhbGxlZCB3aXRoIGEgcG9pbnRlciB0byB0aGUgSU1lbW9yeSBjb250YWluaW5nIHRoZQorICoganBlZyBpbWFnZS4gQXMgd2l0aCBwcmV2aWV3X2NhbGxiYWNrKCksIHRoZSBtZW1vcnkgbXVzdCBiZSBjb3BpZWQgaWYgaXQncworICogbmVlZGVkIGFmdGVyIHJldHVybmluZy4KICAqLwogY2xhc3MgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKIHB1YmxpYzoKQEAgLTEwNCw3ICs5OCw3IEBACiAgICAgLyoqCiAgICAgICogU3RhcnQgYXV0byBmb2N1cywgdGhlIGNhbGxiYWNrIHJvdXRpbmUgaXMgY2FsbGVkCiAgICAgICogb25jZSB3aGVuIGZvY3VzaW5nIGlzIGNvbXBsZXRlLiBhdXRvRm9jdXMoKSB3aWxsCi0gICAgICogYmUgY2FsbGVkIGFnYWluZWQgaWYgYW5vdGhlciBhdXRvIGZvY3VzIGlzIG5lZWRlZC4KKyAgICAgKiBiZSBjYWxsZWQgYWdhaW4gaWYgYW5vdGhlciBhdXRvIGZvY3VzIGlzIG5lZWRlZC4KICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGF1dG9Gb2N1cyhhdXRvZm9jdXNfY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcikgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9FR0xEaXNwbGF5U3VyZmFjZS5oIGIvaW5jbHVkZS91aS9FR0xEaXNwbGF5U3VyZmFjZS5oCmluZGV4IGE5Y2ZkNWEuLjAxOTBlMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWkvRUdMRGlzcGxheVN1cmZhY2UuaAorKysgYi9pbmNsdWRlL3VpL0VHTERpc3BsYXlTdXJmYWNlLmgKQEAgLTIzLDExICsyMywxMiBAQAogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogCiAjaW5jbHVkZSA8dWkvRUdMTmF0aXZlU3VyZmFjZS5oPgotI2luY2x1ZGUgPHVpL0JsaXRIYXJkd2FyZS5oPgogCiAjaW5jbHVkZSA8cGl4ZWxmbGluZ2VyL3BpeGVsZmxpbmdlci5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAKK3N0cnVjdCBjb3B5Yml0X2RldmljZV90OworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzEsNyArNzIsNyBAQAogICAgIGludDMyX3QgICAgICAgICAgICAgbVN3YXBDb3VudDsKICAgICBuc2Vjc190ICAgICAgICAgICAgIG1TbGVlcDsKICAgICB1aW50MzJfdCAgICAgICAgICAgIG1GZWF0dXJlRmxhZ3M7Ci0gICAgY29weWJpdF90KiAgICAgICAgICBtQmxpdEVuZ2luZTsKKyAgICBjb3B5Yml0X2RldmljZV90KiAgIG1CbGl0RW5naW5lOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VpL0lDYW1lcmEuaCBiL2luY2x1ZGUvdWkvSUNhbWVyYS5oCmluZGV4IDZhYTM5NDAuLjk5YzBkODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWkvSUNhbWVyYS5oCisrKyBiL2luY2x1ZGUvdWkvSUNhbWVyYS5oCkBAIC0yMCwxMyArMjAsMTUgQEAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL1BhcmNlbC5oPgotCiAjaW5jbHVkZSA8dWkvSVN1cmZhY2UuaD4KICNpbmNsdWRlIDx1dGlscy9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHVpL0NhbWVyYS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NsYXNzIElDYW1lcmFDbGllbnQ7CisKIGNsYXNzIElDYW1lcmE6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CiBwdWJsaWM6CkBAIC0zNCwxMSArMzYsMTUgQEAKIAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKSA9IDA7CiAKKyAgICAvLyBjb25uZWN0IG5ldyBjbGllbnQgd2l0aCBleGlzdGluZyBjYW1lcmEgcmVtb3RlCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgY29ubmVjdChjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2xpZW50KSA9IDA7CisKICAgICAvLyBwYXNzIHRoZSBidWZmZXJlZCBJU3VyZmFjZSB0byB0aGUgY2FtZXJhIHNlcnZpY2UKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKLSAgICAKLSAgICAvLyB0ZWxsIHRoZSBzZXJ2aWNlIHdoZXRoZXIgdG8gY2FsbGJhY2sgd2l0aCBlYWNoIHByZXZpZXcgZnJhbWUKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBzZXRIYXNGcmFtZUNhbGxiYWNrKGJvb2wgaW5zdGFsbGVkKSA9IDA7CisKKyAgICAvLyBzZXQgdGhlIGZyYW1lIGNhbGxiYWNrIGZsYWcgdG8gYWZmZWN0IGhvdyB0aGUgcmVjZWl2ZWQgZnJhbWVzIGZyb20KKyAgICAvLyBwcmV2aWV3IGFyZSBoYW5kbGVkLgorICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHNldEZyYW1lQ2FsbGJhY2tGbGFnKGludCBmcmFtZV9jYWxsYmFja19mbGFnKSA9IDA7CiAKICAgICAvLyBzdGFydCBwcmV2aWV3IG1vZGUsIG11c3QgY2FsbCBzZXRQcmV2aWV3RGlzcGxheSBmaXJzdAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0UHJldmlldygpID0gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvSU92ZXJsYXkuaCBiL2luY2x1ZGUvdWkvSU92ZXJsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjNmZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91aS9JT3ZlcmxheS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSU9WRVJMQVlfSAorI2RlZmluZSBBTkRST0lEX0lPVkVSTEFZX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1aS9QaXhlbEZvcm1hdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElPdmVybGF5IDogcHVibGljIElJbnRlcmZhY2UKK3sKK3B1YmxpYzogCisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShPdmVybGF5KTsKKworICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCkgPSAwOyAvLyBvbmUtd2F5CisgICAgCisgICAgdmlydHVhbCBzc2l6ZV90IHN3YXBCdWZmZXJzKCkgPSAwOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCbk92ZXJsYXkgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SU92ZXJsYXk+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0lPVkVSTEFZX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvSVN1cmZhY2UuaCBiL2luY2x1ZGUvdWkvSVN1cmZhY2UuaAppbmRleCBjYTY5MWY1Li5mZjAzMWQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VpL0lTdXJmYWNlLmgKKysrIGIvaW5jbHVkZS91aS9JU3VyZmFjZS5oCkBAIC0zMCw2ICszMCw3IEBACiB0eXBlZGVmIGludDMyX3QgICAgU3VyZmFjZUlEOwogCiBjbGFzcyBJTWVtb3J5SGVhcDsKK2NsYXNzIE92ZXJsYXk7CiAKIGNsYXNzIElTdXJmYWNlIDogcHVibGljIElJbnRlcmZhY2UKIHsKQEAgLTQyLDYgKzQzLDkgQEAKICAgICB2aXJ0dWFsIHZvaWQgcG9zdEJ1ZmZlcihzc2l6ZV90IG9mZnNldCkgPSAwOyAvLyBvbmUtd2F5CiAKICAgICB2aXJ0dWFsIHZvaWQgdW5yZWdpc3RlckJ1ZmZlcnMoKSA9IDA7CisgICAgCisgICAgdmlydHVhbCBzcDxPdmVybGF5PiBjcmVhdGVPdmVybGF5KAorICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgaW50MzJfdCBmb3JtYXQpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvSVN1cmZhY2VGbGluZ2VyQ2xpZW50LmggYi9pbmNsdWRlL3VpL0lTdXJmYWNlRmxpbmdlckNsaWVudC5oCmluZGV4IGJiMmQzOWYuLjViOTM2MWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWkvSVN1cmZhY2VGbGluZ2VyQ2xpZW50LmgKKysrIGIvaW5jbHVkZS91aS9JU3VyZmFjZUZsaW5nZXJDbGllbnQuaApAQCAtNTIsNyArNTIsNiBAQAogICAgIHN0cnVjdCBzdXJmYWNlX2RhdGFfdCB7CiAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgdG9rZW47CiAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgaWRlbnRpdHk7Ci0gICAgICAgIGludDMyX3QgICAgICAgICAgICAgdHlwZTsKICAgICAgICAgc3A8SU1lbW9yeUhlYXA+ICAgICBoZWFwWzJdOwogICAgICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwmIHBhcmNlbCk7CiAgICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9LZXljb2RlTGFiZWxzLmggYi9pbmNsdWRlL3VpL0tleWNvZGVMYWJlbHMuaAppbmRleCA3NDc5MjVkLi41M2MxMTg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VpL0tleWNvZGVMYWJlbHMuaAorKysgYi9pbmNsdWRlL3VpL0tleWNvZGVMYWJlbHMuaApAQCAtMTA3LDEyICsxMDcsMTggQEAKICAgICB7ICJNRU5VIiwgODIgfSwKICAgICB7ICJOT1RJRklDQVRJT04iLCA4MyB9LAogICAgIHsgIlNFQVJDSCIsIDg0IH0sCisgICAgeyAiUExBWVBBVVNFIiwgODUgfSwKKyAgICB7ICJTVE9QIiwgODYgfSwKKyAgICB7ICJORVhUU09ORyIsIDg3IH0sCisgICAgeyAiUFJFVklPVVNTT05HIiwgODggfSwKKyAgICB7ICJSRVdJTkQiLCA4OSB9LAorICAgIHsgIkZPUldBUkQiLCA5MCB9LAogCiAgICAgLy8gTk9URTogSWYgeW91IGFkZCBhIG5ldyBrZXljb2RlIGhlcmUgeW91IG11c3QgYWxzbyBhZGQgaXQgdG86CiAgICAgLy8gICAoZW51bSBLZXlDb2RlLCBpbiB0aGlzIGZpbGUpCi0gICAgLy8gICBqYXZhL2FuZHJvaWQvYW5kcm9pZC92aWV3L0tleUV2ZW50LmphdmEKKyAgICAvLyAgIGZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0tleUV2ZW50LmphdmEKICAgICAvLyAgIHRvb2xzL3B1cHBldF9tYXN0ZXIvUHVwcGV0TWFzdGVyLm5hdl9rZXlzLnB5Ci0gICAgLy8gICBhcHBzL2NvbW1vbi9yZXMvdmFsdWVzL2F0dHJzLnhtbAorICAgIC8vICAgZnJhbWV3b3Jrcy9iYXNlL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCiAKICAgICB7IE5VTEwsIDAgfQogfTsKQEAgLTIwNCw3ICsyMTAsMTMgQEAKICAgICBrS2V5Q29kZVBsdXMgPSA4MSwKICAgICBrS2V5Q29kZU1lbnUgPSA4MiwKICAgICBrS2V5Q29kZU5vdGlmaWNhdGlvbiA9IDgzLAotICAgIGtLZXlDb2RlU2VhcmNoID0gODQKKyAgICBrS2V5Q29kZVNlYXJjaCA9IDg0LAorICAgIGtLZXlDb2RlUGxheVBhdXNlID0gODUsCisgICAga0tleUNvZGVTdG9wID0gODYsCisgICAga0tleUNvZGVOZXh0U29uZyA9IDg3LAorICAgIGtLZXlDb2RlUHJldmlvdXNTb25nID0gODgsCisgICAga0tleUNvZGVSZXdpbmQgPSA4OSwKKyAgICBrS2V5Q29kZUZvcndhcmQgPSA5MAogfSBLZXlDb2RlOwogCiBzdGF0aWMgY29uc3QgS2V5Y29kZUxhYmVsIEZMQUdTW10gPSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3VpL092ZXJsYXkuaCBiL2luY2x1ZGUvdWkvT3ZlcmxheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNDc4MGYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VpL092ZXJsYXkuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX09WRVJMQVlfSAorI2RlZmluZSBBTkRST0lEX09WRVJMQVlfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9vdmVybGF5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSU92ZXJsYXk7CitjbGFzcyBJTWVtb3J5OworY2xhc3MgSU1lbW9yeUhlYXA7CisKK2NsYXNzIE92ZXJsYXkgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCit7CitwdWJsaWM6CisgICAgT3ZlcmxheShvdmVybGF5X3QqIG92ZXJsYXksIAorICAgICAgICAgICAgY29uc3Qgc3A8SU92ZXJsYXk+JiBvLCBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXApOworCisgICAgLyogZGVzdHJveXMgdGhpcyBvdmVybGF5ICovCisgICAgdm9pZCBkZXN0cm95KCk7CisgICAgCisgICAgLyogcG9zdC9zd2FwcyBidWZmZXJzICovCisgICAgc3RhdHVzX3Qgc3dhcEJ1ZmZlcnMoKTsKKyAgICAKKyAgICAvKiBnZXQgdGhlIEhBTCBoYW5kbGUgZm9yIHRoaXMgb3ZlcmxheSAqLworICAgIG92ZXJsYXlfaGFuZGxlX3QgY29uc3QqIGdldEhhbmRsZVJlZigpIGNvbnN0OworICAgIAorICAgIC8qIHJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgY3VycmVudCBidWZmZXIgKi8KKyAgICBzaXplX3QgZ2V0QnVmZmVyT2Zmc2V0KCkgY29uc3Q7CisgICAgCisgICAgLyogcmV0dXJucyBhIGhlYXAgdG8gdGhpcyBvdmVybGF5LiB0aGlzIG1heSBub3QgYmUgc3VwcG9ydGVkLiAqLworICAgIHNwPElNZW1vcnlIZWFwPiBnZXRIZWFwKCkgY29uc3Q7CisgICAgCisgICAgLyogZ2V0IHBoeXNpY2FsIGluZm9ybWF0aW9ucyBhYm91dCB0aGUgb3ZlcmxheSAqLworICAgIHVpbnQzMl90IGdldFdpZHRoKCkgY29uc3Q7CisgICAgdWludDMyX3QgZ2V0SGVpZ2h0KCkgY29uc3Q7CisgICAgaW50MzJfdCBnZXRGb3JtYXQoKSBjb25zdDsKKyAgICBpbnQzMl90IGdldFdpZHRoU3RyaWRlKCkgY29uc3Q7CisgICAgaW50MzJfdCBnZXRIZWlnaHRTdHJpZGUoKSBjb25zdDsKKworICAgIHN0YXRpYyBzcDxPdmVybGF5PiByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwmIGRhdGEpOworICAgIHN0YXRpYyBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcmVwbHksIGNvbnN0IHNwPE92ZXJsYXk+JiBvKTsKKworcHJpdmF0ZToKKyAgICBPdmVybGF5KG92ZXJsYXlfaGFuZGxlX3QqLCBjb25zdCBzcDxJT3ZlcmxheT4mLCBjb25zdCBzcDxJTWVtb3J5SGVhcD4mLCAgCisgICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBpbnQzMl90IGYsIHVpbnQzMl90IHdzLCB1aW50MzJfdCBocyk7CisKKyAgICB2aXJ0dWFsIH5PdmVybGF5KCk7CisKKyAgICBzcDxJT3ZlcmxheT4gICAgICAgIG1PdmVybGF5OworICAgIHNwPElNZW1vcnlIZWFwPiAgICAgbUhlYXA7CisgICAgc2l6ZV90ICAgICAgICAgICAgICBtQ3VycmVudEJ1ZmZlck9mZnNldDsKKyAgICBvdmVybGF5X2hhbmRsZV90IGNvbnN0ICptT3ZlcmxheUhhbmRsZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1XaWR0aDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1IZWlnaHQ7CisgICAgaW50MzJfdCAgICAgICAgICAgICBtRm9ybWF0OworICAgIGludDMyX3QgICAgICAgICAgICAgbVdpZHRoU3RyaWRlOworICAgIGludDMyX3QgICAgICAgICAgICAgbUhlaWdodFN0cmlkZTsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfT1ZFUkxBWV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3VpL1BpeGVsRm9ybWF0LmggYi9pbmNsdWRlL3VpL1BpeGVsRm9ybWF0LmgKaW5kZXggZDU2YTRhNy4uYzYxZGYzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91aS9QaXhlbEZvcm1hdC5oCisrKyBiL2luY2x1ZGUvdWkvUGl4ZWxGb3JtYXQuaApAQCAtNjEsNiArNjEsNyBAQAogICAgIFBJWEVMX0ZPUk1BVF9SR0JYXzg4ODggICA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4LCAgLy8gNHg4LWJpdCBSR0IwCiAgICAgUElYRUxfRk9STUFUX1JHQl84ODggICAgID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JfODg4LCAgICAvLyAzeDgtYml0IFJHQgogICAgIFBJWEVMX0ZPUk1BVF9SR0JfNTY1ICAgICA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSwgICAgLy8gMTYtYml0IFJHQgorICAgIFBJWEVMX0ZPUk1BVF9CR1JBXzg4ODggICA9IEdHTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4LCAgLy8gNHg4LWJpdCBCR1JBCiAgICAgUElYRUxfRk9STUFUX1JHQkFfNTU1MSAgID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzU1NTEsICAvLyAxNi1iaXQgQVJHQgogICAgIFBJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQgICA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0LCAgLy8gMTYtYml0IEFSR0IKICAgICBQSVhFTF9GT1JNQVRfQV84ICAgICAgICAgPSBHR0xfUElYRUxfRk9STUFUX0FfOCwgICAgICAgIC8vIDgtYml0IEEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvUmVnaW9uLmggYi9pbmNsdWRlL3VpL1JlZ2lvbi5oCmluZGV4IGE4NmU2MzAuLmEwYzQ2MDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWkvUmVnaW9uLmgKKysrIGIvaW5jbHVkZS91aS9SZWdpb24uaApAQCAtMjQsNyArMjQsOCBAQAogI2luY2x1ZGUgPHV0aWxzL1BhcmNlbC5oPgogCiAjaW5jbHVkZSA8dWkvUmVjdC5oPgotI2luY2x1ZGUgPHVpL0JsaXRIYXJkd2FyZS5oPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvY29weWJpdC5oPgogCiAjaW5jbHVkZSA8Y29yZWNnL1NrUmVnaW9uLmg+CiAKQEAgLTE2Niw3ICsxNjcsNiBAQAogICAgIH0KICAgICBtdXRhYmxlIFJlZ2lvbjo6aXRlcmF0b3IgaTsKIH07Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9TdXJmYWNlLmggYi9pbmNsdWRlL3VpL1N1cmZhY2UuaAppbmRleCAwYTc1YmYzLi4yZTI0Zjg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VpL1N1cmZhY2UuaAorKysgYi9pbmNsdWRlL3VpL1N1cmZhY2UuaApAQCAtNDgsNyArNDgsNyBAQAogICAgICAgICB2b2lkKiAgICAgICBiYXNlOwogICAgICAgICB1aW50MzJfdCAgICByZXNlcnZlZFsyXTsKICAgICB9OwotICAgIAorCiAgICAgYm9vbCAgICAgICAgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIHRoaXMgJiYgbVRva2VuPj0wICYmIG1DbGllbnQhPTA7IH0KICAgICBTdXJmYWNlSUQgICBJRCgpIGNvbnN0ICAgICAgeyByZXR1cm4gbVRva2VuOyB9CiAKQEAgLTU5LDE4ICs1OSwxNyBAQAogCiAgICAgdm9pZCogICAgICAgaGVhcEJhc2UoaW50IGkpIGNvbnN0OwogICAgIHVpbnQzMl90ICAgIGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9Ci0gICAgaW50ICAgICAgICAgZ2V0TWVtb3J5VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1NZW1vcnlUeXBlOyB9Ci0gICAgCisKICAgICAvLyBzZXRTd2FwUmVjdGFuZ2xlKCkgaXMgbWFpbmx5IHVzZWQgYnkgRUdMCiAgICAgdm9pZCAgICAgICAgc2V0U3dhcFJlY3RhbmdsZShjb25zdCBSZWN0JiByKTsKICAgICBjb25zdCBSZWN0JiBzd2FwUmVjdGFuZ2xlKCkgY29uc3Q7CiAgICAgc3RhdHVzX3QgICAgbmV4dEJ1ZmZlcihTdXJmYWNlSW5mbyogaW5mbyk7Ci0gICAgCisKICAgICBzcDxTdXJmYWNlPiAgICAgICAgIGR1cCgpIGNvbnN0OwogICAgIHN0YXRpYyBzcDxTdXJmYWNlPiAgcmVhZEZyb21QYXJjZWwoUGFyY2VsKiBwYXJjZWwpOwogICAgIHN0YXRpYyBzdGF0dXNfdCAgICAgd3JpdGVUb1BhcmNlbChjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSwgUGFyY2VsKiBwYXJjZWwpOwogICAgIHN0YXRpYyBib29sICAgICAgICAgaXNTYW1lU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgbGhzLCBjb25zdCBzcDxTdXJmYWNlPiYgcmhzKTsKLSAgICAKKwogICAgIHN0YXR1c190ICAgIHNldExheWVyKGludDMyX3QgbGF5ZXIpOwogICAgIHN0YXR1c190ICAgIHNldFBvc2l0aW9uKGludDMyX3QgeCwgaW50MzJfdCB5KTsKICAgICBzdGF0dXNfdCAgICBzZXRTaXplKHVpbnQzMl90IHcsIHVpbnQzMl90IGgpOwpAQCAtODMsMTMgKzgyLDE0IEBACiAgICAgc3RhdHVzX3QgICAgc2V0QWxwaGEoZmxvYXQgYWxwaGE9MS4wZik7CiAgICAgc3RhdHVzX3QgICAgc2V0TWF0cml4KGZsb2F0IGRzZHgsIGZsb2F0IGR0ZHgsIGZsb2F0IGRzZHksIGZsb2F0IGR0ZHkpOwogICAgIHN0YXR1c190ICAgIHNldEZyZWV6ZVRpbnQodWludDMyX3QgdGludCk7Ci0gICAgCisKICAgICB1aW50MzJfdCAgICBnZXRJZGVudGl0eSgpIGNvbnN0IHsgcmV0dXJuIG1JZGVudGl0eTsgfQogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwogCi0gICAgLy8gY2FtZXJhIG5lZWRzIGFjY2VzcyB0byB0aGUgSVN1cmZhY2UgYmluZGVyIGludGVyZmFjZSBmb3IgcHJldmlldworICAgIC8vIGNhbWVyYSBhbmQgY2FtY29yZGVyIG5lZWQgYWNjZXNzIHRvIHRoZSBJU3VyZmFjZSBiaW5kZXIgaW50ZXJmYWNlIGZvciBwcmV2aWV3CiAgICAgZnJpZW5kIGNsYXNzIENhbWVyYTsKKyAgICBmcmllbmQgY2xhc3MgTWVkaWFSZWNvcmRlcjsKICAgICAvLyBtZWRpYXBsYXllciBuZWVkcyBhY2Nlc3MgdG8gSVN1cmZhY2UgZm9yIGRpc3BsYXkKICAgICBmcmllbmQgY2xhc3MgTWVkaWFQbGF5ZXI7CiAgICAgY29uc3Qgc3A8SVN1cmZhY2U+JiBnZXRJU3VyZmFjZSgpIGNvbnN0IHsgcmV0dXJuIG1TdXJmYWNlOyB9CkBAIC05OCwxOSArOTgsMTkgQEAKICAgICBTdXJmYWNlJiBvcGVyYXRvciA9IChTdXJmYWNlJiByaHMpOwogICAgIFN1cmZhY2UoY29uc3QgU3VyZmFjZSYgcmhzKTsKIAotICAgIFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50LCAKKyAgICBTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSwKICAgICAgICAgICAgIGNvbnN0IElTdXJmYWNlRmxpbmdlckNsaWVudDo6c3VyZmFjZV9kYXRhX3QmIGRhdGEsCiAgICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBQaXhlbEZvcm1hdCBmb3JtYXQsIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgYm9vbCBvd25lciA9IHRydWUpOwotICAgIAorCiAgICAgU3VyZmFjZShTdXJmYWNlIGNvbnN0KiByaHMpOwogCiAgICAgflN1cmZhY2UoKTsKIAogICAgIFJlZ2lvbiBkaXJ0eVJlZ2lvbigpIGNvbnN0OwogICAgIHZvaWQgc2V0RGlydHlSZWdpb24oY29uc3QgUmVnaW9uJiByZWdpb24pIGNvbnN0OwotICAgIAorCiAgICAgLy8gdGhpcyBsb2NrcyBwcm90ZWN0cyBjYWxscyB0byBsb2NrU3VyZmFjZSgpIC8gdW5sb2NrU3VyZmFjZSgpCiAgICAgLy8gYW5kIGlzIGNhbGxlZCBieSBTdXJmYWNlQ29tcG9zZXJDbGllbnQuCiAgICAgTXV0ZXgmIGdldExvY2soKSBjb25zdCB7IHJldHVybiBtU3VyZmFjZUxvY2s7IH0KQEAgLTExOCw3ICsxMTgsNiBAQAogICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gICBtQ2xpZW50OwogICAgIHNwPElTdXJmYWNlPiAgICAgICAgICAgICAgICBtU3VyZmFjZTsKICAgICBzcDxJTWVtb3J5SGVhcD4gICAgICAgICAgICAgbUhlYXBbMl07Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1NZW1vcnlUeXBlOwogICAgIFN1cmZhY2VJRCAgICAgICAgICAgICAgICAgICBtVG9rZW47CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIG1JZGVudGl0eTsKICAgICBQaXhlbEZvcm1hdCAgICAgICAgICAgICAgICAgbUZvcm1hdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvSVBDVGhyZWFkU3RhdGUuaCBiL2luY2x1ZGUvdXRpbHMvSVBDVGhyZWFkU3RhdGUuaAppbmRleCA0NzA0M2I4Li4wNDkwZmQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3V0aWxzL0lQQ1RocmVhZFN0YXRlLmgKKysrIGIvaW5jbHVkZS91dGlscy9JUENUaHJlYWRTdGF0ZS5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUGFyY2VsLmg+CiAjaW5jbHVkZSA8dXRpbHMvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKICNpZmRlZiBIQVZFX1dJTjMyX1BST0MKIHR5cGVkZWYgIGludCAgdWlkX3Q7CkBAIC05Miw2ICs5Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29va2llKTsKICAgICAKICAgICBjb25zdCAgIHNwPFByb2Nlc3NTdGF0ZT4gICAgbVByb2Nlc3M7CisgICAgICAgICAgICBWZWN0b3I8QkJpbmRlcio+ICAgIG1QZW5kaW5nU3Ryb25nRGVyZWZzOworICAgICAgICAgICAgVmVjdG9yPFJlZkJhc2U6OndlYWtyZWZfdHlwZSo+IG1QZW5kaW5nV2Vha0RlcmVmczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBQYXJjZWwgICAgICAgICAgICAgIG1JbjsKICAgICAgICAgICAgIFBhcmNlbCAgICAgICAgICAgICAgbU91dDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvTWVtb3J5SGVhcFBtZW0uaCBiL2luY2x1ZGUvdXRpbHMvTWVtb3J5SGVhcFBtZW0uaAppbmRleCBiNjk0YjIwLi42MDMzNWFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3V0aWxzL01lbW9yeUhlYXBQbWVtLmgKKysrIGIvaW5jbHVkZS91dGlscy9NZW1vcnlIZWFwUG1lbS5oCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTWVtb3J5RGVhbGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzEsMTEgKzMxLDIxIEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1jbGFzcyBTdWJSZWdpb25NZW1vcnk7Ci0KIGNsYXNzIE1lbW9yeUhlYXBQbWVtIDogcHVibGljIEhlYXBJbnRlcmZhY2UsIHB1YmxpYyBNZW1vcnlIZWFwQmFzZQogewogcHVibGljOgorICAgIGNsYXNzIE1lbW9yeVBtZW0gOiBwdWJsaWMgQm5NZW1vcnkgeworICAgIHB1YmxpYzoKKyAgICAgICAgTWVtb3J5UG1lbShjb25zdCBzcDxNZW1vcnlIZWFwUG1lbT4mIGhlYXApOworICAgICAgICB+TWVtb3J5UG1lbSgpOworICAgIHByb3RlY3RlZDoKKyAgICAgICAgY29uc3Qgc3A8TWVtb3J5SGVhcFBtZW0+JiAgZ2V0SGVhcCgpIGNvbnN0IHsgcmV0dXJuIG1DbGllbnRIZWFwOyB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIGNsYXNzIE1lbW9yeUhlYXBQbWVtOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmV2b2tlKCkgPSAwOworICAgICAgICBzcDxNZW1vcnlIZWFwUG1lbT4gIG1DbGllbnRIZWFwOworICAgIH07CisgICAgCiAgICAgTWVtb3J5SGVhcFBtZW0oY29uc3Qgc3A8TWVtb3J5SGVhcEJhc2U+JiBwbWVtSGVhcCwKICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IElNZW1vcnlIZWFwOjpNQVBfT05DRSk7CiAgICAgfk1lbW9yeUhlYXBQbWVtKCk7CkBAIC01MSwxMSArNjEsMTYgQEAKICAgICAKICAgICAvKiByZXZva2UgYWxsIGFsbG9jYXRpb25zIG1hZGUgYnkgdGhpcyBoZWFwICovCiAgICAgdmlydHVhbCB2b2lkIHJldm9rZSgpOwotICAgIAorCitwcml2YXRlOgorICAgIC8qIHVzZSB0aGlzIHRvIGNyZWF0ZSB5b3VyIG93biBJTWVtb3J5IGZvciBtYXBNZW1vcnkgKi8KKyAgICB2aXJ0dWFsIHNwPE1lbW9yeVBtZW0+IGNyZWF0ZU1lbW9yeShzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCByZW1vdmUoY29uc3Qgd3A8TWVtb3J5UG1lbT4mIG1lbW9yeSk7CisKIHByaXZhdGU6CiAgICAgc3A8TWVtb3J5SGVhcEJhc2U+ICAgICAgICAgICAgICBtUGFyZW50SGVhcDsKICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOwotICAgIFZlY3Rvcjwgd3A8U3ViUmVnaW9uTWVtb3J5PiA+ICAgbUFsbG9jYXRpb25zOworICAgIFNvcnRlZFZlY3Rvcjwgd3A8TWVtb3J5UG1lbT4gPiAgbUFsbG9jYXRpb25zOwogfTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL1Jlc291cmNlVHlwZXMuaCBiL2luY2x1ZGUvdXRpbHMvUmVzb3VyY2VUeXBlcy5oCmluZGV4IDMxYjlhYTguLjJkNTZlM2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdXRpbHMvUmVzb3VyY2VUeXBlcy5oCisrKyBiL2luY2x1ZGUvdXRpbHMvUmVzb3VyY2VUeXBlcy5oCkBAIC0xNDAsOCArMTQwLDYgQEAKICAgICB2b2lkIHNlcmlhbGl6ZSh2b2lkKiBvdXREYXRhKTsKICAgICAvLyBEZXNlcmlhbGl6ZS9Vbm1hcnNoYWxsIHRoZSBwYXRjaCBkYXRhCiAgICAgc3RhdGljIFJlc19wbmdfOXBhdGNoKiBkZXNlcmlhbGl6ZShjb25zdCB2b2lkKiBkYXRhKTsKLSAgICAvLyBEZXNlcmlhbGl6ZS9Vbm1hcnNoYWxsIHRoZSBwYXRjaCBkYXRhIGludG8gYSBuZXdseSBtYWxsb2MtZWQgYmxvY2sKLSAgICBzdGF0aWMgdm9pZCBkZXNlcmlhbGl6ZShjb25zdCB2b2lkKiBkYXRhLCBSZXNfcG5nXzlwYXRjaCogb3V0RGF0YSk7CiAgICAgLy8gQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgc2VyaWFsaXplZCBkYXRhIHN0cnVjdHVyZQogICAgIHNpemVfdCBzZXJpYWxpemVkU2l6ZSgpOwogfTsKQEAgLTg2MCw2ICs4NTgsNyBAQAogICAgICAgICBLRVlTSElEREVOX0FOWSA9IDB4MDAwMCwKICAgICAgICAgS0VZU0hJRERFTl9OTyA9IDB4MDAwMSwKICAgICAgICAgS0VZU0hJRERFTl9ZRVMgPSAweDAwMDIsCisgICAgICAgIEtFWVNISURERU5fU09GVCA9IDB4MDAwMywKICAgICB9OwogICAgIAogICAgIHVuaW9uIHsKQEAgLTk4OSwxMSArOTg4LDIwIEBACiAgICAgICAgIHJldHVybiBkaWZmczsKICAgICB9CiAgICAgCi0gICAgLy8gUmV0dXJuIHRydWUgaWYgJ3RoaXMnIGlzIG1vcmUgc3BlY2lmaWMgdGhhbiAnbycuCisgICAgLy8gUmV0dXJuIHRydWUgaWYgJ3RoaXMnIGlzIG1vcmUgc3BlY2lmaWMgdGhhbiAnbycuICBPcHRpb25hbGx5LCBpZgorICAgIC8vICdyZXF1ZXN0ZWQnIGlzIG51bGwsIHRoZW4gdGhleSB3aWxsIGFsc28gYmUgY29tcGFyZWQgYWdhaW5zdCB0aGUKKyAgICAvLyByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbiBhbmQgdHJ1ZSB3aWxsIG9ubHkgYmUgcmV0dXJuZWQgaWYgJ3RoaXMnCisgICAgLy8gaXMgYSBiZXR0ZXIgY2FuZGlkYXRlIHRoYW4gJ28nIGZvciB0aGUgY29uZmlndXJhdGlvbi4gIFRoaXMgYXNzdW1lcyB0aGF0CisgICAgLy8gbWF0Y2goKSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgdG8gcmVtb3ZlIGFueSBjb25maWd1cmF0aW9ucyB0aGF0IGRvbid0CisgICAgLy8gbWF0Y2ggdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIGF0IGFsbDsgaWYgdGhleSBhcmUgbm90IGZpcnN0IGZpbHRlcmVkLAorICAgIC8vIG5vbi1tYXRjaGluZyByZXN1bHRzIGNhbiBiZSBjb25zaWRlcmVkIGJldHRlciB0aGFuIG1hdGNoaW5nIG9uZXMuCiAgICAgaW5saW5lIGJvb2wKICAgICBpc0JldHRlclRoYW4oY29uc3QgUmVzVGFibGVfY29uZmlnJiBvLCBjb25zdCBSZXNUYWJsZV9jb25maWcqIHJlcXVlc3RlZCA9IE5VTEwpIGNvbnN0IHsKKyAgICAgICAgLy8gVGhlIG9yZGVyIG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgZGVmaW5lcyB0aGUgaW1wb3J0YW5jZSBvZiBvbmUKKyAgICAgICAgLy8gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgb3ZlciBhbm90aGVyLiAgVGhvc2UgdGVzdHMgZmlyc3QgYXJlIG1vcmUKKyAgICAgICAgLy8gaW1wb3J0YW50LCB0cnVtcGluZyBhbnkgdmFsdWVzIGluIHRob3NlIGZvbGxvd2luZyB0aGVtLgogICAgICAgICBpZiAoaW1zaSAhPSAwICYmICghcmVxdWVzdGVkIHx8IHJlcXVlc3RlZC0+aW1zaSAhPSAwKSkgewotICAgICAgICAgICAgaWYgKG1jYyAhPSAwICYmICghcmVxdWVzdGVkIHx8IHJlcXVlc3RlZC0+bWNjIT0gMCkpIHsKKyAgICAgICAgICAgIGlmIChtY2MgIT0gMCAmJiAoIXJlcXVlc3RlZCB8fCByZXF1ZXN0ZWQtPm1jYyAhPSAwKSkgewogICAgICAgICAgICAgICAgIGlmIChvLm1jYyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KQEAgLTEwMzQsOSArMTA0MiwyNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dCAhPSAwICYmICghcmVxdWVzdGVkIHx8IHJlcXVlc3RlZC0+aW5wdXQgIT0gMCkpIHsKLSAgICAgICAgICAgIGlmICgoaW5wdXRGbGFncyZNQVNLX0tFWVNISURERU4pICE9IDAgJiYgKCFyZXF1ZXN0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChyZXF1ZXN0ZWQtPmlucHV0RmxhZ3MmTUFTS19LRVlTSElEREVOKSAhPSAwKSkgewotICAgICAgICAgICAgICAgIGlmICgoby5pbnB1dEZsYWdzJk1BU0tfS0VZU0hJRERFTikgPT0gMCkgeworICAgICAgICAgICAgY29uc3QgaW50IGtleXNIaWRkZW4gPSBpbnB1dEZsYWdzJk1BU0tfS0VZU0hJRERFTjsKKyAgICAgICAgICAgIGNvbnN0IGludCByZXFLZXlzSGlkZGVuID0gcmVxdWVzdGVkCisgICAgICAgICAgICAgICAgICAgID8gcmVxdWVzdGVkLT5pbnB1dEZsYWdzJk1BU0tfS0VZU0hJRERFTiA6IDA7CisgICAgICAgICAgICBpZiAoa2V5c0hpZGRlbiAhPSAwICYmIHJlcUtleXNIaWRkZW4gIT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBvS2V5c0hpZGRlbiA9IG8uaW5wdXRGbGFncyZNQVNLX0tFWVNISURERU47CisgICAgICAgICAgICAgICAgLy9MT0dJKCJpc0JldHRlclRoYW4ga2V5c0hpZGRlbjogY3VyPSVkLCBnaXZlbj0lZCwgY29uZmlnPSVkXG4iLAorICAgICAgICAgICAgICAgIC8vICAgICAgICBrZXlzSGlkZGVuLCBvS2V5c0hpZGRlbiwgcmVxS2V5c0hpZGRlbik7CisgICAgICAgICAgICAgICAgaWYgKG9LZXlzSGlkZGVuID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy9MT0dJKCJCZXR0ZXIgYmVjYXVzZSAwISIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRm9yIGNvbXBhdGliaWxpdHksIHdlIGNvdW50IEtFWVNISURERU5fTk8gYXMgYmVpbmcKKyAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSBhcyBLRVlTSElEREVOX1NPRlQuICBIZXJlIHdlIGRpc2FtYmlndWF0ZSB0aGVzZQorICAgICAgICAgICAgICAgIC8vIG1heSBtYWtpbmcgYW4gZXhhY3QgbWF0Y2ggbW9yZSBzcGVjaWZpYy4KKyAgICAgICAgICAgICAgICBpZiAoa2V5c0hpZGRlbiA9PSByZXFLZXlzSGlkZGVuICYmIG9LZXlzSGlkZGVuICE9IHJlcUtleXNIaWRkZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBpcyBhbiBleGFjdCBtYXRjaCwgYW5kCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBnaXZlbiBvbmUgaXMgbm90LCBzbyB0aGUgY3VycmVudCBvbmUgaXMgYmV0dGVyLgorICAgICAgICAgICAgICAgICAgICAvL0xPR0koIkJldHRlciBiZWNhdXNlIG90aGVyIG5vdCBzYW1lISIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMDc4LDcgKzExMDEsOCBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIAotICAgIC8vIFJldHVybiB0cnVlIGlmICd0aGlzJyBtYXRjaGVzIHRoZSBwYXJhbWV0ZXJzIGluICdzZXR0aW5ncycuCisgICAgLy8gUmV0dXJuIHRydWUgaWYgJ3RoaXMnIGNhbiBiZSBjb25zaWRlcmVkIGEgbWF0Y2ggZm9yIHRoZSBwYXJhbWV0ZXJzIGluCisgICAgLy8gJ3NldHRpbmdzJy4KICAgICBpbmxpbmUgYm9vbCBtYXRjaChjb25zdCBSZXNUYWJsZV9jb25maWcmIHNldHRpbmdzKSBjb25zdCB7CiAgICAgICAgIGlmIChpbXNpICE9IDApIHsKICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5tY2MgIT0gMCAmJiBtY2MgIT0gMApAQCAtMTEyMSw3ICsxMTQ1LDE0IEBACiAgICAgICAgICAgICBjb25zdCBpbnQgc2V0S2V5c0hpZGRlbiA9IHNldHRpbmdzLmlucHV0RmxhZ3MmTUFTS19LRVlTSElEREVOOwogICAgICAgICAgICAgaWYgKHNldEtleXNIaWRkZW4gIT0gMCAmJiBrZXlzSGlkZGVuICE9IDAKICAgICAgICAgICAgICAgICAmJiBrZXlzSGlkZGVuICE9IHNldEtleXNIaWRkZW4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgLy8gRm9yIGNvbXBhdGliaWxpdHksIHdlIGNvdW50IGEgcmVxdWVzdCBmb3IgS0VZU0hJRERFTl9OTyBhcyBhbHNvCisgICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgdGhlIG1vcmUgcmVjZW50IEtFWVNISURERU5fU09GVC4gIEJhc2ljYWxseQorICAgICAgICAgICAgICAgIC8vIEtFWVNISURERU5fTk8gbWVhbnMgdGhlcmUgaXMgc29tZSBraW5kIG9mIGtleWJvYXJkIGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICAvL0xPR0koIk1hdGNoaW5nIGtleXNIaWRkZW46IGhhdmU9JWQsIGNvbmZpZz0lZFxuIiwga2V5c0hpZGRlbiwgc2V0S2V5c0hpZGRlbik7CisgICAgICAgICAgICAgICAgaWYgKGtleXNIaWRkZW4gIT0gS0VZU0hJRERFTl9OTyB8fCBzZXRLZXlzSGlkZGVuICE9IEtFWVNISURERU5fU09GVCkgeworICAgICAgICAgICAgICAgICAgICAvL0xPR0koIk5vIG1hdGNoISIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHNldHRpbmdzLmtleWJvYXJkICE9IDAgJiYga2V5Ym9hcmQgIT0gMAogICAgICAgICAgICAgICAgICYmIGtleWJvYXJkICE9IHNldHRpbmdzLmtleWJvYXJkKSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL1RpbWVVdGlscy5oIGIvaW5jbHVkZS91dGlscy9UaW1lVXRpbHMuaAppbmRleCAzMGU1MzMwLi5iMTllMDIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3V0aWxzL1RpbWVVdGlscy5oCisrKyBiL2luY2x1ZGUvdXRpbHMvVGltZVV0aWxzLmgKQEAgLTE3LDEwICsxNywxMSBAQAogI2lmbmRlZiBBTkRST0lEX1RJTUVfSAogI2RlZmluZSBBTkRST0lEX1RJTUVfSAogCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGN1dGlscy90enRpbWUuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIApAQCAtNTgsNyArNTksNyBAQAogICAgIFRpbWUoKTsKIAogICAgIHZvaWQgc3dpdGNoVGltZXpvbmUoY29uc3QgY2hhciAqdGltZXpvbmUpOwotICAgIFN0cmluZzggZm9ybWF0KGNvbnN0IGNoYXIgKmZvcm1hdCkgY29uc3Q7CisgICAgU3RyaW5nOCBmb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0LCBjb25zdCBzdHJ1Y3Qgc3RyZnRpbWVfbG9jYWxlICpsb2NhbGUpIGNvbnN0OwogICAgIHZvaWQgZm9ybWF0MjQ0NShzaG9ydCogYnVmLCBib29sIGhhc1RpbWUpIGNvbnN0OwogICAgIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdDsKICAgICB2b2lkIHNldFRvTm93KCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL3N0cmluZ19hcnJheS5oIGIvaW5jbHVkZS91dGlscy9zdHJpbmdfYXJyYXkuaAppbmRleCBlZGUwNjQ0Li4wNjRkZGEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3V0aWxzL3N0cmluZ19hcnJheS5oCisrKyBiL2luY2x1ZGUvdXRpbHMvc3RyaW5nX2FycmF5LmgKQEAgLTExMSw2ICsxMTEsMTkgQEAKICAgICAgICAgcmV0dXJuIG1BcnJheVtpZHhdOwogICAgIH0KIAorICAgIC8vCisgICAgLy8gU2V0IGVudHJ5IE4gdG8gc3BlY2lmaWVkIHN0cmluZy4KKyAgICAvLyBbc2hvdWxkIHVzZSBvcGVyYXRvcltdIGhlcmVdCisgICAgLy8KKyAgICB2b2lkIHNldEVudHJ5KGludCBpZHgsIGNvbnN0IGNoYXIqIHN0cikgeworICAgICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gbUN1cnJlbnQpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGRlbGV0ZVtdIG1BcnJheVtpZHhdOworICAgICAgICBpbnQgbGVuID0gc3RybGVuKHN0cik7CisgICAgICAgIG1BcnJheVtpZHhdID0gbmV3IGNoYXJbbGVuKzFdOworICAgICAgICBtZW1jcHkobUFycmF5W2lkeF0sIHN0ciwgbGVuKzEpOworICAgIH0KKwogcHJpdmF0ZToKICAgICBpbnQgICAgIG1NYXg7CiAgICAgaW50ICAgICBtQ3VycmVudDsKZGlmZiAtLWdpdCBhL2xpYnMvYXVkaW9mbGluZ2VyL0EyZHBBdWRpb0ludGVyZmFjZS5jcHAgYi9saWJzL2F1ZGlvZmxpbmdlci9BMmRwQXVkaW9JbnRlcmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NDc5NWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2F1ZGlvZmxpbmdlci9BMmRwQXVkaW9JbnRlcmZhY2UuY3BwCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQTJkcEF1ZGlvSW50ZXJmYWNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgIkEyZHBBdWRpb0ludGVyZmFjZS5oIgorI2luY2x1ZGUgImF1ZGlvL2xpYmEyZHAuaCIKKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQTJkcEF1ZGlvSW50ZXJmYWNlOjpBMmRwQXVkaW9JbnRlcmZhY2UoKSA6CisgICAgbU91dHB1dCgwKQoreworfQorCitBMmRwQXVkaW9JbnRlcmZhY2U6On5BMmRwQXVkaW9JbnRlcmZhY2UoKQoreworICAgIGRlbGV0ZSBtT3V0cHV0OworfQorCitzdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OmluaXRDaGVjaygpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK0F1ZGlvU3RyZWFtT3V0KiBBMmRwQXVkaW9JbnRlcmZhY2U6Om9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgIGludCBmb3JtYXQsIGludCBjaGFubmVsQ291bnQsIHVpbnQzMl90IHNhbXBsZVJhdGUsIHN0YXR1c190ICpzdGF0dXMpCit7CisgICAgTE9HRCgiQTJkcEF1ZGlvSW50ZXJmYWNlOjpvcGVuT3V0cHV0U3RyZWFtICVkLCAlZCwgJWRcbiIsIGZvcm1hdCwgY2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgc3RhdHVzX3QgZXJyID0gMDsKKworICAgIC8vIG9ubHkgb25lIG91dHB1dCBzdHJlYW0gYWxsb3dlZAorICAgIGlmIChtT3V0cHV0KSB7CisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICAqc3RhdHVzID0gLTE7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIGNyZWF0ZSBuZXcgb3V0cHV0IHN0cmVhbQorICAgIEEyZHBBdWRpb1N0cmVhbU91dCogb3V0ID0gbmV3IEEyZHBBdWRpb1N0cmVhbU91dCgpOworICAgIGlmICgoZXJyID0gb3V0LT5zZXQoZm9ybWF0LCBjaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpKSA9PSBOT19FUlJPUikgeworICAgICAgICBtT3V0cHV0ID0gb3V0OworICAgIH0gZWxzZSB7CisgICAgICAgIGRlbGV0ZSBvdXQ7CisgICAgfQorICAgIAorICAgIGlmIChzdGF0dXMpCisgICAgICAgICpzdGF0dXMgPSBlcnI7CisgICAgcmV0dXJuIG1PdXRwdXQ7Cit9CisKK0F1ZGlvU3RyZWFtSW4qIEEyZHBBdWRpb0ludGVyZmFjZTo6b3BlbklucHV0U3RyZWFtKAorICAgICAgICBpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbENvdW50LCB1aW50MzJfdCBzYW1wbGVSYXRlLCBzdGF0dXNfdCAqc3RhdHVzKQoreworICAgIGlmIChzdGF0dXMpCisgICAgICAgICpzdGF0dXMgPSAtMTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpzdGFuZGJ5KCkKK3sKKyAgICByZXR1cm4gMDsKK30KKworc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6Z2V0TWljTXV0ZShib29sKiBzdGF0ZSkKK3sKKyAgICByZXR1cm4gMDsKK30KKworc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpzZXRQYXJhbWV0ZXIoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgICBMT0dEKCJzZXRQYXJhbWV0ZXIgJXMsJXNcbiIsIGtleSwgdmFsdWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHYpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHYpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6ZG9Sb3V0aW5nKCkKK3sKKyAgICByZXR1cm4gMDsKK30KKworc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3sKKyAgICByZXR1cm4gMDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6QTJkcEF1ZGlvU3RyZWFtT3V0KCkgOgorICAgIG1GZCgtMSksIG1TdGFydENvdW50KDApLCBtUmV0cnlDb3VudCgwKSwgbURhdGEoTlVMTCksCisgICAgbUluaXRpYWxpemVkKGZhbHNlKSwgbUJ1ZmZlclJlbWFpbmluZygwKQoreworfQorCitzdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6c2V0KAorICAgICAgICBpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbHMsIHVpbnQzMl90IHJhdGUpCit7CisgICAgTE9HRCgiQTJkcEF1ZGlvU3RyZWFtT3V0OjpzZXQgJWQsICVkLCAlZFxuIiwgZm9ybWF0LCBjaGFubmVscywgcmF0ZSk7CisKKyAgICAvLyBmaXggdXAgZGVmYXVsdHMKKyAgICBpZiAoZm9ybWF0ID09IDApIGZvcm1hdCA9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUOworICAgIGlmIChjaGFubmVscyA9PSAwKSBjaGFubmVscyA9IGNoYW5uZWxDb3VudCgpOworICAgIGlmIChyYXRlID09IDApIHJhdGUgPSBzYW1wbGVSYXRlKCk7CisKKyAgICAvLyBjaGVjayB2YWx1ZXMKKyAgICBpZiAoKGZvcm1hdCAhPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCkgfHwKKyAgICAgICAgICAgIChjaGFubmVscyAhPSBjaGFubmVsQ291bnQoKSkgfHwKKyAgICAgICAgICAgIChyYXRlICE9IHNhbXBsZVJhdGUoKSkpCisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK0EyZHBBdWRpb0ludGVyZmFjZTo6QTJkcEF1ZGlvU3RyZWFtT3V0Ojp+QTJkcEF1ZGlvU3RyZWFtT3V0KCkKK3sKKyAgICBpZiAobURhdGEpCisgICAgICAgIGEyZHBfY2xlYW51cChtRGF0YSk7Cit9CisKK3NzaXplX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpBMmRwQXVkaW9TdHJlYW1PdXQ6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ5dGVzKQoreyAgICAKKyAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICBpbnQgcmV0ID0gYTJkcF9pbml0KCIwMDowMDowMDowMDowMDowMCIsIDQ0MTAwLCAyLCAmbURhdGEpOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgc2l6ZV90IHJlbWFpbmluZyA9IGJ5dGVzOworICAgIHdoaWxlIChyZW1haW5pbmcgPiAwKSB7CisgICAgICAgIGludCB3cml0dGVuID0gYTJkcF93cml0ZShtRGF0YSwgYnVmZmVyLCByZW1haW5pbmcpOyAgICAgICAgCisgICAgICAgIHJlbWFpbmluZyAtPSB3cml0dGVuOworICAgICAgICBidWZmZXIgPSAoKGNoYXIgKilidWZmZXIpICsgd3JpdHRlbjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIGJ5dGVzOworfQorCitzdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6c3RhbmRieSgpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6QTJkcEF1ZGlvU3RyZWFtT3V0OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3sKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvYXVkaW9mbGluZ2VyL0EyZHBBdWRpb0ludGVyZmFjZS5oIGIvbGlicy9hdWRpb2ZsaW5nZXIvQTJkcEF1ZGlvSW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiZjkzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXVkaW9mbGluZ2VyL0EyZHBBdWRpb0ludGVyZmFjZS5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBMkRQX0FVRElPX0hBUkRXQVJFX0gKKyNkZWZpbmUgQTJEUF9BVURJT19IQVJEV0FSRV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL0F1ZGlvSGFyZHdhcmVCYXNlLmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBMmRwQXVkaW9JbnRlcmZhY2UgOiBwdWJsaWMgQXVkaW9IYXJkd2FyZUJhc2UKK3sKKyAgICBjbGFzcyBBMmRwQXVkaW9TdHJlYW1PdXQ7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIEEyZHBBdWRpb0ludGVyZmFjZSgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfkEyZHBBdWRpb0ludGVyZmFjZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFuZGJ5KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKKworICAgIC8vIG1pYyBtdXRlCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0TWljTXV0ZShib29sKiBzdGF0ZSk7CisKKyAgICAvLyBUZW1wb3JhcnkgaW50ZXJmYWNlLCBkbyBub3QgdXNlCisgICAgLy8gVE9ETzogUmVwbGFjZSB3aXRoIGEgbW9yZSBnZW5lcmljIGtleTp2YWx1ZSBnZXQvc2V0IG1lY2hhbmlzbQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVyKGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpOworCisgICAgLy8gY3JlYXRlIEkvTyBzdHJlYW1zCisgICAgdmlydHVhbCBBdWRpb1N0cmVhbU91dCogb3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdD0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50PTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGU9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cz0wKTsKKworICAgIHZpcnR1YWwgQXVkaW9TdHJlYW1Jbiogb3BlbklucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZG9Sb3V0aW5nKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgQTJkcEF1ZGlvU3RyZWFtT3V0IDogcHVibGljIEF1ZGlvU3RyZWFtT3V0IHsKKyAgICBwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQTJkcEF1ZGlvU3RyZWFtT3V0KCk7CisgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfkEyZHBBdWRpb1N0cmVhbU91dCgpOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldChpbnQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlKTsKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gNDQxMDA7IH0KKyAgICAgICAgLy8gbXVzdCBiZSAzMi1iaXQgYWxpZ25lZCAtIGRyaXZlciBvbmx5IHNlZW1zIHRvIGxpa2UgNDgwMAorICAgICAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGJ1ZmZlclNpemUoKSBjb25zdCB7IHJldHVybiA1MTIwOyB9CisgICAgICAgIHZpcnR1YWwgaW50ICAgICAgICAgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gMjsgfQorICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgIGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUOyB9CisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgICAgbGF0ZW5jeSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQorICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ5dGVzKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzdGFuZGJ5KCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICBtRmQ7CisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbVN0YXJ0Q291bnQ7CisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbVJldHJ5Q291bnQ7CisgICAgICAgICAgICAgICAgdm9pZCogICAgICAgbURhdGE7CisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgbUluaXRpYWxpemVkOworCisjZGVmaW5lIGtCdWZmZXJTaXplIDUwMDAwCisgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcltrQnVmZmVyU2l6ZV07CisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclJlbWFpbmluZzsKKyAgICB9OworCisgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CisgICAgQTJkcEF1ZGlvU3RyZWFtT3V0KiAgICAgbU91dHB1dDsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEEyRFBfQVVESU9fSEFSRFdBUkVfSApkaWZmIC0tZ2l0IGEvbGlicy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tayBiL2xpYnMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKaW5kZXggYTljYjMwMy4uZDE2ZTNlMSAxMDA2NDQKLS0tIGEvbGlicy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5taworKysgYi9saWJzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCkBAIC00NSw5ICs0NSwxMiBAQAogCiBMT0NBTF9NT0RVTEU6PSBsaWJhdWRpb2ZsaW5nZXIKIAotaWZlcSAoJChUQVJHRVRfQVJDSCksYXJtKSAgIyBub3Qgc2ltdWxhdG9yCi0gIExPQ0FMX0NGTEFHUyArPSAtRFdJVEhfQkxVRVRPT1RICitpZmVxICgkKEJPQVJEX0hBVkVfQkxVRVRPT1RIKSx0cnVlKQorICBMT0NBTF9TUkNfRklMRVMgKz0gQTJkcEF1ZGlvSW50ZXJmYWNlLmNwcAorICBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmEyZHAKKyAgTE9DQUxfQ0ZMQUdTICs9IC1EV0lUSF9CTFVFVE9PVEggLURXSVRIX0EyRFAKICAgTE9DQUxfQ19JTkNMVURFUyArPSAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYmx1ZXotbGlicykKKyAgTE9DQUxfQ19JTkNMVURFUyArPSAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYmx1ZXotdXRpbHMpCiBlbmRpZgogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0R1bXBJbnRlcmZhY2UuY3BwIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmNwcAppbmRleCA1ZmYyZjE4Li44ZWVlOWNjIDEwMDY0NAotLS0gYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0R1bXBJbnRlcmZhY2UuY3BwCisrKyBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvRHVtcEludGVyZmFjZS5jcHAKQEAgLTIsMTYgKzIsMTYgQEAKICoqCiAqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KIApAQCAtMjgsNiArMjgsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2Jvb2wgZ0ZpcnN0ID0gdHJ1ZTsgICAgICAgLy8gdHJ1ZSBpZiBmaXJzdCB3cml0ZSBhZnRlciBhIHN0YW5kYnkKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb0R1bXBJbnRlcmZhY2U6OkF1ZGlvRHVtcEludGVyZmFjZShBdWRpb0hhcmR3YXJlSW50ZXJmYWNlKiBodykKQEAgLTQwLDE3ICs0MiwyNSBAQAogfQogCiAKK0F1ZGlvRHVtcEludGVyZmFjZTo6fkF1ZGlvRHVtcEludGVyZmFjZSgpCit7CisgICAgaWYobUZpbmFsSW50ZXJmYWNlKSBkZWxldGUgbUZpbmFsSW50ZXJmYWNlOworICAgIGlmKG1TdHJlYW1PdXQpIGRlbGV0ZSBtU3RyZWFtT3V0OworfQorCisKIHN0YXR1c190IEF1ZGlvRHVtcEludGVyZmFjZTo6c3RhbmRieSgpCiB7CiAgICAgaWYobVN0cmVhbU91dCkgIG1TdHJlYW1PdXQtPkNsb3NlKCk7CisgICAgZ0ZpcnN0ID0gdHJ1ZTsKICAgICByZXR1cm4gbUZpbmFsSW50ZXJmYWNlLT5zdGFuZGJ5KCk7CiB9CiAKIAogQXVkaW9TdHJlYW1PdXQqIEF1ZGlvRHVtcEludGVyZmFjZTo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgaW50IGZvcm1hdCwgaW50IGNoYW5uZWxDb3VudCwgdWludDMyX3Qgc2FtcGxlUmF0ZSkKKyAgICAgICAgaW50IGZvcm1hdCwgaW50IGNoYW5uZWxDb3VudCwgdWludDMyX3Qgc2FtcGxlUmF0ZSwgc3RhdHVzX3QgKnN0YXR1cykKIHsKLSAgICBBdWRpb1N0cmVhbU91dCogb3V0RmluYWwgPSBtRmluYWxJbnRlcmZhY2UtPm9wZW5PdXRwdXRTdHJlYW0oZm9ybWF0LCBjaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOworICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRGaW5hbCA9IG1GaW5hbEludGVyZmFjZS0+b3Blbk91dHB1dFN0cmVhbShmb3JtYXQsIGNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgc3RhdHVzKTsKIAogICAgIGlmKG91dEZpbmFsKSB7CiAgICAgICAgIG1TdHJlYW1PdXQgPSAgbmV3IEF1ZGlvU3RyZWFtT3V0RHVtcChvdXRGaW5hbCk7CkBAIC02OSwxMyArNzksMjYgQEAKICAgICBtT3V0RmlsZSA9IDA7CiB9CiAKKworQXVkaW9TdHJlYW1PdXREdW1wOjp+QXVkaW9TdHJlYW1PdXREdW1wKCkKK3sKKyAgICBDbG9zZSgpOworICAgIGRlbGV0ZSBtRmluYWxTdHJlYW07Cit9CisKIHNzaXplX3QgQXVkaW9TdHJlYW1PdXREdW1wOjp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBieXRlcykKIHsKICAgICBzc2l6ZV90IHJldDsKLSAgICAKKwogICAgIHJldCA9IG1GaW5hbFN0cmVhbS0+d3JpdGUoYnVmZmVyLCBieXRlcyk7Ci0gICAgaWYoIW1PdXRGaWxlKSB7Ci0gICAgICAgIG1PdXRGaWxlID0gZm9wZW4oRkxJTkdFUl9EVU1QX05BTUUsICJhYiIpOworICAgIGlmKCFtT3V0RmlsZSAmJiBnRmlyc3QpIHsKKyAgICAgICAgZ0ZpcnN0ID0gZmFsc2U7CisgICAgICAgIC8vIGNoZWNrIGlmIGR1bXAgZmlsZSBleGlzdAorICAgICAgICBtT3V0RmlsZSA9IGZvcGVuKEZMSU5HRVJfRFVNUF9OQU1FLCAiciIpOworICAgICAgICBpZihtT3V0RmlsZSkgeworICAgICAgICAgICAgZmNsb3NlKG1PdXRGaWxlKTsKKyAgICAgICAgICAgIG1PdXRGaWxlID0gZm9wZW4oRkxJTkdFUl9EVU1QX05BTUUsICJhYiIpOworICAgICAgICB9CiAgICAgfQogICAgIGlmIChtT3V0RmlsZSkgewogICAgICAgICBmd3JpdGUoYnVmZmVyLCBieXRlcywgMSwgbU91dEZpbGUpOwpkaWZmIC0tZ2l0IGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmggYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0R1bXBJbnRlcmZhY2UuaAppbmRleCA3MzJiOTdkLi5hNjVlNTZhIDEwMDY0NAotLS0gYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0R1bXBJbnRlcmZhY2UuaAorKysgYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0R1bXBJbnRlcmZhY2UuaApAQCAtMiwxNiArMiwxNiBAQAogKioKICoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCkBAIC0yMSwzMyArMjEsMzUgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgPGhhcmR3YXJlL0F1ZGlvSGFyZHdhcmVJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9BdWRpb0hhcmR3YXJlQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLSNkZWZpbmUgRkxJTkdFUl9EVU1QX05BTUUgIi90bXAvRmxpbmdlck91dC5wY20iIC8vIG5hbWUgb2YgZmlsZSB1c2VkIGZvciBkdW1wCisjZGVmaW5lIEZMSU5HRVJfRFVNUF9OQU1FICIvZGF0YS9GbGluZ2VyT3V0LnBjbSIgLy8gbmFtZSBvZiBmaWxlIHVzZWQgZm9yIGR1bXAKIAogY2xhc3MgQXVkaW9TdHJlYW1PdXREdW1wIDogcHVibGljIEF1ZGlvU3RyZWFtT3V0IHsKIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0RHVtcCggQXVkaW9TdHJlYW1PdXQqIEZpbmFsU3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH5BdWRpb1N0cmVhbU91dER1bXAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgd3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgYnl0ZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgCisKICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtRmluYWxTdHJlYW0tPnNhbXBsZVJhdGUoKTsgfQogICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1GaW5hbFN0cmVhbS0+YnVmZmVyU2l6ZSgpOyB9CiAgICAgdmlydHVhbCBpbnQgICAgICAgICBjaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtRmluYWxTdHJlYW0tPmNoYW5uZWxDb3VudCgpOyB9CiAgICAgdmlydHVhbCBpbnQgICAgICAgICBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtRmluYWxTdHJlYW0tPmZvcm1hdCgpOyB9CisgICAgdmlydHVhbCB1aW50MzJfdCAgICBsYXRlbmN5KCkgY29uc3QgeyByZXR1cm4gbUZpbmFsU3RyZWFtLT5sYXRlbmN5KCk7IH0KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZvbHVtZShmbG9hdCB2b2x1bWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbUZpbmFsU3RyZWFtLT5zZXRWb2x1bWUodm9sdW1lKTsgfQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsgcmV0dXJuIG1GaW5hbFN0cmVhbS0+ZHVtcChmZCwgYXJncyk7IH0KICAgICB2b2lkICAgICAgICAgICAgICAgIENsb3NlKHZvaWQpOwogCiBwcml2YXRlOgotICAgIEF1ZGlvU3RyZWFtT3V0ICAqbUZpbmFsU3RyZWFtOwotICAgIEZJTEUgICAgICAgICAgICAqbU91dEZpbGU7ICAgICAvLyBvdXRwdXQgZmlsZQorICAgIEF1ZGlvU3RyZWFtT3V0ICAgICAgKm1GaW5hbFN0cmVhbTsKKyAgICBGSUxFICAgICAgICAgICAgICAgICptT3V0RmlsZTsgICAgIC8vIG91dHB1dCBmaWxlCiB9OwogCiAKLWNsYXNzIEF1ZGlvRHVtcEludGVyZmFjZSA6IHB1YmxpYyAgQXVkaW9IYXJkd2FyZUludGVyZmFjZQorY2xhc3MgQXVkaW9EdW1wSW50ZXJmYWNlIDogcHVibGljIEF1ZGlvSGFyZHdhcmVCYXNlCiB7CiAKIHB1YmxpYzoKQEAgLTU2LDEwICs1OCwxMCBAQAogICAgIHZpcnR1YWwgQXVkaW9TdHJlYW1PdXQqIG9wZW5PdXRwdXRTdHJlYW0oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQ9MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudD0wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlPTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXM9MCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+QXVkaW9EdW1wSW50ZXJmYWNlKCk7CiAKLSAgICB2aXJ0dWFsICAgICAgICAgICAgIH5BdWRpb0R1bXBJbnRlcmZhY2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtkZWxldGUgbUZpbmFsSW50ZXJmYWNlO30KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3JldHVybiBtRmluYWxJbnRlcmZhY2UtPmluaXRDaGVjaygpO30KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkKQEAgLTY3LDEzICs2OSw2IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gbUZpbmFsSW50ZXJmYWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKTt9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFJvdXRpbmcoaW50IG1vZGUsIHVpbnQzMl90IHJvdXRlcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIG1GaW5hbEludGVyZmFjZS0+c2V0Um91dGluZyhtb2RlLCByb3V0ZXMpO30KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFJvdXRpbmcoaW50IG1vZGUsIHVpbnQzMl90KiByb3V0ZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAge3JldHVybiBtRmluYWxJbnRlcmZhY2UtPmdldFJvdXRpbmcobW9kZSwgcm91dGVzKTt9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRNb2RlKGludCogbW9kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIG1GaW5hbEludGVyZmFjZS0+Z2V0TW9kZShtb2RlKTt9Ci0gICAgCiAgICAgLy8gbWljIG11dGUKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldE1pY011dGUoYm9vbCBzdGF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIG1GaW5hbEludGVyZmFjZS0+c2V0TWljTXV0ZShzdGF0ZSk7fQpAQCAtODMsMTcgKzc4LDE3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXIoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIG1GaW5hbEludGVyZmFjZS0+c2V0UGFyYW1ldGVyKGtleSwgdmFsdWUpO30KIAotICAgIHZpcnR1YWwgQXVkaW9TdHJlYW1Jbiogb3BlbklucHV0U3RyZWFtKCBpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbENvdW50LCB1aW50MzJfdCBzYW1wbGVSYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gbUZpbmFsSW50ZXJmYWNlLT5vcGVuSW5wdXRTdHJlYW0oIGZvcm1hdCwgY2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKTt9CisgICAgdmlydHVhbCBBdWRpb1N0cmVhbUluKiBvcGVuSW5wdXRTdHJlYW0oIGludCBmb3JtYXQsIGludCBjaGFubmVsQ291bnQsIHVpbnQzMl90IHNhbXBsZVJhdGUsIHN0YXR1c190ICpzdGF0dXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAge3JldHVybiBtRmluYWxJbnRlcmZhY2UtPm9wZW5JbnB1dFN0cmVhbSggZm9ybWF0LCBjaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIHN0YXR1cyk7fQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgeyByZXR1cm4gbUZpbmFsSW50ZXJmYWNlLT5kdW1wU3RhdGUoZmQsIGFyZ3MpOyB9CiAKIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGRvUm91dGluZygpIHtyZXR1cm4gMDt9Ci0gICAgCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkb1JvdXRpbmcoKSB7cmV0dXJuIG1GaW5hbEludGVyZmFjZS0+c2V0Um91dGluZyhtTW9kZSwgbVJvdXRlc1ttTW9kZV0pO30KKwogICAgIEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UgICptRmluYWxJbnRlcmZhY2U7CiAgICAgQXVkaW9TdHJlYW1PdXREdW1wICAgICAgKm1TdHJlYW1PdXQ7Ci0gICAgCisKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCBmYjIxNjI5Li41M2IxOGFkIDEwMDY0NAotLS0gYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCisrKyBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKQEAgLTMxLDYgKzMxLDggQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZWNvcmQuaD4KIApAQCAtNDEsOSArNDMsMTMgQEAKICNpbmNsdWRlICJBdWRpb01peGVyLmgiCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCiAKKyNpZmRlZiBXSVRIX0EyRFAKKyNpbmNsdWRlICJBMmRwQXVkaW9JbnRlcmZhY2UuaCIKKyNlbmRpZgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtTdGFuZGJ5VGltZUluTnNlY3MgPSBzZWNvbmRzKDMpOworLy9zdGF0aWMgY29uc3QgbnNlY3NfdCBrU3RhbmRieVRpbWVJbk5zZWNzID0gc2Vjb25kcygzKTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGtCdWZmZXJSZWNvdmVyeUluVXNlY3MgPSAyMDAwOwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcga01heEJ1ZmZlclJlY292ZXJ5SW5Vc2VjcyA9IDIwMDAwOwogc3RhdGljIGNvbnN0IGZsb2F0IE1BWF9HQUlOID0gNDA5Ni4wZjsKQEAgLTkzLDggKzk5LDkgQEAKIAogQXVkaW9GbGluZ2VyOjpBdWRpb0ZsaW5nZXIoKQogICAgIDogQm5BdWRpb0ZsaW5nZXIoKSwgVGhyZWFkKGZhbHNlKSwKLSAgICAgICAgbU1hc3RlclZvbHVtZSgwKSwgbU1hc3Rlck11dGUodHJ1ZSksCi0gICAgICAgIG1BdWRpb01peGVyKDApLCBtQXVkaW9IYXJkd2FyZSgwKSwgbU91dHB1dCgwKSwgbUF1ZGlvUmVjb3JkVGhyZWFkKDApLAorICAgICAgICBtTWFzdGVyVm9sdW1lKDApLCBtTWFzdGVyTXV0ZSh0cnVlKSwgbUhhcmR3YXJlQXVkaW9NaXhlcigwKSwgbUEyZHBBdWRpb01peGVyKDApLAorICAgICAgICBtQXVkaW9NaXhlcigwKSwgbUF1ZGlvSGFyZHdhcmUoMCksIG1BMmRwQXVkaW9JbnRlcmZhY2UoMCksCisgICAgICAgIG1IYXJkd2FyZU91dHB1dCgwKSwgbUEyZHBPdXRwdXQoMCksIG1PdXRwdXQoMCksIG1BdWRpb1JlY29yZFRocmVhZCgwKSwKICAgICAgICAgbVNhbXBsZVJhdGUoMCksIG1GcmFtZUNvdW50KDApLCBtQ2hhbm5lbENvdW50KDApLCBtRm9ybWF0KDApLAogICAgICAgICBtTWl4QnVmZmVyKDApLCBtTGFzdFdyaXRlVGltZSgwKSwgbU51bVdyaXRlcygwKSwgbU51bURlbGF5ZWRXcml0ZXMoMCksCiAgICAgICAgIG1TdGFuZGJ5KGZhbHNlKSwgbUluV3JpdGUoZmFsc2UpCkBAIC0xMDUsMTcgKzExMiwxNCBAQAogICAgIGlmIChtQXVkaW9IYXJkd2FyZS0+aW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgLy8gb3BlbiAxNi1iaXQgb3V0cHV0IHN0cmVhbSBmb3Igcy93IG1peGVyCiAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX09VVFBVVF9PUEVOOwotICAgICAgICBtT3V0cHV0ID0gbUF1ZGlvSGFyZHdhcmUtPm9wZW5PdXRwdXRTdHJlYW0oQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIG1IYXJkd2FyZU91dHB1dCA9IG1BdWRpb0hhcmR3YXJlLT5vcGVuT3V0cHV0U3RyZWFtKEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklULCAwLCAwLCAmc3RhdHVzKTsKICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKLSAgICAgICAgaWYgKG1PdXRwdXQpIHsKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gbU91dHB1dC0+c2FtcGxlUmF0ZSgpOwotICAgICAgICAgICAgbUNoYW5uZWxDb3VudCA9IG1PdXRwdXQtPmNoYW5uZWxDb3VudCgpOwotICAgICAgICAgICAgbUZvcm1hdCA9IG1PdXRwdXQtPmZvcm1hdCgpOwotICAgICAgICAgICAgbU1peEJ1ZmZlclNpemUgPSBtT3V0cHV0LT5idWZmZXJTaXplKCk7Ci0gICAgICAgICAgICBtRnJhbWVDb3VudCA9IG1NaXhCdWZmZXJTaXplIC8gbUNoYW5uZWxDb3VudCAvIHNpemVvZihpbnQxNl90KTsKLSAgICAgICAgICAgIG1NaXhCdWZmZXIgPSBuZXcgaW50MTZfdFttRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnRdOwotICAgICAgICAgICAgbWVtc2V0KG1NaXhCdWZmZXIsIDAsIG1NaXhCdWZmZXJTaXplKTsKLSAgICAgICAgICAgIG1BdWRpb01peGVyID0gbmV3IEF1ZGlvTWl4ZXIobUZyYW1lQ291bnQsIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgaWYgKG1IYXJkd2FyZU91dHB1dCkgeworICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBtSGFyZHdhcmVPdXRwdXQtPnNhbXBsZVJhdGUoKTsKKyAgICAgICAgICAgIG1IYXJkd2FyZUF1ZGlvTWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihnZXRPdXRwdXRGcmFtZUNvdW50KG1IYXJkd2FyZU91dHB1dCksIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIHNldE91dHB1dChtSGFyZHdhcmVPdXRwdXQpOworCiAgICAgICAgICAgICAvLyBGSVhNRSAtIHRoaXMgc2hvdWxkIGNvbWUgZnJvbSBzZXR0aW5ncwogICAgICAgICAgICAgc2V0TWFzdGVyVm9sdW1lKDEuMGYpOwogICAgICAgICAgICAgc2V0Um91dGluZyhBdWRpb1N5c3RlbTo6TU9ERV9OT1JNQUwsIEF1ZGlvU3lzdGVtOjpST1VURV9TUEVBS0VSLCBBdWRpb1N5c3RlbTo6Uk9VVEVfQUxMKTsKQEAgLTEyNCwyMCArMTI4LDg3IEBACiAgICAgICAgICAgICBzZXRNb2RlKEF1ZGlvU3lzdGVtOjpNT0RFX05PUk1BTCk7CiAgICAgICAgICAgICBtTWFzdGVyTXV0ZSA9IGZhbHNlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgb3V0cHV0IHN0cmVhbSIpOworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgb3V0cHV0IHN0cmVhbSwgc3RhdHVzOiAlZCIsIHN0YXR1cyk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgeworICAgICAgICAKKyNpZmRlZiBXSVRIX0EyRFAKKyAgICAgICAgLy8gQ3JlYXRlIEEyRFAgaW50ZXJmYWNlCisgICAgICAgIG1BMmRwQXVkaW9JbnRlcmZhY2UgPSBuZXcgQTJkcEF1ZGlvSW50ZXJmYWNlKCk7CisgICAgICAgIG1BMmRwT3V0cHV0ID0gbUEyZHBBdWRpb0ludGVyZmFjZS0+b3Blbk91dHB1dFN0cmVhbShBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCwgMCwgMCwgJnN0YXR1cyk7ICAgICAgIAorICAgICAgICBtQTJkcEF1ZGlvTWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihnZXRPdXRwdXRGcmFtZUNvdW50KG1BMmRwT3V0cHV0KSwgbUEyZHBPdXRwdXQtPnNhbXBsZVJhdGUoKSk7CisKKyAgICAgICAgLy8gY3JlYXRlIGEgYnVmZmVyIGJpZyBlbm91Z2ggZm9yIGJvdGggaGFyZHdhcmUgYW5kIEEyRFAgYXVkaW8gb3V0cHV0LgorICAgICAgICBzaXplX3QgaHdGcmFtZUNvdW50ID0gZ2V0T3V0cHV0RnJhbWVDb3VudChtSGFyZHdhcmVPdXRwdXQpOworICAgICAgICBzaXplX3QgYTJkcEZyYW1lQ291bnQgPSBnZXRPdXRwdXRGcmFtZUNvdW50KG1BMmRwT3V0cHV0KTsKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAoaHdGcmFtZUNvdW50ID4gYTJkcEZyYW1lQ291bnQgPyBod0ZyYW1lQ291bnQgOiBhMmRwRnJhbWVDb3VudCk7CisjZWxzZQorICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IGdldE91dHB1dEZyYW1lQ291bnQobUhhcmR3YXJlT3V0cHV0KTsKKyNlbmRpZgorICAgICAgICAvLyBGSVhNRSAtIEN1cnJlbnQgbWl4ZXIgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBzdGVyZW8gb3V0cHV0OiBBbHdheXMKKyAgICAgICAgLy8gQWxsb2NhdGUgYSBzdGVyZW8gYnVmZmVyIGV2ZW4gaWYgSFcgb3V0cHV0IGlzIG1vbm8uCisgICAgICAgIG1NaXhCdWZmZXIgPSBuZXcgaW50MTZfdFtmcmFtZUNvdW50ICogMl07CisgICAgICAgIG1lbXNldChtTWl4QnVmZmVyLCAwLCBmcmFtZUNvdW50ICogMiAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgIAorICAgICAgICAvLyBTdGFydCByZWNvcmQgdGhyZWFkCisgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZCA9IG5ldyBBdWRpb1JlY29yZFRocmVhZChtQXVkaW9IYXJkd2FyZSk7CisgICAgICAgIGlmIChtQXVkaW9SZWNvcmRUaHJlYWQgIT0gMCkgeworICAgICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLT5ydW4oIkF1ZGlvUmVjb3JkVGhyZWFkIiwgUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICB9IGVsc2UgewogICAgICAgICBMT0dFKCJDb3VsZG4ndCBldmVuIGluaXRpYWxpemUgdGhlIHN0dWJiZWQgYXVkaW8gaGFyZHdhcmUhIik7CiAgICAgfQorCisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIC8vIEZJWE1FOiBXaGF0IHByb3BlcnR5IHNob3VsZCB0aGlzIGJlPz8/CisgICAgcHJvcGVydHlfZ2V0KCJyby5hdWRpby5zaWxlbnQiLCB2YWx1ZSwgIjAiKTsKKyAgICBpZiAoYXRvaSh2YWx1ZSkpIHsKKyAgICAgICAgTE9HRCgiU2lsZW5jZSBpcyBnb2xkZW4iKTsKKyAgICAgICAgbU1hc3Rlck11dGUgPSB0cnVlOworICAgIH0KIH0KIAogQXVkaW9GbGluZ2VyOjp+QXVkaW9GbGluZ2VyKCkKIHsKKyAgICBpZiAobUF1ZGlvUmVjb3JkVGhyZWFkICE9IDApIHsKKyAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLT5leGl0KCk7CisgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC5jbGVhcigpOyAgICAgICAgCisgICAgfQogICAgIGRlbGV0ZSBtT3V0cHV0OworICAgIGRlbGV0ZSBtQTJkcE91dHB1dDsKICAgICBkZWxldGUgbUF1ZGlvSGFyZHdhcmU7CisgICAgZGVsZXRlIG1BMmRwQXVkaW9JbnRlcmZhY2U7CiAgICAgZGVsZXRlIFtdIG1NaXhCdWZmZXI7Ci0gICAgZGVsZXRlIG1BdWRpb01peGVyOwotICAgIG1BdWRpb1JlY29yZFRocmVhZC5jbGVhcigpOworICAgIGRlbGV0ZSBtSGFyZHdhcmVBdWRpb01peGVyOworICAgIGRlbGV0ZSBtQTJkcEF1ZGlvTWl4ZXI7Cit9CisgCit2b2lkIEF1ZGlvRmxpbmdlcjo6c2V0T3V0cHV0KEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQpCit7CisgICAgLy8gbG9jayBvbiBtT3V0cHV0TG9jayB0byBwcmV2ZW50IHRocmVhZExvb3AoKSBmcm9tIHN0YXJ2aW5nIHVzCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sMihtT3V0cHV0TG9jayk7CisgICAgCisgICAgLy8gdG8gc3luY2hyb25pemUgd2l0aCB0aHJlYWRMb29wKCkKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgaWYgKG1PdXRwdXQgIT0gb3V0cHV0KSB7CisgICAgICAgIG1TYW1wbGVSYXRlID0gb3V0cHV0LT5zYW1wbGVSYXRlKCk7CisgICAgICAgIG1DaGFubmVsQ291bnQgPSBvdXRwdXQtPmNoYW5uZWxDb3VudCgpOworICAgIAorICAgICAgICAvLyBGSVhNRSAtIEN1cnJlbnQgbWl4ZXIgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBzdGVyZW8gb3V0cHV0CisgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID09IDEpIHsKKyAgICAgICAgICAgIExPR0UoIkludmFsaWQgYXVkaW8gaGFyZHdhcmUgY2hhbm5lbCBjb3VudCIpOworICAgICAgICB9CisgICAgICAgIG1Gb3JtYXQgPSBvdXRwdXQtPmZvcm1hdCgpOworICAgICAgICBtRnJhbWVDb3VudCA9IGdldE91dHB1dEZyYW1lQ291bnQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgbUF1ZGlvTWl4ZXIgPSAob3V0cHV0ID09IG1BMmRwT3V0cHV0ID8gbUEyZHBBdWRpb01peGVyIDogbUhhcmR3YXJlQXVkaW9NaXhlcik7CisgICAgICAgIG1PdXRwdXQgPSBvdXRwdXQ7CisgICAgfQorfQorCitzaXplX3QgQXVkaW9GbGluZ2VyOjpnZXRPdXRwdXRGcmFtZUNvdW50KEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQpIAoreworICAgIHJldHVybiBvdXRwdXQtPmJ1ZmZlclNpemUoKSAvIG91dHB1dC0+Y2hhbm5lbENvdW50KCkgLyBzaXplb2YoaW50MTZfdCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6ZHVtcENsaWVudHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQpAQCAtMjAxLDggKzI3Miw4IEBACiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9NaXhlciB0cmFja3M6ICUwOHhcbiIsIGF1ZGlvTWl4ZXIoKS50cmFja05hbWVzKCkpOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9NaXhlciB0cmFja3M6ICUwOHhcbiIsIGF1ZGlvTWl4ZXIoKS0+dHJhY2tOYW1lcygpKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAibGFzdCB3cml0ZSBvY2N1cnJlZCAobXNlY3MpOiAlbGx1XG4iLCBuczJtcyhzeXN0ZW1UaW1lKCkgLSBtTGFzdFdyaXRlVGltZSkpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKQEAgLTI1NCwxNyArMzI1LDI2IEBACiAvLyBUaHJlYWQgdmlydHVhbHMKIGJvb2wgQXVkaW9GbGluZ2VyOjp0aHJlYWRMb29wKCkKIHsKLSAgICBuc2Vjc190IG1heFBlcmlvZCA9IHNlY29uZHMobUZyYW1lQ291bnQpIC8gbVNhbXBsZVJhdGUgKiAyOwogICAgIHVuc2lnbmVkIGxvbmcgc2xlZXBUaW1lID0ga0J1ZmZlclJlY292ZXJ5SW5Vc2VjczsKLSAgICBjb25zdCBzaXplX3QgbWl4QnVmZmVyU2l6ZSA9IG1GcmFtZUNvdW50Km1DaGFubmVsQ291bnQqc2l6ZW9mKGludDE2X3QpOwogICAgIGludDE2X3QqIGN1ckJ1ZiA9IG1NaXhCdWZmZXI7CiAgICAgVmVjdG9yPCBzcDxUcmFjaz4gPiB0cmFja3NUb1JlbW92ZTsKLSAgICBzaXplX3QgZW5hYmxlZFRyYWNrczsKKyAgICBzaXplX3QgZW5hYmxlZFRyYWNrcyA9IDA7CiAgICAgbnNlY3NfdCBzdGFuZGJ5VGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICBBdWRpb01peGVyKiBtaXhlciA9IDA7CisgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAwOworICAgIGludCBjaGFubmVsQ291bnQgPSAwOworICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAwOworICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQgPSAwOwogCiAgICAgZG8gewogICAgICAgICBlbmFibGVkVHJhY2tzID0gMDsKLSAgICAgICAgeyAvLyBzY29wZSBmb3IgdGhlIGxvY2sKKyAgICAgICAgeyAvLyBzY29wZSBmb3IgdGhlIG1Mb2NrCisgICAgICAgIAorICAgICAgICAgICAgLy8gbG9ja2luZyBicmllZmx5IG9uIHRoZSBzZWNvbmRhcnkgbU91dHB1dExvY2sgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkCisgICAgICAgICAgICAvLyBoYXZpbmcgdGhpcyB0aHJlYWQgc3RhcnZlIHRoZSB0aHJlYWQgdGhhdCBjYWxsZWQgc2V0T3V0cHV0KCkKKyAgICAgICAgICAgIG1PdXRwdXRMb2NrLmxvY2soKTsKKyAgICAgICAgICAgIG1PdXRwdXRMb2NrLnVubG9jaygpOworCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICAgICAgY29uc3QgU29ydGVkVmVjdG9yPCB3cDxUcmFjaz4gPiYgYWN0aXZlVHJhY2tzID0gbUFjdGl2ZVRyYWNrczsKIApAQCAtMjg2LDYgKzM2NiwxNSBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBnZXQgYWN0aXZlIG1peGVyIGFuZCBvdXRwdXQgcGFyYW1ldGVyIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGQgYW5kIGtlZXAgdGhlbQorICAgICAgICAgICAgLy8gY29uc2lzdGVudCB0aWxsIHRoZSBuZXh0IGxvb3AuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1peGVyID0gYXVkaW9NaXhlcigpOworICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OworICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gbUNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIHNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIG91dHB1dCA9IG1PdXRwdXQ7CisgICAgICAgICAgICAKICAgICAgICAgICAgIC8vIGZpbmQgb3V0IHdoaWNoIHRyYWNrcyBuZWVkIHRvIGJlIHByb2Nlc3NlZAogICAgICAgICAgICAgc2l6ZV90IGNvdW50ID0gYWN0aXZlVHJhY2tzLnNpemUoKTsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKQEAgLTI5NCwxMyArMzgzLDExIEBACiAKICAgICAgICAgICAgICAgICBUcmFjayogY29uc3QgdHJhY2sgPSB0LmdldCgpOwogICAgICAgICAgICAgICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IHRyYWNrLT5jYmxrKCk7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgdSA9IGNibGstPnVzZXI7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgcyA9IGNibGstPnNlcnZlcjsKIAogICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCB0aW1lIGEgdHJhY2sgaXMgYWRkZWQgd2Ugd2FpdAogICAgICAgICAgICAgICAgIC8vIGZvciBhbGwgaXRzIGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJlZm9yZSBwcm9jZXNzaW5nIGl0Ci0gICAgICAgICAgICAgICAgYXVkaW9NaXhlcigpLnNldEFjdGl2ZVRyYWNrKHRyYWNrLT5uYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmICgodSA+IHMpICYmICh0cmFjay0+aXNSZWFkeSh1LCBzKSB8fCB0cmFjay0+aXNTdG9wcGVkKCkpICYmCisgICAgICAgICAgICAgICAgbWl4ZXItPnNldEFjdGl2ZVRyYWNrKHRyYWNrLT5uYW1lKCkpOworICAgICAgICAgICAgICAgIGlmIChjYmxrLT5mcmFtZXNSZWFkeSgpICYmICh0cmFjay0+aXNSZWFkeSgpIHx8IHRyYWNrLT5pc1N0b3BwZWQoKSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICF0cmFjay0+aXNQYXVzZWQoKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vTE9HRCgidT0lMDh4LCBzPSUwOHggW09LXSIsIHUsIHMpOwpAQCAtMzI1LDkgKzQxMiw4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAvLyBYWFg6IHRoZXNlIHRoaW5ncyBET04nVCBuZWVkIHRvIGJlIGRvbmUgZWFjaCB0aW1lCi0gICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXImIG1peGVyKGF1ZGlvTWl4ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLnNldEJ1ZmZlclByb3ZpZGVyKHRyYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgbWl4ZXIuZW5hYmxlKEF1ZGlvTWl4ZXI6Ok1JWElORyk7CisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRCdWZmZXJQcm92aWRlcih0cmFjayk7CisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5lbmFibGUoQXVkaW9NaXhlcjo6TUlYSU5HKTsKIAogICAgICAgICAgICAgICAgICAgICBpbnQgcGFyYW07CiAgICAgICAgICAgICAgICAgICAgIGlmICggdHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPT0gVHJhY2s6OkZTX0ZJTExFRCkgewpAQCAtMzQyLDE1ICs0MjgsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtID0gQXVkaW9NaXhlcjo6UkFNUF9WT0xVTUU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWl4ZXIuc2V0UGFyYW1ldGVyKHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUwLCBsZWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgbWl4ZXIuc2V0UGFyYW1ldGVyKHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUxLCByaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgbGVmdCk7CisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIocGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsIHJpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Rk9STUFULCB0cmFjay0+Zm9ybWF0KCkpOwotICAgICAgICAgICAgICAgICAgICBtaXhlci5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfQ09VTlQsIHRyYWNrLT5jaGFubmVsQ291bnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQoY2Jsay0+c2FtcGxlUmF0ZSkpOwpAQCAtMzYxLDggKzQ0Nyw3IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy9MT0dEKCJ1PSUwOHgsIHM9JTA4eCBbTk9UIFJFQURZXSIsIHUsIHMpOwogICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9IFRyYWNrOjpGU19GSUxMSU5HOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1GbGFncyA9IDA7ICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnJlc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSB8fCB0cmFjay0+aXNTdG9wcGVkKCkgfHwgdHJhY2stPmlzUGF1c2VkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgY29uc3VtZWQgYWxsIHRoZSBidWZmZXJzIG9mIHRoaXMgdHJhY2suCkBAIC0zNzgsNyArNDYzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAvLyBMT0dWKCJkaXNhYmxlKCVkKSIsIHRyYWNrLT5uYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBhdWRpb01peGVyKCkuZGlzYWJsZShBdWRpb01peGVyOjpNSVhJTkcpOworICAgICAgICAgICAgICAgICAgICBtaXhlci0+ZGlzYWJsZShBdWRpb01peGVyOjpNSVhJTkcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMzkwLDI2ICs0NzUsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUodHJhY2spOwogICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tzLnJlbW92ZSh0cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb01peGVyKCkuZGVsZXRlVHJhY2tOYW1lKHRyYWNrLT5tTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+ZGVsZXRlVHJhY2tOYW1lKHRyYWNrLT5tTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQorICAgICAgICAgICAgfSAgCisgICAgICAgfQogICAgICAgICBpZiAoTElLRUxZKGVuYWJsZWRUcmFja3MpKSB7CiAgICAgICAgICAgICAvLyBtaXggYnVmZmVycy4uLgotICAgICAgICAgICAgYXVkaW9NaXhlcigpLnByb2Nlc3MoY3VyQnVmKTsKKyAgICAgICAgICAgIG1peGVyLT5wcm9jZXNzKGN1ckJ1Zik7CiAKICAgICAgICAgICAgIC8vIG91dHB1dCBhdWRpbyB0byBoYXJkd2FyZQogICAgICAgICAgICAgbUxhc3RXcml0ZVRpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgICBtSW5Xcml0ZSA9IHRydWU7Ci0gICAgICAgICAgICBtT3V0cHV0LT53cml0ZShjdXJCdWYsIG1peEJ1ZmZlclNpemUpOworICAgICAgICAgICAgc2l6ZV90IG1peEJ1ZmZlclNpemUgPSBmcmFtZUNvdW50KmNoYW5uZWxDb3VudCpzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICBvdXRwdXQtPndyaXRlKGN1ckJ1ZiwgbWl4QnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICBtTnVtV3JpdGVzKys7CiAgICAgICAgICAgICBtSW5Xcml0ZSA9IGZhbHNlOwogICAgICAgICAgICAgbVN0YW5kYnkgPSBmYWxzZTsKICAgICAgICAgICAgIG5zZWNzX3QgdGVtcCA9IHN5c3RlbVRpbWUoKTsKICAgICAgICAgICAgIHN0YW5kYnlUaW1lID0gdGVtcCArIGtTdGFuZGJ5VGltZUluTnNlY3M7CiAgICAgICAgICAgICBuc2Vjc190IGRlbHRhID0gdGVtcCAtIG1MYXN0V3JpdGVUaW1lOworICAgICAgICAgICAgbnNlY3NfdCBtYXhQZXJpb2QgPSBzZWNvbmRzKGZyYW1lQ291bnQpIC8gc2FtcGxlUmF0ZSAqIDI7CiAgICAgICAgICAgICBpZiAoZGVsdGEgPiBtYXhQZXJpb2QpIHsKICAgICAgICAgICAgICAgICBMT0dXKCJ3cml0ZSBibG9ja2VkIGZvciAlbGx1IG1zZWNzIiwgbnMybXMoZGVsdGEpKTsKICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlcysrOwpAQCAtNDU4LDQzICs1NDQsNjAgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgaW50IGZvcm1hdCwKICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKLSAgICAgICAgaW50IGJ1ZmZlckNvdW50LAotICAgICAgICB1aW50MzJfdCBmbGFncykKKyAgICAgICAgaW50IGZyYW1lQ291bnQsCisgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAorICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogewotICAgIGlmIChzdHJlYW1UeXBlID49IEF1ZGlvVHJhY2s6Ok5VTV9TVFJFQU1fVFlQRVMpIHsKLSAgICAgICAgTE9HRSgiaW52YWxpZCBzdHJlYW0gdHlwZSIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoc2FtcGxlUmF0ZSA+IE1BWF9TQU1QTEVfUkFURSkgewotICAgICAgICBMT0dFKCJTYW1wbGUgcmF0ZSBvdXQgb2YgcmFuZ2U6ICVkIiwgc2FtcGxlUmF0ZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQogICAgIHNwPFRyYWNrPiB0cmFjazsKICAgICBzcDxUcmFja0hhbmRsZT4gdHJhY2tIYW5kbGU7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQotICAgIGlmIChtU2FtcGxlUmF0ZSA9PSAwKSB7Ci0gICAgICAgIExPR0UoIkF1ZGlvIGRyaXZlciBub3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgIHJldHVybiB0cmFja0hhbmRsZTsKLSAgICB9Ci0KICAgICBzcDxDbGllbnQ+IGNsaWVudDsKLSAgICB3cDxDbGllbnQ+IHdjbGllbnQgPSBtQ2xpZW50cy52YWx1ZUZvcihwaWQpOworICAgIHdwPENsaWVudD4gd2NsaWVudDsKKyAgICBzdGF0dXNfdCBsU3RhdHVzOwogCi0gICAgaWYgKHdjbGllbnQgIT0gTlVMTCkgewotICAgICAgICBjbGllbnQgPSB3Y2xpZW50LnByb21vdGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBjbGllbnQgPSBuZXcgQ2xpZW50KHRoaXMsIHBpZCk7Ci0gICAgICAgIG1DbGllbnRzLmFkZChwaWQsIGNsaWVudCk7CisgICAgaWYgKHN0cmVhbVR5cGUgPj0gQXVkaW9UcmFjazo6TlVNX1NUUkVBTV9UWVBFUykgeworICAgICAgICBMT0dFKCJpbnZhbGlkIHN0cmVhbSB0eXBlIik7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKLSAgICAvLyBGSVhNRTogQnVmZmVyIHNpemUgc2hvdWxkIGJlIGJhc2VkIG9uIHNhbXBsZSByYXRlIGZvciBjb25zaXN0ZW50IGxhdGVuY3kKLSAgICB0cmFjayA9IG5ldyBUcmFjayh0aGlzLCBjbGllbnQsIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgIGNoYW5uZWxDb3VudCwgYnVmZmVyQ291bnQsIGNoYW5uZWxDb3VudCA9PSAxID8gbU1peEJ1ZmZlclNpemU+PjEgOiBtTWl4QnVmZmVyU2l6ZSk7Ci0gICAgbVRyYWNrcy5hZGQodHJhY2spOwotICAgIHRyYWNrSGFuZGxlID0gbmV3IFRyYWNrSGFuZGxlKHRyYWNrKTsKKyAgICAvLyBSZXNhbXBsZXIgaW1wbGVtZW50YXRpb24gbGltaXRzIGlucHV0IHNhbXBsaW5nIHJhdGUgdG8gMiB4IG91dHB1dCBzYW1wbGluZyByYXRlLgorICAgIGlmIChzYW1wbGVSYXRlID4gTUFYX1NBTVBMRV9SQVRFIHx8IHNhbXBsZVJhdGUgPiBtU2FtcGxlUmF0ZSoyKSB7CisgICAgICAgIExPR0UoIlNhbXBsZSByYXRlIG91dCBvZiByYW5nZTogJWQiLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgICAgICBpZiAobVNhbXBsZVJhdGUgPT0gMCkgeworICAgICAgICAgICAgTE9HRSgiQXVkaW8gZHJpdmVyIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBOT19JTklUOworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9CisKKyAgICAgICAgd2NsaWVudCA9IG1DbGllbnRzLnZhbHVlRm9yKHBpZCk7CisKKyAgICAgICAgaWYgKHdjbGllbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgY2xpZW50ID0gd2NsaWVudC5wcm9tb3RlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2xpZW50KHRoaXMsIHBpZCk7CisgICAgICAgICAgICBtQ2xpZW50cy5hZGQocGlkLCBjbGllbnQpOworICAgICAgICB9CisKKyAgICAgICAgdHJhY2sgPSBuZXcgVHJhY2sodGhpcywgY2xpZW50LCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsCisgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIpOworICAgICAgICBtVHJhY2tzLmFkZCh0cmFjayk7CisgICAgICAgIHRyYWNrSGFuZGxlID0gbmV3IFRyYWNrSGFuZGxlKHRyYWNrKTsKKworICAgICAgICBsU3RhdHVzID0gTk9fRVJST1I7CisgICAgfQorCitFeGl0OgorICAgIGlmKHN0YXR1cykgeworICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKKyAgICB9CiAgICAgcmV0dXJuIHRyYWNrSGFuZGxlOwogfQogCkBAIC01MTgsNiArNjIxLDE2IEBACiAgICAgcmV0dXJuIG1GcmFtZUNvdW50OwogfQogCit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OmxhdGVuY3koKSBjb25zdAoreworICAgIGlmIChtT3V0cHV0KSB7CisgICAgICAgIHJldHVybiBtT3V0cHV0LT5sYXRlbmN5KCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZhbHVlKQogewogICAgIC8vIGNoZWNrIGNhbGxpbmcgcGVybWlzc2lvbnMKQEAgLTU0OSw2ICs2NjIsMjEgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKKyNpZmRlZiBXSVRIX0EyRFAKKyAgICBMT0dEKCJzZXRSb3V0aW5nICVkICVkICVkXG4iLCBtb2RlLCByb3V0ZXMsIG1hc2spOworICAgIGlmIChtb2RlID09IEF1ZGlvU3lzdGVtOjpNT0RFX05PUk1BTCAmJiAKKyAgICAgICAgICAgIChtYXNrICYgQXVkaW9TeXN0ZW06OlJPVVRFX0JMVUVUT09USF9BMkRQKSkgeworICAgICAgICBpZiAocm91dGVzICYgQXVkaW9TeXN0ZW06OlJPVVRFX0JMVUVUT09USF9BMkRQKSB7CisgICAgICAgICAgICBMT0dEKCJzZXQgb3V0cHV0IHRvIEEyRFBcbiIpOworICAgICAgICAgICAgc2V0T3V0cHV0KG1BMmRwT3V0cHV0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0QoInNldCBvdXRwdXQgdG8gaGFyZHdhcmUgYXVkaW9cbiIpOworICAgICAgICAgICAgc2V0T3V0cHV0KG1IYXJkd2FyZU91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgTE9HRCgic2V0T3V0cHV0IGRvbmVcbiIpOworICAgIH0KKyNlbmRpZgorCiAgICAgQXV0b011dGV4IGxvY2sobUhhcmR3YXJlTG9jayk7CiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfR0VUX1JPVVRJTkc7CiAgICAgdWludDMyX3QgcjsKQEAgLTY1Niw3ICs3ODQsNyBAQAogICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEF1ZGlvVHJhY2s6Ok5VTV9TVFJFQU1fVFlQRVMpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgCisKICAgICBtU3RyZWFtVHlwZXNbc3RyZWFtXS52b2x1bWUgPSB2YWx1ZTsKICAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKICAgICBpZiAoc3RyZWFtID09IEF1ZGlvVHJhY2s6OlZPSUNFX0NBTEwpIHsKQEAgLTc1MCw2ICs4NzgsNyBAQAogICAgICAgICAvLyBidWZmZXJzIGJlZm9yZSBwbGF5aW5nLiBUaGlzIGlzIHRvIGVuc3VyZSB0aGUgY2xpZW50IHdpbGwKICAgICAgICAgLy8gZWZmZWN0aXZlbHkgZ2V0IHRoZSBsYXRlbmN5IGl0IHJlcXVlc3RlZC4KICAgICAgICAgdHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPSBUcmFjazo6RlNfRklMTElORzsKKyAgICAgICAgdHJhY2stPm1SZXNldERvbmUgPSBmYWxzZTsKICAgICAgICAgbUFjdGl2ZVRyYWNrcy5hZGQodHJhY2spOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQpAQCAtNzcxLDcgKzkwMCw3IEBACiAgICAgaWYgKHQhPU5VTEwpIHsKICAgICAgICAgdC0+cmVzZXQoKTsKICAgICB9Ci0gICAgYXVkaW9NaXhlcigpLmRlbGV0ZVRyYWNrTmFtZShuYW1lKTsKKyAgICBhdWRpb01peGVyKCktPmRlbGV0ZVRyYWNrTmFtZShuYW1lKTsKICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZSh0cmFjayk7CiAgICAgbVdhaXRXb3JrQ1YuYnJvYWRjYXN0KCk7CiB9CkBAIC03ODksNyArOTE4LDcgQEAKICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHRyYWNrKSA8IDApIHsKICAgICAgICAgTE9HVigicmVtb3ZlIHRyYWNrICglZCkgYW5kIGRlbGV0ZSBmcm9tIG1peGVyIiwgdHJhY2stPm5hbWUoKSk7CiAgICAgICAgIG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKLSAgICAgICAgYXVkaW9NaXhlcigpLmRlbGV0ZVRyYWNrTmFtZShrZWVwLT5uYW1lKCkpOworICAgICAgICBhdWRpb01peGVyKCktPmRlbGV0ZVRyYWNrTmFtZShrZWVwLT5uYW1lKCkpOwogICAgIH0KIH0KIApAQCAtODIzLDM4ICs5NTIsNTMgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICBpbnQgZm9ybWF0LAogICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgIGludCBidWZmZXJDb3VudCwKLSAgICAgICAgICAgIGludCBidWZmZXJTaXplKQorICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyKQogICAgIDogICBSZWZCYXNlKCksCiAgICAgICAgIG1BdWRpb0ZsaW5nZXIoYXVkaW9GbGluZ2VyKSwKICAgICAgICAgbUNsaWVudChjbGllbnQpLAogICAgICAgICBtU3RyZWFtVHlwZShzdHJlYW1UeXBlKSwKLSAgICAgICAgbUZvcm1hdChmb3JtYXQpLAotICAgICAgICBtQ2hhbm5lbENvdW50KGNoYW5uZWxDb3VudCksCi0gICAgICAgIG1CdWZmZXJDb3VudChidWZmZXJDb3VudCksCi0gICAgICAgIG1GbGFncygwKSwKLSAgICAgICAgbUJ1ZmZlclNpemUoYnVmZmVyU2l6ZSksCisgICAgICAgIG1GcmFtZUNvdW50KDApLAogICAgICAgICBtU3RhdGUoSURMRSksCi0gICAgICAgIG1DbGllbnRUaWQoLTEpCisgICAgICAgIG1DbGllbnRUaWQoLTEpLAorICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgIG1GbGFncygwKQogewotICAgIG1OYW1lID0gYXVkaW9GbGluZ2VyLT5hdWRpb01peGVyKCkuZ2V0VHJhY2tOYW1lKCk7CisgICAgbU5hbWUgPSBhdWRpb0ZsaW5nZXItPmF1ZGlvTWl4ZXIoKS0+Z2V0VHJhY2tOYW1lKCk7CiAgICAgaWYgKG1OYW1lIDwgMCkgewogICAgICAgICBMT0dFKCJubyBtb3JlIHRyYWNrIG5hbWVzIGF2YWlsbGFibGUiKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIExPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICJzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlZCIsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLCBzaGFyZWRCdWZmZXItPnNpemUoKSk7CisKKwogICAgIC8vIExPR0QoIkNyZWF0aW5nIHRyYWNrIHdpdGggJWQgYnVmZmVycyBAICVkIGJ5dGVzIiwgYnVmZmVyQ291bnQsIGJ1ZmZlclNpemUpOwotICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCkgKyBidWZmZXJDb3VudCAqIGJ1ZmZlclNpemU7CisgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOworICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBmcmFtZUNvdW50KmNoYW5uZWxDb3VudCpzaXplb2YoaW50MTZfdCk7CisgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKKyAgICAgICBzaXplICs9IGJ1ZmZlclNpemU7CisgICB9CisKICAgICBtQ2Jsa01lbW9yeSA9IGNsaWVudC0+aGVhcCgpLT5hbGxvY2F0ZShzaXplKTsKICAgICBpZiAobUNibGtNZW1vcnkgIT0gMCkgewogICAgICAgICBtQ2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCAqPihtQ2Jsa01lbW9yeS0+cG9pbnRlcigpKTsKICAgICAgICAgaWYgKG1DYmxrKSB7IC8vIGNvbnN0cnVjdCB0aGUgc2hhcmVkIHN0cnVjdHVyZSBpbi1wbGFjZS4KICAgICAgICAgICAgIG5ldyhtQ2JsaykgYXVkaW9fdHJhY2tfY2Jsa190KCk7CiAgICAgICAgICAgICAvLyBjbGVhciBhbGwgYnVmZmVycwotICAgICAgICAgICAgbUNibGstPnNpemUgPSBidWZmZXJTaXplOworICAgICAgICAgICAgbUNibGstPmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogICAgICAgICAgICAgbUNibGstPnNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwotICAgICAgICAgICAgbUJ1ZmZlcnMgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKLSAgICAgICAgICAgIG1lbXNldChtQnVmZmVycywgMCwgYnVmZmVyQ291bnQgKiBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIG1DYmxrLT5jaGFubmVscyA9IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgeworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKKyAgICAgICAgICAgICAgICBtZW1zZXQobUJ1ZmZlciwgMCwgZnJhbWVDb3VudCpjaGFubmVsQ291bnQqc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAvLyBGb3JjZSB1bmRlcnJ1biBjb25kaXRpb24gdG8gYXZvaWQgZmFsc2UgdW5kZXJydW4gY2FsbGJhY2sgdW50aWwgZmlyc3QgZGF0YSBpcworICAgICAgICAgICAgICAgIC8vIHdyaXR0ZW4gdG8gYnVmZmVyCisgICAgICAgICAgICAgICAgbUNibGstPmZsb3dDb250cm9sRmxhZyA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdWZmZXJFbmQgPSAodWludDhfdCAqKW1CdWZmZXIgKyBidWZmZXJTaXplOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIEF1ZGlvVHJhY2sgc2l6ZT0ldSIsIHNpemUpOwpAQCAtODczLDE1ICsxMDE3LDE2IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6VHJhY2tCYXNlOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewogICAgIGJ1ZmZlci0+cmF3ID0gMDsKLSAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOworICAgIG1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIHN0ZXAoKTsKKyAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOwogfQogCiBib29sIEF1ZGlvRmxpbmdlcjo6VHJhY2tCYXNlOjpzdGVwKCkgewogICAgIGJvb2wgcmVzdWx0OwogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IHRoaXMtPmNibGsoKTsKLSAgICAKLSAgICByZXN1bHQgPSBjYmxrLT5zdGVwU2VydmVyKGJ1ZmZlckNvdW50KCkpOyAKKworICAgIHJlc3VsdCA9IGNibGstPnN0ZXBTZXJ2ZXIobUZyYW1lQ291bnQpOwogICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgIExPR1YoInN0ZXBTZXJ2ZXIgZmFpbGVkIGFjcXVpcmluZyBjYmxrIG11dGV4Iik7CiAgICAgICAgIG1GbGFncyB8PSBTVEVQU0VSVkVSX0ZBSUxFRDsKQEAgLTg5NCw3ICsxMDM5LDEwIEBACiAKICAgICBjYmxrLT51c2VyID0gMDsKICAgICBjYmxrLT5zZXJ2ZXIgPSAwOwotICAgIG1GbGFncyA9IDA7ICAgIAorICAgIGNibGstPnVzZXJCYXNlID0gMDsKKyAgICBjYmxrLT5zZXJ2ZXJCYXNlID0gMDsKKyAgICBtRmxhZ3MgPSAwOworICAgIExPR1YoIlRyYWNrQmFzZTo6cmVzZXQiKTsKIH0KIAogc3A8SU1lbW9yeT4gQXVkaW9GbGluZ2VyOjpUcmFja0Jhc2U6OmdldENibGsoKSBjb25zdApAQCAtOTA2LDYgKzEwNTQsMjcgQEAKICAgICByZXR1cm4gbUNibGstPnNhbXBsZVJhdGU7CiB9CiAKK2ludCBBdWRpb0ZsaW5nZXI6OlRyYWNrQmFzZTo6Y2hhbm5lbENvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtQ2Jsay0+Y2hhbm5lbHM7Cit9CisKK3ZvaWQqIEF1ZGlvRmxpbmdlcjo6VHJhY2tCYXNlOjpnZXRCdWZmZXIodWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBmcmFtZXMpIGNvbnN0IHsKKyAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSB0aGlzLT5jYmxrKCk7CisgICAgaW50MTZfdCAqYnVmZmVyU3RhcnQgPSAoaW50MTZfdCAqKW1CdWZmZXIgKyAob2Zmc2V0LWNibGstPnNlcnZlckJhc2UpKmNibGstPmNoYW5uZWxzOworICAgIGludDE2X3QgKmJ1ZmZlckVuZCA9IGJ1ZmZlclN0YXJ0ICsgZnJhbWVzICogY2Jsay0+Y2hhbm5lbHM7CisKKyAgICAvLyBDaGVjayB2YWxpZGl0eSBvZiByZXR1cm5lZCBwb2ludGVyIGluIGNhc2UgdGhlIHRyYWNrIGNvbnRyb2wgYmxvY2sgd291bGQgaGF2ZSBiZWVuIGNvcnJ1cHRlZC4KKyAgICBpZiAoYnVmZmVyU3RhcnQgPCBtQnVmZmVyIHx8IGJ1ZmZlclN0YXJ0ID4gYnVmZmVyRW5kIHx8IGJ1ZmZlckVuZCA+IG1CdWZmZXJFbmQpIHsKKyAgICAgICAgTE9HVygiVHJhY2tCYXNlOjpnZXRCdWZmZXIgYnVmZmVyIG91dCBvZiByYW5nZTpcbiAgICBzdGFydDogJXAsIGVuZCAlcCAsIG1CdWZmZXIgJXAgbUJ1ZmZlckVuZCAlcFxuICAgIFwKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgJWQsIHNlcnZlckJhc2UgJWQsIHVzZXIgJWQsIHVzZXJCYXNlICVkIiwKKyAgICAgICAgICAgICAgICBidWZmZXJTdGFydCwgYnVmZmVyRW5kLCBtQnVmZmVyLCBtQnVmZmVyRW5kLAorICAgICAgICAgICAgICAgIGNibGstPnNlcnZlciwgY2Jsay0+c2VydmVyQmFzZSwgY2Jsay0+dXNlciwgY2Jsay0+dXNlckJhc2UpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmZmVyU3RhcnQ7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQXVkaW9GbGluZ2VyOjpUcmFjazo6VHJhY2soCkBAIC05MTUsMTMgKzEwODQsMTQgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICBpbnQgZm9ybWF0LAogICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgIGludCBidWZmZXJDb3VudCwKLSAgICAgICAgICAgIGludCBidWZmZXJTaXplKQotICAgIDogICBUcmFja0Jhc2UoYXVkaW9GbGluZ2VyLCBjbGllbnQsIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50LCBidWZmZXJDb3VudCwgYnVmZmVyU2l6ZSkKKyAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlcikKKyAgICA6ICAgVHJhY2tCYXNlKGF1ZGlvRmxpbmdlciwgY2xpZW50LCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyKQogewogICAgIG1Wb2x1bWVbMF0gPSAxLjBmOwogICAgIG1Wb2x1bWVbMV0gPSAxLjBmOwogICAgIG1NdXRlID0gZmFsc2U7CisgICAgbVNoYXJlZEJ1ZmZlciA9IHNoYXJlZEJ1ZmZlcjsKIH0KIAogQXVkaW9GbGluZ2VyOjpUcmFjazo6flRyYWNrKCkKQEAgLTk0Myw4ICsxMTEzLDggQEAKICAgICAgICAgICAgIG1DbGllbnQtPnBpZCgpLAogICAgICAgICAgICAgbVN0cmVhbVR5cGUsCiAgICAgICAgICAgICBtRm9ybWF0LAotICAgICAgICAgICAgbUNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgIG1CdWZmZXJDb3VudCwKKyAgICAgICAgICAgIG1DYmxrLT5jaGFubmVscywKKyAgICAgICAgICAgIG1GcmFtZUNvdW50LAogICAgICAgICAgICAgbVN0YXRlLAogICAgICAgICAgICAgbU11dGUsCiAgICAgICAgICAgICBtRmlsbGluZ1VwU3RhdHVzLApAQCAtOTU4LDM2ICsxMTI4LDUwIEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRyYWNrOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewogICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSB0aGlzLT5jYmxrKCk7Ci0gICAgIHVpbnQzMl90IHUgPSBjYmxrLT51c2VyOwotICAgICB1aW50MzJfdCBzID0gY2Jsay0+c2VydmVyOwotICAgICAKLSAgICAgLy8gQ2hlY2sgaWYgbGFzdCBzdGVwU2VydmVyIGZhaWxlZCwgdHJ5IHRvIHN0ZXAgbm93IAorICAgICB1aW50MzJfdCBmcmFtZXNSZWFkeTsKKyAgICAgdWludDMyX3QgZnJhbWVzUmVxID0gYnVmZmVyLT5mcmFtZUNvdW50OworCisgICAgIC8vIENoZWNrIGlmIGxhc3Qgc3RlcFNlcnZlciBmYWlsZWQsIHRyeSB0byBzdGVwIG5vdwogICAgICBpZiAobUZsYWdzICYgVHJhY2tCYXNlOjpTVEVQU0VSVkVSX0ZBSUxFRCkgewogICAgICAgICAgaWYgKCFzdGVwKCkpICBnb3RvIGdldE5leHRCdWZmZXJfZXhpdDsKICAgICAgICAgIExPR1YoInN0ZXBTZXJ2ZXIgcmVjb3ZlcmVkIik7CiAgICAgICAgICBtRmxhZ3MgJj0gflRyYWNrQmFzZTo6U1RFUFNFUlZFUl9GQUlMRUQ7CiAgICAgIH0KIAotICAgICBpZiAoTElLRUxZKHUgPiBzKSkgewotICAgICAgICAgaW50IGluZGV4ID0gcyAmIGF1ZGlvX3RyYWNrX2NibGtfdDo6QlVGRkVSX01BU0s7Ci0gICAgICAgICBidWZmZXItPnJhdyA9IGdldEJ1ZmZlcihpbmRleCk7Ci0gICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBtQXVkaW9GbGluZ2VyLT5mcmFtZUNvdW50KCk7Ci0gICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgIGZyYW1lc1JlYWR5ID0gY2Jsay0+ZnJhbWVzUmVhZHkoKTsKKworICAgICBpZiAoTElLRUxZKGZyYW1lc1JlYWR5KSkgeworICAgICAgICB1aW50MzJfdCBzID0gY2Jsay0+c2VydmVyOworICAgICAgICB1aW50MzJfdCBidWZmZXJFbmQgPSBjYmxrLT5zZXJ2ZXJCYXNlICsgY2Jsay0+ZnJhbWVDb3VudDsKKworICAgICAgICBidWZmZXJFbmQgPSAoY2Jsay0+bG9vcEVuZCA8IGJ1ZmZlckVuZCkgPyBjYmxrLT5sb29wRW5kIDogYnVmZmVyRW5kOworICAgICAgICBpZiAoZnJhbWVzUmVxID4gZnJhbWVzUmVhZHkpIHsKKyAgICAgICAgICAgIGZyYW1lc1JlcSA9IGZyYW1lc1JlYWR5OworICAgICAgICB9CisgICAgICAgIGlmIChzICsgZnJhbWVzUmVxID4gYnVmZmVyRW5kKSB7CisgICAgICAgICAgICBmcmFtZXNSZXEgPSBidWZmZXJFbmQgLSBzOworICAgICAgICB9CisKKyAgICAgICAgIGJ1ZmZlci0+cmF3ID0gZ2V0QnVmZmVyKHMsIGZyYW1lc1JlcSk7CisgICAgICAgICBpZiAoYnVmZmVyLT5yYXcgPT0gMCkgZ290byBnZXROZXh0QnVmZmVyX2V4aXQ7CisKKyAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IGZyYW1lc1JlcTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICB9CisKIGdldE5leHRCdWZmZXJfZXhpdDoKICAgICAgYnVmZmVyLT5yYXcgPSAwOwogICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOwogICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogfQogCi1ib29sIEF1ZGlvRmxpbmdlcjo6VHJhY2s6OmlzUmVhZHkodWludDMyX3QgdSwgaW50MzJfdCBzKSBjb25zdCB7Citib29sIEF1ZGlvRmxpbmdlcjo6VHJhY2s6OmlzUmVhZHkoKSBjb25zdCB7CiAgICAgaWYgKG1GaWxsaW5nVXBTdGF0dXMgIT0gRlNfRklMTElORykgcmV0dXJuIHRydWU7Ci0gICAgY29uc3QgdWludDMyX3QgdV9zZXEgPSB1ICYgYXVkaW9fdHJhY2tfY2Jsa190OjpTRVFVRU5DRV9NQVNLOwotICAgIGNvbnN0IHVpbnQzMl90IHVfYnVmID0gdSAmIGF1ZGlvX3RyYWNrX2NibGtfdDo6QlVGRkVSX01BU0s7Ci0gICAgY29uc3QgdWludDMyX3Qgc19zZXEgPSBzICYgYXVkaW9fdHJhY2tfY2Jsa190OjpTRVFVRU5DRV9NQVNLOwotICAgIGNvbnN0IHVpbnQzMl90IHNfYnVmID0gcyAmIGF1ZGlvX3RyYWNrX2NibGtfdDo6QlVGRkVSX01BU0s7Ci0gICAgaWYgKHVfc2VxID4gc19zZXEgJiYgdV9idWYgPT0gc19idWYpIHsKKworICAgIGlmIChtQ2Jsay0+ZnJhbWVzUmVhZHkoKSA+PSBtQ2Jsay0+ZnJhbWVDb3VudCB8fAorICAgICAgICBtQ2Jsay0+Zm9yY2VSZWFkeSkgewogICAgICAgICBtRmlsbGluZ1VwU3RhdHVzID0gRlNfRklMTEVEOworICAgICAgICBtQ2Jsay0+Zm9yY2VSZWFkeSA9IDA7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMDA2LDcgKzExOTAsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtQXVkaW9GbGluZ2VyLT5tTG9jayk7CiAgICAgaWYgKG1TdGF0ZSA+IFNUT1BQRUQpIHsKICAgICAgICAgbVN0YXRlID0gU1RPUFBFRDsKLSAgICAgICAgLy8gSWYgdGhlIHRyYWNrIGlzIG5vdCBhY3RpdmUgKFBBVVNFRCBhbmQgYnVmZmVycyBmdWxsKSwgZmx1c2ggYnVmZmVycyAgCisgICAgICAgIC8vIElmIHRoZSB0cmFjayBpcyBub3QgYWN0aXZlIChQQVVTRUQgYW5kIGJ1ZmZlcnMgZnVsbCksIGZsdXNoIGJ1ZmZlcnMKICAgICAgICAgaWYgKG1BdWRpb0ZsaW5nZXItPm1BY3RpdmVUcmFja3MuaW5kZXhPZih0aGlzKSA8IDApIHsKICAgICAgICAgICAgIHJlc2V0KCk7CiAgICAgICAgIH0KQEAgLTEwMzgsMTUgKzEyMjIsMjQgQEAKICAgICAvLyBOT1RFOiByZXNldCgpIHdpbGwgcmVzZXQgY2Jsay0+dXNlciBhbmQgY2Jsay0+c2VydmVyIHdpdGgKICAgICAvLyB0aGUgcmlzayB0aGF0IGF0IHRoZSBzYW1lIHRpbWUsIHRoZSBBdWRpb01peGVyIGlzIHRyeWluZyB0byByZWFkCiAgICAgLy8gZGF0YS4gSW4gdGhpcyBjYXNlLCBnZXROZXh0QnVmZmVyKCkgd291bGQgcmV0dXJuIGEgTlVMTCBwb2ludGVyCi0gICAgLy8gYXMgYXVkaW8gYnVmZmVyID0+IHRoZSBBdWRpb01peGVyIGNvZGUgTVVTVCBhbHdheXMgdGVzdCB0aGF0IHBvaW50ZXIgCi0gICAgLy8gcmV0dXJuZWQgYnkgZ2V0TmV4dEJ1ZmZlcigpIGlzIG5vdCBOVUxMISAKKyAgICAvLyBhcyBhdWRpbyBidWZmZXIgPT4gdGhlIEF1ZGlvTWl4ZXIgY29kZSBNVVNUIGFsd2F5cyB0ZXN0IHRoYXQgcG9pbnRlcgorICAgIC8vIHJldHVybmVkIGJ5IGdldE5leHRCdWZmZXIoKSBpcyBub3QgTlVMTCEKICAgICByZXNldCgpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VHJhY2s6OnJlc2V0KCkKIHsKLSAgICBUcmFja0Jhc2U6OnJlc2V0KCk7Ci0gICAgbUZpbGxpbmdVcFN0YXR1cyA9IEZTX0ZJTExJTkc7CisgICAgLy8gRG8gbm90IHJlc2V0IHR3aWNlIHRvIGF2b2lkIGRpc2NhcmRpbmcgZGF0YSB3cml0dGVuIGp1c3QgYWZ0ZXIgYSBmbHVzaCBhbmQgYmVmb3JlCisgICAgLy8gdGhlIGF1ZGlvZmxpbmdlciB0aHJlYWQgZGV0ZWN0cyB0aGUgdHJhY2sgaXMgc3RvcHBlZC4KKyAgICBpZiAoIW1SZXNldERvbmUpIHsKKyAgICAgICAgVHJhY2tCYXNlOjpyZXNldCgpOworICAgICAgICAvLyBGb3JjZSB1bmRlcnJ1biBjb25kaXRpb24gdG8gYXZvaWQgZmFsc2UgdW5kZXJydW4gY2FsbGJhY2sgdW50aWwgZmlyc3QgZGF0YSBpcworICAgICAgICAvLyB3cml0dGVuIHRvIGJ1ZmZlcgorICAgICAgICBtQ2Jsay0+Zmxvd0NvbnRyb2xGbGFnID0gMTsKKyAgICAgICAgbUNibGstPmZvcmNlUmVhZHkgPSAwOworICAgICAgICBtRmlsbGluZ1VwU3RhdHVzID0gRlNfRklMTElORzsgICAgICAgIAorICAgICAgICBtUmVzZXREb25lID0gdHJ1ZTsKKyAgICB9CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpUcmFjazo6bXV0ZShib29sIG11dGVkKQpAQCAtMTExMiwyNiArMTMwNSwxNSBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXNwPEF1ZGlvRmxpbmdlcjo6QXVkaW9SZWNvcmRUaHJlYWQ+IEF1ZGlvRmxpbmdlcjo6YXVkaW9SZWNvcmRUaHJlYWQoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1BdWRpb1JlY29yZFRocmVhZDsKLX0KLQotdm9pZCBBdWRpb0ZsaW5nZXI6OmVuZFJlY29yZCgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtQXVkaW9SZWNvcmRUaHJlYWQuY2xlYXIoKTsKLX0KLQogc3A8SUF1ZGlvUmVjb3JkPiBBdWRpb0ZsaW5nZXI6Om9wZW5SZWNvcmQoCiAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGludCBmb3JtYXQsCiAgICAgICAgIGludCBjaGFubmVsQ291bnQsCi0gICAgICAgIGludCBidWZmZXJDb3VudCwKLSAgICAgICAgdWludDMyX3QgZmxhZ3MpCisgICAgICAgIGludCBmcmFtZUNvdW50LAorICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKIHsKICAgICBzcDxBdWRpb1JlY29yZFRocmVhZD4gdGhyZWFkOwogICAgIHNwPFJlY29yZFRyYWNrPiByZWNvcmRUcmFjazsKQEAgLTExMzksNDYgKzEzMjEsNDYgQEAKICAgICBzcDxDbGllbnQ+IGNsaWVudDsKICAgICB3cDxDbGllbnQ+IHdjbGllbnQ7CiAgICAgQXVkaW9TdHJlYW1JbiogaW5wdXQgPSAwOworICAgIGludCBpbkZyYW1lQ291bnQ7CisgICAgc2l6ZV90IGlucHV0QnVmZmVyU2l6ZTsKKyAgICBzdGF0dXNfdCBsU3RhdHVzOwogCiAgICAgLy8gY2hlY2sgY2FsbGluZyBwZXJtaXNzaW9ucwogICAgIGlmICghcmVjb3JkaW5nQWxsb3dlZCgpKSB7CisgICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAogICAgIGlmICh1aW50MzJfdChzdHJlYW1UeXBlKSA+PSBBdWRpb1JlY29yZDo6TlVNX1NUUkVBTV9UWVBFUykgewogICAgICAgICBMT0dFKCJpbnZhbGlkIHN0cmVhbSB0eXBlIik7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKICAgICBpZiAoc2FtcGxlUmF0ZSA+IE1BWF9TQU1QTEVfUkFURSkgewogICAgICAgICBMT0dFKCJTYW1wbGUgcmF0ZSBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAogICAgIGlmIChtU2FtcGxlUmF0ZSA9PSAwKSB7CiAgICAgICAgIExPR0UoIkF1ZGlvIGRyaXZlciBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgbFN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKLSAgICAvLyBDcmVhdGUgYXVkaW8gdGhyZWFkIC0gdGFrZSBtdXRleCB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBpZiAobUF1ZGlvUmVjb3JkVGhyZWFkICE9IDApIHsKLSAgICAgICAgICAgIExPR0UoIlJlY29yZCBjaGFubmVsIGFscmVhZHkgb3BlbiIpOwotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0gICAgICAgIHRocmVhZCA9IG5ldyBBdWRpb1JlY29yZFRocmVhZCh0aGlzKTsKLSAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkID0gdGhyZWFkOworICAgIGlmIChtQXVkaW9SZWNvcmRUaHJlYWQgPT0gMCkgeworICAgICAgICBMT0dFKCJBdWRpbyByZWNvcmQgdGhyZWFkIG5vdCBzdGFydGVkIik7CisgICAgICAgIGxTdGF0dXMgPSBOT19JTklUOworICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQotICAgIC8vIEl0J3Mgc2FmZSB0byByZWxlYXNlIHRoZSBtdXRleCBoZXJlIHNpbmNlIHRoZSBjbGllbnQgZG9lc24ndCBnZXQgYQotICAgIC8vIGhhbmRsZSB1bnRpbCB3ZSByZXR1cm4gZnJvbSB0aGlzIGNhbGwKIAotICAgIC8vIG9wZW4gZHJpdmVyLCBpbml0aWFsaXplIGgvdwotICAgIGlucHV0ID0gbUF1ZGlvSGFyZHdhcmUtPm9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklULCBjaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOwotICAgIGlmICghaW5wdXQpIHsKLSAgICAgICAgTE9HRSgiRXJyb3Igb3BlbmluZyBpbnB1dCBzdHJlYW0iKTsKLSAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLmNsZWFyKCk7CisKKyAgICAvLyBDaGVjayB0aGF0IGF1ZGlvIGlucHV0IHN0cmVhbSBhY2NlcHRzIHJlcXVlc3RlZCBhdWRpbyBwYXJhbWV0ZXJzIAorICAgIGlucHV0QnVmZmVyU2l6ZSA9IG1BdWRpb0hhcmR3YXJlLT5nZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsQ291bnQpOworICAgIGlmIChpbnB1dEJ1ZmZlclNpemUgPT0gMCkgeworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBMT0dFKCJCYWQgYXVkaW8gaW5wdXQgcGFyYW1ldGVyczogc2FtcGxpbmcgcmF0ZSAldSwgZm9ybWF0ICVkLCBjaGFubmVscyAlZCIsICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCk7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKQEAgLTExOTQsMzcgKzEzNzYsMzggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIGZyYW1lQ291bnQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlucHV0IGJ1ZmZlciBzaXplCisgICAgaW5GcmFtZUNvdW50ID0gaW5wdXRCdWZmZXJTaXplL2NoYW5uZWxDb3VudC9zaXplb2Yoc2hvcnQpOworICAgIGZyYW1lQ291bnQgPSAoKGZyYW1lQ291bnQgLSAxKS9pbkZyYW1lQ291bnQgKyAxKSAqIGluRnJhbWVDb3VudDsKKwogICAgIC8vIGNyZWF0ZSBuZXcgcmVjb3JkIHRyYWNrIGFuZCBwYXNzIHRvIHJlY29yZCB0aHJlYWQKICAgICByZWNvcmRUcmFjayA9IG5ldyBSZWNvcmRUcmFjayh0aGlzLCBjbGllbnQsIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxDb3VudCwgYnVmZmVyQ291bnQsIGlucHV0LT5idWZmZXJTaXplKCkpOwotCi0gICAgLy8gc3BpbiB1cCByZWNvcmQgdGhyZWFkCi0gICAgdGhyZWFkLT5vcGVuKHJlY29yZFRyYWNrLCBpbnB1dCk7Ci0gICAgdGhyZWFkLT5ydW4oIkF1ZGlvUmVjb3JkVGhyZWFkIiwgUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKKyAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50KTsKIAogICAgIC8vIHJldHVybiB0byBoYW5kbGUgdG8gY2xpZW50CiAgICAgcmVjb3JkSGFuZGxlID0gbmV3IFJlY29yZEhhbmRsZShyZWNvcmRUcmFjayk7CisgICAgbFN0YXR1cyA9IE5PX0VSUk9SOwogCiBFeGl0OgorICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CisgICAgfQogICAgIHJldHVybiByZWNvcmRIYW5kbGU7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c3RhcnRSZWNvcmQoKSB7Ci0gICAgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+IHQgPSBhdWRpb1JlY29yZFRocmVhZCgpOwotICAgIGlmICh0ID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiB0LT5zdGFydCgpOworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzdGFydFJlY29yZChSZWNvcmRUcmFjayogcmVjb3JkVHJhY2spIHsKKyAgICBpZiAobUF1ZGlvUmVjb3JkVGhyZWFkICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1JlY29yZFRocmVhZC0+c3RhcnQocmVjb3JkVHJhY2spOyAgICAgICAgCisgICAgfQorICAgIHJldHVybiBOT19JTklUOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6c3RvcFJlY29yZCgpIHsKLSAgICBzcDxBdWRpb1JlY29yZFRocmVhZD4gdCA9IGF1ZGlvUmVjb3JkVGhyZWFkKCk7Ci0gICAgaWYgKHQgIT0gMCkgdC0+c3RvcCgpOwordm9pZCBBdWRpb0ZsaW5nZXI6OnN0b3BSZWNvcmQoUmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKSB7CisgICAgaWYgKG1BdWRpb1JlY29yZFRocmVhZCAhPSAwKSB7CisgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+c3RvcChyZWNvcmRUcmFjayk7CisgICAgfQogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6ZXhpdFJlY29yZCgpCi17Ci0gICAgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+IHQgPSBhdWRpb1JlY29yZFRocmVhZCgpOwotICAgIGlmICh0ICE9IDApIHQtPmV4aXQoKTsKLX0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0xMjM1LDU1ICsxNDE4LDY5IEBACiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICBpbnQgYnVmZmVyQ291bnQsCi0gICAgICAgICAgICBpbnQgYnVmZmVyU2l6ZSkKKyAgICAgICAgICAgIGludCBmcmFtZUNvdW50KQogICAgIDogICBUcmFja0Jhc2UoYXVkaW9GbGluZ2VyLCBjbGllbnQsIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgIGNoYW5uZWxDb3VudCwgYnVmZmVyQ291bnQsIGJ1ZmZlclNpemUpLAorICAgICAgICAgICAgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCAwKSwKICAgICAgICAgICAgIG1PdmVyZmxvdyhmYWxzZSkKIHsKIH0KIAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUcmFjazo6flJlY29yZFRyYWNrKCkKIHsKLSAgICBtQXVkaW9GbGluZ2VyLT5hdWRpb01peGVyKCkuZGVsZXRlVHJhY2tOYW1lKG1OYW1lKTsKLSAgICBtQXVkaW9GbGluZ2VyLT5leGl0UmVjb3JkKCk7CisgICAgbUF1ZGlvRmxpbmdlci0+YXVkaW9NaXhlcigpLT5kZWxldGVUcmFja05hbWUobU5hbWUpOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRyYWNrOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewotICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSB0aGlzLT5jYmxrKCk7Ci0gICAgIGNvbnN0IHVpbnQzMl90IHVfc2VxID0gY2Jsay0+dXNlciAmIGF1ZGlvX3RyYWNrX2NibGtfdDo6U0VRVUVOQ0VfTUFTSzsKLSAgICAgY29uc3QgdWludDMyX3QgdV9idWYgPSBjYmxrLT51c2VyICYgYXVkaW9fdHJhY2tfY2Jsa190OjpCVUZGRVJfTUFTSzsKLSAgICAgY29uc3QgdWludDMyX3Qgc19zZXEgPSBjYmxrLT5zZXJ2ZXIgJiBhdWRpb190cmFja19jYmxrX3Q6OlNFUVVFTkNFX01BU0s7Ci0gICAgIGNvbnN0IHVpbnQzMl90IHNfYnVmID0gY2Jsay0+c2VydmVyICYgYXVkaW9fdHJhY2tfY2Jsa190OjpCVUZGRVJfTUFTSzsKLSAgICAgCi0gICAgIC8vIENoZWNrIGlmIGxhc3Qgc3RlcFNlcnZlciBmYWlsZWQsIHRyeSB0byBzdGVwIG5vdyAKLSAgICAgaWYgKG1GbGFncyAmIFRyYWNrQmFzZTo6U1RFUFNFUlZFUl9GQUlMRUQpIHsKLSAgICAgICAgIGlmICghc3RlcCgpKSAgZ290byBnZXROZXh0QnVmZmVyX2V4aXQ7Ci0gICAgICAgICBMT0dWKCJzdGVwU2VydmVyIHJlY292ZXJlZCIpOwotICAgICAgICAgbUZsYWdzICY9IH5UcmFja0Jhc2U6OlNURVBTRVJWRVJfRkFJTEVEOwotICAgICB9CisgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gdGhpcy0+Y2JsaygpOworICAgIHVpbnQzMl90IGZyYW1lc0F2YWlsOworICAgIHVpbnQzMl90IGZyYW1lc1JlcSA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKIAotICAgICBpZiAoTElLRUxZKHNfc2VxID09IHVfc2VxIHx8IHNfYnVmICE9IHVfYnVmKSkgewotICAgICAgICAgYnVmZmVyLT5yYXcgPSBnZXRCdWZmZXIoc19idWYpOwotICAgICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gbUF1ZGlvRmxpbmdlci0+ZnJhbWVDb3VudCgpOwotICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICB9CisgICAgIC8vIENoZWNrIGlmIGxhc3Qgc3RlcFNlcnZlciBmYWlsZWQsIHRyeSB0byBzdGVwIG5vdworICAgIGlmIChtRmxhZ3MgJiBUcmFja0Jhc2U6OlNURVBTRVJWRVJfRkFJTEVEKSB7CisgICAgICAgIGlmICghc3RlcCgpKSBnb3RvIGdldE5leHRCdWZmZXJfZXhpdDsKKyAgICAgICAgTE9HVigic3RlcFNlcnZlciByZWNvdmVyZWQiKTsKKyAgICAgICAgbUZsYWdzICY9IH5UcmFja0Jhc2U6OlNURVBTRVJWRVJfRkFJTEVEOworICAgIH0KIAotZ2V0TmV4dEJ1ZmZlcl9leGl0OiAgICAgCi0gICAgIGJ1ZmZlci0+cmF3ID0gMDsKLSAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKLSAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICBmcmFtZXNBdmFpbCA9IGNibGstPmZyYW1lc0F2YWlsYWJsZV9sKCk7CisKKyAgICBpZiAoTElLRUxZKGZyYW1lc0F2YWlsKSkgeworICAgICAgICB1aW50MzJfdCBzID0gY2Jsay0+c2VydmVyOworICAgICAgICB1aW50MzJfdCBidWZmZXJFbmQgPSBjYmxrLT5zZXJ2ZXJCYXNlICsgY2Jsay0+ZnJhbWVDb3VudDsKKworICAgICAgICBpZiAoZnJhbWVzUmVxID4gZnJhbWVzQXZhaWwpIHsKKyAgICAgICAgICAgIGZyYW1lc1JlcSA9IGZyYW1lc0F2YWlsOworICAgICAgICB9CisgICAgICAgIGlmIChzICsgZnJhbWVzUmVxID4gYnVmZmVyRW5kKSB7CisgICAgICAgICAgICBmcmFtZXNSZXEgPSBidWZmZXJFbmQgLSBzOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyLT5yYXcgPSBnZXRCdWZmZXIocywgZnJhbWVzUmVxKTsKKyAgICAgICAgaWYgKGJ1ZmZlci0+cmF3ID09IDApIGdvdG8gZ2V0TmV4dEJ1ZmZlcl9leGl0OworCisgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IGZyYW1lc1JlcTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworZ2V0TmV4dEJ1ZmZlcl9leGl0OgorICAgIGJ1ZmZlci0+cmF3ID0gMDsKKyAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOworICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVHJhY2s6OnN0YXJ0KCkKIHsKLSAgICByZXR1cm4gbUF1ZGlvRmxpbmdlci0+c3RhcnRSZWNvcmQoKTsKKyAgICByZXR1cm4gbUF1ZGlvRmxpbmdlci0+c3RhcnRSZWNvcmQodGhpcyk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUcmFjazo6c3RvcCgpCiB7Ci0gICAgbUF1ZGlvRmxpbmdlci0+c3RvcFJlY29yZCgpOworICAgIG1BdWRpb0ZsaW5nZXItPnN0b3BSZWNvcmQodGhpcyk7CisgICAgVHJhY2tCYXNlOjpyZXNldCgpOworICAgIC8vIEZvcmNlIG92ZXJlcnJ1biBjb25kaXRpb24gdG8gYXZvaWQgZmFsc2Ugb3ZlcnJ1biBjYWxsYmFjayB1bnRpbCBmaXJzdCBkYXRhIGlzCisgICAgLy8gcmVhZCBmcm9tIGJ1ZmZlcgorICAgIG1DYmxrLT5mbG93Q29udHJvbEZsYWcgPSAxOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMjk0LDcgKzE0OTEsOSBAQAogewogfQogCi1BdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6flJlY29yZEhhbmRsZSgpIHt9CitBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6flJlY29yZEhhbmRsZSgpIHsKKyAgICBzdG9wKCk7Cit9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpzdGFydCgpIHsKICAgICBMT0dWKCJSZWNvcmRIYW5kbGU6OnN0YXJ0KCkiKTsKQEAgLTEzMTgsMTAgKzE1MTcsOCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUF1ZGlvRmxpbmdlcjo6QXVkaW9SZWNvcmRUaHJlYWQ6OkF1ZGlvUmVjb3JkVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlcikgOgotICAgIG1BdWRpb0ZsaW5nZXIoYXVkaW9GbGluZ2VyKSwKLSAgICBtUmVjb3JkVHJhY2soMCksCi0gICAgbUlucHV0KDApLAorQXVkaW9GbGluZ2VyOjpBdWRpb1JlY29yZFRocmVhZDo6QXVkaW9SZWNvcmRUaHJlYWQoQXVkaW9IYXJkd2FyZUludGVyZmFjZSogYXVkaW9IYXJkd2FyZSkgOgorICAgIG1BdWRpb0hhcmR3YXJlKGF1ZGlvSGFyZHdhcmUpLAogICAgIG1BY3RpdmUoZmFsc2UpCiB7CiB9CkBAIC0xMzMzLDEwOCArMTUzMCwxMjMgQEAKIGJvb2wgQXVkaW9GbGluZ2VyOjpBdWRpb1JlY29yZFRocmVhZDo6dGhyZWFkTG9vcCgpCiB7CiAgICAgTE9HVigiQXVkaW9SZWNvcmRUaHJlYWQ6IHN0YXJ0IHJlY29yZCBsb29wIik7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIGJ1ZmZlcjsKKyAgICBpbnQgaW5CdWZmZXJTaXplID0gMDsKKyAgICBpbnQgaW5GcmFtZUNvdW50ID0gMDsKKyAgICBBdWRpb1N0cmVhbUluKiBpbnB1dCA9IDA7CiAKKyAgICBtQWN0aXZlID0gMDsKKyAgICAKICAgICAvLyBzdGFydCByZWNvcmRpbmcKICAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpIHsKICAgICAgICAgaWYgKCFtQWN0aXZlKSB7CiAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICBpZiAoIW1BY3RpdmUgJiYgIWV4aXRQZW5kaW5nKCkpIHsKICAgICAgICAgICAgICAgICBMT0dWKCJBdWRpb1JlY29yZFRocmVhZDogbG9vcCBzdG9wcGluZyIpOworICAgICAgICAgICAgICAgIGlmIChpbnB1dCkgeworICAgICAgICAgICAgICAgICAgICBkZWxldGUgaW5wdXQ7CisgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVJlY29yZFRyYWNrLmNsZWFyKCk7CisKICAgICAgICAgICAgICAgICBtV2FpdFdvcmtDVi53YWl0KG1Mb2NrKTsKKyAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIExPR1YoIkF1ZGlvUmVjb3JkVGhyZWFkOiBsb29wIHN0YXJ0aW5nIik7CisgICAgICAgICAgICAgICAgaWYgKG1SZWNvcmRUcmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gbUF1ZGlvSGFyZHdhcmUtPm9wZW5JbnB1dFN0cmVhbShtUmVjb3JkVHJhY2stPmZvcm1hdCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlY29yZFRyYWNrLT5jaGFubmVsQ291bnQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWNvcmRUcmFjay0+c2FtcGxlUmF0ZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1TdGFydFN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlclNpemUgPSBpbnB1dC0+YnVmZmVyU2l6ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5GcmFtZUNvdW50ID0gaW5CdWZmZXJTaXplL2lucHV0LT5mcmFtZVNpemUoKTsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGFydFN0YXR1cyA9IE5PX0lOSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtU3RhcnRTdGF0dXMgIT1OT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBMT0dXKCJyZWNvcmQgc3RhcnQgZmFpbGVkLCBzdGF0dXMgJWQiLCBtU3RhcnRTdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1SZWNvcmRUcmFjay5jbGVhcigpOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBwcm9tb3RlIHN0cm9uZyByZWYgc28gdHJhY2sgaXNuJ3QgZGVsZXRlZCB3aGlsZSB3ZSBhY2Nlc3MgaXQKLSAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0ID0gbVJlY29yZFRyYWNrLnByb21vdGUoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtUmVjb3JkVHJhY2sgIT0gMCl7CiAKLSAgICAgICAgICAgIC8vIGlmIHdlIGxvc2UgdGhlIHdlYWsgcmVmZXJlbmNlLCBjbGllbnQgaXMgZ29uZS4KLSAgICAgICAgICAgIGlmICh0ID09IDApIHsKLSAgICAgICAgICAgICAgICBMT0dWKCJBdWRpb1JlY29yZFRocmVhZDogY2xpZW50IGRlbGV0ZWQgdHJhY2siKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKExJS0VMWSh0LT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyKSA9PSBOT19FUlJPUikpIHsKLSAgICAgICAgICAgICAgICBpZiAobUlucHV0LT5yZWFkKG1CdWZmZXIucmF3LCB0LT5tQnVmZmVyU2l6ZSkgPCAwKSB7CisgICAgICAgICAgICBidWZmZXIuZnJhbWVDb3VudCA9IGluRnJhbWVDb3VudDsKKyAgICAgICAgICAgIGlmIChMSUtFTFkobVJlY29yZFRyYWNrLT5nZXROZXh0QnVmZmVyKCZidWZmZXIpID09IE5PX0VSUk9SKSkgeworICAgICAgICAgICAgICAgIExPR1YoIkF1ZGlvUmVjb3JkVGhyZWFkIHJlYWQ6ICVkIGZyYW1lcyIsIGJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXQtPnJlYWQoYnVmZmVyLnJhdywgaW5CdWZmZXJTaXplKSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IgcmVhZGluZyBhdWRpbyBpbnB1dCIpOwogICAgICAgICAgICAgICAgICAgICBzbGVlcCgxKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdC0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CisgICAgICAgICAgICAgICAgbVJlY29yZFRyYWNrLT5yZWxlYXNlQnVmZmVyKCZidWZmZXIpOworICAgICAgICAgICAgICAgIG1SZWNvcmRUcmFjay0+b3ZlcmZsb3coKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gY2xpZW50IGlzbid0IHJldHJpZXZpbmcgYnVmZmVycyBmYXN0IGVub3VnaAogICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCF0LT5zZXRPdmVyZmxvdygpKQorICAgICAgICAgICAgICAgIGlmICghbVJlY29yZFRyYWNrLT5zZXRPdmVyZmxvdygpKQogICAgICAgICAgICAgICAgICAgICBMT0dXKCJBdWRpb1JlY29yZFRocmVhZDogYnVmZmVyIG92ZXJmbG93Iik7CisgICAgICAgICAgICAgICAgLy8gUmVsZWFzZSB0aGUgcHJvY2Vzc29yIGZvciBhIHdoaWxlIGJlZm9yZSBhc2tpbmcgZm9yIGEgbmV3IGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZ2l2ZSB0aGUgYXBwbGljYXRpb24gbW9yZSBjaGFuY2UgdG8gcmVhZCBmcm9tIHRoZSBidWZmZXIgYW5kCisgICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIG92ZXJmbG93LgorICAgICAgICAgICAgICAgIHVzbGVlcCg1MDAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH07CisgICAgfQogCi0gICAgLy8gY2xvc2UgaGFyZHdhcmUKLSAgICBjbG9zZSgpOwogCi0gICAgLy8gZGVsZXRlIHRoaXMgb2JqZWN0IC0gbm8gbW9yZSBkYXRhIHJlZmVyZW5jZXMgYWZ0ZXIgdGhpcyBjYWxsCi0gICAgbUF1ZGlvRmxpbmdlci0+ZW5kUmVjb3JkKCk7CisgICAgaWYgKGlucHV0KSB7CisgICAgICAgIGRlbGV0ZSBpbnB1dDsKKyAgICB9CisgICAgbVJlY29yZFRyYWNrLmNsZWFyKCk7CisgICAgCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkF1ZGlvUmVjb3JkVGhyZWFkOjpvcGVuKGNvbnN0IHNwPFJlY29yZFRyYWNrPiYgcmVjb3JkVHJhY2ssIEF1ZGlvU3RyZWFtSW4gKmlucHV0KSB7Ci0gICAgTE9HVigiQXVkaW9SZWNvcmRUaHJlYWQ6Om9wZW4iKTsKLSAgICAvLyBjaGVjayBmb3IgcmVjb3JkIGNoYW5uZWwgYWxyZWFkeSBvcGVuCi0gICAgQXV0b011dGV4IGxvY2soJm1Mb2NrKTsKLSAgICBpZiAobVJlY29yZFRyYWNrICE9IE5VTEwpIHsKLSAgICAgICAgTE9HRSgiUmVjb3JkIGNoYW5uZWwgYWxyZWFkeSBvcGVuIik7Ci0gICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKLSAgICB9Ci0gICAgbVJlY29yZFRyYWNrID0gcmVjb3JkVHJhY2s7Ci0gICAgbUlucHV0ID0gaW5wdXQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkF1ZGlvUmVjb3JkVGhyZWFkOjpzdGFydCgpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkF1ZGlvUmVjb3JkVGhyZWFkOjpzdGFydChSZWNvcmRUcmFjayogcmVjb3JkVHJhY2spCiB7CiAgICAgTE9HVigiQXVkaW9SZWNvcmRUaHJlYWQ6OnN0YXJ0Iik7CiAgICAgQXV0b011dGV4IGxvY2soJm1Mb2NrKTsKLSAgICBpZiAobUFjdGl2ZSkgcmV0dXJuIC1FQlVTWTsKKyAgICBtQWN0aXZlID0gdHJ1ZTsKKyAgICAvLyBJZiBzdGFydGluZyB0aGUgYWN0aXZlIHRyYWNrLCBqdXN0IHJlc2V0IG1BY3RpdmUgaW4gY2FzZSBhIHN0b3AKKyAgICAvLyB3YXMgcGVuZGluZyBhbmQgZXhpdAorICAgIGlmIChyZWNvcmRUcmFjayA9PSBtUmVjb3JkVHJhY2suZ2V0KCkpIHJldHVybiBOT19FUlJPUjsKIAotICAgIHNwPFJlY29yZFRyYWNrPiB0ID0gbVJlY29yZFRyYWNrLnByb21vdGUoKTsKLSAgICBpZiAodCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBpZiAobVJlY29yZFRyYWNrICE9IDApIHJldHVybiAtRUJVU1k7CisKKyAgICBtUmVjb3JkVHJhY2sgPSByZWNvcmRUcmFjazsKIAogICAgIC8vIHNpZ25hbCB0aHJlYWQgdG8gc3RhcnQKICAgICBMT0dWKCJTaWduYWwgcmVjb3JkIHRocmVhZCIpOwotICAgIG1BY3RpdmUgPSB0cnVlOwogICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBtV2FpdFdvcmtDVi53YWl0KG1Mb2NrKTsKKyAgICBMT0dWKCJSZWNvcmQgc3RhcnRlZCwgc3RhdHVzICVkIiwgbVN0YXJ0U3RhdHVzKTsKKyAgICByZXR1cm4gbVN0YXJ0U3RhdHVzOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6QXVkaW9SZWNvcmRUaHJlYWQ6OnN0b3AoKSB7Cit2b2lkIEF1ZGlvRmxpbmdlcjo6QXVkaW9SZWNvcmRUaHJlYWQ6OnN0b3AoUmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKSB7CiAgICAgTE9HVigiQXVkaW9SZWNvcmRUaHJlYWQ6OnN0b3AiKTsKICAgICBBdXRvTXV0ZXggbG9jaygmbUxvY2spOwotICAgIGlmIChtQWN0aXZlKSB7CisgICAgaWYgKG1BY3RpdmUgJiYgKHJlY29yZFRyYWNrID09IG1SZWNvcmRUcmFjay5nZXQoKSkpIHsKICAgICAgICAgbUFjdGl2ZSA9IGZhbHNlOwotICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKICAgICB9CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpBdWRpb1JlY29yZFRocmVhZDo6ZXhpdCgpCiB7CiAgICAgTE9HVigiQXVkaW9SZWNvcmRUaHJlYWQ6OmV4aXQiKTsKLSAgICBBdXRvTXV0ZXggbG9jaygmbUxvY2spOwotICAgIHJlcXVlc3RFeGl0KCk7Ci0gICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jaygmbUxvY2spOworICAgICAgICByZXF1ZXN0RXhpdCgpOworICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKKyAgICB9CisgICAgcmVxdWVzdEV4aXRBbmRXYWl0KCk7CiB9CiAKIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpBdWRpb1JlY29yZFRocmVhZDo6Y2xvc2UoKQotewotICAgIExPR1YoIkF1ZGlvUmVjb3JkVGhyZWFkOjpjbG9zZSIpOwotICAgIEF1dG9NdXRleCBsb2NrKCZtTG9jayk7Ci0gICAgaWYgKCFtSW5wdXQpIHJldHVybiBOT19JTklUOwotICAgIGRlbGV0ZSBtSW5wdXQ7Ci0gICAgbUlucHV0ID0gMDsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6b25UcmFuc2FjdCgKICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKIHsKZGlmZiAtLWdpdCBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKaW5kZXggOGMwMjYxNy4uZDlmN2I0OSAxMDA2NDQKLS0tIGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKKysrIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKQEAgLTQzLDEzICs0MywxNyBAQAogY2xhc3MgQXVkaW9NaXhlcjsKIGNsYXNzIEF1ZGlvQnVmZmVyOwogCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogI2RlZmluZSBMSUtFTFkoIGV4cCApICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCB0cnVlICApKQogI2RlZmluZSBVTkxJS0VMWSggZXhwICkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCBmYWxzZSApKQogCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorc3RhdGljIGNvbnN0IG5zZWNzX3Qga1N0YW5kYnlUaW1lSW5Oc2VjcyA9IHNlY29uZHMoMyk7CisKIGNsYXNzIEF1ZGlvRmxpbmdlciA6IHB1YmxpYyBCbkF1ZGlvRmxpbmdlciwgcHJvdGVjdGVkIFRocmVhZAogewogcHVibGljOgpAQCAtNjksMTMgKzczLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOwogCiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgc2FtcGxlUmF0ZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGNoYW5uZWxDb3VudCgpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGZvcm1hdCgpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoKSBjb25zdDsKKyAgICB2aXJ0dWFsICAgICBzaXplX3QgICAgICBsYXRlbmN5KCkgY29uc3Q7CiAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdmFsdWUpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHNldE1hc3Rlck11dGUoYm9vbCBtdXRlZCk7CkBAIC0xMjgsOCArMTM1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlckNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyk7CiAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBvblRyYW5zYWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLApAQCAtMTQxLDEyICsxNDksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0ZsaW5nZXIoKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+QXVkaW9GbGluZ2VyKCk7CiAgICAgCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0KEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQpOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIGdldE91dHB1dEZyYW1lQ291bnQoQXVkaW9TdHJlYW1PdXQqIG91dHB1dCk7CisKICAgICAvLyBJbnRlcm5hbCBkdW1wIHV0aWxpdGVzLgogICAgIHN0YXR1c190IGR1bXBQZXJtaXNzaW9uRGVuaWFsKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgc3RhdHVzX3QgZHVtcENsaWVudHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICBzdGF0dXNfdCBkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgc3RhdHVzX3QgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotICAgIAorCiAgICAgLy8gLS0tIENsaWVudCAtLS0KICAgICBjbGFzcyBDbGllbnQgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgcHVibGljOgpAQCAtMTgzLDE3ICsxOTQsMTcgQEAKICAgICAgICAgfTsKIAogICAgICAgICBlbnVtIHRyYWNrX2ZsYWdzIHsKLSAgICAgICAgICAgIFNURVBTRVJWRVJfRkFJTEVEID0gMHgwMSAgIC8vICBTdGVwU2VydmVyIGNvdWxkIG5vdCBhY3F1aXJlIGNibGstPmxvY2sgbXV0ZXggCisgICAgICAgICAgICBTVEVQU0VSVkVSX0ZBSUxFRCA9IDB4MDEgICAvLyAgU3RlcFNlcnZlciBjb3VsZCBub3QgYWNxdWlyZSBjYmxrLT5sb2NrIG11dGV4CiAgICAgICAgIH07Ci0gICAgICAgIAorCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlKCAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5UcmFja0Jhc2UoKTsKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KCkgPSAwOwpAQCAtMjAzLDYgKzIxNCw3IEBACiAgICAgcHJvdGVjdGVkOgogICAgICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOwogICAgICAgICBmcmllbmQgY2xhc3MgUmVjb3JkSGFuZGxlOworICAgICAgICBmcmllbmQgY2xhc3MgQXVkaW9SZWNvcmRUaHJlYWQ7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja0Jhc2UoY29uc3QgVHJhY2tCYXNlJik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlJiBvcGVyYXRvciA9IChjb25zdCBUcmFja0Jhc2UmKTsKQEAgLTIyMiwxOSArMjM0LDExIEBACiAgICAgICAgICAgICByZXR1cm4gbUZvcm1hdDsKICAgICAgICAgfQogCi0gICAgICAgIGludCBjaGFubmVsQ291bnQoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoYW5uZWxDb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBidWZmZXJDb3VudCgpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBtQnVmZmVyQ291bnQ7Ci0gICAgICAgIH0KKyAgICAgICAgaW50IGNoYW5uZWxDb3VudCgpIGNvbnN0IDsKIAogICAgICAgICBpbnQgc2FtcGxlUmF0ZSgpIGNvbnN0OwogCi0gICAgICAgIHZvaWQqIGdldEJ1ZmZlcihpbnQgbikgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIChjaGFyKiltQnVmZmVycyArIG4gKiBtQnVmZmVyU2l6ZTsKLSAgICAgICAgfQorICAgICAgICB2b2lkKiBnZXRCdWZmZXIodWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBmcmFtZXMpIGNvbnN0OwogCiAgICAgICAgIGludCBuYW1lKCkgY29uc3QgewogICAgICAgICAgICAgcmV0dXJuIG1OYW1lOwpAQCAtMjU2LDE2ICsyNjAsMTUgQEAKICAgICAgICAgc3A8SU1lbW9yeT4gICAgICAgICBtQ2Jsa01lbW9yeTsKICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBtQ2JsazsKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZTsKLSAgICAgICAgdWludDhfdCAgICAgICAgICAgICBtRm9ybWF0OwotICAgICAgICB1aW50OF90ICAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7Ci0gICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgbUJ1ZmZlckNvdW50OwotICAgICAgICB1aW50OF90ICAgICAgICAgICAgIG1GbGFnczsKLSAgICAgICAgdm9pZCogICAgICAgICAgICAgICBtQnVmZmVyczsKLSAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsKKyAgICAgICAgdm9pZCogICAgICAgICAgICAgICBtQnVmZmVyOworICAgICAgICB2b2lkKiAgICAgICAgICAgICAgIG1CdWZmZXJFbmQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgbUZyYW1lQ291bnQ7CiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbU5hbWU7CiAgICAgICAgIC8vIHdlIGRvbid0IHJlYWxseSBuZWVkIGEgbG9jayBmb3IgdGhlc2UKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtU3RhdGU7CiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbUNsaWVudFRpZDsKKyAgICAgICAgdWludDhfdCAgICAgICAgICAgICBtRm9ybWF0OworICAgICAgICB1aW50OF90ICAgICAgICAgICAgIG1GbGFnczsKICAgICB9OwogCiAgICAgLy8gcGxheWJhY2sgdHJhY2sKQEAgLTI3Nyw4ICsyODAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlckNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+VHJhY2soKTsKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CkBAIC0zMTIsNyArMzE1LDcgQEAKICAgICAgICAgICAgIHJldHVybiBtU3RhdGUgPT0gUEFVU0VEOwogICAgICAgICB9CiAKLSAgICAgICAgYm9vbCBpc1JlYWR5KHVpbnQzMl90IHUsIGludDMyX3QgcykgY29uc3Q7CisgICAgICAgIGJvb2wgaXNSZWFkeSgpIGNvbnN0OwogCiAgICAgICAgIHZvaWQgc2V0UGF1c2VkKCkgeyBtU3RhdGUgPSBQQVVTRUQ7IH0KICAgICAgICAgdm9pZCByZXNldCgpOwpAQCAtMzI0LDYgKzMyNyw4IEBACiAgICAgICAgIGVudW0ge0ZTX0ZJTExJTkcsIEZTX0ZJTExFRCwgRlNfQUNUSVZFfTsKICAgICAgICAgbXV0YWJsZSB1aW50OF90ICAgICBtRmlsbGluZ1VwU3RhdHVzOwogICAgICAgICBpbnQ4X3QgICAgICAgICAgICAgIG1SZXRyeUNvdW50OworICAgICAgICBzcDxJTWVtb3J5PiAgICAgICAgIG1TaGFyZWRCdWZmZXI7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbVJlc2V0RG9uZTsKICAgICB9OyAgLy8gZW5kIG9mIFRyYWNrCiAKICAgICBmcmllbmQgY2xhc3MgQXVkaW9CdWZmZXI7CkBAIC0zNjYsOCArMzcxLDggQEAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZW1vdmVfdHJhY2tfbCh3cDxUcmFjaz4gdHJhY2ssIGludCBuYW1lKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkZXN0cm95VHJhY2soY29uc3Qgc3A8VHJhY2s+JiB0cmFjayk7CiAKLSAgICAgICAgICAgICAgICBBdWRpb01peGVyJiBhdWRpb01peGVyKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKm1BdWRpb01peGVyOworICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXIqIGF1ZGlvTWl4ZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQXVkaW9NaXhlcjsKICAgICAgICAgICAgICAgICB9CiAKICAgICAvLyByZWNvcmQgdHJhY2sKQEAgLTM3OSw4ICszODQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlckNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5SZWNvcmRUcmFjaygpOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoKTsKQEAgLTQxOSw0MyArNDIzLDM0IEBACiAgICAgY2xhc3MgQXVkaW9SZWNvcmRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkCiAgICAgewogICAgIHB1YmxpYzoKLSAgICAgICAgQXVkaW9SZWNvcmRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyKTsKKyAgICAgICAgQXVkaW9SZWNvcmRUaHJlYWQoQXVkaW9IYXJkd2FyZUludGVyZmFjZSogYXVkaW9IYXJkd2FyZSk7CiAgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfkF1ZGlvUmVjb3JkVGhyZWFkKCk7CiAgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlYWR5VG9SdW4oKSB7IHJldHVybiBOT19FUlJPUjsgfQogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKSB7fQogCi0gICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgb3Blbihjb25zdCBzcDxSZWNvcmRUcmFjaz4mIHJlY29yZFRyYWNrLCBBdWRpb1N0cmVhbUluICppbnB1dCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc3RhcnQoKTsKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzdGFydChSZWNvcmRUcmFjayogcmVjb3JkVHJhY2spOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3AoUmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBleGl0KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYm9vbCAgICAgICAgaXNPcGVuKCkgeyByZXR1cm4gYm9vbChtUmVjb3JkVHJhY2sgIT0gTlVMTCk7IH0KIAogICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmRUaHJlYWQoKTsKLSAgICAgICAgICAgICAgICBzcDxBdWRpb0ZsaW5nZXI+ICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyOwotICAgICAgICAgICAgICAgIHdwPFJlY29yZFRyYWNrPiAgICAgICAgICAgICAgICAgICAgIG1SZWNvcmRUcmFjazsKLSAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluKiAgICAgICAgICAgICAgICAgICAgICBtSW5wdXQ7CisgICAgICAgICAgICAgICAgQXVkaW9IYXJkd2FyZUludGVyZmFjZSAgICAgICAgICAgICAgKm1BdWRpb0hhcmR3YXJlOworICAgICAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiAgICAgICAgICAgICAgICAgICAgIG1SZWNvcmRUcmFjazsKICAgICAgICAgICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKICAgICAgICAgICAgICAgICBDb25kaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICBtV2FpdFdvcmtDVjsKLSAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgICAgICAgICBtQnVmZmVyOwogICAgICAgICAgICAgICAgIHZvbGF0aWxlIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmU7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0U3RhdHVzOwogICAgIH07CiAKICAgICBmcmllbmQgY2xhc3MgQXVkaW9SZWNvcmRUaHJlYWQ7CiAKLSAgICAgICAgICAgICAgICBzcDxBdWRpb1JlY29yZFRocmVhZD4gYXVkaW9SZWNvcmRUaHJlYWQoKTsKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBlbmRSZWNvcmQoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzdGFydFJlY29yZCgpOwotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BSZWNvcmQoKTsKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBleGl0UmVjb3JkKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQXVkaW9IYXJkd2FyZUludGVyZmFjZSogYXVkaW9IYXJkd2FyZSgpIHsgcmV0dXJuIG1BdWRpb0hhcmR3YXJlOyB9CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc3RhcnRSZWNvcmQoUmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wUmVjb3JkKFJlY29yZFRyYWNrKiByZWNvcmRUcmFjayk7CiAKICAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IYXJkd2FyZUxvY2s7CiAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKKyAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRMb2NrOwogICAgIG11dGFibGUgICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdhaXRXb3JrQ1Y7CiAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBwaWRfdCwgd3A8Q2xpZW50PiA+ICAgICBtQ2xpZW50czsKICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8IHdwPFRyYWNrPiA+ICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3M7CkBAIC00NjUsMTUgKzQ2MCwxOSBAQAogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJNdXRlOwogICAgICAgICAgICAgICAgIHN0cmVhbV90eXBlX3QgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlc1tBdWRpb1RyYWNrOjpOVU1fU1RSRUFNX1RZUEVTXTsKIAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXIqICAgICAgICAgICAgICAgICAgICAgICAgIG1IYXJkd2FyZUF1ZGlvTWl4ZXI7CisgICAgICAgICAgICAgICAgQXVkaW9NaXhlciogICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBBdWRpb01peGVyOwogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXIqICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peGVyOwogICAgICAgICAgICAgICAgIEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UqICAgICAgICAgICAgIG1BdWRpb0hhcmR3YXJlOworICAgICAgICAgICAgICAgIEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UqICAgICAgICAgICAgIG1BMmRwQXVkaW9JbnRlcmZhY2U7CisgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqICAgICAgICAgICAgICAgICAgICAgbUhhcmR3YXJlT3V0cHV0OworICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiAgICAgICAgICAgICAgICAgICAgIG1BMmRwT3V0cHV0OwogICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXQ7CiAgICAgICAgICAgICAgICAgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+ICAgICAgICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkOwogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlOwogICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OwogICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7CiAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdDsKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWl4QnVmZmVyU2l6ZTsKICAgICAgICAgICAgICAgICBpbnQxNl90KiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWl4QnVmZmVyOwogICAgIG11dGFibGUgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IYXJkd2FyZVN0YXR1czsKICAgICAgICAgICAgICAgICBuc2Vjc190ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFdyaXRlVGltZTsKZGlmZiAtLWdpdCBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVHZW5lcmljLmNwcCBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVHZW5lcmljLmNwcAppbmRleCBiMWU1YjdmLi5lNmExNjNiIDEwMDY0NAotLS0gYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlR2VuZXJpYy5jcHAKKysrIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZUdlbmVyaWMuY3BwCkBAIC0yLDE2ICsyLDE2IEBACiAqKgogKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAKQEAgLTY4LDE2ICs2OCwyNSBAQAogfQogCiBBdWRpb1N0cmVhbU91dCogQXVkaW9IYXJkd2FyZUdlbmVyaWM6Om9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgIGludCBmb3JtYXQsIGludCBjaGFubmVsQ291bnQsIHVpbnQzMl90IHNhbXBsZVJhdGUpCisgICAgICAgIGludCBmb3JtYXQsIGludCBjaGFubmVsQ291bnQsIHVpbnQzMl90IHNhbXBsZVJhdGUsIHN0YXR1c190ICpzdGF0dXMpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogCiAgICAgLy8gb25seSBvbmUgb3V0cHV0IHN0cmVhbSBhbGxvd2VkCi0gICAgaWYgKG1PdXRwdXQpIHJldHVybiAwOworICAgIGlmIChtT3V0cHV0KSB7CisgICAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgICAgICpzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKICAgICAvLyBjcmVhdGUgbmV3IG91dHB1dCBzdHJlYW0KICAgICBBdWRpb1N0cmVhbU91dEdlbmVyaWMqIG91dCA9IG5ldyBBdWRpb1N0cmVhbU91dEdlbmVyaWMoKTsKLSAgICBpZiAob3V0LT5zZXQodGhpcywgbUZkLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSkgPT0gTk9fRVJST1IpIHsKKyAgICBzdGF0dXNfdCBsU3RhdHVzID0gb3V0LT5zZXQodGhpcywgbUZkLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKKyAgICB9CisgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgbU91dHB1dCA9IG91dDsKICAgICB9IGVsc2UgewogICAgICAgICBkZWxldGUgb3V0OwpAQCAtOTAsMTYgKzk5LDI1IEBACiB9CiAKIEF1ZGlvU3RyZWFtSW4qIEF1ZGlvSGFyZHdhcmVHZW5lcmljOjpvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgIGludCBmb3JtYXQsIGludCBjaGFubmVsQ291bnQsIHVpbnQzMl90IHNhbXBsZVJhdGUpCisgICAgICAgIGludCBmb3JtYXQsIGludCBjaGFubmVsQ291bnQsIHVpbnQzMl90IHNhbXBsZVJhdGUsIHN0YXR1c190ICpzdGF0dXMpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogCiAgICAgLy8gb25seSBvbmUgaW5wdXQgc3RyZWFtIGFsbG93ZWQKLSAgICBpZiAobUlucHV0KSByZXR1cm4gMDsKKyAgICBpZiAobUlucHV0KSB7CisgICAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgICAgICpzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKICAgICAvLyBjcmVhdGUgbmV3IG91dHB1dCBzdHJlYW0KICAgICBBdWRpb1N0cmVhbUluR2VuZXJpYyogaW4gPSBuZXcgQXVkaW9TdHJlYW1JbkdlbmVyaWMoKTsKLSAgICBpZiAoaW4tPnNldCh0aGlzLCBtRmQsIGZvcm1hdCwgY2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKSA9PSBOT19FUlJPUikgeworICAgIHN0YXR1c190IGxTdGF0dXMgPSBpbi0+c2V0KHRoaXMsIG1GZCwgZm9ybWF0LCBjaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CisgICAgfQorICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgIG1JbnB1dCA9IGluOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRlbGV0ZSBpbjsKZGlmZiAtLWdpdCBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVHZW5lcmljLmggYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlR2VuZXJpYy5oCmluZGV4IDEwY2M0NWQuLmEyMzQyY2QgMTAwNjQ0Ci0tLSBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVHZW5lcmljLmgKKysrIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZUdlbmVyaWMuaApAQCAtMiwxNiArMiwxNiBAQAogKioKICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCkBAIC0yMyw3ICsyMyw3IEBACiAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKLSNpbmNsdWRlIDxoYXJkd2FyZS9BdWRpb0hhcmR3YXJlSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvQXVkaW9IYXJkd2FyZUJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00Nyw2ICs0Nyw3IEBACiAgICAgdmlydHVhbCBzaXplX3QgICAgICBidWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gNDA5NjsgfQogICAgIHZpcnR1YWwgaW50ICAgICAgICAgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gMjsgfQogICAgIHZpcnR1YWwgaW50ICAgICAgICAgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQ7IH0KKyAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGxhdGVuY3koKSBjb25zdCB7IHJldHVybiAwOyB9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQogICAgIHZpcnR1YWwgc3NpemVfdCAgICAgd3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgYnl0ZXMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwpAQCAtNzYsNiArNzcsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0R2FpbihmbG9hdCBnYWluKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQogICAgIHZpcnR1YWwgc3NpemVfdCAgICAgcmVhZCh2b2lkKiBidWZmZXIsIHNzaXplX3QgYnl0ZXMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhbmRieSgpIHsgcmV0dXJuIE5PX0VSUk9SOyB9CiAKIHByaXZhdGU6CiAgICAgQXVkaW9IYXJkd2FyZUdlbmVyaWMgKm1BdWRpb0hhcmR3YXJlOwpAQCAtODQsNyArODYsNyBAQAogfTsKIAogCi1jbGFzcyBBdWRpb0hhcmR3YXJlR2VuZXJpYyA6IHB1YmxpYyAgQXVkaW9IYXJkd2FyZUludGVyZmFjZQorY2xhc3MgQXVkaW9IYXJkd2FyZUdlbmVyaWMgOiBwdWJsaWMgQXVkaW9IYXJkd2FyZUJhc2UKIHsKIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvSGFyZHdhcmVHZW5lcmljKCk7CkBAIC0xMDUsMTIgKzEwNywxNCBAQAogICAgIHZpcnR1YWwgQXVkaW9TdHJlYW1PdXQqIG9wZW5PdXRwdXRTdHJlYW0oCiAgICAgICAgICAgICBpbnQgZm9ybWF0PTAsCiAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50PTAsCi0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlPTApOworICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZT0wLAorICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cz0wKTsKIAogICAgIHZpcnR1YWwgQXVkaW9TdHJlYW1Jbiogb3BlbklucHV0U3RyZWFtKAogICAgICAgICAgICAgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGNsb3NlT3V0cHV0U3RyZWFtKEF1ZGlvU3RyZWFtT3V0R2VuZXJpYyogb3V0KTsKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBjbG9zZUlucHV0U3RyZWFtKEF1ZGlvU3RyZWFtSW5HZW5lcmljKiBpbik7CkBAIC0xMjAsNyArMTI0LDcgQEAKIAogcHJpdmF0ZToKICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0gICAgCisKICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsKICAgICBBdWRpb1N0cmVhbU91dEdlbmVyaWMgICAqbU91dHB1dDsKICAgICBBdWRpb1N0cmVhbUluR2VuZXJpYyAgICAqbUlucHV0OwpkaWZmIC0tZ2l0IGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZUludGVyZmFjZS5jcHAgYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlSW50ZXJmYWNlLmNwcAppbmRleCA3Mzg3YjNkLi5hYzc2YTE5IDEwMDY0NAotLS0gYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlSW50ZXJmYWNlLmNwcAorKysgYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlSW50ZXJmYWNlLmNwcApAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgIkF1ZGlvSGFyZHdhcmVTdHViLmgiCiAjaW5jbHVkZSAiQXVkaW9IYXJkd2FyZUdlbmVyaWMuaCIKIAotLy8gI2RlZmluZSBEVU1QX0ZMSU5HRVJfT1VUICAgICAgICAvLyBpZiBkZWZpbmVkIGFsbG93cyByZWNvcmRpbmcgc2FtcGxlcyBpbiBhIGZpbGUKKy8vI2RlZmluZSBEVU1QX0ZMSU5HRVJfT1VUICAgICAgICAvLyBpZiBkZWZpbmVkIGFsbG93cyByZWNvcmRpbmcgc2FtcGxlcyBpbiBhIGZpbGUKICNpZmRlZiBEVU1QX0ZMSU5HRVJfT1VUCiAjaW5jbHVkZSAiQXVkaW9EdW1wSW50ZXJmYWNlLmgiCiAjZW5kaWYKQEAgLTU0LDYgKzU0LDcgQEAKICAgICAiU1BFQUtFUiAiLAogICAgICJCTFVFVE9PVEggIiwKICAgICAiSEVBRFNFVCAiCisgICAgIkJMVUVUT09USF9BMkRQICIKIH07CiBzdGF0aWMgY29uc3QgY2hhciogcm91dGVOb25lID0gIk5PTkUiOwogCkBAIC0xMTUsMjQgKzExNiwxMCBAQAogICAgIC8vIFRoaXMgY29kZSBhZGRzIGEgcmVjb3JkIG9mIGJ1ZmZlcnMgaW4gYSBmaWxlIHRvIHdyaXRlIGNhbGxzIG1hZGUgYnkgQXVkaW9GbGluZ2VyLgogICAgIC8vIEl0IHJlcGxhY2VzIHRoZSBjdXJyZW50IEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2Ugb2JqZWN0IGJ5IGFuIGludGVybWVkaWF0ZSBvbmUgd2hpY2gKICAgICAvLyB3aWxsIHJlY29yZCBidWZmZXJzIGluIGEgZmlsZSAoYWZ0ZXIgc2VuZGluZyB0aGVtIHRvIGhhcmR3YXJlKSBmb3IgdGVzdGluZyBwdXJwb3NlLgotICAgIC8vIFRoaXMgZmVhdHVyZSBpcyBlbmFibGVkIGJ5IGRlZmluaW5nIHN5bWJvbCBEVU1QX0ZMSU5HRVJfT1VUIGFuZCBzZXR0aW5nIGVudmlyb25lbWVudAotICAgIC8vICJhdWRpb2ZsaW5nZXIuZHVtcCA9IDEiLiBUaGUgb3V0cHV0IGZpbGUgaXMgInRtcC9GbGluZ2VyT3V0LnBjbSIuIFBhdXNlIGFyZSBub3QgcmVjb3JkZWQKLSAgICAvLyBpbiB0aGUgZmlsZS4KKyAgICAvLyBUaGlzIGZlYXR1cmUgaXMgZW5hYmxlZCBieSBkZWZpbmluZyBzeW1ib2wgRFVNUF9GTElOR0VSX09VVC4KKyAgICAvLyBUaGUgb3V0cHV0IGZpbGUgaXMgRkxJTkdFUl9EVU1QX05BTUUuIFBhdXNlIGFyZSBub3QgcmVjb3JkZWQgaW4gdGhlIGZpbGUuCiAgICAgCi0gICAgLy8gcmVhZCBkdW1wIG1vZGUKLSAgICBwcm9wZXJ0eV9nZXQoImF1ZGlvZmxpbmdlci5kdW1wIiwgdmFsdWUsICIwIik7Ci0gICAgc3dpdGNoKHZhbHVlWzBdKSB7Ci0gICAgY2FzZSAnMSc6Ci0gICAgICAgIExPR1YoIkR1bXAgbW9kZSIpOwotICAgICAgICBodyA9IG5ldyBBdWRpb0R1bXBJbnRlcmZhY2UoaHcpOyAgICAvLyByZXBsYWNlIGludGVyZmFjZQotICAgICAgICByZXR1cm4gaHc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgJzAnOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR1YoIk5vIER1bXAgbW9kZSIpOwotICAgICAgICByZXR1cm4gaHc7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KKyAgICBodyA9IG5ldyBBdWRpb0R1bXBJbnRlcmZhY2UoaHcpOyAgICAvLyByZXBsYWNlIGludGVyZmFjZQogI2VuZGlmCiAgICAgcmV0dXJuIGh3OwogfQpAQCAtMTQzLDcgKzEzMCw3IEBACiAKIEF1ZGlvU3RyZWFtSW46On5BdWRpb1N0cmVhbUluKCkge30KIAotQXVkaW9IYXJkd2FyZUludGVyZmFjZTo6QXVkaW9IYXJkd2FyZUludGVyZmFjZSgpCitBdWRpb0hhcmR3YXJlQmFzZTo6QXVkaW9IYXJkd2FyZUJhc2UoKQogewogICAgIC8vIGZvcmNlIGEgcm91dGluZyB1cGRhdGUgb24gaW5pdGlhbGl6YXRpb24KICAgICBtZW1zZXQoJm1Sb3V0ZXMsIDAsIHNpemVvZihtUm91dGVzKSk7CkBAIC0xNTEsNyArMTM4LDcgQEAKIH0KIAogLy8gZ2VuZXJpY3MgZm9yIGF1ZGlvIHJvdXRpbmcgLSB0aGUgcmVhbCB3b3JrIGlzIGRvbmUgaW4gZG9Sb3V0aW5nCi1zdGF0dXNfdCBBdWRpb0hhcmR3YXJlSW50ZXJmYWNlOjpzZXRSb3V0aW5nKGludCBtb2RlLCB1aW50MzJfdCByb3V0ZXMpCitzdGF0dXNfdCBBdWRpb0hhcmR3YXJlQmFzZTo6c2V0Um91dGluZyhpbnQgbW9kZSwgdWludDMyX3Qgcm91dGVzKQogewogI2lmIExPR19ST1VUSU5HX0NBTExTCiAgICAgTE9HRCgic2V0Um91dGluZzogbW9kZT0lcywgcm91dGVzPVslc10iLCBkaXNwbGF5TW9kZShtb2RlKSwgZGlzcGxheVJvdXRlcyhyb3V0ZXMpKTsKQEAgLTE3Myw3ICsxNjAsNyBAQAogICAgIHJldHVybiBkb1JvdXRpbmcoKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9IYXJkd2FyZUludGVyZmFjZTo6Z2V0Um91dGluZyhpbnQgbW9kZSwgdWludDMyX3QqIHJvdXRlcykKK3N0YXR1c190IEF1ZGlvSGFyZHdhcmVCYXNlOjpnZXRSb3V0aW5nKGludCBtb2RlLCB1aW50MzJfdCogcm91dGVzKQogewogICAgIGlmIChtb2RlID09IEF1ZGlvU3lzdGVtOjpNT0RFX0NVUlJFTlQpCiAgICAgICAgIG1vZGUgPSBtTW9kZTsKQEAgLTE4Nyw3ICsxNzQsNyBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9IYXJkd2FyZUludGVyZmFjZTo6c2V0TW9kZShpbnQgbW9kZSkKK3N0YXR1c190IEF1ZGlvSGFyZHdhcmVCYXNlOjpzZXRNb2RlKGludCBtb2RlKQogewogI2lmIExPR19ST1VUSU5HX0NBTExTCiAgICAgTE9HRCgic2V0TW9kZSglcykiLCBkaXNwbGF5TW9kZShtb2RlKSk7CkBAIC0yMDQsMjUgKzE5MSw0NSBAQAogICAgIHJldHVybiBkb1JvdXRpbmcoKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9IYXJkd2FyZUludGVyZmFjZTo6Z2V0TW9kZShpbnQqIG1vZGUpCitzdGF0dXNfdCBBdWRpb0hhcmR3YXJlQmFzZTo6Z2V0TW9kZShpbnQqIG1vZGUpCiB7CiAgICAgLy8gSW1wbGVtZW50OiBzZXQgYXVkaW8gcm91dGluZwogICAgICptb2RlID0gbU1vZGU7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb0hhcmR3YXJlSW50ZXJmYWNlOjpzZXRQYXJhbWV0ZXIoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkKK3N0YXR1c190IEF1ZGlvSGFyZHdhcmVCYXNlOjpzZXRQYXJhbWV0ZXIoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkKIHsKICAgICAvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHRvIGlnbm9yZQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9IYXJkd2FyZUludGVyZmFjZTo6ZHVtcFN0YXRlKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKKworLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorc2l6ZV90IEF1ZGlvSGFyZHdhcmVCYXNlOjpnZXRJbnB1dEJ1ZmZlclNpemUodWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGZvcm1hdCwgaW50IGNoYW5uZWxDb3VudCkKK3sKKyAgICBpZiAoc2FtcGxlUmF0ZSAhPSA4MDAwKSB7CisgICAgICAgIExPR1coImdldElucHV0QnVmZmVyU2l6ZSBiYWQgc2FtcGxpbmcgcmF0ZTogJWQiLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChmb3JtYXQgIT0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQpIHsKKyAgICAgICAgTE9HVygiZ2V0SW5wdXRCdWZmZXJTaXplIGJhZCBmb3JtYXQ6ICVkIiwgZm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChjaGFubmVsQ291bnQgIT0gMSkgeworICAgICAgICBMT0dXKCJnZXRJbnB1dEJ1ZmZlclNpemUgYmFkIGNoYW5uZWwgY291bnQ6ICVkIiwgY2hhbm5lbENvdW50KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDMyMDsKK30KKworc3RhdHVzX3QgQXVkaW9IYXJkd2FyZUJhc2U6OmR1bXBTdGF0ZShpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9IYXJkd2FyZUludGVyZmFjZTo6ZHVtcFN0YXRlXG4iKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb0hhcmR3YXJlQmFzZTo6ZHVtcFN0YXRlXG4iKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRtTW9kZTogJWRcbiIsIG1Nb2RlKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CmRpZmYgLS1naXQgYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlU3R1Yi5jcHAgYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlU3R1Yi5jcHAKaW5kZXggMDA0NmRiOC4uZDMwOTkwMiAxMDA2NDQKLS0tIGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZVN0dWIuY3BwCisrKyBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVTdHViLmNwcApAQCAtMiwxNiArMiwxNiBAQAogKioKICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCkBAIC00NywyMCArNDcsMjggQEAKIH0KIAogQXVkaW9TdHJlYW1PdXQqIEF1ZGlvSGFyZHdhcmVTdHViOjpvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICBpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbENvdW50LCB1aW50MzJfdCBzYW1wbGVSYXRlKQorICAgICAgICBpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbENvdW50LCB1aW50MzJfdCBzYW1wbGVSYXRlLCBzdGF0dXNfdCAqc3RhdHVzKQogewogICAgIEF1ZGlvU3RyZWFtT3V0U3R1Yiogb3V0ID0gbmV3IEF1ZGlvU3RyZWFtT3V0U3R1YigpOwotICAgIGlmIChvdXQtPnNldChmb3JtYXQsIGNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSkgPT0gTk9fRVJST1IpCisgICAgc3RhdHVzX3QgbFN0YXR1cyA9IG91dC0+c2V0KGZvcm1hdCwgY2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOworICAgIH0KKyAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikKICAgICAgICAgcmV0dXJuIG91dDsKICAgICBkZWxldGUgb3V0OwogICAgIHJldHVybiAwOwogfQogCiBBdWRpb1N0cmVhbUluKiBBdWRpb0hhcmR3YXJlU3R1Yjo6b3BlbklucHV0U3RyZWFtKAotICAgICAgICBpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbENvdW50LCB1aW50MzJfdCBzYW1wbGVSYXRlKQorICAgICAgICBpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbENvdW50LCB1aW50MzJfdCBzYW1wbGVSYXRlLCBzdGF0dXNfdCAqc3RhdHVzKQogewogICAgIEF1ZGlvU3RyZWFtSW5TdHViKiBpbiA9IG5ldyBBdWRpb1N0cmVhbUluU3R1YigpOwotICAgIGlmIChpbi0+c2V0KGZvcm1hdCwgY2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKSA9PSBOT19FUlJPUikKKyAgICBzdGF0dXNfdCBsU3RhdHVzID0gaW4tPnNldChmb3JtYXQsIGNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKKyAgICB9CisgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpCiAgICAgICAgIHJldHVybiBpbjsKICAgICBkZWxldGUgaW47CiAgICAgcmV0dXJuIDA7CkBAIC0xMDIsNyArMTEwLDcgQEAKICAgICBpZiAoZm9ybWF0ID09IDApIGZvcm1hdCA9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUOwogICAgIGlmIChjaGFubmVscyA9PSAwKSBjaGFubmVscyA9IGNoYW5uZWxDb3VudCgpOwogICAgIGlmIChyYXRlID09IDApIHJhdGUgPSBzYW1wbGVSYXRlKCk7Ci0gICAgCisKICAgICBpZiAoKGZvcm1hdCA9PSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCkgJiYKICAgICAgICAgICAgIChjaGFubmVscyA9PSBjaGFubmVsQ291bnQoKSkgJiYKICAgICAgICAgICAgIChyYXRlID09IHNhbXBsZVJhdGUoKSkpCkBAIC0xMjksNyArMTM3LDcgQEAKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdGZvcm1hdDogJWRcbiIsIGZvcm1hdCgpKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7IAorICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZVN0dWIuaCBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVTdHViLmgKaW5kZXggMWE2MTU1Mi4uNTMxNmQ2MCAxMDA2NDQKLS0tIGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZVN0dWIuaAorKysgYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlU3R1Yi5oCkBAIC0yLDE2ICsyLDE2IEBACiAqKgogKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgPGhhcmR3YXJlL0F1ZGlvSGFyZHdhcmVJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9BdWRpb0hhcmR3YXJlQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM0LDYgKzM0LDcgQEAKICAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGJ1ZmZlclNpemUoKSBjb25zdCB7IHJldHVybiA0MDk2OyB9CiAgICAgdmlydHVhbCBpbnQgICAgICAgICBjaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiAyOyB9CiAgICAgdmlydHVhbCBpbnQgICAgICAgICBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsgfQorICAgIHZpcnR1YWwgdWludDMyX3QgICAgbGF0ZW5jeSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZvbHVtZShmbG9hdCB2b2x1bWUpIHsgcmV0dXJuIE5PX0VSUk9SOyB9CiAgICAgdmlydHVhbCBzc2l6ZV90ICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBieXRlcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CkBAIC00OSw5ICs1MCwxMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0R2FpbihmbG9hdCBnYWluKSB7IHJldHVybiBOT19FUlJPUjsgfQogICAgIHZpcnR1YWwgc3NpemVfdCAgICAgcmVhZCh2b2lkKiBidWZmZXIsIHNzaXplX3QgYnl0ZXMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhbmRieSgpIHsgcmV0dXJuIE5PX0VSUk9SOyB9CiB9OwogCi1jbGFzcyBBdWRpb0hhcmR3YXJlU3R1YiA6IHB1YmxpYyAgQXVkaW9IYXJkd2FyZUludGVyZmFjZQorY2xhc3MgQXVkaW9IYXJkd2FyZVN0dWIgOiBwdWJsaWMgIEF1ZGlvSGFyZHdhcmVCYXNlCiB7CiBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0hhcmR3YXJlU3R1YigpOwpAQCAtNzIsMTIgKzc0LDE0IEBACiAgICAgdmlydHVhbCBBdWRpb1N0cmVhbU91dCogb3Blbk91dHB1dFN0cmVhbSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdD0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50PTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGU9MCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGU9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cz0wKTsKIAogICAgIHZpcnR1YWwgQXVkaW9TdHJlYW1Jbiogb3BlbklucHV0U3RyZWFtKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGRvUm91dGluZygpIHsgcmV0dXJuIE5PX0VSUk9SOyB9CmRpZmYgLS1naXQgYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcCBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCmluZGV4IDlmMWIxN2YuLmIwMzQ2N2YgMTAwNjQ0Ci0tLSBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCisrKyBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCkBAIC0yLDE2ICsyLDE2IEBACiAqKgogKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAKQEAgLTI0Nyw4ICsyNDcsOCBAQAogdm9pZCBBdWRpb01peGVyOjp0cmFja190OjphZGp1c3RWb2x1bWVSYW1wKCkKIHsKICAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKLSAgICAgICAgaWYgKCgodm9sdW1lSW5jW2ldPjApICYmICgocHJldlZvbHVtZVtpXT4+MTYpID49IHZvbHVtZVtpXSkpIHx8Ci0gICAgICAgICAgICAoKHZvbHVtZUluY1tpXTwwKSAmJiAoKHByZXZWb2x1bWVbaV0+PjE2KSA8PSB2b2x1bWVbaV0pKSkgeworICAgICAgICBpZiAoKCh2b2x1bWVJbmNbaV0+MCkgJiYgKCgocHJldlZvbHVtZVtpXSt2b2x1bWVJbmNbaV0pPj4xNikgPj0gdm9sdW1lW2ldKSkgfHwKKyAgICAgICAgICAgICgodm9sdW1lSW5jW2ldPDApICYmICgoKHByZXZWb2x1bWVbaV0rdm9sdW1lSW5jW2ldKT4+MTYpIDw9IHZvbHVtZVtpXSkpKSB7CiAgICAgICAgICAgICB2b2x1bWVJbmNbaV0gPSAwOwogICAgICAgICAgICAgcHJldlZvbHVtZVtpXSA9IHZvbHVtZVtpXTw8MTY7CiAgICAgICAgIH0KQEAgLTMwNyw3ICszMDcsNyBAQAogICAgICAgICBuIHw9IE5FRURTX0NIQU5ORUxfMSArIHQuY2hhbm5lbENvdW50IC0gMTsKICAgICAgICAgbiB8PSBORUVEU19GT1JNQVRfMTY7CiAgICAgICAgIG4gfD0gdC5kb2VzUmVzYW1wbGUoKSA/IE5FRURTX1JFU0FNUExFX0VOQUJMRUQgOiBORUVEU19SRVNBTVBMRV9ESVNBQkxFRDsKLSAgICAgICAgCisgICAgICAgCiAgICAgICAgIGlmICh0LnZvbHVtZUluY1swXXx0LnZvbHVtZUluY1sxXSkgewogICAgICAgICAgICAgdm9sdW1lUmFtcCA9IDE7CiAgICAgICAgIH0gZWxzZSBpZiAoIXQuZG9lc1Jlc2FtcGxlKCkgJiYgdC52b2x1bWVSTCA9PSAwKSB7CkBAIC0zNzAsNyArMzcwLDcgQEAKIAogICAgc3RhdGUtPmhvb2soc3RhdGUsIG91dHB1dCk7CiAKLSAgIC8vIE5vdyB0aGF0IHRoZSB2b2x1bWUgcmFtcCBoYXMgYmVlbiBkb25lLCBzZXQgb3B0aW1hbCBzdGF0ZSBhbmQgCisgICAvLyBOb3cgdGhhdCB0aGUgdm9sdW1lIHJhbXAgaGFzIGJlZW4gZG9uZSwgc2V0IG9wdGltYWwgc3RhdGUgYW5kCiAgICAvLyB0cmFjayBob29rcyBmb3Igc3Vic2VxdWVudCBtaXhlciBwcm9jZXNzCiAgICBpZiAoY291bnRBY3RpdmVUcmFja3MpIHsKICAgICAgICBpbnQgYWxsTXV0ZWQgPSAxOwpAQCAtMzk3LDcgKzM5Nyw3IEBACiAgICB9CiB9CiAKLXN0YXRpYyBpbmxpbmUgCitzdGF0aWMgaW5saW5lCiBpbnQzMl90IG11bEFkZChpbnQxNl90IGluLCBpbnQxNl90IHYsIGludDMyX3QgYSkKIHsKICNpZiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fdGh1bWJfXykKQEAgLTQxMiw3ICs0MTIsNyBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgCitzdGF0aWMgaW5saW5lCiBpbnQzMl90IG11bChpbnQxNl90IGluLCBpbnQxNl90IHYpCiB7CiAjaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCkBAIC00MjcsNyArNDI3LDcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIAorc3RhdGljIGlubGluZQogaW50MzJfdCBtdWxBZGRSTChpbnQgbGVmdCwgdWludDMyX3QgaW5STCwgdWludDMyX3QgdlJMLCBpbnQzMl90IGEpCiB7CiAjaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCkBAIC00NTMsNyArNDUzLDcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIAorc3RhdGljIGlubGluZQogaW50MzJfdCBtdWxSTChpbnQgbGVmdCwgdWludDMyX3QgaW5STCwgdWludDMyX3QgdlJMKQogewogI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQpAQCAtNTEzLDcgKzUxMyw3IEBACiAgICAgLy9MT0dEKCJbMF0gJXA6IGluYz0lZiwgdjA9JWYsIHYxPSVkLCBmaW5hbD0lZiwgY291bnQ9JWQiLAogICAgIC8vICAgICAgICB0LCB2bEluYy82NTUzNi4wZiwgdmwvNjU1MzYuMGYsIHQtPnZvbHVtZVswXSwKICAgICAvLyAgICAgICAodmwgKyB2bEluYypmcmFtZUNvdW50KS82NTUzNi4wZiwgZnJhbWVDb3VudCk7Ci0gICAgCisgICAKICAgICAvLyByYW1wIHZvbHVtZQogICAgIGRvIHsKICAgICAgICAgKm91dCsrICs9ICh2bCA+PiAxNikgKiAoKnRlbXArKyA+PiAxMik7CkBAIC01NDgsNyArNTQ4LDcgQEAKICAgICAgICAgICAgIHZsICs9IHZsSW5jOwogICAgICAgICAgICAgdnIgKz0gdnJJbmM7CiAgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7Ci0gICAgICAgIAorICAgICAgIAogICAgICAgICB0LT5wcmV2Vm9sdW1lWzBdID0gdmw7CiAgICAgICAgIHQtPnByZXZWb2x1bWVbMV0gPSB2cjsKICAgICAgICAgdC0+YWRqdXN0Vm9sdW1lUmFtcCgpOwpAQCAtNTkwLDcgKzU5MCw3IEBACiAgICAgICAgICAgICB2bCArPSB2bEluYzsKICAgICAgICAgICAgIHZyICs9IHZySW5jOwogICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwotICAgICAgICAKKyAgICAgICAKICAgICAgICAgdC0+cHJldlZvbHVtZVswXSA9IHZsOwogICAgICAgICB0LT5wcmV2Vm9sdW1lWzFdID0gdnI7CiAgICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAoKTsKQEAgLTYwOSw3ICs2MDksNyBAQAogICAgIHQtPmluID0gaW47CiB9CiAKLWlubGluZSAKK2lubGluZQogdm9pZCBBdWRpb01peGVyOjpkaXRoZXJBbmRDbGFtcChpbnQzMl90KiBvdXQsIGludDMyX3QgY29uc3QgKnN1bXMsIHNpemVfdCBjKQogewogICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8YyA7IGkrKykgewpAQCAtNjMzLDggKzYzMywxMiBAQAogICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2Nseihlbik7CiAgICAgICAgIGVuICY9IH4oMTw8aSk7CiAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOwotICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZ0LmJ1ZmZlcik7Ci0gICAgICAgIGlmICh0LmJ1ZmZlci5yYXcpIHsKKyAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OworICAgICAgICB3aGlsZSAob3V0RnJhbWVzKSB7CisgICAgICAgICAgICB0LmJ1ZmZlci5mcmFtZUNvdW50ID0gb3V0RnJhbWVzOworICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC5idWZmZXIpOworICAgICAgICAgICAgaWYgKCF0LmJ1ZmZlci5yYXcpIGJyZWFrOworICAgICAgICAgICAgb3V0RnJhbWVzIC09IHQuYnVmZmVyLmZyYW1lQ291bnQ7CiAgICAgICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0LmJ1ZmZlcik7CiAgICAgICAgIH0KICAgICB9CkBAIC02NTIsMTIgKzY1NiwxNCBAQAogICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2Nseihlbik7CiAgICAgICAgIGVuICY9IH4oMTw8aSk7CiAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOworICAgICAgICB0LmJ1ZmZlci5mcmFtZUNvdW50ID0gc3RhdGUtPmZyYW1lQ291bnQ7CiAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnQuYnVmZmVyKTsKKyAgICAgICAgdC5mcmFtZUNvdW50ID0gdC5idWZmZXIuZnJhbWVDb3VudDsKICAgICAgICAgdC5pbiA9IHQuYnVmZmVyLnJhdzsKICAgICAgICAgLy8gdC5pbiA9PSBOVUxMIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCiAgICAgICAgIC8vIGJlZW4gZW5hYmxlZCBmb3IgbWl4aW5nLgogICAgICAgICBpZiAodC5pbiA9PSBOVUxMKQotICAgICAgICAgICAgZW5hYmxlZFRyYWNrcyAmPSB+KDE8PGkpOyAKKyAgICAgICAgICAgIGVuYWJsZWRUcmFja3MgJj0gfigxPDxpKTsKICAgICB9CiAKICAgICAvLyB0aGlzIGFzc3VtZXMgb3V0cHV0IDE2IGJpdHMgc3RlcmVvLCBubyByZXNhbXBsaW5nCkBAIC02NzEsMTIgKzY3NywzMSBAQAogICAgICAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZW4pOwogICAgICAgICAgICAgZW4gJj0gfigxPDxpKTsKICAgICAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOwotICAgICAgICAgICAgKHQuaG9vaykoJnQsIG91dFRlbXAsIEJMT0NLU0laRSwgc3RhdGUtPnJlc2FtcGxlVGVtcCk7CisgICAgICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gQkxPQ0tTSVpFOworICAgICAgICAgICAKKyAgICAgICAgICAgIHdoaWxlIChvdXRGcmFtZXMpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgaW5GcmFtZXMgPSAodC5mcmFtZUNvdW50ID4gb3V0RnJhbWVzKT9vdXRGcmFtZXM6dC5mcmFtZUNvdW50OworICAgICAgICAgICAgICAgIGlmIChpbkZyYW1lcykgeworICAgICAgICAgICAgICAgICAgICAodC5ob29rKSgmdCwgb3V0VGVtcCArIChCTE9DS1NJWkUtb3V0RnJhbWVzKSpNQVhfTlVNX0NIQU5ORUxTLCBpbkZyYW1lcywgc3RhdGUtPnJlc2FtcGxlVGVtcCk7CisgICAgICAgICAgICAgICAgICAgIHQuZnJhbWVDb3VudCAtPSBpbkZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgb3V0RnJhbWVzIC09IGluRnJhbWVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodC5mcmFtZUNvdW50ID09IDAgJiYgb3V0RnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJnQuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgdC5idWZmZXIuZnJhbWVDb3VudCA9IG51bUZyYW1lcyAtIChCTE9DS1NJWkUgLSBvdXRGcmFtZXMpOworICAgICAgICAgICAgICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZ0LmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIHQuaW4gPSB0LmJ1ZmZlci5yYXc7CisgICAgICAgICAgICAgICAgICAgIGlmICh0LmluID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRUcmFja3MgJj0gfigxPDxpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHQuZnJhbWVDb3VudCA9IHQuYnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGRpdGhlckFuZENsYW1wKG91dCwgb3V0VGVtcCwgQkxPQ0tTSVpFKTsKICAgICAgICAgb3V0ICs9IEJMT0NLU0laRTsKLQogICAgICAgICBudW1GcmFtZXMgLT0gQkxPQ0tTSVpFOwogICAgIH0gd2hpbGUgKG51bUZyYW1lcyk7CiAKQEAgLTcxMywxMiArNzM4LDE5IEBACiAgICAgICAgIGlmICgodC5uZWVkcyAmIE5FRURTX1JFU0FNUExFX19NQVNLKSA9PSBORUVEU19SRVNBTVBMRV9FTkFCTEVEKSB7CiAgICAgICAgICAgICAodC5ob29rKSgmdCwgb3V0VGVtcCwgbnVtRnJhbWVzLCBzdGF0ZS0+cmVzYW1wbGVUZW1wKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnQuYnVmZmVyKTsKLSAgICAgICAgICAgIHQuaW4gPSB0LmJ1ZmZlci5yYXc7Ci0gICAgICAgICAgICAvLyB0LmluID09IE5VTEwgY2FuIGhhcHBlbiBpZiB0aGUgdHJhY2sgd2FzIGZsdXNoZWQganVzdCBhZnRlciBoYXZpbmcKLSAgICAgICAgICAgIC8vIGJlZW4gZW5hYmxlZCBmb3IgbWl4aW5nLgotICAgICAgICAgICAgaWYgKHQuaW4pIHsKLSAgICAgICAgICAgICAgICAodC5ob29rKSgmdCwgb3V0VGVtcCwgbnVtRnJhbWVzLCBzdGF0ZS0+cmVzYW1wbGVUZW1wKTsKKworICAgICAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IG51bUZyYW1lczsKKyAgICAgICAgICAgCisgICAgICAgICAgICB3aGlsZSAob3V0RnJhbWVzKSB7CisgICAgICAgICAgICAgICAgdC5idWZmZXIuZnJhbWVDb3VudCA9IG91dEZyYW1lczsKKyAgICAgICAgICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZ0LmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgdC5pbiA9IHQuYnVmZmVyLnJhdzsKKyAgICAgICAgICAgICAgICAvLyB0LmluID09IE5VTEwgY2FuIGhhcHBlbiBpZiB0aGUgdHJhY2sgd2FzIGZsdXNoZWQganVzdCBhZnRlciBoYXZpbmcKKyAgICAgICAgICAgICAgICAvLyBiZWVuIGVuYWJsZWQgZm9yIG1peGluZy4KKyAgICAgICAgICAgICAgICBpZiAodC5pbiA9PSBOVUxMKSBicmVhazsKKworICAgICAgICAgICAgICAgICh0Lmhvb2spKCZ0LCBvdXRUZW1wICsgKG51bUZyYW1lcy1vdXRGcmFtZXMpKk1BWF9OVU1fQ0hBTk5FTFMsIHQuYnVmZmVyLmZyYW1lQ291bnQsIHN0YXRlLT5yZXNhbXBsZVRlbXApOworICAgICAgICAgICAgICAgIG91dEZyYW1lcyAtPSB0LmJ1ZmZlci5mcmFtZUNvdW50OwogICAgICAgICAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJnQuYnVmZmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzM0LDQ1ICs3NjYsNTEgQEAKICAgICBjb25zdCB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKIAogICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciYgYih0LmJ1ZmZlcik7Ci0gICAgdC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYik7Ci0gICAgaW50MTZfdCBjb25zdCAqaW4gPSB0LmJ1ZmZlci5pMTY7Ci0KLSAgICAvLyBpbiA9PSBOVUxMIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCi0gICAgLy8gYmVlbiBlbmFibGVkIGZvciBtaXhpbmcuCi0gICAgaWYgKGluID09IE5VTEwpIHsKLSAgICAgICAgbWVtc2V0KG91dHB1dCwgMCwgc3RhdGUtPmZyYW1lQ291bnQqTUFYX05VTV9DSEFOTkVMUypzaXplb2YoaW50MTZfdCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAorICAgCiAgICAgaW50MzJfdCogb3V0ID0gc3RhdGljX2Nhc3Q8aW50MzJfdCo+KG91dHB1dCk7CiAgICAgc2l6ZV90IG51bUZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OworICAKICAgICBjb25zdCBpbnQxNl90IHZsID0gdC52b2x1bWVbMF07CiAgICAgY29uc3QgaW50MTZfdCB2ciA9IHQudm9sdW1lWzFdOwogICAgIGNvbnN0IHVpbnQzMl90IHZybCA9IHQudm9sdW1lUkw7Ci0gICAgaWYgKFVOTElLRUxZKHVpbnQzMl90KHZsKSA+IFVOSVRZX0dBSU4gfHwgdWludDMyX3QodnIpID4gVU5JVFlfR0FJTikpIHsKLSAgICAgICAgLy8gdm9sdW1lIGlzIGJvb3N0ZWQsIHNvIHdlIG1pZ2h0IG5lZWQgdG8gY2xhbXAgZXZlbiB0aG91Z2gKLSAgICAgICAgLy8gd2UgcHJvY2VzcyBvbmx5IG9uZSB0cmFjay4KLSAgICAgICAgZG8gewotICAgICAgICAgICAgdWludDMyX3QgcmwgPSAqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCBjb25zdCAqPihpbik7Ci0gICAgICAgICAgICBpbiArPSAyOwotICAgICAgICAgICAgaW50MzJfdCBsID0gbXVsUkwoMSwgcmwsIHZybCkgPj4gMTI7Ci0gICAgICAgICAgICBpbnQzMl90IHIgPSBtdWxSTCgwLCBybCwgdnJsKSA+PiAxMjsKLSAgICAgICAgICAgIC8vIGNsYW1waW5nLi4uCi0gICAgICAgICAgICBsID0gY2xhbXAxNihsKTsKLSAgICAgICAgICAgIHIgPSBjbGFtcDE2KHIpOwotICAgICAgICAgICAgKm91dCsrID0gKHI8PDE2KSB8IChsICYgMHhGRkZGKTsKLSAgICAgICAgfSB3aGlsZSAoLS1udW1GcmFtZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QgY29uc3QgKj4oaW4pOwotICAgICAgICAgICAgaW4gKz0gMjsKLSAgICAgICAgICAgIGludDMyX3QgbCA9IG11bFJMKDEsIHJsLCB2cmwpID4+IDEyOwotICAgICAgICAgICAgaW50MzJfdCByID0gbXVsUkwoMCwgcmwsIHZybCkgPj4gMTI7Ci0gICAgICAgICAgICAqb3V0KysgPSAocjw8MTYpIHwgKGwgJiAweEZGRkYpOwotICAgICAgICB9IHdoaWxlICgtLW51bUZyYW1lcyk7Ci0gICAgfQorICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgYi5mcmFtZUNvdW50ID0gbnVtRnJhbWVzOworICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZiKTsKKyAgICAgICAgaW50MTZfdCBjb25zdCAqaW4gPSBiLmkxNjsKIAotICAgIHQuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmIpOworICAgICAgICAvLyBpbiA9PSBOVUxMIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCisgICAgICAgIC8vIGJlZW4gZW5hYmxlZCBmb3IgbWl4aW5nLgorICAgICAgICBpZiAoaW4gPT0gTlVMTCkgeworICAgICAgICAgICAgbWVtc2V0KG91dCwgMCwgbnVtRnJhbWVzKk1BWF9OVU1fQ0hBTk5FTFMqc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gYi5mcmFtZUNvdW50OworICAgICAgIAorICAgICAgICBpZiAoVU5MSUtFTFkodWludDMyX3QodmwpID4gVU5JVFlfR0FJTiB8fCB1aW50MzJfdCh2cikgPiBVTklUWV9HQUlOKSkgeworICAgICAgICAgICAgLy8gdm9sdW1lIGlzIGJvb3N0ZWQsIHNvIHdlIG1pZ2h0IG5lZWQgdG8gY2xhbXAgZXZlbiB0aG91Z2gKKyAgICAgICAgICAgIC8vIHdlIHByb2Nlc3Mgb25seSBvbmUgdHJhY2suCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcmwgPSAqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCBjb25zdCAqPihpbik7CisgICAgICAgICAgICAgICAgaW4gKz0gMjsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGwgPSBtdWxSTCgxLCBybCwgdnJsKSA+PiAxMjsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHIgPSBtdWxSTCgwLCBybCwgdnJsKSA+PiAxMjsKKyAgICAgICAgICAgICAgICAvLyBjbGFtcGluZy4uLgorICAgICAgICAgICAgICAgIGwgPSBjbGFtcDE2KGwpOworICAgICAgICAgICAgICAgIHIgPSBjbGFtcDE2KHIpOworICAgICAgICAgICAgICAgICpvdXQrKyA9IChyPDwxNikgfCAobCAmIDB4RkZGRik7CisgICAgICAgICAgICB9IHdoaWxlICgtLW91dEZyYW1lcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcmwgPSAqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCBjb25zdCAqPihpbik7CisgICAgICAgICAgICAgICAgaW4gKz0gMjsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGwgPSBtdWxSTCgxLCBybCwgdnJsKSA+PiAxMjsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHIgPSBtdWxSTCgwLCBybCwgdnJsKSA+PiAxMjsKKyAgICAgICAgICAgICAgICAqb3V0KysgPSAocjw8MTYpIHwgKGwgJiAweEZGRkYpOworICAgICAgICAgICAgfSB3aGlsZSAoLS1vdXRGcmFtZXMpOworICAgICAgICB9CisgICAgICAgIG51bUZyYW1lcyAtPSBiLmZyYW1lQ291bnQ7CisgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmIpOworICAgIH0KIH0KIAogLy8gMiB0cmFja3MgaXMgYWxzbyBhIGNvbW1vbiBjYXNlCkBAIC03ODQsNzEgKzgyMiw4OSBAQAogICAgIGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZW4pOwogICAgIGNvbnN0IHRyYWNrX3QmIHQwID0gc3RhdGUtPnRyYWNrc1tpXTsKICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIwKHQwLmJ1ZmZlcik7Ci0gICAgdDAuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJmIwKTsKIAogICAgIGVuICY9IH4oMTw8aSk7CiAgICAgaSA9IDMxIC0gX19idWlsdGluX2Nseihlbik7CiAgICAgY29uc3QgdHJhY2tfdCYgdDEgPSBzdGF0ZS0+dHJhY2tzW2ldOwogICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciYgYjEodDEuYnVmZmVyKTsKLSAgICB0MS5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYjEpOwotCisgICAKICAgICBpbnQxNl90IGNvbnN0ICppbjA7CiAgICAgY29uc3QgaW50MTZfdCB2bDAgPSB0MC52b2x1bWVbMF07CiAgICAgY29uc3QgaW50MTZfdCB2cjAgPSB0MC52b2x1bWVbMV07CisgICAgc2l6ZV90IGZyYW1lQ291bnQwID0gMDsKKyAgCiAgICAgaW50MTZfdCBjb25zdCAqaW4xOwogICAgIGNvbnN0IGludDE2X3QgdmwxID0gdDEudm9sdW1lWzBdOwogICAgIGNvbnN0IGludDE2X3QgdnIxID0gdDEudm9sdW1lWzFdOwotICAgIHNpemVfdCBudW1GcmFtZXMgPSBzdGF0ZS0+ZnJhbWVDb3VudDsKKyAgICBzaXplX3QgZnJhbWVDb3VudDEgPSAwOworICAgCiAgICAgaW50MzJfdCogb3V0ID0gc3RhdGljX2Nhc3Q8aW50MzJfdCo+KG91dHB1dCk7CisgICAgc2l6ZV90IG51bUZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OworICAgIGludDE2X3QgY29uc3QgKmJ1ZmYgPSBOVUxMOwogCi0gICAgLy8gdDAvMS5idWZmZXIuaTE2ID09IE5VTEwgY2FuIGhhcHBlbiBpZiB0aGUgdHJhY2sgd2FzIGZsdXNoZWQganVzdCBhZnRlciBoYXZpbmcKLSAgICAvLyBiZWVuIGVuYWJsZWQgZm9yIG1peGluZy4KLSAgICBpZiAodDAuYnVmZmVyLmkxNiAhPSBOVUxMKSB7Ci0gICAgICAgIGluMCA9IHQwLmJ1ZmZlci5pMTY7Ci0gICAgICAgIGlmICh0MS5idWZmZXIuaTE2ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGluMSA9IHQxLmJ1ZmZlci5pMTY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbjEgPSBuZXcgaW50MTZfdFtNQVhfTlVNX0NIQU5ORUxTICogc3RhdGUtPmZyYW1lQ291bnRdOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopaW4xLCAwLCBzdGF0ZS0+ZnJhbWVDb3VudCpNQVhfTlVNX0NIQU5ORUxTKnNpemVvZihpbnQxNl90KSk7CisgIAorICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgIAorICAgICAgICBpZiAoZnJhbWVDb3VudDAgPT0gMCkgeworICAgICAgICAgICAgYjAuZnJhbWVDb3VudCA9IG51bUZyYW1lczsKKyAgICAgICAgICAgIHQwLmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZiMCk7CisgICAgICAgICAgICBpZiAoYjAuaTE2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBuZXcgaW50MTZfdFtNQVhfTlVNX0NIQU5ORUxTICogc3RhdGUtPmZyYW1lQ291bnRdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbjAgPSBidWZmOworICAgICAgICAgICAgICAgIGIwLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluMCA9IGIwLmkxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYW1lQ291bnQwID0gYjAuZnJhbWVDb3VudDsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGluMCA9IG5ldyBpbnQxNl90W01BWF9OVU1fQ0hBTk5FTFMgKiBzdGF0ZS0+ZnJhbWVDb3VudF07Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKWluMCwgMCwgc3RhdGUtPmZyYW1lQ291bnQqTUFYX05VTV9DSEFOTkVMUypzaXplb2YoaW50MTZfdCkpOwotICAgICAgICBpZiAodDEuYnVmZmVyLmkxNiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpbjEgPSB0MS5idWZmZXIuaTE2OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW4xID0gaW4wOworICAgICAgICBpZiAoZnJhbWVDb3VudDEgPT0gMCkgeworICAgICAgICAgICAgYjEuZnJhbWVDb3VudCA9IG51bUZyYW1lczsKKyAgICAgICAgICAgIHQxLmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZiMSk7CisgICAgICAgICAgICBpZiAoYjEuaTE2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBuZXcgaW50MTZfdFtNQVhfTlVNX0NIQU5ORUxTICogc3RhdGUtPmZyYW1lQ291bnRdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbjEgPSBidWZmOworICAgICAgICAgICAgICAgIGIxLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7CisgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluMSA9IGIxLmkxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYW1lQ291bnQxID0gYjEuZnJhbWVDb3VudDsKICAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBkbyB7Ci0gICAgICAgIGludDMyX3QgbDAgPSAqaW4wKys7Ci0gICAgICAgIGludDMyX3QgcjAgPSAqaW4wKys7Ci0gICAgICAgIGwwID0gbXVsKGwwLCB2bDApOwotICAgICAgICByMCA9IG11bChyMCwgdnIwKTsKLSAgICAgICAgaW50MzJfdCBsID0gKmluMSsrOwotICAgICAgICBpbnQzMl90IHIgPSAqaW4xKys7Ci0gICAgICAgIGwgPSBtdWxBZGQobCwgdmwxLCBsMCkgPj4gMTI7Ci0gICAgICAgIHIgPSBtdWxBZGQociwgdnIxLCByMCkgPj4gMTI7Ci0gICAgICAgIC8vIGNsYW1waW5nLi4uCi0gICAgICAgIGwgPSBjbGFtcDE2KGwpOwotICAgICAgICByID0gY2xhbXAxNihyKTsKLSAgICAgICAgKm91dCsrID0gKHI8PDE2KSB8IChsICYgMHhGRkZGKTsKLSAgICB9IHdoaWxlICgtLW51bUZyYW1lcyk7CisgICAgICAgCisgICAgICAgIHNpemVfdCBvdXRGcmFtZXMgPSBmcmFtZUNvdW50MCA8IGZyYW1lQ291bnQxP2ZyYW1lQ291bnQwOmZyYW1lQ291bnQxOwogCi0gICAgCi0gICAgaWYgKHQwLmJ1ZmZlci5pMTYgIT0gTlVMTCkgewotICAgICAgICB0MC5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmYjApOwotICAgICAgICBpZiAodDEuYnVmZmVyLmkxNiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICB0MS5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmYjEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVsZXRlIFtdIGluMTsKKyAgICAgICAgbnVtRnJhbWVzIC09IG91dEZyYW1lczsKKyAgICAgICAgZnJhbWVDb3VudDAgLT0gb3V0RnJhbWVzOworICAgICAgICBmcmFtZUNvdW50MSAtPSBvdXRGcmFtZXM7CisgICAgICAgCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludDMyX3QgbDAgPSAqaW4wKys7CisgICAgICAgICAgICBpbnQzMl90IHIwID0gKmluMCsrOworICAgICAgICAgICAgbDAgPSBtdWwobDAsIHZsMCk7CisgICAgICAgICAgICByMCA9IG11bChyMCwgdnIwKTsKKyAgICAgICAgICAgIGludDMyX3QgbCA9ICppbjErKzsKKyAgICAgICAgICAgIGludDMyX3QgciA9ICppbjErKzsKKyAgICAgICAgICAgIGwgPSBtdWxBZGQobCwgdmwxLCBsMCkgPj4gMTI7CisgICAgICAgICAgICByID0gbXVsQWRkKHIsIHZyMSwgcjApID4+IDEyOworICAgICAgICAgICAgLy8gY2xhbXBpbmcuLi4KKyAgICAgICAgICAgIGwgPSBjbGFtcDE2KGwpOworICAgICAgICAgICAgciA9IGNsYW1wMTYocik7CisgICAgICAgICAgICAqb3V0KysgPSAocjw8MTYpIHwgKGwgJiAweEZGRkYpOworICAgICAgICB9IHdoaWxlICgtLW91dEZyYW1lcyk7CisgICAgICAgCisgICAgICAgIGlmIChmcmFtZUNvdW50MCA9PSAwKSB7CisgICAgICAgICAgICB0MC5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmYjApOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZGVsZXRlIFtdIGluMDsKLSAgICAgICAgaWYgKHQxLmJ1ZmZlci5pMTYgIT0gTlVMTCkgeworICAgICAgICBpZiAoZnJhbWVDb3VudDEgPT0gMCkgewogICAgICAgICAgICAgdDEuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmIxKTsKICAgICAgICAgfQorICAgIH0gICAKKyAgICAgICAKKyAgICBpZiAoYnVmZiAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBbXSBidWZmOyAgICAgICAKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaCBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaAppbmRleCA5Y2ExMDlmLi43MmNhMjhhIDEwMDY0NAotLS0gYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKKysrIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCkBAIC0yLDE2ICsyLDE2IEBACiAqKgogKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAKQEAgLTEzMCw3ICsxMzAsNyBAQAogCiAgICAgICAgIGludDMyX3QgICAgIHZvbHVtZUluY1syXTsKIAotICAgICAgICB1aW50MTZfdCAgICByZXNlcnZlZDsKKyAgICAgICAgdWludDE2X3QgICAgZnJhbWVDb3VudDsKIAogICAgICAgICB1aW50OF90ICAgICBjaGFubmVsQ291bnQgOiA0OwogICAgICAgICB1aW50OF90ICAgICBlbmFibGVkICAgICAgOiAxOwpkaWZmIC0tZ2l0IGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwCmluZGV4IGM5M2VhZDMuLjVkYWJhY2IgMTAwNjQ0Ci0tLSBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcAorKysgYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5jcHAKQEAgLTE0LDE3ICsxNCwyMyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2RlZmluZSBMT0dfVEFHICJBdWRpb1Jlc2FtcGxlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKwogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotCiAjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXIuaCIKICNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlclNpbmMuaCIKICNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlckN1YmljLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKKworI2lmZGVmIF9fQVJNX0FSQ0hfNUVfXyAgLy8gb3B0aW1pemVkIGFzbSBvcHRpb24KKyAgICAjZGVmaW5lIEFTTV9BUk1fUkVTQU1QMSAvLyBlbmFibGUgYXNtIG9wdGltaXNhdGlvbiBmb3IgUmVzYW1wbGVyT3JkZXIxCisjZW5kaWYgLy8gX19BUk1fQVJDSF81RV9fCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIEF1ZGlvUmVzYW1wbGVyT3JkZXIxIDogcHVibGljIEF1ZGlvUmVzYW1wbGVyIHsKQEAgLTQ2LDYgKzUyLDE1IEBACiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CiAgICAgdm9pZCByZXNhbXBsZVN0ZXJlbzE2KGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CisjaWZkZWYgQVNNX0FSTV9SRVNBTVAxICAvLyBhc20gb3B0aW1pc2F0aW9uIGZvciBSZXNhbXBsZXJPcmRlcjEKKyAgICB2b2lkIEFzbU1vbm8xNkxvb3AoaW50MTZfdCAqaW4sIGludDMyX3QqIG1heE91dFB0LCBpbnQzMl90IG1heEluSWR4LAorICAgICAgICAgICAgc2l6ZV90ICZvdXRwdXRJbmRleCwgaW50MzJfdCogb3V0LCBzaXplX3QgJmlucHV0SW5kZXgsIGludDMyX3QgdmwsIGludDMyX3QgdnIsCisgICAgICAgICAgICB1aW50MzJfdCAmcGhhc2VGcmFjdGlvbiwgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQpOworICAgIHZvaWQgQXNtU3RlcmVvMTZMb29wKGludDE2X3QgKmluLCBpbnQzMl90KiBtYXhPdXRQdCwgaW50MzJfdCBtYXhJbklkeCwKKyAgICAgICAgICAgIHNpemVfdCAmb3V0cHV0SW5kZXgsIGludDMyX3QqIG91dCwgc2l6ZV90ICZpbnB1dEluZGV4LCBpbnQzMl90IHZsLCBpbnQzMl90IHZyLAorICAgICAgICAgICAgdWludDMyX3QgJnBoYXNlRnJhY3Rpb24sIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50KTsKKyNlbmRpZiAgLy8gQVNNX0FSTV9SRVNBTVAxCisKICAgICBzdGF0aWMgaW5saW5lIGludDMyX3QgSW50ZXJwKGludDMyX3QgeDAsIGludDMyX3QgeDEsIHVpbnQzMl90IGYpIHsKICAgICAgICAgcmV0dXJuIHgwICsgKCgoeDEgLSB4MCkgKiAoaW50MzJfdCkoZiA+PiBrUHJlSW50ZXJwU2hpZnQpKSA+PiBrTnVtSW50ZXJwQml0cyk7CiAgICAgfQpAQCAtNzMsMjAgKzg4LDIzIEBACiAKICAgICBpZiAocXVhbGl0eSA9PSBERUZBVUxUKQogICAgICAgICBxdWFsaXR5ID0gTE9XX1FVQUxJVFk7Ci0gICAgCisKICAgICBzd2l0Y2ggKHF1YWxpdHkpIHsKICAgICBkZWZhdWx0OgogICAgIGNhc2UgTE9XX1FVQUxJVFk6CisgICAgICAgIExPR1YoIkNyZWF0ZSBsaW5lYXIgUmVzYW1wbGVyIik7CiAgICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlck9yZGVyMShiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIE1FRF9RVUFMSVRZOgorICAgICAgICBMT0dWKCJDcmVhdGUgY3ViaWMgUmVzYW1wbGVyIik7CiAgICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlckN1YmljKGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgSElHSF9RVUFMSVRZOgorICAgICAgICBMT0dWKCJDcmVhdGUgc2luYyBSZXNhbXBsZXIiKTsKICAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyU2luYyhiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOwogICAgICAgICBicmVhazsKICAgICB9Ci0gICAgCisKICAgICAvLyBpbml0aWFsaXplIHJlc2FtcGxlcgogICAgIHJlc2FtcGxlci0+aW5pdCgpOwogICAgIHJldHVybiByZXNhbXBsZXI7CkBAIC0xMDMsMTAgKzEyMSwxMCBAQAogICAgICAgICAgICAgICAgIGluQ2hhbm5lbENvdW50KTsKICAgICAgICAgLy8gTE9HX0FTU0VSVCgwKTsKICAgICB9Ci0gICAgCisKICAgICAvLyBpbml0aWFsaXplIGNvbW1vbiBtZW1iZXJzCiAgICAgbVZvbHVtZVswXSA9IG1Wb2x1bWVbMV0gPSAwOwotICAgIG1CdWZmZXIucmF3ID0gTlVMTDsKKyAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSAwOwogCiAgICAgLy8gc2F2ZSBmb3JtYXQgZm9yIHF1aWNrIGxvb2t1cAogICAgIGlmIChpbkNoYW5uZWxDb3VudCA9PSAxKSB7CkBAIC0xNjAsMTkgKzE3OCwzMSBAQAogICAgIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50ID0gbVBoYXNlSW5jcmVtZW50OwogICAgIHNpemVfdCBvdXRwdXRJbmRleCA9IDA7CiAgICAgc2l6ZV90IG91dHB1dFNhbXBsZUNvdW50ID0gb3V0RnJhbWVDb3VudCAqIDI7CisgICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IChvdXRGcmFtZUNvdW50Km1JblNhbXBsZVJhdGUpL21TYW1wbGVSYXRlOwogCiAgICAgLy8gTE9HRSgic3RhcnRpbmcgcmVzYW1wbGUgJWQgZnJhbWVzLCBpbnB1dEluZGV4PSVkLCBwaGFzZUZyYWN0aW9uPSVkLCBwaGFzZUluY3JlbWVudD0lZFxuIiwKLSAgICAvLwkJb3V0RnJhbWVDb3VudCwgaW5wdXRJbmRleCwgcGhhc2VGcmFjdGlvbiwgcGhhc2VJbmNyZW1lbnQpOworICAgIC8vICAgICAgb3V0RnJhbWVDb3VudCwgaW5wdXRJbmRleCwgcGhhc2VGcmFjdGlvbiwgcGhhc2VJbmNyZW1lbnQpOwogCiAgICAgd2hpbGUgKG91dHB1dEluZGV4IDwgb3V0cHV0U2FtcGxlQ291bnQpIHsKIAogICAgICAgICAvLyBidWZmZXIgaXMgZW1wdHksIGZldGNoIGEgbmV3IG9uZQotICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkgeworICAgICAgICB3aGlsZSAobUJ1ZmZlci5mcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IGluRnJhbWVDb3VudDsKICAgICAgICAgICAgIHByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyKTsKLSAgICAgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJlc2FtcGxlU3RlcmVvMTZfZXhpdDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gTE9HRSgiTmV3IGJ1ZmZlciBmZXRjaGVkOiAlZCBmcmFtZXNcbiIsIG1CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgICAgICAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ID4gaW5wdXRJbmRleCkgYnJlYWs7CisKKyAgICAgICAgICAgIGlucHV0SW5kZXggLT0gbUJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICAgICAgbVgwTCA9IG1CdWZmZXIuaTE2W21CdWZmZXIuZnJhbWVDb3VudCoyLTJdOworICAgICAgICAgICAgbVgwUiA9IG1CdWZmZXIuaTE2W21CdWZmZXIuZnJhbWVDb3VudCoyLTFdOworICAgICAgICAgICAgcHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOworICAgICAgICAgICAgIC8vIG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwIG5vdyBzbyB3ZSByZWxvYWQgYSBuZXcgYnVmZmVyCiAgICAgICAgIH0KKwogICAgICAgICBpbnQxNl90ICppbiA9IG1CdWZmZXIuaTE2OwogCiAgICAgICAgIC8vIGhhbmRsZSBib3VuZGFyeSBjYXNlCkBAIC0xODcsMzQgKzIxNyw0NyBAQAogCiAgICAgICAgIC8vIHByb2Nlc3MgaW5wdXQgc2FtcGxlcwogICAgICAgICAvLyBMT0dFKCJnZW5lcmFsIGNhc2VcbiIpOwotICAgICAgICB3aGlsZSAob3V0cHV0SW5kZXggPCBvdXRwdXRTYW1wbGVDb3VudCkgeworCisjaWZkZWYgQVNNX0FSTV9SRVNBTVAxICAvLyBhc20gb3B0aW1pc2F0aW9uIGZvciBSZXNhbXBsZXJPcmRlcjEKKyAgICAgICAgaWYgKGlucHV0SW5kZXggKyAyIDwgbUJ1ZmZlci5mcmFtZUNvdW50KSB7CisgICAgICAgICAgICBpbnQzMl90KiBtYXhPdXRQdDsKKyAgICAgICAgICAgIGludDMyX3QgbWF4SW5JZHg7CisKKyAgICAgICAgICAgIG1heE91dFB0ID0gb3V0ICsgKG91dHB1dFNhbXBsZUNvdW50IC0gMik7ICAgLy8gMiBiZWNhdXNlIDIgZnJhbWVzIHBlciBsb29wCisgICAgICAgICAgICBtYXhJbklkeCA9IG1CdWZmZXIuZnJhbWVDb3VudCAtIDI7CisgICAgICAgICAgICBBc21TdGVyZW8xNkxvb3AoaW4sIG1heE91dFB0LCBtYXhJbklkeCwgb3V0cHV0SW5kZXgsIG91dCwgaW5wdXRJbmRleCwgdmwsIHZyLAorICAgICAgICAgICAgICAgICAgICBwaGFzZUZyYWN0aW9uLCBwaGFzZUluY3JlbWVudCk7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gQVNNX0FSTV9SRVNBTVAxCisKKyAgICAgICAgd2hpbGUgKG91dHB1dEluZGV4IDwgb3V0cHV0U2FtcGxlQ291bnQgJiYgaW5wdXRJbmRleCA8IG1CdWZmZXIuZnJhbWVDb3VudCkgewogICAgICAgICAgICAgb3V0W291dHB1dEluZGV4KytdICs9IHZsICogSW50ZXJwKGluW2lucHV0SW5kZXgqMi0yXSwKICAgICAgICAgICAgICAgICAgICAgaW5baW5wdXRJbmRleCoyXSwgcGhhc2VGcmFjdGlvbik7CiAgICAgICAgICAgICBvdXRbb3V0cHV0SW5kZXgrK10gKz0gdnIgKiBJbnRlcnAoaW5baW5wdXRJbmRleCoyLTFdLAogICAgICAgICAgICAgICAgICAgICBpbltpbnB1dEluZGV4KjIrMV0sIHBoYXNlRnJhY3Rpb24pOwogICAgICAgICAgICAgQWR2YW5jZSgmaW5wdXRJbmRleCwgJnBoYXNlRnJhY3Rpb24sIHBoYXNlSW5jcmVtZW50KTsKLSAgICAgICAgICAgIGlmIChpbnB1dEluZGV4ID49IG1CdWZmZXIuZnJhbWVDb3VudCkKLSAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorCiAgICAgICAgIC8vIExPR0UoImxvb3AgZG9uZSAtIG91dHB1dEluZGV4PSVkLCBpbnB1dEluZGV4PSVkXG4iLCBvdXRwdXRJbmRleCwgaW5wdXRJbmRleCk7CiAKICAgICAgICAgLy8gaWYgZG9uZSB3aXRoIGJ1ZmZlciwgc2F2ZSBzYW1wbGVzCiAgICAgICAgIGlmIChpbnB1dEluZGV4ID49IG1CdWZmZXIuZnJhbWVDb3VudCkgewogICAgICAgICAgICAgaW5wdXRJbmRleCAtPSBtQnVmZmVyLmZyYW1lQ291bnQ7CiAKLSAgICAgICAgICAgIC8vIExPR0UoImJ1ZmZlciBkb25lLCBuZXcgaW5wdXQgaW5kZXgiLCBpbnB1dEluZGV4KTsKKyAgICAgICAgICAgIC8vIExPR0UoImJ1ZmZlciBkb25lLCBuZXcgaW5wdXQgaW5kZXggJWQiLCBpbnB1dEluZGV4KTsKIAogICAgICAgICAgICAgbVgwTCA9IG1CdWZmZXIuaTE2W21CdWZmZXIuZnJhbWVDb3VudCoyLTJdOwogICAgICAgICAgICAgbVgwUiA9IG1CdWZmZXIuaTE2W21CdWZmZXIuZnJhbWVDb3VudCoyLTFdOwogICAgICAgICAgICAgcHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOwogCi0gICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgcmVsZWFzZUJ1ZmZlciBOVUxMUyB0aGUgYnVmZmVyIHBvaW50ZXIgCi0gICAgICAgICAgICAvLyBMT0dfQVNTRVJUKG1CdWZmZXIucmF3ID09IE5VTEwpOworICAgICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIHJlbGVhc2VCdWZmZXIgcmVzZXRzIHRoZSBidWZmZXIgZnJhbWVDb3VudAorICAgICAgICAgICAgLy8gTE9HX0FTU0VSVChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBMT0dFKCJvdXRwdXQgYnVmZmVyIGZ1bGwgLSBvdXRwdXRJbmRleD0lZCwgaW5wdXRJbmRleD0lZFxuIiwgb3V0cHV0SW5kZXgsIGlucHV0SW5kZXgpOwogCityZXNhbXBsZVN0ZXJlbzE2X2V4aXQ6CiAgICAgLy8gc2F2ZSBzdGF0ZQogICAgIG1JbnB1dEluZGV4ID0gaW5wdXRJbmRleDsKICAgICBtUGhhc2VGcmFjdGlvbiA9IHBoYXNlRnJhY3Rpb247CkBAIC0yMzEsMTggKzI3NCwyNyBAQAogICAgIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50ID0gbVBoYXNlSW5jcmVtZW50OwogICAgIHNpemVfdCBvdXRwdXRJbmRleCA9IDA7CiAgICAgc2l6ZV90IG91dHB1dFNhbXBsZUNvdW50ID0gb3V0RnJhbWVDb3VudCAqIDI7CisgICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IChvdXRGcmFtZUNvdW50Km1JblNhbXBsZVJhdGUpL21TYW1wbGVSYXRlOwogCiAgICAgLy8gTE9HRSgic3RhcnRpbmcgcmVzYW1wbGUgJWQgZnJhbWVzLCBpbnB1dEluZGV4PSVkLCBwaGFzZUZyYWN0aW9uPSVkLCBwaGFzZUluY3JlbWVudD0lZFxuIiwKICAgICAvLyAgICAgIG91dEZyYW1lQ291bnQsIGlucHV0SW5kZXgsIHBoYXNlRnJhY3Rpb24sIHBoYXNlSW5jcmVtZW50KTsKLQogICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IG91dHB1dFNhbXBsZUNvdW50KSB7Ci0KICAgICAgICAgLy8gYnVmZmVyIGlzIGVtcHR5LCBmZXRjaCBhIG5ldyBvbmUKLSAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpIHsKKyAgICAgICAgd2hpbGUgKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBpbkZyYW1lQ291bnQ7CiAgICAgICAgICAgICBwcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmbUJ1ZmZlcik7Ci0gICAgICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUlucHV0SW5kZXggPSBpbnB1dEluZGV4OworICAgICAgICAgICAgICAgIG1QaGFzZUZyYWN0aW9uID0gcGhhc2VGcmFjdGlvbjsKKyAgICAgICAgICAgICAgICBnb3RvIHJlc2FtcGxlTW9ubzE2X2V4aXQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBMT0dFKCJOZXcgYnVmZmVyIGZldGNoZWQ6ICVkIGZyYW1lc1xuIiwgbUJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgPiAgaW5wdXRJbmRleCkgYnJlYWs7CisKKyAgICAgICAgICAgIGlucHV0SW5kZXggLT0gbUJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICAgICAgbVgwTCA9IG1CdWZmZXIuaTE2W21CdWZmZXIuZnJhbWVDb3VudC0xXTsKKyAgICAgICAgICAgIHByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKKyAgICAgICAgICAgIC8vIG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwIG5vdyBzbyB3ZSByZWxvYWQgYSBuZXcgYnVmZmVyCiAgICAgICAgIH0KICAgICAgICAgaW50MTZfdCAqaW4gPSBtQnVmZmVyLmkxNjsKIApAQCAtMjU5LDM4ICszMTEsMjg0IEBACiAKICAgICAgICAgLy8gcHJvY2VzcyBpbnB1dCBzYW1wbGVzCiAgICAgICAgIC8vIExPR0UoImdlbmVyYWwgY2FzZVxuIik7Ci0gICAgICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IG91dHB1dFNhbXBsZUNvdW50KSB7CisKKyNpZmRlZiBBU01fQVJNX1JFU0FNUDEgIC8vIGFzbSBvcHRpbWlzYXRpb24gZm9yIFJlc2FtcGxlck9yZGVyMQorICAgICAgICBpZiAoaW5wdXRJbmRleCArIDIgPCBtQnVmZmVyLmZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIGludDMyX3QqIG1heE91dFB0OworICAgICAgICAgICAgaW50MzJfdCBtYXhJbklkeDsKKworICAgICAgICAgICAgbWF4T3V0UHQgPSBvdXQgKyAob3V0cHV0U2FtcGxlQ291bnQgLSAyKTsKKyAgICAgICAgICAgIG1heEluSWR4ID0gKGludDMyX3QpbUJ1ZmZlci5mcmFtZUNvdW50IC0gMjsKKyAgICAgICAgICAgICAgICBBc21Nb25vMTZMb29wKGluLCBtYXhPdXRQdCwgbWF4SW5JZHgsIG91dHB1dEluZGV4LCBvdXQsIGlucHV0SW5kZXgsIHZsLCB2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlRnJhY3Rpb24sIHBoYXNlSW5jcmVtZW50KTsKKyAgICAgICAgfQorI2VuZGlmICAvLyBBU01fQVJNX1JFU0FNUDEKKworICAgICAgICB3aGlsZSAob3V0cHV0SW5kZXggPCBvdXRwdXRTYW1wbGVDb3VudCAmJiBpbnB1dEluZGV4IDwgbUJ1ZmZlci5mcmFtZUNvdW50KSB7CiAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZSA9IEludGVycChpbltpbnB1dEluZGV4LTFdLCBpbltpbnB1dEluZGV4XSwKICAgICAgICAgICAgICAgICAgICAgcGhhc2VGcmFjdGlvbik7CiAgICAgICAgICAgICBvdXRbb3V0cHV0SW5kZXgrK10gKz0gdmwgKiBzYW1wbGU7CiAgICAgICAgICAgICBvdXRbb3V0cHV0SW5kZXgrK10gKz0gdnIgKiBzYW1wbGU7CiAgICAgICAgICAgICBBZHZhbmNlKCZpbnB1dEluZGV4LCAmcGhhc2VGcmFjdGlvbiwgcGhhc2VJbmNyZW1lbnQpOwotICAgICAgICAgICAgaWYgKGlucHV0SW5kZXggPj0gbUJ1ZmZlci5mcmFtZUNvdW50KQotICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisKKwogICAgICAgICAvLyBMT0dFKCJsb29wIGRvbmUgLSBvdXRwdXRJbmRleD0lZCwgaW5wdXRJbmRleD0lZFxuIiwgb3V0cHV0SW5kZXgsIGlucHV0SW5kZXgpOwogCiAgICAgICAgIC8vIGlmIGRvbmUgd2l0aCBidWZmZXIsIHNhdmUgc2FtcGxlcwogICAgICAgICBpZiAoaW5wdXRJbmRleCA+PSBtQnVmZmVyLmZyYW1lQ291bnQpIHsKICAgICAgICAgICAgIGlucHV0SW5kZXggLT0gbUJ1ZmZlci5mcmFtZUNvdW50OwogCi0gICAgICAgICAgICAvLyBMT0dFKCJidWZmZXIgZG9uZSwgbmV3IGlucHV0IGluZGV4IiwgaW5wdXRJbmRleCk7CisgICAgICAgICAgICAvLyBMT0dFKCJidWZmZXIgZG9uZSwgbmV3IGlucHV0IGluZGV4ICVkIiwgaW5wdXRJbmRleCk7CiAKICAgICAgICAgICAgIG1YMEwgPSBtQnVmZmVyLmkxNlttQnVmZmVyLmZyYW1lQ291bnQtMV07CiAgICAgICAgICAgICBwcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CiAKLSAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSByZWxlYXNlQnVmZmVyIE5VTExTIHRoZSBidWZmZXIgcG9pbnRlciAKLSAgICAgICAgICAgIC8vIExPR19BU1NFUlQobUJ1ZmZlci5yYXcgPT0gTlVMTCk7CisgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgcmVsZWFzZUJ1ZmZlciByZXNldHMgdGhlIGJ1ZmZlciBmcmFtZUNvdW50CisgICAgICAgICAgICAvLyBMT0dfQVNTRVJUKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8vIExPR0UoIm91dHB1dCBidWZmZXIgZnVsbCAtIG91dHB1dEluZGV4PSVkLCBpbnB1dEluZGV4PSVkXG4iLCBvdXRwdXRJbmRleCwgaW5wdXRJbmRleCk7CiAKK3Jlc2FtcGxlTW9ubzE2X2V4aXQ6CiAgICAgLy8gc2F2ZSBzdGF0ZQogICAgIG1JbnB1dEluZGV4ID0gaW5wdXRJbmRleDsKICAgICBtUGhhc2VGcmFjdGlvbiA9IHBoYXNlRnJhY3Rpb247CiB9CiAKKyNpZmRlZiBBU01fQVJNX1JFU0FNUDEgIC8vIGFzbSBvcHRpbWlzYXRpb24gZm9yIFJlc2FtcGxlck9yZGVyMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIEFzbU1vbm8xNkxvb3AKKyogICBhc20gb3B0aW1pemVkIG1vbm90b25pYyBsb29wIHZlcnNpb247IG9uZSBsb29wIGlzIDIgZnJhbWVzCisqICAgSW5wdXQ6CisqICAgICAgIGluIDogcG9pbnRlciBvbiBpbnB1dCBzYW1wbGVzCisqICAgICAgIG1heE91dFB0IDogcG9pbnRlciBvbiBmaXJzdCBub3QgZmlsbGVkCisqICAgICAgIG1heEluSWR4IDogaW5kZXggb24gZmlyc3Qgbm90IHVzZWQKKyogICAgICAgb3V0cHV0SW5kZXggOiBwb2ludGVyIG9uIGN1cnJlbnQgb3V0cHV0IGluZGV4CisqICAgICAgIG91dCA6IHBvaW50ZXIgb24gb3V0cHV0IGJ1ZmZlcgorKiAgICAgICBpbnB1dEluZGV4IDogcG9pbnRlciBvbiBjdXJyZW50IGlucHV0IGluZGV4CisqICAgICAgIHZsLCB2ciA6IGxlZnQgYW5kIHJpZ2h0IGdhaW4KKyogICAgICAgcGhhc2VGcmFjdGlvbiA6IHBvaW50ZXIgb24gY3VycmVudCBwaGFzZSBmcmFjdGlvbgorKiAgICAgICBwaGFzZUluY3JlbWVudAorKiAgIE91cHV0OgorKiAgICAgICBvdXRwdXRJbmRleCA6CisqICAgICAgIG91dCA6IHVwZGF0ZWQgYnVmZmVyCisqICAgICAgIGlucHV0SW5kZXggOiBpbmRleCBvZiBuZXh0IHRvIHVzZQorKiAgICAgICBwaGFzZUZyYWN0aW9uIDogcGhhc2UgZnJhY3Rpb24gZm9yIG5leHQgaW50ZXJwb2xhdGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQXVkaW9SZXNhbXBsZXJPcmRlcjE6OkFzbU1vbm8xNkxvb3AoaW50MTZfdCAqaW4sIGludDMyX3QqIG1heE91dFB0LCBpbnQzMl90IG1heEluSWR4LAorICAgICAgICAgICAgc2l6ZV90ICZvdXRwdXRJbmRleCwgaW50MzJfdCogb3V0LCBzaXplX3QgJmlucHV0SW5kZXgsIGludDMyX3QgdmwsIGludDMyX3QgdnIsCisgICAgICAgICAgICB1aW50MzJfdCAmcGhhc2VGcmFjdGlvbiwgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQpCit7CisjZGVmaW5lIE1PX1BBUkFNNSAgICIzNiIgICAgICAgIC8vIG9mZnNldCBvZiBwYXJhbWV0ZXIgNSAob3V0cHV0SW5kZXgpCisKKyAgICBhc20oCisgICAgICAgICJzdG1mZCAgc3AhLCB7cjQsIHI1LCByNiwgcjcsIHI4LCByOSwgcjEwLCByMTEsIGxyfVxuIgorICAgICAgICAvLyBnZXQgcGFyYW1ldGVycworICAgICAgICAiICAgbGRyIHI2LCBbc3AsICMiIE1PX1BBUkFNNSAiICsgMjBdXG4iICAgIC8vICZwaGFzZUZyYWN0aW9uCisgICAgICAgICIgICBsZHIgcjYsIFtyNl1cbiIgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGhhc2VGcmFjdGlvbgorICAgICAgICAiICAgbGRyIHI3LCBbc3AsICMiIE1PX1BBUkFNNSAiICsgOF1cbiIgICAgIC8vICZpbnB1dEluZGV4CisgICAgICAgICIgICBsZHIgcjcsIFtyN11cbiIgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXRJbmRleAorICAgICAgICAiICAgbGRyIHI4LCBbc3AsICMiIE1PX1BBUkFNNSAiICsgNF1cbiIgICAgIC8vIG91dAorICAgICAgICAiICAgbGRyIHIwLCBbc3AsICMiIE1PX1BBUkFNNSAiICsgMF1cbiIgICAgIC8vICZvdXRwdXRJbmRleAorICAgICAgICAiICAgbGRyIHIwLCBbcjBdXG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHB1dEluZGV4CisgICAgICAgICIgICBhZGQgcjgsIHIwLCBhc2wgIzJcbiIgICAgICAgICAgICAgICAgICAgLy8gY3VyT3V0CisgICAgICAgICIgICBsZHIgcjksIFtzcCwgIyIgTU9fUEFSQU01ICIgKyAyNF1cbiIgICAgLy8gcGhhc2VJbmNyZW1lbnQKKyAgICAgICAgIiAgIGxkciByMTAsIFtzcCwgIyIgTU9fUEFSQU01ICIgKyAxMl1cbiIgICAvLyB2bAorICAgICAgICAiICAgbGRyIHIxMSwgW3NwLCAjIiBNT19QQVJBTTUgIiArIDE2XVxuIiAgIC8vIHZyCisKKyAgICAgICAgLy8gcjAgcGluLCB4MCwgU2FtcAorCisgICAgICAgIC8vIHIxIGluCisgICAgICAgIC8vIHIyIG1heE91dFB0CisgICAgICAgIC8vIHIzIG1heEluSWR4CisKKyAgICAgICAgLy8gcjQgeDEsIGkxLCBpMywgT3V0MQorICAgICAgICAvLyByNSBvdXQwCisKKyAgICAgICAgLy8gcjYgZnJhYworICAgICAgICAvLyByNyBpbnB1dEluZGV4CisgICAgICAgIC8vIHI4IGN1ck91dAorCisgICAgICAgIC8vIHI5IGluYworICAgICAgICAvLyByMTAgdmwKKyAgICAgICAgLy8gcjExIHZyCisKKyAgICAgICAgLy8gcjEyCisgICAgICAgIC8vIHIxMyBzcAorICAgICAgICAvLyByMTQKKworICAgICAgICAvLyB0aGUgZm9sbG93aW5nIGxvb3Agd29ya3Mgb24gMiBmcmFtZXMKKworICAgICAgICAiLlk0TDAxOlxuIgorICAgICAgICAiICAgY21wIHI4LCByMlxuIiAgICAgICAgICAgICAgICAgICAvLyBjdXJPdXQgLSBtYXhDdXJPdXQKKyAgICAgICAgIiAgIGJjcyAuWTRMMDJcbiIKKworI2RlZmluZSBNT19PTkVfRlJBTUUgXAorICAgICIgICBhZGQgcjAsIHIxLCByNywgYXNsICMxXG4iICAgICAgIC8qIGluICsgaW5wdXRJbmRleCAqL1wKKyAgICAiICAgbGRyc2ggcjQsIFtyMF1cbiIgICAgICAgICAgICAgICAvKiBpbltpbnB1dEluZGV4XSAqL1wKKyAgICAiICAgbGRyIHI1LCBbcjhdXG4iICAgICAgICAgICAgICAgICAvKiBvdXRbb3V0cHV0SW5kZXhdICovXAorICAgICIgICBsZHJzaCByMCwgW3IwLCAjLTJdXG4iICAgICAgICAgIC8qIGluW2lucHV0SW5kZXgtMV0gKi9cCisgICAgIiAgIGJpYyByNiwgcjYsICMweEMwMDAwMDAwXG4iICAgICAgLyogcGhhc2VGcmFjdGlvbiAmIC4uLiAqL1wKKyAgICAiICAgc3ViIHI0LCByNCwgcjBcbiIgICAgICAgICAgICAgICAvKiBpbltpbnB1dEluZGV4XSAtIGluW2lucHV0SW5kZXgtMV0gKi9cCisgICAgIiAgIG1vdiByNCwgcjQsIGxzbCAjMlxuIiAgICAgICAgICAgLyogPDwyICovXAorICAgICIgICBzbXVsd3QgcjQsIHI0LCByNlxuIiAgICAgICAgICAgIC8qICh4MS14MCkqLi4gKi9cCisgICAgIiAgIGFkZCByNiwgcjYsIHI5XG4iICAgICAgICAgICAgICAgLyogcGhhc2VGcmFjdGlvbiArIHBoYXNlSW5jcmVtZW50ICovXAorICAgICIgICBhZGQgcjAsIHIwLCByNFxuIiAgICAgICAgICAgICAgIC8qIHgwIC0gKC4uKSAqL1wKKyAgICAiICAgbWxhIHI1LCByMCwgcjEwLCByNVxuIiAgICAgICAgICAvKiB2bCppbnRlcnAgKyBvdXRbXSAqL1wKKyAgICAiICAgbGRyIHI0LCBbcjgsICM0XVxuIiAgICAgICAgICAgICAvKiBvdXRbb3V0cHV0SW5kZXgrMV0gKi9cCisgICAgIiAgIHN0ciByNSwgW3I4XSwgIzRcbiIgICAgICAgICAgICAgLyogb3V0W291dHB1dEluZGV4KytdID0gLi4uICovXAorICAgICIgICBtbGEgcjQsIHIwLCByMTEsIHI0XG4iICAgICAgICAgIC8qIHZyKmludGVycCArIG91dFtdICovXAorICAgICIgICBhZGQgcjcsIHI3LCByNiwgbHNyICMzMFxuIiAgICAgIC8qIGlucHV0SW5kZXggKyBwaGFzZUZyYWN0aW9uPj4zMCAqL1wKKyAgICAiICAgc3RyIHI0LCBbcjhdLCAjNFxuIiAgICAgICAgICAgICAvKiBvdXRbb3V0cHV0SW5kZXgrK10gPSAuLi4gKi8KKworICAgICAgICBNT19PTkVfRlJBTUUgICAgLy8gZnJhbWUgMQorICAgICAgICBNT19PTkVfRlJBTUUgICAgLy8gZnJhbWUgMgorCisgICAgICAgICIgICBjbXAgcjcsIHIzXG4iICAgICAgICAgICAgICAgICAgIC8vIGlucHV0SW5kZXggLSBtYXhJbklkeAorICAgICAgICAiICAgYmNjIC5ZNEwwMVxuIgorICAgICAgICAiLlk0TDAyOlxuIgorCisgICAgICAgICIgICBiaWMgcjYsIHI2LCAjMHhDMDAwMDAwMFxuIiAgICAgICAgICAgICAvLyBwaGFzZUZyYWN0aW9uICYgLi4uCisgICAgICAgIC8vIHNhdmUgbW9kaWZpZWQgdmFsdWVzCisgICAgICAgICIgICBsZHIgcjAsIFtzcCwgIyIgTU9fUEFSQU01ICIgKyAyMF1cbiIgICAgLy8gJnBoYXNlRnJhY3Rpb24KKyAgICAgICAgIiAgIHN0ciByNiwgW3IwXVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaGFzZUZyYWN0aW9uCisgICAgICAgICIgICBsZHIgcjAsIFtzcCwgIyIgTU9fUEFSQU01ICIgKyA4XVxuIiAgICAgLy8gJmlucHV0SW5kZXgKKyAgICAgICAgIiAgIHN0ciByNywgW3IwXVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dEluZGV4CisgICAgICAgICIgICBsZHIgcjAsIFtzcCwgIyIgTU9fUEFSQU01ICIgKyA0XVxuIiAgICAgLy8gb3V0CisgICAgICAgICIgICBzdWIgcjgsIHIwXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VyT3V0IC0gb3V0CisgICAgICAgICIgICBhc3IgcjgsICMyXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IG91dHB1dEluZGV4CisgICAgICAgICIgICBsZHIgcjAsIFtzcCwgIyIgTU9fUEFSQU01ICIgKyAwXVxuIiAgICAgLy8gJm91dHB1dEluZGV4CisgICAgICAgICIgICBzdHIgcjgsIFtyMF1cbiIgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBvdXRwdXRJbmRleAorCisgICAgICAgICIgICBsZG1mZCAgIHNwISwge3I0LCByNSwgcjYsIHI3LCByOCwgcjksIHIxMCwgcjExLCBwY31cbiIKKyAgICApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIEFzbVN0ZXJlbzE2TG9vcAorKiAgIGFzbSBvcHRpbWl6ZWQgc3RlcmVvIGxvb3AgdmVyc2lvbjsgb25lIGxvb3AgaXMgMiBmcmFtZXMKKyogICBJbnB1dDoKKyogICAgICAgaW4gOiBwb2ludGVyIG9uIGlucHV0IHNhbXBsZXMKKyogICAgICAgbWF4T3V0UHQgOiBwb2ludGVyIG9uIGZpcnN0IG5vdCBmaWxsZWQKKyogICAgICAgbWF4SW5JZHggOiBpbmRleCBvbiBmaXJzdCBub3QgdXNlZAorKiAgICAgICBvdXRwdXRJbmRleCA6IHBvaW50ZXIgb24gY3VycmVudCBvdXRwdXQgaW5kZXgKKyogICAgICAgb3V0IDogcG9pbnRlciBvbiBvdXRwdXQgYnVmZmVyCisqICAgICAgIGlucHV0SW5kZXggOiBwb2ludGVyIG9uIGN1cnJlbnQgaW5wdXQgaW5kZXgKKyogICAgICAgdmwsIHZyIDogbGVmdCBhbmQgcmlnaHQgZ2FpbgorKiAgICAgICBwaGFzZUZyYWN0aW9uIDogcG9pbnRlciBvbiBjdXJyZW50IHBoYXNlIGZyYWN0aW9uCisqICAgICAgIHBoYXNlSW5jcmVtZW50CisqICAgT3VwdXQ6CisqICAgICAgIG91dHB1dEluZGV4IDoKKyogICAgICAgb3V0IDogdXBkYXRlZCBidWZmZXIKKyogICAgICAgaW5wdXRJbmRleCA6IGluZGV4IG9mIG5leHQgdG8gdXNlCisqICAgICAgIHBoYXNlRnJhY3Rpb24gOiBwaGFzZSBmcmFjdGlvbiBmb3IgbmV4dCBpbnRlcnBvbGF0aW9uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBBdWRpb1Jlc2FtcGxlck9yZGVyMTo6QXNtU3RlcmVvMTZMb29wKGludDE2X3QgKmluLCBpbnQzMl90KiBtYXhPdXRQdCwgaW50MzJfdCBtYXhJbklkeCwKKyAgICAgICAgICAgIHNpemVfdCAmb3V0cHV0SW5kZXgsIGludDMyX3QqIG91dCwgc2l6ZV90ICZpbnB1dEluZGV4LCBpbnQzMl90IHZsLCBpbnQzMl90IHZyLAorICAgICAgICAgICAgdWludDMyX3QgJnBoYXNlRnJhY3Rpb24sIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50KQoreworI2RlZmluZSBTVF9QQVJBTTUgICAgIjQwIiAgICAgLy8gb2Zmc2V0IG9mIHBhcmFtZXRlciA1IChvdXRwdXRJbmRleCkKKyAgICBhc20oCisgICAgICAgICJzdG1mZCAgc3AhLCB7cjQsIHI1LCByNiwgcjcsIHI4LCByOSwgcjEwLCByMTEsIHIxMiwgbHJ9XG4iCisgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCisgICAgICAgICIgICBsZHIgcjYsIFtzcCwgIyIgU1RfUEFSQU01ICIgKyAyMF1cbiIgICAgLy8gJnBoYXNlRnJhY3Rpb24KKyAgICAgICAgIiAgIGxkciByNiwgW3I2XVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaGFzZUZyYWN0aW9uCisgICAgICAgICIgICBsZHIgcjcsIFtzcCwgIyIgU1RfUEFSQU01ICIgKyA4XVxuIiAgICAgLy8gJmlucHV0SW5kZXgKKyAgICAgICAgIiAgIGxkciByNywgW3I3XVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dEluZGV4CisgICAgICAgICIgICBsZHIgcjgsIFtzcCwgIyIgU1RfUEFSQU01ICIgKyA0XVxuIiAgICAgLy8gb3V0CisgICAgICAgICIgICBsZHIgcjAsIFtzcCwgIyIgU1RfUEFSQU01ICIgKyAwXVxuIiAgICAgLy8gJm91dHB1dEluZGV4CisgICAgICAgICIgICBsZHIgcjAsIFtyMF1cbiIgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0SW5kZXgKKyAgICAgICAgIiAgIGFkZCByOCwgcjAsIGFzbCAjMlxuIiAgICAgICAgICAgICAgICAgICAvLyBjdXJPdXQKKyAgICAgICAgIiAgIGxkciByOSwgW3NwLCAjIiBTVF9QQVJBTTUgIiArIDI0XVxuIiAgICAvLyBwaGFzZUluY3JlbWVudAorICAgICAgICAiICAgbGRyIHIxMCwgW3NwLCAjIiBTVF9QQVJBTTUgIiArIDEyXVxuIiAgIC8vIHZsCisgICAgICAgICIgICBsZHIgcjExLCBbc3AsICMiIFNUX1BBUkFNNSAiICsgMTZdXG4iICAgLy8gdnIKKworICAgICAgICAvLyByMCBwaW4sIHgwLCBTYW1wCisKKyAgICAgICAgLy8gcjEgaW4KKyAgICAgICAgLy8gcjIgbWF4T3V0UHQKKyAgICAgICAgLy8gcjMgbWF4SW5JZHgKKworICAgICAgICAvLyByNCB4MSwgaTEsIGkzLCBvdXQxCisgICAgICAgIC8vIHI1IG91dDAKKworICAgICAgICAvLyByNiBmcmFjCisgICAgICAgIC8vIHI3IGlucHV0SW5kZXgKKyAgICAgICAgLy8gcjggY3VyT3V0CisKKyAgICAgICAgLy8gcjkgaW5jCisgICAgICAgIC8vIHIxMCB2bAorICAgICAgICAvLyByMTEgdnIKKworICAgICAgICAvLyByMTIgdGVtcG9yYXJ5CisgICAgICAgIC8vIHIxMyBzcAorICAgICAgICAvLyByMTQKKworICAgICAgICAiLlk1TDAxOlxuIgorICAgICAgICAiICAgY21wIHI4LCByMlxuIiAgICAgICAgICAgICAgICAgICAvLyBjdXJPdXQgLSBtYXhDdXJPdXQKKyAgICAgICAgIiAgIGJjcyAuWTVMMDJcbiIKKworI2RlZmluZSBTVF9PTkVfRlJBTUUgXAorICAgICIgICBiaWMgcjYsIHI2LCAjMHhDMDAwMDAwMFxuIiAgICAgIC8qIHBoYXNlRnJhY3Rpb24gJiAuLi4gKi9cCitcCisgICAgIiAgIGFkZCByMCwgcjEsIHI3LCBhc2wgIzJcbiIgICAgICAgLyogaW4gKyAyKmlucHV0SW5kZXggKi9cCitcCisgICAgIiAgIGxkcnNoIHI0LCBbcjBdXG4iICAgICAgICAgICAgICAgLyogaW5bMippbnB1dEluZGV4XSAqL1wKKyAgICAiICAgbGRyIHI1LCBbcjhdXG4iICAgICAgICAgICAgICAgICAvKiBvdXRbb3V0cHV0SW5kZXhdICovXAorICAgICIgICBsZHJzaCByMTIsIFtyMCwgIy00XVxuIiAgICAgICAgIC8qIGluWzIqaW5wdXRJbmRleC0yXSAqL1wKKyAgICAiICAgc3ViIHI0LCByNCwgcjEyXG4iICAgICAgICAgICAgICAvKiBpblsyKklucHV0SW5kZXhdIC0gaW5bMipJbnB1dEluZGV4LTJdICovXAorICAgICIgICBtb3YgcjQsIHI0LCBsc2wgIzJcbiIgICAgICAgICAgIC8qIDw8MiAqL1wKKyAgICAiICAgc211bHd0IHI0LCByNCwgcjZcbiIgICAgICAgICAgICAvKiAoeDEteDApKi4uICovXAorICAgICIgICBhZGQgcjEyLCByMTIsIHI0XG4iICAgICAgICAgICAgIC8qIHgwIC0gKC4uKSAqL1wKKyAgICAiICAgbWxhIHI1LCByMTIsIHIxMCwgcjVcbiIgICAgICAgICAvKiB2bCppbnRlcnAgKyBvdXRbXSAqL1wKKyAgICAiICAgbGRyIHI0LCBbcjgsICM0XVxuIiAgICAgICAgICAgICAvKiBvdXRbb3V0cHV0SW5kZXgrMV0gKi9cCisgICAgIiAgIHN0ciByNSwgW3I4XSwgIzRcbiIgICAgICAgICAgICAgLyogb3V0W291dHB1dEluZGV4KytdID0gLi4uICovXAorXAorICAgICIgICBsZHJzaCByMTIsIFtyMCwgIysyXVxuIiAgICAgICAgIC8qIGluWzIqaW5wdXRJbmRleCsxXSAqL1wKKyAgICAiICAgbGRyc2ggcjAsIFtyMCwgIy0yXVxuIiAgICAgICAgICAvKiBpblsyKmlucHV0SW5kZXgtMV0gKi9cCisgICAgIiAgIHN1YiByMTIsIHIxMiwgcjBcbiIgICAgICAgICAgICAgLyogaW5bMipJbnB1dEluZGV4XSAtIGluWzIqSW5wdXRJbmRleC0yXSAqL1wKKyAgICAiICAgbW92IHIxMiwgcjEyLCBsc2wgIzJcbiIgICAgICAgICAvKiA8PDIgKi9cCisgICAgIiAgIHNtdWx3dCByMTIsIHIxMiwgcjZcbiIgICAgICAgICAgLyogKHgxLXgwKSouLiAqL1wKKyAgICAiICAgYWRkIHIxMiwgcjAsIHIxMlxuIiAgICAgICAgICAgICAvKiB4MCAtICguLikgKi9cCisgICAgIiAgIG1sYSByNCwgcjEyLCByMTEsIHI0XG4iICAgICAgICAgLyogdnIqaW50ZXJwICsgb3V0W10gKi9cCisgICAgIiAgIHN0ciByNCwgW3I4XSwgIzRcbiIgICAgICAgICAgICAgLyogb3V0W291dHB1dEluZGV4KytdID0gLi4uICovXAorXAorICAgICIgICBhZGQgcjYsIHI2LCByOVxuIiAgICAgICAgICAgICAgIC8qIHBoYXNlRnJhY3Rpb24gKyBwaGFzZUluY3JlbWVudCAqL1wKKyAgICAiICAgYWRkIHI3LCByNywgcjYsIGxzciAjMzBcbiIgICAgICAvKiBpbnB1dEluZGV4ICsgcGhhc2VGcmFjdGlvbj4+MzAgKi8KKworICAgIFNUX09ORV9GUkFNRSAgICAvLyBmcmFtZSAxCisgICAgU1RfT05FX0ZSQU1FICAgIC8vIGZyYW1lIDEKKworICAgICAgICAiICAgY21wIHI3LCByM1xuIiAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXRJbmRleCAtIG1heEluSWR4CisgICAgICAgICIgICBiY2MgLlk1TDAxXG4iCisgICAgICAgICIuWTVMMDI6XG4iCisKKyAgICAgICAgIiAgIGJpYyByNiwgcjYsICMweEMwMDAwMDAwXG4iICAgICAgICAgICAgICAvLyBwaGFzZUZyYWN0aW9uICYgLi4uCisgICAgICAgIC8vIHNhdmUgbW9kaWZpZWQgdmFsdWVzCisgICAgICAgICIgICBsZHIgcjAsIFtzcCwgIyIgU1RfUEFSQU01ICIgKyAyMF1cbiIgICAgLy8gJnBoYXNlRnJhY3Rpb24KKyAgICAgICAgIiAgIHN0ciByNiwgW3IwXVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaGFzZUZyYWN0aW9uCisgICAgICAgICIgICBsZHIgcjAsIFtzcCwgIyIgU1RfUEFSQU01ICIgKyA4XVxuIiAgICAgLy8gJmlucHV0SW5kZXgKKyAgICAgICAgIiAgIHN0ciByNywgW3IwXVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dEluZGV4CisgICAgICAgICIgICBsZHIgcjAsIFtzcCwgIyIgU1RfUEFSQU01ICIgKyA0XVxuIiAgICAgLy8gb3V0CisgICAgICAgICIgICBzdWIgcjgsIHIwXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VyT3V0IC0gb3V0CisgICAgICAgICIgICBhc3IgcjgsICMyXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IG91dHB1dEluZGV4CisgICAgICAgICIgICBsZHIgcjAsIFtzcCwgIyIgU1RfUEFSQU01ICIgKyAwXVxuIiAgICAgLy8gJm91dHB1dEluZGV4CisgICAgICAgICIgICBzdHIgcjgsIFtyMF1cbiIgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBvdXRwdXRJbmRleAorCisgICAgICAgICIgICBsZG1mZCAgIHNwISwge3I0LCByNSwgcjYsIHI3LCByOCwgcjksIHIxMCwgcjExLCByMTIsIHBjfVxuIgorICAgICk7Cit9CisKKyNlbmRpZiAgLy8gQVNNX0FSTV9SRVNBTVAxCisKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogfQogOyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAgYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmNwcAppbmRleCA0ZjQzN2JmLi4xZDI0N2JkIDEwMDY0NAotLS0gYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmNwcAorKysgYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmNwcApAQCAtNjAsOSArNjAsMTEgQEAKICAgICB1aW50MzJfdCBwaGFzZUluY3JlbWVudCA9IG1QaGFzZUluY3JlbWVudDsKICAgICBzaXplX3Qgb3V0cHV0SW5kZXggPSAwOwogICAgIHNpemVfdCBvdXRwdXRTYW1wbGVDb3VudCA9IG91dEZyYW1lQ291bnQgKiAyOwotICAgIAorICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSAob3V0RnJhbWVDb3VudCptSW5TYW1wbGVSYXRlKS9tU2FtcGxlUmF0ZTsKKwogICAgIC8vIGZldGNoIGZpcnN0IGJ1ZmZlcgotICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKSB7CisgICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IGluRnJhbWVDb3VudDsKICAgICAgICAgcHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIpOwogICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybjsKQEAgLTc5LDcgKzgxLDcgQEAKICAgICAgICAgb3V0W291dHB1dEluZGV4KytdICs9IHZsICogaW50ZXJwKCZsZWZ0LCB4KTsKICAgICAgICAgb3V0W291dHB1dEluZGV4KytdICs9IHZyICogaW50ZXJwKCZyaWdodCwgeCk7CiAgICAgICAgIC8vIG91dFtvdXRwdXRJbmRleCsrXSArPSB2ciAqIGluW2lucHV0SW5kZXgqMl07Ci0gICAgICAgIAorCiAgICAgICAgIC8vIGluY3JlbWVudCBwaGFzZQogICAgICAgICBwaGFzZUZyYWN0aW9uICs9IHBoYXNlSW5jcmVtZW50OwogICAgICAgICB1aW50MzJfdCBpbmRleEluY3JlbWVudCA9IChwaGFzZUZyYWN0aW9uID4+IGtOdW1QaGFzZUJpdHMpOwpAQCAtOTIsNiArOTQsNyBAQAogICAgICAgICAgICAgaWYgKGlucHV0SW5kZXggPT0gbUJ1ZmZlci5mcmFtZUNvdW50KSB7CiAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgcHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOworICAgICAgICAgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IGluRnJhbWVDb3VudDsKICAgICAgICAgICAgICAgICBwcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmbUJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2F2ZV9zdGF0ZTsgIC8vIHVnbHksIGJ1dCBlZmZpY2llbnQKQEAgLTEyMiw5ICsxMjUsMTEgQEAKICAgICB1aW50MzJfdCBwaGFzZUluY3JlbWVudCA9IG1QaGFzZUluY3JlbWVudDsKICAgICBzaXplX3Qgb3V0cHV0SW5kZXggPSAwOwogICAgIHNpemVfdCBvdXRwdXRTYW1wbGVDb3VudCA9IG91dEZyYW1lQ291bnQgKiAyOwotICAgIAorICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSAob3V0RnJhbWVDb3VudCptSW5TYW1wbGVSYXRlKS9tU2FtcGxlUmF0ZTsKKwogICAgIC8vIGZldGNoIGZpcnN0IGJ1ZmZlcgotICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKSB7CisgICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IGluRnJhbWVDb3VudDsKICAgICAgICAgcHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIpOwogICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybjsKQEAgLTE0MSw3ICsxNDYsNyBAQAogICAgICAgICBzYW1wbGUgPSBpbnRlcnAoJmxlZnQsIHgpOwogICAgICAgICBvdXRbb3V0cHV0SW5kZXgrK10gKz0gdmwgKiBzYW1wbGU7CiAgICAgICAgIG91dFtvdXRwdXRJbmRleCsrXSArPSB2ciAqIHNhbXBsZTsKLSAgICAgICAgCisKICAgICAgICAgLy8gaW5jcmVtZW50IHBoYXNlCiAgICAgICAgIHBoYXNlRnJhY3Rpb24gKz0gcGhhc2VJbmNyZW1lbnQ7CiAgICAgICAgIHVpbnQzMl90IGluZGV4SW5jcmVtZW50ID0gKHBoYXNlRnJhY3Rpb24gPj4ga051bVBoYXNlQml0cyk7CkBAIC0xNTQsNiArMTU5LDcgQEAKICAgICAgICAgICAgIGlmIChpbnB1dEluZGV4ID09IG1CdWZmZXIuZnJhbWVDb3VudCkgewogICAgICAgICAgICAgICAgIGlucHV0SW5kZXggPSAwOwogICAgICAgICAgICAgICAgIHByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBpbkZyYW1lQ291bnQ7CiAgICAgICAgICAgICAgICAgcHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIpOwogICAgICAgICAgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBnb3RvIHNhdmVfc3RhdGU7ICAvLyB1Z2x5LCBidXQgZWZmaWNpZW50CmRpZmYgLS1naXQgYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAppbmRleCBlNzEwZDE2Li45ZTVlMjU0IDEwMDY0NAotLS0gYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCisrKyBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKQEAgLTI1LDE4ICsyNSwxOCBAQAogICogVGhlc2UgY29lZmljaWVudHMgYXJlIGNvbXB1dGVkIHdpdGggdGhlICJmaXIiIHV0aWxpdHkgZm91bmQgaW4KICAqIHRvb2xzL3Jlc2FtcGxlcl90b29scwogICogVE9ETzogQSBnb29kIG9wdGltaXphdGlvbiB3b3VsZCBiZSB0byB0cmFuc3Bvc2UgdGhpcyBtYXRyaXgsIHRvIHRha2UKLSAqIGJldHRlciBhZHZhbnRhZ2Ugb2YgdGhlIGRhdGEtY2FjaGUuIAorICogYmV0dGVyIGFkdmFudGFnZSBvZiB0aGUgZGF0YS1jYWNoZS4KICAqLwogY29uc3QgaW50MzJfdCBBdWRpb1Jlc2FtcGxlclNpbmM6Om1GaXJDb2Vmc1VwW10gPSB7Ci0JCTB4N2ZmZmZmZmYsIDB4N2YxNWQwNzgsIDB4N2M1ZTBkYTYsIDB4NzdlY2Q4NjcsIDB4NzFlMmUyNTEsIDB4NmE2YzMwNGEsIDB4NjFiZTcyNjksIDB4NTgxNzA0MTIsIDB4NGRiOGFiMDUsIDB4NDJlOTJlYTYsIDB4MzdlZWUyMTQsIDB4MmQwZTNiYjEsIDB4MjI4NzkzNjYsIDB4MTg5NTFlOTUsIDB4MGY2OTNkMGQsIDB4MDcyZDI2MjEsIAotCSAgICAweDAwMDAwMDAwLCAweGY5ZjY2NjU1LCAweGY1MWE1ZmQ3LCAweGYxNmJiZDg0LCAweGVlZTBkOWFjLCAweGVkNjdhOTIyLCAweGVjZTcwZGU2LCAweGVkNDA1ODk3LCAweGVlNTBlNTA1LCAweGVmZjNiZTMwLCAweGYyMDMzNzBmLCAweGY0NWE2NzQxLCAweGY2ZDY3ZDUzLCAweGY5NTdkYjY2LCAweGZiYzJmNjQ3LCAweGZlMDBmMmI5LCAKLQkgICAgMHgwMDAwMDAwMCwgMHgwMWIzNzIxOCwgMHgwMzEzYTBjNiwgMHgwNDFkOTMwZCwgMHgwNGQyODA1NywgMHgwNTM3MzFiMCwgMHgwNTUzNGRmZiwgMHgwNTMwOWJmZCwgMHgwNGRhNDQwZCwgMHgwNDVjMWFlZSwgMHgwM2MxZmNkZCwgMHgwMzE3M2VmNSwgMHgwMjY2M2FlOCwgMHgwMWI3ZjczNiwgMHgwMTEzZWM3OSwgMHgwMDdmZTZhOSwgCi0JICAgIDB4MDAwMDAwMDAsIDB4ZmY5NmIyMjksIDB4ZmY0NGY5OWYsIDB4ZmYwYTg2YmUsIDB4ZmVlNWY4MDMsIDB4ZmVkNTE4ZmQsIDB4ZmVkNTIxZmQsIDB4ZmVlMmY0ZmQsIDB4ZmVmYjU0ZjgsIDB4ZmYxYjE1OWIsIDB4ZmYzZjQyMDMsIDB4ZmY2NTM5ZTAsIDB4ZmY4YWM1MDIsIDB4ZmZhZTFkZGQsIDB4ZmZjZGYzZjksIDB4ZmZlOTY3OTgsIAotCSAgICAweDAwMDAwMDAwLCAweDAwMTE5ZGU2LCAweDAwMWU2YjdlLCAweDAwMjZjYjdhLCAweDAwMmI0ODMwLCAweDAwMmM4M2Q2LCAweDAwMmIyYTgyLCAweDAwMjdlNjdhLCAweDAwMjM1NmY5LCAweDAwMWUwOThlLCAweDAwMTg3NWU0LCAweDAwMTJmYmJlLCAweDAwMGRlMmQxLCAweDAwMDk1YzEwLCAweDAwMDU4NDE0LCAweDAwMDI2NjM2LCAKLQkgICAgMHgwMDAwMDAwMCwgMHhmZmZlNDRhOSwgMHhmZmZkMjA2ZCwgMHhmZmZjN2I3ZiwgMHhmZmZjM2M4ZiwgMHhmZmZjNGFjMiwgMHhmZmZjOGYyYiwgMHhmZmZjZjVjNCwgMHhmZmZkNmRmMywgMHhmZmZkZWFiMiwgMHhmZmZlNjI3NSwgMHhmZmZlY2VjZiwgMHhmZmZmMmMwNywgMHhmZmZmNzg4YywgMHhmZmZmYjQ3MSwgMHhmZmZmZTBmMiwgCi0JICAgIDB4MDAwMDAwMDAsIDB4MDAwMDEzZTYsIDB4MDAwMDFmMDMsIDB4MDAwMDIzOTYsIDB4MDAwMDIzOTksIDB4MDAwMDIwYjYsIDB4MDAwMDFjM2MsIDB4MDAwMDE3MjIsIDB4MDAwMDEyMTYsIDB4MDAwMDBkODEsIDB4MDAwMDA5OWMsIDB4MDAwMDA2N2MsIDB4MDAwMDA0MTksIDB4MDAwMDAyNWYsIDB4MDAwMDAxMzEsIDB4MDAwMDAwNzAsIAotCSAgICAweDAwMDAwMDAwLCAweGZmZmZmZmM3LCAweGZmZmZmZmIzLCAweGZmZmZmZmIzLCAweGZmZmZmZmJlLCAweGZmZmZmZmNkLCAweGZmZmZmZmRiLCAweGZmZmZmZmU3LCAweGZmZmZmZmYwLCAweGZmZmZmZmY3LCAweGZmZmZmZmZiLCAweGZmZmZmZmZlLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAKLQkgICAgMHgwMDAwMDAwMCAvLyB0aGlzIG9uZSBpcyBuZWVkZWQgZm9yIGxlcnBpbmcgdGhlIGxhc3QgY29lZmZpY2llbnQKKyAgICAgICAgMHg3ZmZmZmZmZiwgMHg3ZjE1ZDA3OCwgMHg3YzVlMGRhNiwgMHg3N2VjZDg2NywgMHg3MWUyZTI1MSwgMHg2YTZjMzA0YSwgMHg2MWJlNzI2OSwgMHg1ODE3MDQxMiwgMHg0ZGI4YWIwNSwgMHg0MmU5MmVhNiwgMHgzN2VlZTIxNCwgMHgyZDBlM2JiMSwgMHgyMjg3OTM2NiwgMHgxODk1MWU5NSwgMHgwZjY5M2QwZCwgMHgwNzJkMjYyMSwKKyAgICAgICAgMHgwMDAwMDAwMCwgMHhmOWY2NjY1NSwgMHhmNTFhNWZkNywgMHhmMTZiYmQ4NCwgMHhlZWUwZDlhYywgMHhlZDY3YTkyMiwgMHhlY2U3MGRlNiwgMHhlZDQwNTg5NywgMHhlZTUwZTUwNSwgMHhlZmYzYmUzMCwgMHhmMjAzMzcwZiwgMHhmNDVhNjc0MSwgMHhmNmQ2N2Q1MywgMHhmOTU3ZGI2NiwgMHhmYmMyZjY0NywgMHhmZTAwZjJiOSwKKyAgICAgICAgMHgwMDAwMDAwMCwgMHgwMWIzNzIxOCwgMHgwMzEzYTBjNiwgMHgwNDFkOTMwZCwgMHgwNGQyODA1NywgMHgwNTM3MzFiMCwgMHgwNTUzNGRmZiwgMHgwNTMwOWJmZCwgMHgwNGRhNDQwZCwgMHgwNDVjMWFlZSwgMHgwM2MxZmNkZCwgMHgwMzE3M2VmNSwgMHgwMjY2M2FlOCwgMHgwMWI3ZjczNiwgMHgwMTEzZWM3OSwgMHgwMDdmZTZhOSwKKyAgICAgICAgMHgwMDAwMDAwMCwgMHhmZjk2YjIyOSwgMHhmZjQ0Zjk5ZiwgMHhmZjBhODZiZSwgMHhmZWU1ZjgwMywgMHhmZWQ1MThmZCwgMHhmZWQ1MjFmZCwgMHhmZWUyZjRmZCwgMHhmZWZiNTRmOCwgMHhmZjFiMTU5YiwgMHhmZjNmNDIwMywgMHhmZjY1MzllMCwgMHhmZjhhYzUwMiwgMHhmZmFlMWRkZCwgMHhmZmNkZjNmOSwgMHhmZmU5Njc5OCwKKyAgICAgICAgMHgwMDAwMDAwMCwgMHgwMDExOWRlNiwgMHgwMDFlNmI3ZSwgMHgwMDI2Y2I3YSwgMHgwMDJiNDgzMCwgMHgwMDJjODNkNiwgMHgwMDJiMmE4MiwgMHgwMDI3ZTY3YSwgMHgwMDIzNTZmOSwgMHgwMDFlMDk4ZSwgMHgwMDE4NzVlNCwgMHgwMDEyZmJiZSwgMHgwMDBkZTJkMSwgMHgwMDA5NWMxMCwgMHgwMDA1ODQxNCwgMHgwMDAyNjYzNiwKKyAgICAgICAgMHgwMDAwMDAwMCwgMHhmZmZlNDRhOSwgMHhmZmZkMjA2ZCwgMHhmZmZjN2I3ZiwgMHhmZmZjM2M4ZiwgMHhmZmZjNGFjMiwgMHhmZmZjOGYyYiwgMHhmZmZjZjVjNCwgMHhmZmZkNmRmMywgMHhmZmZkZWFiMiwgMHhmZmZlNjI3NSwgMHhmZmZlY2VjZiwgMHhmZmZmMmMwNywgMHhmZmZmNzg4YywgMHhmZmZmYjQ3MSwgMHhmZmZmZTBmMiwKKyAgICAgICAgMHgwMDAwMDAwMCwgMHgwMDAwMTNlNiwgMHgwMDAwMWYwMywgMHgwMDAwMjM5NiwgMHgwMDAwMjM5OSwgMHgwMDAwMjBiNiwgMHgwMDAwMWMzYywgMHgwMDAwMTcyMiwgMHgwMDAwMTIxNiwgMHgwMDAwMGQ4MSwgMHgwMDAwMDk5YywgMHgwMDAwMDY3YywgMHgwMDAwMDQxOSwgMHgwMDAwMDI1ZiwgMHgwMDAwMDEzMSwgMHgwMDAwMDA3MCwKKyAgICAgICAgMHgwMDAwMDAwMCwgMHhmZmZmZmZjNywgMHhmZmZmZmZiMywgMHhmZmZmZmZiMywgMHhmZmZmZmZiZSwgMHhmZmZmZmZjZCwgMHhmZmZmZmZkYiwgMHhmZmZmZmZlNywgMHhmZmZmZmZmMCwgMHhmZmZmZmZmNywgMHhmZmZmZmZmYiwgMHhmZmZmZmZmZSwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKyAgICAgICAgMHgwMDAwMDAwMCAvLyB0aGlzIG9uZSBpcyBuZWVkZWQgZm9yIGxlcnBpbmcgdGhlIGxhc3QgY29lZmZpY2llbnQKIH07CiAKIC8qCkBAIC00NiwyMCArNDYsMjAgQEAKICAqIHRoZXNlIGNvZWZmaWNpZW50IGZyb20gdGhlIGFib3ZlIGJ5ICJTdHJldGNoaW5nIiB0aGVtIGluIHRpbWUpLgogICovCiBjb25zdCBpbnQzMl90IEF1ZGlvUmVzYW1wbGVyU2luYzo6bUZpckNvZWZzRG93bltdID0gewotCQkweDdmZmZmZmZmLCAweDdmNTVlNDZkLCAweDdkNWI0YzYwLCAweDdhMWI0Yjk4LCAweDc1YTdmYjE0LCAweDcwMTlmMGJkLCAweDY5OGY4NzVhLCAweDYyMmJmZDU5LCAweDVhMTY3MjU2LCAweDUxNzhjYzU0LCAweDQ4N2U4ZTZjLCAweDNmNTNhYWU4LCAweDM2MjM1YWQ0LCAweDJkMTcwNDdiLCAweDI0NTUzOWFiLCAweDFjMDBkNTQwLCAKLQkgICAgMHgxNDM4M2U1NywgMHgwZDE0ZDVjYSwgMHgwNmFhOTEwYiwgMHgwMTA3YzM4YiwgMHhmYzM1MTY1NCwgMHhmODM1YWJhZSwgMHhmNTA3NmI0NSwgMHhmMmEzNzIwMiwgMHhmMGZlOWZhYSwgMHhmMDBhM2JiZCwgMHhlZmI0YWE4MSwgMHhlZmVhMmIwNSwgMHhmMDk1OTcxNiwgMHhmMWExMWU4MywgMHhmMmY2ZjdhMCwgMHhmNDgxZmZmNCwgCi0JICAgIDB4ZjYyZTQ4Y2UsIDB4ZjdlOThjYTUsIDB4ZjlhMzhiNGMsIDB4ZmI0ZTRiZmEsIDB4ZmNkZTQ1NmYsIDB4ZmU0YTZkMzAsIDB4ZmY4YzJmZGYsIDB4MDA5ZjU1NTUsIDB4MDE4MWQzOTMsIDB4MDIzMzk0MGYsIDB4MDJiNjJmMDYsIDB4MDMwY2EwN2QsIDB4MDMzYWZhNjIsIDB4MDM0NjE3MjUsIDB4MDMzMzRmODMsIDB4MDMwODM1ZmEsIAotCSAgICAweDAyY2E1OWNjLCAweDAyN2YxMmQxLCAweDAyMmI1NzBkLCAweDAxZDM5YTQ5LCAweDAxN2JiNzhmLCAweDAxMjZlNDE0LCAweDAwZDdhYWFmLCAweDAwOGZlZWM3LCAweDAwNTBmNTg0LCAweDAwMWI3M2UzLCAweGZmZWZhMDYzLCAweGZmY2Q0NmVkLCAweGZmYjNkZGNkLCAweGZmYTI5YWFhLCAweGZmOTg4NjkxLCAweGZmOTQ5MDY2LCAKLQkgICAgMHhmZjk1OWQyNCwgMHhmZjlhOTU5ZSwgMHhmZmEyNzE5NSwgMHhmZmFjNDAxMSwgMHhmZmI3MmQyYiwgMHhmZmMyODU2OSwgMHhmZmNkYjcwNiwgMHhmZmQ4NTE3MSwgMHhmZmUyMDM2NCwgMHhmZmVhOTdlOSwgMHhmZmYxZjJiMiwgMHhmZmY4MGMwNiwgMHhmZmZjZWM5MiwgMHgwMDAwYTk1NSwgMHgwMDAzNWZkOCwgMHgwMDA1MzJjZiwgCi0JICAgIDB4MDAwNjQ3MzUsIDB4MDAwNmMxZjksIDB4MDAwNmM2MmQsIDB4MDAwNjczYmEsIDB4MDAwNWU2OGYsIDB4MDAwNTM2MzAsIDB4MDAwNDc1YTMsIDB4MDAwM2IzOTcsIDB4MDAwMmZhYzEsIDB4MDAwMjUyNTcsIDB4MDAwMWJlOWUsIDB4MDAwMTQxN2EsIDB4MDAwMGRhZmQsIDB4MDAwMDg5ZWIsIDB4MDAwMDRjMjgsIDB4MDAwMDFmMWQsIAotCSAgICAweDAwMDAwMDAwLCAweGZmZmZlYzEwLCAweGZmZmZlMGJlLCAweGZmZmZkYmM1LCAweGZmZmZkYjM5LCAweGZmZmZkZDhiLCAweGZmZmZlMTgyLCAweGZmZmZlNjM4LCAweGZmZmZlYjBhLCAweGZmZmZlZjhmLCAweGZmZmZmMzhiLCAweGZmZmZmNmUzLCAweGZmZmZmOTkzLCAweGZmZmZmYmE2LCAweGZmZmZmZDMwLCAweGZmZmZmZTRhLCAKLQkgICAgMHhmZmZmZmYwOSwgMHhmZmZmZmY4NSwgMHhmZmZmZmZkMSwgMHhmZmZmZmZmYiwgMHgwMDAwMDAwZiwgMHgwMDAwMDAxNiwgMHgwMDAwMDAxNSwgMHgwMDAwMDAxMiwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwOSwgMHgwMDAwMDAwNiwgMHgwMDAwMDAwMywgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgCi0JICAgIDB4MDAwMDAwMDAgLy8gdGhpcyBvbmUgaXMgbmVlZGVkIGZvciBsZXJwaW5nIHRoZSBsYXN0IGNvZWZmaWNpZW50CisgICAgICAgIDB4N2ZmZmZmZmYsIDB4N2Y1NWU0NmQsIDB4N2Q1YjRjNjAsIDB4N2ExYjRiOTgsIDB4NzVhN2ZiMTQsIDB4NzAxOWYwYmQsIDB4Njk4Zjg3NWEsIDB4NjIyYmZkNTksIDB4NWExNjcyNTYsIDB4NTE3OGNjNTQsIDB4NDg3ZThlNmMsIDB4M2Y1M2FhZTgsIDB4MzYyMzVhZDQsIDB4MmQxNzA0N2IsIDB4MjQ1NTM5YWIsIDB4MWMwMGQ1NDAsCisgICAgICAgIDB4MTQzODNlNTcsIDB4MGQxNGQ1Y2EsIDB4MDZhYTkxMGIsIDB4MDEwN2MzOGIsIDB4ZmMzNTE2NTQsIDB4ZjgzNWFiYWUsIDB4ZjUwNzZiNDUsIDB4ZjJhMzcyMDIsIDB4ZjBmZTlmYWEsIDB4ZjAwYTNiYmQsIDB4ZWZiNGFhODEsIDB4ZWZlYTJiMDUsIDB4ZjA5NTk3MTYsIDB4ZjFhMTFlODMsIDB4ZjJmNmY3YTAsIDB4ZjQ4MWZmZjQsCisgICAgICAgIDB4ZjYyZTQ4Y2UsIDB4ZjdlOThjYTUsIDB4ZjlhMzhiNGMsIDB4ZmI0ZTRiZmEsIDB4ZmNkZTQ1NmYsIDB4ZmU0YTZkMzAsIDB4ZmY4YzJmZGYsIDB4MDA5ZjU1NTUsIDB4MDE4MWQzOTMsIDB4MDIzMzk0MGYsIDB4MDJiNjJmMDYsIDB4MDMwY2EwN2QsIDB4MDMzYWZhNjIsIDB4MDM0NjE3MjUsIDB4MDMzMzRmODMsIDB4MDMwODM1ZmEsCisgICAgICAgIDB4MDJjYTU5Y2MsIDB4MDI3ZjEyZDEsIDB4MDIyYjU3MGQsIDB4MDFkMzlhNDksIDB4MDE3YmI3OGYsIDB4MDEyNmU0MTQsIDB4MDBkN2FhYWYsIDB4MDA4ZmVlYzcsIDB4MDA1MGY1ODQsIDB4MDAxYjczZTMsIDB4ZmZlZmEwNjMsIDB4ZmZjZDQ2ZWQsIDB4ZmZiM2RkY2QsIDB4ZmZhMjlhYWEsIDB4ZmY5ODg2OTEsIDB4ZmY5NDkwNjYsCisgICAgICAgIDB4ZmY5NTlkMjQsIDB4ZmY5YTk1OWUsIDB4ZmZhMjcxOTUsIDB4ZmZhYzQwMTEsIDB4ZmZiNzJkMmIsIDB4ZmZjMjg1NjksIDB4ZmZjZGI3MDYsIDB4ZmZkODUxNzEsIDB4ZmZlMjAzNjQsIDB4ZmZlYTk3ZTksIDB4ZmZmMWYyYjIsIDB4ZmZmODBjMDYsIDB4ZmZmY2VjOTIsIDB4MDAwMGE5NTUsIDB4MDAwMzVmZDgsIDB4MDAwNTMyY2YsCisgICAgICAgIDB4MDAwNjQ3MzUsIDB4MDAwNmMxZjksIDB4MDAwNmM2MmQsIDB4MDAwNjczYmEsIDB4MDAwNWU2OGYsIDB4MDAwNTM2MzAsIDB4MDAwNDc1YTMsIDB4MDAwM2IzOTcsIDB4MDAwMmZhYzEsIDB4MDAwMjUyNTcsIDB4MDAwMWJlOWUsIDB4MDAwMTQxN2EsIDB4MDAwMGRhZmQsIDB4MDAwMDg5ZWIsIDB4MDAwMDRjMjgsIDB4MDAwMDFmMWQsCisgICAgICAgIDB4MDAwMDAwMDAsIDB4ZmZmZmVjMTAsIDB4ZmZmZmUwYmUsIDB4ZmZmZmRiYzUsIDB4ZmZmZmRiMzksIDB4ZmZmZmRkOGIsIDB4ZmZmZmUxODIsIDB4ZmZmZmU2MzgsIDB4ZmZmZmViMGEsIDB4ZmZmZmVmOGYsIDB4ZmZmZmYzOGIsIDB4ZmZmZmY2ZTMsIDB4ZmZmZmY5OTMsIDB4ZmZmZmZiYTYsIDB4ZmZmZmZkMzAsIDB4ZmZmZmZlNGEsCisgICAgICAgIDB4ZmZmZmZmMDksIDB4ZmZmZmZmODUsIDB4ZmZmZmZmZDEsIDB4ZmZmZmZmZmIsIDB4MDAwMDAwMGYsIDB4MDAwMDAwMTYsIDB4MDAwMDAwMTUsIDB4MDAwMDAwMTIsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMDksIDB4MDAwMDAwMDYsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisgICAgICAgIDB4MDAwMDAwMDAgLy8gdGhpcyBvbmUgaXMgbmVlZGVkIGZvciBsZXJwaW5nIHRoZSBsYXN0IGNvZWZmaWNpZW50CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXN0YXRpYyBpbmxpbmUgCitzdGF0aWMgaW5saW5lCiBpbnQzMl90IG11bFJMKGludCBsZWZ0LCBpbnQzMl90IGluLCB1aW50MzJfdCB2UkwpCiB7CiAjaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCkBAIC04NSw3ICs4NSw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSAKK3N0YXRpYyBpbmxpbmUKIGludDMyX3QgbXVsQWRkKGludDE2X3QgaW4sIGludDMyX3QgdiwgaW50MzJfdCBhKQogewogI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQpAQCAtOTUsMTIgKzk1LDE0IEBACiAgICAgICAgICA6IFtpbl0iJXIiKGluKSwgW3ZdInIiKHYpLCBbYV0iciIoYSkKICAgICAgICAgIDogKTsKICAgICByZXR1cm4gb3V0OwotI2Vsc2UgICAgCi0gICAgcmV0dXJuIGEgKyAoKGluICogaW50MzJfdCh2KSk+PjE2KTsKKyNlbHNlCisgICAgcmV0dXJuIGEgKyBpbiAqICh2Pj4xNik7CisgICAgLy8gaW1wcm92ZWQgcHJlY2lzaW9uCisgICAgLy8gcmV0dXJuIGEgKyBpbiAqICh2Pj4xNikgKyAoKGluICogKHYgJiAweGZmZmYpKSA+PiAxNik7CiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSAKK3N0YXRpYyBpbmxpbmUKIGludDMyX3QgbXVsQWRkUkwoaW50IGxlZnQsIHVpbnQzMl90IGluUkwsIGludDMyX3QgdiwgaW50MzJfdCBhKQogewogI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQpAQCAtMTE5LDkgKzEyMSwxMSBAQAogICAgIHJldHVybiBvdXQ7CiAjZWxzZQogICAgIGlmIChsZWZ0KSB7Ci0gICAgICAgIHJldHVybiBhICsgKChpbnQxNl90KGluUkwmMHhGRkZGKSAqIGludDMyX3QodikpPj4xNik7CisgICAgICAgIHJldHVybiBhICsgKGludDE2X3QoaW5STCYweEZGRkYpICogKHY+PjE2KSk7CisgICAgICAgIC8vaW1wcm92ZWQgcHJlY2lzaW9uCisgICAgICAgIC8vIHJldHVybiBhICsgKGludDE2X3QoaW5STCYweEZGRkYpICogKHY+PjE2KSkgKyAoKGludDE2X3QoaW5STCYweEZGRkYpICogKHYgJiAweGZmZmYpKSA+PiAxNik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGEgKyAoKGludDE2X3QoaW5STD4+MTYpICogaW50MzJfdCh2KSk+PjE2KTsKKyAgICAgICAgcmV0dXJuIGEgKyAoaW50MTZfdChpblJMPj4xNikgKiAodj4+MTYpKTsKICAgICB9CiAjZW5kaWYKIH0KQEAgLTEyOSwzNyArMTMzLDM3IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvUmVzYW1wbGVyU2luYzo6QXVkaW9SZXNhbXBsZXJTaW5jKGludCBiaXREZXB0aCwKLQkJaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUpCi0JOiBBdWRpb1Jlc2FtcGxlcihiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpLAotCW1TdGF0ZSgwKQorICAgICAgICBpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSkKKyAgICA6IEF1ZGlvUmVzYW1wbGVyKGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSksCisgICAgbVN0YXRlKDApCiB7Ci0JLyogCi0JICogTGF5b3V0IG9mIHRoZSBzdGF0ZSBidWZmZXIgZm9yIDMyIHRhcDoKLQkgKiAKLQkgKiAicHJlc2VudCIgc2FtcGxlICAgICAgICAgICAgYmVnaW5uaW5nIG9mIDJuZCBidWZmZXIKLQkgKiAgICAgICAgICAgICAgICAgdiAgICAgICAgICAgICAgICB2Ci0JICogIDAgICAgICAgICAgICAgIDAxICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgMjMgICAgICAgICAgICAgIDMKLQkgKiAgMCAgICAgICAgICAgICAgRjAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICBGMCAgICAgICAgICAgICAgRgotCSAqIFtwcHBwcHBwcHBwcHBwcHBJbm5ubm5ubm5ubm5ubm5ubnBwcHBwcHBwcHBwcHBwcElubm5ubm5ubm5ubm5ubm5uXQotCSAqICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgXiBoZWFkCi0JICogCi0JICogcCA9IHBhc3Qgc2FtcGxlcywgY29udm9sdXRlZCB3aXRoIHRoZSAocClvc2l0aXZlIHNpZGUgb2Ygc2luYygpCi0JICogbiA9IGZ1dHVyZSBzYW1wbGVzLCBjb252b2x1dGVkIHdpdGggdGhlIChuKWVnYXRpdmUgc2lkZSBvZiBzaW5jKCkKLQkgKiByID0gZXh0cmEgc3BhY2UgZm9yIGltcGxlbWVudGluZyB0aGUgcmluZyBidWZmZXIKLQkgKiAKLQkgKi8KKyAgICAvKgorICAgICAqIExheW91dCBvZiB0aGUgc3RhdGUgYnVmZmVyIGZvciAzMiB0YXA6CisgICAgICoKKyAgICAgKiAicHJlc2VudCIgc2FtcGxlICAgICAgICAgICAgYmVnaW5uaW5nIG9mIDJuZCBidWZmZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgdiAgICAgICAgICAgICAgICB2CisgICAgICogIDAgICAgICAgICAgICAgIDAxICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgMjMgICAgICAgICAgICAgIDMKKyAgICAgKiAgMCAgICAgICAgICAgICAgRjAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICBGMCAgICAgICAgICAgICAgRgorICAgICAqIFtwcHBwcHBwcHBwcHBwcHBJbm5ubm5ubm5ubm5ubm5ubnBwcHBwcHBwcHBwcHBwcElubm5ubm5ubm5ubm5ubm5uXQorICAgICAqICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgXiBoZWFkCisgICAgICoKKyAgICAgKiBwID0gcGFzdCBzYW1wbGVzLCBjb252b2x1dGVkIHdpdGggdGhlIChwKW9zaXRpdmUgc2lkZSBvZiBzaW5jKCkKKyAgICAgKiBuID0gZnV0dXJlIHNhbXBsZXMsIGNvbnZvbHV0ZWQgd2l0aCB0aGUgKG4pZWdhdGl2ZSBzaWRlIG9mIHNpbmMoKQorICAgICAqIHIgPSBleHRyYSBzcGFjZSBmb3IgaW1wbGVtZW50aW5nIHRoZSByaW5nIGJ1ZmZlcgorICAgICAqCisgICAgICovCiAKLQljb25zdCBzaXplX3QgbnVtQ29lZnMgPSAyKmhhbGZOdW1Db2VmczsKLQljb25zdCBzaXplX3Qgc3RhdGVTaXplID0gbnVtQ29lZnMgKiBpbkNoYW5uZWxDb3VudCAqIDI7Ci0JbVN0YXRlID0gbmV3IGludDE2X3Rbc3RhdGVTaXplXTsKLQltZW1zZXQobVN0YXRlLCAwLCBzaXplb2YoaW50MTZfdCkqc3RhdGVTaXplKTsKLQltSW1wdWxzZSA9IG1TdGF0ZSArIChoYWxmTnVtQ29lZnMtMSkqaW5DaGFubmVsQ291bnQ7Ci0JbVJpbmdGdWxsID0gbUltcHVsc2UgKyAobnVtQ29lZnMrMSkqaW5DaGFubmVsQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG51bUNvZWZzID0gMipoYWxmTnVtQ29lZnM7CisgICAgY29uc3Qgc2l6ZV90IHN0YXRlU2l6ZSA9IG51bUNvZWZzICogaW5DaGFubmVsQ291bnQgKiAyOworICAgIG1TdGF0ZSA9IG5ldyBpbnQxNl90W3N0YXRlU2l6ZV07CisgICAgbWVtc2V0KG1TdGF0ZSwgMCwgc2l6ZW9mKGludDE2X3QpKnN0YXRlU2l6ZSk7CisgICAgbUltcHVsc2UgPSBtU3RhdGUgKyAoaGFsZk51bUNvZWZzLTEpKmluQ2hhbm5lbENvdW50OworICAgIG1SaW5nRnVsbCA9IG1JbXB1bHNlICsgKG51bUNvZWZzKzEpKmluQ2hhbm5lbENvdW50OwogfQogCiBBdWRpb1Jlc2FtcGxlclNpbmM6On5BdWRpb1Jlc2FtcGxlclNpbmMoKQogewotCWRlbGV0ZSBbXSBtU3RhdGU7CisgICAgZGVsZXRlIFtdIG1TdGF0ZTsKIH0KIAogdm9pZCBBdWRpb1Jlc2FtcGxlclNpbmM6OmluaXQoKSB7CkBAIC0xNjgsOSArMTcyLDkgQEAKIHZvaWQgQXVkaW9SZXNhbXBsZXJTaW5jOjpyZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpCiB7Ci0JbUZpckNvZWZzID0gKG1JblNhbXBsZVJhdGUgPD0gbVNhbXBsZVJhdGUpID8gbUZpckNvZWZzVXAgOiBtRmlyQ29lZnNEb3duOworICAgIG1GaXJDb2VmcyA9IChtSW5TYW1wbGVSYXRlIDw9IG1TYW1wbGVSYXRlKSA/IG1GaXJDb2Vmc1VwIDogbUZpckNvZWZzRG93bjsKIAotCS8vIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgcmVzYW1wbGVyCisgICAgLy8gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSByZXNhbXBsZXIKICAgICBzd2l0Y2ggKG1DaGFubmVsQ291bnQpIHsKICAgICBjYXNlIDE6CiAgICAgICAgIHJlc2FtcGxlPDE+KG91dCwgb3V0RnJhbWVDb3VudCwgcHJvdmlkZXIpOwpAQCAtMTkzLDQzICsxOTcsNjggQEAKICAgICB1aW50MzJfdCBwaGFzZUluY3JlbWVudCA9IG1QaGFzZUluY3JlbWVudDsKICAgICBzaXplX3Qgb3V0cHV0SW5kZXggPSAwOwogICAgIHNpemVfdCBvdXRwdXRTYW1wbGVDb3VudCA9IG91dEZyYW1lQ291bnQgKiAyOworICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSAob3V0RnJhbWVDb3VudCptSW5TYW1wbGVSYXRlKS9tU2FtcGxlUmF0ZTsKIAogICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciYgYnVmZmVyKG1CdWZmZXIpOwogICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IG91dHB1dFNhbXBsZUNvdW50KSB7CiAgICAgICAgIC8vIGJ1ZmZlciBpcyBlbXB0eSwgZmV0Y2ggYSBuZXcgb25lCi0gICAgICAgIGlmIChidWZmZXIucmF3ID09IE5VTEwpIHsKKyAgICAgICAgd2hpbGUgKGJ1ZmZlci5mcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlci5mcmFtZUNvdW50ID0gaW5GcmFtZUNvdW50OwogICAgICAgICAgICAgcHJvdmlkZXItPmdldE5leHRCdWZmZXIoJmJ1ZmZlcik7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyLnJhdyA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIAkJY29uc3QgdWludDMyX3QgcGhhc2VJbmRleCA9IHBoYXNlRnJhY3Rpb24gPj4ga051bVBoYXNlQml0czsKLSAgICAgICAgCWlmIChwaGFzZUluZGV4KSB7Ci0gICAgICAgIAkJcmVhZDxDSEFOTkVMUz4oaW1wdWxzZSwgcGhhc2VGcmFjdGlvbiwgYnVmZmVyLmkxNiwgaW5wdXRJbmRleCk7CisgICAgICAgICAgICBpZiAoYnVmZmVyLnJhdyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZ290byByZXNhbXBsZV9leGl0OwogICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgdWludDMyX3QgcGhhc2VJbmRleCA9IHBoYXNlRnJhY3Rpb24gPj4ga051bVBoYXNlQml0czsKKyAgICAgICAgICAgIGlmIChwaGFzZUluZGV4ID09IDEpIHsKKyAgICAgICAgICAgICAgICAvLyByZWFkIG9uZSBmcmFtZQorICAgICAgICAgICAgICAgIHJlYWQ8Q0hBTk5FTFM+KGltcHVsc2UsIHBoYXNlRnJhY3Rpb24sIGJ1ZmZlci5pMTYsIGlucHV0SW5kZXgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwaGFzZUluZGV4ID09IDIpIHsKKyAgICAgICAgICAgICAgICAvLyByZWFkIDIgZnJhbWVzCisgICAgICAgICAgICAgICAgcmVhZDxDSEFOTkVMUz4oaW1wdWxzZSwgcGhhc2VGcmFjdGlvbiwgYnVmZmVyLmkxNiwgaW5wdXRJbmRleCk7CisgICAgICAgICAgICAgICAgaW5wdXRJbmRleCsrOworICAgICAgICAgICAgICAgIGlmIChpbnB1dEluZGV4ID49IG1CdWZmZXIuZnJhbWVDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4IC09IG1CdWZmZXIuZnJhbWVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZDxDSEFOTkVMUz4oaW1wdWxzZSwgcGhhc2VGcmFjdGlvbiwgYnVmZmVyLmkxNiwgaW5wdXRJbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaW50MTZfdCAqaW4gPSBidWZmZXIuaTE2OwotICAgIAljb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGJ1ZmZlci5mcmFtZUNvdW50OwogCi0gICAgCS8vIEFsd2F5cyByZWFkLWluIHRoZSBmaXJzdCBzYW1wbGVzIGZyb20gdGhlIGlucHV0IGJ1ZmZlcgotICAgIAlpbnQxNl90KiBoZWFkID0gaW1wdWxzZSArIGhhbGZOdW1Db2VmcypDSEFOTkVMUzsKLQkJaGVhZFswXSA9IGluW2lucHV0SW5kZXgqQ0hBTk5FTFMgKyAwXTsKLQkJaWYgKENIQU5ORUxTID09IDIpCi0JCQloZWFkWzFdID0gaW5baW5wdXRJbmRleCpDSEFOTkVMUyArIDFdOworICAgICAgICAvLyBBbHdheXMgcmVhZC1pbiB0aGUgZmlyc3Qgc2FtcGxlcyBmcm9tIHRoZSBpbnB1dCBidWZmZXIKKyAgICAgICAgaW50MTZfdCogaGVhZCA9IGltcHVsc2UgKyBoYWxmTnVtQ29lZnMqQ0hBTk5FTFM7CisgICAgICAgIGhlYWRbMF0gPSBpbltpbnB1dEluZGV4KkNIQU5ORUxTICsgMF07CisgICAgICAgIGlmIChDSEFOTkVMUyA9PSAyKQorICAgICAgICAgICAgaGVhZFsxXSA9IGluW2lucHV0SW5kZXgqQ0hBTk5FTFMgKyAxXTsKIAogICAgICAgICAvLyBoYW5kbGUgYm91bmRhcnkgY2FzZQotICAgIAlpbnQzMl90IGwsIHI7CisgICAgICAgIGludDMyX3QgbCwgcjsKICAgICAgICAgd2hpbGUgKG91dHB1dEluZGV4IDwgb3V0cHV0U2FtcGxlQ291bnQpIHsKLSAgICAgICAgCWZpbHRlckNvZWZmaWNpZW50PENIQU5ORUxTPihsLCByLCBwaGFzZUZyYWN0aW9uLCBpbXB1bHNlKTsKLSAgICAJCW91dFtvdXRwdXRJbmRleCsrXSA9IG11bFJMKDEsIGwsIHZSTCk7Ci0gICAgCQlvdXRbb3V0cHV0SW5kZXgrK10gPSBtdWxSTCgwLCByLCB2UkwpOworICAgICAgICAgICAgZmlsdGVyQ29lZmZpY2llbnQ8Q0hBTk5FTFM+KGwsIHIsIHBoYXNlRnJhY3Rpb24sIGltcHVsc2UpOworICAgICAgICAgICAgb3V0W291dHB1dEluZGV4KytdICs9IDIgKiBtdWxSTCgxLCBsLCB2UkwpOworICAgICAgICAgICAgb3V0W291dHB1dEluZGV4KytdICs9IDIgKiBtdWxSTCgwLCByLCB2UkwpOwogCi0gICAgICAgIAlwaGFzZUZyYWN0aW9uICs9IHBoYXNlSW5jcmVtZW50OwotICAgIAkJY29uc3QgdWludDMyX3QgcGhhc2VJbmRleCA9IHBoYXNlRnJhY3Rpb24gPj4ga051bVBoYXNlQml0czsKLSAgICAgICAgCWlmIChwaGFzZUluZGV4KSB7Ci0gICAgICAgIAkJaW5wdXRJbmRleCArPSBwaGFzZUluZGV4OwotICAgICAgICAJCWlmIChpbnB1dEluZGV4ID49IGZyYW1lQ291bnQpCi0gICAgICAgIAkJCWJyZWFrOwotICAgICAgICAJCXJlYWQ8Q0hBTk5FTFM+KGltcHVsc2UsIHBoYXNlRnJhY3Rpb24sIGluLCBpbnB1dEluZGV4KTsKLSAgICAgICAgCX0KKyAgICAgICAgICAgIHBoYXNlRnJhY3Rpb24gKz0gcGhhc2VJbmNyZW1lbnQ7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBwaGFzZUluZGV4ID0gcGhhc2VGcmFjdGlvbiA+PiBrTnVtUGhhc2VCaXRzOworICAgICAgICAgICAgaWYgKHBoYXNlSW5kZXggPT0gMSkgeworICAgICAgICAgICAgICAgIGlucHV0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXRJbmRleCA+PSBmcmFtZUNvdW50KQorICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8vIG5lZWQgYSBuZXcgYnVmZmVyCisgICAgICAgICAgICAgICAgcmVhZDxDSEFOTkVMUz4oaW1wdWxzZSwgcGhhc2VGcmFjdGlvbiwgaW4sIGlucHV0SW5kZXgpOworICAgICAgICAgICAgfSBlbHNlIGlmKHBoYXNlSW5kZXggPT0gMikgeyAgICAvLyBtYXhpbXVtIHZhbHVlCisgICAgICAgICAgICAgICAgaW5wdXRJbmRleCsrOworICAgICAgICAgICAgICAgIGlmIChpbnB1dEluZGV4ID49IGZyYW1lQ291bnQpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gMCBmcmFtZSBhdmFpbGFibGUsIDIgZnJhbWVzIG5lZWRlZAorICAgICAgICAgICAgICAgIC8vIHJlYWQgZmlyc3QgZnJhbWUKKyAgICAgICAgICAgICAgICByZWFkPENIQU5ORUxTPihpbXB1bHNlLCBwaGFzZUZyYWN0aW9uLCBpbiwgaW5wdXRJbmRleCk7CisgICAgICAgICAgICAgICAgaW5wdXRJbmRleCsrOworICAgICAgICAgICAgICAgIGlmIChpbnB1dEluZGV4ID49IGZyYW1lQ291bnQpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gMCBmcmFtZSBhdmFpbGFibGUsIDEgZnJhbWUgbmVlZGVkCisgICAgICAgICAgICAgICAgLy8gcmVhZCBzZWNvbmQgZnJhbWUKKyAgICAgICAgICAgICAgICByZWFkPENIQU5ORUxTPihpbXB1bHNlLCBwaGFzZUZyYWN0aW9uLCBpbiwgaW5wdXRJbmRleCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBpZiBkb25lIHdpdGggYnVmZmVyLCBzYXZlIHNhbXBsZXMKQEAgLTIzOSw4MCArMjY4LDg5IEBACiAgICAgICAgIH0KICAgICB9CiAKK3Jlc2FtcGxlX2V4aXQ6CiAgICAgbUltcHVsc2UgPSBpbXB1bHNlOwogICAgIG1JbnB1dEluZGV4ID0gaW5wdXRJbmRleDsKICAgICBtUGhhc2VGcmFjdGlvbiA9IHBoYXNlRnJhY3Rpb247CiB9CiAKIHRlbXBsYXRlPGludCBDSEFOTkVMUz4KKy8qKioKKyogcmVhZCgpCisqCisqIFRoaXMgZnVuY3Rpb24gcmVhZHMgb25seSBvbmUgZnJhbWUgZnJvbSBpbnB1dCBidWZmZXIgYW5kIHdyaXRlcyBpdCBpbgorKiBzdGF0ZSBidWZmZXIKKyoKKyoqLwogdm9pZCBBdWRpb1Jlc2FtcGxlclNpbmM6OnJlYWQoCi0JCWludDE2X3QqJiBpbXB1bHNlLCB1aW50MzJfdCYgcGhhc2VGcmFjdGlvbiwKLQkJaW50MTZfdCBjb25zdCogaW4sIHNpemVfdCBpbnB1dEluZGV4KQorICAgICAgICBpbnQxNl90KiYgaW1wdWxzZSwgdWludDMyX3QmIHBoYXNlRnJhY3Rpb24sCisgICAgICAgIGludDE2X3QgY29uc3QqIGluLCBzaXplX3QgaW5wdXRJbmRleCkKIHsKLQkvLyByZWFkIG5ldyBzYW1wbGVzIGludG8gdGhlIHJpbmcgYnVmZmVyCi0Jd2hpbGUgKHBoYXNlRnJhY3Rpb24gPj4ga051bVBoYXNlQml0cykgewotCQljb25zdCB1aW50MzJfdCBwaGFzZUluZGV4ID0gcGhhc2VGcmFjdGlvbiA+PiBrTnVtUGhhc2VCaXRzOwotCQlpbXB1bHNlICs9IENIQU5ORUxTOwotCQlwaGFzZUZyYWN0aW9uIC09IDFMVTw8a051bVBoYXNlQml0czsKLQkJaWYgKGltcHVsc2UgPj0gbVJpbmdGdWxsKSB7Ci0JCQljb25zdCBzaXplX3Qgc3RhdGVTaXplID0gKGhhbGZOdW1Db2VmcyoyKSpDSEFOTkVMUzsKLQkJCW1lbWNweShtU3RhdGUsIG1TdGF0ZStzdGF0ZVNpemUsIHNpemVvZihpbnQxNl90KSpzdGF0ZVNpemUpOwotCQkJaW1wdWxzZSAtPSBzdGF0ZVNpemU7Ci0JCX0KLQkJaW50MTZfdCogaGVhZCA9IGltcHVsc2UgKyBoYWxmTnVtQ29lZnMqQ0hBTk5FTFM7Ci0JCWhlYWRbMF0gPSBpbltpbnB1dEluZGV4KkNIQU5ORUxTICsgMF07Ci0JCWlmIChDSEFOTkVMUyA9PSAyKQotCQkJaGVhZFsxXSA9IGluW2lucHV0SW5kZXgqQ0hBTk5FTFMgKyAxXTsKLQl9CisgICAgY29uc3QgdWludDMyX3QgcGhhc2VJbmRleCA9IHBoYXNlRnJhY3Rpb24gPj4ga051bVBoYXNlQml0czsKKyAgICBpbXB1bHNlICs9IENIQU5ORUxTOworICAgIHBoYXNlRnJhY3Rpb24gLT0gMUxVPDxrTnVtUGhhc2VCaXRzOworICAgIGlmIChpbXB1bHNlID49IG1SaW5nRnVsbCkgeworICAgICAgICBjb25zdCBzaXplX3Qgc3RhdGVTaXplID0gKGhhbGZOdW1Db2VmcyoyKSpDSEFOTkVMUzsKKyAgICAgICAgbWVtY3B5KG1TdGF0ZSwgbVN0YXRlK3N0YXRlU2l6ZSwgc2l6ZW9mKGludDE2X3QpKnN0YXRlU2l6ZSk7CisgICAgICAgIGltcHVsc2UgLT0gc3RhdGVTaXplOworICAgIH0KKyAgICBpbnQxNl90KiBoZWFkID0gaW1wdWxzZSArIGhhbGZOdW1Db2VmcypDSEFOTkVMUzsKKyAgICBoZWFkWzBdID0gaW5baW5wdXRJbmRleCpDSEFOTkVMUyArIDBdOworICAgIGlmIChDSEFOTkVMUyA9PSAyKQorICAgICAgICBoZWFkWzFdID0gaW5baW5wdXRJbmRleCpDSEFOTkVMUyArIDFdOwogfQogCiB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+CiB2b2lkIEF1ZGlvUmVzYW1wbGVyU2luYzo6ZmlsdGVyQ29lZmZpY2llbnQoCi0JCWludDMyX3QmIGwsIGludDMyX3QmIHIsIHVpbnQzMl90IHBoYXNlLCBpbnQxNl90IGNvbnN0ICpzYW1wbGVzKQotewkKLQkvLyBjb21wdXRlIHRoZSBpbmRleCBvZiB0aGUgY29lZmZpY2llbnQgb24gdGhlIHBvc2l0aXZlIHNpZGUgYW5kCi0JLy8gbmVnYXRpdmUgc2lkZQotCXVpbnQzMl90IGluZGV4UCA9IChwaGFzZSAmIGNNYXNrKSA+PiBjU2hpZnQ7Ci0JdWludDE2X3QgbGVycFAgID0gKHBoYXNlICYgcE1hc2spID4+IHBTaGlmdDsKLQl1aW50MzJfdCBpbmRleE4gPSAoLXBoYXNlICYgY01hc2spID4+IGNTaGlmdDsKLQl1aW50MTZfdCBsZXJwTiAgPSAoLXBoYXNlICYgcE1hc2spID4+IHBTaGlmdDsKLQkKLQlsID0gMDsKLQlyID0gMDsKLQlpbnQzMl90IGNvbnN0KiBjb2VmcyA9IG1GaXJDb2VmczsKLQlpbnQxNl90IGNvbnN0ICpzUCA9IHNhbXBsZXM7Ci0JaW50MTZfdCBjb25zdCAqc04gPSBzYW1wbGVzK0NIQU5ORUxTOwotCWZvciAodW5zaWduZWQgaW50IGk9MCA7IGk8aGFsZk51bUNvZWZzLzQgOyBpKyspIHsKLQkJaW50ZXJwb2xhdGU8Q0hBTk5FTFM+KGwsIHIsIGNvZWZzK2luZGV4UCwgbGVycFAsIHNQKTsKLQkJaW50ZXJwb2xhdGU8Q0hBTk5FTFM+KGwsIHIsIGNvZWZzK2luZGV4TiwgbGVycE4sIHNOKTsKLQkJc1AgLT0gQ0hBTk5FTFM7IHNOICs9IENIQU5ORUxTOyBjb2VmcyArPSAxPDxjb2Vmc0JpdHM7CisgICAgICAgIGludDMyX3QmIGwsIGludDMyX3QmIHIsIHVpbnQzMl90IHBoYXNlLCBpbnQxNl90IGNvbnN0ICpzYW1wbGVzKQoreworICAgIC8vIGNvbXB1dGUgdGhlIGluZGV4IG9mIHRoZSBjb2VmZmljaWVudCBvbiB0aGUgcG9zaXRpdmUgc2lkZSBhbmQKKyAgICAvLyBuZWdhdGl2ZSBzaWRlCisgICAgdWludDMyX3QgaW5kZXhQID0gKHBoYXNlICYgY01hc2spID4+IGNTaGlmdDsKKyAgICB1aW50MTZfdCBsZXJwUCAgPSAocGhhc2UgJiBwTWFzaykgPj4gcFNoaWZ0OworICAgIHVpbnQzMl90IGluZGV4TiA9ICgtcGhhc2UgJiBjTWFzaykgPj4gY1NoaWZ0OworICAgIHVpbnQxNl90IGxlcnBOICA9ICgtcGhhc2UgJiBwTWFzaykgPj4gcFNoaWZ0OworICAgIGlmICgoaW5kZXhQID09IDApICYmIChsZXJwUCA9PSAwKSkgeworICAgICAgICBpbmRleE4gPSBjTWFzayA+PiBjU2hpZnQ7CisgICAgICAgIGxlcnBOID0gcE1hc2sgPj4gcFNoaWZ0OworICAgIH0KKworICAgIGwgPSAwOworICAgIHIgPSAwOworICAgIGludDMyX3QgY29uc3QqIGNvZWZzID0gbUZpckNvZWZzOworICAgIGludDE2X3QgY29uc3QgKnNQID0gc2FtcGxlczsKKyAgICBpbnQxNl90IGNvbnN0ICpzTiA9IHNhbXBsZXMrQ0hBTk5FTFM7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaT0wIDsgaTxoYWxmTnVtQ29lZnMvNCA7IGkrKykgewogICAgICAgICBpbnRlcnBvbGF0ZTxDSEFOTkVMUz4obCwgciwgY29lZnMraW5kZXhQLCBsZXJwUCwgc1ApOwogICAgICAgICBpbnRlcnBvbGF0ZTxDSEFOTkVMUz4obCwgciwgY29lZnMraW5kZXhOLCBsZXJwTiwgc04pOwotCQlzUCAtPSBDSEFOTkVMUzsgc04gKz0gQ0hBTk5FTFM7IGNvZWZzICs9IDE8PGNvZWZzQml0czsKKyAgICAgICAgc1AgLT0gQ0hBTk5FTFM7IHNOICs9IENIQU5ORUxTOyBjb2VmcyArPSAxPDxjb2Vmc0JpdHM7CiAgICAgICAgIGludGVycG9sYXRlPENIQU5ORUxTPihsLCByLCBjb2VmcytpbmRleFAsIGxlcnBQLCBzUCk7CiAgICAgICAgIGludGVycG9sYXRlPENIQU5ORUxTPihsLCByLCBjb2VmcytpbmRleE4sIGxlcnBOLCBzTik7Ci0JCXNQIC09IENIQU5ORUxTOyBzTiArPSBDSEFOTkVMUzsgY29lZnMgKz0gMTw8Y29lZnNCaXRzOworICAgICAgICBzUCAtPSBDSEFOTkVMUzsgc04gKz0gQ0hBTk5FTFM7IGNvZWZzICs9IDE8PGNvZWZzQml0czsKICAgICAgICAgaW50ZXJwb2xhdGU8Q0hBTk5FTFM+KGwsIHIsIGNvZWZzK2luZGV4UCwgbGVycFAsIHNQKTsKICAgICAgICAgaW50ZXJwb2xhdGU8Q0hBTk5FTFM+KGwsIHIsIGNvZWZzK2luZGV4TiwgbGVycE4sIHNOKTsKLQkJc1AgLT0gQ0hBTk5FTFM7IHNOICs9IENIQU5ORUxTOyBjb2VmcyArPSAxPDxjb2Vmc0JpdHM7Ci0JfQorICAgICAgICBzUCAtPSBDSEFOTkVMUzsgc04gKz0gQ0hBTk5FTFM7IGNvZWZzICs9IDE8PGNvZWZzQml0czsKKyAgICAgICAgaW50ZXJwb2xhdGU8Q0hBTk5FTFM+KGwsIHIsIGNvZWZzK2luZGV4UCwgbGVycFAsIHNQKTsKKyAgICAgICAgaW50ZXJwb2xhdGU8Q0hBTk5FTFM+KGwsIHIsIGNvZWZzK2luZGV4TiwgbGVycE4sIHNOKTsKKyAgICAgICAgc1AgLT0gQ0hBTk5FTFM7IHNOICs9IENIQU5ORUxTOyBjb2VmcyArPSAxPDxjb2Vmc0JpdHM7CisgICAgfQogfQogCiB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+CiB2b2lkIEF1ZGlvUmVzYW1wbGVyU2luYzo6aW50ZXJwb2xhdGUoCiAgICAgICAgIGludDMyX3QmIGwsIGludDMyX3QmIHIsCi0JCWludDMyX3QgY29uc3QqIGNvZWZzLCBpbnQxNl90IGxlcnAsIGludDE2X3QgY29uc3QqIHNhbXBsZXMpCisgICAgICAgIGludDMyX3QgY29uc3QqIGNvZWZzLCBpbnQxNl90IGxlcnAsIGludDE2X3QgY29uc3QqIHNhbXBsZXMpCiB7Ci0JaW50MzJfdCBjMCA9IGNvZWZzWzBdOwotCWludDMyX3QgYzEgPSBjb2Vmc1sxXTsKLQlpbnQzMl90IHNpbmMgPSBtdWxBZGQobGVycCwgKGMxLWMwKTw8MSwgYzApOwotCWlmIChDSEFOTkVMUyA9PSAyKSB7Ci0JCXVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QgY29uc3QqPihzYW1wbGVzKTsKLQkJbCA9IG11bEFkZFJMKDEsIHJsLCBzaW5jLCBsKTsKLQkJciA9IG11bEFkZFJMKDAsIHJsLCBzaW5jLCByKTsKLQl9IGVsc2UgewotCQlyID0gbCA9IG11bEFkZChzYW1wbGVzWzBdLCBzaW5jLCBsKTsKLQl9CisgICAgaW50MzJfdCBjMCA9IGNvZWZzWzBdOworICAgIGludDMyX3QgYzEgPSBjb2Vmc1sxXTsKKyAgICBpbnQzMl90IHNpbmMgPSBtdWxBZGQobGVycCwgKGMxLWMwKTw8MSwgYzApOworICAgIGlmIChDSEFOTkVMUyA9PSAyKSB7CisgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QgY29uc3QqPihzYW1wbGVzKTsKKyAgICAgICAgbCA9IG11bEFkZFJMKDEsIHJsLCBzaW5jLCBsKTsKKyAgICAgICAgciA9IG11bEFkZFJMKDAsIHJsLCBzaW5jLCByKTsKKyAgICB9IGVsc2UgeworICAgICAgICByID0gbCA9IG11bEFkZChzYW1wbGVzWzBdLCBzaW5jLCBsKTsKKyAgICB9CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5oIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmgKaW5kZXggODliOTU3Ny4uZTZjYjkwYiAxMDA2NDQKLS0tIGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmgKKysrIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmgKQEAgLTI0LDE5ICsyNCwyMCBAQAogI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBBdWRpb1Jlc2FtcGxlclNpbmMgOiBwdWJsaWMgQXVkaW9SZXNhbXBsZXIgewogcHVibGljOgotCUF1ZGlvUmVzYW1wbGVyU2luYyhpbnQgYml0RGVwdGgsIGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlKTsKKyAgICBBdWRpb1Jlc2FtcGxlclNpbmMoaW50IGJpdERlcHRoLCBpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSk7CiAKLQl+QXVkaW9SZXNhbXBsZXJTaW5jKCk7Ci0JCisgICAgfkF1ZGlvUmVzYW1wbGVyU2luYygpOworCiAgICAgdmlydHVhbCB2b2lkIHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CiBwcml2YXRlOgogICAgIHZvaWQgaW5pdCgpOwotICAgIAorCiAgICAgdGVtcGxhdGU8aW50IENIQU5ORUxTPgogICAgIHZvaWQgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKQEAgLTUyLDEyICs1MywxMiBAQAogCiAgICAgdGVtcGxhdGU8aW50IENIQU5ORUxTPgogICAgIGlubGluZSB2b2lkIHJlYWQoaW50MTZfdComIGltcHVsc2UsIHVpbnQzMl90JiBwaGFzZUZyYWN0aW9uLAotICAgIAkJaW50MTZfdCBjb25zdCogaW4sIHNpemVfdCBpbnB1dEluZGV4KTsKKyAgICAgICAgICAgIGludDE2X3QgY29uc3QqIGluLCBzaXplX3QgaW5wdXRJbmRleCk7CiAKICAgICBpbnQxNl90ICptU3RhdGU7CiAgICAgaW50MTZfdCAqbUltcHVsc2U7CiAgICAgaW50MTZfdCAqbVJpbmdGdWxsOwotICAgIAorCiAgICAgaW50MzJfdCBjb25zdCAqIG1GaXJDb2VmczsKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBtRmlyQ29lZnNEb3duW107CiAgICAgc3RhdGljIGNvbnN0IGludDMyX3QgbUZpckNvZWZzVXBbXTsKQEAgLTY3LDE1ICs2OCwxNSBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9MRVJQX0lOVF9CSVRTICA9IDQ7CiAKICAgICAvLyB3ZSBoYXZlIDE2IGNvZWZzIHNhbXBsZXMgcGVyIHplcm8tY3Jvc3NpbmcKLSAgICBzdGF0aWMgY29uc3QgaW50IGNvZWZzQml0cyA9IFJFU0FNUExFX0ZJUl9MRVJQX0lOVF9CSVRTOwotICAgIHN0YXRpYyBjb25zdCBpbnQgY1NoaWZ0ID0ga051bVBoYXNlQml0cyAtIGNvZWZzQml0czsKLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgY01hc2sgID0gKCgxPDxjb2Vmc0JpdHMpLTEpIDw8IGNTaGlmdDsKKyAgICBzdGF0aWMgY29uc3QgaW50IGNvZWZzQml0cyA9IFJFU0FNUExFX0ZJUl9MRVJQX0lOVF9CSVRTOyAgICAgICAgLy8gNAorICAgIHN0YXRpYyBjb25zdCBpbnQgY1NoaWZ0ID0ga051bVBoYXNlQml0cyAtIGNvZWZzQml0czsgICAgICAgICAgICAvLyAyNgorICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBjTWFzayAgPSAoKDE8PGNvZWZzQml0cyktMSkgPDwgY1NoaWZ0OyAgICAvLyAweGY8PDI2ID0gM2MwMCAwMDAwCiAKICAgICAvLyBhbmQgd2UgdXNlIDE1IGJpdHMgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiB0aGVzZSBzYW1wbGVzCiAgICAgLy8gdGhpcyBjYW5ub3QgY2hhbmdlIGJlY2F1c2UgdGhlIG11bCBiZWxvdyByZWx5IG9uIGl0LgogICAgIHN0YXRpYyBjb25zdCBpbnQgcExlcnBCaXRzID0gMTU7Ci0gICAgc3RhdGljIGNvbnN0IGludCBwU2hpZnQgPSBrTnVtUGhhc2VCaXRzIC0gY29lZnNCaXRzIC0gcExlcnBCaXRzOwotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBwTWFzayAgPSAoKDE8PHBMZXJwQml0cyktMSkgPDwgcFNoaWZ0OworICAgIHN0YXRpYyBjb25zdCBpbnQgcFNoaWZ0ID0ga051bVBoYXNlQml0cyAtIGNvZWZzQml0cyAtIHBMZXJwQml0czsgICAgLy8gMTEKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgcE1hc2sgID0gKCgxPDxwTGVycEJpdHMpLTEpIDw8IHBTaGlmdDsgICAgLy8gMHg3ZmZmIDw8IDExCiAKICAgICAvLyBudW1iZXIgb2YgemVyby1jcm9zc2luZyBvbiBlYWNoIHNpZGUKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGhhbGZOdW1Db2VmcyA9IFJFU0FNUExFX0ZJUl9OVU1fQ09FRjsKZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvQW5kcm9pZC5tayBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvQW5kcm9pZC5tawppbmRleCA3NzQxNDU2Li5kMTRjZWJmIDEwMDY0NAotLS0gYS9saWJzL3N1cmZhY2VmbGluZ2VyL0FuZHJvaWQubWsKKysrIGIvbGlicy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rCkBAIC0zMSw2ICszMSw3IEBACiBlbmRpZgogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJoYXJkd2FyZSBcCiAJbGlidXRpbHMgXAogCWxpYmN1dGlscyBcCiAJbGlidWkgXApkaWZmIC0tZ2l0IGEvbGlicy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmNwcCBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5jcHAKaW5kZXggNWRkOTQ0Ni4uY2Q3MjE3OSAxMDA2NDQKLS0tIGEvbGlicy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmNwcAorKysgYi9saWJzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CiAKICNpbmNsdWRlIDxHTEVTL2VnbC5oPgogCkBAIC0yNyw3ICsyOCw5IEBACiAjaW5jbHVkZSA8dWkvRUdMRGlzcGxheVN1cmZhY2UuaD4KIAogI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCIKLSNpbmNsdWRlICJ1aS9CbGl0SGFyZHdhcmUuaCIKKworI2luY2x1ZGUgPGhhcmR3YXJlL2NvcHliaXQuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9vdmVybGF5Lmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCkBAIC05MSwxOSArOTQsMTMgQEAKICAgICBmaW5pKCk7CiB9CiAKLWZsb2F0IERpc3BsYXlIYXJkd2FyZTo6Z2V0RHBpWCgpIGNvbnN0ICAgICAgICAgICB7IHJldHVybiBtRHBpWDsgfQotZmxvYXQgRGlzcGxheUhhcmR3YXJlOjpnZXREcGlZKCkgY29uc3QgICAgICAgICAgIHsgcmV0dXJuIG1EcGlZOyB9Ci1mbG9hdCBEaXNwbGF5SGFyZHdhcmU6OmdldFJlZnJlc2hSYXRlKCkgY29uc3QgICAgeyByZXR1cm4gbVJlZnJlc2hSYXRlOyB9Ci0KLWludCBEaXNwbGF5SGFyZHdhcmU6OmdldFdpZHRoKCkgY29uc3QgewotICAgIHJldHVybiBtV2lkdGg7Ci19Ci1pbnQgRGlzcGxheUhhcmR3YXJlOjpnZXRIZWlnaHQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1IZWlnaHQ7Ci19Ci1QaXhlbEZvcm1hdCBEaXNwbGF5SGFyZHdhcmU6OmdldEZvcm1hdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUZvcm1hdDsKLX0KK2Zsb2F0IERpc3BsYXlIYXJkd2FyZTo6Z2V0RHBpWCgpIGNvbnN0ICAgICAgICAgIHsgcmV0dXJuIG1EcGlYOyB9CitmbG9hdCBEaXNwbGF5SGFyZHdhcmU6OmdldERwaVkoKSBjb25zdCAgICAgICAgICB7IHJldHVybiBtRHBpWTsgfQorZmxvYXQgRGlzcGxheUhhcmR3YXJlOjpnZXREZW5zaXR5KCkgY29uc3QgICAgICAgeyByZXR1cm4gbURlbnNpdHk7IH0KK2Zsb2F0IERpc3BsYXlIYXJkd2FyZTo6Z2V0UmVmcmVzaFJhdGUoKSBjb25zdCAgIHsgcmV0dXJuIG1SZWZyZXNoUmF0ZTsgfQoraW50IERpc3BsYXlIYXJkd2FyZTo6Z2V0V2lkdGgoKSBjb25zdCAgICAgICAgICAgeyByZXR1cm4gbVdpZHRoOyB9CitpbnQgRGlzcGxheUhhcmR3YXJlOjpnZXRIZWlnaHQoKSBjb25zdCAgICAgICAgICB7IHJldHVybiBtSGVpZ2h0OyB9CitQaXhlbEZvcm1hdCBEaXNwbGF5SGFyZHdhcmU6OmdldEZvcm1hdCgpIGNvbnN0ICB7IHJldHVybiBtRm9ybWF0OyB9CiAKIHZvaWQgRGlzcGxheUhhcmR3YXJlOjppbml0KHVpbnQzMl90IGRweSkKIHsKQEAgLTE5NSw2ICsxOTIsMTIgQEAKICAgICAgICAgbURwaVkgPSAyNS40ZiAqIGZsb2F0KHZhbHVlKS9FR0xfRElTUExBWV9TQ0FMSU5HOwogICAgIH0KICAgICBtUmVmcmVzaFJhdGUgPSA2MC5mOyAgICAvLyBUT0RPOiBnZXQgdGhlIHJlYWwgcmVmcmVzaCByYXRlIAorICAgIAorICAgIC8vIGNvbXB1dGUgYSAiZGVuc2l0eSIgYXV0b21hdGljYWxseSBhcyBhIHNjYWxlIGZhY3RvciBmcm9tIDE2MCBkcGkKKyAgICAvLyBUT0RPOiB0aGlzIHZhbHVlIHNob3VsZCBiZSBjYWxjdWxhdGVkIGEgY29tcGlsZSB0aW1lIGJhc2VkIG9uIHRoZQorICAgIC8vIGJvYXJkLgorICAgIG1EZW5zaXR5ID0gZmxvb3JmKChtRHBpWD5tRHBpWSA/IG1EcGlYIDogbURwaVkpKjAuMWYgKyAwLjVmKSAqICgxMC4wZi8xNjAuMGYpOworICAgIExPR0koImRlbnNpdHkgPSAlZiIsIG1EZW5zaXR5KTsKIAogICAgIC8qCiAgICAgICogQ3JlYXRlIG91ciBPcGVuR0wgRVMgY29udGV4dApAQCAtMjM3LDggKzI0MCwxOCBAQAogICAgIG1TdXJmYWNlID0gc3VyZmFjZTsKICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgbUZvcm1hdCAgPSBHR0xfUElYRUxfRk9STUFUX1JHQl81NjU7CisgICAgCisgICAgaHdfbW9kdWxlX3QgY29uc3QqIG1vZHVsZTsKIAotICAgIG1CbGl0RW5naW5lID0gY29weWJpdF9pbml0KCk7CisgICAgbUJsaXRFbmdpbmUgPSBOVUxMOworICAgIGlmIChod19nZXRfbW9kdWxlKENPUFlCSVRfSEFSRFdBUkVfTU9EVUxFX0lELCAmbW9kdWxlKSA9PSAwKSB7CisgICAgICAgIGNvcHliaXRfb3Blbihtb2R1bGUsICZtQmxpdEVuZ2luZSk7CisgICAgfQorCisgICAgbU92ZXJsYXlFbmdpbmUgPSBOVUxMOworICAgIGlmIChod19nZXRfbW9kdWxlKE9WRVJMQVlfSEFSRFdBUkVfTU9EVUxFX0lELCAmbW9kdWxlKSA9PSAwKSB7CisgICAgICAgIG92ZXJsYXlfb3Blbihtb2R1bGUsICZtT3ZlcmxheUVuZ2luZSk7CisgICAgfQogfQogCiAvKgpAQCAtMjUyLDcgKzI2NSw4IEBACiB7CiAgICAgZWdsTWFrZUN1cnJlbnQobURpc3BsYXksIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX0NPTlRFWFQpOwogICAgIGVnbFRlcm1pbmF0ZShtRGlzcGxheSk7Ci0gICAgY29weWJpdF90ZXJtKG1CbGl0RW5naW5lKTsKKyAgICBjb3B5Yml0X2Nsb3NlKG1CbGl0RW5naW5lKTsKKyAgICBvdmVybGF5X2Nsb3NlKG1PdmVybGF5RW5naW5lKTsKIH0KIAogdm9pZCBEaXNwbGF5SGFyZHdhcmU6OnJlbGVhc2VTY3JlZW4oKSBjb25zdApkaWZmIC0tZ2l0IGEvbGlicy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmggYi9saWJzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaAppbmRleCAyOTllMjM2Li5kZTRhMmNjIDEwMDY0NAotLS0gYS9saWJzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaAorKysgYi9saWJzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaApAQCAtMjYsNiArMjYsOCBAQAogCiAjaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZUJhc2UuaCIKIAorc3RydWN0IG92ZXJsYXlfZGV2aWNlX3Q7CitzdHJ1Y3QgY29weWJpdF9kZXZpY2VfdDsKIHN0cnVjdCBjb3B5Yml0X2ltYWdlX3Q7CiBzdHJ1Y3QgY29weWJpdF90OwogCkBAIC02NCw2ICs2Niw3IEBACiAgICAgZmxvYXQgICAgICAgZ2V0RHBpWCgpIGNvbnN0OwogICAgIGZsb2F0ICAgICAgIGdldERwaVkoKSBjb25zdDsKICAgICBmbG9hdCAgICAgICBnZXRSZWZyZXNoUmF0ZSgpIGNvbnN0OworICAgIGZsb2F0ICAgICAgIGdldERlbnNpdHkoKSBjb25zdDsKICAgICBpbnQgICAgICAgICBnZXRXaWR0aCgpIGNvbnN0OwogICAgIGludCAgICAgICAgIGdldEhlaWdodCgpIGNvbnN0OwogICAgIFBpeGVsRm9ybWF0IGdldEZvcm1hdCgpIGNvbnN0OwpAQCAtNzQsNyArNzcsOCBAQAogICAgIHZvaWQgZ2V0RGlzcGxheVN1cmZhY2UoY29weWJpdF9pbWFnZV90KiBpbWcpIGNvbnN0OwogICAgIHZvaWQgZ2V0RGlzcGxheVN1cmZhY2UoR0dMU3VyZmFjZSogZmIpIGNvbnN0OwogICAgIEVHTERpc3BsYXkgZ2V0RUdMRGlzcGxheSgpIGNvbnN0IHsgcmV0dXJuIG1EaXNwbGF5OyB9Ci0gICAgY29weWJpdF90KiBnZXRCbGl0RW5naW5lKCkgY29uc3QgeyByZXR1cm4gbUJsaXRFbmdpbmU7IH0KKyAgICBjb3B5Yml0X2RldmljZV90KiBnZXRCbGl0RW5naW5lKCkgY29uc3QgeyByZXR1cm4gbUJsaXRFbmdpbmU7IH0KKyAgICBvdmVybGF5X2RldmljZV90KiBnZXRPdmVybGF5RW5naW5lKCkgY29uc3QgeyByZXR1cm4gbU92ZXJsYXlFbmdpbmU7IH0KICAgICAKICAgICBSZWN0IGJvdW5kcygpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIFJlY3QobVdpZHRoLCBtSGVpZ2h0KTsKQEAgLTkxLDEzICs5NSwxNSBAQAogICAgIGZsb2F0ICAgICAgICAgICBtRHBpWDsKICAgICBmbG9hdCAgICAgICAgICAgbURwaVk7CiAgICAgZmxvYXQgICAgICAgICAgIG1SZWZyZXNoUmF0ZTsKKyAgICBmbG9hdCAgICAgICAgICAgbURlbnNpdHk7CiAgICAgaW50ICAgICAgICAgICAgIG1XaWR0aDsKICAgICBpbnQgICAgICAgICAgICAgbUhlaWdodDsKICAgICBQaXhlbEZvcm1hdCAgICAgbUZvcm1hdDsKICAgICB1aW50MzJfdCAgICAgICAgbUZsYWdzOwogICAgIG11dGFibGUgUmVnaW9uICBtRGlydHk7CiAgICAgc3A8RUdMRGlzcGxheVN1cmZhY2U+IG1EaXNwbGF5U3VyZmFjZTsKLSAgICBjb3B5Yml0X3QqICAgICAgbUJsaXRFbmdpbmU7CisgICAgY29weWJpdF9kZXZpY2VfdCogICAgIG1CbGl0RW5naW5lOworICAgIG92ZXJsYXlfZGV2aWNlX3QqICAgICBtT3ZlcmxheUVuZ2luZTsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmVCYXNlLmNwcCBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZUJhc2UuY3BwCmluZGV4IDkwZjYyODcuLmY3NWU1YzIgMTAwNjQ0Ci0tLSBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZUJhc2UuY3BwCisrKyBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZUJhc2UuY3BwCkBAIC00OSw4ICs0OSwxMCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGtTbGVlcEZpbGVOYW1lID0gIi9zeXMvYW5kcm9pZF9wb3dlci93YWl0X2Zvcl9mYl9zbGVlcCI7Ci1zdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGtXYWtlRmlsZU5hbWUgPSAiL3N5cy9hbmRyb2lkX3Bvd2VyL3dhaXRfZm9yX2ZiX3dha2UiOworc3RhdGljIGNoYXIgY29uc3QgKiBrU2xlZXBGaWxlTmFtZSA9ICIvc3lzL3Bvd2VyL3dhaXRfZm9yX2ZiX3NsZWVwIjsKK3N0YXRpYyBjaGFyIGNvbnN0ICoga1dha2VGaWxlTmFtZSA9ICIvc3lzL3Bvd2VyL3dhaXRfZm9yX2ZiX3dha2UiOworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBrT2xkU2xlZXBGaWxlTmFtZSA9ICIvc3lzL2FuZHJvaWRfcG93ZXIvd2FpdF9mb3JfZmJfc2xlZXAiOworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBrT2xkV2FrZUZpbGVOYW1lID0gIi9zeXMvYW5kcm9pZF9wb3dlci93YWl0X2Zvcl9mYl93YWtlIjsKIAogLy8gVGhpcyBkaXIgZXhpc3RzIGlmIHRoZSBmcmFtZWJ1ZmZlciBjb25zb2xlIGlzIHByZXNlbnQsIGVpdGhlciBidWlsdCBpbnRvCiAvLyB0aGUga2VybmVsIG9yIGxvYWRlZCBhcyBhIG1vZHVsZS4KQEAgLTEyMywxNiArMTI1LDIyIEBACiBzdGF0dXNfdCBEaXNwbGF5SGFyZHdhcmVCYXNlOjpEaXNwbGF5RXZlbnRUaHJlYWQ6OnJlYWR5VG9SdW4oKQogewogICAgIGlmIChhY2Nlc3Moa1NsZWVwRmlsZU5hbWUsIFJfT0spIHx8IGFjY2VzcyhrV2FrZUZpbGVOYW1lLCBSX09LKSkgewotICAgICAgICBMT0dFKCJDb3VsZG4ndCBvcGVuICVzIG9yICVzIiwga1NsZWVwRmlsZU5hbWUsIGtXYWtlRmlsZU5hbWUpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgaWYgKGFjY2VzcyhrT2xkU2xlZXBGaWxlTmFtZSwgUl9PSykgfHwgYWNjZXNzKGtPbGRXYWtlRmlsZU5hbWUsIFJfT0spKSB7CisgICAgICAgICAgICBMT0dFKCJDb3VsZG4ndCBvcGVuICVzIG9yICVzIiwga1NsZWVwRmlsZU5hbWUsIGtXYWtlRmlsZU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICAgICAga1NsZWVwRmlsZU5hbWUgPSBrT2xkU2xlZXBGaWxlTmFtZTsKKyAgICAgICAga1dha2VGaWxlTmFtZSA9IGtPbGRXYWtlRmlsZU5hbWU7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgRGlzcGxheUhhcmR3YXJlQmFzZTo6RGlzcGxheUV2ZW50VGhyZWFkOjppbml0Q2hlY2soKSBjb25zdAogewotICAgIHJldHVybiAoYWNjZXNzKGtTbGVlcEZpbGVOYW1lLCBSX09LKSA9PSAwICYmCi0gICAgICAgICAgICBhY2Nlc3Moa1dha2VGaWxlTmFtZSwgUl9PSykgPT0gMCAmJgorICAgIHJldHVybiAoKChhY2Nlc3Moa1NsZWVwRmlsZU5hbWUsIFJfT0spID09IDAgJiYKKyAgICAgICAgICAgIGFjY2VzcyhrV2FrZUZpbGVOYW1lLCBSX09LKSA9PSAwKSB8fAorICAgICAgICAgICAgKGFjY2VzcyhrT2xkU2xlZXBGaWxlTmFtZSwgUl9PSykgPT0gMCAmJgorICAgICAgICAgICAgYWNjZXNzKGtPbGRXYWtlRmlsZU5hbWUsIFJfT0spID09IDApKSAmJgogICAgICAgICAgICAgYWNjZXNzKGtGYmNvblN5c0RpciwgRl9PSykgIT0gMCkgPyBOT19FUlJPUiA6IE5PX0lOSVQ7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvR1BVSGFyZHdhcmUvR1BVSGFyZHdhcmUuY3BwIGIvbGlicy9zdXJmYWNlZmxpbmdlci9HUFVIYXJkd2FyZS9HUFVIYXJkd2FyZS5jcHAKaW5kZXggYjI0YTBmMi4uZWI3NWY5OSAxMDA2NDQKLS0tIGEvbGlicy9zdXJmYWNlZmxpbmdlci9HUFVIYXJkd2FyZS9HUFVIYXJkd2FyZS5jcHAKKysrIGIvbGlicy9zdXJmYWNlZmxpbmdlci9HUFVIYXJkd2FyZS9HUFVIYXJkd2FyZS5jcHAKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAorI2luY2x1ZGUgPHV0aWxzL0lCaW5kZXIuaD4KICNpbmNsdWRlIDx1dGlscy9NZW1vcnlEZWFsZXIuaD4KICNpbmNsdWRlIDx1dGlscy9NZW1vcnlCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTWVtb3J5SGVhcFBtZW0uaD4KQEAgLTQ4LDM2ICs0OSwxMTMgQEAKIAogI2luY2x1ZGUgIkdQVUhhcmR3YXJlL0dQVUhhcmR3YXJlLmgiCiAKKwogLyogCi0gKiBUaGlzIGZpbGUgbWFuYWdlcyB0aGUgR1BVIGlmIHRoZXJlIGlzIG9uZS4gVGhlIGludGVudCBpcyB0aGF0IHRoaXMgY29kZQotICogbmVlZHMgdG8gYmUgZGlmZmVyZW50IGZvciBldmVyeSBkZXZjZS4gQ3VycmVudGx5IHRoZXJlIGlzIG5vIGFic3RyYWN0aW9uLAotICogYnV0IGluIHRoZSBsb25nIHRlcm0sIHRoaXMgY29kZSBuZWVkcyB0byBiZSByZWZhY3RvcmVkIHNvIHRoYXQgQVBJIGFuZAotICogaW1wbGVtZW50YXRpb24gYXJlIHNlcGFyYXRlZC4KKyAqIE1hbmFnZSB0aGUgR1BVLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgc3BlY2lmaWMgdG8gdGhlIEcxLgorICogVGhlcmUgYXJlIG5vIGFic3RyYWN0aW9uIGhlcmUuIAogICogCi0gKiBJbiB0aGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24sIHRoZSBHUFUsIGl0cyBtZW1vcnkgYW5kIHJlZ2lzdGVyIGFyZQotICogbWFuYWdlZCBoZXJlLiBDbGllbnRzIChzdWNoIGFzIE9wZW5HTCBFUykgcmVxdWVzdCB0aGUgR1BVIHdoZW4gdGhlbiBuZWVkCi0gKiBpdCBhbmQgYXJlIGdpdmVuIGEgcmV2b2thYmxlIGhlYXAgY29udGFpbmluZyB0aGUgcmVnaXN0ZXJzIG9uIG1lbW9yeS4gCisgKiBBbGwgdGhpcyBjb2RlIHdpbGwgc29vbiBnby1hd2F5IGFuZCBiZSByZXBsYWNlZCBieSBhIG5ldyBhcmNoaXRlY3R1cmUKKyAqIGZvciBtYW5hZ2luZyBncmFwaGljcyBhY2NlbGVyYXRvcnMuCisgKiAKKyAqIEluIHRoZSBtZWFudGltZSwgaXQgaXMgY29uY2VwdHVhbGx5IHBvc3NpYmxlIHRvIGluc3RhbnRpYXRlIGEKKyAqIEdQVUhhcmR3YXJlSW50ZXJmYWNlIGZvciBhbm90aGVyIEdQVSAoc2VlIEdQVUZhY3RvcnkgYXQgdGhlIGJvdHRvbQorICogb2YgdGhpcyBmaWxlKTsgcHJhY3RpY2FsbHkuLi4gZG91YnRmdWwuCiAgKiAKICAqLwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitjbGFzcyBHUFVDbGllbnRIZWFwOworY2xhc3MgR1BVQXJlYUhlYXA7CisKK2NsYXNzIEdQVUhhcmR3YXJlIDogcHVibGljIEdQVUhhcmR3YXJlSW50ZXJmYWNlLCBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgaW50IEdQVV9SRVNFUlZFRF9TSVpFOworICAgIHN0YXRpYyBjb25zdCBpbnQgR1BVUl9TSVpFOworCisgICAgICAgICAgICBHUFVIYXJkd2FyZSgpOworICAgIHZpcnR1YWwgfkdQVUhhcmR3YXJlKCk7CisgICAgCisgICAgdmlydHVhbCB2b2lkIHJldm9rZShpbnQgcGlkKTsKKyAgICB2aXJ0dWFsIHNwPE1lbW9yeURlYWxlcj4gcmVxdWVzdChpbnQgcGlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlcXVlc3QoaW50IHBpZCwgCisgICAgICAgICAgICBjb25zdCBzcDxJR1BVQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmdwdV9pbmZvX3QqIGdwdSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZyaWVuZGx5UmV2b2tlKCk7CisgICAgdmlydHVhbCB2b2lkIHVuY29uZGl0aW9uYWxSZXZva2UoKTsKKyAgICAKKyAgICB2aXJ0dWFsIHBpZF90IGdldE93bmVyKCkgY29uc3QgeyByZXR1cm4gbU93bmVyOyB9CisKKyAgICAvLyB1c2VkIGZvciBkZWJ1Z2dpbmcgb25seS4uLgorICAgIHZpcnR1YWwgc3A8U2ltcGxlQmVzdEZpdEFsbG9jYXRvcj4gZ2V0QWxsb2NhdG9yKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgCisgICAgCisgICAgZW51bSB7CisgICAgICAgIE5PX09XTkVSID0gLTEsCisgICAgfTsKKyAgICAgICAgCisgICAgc3RydWN0IEdQVUFyZWEgeworICAgICAgICBzcDxHUFVBcmVhSGVhcD4gICAgIGhlYXA7CisgICAgICAgIHNwPE1lbW9yeUhlYXBQbWVtPiAgY2xpZW50SGVhcDsKKyAgICAgICAgc3A8SU1lbW9yeT4gbWFwKCk7CisgICAgfTsKKyAgICAKKyAgICBzdHJ1Y3QgQ2xpZW50IHsKKyAgICAgICAgcGlkX3QgICAgICAgcGlkOworICAgICAgICBHUFVBcmVhICAgICBzbWk7CisgICAgICAgIEdQVUFyZWEgICAgIGViaTsKKyAgICAgICAgR1BVQXJlYSAgICAgcmVnOworICAgICAgICB2b2lkIGNyZWF0ZUNsaWVudEhlYXBzKCk7CisgICAgICAgIHZvaWQgcmV2b2tlQWxsSGVhcHMoKTsKKyAgICB9OworICAgIAorICAgIENsaWVudCYgZ2V0Q2xpZW50TG9ja2VkKHBpZF90IHBpZCk7CisgICAgc3RhdHVzX3QgcmVxdWVzdExvY2tlZChpbnQgcGlkKTsKKyAgICB2b2lkIHJlbGVhc2VMb2NrZWQoKTsKKyAgICB2b2lkIHRha2VCYWNrR1BVTG9ja2VkKCk7CisgICAgdm9pZCByZWdpc3RlckNhbGxiYWNrTG9ja2VkKGNvbnN0IHNwPElHUFVDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICAgICAgQ2xpZW50JiBjbGllbnQpOworCisgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CisKKyAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICBtTG9jazsKKyAgICBzcDxHUFVBcmVhSGVhcD4gICAgICAgICBtU01JSGVhcDsKKyAgICBzcDxHUFVBcmVhSGVhcD4gICAgICAgICBtRUJJSGVhcDsKKyAgICBzcDxHUFVBcmVhSGVhcD4gICAgICAgICBtUkVHSGVhcDsKKworICAgIEtleWVkVmVjdG9yPHBpZF90LCBDbGllbnQ+IG1DbGllbnRzOworICAgIERlZmF1bHRLZXllZFZlY3Rvcjwgd3A8SUJpbmRlcj4sIHBpZF90ID4gbVJlZ2lzdGVyZWRDbGllbnRzOworICAgIAorICAgIHBpZF90ICAgICAgICAgICAgICAgICAgIG1Pd25lcjsKKworICAgIHNwPE1lbW9yeURlYWxlcj4gICAgICAgIG1DdXJyZW50QWxsb2NhdG9yOworICAgIHNwPElHUFVDYWxsYmFjaz4gICAgICAgIG1DYWxsYmFjazsKKyAgICAKKyAgICBzcDxTaW1wbGVCZXN0Rml0QWxsb2NhdG9yPiAgbUFsbG9jYXRvcjsKKworICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgIG1Db25kaXRpb247Cit9OworCiAvLyBzaXplIHJlc2VydmVkIGZvciBHUFUgc3VyZmFjZXMKIC8vIDEyMDAgS0IgZml0cyBleGFjdGx5OgogLy8gIC0gdHdvIDMyMCo0ODAgMTYtYml0cyBkb3VibGUtYnVmZmVyZWQgc3VyZmFjZXMKIC8vICAtIG9uZSAzMjAqNDgwIDMyLWJpdHMgZG91YmxlLWJ1ZmZlcmVkIHN1cmZhY2UKLS8vICAtIG9uZSAzMjAqMjQwIDE2LWJpdHMgZG91YmxlLWJ1ZmZlcmQsIDR4IGFudGktYWxpYXNlZCBzdXJmYWNlCi1zdGF0aWMgY29uc3QgaW50IEdQVV9SRVNFUlZFRF9TSVpFICA9IDEyMDAgKiAxMDI0OwotCi1zdGF0aWMgY29uc3QgaW50IEdQVVJfU0laRSAgICAgICAgICA9IDEgKiAxMDI0ICogMTAyNDsKKy8vICAtIG9uZSAzMjAqMjQwIDE2LWJpdHMgZG91YmxlLWJ1ZmZlcmVkLCA0eCBhbnRpLWFsaWFzZWQgc3VyZmFjZQorY29uc3QgaW50IEdQVUhhcmR3YXJlOjpHUFVfUkVTRVJWRURfU0laRSAgPSAxMjAwICogMTAyNDsKK2NvbnN0IGludCBHUFVIYXJkd2FyZTo6R1BVUl9TSVpFICAgICAgICAgID0gMSAqIDEwMjQgKiAxMDI0OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLyogCiAgKiBHUFVIYW5kbGUgaXMgYSBzcGVjaWFsIElNZW1vcnkgZ2l2ZW4gdG8gdGhlIGNsaWVudC4gSXQgcmVwcmVzZW50cyB0aGVpcgogICogaGFuZGxlIHRvIHRoZSBHUFUuIE9uY2UgdGhleSBnaXZlIGl0IHVwLCB0aGV5IGxvb3NlIEdQVSBhY2Nlc3MsIG9yIGlmCi0gKiB0aGV5IGV4cGxpY2l0ZWx5IHJldm9rZSB0aGVpciBhY2NlcyB0aHJvdWdoIHRoZSBiaW5kZXIgY29kZSAxMDAwLgorICogdGhleSBleHBsaWNpdGx5IHJldm9rZSB0aGVpciBhY2Nlc3MgdGhyb3VnaCB0aGUgYmluZGVyIGNvZGUgMTAwMC4KICAqIEluIGJvdGggY2FzZXMsIHRoaXMgdHJpZ2dlcnMgYSBjYWxsYmFjayB0byByZXZva2UoKQogICogZmlyc3QsIGFuZCB0aGVuIGFjdHVhbGx5IHBvd2VycyBkb3duIHRoZSBjaGlwLgogICogCkBAIC05Miw0MiArMTcwLDk5IEBACiAgKiAKICAqLwogCi1jbGFzcyBHUFVIYW5kbGUgOiBwdWJsaWMgQm5NZW1vcnkKK2NsYXNzIEdQVUNsaWVudEhlYXAgOiBwdWJsaWMgTWVtb3J5SGVhcFBtZW0KIHsKIHB1YmxpYzoKLSAgICAgICAgICAgIEdQVUhhbmRsZShjb25zdCBzcDxHUFVIYXJkd2FyZT4mIGdwdSwgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwKQotICAgICAgICAgICAgICAgIDogbUdQVShncHUpLCBtQ2xpZW50SGVhcChoZWFwKSB7Ci0gICAgICAgICAgICB9Ci0gICAgdmlydHVhbCB+R1BVSGFuZGxlKCk7Ci0gICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gZ2V0TWVtb3J5KHNzaXplX3QqIG9mZnNldCwgc2l6ZV90KiBzaXplKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3QoCi0gICAgICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKTsKLSAgICB2b2lkIHNldE93bmVyKGludCBvd25lcikgeyBtT3duZXIgPSBvd25lcjsgfQotcHJpdmF0ZToKLSAgICB2b2lkIHJldm9rZU5vdGlmaWNhdGlvbigpOworICAgIEdQVUNsaWVudEhlYXAoY29uc3Qgd3A8R1BVSGFyZHdhcmU+JiBncHUsIAorICAgICAgICAgICAgY29uc3Qgc3A8TWVtb3J5SGVhcEJhc2U+JiBoZWFwKQorICAgICAgICA6ICBNZW1vcnlIZWFwUG1lbShoZWFwKSwgbUdQVShncHUpIHsgfQorcHJvdGVjdGVkOgogICAgIHdwPEdQVUhhcmR3YXJlPiBtR1BVOwotICAgIHNwPElNZW1vcnlIZWFwPiBtQ2xpZW50SGVhcDsKLSAgICBpbnQgbU93bmVyOwogfTsKIAotR1BVSGFuZGxlOjp+R1BVSGFuZGxlKCkgeyAKK2NsYXNzIEdQVUFyZWFIZWFwIDogcHVibGljIE1lbW9yeUhlYXBCYXNlCit7CitwdWJsaWM6CisgICAgR1BVQXJlYUhlYXAoY29uc3Qgd3A8R1BVSGFyZHdhcmU+JiBncHUsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCB2cmFtLCBzaXplX3Qgc2l6ZT0wLCBzaXplX3QgcmVzZXJ2ZWQ9MCkKKyAgICA6IE1lbW9yeUhlYXBCYXNlKHZyYW0sIHNpemUpLCBtR1BVKGdwdSkgeyAKKyAgICAgICAgaWYgKGJhc2UoKSAhPSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICBpZiAocmVzZXJ2ZWQgPT0gMCkKKyAgICAgICAgICAgICAgICByZXNlcnZlZCA9IHZpcnR1YWxTaXplKCk7CisgICAgICAgICAgICBtQWxsb2NhdG9yID0gbmV3IFNpbXBsZUJlc3RGaXRBbGxvY2F0b3IocmVzZXJ2ZWQpOworICAgICAgICB9CisgICAgfQorICAgIHZpcnR1YWwgc3A8TWVtb3J5SGVhcFBtZW0+IGNyZWF0ZUNsaWVudEhlYXAoKSB7CisgICAgICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBwYXJlbnRIZWFwKHRoaXMpOworICAgICAgICByZXR1cm4gbmV3IEdQVUNsaWVudEhlYXAobUdQVSwgcGFyZW50SGVhcCk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3Qgc3A8U2ltcGxlQmVzdEZpdEFsbG9jYXRvcj4mIGdldEFsbG9jYXRvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0b3I7IAorICAgIH0KK3ByaXZhdGU6CisgICAgc3A8U2ltcGxlQmVzdEZpdEFsbG9jYXRvcj4gIG1BbGxvY2F0b3I7Citwcm90ZWN0ZWQ6CisgICAgd3A8R1BVSGFyZHdhcmU+IG1HUFU7Cit9OworCitjbGFzcyBHUFVSZWdpc3RlckhlYXAgOiBwdWJsaWMgR1BVQXJlYUhlYXAKK3sKK3B1YmxpYzoKKyAgICBHUFVSZWdpc3RlckhlYXAoY29uc3Qgc3A8R1BVSGFyZHdhcmU+JiBncHUpCisgICAgICAgIDogR1BVQXJlYUhlYXAoZ3B1LCAiL2Rldi9odzNkIiwgR1BVSGFyZHdhcmU6OkdQVVJfU0laRSkgeyB9CisgICAgdmlydHVhbCBzcDxNZW1vcnlIZWFwUG1lbT4gY3JlYXRlQ2xpZW50SGVhcCgpIHsKKyAgICAgICAgc3A8TWVtb3J5SGVhcEJhc2U+IHBhcmVudEhlYXAodGhpcyk7CisgICAgICAgIHJldHVybiBuZXcgTWVtb3J5SGVhcFJlZ3MobUdQVSwgcGFyZW50SGVhcCk7CisgICAgfQorcHJpdmF0ZToKKyAgICBjbGFzcyBNZW1vcnlIZWFwUmVncyA6IHB1YmxpYyBHUFVDbGllbnRIZWFwICB7CisgICAgcHVibGljOgorICAgICAgICBNZW1vcnlIZWFwUmVncyhjb25zdCB3cDxHUFVIYXJkd2FyZT4mIGdwdSwgCisgICAgICAgICAgICAgY29uc3Qgc3A8TWVtb3J5SGVhcEJhc2U+JiBoZWFwKQorICAgICAgICAgICAgOiBHUFVDbGllbnRIZWFwKGdwdSwgaGVhcCkgeyB9CisgICAgICAgIHNwPE1lbW9yeUhlYXBQbWVtOjpNZW1vcnlQbWVtPiBjcmVhdGVNZW1vcnkoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmV2b2tlKCk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgY2xhc3MgR1BVSGFuZGxlIDogcHVibGljIE1lbW9yeUhlYXBQbWVtOjpNZW1vcnlQbWVtIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgR1BVSGFuZGxlKGNvbnN0IHNwPEdQVUhhcmR3YXJlPiYgZ3B1LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNZW1vcnlIZWFwUG1lbT4mIGhlYXApCisgICAgICAgICAgICAgICAgOiBNZW1vcnlIZWFwUG1lbTo6TWVtb3J5UG1lbShoZWFwKSwgCisgICAgICAgICAgICAgICAgICBtR1BVKGdwdSksIG1Pd25lcihncHUtPmdldE93bmVyKCkpIHsgfQorICAgICAgICAgICAgdmlydHVhbCB+R1BVSGFuZGxlKCk7CisgICAgICAgICAgICB2aXJ0dWFsIHNwPElNZW1vcnlIZWFwPiBnZXRNZW1vcnkoCisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QqIG9mZnNldCwgc2l6ZV90KiBzaXplKSBjb25zdDsKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZXZva2UoKSB7IH07CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3QoCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgCisgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKTsKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHZvaWQgcmV2b2tlTm90aWZpY2F0aW9uKCk7CisgICAgICAgICAgICB3cDxHUFVIYXJkd2FyZT4gbUdQVTsKKyAgICAgICAgICAgIHBpZF90IG1Pd25lcjsKKyAgICAgICAgfTsKKyAgICB9OworfTsKKworR1BVUmVnaXN0ZXJIZWFwOjpNZW1vcnlIZWFwUmVnczo6R1BVSGFuZGxlOjp+R1BVSGFuZGxlKCkgeyAKICAgICAvL0xPR0QoIkdQVUhhbmRsZSAlcCByZWxlYXNlZCwgcmV2b2tpbmcgR1BVIiwgdGhpcyk7CiAgICAgcmV2b2tlTm90aWZpY2F0aW9uKCk7IAogfQotCi12b2lkIEdQVUhhbmRsZTo6cmV2b2tlTm90aWZpY2F0aW9uKCkgIHsKK3ZvaWQgR1BVUmVnaXN0ZXJIZWFwOjpNZW1vcnlIZWFwUmVnczo6R1BVSGFuZGxlOjpyZXZva2VOb3RpZmljYXRpb24oKSAgewogICAgIHNwPEdQVUhhcmR3YXJlPiBodyhtR1BVLnByb21vdGUoKSk7CiAgICAgaWYgKGh3ICE9IDApIHsKICAgICAgICAgaHctPnJldm9rZShtT3duZXIpOwogICAgIH0KIH0KLXNwPElNZW1vcnlIZWFwPiBHUFVIYW5kbGU6OmdldE1lbW9yeShzc2l6ZV90KiBvZmZzZXQsIHNpemVfdCogc2l6ZSkgY29uc3QKK3NwPElNZW1vcnlIZWFwPiBHUFVSZWdpc3RlckhlYXA6Ok1lbW9yeUhlYXBSZWdzOjpHUFVIYW5kbGU6OmdldE1lbW9yeSgKKyAgICAgICAgc3NpemVfdCogb2Zmc2V0LCBzaXplX3QqIHNpemUpIGNvbnN0CiB7CisgICAgc3A8TWVtb3J5SGVhcFBtZW0+IGhlYXAgPSBnZXRIZWFwKCk7CiAgICAgaWYgKG9mZnNldCkgKm9mZnNldCA9IDA7Ci0gICAgaWYgKHNpemUpICAgKnNpemUgPSBtQ2xpZW50SGVhcCAhPTAgPyBtQ2xpZW50SGVhcC0+dmlydHVhbFNpemUoKSA6IDA7Ci0gICAgcmV0dXJuIG1DbGllbnRIZWFwOworICAgIGlmIChzaXplKSAgICpzaXplID0gaGVhcCAhPTAgPyBoZWFwLT52aXJ0dWFsU2l6ZSgpIDogMDsKKyAgICByZXR1cm4gaGVhcDsKIH0KLXN0YXR1c190IEdQVUhhbmRsZTo6b25UcmFuc2FjdCgKK3N0YXR1c190IEdQVVJlZ2lzdGVySGVhcDo6TWVtb3J5SGVhcFJlZ3M6OkdQVUhhbmRsZTo6b25UcmFuc2FjdCgKICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKIHsKICAgICBzdGF0dXNfdCBlcnIgPSBCbk1lbW9yeTo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwpAQCAtMTUwLDIyICsyODUsMTQgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIE1lbW9yeUhlYXBSZWdzIDogcHVibGljIE1lbW9yeUhlYXBQbWVtIAotewotcHVibGljOgotICAgICAgICAgICAgTWVtb3J5SGVhcFJlZ3MoY29uc3Qgd3A8R1BVSGFyZHdhcmU+JiBncHUsIGNvbnN0IHNwPE1lbW9yeUhlYXBCYXNlPiYgaGVhcCk7Ci0gICAgdmlydHVhbCB+TWVtb3J5SGVhcFJlZ3MoKTsKLSAgICBzcDxJTWVtb3J5PiBtYXBNZW1vcnkoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotICAgIHZpcnR1YWwgdm9pZCByZXZva2UoKTsKLXByaXZhdGU6Ci0gICAgd3A8R1BVSGFyZHdhcmU+IG1HUFU7Ci19OwogCi1NZW1vcnlIZWFwUmVnczo6TWVtb3J5SGVhcFJlZ3MoY29uc3Qgd3A8R1BVSGFyZHdhcmU+JiBncHUsIGNvbnN0IHNwPE1lbW9yeUhlYXBCYXNlPiYgaGVhcCkKLSAgICA6ICBNZW1vcnlIZWFwUG1lbShoZWFwKSwgbUdQVShncHUpCitzcDxNZW1vcnlIZWFwUG1lbTo6TWVtb3J5UG1lbT4gR1BVUmVnaXN0ZXJIZWFwOjpNZW1vcnlIZWFwUmVnczo6Y3JlYXRlTWVtb3J5KAorICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKIHsKKyAgICBzcDxHUFVIYW5kbGU+IG1lbW9yeTsKKyAgICBzcDxHUFVIYXJkd2FyZT4gZ3B1ID0gbUdQVS5wcm9tb3RlKCk7CisgICAgaWYgKGhlYXBJRCgpPjAgJiYgZ3B1IT0wKSB7CiAjaWYgSEFWRV9BTkRST0lEX09TCi0gICAgaWYgKGhlYXBJRCgpPjApIHsKICAgICAgICAgLyogdGhpcyBpcyB3aGVyZSB0aGUgR1BVIGlzIHBvd2VyZWQgb24gYW5kIHRoZSByZWdpc3RlcnMgYXJlIG1hcHBlZAogICAgICAgICAgKiBpbiB0aGUgY2xpZW50ICovCiAgICAgICAgIC8vTE9HRCgiaW9jdGwoSFczRF9HUkFOVF9HUFUpIik7CkBAIC0xNzQsMjcgKzMwMSwxNiBAQAogICAgICAgICAgICAgLy8gaXQgY2FuIGhhcHBlbiBpZiB0aGUgbWFzdGVyIGhlYXAgaGFzIGJlZW4gY2xvc2VkIGFscmVhZHkKICAgICAgICAgICAgIC8vIGluIHdoaWNoIGNhc2UgdGhlIEdQVSBhbHJlYWR5IGlzIHJldm9rZWQgKGFwcCBjcmFzaCBmb3IKICAgICAgICAgICAgIC8vIGluc3RhbmNlKS4KLSAgICAgICAgICAgIC8vTE9HVygiSFczRF9HUkFOVF9HUFUgZmFpbGVkICglcyksIG1GRD0lZCwgYmFzZT0lcCIsCi0gICAgICAgICAgICAvLyAgICAgICAgc3RyZXJyb3IoZXJybm8pLCBoZWFwSUQoKSwgYmFzZSgpKTsKKyAgICAgICAgICAgIExPR1coIkhXM0RfR1JBTlRfR1BVIGZhaWxlZCAoJXMpLCBtRkQ9JWQsIGJhc2U9JXAiLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubyksIGhlYXBJRCgpLCBiYXNlKCkpOwogICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi19Ci0KLU1lbW9yeUhlYXBSZWdzOjp+TWVtb3J5SGVhcFJlZ3MoKSAKLXsKLX0KLQotc3A8SU1lbW9yeT4gTWVtb3J5SGVhcFJlZ3M6Om1hcE1lbW9yeShzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBzcDxHUFVIYW5kbGU+IG1lbW9yeTsKLSAgICBzcDxHUFVIYXJkd2FyZT4gZ3B1ID0gbUdQVS5wcm9tb3RlKCk7Ci0gICAgaWYgKGhlYXBJRCgpPjAgJiYgZ3B1IT0wKSAKICAgICAgICAgbWVtb3J5ID0gbmV3IEdQVUhhbmRsZShncHUsIHRoaXMpOworI2VuZGlmCisgICAgfQogICAgIHJldHVybiBtZW1vcnk7CiB9CiAKLXZvaWQgTWVtb3J5SGVhcFJlZ3M6OnJldm9rZSgpIAordm9pZCBHUFVSZWdpc3RlckhlYXA6Ok1lbW9yeUhlYXBSZWdzOjpyZXZva2UoKSAKIHsKICAgICBNZW1vcnlIZWFwUG1lbTo6cmV2b2tlKCk7CiAjaWYgSEFWRV9BTkRST0lEX09TCkBAIC0yMDcsMjUgKzMyMyw2IEBACiAjZW5kaWYKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEdQVVJlZ2lzdGVySGVhcCA6IHB1YmxpYyBQTWVtSGVhcEludGVyZmFjZQotewotcHVibGljOgotICAgIEdQVVJlZ2lzdGVySGVhcChjb25zdCBzcDxHUFVIYXJkd2FyZT4mIGdwdSkKLSAgICAgICAgOiBQTWVtSGVhcEludGVyZmFjZSgiL2Rldi9odzNkIiwgR1BVUl9TSVpFKSwgbUdQVShncHUpCi0gICAgewotICAgIH0KLSAgICB2aXJ0dWFsIH5HUFVSZWdpc3RlckhlYXAoKSB7Ci0gICAgfQotICAgIHZpcnR1YWwgc3A8TWVtb3J5SGVhcFBtZW0+IGNyZWF0ZUNsaWVudEhlYXAoKSB7Ci0gICAgICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBwYXJlbnRIZWFwKHRoaXMpOwotICAgICAgICByZXR1cm4gbmV3IE1lbW9yeUhlYXBSZWdzKG1HUFUsIHBhcmVudEhlYXApOwotICAgIH0KLXByaXZhdGU6Ci0gICAgd3A8R1BVSGFyZHdhcmU+IG1HUFU7Ci19OwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIEdQVUhhcmR3YXJlOjpHUFVIYXJkd2FyZSgpCkBAIC0yMzcsODUgKzMzNCw4NyBAQAogewogfQogCi1zcDxNZW1vcnlEZWFsZXI+IEdQVUhhcmR3YXJlOjpyZXF1ZXN0KGludCBwaWQpCitzdGF0dXNfdCBHUFVIYXJkd2FyZTo6cmVxdWVzdExvY2tlZChpbnQgcGlkKQogewotICAgIHNwPE1lbW9yeURlYWxlcj4gZGVhbGVyOwotCi0gICAgTE9HRCgicGlkICVkIHJlcXVlc3RpbmcgZ3B1IHN1cmZhY2UgKGN1cnJlbnQgb3duZXIgPSAlZCkiLCBwaWQsIG1Pd25lcik7Ci0KICAgICBjb25zdCBpbnQgc2VsZl9waWQgPSBnZXRwaWQoKTsKICAgICBpZiAocGlkID09IHNlbGZfcGlkKSB7CiAgICAgICAgIC8vIGNhbid0IHVzZSBHUFUgZnJvbSBzdXJmYWNlZmxpbmdlcidzIHByb2Nlc3MKLSAgICAgICAgcmV0dXJuIGRlYWxlcjsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIAotICAgIGlmIChtT3duZXIgIT0gcGlkKSB7Ci0gICAgICAgIC8vIHNvbWVvbmUgYWxyZWFkeSBoYXMgdGhlIGdwdS4KLSAgICAgICAgdGFrZUJhY2tHUFVMb2NrZWQoKTsKLQotICAgICAgICAvLyByZWxlYXNlTG9ja2VkKCkgc2hvdWxkIGJlIGEgbm8tb3AgbW9zdCBvZiB0aGUgdGltZQotICAgICAgICByZWxlYXNlTG9ja2VkKCk7Ci0KLSAgICAgICAgcmVxdWVzdExvY2tlZCgpOyAKLSAgICB9Ci0KLSAgICBkZWFsZXIgPSBtQWxsb2NhdG9yOwotICAgIG1Pd25lciA9IHBpZDsKLSAgICBpZiAoZGVhbGVyID09IDApIHsKLSAgICAgICAgbU93bmVyID0gU1VSRkFDRV9GQUlMRUQ7Ci0gICAgfQotICAgIAotICAgIExPR0RfSUYoZGVhbGVyIT0wLCAiZ3B1IHN1cmZhY2UgZ3JhbnRlZCB0byBwaWQgJWQiLCBtT3duZXIpOwotICAgIHJldHVybiBkZWFsZXI7Ci19Ci0KLXN0YXR1c190IEdQVUhhcmR3YXJlOjpyZXF1ZXN0KGNvbnN0IHNwPElHUFVDYWxsYmFjaz4mIGNhbGxiYWNrLAotICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjpncHVfaW5mb190KiBncHUpCi17Ci0gICAgc3A8SU1lbW9yeT4gZ3B1SGFuZGxlOwotICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOwotICAgIGNvbnN0IGludCBwaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKLSAgICBjb25zdCBpbnQgc2VsZl9waWQgPSBnZXRwaWQoKTsKLQotICAgIExPR0QoInBpZCAlZCByZXF1ZXN0aW5nIGdwdSBjb3JlIChvd25lciA9ICVkKSIsIHBpZCwgbU93bmVyKTsKLQotICAgIGlmIChwaWQgPT0gc2VsZl9waWQpIHsKLSAgICAgICAgLy8gY2FuJ3QgdXNlIEdQVSBmcm9tIHN1cmZhY2VmbGluZ2VyJ3MgcHJvY2VzcwogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobU93bmVyICE9IHBpZCkgewotICAgICAgICAvLyBzb21lb25lIGFscmVhZHkgaGFzIHRoZSBncHUuCi0gICAgICAgIHRha2VCYWNrR1BVTG9ja2VkKCk7Ci0KLSAgICAgICAgLy8gcmVsZWFzZUxvY2tlZCgpIHNob3VsZCBiZSBhIG5vLW9wIG1vc3Qgb2YgdGhlIHRpbWUKLSAgICAgICAgcmVsZWFzZUxvY2tlZCgpOwotCi0gICAgICAgIHJlcXVlc3RMb2NrZWQoKTsgCisgICAgICAgIGlmIChtUkVHSGVhcCAhPSAwKSB7CisgICAgICAgICAgICBpZiAobU93bmVyICE9IE5PX09XTkVSKSB7CisgICAgICAgICAgICAgICAgLy8gc29tZW9uZSBhbHJlYWR5IGhhcyB0aGUgZ3B1LgorICAgICAgICAgICAgICAgIHRha2VCYWNrR1BVTG9ja2VkKCk7CisgICAgICAgICAgICAgICAgcmVsZWFzZUxvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gZmlyc3QgdGltZSwgaW5pdGlhbGl6ZSB0aGUgc3R1ZmYuCisgICAgICAgICAgICBpZiAobVNNSUhlYXAgPT0gMCkKKyAgICAgICAgICAgICAgICBtU01JSGVhcCA9IG5ldyBHUFVBcmVhSGVhcCh0aGlzLCAiL2Rldi9wbWVtX2dwdTAiKTsKKyAgICAgICAgICAgIGlmIChtRUJJSGVhcCA9PSAwKQorICAgICAgICAgICAgICAgIG1FQklIZWFwID0gbmV3IEdQVUFyZWFIZWFwKHRoaXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgIi9kZXYvcG1lbV9ncHUxIiwgMCwgR1BVX1JFU0VSVkVEX1NJWkUpOworICAgICAgICAgICAgbVJFR0hlYXAgPSBuZXcgR1BVUmVnaXN0ZXJIZWFwKHRoaXMpOworICAgICAgICAgICAgbUFsbG9jYXRvciA9IG1FQklIZWFwLT5nZXRBbGxvY2F0b3IoKTsKKyAgICAgICAgICAgIGlmIChtQWxsb2NhdG9yID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB0ZXJyaWJseSB3cm9uZy4KKyAgICAgICAgICAgICAgICBtU01JSGVhcC5jbGVhcigpOworICAgICAgICAgICAgICAgIG1FQklIZWFwLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVJFR0hlYXAuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ2xpZW50JiBjbGllbnQgPSBnZXRDbGllbnRMb2NrZWQocGlkKTsKKyAgICAgICAgbUN1cnJlbnRBbGxvY2F0b3IgPSBuZXcgTWVtb3J5RGVhbGVyKGNsaWVudC5lYmkuY2xpZW50SGVhcCwgbUFsbG9jYXRvcik7CisgICAgICAgIG1Pd25lciA9IHBpZDsKICAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQogCi0gICAgaWYgKG1IZWFwUi5pc1ZhbGlkKCkpIHsKK3NwPE1lbW9yeURlYWxlcj4gR1BVSGFyZHdhcmU6OnJlcXVlc3QoaW50IHBpZCkKK3sKKyAgICBzcDxNZW1vcnlEZWFsZXI+IGRlYWxlcjsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIENsaWVudCogY2xpZW50OworICAgIExPR0QoInBpZCAlZCByZXF1ZXN0aW5nIGdwdSBzdXJmYWNlIChjdXJyZW50IG93bmVyID0gJWQpIiwgcGlkLCBtT3duZXIpOworICAgIGlmIChyZXF1ZXN0TG9ja2VkKHBpZCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgZGVhbGVyID0gbUN1cnJlbnRBbGxvY2F0b3I7CisgICAgICAgIExPR0RfSUYoZGVhbGVyIT0wLCAiZ3B1IHN1cmZhY2UgZ3JhbnRlZCB0byBwaWQgJWQiLCBtT3duZXIpOworICAgIH0KKyAgICByZXR1cm4gZGVhbGVyOworfQorCitzdGF0dXNfdCBHUFVIYXJkd2FyZTo6cmVxdWVzdChpbnQgcGlkLCBjb25zdCBzcDxJR1BVQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgSVN1cmZhY2VDb21wb3Nlcjo6Z3B1X2luZm9fdCogZ3B1KQoreworICAgIGlmIChjYWxsYmFjayA9PSAwKQorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgc3A8SU1lbW9yeT4gZ3B1SGFuZGxlOworICAgIExPR0QoInBpZCAlZCByZXF1ZXN0aW5nIGdwdSBjb3JlIChvd25lciA9ICVkKSIsIHBpZCwgbU93bmVyKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHN0YXR1c190IGVyciA9IHJlcXVlc3RMb2NrZWQocGlkKTsKKyAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIGl0J3MgZ3VhcmFudGVlZCB0byBiZSB0aGVyZSwgYmUgY29uc3RydWN0aW9uCisgICAgICAgIENsaWVudCYgY2xpZW50ID0gbUNsaWVudHMuZWRpdFZhbHVlRm9yKHBpZCk7CisgICAgICAgIHJlZ2lzdGVyQ2FsbGJhY2tMb2NrZWQoY2FsbGJhY2ssIGNsaWVudCk7CiAgICAgICAgIGdwdS0+Y291bnQgPSAyOwotICAgICAgICBncHUtPnJlZ2lvbnNbMF0ucmVnaW9uID0gbUhlYXAwLm1hcCh0cnVlKTsKLSAgICAgICAgZ3B1LT5yZWdpb25zWzBdLnJlc2VydmVkID0gbUhlYXAwLnJlc2VydmVkOwotICAgICAgICBncHUtPnJlZ2lvbnNbMV0ucmVnaW9uID0gbUhlYXAxLm1hcCh0cnVlKTsKLSAgICAgICAgZ3B1LT5yZWdpb25zWzFdLnJlc2VydmVkID0gbUhlYXAxLnJlc2VydmVkOwotICAgICAgICBncHUtPnJlZ3MgPSBtSGVhcFIubWFwKCk7CisgICAgICAgIGdwdS0+cmVnaW9uc1swXS5yZWdpb24gPSBjbGllbnQuc21pLm1hcCgpOworICAgICAgICBncHUtPnJlZ2lvbnNbMV0ucmVnaW9uID0gY2xpZW50LmViaS5tYXAoKTsKKyAgICAgICAgZ3B1LT5yZWdzICAgICAgICAgICAgICA9IGNsaWVudC5yZWcubWFwKCk7CisgICAgICAgIGdwdS0+cmVnaW9uc1swXS5yZXNlcnZlZCA9IDA7CisgICAgICAgIGdwdS0+cmVnaW9uc1sxXS5yZXNlcnZlZCA9IEdQVV9SRVNFUlZFRF9TSVpFOwogICAgICAgICBpZiAoZ3B1LT5yZWdzICE9IDApIHsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PCBHUFVIYW5kbGUqID4oZ3B1LT5yZWdzLmdldCgpKS0+c2V0T3duZXIocGlkKTsKKyAgICAgICAgICAgIC8vTE9HRCgiZ3B1IGNvcmUgZ3JhbnRlZCB0byBwaWQgJWQsIGhhbmRsZSBiYXNlPSVwIiwKKyAgICAgICAgICAgIC8vICAgICAgICBtT3duZXIsIGdwdS0+cmVncy0+cG9pbnRlcigpKTsKICAgICAgICAgfQogICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgbU93bmVyID0gcGlkOwotICAgICAgICAvL0xPR0QoImdwdSBjb3JlIGdyYW50ZWQgdG8gcGlkICVkLCBoYW5kbGUgYmFzZT0lcCIsCi0gICAgICAgIC8vICAgICAgICBtT3duZXIsIGdwdS0+cmVncy0+cG9pbnRlcigpKTsKICAgICB9IGVsc2UgewogICAgICAgICBMT0dXKCJjb3VsZG4ndCBncmFudCBncHUgY29yZSB0byBwaWQgJWQiLCBwaWQpOwogICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gZXJyOwogfQogCiB2b2lkIEdQVUhhcmR3YXJlOjpyZXZva2UoaW50IHBpZCkKQEAgLTMzMCwxNiArNDI5LDE2IEBACiAgICAgICAgIC8vIG1Pd25lciBjb3VsZCBiZSA8MCBpZiB0aGUgc2FtZSBwcm9jZXNzIGFjcXVpcmVkIHRoZSBHUFUKICAgICAgICAgLy8gc2V2ZXJhbCB0aW1lcyB3aXRob3V0IHJlbGVhc2luZyBpdCBmaXJzdC4KICAgICAgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICAgICAgcmVsZWFzZUxvY2tlZCh0cnVlKTsKKyAgICAgICAgcmVsZWFzZUxvY2tlZCgpOwogICAgIH0KIH0KIAogc3RhdHVzX3QgR1BVSGFyZHdhcmU6OmZyaWVuZGx5UmV2b2tlKCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHRha2VCYWNrR1BVTG9ja2VkKCk7CiAgICAgLy9MT0dEKCJmcmllbmRseVJldm9rZSBvd25lcj0lZCIsIG1Pd25lcik7Ci0gICAgcmVsZWFzZUxvY2tlZCh0cnVlKTsKKyAgICB0YWtlQmFja0dQVUxvY2tlZCgpOworICAgIHJlbGVhc2VMb2NrZWQoKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTM1Myw5MCArNDUyLDM3IEBACiAgICAgfQogfQogCi12b2lkIEdQVUhhcmR3YXJlOjpyZXF1ZXN0TG9ja2VkKCkKK3ZvaWQgR1BVSGFyZHdhcmU6OnJlbGVhc2VMb2NrZWQoKQogewotICAgIGlmIChtQWxsb2NhdG9yID09IDApIHsKLSAgICAgICAgR1BVUGFydCogcGFydCA9IDA7Ci0gICAgICAgIHNwPFBNZW1IZWFwPiBzdXJmYWNlSGVhcDsKLSAgICAgICAgaWYgKG1IZWFwMS5wcm9tb3RlKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIC8vTE9HRCgicmVxdWVzdExvY2tlZDogKDEpIGNyZWF0aW5nIG5ldyBoZWFwIik7Ci0gICAgICAgICAgICBtSGVhcDEuc2V0KG5ldyBQTWVtSGVhcCgiL2Rldi9wbWVtX2dwdTEiLCAwLCBHUFVfUkVTRVJWRURfU0laRSkpOworICAgIC8vTE9HRCgicmV2b2tpbmcgZ3B1IGZyb20gcGlkICVkIiwgbU93bmVyKTsKKyAgICBpZiAobU93bmVyICE9IE5PX09XTkVSKSB7CisgICAgICAgIC8vIHRoaXMgbWF5IGZhaWwgYmVjYXVzZSB0aGUgY2xpZW50IG1pZ2h0IGhhdmUgZGllZCwgYW5kIGhhdmUKKyAgICAgICAgLy8gYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpc3QuCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQ2xpZW50cy5pbmRleE9mS2V5KG1Pd25lcik7CisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBDbGllbnQmIGNsaWVudChtQ2xpZW50cy5lZGl0VmFsdWVBdChpbmRleCkpOworICAgICAgICAgICAgY2xpZW50LnJldm9rZUFsbEhlYXBzKCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1IZWFwMS5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIC8vTE9HRCgicmVxdWVzdExvY2tlZDogKDEpIGhlYXAgaXMgdmFsaWQiKTsKLSAgICAgICAgICAgIC8vIE5PVEU6IGlmIEdQVTEgaXMgYXZhaWxhYmxlIHdlIHVzZSBpdCBmb3Igb3VyIHN1cmZhY2VzCi0gICAgICAgICAgICAvLyB0aGlzIGNvdWxkIGJlIGRldmljZSBzcGVjaWZpYywgc28gd2Ugc2hvdWxkIGRvIHNvbWV0aGluZyBtb3JlCi0gICAgICAgICAgICAvLyBnZW5lcmljCi0gICAgICAgICAgICBzdXJmYWNlSGVhcCA9IHN0YXRpY19jYXN0PCBQTWVtSGVhcCogPiggbUhlYXAxLmdldEhlYXAoKS5nZXQoKSApOwotICAgICAgICAgICAgcGFydCA9ICZtSGVhcDE7Ci0gICAgICAgICAgICBpZiAobUhlYXAwLnByb21vdGUoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIC8vTE9HRCgicmVxdWVzdExvY2tlZDogKDApIGNyZWF0aW5nIG5ldyBoZWFwIik7Ci0gICAgICAgICAgICAgICAgbUhlYXAwLnNldChuZXcgUE1lbUhlYXAoIi9kZXYvcG1lbV9ncHUwIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy9MT0dEKCJyZXF1ZXN0TG9ja2VkOiAoMSkgaGVhcCBpcyBub3QgdmFsaWQiKTsKLSAgICAgICAgICAgIC8vIE5vIEdQVTEsIHVzZSBHUFUwIG9ubHkKLSAgICAgICAgICAgIGlmIChtSGVhcDAucHJvbW90ZSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgLy9MT0dEKCJyZXF1ZXN0TG9ja2VkOiAoMCkgY3JlYXRpbmcgbmV3IGhlYXAiKTsKLSAgICAgICAgICAgICAgICBtSGVhcDAuc2V0KG5ldyBQTWVtSGVhcCgiL2Rldi9wbWVtX2dwdTAiLCAwLCBHUFVfUkVTRVJWRURfU0laRSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1IZWFwMC5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICAvL0xPR0QoInJlcXVlc3RMb2NrZWQ6ICgwKSBoZWFwIGlzIHZhbGlkIik7Ci0gICAgICAgICAgICAgICAgc3VyZmFjZUhlYXAgPSBzdGF0aWNfY2FzdDwgUE1lbUhlYXAqID4oIG1IZWFwMC5nZXRIZWFwKCkuZ2V0KCkgKTsKLSAgICAgICAgICAgICAgICBwYXJ0ID0gJm1IZWFwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKG1IZWFwMC5pc1ZhbGlkKCkgfHwgbUhlYXAxLmlzVmFsaWQoKSkgewotICAgICAgICAgICAgaWYgKG1IZWFwUi5wcm9tb3RlKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAvL0xPR0QoInJlcXVlc3RMb2NrZWQ6IChSKSBjcmVhdGluZyBuZXcgcmVnaXN0ZXIgaGVhcCIpOwotICAgICAgICAgICAgICAgIG1IZWFwUi5zZXQobmV3IEdQVVJlZ2lzdGVySGVhcCh0aGlzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB3ZSBnb3Qgbm90aGluZy4uLgotICAgICAgICAgICAgbUhlYXAwLmNsZWFyKCk7Ci0gICAgICAgICAgICBtSGVhcDEuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSGVhcFIuaXNWYWxpZCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAvL0xPR0QoInJlcXVlc3RMb2NrZWQ6IChSKSByZWdpc3RlciBoZWFwIG5vdCB2YWxpZCEhISIpOwotICAgICAgICAgICAgLy8gZGFtbiwgY291bGRuJ3QgZ2V0IHRoZSBncHUgcmVnaXN0ZXJzIQotICAgICAgICAgICAgbUhlYXAwLmNsZWFyKCk7Ci0gICAgICAgICAgICBtSGVhcDEuY2xlYXIoKTsKLSAgICAgICAgICAgIHN1cmZhY2VIZWFwLmNsZWFyKCk7Ci0gICAgICAgICAgICBwYXJ0ID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdXJmYWNlSGVhcCAhPSAwICYmIHBhcnQgJiYgcGFydC0+Z2V0Q2xpZW50SGVhcCgpIT0wKSB7Ci0gICAgICAgICAgICBwYXJ0LT5yZXNlcnZlZCA9IEdQVV9SRVNFUlZFRF9TSVpFOwotICAgICAgICAgICAgcGFydC0+c3VyZmFjZSA9IHRydWU7Ci0gICAgICAgICAgICBtQWxsb2NhdG9yRGVidWcgPSBzdGF0aWNfY2FzdDxTaW1wbGVCZXN0Rml0QWxsb2NhdG9yKj4oCi0gICAgICAgICAgICAgICAgICAgIHN1cmZhY2VIZWFwLT5nZXRBbGxvY2F0b3IoKS5nZXQoKSk7Ci0gICAgICAgICAgICBtQWxsb2NhdG9yID0gbmV3IE1lbW9yeURlYWxlcigKLSAgICAgICAgICAgICAgICAgICAgcGFydC0+Z2V0Q2xpZW50SGVhcCgpLAotICAgICAgICAgICAgICAgICAgICBzdXJmYWNlSGVhcC0+Z2V0QWxsb2NhdG9yKCkpOwotICAgICAgICB9CisgICAgICAgIG1Pd25lciA9IE5PX09XTkVSOworICAgICAgICBtQ3VycmVudEFsbG9jYXRvci5jbGVhcigpOworICAgICAgICBtQ2FsbGJhY2suY2xlYXIoKTsKICAgICB9CiB9CiAKLXZvaWQgR1BVSGFyZHdhcmU6OnJlbGVhc2VMb2NrZWQoYm9vbCBkaXNwb3NlKQorR1BVSGFyZHdhcmU6OkNsaWVudCYgR1BVSGFyZHdhcmU6OmdldENsaWVudExvY2tlZChwaWRfdCBwaWQpCiB7Ci0gICAgLyogCi0gICAgICogaWYgZGlzcG9zZSBpcyBzZXQsIHdlIHdpbGwgZm9yY2UgdGhlIGRlc3RydWN0aW9uIG9mIHRoZSBoZWFwLAotICAgICAqIHNvIGl0IGlzIGdpdmVuIGJhY2sgdG8gb3RoZXIgc3lzdGVtcywgc3VjaCBhcyBjYW1lcmEuCi0gICAgICogT3RoZXJ3aXNlLCB3ZSdsbCBrZWVwIGEgd2VhayBwb2ludGVyIHRvIGl0LCB0aGlzIHdheSB3ZSBtaWdodCBiZSBhYmxlCi0gICAgICogdG8gcmV1c2UgaXQgbGF0ZXIgaWYgaXQncyBzdGlsbCBhcm91bmQuIAotICAgICAqLwotICAgIC8vTE9HRCgicmV2b2tpbmcgZ3B1IGZyb20gcGlkICVkIiwgbU93bmVyKTsKLSAgICBtT3duZXIgPSBOT19PV05FUjsKLSAgICBtQWxsb2NhdG9yLmNsZWFyKCk7Ci0gICAgbUNhbGxiYWNrLmNsZWFyKCk7Ci0KLSAgICAvKiBpZiB3ZSdyZSBhc2tlZCBmb3IgYSBmdWxsIHJldm9rZSwgZGlzcG9zZSBvbmx5IG9mIHRoZSBoZWFwCi0gICAgICogd2UncmUgbm90IHVzaW5nIGZvciBzdXJmYWNlIChhcyB3ZSBtaWdodCBuZWVkIGl0IHdoaWxlIGRyYXdpbmcpICovCi0gICAgbUhlYXAwLnJlbGVhc2UobUhlYXAwLnN1cmZhY2UgPyBmYWxzZSA6IGRpc3Bvc2UpOwotICAgIG1IZWFwMS5yZWxlYXNlKG1IZWFwMS5zdXJmYWNlID8gZmFsc2UgOiBkaXNwb3NlKTsKLSAgICBtSGVhcFIucmVsZWFzZShmYWxzZSk7CisgICAgc3NpemVfdCBpbmRleCA9IG1DbGllbnRzLmluZGV4T2ZLZXkocGlkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIENsaWVudCBjbGllbnQ7CisgICAgICAgIGNsaWVudC5waWQgPSBwaWQ7CisgICAgICAgIGNsaWVudC5zbWkuaGVhcCA9IG1TTUlIZWFwOworICAgICAgICBjbGllbnQuZWJpLmhlYXAgPSBtRUJJSGVhcDsKKyAgICAgICAgY2xpZW50LnJlZy5oZWFwID0gbVJFR0hlYXA7CisgICAgICAgIGluZGV4ID0gbUNsaWVudHMuYWRkKHBpZCwgY2xpZW50KTsKKyAgICB9CisgICAgQ2xpZW50JiBjbGllbnQobUNsaWVudHMuZWRpdFZhbHVlQXQoaW5kZXgpKTsKKyAgICBjbGllbnQuY3JlYXRlQ2xpZW50SGVhcHMoKTsKKyAgICByZXR1cm4gY2xpZW50OwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00NDQsOCArNDkwLDcgQEAKIAogc3A8U2ltcGxlQmVzdEZpdEFsbG9jYXRvcj4gR1BVSGFyZHdhcmU6OmdldEFsbG9jYXRvcigpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHNwPFNpbXBsZUJlc3RGaXRBbGxvY2F0b3I+IGFsbG9jYXRvciA9IG1BbGxvY2F0b3JEZWJ1Zy5wcm9tb3RlKCk7Ci0gICAgcmV0dXJuIGFsbG9jYXRvcjsKKyAgICByZXR1cm4gbUFsbG9jYXRvcjsKIH0KIAogdm9pZCBHUFVIYXJkd2FyZTo6dW5jb25kaXRpb25hbFJldm9rZSgpCkBAIC00NTYsMTAyICs1MDEsODEgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLQotR1BVSGFyZHdhcmU6OkdQVVBhcnQ6OkdQVVBhcnQoKQotICAgIDogc3VyZmFjZShmYWxzZSksIHJlc2VydmVkKDApCi17Ci19Ci0KLUdQVUhhcmR3YXJlOjpHUFVQYXJ0Ojp+R1BVUGFydCgpIHsKLX0KLSAgICAKLWNvbnN0IHNwPFBNZW1IZWFwSW50ZXJmYWNlPiYgR1BVSGFyZHdhcmU6OkdQVVBhcnQ6OmdldEhlYXAoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1IZWFwOwotfQotCi1jb25zdCBzcDxNZW1vcnlIZWFwUG1lbT4mIEdQVUhhcmR3YXJlOjpHUFVQYXJ0OjpnZXRDbGllbnRIZWFwKCkgY29uc3QgewotICAgIHJldHVybiBtQ2xpZW50SGVhcDsKLX0KLQotYm9vbCBHUFVIYXJkd2FyZTo6R1BVUGFydDo6aXNWYWxpZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gKChtSGVhcCE9MCkgJiYgKG1IZWFwLT5iYXNlKCkgIT0gTUFQX0ZBSUxFRCkpOwotfQotCi12b2lkIEdQVUhhcmR3YXJlOjpHUFVQYXJ0OjpjbGVhcigpIAotewotICAgIG1IZWFwLmNsZWFyKCk7Ci0gICAgbUhlYXBXZWFrLmNsZWFyKCk7Ci0gICAgbUNsaWVudEhlYXAuY2xlYXIoKTsKLSAgICBzdXJmYWNlID0gZmFsc2U7Ci19Ci0KLXZvaWQgR1BVSGFyZHdhcmU6OkdQVVBhcnQ6OnNldChjb25zdCBzcDxQTWVtSGVhcEludGVyZmFjZT4mIGhlYXApIAotewotICAgIG1IZWFwV2Vhay5jbGVhcigpOwotICAgIGlmIChoZWFwIT0wICYmIGhlYXAtPmJhc2UoKSA9PSBNQVBfRkFJTEVEKSB7Ci0gICAgICAgIG1IZWFwLmNsZWFyKCk7Ci0gICAgICAgIG1DbGllbnRIZWFwLmNsZWFyKCk7Ci0gICAgfSBlbHNlIHsgCi0gICAgICAgIG1IZWFwID0gaGVhcDsKLSAgICAgICAgbUNsaWVudEhlYXAgPSBtSGVhcC0+Y3JlYXRlQ2xpZW50SGVhcCgpOwotICAgIH0KLX0KLQotYm9vbCBHUFVIYXJkd2FyZTo6R1BVUGFydDo6cHJvbW90ZSgpIAotewotICAgIC8vTE9HRCgibUhlYXBXZWFrPSVwLCBtSGVhcD0lcCIsIG1IZWFwV2Vhay51bnNhZmVfZ2V0KCksIG1IZWFwLmdldCgpKTsKLSAgICBpZiAobUhlYXAgPT0gMCkgewotICAgICAgICBtSGVhcCA9IG1IZWFwV2Vhay5wcm9tb3RlKCk7Ci0gICAgfQotICAgIGlmIChtSGVhcCAhPSAwKSB7Ci0gICAgICAgIGlmIChtQ2xpZW50SGVhcCAhPSAwKSB7Ci0gICAgICAgICAgICBtQ2xpZW50SGVhcC0+cmV2b2tlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUNsaWVudEhlYXAgPSBtSGVhcC0+Y3JlYXRlQ2xpZW50SGVhcCgpOwotICAgIH0gIGVsc2UgewotICAgICAgICBzdXJmYWNlID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBtSGVhcCAhPSAwOwotfQotCi1zcDxJTWVtb3J5PiBHUFVIYXJkd2FyZTo6R1BVUGFydDo6bWFwKGJvb2wgY2xlYXIpIAoteworc3A8SU1lbW9yeT4gR1BVSGFyZHdhcmU6OkdQVUFyZWE6Om1hcCgpIHsKICAgICBzcDxJTWVtb3J5PiBtZW1vcnk7Ci0gICAgaWYgKG1DbGllbnRIZWFwICE9IE5VTEwpIHsKLSAgICAgICAgbWVtb3J5ID0gbUNsaWVudEhlYXAtPm1hcE1lbW9yeSgwLCBtSGVhcC0+dmlydHVhbFNpemUoKSk7Ci0gICAgICAgIGlmIChjbGVhciAmJiBtZW1vcnkhPTApIHsKLSAgICAgICAgICAgIC8vU3RvcFdhdGNoIHN3KCJtZW1zZXQiKTsKLSAgICAgICAgICAgIG1lbXNldChtZW1vcnktPnBvaW50ZXIoKSwgMCwgbWVtb3J5LT5zaXplKCkpOwotICAgICAgICB9CisgICAgaWYgKGNsaWVudEhlYXAgIT0gMCAmJiBoZWFwICE9IDApIHsKKyAgICAgICAgbWVtb3J5ID0gY2xpZW50SGVhcC0+bWFwTWVtb3J5KDAsIGhlYXAtPnZpcnR1YWxTaXplKCkpOwogICAgIH0KICAgICByZXR1cm4gbWVtb3J5OwogfQogCi12b2lkIEdQVUhhcmR3YXJlOjpHUFVQYXJ0OjpyZWxlYXNlKGJvb2wgZGlzcG9zZSkKK3ZvaWQgR1BVSGFyZHdhcmU6OkNsaWVudDo6Y3JlYXRlQ2xpZW50SGVhcHMoKSAKIHsKLSAgICBpZiAobUNsaWVudEhlYXAgIT0gMCkgewotICAgICAgICBtQ2xpZW50SGVhcC0+cmV2b2tlKCk7Ci0gICAgICAgIG1DbGllbnRIZWFwLmNsZWFyKCk7CisgICAgaWYgKHNtaS5jbGllbnRIZWFwID09IDApCisgICAgICAgIHNtaS5jbGllbnRIZWFwID0gc21pLmhlYXAtPmNyZWF0ZUNsaWVudEhlYXAoKTsKKyAgICBpZiAoZWJpLmNsaWVudEhlYXAgPT0gMCkKKyAgICAgICAgZWJpLmNsaWVudEhlYXAgPSBlYmkuaGVhcC0+Y3JlYXRlQ2xpZW50SGVhcCgpOworICAgIGlmIChyZWcuY2xpZW50SGVhcCA9PSAwKQorICAgICAgICByZWcuY2xpZW50SGVhcCA9IHJlZy5oZWFwLT5jcmVhdGVDbGllbnRIZWFwKCk7Cit9CisKK3ZvaWQgR1BVSGFyZHdhcmU6OkNsaWVudDo6cmV2b2tlQWxsSGVhcHMoKSAKK3sKKyAgICBpZiAoc21pLmNsaWVudEhlYXAgIT0gMCkKKyAgICAgICAgc21pLmNsaWVudEhlYXAtPnJldm9rZSgpOworICAgIGlmIChlYmkuY2xpZW50SGVhcCAhPSAwKQorICAgICAgICBlYmkuY2xpZW50SGVhcC0+cmV2b2tlKCk7CisgICAgaWYgKHJlZy5jbGllbnRIZWFwICE9IDApCisgICAgICAgIHJlZy5jbGllbnRIZWFwLT5yZXZva2UoKTsKK30KKwordm9pZCBHUFVIYXJkd2FyZTo6cmVnaXN0ZXJDYWxsYmFja0xvY2tlZChjb25zdCBzcDxJR1BVQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgQ2xpZW50JiBjbGllbnQpCit7CisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gY2FsbGJhY2stPmFzQmluZGVyKCk7CisgICAgaWYgKG1SZWdpc3RlcmVkQ2xpZW50cy5hZGQoYmluZGVyLCBjbGllbnQucGlkKSA+PSAwKSB7CisgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgodGhpcyk7CiAgICAgfQotICAgIGlmIChkaXNwb3NlKSB7Ci0gICAgICAgIGlmIChtSGVhcFdlYWshPTAgJiYgbUhlYXA9PTApIHsKLSAgICAgICAgICAgIG1IZWFwID0gbUhlYXBXZWFrLnByb21vdGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUhlYXAgIT0gMCkgewotICAgICAgICAgICAgbUhlYXAtPmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIG1IZWFwV2Vhay5jbGVhcigpOwotICAgICAgICAgICAgbUhlYXAuY2xlYXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN1cmZhY2UgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtSGVhcCAhPSAwKSB7Ci0gICAgICAgICAgICBtSGVhcFdlYWsgPSBtSGVhcDsKLSAgICAgICAgICAgIG1IZWFwLmNsZWFyKCk7Cit9CisKK3ZvaWQgR1BVSGFyZHdhcmU6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHBpZF90IHBpZCA9IG1SZWdpc3RlcmVkQ2xpZW50cy52YWx1ZUZvcih3aG8pOworICAgIGlmIChwaWQgIT0gMCkgeworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUNsaWVudHMuaW5kZXhPZktleShwaWQpOworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgLy9MT0dEKCIqKiogcmVtb3ZpbmcgY2xpZW50IGF0ICVkIiwgaW5kZXgpOworICAgICAgICAgICAgQ2xpZW50JiBjbGllbnQobUNsaWVudHMuZWRpdFZhbHVlQXQoaW5kZXgpKTsKKyAgICAgICAgICAgIGNsaWVudC5yZXZva2VBbGxIZWFwcygpOyAvLyBub3QgcmVhbGx5IG5lZWRlZCBpbiB0aGVvcnkKKyAgICAgICAgICAgIG1DbGllbnRzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKG1DbGllbnRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy9MT0dEKCIqKiogd2FzIGxhc3QgY2xpZW50IGNsb3NpbmcgZXZlcnl0aGluZyIpOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay5jbGVhcigpOworICAgICAgICAgICAgICAgIG1BbGxvY2F0b3IuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudEFsbG9jYXRvci5jbGVhcigpOworICAgICAgICAgICAgICAgIG1TTUlIZWFwLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVJFR0hlYXAuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBOT1RFOiB3ZSBjYW5ub3QgY2xlYXIgdGhlIEVCSSBoZWFwIGJlY2F1c2Ugc3VyZmFjZWZsaW5nZXIKKyAgICAgICAgICAgICAgICAvLyBpdHNlbGYgbWF5IGJlIHVzaW5nIGl0LCBzaW5jZSB0aGlzIGlzIHdoZXJlIHN1cmZhY2VzCisgICAgICAgICAgICAgICAgLy8gYXJlIGFsbG9jYXRlZC4gaWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBjb21wb3NpdGluZyAKKyAgICAgICAgICAgICAgICAvLyBhIHN1cmZhY2UgKGV2ZW4gaWYgaXRzIHByb2Nlc3MganVzdCBkaWVkKSwgd2UgY2Fubm90CisgICAgICAgICAgICAgICAgLy8gcmlwIHRoZSBoZWFwIHVuZGVyIG91ciBmZWV0LgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1Pd25lciA9IE5PX09XTkVSOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3A8R1BVSGFyZHdhcmVJbnRlcmZhY2U+IEdQVUZhY3Rvcnk6OmdldEdQVSgpCit7CisgICAgcmV0dXJuIG5ldyBHUFVIYXJkd2FyZSgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvR1BVSGFyZHdhcmUvR1BVSGFyZHdhcmUuaCBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvR1BVSGFyZHdhcmUvR1BVSGFyZHdhcmUuaAppbmRleCA5YTc4Yjk5Li4zMzU0NTI4IDEwMDY0NAotLS0gYS9saWJzL3N1cmZhY2VmbGluZ2VyL0dQVUhhcmR3YXJlL0dQVUhhcmR3YXJlLmgKKysrIGIvbGlicy9zdXJmYWNlZmxpbmdlci9HUFVIYXJkd2FyZS9HUFVIYXJkd2FyZS5oCkBAIC0yMiw5MiArMjIsMzkgQEAKIAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworI2luY2x1ZGUgPHVpL0lTdXJmYWNlQ29tcG9zZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotY2xhc3MgR1BVSGFyZHdhcmVJbnRlcmZhY2UgOiBwdWJsaWMgUmVmQmFzZQorY2xhc3MgSUdQVUNhbGxiYWNrOworCitjbGFzcyBHUFVIYXJkd2FyZUludGVyZmFjZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKIHsKIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgcmV2b2tlKGludCBwaWQpID0gMDsKICAgICB2aXJ0dWFsIHNwPE1lbW9yeURlYWxlcj4gICAgcmVxdWVzdChpbnQgcGlkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgIHJlcXVlc3QoY29uc3Qgc3A8SUdQVUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgIHJlcXVlc3QoaW50IHBpZCwgY29uc3Qgc3A8SUdQVUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjpncHVfaW5mb190KiBncHUpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICBmcmllbmRseVJldm9rZSgpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgdW5jb25kaXRpb25hbFJldm9rZSgpID0gMDsKICAgICAKICAgICAvLyB1c2VkIGZvciBkZWJ1Z2dpbmcgb25seS4uLgogICAgIHZpcnR1YWwgc3A8U2ltcGxlQmVzdEZpdEFsbG9jYXRvcj4gZ2V0QWxsb2NhdG9yKCkgY29uc3QgID0gMDsKICAgICB2aXJ0dWFsIHBpZF90IGdldE93bmVyKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgdm9pZCB1bmNvbmRpdGlvbmFsUmV2b2tlKCkgPSAwOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIElNZW1vcnk7Ci1jbGFzcyBNZW1vcnlIZWFwUG1lbTsKLWNsYXNzIFBNZW1IZWFwOwotCi1jbGFzcyBHUFVIYXJkd2FyZSA6IHB1YmxpYyBHUFVIYXJkd2FyZUludGVyZmFjZQoteworY2xhc3MgR1BVRmFjdG9yeQoreyAgICAKIHB1YmxpYzoKLSAgICAgICAgICAgIEdQVUhhcmR3YXJlKCk7Ci0gICAgdmlydHVhbCB+R1BVSGFyZHdhcmUoKTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgcmV2b2tlKGludCBwaWQpOwotICAgIHZpcnR1YWwgc3A8TWVtb3J5RGVhbGVyPiAgICByZXF1ZXN0KGludCBwaWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICByZXF1ZXN0KGNvbnN0IHNwPElHUFVDYWxsYmFjaz4mIGNhbGxiYWNrLAotICAgICAgICAgICAgSVN1cmZhY2VDb21wb3Nlcjo6Z3B1X2luZm9fdCogZ3B1KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICBmcmllbmRseVJldm9rZSgpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICB1bmNvbmRpdGlvbmFsUmV2b2tlKCk7Ci0gICAgCi0gICAgLy8gdXNlZCBmb3IgZGVidWdnaW5nIG9ubHkuLi4KLSAgICB2aXJ0dWFsIHNwPFNpbXBsZUJlc3RGaXRBbGxvY2F0b3I+IGdldEFsbG9jYXRvcigpIGNvbnN0OwotICAgIHZpcnR1YWwgcGlkX3QgZ2V0T3duZXIoKSBjb25zdCB7IHJldHVybiBtT3duZXI7IH0KLSAgICAKLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIE5PX09XTkVSICAgICAgICA9IC0xLAotICAgICAgICBTVVJGQUNFX0ZBSUxFRCAgPSAtMgotICAgIH07Ci0gICAgCi0gICAgdm9pZCByZXF1ZXN0TG9ja2VkKCk7Ci0gICAgdm9pZCByZWxlYXNlTG9ja2VkKGJvb2wgZGlzcG9zZSA9IGZhbHNlKTsKLSAgICB2b2lkIHRha2VCYWNrR1BVTG9ja2VkKCk7Ci0gICAgCi0gICAgY2xhc3MgR1BVUGFydAotICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGJvb2wgc3VyZmFjZTsKLSAgICAgICAgc2l6ZV90IHJlc2VydmVkOwotICAgICAgICBHUFVQYXJ0KCk7Ci0gICAgICAgIH5HUFVQYXJ0KCk7Ci0gICAgICAgIGNvbnN0IHNwPFBNZW1IZWFwSW50ZXJmYWNlPiYgZ2V0SGVhcCgpIGNvbnN0OwotICAgICAgICBjb25zdCBzcDxNZW1vcnlIZWFwUG1lbT4mIGdldENsaWVudEhlYXAoKSBjb25zdDsKLSAgICAgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3Q7Ci0gICAgICAgIHZvaWQgY2xlYXIoKTsKLSAgICAgICAgdm9pZCBzZXQoY29uc3Qgc3A8UE1lbUhlYXBJbnRlcmZhY2U+JiBoZWFwKTsKLSAgICAgICAgYm9vbCBwcm9tb3RlKCk7Ci0gICAgICAgIHNwPElNZW1vcnk+IG1hcChib29sIGNsZWFyID0gZmFsc2UpOwotICAgICAgICB2b2lkIHJlbGVhc2UoYm9vbCBkaXNwb3NlKTsKLSAgICBwcml2YXRlOgotICAgICAgICBzcDxQTWVtSGVhcEludGVyZmFjZT4gICBtSGVhcDsKLSAgICAgICAgd3A8UE1lbUhlYXBJbnRlcmZhY2U+ICAgbUhlYXBXZWFrOwotICAgICAgICBzcDxNZW1vcnlIZWFwUG1lbT4gICAgICBtQ2xpZW50SGVhcDsKLSAgICB9OwotICAgIAotICAgIG11dGFibGUgTXV0ZXggICBtTG9jazsKLSAgICBHUFVQYXJ0ICAgICAgICAgbUhlYXAwOyAvLyBTTUkKLSAgICBHUFVQYXJ0ICAgICAgICAgbUhlYXAxOyAvLyBFQkkxCi0gICAgR1BVUGFydCAgICAgICAgIG1IZWFwUjsKLSAgICBzcDxNZW1vcnlEZWFsZXI+IG1BbGxvY2F0b3I7Ci0gICAgcGlkX3QgICAgICAgICAgICBtT3duZXI7Ci0gICAgc3A8SUdQVUNhbGxiYWNrPiBtQ2FsbGJhY2s7Ci0gICAgd3A8U2ltcGxlQmVzdEZpdEFsbG9jYXRvcj4gbUFsbG9jYXRvckRlYnVnOwotICAgIAotICAgIENvbmRpdGlvbiAgICAgICBtQ29uZGl0aW9uOworICAgIC8vIHRoZSBncHUgZmFjdG9yeQorICAgIHN0YXRpYyBzcDxHUFVIYXJkd2FyZUludGVyZmFjZT4gZ2V0R1BVKCk7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuY3BwIGIvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllci5jcHAKaW5kZXggNGY2YmFlMS4uOGJhMDg1MSAxMDA2NDQKLS0tIGEvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllci5jcHAKKysrIGIvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllci5jcHAKQEAgLTkyLDI2ICs5MiwyOSBAQAogICAgIHN0YXR1c190IGVyciA9IGdldFBpeGVsRm9ybWF0SW5mbyhmb3JtYXQsICZpbmZvKTsKICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOwogCi0gICAgLy8gVE9ETzogaWYgZUhhcmR3YXJlIGlzIGV4cGxpY2l0ZWx5IHJlcXVlc3RlZCwgd2Ugc2hvdWxkIGZhaWwKKyAgICAvLyBUT0RPOiBpZiBlSGFyZHdhcmUgaXMgZXhwbGljaXRseSByZXF1ZXN0ZWQsIHdlIHNob3VsZCBmYWlsCiAgICAgLy8gb24gc3lzdGVtcyB3aGVyZSB3ZSBjYW4ndCBhbGxvY2F0ZSBtZW1vcnkgdGhhdCBjYW4gYmUgdXNlZCB3aXRoCiAgICAgLy8gRE1BIGVuZ2luZXMgZm9yIGluc3RhbmNlLgorICAgIAorICAgIC8vIEZJWE1FOiB3ZSBhbHdheXMgYXNrIGZvciBoYXJkd2FyZSBmb3Igbm93ICh0aGlzIHNob3VsZCBjb21lIGZyb20gY29weWJpdCkKKyAgICBmbGFncyB8PSBJU3VyZmFjZUNvbXBvc2VyOjplSGFyZHdhcmU7CiAKLSAgICBpbnQgbWVtb3J5X3R5cGUgPSBOQVRJVkVfTUVNT1JZX1RZUEVfUE1FTTsKKyAgICBjb25zdCB1aW50MzJfdCBtZW1vcnlfZmxhZ3MgPSBmbGFncyAmIAorICAgICAgICAgICAgKElTdXJmYWNlQ29tcG9zZXI6OmVHUFUgfCAKKyAgICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjplSGFyZHdhcmUgfCAKKyAgICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjplU2VjdXJlKTsKICAgICAKICAgICAvLyBwaXhlbC1hbGlnbm1lbnQuIHRoZSBmaW5hbCBhbGlnbm1lbnQgbWF5IGJlIGJpZ2dlciBiZWNhdXNlCiAgICAgLy8gd2UgYWx3YXlzIGZvcmNlIGEgNC1ieXRlIGFsaWduZWQgYnByLgogICAgIHVpbnQzMl90IGFsaWdubWVudCA9IDE7CiAKLSAgICBjb25zdCB1aW50MzJfdCBtYXNrID0gSVN1cmZhY2VDb21wb3Nlcjo6ZUdQVSB8IElTdXJmYWNlQ29tcG9zZXI6OmVTZWN1cmU7Ci0gICAgaWYgKChmbGFncyAmIG1hc2spID09IElTdXJmYWNlQ29tcG9zZXI6OmVHUFUpIHsKLSAgICAgICAgLy8gZG9uJ3QgZ3JhbnQgR1BVIG1lbW9yeSBpZiBHUFUgaXMgZGlzYWJsZWQKLSAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgICBwcm9wZXJ0eV9nZXQoImRlYnVnLmVnbC5odyIsIHZhbHVlLCAiMSIpOwotICAgICAgICBpZiAoYXRvaSh2YWx1ZSkgIT0gMCkgewotICAgICAgICAgICAgZmxhZ3MgfD0gSVN1cmZhY2VDb21wb3Nlcjo6ZUhhcmR3YXJlOwotICAgICAgICAgICAgbWVtb3J5X3R5cGUgPSBOQVRJVkVfTUVNT1JZX1RZUEVfR1BVOwotICAgICAgICAgICAgLy8gVE9ETzogdGhpcyB2YWx1ZSBzaG91bGQgY29tZSBmcm9tIHRoZSBoL3cKLSAgICAgICAgICAgIGFsaWdubWVudCA9IDg7IAorICAgIGlmIChmbGFncyAmIElTdXJmYWNlQ29tcG9zZXI6OmVHUFUpIHsKKyAgICAgICAgLy8gRklYTUU6IHRoaXMgdmFsdWUgc2hvdWxkIGNvbWUgZnJvbSB0aGUgaC93CisgICAgICAgIGFsaWdubWVudCA9IDg7IAorICAgICAgICAvLyBGSVhNRTogdGhpcyBpcyBtc203MjAxQSBzcGVjaWZpYywgYXMgaXRzIEdQVSBvbmx5IHN1cHBvcnRzCisgICAgICAgIC8vIEJHUkFfODg4OC4KKyAgICAgICAgaWYgKGZvcm1hdCA9PSBQSVhFTF9GT1JNQVRfUkdCQV84ODg4KSB7CisgICAgICAgICAgICBmb3JtYXQgPSBQSVhFTF9GT1JNQVRfQkdSQV84ODg4OwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMTksNyArMTIyLDcgQEAKICAgICBtTmVlZHNCbGVuZGluZyA9IChpbmZvLmhfYWxwaGEgLSBpbmZvLmxfYWxwaGEpID4gMDsKICAgICBzcDxNZW1vcnlEZWFsZXI+IGFsbG9jYXRvcnNbMl07CiAgICAgZm9yIChpbnQgaT0wIDsgaTwyIDsgaSsrKSB7Ci0gICAgICAgIGFsbG9jYXRvcnNbaV0gPSBjbGllbnQtPmNyZWF0ZUFsbG9jYXRvcihtZW1vcnlfdHlwZSk7CisgICAgICAgIGFsbG9jYXRvcnNbaV0gPSBjbGllbnQtPmNyZWF0ZUFsbG9jYXRvcihtZW1vcnlfZmxhZ3MpOwogICAgICAgICBpZiAoYWxsb2NhdG9yc1tpXSA9PSAwKQogICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgbUJ1ZmZlcnNbaV0uaW5pdChhbGxvY2F0b3JzW2ldKTsKQEAgLTEzMyw3ICsxMzYsNyBAQAogICAgIG1TdXJmYWNlID0gbmV3IFN1cmZhY2UoY2xpZW50SW5kZXgoKSwKICAgICAgICAgICAgIGFsbG9jYXRvcnNbMF0tPmdldE1lbW9yeUhlYXAoKSwKICAgICAgICAgICAgIGFsbG9jYXRvcnNbMV0tPmdldE1lbW9yeUhlYXAoKSwKLSAgICAgICAgICAgIG1lbW9yeV90eXBlLCBtSWRlbnRpdHkpOworICAgICAgICAgICAgbUlkZW50aXR5KTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTE4MCw3ICsxODMsNyBAQAogICAgICAgICBmcm9udC5nZXRCaXRtYXBTdXJmYWNlKCZzcmMpOwogICAgICAgICBjb3B5Yml0X3JlY3RfdCBzcmVjdCA9IHsgMCwgMCwgdC53aWR0aCwgdC5oZWlnaHQgfTsKIAotICAgICAgICBjb3B5Yml0X3QqIGNvcHliaXQgPSBtRmxpbmdlci0+Z2V0QmxpdEVuZ2luZSgpOworICAgICAgICBjb3B5Yml0X2RldmljZV90KiBjb3B5Yml0ID0gbUZsaW5nZXItPmdldEJsaXRFbmdpbmUoKTsKICAgICAgICAgY29weWJpdC0+c2V0X3BhcmFtZXRlcihjb3B5Yml0LCBDT1BZQklUX1RSQU5TRk9STSwgZ2V0T3JpZW50YXRpb24oKSk7CiAgICAgICAgIGNvcHliaXQtPnNldF9wYXJhbWV0ZXIoY29weWJpdCwgQ09QWUJJVF9QTEFORV9BTFBIQSwgcy5hbHBoYSk7CiAgICAgICAgIGNvcHliaXQtPnNldF9wYXJhbWV0ZXIoY29weWJpdCwgQ09QWUJJVF9ESVRIRVIsCmRpZmYgLS1naXQgYS9saWJzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5jcHAgYi9saWJzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5jcHAKaW5kZXggMTdjOWY0Mi4uYWYzNTNlMiAxMDA2NDQKLS0tIGEvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuY3BwCisrKyBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmNwcApAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCIKIAogCi0vLyBXZSBkb24ndCBob25vciB0aGUgcHJlbXVsdGlwbGlhZCBhbHBoYSBmbGFncywgd2hpY2ggbWVhbnMgdGhhdAorLy8gV2UgZG9uJ3QgaG9ub3IgdGhlIHByZW11bHRpcGxpZWQgYWxwaGEgZmxhZ3MsIHdoaWNoIG1lYW5zIHRoYXQKIC8vIHByZW11bHRpcGxpZWQgc3VyZmFjZSBtYXkgYmUgY29tcG9zZWQgdXNpbmcgYSBub24tcHJlbXVsdGlwbGllZAogLy8gZXF1YXRpb24uIFdlIGRvIHRoaXMgYmVjYXVzZSBpdCBtYXkgYmUgYSBsb3QgZmFzdGVyIG9uIHNvbWUgaGFyZHdhcmUKIC8vIFRoZSBjb3JyZWN0IHZhbHVlIGlzIEhPTk9SX1BSRU1VTFRJUExJRURfQUxQSEEgPSAxCkBAIC0yNTYsNyArMjU2LDcgQEAKIAogICAgIC8vIHNlZSBpZiB3ZSBjYW4vc2hvdWxkIHVzZSAyRCBoL3cgd2l0aCB0aGUgbmV3IGNvbmZpZ3VyYXRpb24KICAgICBtQ2FuVXNlQ29weUJpdCA9IGZhbHNlOwotICAgIGNvcHliaXRfdCogY29weWJpdCA9IG1GbGluZ2VyLT5nZXRCbGl0RW5naW5lKCk7CisgICAgY29weWJpdF9kZXZpY2VfdCogY29weWJpdCA9IG1GbGluZ2VyLT5nZXRCbGl0RW5naW5lKCk7CiAgICAgaWYgKGNvcHliaXQpIHsgCiAgICAgICAgIGNvbnN0IGludCBzdGVwID0gY29weWJpdC0+Z2V0KGNvcHliaXQsIENPUFlCSVRfUk9UQVRJT05fU1RFUF9ERUcpOwogICAgICAgICBjb25zdCBpbnQgc2NhbGVCaXRzID0gY29weWJpdC0+Z2V0KGNvcHliaXQsIENPUFlCSVRfU0NBTElOR19GUkFDX0JJVFMpOwpAQCAtNDEzLDcgKzQxMyw3IEBACiAgICAgICAgIC8vIHByZW11bHRpcGxpZWQgYWxwaGEuCiAgICAgICAgIAogICAgICAgICAvLyBJZiB0aGUgdGV4dHVyZSBkb2Vzbid0IGhhdmUgYW4gYWxwaGEgY2hhbm5lbCB3ZSBjYW4KLSAgICAgICAgLy8gdXNlIFJFUExBQ0UgYW5kIHN3aXRjaCB0byBub24gcHJlbXVsdGlwbGllZC1hbHBoYQorICAgICAgICAvLyB1c2UgUkVQTEFDRSBhbmQgc3dpdGNoIHRvIG5vbiBwcmVtdWx0aXBsaWVkIGFscGhhCiAgICAgICAgIC8vIGJsZW5kaW5nIChTUkNBL09ORV9NSU5VU19TUkNBKS4KICAgICAgICAgCiAgICAgICAgIEdMZW51bSBlbnYsIHNyYzsKQEAgLTQzMSwxMSArNDMxLDExIEBACiAgICAgICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgZW52KTsKICAgICB9IGVsc2UgewogICAgICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOworICAgICAgICBnbENvbG9yNHgoMHgxMDAwMCwgMHgxMDAwMCwgMHgxMDAwMCwgMHgxMDAwMCk7CiAgICAgICAgIGlmIChuZWVkc0JsZW5kaW5nKCkpIHsKICAgICAgICAgICAgIEdMZW51bSBzcmMgPSBtUHJlbXVsdGlwbGllZEFscGhhID8gR0xfT05FIDogR0xfU1JDX0FMUEhBOwogICAgICAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOwogICAgICAgICAgICAgZ2xCbGVuZEZ1bmMoc3JjLCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKLSAgICAgICAgICAgIGdsQ29sb3I0eCgweDEwMDAwLCAweDEwMDAwLCAweDEwMDAwLCAweDEwMDAwKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CiAgICAgICAgIH0KQEAgLTQ2Myw3ICs0NjMsNyBAQAogICAgICAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX1RFWFRVUkUpOwogICAgICAgICAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKICAgICAgICAgICAgIGlmICghKG1GbGFncyAmIERpc3BsYXlIYXJkd2FyZTo6TlBPVF9FWFRFTlNJT04pKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgc21hbGVzdCBwb3dlci1vZi10d28gdGhhdCB3aWxsIGFjY29tb2RhdGUgb3VyIHN1cmZhY2UKKyAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBzbWFsbGVzdCBwb3dlci1vZi10d28gdGhhdCB3aWxsIGFjY29tbW9kYXRlIG91ciBzdXJmYWNlCiAgICAgICAgICAgICAgICAgR0x1aW50IHR3ID0gMSA8PCAoMzEgLSBjbHoodC53aWR0aCkpOwogICAgICAgICAgICAgICAgIEdMdWludCB0aCA9IDEgPDwgKDMxIC0gY2x6KHQuaGVpZ2h0KSk7CiAgICAgICAgICAgICAgICAgaWYgKHR3IDwgdC53aWR0aCkgIHR3IDw8PSAxOwpAQCAtNTU2LDcgKzU1Niw3IEBACiAgICAgR0x1aW50IHRleHR1cmVfdyA9IHR3OwogICAgIEdMdWludCB0ZXh0dXJlX2ggPSB0aDsKICAgICBpZiAoIShmbGFncyAmIERpc3BsYXlIYXJkd2FyZTo6TlBPVF9FWFRFTlNJT04pKSB7Ci0gICAgICAgIC8vIGZpbmQgdGhlIHNtYWxlc3QgcG93ZXItb2YtdHdvIHRoYXQgd2lsbCBhY2NvbW9kYXRlIG91ciBzdXJmYWNlCisgICAgICAgIC8vIGZpbmQgdGhlIHNtYWxsZXN0IHBvd2VyLW9mLXR3byB0aGF0IHdpbGwgYWNjb21tb2RhdGUgb3VyIHN1cmZhY2UKICAgICAgICAgdGV4dHVyZV93ID0gMSA8PCAoMzEgLSBjbHoodC53aWR0aCkpOwogICAgICAgICB0ZXh0dXJlX2ggPSAxIDw8ICgzMSAtIGNseih0LmhlaWdodCkpOwogICAgICAgICBpZiAodGV4dHVyZV93IDwgdC53aWR0aCkgIHRleHR1cmVfdyA8PD0gMTsKQEAgLTU4Miw2ICs1ODIsOCBAQAogICAgICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX0RJUkVDVF9URVhUVVJFXzJEX1FVQUxDT01NLCAwLAogICAgICAgICAgICAgICAgICAgICBHTF9SR0JBLCB0dywgdGgsIDAsCiAgICAgICAgICAgICAgICAgICAgIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIHQuZGF0YSk7CisgICAgICAgIH0gZWxzZSBpZiAodC5mb3JtYXQgPT0gR0dMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODgpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGFkZCBHTF9CR1JBIGV4dGVuc2lvbgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gb29wcywgd2UgZG9uJ3QgaGFuZGxlIHRoaXMgZm9ybWF0LCB0cnkgdGhlIHJlZ3VsYXIgcGF0aAogICAgICAgICAgICAgZ290byByZWd1bGFyOwpAQCAtNTkyLDcgKzU5NCw3IEBACiByZWd1bGFyOgogICAgICAgICBSZWN0IGJvdW5kcyhkaXJ0eS5ib3VuZHMoKSk7CiAgICAgICAgIEdMdm9pZCogZGF0YSA9IDA7Ci0gICAgICAgIGlmICh0ZXh0dXJlX3chPXRleHR1cmVXaWR0aCB8fCB0ZXh0dXJlX3chPXRleHR1cmVIZWlnaHQpIHsKKyAgICAgICAgaWYgKHRleHR1cmVfdyE9dGV4dHVyZVdpZHRoIHx8IHRleHR1cmVfaCE9dGV4dHVyZUhlaWdodCkgewogICAgICAgICAgICAgLy8gdGV4dHVyZSBzaXplIGNoYW5nZWQsIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQogCiAgICAgICAgICAgICBpZiAoIXRleHR1cmVXaWR0aCB8fCAhdGV4dHVyZUhlaWdodCkgewpAQCAtNjA2LDMxICs2MDgsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgYm91bmRzLnNldChSZWN0KHR3LCB0aCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgCiAgICAgICAgICAgICBpZiAodC5mb3JtYXQgPT0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1KSB7CiAgICAgICAgICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBHTF9SR0IsIHR3LCB0aCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMX1JHQiwgdGV4dHVyZV93LCB0ZXh0dXJlX2gsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCBkYXRhKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAodC5mb3JtYXQgPT0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQpIHsKICAgICAgICAgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdMX1JHQkEsIHR3LCB0aCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMX1JHQkEsIHRleHR1cmVfdywgdGV4dHVyZV9oLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgR0xfUkdCQSwgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCwgZGF0YSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHQuZm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4KSB7CiAgICAgICAgICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBHTF9SR0JBLCB0dywgdGgsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBHTF9SR0JBLCB0ZXh0dXJlX3csIHRleHR1cmVfaCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIGRhdGEpOwogICAgICAgICAgICAgfSBlbHNlIGlmICggdC5mb3JtYXQgPT0gR0dMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfU1AgfHwKICAgICAgICAgICAgICAgICAgICAgICAgIHQuZm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1NQKSB7CiAgICAgICAgICAgICAgICAgLy8ganVzdCBzaG93IHRoZSBZIHBsYW5lIG9mIFlVViBidWZmZXJzCiAgICAgICAgICAgICAgICAgZGF0YSA9IHQuZGF0YTsKICAgICAgICAgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdMX0xVTUlOQU5DRSwgdHcsIHRoLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgR0xfTFVNSU5BTkNFLCB0ZXh0dXJlX3csIHRleHR1cmVfaCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgIEdMX0xVTUlOQU5DRSwgR0xfVU5TSUdORURfQllURSwgZGF0YSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIG9vcHMsIHdlIGRvbid0IGhhbmRsZSB0aGlzIGZvcm1hdCEKKyAgICAgICAgICAgICAgICBMT0dFKCJsYXllciAlcCwgdGV4dHVyZT0lZCwgdXNpbmcgZm9ybWF0ICVkLCB3aGljaCBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgInN1cHBvcnRlZCBieSB0aGUgR0wiLCB0aGlzLCB0ZXh0dXJlTmFtZSwgdC5mb3JtYXQpOworICAgICAgICAgICAgICAgIHRleHR1cmVOYW1lID0gLTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0ZXh0dXJlV2lkdGggPSB0dzsKLSAgICAgICAgICAgIHRleHR1cmVIZWlnaHQgPSB0aDsKKyAgICAgICAgICAgIHRleHR1cmVXaWR0aCA9IHRleHR1cmVfdzsKKyAgICAgICAgICAgIHRleHR1cmVIZWlnaHQgPSB0ZXh0dXJlX2g7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFkYXRhKSB7CisgICAgICAgIGlmICghZGF0YSAmJiB0ZXh0dXJlTmFtZT49MCkgewogICAgICAgICAgICAgaWYgKHQuZm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSkgewogICAgICAgICAgICAgICAgIGdsVGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgMCwgYm91bmRzLnRvcCwgdC53aWR0aCwgYm91bmRzLmhlaWdodCgpLApkaWZmIC0tZ2l0IGEvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuaCBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmgKaW5kZXggMTBjMWJjMS4uYjNmMzc3MSAxMDA2NDQKLS0tIGEvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuaAorKysgYi9saWJzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5oCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8cHJpdmF0ZS91aS9MYXllclN0YXRlLmg+CiAKICNpbmNsdWRlIDx1aS9SZWdpb24uaD4KKyNpbmNsdWRlIDx1aS9PdmVybGF5Lmg+CisKICNpbmNsdWRlIDxwaXhlbGZsaW5nZXIvcGl4ZWxmbGluZ2VyLmg+CiAKICNpbmNsdWRlICJUcmFuc2Zvcm0uaCIKQEAgLTIyMywxNiArMjI1LDE0IEBACiAgICAgICAgIFN1cmZhY2UoU3VyZmFjZUlEIGlkLCBpbnQgaWRlbnRpdHkpIHsgCiAgICAgICAgICAgICBtUGFyYW1zLnRva2VuID0gaWQ7CiAgICAgICAgICAgICBtUGFyYW1zLmlkZW50aXR5ID0gaWRlbnRpdHk7Ci0gICAgICAgICAgICBtUGFyYW1zLnR5cGUgPSAwOwogICAgICAgICB9CiAgICAgICAgIFN1cmZhY2UoU3VyZmFjZUlEIGlkLCAKICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAwLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcDEsCi0gICAgICAgICAgICAgICAgaW50IG1lbW9yeV90eXBlLCBpbnQgaWRlbnRpdHkpCisgICAgICAgICAgICAgICAgaW50IGlkZW50aXR5KQogICAgICAgICB7CiAgICAgICAgICAgICBtUGFyYW1zLnRva2VuID0gaWQ7CiAgICAgICAgICAgICBtUGFyYW1zLmlkZW50aXR5ID0gaWRlbnRpdHk7Ci0gICAgICAgICAgICBtUGFyYW1zLnR5cGUgPSBtZW1vcnlfdHlwZTsKICAgICAgICAgICAgIG1QYXJhbXMuaGVhcFswXSA9IGhlYXAwOwogICAgICAgICAgICAgbVBhcmFtcy5oZWFwWzFdID0gaGVhcDE7CiAgICAgICAgIH0KQEAgLTI0MCw4ICsyNDAsOCBAQAogICAgICAgICAgICAgLy8gVE9ETzogV2Ugbm93IGhhdmUgYSBwb2ludCBoZXJlIHdlcmUgd2UgY2FuIGNsZWFuLXVwIHRoZQogICAgICAgICAgICAgLy8gY2xpZW50J3MgbWVzcy4KICAgICAgICAgICAgIC8vIFRoaXMgaXMgYWxzbyB3aGVyZSBzdXJmYWNlIGlkIHNob3VsZCBiZSByZWN5Y2xlZC4KLSAgICAgICAgICAgIC8vTE9HRCgiU3VyZmFjZSAlZCwgaGVhcHM9eyVwLCAlcH0sIHR5cGU9JWQgZGVzdHJveWVkIiwKLSAgICAgICAgICAgIC8vICAgICAgICBtSWQsIG1IZWFwWzBdLmdldCgpLCBtSGVhcFsxXS5nZXQoKSwgbU1lbW9yeVR5cGUpOworICAgICAgICAgICAgLy9MT0dEKCJTdXJmYWNlICVkLCBoZWFwcz17JXAsICVwfSBkZXN0cm95ZWQiLAorICAgICAgICAgICAgLy8gICAgICAgIG1JZCwgbUhlYXBbMF0uZ2V0KCksIG1IZWFwWzFdLmdldCgpKTsKICAgICAgICAgfQogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBnZXRTdXJmYWNlRGF0YSgKQEAgLTI1NCw2ICsyNTQsMTAgQEAKICAgICAgICAgICAgICAgICB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQogICAgICAgICB2aXJ0dWFsIHZvaWQgcG9zdEJ1ZmZlcihzc2l6ZV90IG9mZnNldCkgeyB9CiAgICAgICAgIHZpcnR1YWwgdm9pZCB1bnJlZ2lzdGVyQnVmZmVycygpIHsgfTsKKyAgICAgICAgdmlydHVhbCBzcDxPdmVybGF5PiBjcmVhdGVPdmVybGF5KAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGludDMyX3QgZm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfTsKIAogICAgIHByaXZhdGU6CiAgICAgICAgIElTdXJmYWNlRmxpbmdlckNsaWVudDo6c3VyZmFjZV9kYXRhX3QgbVBhcmFtczsKZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCbHVyLmNwcCBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCbHVyLmNwcAppbmRleCAxOTJjZWRhLi5lM2FlN2ZiIDEwMDY0NAotLS0gYS9saWJzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmx1ci5jcHAKKysrIGIvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllckJsdXIuY3BwCkBAIC0xNDUsMTEgKzE0NSwxMyBAQAogICAgICAgICAgICAgbVJlZnJlc2hDYWNoZSA9IGZhbHNlOwogICAgICAgICAgICAgbUF1dG9SZWZyZXNoUGVuZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgCi0gICAgICAgICAgICB1aW50MTZfdCogY29uc3QgcGl4ZWxzID0gKHVpbnQxNl90KiltYWxsb2ModypoKjIpOworICAgICAgICAgICAgLy8gYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSBmb3IgNC1ieXRlcyAoMiBwaXhlbHMpIGFsaWduZWQgZGF0YQorICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzID0gKHcgKyAxKSAmIH4xOworICAgICAgICAgICAgdWludDE2X3QqIGNvbnN0IHBpeGVscyA9ICh1aW50MTZfdCopbWFsbG9jKHMqaCoyKTsKIAotICAgICAgICAgICAgLy8gdGhpcyByZWFkcyB0aGUgZnJhbWUtYnVmZmVyLCBzbyBhIGgvdyBHTCB3b3VsZCBoYXZlIHRvCisgICAgICAgICAgICAvLyBUaGlzIHJlYWRzIHRoZSBmcmFtZS1idWZmZXIsIHNvIGEgaC93IEdMIHdvdWxkIGhhdmUgdG8KICAgICAgICAgICAgIC8vIGZpbmlzaCgpIGl0cyByZW5kZXJpbmcgZmlyc3QuIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhhdAotICAgICAgICAgICAgLy8gdG9vIG9mdGVuLgorICAgICAgICAgICAgLy8gdG9vIG9mdGVuLiBSZWFkIGRhdGEgaXMgNC1ieXRlcyBhbGlnbmVkLgogICAgICAgICAgICAgZ2xSZWFkUGl4ZWxzKFgsIFksIHcsIGgsIEdMX1JHQiwgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsIHBpeGVscyk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIC8vIGJsdXIgdGhhdCB0ZXh0dXJlLgpAQCAtMTU3LDcgKzE1OSw3IEBACiAgICAgICAgICAgICBibC52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOwogICAgICAgICAgICAgYmwud2lkdGggPSB3OwogICAgICAgICAgICAgYmwuaGVpZ2h0ID0gaDsKLSAgICAgICAgICAgIGJsLnN0cmlkZSA9IHc7CisgICAgICAgICAgICBibC5zdHJpZGUgPSBzOwogICAgICAgICAgICAgYmwuZm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OwogICAgICAgICAgICAgYmwuZGF0YSA9IChHR0x1Ynl0ZSopcGl4ZWxzOyAgICAgICAgICAgIAogICAgICAgICAgICAgYmx1ckZpbHRlcigmYmwsIDgsIDIpOwpkaWZmIC0tZ2l0IGEvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllckJ1ZmZlci5jcHAgYi9saWJzL3N1cmZhY2VmbGluZ2VyL0xheWVyQnVmZmVyLmNwcAppbmRleCBkODcxZmMzLi4zODYxZTY4IDEwMDY0NAotLS0gYS9saWJzL3N1cmZhY2VmbGluZ2VyL0xheWVyQnVmZmVyLmNwcAorKysgYi9saWJzL3N1cmZhY2VmbGluZ2VyL0xheWVyQnVmZmVyLmNwcApAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgICAgICAqIHRoZSByZXF1ZXN0ZWQgc2NhbGUgZmFjdG9yLCBpbiB3aGljaCBjYXNlIHdlIHBlcmZvcm0gdGhlIHNjYWxpbmcKICAgICAgICAgICogaW4gc2V2ZXJhbCBwYXNzZXMuICovCiAKLSAgICAgICAgY29weWJpdF90KiBjb3B5Yml0ID0gbUZsaW5nZXItPmdldEJsaXRFbmdpbmUoKTsKKyAgICAgICAgY29weWJpdF9kZXZpY2VfdCogY29weWJpdCA9IG1GbGluZ2VyLT5nZXRCbGl0RW5naW5lKCk7CiAgICAgICAgIGNvbnN0IGZsb2F0IG1pbiA9IGNvcHliaXQtPmdldChjb3B5Yml0LCBDT1BZQklUX01JTklGSUNBVElPTl9MSU1JVCk7CiAgICAgICAgIGNvbnN0IGZsb2F0IG1hZyA9IGNvcHliaXQtPmdldChjb3B5Yml0LCBDT1BZQklUX01BR05JRklDQVRJT05fTElNSVQpOwogCkBAIC0xMjMsNyArMTIzLDcgQEAKICAgICAgICAgICAgIGlmIChVTkxJS0VMWShtVGVtcG9yYXJ5RGVhbGVyID09IDApKSB7CiAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGUgYSBtZW1vcnktZGVhbGVyIGZvciB0aGlzIHRoZSBmaXJzdCB0aW1lCiAgICAgICAgICAgICAgICAgbVRlbXBvcmFyeURlYWxlciA9IG1GbGluZ2VyLT5nZXRTdXJmYWNlSGVhcE1hbmFnZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLT5jcmVhdGVIZWFwKE5BVElWRV9NRU1PUllfVFlQRV9QTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+Y3JlYXRlSGVhcChJU3VyZmFjZUNvbXBvc2VyOjplSGFyZHdhcmUpOwogICAgICAgICAgICAgICAgIG1UZW1wQml0bWFwLmluaXQobVRlbXBvcmFyeURlYWxlcik7CiAgICAgICAgICAgICB9CiAKQEAgLTIzMCw3ICsyMzAsMTggQEAKIHN0YXR1c190IExheWVyQnVmZmVyOjpyZWdpc3RlckJ1ZmZlcnMoaW50IHcsIGludCBoLCBpbnQgaHN0cmlkZSwgaW50IHZzdHJpZGUsCiAgICAgICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQsIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgbWVtb3J5SGVhcCkKIHsKLSAgICBzdGF0dXNfdCBlcnIgPSAobWVtb3J5SGVhcCE9MCAmJiBtZW1vcnlIZWFwLT5oZWFwSUQoKSA+PSAwKSA/IE5PX0VSUk9SIDogTk9fSU5JVDsKKyAgICBpZiAobWVtb3J5SGVhcCA9PSBOVUxMKSB7CisgICAgICAgIC8vIHRoaXMgaXMgYWxsb3dlZCwgYnV0IGluIHRoaXMgY2FzZSwgaXQgaXMgaWxsZWdhbCB0byByZWNlaXZlCisgICAgICAgIC8vIHBvc3RCdWZmZXIoKS4gVGhlIHN1cmZhY2UganVzdCBlcmFzZXMgdGhlIGZyYW1lYnVmZmVyIHdpdGgKKyAgICAgICAgLy8gZnVsbHkgdHJhbnNwYXJlbnQgcGl4ZWxzLgorICAgICAgICBtSGVhcC5jbGVhcigpOworICAgICAgICBtV2lkdGggPSB3OworICAgICAgICBtSGVpZ2h0ID0gaDsKKyAgICAgICAgbU5lZWRzQmxlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICAKKyAgICBzdGF0dXNfdCBlcnIgPSAobWVtb3J5SGVhcC0+aGVhcElEKCkgPj0gMCkgPyBOT19FUlJPUiA6IE5PX0lOSVQ7CiAgICAgaWYgKGVyciAhPSBOT19FUlJPUikKICAgICAgICAgcmV0dXJuIGVycjsKIApAQCAtMjgxLDYgKzI5MiwzMiBAQAogICAgIGludmFsaWRhdGVMb2NrZWQoKTsKIH0KIAorc3A8T3ZlcmxheT4gTGF5ZXJCdWZmZXI6OmNyZWF0ZU92ZXJsYXkodWludDMyX3QgdywgdWludDMyX3QgaCwgaW50MzJfdCBmb3JtYXQpCit7CisgICAgc3A8T3ZlcmxheT4gcmVzdWx0OworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1IZWFwICE9IDAgfHwgbUJ1ZmZlciAhPSAwKSB7CisgICAgICAgIC8vIHdlJ3JlIGEgcHVzaCBzdXJmYWNlLiBlcnJvci4KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgb3ZlcmxheV9kZXZpY2VfdCogb3ZlcmxheV9kZXYgPSBtRmxpbmdlci0+Z2V0T3ZlcmxheUVuZ2luZSgpOworICAgIGlmIChvdmVybGF5X2RldiA9PSBOVUxMKSB7CisgICAgICAgIC8vIG92ZXJsYXlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBvdmVybGF5X3QqIG92ZXJsYXkgPSBvdmVybGF5X2Rldi0+Y3JlYXRlT3ZlcmxheShvdmVybGF5X2RldiwgdywgaCwgZm9ybWF0KTsKKyAgICBpZiAob3ZlcmxheSA9PSBOVUxMKSB7CisgICAgICAgIC8vIGNvdWxkbid0IGNyZWF0ZSB0aGUgb3ZlcmxheSAobm8gbWVtb3J5PyBubyBtb3JlIG92ZXJsYXlzPykKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgLyogVE9ETzogaW1wbGVtZW50IHRoZSByZWFsIHN0dWZmIGhlcmUgKi8KKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiBzcDxMYXllckJ1ZmZlcjo6QnVmZmVyPiBMYXllckJ1ZmZlcjo6Z2V0QnVmZmVyKCkgY29uc3QKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMzMwLDYgKzM2NywxNSBAQAogICAgICAgICBvd25lci0+dW5yZWdpc3RlckJ1ZmZlcnMoKTsKIH0KIAorc3A8T3ZlcmxheT4gTGF5ZXJCdWZmZXI6OlN1cmZhY2VCdWZmZXI6OmNyZWF0ZU92ZXJsYXkoCisgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGludDMyX3QgZm9ybWF0KSB7CisgICAgc3A8T3ZlcmxheT4gcmVzdWx0OworICAgIExheWVyQnVmZmVyKiBvd25lcihnZXRPd25lcigpKTsKKyAgICBpZiAob3duZXIpCisgICAgICAgIHJlc3VsdCA9IG93bmVyLT5jcmVhdGVPdmVybGF5KHcsIGgsIGZvcm1hdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwogdm9pZCBMYXllckJ1ZmZlcjo6U3VyZmFjZUJ1ZmZlcjo6ZGlzb3duKCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpkaWZmIC0tZ2l0IGEvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllckJ1ZmZlci5oIGIvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllckJ1ZmZlci5oCmluZGV4IGVmNDczZGQuLjNlNjE2ZjIgMTAwNjQ0Ci0tLSBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCdWZmZXIuaAorKysgYi9saWJzL3N1cmZhY2VmbGluZ2VyL0xheWVyQnVmZmVyLmgKQEAgLTMzLDYgKzMzLDcgQEAKIAogY2xhc3MgTWVtb3J5RGVhbGVyOwogY2xhc3MgUmVnaW9uOworY2xhc3MgT3ZlcmxheTsKIAogY2xhc3MgTGF5ZXJCdWZmZXIgOiBwdWJsaWMgTGF5ZXJCYXNlQ2xpZW50CiB7CkBAIC01Niw2ICs1Nyw3IEBACiAgICAgICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQsIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCk7CiAgICAgdm9pZCBwb3N0QnVmZmVyKHNzaXplX3Qgb2Zmc2V0KTsKICAgICB2b2lkIHVucmVnaXN0ZXJCdWZmZXJzKCk7CisgICAgc3A8T3ZlcmxheT4gY3JlYXRlT3ZlcmxheSh1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBpbnQzMl90IGZvcm1hdCk7CiAgICAgdm9pZCBpbnZhbGlkYXRlKCk7CiAgICAgdm9pZCBpbnZhbGlkYXRlTG9ja2VkKCk7CiAKQEAgLTEwNyw3ICsxMDksOSBAQAogICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwKTsKICAgICAgICAgdmlydHVhbCB2b2lkIHBvc3RCdWZmZXIoc3NpemVfdCBvZmZzZXQpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgdW5yZWdpc3RlckJ1ZmZlcnMoKTsKLSAgICAgICAgdm9pZCBkaXNvd24oKTsKKyAgICAgICAgdmlydHVhbCBzcDxPdmVybGF5PiBjcmVhdGVPdmVybGF5KAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGludDMyX3QgZm9ybWF0KTsKKyAgICAgICB2b2lkIGRpc293bigpOwogICAgIHByaXZhdGU6CiAgICAgICAgIExheWVyQnVmZmVyKiBnZXRPd25lcigpIGNvbnN0IHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CmRpZmYgLS1naXQgYS9saWJzL3N1cmZhY2VmbGluZ2VyL0xheWVyRGltLmNwcCBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJEaW0uY3BwCmluZGV4IGZjMjNkNTMuLjBjMzQ3Y2MgMTAwNjQ0Ci0tLSBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJEaW0uY3BwCisrKyBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJEaW0uY3BwCkBAIC00OCw3ICs0OCw3IEBACiB7CiAgICAgLy8gbXVzdCBvbmx5IGJlIGNhbGxlZCBvbmNlLgogICAgIG1EaW1tZXJEZWFsZXIgPSBmbGluZ2VyLT5nZXRTdXJmYWNlSGVhcE1hbmFnZXIoKQotICAgICAgICAgICAgLT5jcmVhdGVIZWFwKE5BVElWRV9NRU1PUllfVFlQRV9QTUVNKTsKKyAgICAgICAgICAgIC0+Y3JlYXRlSGVhcChJU3VyZmFjZUNvbXBvc2VyOjplSGFyZHdhcmUpOwogICAgIGlmIChtRGltbWVyRGVhbGVyICE9IDApIHsKICAgICAgICAgbURpbW1lckJpdG1hcC5pbml0KG1EaW1tZXJEZWFsZXIpOwogICAgICAgICBtRGltbWVyQml0bWFwLnNldEJpdHModywgaCwgMSwgUElYRUxfRk9STUFUX1JHQl81NjUpOwpAQCAtODEsNyArODEsNyBAQAogICAgICAgICAgICAgbURpbW1lckJpdG1hcC5nZXRCaXRtYXBTdXJmYWNlKCZzcmMpOwogICAgICAgICAgICAgY29uc3QgY29weWJpdF9yZWN0X3QmIHNyZWN0KGRyZWN0KTsKIAotICAgICAgICAgICAgY29weWJpdF90KiBjb3B5Yml0ID0gbUZsaW5nZXItPmdldEJsaXRFbmdpbmUoKTsKKyAgICAgICAgICAgIGNvcHliaXRfZGV2aWNlX3QqIGNvcHliaXQgPSBtRmxpbmdlci0+Z2V0QmxpdEVuZ2luZSgpOwogICAgICAgICAgICAgY29weWJpdC0+c2V0X3BhcmFtZXRlcihjb3B5Yml0LCBDT1BZQklUX1RSQU5TRk9STSwgMCk7CiAgICAgICAgICAgICBjb3B5Yml0LT5zZXRfcGFyYW1ldGVyKGNvcHliaXQsIENPUFlCSVRfUExBTkVfQUxQSEEsIHMuYWxwaGEpOwogICAgICAgICAgICAgY29weWJpdC0+c2V0X3BhcmFtZXRlcihjb3B5Yml0LCBDT1BZQklUX0RJVEhFUiwgQ09QWUJJVF9FTkFCTEUpOwpkaWZmIC0tZ2l0IGEvbGlicy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5jcHAgYi9saWJzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmNwcAppbmRleCA0NTQ5NmIyLi5lOGRlMjFhIDEwMDY0NAotLS0gYS9saWJzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmNwcAorKysgYi9saWJzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmNwcApAQCAtMzgsNyArMzgsNiBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RvcFdhdGNoLmg+CiAKLSNpbmNsdWRlIDx1aS9CbGl0SGFyZHdhcmUuaD4KICNpbmNsdWRlIDx1aS9QaXhlbEZvcm1hdC5oPgogI2luY2x1ZGUgPHVpL0Rpc3BsYXlJbmZvLmg+CiAjaW5jbHVkZSA8dWkvRUdMRGlzcGxheVN1cmZhY2UuaD4KQEAgLTIwMiwyMyArMjAxLDYgQEAKIHsKICAgICBMT0dJKCJTdXJmYWNlRmxpbmdlciBpcyBzdGFydGluZyIpOwogCi0gICAgLy8gY3JlYXRlIHRoZSBzaGFyZWQgY29udHJvbC1ibG9jawotICAgIG1TZXJ2ZXJIZWFwID0gbmV3IE1lbW9yeURlYWxlcig0MDk2LCBNZW1vcnlEZWFsZXI6OlJFQURfT05MWSk7Ci0gICAgTE9HRV9JRihtU2VydmVySGVhcD09MCwgImNhbid0IGNyZWF0ZSBzaGFyZWQgbWVtb3J5IGRlYWxlciIpOwotCi0gICAgbVNlcnZlckNibGtNZW1vcnkgPSBtU2VydmVySGVhcC0+YWxsb2NhdGUoNDA5Nik7Ci0gICAgTE9HRV9JRihtU2VydmVyQ2Jsa01lbW9yeT09MCwgImNhbid0IGNyZWF0ZSBzaGFyZWQgY29udHJvbCBibG9jayIpOwotCi0gICAgbVNlcnZlckNibGsgPSBzdGF0aWNfY2FzdDxzdXJmYWNlX2ZsaW5nZXJfY2Jsa190ICo+KG1TZXJ2ZXJDYmxrTWVtb3J5LT5wb2ludGVyKCkpOwotICAgIExPR0VfSUYobVNlcnZlckNibGs9PTAsICJjYW4ndCBnZXQgdG8gc2hhcmVkIGNvbnRyb2wgYmxvY2sncyBhZGRyZXNzIik7Ci0gICAgbmV3KG1TZXJ2ZXJDYmxrKSBzdXJmYWNlX2ZsaW5nZXJfY2Jsa190OwotCi0gICAgLy8gY3JlYXRlIHRoZSBzdXJmYWNlIEhlYXAgbWFuYWdlciwgd2hpY2ggbWFuYWdlcyB0aGUgaGVhcHMKLSAgICAvLyAoYmUgaXQgaW4gUkFNIG9yIFZSQU0pIHdoZXJlIHN1cmZhY2VzIGFyZSBhbGxvY2F0ZWQKLSAgICAvLyBXZSBnaXZlIDggTUIgcGVyIGNsaWVudC4KLSAgICBtU3VyZmFjZUhlYXBNYW5hZ2VyID0gbmV3IFN1cmZhY2VIZWFwTWFuYWdlcig4IDw8IDIwKTsKLSAgICBtR1BVID0gbmV3IEdQVUhhcmR3YXJlKCk7Ci0KICAgICAvLyBkZWJ1Z2dpbmcgc3R1ZmYuLi4KICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CiAgICAgcHJvcGVydHlfZ2V0KCJkZWJ1Zy5zZi5zaG93dXBkYXRlcyIsIHZhbHVlLCAiMCIpOwpAQCAtMjQ0LDExICsyMjYsMTYgQEAKICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZtV29ybWhvbGVUZXhOYW1lKTsKIH0KIAotY29weWJpdF90KiBTdXJmYWNlRmxpbmdlcjo6Z2V0QmxpdEVuZ2luZSgpIGNvbnN0Citjb3B5Yml0X2RldmljZV90KiBTdXJmYWNlRmxpbmdlcjo6Z2V0QmxpdEVuZ2luZSgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKS5nZXRCbGl0RW5naW5lKCk7CiB9CiAKK292ZXJsYXlfZGV2aWNlX3QqIFN1cmZhY2VGbGluZ2VyOjpnZXRPdmVybGF5RW5naW5lKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpLmdldE92ZXJsYXlFbmdpbmUoKTsKK30KKwogc3A8SU1lbW9yeT4gU3VyZmFjZUZsaW5nZXI6OmdldENibGsoKSBjb25zdAogewogICAgIHJldHVybiBtU2VydmVyQ2Jsa01lbW9yeTsKQEAgLTI1Nyw3ICsyNDQsOSBAQAogc3RhdHVzX3QgU3VyZmFjZUZsaW5nZXI6OnJlcXVlc3RHUFUoY29uc3Qgc3A8SUdQVUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgIGdwdV9pbmZvX3QqIGdwdSkKIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBtR1BVLT5yZXF1ZXN0KGNhbGxiYWNrLCBncHUpOworICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgIGNvbnN0IGludCBwaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtR1BVLT5yZXF1ZXN0KHBpZCwgY2FsbGJhY2ssIGdwdSk7CiAgICAgcmV0dXJuIGVycjsKIH0KIApAQCAtMzYwLDcgKzM0OSwyNiBAQAogICAgIExPR0koICAgIlN1cmZhY2VGbGluZ2VyJ3MgbWFpbiB0aHJlYWQgcmVhZHkgdG8gcnVuLiAiCiAgICAgICAgICAgICAiSW5pdGlhbGl6aW5nIGdyYXBoaWNzIEgvVy4uLiIpOwogCi0gICAgLy8KKyAgICAvLyBjcmVhdGUgdGhlIHNoYXJlZCBjb250cm9sLWJsb2NrCisgICAgbVNlcnZlckhlYXAgPSBuZXcgTWVtb3J5RGVhbGVyKDQwOTYsIE1lbW9yeURlYWxlcjo6UkVBRF9PTkxZKTsKKyAgICBMT0dFX0lGKG1TZXJ2ZXJIZWFwPT0wLCAiY2FuJ3QgY3JlYXRlIHNoYXJlZCBtZW1vcnkgZGVhbGVyIik7CisKKyAgICBtU2VydmVyQ2Jsa01lbW9yeSA9IG1TZXJ2ZXJIZWFwLT5hbGxvY2F0ZSg0MDk2KTsKKyAgICBMT0dFX0lGKG1TZXJ2ZXJDYmxrTWVtb3J5PT0wLCAiY2FuJ3QgY3JlYXRlIHNoYXJlZCBjb250cm9sIGJsb2NrIik7CisKKyAgICBtU2VydmVyQ2JsayA9IHN0YXRpY19jYXN0PHN1cmZhY2VfZmxpbmdlcl9jYmxrX3QgKj4obVNlcnZlckNibGtNZW1vcnktPnBvaW50ZXIoKSk7CisgICAgTE9HRV9JRihtU2VydmVyQ2Jsaz09MCwgImNhbid0IGdldCB0byBzaGFyZWQgY29udHJvbCBibG9jaydzIGFkZHJlc3MiKTsKKyAgICBuZXcobVNlcnZlckNibGspIHN1cmZhY2VfZmxpbmdlcl9jYmxrX3Q7CisKKyAgICAvLyBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIEdQVSBpZiB3ZSBoYXZlIG9uZQorICAgIG1HUFUgPSBHUFVGYWN0b3J5OjpnZXRHUFUoKTsKKworICAgIC8vIGNyZWF0ZSB0aGUgc3VyZmFjZSBIZWFwIG1hbmFnZXIsIHdoaWNoIG1hbmFnZXMgdGhlIGhlYXBzCisgICAgLy8gKGJlIGl0IGluIFJBTSBvciBWUkFNKSB3aGVyZSBzdXJmYWNlcyBhcmUgYWxsb2NhdGVkCisgICAgLy8gV2UgZ2l2ZSA4IE1CIHBlciBjbGllbnQuCisgICAgbVN1cmZhY2VIZWFwTWFuYWdlciA9IG5ldyBTdXJmYWNlSGVhcE1hbmFnZXIodGhpcywgOCA8PCAyMCk7CisKKyAgICAKICAgICBHTEVTX2xvY2FsU3VyZmFjZU1hbmFnZXIgPSBzdGF0aWNfY2FzdDxJU3VyZmFjZUNvbXBvc2VyKj4odGhpcyk7CiAKICAgICAvLyB3ZSBvbmx5IHN1cHBvcnQgb25lIGRpc3BsYXkgY3VycmVudGx5CkBAIC0zOTUsNyArNDAzLDcgQEAKICAgICBkY2Jsay0+eGRwaSAgICAgICAgID0gaHcuZ2V0RHBpWCgpOwogICAgIGRjYmxrLT55ZHBpICAgICAgICAgPSBody5nZXREcGlZKCk7CiAgICAgZGNibGstPmZwcyAgICAgICAgICA9IGh3LmdldFJlZnJlc2hSYXRlKCk7Ci0gICAgZGNibGstPmRlbnNpdHkgICAgICA9IDEuMGY7IC8vIFhYWDogZG8gc29tZXRpbmcgbW9yZSByZWFsIGhlcmUuLi4KKyAgICBkY2Jsay0+ZGVuc2l0eSAgICAgID0gaHcuZ2V0RGVuc2l0eSgpOwogICAgIGFzbSB2b2xhdGlsZSAoIiI6OjoibWVtb3J5Iik7CiAKICAgICAvLyBJbml0aWFsaXplIE9wZW5HTHxFUwpAQCAtNDA3LDYgKzQxNSw3IEBACiAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CiAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKICAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDQpOworICAgIGdsUGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQsIDQpOyAKICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7CiAgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKICAgICBnbFNoYWRlTW9kZWwoR0xfRkxBVCk7CkBAIC0xNjc5LDcgKzE2ODgsNyBAQAogQ2xpZW50OjpDbGllbnQoQ2xpZW50SUQgY2xpZW50SUQsIGNvbnN0IHNwPFN1cmZhY2VGbGluZ2VyPiYgZmxpbmdlcikKICAgICA6IGN0cmxibGsoMCksIGNpZChjbGllbnRJRCksIG1QaWQoMCksIG1CaXRtYXAoMCksIG1GbGluZ2VyKGZsaW5nZXIpCiB7Ci0gICAgbVNoYXJlZEhlYXBBbGxvY2F0b3IgPSBnZXRTdXJmYWNlSGVhcE1hbmFnZXIoKS0+Y3JlYXRlSGVhcChOQVRJVkVfTUVNT1JZX1RZUEVfSEVBUCk7CisgICAgbVNoYXJlZEhlYXBBbGxvY2F0b3IgPSBnZXRTdXJmYWNlSGVhcE1hbmFnZXIoKS0+Y3JlYXRlSGVhcCgpOwogICAgIGNvbnN0IGludCBwZ3NpemUgPSBnZXRwYWdlc2l6ZSgpOwogICAgIGNvbnN0IGludCBjYmxrc2l6ZT0oKHNpemVvZihwZXJfY2xpZW50X2NibGtfdCkrKHBnc2l6ZS0xKSkmfihwZ3NpemUtMSkpOwogICAgIG1DYmxrSGVhcCA9IG5ldyBNZW1vcnlEZWFsZXIoY2Jsa3NpemUpOwpAQCAtMTcwMywxMCArMTcxMiw2IEBACiAgICAgcmV0dXJuIG1GbGluZ2VyLT5nZXRTdXJmYWNlSGVhcE1hbmFnZXIoKTsKIH0KIAotY29uc3Qgc3A8R1BVSGFyZHdhcmVJbnRlcmZhY2U+JiBDbGllbnQ6OmdldEdQVSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUZsaW5nZXItPmdldEdQVSgpOwotfQotCiBpbnQzMl90IENsaWVudDo6Z2VuZXJhdGVJZChpbnQgcGlkKQogewogICAgIGNvbnN0IHVpbnQzMl90IGkgPSBjbHooIH5tQml0bWFwICk7CkBAIC0xNzM0LDI1ICsxNzM5LDExIEBACiAgICAgfQogfQogCi1zcDxNZW1vcnlEZWFsZXI+IENsaWVudDo6Y3JlYXRlQWxsb2NhdG9yKGludCBtZW1vcnlfdHlwZSkKK3NwPE1lbW9yeURlYWxlcj4gQ2xpZW50OjpjcmVhdGVBbGxvY2F0b3IodWludDMyX3QgZmxhZ3MpCiB7CiAgICAgc3A8TWVtb3J5RGVhbGVyPiBhbGxvY2F0b3I7Ci0gICAgaWYgKG1lbW9yeV90eXBlID09IE5BVElWRV9NRU1PUllfVFlQRV9HUFUpIHsKLSAgICAgICAgYWxsb2NhdG9yID0gZ2V0R1BVKCktPnJlcXVlc3QoZ2V0Q2xpZW50UGlkKCkpOwotICAgICAgICBpZiAoYWxsb2NhdG9yID09IDApCi0gICAgICAgICAgICBtZW1vcnlfdHlwZSA9IE5BVElWRV9NRU1PUllfVFlQRV9QTUVNOwotICAgIH0KLSAgICBpZiAobWVtb3J5X3R5cGUgPT0gTkFUSVZFX01FTU9SWV9UWVBFX1BNRU0pIHsKLSAgICAgICAgYWxsb2NhdG9yID0gbVBNZW1BbGxvY2F0b3I7Ci0gICAgICAgIGlmIChhbGxvY2F0b3IgPT0gMCkgewotICAgICAgICAgICAgYWxsb2NhdG9yID0gZ2V0U3VyZmFjZUhlYXBNYW5hZ2VyKCktPmNyZWF0ZUhlYXAoCi0gICAgICAgICAgICAgICAgICAgIE5BVElWRV9NRU1PUllfVFlQRV9QTUVNKTsKLSAgICAgICAgICAgIG1QTWVtQWxsb2NhdG9yID0gYWxsb2NhdG9yOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChhbGxvY2F0b3IgPT0gMCkKLSAgICAgICAgYWxsb2NhdG9yID0gbVNoYXJlZEhlYXBBbGxvY2F0b3I7Ci0KKyAgICBhbGxvY2F0b3IgPSBnZXRTdXJmYWNlSGVhcE1hbmFnZXIoKS0+Y3JlYXRlSGVhcCgKKyAgICAgICAgICAgIGZsYWdzLCBnZXRDbGllbnRQaWQoKSwgbVNoYXJlZEhlYXBBbGxvY2F0b3IpOwogICAgIHJldHVybiBhbGxvY2F0b3I7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuaCBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuaAppbmRleCAxNTgxNDc0Li45MjAyMWQwIDEwMDY0NAotLS0gYS9saWJzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmgKKysrIGIvbGlicy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5oCkBAIC00MSw3ICs0MSw4IEBACiAjaW5jbHVkZSAiQm9vdEFuaW1hdGlvbi5oIgogI2luY2x1ZGUgIkJhcnJpZXIuaCIKIAotc3RydWN0IGNvcHliaXRfdDsKK3N0cnVjdCBjb3B5Yml0X2RldmljZV90Oworc3RydWN0IG92ZXJsYXlfZGV2aWNlX3Q7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNzQsNyArNzUsNyBAQAogICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgZ2VuZXJhdGVJZChpbnQgcGlkKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGZyZWUoaW50MzJfdCBpZCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBiaW5kTGF5ZXIoTGF5ZXJCYXNlQ2xpZW50KiBsYXllciwgaW50MzJfdCBpZCk7Ci0gICAgICAgICAgICBzcDxNZW1vcnlEZWFsZXI+ICAgICAgICBjcmVhdGVBbGxvY2F0b3IoaW50IG1lbW9yeV90eXBlKTsKKyAgICAgICAgICAgIHNwPE1lbW9yeURlYWxlcj4gICAgICAgIGNyZWF0ZUFsbG9jYXRvcih1aW50MzJfdCBtZW1vcnlfdHlwZSk7CiAKICAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgICAgIGlzVmFsaWQoaW50MzJfdCBpKSBjb25zdDsKICAgICBpbmxpbmUgIGNvbnN0IHVpbnQ4X3QqICAgICAgICAgIGluVXNlQXJyYXkoKSBjb25zdDsKQEAgLTkyLDcgKzkzLDYgQEAKICAgICAKIHByaXZhdGU6CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZ2V0Q2xpZW50UGlkKCkgY29uc3QgeyByZXR1cm4gbVBpZDsgfQotICAgIGNvbnN0IHNwPEdQVUhhcmR3YXJlSW50ZXJmYWNlPiYgIGdldEdQVSgpIGNvbnN0OwogICAgICAgICAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbVBpZDsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgbUJpdG1hcDsKQEAgLTE3OSw3ICsxNzksOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBtR1BVOyAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY29weWJpdF90KiBnZXRCbGl0RW5naW5lKCkgY29uc3Q7CisgICAgICAgICAgICBjb3B5Yml0X2RldmljZV90KiBnZXRCbGl0RW5naW5lKCkgY29uc3Q7CisgICAgICAgICAgICBvdmVybGF5X2RldmljZV90KiBnZXRPdmVybGF5RW5naW5lKCkgY29uc3Q7CiAgICAgICAgICAgICAKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIEJDbGllbnQ7CmRpZmYgLS1naXQgYS9saWJzL3N1cmZhY2VmbGluZ2VyL1ZSYW1IZWFwLmNwcCBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvVlJhbUhlYXAuY3BwCmluZGV4IDM4NTJkNTEuLjc3YmM1NzYgMTAwNjQ0Ci0tLSBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvVlJhbUhlYXAuY3BwCisrKyBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvVlJhbUhlYXAuY3BwCkBAIC0zNyw2ICszNyw4IEBACiAKICNpbmNsdWRlIDxHTEVTL2VnbG5hdGl2ZXMuaD4KIAorI2luY2x1ZGUgIkdQVUhhcmR3YXJlL0dQVUhhcmR3YXJlLmgiCisjaW5jbHVkZSAiU3VyZmFjZUZsaW5nZXIuaCIKICNpbmNsdWRlICJWUmFtSGVhcC5oIgogCiAjaWYgSEFWRV9BTkRST0lEX09TCkBAIC01OSw4ICs2MSw5IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1TdXJmYWNlSGVhcE1hbmFnZXI6OlN1cmZhY2VIZWFwTWFuYWdlcihzaXplX3QgY2xpZW50SGVhcFNpemUpCi0gICAgOiBtQ2xpZW50SGVhcFNpemUoY2xpZW50SGVhcFNpemUpCitTdXJmYWNlSGVhcE1hbmFnZXI6OlN1cmZhY2VIZWFwTWFuYWdlcihjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIsIAorICAgICAgICBzaXplX3QgY2xpZW50SGVhcFNpemUpCisgICAgOiBtRmxpbmdlcihmbGluZ2VyKSwgbUNsaWVudEhlYXBTaXplKGNsaWVudEhlYXBTaXplKQogewogICAgIFN1cmZhY2VIZWFwTWFuYWdlcjo6Z2xvYmFsX3BtZW1faGVhcCA9IDE7CiB9CkBAIC04MSwyNSArODQsNTMgQEAKICAgICB9CiB9CiAKLXNwPE1lbW9yeURlYWxlcj4gU3VyZmFjZUhlYXBNYW5hZ2VyOjpjcmVhdGVIZWFwKGludCB0eXBlKQorc3A8TWVtb3J5RGVhbGVyPiBTdXJmYWNlSGVhcE1hbmFnZXI6OmNyZWF0ZUhlYXAoCisgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICBwaWRfdCBjbGllbnRfcGlkLAorICAgICAgICBjb25zdCBzcDxNZW1vcnlEZWFsZXI+JiBkZWZhdWx0QWxsb2NhdG9yKQogewotICAgIGlmICghZ2xvYmFsX3BtZW1faGVhcCAmJiB0eXBlPT1OQVRJVkVfTUVNT1JZX1RZUEVfUE1FTSkKLSAgICAgICAgdHlwZSA9IE5BVElWRV9NRU1PUllfVFlQRV9IRUFQOwotCi0gICAgY29uc3Qgc3A8UE1lbUhlYXA+JiBoZWFwKG1QTWVtSGVhcCk7CiAgICAgc3A8TWVtb3J5RGVhbGVyPiBkZWFsZXI7IAotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgTkFUSVZFX01FTU9SWV9UWVBFX0hFQVA6Ci0gICAgICAgIGRlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIobUNsaWVudEhlYXBTaXplLCAwLCAiU0ZOYXRpdmVIZWFwIik7Ci0gICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBOQVRJVkVfTUVNT1JZX1RZUEVfUE1FTToKLSAgICAgICAgaWYgKGhlYXAgIT0gMCkgewotICAgICAgICAgICAgZGVhbGVyID0gbmV3IE1lbW9yeURlYWxlciggCi0gICAgICAgICAgICAgICAgICAgIGhlYXAtPmNyZWF0ZUNsaWVudEhlYXAoKSwKLSAgICAgICAgICAgICAgICAgICAgaGVhcC0+Z2V0QWxsb2NhdG9yKCkpOworICAgIGlmIChmbGFncyAmIElTdXJmYWNlQ29tcG9zZXI6OmVHUFUpIHsKKyAgICAgICAgLy8gZG9uJ3QgZ3JhbnQgR1BVIG1lbW9yeSBpZiBHUFUgaXMgZGlzYWJsZWQKKyAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICBwcm9wZXJ0eV9nZXQoImRlYnVnLmVnbC5odyIsIHZhbHVlLCAiMSIpOworICAgICAgICBpZiAoYXRvaSh2YWx1ZSkgPT0gMCkgeworICAgICAgICAgICAgZmxhZ3MgJj0gfklTdXJmYWNlQ29tcG9zZXI6OmVHUFU7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgSVN1cmZhY2VDb21wb3Nlcjo6ZUdQVSkgeworICAgICAgICAvLyBGSVhNRTogdGhpcyBpcyBtc203MjAxQSBzcGVjaWZpYywgd2hlcmUgZ3B1IHN1cmZhY2VzIG1heSBub3QgYmUgc2VjdXJlCisgICAgICAgIGlmICghKGZsYWdzICYgSVN1cmZhY2VDb21wb3Nlcjo6ZVNlY3VyZSkpIHsKKyAgICAgICAgICAgIC8vIGlmIEdQVSBkb2Vzbid0IHdvcmssIHdlIHRyeSBlSGFyZHdhcmUKKyAgICAgICAgICAgIGZsYWdzIHw9IElTdXJmYWNlQ29tcG9zZXI6OmVIYXJkd2FyZTsKKyAgICAgICAgICAgIC8vIGFza2VkIGZvciBHUFUgbWVtb3J5LCB0cnkgdGhhdCBmaXJzdAorICAgICAgICAgICAgZGVhbGVyID0gbUZsaW5nZXItPmdldEdQVSgpLT5yZXF1ZXN0KGNsaWVudF9waWQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGRlYWxlciA9PSBOVUxMKSB7CisgICAgICAgIGlmIChkZWZhdWx0QWxsb2NhdG9yICE9IE5VTEwpCisgICAgICAgICAgICAvLyBpZiBhIGRlZmF1bHQgYWxsb2NhdG9yIGlzIGdpdmVuLCB1c2UgdGhhdAorICAgICAgICAgICAgZGVhbGVyID0gZGVmYXVsdEFsbG9jYXRvcjsKKyAgICB9CisgICAgCisgICAgaWYgKGRlYWxlciA9PSBOVUxMKSB7CisgICAgICAgIC8vIGFsd2F5cyB0cnkgaC93IGFjY2VsZXJhdGVkIG1lbW9yeSBmaXJzdAorICAgICAgICBpZiAoZ2xvYmFsX3BtZW1faGVhcCkgeworICAgICAgICAgICAgY29uc3Qgc3A8UE1lbUhlYXA+JiBoZWFwKG1QTWVtSGVhcCk7CisgICAgICAgICAgICBpZiAoZGVhbGVyID09IE5VTEwgJiYgaGVhcCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZGVhbGVyID0gbmV3IE1lbW9yeURlYWxlciggCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFwLT5jcmVhdGVDbGllbnRIZWFwKCksCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFwLT5nZXRBbGxvY2F0b3IoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZGVhbGVyID09IE5VTEwpIHsKKyAgICAgICAgLy8gcmV0dXJuIHRoZSBhc2htZW0gYWxsb2NhdG9yIChzb2Z0d2FyZSByZW5kZXJpbmcpCisgICAgICAgIGRlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIobUNsaWVudEhlYXBTaXplLCAwLCAiU0ZOYXRpdmVIZWFwIik7CiAgICAgfQogICAgIHJldHVybiBkZWFsZXI7CiB9CkBAIC0xMjIsMjIgKzE1Myw4IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1QTWVtSGVhcEludGVyZmFjZTo6UE1lbUhlYXBJbnRlcmZhY2UoaW50IGZkLCBzaXplX3Qgc2l6ZSkKLSAgICA6IE1lbW9yeUhlYXBCYXNlKGZkLCBzaXplKSB7Ci19Ci1QTWVtSGVhcEludGVyZmFjZTo6UE1lbUhlYXBJbnRlcmZhY2UoY29uc3QgY2hhciogZGV2aWNlLCBzaXplX3Qgc2l6ZSkKLSAgICA6IE1lbW9yeUhlYXBCYXNlKGRldmljZSwgc2l6ZSkgewotfQotUE1lbUhlYXBJbnRlcmZhY2U6OlBNZW1IZWFwSW50ZXJmYWNlKHNpemVfdCBzaXplLCB1aW50MzJfdCBmbGFncywgY2hhciBjb25zdCAqIG5hbWUpCi0gICAgOiBNZW1vcnlIZWFwQmFzZShzaXplLCBmbGFncywgbmFtZSkgewotfQotUE1lbUhlYXBJbnRlcmZhY2U6On5QTWVtSGVhcEludGVyZmFjZSgpIHsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KIFBNZW1IZWFwOjpQTWVtSGVhcChjb25zdCBjaGFyKiBjb25zdCBkZXZpY2UsIHNpemVfdCBzaXplLCBzaXplX3QgcmVzZXJ2ZWQpCi0gICAgOiBQTWVtSGVhcEludGVyZmFjZShkZXZpY2UsIHNpemUpCisgICAgOiBNZW1vcnlIZWFwQmFzZShkZXZpY2UsIHNpemUpCiB7CiAgICAgLy9MT0dEKCIlcywgJXAsIG1GRD0lZCIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHRoaXMsIGhlYXBJRCgpKTsKICAgICBpZiAoYmFzZSgpICE9IE1BUF9GQUlMRUQpIHsKZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvVlJhbUhlYXAuaCBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvVlJhbUhlYXAuaAppbmRleCAwM2UwMzM2Li45MTQwMTY3IDEwMDY0NAotLS0gYS9saWJzL3N1cmZhY2VmbGluZ2VyL1ZSYW1IZWFwLmgKKysrIGIvbGlicy9zdXJmYWNlZmxpbmdlci9WUmFtSGVhcC5oCkBAIC0yNywxNiArMjcsMTkgQEAKIAogY2xhc3MgUE1lbUhlYXA7CiBjbGFzcyBNZW1vcnlIZWFwUG1lbTsKK2NsYXNzIFN1cmZhY2VGbGluZ2VyOyAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIFN1cmZhY2VIZWFwTWFuYWdlciAgOiBwdWJsaWMgUmVmQmFzZQogewogcHVibGljOgotICAgIFN1cmZhY2VIZWFwTWFuYWdlcihzaXplX3QgY2xpZW50SGVhcFNpemUpOworICAgIFN1cmZhY2VIZWFwTWFuYWdlcihjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIsIHNpemVfdCBjbGllbnRIZWFwU2l6ZSk7CiAgICAgdmlydHVhbCB+U3VyZmFjZUhlYXBNYW5hZ2VyKCk7CiAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKLSAgICBzcDxNZW1vcnlEZWFsZXI+IGNyZWF0ZUhlYXAoaW50IHR5cGUpOworICAgIC8qIHVzZSBJU3VyZmFjZUNvbXBvc2VyIGZsYWdzIGVHUFV8ZUhBcmR3YXJlfGVTZWN1cmUgKi8KKyAgICBzcDxNZW1vcnlEZWFsZXI+IGNyZWF0ZUhlYXAodWludDMyX3QgZmxhZ3M9MCwgcGlkX3QgY2xpZW50X3BpZCA9IDAsCisgICAgICAgICAgICBjb25zdCBzcDxNZW1vcnlEZWFsZXI+JiBkZWZhdWx0QWxsb2NhdG9yID0gMCk7CiAgICAgCiAgICAgLy8gdXNlZCBmb3IgZGVidWdnaW5nIG9ubHkuLi4KICAgICBzcDxTaW1wbGVCZXN0Rml0QWxsb2NhdG9yPiBnZXRBbGxvY2F0b3IoaW50IHR5cGUpIGNvbnN0OwpAQCAtNDQsNiArNDcsNyBAQAogcHJpdmF0ZToKICAgICBzcDxQTWVtSGVhcD4gZ2V0SGVhcChpbnQgdHlwZSkgY29uc3Q7CiAKKyAgICBzcDxTdXJmYWNlRmxpbmdlcj4gbUZsaW5nZXI7CiAgICAgbXV0YWJsZSBNdXRleCAgIG1Mb2NrOwogICAgIHNpemVfdCAgICAgICAgICBtQ2xpZW50SGVhcFNpemU7CiAgICAgc3A8UE1lbUhlYXA+ICAgIG1QTWVtSGVhcDsKQEAgLTUyLDE5ICs1Niw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1jbGFzcyBQTWVtSGVhcEludGVyZmFjZSA6IHB1YmxpYyBNZW1vcnlIZWFwQmFzZQotewotcHVibGljOgotICAgIFBNZW1IZWFwSW50ZXJmYWNlKGludCBmZCwgc2l6ZV90IHNpemUpOwotICAgIFBNZW1IZWFwSW50ZXJmYWNlKGNvbnN0IGNoYXIqIGRldmljZSwgc2l6ZV90IHNpemUgPSAwKTsKLSAgICBQTWVtSGVhcEludGVyZmFjZShzaXplX3Qgc2l6ZSwgdWludDMyX3QgZmxhZ3MgPSAwLCBjaGFyIGNvbnN0ICogbmFtZSA9IE5VTEwpOwotICAgIHZpcnR1YWwgflBNZW1IZWFwSW50ZXJmYWNlKCk7Ci0gICAgdmlydHVhbCBzcDxNZW1vcnlIZWFwUG1lbT4gY3JlYXRlQ2xpZW50SGVhcCgpID0gMDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBQTWVtSGVhcCA6IHB1YmxpYyBQTWVtSGVhcEludGVyZmFjZQorY2xhc3MgUE1lbUhlYXAgOiBwdWJsaWMgTWVtb3J5SGVhcEJhc2UKIHsKIHB1YmxpYzoKICAgICAgICAgICAgICAgICBQTWVtSGVhcChjb25zdCBjaGFyKiBjb25zdCB2cmFtLApkaWZmIC0tZ2l0IGEvbGlicy91aS9BbmRyb2lkLm1rIGIvbGlicy91aS9BbmRyb2lkLm1rCmluZGV4IDcxNTc5YzUuLjdiNTEzMDAgMTAwNjQ0Ci0tLSBhL2xpYnMvdWkvQW5kcm9pZC5taworKysgYi9saWJzL3VpL0FuZHJvaWQubWsKQEAgLTIsNyArMiw2IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTOj0gXAotCUJsaXRIYXJkd2FyZS5jcHAgXAogCUNhbWVyYS5jcHAgXAogCUNhbWVyYVBhcmFtZXRlcnMuY3BwIFwKIAlFR0xEaXNwbGF5U3VyZmFjZS5jcHAgXApAQCAtMTQsMTAgKzEzLDEyIEBACiAJSUNhbWVyYS5jcHAgXAogCUlDYW1lcmFDbGllbnQuY3BwIFwKIAlJQ2FtZXJhU2VydmljZS5jcHAgXAorCUlPdmVybGF5LmNwcCBcCiAJSVN1cmZhY2VDb21wb3Nlci5jcHAgXAogCUlTdXJmYWNlLmNwcCBcCiAJSVN1cmZhY2VGbGluZ2VyQ2xpZW50LmNwcCBcCiAJTGF5ZXJTdGF0ZS5jcHAgXAorCU92ZXJsYXkuY3BwIFwKIAlQaXhlbEZvcm1hdC5jcHAgXAogCVBvaW50LmNwcCBcCiAJUmVjdC5jcHAgXApkaWZmIC0tZ2l0IGEvbGlicy91aS9CbGl0SGFyZHdhcmUuY3BwIGIvbGlicy91aS9CbGl0SGFyZHdhcmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDgzOGI0Li4wMDAwMDAwCi0tLSBhL2xpYnMvdWkvQmxpdEhhcmR3YXJlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdXJmYWNlRmxpbmdlciIKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLSNpZiBIQVZFX0FORFJPSURfT1MKLSNpbmNsdWRlIDxsaW51eC9mYi5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9tZHAuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8dWkvQmxpdEhhcmR3YXJlLmg+Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLWNsYXNzIENvcHliaXRNU003SyA6IHB1YmxpYyBjb3B5Yml0X3QgewotcHVibGljOgotICAgIENvcHliaXRNU003SygpOwotICAgIH5Db3B5Yml0TVNNN0soKTsKLSAgICAKLSAgICBzdGF0dXNfdCBnZXRTdGF0dXMoKSBjb25zdCB7Ci0gICAgICAgIGlmIChtRkQ8MCkgcmV0dXJuIG1GRDsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIHN0YXR1c190IHNldFBhcmFtZXRlcihpbnQgbmFtZSwgaW50IHZhbHVlKTsKLQotICAgIHN0YXR1c190IGdldChpbnQgbmFtZSk7Ci0KLSAgICBzdGF0dXNfdCBibGl0KCAKLSAgICAgICAgICAgIGNvbnN0IGNvcHliaXRfaW1hZ2VfdCYgZHN0LAotICAgICAgICAgICAgY29uc3QgY29weWJpdF9pbWFnZV90JiBzcmMsCi0gICAgICAgICAgICBjb3B5Yml0X3JlZ2lvbl90IGNvbnN0KiByZWdpb24pOwotCi0gICAgc3RhdHVzX3Qgc3RyZXRjaCggCi0gICAgICAgICAgICBjb25zdCBjb3B5Yml0X2ltYWdlX3QmIGRzdCwKLSAgICAgICAgICAgIGNvbnN0IGNvcHliaXRfaW1hZ2VfdCYgc3JjLCAKLSAgICAgICAgICAgIGNvbnN0IGNvcHliaXRfcmVjdF90JiBkc3RfcmVjdCwKLSAgICAgICAgICAgIGNvbnN0IGNvcHliaXRfcmVjdF90JiBzcmNfcmVjdCwKLSAgICAgICAgICAgIGNvcHliaXRfcmVnaW9uX3QgY29uc3QqIHJlZ2lvbik7Ci0KLSNpZiBIQVZFX0FORFJPSURfT1MKLXByaXZhdGU6Ci0gICAgc3RhdGljIGludCBjb3B5Yml0X3NldF9wYXJhbWV0ZXIoY29weWJpdF90KiBoYW5kbGUsIGludCBuYW1lLCBpbnQgdmFsdWUpOwotICAgIHN0YXRpYyBpbnQgY29weWJpdF9ibGl0KCBjb3B5Yml0X3QqIGhhbmRsZSwgCi0gICAgICAgICAgICBjb3B5Yml0X2ltYWdlX3QgY29uc3QqIGRzdCwgY29weWJpdF9pbWFnZV90IGNvbnN0KiBzcmMsCi0gICAgICAgICAgICBjb3B5Yml0X3JlZ2lvbl90IGNvbnN0KiByZWdpb24pOwotICAgIHN0YXRpYyBpbnQgY29weWJpdF9zdHJldGNoKGNvcHliaXRfdCogaGFuZGxlLCAKLSAgICAgICAgICAgIGNvcHliaXRfaW1hZ2VfdCBjb25zdCogZHN0LCAgY29weWJpdF9pbWFnZV90IGNvbnN0KiBzcmMsIAotICAgICAgICAgICAgY29weWJpdF9yZWN0X3QgY29uc3QqIGRzdF9yZWN0LCBjb3B5Yml0X3JlY3RfdCBjb25zdCogc3JjX3JlY3QsCi0gICAgICAgICAgICBjb3B5Yml0X3JlZ2lvbl90IGNvbnN0KiByZWdpb24pOwotICAgIHN0YXRpYyBpbnQgY29weWJpdF9nZXQoY29weWJpdF90KiBoYW5kbGUsIGludCBuYW1lKTsKLQotICAgIGludCBnZXRGb3JtYXQoaW50IGZvcm1hdCk7Ci0gICAgdm9pZCBzZXRJbWFnZShtZHBfaW1nKiBpbWcsIGNvbnN0IGNvcHliaXRfaW1hZ2VfdCYgcmhzKTsKLSAgICB2b2lkIHNldFJlY3RzKG1kcF9ibGl0X3JlcSogcmVxLCBjb25zdCBjb3B5Yml0X3JlY3RfdCYgZHN0LAotICAgICAgICAgICAgY29uc3QgY29weWJpdF9yZWN0X3QmIHNyYywgY29uc3QgY29weWJpdF9yZWN0X3QmIHNjaXNzb3IpOwotICAgIHZvaWQgc2V0SW5mb3MobWRwX2JsaXRfcmVxKiByZXEpOwotICAgIHN0YXRpYyB2b2lkIGludGVyc2VjdChjb3B5Yml0X3JlY3RfdCogb3V0LCAKLSAgICAgICAgICAgIGNvbnN0IGNvcHliaXRfcmVjdF90JiBsaHMsIGNvbnN0IGNvcHliaXRfcmVjdF90JiByaHMpOwotICAgIHN0YXR1c190IG1zbV9jb3B5Yml0KHZvaWQgY29uc3QqIGxpc3QpOwotI2VuZGlmCi0gICAgaW50IG1GRDsKLSAgICB1aW50OF90IG1BbHBoYTsKLSAgICB1aW50OF90IG1GbGFnczsKLX07Ci19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGNvcHliaXRfdCogY29weWJpdF9pbml0KCkKLXsKLSAgICBDb3B5Yml0TVNNN0sqIGVuZ2luZSA9IG5ldyBDb3B5Yml0TVNNN0soKTsKLSAgICBpZiAoZW5naW5lLT5nZXRTdGF0dXMoKSAhPSBOT19FUlJPUikgewotICAgICAgICBkZWxldGUgZW5naW5lOwotICAgICAgICBlbmdpbmUgPSAwOwotICAgIH0KLSAgICByZXR1cm4gKHN0cnVjdCBjb3B5Yml0X3QqKWVuZ2luZTsKLSAgICAgICAgCi19Ci0KLWludCBjb3B5Yml0X3Rlcm0oY29weWJpdF90KiBoYW5kbGUpCi17Ci0gICAgZGVsZXRlIHN0YXRpY19jYXN0PENvcHliaXRNU003Syo+KGhhbmRsZSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW5saW5lCi1pbnQgbWluKGludCBhLCBpbnQgYikgewotICAgIHJldHVybiAoYTxiKSA/IGEgOiBiOwotfQotCi1zdGF0aWMgaW5saW5lCi1pbnQgbWF4KGludCBhLCBpbnQgYikgewotICAgIHJldHVybiAoYT5iKSA/IGEgOiBiOwotfQotCi1zdGF0aWMgaW5saW5lCi12b2lkIE1VTERJVih1aW50MzJfdCYgYSwgdWludDMyX3QmIGIsIGludCBtdWwsIGludCBkaXYpCi17Ci0gICAgaWYgKG11bCAhPSBkaXYpIHsKLSAgICAgICAgYSA9IChtdWwgKiBhKSAvIGRpdjsKLSAgICAgICAgYiA9IChtdWwgKiBiKSAvIGRpdjsKLSAgICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIEhBVkVfQU5EUk9JRF9PUwotCi1pbnQgQ29weWJpdE1TTTdLOjpjb3B5Yml0X3NldF9wYXJhbWV0ZXIoY29weWJpdF90KiBoYW5kbGUsIGludCBuYW1lLCBpbnQgdmFsdWUpCi17Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENvcHliaXRNU003Syo+KGhhbmRsZSktPnNldFBhcmFtZXRlcihuYW1lLCB2YWx1ZSk7Ci19Ci0KLWludCBDb3B5Yml0TVNNN0s6OmNvcHliaXRfZ2V0KGNvcHliaXRfdCogaGFuZGxlLCBpbnQgbmFtZSkKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q29weWJpdE1TTTdLKj4oaGFuZGxlKS0+Z2V0KG5hbWUpOwotfQotCi1pbnQgQ29weWJpdE1TTTdLOjpjb3B5Yml0X2JsaXQoCi0gICAgICAgIGNvcHliaXRfdCogaGFuZGxlLCAKLSAgICAgICAgY29weWJpdF9pbWFnZV90IGNvbnN0KiBkc3QsIAotICAgICAgICBjb3B5Yml0X2ltYWdlX3QgY29uc3QqIHNyYywKLSAgICAgICAgc3RydWN0IGNvcHliaXRfcmVnaW9uX3QgY29uc3QqIHJlZ2lvbikKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q29weWJpdE1TTTdLKj4oaGFuZGxlKS0+YmxpdCgqZHN0LCAqc3JjLCByZWdpb24pOwotfQotCi1pbnQgQ29weWJpdE1TTTdLOjpjb3B5Yml0X3N0cmV0Y2goCi0gICAgICAgIGNvcHliaXRfdCogaGFuZGxlLCAKLSAgICAgICAgY29weWJpdF9pbWFnZV90IGNvbnN0KiBkc3QsIAotICAgICAgICBjb3B5Yml0X2ltYWdlX3QgY29uc3QqIHNyYywgCi0gICAgICAgIGNvcHliaXRfcmVjdF90IGNvbnN0KiBkc3RfcmVjdCwKLSAgICAgICAgY29weWJpdF9yZWN0X3QgY29uc3QqIHNyY19yZWN0LAotICAgICAgICBzdHJ1Y3QgY29weWJpdF9yZWdpb25fdCBjb25zdCogcmVnaW9uKQotewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDb3B5Yml0TVNNN0sqPihoYW5kbGUpLT5zdHJldGNoKAotICAgICAgICAgICAgKmRzdCwgKnNyYywgKmRzdF9yZWN0LCAqc3JjX3JlY3QsIHJlZ2lvbik7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29weWJpdE1TTTdLOjpDb3B5Yml0TVNNN0soKQotICAgIDogbUZEKC0xKSwgbUFscGhhKE1EUF9BTFBIQV9OT1ApLCBtRmxhZ3MoMCkKLXsKLSAgICBpbnQgZmQgPSBvcGVuKCIvZGV2L2dyYXBoaWNzL2ZiMCIsIE9fUkRXUiwgMCk7Ci0gICAgaWYgKGZkID4gMCkgewotICAgICAgICBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gZmluZm87Ci0gICAgICAgIGlmIChpb2N0bChmZCwgRkJJT0dFVF9GU0NSRUVOSU5GTywgJmZpbmZvKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChmaW5mby5pZCwgIm1zbWZiIikpIHsKLSAgICAgICAgICAgICAgICBtRkQgPSBmZDsKLSAgICAgICAgICAgICAgICBjb3B5Yml0X3Q6OnNldF9wYXJhbWV0ZXIgPSBjb3B5Yml0X3NldF9wYXJhbWV0ZXI7Ci0gICAgICAgICAgICAgICAgY29weWJpdF90OjpnZXQgPSBjb3B5Yml0X2dldDsKLSAgICAgICAgICAgICAgICBjb3B5Yml0X3Q6OmJsaXQgPSBjb3B5Yml0X2JsaXQ7Ci0gICAgICAgICAgICAgICAgY29weWJpdF90OjpzdHJldGNoID0gY29weWJpdF9zdHJldGNoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChmZDwwIHx8IG1GRDwwKSB7Ci0gICAgICAgIGlmIChmZD4wKSB7IGNsb3NlKGZkKTsgfQotICAgICAgICBtRkQgPSAtZXJybm87Ci0gICAgfQotfQotCi1Db3B5Yml0TVNNN0s6On5Db3B5Yml0TVNNN0soKQotewotICAgIGlmIChtRkQgPiAwKXsKLSAgICAgICAgY2xvc2UobUZEKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IENvcHliaXRNU003Szo6c2V0UGFyYW1ldGVyKGludCBuYW1lLCBpbnQgdmFsdWUpCi17Ci0gICAgc3dpdGNoKG5hbWUpIHsKLSAgICBjYXNlIENPUFlCSVRfUk9UQVRJT05fREVHOgotICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIG1GbGFncyAmPSB+MHg3OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICBtRmxhZ3MgJj0gfjB4NzsKLSAgICAgICAgICAgIG1GbGFncyB8PSBNRFBfUk9UXzkwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgwOgotICAgICAgICAgICAgbUZsYWdzICY9IH4weDc7Ci0gICAgICAgICAgICBtRmxhZ3MgfD0gTURQX1JPVF8xODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNzA6Ci0gICAgICAgICAgICBtRmxhZ3MgJj0gfjB4NzsKLSAgICAgICAgICAgIG1GbGFncyB8PSBNRFBfUk9UXzI3MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIENPUFlCSVRfUExBTkVfQUxQSEE6Ci0gICAgICAgIGlmICh2YWx1ZSA8IDApICAgICAgdmFsdWUgPSAwOwotICAgICAgICBpZiAodmFsdWUgPj0gMjU2KSAgIHZhbHVlID0gMjU1OwotICAgICAgICBtQWxwaGEgPSB2YWx1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDT1BZQklUX0RJVEhFUjoKLSAgICAgICAgaWYgKHZhbHVlID09IENPUFlCSVRfRU5BQkxFKSB7Ci0gICAgICAgICAgICBtRmxhZ3MgfD0gTURQX0RJVEhFUjsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBDT1BZQklUX0RJU0FCTEUpIHsKLSAgICAgICAgICAgIG1GbGFncyAmPSB+TURQX0RJVEhFUjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIENPUFlCSVRfVFJBTlNGT1JNOgotICAgICAgICBtRmxhZ3MgJj0gfjB4NzsKLSAgICAgICAgbUZsYWdzIHw9IHZhbHVlICYgMHg3OwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IENvcHliaXRNU003Szo6Z2V0KGludCBuYW1lKQotewotICAgIHN3aXRjaChuYW1lKSB7Ci0gICAgY2FzZSBDT1BZQklUX01JTklGSUNBVElPTl9MSU1JVDoKLSAgICAgICAgcmV0dXJuIDQ7Ci0gICAgY2FzZSBDT1BZQklUX01BR05JRklDQVRJT05fTElNSVQ6Ci0gICAgICAgIHJldHVybiA0OwotICAgIGNhc2UgQ09QWUJJVF9TQ0FMSU5HX0ZSQUNfQklUUzoKLSAgICAgICAgcmV0dXJuIDMyOwotICAgIGNhc2UgQ09QWUJJVF9ST1RBVElPTl9TVEVQX0RFRzoKLSAgICAgICAgcmV0dXJuIDkwOwotICAgIH0KLSAgICByZXR1cm4gQkFEX1ZBTFVFOwotfQotCi1zdGF0dXNfdCBDb3B5Yml0TVNNN0s6OmJsaXQoIAotICAgICAgICBjb25zdCBjb3B5Yml0X2ltYWdlX3QmIGRzdCwKLSAgICAgICAgY29uc3QgY29weWJpdF9pbWFnZV90JiBzcmMsCi0gICAgICAgIGNvcHliaXRfcmVnaW9uX3QgY29uc3QqIHJlZ2lvbikKLXsKLSAgICAKLSAgICBjb3B5Yml0X3JlY3RfdCBkciA9IHsgMCwgMCwgZHN0LncsIGRzdC5oIH07Ci0gICAgY29weWJpdF9yZWN0X3Qgc3IgPSB7IDAsIDAsIHNyYy53LCBzcmMuaCB9OwotICAgIHJldHVybiBDb3B5Yml0TVNNN0s6OnN0cmV0Y2goZHN0LCBzcmMsIGRyLCBzciwgcmVnaW9uKTsKLX0KLQotc3RhdHVzX3QgQ29weWJpdE1TTTdLOjpzdHJldGNoKCAKLSAgICAgICAgY29uc3QgY29weWJpdF9pbWFnZV90JiBkc3QsCi0gICAgICAgIGNvbnN0IGNvcHliaXRfaW1hZ2VfdCYgc3JjLCAKLSAgICAgICAgY29uc3QgY29weWJpdF9yZWN0X3QmIGRzdF9yZWN0LAotICAgICAgICBjb25zdCBjb3B5Yml0X3JlY3RfdCYgc3JjX3JlY3QsCi0gICAgICAgIGNvcHliaXRfcmVnaW9uX3QgY29uc3QqIHJlZ2lvbikKLXsKLSAgICBzdHJ1Y3QgewotICAgICAgICB1aW50MzJfdCBjb3VudDsKLSAgICAgICAgc3RydWN0IG1kcF9ibGl0X3JlcSByZXFbMTJdOwotICAgIH0gbGlzdDsKLSAgICAKLSAgICBpZiAobUFscGhhPDI1NSkgewotICAgICAgICBzd2l0Y2ggKHNyYy5mb3JtYXQpIHsKLSAgICAgICAgICAgIC8vIHdlIGRvbnQnIHN1cHBvcnQgcGxhbmUgYWxwaGEgd2l0aCBSR0JBIGZvcm1hdHMKLSAgICAgICAgICAgIGNhc2UgQ09QWUJJVF9SR0JBXzg4ODg6Ci0gICAgICAgICAgICBjYXNlIENPUFlCSVRfUkdCQV81NTUxOgotICAgICAgICAgICAgY2FzZSBDT1BZQklUX1JHQkFfNDQ0NDoKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgIGNvbnN0IHVpbnQzMl90IG1heENvdW50ID0gc2l6ZW9mKGxpc3QucmVxKS9zaXplb2YobGlzdC5yZXFbMF0pOwotICAgIGNvbnN0IGNvcHliaXRfcmVjdF90IGJvdW5kcyA9IHsgMCwgMCwgZHN0LncsIGRzdC5oIH07Ci0gICAgY29weWJpdF9yZWN0X3QgY2xpcDsKLSAgICBsaXN0LmNvdW50ID0gMDsKLSAgICBpbnQgZXJyID0gMDsKLSAgICB3aGlsZSAoIWVyciAmJiByZWdpb24tPm5leHQocmVnaW9uLCAmY2xpcCkpIHsKLSAgICAgICAgaW50ZXJzZWN0KCZjbGlwLCBib3VuZHMsIGNsaXApOwotICAgICAgICBzZXRJbmZvcygmbGlzdC5yZXFbbGlzdC5jb3VudF0pOwotICAgICAgICBzZXRJbWFnZSgmbGlzdC5yZXFbbGlzdC5jb3VudF0uZHN0LCBkc3QpOwotICAgICAgICBzZXRJbWFnZSgmbGlzdC5yZXFbbGlzdC5jb3VudF0uc3JjLCBzcmMpOwotICAgICAgICBzZXRSZWN0cygmbGlzdC5yZXFbbGlzdC5jb3VudF0sIGRzdF9yZWN0LCBzcmNfcmVjdCwgY2xpcCk7Ci0gICAgICAgIGlmICgrK2xpc3QuY291bnQgPT0gbWF4Q291bnQpIHsKLSAgICAgICAgICAgIGVyciA9IG1zbV9jb3B5Yml0KCZsaXN0KTsKLSAgICAgICAgICAgIGxpc3QuY291bnQgPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghZXJyICYmIGxpc3QuY291bnQpIHsKLSAgICAgICAgZXJyID0gbXNtX2NvcHliaXQoJmxpc3QpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBDb3B5Yml0TVNNN0s6Om1zbV9jb3B5Yml0KHZvaWQgY29uc3QqIGxpc3QpCi17Ci0gICAgaW50IGVyciA9IGlvY3RsKG1GRCwgTVNNRkJfQkxJVCwgc3RhdGljX2Nhc3Q8bWRwX2JsaXRfcmVxX2xpc3QgY29uc3QqPihsaXN0KSk7Ci0gICAgTE9HRV9JRihlcnI8MCwgImNvcHlCaXRzIGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBpZiAoZXJyID09IDApCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICByZXR1cm4gLWVycm5vOwotfQotCi1pbnQgQ29weWJpdE1TTTdLOjpnZXRGb3JtYXQoaW50IGZvcm1hdCkKLXsKLSAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgIGNhc2UgQ09QWUJJVF9SR0JBXzg4ODg6ICAgICByZXR1cm4gTURQX1JHQkFfODg4ODsKLSAgICBjYXNlIENPUFlCSVRfUkdCXzU2NTogICAgICAgcmV0dXJuIE1EUF9SR0JfNTY1OwotICAgIGNhc2UgQ09QWUJJVF9ZQ2JDcl80MjJfU1A6ICByZXR1cm4gTURQX1lfQ0JDUl9IMlYxOwotICAgIGNhc2UgQ09QWUJJVF9ZQ2JDcl80MjBfU1A6ICByZXR1cm4gTURQX1lfQ0JDUl9IMlYyOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLXZvaWQgQ29weWJpdE1TTTdLOjpzZXRJbmZvcyhtZHBfYmxpdF9yZXEqIHJlcSkKLXsKLSAgICByZXEtPmFscGhhID0gbUFscGhhOwotICAgIHJlcS0+dHJhbnNwX21hc2sgPSBNRFBfVFJBTlNQX05PUDsKLSAgICByZXEtPmZsYWdzID0gbUZsYWdzOwotfQotCi12b2lkIENvcHliaXRNU003Szo6c2V0SW1hZ2UobWRwX2ltZyogaW1nLCBjb25zdCBjb3B5Yml0X2ltYWdlX3QmIHJocykKLXsKLSAgICBpbWctPndpZHRoICAgICAgPSByaHMudzsKLSAgICBpbWctPmhlaWdodCAgICAgPSByaHMuaDsKLSAgICBpbWctPmZvcm1hdCAgICAgPSBnZXRGb3JtYXQocmhzLmZvcm1hdCk7Ci0gICAgaW1nLT5vZmZzZXQgICAgID0gcmhzLm9mZnNldDsKLSAgICBpbWctPm1lbW9yeV9pZCAgPSByaHMuZmQ7Ci19Ci0gICAgCi12b2lkIENvcHliaXRNU003Szo6c2V0UmVjdHMobWRwX2JsaXRfcmVxKiBlLCAKLSAgICAgICAgY29uc3QgY29weWJpdF9yZWN0X3QmIGRzdCwgY29uc3QgY29weWJpdF9yZWN0X3QmIHNyYywKLSAgICAgICAgY29uc3QgY29weWJpdF9yZWN0X3QmIHNjaXNzb3IpCi17Ci0gICAgY29weWJpdF9yZWN0X3QgY2xpcDsKLSAgICBpbnRlcnNlY3QoJmNsaXAsIHNjaXNzb3IsIGRzdCk7Ci0KLSAgICBlLT5kc3RfcmVjdC54ICA9IGNsaXAubDsKLSAgICBlLT5kc3RfcmVjdC55ICA9IGNsaXAudDsKLSAgICBlLT5kc3RfcmVjdC53ICA9IGNsaXAuciAtIGNsaXAubDsKLSAgICBlLT5kc3RfcmVjdC5oICA9IGNsaXAuYiAtIGNsaXAudDsKLQotICAgIHVpbnQzMl90IFcsIEg7Ci0gICAgaWYgKG1GbGFncyAmIENPUFlCSVRfVFJBTlNGT1JNX1JPVF85MCkgewotICAgICAgICBlLT5zcmNfcmVjdC54ICA9IChjbGlwLnQgLSBkc3QudCkgKyBzcmMudDsKLSAgICAgICAgZS0+c3JjX3JlY3QueSAgPSAoZHN0LnIgLSBjbGlwLnIpICsgc3JjLmw7Ci0gICAgICAgIGUtPnNyY19yZWN0LncgID0gKGNsaXAuYiAtIGNsaXAudCk7Ci0gICAgICAgIGUtPnNyY19yZWN0LmggID0gKGNsaXAuciAtIGNsaXAubCk7Ci0gICAgICAgIFcgPSBkc3QuYiAtIGRzdC50OwotICAgICAgICBIID0gZHN0LnIgLSBkc3QubDsKLSAgICB9IGVsc2UgewotICAgICAgICBlLT5zcmNfcmVjdC54ICA9IChjbGlwLmwgLSBkc3QubCkgKyBzcmMubDsKLSAgICAgICAgZS0+c3JjX3JlY3QueSAgPSAoY2xpcC50IC0gZHN0LnQpICsgc3JjLnQ7Ci0gICAgICAgIGUtPnNyY19yZWN0LncgID0gKGNsaXAuciAtIGNsaXAubCk7Ci0gICAgICAgIGUtPnNyY19yZWN0LmggID0gKGNsaXAuYiAtIGNsaXAudCk7Ci0gICAgICAgIFcgPSBkc3QuciAtIGRzdC5sOwotICAgICAgICBIID0gZHN0LmIgLSBkc3QudDsKLSAgICB9Ci0gICAgTVVMRElWKGUtPnNyY19yZWN0LngsIGUtPnNyY19yZWN0LncsIHNyYy5yIC0gc3JjLmwsIFcpOwotICAgIE1VTERJVihlLT5zcmNfcmVjdC55LCBlLT5zcmNfcmVjdC5oLCBzcmMuYiAtIHNyYy50LCBIKTsKLSAgICBpZiAobUZsYWdzICYgQ09QWUJJVF9UUkFOU0ZPUk1fRkxJUF9WKSB7Ci0gICAgICAgIGUtPnNyY19yZWN0LnkgPSBlLT5zcmMuaGVpZ2h0IC0gKGUtPnNyY19yZWN0LnkgKyBlLT5zcmNfcmVjdC5oKTsKLSAgICB9Ci0gICAgaWYgKG1GbGFncyAmIENPUFlCSVRfVFJBTlNGT1JNX0ZMSVBfSCkgewotICAgICAgICBlLT5zcmNfcmVjdC54ID0gZS0+c3JjLndpZHRoICAtIChlLT5zcmNfcmVjdC54ICsgZS0+c3JjX3JlY3Qudyk7Ci0gICAgfQotfQotCi12b2lkIENvcHliaXRNU003Szo6aW50ZXJzZWN0KGNvcHliaXRfcmVjdF90KiBvdXQsIAotICAgICAgICBjb25zdCBjb3B5Yml0X3JlY3RfdCYgbGhzLCBjb25zdCBjb3B5Yml0X3JlY3RfdCYgcmhzKQotewotICAgIG91dC0+bCA9IG1heChsaHMubCwgcmhzLmwpOwotICAgIG91dC0+dCA9IG1heChsaHMudCwgcmhzLnQpOwotICAgIG91dC0+ciA9IG1pbihsaHMuciwgcmhzLnIpOwotICAgIG91dC0+YiA9IG1pbihsaHMuYiwgcmhzLmIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2Vsc2UgLy8gSEFWRV9BTkRST0lEX09TCi0KLUNvcHliaXRNU003Szo6Q29weWJpdE1TTTdLKCkKLSAgICA6IG1GRCgtMSkKLXsKLX0KLQotQ29weWJpdE1TTTdLOjp+Q29weWJpdE1TTTdLKCkKLXsKLX0KLQotc3RhdHVzX3QgQ29weWJpdE1TTTdLOjpzZXRQYXJhbWV0ZXIoaW50IG5hbWUsIGludCB2YWx1ZSkKLXsKLSAgICByZXR1cm4gTk9fSU5JVDsKLX0KLQotc3RhdHVzX3QgQ29weWJpdE1TTTdLOjpnZXQoaW50IG5hbWUpCi17Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotc3RhdHVzX3QgQ29weWJpdE1TTTdLOjpibGl0KCAKLSAgICAgICAgY29uc3QgY29weWJpdF9pbWFnZV90JiBkc3QsCi0gICAgICAgIGNvbnN0IGNvcHliaXRfaW1hZ2VfdCYgc3JjLAotICAgICAgICBjb3B5Yml0X3JlZ2lvbl90IGNvbnN0KiByZWdpb24pCi17Ci0gICAgcmV0dXJuIE5PX0lOSVQ7Ci19Ci0KLXN0YXR1c190IENvcHliaXRNU003Szo6c3RyZXRjaCggCi0gICAgICAgIGNvbnN0IGNvcHliaXRfaW1hZ2VfdCYgZHN0LAotICAgICAgICBjb25zdCBjb3B5Yml0X2ltYWdlX3QmIHNyYywgCi0gICAgICAgIGNvbnN0IGNvcHliaXRfcmVjdF90JiBkc3RfcmVjdCwKLSAgICAgICAgY29uc3QgY29weWJpdF9yZWN0X3QmIHNyY19yZWN0LAotICAgICAgICBjb3B5Yml0X3JlZ2lvbl90IGNvbnN0KiByZWdpb24pCi17Ci0gICAgcmV0dXJuIE5PX0lOSVQ7Ci19Ci0KLSNlbmRpZiAvLyBIQVZFX0FORFJPSURfT1MKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3VpL0NhbWVyYS5jcHAgYi9saWJzL3VpL0NhbWVyYS5jcHAKaW5kZXggMTUyOGU2ZS4uOTUyNzAwOSAxMDA2NDQKLS0tIGEvbGlicy91aS9DYW1lcmEuY3BwCisrKyBiL2xpYnMvdWkvQ2FtZXJhLmNwcApAQCAtMSwyOCArMSwyOCBAQAogLyoKICoqCi0qKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKiogQ29weXJpZ2h0IChDKSAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIEluYy4KICoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCiAjaW5jbHVkZSA8dXRpbHMvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL0lNZW1vcnkuaD4KICNpbmNsdWRlIDx1aS9TdXJmYWNlLmg+Ci0KICNpbmNsdWRlIDx1aS9DYW1lcmEuaD4KICNpbmNsdWRlIDx1aS9JQ2FtZXJhU2VydmljZS5oPgogCkBAIC02MCwyMCArNjAsMzYgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBDYW1lcmE6OkNhbWVyYSgpCi0gICAgICA6IG1TdGF0dXMoVU5LTk9XTl9FUlJPUiksCi0gICAgICAgIG1TaHV0dGVyQ2FsbGJhY2soMCksCi0gICAgICAgIG1TaHV0dGVyQ2FsbGJhY2tDb29raWUoMCksCi0gICAgICAgIG1SYXdDYWxsYmFjaygwKSwKLSAgICAgICAgbVJhd0NhbGxiYWNrQ29va2llKDApLAotICAgICAgICBtSnBlZ0NhbGxiYWNrKDApLAotICAgICAgICBtSnBlZ0NhbGxiYWNrQ29va2llKDApLAotICAgICAgICBtRnJhbWVDYWxsYmFjaygwKSwKLSAgICAgICAgbUZyYW1lQ2FsbGJhY2tDb29raWUoMCksCi0gICAgICAgIG1FcnJvckNhbGxiYWNrKDApLAotICAgICAgICBtRXJyb3JDYWxsYmFja0Nvb2tpZSgwKSwKLSAgICAgICAgbUF1dG9Gb2N1c0NhbGxiYWNrKDApLAotICAgICAgICBtQXV0b0ZvY3VzQ2FsbGJhY2tDb29raWUoMCkKIHsKKyAgICBpbml0KCk7Cit9CisKK0NhbWVyYTo6Q2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEpCit7CisgICAgaW5pdCgpOworICAgIC8vIGNvbm5lY3QgdGhpcyBjbGllbnQgdG8gZXhpc3RpbmcgY2FtZXJhIHJlbW90ZQorICAgIGlmIChjYW1lcmEtPmNvbm5lY3QodGhpcykgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbVN0YXR1cyA9IE5PX0VSUk9SOworICAgICAgICBtQ2FtZXJhID0gY2FtZXJhOworICAgICAgICBjYW1lcmEtPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKHRoaXMpOworICAgIH0KK30KKwordm9pZCBDYW1lcmE6OmluaXQoKQoreworICAgIG1TdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgIG1TaHV0dGVyQ2FsbGJhY2sgPSAwOworICAgIG1TaHV0dGVyQ2FsbGJhY2tDb29raWUgPSAwOworICAgIG1SYXdDYWxsYmFjayA9IDA7CisgICAgbVJhd0NhbGxiYWNrQ29va2llID0gMDsKKyAgICBtSnBlZ0NhbGxiYWNrID0gMDsKKyAgICBtSnBlZ0NhbGxiYWNrQ29va2llID0gMDsKKyAgICBtRnJhbWVDYWxsYmFjayA9IDA7CisgICAgbUZyYW1lQ2FsbGJhY2tDb29raWUgPSAwOworICAgIG1FcnJvckNhbGxiYWNrID0gMDsKKyAgICBtRXJyb3JDYWxsYmFja0Nvb2tpZSA9IDA7CisgICAgbUF1dG9Gb2N1c0NhbGxiYWNrID0gMDsKKyAgICBtQXV0b0ZvY3VzQ2FsbGJhY2tDb29raWUgPSAwOwogfQogCiBDYW1lcmE6On5DYW1lcmEoKQpAQCAtODMsNiArOTksNyBAQAogCiBzcDxDYW1lcmE+IENhbWVyYTo6Y29ubmVjdCgpCiB7CisgICAgTE9HVigiY29ubmVjdCIpOwogICAgIHNwPENhbWVyYT4gYyA9IG5ldyBDYW1lcmEoKTsKICAgICBjb25zdCBzcDxJQ2FtZXJhU2VydmljZT4mIGNzID0gZ2V0Q2FtZXJhU2VydmljZSgpOwogICAgIGlmIChjcyAhPSAwKSB7CkBAIC05Nyw2ICsxMTQsNyBAQAogCiB2b2lkIENhbWVyYTo6ZGlzY29ubmVjdCgpCiB7CisgICAgTE9HVigiZGlzY29ubmVjdCIpOwogICAgIGlmIChtQ2FtZXJhICE9IDApIHsKICAgICAgICAgbUVycm9yQ2FsbGJhY2sgPSAwOwogICAgICAgICBtQ2FtZXJhLT5kaXNjb25uZWN0KCk7CkBAIC0xMDQsOSArMTIyLDI0IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBDYW1lcmE6OnJlY29ubmVjdCgpCit7CisgICAgTE9HVigicmVjb25uZWN0Iik7CisgICAgaWYgKG1DYW1lcmEgIT0gMCkgeworICAgICAgICByZXR1cm4gbUNhbWVyYS0+Y29ubmVjdCh0aGlzKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3NwPElDYW1lcmE+IENhbWVyYTo6cmVtb3RlKCkKK3sKKyAgICByZXR1cm4gbUNhbWVyYTsKK30KKwogLy8gcGFzcyB0aGUgYnVmZmVyZWQgSVN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCiBzdGF0dXNfdCBDYW1lcmE6OnNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKQogeworICAgIExPR1YoInNldFByZXZpZXdEaXNwbGF5Iik7CiAgICAgaWYgKHN1cmZhY2UgPT0gMCkgewogICAgICAgICBMT0dFKCJhcHAgcGFzc2VkIE5VTEwgc3VyZmFjZSIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTExNCw4MSArMTQ3LDEwNSBAQAogICAgIHJldHVybiBtQ2FtZXJhLT5zZXRQcmV2aWV3RGlzcGxheShzdXJmYWNlLT5nZXRJU3VyZmFjZSgpKTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhOjpzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpCit7CisgICAgTE9HVigic2V0UHJldmlld0Rpc3BsYXkiKTsKKyAgICBpZiAoc3VyZmFjZSA9PSAwKSB7CisgICAgICAgIExPR0UoImFwcCBwYXNzZWQgTlVMTCBzdXJmYWNlIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUNhbWVyYS0+c2V0UHJldmlld0Rpc3BsYXkoc3VyZmFjZSk7Cit9CisKKwogLy8gc3RhcnQgcHJldmlldyBtb2RlLCBtdXN0IGNhbGwgc2V0UHJldmlld0Rpc3BsYXkgZmlyc3QKIHN0YXR1c190IENhbWVyYTo6c3RhcnRQcmV2aWV3KCkKIHsKKyAgICBMT0dWKCJzdGFydFByZXZpZXciKTsKICAgICByZXR1cm4gbUNhbWVyYS0+c3RhcnRQcmV2aWV3KCk7CiB9CiAKIC8vIHN0b3AgcHJldmlldyBtb2RlCiB2b2lkIENhbWVyYTo6c3RvcFByZXZpZXcoKQogeworICAgIExPR1YoInN0b3BQcmV2aWV3Iik7CiAgICAgbUNhbWVyYS0+c3RvcFByZXZpZXcoKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhOjphdXRvRm9jdXMoKQogeworICAgIExPR1YoImF1dG9Gb2N1cyIpOwogICAgIHJldHVybiBtQ2FtZXJhLT5hdXRvRm9jdXMoKTsKIH0KIAogLy8gdGFrZSBhIHBpY3R1cmUKIHN0YXR1c190IENhbWVyYTo6dGFrZVBpY3R1cmUoKQogeworICAgIExPR1YoInRha2VQaWN0dXJlIik7CiAgICAgcmV0dXJuIG1DYW1lcmEtPnRha2VQaWN0dXJlKCk7CiB9CiAKIC8vIHNldCBwcmV2aWV3L2NhcHR1cmUgcGFyYW1ldGVycyAtIGtleS92YWx1ZSBwYWlycwogc3RhdHVzX3QgQ2FtZXJhOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcykKIHsKKyAgICBMT0dWKCJzZXRQYXJhbWV0ZXJzIik7CiAgICAgcmV0dXJuIG1DYW1lcmEtPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKIH0KIAogLy8gZ2V0IHByZXZpZXcvY2FwdHVyZSBwYXJhbWV0ZXJzIC0ga2V5L3ZhbHVlIHBhaXJzCiBTdHJpbmc4IENhbWVyYTo6Z2V0UGFyYW1ldGVycygpIGNvbnN0CiB7CisgICAgTE9HVigiZ2V0UGFyYW1ldGVycyIpOwogICAgIFN0cmluZzggcGFyYW1zID0gbUNhbWVyYS0+Z2V0UGFyYW1ldGVycygpOwogICAgIHJldHVybiBwYXJhbXM7CiB9CiAKIHZvaWQgQ2FtZXJhOjpzZXRBdXRvRm9jdXNDYWxsYmFjayhhdXRvZm9jdXNfY2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSkKIHsKKyAgICBMT0dWKCJzZXRBdXRvRm9jdXNDYWxsYmFjayIpOwogICAgIG1BdXRvRm9jdXNDYWxsYmFjayA9IGNiOwogICAgIG1BdXRvRm9jdXNDYWxsYmFja0Nvb2tpZSA9IGNvb2tpZTsKIH0KIAogdm9pZCBDYW1lcmE6OnNldFNodXR0ZXJDYWxsYmFjayhzaHV0dGVyX2NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUpCiB7CisgICAgTE9HVigic2V0U2h1dHRlckNhbGxiYWNrIik7CiAgICAgbVNodXR0ZXJDYWxsYmFjayA9IGNiOwogICAgIG1TaHV0dGVyQ2FsbGJhY2tDb29raWUgPSBjb29raWU7CiB9CiAKIHZvaWQgQ2FtZXJhOjpzZXRSYXdDYWxsYmFjayhmcmFtZV9jYWxsYmFjayBjYiwgdm9pZCAqY29va2llKQogeworICAgIExPR1YoInNldFJhd0NhbGxiYWNrIik7CiAgICAgbVJhd0NhbGxiYWNrID0gY2I7CiAgICAgbVJhd0NhbGxiYWNrQ29va2llID0gY29va2llOwogfQogCiB2b2lkIENhbWVyYTo6c2V0SnBlZ0NhbGxiYWNrKGZyYW1lX2NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUpCiB7CisgICAgTE9HVigic2V0SnBlZ0NhbGxiYWNrIik7CiAgICAgbUpwZWdDYWxsYmFjayA9IGNiOwogICAgIG1KcGVnQ2FsbGJhY2tDb29raWUgPSBjb29raWU7CiB9CiAKLXZvaWQgQ2FtZXJhOjpzZXRGcmFtZUNhbGxiYWNrKGZyYW1lX2NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUpCit2b2lkIENhbWVyYTo6c2V0RnJhbWVDYWxsYmFjayhmcmFtZV9jYWxsYmFjayBjYiwgdm9pZCAqY29va2llLCBpbnQgZnJhbWVfY2FsbGJhY2tfZmxhZykKIHsKKyAgICBMT0dWKCJzZXRGcmFtZUNhbGxiYWNrIik7CiAgICAgbUZyYW1lQ2FsbGJhY2sgPSBjYjsKICAgICBtRnJhbWVDYWxsYmFja0Nvb2tpZSA9IGNvb2tpZTsKLSAgICBtQ2FtZXJhLT5zZXRIYXNGcmFtZUNhbGxiYWNrKGNiICE9IE5VTEwpOworICAgIG1DYW1lcmEtPnNldEZyYW1lQ2FsbGJhY2tGbGFnKGZyYW1lX2NhbGxiYWNrX2ZsYWcpOwogfQogCiB2b2lkIENhbWVyYTo6c2V0RXJyb3JDYWxsYmFjayhlcnJvcl9jYWxsYmFjayBjYiwgdm9pZCAqY29va2llKQogeworICAgIExPR1YoInNldEVycm9yQ2FsbGJhY2siKTsKICAgICBtRXJyb3JDYWxsYmFjayA9IGNiOwogICAgIG1FcnJvckNhbGxiYWNrQ29va2llID0gY29va2llOwogfQogCiB2b2lkIENhbWVyYTo6YXV0b0ZvY3VzQ2FsbGJhY2soYm9vbCBmb2N1c2VkKQogeworICAgIExPR1YoImF1dG9Gb2N1c0NhbGxiYWNrIik7CiAgICAgaWYgKG1BdXRvRm9jdXNDYWxsYmFjaykgewogICAgICAgICBtQXV0b0ZvY3VzQ2FsbGJhY2soZm9jdXNlZCwgbUF1dG9Gb2N1c0NhbGxiYWNrQ29va2llKTsKICAgICB9CkBAIC0xOTYsNiArMjUzLDcgQEAKIAogdm9pZCBDYW1lcmE6OnNodXR0ZXJDYWxsYmFjaygpCiB7CisgICAgTE9HVigic2h1dHRlckNhbGxiYWNrIik7CiAgICAgaWYgKG1TaHV0dGVyQ2FsbGJhY2spIHsKICAgICAgICAgbVNodXR0ZXJDYWxsYmFjayhtU2h1dHRlckNhbGxiYWNrQ29va2llKTsKICAgICB9CkBAIC0yMDMsNiArMjYxLDcgQEAKIAogdm9pZCBDYW1lcmE6OnJhd0NhbGxiYWNrKGNvbnN0IHNwPElNZW1vcnk+JiBwaWN0dXJlKQogeworICAgIExPR1YoInJhd0NhbGxiYWNrIik7CiAgICAgaWYgKG1SYXdDYWxsYmFjaykgewogICAgICAgICBtUmF3Q2FsbGJhY2socGljdHVyZSwgbVJhd0NhbGxiYWNrQ29va2llKTsKICAgICB9CkBAIC0yMTEsNiArMjcwLDcgQEAKIC8vIGNhbGxiYWNrIGZyb20gY2FtZXJhIHNlcnZpY2Ugd2hlbiBpbWFnZSBpcyByZWFkeQogdm9pZCBDYW1lcmE6OmpwZWdDYWxsYmFjayhjb25zdCBzcDxJTWVtb3J5PiYgcGljdHVyZSkKIHsKKyAgICBMT0dWKCJqcGVnQ2FsbGJhY2siKTsKICAgICBpZiAobUpwZWdDYWxsYmFjaykgewogICAgICAgICBtSnBlZ0NhbGxiYWNrKHBpY3R1cmUsIG1KcGVnQ2FsbGJhY2tDb29raWUpOwogICAgIH0KQEAgLTIxOSw2ICsyNzksNyBAQAogLy8gY2FsbGJhY2sgZnJvbSBjYW1lcmEgc2VydmljZSB3aGVuIHZpZGVvIGZyYW1lIGlzIHJlYWR5CiB2b2lkIENhbWVyYTo6ZnJhbWVDYWxsYmFjayhjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpCiB7CisgICAgTE9HVigiZnJhbWVDYWxsYmFjayIpOwogICAgIGlmIChtRnJhbWVDYWxsYmFjaykgewogICAgICAgICBtRnJhbWVDYWxsYmFjayhmcmFtZSwgbUZyYW1lQ2FsbGJhY2tDb29raWUpOwogICAgIH0KQEAgLTIyNywxOSArMjg4LDIxIEBACiAvLyBjYWxsYmFjayBmcm9tIGNhbWVyYSBzZXJ2aWNlIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGluIHByZXZpZXcgb3IgdGFrZVBpY3R1cmUKIHZvaWQgQ2FtZXJhOjplcnJvckNhbGxiYWNrKHN0YXR1c190IGVycm9yKQogeworICAgIExPR1YoImVycm9yQ2FsbGJhY2siKTsKICAgICBpZiAobUVycm9yQ2FsbGJhY2spIHsKICAgICAgICAgbUVycm9yQ2FsbGJhY2soZXJyb3IsIG1FcnJvckNhbGxiYWNrQ29va2llKTsKICAgICB9CiB9CiAKLXZvaWQgQ2FtZXJhOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsgICAgCit2b2lkIENhbWVyYTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7CiAgICAgTE9HVygiSUNhbWVyYSBkaWVkIik7CiAgICAgaWYgKG1FcnJvckNhbGxiYWNrKSB7CiAgICAgICAgIG1FcnJvckNhbGxiYWNrKERFQURfT0JKRUNULCBtRXJyb3JDYWxsYmFja0Nvb2tpZSk7CiAgICAgfQogfQogCi12b2lkIENhbWVyYTo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7ICAgIAordm9pZCBDYW1lcmE6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgeworICAgIExPR1YoImJpbmRlckRpZWQiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2woQ2FtZXJhOjptTG9jayk7CiAgICAgQ2FtZXJhOjptQ2FtZXJhU2VydmljZS5jbGVhcigpOwogICAgIExPR1coIkNhbWVyYSBzZXJ2ZXIgZGllZCEiKTsKZGlmZiAtLWdpdCBhL2xpYnMvdWkvRUdMRGlzcGxheVN1cmZhY2UuY3BwIGIvbGlicy91aS9FR0xEaXNwbGF5U3VyZmFjZS5jcHAKaW5kZXggZWEyNDVmNS4uNDQyNThhOCAxMDA2NDQKLS0tIGEvbGlicy91aS9FR0xEaXNwbGF5U3VyZmFjZS5jcHAKKysrIGIvbGlicy91aS9FR0xEaXNwbGF5U3VyZmFjZS5jcHAKQEAgLTI4LDExICsyOCwxNSBAQAogCiAjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvY29weWJpdC5oPgogCiAjaW5jbHVkZSA8dWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8dWkvRGlzcGxheUluZm8uaD4KICNpbmNsdWRlIDx1aS9SZWN0Lmg+CiAjaW5jbHVkZSA8dWkvUmVnaW9uLmg+CisjaW5jbHVkZSA8dWkvRUdMRGlzcGxheVN1cmZhY2UuaD4KIAogI2lmIEhBVkVfQU5EUk9JRF9PUwogI2luY2x1ZGUgPGxpbnV4L21zbV9tZHAuaD4KQEAgLTQyLDcgKzQ2LDYgQEAKIAogI2luY2x1ZGUgPHBpeGVsZmxpbmdlci9mb3JtYXQuaD4KIAotI2luY2x1ZGUgPHVpL0VHTERpc3BsYXlTdXJmYWNlLmg+CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNzgsNyArODEsMTIgQEAKICAgICBtQmxpdEVuZ2luZSA9IDA7CiAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6ZmQgPSBtYXBGcmFtZUJ1ZmZlcigpOwogICAgIGlmIChlZ2xfbmF0aXZlX3dpbmRvd190OjpmZCA+PSAwKSB7Ci0gICAgICAgIG1CbGl0RW5naW5lID0gY29weWJpdF9pbml0KCk7CisgICAgICAgIAorICAgICAgICBod19tb2R1bGVfdCBjb25zdCogbW9kdWxlOworICAgICAgICBpZiAoaHdfZ2V0X21vZHVsZShDT1BZQklUX0hBUkRXQVJFX01PRFVMRV9JRCwgJm1vZHVsZSkgPT0gMCkgeworICAgICAgICAgICAgY29weWJpdF9vcGVuKG1vZHVsZSwgJm1CbGl0RW5naW5lKTsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgY29uc3QgZmxvYXQgaW4ybW0gPSAyNS40ZjsKICAgICAgICAgZmxvYXQgcmVmcmVzaFJhdGUgPSAxMDAwMDAwMDAwMDAwMDAwTExVIC8gKAogICAgICAgICAgICAgICAgIGZsb2F0KCBtSW5mby51cHBlcl9tYXJnaW4gKyBtSW5mby5sb3dlcl9tYXJnaW4gKyBtSW5mby55cmVzICkKQEAgLTEwOCw3ICsxMTYsNyBAQAogRUdMRGlzcGxheVN1cmZhY2U6On5FR0xEaXNwbGF5U3VyZmFjZSgpCiB7CiAgICAgbWFnaWMgPSAwOwotICAgIGNvcHliaXRfdGVybShtQmxpdEVuZ2luZSk7CisgICAgY29weWJpdF9jbG9zZShtQmxpdEVuZ2luZSk7CiAgICAgbUJsaXRFbmdpbmUgPSAwOwogICAgIGNsb3NlKGVnbF9uYXRpdmVfd2luZG93X3Q6OmZkKTsKICAgICBtdW5tYXAobUZiWzBdLmRhdGEsIG1TaXplKTsKQEAgLTE0Nyw5ICsxNTUsNiBAQAogCiB1aW50MzJfdCBFR0xEaXNwbGF5U3VyZmFjZTo6c3dhcEJ1ZmZlcnMoKQogewotICAgIGlmICghKG1GbGFncyAmIFBBR0VfRkxJUCkpCi0gICAgICAgIHJldHVybiAwOwotCiAjZGVmaW5lIFNIT1dfRlBTIDAKICNpZiBTSE9XX0ZQUwogICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOwpAQCAtMTcxLDYgKzE3NiwxMSBAQAogICAgICAgICB9CiAgICAgfQogI2VuZGlmCisgICAgLyogSWYgd2UgY2FuJ3QgZG8gdGhlIHBhZ2VfZmxpcCwganVzdCBjb3B5IHRoZSBiYWNrIGJ1ZmZlciB0byB0aGUgZnJvbnQgKi8KKyAgICBpZiAoIShtRmxhZ3MgJiBQQUdFX0ZMSVApKSB7CisgICAgICAgIG1lbWNweShtRmJbMF0uZGF0YSwgbUZiWzFdLmRhdGEsIG1JbmZvLnhyZXMqbUluZm8ueXJlcyoyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCiAgICAgLy8gZG8gdGhlIGFjdHVhbCBmbGlwCiAgICAgbUluZGV4ID0gMSAtIG1JbmRleDsKQEAgLTE5Miw3ICsyMDIsNyBAQAogICAgICAqIHdpdGggbXNtN2suCiAgICAgICovCiAgICAgaWYgKGVnbF9uYXRpdmVfd2luZG93X3Q6Om1lbW9yeV90eXBlID09IE5BVElWRV9NRU1PUllfVFlQRV9HUFUgJiYgb2VtWzBdICYmIG1CbGl0RW5naW5lKSB7Ci0gICAgICAgIGNvcHliaXRfdCAqY29weWJpdCA9IG1CbGl0RW5naW5lOworICAgICAgICBjb3B5Yml0X2RldmljZV90ICpjb3B5Yml0ID0gbUJsaXRFbmdpbmU7CiAgICAgICAgIGNvcHliaXRfcmVjdF90IHNkcmVjdCA9IHsgMCwgMCwKICAgICAgICAgICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190Ojp3aWR0aCwgZWdsX25hdGl2ZV93aW5kb3dfdDo6aGVpZ2h0IH07CiAgICAgICAgIGNvcHliaXRfaW1hZ2VfdCBkc3QgPSB7CkBAIC0yNzMsNiArMjgzLDEyIEBACiAgICAgfSBlbHNlCiAjZW5kaWYKICAgICB7CisgICAgICAgIC8qIG5vIGV4dHJhIGNvcHkgbmVlZGVkIHNpbmNlIHdlIGNvcGllZCBiYWNrIHRvIGZyb250IGluc3RlYWQgb2YKKyAgICAgICAgICogZmxpcHBpbmcgKi8KKyAgICAgICAgaWYgKCEobUZsYWdzICYgUEFHRV9GTElQKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICAgICAgICAgUmVnaW9uOjppdGVyYXRvciBpdGVyYXRvcihjb3B5YmFjayk7CiAgICAgICAgIGlmIChpdGVyYXRvcikgewogICAgICAgICAgICAgUmVjdCByOwpAQCAtMzczLDEyICszODksMTEgQEAKICAgICAgICAgLy8gYmxlYWdoLCBiYWQgaW5mbyBmcm9tIHRoZSBkcml2ZXIKICAgICAgICAgcmVmcmVzaFJhdGUgPSA2MCoxMDAwOyAgLy8gNjAgSHoKICAgICB9Ci0KICAgICBpZiAoaW50KGluZm8ud2lkdGgpIDw9IDAgfHwgaW50KGluZm8uaGVpZ2h0KSA8PSAwKSB7CiAgICAgICAgIC8vIHRoZSBkcml2ZXIgZG9lc24ndCByZXR1cm4gdGhhdCBpbmZvcm1hdGlvbgogICAgICAgICAvLyBkZWZhdWx0IHRvIDE2MCBkcGkKLSAgICAgICAgaW5mby53aWR0aCAgPSA1MTsKLSAgICAgICAgaW5mby5oZWlnaHQgPSAzODsKKyAgICAgICAgaW5mby53aWR0aCAgPSAoKGluZm8ueHJlcyAqIDI1LjRmKS8xNjAuMGYgKyAwLjVmKTsKKyAgICAgICAgaW5mby5oZWlnaHQgPSAoKGluZm8ueXJlcyAqIDI1LjRmKS8xNjAuMGYgKyAwLjVmKTsKICAgICB9CiAKICAgICBmbG9hdCB4ZHBpID0gKGluZm8ueHJlcyAqIDI1LjRmKSAvIGluZm8ud2lkdGg7CmRpZmYgLS1naXQgYS9saWJzL3VpL0VHTE5hdGl2ZVdpbmRvd1N1cmZhY2UuY3BwIGIvbGlicy91aS9FR0xOYXRpdmVXaW5kb3dTdXJmYWNlLmNwcAppbmRleCAwYjZhZmMwLi5kNTVmYjcwIDEwMDY0NAotLS0gYS9saWJzL3VpL0VHTE5hdGl2ZVdpbmRvd1N1cmZhY2UuY3BwCisrKyBiL2xpYnMvdWkvRUdMTmF0aXZlV2luZG93U3VyZmFjZS5jcHAKQEAgLTE2Myw3ICsxNjMsMTIgQEAKICAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6Zm9ybWF0ID0gaW5mby5mb3JtYXQ7CiAgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OmJhc2UgICA9IGludHB0cl90KGluZm8uYmFzZSk7CiAgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6Om9mZnNldCA9IGludHB0cl90KGluZm8uYml0cykgLSBpbnRwdHJfdChpbmZvLmJhc2UpOwotICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjptZW1vcnlfdHlwZSA9IG1TdXJmYWNlLT5nZXRNZW1vcnlUeXBlKCk7CisgICAgICAgIC8vIEZJWE1FOiBlZ2xfbmF0aXZlX3dpbmRvd190OjptZW1vcnlfdHlwZSB1c2VkIHRvIGJlIHNldCBmcm9tCisgICAgICAgIC8vIG1TdXJmYWNlLCBidXQgd2Ugd2FudGVkIHRvIGJyZWFrIHRoaXMgZGVwZW5kZW5jeS4gV2Ugc2V0IGl0IHRvCisgICAgICAgIC8vIEdQVSBiZWNhdXNlIHRoZSBzb2Z0d2FyZSByZW5kZXJlZCBkb2Vzbid0IGNhcmUsIGJ1dCB0aGUgaC93CisgICAgICAgIC8vIGFjY2VsZXJhdG9yIG5lZWRzIGl0LiBFdmVudHVhbGx5LCB0aGlzIHZhbHVlIHNob3VsZCBnbyBhd2F5CisgICAgICAgIC8vIGNvbXBsZXRlbHksIHNpbmNlIG1lbW9yeSB3aWxsIGJlIG1hbmFnZWQgYnkgT3BlbkdMLgorICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjptZW1vcnlfdHlwZSA9IE5BVElWRV9NRU1PUllfVFlQRV9HUFU7IAogICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpmZCA9IDA7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGlicy91aS9FdmVudEh1Yi5jcHAgYi9saWJzL3VpL0V2ZW50SHViLmNwcAppbmRleCBmMGM3N2JhLi5hYmU3NDA3IDEwMDY0NAotLS0gYS9saWJzL3VpL0V2ZW50SHViLmNwcAorKysgYi9saWJzL3VpL0V2ZW50SHViLmNwcApAQCAtMzE1LDkgKzMxNSw4IEBACiAgICAgICAgIH0KIAogICAgICAgICAvL3ByaW50ZigicG9sbCAlZCwgcmV0dXJuZWQgJWRcbiIsIG1GRENvdW50LCBwb2xscmVzKTsKLSAgICAgICAgaWYobUZEc1swXS5yZXZlbnRzICYgUE9MTElOKSB7Ci0gICAgICAgICAgICByZWFkX25vdGlmeShtRkRzWzBdLmZkKTsKLSAgICAgICAgfQorCisgICAgICAgIC8vIG1GRHNbMF0gaXMgdXNlZCBmb3IgaW5vdGlmeSwgc28gcHJvY2VzcyByZWd1bGFyIGV2ZW50cyBzdGFydGluZyBhdCBtRkRzWzFdCiAgICAgICAgIGZvcihpID0gMTsgaSA8IG1GRENvdW50OyBpKyspIHsKICAgICAgICAgICAgIGlmKG1GRHNbaV0ucmV2ZW50cykgewogICAgICAgICAgICAgICAgIExPR1YoInJldmVudHMgZm9yICVkID0gMHglMDh4IiwgaSwgbUZEc1tpXS5yZXZlbnRzKTsKQEAgLTM1Nyw2ICszNTYsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIHJlYWRfbm90aWZ5KCkgd2lsbCBtb2RpZnkgbUZEcyBhbmQgbUZEQ291bnQsIHNvIHRoaXMgbXVzdCBiZSBkb25lIGFmdGVyCisgICAgICAgIC8vIHByb2Nlc3NpbmcgYWxsIG90aGVyIGV2ZW50cy4KKyAgICAgICAgaWYobUZEc1swXS5yZXZlbnRzICYgUE9MTElOKSB7CisgICAgICAgICAgICByZWFkX25vdGlmeShtRkRzWzBdLmZkKTsKKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtNjA3LDcgKzYxMiw3IEBACiAgICAgICAgIHNwcmludGYocHJvcE5hbWUsICJody5rZXlib2FyZHMuJXUuZGV2bmFtZSIsIHB1YmxpY0lEKTsKICAgICAgICAgcHJvcGVydHlfc2V0KHByb3BOYW1lLCBkZXZuYW1lKTsKIAotICAgICAgICBMT0dJKCJOZXcga2V5Ym9hcmQ6IHB1YmxpY0lEPSVkIGRldmljZS0+aWQ9JWQgZGV2bmFtZT0nJXMgcHJvcE5hbWU9JyVzJyBrZXlsYXlvdXQ9JyVzJ1xuIiwKKyAgICAgICAgTE9HSSgiTmV3IGtleWJvYXJkOiBwdWJsaWNJRD0lZCBkZXZpY2UtPmlkPSVkIGRldm5hbWU9JyVzJyBwcm9wTmFtZT0nJXMnIGtleWxheW91dD0nJXMnXG4iLAogICAgICAgICAgICAgICAgIHB1YmxpY0lELCBkZXZpY2UtPmlkLCBkZXZuYW1lLCBwcm9wTmFtZSwga2V5bGF5b3V0RmlsZW5hbWUpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGlicy91aS9JQ2FtZXJhLmNwcCBiL2xpYnMvdWkvSUNhbWVyYS5jcHAKaW5kZXggNDIwYmI0OS4uNmEyZGM2YiAxMDA2NDQKLS0tIGEvbGlicy91aS9JQ2FtZXJhLmNwcAorKysgYi9saWJzL3VpL0lDYW1lcmEuY3BwCkBAIC0yLDQxICsyLDQwIEBACiAqKgogKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSUNhbWVyYSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQogI2luY2x1ZGUgPHV0aWxzL1BhcmNlbC5oPgotCiAjaW5jbHVkZSA8dWkvSUNhbWVyYS5oPgogCi0jZGVmaW5lIExPR19UQUcgIkBAQEBAQEBAQEBAIENBTUVSQSBAQEBAQEBAQEBAQCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBlbnVtIHsKICAgICBESVNDT05ORUNUID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKICAgICBTRVRfUFJFVklFV19ESVNQTEFZLAotICAgIFNFVF9IQVNfRlJBTUVfQ0FMTEJBQ0ssCisgICAgU0VUX0ZSQU1FX0NBTExCQUNLX0ZMQUcsCiAgICAgU1RBUlRfUFJFVklFVywKICAgICBTVE9QX1BSRVZJRVcsCiAgICAgQVVUT19GT0NVUywKICAgICBUQUtFX1BJQ1RVUkUsCiAgICAgU0VUX1BBUkFNRVRFUlMsCi0gICAgR0VUX1BBUkFNRVRFUlMKKyAgICBHRVRfUEFSQU1FVEVSUywKKyAgICBDT05ORUNUCiB9OwogCiBjbGFzcyBCcENhbWVyYTogcHVibGljIEJwSW50ZXJmYWNlPElDYW1lcmE+CkBAIC01MCw2ICs0OSw3IEBACiAgICAgLy8gZGlzY29ubmVjdCBmcm9tIGNhbWVyYSBzZXJ2aWNlCiAgICAgdm9pZCBkaXNjb25uZWN0KCkKICAgICB7CisgICAgICAgIExPR1YoImRpc2Nvbm5lY3QiKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0NPTk5FQ1QsIGRhdGEsICZyZXBseSk7CkBAIC01OCwyNSArNTgsMjkgQEAKICAgICAvLyBwYXNzIHRoZSBidWZmZXJlZCBJU3VyZmFjZSB0byB0aGUgY2FtZXJhIHNlcnZpY2UKICAgICBzdGF0dXNfdCBzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpCiAgICAgeworICAgICAgICBMT0dWKCJzZXRQcmV2aWV3RGlzcGxheSIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHN1cmZhY2UtPmFzQmluZGVyKCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BSRVZJRVdfRElTUExBWSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KLSAgICAKLSAgICAvLyB0ZWxsIHRoZSBzZXJ2aWNlIHdoZXRoZXIgdG8gY2FsbGJhY2sgd2l0aCBlYWNoIHByZXZpZXcgZnJhbWUKLSAgICB2b2lkIHNldEhhc0ZyYW1lQ2FsbGJhY2soYm9vbCBpbnN0YWxsZWQpCisKKyAgICAvLyBzZXQgdGhlIGZyYW1lIGNhbGxiYWNrIGZsYWcgdG8gYWZmZWN0IGhvdyB0aGUgcmVjZWl2ZWQgZnJhbWVzIGZyb20KKyAgICAvLyBwcmV2aWV3IGFyZSBoYW5kbGVkLgorICAgIHZvaWQgc2V0RnJhbWVDYWxsYmFja0ZsYWcoaW50IGZyYW1lX2NhbGxiYWNrX2ZsYWcpCiAgICAgeworICAgICAgICBMT0dWKCJzZXRGcmFtZUNhbGxiYWNrRmxhZyglZCkiLCBmcmFtZV9jYWxsYmFja19mbGFnKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KWluc3RhbGxlZCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfSEFTX0ZSQU1FX0NBTExCQUNLLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZnJhbWVfY2FsbGJhY2tfZmxhZyk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfRlJBTUVfQ0FMTEJBQ0tfRkxBRywgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKICAgICAvLyBzdGFydCBwcmV2aWV3IG1vZGUsIG11c3QgY2FsbCBzZXRQcmV2aWV3RGlzcGxheSBmaXJzdAogICAgIHN0YXR1c190IHN0YXJ0UHJldmlldygpCiAgICAgeworICAgICAgICBMT0dWKCJzdGFydFByZXZpZXciKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUQVJUX1BSRVZJRVcsIGRhdGEsICZyZXBseSk7CkBAIC04Niw2ICs5MCw3IEBACiAgICAgLy8gc3RvcCBwcmV2aWV3IG1vZGUKICAgICB2b2lkIHN0b3BQcmV2aWV3KCkKICAgICB7CisgICAgICAgIExPR1YoInN0b3BQcmV2aWV3Iik7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmE6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVE9QX1BSRVZJRVcsIGRhdGEsICZyZXBseSk7CkBAIC05NCw2ICs5OSw3IEBACiAgICAgLy8gYXV0byBmb2N1cwogICAgIHN0YXR1c190IGF1dG9Gb2N1cygpCiAgICAgeworICAgICAgICBMT0dWKCJhdXRvRm9jdXMiKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFVVE9fRk9DVVMsIGRhdGEsICZyZXBseSk7CkBAIC0xMDQsNiArMTEwLDcgQEAKICAgICAvLyB0YWtlIGEgcGljdHVyZSAtIHJldHVybnMgYW4gSU1lbW9yeSAocmVmLWNvdW50ZWQgbW1hcCkKICAgICBzdGF0dXNfdCB0YWtlUGljdHVyZSgpCiAgICAgeworICAgICAgICBMT0dWKCJ0YWtlUGljdHVyZSIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoVEFLRV9QSUNUVVJFLCBkYXRhLCAmcmVwbHkpOwpAQCAtMTE0LDYgKzEyMSw3IEBACiAgICAgLy8gc2V0IHByZXZpZXcvY2FwdHVyZSBwYXJhbWV0ZXJzIC0ga2V5L3ZhbHVlIHBhaXJzCiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpCiAgICAgeworICAgICAgICBMT0dWKCJzZXRQYXJhbWV0ZXJzIik7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmE6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KHBhcmFtcyk7CkBAIC0xMjQsMTEgKzEzMiwyMCBAQAogICAgIC8vIGdldCBwcmV2aWV3L2NhcHR1cmUgcGFyYW1ldGVycyAtIGtleS92YWx1ZSBwYWlycwogICAgIFN0cmluZzggZ2V0UGFyYW1ldGVycygpIGNvbnN0CiAgICAgeworICAgICAgICBMT0dWKCJnZXRQYXJhbWV0ZXJzIik7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmE6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUEFSQU1FVEVSUywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRTdHJpbmc4KCk7CiAgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdChjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjYW1lcmFDbGllbnQtPmFzQmluZGVyKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ09OTkVDVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShDYW1lcmEsICJhbmRyb2lkLmhhcmR3YXJlLklDYW1lcmEiKTsKQEAgLTE0Niw1MyArMTYzLDY4IEBACiB7CiAgICAgc3dpdGNoKGNvZGUpIHsKICAgICAgICAgY2FzZSBESVNDT05ORUNUOiB7CisgICAgICAgICAgICBMT0dWKCJESVNDT05ORUNUIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9QUkVWSUVXX0RJU1BMQVk6IHsKKyAgICAgICAgICAgIExPR1YoIlNFVF9QUkVWSUVXX0RJU1BMQVkiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxJU3VyZmFjZT4gc3VyZmFjZSA9IGludGVyZmFjZV9jYXN0PElTdXJmYWNlPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRQcmV2aWV3RGlzcGxheShzdXJmYWNlKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX0hBU19GUkFNRV9DQUxMQkFDSzogeworICAgICAgICBjYXNlIFNFVF9GUkFNRV9DQUxMQkFDS19GTEFHOiB7CisgICAgICAgICAgICBMT0dWKCJTRVRfRlJBTUVfQ0FMTEJBQ0tfVFlQRSIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmEsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGJvb2wgaW5zdGFsbGVkID0gKGJvb2wpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNldEhhc0ZyYW1lQ2FsbGJhY2soaW5zdGFsbGVkKTsKKyAgICAgICAgICAgIGludCBmcmFtZV9jYWxsYmFja19mbGFnID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNldEZyYW1lQ2FsbGJhY2tGbGFnKGZyYW1lX2NhbGxiYWNrX2ZsYWcpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNUQVJUX1BSRVZJRVc6IHsKKyAgICAgICAgICAgIExPR1YoIlNUQVJUX1BSRVZJRVciKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGFydFByZXZpZXcoKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU1RPUF9QUkVWSUVXOiB7CisgICAgICAgICAgICBMT0dWKCJTVE9QX1BSRVZJRVciKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzdG9wUHJldmlldygpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEFVVE9fRk9DVVM6IHsKKyAgICAgICAgICAgIExPR1YoIkFVVE9fRk9DVVMiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihhdXRvRm9jdXMoKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgVEFLRV9QSUNUVVJFOiB7CisgICAgICAgICAgICBMT0dWKCJUQUtFX1BJQ1RVUkUiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMih0YWtlUGljdHVyZSgpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfUEFSQU1FVEVSUzogeworICAgICAgICAgICAgTE9HVigiU0VUX1BBUkFNRVRFUlMiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICAgU3RyaW5nOCBwYXJhbXMoZGF0YS5yZWFkU3RyaW5nOCgpKTsKLSAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRQYXJhbWV0ZXJzKHBhcmFtcykpOworICAgICAgICAgICAgU3RyaW5nOCBwYXJhbXMoZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldFBhcmFtZXRlcnMocGFyYW1zKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEdFVF9QQVJBTUVURVJTOiB7CisgICAgICAgICAgICBMT0dWKCJHRVRfUEFSQU1FVEVSUyIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmEsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KGdldFBhcmFtZXRlcnMoKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIENPTk5FQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjYW1lcmFDbGllbnQgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhQ2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjb25uZWN0KGNhbWVyYUNsaWVudCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWJzL3VpL0lDYW1lcmFDbGllbnQuY3BwIGIvbGlicy91aS9JQ2FtZXJhQ2xpZW50LmNwcAppbmRleCAzNzM3MDM0Li5jNWQ2ZDUyIDEwMDY0NAotLS0gYS9saWJzL3VpL0lDYW1lcmFDbGllbnQuY3BwCisrKyBiL2xpYnMvdWkvSUNhbWVyYUNsaWVudC5jcHAKQEAgLTE1LDkgKzE1LDExIEBACiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSUNhbWVyYUNsaWVudCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQogI2luY2x1ZGUgPHVpL0lDYW1lcmFDbGllbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNDIsNiArNDQsNyBAQAogICAgIC8vIGNhbGxiYWNrIHRvIGxldCB0aGUgYXBwIGtub3cgdGhlIHNodXR0ZXIgaGFzIGNsb3NlZCwgaWRlYWwgZm9yIHBsYXlpbmcgdGhlIHNodXR0ZXIgc291bmQKICAgICB2b2lkIHNodXR0ZXJDYWxsYmFjaygpCiAgICAgeworICAgICAgICBMT0dWKCJzaHV0dGVyQ2FsbGJhY2siKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYUNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNIVVRURVJfQ0FMTEJBQ0ssIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwpAQCAtNTAsNiArNTMsNyBAQAogICAgIC8vIGNhbGxiYWNrIGZyb20gY2FtZXJhIHNlcnZpY2UgdG8gYXBwIHdpdGggcGljdHVyZSBkYXRhCiAgICAgdm9pZCByYXdDYWxsYmFjayhjb25zdCBzcDxJTWVtb3J5PiYgcGljdHVyZSkKICAgICB7CisgICAgICAgIExPR1YoInJhd0NhbGxiYWNrIik7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIocGljdHVyZS0+YXNCaW5kZXIoKSk7CkBAIC01OSw2ICs2Myw3IEBACiAgICAgLy8gY2FsbGJhY2sgZnJvbSBjYW1lcmEgc2VydmljZSB0byBhcHAgd2l0aCBwaWN0dXJlIGRhdGEKICAgICB2b2lkIGpwZWdDYWxsYmFjayhjb25zdCBzcDxJTWVtb3J5PiYgcGljdHVyZSkKICAgICB7CisgICAgICAgIExPR1YoImpwZWdDYWxsYmFjayIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHBpY3R1cmUtPmFzQmluZGVyKCkpOwpAQCAtNjgsNiArNzMsNyBAQAogICAgIC8vIGNhbGxiYWNrIGZyb20gY2FtZXJhIHNlcnZpY2UgdG8gYXBwIHdpdGggdmlkZW8gZnJhbWUgZGF0YQogICAgIHZvaWQgZnJhbWVDYWxsYmFjayhjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpCiAgICAgeworICAgICAgICBMT0dWKCJmcmFtZUNhbGxiYWNrIik7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoZnJhbWUtPmFzQmluZGVyKCkpOwpAQCAtNzcsNiArODMsNyBAQAogICAgIC8vIGNhbGxiYWNrIGZyb20gY2FtZXJhIHNlcnZpY2UgdG8gYXBwIHRvIHJlcG9ydCBlcnJvcgogICAgIHZvaWQgZXJyb3JDYWxsYmFjayhzdGF0dXNfdCBlcnJvcikKICAgICB7CisgICAgICAgIExPR1YoImVycm9yQ2FsbGJhY2siKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYUNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGVycm9yKTsKQEAgLTg2LDYgKzkzLDcgQEAKICAgICAvLyBjYWxsYmFjayBmcm9tIGNhbWVyYSBzZXJ2aWNlIHRvIGFwcCB0byByZXBvcnQgYXV0b2ZvY3VzIGNvbXBsZXRpb24KICAgICB2b2lkIGF1dG9Gb2N1c0NhbGxiYWNrKGJvb2wgZm9jdXNlZCkKICAgICB7CisgICAgICAgIExPR1YoImF1dG9Gb2N1c0NhbGxiYWNrIik7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmb2N1c2VkKTsKQEAgLTEwOCwzNSArMTE2LDQxIEBACiB7CiAgICAgc3dpdGNoKGNvZGUpIHsKICAgICAgICAgY2FzZSBTSFVUVEVSX0NBTExCQUNLOiB7CisgICAgICAgICAgICBMT0dWKCJTSFVUVEVSX0NBTExCQUNLIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYUNsaWVudCwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc2h1dHRlckNhbGxiYWNrKCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgUkFXX0NBTExCQUNLOiB7CisgICAgICAgICAgICBMT0dWKCJSQVdfQ0FMTEJBQ0siKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhQ2xpZW50LCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBwaWN0dXJlID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgICAgICAgICAgcmF3Q2FsbGJhY2socGljdHVyZSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgSlBFR19DQUxMQkFDSzogeworICAgICAgICAgICAgTE9HVigiSlBFR19DQUxMQkFDSyIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFDbGllbnQsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElNZW1vcnk+IHBpY3R1cmUgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgICAgICAgICBqcGVnQ2FsbGJhY2socGljdHVyZSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgRlJBTUVfQ0FMTEJBQ0s6IHsKKyAgICAgICAgICAgIExPR1YoIkZSQU1FX0NBTExCQUNLIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYUNsaWVudCwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SU1lbW9yeT4gZnJhbWUgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgICAgICAgICBmcmFtZUNhbGxiYWNrKGZyYW1lKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBFUlJPUl9DQUxMQkFDSzogeworICAgICAgICAgICAgTE9HVigiRVJST1JfQ0FMTEJBQ0siKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhQ2xpZW50LCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnJvciA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKGVycm9yKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBBVVRPRk9DVVNfQ0FMTEJBQ0s6IHsKKyAgICAgICAgICAgIExPR1YoIkFVVE9GT0NVU19DQUxMQkFDSyIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFDbGllbnQsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGJvb2wgZm9jdXNlZCA9IChib29sKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdXRvRm9jdXNDYWxsYmFjayhmb2N1c2VkKTsKZGlmZiAtLWdpdCBhL2xpYnMvdWkvSU92ZXJsYXkuY3BwIGIvbGlicy91aS9JT3ZlcmxheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkMWVhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvdWkvSU92ZXJsYXkuY3BwCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL1BhcmNlbC5oPgorI2luY2x1ZGUgPHV0aWxzL0lJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgPHVpL0lPdmVybGF5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgREVTVFJPWSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sIC8vIG9uZS13YXkgdHJhbnNhY3Rpb24KKyAgICBTV0FQX0JVRkZFUlMsCit9OworCitjbGFzcyBCcE92ZXJsYXkgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU92ZXJsYXk+Cit7CitwdWJsaWM6CisgICAgQnBPdmVybGF5KGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElPdmVybGF5PihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT3ZlcmxheTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERFU1RST1ksIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3NpemVfdCBzd2FwQnVmZmVycygpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT3ZlcmxheTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNXQVBfQlVGRkVSUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KK307CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShPdmVybGF5LCAiYW5kcm9pZC51aS5JT3ZlcmxheSIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQ0hFQ0tfSU5URVJGQUNFKGludGVyZmFjZSwgZGF0YSwgcmVwbHkpIFwKKyAgICAgICAgZG8geyBpZiAoIWRhdGEuZW5mb3JjZUludGVyZmFjZShpbnRlcmZhY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSkpIHsgXAorICAgICAgICAgICAgTE9HVygiQ2FsbCBpbmNvcnJlY3RseSByb3V0ZWQgdG8gIiAjaW50ZXJmYWNlKTsgXAorICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOyBcCisgICAgICAgIH0gfSB3aGlsZSAoMCkKKworc3RhdHVzX3QgQm5PdmVybGF5OjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3dpdGNoKGNvZGUpIHsKKyAgICAgICAgY2FzZSBERVNUUk9ZOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU92ZXJsYXksIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGRlc3Ryb3koKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTV0FQX0JVRkZFUlM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJT3ZlcmxheSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3NpemVfdCBvZmZzZXQgPSBzd2FwQnVmZmVycygpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIob2Zmc2V0KTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91aS9JU3VyZmFjZS5jcHAgYi9saWJzL3VpL0lTdXJmYWNlLmNwcAppbmRleCA4MTdmNGQ5Li5jMWM5NTk2IDEwMDY0NAotLS0gYS9saWJzL3VpL0lTdXJmYWNlLmNwcAorKysgYi9saWJzL3VpL0lTdXJmYWNlLmNwcApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0lNZW1vcnkuaD4KIAogI2luY2x1ZGUgPHVpL0lTdXJmYWNlLmg+CisjaW5jbHVkZSA8dWkvT3ZlcmxheS5oPgogCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTMwLDYgKzMxLDcgQEAKICAgICBSRUdJU1RFUl9CVUZGRVJTID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKICAgICBVTlJFR0lTVEVSX0JVRkZFUlMsCiAgICAgUE9TVF9CVUZGRVIsIC8vIG9uZS13YXkgdHJhbnNhY3Rpb24KKyAgICBDUkVBVEVfT1ZFUkxBWSwKIH07CiAKIGNsYXNzIEJwU3VyZmFjZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJU3VyZmFjZT4KQEAgLTcwLDYgKzcyLDE4IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFVOUkVHSVNURVJfQlVGRkVSUywgZGF0YSwgJnJlcGx5KTsKICAgICB9CisKKyAgICB2aXJ0dWFsIHNwPE92ZXJsYXk+IGNyZWF0ZU92ZXJsYXkoCisgICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgaW50MzJfdCBmb3JtYXQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHcpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX09WRVJMQVksIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiBPdmVybGF5OjpyZWFkRnJvbVBhcmNlbChyZXBseSk7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFN1cmZhY2UsICJhbmRyb2lkLnVpLklTdXJmYWNlIik7CkBAIC0xMDksNiArMTIzLDE0IEBACiAgICAgICAgICAgICBwb3N0QnVmZmVyKG9mZnNldCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQ1JFQVRFX09WRVJMQVk6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50IHcgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IGggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IGYgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc3A8T3ZlcmxheT4gbyA9IGNyZWF0ZU92ZXJsYXkodywgaCwgdyk7CisgICAgICAgICAgICByZXR1cm4gT3ZlcmxheTo6d3JpdGVUb1BhcmNlbChyZXBseSwgbyk7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYnMvdWkvSVN1cmZhY2VGbGluZ2VyQ2xpZW50LmNwcCBiL2xpYnMvdWkvSVN1cmZhY2VGbGluZ2VyQ2xpZW50LmNwcAppbmRleCA5NDQ0YWY3Li5kZDZhNzk4IDEwMDY0NAotLS0gYS9saWJzL3VpL0lTdXJmYWNlRmxpbmdlckNsaWVudC5jcHAKKysrIGIvbGlicy91aS9JU3VyZmFjZUZsaW5nZXJDbGllbnQuY3BwCkBAIC04Miw3ICs4Miw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZmxhZ3MpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX1NVUkZBQ0UsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHBhcmFtcy0+cmVhZEZyb21QYXJjZWwoZGF0YSk7CisgICAgICAgIHBhcmFtcy0+cmVhZEZyb21QYXJjZWwocmVwbHkpOwogICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SVN1cmZhY2U+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCkBAIC0xOTEsNyArMTkxLDYgQEAKIHsKICAgICB0b2tlbiA9IHBhcmNlbC5yZWFkSW50MzIoKTsKICAgICBpZGVudGl0eSAgPSBwYXJjZWwucmVhZEludDMyKCk7Ci0gICAgdHlwZSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKICAgICBoZWFwWzBdID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeUhlYXA+KHBhcmNlbC5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIGhlYXBbMV0gPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5SGVhcD4ocGFyY2VsLnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMjAxLDcgKzIwMCw2IEBACiB7CiAgICAgcGFyY2VsLT53cml0ZUludDMyKHRva2VuKTsKICAgICBwYXJjZWwtPndyaXRlSW50MzIoaWRlbnRpdHkpOwotICAgIHBhcmNlbC0+d3JpdGVJbnQzMih0eXBlKTsKICAgICBwYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKGhlYXBbMF0hPTAgPyBoZWFwWzBdLT5hc0JpbmRlcigpIDogTlVMTCk7CiAgICAgcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihoZWFwWzFdIT0wID8gaGVhcFsxXS0+YXNCaW5kZXIoKSA6IE5VTEwpOwogICAgIHJldHVybiBOT19FUlJPUjsKZGlmZiAtLWdpdCBhL2xpYnMvdWkvT3ZlcmxheS5jcHAgYi9saWJzL3VpL092ZXJsYXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjdjM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3VpL092ZXJsYXkuY3BwCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHV0aWxzL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDx1dGlscy9QYXJjZWwuaD4KKworI2luY2x1ZGUgPHVpL0lPdmVybGF5Lmg+CisjaW5jbHVkZSA8dWkvT3ZlcmxheS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK092ZXJsYXk6Ok92ZXJsYXkob3ZlcmxheV9oYW5kbGVfdCogaGFuZGxlLCAKKyAgICAgICAgY29uc3Qgc3A8SU92ZXJsYXk+JiBvLCBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIAorICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBpbnQzMl90IGYsIHVpbnQzMl90IHdzLCB1aW50MzJfdCBocykKKyAgICA6IG1PdmVybGF5KG8pLCBtSGVhcChoZWFwKSwgbUN1cnJlbnRCdWZmZXJPZmZzZXQoMCksIG1PdmVybGF5SGFuZGxlKGhhbmRsZSksCisgICAgICBtV2lkdGgodyksIG1IZWlnaHQoaCksIG1Gb3JtYXQoZiksIG1XaWR0aFN0cmlkZSh3cyksIG1IZWlnaHRTdHJpZGUoaHMpCit7Cit9CisKK092ZXJsYXk6Ok92ZXJsYXkob3ZlcmxheV90KiBvdmVybGF5LCAKKyAgICAgICAgY29uc3Qgc3A8SU92ZXJsYXk+JiBvLCBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXApCisgICAgOiBtT3ZlcmxheShvKSwgbUhlYXAoaGVhcCkgCit7CisgICAgbUN1cnJlbnRCdWZmZXJPZmZzZXQgPSAwOyAKKyAgICBtT3ZlcmxheUhhbmRsZSA9IG92ZXJsYXktPmdldEhhbmRsZVJlZihvdmVybGF5KTsKKyAgICBtV2lkdGggPSBvdmVybGF5LT53OworICAgIG1IZWlnaHQgPSBvdmVybGF5LT5oOworICAgIG1Gb3JtYXQgPSBvdmVybGF5LT5mb3JtYXQ7IAorICAgIG1XaWR0aFN0cmlkZSA9IG92ZXJsYXktPndfc3RyaWRlOworICAgIG1IZWlnaHRTdHJpZGUgPSBvdmVybGF5LT5oX3N0cmlkZTsKK30KKworCitPdmVybGF5Ojp+T3ZlcmxheSgpIHsKK30KKwordm9pZCBPdmVybGF5OjpkZXN0cm95KCkgeyAgCisgICAgbU92ZXJsYXktPmRlc3Ryb3koKTsKK30KKworc3RhdHVzX3QgT3ZlcmxheTo6c3dhcEJ1ZmZlcnMoKSB7CisgICAgc3NpemVfdCByZXN1bHQgPSBtT3ZlcmxheS0+c3dhcEJ1ZmZlcnMoKTsKKyAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgcmV0dXJuIHN0YXR1c190KHJlc3VsdCk7CisgICAgbUN1cnJlbnRCdWZmZXJPZmZzZXQgPSByZXN1bHQ7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitvdmVybGF5X2hhbmRsZV90IGNvbnN0KiBPdmVybGF5OjpnZXRIYW5kbGVSZWYoKSBjb25zdCB7CisgICAgcmV0dXJuIG1PdmVybGF5SGFuZGxlOworfQorCitzaXplX3QgT3ZlcmxheTo6Z2V0QnVmZmVyT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBtQ3VycmVudEJ1ZmZlck9mZnNldDsKK30KKworc3A8SU1lbW9yeUhlYXA+IE92ZXJsYXk6OmdldEhlYXAoKSBjb25zdCB7CisgICAgcmV0dXJuIG1IZWFwOworfQorCit1aW50MzJfdCBPdmVybGF5OjpnZXRXaWR0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVdpZHRoOworfQorCit1aW50MzJfdCBPdmVybGF5OjpnZXRIZWlnaHQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1IZWlnaHQ7Cit9CisKK2ludDMyX3QgT3ZlcmxheTo6Z2V0Rm9ybWF0KCkgY29uc3QgeworICAgIHJldHVybiBtRm9ybWF0OworfQorCitpbnQzMl90IE92ZXJsYXk6OmdldFdpZHRoU3RyaWRlKCkgY29uc3QgeworICAgIHJldHVybiBtV2lkdGhTdHJpZGU7Cit9CisKK2ludDMyX3QgT3ZlcmxheTo6Z2V0SGVpZ2h0U3RyaWRlKCkgY29uc3QgeworICAgIHJldHVybiBtSGVpZ2h0U3RyaWRlOworfQorCitzcDxPdmVybGF5PiBPdmVybGF5OjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwmIGRhdGEpIHsKKyAgICBzcDxPdmVybGF5PiByZXN1bHQ7CisgICAgc3A8SU92ZXJsYXk+IG92ZXJsYXkgPSBJT3ZlcmxheTo6YXNJbnRlcmZhY2UoZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgIGlmIChvdmVybGF5ICE9IE5VTEwpIHsKKyAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBJTWVtb3J5SGVhcDo6YXNJbnRlcmZhY2UoZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICB1aW50MzJfdCB3ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgdWludDMyX3QgaCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIHVpbnQzMl90IGYgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICB1aW50MzJfdCB3cyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIHVpbnQzMl90IGhzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgLyogRklYTUU6IGhhbmRsZXMgc2hvdWxkIGJlIHByb21vdGVkIHRvICJyZWFsIiBBUEkgYW5kIGJlIGhhbmRsZWQgYnkgCisgICAgICAgICAqIHRoZSBmcmFtZXdvcmsgKi8KKyAgICAgICAgaW50IG51bWZkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaW50IG51bWludCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIG92ZXJsYXlfaGFuZGxlX3QqIGhhbmRsZSA9IChvdmVybGF5X2hhbmRsZV90KiltYWxsb2MoCisgICAgICAgICAgICAgICAgc2l6ZW9mKG92ZXJsYXlfaGFuZGxlX3QpICsgbnVtaW50KnNpemVvZihpbnQpKTsKKyAgICAgICAgZm9yIChpbnQgaT0wIDsgaTxudW1mZCA7IGkrKykKKyAgICAgICAgICAgIGhhbmRsZS0+ZmRzW2ldID0gZGF0YS5yZWFkRmlsZURlc2NyaXB0b3IoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wIDsgaTxudW1pbnQgOyBpKyspCisgICAgICAgICAgICBoYW5kbGUtPmRhdGFbaV0gPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICByZXN1bHQgPSBuZXcgT3ZlcmxheShoYW5kbGUsIG92ZXJsYXksIGhlYXAsIHcsIGgsIGYsIHdzLCBocyk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IE92ZXJsYXk6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiByZXBseSwgY29uc3Qgc3A8T3ZlcmxheT4mIG8pIHsKKyAgICBpZiAobyAhPSBOVUxMKSB7CisgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihvLT5tT3ZlcmxheS0+YXNCaW5kZXIoKSk7CisgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihvLT5tSGVhcC0+YXNCaW5kZXIoKSk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG8tPm1XaWR0aCk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG8tPm1IZWlnaHQpOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihvLT5tRm9ybWF0KTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoby0+bVdpZHRoU3RyaWRlKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoby0+bUhlaWdodFN0cmlkZSk7CisgICAgICAgIC8qIEZJWE1FOiBoYW5kbGVzIHNob3VsZCBiZSBwcm9tb3RlZCB0byAicmVhbCIgQVBJIGFuZCBiZSBoYW5kbGVkIGJ5IAorICAgICAgICAgKiB0aGUgZnJhbWV3b3JrICovCisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG8tPm1PdmVybGF5SGFuZGxlLT5udW1GZHMpOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihvLT5tT3ZlcmxheUhhbmRsZS0+bnVtSW50cyk7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8by0+bU92ZXJsYXlIYW5kbGUtPm51bUZkcyA7IGkrKykKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUZpbGVEZXNjcmlwdG9yKG8tPm1PdmVybGF5SGFuZGxlLT5mZHNbaV0pOworICAgICAgICBmb3IgKGludCBpPTAgOyBpPG8tPm1PdmVybGF5SGFuZGxlLT5udW1JbnRzIDsgaSsrKQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoby0+bU92ZXJsYXlIYW5kbGUtPmRhdGFbaV0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihOVUxMKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL2xpYnMvdWkvU3VyZmFjZS5jcHAgYi9saWJzL3VpL1N1cmZhY2UuY3BwCmluZGV4IDBhOWFhYWQuLjRlYTlhZTIgMTAwNjQ0Ci0tLSBhL2xpYnMvdWkvU3VyZmFjZS5jcHAKKysrIGIvbGlicy91aS9TdXJmYWNlLmNwcApAQCAtNDcsNyArNDcsNyBAQAogICAgICAgICBjb25zdCBJU3VyZmFjZUZsaW5nZXJDbGllbnQ6OnN1cmZhY2VfZGF0YV90JiBkYXRhLAogICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBQaXhlbEZvcm1hdCBmb3JtYXQsIHVpbnQzMl90IGZsYWdzLAogICAgICAgICBib29sIG93bmVyKQotICAgIDogbUNsaWVudChjbGllbnQpLCBtU3VyZmFjZShzdXJmYWNlKSwgbU1lbW9yeVR5cGUoZGF0YS50eXBlKSwKKyAgICA6IG1DbGllbnQoY2xpZW50KSwgbVN1cmZhY2Uoc3VyZmFjZSksCiAgICAgICBtVG9rZW4oZGF0YS50b2tlbiksIG1JZGVudGl0eShkYXRhLmlkZW50aXR5KSwKICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwgbUZsYWdzKGZsYWdzKSwgbU93bmVyKG93bmVyKQogewpAQCAtNjcsNyArNjcsNiBAQAogICAgIG1TdXJmYWNlID0gcmhzLT5tU3VyZmFjZTsKICAgICBtSGVhcFswXSA9IHJocy0+bUhlYXBbMF07CiAgICAgbUhlYXBbMV0gPSByaHMtPm1IZWFwWzFdOwotICAgIG1NZW1vcnlUeXBlID0gcmhzLT5tTWVtb3J5VHlwZTsKICAgICBtRm9ybWF0ICA9IHJocy0+bUZvcm1hdDsKICAgICBtRmxhZ3MgICA9IHJocy0+bUZsYWdzOwogICAgIG1TdXJmYWNlSGVhcEJhc2VbMF0gPSByaHMtPm1TdXJmYWNlSGVhcEJhc2VbMF07CkBAIC0xODYsNyArMTg1LDYgQEAKICAgICBzcDxJU3VyZmFjZT4gc3VyZmFjZSAgICA9IGludGVyZmFjZV9jYXN0PElTdXJmYWNlPihwYXJjZWwtPnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgZGF0YS5oZWFwWzBdICAgICAgICAgICAgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5SGVhcD4ocGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIGRhdGEuaGVhcFsxXSAgICAgICAgICAgID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeUhlYXA+KHBhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICBkYXRhLnR5cGUgICAgICAgICAgICAgICA9IHBhcmNlbC0+cmVhZEludDMyKCk7CiAgICAgZGF0YS50b2tlbiAgICAgICAgICAgICAgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwogICAgIGRhdGEuaWRlbnRpdHkgICAgICAgICAgID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKICAgICBQaXhlbEZvcm1hdCBmb3JtYXQgICAgICA9IHBhcmNlbC0+cmVhZEludDMyKCk7CkBAIC0yMDcsNyArMjA1LDYgQEAKICAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNsaWVudDsKICAgICBzcDxJU3VyZmFjZT4gc3VyOwogICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwWzJdOwotICAgIGludCB0eXBlID0gMDsKICAgICBpZiAoc3VyZmFjZS0+aXNWYWxpZCgpKSB7CiAgICAgICAgIHRva2VuID0gc3VyZmFjZS0+bVRva2VuOwogICAgICAgICBpZGVudGl0eSA9IHN1cmZhY2UtPm1JZGVudGl0eTsKQEAgLTIxNSw3ICsyMTIsNiBAQAogICAgICAgICBzdXIgPSBzdXJmYWNlLT5tU3VyZmFjZTsKICAgICAgICAgaGVhcFswXSA9IHN1cmZhY2UtPm1IZWFwWzBdOwogICAgICAgICBoZWFwWzFdID0gc3VyZmFjZS0+bUhlYXBbMV07Ci0gICAgICAgIHR5cGUgPSBzdXJmYWNlLT5tTWVtb3J5VHlwZTsKICAgICAgICAgZm9ybWF0ID0gc3VyZmFjZS0+bUZvcm1hdDsKICAgICAgICAgZmxhZ3MgPSBzdXJmYWNlLT5tRmxhZ3M7CiAgICAgfQpAQCAtMjIzLDcgKzIxOSw2IEBACiAgICAgcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihzdXIhPTAgICAgID8gc3VyLT5hc0JpbmRlcigpICAgICAgOiBOVUxMKTsKICAgICBwYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKGhlYXBbMF0hPTAgPyBoZWFwWzBdLT5hc0JpbmRlcigpICA6IE5VTEwpOwogICAgIHBhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIoaGVhcFsxXSE9MCA/IGhlYXBbMV0tPmFzQmluZGVyKCkgIDogTlVMTCk7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKHR5cGUpOwogICAgIHBhcmNlbC0+d3JpdGVJbnQzMih0b2tlbik7CiAgICAgcGFyY2VsLT53cml0ZUludDMyKGlkZW50aXR5KTsKICAgICBwYXJjZWwtPndyaXRlSW50MzIoZm9ybWF0KTsKZGlmZiAtLWdpdCBhL2xpYnMvdWkvVGltZS5jcHAgYi9saWJzL3VpL1RpbWUuY3BwCmluZGV4IGM5ODY2N2YuLmI1NTM5MTMgMTAwNjQ0Ci0tLSBhL2xpYnMvdWkvVGltZS5jcHAKKysrIGIvbGlicy91aS9UaW1lLmNwcApAQCAtODUsMTAgKzg1LDEwIEBACiB9CiAKIFN0cmluZzggCi1UaW1lOjpmb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0KSBjb25zdAorVGltZTo6Zm9ybWF0KGNvbnN0IGNoYXIgKmZvcm1hdCwgY29uc3Qgc3RydWN0IHN0cmZ0aW1lX2xvY2FsZSAqbG9jYWxlKSBjb25zdAogewogICAgIGNoYXIgYnVmWzI1N107Ci0gICAgaW50IG4gPSBzdHJmdGltZShidWYsIDI1NywgZm9ybWF0LCAmKHRoaXMtPnQpKTsKKyAgICBpbnQgbiA9IHN0cmZ0aW1lX3R6KGJ1ZiwgMjU3LCBmb3JtYXQsICYodGhpcy0+dCksIGxvY2FsZSk7CiAgICAgaWYgKG4gPiAwKSB7CiAgICAgICAgIHJldHVybiBTdHJpbmc4KGJ1Zik7CiAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvQW5kcm9pZC5tayBiL2xpYnMvdXRpbHMvQW5kcm9pZC5tawppbmRleCA0YTY4ZGMxLi5jZGI4Y2EyIDEwMDY0NAotLS0gYS9saWJzL3V0aWxzL0FuZHJvaWQubWsKKysrIGIvbGlicy91dGlscy9BbmRyb2lkLm1rCkBAIC0xMzksNiArMTM5LDE0IEBACiAJbGlibG9nIFwKIAlsaWJjdXRpbHMKIAoraWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKK2lmZXEgKCQoVEFSR0VUX09TKS0kKFRBUkdFVF9BUkNIKSxsaW51eC14ODYpCisjIFRoaXMgaXMgbmVlZGVkIG9uIHg4NiB0byBicmluZyBpbiBkbF9pdGVyYXRlX3BoZHIgZm9yIENhbGxTdGFjay5jcHAKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAorCWxpYmRsCitlbmRpZiAjIGxpbnV4LXg4NgorZW5kaWYgIyBzaW0KKwogTE9DQUxfTU9EVUxFOj0gbGlidXRpbHMKIAogI0xPQ0FMX0NGTEFHUys9CmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL0NhbGxTdGFjay5jcHAgYi9saWJzL3V0aWxzL0NhbGxTdGFjay5jcHAKaW5kZXggNDk2ODY2Ni4uMjZmYjIyYSAxMDA2NDQKLS0tIGEvbGlicy91dGlscy9DYWxsU3RhY2suY3BwCisrKyBiL2xpYnMvdXRpbHMvQ2FsbFN0YWNrLmNwcApAQCAtNzksMzUgKzc5LDM1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyAKLWNvbnN0IGNoYXIgKmxvb2t1cF9zeW1ib2woY29uc3Qgdm9pZCogYWRkciwgdWludDMyX3QgKm9mZnNldCwgY2hhciogbmFtZSwgc2l6ZV90IGJ1ZlNpemUpCitjb25zdCBjaGFyICpsb29rdXBfc3ltYm9sKGNvbnN0IHZvaWQqIGFkZHIsIHZvaWQgKipvZmZzZXQsIGNoYXIqIG5hbWUsIHNpemVfdCBidWZTaXplKQogewogI2lmIEhBVkVfRExBRERSCi0JRGxfaW5mbyBpbmZvOwotCWlmIChkbGFkZHIoYWRkciwgJmluZm8pKSB7Ci0JCSpvZmZzZXQgPSAodWludDMyX3QpaW5mby5kbGlfc2FkZHI7Ci0JCXJldHVybiBpbmZvLmRsaV9zbmFtZTsKLQl9CisgICAgRGxfaW5mbyBpbmZvOworICAgIGlmIChkbGFkZHIoYWRkciwgJmluZm8pKSB7CisgICAgICAgICpvZmZzZXQgPSBpbmZvLmRsaV9zYWRkcjsKKyAgICAgICAgcmV0dXJuIGluZm8uZGxpX3NuYW1lOworICAgIH0KICNlbmRpZgotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgCiBpbnQzMl90IGxpbnV4X2djY19kZW1hbmdsZXIoY29uc3QgY2hhciAqbWFuZ2xlZF9uYW1lLCBjaGFyICp1bm1hbmdsZWRfbmFtZSwgc2l6ZV90IGJ1ZmZlcnNpemUpCiB7Ci0Jc2l6ZV90IG91dF9sZW4gPSAwOworICAgIHNpemVfdCBvdXRfbGVuID0gMDsKICNpZiBIQVZFX0NYWEFCSQotCWludCBzdGF0dXMgPSAwOwotCWNoYXIgKmRlbWFuZ2xlZCA9IGFiaTo6X19jeGFfZGVtYW5nbGUobWFuZ2xlZF9uYW1lLCAwLCAmb3V0X2xlbiwgJnN0YXR1cyk7Ci0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCS8vIE9LCi0JCWlmIChvdXRfbGVuIDwgYnVmZmVyc2l6ZSkgbWVtY3B5KHVubWFuZ2xlZF9uYW1lLCBkZW1hbmdsZWQsIG91dF9sZW4pOwotCQllbHNlIG91dF9sZW4gPSAwOwotCQlmcmVlKGRlbWFuZ2xlZCk7Ci0JfSBlbHNlIHsKLQkJb3V0X2xlbiA9IDA7Ci0JfQorICAgIGludCBzdGF0dXMgPSAwOworICAgIGNoYXIgKmRlbWFuZ2xlZCA9IGFiaTo6X19jeGFfZGVtYW5nbGUobWFuZ2xlZF9uYW1lLCAwLCAmb3V0X2xlbiwgJnN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIC8vIE9LCisgICAgICAgIGlmIChvdXRfbGVuIDwgYnVmZmVyc2l6ZSkgbWVtY3B5KHVubWFuZ2xlZF9uYW1lLCBkZW1hbmdsZWQsIG91dF9sZW4pOworICAgICAgICBlbHNlIG91dF9sZW4gPSAwOworICAgICAgICBmcmVlKGRlbWFuZ2xlZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0X2xlbiA9IDA7CisgICAgfQogI2VuZGlmCi0JcmV0dXJuIG91dF9sZW47CisgICAgcmV0dXJuIG91dF9sZW47CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTExNSwxMiArMTE1LDEyIEBACiBjbGFzcyBNYXBJbmZvIHsKICAgICBzdHJ1Y3QgbWFwaW5mbyB7CiAgICAgICAgIHN0cnVjdCBtYXBpbmZvICpuZXh0OwotICAgICAgICB1bnNpZ25lZCBzdGFydDsKLSAgICAgICAgdW5zaWduZWQgZW5kOworICAgICAgICB1aW50NjRfdCBzdGFydDsKKyAgICAgICAgdWludDY0X3QgZW5kOwogICAgICAgICBjaGFyIG5hbWVbXTsKICAgICB9OwogCi0gICAgY29uc3QgY2hhciAqbWFwX3RvX25hbWUodW5zaWduZWQgcGMsIGNvbnN0IGNoYXIqIGRlZikgeworICAgIGNvbnN0IGNoYXIgKm1hcF90b19uYW1lKHVpbnQ2NF90IHBjLCBjb25zdCBjaGFyKiBkZWYpIHsKICAgICAgICAgbWFwaW5mbyogbWkgPSBnZXRNYXBJbmZvTGlzdCgpOwogICAgICAgICB3aGlsZShtaSkgewogICAgICAgICAgICAgaWYgKChwYyA+PSBtaS0+c3RhcnQpICYmIChwYyA8IG1pLT5lbmQpKQpAQCAtMTM5LDggKzEzOSw4IEBACiAgICAgICAgIGlmIChsaW5lWzIwXSAhPSAneCcpIHJldHVybiAwOwogICAgICAgICBtaSA9IChtYXBpbmZvKiltYWxsb2Moc2l6ZW9mKG1hcGluZm8pICsgKGxlbiAtIDQ3KSk7CiAgICAgICAgIGlmIChtaSA9PSAwKSByZXR1cm4gMDsKLSAgICAgICAgbWktPnN0YXJ0ID0gc3RydG91bChsaW5lLCAwLCAxNik7Ci0gICAgICAgIG1pLT5lbmQgPSBzdHJ0b3VsKGxpbmUgKyA5LCAwLCAxNik7CisgICAgICAgIG1pLT5zdGFydCA9IHN0cnRvdWxsKGxpbmUsIDAsIDE2KTsKKyAgICAgICAgbWktPmVuZCA9IHN0cnRvdWxsKGxpbmUgKyA5LCAwLCAxNik7CiAgICAgICAgIG1pLT5uZXh0ID0gMDsKICAgICAgICAgc3RyY3B5KG1pLT5uYW1lLCBsaW5lICsgNDkpOwogICAgICAgICByZXR1cm4gbWk7CkBAIC0xODQsNyArMTg0LDcgQEAKICAgICB9CiAgICAgCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKm1hcEFkZHJlc3NUb05hbWUoY29uc3Qgdm9pZCogcGMsIGNvbnN0IGNoYXIqIGRlZikgewotICAgICAgICByZXR1cm4gc01hcEluZm8ubWFwX3RvX25hbWUoKHVuc2lnbmVkKXBjLCBkZWYpOworICAgICAgICByZXR1cm4gc01hcEluZm8ubWFwX3RvX25hbWUoKHVpbnQ2NF90KXBjLCBkZWYpOwogICAgIH0KIAogfTsKQEAgLTI3OCw3ICsyNzgsNyBAQAogICAgIGNoYXIgdG1wWzI1Nl07CiAgICAgY2hhciB0bXAxWzMyXTsKICAgICBjaGFyIHRtcDJbMzJdOwotICAgIHVpbnQzMl90IG9mZnM7CisgICAgdm9pZCAqb2ZmczsKIAogICAgIGNvbnN0IHZvaWQqIGlwID0gbVN0YWNrW2xldmVsXTsKICAgICBpZiAoIWlwKSByZXR1cm4gcmVzOwpAQCAtMjkxLDE0ICsyOTEsMTQgQEAKICAgICBpZiAobmFtZSkgewogICAgICAgICBpZiAobGludXhfZ2NjX2RlbWFuZ2xlcihuYW1lLCB0bXAsIDI1NikgIT0gMCkKICAgICAgICAgICAgIG5hbWUgPSB0bXA7Ci0gICAgICAgIHNucHJpbnRmKHRtcDEsIDMyLCAiMHglMDh4OiA8IiwgKHNpemVfdClpcCk7Ci0gICAgICAgIHNucHJpbnRmKHRtcDIsIDMyLCAiPisweCUwOHgiLCBvZmZzKTsKKyAgICAgICAgc25wcmludGYodG1wMSwgMzIsICIweCVwOiA8IiwgaXApOworICAgICAgICBzbnByaW50Zih0bXAyLCAzMiwgIj4rMHglcCIsIG9mZnMpOwogICAgICAgICByZXMuYXBwZW5kKHRtcDEpOwogICAgICAgICByZXMuYXBwZW5kKG5hbWUpOwogICAgICAgICByZXMuYXBwZW5kKHRtcDIpOwogICAgIH0gZWxzZSB7IAogICAgICAgICBuYW1lID0gTWFwSW5mbzo6bWFwQWRkcmVzc1RvTmFtZShpcCwgIjx1bmtub3duPiIpOwotICAgICAgICBzbnByaW50Zih0bXAsIDI1NiwgInBjICUwOHggICVzIiwgKHNpemVfdClpcCwgbmFtZSk7CisgICAgICAgIHNucHJpbnRmKHRtcCwgMjU2LCAicGMgJXAgICVzIiwgaXAsIG5hbWUpOwogICAgICAgICByZXMuYXBwZW5kKHRtcCk7CiAgICAgfQogICAgIHJlcy5hcHBlbmQoIlxuIik7CmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL0lQQ1RocmVhZFN0YXRlLmNwcCBiL2xpYnMvdXRpbHMvSVBDVGhyZWFkU3RhdGUuY3BwCmluZGV4IGNhNDlkOWEuLjA0YWUxNDIgMTAwNjQ0Ci0tLSBhL2xpYnMvdXRpbHMvSVBDVGhyZWFkU3RhdGUuY3BwCisrKyBiL2xpYnMvdXRpbHMvSVBDVGhyZWFkU3RhdGUuY3BwCkBAIC0zOTEsNiArMzkxLDI5IEBACiAgICAgc3RhdHVzX3QgcmVzdWx0OwogICAgIGRvIHsKICAgICAgICAgaW50MzJfdCBjbWQ7CisgICAgICAgIAorICAgICAgICAvLyBXaGVuIHdlJ3ZlIGNsZWFyZWQgdGhlIGluY29taW5nIGNvbW1hbmQgcXVldWUsIHByb2Nlc3MgYW55IHBlbmRpbmcgZGVyZWZzCisgICAgICAgIGlmIChtSW4uZGF0YVBvc2l0aW9uKCkgPj0gbUluLmRhdGFTaXplKCkpIHsKKyAgICAgICAgICAgIHNpemVfdCBudW1QZW5kaW5nID0gbVBlbmRpbmdXZWFrRGVyZWZzLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChudW1QZW5kaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUGVuZGluZzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFJlZkJhc2U6OndlYWtyZWZfdHlwZSogcmVmcyA9IG1QZW5kaW5nV2Vha0RlcmVmc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgcmVmcy0+ZGVjV2VhayhtUHJvY2Vzcy5nZXQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1QZW5kaW5nV2Vha0RlcmVmcy5jbGVhcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBudW1QZW5kaW5nID0gbVBlbmRpbmdTdHJvbmdEZXJlZnMuc2l6ZSgpOworICAgICAgICAgICAgaWYgKG51bVBlbmRpbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1QZW5kaW5nOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQkJpbmRlciogb2JqID0gbVBlbmRpbmdTdHJvbmdEZXJlZnNbaV07CisgICAgICAgICAgICAgICAgICAgIG9iai0+ZGVjU3Ryb25nKG1Qcm9jZXNzLmdldCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVBlbmRpbmdTdHJvbmdEZXJlZnMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyBnZXQgdGhlIG5leHQgY29tbWFuZCB0byBiZSBwcm9jZXNzZWQsIHdhaXRpbmcgaWYgbmVjZXNzYXJ5CiAgICAgICAgIHJlc3VsdCA9IHRhbGtXaXRoRHJpdmVyKCk7CiAgICAgICAgIGlmIChyZXN1bHQgPj0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHNpemVfdCBJTiA9IG1Jbi5kYXRhQXZhaWwoKTsKQEAgLTgzMiw3ICs4NTUsNyBAQAogICAgICAgICAgICAgTE9HX1JFTU9URVJFRlMoIkJSX1JFTEVBU0UgZnJvbSBkcml2ZXIgb24gJXAiLCBvYmopOwogICAgICAgICAgICAgb2JqLT5wcmludFJlZnMoKTsKICAgICAgICAgfQotICAgICAgICBvYmotPmRlY1N0cm9uZyhtUHJvY2Vzcy5nZXQoKSk7CisgICAgICAgIG1QZW5kaW5nU3Ryb25nRGVyZWZzLnB1c2gob2JqKTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgIAogICAgIGNhc2UgQlJfSU5DUkVGUzoKQEAgLTg1Myw3ICs4NzYsNyBAQAogICAgICAgICAvL0xPR19BU1NFUlQocmVmcy0+cmVmQmFzZSgpID09IG9iaiwKICAgICAgICAgLy8gICAgICAgICAgICJCUl9ERUNSRUZTOiBvYmplY3QgJXAgZG9lcyBub3QgbWF0Y2ggY29va2llICVwIChleHBlY3RlZCAlcCkiLAogICAgICAgICAvLyAgICAgICAgICAgcmVmcywgb2JqLCByZWZzLT5yZWZCYXNlKCkpOwotICAgICAgICByZWZzLT5kZWNXZWFrKG1Qcm9jZXNzLmdldCgpKTsKKyAgICAgICAgbVBlbmRpbmdXZWFrRGVyZWZzLnB1c2gocmVmcyk7CiAgICAgICAgIGJyZWFrOwogICAgICAgICAKICAgICBjYXNlIEJSX0FUVEVNUFRfQUNRVUlSRToKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvTG9nU29ja2V0LmNwcCBiL2xpYnMvdXRpbHMvTG9nU29ja2V0LmNwcAppbmRleCBlNjRmNzk0Li41NWMxYjk5IDEwMDY0NAotLS0gYS9saWJzL3V0aWxzL0xvZ1NvY2tldC5jcHAKKysrIGIvbGlicy91dGlscy9Mb2dTb2NrZXQuY3BwCkBAIC0xNiw3ICsxNiw3IEBACiAKIAogI2lmbmRlZiBIQVZFX1dJTlNPQ0sKLSNkZWZpbmUgU09DS0VUTE9HCisvLyNkZWZpbmUgU09DS0VUTE9HCiAjZW5kaWYKIAogI2lmZGVmIFNPQ0tFVExPRwpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9NZW1vcnlEZWFsZXIuY3BwIGIvbGlicy91dGlscy9NZW1vcnlEZWFsZXIuY3BwCmluZGV4IGU2ZDFkMTguLmNmODIwMWIgMTAwNjQ0Ci0tLSBhL2xpYnMvdXRpbHMvTWVtb3J5RGVhbGVyLmNwcAorKysgYi9saWJzL3V0aWxzL01lbW9yeURlYWxlci5jcHAKQEAgLTM4NywyMSArMzg3LDIzIEBACiAgICAgc3RhcnQgPSAoc3RhcnQgKyBwYWdlc2l6ZS0xKSAmIH4ocGFnZXNpemUtMSk7CiAgICAgZW5kICY9IH4ocGFnZXNpemUtMSk7ICAgIAogCi0gICAgdm9pZCogY29uc3Qgc3RhcnRfcHRyID0gKHZvaWQqKShpbnRwdHJfdChnZXRIZWFwKCktPmJhc2UoKSkgKyBzdGFydCk7Ci0gICAgc2l6ZV90IHNpemUgPSBlbmQtc3RhcnQ7CisgICAgaWYgKHN0YXJ0IDwgZW5kKSB7CisgICAgICAgIHZvaWQqIGNvbnN0IHN0YXJ0X3B0ciA9ICh2b2lkKikoaW50cHRyX3QoZ2V0SGVhcCgpLT5iYXNlKCkpICsgc3RhcnQpOworICAgICAgICBzaXplX3Qgc2l6ZSA9IGVuZC1zdGFydDsKIAogI2lmbmRlZiBOREVCVUcKLSAgICBtZW1zZXQoc3RhcnRfcHRyLCAweGRmLCBzaXplKTsKKyAgICAgICAgbWVtc2V0KHN0YXJ0X3B0ciwgMHhkZiwgc2l6ZSk7CiAjZW5kaWYKLSAgCi0vLyBNQURWX1JFTU9WRSBpcyBub3QgZGVmaW5lZCBvbiBEYXBwZXIgYmFzZWQgR29vYnVudHUgCisKKyAgICAgICAgLy8gTUFEVl9SRU1PVkUgaXMgbm90IGRlZmluZWQgb24gRGFwcGVyIGJhc2VkIEdvb2J1bnR1IAogI2lmZGVmIE1BRFZfUkVNT1ZFIAotICAgIGlmIChzaXplKSB7Ci0gICAgICAgIGludCBlcnIgPSBtYWR2aXNlKHN0YXJ0X3B0ciwgc2l6ZSwgTUFEVl9SRU1PVkUpOwotICAgICAgICBMT0dXX0lGKGVyciwgIm1hZHZpc2UoJXAsICV1LCBNQURWX1JFTU9WRSkgcmV0dXJuZWQgJXMiLAotICAgICAgICAgICAgICAgIHN0YXJ0X3B0ciwgc2l6ZSwgZXJyPDAgPyBzdHJlcnJvcihlcnJubykgOiAiT2siKTsKLSAgICB9CisgICAgICAgIGlmIChzaXplKSB7CisgICAgICAgICAgICBpbnQgZXJyID0gbWFkdmlzZShzdGFydF9wdHIsIHNpemUsIE1BRFZfUkVNT1ZFKTsKKyAgICAgICAgICAgIExPR1dfSUYoZXJyLCAibWFkdmlzZSglcCwgJXUsIE1BRFZfUkVNT1ZFKSByZXR1cm5lZCAlcyIsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3B0ciwgc2l6ZSwgZXJyPDAgPyBzdHJlcnJvcihlcnJubykgOiAiT2siKTsKKyAgICAgICAgfQogI2VuZGlmCisgICAgfQogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9NZW1vcnlIZWFwUG1lbS5jcHAgYi9saWJzL3V0aWxzL01lbW9yeUhlYXBQbWVtLmNwcAppbmRleCAxZTVhMWNjLi5lYmEyYjMwIDEwMDY0NAotLS0gYS9saWJzL3V0aWxzL01lbW9yeUhlYXBQbWVtLmNwcAorKysgYi9saWJzL3V0aWxzL01lbW9yeUhlYXBQbWVtLmNwcApAQCAtMzgsOSArMzgsMjAgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIE1lbW9yeUhlYXBQbWVtOworTWVtb3J5SGVhcFBtZW06Ok1lbW9yeVBtZW06Ok1lbW9yeVBtZW0oY29uc3Qgc3A8TWVtb3J5SGVhcFBtZW0+JiBoZWFwKQorICAgIDogQm5NZW1vcnkoKSwgbUNsaWVudEhlYXAoaGVhcCkKK3sKK30KIAotY2xhc3MgU3ViUmVnaW9uTWVtb3J5IDogcHVibGljIEJuTWVtb3J5IHsKK01lbW9yeUhlYXBQbWVtOjpNZW1vcnlQbWVtOjp+TWVtb3J5UG1lbSgpIHsKKyAgICBpZiAobUNsaWVudEhlYXAgIT0gTlVMTCkgeworICAgICAgICBtQ2xpZW50SGVhcC0+cmVtb3ZlKHRoaXMpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFN1YlJlZ2lvbk1lbW9yeSA6IHB1YmxpYyBNZW1vcnlIZWFwUG1lbTo6TWVtb3J5UG1lbSB7CiBwdWJsaWM6CiAgICAgU3ViUmVnaW9uTWVtb3J5KGNvbnN0IHNwPE1lbW9yeUhlYXBQbWVtPiYgaGVhcCwgc3NpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKICAgICB2aXJ0dWFsIH5TdWJSZWdpb25NZW1vcnkoKTsKQEAgLTUwLDE1ICs2MSwxNCBAQAogICAgIHZvaWQgcmV2b2tlKCk7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICBtU2l6ZTsKICAgICBzc2l6ZV90ICAgICAgICAgICAgIG1PZmZzZXQ7Ci0gICAgc3A8TWVtb3J5SGVhcFBtZW0+ICBtQ2xpZW50SGVhcDsKIH07CiAKIFN1YlJlZ2lvbk1lbW9yeTo6U3ViUmVnaW9uTWVtb3J5KGNvbnN0IHNwPE1lbW9yeUhlYXBQbWVtPiYgaGVhcCwKICAgICAgICAgc3NpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQotICAgIDogbVNpemUoc2l6ZSksIG1PZmZzZXQob2Zmc2V0KSwgbUNsaWVudEhlYXAoaGVhcCkKKyAgICA6IE1lbW9yeUhlYXBQbWVtOjpNZW1vcnlQbWVtKGhlYXApLCBtU2l6ZShzaXplKSwgbU9mZnNldChvZmZzZXQpCiB7CiAjaWZuZGVmIE5ERUJVRwotICAgIHZvaWQqIGNvbnN0IHN0YXJ0X3B0ciA9ICh2b2lkKikoaW50cHRyX3QobUNsaWVudEhlYXAtPmJhc2UoKSkgKyBvZmZzZXQpOworICAgIHZvaWQqIGNvbnN0IHN0YXJ0X3B0ciA9ICh2b2lkKikoaW50cHRyX3QoZ2V0SGVhcCgpLT5iYXNlKCkpICsgb2Zmc2V0KTsKICAgICBtZW1zZXQoc3RhcnRfcHRyLCAweGRhLCBzaXplKTsKICNlbmRpZgogCkBAIC04MCw3ICs5MCw3IEBACiB7CiAgICAgaWYgKG9mZnNldCkgKm9mZnNldCA9IG1PZmZzZXQ7CiAgICAgaWYgKHNpemUpICAgKnNpemUgPSBtU2l6ZTsKLSAgICByZXR1cm4gbUNsaWVudEhlYXA7CisgICAgcmV0dXJuIGdldEhlYXAoKTsKIH0KIAogU3ViUmVnaW9uTWVtb3J5Ojp+U3ViUmVnaW9uTWVtb3J5KCkKQEAgLTk4LDggKzEwOCw5IEBACiAgICAgLy8gcHJvbW90ZSgpIGl0LgogICAgIAogI2lmIEhBVkVfQU5EUk9JRF9PUwotICAgIGlmIChtQ2xpZW50SGVhcCAhPSBOVUxMKSB7Ci0gICAgICAgIGludCBvdXJfZmQgPSBtQ2xpZW50SGVhcC0+aGVhcElEKCk7CisgICAgaWYgKG1TaXplICE9IE5VTEwpIHsKKyAgICAgICAgY29uc3Qgc3A8TWVtb3J5SGVhcFBtZW0+JiBoZWFwKGdldEhlYXAoKSk7CisgICAgICAgIGludCBvdXJfZmQgPSBoZWFwLT5oZWFwSUQoKTsKICAgICAgICAgc3RydWN0IHBtZW1fcmVnaW9uIHN1YjsKICAgICAgICAgc3ViLm9mZnNldCA9IG1PZmZzZXQ7CiAgICAgICAgIHN1Yi5sZW4gPSBtU2l6ZTsKQEAgLTEwNyw3ICsxMTgsNyBAQAogICAgICAgICBMT0dFX0lGKGVycjwwLCAiUE1FTV9VTk1BUCBmYWlsZWQgKCVzKSwgIgogICAgICAgICAgICAgICAgICJtRkQ9JWQsIHN1Yi5vZmZzZXQ9JWx1LCBzdWIuc2l6ZT0lbHUiLAogICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSwgb3VyX2ZkLCBzdWIub2Zmc2V0LCBzdWIubGVuKTsKLSAgICAgICAgbUNsaWVudEhlYXAuY2xlYXIoKTsKKyAgICAgICAgbVNpemUgPSAwOwogICAgIH0KICNlbmRpZgogfQpAQCAtMTU3LDEwICsxNjgsNyBAQAogCiBzcDxJTWVtb3J5PiBNZW1vcnlIZWFwUG1lbTo6bWFwTWVtb3J5KHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQogewotICAgIHNwPFN1YlJlZ2lvbk1lbW9yeT4gbWVtb3J5OwotICAgIGlmIChoZWFwSUQoKSA+IDApIAotICAgICAgICBtZW1vcnkgPSBuZXcgU3ViUmVnaW9uTWVtb3J5KHRoaXMsIG9mZnNldCwgc2l6ZSk7Ci0KKyAgICBzcDxNZW1vcnlQbWVtPiBtZW1vcnkgPSBjcmVhdGVNZW1vcnkob2Zmc2V0LCBzaXplKTsKICAgICBpZiAobWVtb3J5ICE9IDApIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgbUFsbG9jYXRpb25zLmFkZChtZW1vcnkpOwpAQCAtMTY4LDYgKzE3NiwxNSBAQAogICAgIHJldHVybiBtZW1vcnk7CiB9CiAKK3NwPE1lbW9yeUhlYXBQbWVtOjpNZW1vcnlQbWVtPiBNZW1vcnlIZWFwUG1lbTo6Y3JlYXRlTWVtb3J5KAorICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBzcDxTdWJSZWdpb25NZW1vcnk+IG1lbW9yeTsKKyAgICBpZiAoaGVhcElEKCkgPiAwKSAKKyAgICAgICAgbWVtb3J5ID0gbmV3IFN1YlJlZ2lvbk1lbW9yeSh0aGlzLCBvZmZzZXQsIHNpemUpOworICAgIHJldHVybiBtZW1vcnk7Cit9CisKIHN0YXR1c190IE1lbW9yeUhlYXBQbWVtOjpzbGFwKCkKIHsKICNpZiBIQVZFX0FORFJPSURfT1MKQEAgLTIwNiwyMSArMjIzLDI2IEBACiAKIHZvaWQgTWVtb3J5SGVhcFBtZW06OnJldm9rZSgpCiB7Ci0gICAgVmVjdG9yPCB3cDxTdWJSZWdpb25NZW1vcnk+ID4gYWxsb2NhdGlvbnM7CisgICAgU29ydGVkVmVjdG9yPCB3cDxNZW1vcnlQbWVtPiA+IGFsbG9jYXRpb25zOwogCiAgICAgeyAvLyBzY29wZSBmb3IgbG9jawogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBhbGxvY2F0aW9ucyA9IG1BbGxvY2F0aW9uczsKLSAgICAgICAgbUFsbG9jYXRpb25zLmNsZWFyKCk7CiAgICAgfQogICAgIAogICAgIHNzaXplX3QgY291bnQgPSBhbGxvY2F0aW9ucy5zaXplKCk7CiAgICAgZm9yIChzc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgc3A8U3ViUmVnaW9uTWVtb3J5PiBtZW1vcnkoYWxsb2NhdGlvbnNbaV0ucHJvbW90ZSgpKTsKKyAgICAgICAgc3A8TWVtb3J5UG1lbT4gbWVtb3J5KGFsbG9jYXRpb25zW2ldLnByb21vdGUoKSk7CiAgICAgICAgIGlmIChtZW1vcnkgIT0gMCkKICAgICAgICAgICAgIG1lbW9yeS0+cmV2b2tlKCk7CiAgICAgfQogfQogCit2b2lkIE1lbW9yeUhlYXBQbWVtOjpyZW1vdmUoY29uc3Qgd3A8TWVtb3J5UG1lbT4mIG1lbW9yeSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1BbGxvY2F0aW9ucy5yZW1vdmUobWVtb3J5KTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcCBiL2xpYnMvdXRpbHMvUmVzb3VyY2VUeXBlcy5jcHAKaW5kZXggYTVmZTlmYi4uNWEwOWZiNCAxMDA2NDQKLS0tIGEvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcAorKysgYi9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwCkBAIC0xNjQsNyArMTY0LDExIEBACiAKIHNpemVfdCBSZXNfcG5nXzlwYXRjaDo6c2VyaWFsaXplZFNpemUoKQogewotICAgIHJldHVybiBzaXplb2YoUmVzX3BuZ185cGF0Y2gpCisgICAgLy8gVGhlIHNpemUgb2YgdGhpcyBzdHJ1Y3QgaXMgMzIgYnl0ZXMgb24gdGhlIDMyLWJpdCB0YXJnZXQgc3lzdGVtCisgICAgLy8gNCAqIGludDhfdAorICAgIC8vIDQgKiBpbnQzMl90CisgICAgLy8gMyAqIHBvaW50ZXIKKyAgICByZXR1cm4gMzIKICAgICAgICAgICAgICsgbnVtWERpdnMgKiBzaXplb2YoaW50MzJfdCkKICAgICAgICAgICAgICsgbnVtWURpdnMgKiBzaXplb2YoaW50MzJfdCkKICAgICAgICAgICAgICsgbnVtQ29sb3JzICogc2l6ZW9mKHVpbnQzMl90KTsKQEAgLTE4MCw4ICsxODQsMTAgQEAKIHZvaWQgUmVzX3BuZ185cGF0Y2g6OnNlcmlhbGl6ZSh2b2lkICogb3V0RGF0YSkKIHsKICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKSBvdXREYXRhOwotICAgIG1lbW1vdmUoZGF0YSwgdGhpcywgc2l6ZW9mKFJlc19wbmdfOXBhdGNoKSk7Ci0gICAgZGF0YSArPSAgc2l6ZW9mKFJlc19wbmdfOXBhdGNoKTsKKyAgICBtZW1tb3ZlKGRhdGEsICZ3YXNEZXNlcmlhbGl6ZWQsIDQpOyAgICAgLy8gY29weSAgd2FzRGVzZXJpYWxpemVkLCBudW1YRGl2cywgbnVtWURpdnMsIG51bUNvbG9ycworICAgIG1lbW1vdmUoZGF0YSArIDEyLCAmcGFkZGluZ0xlZnQsIDE2KTsgICAvLyBjb3B5IHBhZGRpbmdYWFhYCisgICAgZGF0YSArPSAzMjsKKwogICAgIG1lbW1vdmUoZGF0YSwgdGhpcy0+eERpdnMsIG51bVhEaXZzICogc2l6ZW9mKGludDMyX3QpKTsKICAgICBkYXRhICs9ICBudW1YRGl2cyAqIHNpemVvZihpbnQzMl90KTsKICAgICBtZW1tb3ZlKGRhdGEsIHRoaXMtPnlEaXZzLCBudW1ZRGl2cyAqIHNpemVvZihpbnQzMl90KSk7CkBAIC0xODksMjcgKzE5NSwzMiBAQAogICAgIG1lbW1vdmUoZGF0YSwgdGhpcy0+Y29sb3JzLCBudW1Db2xvcnMgKiBzaXplb2YodWludDMyX3QpKTsKIH0KIAotUmVzX3BuZ185cGF0Y2gqIFJlc19wbmdfOXBhdGNoOjpkZXNlcmlhbGl6ZShjb25zdCB2b2lkKiBpbkRhdGEpCi17Ci0gICAgZGVzZXJpYWxpemUoaW5EYXRhLCAoUmVzX3BuZ185cGF0Y2gqKSBpbkRhdGEpOwotICAgIHJldHVybiAoUmVzX3BuZ185cGF0Y2gqKSBpbkRhdGE7Ci19Ci0KLXZvaWQgUmVzX3BuZ185cGF0Y2g6OmRlc2VyaWFsaXplKGNvbnN0IHZvaWQqIGluRGF0YSwgUmVzX3BuZ185cGF0Y2gqIG91dERhdGEpIHsKLSAgICBSZXNfcG5nXzlwYXRjaCogcGF0Y2ggPSAoUmVzX3BuZ185cGF0Y2gqKSBpbkRhdGE7CitzdGF0aWMgdm9pZCBkZXNlcmlhbGl6ZUludGVybmFsKGNvbnN0IHZvaWQqIGluRGF0YSwgUmVzX3BuZ185cGF0Y2gqIG91dERhdGEpIHsKKyAgICBjaGFyKiBwYXRjaCA9IChjaGFyKikgaW5EYXRhOwogICAgIGlmIChpbkRhdGEgIT0gb3V0RGF0YSkgewotICAgICAgICBtZW1jcHkob3V0RGF0YSwgaW5EYXRhLCBwYXRjaC0+c2VyaWFsaXplZFNpemUoKSk7CisgICAgICAgIG1lbW1vdmUoJm91dERhdGEtPndhc0Rlc2VyaWFsaXplZCwgcGF0Y2gsIDQpOyAgICAgLy8gY29weSAgd2FzRGVzZXJpYWxpemVkLCBudW1YRGl2cywgbnVtWURpdnMsIG51bUNvbG9ycworICAgICAgICBtZW1tb3ZlKCZvdXREYXRhLT5wYWRkaW5nTGVmdCwgcGF0Y2ggKyAxMiwgNCk7ICAgICAvLyBjb3B5ICB3YXNEZXNlcmlhbGl6ZWQsIG51bVhEaXZzLCBudW1ZRGl2cywgbnVtQ29sb3JzCiAgICAgfQogICAgIG91dERhdGEtPndhc0Rlc2VyaWFsaXplZCA9IHRydWU7CiAgICAgY2hhciogZGF0YSA9IChjaGFyKilvdXREYXRhOwogICAgIGRhdGEgKz0gIHNpemVvZihSZXNfcG5nXzlwYXRjaCk7CiAgICAgb3V0RGF0YS0+eERpdnMgPSAoaW50MzJfdCopIGRhdGE7Ci0gICAgZGF0YSArPSAgcGF0Y2gtPm51bVhEaXZzICogc2l6ZW9mKGludDMyX3QpOworICAgIGRhdGEgKz0gIG91dERhdGEtPm51bVhEaXZzICogc2l6ZW9mKGludDMyX3QpOwogICAgIG91dERhdGEtPnlEaXZzID0gKGludDMyX3QqKSBkYXRhOwotICAgIGRhdGEgKz0gIHBhdGNoLT5udW1ZRGl2cyAqIHNpemVvZihpbnQzMl90KTsKKyAgICBkYXRhICs9ICBvdXREYXRhLT5udW1ZRGl2cyAqIHNpemVvZihpbnQzMl90KTsKICAgICBvdXREYXRhLT5jb2xvcnMgPSAodWludDMyX3QqKSBkYXRhOwogfQogCitSZXNfcG5nXzlwYXRjaCogUmVzX3BuZ185cGF0Y2g6OmRlc2VyaWFsaXplKGNvbnN0IHZvaWQqIGluRGF0YSkKK3sKKyAgICBpZiAoc2l6ZW9mKHZvaWQqKSAhPSBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgTE9HRSgiQ2Fubm90IGRlc2VyaWFsaXplIG9uIG5vbiAzMi1iaXQgc3lzdGVtXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGRlc2VyaWFsaXplSW50ZXJuYWwoaW5EYXRhLCAoUmVzX3BuZ185cGF0Y2gqKSBpbkRhdGEpOworICAgIHJldHVybiAoUmVzX3BuZ185cGF0Y2gqKSBpbkRhdGE7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM4NjMsNyArMzg3NCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGNvbmZpZ0luZGV4PTA7IGNvbmZpZ0luZGV4PE5UQzsgY29uZmlnSW5kZXgrKykgewogICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXNUYWJsZV90eXBlKiB0eXBlID0gdHlwZUNvbmZpZ3MtPmNvbmZpZ3NbY29uZmlnSW5kZXhdOwotICAgICAgICAgICAgICAgICAgICBpZiAoKCgoaW50KXR5cGUpJjB4MykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKCgodWludDY0X3QpdHlwZSkmMHgzKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgIE5PTi1JTlRFR0VSIFJlc1RhYmxlX3R5cGUgQUREUkVTUzogJXBcbiIsIHR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvZnV0ZXhfc3luY2hyby5jIGIvbGlicy91dGlscy9mdXRleF9zeW5jaHJvLmMKaW5kZXggYzEzNzYwZC4uYmExOTUyMCAxMDA2NDQKLS0tIGEvbGlicy91dGlscy9mdXRleF9zeW5jaHJvLmMKKysrIGIvbGlicy91dGlscy9mdXRleF9zeW5jaHJvLmMKQEAgLTI1LDggKzI1LDggQEAKICNpbmNsdWRlIDxwcml2YXRlL3V0aWxzL2Z1dGV4X3N5bmNocm8uaD4KIAogCi0vLyBUaGlzIGZ1dGV4IGdsdWUgY29kZSBpcyBuZWVkIG9uIGRlc2t0b3AgbGludXgsIGJ1dCBpcyBwYXJ0IG9mIGtsaWJjIG9uIEFSTQotI2lmICFkZWZpbmVkKF9fYXJtX18pCisvLyBUaGlzIGZ1dGV4IGdsdWUgY29kZSBpcyBuZWVkIG9uIGRlc2t0b3AgbGludXgsIGJ1dCBpcyBhbHJlYWR5IHBhcnQgb2YgYmlvbmljLgorI2lmICFkZWZpbmVkKEhBVkVfRlVURVhfV1JBUFBFUlMpCiAKICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogdHlwZWRlZiB1bnNpZ25lZCBpbnQgdTMyOwpAQCAtNzYsNyArNzYsNyBAQAogaW50IF9fYXRvbWljX3N3YXAoaW50IF9uZXcsIHZvbGF0aWxlIGludCAqcHRyKTsKIGludCBfX2F0b21pY19kZWModm9sYXRpbGUgaW50ICpwdHIpOwogCi0jZW5kaWYgLy8gIWRlZmluZWQoX19hcm1fXykKKyNlbmRpZiAvLyAhZGVmaW5lZChIQVZFX0ZVVEVYX1dSQVBQRVJTKQogCiAKIC8vIGxvY2sgc3RhdGVzCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliR0xFU19DTS9nbF93cmFwcGVyLmNwcCBiL29wZW5nbC9saWJHTEVTX0NNL2dsX3dyYXBwZXIuY3BwCmluZGV4IDVkYTRmOWEuLjNiN2Y0NWUgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJHTEVTX0NNL2dsX3dyYXBwZXIuY3BwCisrKyBiL29wZW5nbC9saWJHTEVTX0NNL2dsX3dyYXBwZXIuY3BwCkBAIC0zNzMsNiArMzczLDcgQEAKIAogc3RhdGljIHNwPEdQVVJldm9rZVJlcXVlc3Rlcj4gZ1Jldm9rZXJDYWxsYmFjazsKIAorCiBzdGF0aWMgcmVxdWVzdF9ncHVfdCogZ3B1X2FjcXVpcmUodm9pZCogdXNlcikKIHsKICAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBzZXJ2ZXIoIGdldFN1cmZhY2VGbGluZ2VyKCkgKTsKQEAgLTM4Myw3ICszODQsMTAgQEAKICAgICB9CiAgICAgCiAgICAgSVN1cmZhY2VDb21wb3Nlcjo6Z3B1X2luZm9fdCBpbmZvOwotICAgIGdSZXZva2VyQ2FsbGJhY2sgPSBuZXcgR1BVUmV2b2tlUmVxdWVzdGVyKCk7CisgICAgCisgICAgaWYgKGdSZXZva2VyQ2FsbGJhY2sgPT0gMCkKKyAgICAgICAgZ1Jldm9rZXJDYWxsYmFjayA9IG5ldyBHUFVSZXZva2VSZXF1ZXN0ZXIoKTsKKwogICAgIHN0YXR1c190IGVyciA9IHNlcnZlci0+cmVxdWVzdEdQVShnUmV2b2tlckNhbGxiYWNrLCAmaW5mbyk7CiAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICBMT0dEKCJyZXF1ZXN0R1BVIHJldHVybmVkICVkIiwgZXJyKTsKQEAgLTU0OSw2ICs1NTMsMjEgQEAKICAgICByZXR1cm4gLTE7CiB9CiAKK3N0YXRpYyBFR0xpbnQgY29uZmlnVG9VbmlxdWVJZChlZ2xfZGlzcGxheV90IGNvbnN0KiBkcCwgaW50IGksIGludCBpbmRleCkgCit7CisgICAgLy8gTk9URTogdGhpcyBtYXBwaW5nIHdvcmtzIG9ubHkgaWYgd2UgaGF2ZSBubyBtb3JlIHRoYW4gdHdvIEVHTGltcGwKKyAgICByZXR1cm4gKGk+MCA/IGRwLT5udW1Db25maWdzWzBdIDogMCkgKyBpbmRleDsKK30KKworc3RhdGljIHZvaWQgdW5pcXVlSWRUb0NvbmZpZyhlZ2xfZGlzcGxheV90IGNvbnN0KiBkcCwgRUdMaW50IGNvbmZpZ0lkLAorICAgICAgICBpbnQmIGksIGludCYgaW5kZXgpIAoreworICAgIC8vIE5PVEU6IHRoaXMgbWFwcGluZyB3b3JrcyBvbmx5IGlmIHdlIGhhdmUgbm8gbW9yZSB0aGFuIHR3byBFR0xpbXBsCisgICAgc2l6ZV90IG51bUNvbmZpZ3MgPSBkcC0+bnVtQ29uZmlnc1swXTsKKyAgICBpID0gY29uZmlnSWQgLyBudW1Db25maWdzOworICAgIGluZGV4ID0gY29uZmlnSWQgJSBudW1Db25maWdzOworfQorCiBzdGF0aWMgaW50IGNtcF9jb25maWdzKGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZvaWQgKmIpCiB7CiAgICAgRUdMQ29uZmlnIGMwID0gKihFR0xDb25maWcgY29uc3QgKilhOwpAQCAtNTU3LDcgKzU3Niw3IEBACiB9CiAKIHN0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ1ZlbmRvclN0cmluZyAgICAgPSAiQW5kcm9pZCI7Ci1zdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGdWZXJzaW9uU3RyaW5nICAgID0gIjEuMiBBbmRyb2lkIE1FVEEtRUdMIjsKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ1ZlcnNpb25TdHJpbmcgICAgPSAiMS4zIEFuZHJvaWQgTUVUQS1FR0wiOwogc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnQ2xpZW50QXBpU3RyaW5nICA9ICJPcGVuR0wgRVMiOwogCiBzdHJ1Y3QgZXh0ZW50aW9uX21hcF90IHsKQEAgLTgzNCw3ICs4NTMsMTMgQEAKICAgICAgICAgcHJvcGVydHlfZ2V0KCJkZWJ1Zy5lZ2wuaHciLCB2YWx1ZSwgIjEiKTsKICAgICAgICAgaWYgKGF0b2kodmFsdWUpICE9IDApIHsKICAgICAgICAgICAgIGNueC0+aG9va3MgPSAmZ0hvb2tzW0lNUExfSEFSRFdBUkVdOwotICAgICAgICAgICAgY254LT5kc28gPSBsb2FkX2RyaXZlcigibGliaGdsLnNvIiwgY254LT5ob29rcyk7CisgICAgICAgICAgICBwcm9wZXJ0eV9nZXQoImRlYnVnLmVnbC5wcm9maWxlciIsIHZhbHVlLCAiMCIpOworICAgICAgICAgICAgaWYgKGF0b2kodmFsdWUpID09IDApIHsKKyAgICAgICAgICAgICAgICBjbngtPmRzbyA9IGxvYWRfZHJpdmVyKCJsaWJoZ2wuc28iLCBjbngtPmhvb2tzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HVygiVXNpbmcgaW5zdHJ1bWVudGVkIGgvdyBPcGVuR0wgRVMgbGlicmFyeSIpOworICAgICAgICAgICAgICAgIGNueC0+ZHNvID0gbG9hZF9kcml2ZXIoImxpYmhnbGQuc28iLCBjbngtPmhvb2tzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIExPR0QoIjNEIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBkaXNhYmxlZCIpOwogICAgICAgICB9CkBAIC04NjQsNiArODg5LDggQEAKICAgICAgICAgCiAgICAgICAgIGQtPmRweXNbSU1QTF9IQVJEV0FSRV0gPSBjbngtPmhvb2tzLT5lZ2wuZWdsR2V0RGlzcGxheShkaXNwbGF5KTsKICAgICAgICAgaWYgKGQtPmRweXNbSU1QTF9IQVJEV0FSRV0gPT0gRUdMX05PX0RJU1BMQVkpIHsKKyAgICAgICAgICAgIExPR0UoImgvdyBhY2NlbGVyYXRlZCBlZ2xHZXREaXNwbGF5KCkgZmFpbGVkICglcykiLAorICAgICAgICAgICAgICAgICAgICBlZ2xfc3RyZXJyb3IoY254LT5ob29rcy0+ZWdsLmVnbEdldEVycm9yKCkpKTsKICAgICAgICAgICAgIGRsY2xvc2UoKHZvaWQqKWNueC0+ZHNvKTsKICAgICAgICAgICAgIGNueC0+ZHNvID0gMDsKICAgICAgICAgICAgIC8vIGluIGNhc2Ugb2YgZmFpbHVyZSwgd2Ugd2FudCB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgdHJ5IGFnYWluCkBAIC05MDAsNyArOTI3LDEwIEBACiAgICAgICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbFtpXTsKICAgICAgICAgY254LT5tYWpvciA9IC0xOwogICAgICAgICBjbngtPm1pbm9yID0gLTE7Ci0gICAgICAgIGlmIChjbngtPmRzbyAmJiBjbngtPmhvb2tzLT5lZ2wuZWdsSW5pdGlhbGl6ZSgKKyAgICAgICAgaWYgKCFjbngtPmRzbykgCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoY254LT5ob29rcy0+ZWdsLmVnbEluaXRpYWxpemUoCiAgICAgICAgICAgICAgICAgZHAtPmRweXNbaV0sICZjbngtPm1ham9yLCAmY254LT5taW5vcikpIHsKIAogICAgICAgICAgICAgLy9MT0dEKCJpbml0aWFsaXplZCAlZCBkcHk9JXAsIHZlcj0lZC4lZCwgY254PSVwIiwKQEAgLTkxMiwxMCArOTQyLDEwIEBACiAgICAgICAgICAgICBkcC0+cXVlcnlTdHJpbmdbaV0udmVyc2lvbiA9CiAgICAgICAgICAgICAgICAgY254LT5ob29rcy0+ZWdsLmVnbFF1ZXJ5U3RyaW5nKGRwLT5kcHlzW2ldLCBFR0xfVkVSU0lPTik7CiAgICAgICAgICAgICBkcC0+cXVlcnlTdHJpbmdbaV0uZXh0ZW5zaW9ucyA9IHN0cmR1cCgKLSAgICAgICAgICAgICAgICBjbngtPmhvb2tzLT5lZ2wuZWdsUXVlcnlTdHJpbmcoZHAtPmRweXNbaV0sIEVHTF9FWFRFTlNJT05TKSk7CisgICAgICAgICAgICAgICAgICAgIGNueC0+aG9va3MtPmVnbC5lZ2xRdWVyeVN0cmluZyhkcC0+ZHB5c1tpXSwgRUdMX0VYVEVOU0lPTlMpKTsKICAgICAgICAgICAgIGRwLT5xdWVyeVN0cmluZ1tpXS5jbGllbnRBcGkgPQogICAgICAgICAgICAgICAgIGNueC0+aG9va3MtPmVnbC5lZ2xRdWVyeVN0cmluZyhkcC0+ZHB5c1tpXSwgRUdMX0NMSUVOVF9BUElTKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAvLyBEeW5hbWljYWxseSBpbnNlcnQgZXh0ZW5zaW9ucyB3ZSBrbm93IGFib3V0CiAgICAgICAgICAgICBpZiAoY254LT5ob29rcy0+ZWdsLmVnbFN3YXBSZWN0YW5nbGVBTkRST0lEKQogICAgICAgICAgICAgICAgIGFkZF9leHRlbnNpb24oZHAsIGRwLT5xdWVyeVN0cmluZ1tpXS5leHRlbnNpb25zLApAQCAtOTI0LDEyICs5NTQsMTUgQEAKICAgICAgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsUXVlcnlTdHJpbmdDb25maWdBTkRST0lEKQogICAgICAgICAgICAgICAgIGFkZF9leHRlbnNpb24oZHAsIGRwLT5xdWVyeVN0cmluZ1tpXS5leHRlbnNpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgIkVHTF9BTkRST0lEX3F1ZXJ5X3N0cmluZ19jb25maWciKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0QoIiVkOiBlZ2xJbml0aWFsaXplKCkgZmFpbGVkICglcykiLCAKKyAgICAgICAgICAgICAgICAgICAgaSwgZWdsX3N0cmVycm9yKGNueC0+aG9va3MtPmVnbC5lZ2xHZXRFcnJvcigpKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgICAgICAgICAKKwogICAgIC8vIEJ1aWxkIHRoZSBleHRlbnNpb24gbGlzdCB0aGF0IGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgY29uZmlnLgogICAgIC8vIEl0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2Ygb3VyIGV4dGVuc2lvbiBsaXN0IGFuZCB0aGUKLSAgICAvLyB1bmRlcmxheWluZyBFR0wncyBleHRlbnNpb25zIGxpc3QKKyAgICAvLyB1bmRlcmx5aW5nIEVHTCdzIGV4dGVuc2lvbnMgbGlzdAogICAgIEVHTEJvb2xlYW4gcmVzID0gRUdMX0ZBTFNFOwogICAgIGZvciAoaW50IGk9MCA7IGk8MiA7IGkrKykgewogICAgICAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGxbaV07CkBAIC05NTEsMTAgKzk4NCwxMCBAQAogICAgICAgICAgICAgfSB3aGlsZSAoKnApOwogICAgICAgICAgICAgZnJlZSgodm9pZCopb3VyX2V4dGVuc2lvbnNfb3JnKTsKIAotICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSB0cmFpbGxpbmcgd2hpdGUgc3BhY2UKKyAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgdHJhaWxpbmcgd2hpdGUgc3BhY2UKICAgICAgICAgICAgIGlmIChleHRlbnNpb25zX2NvbmZpZ1swXSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgc2l6ZV90IGwgPSBzdHJsZW4oZXh0ZW5zaW9uc19jb25maWcpIC0gMTsgLy8gbmV3IHNpemUKLSAgICAgICAgICAgICAgICBleHRlbnNpb25zX2NvbmZpZ1tsXSA9IDA7IC8vIHJlbW92ZSB0aGUgdHJhaWxsaW5nIHdoaXRlIHNwYWNlCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc19jb25maWdbbF0gPSAwOyAvLyByZW1vdmUgdGhlIHRyYWlsaW5nIHdoaXRlIHNwYWNlCiAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc19jb25maWcgPSAoY2hhciopcmVhbGxvYyhleHRlbnNpb25zX2NvbmZpZywgbCsxKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc19jb25maWcgPSAoY2hhciopcmVhbGxvYyhleHRlbnNpb25zX2NvbmZpZywgMSk7CkBAIC0xMDY1LDE1ICsxMDk4LDc0IEBACiAgICAgICAgIHJldHVybiBFR0xfVFJVRTsKICAgICB9CiAKKyAgICBFR0xpbnQgbjsKICAgICBFR0xCb29sZWFuIHJlcyA9IEVHTF9GQUxTRTsKICAgICAqbnVtX2NvbmZpZyA9IDA7CisKKyAgICAKKyAgICAvLyBJdCBpcyB1bmZvcnR1bmF0ZSwgYnV0IHdlIG5lZWQgdG8gcmVtYXAgdGhlIEVHTF9DT05GSUdfSURzLCAKKyAgICAvLyB0byBkbyAgdGhpcywgd2UgaGF2ZSB0byBnbyB0aHJvdWdoIHRoZSBhdHRyaWJfbGlzdCBhcnJheSBvbmNlCisgICAgLy8gdG8gZmlndXJlIG91dCBib3RoIGl0cyBzaXplIGFuZCBpZiBpdCBjb250YWlucyBhbiBFR0xfQ09ORklHX0lECisgICAgLy8ga2V5LiBJZiBzbywgdGhlIGZ1bGwgYXJyYXkgaXMgY29waWVkIGFuZCBwYXRjaGVkLgorICAgIC8vIE5PVEU6IHdlIGFzc3VtZSB0aGF0IHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBvY2N1cnJlbmNlCisgICAgLy8gb2YgRUdMX0NPTkZJR19JRC4KKyAgICAKKyAgICBFR0xpbnQgcGF0Y2hfaW5kZXggPSAtMTsKKyAgICBHTGludCBhdHRyOworICAgIHNpemVfdCBzaXplID0gMDsKKyAgICB3aGlsZSAoKGF0dHI9YXR0cmliX2xpc3Rbc2l6ZV0pKSB7CisgICAgICAgIGlmIChhdHRyID09IEVHTF9DT05GSUdfSUQpCisgICAgICAgICAgICBwYXRjaF9pbmRleCA9IHNpemU7CisgICAgICAgIHNpemUgKz0gMjsKKyAgICB9CisgICAgaWYgKHBhdGNoX2luZGV4ID49IDApIHsKKyAgICAgICAgc2l6ZSArPSAyOyAvLyB3ZSBuZWVkIGNvcHkgdGhlIHNlbnRpbmVsIGFzIHdlbGwKKyAgICAgICAgRUdMaW50KiBuZXdfbGlzdCA9IChFR0xpbnQqKW1hbGxvYyhzaXplKnNpemVvZihFR0xpbnQpKTsKKyAgICAgICAgaWYgKG5ld19saXN0ID09IDApCisgICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9BTExPQywgRUdMX0ZBTFNFKTsKKyAgICAgICAgbWVtY3B5KG5ld19saXN0LCBhdHRyaWJfbGlzdCwgc2l6ZSpzaXplb2YoRUdMaW50KSk7CisKKyAgICAgICAgLy8gcGF0Y2ggdGhlIHJlcXVlc3RlZCBFR0xfQ09ORklHX0lECisgICAgICAgIGludCBpLCBpbmRleDsKKyAgICAgICAgRUdMaW50JiBjb25maWdJZChuZXdfbGlzdFtwYXRjaF9pbmRleCsxXSk7CisgICAgICAgIHVuaXF1ZUlkVG9Db25maWcoZHAsIGNvbmZpZ0lkLCBpLCBpbmRleCk7CisgICAgICAgIAorICAgICAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGxbaV07CisgICAgICAgIGlmIChjbngtPmRzbykgeworICAgICAgICAgICAgY254LT5ob29rcy0+ZWdsLmVnbEdldENvbmZpZ0F0dHJpYigKKyAgICAgICAgICAgICAgICAgICAgZHAtPmRweXNbaV0sIGRwLT5jb25maWdzW2ldW2luZGV4XSwgCisgICAgICAgICAgICAgICAgICAgIEVHTF9DT05GSUdfSUQsICZjb25maWdJZCk7CisKKyAgICAgICAgICAgIC8vIGFuZCBzd2l0Y2ggdG8gdGhlIG5ldyBsaXN0CisgICAgICAgICAgICBhdHRyaWJfbGlzdCA9IGNvbnN0X2Nhc3Q8Y29uc3QgRUdMaW50ICo+KG5ld19saXN0KTsKKworICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIG9ubHkgY29uZmlndXJhdGlvbiB0aGF0IGNhbiBtYXRjaCBpcworICAgICAgICAgICAgLy8gZHAtPmNvbmZpZ3NbaV1baW5kZXhdLCBob3dldmVyLCB3ZSBkb24ndCBrbm93IGlmIGl0IHdvdWxkIGJlCisgICAgICAgICAgICAvLyByZWplY3RlZCBiZWNhdXNlIG9mIHRoZSBvdGhlciBhdHRyaWJ1dGVzLCBzbyB3ZSBkbyBoYXZlIHRvIGNhbGwKKyAgICAgICAgICAgIC8vIGNueC0+aG9va3MtPmVnbC5lZ2xDaG9vc2VDb25maWcoKSAtLSBidXQgd2UgZG9uJ3QgaGF2ZSB0byBsb29wCisgICAgICAgICAgICAvLyB0aHJvdWdoIGFsbCB0aGUgRUdMaW1wbFtdLgorICAgICAgICAgICAgLy8gV2UgYWxzbyBrbm93IHdlIGNhbiBvbmx5IGdldCBhIHNpbmdsZSBjb25maWcgYmFjaywgYW5kIHdlIGtub3cKKyAgICAgICAgICAgIC8vIHdoaWNoIG9uZS4KKworICAgICAgICAgICAgcmVzID0gY254LT5ob29rcy0+ZWdsLmVnbENob29zZUNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgZHAtPmRweXNbaV0sIGF0dHJpYl9saXN0LCBjb25maWdzLCBjb25maWdfc2l6ZSwgJm4pOworICAgICAgICAgICAgaWYgKHJlcyAmJiBuPjApIHsKKyAgICAgICAgICAgICAgICAvLyBuIGhhcyB0byBiZSAwIG9yIDEsIGJ5IGNvbnN0cnVjdGlvbiwgYW5kIHdlIGFscmVhZHkga25vdworICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNvbmZpZyBpdCB3aWxsIHJldHVybiAoc2luY2UgdGhlcmUgY2FuIGJlIG9ubHkgb25lKS4KKyAgICAgICAgICAgICAgICBjb25maWdzWzBdID0gTUFLRV9DT05GSUcoaSwgaW5kZXgpOworICAgICAgICAgICAgICAgICpudW1fY29uZmlnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZyZWUoY29uc3RfY2FzdDxFR0xpbnQgKj4oYXR0cmliX2xpc3QpKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKICAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKICAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2ldOwogICAgICAgICBpZiAoY254LT5kc28pIHsKLSAgICAgICAgICAgIEVHTGludCBuOwogICAgICAgICAgICAgaWYgKGNueC0+aG9va3MtPmVnbC5lZ2xDaG9vc2VDb25maWcoCi0gICAgICAgICAgICAgICAgICAgIGRwLT5kcHlzW2ldLCBhdHRyaWJfbGlzdCwgY29uZmlncywgY29uZmlnX3NpemUsICZuKSkKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHAtPmRweXNbaV0sIGF0dHJpYl9saXN0LCBjb25maWdzLCBjb25maWdfc2l6ZSwgJm4pKSB7CiAgICAgICAgICAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gY29udmVydCB0aGVzZSBjbGllbnQgRUdMQ29uZmlnIHRvIG91cgogICAgICAgICAgICAgICAgIC8vIGludGVybmFsIEVHTENvbmZpZyBmb3JtYXQuIFRoaXMgaXMgZG9uZSBpbiBPKG4gbG9nIG4pLgogICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MCA7IGo8biA7IGorKykgewpAQCAtMTEwMiw2ICsxMTk0LDEzIEBACiAgICAgaW50IGk9MCwgaW5kZXg9MDsKICAgICBlZ2xfY29ubmVjdGlvbl90KiBjbnggPSB2YWxpZGF0ZV9kaXNwbGF5X2NvbmZpZyhkcHksIGNvbmZpZywgZHAsIGksIGluZGV4KTsKICAgICBpZiAoIWNueCkgcmV0dXJuIEVHTF9GQUxTRTsKKyAgICAKKyAgICBpZiAoYXR0cmlidXRlID09IEVHTF9DT05GSUdfSUQpIHsKKyAgICAgICAgLy8gRUdMX0NPTkZJR19JRHMgbXVzdCBiZSB1bmlxdWUsIGp1c3QgdXNlIHRoZSBvcmRlciBvZiB0aGUgc2VsZWN0ZWQKKyAgICAgICAgLy8gRUdMQ29uZmlnLgorICAgICAgICAqdmFsdWUgPSBjb25maWdUb1VuaXF1ZUlkKGRwLCBpLCBpbmRleCk7CisgICAgICAgIHJldHVybiBFR0xfVFJVRTsKKyAgICB9CiAgICAgcmV0dXJuIGNueC0+aG9va3MtPmVnbC5lZ2xHZXRDb25maWdBdHRyaWIoCiAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgZHAtPmNvbmZpZ3NbaV1baW5kZXhdLCBhdHRyaWJ1dGUsIHZhbHVlKTsKIH0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvVGV4dHVyZU9iamVjdE1hbmFnZXIuY3BwIGIvb3BlbmdsL2xpYmFnbC9UZXh0dXJlT2JqZWN0TWFuYWdlci5jcHAKaW5kZXggMTJmYWU2My4uY2UzMTg1NCAxMDA2NDQKLS0tIGEvb3BlbmdsL2xpYmFnbC9UZXh0dXJlT2JqZWN0TWFuYWdlci5jcHAKKysrIGIvb3BlbmdsL2xpYmFnbC9UZXh0dXJlT2JqZWN0TWFuYWdlci5jcHAKQEAgLTEyOSw3ICsxMjksNyBAQAogICAgIC8vIHNvIGZvciBub3csIHdlIGp1c3QgbG9vc2UgaXQuCiAgICAgbWVtc2V0KGNyb3BfcmVjdCwgMCwgc2l6ZW9mKGNyb3BfcmVjdCkpOwogCi0gICAgLy8gaXQgd291bGQgYmUgbmljZSBpZCB3ZSBjb3VsZCBrZWVwIHRoZSBnZW5lcmF0ZV9taXBtYXAgZmxhZworICAgIC8vIGl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQga2VlcCB0aGUgZ2VuZXJhdGVfbWlwbWFwIGZsYWcsCiAgICAgLy8gd2Ugd291bGQgaGF2ZSB0byBnZW5lcmF0ZSB0aGVtIHJpZ2h0IG5vdyB0aG91Z2guCiAgICAgZ2VuZXJhdGVfbWlwbWFwID0gR0xfRkFMU0U7CiAKQEAgLTI4Niw3ICsyODYsNyBAQAogCiB2b2lkIEVHTFN1cmZhY2VNYW5hZ2VyOjpkZWxldGVUZXh0dXJlcyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdG9rZW5zKQogewotICAgIC8vIGZyZWUgYWxsIHRleHVyZXMKKyAgICAvLyBmcmVlIGFsbCB0ZXh0dXJlcwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgZm9yIChHTHNpemVpIGk9MCA7IGk8biA7IGkrKykgewogICAgICAgICBjb25zdCBHTHVpbnQgdCgqdG9rZW5zKyspOwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9hcnJheS5jcHAgYi9vcGVuZ2wvbGliYWdsL2FycmF5LmNwcAppbmRleCAxZjY3NTdkLi44ZmE3NTY2IDEwMDY0NAotLS0gYS9vcGVuZ2wvbGliYWdsL2FycmF5LmNwcAorKysgYi9vcGVuZ2wvbGliYWdsL2FycmF5LmNwcApAQCAtMTExNiw4ICsxMTE2LDggQEAKICAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykgeyAvLyBuZWVkcyB0ZXh0dXJlIHRyYW5zZm9ybXMKICAgICAgICAgd2FudCB8PSB0cmFuc2Zvcm1fc3RhdGVfdDo6VEVYVFVSRTsKICAgICB9Ci0gICAgaWYgKGMtPmNsaXBQbGFuZXMuZW5hYmxlKSB7IC8vIG5lZWRzIGV5ZSBjb29yZHMKLSAgICAgICAgd2FudCB8PSB0cmFuc2Zvcm1fc3RhdGVfdDo6TU9ERUxWSUVXOworICAgIGlmIChjLT5jbGlwUGxhbmVzLmVuYWJsZSB8fCAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfRk9HKSkgeyAKKyAgICAgICAgd2FudCB8PSB0cmFuc2Zvcm1fc3RhdGVfdDo6TU9ERUxWSUVXOyAvLyBuZWVkcyBleWUgY29vcmRzCiAgICAgfQogICAgIG9nbGVzX3ZhbGlkYXRlX3RyYW5zZm9ybShjLCB3YW50KTsKIApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9lZ2wuY3BwIGIvb3BlbmdsL2xpYmFnbC9lZ2wuY3BwCmluZGV4IDg1NGE0OWUuLjNlOGRjYTkgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJhZ2wvZWdsLmNwcAorKysgYi9vcGVuZ2wvbGliYWdsL2VnbC5jcHAKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxHTEVTL2VnbC5oPgogCiAjaW5jbHVkZSA8cGl4ZWxmbGluZ2VyL2Zvcm1hdC5oPgorI2luY2x1ZGUgPHBpeGVsZmxpbmdlci9waXhlbGZsaW5nZXIuaD4KIAogI2luY2x1ZGUgImNvbnRleHQuaCIKICNpbmNsdWRlICJzdGF0ZS5oIgpAQCAtNTcsNyArNTgsNyBAQAogI2lmbmRlZiBIQVZFX0FORFJPSURfT1MKIG5hbWVzcGFjZSBnbCB7CiBwdGhyZWFkX2tleV90IGdHTEtleSA9IC0xOwotfTsgLy8gbmFtc3BhY2UgZ2wKK307IC8vIG5hbWVzcGFjZSBnbAogI2VuZGlmCiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CkBAIC0xNTYsNyArMTU3LDcgQEAKIGVnbF9zdXJmYWNlX3Q6OmVnbF9zdXJmYWNlX3QoRUdMRGlzcGxheSBkcHksCiAgICAgICAgIEVHTENvbmZpZyBjb25maWcsCiAgICAgICAgIGludDMyX3QgZGVwdGhGb3JtYXQpCi0gICAgOiBtYWdpYygweDMxNDE1MjY1KSwgZHB5KGRweSksIGNvbmZpZyhjb25maWcpLCBjdHgoMCkKKyAgICA6IG1hZ2ljKE1BR0lDKSwgZHB5KGRweSksIGNvbmZpZyhjb25maWcpLCBjdHgoMCkKIHsKICAgICBkZXB0aC52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOwogICAgIGRlcHRoLmRhdGEgPSAwOwpAQCAtMjQwLDcgKzI0MSw3IEBACiB7CiAgICAgdWludDMyX3QgZmxhZ3MgPSBuYXRpdmVXaW5kb3ctPnN3YXBCdWZmZXJzKG5hdGl2ZVdpbmRvdyk7CiAgICAgaWYgKGZsYWdzICYgRUdMX05BVElWRVNfRkxBR19TSVpFX0NIQU5HRUQpIHsKLSAgICAgICAgLy8gVE9ETzogd2UgcHJvYmFseSBzaG91bGQgcmVzZXQgdGhlIHN3YXAgcmVjdCBoZXJlCisgICAgICAgIC8vIFRPRE86IHdlIHByb2JhYmx5IHNob3VsZCByZXNldCB0aGUgc3dhcCByZWN0IGhlcmUKICAgICAgICAgLy8gaWYgdGhlIHdpbmRvdyBzaXplIGhhcyBjaGFuZ2VkCiAgICAgICAgIC8vICAgIHdpbmRvdy0+c2V0U3dhcFJlY3RhbmdsZShSZWN0KGluZm8udywgaW5mby5oKSk7CiAgICAgICAgIGlmIChkZXB0aC5kYXRhKSB7CkBAIC00MDIsMTIgKzQwMywxMyBAQAogewogICAgIHNpemVfdCBzaXplID0gdypoOwogICAgIHN3aXRjaCAoZikgewotICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OiAgICAgIHNpemUgKj0gMjsgYnJlYWs7Ci0gICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4ODogICAgc2l6ZSAqPSA0OyBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBMT0dFKCJpbmNvbXBhdGlibGUgcGl4ZWwgZm9ybWF0IGZvciBwYnVmZmVyIChmb3JtYXQ9JWQpIiwgZik7Ci0gICAgICAgIHBidWZmZXIuZGF0YSA9IDA7Ci0gICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfQV84OiAgICAgICAgICBzaXplICo9IDE7IGJyZWFrOworICAgICAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTogICAgICBzaXplICo9IDI7IGJyZWFrOworICAgICAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OiAgICBzaXplICo9IDQ7IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgiaW5jb21wYXRpYmxlIHBpeGVsIGZvcm1hdCBmb3IgcGJ1ZmZlciAoZm9ybWF0PSVkKSIsIGYpOworICAgICAgICAgICAgcGJ1ZmZlci5kYXRhID0gMDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBwYnVmZmVyLnZlcnNpb24gPSBzaXplb2YoR0dMU3VyZmFjZSk7CiAgICAgcGJ1ZmZlci53aWR0aCAgID0gdzsKQEAgLTQ4OCwyOCArNDkwLDI4IEBACiB9OwogCiBzdGF0aWMgY29uc3QgZXh0ZW50aW9uX21hcF90IGdFeHRlbnRpb25NYXBbXSA9IHsKLSAgICB7ICJlZ2xTd2FwUmVjdGFuZ2xlQU5EUk9JRCIsICAgICAgICAgICAgKHZvaWQoKikoKSkmZWdsU3dhcFJlY3RhbmdsZUFORFJPSUQgfSwKLSAgICB7ICJnbERyYXdUZXhzT0VTIiwgICAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4c09FUyB9LAotICAgIHsgImdsRHJhd1RleGlPRVMiLCAgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhpT0VTIH0sCi0gICAgeyAiZ2xEcmF3VGV4Zk9FUyIsICAgICAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleGZPRVMgfSwKLSAgICB7ICJnbERyYXdUZXh4T0VTIiwgICAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4eE9FUyB9LAotICAgIHsgImdsRHJhd1RleHN2T0VTIiwgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhzdk9FUyB9LAotICAgIHsgImdsRHJhd1RleGl2T0VTIiwgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhpdk9FUyB9LAotICAgIHsgImdsRHJhd1RleGZ2T0VTIiwgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhmdk9FUyB9LAotICAgIHsgImdsRHJhd1RleHh2T0VTIiwgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXh4dk9FUyB9LAotICAgIHsgImdsUXVlcnlNYXRyaXh4T0VTIiwgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbFF1ZXJ5TWF0cml4eE9FUyB9LAotICAgIHsgImdsQ2xpcFBsYW5lZiIsICAgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbENsaXBQbGFuZWYgfSwKLSAgICB7ICJnbENsaXBQbGFuZXgiLCAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xDbGlwUGxhbmV4IH0sCi0gICAgeyAiZ2xCaW5kQnVmZmVyIiwgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsQmluZEJ1ZmZlciB9LAotICAgIHsgImdsQnVmZmVyRGF0YSIsICAgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbEJ1ZmZlckRhdGEgfSwKLSAgICB7ICJnbEJ1ZmZlclN1YkRhdGEiLCAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xCdWZmZXJTdWJEYXRhIH0sCi0gICAgeyAiZ2xEZWxldGVCdWZmZXJzIiwgICAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRGVsZXRlQnVmZmVycyB9LAotICAgIHsgImdsR2VuQnVmZmVycyIsICAgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbEdlbkJ1ZmZlcnMgfSwKKyAgICB7ICJlZ2xTd2FwUmVjdGFuZ2xlQU5EUk9JRCIsICAgICh2b2lkKCopKCkpJmVnbFN3YXBSZWN0YW5nbGVBTkRST0lEIH0sCisgICAgeyAiZ2xEcmF3VGV4c09FUyIsICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhzT0VTIH0sCisgICAgeyAiZ2xEcmF3VGV4aU9FUyIsICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhpT0VTIH0sCisgICAgeyAiZ2xEcmF3VGV4Zk9FUyIsICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhmT0VTIH0sCisgICAgeyAiZ2xEcmF3VGV4eE9FUyIsICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXh4T0VTIH0sCisgICAgeyAiZ2xEcmF3VGV4c3ZPRVMiLCAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhzdk9FUyB9LAorICAgIHsgImdsRHJhd1RleGl2T0VTIiwgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4aXZPRVMgfSwKKyAgICB7ICJnbERyYXdUZXhmdk9FUyIsICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleGZ2T0VTIH0sCisgICAgeyAiZ2xEcmF3VGV4eHZPRVMiLCAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXh4dk9FUyB9LAorICAgIHsgImdsUXVlcnlNYXRyaXh4T0VTIiwgICAgICAgICAgKHZvaWQoKikoKSkmZ2xRdWVyeU1hdHJpeHhPRVMgfSwKKyAgICB7ICJnbENsaXBQbGFuZWYiLCAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsQ2xpcFBsYW5lZiB9LAorICAgIHsgImdsQ2xpcFBsYW5leCIsICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xDbGlwUGxhbmV4IH0sCisgICAgeyAiZ2xCaW5kQnVmZmVyIiwgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbEJpbmRCdWZmZXIgfSwKKyAgICB7ICJnbEJ1ZmZlckRhdGEiLCAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsQnVmZmVyRGF0YSB9LAorICAgIHsgImdsQnVmZmVyU3ViRGF0YSIsICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xCdWZmZXJTdWJEYXRhIH0sCisgICAgeyAiZ2xEZWxldGVCdWZmZXJzIiwgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERlbGV0ZUJ1ZmZlcnMgfSwKKyAgICB7ICJnbEdlbkJ1ZmZlcnMiLCAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsR2VuQnVmZmVycyB9LAogfTsKIAogLyogCiAgKiBJbiB0aGUgbGlzdHMgYmVsb3csIGF0dHJpYnV0ZXMgbmFtZXMgTVVTVCBiZSBzb3J0ZWQuCi0gKiBBZGRpdGlubmFseSwgYWxsIGNvbmZpZ3MgbXVzdCBiZSBzb3J0ZWQgYWNjb3JkaW5nIHRvCisgKiBBZGRpdGlvbmFsbHksIGFsbCBjb25maWdzIG11c3QgYmUgc29ydGVkIGFjY29yZGluZyB0bwogICogdGhlIEVHTCBzcGVjaWZpY2F0aW9uLgogICovCiAKQEAgLTUxNyw5ICs1MTksMTAgQEAKICAgICAgICAgeyBFR0xfU1RFTkNJTF9TSVpFLCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICB7IEVHTF9DT05GSUdfQ0FWRUFULCAgICAgICAgICAgICAgRUdMX1NMT1dfQ09ORklHICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgIHsgRUdMX0xFVkVMLCAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfSEVJR0hULCAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMsICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX01BWF9QQlVGRkVSX1dJRFRILCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfSEVJR0hULCAgICAgICAgIEdHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICB9LAorICAgICAgICB7IEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMsICAgICAgICAgCisgICAgICAgICAgICAgICAgR0dMX01BWF9WSUVXUE9SVF9ESU1TKkdHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfV0lEVEgsICAgICAgICAgIEdHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICB9LAogICAgICAgICB7IEVHTF9OQVRJVkVfUkVOREVSQUJMRSwgICAgICAgICAgRUdMX1RSVUUgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgIHsgRUdMX05BVElWRV9WSVNVQUxfSUQsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgeyBFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFLCAgICAgICAgIEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSAgICAgICAgICB9LApAQCAtNTM2LDQ5ICs1MzksNzIgQEAKIH07CiAKIC8vIFRoZXNlIGNvbmZpZ3MgY2FuIG92ZXJyaWRlIHRoZSBiYXNlIGF0dHJpYnV0ZSBsaXN0CisvLyBOT1RFOiB3aGVuIGFkZGluZyBhIGNvbmZpZyBoZXJlLCBkb24ndCBmb3JnZXQgdG8gdXBkYXRlIGVnbENyZWF0ZSpTdXJmYWNlKCkKIAogc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzBfYXR0cmlidXRlX2xpc3RbXSA9IHsKLSAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAgICAxNiB9LAotICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICAgICAwIH0sCi0gICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgICAgIDUgfSwKLSAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgICAgNiB9LAotICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICAgICA1IH0sCi0gICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgICAgIDAgfSwKLSAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgICAgMCB9LAotICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICAgICBFR0xfV0lORE9XX0JJVCB8IEVHTF9QSVhNQVBfQklUIH0sCisgICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgMTYgfSwKKyAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICA1IH0sCisgICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgIDYgfSwKKyAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgNSB9LAorICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgRUdMX1dJTkRPV19CSVR8RUdMX1BCVUZGRVJfQklUfEVHTF9QSVhNQVBfQklUIH0sCiB9OwogCiBzdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfMV9hdHRyaWJ1dGVfbGlzdFtdID0gewotICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgICAgIDE2IH0sCi0gICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgICAgIDAgfSwKLSAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgICAgNSB9LAotICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICAgICA2IH0sCi0gICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgICAgIDUgfSwKLSAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAgICAxNiB9LAotICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICAgICAxIH0sCi0gICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgICAgIEVHTF9XSU5ET1dfQklUIHwgRUdMX1BJWE1BUF9CSVQgfSwKKyAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAxNiB9LAorICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgIDUgfSwKKyAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgNiB9LAorICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICA1IH0sCisgICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgMTYgfSwKKyAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgMSB9LAorICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKIH07CiAKIHN0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ18yX2F0dHJpYnV0ZV9saXN0W10gPSB7Ci0gICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgICAgMzIgfSwKLSAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgICAgICAwIH0sCi0gICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgICAgIDIgfSwKLSAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgICAgRUdMX1dJTkRPV19CSVQgfCBFR0xfUElYTUFQX0JJVCB9LAorICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgIDMyIH0sCisgICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICAyIH0sCisgICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgIEVHTF9XSU5ET1dfQklUfEVHTF9QQlVGRkVSX0JJVHxFR0xfUElYTUFQX0JJVCB9LAogfTsKIAogc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzNfYXR0cmlidXRlX2xpc3RbXSA9IHsKLSAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAgICAzMiB9LAotICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgICAgMTYgfSwKLSAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgICAgMyB9LAotICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICAgICBFR0xfV0lORE9XX0JJVCB8IEVHTF9QSVhNQVBfQklUIH0sCisgICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgMzIgfSwKKyAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgIDE2IH0sCisgICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgIDMgfSwKKyAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgRUdMX1dJTkRPV19CSVR8RUdMX1BCVUZGRVJfQklUfEVHTF9QSVhNQVBfQklUIH0sCit9OworCitzdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfNF9hdHRyaWJ1dGVfbGlzdFtdID0geworICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICA0IH0sCisgICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgIEVHTF9XSU5ET1dfQklUfEVHTF9QQlVGRkVSX0JJVHxFR0xfUElYTUFQX0JJVCB9LAorfTsKKworc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzVfYXR0cmlidXRlX2xpc3RbXSA9IHsKKyAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAgOCB9LAorICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgMTYgfSwKKyAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgNSB9LAorICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKIH07CiAKIHN0YXRpYyBjb25maWdzX3QgY29uc3QgZ0NvbmZpZ3NbXSA9IHsKQEAgLTU4Niw2ICs2MTIsOCBAQAogICAgICAgICB7IGNvbmZpZ18xX2F0dHJpYnV0ZV9saXN0LCBORUxFTShjb25maWdfMV9hdHRyaWJ1dGVfbGlzdCkgfSwKICAgICAgICAgeyBjb25maWdfMl9hdHRyaWJ1dGVfbGlzdCwgTkVMRU0oY29uZmlnXzJfYXR0cmlidXRlX2xpc3QpIH0sCiAgICAgICAgIHsgY29uZmlnXzNfYXR0cmlidXRlX2xpc3QsIE5FTEVNKGNvbmZpZ18zX2F0dHJpYnV0ZV9saXN0KSB9LAorICAgICAgICB7IGNvbmZpZ180X2F0dHJpYnV0ZV9saXN0LCBORUxFTShjb25maWdfNF9hdHRyaWJ1dGVfbGlzdCkgfSwKKyAgICAgICAgeyBjb25maWdfNV9hdHRyaWJ1dGVfbGlzdCwgTkVMRU0oY29uZmlnXzVfYXR0cmlidXRlX2xpc3QpIH0sCiB9OwogCiBzdGF0aWMgY29uZmlnX21hbmFnZW1lbnRfdCBjb25zdCBnQ29uZmlnTWFuYWdlbWVudFtdID0gewpAQCAtNjY5LDcgKzY5Nyw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBhdHRyaWJ1dGUgbm9udCBmb3VuZC4gdGhpcyBzaG91bGQgTkVWRVIgaGFwcGVuLgorICAgICAgICAgICAgLy8gYXR0cmlidXRlIG5vdCBmb3VuZC4gdGhpcyBzaG91bGQgTkVWRVIgaGFwcGVuLgogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gZXJyb3IsIHRoaXMgYXR0cmlidXRlIGRvZXNuJ3QgZXhpc3QKQEAgLTc3OSwxMSArODA3LDE5IEBACiAgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7IAogICAgICAgICBkZXB0aEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfWl8xNjsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfQV84OyAKKyAgICAgICAgZGVwdGhGb3JtYXQgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9BXzg7IAorICAgICAgICBkZXB0aEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfWl8xNjsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9OT19TVVJGQUNFKTsKICAgICB9CiAKLSAgICAvLyBYWFg6IHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBwaXhlbEZvcm1hdCBoZXJlIGp1c3QgeWV0LgorICAgIC8vIEZJWE1FOiB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgcGl4ZWxGb3JtYXQgaGVyZSBqdXN0IHlldC4KICAgICAvLyAoaXQncyBwb3NzaWJsZSB0aGF0IHRoZSBzdXJmYWNlIGlzIG5vdCBmdWxseSBpbml0aWFsaXplZCkKICAgICAvLyBtYXliZSB0aGlzIHNob3VsZCBiZSBkb25lIGFmdGVyIHRoZSBwYWdlLWZsaXAKICAgICAvL2lmIChFR0xpbnQoaW5mby5mb3JtYXQpICE9IHBpeGVsRm9ybWF0KQpAQCAtODQwLDYgKzg3NiwxNCBAQAogICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OyAKICAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX0FfODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfQV84OyAKKyAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7CisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7CiAgICAgfQpAQCAtODk2LDYgKzk0MCwxNCBAQAogICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OyAKICAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX0FfODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfQV84OyAKKyAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7CisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7CiAgICAgfQpAQCAtOTc5LDcgKzEwMzEsNyBAQAogICAgIEVHTEJvb2xlYW4gcmVzID0gRUdMX1RSVUU7CiAgICAgZWdsX2Rpc3BsYXlfdCYgZCA9IGVnbF9kaXNwbGF5X3Q6OmdldF9kaXNwbGF5KGRweSk7CiAgICAgaWYgKGFuZHJvaWRfYXRvbWljX2RlYygmZC5pbml0aWFsaXplZCkgPT0gMSkgewotICAgICAgICAvLyBUT0RPOiBkZXN0cm95IGFsbCByZXNvdXJjZXMgKHN1cmZhY2VzLCBjb250ZXh0ZXMsIGV0Yy4uLikKKyAgICAgICAgLy8gVE9ETzogZGVzdHJveSBhbGwgcmVzb3VyY2VzIChzdXJmYWNlcywgY29udGV4dHMsIGV0Yy4uLikKICAgICAgICAgLy9wdGhyZWFkX211dGV4X2xvY2soJmdJbml0TXV0ZXgpOwogICAgICAgICAvL3B0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnSW5pdE11dGV4KTsKICAgICB9CkBAIC0xMTA1LDExICsxMTU3LDcgQEAKIEVHTFN1cmZhY2UgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoIEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKIHsKLSAgICAvLyBub25lIG9mIG91ciBjb25maWdzIHN1cHBvcnQgcGJ1ZmZlcnMKLSAgICAvLyAoaW4gZmFjdCBpdCdzIHdvcmtpbmcgYnV0IHNpbmNlIHdlIGNhbid0IHVzZSB0aGVtIGFzIAotICAgIC8vIHRleHR1cmVzIHlldCwgaXQncyBub3QgdXNlZnVsIGF0IGFsbCkKLSAgICAvL2NyZWF0ZVBidWZmZXJTdXJmYWNlKGRweSwgY29uZmlnLCBhdHRyaWJfbGlzdCk7Ci0gICAgcmV0dXJuIEVHTF9OT19TVVJGQUNFOworICAgIHJldHVybiBjcmVhdGVQYnVmZmVyU3VyZmFjZShkcHksIGNvbmZpZywgYXR0cmliX2xpc3QpOwogfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiBFR0xCb29sZWFuIGVnbERlc3Ryb3lTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGVnbFN1cmZhY2UpCkBAIC0xMjMxLDYgKzEyNzksMTMgQEAKICAgICB9CiAKICAgICBFR0xDb250ZXh0IGN1cnJlbnRfY3R4ID0gRUdMX05PX0NPTlRFWFQ7CisgICAgCisgICAgaWYgKChyZWFkID09IEVHTF9OT19TVVJGQUNFICYmIGRyYXcgPT0gRUdMX05PX1NVUkZBQ0UpICYmIChjdHggIT0gRUdMX05PX0NPTlRFWFQpKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX0ZBTFNFKTsKKworICAgIGlmICgocmVhZCAhPSBFR0xfTk9fU1VSRkFDRSB8fCBkcmF3ICE9IEVHTF9OT19TVVJGQUNFKSAmJiAoY3R4ID09IEVHTF9OT19DT05URVhUKSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9GQUxTRSk7CisKICAgICBpZiAoY3R4ID09IEVHTF9OT19DT05URVhUKSB7CiAgICAgICAgIC8vIGlmIHdlJ3JlIGRldGFjaGluZywgd2UgbmVlZCB0aGUgY3VycmVudCBjb250ZXh0CiAgICAgICAgIGN1cnJlbnRfY3R4ID0gKEVHTENvbnRleHQpZ2V0R2xUaHJlYWRTcGVjaWZpYygpOwpAQCAtMTQ4Niw3ICsxNTQxLDcgQEAKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQW5kcm9pZCBleHRlbnRpb25zCisvLyBBbmRyb2lkIGV4dGVuc2lvbnMKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogdm9pZCAoKmVnbEdldFByb2NBZGRyZXNzIChjb25zdCBjaGFyICpwcm9jbmFtZSkpKCkKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvbGlnaHQuY3BwIGIvb3BlbmdsL2xpYmFnbC9saWdodC5jcHAKaW5kZXggODc3MjVjYi4uMjVjNDFkMCAxMDA2NDQKLS0tIGEvb3BlbmdsL2xpYmFnbC9saWdodC5jcHAKKysrIGIvb3BlbmdsL2xpYmFnbC9saWdodC5jcHAKQEAgLTExNywxMSArMTE3LDExIEBACiB9CiAKIHN0YXRpYyBHTGZpeGVkIGZvZ19saW5lYXIob2dsZXNfY29udGV4dF90KiBjLCBHTGZpeGVkIHopIHsKLSAgICByZXR1cm4gY2xhbXBGKGdnbE11bHgoKGMtPmZvZy5lbmQgLSB6KSwgYy0+Zm9nLmludkVuZE1pbnVzU3RhcnQpKTsKKyAgICByZXR1cm4gY2xhbXBGKGdnbE11bHgoKGMtPmZvZy5lbmQgLSAoKHo8MCk/LXo6eikpLCBjLT5mb2cuaW52RW5kTWludXNTdGFydCkpOwogfQogCiBzdGF0aWMgR0xmaXhlZCBmb2dfZXhwKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCB6KSB7Ci0gICAgY29uc3QgZmxvYXQgZSA9IGZpeGVkVG9GbG9hdChnZ2xNdWx4KGMtPmZvZy5kZW5zaXR5LCB6KSk7CisgICAgY29uc3QgZmxvYXQgZSA9IGZpeGVkVG9GbG9hdChnZ2xNdWx4KGMtPmZvZy5kZW5zaXR5LCAoKHo8MCk/LXo6eikpKTsKICAgICByZXR1cm4gY2xhbXBGKGdnbEZsb2F0VG9GaXhlZChmYXN0ZXhwZigtZSkpKTsKIH0KIApAQCAtNTU2LDExICs1NTYsMTEgQEAKICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgR0xfRk9HX1NUQVJUOgotICAgICAgICBjLT5mb2cuc3RhcnQgPSBnZ2xDbGFtcHgocGFyYW0pOworICAgICAgICBjLT5mb2cuc3RhcnQgPSBwYXJhbTsKICAgICAgICAgYy0+Zm9nLmludkVuZE1pbnVzU3RhcnQgPSBnZ2xSZWNpcChjLT5mb2cuZW5kIC0gYy0+Zm9nLnN0YXJ0KTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBHTF9GT0dfRU5EOgotICAgICAgICBjLT5mb2cuZW5kID0gZ2dsQ2xhbXB4KHBhcmFtKTsKKyAgICAgICAgYy0+Zm9nLmVuZCA9IHBhcmFtOwogICAgICAgICBjLT5mb2cuaW52RW5kTWludXNTdGFydCA9IGdnbFJlY2lwKGMtPmZvZy5lbmQgLSBjLT5mb2cuc3RhcnQpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEdMX0ZPR19NT0RFOgpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9tYXRyaXguY3BwIGIvb3BlbmdsL2xpYmFnbC9tYXRyaXguY3BwCmluZGV4IDQ0MWRhMzguLmYxNzVjZGEgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJhZ2wvbWF0cml4LmNwcAorKysgYi9vcGVuZ2wvbGliYWdsL21hdHJpeC5jcHAKQEAgLTk4LDggKzk4LDkgQEAKICAgICBjLT5hcnJheXMucGVyc3BlY3RpdmUgPSAoYy0+Y2xpcFBsYW5lcy5lbmFibGUpID8KICAgICAgICAgb2dsZXNfdmVydGV4X2NsaXBBbGxQZXJzcGVjdGl2ZTNEIDogb2dsZXNfdmVydGV4X3BlcnNwZWN0aXZlM0Q7CiAgICAgaWYgKGVuYWJsZXMgJiAoR0dMX0VOQUJMRV9ERVBUSF9URVNUfEdHTF9FTkFCTEVfRk9HKSkgewotICAgICAgICBjLT5hcnJheXMucGVyc3BlY3RpdmUgPSAoYy0+Y2xpcFBsYW5lcy5lbmFibGUpID8KLSAgICAgICAgICAgIG9nbGVzX3ZlcnRleF9jbGlwQWxsUGVyc3BlY3RpdmUzRFogOiBvZ2xlc192ZXJ0ZXhfcGVyc3BlY3RpdmUzRFo7CisgICAgICAgIGMtPmFycmF5cy5wZXJzcGVjdGl2ZSA9IG9nbGVzX3ZlcnRleF9wZXJzcGVjdGl2ZTNEWjsKKyAgICAgICAgaWYgKGMtPmNsaXBQbGFuZXMuZW5hYmxlIHx8IChlbmFibGVzJkdHTF9FTkFCTEVfRk9HKSkKKyAgICAgICAgICAgIGMtPmFycmF5cy5wZXJzcGVjdGl2ZSA9IG9nbGVzX3ZlcnRleF9jbGlwQWxsUGVyc3BlY3RpdmUzRFo7CiAgICAgfQogICAgIGlmICgoYy0+YXJyYXlzLnZlcnRleC5zaXplICE9IDQpICYmCiAgICAgICAgIChjLT50cmFuc2Zvcm1zLm12cDQuZmxhZ3MgJiB0cmFuc2Zvcm1fdDo6RkxBR1NfMkRfUFJPSkVDVElPTikpIHsKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvcHJpbWl0aXZlcy5jcHAgYi9vcGVuZ2wvbGliYWdsL3ByaW1pdGl2ZXMuY3BwCmluZGV4IDIwZThkMzcuLmYxNjRjMDIgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJhZ2wvcHJpbWl0aXZlcy5jcHAKKysrIGIvb3BlbmdsL2xpYmFnbC9wcmltaXRpdmVzLmNwcApAQCAtMTMzLDcgKzEzMyw3IEBACiB7CiAgICAgaWYgKCEodi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkgewogICAgICAgICB2LT5mbGFncyB8PSB2ZXJ0ZXhfdDo6TElUOwotICAgICAgICB2LT5mb2cgPSBjLT5mb2cuZm9nKGMsIHYtPndpbmRvdy56KTsKKyAgICAgICAgdi0+Zm9nID0gYy0+Zm9nLmZvZyhjLCB2LT5leWUueik7CiAgICAgICAgIGNvbnN0IEdMdm9pZCogY3AgPSBjLT5hcnJheXMuY29sb3IuZWxlbWVudCgKICAgICAgICAgICAgICAgICB2LT5pbmRleCAmIHZlcnRleF9jYWNoZV90OjpJTkRFWF9NQVNLKTsKICAgICAgICAgYy0+YXJyYXlzLmNvbG9yLmZldGNoKGMsIHYtPmNvbG9yLnYsIGNwKTsKQEAgLTE0NCwxNCArMTQ0LDE0IEBACiB7CiAgICAgaWYgKCEodi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkgewogICAgICAgICB2LT5mbGFncyB8PSB2ZXJ0ZXhfdDo6TElUOwotICAgICAgICB2LT5mb2cgPSBjLT5mb2cuZm9nKGMsIHYtPndpbmRvdy56KTsKKyAgICAgICAgdi0+Zm9nID0gYy0+Zm9nLmZvZyhjLCB2LT5leWUueik7CiAgICAgfQogfQogc3RhdGljIGlubGluZQogdm9pZCBsaWdodFZlcnRleFNtb290aEZvZyhvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KQogewogICAgIGlmICghKHYtPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpIHsKLSAgICAgICAgdi0+Zm9nID0gYy0+Zm9nLmZvZyhjLCB2LT53aW5kb3cueik7CisgICAgICAgIHYtPmZvZyA9IGMtPmZvZy5mb2coYywgdi0+ZXllLnopOwogICAgICAgICBjLT5saWdodGluZy5saWdodFZlcnRleChjLCB2KTsKICAgICB9CiB9CkBAIC0yNDMsMTIgKzI0MywyMCBAQAogICAgIG1fYXJlYSA9IG1fZHgwMSptX2R5MDIgKyAoLW1fZHkxMCkqbV9keDIwOwogfQogCit2b2lkIGNvbXB1dGVfaXRlcmF0b3JzX3Q6OmluaXRMaW5lKAorICAgICAgICB2ZXJ0ZXhfdCBjb25zdCogdjAsIHZlcnRleF90IGNvbnN0KiB2MSkKK3sKKyAgICBtX2R4MDEgPSBtX2R5MDIgPSB2MS0+d2luZG93LnggLSB2MC0+d2luZG93Lng7CisgICAgbV9keTEwID0gbV9keDIwID0gdjAtPndpbmRvdy55IC0gdjEtPndpbmRvdy55OworICAgIG1fYXJlYSA9IG1fZHgwMSptX2R5MDIgKyAoLW1fZHkxMCkqbV9keDIwOworfQorCiB2b2lkIGNvbXB1dGVfaXRlcmF0b3JzX3Q6OmluaXRMZXJwKHZlcnRleF90IGNvbnN0KiB2MCwgdWludDMyX3QgZW5hYmxlcykKIHsKICAgICBtX3gwID0gdjAtPndpbmRvdy54OwogICAgIG1feTAgPSB2MC0+d2luZG93Lnk7CiAgICAgY29uc3QgR0dMY29vcmQgYXJlYSA9IChtX2FyZWEgKyBUUklfSEFMRikgPj4gVFJJX0ZSQUNUSU9OX0JJVFM7Ci0gICAgY29uc3QgR0dMY29vcmQgbWluQXJlYSA9IDI7IC8vIGNhbm5vdCBiZSBpbnZlcnNlZAorICAgIGNvbnN0IEdHTGNvb3JkIG1pbkFyZWEgPSAyOyAvLyBjYW5ub3QgYmUgaW52ZXJ0ZWQKICAgICAvLyB0cmlhbmdsZXMgd2l0aCBhbiBhcmVhIHNtYWxsZXIgdGhhbiAxLjAgYXJlIG5vdCBzbW9vdGgtc2hhZGVkCiAKICAgICBpbnQgcT0wLCBzPTAsIGQ9MDsKQEAgLTMzNiw2ICszNDQsMjAgQEAKICAgICBpdFsyXSA9IGRjZHk7CiB9CiAKK3ZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aXRlcmF0b3JzMDAzMihpbnQ2NF90KiBpdCwKKyAgICAgICAgaW50MzJfdCBjMCwgaW50MzJfdCBjMSwgaW50MzJfdCBjMikgY29uc3QKK3sKKyAgICBjb25zdCBpbnQgcyA9IG1fYXJlYV9zY2FsZSAtIDE2OworICAgIGludDMyX3QgZGMwMSA9IChjMSAtIGMwKT4+czsKKyAgICBpbnQzMl90IGRjMDIgPSAoYzIgLSBjMCk+PnM7CisgICAgLy8gMTYuMTYgeCAxNi4xNiA9PSAzMi4zMgorICAgIGludDY0X3QgZGNkeCA9IGdnbE11bGlpKGRjMDEsIG1fZHkwMikgKyBnZ2xNdWxpaShkYzAyLCBtX2R5MTApOworICAgIGludDY0X3QgZGNkeSA9IGdnbE11bGlpKGRjMDIsIG1fZHgwMSkgKyBnZ2xNdWxpaShkYzAxLCBtX2R4MjApOworICAgIGl0WyAwXSA9IChjMDw8MTYpIC0gKChkY2R4Km1feDAgKyBkY2R5Km1feTApPj40KTsKKyAgICBpdFsgMV0gPSBkY2R4OworICAgIGl0WyAyXSA9IGRjZHk7Cit9CisKICNpZiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fdGh1bWJfXykKIGlubGluZSB2b2lkIGNvbXB1dGVfaXRlcmF0b3JzX3Q6Oml0ZXJhdG9yczAwMzIoaW50MzJfdCogaXQsCiAgICAgICAgIGludDMyX3QgYzAsIGludDMyX3QgYzEsIGludDMyX3QgYzIpIGNvbnN0CkBAIC0zNDYsMTYgKzM2OCwxMSBAQAogdm9pZCBjb21wdXRlX2l0ZXJhdG9yc190OjppdGVyYXRvcnMwMDMyKGludDMyX3QqIGl0LAogICAgICAgICBpbnQzMl90IGMwLCBpbnQzMl90IGMxLCBpbnQzMl90IGMyKSBjb25zdAogewotICAgIGNvbnN0IGludCBzID0gbV9hcmVhX3NjYWxlIC0gMTY7Ci0gICAgaW50MzJfdCBkYzAxID0gKGMxIC0gYzApPj5zOwotICAgIGludDMyX3QgZGMwMiA9IChjMiAtIGMwKT4+czsKLSAgICAvLyAxNi4xNiB4IDE2LjE2ID09IDMyLjMyCi0gICAgaW50NjRfdCBkY2R4ID0gZ2dsTXVsaWkoZGMwMSwgbV9keTAyKSArIGdnbE11bGlpKGRjMDIsIG1fZHkxMCk7Ci0gICAgaW50NjRfdCBkY2R5ID0gZ2dsTXVsaWkoZGMwMiwgbV9keDAxKSArIGdnbE11bGlpKGRjMDEsIG1fZHgyMCk7Ci0gICAgaW50MzJfdCBjID0gKGMwPDwxNikgLSAoKGRjZHgqbV94MCArIGRjZHkqbV95MCk+PjQpOwotICAgIGl0WyAwXSA9IGM7Ci0gICAgaXRbIDFdID0gZGNkeDsKLSAgICBpdFsgMl0gPSBkY2R5OworICAgIGludDY0X3QgaXQ2NFszXTsKKyAgICBpdGVyYXRvcnMwMDMyKGl0LCBjMCwgYzEsIGMyKTsKKyAgICBpdFswXSA9IGl0NjRbMF07CisgICAgaXRbMV0gPSBpdDY0WzFdOworICAgIGl0WzJdID0gaXQ2NFsyXTsKIH0KICNlbmRpZgogCkBAIC00NTQsNyArNDcxLDcgQEAKICAgICAgICAgICAgIGMtPmFycmF5cy5jb2xvci5mZXRjaChjLCB2LT5jb2xvci52LCBjcCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX0ZPRykgewotICAgICAgICAgICAgdi0+Zm9nID0gYy0+Zm9nLmZvZyhjLCB2LT53aW5kb3cueik7CisgICAgICAgICAgICB2LT5mb2cgPSBjLT5mb2cuZm9nKGMsIHYtPmV5ZS56KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTE0LDIyICs1MzEsMTIgQEAKIAogdm9pZCBwcmltaXRpdmVfbGluZShvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxKQogewotICAgIC8vIFRoaXMgaXMgYSBjaGVlenkgaW1wbGVtZW50YXRpb24gb2YgbGluZSBkcmF3aW5nIHRoYXQKLSAgICAvLyB1c2VzIDIgdHJpYW5nbGVzIHBlciBsaW5lLiAKLSAgICAvLyBUaGF0IHNhaWQsIGhvdyBvZnRlbiBsaW5lIGRyYXdpbmcgaXMgdXNlZD8KLQogICAgIC8vIGdldCB0ZXh0dXJlIGNvb3JkaW5hdGVzCiAgICAgZmV0Y2hfdGV4Y29vcmQoYywgdjAsIHYxLCB2MSk7CiAKICAgICAvLyBsaWdodC9zaGFkZSB0aGUgdmVydGljZXMgZmlyc3QgKHRoZXkncmUgY29waWVkIGJlbG93KQogICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VHJpYW5nbGUoYywgdjAsIHYxLCB2MSk7CiAKLSAgICB2ZXJ0ZXhfdCB2WzRdOwotICAgIHZbMF0gPSAqdjA7Ci0gICAgdlsxXSA9ICp2MTsKLSAgICB2MCA9ICZ2WzBdOwotICAgIHYxID0gJnZbMV07Ci0KICAgICAvLyBjbGlwIHRoZSBsaW5lIGlmIG5lZWRlZAogICAgIGlmIChnZ2xfdW5saWtlbHkoKHYwLT5mbGFncyB8IHYxLT5mbGFncykgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSB7CiAgICAgICAgIHVuc2lnbmVkIGludCBjb3VudCA9IGNsaXBfbGluZShjLCB2MCwgdjEpOwpAQCAtNTQ2LDggKzU1Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0dMX0VOQUJMRV9ERVBUSF9URVNUOwogCiAgICAgaWYgKGdnbF91bmxpa2VseShlbmFibGVzICYgbWFzaykpIHsKLSAgICAgICAgYy0+bGVycC5pbml0VHJpYW5nbGUodjAsIHYxLCB2MSk7Ci0gICAgICAgIGxlcnBfdHJpYW5nbGUoYywgdjAsIHYxLCB2MSk7CisgICAgICAgIGMtPmxlcnAuaW5pdExpbmUodjAsIHYxKTsKKyAgICAgICAgbGVycF90cmlhbmdsZShjLCB2MCwgdjEsIHYwKTsKICAgICB9CiAKICAgICAvLyByZW5kZXIgb3VyIGxpbmUKQEAgLTY1NCwxNyArNjYxLDI2IEBACiAgICAgICAgIGNvbnN0IGludDMyX3QgdjB6ID0gY2xhbXBaKHYwLT53aW5kb3cueik7CiAgICAgICAgIGNvbnN0IGludDMyX3QgdjF6ID0gY2xhbXBaKHYxLT53aW5kb3cueik7CiAgICAgICAgIGNvbnN0IGludDMyX3QgdjJ6ID0gY2xhbXBaKHYyLT53aW5kb3cueik7Ci0gICAgICAgIGxlcnAuaXRlcmF0b3JzMDAzMihpdHosIHYweiwgdjF6LCB2MnopOwogICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KGMtPnBvbHlnb25PZmZzZXQuZW5hYmxlKSkgeworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB1bml0cyA9IChjLT5wb2x5Z29uT2Zmc2V0LnVuaXRzIDw8IDE2KTsKICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgZmFjdG9yID0gYy0+cG9seWdvbk9mZnNldC5mYWN0b3I7Ci0gICAgICAgICAgICBjb25zdCBHTGZpeGVkIHVuaXRzID0gYy0+cG9seWdvbk9mZnNldC51bml0czsKLSAgICAgICAgICAgIGludDMyX3QgbWF4RGVwdGhTbG9wZSA9IG1heChhYnMoaXR6WzFdKSwgYWJzKGl0elsyXSkpOwotICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQgPSAoaW50NjRfdChtYXhEZXB0aFNsb3BlKSpmYWN0b3IgKwotICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCh1bml0cykgPDwgMTYpKSA+PiAxNjsKLSAgICAgICAgICAgIGl0elswXSArPSBvZmZzZXQ7IC8vIFhYWDogdGhpcyBjYW4gY2F1c2Ugb3ZlcmZsb3dzCisgICAgICAgICAgICBpZiAoZmFjdG9yKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBpdHo2NFszXTsKKyAgICAgICAgICAgICAgICBsZXJwLml0ZXJhdG9yczAwMzIoaXR6NjQsIHYweiwgdjF6LCB2MnopOworICAgICAgICAgICAgICAgIGludDY0X3QgbWF4RGVwdGhTbG9wZSA9IG1heChpdHo2NFsxXSwgaXR6NjRbMl0pOworICAgICAgICAgICAgICAgIGl0elswXSA9IHVpbnQzMl90KGl0ejY0WzBdKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdWludDMyX3QoKG1heERlcHRoU2xvcGUqZmFjdG9yKT4+MTYpICsgdW5pdHM7CisgICAgICAgICAgICAgICAgaXR6WzFdID0gdWludDMyX3QoaXR6NjRbMV0pOworICAgICAgICAgICAgICAgIGl0elsyXSA9IHVpbnQzMl90KGl0ejY0WzJdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGVycC5pdGVyYXRvcnMwMDMyKGl0eiwgdjB6LCB2MXosIHYyeik7CisgICAgICAgICAgICAgICAgaXR6WzBdICs9IHVuaXRzOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlcnAuaXRlcmF0b3JzMDAzMihpdHosIHYweiwgdjF6LCB2MnopOwogICAgICAgICB9CiAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuekdyYWQzeHYoYywgaXR6KTsKLSAgICB9CisgICAgfSAgICAKIAogICAgIGlmIChnZ2xfdW5saWtlbHkoZW5hYmxlcyAmIEdHTF9FTkFCTEVfRk9HKSkgewogICAgICAgICBHTGZpeGVkIGl0ZlszXTsKQEAgLTg4MCwxMSArODk2LDExIEBACiAgICAgICAgICAgICAgICAgdmVydGV4X3QqKiBvdXRwdXQgPSBvdmw7CiAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9jID0gMDsKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2VudGluZWwgPSAwOwotICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHZlcnRpY2UsIGNvbXB1dGUgZGlzdGFuY2UgdG8gdGhlIHBsYW5lCisgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdmVydGV4LCBjb21wdXRlIGRpc3RhbmNlIHRvIHRoZSBwbGFuZQogICAgICAgICAgICAgICAgIHZlcnRleF90KiBzID0gaXZsW2ljLTFdOwogICAgICAgICAgICAgICAgIGNvbnN0IHZlYzRfdCYgZXF1YXRpb24gPSBjLT5jbGlwUGxhbmVzLnBsYW5lW3BsYW5lXS5lcXVhdGlvbjsKICAgICAgICAgICAgICAgICBHTGZpeGVkIHNkID0gZG90NChlcXVhdGlvbi52LCBzLT5leWUudik7Ci0gICAgICAgICAgICAgICAgLy8gY2xpcCBlYWNoIHZlcnRpY2UgYWdhaW5zdCB0aGlzIHBsYW5lLi4uCisgICAgICAgICAgICAgICAgLy8gY2xpcCBlYWNoIHZlcnRleCBhZ2FpbnN0IHRoaXMgcGxhbmUuLi4KICAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpPTAgOyBpPGljIDsgaSsrKSB7ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIHZlcnRleF90KiBwID0gaXZsW2ldOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHBkID0gZG90NChlcXVhdGlvbi52LCBwLT5leWUudik7CkBAIC05NDYsMTAgKzk2MiwxMCBAQAogICAgICAgICAgICAgICAgIHZlcnRleF90Kiogb3V0cHV0ID0gb3ZsOwogICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvYyA9IDA7CiAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNlbnRpbmVsID0gMDsKLSAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyB2ZXJ0aWNlLCBjb21wdXRlIGRpc3RhbmNlIHRvIHRoZSBwbGFuZQorICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHZlcnRleCwgY29tcHV0ZSBkaXN0YW5jZSB0byB0aGUgcGxhbmUKICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdCogcyA9IGl2bFtpYy0xXTsKICAgICAgICAgICAgICAgICBHTGZpeGVkIHNkID0gZnJ1c3R1bVBsYW5lRGlzdChwbGFuZSwgcy0+Y2xpcCk7Ci0gICAgICAgICAgICAgICAgLy8gY2xpcCBlYWNoIHZlcnRpY2UgYWdhaW5zdCB0aGlzIHBsYW5lLi4uCisgICAgICAgICAgICAgICAgLy8gY2xpcCBlYWNoIHZlcnRleCBhZ2FpbnN0IHRoaXMgcGxhbmUuLi4KICAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpPTAgOyBpPGljIDsgaSsrKSB7ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIHZlcnRleF90KiBwID0gaXZsW2ldOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHBkID0gZnJ1c3R1bVBsYW5lRGlzdChwbGFuZSwgcC0+Y2xpcCk7CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL3ZlcnRleC5jcHAgYi9vcGVuZ2wvbGliYWdsL3ZlcnRleC5jcHAKaW5kZXggNWJjYzlkYy4uZGFkMDRkNiAxMDA2NDQKLS0tIGEvb3BlbmdsL2xpYmFnbC92ZXJ0ZXguY3BwCisrKyBiL29wZW5nbC9saWJhZ2wvdmVydGV4LmNwcApAQCAtOTksNyArOTksNyBAQAogICAgIGMtPmFycmF5cy5jdWxsICY9IGNsaXA7CiAKICAgICBpZiAoZ2dsX2xpa2VseSghY2xpcCkpIHsKLSAgICAgICAgLy8gaWYgdGhlIHZlcnRpY2UgaXMgY2xpcHBlZCwgd2UgZG9uJ3QgZG8gdGhlIHBlcnNwZWN0aXZlCisgICAgICAgIC8vIGlmIHRoZSB2ZXJ0ZXggaXMgY2xpcHBlZCwgd2UgZG9uJ3QgZG8gdGhlIHBlcnNwZWN0aXZlCiAgICAgICAgIC8vIGRpdmlkZSwgc2luY2Ugd2UgZG9uJ3QgbmVlZCBpdHMgd2luZG93IGNvb3JkaW5hdGVzLgogICAgICAgICBwZXJzcGVjdGl2ZShjLCB2LCBlbmFibGVzKTsKICAgICB9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNTNlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvQW5kcm9pZC5tawpAQCAtMCwwICsxIEBACitpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNjczY2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTcgQEAKKyMgQ29weXJpZ2h0IDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfU1JDX0ZJTEVTOj0gYXBwLWxpbnV4LmMgZGVtby5jLmFybQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJHTEVTX0NNIGxpYnVpCitMT0NBTF9NT0RVTEU6PSBhbmdlbGVzCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9TUkNfRklMRVM6PSBncHVzdGF0ZS5jCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYkdMRVNfQ00KK0xPQ0FMX01PRFVMRTo9IGdwdXN0YXRlCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9NT0RVTEVfTElDRU5TRV9CU0RfT1JfTEdQTCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL01PRFVMRV9MSUNFTlNFX0JTRF9PUl9MR1BMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9NT0RVTEVfTElDRU5TRV9CU0RfT1JfTEdQTApkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvUkVBRE1FLnR4dCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiOGE0YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL1JFQURNRS50eHQKQEAgLTAsMCArMSw3NyBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQ0KK0NvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGENCitXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vDQorU2VlIGZpbGUgbGljZW5zZS50eHQgZm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbi4NCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitUaGlzIGlzIGFuIE9wZW5HTCBFUyBwb3J0IG9mIHRoZSBzbWFsbCBzZWxmLXJ1bm5pbmcgZGVtb25zdHJhdGlvbg0KK2NhbGxlZCAiU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24iLCB3aGljaCB3YXMgZmlyc3QgcHJlc2VudGVkIGluIHRoZQ0KK0Fzc2VtYmx5JzIwMDQgZXZlbnQuIEl0IHdvbiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIDQgS0IgaW50cm8NCitjb21wZXRpdGlvbiBjYXRlZ29yeS4NCisNCitUaGUgZGVtb25zdHJhdGlvbiBmZWF0dXJlcyBhIHNpZ2h0c2VlaW5nIG9mIGEgZnV0dXJpc3RpYyBjaXR5DQoraGF2aW5nIG1hbnkgZGlmZmVyZW50IGtpbmQgb2YgYnVpbGRpbmdzIGFuZCBpdGVtcy4gRXZlcnl0aGluZyBpcw0KK2ZsYXQgc2hhZGVkIHdpdGggdGhyZWUgZGlmZmVyZW50IGxpZ2h0cy4NCisNCitUaGUgb3JpZ2luYWwgdmVyc2lvbiB3YXMgbWFkZSBmb3IgZGVza3RvcCB3aXRoIE9wZW5HTC4gSXQgd2FzDQorbmF0dXJhbGx5IGhlYXZpbHkgc2l6ZSBvcHRpbWl6ZWQgaW4gb3JkZXIgdG8gZml0IGl0IGluIHRoZSBzaXplDQorbGltaXQuIEZvciB0aGlzIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUgbXVjaCBvZiB0aGUgY29kZSBpcw0KK2NsZWFuZWQgdXAgYW5kIHRoZSBzb3VuZCBpcyByZW1vdmVkLiBBbHNvIGRldGFpbCBsZXZlbCBpcyBsb3dlcmVkLA0KK2FsdGhvdWdoIGl0IHN0aWxsIGNvbnRhaW5zIG92ZXIgNjAwMDAgZmFjZXMuDQorDQorVGhlIFdpbjMyICgyMDAwL1hQKSBiaW5hcnkgcGFja2FnZSBvZiBvcmlnaW5hbCB2ZXJzaW9uIGlzDQorYXZhaWxhYmxlIGZyb20gdGhpcyBhZGRyZXNzOiBodHRwOi8vamV0LnJvL2ZpbGVzL2FuZ2VsZXMuemlwDQorDQorRmlyc3QgdmVyc2lvbiBvZiB0aGlzIE9wZW5HTCBFUyBwb3J0IHdhcyBzdWJtaXR0ZWQgdG8gdGhlIEtocm9ub3MNCitPcGVuR0wgRVMgQ29kaW5nIENoYWxsZW5nZSBoZWxkIGluIDIwMDQtMjAwNS4NCisNCitBcyBhIGNvZGUgZXhhbXBsZSwgdGhpcyBzb3VyY2Ugc2hvd3MgdGhlIGZvbGxvd2luZzoNCisgICogSG93IHRvIGNyZWF0ZSBhIG1pbmltYWwgYW5kIHBvcnRhYmxlIGFkIGhvYyBmcmFtZXdvcmsNCisgICAgZm9yIHNtYWxsIHRlc3RpbmcvZGVtb25zdHJhdGlvbiBwcm9ncmFtcy4gVGhpcyBmcmFtZXdvcmsNCisgICAgY29tcGlsZXMgZm9yIGJvdGggZGVza3RvcCBhbmQgUG9ja2V0UEMgV2luMzIgZW52aXJvbm1lbnQsDQorICAgIGFuZCBhIHNlcGFyYXRlIHNvdXJjZSBpcyBpbmNsdWRlZCBmb3IgTGludXggd2l0aCBYMTEuDQorICAqIEhvdyB0byBkeW5hbWljYWxseSBmaW5kIGFuZCB1c2UgdGhlIE9wZW5HTCBFUyBETEwgb3INCisgICAgc2hhcmVkIG9iamVjdCwgc28gdGhhdCB0aGUgbGlicmFyeSBpcyBub3QgbmVlZGVkIGF0DQorICAgIHRoZSBjb21waWxlL2xpbmsgc3RhZ2UuDQorICAqIEhvdyB0byB1c2UgdGhlIGJhc2ljIGZlYXR1cmVzIG9mIE9wZW5HTCBFUyAxLjAvMS4xDQorICAgIENvbW1vbiBMaXRlLCBzdWNoIGFzIHZlcnRleCBhcnJheXMsIGNvbG9yIGFycmF5cyBhbmQNCisgICAgbGlnaHRpbmcuDQorICAqIEhvdyB0byBjcmVhdGUgYSBzZWxmIGNvbnRhaW5lZCBzbWFsbCBkZW1vbnN0cmF0aW9uDQorICAgIGFwcGxpY2F0aW9uIHdpdGggb2JqZWN0cyBnZW5lcmF0ZWQgdXNpbmcgcHJvY2VkdXJhbA0KKyAgICBhbGdvcml0aG1zLg0KKw0KK0FzIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHdhcyBvcHRpbWl6ZWQgZm9yIHNpemUgaW5zdGVhZCBvZg0KK3BlcmZvcm1hbmNlLCB0aGF0IGhvbGRzIHRydWUgZm9yIHRoaXMgT3BlbkdMIEVTIHZlcnNpb24gYXMNCit3ZWxsLiBUaHVzIHRoZSBwZXJmb3JtYW5jZSBjb3VsZCBiZSBzaWduaWZpY2FudGx5IGluY3JlYXNlZCwNCitmb3IgZXhhbXBsZSBieSBjaGFuZ2luZyB0aGUgY29kZSB0byB1c2UgZ2xEcmF3RWxlbWVudHMNCitpbnN0ZWFkIG9mIGdsRHJhd0FycmF5cy4gVGhlIGNvZGUgdXNlcyBvbmx5IE9wZW5HTCBFUyAxLjANCitDb21tb24gTGl0ZSAtbGV2ZWwgZnVuY3Rpb24gY2FsbHMgd2l0aG91dCBhbnkgZXh0ZW5zaW9ucy4NCisNCitUaGUgcmVmZXJlbmNlIE9wZW5HTCBFUyBpbXBsZW1lbnRhdGlvbnMgdXNlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbjoNCisgICogSHlicmlkJ3MgT3BlbkdMIEVTIEFQSSBJbXBsZW1lbnRhdGlvbiAoR2VyYmVyYSkgdmVyc2lvbiAyLjAuNA0KKyAgICBQcmVidWlsdCBXaW4zMiBQQyBleGVjdXRhYmxlOiBTYW5PR0xFUy1HZXJiZXJhLmV4ZQ0KKyAgKiBQb3dlclZSIE1CWCBTREssIE9wZW5HTCBFUyBXaW5kb3dzIFBDIEVtdWxhdGlvbiB2ZXJzaW9uIDEuMDQuMTQuMDE3MA0KKyAgICBQcmVidWlsdCBXaW4zMiBQQyBleGVjdXRhYmxlOiBTYW5PR0xFUy1QVlJTREsuZXhlDQorDQorTm90ZSB0aGF0IERJU0FCTEVfSU1QT1JUR0wgcHJlcHJvY2Vzc29yIG1hY3JvIGNhbiBiZSB1c2VkDQordG8gc3BlY2lmeSBub3QgdG8gdXNlIGR5bmFtaWMgcnVudGltZSBiaW5kaW5nIG9mIHRoZSBsaWJyYXJ5Lg0KK1lvdSBhbHNvIG5lZWQgdG8gZGVmaW5lIHByZXByb2Nlc3NvciBtYWNybyBQVlJTREsgdG8gY29tcGlsZQ0KK3RoZSBzb3VyY2Ugd2l0aCBQb3dlclZSIE9wZW5HTCBFUyBTREsuDQorDQorVGhlIGRlbW8gYXBwbGljYXRpb24gaXMgYnJpZWZseSB0ZXN0ZWQgd2l0aCBhIGZldyBvdGhlciBPcGVuR0wgRVMNCitpbXBsZW1lbnRhdGlvbnMgYXMgd2VsbCAoZS5nLiBWaW5jZW50LCBHTEVTb25HTCBvbiBMaW51eCwgRGVsbA0KK0F4aW0gWDUwdikuIE1vc3Qgb2YgdGhlc2Ugb3RoZXIgaW1wbGVtZW50YXRpb25zIHJlbmRlcmVkIHRoZSBkZW1vDQorZXJyb25lb3VzbHkgaW4gc29tZSBhc3BlY3QuIFRoaXMgbWF5IGluZGljYXRlIHRoYXQgdGhlIGRlbW8gc291cmNlDQorY291bGQgc3RpbGwgaGF2ZSBzb21lIHdvcmsgdG8gZG8gd2l0aCBjb21wYXRpYmlsaXR5IGFuZCBjb3JyZWN0DQorQVBJIHVzYWdlLCBhbHRob3VnaCB0aGUgbm9uLWNvbmZvcm1pbmcgaW1wbGVtZW50YXRpb25zIGFyZSBtb3N0DQorcHJvYmFibHkgdW5maW5pc2hlZCBhcyB3ZWxsLg0KKw0KK1RoYW5rcyBhbmQgQWNrbm93bGVkZ2VtZW50czoNCisNCisqIFRvbmkgTPZubmJlcmcgKCFDdWJlKSBjcmVhdGVkIHRoZSBtdXNpYyBmb3Igb3JpZ2luYWwgdmVyc2lvbiwgd2hpY2gNCisgIGlzIG5vdCBmZWF0dXJlZCBpbiB0aGlzIE9wZW5HTCBFUyBwb3J0Lg0KKyogU2FyYSBLYXBsaSAoc3QgUmFuYSkgZm9yIGFkZGl0aW9uYWwgY2FtZXJhIHdvcmsuDQorKiBQYXVsIEJvdXJrZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN1cGVyc2hhcGVzLg0KKw0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC1saW51eC5jIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvYXBwLWxpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzOWViMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC1saW51eC5jCkBAIC0wLDAgKzEsMjIyIEBACisvKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLworICoKKyAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CisgKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKKyAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKKyAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KKyAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KKyAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcworICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogJElkOiBhcHAtbGludXguYyx2IDEuNCAyMDA1LzAyLzA4IDE4OjQyOjQ4IHRvbmljIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNCAkCisgKgorICogUGFydHMgb2YgdGhpcyBzb3VyY2UgZmlsZSBpcyBiYXNlZCBvbiB0ZXN0L2V4YW1wbGUgY29kZSBmcm9tCisgKiBHTEVTb25HTCBpbXBsZW1lbnRhdGlvbiBieSBEYXZpZCBCbHl0aGUuIEhlcmUgaXMgY29weSBvZiB0aGUKKyAqIGxpY2Vuc2Ugbm90aWNlIGZyb20gdGhhdCBzb3VyY2U6CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBEYXZpZCBCbHl0aGUgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogREFWSUQgQkxZVEhFIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgPEdMRVMvZWdsLmg+CisKKyNpbmNsdWRlICJhcHAuaCIKKworCitpbnQgZ0FwcEFsaXZlID0gMTsKKworc3RhdGljIGNvbnN0IGNoYXIgc0FwcE5hbWVbXSA9CisgICAgIlNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUgKExpbnV4KSI7CisKK3N0YXRpYyBpbnQgc1dpbmRvd1dpZHRoID0gV0lORE9XX0RFRkFVTFRfV0lEVEg7CitzdGF0aWMgaW50IHNXaW5kb3dIZWlnaHQgPSBXSU5ET1dfREVGQVVMVF9IRUlHSFQ7CitzdGF0aWMgRUdMRGlzcGxheSBzRWdsRGlzcGxheSA9IEVHTF9OT19ESVNQTEFZOworc3RhdGljIEVHTENvbnRleHQgc0VnbENvbnRleHQgPSBFR0xfTk9fQ09OVEVYVDsKK3N0YXRpYyBFR0xTdXJmYWNlIHNFZ2xTdXJmYWNlID0gRUdMX05PX1NVUkZBQ0U7CisKK2NvbnN0IGNoYXIgKmVnbF9zdHJlcnJvcih1bnNpZ25lZCBlcnIpCit7CisgICAgc3dpdGNoKGVycil7CisgICAgY2FzZSBFR0xfU1VDQ0VTUzogcmV0dXJuICJTVUNDRVNTIjsKKyAgICBjYXNlIEVHTF9OT1RfSU5JVElBTElaRUQ6IHJldHVybiAiTk9UIElOSVRJQUxJWkVEIjsKKyAgICBjYXNlIEVHTF9CQURfQUNDRVNTOiByZXR1cm4gIkJBRCBBQ0NFU1MiOworICAgIGNhc2UgRUdMX0JBRF9BTExPQzogcmV0dXJuICJCQUQgQUxMT0MiOworICAgIGNhc2UgRUdMX0JBRF9BVFRSSUJVVEU6IHJldHVybiAiQkFEX0FUVFJJQlVURSI7CisgICAgY2FzZSBFR0xfQkFEX0NPTkZJRzogcmV0dXJuICJCQUQgQ09ORklHIjsKKyAgICBjYXNlIEVHTF9CQURfQ09OVEVYVDogcmV0dXJuICJCQUQgQ09OVEVYVCI7CisgICAgY2FzZSBFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRTogcmV0dXJuICJCQUQgQ1VSUkVOVCBTVVJGQUNFIjsKKyAgICBjYXNlIEVHTF9CQURfRElTUExBWTogcmV0dXJuICJCQUQgRElTUExBWSI7CisgICAgY2FzZSBFR0xfQkFEX01BVENIOiByZXR1cm4gIkJBRCBNQVRDSCI7CisgICAgY2FzZSBFR0xfQkFEX05BVElWRV9QSVhNQVA6IHJldHVybiAiQkFEIE5BVElWRSBQSVhNQVAiOworICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfV0lORE9XOiByZXR1cm4gIkJBRCBOQVRJVkUgV0lORE9XIjsKKyAgICBjYXNlIEVHTF9CQURfUEFSQU1FVEVSOiByZXR1cm4gIkJBRCBQQVJBTUVURVIiOworICAgIGNhc2UgRUdMX0JBRF9TVVJGQUNFOiByZXR1cm4gIkJBRF9TVVJGQUNFIjsKKy8vICAgIGNhc2UgRUdMX0NPTlRFWFRfTE9TVDogcmV0dXJuICJDT05URVhUIExPU1QiOworICAgIGRlZmF1bHQ6IHJldHVybiAiVU5LTk9XTiI7CisgICAgfQorfQorCit2b2lkIGVnbF9lcnJvcihjb25zdCBjaGFyICpuYW1lKQoreworICAgIHVuc2lnbmVkIGVyciA9IGVnbEdldEVycm9yKCk7CisgICAgaWYoZXJyICE9IEVHTF9TVUNDRVNTKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIlcygpOiBlZ2wgZXJyb3IgMHgleCAoJXMpXG4iLCAKKyAgICAgICAgICAgICAgICBuYW1lLCBlcnIsIGVnbF9zdHJlcnJvcihlcnIpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrR0xFcnJvcnMoKQoreworICAgIEdMZW51bSBlcnJvciA9IGdsR2V0RXJyb3IoKTsKKyAgICBpZiAoZXJyb3IgIT0gR0xfTk9fRVJST1IpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiR0wgRXJyb3I6IDB4JTA0eFxuIiwgKGludCllcnJvcik7Cit9CisKKworc3RhdGljIHZvaWQgY2hlY2tFR0xFcnJvcnMoKQoreworICAgIEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7CisgICAgLy8gR0xFU29uR0wgc2VlbXMgdG8gYmUgcmV0dXJuaW5nIDAgd2hlbiB0aGVyZSBpcyBubyBlcnJvcnM/CisgICAgaWYgKGVycm9yICYmIGVycm9yICE9IEVHTF9TVUNDRVNTKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVHTCBFcnJvcjogMHglMDR4XG4iLCAoaW50KWVycm9yKTsKK30KKworc3RhdGljIGludCBpbml0R3JhcGhpY3MoKQoreworICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgIEVHTF9SRURfU0laRSwgICAgICAgNSwKKyAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCAgICAgNiwKKyAgICAgICAgIEVHTF9CTFVFX1NJWkUsICAgICAgNSwKKyAjaWYgMQorICAgICAgICAgRUdMX0RFUFRIX1NJWkUsICAgICAxNiwKKyAgICAgICAgIEVHTF9TVEVOQ0lMX1NJWkUsICAgMCwKKyAjZWxzZQorICAgICAgICAgRUdMX0FMUEhBX1NJWkUsICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgRUdMX0RFUFRIX1NJWkUsICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgRUdMX1NURU5DSUxfU0laRSwgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgICBFR0xfRE9OVF9DQVJFLAorICNlbmRpZgorICAgICAgICAgRUdMX05PTkUKKyAgICAgfTsKKyAgICAgCisgICAgIEVHTGludCBudW1Db25maWdzID0gLTE7CisgICAgIEVHTGludCBtYWpvclZlcnNpb247CisgICAgIEVHTGludCBtaW5vclZlcnNpb247CisgICAgIEVHTENvbmZpZyBjb25maWc7CisgICAgIEVHTENvbnRleHQgY29udGV4dDsKKyAgICAgRUdMU3VyZmFjZSBzdXJmYWNlOworICAgICAKKyAgICAgRUdMRGlzcGxheSBkcHk7CisKKyAgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgZWdsX2Vycm9yKCJlZ2xHZXREaXNwbGF5Iik7CisgICAgIGZwcmludGYoc3RkZXJyLCJkcHkgPSAweCUwOHhcbiIsICh1bnNpZ25lZCkgZHB5KTsKKyAgICAgCisgICAgIGVnbEluaXRpYWxpemUoZHB5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKKyAgICAgZWdsX2Vycm9yKCJlZ2xJbml0aWFsaXplIik7CisKKyAgICAgZWdsR2V0Q29uZmlncyhkcHksIE5VTEwsIDAsICZudW1Db25maWdzKTsKKyAgICAgZWdsX2Vycm9yKCJlZ2xHZXRDb25maWdzIik7CisgICAgIGZwcmludGYoc3RkZXJyLCJudW0gY29uZmlncyAlZFxuIiwgbnVtQ29uZmlncyk7CisgICAgIAorICAgICBlZ2xDaG9vc2VDb25maWcoZHB5LCBzX2NvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKKyAgICAgZWdsX2Vycm9yKCJlZ2xDaG9vc2VDb25maWciKTsKKworICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNvbmZpZywKKyAgICAgICAgICAgICBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCksIE5VTEwpOworICAgICBlZ2xfZXJyb3IoImVnbE1hcFdpbmRvd1N1cmZhY2UiKTsKKworICAgICBmcHJpbnRmKHN0ZGVyciwic3VyZmFjZSA9ICVwXG4iLCBzdXJmYWNlKTsKKworICAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIGNvbmZpZywgTlVMTCwgTlVMTCk7CisgICAgIGVnbF9lcnJvcigiZWdsQ3JlYXRlQ29udGV4dCIpOworICAgICBmcHJpbnRmKHN0ZGVyciwiY29udGV4dCA9ICVwXG4iLCBjb250ZXh0KTsKKyAgICAgCisgICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7ICAgCisgICAgIGVnbF9lcnJvcigiZWdsTWFrZUN1cnJlbnQiKTsKKworICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZzV2luZG93V2lkdGgpOworICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmc1dpbmRvd0hlaWdodCk7CisKKyAgICBzRWdsRGlzcGxheSA9IGRweTsKKyAgICBzRWdsU3VyZmFjZSA9IHN1cmZhY2U7CisgICAgc0VnbENvbnRleHQgPSBjb250ZXh0OworCisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorCisKK3N0YXRpYyB2b2lkIGRlaW5pdEdyYXBoaWNzKCkKK3sKKyAgICBlZ2xNYWtlQ3VycmVudChzRWdsRGlzcGxheSwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgZWdsRGVzdHJveUNvbnRleHQoc0VnbERpc3BsYXksIHNFZ2xDb250ZXh0KTsKKyAgICBlZ2xEZXN0cm95U3VyZmFjZShzRWdsRGlzcGxheSwgc0VnbFN1cmZhY2UpOworICAgIGVnbFRlcm1pbmF0ZShzRWdsRGlzcGxheSk7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICAvLyBub3QgcmVmZXJlbmNlZDoKKyAgICBhcmdjID0gYXJnYzsKKyAgICBhcmd2ID0gYXJndjsKKworICAgIGlmICghaW5pdEdyYXBoaWNzKCkpCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkdyYXBoaWNzIGluaXRpYWxpemF0aW9uIGZhaWxlZC5cbiIpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIGFwcEluaXQoKTsKKyAgICAKKyAgICB3aGlsZSAoZ0FwcEFsaXZlKQorICAgIHsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgdGltZU5vdzsKKworICAgICAgICBpZiAoZ0FwcEFsaXZlKQorICAgICAgICB7CisgICAgICAgICAgICBnZXR0aW1lb2ZkYXkoJnRpbWVOb3csIE5VTEwpOworICAgICAgICAgICAgYXBwUmVuZGVyKHRpbWVOb3cudHZfc2VjICogMTAwMCArIHRpbWVOb3cudHZfdXNlYyAvIDEwMDAsCisgICAgICAgICAgICAgICAgICAgICAgc1dpbmRvd1dpZHRoLCBzV2luZG93SGVpZ2h0KTsKKyAgICAgICAgICAgIGNoZWNrR0xFcnJvcnMoKTsKKyAgICAgICAgICAgIGVnbFN3YXBCdWZmZXJzKHNFZ2xEaXNwbGF5LCBzRWdsU3VyZmFjZSk7CisgICAgICAgICAgICBjaGVja0VHTEVycm9ycygpOworICAgICAgICB9CisgICAgfQorCisgICAgYXBwRGVpbml0KCk7CisgICAgZGVpbml0R3JhcGhpY3MoKTsKKworICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZWJkMzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAuaApAQCAtMCwwICsxLDU2IEBACisvKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLworICoKKyAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CisgKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKKyAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKKyAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KKyAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KKyAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcworICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogJElkOiBhcHAuaCx2IDEuMTQgMjAwNS8wMi8wNiAyMToxMzo1NCB0b25pYyBFeHAgJAorICogJFJldmlzaW9uOiAxLjE0ICQKKyAqLworCisjaWZuZGVmIEFQUF9IX0lOQ0xVREVECisjZGVmaW5lIEFQUF9IX0lOQ0xVREVECisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyNkZWZpbmUgV0lORE9XX0RFRkFVTFRfV0lEVEggICAgNjQwCisjZGVmaW5lIFdJTkRPV19ERUZBVUxUX0hFSUdIVCAgIDQ4MAorCisjZGVmaW5lIFdJTkRPV19CUFAgICAgICAgICAgICAgIDE2CisKKworLy8gVGhlIHNpbXBsZSBmcmFtZXdvcmsgZXhwZWN0cyB0aGUgYXBwbGljYXRpb24gY29kZSB0byBkZWZpbmUgdGhlc2UgZnVuY3Rpb25zLgorZXh0ZXJuIHZvaWQgYXBwSW5pdCgpOworZXh0ZXJuIHZvaWQgYXBwRGVpbml0KCk7CitleHRlcm4gdm9pZCBhcHBSZW5kZXIobG9uZyB0aWNrLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisvKiBWYWx1ZSBpcyBub24temVybyB3aGVuIGFwcGxpY2F0aW9uIGlzIGFsaXZlLCBhbmQgMCB3aGVuIGl0IGlzIGNsb3NpbmcuCisgKiBEZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBmcmFtZXdvcmsuCisgKi8KK2V4dGVybiBpbnQgZ0FwcEFsaXZlOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8vICFBUFBfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvY2Ftcy5oIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvY2Ftcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMWFjYjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9jYW1zLmgKQEAgLTAsMCArMSw2NSBAQAorLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgorICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCisgKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCisgKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCisgKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCisgKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCisgKgorICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKKyAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICRJZDogY2Ftcy5oLHYgMS43IDIwMDUvMDEvMzEgMjI6MTU6MTUgdG9uaWMgRXhwICQKKyAqICRSZXZpc2lvbjogMS43ICQKKyAqLworCisjaWZuZGVmIENBTVNfSF9JTkNMVURFRAorI2RlZmluZSBDQU1TX0hfSU5DTFVERUQKKworCisvKiBMZW5ndGggaW4gbWlsbGlzZWNvbmRzIG9mIG9uZSBjYW1lcmEgdHJhY2sgYmFzZSB1bml0LgorICogVGhlIHZhbHVlIG9yaWdpbmF0ZXMgZnJvbSB0aGUgbXVzaWMgc3luY2hyb25pemF0aW9uLgorICovCisjZGVmaW5lIENBTVRSQUNLX0xFTiAgICA1NDQyCisKKworLy8gQ2FtZXJhIHRyYWNrIGRlZmluaXRpb24gZm9yIG9uZSBjYW1lcmEgdHJ1Y2tpbmcgc2hvdC4KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogRml2ZSBwYXJhbWV0ZXJzIG9mIHNyY1s1XSBhbmQgZGVzdFs1XToKKyAgICAgKiBleWVYLCBleWVZLCBleWVaLCB2aWV3QW5nbGUsIHZpZXdIZWlnaHRPZmZzCisgICAgICovCisgICAgc2hvcnQgc3JjWzVdLCBkZXN0WzVdOworICAgIHVuc2lnbmVkIGNoYXIgZGlzdDsgICAgIC8vIGlmID4wLCBjYW0gcm90YXRlcyBhcm91bmQgZXllIHh5IG9uIGRpc3QgKiAwLjEKKyAgICB1bnNpZ25lZCBjaGFyIGxlbjsgICAgICAvLyBsZW5ndGggbXVsdGlwbGllcgorfSBDQU1UUkFDSzsKKworc3RhdGljIENBTVRSQUNLIHNDYW1UcmFja3NbXSA9Cit7CisgICAgeyB7IDQ1MDAsIDI3MDAsIDEwMCwgNzAsIC0zMCB9LCB7IDUwLCA1MCwgLTkwLCAtMTAwLCAwIH0sIDIwLCAxIH0sCisgICAgeyB7IC0xNDQ4LCA0Mjk0LCAyNSwgMzYzLCAwIH0sIHsgLTEzNiwgMjAyLCAxMjUsIC05OCwgMTAwIH0sIDAsIDEgfSwKKyAgICB7IHsgMTQzNywgNDkzMCwgMjAwLCAtMjc1LCAtMjAgfSwgeyAxNjg0LCAwLCAwLCA5LCAwIH0sIDAsIDEgfSwKKyAgICB7IHsgMTgwMCwgMzYwOSwgMjAwLCAwLCA2NzUgfSwgeyAwLCAwLCAwLCAzMDAsIDAgfSwgMCwgMSB9LAorICAgIHsgeyA5MjMsIDk5NiwgNTAsIDIzMzYsIC04MCB9LCB7IDAsIC0yMCwgLTUwLCAwLCAxNzAgfSwgMCwgMSB9LAorICAgIHsgeyAtMTY2MywgLTQzLCA2MDAsIDIxNzAsIDAgfSwgeyAyMCwgMCwgLTYwMCwgMCwgMTAwIH0sIDAsIDEgfSwKKyAgICB7IHsgMTA0OSwgLTE0MjAsIDE3NSwgMjExMSwgLTE3IH0sIHsgMCwgMCwgMCwgLTMzNCwgMCB9LCAwLCAyIH0sCisgICAgeyB7IDAsIDAsIDUwLCAzMDAsIDI1IH0sIHsgMCwgMCwgMCwgMzAwLCAwIH0sIDcwLCAyIH0sCisgICAgeyB7IC00NzMsIC05NTMsIDM1MDAsIC0zNTMsIC0zNTAgfSwgeyAwLCAwLCAtMjgwMCwgMCwgMCB9LCAwLCAyIH0sCisgICAgeyB7IDE5MSwgMTkzOCwgMzUsIDExMzksIC0xNyB9LCB7IDEyMDUsIC0yOTA5LCAwLCAwLCAwIH0sIDAsIDIgfSwKKyAgICB7IHsgLTE0NDksIC0yNzAwLCAxNTAsIDAsIDAgfSwgeyAwLCAyMDAwLCAwLCAwLCAwIH0sIDAsIDIgfSwKKyAgICB7IHsgNTI3MywgNDk5MiwgNjUwLCAzNzMsIC01MCB9LCB7IC00NTk4LCAtMzA3MiwgMCwgMCwgMCB9LCAwLCAyIH0sCisgICAgeyB7IDMyMjMsIC0zMjgyLCAxMDc1LCAtMzkzLCAtMjUgfSwgeyAxNjQ5LCAtMTY0OSwgMCwgMCwgMCB9LCAwLCAyIH0KK307CisjZGVmaW5lIENBTVRSQUNLX0NPVU5UIChzaXplb2YoY2FtVHJhY2tzKSAvIHNpemVvZihjYW1UcmFja3NbMF0pKQorCisKKyNlbmRpZiAvLyAhQ0FNU19IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9kZW1vLmMgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9kZW1vLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAyZjM5OAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2RlbW8uYwpAQCAtMCwwICsxLDc5MiBAQAorLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgorICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCisgKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCisgKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCisgKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCisgKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCisgKgorICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKKyAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICRJZDogZGVtby5jLHYgMS4xMCAyMDA1LzAyLzA4IDIwOjU0OjM5IHRvbmljIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMTAgJAorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKworI2luY2x1ZGUgImFwcC5oIgorI2luY2x1ZGUgInNoYXBlcy5oIgorI2luY2x1ZGUgImNhbXMuaCIKKworCisvLyBUb3RhbCBydW4gbGVuZ3RoIGlzIDIwICogY2FtZXJhIHRyYWNrIGJhc2UgdW5pdCBsZW5ndGggKHNlZSBjYW1zLmgpLgorI2RlZmluZSBSVU5fTEVOR1RIICAoMjAgKiBDQU1UUkFDS19MRU4pCisjdW5kZWYgUEkKKyNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1ODk3OTMyZgorI2RlZmluZSBSQU5ET01fVUlOVF9NQVggNjU1MzUKKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzUmFuZG9tU2VlZCA9IDA7CisKK3N0YXRpYyB2b2lkIHNlZWRSYW5kb20odW5zaWduZWQgbG9uZyBzZWVkKQoreworICAgIHNSYW5kb21TZWVkID0gc2VlZDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZG9tVUludCgpCit7CisgICAgc1JhbmRvbVNlZWQgPSBzUmFuZG9tU2VlZCAqIDB4MzQzZmQgKyAweDI2OWVjMzsKKyAgICByZXR1cm4gc1JhbmRvbVNlZWQgPj4gMTY7Cit9CisKKworLy8gQ2FwcGVkIGNvbnZlcnNpb24gZnJvbSBmbG9hdCB0byBmaXhlZC4KK3N0YXRpYyBsb25nIGZsb2F0VG9GaXhlZChmbG9hdCB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUgPCAtMzI3NjgpIHZhbHVlID0gLTMyNzY4OworICAgIGlmICh2YWx1ZSA+IDMyNzY3KSB2YWx1ZSA9IDMyNzY3OworICAgIHJldHVybiAobG9uZykodmFsdWUgKiA2NTUzNik7Cit9CisKKyNkZWZpbmUgRklYRUQodmFsdWUpIGZsb2F0VG9GaXhlZCh2YWx1ZSkKKworCisvLyBEZWZpbml0aW9uIG9mIG9uZSBHTCBvYmplY3QgaW4gdGhpcyBkZW1vLgordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qIFZlcnRleCBhcnJheSBhbmQgY29sb3IgYXJyYXkgYXJlIGVuYWJsZWQgZm9yIGFsbCBvYmplY3RzLCBzbyB0aGVpcgorICAgICAqIHBvaW50ZXJzIG11c3QgYWx3YXlzIGJlIHZhbGlkIGFuZCBub24tTlVMTC4gTm9ybWFsIGFycmF5IGlzIG5vdAorICAgICAqIHVzZWQgYnkgdGhlIGdyb3VuZCBwbGFuZSwgc28gd2hlbiBpdHMgcG9pbnRlciBpcyBOVUxMIHRoZW4gbm9ybWFsCisgICAgICogYXJyYXkgdXNhZ2UgaXMgZGlzYWJsZWQuCisgICAgICoKKyAgICAgKiBWZXJ0ZXggYXJyYXkgaXMgc3VwcG9zZWQgdG8gdXNlIEdMX0ZJWEVEIGRhdGF0eXBlIGFuZCBzdHJpZGUgMAorICAgICAqIChpLmUuIHRpZ2h0bHkgcGFja2VkIGFycmF5KS4gQ29sb3IgYXJyYXkgaXMgc3VwcG9zZWQgdG8gaGF2ZSA0CisgICAgICogY29tcG9uZW50cyBwZXIgY29sb3Igd2l0aCBHTF9VTlNJR05FRF9CWVRFIGRhdGF0eXBlIGFuZCBzdHJpZGUgMC4KKyAgICAgKiBOb3JtYWwgYXJyYXkgaXMgc3VwcG9zZWQgdG8gdXNlIEdMX0ZJWEVEIGRhdGF0eXBlIGFuZCBzdHJpZGUgMC4KKyAgICAgKi8KKyAgICBHTGZpeGVkICp2ZXJ0ZXhBcnJheTsKKyAgICBHTHVieXRlICpjb2xvckFycmF5OworICAgIEdMZml4ZWQgKm5vcm1hbEFycmF5OworICAgIEdMaW50IHZlcnRleENvbXBvbmVudHM7CisgICAgR0xzaXplaSBjb3VudDsKK30gR0xPQkpFQ1Q7CisKKworc3RhdGljIGxvbmcgc1N0YXJ0VGljayA9IDA7CitzdGF0aWMgbG9uZyBzVGljayA9IDA7CisKK3N0YXRpYyBpbnQgc0N1cnJlbnRDYW1UcmFjayA9IDA7CitzdGF0aWMgbG9uZyBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrID0gMDsKK3N0YXRpYyBsb25nIHNOZXh0Q2FtVHJhY2tTdGFydFRpY2sgPSAweDdmZmZmZmZmOworCitzdGF0aWMgR0xPQkpFQ1QgKnNTdXBlclNoYXBlT2JqZWN0c1tTVVBFUlNIQVBFX0NPVU5UXSA9IHsgTlVMTCB9Oworc3RhdGljIEdMT0JKRUNUICpzR3JvdW5kUGxhbmUgPSBOVUxMOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBmbG9hdCB4LCB5LCB6OworfSBWRUNUT1IzOworCisKK3N0YXRpYyB2b2lkIGZyZWVHTE9iamVjdChHTE9CSkVDVCAqb2JqZWN0KQoreworICAgIGlmIChvYmplY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGZyZWUob2JqZWN0LT5ub3JtYWxBcnJheSk7CisgICAgZnJlZShvYmplY3QtPmNvbG9yQXJyYXkpOworICAgIGZyZWUob2JqZWN0LT52ZXJ0ZXhBcnJheSk7CisgICAgZnJlZShvYmplY3QpOworfQorCisKK3N0YXRpYyBHTE9CSkVDVCAqIG5ld0dMT2JqZWN0KGxvbmcgdmVydGljZXMsIGludCB2ZXJ0ZXhDb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZU5vcm1hbEFycmF5KQoreworICAgIEdMT0JKRUNUICpyZXN1bHQ7CisgICAgcmVzdWx0ID0gKEdMT0JKRUNUICopbWFsbG9jKHNpemVvZihHTE9CSkVDVCkpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0LT5jb3VudCA9IHZlcnRpY2VzOworICAgIHJlc3VsdC0+dmVydGV4Q29tcG9uZW50cyA9IHZlcnRleENvbXBvbmVudHM7CisgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheSA9IChHTGZpeGVkICopbWFsbG9jKHZlcnRpY2VzICogdmVydGV4Q29tcG9uZW50cyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihHTGZpeGVkKSk7CisgICAgcmVzdWx0LT5jb2xvckFycmF5ID0gKEdMdWJ5dGUgKiltYWxsb2ModmVydGljZXMgKiA0ICogc2l6ZW9mKEdMdWJ5dGUpKTsKKyAgICBpZiAodXNlTm9ybWFsQXJyYXkpCisgICAgeworICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5ID0gKEdMZml4ZWQgKiltYWxsb2ModmVydGljZXMgKiAzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihHTGZpeGVkKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmVzdWx0LT5ub3JtYWxBcnJheSA9IE5VTEw7CisgICAgaWYgKHJlc3VsdC0+dmVydGV4QXJyYXkgPT0gTlVMTCB8fAorICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXkgPT0gTlVMTCB8fAorICAgICAgICAodXNlTm9ybWFsQXJyYXkgJiYgcmVzdWx0LT5ub3JtYWxBcnJheSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGZyZWVHTE9iamVjdChyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgdm9pZCBkcmF3R0xPYmplY3QoR0xPQkpFQ1QgKm9iamVjdCkKK3sKKyAgICBhc3NlcnQob2JqZWN0ICE9IE5VTEwpOworCisgICAgZ2xWZXJ0ZXhQb2ludGVyKG9iamVjdC0+dmVydGV4Q29tcG9uZW50cywgR0xfRklYRUQsCisgICAgICAgICAgICAgICAgICAgIDAsIG9iamVjdC0+dmVydGV4QXJyYXkpOworICAgIGdsQ29sb3JQb2ludGVyKDQsIEdMX1VOU0lHTkVEX0JZVEUsIDAsIG9iamVjdC0+Y29sb3JBcnJheSk7CisKKyAgICAvLyBBbHJlYWR5IGRvbmUgaW4gaW5pdGlhbGl6YXRpb246CisgICAgLy9nbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7CisgICAgLy9nbEVuYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKKworICAgIGlmIChvYmplY3QtPm5vcm1hbEFycmF5KQorICAgIHsKKyAgICAgICAgZ2xOb3JtYWxQb2ludGVyKEdMX0ZJWEVELCAwLCBvYmplY3QtPm5vcm1hbEFycmF5KTsKKyAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7CisgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFUywgMCwgb2JqZWN0LT5jb3VudCk7Cit9CisKKworc3RhdGljIHZvaWQgdmVjdG9yM1N1YihWRUNUT1IzICpkZXN0LCBWRUNUT1IzICp2MSwgVkVDVE9SMyAqdjIpCit7CisgICAgZGVzdC0+eCA9IHYxLT54IC0gdjItPng7CisgICAgZGVzdC0+eSA9IHYxLT55IC0gdjItPnk7CisgICAgZGVzdC0+eiA9IHYxLT56IC0gdjItPno7Cit9CisKKworc3RhdGljIHZvaWQgc3VwZXJTaGFwZU1hcChWRUNUT1IzICpwb2ludCwgZmxvYXQgcjEsIGZsb2F0IHIyLCBmbG9hdCB0LCBmbG9hdCBwKQoreworICAgIC8vIHNwaGVyZS1tYXBwaW5nIG9mIHN1cGVyc2hhcGUgcGFyYW1ldGVycworICAgIHBvaW50LT54ID0gKGZsb2F0KShjb3ModCkgKiBjb3MocCkgLyByMSAvIHIyKTsKKyAgICBwb2ludC0+eSA9IChmbG9hdCkoc2luKHQpICogY29zKHApIC8gcjEgLyByMik7CisgICAgcG9pbnQtPnogPSAoZmxvYXQpKHNpbihwKSAvIHIyKTsKK30KKworCitzdGF0aWMgZmxvYXQgc3NGdW5jKGNvbnN0IGZsb2F0IHQsIGNvbnN0IGZsb2F0ICpwKQoreworICAgIHJldHVybiAoZmxvYXQpKHBvdyhwb3coZmFicyhjb3MocFswXSAqIHQgLyA0KSkgLyBwWzFdLCBwWzRdKSArCisgICAgICAgICAgICAgICAgICAgICAgIHBvdyhmYWJzKHNpbihwWzBdICogdCAvIDQpKSAvIHBbMl0sIHBbNV0pLCAxIC8gcFszXSkpOworfQorCisKKy8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBzdXBlcnNoYXBlIG9iamVjdC4KKy8vIEJhc2VkIG9uIFBhdWwgQm91cmtlJ3MgUE9WLVJheSBpbXBsZW1lbnRhdGlvbi4KKy8vIGh0dHA6Ly9hc3Ryb25vbXkuc3dpbi5lZHUuYXUvfnBib3Vya2UvcG92cmF5L3N1cGVyc2hhcGUvCitzdGF0aWMgR0xPQkpFQ1QgKiBjcmVhdGVTdXBlclNoYXBlKGNvbnN0IGZsb2F0ICpwYXJhbXMpCit7CisgICAgY29uc3QgaW50IHJlc29sMSA9IChpbnQpcGFyYW1zW1NVUEVSU0hBUEVfUEFSQU1TIC0gM107CisgICAgY29uc3QgaW50IHJlc29sMiA9IChpbnQpcGFyYW1zW1NVUEVSU0hBUEVfUEFSQU1TIC0gMl07CisgICAgLy8gbGF0aXR1ZGUgMCB0byBwaS8yIGZvciBubyBtaXJyb3JlZCBib3R0b20KKyAgICAvLyAobGF0aXR1ZGVCZWdpbj09MCBmb3IgLXBpLzIgdG8gcGkvMiBvcmlnaW5hbGx5KQorICAgIGNvbnN0IGludCBsYXRpdHVkZUJlZ2luID0gcmVzb2wyIC8gNDsKKyAgICBjb25zdCBpbnQgbGF0aXR1ZGVFbmQgPSByZXNvbDIgLyAyOyAgICAvLyBub24taW5jbHVzaXZlCisgICAgY29uc3QgaW50IGxvbmdpdHVkZUNvdW50ID0gcmVzb2wxOworICAgIGNvbnN0IGludCBsYXRpdHVkZUNvdW50ID0gbGF0aXR1ZGVFbmQgLSBsYXRpdHVkZUJlZ2luOworICAgIGNvbnN0IGxvbmcgdHJpYW5nbGVDb3VudCA9IGxvbmdpdHVkZUNvdW50ICogbGF0aXR1ZGVDb3VudCAqIDI7CisgICAgY29uc3QgbG9uZyB2ZXJ0aWNlcyA9IHRyaWFuZ2xlQ291bnQgKiAzOworICAgIEdMT0JKRUNUICpyZXN1bHQ7CisgICAgZmxvYXQgYmFzZUNvbG9yWzNdOworICAgIGludCBhLCBsb25naXR1ZGUsIGxhdGl0dWRlOworICAgIGxvbmcgY3VycmVudFZlcnRleCwgY3VycmVudFF1YWQ7CisKKyAgICByZXN1bHQgPSBuZXdHTE9iamVjdCh2ZXJ0aWNlcywgMywgMSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGZvciAoYSA9IDA7IGEgPCAzOyArK2EpCisgICAgICAgIGJhc2VDb2xvclthXSA9ICgocmFuZG9tVUludCgpICUgMTU1KSArIDEwMCkgLyAyNTUuZjsKKworICAgIGN1cnJlbnRRdWFkID0gMDsKKyAgICBjdXJyZW50VmVydGV4ID0gMDsKKworICAgIC8vIGxvbmdpdHVkZSAtcGkgdG8gcGkKKyAgICBmb3IgKGxvbmdpdHVkZSA9IDA7IGxvbmdpdHVkZSA8IGxvbmdpdHVkZUNvdW50OyArK2xvbmdpdHVkZSkKKyAgICB7CisKKyAgICAgICAgLy8gbGF0aXR1ZGUgMCB0byBwaS8yCisgICAgICAgIGZvciAobGF0aXR1ZGUgPSBsYXRpdHVkZUJlZ2luOyBsYXRpdHVkZSA8IGxhdGl0dWRlRW5kOyArK2xhdGl0dWRlKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCB0MSA9IC1QSSArIGxvbmdpdHVkZSAqIDIgKiBQSSAvIHJlc29sMTsKKyAgICAgICAgICAgIGZsb2F0IHQyID0gLVBJICsgKGxvbmdpdHVkZSArIDEpICogMiAqIFBJIC8gcmVzb2wxOworICAgICAgICAgICAgZmxvYXQgcDEgPSAtUEkgLyAyICsgbGF0aXR1ZGUgKiAyICogUEkgLyByZXNvbDI7CisgICAgICAgICAgICBmbG9hdCBwMiA9IC1QSSAvIDIgKyAobGF0aXR1ZGUgKyAxKSAqIDIgKiBQSSAvIHJlc29sMjsKKyAgICAgICAgICAgIGZsb2F0IHIwLCByMSwgcjIsIHIzOworCisgICAgICAgICAgICByMCA9IHNzRnVuYyh0MSwgcGFyYW1zKTsKKyAgICAgICAgICAgIHIxID0gc3NGdW5jKHAxLCAmcGFyYW1zWzZdKTsKKyAgICAgICAgICAgIHIyID0gc3NGdW5jKHQyLCBwYXJhbXMpOworICAgICAgICAgICAgcjMgPSBzc0Z1bmMocDIsICZwYXJhbXNbNl0pOworCisgICAgICAgICAgICBpZiAocjAgIT0gMCAmJiByMSAhPSAwICYmIHIyICE9IDAgJiYgcjMgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWRUNUT1IzIHBhLCBwYiwgcGMsIHBkOworICAgICAgICAgICAgICAgIFZFQ1RPUjMgdjEsIHYyLCBuOworICAgICAgICAgICAgICAgIGZsb2F0IGNhOworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIC8vZmxvYXQgbGVuU3EsIGludkxlblNxOworCisgICAgICAgICAgICAgICAgc3VwZXJTaGFwZU1hcCgmcGEsIHIwLCByMSwgdDEsIHAxKTsKKyAgICAgICAgICAgICAgICBzdXBlclNoYXBlTWFwKCZwYiwgcjIsIHIxLCB0MiwgcDEpOworICAgICAgICAgICAgICAgIHN1cGVyU2hhcGVNYXAoJnBjLCByMiwgcjMsIHQyLCBwMik7CisgICAgICAgICAgICAgICAgc3VwZXJTaGFwZU1hcCgmcGQsIHIwLCByMywgdDEsIHAyKTsKKworICAgICAgICAgICAgICAgIC8vIGtsdWRnZSB0byBzZXQgbG93ZXIgZWRnZSBvZiB0aGUgb2JqZWN0IHRvIGZpeGVkIGxldmVsCisgICAgICAgICAgICAgICAgaWYgKGxhdGl0dWRlID09IGxhdGl0dWRlQmVnaW4gKyAxKQorICAgICAgICAgICAgICAgICAgICBwYS56ID0gcGIueiA9IDA7CisKKyAgICAgICAgICAgICAgICB2ZWN0b3IzU3ViKCZ2MSwgJnBiLCAmcGEpOworICAgICAgICAgICAgICAgIHZlY3RvcjNTdWIoJnYyLCAmcGQsICZwYSk7CisKKyAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgbm9ybWFsIHdpdGggY3Jvc3MgcHJvZHVjdC4KKyAgICAgICAgICAgICAgICAvKiAgIGkgICAgaiAgICBrICAgICAgaSAgICBqCisgICAgICAgICAgICAgICAgICogdjEueCB2MS55IHYxLnogfCB2MS54IHYxLnkKKyAgICAgICAgICAgICAgICAgKiB2Mi54IHYyLnkgdjIueiB8IHYyLnggdjIueQorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgbi54ID0gdjEueSAqIHYyLnogLSB2MS56ICogdjIueTsKKyAgICAgICAgICAgICAgICBuLnkgPSB2MS56ICogdjIueCAtIHYxLnggKiB2Mi56OworICAgICAgICAgICAgICAgIG4ueiA9IHYxLnggKiB2Mi55IC0gdjEueSAqIHYyLng7CisKKyAgICAgICAgICAgICAgICAvKiBQcmUtbm9ybWFsaXphdGlvbiBvZiB0aGUgbm9ybWFscyBpcyBkaXNhYmxlZCBoZXJlIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgKiB0aGV5IHdpbGwgYmUgbm9ybWFsaXplZCBhbnl3YXkgbGF0ZXIgZHVlIHRvIGF1dG9tYXRpYworICAgICAgICAgICAgICAgICAqIG5vcm1hbGl6YXRpb24gKEdMX05PUk1BTElaRSkuIEl0IGlzIGVuYWJsZWQgYmVjYXVzZSB0aGUKKyAgICAgICAgICAgICAgICAgKiBvYmplY3RzIGFyZSBzY2FsZWQgd2l0aCBnbFNjYWxlLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgbGVuU3EgPSBuLnggKiBuLnggKyBuLnkgKiBuLnkgKyBuLnogKiBuLno7CisgICAgICAgICAgICAgICAgaW52TGVuU3EgPSAoZmxvYXQpKDEgLyBzcXJ0KGxlblNxKSk7CisgICAgICAgICAgICAgICAgbi54ICo9IGludkxlblNxOworICAgICAgICAgICAgICAgIG4ueSAqPSBpbnZMZW5TcTsKKyAgICAgICAgICAgICAgICBuLnogKj0gaW52TGVuU3E7CisgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIGNhID0gcGEueiArIDAuNWY7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBjdXJyZW50VmVydGV4ICogMzsKKyAgICAgICAgICAgICAgICAgICAgIGkgPCAoY3VycmVudFZlcnRleCArIDYpICogMzsKKyAgICAgICAgICAgICAgICAgICAgIGkgKz0gMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+bm9ybWFsQXJyYXlbaV0gPSBGSVhFRChuLngpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5W2kgKyAxXSA9IEZJWEVEKG4ueSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+bm9ybWFsQXJyYXlbaSArIDJdID0gRklYRUQobi56KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpID0gY3VycmVudFZlcnRleCAqIDQ7CisgICAgICAgICAgICAgICAgICAgICBpIDwgKGN1cnJlbnRWZXJ0ZXggKyA2KSAqIDQ7CisgICAgICAgICAgICAgICAgICAgICBpICs9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYSwgY29sb3JbM107CisgICAgICAgICAgICAgICAgICAgIGZvciAoYSA9IDA7IGEgPCAzOyArK2EpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yW2FdID0gKGludCkoY2EgKiBiYXNlQ29sb3JbYV0gKiAyNTUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yW2FdID4gMjU1KSBjb2xvclthXSA9IDI1NTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaV0gPSAoR0x1Ynl0ZSljb2xvclswXTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAxXSA9IChHTHVieXRlKWNvbG9yWzFdOworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDJdID0gKEdMdWJ5dGUpY29sb3JbMl07CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgM10gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBhLngpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBhLnkpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBhLnopOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBiLngpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBiLnkpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBiLnopOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBkLngpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBkLnkpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBkLnopOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBiLngpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBiLnkpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBiLnopOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBjLngpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBjLnkpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBjLnopOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBkLngpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBkLnkpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBkLnopOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgIH0gLy8gcjAgJiYgcjEgJiYgcjIgJiYgcjMKKyAgICAgICAgICAgICsrY3VycmVudFF1YWQ7CisgICAgICAgIH0gLy8gbGF0aXR1ZGUKKyAgICB9IC8vIGxvbmdpdHVkZQorCisgICAgLy8gU2V0IG51bWJlciBvZiB2ZXJ0aWNlcyBpbiBvYmplY3QgdG8gdGhlIGFjdHVhbCBhbW91bnQgY3JlYXRlZC4KKyAgICByZXN1bHQtPmNvdW50ID0gY3VycmVudFZlcnRleDsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIEdMT0JKRUNUICogY3JlYXRlR3JvdW5kUGxhbmUoKQoreworICAgIGNvbnN0IGludCBzY2FsZSA9IDQ7CisgICAgY29uc3QgaW50IHlCZWdpbiA9IC0xNSwgeUVuZCA9IDE1OyAgICAvLyBlbmRzIGFyZSBub24taW5jbHVzaXZlCisgICAgY29uc3QgaW50IHhCZWdpbiA9IC0xNSwgeEVuZCA9IDE1OworICAgIGNvbnN0IGxvbmcgdHJpYW5nbGVDb3VudCA9ICh5RW5kIC0geUJlZ2luKSAqICh4RW5kIC0geEJlZ2luKSAqIDI7CisgICAgY29uc3QgbG9uZyB2ZXJ0aWNlcyA9IHRyaWFuZ2xlQ291bnQgKiAzOworICAgIEdMT0JKRUNUICpyZXN1bHQ7CisgICAgaW50IHgsIHk7CisgICAgbG9uZyBjdXJyZW50VmVydGV4LCBjdXJyZW50UXVhZDsKKworICAgIHJlc3VsdCA9IG5ld0dMT2JqZWN0KHZlcnRpY2VzLCAyLCAwKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgY3VycmVudFF1YWQgPSAwOworICAgIGN1cnJlbnRWZXJ0ZXggPSAwOworCisgICAgZm9yICh5ID0geUJlZ2luOyB5IDwgeUVuZDsgKyt5KQorICAgIHsKKyAgICAgICAgZm9yICh4ID0geEJlZ2luOyB4IDwgeEVuZDsgKyt4KQorICAgICAgICB7CisgICAgICAgICAgICBHTHVieXRlIGNvbG9yOworICAgICAgICAgICAgaW50IGksIGE7CisgICAgICAgICAgICBjb2xvciA9IChHTHVieXRlKSgocmFuZG9tVUludCgpICYgMHg1ZikgKyA4MSk7ICAvLyAxMDEgMTExMQorICAgICAgICAgICAgZm9yIChpID0gY3VycmVudFZlcnRleCAqIDQ7IGkgPCAoY3VycmVudFZlcnRleCArIDYpICogNDsgaSArPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpXSA9IGNvbG9yOworICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgMV0gPSBjb2xvcjsKKyAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDJdID0gY29sb3I7CisgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAzXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEF4aXMgYml0cyBmb3IgcXVhZCB0cmlhbmdsZXM6CisgICAgICAgICAgICAvLyB4OiAwMTExMDAgKDB4MWMpLCB5OiAxMTAwMDEgKDB4MzEpICAoY2xvY2t3aXNlKQorICAgICAgICAgICAgLy8geDogMDAxMTEwICgweDBlKSwgeTogMTAwMDExICgweDIzKSAgKGNvdW50ZXItY2xvY2t3aXNlKQorICAgICAgICAgICAgZm9yIChhID0gMDsgYSA8IDY7ICsrYSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgeG0gPSB4ICsgKCgweDFjID4+IGEpICYgMSk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHltID0geSArICgoMHgzMSA+PiBhKSAmIDEpOworICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IG0gPSAoZmxvYXQpKGNvcyh4bSAqIDIpICogc2luKHltICogNCkgKiAwLjc1Zik7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMl0gPQorICAgICAgICAgICAgICAgICAgICBGSVhFRCh4bSAqIHNjYWxlICsgbSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMiArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgRklYRUQoeW0gKiBzY2FsZSArIG0pOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrY3VycmVudFF1YWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgdm9pZCBkcmF3R3JvdW5kUGxhbmUoKQoreworICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgZ2xCbGVuZEZ1bmMoR0xfWkVSTywgR0xfU1JDX0NPTE9SKTsKKyAgICBnbERpc2FibGUoR0xfTElHSFRJTkcpOworCisgICAgZHJhd0dMT2JqZWN0KHNHcm91bmRQbGFuZSk7CisKKyAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7CisgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKKyAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKK30KKworCitzdGF0aWMgdm9pZCBkcmF3RmFkZVF1YWQoKQoreworICAgIHN0YXRpYyBjb25zdCBHTGZpeGVkIHF1YWRWZXJ0aWNlc1tdID0geworICAgICAgICAtMHgxMDAwMCwgLTB4MTAwMDAsCisgICAgICAgICAweDEwMDAwLCAtMHgxMDAwMCwKKyAgICAgICAgLTB4MTAwMDAsICAweDEwMDAwLAorICAgICAgICAgMHgxMDAwMCwgLTB4MTAwMDAsCisgICAgICAgICAweDEwMDAwLCAgMHgxMDAwMCwKKyAgICAgICAgLTB4MTAwMDAsICAweDEwMDAwCisgICAgfTsKKworICAgIGNvbnN0IGludCBiZWdpbkZhZGUgPSBzVGljayAtIHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2s7CisgICAgY29uc3QgaW50IGVuZEZhZGUgPSBzTmV4dENhbVRyYWNrU3RhcnRUaWNrIC0gc1RpY2s7CisgICAgY29uc3QgaW50IG1pbkZhZGUgPSBiZWdpbkZhZGUgPCBlbmRGYWRlID8gYmVnaW5GYWRlIDogZW5kRmFkZTsKKworICAgIGlmIChtaW5GYWRlIDwgMTAyNCkKKyAgICB7CisgICAgICAgIGNvbnN0IEdMZml4ZWQgZmFkZUNvbG9yID0gbWluRmFkZSA8PCA2OworICAgICAgICBnbENvbG9yNHgoZmFkZUNvbG9yLCBmYWRlQ29sb3IsIGZhZGVDb2xvciwgMCk7CisKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOworICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKEdMX1pFUk8sIEdMX1NSQ19DT0xPUik7CisgICAgICAgIGdsRGlzYWJsZShHTF9MSUdIVElORyk7CisKKyAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisgICAgICAgIGdsTG9hZElkZW50aXR5KCk7CisKKyAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOworICAgICAgICBnbExvYWRJZGVudGl0eSgpOworCisgICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKKyAgICAgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKKyAgICAgICAgZ2xWZXJ0ZXhQb2ludGVyKDIsIEdMX0ZJWEVELCAwLCBxdWFkVmVydGljZXMpOworICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCA2KTsKKworICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKKworICAgICAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKKworICAgICAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7CisgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOworICAgIH0KK30KKworCisvLyBDYWxsZWQgZnJvbSB0aGUgYXBwIGZyYW1ld29yay4KK3ZvaWQgYXBwSW5pdCgpCit7CisgICAgaW50IGE7CisKKyAgICBnbEVuYWJsZShHTF9OT1JNQUxJWkUpOworICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOworICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgIGdsU2hhZGVNb2RlbChHTF9GTEFUKTsKKworICAgIGdsRW5hYmxlKEdMX0xJR0hUSU5HKTsKKyAgICBnbEVuYWJsZShHTF9MSUdIVDApOworICAgIGdsRW5hYmxlKEdMX0xJR0hUMSk7CisgICAgZ2xFbmFibGUoR0xfTElHSFQyKTsKKworICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKKyAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKKworICAgIHNlZWRSYW5kb20oMTUpOworCisgICAgZm9yIChhID0gMDsgYSA8IFNVUEVSU0hBUEVfQ09VTlQ7ICsrYSkKKyAgICB7CisgICAgICAgIHNTdXBlclNoYXBlT2JqZWN0c1thXSA9IGNyZWF0ZVN1cGVyU2hhcGUoc1N1cGVyU2hhcGVQYXJhbXNbYV0pOworICAgICAgICBhc3NlcnQoc1N1cGVyU2hhcGVPYmplY3RzW2FdICE9IE5VTEwpOworICAgIH0KKyAgICBzR3JvdW5kUGxhbmUgPSBjcmVhdGVHcm91bmRQbGFuZSgpOworICAgIGFzc2VydChzR3JvdW5kUGxhbmUgIT0gTlVMTCk7Cit9CisKKworLy8gQ2FsbGVkIGZyb20gdGhlIGFwcCBmcmFtZXdvcmsuCit2b2lkIGFwcERlaW5pdCgpCit7CisgICAgaW50IGE7CisgICAgZm9yIChhID0gMDsgYSA8IFNVUEVSU0hBUEVfQ09VTlQ7ICsrYSkKKyAgICAgICAgZnJlZUdMT2JqZWN0KHNTdXBlclNoYXBlT2JqZWN0c1thXSk7CisgICAgZnJlZUdMT2JqZWN0KHNHcm91bmRQbGFuZSk7Cit9CisKKworc3RhdGljIHZvaWQgZ2x1UGVyc3BlY3RpdmUoR0xmbG9hdCBmb3Z5LCBHTGZsb2F0IGFzcGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikKK3sKKyAgICBHTGZsb2F0IHhtaW4sIHhtYXgsIHltaW4sIHltYXg7CisKKyAgICB5bWF4ID0gek5lYXIgKiAoR0xmbG9hdCl0YW4oZm92eSAqIFBJIC8gMzYwKTsKKyAgICB5bWluID0gLXltYXg7CisgICAgeG1pbiA9IHltaW4gKiBhc3BlY3Q7CisgICAgeG1heCA9IHltYXggKiBhc3BlY3Q7CisKKyAgICBnbEZydXN0dW14KChHTGZpeGVkKSh4bWluICogNjU1MzYpLCAoR0xmaXhlZCkoeG1heCAqIDY1NTM2KSwKKyAgICAgICAgICAgICAgIChHTGZpeGVkKSh5bWluICogNjU1MzYpLCAoR0xmaXhlZCkoeW1heCAqIDY1NTM2KSwKKyAgICAgICAgICAgICAgIChHTGZpeGVkKSh6TmVhciAqIDY1NTM2KSwgKEdMZml4ZWQpKHpGYXIgKiA2NTUzNikpOworfQorCisKK3N0YXRpYyB2b2lkIHByZXBhcmVGcmFtZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIGdsQ2xlYXJDb2xvcngoKEdMZml4ZWQpKDAuMWYgKiA2NTUzNiksCisgICAgICAgICAgICAgICAgICAoR0xmaXhlZCkoMC4yZiAqIDY1NTM2KSwKKyAgICAgICAgICAgICAgICAgIChHTGZpeGVkKSgwLjNmICogNjU1MzYpLCAweDEwMDAwKTsKKyAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKyAgICBnbExvYWRJZGVudGl0eSgpOworICAgIGdsdVBlcnNwZWN0aXZlKDQ1LCAoZmxvYXQpd2lkdGggLyBoZWlnaHQsIDAuNWYsIDE1MCk7CisKKyAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKKworICAgIGdsTG9hZElkZW50aXR5KCk7Cit9CisKKworc3RhdGljIHZvaWQgY29uZmlndXJlTGlnaHRBbmRNYXRlcmlhbCgpCit7CisgICAgc3RhdGljIEdMZml4ZWQgbGlnaHQwUG9zaXRpb25bXSA9IHsgLTB4NDAwMDAsIDB4MTAwMDAsIDB4MTAwMDAsIDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDBEaWZmdXNlW10gPSB7IDB4MTAwMDAsIDB4NjY2NiwgMCwgMHgxMDAwMCB9OworICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MVBvc2l0aW9uW10gPSB7IDB4MTAwMDAsIC0weDIwMDAwLCAtMHgxMDAwMCwgMCB9OworICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MURpZmZ1c2VbXSA9IHsgMHgxMWViLCAweDIzZDcsIDB4NTk5OSwgMHgxMDAwMCB9OworICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MlBvc2l0aW9uW10gPSB7IC0weDEwMDAwLCAwLCAtMHg0MDAwMCwgMCB9OworICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MkRpZmZ1c2VbXSA9IHsgMHgxMWViLCAweDJiODUsIDB4MjNkNywgMHgxMDAwMCB9OworICAgIHN0YXRpYyBHTGZpeGVkIG1hdGVyaWFsU3BlY3VsYXJbXSA9IHsgMHgxMDAwMCwgMHgxMDAwMCwgMHgxMDAwMCwgMHgxMDAwMCB9OworCisgICAgZ2xMaWdodHh2KEdMX0xJR0hUMCwgR0xfUE9TSVRJT04sIGxpZ2h0MFBvc2l0aW9uKTsKKyAgICBnbExpZ2h0eHYoR0xfTElHSFQwLCBHTF9ESUZGVVNFLCBsaWdodDBEaWZmdXNlKTsKKyAgICBnbExpZ2h0eHYoR0xfTElHSFQxLCBHTF9QT1NJVElPTiwgbGlnaHQxUG9zaXRpb24pOworICAgIGdsTGlnaHR4dihHTF9MSUdIVDEsIEdMX0RJRkZVU0UsIGxpZ2h0MURpZmZ1c2UpOworICAgIGdsTGlnaHR4dihHTF9MSUdIVDIsIEdMX1BPU0lUSU9OLCBsaWdodDJQb3NpdGlvbik7CisgICAgZ2xMaWdodHh2KEdMX0xJR0hUMiwgR0xfRElGRlVTRSwgbGlnaHQyRGlmZnVzZSk7CisgICAgZ2xNYXRlcmlhbHh2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TUEVDVUxBUiwgbWF0ZXJpYWxTcGVjdWxhcik7CisKKyAgICBnbE1hdGVyaWFseChHTF9GUk9OVF9BTkRfQkFDSywgR0xfU0hJTklORVNTLCA2MCA8PCAxNik7CisgICAgZ2xFbmFibGUoR0xfQ09MT1JfTUFURVJJQUwpOworfQorCisKK3N0YXRpYyB2b2lkIGRyYXdNb2RlbHMoZmxvYXQgelNjYWxlKQoreworICAgIGNvbnN0IGludCB0cmFuc2xhdGlvblNjYWxlID0gOTsKKyAgICBpbnQgeCwgeTsKKworICAgIHNlZWRSYW5kb20oOSk7CisKKyAgICBnbFNjYWxleCgxIDw8IDE2LCAxIDw8IDE2LCAoR0xmaXhlZCkoelNjYWxlICogNjU1MzYpKTsKKworICAgIGZvciAoeSA9IC01OyB5IDw9IDU7ICsreSkKKyAgICB7CisgICAgICAgIGZvciAoeCA9IC01OyB4IDw9IDU7ICsreCkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgYnVpbGRpbmdTY2FsZTsKKyAgICAgICAgICAgIEdMZml4ZWQgZml4ZWRTY2FsZTsKKworICAgICAgICAgICAgaW50IGN1clNoYXBlID0gcmFuZG9tVUludCgpICUgU1VQRVJTSEFQRV9DT1VOVDsKKyAgICAgICAgICAgIGJ1aWxkaW5nU2NhbGUgPSBzU3VwZXJTaGFwZVBhcmFtc1tjdXJTaGFwZV1bU1VQRVJTSEFQRV9QQVJBTVMgLSAxXTsKKyAgICAgICAgICAgIGZpeGVkU2NhbGUgPSAoR0xmaXhlZCkoYnVpbGRpbmdTY2FsZSAqIDY1NTM2KTsKKworICAgICAgICAgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgICAgICAgICBnbFRyYW5zbGF0ZXgoKHggKiB0cmFuc2xhdGlvblNjYWxlKSAqIDY1NTM2LAorICAgICAgICAgICAgICAgICAgICAgICAgICh5ICogdHJhbnNsYXRpb25TY2FsZSkgKiA2NTUzNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIGdsUm90YXRleCgoR0xmaXhlZCkoKHJhbmRvbVVJbnQoKSAlIDM2MCkgPDwgMTYpLCAwLCAwLCAxIDw8IDE2KTsKKyAgICAgICAgICAgIGdsU2NhbGV4KGZpeGVkU2NhbGUsIGZpeGVkU2NhbGUsIGZpeGVkU2NhbGUpOworCisgICAgICAgICAgICBkcmF3R0xPYmplY3Qoc1N1cGVyU2hhcGVPYmplY3RzW2N1clNoYXBlXSk7CisgICAgICAgICAgICBnbFBvcE1hdHJpeCgpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICh4ID0gLTI7IHggPD0gMjsgKyt4KQorICAgIHsKKyAgICAgICAgY29uc3QgaW50IHNoaXBTY2FsZTEwMCA9IHRyYW5zbGF0aW9uU2NhbGUgKiA1MDA7CisgICAgICAgIGNvbnN0IGludCBvZmZzMTAwID0geCAqIHNoaXBTY2FsZTEwMCArIChzVGljayAlIHNoaXBTY2FsZTEwMCk7CisgICAgICAgIGZsb2F0IG9mZnMgPSBvZmZzMTAwICogMC4wMWY7CisgICAgICAgIEdMZml4ZWQgZml4ZWRPZmZzID0gKEdMZml4ZWQpKG9mZnMgKiA2NTUzNik7CisgICAgICAgIGdsUHVzaE1hdHJpeCgpOworICAgICAgICBnbFRyYW5zbGF0ZXgoZml4ZWRPZmZzLCAtNCAqIDY1NTM2LCAyIDw8IDE2KTsKKyAgICAgICAgZHJhd0dMT2JqZWN0KHNTdXBlclNoYXBlT2JqZWN0c1tTVVBFUlNIQVBFX0NPVU5UIC0gMV0pOworICAgICAgICBnbFBvcE1hdHJpeCgpOworICAgICAgICBnbFB1c2hNYXRyaXgoKTsKKyAgICAgICAgZ2xUcmFuc2xhdGV4KC00ICogNjU1MzYsIGZpeGVkT2ZmcywgNCA8PCAxNik7CisgICAgICAgIGdsUm90YXRleCg5MCA8PCAxNiwgMCwgMCwgMSA8PCAxNik7CisgICAgICAgIGRyYXdHTE9iamVjdChzU3VwZXJTaGFwZU9iamVjdHNbU1VQRVJTSEFQRV9DT1VOVCAtIDFdKTsKKyAgICAgICAgZ2xQb3BNYXRyaXgoKTsKKyAgICB9Cit9CisKKworLyogRm9sbG93aW5nIGdsdUxvb2tBdCBpbXBsZW1lbnRhdGlvbiBpcyBhZGFwdGVkIGZyb20gdGhlCisgKiBNZXNhIDNEIEdyYXBoaWNzIGxpYnJhcnkuIGh0dHA6Ly93d3cubWVzYTNkLm9yZworICovCitzdGF0aWMgdm9pZCBnbHVMb29rQXQoR0xmbG9hdCBleWV4LCBHTGZsb2F0IGV5ZXksIEdMZmxvYXQgZXlleiwKKwkgICAgICAgICAgICAgIEdMZmxvYXQgY2VudGVyeCwgR0xmbG9hdCBjZW50ZXJ5LCBHTGZsb2F0IGNlbnRlcnosCisJICAgICAgICAgICAgICBHTGZsb2F0IHVweCwgR0xmbG9hdCB1cHksIEdMZmxvYXQgdXB6KQoreworICAgIEdMZmxvYXQgbVsxNl07CisgICAgR0xmbG9hdCB4WzNdLCB5WzNdLCB6WzNdOworICAgIEdMZmxvYXQgbWFnOworCisgICAgLyogTWFrZSByb3RhdGlvbiBtYXRyaXggKi8KKworICAgIC8qIFogdmVjdG9yICovCisgICAgelswXSA9IGV5ZXggLSBjZW50ZXJ4OworICAgIHpbMV0gPSBleWV5IC0gY2VudGVyeTsKKyAgICB6WzJdID0gZXlleiAtIGNlbnRlcno7CisgICAgbWFnID0gKGZsb2F0KXNxcnQoelswXSAqIHpbMF0gKyB6WzFdICogelsxXSArIHpbMl0gKiB6WzJdKTsKKyAgICBpZiAobWFnKSB7CQkJLyogbXBpY2hsZXIsIDE5OTUwNTE1ICovCisgICAgICAgIHpbMF0gLz0gbWFnOworICAgICAgICB6WzFdIC89IG1hZzsKKyAgICAgICAgelsyXSAvPSBtYWc7CisgICAgfQorCisgICAgLyogWSB2ZWN0b3IgKi8KKyAgICB5WzBdID0gdXB4OworICAgIHlbMV0gPSB1cHk7CisgICAgeVsyXSA9IHVwejsKKworICAgIC8qIFggdmVjdG9yID0gWSBjcm9zcyBaICovCisgICAgeFswXSA9IHlbMV0gKiB6WzJdIC0geVsyXSAqIHpbMV07CisgICAgeFsxXSA9IC15WzBdICogelsyXSArIHlbMl0gKiB6WzBdOworICAgIHhbMl0gPSB5WzBdICogelsxXSAtIHlbMV0gKiB6WzBdOworCisgICAgLyogUmVjb21wdXRlIFkgPSBaIGNyb3NzIFggKi8KKyAgICB5WzBdID0gelsxXSAqIHhbMl0gLSB6WzJdICogeFsxXTsKKyAgICB5WzFdID0gLXpbMF0gKiB4WzJdICsgelsyXSAqIHhbMF07CisgICAgeVsyXSA9IHpbMF0gKiB4WzFdIC0gelsxXSAqIHhbMF07CisKKyAgICAvKiBtcGljaGxlciwgMTk5NTA1MTUgKi8KKyAgICAvKiBjcm9zcyBwcm9kdWN0IGdpdmVzIGFyZWEgb2YgcGFyYWxsZWxvZ3JhbSwgd2hpY2ggaXMgPCAxLjAgZm9yCisgICAgICogbm9uLXBlcnBlbmRpY3VsYXIgdW5pdC1sZW5ndGggdmVjdG9yczsgc28gbm9ybWFsaXplIHgsIHkgaGVyZQorICAgICAqLworCisgICAgbWFnID0gKGZsb2F0KXNxcnQoeFswXSAqIHhbMF0gKyB4WzFdICogeFsxXSArIHhbMl0gKiB4WzJdKTsKKyAgICBpZiAobWFnKSB7CisgICAgICAgIHhbMF0gLz0gbWFnOworICAgICAgICB4WzFdIC89IG1hZzsKKyAgICAgICAgeFsyXSAvPSBtYWc7CisgICAgfQorCisgICAgbWFnID0gKGZsb2F0KXNxcnQoeVswXSAqIHlbMF0gKyB5WzFdICogeVsxXSArIHlbMl0gKiB5WzJdKTsKKyAgICBpZiAobWFnKSB7CisgICAgICAgIHlbMF0gLz0gbWFnOworICAgICAgICB5WzFdIC89IG1hZzsKKyAgICAgICAgeVsyXSAvPSBtYWc7CisgICAgfQorCisjZGVmaW5lIE0ocm93LGNvbCkgIG1bY29sKjQrcm93XQorICAgIE0oMCwgMCkgPSB4WzBdOworICAgIE0oMCwgMSkgPSB4WzFdOworICAgIE0oMCwgMikgPSB4WzJdOworICAgIE0oMCwgMykgPSAwLjA7CisgICAgTSgxLCAwKSA9IHlbMF07CisgICAgTSgxLCAxKSA9IHlbMV07CisgICAgTSgxLCAyKSA9IHlbMl07CisgICAgTSgxLCAzKSA9IDAuMDsKKyAgICBNKDIsIDApID0gelswXTsKKyAgICBNKDIsIDEpID0gelsxXTsKKyAgICBNKDIsIDIpID0gelsyXTsKKyAgICBNKDIsIDMpID0gMC4wOworICAgIE0oMywgMCkgPSAwLjA7CisgICAgTSgzLCAxKSA9IDAuMDsKKyAgICBNKDMsIDIpID0gMC4wOworICAgIE0oMywgMykgPSAxLjA7CisjdW5kZWYgTQorICAgIHsKKyAgICAgICAgaW50IGE7CisgICAgICAgIEdMZml4ZWQgZml4ZWRNWzE2XTsKKyAgICAgICAgZm9yIChhID0gMDsgYSA8IDE2OyArK2EpCisgICAgICAgICAgICBmaXhlZE1bYV0gPSAoR0xmaXhlZCkobVthXSAqIDY1NTM2KTsKKyAgICAgICAgZ2xNdWx0TWF0cml4eChmaXhlZE0pOworICAgIH0KKworICAgIC8qIFRyYW5zbGF0ZSBFeWUgdG8gT3JpZ2luICovCisgICAgZ2xUcmFuc2xhdGV4KChHTGZpeGVkKSgtZXlleCAqIDY1NTM2KSwKKyAgICAgICAgICAgICAgICAgKEdMZml4ZWQpKC1leWV5ICogNjU1MzYpLAorICAgICAgICAgICAgICAgICAoR0xmaXhlZCkoLWV5ZXogKiA2NTUzNikpOworfQorCisKK3N0YXRpYyB2b2lkIGNhbVRyYWNrKCkKK3sKKyAgICBmbG9hdCBsZXJwWzVdOworICAgIGZsb2F0IGVYLCBlWSwgZVosIGNYLCBjWSwgY1o7CisgICAgZmxvYXQgdHJhY2tQb3M7CisgICAgQ0FNVFJBQ0sgKmNhbTsKKyAgICBsb25nIGN1cnJlbnRDYW1UaWNrOworICAgIGludCBhOworCisgICAgaWYgKHNOZXh0Q2FtVHJhY2tTdGFydFRpY2sgPD0gc1RpY2spCisgICAgeworICAgICAgICArK3NDdXJyZW50Q2FtVHJhY2s7CisgICAgICAgIHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2sgPSBzTmV4dENhbVRyYWNrU3RhcnRUaWNrOworICAgIH0KKyAgICBzTmV4dENhbVRyYWNrU3RhcnRUaWNrID0gc0N1cnJlbnRDYW1UcmFja1N0YXJ0VGljayArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDYW1UcmFja3Nbc0N1cnJlbnRDYW1UcmFja10ubGVuICogQ0FNVFJBQ0tfTEVOOworCisgICAgY2FtID0gJnNDYW1UcmFja3Nbc0N1cnJlbnRDYW1UcmFja107CisgICAgY3VycmVudENhbVRpY2sgPSBzVGljayAtIHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2s7CisgICAgdHJhY2tQb3MgPSAoZmxvYXQpY3VycmVudENhbVRpY2sgLyAoQ0FNVFJBQ0tfTEVOICogY2FtLT5sZW4pOworCisgICAgZm9yIChhID0gMDsgYSA8IDU7ICsrYSkKKyAgICAgICAgbGVycFthXSA9IChjYW0tPnNyY1thXSArIGNhbS0+ZGVzdFthXSAqIHRyYWNrUG9zKSAqIDAuMDFmOworCisgICAgaWYgKGNhbS0+ZGlzdCkKKyAgICB7CisgICAgICAgIGZsb2F0IGRpc3QgPSBjYW0tPmRpc3QgKiAwLjFmOworICAgICAgICBjWCA9IGxlcnBbMF07CisgICAgICAgIGNZID0gbGVycFsxXTsKKyAgICAgICAgY1ogPSBsZXJwWzJdOworICAgICAgICBlWCA9IGNYIC0gKGZsb2F0KWNvcyhsZXJwWzNdKSAqIGRpc3Q7CisgICAgICAgIGVZID0gY1kgLSAoZmxvYXQpc2luKGxlcnBbM10pICogZGlzdDsKKyAgICAgICAgZVogPSBjWiAtIGxlcnBbNF07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVYID0gbGVycFswXTsKKyAgICAgICAgZVkgPSBsZXJwWzFdOworICAgICAgICBlWiA9IGxlcnBbMl07CisgICAgICAgIGNYID0gZVggKyAoZmxvYXQpY29zKGxlcnBbM10pOworICAgICAgICBjWSA9IGVZICsgKGZsb2F0KXNpbihsZXJwWzNdKTsKKyAgICAgICAgY1ogPSBlWiArIGxlcnBbNF07CisgICAgfQorICAgIGdsdUxvb2tBdChlWCwgZVksIGVaLCBjWCwgY1ksIGNaLCAwLCAwLCAxKTsKK30KKworCisvLyBDYWxsZWQgZnJvbSB0aGUgYXBwIGZyYW1ld29yay4KKy8qIFRoZSB0aWNrIGlzIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMsIHdpZHRoIGFuZCBoZWlnaHQKKyAqIGFyZSB0aGUgaW1hZ2UgZGltZW5zaW9ucyB0byBiZSByZW5kZXJlZC4KKyAqLwordm9pZCBhcHBSZW5kZXIobG9uZyB0aWNrLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaWYgKHNTdGFydFRpY2sgPT0gMCkKKyAgICAgICAgc1N0YXJ0VGljayA9IHRpY2s7CisgICAgaWYgKCFnQXBwQWxpdmUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEFjdHVhbCB0aWNrIHZhbHVlIGlzICJibHVycmVkIiBhIGxpdHRsZSBiaXQuCisgICAgc1RpY2sgPSAoc1RpY2sgKyB0aWNrIC0gc1N0YXJ0VGljaykgPj4gMTsKKworICAgIC8vIFRlcm1pbmF0ZSBhcHBsaWNhdGlvbiBhZnRlciBydW5uaW5nIHRocm91Z2ggdGhlIGRlbW9uc3RyYXRpb24gb25jZS4KKyAgICBpZiAoc1RpY2sgPj0gUlVOX0xFTkdUSCkKKyAgICB7CisgICAgICAgIGdBcHBBbGl2ZSA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBQcmVwYXJlIE9wZW5HTCBFUyBmb3IgcmVuZGVyaW5nIG9mIHRoZSBmcmFtZS4KKyAgICBwcmVwYXJlRnJhbWUod2lkdGgsIGhlaWdodCk7CisKKyAgICAvLyBVcGRhdGUgdGhlIGNhbWVyYSBwb3NpdGlvbiBhbmQgc2V0IHRoZSBsb29rYXQuCisgICAgY2FtVHJhY2soKTsKKworICAgIC8vIENvbmZpZ3VyZSBlbnZpcm9ubWVudC4KKyAgICBjb25maWd1cmVMaWdodEFuZE1hdGVyaWFsKCk7CisKKyAgICAvLyBEcmF3IHRoZSByZWZsZWN0aW9uIGJ5IGRyYXdpbmcgbW9kZWxzIHdpdGggbmVnYXRlZCBaLWF4aXMuCisgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgZHJhd01vZGVscygtMSk7CisgICAgZ2xQb3BNYXRyaXgoKTsKKworICAgIC8vIEJsZW5kIHRoZSBncm91bmQgcGxhbmUgdG8gdGhlIHdpbmRvdy4KKyAgICBkcmF3R3JvdW5kUGxhbmUoKTsKKworICAgIC8vIERyYXcgYWxsIHRoZSBtb2RlbHMgbm9ybWFsbHkuCisgICAgZHJhd01vZGVscygxKTsKKworICAgIC8vIERyYXcgZmFkZSBxdWFkIG92ZXIgd2hvbGUgd2luZG93ICh3aGVuIGNoYW5naW5nIGNhbWVyYXMpLgorICAgIGRyYXdGYWRlUXVhZCgpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvZ3B1c3RhdGUuYyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2dwdXN0YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M1NDBjOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2dwdXN0YXRlLmMKQEAgLTAsMCArMSwzOSBAQAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKK3N0YXRpYyB2b2lkICptYXBfbWVtb3J5KGNvbnN0IGNoYXIgKmZuLCB1bnNpZ25lZCBiYXNlLCB1bnNpZ25lZCBzaXplKQoreworICAgIGludCBmZDsKKyAgICB2b2lkICpwdHI7CisgICAgCisgICAgZmQgPSBvcGVuKGZuLCBPX1JEV1IgfCBPX1NZTkMpOworICAgIGlmKGZkIDwgMCkgeworICAgICAgICBwZXJyb3IoImNhbm5vdCBvcGVuICVzIGZvciBtYXBwaW5nIik7CisgICAgICAgIHJldHVybiBNQVBfRkFJTEVEOworICAgIH0KKworICAgIHB0ciA9IG1tYXAoMCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsIGZkLCBiYXNlKTsKKyAgICBjbG9zZShmZCk7CisgICAgCisgICAgaWYocHRyID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsImNhbm5vdCBtYXAgJXMgKEAlMDh4LCUwOHgpXG4iLCBmbiwgYmFzZSwgc2l6ZSk7CisgICAgfQorICAgIHJldHVybiBwdHI7ICAgIAorfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICB2b2lkICpncnBfcmVncyA9IG1hcF9tZW1vcnkoIi9kZXYvaHczZCIsIDAsIDEwMjQgKiAxMDI0KTsKKyAgICBwcmludGYoIkdQVSBiYXNlIG1hcHBlZCBhdCAlcFxuIiwgZ3JwX3JlZ3MpOworICAgIGludCBzdGF0ZV9vZmZzZXQgPSAweDEwMTQwOworICAgIHByaW50ZigiR1BVIHN0YXRlID0gJTA4bHhcbiIsCisgICAgICAgICAgICAqKChsb25nKikoKGNoYXIqKWdycF9yZWdzICsgc3RhdGVfb2Zmc2V0KSkgICk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2wuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGY4NDEwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2VnbC5oCkBAIC0wLDAgKzEsMjI5IEBACisjaWZuZGVmIF9fZWdsX2hfCisjZGVmaW5lIF9fZWdsX2hfCisKKy8qCisqKiBMaWNlbnNlIEFwcGxpY2FiaWxpdHkuIEV4Y2VwdCB0byB0aGUgZXh0ZW50IHBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUKKyoqIG1hZGUgc3ViamVjdCB0byBhbiBhbHRlcm5hdGl2ZSBsaWNlbnNlIGFzIHBlcm1pdHRlZCBpbiB0aGUgU0dJIEZyZWUKKyoqIFNvZnR3YXJlIExpY2Vuc2UgQiwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpLCB0aGUgY29udGVudHMgb2YgdGhpcworKiogZmlsZSBhcmUgc3ViamVjdCBvbmx5IHRvIHRoZSBwcm92aXNpb25zIG9mIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG5vdCB1c2UKKyoqIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyoqIG9mIHRoZSBMaWNlbnNlIGF0IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIGF0dG46IExlZ2FsIFNlcnZpY2VzLCAxNjAwCisqKiBBbXBoaXRoZWF0cmUgUGFya3dheSwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDMtMTM1MSwgb3IgYXQ6CisqKgorKiogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0ZyZWVCCisqKgorKiogTm90ZSB0aGF0LCBhcyBwcm92aWRlZCBpbiB0aGUgTGljZW5zZSwgdGhlIFNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqKiAiQVMgSVMiIGJhc2lzLCB3aXRoIEFMTCBFWFBSRVNTIEFORCBJTVBMSUVEIFdBUlJBTlRJRVMgQU5EIENPTkRJVElPTlMKKyoqIERJU0NMQUlNRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgSU1QTElFRCBXQVJSQU5USUVTIEFORAorKiogQ09ORElUSU9OUyBPRiBNRVJDSEFOVEFCSUxJVFksIFNBVElTRkFDVE9SWSBRVUFMSVRZLCBGSVRORVNTIEZPUiBBCisqKiBQQVJUSUNVTEFSIFBVUlBPU0UsIEFORCBOT04tSU5GUklOR0VNRU5ULgorKioKKyoqIE9yaWdpbmFsIENvZGUuIFRoZSBPcmlnaW5hbCBDb2RlIGlzOiBPcGVuR0wgU2FtcGxlIEltcGxlbWVudGF0aW9uLAorKiogVmVyc2lvbiAxLjIuMSwgcmVsZWFzZWQgSmFudWFyeSAyNiwgMjAwMCwgZGV2ZWxvcGVkIGJ5IFNpbGljb24gR3JhcGhpY3MsCisqKiBJbmMuIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoYykgMTk5MS0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyoqIENvcHlyaWdodCBpbiBhbnkgcG9ydGlvbnMgY3JlYXRlZCBieSB0aGlyZCBwYXJ0aWVzIGlzIGFzIGluZGljYXRlZAorKiogZWxzZXdoZXJlIGhlcmVpbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoqCisqKiBBZGRpdGlvbmFsIE5vdGljZSBQcm92aXNpb25zOiBUaGUgYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcworKiogZXN0YWJsaXNoZWQgYnkgU0dJIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIE9yaWdpbmFsIENvZGUgYXJlIFRoZQorKiogT3BlbkdMKFIpIEdyYXBoaWNzIFN5c3RlbTogQSBTcGVjaWZpY2F0aW9uIChWZXJzaW9uIDEuMi4xKSwgcmVsZWFzZWQKKyoqIEFwcmlsIDEsIDE5OTk7IFRoZSBPcGVuR0woUikgR3JhcGhpY3MgU3lzdGVtIFV0aWxpdHkgTGlicmFyeSAoVmVyc2lvbgorKiogMS4zKSwgcmVsZWFzZWQgTm92ZW1iZXIgNCwgMTk5ODsgYW5kIE9wZW5HTChSKSBHcmFwaGljcyB3aXRoIHRoZSBYCisqKiBXaW5kb3cgU3lzdGVtKFIpIChWZXJzaW9uIDEuMyksIHJlbGVhc2VkIE9jdG9iZXIgMTksIDE5OTguIFRoaXMgc29mdHdhcmUKKyoqIHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBPcGVuR0woUikgdmVyc2lvbiAxLjIuMSBTYW1wbGUgSW1wbGVtZW50YXRpb24KKyoqIHB1Ymxpc2hlZCBieSBTR0ksIGJ1dCBoYXMgbm90IGJlZW4gaW5kZXBlbmRlbnRseSB2ZXJpZmllZCBhcyBiZWluZworKiogY29tcGxpYW50IHdpdGggdGhlIE9wZW5HTChSKSB2ZXJzaW9uIDEuMi4xIFNwZWNpZmljYXRpb24uCisqLworCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZWdsdHlwZXMuaD4KKworLyoKKyoqIGVnbHR5cGVzLmggaXMgcGxhdGZvcm0gZGVwZW5kZW50LiBJdCBkZWZpbmVzOgorKioKKyoqICAgICAtIEVHTCB0eXBlcyBhbmQgcmVzb3VyY2VzCisqKiAgICAgLSBOYXRpdmUgdHlwZXMKKyoqICAgICAtIEVHTCBhbmQgbmF0aXZlIGhhbmRsZSB2YWx1ZXMKKyoqCisqKiBFR0wgdHlwZXMgYW5kIHJlc291cmNlcyBhcmUgdG8gYmUgdHlwZWRlZidlZCB3aXRoIGFwcHJvcHJpYXRlIHBsYXRmb3JtCisqKiBkZXBlbmRlbnQgcmVzb3VyY2UgaGFuZGxlIHR5cGVzLiBFR0xpbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIG9mIGF0IGxlYXN0CisqKiAzMi1iaXQuCisqKgorKiogTmF0aXZlRGlzcGxheVR5cGUsIE5hdGl2ZVdpbmRvd1R5cGUgYW5kIE5hdGl2ZVBpeG1hcFR5cGUgYXJlIHRvIGJlCisqKiByZXBsYWNlZCB3aXRoIGNvcnJlc3BvbmRpbmcgdHlwZXMgb2YgdGhlIG5hdGl2ZSB3aW5kb3cgc3lzdGVtIGluIGVnbC5oLgorKioKKyoqIEVHTCBhbmQgbmF0aXZlIGhhbmRsZSB2YWx1ZXMgbXVzdCBtYXRjaCB0aGVpciB0eXBlcy4KKyoqCisqKiBFeGFtcGxlIGVnbHR5cGVzLmg6CisqLworCisjaWYgMAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmF0aXZlX3dpbmRvd19zeXN0ZW0uaD4KKworLyoKKyoqIFR5cGVzIGFuZCByZXNvdXJjZXMKKyovCit0eXBlZGVmIGludCBFR0xCb29sZWFuOwordHlwZWRlZiBpbnQzMl90IEVHTGludDsKK3R5cGVkZWYgdm9pZCAqRUdMRGlzcGxheTsKK3R5cGVkZWYgdm9pZCAqRUdMQ29uZmlnOwordHlwZWRlZiB2b2lkICpFR0xTdXJmYWNlOwordHlwZWRlZiB2b2lkICpFR0xDb250ZXh0OworCisvKgorKiogRUdMIGFuZCBuYXRpdmUgaGFuZGxlIHZhbHVlcworKi8KKyNkZWZpbmUgRUdMX0RFRkFVTFRfRElTUExBWSAoKE5hdGl2ZURpc3BsYXlUeXBlKTApCisjZGVmaW5lIEVHTF9OT19DT05URVhUICgoRUdMQ29udGV4dCkwKQorI2RlZmluZSBFR0xfTk9fRElTUExBWSAoKEVHTERpc3BsYXkpMCkKKyNkZWZpbmUgRUdMX05PX1NVUkZBQ0UgKChFR0xTdXJmYWNlKTApCisKKyNlbmRpZgorCisvKgorKiogVmVyc2lvbmluZyBhbmQgZXh0ZW5zaW9ucworKi8KKyNkZWZpbmUgRUdMX1ZFUlNJT05fMV8wCQkgICAgICAgMQorCisvKgorKiogQm9vbGVhbgorKi8KKyNkZWZpbmUgRUdMX0ZBTFNFCQkgICAgICAgMAorI2RlZmluZSBFR0xfVFJVRQkJICAgICAgIDEKKworLyoKKyoqIEVycm9ycworKi8KKyNkZWZpbmUgRUdMX1NVQ0NFU1MJCSAgICAgICAweDMwMDAKKyNkZWZpbmUgRUdMX05PVF9JTklUSUFMSVpFRAkgICAgICAgMHgzMDAxCisjZGVmaW5lIEVHTF9CQURfQUNDRVNTCQkgICAgICAgMHgzMDAyCisjZGVmaW5lIEVHTF9CQURfQUxMT0MJCSAgICAgICAweDMwMDMKKyNkZWZpbmUgRUdMX0JBRF9BVFRSSUJVVEUJICAgICAgIDB4MzAwNAorI2RlZmluZSBFR0xfQkFEX0NPTkZJRwkJICAgICAgIDB4MzAwNQorI2RlZmluZSBFR0xfQkFEX0NPTlRFWFQJCSAgICAgICAweDMwMDYKKyNkZWZpbmUgRUdMX0JBRF9DVVJSRU5UX1NVUkZBQ0UgICAgICAgIDB4MzAwNworI2RlZmluZSBFR0xfQkFEX0RJU1BMQVkJCSAgICAgICAweDMwMDgKKyNkZWZpbmUgRUdMX0JBRF9NQVRDSAkJICAgICAgIDB4MzAwOQorI2RlZmluZSBFR0xfQkFEX05BVElWRV9QSVhNQVAJICAgICAgIDB4MzAwQQorI2RlZmluZSBFR0xfQkFEX05BVElWRV9XSU5ET1cJICAgICAgIDB4MzAwQgorI2RlZmluZSBFR0xfQkFEX1BBUkFNRVRFUgkgICAgICAgMHgzMDBDCisjZGVmaW5lIEVHTF9CQURfU1VSRkFDRQkJICAgICAgIDB4MzAwRAorLyogMHgzMDBFIC0gMHgzMDFGIHJlc2VydmVkIGZvciBhZGRpdGlvbmFsIGVycm9ycy4gKi8KKworLyoKKyoqIENvbmZpZyBhdHRyaWJ1dGVzCisqLworI2RlZmluZSBFR0xfQlVGRkVSX1NJWkUJCSAgICAgICAweDMwMjAKKyNkZWZpbmUgRUdMX0FMUEhBX1NJWkUJCSAgICAgICAweDMwMjEKKyNkZWZpbmUgRUdMX0JMVUVfU0laRQkJICAgICAgIDB4MzAyMgorI2RlZmluZSBFR0xfR1JFRU5fU0laRQkJICAgICAgIDB4MzAyMworI2RlZmluZSBFR0xfUkVEX1NJWkUJCSAgICAgICAweDMwMjQKKyNkZWZpbmUgRUdMX0RFUFRIX1NJWkUJCSAgICAgICAweDMwMjUKKyNkZWZpbmUgRUdMX1NURU5DSUxfU0laRQkgICAgICAgMHgzMDI2CisjZGVmaW5lIEVHTF9DT05GSUdfQ0FWRUFUCSAgICAgICAweDMwMjcKKyNkZWZpbmUgRUdMX0NPTkZJR19JRAkJICAgICAgIDB4MzAyOAorI2RlZmluZSBFR0xfTEVWRUwJCSAgICAgICAweDMwMjkKKyNkZWZpbmUgRUdMX01BWF9QQlVGRkVSX0hFSUdIVAkgICAgICAgMHgzMDJBCisjZGVmaW5lIEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMJICAgICAgIDB4MzAyQgorI2RlZmluZSBFR0xfTUFYX1BCVUZGRVJfV0lEVEgJICAgICAgIDB4MzAyQworI2RlZmluZSBFR0xfTkFUSVZFX1JFTkRFUkFCTEUJICAgICAgIDB4MzAyRAorI2RlZmluZSBFR0xfTkFUSVZFX1ZJU1VBTF9JRAkgICAgICAgMHgzMDJFCisjZGVmaW5lIEVHTF9OQVRJVkVfVklTVUFMX1RZUEUJICAgICAgIDB4MzAyRgorLyojZGVmaW5lIEVHTF9QUkVTRVJWRURfUkVTT1VSQ0VTCSAweDMwMzAqLworI2RlZmluZSBFR0xfU0FNUExFUwkJICAgICAgIDB4MzAzMQorI2RlZmluZSBFR0xfU0FNUExFX0JVRkZFUlMJICAgICAgIDB4MzAzMgorI2RlZmluZSBFR0xfU1VSRkFDRV9UWVBFCSAgICAgICAweDMwMzMKKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX1RZUEUJICAgICAgIDB4MzAzNAorI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSAgICAgMHgzMDM1CisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRSAgICAweDMwMzYKKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSAgICAgIDB4MzAzNworCisvKgorKiogQ29uZmlnIGF0dHJpYnV0ZSBhbmQgdmFsdWUKKyovCisjZGVmaW5lIEVHTF9OT05FCQkgICAgICAgMHgzMDM4CisvKiAweDMwMzkgLSAweDMwNEYgcmVzZXJ2ZWQgZm9yIGFkZGl0aW9uYWwgY29uZmlnIGF0dHJpYnV0ZXMuICovCisKKy8qCisqKiBDb25maWcgdmFsdWVzCisqLworI2RlZmluZSBFR0xfRE9OVF9DQVJFCQkgICAgICAgKChFR0xpbnQpIC0xKQorI2RlZmluZSBFR0xfUEJVRkZFUl9CSVQJCSAgICAgICAweDAxCisjZGVmaW5lIEVHTF9QSVhNQVBfQklUCQkgICAgICAgMHgwMgorI2RlZmluZSBFR0xfV0lORE9XX0JJVAkJICAgICAgIDB4MDQKKyNkZWZpbmUgRUdMX1NMT1dfQ09ORklHCQkgICAgICAgMHgzMDUwCisjZGVmaW5lIEVHTF9OT05fQ09ORk9STUFOVF9DT05GSUcgICAgICAweDMwNTEKKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX1JHQgkgICAgICAgMHgzMDUyCisKKy8qCisqKiBTdHJpbmcgbmFtZXMKKyovCisjZGVmaW5lIEVHTF9WRU5ET1IJCSAgICAgICAweDMwNTMKKyNkZWZpbmUgRUdMX1ZFUlNJT04JCSAgICAgICAweDMwNTQKKyNkZWZpbmUgRUdMX0VYVEVOU0lPTlMJCSAgICAgICAweDMwNTUKKworLyoKKyoqIFN1cmZhY2UgYXR0cmlidXRlcworKi8KKyNkZWZpbmUgRUdMX0hFSUdIVAkJICAgICAgIDB4MzA1NgorI2RlZmluZSBFR0xfV0lEVEgJCSAgICAgICAweDMwNTcKKyNkZWZpbmUgRUdMX0xBUkdFU1RfUEJVRkZFUgkgICAgICAgMHgzMDU4CisKKy8qCisqKiBDdXJyZW50IHN1cmZhY2VzCisqLworI2RlZmluZSBFR0xfRFJBVwkJICAgICAgIDB4MzA1OQorI2RlZmluZSBFR0xfUkVBRAkJICAgICAgIDB4MzA1QQorCisvKgorKiogRW5naW5lcworKi8KKyNkZWZpbmUgRUdMX0NPUkVfTkFUSVZFX0VOR0lORQkgICAgICAgMHgzMDVCCisKKy8qIDB4MzA1Qy0weDNGRkZGIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisKKy8qCisqKiBGdW5jdGlvbnMKKyovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK0dMQVBJIEVHTGludCBBUElFTlRSWSBlZ2xHZXRFcnJvciAodm9pZCk7CisKK0dMQVBJIEVHTERpc3BsYXkgQVBJRU5UUlkgZWdsR2V0RGlzcGxheSAoTmF0aXZlRGlzcGxheVR5cGUgZGlzcGxheSk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbEluaXRpYWxpemUgKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgKm1ham9yLCBFR0xpbnQgKm1pbm9yKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsVGVybWluYXRlIChFR0xEaXNwbGF5IGRweSk7CitHTEFQSSBjb25zdCBjaGFyICogQVBJRU5UUlkgZWdsUXVlcnlTdHJpbmcgKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgbmFtZSk7CitHTEFQSSB2b2lkICgqIEFQSUVOVFJZIGVnbEdldFByb2NBZGRyZXNzIChjb25zdCBjaGFyICpwcm9jbmFtZSkpKCk7CisKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsR2V0Q29uZmlncyAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyAqY29uZmlncywgRUdMaW50IGNvbmZpZ19zaXplLCBFR0xpbnQgKm51bV9jb25maWcpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xDaG9vc2VDb25maWcgKEVHTERpc3BsYXkgZHB5LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0LCBFR0xDb25maWcgKmNvbmZpZ3MsIEVHTGludCBjb25maWdfc2l6ZSwgRUdMaW50ICpudW1fY29uZmlnKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsR2V0Q29uZmlnQXR0cmliIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7CisKK0dMQVBJIEVHTFN1cmZhY2UgQVBJRU5UUlkgZWdsQ3JlYXRlV2luZG93U3VyZmFjZSAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0dMQVBJIEVHTFN1cmZhY2UgQVBJRU5UUlkgZWdsQ3JlYXRlUGl4bWFwU3VyZmFjZSAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIE5hdGl2ZVBpeG1hcFR5cGUgcGl4bWFwLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0dMQVBJIEVHTFN1cmZhY2UgQVBJRU5UUlkgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsRGVzdHJveVN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xRdWVyeVN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpOworCitHTEFQSSBFR0xDb250ZXh0IEFQSUVOVFJZIGVnbENyZWF0ZUNvbnRleHQgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBFR0xDb250ZXh0IHNoYXJlX2xpc3QsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xEZXN0cm95Q29udGV4dCAoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4KTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsTWFrZUN1cnJlbnQgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGRyYXcsIEVHTFN1cmZhY2UgcmVhZCwgRUdMQ29udGV4dCBjdHgpOworR0xBUEkgRUdMQ29udGV4dCBBUElFTlRSWSBlZ2xHZXRDdXJyZW50Q29udGV4dCAodm9pZCk7CitHTEFQSSBFR0xTdXJmYWNlIEFQSUVOVFJZIGVnbEdldEN1cnJlbnRTdXJmYWNlIChFR0xpbnQgcmVhZGRyYXcpOworR0xBUEkgRUdMRGlzcGxheSBBUElFTlRSWSBlZ2xHZXRDdXJyZW50RGlzcGxheSAodm9pZCk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbFF1ZXJ5Q29udGV4dCAoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4LCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKKworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xXYWl0R0wgKHZvaWQpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xXYWl0TmF0aXZlIChFR0xpbnQgZW5naW5lKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsU3dhcEJ1ZmZlcnMgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGRyYXcpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xDb3B5QnVmZmVycyAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgTmF0aXZlUGl4bWFwVHlwZSB0YXJnZXQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19fZWdsX2hfICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsdHlwZXMuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2x0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjM2YzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsdHlwZXMuaApAQCAtMCwwICsxLDIwIEBACisvKgorKiogVHlwZXMgYW5kIHJlc291cmNlcworKi8KK3R5cGVkZWYgaW50IEVHTEJvb2xlYW47Cit0eXBlZGVmIGxvbmcgRUdMaW50OwordHlwZWRlZiB2b2lkICpFR0xEaXNwbGF5OwordHlwZWRlZiB2b2lkICpFR0xDb25maWc7Cit0eXBlZGVmIHZvaWQgKkVHTFN1cmZhY2U7Cit0eXBlZGVmIHZvaWQgKkVHTENvbnRleHQ7Cit0eXBlZGVmIHZvaWQgKk5hdGl2ZURpc3BsYXlUeXBlOwordHlwZWRlZiB2b2lkICpOYXRpdmVXaW5kb3dUeXBlOwordHlwZWRlZiB2b2lkICpOYXRpdmVQaXhtYXBUeXBlOworCisvKgorKiogRUdMIGFuZCBuYXRpdmUgaGFuZGxlIHZhbHVlcworKi8KKyNkZWZpbmUgRUdMX0RFRkFVTFRfRElTUExBWSAoKE5hdGl2ZURpc3BsYXlUeXBlKTApCisjZGVmaW5lIEVHTF9OT19DT05URVhUICgoRUdMQ29udGV4dCkwKQorI2RlZmluZSBFR0xfTk9fRElTUExBWSAoKEVHTERpc3BsYXkpMCkKKyNkZWZpbmUgRUdMX05PX1NVUkZBQ0UgKChFR0xTdXJmYWNlKTApCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZ2wuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9nbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTQ4MjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZ2wuaApAQCAtMCwwICsxLDU4NCBAQAorI2lmbmRlZiBfX2dsX2hfCisjZGVmaW5lIF9fZ2xfaF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorKiogTGljZW5zZSBBcHBsaWNhYmlsaXR5LiBFeGNlcHQgdG8gdGhlIGV4dGVudCBwb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlCisqKiBtYWRlIHN1YmplY3QgdG8gYW4gYWx0ZXJuYXRpdmUgbGljZW5zZSBhcyBwZXJtaXR0ZWQgaW4gdGhlIFNHSSBGcmVlCisqKiBTb2Z0d2FyZSBMaWNlbnNlIEIsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMKKyoqIGZpbGUgYXJlIHN1YmplY3Qgb25seSB0byB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgTGljZW5zZS4gWW91IG1heSBub3QgdXNlCisqKiB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisqKiBvZiB0aGUgTGljZW5zZSBhdCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCBhdHRuOiBMZWdhbCBTZXJ2aWNlcywgMTYwMAorKiogQW1waGl0aGVhdHJlIFBhcmt3YXksIE1vdW50YWluIFZpZXcsIENBIDk0MDQzLTEzNTEsIG9yIGF0OgorKiogCisqKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvRnJlZUIKKyoqIAorKiogTm90ZSB0aGF0LCBhcyBwcm92aWRlZCBpbiB0aGUgTGljZW5zZSwgdGhlIFNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqKiAiQVMgSVMiIGJhc2lzLCB3aXRoIEFMTCBFWFBSRVNTIEFORCBJTVBMSUVEIFdBUlJBTlRJRVMgQU5EIENPTkRJVElPTlMKKyoqIERJU0NMQUlNRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgSU1QTElFRCBXQVJSQU5USUVTIEFORAorKiogQ09ORElUSU9OUyBPRiBNRVJDSEFOVEFCSUxJVFksIFNBVElTRkFDVE9SWSBRVUFMSVRZLCBGSVRORVNTIEZPUiBBCisqKiBQQVJUSUNVTEFSIFBVUlBPU0UsIEFORCBOT04tSU5GUklOR0VNRU5ULgorKiogCisqKiBPcmlnaW5hbCBDb2RlLiBUaGUgT3JpZ2luYWwgQ29kZSBpczogT3BlbkdMIFNhbXBsZSBJbXBsZW1lbnRhdGlvbiwKKyoqIFZlcnNpb24gMS4yLjEsIHJlbGVhc2VkIEphbnVhcnkgMjYsIDIwMDAsIGRldmVsb3BlZCBieSBTaWxpY29uIEdyYXBoaWNzLAorKiogSW5jLiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKGMpIDE5OTEtMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisqKiBDb3B5cmlnaHQgaW4gYW55IHBvcnRpb25zIGNyZWF0ZWQgYnkgdGhpcmQgcGFydGllcyBpcyBhcyBpbmRpY2F0ZWQKKyoqIGVsc2V3aGVyZSBoZXJlaW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqKiAKKyoqIEFkZGl0aW9uYWwgTm90aWNlIFByb3Zpc2lvbnM6IFRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2VzCisqKiBlc3RhYmxpc2hlZCBieSBTR0kgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgT3JpZ2luYWwgQ29kZSBhcmUgVGhlCisqKiBPcGVuR0woUikgR3JhcGhpY3MgU3lzdGVtOiBBIFNwZWNpZmljYXRpb24gKFZlcnNpb24gMS4yLjEpLCByZWxlYXNlZAorKiogQXByaWwgMSwgMTk5OTsgVGhlIE9wZW5HTChSKSBHcmFwaGljcyBTeXN0ZW0gVXRpbGl0eSBMaWJyYXJ5IChWZXJzaW9uCisqKiAxLjMpLCByZWxlYXNlZCBOb3ZlbWJlciA0LCAxOTk4OyBhbmQgT3BlbkdMKFIpIEdyYXBoaWNzIHdpdGggdGhlIFgKKyoqIFdpbmRvdyBTeXN0ZW0oUikgKFZlcnNpb24gMS4zKSwgcmVsZWFzZWQgT2N0b2JlciAxOSwgMTk5OC4gVGhpcyBzb2Z0d2FyZQorKiogd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIE9wZW5HTChSKSB2ZXJzaW9uIDEuMi4xIFNhbXBsZSBJbXBsZW1lbnRhdGlvbgorKiogcHVibGlzaGVkIGJ5IFNHSSwgYnV0IGhhcyBub3QgYmVlbiBpbmRlcGVuZGVudGx5IHZlcmlmaWVkIGFzIGJlaW5nCisqKiBjb21wbGlhbnQgd2l0aCB0aGUgT3BlbkdMKFIpIHZlcnNpb24gMS4yLjEgU3BlY2lmaWNhdGlvbi4KKyovCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoQVBJRU5UUlkpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWZuZGVmIEFQSUVOVFJZCisjZGVmaW5lIEFQSUVOVFJZCisjZW5kaWYKKyNpZm5kZWYgR0xBUEkKKyNkZWZpbmUgR0xBUEkgZXh0ZXJuCisjZW5kaWYKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgR0xlbnVtOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEdMYm9vbGVhbjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEdMYml0ZmllbGQ7Cit0eXBlZGVmIHNpZ25lZCBjaGFyIEdMYnl0ZTsKK3R5cGVkZWYgc2hvcnQgR0xzaG9ydDsKK3R5cGVkZWYgaW50IEdMaW50OwordHlwZWRlZiBpbnQgR0xzaXplaTsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBHTHVieXRlOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBHTHVzaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEdMdWludDsKK3R5cGVkZWYgZmxvYXQgR0xmbG9hdDsKK3R5cGVkZWYgZmxvYXQgR0xjbGFtcGY7Cit0eXBlZGVmIHZvaWQgR0x2b2lkOwordHlwZWRlZiBpbnQgR0xpbnRwdHJBUkI7Cit0eXBlZGVmIGludCBHTHNpemVpcHRyQVJCOwordHlwZWRlZiBpbnQgR0xmaXhlZDsKK3R5cGVkZWYgaW50IEdMY2xhbXB4OworLyogSW50ZXJuYWwgY29udmVuaWVuY2UgdHlwZWRlZnMgKi8KK3R5cGVkZWYgdm9pZCAoKl9HTGZ1bmNwdHIpKCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFeHRlbnNpb25zICovCisjZGVmaW5lIEdMX09FU19WRVJTSU9OXzFfMCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdMX09FU19yZWFkX2Zvcm1hdCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUgMQorCisvKiBDbGVhckJ1ZmZlck1hc2sgKi8KKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKworLyogQm9vbGVhbiAqLworI2RlZmluZSBHTF9GQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9UUlVFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisvKiBCZWdpbk1vZGUgKi8KKyNkZWZpbmUgR0xfUE9JTlRTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBHTF9MSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEdMX0xJTkVfTE9PUCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgR0xfTElORV9TVFJJUCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBHTF9UUklBTkdMRVMgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEdMX1RSSUFOR0xFX1NUUklQICAgICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgR0xfVFJJQU5HTEVfRkFOICAgICAgICAgICAgICAgICAgIDB4MDAwNgorCisvKiBBbHBoYUZ1bmN0aW9uICovCisjZGVmaW5lIEdMX05FVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgR0xfTEVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMQorI2RlZmluZSBHTF9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAyCisjZGVmaW5lIEdMX0xFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDMKKyNkZWZpbmUgR0xfR1JFQVRFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNAorI2RlZmluZSBHTF9OT1RFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA1CisjZGVmaW5lIEdMX0dFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDYKKyNkZWZpbmUgR0xfQUxXQVlTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNworCisvKiBCbGVuZGluZ0ZhY3RvckRlc3QgKi8KKyNkZWZpbmUgR0xfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR0xfU1JDX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SICAgICAgICAgICAgMHgwMzAxCisjZGVmaW5lIEdMX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAgICAgICAweDAzMDIKKyNkZWZpbmUgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAgICAgICAgICAgIDB4MDMwMworI2RlZmluZSBHTF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgMHgwMzA0CisjZGVmaW5lIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgICAgICAgICAgICAweDAzMDUKKworLyogQmxlbmRpbmdGYWN0b3JTcmMgKi8KKy8qICAgICAgR0xfWkVSTyAqLworLyogICAgICBHTF9PTkUgKi8KKyNkZWZpbmUgR0xfRFNUX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDMwNgorI2RlZmluZSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SICAgICAgICAgICAgMHgwMzA3CisjZGVmaW5lIEdMX1NSQ19BTFBIQV9TQVRVUkFURSAgICAgICAgICAgICAweDAzMDgKKy8qICAgICAgR0xfU1JDX0FMUEhBICovCisvKiAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgKi8KKy8qICAgICAgR0xfRFNUX0FMUEhBICovCisvKiAgICAgIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgKi8KKworLyogQ29sb3JNYXRlcmlhbEZhY2UgKi8KKy8qICAgICAgR0xfRlJPTlRfQU5EX0JBQ0sgKi8KKworLyogQ29sb3JNYXRlcmlhbFBhcmFtZXRlciAqLworLyogICAgICBHTF9BTUJJRU5UX0FORF9ESUZGVVNFICovCisKKy8qIENvbG9yUG9pbnRlclR5cGUgKi8KKy8qICAgICAgR0xfVU5TSUdORURfQllURSAqLworLyogICAgICBHTF9GTE9BVCAqLworLyogICAgICBHTF9GSVhFRCAqLworCisvKiBDdWxsRmFjZU1vZGUgKi8KKyNkZWZpbmUgR0xfRlJPTlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwNAorI2RlZmluZSBHTF9CQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDA1CisjZGVmaW5lIEdMX0ZST05UX0FORF9CQUNLICAgICAgICAgICAgICAgICAweDA0MDgKKworLyogRGVwdGhGdW5jdGlvbiAqLworLyogICAgICBHTF9ORVZFUiAqLworLyogICAgICBHTF9MRVNTICovCisvKiAgICAgIEdMX0VRVUFMICovCisvKiAgICAgIEdMX0xFUVVBTCAqLworLyogICAgICBHTF9HUkVBVEVSICovCisvKiAgICAgIEdMX05PVEVRVUFMICovCisvKiAgICAgIEdMX0dFUVVBTCAqLworLyogICAgICBHTF9BTFdBWVMgKi8KKworLyogRW5hYmxlQ2FwICovCisjZGVmaW5lIEdMX0ZPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCNjAKKyNkZWZpbmUgR0xfTElHSFRJTkcgICAgICAgICAgICAgICAgICAgICAgIDB4MEI1MAorI2RlZmluZSBHTF9URVhUVVJFXzJEICAgICAgICAgICAgICAgICAgICAgMHgwREUxCisjZGVmaW5lIEdMX0NVTExfRkFDRSAgICAgICAgICAgICAgICAgICAgICAweDBCNDQKKyNkZWZpbmUgR0xfQUxQSEFfVEVTVCAgICAgICAgICAgICAgICAgICAgIDB4MEJDMAorI2RlZmluZSBHTF9CTEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQkUyCisjZGVmaW5lIEdMX0NPTE9SX0xPR0lDX09QICAgICAgICAgICAgICAgICAweDBCRjIKKyNkZWZpbmUgR0xfRElUSEVSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEJEMAorI2RlZmluZSBHTF9TVEVOQ0lMX1RFU1QgICAgICAgICAgICAgICAgICAgMHgwQjkwCisjZGVmaW5lIEdMX0RFUFRIX1RFU1QgICAgICAgICAgICAgICAgICAgICAweDBCNzEKKy8qICAgICAgR0xfTElHSFQwICovCisvKiAgICAgIEdMX0xJR0hUMSAqLworLyogICAgICBHTF9MSUdIVDIgKi8KKy8qICAgICAgR0xfTElHSFQzICovCisvKiAgICAgIEdMX0xJR0hUNCAqLworLyogICAgICBHTF9MSUdIVDUgKi8KKy8qICAgICAgR0xfTElHSFQ2ICovCisvKiAgICAgIEdMX0xJR0hUNyAqLworI2RlZmluZSBHTF9QT0lOVF9TTU9PVEggICAgICAgICAgICAgICAgICAgMHgwQjEwCisjZGVmaW5lIEdMX0xJTkVfU01PT1RIICAgICAgICAgICAgICAgICAgICAweDBCMjAKKyNkZWZpbmUgR0xfU0NJU1NPUl9URVNUICAgICAgICAgICAgICAgICAgIDB4MEMxMQorI2RlZmluZSBHTF9DT0xPUl9NQVRFUklBTCAgICAgICAgICAgICAgICAgMHgwQjU3CisjZGVmaW5lIEdMX05PUk1BTElaRSAgICAgICAgICAgICAgICAgICAgICAweDBCQTEKKyNkZWZpbmUgR0xfUkVTQ0FMRV9OT1JNQUwgICAgICAgICAgICAgICAgIDB4ODAzQQorI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9GSUxMICAgICAgICAgICAgMHg4MDM3CisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWSAgICAgICAgICAgICAgICAgICAweDgwNzQKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZICAgICAgICAgICAgICAgICAgIDB4ODA3NQorI2RlZmluZSBHTF9DT0xPUl9BUlJBWSAgICAgICAgICAgICAgICAgICAgMHg4MDc2CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkgICAgICAgICAgICAweDgwNzgKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEUgICAgICAgICAgICAgICAgICAgIDB4ODA5RAorI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgICAgICAgMHg4MDlFCisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19PTkUgICAgICAgICAgICAweDgwOUYKKyNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFICAgICAgICAgICAgICAgIDB4ODBBMAorCisvKiBFcnJvckNvZGUgKi8KKyNkZWZpbmUgR0xfTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfSU5WQUxJRF9FTlVNICAgICAgICAgICAgICAgICAgIDB4MDUwMAorI2RlZmluZSBHTF9JTlZBTElEX1ZBTFVFICAgICAgICAgICAgICAgICAgMHgwNTAxCisjZGVmaW5lIEdMX0lOVkFMSURfT1BFUkFUSU9OICAgICAgICAgICAgICAweDA1MDIKKyNkZWZpbmUgR0xfU1RBQ0tfT1ZFUkZMT1cgICAgICAgICAgICAgICAgIDB4MDUwMworI2RlZmluZSBHTF9TVEFDS19VTkRFUkZMT1cgICAgICAgICAgICAgICAgMHgwNTA0CisjZGVmaW5lIEdMX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAgICAgICAweDA1MDUKKworLyogRm9nTW9kZSAqLworLyogICAgICBHTF9MSU5FQVIgKi8KKyNkZWZpbmUgR0xfRVhQICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBHTF9FWFAyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAxCisKKy8qIEZvZ1BhcmFtZXRlciAqLworI2RlZmluZSBHTF9GT0dfREVOU0lUWSAgICAgICAgICAgICAgICAgICAgMHgwQjYyCisjZGVmaW5lIEdMX0ZPR19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAweDBCNjMKKyNkZWZpbmUgR0xfRk9HX0VORCAgICAgICAgICAgICAgICAgICAgICAgIDB4MEI2NAorI2RlZmluZSBHTF9GT0dfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgMHgwQjY1CisjZGVmaW5lIEdMX0ZPR19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAweDBCNjYKKworLyogRnJvbnRGYWNlRGlyZWN0aW9uICovCisjZGVmaW5lIEdMX0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDAKKyNkZWZpbmUgR0xfQ0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMQorCisvKiBHZXRQTmFtZSAqLworI2RlZmluZSBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgMHgwQjEyCisjZGVmaW5lIEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFICAgICAgICAweDBCMjIKKyNkZWZpbmUgR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFICAgICAgIDB4ODQ2RAorI2RlZmluZSBHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgMHg4NDZFCisjZGVmaW5lIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRV9PRVMgMHg4QjlBCisjZGVmaW5lIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUX09FUyAweDhCOUIKKyNkZWZpbmUgR0xfTUFYX0xJR0hUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQzMQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9TSVpFICAgICAgICAgICAgICAgMHgwRDMzCisjZGVmaW5lIEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggICAgICAweDBEMzYKKyNkZWZpbmUgR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggICAgIDB4MEQzOAorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSCAgICAgICAgMHgwRDM5CisjZGVmaW5lIEdMX01BWF9WSUVXUE9SVF9ESU1TICAgICAgICAgICAgICAweDBEM0EKKyNkZWZpbmUgR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTICAgICAgICAgIDB4ODBFOAorI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUyAgICAgICAgICAgMHg4MEU5CisjZGVmaW5lIEdMX01BWF9URVhUVVJFX1VOSVRTICAgICAgICAgICAgICAweDg0RTIKKyNkZWZpbmUgR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIDB4ODZBMgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgMHg4NkEzCisjZGVmaW5lIEdMX1NVQlBJWEVMX0JJVFMgICAgICAgICAgICAgICAgICAweDBENTAKKyNkZWZpbmUgR0xfUkVEX0JJVFMgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ1MgorI2RlZmluZSBHTF9HUkVFTl9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDUzCisjZGVmaW5lIEdMX0JMVUVfQklUUyAgICAgICAgICAgICAgICAgICAgICAweDBENTQKKyNkZWZpbmUgR0xfQUxQSEFfQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NQorI2RlZmluZSBHTF9ERVBUSF9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDU2CisjZGVmaW5lIEdMX1NURU5DSUxfQklUUyAgICAgICAgICAgICAgICAgICAweDBENTcKKworLyogSGludE1vZGUgKi8KKyNkZWZpbmUgR0xfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMAorI2RlZmluZSBHTF9GQVNURVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAxCisjZGVmaW5lIEdMX05JQ0VTVCAgICAgICAgICAgICAgICAgICAgICAgICAweDExMDIKKworLyogSGludFRhcmdldCAqLworI2RlZmluZSBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgICAgMHgwQzUwCisjZGVmaW5lIEdMX1BPSU5UX1NNT09USF9ISU5UICAgICAgICAgICAgICAweDBDNTEKKyNkZWZpbmUgR0xfTElORV9TTU9PVEhfSElOVCAgICAgICAgICAgICAgIDB4MEM1MgorI2RlZmluZSBHTF9QT0xZR09OX1NNT09USF9ISU5UICAgICAgICAgICAgMHgwQzUzCisjZGVmaW5lIEdMX0ZPR19ISU5UICAgICAgICAgICAgICAgICAgICAgICAweDBDNTQKKworLyogTGlnaHRNb2RlbFBhcmFtZXRlciAqLworI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UICAgICAgICAgICAgMHgwQjUzCisjZGVmaW5lIEdMX0xJR0hUX01PREVMX1RXT19TSURFICAgICAgICAgICAweDBCNTIKKworLyogTGlnaHRQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfQU1CSUVOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMAorI2RlZmluZSBHTF9ESUZGVVNFICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjAxCisjZGVmaW5lIEdMX1NQRUNVTEFSICAgICAgICAgICAgICAgICAgICAgICAweDEyMDIKKyNkZWZpbmUgR0xfUE9TSVRJT04gICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMworI2RlZmluZSBHTF9TUE9UX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgMHgxMjA0CisjZGVmaW5lIEdMX1NQT1RfRVhQT05FTlQgICAgICAgICAgICAgICAgICAweDEyMDUKKyNkZWZpbmUgR0xfU1BPVF9DVVRPRkYgICAgICAgICAgICAgICAgICAgIDB4MTIwNgorI2RlZmluZSBHTF9DT05TVEFOVF9BVFRFTlVBVElPTiAgICAgICAgICAgMHgxMjA3CisjZGVmaW5lIEdMX0xJTkVBUl9BVFRFTlVBVElPTiAgICAgICAgICAgICAweDEyMDgKKyNkZWZpbmUgR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OICAgICAgICAgIDB4MTIwOQorCisvKiBEYXRhVHlwZSAqLworI2RlZmluZSBHTF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDAwCisjZGVmaW5lIEdMX1VOU0lHTkVEX0JZVEUgICAgICAgICAgICAgICAgICAweDE0MDEKKyNkZWZpbmUgR0xfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwMgorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgMHgxNDAzCisjZGVmaW5lIEdMX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDYKKyNkZWZpbmUgR0xfRklYRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwQworCisvKiBMb2dpY09wICovCisjZGVmaW5lIEdMX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDAKKyNkZWZpbmUgR0xfQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwMQorI2RlZmluZSBHTF9BTkRfUkVWRVJTRSAgICAgICAgICAgICAgICAgICAgMHgxNTAyCisjZGVmaW5lIEdMX0NPUFkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDMKKyNkZWZpbmUgR0xfQU5EX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgIDB4MTUwNAorI2RlZmluZSBHTF9OT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA1CisjZGVmaW5lIEdMX1hPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDYKKyNkZWZpbmUgR0xfT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwNworI2RlZmluZSBHTF9OT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA4CisjZGVmaW5lIEdMX0VRVUlWICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDkKKyNkZWZpbmUgR0xfSU5WRVJUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwQQorI2RlZmluZSBHTF9PUl9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAgMHgxNTBCCisjZGVmaW5lIEdMX0NPUFlfSU5WRVJURUQgICAgICAgICAgICAgICAgICAweDE1MEMKKyNkZWZpbmUgR0xfT1JfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgIDB4MTUwRAorI2RlZmluZSBHTF9OQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTBFCisjZGVmaW5lIEdMX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MEYKKworLyogTWF0ZXJpYWxGYWNlICovCisvKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCisKKy8qIE1hdGVyaWFsUGFyYW1ldGVyICovCisjZGVmaW5lIEdMX0VNSVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAweDE2MDAKKyNkZWZpbmUgR0xfU0hJTklORVNTICAgICAgICAgICAgICAgICAgICAgIDB4MTYwMQorI2RlZmluZSBHTF9BTUJJRU5UX0FORF9ESUZGVVNFICAgICAgICAgICAgMHgxNjAyCisvKiAgICAgIEdMX0FNQklFTlQgKi8KKy8qICAgICAgR0xfRElGRlVTRSAqLworLyogICAgICBHTF9TUEVDVUxBUiAqLworCisvKiBNYXRyaXhNb2RlICovCisjZGVmaW5lIEdMX01PREVMVklFVyAgICAgICAgICAgICAgICAgICAgICAweDE3MDAKKyNkZWZpbmUgR0xfUFJPSkVDVElPTiAgICAgICAgICAgICAgICAgICAgIDB4MTcwMQorI2RlZmluZSBHTF9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgMHgxNzAyCisKKy8qIE5vcm1hbFBvaW50ZXJUeXBlICovCisvKiAgICAgIEdMX0JZVEUgKi8KKy8qICAgICAgR0xfU0hPUlQgKi8KKy8qICAgICAgR0xfRkxPQVQgKi8KKy8qICAgICAgR0xfRklYRUQgKi8KKworLyogUGl4ZWxGb3JtYXQgKi8KKyNkZWZpbmUgR0xfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwNgorI2RlZmluZSBHTF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA3CisjZGVmaW5lIEdMX1JHQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDgKKyNkZWZpbmUgR0xfTFVNSU5BTkNFICAgICAgICAgICAgICAgICAgICAgIDB4MTkwOQorI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEEgICAgICAgICAgICAgICAgMHgxOTBBCisKKy8qIFBpeGVsU3RvcmVQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfVU5QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgIDB4MENGNQorI2RlZmluZSBHTF9QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgMHgwRDA1CisKKy8qIFBpeGVsVHlwZSAqLworLyogICAgICBHTF9VTlNJR05FRF9CWVRFICovCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQgICAgICAgICAweDgwMzMKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSAgICAgICAgIDB4ODAzNAorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAgICAgICAgICAgMHg4MzYzCisKKy8qIFNoYWRpbmdNb2RlbCAqLworI2RlZmluZSBHTF9GTEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRDAwCisjZGVmaW5lIEdMX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAweDFEMDEKKworLyogU3RlbmNpbEZ1bmN0aW9uICovCisvKiAgICAgIEdMX05FVkVSICovCisvKiAgICAgIEdMX0xFU1MgKi8KKy8qICAgICAgR0xfRVFVQUwgKi8KKy8qICAgICAgR0xfTEVRVUFMICovCisvKiAgICAgIEdMX0dSRUFURVIgKi8KKy8qICAgICAgR0xfTk9URVFVQUwgKi8KKy8qICAgICAgR0xfR0VRVUFMICovCisvKiAgICAgIEdMX0FMV0FZUyAqLworCisvKiBTdGVuY2lsT3AgKi8KKy8qICAgICAgR0xfWkVSTyAqLworI2RlZmluZSBHTF9LRUVQICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAwCisjZGVmaW5lIEdMX1JFUExBQ0UgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDEKKyNkZWZpbmUgR0xfSU5DUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMgorI2RlZmluZSBHTF9ERUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAzCisvKiAgICAgIEdMX0lOVkVSVCAqLworCisvKiBTdHJpbmdOYW1lICovCisjZGVmaW5lIEdMX1ZFTkRPUiAgICAgICAgICAgICAgICAgICAgICAgICAweDFGMDAKKyNkZWZpbmUgR0xfUkVOREVSRVIgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMQorI2RlZmluZSBHTF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAyCisjZGVmaW5lIEdMX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgICAweDFGMDMKKworLyogVGV4Q29vcmRQb2ludGVyVHlwZSAqLworLyogICAgICBHTF9TSE9SVCAqLworLyogICAgICBHTF9GTE9BVCAqLworLyogICAgICBHTF9GSVhFRCAqLworLyogICAgICBHTF9CWVRFICovCisKKy8qIFRleHR1cmVFbnZNb2RlICovCisjZGVmaW5lIEdMX01PRFVMQVRFICAgICAgICAgICAgICAgICAgICAgICAweDIxMDAKKyNkZWZpbmUgR0xfREVDQUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEwMQorLyogICAgICBHTF9CTEVORCAqLworI2RlZmluZSBHTF9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA0CisvKiAgICAgIEdMX1JFUExBQ0UgKi8KKworLyogVGV4dHVyZUVudlBhcmFtZXRlciAqLworI2RlZmluZSBHTF9URVhUVVJFX0VOVl9NT0RFICAgICAgICAgICAgICAgMHgyMjAwCisjZGVmaW5lIEdMX1RFWFRVUkVfRU5WX0NPTE9SICAgICAgICAgICAgICAweDIyMDEKKworLyogVGV4dHVyZUVudlRhcmdldCAqLworI2RlZmluZSBHTF9URVhUVVJFX0VOViAgICAgICAgICAgICAgICAgICAgMHgyMzAwCisKKy8qIFRleHR1cmVNYWdGaWx0ZXIgKi8KKyNkZWZpbmUgR0xfTkVBUkVTVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MjYwMAorI2RlZmluZSBHTF9MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNjAxCisKKy8qIFRleHR1cmVNaW5GaWx0ZXIgKi8KKy8qICAgICAgR0xfTkVBUkVTVCAqLworLyogICAgICBHTF9MSU5FQVIgKi8KKyNkZWZpbmUgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAgICAgICAgIDB4MjcwMAorI2RlZmluZSBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QgICAgICAgICAgMHgyNzAxCisjZGVmaW5lIEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiAgICAgICAgICAweDI3MDIKKyNkZWZpbmUgR0xfTElORUFSX01JUE1BUF9MSU5FQVIgICAgICAgICAgIDB4MjcwMworCisvKiBUZXh0dXJlUGFyYW1ldGVyTmFtZSAqLworI2RlZmluZSBHTF9URVhUVVJFX01BR19GSUxURVIgICAgICAgICAgICAgMHgyODAwCisjZGVmaW5lIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAgICAgICAgICAgICAweDI4MDEKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1MgICAgICAgICAgICAgICAgIDB4MjgwMgorI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfVCAgICAgICAgICAgICAgICAgMHgyODAzCisKKy8qIFRleHR1cmVUYXJnZXQgKi8KKy8qICAgICAgR0xfVEVYVFVSRV8yRCAqLworCisvKiBUZXh0dXJlVW5pdCAqLworI2RlZmluZSBHTF9URVhUVVJFMCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMwCisjZGVmaW5lIEdMX1RFWFRVUkUxICAgICAgICAgICAgICAgICAgICAgICAweDg0QzEKKyNkZWZpbmUgR0xfVEVYVFVSRTIgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMgorI2RlZmluZSBHTF9URVhUVVJFMyAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMzCisjZGVmaW5lIEdMX1RFWFRVUkU0ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzQKKyNkZWZpbmUgR0xfVEVYVFVSRTUgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNQorI2RlZmluZSBHTF9URVhUVVJFNiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM2CisjZGVmaW5lIEdMX1RFWFRVUkU3ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzcKKyNkZWZpbmUgR0xfVEVYVFVSRTggICAgICAgICAgICAgICAgICAgICAgIDB4ODRDOAorI2RlZmluZSBHTF9URVhUVVJFOSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM5CisjZGVmaW5lIEdMX1RFWFRVUkUxMCAgICAgICAgICAgICAgICAgICAgICAweDg0Q0EKKyNkZWZpbmUgR0xfVEVYVFVSRTExICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQgorI2RlZmluZSBHTF9URVhUVVJFMTIgICAgICAgICAgICAgICAgICAgICAgMHg4NENDCisjZGVmaW5lIEdMX1RFWFRVUkUxMyAgICAgICAgICAgICAgICAgICAgICAweDg0Q0QKKyNkZWZpbmUgR0xfVEVYVFVSRTE0ICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRQorI2RlZmluZSBHTF9URVhUVVJFMTUgICAgICAgICAgICAgICAgICAgICAgMHg4NENGCisjZGVmaW5lIEdMX1RFWFRVUkUxNiAgICAgICAgICAgICAgICAgICAgICAweDg0RDAKKyNkZWZpbmUgR0xfVEVYVFVSRTE3ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMQorI2RlZmluZSBHTF9URVhUVVJFMTggICAgICAgICAgICAgICAgICAgICAgMHg4NEQyCisjZGVmaW5lIEdMX1RFWFRVUkUxOSAgICAgICAgICAgICAgICAgICAgICAweDg0RDMKKyNkZWZpbmUgR0xfVEVYVFVSRTIwICAgICAgICAgICAgICAgICAgICAgIDB4ODRENAorI2RlZmluZSBHTF9URVhUVVJFMjEgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ1CisjZGVmaW5lIEdMX1RFWFRVUkUyMiAgICAgICAgICAgICAgICAgICAgICAweDg0RDYKKyNkZWZpbmUgR0xfVEVYVFVSRTIzICAgICAgICAgICAgICAgICAgICAgIDB4ODRENworI2RlZmluZSBHTF9URVhUVVJFMjQgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ4CisjZGVmaW5lIEdMX1RFWFRVUkUyNSAgICAgICAgICAgICAgICAgICAgICAweDg0RDkKKyNkZWZpbmUgR0xfVEVYVFVSRTI2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQQorI2RlZmluZSBHTF9URVhUVVJFMjcgICAgICAgICAgICAgICAgICAgICAgMHg4NERCCisjZGVmaW5lIEdMX1RFWFRVUkUyOCAgICAgICAgICAgICAgICAgICAgICAweDg0REMKKyNkZWZpbmUgR0xfVEVYVFVSRTI5ICAgICAgICAgICAgICAgICAgICAgIDB4ODRERAorI2RlZmluZSBHTF9URVhUVVJFMzAgICAgICAgICAgICAgICAgICAgICAgMHg4NERFCisjZGVmaW5lIEdMX1RFWFRVUkUzMSAgICAgICAgICAgICAgICAgICAgICAweDg0REYKKworLyogVGV4dHVyZVdyYXBNb2RlICovCisjZGVmaW5lIEdMX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgICAweDI5MDEKKyNkZWZpbmUgR0xfQ0xBTVBfVE9fRURHRSAgICAgICAgICAgICAgICAgIDB4ODEyRgorCisvKiBQaXhlbEludGVybmFsRm9ybWF0ICovCisjZGVmaW5lIEdMX1BBTEVUVEU0X1JHQjhfT0VTICAgICAgICAgICAgICAweDhCOTAKKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCQThfT0VTICAgICAgICAgICAgIDB4OEI5MQorI2RlZmluZSBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVMgICAgICAgICAgMHg4QjkyCisjZGVmaW5lIEdMX1BBTEVUVEU0X1JHQkE0X09FUyAgICAgICAgICAgICAweDhCOTMKKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCNV9BMV9PRVMgICAgICAgICAgIDB4OEI5NAorI2RlZmluZSBHTF9QQUxFVFRFOF9SR0I4X09FUyAgICAgICAgICAgICAgMHg4Qjk1CisjZGVmaW5lIEdMX1BBTEVUVEU4X1JHQkE4X09FUyAgICAgICAgICAgICAweDhCOTYKKyNkZWZpbmUgR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTICAgICAgICAgIDB4OEI5NworI2RlZmluZSBHTF9QQUxFVFRFOF9SR0JBNF9PRVMgICAgICAgICAgICAgMHg4Qjk4CisjZGVmaW5lIEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTICAgICAgICAgICAweDhCOTkKKworLyogVmVydGV4UG9pbnRlclR5cGUgKi8KKy8qICAgICAgR0xfU0hPUlQgKi8KKy8qICAgICAgR0xfRkxPQVQgKi8KKy8qICAgICAgR0xfRklYRUQgKi8KKy8qICAgICAgR0xfQllURSAqLworCisvKiBMaWdodE5hbWUgKi8KKyNkZWZpbmUgR0xfTElHSFQwICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBHTF9MSUdIVDEgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAxCisjZGVmaW5lIEdMX0xJR0hUMiAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDIKKyNkZWZpbmUgR0xfTElHSFQzICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMworI2RlZmluZSBHTF9MSUdIVDQgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA0CisjZGVmaW5lIEdMX0xJR0hUNSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDUKKyNkZWZpbmUgR0xfTElHSFQ2ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNgorI2RlZmluZSBHTF9MSUdIVDcgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA3CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWxwaGFGdW5jIChHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBbHBoYUZ1bmN4IChHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kVGV4dHVyZSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRnVuYyAoR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhciAoR0xiaXRmaWVsZCBtYXNrKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckNvbG9yIChHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJDb2xvcnggKEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckRlcHRoZiAoR0xjbGFtcGYgZGVwdGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyRGVwdGh4IChHTGNsYW1weCBkZXB0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJTdGVuY2lsIChHTGludCBzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGllbnRBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0ZiAoR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0eCAoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JNYXNrIChHTGJvb2xlYW4gcmVkLCBHTGJvb2xlYW4gZ3JlZW4sIEdMYm9vbGVhbiBibHVlLCBHTGJvb2xlYW4gYWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yUG9pbnRlciAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ3VsbEZhY2UgKEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVUZXh0dXJlcyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aEZ1bmMgKEdMZW51bSBmdW5jKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aE1hc2sgKEdMYm9vbGVhbiBmbGFnKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aFJhbmdlZiAoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoUmFuZ2V4IChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGlzYWJsZSAoR0xlbnVtIGNhcCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGlzYWJsZUNsaWVudFN0YXRlIChHTGVudW0gYXJyYXkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdBcnJheXMgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0VsZW1lbnRzIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5hYmxlIChHTGVudW0gY2FwKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmFibGVDbGllbnRTdGF0ZSAoR0xlbnVtIGFycmF5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGaW5pc2ggKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZsdXNoICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dmIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ2Z2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9neCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2d4diAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyb250RmFjZSAoR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZydXN0dW1mIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcnVzdHVteCAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuVGV4dHVyZXMgKEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcyk7CitHTEFQSSBHTGVudW0gQVBJRU5UUlkgZ2xHZXRFcnJvciAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW50ZWdlcnYgKEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSBjb25zdCBHTHVieXRlICogQVBJRU5UUlkgZ2xHZXRTdHJpbmcgKEdMZW51bSBuYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xIaW50IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRNb2RlbGYgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRNb2RlbGZ2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRNb2RlbHggKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRNb2RlbHh2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRmIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRmdiAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHR4IChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHR4diAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGluZVdpZHRoIChHTGZsb2F0IHdpZHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaW5lV2lkdGh4IChHTGZpeGVkIHdpZHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkSWRlbnRpdHkgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvYWRNYXRyaXhmIChjb25zdCBHTGZsb2F0ICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkTWF0cml4eCAoY29uc3QgR0xmaXhlZCAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9naWNPcCAoR0xlbnVtIG9wY29kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0ZXJpYWxmIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRlcmlhbGZ2IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdGVyaWFseCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0ZXJpYWx4diAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhNb2RlIChHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdE1hdHJpeGYgKGNvbnN0IEdMZmxvYXQgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRNYXRyaXh4IChjb25zdCBHTGZpeGVkICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGYgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDR4IChHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbDNmIChHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWwzeCAoR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsUG9pbnRlciAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE9ydGhvZiAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsT3J0aG94IChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbFN0b3JlaSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRTaXplIChHTGZsb2F0IHNpemUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50U2l6ZXggKEdMZml4ZWQgc2l6ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9seWdvbk9mZnNldCAoR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvbHlnb25PZmZzZXR4IChHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9wTWF0cml4ICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQdXNoTWF0cml4ICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZWFkUGl4ZWxzIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSb3RhdGVmIChHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSb3RhdGV4IChHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZSAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZUNvdmVyYWdleCAoR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNjYWxlZiAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2NhbGV4IChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTY2lzc29yIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhZGVNb2RlbCAoR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxGdW5jIChHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbE1hc2sgKEdMdWludCBtYXNrKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGVuY2lsT3AgKEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmRQb2ludGVyIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4RW52ZiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhFbnZmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEVudnggKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4RW52eHYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4UGFyYW1ldGVyZiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJ4IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUcmFuc2xhdGVmIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUcmFuc2xhdGV4IChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhQb2ludGVyIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmlld3BvcnQgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fZ2xfaF8gKi8KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtQlNELnR4dCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtQlNELnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTI0ZTNjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS1CU0QudHh0CkBAIC0wLDAgKzEsMzQgQEAKK1RoaXMgaXMgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvciB0aGUgIlNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIg0KK09wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUgc291cmNlIGNvZGUNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlDQorQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIEpldHJvIExhdWhhDQorQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisNCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMNCithcmUgbWV0Og0KKw0KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0DQorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluDQorICAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKyAgICAgIGRpc3RyaWJ1dGlvbi4NCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBzb2Z0d2FyZSBwcm9kdWN0J3MgY29weXJpZ2h0IG93bmVyIG5vcg0KKyAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQ0KKyAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbg0KKyAgICAgIHBlcm1pc3Npb24uDQorDQorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCitPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQNCitUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SDQorUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRg0KK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HDQorTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTDQorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS1MR1BMLnR4dCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtTEdQTC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFlM2Y1YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtTEdQTC50eHQKQEAgLTAsMCArMSw1MDQgQEAKKwkJICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMi4xLCBGZWJydWFyeSAxOTk5CisKKyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIExlc3NlciBHUEwuICBJdCBhbHNvIGNvdW50cworIGFzIHRoZSBzdWNjZXNzb3Igb2YgdGhlIEdOVSBMaWJyYXJ5IFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGhlbmNlCisgdGhlIHZlcnNpb24gbnVtYmVyIDIuMS5dCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlcyBhcmUgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlCitmcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuCisKKyAgVGhpcyBsaWNlbnNlLCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZQorc3BlY2lhbGx5IGRlc2lnbmF0ZWQgc29mdHdhcmUgcGFja2FnZXMtLXR5cGljYWxseSBsaWJyYXJpZXMtLW9mIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBvdGhlciBhdXRob3JzIHdobyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91CitjYW4gdXNlIGl0IHRvbywgYnV0IHdlIHN1Z2dlc3QgeW91IGZpcnN0IHRoaW5rIGNhcmVmdWxseSBhYm91dCB3aGV0aGVyCit0aGlzIGxpY2Vuc2Ugb3IgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgdGhlIGJldHRlcgorc3RyYXRlZ3kgdG8gdXNlIGluIGFueSBwYXJ0aWN1bGFyIGNhc2UsIGJhc2VkIG9uIHRoZSBleHBsYW5hdGlvbnMgYmVsb3cuCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20gb2YgdXNlLAorbm90IHByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdAoreW91IGhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZQorZm9yIHRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCk7IHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldAoraXQgaWYgeW91IHdhbnQgaXQ7IHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIGFuZCB1c2UgcGllY2VzIG9mCitpdCBpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGFyZSBpbmZvcm1lZCB0aGF0IHlvdSBjYW4gZG8KK3RoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCitkaXN0cmlidXRvcnMgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZXNlCityaWdodHMuICBUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IKK3lvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnkgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcworb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoreW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQorY29kZS4gIElmIHlvdSBsaW5rIG90aGVyIGNvZGUgd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQorY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzLCBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtCit3aXRoIHRoZSBsaWJyYXJ5IGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZworaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIGEgdHdvLXN0ZXAgbWV0aG9kOiAoMSkgd2UgY29weXJpZ2h0IHRoZQorbGlicmFyeSwgYW5kICgyKSB3ZSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlLCB3aGljaCBnaXZlcyB5b3UgbGVnYWwKK3Blcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgorCisgIFRvIHByb3RlY3QgZWFjaCBkaXN0cmlidXRvciwgd2Ugd2FudCB0byBtYWtlIGl0IHZlcnkgY2xlYXIgdGhhdAordGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSBmcmVlIGxpYnJhcnkuICBBbHNvLCBpZiB0aGUgbGlicmFyeSBpcworbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHRoZSByZWNpcGllbnRzIHNob3VsZCBrbm93Cit0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwgdmVyc2lvbiwgc28gdGhhdCB0aGUgb3JpZ2luYWwKK2F1dGhvcidzIHJlcHV0YXRpb24gd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgcHJvYmxlbXMgdGhhdCBtaWdodCBiZQoraW50cm9kdWNlZCBieSBvdGhlcnMuCisMCisgIEZpbmFsbHksIHNvZnR3YXJlIHBhdGVudHMgcG9zZSBhIGNvbnN0YW50IHRocmVhdCB0byB0aGUgZXhpc3RlbmNlIG9mCithbnkgZnJlZSBwcm9ncmFtLiAgV2Ugd2lzaCB0byBtYWtlIHN1cmUgdGhhdCBhIGNvbXBhbnkgY2Fubm90CitlZmZlY3RpdmVseSByZXN0cmljdCB0aGUgdXNlcnMgb2YgYSBmcmVlIHByb2dyYW0gYnkgb2J0YWluaW5nIGEKK3Jlc3RyaWN0aXZlIGxpY2Vuc2UgZnJvbSBhIHBhdGVudCBob2xkZXIuICBUaGVyZWZvcmUsIHdlIGluc2lzdCB0aGF0CithbnkgcGF0ZW50IGxpY2Vuc2Ugb2J0YWluZWQgZm9yIGEgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBtdXN0IGJlCitjb25zaXN0ZW50IHdpdGggdGhlIGZ1bGwgZnJlZWRvbSBvZiB1c2Ugc3BlY2lmaWVkIGluIHRoaXMgbGljZW5zZS4KKworICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIGxpY2Vuc2UsIHRoZSBHTlUgTGVzc2VyCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4gZGVzaWduYXRlZCBsaWJyYXJpZXMsIGFuZAoraXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBXZSB1c2UKK3RoaXMgbGljZW5zZSBmb3IgY2VydGFpbiBsaWJyYXJpZXMgaW4gb3JkZXIgdG8gcGVybWl0IGxpbmtpbmcgdGhvc2UKK2xpYnJhcmllcyBpbnRvIG5vbi1mcmVlIHByb2dyYW1zLgorCisgIFdoZW4gYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIGEgbGlicmFyeSwgd2hldGhlciBzdGF0aWNhbGx5IG9yIHVzaW5nCithIHNoYXJlZCBsaWJyYXJ5LCB0aGUgY29tYmluYXRpb24gb2YgdGhlIHR3byBpcyBsZWdhbGx5IHNwZWFraW5nIGEKK2NvbWJpbmVkIHdvcmssIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeS4gIFRoZSBvcmRpbmFyeQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0aGVyZWZvcmUgcGVybWl0cyBzdWNoIGxpbmtpbmcgb25seSBpZiB0aGUKK2VudGlyZSBjb21iaW5hdGlvbiBmaXRzIGl0cyBjcml0ZXJpYSBvZiBmcmVlZG9tLiAgVGhlIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBwZXJtaXRzIG1vcmUgbGF4IGNyaXRlcmlhIGZvciBsaW5raW5nIG90aGVyIGNvZGUgd2l0aAordGhlIGxpYnJhcnkuCisKKyAgV2UgY2FsbCB0aGlzIGxpY2Vuc2UgdGhlICJMZXNzZXIiIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYmVjYXVzZSBpdAorZG9lcyBMZXNzIHRvIHByb3RlY3QgdGhlIHVzZXIncyBmcmVlZG9tIHRoYW4gdGhlIG9yZGluYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlLiAgSXQgYWxzbyBwcm92aWRlcyBvdGhlciBmcmVlIHNvZnR3YXJlIGRldmVsb3BlcnMgTGVzcworb2YgYW4gYWR2YW50YWdlIG92ZXIgY29tcGV0aW5nIG5vbi1mcmVlIHByb2dyYW1zLiAgVGhlc2UgZGlzYWR2YW50YWdlcworYXJlIHRoZSByZWFzb24gd2UgdXNlIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtYW55CitsaWJyYXJpZXMuICBIb3dldmVyLCB0aGUgTGVzc2VyIGxpY2Vuc2UgcHJvdmlkZXMgYWR2YW50YWdlcyBpbiBjZXJ0YWluCitzcGVjaWFsIGNpcmN1bXN0YW5jZXMuCisKKyAgRm9yIGV4YW1wbGUsIG9uIHJhcmUgb2NjYXNpb25zLCB0aGVyZSBtYXkgYmUgYSBzcGVjaWFsIG5lZWQgdG8KK2VuY291cmFnZSB0aGUgd2lkZXN0IHBvc3NpYmxlIHVzZSBvZiBhIGNlcnRhaW4gbGlicmFyeSwgc28gdGhhdCBpdCBiZWNvbWVzCithIGRlLWZhY3RvIHN0YW5kYXJkLiAgVG8gYWNoaWV2ZSB0aGlzLCBub24tZnJlZSBwcm9ncmFtcyBtdXN0IGJlCithbGxvd2VkIHRvIHVzZSB0aGUgbGlicmFyeS4gIEEgbW9yZSBmcmVxdWVudCBjYXNlIGlzIHRoYXQgYSBmcmVlCitsaWJyYXJ5IGRvZXMgdGhlIHNhbWUgam9iIGFzIHdpZGVseSB1c2VkIG5vbi1mcmVlIGxpYnJhcmllcy4gIEluIHRoaXMKK2Nhc2UsIHRoZXJlIGlzIGxpdHRsZSB0byBnYWluIGJ5IGxpbWl0aW5nIHRoZSBmcmVlIGxpYnJhcnkgdG8gZnJlZQorc29mdHdhcmUgb25seSwgc28gd2UgdXNlIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICBJbiBvdGhlciBjYXNlcywgcGVybWlzc2lvbiB0byB1c2UgYSBwYXJ0aWN1bGFyIGxpYnJhcnkgaW4gbm9uLWZyZWUKK3Byb2dyYW1zIGVuYWJsZXMgYSBncmVhdGVyIG51bWJlciBvZiBwZW9wbGUgdG8gdXNlIGEgbGFyZ2UgYm9keSBvZgorZnJlZSBzb2Z0d2FyZS4gIEZvciBleGFtcGxlLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgR05VIEMgTGlicmFyeSBpbgorbm9uLWZyZWUgcHJvZ3JhbXMgZW5hYmxlcyBtYW55IG1vcmUgcGVvcGxlIHRvIHVzZSB0aGUgd2hvbGUgR05VCitvcGVyYXRpbmcgc3lzdGVtLCBhcyB3ZWxsIGFzIGl0cyB2YXJpYW50LCB0aGUgR05VL0xpbnV4IG9wZXJhdGluZworc3lzdGVtLgorCisgIEFsdGhvdWdoIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBMZXNzIHByb3RlY3RpdmUgb2YgdGhlCit1c2VycycgZnJlZWRvbSwgaXQgZG9lcyBlbnN1cmUgdGhhdCB0aGUgdXNlciBvZiBhIHByb2dyYW0gdGhhdCBpcworbGlua2VkIHdpdGggdGhlIExpYnJhcnkgaGFzIHRoZSBmcmVlZG9tIGFuZCB0aGUgd2hlcmV3aXRoYWwgdG8gcnVuCit0aGF0IHByb2dyYW0gdXNpbmcgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5LgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LiAgUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEKKyJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCitmb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoZXJlYXMgdGhlIGxhdHRlciBtdXN0CitiZSBjb21iaW5lZCB3aXRoIHRoZSBsaWJyYXJ5IGluIG9yZGVyIHRvIHJ1bi4KKwwKKwkJICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSBvciBvdGhlcgorcHJvZ3JhbSB3aGljaCBjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3IKK290aGVyIGF1dGhvcml6ZWQgcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKK3RoaXMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4KK0VhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCisgIEEgImxpYnJhcnkiIG1lYW5zIGEgY29sbGVjdGlvbiBvZiBzb2Z0d2FyZSBmdW5jdGlvbnMgYW5kL29yIGRhdGEKK3ByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcworKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KKworICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yaword2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSIgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKK2NvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCitwb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCitzdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCitpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQorCisgICJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCithbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAoraW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uCithbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCitzdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCit3cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCithbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KKyAgCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncworY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKK3lvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCithcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAorYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKK3dhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCitMaWJyYXJ5LgorCisgIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCithbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCitmZWUuCisMCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KKyAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQorICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKKyAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5CisgICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCisgICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCisgICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKKyAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCisKKyAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcworICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKKyAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQorICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0CisgICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKKyAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCitpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQord2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwordGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwordGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAoraW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQordGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgordGhlc2Ugbm90aWNlcy4KKwwKKyAgT25jZSB0aGlzIGNoYW5nZSBpcyBtYWRlIGluIGEgZ2l2ZW4gY29weSwgaXQgaXMgaXJyZXZlcnNpYmxlIGZvcgordGhhdCBjb3B5LCBzbyB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBhbGwKK3N1YnNlcXVlbnQgY29waWVzIGFuZCBkZXJpdmF0aXZlIHdvcmtzIG1hZGUgZnJvbSB0aGF0IGNvcHkuCisKKyAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IHdpc2ggdG8gY29weSBwYXJ0IG9mIHRoZSBjb2RlIG9mCit0aGUgTGlicmFyeSBpbnRvIGEgcHJvZ3JhbSB0aGF0IGlzIG5vdCBhIGxpYnJhcnkuCisKKyAgNC4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhIHBvcnRpb24gb3IKK2Rlcml2YXRpdmUgb2YgaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtCit1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhY2NvbXBhbnkKK2l0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSwgd2hpY2gKK211c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgorCisgIElmIGRpc3RyaWJ1dGlvbiBvZiBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Citmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZQorc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50IHRvCitkaXN0cmlidXRlIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorCisgIDUuIEEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIG5vIGRlcml2YXRpdmUgb2YgYW55IHBvcnRpb24gb2YgdGhlCitMaWJyYXJ5LCBidXQgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIHRoZSBMaWJyYXJ5IGJ5IGJlaW5nIGNvbXBpbGVkIG9yCitsaW5rZWQgd2l0aCBpdCwgaXMgY2FsbGVkIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5Ii4gIFN1Y2ggYQord29yaywgaW4gaXNvbGF0aW9uLCBpcyBub3QgYSBkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnksIGFuZAordGhlcmVmb3JlIGZhbGxzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICBIb3dldmVyLCBsaW5raW5nIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5CitjcmVhdGVzIGFuIGV4ZWN1dGFibGUgdGhhdCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnkgKGJlY2F1c2UgaXQKK2NvbnRhaW5zIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5KSwgcmF0aGVyIHRoYW4gYSAid29yayB0aGF0IHVzZXMgdGhlCitsaWJyYXJ5Ii4gIFRoZSBleGVjdXRhYmxlIGlzIHRoZXJlZm9yZSBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KK1NlY3Rpb24gNiBzdGF0ZXMgdGVybXMgZm9yIGRpc3RyaWJ1dGlvbiBvZiBzdWNoIGV4ZWN1dGFibGVzLgorCisgIFdoZW4gYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHVzZXMgbWF0ZXJpYWwgZnJvbSBhIGhlYWRlciBmaWxlCit0aGF0IGlzIHBhcnQgb2YgdGhlIExpYnJhcnksIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgbWF5IGJlIGEKK2Rlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSBldmVuIHRob3VnaCB0aGUgc291cmNlIGNvZGUgaXMgbm90LgorV2hldGhlciB0aGlzIGlzIHRydWUgaXMgZXNwZWNpYWxseSBzaWduaWZpY2FudCBpZiB0aGUgd29yayBjYW4gYmUKK2xpbmtlZCB3aXRob3V0IHRoZSBMaWJyYXJ5LCBvciBpZiB0aGUgd29yayBpcyBpdHNlbGYgYSBsaWJyYXJ5LiAgVGhlCit0aHJlc2hvbGQgZm9yIHRoaXMgdG8gYmUgdHJ1ZSBpcyBub3QgcHJlY2lzZWx5IGRlZmluZWQgYnkgbGF3LgorCisgIElmIHN1Y2ggYW4gb2JqZWN0IGZpbGUgdXNlcyBvbmx5IG51bWVyaWNhbCBwYXJhbWV0ZXJzLCBkYXRhCitzdHJ1Y3R1cmUgbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBhbmQgc21hbGwgbWFjcm9zIGFuZCBzbWFsbCBpbmxpbmUKK2Z1bmN0aW9ucyAodGVuIGxpbmVzIG9yIGxlc3MgaW4gbGVuZ3RoKSwgdGhlbiB0aGUgdXNlIG9mIHRoZSBvYmplY3QKK2ZpbGUgaXMgdW5yZXN0cmljdGVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgbGVnYWxseSBhIGRlcml2YXRpdmUKK3dvcmsuICAoRXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGlzIG9iamVjdCBjb2RlIHBsdXMgcG9ydGlvbnMgb2YgdGhlCitMaWJyYXJ5IHdpbGwgc3RpbGwgZmFsbCB1bmRlciBTZWN0aW9uIDYuKQorCisgIE90aGVyd2lzZSwgaWYgdGhlIHdvcmsgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5LCB5b3UgbWF5CitkaXN0cmlidXRlIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gNi4KK0FueSBleGVjdXRhYmxlcyBjb250YWluaW5nIHRoYXQgd29yayBhbHNvIGZhbGwgdW5kZXIgU2VjdGlvbiA2LAord2hldGhlciBvciBub3QgdGhleSBhcmUgbGlua2VkIGRpcmVjdGx5IHdpdGggdGhlIExpYnJhcnkgaXRzZWxmLgorDAorICA2LiBBcyBhbiBleGNlcHRpb24gdG8gdGhlIFNlY3Rpb25zIGFib3ZlLCB5b3UgbWF5IGFsc28gY29tYmluZSBvcgorbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKK3dvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCit1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Cittb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKK2VuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgorCisgIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQorTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5Cit0aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCitkdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQorY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQorZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQorb2YgdGhlc2UgdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKKyAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKKyAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgorICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCisgICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0CisgICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKKyAgICB1c2VyIGNhbiBtb2RpZnkgdGhlIExpYnJhcnkgYW5kIHRoZW4gcmVsaW5rIHRvIHByb2R1Y2UgYSBtb2RpZmllZAorICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCisgICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCisgICAgTGlicmFyeSB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBhYmxlIHRvIHJlY29tcGlsZSB0aGUgYXBwbGljYXRpb24KKyAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKKworICAgIGIpIFVzZSBhIHN1aXRhYmxlIHNoYXJlZCBsaWJyYXJ5IG1lY2hhbmlzbSBmb3IgbGlua2luZyB3aXRoIHRoZQorICAgIExpYnJhcnkuICBBIHN1aXRhYmxlIG1lY2hhbmlzbSBpcyBvbmUgdGhhdCAoMSkgdXNlcyBhdCBydW4gdGltZSBhCisgICAgY29weSBvZiB0aGUgbGlicmFyeSBhbHJlYWR5IHByZXNlbnQgb24gdGhlIHVzZXIncyBjb21wdXRlciBzeXN0ZW0sCisgICAgcmF0aGVyIHRoYW4gY29weWluZyBsaWJyYXJ5IGZ1bmN0aW9ucyBpbnRvIHRoZSBleGVjdXRhYmxlLCBhbmQgKDIpCisgICAgd2lsbCBvcGVyYXRlIHByb3Blcmx5IHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCBpZgorICAgIHRoZSB1c2VyIGluc3RhbGxzIG9uZSwgYXMgbG9uZyBhcyB0aGUgbW9kaWZpZWQgdmVyc2lvbiBpcworICAgIGludGVyZmFjZS1jb21wYXRpYmxlIHdpdGggdGhlIHZlcnNpb24gdGhhdCB0aGUgd29yayB3YXMgbWFkZSB3aXRoLgorCisgICAgYykgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQKKyAgICBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMKKyAgICBzcGVjaWZpZWQgaW4gU3Vic2VjdGlvbiA2YSwgYWJvdmUsIGZvciBhIGNoYXJnZSBubyBtb3JlCisgICAgdGhhbiB0aGUgY29zdCBvZiBwZXJmb3JtaW5nIHRoaXMgZGlzdHJpYnV0aW9uLgorCisgICAgZCkgSWYgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKKyAgICBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKKyAgICBzcGVjaWZpZWQgbWF0ZXJpYWxzIGZyb20gdGhlIHNhbWUgcGxhY2UuCisKKyAgICBlKSBWZXJpZnkgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlc2UKKyAgICBtYXRlcmlhbHMgb3IgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyB1c2VyIGEgY29weS4KKworICBGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlICJ3b3JrIHRoYXQgdXNlcyB0aGUKK0xpYnJhcnkiIG11c3QgaW5jbHVkZSBhbnkgZGF0YSBhbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yCityZXByb2R1Y2luZyB0aGUgZXhlY3V0YWJsZSBmcm9tIGl0LiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwKK3RoZSBtYXRlcmlhbHMgdG8gYmUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzCitub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKK2NvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KK3doaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKK3RoZSBleGVjdXRhYmxlLgorCisgIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCityZXN0cmljdGlvbnMgb2Ygb3RoZXIgcHJvcHJpZXRhcnkgbGlicmFyaWVzIHRoYXQgZG8gbm90IG5vcm1hbGx5CithY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90Cit1c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91CitkaXN0cmlidXRlLgorDAorICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQorZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAorbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCit0aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKK3Blcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yaworICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKKyAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAgICBTZWN0aW9ucyBhYm92ZS4KKworICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0CisgICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKKyAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCisKKyAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKK3RoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55CithdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgorcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAorb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwordGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5CitzdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoCit0aGlzIExpY2Vuc2UuCisMCisgIDExLiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkgYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQorcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5LAorYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkCithbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKK3NvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cworZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYKK3dyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEzLiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldwordmVyc2lvbnMgb2YgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgorU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAorYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5CitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKKyJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKK2xpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorDAorICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCit3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcworY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKK2RlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKK29mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCithbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KK1dBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCitFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgorT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKK0tJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKK0xJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCitUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KK1dSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCitBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQorRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKK0xJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKK1JFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCitTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICitEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKK2V2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZworcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCitvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KKworICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4gIEl0IGlzCitzYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCisiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIGxpYnJhcnkncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQorICBsaWJyYXJ5IGBGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcyBSYW5kb20gSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQorCisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UudHh0IGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwODQxZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UudHh0CkBAIC0wLDAgKzEsMTkgQEAKK1NhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUNCitDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhDQorQWxsIHJpZ2h0cyByZXNlcnZlZC4NCitXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vDQorDQorVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6DQorICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUNCisgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdA0KKyAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXINCisgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlDQorICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0Lg0KKyAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4NCisgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuDQorDQorVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcw0KK0xJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLg0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL3NoYXBlcy5oIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvc2hhcGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVmZmFlOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL3NoYXBlcy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGEKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vCisgKgorICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKKyAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgorICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQorICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgorICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgorICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgorICoKKyAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCisgKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAkSWQ6IHNoYXBlcy5oLHYgMS42IDIwMDUvMDEvMzEgMjI6MTU6MzAgdG9uaWMgRXhwICQKKyAqICRSZXZpc2lvbjogMS42ICQKKyAqLworCisjaWZuZGVmIFNIQVBFU19IX0lOQ0xVREVECisjZGVmaW5lIFNIQVBFU19IX0lOQ0xVREVECisKKworI2RlZmluZSBTVVBFUlNIQVBFX1BBUkFNUyAxNQorCitzdGF0aWMgY29uc3QgZmxvYXQgc1N1cGVyU2hhcGVQYXJhbXNbXVtTVVBFUlNIQVBFX1BBUkFNU10gPQoreworICAgIC8vIG0gIGEgICAgIGIgICAgIG4xICAgICAgbjIgICAgIG4zICAgICBtICAgICBhICAgICBiICAgICBuMSAgICAgbjIgICAgICBuMyAgIHJlczEgcmVzMiBzY2FsZSAgKG9yZy5yZXMxLHJlczIpCisgICAgeyAxMCwgMSwgICAgMiwgICAgOTAsICAgICAgMSwgICAtNDUsICAgIDgsICAgIDEsICAgIDEsICAgIC0xLCAgICAgMSwgIC0wLjRmLCAgIDIwLCAgMzAsIDIgfSwgLy8gNDAsIDYwCisgICAgeyAxMCwgMSwgICAgMiwgICAgOTAsICAgICAgMSwgICAtNDUsICAgIDQsICAgIDEsICAgIDEsICAgIDEwLCAgICAgMSwgIC0wLjRmLCAgIDIwLCAgMjAsIDQgfSwgLy8gNDAsIDQwCisgICAgeyAxMCwgMSwgICAgMiwgICAgNjAsICAgICAgMSwgICAtMTAsICAgIDQsICAgIDEsICAgIDEsICAgIC0xLCAgICAtMiwgIC0wLjRmLCAgIDQxLCAgNDEsIDEgfSwgLy8gODIsIDgyCisgICAgeyAgNiwgMSwgICAgMSwgICAgNjAsICAgICAgMSwgICAtNzAsICAgIDgsICAgIDEsICAgIDEsICAwLjRmLCAgICAgMywgIDAuMjVmLCAgIDIwLCAgMjAsIDEgfSwgLy8gNDAsIDQwCisgICAgeyAgNCwgMSwgICAgMSwgICAgMzAsICAgICAgMSwgICAgMjAsICAgMTIsICAgIDEsICAgIDEsICAwLjRmLCAgICAgMywgIDAuMjVmLCAgIDEwLCAgMzAsIDEgfSwgLy8gMjAsIDYwCisgICAgeyAgOCwgMSwgICAgMSwgICAgMzAsICAgICAgMSwgICAgLTQsICAgIDgsICAgIDIsICAgIDEsICAgIC0xLCAgICAgNSwgICAwLjVmLCAgIDI1LCAgMjYsIDEgfSwgLy8gNjAsIDYwCisgICAgeyAxMywgMSwgICAgMSwgICAgMzAsICAgICAgMSwgICAgLTQsICAgMTMsICAgIDEsICAgIDEsICAgICAxLCAgICAgNSwgICAgICAxLCAgIDMwLCAgMzAsIDYgfSwgLy8gNjAsIDYwCisgICAgeyAxMCwgMSwgMS4xZiwgLTAuNWYsICAgMC4xZiwgICAgNzAsICAgNjAsICAgIDEsICAgIDEsICAgLTkwLCAgICAgMCwgLTAuMjVmLCAgIDIwLCAgNjAsIDggfSwgLy8gNjAsIDE4MAorICAgIHsgIDcsIDEsICAgIDEsICAgIDIwLCAgLTAuM2YsIC0zLjVmLCAgICA2LCAgICAxLCAgICAxLCAgICAtMSwgIDQuNWYsICAgMC41ZiwgICAxMCwgIDIwLCA0IH0sIC8vIDYwLCA4MAorICAgIHsgIDQsIDEsICAgIDEsICAgIDEwLCAgICAgMTAsICAgIDEwLCAgICA0LCAgICAxLCAgICAxLCAgICAxMCwgICAgMTAsICAgICAxMCwgICAxMCwgIDIwLCAxIH0sIC8vIDIwLCA0MAorICAgIHsgIDQsIDEsICAgIDEsICAgICAxLCAgICAgIDEsICAgICAxLCAgICA0LCAgICAxLCAgICAxLCAgICAgMSwgICAgIDEsICAgICAgMSwgICAxMCwgIDEwLCAyIH0sIC8vIDEwLCAxMAorICAgIHsgIDEsIDEsICAgIDEsICAgIDM4LCAtMC4yNWYsICAgIDE5LCAgICA0LCAgICAxLCAgICAxLCAgICAxMCwgICAgMTAsICAgICAxMCwgICAxMCwgIDE1LCAyIH0sIC8vIDIwLCA0MAorICAgIHsgIDIsIDEsICAgIDEsICAwLjdmLCAgIDAuM2YsICAwLjJmLCAgICAzLCAgICAxLCAgICAxLCAgIDEwMCwgICAxMDAsICAgIDEwMCwgICAxMCwgIDI1LCAyIH0sIC8vIDIwLCA1MAorICAgIHsgIDYsIDEsICAgIDEsICAgICAxLCAgICAgIDEsICAgICAxLCAgICAzLCAgICAxLCAgICAxLCAgICAgMSwgICAgIDEsICAgICAgMSwgICAzMCwgIDMwLCAyIH0sIC8vIDYwLCA2MAorICAgIHsgIDMsIDEsICAgIDEsICAgICAxLCAgICAgIDEsICAgICAxLCAgICA2LCAgICAxLCAgICAxLCAgICAgMiwgICAgIDEsICAgICAgMSwgICAxMCwgIDIwLCAyIH0sIC8vIDIwLCA0MAorICAgIHsgIDYsIDEsICAgIDEsICAgICA2LCAgIDUuNWYsICAgMTAwLCAgICA2LCAgICAxLCAgICAxLCAgICAyNSwgICAgMTAsICAgICAxMCwgICAzMCwgIDIwLCAyIH0sIC8vIDYwLCA0MAorICAgIHsgIDMsIDEsICAgIDEsICAwLjVmLCAgIDEuN2YsICAxLjdmLCAgICAyLCAgICAxLCAgICAxLCAgICAxMCwgICAgMTAsICAgICAxMCwgICAyMCwgIDIwLCAyIH0sIC8vIDQwLCA0MAorICAgIHsgIDUsIDEsICAgIDEsICAwLjFmLCAgIDEuN2YsICAxLjdmLCAgICAxLCAgICAxLCAgICAxLCAgMC4zZiwgIDAuNWYsICAgMC41ZiwgICAyMCwgIDIwLCA0IH0sIC8vIDQwLCA0MAorICAgIHsgIDIsIDEsICAgIDEsICAgICA2LCAgIDUuNWYsICAgMTAwLCAgICA2LCAgICAxLCAgICAxLCAgICAgNCwgICAgMTAsICAgICAxMCwgICAxMCwgIDIyLCAxIH0sIC8vIDQwLCA0MAorICAgIHsgIDYsIDEsICAgIDEsICAgIC0xLCAgICAgNzAsICAwLjFmLCAgICA5LCAgICAxLCAwLjVmLCAgIC05OCwgMC4wNWYsICAgIC00NSwgICAyMCwgIDMwLCA0IH0sIC8vIDYwLCA5MQorICAgIHsgIDYsIDEsICAgIDEsICAgIC0xLCAgICAgOTAsIC0wLjFmLCAgICA3LCAgICAxLCAgICAxLCAgICA5MCwgIDEuM2YsICAgICAzNCwgICAxMywgIDE2LCAxIH0sIC8vIDMyLCA2MAorfTsKKyNkZWZpbmUgU1VQRVJTSEFQRV9DT1VOVCAoc2l6ZW9mKHNTdXBlclNoYXBlUGFyYW1zKSAvIHNpemVvZihzU3VwZXJTaGFwZVBhcmFtc1swXSkpCisKKworI2VuZGlmIC8vICFTSEFQRVNfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2ZpbHRlci9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2ZpbHRlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNDI1M2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZmlsdGVyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCWZpbHRlci5jCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmN1dGlscyBcCisgICAgbGliR0xFU19DTSBcCisgICAgbGlidWkKKworTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtZmlsdGVyCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2ZpbHRlci9maWx0ZXIuYyBiL29wZW5nbC90ZXN0cy9maWx0ZXIvZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiYWMwNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9maWx0ZXIvZmlsdGVyLmMKQEAgLTAsMCArMSwxMjUgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8R0xFUy9lZ2wuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIGlmIChhcmdjIT0yICYmIGFyZ2MhPTMpIHsKKyAgICAgICAgcHJpbnRmKCJ1c2FnZTogJXMgPDAtNj4gW3BidWZmZXJdXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIGNvbnN0IGludCB0ZXN0ID0gYXRvaShhcmd2WzFdKTsKKyAgICBpbnQgdXNlUGJ1ZmZlciA9IGFyZ2M9PTMgJiYgIXN0cmNtcChhcmd2WzJdLCAicGJ1ZmZlciIpOworICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9QQlVGRkVSX0JJVHxFR0xfV0lORE9XX0JJVCwKKyAgICAgICAgIEVHTF9SRURfU0laRSwgICAgICAgNSwKKyAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCAgICAgNiwKKyAgICAgICAgIEVHTF9CTFVFX1NJWkUsICAgICAgNSwKKyAgICAgICAgIEVHTF9OT05FCisgICAgIH07CisgICAgIAorICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IC0xOworICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOworICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOworICAgICBFR0xDb25maWcgY29uZmlnOworICAgICBFR0xDb250ZXh0IGNvbnRleHQ7CisgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKKyAgICAgRUdMaW50IHcsIGg7CisgICAgIAorICAgICBFR0xEaXNwbGF5IGRweTsKKworICAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgIGVnbENob29zZUNvbmZpZyhkcHksIHNfY29uZmlnQXR0cmlicywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3MpOworICAgICBpZiAoIXVzZVBidWZmZXIpIHsKKyAgICAgICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgY29uZmlnLAorICAgICAgICAgICAgICAgICBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCksIE5VTEwpOworICAgICB9IGVsc2UgeworICAgICAgICAgcHJpbnRmKCJ1c2luZyBwYnVmZmVyXG4iKTsKKyAgICAgICAgIEVHTGludCBhdHRyaWJzW10gPSB7IEVHTF9XSURUSCwgMzIwLCBFR0xfSEVJR0hULCA0ODAsIEVHTF9OT05FIH07CisgICAgICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoZHB5LCBjb25maWcsIGF0dHJpYnMpOworICAgICB9CisgICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRweSwgY29uZmlnLCBOVUxMLCBOVUxMKTsKKyAgICAgZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsgICAKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmdyk7CisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZoKTsKKyAgICAgR0xpbnQgZGltID0gdzxoID8gdyA6IGg7CisKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworICAgICBHTGludCBjcm9wWzRdID0geyAwLCA0LCA0LCAtNCB9OworICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApOworICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisgICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7CisgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOworICAgICBnbENvbG9yNGYoMSwxLDEsMSk7CisKKyAgICAgLy8gcGFja2luZyBpcyBhbHdheXMgNAorICAgICB1aW50OF90IHQ4W10gID0geyAKKyAgICAgICAgICAgICAweDAwLCAweDU1LCAweDAwLCAweDU1LCAKKyAgICAgICAgICAgICAweEFBLCAweEZGLCAweEFBLCAweEZGLAorICAgICAgICAgICAgIDB4MDAsIDB4NTUsIDB4MDAsIDB4NTUsIAorICAgICAgICAgICAgIDB4QUEsIDB4RkYsIDB4QUEsIDB4RkYgIH07CisKKyAgICAgdWludDE2X3QgdDE2W10gID0geyAKKyAgICAgICAgICAgICAweDAwMDAsIDB4NTU1NSwgMHgwMDAwLCAweDU1NTUsIAorICAgICAgICAgICAgIDB4QUFBQSwgMHhGRkZGLCAweEFBQUEsIDB4RkZGRiwKKyAgICAgICAgICAgICAweDAwMDAsIDB4NTU1NSwgMHgwMDAwLCAweDU1NTUsIAorICAgICAgICAgICAgIDB4QUFBQSwgMHhGRkZGLCAweEFBQUEsIDB4RkZGRiAgfTsKKworICAgICB1aW50MTZfdCB0NTU1MVtdICA9IHsgCisgICAgICAgICAgICAgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAKKyAgICAgICAgICAgICAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsCisgICAgICAgICAgICAgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAKKyAgICAgICAgICAgICAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAgIH07CisKKyAgICAgdWludDMyX3QgdDMyW10gID0geyAKKyAgICAgICAgICAgICAweEZGMDAwMDAwLCAweEZGMDAwMEZGLCAweEZGMDBGRjAwLCAweEZGRkYwMDAwLCAKKyAgICAgICAgICAgICAweEZGMDBGRjAwLCAweEZGRkYwMDAwLCAweEZGMDAwMDAwLCAweEZGMDAwMEZGLCAKKyAgICAgICAgICAgICAweEZGMDBGRkZGLCAweEZGMDBGRjAwLCAweDAwRkYwMEZGLCAweEZGRkZGRjAwLCAKKyAgICAgICAgICAgICAweEZGMDAwMDAwLCAweEZGRkYwMEZGLCAweEZGMDBGRkZGLCAweEZGRkZGRkZGCisgICAgIH07CisKKyAgICAgc3dpdGNoKHRlc3QpIAorICAgICB7CisgICAgIGNhc2UgMToKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9MVU1JTkFOQ0UsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX0xVTUlOQU5DRSwgR0xfVU5TSUdORURfQllURSwgdDgpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgMjoKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX1JHQiwgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsIHQxNik7CisgICAgICAgICBicmVhazsKKyAgICAgY2FzZSAzOgorICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQsIHQxNik7CisgICAgICAgICBicmVhazsKKyAgICAgY2FzZSA0OgorICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0xVTUlOQU5DRV9BTFBIQSwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfTFVNSU5BTkNFX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCB0MTYpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgNToKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xLCB0NTU1MSk7CisgICAgICAgICBicmVhazsKKyAgICAgY2FzZSA2OgorICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIHQzMik7CisgICAgICAgICBicmVhazsKKyAgICAgfQorCisgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgZGltLCBkaW0pOworCisgICAgIGlmICghdXNlUGJ1ZmZlcikgeworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfSBlbHNlIHsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgIH0KKyAgICAgCisgICAgIGVnbFRlcm1pbmF0ZShkcHkpOworICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9maW5pc2gvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9maW5pc2gvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2I5NWVkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2ZpbmlzaC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwlmaW5pc2guYworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMgXAorICAgIGxpYkdMRVNfQ00gXAorICAgIGxpYnVpCisKK0xPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLWZpbmlzaAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9maW5pc2gvZmluaXNoLmMgYi9vcGVuZ2wvdGVzdHMvZmluaXNoL2ZpbmlzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZmUyMjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZmluaXNoL2ZpbmlzaC5jCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKKyNpbmNsdWRlIDxHTEVTL2VnbC5oPgorCitsb25nIGxvbmcgc3lzdGVtVGltZSgpCit7CisgICAgc3RydWN0IHRpbWVzcGVjIHQ7CisgICAgdC50dl9zZWMgPSB0LnR2X25zZWMgPSAwOworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdCk7CisgICAgcmV0dXJuIChsb25nIGxvbmcpKHQudHZfc2VjKSoxMDAwMDAwMDAwTEwgKyB0LnR2X25zZWM7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7CisgICAgICAgICBFR0xfUkVEX1NJWkUsICAgICAgIDUsCisgICAgICAgICBFR0xfR1JFRU5fU0laRSwgICAgIDYsCisgICAgICAgICBFR0xfQkxVRV9TSVpFLCAgICAgIDUsCisgICAgICAgICBFR0xfTk9ORQorICAgICB9OworICAgICAKKyAgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMTsKKyAgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKKyAgICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKKyAgICAgRUdMQ29uZmlnIGNvbmZpZzsKKyAgICAgRUdMQ29udGV4dCBjb250ZXh0OworICAgICBFR0xTdXJmYWNlIHN1cmZhY2U7CisgICAgIEVHTGludCB3LCBoOworICAgICAKKyAgICAgRUdMRGlzcGxheSBkcHk7CisKKyAgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOworICAgICBlZ2xDaG9vc2VDb25maWcoZHB5LCBzX2NvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKKyAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjb25maWcsIAorICAgICAgICAgICAgIGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKSwgTlVMTCk7CisgICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRweSwgY29uZmlnLCBOVUxMLCBOVUxMKTsKKyAgICAgZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsgICAKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmdyk7CisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZoKTsKKyAgICAgR0xpbnQgZGltID0gdzxoID8gdyA6IGg7CisKKyAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOworICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOworICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKKyAgICAgZ2xDb2xvcjRmKDEsMSwxLDEpOworICAgICBnbERpc2FibGUoR0xfRElUSEVSKTsKKyAgICAgZ2xTaGFkZU1vZGVsKEdMX0ZMQVQpOworCisgICAgIGxvbmcgbG9uZyBub3csIHQ7CisgICAgIGludCBpOworCisgICAgIGNoYXIqIHRleGVscyA9IG1hbGxvYyg1MTIqNTEyKjIpOworICAgICBtZW1zZXQodGV4ZWxzLDB4RkYsNTEyKjUxMioyKTsKKyAgICAgCisgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsCisgICAgICAgICAgICAgNTEyLCA1MTIsIDAsIEdMX1JHQiwgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsIHRleGVscyk7CisKKyAgICAgY2hhciogZHN0ID0gbWFsbG9jKDMyMCo0ODAqMik7CisgICAgIG1lbXNldChkc3QsIDAsIDMyMCo0ODAqMik7CisgICAgIHByaW50ZigiMzA3MjAwIGJ5dGVzIG1lbWNweVxuIik7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBtZW1jcHkoZHN0LCB0ZXhlbHMsIDMyMCo0ODAqMik7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJtZW1jcHkoKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICB9CisgICAgIGZyZWUoZHN0KTsKKworICAgICBmcmVlKHRleGVscyk7CisKKyAgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCAtMjApOworICAgICAKKyAgICAgcHJpbnRmKCI1MTJ4NTEyIHVubW9kaWZpZWQgdGV4dHVyZSwgNTEyeDUxMiBibGl0OlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCA1MTIsIDUxMiwgLTUxMiB9OworICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCA1MTIsIDUxMik7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorICAgICAKKyAgICAgcHJpbnRmKCI1MTJ4NTEyIHVubW9kaWZpZWQgdGV4dHVyZSwgMXgxIGJsaXQ6XG4iKTsKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDEsIDEsIC0xIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDEsIDEpOworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0KKyAgICAgCisgICAgIHByaW50ZigiNTEyeDUxMiB1bm1vZGlmaWVkIHRleHR1cmUsIDUxMng1MTIgYmxpdCAoeDIpOlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCA1MTIsIDUxMiwgLTUxMiB9OworICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCA1MTIsIDUxMik7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDUxMiwgNTEyKTsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9CisKKyAgICAgcHJpbnRmKCI1MTJ4NTEyIHVubW9kaWZpZWQgdGV4dHVyZSwgMXgxIGJsaXQgKHgyKTpcbiIpOworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgMSwgMSwgLTEgfTsKKyAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgMSwgMSk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDEsIDEpOworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0KKworICAgICAKKyAgICAgcHJpbnRmKCI1MTJ4NTEyICgxeDEgdGV4ZWwgTU9ESUZJRUQgdGV4dHVyZSksIDUxMng1MTIgYmxpdDpcbiIpOworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgdWludDE2X3QgZ3JlZW4gPSAweDdFMDsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDUxMiwgNTEyLCAtNTEyIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgMSwgMSwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgJmdyZWVuKTsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgNTEyLCA1MTIpOworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0KKworCisgICAgIGludDE2X3QgdGV4ZWwgPSAweEY4MDA7CisgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsCisgICAgICAgICAgICAgMSwgMSwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgJnRleGVsKTsKKworICAgICBwcmludGYoIjF4MSB1bm1vZGlmaWVkIHRleHR1cmUsIDF4MSBibGl0OlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCAxLCAxLCAtMSB9OworICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCAxLCAxKTsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorCisgICAgIHByaW50ZigiMXgxIHVubW9kaWZpZWQgdGV4dHVyZSwgNTEyeDUxMiBibGl0OlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCAxLCAxLCAtMSB9OworICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCA1MTIsIDUxMik7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorCisgICAgIHByaW50ZigiMXgxICgxeDEgdGV4ZWwgTU9ESUZJRUQgdGV4dHVyZSksIDUxMng1MTIgYmxpdDpcbiIpOworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgdWludDE2X3QgZ3JlZW4gPSAweDdFMDsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDEsIDEsIC0xIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgMSwgMSwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgJmdyZWVuKTsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgMSwgMSk7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorCisgICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Nmc2ltL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvc2ZzaW0vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTFhMDNjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Nmc2ltL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNSBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCWVnbF9zdXJmYWNlLmNwcCBcCisJc2ZzaW0uYworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJHTEVTX0NNCisKK0xPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLXNmc2ltCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Nmc2ltL2VnbF9zdXJmYWNlLmNwcCBiL29wZW5nbC90ZXN0cy9zZnNpbS9lZ2xfc3VyZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3NzdmOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9zZnNpbS9lZ2xfc3VyZmFjZS5jcHAKQEAgLTAsMCArMSwzNDYgQEAKKy8qIAorICoqCisgKiogQ29weXJpZ2h0IDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wKHRoZSAiTGljZW5zZSIpOyAKKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqKgorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKioKKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcgc29mdHdhcmUgCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUyAKKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjaW5jbHVkZSA8R0xFUy9lZ2wuaD4KKworI2luY2x1ZGUgImVnbF9zdXJmYWNlLmgiCisKKyNkZWZpbmUgTE9HSSh4Li4uKSBkbyB7IHByaW50ZigiSU5GTzogIiB4KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgTE9HVyh4Li4uKSBkbyB7IHByaW50ZigiV0FSTjogIiB4KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgTE9HRSh4Li4uKSBkbyB7IHByaW50ZigiRVJSOiAiIHgpOyB9IHdoaWxlICgwKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2VnbF9uYXRpdmVfd2luZG93X3QqIGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKQoreworICAgIGVnbF9uYXRpdmVfd2luZG93X3QqIHMgPSBuZXcgYW5kcm9pZDo6RUdMRGlzcGxheVN1cmZhY2UoKTsKKyAgICBzLT5tZW1vcnlfdHlwZSA9IE5BVElWRV9NRU1PUllfVFlQRV9HUFU7CisgICAgcmV0dXJuIHM7Cit9CisKKyNkZWZpbmUgTElLRUxZKCBleHAgKSAgICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgdHJ1ZSAgKSkKKyNkZWZpbmUgVU5MSUtFTFkoIGV4cCApICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgZmFsc2UgKSkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFR0xEaXNwbGF5U3VyZmFjZTo6RUdMRGlzcGxheVN1cmZhY2UoKQorICAgIDogRUdMTmF0aXZlU3VyZmFjZTxFR0xEaXNwbGF5U3VyZmFjZT4oKQoreworICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OnZlcnNpb24gPSBzaXplb2YoZWdsX25hdGl2ZV93aW5kb3dfdCk7CisgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6aWRlbnQgPSAwOworICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OmluY1JlZiA9ICZFR0xEaXNwbGF5U3VyZmFjZTo6aG9va19pbmNSZWY7CisgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6ZGVjUmVmID0gJkVHTERpc3BsYXlTdXJmYWNlOjpob29rX2RlY1JlZjsKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190Ojpzd2FwQnVmZmVycyA9ICZFR0xEaXNwbGF5U3VyZmFjZTo6aG9va19zd2FwQnVmZmVyczsKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpzZXRTd2FwUmVjdGFuZ2xlID0gJkVHTERpc3BsYXlTdXJmYWNlOjpob29rX3NldFN3YXBSZWN0YW5nbGU7CisgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6bmV4dEJ1ZmZlciA9ICZFR0xEaXNwbGF5U3VyZmFjZTo6aG9va19uZXh0QnVmZmVyOworICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OmNvbm5lY3QgPSAwOworICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OmRpc2Nvbm5lY3QgPSAwOworCisgICAgbUZiWzBdLmRhdGEgPSAwOworICAgIG1GYlsxXS5kYXRhID0gMDsKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpmZCA9IG1hcEZyYW1lQnVmZmVyKCk7CisgICAgaWYgKGVnbF9uYXRpdmVfd2luZG93X3Q6OmZkID49IDApIHsKKyAgICAgICAgY29uc3QgZmxvYXQgaW4ybW0gPSAyNS40ZjsKKyAgICAgICAgZmxvYXQgcmVmcmVzaFJhdGUgPSAxMDAwMDAwMDAwMDAwMDAwTExVIC8gKAorICAgICAgICAgICAgICAgIGZsb2F0KCBtSW5mby51cHBlcl9tYXJnaW4gKyBtSW5mby5sb3dlcl9tYXJnaW4gKyBtSW5mby55cmVzICkgCisgICAgICAgICAgICAgICAgKiAoIG1JbmZvLmxlZnRfbWFyZ2luICArIG1JbmZvLnJpZ2h0X21hcmdpbiArIG1JbmZvLnhyZXMgKQorICAgICAgICAgICAgICAgICogbUluZm8ucGl4Y2xvY2spOworCisgICAgICAgIGNvbnN0IEdHTFN1cmZhY2UmIGJ1ZmZlciA9IG1GYlsxIC0gbUluZGV4XTsKKyAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6d2lkdGggID0gYnVmZmVyLndpZHRoOworICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpoZWlnaHQgPSBidWZmZXIuaGVpZ2h0OworICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpzdHJpZGUgPSBidWZmZXIuc3RyaWRlOworICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190Ojpmb3JtYXQgPSBidWZmZXIuZm9ybWF0OworICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpiYXNlICAgPSBpbnRwdHJfdChtRmJbMF0uZGF0YSk7CisgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6Om9mZnNldCA9CisgICAgICAgICAgICBpbnRwdHJfdChidWZmZXIuZGF0YSkgLSBlZ2xfbmF0aXZlX3dpbmRvd190OjpiYXNlOworICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpmbGFncyAgPSAwOworICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190Ojp4ZHBpID0gKG1JbmZvLnhyZXMgKiBpbjJtbSkgLyBtSW5mby53aWR0aDsKKyAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6eWRwaSA9IChtSW5mby55cmVzICogaW4ybW0pIC8gbUluZm8uaGVpZ2h0OworICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpmcHMgID0gcmVmcmVzaFJhdGU7CisgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6Om1lbW9yeV90eXBlID0gTkFUSVZFX01FTU9SWV9UWVBFX0ZCOworICAgICAgICAvLyBubyBlcnJvciwgc2V0IHRoZSBtYWdpYyB3b3JkCisgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6Om1hZ2ljID0gMHg2MDA5MTM7CisgICAgfQorICAgIG1Td2FwQ291bnQgPSAtMTsKKyAgICBtUGFnZUZsaXBDb3VudCA9IDA7Cit9CisKK0VHTERpc3BsYXlTdXJmYWNlOjp+RUdMRGlzcGxheVN1cmZhY2UoKQoreworICAgIG1hZ2ljID0gMDsKKyAgICBjbG9zZShlZ2xfbmF0aXZlX3dpbmRvd190OjpmZCk7CisgICAgbXVubWFwKG1GYlswXS5kYXRhLCBtU2l6ZSk7CisgICAgaWYgKCEobUZsYWdzICYgUEFHRV9GTElQKSkKKyAgICAgICAgZnJlZSgodm9pZCopbUZiWzFdLmRhdGEpOworfQorCit2b2lkIEVHTERpc3BsYXlTdXJmYWNlOjpob29rX2luY1JlZihOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdykgeworICAgIEVHTERpc3BsYXlTdXJmYWNlKiB0aGF0ID0gc3RhdGljX2Nhc3Q8RUdMRGlzcGxheVN1cmZhY2UqPih3aW5kb3cpOworICAgIHRoYXQtPmluY1N0cm9uZyh0aGF0KTsKK30KK3ZvaWQgRUdMRGlzcGxheVN1cmZhY2U6Omhvb2tfZGVjUmVmKE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93KSB7CisgICAgRUdMRGlzcGxheVN1cmZhY2UqIHRoYXQgPSBzdGF0aWNfY2FzdDxFR0xEaXNwbGF5U3VyZmFjZSo+KHdpbmRvdyk7CisgICAgdGhhdC0+ZGVjU3Ryb25nKHRoYXQpOworfQordWludDMyX3QgRUdMRGlzcGxheVN1cmZhY2U6Omhvb2tfc3dhcEJ1ZmZlcnMoTmF0aXZlV2luZG93VHlwZSB3aW5kb3cpIHsKKyAgICBFR0xEaXNwbGF5U3VyZmFjZSogdGhhdCA9IHN0YXRpY19jYXN0PEVHTERpc3BsYXlTdXJmYWNlKj4od2luZG93KTsKKyAgICByZXR1cm4gdGhhdC0+c3dhcEJ1ZmZlcnMoKTsKK30KK3VpbnQzMl90IEVHTERpc3BsYXlTdXJmYWNlOjpob29rX25leHRCdWZmZXIoTmF0aXZlV2luZG93VHlwZSB3aW5kb3cpIHsKKyAgICBFR0xEaXNwbGF5U3VyZmFjZSogdGhhdCA9IHN0YXRpY19jYXN0PEVHTERpc3BsYXlTdXJmYWNlKj4od2luZG93KTsKKyAgICByZXR1cm4gdGhhdC0+bmV4dEJ1ZmZlcigpOworfQordm9pZCBFR0xEaXNwbGF5U3VyZmFjZTo6aG9va19zZXRTd2FwUmVjdGFuZ2xlKE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LAorICAgICAgICBpbnQgbCwgaW50IHQsIGludCB3LCBpbnQgaCkgeworICAgIEVHTERpc3BsYXlTdXJmYWNlKiB0aGF0ID0gc3RhdGljX2Nhc3Q8RUdMRGlzcGxheVN1cmZhY2UqPih3aW5kb3cpOworICAgIHRoYXQtPnNldFN3YXBSZWN0YW5nbGUobCwgdCwgdywgaCk7Cit9CisKK3ZvaWQgRUdMRGlzcGxheVN1cmZhY2U6OnNldFN3YXBSZWN0YW5nbGUoaW50IGwsIGludCB0LCBpbnQgdywgaW50IGgpCit7CisgICAgbUluZm8ucmVzZXJ2ZWRbMF0gPSAweDU0NDQ1MDU1OyAvLyAiVVBEVCI7CisgICAgbUluZm8ucmVzZXJ2ZWRbMV0gPSAodWludDE2X3QpbCB8ICgodWludDMyX3QpdCA8PCAxNik7CisgICAgbUluZm8ucmVzZXJ2ZWRbMl0gPSAodWludDE2X3QpKGwrdykgfCAoKHVpbnQzMl90KSh0K2gpIDw8IDE2KTsKK30KKwordWludDMyX3QgRUdMRGlzcGxheVN1cmZhY2U6OnN3YXBCdWZmZXJzKCkKK3sKKyAgICBpZiAoIShtRmxhZ3MgJiBQQUdFX0ZMSVApKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIGRvIHRoZSBhY3R1YWwgZmxpcAorICAgIG1JbmRleCA9IDEgLSBtSW5kZXg7CisgICAgbUluZm8uYWN0aXZhdGUgPSBGQl9BQ1RJVkFURV9WQkw7CisgICAgbUluZm8ueW9mZnNldCA9IG1JbmRleCA/IG1JbmZvLnlyZXMgOiAwOworICAgIGlmIChpb2N0bChlZ2xfbmF0aXZlX3dpbmRvd190OjpmZCwgRkJJT1BVVF9WU0NSRUVOSU5GTywgJm1JbmZvKSA9PSAtMSkgeworICAgICAgICBMT0dFKCJGQklPUFVUX1ZTQ1JFRU5JTkZPIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHRoaXMgaXMgYSBtb25zdHJ1b3VzIGhhY2s6IEJlY2F1c2UgdGhlIGgvdyBhY2NlbGVyYXRvciBpcyBub3QgYWJsZQorICAgICAqIHRvIHJlbmRlciBkaXJlY3RseSBpbnRvIHRoZSBmcmFtZWJ1ZmZlciwgd2UgbmVlZCB0byBjb3B5IGl0cworICAgICAqIGludGVybmFsIGZyYW1lYnVmZmVyIG91dCB0byB0aGUgZmIuIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGludGVybmFsIGZiCisgICAgICogaXMgZ2l2ZW4gaW4gb2VtWzBdLiAKKyAgICAgKiBBbGwgdGhpcyBpcyBuZWVkZWQgb25seSBpbiBzdGFuZGFsb25lIG1vZGUsIGluIFN1cmZhY2VGbGluZ2VyIG1vZGUKKyAgICAgKiB3ZSBjb250cm9sIHdoZXJlIHRoZSBHUFUgcmVuZGVycy4KKyAgICAgKi8KKyAgICBpZiAoZWdsX25hdGl2ZV93aW5kb3dfdDo6bWVtb3J5X3R5cGUgPT0gTkFUSVZFX01FTU9SWV9UWVBFX0dQVSAmJiBvZW1bMF0pIHsKKyAgICAgICAgLy8gY291bGQgdXNlIE1EUCBoZXJlLCBidXQgdGhhdCdzIHRyaWNreSBiZWNhdXNlIHdlIG5lZWQKKyAgICAgICAgLy8gL2Rldi9wbWVtX2dwdSogZmlsZWRlc2NyaXB0b3IKKyAgICAgICAgY29uc3QgR0dMU3VyZmFjZSYgYnVmZmVyID0gbUZiW21JbmRleF07CisgICAgICAgIG1lbWNweSggYnVmZmVyLmRhdGEsCisgICAgICAgICAgICAgICAgKHZvaWQqKShvZW1bMF0gKyBlZ2xfbmF0aXZlX3dpbmRvd190OjpvZmZzZXQpLAorICAgICAgICAgICAgICAgIGJ1ZmZlci5zdHJpZGUqYnVmZmVyLmhlaWdodCoyKTsKKyAgICB9CisKKyAgICAvLyB1cGRhdGUgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBkcmF3IHRvIG5leHQKKyAgICBjb25zdCBHR0xTdXJmYWNlJiBidWZmZXIgPSBtRmJbMSAtIG1JbmRleF07CisgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6b2Zmc2V0ID0KKyAgICAgICAgaW50cHRyX3QoYnVmZmVyLmRhdGEpIC0gZWdsX25hdGl2ZV93aW5kb3dfdDo6YmFzZTsKKworICAgIG1QYWdlRmxpcENvdW50Kys7CisKKyAgICAvLyBXZSBkb24ndCBzdXBwb3J0IHNjcmVlbi1zaXplIGNoYW5nZXMgZm9yIG5vdworICAgIHJldHVybiAwOworfQorCitpbnQzMl90IEVHTERpc3BsYXlTdXJmYWNlOjpnZXRQYWdlRmxpcENvdW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVBhZ2VGbGlwQ291bnQ7Cit9CisKK3VpbnQzMl90IEVHTERpc3BsYXlTdXJmYWNlOjpuZXh0QnVmZmVyKCkKK3sKKyAgICAvLyB1cGRhdGUgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBkcmF3IHRvIG5leHQKKyAgICBjb25zdCBHR0xTdXJmYWNlJiBidWZmZXIgPSBtRmJbbUluZGV4XTsKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpvZmZzZXQgPQorICAgICAgICBpbnRwdHJfdChidWZmZXIuZGF0YSkgLSBlZ2xfbmF0aXZlX3dpbmRvd190OjpiYXNlOworICAgIHJldHVybiAwOworfQorCitpbnQgRUdMRGlzcGxheVN1cmZhY2U6Om1hcEZyYW1lQnVmZmVyKCkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZGV2aWNlX3RlbXBsYXRlW10gPSB7CisgICAgICAgICAgICAiL2Rldi9ncmFwaGljcy9mYiV1IiwKKyAgICAgICAgICAgICIvZGV2L2ZiJXUiLAorICAgICAgICAgICAgMCB9OworICAgIGludCBmZCA9IC0xOworICAgIGludCBpPTA7CisgICAgY2hhciBuYW1lWzY0XTsKKyAgICB3aGlsZSAoKGZkPT0tMSkgJiYgZGV2aWNlX3RlbXBsYXRlW2ldKSB7CisgICAgICAgIHNucHJpbnRmKG5hbWUsIDY0LCBkZXZpY2VfdGVtcGxhdGVbaV0sIDApOworICAgICAgICBmZCA9IG9wZW4obmFtZSwgT19SRFdSLCAwKTsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGZpbmZvOworICAgIGlmIChpb2N0bChmZCwgRkJJT0dFVF9GU0NSRUVOSU5GTywgJmZpbmZvKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBpbmZvOworICAgIGlmIChpb2N0bChmZCwgRkJJT0dFVF9WU0NSRUVOSU5GTywgJmluZm8pID09IC0xKQorICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgaW5mby5yZXNlcnZlZFswXSA9IDA7CisgICAgaW5mby5yZXNlcnZlZFsxXSA9IDA7CisgICAgaW5mby5yZXNlcnZlZFsyXSA9IDA7CisgICAgaW5mby54b2Zmc2V0ID0gMDsKKyAgICBpbmZvLnlvZmZzZXQgPSAwOworICAgIGluZm8ueXJlc192aXJ0dWFsID0gaW5mby55cmVzICogMjsKKyAgICBpbmZvLmJpdHNfcGVyX3BpeGVsID0gMTY7CisgICAgaW5mby5hY3RpdmF0ZSA9IEZCX0FDVElWQVRFX05PVzsKKworICAgIHVpbnQzMl90IGZsYWdzID0gUEFHRV9GTElQOworICAgIGlmIChpb2N0bChmZCwgRkJJT1BVVF9WU0NSRUVOSU5GTywgJmluZm8pID09IC0xKSB7CisgICAgICAgIGluZm8ueXJlc192aXJ0dWFsID0gaW5mby55cmVzOworICAgICAgICBmbGFncyAmPSB+UEFHRV9GTElQOworICAgICAgICBMT0dXKCJGQklPUFVUX1ZTQ1JFRU5JTkZPIGZhaWxlZCwgcGFnZSBmbGlwcGluZyBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgaWYgKGluZm8ueXJlc192aXJ0dWFsIDwgaW5mby55cmVzICogMikgeworICAgICAgICBpbmZvLnlyZXNfdmlydHVhbCA9IGluZm8ueXJlczsKKyAgICAgICAgZmxhZ3MgJj0gflBBR0VfRkxJUDsKKyAgICAgICAgTE9HVygicGFnZSBmbGlwcGluZyBub3Qgc3VwcG9ydGVkICh5cmVzX3ZpcnR1YWw9JWQsIHJlcXVlc3RlZD0lZCkiLAorICAgICAgICAgICAgICAgIGluZm8ueXJlc192aXJ0dWFsLCBpbmZvLnlyZXMqMik7CisgICAgfQorCisgICAgaWYgKGlvY3RsKGZkLCBGQklPR0VUX1ZTQ1JFRU5JTkZPLCAmaW5mbykgPT0gLTEpCisgICAgICAgIHJldHVybiAtZXJybm87ICAgIAorCisgICAgaW50IHJlZnJlc2hSYXRlID0gMTAwMDAwMDAwMDAwMDAwMExMVSAvIAorICAgICgKKyAgICAgICAgICAgIHVpbnQ2NF90KCBpbmZvLnVwcGVyX21hcmdpbiArIGluZm8ubG93ZXJfbWFyZ2luICsgaW5mby55cmVzICkgCisgICAgICAgICAgICAqICggaW5mby5sZWZ0X21hcmdpbiAgKyBpbmZvLnJpZ2h0X21hcmdpbiArIGluZm8ueHJlcyApCisgICAgICAgICAgICAqIGluZm8ucGl4Y2xvY2sKKyAgICApOworCisgICAgaWYgKHJlZnJlc2hSYXRlID09IDApIHsKKyAgICAgICAgLy8gYmxlYWdoLCBiYWQgaW5mbyBmcm9tIHRoZSBkcml2ZXIKKyAgICAgICAgcmVmcmVzaFJhdGUgPSA2MCoxMDAwOyAgLy8gNjAgSHoKKyAgICB9CisKKyAgICBpZiAoaW50KGluZm8ud2lkdGgpIDw9IDAgfHwgaW50KGluZm8uaGVpZ2h0KSA8PSAwKSB7CisgICAgICAgIC8vIHN0dXBpZCBkcml2ZXIsIGRvZXNuJ3QgcmV0dXJuIHRoYXQgaW5mb3JtYXRpb24KKyAgICAgICAgLy8gZGVmYXVsdCB0byBTb29uZXIncyBzY3JlZW4gc2l6ZSAoMTYwIGRwaSkKKyAgICAgICAgaW5mby53aWR0aCAgPSA1MTsKKyAgICAgICAgaW5mby5oZWlnaHQgPSAzODsKKyAgICB9CisKKyAgICBmbG9hdCB4ZHBpID0gKGluZm8ueHJlcyAqIDI1LjRmKSAvIGluZm8ud2lkdGg7IAorICAgIGZsb2F0IHlkcGkgPSAoaW5mby55cmVzICogMjUuNGYpIC8gaW5mby5oZWlnaHQ7CisgICAgZmxvYXQgZnBzICA9IHJlZnJlc2hSYXRlIC8gMTAwMC4wZjsgCisKKyAgICBMT0dJKCAgICJ1c2luZyAoZmQ9JWQpXG4iCisgICAgICAgICAgICAiaWQgICAgICAgICAgID0gJXNcbiIKKyAgICAgICAgICAgICJ4cmVzICAgICAgICAgPSAlZCBweFxuIgorICAgICAgICAgICAgInlyZXMgICAgICAgICA9ICVkIHB4XG4iCisgICAgICAgICAgICAieHJlc192aXJ0dWFsID0gJWQgcHhcbiIKKyAgICAgICAgICAgICJ5cmVzX3ZpcnR1YWwgPSAlZCBweFxuIgorICAgICAgICAgICAgImJwcCAgICAgICAgICA9ICVkXG4iCisgICAgICAgICAgICAiciAgICAgICAgICAgID0gJTJ1OiV1XG4iCisgICAgICAgICAgICAiZyAgICAgICAgICAgID0gJTJ1OiV1XG4iCisgICAgICAgICAgICAiYiAgICAgICAgICAgID0gJTJ1OiV1XG4iLAorICAgICAgICAgICAgZmQsCisgICAgICAgICAgICBmaW5mby5pZCwKKyAgICAgICAgICAgIGluZm8ueHJlcywKKyAgICAgICAgICAgIGluZm8ueXJlcywKKyAgICAgICAgICAgIGluZm8ueHJlc192aXJ0dWFsLAorICAgICAgICAgICAgaW5mby55cmVzX3ZpcnR1YWwsCisgICAgICAgICAgICBpbmZvLmJpdHNfcGVyX3BpeGVsLAorICAgICAgICAgICAgaW5mby5yZWQub2Zmc2V0LCBpbmZvLnJlZC5sZW5ndGgsCisgICAgICAgICAgICBpbmZvLmdyZWVuLm9mZnNldCwgaW5mby5ncmVlbi5sZW5ndGgsCisgICAgICAgICAgICBpbmZvLmJsdWUub2Zmc2V0LCBpbmZvLmJsdWUubGVuZ3RoCisgICAgKTsKKworICAgIExPR0koICAgIndpZHRoICAgICAgICA9ICVkIG1tICglZiBkcGkpXG4iCisgICAgICAgICAgICAiaGVpZ2h0ICAgICAgID0gJWQgbW0gKCVmIGRwaSlcbiIKKyAgICAgICAgICAgICJyZWZyZXNoIHJhdGUgPSAlLjJmIEh6XG4iLAorICAgICAgICAgICAgaW5mby53aWR0aCwgIHhkcGksCisgICAgICAgICAgICBpbmZvLmhlaWdodCwgeWRwaSwKKyAgICAgICAgICAgIGZwcworICAgICk7CisKKyAgICAKKyAgICBpZiAoaW9jdGwoZmQsIEZCSU9HRVRfRlNDUkVFTklORk8sICZmaW5mbykgPT0gLTEpCisgICAgICAgIHJldHVybiAtZXJybm87CisKKyAgICBpZiAoZmluZm8uc21lbV9sZW4gPD0gMCkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIC8qCisgICAgICogT3BlbiBhbmQgbWFwIHRoZSBkaXNwbGF5LgorICAgICAqLworCisgICAgdm9pZCogYnVmZmVyICA9ICh1aW50MTZfdCopIG1tYXAoCisgICAgICAgICAgICAwLCBmaW5mby5zbWVtX2xlbiwKKyAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICBNQVBfU0hBUkVELAorICAgICAgICAgICAgZmQsIDApOworCisgICAgaWYgKGJ1ZmZlciA9PSBNQVBfRkFJTEVEKQorICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgLy8gYXQgbGVhc3QgZm9yIG5vdywgYWx3YXlzIGNsZWFyIHRoZSBmYgorICAgIG1lbXNldChidWZmZXIsIDAsIGZpbmZvLnNtZW1fbGVuKTsKKworICAgIHVpbnQ4X3QqIG9mZnNjcmVlblsyXTsKKyAgICBvZmZzY3JlZW5bMF0gPSAodWludDhfdCopYnVmZmVyOworICAgIGlmIChmbGFncyAmIFBBR0VfRkxJUCkgeworICAgICAgICBvZmZzY3JlZW5bMV0gPSAodWludDhfdCopYnVmZmVyICsgZmluZm8ubGluZV9sZW5ndGgqaW5mby55cmVzOworICAgIH0gZWxzZSB7CisgICAgICAgIG9mZnNjcmVlblsxXSA9ICh1aW50OF90KiltYWxsb2MoZmluZm8uc21lbV9sZW4pOworICAgICAgICBpZiAob2Zmc2NyZWVuWzFdID09IDApIHsKKyAgICAgICAgICAgIG11bm1hcChidWZmZXIsIGZpbmZvLnNtZW1fbGVuKTsKKyAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICB9CisgICAgfQorCisgICAgbUZsYWdzID0gZmxhZ3M7CisgICAgbUluZm8gPSBpbmZvOworICAgIG1GaW5mbyA9IGZpbmZvOworICAgIG1TaXplID0gZmluZm8uc21lbV9sZW47CisgICAgbUluZGV4ID0gMDsKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgbUZiW2ldLnZlcnNpb24gPSBzaXplb2YoR0dMU3VyZmFjZSk7CisgICAgICAgIG1GYltpXS53aWR0aCAgID0gaW5mby54cmVzOworICAgICAgICBtRmJbaV0uaGVpZ2h0ICA9IGluZm8ueXJlczsKKyAgICAgICAgbUZiW2ldLnN0cmlkZSAgPSBmaW5mby5saW5lX2xlbmd0aCAvIChpbmZvLmJpdHNfcGVyX3BpeGVsID4+IDMpOworICAgICAgICBtRmJbaV0uZGF0YSAgICA9ICh1aW50OF90Kikob2Zmc2NyZWVuW2ldKTsKKyAgICAgICAgbUZiW2ldLmZvcm1hdCAgPSBOQVRJVkVfUElYRUxfRk9STUFUX1JHQl81NjU7CisgICAgfQorICAgIHJldHVybiBmZDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9zZnNpbS9lZ2xfc3VyZmFjZS5oIGIvb3BlbmdsL3Rlc3RzL3Nmc2ltL2VnbF9zdXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhOTRmYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9zZnNpbS9lZ2xfc3VyZmFjZS5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NJTV9FR0xfU1VSRkFDRV9ICisjZGVmaW5lIEFORFJPSURfU0lNX0VHTF9TVVJGQUNFX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxHTEVTL2VnbG5hdGl2ZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzc2l6ZV90ICAgIHZlcnNpb247ICAgIC8vIGFsd2F5cyBzZXQgdG8gc2l6ZW9mKEdHTFN1cmZhY2UpCisgICAgdWludDMyX3QgICB3aWR0aDsgICAgICAvLyB3aWR0aCBpbiBwaXhlbHMKKyAgICB1aW50MzJfdCAgIGhlaWdodDsgICAgIC8vIGhlaWdodCBpbiBwaXhlbHMKKyAgICBpbnQzMl90ICAgIHN0cmlkZTsgICAgIC8vIHN0cmlkZSBpbiBwaXhlbHMKKyAgICB1aW50OF90KiAgIGRhdGE7ICAgICAgIC8vIHBvaW50ZXIgdG8gdGhlIGJpdHMKKyAgICB1aW50OF90ICAgIGZvcm1hdDsgICAgIC8vIHBpeGVsIGZvcm1hdAorICAgIHVpbnQ4X3QgICAgcmZ1WzNdOyAgICAgLy8gbXVzdCBiZSB6ZXJvCisgICAgdm9pZCogICAgICByZXNlcnZlZDsKK30gR0dMU3VyZmFjZTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGVtcGxhdGUgPGNsYXNzIFRZUEU+CitjbGFzcyBFR0xOYXRpdmVTdXJmYWNlIDogcHVibGljIGVnbF9uYXRpdmVfd2luZG93X3QKK3sKK3B1YmxpYzoKKyAgICBFR0xOYXRpdmVTdXJmYWNlKCkgOiBtQ291bnQoMCkgeyAKKyAgICAgICAgbWVtc2V0KGVnbF9uYXRpdmVfd2luZG93X3Q6OnJlc2VydmVkLCAwLCAKKyAgICAgICAgICAgICAgICBzaXplb2YoZWdsX25hdGl2ZV93aW5kb3dfdDo6cmVzZXJ2ZWQpKTsKKyAgICAgICAgbWVtc2V0KGVnbF9uYXRpdmVfd2luZG93X3Q6OnJlc2VydmVkX3Byb2MsIDAsIAorICAgICAgICAgICAgICAgIHNpemVvZihlZ2xfbmF0aXZlX3dpbmRvd190OjpyZXNlcnZlZF9wcm9jKSk7CisgICAgICAgIG1lbXNldChlZ2xfbmF0aXZlX3dpbmRvd190OjpvZW0sIDAsIAorICAgICAgICAgICAgICAgIHNpemVvZihlZ2xfbmF0aXZlX3dpbmRvd190OjpvZW0pKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgaW5jU3Ryb25nKHZvaWQqKSBjb25zdCB7CisgICAgICAgIC8qIGluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhlIGluYyBtdXN0IGJlIGF0b21pYyAqLworICAgICAgICBtQ291bnQrKzsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgZGVjU3Ryb25nKHZvaWQqKSBjb25zdCB7CisgICAgICAgIC8qIGluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhlIGRlYyBtdXN0IGJlIGF0b21pYyAqLworICAgICAgICBpZiAoLS1tQ291bnQgPT0gMSkgeworICAgICAgICAgICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxjb25zdCBUWVBFKj4odGhpcyk7CisgICAgICAgICB9CisgICAgfQorcHJvdGVjdGVkOgorICAgIEVHTE5hdGl2ZVN1cmZhY2UmIG9wZXJhdG9yID0gKGNvbnN0IEVHTE5hdGl2ZVN1cmZhY2UmIHJocyk7CisgICAgRUdMTmF0aXZlU3VyZmFjZShjb25zdCBFR0xOYXRpdmVTdXJmYWNlJiByaHMpOworICAgIGlubGluZSB+RUdMTmF0aXZlU3VyZmFjZSgpIHsgfTsKKyAgICBtdXRhYmxlIHZvbGF0aWxlIGludDMyX3QgbUNvdW50OworfTsKKworCitjbGFzcyBFR0xEaXNwbGF5U3VyZmFjZSA6IHB1YmxpYyBFR0xOYXRpdmVTdXJmYWNlPEVHTERpc3BsYXlTdXJmYWNlPgoreworcHVibGljOgorICAgIEVHTERpc3BsYXlTdXJmYWNlKCk7CisgICAgfkVHTERpc3BsYXlTdXJmYWNlKCk7CisKKyAgICBpbnQzMl90IGdldFBhZ2VGbGlwQ291bnQoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgdm9pZCAgICAgICAgIGhvb2tfaW5jUmVmKE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93KTsKKyAgICBzdGF0aWMgdm9pZCAgICAgICAgIGhvb2tfZGVjUmVmKE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93KTsKKyAgICBzdGF0aWMgdWludDMyX3QgICAgIGhvb2tfc3dhcEJ1ZmZlcnMoTmF0aXZlV2luZG93VHlwZSB3aW5kb3cpOworICAgIHN0YXRpYyB2b2lkICAgICAgICAgaG9va19zZXRTd2FwUmVjdGFuZ2xlKE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LCBpbnQgbCwgaW50IHQsIGludCB3LCBpbnQgaCk7CisgICAgc3RhdGljIHVpbnQzMl90ICAgICBob29rX25leHRCdWZmZXIoTmF0aXZlV2luZG93VHlwZSB3aW5kb3cpOworCisgICAgdWludDMyX3QgICAgc3dhcEJ1ZmZlcnMoKTsKKyAgICB1aW50MzJfdCAgICBuZXh0QnVmZmVyKCk7CisgICAgdm9pZCAgICAgICAgc2V0U3dhcFJlY3RhbmdsZShpbnQgbCwgaW50IHQsIGludCB3LCBpbnQgaCk7CisKKyAgICBpbnQgICAgbWFwRnJhbWVCdWZmZXIoKTsKKworICAgIGVudW0geworICAgICAgICBQQUdFX0ZMSVAgPSAweDAwMDAwMDAxCisgICAgfTsKKyAgICBHR0xTdXJmYWNlICAgICAgICAgIG1GYlsyXTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1JbmRleDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1GbGFnczsKKyAgICBzaXplX3QgICAgICAgICAgICAgIG1TaXplOworICAgIGZiX3Zhcl9zY3JlZW5pbmZvICAgbUluZm87CisgICAgZmJfZml4X3NjcmVlbmluZm8gICBtRmluZm87CisgICAgaW50MzJfdCAgICAgICAgICAgICBtUGFnZUZsaXBDb3VudDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgIG1Td2FwQ291bnQ7CisgICAgdWludDMyX3QgICAgICAgICAgICBtRmVhdHVyZUZsYWdzOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyBBTkRST0lEX1NJTV9FR0xfU1VSRkFDRV9ICisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9zZnNpbS9zZnNpbS5jIGIvb3BlbmdsL3Rlc3RzL3Nmc2ltL3Nmc2ltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiYTQ5MAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9zZnNpbS9zZnNpbS5jCkBAIC0wLDAgKzEsMTEyIEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPEdMRVMvZWdsLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBpZiAoYXJnYyAhPSAyKSB7CisgICAgICAgIHByaW50ZigidXNhZ2U6ICVzIDwwLTY+XG4iLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIGNvbnN0IGludCB0ZXN0ID0gYXRvaShhcmd2WzFdKTsKKworICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgIEVHTF9SRURfU0laRSwgICAgICAgNSwKKyAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCAgICAgNiwKKyAgICAgICAgIEVHTF9CTFVFX1NJWkUsICAgICAgNSwKKyAgICAgICAgIEVHTF9OT05FCisgICAgIH07CisgICAgIAorICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IC0xOworICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOworICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOworICAgICBFR0xDb25maWcgY29uZmlnOworICAgICBFR0xDb250ZXh0IGNvbnRleHQ7CisgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKKyAgICAgRUdMaW50IHcsIGg7CisgICAgIAorICAgICBFR0xEaXNwbGF5IGRweTsKKworICAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgIGVnbENob29zZUNvbmZpZyhkcHksIHNfY29uZmlnQXR0cmlicywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3MpOworICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNvbmZpZywKKyAgICAgICAgICAgICBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCksIE5VTEwpOworICAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIGNvbmZpZywgTlVMTCwgTlVMTCk7CisgICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7ICAgCisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJncpOworICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7CisgICAgIEdMaW50IGRpbSA9IHc8aCA/IHcgOiBoOworCisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgNCwgNCwgLTQgfTsKKyAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOworICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKKyAgICAgZ2xDb2xvcjRmKDEsMSwxLDEpOworCisgICAgIC8vIHBhY2tpbmcgaXMgYWx3YXlzIDQKKyAgICAgdWludDhfdCB0OFtdICA9IHsgCisgICAgICAgICAgICAgMHgwMCwgMHg1NSwgMHgwMCwgMHg1NSwgCisgICAgICAgICAgICAgMHhBQSwgMHhGRiwgMHhBQSwgMHhGRiwKKyAgICAgICAgICAgICAweDAwLCAweDU1LCAweDAwLCAweDU1LCAKKyAgICAgICAgICAgICAweEFBLCAweEZGLCAweEFBLCAweEZGICB9OworCisgICAgIHVpbnQxNl90IHQxNltdICA9IHsgCisgICAgICAgICAgICAgMHgwMDAwLCAweDU1NTUsIDB4MDAwMCwgMHg1NTU1LCAKKyAgICAgICAgICAgICAweEFBQUEsIDB4RkZGRiwgMHhBQUFBLCAweEZGRkYsCisgICAgICAgICAgICAgMHgwMDAwLCAweDU1NTUsIDB4MDAwMCwgMHg1NTU1LCAKKyAgICAgICAgICAgICAweEFBQUEsIDB4RkZGRiwgMHhBQUFBLCAweEZGRkYgIH07CisKKyAgICAgdWludDE2X3QgdDU1NTFbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgCisgICAgICAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLAorICAgICAgICAgICAgIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgCisgICAgICAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgMHgwMDAwICB9OworCisgICAgIHVpbnQzMl90IHQzMltdICA9IHsgCisgICAgICAgICAgICAgMHhGRjAwMDAwMCwgMHhGRjAwMDBGRiwgMHhGRjAwRkYwMCwgMHhGRkZGMDAwMCwgCisgICAgICAgICAgICAgMHhGRjAwRkYwMCwgMHhGRkZGMDAwMCwgMHhGRjAwMDAwMCwgMHhGRjAwMDBGRiwgCisgICAgICAgICAgICAgMHhGRjAwRkZGRiwgMHhGRjAwRkYwMCwgMHgwMEZGMDBGRiwgMHhGRkZGRkYwMCwgCisgICAgICAgICAgICAgMHhGRjAwMDAwMCwgMHhGRkZGMDBGRiwgMHhGRjAwRkZGRiwgMHhGRkZGRkZGRgorICAgICB9OworCisgICAgIHN3aXRjaCh0ZXN0KSAKKyAgICAgeworICAgICBjYXNlIDE6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfTFVNSU5BTkNFLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9MVU1JTkFOQ0UsIEdMX1VOU0lHTkVEX0JZVEUsIHQ4KTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDI6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCB0MTYpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgMzoKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80LCB0MTYpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgNDoKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9MVU1JTkFOQ0VfQUxQSEEsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX0xVTUlOQU5DRV9BTFBIQSwgR0xfVU5TSUdORURfQllURSwgdDE2KTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDU6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSwgdDU1NTEpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgNjoKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCB0MzIpOworICAgICAgICAgYnJlYWs7CisgICAgIH0KKworICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIGRpbSwgZGltKTsKKworICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXh0dXJlcy9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL3RleHR1cmVzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBjOTAyMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90ZXh0dXJlcy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwl0ZXh0dXJlcy5jCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmN1dGlscyBcCisgICAgbGliR0xFU19DTSBcCisgICAgbGlidWkKKworTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtdGV4dHVyZXMKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGV4dHVyZXMvdGV4dHVyZXMuYyBiL29wZW5nbC90ZXN0cy90ZXh0dXJlcy90ZXh0dXJlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZTNiZTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGV4dHVyZXMvdGV4dHVyZXMuYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPEdMRVMvZWdsLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7CisgICAgICAgICBFR0xfUkVEX1NJWkUsICAgICAgIDUsCisgICAgICAgICBFR0xfR1JFRU5fU0laRSwgICAgIDYsCisgICAgICAgICBFR0xfQkxVRV9TSVpFLCAgICAgIDUsCisgICAgICAgICBFR0xfTk9ORQorICAgICB9OworICAgICAKKyAgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMTsKKyAgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKKyAgICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKKyAgICAgRUdMQ29uZmlnIGNvbmZpZzsKKyAgICAgRUdMQ29udGV4dCBjb250ZXh0OworICAgICBFR0xTdXJmYWNlIHN1cmZhY2U7CisgICAgIEVHTGludCB3LCBoOworICAgICAKKyAgICAgRUdMRGlzcGxheSBkcHk7CisKKyAgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOworICAgICBlZ2xDaG9vc2VDb25maWcoZHB5LCBzX2NvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKKyAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjb25maWcsCisgICAgICAgICAgICAgYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpLCBOVUxMKTsKKyAgICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBjb25maWcsIE5VTEwsIE5VTEwpOworICAgICBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOyAgIAorICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOworICAgICBHTGludCBkaW0gPSB3PGggPyB3IDogaDsKKworCisgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDQsIDQsIC00IH07CisgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7CisgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKKyAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7CisgICAgIGdsQ29sb3I0ZigxLDEsMSwxKTsKKworICAgICAvLyBwYWNraW5nIGlzIGFsd2F5cyA0CisgICAgIHVpbnQ4X3QgdDhbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAsIDB4NTUsIDB4MDAsIDB4NTUsIAorICAgICAgICAgICAgIDB4QUEsIDB4RkYsIDB4QUEsIDB4RkYsCisgICAgICAgICAgICAgMHgwMCwgMHg1NSwgMHgwMCwgMHg1NSwgCisgICAgICAgICAgICAgMHhBQSwgMHhGRiwgMHhBQSwgMHhGRiAgfTsKKworICAgICB1aW50MTZfdCB0MTZbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAwMCwgMHg1NTU1LCAweDAwMDAsIDB4NTU1NSwgCisgICAgICAgICAgICAgMHhBQUFBLCAweEZGRkYsIDB4QUFBQSwgMHhGRkZGLAorICAgICAgICAgICAgIDB4MDAwMCwgMHg1NTU1LCAweDAwMDAsIDB4NTU1NSwgCisgICAgICAgICAgICAgMHhBQUFBLCAweEZGRkYsIDB4QUFBQSwgMHhGRkZGICB9OworCisgICAgIHVpbnQxNl90IHQ1NTUxW10gID0geyAKKyAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIAorICAgICAgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwKKyAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIAorICAgICAgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCAgfTsKKworICAgICB1aW50MzJfdCB0MzJbXSAgPSB7IAorICAgICAgICAgICAgIDB4RkYwMDAwMDAsIDB4RkYwMDAwRkYsIDB4RkYwMEZGMDAsIDB4RkZGRjAwMDAsIAorICAgICAgICAgICAgIDB4RkYwMEZGMDAsIDB4RkZGRjAwMDAsIDB4RkYwMDAwMDAsIDB4RkYwMDAwRkYsIAorICAgICAgICAgICAgIDB4RkYwMEZGRkYsIDB4RkYwMEZGMDAsIDB4MDBGRjAwRkYsIDB4RkZGRkZGMDAsIAorICAgICAgICAgICAgIDB4RkYwMDAwMDAsIDB4RkZGRjAwRkYsIDB4RkYwMEZGRkYsIDB4RkZGRkZGRkYKKyAgICAgfTsKKworCisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9MVU1JTkFOQ0UsIDQsIDQsIDAsIEdMX0xVTUlOQU5DRSwgR0xfVU5TSUdORURfQllURSwgdDgpOworICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIGRpbS8yLCBkaW0vMik7CisKKyAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwgNCwgNCwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgdDE2KTsKKyAgICAgZ2xEcmF3VGV4aU9FUyhkaW0vMiwgMCwgMCwgZGltLzIsIGRpbS8yKTsKKworICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCwgdDE2KTsKKyAgICAgZ2xEcmF3VGV4aU9FUygwLCBkaW0vMiwgMCwgZGltLzIsIGRpbS8yKTsKKworICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgdDMyKTsKKyAgICAgZ2xEcmF3VGV4aU9FUyhkaW0vMiwgZGltLzIsIDAsIGRpbS8yLCBkaW0vMik7CisKKyAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdHJpdGV4L0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvdHJpdGV4L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkYWM0YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90cml0ZXgvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE2IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJdHJpdGV4LmMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzIFwKKyAgICBsaWJHTEVTX0NNIFwKKyAgICBsaWJ1aQorCitMT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC10cml0ZXgKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdHJpdGV4L3RyaXRleC5jIGIvb3BlbmdsL3Rlc3RzL3RyaXRleC90cml0ZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWJlN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3RyaXRleC90cml0ZXguYwpAQCAtMCwwICsxLDI3MSBAQAorLy8gQ2FsbHMgZ2xEcmF3RWxlbWVudHMoKSB0aGUgbnVtYmVyIG9mIHRpbWVzIHNwZWNpZmllZCBieQorLy8gSVRFUkFUSU9OUy4gU2hvdWxkIGRyYXcgYSBjaGVja2VyYm9hcmQgb24gdGhlIHNjcmVlbiBhZnRlcgorLy8gYSBmZXcgc2Vjb25kcy4KKy8vCisvLyBQb3J0ZWQgZnJvbSBhIEphdmEgdmVyc2lvbiBieSBHb29nbGUuCisKKyNpbmNsdWRlIDxHTEVTL2VnbC5oPg0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisNCitFR0xEaXNwbGF5IGVnbERpc3BsYXk7DQorRUdMU3VyZmFjZSBlZ2xTdXJmYWNlOw0KK0VHTENvbnRleHQgZWdsQ29udGV4dDsNCitHTHVpbnQgdGV4dHVyZTsNCisNCisjZGVmaW5lIEZJWEVEX09ORSAweDEwMDAwCisjZGVmaW5lIElURVJBVElPTlMgNTANCisNCitpbnQgaW5pdF9nbF9zdXJmYWNlKHZvaWQpOw0KK3ZvaWQgZnJlZV9nbF9zdXJmYWNlKHZvaWQpOw0KK3ZvaWQgaW5pdF9zY2VuZSh2b2lkKTsNCit2b2lkIHJlbmRlcihpbnQgcXVhZHMpOw0KK3ZvaWQgY3JlYXRlX3RleHR1cmUodm9pZCk7CitpbnQgcmVhZFRpbWVyKHZvaWQpOw0KKworc3RhdGljIHZvaWQgZ2x1TG9va0F0KGZsb2F0IGV5ZVgsIGZsb2F0IGV5ZVksIGZsb2F0IGV5ZVosCisgICAgICAgIGZsb2F0IGNlbnRlclgsIGZsb2F0IGNlbnRlclksIGZsb2F0IGNlbnRlclosIGZsb2F0IHVwWCwgZmxvYXQgdXBZLAorICAgICAgICBmbG9hdCB1cFopCit7CisgICAgLy8gU2VlIHRoZSBPcGVuR0wgR0xVVCBkb2N1bWVudGF0aW9uIGZvciBnbHVMb29rQXQgZm9yIGEgZGVzY3JpcHRpb24KKyAgICAvLyBvZiB0aGUgYWxnb3JpdGhtLiBXZSBpbXBsZW1lbnQgaXQgaW4gYSBzdHJhaWdodGZvcndhcmQgd2F5OgorCisgICAgZmxvYXQgZnggPSBjZW50ZXJYIC0gZXllWDsKKyAgICBmbG9hdCBmeSA9IGNlbnRlclkgLSBleWVZOworICAgIGZsb2F0IGZ6ID0gY2VudGVyWiAtIGV5ZVo7CisKKyAgICAvLyBOb3JtYWxpemUgZgorICAgIGZsb2F0IHJsZiA9IDEuMGYgLyBzcXJ0ZihmeCpmeCArIGZ5KmZ5ICsgZnoqZnopOworICAgIGZ4ICo9IHJsZjsKKyAgICBmeSAqPSBybGY7CisgICAgZnogKj0gcmxmOworCisgICAgLy8gTm9ybWFsaXplIHVwCisgICAgZmxvYXQgcmx1cCA9IDEuMGYgLyBzcXJ0Zih1cFgqdXBYICsgdXBZKnVwWSArIHVwWip1cFopOworICAgIHVwWCAqPSBybHVwOworICAgIHVwWSAqPSBybHVwOworICAgIHVwWiAqPSBybHVwOworCisgICAgLy8gY29tcHV0ZSBzID0gZiB4IHVwICh4IG1lYW5zICJjcm9zcyBwcm9kdWN0IikKKworICAgIGZsb2F0IHN4ID0gZnkgKiB1cFogLSBmeiAqIHVwWTsKKyAgICBmbG9hdCBzeSA9IGZ6ICogdXBYIC0gZnggKiB1cFo7CisgICAgZmxvYXQgc3ogPSBmeCAqIHVwWSAtIGZ5ICogdXBYOworCisgICAgLy8gY29tcHV0ZSB1ID0gcyB4IGYKKyAgICBmbG9hdCB1eCA9IHN5ICogZnogLSBzeiAqIGZ5OworICAgIGZsb2F0IHV5ID0gc3ogKiBmeCAtIHN4ICogZno7CisgICAgZmxvYXQgdXogPSBzeCAqIGZ5IC0gc3kgKiBmeDsKKworICAgIGZsb2F0IG1bMTZdIDsKKyAgICBtWzBdID0gc3g7CisgICAgbVsxXSA9IHV4OworICAgIG1bMl0gPSAtZng7CisgICAgbVszXSA9IDAuMGY7CisKKyAgICBtWzRdID0gc3k7CisgICAgbVs1XSA9IHV5OworICAgIG1bNl0gPSAtZnk7CisgICAgbVs3XSA9IDAuMGY7CisKKyAgICBtWzhdID0gc3o7CisgICAgbVs5XSA9IHV6OworICAgIG1bMTBdID0gLWZ6OworICAgIG1bMTFdID0gMC4wZjsKKworICAgIG1bMTJdID0gMC4wZjsKKyAgICBtWzEzXSA9IDAuMGY7CisgICAgbVsxNF0gPSAwLjBmOworICAgIG1bMTVdID0gMS4wZjsKKworICAgIGdsTXVsdE1hdHJpeGYobSk7CisgICAgZ2xUcmFuc2xhdGVmKC1leWVYLCAtZXllWSwgLWV5ZVopOworfQorDQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQ0KK3sNCisgICAgaW50IHE7CisgICAgaW50IHN0YXJ0LCBlbmQ7DQorCisgICAgcHJpbnRmKCJJbml0aWFsaXppbmcgRUdMLi4uXG4iKTsKKw0KKyAgICBpZighaW5pdF9nbF9zdXJmYWNlKCkpDQorICAgIHsNCisgICAgICAgIHByaW50ZigiR0wgaW5pdGlhbGlzYXRpb24gZmFpbGVkIC0gZXhpdGluZ1xuIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBpbml0X3NjZW5lKCk7DQorDQorICAgIGNyZWF0ZV90ZXh0dXJlKCk7DQorDQorICAgIHByaW50ZigiU3RhcnQgdGVzdC4uLlxuIik7CisKKyAgICByZW5kZXIoYXJnYz09MiA/IGF0b2koYXJndlsxXSkgOiBJVEVSQVRJT05TKTsNCisNCisgICAgZnJlZV9nbF9zdXJmYWNlKCk7DQorDQorICAgIHJldHVybiAwOw0KK30NCisNCitpbnQgaW5pdF9nbF9zdXJmYWNlKHZvaWQpDQorew0KKyAgICBFR0xpbnQgbnVtQ29uZmlncyA9IDE7DQorICAgIEVHTENvbmZpZyBteUNvbmZpZyA9IHswfTsNCisgICAgRUdMaW50IGF0dHJpYltdID0NCisgICAgew0KKyAgICAgICAgICAgIEVHTF9ERVBUSF9TSVpFLCAgICAgMTYsDQorICAgICAgICAgICAgRUdMX05PTkUNCisgICAgfTsNCisNCisgICAgaWYgKCAoZWdsRGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSkpID09IEVHTF9OT19ESVNQTEFZICkNCisgICAgew0KKyAgICAgICAgcHJpbnRmKCJlZ2xHZXREaXNwbGF5IGZhaWxlZFxuIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBpZiAoIGVnbEluaXRpYWxpemUoZWdsRGlzcGxheSwgTlVMTCwgTlVMTCkgIT0gRUdMX1RSVUUgKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoImVnbEluaXRpYWxpemUgZmFpbGVkXG4iKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIGlmICggZWdsQ2hvb3NlQ29uZmlnKGVnbERpc3BsYXksIGF0dHJpYiwgJm15Q29uZmlnLCAxLCAmbnVtQ29uZmlncykgIT0gRUdMX1RSVUUgKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoImVnbENob29zZUNvbmZpZyBmYWlsZWRcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgaWYgKCAoZWdsU3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZWdsRGlzcGxheSwgbXlDb25maWcsCisgICAgICAgICAgICBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCksIDApKSA9PSBFR0xfTk9fU1VSRkFDRSApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZWdsQ3JlYXRlV2luZG93U3VyZmFjZSBmYWlsZWRcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgaWYgKCAoZWdsQ29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZWdsRGlzcGxheSwgbXlDb25maWcsIDAsIDApKSA9PSBFR0xfTk9fQ09OVEVYVCApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZWdsQ3JlYXRlQ29udGV4dCBmYWlsZWRcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgaWYgKCBlZ2xNYWtlQ3VycmVudChlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlLCBlZ2xTdXJmYWNlLCBlZ2xDb250ZXh0KSAhPSBFR0xfVFJVRSApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZWdsTWFrZUN1cnJlbnQgZmFpbGVkXG4iKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIHJldHVybiAxOw0KK30NCisNCit2b2lkIGZyZWVfZ2xfc3VyZmFjZSh2b2lkKQ0KK3sNCisgICAgaWYgKGVnbERpc3BsYXkgIT0gRUdMX05PX0RJU1BMQVkpDQorICAgIHsNCisgICAgICAgIGVnbE1ha2VDdXJyZW50KCBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NVUkZBQ0UsDQorICAgICAgICAgICAgICAgIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fQ09OVEVYVCApOw0KKyAgICAgICAgZWdsRGVzdHJveUNvbnRleHQoIGVnbERpc3BsYXksIGVnbENvbnRleHQgKTsNCisgICAgICAgIGVnbERlc3Ryb3lTdXJmYWNlKCBlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlICk7DQorICAgICAgICBlZ2xUZXJtaW5hdGUoIGVnbERpc3BsYXkgKTsNCisgICAgICAgIGVnbERpc3BsYXkgPSBFR0xfTk9fRElTUExBWTsNCisgICAgfQ0KK30NCisNCit2b2lkIGluaXRfc2NlbmUodm9pZCkNCit7DQorICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOworICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisKKyAgICBmbG9hdCByYXRpbyA9IDMyMC4wZiAvIDQ4MC4wZjsKKyAgICBnbFZpZXdwb3J0KDAsIDAsIDMyMCwgNDgwKTsKKworICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKyAgICBnbExvYWRJZGVudGl0eSgpOworICAgIGdsRnJ1c3R1bWYoLXJhdGlvLCByYXRpbywgLTEsIDEsIDEsIDEwKTsKKworICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOw0KKyAgICBnbExvYWRJZGVudGl0eSgpOworICAgIGdsdUxvb2tBdCgKKyAgICAgICAgICAgIDAsIDAsIDMsICAvLyBleWUKKyAgICAgICAgICAgIDAsIDAsIDAsICAvLyBjZW50ZXIKKyAgICAgICAgICAgIDAsIDEsIDApOyAvLyB1cAorDQorICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOw0KKyAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7DQorICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Cit9DQorDQordm9pZCBjcmVhdGVfdGV4dHVyZSh2b2lkKQ0KK3sNCisgICAgY29uc3QgdW5zaWduZWQgaW50IG9uID0gMHhmZjAwMDBmZjsKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgb2ZmID0gMHhmZmZmZmZmZjsKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgcGl4ZWxzW10gPQorICAgIHsKKyAgICAgICAgICAgIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsCisgICAgICAgICAgICBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLAorICAgICAgICAgICAgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwKKyAgICAgICAgICAgIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sCisgICAgICAgICAgICBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLAorICAgICAgICAgICAgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwKKyAgICAgICAgICAgIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsCisgICAgICAgICAgICBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLAorICAgIH07DQorICAgIGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmUpOw0KKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOw0KKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgOCwgOCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgcGl4ZWxzKTsNCisgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7DQorICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOw0KKyAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOw0KK30NCisNCit2b2lkIHJlbmRlcihpbnQgcXVhZHMpDQorew0KKyAgICBpbnQgaSwgajsNCisNCisgICAgY29uc3QgR0xmbG9hdCB2ZXJ0aWNlc1tdID0gew0KKyAgICAgICAgICAgIC0xLCAgLTEsICAwLA0KKyAgICAgICAgICAgICAxLCAgLTEsICAwLA0KKyAgICAgICAgICAgICAxLCAgIDEsICAwLA0KKyAgICAgICAgICAgIC0xLCAgIDEsICAwDQorICAgIH07DQorDQorICAgIGNvbnN0IEdMZml4ZWQgdGV4Q29vcmRzW10gPSB7DQorICAgICAgICAgICAgMCwgICAgICAgICAgICAwLA0KKyAgICAgICAgICAgIEZJWEVEX09ORSwgICAgMCwNCisgICAgICAgICAgICBGSVhFRF9PTkUsICAgIEZJWEVEX09ORSwNCisgICAgICAgICAgICAwLCAgICAgICAgICAgIEZJWEVEX09ORQ0KKyAgICB9Ow0KKw0KKyAgICBjb25zdCBHTHVzaG9ydCB0ZW1wbGF0ZVtdID0geyAwLCAxLCAyLCAgMCwgMiwgMyB9OworCisKKyAgICBHTHVzaG9ydCogaW5kaWNlcyA9IChHTHVzaG9ydCopbWFsbG9jKHF1YWRzKnNpemVvZih0ZW1wbGF0ZSkpOworICAgIGZvciAoaT0wIDsgaTxxdWFkcyA7IGkrKykKKyAgICAgICAgbWVtY3B5KGluZGljZXMrKHNpemVvZih0ZW1wbGF0ZSkvc2l6ZW9mKGluZGljZXNbMF0pKSppLCB0ZW1wbGF0ZSwgc2l6ZW9mKHRlbXBsYXRlKSk7CisNCisgICAgZ2xWZXJ0ZXhQb2ludGVyKDMsIEdMX0ZMT0FULCAwLCB2ZXJ0aWNlcyk7DQorICAgIGdsVGV4Q29vcmRQb2ludGVyKDIsIEdMX0ZJWEVELCAwLCB0ZXhDb29yZHMpOworCisgICAgLy8gbWFrZSBzdXJlIHRvIGRvIGEgY291cGxlIGVnbFN3YXBCdWZmZXJzIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUKKyAgICAvLyBubyBwcm9ibGVtcyB3aXRoIHRoZSB2ZXJ5IGZpcnN0IG9uZXMgKHdobyBrbm93cykKKyAgICBnbENsZWFyQ29sb3IoMC40LCAwLjQsIDAuNCwgMC40KTsKKyAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICBlZ2xTd2FwQnVmZmVycyhlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlKTsKKyAgICBnbENsZWFyQ29sb3IoMC42LCAwLjYsIDAuNiwgMC42KTsKKyAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICBlZ2xTd2FwQnVmZmVycyhlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlKTsKKyAgICBnbENsZWFyQ29sb3IoMS4wLCAxLjAsIDEuMCwgMS4wKTsKKworICAgIGZvciAoaj0wIDsgajwxMCA7IGorKykgeworICAgICAgICBwcmludGYoImxvb3AgJWQgLyAxMCAoJWQgcXVhZHMgLyBsb29wKVxuIiwgaiwgcXVhZHMpOworCisgICAgICAgIGludCBuZWxlbSA9IHNpemVvZih0ZW1wbGF0ZSkvc2l6ZW9mKHRlbXBsYXRlWzBdKTsKKyAgICAgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xFUywgbmVsZW0qcXVhZHMsIEdMX1VOU0lHTkVEX1NIT1JULCBpbmRpY2VzKTsKKyAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZWdsRGlzcGxheSwgZWdsU3VyZmFjZSk7CisgICAgfQorCisgICAgZnJlZShpbmRpY2VzKTsNCit9DQorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2VuIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dlbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYzQ5ODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dlbgpAQCAtMCwwICsxLDk5IEBACisjIS9iaW4vc2gKK3JtIC1yZiBvdXQgZ2VuZXJhdGVkCisKK21rZGlyIG91dAorbWtkaXIgLXAgb3V0L2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzCitta2RpciAtcCBvdXQvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pCitta2RpciAtcCBvdXQvYW5kcm9pZC9ncmFwaGljcworCitlY2hvICJwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7IiA+IG91dC9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCitlY2hvICJwdWJsaWMgaW50ZXJmYWNlIENhbnZhcyB7fSIgPj4gb3V0L2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKKworR0xGSUxFPW91dC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhCitjcCBzdHVicy9HTEhlYWRlci5qYXZhLWlmICRHTEZJTEUKKworR0xHRU5fRklMRVM9IkNGdW5jLmphdmEgQ1R5cGUuamF2YSBDb2RlRW1pdHRlci5qYXZhIEdlbmVyYXRlR0wuamF2YSBKRnVuYy5qYXZhIEpUeXBlLmphdmEgSm5pQ29kZUVtaXR0ZXIuamF2YSBQYXJhbWV0ZXJDaGVja2VyLmphdmEiCisKK3B1c2hkIHNyYyA+IC9kZXYvbnVsbAoramF2YWMgJHtHTEdFTl9GSUxFU30KK3BvcGQgPiAvZGV2L251bGwKK2phdmEgLWNsYXNzcGF0aCBzcmMgR2VuZXJhdGVHTCAtYyBnbHNwZWMtMS4wIGdsc3BlYy0xLjBleHQgZ2xzcGVjLTEuMSBnbHNwZWMtMS4xZXh0IGdsc3BlYy0xLjFleHRwYWNrIGdsc3BlYy1jaGVja3MKKworcHVzaGQgb3V0ID4gL2Rldi9udWxsCitta2RpciBjbGFzc2VzCitqYXZhYyAtZCBjbGFzc2VzIGNvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwuamF2YSBqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwLmphdmEgamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMEV4dC5qYXZhIGphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YSBqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0LmphdmEgamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dGVuc2lvblBhY2suamF2YQorcG9wZCA+IC9kZXYvbnVsbAorCitybSAtcmYgZ2VuZXJhdGVkCitta2RpciAtcCBnZW5lcmF0ZWQvQworY3Agb3V0L2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIGdlbmVyYXRlZC9DCitjcCAtciBvdXQvY29tIGdlbmVyYXRlZAorY3AgLXIgb3V0L2phdmF4IGdlbmVyYXRlZAorCitybSAtcmYgb3V0CisKKyMgY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAKK2lmIGNtcCAuLi8uLi8uLi9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkvY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAgZ2VuZXJhdGVkL0MvY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAgOyB0aGVuCitlY2hvIGNvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi8uLi9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkvY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAKK2VjaG8gUGxlYXNlIGNwIGdlbmVyYXRlZC9DL2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIC4uLy4uLy4uL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2puaQorZmkKKworIyBHTEltcGwuamF2YQoraWYgY21wIC4uLy4uL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0dMSW1wbC5qYXZhIGdlbmVyYXRlZC9jb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvR0xJbXBsLmphdmEgOyB0aGVuCitlY2hvIEdMSW1wbC5qYXZhIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwuamF2YQorZWNobyBQbGVhc2UgY3AgZ2VuZXJhdGVkL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwuamF2YSAuLi8uLi9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaQorZmkKKworIyBHTC5qYXZhCitpZiBjbXAgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhIDsgdGhlbgorZWNobyBHTC5qYXZhIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMLmphdmEKK2VjaG8gUGxlYXNlIGNwIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wuamF2YQorZmkKKworIyBHTDEwLmphdmEKK2lmIGNtcCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTAuamF2YSBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhIDsgdGhlbgorZWNobyBHTDEwLmphdmEgdW5jaGFuZ2VkCitlbHNlCitlY2hvIFBsZWFzZSBlZGl0IC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhCitlY2hvIFBsZWFzZSBjcCBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhCitmaQorCisjIEdMMTBFeHQuamF2YQoraWYgY21wIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMEV4dC5qYXZhIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEgOyB0aGVuCitlY2hvIEdMMTBFeHQuamF2YSB1bmNoYW5nZWQKK2Vsc2UKK2VjaG8gUGxlYXNlIGVkaXQgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEKK2VjaG8gUGxlYXNlIGNwIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEKK2ZpCisKKyMgR0wxMS5qYXZhCitpZiBjbXAgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExLmphdmEgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YSA7IHRoZW4KK2VjaG8gR0wxMS5qYXZhIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YQorZWNobyBQbGVhc2UgY3AgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YSAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YQorZmkKKworIyBHTDExRXh0LmphdmEKK2lmIGNtcCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHQuamF2YSBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhIDsgdGhlbgorZWNobyBHTDExRXh0LmphdmEgdW5jaGFuZ2VkCitlbHNlCitlY2hvIFBsZWFzZSBlZGl0IC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhCitlY2hvIFBsZWFzZSBjcCBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhCitmaQorCisjIEdMMTFFeHRlbnNpb25QYWNrLmphdmEKK2lmIGNtcCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEgOyB0aGVuCitlY2hvIEdMMTFFeHRlbnNpb25QYWNrLmphdmEgdW5jaGFuZ2VkCitlbHNlCitlY2hvIFBsZWFzZSBlZGl0IC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dGVuc2lvblBhY2suamF2YQorZWNobyBQbGVhc2UgY3AgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0ZW5zaW9uUGFjay5qYXZhCitmaQorCitybSAtcmYgZ2VuZXJhdGVkCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMCBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NDIzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMApAQCAtMCwwICsxLDEwNiBAQAordm9pZCBnbEFjdGl2ZVRleHR1cmUgKCBHTGVudW0gdGV4dHVyZSApDQordm9pZCBnbEFscGhhRnVuYyAoIEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYgKQ0KK3ZvaWQgZ2xBbHBoYUZ1bmN4ICggR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZiApDQordm9pZCBnbEJpbmRUZXh0dXJlICggR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUgKQ0KK3ZvaWQgZ2xCbGVuZEZ1bmMgKCBHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IgKQ0KK3ZvaWQgZ2xDbGVhciAoIEdMYml0ZmllbGQgbWFzayApDQordm9pZCBnbENsZWFyQ29sb3IgKCBHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSApDQordm9pZCBnbENsZWFyQ29sb3J4ICggR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEgKQ0KK3ZvaWQgZ2xDbGVhckRlcHRoZiAoIEdMY2xhbXBmIGRlcHRoICkNCit2b2lkIGdsQ2xlYXJEZXB0aHggKCBHTGNsYW1weCBkZXB0aCApDQordm9pZCBnbENsZWFyU3RlbmNpbCAoIEdMaW50IHMgKQ0KK3ZvaWQgZ2xDbGllbnRBY3RpdmVUZXh0dXJlICggR0xlbnVtIHRleHR1cmUgKQ0KK3ZvaWQgZ2xDb2xvcjRmICggR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSApDQordm9pZCBnbENvbG9yNHggKCBHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhICkNCit2b2lkIGdsQ29sb3JNYXNrICggR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhICkNCit2b2lkIGdsQ29sb3JQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KK3ZvaWQgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQ0KK3ZvaWQgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApDQordm9pZCBnbENvcHlUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciApDQordm9pZCBnbENvcHlUZXhTdWJJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkNCit2b2lkIGdsQ3VsbEZhY2UgKCBHTGVudW0gbW9kZSApDQordm9pZCBnbERlbGV0ZVRleHR1cmVzICggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzICkNCit2b2lkIGdsRGVwdGhGdW5jICggR0xlbnVtIGZ1bmMgKQ0KK3ZvaWQgZ2xEZXB0aE1hc2sgKCBHTGJvb2xlYW4gZmxhZyApDQordm9pZCBnbERlcHRoUmFuZ2VmICggR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIgKQ0KK3ZvaWQgZ2xEZXB0aFJhbmdleCAoIEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyICkNCit2b2lkIGdsRGlzYWJsZSAoIEdMZW51bSBjYXAgKQ0KK3ZvaWQgZ2xEaXNhYmxlQ2xpZW50U3RhdGUgKCBHTGVudW0gYXJyYXkgKQ0KK3ZvaWQgZ2xEcmF3QXJyYXlzICggR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50ICkNCit2b2lkIGdsRHJhd0VsZW1lbnRzICggR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMgKQ0KK3ZvaWQgZ2xFbmFibGUgKCBHTGVudW0gY2FwICkNCit2b2lkIGdsRW5hYmxlQ2xpZW50U3RhdGUgKCBHTGVudW0gYXJyYXkgKQ0KK3ZvaWQgZ2xGaW5pc2ggKCB2b2lkICkNCit2b2lkIGdsRmx1c2ggKCB2b2lkICkNCit2b2lkIGdsRm9nZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApDQordm9pZCBnbEZvZ2Z2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xGb2d4ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkNCit2b2lkIGdsRm9neHYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbEZyb250RmFjZSAoIEdMZW51bSBtb2RlICkNCit2b2lkIGdsRnJ1c3R1bWYgKCBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyICkNCit2b2lkIGdsRnJ1c3R1bXggKCBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyICkNCit2b2lkIGdsR2VuVGV4dHVyZXMgKCBHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMgKQ0KK0dMZW51bSBnbEdldEVycm9yICggdm9pZCApDQordm9pZCBnbEdldEludGVnZXJ2ICggR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCitjb25zdCBHTHVieXRlICogZ2xHZXRTdHJpbmcgKCBHTGVudW0gbmFtZSApDQordm9pZCBnbEhpbnQgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSApDQordm9pZCBnbExpZ2h0TW9kZWxmICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCit2b2lkIGdsTGlnaHRNb2RlbGZ2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xMaWdodE1vZGVseCAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQordm9pZCBnbExpZ2h0TW9kZWx4diAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsTGlnaHRmICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KK3ZvaWQgZ2xMaWdodGZ2ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbExpZ2h0eCAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkNCit2b2lkIGdsTGlnaHR4diAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xMaW5lV2lkdGggKCBHTGZsb2F0IHdpZHRoICkNCit2b2lkIGdsTGluZVdpZHRoeCAoIEdMZml4ZWQgd2lkdGggKQ0KK3ZvaWQgZ2xMb2FkSWRlbnRpdHkgKCB2b2lkICkNCit2b2lkIGdsTG9hZE1hdHJpeGYgKCBjb25zdCBHTGZsb2F0ICptICkNCit2b2lkIGdsTG9hZE1hdHJpeHggKCBjb25zdCBHTGZpeGVkICptICkNCit2b2lkIGdsTG9naWNPcCAoIEdMZW51bSBvcGNvZGUgKQ0KK3ZvaWQgZ2xNYXRlcmlhbGYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCit2b2lkIGdsTWF0ZXJpYWxmdiAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbE1hdGVyaWFseCAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQ0KK3ZvaWQgZ2xNYXRlcmlhbHh2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsTWF0cml4TW9kZSAoIEdMZW51bSBtb2RlICkNCit2b2lkIGdsTXVsdE1hdHJpeGYgKCBjb25zdCBHTGZsb2F0ICptICkNCit2b2lkIGdsTXVsdE1hdHJpeHggKCBjb25zdCBHTGZpeGVkICptICkNCit2b2lkIGdsTXVsdGlUZXhDb29yZDRmICggR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxICkNCit2b2lkIGdsTXVsdGlUZXhDb29yZDR4ICggR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxICkNCit2b2lkIGdsTm9ybWFsM2YgKCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56ICkNCit2b2lkIGdsTm9ybWFsM3ggKCBHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56ICkNCit2b2lkIGdsTm9ybWFsUG9pbnRlciAoIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkNCit2b2lkIGdsT3J0aG9mICggR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciApDQordm9pZCBnbE9ydGhveCAoIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIgKQ0KK3ZvaWQgZ2xQaXhlbFN0b3JlaSAoIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKQ0KK3ZvaWQgZ2xQb2ludFNpemUgKCBHTGZsb2F0IHNpemUgKQ0KK3ZvaWQgZ2xQb2ludFNpemV4ICggR0xmaXhlZCBzaXplICkNCit2b2lkIGdsUG9seWdvbk9mZnNldCAoIEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzICkNCit2b2lkIGdsUG9seWdvbk9mZnNldHggKCBHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyApDQordm9pZCBnbFBvcE1hdHJpeCAoIHZvaWQgKQ0KK3ZvaWQgZ2xQdXNoTWF0cml4ICggdm9pZCApDQordm9pZCBnbFJlYWRQaXhlbHMgKCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzICkNCit2b2lkIGdsUm90YXRlZiAoIEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKQ0KK3ZvaWQgZ2xSb3RhdGV4ICggR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiApDQordm9pZCBnbFNhbXBsZUNvdmVyYWdlICggR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQgKQ0KK3ZvaWQgZ2xTYW1wbGVDb3ZlcmFnZXggKCBHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCApDQordm9pZCBnbFNjYWxlZiAoIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKQ0KK3ZvaWQgZ2xTY2FsZXggKCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6ICkNCit2b2lkIGdsU2Npc3NvciAoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkNCit2b2lkIGdsU2hhZGVNb2RlbCAoIEdMZW51bSBtb2RlICkNCit2b2lkIGdsU3RlbmNpbEZ1bmMgKCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayApDQordm9pZCBnbFN0ZW5jaWxNYXNrICggR0x1aW50IG1hc2sgKQ0KK3ZvaWQgZ2xTdGVuY2lsT3AgKCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MgKQ0KK3ZvaWQgZ2xUZXhDb29yZFBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQordm9pZCBnbFRleEVudmYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KK3ZvaWQgZ2xUZXhFbnZmdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsVGV4RW52eCAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQordm9pZCBnbFRleEVudnh2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMgKQ0KK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJmICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCit2b2lkIGdsVGV4UGFyYW1ldGVyeCAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQordm9pZCBnbFRleFN1YkltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyApDQordm9pZCBnbFRyYW5zbGF0ZWYgKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkNCit2b2lkIGdsVHJhbnNsYXRleCAoIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHogKQ0KK3ZvaWQgZ2xWZXJ0ZXhQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KK3ZvaWQgZ2xWaWV3cG9ydCAoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMGV4dCBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4wZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMTk3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMGV4dApAQCAtMCwwICsxIEBACitHTGJpdGZpZWxkIGdsUXVlcnlNYXRyaXh4T0VTICggR0xmaXhlZCAqbWFudGlzc2EsIEdMaW50ICpleHBvbmVudCApDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTQ5YTdmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjEKQEAgLTAsMCArMSw0MiBAQAordm9pZCBnbEJpbmRCdWZmZXIgKCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyICkNCit2b2lkIGdsQnVmZmVyRGF0YSAoIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UgKQ0KK3ZvaWQgZ2xCdWZmZXJTdWJEYXRhICggR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApDQordm9pZCBnbENsaXBQbGFuZWYgKCBHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uICkNCit2b2lkIGdsQ2xpcFBsYW5leCAoIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24gKQ0KK3ZvaWQgZ2xDb2xvcjR1YiAoIEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEgKQ0KK3ZvaWQgZ2xDb2xvclBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQordm9pZCBnbERlbGV0ZUJ1ZmZlcnMgKCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYnVmZmVycyApDQordm9pZCBnbERyYXdFbGVtZW50cyAoIEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgR0xpbnQgb2Zmc2V0ICkNCit2b2lkIGdsR2VuQnVmZmVycyAoIEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzICkNCit2b2lkIGdsR2V0Qm9vbGVhbnYgKCBHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqcGFyYW1zICkNCit2b2lkIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRDbGlwUGxhbmVmICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICplcW4gKQ0KK3ZvaWQgZ2xHZXRDbGlwUGxhbmV4ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkICplcW4gKQ0KK3ZvaWQgZ2xHZXRGaXhlZHYgKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbEdldEZsb2F0diAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsR2V0TGlnaHRmdiAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRMaWdodHh2ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbEdldE1hdGVyaWFsZnYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRNYXRlcmlhbHh2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsR2V0VGV4RW52aXYgKCBHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRUZXhFbnZ4diAoIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsR2V0VGV4UGFyYW1ldGVyZnYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbEdldFRleFBhcmFtZXRlcml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCit2b2lkIGdsR2V0VGV4UGFyYW1ldGVyeHYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApDQorR0xib29sZWFuIGdsSXNCdWZmZXIgKCBHTHVpbnQgYnVmZmVyICkNCitHTGJvb2xlYW4gZ2xJc0VuYWJsZWQgKCBHTGVudW0gY2FwICkNCitHTGJvb2xlYW4gZ2xJc1RleHR1cmUgKCBHTHVpbnQgdGV4dHVyZSApDQordm9pZCBnbE5vcm1hbFBvaW50ZXIgKCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQordm9pZCBnbFBvaW50UGFyYW1ldGVyZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApDQordm9pZCBnbFBvaW50UGFyYW1ldGVyZnYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbFBvaW50UGFyYW1ldGVyeCAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQordm9pZCBnbFBvaW50UGFyYW1ldGVyeHYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbFBvaW50U2l6ZVBvaW50ZXJPRVMgKCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQordm9pZCBnbFRleENvb3JkUG9pbnRlciAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnQgb2Zmc2V0ICkNCit2b2lkIGdsVGV4RW52aSAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKQ0KK3ZvaWQgZ2xUZXhFbnZpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyApDQordm9pZCBnbFRleFBhcmFtZXRlcmZ2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJpICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApDQordm9pZCBnbFRleFBhcmFtZXRlcml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zICkNCit2b2lkIGdsVGV4UGFyYW1ldGVyeHYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbFZlcnRleFBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjFleHQgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMWV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzA4YzczCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjFleHQKQEAgLTAsMCArMSwxNiBAQAordm9pZCBnbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTICggR0x1aW50IG1hdHJpeHBhbGV0dGVpbmRleCApDQordm9pZCBnbERyYXdUZXhmT0VTICggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3aWR0aCwgR0xmbG9hdCBoZWlnaHQgKQ0KK3ZvaWQgZ2xEcmF3VGV4ZnZPRVMgKCBjb25zdCBHTGZsb2F0ICpjb29yZHMgKQ0KK3ZvaWQgZ2xEcmF3VGV4aU9FUyAoIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQgKQ0KK3ZvaWQgZ2xEcmF3VGV4aXZPRVMgKCBjb25zdCBHTGludCAqY29vcmRzICkNCit2b2lkIGdsRHJhd1RleHNPRVMgKCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHdpZHRoLCBHTHNob3J0IGhlaWdodCApDQordm9pZCBnbERyYXdUZXhzdk9FUyAoIGNvbnN0IEdMc2hvcnQgKmNvb3JkcyApDQordm9pZCBnbERyYXdUZXh4T0VTICggR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiwgR0xmaXhlZCB3aWR0aCwgR0xmaXhlZCBoZWlnaHQgKQ0KK3ZvaWQgZ2xEcmF3VGV4eHZPRVMgKCBjb25zdCBHTGZpeGVkICpjb29yZHMgKQ0KK3ZvaWQgZ2xFbmFibGUgKCBHTGVudW0gY2FwICkNCit2b2lkIGdsRW5hYmxlQ2xpZW50U3RhdGUgKCBHTGVudW0gYXJyYXkgKQ0KK3ZvaWQgZ2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVMgKCB2b2lkICkNCit2b2lkIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KK3ZvaWQgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQordm9pZCBnbFdlaWdodFBvaW50ZXJPRVMgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQordm9pZCBnbFdlaWdodFBvaW50ZXJPRVMgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjFleHRwYWNrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjFleHRwYWNrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOWU2ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMWV4dHBhY2sKQEAgLTAsMCArMSwzOCBAQAordm9pZCBnbEJpbmRGcmFtZWJ1ZmZlck9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgZnJhbWVidWZmZXIgKQordm9pZCBnbEJpbmRSZW5kZXJidWZmZXJPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IHJlbmRlcmJ1ZmZlciApCit2b2lkIGdsQmluZFRleHR1cmUgKCBHTGludCB0YXJnZXQsIEdMaW50IHRleHR1cmUgKQordm9pZCBnbEJsZW5kRXF1YXRpb24gKCBHTGludCBtb2RlICkKK3ZvaWQgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUgKCBHTGludCBtb2RlUkdCLCBHTGludCBtb2RlQWxwaGEgKQordm9pZCBnbEJsZW5kRnVuY1NlcGFyYXRlICggR0xpbnQgc3JjUkdCLCBHTGludCBkc3RSR0IsIEdMaW50IHNyY0FscGhhLCBHTGludCBkc3RBbHBoYSApCitHTGludCBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMgKCBHTGludCB0YXJnZXQgKQordm9pZCBnbENvbXByZXNzZWRUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApCit2b2lkIGdsQ29weVRleEltYWdlMkQgKCBHTGludCB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCwgR0xpbnQgYm9yZGVyICkKK3ZvaWQgZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMgKCBHTGludCBuLCBHTGludCAqZnJhbWVidWZmZXJzICkKK3ZvaWQgZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTICggR0xpbnQgbiwgR0xpbnQgKnJlbmRlcmJ1ZmZlcnMgKQordm9pZCBnbEVuYWJsZSAoIEdMaW50IGNhcCApCit2b2lkIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IGF0dGFjaG1lbnQsIEdMaW50IHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0xpbnQgcmVuZGVyYnVmZmVyICkKK3ZvaWQgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgYXR0YWNobWVudCwgR0xpbnQgdGV4dGFyZ2V0LCBHTGludCB0ZXh0dXJlLCBHTGludCBsZXZlbCApCit2b2lkIGdsR2VuZXJhdGVNaXBtYXBPRVMgKCBHTGludCB0YXJnZXQgKQordm9pZCBnbEdlbkZyYW1lYnVmZmVyc09FUyAoIEdMaW50IG4sIEdMaW50ICpmcmFtZWJ1ZmZlcnMgKQordm9pZCBnbEdlblJlbmRlcmJ1ZmZlcnNPRVMgKCBHTGludCBuLCBHTGludCAqcmVuZGVyYnVmZmVycyApCit2b2lkIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IGF0dGFjaG1lbnQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKK3ZvaWQgZ2xHZXRJbnRlZ2VydiAoIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKK3ZvaWQgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQordm9pZCBnbEdldFRleEdlbmZ2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQordm9pZCBnbEdldFRleEdlbml2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKK3ZvaWQgZ2xHZXRUZXhHZW54diAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCitHTGJvb2xlYW4gZ2xJc0ZyYW1lYnVmZmVyT0VTICggR0xpbnQgZnJhbWVidWZmZXIgKQorR0xib29sZWFuIGdsSXNSZW5kZXJidWZmZXJPRVMgKCBHTGludCByZW5kZXJidWZmZXIgKQordm9pZCBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0ICkKK3ZvaWQgZ2xTdGVuY2lsT3AgKCBHTGludCBmYWlsLCBHTGludCB6ZmFpbCwgR0xpbnQgenBhc3MgKQordm9pZCBnbFRleEVudmYgKCBHTGludCB0YXJnZXQsIEdMaW50IHBuYW1lLCBHTGZsb2F0IHBhcmFtICkKK3ZvaWQgZ2xUZXhFbnZmdiAoIEdMaW50IHRhcmdldCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApCit2b2lkIGdsVGV4RW52eCAoIEdMaW50IHRhcmdldCwgR0xpbnQgcG5hbWUsIEdMaW50IHBhcmFtICkKK3ZvaWQgZ2xUZXhFbnZ4diAoIEdMaW50IHRhcmdldCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQordm9pZCBnbFRleEdlbmYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQordm9pZCBnbFRleEdlbmZ2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQordm9pZCBnbFRleEdlbmkgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50IHBhcmFtICkKK3ZvaWQgZ2xUZXhHZW5pdiAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCit2b2lkIGdsVGV4R2VueCAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xpbnQgcGFyYW0gKQordm9pZCBnbFRleEdlbnh2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJmICggR0xpbnQgdGFyZ2V0LCBHTGludCBwbmFtZSwgR0xmbG9hdCBwYXJhbSApCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLWNoZWNrcyBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtY2hlY2tzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NGVkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLWNoZWNrcwpAQCAtMCwwICsxLDU5IEBACitnbENsaXBQbGFuZWYgY2hlY2sgZXF1YXRpb24gNA0KK2dsQ2xpcFBsYW5leCBjaGVjayBlcXVhdGlvbiA0DQorZ2xEZWxldGVCdWZmZXJzIGNoZWNrIGJ1ZmZlcnMgbiANCitnbERlbGV0ZVRleHR1cmVzIGNoZWNrIHRleHR1cmVzIG4NCitnbERyYXdFbGVtZW50cyBjaGVja19BSU9PQkUgaW5kaWNlcyBjb3VudA0KK2dsRm9nIGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfRk9HX01PREUsR0xfRk9HX0RFTlNJVFksR0xfRk9HX1NUQVJULEdMX0ZPR19FTkQgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9GT0dfQ09MT1INCitnbEdlbkJ1ZmZlcnMgY2hlY2sgYnVmZmVycyBuDQorZ2xHZW5UZXh0dXJlcyBjaGVjayB0ZXh0dXJlcyBuDQorZ2xHZXRDbGlwUGxhbmUgY2hlY2sgZXFuIDQNCitnbEdldEludGVnZXJ2IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfQUxQSEFfQklUUyxHTF9BTFBIQV9URVNUX0ZVTkMsR0xfQUxQSEFfVEVTVF9SRUYsR0xfQkxFTkRfRFNULEdMX0JMVUVfQklUUyxHTF9DT0xPUl9BUlJBWV9CVUZGRVJfQklORElORyxHTF9DT0xPUl9BUlJBWV9TSVpFLEdMX0NPTE9SX0FSUkFZX1NUUklERSxHTF9DT0xPUl9BUlJBWV9UWVBFLEdMX0NVTExfRkFDRSxHTF9ERVBUSF9CSVRTLEdMX0RFUFRIX0NMRUFSX1ZBTFVFLEdMX0RFUFRIX0ZVTkMsR0xfREVQVEhfV1JJVEVNQVNLLEdMX0ZPR19ERU5TSVRZLEdMX0ZPR19FTkQsR0xfRk9HX01PREUsR0xfRk9HX1NUQVJULEdMX0ZST05UX0ZBQ0UsR0xfR1JFRU5fQklUUyxHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVF9PRVMsR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyxHTF9MSUdIVF9NT0RFTF9UV09fU0lERSxHTF9MSU5FX1NNT09USF9ISU5ULEdMX0xJTkVfV0lEVEgsR0xfTE9HSUNfT1BfTU9ERSxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTLEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TSVpFX09FUyxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU1RSSURFX09FUyxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfVFlQRV9PRVMsR0xfTUFUUklYX01PREUsR0xfTUFYX0NMSVBfUExBTkVTLEdMX01BWF9FTEVNRU5UU19JTkRJQ0VTLEdMX01BWF9FTEVNRU5UU19WRVJUSUNFUyxHTF9NQVhfTElHSFRTLEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEgsR0xfTUFYX1BBTEVUVEVfTUFUUklDRVNfT0VTLEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRILEdMX01BWF9URVhUVVJFX1NJWkUsR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEgsR0xfTUFYX1RFWFRVUkVfVU5JVFMsR0xfTUFYX1ZFUlRFWF9VTklUU19PRVMsR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRILEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORyxHTF9OT1JNQUxfQVJSQVlfU1RSSURFLEdMX05PUk1BTF9BUlJBWV9UWVBFLEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyxHTF9QQUNLX0FMSUdOTUVOVCxHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQsR0xfUE9JTlRfU0laRSxHTF9QT0lOVF9TSVpFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyxHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVMsR0xfUE9JTlRfU0laRV9BUlJBWV9UWVBFX09FUyxHTF9QT0lOVF9TTU9PVEhfSElOVCxHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IsR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFMsR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSCxHTF9SRURfQklUUyxHTF9TSEFERV9NT0RFTCxHTF9TVEVOQ0lMX0JJVFMsR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSxHTF9TVEVOQ0lMX0ZBSUwsR0xfU1RFTkNJTF9GVU5DLEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMLEdMX1NURU5DSUxfUEFTU19ERVBUSF9QQVNTLEdMX1NURU5DSUxfUkVGLEdMX1NURU5DSUxfVkFMVUVfTUFTSyxHTF9TVEVOQ0lMX1dSSVRFTUFTSyxHTF9TVUJQSVhFTF9CSVRTLEdMX1RFWFRVUkVfQklORElOR18yRCxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HLEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRSxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NUUklERSxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUsR0xfVEVYVFVSRV9TVEFDS19ERVBUSCxHTF9VTlBBQ0tfQUxJR05NRU5ULEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORyxHTF9WRVJURVhfQVJSQVlfU0laRSxHTF9WRVJURVhfQVJSQVlfU1RSSURFLEdMX1ZFUlRFWF9BUlJBWV9UWVBFLEdMX1dFSUdIVF9BUlJBWV9CVUZGRVJfQklORElOR19PRVMsR0xfV0VJR0hUX0FSUkFZX1NJWkVfT0VTLEdMX1dFSUdIVF9BUlJBWV9TVFJJREVfT0VTLEdMX1dFSUdIVF9BUlJBWV9UWVBFX09FUyBpZmNoZWNrIHBhcmFtcyAyIHBuYW1lIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSxHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UsR0xfREVQVEhfUkFOR0UsR0xfTUFYX1ZJRVdQT1JUX0RJTVMsR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0UsR0xfU01PT1RIX1BPSU5UX1NJWkVfUkFOR0UgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9DT0xPUl9DTEVBUl9WQUxVRSxHTF9DT0xPUl9XUklURU1BU0ssR0xfU0NJU1NPUl9CT1gsR0xfVklFV1BPUlQgaWZjaGVjayBwYXJhbXMgMTYgcG5hbWUgR0xfTU9ERUxWSUVXX01BVFJJWCxHTF9NT0RFTFZJRVdfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyxHTF9QUk9KRUNUSU9OX01BVFJJWCxHTF9QUk9KRUNUSU9OX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMsR0xfVEVYVFVSRV9NQVRSSVgsR0xfVEVYVFVSRV9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTIGlmY2hlY2sgcGFyYW1zIF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgcG5hbWUgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMsR0xfRk9HX0NPTE9SLEdMX0xJR0hUX01PREVMX0FNQklFTlQNCitnbEdldExpZ2h0IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfU1BPVF9FWFBPTkVOVCxHTF9TUE9UX0NVVE9GRixHTF9DT05TVEFOVF9BVFRFTlVBVElPTixHTF9MSU5FQVJfQVRURU5VQVRJT04sR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OIGlmY2hlY2sgcGFyYW1zIDMgcG5hbWUgR0xfU1BPVF9ESVJFQ1RJT04gaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9BTUJJRU5ULEdMX0RJRkZVU0UsR0xfU1BFQ1VMQVIsR0xfRU1JU1NJT04NCitnbEdldE1hdGVyaWFsIGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfU0hJTklORVNTIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQU1CSUVOVCxHTF9ESUZGVVNFLEdMX1NQRUNVTEFSLEdMX0VNSVNTSU9OLEdMX0FNQklFTlRfQU5EX0RJRkZVU0UNCitnbEdldFRleEVudiBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1RFWFRVUkVfRU5WX01PREUsR0xfQ09NQklORV9SR0IsR0xfQ09NQklORV9BTFBIQSBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX1RFWFRVUkVfRU5WX0NPTE9SDQorZ2xHZXRUZXhQYXJhbWV0ZXIgY2hlY2sgcGFyYW1zIDENCitnbExpZ2h0TW9kZWwgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0xJR0hUX01PREVMX0FNQklFTlQNCitnbExpZ2h0IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfU1BPVF9FWFBPTkVOVCxHTF9TUE9UX0NVVE9GRixHTF9DT05TVEFOVF9BVFRFTlVBVElPTixHTF9MSU5FQVJfQVRURU5VQVRJT04sR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OIGlmY2hlY2sgcGFyYW1zIDMgcG5hbWUgR0xfU1BPVF9ESVJFQ1RJT04gaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9BTUJJRU5ULEdMX0RJRkZVU0UsR0xfU1BFQ1VMQVIsR0xfRU1JU1NJT04NCitnbExvYWRNYXRyaXggY2hlY2sgbSAxNg0KK2dsTWF0ZXJpYWwgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9TSElOSU5FU1MgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9BTUJJRU5ULEdMX0RJRkZVU0UsR0xfU1BFQ1VMQVIsR0xfRU1JU1NJT04sR0xfQU1CSUVOVF9BTkRfRElGRlVTRQ0KK2dsTXVsdE1hdHJpeCBjaGVjayBtIDE2DQorZ2xQb2ludFBhcmFtZXRlciBjaGVjayBwYXJhbXMgMQ0KK2dsVGV4RW52IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfVEVYVFVSRV9FTlZfTU9ERSxHTF9DT01CSU5FX1JHQixHTF9DT01CSU5FX0FMUEhBIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfVEVYVFVSRV9FTlZfQ09MT1INCitnbFRleEltYWdlMkQgbnVsbEFsbG93ZWQNCitnbFRleFN1YkltYWdlMkQgbnVsbEFsbG93ZWQNCitnbEJ1ZmZlckRhdGEgbnVsbEFsbG93ZWQNCitnbFRleFBhcmFtZXRlciBjaGVjayBwYXJhbXMgMQ0KK2dsUXVlcnlNYXRyaXh4T0VTIGNoZWNrIG1hbnRpc3NhIDE2IGNoZWNrIGV4cG9uZW50IDE2IHJldHVybiAtMQ0KK2dsRHJhd1RleGZ2T0VTIGNoZWNrIGNvb3JkcyA1DQorZ2xEcmF3VGV4aXZPRVMgY2hlY2sgY29vcmRzIDUNCitnbERyYXdUZXhzdk9FUyBjaGVjayBjb29yZHMgNQ0KK2dsRHJhd1RleHh2T0VTIGNoZWNrIGNvb3JkcyA1DQorZ2xCaW5kRnJhbWVidWZmZXJPRVMgdW5zdXBwb3J0ZWQNCitnbEJpbmRSZW5kZXJidWZmZXJPRVMgdW5zdXBwb3J0ZWQNCitnbEJsZW5kRXF1YXRpb24gdW5zdXBwb3J0ZWQNCitnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSB1bnN1cHBvcnRlZA0KK2dsQmxlbmRGdW5jU2VwYXJhdGUgdW5zdXBwb3J0ZWQNCitnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMgdW5zdXBwb3J0ZWQgcmV0dXJuIDANCitnbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTIHVuc3VwcG9ydGVkDQorZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMgdW5zdXBwb3J0ZWQNCitnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMgdW5zdXBwb3J0ZWQNCitnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTIHVuc3VwcG9ydGVkDQorZ2xGcmFtZWJ1ZmZlclN0b3JhZ2VPRVMgdW5zdXBwb3J0ZWQNCitnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTIHVuc3VwcG9ydGVkDQorZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMgdW5zdXBwb3J0ZWQNCitnbEdlblJlbmRlcmJ1ZmZlcnNPRVMgdW5zdXBwb3J0ZWQNCitnbEdlbmVyYXRlTWlwbWFwT0VTIHVuc3VwcG9ydGVkDQorZ2xHZXRCdWZmZXJQYXJhbWV0ZXIgdW5zdXBwb3J0ZWQNCitnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTIHVuc3VwcG9ydGVkDQorZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyB1bnN1cHBvcnRlZA0KK2dsR2V0VGV4R2VuIHVuc3VwcG9ydGVkDQorZ2xJc0ZyYW1lYnVmZmVyT0VTIHVuc3VwcG9ydGVkIHJldHVybiBKTklfRkFMU0UNCitnbElzUmVuZGVyYnVmZmVyT0VTIHVuc3VwcG9ydGVkIHJldHVybiBKTklfRkFMU0UNCitnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUyB1bnN1cHBvcnRlZA0KK2dsTWF0cml4SW5kZXhQb2ludGVyT0VTIHVuc3VwcG9ydGVkDQorZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTIHVuc3VwcG9ydGVkIHJldHVybiBmYWxzZQ0KK2dsVGV4R2VuIHVuc3VwcG9ydGVkDQorZ2xUZXhHZW5mIHVuc3VwcG9ydGVkDQorZ2xUZXhHZW5pIHVuc3VwcG9ydGVkDQorZ2xUZXhHZW54IHVuc3VwcG9ydGVkDQorZ2xXZWlnaHRQb2ludGVyT0VTIHVuc3VwcG9ydGVkDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9DRnVuYy5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9DRnVuYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTRmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NGdW5jLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKw0KK2ltcG9ydCBqYXZhLnV0aWwuKjsNCisNCitwdWJsaWMgY2xhc3MgQ0Z1bmMgew0KKw0KKyAgICBTdHJpbmcgb3JpZ2luYWw7DQorDQorICAgIENUeXBlIGZ0eXBlOw0KKyAgICBTdHJpbmcgZm5hbWU7DQorDQorICAgIExpc3Q8U3RyaW5nPiBhcmdOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KKyAgICBMaXN0PENUeXBlPiBhcmdUeXBlcyA9IG5ldyBBcnJheUxpc3Q8Q1R5cGU+KCk7DQorDQorICAgIGJvb2xlYW4gaGFzUG9pbnRlckFyZyA9IGZhbHNlOw0KKyAgICBib29sZWFuIGhhc1R5cGVkUG9pbnRlckFyZyA9IGZhbHNlOw0KKw0KKyAgICBwdWJsaWMgQ0Z1bmMoU3RyaW5nIG9yaWdpbmFsKSB7DQorICAgICAgICB0aGlzLm9yaWdpbmFsID0gb3JpZ2luYWw7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRPcmlnaW5hbCgpIHsNCisgICAgICAgIHJldHVybiBvcmlnaW5hbDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBmbmFtZSkgew0KKyAgICAgICAgdGhpcy5mbmFtZSA9IGZuYW1lOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCisgICAgICAgIHJldHVybiBmbmFtZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKENUeXBlIGZ0eXBlKSB7DQorICAgICAgICB0aGlzLmZ0eXBlID0gZnR5cGU7DQorICAgIH0NCisNCisgICAgcHVibGljIENUeXBlIGdldFR5cGUoKSB7DQorICAgICAgICByZXR1cm4gZnR5cGU7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgYWRkQXJndW1lbnQoU3RyaW5nIGFyZ05hbWUsIENUeXBlIGFyZ1R5cGUpIHsNCisgICAgICAgIGFyZ05hbWVzLmFkZChhcmdOYW1lKTsNCisgICAgICAgIGFyZ1R5cGVzLmFkZChhcmdUeXBlKTsNCisNCisgICAgICAgIGlmIChhcmdUeXBlLmlzUG9pbnRlcigpKSB7DQorICAgICAgICAgICAgaGFzUG9pbnRlckFyZyA9IHRydWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXJnVHlwZS5pc1R5cGVkUG9pbnRlcigpKSB7DQorICAgICAgICAgICAgaGFzVHlwZWRQb2ludGVyQXJnID0gdHJ1ZTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldE51bUFyZ3MoKSB7DQorICAgICAgICByZXR1cm4gYXJnTmFtZXMuc2l6ZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0QXJnSW5kZXgoU3RyaW5nIG5hbWUpIHsNCisgICAgICAgIGludCBsZW4gPSBhcmdOYW1lcy5zaXplKCk7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7DQorICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGFyZ05hbWVzLmdldChpKSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJnTmFtZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBhcmdOYW1lcy5nZXQoaW5kZXgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDVHlwZSBnZXRBcmdUeXBlKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIGFyZ1R5cGVzLmdldChpbmRleCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaGFzUG9pbnRlckFyZygpIHsNCisgICAgICAgIHJldHVybiBoYXNQb2ludGVyQXJnOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGhhc1R5cGVkUG9pbnRlckFyZygpIHsNCisgICAgICAgIHJldHVybiBoYXNUeXBlZFBvaW50ZXJBcmc7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisgICAgICAgIFN0cmluZyBzID0gICJGdW5jdGlvbiAiICsgZm5hbWUgKyAiIHJldHVybnMgIiArIGZ0eXBlICsgIjogIjsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnTmFtZXMuc2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICBpZiAoaSA+IDApIHsNCisgICAgICAgICAgICAgICAgcyArPSAiLCAiOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzICs9IGFyZ1R5cGVzLmdldChpKSArICIgIiArIGFyZ05hbWVzLmdldChpKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBzOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgQ0Z1bmMgcGFyc2VDRnVuYyhTdHJpbmcgcykgew0KKyAgICAgICAgQ0Z1bmMgY2Z1bmMgPSBuZXcgQ0Z1bmMocyk7DQorICAgICAgICBTdHJpbmdbXSB0b2tlbnMgPSBzLnNwbGl0KCJcXHMiKTsNCisNCisgICAgICAgIGludCBpID0gMDsNCisgICAgICAgIENUeXBlIGZ0eXBlID0gbmV3IENUeXBlKCk7DQorICAgICAgICBTdHJpbmcgZnR5cGVOYW1lID0gdG9rZW5zW2krK107DQorICAgICAgICBpZiAoZnR5cGVOYW1lLmVxdWFscygiY29uc3QiKSkgew0KKyAgICAgICAgICAgIGZ0eXBlLnNldElzQ29uc3QodHJ1ZSk7DQorICAgICAgICAgICAgZnR5cGVOYW1lID0gdG9rZW5zW2krK107DQorICAgICAgICB9DQorICAgICAgICBmdHlwZS5zZXRCYXNlVHlwZShmdHlwZU5hbWUpOw0KKw0KKyAgICAgICAgU3RyaW5nIGZuYW1lID0gdG9rZW5zW2krK107DQorICAgICAgICBpZiAoZm5hbWUuZXF1YWxzKCIqIikpIHsNCisgICAgICAgICAgICBmdHlwZS5zZXRJc1BvaW50ZXIodHJ1ZSk7DQorICAgICAgICAgICAgZm5hbWUgPSB0b2tlbnNbaSsrXTsNCisgICAgICAgIH0NCisJDQorICAgICAgICBjZnVuYy5zZXROYW1lKGZuYW1lKTsNCisgICAgICAgIGNmdW5jLnNldFR5cGUoZnR5cGUpOw0KKwkNCisgICAgICAgIHdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgew0KKyAgICAgICAgICAgIFN0cmluZyB0b2sgPSB0b2tlbnNbaSsrXTsNCisJICAgIA0KKyAgICAgICAgICAgIGlmICh0b2suZXF1YWxzKCIoIikpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICh0b2suZXF1YWxzKCIpIikpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIENUeXBlIGFyZ1R5cGUgPSBuZXcgQ1R5cGUoKTsNCisJICAgIA0KKyAgICAgICAgICAgIFN0cmluZyBhcmdUeXBlTmFtZSA9IHRvazsNCisgICAgICAgICAgICBTdHJpbmcgYXJnTmFtZSA9ICIiOw0KKwkgICAgDQorICAgICAgICAgICAgaWYgKGFyZ1R5cGVOYW1lLmVxdWFscygiY29uc3QiKSkgew0KKyAgICAgICAgICAgICAgICBhcmdUeXBlLnNldElzQ29uc3QodHJ1ZSk7DQorICAgICAgICAgICAgICAgIGFyZ1R5cGVOYW1lID0gdG9rZW5zW2krK107DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGFyZ1R5cGUuc2V0QmFzZVR5cGUoYXJnVHlwZU5hbWUpOw0KKw0KKyAgICAgICAgICAgIGlmIChhcmdUeXBlTmFtZS5lcXVhbHMoInZvaWQiKSkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorCSAgICANCisgICAgICAgICAgICBhcmdOYW1lID0gdG9rZW5zW2krK107DQorICAgICAgICAgICAgaWYgKGFyZ05hbWUuc3RhcnRzV2l0aCgiKiIpKSB7DQorICAgICAgICAgICAgICAgIGFyZ1R5cGUuc2V0SXNQb2ludGVyKHRydWUpOw0KKyAgICAgICAgICAgICAgICBhcmdOYW1lID0gYXJnTmFtZS5zdWJzdHJpbmcoMSwgYXJnTmFtZS5sZW5ndGgoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChhcmdOYW1lLmVuZHNXaXRoKCIsIikpIHsNCisgICAgICAgICAgICAgICAgYXJnTmFtZSA9IGFyZ05hbWUuc3Vic3RyaW5nKDAsIGFyZ05hbWUubGVuZ3RoKCkgLSAxKTsNCisgICAgICAgICAgICB9DQorCSAgICANCisgICAgICAgICAgICBjZnVuYy5hZGRBcmd1bWVudChhcmdOYW1lLCBhcmdUeXBlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBjZnVuYzsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NUeXBlLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxZWM2MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ1R5cGUuamF2YQpAQCAtMCwwICsxLDg1IEBACisNCitwdWJsaWMgY2xhc3MgQ1R5cGUgew0KKw0KKyAgICBTdHJpbmcgYmFzZVR5cGU7DQorICAgIGJvb2xlYW4gaXNDb25zdDsNCisgICAgYm9vbGVhbiBpc1BvaW50ZXI7DQorDQorICAgIHB1YmxpYyBDVHlwZSgpIHsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ1R5cGUoU3RyaW5nIGJhc2VUeXBlKSB7DQorCXNldEJhc2VUeXBlKGJhc2VUeXBlKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ1R5cGUoU3RyaW5nIGJhc2VUeXBlLCBib29sZWFuIGlzQ29uc3QsIGJvb2xlYW4gaXNQb2ludGVyKSB7DQorCXNldEJhc2VUeXBlKGJhc2VUeXBlKTsNCisJc2V0SXNDb25zdChpc0NvbnN0KTsNCisJc2V0SXNQb2ludGVyKGlzUG9pbnRlcik7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXREZWNsYXJhdGlvbigpIHsNCisJcmV0dXJuIGJhc2VUeXBlICsgKGlzUG9pbnRlciA/ICIgKiIgOiAiIik7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHNldElzQ29uc3QoYm9vbGVhbiBpc0NvbnN0KSB7DQorCXRoaXMuaXNDb25zdCA9IGlzQ29uc3Q7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25zdCgpIHsNCisJcmV0dXJuIGlzQ29uc3Q7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0SXNQb2ludGVyKGJvb2xlYW4gaXNQb2ludGVyKSB7DQorCXRoaXMuaXNQb2ludGVyID0gaXNQb2ludGVyOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzUG9pbnRlcigpIHsNCisJcmV0dXJuIGlzUG9pbnRlcjsNCisgICAgfQ0KKw0KKyAgICBib29sZWFuIGlzVm9pZCgpIHsNCisJU3RyaW5nIGJhc2VUeXBlID0gZ2V0QmFzZVR5cGUoKTsNCisJcmV0dXJuIGJhc2VUeXBlLmVxdWFscygiR0x2b2lkIikgfHwNCisJICAgIGJhc2VUeXBlLmVxdWFscygidm9pZCIpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZWRQb2ludGVyKCkgew0KKwlyZXR1cm4gaXNQb2ludGVyKCkgJiYgIWlzVm9pZCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldEJhc2VUeXBlKFN0cmluZyBiYXNlVHlwZSkgew0KKwl0aGlzLmJhc2VUeXBlID0gYmFzZVR5cGU7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRCYXNlVHlwZSgpIHsNCisJcmV0dXJuIGJhc2VUeXBlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCVN0cmluZyBzID0gIiI7DQorCWlmIChpc0NvbnN0KCkpIHsNCisJICAgIHMgKz0gImNvbnN0ICI7DQorCX0NCisJcyArPSBiYXNlVHlwZTsNCisJaWYgKGlzUG9pbnRlcigpKSB7DQorCSAgICBzICs9ICIqIjsNCisJfQ0KKw0KKwlyZXR1cm4gczsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KKwlyZXR1cm4gYmFzZVR5cGUuaGFzaENvZGUoKSBeIChpc1BvaW50ZXIgPyAyIDogMCkgXiAoaXNDb25zdCA/IDEgOiAwKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsNCisJaWYgKG8gIT0gbnVsbCAmJiBvIGluc3RhbmNlb2YgQ1R5cGUpIHsNCisJICAgIENUeXBlIGMgPSAoQ1R5cGUpbzsNCisJICAgIHJldHVybiBiYXNlVHlwZS5lcXVhbHMoYy5iYXNlVHlwZSkgJiYNCisJCWlzUG9pbnRlcigpID09IGMuaXNQb2ludGVyKCkgJiYNCisJCWlzQ29uc3QoKSA9PSBjLmlzQ29uc3QoKTsNCisJfQ0KKwlyZXR1cm4gZmFsc2U7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9Db2RlRW1pdHRlci5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9Db2RlRW1pdHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOWI5MGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NvZGVFbWl0dGVyLmphdmEKQEAgLTAsMCArMSw4IEBACisNCitwdWJsaWMgaW50ZXJmYWNlIENvZGVFbWl0dGVyIHsNCisNCisgICAgdm9pZCBzZXRWZXJzaW9uKGludCB2ZXJzaW9uLCBib29sZWFuIGV4dCwgYm9vbGVhbiBwYWNrKTsNCisgICAgdm9pZCBlbWl0Q29kZShDRnVuYyBjZnVuYywgU3RyaW5nIG9yaWdpbmFsKTsNCisgICAgdm9pZCBhZGROYXRpdmVSZWdpc3RyYXRpb24oU3RyaW5nIGZuYW1lKTsNCisgICAgdm9pZCBlbWl0TmF0aXZlUmVnaXN0cmF0aW9uKCk7DQorfQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvR2VuZXJhdGVHTC5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9HZW5lcmF0ZUdMLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3ZWU2ZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvR2VuZXJhdGVHTC5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisNCitpbXBvcnQgamF2YS5pby4qOw0KK2ltcG9ydCBqYXZhLnV0aWwuKjsNCisNCitwdWJsaWMgY2xhc3MgR2VuZXJhdGVHTCB7DQorDQorICAgIHN0YXRpYyB2b2lkIGNvcHkoU3RyaW5nIGZpbGVuYW1lLCBQcmludFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlbmFtZSkpOw0KKyAgICAgICAgU3RyaW5nIHM7DQorICAgICAgICB3aGlsZSAoKHMgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7DQorICAgICAgICAgICAgb3V0LnByaW50bG4ocyk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbWl0KGludCB2ZXJzaW9uLCBib29sZWFuIGV4dCwgYm9vbGVhbiBwYWNrLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUVtaXR0ZXIgZW1pdHRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHNwZWNSZWFkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBnbFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGdsSW1wbFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGNTdHJlYW0pIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgU3RyaW5nIHMgPSBudWxsOw0KKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOw0KKyAgICAgICAgd2hpbGUgKChzID0gc3BlY1JlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaWYgKHMudHJpbSgpLnN0YXJ0c1dpdGgoIi8vIikpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIENGdW5jIGNmdW5jID0gQ0Z1bmMucGFyc2VDRnVuYyhzKTsNCisNCisgICAgICAgICAgICBTdHJpbmcgZm5hbWUgPSBjZnVuYy5nZXROYW1lKCk7DQorICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoInN0dWJzLyIgKyBmbmFtZSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5qYXZhLTEiICsgdmVyc2lvbiArICItaWYiKTsNCisgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgew0KKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNwZWNpYWwtY2FzaW5nIGZ1bmN0aW9uICIgKyBmbmFtZSk7DQorICAgICAgICAgICAgICAgIGNvcHkoInN0dWJzLyIgKyBmbmFtZSArDQorICAgICAgICAgICAgICAgICAgICAgIi5qYXZhLTEiICsgdmVyc2lvbiArICItaWYiLCBnbFN0cmVhbSk7DQorICAgICAgICAgICAgICAgIGNvcHkoInN0dWJzLyIgKyBmbmFtZSArICIuamF2YS1pbXBsIiwgZ2xJbXBsU3RyZWFtKTsNCisgICAgICAgICAgICAgICAgY29weSgic3R1YnMvIiArIGZuYW1lICsgIi5jcHAiLCBjU3RyZWFtKTsNCisNCisgICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgbmF0aXZlIGZ1bmN0aW9uIG5hbWVzDQorICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGltcHJvdmVkIHRvIHJlcXVpcmUgZmV3ZXIgZGlzY3JldGUgZmlsZXMNCisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gInN0dWJzLyIgKyBmbmFtZSArICIubmF0aXZlUmVnIjsNCisgICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPQ0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGVuYW1lKSk7DQorICAgICAgICAgICAgICAgIFN0cmluZyBuZnVuYzsNCisgICAgICAgICAgICAgICAgd2hpbGUgKChuZnVuYyA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIGVtaXR0ZXIuYWRkTmF0aXZlUmVnaXN0cmF0aW9uKG5mdW5jKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGVtaXR0ZXIuc2V0VmVyc2lvbih2ZXJzaW9uLCBleHQsIHBhY2spOw0KKyAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXRDb2RlKGNmdW5jLCBzKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmcgY2xhc3NQYXRoTmFtZSA9ICJjb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvR0xJbXBsIjsNCisgICAgICAgIGJvb2xlYW4gdXNlQ29udGV4dFBvaW50ZXIgPSB0cnVlOw0KKw0KKyAgICAgICAgaW50IGFpZHggPSAwOw0KKyAgICAgICAgd2hpbGUgKGFyZ3NbYWlkeF0uY2hhckF0KDApID09ICctJykgew0KKyAgICAgICAgICAgIHN3aXRjaCAoYXJnc1thaWR4XS5jaGFyQXQoMSkpIHsNCisgICAgICAgICAgICBjYXNlICdjJzoNCisgICAgICAgICAgICAgICAgdXNlQ29udGV4dFBvaW50ZXIgPSBmYWxzZTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbmtub3duIGZsYWc6ICIgKyBhcmdzW2FpZHhdKTsNCisgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGFpZHgrKzsNCisgICAgICAgIH0NCisNCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidXNlQ29udGV4dFBvaW50ZXIgPSAiICsgdXNlQ29udGV4dFBvaW50ZXIpOw0KKw0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgc3BlYzEwUmVhZGVyID0NCisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYXJnc1thaWR4KytdKSk7DQorICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjMTBFeHRSZWFkZXIgPQ0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihhcmdzW2FpZHgrK10pKTsNCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHNwZWMxMVJlYWRlciA9DQorICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFyZ3NbYWlkeCsrXSkpOw0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgc3BlYzExRXh0UmVhZGVyID0NCisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYXJnc1thaWR4KytdKSk7DQorICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjMTFFeHRQYWNrUmVhZGVyID0NCisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYXJnc1thaWR4KytdKSk7DQorICAgICAgICBCdWZmZXJlZFJlYWRlciBjaGVja3NSZWFkZXIgPQ0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihhcmdzW2FpZHgrK10pKTsNCisNCisgICAgICAgIFN0cmluZyBnbDEwRmlsZW5hbWUgPSAiamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhIjsNCisgICAgICAgIFN0cmluZyBnbDEwRXh0RmlsZW5hbWUgPQ0KKyAgICAgICAgICAgICJqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEiOw0KKyAgICAgICAgU3RyaW5nIGdsMTFGaWxlbmFtZSA9ICJqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExLmphdmEiOw0KKyAgICAgICAgU3RyaW5nIGdsMTFFeHRGaWxlbmFtZSA9DQorICAgICAgICAgICAgImphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHQuamF2YSI7DQorICAgICAgICBTdHJpbmcgZ2wxMUV4dFBhY2tGaWxlbmFtZSA9DQorICAgICAgICAgICAgImphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEiOw0KKyAgICAgICAgU3RyaW5nIGdsSW1wbEZpbGVuYW1lID0gImNvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwuamF2YSI7DQorICAgICAgICBTdHJpbmcgY0ZpbGVuYW1lID0gImNvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIjsNCisNCisgICAgICAgIFByaW50U3RyZWFtIGdsMTBTdHJlYW0gPQ0KKyAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbDEwRmlsZW5hbWUpKTsNCisgICAgICAgIFByaW50U3RyZWFtIGdsMTBFeHRTdHJlYW0gPQ0KKyAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbDEwRXh0RmlsZW5hbWUpKTsNCisgICAgICAgIFByaW50U3RyZWFtIGdsMTFTdHJlYW0gPQ0KKyAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbDExRmlsZW5hbWUpKTsNCisgICAgICAgIFByaW50U3RyZWFtIGdsMTFFeHRTdHJlYW0gPQ0KKyAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbDExRXh0RmlsZW5hbWUpKTsNCisgICAgICAgIFByaW50U3RyZWFtIGdsMTFFeHRQYWNrU3RyZWFtID0NCisgICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2wxMUV4dFBhY2tGaWxlbmFtZSkpOw0KKyAgICAgICAgUHJpbnRTdHJlYW0gZ2xJbXBsU3RyZWFtID0NCisgICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2xJbXBsRmlsZW5hbWUpKTsNCisgICAgICAgIFByaW50U3RyZWFtIGNTdHJlYW0gPQ0KKyAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBjRmlsZW5hbWUpKTsNCisNCisgICAgICAgIFBhcmFtZXRlckNoZWNrZXIgY2hlY2tlciA9IG5ldyBQYXJhbWV0ZXJDaGVja2VyKGNoZWNrc1JlYWRlcik7DQorDQorICAgICAgICBDb2RlRW1pdHRlciBlbWl0dGVyID0NCisgICAgICAgICAgICBuZXcgSm5pQ29kZUVtaXR0ZXIoY2xhc3NQYXRoTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2wxMFN0cmVhbSwgZ2wxMEV4dFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2wxMVN0cmVhbSwgZ2wxMUV4dFN0cmVhbSwgZ2wxMUV4dFBhY2tTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsSW1wbFN0cmVhbSwgY1N0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlQ29udGV4dFBvaW50ZXIpOw0KKw0KKyAgICAgICAgZ2wxMFN0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvIiArIGdsMTBGaWxlbmFtZSk7DQorICAgICAgICBnbDEwRXh0U3RyZWFtLnByaW50bG4oIi8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC8iICsgZ2wxMEV4dEZpbGVuYW1lKTsNCisgICAgICAgIGdsMTFTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkLyIgKyBnbDExRmlsZW5hbWUpOw0KKyAgICAgICAgZ2wxMUV4dFN0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvIiArIGdsMTFFeHRGaWxlbmFtZSk7DQorICAgICAgICBnbDExRXh0UGFja1N0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvIiArDQorICAgICAgICAgICAgZ2wxMUV4dFBhY2tGaWxlbmFtZSk7DQorICAgICAgICBnbEltcGxTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkLyIgKyBnbEltcGxGaWxlbmFtZSk7DQorICAgICAgICBjU3RyZWFtLnByaW50bG4oIi8qIC8vZGV2aWNlL2xpYnMvYW5kcm9pZF9ydW50aW1lLyIgKyBjRmlsZW5hbWUpOw0KKw0KKyAgICAgICAgY29weSgic3R1YnMvR0wxMEhlYWRlci5qYXZhLWlmIiwgZ2wxMFN0cmVhbSk7DQorICAgICAgICBjb3B5KCJzdHVicy9HTDEwRXh0SGVhZGVyLmphdmEtaWYiLCBnbDEwRXh0U3RyZWFtKTsNCisgICAgICAgIGNvcHkoInN0dWJzL0dMMTFIZWFkZXIuamF2YS1pZiIsIGdsMTFTdHJlYW0pOw0KKyAgICAgICAgY29weSgic3R1YnMvR0wxMUV4dEhlYWRlci5qYXZhLWlmIiwgZ2wxMUV4dFN0cmVhbSk7DQorICAgICAgICBjb3B5KCJzdHVicy9HTDExRXh0ZW5zaW9uUGFja0hlYWRlci5qYXZhLWlmIiwgZ2wxMUV4dFBhY2tTdHJlYW0pOw0KKyAgICAgICAgY29weSgic3R1YnMvR0xJbXBsSGVhZGVyLmphdmEtaW1wbCIsIGdsSW1wbFN0cmVhbSk7DQorICAgICAgICBjb3B5KCJzdHVicy9HTENIZWFkZXIuY3BwIiwgY1N0cmVhbSk7DQorDQorICAgICAgICBlbWl0KDAsIGZhbHNlLCBmYWxzZSwNCisgICAgICAgICAgICAgZW1pdHRlciwgc3BlYzEwUmVhZGVyLCBnbDEwU3RyZWFtLCBnbEltcGxTdHJlYW0sIGNTdHJlYW0pOw0KKyAgICAgICAgZW1pdCgwLCB0cnVlLCBmYWxzZSwNCisgICAgICAgICAgICAgZW1pdHRlciwgc3BlYzEwRXh0UmVhZGVyLCBnbDEwRXh0U3RyZWFtLCBnbEltcGxTdHJlYW0sIGNTdHJlYW0pOw0KKyAgICAgICAgZW1pdCgxLCBmYWxzZSwgZmFsc2UsDQorICAgICAgICAgICAgIGVtaXR0ZXIsIHNwZWMxMVJlYWRlciwgZ2wxMVN0cmVhbSwgZ2xJbXBsU3RyZWFtLCBjU3RyZWFtKTsNCisgICAgICAgIGVtaXQoMSwgdHJ1ZSwgZmFsc2UsDQorICAgICAgICAgICAgIGVtaXR0ZXIsIHNwZWMxMUV4dFJlYWRlciwgZ2wxMUV4dFN0cmVhbSwgZ2xJbXBsU3RyZWFtLCBjU3RyZWFtKTsNCisgICAgICAgIGVtaXQoMSwgdHJ1ZSwgdHJ1ZSwNCisgICAgICAgICAgICAgZW1pdHRlciwgc3BlYzExRXh0UGFja1JlYWRlciwgZ2wxMUV4dFBhY2tTdHJlYW0sIGdsSW1wbFN0cmVhbSwNCisgICAgICAgICAgICAgY1N0cmVhbSk7DQorDQorICAgICAgICBlbWl0dGVyLmVtaXROYXRpdmVSZWdpc3RyYXRpb24oKTsNCisNCisgICAgICAgIGdsMTBTdHJlYW0ucHJpbnRsbigifSIpOw0KKyAgICAgICAgZ2wxMEV4dFN0cmVhbS5wcmludGxuKCJ9Iik7DQorICAgICAgICBnbDExU3RyZWFtLnByaW50bG4oIn0iKTsNCisgICAgICAgIGdsMTFFeHRTdHJlYW0ucHJpbnRsbigifSIpOw0KKyAgICAgICAgZ2wxMUV4dFBhY2tTdHJlYW0ucHJpbnRsbigifSIpOw0KKyAgICAgICAgZ2xJbXBsU3RyZWFtLnByaW50bG4oIn0iKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pGdW5jLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pGdW5jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkNDY2YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvSkZ1bmMuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK3B1YmxpYyBjbGFzcyBKRnVuYyB7DQorDQorICAgIFN0cmluZyBjbGFzc05hbWUgPSAiY29tLmdvb2dsZS5hbmRyb2lkLmdsZXNfam5pLkdMMTFJbXBsIjsNCisNCisgICAgQ0Z1bmMgY2Z1bmM7DQorICAgIEpUeXBlIGZ0eXBlOw0KKyAgICBTdHJpbmcgZm5hbWU7DQorDQorICAgIExpc3Q8U3RyaW5nPiBhcmdOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KKyAgICBMaXN0PEpUeXBlPiBhcmdUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SlR5cGU+KCk7DQorICAgIExpc3Q8SW50ZWdlcj4gYXJnQ0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7DQorDQorICAgIGJvb2xlYW4gaGFzQnVmZmVyQXJnID0gZmFsc2U7DQorICAgIGJvb2xlYW4gaGFzVHlwZWRCdWZmZXJBcmcgPSBmYWxzZTsNCisgICAgQXJyYXlMaXN0PFN0cmluZz4gYnVmZmVyQXJnTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCisNCisgICAgcHVibGljIEpGdW5jKENGdW5jIGNmdW5jKSB7DQorICAgICAgICB0aGlzLmNmdW5jID0gY2Z1bmM7DQorICAgIH0NCisNCisgICAgcHVibGljIENGdW5jIGdldENGdW5jKCkgew0KKyAgICAgICAgcmV0dXJuIGNmdW5jOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIGZuYW1lKSB7DQorICAgICAgICB0aGlzLmZuYW1lID0gZm5hbWU7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KKyAgICAgICAgcmV0dXJuIGZuYW1lOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoSlR5cGUgZnR5cGUpIHsNCisgICAgICAgIHRoaXMuZnR5cGUgPSBmdHlwZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgSlR5cGUgZ2V0VHlwZSgpIHsNCisgICAgICAgIHJldHVybiBmdHlwZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgew0KKyAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7DQorICAgICAgICByZXR1cm4gY2xhc3NOYW1lOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNCdWZmZXJBcmcoKSB7DQorICAgICAgICByZXR1cm4gaGFzQnVmZmVyQXJnOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGhhc1R5cGVkQnVmZmVyQXJnKCkgew0KKyAgICAgICAgcmV0dXJuIGhhc1R5cGVkQnVmZmVyQXJnOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnVmZmVyQXJnTmFtZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBidWZmZXJBcmdOYW1lcy5nZXQoaW5kZXgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGFkZEFyZ3VtZW50KFN0cmluZyBhcmdOYW1lLCBKVHlwZSBhcmdUeXBlLCBpbnQgY2luZGV4KSB7DQorICAgICAgICBhcmdOYW1lcy5hZGQoYXJnTmFtZSk7DQorICAgICAgICBhcmdUeXBlcy5hZGQoYXJnVHlwZSk7DQorICAgICAgICBhcmdDSW5kaWNlcy5hZGQobmV3IEludGVnZXIoY2luZGV4KSk7DQorDQorICAgICAgICBpZiAoYXJnVHlwZS5pc0J1ZmZlcigpKSB7DQorICAgICAgICAgICAgaGFzQnVmZmVyQXJnID0gdHJ1ZTsNCisgICAgICAgICAgICBidWZmZXJBcmdOYW1lcy5hZGQoYXJnTmFtZSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXJnVHlwZS5pc1R5cGVkQnVmZmVyKCkpIHsNCisgICAgICAgICAgICBoYXNUeXBlZEJ1ZmZlckFyZyA9IHRydWU7DQorICAgICAgICAgICAgYnVmZmVyQXJnTmFtZXMuYWRkKGFyZ05hbWUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0TnVtQXJncygpIHsNCisgICAgICAgIHJldHVybiBhcmdOYW1lcy5zaXplKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXRBcmdJbmRleChTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgaW50IGxlbiA9IGFyZ05hbWVzLnNpemUoKTsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoYXJnTmFtZXMuZ2V0KGkpKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gaTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRBcmdOYW1lKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIGFyZ05hbWVzLmdldChpbmRleCk7DQorICAgIH0NCisNCisgICAgcHVibGljIEpUeXBlIGdldEFyZ1R5cGUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gYXJnVHlwZXMuZ2V0KGluZGV4KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldEFyZ0NJbmRleChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBhcmdDSW5kaWNlcy5nZXQoaW5kZXgpLmludFZhbHVlKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHN0YXRpYyBKRnVuYyBjb252ZXJ0KENGdW5jIGNmdW5jLCBib29sZWFuIHVzZUFycmF5KSB7DQorICAgICAgICBKRnVuYyBqZnVuYyA9IG5ldyBKRnVuYyhjZnVuYyk7DQorICAgICAgICBqZnVuYy5zZXROYW1lKGNmdW5jLmdldE5hbWUoKSk7DQorICAgICAgICBqZnVuYy5zZXRUeXBlKEpUeXBlLmNvbnZlcnQoY2Z1bmMuZ2V0VHlwZSgpLCBmYWxzZSkpOw0KKwkNCisgICAgICAgIGludCBudW1BcmdzID0gY2Z1bmMuZ2V0TnVtQXJncygpOw0KKyAgICAgICAgaW50IG51bU9mZnNldHMgPSAwOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsNCisgICAgICAgICAgICBDVHlwZSBjQXJnVHlwZSA9IGNmdW5jLmdldEFyZ1R5cGUoaSk7DQorICAgICAgICAgICAgaWYgKGNBcmdUeXBlLmlzVHlwZWRQb2ludGVyKCkgJiYgdXNlQXJyYXkpIHsNCisgICAgICAgICAgICAgICAgKytudW1PZmZzZXRzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7DQorICAgICAgICAgICAgU3RyaW5nIGNBcmdOYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShpKTsNCisgICAgICAgICAgICBDVHlwZSBjQXJnVHlwZSA9IGNmdW5jLmdldEFyZ1R5cGUoaSk7DQorDQorICAgICAgICAgICAgamZ1bmMuYWRkQXJndW1lbnQoY0FyZ05hbWUsIEpUeXBlLmNvbnZlcnQoY0FyZ1R5cGUsIHVzZUFycmF5KSwgaSk7DQorICAgICAgICAgICAgaWYgKGNBcmdUeXBlLmlzVHlwZWRQb2ludGVyKCkgJiYgdXNlQXJyYXkpIHsNCisgICAgICAgICAgICAgICAgaWYgKG51bU9mZnNldHMgPiAxKSB7DQorICAgICAgICAgICAgICAgICAgICBqZnVuYy5hZGRBcmd1bWVudChjQXJnTmFtZSArICJPZmZzZXQiLCBuZXcgSlR5cGUoImludCIpLCBpKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGpmdW5jLmFkZEFyZ3VtZW50KCJvZmZzZXQiLCBuZXcgSlR5cGUoImludCIpLCBpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBqZnVuYzsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgICAgU3RyaW5nIHMgPSAgIkZ1bmN0aW9uICIgKyBmbmFtZSArICIgcmV0dXJucyAiICsgZnR5cGUgKyAiOiAiOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdOYW1lcy5zaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgIGlmIChpID4gMCkgew0KKyAgICAgICAgICAgICAgICBzICs9ICIsICI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHMgKz0gYXJnVHlwZXMuZ2V0KGkpICsgIiAiICsgYXJnTmFtZXMuZ2V0KGkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHM7DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KVHlwZS5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNmQ0NDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pUeXBlLmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCisNCitwdWJsaWMgY2xhc3MgSlR5cGUgew0KKyAgICANCisgICAgU3RyaW5nIGJhc2VUeXBlOw0KKyAgICBib29sZWFuIGlzQXJyYXk7DQorICAgIGJvb2xlYW4gaXNDbGFzczsNCisNCisgICAgc3RhdGljIEhhc2hNYXA8Q1R5cGUsSlR5cGU+IHR5cGVNYXBwaW5nID0gbmV3IEhhc2hNYXA8Q1R5cGUsSlR5cGU+KCk7DQorICAgIHN0YXRpYyBIYXNoTWFwPENUeXBlLEpUeXBlPiBhcnJheVR5cGVNYXBwaW5nID0gbmV3IEhhc2hNYXA8Q1R5cGUsSlR5cGU+KCk7DQorDQorICAgIHN0YXRpYyB7DQorCS8vIFByaW1pdGl2ZSB0eXBlcw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGJpdGZpZWxkIiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGJvb2xlYW4iKSwgbmV3IEpUeXBlKCJib29sZWFuIikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGNsYW1wZiIpLCBuZXcgSlR5cGUoImZsb2F0IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGNsYW1weCIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xlbnVtIiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZsb2F0IiksIG5ldyBKVHlwZSgiZmxvYXQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZml4ZWQiKSwgbmV3IEpUeXBlKCJpbnQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50IiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGludHB0ciIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaG9ydCIpLCBuZXcgSlR5cGUoInNob3J0IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHNpemVpIiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHNpemVpcHRyIiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVieXRlIiksIG5ldyBKVHlwZSgiYnl0ZSIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1aW50IiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJ2b2lkIiksIG5ldyBKVHlwZSgidm9pZCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1Ynl0ZSIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoIlN0cmluZyIpKTsNCisNCisJLy8gVW50eXBlZCBwb2ludGVycyBtYXAgdG8gdW50eXBlZCBCdWZmZXJzDQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdm9pZCIsIHRydWUsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uQnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x2b2lkIiwgZmFsc2UsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uQnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgidm9pZCIsIGZhbHNlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorDQorCS8vIFR5cGVkIHBvaW50ZXJzIG1hcCB0byB0eXBlZCBCdWZmZXJzDQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMYm9vbGVhbiIsIGZhbHNlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZml4ZWQiLCBmYWxzZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZpeGVkIiwgdHJ1ZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZsb2F0IiwgZmFsc2UsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uRmxvYXRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZsb2F0IiwgdHJ1ZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5GbG9hdEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50IiwgZmFsc2UsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uSW50QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xpbnQiLCB0cnVlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdWludCIsIGZhbHNlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdWludCIsIHRydWUsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uSW50QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaG9ydCIsIHRydWUsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uU2hvcnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKw0KKwkvLyBUeXBlZCBwb2ludGVycyBtYXAgdG8gYXJyYXlzICsgb2Zmc2V0cw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMYm9vbGVhbiIsIGZhbHNlLCB0cnVlKSwNCisJCQkgICAgIG5ldyBKVHlwZSgiYm9vbGVhbiIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmaXhlZCIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmaXhlZCIsIGZhbHNlLCB0cnVlKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZmxvYXQiLCBmYWxzZSwgdHJ1ZSksIG5ldyBKVHlwZSgiZmxvYXQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZmxvYXQiLCB0cnVlLCB0cnVlKSwgbmV3IEpUeXBlKCJmbG9hdCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xpbnQiLCBmYWxzZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGludCIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaG9ydCIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoInNob3J0IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVpbnQiLCBmYWxzZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVpbnQiLCB0cnVlLCB0cnVlKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50cHRyIiksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHNpemVpcHRyIiksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgSlR5cGUoKSB7DQorICAgIH0NCisNCisgICAgcHVibGljIEpUeXBlKFN0cmluZyBwcmltaXRpdmVUeXBlTmFtZSkgew0KKwl0aGlzLmJhc2VUeXBlID0gcHJpbWl0aXZlVHlwZU5hbWU7DQorCXRoaXMuaXNDbGFzcyA9IGZhbHNlOw0KKwl0aGlzLmlzQXJyYXkgPSBmYWxzZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgSlR5cGUoU3RyaW5nIHByaW1pdGl2ZVR5cGVOYW1lLCBib29sZWFuIGlzQ2xhc3MsIGJvb2xlYW4gaXNBcnJheSkgew0KKwl0aGlzLmJhc2VUeXBlID0gcHJpbWl0aXZlVHlwZU5hbWU7DQorCXRoaXMuaXNDbGFzcyA9IGlzQ2xhc3M7DQorCXRoaXMuaXNBcnJheSA9IGlzQXJyYXk7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRCYXNlVHlwZSgpIHsNCisJcmV0dXJuIGJhc2VUeXBlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCXJldHVybiBiYXNlVHlwZSArIChpc0FycmF5ID8gIltdIiA6ICIiKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgew0KKwlyZXR1cm4gaXNBcnJheTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NsYXNzKCkgew0KKwlyZXR1cm4gaXNDbGFzczsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsNCisJcmV0dXJuICFpc0NsYXNzKCkgJiYgIWlzQXJyYXkoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZvaWQoKSB7DQorCXJldHVybiBiYXNlVHlwZS5lcXVhbHMoInZvaWQiKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0J1ZmZlcigpIHsNCisJcmV0dXJuIGJhc2VUeXBlLmluZGV4T2YoIkJ1ZmZlciIpICE9IC0xOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZWRCdWZmZXIoKSB7DQorCXJldHVybiAhYmFzZVR5cGUuZXF1YWxzKCJqYXZhLm5pby5CdWZmZXIiKSAmJg0KKwkgICAgKGJhc2VUeXBlLmluZGV4T2YoIkJ1ZmZlciIpICE9IC0xKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3RhdGljIEpUeXBlIGNvbnZlcnQoQ1R5cGUgY3R5cGUsIGJvb2xlYW4gdXNlQXJyYXkpIHsNCisgCUpUeXBlIGphdmFUeXBlID0gbnVsbDsNCisgCWlmICh1c2VBcnJheSkgew0KKyAJICAgIGphdmFUeXBlID0gYXJyYXlUeXBlTWFwcGluZy5nZXQoY3R5cGUpOw0KKyAJfQ0KKyAJaWYgKGphdmFUeXBlID09IG51bGwpIHsNCisgCSAgICBqYXZhVHlwZSA9IHR5cGVNYXBwaW5nLmdldChjdHlwZSk7DQorIAl9DQorIAlpZiAoamF2YVR5cGUgPT0gbnVsbCkgew0KKyAJICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBDIHR5cGU6ICIgKyBjdHlwZSk7DQorIAl9DQorIAlyZXR1cm4gamF2YVR5cGU7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KbmlDb2RlRW1pdHRlci5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KbmlDb2RlRW1pdHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYjlhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0puaUNvZGVFbWl0dGVyLmphdmEKQEAgLTAsMCArMSwxMDg2IEBACitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogRW1pdHMgYSBKYXZhIGludGVyZmFjZSBhbmQgSmF2YSAmIEMgaW1wbGVtZW50YXRpb24gZm9yIGEgQyBmdW5jdGlvbi4KKyAqCisgKiA8cD4gVGhlIEphdmEgaW50ZXJmYWNlIHdpbGwgaGF2ZSBCdWZmZXIgYW5kIGFycmF5IHZhcmlhbnRzIGZvciBmdW5jdGlvbnMgdGhhdAorICogaGF2ZSBhIHR5cGVkIHBvaW50ZXIgYXJndW1lbnQuICBUaGUgYXJyYXkgdmFyaWFudCB3aWxsIGNvbnZlcnQgYSBzaW5nbGUgIjx0eXBlPiAqZGF0YSIKKyAqIGFyZ3VtZW50IHRvIGEgcGFpciBvZiBhcmd1bWVudHMgIjx0eXBlPltdIGRhdGEsIGludCBvZmZzZXQiLgorICovCitwdWJsaWMgY2xhc3MgSm5pQ29kZUVtaXR0ZXIgaW1wbGVtZW50cyBDb2RlRW1pdHRlciB7CisKKyAgICAvLyBJZiB0cnVlLCB1c2UgQysrIHN0eWxlIGZvciBjYWxsaW5nIHRocm91Z2ggYSBKTklFbnYgKjoKKyAgICAvLyBlbnYtPkZ1bmMoLi4uKQorICAgIC8vIElmIGZhbHNlLCB1c2UgQyBzdHlsZToKKyAgICAvLyAoKmVudiktPkZ1bmMoZW52LCAuLi4pCisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gbVVzZUNQbHVzUGx1cyA9IHRydWU7CisKKyAgICBib29sZWFuIG1Vc2VDb250ZXh0UG9pbnRlciA9IHRydWU7CisKKyAgICBTdHJpbmcgbUNsYXNzUGF0aE5hbWU7CisgICAgCisgICAgUGFyYW1ldGVyQ2hlY2tlciBtQ2hlY2tlcjsKKyAgICBQcmludFN0cmVhbSBtSmF2YTEwSW50ZXJmYWNlU3RyZWFtOworICAgIFByaW50U3RyZWFtIG1KYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW07CisgICAgUHJpbnRTdHJlYW0gbUphdmExMUludGVyZmFjZVN0cmVhbTsKKyAgICBQcmludFN0cmVhbSBtSmF2YTExRXh0SW50ZXJmYWNlU3RyZWFtOworICAgIFByaW50U3RyZWFtIG1KYXZhMTFFeHRQYWNrSW50ZXJmYWNlU3RyZWFtOworICAgIFByaW50U3RyZWFtIG1KYXZhSW1wbFN0cmVhbTsKKyAgICBQcmludFN0cmVhbSBtQ1N0cmVhbTsKKworICAgIFByaW50U3RyZWFtIG1KYXZhSW50ZXJmYWNlU3RyZWFtOworCisgICAgTGlzdDxTdHJpbmc+IG5hdGl2ZVJlZ2lzdHJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworICAgIGJvb2xlYW4gbmVlZHNFeGl0OworCisgICAgc3RhdGljIFN0cmluZyBpbmRlbnQgPSAiICAgICI7CisKKyAgICBIYXNoU2V0PFN0cmluZz4gbUZ1bmN0aW9uc0VtaXR0ZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gamF2YTEwSW50ZXJmYWNlU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBKYXZhIGludGVyZmFjZSBmb3IgR0wgMS4wIGZ1bmN0aW9ucworICAgICAqIEBwYXJhbSBqYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW0gdGhlIFByaW50U3RyZWFtIHRvIHdoaWNoIHRvIGVtaXQgdGhlIEphdmEgaW50ZXJmYWNlIGZvciBHTCAxLjAgZXh0ZW5zaW9uIGZ1bmN0aW9ucworICAgICAqIEBwYXJhbSBqYXZhMTFJbnRlcmZhY2VTdHJlYW0gdGhlIFByaW50U3RyZWFtIHRvIHdoaWNoIHRvIGVtaXQgdGhlIEphdmEgaW50ZXJmYWNlIGZvciBHTCAxLjEgZnVuY3Rpb25zIAorICAgICAqIEBwYXJhbSBqYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW0gdGhlIFByaW50U3RyZWFtIHRvIHdoaWNoIHRvIGVtaXQgdGhlIEphdmEgaW50ZXJmYWNlIGZvciBHTCAxLjEgRXh0ZW5zaW9uIGZ1bmN0aW9ucworICAgICAqIEBwYXJhbSBqYXZhMTFFeHRQYWNrSW50ZXJmYWNlU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBKYXZhIGludGVyZmFjZSBmb3IgR0wgMS4xIEV4dGVuc2lvbiBQYWNrIGZ1bmN0aW9ucworICAgICAqIEBwYXJhbSBqYXZhSW1wbFN0cmVhbSB0aGUgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdG8gZW1pdCB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbgorICAgICAqIEBwYXJhbSBjU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBDIGltcGxlbWVudGF0aW9uCisgICAgICovCisgICAgcHVibGljIEpuaUNvZGVFbWl0dGVyKFN0cmluZyBjbGFzc1BhdGhOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJDaGVja2VyIGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmExMEludGVyZmFjZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBqYXZhMTFJbnRlcmZhY2VTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmExMUV4dEludGVyZmFjZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YUltcGxTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGNTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlQ29udGV4dFBvaW50ZXIpIHsKKyAgICAgICAgbUNsYXNzUGF0aE5hbWUgPSBjbGFzc1BhdGhOYW1lOworICAgICAgICBtQ2hlY2tlciA9IGNoZWNrZXI7CisgICAgICAgIG1KYXZhMTBJbnRlcmZhY2VTdHJlYW0gPSBqYXZhMTBJbnRlcmZhY2VTdHJlYW07CisgICAgICAgIG1KYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW0gPSBqYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW07CisgICAgICAgIG1KYXZhMTFJbnRlcmZhY2VTdHJlYW0gPSBqYXZhMTFJbnRlcmZhY2VTdHJlYW07CisgICAgICAgIG1KYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW0gPSBqYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW07CisgICAgICAgIG1KYXZhMTFFeHRQYWNrSW50ZXJmYWNlU3RyZWFtID0gamF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbTsKKyAgICAgICAgbUphdmFJbXBsU3RyZWFtID0gamF2YUltcGxTdHJlYW07CisgICAgICAgIG1DU3RyZWFtID0gY1N0cmVhbTsKKyAgICAgICAgbVVzZUNvbnRleHRQb2ludGVyID0gdXNlQ29udGV4dFBvaW50ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihpbnQgdmVyc2lvbiwgYm9vbGVhbiBleHQsIGJvb2xlYW4gcGFjaykgeworICAgICAgICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICBtSmF2YUludGVyZmFjZVN0cmVhbSA9IGV4dCA/IG1KYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW0gOgorICAgICAgICAgICAgICAgIG1KYXZhMTBJbnRlcmZhY2VTdHJlYW07CisgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICBtSmF2YUludGVyZmFjZVN0cmVhbSA9IGV4dCA/CisgICAgICAgICAgICAgICAgKHBhY2sgPyBtSmF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbSA6CisgICAgICAgICAgICAgICAgIG1KYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW0pIDoKKyAgICAgICAgICAgICAgICBtSmF2YTExSW50ZXJmYWNlU3RyZWFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkJhZCB2ZXJzaW9uOiAiICsgdmVyc2lvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbWl0Q29kZShDRnVuYyBjZnVuYywgU3RyaW5nIG9yaWdpbmFsKSB7CisgICAgICAgIEpGdW5jIGpmdW5jOworICAgICAgICBTdHJpbmcgc2lnbmF0dXJlOworICAgICAgICBib29sZWFuIGR1cGxpY2F0ZTsKKyAgICAgICAgCisgICAgICAgIGlmIChjZnVuYy5oYXNUeXBlZFBvaW50ZXJBcmcoKSkgeworICAgICAgICAgICAgamZ1bmMgPSBKRnVuYy5jb252ZXJ0KGNmdW5jLCB0cnVlKTsKKworICAgICAgICAgICAgLy8gRG9uJ3QgZW1pdCBkdXBsaWNhdGUgZnVuY3Rpb25zCisgICAgICAgICAgICAvLyBUaGVzZSBtYXkgYXBwZWFyIGJlY2F1c2UgdGhleSBhcmUgZGVmaW5lZCBpbiBtdWx0aXBsZQorICAgICAgICAgICAgLy8gSmF2YSBpbnRlcmZhY2VzIChlLmcuLCBHTDExL0dMMTFFeHRlbnNpb25QYWNrKQorICAgICAgICAgICAgc2lnbmF0dXJlID0gamZ1bmMudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGR1cGxpY2F0ZSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1GdW5jdGlvbnNFbWl0dGVkLmNvbnRhaW5zKHNpZ25hdHVyZSkpIHsKKyAgICAgICAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRnVuY3Rpb25zRW1pdHRlZC5hZGQoc2lnbmF0dXJlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFkdXBsaWNhdGUpIHsKKyAgICAgICAgICAgICAgICBlbWl0TmF0aXZlRGVjbGFyYXRpb24oamZ1bmMsIG1KYXZhSW1wbFN0cmVhbSk7CisgICAgICAgICAgICAgICAgZW1pdEphdmFDb2RlKGpmdW5jLCBtSmF2YUltcGxTdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW1pdEphdmFJbnRlcmZhY2VDb2RlKGpmdW5jLCBtSmF2YUludGVyZmFjZVN0cmVhbSk7CisgICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZSkgeworICAgICAgICAgICAgICAgIGVtaXRKbmlDb2RlKGpmdW5jLCBtQ1N0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBqZnVuYyA9IEpGdW5jLmNvbnZlcnQoY2Z1bmMsIGZhbHNlKTsKKworICAgICAgICBzaWduYXR1cmUgPSBqZnVuYy50b1N0cmluZygpOworICAgICAgICBkdXBsaWNhdGUgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1GdW5jdGlvbnNFbWl0dGVkLmNvbnRhaW5zKHNpZ25hdHVyZSkpIHsKKyAgICAgICAgICAgIGR1cGxpY2F0ZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRnVuY3Rpb25zRW1pdHRlZC5hZGQoc2lnbmF0dXJlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZHVwbGljYXRlKSB7CisgICAgICAgICAgICBlbWl0TmF0aXZlRGVjbGFyYXRpb24oamZ1bmMsIG1KYXZhSW1wbFN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgZW1pdEphdmFJbnRlcmZhY2VDb2RlKGpmdW5jLCBtSmF2YUludGVyZmFjZVN0cmVhbSk7CisgICAgICAgIGlmICghZHVwbGljYXRlKSB7CisgICAgICAgICAgICBlbWl0SmF2YUNvZGUoamZ1bmMsIG1KYXZhSW1wbFN0cmVhbSk7CisgICAgICAgICAgICBlbWl0Sm5pQ29kZShqZnVuYywgbUNTdHJlYW0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW1pdE5hdGl2ZURlY2xhcmF0aW9uKEpGdW5jIGpmdW5jLCBQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgb3V0LnByaW50bG4oIiAgICAvLyBDIGZ1bmN0aW9uICIgKyBqZnVuYy5nZXRDRnVuYygpLmdldE9yaWdpbmFsKCkpOworICAgICAgICBvdXQucHJpbnRsbigpOworCisgICAgICAgIGVtaXRGdW5jdGlvbihqZnVuYywgb3V0LCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW1pdEphdmFJbnRlcmZhY2VDb2RlKEpGdW5jIGpmdW5jLCBQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgZW1pdEZ1bmN0aW9uKGpmdW5jLCBvdXQsIGZhbHNlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbWl0SmF2YUNvZGUoSkZ1bmMgamZ1bmMsIFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBlbWl0RnVuY3Rpb24oamZ1bmMsIG91dCwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBlbWl0RnVuY3Rpb25DYWxsKEpGdW5jIGpmdW5jLCBQcmludFN0cmVhbSBvdXQsIFN0cmluZyBpaWksIGJvb2xlYW4gZ3JhYkFycmF5ICkgeworICAgICAgICBib29sZWFuIGlzVm9pZCA9IGpmdW5jLmdldFR5cGUoKS5pc1ZvaWQoKTsKKyAgICAgICAgYm9vbGVhbiBpc1BvaW50ZXJGdW5jID0gamZ1bmMuZ2V0TmFtZSgpLmVuZHNXaXRoKCJQb2ludGVyIikgJiYKKyAgICAgICAgICAgIGpmdW5jLmdldENGdW5jKCkuaGFzUG9pbnRlckFyZygpOworCisgICAgICAgIGlmICghaXNWb2lkKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKworICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0VHlwZSgpICsgIiBfcmV0dXJuVmFsdWU7Iik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsKKyAgICAgICAgICAgICAgICAgICAgKGlzVm9pZCA/ICIiIDogIl9yZXR1cm5WYWx1ZSA9ICIpICsKKyAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgKGlzUG9pbnRlckZ1bmMgPyAiQm91bmRzIiA6ICIiICkgKworICAgICAgICAgICAgICAgICAgICAiKCIpOworCQorICAgICAgICBpbnQgbnVtQXJncyA9IGpmdW5jLmdldE51bUFyZ3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBhcmdOYW1lID0gamZ1bmMuZ2V0QXJnTmFtZShpKTsKKyAgICAgICAgICAgIEpUeXBlIGFyZ1R5cGUgPSBqZnVuYy5nZXRBcmdUeXBlKGkpOworCisgICAgICAgICAgICBpZiAoZ3JhYkFycmF5ICYmIGFyZ1R5cGUuaXNUeXBlZEJ1ZmZlcigpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gYXJnVHlwZS5nZXRCYXNlVHlwZSgpOworICAgICAgICAgICAgICAgIHR5cGVOYW1lID0gdHlwZU5hbWUuc3Vic3RyaW5nKDksIHR5cGVOYW1lLmxlbmd0aCgpIC0gNik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgImdldCIgKyB0eXBlTmFtZSArICJBcnJheSgiICsgYXJnTmFtZSArICIpLCIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChpaWkgKyBpbmRlbnQgKyAiZ2V0T2Zmc2V0KCIgKyBhcmdOYW1lICsgIikiKTsgCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludChpaWkgKyBpbmRlbnQgKyBhcmdOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpID09IG51bUFyZ3MgLSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgYXJnTmFtZSArICIucmVtYWluaW5nKCkiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQorICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiKTsiKTsKKyAgICB9CisKKyAgICB2b2lkIHByaW50SWZjaGVja1Bvc3RhbWJsZShQcmludFN0cmVhbSBvdXQsIGJvb2xlYW4gaXNCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBlbWl0RXhjZXB0aW9uQ2hlY2ssIFN0cmluZyBpaWkpIHsKKyAgICAgICAgcHJpbnRJZmNoZWNrUG9zdGFtYmxlKG91dCwgaXNCdWZmZXIsIGVtaXRFeGNlcHRpb25DaGVjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQiLCAiX3JlbWFpbmluZyIsIGlpaSk7CisgICAgfQorCisgICAgdm9pZCBwcmludElmY2hlY2tQb3N0YW1ibGUoUHJpbnRTdHJlYW0gb3V0LCBib29sZWFuIGlzQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZW1pdEV4Y2VwdGlvbkNoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvZmZzZXQsIFN0cmluZyByZW1haW5pbmcsIFN0cmluZyBpaWkpIHsKKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICBkZWZhdWx0OiIpOworICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAgICBfbmVlZGVkID0gMDsiKTsKKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgICAgYnJlYWs7Iik7CisgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7CisKKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgiICsgcmVtYWluaW5nICsgIiA8IF9uZWVkZWQpIHsiKTsKKyAgICAgICAgaWYgKGVtaXRFeGNlcHRpb25DaGVjaykgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIl9leGNlcHRpb24gPSAxOyIpOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArCisgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIl9lbnYiIDogIigqX2VudikiKSArCisgICAgICAgICAgICAgICAgICAgICItPlRocm93TmV3KCIgKworICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICIiIDogIl9lbnYsICIpICsKKyAgICAgICAgICAgICAgICAgICAgIklBRUNsYXNzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgIlwiIiArCisgICAgICAgICAgICAgICAgICAgIChpc0J1ZmZlciA/IAorICAgICAgICAgICAgICAgICAgICAgInJlbWFpbmluZygpIiA6ICJsZW5ndGggLSAiICsgb2Zmc2V0KSArCisgICAgICAgICAgICAgICAgICAgICIgPCBuZWVkZWRcIik7Iik7CisgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJnb3RvIGV4aXQ7Iik7CisgICAgICAgIG5lZWRzRXhpdCA9IHRydWU7CisgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7CisgICAgfQorCisgICAgYm9vbGVhbiBpc051bGxBbGxvd2VkKENGdW5jIGNmdW5jKSB7CisgICAgICAgIFN0cmluZ1tdIGNoZWNrcyA9IG1DaGVja2VyLmdldENoZWNrcyhjZnVuYy5nZXROYW1lKCkpOworICAgICAgICBpbnQgaW5kZXggPSAxOworICAgICAgICBpZiAoY2hlY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGNoZWNrcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInJldHVybiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLnN0YXJ0c1dpdGgoImNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJpZmNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gNTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJ1bnN1cHBvcnRlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygibnVsbEFsbG93ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiB1bmtub3duIGtleXdvcmQgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc1tpbmRleF0gKyAiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0RXJyb3JSZXR1cm5WYWx1ZShDRnVuYyBjZnVuYykgeworICAgICAgICBDVHlwZSByZXR1cm5UeXBlID0gY2Z1bmMuZ2V0VHlwZSgpOworICAgICAgICBib29sZWFuIGlzVm9pZCA9IHJldHVyblR5cGUuaXNWb2lkKCk7CisgICAgICAgIGlmIChpc1ZvaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nW10gY2hlY2tzID0gbUNoZWNrZXIuZ2V0Q2hlY2tzKGNmdW5jLmdldE5hbWUoKSk7CisKKyAgICAgICAgaW50IGluZGV4ID0gMTsKKyAgICAgICAgaWYgKGNoZWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBjaGVja3MubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJyZXR1cm4iKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2tzW2luZGV4ICsgMV07CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLnN0YXJ0c1dpdGgoImNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJpZmNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gNTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJ1bnN1cHBvcnRlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygibnVsbEFsbG93ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IHVua25vd24ga2V5d29yZCBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzW2luZGV4XSArICJcIiIpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBib29sZWFuIGlzVW5zdXBwb3J0ZWRGdW5jKENGdW5jIGNmdW5jKSB7CisgICAgICAgIFN0cmluZ1tdIGNoZWNrcyA9IG1DaGVja2VyLmdldENoZWNrcyhjZnVuYy5nZXROYW1lKCkpOworICAgICAgICBpbnQgaW5kZXggPSAxOworICAgICAgICBpZiAoY2hlY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGNoZWNrcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInVuc3VwcG9ydGVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygicmV0dXJuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uc3RhcnRzV2l0aCgiY2hlY2siKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAzOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoImlmY2hlY2siKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSA1OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoIm51bGxBbGxvd2VkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiB1bmtub3duIGtleXdvcmQgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc1tpbmRleF0gKyAiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGVtaXROYXRpdmVCb3VuZHNDaGVja3MoQ0Z1bmMgY2Z1bmMsIFN0cmluZyBjbmFtZSwgUHJpbnRTdHJlYW0gb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQnVmZmVyLCBib29sZWFuIGVtaXRFeGNlcHRpb25DaGVjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9mZnNldCwgU3RyaW5nIHJlbWFpbmluZywgU3RyaW5nIGlpaSkgeworICAgICAgICBDVHlwZSByZXR1cm5UeXBlID0gY2Z1bmMuZ2V0VHlwZSgpOworICAgICAgICBib29sZWFuIGlzVm9pZCA9IHJldHVyblR5cGUuaXNWb2lkKCk7CisKKyAgICAgICAgU3RyaW5nW10gY2hlY2tzID0gbUNoZWNrZXIuZ2V0Q2hlY2tzKGNmdW5jLmdldE5hbWUoKSk7CisgICAgICAgIFN0cmluZyBjaGVja1ZhcjsKKyAgICAgICAgU3RyaW5nIHJldHZhbCA9IGdldEVycm9yUmV0dXJuVmFsdWUoY2Z1bmMpOworCisgICAgICAgIGJvb2xlYW4gbGFzdFdhc0lmY2hlY2sgPSBmYWxzZTsKKworICAgICAgICBpbnQgaW5kZXggPSAxOworICAgICAgICBpZiAoY2hlY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVtYWluaW5nRGVjbGFyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gbnVsbENoZWNrRGVjbGFyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gb2Zmc2V0Q2hlY2tlZCA9IGZhbHNlOworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgY2hlY2tzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGlmIChjaGVja3NbaW5kZXhdLnN0YXJ0c1dpdGgoImNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RXYXNJZmNoZWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludElmY2hlY2tQb3N0YW1ibGUob3V0LCBpc0J1ZmZlciwgZW1pdEV4Y2VwdGlvbkNoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcmVtYWluaW5nLCBpaWkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxhc3RXYXNJZmNoZWNrID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbmFtZSAhPSBudWxsICYmICFjbmFtZS5lcXVhbHMoY2hlY2tzW2luZGV4ICsgMV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgiICsgcmVtYWluaW5nICsgIiA8ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3NbaW5kZXggKyAyXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVtaXRFeGNlcHRpb25DaGVjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIl9leGNlcHRpb24gPSAxOyIpOworICAgICAgICAgICAgICAgICAgICB9CisJCSAgICBTdHJpbmcgZXhjZXB0aW9uQ2xhc3NOYW1lID0gIklBRUNsYXNzIjsKKwkJICAgIC8vIElmIHRoZSAiY2hlY2siIGtleXdvcmQgd2FzIG9mIHRoZSBmb3JtCisJCSAgICAvLyAiY2hlY2tfPGNsYXNzIG5hbWU+IiwgdXNlIHRoZSBjbGFzcyBuYW1lIGluIHRoZQorCQkgICAgLy8gZXhjZXB0aW9uIHRvIGJlIHRocm93bgorCQkgICAgaW50IHVuZGVyc2NvcmUgPSBjaGVja3NbaW5kZXhdLmluZGV4T2YoJ18nKTsKKwkJICAgIGlmICh1bmRlcnNjb3JlID49IDApIHsKKwkJCWV4Y2VwdGlvbkNsYXNzTmFtZSA9IGNoZWNrc1tpbmRleF0uc3Vic3RyaW5nKHVuZGVyc2NvcmUgKyAxKSArICJDbGFzcyI7CisJCSAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIl9lbnYiIDogIigqX2VudikiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPlRocm93TmV3KCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICIiIDogIl9lbnYsICIpICsKKwkJCQlleGNlcHRpb25DbGFzc05hbWUgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc0J1ZmZlciA/IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbWFpbmluZygpIiA6ICJsZW5ndGggLSAiICsgb2Zmc2V0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPCAiICsgY2hlY2tzW2luZGV4ICsgMl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIpOyIpOworCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJnb3RvIGV4aXQ7Iik7CisgICAgICAgICAgICAgICAgICAgIG5lZWRzRXhpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDM7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygiaWZjaGVjayIpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIG1hdGNoZXMgPSBjaGVja3NbaW5kZXggKyA0XS5zcGxpdCgiLCIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghbGFzdFdhc0lmY2hlY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpbnQgX25lZWRlZDsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3dpdGNoICgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc1tpbmRleCArIDNdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXRjaGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiI2lmIGRlZmluZWQoIiArIG1hdGNoZXNbaV0gKyAiKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgY2FzZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXNbaV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjoiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIjZW5kaWYgLy8gZGVmaW5lZCgiICsgbWF0Y2hlc1tpXSArICIpIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgX25lZWRlZCA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3NbaW5kZXggKyAyXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIGJyZWFrOyIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBsYXN0V2FzSWZjaGVjayA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygicmV0dXJuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygidW5zdXBwb3J0ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJudWxsQWxsb3dlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IHVua25vd24ga2V5d29yZCBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzW2luZGV4XSArICJcIiIpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobGFzdFdhc0lmY2hlY2spIHsKKyAgICAgICAgICAgIHByaW50SWZjaGVja1Bvc3RhbWJsZShvdXQsIGlzQnVmZmVyLCBlbWl0RXhjZXB0aW9uQ2hlY2ssIGlpaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sZWFuIGhhc05vbkNvbnN0QXJnKEpGdW5jIGpmdW5jLCBDRnVuYyBjZnVuYywKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiBub25QcmltaXRpdmVBcmdzKSB7CisgICAgICAgIGlmIChub25QcmltaXRpdmVBcmdzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBub25QcmltaXRpdmVBcmdzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IG5vblByaW1pdGl2ZUFyZ3MuZ2V0KGkpLmludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpZHgpOworICAgICAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2Z1bmMuZ2V0QXJnVHlwZShjSW5kZXgpLmlzQ29uc3QoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0J1ZmZlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2Z1bmMuZ2V0QXJnVHlwZShjSW5kZXgpLmlzQ29uc3QoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEVtaXQgYSBmdW5jdGlvbiBpbiBzZXZlcmFsIHZhcmlhbnRzOgorICAgICAqCisgICAgICogaWYgbmF0aXZlRGVjbDogcHVibGljIG5hdGl2ZSA8cmV0dXJudHlwZT4gZnVuYyhhcmdzKTsKKyAgICAgKgorICAgICAqIGlmICFuYXRpdmVEZWNsOgorICAgICAqICAgaWYgaW50ZXJmYWNlRGVjbDogIHB1YmxpYyA8cmV0dXJudHlwZT4gZnVuYyhhcmdzKTsKKyAgICAgKiAgIGlmICFpbnRlcmZhY2VEZWNsOiBwdWJsaWMgPHJldHVybnR5cGU+IGZ1bmMoYXJncykgeyBib2R5IH0KKyAgICAgKi8KKyAgICB2b2lkIGVtaXRGdW5jdGlvbihKRnVuYyBqZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuYXRpdmVEZWNsLCBib29sZWFuIGludGVyZmFjZURlY2wpIHsKKyAgICAgICAgYm9vbGVhbiBpc1BvaW50ZXJGdW5jID0KKyAgICAgICAgICAgIGpmdW5jLmdldE5hbWUoKS5lbmRzV2l0aCgiUG9pbnRlciIpICYmCisgICAgICAgICAgICBqZnVuYy5nZXRDRnVuYygpLmhhc1BvaW50ZXJBcmcoKTsKKworICAgICAgICBpZiAoIW5hdGl2ZURlY2wgJiYgIWludGVyZmFjZURlY2wgJiYgIWlzUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgIC8vIElmIGl0J3Mgbm90IGEgcG9pbnRlciBmdW5jdGlvbiwgd2UndmUgYWxyZWFkeSBlbWl0dGVkIGl0CisgICAgICAgICAgICAvLyB3aXRoIG5hdGl2ZURlY2wgPT0gdHJ1ZQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAobmF0aXZlRGVjbCA/ICJwcml2YXRlIG5hdGl2ZSAiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50ZXJmYWNlRGVjbCA/ICIiIDogInB1YmxpYyAiKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0VHlwZSgpICsgIiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAobmF0aXZlRGVjbCA/ICJCb3VuZHMiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIoIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgKG5hdGl2ZURlY2wgPyAicHVibGljIG5hdGl2ZSAiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50ZXJmYWNlRGVjbCA/ICIiIDogInB1YmxpYyAiKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0VHlwZSgpICsgIiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiKCIpOworICAgICAgICB9CisJCisgICAgICAgIGludCBudW1BcmdzID0gamZ1bmMuZ2V0TnVtQXJncygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIGFyZ05hbWUgPSBqZnVuYy5nZXRBcmdOYW1lKGkpOworICAgICAgICAgICAgSlR5cGUgYXJnVHlwZSA9IGpmdW5jLmdldEFyZ1R5cGUoaSk7CisJICAgIAorICAgICAgICAgICAgb3V0LnByaW50KGluZGVudCArIGluZGVudCArIGFyZ1R5cGUgKyAiICIgKyBhcmdOYW1lKTsKKyAgICAgICAgICAgIGlmIChpID09IG51bUFyZ3MgLSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMgJiYgbmF0aXZlRGVjbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyAiaW50IHJlbWFpbmluZyIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hdGl2ZURlY2wgfHwgaW50ZXJmYWNlRGVjbCkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIik7Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiKSB7Iik7CisKKyAgICAgICAgICAgIFN0cmluZyBpaWkgPSBpbmRlbnQgKyBpbmRlbnQ7CisKKyAgICAgICAgICAgIFN0cmluZyBmbmFtZSA9IGpmdW5jLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGRlYWwgd2l0aCBWQk8gdmFyaWFudHMKKyAgICAgICAgICAgICAgICBpZiAoZm5hbWUuZXF1YWxzKCJnbENvbG9yUG9pbnRlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoKHNpemUgPT0gNCkgJiYiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoKHR5cGUgPT0gR0xfRkxPQVQpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0ZJWEVEKSkgJiYiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoc3RyaWRlID49IDApKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfY29sb3JQb2ludGVyID0gcG9pbnRlcjsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZuYW1lLmVxdWFscygiZ2xOb3JtYWxQb2ludGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgoKHR5cGUgPT0gR0xfRkxPQVQpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0JZVEUpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX1NIT1JUKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9GSVhFRCkpICYmIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKHN0cmlkZSA+PSAwKSkgeyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiX25vcm1hbFBvaW50ZXIgPSBwb2ludGVyOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAifSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm5hbWUuZXF1YWxzKCJnbFRleENvb3JkUG9pbnRlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoKChzaXplID09IDIpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgIChzaXplID09IDMpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgIChzaXplID09IDQpKSAmJiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICgodHlwZSA9PSBHTF9GTE9BVCkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfQllURSkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfU0hPUlQpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0ZJWEVEKSkgJiYiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoc3RyaWRlID49IDApKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfdGV4Q29vcmRQb2ludGVyID0gcG9pbnRlcjsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZuYW1lLmVxdWFscygiZ2xWZXJ0ZXhQb2ludGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgoKHNpemUgPT0gMikgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHNpemUgPT0gMykgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHNpemUgPT0gNCkpICYmIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKCh0eXBlID09IEdMX0ZMT0FUKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9CWVRFKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9TSE9SVCkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfRklYRUQpKSAmJiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgIChzdHJpZGUgPj0gMCkpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIl92ZXJ0ZXhQb2ludGVyID0gcG9pbnRlcjsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGVtaXRCb3VuZHNDaGVja3MoamZ1bmMsIG91dCwgaWlpKTsKKyAgICAgICAgICAgIGVtaXRGdW5jdGlvbkNhbGwoamZ1bmMsIG91dCwgaWlpLCBmYWxzZSk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gaXNWb2lkID0gamZ1bmMuZ2V0VHlwZSgpLmlzVm9pZCgpOworCisgICAgICAgICAgICBpZiAoIWlzVm9pZCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArICJyZXR1cm4gX3JldHVyblZhbHVlOyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnRsbigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEpuaU5hbWUoSlR5cGUgalR5cGUpIHsKKyAgICAgICAgU3RyaW5nIGpuaU5hbWUgPSAiIjsKKyAgICAgICAgaWYgKGpUeXBlLmlzQ2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuICJMIiArIGpUeXBlLmdldEJhc2VUeXBlKCkgKyAiOyI7CisgICAgICAgIH0gZWxzZSBpZiAoalR5cGUuaXNBcnJheSgpKSB7CisgICAgICAgICAgICBqbmlOYW1lID0gIlsiOworICAgICAgICB9CisJCisgICAgICAgIFN0cmluZyBiYXNlVHlwZSA9IGpUeXBlLmdldEJhc2VUeXBlKCk7CisgICAgICAgIGlmIChiYXNlVHlwZS5lcXVhbHMoImludCIpKSB7CisgICAgICAgICAgICBqbmlOYW1lICs9ICJJIjsKKyAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoImZsb2F0IikpIHsKKyAgICAgICAgICAgIGpuaU5hbWUgKz0gIkYiOworICAgICAgICB9IGVsc2UgaWYgKGJhc2VUeXBlLmVxdWFscygiYm9vbGVhbiIpKSB7CisgICAgICAgICAgICBqbmlOYW1lICs9ICJaIjsKKyAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoInNob3J0IikpIHsKKyAgICAgICAgICAgIGpuaU5hbWUgKz0gIlMiOworICAgICAgICB9IGVsc2UgaWYgKGJhc2VUeXBlLmVxdWFscygibG9uZyIpKSB7CisgICAgICAgICAgICBqbmlOYW1lICs9ICJMIjsKKyAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoImJ5dGUiKSkgeworICAgICAgICAgICAgam5pTmFtZSArPSAiQiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGpuaU5hbWU7CisgICAgfQorCisgICAgU3RyaW5nIGdldEpuaVR5cGUoSlR5cGUgalR5cGUpIHsKKyAgICAgICAgaWYgKGpUeXBlLmlzVm9pZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gInZvaWQiOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGJhc2VUeXBlID0galR5cGUuZ2V0QmFzZVR5cGUoKTsKKyAgICAgICAgaWYgKGpUeXBlLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgIGlmIChiYXNlVHlwZS5lcXVhbHMoIlN0cmluZyIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJqc3RyaW5nIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJqIiArIGJhc2VUeXBlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGpUeXBlLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgcmV0dXJuICJqIiArIGJhc2VUeXBlICsgIkFycmF5IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAiam9iamVjdCI7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgU3RyaW5nIGdldEpuaU1hbmdsZWROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoIl8iLCAiXzEiKTsKKyAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgiOyIsICJfMiIpOworICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlQWxsKCJcXFsiLCAiXzMiKTsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW1pdEpuaUNvZGUoSkZ1bmMgamZ1bmMsIFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBDRnVuYyBjZnVuYyA9IGpmdW5jLmdldENGdW5jKCk7CisJCisgICAgICAgIC8vIEVtaXQgY29tbWVudCBpZGVudGlmeWluZyBvcmlnaW5hbCBDIGZ1bmN0aW9uCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAgIC8vIC8qIHZvaWQgZ2xDbGlwUGxhbmVmICggR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbiApICovCisgICAgICAgIC8vCisgICAgICAgIG91dC5wcmludGxuKCIvKiAiICsgY2Z1bmMuZ2V0T3JpZ2luYWwoKSArICIgKi8iKTsKKworICAgICAgICAvLyBFbWl0IEpOSSBzaWduYXR1cmUgKG5hbWUpCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAgIC8vIHZvaWQKKyAgICAgICAgLy8gYW5kcm9pZF9nbENsaXBQbGFuZWZfX0lfM0ZJCisgICAgICAgIC8vCisKKyAgICAgICAgU3RyaW5nIG91dE5hbWUgPSAiYW5kcm9pZF8iICsgamZ1bmMuZ2V0TmFtZSgpOworICAgICAgICBib29sZWFuIGlzUG9pbnRlckZ1bmMgPSBvdXROYW1lLmVuZHNXaXRoKCJQb2ludGVyIikgJiYKKyAgICAgICAgICAgIGpmdW5jLmdldENGdW5jKCkuaGFzUG9pbnRlckFyZygpOworICAgICAgICBib29sZWFuIGlzVkJPUG9pbnRlckZ1bmMgPSAob3V0TmFtZS5lbmRzV2l0aCgiUG9pbnRlciIpIHx8CisgICAgICAgICAgICBvdXROYW1lLmVuZHNXaXRoKCJEcmF3RWxlbWVudHMiKSkgJiYKKyAgICAgICAgICAgICFqZnVuYy5nZXRDRnVuYygpLmhhc1BvaW50ZXJBcmcoKTsKKyAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgIG91dE5hbWUgKz0gIkJvdW5kcyI7CisgICAgICAgIH0KKworICAgICAgICBvdXQucHJpbnQoInN0YXRpYyAiKTsKKyAgICAgICAgb3V0LnByaW50bG4oZ2V0Sm5pVHlwZShqZnVuYy5nZXRUeXBlKCkpKTsKKyAgICAgICAgb3V0LnByaW50KG91dE5hbWUpOworCisgICAgICAgIFN0cmluZyByc2lnbmF0dXJlID0gZ2V0Sm5pTmFtZShqZnVuYy5nZXRUeXBlKCkpOworCisgICAgICAgIFN0cmluZyBzaWduYXR1cmUgPSAiIjsKKyAgICAgICAgaW50IG51bUFyZ3MgPSBqZnVuYy5nZXROdW1BcmdzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7CisgICAgICAgICAgICBKVHlwZSBhcmdUeXBlID0gamZ1bmMuZ2V0QXJnVHlwZShpKTsKKyAgICAgICAgICAgIHNpZ25hdHVyZSArPSBnZXRKbmlOYW1lKGFyZ1R5cGUpOworICAgICAgICB9CisgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICBzaWduYXR1cmUgKz0gIkkiOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXBwZW5kIHNpZ25hdHVyZSB0byBmdW5jdGlvbiBuYW1lCisgICAgICAgIFN0cmluZyBzaWcgPSBnZXRKbmlNYW5nbGVkTmFtZShzaWduYXR1cmUpLnJlcGxhY2UoJy4nLCAnXycpOyAgICAgICAgCisgICAgICAgIG91dC5wcmludCgiX18iICsgc2lnKTsKKyAgICAgICAgb3V0TmFtZSArPSAiX18iICsgc2lnOworCQorICAgICAgICBzaWduYXR1cmUgPSBzaWduYXR1cmUucmVwbGFjZSgnLicsICcvJyk7CisgICAgICAgIHJzaWduYXR1cmUgPSByc2lnbmF0dXJlLnJlcGxhY2UoJy4nLCAnLycpOworCQorICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICBpZiAocnNpZ25hdHVyZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICByc2lnbmF0dXJlID0gIlYiOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHMgPSAie1wiIiArCisgICAgICAgICAgICBqZnVuYy5nZXROYW1lKCkgKworICAgICAgICAgICAgKGlzUG9pbnRlckZ1bmMgPyAiQm91bmRzIiA6ICIiKSArCisgICAgICAgICAgICAiXCIsIFwiKCIgKyBzaWduYXR1cmUgKyIpIiArCisgICAgICAgICAgICByc2lnbmF0dXJlICsKKyAgICAgICAgICAgICJcIiwgKHZvaWQgKikgIiArCisgICAgICAgICAgICBvdXROYW1lICsKKyAgICAgICAgICAgICIgfSwiOworICAgICAgICBuYXRpdmVSZWdpc3RyYXRpb25zLmFkZChzKTsKKworICAgICAgICBMaXN0PEludGVnZXI+IG5vblByaW1pdGl2ZUFyZ3MgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgIGludCBudW1CdWZmZXJBcmdzID0gMDsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGJ1ZmZlckFyZ05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKyAgICAgICAgLy8gRW1pdCBKTkkgc2lnbmF0dXJlIChhcmd1bWVudHMpCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAgIC8vIChKTklFbnYgKl9lbnYsIGpvYmplY3QgdGhpcywgamludCBwbGFuZSwgamZsb2F0QXJyYXkgZXF1YXRpb25fcmVmLCBqaW50IG9mZnNldCkgeworICAgICAgICAvLworICAgICAgICBvdXQucHJpbnQoIiAgKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcyIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgeworICAgICAgICAgICAgb3V0LnByaW50KCIsICIpOworICAgICAgICAgICAgSlR5cGUgYXJnVHlwZSA9IGpmdW5jLmdldEFyZ1R5cGUoaSk7CisgICAgICAgICAgICBTdHJpbmcgc3VmZml4OworICAgICAgICAgICAgaWYgKCFhcmdUeXBlLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJnVHlwZS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gIl9yZWYiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICJfYnVmIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9uUHJpbWl0aXZlQXJncy5hZGQobmV3IEludGVnZXIoaSkpOworICAgICAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGkpLmlzQnVmZmVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBidWZmZXJBcmdOYW1lcy5hZGQoY25hbWUpOworICAgICAgICAgICAgICAgICAgICBudW1CdWZmZXJBcmdzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdWZmaXggPSAiIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0LnByaW50KGdldEpuaVR5cGUoYXJnVHlwZSkgKyAiICIgKyBqZnVuYy5nZXRBcmdOYW1lKGkpICsgc3VmZml4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgeworICAgICAgICAgICAgb3V0LnByaW50KCIsIGppbnQgcmVtYWluaW5nIik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIikgeyIpOworCQorICAgICAgICBpbnQgbnVtQXJyYXlzID0gMDsKKyAgICAgICAgaW50IG51bUJ1ZmZlcnMgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGludCBpZHggPSBub25QcmltaXRpdmVBcmdzLmdldChpKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpZHgpOworICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpOworICAgICAgICAgICAgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICArK251bUFycmF5czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNCdWZmZXIoKSkgeworICAgICAgICAgICAgICAgICsrbnVtQnVmZmVyczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEVtaXQgbWV0aG9kIGJvZHkKKworICAgICAgICAvLyBFbWl0IGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBmb3IgX2V4Y2VwdGlvbiBhbmQgX3JldHVyblZhbHVlCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAgIC8vIGFuZHJvaWQ6OmdsOjpvZ2xlc19jb250ZXh0X3QgKmN0eDsKKyAgICAgICAgLy8gCisgICAgICAgIC8vIGppbnQgX2V4Y2VwdGlvbjsKKyAgICAgICAgLy8gR0xlbnVtIF9yZXR1cm5WYWx1ZTsKKyAgICAgICAgLy8KKyAgICAgICAgQ1R5cGUgcmV0dXJuVHlwZSA9IGNmdW5jLmdldFR5cGUoKTsKKyAgICAgICAgYm9vbGVhbiBpc1ZvaWQgPSByZXR1cm5UeXBlLmlzVm9pZCgpOworCisgICAgICAgIGJvb2xlYW4gaXNVbnN1cHBvcnRlZCA9IGlzVW5zdXBwb3J0ZWRGdW5jKGNmdW5jKTsKKyAgICAgICAgaWYgKGlzVW5zdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAiX2Vudi0+VGhyb3dOZXcoVU9FQ2xhc3MsIik7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBcIiIgKyBjZnVuYy5nZXROYW1lKCkgKyAiXCIpOyIpOworICAgICAgICAgICAgaWYgKCFpc1ZvaWQpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmV0dmFsID0gZ2V0RXJyb3JSZXR1cm5WYWx1ZShjZnVuYyk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgInJldHVybiAiICsgcmV0dmFsICsgIjsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Vc2VDb250ZXh0UG9pbnRlcikgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAiYW5kcm9pZDo6Z2w6Om9nbGVzX2NvbnRleHRfdCAqY3R4ID0gZ2V0Q29udGV4dChfZW52LCBfdGhpcyk7Iik7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGVtaXRFeGNlcHRpb25DaGVjayA9IChudW1BcnJheXMgPiAwIHx8IG51bUJ1ZmZlcnMgPiAwKSAmJgorICAgICAgICAgICAgaGFzTm9uQ29uc3RBcmcoamZ1bmMsIGNmdW5jLCBub25QcmltaXRpdmVBcmdzKTsKKyAgICAgICAgLy8gbUNoZWNrZXIuZ2V0Q2hlY2tzKGNmdW5jLmdldE5hbWUoKSkgIT0gbnVsbAorCisgICAgICAgIC8vIEVtaXQgYW4gX2V4ZXB0aW9uIHZhcmlhYmxlIGlmIHRoZXJlIHdpbGwgYmUgZXJyb3IgY2hlY2tzCisgICAgICAgIGlmIChlbWl0RXhjZXB0aW9uQ2hlY2spIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJqaW50IF9leGNlcHRpb24gPSAwOyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRW1pdCBhIHNpbmdsZSBfYXJyYXkgb3IgbXVsdGlwbGUgX1hYWEFycmF5IHZhcmlhYmxlcworICAgICAgICBpZiAobnVtQnVmZmVyQXJncyA9PSAxKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgImphcnJheSBfYXJyYXkgPSAoamFycmF5KSAwOyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CdWZmZXJBcmdzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiamFycmF5IF8iICsgYnVmZmVyQXJnTmFtZXMuZ2V0KGkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJyYXkgPSAoamFycmF5KSAwOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghaXNWb2lkKSB7CisgICAgICAgICAgICBTdHJpbmcgcmV0dmFsID0gZ2V0RXJyb3JSZXR1cm5WYWx1ZShjZnVuYyk7CisgICAgICAgICAgICBpZiAocmV0dmFsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyByZXR1cm5UeXBlLmdldERlY2xhcmF0aW9uKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgX3JldHVyblZhbHVlID0gIiArIHJldHZhbCArICI7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIHJldHVyblR5cGUuZ2V0RGVjbGFyYXRpb24oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBfcmV0dXJuVmFsdWU7Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBFbWl0IGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBmb3IgcG9pbnRlciBhcmd1bWVudHMKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRXhhbXBsZToKKyAgICAgICAgLy8KKyAgICAgICAgLy8gR0xmaXhlZCAqZXFuX2Jhc2U7CisgICAgICAgIC8vIEdMZml4ZWQgKmVxbjsKKyAgICAgICAgLy8KKyAgICAgICAgU3RyaW5nIG9mZnNldCA9ICJvZmZzZXQiOworICAgICAgICBTdHJpbmcgcmVtYWluaW5nID0gIl9yZW1haW5pbmciOworICAgICAgICBpZiAobm9uUHJpbWl0aXZlQXJncy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gbm9uUHJpbWl0aXZlQXJncy5nZXQoaSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpbnQgY0luZGV4ID0gamZ1bmMuZ2V0QXJnQ0luZGV4KGlkeCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpOworCisgICAgICAgICAgICAgICAgQ1R5cGUgdHlwZSA9IGNmdW5jLmdldEFyZ1R5cGUoamZ1bmMuZ2V0QXJnQ0luZGV4KGlkeCkpOworICAgICAgICAgICAgICAgIFN0cmluZyBkZWNsID0gdHlwZS5nZXREZWNsYXJhdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVjbC5lbmRzV2l0aCgiKiIpID8gIiIgOiAiICIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0QXJnTmFtZShpZHgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9iYXNlID0gKCIgKyBkZWNsICsgIikgMDsiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVtYWluaW5nID0gKG51bUFycmF5cyA8PSAxICYmIG51bUJ1ZmZlcnMgPD0gMSkgPyAiX3JlbWFpbmluZyIgOgorICAgICAgICAgICAgICAgICAgICAiXyIgKyBjbmFtZSArICJSZW1haW5pbmciOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImppbnQgIiArIHJlbWFpbmluZyArICI7Iik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVjbC5lbmRzV2l0aCgiKiIpID8gIiIgOiAiICIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXRBcmdOYW1lKGlkeCkgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiID0gKCIgKyBkZWNsICsgIikgMDsiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyByZXR2YWwgPSBpc1ZvaWQgPyAiIiA6ICIgX3JldHVyblZhbHVlIjsKKworICAgICAgICAvLyBFbWl0ICdHZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsJyBmb3IgYXJyYXlzCisgICAgICAgIC8vIEVtaXQgJ0dldFBvaW50ZXInIGNhbGxzIGZvciBCdWZmZXIgcG9pbnRlcnMKKyAgICAgICAgaW50IGJ1ZkFyZ0lkeCA9IDA7CisgICAgICAgIGlmIChub25QcmltaXRpdmVBcmdzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9uUHJpbWl0aXZlQXJncy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBub25QcmltaXRpdmVBcmdzLmdldChpKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGludCBjSW5kZXggPSBqZnVuYy5nZXRBcmdDSW5kZXgoaWR4KTsKKwkJCisgICAgICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpOworICAgICAgICAgICAgICAgIG9mZnNldCA9IG51bUFycmF5cyA8PSAxID8gIm9mZnNldCIgOgorICAgICAgICAgICAgICAgICAgICBjbmFtZSArICJPZmZzZXQiOworICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IChudW1BcnJheXMgPD0gMSAmJiBudW1CdWZmZXJzIDw9IDEpID8gIl9yZW1haW5pbmciIDoKKyAgICAgICAgICAgICAgICAgICAgIl8iICsgY25hbWUgKyAiUmVtYWluaW5nIjsKKworICAgICAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZiAoISIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX3JlZikgeyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZW1pdEV4Y2VwdGlvbkNoZWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyAiX2V4Y2VwdGlvbiA9IDE7Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIiAgICAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiX2VudiIgOiAiKCpfZW52KSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+VGhyb3dOZXcoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIiIgOiAiX2VudiwgIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUFFQ2xhc3MsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgY25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiID09IG51bGxcIik7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIgICAgZ290byBleGl0OyIpOworICAgICAgICAgICAgICAgICAgICBuZWVkc0V4aXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOworCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJpZiAoIiArIG9mZnNldCArICIgPCAwKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbWl0RXhjZXB0aW9uQ2hlY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArICJfZXhjZXB0aW9uID0gMTsiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiICAgICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICJfZW52IiA6ICIoKl9lbnYpIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT5UaHJvd05ldygiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiIiA6ICJfZW52LCAiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJQUVDbGFzcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBvZmZzZXQgKyAiIDwgMFwiKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIiAgICBnb3RvIGV4aXQ7Iik7CisgICAgICAgICAgICAgICAgICAgIG5lZWRzRXhpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJ9Iik7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgcmVtYWluaW5nICsgIiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiX2VudiIgOiAiKCpfZW52KSIpICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT5HZXRBcnJheUxlbmd0aCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIiIgOiAiX2VudiwgIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKyAiX3JlZikgLSAiICsgb2Zmc2V0ICsgIjsiKTsKKworICAgICAgICAgICAgICAgICAgICBlbWl0TmF0aXZlQm91bmRzQ2hlY2tzKGNmdW5jLCBjbmFtZSwgb3V0LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXhjZXB0aW9uQ2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCByZW1haW5pbmcsICIgICAgIik7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2Jhc2UgPSAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmdW5jLmdldEFyZ1R5cGUoY0luZGV4KS5nZXREZWNsYXJhdGlvbigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIiAgICAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiX2VudiIgOiAiKCpfZW52KSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiIiA6ICJfZW52LCAiKSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXRBcmdOYW1lKGlkeCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX3JlZiwgKGpib29sZWFuICopMCk7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsgIiA9ICIgKyBjbmFtZSArICJfYmFzZSArICIgKyBvZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcnJheSA9IG51bUJ1ZmZlckFyZ3MgPD0gMSA/ICJfYXJyYXkiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICJfIiArIGJ1ZmZlckFyZ05hbWVzLmdldChidWZBcmdJZHgrKykgKyAiQXJyYXkiOworCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbnVsbEFsbG93ZWQgPSBpc051bGxBbGxvd2VkKGNmdW5jKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bGxBbGxvd2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiaWYgKCIgKyBjbmFtZSArICJfYnVmKSB7Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoaW5kZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiID0gKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuZ2V0RGVjbGFyYXRpb24oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpZ2V0UG9pbnRlcihfZW52LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2J1ZiwgJiIgKyBhcnJheSArICIsICYiICsgcmVtYWluaW5nICsgIik7Iik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bGxBbGxvd2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZW1pdE5hdGl2ZUJvdW5kc0NoZWNrcyhjZnVuYywgY25hbWUsIG91dCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXhjZXB0aW9uQ2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCByZW1haW5pbmcsICIgICAgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc1ZvaWQpIHsKKyAgICAgICAgICAgIG91dC5wcmludChpbmRlbnQgKyAiX3JldHVyblZhbHVlID0gIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnQoaW5kZW50KTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbmFtZSA9IGNmdW5jLmdldE5hbWUoKTsKKworICAgICAgICBpZiAobVVzZUNvbnRleHRQb2ludGVyKSB7CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMiwgbmFtZS5sZW5ndGgoKSk7IC8vIFN0cmlwIG9mZiAnZ2wnIHByZWZpeAorICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKCkgKworICAgICAgICAgICAgICAgIG5hbWUuc3Vic3RyaW5nKDEsIG5hbWUubGVuZ3RoKCkpOworICAgICAgICAgICAgb3V0LnByaW50KCJjdHgtPnByb2NzLiIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBvdXQucHJpbnQobmFtZSArIChpc1BvaW50ZXJGdW5jID8gIkJvdW5kcyIgOiAiIikgKyAiKCIpOworCisgICAgICAgIG51bUFyZ3MgPSBjZnVuYy5nZXROdW1BcmdzKCk7ICAgIAorICAgICAgICBpZiAobnVtQXJncyA9PSAwKSB7CisgICAgICAgICAgICBpZiAobVVzZUNvbnRleHRQb2ludGVyKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oImN0eCk7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1Vc2VDb250ZXh0UG9pbnRlcikgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJjdHgsIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlY2FzdDsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBudW1BcmdzIC0gMSAmJiBpc1ZCT1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVjYXN0ID0gImNvbnN0IEdMdm9pZCAqIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0eXBlY2FzdCA9IGNmdW5jLmdldEFyZ1R5cGUoaSkuZ2V0RGVjbGFyYXRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LnByaW50KGluZGVudCArIGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVjYXN0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIikiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2Z1bmMuZ2V0QXJnTmFtZShpKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBudW1BcmdzIC0gMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArICIoR0xzaXplaSlyZW1haW5pbmciKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIpOyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5lZWRzRXhpdCkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCJleGl0OiIpOworICAgICAgICAgICAgbmVlZHNFeGl0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBidWZBcmdJZHggPSAwOworICAgICAgICBpZiAobm9uUHJpbWl0aXZlQXJncy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbm9uUHJpbWl0aXZlQXJncy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBub25QcmltaXRpdmVBcmdzLmdldChpKS5pbnRWYWx1ZSgpOworCisgICAgICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpZHgpOworICAgICAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNBcnJheSgpKSB7CisJCSAgICAKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFyZ3VtZW50IGlzICdjb25zdCcsIEdMIHdpbGwgbm90IHdyaXRlIHRvIGl0LgorICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIGNhbiB1c2UgdGhlICdKTklfQUJPUlQnIGZsYWcgdG8gYXZvaWQKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5lZWQgdG8gd3JpdGUgYmFjayB0byB0aGUgSmF2YSBhcnJheQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWYgKCIgKyBqZnVuYy5nZXRBcmdOYW1lKGlkeCkgKyAiX2Jhc2UpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiX2VudiIgOiAiKCpfZW52KSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIiIgOiAiX2VudiwgIikgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0QXJnTmFtZShpZHgpICsgIl9yZWYsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnVuYy5nZXRBcmdOYW1lKGNJbmRleCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2Jhc2UsIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArIGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuaXNDb25zdCgpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKTklfQUJPUlQiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfZXhjZXB0aW9uID8gSk5JX0FCT1JUOiAwIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0J1ZmZlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcnJheSA9IG51bUJ1ZmZlckFyZ3MgPD0gMSA/ICJfYXJyYXkiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICJfIiArIGJ1ZmZlckFyZ05hbWVzLmdldChidWZBcmdJZHgrKykgKyAiQXJyYXkiOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiaWYgKCIgKyBhcnJheSArICIpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbGVhc2VQb2ludGVyKF9lbnYsICIgKyBhcnJheSArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnVuYy5nZXRBcmdOYW1lKGNJbmRleCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNmdW5jLmdldEFyZ1R5cGUoY0luZGV4KS5pc0NvbnN0KCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpOSV9GQUxTRSIgOiAiX2V4Y2VwdGlvbiA/IEpOSV9GQUxTRSA6IEpOSV9UUlVFIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzVm9pZCkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgInJldHVybiBfcmV0dXJuVmFsdWU7Iik7CisgICAgICAgIH0KKworICAgICAgICBvdXQucHJpbnRsbigifSIpOworICAgICAgICBvdXQucHJpbnRsbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE5hdGl2ZVJlZ2lzdHJhdGlvbihTdHJpbmcgcykgeworICAgICAgICBuYXRpdmVSZWdpc3RyYXRpb25zLmFkZChzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbWl0TmF0aXZlUmVnaXN0cmF0aW9uKCkgeworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJzdGF0aWMgY29uc3QgY2hhciAqY2xhc3NQYXRoTmFtZSA9IFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2xhc3NQYXRoTmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAiXCI7Iik7CisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oKTsKKworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIG1ldGhvZHNbXSA9IHsiKTsKKworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJ7XCJfbmF0aXZlQ2xhc3NJbml0XCIsIFwiKClWXCIsICh2b2lkKiluYXRpdmVDbGFzc0luaXQgfSwiKTsKKworICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGkgPSBuYXRpdmVSZWdpc3RyYXRpb25zLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgbUNTdHJlYW0ucHJpbnRsbihpLm5leHQoKSk7CisgICAgICAgIH0KKworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJ9OyIpOworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCk7CisgICAgCisKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbigiaW50IHJlZ2lzdGVyX2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwoSk5JRW52ICpfZW52KSIpOworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJ7Iik7CisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgZXJyOyIpOworCisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJlcnIgPSBhbmRyb2lkOjpBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKF9lbnYsIGNsYXNzUGF0aE5hbWUsIG1ldGhvZHMsIE5FTEVNKG1ldGhvZHMpKTsiKTsKKworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKGluZGVudCArICJyZXR1cm4gZXJyOyIpOworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJ9Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9QYXJhbWV0ZXJDaGVja2VyLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL1BhcmFtZXRlckNoZWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjI2YWNkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9QYXJhbWV0ZXJDaGVja2VyLmphdmEKQEAgLTAsMCArMSwyOCBAQAorCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworcHVibGljIGNsYXNzIFBhcmFtZXRlckNoZWNrZXIgeworCisgICAgSGFzaE1hcDxTdHJpbmcsU3RyaW5nW10+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmdbXT4oKTsKKworICAgIHB1YmxpYyBQYXJhbWV0ZXJDaGVja2VyKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzOworICAgICAgICB3aGlsZSAoKHMgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5zID0gcy5zcGxpdCgiXFxzIik7CisgICAgICAgICAgICBtYXAucHV0KHRva2Vuc1swXSwgdG9rZW5zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDaGVja3MoU3RyaW5nIGZ1bmN0aW9uTmFtZSkgeworICAgICAgICBTdHJpbmdbXSBjaGVja3MgPSBtYXAuZ2V0KGZ1bmN0aW9uTmFtZSk7CisgICAgICAgIGlmIChjaGVja3MgPT0gbnVsbCAmJgorICAgICAgICAgICAgKGZ1bmN0aW9uTmFtZS5lbmRzV2l0aCgiZnYiKSB8fAorICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZS5lbmRzV2l0aCgieHYiKSB8fAorICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZS5lbmRzV2l0aCgiaXYiKSkpIHsKKyAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSA9IGZ1bmN0aW9uTmFtZS5zdWJzdHJpbmcoMCwgZnVuY3Rpb25OYW1lLmxlbmd0aCgpIC0gMik7CisgICAgICAgICAgICBjaGVja3MgPSBtYXAuZ2V0KGZ1bmN0aW9uTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoZWNrczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMEV4dEhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTBFeHRIZWFkZXIuamF2YS1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDk5OWMyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTBFeHRIZWFkZXIuamF2YS1pZgpAQCAtMCwwICsxLDIyIEBACisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCitwYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOworCitwdWJsaWMgaW50ZXJmYWNlIEdMMTBFeHQgZXh0ZW5kcyBHTCB7CisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDEwSGVhZGVyLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMEhlYWRlci5qYXZhLWlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTI4MjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMEhlYWRlci5qYXZhLWlmCkBAIC0wLDAgKzEsMjU5IEBACisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCitwYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOworCitwdWJsaWMgaW50ZXJmYWNlIEdMMTAgZXh0ZW5kcyBHTCB7CisgICAgaW50IEdMX0FERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAxMDQ7CisgICAgaW50IEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSAgICAgICAgICAgICAgPSAweDg0NkU7CisgICAgaW50IEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgICAgICAgPSAweDg0NkQ7CisgICAgaW50IEdMX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDY7CisgICAgaW50IEdMX0FMUEhBX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTU7CisgICAgaW50IEdMX0FMUEhBX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQzA7CisgICAgaW50IEdMX0FMV0FZUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDc7CisgICAgaW50IEdMX0FNQklFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDA7CisgICAgaW50IEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgICAgICAgICAgICAgICAgICAgPSAweDE2MDI7CisgICAgaW50IEdMX0FORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDE7CisgICAgaW50IEdMX0FORF9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDQ7CisgICAgaW50IEdMX0FORF9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDI7CisgICAgaW50IEdMX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA0MDU7CisgICAgaW50IEdMX0JMRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRTI7CisgICAgaW50IEdMX0JMVUVfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTQ7CisgICAgaW50IEdMX0JZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDA7CisgICAgaW50IEdMX0NDVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA5MDE7CisgICAgaW50IEdMX0NMQU1QX1RPX0VER0UgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxMkY7CisgICAgaW50IEdMX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDA7CisgICAgaW50IEdMX0NPTE9SX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNzY7CisgICAgaW50IEdMX0NPTE9SX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDA7CisgICAgaW50IEdMX0NPTE9SX0xPR0lDX09QICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRjI7CisgICAgaW50IEdMX0NPTE9SX01BVEVSSUFMICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNTc7CisgICAgaW50IEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAgICAgICAgPSAweDg2QTM7CisgICAgaW50IEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OICAgICAgICAgICAgICAgICAgPSAweDEyMDc7CisgICAgaW50IEdMX0NPUFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDM7CisgICAgaW50IEdMX0NPUFlfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEM7CisgICAgaW50IEdMX0NVTExfRkFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNDQ7CisgICAgaW50IEdMX0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA5MDA7CisgICAgaW50IEdMX0RFQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIxMDE7CisgICAgaW50IEdMX0RFQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFFMDM7CisgICAgaW50IEdMX0RFUFRIX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTY7CisgICAgaW50IEdMX0RFUFRIX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAgICAgICAgPSAweDAxMDA7CisgICAgaW50IEdMX0RFUFRIX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzE7CisgICAgaW50IEdMX0RJRkZVU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDE7CisgICAgaW50IEdMX0RJVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRDA7CisgICAgaW50IEdMX0RPTlRfQ0FSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDExMDA7CisgICAgaW50IEdMX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDQ7CisgICAgaW50IEdMX0RTVF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDY7CisgICAgaW50IEdMX0VNSVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE2MDA7CisgICAgaW50IEdMX0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDI7CisgICAgaW50IEdMX0VRVUlWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDk7CisgICAgaW50IEdMX0VYUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA4MDA7CisgICAgaW50IEdMX0VYUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA4MDE7CisgICAgaW50IEdMX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFGMDM7CisgICAgaW50IEdMX0ZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOworICAgIGludCBHTF9GQVNURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMTAxOworICAgIGludCBHTF9GSVhFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDBDOworICAgIGludCBHTF9GTEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRDAwOworICAgIGludCBHTF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDA2OworICAgIGludCBHTF9GT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjYwOworICAgIGludCBHTF9GT0dfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjY2OworICAgIGludCBHTF9GT0dfREVOU0lUWSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjYyOworICAgIGludCBHTF9GT0dfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjY0OworICAgIGludCBHTF9GT0dfSElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzU0OworICAgIGludCBHTF9GT0dfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjY1OworICAgIGludCBHTF9GT0dfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjYzOworICAgIGludCBHTF9GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDA0OworICAgIGludCBHTF9GUk9OVF9BTkRfQkFDSyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDA4OworICAgIGludCBHTF9HRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjA2OworICAgIGludCBHTF9HUkVBVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjA0OworICAgIGludCBHTF9HUkVFTl9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDUzOworICAgIGludCBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVF9PRVMgID0gMHg4QjlCOworICAgIGludCBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEVfT0VTICAgID0gMHg4QjlBOworICAgIGludCBHTF9JTkNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAyOworICAgIGludCBHTF9JTlZBTElEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAwOworICAgIGludCBHTF9JTlZBTElEX09QRVJBVElPTiAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAyOworICAgIGludCBHTF9JTlZBTElEX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAxOworICAgIGludCBHTF9JTlZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBBOworICAgIGludCBHTF9LRUVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAwOworICAgIGludCBHTF9MRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAzOworICAgIGludCBHTF9MRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAxOworICAgIGludCBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UICAgICAgICAgICAgICAgICAgID0gMHgwQjUzOworICAgIGludCBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSAgICAgICAgICAgICAgICAgID0gMHgwQjUyOworICAgIGludCBHTF9MSUdIVDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAwOworICAgIGludCBHTF9MSUdIVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAxOworICAgIGludCBHTF9MSUdIVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAyOworICAgIGludCBHTF9MSUdIVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAzOworICAgIGludCBHTF9MSUdIVDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA0OworICAgIGludCBHTF9MSUdIVDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA1OworICAgIGludCBHTF9MSUdIVDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA2OworICAgIGludCBHTF9MSUdIVDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA3OworICAgIGludCBHTF9MSUdIVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjUwOworICAgIGludCBHTF9MSU5FX0xPT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAyOworICAgIGludCBHTF9MSU5FX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjIwOworICAgIGludCBHTF9MSU5FX1NNT09USF9ISU5UICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzUyOworICAgIGludCBHTF9MSU5FX1NUUklQICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAzOworICAgIGludCBHTF9MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyNjAxOworICAgIGludCBHTF9MSU5FQVJfQVRURU5VQVRJT04gICAgICAgICAgICAgICAgICAgID0gMHgxMjA4OworICAgIGludCBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiAgICAgICAgICAgICAgICAgID0gMHgyNzAzOworICAgIGludCBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QgICAgICAgICAgICAgICAgID0gMHgyNzAxOworICAgIGludCBHTF9MSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxOworICAgIGludCBHTF9MVU1JTkFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA5OworICAgIGludCBHTF9MVU1JTkFOQ0VfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTBBOworICAgIGludCBHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUyAgICAgICAgICAgICAgICAgID0gMHg4MEU5OworICAgIGludCBHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMgICAgICAgICAgICAgICAgID0gMHg4MEU4OworICAgIGludCBHTF9NQVhfTElHSFRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDMxOworICAgIGludCBHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICAgICAgICAgICAgID0gMHgwRDM2OworICAgIGludCBHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAgICAgICAgICAgID0gMHgwRDM4OworICAgIGludCBHTF9NQVhfVEVYVFVSRV9TSVpFICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDMzOworICAgIGludCBHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSCAgICAgICAgICAgICAgID0gMHgwRDM5OworICAgIGludCBHTF9NQVhfVEVYVFVSRV9VTklUUyAgICAgICAgICAgICAgICAgICAgID0gMHg4NEUyOworICAgIGludCBHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgICAgICAgID0gMHgwRDNBOworICAgIGludCBHTF9NT0RFTFZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNzAwOworICAgIGludCBHTF9NT0RVTEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMTAwOworICAgIGludCBHTF9NVUxUSVNBTVBMRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDlEOworICAgIGludCBHTF9OQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBFOworICAgIGludCBHTF9ORUFSRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyNjAwOworICAgIGludCBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIgICAgICAgICAgICAgICAgID0gMHgyNzAyOworICAgIGludCBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUICAgICAgICAgICAgICAgID0gMHgyNzAwOworICAgIGludCBHTF9ORVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAwOworICAgIGludCBHTF9OSUNFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMTAyOworICAgIGludCBHTF9OT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICBpbnQgR0xfTk9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwNTsKKyAgICBpbnQgR0xfTk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwODsKKyAgICBpbnQgR0xfTk9STUFMX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3NTsKKyAgICBpbnQgR0xfTk9STUFMSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBMTsKKyAgICBpbnQgR0xfTk9URVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwNTsKKyAgICBpbnQgR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAgICA9IDB4ODZBMjsKKyAgICBpbnQgR0xfT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE7CisgICAgaW50IEdMX09ORV9NSU5VU19EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgPSAweDAzMDU7CisgICAgaW50IEdMX09ORV9NSU5VU19EU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgPSAweDAzMDc7CisgICAgaW50IEdMX09ORV9NSU5VU19TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgPSAweDAzMDM7CisgICAgaW50IEdMX09ORV9NSU5VU19TUkNfQ09MT1IgICAgICAgICAgICAgICAgICAgPSAweDAzMDE7CisgICAgaW50IEdMX09SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDc7CisgICAgaW50IEdMX09SX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEQ7CisgICAgaW50IEdMX09SX1JFVkVSU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEI7CisgICAgaW50IEdMX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDU7CisgICAgaW50IEdMX1BBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMDU7CisgICAgaW50IEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUyAgICAgICAgICAgICAgICAgPSAweDhCOTI7CisgICAgaW50IEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTICAgICAgICAgICAgICAgICAgPSAweDhCOTQ7CisgICAgaW50IEdMX1BBTEVUVEU0X1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgPSAweDhCOTA7CisgICAgaW50IEdMX1BBTEVUVEU0X1JHQkE0X09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOTM7CisgICAgaW50IEdMX1BBTEVUVEU0X1JHQkE4X09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOTE7CisgICAgaW50IEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUyAgICAgICAgICAgICAgICAgPSAweDhCOTc7CisgICAgaW50IEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTICAgICAgICAgICAgICAgICAgPSAweDhCOTk7CisgICAgaW50IEdMX1BBTEVUVEU4X1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgPSAweDhCOTU7CisgICAgaW50IEdMX1BBTEVUVEU4X1JHQkE0X09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOTg7CisgICAgaW50IEdMX1BBTEVUVEU4X1JHQkE4X09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOTY7CisgICAgaW50IEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCAgICAgICAgICAgPSAweDBDNTA7CisgICAgaW50IEdMX1BPSU5UX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMTA7CisgICAgaW50IEdMX1BPSU5UX1NNT09USF9ISU5UICAgICAgICAgICAgICAgICAgICAgPSAweDBDNTE7CisgICAgaW50IEdMX1BPSU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA7CisgICAgaW50IEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUgICAgICAgICAgICAgPSAweDgxMjg7CisgICAgaW50IEdMX1BPSU5UX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMTE7CisgICAgaW50IEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICAgICAgICAgPSAweDgwMzc7CisgICAgaW50IEdMX1BPTFlHT05fU01PT1RIX0hJTlQgICAgICAgICAgICAgICAgICAgPSAweDBDNTM7CisgICAgaW50IEdMX1BPU0lUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDM7CisgICAgaW50IEdMX1BST0pFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE3MDE7CisgICAgaW50IEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiAgICAgICAgICAgICAgICAgPSAweDEyMDk7CisgICAgaW50IEdMX1JFRF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTI7CisgICAgaW50IEdMX1JFTkRFUkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFGMDE7CisgICAgaW50IEdMX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI5MDE7CisgICAgaW50IEdMX1JFUExBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFFMDE7CisgICAgaW50IEdMX1JFU0NBTEVfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwM0E7CisgICAgaW50IEdMX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDc7CisgICAgaW50IEdMX1JHQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDg7CisgICAgaW50IEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSAgICAgICAgICAgICAgPSAweDgwOUU7CisgICAgaW50IEdMX1NBTVBMRV9BTFBIQV9UT19PTkUgICAgICAgICAgICAgICAgICAgPSAweDgwOUY7CisgICAgaW50IEdMX1NBTVBMRV9DT1ZFUkFHRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQTA7CisgICAgaW50IEdMX1NDSVNTT1JfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBDMTE7CisgICAgaW50IEdMX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEY7CisgICAgaW50IEdMX1NISU5JTkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE2MDE7CisgICAgaW50IEdMX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDI7CisgICAgaW50IEdMX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFEMDE7CisgICAgaW50IEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFICAgICAgICAgICAgICAgPSAweDBCMjI7CisgICAgaW50IEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFICAgICAgICAgICAgICAgPSAweDBCMTI7CisgICAgaW50IEdMX1NQRUNVTEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDI7CisgICAgaW50IEdMX1NQT1RfQ1VUT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDY7CisgICAgaW50IEdMX1NQT1RfRElSRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDQ7CisgICAgaW50IEdMX1NQT1RfRVhQT05FTlQgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDU7CisgICAgaW50IEdMX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDI7CisgICAgaW50IEdMX1NSQ19BTFBIQV9TQVRVUkFURSAgICAgICAgICAgICAgICAgICAgPSAweDAzMDg7CisgICAgaW50IEdMX1NSQ19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDA7CisgICAgaW50IEdMX1NUQUNLX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDM7CisgICAgaW50IEdMX1NUQUNLX1VOREVSRkxPVyAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDQ7CisgICAgaW50IEdMX1NURU5DSUxfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTc7CisgICAgaW50IEdMX1NURU5DSUxfQlVGRkVSX0JJVCAgICAgICAgICAgICAgICAgICAgPSAweDA0MDA7CisgICAgaW50IEdMX1NURU5DSUxfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTA7CisgICAgaW50IEdMX1NVQlBJWEVMX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTA7CisgICAgaW50IEdMX1RFWFRVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE3MDI7CisgICAgaW50IEdMX1RFWFRVUkVfMkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBERTE7CisgICAgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkgICAgICAgICAgICAgICAgICAgPSAweDgwNzg7CisgICAgaW50IEdMX1RFWFRVUkVfRU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIzMDA7CisgICAgaW50IEdMX1RFWFRVUkVfRU5WX0NPTE9SICAgICAgICAgICAgICAgICAgICAgPSAweDIyMDE7CisgICAgaW50IEdMX1RFWFRVUkVfRU5WX01PREUgICAgICAgICAgICAgICAgICAgICAgPSAweDIyMDA7CisgICAgaW50IEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgPSAweDI4MDA7CisgICAgaW50IEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgPSAweDI4MDE7CisgICAgaW50IEdMX1RFWFRVUkVfV1JBUF9TICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI4MDI7CisgICAgaW50IEdMX1RFWFRVUkVfV1JBUF9UICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI4MDM7CisgICAgaW50IEdMX1RFWFRVUkUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzA7CisgICAgaW50IEdMX1RFWFRVUkUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzE7CisgICAgaW50IEdMX1RFWFRVUkUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzI7CisgICAgaW50IEdMX1RFWFRVUkUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzM7CisgICAgaW50IEdMX1RFWFRVUkU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzQ7CisgICAgaW50IEdMX1RFWFRVUkU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzU7CisgICAgaW50IEdMX1RFWFRVUkU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzY7CisgICAgaW50IEdMX1RFWFRVUkU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Qzc7CisgICAgaW50IEdMX1RFWFRVUkU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Qzg7CisgICAgaW50IEdMX1RFWFRVUkU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Qzk7CisgICAgaW50IEdMX1RFWFRVUkUxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0E7CisgICAgaW50IEdMX1RFWFRVUkUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0I7CisgICAgaW50IEdMX1RFWFRVUkUxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0M7CisgICAgaW50IEdMX1RFWFRVUkUxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0Q7CisgICAgaW50IEdMX1RFWFRVUkUxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0U7CisgICAgaW50IEdMX1RFWFRVUkUxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0Y7CisgICAgaW50IEdMX1RFWFRVUkUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDA7CisgICAgaW50IEdMX1RFWFRVUkUxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDE7CisgICAgaW50IEdMX1RFWFRVUkUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDI7CisgICAgaW50IEdMX1RFWFRVUkUxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDM7CisgICAgaW50IEdMX1RFWFRVUkUyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDQ7CisgICAgaW50IEdMX1RFWFRVUkUyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDU7CisgICAgaW50IEdMX1RFWFRVUkUyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDY7CisgICAgaW50IEdMX1RFWFRVUkUyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDc7CisgICAgaW50IEdMX1RFWFRVUkUyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDg7CisgICAgaW50IEdMX1RFWFRVUkUyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDk7CisgICAgaW50IEdMX1RFWFRVUkUyNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REE7CisgICAgaW50IEdMX1RFWFRVUkUyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REI7CisgICAgaW50IEdMX1RFWFRVUkUyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REM7CisgICAgaW50IEdMX1RFWFRVUkUyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REQ7CisgICAgaW50IEdMX1RFWFRVUkUzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REU7CisgICAgaW50IEdMX1RFWFRVUkUzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REY7CisgICAgaW50IEdMX1RSSUFOR0xFX0ZBTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDY7CisgICAgaW50IEdMX1RSSUFOR0xFX1NUUklQICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDU7CisgICAgaW50IEdMX1RSSUFOR0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDQ7CisgICAgaW50IEdMX1RSVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOworICAgIGludCBHTF9VTlBBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAgICAgID0gMHgwQ0Y1OworICAgIGludCBHTF9VTlNJR05FRF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAxOworICAgIGludCBHTF9VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAzOworICAgIGludCBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80ICAgICAgICAgICAgICAgID0gMHg4MDMzOworICAgIGludCBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICAgICAgICAgICAgICAgID0gMHg4MDM0OworICAgIGludCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAgICAgICAgICAgICAgICAgID0gMHg4MzYzOworICAgIGludCBHTF9WRU5ET1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAwOworICAgIGludCBHTF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAyOworICAgIGludCBHTF9WRVJURVhfQVJSQVkgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDc0OworICAgIGludCBHTF9YT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA2OworICAgIGludCBHTF9aRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFFeHRIZWFkZXIuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExRXh0SGVhZGVyLmphdmEtaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JlMjE2NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExRXh0SGVhZGVyLmphdmEtaWYKQEAgLTAsMCArMSw0MCBAQAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKKworcHVibGljIGludGVyZmFjZSBHTDExRXh0IGV4dGVuZHMgR0wgeworICAgIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTID0gMHg4QjlFOworICAgIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfT0VTICAgICAgICAgICAgICAgID0gMHg4ODQ0OworICAgIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgID0gMHg4ODQ5OworICAgIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU0laRV9PRVMgICAgICAgICAgID0gMHg4ODQ2OworICAgIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU1RSSURFX09FUyAgICAgICAgID0gMHg4ODQ4OworICAgIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgID0gMHg4ODQ3OworICAgIGludCBHTF9NQVRSSVhfUEFMRVRURV9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4ODQwOworICAgIGludCBHTF9NQVhfUEFMRVRURV9NQVRSSUNFU19PRVMgICAgICAgICAgICAgID0gMHg4ODQyOworICAgIGludCBHTF9NQVhfVkVSVEVYX1VOSVRTX09FUyAgICAgICAgICAgICAgICAgID0gMHg4NkE0OworICAgIGludCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMgICAgICAgICAgICAgICAgID0gMHg4QjlEOworICAgIGludCBHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgID0gMHg4ODlFOworICAgIGludCBHTF9XRUlHSFRfQVJSQVlfT0VTICAgICAgICAgICAgICAgICAgICAgID0gMHg4NkFEOworICAgIGludCBHTF9XRUlHSFRfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgICAgICAgID0gMHg4NkFDOworICAgIGludCBHTF9XRUlHSFRfQVJSQVlfU0laRV9PRVMgICAgICAgICAgICAgICAgID0gMHg4NkFCOworICAgIGludCBHTF9XRUlHSFRfQVJSQVlfU1RSSURFX09FUyAgICAgICAgICAgICAgID0gMHg4NkFBOworICAgIGludCBHTF9XRUlHSFRfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgICAgICAgID0gMHg4NkE5OworCisgICAgdm9pZCBnbFRleFBhcmFtZXRlcmZ2KGludCB0YXJnZXQsIGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbSwgaW50IG9mZnNldCk7CisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExRXh0ZW5zaW9uUGFja0hlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFFeHRlbnNpb25QYWNrSGVhZGVyLmphdmEtaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwMDE5MQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExRXh0ZW5zaW9uUGFja0hlYWRlci5qYXZhLWlmCkBAIC0wLDAgKzEsMTA4IEBACisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCitwYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOworCitwdWJsaWMgaW50ZXJmYWNlIEdMMTFFeHRlbnNpb25QYWNrIGV4dGVuZHMgR0wgeworICAgIGludCBHTF9CTEVORF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQ0E7CisgICAgaW50IEdMX0JMRU5EX0RTVF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBDODsKKyAgICBpbnQgR0xfQkxFTkRfRVFVQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDA5OworICAgIGludCBHTF9CTEVORF9FUVVBVElPTl9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4M0Q7CisgICAgaW50IEdMX0JMRU5EX0VRVUFUSU9OX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwOTsKKyAgICBpbnQgR0xfQkxFTkRfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MENCOworICAgIGludCBHTF9CTEVORF9TUkNfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQzk7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQwX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFMDsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0UxOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTI7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQzX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFMzsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0U0OworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UNV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTU7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ2X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFNjsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDdfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0U3OworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTg7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ5X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFOTsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDEwX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0VBOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRUI7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxMl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFQzsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDEzX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0VEOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRUU7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxNV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFRjsKKyAgICBpbnQgR0xfREVDUl9XUkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTA4OworICAgIGludCBHTF9ERVBUSF9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhEMDA7CisgICAgaW50IEdMX0RFUFRIX0NPTVBPTkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwMjsKKyAgICBpbnQgR0xfREVQVEhfQ09NUE9ORU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MUE1OworICAgIGludCBHTF9ERVBUSF9DT01QT05FTlQyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxQTY7CisgICAgaW50IEdMX0RFUFRIX0NPTVBPTkVOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODFBNzsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRV9PRVMgICAgICAgICAgID0gMHg4Q0QxOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFX09FUyAgICAgICAgICAgPSAweDhDRDA7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFX09FUyA9IDB4OENEMzsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMX09FUyAgICAgICAgID0gMHg4Q0QyOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDQTY7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENENTsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgID0gMHg4Q0Q2OworICAgIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlNfT0VTICAgICAgICAgICAgPSAweDhDRDk7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRFJBV19CVUZGRVJfT0VTICAgICAgICAgICA9IDB4OENEQjsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9GT1JNQVRTX09FUyAgICAgICAgICAgICAgID0gMHg4Q0RBOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVF9PRVMgICAgPSAweDhDRDc7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfUkVBRF9CVUZGRVJfT0VTICAgICAgICAgICA9IDB4OENEQzsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQwOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRF9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDhDREQ7CisgICAgaW50IEdMX0ZVTkNfQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwNjsKKyAgICBpbnQgR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDBCOworICAgIGludCBHTF9GVU5DX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMEE7CisgICAgaW50IEdMX0lOQ1JfV1JBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUwNzsKKyAgICBpbnQgR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT05fT0VTICAgICAgICAgICAgICAgID0gMHgwNTA2OworICAgIGludCBHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFNfT0VTICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDREY7CisgICAgaW50IEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxQzsKKyAgICBpbnQgR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEU4OworICAgIGludCBHTF9NSVJST1JFRF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgzNzA7CisgICAgaW50IEdMX05PUk1BTF9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxMTsKKyAgICBpbnQgR0xfUkVGTEVDVElPTl9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTEyOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTM7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENBNzsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDUyOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTQ7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1MTsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0hFSUdIVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQzOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUX09FUyAgICAgICAgICAgICAgICAgPSAweDhENDQ7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MTsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX1JFRF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDUwOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhENTU7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9XSURUSF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MjsKKyAgICBpbnQgR0xfUkdCNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDU3OworICAgIGludCBHTF9SR0I1NjVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENjI7CisgICAgaW50IEdMX1JHQjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA1MTsKKyAgICBpbnQgR0xfUkdCQTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDU2OworICAgIGludCBHTF9SR0JBOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNTg7CisgICAgaW50IEdMX1NURU5DSUxfQVRUQUNITUVOVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQyMDsKKyAgICBpbnQgR0xfU1RFTkNJTF9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTAxOworICAgIGludCBHTF9TVEVOQ0lMX0lOREVYMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDY7CisgICAgaW50IEdMX1NURU5DSUxfSU5ERVg0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0NzsKKyAgICBpbnQgR0xfU1RFTkNJTF9JTkRFWDhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQ4OworICAgIGludCBHTF9TVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMTsKKyAgICBpbnQgR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE0OworICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTM7CisgICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxNjsKKyAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE4OworICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ogICAgICAgICAgICAgICAgICAgICAgPSAweDg1MUE7CisgICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxNTsKKyAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE3OworICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ogICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTk7CisgICAgaW50IEdMX1RFWFRVUkVfR0VOX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjUwMDsKKyAgICBpbnQgR0xfVEVYVFVSRV9HRU5fU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDYwOworCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFIZWFkZXIuamF2YS1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGU1YTZiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFIZWFkZXIuamF2YS1pZgpAQCAtMCwwICsxLDE0NSBAQAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKKworcHVibGljIGludGVyZmFjZSBHTDExIGV4dGVuZHMgR0wxMCB7CisgICAgaW50IEdMX0FDVElWRV9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRFMDsKKyAgICBpbnQgR0xfQUREX1NJR05FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc0OworICAgIGludCBHTF9BTFBIQV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMUM7CisgICAgaW50IEdMX0FMUEhBX1RFU1RfRlVOQyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJDMTsKKyAgICBpbnQgR0xfQUxQSEFfVEVTVF9SRUYgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkMyOworICAgIGludCBHTF9BUlJBWV9CVUZGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4OTI7CisgICAgaW50IEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgICAgICAgICA9IDB4ODg5NDsKKyAgICBpbnQgR0xfQkxFTkRfRFNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkUwOworICAgIGludCBHTF9CTEVORF9TUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRTE7CisgICAgaW50IEdMX0JVRkZFUl9BQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhCQjsKKyAgICBpbnQgR0xfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NzY0OworICAgIGludCBHTF9CVUZGRVJfVVNBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg3NjU7CisgICAgaW50IEdMX0NMSUVOVF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAgICAgICAgICA9IDB4ODRFMTsKKyAgICBpbnQgR0xfQ0xJUF9QTEFORTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDAwOworICAgIGludCBHTF9DTElQX1BMQU5FMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDE7CisgICAgaW50IEdMX0NMSVBfUExBTkUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwMjsKKyAgICBpbnQgR0xfQ0xJUF9QTEFORTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDAzOworICAgIGludCBHTF9DTElQX1BMQU5FNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDQ7CisgICAgaW50IEdMX0NMSVBfUExBTkU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwNTsKKyAgICBpbnQgR0xfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICAgID0gMHg4ODk4OworICAgIGludCBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgPSAweDgwOTA7CisgICAgaW50IEdMX0NPTE9SX0FSUkFZX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA4MTsKKyAgICBpbnQgR0xfQ09MT1JfQVJSQVlfU1RSSURFICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDgzOworICAgIGludCBHTF9DT0xPUl9BUlJBWV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwODI7CisgICAgaW50IEdMX0NPTE9SX0NMRUFSX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMyMjsKKyAgICBpbnQgR0xfQ09MT1JfV1JJVEVNQVNLICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzIzOworICAgIGludCBHTF9DT01CSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzA7CisgICAgaW50IEdMX0NPTUJJTkVfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3MjsKKyAgICBpbnQgR0xfQ09NQklORV9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTcxOworICAgIGludCBHTF9DT05TVEFOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzY7CisgICAgaW50IEdMX0NPT1JEX1JFUExBQ0VfT0VTICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODg2MjsKKyAgICBpbnQgR0xfQ1VMTF9GQUNFX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjQ1OworICAgIGludCBHTF9DVVJSRU5UX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMDA7CisgICAgaW50IEdMX0NVUlJFTlRfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIwMjsKKyAgICBpbnQgR0xfQ1VSUkVOVF9URVhUVVJFX0NPT1JEUyAgICAgICAgICAgICAgICAgID0gMHgwQjAzOworICAgIGludCBHTF9ERVBUSF9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzM7CisgICAgaW50IEdMX0RFUFRIX0ZVTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI3NDsKKyAgICBpbnQgR0xfREVQVEhfUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjcwOworICAgIGludCBHTF9ERVBUSF9XUklURU1BU0sgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzI7CisgICAgaW50IEdMX0RPVDNfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODZBRTsKKyAgICBpbnQgR0xfRE9UM19SR0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NkFGOworICAgIGludCBHTF9EWU5BTUlDX0RSQVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4RTg7CisgICAgaW50IEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSICAgICAgICAgICAgICAgICAgICA9IDB4ODg5MzsKKyAgICBpbnQgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgID0gMHg4ODk1OworICAgIGludCBHTF9GUk9OVF9GQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNDY7CisgICAgaW50IEdMX0dFTkVSQVRFX01JUE1BUCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODE5MTsKKyAgICBpbnQgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQgICAgICAgICAgICAgICAgICAgID0gMHg4MTkyOworICAgIGludCBHTF9JTlRFUlBPTEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzU7CisgICAgaW50IEdMX0xJTkVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIyMTsKKyAgICBpbnQgR0xfTE9HSUNfT1BfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkYwOworICAgIGludCBHTF9NQVRSSVhfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTA7CisgICAgaW50IEdMX01BWF9DTElQX1BMQU5FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzMjsKKyAgICBpbnQgR0xfTU9ERUxWSUVXX01BVFJJWCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkE2OworICAgIGludCBHTF9NT0RFTFZJRVdfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyAgPSAweDg5OEQ7CisgICAgaW50IEdMX01PREVMVklFV19TVEFDS19ERVBUSCAgICAgICAgICAgICAgICAgICA9IDB4MEJBMzsKKyAgICBpbnQgR0xfTk9STUFMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgID0gMHg4ODk3OworICAgIGludCBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgPSAweDgwOEY7CisgICAgaW50IEdMX05PUk1BTF9BUlJBWV9TVFJJREUgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3RjsKKyAgICBpbnQgR0xfTk9STUFMX0FSUkFZX1RZUEUgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDdFOworICAgIGludCBHTF9PUEVSQU5EMF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OTg7CisgICAgaW50IEdMX09QRVJBTkQwX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5MDsKKyAgICBpbnQgR0xfT1BFUkFORDFfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTk5OworICAgIGludCBHTF9PUEVSQU5EMV9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OTE7CisgICAgaW50IEdMX09QRVJBTkQyX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5QTsKKyAgICBpbnQgR0xfT1BFUkFORDJfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTkyOworICAgIGludCBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTiAgICAgICAgICAgICAgPSAweDgxMjk7CisgICAgaW50IEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUgICAgICAgICAgICAgICA9IDB4ODEyODsKKyAgICBpbnQgR0xfUE9JTlRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjExOworICAgIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyAgICAgPSAweDhCOUY7CisgICAgaW50IEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTICAgICAgICAgICAgICAgICAgICA9IDB4OEI5QzsKKyAgICBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9QT0lOVEVSX09FUyAgICAgICAgICAgID0gMHg4OThDOworICAgIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVMgICAgICAgICAgICAgPSAweDg5OEI7CisgICAgaW50IEdMX1BPSU5UX1NJWkVfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgICAgICA9IDB4ODk4QTsKKyAgICBpbnQgR0xfUE9JTlRfU0laRV9NQVggICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MTI3OworICAgIGludCBHTF9QT0lOVF9TSVpFX01JTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxMjY7CisgICAgaW50IEdMX1BPSU5UX1NQUklURV9PRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODg2MTsKKyAgICBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SICAgICAgICAgICAgICAgICAgID0gMHg4MDM4OworICAgIGludCBHTF9QT0xZR09OX09GRlNFVF9VTklUUyAgICAgICAgICAgICAgICAgICAgPSAweDJBMDA7CisgICAgaW50IEdMX1BSRVZJT1VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3ODsKKyAgICBpbnQgR0xfUFJJTUFSWV9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc3OworICAgIGludCBHTF9QUk9KRUNUSU9OX01BVFJJWCAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTc7CisgICAgaW50IEdMX1BST0pFQ1RJT05fTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyA9IDB4ODk4RTsKKyAgICBpbnQgR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAgICAgICAgICAgICAgICAgID0gMHgwQkE0OworICAgIGludCBHTF9SR0JfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzM7CisgICAgaW50IEdMX1NBTVBMRV9CVUZGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBBODsKKyAgICBpbnQgR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVCAgICAgICAgICAgICAgICAgID0gMHg4MEFCOworICAgIGludCBHTF9TQU1QTEVfQ09WRVJBR0VfVkFMVUUgICAgICAgICAgICAgICAgICAgPSAweDgwQUE7CisgICAgaW50IEdMX1NBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBBOTsKKyAgICBpbnQgR0xfU0NJU1NPUl9CT1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzEwOworICAgIGludCBHTF9TSEFERV9NT0RFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNTQ7CisgICAgaW50IEdMX1NSQzBfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4ODsKKyAgICBpbnQgR0xfU1JDMF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTgwOworICAgIGludCBHTF9TUkMxX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODk7CisgICAgaW50IEdMX1NSQzFfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4MTsKKyAgICBpbnQgR0xfU1JDMl9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NThBOworICAgIGludCBHTF9TUkMyX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODI7CisgICAgaW50IEdMX1NUQVRJQ19EUkFXICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhFNDsKKyAgICBpbnQgR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgID0gMHgwQjkxOworICAgIGludCBHTF9TVEVOQ0lMX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTQ7CisgICAgaW50IEdMX1NURU5DSUxfRlVOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MjsKKyAgICBpbnQgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUwgICAgICAgICAgICAgICAgID0gMHgwQjk1OworICAgIGludCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyAgICAgICAgICAgICAgICAgPSAweDBCOTY7CisgICAgaW50IEdMX1NURU5DSUxfUkVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5NzsKKyAgICBpbnQgR0xfU1RFTkNJTF9WQUxVRV9NQVNLICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjkzOworICAgIGludCBHTF9TVEVOQ0lMX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTg7CisgICAgaW50IEdMX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRFNzsKKyAgICBpbnQgR0xfVEVYVFVSRV9CSU5ESU5HXzJEICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDY5OworICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgPSAweDg4OUE7CisgICAgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICA9IDB4ODA5MjsKKyAgICBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFICAgICAgICAgICAgICAgID0gMHg4MDg4OworICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NUUklERSAgICAgICAgICAgICAgPSAweDgwOEE7CisgICAgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfVFlQRSAgICAgICAgICAgICAgICA9IDB4ODA4OTsKKyAgICBpbnQgR0xfVEVYVFVSRV9NQVRSSVggICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkE4OworICAgIGludCBHTF9URVhUVVJFX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgICAgPSAweDg5OEY7CisgICAgaW50IEdMX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgICAgICAgICAgICAgICAgICA9IDB4MEJBNTsKKyAgICBpbnQgR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgID0gMHg4ODk2OworICAgIGludCBHTF9WRVJURVhfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgPSAweDgwOEU7CisgICAgaW50IEdMX1ZFUlRFWF9BUlJBWV9TSVpFICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3QTsKKyAgICBpbnQgR0xfVkVSVEVYX0FSUkFZX1NUUklERSAgICAgICAgICAgICAgICAgICAgID0gMHg4MDdDOworICAgIGludCBHTF9WRVJURVhfQVJSQVlfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwN0I7CisgICAgaW50IEdMX1ZJRVdQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBMjsKKyAgICBpbnQgR0xfV1JJVEVfT05MWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4OEI5OworCisgICAgdm9pZCBnbEdldFBvaW50ZXJ2KGludCBwbmFtZSwgamF2YS5uaW8uQnVmZmVyW10gcGFyYW1zKTsKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExSW1wbEhlYWRlci5qYXZhLWltcGwgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUltcGxIZWFkZXIuamF2YS1pbXBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMWJlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUltcGxIZWFkZXIuamF2YS1pbXBsCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC5nbGVzX2puaTsKKworaW1wb3J0IGphdmEubmlvLkJ1ZmZlcjsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDExOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworCitwdWJsaWMgY2xhc3MgR0wxMUltcGwgaW1wbGVtZW50cyBHTDExIHsKKworICAgIC8vIFByaXZhdGUgYWNjZXNzb3JzIGZvciBuYXRpdmUgY29kZQorCisgICAgbmF0aXZlIHByaXZhdGUgc3RhdGljIHZvaWQgX25hdGl2ZUNsYXNzSW5pdCgpOworICAgIHN0YXRpYyB7CisJX25hdGl2ZUNsYXNzSW5pdCgpOworICAgIH0KKworICAgIEJ1ZmZlciBfY29sb3JQb2ludGVyID0gbnVsbDsKKyAgICBCdWZmZXIgX25vcm1hbFBvaW50ZXIgPSBudWxsOworICAgIEJ1ZmZlciBfdGV4Q29vcmRQb2ludGVyID0gbnVsbDsKKyAgICBCdWZmZXIgX3ZlcnRleFBvaW50ZXIgPSBudWxsOworCisgICAgcHVibGljIEdMMTFJbXBsKCkgeworICAgIH0KKworCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0xDSGVhZGVyLmNwcCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTENIZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OTU2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0xDSGVhZGVyLmNwcApAQCAtMCwwICsxLDEyOSBAQAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKworI2luY2x1ZGUgPHByaXZhdGUvb3BlbmdsZXMvZ2xfY29udGV4dC5oPgorCisjZGVmaW5lIF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgXAorICAgICAgICAoOjphbmRyb2lkOjpPR0xFU19OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMpCisKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworCitzdGF0aWMgamNsYXNzIG5pb0FjY2Vzc0NsYXNzOworc3RhdGljIGpjbGFzcyBidWZmZXJDbGFzczsKK3N0YXRpYyBqY2xhc3MgT09NRUNsYXNzOworc3RhdGljIGpjbGFzcyBVT0VDbGFzczsKK3N0YXRpYyBqY2xhc3MgSUFFQ2xhc3M7CitzdGF0aWMgamNsYXNzIEFJT09CRUNsYXNzOworc3RhdGljIGptZXRob2RJRCBnZXRCYXNlUG9pbnRlcklEOworc3RhdGljIGptZXRob2RJRCBnZXRCYXNlQXJyYXlJRDsKK3N0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZUFycmF5T2Zmc2V0SUQ7CitzdGF0aWMgamZpZWxkSUQgcG9zaXRpb25JRDsKK3N0YXRpYyBqZmllbGRJRCBsaW1pdElEOworc3RhdGljIGpmaWVsZElEIGVsZW1lbnRTaXplU2hpZnRJRDsKKworLyogQ2FjaGUgbWV0aG9kIElEcyBlYWNoIHRpbWUgdGhlIGNsYXNzIGlzIGxvYWRlZC4gKi8KKwordm9pZAorbmF0aXZlQ2xhc3NJbml0QnVmZmVyKEpOSUVudiAqX2VudikKK3sKKyAgICBqY2xhc3MgbmlvQWNjZXNzQ2xhc3NMb2NhbCA9IF9lbnYtPkZpbmRDbGFzcygiamF2YS9uaW8vTklPQWNjZXNzIik7CisgICAgbmlvQWNjZXNzQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYobmlvQWNjZXNzQ2xhc3NMb2NhbCk7CisKKyAgICBqY2xhc3MgYnVmZmVyQ2xhc3NMb2NhbCA9IF9lbnYtPkZpbmRDbGFzcygiamF2YS9uaW8vQnVmZmVyIik7CisgICAgYnVmZmVyQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYoYnVmZmVyQ2xhc3NMb2NhbCk7CisKKyAgICBnZXRCYXNlUG9pbnRlcklEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQobmlvQWNjZXNzQ2xhc3MsCisgICAgICAgICAgICAiZ2V0QmFzZVBvaW50ZXIiLCAiKExqYXZhL25pby9CdWZmZXI7KUoiKTsKKyAgICBnZXRCYXNlQXJyYXlJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKG5pb0FjY2Vzc0NsYXNzLAorICAgICAgICAgICAgImdldEJhc2VBcnJheSIsICIoTGphdmEvbmlvL0J1ZmZlcjspTGphdmEvbGFuZy9PYmplY3Q7Iik7CisgICAgZ2V0QmFzZUFycmF5T2Zmc2V0SUQgPSBfZW52LT5HZXRTdGF0aWNNZXRob2RJRChuaW9BY2Nlc3NDbGFzcywKKyAgICAgICAgICAgICJnZXRCYXNlQXJyYXlPZmZzZXQiLCAiKExqYXZhL25pby9CdWZmZXI7KUkiKTsKKworICAgIHBvc2l0aW9uSUQgPSBfZW52LT5HZXRGaWVsZElEKGJ1ZmZlckNsYXNzLCAicG9zaXRpb24iLCAiSSIpOworICAgIGxpbWl0SUQgPSBfZW52LT5HZXRGaWVsZElEKGJ1ZmZlckNsYXNzLCAibGltaXQiLCAiSSIpOworICAgIGVsZW1lbnRTaXplU2hpZnRJRCA9CisgICAgICAgIF9lbnYtPkdldEZpZWxkSUQoYnVmZmVyQ2xhc3MsICJfZWxlbWVudFNpemVTaGlmdCIsICJJIik7Cit9CisKKworc3RhdGljIHZvaWQKK25hdGl2ZUNsYXNzSW5pdChKTklFbnYgKl9lbnYsIGpjbGFzcyBnbEltcGxDbGFzcykKK3sKKyAgICBuYXRpdmVDbGFzc0luaXRCdWZmZXIoX2Vudik7CisKKyAgICBqY2xhc3MgSUFFQ2xhc3NMb2NhbCA9CisgICAgICAgIF9lbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgIGpjbGFzcyBPT01FQ2xhc3NMb2NhbCA9CisgICAgICAgICBfZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yIik7CisgICAgamNsYXNzIFVPRUNsYXNzTG9jYWwgPQorICAgICAgICAgX2Vudi0+RmluZENsYXNzKCJqYXZhL2xhbmcvVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iKTsKKyAgICBqY2xhc3MgQUlPT0JFQ2xhc3NMb2NhbCA9CisgICAgICAgICBfZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKKworICAgIElBRUNsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKElBRUNsYXNzTG9jYWwpOworICAgIE9PTUVDbGFzcyA9IChqY2xhc3MpIF9lbnYtPk5ld0dsb2JhbFJlZihPT01FQ2xhc3NMb2NhbCk7CisgICAgVU9FQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYoVU9FQ2xhc3NMb2NhbCk7CisgICAgQUlPT0JFQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYoQUlPT0JFQ2xhc3NMb2NhbCk7Cit9CisKK3N0YXRpYyB2b2lkICoKK2dldFBvaW50ZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IGJ1ZmZlciwgamFycmF5ICphcnJheSwgamludCAqcmVtYWluaW5nKQoreworICAgIGppbnQgcG9zaXRpb247CisgICAgamludCBsaW1pdDsKKyAgICBqaW50IGVsZW1lbnRTaXplU2hpZnQ7CisgICAgamxvbmcgcG9pbnRlcjsKKyAgICBqaW50IG9mZnNldDsKKyAgICB2b2lkICpkYXRhOworCisgICAgcG9zaXRpb24gPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIHBvc2l0aW9uSUQpOworICAgIGxpbWl0ID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBsaW1pdElEKTsKKyAgICBlbGVtZW50U2l6ZVNoaWZ0ID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBlbGVtZW50U2l6ZVNoaWZ0SUQpOworICAgICpyZW1haW5pbmcgPSAobGltaXQgLSBwb3NpdGlvbikgPDwgZWxlbWVudFNpemVTaGlmdDsKKyAgICBwb2ludGVyID0gX2Vudi0+Q2FsbFN0YXRpY0xvbmdNZXRob2QobmlvQWNjZXNzQ2xhc3MsCisgICAgICAgICAgICBnZXRCYXNlUG9pbnRlcklELCBidWZmZXIpOworICAgIGlmIChwb2ludGVyICE9IDBMKSB7CisgICAgICAgICphcnJheSA9IE5VTEw7CisgICAgICAgIHJldHVybiAodm9pZCAqKSAoamludCkgcG9pbnRlcjsKKyAgICB9CisgICAgCisgICAgKmFycmF5ID0gKGphcnJheSkgX2Vudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChuaW9BY2Nlc3NDbGFzcywKKyAgICAgICAgICAgIGdldEJhc2VBcnJheUlELCBidWZmZXIpOworICAgIG9mZnNldCA9IF9lbnYtPkNhbGxTdGF0aWNJbnRNZXRob2QobmlvQWNjZXNzQ2xhc3MsCisgICAgICAgICAgICBnZXRCYXNlQXJyYXlPZmZzZXRJRCwgYnVmZmVyKTsKKyAgICBkYXRhID0gX2Vudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbCgqYXJyYXksIChqYm9vbGVhbiAqKSAwKTsKKyAgICAKKyAgICByZXR1cm4gKHZvaWQgKikgKChjaGFyICopIGRhdGEgKyBvZmZzZXQpOworfQorCisKK3N0YXRpYyB2b2lkCityZWxlYXNlUG9pbnRlcihKTklFbnYgKl9lbnYsIGphcnJheSBhcnJheSwgdm9pZCAqZGF0YSwgamJvb2xlYW4gY29tbWl0KQoreworICAgIF9lbnYtPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGFycmF5LCBkYXRhLAorCQkJCQkgICBjb21taXQgPyAwIDogSk5JX0FCT1JUKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMSGVhZGVyLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0xIZWFkZXIuamF2YS1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjc4ZjNkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMSGVhZGVyLmphdmEtaWYKQEAgLTAsMCArMSwyMiBAQAorLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMLmphdmEKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOworCitwdWJsaWMgaW50ZXJmYWNlIEdMIHsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMSW1wbEhlYWRlci5qYXZhLWltcGwgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0xJbXBsSGVhZGVyLmphdmEtaW1wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjNhNDFjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMSW1wbEhlYWRlci5qYXZhLWltcGwKQEAgLTAsMCArMSw0OCBAQAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQuZ2xlc19qbmk7CisKK2ltcG9ydCBqYXZhLm5pby5CdWZmZXI7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwRXh0OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTE7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMUV4dDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDExRXh0ZW5zaW9uUGFjazsKKworcHVibGljIGNsYXNzIEdMSW1wbCBpbXBsZW1lbnRzIEdMMTAsIEdMMTBFeHQsIEdMMTEsIEdMMTFFeHQsIEdMMTFFeHRlbnNpb25QYWNrIHsKKworICAgIC8vIFByaXZhdGUgYWNjZXNzb3JzIGZvciBuYXRpdmUgY29kZQorCisgICAgbmF0aXZlIHByaXZhdGUgc3RhdGljIHZvaWQgX25hdGl2ZUNsYXNzSW5pdCgpOworICAgIHN0YXRpYyB7CisJX25hdGl2ZUNsYXNzSW5pdCgpOworICAgIH0KKworICAgIEJ1ZmZlciBfY29sb3JQb2ludGVyID0gbnVsbDsKKyAgICBCdWZmZXIgX25vcm1hbFBvaW50ZXIgPSBudWxsOworICAgIEJ1ZmZlciBfdGV4Q29vcmRQb2ludGVyID0gbnVsbDsKKyAgICBCdWZmZXIgX3ZlcnRleFBvaW50ZXIgPSBudWxsOworCisgICAgcHVibGljIEdMSW1wbCgpIHsKKyAgICB9CisKKyAgICAgcHVibGljIHZvaWQgZ2xHZXRQb2ludGVydihpbnQgcG5hbWUsIGphdmEubmlvLkJ1ZmZlcltdIHBhcmFtcykgeworICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJnbEdldFBvaW50ZXJ2Iik7CisgICAgIH0KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmNwcCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlMTI5NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5jcHAKQEAgLTAsMCArMSwxMCBAQAorI2luY2x1ZGUgPHN0cmluZy5oPg0KKw0KKy8qIGNvbnN0IEdMdWJ5dGUgKiBnbEdldFN0cmluZyAoIEdMZW51bSBuYW1lICkgKi8NCitqc3RyaW5nDQorYW5kcm9pZF9nbEdldFN0cmluZw0KKyAgKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBuYW1lKSB7DQorICAgIGNvbnN0IGNoYXIgKiBjaGFycyA9IChjb25zdCBjaGFyICopZ2xHZXRTdHJpbmcoKEdMZW51bSluYW1lKTsNCisgICAganN0cmluZyBvdXRwdXQgPSBfZW52LT5OZXdTdHJpbmdVVEYoY2hhcnMpOw0KKyAgICByZXR1cm4gb3V0cHV0Ow0KK30NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuamF2YS0xMC1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5qYXZhLTEwLWlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OGZhYmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuamF2YS0xMC1pZgpAQCAtMCwwICsxLDQgQEAKKyAgICBwdWJsaWMgU3RyaW5nIGdsR2V0U3RyaW5nKA0KKyAgICAgICAgaW50IG5hbWUNCisgICAgKTsNCisNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5qYXZhLWlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OGZhYmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuamF2YS1pZgpAQCAtMCwwICsxLDQgQEAKKyAgICBwdWJsaWMgU3RyaW5nIGdsR2V0U3RyaW5nKA0KKyAgICAgICAgaW50IG5hbWUNCisgICAgKTsNCisNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuamF2YS1pbXBsIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtaW1wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzc4ODFjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtaW1wbApAQCAtMCwwICsxLDE2IEBACisgICAgLy8gQyBmdW5jdGlvbiBjb25zdCBHTHVieXRlICogZ2xHZXRTdHJpbmcgKCBHTGVudW0gbmFtZSApDQorDQorICAgIHB1YmxpYyBuYXRpdmUgU3RyaW5nIF9nbEdldFN0cmluZygNCisgICAgICAgIGludCBuYW1lDQorICAgICk7DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2xHZXRTdHJpbmcoDQorICAgICAgICBpbnQgbmFtZQ0KKyAgICApIHsNCisgICAgICAgIFN0cmluZyByZXR1cm5WYWx1ZTsNCisgICAgICAgIHJldHVyblZhbHVlID0gX2dsR2V0U3RyaW5nKA0KKyAgICAgICAgICAgIG5hbWUNCisgICAgICAgICk7DQorICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7DQorICAgIH0NCisNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcubmF0aXZlUmVnIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLm5hdGl2ZVJlZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjQxODdjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLm5hdGl2ZVJlZwpAQCAtMCwwICsxIEBACit7Il9nbEdldFN0cmluZyIsICIoSSlMamF2YS9sYW5nL1N0cmluZzsiLCAodm9pZCAqKSBhbmRyb2lkX2dsR2V0U3RyaW5nIH0sDQo=