LyorKw0KDQpDb3B5cmlnaHQgKGMpIDIwMDYsIEludGVsIENvcnBvcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAgICAgICAgICAgICAgICANCmFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZSAgICAgICAgIA0Kd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdCAgICAgICAgDQpodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAgICAgICAgICAgDQpXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELiAgICAgICAgICAgICANCg0KTW9kdWxlIE5hbWU6DQoNCiAgRHhlTWFpbi5oDQoNCkFic3RyYWN0Og0KDQpSZXZpc2lvbiBIaXN0b3J5DQoNCi0tKi8NCg0KI2lmbmRlZiBfRFhFX01BSU5fSF8NCiNkZWZpbmUgX0RYRV9NQUlOX0hfDQoNCg0KI2luY2x1ZGUgIkRlYnVnSW1hZ2VJbmZvLmgiDQojaW5jbHVkZSAiTGlicmFyeS5oIg0KI2luY2x1ZGUgIkZ3Vm9sQmxvY2suaCINCiNpbmNsdWRlICJGd1ZvbERyaXZlci5oIg0KI2luY2x1ZGUgImdjZC5oIg0KI2luY2x1ZGUgImltZW0uaCINCiNpbmNsdWRlICJJbWFnZS5oIg0KI2luY2x1ZGUgIkV4ZWMuaCINCiNpbmNsdWRlICJoYW5kLmgiDQoNCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICpQcm90b2NvbEd1aWQ7DQogIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAqKlByb3RvY29sOw0KICBFRklfRVZFTlQgICAgICAgICAgICAgICAgICAgRXZlbnQ7DQogIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAqUmVnaXN0cmF0aW9uOw0KICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgUHJlc2VudDsNCn0gQVJDSElURUNUVVJBTF9QUk9UT0NPTF9FTlRSWTsNCg0KDQovLw0KLy8gRFhFIERpc3BhdGNoZXIgRGF0YSBzdHJ1Y3R1cmVzDQovLw0KDQojZGVmaW5lIEtOT1dOX0hBTkRMRV9TSUdOQVRVUkUgIEVGSV9TSUdOQVRVUkVfMzIoJ2snLCduJywnbycsJ3cnKQ0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBVSU5UTiAgICAgICAgICAgU2lnbmF0dXJlOw0KICBMSVNUX0VOVFJZICAgICAgTGluazsgICAgICAgICAvLyBtRnZIYW5kbGVMaXN0ICAgICAgICAgICANCiAgRUZJX0hBTkRMRSAgICAgIEhhbmRsZTsNCn0gS05PV05fSEFORExFOw0KDQoNCiNkZWZpbmUgRUZJX0NPUkVfRFJJVkVSX0VOVFJZX1NJR05BVFVSRSBFRklfU0lHTkFUVVJFXzMyKCdkJywncicsJ3YnLCdyJykNCnR5cGVkZWYgc3RydWN0IHsNCiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmU7DQogIExJU1RfRU5UUlkgICAgICAgICAgICAgICAgICAgICAgTGluazsgICAgICAgICAgICAgLy8gbURyaXZlckxpc3QNCg0KICBMSVNUX0VOVFJZICAgICAgICAgICAgICAgICAgICAgIFNjaGVkdWxlZExpbms7ICAgIC8vIG1TY2hlZHVsZWRRdWV1ZQ0KDQogIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgRnZIYW5kbGU7DQogIEVGSV9HVUlEICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU5hbWU7DQogIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAgKkZ2RmlsZURldmljZVBhdGg7DQogIEVGSV9GSVJNV0FSRV9WT0xVTUVfUFJPVE9DT0wgICAgKkZ2Ow0KDQogIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkRlcGV4Ow0KICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGV4U2l6ZTsNCg0KICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIEJlZm9yZTsNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBBZnRlcjsNCiAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICAgICBCZWZvcmVBZnRlckd1aWQ7DQoNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRlbnQ7DQogIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXF1ZXN0ZWQ7DQogIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgU2NoZWR1bGVkOw0KICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIFVudHJ1c3RlZDsNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBJbml0aWFsaXplZDsNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBEZXBleFByb3RvY29sRXJyb3I7DQoNCiAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICBJbWFnZUhhbmRsZTsNCg0KfSBFRklfQ09SRV9EUklWRVJfRU5UUlk7DQoNCi8vDQovL1RoZSBkYXRhIHN0cnVjdHVyZSBvZiBHQ0QgbWVtb3J5IG1hcCBlbnRyeQ0KLy8NCiNkZWZpbmUgRUZJX0dDRF9NQVBfU0lHTkFUVVJFICBFRklfU0lHTkFUVVJFXzMyKCdnJywnYycsJ2QnLCdtJykNCnR5cGVkZWYgc3RydWN0IHsNCiAgVUlOVE4gICAgICAgICAgICAgICAgIFNpZ25hdHVyZTsNCiAgTElTVF9FTlRSWSAgICAgICAgICAgIExpbms7DQogIEVGSV9QSFlTSUNBTF9BRERSRVNTICBCYXNlQWRkcmVzczsNCiAgVUlOVDY0ICAgICAgICAgICAgICAgIEVuZEFkZHJlc3M7DQogIFVJTlQ2NCAgICAgICAgICAgICAgICBDYXBhYmlsaXRpZXM7DQogIFVJTlQ2NCAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzOw0KICBFRklfR0NEX01FTU9SWV9UWVBFICAgR2NkTWVtb3J5VHlwZTsNCiAgRUZJX0dDRF9JT19UWVBFICAgICAgIEdjZElvVHlwZTsNCiAgRUZJX0hBTkRMRSAgICAgICAgICAgIEltYWdlSGFuZGxlOw0KICBFRklfSEFORExFICAgICAgICAgICAgRGV2aWNlSGFuZGxlOw0KfSBFRklfR0NEX01BUF9FTlRSWTsNCg0KLy8NCi8vIERYRSBDb3JlIEdsb2JhbCBWYXJpYWJsZXMNCi8vDQpleHRlcm4gRUZJX1NZU1RFTV9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAqZ1NUOw0KZXh0ZXJuIEVGSV9CT09UX1NFUlZJQ0VTICAgICAgICAgICAgICAgICAgICAgICAgKmdCUzsNCmV4dGVybiBFRklfUlVOVElNRV9TRVJWSUNFUyAgICAgICAgICAgICAgICAgICAgICpnUlQ7DQpleHRlcm4gRUZJX0RYRV9TRVJWSUNFUyAgICAgICAgICAgICAgICAgICAgICAgICAqZ0RTOw0KZXh0ZXJuIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0R4ZUNvcmVJbWFnZUhhbmRsZTsNCg0KZXh0ZXJuIEVGSV9ERUNPTVBSRVNTX1BST1RPQ09MICAgICAgICAgICAgICAgICAgZ0VmaURlY29tcHJlc3M7DQpleHRlcm4gRUZJX1BFSV9QRV9DT0ZGX0xPQURFUl9QUk9UT0NPTCAgICAgICAgICAqZ0VmaVBlaVBlQ29mZkxvYWRlcjsNCg0KZXh0ZXJuIEVGSV9SVU5USU1FX0FSQ0hfUFJPVE9DT0wgICAgICAgICAgICAgICAgKmdSdW50aW1lOw0KZXh0ZXJuIEVGSV9DUFVfQVJDSF9QUk9UT0NPTCAgICAgICAgICAgICAgICAgICAgKmdDcHU7DQpleHRlcm4gRUZJX1dBVENIRE9HX1RJTUVSX0FSQ0hfUFJPVE9DT0wgICAgICAgICAqZ1dhdGNoZG9nVGltZXI7DQpleHRlcm4gRUZJX01FVFJPTk9NRV9BUkNIX1BST1RPQ09MICAgICAgICAgICAgICAqZ01ldHJvbm9tZTsNCmV4dGVybiBFRklfVElNRVJfQVJDSF9QUk9UT0NPTCAgICAgICAgICAgICAgICAgICpnVGltZXI7DQpleHRlcm4gRUZJX1NFQ1VSSVRZX0FSQ0hfUFJPVE9DT0wgICAgICAgICAgICAgICAqZ1NlY3VyaXR5Ow0KZXh0ZXJuIEVGSV9CRFNfQVJDSF9QUk9UT0NPTCAgICAgICAgICAgICAgICAgICAgKmdCZHM7DQpleHRlcm4gRUZJX1NUQVRVU19DT0RFX1BST1RPQ09MICAgICAgICAgICAgICAgICAqZ1N0YXR1c0NvZGU7DQoNCmV4dGVybiBFRklfVFBMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdFZmlDdXJyZW50VHBsOw0KDQpleHRlcm4gRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZ0R4ZUNvcmVGaWxlTmFtZTsNCmV4dGVybiBFRklfTE9BREVEX0lNQUdFX1BST1RPQ09MICAgICAgICAgICAgICAgICpnRHhlQ29yZUxvYWRlZEltYWdlOw0KDQpleHRlcm4gRUZJX01FTU9SWV9UWVBFX0lORk9STUFUSU9OICAgICAgICAgICAgICBnTWVtb3J5VHlwZUluZm9ybWF0aW9uW0VmaU1heE1lbW9yeVR5cGUgKyAxXTsNCg0KZXh0ZXJuIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0Rpc3BhdGNoZXJSdW5uaW5nOw0KDQovLw0KLy8gU2VydmljZSBJbml0aWFsaXphdGlvbiBGdW5jdGlvbnMNCi8vDQoNCg0KVk9JRA0KQ29yZUluaXRpYWxpemVQb29sICgNCiAgVk9JRA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgQ2FsbGVkIHRvIGluaXRpYWxpemUgdGhlIHBvb2wuDQoNCkFyZ3VtZW50czoNCg0KICBOb25lDQoNClJldHVybnM6DQoNCiAgTm9uZQ0KDQotLSovDQo7DQoNClZPSUQNCkNvcmVBZGRNZW1vcnlEZXNjcmlwdG9yICgNCiAgSU4gRUZJX01FTU9SWV9UWVBFICAgICAgIFR5cGUsDQogIElOIEVGSV9QSFlTSUNBTF9BRERSRVNTICBTdGFydCwNCiAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgIE51bWJlck9mUGFnZXMsDQogIElOIFVJTlQ2NCAgICAgICAgICAgICAgICBBdHRyaWJ1dGUNCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIENhbGxlZCB0byBpbml0aWFsaXplIHRoZSBtZW1vcnkgbWFwIGFuZCBhZGQgZGVzY3JpcHRvcnMgdG8NCiAgdGhlIGN1cnJlbnQgZGVzY3JpcHRvciBsaXN0Lg0KDQogICAgICAgVGhlIGZpcnN0IGRlc2NyaXB0b3IgdGhhdCBpcyBhZGRlZCBtdXN0IGJlIGdlbmVyYWwgdXNhYmxlDQogIG1lbW9yeSBhcyB0aGUgYWRkaXRpb24gYWxsb2NhdGVzIGhlYXAuDQoNCkFyZ3VtZW50czoNCg0KICBUeXBlICAgICAgICAgIC0gVGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFkZA0KDQogIFN0YXJ0ICAgICAgICAgLSBUaGUgc3RhcnRpbmcgYWRkcmVzcyBpbiB0aGUgbWVtb3J5IHJhbmdlDQogICAgICAgICAgICAgICAgICBNdXN0IGJlIHBhZ2UgYWxpZ25lZA0KDQogIE51bWJlck9mUGFnZXMgLSBUaGUgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSByYW5nZQ0KDQogIEF0dHJpYnV0ZSAgICAgLSBBdHRyaWJ1dGVzIG9mIHRoZSBtZW1vcnkgdG8gYWRkDQoNClJldHVybnM6DQoNCiAgTm9uZS4gIFRoZSByYW5nZSBpcyBhZGRlZCB0byB0aGUgbWVtb3J5IG1hcA0KDQotLSovDQo7DQoNClZPSUQNCkNvcmVSZWxlYXNlR2NkTWVtb3J5TG9jayAoDQogIFZPSUQNCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KICAgIFJlbGVhc2UgbWVtb3J5IGxvY2sgb24gbUdjZE1lbW9yeVNwYWNlTG9jaw0KDQpBcmd1bWVudHM6DQogICAgTm9uZQ0KDQpSZXR1cm5zOg0KICAgIE5vbmUNCg0KLS0qLw0KOw0KDQpWT0lEDQpDb3JlQWNxdWlyZUdjZE1lbW9yeUxvY2sgKA0KICBWT0lEDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCiAgICBBY3F1aXJlIG1lbW9yeSBsb2NrIG9uIG1HY2RNZW1vcnlTcGFjZUxvY2sNCg0KQXJndW1lbnRzOg0KICAgIE5vbmUNCg0KUmV0dXJuczoNCiAgICBOb25lDQoNCi0tKi8NCjsNCg0KRUZJX1NUQVRVUw0KQ29yZUluaXRpYWxpemVNZW1vcnlTZXJ2aWNlcyAoDQogIElOIFZPSUQgICAgICAgICAgICAgICAgICAqKkhvYlN0YXJ0LA0KICBJTiBFRklfUEhZU0lDQUxfQUREUkVTUyAgKk1lbW9yeUJhc2VBZGRyZXNzLA0KICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgKk1lbW9yeUxlbmd0aA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgRXh0ZXJuYWwgZnVuY3Rpb24uIEluaXRpYWxpemVzIHRoZSBHQ0QgYW5kIG1lbW9yeSBzZXJ2aWNlcyBiYXNlZCBvbiB0aGUgbWVtb3J5IA0KICBkZXNjcmlwdG9yIEhPQnMuICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBwcmltaW5nIHRoZSBHQ0QgbWFwIGFuZCB0aGUNCiAgbWVtb3J5IG1hcCwgc28gbWVtb3J5IGFsbG9jYXRpb25zIGFuZCByZXNvdXJjZSBhbGxvY2F0aW9ucyBjYW4gYmUgbWFkZS4gIFRoZSBmaXJzdA0KICBwYXJ0IG9mIHRoaXMgZnVuY3Rpb24gY2FuIG5vdCBkZXBlbmQgb24gYW55IG1lbW9yeSBzZXJ2aWNlcyB1bnRpbCBhdCBsZWFzdCBvbmUNCiAgbWVtb3J5IGRlc2NyaXB0b3IgaXMgcHJvdmlkZWQgdG8gdGhlIG1lbW9yeSBzZXJ2aWNlcy4gIFRoZW4gdGhlIG1lbW9yeSBzZXJ2aWNlcw0KICBjYW4gYmUgdXNlZCB0byBpbnRpYWxpemUgdGhlIEdDRCBtYXAuDQoNCkFyZ3VtZW50czoNCg0KICBIb2JTdGFydCAtIFRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBIT0IuDQogIA0KICBNZW1vcnlCYXNlQWRkcmVzcyAgIC0gU3RhcnQgYWRkcmVzcyBvZiBtZW1vcnkgcmVnaW9uIGZvdW5kIHRvIGluaXQgRFhFIGNvcmUuDQogIA0KICBNZW1vcnlMZW5ndGggICAgICAgIC0gTGVuZ3RoIG9mIG1lbW9yeSByZWdpb24gZm91bmQgdG8gaW5pdCBEWEUgY29yZS4NCg0KUmV0dXJuczoNCg0KICBFRklfU1VDQ0VTUyAgICAgICAgIC0gTWVtb3J5IHNlcnZpY2VzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZC4NCg0KLS0qLw0KOw0KDQoNCkVGSV9TVEFUVVMNCkNvcmVJbml0aWFsaXplR2NkU2VydmljZXMgKA0KICBJTiBWT0lEICAgICAgICAgICAgICAgICAgKipIb2JTdGFydCwNCiAgSU4gRUZJX1BIWVNJQ0FMX0FERFJFU1MgIE1lbW9yeUJhc2VBZGRyZXNzLA0KICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgTWVtb3J5TGVuZ3RoDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBFeHRlcm5hbCBmdW5jdGlvbi4gSW5pdGlhbGl6ZXMgdGhlIEdDRCBhbmQgbWVtb3J5IHNlcnZpY2VzIGJhc2VkIG9uIHRoZSBtZW1vcnkgDQogIGRlc2NyaXB0b3IgSE9Ccy4gIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHByaW1pbmcgdGhlIEdDRCBtYXAgYW5kIHRoZQ0KICBtZW1vcnkgbWFwLCBzbyBtZW1vcnkgYWxsb2NhdGlvbnMgYW5kIHJlc291cmNlIGFsbG9jYXRpb25zIGNhbiBiZSBtYWRlLiAgVGhlIGZpcnN0DQogIHBhcnQgb2YgdGhpcyBmdW5jdGlvbiBjYW4gbm90IGRlcGVuZCBvbiBhbnkgbWVtb3J5IHNlcnZpY2VzIHVudGlsIGF0IGxlYXN0IG9uZQ0KICBtZW1vcnkgZGVzY3JpcHRvciBpcyBwcm92aWRlZCB0byB0aGUgbWVtb3J5IHNlcnZpY2VzLiAgVGhlbiB0aGUgbWVtb3J5IHNlcnZpY2VzDQogIGNhbiBiZSB1c2VkIHRvIGludGlhbGl6ZSB0aGUgR0NEIG1hcC4NCg0KQXJndW1lbnRzOg0KDQogIEhvYlN0YXJ0IC0gVGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIEhPQg0KICANCiAgTWVtb3J5QmFzZUFkZHJlc3MgICAtIFN0YXJ0IGFkZHJlc3Mgb2YgbWVtb3J5IHJlZ2lvbiBmb3VuZCB0byBpbml0IERYRSBjb3JlLg0KICANCiAgTWVtb3J5TGVuZ3RoICAgICAgICAtIExlbmd0aCBvZiBtZW1vcnkgcmVnaW9uIGZvdW5kIHRvIGluaXQgRFhFIGNvcmUuDQoNCg0KUmV0dXJuczoNCg0KICBFRklfU1VDQ0VTUyAgICAgICAgIC0gR0NEIHNlcnZpY2VzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZC4NCg0KLS0qLw0KOw0KDQpFRklfU1RBVFVTDQpDb3JlSW5pdGlhbGl6ZUV2ZW50U2VydmljZXMgKA0KICBWT0lEDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBJbml0aWFsaXplcyAiZXZlbnQiIHN1cHBvcnQgYW5kIHBvcHVsYXRlcyBwYXJ0cyBvZiB0aGUgU3lzdGVtIGFuZCBSdW50aW1lIFRhYmxlLg0KDQpBcmd1bWVudHM6DQoNCiAgTm9uZQ0KICAgIA0KUmV0dXJuczoNCg0KICBFRklfU1VDQ0VTUyAtIEFsd2F5cyByZXR1cm4gc3VjY2Vzcw0KDQotLSovDQo7DQoNCkVGSV9TVEFUVVMNCkNvcmVTaHV0ZG93bkV2ZW50U2VydmljZXMgKA0KICBWT0lEDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBSZWdpc3RlciBhbGwgcnVudGltZSBldmVudHMgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHN0aWxsIGF2YWlsYWJsZSBhZnRlciBFeGl0Qm9vdFNlcnZpY2UuDQoNCkFyZ3VtZW50czoNCg0KICBOb25lDQogICAgDQpSZXR1cm5zOg0KDQogIEVGSV9TVUNDRVNTIC0gQWx3YXlzIHJldHVybiBzdWNjZXNzDQoNCi0tKi8NCjsNCg0KRUZJX1NUQVRVUw0KQ29yZUluaXRpYWxpemVJbWFnZVNlcnZpY2VzICgNCiAgSU4gIFZPSUQgKkhvYlN0YXJ0DQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBBZGQgdGhlIEltYWdlIFNlcnZpY2VzIHRvIEVGSSBCb290IFNlcnZpY2VzIFRhYmxlIGFuZCBpbnN0YWxsIHRoZSBwcm90b2NvbA0KICBpbnRlcmZhY2VzIGZvciB0aGlzIGltYWdlLg0KDQpBcmd1bWVudHM6DQoNCiAgSG9iU3RhcnQgICAgICAgIC0gVGhlIEhPQiB0byBpbml0aWFsaXplDQoNClJldHVybnM6DQoNCiAgU3RhdHVzIGNvZGUuDQoNCi0tKi8NCjsNCg0KRUZJX1NUQVRVUw0KQ29yZVNodXRkb3duSW1hZ2VTZXJ2aWNlcyAoDQogIFZPSUQNCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIFRyYW5zZmVyIGNvbnRyb2wgb2YgcnVudGltZSBpbWFnZXMgdG8gcnVudGltZSBzZXJ2aWNlDQoNCkFyZ3VtZW50czoNCg0KICBOb25lDQoNClJldHVybnM6DQoNCiAgRUZJX1NVQ0NFU1MgICAgICAgLSBGdW5jdGlvbiBzdWNjZXNzZnVsbHkgcmV0dXJuZWQNCg0KLS0qLw0KOw0KDQpWT0lEDQpDb3JlTm90aWZ5T25BcmNoUHJvdG9jb2xJbnN0YWxsYXRpb24gKA0KICBWT0lEDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCiAgQ3JlYXRlcyBhbiBldmVudCB0aGF0IGlzIGZpcmVkIGV2ZXJ5dGltZSBhIFByb3RvY29sIG9mIGEgc3BlY2lmaWMgdHlwZSBpcyBpbnN0YWxsZWQNCg0KQXJndW1lbnRzOg0KICBOT05FDQoNClJldHVybnM6DQogIE5PTkUNCg0KLS0qLw0KOw0KDQpFRklfU1RBVFVTDQpDb3JlQWxsRWZpU2VydmljZXNBdmFpbGFibGUgKA0KICBWT0lEDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCiAgUmV0dXJuIFRSVUUgaWYgYWxsIEFQIHNlcnZpY2VzIGFyZSBhdmFpbGlibGUuDQoNCkFyZ3VtZW50czoNCiAgTk9ORQ0KDQpSZXR1cm5zOg0KICBFRklfU1VDQ0VTUyAgIC0gQWxsIEFQIHNlcnZpY2VzIGFyZSBhdmFpbGFibGUNCiAgRUZJX05PVF9GT1VORCAtIEF0IGxlYXN0IG9uZSBBUCBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUgDQoNCi0tKi8NCjsNCg0KVk9JRA0KQ2FsY3VsYXRlRWZpSGRyQ3JjICgNCiAgSU4gIE9VVCBFRklfVEFCTEVfSEVBREVSICAgICpIZHINCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIENhbGN1YWx0ZSB0aGUgMzItYml0IENSQyBpbiBhIEVGSSB0YWJsZSB1c2luZyB0aGUgc2VydmljZSBwcm92aWRlZCBieSB0aGUNCiAgZ1J1bnRpbWUgc2VydmljZS4NCg0KQXJndW1lbnRzOg0KDQogIEhkciAgLSBQb2ludGVyIHRvIGFuIEVGSSBzdGFuZGFyZCBoZWFkZXINCg0KUmV0dXJuczoNCg0KICBOb25lDQoNCi0tKi8NCjsNCg0KVk9JRA0KRUZJQVBJDQpDb3JlVGltZXJUaWNrICgNCiAgSU4gVUlOVDY0ICAgICBEdXJhdGlvbg0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgQ2FsbGVkIGJ5IHRoZSBwbGF0Zm9ybSBjb2RlIHRvIHByb2Nlc3MgYSB0aWNrLg0KDQpBcmd1bWVudHM6DQoNCiAgRHVyYXRpb24gICAgLSBUaGUgbnVtYmVyIG9mIDEwMG5zIGVsYXNwZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byBUaW1lclRpY2sNCiAgICANClJldHVybnM6DQoNCiAgTm9uZQ0KDQotLSovDQo7DQoNClZPSUQNCkNvcmVJbml0aWFsaXplRGlzcGF0Y2hlciAoDQogIFZPSUQNCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIEluaXRpYWxpemUgdGhlIGRpc3BhdGNoZXIuIEluaXRpYWxpemUgdGhlIG5vdGlmaWNhdGlvbiBmdW5jdGlvbiB0aGF0IHJ1bnMgd2hlbg0KICBhIEZWIHByb3RvY29sIGlzIGFkZGVkIHRvIHRoZSBzeXN0ZW0uDQoNCkFyZ3VtZW50czoNCg0KICBOT05FDQoNClJldHVybnM6DQoNCiAgTk9ORSANCg0KLS0qLw0KOw0KDQpCT09MRUFODQpDb3JlSXNTY2hlZHVsYWJsZSAoDQogIElOICBFRklfQ09SRV9EUklWRVJfRU5UUlkgICAqRHJpdmVyRW50cnkgIA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgVGhpcyBpcyB0aGUgUE9TVEZJWCB2ZXJzaW9uIG9mIHRoZSBkZXBlbmRlbmN5IGV2YWx1YXRvci4gIFRoaXMgY29kZSBkb2VzIA0KICBub3QgbmVlZCB0byBoYW5kbGUgQmVmb3JlIG9yIEFmdGVyLCBhcyBpdCBpcyBub3QgdmFsaWQgdG8gY2FsbCB0aGlzIA0KICByb3V0aW5lIGluIHRoaXMgY2FzZS4gVGhlIFNPUiBpcyBqdXN0IGlnbm9yZWQgYW5kIGlzIGEgbm9wIGluIHRoZSBncmFtbWVyLg0KDQogIFBPU1RGSVggbWVhbnMgYWxsIHRoZSBtYXRoIGlzIGRvbmUgb24gdG9wIG9mIHRoZSBzdGFjay4NCg0KQXJndW1lbnRzOg0KDQogIERyaXZlckVudHJ5IC0gRHJpdmVyRW50cnkgZWxlbWVudCB0byB1cGRhdGUNCiAgDQpSZXR1cm5zOg0KDQogIFRSVUUgLSBJZiBkcml2ZXIgaXMgcmVhZHkgdG8gcnVuLg0KDQogIEZBTFNFIC0gSWYgZHJpdmVyIGlzIG5vdCByZWFkeSB0byBydW4gb3Igc29tZSBmYXRhbCBlcnJvciB3YXMgZm91bmQuDQoNCi0tKi8NCjsNCg0KRUZJX1NUQVRVUw0KQ29yZVByZVByb2Nlc3NEZXBleCAoDQogIElOICBFRklfQ09SRV9EUklWRVJfRU5UUlkgICAqRHJpdmVyRW50cnkgIA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgUHJlcHJvY2VzcyBkZXBlbmRlbmN5IGV4cHJlc3Npb24gYW5kIHVwZGF0ZSBEcml2ZXJFbnRyeSB0byByZWZsZWN0IHRoZQ0KICBzdGF0ZSBvZiAgQmVmb3JlLCBBZnRlciwgYW5kIFNPUiBkZXBlbmRlbmNpZXMuIElmIERyaXZlckVudHJ5LT5CZWZvcmUNCiAgb3IgRHJpdmVyRW50cnktPkFmdGVyIGlzIHNldCBpdCB3aWxsIG5ldmVyIGJlIGNsZWFyZWQuIElmIFNPUiBpcyBzZXQNCiAgaXQgd2lsbCBiZSBjbGVhcmVkIGJ5IENvcmVTY2hlZHVsZSgpLCBhbmQgdGhlbiB0aGUgZHJpdmVyIGNhbiBiZSANCiAgZGlzcGF0Y2hlZC4NCg0KQXJndW1lbnRzOg0KDQogIERyaXZlckVudHJ5IC0gRHJpdmVyRW50cnkgZWxlbWVudCB0byB1cGRhdGUNCg0KUmV0dXJuczoNCg0KICBFRklfU1VDQ0VTUyAtIEl0IGFsd2F5cyB3b3Jrcy4NCg0KLS0qLw0KOw0KDQoNCkVGSV9TVEFUVVMNCkVGSUFQSQ0KQ29yZUV4aXRCb290U2VydmljZXMgKA0KICBJTiBFRklfSEFORExFICAgSW1hZ2VIYW5kbGUsDQogIElOIFVJTlROICAgICAgICBNYXBLZXkNCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIEVGSSAxLjAgQVBJIHRvIHRlcm1pbmF0ZSBCb290IFNlcnZpY2VzDQoNCkFyZ3VtZW50czoNCg0KICBJbWFnZUhhbmRsZSAtIEhhbmRsZSB0aGF0IHJlcHJlc2VudHMgdGhlIGlkZW50aXR5IG9mIHRoZSBjYWxsaW5nIGltYWdlDQoNCiAgTWFwS2V5ICAgICAgLUtleSB0byB0aGUgbGF0ZXN0IG1lbW9yeSBtYXAuDQoNClJldHVybnM6DQoNCiAgRUZJX1NVQ0NFU1MgLSBCb290IFNlcnZpY2VzIHRlcm1pbmF0ZWQNCiAgRUZJX0lOVkFMSURfUEFSQU1FVEVSIC0gTWFwS2V5IGlzIGluY29ycmVjdC4NCg0KLS0qLw0KOw0KDQpFRklfU1RBVFVTDQpDb3JlVGVybWluYXRlTWVtb3J5TWFwICgNCiAgSU4gVUlOVE4gICAgICAgIE1hcEtleQ0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgTWFrZSBzdXJlIHRoZSBtZW1vcnkgbWFwIGlzIGZvbGxvd2luZyBhbGwgdGhlIGNvbnN0cnVjdGlvbiBydWxlcywgDQogIGl0IGlzIHRoZSBsYXN0IHRpbWUgdG8gY2hlY2sgbWVtb3J5IG1hcCBlcnJvciBiZWZvcmUgZXhpdCBib290IHNlcnZpY2VzLg0KDQpBcmd1bWVudHM6DQoNCiAgTWFwS2V5ICAgICAgICAtIE1lbW9yeSBtYXAga2V5DQoNClJldHVybnM6DQoNCiAgRUZJX0lOVkFMSURfUEFSQU1FVEVSICAgICAgIC0gTWVtb3J5IG1hcCBub3QgY29uc2lzdGVudCB3aXRoIGNvbnN0cnVjdGlvbiBydWxlcy4NCiAgDQogIEVGSV9TVUNDRVNTICAgICAgICAgICAgICAgICAtIFZhbGlkIG1lbW9yeSBtYXAuDQoNCi0tKi8NCjsNCg0KVk9JRA0KQ29yZU5vdGlmeVNpZ25hbExpc3QgKA0KICBJTiBFRklfR1VJRCAgICAgKkV2ZW50R3JvdXANCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIFNpZ25hbHMgYWxsIGV2ZW50cyBvbiB0aGUgcmVxdWVzdGVkIGxpc3QNCg0KQXJndW1lbnRzOg0KDQogIFNpZ25hbFR5cGUgICAgICAtIFRoZSBsaXN0IHRvIHNpZ25hbA0KICAgIA0KUmV0dXJuczoNCg0KICBOb25lDQoNCi0tKi8NCjsNCg0KDQpFRklfU1RBVFVTDQpFRklBUEkNCkNvcmVJbnN0YWxsQ29uZmlndXJhdGlvblRhYmxlICgNCiAgSU4gRUZJX0dVSUQgICAgICAgICAqR3VpZCwNCiAgSU4gVk9JRCAgICAgICAgICAgICAqVGFibGUNCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIEJvb3QgU2VydmljZSBjYWxsZWQgdG8gYWRkLCBtb2RpZnksIG9yIHJlbW92ZSBhIHN5c3RlbSBjb25maWd1cmF0aW9uIHRhYmxlIGZyb20gDQogIHRoZSBFRkkgU3lzdGVtIFRhYmxlLg0KDQpBcmd1bWVudHM6DQoNCiAgR3VpZDogICBQb2ludGVyIHRvIHRoZSBHVUlEIGZvciB0aGUgZW50cnkgdG8gYWRkLCB1cGRhdGUsIG9yIHJlbW92ZQ0KICBUYWJsZTogIFBvaW50ZXIgdG8gdGhlIGNvbmZpZ3VyYXRpb24gdGFibGUgZm9yIHRoZSBlbnRyeSB0byBhZGQsIHVwZGF0ZSwgb3INCiAgICAgICAgICByZW1vdmUsIG1heSBiZSBOVUxMLg0KDQpSZXR1cm5zOg0KICANCiAgRUZJX1NVQ0NFU1MgICAgICAgICAgICAgICBHdWlkLCBUYWJsZSBwYWlyIGFkZGVkLCB1cGRhdGVkLCBvciByZW1vdmVkLg0KICBFRklfSU5WQUxJRF9QQVJBTUVURVIgICAgIElucHV0IEdVSUQgbm90IHZhbGlkLg0KICBFRklfTk9UX0ZPVU5EICAgICAgICAgICAgIEF0dGVtcHRlZCB0byBkZWxldGUgbm9uLWV4aXN0YW50IGVudHJ5DQogIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICAgICAgTm90IGVub3VnaCBtZW1vcnkgYXZhaWxhYmxlDQoNCi0tKi8NCjsNCg0KDQpFRklfVFBMDQpFRklBUEkNCkNvcmVSYWlzZVRwbCAoDQogIElOIEVGSV9UUEwgIE5ld1RwbA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgUmFpc2UgdGhlIHRhc2sgcHJpb3JpdHkgbGV2ZWwgdG8gdGhlIG5ldyBsZXZlbC4NCiAgSGlnaCBsZXZlbCBpcyBpbXBsZW1lbnRlZCBieSBkaXNhYmxpbmcgcHJvY2Vzc29yIGludGVycnVwdHMuDQoNCkFyZ3VtZW50czoNCg0KICBOZXdUcGwgIC0gTmV3IHRhc2sgcHJpb3JpdHkgbGV2ZWwNCiAgICANClJldHVybnM6DQoNCiAgVGhlIHByZXZpb3VzIHRhc2sgcHJpb3JpdHkgbGV2ZWwNCg0KLS0qLw0KOw0KDQoNClZPSUQNCkVGSUFQSQ0KQ29yZVJlc3RvcmVUcGwgKA0KICBJTiBFRklfVFBMICBOZXdUcGwNCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIExvd2VycyB0aGUgdGFzayBwcmlvcml0eSB0byB0aGUgcHJldmlvdXMgdmFsdWUuICAgSWYgdGhlIG5ldyANCiAgcHJpb3JpdHkgdW5tYXNrcyBldmVudHMgYXQgYSBoaWdoZXIgcHJpb3JpdHksIHRoZXkgYXJlIGRpc3BhdGNoZWQuDQoNCkFyZ3VtZW50czoNCg0KICBOZXdUcGwgIC0gTmV3LCBsb3dlciwgdGFzayBwcmlvcml0eQ0KICAgIA0KUmV0dXJuczoNCg0KICBOb25lDQoNCi0tKi8NCjsNCg0KDQpFRklfU1RBVFVTDQpFRklBUEkNCkNvcmVTdGFsbCAoDQogIElOIFVJTlROICAgICAgICAgICAgTWljcm9zZWNvbmRzDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBJbnRyb2R1Y2VzIGEgZmluZS1ncmFpbmVkIHN0YWxsLg0KDQpBcmd1bWVudHM6DQoNCiAgTWljcm9zZWNvbmRzICAgICAgVGhlIG51bWJlciBvZiBtaWNyb3NlY29uZHMgdG8gc3RhbGwgZXhlY3V0aW9uDQoNClJldHVybnM6DQoNCiAgRUZJX1NVQ0NFU1MgICAgICAgICAgICAtIEV4ZWN1dGlvbiB3YXMgc3RhbGxlZCBmb3IgYXQgbGVhc3QgdGhlIHJlcXVlc3RlZCBhbW91bnQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIG1pY3Jvc2Vjb25kcy4NCg0KICBFRklfTk9UX0FWQUlMQUJMRV9ZRVQgIC0gZ01ldHJvbm9tZSBpcyBub3QgYXZhaWxhYmxlIHlldA0KDQotLSovDQo7DQoNCg0KRUZJX1NUQVRVUw0KRUZJQVBJDQpDb3JlU2V0V2F0Y2hkb2dUaW1lciAoDQogIElOIFVJTlROICAgICAgICAgICAgVGltZW91dCwNCiAgSU4gVUlOVDY0ICAgICAgICAgICBXYXRjaGRvZ0NvZGUsDQogIElOIFVJTlROICAgICAgICAgICAgRGF0YVNpemUsDQogIElOIENIQVIxNiAgICAgICAgICAgKldhdGNoZG9nRGF0YSAgIE9QVElPTkFMDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBTZXRzIHRoZSBzeXN0ZW0ncyB3YXRjaGRvZyB0aW1lci4NCg0KQXJndW1lbnRzOg0KDQogIFRpbWVvdXQgICAgICAgICBUaGUgbnVtYmVyIG9mIHNlY29uZHMuICBaZXJvIGRpc2FibGVzIHRoZSB0aW1lci4NCg0KICAvLy8vLy8vZm9sbG93aW5nICB0aHJlZSBwYXJhbWV0ZXJzIGFyZSBsZWZ0IGZvciBwbGF0Zm9ybSBzcGVjaWZpYyB1c2luZyAgDQogIA0KICBXYXRjaGRvZ0NvZGUgICAgVGhlIG51bWJlcmljIGNvZGUgdG8gbG9nLiAgMHgwIHRvIDB4ZmZmZiBhcmUgZmlybXdhcmUNCiAgRGF0YVNpemUgICAgICAgIFNpemUgb2YgdGhlIG9wdGlvbmFsIGRhdGENCiAgV2F0Y2hkb2dEYXRhICAgIE9wdGlvbmFsIE51bGwgdGVybWluYXRlZCB1bmljb2RlIHN0cmluZyBmb2xsb3dlZCBieSBiaW5hcnkgDQogICAgICAgICAgICAgICAgICBkYXRhLg0KDQpSZXR1cm5zOg0KDQogIEVGSV9TVUNDRVNTICAgICAgICAgICAgICAgVGltZW91dCBoYXMgYmVlbiBzZXQNCiAgRUZJX05PVF9BVkFJTEFCTEVfWUVUICAgICBXYXRjaGRvZ1RpbWVyIGlzIG5vdCBhdmFpbGFibGUgeWV0IA0KICBFRklfVU5TVVBQT1JURUQgICAgICAgICAgIFN5c3RlbSBkb2VzIG5vdCBoYXZlIGEgdGltZXIgKGN1cnJlbnRseSBub3QgdXNlZCkNCiAgRUZJX0RFVklDRV9FUlJPUiAgICAgICAgICBDb3VsZCBub3QgY29tcGxldGUgZHVlIHRvIGhhcmR3YXJlIGVycm9yDQoNCi0tKi8NCjsNCg0KDQpFRklfU1RBVFVTDQpFRklBUEkNCkNvcmVJbnN0YWxsUHJvdG9jb2xJbnRlcmZhY2UgKA0KICBJTiBPVVQgRUZJX0hBTkRMRSAgICAgKlVzZXJIYW5kbGUsDQogIElOIEVGSV9HVUlEICAgICAgICAgICAqUHJvdG9jb2wsDQogIElOIEVGSV9JTlRFUkZBQ0VfVFlQRSBJbnRlcmZhY2VUeXBlLA0KICBJTiBWT0lEICAgICAgICAgICAgICAgKkludGVyZmFjZQ0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgV3JhcHBlciBmdW5jdGlvbiB0byBDb3JlSW5zdGFsbFByb3RvY29sSW50ZXJmYWNlTm90aWZ5LiAgVGhpcyBpcyB0aGUgcHVibGljIEFQSSB3aGljaA0KICBDYWxscyB0aGUgcHJpdmF0ZSBvbmUgd2hpY2ggY29udGFpbnMgYSBCT09MRUFOIHBhcmFtZXRlciBmb3Igbm90aWZpY2F0aW9ucw0KDQpBcmd1bWVudHM6DQoNCiAgVXNlckhhbmRsZSAgICAgLSBUaGUgaGFuZGxlIHRvIGluc3RhbGwgdGhlIHByb3RvY29sIGhhbmRsZXIgb24sDQogICAgICAgICAgICAgICAgICAgIG9yIE5VTEwgaWYgYSBuZXcgaGFuZGxlIGlzIHRvIGJlIGFsbG9jYXRlZA0KDQogIFByb3RvY29sICAgICAgIC0gVGhlIHByb3RvY29sIHRvIGFkZCB0byB0aGUgaGFuZGxlDQoNCiAgSW50ZXJmYWNlVHlwZSAgLSBJbmRpY2F0ZXMgd2hldGhlciBJbnRlcmZhY2UgaXMgc3VwcGxpZWQgaW4gbmF0aXZlIGZvcm0uDQoNCiAgSW50ZXJmYWNlICAgICAgLSBUaGUgaW50ZXJmYWNlIGZvciB0aGUgcHJvdG9jb2wgYmVpbmcgYWRkZWQNCg0KUmV0dXJuczoNCg0KICBTdGF0dXMgY29kZSAgICANCg0KLS0qLw0KOw0KDQpFRklfU1RBVFVTDQpDb3JlSW5zdGFsbFByb3RvY29sSW50ZXJmYWNlTm90aWZ5ICgNCiAgSU4gT1VUIEVGSV9IQU5ETEUgICAgICpVc2VySGFuZGxlLA0KICBJTiBFRklfR1VJRCAgICAgICAgICAgKlByb3RvY29sLA0KICBJTiBFRklfSU5URVJGQUNFX1RZUEUgSW50ZXJmYWNlVHlwZSwNCiAgSU4gVk9JRCAgICAgICAgICAgICAgICpJbnRlcmZhY2UsDQogIElOIEJPT0xFQU4gICAgICAgICAgICBOb3RpZnkNCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIEluc3RhbGxzIGEgcHJvdG9jb2wgaW50ZXJmYWNlIGludG8gdGhlIGJvb3Qgc2VydmljZXMgZW52aXJvbm1lbnQuDQoNCkFyZ3VtZW50czoNCg0KICBVc2VySGFuZGxlICAgICAtIFRoZSBoYW5kbGUgdG8gaW5zdGFsbCB0aGUgcHJvdG9jb2wgaGFuZGxlciBvbiwNCiAgICAgICAgICAgICAgICAgICBvciBOVUxMIGlmIGEgbmV3IGhhbmRsZSBpcyB0byBiZSBhbGxvY2F0ZWQNCg0KICBQcm90b2NvbCAgICAgICAtIFRoZSBwcm90b2NvbCB0byBhZGQgdG8gdGhlIGhhbmRsZQ0KDQogIEludGVyZmFjZVR5cGUgIC0gSW5kaWNhdGVzIHdoZXRoZXIgSW50ZXJmYWNlIGlzIHN1cHBsaWVkIGluIG5hdGl2ZSBmb3JtLg0KDQogIEludGVyZmFjZSAgICAgIC0gVGhlIGludGVyZmFjZSBmb3IgdGhlIHByb3RvY29sIGJlaW5nIGFkZGVkDQogIA0KICBOb3RpZnkgICAgICAgICAtIFdoZXRoZXIgdG8gbm90aWZ5IHRoZSBub3RpZmljYXRpb24gbGlzdCBmb3IgdGhpcyBwcm90b2NvbCANCg0KUmV0dXJuczoNCg0KICBFRklfSU5WQUxJRF9QQVJBTUVURVIgICAgIC0gSW52YWxpZCBwYXJhbWV0ZXINCiAgDQogIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICAgICAgIC0gTm8gZW5vdWdoIGJ1ZmZlciB0byBhbGxvY2F0ZQ0KICANCiAgRUZJX1NVQ0NFU1MgICAgICAgICAgICAgICAtIFByb3RvY29sIGludGVyZmFjZSBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkDQoNCi0tKi8NCjsNCg0KDQpFRklfU1RBVFVTDQpFRklBUEkNCkNvcmVJbnN0YWxsTXVsdGlwbGVQcm90b2NvbEludGVyZmFjZXMgKA0KICBJTiBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgKkhhbmRsZSwNCiAgLi4uDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBJbnN0YWxscyBhIGxpc3Qgb2YgcHJvdG9jb2wgaW50ZXJmYWNlIGludG8gdGhlIGJvb3Qgc2VydmljZXMgZW52aXJvbm1lbnQuDQogIFRoaXMgZnVuY3Rpb24gY2FsbHMgSW5zdGFsbFByb3RvY29sSW50ZXJmYWNlKCkgaW4gYSBsb29wLiBJZiBhbnkgZXJyb3INCiAgb2NjdXJlcyBhbGwgdGhlIHByb3RvY29scyBhZGRlZCBieSB0aGlzIGZ1bmN0aW9uIGFyZSByZW1vdmVkLiBUaGlzIGlzIA0KICBiYXNpY2FsbHkgYSBsaWIgZnVuY3Rpb24gdG8gc2F2ZSBzcGFjZS4NCg0KQXJndW1lbnRzOg0KDQogIEhhbmRsZSAgICAgIC0gVGhlIGhhbmRsZSB0byBpbnN0YWxsIHRoZSBwcm90b2NvbCBoYW5kbGVycyBvbiwNCiAgICAgICAgICAgICAgICBvciBOVUxMIGlmIGEgbmV3IGhhbmRsZSBpcyB0byBiZSBhbGxvY2F0ZWQNCiAgLi4uICAgICAgICAgLSBFRklfR1VJRCBmb2xsb3dlZCBieSBwcm90b2NvbCBpbnN0YW5jZS4gQSBOVUxMIHRlcm1pbmF0ZXMgdGhlIA0KICAgICAgICAgICAgICAgIGxpc3QuIFRoZSBwYWlycyBhcmUgdGhlIGFyZ3VtZW50cyB0byBJbnN0YWxsUHJvdG9jb2xJbnRlcmZhY2UoKS4NCiAgICAgICAgICAgICAgICBBbGwgdGhlIHByb3RvY29scyBhcmUgYWRkZWQgdG8gSGFuZGxlLg0KDQpSZXR1cm5zOg0KDQogIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAgICAgICAtIEhhbmRsZSBpcyBOVUxMLg0KICANCiAgRUZJX1NVQ0NFU1MgICAgICAgICAgICAgICAgIC0gUHJvdG9jb2wgaW50ZXJmYWNlcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkLg0KDQotLSovDQo7DQoNCg0KRUZJX1NUQVRVUw0KRUZJQVBJDQpDb3JlVW5pbnN0YWxsTXVsdGlwbGVQcm90b2NvbEludGVyZmFjZXMgKA0KICBJTiBFRklfSEFORExFICAgICAgICAgICBIYW5kbGUsDQogIC4uLg0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgVW5pbnN0YWxscyBhIGxpc3Qgb2YgcHJvdG9jb2wgaW50ZXJmYWNlIGluIHRoZSBib290IHNlcnZpY2VzIGVudmlyb25tZW50LiANCiAgVGhpcyBmdW5jdGlvbiBjYWxscyBVbmlzYXRsbFByb3RvY29sSW50ZXJmYWNlKCkgaW4gYSBsb29wLiBUaGlzIGlzIA0KICBiYXNpY2FsbHkgYSBsaWIgZnVuY3Rpb24gdG8gc2F2ZSBzcGFjZS4NCg0KQXJndW1lbnRzOg0KDQogIEhhbmRsZSAgICAgIC0gVGhlIGhhbmRsZSB0byB1bmluc3RhbGwgdGhlIHByb3RvY29sDQoNCiAgLi4uICAgICAgICAgLSBFRklfR1VJRCBmb2xsb3dlZCBieSBwcm90b2NvbCBpbnN0YW5jZS4gQSBOVUxMIHRlcm1pbmF0ZXMgdGhlIA0KICAgICAgICAgICAgICAgIGxpc3QuIFRoZSBwYWlycyBhcmUgdGhlIGFyZ3VtZW50cyB0byBVbmluc3RhbGxQcm90b2NvbEludGVyZmFjZSgpLg0KICAgICAgICAgICAgICAgIEFsbCB0aGUgcHJvdG9jb2xzIGFyZSBhZGRlZCB0byBIYW5kbGUuDQoNClJldHVybnM6DQoNCiAgU3RhdHVzIGNvZGUgICAgDQoNCi0tKi8NCjsNCg0KDQpFRklfU1RBVFVTDQpFRklBUEkNCkNvcmVSZWluc3RhbGxQcm90b2NvbEludGVyZmFjZSAoDQogIElOIEVGSV9IQU5ETEUgICAgIFVzZXJIYW5kbGUsDQogIElOIEVGSV9HVUlEICAgICAgICpQcm90b2NvbCwNCiAgSU4gVk9JRCAgICAgICAgICAgKk9sZEludGVyZmFjZSwNCiAgSU4gVk9JRCAgICAgICAgICAgKk5ld0ludGVyZmFjZQ0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgUmVpbnN0YWxsIGEgcHJvdG9jb2wgaW50ZXJmYWNlIG9uIGEgZGV2aWNlIGhhbmRsZS4gIFRoZSBPbGRJbnRlcmZhY2UgZm9yIFByb3RvY29sIGlzIHJlcGxhY2VkIGJ5IHRoZSBOZXdJbnRlcmZhY2UuDQoNCkFyZ3VtZW50czoNCg0KICBVc2VySGFuZGxlICAgIC0gSGFuZGxlIG9uIHdoaWNoIHRoZSBpbnRlcmZhY2UgaXMgdG8gYmUgcmVpbnN0YWxsZWQNCiAgUHJvdG9jb2wgICAgICAtIFRoZSBudW1lcmljIElEIG9mIHRoZSBpbnRlcmZhY2UNCiAgT2xkSW50ZXJmYWNlICAtIEEgcG9pbnRlciB0byB0aGUgb2xkIGludGVyZmFjZQ0KICBOZXdJbnRlcmZhY2UgIC0gQSBwb2ludGVyIHRvIHRoZSBuZXcgaW50ZXJmYWNlIA0KDQoNClJldHVybnM6DQoNCiAgU3RhdHVzIGNvZGUuDQoNCiAgT24gRUZJX1NVQ0NFU1MgICAgICAgICAgICBUaGUgcHJvdG9jb2wgaW50ZXJmYWNlIHdhcyBpbnN0YWxsZWQNCiAgT24gRUZJX05PVF9GT1VORCAgICAgICAgICBUaGUgT2xkSW50ZXJmYWNlIG9uIHRoZSBoYW5kbGUgd2FzIG5vdCBmb3VuZA0KICBPbiBFRklfSU5WQUxJRF9QQVJBTUVURVIgIE9uZSBvZiB0aGUgcGFyYW1ldGVycyBoYXMgYW4gaW52YWxpZCB2YWx1ZQ0KICANCi0tKi8NCjsNCg0KDQpFRklfU1RBVFVTDQpFRklBUEkNCkNvcmVVbmluc3RhbGxQcm90b2NvbEludGVyZmFjZSAoDQogIElOIEVGSV9IQU5ETEUgICAgICAgVXNlckhhbmRsZSwNCiAgSU4gRUZJX0dVSUQgICAgICAgICAqUHJvdG9jb2wsDQogIElOIFZPSUQgICAgICAgICAgICAgKkludGVyZmFjZQ0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgVW5pbnN0YWxscyBhbGwgaW5zdGFuY2VzIG9mIGEgcHJvdG9jb2w6aW50ZXJmYWNlciBmcm9tIGEgaGFuZGxlLiANCiAgSWYgdGhlIGxhc3QgcHJvdG9jb2wgaW50ZXJmYWNlIGlzIHJlbW92ZSBmcm9tIHRoZSBoYW5kbGUsIHRoZSANCiAgaGFuZGxlIGlzIGZyZWVkLg0KDQpBcmd1bWVudHM6DQoNCiAgVXNlckhhbmRsZSAgICAgIC0gVGhlIGhhbmRsZSB0byByZW1vdmUgdGhlIHByb3RvY29sIGhhbmRsZXIgZnJvbQ0KDQogIFByb3RvY29sICAgICAgICAtIFRoZSBwcm90b2NvbCwgb2YgcHJvdG9jb2w6aW50ZXJmYWNlLCB0byByZW1vdmUNCg0KICBJbnRlcmZhY2UgICAgICAgLSBUaGUgaW50ZXJmYWNlLCBvZiBwcm90b2NvbDppbnRlcmZhY2UsIHRvIHJlbW92ZQ0KDQpSZXR1cm5zOg0KDQogIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAgICAgICAtIFByb3RvY29sIGlzIE5VTEwuDQogIA0KICBFRklfU1VDQ0VTUyAgICAgICAgICAgICAgICAgLSBQcm90b2NvbCBpbnRlcmZhY2Ugc3VjY2Vzc2Z1bGx5IHVuaW5zdGFsbGVkLg0KDQotLSovDQo7DQoNCg0KRUZJX1NUQVRVUw0KRUZJQVBJDQpDb3JlSGFuZGxlUHJvdG9jb2wgKA0KICBJTiAgRUZJX0hBTkRMRSAgICAgICBVc2VySGFuZGxlLA0KICBJTiAgRUZJX0dVSUQgICAgICAgICAqUHJvdG9jb2wsDQogIE9VVCBWT0lEICAgICAgICAgICAgICoqSW50ZXJmYWNlDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBRdWVyaWVzIGEgaGFuZGxlIHRvIGRldGVybWluZSBpZiBpdCBzdXBwb3J0cyBhIHNwZWNpZmllZCBwcm90b2NvbC4NCg0KQXJndW1lbnRzOg0KDQogIFVzZXJIYW5kbGUgIC0gVGhlIGhhbmRsZSBiZWluZyBxdWVyaWVkLg0KDQogIFByb3RvY29sICAgIC0gVGhlIHB1Ymxpc2hlZCB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcHJvdG9jb2wuDQoNCiAgSW50ZXJmYWNlICAgLSBTdXBwbGllcyB0aGUgYWRkcmVzcyB3aGVyZSBhIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgUHJvdG9jb2wNCiAgICAgICAgICAgICAgIEludGVyZmFjZSBpcyByZXR1cm5lZC4NCg0KUmV0dXJuczoNCg0KICBUaGUgcmVxdWVzdGVkIHByb3RvY29sIGludGVyZmFjZSBmb3IgdGhlIGhhbmRsZQ0KICANCi0tKi8gIA0KOw0KDQoNCkVGSV9TVEFUVVMNCkVGSUFQSQ0KQ29yZU9wZW5Qcm90b2NvbCAoDQogIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgIFVzZXJIYW5kbGUsDQogIElOICBFRklfR1VJRCAgICAgICAgICAgICAgICAgICpQcm90b2NvbCwNCiAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgKipJbnRlcmZhY2UgT1BUSU9OQUwsDQogIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlLA0KICBJTiAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICBDb250cm9sbGVySGFuZGxlLA0KICBJTiAgVUlOVDMyICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBMb2NhdGVzIHRoZSBpbnN0YWxsZWQgcHJvdG9jb2wgaGFuZGxlciBmb3IgdGhlIGhhbmRsZSwgYW5kDQogIGludm9rZXMgaXQgdG8gb2J0YWluIHRoZSBwcm90b2NvbCBpbnRlcmZhY2UuIFVzYWdlIGluZm9ybWF0aW9uDQogIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIHByb3RvY29sIGRhdGEgYmFzZS4NCg0KQXJndW1lbnRzOg0KDQogIFVzZXJIYW5kbGUgICAgICAgIC0gVGhlIGhhbmRsZSB0byBvYnRhaW4gdGhlIHByb3RvY29sIGludGVyZmFjZSBvbg0KDQogIFByb3RvY29sICAgICAgICAgIC0gVGhlIElEIG9mIHRoZSBwcm90b2NvbCANCg0KICBJbnRlcmZhY2UgICAgICAgICAtIFRoZSBsb2NhdGlvbiB0byByZXR1cm4gdGhlIHByb3RvY29sIGludGVyZmFjZQ0KDQogIEltYWdlSGFuZGxlICAgICAgIC0gVGhlIGhhbmRsZSBvZiB0aGUgSW1hZ2UgdGhhdCBpcyBvcGVuaW5nIHRoZSBwcm90b2NvbCBpbnRlcmZhY2UNCiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IFByb3RvY29sIGFuZCBJbnRlcmZhY2UuDQogIA0KICBDb250cm9sbGVySGFuZGxlICAtIFRoZSBjb250cm9sbGVyIGhhbmRsZSB0aGF0IGlzIHJlcXVpcmluZyB0aGlzIGludGVyZmFjZS4NCg0KICBBdHRyaWJ1dGVzICAgICAtIFRoZSBvcGVuIG1vZGUgb2YgdGhlIHByb3RvY29sIGludGVyZmFjZSBzcGVjaWZpZWQgYnkgSGFuZGxlDQogICAgICAgICAgICAgICAgICAgIGFuZCBQcm90b2NvbC4NCg0KUmV0dXJuczoNCg0KICBFRklfSU5WQUxJRF9QQVJBTUVURVIgICAgICAgLSBQcm90b2NvbCBpcyBOVUxMLg0KICANCiAgRUZJX1NVQ0NFU1MgICAgICAgICAgICAgICAgIC0gR2V0IHRoZSBwcm90b2NvbCBpbnRlcmZhY2UuDQogIA0KLS0qLw0KOw0KDQoNCkVGSV9TVEFUVVMNCkVGSUFQSQ0KQ29yZU9wZW5Qcm90b2NvbEluZm9ybWF0aW9uICgNCiAgSU4gIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJIYW5kbGUsDQogIElOICBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUHJvdG9jb2wsDQogIE9VVCBFRklfT1BFTl9QUk9UT0NPTF9JTkZPUk1BVElPTl9FTlRSWSAqKkVudHJ5QnVmZmVyLA0KICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkVudHJ5Q291bnQNCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBPcGVuZWQgcHJvdG9jb2xzIGluIHRoZSBzeXN0ZW0NCg0KQXJndW1lbnRzOg0KDQogIFVzZXJIYW5kbGUgIC0gVGhlIGhhbmRsZSB0byBjbG9zZSB0aGUgcHJvdG9jb2wgaW50ZXJmYWNlIG9uDQoNCiAgUHJvdG9jb2wgICAgLSBUaGUgSUQgb2YgdGhlIHByb3RvY29sIA0KDQogIEVudHJ5QnVmZmVyIC0gQSBwb2ludGVyIHRvIGEgYnVmZmVyIG9mIG9wZW4gcHJvdG9jb2wgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YNCiAgICAgICAgICAgICAgICBFRklfT1BFTl9QUk9UT0NPTF9JTkZPUk1BVElPTl9FTlRSWSBzdHJ1Y3R1cmVzLg0KDQogIEVudHJ5Q291bnQgIC0gTnVtYmVyIG9mIEVudHJ5QnVmZmVyIGVudHJpZXMNCg0KUmV0dXJuczoNCg0KICANCi0tKi8NCjsNCg0KDQpFRklfU1RBVFVTDQpFRklBUEkNCkNvcmVDbG9zZVByb3RvY29sICgNCiAgSU4gIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgVXNlckhhbmRsZSwNCiAgSU4gIEVGSV9HVUlEICAgICAgICAgICAgICAgICAgKlByb3RvY29sLA0KICBJTiAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICBJbWFnZUhhbmRsZSwNCiAgSU4gIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgQ29udHJvbGxlckhhbmRsZQ0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgQ2xvc2UgUHJvdG9jb2wNCg0KQXJndW1lbnRzOg0KDQogIFVzZXJIYW5kbGUgICAgICAgLSBUaGUgaGFuZGxlIHRvIGNsb3NlIHRoZSBwcm90b2NvbCBpbnRlcmZhY2Ugb24NCg0KICBQcm90b2NvbCAgICAgICAgIC0gVGhlIElEIG9mIHRoZSBwcm90b2NvbCANCg0KICBJbWFnZUhhbmRsZSAgICAgIC0gVGhlIHVzZXIgb2YgdGhlIHByb3RvY29sIHRvIGNsb3NlDQoNCiAgQ29udHJvbGxlckhhbmRsZSAtIFRoZSB1c2VyIG9mIHRoZSBwcm90b2NvbCB0byBjbG9zZQ0KDQpSZXR1cm5zOg0KDQogIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAgICAgLSBQcm90b2NvbCBpcyBOVUxMLg0KICAgIA0KLS0qLw0KOw0KDQoNCkVGSV9TVEFUVVMNCkVGSUFQSQ0KQ29yZVByb3RvY29sc1BlckhhbmRsZSAoDQogIElOICBFRklfSEFORExFICAgICAgIFVzZXJIYW5kbGUsDQogIE9VVCBFRklfR1VJRCAgICAgICAgICoqKlByb3RvY29sQnVmZmVyLA0KICBPVVQgVUlOVE4gICAgICAgICAgICAqUHJvdG9jb2xCdWZmZXJDb3VudA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgUmV0cmlldmVzIHRoZSBsaXN0IG9mIHByb3RvY29sIGludGVyZmFjZSBHVUlEcyB0aGF0IGFyZSBpbnN0YWxsZWQgb24gYSBoYW5kbGUgaW4gYSBidWZmZXIgYWxsb2NhdGVkDQogZnJvbSBwb29sLg0KDQpBcmd1bWVudHM6DQoNCiAgVXNlckhhbmRsZSAgICAgICAgICAgLSBUaGUgaGFuZGxlIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGxpc3Qgb2YgcHJvdG9jb2wgaW50ZXJmYWNlDQogICAgICAgICAgICAgICAgICAgICAgICAgIEdVSURzLg0KDQogIFByb3RvY29sQnVmZmVyICAgICAgIC0gQSBwb2ludGVyIHRvIHRoZSBsaXN0IG9mIHByb3RvY29sIGludGVyZmFjZSBHVUlEIHBvaW50ZXJzIHRoYXQgYXJlDQogICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZCBvbiBIYW5kbGUuDQoNCiAgUHJvdG9jb2xCdWZmZXJDb3VudCAgLSBBIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBHVUlEIHBvaW50ZXJzIHByZXNlbnQgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xCdWZmZXIuDQoNClJldHVybnM6DQogIEVGSV9TVUNDRVNTICAgLSAgVGhlIGxpc3Qgb2YgcHJvdG9jb2wgaW50ZXJmYWNlIEdVSURzIGluc3RhbGxlZCBvbiBIYW5kbGUgd2FzIHJldHVybmVkIGluDQogICAgICAgICAgICAgICAgICAgUHJvdG9jb2xCdWZmZXIuIFRoZSBudW1iZXIgb2YgcHJvdG9jb2wgaW50ZXJmYWNlIEdVSURzIHdhcw0KICAgICAgICAgICAgICAgICAgIHJldHVybmVkIGluIFByb3RvY29sQnVmZmVyQ291bnQuDQogIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAgIC0gIEhhbmRsZSBpcyBOVUxMLg0KICBFRklfSU5WQUxJRF9QQVJBTUVURVIgICAtICBIYW5kbGUgaXMgbm90IGEgdmFsaWQgRUZJX0hBTkRMRS4NCiAgRUZJX0lOVkFMSURfUEFSQU1FVEVSICAgLSAgUHJvdG9jb2xCdWZmZXIgaXMgTlVMTC4NCiAgRUZJX0lOVkFMSURfUEFSQU1FVEVSICAgLSAgUHJvdG9jb2xCdWZmZXJDb3VudCBpcyBOVUxMLg0KICBFRklfT1VUX09GX1JFU09VUkNFUyAgICAtICBUaGVyZSBpcyBub3QgZW5vdWdoIHBvb2wgbWVtb3J5IHRvIHN0b3JlIHRoZSByZXN1bHRzLg0KICANCi0tKi8NCjsNCg0KDQpFRklfU1RBVFVTDQpFRklBUEkNCkNvcmVSZWdpc3RlclByb3RvY29sTm90aWZ5ICgNCiAgSU4gIEVGSV9HVUlEICAgICAgICpQcm90b2NvbCwNCiAgSU4gIEVGSV9FVkVOVCAgICAgIEV2ZW50LA0KICBPVVQgVk9JRCAgICAgICAgICAgKipSZWdpc3RyYXRpb24NCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIEFkZCBhIG5ldyBwcm90b2NvbCBub3RpZmljYXRpb24gcmVjb3JkIGZvciB0aGUgcmVxdWVzdCBwcm90b2NvbC4NCg0KQXJndW1lbnRzOg0KDQogIFByb3RvY29sICAgICAgLSBUaGUgcmVxdWVzdGVkIHByb3RvY29sIHRvIGFkZCB0aGUgbm90aWZ5IHJlZ2lzdHJhdGlvbg0KDQogIEV2ZW50ICAgICAgICAgLSBUaGUgZXZlbnQgdG8gc2lnbmFsIA0KDQogIFJlZ2lzdHJhdGlvbiAgLSBSZXR1cm5zIHRoZSByZWdpc3RyYXRpb24gcmVjb3JkDQoNCg0KUmV0dXJuczoNCg0KICBFRklfSU5WQUxJRF9QQVJBTUVURVIgICAgICAgLSBJbnZhbGlkIHBhcmFtZXRlcg0KDQogIEVGSV9TVUNDRVNTICAgICAgICAgICAgICAgICAtIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCB0aGUgcmVnaXN0cmF0aW9uIHJlY29yZCB0aGF0IGhhcyBiZWVuIGFkZGVkDQogIA0KLS0qLw0KOw0KICANCg0KRUZJX1NUQVRVUw0KRUZJQVBJDQpDb3JlTG9jYXRlSGFuZGxlICgNCiAgSU4gICAgIEVGSV9MT0NBVEVfU0VBUkNIX1RZUEUgICAgICAgICBTZWFyY2hUeXBlLA0KICBJTiAgICAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICAgICpQcm90b2NvbCBPUFRJT05BTCwNCiAgSU4gICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAqU2VhcmNoS2V5IE9QVElPTkFMLA0KICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXJTaXplLA0KICBPVVQgICAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICpCdWZmZXINCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIExvY2F0ZXMgdGhlIHJlcXVlc3RlZCBoYW5kbGUocykgYW5kIHJldHVybnMgdGhlbSBpbiBCdWZmZXIuDQoNCkFyZ3VtZW50czoNCg0KICBTZWFyY2hUeXBlICAtIFRoZSB0eXBlIG9mIHNlYXJjaCB0byBwZXJmb3JtIHRvIGxvY2F0ZSB0aGUgaGFuZGxlcw0KDQogIFByb3RvY29sICAgIC0gVGhlIHByb3RvY29sIHRvIHNlYXJjaCBmb3INCiAgDQogIFNlYXJjaEtleSAgIC0gRGVwZW5kYW50IG9uIFNlYXJjaFR5cGUNCg0KICBCdWZmZXJTaXplICAtIE9uIGlucHV0IHRoZSBzaXplIG9mIEJ1ZmZlci4gIE9uIG91dHB1dCB0aGUgDQogICAgICAgICAgICAgICAgc2l6ZSBvZiBkYXRhIHJldHVybmVkLiAgDQoNCiAgQnVmZmVyICAgICAgLSBUaGUgYnVmZmVyIHRvIHJldHVybiB0aGUgcmVzdWx0cyBpbg0KDQoNClJldHVybnM6DQoNCiAgRUZJX0JVRkZFUl9UT09fU01BTEwgICAgICAtIEJ1ZmZlciB0b28gc21hbGwsIHJlcXVpcmVkIGJ1ZmZlciBzaXplIGlzIHJldHVybmVkIGluIEJ1ZmZlclNpemUuDQoNCiAgRUZJX0lOVkFMSURfUEFSQU1FVEVSICAgICAtIEludmFsaWQgcGFyYW1ldGVyDQogIA0KICBFRklfU1VDQ0VTUyAgICAgICAgICAgICAgIC0gU3VjY2Vzc2Z1bGx5IGZvdW5kIHRoZSByZXF1ZXN0ZWQgaGFuZGxlKHMpIGFuZCByZXR1cm5zIHRoZW0gaW4gQnVmZmVyLg0KICANCi0tKi8NCjsNCiAgDQoNCkVGSV9TVEFUVVMNCkVGSUFQSQ0KQ29yZUxvY2F0ZURldmljZVBhdGggKA0KICBJTiAgICAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICAgICpQcm90b2NvbCwNCiAgSU4gT1VUIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAqKkZpbGVQYXRoLA0KICBPVVQgICAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICpEZXZpY2UNCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIExvY2F0ZXMgdGhlIGhhbmRsZSB0byBhIGRldmljZSBvbiB0aGUgZGV2aWNlIHBhdGggdGhhdCBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkIHByb3RvY29sLg0KDQpBcmd1bWVudHM6DQoNCiAgUHJvdG9jb2wgICAgLSBUaGUgcHJvdG9jb2wgdG8gc2VhcmNoIGZvci4NCiAgRmlsZVBhdGggICAgLSBPbiBpbnB1dCwgYSBwb2ludGVyIHRvIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlIHBhdGguIE9uIG91dHB1dCwgdGhlIGRldmljZQ0KICAgICAgICAgICAgICAgICAgcGF0aCBwb2ludGVyIGlzIG1vZGlmaWVkIHRvIHBvaW50IHRvIHRoZSByZW1haW5pbmcgcGFydCBvZiB0aGUgZGV2aWNlcGF0aC4NCiAgRGV2aWNlICAgICAgLSBBIHBvaW50ZXIgdG8gdGhlIHJldHVybmVkIGRldmljZSBoYW5kbGUuICAgICAgICAgICAgICANCg0KUmV0dXJuczoNCg0KICBFRklfU1VDQ0VTUyAgICAgICAgICAgLSBUaGUgcmVzdWx0aW5nIGhhbmRsZSB3YXMgcmV0dXJuZWQuDQogIEVGSV9OT1RfRk9VTkQgICAgICAgICAtIE5vIGhhbmRsZXMgbWF0Y2hlZCB0aGUgc2VhcmNoLg0KICBFRklfSU5WQUxJRF9QQVJBTUVURVIgLSBPbmUgb2YgdGhlIHBhcmFtZXRlcnMgaGFzIGFuIGludmFsaWQgdmFsdWUuDQoNCi0tKi8NCjsNCg0KIA0KRUZJX1NUQVRVUw0KRUZJQVBJDQpDb3JlTG9jYXRlSGFuZGxlQnVmZmVyICgNCiAgSU4gICAgIEVGSV9MT0NBVEVfU0VBUkNIX1RZUEUgICAgICAgICBTZWFyY2hUeXBlLA0KICBJTiAgICAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICAgICpQcm90b2NvbCBPUFRJT05BTCwNCiAgSU4gICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAqU2VhcmNoS2V5IE9QVElPTkFMLA0KICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICpOdW1iZXJIYW5kbGVzLA0KICBPVVQgICAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICoqQnVmZmVyDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBGdW5jdGlvbiByZXR1cm5zIGFuIGFycmF5IG9mIGhhbmRsZXMgdGhhdCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgcHJvdG9jb2wgDQogIGluIGEgYnVmZmVyIGFsbG9jYXRlZCBmcm9tIHBvb2wuIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIENvcmVMb2NhdGVIYW5kbGUoKQ0KICB0aGF0IGFsbG9jYXRlcyBhIGJ1ZmZlciBmb3IgdGhlIGNhbGxlci4NCg0KQXJndW1lbnRzOg0KDQogIFNlYXJjaFR5cGUgICAgICAgICAgIC0gU3BlY2lmaWVzIHdoaWNoIGhhbmRsZShzKSBhcmUgdG8gYmUgcmV0dXJuZWQuDQogIFByb3RvY29sICAgICAgICAgICAgIC0gUHJvdmlkZXMgdGhlIHByb3RvY29sIHRvIHNlYXJjaCBieS4gICANCiAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyBvbmx5IHZhbGlkIGZvciBTZWFyY2hUeXBlIEJ5UHJvdG9jb2wuDQogIFNlYXJjaEtleSAgICAgICAgICAgIC0gU3VwcGxpZXMgdGhlIHNlYXJjaCBrZXkgZGVwZW5kaW5nIG9uIHRoZSBTZWFyY2hUeXBlLg0KICBOdW1iZXJIYW5kbGVzICAgICAgLSBUaGUgbnVtYmVyIG9mIGhhbmRsZXMgcmV0dXJuZWQgaW4gQnVmZmVyLg0KICBCdWZmZXIgICAgICAgICAgICAgICAtIEEgcG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJldHVybiB0aGUgcmVxdWVzdGVkIGFycmF5IG9mIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXMgdGhhdCBzdXBwb3J0IFByb3RvY29sLg0KDQpSZXR1cm5zOg0KICANCiAgRUZJX1NVQ0NFU1MgICAgICAgICAgICAgLSBUaGUgcmVzdWx0IGFycmF5IG9mIGhhbmRsZXMgd2FzIHJldHVybmVkLg0KICBFRklfTk9UX0ZPVU5EICAgICAgICAgICAtIE5vIGhhbmRsZXMgbWF0Y2ggdGhlIHNlYXJjaC4gDQogIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICAgIC0gVGhlcmUgaXMgbm90IGVub3VnaCBwb29sIG1lbW9yeSB0byBzdG9yZSB0aGUgbWF0Y2hpbmcgcmVzdWx0cy4NCiAgRUZJX0lOVkFMSURfUEFSQU1FVEVSICAgLSBJbnZhbGlkIHBhcmFtZXRlcg0KDQotLSovDQo7DQoNCiANCkVGSV9TVEFUVVMNCkVGSUFQSQ0KQ29yZUxvY2F0ZVByb3RvY29sICgNCiAgSU4gICAgRUZJX0dVSUQgICpQcm90b2NvbCwNCiAgSU4gICAgVk9JRCAgICAgICpSZWdpc3RyYXRpb24gT1BUSU9OQUwsDQogIE9VVCAgIFZPSUQgICAgICAqKkludGVyZmFjZQ0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgUmV0dXJuIHRoZSBmaXJzdCBQcm90b2NvbCBJbnRlcmZhY2UgdGhhdCBtYXRjaGVzIHRoZSBQcm90b2NvbCBHVUlELiBJZg0KICBSZWdpc3RyYXRpb24gaXMgcGFzYXNlZCBpbiByZXR1cm4gYSBQcm90b2NvbCBJbnN0YW5jZSB0aGF0IHdhcyBqdXN0IGFkZA0KICB0byB0aGUgc3lzdGVtLiBJZiBSZXRpc3RyYXRpb24gaXMgTlVMTCByZXR1cm4gdGhlIGZpcnN0IFByb3RvY29sIEludGVyZmFjZQ0KICB5b3UgZmluZC4NCg0KQXJndW1lbnRzOg0KDQogIFByb3RvY29sICAgICAtIFRoZSBwcm90b2NvbCB0byBzZWFyY2ggZm9yDQogIA0KICBSZWdpc3RyYXRpb24gLSBPcHRpb25hbCBSZWdpc3RyYXRpb24gS2V5IHJldHVybmVkIGZyb20gUmVnaXN0ZXJQcm90b2NvbE5vdGlmeSgpIA0KDQogIEludGVyZmFjZSAgICAtIFJldHVybiB0aGUgUHJvdG9jb2wgaW50ZXJmYWNlIChpbnN0YW5jZSkuDQoNClJldHVybnM6DQoNCiAgRUZJX1NVQ0NFU1MgICAgICAgICAgICAgICAgIC0gSWYgYSB2YWxpZCBJbnRlcmZhY2UgaXMgcmV0dXJuZWQNCiAgDQogIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAgICAgICAtIEludmFsaWQgcGFyYW1ldGVyDQogIA0KICBFRklfTk9UX0ZPVU5EICAgICAgICAgICAgICAgLSBQcm90b2NvbCBpbnRlcmZhY2Ugbm90IGZvdW5kDQoNCi0tKi8NCjsNCg0KVUlOVDY0DQpDb3JlR2V0SGFuZGxlRGF0YWJhc2VLZXkgKA0KICBWT0lEDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICByZXR1cm4gaGFuZGxlIGRhdGFiYXNlIGtleS4NCg0KQXJndW1lbnRzOg0KDQogIE5vbmUNCiAgDQpSZXR1cm5zOg0KICANCiAgSGFuZGxlIGRhdGFiYXNlIGtleS4NCiAgDQotLSovDQo7DQoNClZPSUQNCkNvcmVDb25uZWN0SGFuZGxlc0J5S2V5ICgNCiAgVUlOVDY0ICBLZXkNCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIEdvIGNvbm5lY3QgYW55IGhhbmRsZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgb3IgbW9kaWZpZWQgd2hpbGUgYSBpbWFnZSBleGVjdXRlZC4NCg0KQXJndW1lbnRzOg0KDQogIEtleSAgLSAgVGhlIEtleSB0byBzaG93IHRoYXQgdGhlIGhhbmRsZSBoYXMgYmVlbiBjcmVhdGVkL21vZGlmaWVkDQoNClJldHVybnM6DQogIA0KICBOb25lDQotLSovDQo7DQoNCg0KRUZJX1NUQVRVUyANCkVGSUFQSQ0KQ29yZUNvbm5lY3RDb250cm9sbGVyICgNCiAgSU4gIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgQ29udHJvbGxlckhhbmRsZSwNCiAgSU4gIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgKkRyaXZlckltYWdlSGFuZGxlICAgIE9QVElPTkFMLA0KICBJTiAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAqUmVtYWluaW5nRGV2aWNlUGF0aCAgT1BUSU9OQUwsDQogIElOICBCT09MRUFOICAgICAgICAgICAgICAgICAgIFJlY3Vyc2l2ZQ0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgQ29ubmVjdHMgb25lIG9yIG1vcmUgZHJpdmVycyB0byBhIGNvbnRyb2xsZXIuDQoNCkFyZ3VtZW50czoNCg0KICBDb250cm9sbGVySGFuZGxlICAgICAgICAgICAgLSBIYW5kbGUgb2YgdGhlIGNvbnRyb2xsZXIgdG8gYmUgY29ubmVjdGVkLg0KDQogIERyaXZlckltYWdlSGFuZGxlICAgICAgICAgICAtIERyaXZlckltYWdlSGFuZGxlIEEgcG9pbnRlciB0byBhbiBvcmRlcmVkIGxpc3Qgb2YgZHJpdmVyIGltYWdlIGhhbmRsZXMuDQoNCiAgUmVtYWluaW5nRGV2aWNlUGF0aCAgICAgICAgIC0gUmVtYWluaW5nRGV2aWNlUGF0aCBBIHBvaW50ZXIgdG8gdGhlIGRldmljZSBwYXRoIHRoYXQgc3BlY2lmaWVzIGEgY2hpbGQgb2YgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIgc3BlY2lmaWVkIGJ5IENvbnRyb2xsZXJIYW5kbGUuDQogICAgDQogIFJlY3Vyc2l2ZSAtICAgICAgICAgICAgICAgICAtIFdoZXRoZXIgdGhlIGZ1bmN0aW9uIHdvdWxkIGJlIGNhbGxlZCByZWN1cnNpdmVseSBvciBub3QuDQoNClJldHVybnM6DQoNCiAgU3RhdHVzIGNvZGUuDQoNCi0tKi8NCjsNCg0KDQpFRklfU1RBVFVTIA0KRUZJQVBJDQpDb3JlRGlzY29ubmVjdENvbnRyb2xsZXIgKA0KICBJTiBFRklfSEFORExFICBDb250cm9sbGVySGFuZGxlLA0KICBJTiBFRklfSEFORExFICBEcml2ZXJJbWFnZUhhbmRsZSAgT1BUSU9OQUwsDQogIElOIEVGSV9IQU5ETEUgIENoaWxkSGFuZGxlICAgICAgICBPUFRJT05BTA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgRGlzb25uZWN0cyBhIGNvbnRyb2xsZXIgZnJvbSBhIGRyaXZlcg0KDQpBcmd1bWVudHM6DQoNCiAgQ29udHJvbGxlckhhbmRsZSAgLSBDb250cm9sbGVySGFuZGxlIFRoZSBoYW5kbGUgb2YgdGhlIGNvbnRyb2xsZXIgZnJvbSB3aGljaCBkcml2ZXIocykgDQogICAgICAgICAgICAgICAgICAgICAgICBhcmUgdG8gYmUgZGlzY29ubmVjdGVkLg0KICBEcml2ZXJJbWFnZUhhbmRsZSAtIERyaXZlckltYWdlSGFuZGxlIFRoZSBkcml2ZXIgdG8gZGlzY29ubmVjdCBmcm9tIENvbnRyb2xsZXJIYW5kbGUuDQogIENoaWxkSGFuZGxlICAgICAgIC0gQ2hpbGRIYW5kbGUgVGhlIGhhbmRsZSBvZiB0aGUgY2hpbGQgdG8gZGVzdHJveS4NCg0KUmV0dXJuczoNCg0KICBFRklfU1VDQ0VTUyAgICAgICAgICAgLSAgT25lIG9yIG1vcmUgZHJpdmVycyB3ZXJlIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBjb250cm9sbGVyLg0KICBFRklfU1VDQ0VTUyAgICAgICAgICAgLSAgT24gZW50cnksIG5vIGRyaXZlcnMgYXJlIG1hbmFnaW5nIENvbnRyb2xsZXJIYW5kbGUuDQogIEVGSV9TVUNDRVNTICAgICAgICAgICAtICBEcml2ZXJJbWFnZUhhbmRsZSBpcyBub3QgTlVMTCwgYW5kIG9uIGVudHJ5IERyaXZlckltYWdlSGFuZGxlIGlzIG5vdCBtYW5hZ2luZyBDb250cm9sbGVySGFuZGxlLg0KICBFRklfSU5WQUxJRF9QQVJBTUVURVIgLSAgQ29udHJvbGxlckhhbmRsZSBpcyBub3QgYSB2YWxpZCBFRklfSEFORExFLg0KICBFRklfSU5WQUxJRF9QQVJBTUVURVIgLSAgRHJpdmVySW1hZ2VIYW5kbGUgaXMgbm90IE5VTEwsIGFuZCBpdCBpcyBub3QgYSB2YWxpZCBFRklfSEFORExFLg0KICBFRklfSU5WQUxJRF9QQVJBTUVURVIgLSAgQ2hpbGRIYW5kbGUgaXMgbm90IE5VTEwsIGFuZCBpdCBpcyBub3QgYSB2YWxpZCBFRklfSEFORExFLg0KICBFRklfT1VUX09GX1JFU09VUkNFUyAgLSAgVGhlcmUgYXJlIG5vdCBlbm91Z2ggcmVzb3VyY2VzIGF2YWlsYWJsZSB0byBkaXNjb25uZWN0IGFueSBkcml2ZXJzIGZyb20gQ29udHJvbGxlckhhbmRsZS4NCiAgRUZJX0RFVklDRV9FUlJPUiAgICAgIC0gIFRoZSBjb250cm9sbGVyIGNvdWxkIG5vdCBiZSBkaXNjb25uZWN0ZWQgYmVjYXVzZSBvZiBhIGRldmljZSBlcnJvci4NCg0KLS0qLw0KOw0KDQoNCkVGSV9TVEFUVVMNCkVGSUFQSQ0KQ29yZUFsbG9jYXRlUGFnZXMgKA0KICBJTiAgICAgIEVGSV9BTExPQ0FURV9UWVBFICAgICAgIFR5cGUsDQogIElOICAgICAgRUZJX01FTU9SWV9UWVBFICAgICAgICAgTWVtb3J5VHlwZSwNCiAgSU4gICAgICBVSU5UTiAgICAgICAgICAgICAgICAgICBOdW1iZXJPZlBhZ2VzLA0KICBJTiBPVVQgIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICpNZW1vcnkNCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIEFsbG9jYXRlcyBwYWdlcyBmcm9tIHRoZSBtZW1vcnkgbWFwLg0KDQpBcmd1bWVudHM6DQoNCiAgVHlwZSAgICAgICAgICAtIFRoZSB0eXBlIG9mIGFsbG9jYXRpb24gdG8gcGVyZm9ybQ0KDQogIE1lbW9yeVR5cGUgICAgLSBUaGUgdHlwZSBvZiBtZW1vcnkgdG8gdHVybiB0aGUgYWxsb2NhdGVkIHBhZ2VzIGludG8NCg0KICBOdW1iZXJPZlBhZ2VzIC0gVGhlIG51bWJlciBvZiBwYWdlcyB0byBhbGxvY2F0ZQ0KDQogIE1lbW9yeSAgICAgICAgLSBBIHBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgYmFzZSBhbGxvY2F0ZWQgbWVtb3J5IGFkZHJlc3MNCg0KUmV0dXJuczoNCg0KICBTdGF0dXMuIE9uIHN1Y2Nlc3MsIE1lbW9yeSBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgYmFzZSBhZGRyZXNzIGFsbG9jYXRlZA0KICANCiAgRUZJX0lOVkFMSURfUEFSQU1FVEVSICAgICAtIFBhcmFtZXRlcnMgdmlvbGF0ZSBjaGVja2luZyBydWxlcyBkZWZpbmVkIGluIHNwZWMuDQogIA0KICBFRklfTk9UX0ZPVU5EICAgICAgICAgICAgIC0gQ291bGQgbm90IGFsbG9jYXRlIHBhZ2VzIG1hdGNoIHRoZSByZXF1aXJlbWVudC4NCiAgDQogIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICAgICAgLSBObyBlbm91Z2ggcGFnZXMgdG8gYWxsb2NhdGUuDQogIA0KICBFRklfU1VDQ0VTUyAgICAgICAgICAgICAgIC0gUGFnZXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4NCg0KLS0qLw0KOw0KDQoNCkVGSV9TVEFUVVMgDQpFRklBUEkNCkNvcmVGcmVlUGFnZXMgKA0KICBJTiBFRklfUEhZU0lDQUxfQUREUkVTUyAgIE1lbW9yeSwNCiAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICBOdW1iZXJPZlBhZ2VzDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBGcmVlcyBwcmV2aW91cyBhbGxvY2F0ZWQgcGFnZXMuDQoNCkFyZ3VtZW50czoNCg0KICBNZW1vcnkgICAgICAgIC0gQmFzZSBhZGRyZXNzIG9mIG1lbW9yeSBiZWluZyBmcmVlZA0KDQogIE51bWJlck9mUGFnZXMgLSBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGZyZWUNCg0KUmV0dXJuczoNCg0KICBFRklfTk9UX0ZPVU5EICAgICAgIC0gQ291bGQgbm90IGZpbmQgdGhlIGVudHJ5IHRoYXQgY292ZXJzIHRoZSByYW5nZQ0KICANCiAgRUZJX0lOVkFMSURfUEFSQU1FVEVSICAgLSBBZGRyZXNzIG5vdCBhbGlnbmVkDQogIA0KICBFRklfU1VDQ0VTUyAgICAgICAgIC1QYWdlcyBzdWNjZXNzZnVsbHkgZnJlZWQuDQoNCi0tKi8NCjsNCg0KDQpFRklfU1RBVFVTDQpFRklBUEkNCkNvcmVHZXRNZW1vcnlNYXAgKA0KICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICpNZW1vcnlNYXBTaXplLA0KICBJTiBPVVQgRUZJX01FTU9SWV9ERVNDUklQVE9SICAgICAgICpEZXNjLA0KICBPVVQgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICpNYXBLZXksDQogIE9VVCAgICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgKkRlc2NyaXB0b3JTaXplLA0KICBPVVQgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICpEZXNjcmlwdG9yVmVyc2lvbg0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgUmV0dXJucyB0aGUgY3VycmVudCBtZW1vcnkgbWFwLg0KDQpBcmd1bWVudHM6DQoNCiAgTWVtb3J5TWFwU2l6ZSAgICAgLSBPbiBpbnB1dCB0aGUgYnVmZmVyIHNpemUgb2YgTWVtb3J5TWFwIGFsbG9jYXRlZCBieSBjYWxsZXINCiAgICAgICAgICAgICAgICAgICAgICBPbiBvdXRwdXQgdGhlIHJlcXVpcmVkIGJ1ZmZlciBzaXplIHRvIGNvbnRhaW4gdGhlIG1lbW9yeSBtYXAgDQogICAgICAgICAgICAgICAgICAgICAgDQogIERlc2MgICAgICAgICAgICAgIC0gVGhlIGJ1ZmZlciB0byByZXR1cm4gdGhlIGN1cnJlbnQgbWVtb3J5IG1hcA0KDQogIE1hcEtleSAgICAgICAgICAgIC0gVGhlIGFkZHJlc3MgdG8gcmV0dXJuIHRoZSBjdXJyZW50IG1hcCBrZXkNCg0KICBEZXNjcmlwdG9yU2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIGZvciBhbiBpbmRpdmlkdWFsIEVGSV9NRU1PUllfREVTQ1JJUFRPUg0KDQogIERlc2NyaXB0b3JWZXJzaW9uIC0gVGhlIHZlcnNpb24gbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgRUZJX01FTU9SWV9ERVNDUklQVE9SDQoNClJldHVybnM6DQoNCiAgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBjdXJyZW50IG1lbW9yeSBtYXAgd2FzIHJldHVybmVkIHN1Y2Nlc3NmdWxseQ0KDQogIEVGSV9CVUZGRVJfVE9PX1NNQUxMICBUaGUgTWVtb3J5TWFwIGJ1ZmZlciB3YXMgdG9vIHNtYWxsDQoNCiAgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE9uZSBvZiB0aGUgcGFyYW1ldGVycyBoYXMgYW4gaW52YWxpZCB2YWx1ZQ0KDQotLSovDQo7DQoNCg0KRUZJX1NUQVRVUw0KRUZJQVBJDQpDb3JlQWxsb2NhdGVQb29sICgNCiAgSU4gICBFRklfTUVNT1JZX1RZUEUgIFBvb2xUeXBlLA0KICBJTiAgIFVJTlROICAgICAgICAgICAgU2l6ZSwNCiAgT1VUICBWT0lEICAgICAgICAgICAgICoqQnVmZmVyDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBBbGxvY2F0ZSBwb29sIG9mIGEgcGFydGljdWxhciB0eXBlLg0KDQpBcmd1bWVudHM6DQoNCiAgUG9vbFR5cGUgICAgLSBUeXBlIG9mIHBvb2wgdG8gYWxsb2NhdGUNCg0KICBTaXplICAgICAgICAtIFRoZSBhbW91bnQgb2YgcG9vbCB0byBhbGxvY2F0ZQ0KDQogIEJ1ZmZlciAgICAgIC0gVGhlIGFkZHJlc3MgdG8gcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIHBvb2wNCg0KUmV0dXJuczoNCg0KICBFRklfSU5WQUxJRF9QQVJBTUVURVIgICAgIC0gUG9vbFR5cGUgbm90IHZhbGlkDQogIA0KICBFRklfT1VUX09GX1JFU09VUkNFUyAgICAgIC0gU2l6ZSBleGNlZWRzIG1heCBwb29sIHNpemUgb3IgYWxsb2NhdGlvbiBmYWlsZWQuICANCiAgDQogIEVGSV9TVUNDRVNTICAgICAgICAgICAgICAgLSBQb29sIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuDQoNCi0tKi8NCjsNCg0KDQpFRklfU1RBVFVTDQpFRklBUEkNCkNvcmVGcmVlUG9vbCAoDQogIElOIFZPSUQgICAgICAqQnVmZmVyDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBGcmVlcyBwb29sLg0KDQpBcmd1bWVudHM6DQoNCiAgQnVmZmVyICAgICAgLSBUaGUgYWxsb2NhdGVkIHBvb2wgZW50cnkgdG8gZnJlZQ0KDQpSZXR1cm5zOg0KDQogIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAgIC0gQnVmZmVyIGlzIG5vdCBhIHZhbGlkIHZhbHVlLg0KICANCiAgRUZJX1NVQ0NFU1MgICAgICAgICAgICAgLSBQb29sIHN1Y2Nlc3NmdWxseSBmcmVlZC4NCg0KLS0qLw0KOw0KDQoNCkVGSV9TVEFUVVMNCkVGSUFQSQ0KQ29yZUxvYWRJbWFnZSAoDQogIElOICBCT09MRUFOICAgICAgICAgICAgICAgICAgICBCb290UG9saWN5LA0KICBJTiAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgUGFyZW50SW1hZ2VIYW5kbGUsDQogIElOICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAqRmlsZVBhdGgsDQogIElOICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAqU291cmNlQnVmZmVyICAgT1BUSU9OQUwsDQogIElOICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VTaXplLA0KICBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgKkltYWdlSGFuZGxlDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBMb2FkcyBhbiBFRkkgaW1hZ2UgaW50byBtZW1vcnkgYW5kIHJldHVybnMgYSBoYW5kbGUgdG8gdGhlIGltYWdlLg0KDQpBcmd1bWVudHM6DQoNCiAgQm9vdFBvbGljeSAgICAgICAgICAtIElmIFRSVUUsIGluZGljYXRlcyB0aGF0IHRoZSByZXF1ZXN0IG9yaWdpbmF0ZXMgZnJvbSB0aGUgYm9vdCBtYW5hZ2VyLA0KICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoYXQgdGhlIGJvb3QgbWFuYWdlciBpcyBhdHRlbXB0aW5nIHRvIGxvYWQgRmlsZVBhdGggYXMgYSBib290IHNlbGVjdGlvbi4NCiAgUGFyZW50SW1hZ2VIYW5kbGUgICAtIFRoZSBjYWxsZXIncyBpbWFnZSBoYW5kbGUuDQogIEZpbGVQYXRoICAgICAgICAgICAgLSBUaGUgc3BlY2lmaWMgZmlsZSBwYXRoIGZyb20gd2hpY2ggdGhlIGltYWdlIGlzIGxvYWRlZC4NCiAgU291cmNlQnVmZmVyICAgICAgICAtIElmIG5vdCBOVUxMLCBhIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBsb2NhdGlvbiBjb250YWluaW5nIGEgY29weSBvZiANCiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbWFnZSB0byBiZSBsb2FkZWQuDQogIFNvdXJjZVNpemUgICAgICAgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiBTb3VyY2VCdWZmZXIuDQogIEltYWdlSGFuZGxlICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXR1cm5lZCBpbWFnZSBoYW5kbGUgdGhhdCBpcyBjcmVhdGVkIHdoZW4gdGhlIGltYWdlIA0KICAgICAgICAgICAgICAgICAgICAgICAgaXMgc3VjY2Vzc2Z1bGx5IGxvYWRlZC4NCg0KUmV0dXJuczoNCg0KICBFRklfU1VDQ0VTUyAgICAgICAgICAgIC0gVGhlIGltYWdlIHdhcyBsb2FkZWQgaW50byBtZW1vcnkuDQogIEVGSV9OT1RfRk9VTkQgICAgICAgICAgLSBUaGUgRmlsZVBhdGggd2FzIG5vdCBmb3VuZC4NCiAgRUZJX0lOVkFMSURfUEFSQU1FVEVSICAtIE9uZSBvZiB0aGUgcGFyYW1ldGVycyBoYXMgYW4gaW52YWxpZCB2YWx1ZS4NCiAgRUZJX1VOU1VQUE9SVEVEICAgICAgICAtIFRoZSBpbWFnZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIHRoZSBkZXZpY2UgcGF0aCBjYW5ub3QgYmUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgdG8gbG9jYXRlIHRoZSBwcm9wZXIgcHJvdG9jb2wgZm9yIGxvYWRpbmcgdGhlIGZpbGUuDQogIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICAgLSBJbWFnZSB3YXMgbm90IGxvYWRlZCBkdWUgdG8gaW5zdWZmaWNpZW50IHJlc291cmNlcy4NCi0tKi8NCjsNCg0KDQpFRklfU1RBVFVTDQpFRklBUEkNCkNvcmVVbmxvYWRJbWFnZSAoDQogIElOIEVGSV9IQU5ETEUgIEltYWdlSGFuZGxlDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBVbmxvYWQgdGhlIHNwZWNpZmllZCBpbWFnZS4NCg0KQXJndW1lbnRzOg0KDQogIEltYWdlSGFuZGxlICAgICAgIC0gVGhlIHNwZWNpZmllZCBpbWFnZSBoYW5kbGUuDQoNClJldHVybnM6DQoNCiAgRUZJX0lOVkFMSURfUEFSQU1FVEVSICAgICAgIC0gSW1hZ2UgaGFuZGxlIGlzIE5VTEwuDQogIA0KICBFRklfVU5TVVBQT1JURUQgICAgICAgICAgICAgLSBBdHRlbXB0IHRvIHVubG9hZCBhbiB1bnN1cHBvcnRlZCBpbWFnZS4NCiAgDQogIEVGSV9TVUNDRVNTICAgICAgICAgICAgICAgICAtIEltYWdlIHN1Y2Nlc3NmdWxseSB1bmxvYWRlZC4NCg0KLS0qLw0KOw0KDQoNCkVGSV9TVEFUVVMNCkVGSUFQSQ0KQ29yZVN0YXJ0SW1hZ2UgKA0KICBJTiAgRUZJX0hBTkRMRSAgSW1hZ2VIYW5kbGUsDQogIE9VVCBVSU5UTiAgICAgICAqRXhpdERhdGFTaXplLA0KICBPVVQgQ0hBUjE2ICAgICAgKipFeGl0RGF0YSAgT1BUSU9OQUwNCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIFRyYW5zZmVyIGNvbnRyb2wgdG8gYSBsb2FkZWQgaW1hZ2UncyBlbnRyeSBwb2ludC4NCg0KQXJndW1lbnRzOg0KDQogIEltYWdlSGFuZGxlICAgICAtIEhhbmRsZSBvZiBpbWFnZSB0byBiZSBzdGFydGVkLg0KICANCiAgRXhpdERhdGFTaXplICAgIC0gUG9pbnRlciBvZiB0aGUgc2l6ZSB0byBFeGl0RGF0YQ0KICANCiAgRXhpdERhdGEgICAgICAgIC0gUG9pbnRlciB0byBhIHBvaW50ZXIgdG8gYSBkYXRhIGJ1ZmZlciB0aGF0IGluY2x1ZGVzIGEgTnVsbC10ZXJtaW5hdGVkDQogICAgICAgICAgICAgICAgICAgIFVuaWNvZGUgc3RyaW5nLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYmluYXJ5IGRhdGEuIFRoZSBzdHJpbmcNCiAgICAgICAgICAgICAgICAgICAgaXMgYSBkZXNjcmlwdGlvbiB0aGF0IHRoZSBjYWxsZXIgbWF5IHVzZSB0byBmdXJ0aGVyIGluZGljYXRlIHRoZSByZWFzb24gZm9yDQogICAgICAgICAgICAgICAgICAgIHRoZSBpbWFnZaGvcyBleGl0Lg0KDQpSZXR1cm5zOg0KDQogIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAgICAgLSBJbnZhbGlkIHBhcmFtZXRlcg0KICANCiAgRUZJX09VVF9PRl9SRVNPVVJDRVMgICAgICAgLSBObyBlbm91Z2ggYnVmZmVyIHRvIGFsbG9jYXRlDQogIA0KICBFRklfU1VDQ0VTUyAgICAgICAgICAgICAgIC0gU3VjY2Vzc2Z1bGx5IHRyYW5zZmVyIGNvbnRyb2wgdG8gdGhlIGltYWdlJ3MgZW50cnkgcG9pbnQuDQoNCi0tKi8NCjsNCg0KDQpFRklfU1RBVFVTDQpFRklBUEkNCkNvcmVFeGl0ICgNCiAgSU4gRUZJX0hBTkRMRSAgSW1hZ2VIYW5kbGUsDQogIElOIEVGSV9TVEFUVVMgIFN0YXR1cywNCiAgSU4gVUlOVE4gICAgICAgRXhpdERhdGFTaXplLA0KICBJTiBDSEFSMTYgICAgICAqRXhpdERhdGEgIE9QVElPTkFMDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBUZXJtaW5hdGVzIHRoZSBjdXJyZW50bHkgbG9hZGVkIEVGSSBpbWFnZSBhbmQgcmV0dXJucyBjb250cm9sIHRvIGJvb3Qgc2VydmljZXMuDQoNCkFyZ3VtZW50czoNCg0KICBJbWFnZUhhbmRsZSAgICAgICAtIEhhbmRsZSB0aGF0IGlkZW50aWZpZXMgdGhlIGltYWdlLiBUaGlzIHBhcmFtZXRlciBpcyBwYXNzZWQgdG8gdGhlIGltYWdlIA0KICAgICAgICAgICAgICAgICAgICAgIG9uIGVudHJ5Lg0KICBTdGF0dXMgICAgICAgICAgICAtIFRoZSBpbWFnZaGvcyBleGl0IGNvZGUuDQogIEV4aXREYXRhU2l6ZSAgICAgIC0gVGhlIHNpemUsIGluIGJ5dGVzLCBvZiBFeGl0RGF0YS4gSWdub3JlZCBpZiBFeGl0U3RhdHVzIGlzDQogICAgICAgICAgICAgICAgICAgICAgRUZJX1NVQ0NFU1MuDQogIEV4aXREYXRhICAgICAgICAgIC0gUG9pbnRlciB0byBhIGRhdGEgYnVmZmVyIHRoYXQgaW5jbHVkZXMgYSBOdWxsLXRlcm1pbmF0ZWQgVW5pY29kZSBzdHJpbmcsDQogICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGJpbmFyeSBkYXRhLiBUaGUgc3RyaW5nIGlzIGEgDQogICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gdGhhdCB0aGUgY2FsbGVyIG1heSB1c2UgdG8gZnVydGhlciBpbmRpY2F0ZSB0aGUgcmVhc29uIGZvcg0KICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbWFnZaGvcyBleGl0Lg0KDQpSZXR1cm5zOg0KDQogIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAgICAgLSBJbWFnZSBoYW5kbGUgaXMgTlVMTCBvciBpdCBpcyBub3QgY3VycmVudCBpbWFnZS4NCiAgDQogIEVGSV9TVUNDRVNTICAgICAgICAgICAgICAgLSBTdWNjZXNzZnVsbHkgdGVybWluYXRlcyB0aGUgY3VycmVudGx5IGxvYWRlZCBFRkkgaW1hZ2UuDQogIA0KICBFRklfQUNDRVNTX0RFTklFRCAgICAgICAgIC0gU2hvdWxkIG5ldmVyIHJlYWNoIHRoZXJlLg0KDQotLSovDQo7DQoNCg0KRUZJX1NUQVRVUw0KRUZJQVBJDQpDb3JlQ3JlYXRlRXZlbnQgKA0KICBJTiAgVUlOVDMyICAgICAgICAgICAgICAgVHlwZSwNCiAgSU4gIEVGSV9UUEwgICAgICAgICAgICAgIE5vdGlmeVRwbCwNCiAgSU4gIEVGSV9FVkVOVF9OT1RJRlkgICAgIE5vdGlmeUZ1bmN0aW9uLA0KICBJTiAgVk9JRCAgICAgICAgICAgICAgICAgKk5vdGlmeUNvbnRleHQsDQogIE9VVCBFRklfRVZFTlQgICAgICAgICAgICAqcEV2ZW50DQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBDcmVhdGVzIGEgZ2VuZXJhbC1wdXJwb3NlIGV2ZW50IHN0cnVjdHVyZQ0KDQpBcmd1bWVudHM6DQoNCiAgVHlwZSAgICAgICAgICAgICAgICAtIFRoZSB0eXBlIG9mIGV2ZW50IHRvIGNyZWF0ZSBhbmQgaXRzIG1vZGUgYW5kIGF0dHJpYnV0ZXMNCiAgTm90aWZ5VHBsICAgICAgICAgICAtIFRoZSB0YXNrIHByaW9yaXR5IGxldmVsIG9mIGV2ZW50IG5vdGlmaWNhdGlvbnMNCiAgTm90aWZ5RnVuY3Rpb24gICAgICAtIFBvaW50ZXIgdG8gdGhlIGV2ZW50knMgbm90aWZpY2F0aW9uIGZ1bmN0aW9uDQogIE5vdGlmeUNvbnRleHQgICAgICAgLSBQb2ludGVyIHRvIHRoZSBub3RpZmljYXRpb24gZnVuY3Rpb26ScyBjb250ZXh0OyBjb3JyZXNwb25kcyB0bw0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyICJDb250ZXh0IiBpbiB0aGUgbm90aWZpY2F0aW9uIGZ1bmN0aW9uDQogIHBFdmVudCAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBuZXdseSBjcmVhdGVkIGV2ZW50IGlmIHRoZSBjYWxsIHN1Y2NlZWRzOyB1bmRlZmluZWQgb3RoZXJ3aXNlDQoNClJldHVybnM6DQoNCiAgRUZJX1NVQ0NFU1MgICAgICAgICAgIC0gVGhlIGV2ZW50IHN0cnVjdHVyZSB3YXMgY3JlYXRlZA0KICBFRklfSU5WQUxJRF9QQVJBTUVURVIgLSBPbmUgb2YgdGhlIHBhcmFtZXRlcnMgaGFzIGFuIGludmFsaWQgdmFsdWUNCiAgRUZJX09VVF9PRl9SRVNPVVJDRVMgIC0gVGhlIGV2ZW50IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQNCg0KLS0qLw0KOw0KDQoNCkVGSV9TVEFUVVMNCkVGSUFQSQ0KQ29yZUNyZWF0ZUV2ZW50RXggKA0KICBJTiBVSU5UMzIgICAgICAgICAgICAgICAgICAgVHlwZSwNCiAgSU4gRUZJX1RQTCAgICAgICAgICAgICAgICAgIE5vdGlmeVRwbCwNCiAgSU4gRUZJX0VWRU5UX05PVElGWSAgICAgICAgIE5vdGlmeUZ1bmN0aW9uLCBPUFRJT05BTA0KICBJTiBDT05TVCBWT0lEICAgICAgICAgICAgICAgKk5vdGlmeUNvbnRleHQsIE9QVElPTkFMDQogIElOIENPTlNUIEVGSV9HVUlEICAgICAgICAgICAqRXZlbnRHcm91cCwgICAgT1BUSU9OQUwNCiAgT1VUIEVGSV9FVkVOVCAgICAgICAgICAgICAgICpFdmVudA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQogIENyZWF0ZXMgYSBnZW5lcmFsLXB1cnBvc2UgZXZlbnQgc3RydWN0dXJlDQoNCkFyZ3VtZW50czoNCiAgVHlwZSAgICAgICAgICAgICAgICAtIFRoZSB0eXBlIG9mIGV2ZW50IHRvIGNyZWF0ZSBhbmQgaXRzIG1vZGUgYW5kIGF0dHJpYnV0ZXMNCiAgTm90aWZ5VHBsICAgICAgICAgICAtIFRoZSB0YXNrIHByaW9yaXR5IGxldmVsIG9mIGV2ZW50IG5vdGlmaWNhdGlvbnMNCiAgTm90aWZ5RnVuY3Rpb24gICAgICAtIFBvaW50ZXIgdG8gdGhlIGV2ZW50cyBub3RpZmljYXRpb24gZnVuY3Rpb24NCiAgTm90aWZ5Q29udGV4dCAgICAgICAtIFBvaW50ZXIgdG8gdGhlIG5vdGlmaWNhdGlvbiBmdW5jdGlvbnMgY29udGV4dDsgY29ycmVzcG9uZHMgdG8NCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciAiQ29udGV4dCIgaW4gdGhlIG5vdGlmaWNhdGlvbiBmdW5jdGlvbg0KICBFdmVudEdyb3V0ICAgICAgICAgIC0gR1VJRCBmb3IgRXZlbnRHcm91cCBpZiBOVUxMIGFjdCB0aGUgc2FtZSBhcyBnQlMtPkNyZWF0ZUV2ZW50KCkuDQogIEV2ZW50ICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBuZXdseSBjcmVhdGVkIGV2ZW50IGlmIHRoZSBjYWxsIHN1Y2NlZWRzOyB1bmRlZmluZWQgb3RoZXJ3aXNlDQoNClJldHVybnM6DQogIEVGSV9TVUNDRVNTICAgICAgICAgICAtIFRoZSBldmVudCBzdHJ1Y3R1cmUgd2FzIGNyZWF0ZWQNCiAgRUZJX0lOVkFMSURfUEFSQU1FVEVSIC0gT25lIG9mIHRoZSBwYXJhbWV0ZXJzIGhhcyBhbiBpbnZhbGlkIHZhbHVlDQogIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICAtIFRoZSBldmVudCBjb3VsZCBub3QgYmUgYWxsb2NhdGVkDQoNCi0tKi8NCjsNCg0KDQpFRklfU1RBVFVTDQpFRklBUEkNCkNvcmVTZXRUaW1lciAoDQogIElOIEVGSV9FVkVOVCAgICAgICAgICAgIEV2ZW50LA0KICBJTiBFRklfVElNRVJfREVMQVkgICAgICBUeXBlLA0KICBJTiBVSU5UNjQgICAgICAgICAgICAgICBUcmlnZ2VyVGltZQ0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgU2V0cyB0aGUgdHlwZSBvZiB0aW1lciBhbmQgdGhlIHRyaWdnZXIgdGltZSBmb3IgYSB0aW1lciBldmVudC4NCg0KQXJndW1lbnRzOg0KDQogIFVzZXJFdmVudCAgIC0gVGhlIHRpbWVyIGV2ZW50IHRoYXQgaXMgdG8gYmUgc2lnbmFsZWQgYXQgdGhlIHNwZWNpZmllZCB0aW1lDQogIFR5cGUgICAgICAgIC0gVGhlIHR5cGUgb2YgdGltZSB0aGF0IGlzIHNwZWNpZmllZCBpbiBUcmlnZ2VyVGltZQ0KICBUcmlnZ2VyVGltZSAtIFRoZSBudW1iZXIgb2YgMTAwbnMgdW5pdHMgdW50aWwgdGhlIHRpbWVyIGV4cGlyZXMNCiAgDQpSZXR1cm5zOg0KDQogIEVGSV9TVUNDRVNTICAgICAgICAgICAtIFRoZSBldmVudCBoYXMgYmVlbiBzZXQgdG8gYmUgc2lnbmFsZWQgYXQgdGhlIHJlcXVlc3RlZCB0aW1lDQogIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAtIEV2ZW50IG9yIFR5cGUgaXMgbm90IHZhbGlkDQoNCi0tKi8NCjsNCg0KDQpFRklfU1RBVFVTDQpFRklBUEkNCkNvcmVTaWduYWxFdmVudCAoDQogIElOIEVGSV9FVkVOVCAgICAgICAgICAgIEV2ZW50DQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBTaWduYWxzIHRoZSBldmVudC4gIFF1ZXVlcyB0aGUgZXZlbnQgdG8gYmUgbm90aWZpZWQgaWYgbmVlZGVkDQogICAgDQpBcmd1bWVudHM6DQoNCiAgRXZlbnQgLSBUaGUgZXZlbnQgdG8gc2lnbmFsDQogICAgDQpSZXR1cm5zOg0KDQogIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAtIFBhcmFtZXRlcnMgYXJlIG5vdCB2YWxpZC4NCiAgDQogIEVGSV9TVUNDRVNTIC0gVGhlIGV2ZW50IHdhcyBzaWduYWxlZC4NCg0KLS0qLw0KOw0KDQoNCkVGSV9TVEFUVVMNCkVGSUFQSQ0KQ29yZVdhaXRGb3JFdmVudCAoDQogIElOICBVSU5UTiAgICAgICAgTnVtYmVyT2ZFdmVudHMsDQogIElOICBFRklfRVZFTlQgICAgKlVzZXJFdmVudHMsDQogIE9VVCBVSU5UTiAgICAgICAgKlVzZXJJbmRleA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgU3RvcHMgZXhlY3V0aW9uIHVudGlsIGFuIGV2ZW50IGlzIHNpZ25hbGVkLg0KICAgIA0KQXJndW1lbnRzOg0KDQogIE51bWJlck9mRXZlbnRzICAtIFRoZSBudW1iZXIgb2YgZXZlbnRzIGluIHRoZSBVc2VyRXZlbnRzIGFycmF5DQogIFVzZXJFdmVudHMgICAgICAtIEFuIGFycmF5IG9mIEVGSV9FVkVOVA0KICBVc2VySW5kZXggICAgICAgLSBQb2ludGVyIHRvIHRoZSBpbmRleCBvZiB0aGUgZXZlbnQgd2hpY2ggc2F0aXNmaWVkIHRoZSB3YWl0IGNvbmRpdGlvbg0KICAgIA0KUmV0dXJuczoNCg0KICBFRklfU1VDQ0VTUyAgICAgICAgICAgLSBUaGUgZXZlbnQgaW5kaWNhdGVkIGJ5IEluZGV4IHdhcyBzaWduYWxlZC4NCiAgRUZJX0lOVkFMSURfUEFSQU1FVEVSIC0gVGhlIGV2ZW50IGluZGljYXRlZCBieSBJbmRleCBoYXMgYSBub3RpZmljYXRpb24gZnVuY3Rpb24gb3IgDQogICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50IHdhcyBub3QgYSB2YWxpZCB0eXBlDQogIEVGSV9VTlNVUFBPUlRFRCAgICAgICAtIFRoZSBjdXJyZW50IFRQTCBpcyBub3QgVFBMX0FQUExJQ0FUSU9ODQoNCi0tKi8NCjsNCg0KDQpFRklfU1RBVFVTDQpFRklBUEkNCkNvcmVDbG9zZUV2ZW50ICgNCiAgSU4gRUZJX0VWRU5UICAgICAgICAgICAgRXZlbnQNCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIENsb3NlcyBhbiBldmVudCBhbmQgZnJlZXMgdGhlIGV2ZW50IHN0cnVjdHVyZS4NCiAgICANCkFyZ3VtZW50czoNCg0KICBVc2VyRXZlbnQgLSBFdmVudCB0byBjbG9zZQ0KICAgIA0KUmV0dXJuczoNCg0KICBFRklfSU5WQUxJRF9QQVJBTUVURVIgLSBQYXJhbWV0ZXJzIGFyZSBub3QgdmFsaWQuDQogIA0KICBFRklfU1VDQ0VTUyAtIFRoZSBldmVudCBoYXMgYmVlbiBjbG9zZWQNCg0KLS0qLw0KOw0KDQoNCkVGSV9TVEFUVVMNCkVGSUFQSQ0KQ29yZUNoZWNrRXZlbnQgKA0KICBJTiBFRklfRVZFTlQgICAgICAgICAgICBFdmVudA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgQ2hlY2sgdGhlIHN0YXR1cyBvZiBhbiBldmVudA0KICAgIA0KQXJndW1lbnRzOg0KDQogIFVzZXJFdmVudCAtIFRoZSBldmVudCB0byBjaGVjaw0KICAgIA0KUmV0dXJuczoNCg0KICBFRklfU1VDQ0VTUyAgICAgICAgICAgLSBUaGUgZXZlbnQgaXMgaW4gdGhlIHNpZ25hbGVkIHN0YXRlDQogIEVGSV9OT1RfUkVBRFkgICAgICAgICAtIFRoZSBldmVudCBpcyBub3QgaW4gdGhlIHNpZ25hbGVkIHN0YXRlDQogIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAtIEV2ZW50IGlzIG9mIHR5cGUgRVZUX05PVElGWV9TSUdOQUwNCg0KLS0qLw0KOw0KDQpFRklfU1RBVFVTDQpDb3JlQWRkTWVtb3J5U3BhY2UgKA0KICBJTiBFRklfR0NEX01FTU9SWV9UWVBFICAgR2NkTWVtb3J5VHlwZSwNCiAgSU4gRUZJX1BIWVNJQ0FMX0FERFJFU1MgIEJhc2VBZGRyZXNzLA0KICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgTGVuZ3RoLA0KICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgQ2FwYWJpbGl0aWVzDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBBZGQgYSBzZWdtZW50IG9mIG1lbW9yeSBzcGFjZSB0byBHQ0QgbWFwIGFuZCBhZGQgYWxsIGF2YWlsYWJsZSBwYWdlcyBpbiB0aGlzIHNlZ21lbnQgDQogIGFzIG1lbW9yeSBkZXNjcmlwdG9ycy4NCg0KQXJndW1lbnRzOg0KICAgIA0KICBHY2RNZW1vcnlUeXBlICAgICAtIE1lbW9yeSB0eXBlIG9mIHRoZSBzZWdtZW50Lg0KICANCiAgQmFzZUFkZHJlc3MgICAgICAgLSBCYXNlIGFkZHJlc3Mgb2YgdGhlIHNlZ21lbnQuDQogIA0KICBMZW5ndGggICAgICAgICAgICAtIExlbmd0aCBvZiB0aGUgc2VnbWVudC4NCiAgDQogIENhcGFiaWxpdGllcyAgICAgIC0gYWx0ZXJhYmxlIGF0dHJpYnV0ZXMgb2YgdGhlIHNlZ21lbnQuDQoNClJldHVybnM6DQoNCiAgRUZJX1NVQ0NFU1MgICAgICAgLSBNZXJnZWQgdGhpcyBzZWdtZW50IGludG8gR0NEIG1hcC4NCg0KLS0qLw0KOw0KDQpFRklfU1RBVFVTDQpDb3JlQWxsb2NhdGVNZW1vcnlTcGFjZSAoDQogIElOICAgICBFRklfR0NEX0FMTE9DQVRFX1RZUEUgIEdjZEFsbG9jYXRlVHlwZSwNCiAgSU4gICAgIEVGSV9HQ0RfTUVNT1JZX1RZUEUgICAgR2NkTWVtb3J5VHlwZSwNCiAgSU4gICAgIFVJTlROICAgICAgICAgICAgICAgICAgQWxpZ25tZW50LA0KICBJTiAgICAgVUlOVDY0ICAgICAgICAgICAgICAgICBMZW5ndGgsDQogIElOIE9VVCBFRklfUEhZU0lDQUxfQUREUkVTUyAgICpCYXNlQWRkcmVzcywNCiAgSU4gICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgSW1hZ2VIYW5kbGUsDQogIElOICAgICBFRklfSEFORExFICAgICAgICAgICAgIERldmljZUhhbmRsZSBPUFRJT05BTA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgQWxsb2NhdGUgbWVtb3J5IHNwYWNlIG9uIEdDRCBtYXAuDQoNCkFyZ3VtZW50czoNCiAgDQogIEdjZEFsbG9jYXRlVHlwZSAgIC0gVGhlIHR5cGUgb2YgYWxsb2NhdGUgb3BlcmF0aW9uDQogIA0KICBHY2RNZW1vcnlUeXBlICAgICAtIFRoZSBkZXNpcmVkIG1lbW9yeSB0eXBlDQogIA0KICBBbGlnbm1lbnQgICAgICAgICAtIEFsaWduIHdpdGggMl5BbGlnbm1lbnQNCiAgDQogIExlbmd0aCAgICAgICAgICAgIC0gTGVuZ3RoIHRvIGFsbG9jYXRlDQogIA0KICBCYXNlQWRkcmVzcyAgICAgICAtIEJhc2UgYWRkcmVzcyB0byBhbGxvY2F0ZQ0KICANCiAgSW1hZ2VIYW5kbGUgICAgICAgLSBUaGUgaW1hZ2UgaGFuZGxlIGNvbnN1bWUgdGhlIGFsbG9jYXRlZCBzcGFjZS4NCiAgDQogIERldmljZUhhbmRsZSAgICAgIC0gVGhlIGRldmljZSBoYW5kbGUgY29uc3VtZSB0aGUgYWxsb2NhdGVkIHNwYWNlLg0KDQpSZXR1cm5zOg0KDQogIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAgICAgICAtIEludmFsaWQgcGFyYW1ldGVyLg0KICANCiAgRUZJX05PVF9GT1VORCAgICAgICAgICAgICAgIC0gTm8gZGVzY3JpcHRvciBjb250YWlucyB0aGUgZGVzaXJlZCBzcGFjZS4NCiAgDQogIEVGSV9TVUNDRVNTICAgICAgICAgICAgICAgICAtIE1lbW9yeSBzcGFjZSBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLg0KDQotLSovDQo7DQoNCkVGSV9TVEFUVVMNCkNvcmVGcmVlTWVtb3J5U3BhY2UgKA0KICBJTiBFRklfUEhZU0lDQUxfQUREUkVTUyAgQmFzZUFkZHJlc3MsDQogIElOIFVJTlQ2NCAgICAgICAgICAgICAgICBMZW5ndGgNCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOlJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgRnJlZSBhIHNlZ21lbnQgb2YgbWVtb3J5IHNwYWNlIGluIEdDRCBtYXAuDQoNCkFyZ3VtZW50czoNCiAgICANCiAgQmFzZUFkZHJlc3MgICAgICAgLSBCYXNlIGFkZHJlc3Mgb2YgdGhlIHNlZ21lbnQuDQogIA0KICBMZW5ndGggICAgICAgICAgICAtIExlbmd0aCBvZiB0aGUgc2VnbWVudC4NCiAgDQpSZXR1cm5zOg0KDQogIEVGSV9TVUNDRVNTICAgICAgIC0gU3BhY2Ugc3VjY2Vzc2Z1bGx5IGZyZWVkLg0KDQotLSovDQo7DQoNCkVGSV9TVEFUVVMNCkNvcmVSZW1vdmVNZW1vcnlTcGFjZSAoDQogIElOIEVGSV9QSFlTSUNBTF9BRERSRVNTICBCYXNlQWRkcmVzcywNCiAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgIExlbmd0aA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246Um91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBSZW1vdmUgYSBzZWdtZW50IG9mIG1lbW9yeSBzcGFjZSBpbiBHQ0QgbWFwLg0KDQpBcmd1bWVudHM6DQogICAgDQogIEJhc2VBZGRyZXNzICAgICAgIC0gQmFzZSBhZGRyZXNzIG9mIHRoZSBzZWdtZW50Lg0KICANCiAgTGVuZ3RoICAgICAgICAgICAgLSBMZW5ndGggb2YgdGhlIHNlZ21lbnQuDQogIA0KUmV0dXJuczoNCg0KICBFRklfU1VDQ0VTUyAgICAgICAtIFN1Y2Nlc3NmdWxseSBhIHNlZ21lbnQgb2YgbWVtb3J5IHNwYWNlLg0KDQotLSovDQo7DQoNCkVGSV9TVEFUVVMNCkNvcmVHZXRNZW1vcnlTcGFjZURlc2NyaXB0b3IgKA0KICBJTiAgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAgICAgQmFzZUFkZHJlc3MsDQogIE9VVCBFRklfR0NEX01FTU9SWV9TUEFDRV9ERVNDUklQVE9SICAqRGVzY3JpcHRvcg0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgU2VhcmNoIGFsbCBlbnRyaWVzIGluIEdDRCBtYXAgd2hpY2ggY29udGFpbnMgc3BlY2lmaWVkIHNlZ21lbnQgYW5kIGJ1aWxkIGl0IHRvIGEgZGVzY3JpcHRvci4NCg0KQXJndW1lbnRzOg0KDQogIEJhc2VBZGRyZXNzICAgICAgIC0gU3BlY2lmaWVkIHN0YXJ0IGFkZHJlc3MNCiAgDQogIERlc2NyaXB0b3IgICAgICAgIC0gU3BlY2lmaWVkIGxlbmd0aA0KDQpSZXR1cm5zOg0KDQogIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAgICAgICAtIEludmFsaWQgcGFyYW1ldGVyDQogIA0KICBFRklfU1VDQ0VTUyAgICAgICAgICAgICAgICAgLSBTdWNjZXNzZnVsbHkgZ2V0IG1lbW9yeSBzcGFjZSBkZXNjcmlwdG9yLg0KDQotLSovDQo7DQoNCkVGSV9TVEFUVVMNCkNvcmVTZXRNZW1vcnlTcGFjZUF0dHJpYnV0ZXMgKA0KICBJTiBFRklfUEhZU0lDQUxfQUREUkVTUyAgQmFzZUFkZHJlc3MsDQogIElOIFVJTlQ2NCAgICAgICAgICAgICAgICBMZW5ndGgsDQogIElOIFVJTlQ2NCAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBTZXQgbWVtb3J5IHNwYWNlIHdpdGggc3BlY2lmaWVkIGF0dHJpYnV0ZXMuDQoNCkFyZ3VtZW50czoNCg0KICBCYXNlQWRkcmVzcyAgICAgICAtIFNwZWNpZmllZCBzdGFydCBhZGRyZXNzDQogIA0KICBMZW5ndGggICAgICAgICAgICAtIFNwZWNpZmllZCBsZW5ndGgNCiAgDQogIEF0dHJpYnV0ZXMgICAgICAgIC0gU3BlY2lmaWVkIGF0dHJpYnV0ZXMNCg0KUmV0dXJuczoNCg0KICBFRklfU1VDQ0VTUyAgICAgICAtIFN1Y2Nlc3NmdWxseSBzZXQgYXR0cmlidXRlIG9mIGEgc2VnbWVudCBvZiBtZW1vcnkgc3BhY2UuDQoNCi0tKi8NCjsNCg0KRUZJX1NUQVRVUw0KQ29yZUdldE1lbW9yeVNwYWNlTWFwICgNCiAgT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICpOdW1iZXJPZkRlc2NyaXB0b3JzLA0KICBPVVQgRUZJX0dDRF9NRU1PUllfU1BBQ0VfREVTQ1JJUFRPUiAgKipNZW1vcnlTcGFjZU1hcA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgVHJhbnNlciBhbGwgZW50cmllcyBvZiBHQ0QgbWVtb3J5IG1hcCBpbnRvIG1lbW9yeSBkZXNjcmlwdG9ycyBhbmQgcGFzcyB0byBjYWxsZXIuDQoNCkFyZ3VtZW50czoNCg0KICBOdW1iZXJPZkRlc2NyaXB0b3JzICAgICAgIC0gTnVtYmVyIG9mIGRlc2NyaXB0b3JzLg0KICANCiAgTWVtb3J5U3BhY2VNYXAgICAgICAgICAgICAtIERlc2NyaXB0b3IgYXJyYXkNCg0KUmV0dXJuczoNCg0KICBFRklfSU5WQUxJRF9QQVJBTUVURVIgICAgIC0gSW52YWxpZCBwYXJhbWV0ZXINCiAgDQogIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICAgICAgLSBObyBlbm91Z2ggYnVmZmVyIHRvIGFsbG9jYXRlDQogIA0KICBFRklfU1VDQ0VTUyAgICAgICAgICAgICAgIC0gU3VjY2Vzc2Z1bGx5IGdldCBtZW1vcnkgc3BhY2UgbWFwLg0KDQotLSovDQo7DQoNCkVGSV9TVEFUVVMNCkNvcmVBZGRJb1NwYWNlICgNCiAgSU4gRUZJX0dDRF9JT19UWVBFICAgICAgIEdjZElvVHlwZSwNCiAgSU4gRUZJX1BIWVNJQ0FMX0FERFJFU1MgIEJhc2VBZGRyZXNzLA0KICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgTGVuZ3RoDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBBZGQgYSBzZWdtZW50IG9mIElPIHNwYWNlIHRvIEdDRCBtYXAuDQoNCkFyZ3VtZW50czoNCiAgICANCiAgR2NkSW9UeXBlICAgICAgICAgLSBJTyB0eXBlIG9mIHRoZSBzZWdtZW50Lg0KICANCiAgQmFzZUFkZHJlc3MgICAgICAgLSBCYXNlIGFkZHJlc3Mgb2YgdGhlIHNlZ21lbnQuDQogIA0KICBMZW5ndGggICAgICAgICAgICAtIExlbmd0aCBvZiB0aGUgc2VnbWVudC4NCg0KUmV0dXJuczoNCg0KICBFRklfU1VDQ0VTUyAgICAgICAtIE1lcmdlZCB0aGlzIHNlZ21lbnQgaW50byBHQ0QgbWFwLg0KDQotLSovDQo7DQoNCkVGSV9TVEFUVVMNCkNvcmVBbGxvY2F0ZUlvU3BhY2UgKA0KICBJTiAgICAgRUZJX0dDRF9BTExPQ0FURV9UWVBFICBHY2RBbGxvY2F0ZVR5cGUsDQogIElOICAgICBFRklfR0NEX0lPX1RZUEUgICAgICAgIEdjZElvVHlwZSwNCiAgSU4gICAgIFVJTlROICAgICAgICAgICAgICAgICAgQWxpZ25tZW50LA0KICBJTiAgICAgVUlOVDY0ICAgICAgICAgICAgICAgICBMZW5ndGgsDQogIElOIE9VVCBFRklfUEhZU0lDQUxfQUREUkVTUyAgICpCYXNlQWRkcmVzcywNCiAgSU4gICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgSW1hZ2VIYW5kbGUsDQogIElOICAgICBFRklfSEFORExFICAgICAgICAgICAgIERldmljZUhhbmRsZSBPUFRJT05BTA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgQWxsb2NhdGUgSU8gc3BhY2Ugb24gR0NEIG1hcC4NCg0KQXJndW1lbnRzOg0KICANCiAgR2NkQWxsb2NhdGVUeXBlICAgLSBUaGUgdHlwZSBvZiBhbGxvY2F0ZSBvcGVyYXRpb24NCiAgDQogIEdjZElvVHlwZSAgICAgICAgIC0gVGhlIGRlc2lyZWQgSU8gdHlwZQ0KICANCiAgQWxpZ25tZW50ICAgICAgICAgLSBBbGlnbiB3aXRoIDJeQWxpZ25tZW50DQogIA0KICBMZW5ndGggICAgICAgICAgICAtIExlbmd0aCB0byBhbGxvY2F0ZQ0KICANCiAgQmFzZUFkZHJlc3MgICAgICAgLSBCYXNlIGFkZHJlc3MgdG8gYWxsb2NhdGUNCiAgDQogIEltYWdlSGFuZGxlICAgICAgIC0gVGhlIGltYWdlIGhhbmRsZSBjb25zdW1lIHRoZSBhbGxvY2F0ZWQgc3BhY2UuDQogIA0KICBEZXZpY2VIYW5kbGUgICAgICAtIFRoZSBkZXZpY2UgaGFuZGxlIGNvbnN1bWUgdGhlIGFsbG9jYXRlZCBzcGFjZS4NCg0KUmV0dXJuczoNCg0KICBFRklfSU5WQUxJRF9QQVJBTUVURVIgICAgICAgLSBJbnZhbGlkIHBhcmFtZXRlci4NCiAgDQogIEVGSV9OT1RfRk9VTkQgICAgICAgICAgICAgICAtIE5vIGRlc2NyaXB0b3IgY29udGFpbnMgdGhlIGRlc2lyZWQgc3BhY2UuDQogIA0KICBFRklfU1VDQ0VTUyAgICAgICAgICAgICAgICAgLSBJTyBzcGFjZSBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLg0KDQotLSovDQo7DQoNCkVGSV9TVEFUVVMNCkNvcmVGcmVlSW9TcGFjZSAoDQogIElOIEVGSV9QSFlTSUNBTF9BRERSRVNTICBCYXNlQWRkcmVzcywNCiAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgIExlbmd0aA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246Um91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBGcmVlIGEgc2VnbWVudCBvZiBJTyBzcGFjZSBpbiBHQ0QgbWFwLg0KDQpBcmd1bWVudHM6DQogICAgDQogIEJhc2VBZGRyZXNzICAgICAgIC0gQmFzZSBhZGRyZXNzIG9mIHRoZSBzZWdtZW50Lg0KICANCiAgTGVuZ3RoICAgICAgICAgICAgLSBMZW5ndGggb2YgdGhlIHNlZ21lbnQuDQogIA0KUmV0dXJuczoNCg0KICBFRklfU1VDQ0VTUyAgICAgICAtIFNwYWNlIHN1Y2Nlc3NmdWxseSBmcmVlZC4NCg0KLS0qLw0KOw0KDQpFRklfU1RBVFVTDQpDb3JlUmVtb3ZlSW9TcGFjZSAoDQogIElOIEVGSV9QSFlTSUNBTF9BRERSRVNTICBCYXNlQWRkcmVzcywNCiAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgIExlbmd0aA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246Um91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBSZW1vdmUgYSBzZWdtZW50IG9mIElPIHNwYWNlIGluIEdDRCBtYXAuDQoNCkFyZ3VtZW50czoNCiAgICANCiAgQmFzZUFkZHJlc3MgICAgICAgLSBCYXNlIGFkZHJlc3Mgb2YgdGhlIHNlZ21lbnQuDQogIA0KICBMZW5ndGggICAgICAgICAgICAtIExlbmd0aCBvZiB0aGUgc2VnbWVudC4NCiAgDQpSZXR1cm5zOg0KDQogIEVGSV9TVUNDRVNTICAgICAgIC0gU3VjY2Vzc2Z1bGx5IHJlbW92ZWQgYSBzZWdtZW50IG9mIElPIHNwYWNlLg0KDQotLSovDQo7DQoNCkVGSV9TVEFUVVMNCkNvcmVHZXRJb1NwYWNlRGVzY3JpcHRvciAoDQogIElOICBFRklfUEhZU0lDQUxfQUREUkVTUyAgICAgICAgIEJhc2VBZGRyZXNzLA0KICBPVVQgRUZJX0dDRF9JT19TUEFDRV9ERVNDUklQVE9SICAqRGVzY3JpcHRvcg0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgU2VhcmNoIGFsbCBlbnRyaWVzIGluIEdDRCBtYXAgd2hpY2ggY29udGFpbnMgc3BlY2lmaWVkIHNlZ21lbnQgYW5kIGJ1aWxkIGl0IHRvIGEgZGVzY3JpcHRvci4NCg0KQXJndW1lbnRzOg0KDQogIEJhc2VBZGRyZXNzICAgICAgIC0gU3BlY2lmaWVkIHN0YXJ0IGFkZHJlc3MNCiAgDQogIERlc2NyaXB0b3IgICAgICAgIC0gU3BlY2lmaWVkIGxlbmd0aA0KDQpSZXR1cm5zOg0KDQogIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAgICAgICAtIERlc2NyaXB0b3IgaXMgTlVMTC4NCiAgDQogIEVGSV9TVUNDRVNTICAgICAgICAgICAgICAgICAtIFN1Y2Nlc3NmdWxseSBnZXQgdGhlIElPIHNwYWNlIGRlc2NyaXB0b3IuDQoNCi0tKi8NCjsNCg0KRUZJX1NUQVRVUw0KQ29yZUdldElvU3BhY2VNYXAgKA0KICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAqTnVtYmVyT2ZEZXNjcmlwdG9ycywNCiAgT1VUIEVGSV9HQ0RfSU9fU1BBQ0VfREVTQ1JJUFRPUiAgKipJb1NwYWNlTWFwDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBUcmFuc2VyIGFsbCBlbnRyaWVzIG9mIEdDRCBJTyBtYXAgaW50byBJTyBkZXNjcmlwdG9ycyBhbmQgcGFzcyB0byBjYWxsZXIuDQoNCkFyZ3VtZW50czoNCg0KICBOdW1iZXJPZkRlc2NyaXB0b3JzICAgICAgIC0gTnVtYmVyIG9mIGRlc2NyaXB0b3JzLg0KICANCiAgSW9TcGFjZU1hcCAgICAgICAgICAgICAgICAtIERlc2NyaXB0b3IgYXJyYXkNCg0KUmV0dXJuczoNCg0KICBFRklfSU5WQUxJRF9QQVJBTUVURVIgICAgIC0gSW52YWxpZCBwYXJhbWV0ZXINCiAgDQogIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICAgICAgLSBObyBlbm91Z2ggYnVmZmVyIHRvIGFsbG9jYXRlDQogIA0KICBFRklfU1VDQ0VTUyAgICAgICAgICAgICAgIC0gU3VjY2Vzc2Z1bGx5IGdldCBJTyBzcGFjZSBtYXAuDQoNCi0tKi8NCjsNCg0KRUZJX0RYRVNFUlZJQ0UNCkVGSV9TVEFUVVMNCkVGSUFQSQ0KQ29yZURpc3BhdGNoZXIgKA0KICBWT0lEDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBUaGlzIGlzIHRoZSBtYWluIERpc3BhdGNoZXIgZm9yIERYRSBhbmQgaXQgZXhpdHMgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSANCiAgZHJpdmVycyB0byBydW4uIERyYWluIHRoZSBtU2NoZWR1bGVkUXVldWUgYW5kIGxvYWQgYW5kIHN0YXJ0IGEgUEUNCiAgaW1hZ2UgZm9yIGVhY2ggZHJpdmVyLiBTZWFyY2ggdGhlIG1EaXNjb3ZlcmVkTGlzdCB0byBzZWUgaWYgYW55IGRyaXZlciBjYW4gDQogIGJlIHBsYWNlZCBvbiB0aGUgbVNjaGVkdWxlZFF1ZXVlLiBJZiBubyBkcml2ZXJzIGFyZSBwbGFjZWQgb24gdGhlDQogIG1TY2hlZHVsZWRRdWV1ZSBleGl0IHRoZSBmdW5jdGlvbi4gT24gZXhpdCBpdCBpcyBhc3N1bWVkIHRoZSBCZHMoKQ0KICB3aWxsIGJlIGNhbGxlZCwgYW5kIHdoZW4gdGhlIEJkcygpIGV4aXRzIHRoZSBEaXNwYXRjaGVyIHdpbGwgYmUgY2FsbGVkIA0KICBhZ2Fpbi4NCg0KQXJndW1lbnRzOg0KDQogIE5PTkUNCg0KUmV0dXJuczoNCg0KICBFRklfQUxSRUFEWV9TVEFSVEVEIC0gVGhlIERYRSBEaXNwYXRjaGVyIGlzIGFscmVhZHkgcnVubmluZw0KDQogIEVGSV9OT1RfRk9VTkQgICAgICAgLSBObyBEWEUgRHJpdmVycyB3ZXJlIGRpc3BhdGNoZWQNCg0KICBFRklfU1VDQ0VTUyAgICAgICAgIC0gT25lIG9yIG1vcmUgRFhFIERyaXZlcnMgd2VyZSBkaXNwYXRjaGVkDQoNCi0tKi8NCjsNCkVGSV9EWEVTRVJWSUNFDQpFRklfU1RBVFVTDQpFRklBUEkNCkNvcmVTY2hlZHVsZSAoDQogIElOICBFRklfSEFORExFICBGaXJtd2FyZVZvbHVtZUhhbmRsZSwNCiAgSU4gIEVGSV9HVUlEICAgICpEcml2ZXJOYW1lDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBDaGVjayBldmVyeSBkcml2ZXIgYW5kIGxvY2F0ZSBhIG1hdGNoaW5nIG9uZS4gSWYgdGhlIGRyaXZlciBpcyBmb3VuZCwgdGhlIFVucmVxdWVzdGVkDQogIHN0YXRlIGZsYWcgaXMgY2xlYXJlZC4NCg0KQXJndW1lbnRzOg0KDQogIEZpcm13YXJlVm9sdW1lSGFuZGxlIC0gVGhlIGhhbmRsZSBvZiB0aGUgRmlybXdhcmUgVm9sdW1lIHRoYXQgY29udGFpbnMgdGhlIGZpcm13YXJlIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgc3BlY2lmaWVkIGJ5IERyaXZlck5hbWUuDQoNCiAgRHJpdmVyTmFtZSAgICAgICAgICAgLSBUaGUgRHJpdmVyIG5hbWUgdG8gcHV0IGluIHRoZSBEZXBlbmRlbnQgc3RhdGUuDQoNClJldHVybnM6DQoNCiAgRUZJX1NVQ0NFU1MgICAtIFRoZSBEcml2ZXJOYW1lIHdhcyBmb3VuZCBhbmQgaXQncyBTT1IgYml0IHdhcyBjbGVhcmVkDQoNCiAgRUZJX05PVF9GT1VORCAtIFRoZSBEcml2ZXJOYW1lIGRvZXMgbm90IGV4aXN0IG9yIGl0J3MgU09SIGJpdCB3YXMgbm90IHNldC4NCg0KLS0qLw0KOw0KDQpFRklfRFhFU0VSVklDRQ0KRUZJX1NUQVRVUw0KRUZJQVBJDQpDb3JlVHJ1c3QgKA0KICBJTiAgRUZJX0hBTkRMRSAgRmlybXdhcmVWb2x1bWVIYW5kbGUsDQogIElOICBFRklfR1VJRCAgICAqRHJpdmVyTmFtZQ0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgQ29udmVydCBhIGRyaXZlciBmcm9tIHRoZSBVbnRydXNlZCBiYWNrIHRvIHRoZSBTY2hlZHVsZWQgc3RhdGUNCg0KQXJndW1lbnRzOg0KDQogIEZpcm13YXJlVm9sdW1lSGFuZGxlIC0gVGhlIGhhbmRsZSBvZiB0aGUgRmlybXdhcmUgVm9sdW1lIHRoYXQgY29udGFpbnMgdGhlIGZpcm13YXJlIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgc3BlY2lmaWVkIGJ5IERyaXZlck5hbWUuDQoNCiAgRHJpdmVyTmFtZSAgICAgICAgICAgLSBUaGUgRHJpdmVyIG5hbWUgdG8gcHV0IGluIHRoZSBTY2hlZHVsZWQgc3RhdGUNCg0KUmV0dXJuczoNCg0KICBFRklfU1VDQ0VTUyAgIC0gVGhlIGZpbGUgd2FzIGZvdW5kIGluIHRoZSB1bnRydXN0ZWQgc3RhdGUsIGFuZCBpdCB3YXMgcHJvbW90ZWQgDQogICAgICAgICAgICAgICAgICB0byB0aGUgdHJ1c3RlZCBzdGF0ZS4NCg0KICBFRklfTk9UX0ZPVU5EIC0gVGhlIGZpbGUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgdW50cnVzdGVkIHN0YXRlLg0KDQotLSovDQo7DQoNCkJPT0xFQU4NCkNvcmVHcm93QnVmZmVyICgNCiAgSU4gT1VUIEVGSV9TVEFUVVMgICAgICAgKlN0YXR1cywNCiAgSU4gT1VUIFZPSUQgICAgICAgICAgICAgKipCdWZmZXIsDQogIElOICAgICBVSU5UTiAgICAgICAgICAgIEJ1ZmZlclNpemUNCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogICAgSGVscGVyIGZ1bmN0aW9uIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBjb2RlIG5lZWRlZA0KICAgIHRvIGFsbG9jYXRlIHRoZSBwcm9wZXIgc2l6ZWQgYnVmZmVyIGZvciB2YXJpb3VzIA0KICAgIEVGSSBpbnRlcmZhY2VzLg0KDQpBcmd1bWVudHM6DQoNCiAgICBTdGF0dXMgICAgICAtIEN1cnJlbnQgc3RhdHVzDQoNCiAgICBCdWZmZXIgICAgICAtIEN1cnJlbnQgYWxsb2NhdGVkIGJ1ZmZlciwgb3IgTlVMTA0KDQogICAgQnVmZmVyU2l6ZSAgLSBDdXJyZW50IGJ1ZmZlciBzaXplIG5lZWRlZA0KICAgIA0KUmV0dXJuczoNCiAgICANCiAgICBUUlVFIC0gaWYgdGhlIGJ1ZmZlciB3YXMgcmVhbGxvY2F0ZWQgYW5kIHRoZSBjYWxsZXIgDQogICAgc2hvdWxkIHRyeSB0aGUgQVBJIGFnYWluLg0KDQogICAgRkFMU0UgLSBidWZmZXIgY291bGQgbm90IGJlIGFsbG9jYXRlZCBhbmQgdGhlIGNhbGxlcg0KICAgIHNob3VsZCBub3QgdHJ5IHRoZSBBUEkgYWdhaW4uDQoNCi0tKi8NCjsNCg0KRUZJX1NUQVRVUw0KRUZJQVBJDQpGd1ZvbERyaXZlckluaXQgKA0KICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlLA0KICBJTiBFRklfU1lTVEVNX1RBQkxFICAgICAgICAgICAgICpTeXN0ZW1UYWJsZQ0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQogICAgVGhpcyByb3V0aW5lIGlzIHRoZSBkcml2ZXIgaW5pdGlhbGl6YXRpb24gZW50cnkgcG9pbnQuICBJdCBpbml0aWFsaXplcyB0aGUNCiAgICBsaWJyYXJpZXMsIGFuZCByZWdpc3RlcnMgdHdvIG5vdGlmaWNhdGlvbiBmdW5jdGlvbnMuICBUaGVzZSBub3RpZmljYXRpb24NCiAgICBmdW5jdGlvbnMgYXJlIHJlc3BvbnNpYmxlIGZvciBidWlsZGluZyB0aGUgRlYgc3RhY2sgZHluYW1pY2FsbHkuDQogICAgDQpBcmd1bWVudHM6DQogICAgSW1hZ2VIYW5kbGUgICAtIFRoZSBpbWFnZSBoYW5kbGUuDQogICAgU3lzdGVtVGFibGUgICAtIFRoZSBzeXN0ZW0gdGFibGUuDQogICAgDQpSZXR1cm5zOg0KICAgIEVGSV9TVUNDRVNTICAgLSBGdW5jdGlvbiBzdWNjZXNzZnVsbHkgcmV0dXJuZWQuDQoNCi0tKi8NCjsNCg0KRUZJX1NUQVRVUw0KRUZJQVBJDQpJbml0aWFsaXplU2VjdGlvbkV4dHJhY3Rpb24gKA0KICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlLA0KICBJTiBFRklfU1lTVEVNX1RBQkxFICAgICAgICAgICAgICpTeXN0ZW1UYWJsZQ0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246IA0KICBFbnRyeSBwb2ludCBvZiB0aGUgc2VjdGlvbiBleHRyYWN0aW9uIGNvZGUuIEluaXRpYWxpemVzIGFuIGluc3RhbmNlIG9mIHRoZSANCiAgc2VjdGlvbiBleHRyYWN0aW9uIGludGVyZmFjZSBhbmQgaW5zdGFsbHMgaXQgb24gYSBuZXcgaGFuZGxlLg0KDQpBcmd1bWVudHM6ICANCiAgSW1hZ2VIYW5kbGUgICBFRklfSEFORExFOiBBIGhhbmRsZSBmb3IgdGhlIGltYWdlIHRoYXQgaXMgaW5pdGlhbGl6aW5nIHRoaXMgZHJpdmVyDQogIFN5c3RlbVRhYmxlICAgRUZJX1NZU1RFTV9UQUJMRTogQSBwb2ludGVyIHRvIHRoZSBFRkkgc3lzdGVtIHRhYmxlICAgICAgICANCg0KUmV0dXJuczogIA0KICBFRklfU1VDQ0VTUzogIERyaXZlciBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkNCiAgRUZJX09VVF9PRl9SRVNPVVJDRVM6ICAgQ291bGQgbm90IGFsbG9jYXRlIG5lZWRlZCByZXNvdXJjZXMNCg0KLS0qLw0KOw0KDQpFRklfU1RBVFVTDQpDb3JlUHJvY2Vzc0Zpcm13YXJlVm9sdW1lICgNCiAgSU4gIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgKkZ2SGVhZGVyLA0KICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBTaXplLCANCiAgT1VUIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgKkZWUHJvdG9jb2xIYW5kbGUNCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KICAgIFRoaXMgRFhFIHNlcnZpY2Ugcm91dGluZSBpcyB1c2VkIHRvIHByb2Nlc3MgYSBmaXJtd2FyZSB2b2x1bWUuIEluDQogICAgcGFydGljdWxhciwgaXQgY2FuIGJlIGNhbGxlZCBieSBCRFMgdG8gcHJvY2VzcyBhIHNpbmdsZSBmaXJtd2FyZQ0KICAgIHZvbHVtZSBmb3VuZCBpbiBhIGNhcHN1bGUuIA0KDQpBcmd1bWVudHM6DQogICAgRnZIZWFkZXIgICAgICAgICAgICAgIC0gcG9pbnRlciB0byBhIGZpcm13YXJlIHZvbHVtZSBoZWFkZXINCiAgICBTaXplICAgICAgICAgICAgICAgICAgLSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgRnZIZWFkZXINCiAgICBGVlByb3RvY29sSGFuZGxlICAgICAgLSB0aGUgaGFuZGxlIG9uIHdoaWNoIGEgZmlybXdhcmUgdm9sdW1lIHByb3RvY29sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIHByb2R1Y2VkIGZvciB0aGUgZmlybXdhcmUgdm9sdW1lIHBhc3NlZCBpbi4NCg0KUmV0dXJuczoNCiAgICBFRklfT1VUX09GX1JFU09VUkNFUyAgLSBpZiBhbiBGVkIgY291bGQgbm90IGJlIHByb2R1Y2VkIGR1ZSB0byBsYWNrIG9mIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbSByZXNvdXJjZXMNCiAgICBFRklfVk9MVU1FX0NPUlJVUFRFRCAgLSBpZiB0aGUgdm9sdW1lIHdhcyBjb3JydXB0ZWQNCiAgICBFRklfU1VDQ0VTUyAgICAgICAgICAgLSBhIGZpcm13YXJlIHZvbHVtZSBwcm90b2NvbCB3YXMgcHJvZHVjZWQgZm9yIHRoZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcm13YXJlIHZvbHVtZQ0KDQotLSovDQo7DQoNCi8vDQovL0Z1bmN0aW9ucyB1c2VkIGR1cmluZyBkZWJ1ZyBidWlscw0KLy8NClZPSUQNCkNvcmVEaXNwbGF5TWlzc2luZ0FyY2hQcm90b2NvbHMgKA0KICBWT0lEDQogICkNCi8qKysNCg0KICBSb3V0aW5lIERlc2NyaXB0aW9uOg0KICBEaXNwbGF5cyBBcmNoaXRlY3R1cmFsIHByb3RvY29scyB0aGF0IHdlcmUgbm90IGxvYWRlZCBhbmQgYXJlIHJlcXVpcmVkIGZvciBEWEUgY29yZSB0byBmdW5jdGlvbg0KICBPbmx5IHVzZWQgaW4gRGVidWcgQnVpbGRzDQoNCiAgQXJndW1lbnRzOg0KICAgIE5PTkUNCg0KICBSZXR1cm5zOg0KICAgIE5PTkUNCg0KLS0qLzsNCiAgDQpWT0lEDQpDb3JlRGlzcGxheURpc2NvdmVyZWROb3REaXNwYXRjaGVkICgNCiAgVk9JRA0KICApDQovKisrDQoNCiAgUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICAgIFRyYXZlcnNlIHRoZSBkaXNjb3ZlcmVkIGxpc3QgZm9yIGFueSBkcml2ZXJzIHRoYXQgd2VyZSBkaXNjb3ZlcmVkIGJ1dCBub3QgbG9hZGVkIA0KICAgIGJlY2F1c2UgdGhlIGRlcGVuZGVuY3kgZXhwZXJlc3Npb25zIGV2YWx1YXRlZCB0byBmYWxzZQ0KDQogIEFyZ3VtZW50czoNCg0KICAgIE5PTkUNCg0KICBSZXR1cm5zOg0KDQogICAgTk9ORSANCg0KLS0qLzsNCiNlbmRpZg0K