1# this config is created through command
2# mixgen adapter -c $REPO_ROOT/mixer/adapter/opa/config/config.proto_descriptor -o $REPO_ROOT/mixer/adapter/opa/config -n opa -t authorization
3apiVersion: "config.istio.io/v1alpha2"
4kind: adapter
5metadata:
6  name: opa
7  namespace: istio-system
8spec:
9  description:
10  session_based: true
11  templates:
12  - authorization
13  config: Cun5AgogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiJNChFGaWxlRGVzY3JpcHRvclNldBI4CgRmaWxlGAEgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG9SBGZpbGUi5AQKE0ZpbGVEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIYCgdwYWNrYWdlGAIgASgJUgdwYWNrYWdlEh4KCmRlcGVuZGVuY3kYAyADKAlSCmRlcGVuZGVuY3kSKwoRcHVibGljX2RlcGVuZGVuY3kYCiADKAVSEHB1YmxpY0RlcGVuZGVuY3kSJwoPd2Vha19kZXBlbmRlbmN5GAsgAygFUg53ZWFrRGVwZW5kZW5jeRJDCgxtZXNzYWdlX3R5cGUYBCADKAsyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvUgttZXNzYWdlVHlwZRJBCgllbnVtX3R5cGUYBSADKAsyJC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90b1IIZW51bVR5cGUSQQoHc2VydmljZRgGIAMoCzInLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvUgdzZXJ2aWNlEkMKCWV4dGVuc2lvbhgHIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IJZXh0ZW5zaW9uEjYKB29wdGlvbnMYCCABKAsyHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNSB29wdGlvbnMSSQoQc291cmNlX2NvZGVfaW5mbxgJIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mb1IOc291cmNlQ29kZUluZm8SFgoGc3ludGF4GAwgASgJUgZzeW50YXgiuQYKD0Rlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjsKBWZpZWxkGAIgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUgVmaWVsZBJDCglleHRlbnNpb24YBiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhJBCgtuZXN0ZWRfdHlwZRgDIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SCm5lc3RlZFR5cGUSQQoJZW51bV90eXBlGAQgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlElgKD2V4dGVuc2lvbl9yYW5nZRgFIAMoCzIvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2VSDmV4dGVuc2lvblJhbmdlEkQKCm9uZW9mX2RlY2wYCCADKAsyJS5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG9SCW9uZW9mRGVjbBI5CgdvcHRpb25zGAcgASgLMh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zUgdvcHRpb25zElUKDnJlc2VydmVkX3JhbmdlGAkgAygLMi4uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYCiADKAlSDHJlc2VydmVkTmFtZRp6Cg5FeHRlbnNpb25SYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQSQAoHb3B0aW9ucxgDIAEoCzImLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnNSB29wdGlvbnMaNwoNUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQifAoVRXh0ZW5zaW9uUmFuZ2VPcHRpb25zElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIimAYKFEZpZWxkRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAMgASgFUgZudW1iZXISQQoFbGFiZWwYBCABKA4yKy5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWxSBWxhYmVsEj4KBHR5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZVIEdHlwZRIbCgl0eXBlX25hbWUYBiABKAlSCHR5cGVOYW1lEhoKCGV4dGVuZGVlGAIgASgJUghleHRlbmRlZRIjCg1kZWZhdWx0X3ZhbHVlGAcgASgJUgxkZWZhdWx0VmFsdWUSHwoLb25lb2ZfaW5kZXgYCSABKAVSCm9uZW9mSW5kZXgSGwoJanNvbl9uYW1lGAogASgJUghqc29uTmFtZRI3CgdvcHRpb25zGAggASgLMh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9uc1IHb3B0aW9ucyK2AgoEVHlwZRIPCgtUWVBFX0RPVUJMRRABEg4KClRZUEVfRkxPQVQQAhIOCgpUWVBFX0lOVDY0EAMSDwoLVFlQRV9VSU5UNjQQBBIOCgpUWVBFX0lOVDMyEAUSEAoMVFlQRV9GSVhFRDY0EAYSEAoMVFlQRV9GSVhFRDMyEAcSDQoJVFlQRV9CT09MEAgSDwoLVFlQRV9TVFJJTkcQCRIOCgpUWVBFX0dST1VQEAoSEAoMVFlQRV9NRVNTQUdFEAsSDgoKVFlQRV9CWVRFUxAMEg8KC1RZUEVfVUlOVDMyEA0SDQoJVFlQRV9FTlVNEA4SEQoNVFlQRV9TRklYRUQzMhAPEhEKDVRZUEVfU0ZJWEVENjQQEBIPCgtUWVBFX1NJTlQzMhAREg8KC1RZUEVfU0lOVDY0EBIiQwoFTGFiZWwSEgoOTEFCRUxfT1BUSU9OQUwQARISCg5MQUJFTF9SRVFVSVJFRBACEhIKDkxBQkVMX1JFUEVBVEVEEAMiYwoUT25lb2ZEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI3CgdvcHRpb25zGAIgASgLMh0uZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9uc1IHb3B0aW9ucyLjAgoTRW51bURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEj8KBXZhbHVlGAIgAygLMikuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90b1IFdmFsdWUSNgoHb3B0aW9ucxgDIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9uc1IHb3B0aW9ucxJdCg5yZXNlcnZlZF9yYW5nZRgEIAMoCzI2Lmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLkVudW1SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYBSADKAlSDHJlc2VydmVkTmFtZRo7ChFFbnVtUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQigwEKGEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhYKBm51bWJlchgCIAEoBVIGbnVtYmVyEjsKB29wdGlvbnMYAyABKAsyIS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9uc1IHb3B0aW9ucyKnAQoWU2VydmljZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEj4KBm1ldGhvZBgCIAMoCzImLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG9SBm1ldGhvZBI5CgdvcHRpb25zGAMgASgLMh8uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zUgdvcHRpb25zIokCChVNZXRob2REZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIdCgppbnB1dF90eXBlGAIgASgJUglpbnB1dFR5cGUSHwoLb3V0cHV0X3R5cGUYAyABKAlSCm91dHB1dFR5cGUSOAoHb3B0aW9ucxgEIAEoCzIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zUgdvcHRpb25zEjAKEGNsaWVudF9zdHJlYW1pbmcYBSABKAg6BWZhbHNlUg9jbGllbnRTdHJlYW1pbmcSMAoQc2VydmVyX3N0cmVhbWluZxgGIAEoCDoFZmFsc2VSD3NlcnZlclN0cmVhbWluZyKSCQoLRmlsZU9wdGlvbnMSIQoMamF2YV9wYWNrYWdlGAEgASgJUgtqYXZhUGFja2FnZRIwChRqYXZhX291dGVyX2NsYXNzbmFtZRgIIAEoCVISamF2YU91dGVyQ2xhc3NuYW1lEjUKE2phdmFfbXVsdGlwbGVfZmlsZXMYCiABKAg6BWZhbHNlUhFqYXZhTXVsdGlwbGVGaWxlcxJECh1qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaBgUIAEoCEICGAFSGWphdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2gSOgoWamF2YV9zdHJpbmdfY2hlY2tfdXRmOBgbIAEoCDoFZmFsc2VSE2phdmFTdHJpbmdDaGVja1V0ZjgSUwoMb3B0aW1pemVfZm9yGAkgASgOMikuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZToFU1BFRURSC29wdGltaXplRm9yEh0KCmdvX3BhY2thZ2UYCyABKAlSCWdvUGFja2FnZRI1ChNjY19nZW5lcmljX3NlcnZpY2VzGBAgASgIOgVmYWxzZVIRY2NHZW5lcmljU2VydmljZXMSOQoVamF2YV9nZW5lcmljX3NlcnZpY2VzGBEgASgIOgVmYWxzZVITamF2YUdlbmVyaWNTZXJ2aWNlcxI1ChNweV9nZW5lcmljX3NlcnZpY2VzGBIgASgIOgVmYWxzZVIRcHlHZW5lcmljU2VydmljZXMSNwoUcGhwX2dlbmVyaWNfc2VydmljZXMYKiABKAg6BWZhbHNlUhJwaHBHZW5lcmljU2VydmljZXMSJQoKZGVwcmVjYXRlZBgXIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSLwoQY2NfZW5hYmxlX2FyZW5hcxgfIAEoCDoFZmFsc2VSDmNjRW5hYmxlQXJlbmFzEioKEW9iamNfY2xhc3NfcHJlZml4GCQgASgJUg9vYmpjQ2xhc3NQcmVmaXgSKQoQY3NoYXJwX25hbWVzcGFjZRglIAEoCVIPY3NoYXJwTmFtZXNwYWNlEiEKDHN3aWZ0X3ByZWZpeBgnIAEoCVILc3dpZnRQcmVmaXgSKAoQcGhwX2NsYXNzX3ByZWZpeBgoIAEoCVIOcGhwQ2xhc3NQcmVmaXgSIwoNcGhwX25hbWVzcGFjZRgpIAEoCVIMcGhwTmFtZXNwYWNlEjQKFnBocF9tZXRhZGF0YV9uYW1lc3BhY2UYLCABKAlSFHBocE1ldGFkYXRhTmFtZXNwYWNlEiEKDHJ1YnlfcGFja2FnZRgtIAEoCVILcnVieVBhY2thZ2USWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iOgoMT3B0aW1pemVNb2RlEgkKBVNQRUVEEAESDQoJQ09ERV9TSVpFEAISEAoMTElURV9SVU5USU1FEAMqCQjoBxCAgICAAkoECCYQJyLRAgoOTWVzc2FnZU9wdGlvbnMSPAoXbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQYASABKAg6BWZhbHNlUhRtZXNzYWdlU2V0V2lyZUZvcm1hdBJMCh9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yGAIgASgIOgVmYWxzZVIcbm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvchIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIbCgltYXBfZW50cnkYByABKAhSCG1hcEVudHJ5ElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgIEAlKBAgJEAoi4gMKDEZpZWxkT3B0aW9ucxJBCgVjdHlwZRgBIAEoDjIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGU6BlNUUklOR1IFY3R5cGUSFgoGcGFja2VkGAIgASgIUgZwYWNrZWQSRwoGanN0eXBlGAYgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGU6CUpTX05PUk1BTFIGanN0eXBlEhkKBGxhenkYBSABKAg6BWZhbHNlUgRsYXp5EiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhkKBHdlYWsYCiABKAg6BWZhbHNlUgR3ZWFrElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIi8KBUNUeXBlEgoKBlNUUklORxAAEggKBENPUkQQARIQCgxTVFJJTkdfUElFQ0UQAiI1CgZKU1R5cGUSDQoJSlNfTk9STUFMEAASDQoJSlNfU1RSSU5HEAESDQoJSlNfTlVNQkVSEAIqCQjoBxCAgICAAkoECAQQBSJzCgxPbmVvZk9wdGlvbnMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLAAQoLRW51bU9wdGlvbnMSHwoLYWxsb3dfYWxpYXMYAiABKAhSCmFsbG93QWxpYXMSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAkoECAUQBiKeAQoQRW51bVZhbHVlT3B0aW9ucxIlCgpkZXByZWNhdGVkGAEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACIpwBCg5TZXJ2aWNlT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACIuACCg1NZXRob2RPcHRpb25zEiUKCmRlcHJlY2F0ZWQYISABKAg6BWZhbHNlUgpkZXByZWNhdGVkEnEKEWlkZW1wb3RlbmN5X2xldmVsGCIgASgOMi8uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMuSWRlbXBvdGVuY3lMZXZlbDoTSURFTVBPVEVOQ1lfVU5LTk9XTlIQaWRlbXBvdGVuY3lMZXZlbBJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbiJQChBJZGVtcG90ZW5jeUxldmVsEhcKE0lERU1QT1RFTkNZX1VOS05PV04QABITCg9OT19TSURFX0VGRkVDVFMQARIOCgpJREVNUE9URU5UEAIqCQjoBxCAgICAAiKaAwoTVW5pbnRlcnByZXRlZE9wdGlvbhJBCgRuYW1lGAIgAygLMi0uZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnRSBG5hbWUSKQoQaWRlbnRpZmllcl92YWx1ZRgDIAEoCVIPaWRlbnRpZmllclZhbHVlEiwKEnBvc2l0aXZlX2ludF92YWx1ZRgEIAEoBFIQcG9zaXRpdmVJbnRWYWx1ZRIsChJuZWdhdGl2ZV9pbnRfdmFsdWUYBSABKANSEG5lZ2F0aXZlSW50VmFsdWUSIQoMZG91YmxlX3ZhbHVlGAYgASgBUgtkb3VibGVWYWx1ZRIhCgxzdHJpbmdfdmFsdWUYByABKAxSC3N0cmluZ1ZhbHVlEicKD2FnZ3JlZ2F0ZV92YWx1ZRgIIAEoCVIOYWdncmVnYXRlVmFsdWUaSgoITmFtZVBhcnQSGwoJbmFtZV9wYXJ0GAEgAigJUghuYW1lUGFydBIhCgxpc19leHRlbnNpb24YAiACKAhSC2lzRXh0ZW5zaW9uIqcCCg5Tb3VyY2VDb2RlSW5mbxJECghsb2NhdGlvbhgBIAMoCzIoLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvblIIbG9jYXRpb24azgEKCExvY2F0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEhYKBHNwYW4YAiADKAVCAhABUgRzcGFuEikKEGxlYWRpbmdfY29tbWVudHMYAyABKAlSD2xlYWRpbmdDb21tZW50cxIrChF0cmFpbGluZ19jb21tZW50cxgEIAEoCVIQdHJhaWxpbmdDb21tZW50cxI6ChlsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzGAYgAygJUhdsZWFkaW5nRGV0YWNoZWRDb21tZW50cyLRAQoRR2VuZXJhdGVkQ29kZUluZm8STQoKYW5ub3RhdGlvbhgBIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uUgphbm5vdGF0aW9uGm0KCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kQo8BChNjb20uZ29vZ2xlLnByb3RvYnVmQhBEZXNjcmlwdG9yUHJvdG9zSAFaPmdpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmL3Byb3RvYy1nZW4tZ28vZGVzY3JpcHRvcjtkZXNjcmlwdG9y+AEBogIDR1BCqgIaR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb25Kyr4CCgcSBScA9AYBCqoPCgEMEgMnABIywQwgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCgogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCiBtZXQ6CgogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKIGRpc3RyaWJ1dGlvbi4KICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCjLbAiBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCiAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KCiBUaGUgbWVzc2FnZXMgaW4gdGhpcyBmaWxlIGRlc2NyaWJlIHRoZSBkZWZpbml0aW9ucyBmb3VuZCBpbiAucHJvdG8gZmlsZXMuCiBBIHZhbGlkIC5wcm90byBmaWxlIGNhbiBiZSB0cmFuc2xhdGVkIGRpcmVjdGx5IHRvIGEgRmlsZURlc2NyaXB0b3JQcm90bwogd2l0aG91dCBhbnkgb3RoZXIgaW5mb3JtYXRpb24gKGUuZy4gd2l0aG91dCByZWFkaW5nIGl0cyBpbXBvcnRzKS4KCggKAQISAykAGAoICgEIEgMrAFUKCQoCCAsSAysAVQoICgEIEgMsACwKCQoCCAESAywALAoICgEIEgMtADEKCQoCCAgSAy0AMQoICgEIEgMuADcKCQoCCCUSAy4ANwoICgEIEgMvACEKCQoCCCQSAy8AIQoICgEIEgMwAB8KCQoCCB8SAzAAHwoICgEIEgM0ABwKfwoCCAkSAzQAHBp0IGRlc2NyaXB0b3IucHJvdG8gbXVzdCBiZSBvcHRpbWl6ZWQgZm9yIHNwZWVkIGJlY2F1c2UgcmVmbGVjdGlvbi1iYXNlZAogYWxnb3JpdGhtcyBkb24ndCB3b3JrIGR1cmluZyBib290c3RyYXBwaW5nLgoKagoCBAASBDgAOgEaXiBUaGUgcHJvdG9jb2wgY29tcGlsZXIgY2FuIG91dHB1dCBhIEZpbGVEZXNjcmlwdG9y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ZXJ2ZXIgc3RyZWFtcyBtdWx0aXBsZSBzZXJ2ZXIgbWVzc2FnZXMKCg0KBQQJAgUEEgSZAgIKCg0KBQQJAgUFEgSZAgsPCg0KBQQJAgUBEgSZAhAgCg0KBQQJAgUDEgSZAiMkCg0KBQQJAgUIEgSZAiU2Cg0KBQQJAgUHEgSZAjA1Cq8OCgIEChIGvQIAuAMBMk4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogT3B0aW9ucwoy0A0gRWFjaCBvZiB0aGUgZGVmaW5pdGlvbnMgYWJvdmUgbWF5IGhhdmUgIm9wdGlvbnMiIGF0dGFjaGVkLiAgVGhlc2UgYXJlCiBqdXN0IGFubm90YXRpb25zIHdoaWNoIG1heSBjYXVzZSBjb2RlIHRvIGJlIGdlbmVyYXRlZCBzbGlnaHRseSBkaWZmZXJlbnRseQogb3IgbWF5IGNvbnRhaW4gaGludHMgZm9yIGNvZGUgdGhhdCBtYW5pcHVsYXRlcyBwcm90b2NvbCBtZXNzYWdlcy4KCiBDbGllbnRzIG1heSBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgYXMgZXh0ZW5zaW9ucyBvZiB0aGUgKk9wdGlvbnMgbWVzc2FnZXMuCiBUaGVzZSBleHRlbnNpb25zIG1heSBub3QgeWV0IGJlIGtub3duIGF0IHBhcnNpbmcgdGltZSwgc28gdGhlIHBhcnNlciBjYW5ub3QKIHN0b3JlIHRoZSB2YWx1ZXMgaW4gdGhlbS4gIEluc3RlYWQgaXQgc3RvcmVzIHRoZW0gaW4gYSBmaWVsZCBpbiB0aGUgKk9wdGlvbnMKIG1lc3NhZ2UgY2FsbGVkIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLiBUaGlzIGZpZWxkIG11c3QgaGF2ZSB0aGUgc2FtZSBuYW1lCiBhY3Jvc3MgYWxsICpPcHRpb25zIG1lc3NhZ2VzLiBXZSB0aGVuIHVzZSB0aGlzIGZpZWxkIHRvIHBvcHVsYXRlIHRoZQogZXh0ZW5zaW9ucyB3aGVuIHdlIGJ1aWxkIGEgZGVzY3JpcHRvciwgYXQgd2hpY2ggcG9pbnQgYWxsIHByb3RvcyBoYXZlIGJlZW4KIHBhcnNlZCBhbmQgc28gYWxsIGV4dGVuc2lvbnMgYXJlIGtub3duLgoKIEV4dGVuc2lvbiBudW1iZXJzIGZvciBjdXN0b20gb3B0aW9ucyBtYXkgYmUgY2hvc2VuIGFzIGZvbGxvd3M6CiAqIEZvciBvcHRpb25zIHdoaWNoIHdpbGwgb25seSBiZSB1c2VkIHdpdGhpbiBhIHNpbmdsZSBhcHBsaWNhdGlvbiBvcgogICBvcmdhbml6YXRpb24sIG9yIGZvciBleHBlcmltZW50YWwgb3B0aW9ucywgdXNlIGZpZWxkIG51bWJlcnMgNTAwMDAKICAgdGhyb3VnaCA5OTk5OS4gIEl0IGlzIHVwIHRvIHlvdSB0byBlbnN1cmUgdGhhdCB5b3UgZG8gbm90IHVzZSB0aGUKICAgc2FtZSBudW1iZXIgZm9yIG11bHRpcGxlIG9wdGlvbnMuCiAqIEZvciBvcHRpb25zIHdoaWNoIHdpbGwgYmUgcHVibGlzaGVkIGFuZCB1c2VkIHB1YmxpY2x5IGJ5IG11bHRpcGxlCiAgIGluZGVwZW5kZW50IGVudGl0aWVzLCBlLW1haWwgcHJvdG9idWYtZ2xvYmFsLWV4dGVuc2lvbi1yZWdpc3RyeUBnb29nbGUuY29tCiAgIHRvIHJlc2VydmUgZXh0ZW5zaW9uIG51bWJlcnMuIFNpbXBseSBwcm92aWRlIHlvdXIgcHJvamVjdCBuYW1lIChlLmcuCiAgIE9iamVjdGl2ZS1DIHBsdWdpbikgYW5kIHlvdXIgcHJvamVjdCB3ZWJzaXRlIChpZiBhdmFpbGFibGUpIC0tIHRoZXJlJ3Mgbm8KICAgbmVlZCB0byBleHBsYWluIGhvdyB5b3UgaW50ZW5kIHRvIHVzZSB0aGVtLiBVc3VhbGx5IHlvdSBvbmx5IG5lZWQgb25lCiAgIGV4dGVuc2lvbiBudW1iZXIuIFlvdSBjYW4gZGVjbGFyZSBtdWx0aXBsZSBvcHRpb25zIHdpdGggb25seSBvbmUgZXh0ZW5zaW9uCiAgIG51bWJlciBieSBwdXR0aW5nIHRoZW0gaW4gYSBzdWItbWVzc2FnZS4gU2VlIHRoZSBDdXN0b20gT3B0aW9ucyBzZWN0aW9uIG9mCiAgIHRoZSBkb2NzIGZvciBleGFtcGxlczoKICAgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvI29wdGlvbnMKICAgSWYgdGhpcyB0dXJucyBvdXQgdG8gYmUgcG9wdWxhciwgYSB3ZWIgc2VydmljZSB3aWxsIGJlIHNldCB1cAogICB0byBhdXRvbWF0aWNhbGx5IGFzc2lnbiBvcHRpb24gbnVtYmVycy4KCgsKAwQKARIEvQIIEwr0AQoEBAoCABIEwwICIxrlASBTZXRzIHRoZSBKYXZhIHBhY2thZ2Ugd2hlcmUgY2xhc3NlcyBnZW5lcmF0ZWQgZnJvbSB0aGlzIC5wcm90byB3aWxsIGJlCiBwbGFjZWQuICBCeSBkZWZhdWx0LCB0aGUgcHJvdG8gcGFja2FnZSBpcyB1c2VkLCBidXQgdGhpcyBpcyBvZnRlbgogaW5hcHByb3ByaWF0ZSBiZWNhdXNlIHByb3RvIHBhY2thZ2VzIGRvIG5vdCBub3JtYWxseSBzdGFydCB3aXRoIGJhY2t3YXJkcwogZG9tYWluIG5hbWVzLgoKDQoFBAoCAAQSBMMCAgoKDQoFBAoCAAUSBMMCCxEKDQoFBAoCAAESBMMCEh4KDQoFBAoCAAMSBMMCISIKvwIKBAQKAgESBMsCAisasAIgSWYgc2V0LCBhbGwgdGhlIGNsYXNzZXMgZnJvbSB0aGUgLnByb3RvIGZpbGUgYXJlIHdyYXBwZWQgaW4gYSBzaW5nbGUKIG91dGVyIGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUuICBUaGlzIGFwcGxpZXMgdG8gYm90aCBQcm90bzEKIChlcXVpdmFsZW50IHRvIHRoZSBvbGQgIi0tb25lX2phdmFfZmlsZSIgb3B0aW9uKSBhbmQgUHJvdG8yICh3aGVyZQogYSAucHJvdG8gYWx3YXlzIHRyYW5zbGF0ZXMgdG8gYSBzaW5nbGUgY2xhc3MsIGJ1dCB5b3UgbWF5IHdhbnQgdG8KIGV4cGxpY2l0bHkgY2hvb3NlIHRoZSBjbGFzcyBuYW1lKS4KCg0KBQQKAgEEEgTLAgIKCg0KBQQKAgEFEgTLAgsRCg0KBQQKAgEBEgTLAhImCg0KBQQKAgEDEgTLAikqCqMDCgQECgICEgTTAgI7GpQDIElmIHNldCB0cnVlLCB0aGVuIHRoZSBKYXZhIGNvZGUgZ2VuZXJhdG9yIHdpbGwgZ2VuZXJhdGUgYSBzZXBhcmF0ZSAuamF2YQogZmlsZSBmb3IgZWFjaCB0b3AtbGV2ZWwgbWVzc2FnZSwgZW51bSwgYW5kIHNlcnZpY2UgZGVmaW5lZCBpbiB0aGUgLnByb3RvCiBmaWxlLiAgVGh1cywgdGhlc2UgdHlwZXMgd2lsbCAqbm90KiBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBvdXRlciBjbGFzcwogbmFtZWQgYnkgamF2YV9vdXRlcl9jbGFzc25hbWUuICBIb3dldmVyLCB0aGUgb3V0ZXIgY2xhc3Mgd2lsbCBzdGlsbCBiZQogZ2VuZXJhdGVkIHRvIGNvbnRhaW4gdGhlIGZpbGUncyBnZXREZXNjcmlwdG9yKCkgbWV0aG9kIGFzIHdlbGwgYXMgYW55CiB0b3AtbGV2ZWwgZXh0ZW5zaW9ucyBkZWZpbmVkIGluIHRoZSBmaWxlLgoKDQoFBAoCAgQSBNMCAgoKDQoFBAoCAgUSBNMCCw8KDQoFBAoCAgESBNMCECMKDQoFBAoCAgMSBNMCJigKDQoFBAoCAggSBNMCKToKDQoFBAoCAgcSBNMCNDkKKQoEBAoCAxIE1gICRRobIFRoaXMgb3B0aW9uIGRvZXMgbm90aGluZy4KCg0KBQQKAgMEEgTWAgIKCg0KBQQKAgMFEgTWAgsPCg0KBQQKAgMBEgTWAhAtCg0KBQQKAgMDEgTWAjAyCg0KBQQKAgMIEgTWAjNECg4KBgQKAgMIAxIE1gI0QwrmAgoEBAoCBBIE3gICPhrXAiBJZiBzZXQgdHJ1ZSwgdGhlbiB0aGUgSmF2YTIgY29kZSBnZW5lcmF0b3Igd2lsbCBnZW5lcmF0ZSBjb2RlIHRoYXQKIHRocm93cyBhbiBleGNlcHRpb24gd2hlbmV2ZXIgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFzc2lnbiBhIG5vbi1VVEYtOAogYnl0ZSBzZXF1ZW5jZSB0byBhIHN0cmluZyBmaWVsZC4KIE1lc3NhZ2UgcmVmbGVjdGlvbiB3aWxsIGRvIHRoZSBzYW1lLgogSG93ZXZlciwgYW4gZXh0ZW5zaW9uIGZpZWxkIHN0aWxsIGFjY2VwdHMgbm9uLVVURi04IGJ5dGUgc2VxdWVuY2VzLgogVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB3aGVuIHVzZWQgd2l0aCB0aGUgbGl0ZSBydW50aW1lLgoKDQoFBAoCBAQSBN4CAgoKDQoFBAoCBAUSBN4CCw8KDQoFBAoCBAESBN4CECYKDQoFBAoCBAMSBN4CKSsKDQoFBAoCBAgSBN4CLD0KDQoFBAoCBAcSBN4CNzwKTAoEBAoEABIG4gIC5wIDGjwgR2VuZXJhdGVkIGNsYXNzZXMgY2FuIGJlIG9wdGltaXplZCBmb3Igc3BlZWQgb3IgY29kZSBzaXplLgoKDQoFBAoEAAESBOICBxMKRAoGBAoEAAIAEgTjAgQOIjQgR2VuZXJhdGUgY29tcGxldGUgY29kZSBmb3IgcGFyc2luZywgc2VyaWFsaXphdGlvbiwKCg8KBwQKBAACAAESBOMCBAkKDwoHBAoEAAIAAhIE4wIMDQpHCgYECgQAAgESBOUCBBIaBiBldGMuCiIvIFVzZSBSZWZsZWN0aW9uT3BzIHRvIGltcGxlbWVudCB0aGVzZSBtZXRob2RzLgoKDwoHBAoEAAIBARIE5QIEDQoPCgcECgQAAgECEgTlAhARCkcKBgQKBAACAhIE5gIEFSI3IEdlbmVyYXRlIGNvZGUgdXNpbmcgTWVzc2FnZUxpdGUgYW5kIHRoZSBsaXRlIHJ1bnRpbWUuCgoPCgcECgQAAgIBEgTmAgQQCg8KBwQKBAACAgISBOYCExQKDAoEBAoCBRIE6AICOwoNCgUECgIFBBIE6AICCgoNCgUECgIFBhIE6AILFwoNCgUECgIFARIE6AIYJAoNCgUECgIFAxIE6AInKAoNCgUECgIFCBIE6AIpOgoNCgUECgIFBxIE6AI0OQriAgoEBAoCBhIE7wICIhrTAiBTZXRzIHRoZSBHbyBwYWNrYWdlIHdoZXJlIHN0cnVjdHMgZ2VuZXJhdGVkIGZyb20gdGhpcyAucHJvdG8gd2lsbCBiZQogcGxhY2VkLiBJZiBvbWl0dGVkLCB0aGUgR28gcGFja2FnZSB3aWxsIGJlIGRlcml2ZWQgZnJvbSB0aGUgZm9sbG93aW5nOgogICAtIFRoZSBiYXNlbmFtZSBvZiB0aGUgcGFja2FnZSBpbXBvcnQgcGF0aCwgaWYgcHJvdmlkZWQuCiAgIC0gT3RoZXJ3aXNlLCB0aGUgcGFja2FnZSBzdGF0ZW1lbnQgaW4gdGhlIC5wcm90byBmaWxlLCBpZiBwcmVzZW50LgogICAtIE90aGVyd2lzZSwgdGhlIGJhc2VuYW1lIG9mIHRoZSAucHJvdG8gZmlsZSwgd2l0aG91dCBleHRlbnNpb24uCgoNCgUECgIGBBIE7wICCgoNCgUECgIGBRIE7wILEQoNCgUECgIGARIE7wISHAoNCgUECgIGAxIE7wIfIQrUBAoEBAoCBxIE/gICOxrFBCBTaG91bGQgZ2VuZXJpYyBzZXJ2aWNlcyBiZSBnZW5lcmF0ZWQgaW4gZWFjaCBsYW5ndWFnZT8gICJHZW5lcmljIiBzZXJ2aWNlcwogYXJlIG5vdCBzcGVjaWZpYyB0byBhbnkgcGFydGljdWxhciBSUEMgc3lzdGVtLiAgVGhleSBhcmUgZ2VuZXJhdGVkIGJ5IHRoZQogbWFpbiBjb2RlIGdlbmVyYXRvcnMgaW4gZWFjaCBsYW5ndWFnZSAod2l0aG91dCBhZGRpdGlvbmFsIHBsdWdpbnMpLgogR2VuZXJpYyBzZXJ2aWNlcyB3ZXJlIHRoZSBvbmx5IGtpbmQgb2Ygc2VydmljZSBnZW5lcmF0aW9uIHN1cHBvcnRlZCBieQogZWFybHkgdmVyc2lvbnMgb2YgZ29vZ2xlLnByb3RvYnVmLgoKIEdlbmVyaWMgc2VydmljZXMgYXJlIG5vdyBjb25zaWRlcmVkIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdXNpbmcgcGx1Z2lucwogdGhhdCBnZW5lcmF0ZSBjb2RlIHNwZWNpZmljIHRvIHlvdXIgcGFydGljdWxhciBSUEMgc3lzdGVtLiAgVGhlcmVmb3JlLAogdGhlc2UgZGVmYXVsdCB0byBmYWxzZS4gIE9sZCBjb2RlIHdoaWNoIGRlcGVuZHMgb24gZ2VuZXJpYyBzZXJ2aWNlcyBzaG91bGQKIGV4cGxpY2l0bHkgc2V0IHRoZW0gdG8gdHJ1ZS4KCg0KBQQKAgcEEgT+AgIKCg0KBQQKAgcFEgT+AgsPCg0KBQQKAgcBEgT+AhAjCg0KBQQKAgcDEgT+AiYoCg0KBQQKAgcIEgT+Aik6Cg0KBQQKAgcHEgT+AjQ5CgwKBAQKAggSBP8CAj0KDQoFBAoCCAQSBP8CAgoKDQoFBAoCCAUSBP8CCw8KDQoFBAoCCAESBP8CECUKDQoFBAoCCAMSBP8CKCoKDQoFBAoCCAgSBP8CKzwKDQoFBAoCCAcSBP8CNjsKDAoEBAoCCRIEgAMCOwoNCgUECgIJBBIEgAMCCgoNCgUECgIJBRIEgAMLDwoNCgUECgIJARIEgAMQIwoNCgUECgIJAxIEgAMmKAoNCgUECgIJCBIEgAMpOgoNCgUECgIJBxIEgAM0OQoMCgQECgIKEgSBAwI8Cg0KBQQKAgoEEgSBAwIKCg0KBQQKAgoFEgSBAwsPCg0KBQQKAgoBEgSBAxAkCg0KBQQKAgoDEgSBAycpCg0KBQQKAgoIEgSBAyo7Cg0KBQQKAgoHEgSBAzU6CvMBCgQECgILEgSHAwIyGuQBIElzIHRoaXMgZmlsZSBkZXByZWNhdGVkPwogRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucwogZm9yIGV2ZXJ5dGhpbmcgaW4gdGhlIGZpbGUsIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeQogbGVhc3QsIHRoaXMgaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBmaWxlcy4KCg0KBQQKAgsEEgSHAwIKCg0KBQQKAgsFEgSHAwsPCg0KBQQKAgsBEgSHAxAaCg0KBQQKAgsDEgSHAx0fCg0KBQQKAgsIEgSHAyAxCg0KBQQKAgsHEgSHAyswCn8KBAQKAgwSBIsDAjgacSBFbmFibGVzIHRoZSB1c2Ugb2YgYXJlbmFzIGZvciB0aGUgcHJvdG8gbWVzc2FnZXMgaW4gdGhpcyBmaWxlLiBUaGlzIGFwcGxpZXMKIG9ubHkgdG8gZ2VuZXJhdGVkIGNsYXNzZXMgZm9yIEMrKy4KCg0KBQQKAgwEEgSLAwIKCg0KBQQKAgwFEgSLAwsPCg0KBQQKAgwBEgSLAxAgCg0KBQQKAgwDEgSLAyMlCg0KBQQKAgwIEgSLAyY3Cg0KBQQKAgwHEgSLAzE2CpIBCgQECgINEgSQAwIpGoMBIFNldHMgdGhlIG9iamVjdGl2ZSBjIGNsYXNzIHByZWZpeCB3aGljaCBpcyBwcmVwZW5kZWQgdG8gYWxsIG9iamVjdGl2ZSBjCiBnZW5lcmF0ZWQgY2xhc3NlcyBmcm9tIHRoaXMgLnByb3RvLiBUaGVyZSBpcyBubyBkZWZhdWx0LgoKDQoFBAoCDQQSBJADAgoKDQoFBAoCDQUSBJADCxEKDQoFBAoCDQESBJADEiMKDQoFBAoCDQMSBJADJigKSQoEBAoCDhIEkwMCKBo7IE5hbWVzcGFjZSBmb3IgZ2VuZXJhdGVkIGNsYXNzZXM7IGRlZmF1bHRzIHRvIHRoZSBwYWNrYWdlLgoKDQoFBAoCDgQSBJMDAgoKDQoFBAoCDgUSBJMDCxEKDQoFBAoCDgESBJMDEiIKDQoFBAoCDgMSBJMDJScKkQIKBAQKAg8SBJkDAiQaggIgQnkgZGVmYXVsdCBTd2lmdCBnZW5lcmF0b3JzIHdpbGwgdGFrZSB0aGUgcHJvdG8gcGFja2FnZSBhbmQgQ2FtZWxDYXNlIGl0CiByZXBsYWNpbmcgJy4nIHdpdGggdW5kZXJzY29yZSBhbmQgdXNlIHRoYXQgdG8gcHJlZml4IHRoZSB0eXBlcy9zeW1ib2xzCiBkZWZpbmVkLiBXaGVuIHRoaXMgb3B0aW9ucyBpcyBwcm92aWRlZCwgdGhleSB3aWxsIHVzZSB0aGlzIHZhbHVlIGluc3RlYWQKIHRvIHByZWZpeCB0aGUgdHlwZXMvc3ltYm9scyBkZWZpbmVkLgoKDQoFBAoCDwQSBJkDAgoKDQoFBAoCDwUSBJkDCxEKDQoFBAoCDwESBJkDEh4KDQoFBAoCDwMSBJkDISMKfgoEBAoCEBIEnQMCKBpwIFNldHMgdGhlIHBocCBjbGFzcyBwcmVmaXggd2hpY2ggaXMgcHJlcGVuZGVkIHRvIGFsbCBwaHAgZ2VuZXJhdGVkIGNsYXNzZXMKIGZyb20gdGhpcyAucHJvdG8uIERlZmF1bHQgaXMgZW1wdHkuCgoNCgUECgIQBBIEnQMCCgoNCgUECgIQBRIEnQMLEQoNCgUECgIQARIEnQMSIgoNCgUECgIQAxIEnQMlJwq+AQoEBAoCERIEogMCJRqvASBVc2UgdGhpcyBvcHRpb24gdG8gY2hhbmdlIHRoZSBuYW1lc3BhY2Ugb2YgcGhwIGdlbmVyYXRlZCBjbGFzc2VzLiBEZWZhdWx0CiBpcyBlbXB0eS4gV2hlbiB0aGlzIG9wdGlvbiBpcyBlbXB0eSwgdGhlIHBhY2thZ2UgbmFtZSB3aWxsIGJlIHVzZWQgZm9yCiBkZXRlcm1pbmluZyB0aGUgbmFtZXNwYWNlLgoKDQoFBAoCEQQSBKIDAgoKDQoFBAoCEQUSBKIDCxEKDQoFBAoCEQESBKIDEh8KDQoFBAoCEQMSBKIDIiQKygEKBAQKAhISBKcDAi4auwEgVXNlIHRoaXMgb3B0aW9uIHRvIGNoYW5nZSB0aGUgbmFtZXNwYWNlIG9mIHBocCBnZW5lcmF0ZWQgbWV0YWRhdGEgY2xhc3Nlcy4KIERlZmF1bHQgaXMgZW1wdHkuIFdoZW4gdGhpcyBvcHRpb24gaXMgZW1wdHksIHRoZSBwcm90byBmaWxlIG5hbWUgd2lsbCBiZQogdXNlZCBmb3IgZGV0ZXJtaW5pbmcgdGhlIG5hbWVzcGFjZS4KCg0KBQQKAhIEEgSnAwIKCg0KBQQKAhIFEgSnAwsRCg0KBQQKAhIBEgSnAxIoCg0KBQQKAhIDEgSnAystCsIBCgQECgITEgSsAwIkGrMBIFVzZSB0aGlzIG9wdGlvbiB0byBjaGFuZ2UgdGhlIHBhY2thZ2Ugb2YgcnVieSBnZW5lcmF0ZWQgY2xhc3Nlcy4gRGVmYXVsdAogaXMgZW1wdHkuIFdoZW4gdGhpcyBvcHRpb24gaXMgbm90IHNldCwgdGhlIHBhY2thZ2UgbmFtZSB3aWxsIGJlIHVzZWQgZm9yCiBkZXRlcm1pbmluZyB0aGUgcnVieSBwYWNrYWdlLgoKDQoFBAoCEwQSBKwDAgoKDQoFBAoCEwUSBKwDCxEKDQoFBAoCEwESBKwDEh4KDQoFBAoCEwMSBKwDISMKfAoEBAoCFBIEsQMCOhpuIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4KIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlICJPcHRpb25zIiBzZWN0aW9uIGFib3ZlLgoKDQoFBAoCFAQSBLEDAgoKDQoFBAoCFAYSBLEDCx4KDQoFBAoCFAESBLEDHzMKDQoFBAoCFAMSBLEDNjkKhwEKAwQKBRIEtQMCGRp6IENsaWVudHMgY2FuIGRlZmluZSBjdXN0b20gb3B0aW9ucyBpbiBleHRlbnNpb25zIG9mIHRoaXMgbWVzc2FnZS4KIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlICJPcHRpb25zIiBzZWN0aW9uIGFib3ZlLgoKDAoEBAoFABIEtQMNGAoNCgUECgUAARIEtQMNEQoNCgUECgUAAhIEtQMVGAoLCgMECgkSBLcDAg4KDAoEBAoJABIEtwMLDQoNCgUECgkAARIEtwMLDQoNCgUECgkAAhIEtwMLDQoMCgIECxIGugMA+gMBCgsKAwQLARIEugMIFgrYBQoEBAsCABIEzQMCPhrJBSBTZXQgdHJ1ZSB0byB1c2UgdGhlIG9sZCBwcm90bzEgTWVzc2FnZVNldCB3aXJlIGZvcm1hdCBmb3IgZXh0ZW5zaW9ucy4KIFRoaXMgaXMgcHJvdmlkZWQgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHdpdGggdGhlIE1lc3NhZ2VTZXQgd2lyZQogZm9ybWF0LiAgWW91IHNob3VsZCBub3QgdXNlIHRoaXMgZm9yIGFueSBvdGhlciByZWFzb246ICBJdCdzIGxlc3MKIGVmZmljaWVudCwgaGFzIGZld2VyIGZlYXR1cmVzLCBhbmQgaXMgbW9yZSBjb21wbGljYXRlZC4KCiBUaGUgbWVzc2FnZSBtdXN0IGJlIGRlZmluZWQgZXhhY3RseSBhcyBmb2xsb3dzOgogICBtZXNzYWdlIEZvbyB7CiAgICAgb3B0aW9uIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gdHJ1ZTsKICAgICBleHRlbnNpb25zIDQgdG8gbWF4OwogICB9CiBOb3RlIHRoYXQgdGhlIG1lc3NhZ2UgY2Fubm90IGhhdmUgYW55IGRlZmluZWQgZmllbGRzOyBNZXNzYWdlU2V0cyBvbmx5CiBoYXZlIGV4dGVuc2lvbnMuCgogQWxsIGV4dGVuc2lvbnMgb2YgeW91ciB0eXBlIG11c3QgYmUgc2luZ3VsYXIgbWVzc2FnZXM7IGUuZy4gdGhleSBjYW5ub3QKIGJlIGludDMycywgZW51bXMsIG9yIHJlcGVhdGVkIG1lc3NhZ2VzLgoKIEJlY2F1c2UgdGhpcyBpcyBhbiBvcHRpb24sIHRoZSBhYm92ZSB0d28gcmVzdHJpY3Rpb25zIGFyZSBub3QgZW5mb3JjZWQgYnkKIHRoZSBwcm90b2NvbCBjb21waWxlci4KCg0KBQQLAgAEEgTNAwIKCg0KBQQLAgAFEgTNAwsPCg0KBQQLAgABEgTNAxAnCg0KBQQLAgADEgTNAyorCg0KBQQLAgAIEgTNAyw9Cg0KBQQLAgAHEgTNAzc8CusBCgQECwIBEgTSAwJGGtwBIERpc2FibGVzIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBzdGFuZGFyZCAiZGVzY3JpcHRvcigpIiBhY2Nlc3Nvciwgd2hpY2ggY2FuCiBjb25mbGljdCB3aXRoIGEgZmllbGQgb2YgdGhlIHNhbWUgbmFtZS4gIFRoaXMgaXMgbWVhbnQgdG8gbWFrZSBtaWdyYXRpb24KIGZyb20gcHJvdG8xIGVhc2llcjsgbmV3IGNvZGUgc2hvdWxkIGF2b2lkIGZpZWxkcyBuYW1lZCAiZGVzY3JpcHRvciIuCgoNCgUECwIBBBIE0gMCCgoNCgUECwIBBRIE0gMLDwoNCgUECwIBARIE0gMQLwoNCgUECwIBAxIE0gMyMwoNCgUECwIBCBIE0gM0RQoNCgUECwIBBxIE0gM/RAruAQoEBAsCAhIE2AMCMRrfASBJcyB0aGlzIG1lc3NhZ2UgZGVwcmVjYXRlZD8KIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtLCB0aGlzIGNhbiBlbWl0IERlcHJlY2F0ZWQgYW5ub3RhdGlvbnMKIGZvciB0aGUgbWVzc2FnZSwgb3IgaXQgd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQ7IGluIHRoZSB2ZXJ5IGxlYXN0LAogdGhpcyBpcyBhIGZvcm1hbGl6YXRpb24gZm9yIGRlcHJlY2F0aW5nIG1lc3NhZ2VzLgoKDQoFBAsCAgQSBNgDAgoKDQoFBAsCAgUSBNgDCw8KDQoFBAsCAgESBNgDEBoKDQoFBAsCAgMSBNgDHR4KDQoFBAsCAggSBNgDHzAKDQoFBAsCAgcSBNgDKi8KoAYKBAQLAgMSBO8DAh4akQYgV2hldGhlciB0aGUgbWVzc2FnZSBpcyBhbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYXAgZW50cnkgdHlwZSBmb3IgdGhlCiBtYXBzIGZpZWxkLgoKIEZvciBtYXBzIGZpZWxkczoKICAgICBtYXA8S2V5VHlwZSwgVmFsdWVUeXBlPiBtYXBfZmllbGQgPSAxOwogVGhlIHBhcnNlZCBkZXNjcmlwdG9yIGxvb2tzIGxpa2U6CiAgICAgbWVzc2FnZSBNYXBGaWVsZEVudHJ5IHsKICAgICAgICAgb3B0aW9uIG1hcF9lbnRyeSA9IHRydWU7CiAgICAgICAgIG9wdGlvbmFsIEtleVR5cGUga2V5ID0gMTsKICAgICAgICAgb3B0aW9uYWwgVmFsdWVUeXBlIHZhbHVlID0gMjsKICAgICB9CiAgICAgcmVwZWF0ZWQgTWFwRmllbGRFbnRyeSBtYXBfZmllbGQgPSAxOwoKIEltcGxlbWVudGF0aW9ucyBtYXkgY2hvb3NlIG5vdCB0byBnZW5lcmF0ZSB0aGUgbWFwX2VudHJ5PXRydWUgbWVzc2FnZSwgYnV0CiB1c2UgYSBuYXRpdmUgbWFwIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgdG8gaG9sZCB0aGUga2V5cyBhbmQgdmFsdWVzLgogVGhlIHJlZmxlY3Rpb24gQVBJcyBpbiBzdWNoIGltcGxlbWVudGF0aW9ucyBzdGlsbCBuZWVkIHRvIHdvcmsgYXMKIGlmIHRoZSBmaWVsZCBpcyBhIHJlcGVhdGVkIG1lc3NhZ2UgZmllbGQuCgogTk9URTogRG8gbm90IHNldCB0aGUgb3B0aW9uIGluIC5wcm90byBmaWxlcy4gQWx3YXlzIHVzZSB0aGUgbWFwcyBzeW50YXgKIGluc3RlYWQuIFRoZSBvcHRpb24gc2hvdWxkIG9ubHkgYmUgaW1wbGljaXRseSBzZXQgYnkgdGhlIHByb3RvIGNvbXBpbGVyCiBwYXJzZXIuCgoNCgUECwIDBBIE7wMCCgoNCgUECwIDBRIE7wMLDwoNCgUECwIDARIE7wMQGQoNCgUECwIDAxIE7wMcHQokCgMECwkSBPEDAg0iFyBqYXZhbGl0ZV9zZXJpYWxpemFibGUKCgwKBAQLCQASBPEDCwwKDQoFBAsJAAESBPEDCwwKDQoFBAsJAAISBPEDCwwKHwoDBAsJEgTyAwINIhIgamF2YW5hbm9fYXNfbGl0ZQoKDAoEBAsJARIE8gMLDAoNCgUECwkBARIE8gMLDAoNCgUECwkBAhIE8gMLDApPCgQECwIEEgT2AwI6GkEgVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCgoNCgUECwIEBBIE9gMCCgoNCgUECwIEBhIE9gMLHgoNCgUECwIEARIE9gMfMwoNCgUECwIEAxIE9gM2OQpaCgMECwUSBPkDAhkaTSBDbGllbnRzIGNhbiBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgaW4gZXh0ZW5zaW9ucyBvZiB0aGlzIG1lc3NhZ2UuIFNlZSBhYm92ZS4KCgwKBAQLBQASBPkDDRgKDQoFBAsFAAESBPkDDREKDQoFBAsFAAISBPkDFRgKDAoCBAwSBvwDANcEAQoLCgMEDAESBPwDCBQKowIKBAQMAgASBIEEAi4alAIgVGhlIGN0eXBlIG9wdGlvbiBpbnN0cnVjdHMgdGhlIEMrKyBjb2RlIGdlbmVyYXRvciB0byB1c2UgYSBkaWZmZXJlbnQKIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmaWVsZCB0aGFuIGl0IG5vcm1hbGx5IHdvdWxkLiAgU2VlIHRoZSBzcGVjaWZpYwogb3B0aW9ucyBiZWxvdy4gIFRoaXMgb3B0aW9uIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gdGhlIG9wZW4gc291cmNlCiByZWxlYXNlIC0tIHNvcnJ5LCB3ZSdsbCB0cnkgdG8gaW5jbHVkZSBpdCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIQoKDQoFBAwCAAQSBIEEAgoKDQoFBAwCAAYSBIEECxAKDQoFBAwCAAESBIEEERYKDQoFBAwCAAMSBIEEGRoKDQoFBAwCAAgSBIEEGy0KDQoFBAwCAAcSBIEEJiwKDgoEBAwEABIGggQCiQQDCg0KBQQMBAABEgSCBAcMCh8KBgQMBAACABIEhAQEDxoPIERlZmF1bHQgbW9kZS4KCg8KBwQMBAACAAESBIQEBAoKDwoHBAwEAAIAAhIEhAQNDgoOCgYEDAQAAgESBIYEBA0KDwoHBAwEAAIBARIEhgQECAoPCgcEDAQAAgECEgSGBAsMCg4KBgQMBAACAhIEiAQEFQoPCgcEDAQAAgIBEgSIBAQQCg8KBwQMBAACAgISBIgEExQK2gIKBAQMAgESBI8EAhsaywIgVGhlIHBhY2tlZCBvcHRpb24gY2FuIGJlIGVuYWJsZWQgZm9yIHJlcGVhdGVkIHByaW1pdGl2ZSBmaWVsZHMgdG8gZW5hYmxlCiBhIG1vcmUgZWZmaWNpZW50IHJlcHJlc2VudGF0aW9uIG9uIHRoZSB3aXJlLiBSYXRoZXIgdGhhbiByZXBlYXRlZGx5CiB3cml0aW5nIHRoZSB0YWcgYW5kIHR5cGUgZm9yIGVhY2ggZWxlbWVudCwgdGhlIGVudGlyZSBhcnJheSBpcyBlbmNvZGVkIGFzCiBhIHNpbmdsZSBsZW5ndGgtZGVsaW1pdGVkIGJsb2IuIEluIHByb3RvMywgb25seSBleHBsaWNpdCBzZXR0aW5nIGl0IHRvCiBmYWxzZSB3aWxsIGF2b2lkIHVzaW5nIHBhY2tlZCBlbmNvZGluZy4KCg0KBQQMAgEEEgSPBAIKCg0KBQQMAgEFEgSPBAsPCg0KBQQMAgEBEgSPBBAWCg0KBQQMAgEDEgSPBBkaCpoFCgQEDAICEgScBAIzGosFIFRoZSBqc3R5cGUgb3B0aW9uIGRldGVybWluZXMgdGhlIEphdmFTY3JpcHQgdHlwZSB1c2VkIGZvciB2YWx1ZXMgb2YgdGhlCiBmaWVsZC4gIFRoZSBvcHRpb24gaXMgcGVybWl0dGVkIG9ubHkgZm9yIDY0IGJpdCBpbnRlZ3JhbCBhbmQgZml4ZWQgdHlwZXMKIChpbnQ2NCwgdWludDY0LCBzaW50NjQsIGZpeGVkNjQsIHNmaXhlZDY0KS4gIEEgZmllbGQgd2l0aCBqc3R5cGUgSlNfU1RSSU5HCiBpcyByZXByZXNlbnRlZCBhcyBKYXZhU2NyaXB0IHN0cmluZywgd2hpY2ggYXZvaWRzIGxvc3Mgb2YgcHJlY2lzaW9uIHRoYXQKIGNhbiBoYXBwZW4gd2hlbiBhIGxhcmdlIHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhIGZsb2F0aW5nIHBvaW50IEphdmFTY3JpcHQuCiBTcGVjaWZ5aW5nIEpTX05VTUJFUiBmb3IgdGhlIGpzdHlwZSBjYXVzZXMgdGhlIGdlbmVyYXRlZCBKYXZhU2NyaXB0IGNvZGUgdG8KIHVzZSB0aGUgSmF2YVNjcmlwdCAibnVtYmVyIiB0eXBlLiAgVGhlIGJlaGF2aW9yIG9mIHRoZSBkZWZhdWx0IG9wdGlvbgogSlNfTk9STUFMIGlzIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudC4KCiBUaGlzIG9wdGlvbiBpcyBhbiBlbnVtIHRvIHBlcm1pdCBhZGRpdGlvbmFsIHR5cGVzIHRvIGJlIGFkZGVkLCBlLmcuCiBnb29nLm1hdGguSW50ZWdlci4KCg0KBQQMAgIEEgScBAIKCg0KBQQMAgIGEgScBAsRCg0KBQQMAgIBEgScBBIYCg0KBQQMAgIDEgScBBscCg0KBQQMAgIIEgScBB0yCg0KBQQMAgIHEgScBCgxCg4KBAQMBAESBp0EAqYEAwoNCgUEDAQBARIEnQQHDQonCgYEDAQBAgASBJ8EBBIaFyBVc2UgdGhlIGRlZmF1bHQgdHlwZS4KCg8KBwQMBAECAAESBJ8EBA0KDwoHBAwEAQIAAhIEnwQQEQopCgYEDAQBAgESBKIEBBIaGSBVc2UgSmF2YVNjcmlwdCBzdHJpbmdzLgoKDwoHBAwEAQIBARIEogQEDQoPCgcEDAQBAgECEgSiBBARCikKBgQMBAECAhIEpQQEEhoZIFVzZSBKYXZhU2NyaXB0IG51bWJlcnMuCgoPCgcEDAQBAgIBEgSlBAQNCg8KBwQMBAECAgISBKUEEBEK7wwKBAQMAgMSBMQEAisa4AwgU2hvdWxkIHRoaXMgZmllbGQgYmUgcGFyc2VkIGxhemlseT8gIExhenkgYXBwbGllcyBvbmx5IHRvIG1lc3NhZ2UtdHlwZQogZmllbGRzLiAgSXQgbWVhbnMgdGhhdCB3aGVuIHRoZSBvdXRlciBtZXNzYWdlIGlzIGluaXRpYWxseSBwYXJzZWQsIHRoZQogaW5uZXIgbWVzc2FnZSdzIGNvbnRlbnRzIHdpbGwgbm90IGJlIHBhcnNlZCBidXQgaW5zdGVhZCBzdG9yZWQgaW4gZW5jb2RlZAogZm9ybS4gIFRoZSBpbm5lciBtZXNzYWdlIHdpbGwgYWN0dWFsbHkgYmUgcGFyc2VkIHdoZW4gaXQgaXMgZmlyc3QgYWNjZXNzZWQuCgogVGhpcyBpcyBvbmx5IGEgaGludC4gIEltcGxlbWVudGF0aW9ucyBhcmUgZnJlZSB0byBjaG9vc2Ugd2hldGhlciB0byB1c2UKIGVhZ2VyIG9yIGxhenkgcGFyc2luZyByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiB0aGlzIG9wdGlvbi4gIEhvd2V2ZXIsCiBzZXR0aW5nIHRoaXMgb3B0aW9uIHRydWUgc3VnZ2VzdHMgdGhhdCB0aGUgcHJvdG9jb2wgYXV0aG9yIGJlbGlldmVzIHRoYXQKIHVzaW5nIGxhenkgcGFyc2luZyBvbiB0aGlzIGZpZWxkIGlzIHdvcnRoIHRoZSBhZGRpdGlvbmFsIGJvb2trZWVwaW5nCiBvdmVyaGVhZCB0eXBpY2FsbHkgbmVlZGVkIHRvIGltcGxlbWVudCBpdC4KCiBUaGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgdGhlIHB1YmxpYyBpbnRlcmZhY2Ugb2YgYW55IGdlbmVyYXRlZCBjb2RlOwogYWxsIG1ldGhvZCBzaWduYXR1cmVzIHJlbWFpbiB0aGUgc2FtZS4gIEZ1cnRoZXJtb3JlLCB0aHJlYWQtc2FmZXR5IG9mIHRoZQogaW50ZXJmYWNlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGlzIG9wdGlvbjsgY29uc3QgbWV0aG9kcyByZW1haW4gc2FmZSB0bwogY2FsbCBmcm9tIG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LCB3aGlsZSBub24tY29uc3QgbWV0aG9kcyBjb250aW51ZQogdG8gcmVxdWlyZSBleGNsdXNpdmUgYWNjZXNzLgoKCiBOb3RlIHRoYXQgaW1wbGVtZW50YXRpb25zIG1heSBjaG9vc2Ugbm90IHRvIGNoZWNrIHJlcXVpcmVkIGZpZWxkcyB3aXRoaW4KIGEgbGF6eSBzdWItbWVzc2FnZS4gIFRoYXQgaXMsIGNhbGxpbmcgSXNJbml0aWFsaXplZCgpIG9uIHRoZSBvdXRlciBtZXNzYWdlCiBtYXkgcmV0dXJuIHRydWUgZXZlbiBpZiB0aGUgaW5uZXIgbWVzc2FnZSBoYXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG90aGVyd2lzZSB0aGUgaW5uZXIgbWVzc2FnZSB3b3VsZCBoYXZlIHRvIGJlCiBwYXJzZWQgaW4gb3JkZXIgdG8gcGVyZm9ybSB0aGUgY2hlY2ssIGRlZmVhdGluZyB0aGUgcHVycG9zZSBvZiBsYXp5CiBwYXJzaW5nLiAgQW4gaW1wbGVtZW50YXRpb24gd2hpY2ggY2hvb3NlcyBub3QgdG8gY2hlY2sgcmVxdWlyZWQgZmllbGRzCiBtdXN0IGJlIGNvbnNpc3RlbnQgYWJvdXQgaXQuICBUaGF0IGlzLCBmb3IgYW55IHBhcnRpY3VsYXIgc3ViLW1lc3NhZ2UsIHRoZQogaW1wbGVtZW50YXRpb24gbXVzdCBlaXRoZXIgKmFsd2F5cyogY2hlY2sgaXRzIHJlcXVpcmVkIGZpZWxkcywgb3IgKm5ldmVyKgogY2hlY2sgaXRzIHJlcXVpcmVkIGZpZWxkcywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgbWVzc2FnZSBoYXMKIGJlZW4gcGFyc2VkLgoKDQoFBAwCAwQSBMQEAgoKDQoFBAwCAwUSBMQECw8KDQoFBAwCAwESBMQEEBQKDQoFBAwCAwMSBMQEFxgKDQoFBAwCAwgSBMQEGSoKDQoFBAwCAwcSBMQEJCkK6AEKBAQMAgQSBMoEAjEa2QEgSXMgdGhpcyBmaWVsZCBkZXByZWNhdGVkPwogRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucwogZm9yIGFjY2Vzc29ycywgb3IgaXQgd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQ7IGluIHRoZSB2ZXJ5IGxlYXN0LCB0aGlzCiBpcyBhIGZvcm1hbGl6YXRpb24gZm9yIGRlcHJlY2F0aW5nIGZpZWxkcy4KCg0KBQQMAgQEEgTKBAIKCg0KBQQMAgQFEgTKBAsPCg0KBQQMAgQBEgTKBBAaCg0KBQQMAgQDEgTKBB0eCg0KBQQMAgQIEgTKBB8wCg0KBQQMAgQHEgTKBCovCj8KBAQMAgUSBM0EAiwaMSBGb3IgR29vZ2xlLWludGVybmFsIG1pZ3JhdGlvbiBvbmx5LiBEbyBub3QgdXNlLgoK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ZXNzYWdlLiBTZWUgYWJvdmUuCgoMCgQEEQUAEgS0BQ0YCg0KBQQRBQABEgS0BQ0RCg0KBQQRBQACEgS0BRUYCosDCgIEEhIGvgUA0gUBGvwCIEEgbWVzc2FnZSByZXByZXNlbnRpbmcgYSBvcHRpb24gdGhlIHBhcnNlciBkb2VzIG5vdCByZWNvZ25pemUuIFRoaXMgb25seQogYXBwZWFycyBpbiBvcHRpb25zIHByb3RvcyBjcmVhdGVkIGJ5IHRoZSBjb21waWxlcjo6UGFyc2VyIGNsYXNzLgogRGVzY3JpcHRvclBvb2wgcmVzb2x2ZXMgdGhlc2Ugd2hlbiBidWlsZGluZyBEZXNjcmlwdG9yIG9iamVjdHMuIFRoZXJlZm9yZSwKIG9wdGlvbnMgcHJvdG9zIGluIGRlc2NyaXB0b3Igb2JqZWN0cyAoZS5nLiByZXR1cm5lZCBieSBEZXNjcmlwdG9yOjpvcHRpb25zKCksCiBvciBwcm9kdWNlZCBieSBEZXNjcmlwdG9yOjpDb3B5VG8oKSkgd2lsbCBuZXZlciBoYXZlIFVuaW50ZXJwcmV0ZWRPcHRpb25zCiBpbiB0aGVtLgoKCwoDBBIBEgS+BQgbCssCCgQEEgMAEgbEBQLHBQMaugIgVGhlIG5hbWUgb2YgdGhlIHVuaW50ZXJwcmV0ZWQgb3B0aW9uLiAgRWFjaCBzdHJpbmcgcmVwcmVzZW50cyBhIHNlZ21lbnQgaW4KIGEgZG90LXNlcGFyYXRlZCBuYW1lLiAgaXNfZXh0ZW5zaW9uIGlzIHRydWUgaWZmIGEgc2VnbWVudCByZXByZXNlbnRzIGFuCiBleHRlbnNpb24gKGRlbm90ZWQgd2l0aCBwYXJlbnRoZXNlcyBpbiBvcHRpb25zIHNwZWNzIGluIC5wcm90byBmaWxlcykuCiBFLmcuLHsgWyJmb28iLCBmYWxzZV0sIFsiYmFyLmJheiIsIHRydWVdLCBbInF1eCIsIGZhbHNlXSB9IHJlcHJlc2VudHMKICJmb28uKGJhci5iYXopLnF1eCIuCgoNCgUEEgMAARIExAUKEgoOCgYEEgMAAgASBMUFBCIKDwoHBBIDAAIABBIExQUEDAoPCgcEEgMAAgAFEgTFBQ0TCg8KBwQSAwACAAESBMUFFB0KDwoHBBIDAAIA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ZXIgdG8gYSByZXBlYXRlZCBmaWVsZCBpdHNlbGYgKGkuZS4gbm90IHRvIGFueQogICBwYXJ0aWN1bGFyIGluZGV4IHdpdGhpbiBpdCkuICBUaGlzIGlzIHVzZWQgd2hlbmV2ZXIgYSBzZXQgb2YgZWxlbWVudHMgYXJlCiAgIGxvZ2ljYWxseSBlbmNsb3NlZCBpbiBhIHNpbmdsZSBjb2RlIHNlZ21lbnQuICBGb3IgZXhhbXBsZSwgYW4gZW50aXJlCiAgIGV4dGVuZCBibG9jayAocG9zc2libHkgY29udGFpbmluZyBtdWx0aXBsZSBleHRlbnNpb24gZGVmaW5pdGlvbnMpIHdpbGwKICAgaGF2ZSBhbiBvdXRlciBsb2NhdGlvbiB3aG9zZSBwYXRoIHJlZmVycyB0byB0aGUgImV4dGVuc2lvbnMiIHJlcGVhdGVkCiAgIGZpZWxkIHdpdGhvdXQgYW4gaW5kZXguCiAtIE11bHRpcGxlIGxvY2F0aW9ucyBtYXkgaGF2ZSB0aGUgc2FtZSBwYXRoLiAgVGhpcyBoYXBwZW5zIHdoZW4gYSBzaW5nbGUKICAgbG9naWNhbCBkZWNsYXJhdGlvbiBpcyBzcHJlYWQgb3V0IGFjcm9zcyBtdWx0aXBsZSBwbGFjZXMuICBUaGUgbW9zdAogICBvYnZpb3VzIGV4YW1wbGUgaXMgdGhlICJleHRlbmQiIGJsb2NrIGFnYWluIC0tIHRoZXJlIG1heSBiZSBtdWx0aXBsZQogICBleHRlbmQgYmxvY2tzIGluIHRoZSBzYW1lIHNjb3BlLCBlYWNoIG9mIHdoaWNoIHdpbGwgaGF2ZSB0aGUgc2FtZSBwYXRoLgogLSBBIGxvY2F0aW9uJ3Mgc3BhbiBpcyBub3QgYWx3YXlzIGEgc3Vic2V0IG9mIGl0cyBwYXJlbnQncyBzcGFuLiAgRm9yCiAgIGV4YW1wbGUsIHRoZSAiZXh0ZW5kZWUiIG9mIGFuIGV4dGVuc2lvbiBkZWNsYXJhdGlvbiBhcHBlYXJzIGF0IHRoZQogICBiZWdpbm5pbmcgb2YgdGhlICJleHRlbmQiIGJsb2NrIGFuZCBpcyBzaGFyZWQgYnkgYWxsIGV4dGVuc2lvbnMgd2l0aGluCiAgIHRoZSBibG9jay4KIC0gSnVzdCBiZWNhdXNlIGEgbG9jYXRpb24ncyBzcGFuIGlzIGEgc3Vic2V0IG9mIHNvbWUgb3RoZXIgbG9jYXRpb24ncyBzcGFuCiAgIGRvZXMgbm90IG1lYW4gdGhhdCBpdCBpcyBhIGRlc2NlbmRhbnQuICBGb3IgZXhhbXBsZSwgYSAiZ3JvdXAiIGRlZmluZXMKICAgYm90aCBhIHR5cGUgYW5kIGEgZmllbGQgaW4gYSBzaW5nbGUgZGVjbGFyYXRpb24uICBUaHVzLCB0aGUgbG9jYXRpb25zCiAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgYW5kIGZpZWxkIGFuZCB0aGVpciBjb21wb25lbnRzIHdpbGwgb3ZlcmxhcC4KIC0gQ29kZSB3aGljaCB0cmllcyB0byBpbnRlcnByZXQgbG9jYXRpb25zIHNob3VsZCBwcm9iYWJseSBiZSBkZXNpZ25lZCB0bwogICBpZ25vcmUgdGhvc2UgdGhhdCBpdCBkb2Vzbid0IHVuZGVyc3RhbmQsIGFzIG1vcmUgdHlwZXMgb2YgbG9jYXRpb25zIGNvdWxkCiAgIGJlIHJlY29yZGVkIGluIHRoZSBmdXR1cmUuCgoNCgUEEwIABBIEhQYCCgoNCgUEEwIABhIEhQYLEwoNCgUEEwIAARIEhQYUHAoNCgUEEwIAAxIEhQYfIAoOCgQEEwMAEgaGBgLZBgMKDQoFBBMDAAESBIYGChIKgwcKBgQTAwACABIEngYELBryBiBJZGVudGlmaWVzIHdoaWNoIHBhcnQgb2YgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8gd2FzIGRlZmluZWQgYXQgdGhpcwogbG9jYXRpb24uCgogRWFjaCBlbGVtZW50IGlzIGEgZmllbGQgbnVtYmVyIG9yIGFuIGluZGV4LiAgVGhleSBmb3JtIGEgcGF0aCBmcm9tCiB0aGUgcm9vdCBGaWxlRGVzY3JpcHRvclByb3RvIHRvIHRoZSBwbGFjZSB3aGVyZSB0aGUgZGVmaW5pdGlvbi4gIEZvcgogZXhhbXBsZSwgdGhpcyBwYXRoOgogICBbIDQsIDMsIDIsIDcsIDEgXQogcmVmZXJzIHRvOgogICBmaWxlLm1lc3NhZ2VfdHlwZSgzKSAgLy8gNCwgMwogICAgICAgLmZpZWxkKDcpICAgICAgICAgLy8gMiwgNwogICAgICAgLm5hbWUoKSAgICAgICAgICAgLy8gMQogVGhpcyBpcyBiZWNhdXNlIEZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlIGhhcyBmaWVsZCBudW1iZXIgNDoKICAgcmVwZWF0ZWQgRGVzY3JpcHRvclByb3RvIG1lc3NhZ2VfdHlwZSA9IDQ7CiBhbmQgRGVzY3JpcHRvclByb3RvLmZpZWxkIGhhcyBmaWVsZCBudW1iZXIgMjoKICAgcmVwZWF0ZWQgRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOwogYW5kIEZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUgaGFzIGZpZWxkIG51bWJlciAxOgogICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CgogVGh1cywgdGhlIGFib3ZlIHBhdGggZ2l2ZXMgdGhlIGxvY2F0aW9uIG9mIGEgZmllbGQgbmFtZS4gIElmIHdlIHJlbW92ZWQKIHRoZSBsYXN0IGVsZW1lbnQ6CiAgIFsgNCwgMywgMiwgNyBdCiB0aGlzIHBhdGggcmVmZXJzIHRvIHRoZSB3aG9sZSBmaWVsZCBkZWNsYXJhdGlvbiAoZnJvbSB0aGUgYmVnaW5uaW5nCiBvZiB0aGUgbGFiZWwgdG8gdGhlIHRlcm1pbmF0aW5nIHNlbWljb2xvbikuCgoPCgcEEwMAAgAEEgSeBgQMCg8KBwQTAwACAAUSBJ4GDRIKDwoHBBMDAAIAARIEngYTFwoPCgcEEwMAAgADEgSeBhobCg8KBwQTAwACAAgSBJ4GHCsKEAoIBBMDAAIACAISBJ4GHSoK0gIKBgQTAwACARIEpQYELBrBAiBBbHdheXMgaGFzIGV4YWN0bHkgdGhyZWUgb3IgZm91ciBlbGVtZW50czogc3RhcnQgbGluZSwgc3RhcnQgY29sdW1uLAogZW5kIGxpbmUgKG9wdGlvbmFsLCBvdGhlcndpc2UgYXNzdW1lZCBzYW1lIGFzIHN0YXJ0IGxpbmUpLCBlbmQgY29sdW1uLgogVGhlc2UgYXJlIHBhY2tlZCBpbnRvIGEgc2luZ2xlIGZpZWxkIGZvciBlZmZpY2llbmN5LiAgTm90ZSB0aGF0IGxpbmUKIGFuZCBjb2x1bW4gbnVtYmVycyBhcmUgemVyby1iYXNlZCAtLSB0eXBpY2FsbHkgeW91IHdpbGwgd2FudCB0byBhZGQKIDEgdG8gZWFjaCBiZWZvcmUgZGlzcGxheWluZyB0byBhIHVzZXIuCgoPCgcEEwMAAgEEEgSlBgQMCg8KBwQTAwACAQUSBKUGDRIKDwoHBBMDAAIBARIEpQYTFwoPCgcEEwMAAgEDEgSlBhobCg8KBwQTAwACAQgSBKUGHCsKEAoIBBMDAAIBCAISBKUGHSoKpQwKBgQTAwACAhIE1gYEKRqUDCBJZiB0aGlzIFNvdXJjZUNvZGVJbmZvIHJlcHJlc2VudHMgYSBjb21wbGV0ZSBkZWNsYXJhdGlvbiwgdGhlc2UgYXJlIGFueQogY29tbWVudHMgYXBwZWFyaW5nIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGRlY2xhcmF0aW9uIHdoaWNoIGFwcGVhciB0byBiZQogYXR0YWNoZWQgdG8gdGhlIGRlY2xhcmF0aW9uLgoKIEEgc2VyaWVzIG9mIGxpbmUgY29tbWVudHMgYXBwZWFyaW5nIG9uIGNvbnNlY3V0aXZlIGxpbmVzLCB3aXRoIG5vIG90aGVyCiB0b2tlbnMgYXBwZWFyaW5nIG9uIHRob3NlIGxpbmVzLCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBzaW5nbGUgY29tbWVudC4KCiBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzIHdpbGwga2VlcCBwYXJhZ3JhcGhzIG9mIGNvbW1lbnRzIHRoYXQgYXBwZWFyCiBiZWZvcmUgKGJ1dCBub3QgY29ubmVjdGVkIHRvKSB0aGUgY3VycmVudCBlbGVtZW50LiBFYWNoIHBhcmFncmFwaCwKIHNlcGFyYXRlZCBieSBlbXB0eSBsaW5lcywgd2lsbCBiZSBvbmUgY29tbWVudCBlbGVtZW50IGluIHRoZSByZXBlYXRlZAogZmllbGQuCgogT25seSB0aGUgY29tbWVudCBjb250ZW50IGlzIHByb3ZpZGVkOyBjb21tZW50IG1hcmtlcnMgKGUuZy4gLy8pIGFyZQogc3RyaXBwZWQgb3V0LiAgRm9yIGJsb2NrIGNvbW1lbnRzLCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIGFuIGFzdGVyaXNrCiB3aWxsIGJlIHN0cmlwcGVkIGZyb20gdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgb3RoZXIgdGhhbiB0aGUgZmlyc3QuCiBOZXdsaW5lcyBhcmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4KCiBFeGFtcGxlczoKCiAgIG9wdGlvbmFsIGludDMyIGZvbyA9IDE7ICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGZvby4KICAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBiYXIuCiAgIG9wdGlvbmFsIGludDMyIGJhciA9IDI7CgogICBvcHRpb25hbCBzdHJpbmcgYmF6ID0gMzsKICAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBiYXouCiAgIC8vIEFub3RoZXIgbGluZSBhdHRhY2hlZCB0byBiYXouCgogICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIHF1eC4KICAgLy8KICAgLy8gQW5vdGhlciBsaW5lIGF0dGFjaGVkIHRvIHF1eC4KICAgb3B0aW9uYWwgZG91YmxlIHF1eCA9IDQ7CgogICAvLyBEZXRhY2hlZCBjb21tZW50IGZvciBjb3JnZS4gVGhpcyBpcyBub3QgbGVhZGluZyBvciB0cmFpbGluZyBjb21tZW50cwogICAvLyB0byBxdXggb3IgY29yZ2UgYmVjYXVzZSB0aGVyZSBhcmUgYmxhbmsgbGluZXMgc2VwYXJhdGluZyBpdCBmcm9tCiAgIC8vIGJvdGguCgogICAvLyBEZXRhY2hlZCBjb21tZW50IGZvciBjb3JnZSBwYXJhZ3JhcGggMi4KCiAgIG9wdGlvbmFsIHN0cmluZyBjb3JnZSA9IDU7CiAgIC8qIEJsb2NrIGNvbW1lbnQgYXR0YWNoZWQKICAgICogdG8gY29yZ2UuICBMZWFkaW5nIGFzdGVyaXNrcwogICAgKiB3aWxsIGJlIHJlbW92ZWQuICovCiAgIC8qIEJsb2NrIGNvbW1lbnQgYXR0YWNoZWQgdG8KICAgICogZ3JhdWx0LiAqLwogICBvcHRpb25hbCBpbnQzMiBncmF1bHQgPSA2OwoKICAgLy8gaWdub3JlZCBkZXRhY2hlZCBjb21tZW50cy4KCg8KBwQTAwACAgQSBNYG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QwoNZW51bV9zdHJpbmdlchIcLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucxjG5AMgASgIUgxlbnVtU3RyaW5nZXI6RwoPZW51bV9jdXN0b21uYW1lEhwuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zGMfkAyABKAlSDmVudW1DdXN0b21uYW1lOjoKCGVudW1kZWNsEhwuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zGMjkAyABKAhSCGVudW1kZWNsOlYKFGVudW12YWx1ZV9jdXN0b21uYW1lEiEuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMY0YMEIAEoCVITZW51bXZhbHVlQ3VzdG9tbmFtZTpOChNnb3Byb3RvX2dldHRlcnNfYWxsEhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGJnsAyABKAhSEWdvcHJvdG9HZXR0ZXJzQWxsOlUKF2dvcHJvdG9fZW51bV9wcmVmaXhfYWxsEhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGJrsAyABKAhSFGdvcHJvdG9FbnVtUHJlZml4QWxsOlAKFGdvcHJvdG9fc3RyaW5nZXJfYWxsEhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGJvsAyABKAhSEmdvcHJvdG9TdHJpbmdlckFsbDpKChF2ZXJib3NlX2VxdWFsX2FsbBIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxic7AMgASgIUg92ZXJib3NlRXF1YWxBbGw6OQoIZmFjZV9hbGwSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMYnewDIAEoCFIHZmFjZUFsbDpBCgxnb3N0cmluZ19hbGwSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMYnuwDIAEoCFILZ29zdHJpbmdBbGw6QQoMcG9wdWxhdGVfYWxsEhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGJ/sAyABKAhSC3BvcHVsYXRlQWxsOkEKDHN0cmluZ2VyX2FsbBIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxig7AMgASgIUgtzdHJpbmdlckFsbDo/Cgtvbmx5b25lX2FsbBIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxih7AMgASgIUgpvbmx5b25lQWxsOjsKCWVxdWFsX2FsbBIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxil7AMgASgIUghlcXVhbEFsbDpHCg9kZXNjcmlwdGlvbl9hbGwSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMYpuwDIAEoCFIOZGVzY3JpcHRpb25BbGw6PwoLdGVzdGdlbl9hbGwSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMYp+wDIAEoCFIKdGVzdGdlbkFsbDpBCgxiZW5jaGdlbl9hbGwSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMYqOwDIAEoCFILYmVuY2hnZW5BbGw6QwoNbWFyc2hhbGVyX2FsbBIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxip7AMgASgIUgxtYXJzaGFsZXJBbGw6RwoPdW5tYXJzaGFsZXJfYWxsEhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGKrsAyABKAhSDnVubWFyc2hhbGVyQWxsOlAKFHN0YWJsZV9tYXJzaGFsZXJfYWxsEhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGKvsAyABKAhSEnN0YWJsZU1hcnNoYWxlckFsbDo7CglzaXplcl9hbGwSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMYrOwDIAEoCFIIc2l6ZXJBbGw6WQoZZ29wcm90b19lbnVtX3N0cmluZ2VyX2FsbBIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxit7AMgASgIUhZnb3Byb3RvRW51bVN0cmluZ2VyQWxsOkoKEWVudW1fc3RyaW5nZXJfYWxsEhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGK7sAyABKAhSD2VudW1TdHJpbmdlckFsbDpQChR1bnNhZmVfbWFyc2hhbGVyX2FsbBIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxiv7AMgASgIUhJ1bnNhZmVNYXJzaGFsZXJBbGw6VAoWdW5zYWZlX3VubWFyc2hhbGVyX2FsbBIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxiw7AMgASgIUhR1bnNhZmVVbm1hcnNoYWxlckFsbDpbChpnb3Byb3RvX2V4dGVuc2lvbnNfbWFwX2FsbBIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxix7AMgASgIUhdnb3Byb3RvRXh0ZW5zaW9uc01hcEFsbDpYChhnb3Byb3RvX3VucmVjb2duaXplZF9hbGwSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMYsuwDIAEoCFIWZ29wcm90b1VucmVjb2duaXplZEFsbDpJChBnb2dvcHJvdG9faW1wb3J0EhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGLPsAyABKAhSD2dvZ29wcm90b0ltcG9ydDpFCg5wcm90b3NpemVyX2FsbBIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxi07AMgASgIUg1wcm90b3NpemVyQWxsOj8KC2NvbXBhcmVfYWxsEhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGLXsAyABKAhSCmNvbXBhcmVBbGw6QQoMdHlwZWRlY2xfYWxsEhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGLbsAyABKAhSC3R5cGVkZWNsQWxsOkEKDGVudW1kZWNsX2FsbBIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxi37AMgASgIUgtlbnVtZGVjbEFsbDpRChRnb3Byb3RvX3JlZ2lzdHJhdGlvbhIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxi47AMgASgIUhNnb3Byb3RvUmVnaXN0cmF0aW9uOkcKD21lc3NhZ2VuYW1lX2FsbBIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxi57AMgASgIUg5tZXNzYWdlbmFtZUFsbDpSChVnb3Byb3RvX3NpemVjYWNoZV9hbGwSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMYuuwDIAEoCFITZ29wcm90b1NpemVjYWNoZUFsbDpOChNnb3Byb3RvX3Vua2V5ZWRfYWxsEhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGLvsAyABKAhSEWdvcHJvdG9VbmtleWVkQWxsOkoKD2dvcHJvdG9fZ2V0dGVycxIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiB9AMgASgIUg5nb3Byb3RvR2V0dGVyczpMChBnb3Byb3RvX3N0cmluZ2VyEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGIP0AyABKAhSD2dvcHJvdG9TdHJpbmdlcjpGCg12ZXJib3NlX2VxdWFsEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGIT0AyABKAhSDHZlcmJvc2VFcXVhbDo1CgRmYWNlEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGIX0AyABKAhSBGZhY2U6PQoIZ29zdHJpbmcSHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYhvQDIAEoCFIIZ29zdHJpbmc6PQoIcG9wdWxhdGUSHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYh/QDIAEoCFIIcG9wdWxhdGU6PQoIc3RyaW5nZXISHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYwIsEIAEoCFIIc3RyaW5nZXI6OwoHb25seW9uZRIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiJ9AMgASgIUgdvbmx5b25lOjcKBWVxdWFsEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGI30AyABKAhSBWVxdWFsOkMKC2Rlc2NyaXB0aW9uEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGI70AyABKAhSC2Rlc2NyaXB0aW9uOjsKB3Rlc3RnZW4SHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYj/QDIAEoCFIHdGVzdGdlbjo9CghiZW5jaGdlbhIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiQ9AMgASgIUghiZW5jaGdlbjo/CgltYXJzaGFsZXISHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYkfQDIAEoCFIJbWFyc2hhbGVyOkMKC3VubWFyc2hhbGVyEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGJL0AyABKAhSC3VubWFyc2hhbGVyOkwKEHN0YWJsZV9tYXJzaGFsZXISHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYk/QDIAEoCFIPc3RhYmxlTWFyc2hhbGVyOjcKBXNpemVyEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGJT0AyABKAhSBXNpemVyOkwKEHVuc2FmZV9tYXJzaGFsZXISHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYl/QDIAEoCFIPdW5zYWZlTWFyc2hhbGVyOlAKEnVuc2FmZV91bm1hcnNoYWxlchIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiY9AMgASgIUhF1bnNhZmVVbm1hcnNoYWxlcjpXChZnb3Byb3RvX2V4dGVuc2lvbnNfbWFwEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGJn0AyABKAhSFGdvcHJvdG9FeHRlbnNpb25zTWFwOlQKFGdvcHJvdG9fdW5yZWNvZ25pemVkEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGJr0AyABKAhSE2dvcHJvdG9VbnJlY29nbml6ZWQ6QQoKcHJvdG9zaXplchIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxic9AMgASgIUgpwcm90b3NpemVyOjsKB2NvbXBhcmUSHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYnfQDIAEoCFIHY29tcGFyZTo9Cgh0eXBlZGVjbBIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxie9AMgASgIUgh0eXBlZGVjbDpDCgttZXNzYWdlbmFtZRIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxih9AMgASgIUgttZXNzYWdlbmFtZTpOChFnb3Byb3RvX3NpemVjYWNoZRIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxii9AMgASgIUhBnb3Byb3RvU2l6ZWNhY2hlOkoKD2dvcHJvdG9fdW5rZXllZBIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxij9AMgASgIUg5nb3Byb3RvVW5rZXllZDo7CghudWxsYWJsZRIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMY6fsDIAEoCFIIbnVsbGFibGU6NQoFZW1iZWQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGOr7AyABKAhSBWVtYmVkOj8KCmN1c3RvbXR5cGUSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGOv7AyABKAlSCmN1c3RvbXR5cGU6PwoKY3VzdG9tbmFtZRIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMY7PsDIAEoCVIKY3VzdG9tbmFtZTo5Cgdqc29udGFnEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxjt+wMgASgJUgdqc29udGFnOjsKCG1vcmV0YWdzEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxju+wMgASgJUghtb3JldGFnczo7CghjYXN0dHlwZRIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMY7/sDIAEoCVIIY2FzdHR5cGU6OQoHY2FzdGtleRIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMY8PsDIAEoCVIHY2FzdGtleTo9CgljYXN0dmFsdWUSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGPH7AyABKAlSCWNhc3R2YWx1ZTo5CgdzdGR0aW1lEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxjy+wMgASgIUgdzdGR0aW1lOkEKC3N0ZGR1cmF0aW9uEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxjz+wMgASgIUgtzdGRkdXJhdGlvbjo/Cgp3a3Rwb2ludGVyEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxj0+wMgASgIUgp3a3Rwb2ludGVyQkUKE2NvbS5nb29nbGUucHJvdG9idWZCCkdvR29Qcm90b3NaImdpdGh1Yi5jb20vZ29nby9wcm90b2J1Zi9nb2dvcHJvdG9K8TYKBxIFHACPAQEK/AoKAQwSAxwAEjLxCiBQcm90b2NvbCBCdWZmZXJzIGZvciBHbyB3aXRoIEdhZGdldHMKCiBDb3B5cmlnaHQgKGMpIDIwMTMsIFRoZSBHb0dvIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiBodHRwOi8vZ2l0aHViLmNvbS9nb2dvL3Byb3RvYnVmCgogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCiBtZXQ6CgogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKIGRpc3RyaWJ1dGlvbi4KCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiBTUEVDSUFMLCBFWEVN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ZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgq1BAoBAhIDGwAbGp0CIFRoZSBgb3BhYCBhZGFwdGVyIGV4cG9zZXMgYW4gW09wZW4gUG9saWN5IEFnZW50XShodHRwOi8vd3d3Lm9wZW5wb2xpY3lhZ2VudC5vcmcpIGVuZ2luZQogdGhhdCBwcm92aWRlcyBzb3BoaXN0aWNhdGVkIGFjY2VzcyBjb250cm9sIG1lY2hhbmlzbXMuCgogVGhpcyBhZGFwdGVyIHN1cHBvcnRzIHRoZSBbYXV0aG9yaXphdGlvbiB0ZW1wbGF0ZV0oaHR0cHM6Ly9pc3Rpby5pby9kb2NzL3JlZmVyZW5jZS9jb25maWcvcG9saWN5LWFuZC10ZWxlbWV0cnkvdGVtcGxhdGVzL2F1dGhvcml6YXRpb24vKS4KMooCICR0aXRsZTogT1BBCiAkZGVzY3JpcHRpb246IEFkYXB0ZXIgdGhhdCBpbXBsZW1lbnRzIGFuIE9wZW4gUG9saWN5IEFnZW50IGVuZ2luZS4KICRsb2NhdGlvbjogaHR0cHM6Ly9pc3Rpby5pby9kb2NzL3JlZmVyZW5jZS9jb25maWcvcG9saWN5LWFuZC10ZWxlbWV0cnkvYWRhcHRlcnMvb3BhLmh0bWwKICRzdXBwb3J0ZWRfdGVtcGxhdGVzOiBhdXRob3JpemF0aW9uCiAkYWxpYXNlczoKICQgIC0gL2RvY3MvcmVmZXJlbmNlL2NvbmZpZy9hZGFwdGVycy9vcGEuaHRtbAoKCQoCAwASAx0AHgoICgEIEgMfABsKCQoCCAsSAx8AGwoICgEIEgMgAC8KCwoECJnsAxIDIAAvCggKAQgSAyEAJQoLCgQIpewDEgMhACUKCAoBCBIDIgAoCgsKBAie7AMSAyIAKAq5BAoCBAASBEIATgEarAQgQ29uZmlndXJhdGlvbiBmb3JtYXQgZm9yIHRoZSBgb3BhYCBhZGFwdGVyLgoKIEV4YW1wbGUgY29uZmlndXJhdGlvbjoKIGBgYHlhbWwKIHBvbGljeToKICAgLSB8KwogICAgIHBhY2thZ2UgbWl4ZXJhdXRoegogICAgIHBvbGljeSA9IFsKICAgICAgIHsKICAgICAgICAgInJ1bGUiOiB7CiAgICAgICAgICAgInZlcmJzIjogWwogICAgICAgICAgICAgInN0b3JhZ2UuYnVja2V0cy5nZXQiCiAgICAgICAgICAgXSwKICAgICAgICAgICAidXNlcnMiOiBbCiAgICAgICAgICAgICAiYnVja2V0LWFkbWlucyIKICAgICAgICAgICBdCiAgICAgICAgIH0KICAgICAgIH0KICAgICBdCgogICAgIGRlZmF1bHQgYWxsb3cgPSBmYWxzZQoKICAgICBhbGxvdyA9IHRydWUgewogICAgICAgcnVsZSA9IHBvbGljeVtfXS5ydWxlCiAgICAgICBpbnB1dC5zdWJqZWN0LnVzZXIgPSBydWxlLnVzZXJzW19dCiAgICAgICBpbnB1dC5hY3Rpb24ubWV0aG9kID0gcnVsZS52ZXJic1tfXQogICAgIH0KIGNoZWNrTWV0aG9kOiAiZGF0YS5taXhlcmF1dGh6LmFsbG93IgogZmFpbENsb3NlOiB0cnVlCiBgYGAKCgoKAwQAARIDQggOCiMKBAQAAgASA0QCHRoWIExpc3Qgb2YgT1BBIHBvbGljaWVzCgoMCgUEAAIABBIDRAIKCgwKBQQAAgAFEgNECxEKDAoFBAACAAESA0QSGAoMCgUEAAIAAxIDRBscClIKBAQAAgESA0gCGhpFIFF1ZXJ5IG1ldGhvZCB0byBjaGVjay4KIEZvcm1hdDogYGRhdGEuPHBhY2thZ2UgbmFtZT4uPG1ldGhvZCBuYW1lPmAKCg0KBQQAAgEEEgRIAkQdCgwKBQQAAgEFEgNIAggKDAoFBAACAQESA0gJFQoMCgUEAAIBAxIDSBgZCrkBCgQEAAICEgNNAhYaqwEgQ2xvc2UgdGhlIGNsaWVudCByZXF1ZXN0IHdoZW4gYWRhcHRlciBoYXMgYSBpc3N1ZS4KIElmIGZhaWxDbG9zZSBpcyBzZXQgdG8gdHJ1ZSBhbmQgdGhlcmUgaXMgYSBydW50aW1lIGVycm9yLAogaW5zdGVhZCBvZiBkaXNhYmxpbmcgdGhlIGFkYXB0ZXIsIGNsb3NlIHRoZSBjbGllbnQgcmVxdWVzdAoKDQoFBAACAgQSBE0CSBoKDAoFBAACAgUSA00CBgoMCgUEAAICARIDTQcRCgwKBQQAAgIDEgNNFBViBnByb3RvMw==
14---
15