Repository: elastic/go-libaudit
Pull request #86 (2021-01-20 17:26:25)

Add ECS 1.8 session and map user and groups
Add ECS user and group fields to aucoalesce.Event:
- Update normalizations to enable population of ECS user.* and group.*
fields from event data (entity.*, object.*, uids and raw data).
- Refactors the user/group ID lookup as sometimes it's necessary to
lookup a user/group ID from a name.

Adds the new ECS `session` categorization to USER_START and USER_END messages.

elasticmachine: 
## :broken_heart: Tests Failed


<!-- BUILD BADGES-->
> _the below badges are clickable and redirect to their specific view in the CI or DOCS_
[![Pipeline View](https://img.shields.io/badge/pipeline-pipeline%20-green)](https://beats-ci.elastic.co/blue/organizations/jenkins/Library%2Fgo-libaudit-mbp%2FPR-86/detail/PR-86/1//pipeline) [![Test View](https://img.shields.io/badge/test-test-green)](https://beats-ci.elastic.co/blue/organizations/jenkins/Library%2Fgo-libaudit-mbp%2FPR-86/detail/PR-86/1//tests) [![Changes](https://img.shields.io/badge/changes-changes-green)](https://beats-ci.elastic.co/blue/organizations/jenkins/Library%2Fgo-libaudit-mbp%2FPR-86/detail/PR-86/1//changes) [![Artifacts](https://img.shields.io/badge/artifacts-artifacts-yellow)](https://beats-ci.elastic.co/blue/organizations/jenkins/Library%2Fgo-libaudit-mbp%2FPR-86/detail/PR-86/1//artifacts) [![preview](https://img.shields.io/badge/docs-preview-yellowgreen)](http://go-libaudit_86.docs-preview.app.elstc.co/diff)

<!-- BUILD SUMMARY-->
<details><summary>Expand to view the summary</summary>
<p>

#### Build stats


* Build Cause: `Pull request #86 opened`



* * Start Time: 2021-01-20T17:26:41.364+0000


* Duration: 2 min 54 sec


* Commit: 2edc0b12416d154621e175cbcdc94c7f39d08785



#### Test stats :test_tube:

| Test         | Results                         |
| ------------ | :-----------------------------: |
| Failed       | 5  |
| Passed       | 145  |
| Skipped      | 36 |
| Total        | 186   |


</p>
</details>

<!-- TEST RESULTS IF ANY-->

  ### Test errors [![5](https://img.shields.io/badge/5%20-red)](https://beats-ci.elastic.co/blue/organizations/jenkins/Library%2Fgo-libaudit-mbp%2FPR-86/detail/PR-86/1//tests)
<details><summary>Expand to view the tests failures</summary><p>
    
    
##### `TestCoalesceMessages – aucoalesce`


<ul>
<details><summary>Expand to view the error details</summary><p>

```
 Failed 
 ```
</p></details>
<li>no stacktrace</li>
</ul>
    
##### `TestCoalesceMessages/testdata/rhel-7-linux-3.10.0.yaml – aucoalesce`


<ul>
<details><summary>Expand to view the error details</summary><p>

```
 Failed 
 ```
</p></details>
<li>no stacktrace</li>
</ul>
    
##### `TestCoalesceMessages/testdata/rhel-7-linux-3.10.0.yaml/LOGIN_success – aucoalesce`


<ul>
<details><summary>Expand to view the error details</summary><p>

```
 Failed 
 ```
</p></details>
<li>no stacktrace</li>
</ul>
    
##### `[build failed] – rule`


<ul>
<details><summary>Expand to view the error details</summary><p>

```
 Failed 
 ```
</p></details>
<li>no stacktrace</li>
</ul>
    
##### `[build failed] – rule`


<ul>
<details><summary>Expand to view the error details</summary><p>

```
 Failed 
 ```
</p></details>
<li>no stacktrace</li>
</ul>
    
</p></details>


<!-- STEPS ERRORS IF ANY -->







### Steps errors [![1](https://img.shields.io/badge/1%20-red)](https://beats-ci.elastic.co/blue/organizations/jenkins/Library%2Fgo-libaudit-mbp%2FPR-86/detail/PR-86/1//pipeline)
  <details><summary>Expand to view the steps failures</summary>
  <p>

  
  
  
  
  
##### `test`
<ul>
<li>Took 0 min 17 sec . View more details on <a href="https://beats-ci.elastic.co//blue/rest/organizations/jenkins/pipelines/Library/pipelines/go-libaudit-mbp/pipelines/PR-86/runs/1/steps/99/log/?start=0">here</a></li>
<li>Description: <code>.ci/test.sh</code></l1>
</ul>
  
  </p>
  </details>



<!-- LOG OUTPUT-->
### Log output

<details><summary>Expand to view the last 100 lines of log output</summary>
<p>

```
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-16.10-linux-4.8.0.yaml/CONFIG_CHANGE_remove_rule (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-16.10-linux-4.8.0.yaml/CONFIG_CHANGE_update_rules (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-16.10-linux-4.8.0.yaml/EXECVE (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-16.10-linux-4.8.0.yaml/NETFILTER_CFG (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-16.10-linux-4.8.0.yaml/SERVICE_START (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-16.10-linux-4.8.0.yaml/USER_END (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-16.10-linux-4.8.0.yaml/USER_LOGIN_failed_ssh (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-16.10-linux-4.8.0.yaml/USER_LOGIN_success (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-16.10-linux-4.8.0.yaml/USER_START (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-16.10-linux-4.8.0.yaml/accept_syscall (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-16.10-linux-4.8.0.yaml/changed-system-time (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-16.10-linux-4.8.0.yaml/connect_syscall (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-16.10-linux-4.8.0.yaml/listen_syscall (0.00s)
[2021-01-20T17:28:34.113Z]     --- PASS: TestCoalesceMessages/testdata/ubuntu-17.04-linux-4.10.0.yaml (0.01s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-17.04-linux-4.10.0.yaml/CRED_ACQ (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-17.04-linux-4.10.0.yaml/CRED_DISP (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-17.04-linux-4.10.0.yaml/EXECVE_with_multiple_keys (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-17.04-linux-4.10.0.yaml/USER_ACCT (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-17.04-linux-4.10.0.yaml/USER_AUTH (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-17.04-linux-4.10.0.yaml/USER_CHAUTHTOK_failed (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-17.04-linux-4.10.0.yaml/USER_CMD (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-17.04-linux-4.10.0.yaml/USER_END (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-17.04-linux-4.10.0.yaml/USER_ERR (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-17.04-linux-4.10.0.yaml/USER_LOGIN (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-17.04-linux-4.10.0.yaml/USER_START (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-17.04-linux-4.10.0.yaml/getpeername_syscall (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-17.04-linux-4.10.0.yaml/getsockname_syscall (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-17.04-linux-4.10.0.yaml/rename_syscall (0.00s)
[2021-01-20T17:28:34.113Z]         --- PASS: TestCoalesceMessages/testdata/ubuntu-17.04-linux-4.10.0.yaml/unlink_syscall (0.00s)
[2021-01-20T17:28:34.113Z] === RUN   TestUIDLookup
[2021-01-20T17:28:34.113Z]     id_lookup_test.go:37: jenkins jenkins
[2021-01-20T17:28:34.113Z] --- PASS: TestUIDLookup (0.00s)
[2021-01-20T17:28:34.113Z] === RUN   TestResolveIDs
[2021-01-20T17:28:34.113Z]     id_lookup_test.go:74: &{Timestamp:0001-01-01 00:00:00 +0000 UTC Sequence:0 Category:unknown Type:UNKNOWN[0] Result: Session: Tags:[] Summary:{Actor:{Primary:jenkins Secondary:} Action: Object:{Type: Primary: Secondary:} How:} User:{IDs:map[auid:1158 gid:1159] Names:map[auid:jenkins gid:jenkins] SELinux:map[]} Process:{PID: PPID: Title: Name: Exe: CWD: Args:[]} File:<nil> Source:<nil> Dest:<nil> Net:<nil> Data:map[] Paths:[] ECS:{Event:{Category:[] Type:[] Outcome:} User:{ECSEntityData:{Name:jenkins ID:1158} Effective:{Name:jenkins ID:1158} Target:{Name: ID:} Changes:{Name: ID:}} Group:{ECSEntityData:{Name: ID:} Effective:{Name: ID:} Target:{Name: ID:} Changes:{Name: ID:}}} Warnings:[]}
[2021-01-20T17:28:34.113Z] --- PASS: TestResolveIDs (0.00s)
[2021-01-20T17:28:34.113Z] === RUN   TestNameLookup
[2021-01-20T17:28:34.113Z] --- PASS: TestNameLookup (0.00s)
[2021-01-20T17:28:34.113Z] === RUN   TestHardcoded
[2021-01-20T17:28:34.113Z] --- PASS: TestHardcoded (0.00s)
[2021-01-20T17:28:34.113Z] === RUN   TestNormInit
[2021-01-20T17:28:34.113Z] --- PASS: TestNormInit (0.00s)
[2021-01-20T17:28:34.113Z] === RUN   TestLoadNormalizationConfig
[2021-01-20T17:28:34.113Z] --- PASS: TestLoadNormalizationConfig (0.01s)
[2021-01-20T17:28:34.113Z] === RUN   TestStrings_UnmarshalYAML
[2021-01-20T17:28:34.113Z] --- PASS: TestStrings_UnmarshalYAML (0.00s)
[2021-01-20T17:28:34.113Z] FAIL
[2021-01-20T17:28:34.113Z] FAIL	github.com/elastic/go-libaudit/v2/aucoalesce	0.043s
[2021-01-20T17:28:34.113Z] === RUN   TestNormalizeAuditMessage
[2021-01-20T17:28:34.113Z] --- PASS: TestNormalizeAuditMessage (0.00s)
[2021-01-20T17:28:34.113Z] === RUN   TestParseAuditHeader
[2021-01-20T17:28:34.113Z] --- PASS: TestParseAuditHeader (0.00s)
[2021-01-20T17:28:34.113Z] === RUN   TestGetAuditMessageType
[2021-01-20T17:28:34.113Z] --- PASS: TestGetAuditMessageType (0.00s)
[2021-01-20T17:28:34.113Z] === RUN   TestExtractKeyValuePairs
[2021-01-20T17:28:34.113Z] --- PASS: TestExtractKeyValuePairs (0.00s)
[2021-01-20T17:28:34.113Z] === RUN   TestParseLogLineFromFiles
[2021-01-20T17:28:34.113Z] --- PASS: TestParseLogLineFromFiles (0.01s)
[2021-01-20T17:28:34.113Z] === RUN   TestParseSockaddr
[2021-01-20T17:28:34.113Z] --- PASS: TestParseSockaddr (0.00s)
[2021-01-20T17:28:34.113Z] === RUN   ExampleParseLogLine
[2021-01-20T17:28:34.113Z] --- PASS: ExampleParseLogLine (0.00s)
[2021-01-20T17:28:34.113Z] PASS
[2021-01-20T17:28:34.113Z] ok  	github.com/elastic/go-libaudit/v2/auparse	0.010s
[2021-01-20T17:28:34.113Z] ?   	github.com/elastic/go-libaudit/v2/cmd/audit	[no test files]
[2021-01-20T17:28:34.113Z] ?   	github.com/elastic/go-libaudit/v2/cmd/auparse	[no test files]
[2021-01-20T17:28:34.113Z] FAIL	github.com/elastic/go-libaudit/v2/rule [build failed]
[2021-01-20T17:28:34.113Z] === RUN   TestFlagsParse
[2021-01-20T17:28:34.113Z]     flags_test.go:149: -w /etc/shadow -p wa -k identity
[2021-01-20T17:28:34.113Z]     flags_test.go:144: parse error: invalid value "cwa" for flag -p: invalid file access type: 'c' in rule: -w /etc/shadow -p cwa
[2021-01-20T17:28:34.113Z]     flags_test.go:149: -w /etc/shadow -p wa -k identity -k users
[2021-01-20T17:28:34.113Z]     flags_test.go:149: -a always,exit -F path=/etc/shadow -F perm=wa
[2021-01-20T17:28:34.113Z]     flags_test.go:149: -D
[2021-01-20T17:28:34.113Z]     flags_test.go:144: parse error: flag provided but not defined: -E in rule: -E
[2021-01-20T17:28:34.113Z]     flags_test.go:144: parse error: mutually exclusive flags uses together (delete all [-D] and audit rule [-a|-A|-S|-C|-F]) in rule: -D -a exit,always
[2021-01-20T17:28:34.113Z]     flags_test.go:144: parse error: missing an operation flag (add or delete rule) in rule: -k key
[2021-01-20T17:28:34.113Z]     flags_test.go:149: -D -k key
[2021-01-20T17:28:34.113Z]     flags_test.go:149: -D -D
[2021-01-20T17:28:34.114Z]     flags_test.go:144: parse error: audit rules cannot specify both [-A] and [-a] in rule: -a exit,always -A task,never
[2021-01-20T17:28:34.114Z]     flags_test.go:149: -A always,exit -C auid!=uid
[2021-01-20T17:28:34.114Z]     flags_test.go:149: -a exit,always -F auid>=1000
[2021-01-20T17:28:34.114Z] --- PASS: TestFlagsParse (0.00s)
[2021-01-20T17:28:34.114Z] PASS
[2021-01-20T17:28:34.114Z] ok  	github.com/elastic/go-libaudit/v2/rule/flags	0.009s
[2021-01-20T17:28:34.114Z] ?   	github.com/elastic/go-libaudit/v2/sys	[no test files]
[2021-01-20T17:28:34.114Z] FAIL
[2021-01-20T17:28:34.114Z] + '[' 2 -gt 0 ']'
[2021-01-20T17:28:34.114Z] + status=1
[2021-01-20T17:28:34.114Z] + go-junit-report
[2021-01-20T17:28:34.114Z] + '[' 1 -gt 0 ']'
[2021-01-20T17:28:34.114Z] + exit 1
[2021-01-20T17:28:34.205Z] Post stage
[2021-01-20T17:28:34.230Z] Recording test results
[2021-01-20T17:28:34.501Z] [Checks API] No suitable checks publisher found.
[2021-01-20T17:28:34.908Z] Running on Jenkins in /var/lib/jenkins/workspace/Library_go-libaudit-mbp_PR-86
[2021-01-20T17:28:35.133Z] [INFO] getVaultSecret: Getting secrets
[2021-01-20T17:28:35.216Z] Masking supported pattern matches of $VAULT_ADDR or $VAULT_ROLE_ID or $VAULT_SECRET_ID
[2021-01-20T17:28:35.989Z] + chmod 755 generate-build-data.sh
[2021-01-20T17:28:35.989Z] + ./generate-build-data.sh https://beats-ci.elastic.co/blue/rest/organizations/jenkins/pipelines/Library/go-libaudit-mbp/PR-86/ https://beats-ci.elastic.co/blue/rest/organizations/jenkins/pipelines/Library/go-libaudit-mbp/PR-86/runs/1 FAILURE 114356
[2021-01-20T17:28:36.540Z] INFO: curl https://beats-ci.elastic.co/blue/rest/organizations/jenkins/pipelines/Library/go-libaudit-mbp/PR-86/runs/1/steps/?limit=10000 -o steps-info.json
[2021-01-20T17:28:36.791Z] INFO: curl https://beats-ci.elastic.co/blue/rest/organizations/jenkins/pipelines/Library/go-libaudit-mbp/PR-86/runs/1/tests/?status=FAILED -o tests-errors.json

```

</p>
</details>



<!--COMMENT_GENERATED_WITH_ID_comment.id-->
adriansr: Been discussing @andrewstucki requests via Slack. The current status of this PR is that everything that we can support is supported:

> 
>     * `AUDIT_LOGIN`
> 
This one was (erroneously) ignored by Auditbeat. I've added support for it and will also update Auditbeat in https://github.com/elastic/beats/pull/23594.

>     * `AUDIT_CHGRP_ID`
>     * `AUDIT_CHUSER_ID`
This ones don't contain any interesting information for ECS multiuser enrichment, only generic *id fields which were already supported.

>     * syscalls: `chown`, `fchown`, `fchownat`, `lchown`
We decided to leave file ownership syscalls for now, as it's not clear how/if they fit into ECS 1.8 multiuser at all.

> `setuid`, `seteuid`, `setfsuid`, `setreuid`, `setgid`, `setegid`, `setfsgid`, `setregid`, `setresuid`, `setresgid`

The set*id syscalls are already supported through the generic *id fields.

Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d3b9174..eccb271 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,8 +7,12 @@ This project adheres to [Semantic Versioning](http://semver.org/).
 
 ### Added
 
+- Add user and group mapping for ECS 1.8 compatibility [#86](https://github.com/elastic/go-libaudit/pull/86)
+
 ### Changed
 
+- Change ECS category of USER_START and USER_END messages to `session`. [#86](https://github.com/elastic/go-libaudit/pull/86)
+
 ### Removed
 
 ### Deprecated
diff --git a/README.md b/README.md
index 77e460f..c9bcdde 100644
--- a/README.md
+++ b/README.md
@@ -83,7 +83,7 @@ result: success
 session: "4"
 summary:
   actor:
-    primary: "1000"
+    primary: vagrant
     secondary: root
   action: acquired-credentials
   object:
@@ -95,6 +95,7 @@ user:
     auid: "1000"
     uid: "0"
   names:
+    auid: vagrant
     uid: root
   selinux:
     category: c0.c1023
@@ -116,6 +117,15 @@ ecs:
     - authentication
     type:
     - info
+  user:
+    name: vagrant
+    id: "1000"
+    effective:
+      name: root
+      id: "0"
+    target: {}
+    changes: {}
+  group: {}
 
 ---
 timestamp: 2016-12-07T02:22:14.303Z
@@ -126,7 +136,7 @@ result: success
 session: "4"
 summary:
   actor:
-    primary: "1000"
+    primary: vagrant
     secondary: root
   action: started-session
   object:
@@ -138,6 +148,7 @@ user:
     auid: "1000"
     uid: "0"
   names:
+    auid: vagrant
     uid: root
   selinux:
     category: c0.c1023
@@ -159,6 +170,15 @@ ecs:
     - authentication
     type:
     - info
+  user:
+    name: vagrant
+    id: "1000"
+    effective:
+      name: root
+      id: "0"
+    target: {}
+    changes: {}
+  group: {}
 
 ---
 timestamp: 2016-12-07T02:22:14.304Z
@@ -169,7 +189,7 @@ result: success
 session: "4"
 summary:
   actor:
-    primary: "1000"
+    primary: vagrant
     secondary: root
   action: executed
   object:
@@ -188,12 +208,13 @@ user:
     suid: "0"
     uid: "0"
   names:
-    egid: wheel
+    auid: vagrant
+    egid: root
     euid: root
-    fsgid: wheel
+    fsgid: root
     fsuid: root
-    gid: wheel
-    sgid: wheel
+    gid: root
+    sgid: root
     suid: root
     uid: root
   selinux:
@@ -218,7 +239,7 @@ file:
   uid: "0"
   gid: "0"
   owner: root
-  group: wheel
+  group: root
   selinux:
     domain: su_exec_t
     level: s0
@@ -267,8 +288,13 @@ ecs:
     - process
     type:
     - start
+  user:
+    effective: {}
+    target: {}
+    changes: {}
+  group: {}
 ```
 
 ## ECS compatibility
 
-This currently provides [Elastic Common Schema (ECS) 1.5](https://www.elastic.co/guide/en/ecs/current/index.html) categorization support for some of the more prominent or meaningful auditd events and syscalls.
+This currently provides [Elastic Common Schema (ECS) 1.8](https://www.elastic.co/guide/en/ecs/current/index.html) categorization support for some of the more prominent or meaningful auditd events and syscalls.
diff --git a/aucoalesce/coalesce.go b/aucoalesce/coalesce.go
index db75f20..1d22fde 100644
--- a/aucoalesce/coalesce.go
+++ b/aucoalesce/coalesce.go
@@ -41,6 +41,24 @@ type ECSEvent struct {
 	Outcome  string   `json:"outcome,omitempty" yaml:"outcome,omitempty"`
 }
 
+type ECSEntityData struct {
+	Name string `json:"name,omitempty" yaml:"name,omitempty"`
+	ID   string `json:"id,omitempty" yaml:"id,omitempty"`
+}
+
+type ECSEntity struct {
+	ECSEntityData `json:",inline" yaml:",inline"`
+	Effective     ECSEntityData `json:"effective" yaml:"effective"`
+	Target        ECSEntityData `json:"target" yaml:"target"`
+	Changes       ECSEntityData `json:"changes" yaml:"changes"`
+}
+
+type ECSFields struct {
+	Event ECSEvent      `json:"event" yaml:"event"`
+	User  ECSEntity     `json:"user" yaml:"user"`
+	Group ECSEntityData `json:"group" yaml:"group"`
+}
+
 type Event struct {
 	Timestamp time.Time                `json:"@timestamp"       yaml:"timestamp"`
 	Sequence  uint32                   `json:"sequence"         yaml:"sequence"`
@@ -61,9 +79,7 @@ type Event struct {
 	Data  map[string]string   `json:"data,omitempty"  yaml:"data,omitempty"`
 	Paths []map[string]string `json:"paths,omitempty" yaml:"paths,omitempty"`
 
-	ECS struct {
-		Event ECSEvent `json:"event" yaml:"event"`
-	} `json:"ecs" yaml:"ecs"`
+	ECS ECSFields `json:"ecs" yaml:"ecs"`
 
 	Warnings []error `json:"-" yaml:"-"`
 }
@@ -575,6 +591,13 @@ func applyNormalization(event *Event) {
 				norm.SourceIP.Values))
 		}
 	}
+
+	// Populate ECS fields from `mappings` section.
+	for _, mapping := range norm.ECS.Mappings {
+		if mapping.To != nil && mapping.From != nil {
+			mapping.To(event, mapping.From(event))
+		}
+	}
 }
 
 func getValue(key string, event *Event) (string, bool) {
@@ -781,3 +804,34 @@ func setHowDefaults(event *Event) {
 	}
 	event.Summary.How = comm
 }
+
+func (e *ECSEntityData) set(value string) {
+	if value == "" || value == "unset" || value == "4294967295" || value == "-1" {
+		*e = ECSEntityData{ID: "unset"}
+		return
+	}
+	// This could be called using an UID or a name
+	if _, err := strconv.ParseUint(value, 10, 64); err == nil {
+		e.ID = value
+	} else {
+		e.Name = value
+	}
+}
+
+func (e *ECSEntityData) lookup(cache *EntityCache) {
+	if (e.ID == "") == (e.Name == "") {
+		return
+	}
+	if e.ID != "" {
+		e.Name = cache.LookupID(e.ID)
+	} else {
+		e.ID = cache.LookupName(e.Name)
+	}
+}
+
+func (e *ECSEntity) lookup(cache *EntityCache) {
+	e.ECSEntityData.lookup(cache)
+	e.Effective.lookup(cache)
+	e.Target.lookup(cache)
+	e.Changes.lookup(cache)
+}
diff --git a/aucoalesce/id_lookup.go b/aucoalesce/id_lookup.go
index 760e36c..4ef630a 100644
--- a/aucoalesce/id_lookup.go
+++ b/aucoalesce/id_lookup.go
@@ -30,6 +30,13 @@ const cacheTimeout = time.Minute
 var (
 	userLookup  = NewUserCache(cacheTimeout)
 	groupLookup = NewGroupCache(cacheTimeout)
+
+	// noExpiration = time.Unix(math.MaxInt64, 0)
+	// The above breaks time.Before and time.After due to overflows.
+	// See https://stackoverflow.com/questions/25065055/what-is-the-maximum-time-time-in-go
+	//
+	// Safe alternative:
+	noExpiration = time.Unix(0, 0).Add(math.MaxInt64 - 1)
 )
 
 type stringItem struct {
@@ -41,92 +48,89 @@ func (i *stringItem) isExpired() bool {
 	return time.Now().After(i.timeout)
 }
 
-// UserCache is a cache of UID to username.
-type UserCache struct {
-	expiration time.Duration
-	data       map[string]stringItem
-	mutex      sync.Mutex
+// EntityCache is a cache of IDs and usernames.
+type EntityCache struct {
+	byID, byName stringCache
 }
 
-// NewUserCache returns a new UserCache. UserCache is thread-safe.
-func NewUserCache(expiration time.Duration) *UserCache {
-	return &UserCache{
-		expiration: expiration,
-		data: map[string]stringItem{
-			"0": {timeout: time.Unix(math.MaxInt64, 0), value: "root"},
+// NewUserCache returns a new EntityCache to resolve users. EntityCache is thread-safe.
+func NewUserCache(expiration time.Duration) *EntityCache {
+	return &EntityCache{
+		byID: stringCache{
+			expiration: expiration,
+			data: map[string]stringItem{
+				"0": {timeout: noExpiration, value: "root"},
+			},
+			lookupFn: func(s string) string {
+				user, err := user.LookupId(s)
+				if err != nil {
+					return ""
+				}
+				return user.Username
+			},
+		},
+		byName: stringCache{
+			expiration: expiration,
+			data: map[string]stringItem{
+				"root": {timeout: noExpiration, value: "0"},
+			},
+			lookupFn: func(s string) string {
+				user, err := user.Lookup(s)
+				if err != nil {
+					return ""
+				}
+				return user.Uid
+			},
 		},
 	}
 }
 
-// LookupUID looks up a UID and returns the username associated with it. If
-// no username could be found an empty string is returned. The value will be
-// cached for a minute. This requires cgo on Linux.
-func (c *UserCache) LookupUID(uid string) string {
-	if uid == "" || uid == "unset" {
-		return ""
-	}
-
-	c.mutex.Lock()
-	defer c.mutex.Unlock()
-
-	if item, found := c.data[uid]; found && !item.isExpired() {
-		return item.value
-	}
-
-	// Cache the value (even on error).
-	user, err := user.LookupId(uid)
-	if err != nil {
-		c.data[uid] = stringItem{timeout: time.Now().Add(c.expiration), value: ""}
-		return ""
-	}
-
-	c.data[uid] = stringItem{timeout: time.Now().Add(c.expiration), value: user.Username}
-	return user.Username
+// LookupID looks up an UID/GID and returns the user/group name associated with it. If
+// no name could be found an empty string is returned. The value will be
+// cached for a minute.
+func (c *EntityCache) LookupID(uid string) string {
+	return c.byID.lookup(uid)
 }
 
-// GroupCache is a cache of GID to group name.
-type GroupCache struct {
-	expiration time.Duration
-	data       map[string]stringItem
-	mutex      sync.Mutex
+// LookupName looks up an user/group name and returns the ID associated with it. If
+// no ID could be found an empty string is returned. The value will be
+// cached for a minute. This requires cgo on Linux.
+func (c *EntityCache) LookupName(name string) string {
+	return c.byName.lookup(name)
 }
 
-// NewGroupCache returns a new GroupCache. GroupCache is thread-safe.
-func NewGroupCache(expiration time.Duration) *GroupCache {
-	return &GroupCache{
-		expiration: expiration,
-		data: map[string]stringItem{
-			"0": {timeout: time.Unix(math.MaxInt64, 0), value: "root"},
+// NewGroupCache returns a new EntityCache to resolve groups. EntityCache is thread-safe.
+func NewGroupCache(expiration time.Duration) *EntityCache {
+	return &EntityCache{
+		byID: stringCache{
+			expiration: expiration,
+			data: map[string]stringItem{
+				"0": {timeout: noExpiration, value: "root"},
+			},
+			lookupFn: func(s string) string {
+				grp, err := user.LookupGroupId(s)
+				if err != nil {
+					return ""
+				}
+				return grp.Name
+			},
+		},
+		byName: stringCache{
+			expiration: expiration,
+			data: map[string]stringItem{
+				"root": {timeout: noExpiration, value: "0"},
+			},
+			lookupFn: func(s string) string {
+				grp, err := user.LookupGroup(s)
+				if err != nil {
+					return ""
+				}
+				return grp.Gid
+			},
 		},
 	}
 }
 
-// LookupGID looks up a GID and returns the group associated with it. If
-// no group could be found an empty string is returned. The value will be
-// cached for a minute. This requires cgo on Linux.
-func (c *GroupCache) LookupGID(gid string) string {
-	if gid == "" || gid == "unset" {
-		return ""
-	}
-
-	c.mutex.Lock()
-	defer c.mutex.Unlock()
-
-	if item, found := c.data[gid]; found && !item.isExpired() {
-		return item.value
-	}
-
-	// Cache the value (even on error).
-	group, err := user.LookupGroupId(gid)
-	if err != nil {
-		c.data[gid] = stringItem{timeout: time.Now().Add(c.expiration), value: ""}
-		return ""
-	}
-
-	c.data[gid] = stringItem{timeout: time.Now().Add(c.expiration), value: group.Name}
-	return group.Name
-}
-
 // ResolveIDs translates all uid and gid values to their associated names.
 // Prior to Go 1.9 this requires cgo on Linux. UID and GID values are cached
 // for 60 seconds from the time they are read.
@@ -136,12 +140,12 @@ func ResolveIDs(event *Event) {
 
 // ResolveIDsFromCaches translates all uid and gid values to their associated
 // names using the provided caches. Prior to Go 1.9 this requires cgo on Linux.
-func ResolveIDsFromCaches(event *Event, users *UserCache, groups *GroupCache) {
+func ResolveIDsFromCaches(event *Event, users, groups *EntityCache) {
 	// Actor
-	if v := users.LookupUID(event.Summary.Actor.Primary); v != "" {
+	if v := users.LookupID(event.Summary.Actor.Primary); v != "" {
 		event.Summary.Actor.Primary = v
 	}
-	if v := users.LookupUID(event.Summary.Actor.Secondary); v != "" {
+	if v := users.LookupID(event.Summary.Actor.Secondary); v != "" {
 		event.Summary.Actor.Secondary = v
 	}
 
@@ -149,11 +153,11 @@ func ResolveIDsFromCaches(event *Event, users *UserCache, groups *GroupCache) {
 	names := map[string]string{}
 	for key, id := range event.User.IDs {
 		if strings.HasSuffix(key, "uid") {
-			if v := users.LookupUID(id); v != "" {
+			if v := users.LookupID(id); v != "" {
 				names[key] = v
 			}
 		} else if strings.HasSuffix(key, "gid") {
-			if v := groups.LookupGID(id); v != "" {
+			if v := groups.LookupID(id); v != "" {
 				names[key] = v
 			}
 		}
@@ -165,10 +169,64 @@ func ResolveIDsFromCaches(event *Event, users *UserCache, groups *GroupCache) {
 	// File owner/group
 	if event.File != nil {
 		if event.File.UID != "" {
-			event.File.Owner = users.LookupUID(event.File.UID)
+			event.File.Owner = users.LookupID(event.File.UID)
 		}
 		if event.File.GID != "" {
-			event.File.Group = groups.LookupGID(event.File.GID)
+			event.File.Group = groups.LookupID(event.File.GID)
 		}
 	}
+
+	// ECS User and groups
+	event.ECS.User.lookup(users)
+	event.ECS.Group.lookup(groups)
+}
+
+// HardcodeUsers is useful for injecting values for testing.
+func HardcodeUsers(users ...user.User) {
+	for _, usr := range users {
+		userLookup.byID.hardcode(usr.Uid, usr.Username)
+		userLookup.byName.hardcode(usr.Username, usr.Uid)
+	}
+}
+
+// HardcodeGroups is useful for injecting values for testing.
+func HardcodeGroups(groups ...user.Group) {
+	for _, grp := range groups {
+		groupLookup.byID.hardcode(grp.Gid, grp.Name)
+		groupLookup.byName.hardcode(grp.Name, grp.Gid)
+	}
+}
+
+type stringCache struct {
+	mutex      sync.Mutex
+	expiration time.Duration
+	data       map[string]stringItem
+	lookupFn   func(string) string
+}
+
+func (c *stringCache) lookup(key string) string {
+	if key == "" || key == "unset" {
+		return ""
+	}
+
+	c.mutex.Lock()
+	defer c.mutex.Unlock()
+
+	if item, found := c.data[key]; found && !item.isExpired() {
+		return item.value
+	}
+
+	// Cache the result (even on error).
+	resolved := c.lookupFn(key)
+	c.data[key] = stringItem{timeout: time.Now().Add(c.expiration), value: resolved}
+	return resolved
+}
+
+func (c *stringCache) hardcode(key, value string) {
+	c.mutex.Lock()
+	defer c.mutex.Unlock()
+	c.data[key] = stringItem{
+		timeout: noExpiration,
+		value:   value,
+	}
 }
diff --git a/aucoalesce/normalizations.yaml b/aucoalesce/normalizations.yaml
index e7981f8..fcf05d3 100644
--- a/aucoalesce/normalizations.yaml
+++ b/aucoalesce/normalizations.yaml
@@ -40,6 +40,20 @@ macros:
   - &ecs-auth
     category: authentication
     type: info
+    mappings:
+      - from: subject.primary
+        to: user
+      - from: subject.secondary
+        to: user.effective
+
+  - &ecs-session
+    category: session
+    type: info
+    mappings:
+      - from: subject.primary
+        to: user
+      - from: subject.secondary
+        to: user.effective
 
   - &ecs-host
     category: host
@@ -63,6 +77,24 @@ macros:
       - connection
       - info
 
+  - &ecs-user-modification-mappings
+    mappings:
+      - from: subject.primary
+        to: user
+      - from: subject.secondary
+        to: user.effective
+      - from: object.primary
+        to: user.target
+
+  - &ecs-group-modification-mappings
+    mappings:
+      - from: subject.primary
+        to: user
+      - from: subject.secondary
+        to: user.effective
+      - from: object.primary
+        to: group
+
 # Normalizations is a list of declarations specifying how to normalize the data
 # contained in an event. The normalization can be applied based on the syscall
 # name (e.g. connect, open) or based on the record type (e.g. USER_LOGIN).
@@ -847,9 +879,11 @@ normalizations:
       what: account
     ecs:
       <<: *ecs-iam
+      <<: *ecs-group-modification-mappings
       type:
         - group
         - creation
+
   # AUDIT_ADD_USER - User account added
   - record_types: ADD_USER
     action: added-user-account
@@ -858,6 +892,7 @@ normalizations:
       what: account
     ecs:
       <<: *ecs-iam
+      <<: *ecs-user-modification-mappings
       type:
         - user
         - creation
@@ -869,6 +904,7 @@ normalizations:
       what: account
     ecs:
       <<: *ecs-iam
+      <<: *ecs-group-modification-mappings
       type:
         - group
         - deletion
@@ -880,6 +916,7 @@ normalizations:
       what: account
     ecs:
       <<: *ecs-iam
+      <<: *ecs-user-modification-mappings
       type:
         - user
         - deletion
@@ -894,6 +931,13 @@ normalizations:
       type:
         - group
         - change
+      mappings:
+        - from: subject.primary
+          to: user
+        - from: subject.secondary
+          to: group
+        - from: uid.uid
+          to: user.effective
   # AUDIT_ROLE_ASSIGN - Admin assigned user to role
   - record_types: ROLE_ASSIGN
     action: assigned-user-role-to
@@ -932,6 +976,13 @@ normalizations:
       type:
         - user
         - change
+      mappings:
+        - from: subject.primary
+          to: user
+        - from: subject.secondary
+          to: user.target
+        - from: uid.uid
+          to: user.effective
   # AUDIT_USER_CHAUTHTOK - User acct password or pin changed
   - <<: *macro-user-session
     record_types: USER_CHAUTHTOK
@@ -941,6 +992,14 @@ normalizations:
       type:
         - user
         - change
+      mappings:
+        - from: subject.primary
+          to: user
+        - from: uid.uid
+          to: user.effective
+        - from: subject.secondary
+          to: user.target
+
   # AUDIT_GRP_CHAUTHTOK - Group acct password or pin changed
   - <<: *macro-user-session
     record_types: GRP_CHAUTHTOK
@@ -953,6 +1012,13 @@ normalizations:
       type:
         - group
         - change
+      mappings:
+        - from: subject.primary
+          to: user
+        - from: uid.uid
+          to: user.effective
+        - from: subject.secondary
+          to: group
 
   # Authentication related events
 
@@ -982,11 +1048,16 @@ normalizations:
       primary: [old_auid, old-auid]
       secondary: uid
     object:
-      primary: auid
+      primary: [new-auid, new_auid, auid]
       what: user-session
     ecs:
       <<: *ecs-auth
       type: start
+      mappings:
+        - from: subject.primary
+          to: user
+        - from: object.primary
+          to: user.effective
   # AUDIT_USER_ACCT - User system access authorization
   - <<: *macro-user-session
     record_types: USER_ACCT
@@ -1001,7 +1072,9 @@ normalizations:
   - <<: *macro-user-session
     record_types: USER_END
     action: ended-session
-    ecs: *ecs-auth
+    ecs:
+      <<: *ecs-session
+      type: end
   # AUDIT_USER_ERR - User acct state error
   - <<: *macro-user-session
     record_types: USER_ERR
@@ -1035,7 +1108,9 @@ normalizations:
     record_types: USER_START
     action: started-session
     source_ip: [addr]
-    ecs: *ecs-auth
+    ecs:
+      <<: *ecs-session
+      type: start
 
   # Host virtualization events
 
@@ -1588,3 +1663,10 @@ normalizations:
     action: sent-message
     object:
       primary: addr
+
+  # AUDIT_SOFTWARE_UPDATE - Package management
+  - record_types: SOFTWARE_UPDATE
+    action: package-updated
+    ecs:
+      category: package
+      type: info
diff --git a/aucoalesce/normalize.go b/aucoalesce/normalize.go
index c8deb8f..18aac99 100644
--- a/aucoalesce/normalize.go
+++ b/aucoalesce/normalize.go
@@ -19,6 +19,7 @@ package aucoalesce
 
 import (
 	"fmt"
+	"strings"
 
 	"github.com/pkg/errors"
 	"gopkg.in/yaml.v2"
@@ -76,9 +77,15 @@ type Normalization struct {
 	ECS         ECSMapping     `yaml:"ecs"`
 }
 
+type ECSFieldMapping struct {
+	From readReference  `yaml:"from" json:"from"`
+	To   writeReference `yaml:"to" json:"to"`
+}
+
 type ECSMapping struct {
-	Category Strings `yaml:"category"`
-	Type     Strings `yaml:"type"`
+	Category Strings           `yaml:"category"`
+	Type     Strings           `yaml:"type"`
+	Mappings []ECSFieldMapping `yaml:"mappings"`
 }
 
 type SubjectMapping struct {
@@ -93,6 +100,93 @@ type ObjectMapping struct {
 	PathIndex          int     `yaml:"path_index"`
 }
 
+type readReference func(*Event) string
+type writeReference func(*Event, string)
+
+var (
+	fromFieldReferences = map[string]readReference{
+		"subject.primary": func(event *Event) string {
+			return event.Summary.Actor.Primary
+		},
+		"subject.secondary": func(event *Event) string {
+			return event.Summary.Actor.Secondary
+		},
+		"object.primary": func(event *Event) string {
+			return event.Summary.Object.Primary
+		},
+		"object.secondary": func(event *Event) string {
+			return event.Summary.Object.Secondary
+		},
+	}
+
+	fromDictReferences = map[string]func(key string) readReference{
+		"data": func(key string) readReference {
+			return func(event *Event) string {
+				return event.Data[key]
+			}
+		},
+		"uid": func(key string) readReference {
+			return func(event *Event) string {
+				return event.User.IDs[key]
+			}
+		},
+	}
+
+	toFieldReferences = map[string]writeReference{
+		"user": func(event *Event, s string) {
+			event.ECS.User.set(s)
+		},
+		"user.effective": func(event *Event, s string) {
+			event.ECS.User.Effective.set(s)
+		},
+		"user.target": func(event *Event, s string) {
+			event.ECS.User.Target.set(s)
+		},
+		"user.changes": func(event *Event, s string) {
+			event.ECS.User.Changes.set(s)
+		},
+		"group": func(event *Event, s string) {
+			event.ECS.Group.set(s)
+		},
+	}
+)
+
+func resolveFieldReference(fieldRef string) (ref readReference) {
+	if ref = fromFieldReferences[fieldRef]; ref != nil {
+		return
+	}
+	if dot := strings.IndexByte(fieldRef, '.'); dot != -1 {
+		dict := fieldRef[:dot]
+		key := fieldRef[dot+1:]
+		if accessor := fromDictReferences[dict]; accessor != nil {
+			return accessor(key)
+		}
+	}
+	return nil
+}
+
+func (ref *readReference) UnmarshalYAML(unmarshal func(interface{}) error) error {
+	var fieldRef string
+	if err := unmarshal(&fieldRef); err != nil {
+		return err
+	}
+	if *ref = resolveFieldReference(fieldRef); *ref == nil {
+		return fmt.Errorf("field '%s' is not a valid from-reference for ECS mapping", fieldRef)
+	}
+	return nil
+}
+
+func (ref *writeReference) UnmarshalYAML(unmarshal func(interface{}) error) error {
+	var fieldRef string
+	if err := unmarshal(&fieldRef); err != nil {
+		return err
+	}
+	if *ref = toFieldReferences[fieldRef]; *ref == nil {
+		return fmt.Errorf("field '%s' is not a valid to-reference for ECS mapping", fieldRef)
+	}
+	return nil
+}
+
 func LoadNormalizationConfig(b []byte) (syscalls map[string]*Normalization, recordTypes map[string][]*Normalization, err error) {
 	c := &NormalizationConfig{}
 	if err := yaml.Unmarshal(b, c); err != nil {
diff --git a/aucoalesce/znormalize_data.go b/aucoalesce/znormalize_data.go
index 1505132..ca6e59c 100644
--- a/aucoalesce/znormalize_data.go
+++ b/aucoalesce/znormalize_data.go
@@ -31,7 +31,7 @@ func asset(key string) ([]byte, error) {
 		assets = map[string][]byte{}
 
 		var value []byte
-		value, _ = base64.StdEncoding.DecodeString("LS0tCiMgTWFjcm9zIGRlY2xhcmVzIHNvbWUgWUFNTCBhbmNob3JzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZm9yIHNvbWUgY29tbW9uCiMgb2JqZWN0IHR5cGUgbm9ybWFsaXphdGlvbnMgbGlrZSB1c2VyLXNlc3Npb24sIHNvY2tldCwgb3IgcHJvY2Vzcy4KbWFjcm9zOgogIC0gJmRlZmF1bHRzCiAgICBzdWJqZWN0OgogICAgICBwcmltYXJ5OiBhdWlkCiAgICAgIHNlY29uZGFyeTogdWlkCiAgICBob3c6IFtleGUsIGNvbW1dCgogIC0gJm1hY3JvLXVzZXItc2Vzc2lvbgogICAgc3ViamVjdDoKICAgICAgcHJpbWFyeTogYXVpZAogICAgICBzZWNvbmRhcnk6IFthY2N0LCBpZCwgdWlkXQogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiB0ZXJtaW5hbAogICAgICBzZWNvbmRhcnk6IFthZGRyLCBob3N0bmFtZV0KICAgICAgd2hhdDogdXNlci1zZXNzaW9uCiAgICBob3c6IFtleGUsIHRlcm1pbmFsXQoKICAtICZtYWNyby1zb2NrZXQKICAgIDw8OiAqZGVmYXVsdHMKICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogW2FkZHIsIHBhdGhdCiAgICAgIHNlY29uZGFyeTogcG9ydAogICAgICB3aGF0OiBzb2NrZXQKCiAgLSAmbWFjcm8tcHJvY2VzcwogICAgPDw6ICpkZWZhdWx0cwogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiBbY21kLCBleGUsIGNvbW1dCiAgICAgIHNlY29uZGFyeTogcGlkCiAgICAgIHdoYXQ6IHByb2Nlc3MKICAgIGhvdzogdGVybWluYWwKCiAgLSAmZWNzLWlhbQogICAgY2F0ZWdvcnk6IGlhbQogICAgdHlwZTogaW5mbwoKICAtICZlY3MtYXV0aAogICAgY2F0ZWdvcnk6IGF1dGhlbnRpY2F0aW9uCiAgICB0eXBlOiBpbmZvCgogIC0gJmVjcy1ob3N0CiAgICBjYXRlZ29yeTogaG9zdAogICAgdHlwZTogaW5mbwoKICAtICZlY3MtcHJvY2VzcwogICAgY2F0ZWdvcnk6IHByb2Nlc3MKICAgIHR5cGU6IGluZm8KCiAgLSAmZWNzLWZpbGUKICAgIGNhdGVnb3J5OiBmaWxlCiAgICB0eXBlOiBpbmZvCgogIC0gJmVjcy1kcml2ZXIKICAgIGNhdGVnb3J5OiBkcml2ZXIKICAgIHR5cGU6IGluZm8KCiAgLSAmZWNzLW5ldHdvcmsKICAgIGNhdGVnb3J5OiBuZXR3b3JrCiAgICB0eXBlOgogICAgICAtIGNvbm5lY3Rpb24KICAgICAgLSBpbmZvCgojIE5vcm1hbGl6YXRpb25zIGlzIGEgbGlzdCBvZiBkZWNsYXJhdGlvbnMgc3BlY2lmeWluZyBob3cgdG8gbm9ybWFsaXplIHRoZSBkYXRhCiMgY29udGFpbmVkIGluIGFuIGV2ZW50LiBUaGUgbm9ybWFsaXphdGlvbiBjYW4gYmUgYXBwbGllZCBiYXNlZCBvbiB0aGUgc3lzY2FsbAojIG5hbWUgKGUuZy4gY29ubmVjdCwgb3Blbikgb3IgYmFzZWQgb24gdGhlIHJlY29yZCB0eXBlIChlLmcuIFVTRVJfTE9HSU4pLgojIE5vIHR3byBub3JtYWxpemF0aW9ucyBjYW4gYXBwbHkgdG8gdGhlIHNhbWUgc3lzY2FsbCBvciByZWNvcmQgdHlwZS4gVGhpcwojIHdpbGwgcmVzdWx0IGluIGEgZmFpbHVyZSBhdCBsb2FkIHRpbWUuCiMKIyBFYWNoIG5vcm1hbGl6YXRpb24gc2hvdWxkIHNwZWNpZnk6CiMgICBhY3Rpb24gLSB3aGF0IGhhcHBlbmVkCiMgICBhY3RvciAgLSB3aG8gZGlkIHRoaXMgb3Igd2hvIHRyaWdnZXJlZCB0aGUgZXZlbnQKIyAgIG9iamVjdCAtIHdoYXQgd2FzIHRoZSAidGhpbmciIGludm9sdmVkIGluIHRoZSBhY3Rpb24gKGUuZy4gcHJvY2Vzcywgc29ja2V0KQojICAgaG93ICAgIC0gaG93IHdhcyB0aGUgYWN0aW9uIHBlcmZvcm1lZCAoZS5nLiBleGUgb3IgdGVybWluYWwpCm5vcm1hbGl6YXRpb25zOgogIC0gZWNzOiAqZWNzLXByb2Nlc3MKICAgIHN5c2NhbGxzOgogICAgICAtICcqJyAjIHRoaXMgaXMgYSBjYXRjaCBhbGwKICAtIGFjdGlvbjogb3BlbmVkLWZpbGUKICAgIG9iamVjdDoKICAgICAgd2hhdDogZmlsZQogICAgc3lzY2FsbHM6CiAgICAgICMgY3JlYXQgLSBvcGVuIGFuZCBwb3NzaWJseSBjcmVhdGUgYSBmaWxlCiAgICAgIC0gY3JlYXQKICAgIGVjczoKICAgICAgPDw6ICplY3MtZmlsZQogICAgICB0eXBlOiBjcmVhdGlvbgogIC0gYWN0aW9uOiBvcGVuZWQtZmlsZQogICAgb2JqZWN0OgogICAgICB3aGF0OiBmaWxlCiAgICBzeXNjYWxsczoKICAgICAgIyBmYWxsb2NhdGUgLSBtYW5pcHVsYXRlIGZpbGUgc3BhY2UKICAgICAgLSBmYWxsb2NhdGUKICAgICAgIyB0cnVuY2F0ZSAtIHRydW5jYXRlIGEgZmlsZSB0byBhIHNwZWNpZmllZCBsZW5ndGgKICAgICAgLSB0cnVuY2F0ZQogICAgICAjIGZ0cnVuY2F0ZSAtIHRydW5jYXRlIGEgZmlsZSB0byBhIHNwZWNpZmllZCBsZW5ndGgKICAgICAgLSBmdHJ1bmNhdGUKICAgIGVjczoKICAgICAgPDw6ICplY3MtZmlsZQogICAgICAjIHRlY2huaWNhbGx5IHlvdSBjYW4gdHJ1bmNhdGUgYSBmaWxlIHRvIHRoZSBzYW1lIGxlbmd0aAogICAgICAjIGJ1dCByZWdhcmRsZXNzLCB3ZSBjb25zaWRlciB0aGlzIGEgY2hhbmdlCiAgICAgIHR5cGU6IGNoYW5nZQogIC0gYWN0aW9uOiBvcGVuZWQtZmlsZQogICAgb2JqZWN0OgogICAgICB3aGF0OiBmaWxlCiAgICBzeXNjYWxsczoKICAgICAgIyBvcGVuIC0gb3BlbiBhbmQgcG9zc2libHkgY3JlYXRlIGEgZmlsZQogICAgICAtIG9wZW4KICAgICAgIyBvcGVuYXQgLSBvcGVuIGFuZCBwb3NzaWJseSBjcmVhdGUgYSBmaWxlCiAgICAgIC0gb3BlbmF0CiAgICAgICMgcmVhZGxpbmsgLSByZWFkIHZhbHVlIG9mIGEgc3ltYm9saWMgbGluawogICAgICAtIHJlYWRsaW5rCiAgICAgICMgcmVhZGxpbmthdCAtIHJlYWQgdmFsdWUgb2YgYSBzeW1ib2xpYyBsaW5rCiAgICAgIC0gcmVhZGxpbmthdAogICAgZWNzOiAqZWNzLWZpbGUKICAtIGFjdGlvbjogcmVhZC1maWxlCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IGZpbGUKICAgIHN5c2NhbGxzOgogICAgICAjIHJlYWQgLSByZWFkIGZyb20gYSBmaWxlIGRlc2NyaXB0b3IKICAgICAgLSByZWFkCiAgICBlY3M6ICplY3MtZmlsZQogIC0gYWN0aW9uOiB3cm90ZS10by1maWxlCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IGZpbGUKICAgIHN5c2NhbGxzOgogICAgICAjIHdyaXRlIC0gd3JpdGUgdG8gYSBmaWxlIGRlc2NyaXB0b3IKICAgICAgLSB3cml0ZQogICAgZWNzOgogICAgICA8PDogKmVjcy1maWxlCiAgICAgIHR5cGU6IGNoYW5nZQogIC0gYWN0aW9uOiBjaGFuZ2VkLWZpbGUtYXR0cmlidXRlcy1vZgogICAgb2JqZWN0OgogICAgICB3aGF0OiBmaWxlCiAgICBzeXNjYWxsczoKICAgICAgIyBzZXR4YXR0ciAtIHNldCBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgdmFsdWUKICAgICAgLSBzZXR4YXR0cgogICAgICAjIGZzZXR4YXR0ciAtIHNldCBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgdmFsdWUKICAgICAgLSBmc2V0eGF0dHIKICAgICAgIyBsc2V0eGF0dHIgLSBzZXQgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIHZhbHVlCiAgICAgIC0gbHNldHhhdHRyCiAgICAgICMgcmVtb3ZleGF0dHIgLSByZW1vdmUgYW4gZXh0ZW5kZWQgYXR0cmlidXRlCiAgICAgIC0gcmVtb3ZleGF0dHIKICAgICAgIyBmcmVtb3ZleGF0dHIgLSByZW1vdmUgYW4gZXh0ZW5kZWQgYXR0cmlidXRlCiAgICAgIC0gZnJlbW92ZXhhdHRyCiAgICAgICMgbHJlbW92ZXhhdHRyIC0gcmVtb3ZlIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZQogICAgICAtIGxyZW1vdmV4YXR0cgogICAgZWNzOgogICAgICA8PDogKmVjcy1maWxlCiAgICAgIHR5cGU6IGNoYW5nZQogIC0gYWN0aW9uOiBjaGFuZ2VkLWZpbGUtcGVybWlzc2lvbnMtb2YKICAgIG9iamVjdDoKICAgICAgd2hhdDogZmlsZQogICAgc3lzY2FsbHM6CiAgICAgICMgY2htb2QgLSBjaGFuZ2UgcGVybWlzc2lvbnMgb2YgYSBmaWxlCiAgICAgIC0gY2htb2QKICAgICAgIyBmY2htb2QgLSBjaGFuZ2UgcGVybWlzc2lvbnMgb2YgYSBmaWxlCiAgICAgIC0gZmNobW9kCiAgICAgICMgZmNobW9kYXQgLSBjaGFuZ2UgcGVybWlzc2lvbnMgb2YgYSBmaWxlCiAgICAgIC0gZmNobW9kYXQKICAgIGVjczoKICAgICAgPDw6ICplY3MtZmlsZQogICAgICB0eXBlOiBjaGFuZ2UKICAtIGFjdGlvbjogY2hhbmdlZC1maWxlLW93bmVyc2hpcC1vZgogICAgb2JqZWN0OgogICAgICB3aGF0OiBmaWxlCiAgICBzeXNjYWxsczoKICAgICAgIyBjaG93biAtIGNoYW5nZSBvd25lcnNoaXAgb2YgYSBmaWxlCiAgICAgIC0gY2hvd24KICAgICAgIyBmY2hvd24gLSBjaGFuZ2Ugb3duZXJzaGlwIG9mIGEgZmlsZQogICAgICAtIGZjaG93bgogICAgICAjIGZjaG93bmF0IC0gY2hhbmdlIG93bmVyc2hpcCBvZiBhIGZpbGUKICAgICAgLSBmY2hvd25hdAogICAgICAjIGxjaG93biAtIGNoYW5nZSBvd25lcnNoaXAgb2YgYSBmaWxlCiAgICAgIC0gbGNob3duCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWZpbGUKICAgICAgdHlwZTogY2hhbmdlCiAgLSBhY3Rpb246IGxvYWRlZC1rZXJuZWwtbW9kdWxlCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IGZpbGUKICAgICAgcHJpbWFyeTogbmFtZQogICAgcmVjb3JkX3R5cGVzOgogICAgICAtIEtFUk5fTU9EVUxFCiAgICBzeXNjYWxsczoKICAgICAgIyBmaW5pdF9tb2R1bGUgLSBsb2FkIGEga2VybmVsIG1vZHVsZQogICAgICAtIGZpbml0X21vZHVsZQogICAgICAjIGluaXRfbW9kdWxlIC0gbG9hZCBhIGtlcm5lbCBtb2R1bGUKICAgICAgLSBpbml0X21vZHVsZQogICAgZWNzOgogICAgICA8PDogKmVjcy1kcml2ZXIKICAgICAgdHlwZTogc3RhcnQKICAtIGFjdGlvbjogdW5sb2FkZWQta2VybmVsLW1vZHVsZQogICAgb2JqZWN0OgogICAgICB3aGF0OiBmaWxlCiAgICBzeXNjYWxsczoKICAgICAgIyBkZWxldGVfbW9kdWxlIC0gdW5sb2FkIGEga2VybmVsIG1vZHVsZQogICAgICAtIGRlbGV0ZV9tb2R1bGUKICAgIGVjczoKICAgICAgPDw6ICplY3MtZHJpdmVyCiAgICAgIHR5cGU6IGVuZAogIC0gYWN0aW9uOiBjcmVhdGVkLWRpcmVjdG9yeQogICAgb2JqZWN0OgogICAgICB3aGF0OiBmaWxlCiAgICAgIHBhdGhfaW5kZXg6IDEKICAgIHN5c2NhbGxzOgogICAgICAjIG1rZGlyIC0gY3JlYXRlIGEgZGlyZWN0b3J5CiAgICAgIC0gbWtkaXIKICAgICAgIyBta2RpcmF0IC0gY3JlYXRlIGEgZGlyZWN0b3J5CiAgICAgIC0gbWtkaXJhdAogICAgZWNzOgogICAgICA8PDogKmVjcy1maWxlCiAgICAgIHR5cGU6IGNyZWF0aW9uCiAgLSBhY3Rpb246IG1vdW50ZWQKICAgIG9iamVjdDoKICAgICAgd2hhdDogZmlsZXN5c3RlbQogICAgICBwYXRoX2luZGV4OiAxCiAgICBzeXNjYWxsczoKICAgICAgIyBtb3VudCAtIG1vdW50IGZpbGVzeXN0ZW0KICAgICAgLSBtb3VudAogICAgZWNzOgogICAgICA8PDogKmVjcy1maWxlCiAgICAgICMgc2luY2UgYSBuZXcgbW91bnQgYXBwZWFycyBvbiB0aGUgc3lzdGVtCiAgICAgICMgd2UgY29uc2lkZXIgdGhpcyBhIGhpZ2gtbGV2ZWwgImNyZWF0aW9uIiBldmVudAogICAgICB0eXBlOiBjcmVhdGlvbgogIC0gYWN0aW9uOiByZW5hbWVkCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IGZpbGUKICAgICAgcGF0aF9pbmRleDogMgogICAgc3lzY2FsbHM6CiAgICAgICMgcmVuYW1lIC0gY2hhbmdlIHRoZSBuYW1lIG9yIGxvY2F0aW9uIG9mIGEgZmlsZQogICAgICAtIHJlbmFtZQogICAgICAjIHJlbmFtZWF0IC0gY2hhbmdlIHRoZSBuYW1lIG9yIGxvY2F0aW9uIG9mIGEgZmlsZQogICAgICAtIHJlbmFtZWF0CiAgICAgICMgcmVuYW1lYXQyIC0gY2hhbmdlIHRoZSBuYW1lIG9yIGxvY2F0aW9uIG9mIGEgZmlsZQogICAgICAtIHJlbmFtZWF0MgogICAgZWNzOgogICAgICA8PDogKmVjcy1maWxlCiAgICAgIHR5cGU6IGNoYW5nZQogIC0gYWN0aW9uOiBjaGVja2VkLW1ldGFkYXRhLW9mCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IGZpbGUKICAgIHN5c2NhbGxzOgogICAgICAjIGFjY2VzcyAtIGNoZWNrIHVzZXIncyBwZXJtaXNzaW9ucyBmb3IgYSBmaWxlCiAgICAgIC0gYWNjZXNzCiAgICAgICMgZmFjY2Vzc2F0IC0gY2hlY2sgdXNlcidzIHBlcm1pc3Npb25zIGZvciBhIGZpbGUKICAgICAgLSBmYWNjZXNzYXQKICAgICAgIyBmc3RhdGF0IC0gZ2V0IGZpbGUgc3RhdHVzCiAgICAgIC0gZnN0YXRhdAogICAgICAjIG5ld2ZzdGF0YXQgLSBnZXQgZmlsZSBzdGF0dXMKICAgICAgLSBuZXdmc3RhdGF0CiAgICAgICMgc3RhdCAtIGdldCBmaWxlIHN0YXR1cwogICAgICAtIHN0YXQKICAgICAgIyBzdGF0NjQgLSBnZXQgZmlsZSBzdGF0dXMKICAgICAgLSBzdGF0NjQKICAgICAgIyBmc3RhdCAtIGdldCBmaWxlIHN0YXR1cwogICAgICAtIGZzdGF0CiAgICAgICMgbHN0YXQgLSBnZXQgZmlsZSBzdGF0dXMKICAgICAgLSBsc3RhdAogICAgICAjIGdldHhhdHRyIC0gcmV0cmlldmUgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIHZhbHVlCiAgICAgIC0gZ2V0eGF0dHIKICAgICAgIyBsZ2V0eGF0dHIgLSByZXRyaWV2ZSBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgdmFsdWUKICAgICAgLSBsZ2V0eGF0dHIKICAgICAgIyBmZ2V0eGF0dHIgLSByZXRyaWV2ZSBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgdmFsdWUKICAgICAgLSBmZ2V0eGF0dHIKICAgIGVjczogKmVjcy1maWxlCiAgLSBhY3Rpb246IGNoZWNrZWQtZmlsZXN5c3RlbS1tZXRhZGF0YS1vZgogICAgb2JqZWN0OgogICAgICB3aGF0OiBmaWxlc3lzdGVtCiAgICBzeXNjYWxsczoKICAgICAgIyBzdGF0ZnMgLSBnZXQgZmlsZXN5c3RlbSBzdGF0aXN0aWNzCiAgICAgIC0gc3RhdGZzCiAgICAgICMgZnN0YXRmcyAtIGdldCBmaWxlc3lzdGVtIHN0YXRpc3RpY3MKICAgICAgLSBmc3RhdGZzCiAgICBlY3M6ICplY3MtZmlsZQogIC0gYWN0aW9uOiBzeW1saW5rZWQKICAgIG9iamVjdDoKICAgICAgd2hhdDogZmlsZQogICAgc3lzY2FsbHM6CiAgICAgICMgc3ltbGluayAtIG1ha2UgYSBuZXcgbmFtZSBmb3IgYSBmaWxlCiAgICAgIC0gc3ltbGluawogICAgICAjIHN5bWxpbmthdCAtIG1ha2UgYSBuZXcgbmFtZSBmb3IgYSBmaWxlCiAgICAgIC0gc3ltbGlua2F0CiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWZpbGUKICAgICAgIyAiY3JlYXRpb24iIHNpbmNlIHdlJ3JlIGNyZWF0aW5nIGEgbmV3IGZpbGUgc3lzdGVtCiAgICAgICMgZW50cnkgZm9yIHRoZSBzeW1saW5rCiAgICAgIHR5cGU6IGNyZWF0aW9uCiAgLSBhY3Rpb246IHVubW91bnRlZAogICAgb2JqZWN0OgogICAgICB3aGF0OiBmaWxlc3lzdGVtCiAgICBzeXNjYWxsczoKICAgICAgIyB1bW91bnQgLSB1bm1vdW50IGZpbGVzeXN0ZW0KICAgICAgLSB1bW91bnQKICAgICAgIyB1bW91bnQyIC0gdW5tb3VudCBmaWxlc3lzdGVtCiAgICAgIC0gdW1vdW50MgogICAgZWNzOgogICAgICA8PDogKmVjcy1maWxlCiAgICAgICMgImRlbGV0aW9uIiB0byBtaXJyb3IgdGhlICJjcmVhdGlvbiIgb2YgdGhlIG1vdW50CiAgICAgIHR5cGU6IGRlbGV0aW9uCiAgLSBhY3Rpb246IGRlbGV0ZWQKICAgIG9iamVjdDoKICAgICAgd2hhdDogZmlsZQogICAgc3lzY2FsbHM6CiAgICAgICMgcm1kaXIgLSBkZWxldGUgYSBkaXJlY3RvcnkKICAgICAgLSBybWRpcgogICAgICAjIHVubGluayAtIGRlbGV0ZSBhIG5hbWUgYW5kIHBvc3NpYmx5IHRoZSBmaWxlIGl0IHJlZmVycyB0bwogICAgICAtIHVubGluawogICAgICAjIHVubGlua2F0IC0gZGVsZXRlIGEgbmFtZSBhbmQgcG9zc2libHkgdGhlIGZpbGUgaXQgcmVmZXJzIHRvCiAgICAgIC0gdW5saW5rYXQKICAgIGVjczoKICAgICAgPDw6ICplY3MtZmlsZQogICAgICB0eXBlOiBkZWxldGlvbgogIC0gYWN0aW9uOiBjaGFuZ2VkLXRpbWVzdGFtcC1vZgogICAgb2JqZWN0OgogICAgICB3aGF0OiBmaWxlCiAgICBzeXNjYWxsczoKICAgICAgIyB1dGltZSAtIGNoYW5nZSBmaWxlIGxhc3QgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gdGltZXMKICAgICAgLSB1dGltZQogICAgICAjIHV0aW1lcyAtIGNoYW5nZSBmaWxlIGxhc3QgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gdGltZXMKICAgICAgLSB1dGltZXMKICAgICAgIyBmdXRpbWVzYXQgLSBjaGFuZ2UgdGltZXN0YW1wcyBvZiBhIGZpbGUgcmVsYXRpdmUgdG8gYSBcIGRpcmVjdG9yeSBmaWxlIGRlc2NyaXB0b3IKICAgICAgLSBmdXRpbWVzYXQKICAgICAgIyBmdXRpbWVucyAtIGNoYW5nZSBmaWxlIHRpbWVzdGFtcHMgd2l0aCBuYW5vc2Vjb25kIHByZWNpc2lvbgogICAgICAtIGZ1dGltZW5zCiAgICAgICMgdXRpbWVuc2F0IC0gY2hhbmdlIGZpbGUgdGltZXN0YW1wcyB3aXRoIG5hbm9zZWNvbmQgcHJlY2lzaW9uCiAgICAgIC0gdXRpbWVuc2F0CiAgICBlY3M6ICplY3MtZmlsZQogIC0gYWN0aW9uOiBleGVjdXRlZAogICAgb2JqZWN0OgogICAgICB3aGF0OiBmaWxlCiAgICBzeXNjYWxsczoKICAgICAgIyBleGVjdmUgLSBleGVjdXRlIHByb2dyYW0KICAgICAgLSBleGVjdmUKICAgICAgIyBleGVjdmVhdCAtIGV4ZWN1dGUgcHJvZ3JhbSByZWxhdGl2ZSB0byBhIGRpcmVjdG9yeSBmaWxlIGRlc2NyaXB0b3IKICAgICAgLSBleGVjdmVhdAogICAgZWNzOgogICAgICA8PDogKmVjcy1wcm9jZXNzCiAgICAgIHR5cGU6IHN0YXJ0CiAgLSBhY3Rpb246IGxpc3Rlbi1mb3ItY29ubmVjdGlvbnMKICAgIG9iamVjdDoKICAgICAgd2hhdDogc29ja2V0CiAgICBzeXNjYWxsczoKICAgICAgIyBsaXN0ZW4tIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMgb24gYSBzb2NrZXQKICAgICAgLSBsaXN0ZW4KICAgIGVjczoKICAgICAgPDw6ICplY3MtbmV0d29yawogICAgICB0eXBlOiBzdGFydAogIC0gYWN0aW9uOiBhY2NlcHRlZC1jb25uZWN0aW9uLWZyb20KICAgIG9iamVjdDoKICAgICAgd2hhdDogc29ja2V0CiAgICBzeXNjYWxsczoKICAgICAgIyBhY2NlcHQgLSBhY2NlcHQgYSBjb25uZWN0aW9uIG9uIGEgc29ja2V0CiAgICAgIC0gYWNjZXB0CiAgICAgICMgYWNjZXB0NCAtIGFjY2VwdCBhIGNvbm5lY3Rpb24gb24gYSBzb2NrZXQKICAgICAgLSBhY2NlcHQ0CiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLW5ldHdvcmsKICAgICAgdHlwZToKICAgICAgICAtIGNvbm5lY3Rpb24KICAgICAgICAtIHN0YXJ0CiAgLSBhY3Rpb246IGJvdW5kLXNvY2tldAogICAgb2JqZWN0OgogICAgICB3aGF0OiBzb2NrZXQKICAgIHN5c2NhbGxzOgogICAgICAjIGJpbmQgLWJpbmQgYSBuYW1lIHRvIGEgc29ja2V0CiAgICAgIC0gYmluZAogICAgZWNzOgogICAgICA8PDogKmVjcy1uZXR3b3JrCiAgICAgIHR5cGU6IHN0YXJ0CiAgLSBhY3Rpb246IGNvbm5lY3RlZC10bwogICAgb2JqZWN0OgogICAgICB3aGF0OiBzb2NrZXQKICAgIHN5c2NhbGxzOgogICAgICAtIGNvbm5lY3QKICAgIGVjczoKICAgICAgPDw6ICplY3MtbmV0d29yawogICAgICB0eXBlOgogICAgICAgIC0gY29ubmVjdGlvbgogICAgICAgIC0gc3RhcnQKICAtIGFjdGlvbjogcmVjZWl2ZWQtZnJvbQogICAgb2JqZWN0OgogICAgICB3aGF0OiBzb2NrZXQKICAgIHN5c2NhbGxzOgogICAgICAjIHJlY3YgLSByZWNlaXZlIGEgbWVzc2FnZSBmcm9tIGEgc29ja2V0CiAgICAgIC0gcmVjdgogICAgICAjIHJlY3Zmcm9tIC0gcmVjZWl2ZSBhIG1lc3NhZ2UgZnJvbSBhIHNvY2tldAogICAgICAtIHJlY3Zmcm9tCiAgICAgICMgcmVjdm1zZyAtIHJlY2VpdmUgYSBtZXNzYWdlIGZyb20gYSBzb2NrZXQKICAgICAgLSByZWN2bXNnCiAgICAgICMgcmVjdm1tc2cgLSByZWNlaXZlIG11bHRpcGxlIG1lc3NhZ2VzIG9uIGEgc29ja2V0CiAgICAgIC0gcmVjdm1tc2cKICAgIGVjczoKICAgICAgPDw6ICplY3MtbmV0d29yawogIC0gYWN0aW9uOiBzZW50LXRvCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHNvY2tldAogICAgc3lzY2FsbHM6CiAgICAgICMgc2VuZCAtIHNlbmQgYSBtZXNzYWdlIG9uIGEgc29ja2V0CiAgICAgIC0gc2VuZAogICAgICAjIHNlbmR0byAtIHNlbmQgYSBtZXNzYWdlIG9uIGEgc29ja2V0CiAgICAgIC0gc2VuZHRvCiAgICAgICMgc2VuZG1zZyAtIHNlbmQgYSBtZXNzYWdlIG9uIGEgc29ja2V0CiAgICAgIC0gc2VuZG1zZwogICAgICAjIHNlbmRtbXNnIC0gc2VuZCBtdWx0aXBsZSBtZXNzYWdlcyBvbiBhIHNvY2tldAogICAgICAtIHNlbmRtbXNnCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLW5ldHdvcmsKICAtIGFjdGlvbjoga2lsbGVkLXBpZAogICAgb2JqZWN0OgogICAgICB3aGF0OiBwcm9jZXNzCiAgICBzeXNjYWxsczoKICAgICAgIyBraWxsIC0gc2VuZCBzaWduYWwgdG8gYSBwcm9jZXNzCiAgICAgIC0ga2lsbAogICAgICAjIHRraWxsIC0gc2VuZCBhIHNpZ25hbCB0byBhIHRocmVhZAogICAgICAtIHRraWxsCiAgICAgICMgdGdraWxsIC0gc2VuZCBhIHNpZ25hbCB0byBhIHRocmVhZAogICAgICAtIHRna2lsbAogICAgZWNzOgogICAgICA8PDogKmVjcy1wcm9jZXNzCiAgICAgIHR5cGU6IGVuZAogIC0gYWN0aW9uOiBjaGFuZ2VkLWlkZW50aXR5LW9mCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHByb2Nlc3MKICAgIGhvdzogc3lzY2FsbAogICAgc3lzY2FsbHM6CiAgICAgICMgc2V0dWlkIC0gc2V0IHVzZXIgaWRlbnRpdHkKICAgICAgLSBzZXR1aWQKICAgICAgIyBzZXRldWlkIC0gc2V0IGVmZmVjdGl2ZSB1c2VyIG9yIGdyb3VwIElECiAgICAgIC0gc2V0ZXVpZAogICAgICAjIHNldGZzdWlkIC0gc2V0IHVzZXIgaWRlbnRpdHkgdXNlZCBmb3IgZmlsZXN5c3RlbSBjaGVja3MKICAgICAgLSBzZXRmc3VpZAogICAgICAjIHNldHJldWlkIC0gc2V0IHJlYWwgYW5kL29yIGVmZmVjdGl2ZSB1c2VyIG9yIGdyb3VwIElECiAgICAgIC0gc2V0cmV1aWQKICAgICAgIyBzZXRnaWQgLSBzZXQgZ3JvdXAgaWRlbnRpdHkKICAgICAgLSBzZXRnaWQKICAgICAgIyBzZXRlZ2lkIC0gc2V0IGVmZmVjdGl2ZSB1c2VyIG9yIGdyb3VwIElECiAgICAgIC0gc2V0ZWdpZAogICAgICAjIHNldGZzZ2lkIC0gc2V0IGdyb3VwIGlkZW50aXR5IHVzZWQgZm9yIGZpbGVzeXN0ZW0gY2hlY2tzCiAgICAgIC0gc2V0ZnNnaWQKICAgICAgIyBzZXRyZWdpZCAtIHNldCByZWFsIGFuZC9vciBlZmZlY3RpdmUgdXNlciBvciBncm91cCBJRAogICAgICAtIHNldHJlZ2lkCiAgICAgICMgc2V0cmVzdWlkIC0gc2V0IHJlYWwsIGVmZmVjdGl2ZSBhbmQgc2F2ZWQgdXNlciBvciBncm91cCBJRAogICAgICAtIHNldHJlc3VpZAogICAgICAjIHNldHJlc2dpZCAtIHNldCByZWFsLCBlZmZlY3RpdmUgYW5kIHNhdmVkIHVzZXIgb3IgZ3JvdXAgSUQKICAgICAgLSBzZXRyZXNnaWQKICAgIGVjczoKICAgICAgPDw6ICplY3MtcHJvY2VzcwogICAgICB0eXBlOiBjaGFuZ2UKICAtIGFjdGlvbjogY2hhbmdlZC1zeXN0ZW0tdGltZQogICAgb2JqZWN0OgogICAgICB3aGF0OiBzeXN0ZW0KICAgIHN5c2NhbGxzOgogICAgICAjIHNldHRpbWVvZmRheSAtIGdldCAvIHNldCB0aW1lCiAgICAgIC0gc2V0dGltZW9mZGF5CiAgICAgICMgY2xvY2tfc2V0dGltZSAtIGNsb2NrIGFuZCB0aW1lIGZ1bmN0aW9ucwogICAgICAtIGNsb2NrX3NldHRpbWUKICAgICAgIyBzdGltZSAtIHNldCB0aW1lCiAgICAgIC0gc3RpbWUKICAgICAgIyBhZGp0aW1leCAtIHR1bmUga2VybmVsIGNsb2NrCiAgICAgIC0gYWRqdGltZXgKICAgIGVjczoKICAgICAgPDw6ICplY3MtaG9zdAogICAgICB0eXBlOiBjaGFuZ2UKICAtIGFjdGlvbjogbWFrZS1kZXZpY2UKICAgIG9iamVjdDoKICAgICAgd2hhdDogZmlsZQogICAgc3lzY2FsbHM6CiAgICAgICMgbWtub2QgLSBjcmVhdGUgYSBzcGVjaWFsIG9yIG9yZGluYXJ5IGZpbGUKICAgICAgLSBta25vZAogICAgICAjIG1rbm9kYXQgLSBjcmVhdGUgYSBzcGVjaWFsIG9yIG9yZGluYXJ5IGZpbGUKICAgICAgLSBta25vZGF0CiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWZpbGUKICAgICAgdHlwZTogY3JlYXRpb24KICAtIGFjdGlvbjogY2hhbmdlZC1zeXN0ZW0tbmFtZQogICAgb2JqZWN0OgogICAgICB3aGF0OiBzeXN0ZW0KICAgIHN5c2NhbGxzOgogICAgICAjIHNldGhvc3RuYW1lIC0gZ2V0L3NldCBob3N0bmFtZQogICAgICAtIHNldGhvc3RuYW1lCiAgICAgICMgc2V0ZG9tYWlubmFtZSAtIGdldC9zZXQgTklTIGRvbWFpbiBuYW1lCiAgICAgIC0gc2V0ZG9tYWlubmFtZQogICAgZWNzOgogICAgICA8PDogKmVjcy1ob3N0CiAgICAgIHR5cGU6IGNoYW5nZQogIC0gYWN0aW9uOiBhbGxvY2F0ZWQtbWVtb3J5CiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IG1lbW9yeQogICAgc3lzY2FsbHM6CiAgICAgICMgbW1hcCAtIG1hcCBvciB1bm1hcCBmaWxlcyBvciBkZXZpY2VzIGludG8gbWVtb3J5CiAgICAgIC0gbW1hcAogICAgICAjIG1tYXAyIC0gbWFwIGZpbGVzIG9yIGRldmljZXMgaW50byBtZW1vcnkKICAgICAgLSBtbWFwMgogICAgICAjIGJyayAtIGNoYW5nZSBkYXRhIHNlZ21lbnQgc2l6ZQogICAgICAtIGJyawogICAgZWNzOiAqZWNzLXByb2Nlc3MKICAtIGFjdGlvbjogYWRqdXN0ZWQtc2NoZWR1bGluZy1wb2xpY3ktb2YKICAgIG9iamVjdDoKICAgICAgd2hhdDogcHJvY2VzcwogICAgaG93OiBzeXNjYWxsCiAgICBzeXNjYWxsczoKICAgICAgIyBzY2hlZF9zZXRwYXJhbSAtIHNldCBhbmQgZ2V0IHNjaGVkdWxpbmcgcGFyYW1ldGVycwogICAgICAtIHNjaGVkX3NldHBhcmFtCiAgICAgICMgc2NoZWRfc2V0c2NoZWR1bGVyIC0gc2V0IGFuZCBnZXQgc2NoZWR1bGluZyBwb2xpY3kvcGFyYW1ldGVycwogICAgICAtIHNjaGVkX3NldHNjaGVkdWxlcgogICAgICAjIHNjaGVkX3NldGF0dHIgLSBzZXQgYW5kIGdldCBzY2hlZHVsaW5nIHBvbGljeSBhbmQgYXR0cmlidXRlcwogICAgICAtIHNjaGVkX3NldGF0dHIKICAgIGVjczoKICAgICAgPDw6ICplY3MtcHJvY2VzcwogICAgICB0eXBlOiBjaGFuZ2UKCiAgIyBDdXJyZW50bHkgdW5oYW5kbGVkCiAgIyB0aGlzIGxpc3QgY29tZXMgZnJvbSBwYXJzaW5nIGxpbnV4IG1hbiBwYWdlcyBhdCBodHRwczovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vZG9jcy9tYW4tcGFnZXMvbWFuLXBhZ2VzLmdpdAoKICAjIHNpZ2FjdGlvbiAtIGV4YW1pbmUgYW5kIGNoYW5nZSBhIHNpZ25hbCBhY3Rpb24KICAjIHJ0X3NpZ2FjdGlvbiAtIGV4YW1pbmUgYW5kIGNoYW5nZSBhIHNpZ25hbCBhY3Rpb24KICAjIHByZWFkIC0gcmVhZCBmcm9tIG9yIHdyaXRlIHRvIGEgZmlsZSBkZXNjcmlwdG9yIGF0IGEgZ2l2ZW4gb2Zmc2V0CiAgIyBwd3JpdGUgLSByZWFkIGZyb20gb3Igd3JpdGUgdG8gYSBmaWxlIGRlc2NyaXB0b3IgYXQgYSBnaXZlbiBvZmZzZXQKICAjIHMzOTBfZ3VhcmRlZF9zdG9yYWdlIC0gb3BlcmF0aW9ucyB3aXRoIHovQXJjaGl0ZWN0dXJlIGd1YXJkZWQgc3RvcmFnZSBmYWNpbGl0eQogICMgc2NoZWRfZ2V0YXR0ciAtIHNldCBhbmQgZ2V0IHNjaGVkdWxpbmcgcG9saWN5IGFuZCBhdHRyaWJ1dGVzCiAgIyBnZXRydXNhZ2UgLSBnZXQgcmVzb3VyY2UgdXNhZ2UKICAjIGZsb2NrIC0gYXBwbHkgb3IgcmVtb3ZlIGFuIGFkdmlzb3J5IGxvY2sgb24gYW4gb3BlbiBmaWxlCiAgIyBwaWRmZF9nZXRmZCAtIG9idGFpbiBhIGR1cGxpY2F0ZSBvZiBhbm90aGVyIHByb2Nlc3MncyBmaWxlIGRlc2NyaXB0b3IKICAjIGNsb2NrX25hbm9zbGVlcCAtIGhpZ2gtcmVzb2x1dGlvbiBzbGVlcCB3aXRoIHNwZWNpZmlhYmxlIGNsb2NrCiAgIyBnZXRwYWdlc2l6ZSAtIGdldCBtZW1vcnkgcGFnZSBzaXplCiAgIyBwaWRmZF9vcGVuIC0gb2J0YWluIGEgZmlsZSBkZXNjcmlwdG9yIHRoYXQgcmVmZXJzIHRvIGEgcHJvY2VzcwogICMgc3BsaWNlIC0gc3BsaWNlIGRhdGEgdG8vZnJvbSBhIHBpcGUKICAjIGdldHJlc3VpZCAtIGdldCByZWFsLCBlZmZlY3RpdmUgYW5kIHNhdmVkIHVzZXIvZ3JvdXAgSURzCiAgIyBnZXRyZXNnaWQgLSBnZXQgcmVhbCwgZWZmZWN0aXZlIGFuZCBzYXZlZCB1c2VyL2dyb3VwIElEcwogICMgcmVtYXBfZmlsZV9wYWdlcyAtIGNyZWF0ZSBhIG5vbmxpbmVhciBmaWxlIG1hcHBpbmcKICAjIGlvX2NhbmNlbCAtIGNhbmNlbCBhbiBvdXRzdGFuZGluZyBhc3luY2hyb25vdXMgSS9PIG9wZXJhdGlvbgogICMgcHJjdGwgLSBvcGVyYXRpb25zIG9uIGEgcHJvY2VzcyBvciB0aHJlYWQKICAjIGNsb2NrX2dldHJlcyAtIGNsb2NrIGFuZCB0aW1lIGZ1bmN0aW9ucwogICMgY2xvY2tfZ2V0dGltZSAtIGNsb2NrIGFuZCB0aW1lIGZ1bmN0aW9ucwogICMgZ2V0Z3JvdXBzIC0gZ2V0L3NldCBsaXN0IG9mIHN1cHBsZW1lbnRhcnkgZ3JvdXAgSURzCiAgIyBzZXRncm91cHMgLSBnZXQvc2V0IGxpc3Qgb2Ygc3VwcGxlbWVudGFyeSBncm91cCBJRHMKICAjIHZtc3BsaWNlIC0gc3BsaWNlIHVzZXIgcGFnZXMgdG8vZnJvbSBhIHBpcGUKICAjIGVwb2xsX2NyZWF0ZSAtIG9wZW4gYW4gZXBvbGwgZmlsZSBkZXNjcmlwdG9yCiAgIyBlcG9sbF9jcmVhdGUxIC0gb3BlbiBhbiBlcG9sbCBmaWxlIGRlc2NyaXB0b3IKICAjIHBvc2l4X2ZhZHZpc2UgLSBwcmVkZWNsYXJlIGFuIGFjY2VzcyBwYXR0ZXJuIGZvciBmaWxlIGRhdGEKICAjIHNpZ3dhaXRpbmZvIC0gc3luY2hyb25vdXNseSB3YWl0IGZvciBxdWV1ZWQgc2lnbmFscwogICMgc2lndGltZWR3YWl0IC0gc3luY2hyb25vdXNseSB3YWl0IGZvciBxdWV1ZWQgc2lnbmFscwogICMgcnRfc2lndGltZWR3YWl0IC0gc3luY2hyb25vdXNseSB3YWl0IGZvciBxdWV1ZWQgc2lnbmFscwogICMgc2lncmV0dXJuIC0gcmV0dXJuIGZyb20gc2lnbmFsIGhhbmRsZXIgYW5kIGNsZWFudXAgc3RhY2sgZnJhbWUKICAjIHJ0X3NpZ3JldHVybiAtIHJldHVybiBmcm9tIHNpZ25hbCBoYW5kbGVyIGFuZCBjbGVhbnVwIHN0YWNrIGZyYW1lCiAgIyBnZXRyYW5kb20gLSBvYnRhaW4gYSBzZXJpZXMgb2YgcmFuZG9tIGJ5dGVzCiAgIyBrZXljdGwgLSBtYW5pcHVsYXRlIHRoZSBrZXJuZWwncyBrZXkgbWFuYWdlbWVudCBmYWNpbGl0eQogICMgc2NoZWRfZ2V0c2NoZWR1bGVyIC0gc2V0IGFuZCBnZXQgc2NoZWR1bGluZyBwb2xpY3kvcGFyYW1ldGVycwogICMgbWJpbmQgLSBzZXQgbWVtb3J5IHBvbGljeSBmb3IgYSBtZW1vcnkgcmFuZ2UKICAjIGdldHByaW9yaXR5IC0gZ2V0L3NldCBwcm9ncmFtIHNjaGVkdWxpbmcgcHJpb3JpdHkKICAjIHNldHByaW9yaXR5IC0gZ2V0L3NldCBwcm9ncmFtIHNjaGVkdWxpbmcgcHJpb3JpdHkKICAjIGlub3RpZnlfaW5pdCAtIGluaXRpYWxpemUgYW4gaW5vdGlmeSBpbnN0YW5jZQogICMgaW5vdGlmeV9pbml0MSAtIGluaXRpYWxpemUgYW4gaW5vdGlmeSBpbnN0YW5jZQogICMgc2VtY3RsIC0gU3lzdGVtIFYgc2VtYXBob3JlIGNvbnRyb2wgb3BlcmF0aW9ucwogICMgZ2V0aG9zdG5hbWUgLSBnZXQvc2V0IGhvc3RuYW1lCiAgIyBwdHJhY2UgLSBwcm9jZXNzIHRyYWNlCiAgIyBzeXNjdGwgLSByZWFkL3dyaXRlIHN5c3RlbSBwYXJhbWV0ZXJzCiAgIyBnZXRwZWVybmFtZSAtIGdldCBuYW1lIG9mIGNvbm5lY3RlZCBwZWVyIHNvY2tldAogICMgZm9yayAtIGNyZWF0ZSBhIGNoaWxkIHByb2Nlc3MKICAjIHF1ZXJ5X21vZHVsZSAtIHF1ZXJ5IHRoZSBrZXJuZWwgZm9yIHZhcmlvdXMgYml0cyBwZXJ0YWluaW5nIHRvIG1vZHVsZXMKICAjIGlvY3RsX2xpc3QgLSBsaXN0IG9mIGlvY3RsIGNhbGxzIGluIExpbnV4L2kzODYga2VybmVsCiAgIyBtc2dnZXQgLSBnZXQgYSBTeXN0ZW0gViBtZXNzYWdlIHF1ZXVlIGlkZW50aWZpZXIKICAjIHNwdV9jcmVhdGUgLSBjcmVhdGUgYSBuZXcgc3B1IGNvbnRleHQKICAjIHN1YnBhZ2VfcHJvdCAtIGRlZmluZSBhIHN1YnBhZ2UgcHJvdGVjdGlvbiBmb3IgYW4gYWRkcmVzcyByYW5nZQogICMgcXVvdGFjdGwgLSBtYW5pcHVsYXRlIGRpc2sgcXVvdGFzCiAgIyBuZnNzZXJ2Y3RsIC0gc3lzY2FsbCBpbnRlcmZhY2UgdG8ga2VybmVsIG5mcyBkYWVtb24KICAjIG9wZW5hdDIgLSBvcGVuIGFuZCBwb3NzaWJseSBjcmVhdGUgYSBmaWxlIChleHRlbmRlZCkKICAjIGdldHJsaW1pdCAtIGdldC9zZXQgcmVzb3VyY2UgbGltaXRzCiAgIyBzZXRybGltaXQgLSBnZXQvc2V0IHJlc291cmNlIGxpbWl0cwogICMgcHJsaW1pdCAtIGdldC9zZXQgcmVzb3VyY2UgbGltaXRzCiAgIyB0ZWUgLSBkdXBsaWNhdGluZyBwaXBlIGNvbnRlbnQKICAjIHNobWdldCAtIGFsbG9jYXRlcyBhIFN5c3RlbSBWIHNoYXJlZCBtZW1vcnkgc2VnbWVudAogICMgY3JlYXRlX21vZHVsZSAtIGNyZWF0ZSBhIGxvYWRhYmxlIG1vZHVsZSBlbnRyeQogICMgZ2V0dGltZW9mZGF5IC0gZ2V0IC8gc2V0IHRpbWUKICAjIHRpbWVyX2NyZWF0ZSAtIGNyZWF0ZSBhIFBPU0lYIHBlci1wcm9jZXNzIHRpbWVyCiAgIyBmYW5vdGlmeV9tYXJrIC0gYWRkLCByZW1vdmUsIG9yIG1vZGlmeSBhbiBmYW5vdGlmeSBtYXJrIG9uIGEgZmlsZXN5c3RlbSBvYmplY3QKICAjIHBpcGUgLSBjcmVhdGUgcGlwZQogICMgcGlwZTIgLSBjcmVhdGUgcGlwZQogICMgaW50cm8gLSBpbnRyb2R1Y3Rpb24gdG8gc3lzdGVtIGNhbGxzCiAgIyBsb29rdXBfZGNvb2tpZSAtIHJldHVybiBhIGRpcmVjdG9yeSBlbnRyeSdzIHBhdGgKICAjIHN5c2ZzIC0gZ2V0IGZpbGVzeXN0ZW0gdHlwZSBpbmZvcm1hdGlvbgogICMgczM5MF9ydW50aW1lX2luc3RyIC0gZW5hYmxlL2Rpc2FibGUgczM5MCBDUFUgcnVuLXRpbWUgaW5zdHJ1bWVudGF0aW9uCiAgIyBzZXRucyAtIHJlYXNzb2NpYXRlIHRocmVhZCB3aXRoIGEgbmFtZXNwYWNlCiAgIyBzZXRfbWVtcG9saWN5IC0gc2V0IGRlZmF1bHQgTlVNQSBtZW1vcnkgcG9saWN5IGZvciBhIHRocmVhZCBhbmQgaXRzIGNoaWxkcmVuCiAgIyBuaWNlIC0gY2hhbmdlIHByb2Nlc3MgcHJpb3JpdHkKICAjIGlvX3NldHVwIC0gY3JlYXRlIGFuIGFzeW5jaHJvbm91cyBJL08gY29udGV4dAogICMgbWluY29yZSAtIGRldGVybWluZSB3aGV0aGVyIHBhZ2VzIGFyZSByZXNpZGVudCBpbiBtZW1vcnkKICAjIGlvY3RsX2NvbnNvbGUgLSBpb2N0bHMgZm9yIGNvbnNvbGUgdGVybWluYWwgYW5kIHZpcnR1YWwgY29uc29sZXMKICAjIHBvbGwgLSB3YWl0IGZvciBzb21lIGV2ZW50IG9uIGEgZmlsZSBkZXNjcmlwdG9yCiAgIyBwcG9sbCAtIHdhaXQgZm9yIHNvbWUgZXZlbnQgb24gYSBmaWxlIGRlc2NyaXB0b3IKICAjIGNhcGdldCAtIHNldC9nZXQgY2FwYWJpbGl0aWVzIG9mIHRocmVhZChzKQogICMgY2Fwc2V0IC0gc2V0L2dldCBjYXBhYmlsaXRpZXMgb2YgdGhyZWFkKHMpCiAgIyBpb2N0bF90dHkgLSBpb2N0bHMgZm9yIHRlcm1pbmFscyBhbmQgc2VyaWFsIGxpbmVzCiAgIyBpb3BsIC0gY2hhbmdlIEkvTyBwcml2aWxlZ2UgbGV2ZWwKICAjIGlvX2dldGV2ZW50cyAtIHJlYWQgYXN5bmNocm9ub3VzIEkvTyBldmVudHMgZnJvbSB0aGUgY29tcGxldGlvbiBxdWV1ZQogICMgcHJvY2Vzc192bV9yZWFkdiAtIHRyYW5zZmVyIGRhdGEgYmV0d2VlbiBwcm9jZXNzIGFkZHJlc3Mgc3BhY2VzCiAgIyBwcm9jZXNzX3ZtX3dyaXRldiAtIHRyYW5zZmVyIGRhdGEgYmV0d2VlbiBwcm9jZXNzIGFkZHJlc3Mgc3BhY2VzCiAgIyBwY2ljb25maWdfcmVhZCAtIHBjaSBkZXZpY2UgaW5mb3JtYXRpb24gaGFuZGxpbmcKICAjIHBjaWNvbmZpZ193cml0ZSAtIHBjaSBkZXZpY2UgaW5mb3JtYXRpb24gaGFuZGxpbmcKICAjIHBjaWNvbmZpZ19pb2Jhc2UgLSBwY2kgZGV2aWNlIGluZm9ybWF0aW9uIGhhbmRsaW5nCiAgIyBzYnJrIC0gY2hhbmdlIGRhdGEgc2VnbWVudCBzaXplCiAgIyBzZXRfdGlkX2FkZHJlc3MgLSBzZXQgcG9pbnRlciB0byB0aHJlYWQgSUQKICAjIHBrZXlfYWxsb2MgLSBhbGxvY2F0ZSBvciBmcmVlIGEgcHJvdGVjdGlvbiBrZXkKICAjIHBrZXlfZnJlZSAtIGFsbG9jYXRlIG9yIGZyZWUgYSBwcm90ZWN0aW9uIGtleQogICMgc2VsZWN0IC0gc3luY2hyb25vdXMgSS9PIG11bHRpcGxleGluZwogICMgcHNlbGVjdCAtIHN5bmNocm9ub3VzIEkvTyBtdWx0aXBsZXhpbmcKICAjIGtleGVjX2xvYWQgLSBsb2FkIGEgbmV3IGtlcm5lbCBmb3IgbGF0ZXIgZXhlY3V0aW9uCiAgIyBrZXhlY19maWxlX2xvYWQgLSBsb2FkIGEgbmV3IGtlcm5lbCBmb3IgbGF0ZXIgZXhlY3V0aW9uCiAgIyBwZXJzb25hbGl0eSAtIHNldCB0aGUgcHJvY2VzcyBleGVjdXRpb24gZG9tYWluCiAgIyBpb2N0bF9nZXRmc21hcCAtIHJldHJpZXZlIHRoZSBwaHlzaWNhbCBsYXlvdXQgb2YgdGhlIGZpbGVzeXN0ZW0KICAjIGlub3RpZnlfcm1fd2F0Y2ggLSByZW1vdmUgYW4gZXhpc3Rpbmcgd2F0Y2ggZnJvbSBhbiBpbm90aWZ5IGluc3RhbmNlCiAgIyBwZXJmX2V2ZW50X29wZW4gLSBzZXQgdXAgcGVyZm9ybWFuY2UgbW9uaXRvcmluZwogICMgdGltZXJfZ2V0b3ZlcnJ1biAtIGdldCBvdmVycnVuIGNvdW50IGZvciBhIFBPU0lYIHBlci1wcm9jZXNzIHRpbWVyCiAgIyB3YWl0MyAtIHdhaXQgZm9yIHByb2Nlc3MgdG8gY2hhbmdlIHN0YXRlLCBCU0Qgc3R5bGUKICAjIHdhaXQ0IC0gd2FpdCBmb3IgcHJvY2VzcyB0byBjaGFuZ2Ugc3RhdGUsIEJTRCBzdHlsZQogICMgbGluayAtIG1ha2UgYSBuZXcgbmFtZSBmb3IgYSBmaWxlCiAgIyBsaW5rYXQgLSBtYWtlIGEgbmV3IG5hbWUgZm9yIGEgZmlsZQogICMgc2NoZWRfcnJfZ2V0X2ludGVydmFsIC0gZ2V0IHRoZSBTQ0hFRF9SUiBpbnRlcnZhbCBmb3IgdGhlIG5hbWVkIHByb2Nlc3MKICAjIG11bm1hcCAtIG1hcCBvciB1bm1hcCBmaWxlcyBvciBkZXZpY2VzIGludG8gbWVtb3J5CiAgIyBzb2NrZXRjYWxsIC0gc29ja2V0IHN5c3RlbSBjYWxscwogICMgbXJlbWFwIC0gcmVtYXAgYSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzCiAgIyB2Zm9yayAtIGNyZWF0ZSBhIGNoaWxkIHByb2Nlc3MgYW5kIGJsb2NrIHBhcmVudAogICMgc2VjY29tcCAtIG9wZXJhdGUgb24gU2VjdXJlIENvbXB1dGluZyBzdGF0ZSBvZiB0aGUgcHJvY2VzcwogICMgcmVxdWVzdF9rZXkgLSByZXF1ZXN0IGEga2V5IGZyb20gdGhlIGtlcm5lbCdzIGtleSBtYW5hZ2VtZW50IGZhY2lsaXR5CiAgIyBzeXNjYWxsIC0gaW5kaXJlY3Qgc3lzdGVtIGNhbGwKICAjIGtjbXAgLSBjb21wYXJlIHR3byBwcm9jZXNzZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgc2hhcmUgYSBrZXJuZWwgcmVzb3VyY2UKICAjIHJlYWRkaXIgLSByZWFkIGRpcmVjdG9yeSBlbnRyeQogICMgaW9wZXJtIC0gc2V0IHBvcnQgaW5wdXQvb3V0cHV0IHBlcm1pc3Npb25zCiAgIyBzcHVfcnVuIC0gZXhlY3V0ZSBhbiBTUFUgY29udGV4dAogICMgcmVib290IC0gcmVib290IG9yIGVuYWJsZS9kaXNhYmxlIEN0cmwtQWx0LURlbAogICMgcmVhZGFoZWFkIC0gaW5pdGlhdGUgZmlsZSByZWFkYWhlYWQgaW50byBwYWdlIGNhY2hlCiAgIyBzY2hlZF9nZXRwYXJhbSAtIHNldCBhbmQgZ2V0IHNjaGVkdWxpbmcgcGFyYW1ldGVycwogICMgYWNjdCAtIHN3aXRjaCBwcm9jZXNzIGFjY291bnRpbmcgb24gb3Igb2ZmCiAgIyBzaWdzdXNwZW5kIC0gd2FpdCBmb3IgYSBzaWduYWwKICAjIHJ0X3NpZ3N1c3BlbmQgLSB3YWl0IGZvciBhIHNpZ25hbAogICMgZXhpdF9ncm91cCAtIGV4aXQgYWxsIHRocmVhZHMgaW4gYSBwcm9jZXNzCiAgIyBzb2NrZXQgLSBjcmVhdGUgYW4gZW5kcG9pbnQgZm9yIGNvbW11bmljYXRpb24KICAjIGlvY3RsX3VzZXJmYXVsdGZkIC0gY3JlYXRlIGEgZmlsZSBkZXNjcmlwdG9yIGZvciBoYW5kbGluZyBwYWdlIGZhdWx0cyBpbiB1c2VyIHNwYWNlCiAgIyBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4IC0gZ2V0IHN0YXRpYyBwcmlvcml0eSByYW5nZQogICMgc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiAgLSBnZXQgc3RhdGljIHByaW9yaXR5IHJhbmdlCiAgIyBnZXRkZW50cyAtIGdldCBkaXJlY3RvcnkgZW50cmllcwogICMgZ2V0ZGVudHM2NCAtIGdldCBkaXJlY3RvcnkgZW50cmllcwogICMgc2VsZWN0IC0gc3luY2hyb25vdXMgSS9PIG11bHRpcGxleGluZwogICMgcHNlbGVjdCAtIHN5bmNocm9ub3VzIEkvTyBtdWx0aXBsZXhpbmcKICAjIGFsbG9jX2h1Z2VwYWdlcyAtIGFsbG9jYXRlIG9yIGZyZWUgaHVnZSBwYWdlcwogICMgZnJlZV9odWdlcGFnZXMgLSBhbGxvY2F0ZSBvciBmcmVlIGh1Z2UgcGFnZXMKICAjIGZzeW5jIC0gc3luY2hyb25pemUgYSBmaWxlJ3MgaW4tY29yZSBzdGF0ZSB3aXRoIHN0b3JhZ2UgZGV2aWNlCiAgIyBmZGF0YXN5bmMgLSBzeW5jaHJvbml6ZSBhIGZpbGUncyBpbi1jb3JlIHN0YXRlIHdpdGggc3RvcmFnZSBkZXZpY2UKICAjIHN5c2NhbGxzIC0gTGludXggc3lzdGVtIGNhbGxzCiAgIyBtZW1mZF9jcmVhdGUgLSBjcmVhdGUgYW4gYW5vbnltb3VzIGZpbGUKICAjIG1vZGlmeV9sZHQgLSBnZXQgb3Igc2V0IGEgcGVyLXByb2Nlc3MgTERUIGVudHJ5CiAgIyBnZXRfa2VybmVsX3N5bXMgLSByZXRyaWV2ZSBleHBvcnRlZCBrZXJuZWwgYW5kIG1vZHVsZSBzeW1ib2xzCiAgIyBsc2VlayAtIHJlcG9zaXRpb24gcmVhZC93cml0ZSBmaWxlIG9mZnNldAogICMgc2htYXQgLSBTeXN0ZW0gViBzaGFyZWQgbWVtb3J5IG9wZXJhdGlvbnMKICAjIHNobWR0IC0gU3lzdGVtIFYgc2hhcmVkIG1lbW9yeSBvcGVyYXRpb25zCiAgIyB0aW1lcl9kZWxldGUgLSBkZWxldGUgYSBQT1NJWCBwZXItcHJvY2VzcyB0aW1lcgogICMgcGVyZm1vbmN0bCAtIGludGVyZmFjZSB0byBJQS02NCBwZXJmb3JtYW5jZSBtb25pdG9yaW5nIHVuaXQKICAjIG1vdmVfcGFnZXMgLSBtb3ZlIGluZGl2aWR1YWwgcGFnZXMgb2YgYSBwcm9jZXNzIHRvIGFub3RoZXIgbm9kZQogICMgY2hkaXIgLSBjaGFuZ2Ugd29ya2luZyBkaXJlY3RvcnkKICAjIGZjaGRpciAtIGNoYW5nZSB3b3JraW5nIGRpcmVjdG9yeQogICMgdGltZSAtIGdldCB0aW1lIGluIHNlY29uZHMKICAjIF9leGl0IC0gdGVybWluYXRlIHRoZSBjYWxsaW5nIHByb2Nlc3MKICAjIF9FeGl0IC0gdGVybWluYXRlIHRoZSBjYWxsaW5nIHByb2Nlc3MKICAjIHMzOTBfc3RoeWkgLSBlbXVsYXRlIFNUSFlJIGluc3RydWN0aW9uCiAgIyBpb19zdWJtaXQgLSBzdWJtaXQgYXN5bmNocm9ub3VzIEkvTyBibG9ja3MgZm9yIHByb2Nlc3NpbmcKICAjIG1sb2NrIC0gbG9jayBhbmQgdW5sb2NrIG1lbW9yeQogICMgbWxvY2syIC0gbG9jayBhbmQgdW5sb2NrIG1lbW9yeQogICMgbXVubG9jayAtIGxvY2sgYW5kIHVubG9jayBtZW1vcnkKICAjIG1sb2NrYWxsIC0gbG9jayBhbmQgdW5sb2NrIG1lbW9yeQogICMgbXVubG9ja2FsbCAtIGxvY2sgYW5kIHVubG9jayBtZW1vcnkKICAjIHVtYXNrIC0gc2V0IGZpbGUgbW9kZSBjcmVhdGlvbiBtYXNrCiAgIyBhcmNoX3ByY3RsIC0gc2V0IGFyY2hpdGVjdHVyZS1zcGVjaWZpYyB0aHJlYWQgc3RhdGUKICAjIHVzZWxpYiAtIGxvYWQgc2hhcmVkIGxpYnJhcnkKICAjIHNlbmRmaWxlIC0gdHJhbnNmZXIgZGF0YSBiZXR3ZWVuIGZpbGUgZGVzY3JpcHRvcnMKICAjIHNobWN0bCAtIFN5c3RlbSBWIHNoYXJlZCBtZW1vcnkgY29udHJvbAogICMgZXBvbGxfd2FpdCAtIHdhaXQgZm9yIGFuIEkvTyBldmVudCBvbiBhbiBlcG9sbCBmaWxlIGRlc2NyaXB0b3IKICAjIGVwb2xsX3B3YWl0IC0gd2FpdCBmb3IgYW4gSS9PIGV2ZW50IG9uIGFuIGVwb2xsIGZpbGUgZGVzY3JpcHRvcgogICMgc2lnYWx0c3RhY2sgLSBzZXQgYW5kL29yIGdldCBzaWduYWwgc3RhY2sgY29udGV4dAogICMgaW9jdGwgLSBjb250cm9sIGRldmljZQogICMgc2lnbmFsZmQgLSBjcmVhdGUgYSBmaWxlIGRlc2NyaXB0b3IgZm9yIGFjY2VwdGluZyBzaWduYWxzCiAgIyB1bnNoYXJlIC0gZGlzYXNzb2NpYXRlIHBhcnRzIG9mIHRoZSBwcm9jZXNzIGV4ZWN1dGlvbiBjb250ZXh0CiAgIyBjaHJvb3QgLSBjaGFuZ2Ugcm9vdCBkaXJlY3RvcnkKICAjIG1hZHZpc2UgLSBnaXZlIGFkdmljZSBhYm91dCB1c2Ugb2YgbWVtb3J5CiAgIyBnZXR0aWQgLSBnZXQgdGhyZWFkIGlkZW50aWZpY2F0aW9uCiAgIyBnZXRzb2NrbmFtZSAtIGdldCBzb2NrZXQgbmFtZQogICMgaW9fZGVzdHJveSAtIGRlc3Ryb3kgYW4gYXN5bmNocm9ub3VzIEkvTyBjb250ZXh0CiAgIyBzZXR1cCAtIHNldHVwIGRldmljZXMgYW5kIGZpbGVzeXN0ZW1zLCBtb3VudCByb290IGZpbGVzeXN0ZW0KICAjIG50cF9hZGp0aW1lIC0gdHVuZSBrZXJuZWwgY2xvY2sKICAjIHNlbWdldCAtIGdldCBhIFN5c3RlbSBWIHNlbWFwaG9yZSBzZXQgaWRlbnRpZmllcgogICMgZ2V0dWlkIC0gZ2V0IHVzZXIgaWRlbnRpdHkKICAjIGdldGV1aWQgLSBnZXQgdXNlciBpZGVudGl0eQogICMgX3N5c2NhbGwgLSBpbnZva2luZyBhIHN5c3RlbSBjYWxsIHdpdGhvdXQgbGlicmFyeSBzdXBwb3J0IChPQlNPTEVURSkKICAjIHNjaGVkX3NldGFmZmluaXR5IC0gXCBzZXQgYW5kIGdldCBhIHRocmVhZCdzIENQVSBhZmZpbml0eSBtYXNrCiAgIyBzY2hlZF9nZXRhZmZpbml0eSAtIFwgc2V0IGFuZCBnZXQgYSB0aHJlYWQncyBDUFUgYWZmaW5pdHkgbWFzawogICMgY2FjaGVmbHVzaCAtIGZsdXNoIGNvbnRlbnRzIG9mIGluc3RydWN0aW9uIGFuZC9vciBkYXRhIGNhY2hlCiAgIyBwaXZvdF9yb290IC0gY2hhbmdlIHRoZSByb290IG1vdW50CiAgIyBtc2djdGwgLSBTeXN0ZW0gViBtZXNzYWdlIGNvbnRyb2wgb3BlcmF0aW9ucwogICMgaW9jdGxfZmF0IC0gbWFuaXB1bGF0aW5nIHRoZSBGQVQgZmlsZXN5c3RlbQogICMgc2V0cGdpZCAtIHNldC9nZXQgcHJvY2VzcyBncm91cAogICMgZ2V0cGdpZCAtIHNldC9nZXQgcHJvY2VzcyBncm91cAogICMgc2V0cGdycCAtIHNldC9nZXQgcHJvY2VzcyBncm91cAogICMgZ2V0cGdycCAtIHNldC9nZXQgcHJvY2VzcyBncm91cAogICMgc29ja2V0cGFpciAtIGNyZWF0ZSBhIHBhaXIgb2YgY29ubmVjdGVkIHNvY2tldHMKICAjIGJkZmx1c2ggLSBzdGFydCwgZmx1c2gsIG9yIHR1bmUgYnVmZmVyLWRpcnR5LWZsdXNoIGRhZW1vbgogICMgYWxhcm0gLSBzZXQgYW4gYWxhcm0gY2xvY2sgZm9yIGRlbGl2ZXJ5IG9mIGEgc2lnbmFsCiAgIyB0aW1lcl9zZXR0aW1lIC0gYXJtL2Rpc2FybSBhbmQgZmV0Y2ggc3RhdGUgb2YgUE9TSVggcGVyLXByb2Nlc3MgdGltZXIKICAjIHRpbWVyX2dldHRpbWUgLSBhcm0vZGlzYXJtIGFuZCBmZXRjaCBzdGF0ZSBvZiBQT1NJWCBwZXItcHJvY2VzcyB0aW1lcgogICMgYWRkX2tleSAtIGFkZCBhIGtleSB0byB0aGUga2VybmVsJ3Mga2V5IG1hbmFnZW1lbnQgZmFjaWxpdHkKICAjIHJ0X3NpZ3F1ZXVlaW5mbyAtIHF1ZXVlIGEgc2lnbmFsIGFuZCBkYXRhCiAgIyBydF90Z3NpZ3F1ZXVlaW5mbyAtIHF1ZXVlIGEgc2lnbmFsIGFuZCBkYXRhCiAgIyB1c2VyZmF1bHRmZCAtIGNyZWF0ZSBhIGZpbGUgZGVzY3JpcHRvciBmb3IgaGFuZGxpbmcgcGFnZSBmYXVsdHMgaW4gdXNlciBzcGFjZQogICMgc2Vtb3AgLSBTeXN0ZW0gViBzZW1hcGhvcmUgb3BlcmF0aW9ucwogICMgc2VtdGltZWRvcCAtIFN5c3RlbSBWIHNlbWFwaG9yZSBvcGVyYXRpb25zCiAgIyBnZXRnaWQgLSBnZXQgZ3JvdXAgaWRlbnRpdHkKICAjIGdldGVnaWQgLSBnZXQgZ3JvdXAgaWRlbnRpdHkKICAjIGdldHBpZCAtIGdldCBwcm9jZXNzIGlkZW50aWZpY2F0aW9uCiAgIyBnZXRwcGlkIC0gZ2V0IHByb2Nlc3MgaWRlbnRpZmljYXRpb24KICAjIHNpZ3Byb2NtYXNrIC0gZXhhbWluZSBhbmQgY2hhbmdlIGJsb2NrZWQgc2lnbmFscwogICMgcnRfc2lncHJvY21hc2sgLSBleGFtaW5lIGFuZCBjaGFuZ2UgYmxvY2tlZCBzaWduYWxzCiAgIyB1bmFtZSAtIGdldCBuYW1lIGFuZCBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IGtlcm5lbAogICMgc3RhdHggLSBnZXQgZmlsZSBzdGF0dXMgKGV4dGVuZGVkKQogICMgaW9jdGxfZmljbG9uZXJhbmdlIC0gc2hhcmUgc29tZSB0aGUgZGF0YSBvZiBvbmUgZmlsZSB3aXRoIGFub3RoZXIgZmlsZQogICMgaW9jdGxfZmljbG9uZSAtIHNoYXJlIHNvbWUgdGhlIGRhdGEgb2Ygb25lIGZpbGUgd2l0aCBhbm90aGVyIGZpbGUKICAjIG1xX2dldHNldGF0dHIgLSBnZXQvc2V0IG1lc3NhZ2UgcXVldWUgYXR0cmlidXRlcwogICMgaW9wcmlvX2dldCAtIGdldC9zZXQgSS9PIHNjaGVkdWxpbmcgY2xhc3MgYW5kIHByaW9yaXR5CiAgIyBpb3ByaW9fc2V0IC0gZ2V0L3NldCBJL08gc2NoZWR1bGluZyBjbGFzcyBhbmQgcHJpb3JpdHkKICAjIGVwb2xsX2N0bCAtIGNvbnRyb2wgaW50ZXJmYWNlIGZvciBhbiBlcG9sbCBmaWxlIGRlc2NyaXB0b3IKICAjIHN5bmMgLSBjb21taXQgZmlsZXN5c3RlbSBjYWNoZXMgdG8gZGlzawogICMgc3luY2ZzIC0gY29tbWl0IGZpbGVzeXN0ZW0gY2FjaGVzIHRvIGRpc2sKICAjIHNldHNpZCAtIGNyZWF0ZXMgYSBzZXNzaW9uIGFuZCBzZXRzIHRoZSBwcm9jZXNzIGdyb3VwIElECiAgIyBzaHV0ZG93biAtIHNodXQgZG93biBwYXJ0IG9mIGEgZnVsbC1kdXBsZXggY29ubmVjdGlvbgogICMgZ2V0c2lkIC0gZ2V0IHNlc3Npb24gSUQKICAjIGdldF90aHJlYWRfYXJlYSAtIG1hbmlwdWxhdGUgdGhyZWFkLWxvY2FsIHN0b3JhZ2UgaW5mb3JtYXRpb24KICAjIHNldF90aHJlYWRfYXJlYSAtIG1hbmlwdWxhdGUgdGhyZWFkLWxvY2FsIHN0b3JhZ2UgaW5mb3JtYXRpb24KICAjIHRpbWVyZmRfY3JlYXRlIC0gdGltZXJzIHRoYXQgbm90aWZ5IHZpYSBmaWxlIGRlc2NyaXB0b3JzCiAgIyB0aW1lcmZkX3NldHRpbWUgLSB0aW1lcnMgdGhhdCBub3RpZnkgdmlhIGZpbGUgZGVzY3JpcHRvcnMKICAjIHRpbWVyZmRfZ2V0dGltZSAtIHRpbWVycyB0aGF0IG5vdGlmeSB2aWEgZmlsZSBkZXNjcmlwdG9ycwogICMgaW9jdGxfZmlkZWR1cGVyYW5nZSAtIHNoYXJlIHNvbWUgdGhlIGRhdGEgb2Ygb25lIGZpbGUgd2l0aCBhbm90aGVyIGZpbGUKICAjIG5hbWVfdG9faGFuZGxlX2F0IC0gb2J0YWluIGhhbmRsZSBmb3IgYSBwYXRobmFtZSBhbmQgb3BlbiBmaWxlIHZpYSBhIGhhbmRsZQogICMgb3Blbl9ieV9oYW5kbGVfYXQgLSBvYnRhaW4gaGFuZGxlIGZvciBhIHBhdGhuYW1lIGFuZCBvcGVuIGZpbGUgdmlhIGEgaGFuZGxlCiAgIyBmdXRleCAtIGZhc3QgdXNlci1zcGFjZSBsb2NraW5nCiAgIyBpb2N0bF9ucyAtIGlvY3RsKCkgb3BlcmF0aW9ucyBmb3IgTGludXggbmFtZXNwYWNlcwogICMgcGlkZmRfc2VuZF9zaWduYWwgLSBzZW5kIGEgc2lnbmFsIHRvIGEgcHJvY2VzcyBzcGVjaWZpZWQgYnkgYSBmaWxlIGRlc2NyaXB0b3IKICAjIGNsb25lIC0gY3JlYXRlIGEgY2hpbGQgcHJvY2VzcwogICMgX19jbG9uZTIgLSBjcmVhdGUgYSBjaGlsZCBwcm9jZXNzCiAgIyBjbG9uZTMgLSBjcmVhdGUgYSBjaGlsZCBwcm9jZXNzCiAgIyB0aW1lcyAtIGdldCBwcm9jZXNzIHRpbWVzCiAgIyBzeXNpbmZvIC0gcmV0dXJuIHN5c3RlbSBpbmZvcm1hdGlvbgogICMgaXBjIC0gU3lzdGVtIFYgSVBDIHN5c3RlbSBjYWxscwogICMgZXZlbnRmZCAtIGNyZWF0ZSBhIGZpbGUgZGVzY3JpcHRvciBmb3IgZXZlbnQgbm90aWZpY2F0aW9uCiAgIyB3YWl0IC0gd2FpdCBmb3IgcHJvY2VzcyB0byBjaGFuZ2Ugc3RhdGUKICAjIHdhaXRwaWQgLSB3YWl0IGZvciBwcm9jZXNzIHRvIGNoYW5nZSBzdGF0ZQogICMgd2FpdGlkIC0gd2FpdCBmb3IgcHJvY2VzcyB0byBjaGFuZ2Ugc3RhdGUKICAjIGdldGRvbWFpbm5hbWUgLSBnZXQvc2V0IE5JUyBkb21haW4gbmFtZQogICMgaWRsZSAtIG1ha2UgcHJvY2VzcyAwIGlkbGUKICAjIGlub3RpZnlfYWRkX3dhdGNoIC0gYWRkIGEgd2F0Y2ggdG8gYW4gaW5pdGlhbGl6ZWQgaW5vdGlmeSBpbnN0YW5jZQogICMgZ2V0X21lbXBvbGljeSAtIHJldHJpZXZlIE5VTUEgbWVtb3J5IHBvbGljeSBmb3IgYSB0aHJlYWQKICAjIGJwZiAtIHBlcmZvcm0gYSBjb21tYW5kIG9uIGFuIGV4dGVuZGVkIEJQRiBtYXAgb3IgcHJvZ3JhbQogICMgZ2V0c29ja29wdCAtIGdldCBhbmQgc2V0IG9wdGlvbnMgb24gc29ja2V0cwogICMgc2V0c29ja29wdCAtIGdldCBhbmQgc2V0IG9wdGlvbnMgb24gc29ja2V0cwogICMgZ2V0aXRpbWVyIC0gZ2V0IG9yIHNldCB2YWx1ZSBvZiBhbiBpbnRlcnZhbCB0aW1lcgogICMgc2V0aXRpbWVyIC0gZ2V0IG9yIHNldCB2YWx1ZSBvZiBhbiBpbnRlcnZhbCB0aW1lcgogICMgbWVtYmFycmllciAtIGlzc3VlIG1lbW9yeSBiYXJyaWVycyBvbiBhIHNldCBvZiB0aHJlYWRzCiAgIyBtcHJvdGVjdCAtIHNldCBwcm90ZWN0aW9uIG9uIGEgcmVnaW9uIG9mIG1lbW9yeQogICMgcGtleV9tcHJvdGVjdCAtIHNldCBwcm90ZWN0aW9uIG9uIGEgcmVnaW9uIG9mIG1lbW9yeQogICMgZ2V0Y3B1IC0gZGV0ZXJtaW5lIENQVSBhbmQgTlVNQSBub2RlIG9uIHdoaWNoIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBydW5uaW5nCiAgIyBpb2N0bF9mc2xhYmVsIC0gZ2V0IG9yIHNldCBhIGZpbGVzeXN0ZW0gbGFiZWwKICAjIGxpc3R4YXR0ciAtIGxpc3QgZXh0ZW5kZWQgYXR0cmlidXRlIG5hbWVzCiAgIyBsbGlzdHhhdHRyIC0gbGlzdCBleHRlbmRlZCBhdHRyaWJ1dGUgbmFtZXMKICAjIGZsaXN0eGF0dHIgLSBsaXN0IGV4dGVuZGVkIGF0dHJpYnV0ZSBuYW1lcwogICMgX2xsc2VlayAtIHJlcG9zaXRpb24gcmVhZC93cml0ZSBmaWxlIG9mZnNldAogICMgZmNudGwgLSBtYW5pcHVsYXRlIGZpbGUgZGVzY3JpcHRvcgogICMgdXN0YXQgLSBnZXQgZmlsZXN5c3RlbSBzdGF0aXN0aWNzCiAgIyBzaWduYWwgLSBBTlNJIEMgc2lnbmFsIGhhbmRsaW5nCiAgIyBuYW5vc2xlZXAgLSBoaWdoLXJlc29sdXRpb24gc2xlZXAKICAjIGNvbm5lY3QgLSBpbml0aWF0ZSBhIGNvbm5lY3Rpb24gb24gYSBzb2NrZXQKICAjIHZtODZvbGQgLSBlbnRlciB2aXJ0dWFsIDgwODYgbW9kZQogICMgdm04NiAtIGVudGVyIHZpcnR1YWwgODA4NiBtb2RlCiAgIyBmYW5vdGlmeV9pbml0IC0gY3JlYXRlIGFuZCBpbml0aWFsaXplIGZhbm90aWZ5IGdyb3VwCiAgIyBtaWdyYXRlX3BhZ2VzIC0gbW92ZSBhbGwgcGFnZXMgaW4gYSBwcm9jZXNzIHRvIGFub3RoZXIgc2V0IG9mIG5vZGVzCiAgIyByZXN0YXJ0X3N5c2NhbGwgLSByZXN0YXJ0IGEgc3lzdGVtIGNhbGwgYWZ0ZXIgaW50ZXJydXB0aW9uIGJ5IGEgc3RvcCBzaWduYWwKICAjIGNsb3NlIC0gY2xvc2UgYSBmaWxlIGRlc2NyaXB0b3IKICAjIG1zZ3JjdiAtIFN5c3RlbSBWIG1lc3NhZ2UgcXVldWUgb3BlcmF0aW9ucwogICMgbXNnc25kIC0gU3lzdGVtIFYgbWVzc2FnZSBxdWV1ZSBvcGVyYXRpb25zCiAgIyByZWFkdiAtIHJlYWQgb3Igd3JpdGUgZGF0YSBpbnRvIG11bHRpcGxlIGJ1ZmZlcnMKICAjIHdyaXRldiAtIHJlYWQgb3Igd3JpdGUgZGF0YSBpbnRvIG11bHRpcGxlIGJ1ZmZlcnMKICAjIHByZWFkdiAtIHJlYWQgb3Igd3JpdGUgZGF0YSBpbnRvIG11bHRpcGxlIGJ1ZmZlcnMKICAjIHB3cml0ZXYgLSByZWFkIG9yIHdyaXRlIGRhdGEgaW50byBtdWx0aXBsZSBidWZmZXJzCiAgIyBwcmVhZHYyIC0gcmVhZCBvciB3cml0ZSBkYXRhIGludG8gbXVsdGlwbGUgYnVmZmVycwogICMgcHdyaXRldjIgLSByZWFkIG9yIHdyaXRlIGRhdGEgaW50byBtdWx0aXBsZSBidWZmZXJzCiAgIyBzeXNsb2cgLSByZWFkIGFuZC9vciBjbGVhciBrZXJuZWwgbWVzc2FnZSByaW5nIGJ1ZmZlcjsgc2V0IGNvbnNvbGVfbG9nbGV2ZWwKICAjIGtsb2djdGwgLSByZWFkIGFuZC9vciBjbGVhciBrZXJuZWwgbWVzc2FnZSByaW5nIGJ1ZmZlcjsgc2V0IGNvbnNvbGVfbG9nbGV2ZWwKICAjIHNjaGVkX3lpZWxkIC0geWllbGQgdGhlIHByb2Nlc3NvcgogICMgdmhhbmd1cCAtIHZpcnR1YWxseSBoYW5ndXAgdGhlIGN1cnJlbnQgdGVybWluYWwKICAjIGlvY3RsX2lmbGFncyAtIGlvY3RsKCkgb3BlcmF0aW9ucyBmb3IgaW5vZGUgZmxhZ3MKICAjIHNnZXRtYXNrIC0gbWFuaXB1bGF0aW9uIG9mIHNpZ25hbCBtYXNrIChvYnNvbGV0ZSkKICAjIHNzZXRtYXNrIC0gbWFuaXB1bGF0aW9uIG9mIHNpZ25hbCBtYXNrIChvYnNvbGV0ZSkKICAjIHN5bmNfZmlsZV9yYW5nZSAtIHN5bmMgYSBmaWxlIHNlZ21lbnQgd2l0aCBkaXNrCiAgIyBjb3B5X2ZpbGVfcmFuZ2UgLSBDb3B5IGEgcmFuZ2Ugb2YgZGF0YSBmcm9tIG9uZSBmaWxlIHRvIGFub3RoZXIKICAjIHNpZ3BlbmRpbmcgLSBleGFtaW5lIHBlbmRpbmcgc2lnbmFscwogICMgcnRfc2lncGVuZGluZyAtIGV4YW1pbmUgcGVuZGluZyBzaWduYWxzCiAgIyBnZXR1bndpbmQgLSBjb3B5IHRoZSB1bndpbmQgZGF0YSB0byBjYWxsZXIncyBidWZmZXIKICAjIG1zeW5jIC0gc3luY2hyb25pemUgYSBmaWxlIHdpdGggYSBtZW1vcnkgbWFwCiAgIyBnZXRfcm9idXN0X2xpc3QgLSBnZXQvc2V0IGxpc3Qgb2Ygcm9idXN0IGZ1dGV4ZXMKICAjIHNldF9yb2J1c3RfbGlzdCAtIGdldC9zZXQgbGlzdCBvZiByb2J1c3QgZnV0ZXhlcwogICMgZHVwIC0gZHVwbGljYXRlIGEgZmlsZSBkZXNjcmlwdG9yCiAgIyBkdXAyIC0gZHVwbGljYXRlIGEgZmlsZSBkZXNjcmlwdG9yCiAgIyBkdXAzIC0gZHVwbGljYXRlIGEgZmlsZSBkZXNjcmlwdG9yCiAgIyBzMzkwX3BjaV9tbWlvX3dyaXRlIC0gdHJhbnNmZXIgZGF0YSB0by9mcm9tIFBDSSBNTUlPIG1lbW9yeSBwYWdlCiAgIyBzMzkwX3BjaV9tbWlvX3JlYWQgLSB0cmFuc2ZlciBkYXRhIHRvL2Zyb20gUENJIE1NSU8gbWVtb3J5IHBhZ2UKICAjIHBhdXNlIC0gd2FpdCBmb3Igc2lnbmFsCiAgIyBzd2Fwb24gLSBzdGFydC9zdG9wIHN3YXBwaW5nIHRvIGZpbGUvZGV2aWNlCiAgIyBzd2Fwb2ZmIC0gc3RhcnQvc3RvcCBzd2FwcGluZyB0byBmaWxlL2RldmljZQoKICAjIFJlY29yZCB0eXBlIG5vcm1hbGl6YXRpb25zCiAgIyBVc2VmdWwgbGlua3M6CiAgIyBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vdG9ydmFsZHMvbGludXgvdjQuMTYvaW5jbHVkZS91YXBpL2xpbnV4L2F1ZGl0LmgKICAjIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9saW51eC1hdWRpdC9hdWRpdC11c2Vyc3BhY2UvNGQ5MzMzMDFiMTgzNWNhZmEwOGI5ZTllZjcwNWM4ZmI2Yzk2Y2I2Mi9saWIvbGliYXVkaXQuaAogICMgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9ndWlkZS9lbi9lY3MvY3VycmVudC9lY3MtYWxsb3dlZC12YWx1ZXMtZXZlbnQtY2F0ZWdvcnkuaHRtbAoKICAjIElBTSByZWxhdGVkIGV2ZW50cwoKICAjIEFVRElUX0FDQ1RfTE9DSyAtIFVzZXIncyBhY2NvdW50IGxvY2tlZCBieSBhZG1pbgogIC0gcmVjb3JkX3R5cGVzOiBBQ0NUX0xPQ0sKICAgIGFjdGlvbjogbG9ja2VkLWFjY291bnQKICAgIGVjczoKICAgICAgPDw6ICplY3MtaWFtCiAgICAgIHR5cGU6CiAgICAgICAgLSB1c2VyCiAgICAgICAgLSBpbmZvCiAgIyBBVURJVF9BQ0NUX1VOTE9DSyAtIFVzZXIncyBhY2NvdW50IHVubG9ja2VkIGJ5IGFkbWluCiAgLSByZWNvcmRfdHlwZXM6IEFDQ1RfVU5MT0NLCiAgICBhY3Rpb246IHVubG9ja2VkLWFjY291bnQKICAgIGVjczoKICAgICAgPDw6ICplY3MtaWFtCiAgICAgIHR5cGU6CiAgICAgICAgLSB1c2VyCiAgICAgICAgLSBpbmZvCiAgIyBBVURJVF9BRERfR1JPVVAgLSBHcm91cCBhY2NvdW50IGFkZGVkCiAgLSByZWNvcmRfdHlwZXM6IEFERF9HUk9VUAogICAgYWN0aW9uOiBhZGRlZC1ncm91cC1hY2NvdW50LXRvCiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IFtpZCwgYWNjdF0KICAgICAgd2hhdDogYWNjb3VudAogICAgZWNzOgogICAgICA8PDogKmVjcy1pYW0KICAgICAgdHlwZToKICAgICAgICAtIGdyb3VwCiAgICAgICAgLSBjcmVhdGlvbgogICMgQVVESVRfQUREX1VTRVIgLSBVc2VyIGFjY291bnQgYWRkZWQKICAtIHJlY29yZF90eXBlczogQUREX1VTRVIKICAgIGFjdGlvbjogYWRkZWQtdXNlci1hY2NvdW50CiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IFtpZCwgYWNjdF0KICAgICAgd2hhdDogYWNjb3VudAogICAgZWNzOgogICAgICA8PDogKmVjcy1pYW0KICAgICAgdHlwZToKICAgICAgICAtIHVzZXIKICAgICAgICAtIGNyZWF0aW9uCiAgIyBBVURJVF9ERUxfR1JPVVAgLSBHcm91cCBhY2NvdW50IGRlbGV0ZWQKICAtIHJlY29yZF90eXBlczogREVMX0dST1VQCiAgICBhY3Rpb246IGRlbGV0ZWQtZ3JvdXAtYWNjb3VudC1mcm9tCiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IFtpZCwgYWNjdF0KICAgICAgd2hhdDogYWNjb3VudAogICAgZWNzOgogICAgICA8PDogKmVjcy1pYW0KICAgICAgdHlwZToKICAgICAgICAtIGdyb3VwCiAgICAgICAgLSBkZWxldGlvbgogICMgQVVESVRfREVMX1VTRVIgLSBVc2VyIGFjY291bnQgZGVsZXRlZAogIC0gcmVjb3JkX3R5cGVzOiBERUxfVVNFUgogICAgYWN0aW9uOiBkZWxldGVkLXVzZXItYWNjb3VudAogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiBbaWQsIGFjY3RdCiAgICAgIHdoYXQ6IGFjY291bnQKICAgIGVjczoKICAgICAgPDw6ICplY3MtaWFtCiAgICAgIHR5cGU6CiAgICAgICAgLSB1c2VyCiAgICAgICAgLSBkZWxldGlvbgogICMgQVVESVRfR1JQX01HTVQgLSBHcm91cCBhY2NvdW50IGF0dHIgd2FzIG1vZGlmaWVkCiAgLSByZWNvcmRfdHlwZXM6IEdSUF9NR01UCiAgICBhY3Rpb246IG1vZGlmaWVkLWdyb3VwLWFjY291bnQKICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogW2lkLCBhY2N0XQogICAgICB3aGF0OiBhY2NvdW50CiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWlhbQogICAgICB0eXBlOgogICAgICAgIC0gZ3JvdXAKICAgICAgICAtIGNoYW5nZQogICMgQVVESVRfUk9MRV9BU1NJR04gLSBBZG1pbiBhc3NpZ25lZCB1c2VyIHRvIHJvbGUKICAtIHJlY29yZF90eXBlczogUk9MRV9BU1NJR04KICAgIGFjdGlvbjogYXNzaWduZWQtdXNlci1yb2xlLXRvCiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IFtpZCwgYWNjdF0KICAgICAgd2hhdDogYWNjb3VudAogICAgZWNzOgogICAgICA8PDogKmVjcy1pYW0KICAgICAgdHlwZToKICAgICAgICAtIHVzZXIKICAgICAgICAtIGNoYW5nZQogICMgQVVESVRfUk9MRV9NT0RJRlkgLSBBZG1pbiBtb2RpZmllZCBhIHJvbGUKICAtIHJlY29yZF90eXBlczogUk9MRV9NT0RJRlkKICAgIGFjdGlvbjogbW9kaWZpZWQtcm9sZQogICAgZWNzOgogICAgICA8PDogKmVjcy1pYW0KICAgICAgdHlwZToKICAgICAgICAtIGNoYW5nZQogICMgQVVESVRfUk9MRV9SRU1PVkUgLSBBZG1pbiByZW1vdmVkIHVzZXIgZnJvbSByb2xlCiAgLSByZWNvcmRfdHlwZXM6IFJPTEVfUkVNT1ZFCiAgICBhY3Rpb246IHJlbW92ZWQtdXNlci1yb2xlLWZyb20KICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogW2lkLCBhY2N0XQogICAgICB3aGF0OiBhY2NvdW50CiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWlhbQogICAgICB0eXBlOgogICAgICAgIC0gdXNlcgogICAgICAgIC0gY2hhbmdlCiAgIyBBVURJVF9VU0VSX01HTVQgLSBVc2VyIGFjY3QgYXR0cmlidXRlIGNoYW5nZQogIC0gPDw6ICptYWNyby11c2VyLXNlc3Npb24KICAgIHJlY29yZF90eXBlczogVVNFUl9NR01UCiAgICBhY3Rpb246IG1vZGlmaWVkLXVzZXItYWNjb3VudAogICAgZWNzOgogICAgICA8PDogKmVjcy1pYW0KICAgICAgdHlwZToKICAgICAgICAtIHVzZXIKICAgICAgICAtIGNoYW5nZQogICMgQVVESVRfVVNFUl9DSEFVVEhUT0sgLSBVc2VyIGFjY3QgcGFzc3dvcmQgb3IgcGluIGNoYW5nZWQKICAtIDw8OiAqbWFjcm8tdXNlci1zZXNzaW9uCiAgICByZWNvcmRfdHlwZXM6IFVTRVJfQ0hBVVRIVE9LCiAgICBhY3Rpb246IGNoYW5nZWQtcGFzc3dvcmQKICAgIGVjczoKICAgICAgPDw6ICplY3MtaWFtCiAgICAgIHR5cGU6CiAgICAgICAgLSB1c2VyCiAgICAgICAgLSBjaGFuZ2UKICAjIEFVRElUX0dSUF9DSEFVVEhUT0sgLSBHcm91cCBhY2N0IHBhc3N3b3JkIG9yIHBpbiBjaGFuZ2VkCiAgLSA8PDogKm1hY3JvLXVzZXItc2Vzc2lvbgogICAgcmVjb3JkX3R5cGVzOiBHUlBfQ0hBVVRIVE9LCiAgICBhY3Rpb246IGNoYW5nZWQtZ3JvdXAtcGFzc3dvcmQKICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogYWNjdAogICAgICB3aGF0OiB1c2VyLXNlc3Npb24KICAgIGVjczoKICAgICAgPDw6ICplY3MtaWFtCiAgICAgIHR5cGU6CiAgICAgICAgLSBncm91cAogICAgICAgIC0gY2hhbmdlCgogICMgQXV0aGVudGljYXRpb24gcmVsYXRlZCBldmVudHMKCiAgIyBBVURJVF9DUkVEX0FDUSAtIFVzZXIgY3JlZGVudGlhbCBhY3F1aXJlZAogIC0gPDw6ICptYWNyby11c2VyLXNlc3Npb24KICAgIHJlY29yZF90eXBlczogQ1JFRF9BQ1EKICAgIGFjdGlvbjogYWNxdWlyZWQtY3JlZGVudGlhbHMKICAgIGVjczogKmVjcy1hdXRoCiAgIyBBVURJVF9DUkVEX0RJU1AgLSBVc2VyIGNyZWRlbnRpYWwgZGlzcG9zZWQKICAtIDw8OiAqbWFjcm8tdXNlci1zZXNzaW9uCiAgICByZWNvcmRfdHlwZXM6IENSRURfRElTUAogICAgYWN0aW9uOiBkaXNwb3NlZC1jcmVkZW50aWFscwogICAgZWNzOiAqZWNzLWF1dGgKICAjIEFVRElUX0NSRURfUkVGUiAtIFVzZXIgY3JlZGVudGlhbCByZWZyZXNoZWQKICAtIDw8OiAqbWFjcm8tdXNlci1zZXNzaW9uCiAgICByZWNvcmRfdHlwZXM6IENSRURfUkVGUgogICAgYWN0aW9uOiByZWZyZXNoZWQtY3JlZGVudGlhbHMKICAgIGVjczogKmVjcy1hdXRoCiAgIyBBVURJVF9HUlBfQVVUSCAtIEF1dGhlbnRpY2F0aW9uIGZvciBncm91cCBwYXNzd29yZAogIC0gcmVjb3JkX3R5cGVzOiBHUlBfQVVUSAogICAgYWN0aW9uOiBhdXRoZW50aWNhdGVkLXRvLWdyb3VwCiAgICBlY3M6ICplY3MtYXV0aAogICMgQVVESVRfTE9HSU4gLSBEZWZpbmUgdGhlIGxvZ2luIGlkIGFuZCBpbmZvcm1hdGlvbgogIC0gcmVjb3JkX3R5cGVzOiBMT0dJTgogICAgYWN0aW9uOiBjaGFuZ2VkLWxvZ2luLWlkLXRvCiAgICBzdWJqZWN0OgogICAgICBwcmltYXJ5OiBbb2xkX2F1aWQsIG9sZC1hdWlkXQogICAgICBzZWNvbmRhcnk6IHVpZAogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiBhdWlkCiAgICAgIHdoYXQ6IHVzZXItc2Vzc2lvbgogICAgZWNzOgogICAgICA8PDogKmVjcy1hdXRoCiAgICAgIHR5cGU6IHN0YXJ0CiAgIyBBVURJVF9VU0VSX0FDQ1QgLSBVc2VyIHN5c3RlbSBhY2Nlc3MgYXV0aG9yaXphdGlvbgogIC0gPDw6ICptYWNyby11c2VyLXNlc3Npb24KICAgIHJlY29yZF90eXBlczogVVNFUl9BQ0NUCiAgICBhY3Rpb246IHdhcy1hdXRob3JpemVkCiAgICBlY3M6ICplY3MtYXV0aAogICMgQVVESVRfVVNFUl9BVVRIIC0gVXNlciBzeXN0ZW0gYWNjZXNzIGF1dGhlbnRpY2F0aW9uCiAgLSA8PDogKm1hY3JvLXVzZXItc2Vzc2lvbgogICAgcmVjb3JkX3R5cGVzOiBVU0VSX0FVVEgKICAgIGFjdGlvbjogYXV0aGVudGljYXRlZAogICAgZWNzOiAqZWNzLWF1dGgKICAjIEFVRElUX1VTRVJfRU5EIC0gVXNlciBzZXNzaW9uIGVuZAogIC0gPDw6ICptYWNyby11c2VyLXNlc3Npb24KICAgIHJlY29yZF90eXBlczogVVNFUl9FTkQKICAgIGFjdGlvbjogZW5kZWQtc2Vzc2lvbgogICAgZWNzOiAqZWNzLWF1dGgKICAjIEFVRElUX1VTRVJfRVJSIC0gVXNlciBhY2N0IHN0YXRlIGVycm9yCiAgLSA8PDogKm1hY3JvLXVzZXItc2Vzc2lvbgogICAgcmVjb3JkX3R5cGVzOiBVU0VSX0VSUgogICAgYWN0aW9uOiBlcnJvcgogICAgc291cmNlX2lwOiBbYWRkcl0KICAgIGVjczogKmVjcy1hdXRoCiAgIyBBVURJVF9VU0VSX0xPR0lOIC0gVXNlciBoYXMgbG9nZ2VkIGluCiAgLSA8PDogKm1hY3JvLXVzZXItc2Vzc2lvbgogICAgcmVjb3JkX3R5cGVzOiBVU0VSX0xPR0lOCiAgICBhY3Rpb246IGxvZ2dlZC1pbgogICAgc291cmNlX2lwOiBbYWRkcl0KICAgIGVjczoKICAgICAgPDw6ICplY3MtYXV0aAogICAgICB0eXBlOiBzdGFydAogICMgQVVESVRfVVNFUl9MT0dPVVQgLSBVc2VyIGhhcyBsb2dnZWQgb3V0CiAgLSA8PDogKm1hY3JvLXVzZXItc2Vzc2lvbgogICAgcmVjb3JkX3R5cGVzOiBVU0VSX0xPR09VVAogICAgYWN0aW9uOiBsb2dnZWQtb3V0CiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWF1dGgKICAgICAgdHlwZTogZW5kCiAgIyBBVURJVF9VU0VSX1JPTEVfQ0hBTkdFIC0gVXNlciBjaGFuZ2VkIHRvIGEgbmV3IHJvbGUKICAtIDw8OiAqbWFjcm8tdXNlci1zZXNzaW9uCiAgICByZWNvcmRfdHlwZXM6IFVTRVJfUk9MRV9DSEFOR0UKICAgIGFjdGlvbjogY2hhbmdlZC1yb2xlLXRvCiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IHNlbGVjdGVkLWNvbnRleHQKICAgICAgd2hhdDogdXNlci1zZXNzaW9uCiAgIyBBVURJVF9VU0VSX1NUQVJUIC0gVXNlciBzZXNzaW9uIHN0YXJ0CiAgLSA8PDogKm1hY3JvLXVzZXItc2Vzc2lvbgogICAgcmVjb3JkX3R5cGVzOiBVU0VSX1NUQVJUCiAgICBhY3Rpb246IHN0YXJ0ZWQtc2Vzc2lvbgogICAgc291cmNlX2lwOiBbYWRkcl0KICAgIGVjczogKmVjcy1hdXRoCgogICMgSG9zdCB2aXJ0dWFsaXphdGlvbiBldmVudHMKCiAgIyBBVURJVF9WSVJUX0NPTlRST0wgLSBTdGFydCwgUGF1c2UsIFN0b3AgVk0KICAtIHJlY29yZF90eXBlczogVklSVF9DT05UUk9MCiAgICBhY3Rpb246IGlzc3VlZC12bS1jb250cm9sCiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IG9wCiAgICAgIHNlY29uZGFyeTogdm0KICAgICAgd2hhdDogdmlydHVhbC1tYWNoaW5lCiAgICBlY3M6ICplY3MtaG9zdAogICMgQVVESVRfVklSVF9DUkVBVEUgLSBDcmVhdGlvbiBvZiBndWVzdCBpbWFnZQogIC0gcmVjb3JkX3R5cGVzOiBWSVJUX0NSRUFURQogICAgYWN0aW9uOiBjcmVhdGVkLXZtLWltYWdlCiAgICBlY3M6ICplY3MtaG9zdAogICMgQVVESVRfVklSVF9ERVNUUk9ZIC0gRGVzdHJ1Y3Rpb24gb2YgZ3Vlc3QgaW1hZ2UKICAtIHJlY29yZF90eXBlczogVklSVF9ERVNUUk9ZCiAgICBhY3Rpb246IGRlbGV0ZWQtdm0taW1hZ2UKICAgIGVjczogKmVjcy1ob3N0CiAgIyBBVURJVF9WSVJUX0lOVEVHUklUWV9DSEVDSyAtIEd1ZXN0IGludGVncml0eSByZXN1bHRzCiAgLSByZWNvcmRfdHlwZXM6IFZJUlRfSU5URUdSSVRZX0NIRUNLCiAgICBhY3Rpb246IGNoZWNrZWQtaW50ZWdyaXR5LW9mCiAgICBlY3M6ICplY3MtaG9zdAogICMgQVVESVRfVklSVF9NQUNISU5FX0lEIC0gQmluZGluZyBvZiBsYWJlbCB0byBWTQogIC0gcmVjb3JkX3R5cGVzOiBWSVJUX01BQ0hJTkVfSUQKICAgIGFjdGlvbjogYXNzaWduZWQtdm0taWQKICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogdm0KICAgICAgd2hhdDogdmlydHVhbC1tYWNoaW5lCiAgICBlY3M6ICplY3MtaG9zdAogICMgQVVESVRfVklSVF9NSUdSQVRFX0lOIC0gSW5ib3VuZCBndWVzdCBtaWdyYXRpb24gaW5mbwogIC0gcmVjb3JkX3R5cGVzOiBWSVJUX01JR1JBVEVfSU4KICAgIGFjdGlvbjogbWlncmF0ZWQtdm0tZnJvbQogICAgZWNzOiAqZWNzLWhvc3QKICAjIEFVRElUX1ZJUlRfTUlHUkFURV9PVVQgLSBPdXRib3VuZCBndWVzdCBtaWdyYXRpb24gaW5mbwogIC0gcmVjb3JkX3R5cGVzOiBWSVJUX01JR1JBVEVfT1VUCiAgICBhY3Rpb246IG1pZ3JhdGVkLXZtLXRvCiAgICBlY3M6ICplY3MtaG9zdAogICMgQVVESVRfVklSVF9SRVNPVVJDRSAtIFJlc291cmNlIGFzc2lnbm1lbnQKICAtIHJlY29yZF90eXBlczogVklSVF9SRVNPVVJDRQogICAgYWN0aW9uOiBhc3NpZ25lZC12bS1yZXNvdXJjZQogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiByZXNyYwogICAgICBzZWNvbmRhcnk6IHZtCiAgICAgIHdoYXQ6IHZpcnR1YWwtbWFjaGluZQogICAgZWNzOiAqZWNzLWhvc3QKCiAgIyBVc2Vyc3BhY2UgcHJvY2VzcyBldmVudHMKCiAgIyBBVURJVF9DSEdSUF9JRCAtIFVzZXIgc3BhY2UgZ3JvdXAgSUQgY2hhbmdlZAogIC0gcmVjb3JkX3R5cGVzOiBDSEdSUF9JRAogICAgYWN0aW9uOiBjaGFuZ2VkLWdyb3VwCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLXByb2Nlc3MKICAgICAgdHlwZTogY2hhbmdlCiAgIyBBVURJVF9DSFVTRVJfSUQgLSBDaGFuZ2VkIHVzZXIgSUQgc3VwcGxlbWVudGFsIGRhdGEKICAtIHJlY29yZF90eXBlczogQ0hVU0VSX0lECiAgICBhY3Rpb246IGNoYW5nZWQtdXNlci1pZAogICAgZWNzOgogICAgICA8PDogKmVjcy1wcm9jZXNzCiAgICAgIHR5cGU6IGNoYW5nZQogICMgQVVESVRfVEVTVCAtIFVzZWQgZm9yIHRlc3Qgc3VjY2VzcyBtZXNzYWdlcwogIC0gcmVjb3JkX3R5cGVzOiBURVNUCiAgICBhY3Rpb246IHNlbnQtdGVzdAogICAgZWNzOiAqZWNzLXByb2Nlc3MKICAjIEFVRElUX1RSVVNURURfQVBQIC0gVHJ1c3RlZCBhcHAgbXNnIC0gZnJlZXN0eWxlIHRleHQKICAtIHJlY29yZF90eXBlczogVFJVU1RFRF9BUFAKICAgIGFjdGlvbjogdW5rbm93bgogICAgZWNzOiAqZWNzLXByb2Nlc3MKICAjIEFVRElUX1VTRVJfQ01EIC0gVXNlciBzaGVsbCBjb21tYW5kIGFuZCBhcmdzCiAgLSByZWNvcmRfdHlwZXM6IFVTRVJfQ01ECiAgICBhY3Rpb246IHJhbi1jb21tYW5kCiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IGNtZAogICAgICB3aGF0OiBwcm9jZXNzCiAgICBkZXNjcmlwdGlvbjogPgogICAgICBUaGVzZSBtZXNzYWdlcyBhcmUgZnJvbSB1c2VyLXNwYWNlIGFwcHMsIGxpa2Ugc3VkbywgdGhhdCBsb2cgY29tbWFuZHMKICAgICAgYmVpbmcgcnVuIGJ5IGEgdXNlci4gVGhlIHVpZCBjb250YWluZWQgaW4gdGhlc2UgbWVzc2FnZXMgaXMgdXNlcidzIFVJRCBhdAogICAgICB0aGUgdGltZSB0aGUgY29tbWFuZCB3YXMgcnVuLiBJdCBpcyBub3QgdGhlICJ0YXJnZXQiIFVJRCB1c2VkIHRvIHJ1biB0aGUKICAgICAgY29tbWFuZCwgd2hpY2ggaXMgbm9ybWFsbHkgcm9vdC4KICAgIGVjczoKICAgICAgPDw6ICplY3MtcHJvY2VzcwogICAgICB0eXBlOiBzdGFydAoKICAjIEhvc3QtbGV2ZWwgZXZlbnRzCgogICMgQVVESVRfU1lTVEVNX0JPT1QgLSBTeXN0ZW0gYm9vdAogIC0gcmVjb3JkX3R5cGVzOiBTWVNURU1fQk9PVAogICAgYWN0aW9uOiBib290ZWQtc3lzdGVtCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHN5c3RlbQogICAgZWNzOgogICAgICA8PDogKmVjcy1ob3N0CiAgICAgIHR5cGU6IHN0YXJ0CiAgIyBBVURJVF9TWVNURU1fUlVOTEVWRUwgLSBTeXN0ZW0gcnVubGV2ZWwgY2hhbmdlCiAgLSByZWNvcmRfdHlwZXM6IFNZU1RFTV9SVU5MRVZFTAogICAgYWN0aW9uOiBjaGFuZ2VkLXRvLXJ1bmxldmVsCiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IG5ldy1sZXZlbAogICAgICB3aGF0OiBzeXN0ZW0KICAgIGVjczoKICAgICAgPDw6ICplY3MtaG9zdAogICAgICB0eXBlOiBjaGFuZ2UKICAjIEFVRElUX1NZU1RFTV9TSFVURE9XTiAtIFN5c3RlbSBzaHV0ZG93bgogIC0gcmVjb3JkX3R5cGVzOiBTWVNURU1fU0hVVERPV04KICAgIGFjdGlvbjogc2h1dGRvd24tc3lzdGVtCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHN5c3RlbQogICAgZWNzOgogICAgICA8PDogKmVjcy1ob3N0CiAgICAgIHR5cGU6IGVuZAoKICAjIFNlcnZpY2UtbGV2ZWwgZXZlbnRzCgogICMgQVVESVRfU0VSVklDRV9TVEFSVCAtIFNlcnZpY2UgKGRhZW1vbikgc3RhcnQKICAtIHJlY29yZF90eXBlczogU0VSVklDRV9TVEFSVAogICAgYWN0aW9uOiBzdGFydGVkLXNlcnZpY2UKICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogdW5pdAogICAgICB3aGF0OiBzZXJ2aWNlCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLXByb2Nlc3MKICAgICAgdHlwZTogc3RhcnQKICAjIEFVRElUX1NFUlZJQ0VfU1RPUCAtIFNlcnZpY2UgKGRhZW1vbikgc3RvcAogIC0gcmVjb3JkX3R5cGVzOiBTRVJWSUNFX1NUT1AKICAgIGFjdGlvbjogc3RvcHBlZC1zZXJ2aWNlCiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IHVuaXQKICAgICAgd2hhdDogc2VydmljZQogICAgZWNzOgogICAgICA8PDogKmVjcy1wcm9jZXNzCiAgICAgIHR5cGU6IHN0b3AKCiAgIyBBdWRpdGQgaW50ZXJuYWwgZXZlbnRzCgogICMgQVVESVRfQ09ORklHX0NIQU5HRSAtIEF1ZGl0IHN5c3RlbSBjb25maWd1cmF0aW9uIGNoYW5nZQogIC0gcmVjb3JkX3R5cGVzOiBDT05GSUdfQ0hBTkdFCiAgICBhY3Rpb246IGNoYW5nZWQtYXVkaXQtY29uZmlndXJhdGlvbgogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OgogICAgICAgIFtvcCwga2V5LCBhdWRpdF9lbmFibGVkLCBhdWRpdF9waWQsIGF1ZGl0X2JhY2tsb2dfbGltaXQsIGF1ZGl0X2ZhaWx1cmVdCiAgICAgIHdoYXQ6IGF1ZGl0LWNvbmZpZwogICAgZWNzOgogICAgICBjYXRlZ29yeTogW3Byb2Nlc3MsIGNvbmZpZ3VyYXRpb25dCiAgICAgIHR5cGU6IGNoYW5nZQogICMgQVVESVRfREFFTU9OX0FCT1JUIC0gRGFlbW9uIGVycm9yIHN0b3AgcmVjb3JkCiAgLSByZWNvcmRfdHlwZXM6IERBRU1PTl9BQk9SVAogICAgYWN0aW9uOiBhYm9ydGVkLWF1ZGl0ZC1zdGFydHVwCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHNlcnZpY2UKICAgIGVjczoKICAgICAgPDw6ICplY3MtcHJvY2VzcwogICAgICB0eXBlOiBzdG9wCiAgIyBBVURJVF9EQUVNT05fQUNDRVBUIC0gQXVkaXRkIGFjY2VwdGVkIHJlbW90ZSBjb25uZWN0aW9uCiAgLSByZWNvcmRfdHlwZXM6IERBRU1PTl9BQ0NFUFQKICAgIGFjdGlvbjogcmVtb3RlLWF1ZGl0LWNvbm5lY3RlZAogICAgb2JqZWN0OgogICAgICB3aGF0OiBzZXJ2aWNlCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLW5ldHdvcmsKICAgICAgdHlwZToKICAgICAgICAtIGNvbm5lY3Rpb24KICAgICAgICAtIHN0YXJ0CiAgIyBBVURJVF9EQUVNT05fQ0xPU0UgLSBBdWRpdGQgY2xvc2VkIHJlbW90ZSBjb25uZWN0aW9uCiAgLSByZWNvcmRfdHlwZXM6IERBRU1PTl9DTE9TRQogICAgYWN0aW9uOiByZW1vdGUtYXVkaXQtZGlzY29ubmVjdGVkCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHNlcnZpY2UKICAgIGVjczoKICAgICAgPDw6ICplY3MtbmV0d29yawogICAgICB0eXBlOgogICAgICAgIC0gY29ubmVjdGlvbgogICAgICAgIC0gc3RhcnQKICAjIEFVRElUX0RBRU1PTl9DT05GSUcgLSBEYWVtb24gY29uZmlnIGNoYW5nZQogIC0gcmVjb3JkX3R5cGVzOiBEQUVNT05fQ09ORklHCiAgICBhY3Rpb246IGNoYW5nZWQtYXVkaXRkLWNvbmZpZ3VyYXRpb24KICAgIG9iamVjdDoKICAgICAgd2hhdDogc2VydmljZQogICAgZWNzOgogICAgICBjYXRlZ29yeTogW3Byb2Nlc3MsIGNvbmZpZ3VyYXRpb25dCiAgICAgIHR5cGU6IGNoYW5nZQogICMgQVVESVRfREFFTU9OX0VORCAtIERhZW1vbiBub3JtYWwgc3RvcCByZWNvcmQKICAtIHJlY29yZF90eXBlczogREFFTU9OX0VORAogICAgYWN0aW9uOiBzaHV0ZG93bi1hdWRpdAogICAgb2JqZWN0OgogICAgICB3aGF0OiBzZXJ2aWNlCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLXByb2Nlc3MKICAgICAgdHlwZTogc3RvcAogICMgQVVESVRfREFFTU9OX0VSUiAtIEF1ZGl0ZCBpbnRlcm5hbCBlcnJvcgogIC0gcmVjb3JkX3R5cGVzOiBEQUVNT05fRVJSCiAgICBhY3Rpb246IGF1ZGl0LWVycm9yCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHNlcnZpY2UKICAgIGVjczogKmVjcy1wcm9jZXNzCiAgIyBBVURJVF9EQUVNT05fUkVDT05GSUcgLSBBdWRpdGQgc2hvdWxkIHJlY29uZmlndXJlCiAgLSByZWNvcmRfdHlwZXM6IERBRU1PTl9SRUNPTkZJRwogICAgYWN0aW9uOiByZWNvbmZpZ3VyZWQtYXVkaXRkCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHNlcnZpY2UKICAgIGVjczoKICAgICAgY2F0ZWdvcnk6IFtwcm9jZXNzLCBjb25maWd1cmF0aW9uXQogICAgICB0eXBlOiBpbmZvCiAgIyBBVURJVF9EQUVNT05fUkVTVU1FIC0gQXVkaXRkIHNob3VsZCByZXN1bWUgbG9nZ2luZwogIC0gcmVjb3JkX3R5cGVzOiBEQUVNT05fUkVTVU1FCiAgICBhY3Rpb246IHJlc3VtZWQtYXVkaXQtbG9nZ2luZwogICAgb2JqZWN0OgogICAgICB3aGF0OiBzZXJ2aWNlCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLXByb2Nlc3MKICAgICAgdHlwZTogY2hhbmdlCiAgIyBBVURJVF9EQUVNT05fUk9UQVRFIC0gQXVkaXRkIHNob3VsZCByb3RhdGUgbG9ncwogIC0gcmVjb3JkX3R5cGVzOiBEQUVNT05fUk9UQVRFCiAgICBhY3Rpb246IHJvdGF0ZWQtYXVkaXQtbG9ncwogICAgb2JqZWN0OgogICAgICB3aGF0OiBzZXJ2aWNlCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLXByb2Nlc3MKICAgICAgdHlwZTogY2hhbmdlCiAgIyBBVURJVF9EQUVNT05fU1RBUlQgLSBEYWVtb24gc3RhcnR1cCByZWNvcmQKICAtIHJlY29yZF90eXBlczogREFFTU9OX1NUQVJUCiAgICBhY3Rpb246IHN0YXJ0ZWQtYXVkaXQKICAgIG9iamVjdDoKICAgICAgd2hhdDogc2VydmljZQogICAgZWNzOgogICAgICA8PDogKmVjcy1wcm9jZXNzCiAgICAgIHR5cGU6IHN0YXJ0CiAgIyBBVURJVF9LRVJORUwgLSBBc3luY2hyb25vdXMgYXVkaXQgcmVjb3JkLiBOT1QgQSBSRVFVRVNULgogIC0gcmVjb3JkX3R5cGVzOiBLRVJORUwKICAgIGFjdGlvbjogaW5pdGlhbGl6ZWQtYXVkaXQtc3Vic3lzdGVtCiAgICBlY3M6ICplY3MtcHJvY2VzcwoKICAjIENvbmZpZ3VyYXRpb24gY2hhbmdlIGV2ZW50cwoKICAjIEFVRElUX1VTWVNfQ09ORklHIC0gVXNlciBzcGFjZSBzeXN0ZW0gY29uZmlnIGNoYW5nZQogIC0gcmVjb3JkX3R5cGVzOiBVU1lTX0NPTkZJRwogICAgYWN0aW9uOiBjaGFuZ2VkLWNvbmZpZ3VyYXRpb24KICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogb3AKICAgICAgd2hhdDogc3lzdGVtCiAgICBlY3M6CiAgICAgIGNhdGVnb3J5OiBjb25maWd1cmF0aW9uCiAgICAgIHR5cGU6IGNoYW5nZQogICMgQVVESVRfTkVURklMVEVSX0NGRyAtIE5ldGZpbHRlciBjaGFpbiBtb2RpZmljYXRpb25zCiAgLSByZWNvcmRfdHlwZXM6IE5FVEZJTFRFUl9DRkcKICAgIGFjdGlvbjogbG9hZGVkLWZpcmV3YWxsLXJ1bGUtdG8KICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogdGFibGUKICAgICAgd2hhdDogZmlyZXdhbGwKICAgIGVjczoKICAgICAgY2F0ZWdvcnk6IGNvbmZpZ3VyYXRpb24KICAgICAgdHlwZTogY2hhbmdlCiAgIyBBVURJVF9GRUFUVVJFX0NIQU5HRSAtIGF1ZGl0IGxvZyBsaXN0aW5nIGZlYXR1cmUgY2hhbmdlcwogIC0gcmVjb3JkX3R5cGVzOiBGRUFUVVJFX0NIQU5HRQogICAgYWN0aW9uOiBjaGFuZ2VkLWF1ZGl0LWZlYXR1cmUKICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogZmVhdHVyZQogICAgICB3aGF0OiBzeXN0ZW0KICAgIGVjczoKICAgICAgY2F0ZWdvcnk6IGNvbmZpZ3VyYXRpb24KICAgICAgdHlwZTogY2hhbmdlCiAgIyBBVURJVF9SRVBMQUNFIC0gUmVwbGFjZSBhdWRpdGQgaWYgdGhpcyBwYWNrZXQgdW5hbnN3ZXJkCgogICMgVFRZIGV2ZW50cwoKICAtIHJlY29yZF90eXBlczoKICAgICAgIyBBVURJVF9UVFkgLSBJbnB1dCBvbiBhbiBhZG1pbmlzdHJhdGl2ZSBUVFkKICAgICAgLSBUVFkKICAgICAgIyBBVURJVF9VU0VSX1RUWSAtIE5vbi1JQ0FOT04gVFRZIGlucHV0IG1lYW5pbmcKICAgICAgLSBVU0VSX1RUWQogICAgYWN0aW9uOiB0eXBlZAogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiBkYXRhCiAgICAgIHdoYXQ6IGtleXN0cm9rZXMKICAgIGhvdzogW2NvbW0sIGV4ZV0KCiAgIyBQb2xpY3kgZXZlbnRzCgogICMgQVVESVRfQVZDIC0gU0UgTGludXggYXZjIGRlbmlhbCBvciBncmFudCAoc2VsaW51eCkKICAtIHJlY29yZF90eXBlczogQVZDCiAgICBhY3Rpb246IHZpb2xhdGVkLXNlbGludXgtcG9saWN5CiAgICBzdWJqZWN0OgogICAgICBwcmltYXJ5OiBzY29udGV4dAogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiB0Y29udGV4dAogICAgICBzZWNvbmRhcnk6IHRjbGFzcwogICAgaGFzX2ZpZWxkczoKICAgICAgLSBzZXJlc3VsdAogICMgQVVESVRfQVZDIC0gU0UgTGludXggYXZjIGRlbmlhbCBvciBncmFudCAoYXBwYXJtb3IpCiAgLSByZWNvcmRfdHlwZXM6IEFWQwogICAgYWN0aW9uOiB2aW9sYXRlZC1hcHBhcm1vci1wb2xpY3kKICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogb3BlcmF0aW9uCiAgICAgIHNlY29uZGFyeTogW3JlcXVlc3RlZF9tYXNrLCBkZW5pZWRfbWFzaywgY2FwbmFtZV0KICAgICAgd2hhdDogcG9saWN5CiAgICBoYXNfZmllbGRzOgogICAgICAtIGFwcGFybW9yCiAgIyBBVURJVF9GU19SRUxBQkVMIC0gRmlsZXN5c3RlbSByZWxhYmVsZWQKICAtIHJlY29yZF90eXBlczogRlNfUkVMQUJFTAogICAgYWN0aW9uOiByZWxhYmVsZWQtZmlsZXN5c3RlbQogICAgb2JqZWN0OgogICAgICB3aGF0OiBtYWMtY29uZmlnCiAgIyBBVURJVF9MQUJFTF9MRVZFTF9DSEFOR0UgLSBPYmplY3QncyBsZXZlbCB3YXMgY2hhbmdlZAogIC0gcmVjb3JkX3R5cGVzOiBMQUJFTF9MRVZFTF9DSEFOR0UKICAgIGFjdGlvbjogbW9kaWZpZWQtbGV2ZWwtb2YKICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogcHJpbnRlcgogICAgICB3aGF0OiBwcmludGVyCiAgIyBBVURJVF9MQUJFTF9PVkVSUklERSAtIEFkbWluIGlzIG92ZXJyaWRpbmcgYSBsYWJlbAogIC0gcmVjb3JkX3R5cGVzOiBMQUJFTF9PVkVSUklERQogICAgYWN0aW9uOiBvdmVycm9kZS1sYWJlbC1vZgogICAgb2JqZWN0OgogICAgICB3aGF0OiBtYWMtY29uZmlnCiAgIyBBVURJVF9NQUNfQ0hFQ0sgLSBVc2VyIHNwYWNlIE1BQyBkZWNpc2lvbiByZXN1bHRzCiAgLSByZWNvcmRfdHlwZXM6IE1BQ19DSEVDSwogICAgYWN0aW9uOiBtYWMtcGVybWlzc2lvbgogICMgQVVESVRfTUFDX0NPTkZJR19DSEFOR0UgLSBDaGFuZ2VzIHRvIGJvb2xlYW5zCiAgLSByZWNvcmRfdHlwZXM6IE1BQ19DT05GSUdfQ0hBTkdFCiAgICBhY3Rpb246IGNoYW5nZWQtc2VsaW51eC1ib29sZWFuCiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IGJvb2wKICAgICAgd2hhdDogbWFjLWNvbmZpZwogICAgZWNzOgogICAgICBjYXRlZ29yeTogY29uZmlndXJhdGlvbgogICAgICB0eXBlOiBjaGFuZ2UKICAjIEFVRElUX01BQ19QT0xJQ1lfTE9BRCAtIFBvbGljeSBmaWxlIGxvYWQKICAtIHJlY29yZF90eXBlczogTUFDX1BPTElDWV9MT0FECiAgICBhY3Rpb246IGxvYWRlZC1zZWxpbnV4LXBvbGljeQogICAgb2JqZWN0OgogICAgICB3aGF0OiBtYWMtY29uZmlnCiAgICBlY3M6CiAgICAgIGNhdGVnb3J5OiBjb25maWd1cmF0aW9uCiAgICAgIHR5cGU6IGFjY2VzcwogICMgQVVESVRfTUFDX1NUQVRVUyAtIENoYW5nZWQgZW5mb3JjaW5nLHBlcm1pc3NpdmUsb2ZmCiAgLSByZWNvcmRfdHlwZXM6IE1BQ19TVEFUVVMKICAgIGFjdGlvbjogY2hhbmdlZC1zZWxpbnV4LWVuZm9yY2VtZW50CiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IGVuZm9yY2luZwogICAgICB3aGF0OiBtYWMtY29uZmlnCiAgICBlY3M6CiAgICAgIGNhdGVnb3J5OiBjb25maWd1cmF0aW9uCiAgICAgIHR5cGU6IGNoYW5nZQogICMgQVVESVRfVVNFUl9BVkMgLSBVc2VyIHNwYWNlIGF2YyBtZXNzYWdlCiAgLSByZWNvcmRfdHlwZXM6IFVTRVJfQVZDCiAgICBhY3Rpb246IGFjY2Vzcy1wZXJtaXNzaW9uCiAgIyBBVURJVF9VU0VSX01BQ19DT05GSUdfQ0hBTkdFIC0gQ2hhbmdlIG1hZGUgdG8gTUFDIHBvbGljeQogIC0gcmVjb3JkX3R5cGVzOiBVU0VSX01BQ19DT05GSUdfQ0hBTkdFCiAgICBhY3Rpb246IGNoYW5nZWQtbWFjLWNvbmZpZ3VyYXRpb24KICAgIG9iamVjdDoKICAgICAgd2hhdDogbWFjLWNvbmZpZwogICAgZWNzOgogICAgICBjYXRlZ29yeTogY29uZmlndXJhdGlvbgogICAgICB0eXBlOiBjaGFuZ2UKICAjIEFVRElUX1VTRVJfTUFDX1BPTElDWV9MT0FEIC0gVXNlcnNwYyBkYWVtb24gbG9hZGVkIHBvbGljCiAgLSByZWNvcmRfdHlwZXM6IFVTRVJfTUFDX1BPTElDWV9MT0FECiAgICBhY3Rpb246IGxvYWRlZC1tYWMtcG9saWN5CiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IG1hYy1jb25maWcKICAgIGVjczoKICAgICAgY2F0ZWdvcnk6IGNvbmZpZ3VyYXRpb24KICAgICAgdHlwZTogYWNjZXNzCiAgIyBBVURJVF9VU0VSX1NFTElOVVhfRVJSIC0gU0UgTGludXggdXNlciBzcGFjZSBlcnJvcgogIC0gcmVjb3JkX3R5cGVzOiBVU0VSX1NFTElOVVhfRVJSCiAgICBhY3Rpb246IGFjY2Vzcy1lcnJvcgogICMgQVVESVRfU0VDQ09NUCAtIFNlY3VyZSBDb21wdXRpbmcgZXZlbnQKICAtIHJlY29yZF90eXBlczogU0VDQ09NUAogICAgYWN0aW9uOiB2aW9sYXRlZC1zZWNjb21wLXBvbGljeQogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiBzeXNjYWxsCiAgICAgIHdoYXQ6IHByb2Nlc3MKICAjIEFVRElUX1NFTElOVVhfRVJSIC0gSW50ZXJuYWwgU0UgTGludXggRXJyb3JzCiAgLSBhY3Rpb246IGNhdXNlZC1tYWMtcG9saWN5LWVycm9yCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHN5c3RlbQogICAgcmVjb3JkX3R5cGVzOiBTRUxJTlVYX0VSUgogICMgQVVESVRfQVBQQVJNT1JfQUxMT1dFRAogICMgQVVESVRfQVBQQVJNT1JfREVOSUVECiAgIyBBVURJVF9BUFBBUk1PUl9FUlJPUgogICMgQVVESVRfQVZDX1BBVEggLSBkZW50cnksIHZmc21vdW50IHBhaXIgZnJvbSBhdmMKICAjIEFVRElUX0FQUEFSTU9SX0FVRElUCiAgIyBBVURJVF9BUFBBUk1PUl9ISU5UCiAgIyBBVURJVF9BUFBBUk1PUl9TVEFUVVMKICAjIEFVRElUX0FQUEFSTU9SX0VSUk9SCiAgIyBBVURJVF9ERVZfQUxMT0MgLSBEZXZpY2Ugd2FzIGFsbG9jYXRlZAogICMgQVVESVRfREVWX0RFQUxMT0MgLSBEZXZpY2Ugd2FzIGRlYWxsb2NhdGVkCiAgIyBBVURJVF9NQUNfVU5MQkxfQUxMT1cgLSBOZXRMYWJlbDogYWxsb3cgdW5sYWJlbGVkIHRyYWZmaWMKICAjIEFVRElUX01BQ19DSVBTT1Y0X0FERCAtIE5ldExhYmVsOiBhZGQgQ0lQU092NCBET0kgZW50cnkKICAjIEFVRElUX01BQ19DSVBTT1Y0X0RFTCAtIE5ldExhYmVsOiBkZWwgQ0lQU092NCBET0kgZW50cnkKICAjIEFVRElUX01BQ19NQVBfQUREIC0gTmV0TGFiZWw6IGFkZCBMU00gZG9tYWluIG1hcHBpbmcKICAjIEFVRElUX01BQ19NQVBfREVMIC0gTmV0TGFiZWw6IGRlbCBMU00gZG9tYWluIG1hcHBpbmcKICAjIEFVRElUX01BQ19JUFNFQ19FVkVOVCAtIEF1ZGl0IGFuIElQU2VjIGV2ZW50CiAgIyBBVURJVF9NQUNfVU5MQkxfU1RDQUREIC0gTmV0TGFiZWw6IGFkZCBhIHN0YXRpYyBsYWJlbAogICMgQVVESVRfTUFDX1VOTEJMX1NUQ0RFTCAtIE5ldExhYmVsOiBkZWwgYSBzdGF0aWMgbGFiZWwKICAjIEFVRElUX01BQ19DQUxJUFNPX0FERCAtIE5ldExhYmVsOiBhZGQgQ0FMSVBTTyBET0kgZW50cnkKICAjIEFVRElUX01BQ19DQUxJUFNPX0RFTCAtIE5ldExhYmVsOiBkZWwgQ0FMSVBTTyBET0kgZW50cnkKICAjIEFVRElUX1VTRVJfTEFCRUxFRF9FWFBPUlQgLSBPYmplY3QgZXhwb3J0ZWQgd2l0aCBsYWJlbAogICMgQVVESVRfVVNFUl9VTkxBQkVMRURfRVhQT1JUIC0gT2JqZWN0IGV4cG9ydGVkIHdpdGhvdXQgbGFiZWwKCiAgIyBDcnlwdG8gZXZlbnRzCgogIC0gPDw6ICptYWNyby11c2VyLXNlc3Npb24KICAgIGFjdGlvbjogbmVnb3RpYXRlZC1jcnlwdG8ta2V5CiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IGZwCiAgICAgIHNlY29uZGFyeTogW2FkZHIsIGhvc3RuYW1lXQogICAgICB3aGF0OiB1c2VyLXNlc3Npb24KICAgIHJlY29yZF90eXBlczogQ1JZUFRPX0tFWV9VU0VSCiAgICBzb3VyY2VfaXA6IFthZGRyXQogICAgZWNzOiAqZWNzLXByb2Nlc3MKICAtIGFjdGlvbjogY3J5cHRvLW9mZmljZXItbG9nZ2VkLWluCiAgICByZWNvcmRfdHlwZXM6IENSWVBUT19MT0dJTgogIC0gYWN0aW9uOiBjcnlwdG8tb2ZmaWNlci1sb2dnZWQtb3V0CiAgICByZWNvcmRfdHlwZXM6IENSWVBUT19MT0dPVVQKICAgIGVjczogKmVjcy1wcm9jZXNzCiAgLSA8PDogKm1hY3JvLXVzZXItc2Vzc2lvbgogICAgYWN0aW9uOiBzdGFydGVkLWNyeXB0by1zZXNzaW9uCiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IGFkZHIKICAgICAgc2Vjb25kYXJ5OiBbcnBvcnRdCiAgICByZWNvcmRfdHlwZXM6IENSWVBUT19TRVNTSU9OCiAgICBzb3VyY2VfaXA6IFthZGRyXQogICAgZWNzOiAqZWNzLXByb2Nlc3MKICAtIGFjdGlvbjogYWNjZXNzLXJlc3VsdAogICAgcmVjb3JkX3R5cGVzOiBEQUNfQ0hFQ0sKCiAgIyBBbm9tYWxpZXMKCiAgIyBBVURJVF9BTk9NX0FCRU5EIC0gUHJvY2VzcyBlbmRlZCBhYm5vcm1hbGx5CiAgLSByZWNvcmRfdHlwZXM6IEFOT01fQUJFTkQKICAgIGFjdGlvbjogY3Jhc2hlZC1wcm9ncmFtCiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IFtjb21tLCBleGVdCiAgICAgIHNlY29uZGFyeTogcGlkCiAgICAgIHdoYXQ6IHByb2Nlc3MKICAgIGhvdzogc2lnCiAgICBlY3M6CiAgICAgICMgY29uc2lkZXIgYWRkaW5nIGFuIGFub21hbHkgY2F0ZWdvcnkgd2hlbiB3ZSBpbnRyb2R1Y2UKICAgICAgIyB0byBFQ1MKICAgICAgPDw6ICplY3MtcHJvY2VzcwogICAgICB0eXBlOiBlbmQKICAjIEFVRElUX0FOT01fRVhFQyAtIEV4ZWN1dGlvbiBvZiBmaWxlCiAgLSByZWNvcmRfdHlwZXM6IEFOT01fRVhFQwogICAgYWN0aW9uOiBhdHRlbXB0ZWQtZXhlY3V0aW9uLW9mLWZvcmJpZGRlbi1wcm9ncmFtCiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IGNtZAogICAgICB3aGF0OiBwcm9jZXNzCiAgICBob3c6IHRlcm1pbmFsCiAgICBlY3M6CiAgICAgICMgY29uc2lkZXIgYWRkaW5nIGFuIGFub21hbHkgY2F0ZWdvcnkgd2hlbiB3ZSBpbnRyb2R1Y2UKICAgICAgIyB0byBFQ1MKICAgICAgPDw6ICplY3MtcHJvY2VzcwogICAgICB0eXBlOiBzdGFydAogICMgQVVESVRfQU5PTV9MSU5LIC0gU3VzcGljaW91cyB1c2Ugb2YgZmlsZSBsaW5rcwogIC0gcmVjb3JkX3R5cGVzOiBBTk9NX0xJTksKICAgIGFjdGlvbjogdXNlZC1zdXNwaWNpb3VzLWxpbmsKICAjIEFVRElUX0FOT01fTE9HSU5fRkFJTFVSRVMgLSBGYWlsZWQgbG9naW4gbGltaXQgcmVhY2hlZAogIC0gPDw6ICptYWNyby11c2VyLXNlc3Npb24KICAgIHJlY29yZF90eXBlczogQU5PTV9MT0dJTl9GQUlMVVJFUwogICAgYWN0aW9uOiBmYWlsZWQtbG9nLWluLXRvby1tYW55LXRpbWVzLXRvCiAgIyBBVURJVF9BTk9NX0xPR0lOX0xPQ0FUSU9OIC0gTG9naW4gZnJvbSBmb3JiaWRkZW4gbG9jYXRpb24KICAtIDw8OiAqbWFjcm8tdXNlci1zZXNzaW9uCiAgICByZWNvcmRfdHlwZXM6IEFOT01fTE9HSU5fTE9DQVRJT04KICAgIGFjdGlvbjogYXR0ZW1wdGVkLWxvZy1pbi1mcm9tLXVudXN1YWwtcGxhY2UtdG8KICAjIEFVRElUX0FOT01fTE9HSU5fU0VTU0lPTlMgLSBNYXggY29uY3VycmVudCBzZXNzaW9ucyByZWFjaGVkCiAgLSA8PDogKm1hY3JvLXVzZXItc2Vzc2lvbgogICAgcmVjb3JkX3R5cGVzOiBBTk9NX0xPR0lOX1NFU1NJT05TCiAgICBhY3Rpb246IG9wZW5lZC10b28tbWFueS1zZXNzaW9ucy10bwogICMgQVVESVRfQU5PTV9MT0dJTl9USU1FIC0gTG9naW4gYXR0ZW1wdGVkIGF0IGJhZCB0aW1lCiAgLSA8PDogKm1hY3JvLXVzZXItc2Vzc2lvbgogICAgcmVjb3JkX3R5cGVzOiBBTk9NX0xPR0lOX1RJTUUKICAgIGFjdGlvbjogYXR0ZW1wdGVkLWxvZy1pbi1kdXJpbmctdW51c3VhbC1ob3VyLXRvCiAgIyBBVURJVF9BTk9NX1BST01JU0NVT1VTIC0gRGV2aWNlIGNoYW5nZWQgcHJvbWlzY3VvdXMgbW9kZQogIC0gcmVjb3JkX3R5cGVzOiBBTk9NX1BST01JU0NVT1VTCiAgICBhY3Rpb246IGNoYW5nZWQtcHJvbWlzY3VvdXMtbW9kZS1vbi1kZXZpY2UgIyBDb3VsZCBiZSBlbnRlcmVkIG9yIGV4aXRlZCBiYXNlZCBvbiBwcm9tIGZpZWxkLgogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiBkZXYKICAgICAgd2hhdDogbmV0d29yay1kZXZpY2UKICAjIEFVRElUX0FOT01fUkJBQ19JTlRFR1JJVFlfRkFJTCAtIFJCQUMgZmlsZSBpbnRlZ3JpdHkgZmFpbHVyZQogIC0gcmVjb3JkX3R5cGVzOiBBTk9NX1JCQUNfSU5URUdSSVRZX0ZBSUwKICAgIGFjdGlvbjogdGVzdGVkLWZpbGUtc3lzdGVtLWludGVncml0eS1vZgogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiBob3N0bmFtZQogICAgICB3aGF0OiBmaWxlc3lzdGVtCiAgIyBBVURJVF9BTk9NX0xPR0lOX0FDQ1QgLSBMb2dpbiBhdHRlbXB0ZWQgdG8gd2F0Y2hlZCBhY2N0CiAgIyBBVURJVF9BTk9NX01BWF9EQUMgLSBNYXggREFDIGZhaWx1cmVzIHJlYWNoZWQKICAjIEFVRElUX0FOT01fTUFYX01BQyAtIE1heCBNQUMgZmFpbHVyZXMgcmVhY2hlZAogICMgQVVESVRfQU5PTV9BTVRVX0ZBSUwgLSBBTVRVIGZhaWx1cmUKICAjIEFVRElUX0FOT01fUkJBQ19GQUlMIC0gUkJBQyBzZWxmIHRlc3QgZmFpbHVyZQogICMgQVVESVRfQU5PTV9DUllQVE9fRkFJTCAtIENyeXB0byBzeXN0ZW0gdGVzdCBmYWlsdXJlCiAgIyBBVURJVF9BTk9NX01LX0VYRSAtIE1ha2UgYW4gZXhlY3V0YWJsZQogICMgQVVESVRfQU5PTV9BQ0NFU1NfRlMgLSBBY2Nlc3Mgb2YgZmlsZSBvciBkaXIKICAjIEFVRElUX0FOT01fQUREX0FDQ1QgLSBBZGRpbmcgYW4gYWNjdAogICMgQVVESVRfQU5PTV9ERUxfQUNDVCAtIERlbGV0aW5nIGFuIGFjY3QKICAjIEFVRElUX0FOT01fTU9EX0FDQ1QgLSBDaGFuZ2luZyBhbiBhY2N0CiAgIyBBVURJVF9BTk9NX1JPT1RfVFJBTlMgLSBVc2VyIGJlY2FtZSByb290CiAgIyBBVURJVF9BTk9NX0xPR0lOX1NFUlZJQ0UgLSBTZXJ2aWNlIGFjY3QgYXR0ZW1wdGVkIGxvZ2luCgogICMgQW5vbWFseSByZXNwb25zZXMKCiAgIyBBVURJVF9SRVNQX0FOT01BTFkgLSBBbm9tYWx5IG5vdCByZWFjdGVkIHRvCiAgIyBBVURJVF9SRVNQX0FMRVJUIC0gQWxlcnQgZW1haWwgd2FzIHNlbnQKICAjIEFVRElUX1JFU1BfS0lMTF9QUk9DIC0gS2lsbCBwcm9ncmFtCiAgIyBBVURJVF9SRVNQX1RFUk1fQUNDRVNTIC0gVGVybWluYXRlIHNlc3Npb24KICAjIEFVRElUX1JFU1BfQUNDVF9SRU1PVEUgLSBBY2N0IGxvY2tlZCBmcm9tIHJlbW90ZSBhY2Nlc3MKICAjIEFVRElUX1JFU1BfQUNDVF9MT0NLX1RJTUVEIC0gVXNlciBhY2N0IGxvY2tlZCBmb3IgdGltZQogICMgQVVESVRfUkVTUF9BQ0NUX1VOTE9DS19USU1FRCAtIFVzZXIgYWNjdCB1bmxvY2tlZCBmcm9tIHRpbWUKICAjIEFVRElUX1JFU1BfQUNDVF9MT0NLIC0gVXNlciBhY2N0IHdhcyBsb2NrZWQKICAjIEFVRElUX1JFU1BfVEVSTV9MT0NLIC0gVGVybWluYWwgd2FzIGxvY2tlZAogICMgQVVESVRfUkVTUF9TRUJPT0wgLSBTZXQgYW4gU0UgTGludXggYm9vbGVhbgogICMgQVVESVRfUkVTUF9FWEVDIC0gRXhlY3V0ZSBhIHNjcmlwdAogICMgQVVESVRfUkVTUF9TSU5HTEUgLSBHbyB0byBzaW5nbGUgdXNlciBtb2RlCiAgIyBBVURJVF9SRVNQX0hBTFQgLSB0YWtlIHRoZSBzeXN0ZW0gZG93bgogICMgQVVESVRfUkVTUF9PUklHSU5fQkxPQ0sgLSBBZGRyZXNzIGJsb2NrZWQgYnkgaXB0YWJsZXMKICAjIEFVRElUX1JFU1BfT1JJR0lOX0JMT0NLX1RJTUVEIC0gQWRkcmVzcyBibG9ja2VkIGZvciB0aW1lCgogICMgQXVkaXQgcnVsZSBldmVudHMKCiAgIyBBVURJVF9TWVNDQUxMIC0gU3lzY2FsbCBldmVudAogICMgQVVESVRfUEFUSCAtIEZpbGVuYW1lIHBhdGggaW5mb3JtYXRpb24KICAjIEFVRElUX0lQQyAtIElQQyByZWNvcmQKICAjIEFVRElUX1NPQ0tFVENBTEwgLSBzeXNfc29ja2V0Y2FsbCBhcmd1bWVudHMKICAjIEFVRElUX1NPQ0tBRERSIC0gc29ja2FkZHIgY29waWVkIGFzIHN5c2NhbGwgYXJnCiAgIyBBVURJVF9DV0QgLSBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5CiAgIyBBVURJVF9FWEVDVkUgLSBleGVjdmUgYXJndW1lbnRzCiAgIyBBVURJVF9JUENfU0VUX1BFUk0gLSBJUEMgbmV3IHBlcm1pc3Npb25zIHJlY29yZCB0eXBlCiAgIyBBVURJVF9NUV9PUEVOIC0gUE9TSVggTVEgb3BlbiByZWNvcmQgdHlwZQogICMgQVVESVRfTVFfU0VORFJFQ1YtIFBPU0lYIE1RIHNlbmQvcmVjZWl2ZSByZWNvcmQgdHlwZQogICMgQVVESVRfTVFfTk9USUZZIC0gUE9TSVggTVEgbm90aWZ5IHJlY29yZCB0eXBlCiAgIyBBVURJVF9NUV9HRVRTRVRBVFRSIC0gUE9TSVggTVEgZ2V0L3NldCBhdHRyaWJ1dGUgcmVjb3JkIHR5cGUKICAjIEFVRElUX0ZEX1BBSVIgLSBhdWRpdCByZWNvcmQgZm9yIHBpcGUvc29ja2V0cGFpcgogICMgQVVESVRfT0JKX1BJRCAtIHB0cmFjZSB0YXJnZXQKICAjIEFVRElUX0JQUk1fRkNBUFMgLSBJbmZvcm1hdGlvbiBhYm91dCBmY2FwcyBpbmNyZWFzaW5nIHBlcm1zCiAgIyBBVURJVF9DQVBTRVQgLSBSZWNvcmQgc2hvd2luZyBhcmd1bWVudCB0byBzeXNfY2Fwc2V0CiAgIyBBVURJVF9NTUFQIC0gUmVjb3JkIHNob3dpbmcgZGVzY3JpcHRvciBhbmQgZmxhZ3MgaW4gbW1hcAogICMgQVVESVRfTkVURklMVEVSX1BLVCAtIFBhY2tldHMgdHJhdmVyc2luZyBuZXRmaWx0ZXIgY2hhaW5zCgogICMgSW50ZWdyaXR5IGNoZWNrcwoKICAjIEFVRElUX0lOVEVHUklUWV9EQVRBIC0gRGF0YSBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uCiAgIyBBVURJVF9JTlRFR1JJVFlfTUVUQURBVEEgLSBNZXRhZGF0YSBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uCiAgIyBBVURJVF9JTlRFR1JJVFlfU1RBVFVTIC0gSW50ZWdyaXR5IGVuYWJsZSBzdGF0dXMKICAjIEFVRElUX0lOVEVHUklUWV9IQVNIIC0gSW50ZWdyaXR5IEhBU0ggdHlwZQogICMgQVVESVRfSU5URUdSSVRZX1BDUiAtIFBDUiBpbnZhbGlkYXRpb24gbXNncwogICMgQVVESVRfSU5URUdSSVRZX1JVTEUgLSBQb2xpY3kgcnVsZQoKICAjIFZhcmlvdXMKCiAgIyBBVURJVF9VU0VSIC0gTWVzc2FnZSBmcm9tIHVzZXJzcGFjZSAtLSBkZXByZWNhdGVkCiAgLSByZWNvcmRfdHlwZXM6IFVTRVIKICAgIGFjdGlvbjogc2VudC1tZXNzYWdlCiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IGFkZHIK")
+		value, _ = base64.StdEncoding.DecodeString("LS0tCiMgTWFjcm9zIGRlY2xhcmVzIHNvbWUgWUFNTCBhbmNob3JzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZm9yIHNvbWUgY29tbW9uCiMgb2JqZWN0IHR5cGUgbm9ybWFsaXphdGlvbnMgbGlrZSB1c2VyLXNlc3Npb24sIHNvY2tldCwgb3IgcHJvY2Vzcy4KbWFjcm9zOgogIC0gJmRlZmF1bHRzCiAgICBzdWJqZWN0OgogICAgICBwcmltYXJ5OiBhdWlkCiAgICAgIHNlY29uZGFyeTogdWlkCiAgICBob3c6IFtleGUsIGNvbW1dCgogIC0gJm1hY3JvLXVzZXItc2Vzc2lvbgogICAgc3ViamVjdDoKICAgICAgcHJpbWFyeTogYXVpZAogICAgICBzZWNvbmRhcnk6IFthY2N0LCBpZCwgdWlkXQogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiB0ZXJtaW5hbAogICAgICBzZWNvbmRhcnk6IFthZGRyLCBob3N0bmFtZV0KICAgICAgd2hhdDogdXNlci1zZXNzaW9uCiAgICBob3c6IFtleGUsIHRlcm1pbmFsXQoKICAtICZtYWNyby1zb2NrZXQKICAgIDw8OiAqZGVmYXVsdHMKICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogW2FkZHIsIHBhdGhdCiAgICAgIHNlY29uZGFyeTogcG9ydAogICAgICB3aGF0OiBzb2NrZXQKCiAgLSAmbWFjcm8tcHJvY2VzcwogICAgPDw6ICpkZWZhdWx0cwogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiBbY21kLCBleGUsIGNvbW1dCiAgICAgIHNlY29uZGFyeTogcGlkCiAgICAgIHdoYXQ6IHByb2Nlc3MKICAgIGhvdzogdGVybWluYWwKCiAgLSAmZWNzLWlhbQogICAgY2F0ZWdvcnk6IGlhbQogICAgdHlwZTogaW5mbwoKICAtICZlY3MtYXV0aAogICAgY2F0ZWdvcnk6IGF1dGhlbnRpY2F0aW9uCiAgICB0eXBlOiBpbmZvCiAgICBtYXBwaW5nczoKICAgICAgLSBmcm9tOiBzdWJqZWN0LnByaW1hcnkKICAgICAgICB0bzogdXNlcgogICAgICAtIGZyb206IHN1YmplY3Quc2Vjb25kYXJ5CiAgICAgICAgdG86IHVzZXIuZWZmZWN0aXZlCgogIC0gJmVjcy1zZXNzaW9uCiAgICBjYXRlZ29yeTogc2Vzc2lvbgogICAgdHlwZTogaW5mbwogICAgbWFwcGluZ3M6CiAgICAgIC0gZnJvbTogc3ViamVjdC5wcmltYXJ5CiAgICAgICAgdG86IHVzZXIKICAgICAgLSBmcm9tOiBzdWJqZWN0LnNlY29uZGFyeQogICAgICAgIHRvOiB1c2VyLmVmZmVjdGl2ZQoKICAtICZlY3MtaG9zdAogICAgY2F0ZWdvcnk6IGhvc3QKICAgIHR5cGU6IGluZm8KCiAgLSAmZWNzLXByb2Nlc3MKICAgIGNhdGVnb3J5OiBwcm9jZXNzCiAgICB0eXBlOiBpbmZvCgogIC0gJmVjcy1maWxlCiAgICBjYXRlZ29yeTogZmlsZQogICAgdHlwZTogaW5mbwoKICAtICZlY3MtZHJpdmVyCiAgICBjYXRlZ29yeTogZHJpdmVyCiAgICB0eXBlOiBpbmZvCgogIC0gJmVjcy1uZXR3b3JrCiAgICBjYXRlZ29yeTogbmV0d29yawogICAgdHlwZToKICAgICAgLSBjb25uZWN0aW9uCiAgICAgIC0gaW5mbwoKICAtICZlY3MtdXNlci1tb2RpZmljYXRpb24tbWFwcGluZ3MKICAgIG1hcHBpbmdzOgogICAgICAtIGZyb206IHN1YmplY3QucHJpbWFyeQogICAgICAgIHRvOiB1c2VyCiAgICAgIC0gZnJvbTogc3ViamVjdC5zZWNvbmRhcnkKICAgICAgICB0bzogdXNlci5lZmZlY3RpdmUKICAgICAgLSBmcm9tOiBvYmplY3QucHJpbWFyeQogICAgICAgIHRvOiB1c2VyLnRhcmdldAoKICAtICZlY3MtZ3JvdXAtbW9kaWZpY2F0aW9uLW1hcHBpbmdzCiAgICBtYXBwaW5nczoKICAgICAgLSBmcm9tOiBzdWJqZWN0LnByaW1hcnkKICAgICAgICB0bzogdXNlcgogICAgICAtIGZyb206IHN1YmplY3Quc2Vjb25kYXJ5CiAgICAgICAgdG86IHVzZXIuZWZmZWN0aXZlCiAgICAgIC0gZnJvbTogb2JqZWN0LnByaW1hcnkKICAgICAgICB0bzogZ3JvdXAKCiMgTm9ybWFsaXphdGlvbnMgaXMgYSBsaXN0IG9mIGRlY2xhcmF0aW9ucyBzcGVjaWZ5aW5nIGhvdyB0byBub3JtYWxpemUgdGhlIGRhdGEKIyBjb250YWluZWQgaW4gYW4gZXZlbnQuIFRoZSBub3JtYWxpemF0aW9uIGNhbiBiZSBhcHBsaWVkIGJhc2VkIG9uIHRoZSBzeXNjYWxsCiMgbmFtZSAoZS5nLiBjb25uZWN0LCBvcGVuKSBvciBiYXNlZCBvbiB0aGUgcmVjb3JkIHR5cGUgKGUuZy4gVVNFUl9MT0dJTikuCiMgTm8gdHdvIG5vcm1hbGl6YXRpb25zIGNhbiBhcHBseSB0byB0aGUgc2FtZSBzeXNjYWxsIG9yIHJlY29yZCB0eXBlLiBUaGlzCiMgd2lsbCByZXN1bHQgaW4gYSBmYWlsdXJlIGF0IGxvYWQgdGltZS4KIwojIEVhY2ggbm9ybWFsaXphdGlvbiBzaG91bGQgc3BlY2lmeToKIyAgIGFjdGlvbiAtIHdoYXQgaGFwcGVuZWQKIyAgIGFjdG9yICAtIHdobyBkaWQgdGhpcyBvciB3aG8gdHJpZ2dlcmVkIHRoZSBldmVudAojICAgb2JqZWN0IC0gd2hhdCB3YXMgdGhlICJ0aGluZyIgaW52b2x2ZWQgaW4gdGhlIGFjdGlvbiAoZS5nLiBwcm9jZXNzLCBzb2NrZXQpCiMgICBob3cgICAgLSBob3cgd2FzIHRoZSBhY3Rpb24gcGVyZm9ybWVkIChlLmcuIGV4ZSBvciB0ZXJtaW5hbCkKbm9ybWFsaXphdGlvbnM6CiAgLSBlY3M6ICplY3MtcHJvY2VzcwogICAgc3lzY2FsbHM6CiAgICAgIC0gJyonICMgdGhpcyBpcyBhIGNhdGNoIGFsbAogIC0gYWN0aW9uOiBvcGVuZWQtZmlsZQogICAgb2JqZWN0OgogICAgICB3aGF0OiBmaWxlCiAgICBzeXNjYWxsczoKICAgICAgIyBjcmVhdCAtIG9wZW4gYW5kIHBvc3NpYmx5IGNyZWF0ZSBhIGZpbGUKICAgICAgLSBjcmVhdAogICAgZWNzOgogICAgICA8PDogKmVjcy1maWxlCiAgICAgIHR5cGU6IGNyZWF0aW9uCiAgLSBhY3Rpb246IG9wZW5lZC1maWxlCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IGZpbGUKICAgIHN5c2NhbGxzOgogICAgICAjIGZhbGxvY2F0ZSAtIG1hbmlwdWxhdGUgZmlsZSBzcGFjZQogICAgICAtIGZhbGxvY2F0ZQogICAgICAjIHRydW5jYXRlIC0gdHJ1bmNhdGUgYSBmaWxlIHRvIGEgc3BlY2lmaWVkIGxlbmd0aAogICAgICAtIHRydW5jYXRlCiAgICAgICMgZnRydW5jYXRlIC0gdHJ1bmNhdGUgYSBmaWxlIHRvIGEgc3BlY2lmaWVkIGxlbmd0aAogICAgICAtIGZ0cnVuY2F0ZQogICAgZWNzOgogICAgICA8PDogKmVjcy1maWxlCiAgICAgICMgdGVjaG5pY2FsbHkgeW91IGNhbiB0cnVuY2F0ZSBhIGZpbGUgdG8gdGhlIHNhbWUgbGVuZ3RoCiAgICAgICMgYnV0IHJlZ2FyZGxlc3MsIHdlIGNvbnNpZGVyIHRoaXMgYSBjaGFuZ2UKICAgICAgdHlwZTogY2hhbmdlCiAgLSBhY3Rpb246IG9wZW5lZC1maWxlCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IGZpbGUKICAgIHN5c2NhbGxzOgogICAgICAjIG9wZW4gLSBvcGVuIGFuZCBwb3NzaWJseSBjcmVhdGUgYSBmaWxlCiAgICAgIC0gb3BlbgogICAgICAjIG9wZW5hdCAtIG9wZW4gYW5kIHBvc3NpYmx5IGNyZWF0ZSBhIGZpbGUKICAgICAgLSBvcGVuYXQKICAgICAgIyByZWFkbGluayAtIHJlYWQgdmFsdWUgb2YgYSBzeW1ib2xpYyBsaW5rCiAgICAgIC0gcmVhZGxpbmsKICAgICAgIyByZWFkbGlua2F0IC0gcmVhZCB2YWx1ZSBvZiBhIHN5bWJvbGljIGxpbmsKICAgICAgLSByZWFkbGlua2F0CiAgICBlY3M6ICplY3MtZmlsZQogIC0gYWN0aW9uOiByZWFkLWZpbGUKICAgIG9iamVjdDoKICAgICAgd2hhdDogZmlsZQogICAgc3lzY2FsbHM6CiAgICAgICMgcmVhZCAtIHJlYWQgZnJvbSBhIGZpbGUgZGVzY3JpcHRvcgogICAgICAtIHJlYWQKICAgIGVjczogKmVjcy1maWxlCiAgLSBhY3Rpb246IHdyb3RlLXRvLWZpbGUKICAgIG9iamVjdDoKICAgICAgd2hhdDogZmlsZQogICAgc3lzY2FsbHM6CiAgICAgICMgd3JpdGUgLSB3cml0ZSB0byBhIGZpbGUgZGVzY3JpcHRvcgogICAgICAtIHdyaXRlCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWZpbGUKICAgICAgdHlwZTogY2hhbmdlCiAgLSBhY3Rpb246IGNoYW5nZWQtZmlsZS1hdHRyaWJ1dGVzLW9mCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IGZpbGUKICAgIHN5c2NhbGxzOgogICAgICAjIHNldHhhdHRyIC0gc2V0IGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAtIHNldHhhdHRyCiAgICAgICMgZnNldHhhdHRyIC0gc2V0IGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAtIGZzZXR4YXR0cgogICAgICAjIGxzZXR4YXR0ciAtIHNldCBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgdmFsdWUKICAgICAgLSBsc2V0eGF0dHIKICAgICAgIyByZW1vdmV4YXR0ciAtIHJlbW92ZSBhbiBleHRlbmRlZCBhdHRyaWJ1dGUKICAgICAgLSByZW1vdmV4YXR0cgogICAgICAjIGZyZW1vdmV4YXR0ciAtIHJlbW92ZSBhbiBleHRlbmRlZCBhdHRyaWJ1dGUKICAgICAgLSBmcmVtb3ZleGF0dHIKICAgICAgIyBscmVtb3ZleGF0dHIgLSByZW1vdmUgYW4gZXh0ZW5kZWQgYXR0cmlidXRlCiAgICAgIC0gbHJlbW92ZXhhdHRyCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWZpbGUKICAgICAgdHlwZTogY2hhbmdlCiAgLSBhY3Rpb246IGNoYW5nZWQtZmlsZS1wZXJtaXNzaW9ucy1vZgogICAgb2JqZWN0OgogICAgICB3aGF0OiBmaWxlCiAgICBzeXNjYWxsczoKICAgICAgIyBjaG1vZCAtIGNoYW5nZSBwZXJtaXNzaW9ucyBvZiBhIGZpbGUKICAgICAgLSBjaG1vZAogICAgICAjIGZjaG1vZCAtIGNoYW5nZSBwZXJtaXNzaW9ucyBvZiBhIGZpbGUKICAgICAgLSBmY2htb2QKICAgICAgIyBmY2htb2RhdCAtIGNoYW5nZSBwZXJtaXNzaW9ucyBvZiBhIGZpbGUKICAgICAgLSBmY2htb2RhdAogICAgZWNzOgogICAgICA8PDogKmVjcy1maWxlCiAgICAgIHR5cGU6IGNoYW5nZQogIC0gYWN0aW9uOiBjaGFuZ2VkLWZpbGUtb3duZXJzaGlwLW9mCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IGZpbGUKICAgIHN5c2NhbGxzOgogICAgICAjIGNob3duIC0gY2hhbmdlIG93bmVyc2hpcCBvZiBhIGZpbGUKICAgICAgLSBjaG93bgogICAgICAjIGZjaG93biAtIGNoYW5nZSBvd25lcnNoaXAgb2YgYSBmaWxlCiAgICAgIC0gZmNob3duCiAgICAgICMgZmNob3duYXQgLSBjaGFuZ2Ugb3duZXJzaGlwIG9mIGEgZmlsZQogICAgICAtIGZjaG93bmF0CiAgICAgICMgbGNob3duIC0gY2hhbmdlIG93bmVyc2hpcCBvZiBhIGZpbGUKICAgICAgLSBsY2hvd24KICAgIGVjczoKICAgICAgPDw6ICplY3MtZmlsZQogICAgICB0eXBlOiBjaGFuZ2UKICAtIGFjdGlvbjogbG9hZGVkLWtlcm5lbC1tb2R1bGUKICAgIG9iamVjdDoKICAgICAgd2hhdDogZmlsZQogICAgICBwcmltYXJ5OiBuYW1lCiAgICByZWNvcmRfdHlwZXM6CiAgICAgIC0gS0VSTl9NT0RVTEUKICAgIHN5c2NhbGxzOgogICAgICAjIGZpbml0X21vZHVsZSAtIGxvYWQgYSBrZXJuZWwgbW9kdWxlCiAgICAgIC0gZmluaXRfbW9kdWxlCiAgICAgICMgaW5pdF9tb2R1bGUgLSBsb2FkIGEga2VybmVsIG1vZHVsZQogICAgICAtIGluaXRfbW9kdWxlCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWRyaXZlcgogICAgICB0eXBlOiBzdGFydAogIC0gYWN0aW9uOiB1bmxvYWRlZC1rZXJuZWwtbW9kdWxlCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IGZpbGUKICAgIHN5c2NhbGxzOgogICAgICAjIGRlbGV0ZV9tb2R1bGUgLSB1bmxvYWQgYSBrZXJuZWwgbW9kdWxlCiAgICAgIC0gZGVsZXRlX21vZHVsZQogICAgZWNzOgogICAgICA8PDogKmVjcy1kcml2ZXIKICAgICAgdHlwZTogZW5kCiAgLSBhY3Rpb246IGNyZWF0ZWQtZGlyZWN0b3J5CiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IGZpbGUKICAgICAgcGF0aF9pbmRleDogMQogICAgc3lzY2FsbHM6CiAgICAgICMgbWtkaXIgLSBjcmVhdGUgYSBkaXJlY3RvcnkKICAgICAgLSBta2RpcgogICAgICAjIG1rZGlyYXQgLSBjcmVhdGUgYSBkaXJlY3RvcnkKICAgICAgLSBta2RpcmF0CiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWZpbGUKICAgICAgdHlwZTogY3JlYXRpb24KICAtIGFjdGlvbjogbW91bnRlZAogICAgb2JqZWN0OgogICAgICB3aGF0OiBmaWxlc3lzdGVtCiAgICAgIHBhdGhfaW5kZXg6IDEKICAgIHN5c2NhbGxzOgogICAgICAjIG1vdW50IC0gbW91bnQgZmlsZXN5c3RlbQogICAgICAtIG1vdW50CiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWZpbGUKICAgICAgIyBzaW5jZSBhIG5ldyBtb3VudCBhcHBlYXJzIG9uIHRoZSBzeXN0ZW0KICAgICAgIyB3ZSBjb25zaWRlciB0aGlzIGEgaGlnaC1sZXZlbCAiY3JlYXRpb24iIGV2ZW50CiAgICAgIHR5cGU6IGNyZWF0aW9uCiAgLSBhY3Rpb246IHJlbmFtZWQKICAgIG9iamVjdDoKICAgICAgd2hhdDogZmlsZQogICAgICBwYXRoX2luZGV4OiAyCiAgICBzeXNjYWxsczoKICAgICAgIyByZW5hbWUgLSBjaGFuZ2UgdGhlIG5hbWUgb3IgbG9jYXRpb24gb2YgYSBmaWxlCiAgICAgIC0gcmVuYW1lCiAgICAgICMgcmVuYW1lYXQgLSBjaGFuZ2UgdGhlIG5hbWUgb3IgbG9jYXRpb24gb2YgYSBmaWxlCiAgICAgIC0gcmVuYW1lYXQKICAgICAgIyByZW5hbWVhdDIgLSBjaGFuZ2UgdGhlIG5hbWUgb3IgbG9jYXRpb24gb2YgYSBmaWxlCiAgICAgIC0gcmVuYW1lYXQyCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWZpbGUKICAgICAgdHlwZTogY2hhbmdlCiAgLSBhY3Rpb246IGNoZWNrZWQtbWV0YWRhdGEtb2YKICAgIG9iamVjdDoKICAgICAgd2hhdDogZmlsZQogICAgc3lzY2FsbHM6CiAgICAgICMgYWNjZXNzIC0gY2hlY2sgdXNlcidzIHBlcm1pc3Npb25zIGZvciBhIGZpbGUKICAgICAgLSBhY2Nlc3MKICAgICAgIyBmYWNjZXNzYXQgLSBjaGVjayB1c2VyJ3MgcGVybWlzc2lvbnMgZm9yIGEgZmlsZQogICAgICAtIGZhY2Nlc3NhdAogICAgICAjIGZzdGF0YXQgLSBnZXQgZmlsZSBzdGF0dXMKICAgICAgLSBmc3RhdGF0CiAgICAgICMgbmV3ZnN0YXRhdCAtIGdldCBmaWxlIHN0YXR1cwogICAgICAtIG5ld2ZzdGF0YXQKICAgICAgIyBzdGF0IC0gZ2V0IGZpbGUgc3RhdHVzCiAgICAgIC0gc3RhdAogICAgICAjIHN0YXQ2NCAtIGdldCBmaWxlIHN0YXR1cwogICAgICAtIHN0YXQ2NAogICAgICAjIGZzdGF0IC0gZ2V0IGZpbGUgc3RhdHVzCiAgICAgIC0gZnN0YXQKICAgICAgIyBsc3RhdCAtIGdldCBmaWxlIHN0YXR1cwogICAgICAtIGxzdGF0CiAgICAgICMgZ2V0eGF0dHIgLSByZXRyaWV2ZSBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgdmFsdWUKICAgICAgLSBnZXR4YXR0cgogICAgICAjIGxnZXR4YXR0ciAtIHJldHJpZXZlIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAtIGxnZXR4YXR0cgogICAgICAjIGZnZXR4YXR0ciAtIHJldHJpZXZlIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAtIGZnZXR4YXR0cgogICAgZWNzOiAqZWNzLWZpbGUKICAtIGFjdGlvbjogY2hlY2tlZC1maWxlc3lzdGVtLW1ldGFkYXRhLW9mCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IGZpbGVzeXN0ZW0KICAgIHN5c2NhbGxzOgogICAgICAjIHN0YXRmcyAtIGdldCBmaWxlc3lzdGVtIHN0YXRpc3RpY3MKICAgICAgLSBzdGF0ZnMKICAgICAgIyBmc3RhdGZzIC0gZ2V0IGZpbGVzeXN0ZW0gc3RhdGlzdGljcwogICAgICAtIGZzdGF0ZnMKICAgIGVjczogKmVjcy1maWxlCiAgLSBhY3Rpb246IHN5bWxpbmtlZAogICAgb2JqZWN0OgogICAgICB3aGF0OiBmaWxlCiAgICBzeXNjYWxsczoKICAgICAgIyBzeW1saW5rIC0gbWFrZSBhIG5ldyBuYW1lIGZvciBhIGZpbGUKICAgICAgLSBzeW1saW5rCiAgICAgICMgc3ltbGlua2F0IC0gbWFrZSBhIG5ldyBuYW1lIGZvciBhIGZpbGUKICAgICAgLSBzeW1saW5rYXQKICAgIGVjczoKICAgICAgPDw6ICplY3MtZmlsZQogICAgICAjICJjcmVhdGlvbiIgc2luY2Ugd2UncmUgY3JlYXRpbmcgYSBuZXcgZmlsZSBzeXN0ZW0KICAgICAgIyBlbnRyeSBmb3IgdGhlIHN5bWxpbmsKICAgICAgdHlwZTogY3JlYXRpb24KICAtIGFjdGlvbjogdW5tb3VudGVkCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IGZpbGVzeXN0ZW0KICAgIHN5c2NhbGxzOgogICAgICAjIHVtb3VudCAtIHVubW91bnQgZmlsZXN5c3RlbQogICAgICAtIHVtb3VudAogICAgICAjIHVtb3VudDIgLSB1bm1vdW50IGZpbGVzeXN0ZW0KICAgICAgLSB1bW91bnQyCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWZpbGUKICAgICAgIyAiZGVsZXRpb24iIHRvIG1pcnJvciB0aGUgImNyZWF0aW9uIiBvZiB0aGUgbW91bnQKICAgICAgdHlwZTogZGVsZXRpb24KICAtIGFjdGlvbjogZGVsZXRlZAogICAgb2JqZWN0OgogICAgICB3aGF0OiBmaWxlCiAgICBzeXNjYWxsczoKICAgICAgIyBybWRpciAtIGRlbGV0ZSBhIGRpcmVjdG9yeQogICAgICAtIHJtZGlyCiAgICAgICMgdW5saW5rIC0gZGVsZXRlIGEgbmFtZSBhbmQgcG9zc2libHkgdGhlIGZpbGUgaXQgcmVmZXJzIHRvCiAgICAgIC0gdW5saW5rCiAgICAgICMgdW5saW5rYXQgLSBkZWxldGUgYSBuYW1lIGFuZCBwb3NzaWJseSB0aGUgZmlsZSBpdCByZWZlcnMgdG8KICAgICAgLSB1bmxpbmthdAogICAgZWNzOgogICAgICA8PDogKmVjcy1maWxlCiAgICAgIHR5cGU6IGRlbGV0aW9uCiAgLSBhY3Rpb246IGNoYW5nZWQtdGltZXN0YW1wLW9mCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IGZpbGUKICAgIHN5c2NhbGxzOgogICAgICAjIHV0aW1lIC0gY2hhbmdlIGZpbGUgbGFzdCBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiB0aW1lcwogICAgICAtIHV0aW1lCiAgICAgICMgdXRpbWVzIC0gY2hhbmdlIGZpbGUgbGFzdCBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiB0aW1lcwogICAgICAtIHV0aW1lcwogICAgICAjIGZ1dGltZXNhdCAtIGNoYW5nZSB0aW1lc3RhbXBzIG9mIGEgZmlsZSByZWxhdGl2ZSB0byBhIFwgZGlyZWN0b3J5IGZpbGUgZGVzY3JpcHRvcgogICAgICAtIGZ1dGltZXNhdAogICAgICAjIGZ1dGltZW5zIC0gY2hhbmdlIGZpbGUgdGltZXN0YW1wcyB3aXRoIG5hbm9zZWNvbmQgcHJlY2lzaW9uCiAgICAgIC0gZnV0aW1lbnMKICAgICAgIyB1dGltZW5zYXQgLSBjaGFuZ2UgZmlsZSB0aW1lc3RhbXBzIHdpdGggbmFub3NlY29uZCBwcmVjaXNpb24KICAgICAgLSB1dGltZW5zYXQKICAgIGVjczogKmVjcy1maWxlCiAgLSBhY3Rpb246IGV4ZWN1dGVkCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IGZpbGUKICAgIHN5c2NhbGxzOgogICAgICAjIGV4ZWN2ZSAtIGV4ZWN1dGUgcHJvZ3JhbQogICAgICAtIGV4ZWN2ZQogICAgICAjIGV4ZWN2ZWF0IC0gZXhlY3V0ZSBwcm9ncmFtIHJlbGF0aXZlIHRvIGEgZGlyZWN0b3J5IGZpbGUgZGVzY3JpcHRvcgogICAgICAtIGV4ZWN2ZWF0CiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLXByb2Nlc3MKICAgICAgdHlwZTogc3RhcnQKICAtIGFjdGlvbjogbGlzdGVuLWZvci1jb25uZWN0aW9ucwogICAgb2JqZWN0OgogICAgICB3aGF0OiBzb2NrZXQKICAgIHN5c2NhbGxzOgogICAgICAjIGxpc3Rlbi0gbGlzdGVuIGZvciBjb25uZWN0aW9ucyBvbiBhIHNvY2tldAogICAgICAtIGxpc3RlbgogICAgZWNzOgogICAgICA8PDogKmVjcy1uZXR3b3JrCiAgICAgIHR5cGU6IHN0YXJ0CiAgLSBhY3Rpb246IGFjY2VwdGVkLWNvbm5lY3Rpb24tZnJvbQogICAgb2JqZWN0OgogICAgICB3aGF0OiBzb2NrZXQKICAgIHN5c2NhbGxzOgogICAgICAjIGFjY2VwdCAtIGFjY2VwdCBhIGNvbm5lY3Rpb24gb24gYSBzb2NrZXQKICAgICAgLSBhY2NlcHQKICAgICAgIyBhY2NlcHQ0IC0gYWNjZXB0IGEgY29ubmVjdGlvbiBvbiBhIHNvY2tldAogICAgICAtIGFjY2VwdDQKICAgIGVjczoKICAgICAgPDw6ICplY3MtbmV0d29yawogICAgICB0eXBlOgogICAgICAgIC0gY29ubmVjdGlvbgogICAgICAgIC0gc3RhcnQKICAtIGFjdGlvbjogYm91bmQtc29ja2V0CiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHNvY2tldAogICAgc3lzY2FsbHM6CiAgICAgICMgYmluZCAtYmluZCBhIG5hbWUgdG8gYSBzb2NrZXQKICAgICAgLSBiaW5kCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLW5ldHdvcmsKICAgICAgdHlwZTogc3RhcnQKICAtIGFjdGlvbjogY29ubmVjdGVkLXRvCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHNvY2tldAogICAgc3lzY2FsbHM6CiAgICAgIC0gY29ubmVjdAogICAgZWNzOgogICAgICA8PDogKmVjcy1uZXR3b3JrCiAgICAgIHR5cGU6CiAgICAgICAgLSBjb25uZWN0aW9uCiAgICAgICAgLSBzdGFydAogIC0gYWN0aW9uOiByZWNlaXZlZC1mcm9tCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHNvY2tldAogICAgc3lzY2FsbHM6CiAgICAgICMgcmVjdiAtIHJlY2VpdmUgYSBtZXNzYWdlIGZyb20gYSBzb2NrZXQKICAgICAgLSByZWN2CiAgICAgICMgcmVjdmZyb20gLSByZWNlaXZlIGEgbWVzc2FnZSBmcm9tIGEgc29ja2V0CiAgICAgIC0gcmVjdmZyb20KICAgICAgIyByZWN2bXNnIC0gcmVjZWl2ZSBhIG1lc3NhZ2UgZnJvbSBhIHNvY2tldAogICAgICAtIHJlY3Ztc2cKICAgICAgIyByZWN2bW1zZyAtIHJlY2VpdmUgbXVsdGlwbGUgbWVzc2FnZXMgb24gYSBzb2NrZXQKICAgICAgLSByZWN2bW1zZwogICAgZWNzOgogICAgICA8PDogKmVjcy1uZXR3b3JrCiAgLSBhY3Rpb246IHNlbnQtdG8KICAgIG9iamVjdDoKICAgICAgd2hhdDogc29ja2V0CiAgICBzeXNjYWxsczoKICAgICAgIyBzZW5kIC0gc2VuZCBhIG1lc3NhZ2Ugb24gYSBzb2NrZXQKICAgICAgLSBzZW5kCiAgICAgICMgc2VuZHRvIC0gc2VuZCBhIG1lc3NhZ2Ugb24gYSBzb2NrZXQKICAgICAgLSBzZW5kdG8KICAgICAgIyBzZW5kbXNnIC0gc2VuZCBhIG1lc3NhZ2Ugb24gYSBzb2NrZXQKICAgICAgLSBzZW5kbXNnCiAgICAgICMgc2VuZG1tc2cgLSBzZW5kIG11bHRpcGxlIG1lc3NhZ2VzIG9uIGEgc29ja2V0CiAgICAgIC0gc2VuZG1tc2cKICAgIGVjczoKICAgICAgPDw6ICplY3MtbmV0d29yawogIC0gYWN0aW9uOiBraWxsZWQtcGlkCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHByb2Nlc3MKICAgIHN5c2NhbGxzOgogICAgICAjIGtpbGwgLSBzZW5kIHNpZ25hbCB0byBhIHByb2Nlc3MKICAgICAgLSBraWxsCiAgICAgICMgdGtpbGwgLSBzZW5kIGEgc2lnbmFsIHRvIGEgdGhyZWFkCiAgICAgIC0gdGtpbGwKICAgICAgIyB0Z2tpbGwgLSBzZW5kIGEgc2lnbmFsIHRvIGEgdGhyZWFkCiAgICAgIC0gdGdraWxsCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLXByb2Nlc3MKICAgICAgdHlwZTogZW5kCiAgLSBhY3Rpb246IGNoYW5nZWQtaWRlbnRpdHktb2YKICAgIG9iamVjdDoKICAgICAgd2hhdDogcHJvY2VzcwogICAgaG93OiBzeXNjYWxsCiAgICBzeXNjYWxsczoKICAgICAgIyBzZXR1aWQgLSBzZXQgdXNlciBpZGVudGl0eQogICAgICAtIHNldHVpZAogICAgICAjIHNldGV1aWQgLSBzZXQgZWZmZWN0aXZlIHVzZXIgb3IgZ3JvdXAgSUQKICAgICAgLSBzZXRldWlkCiAgICAgICMgc2V0ZnN1aWQgLSBzZXQgdXNlciBpZGVudGl0eSB1c2VkIGZvciBmaWxlc3lzdGVtIGNoZWNrcwogICAgICAtIHNldGZzdWlkCiAgICAgICMgc2V0cmV1aWQgLSBzZXQgcmVhbCBhbmQvb3IgZWZmZWN0aXZlIHVzZXIgb3IgZ3JvdXAgSUQKICAgICAgLSBzZXRyZXVpZAogICAgICAjIHNldGdpZCAtIHNldCBncm91cCBpZGVudGl0eQogICAgICAtIHNldGdpZAogICAgICAjIHNldGVnaWQgLSBzZXQgZWZmZWN0aXZlIHVzZXIgb3IgZ3JvdXAgSUQKICAgICAgLSBzZXRlZ2lkCiAgICAgICMgc2V0ZnNnaWQgLSBzZXQgZ3JvdXAgaWRlbnRpdHkgdXNlZCBmb3IgZmlsZXN5c3RlbSBjaGVja3MKICAgICAgLSBzZXRmc2dpZAogICAgICAjIHNldHJlZ2lkIC0gc2V0IHJlYWwgYW5kL29yIGVmZmVjdGl2ZSB1c2VyIG9yIGdyb3VwIElECiAgICAgIC0gc2V0cmVnaWQKICAgICAgIyBzZXRyZXN1aWQgLSBzZXQgcmVhbCwgZWZmZWN0aXZlIGFuZCBzYXZlZCB1c2VyIG9yIGdyb3VwIElECiAgICAgIC0gc2V0cmVzdWlkCiAgICAgICMgc2V0cmVzZ2lkIC0gc2V0IHJlYWwsIGVmZmVjdGl2ZSBhbmQgc2F2ZWQgdXNlciBvciBncm91cCBJRAogICAgICAtIHNldHJlc2dpZAogICAgZWNzOgogICAgICA8PDogKmVjcy1wcm9jZXNzCiAgICAgIHR5cGU6IGNoYW5nZQogIC0gYWN0aW9uOiBjaGFuZ2VkLXN5c3RlbS10aW1lCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHN5c3RlbQogICAgc3lzY2FsbHM6CiAgICAgICMgc2V0dGltZW9mZGF5IC0gZ2V0IC8gc2V0IHRpbWUKICAgICAgLSBzZXR0aW1lb2ZkYXkKICAgICAgIyBjbG9ja19zZXR0aW1lIC0gY2xvY2sgYW5kIHRpbWUgZnVuY3Rpb25zCiAgICAgIC0gY2xvY2tfc2V0dGltZQogICAgICAjIHN0aW1lIC0gc2V0IHRpbWUKICAgICAgLSBzdGltZQogICAgICAjIGFkanRpbWV4IC0gdHVuZSBrZXJuZWwgY2xvY2sKICAgICAgLSBhZGp0aW1leAogICAgZWNzOgogICAgICA8PDogKmVjcy1ob3N0CiAgICAgIHR5cGU6IGNoYW5nZQogIC0gYWN0aW9uOiBtYWtlLWRldmljZQogICAgb2JqZWN0OgogICAgICB3aGF0OiBmaWxlCiAgICBzeXNjYWxsczoKICAgICAgIyBta25vZCAtIGNyZWF0ZSBhIHNwZWNpYWwgb3Igb3JkaW5hcnkgZmlsZQogICAgICAtIG1rbm9kCiAgICAgICMgbWtub2RhdCAtIGNyZWF0ZSBhIHNwZWNpYWwgb3Igb3JkaW5hcnkgZmlsZQogICAgICAtIG1rbm9kYXQKICAgIGVjczoKICAgICAgPDw6ICplY3MtZmlsZQogICAgICB0eXBlOiBjcmVhdGlvbgogIC0gYWN0aW9uOiBjaGFuZ2VkLXN5c3RlbS1uYW1lCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHN5c3RlbQogICAgc3lzY2FsbHM6CiAgICAgICMgc2V0aG9zdG5hbWUgLSBnZXQvc2V0IGhvc3RuYW1lCiAgICAgIC0gc2V0aG9zdG5hbWUKICAgICAgIyBzZXRkb21haW5uYW1lIC0gZ2V0L3NldCBOSVMgZG9tYWluIG5hbWUKICAgICAgLSBzZXRkb21haW5uYW1lCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWhvc3QKICAgICAgdHlwZTogY2hhbmdlCiAgLSBhY3Rpb246IGFsbG9jYXRlZC1tZW1vcnkKICAgIG9iamVjdDoKICAgICAgd2hhdDogbWVtb3J5CiAgICBzeXNjYWxsczoKICAgICAgIyBtbWFwIC0gbWFwIG9yIHVubWFwIGZpbGVzIG9yIGRldmljZXMgaW50byBtZW1vcnkKICAgICAgLSBtbWFwCiAgICAgICMgbW1hcDIgLSBtYXAgZmlsZXMgb3IgZGV2aWNlcyBpbnRvIG1lbW9yeQogICAgICAtIG1tYXAyCiAgICAgICMgYnJrIC0gY2hhbmdlIGRhdGEgc2VnbWVudCBzaXplCiAgICAgIC0gYnJrCiAgICBlY3M6ICplY3MtcHJvY2VzcwogIC0gYWN0aW9uOiBhZGp1c3RlZC1zY2hlZHVsaW5nLXBvbGljeS1vZgogICAgb2JqZWN0OgogICAgICB3aGF0OiBwcm9jZXNzCiAgICBob3c6IHN5c2NhbGwKICAgIHN5c2NhbGxzOgogICAgICAjIHNjaGVkX3NldHBhcmFtIC0gc2V0IGFuZCBnZXQgc2NoZWR1bGluZyBwYXJhbWV0ZXJzCiAgICAgIC0gc2NoZWRfc2V0cGFyYW0KICAgICAgIyBzY2hlZF9zZXRzY2hlZHVsZXIgLSBzZXQgYW5kIGdldCBzY2hlZHVsaW5nIHBvbGljeS9wYXJhbWV0ZXJzCiAgICAgIC0gc2NoZWRfc2V0c2NoZWR1bGVyCiAgICAgICMgc2NoZWRfc2V0YXR0ciAtIHNldCBhbmQgZ2V0IHNjaGVkdWxpbmcgcG9saWN5IGFuZCBhdHRyaWJ1dGVzCiAgICAgIC0gc2NoZWRfc2V0YXR0cgogICAgZWNzOgogICAgICA8PDogKmVjcy1wcm9jZXNzCiAgICAgIHR5cGU6IGNoYW5nZQoKICAjIEN1cnJlbnRseSB1bmhhbmRsZWQKICAjIHRoaXMgbGlzdCBjb21lcyBmcm9tIHBhcnNpbmcgbGludXggbWFuIHBhZ2VzIGF0IGh0dHBzOi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9kb2NzL21hbi1wYWdlcy9tYW4tcGFnZXMuZ2l0CgogICMgc2lnYWN0aW9uIC0gZXhhbWluZSBhbmQgY2hhbmdlIGEgc2lnbmFsIGFjdGlvbgogICMgcnRfc2lnYWN0aW9uIC0gZXhhbWluZSBhbmQgY2hhbmdlIGEgc2lnbmFsIGFjdGlvbgogICMgcHJlYWQgLSByZWFkIGZyb20gb3Igd3JpdGUgdG8gYSBmaWxlIGRlc2NyaXB0b3IgYXQgYSBnaXZlbiBvZmZzZXQKICAjIHB3cml0ZSAtIHJlYWQgZnJvbSBvciB3cml0ZSB0byBhIGZpbGUgZGVzY3JpcHRvciBhdCBhIGdpdmVuIG9mZnNldAogICMgczM5MF9ndWFyZGVkX3N0b3JhZ2UgLSBvcGVyYXRpb25zIHdpdGggei9BcmNoaXRlY3R1cmUgZ3VhcmRlZCBzdG9yYWdlIGZhY2lsaXR5CiAgIyBzY2hlZF9nZXRhdHRyIC0gc2V0IGFuZCBnZXQgc2NoZWR1bGluZyBwb2xpY3kgYW5kIGF0dHJpYnV0ZXMKICAjIGdldHJ1c2FnZSAtIGdldCByZXNvdXJjZSB1c2FnZQogICMgZmxvY2sgLSBhcHBseSBvciByZW1vdmUgYW4gYWR2aXNvcnkgbG9jayBvbiBhbiBvcGVuIGZpbGUKICAjIHBpZGZkX2dldGZkIC0gb2J0YWluIGEgZHVwbGljYXRlIG9mIGFub3RoZXIgcHJvY2VzcydzIGZpbGUgZGVzY3JpcHRvcgogICMgY2xvY2tfbmFub3NsZWVwIC0gaGlnaC1yZXNvbHV0aW9uIHNsZWVwIHdpdGggc3BlY2lmaWFibGUgY2xvY2sKICAjIGdldHBhZ2VzaXplIC0gZ2V0IG1lbW9yeSBwYWdlIHNpemUKICAjIHBpZGZkX29wZW4gLSBvYnRhaW4gYSBmaWxlIGRlc2NyaXB0b3IgdGhhdCByZWZlcnMgdG8gYSBwcm9jZXNzCiAgIyBzcGxpY2UgLSBzcGxpY2UgZGF0YSB0by9mcm9tIGEgcGlwZQogICMgZ2V0cmVzdWlkIC0gZ2V0IHJlYWwsIGVmZmVjdGl2ZSBhbmQgc2F2ZWQgdXNlci9ncm91cCBJRHMKICAjIGdldHJlc2dpZCAtIGdldCByZWFsLCBlZmZlY3RpdmUgYW5kIHNhdmVkIHVzZXIvZ3JvdXAgSURzCiAgIyByZW1hcF9maWxlX3BhZ2VzIC0gY3JlYXRlIGEgbm9ubGluZWFyIGZpbGUgbWFwcGluZwogICMgaW9fY2FuY2VsIC0gY2FuY2VsIGFuIG91dHN0YW5kaW5nIGFzeW5jaHJvbm91cyBJL08gb3BlcmF0aW9uCiAgIyBwcmN0bCAtIG9wZXJhdGlvbnMgb24gYSBwcm9jZXNzIG9yIHRocmVhZAogICMgY2xvY2tfZ2V0cmVzIC0gY2xvY2sgYW5kIHRpbWUgZnVuY3Rpb25zCiAgIyBjbG9ja19nZXR0aW1lIC0gY2xvY2sgYW5kIHRpbWUgZnVuY3Rpb25zCiAgIyBnZXRncm91cHMgLSBnZXQvc2V0IGxpc3Qgb2Ygc3VwcGxlbWVudGFyeSBncm91cCBJRHMKICAjIHNldGdyb3VwcyAtIGdldC9zZXQgbGlzdCBvZiBzdXBwbGVtZW50YXJ5IGdyb3VwIElEcwogICMgdm1zcGxpY2UgLSBzcGxpY2UgdXNlciBwYWdlcyB0by9mcm9tIGEgcGlwZQogICMgZXBvbGxfY3JlYXRlIC0gb3BlbiBhbiBlcG9sbCBmaWxlIGRlc2NyaXB0b3IKICAjIGVwb2xsX2NyZWF0ZTEgLSBvcGVuIGFuIGVwb2xsIGZpbGUgZGVzY3JpcHRvcgogICMgcG9zaXhfZmFkdmlzZSAtIHByZWRlY2xhcmUgYW4gYWNjZXNzIHBhdHRlcm4gZm9yIGZpbGUgZGF0YQogICMgc2lnd2FpdGluZm8gLSBzeW5jaHJvbm91c2x5IHdhaXQgZm9yIHF1ZXVlZCBzaWduYWxzCiAgIyBzaWd0aW1lZHdhaXQgLSBzeW5jaHJvbm91c2x5IHdhaXQgZm9yIHF1ZXVlZCBzaWduYWxzCiAgIyBydF9zaWd0aW1lZHdhaXQgLSBzeW5jaHJvbm91c2x5IHdhaXQgZm9yIHF1ZXVlZCBzaWduYWxzCiAgIyBzaWdyZXR1cm4gLSByZXR1cm4gZnJvbSBzaWduYWwgaGFuZGxlciBhbmQgY2xlYW51cCBzdGFjayBmcmFtZQogICMgcnRfc2lncmV0dXJuIC0gcmV0dXJuIGZyb20gc2lnbmFsIGhhbmRsZXIgYW5kIGNsZWFudXAgc3RhY2sgZnJhbWUKICAjIGdldHJhbmRvbSAtIG9idGFpbiBhIHNlcmllcyBvZiByYW5kb20gYnl0ZXMKICAjIGtleWN0bCAtIG1hbmlwdWxhdGUgdGhlIGtlcm5lbCdzIGtleSBtYW5hZ2VtZW50IGZhY2lsaXR5CiAgIyBzY2hlZF9nZXRzY2hlZHVsZXIgLSBzZXQgYW5kIGdldCBzY2hlZHVsaW5nIHBvbGljeS9wYXJhbWV0ZXJzCiAgIyBtYmluZCAtIHNldCBtZW1vcnkgcG9saWN5IGZvciBhIG1lbW9yeSByYW5nZQogICMgZ2V0cHJpb3JpdHkgLSBnZXQvc2V0IHByb2dyYW0gc2NoZWR1bGluZyBwcmlvcml0eQogICMgc2V0cHJpb3JpdHkgLSBnZXQvc2V0IHByb2dyYW0gc2NoZWR1bGluZyBwcmlvcml0eQogICMgaW5vdGlmeV9pbml0IC0gaW5pdGlhbGl6ZSBhbiBpbm90aWZ5IGluc3RhbmNlCiAgIyBpbm90aWZ5X2luaXQxIC0gaW5pdGlhbGl6ZSBhbiBpbm90aWZ5IGluc3RhbmNlCiAgIyBzZW1jdGwgLSBTeXN0ZW0gViBzZW1hcGhvcmUgY29udHJvbCBvcGVyYXRpb25zCiAgIyBnZXRob3N0bmFtZSAtIGdldC9zZXQgaG9zdG5hbWUKICAjIHB0cmFjZSAtIHByb2Nlc3MgdHJhY2UKICAjIHN5c2N0bCAtIHJlYWQvd3JpdGUgc3lzdGVtIHBhcmFtZXRlcnMKICAjIGdldHBlZXJuYW1lIC0gZ2V0IG5hbWUgb2YgY29ubmVjdGVkIHBlZXIgc29ja2V0CiAgIyBmb3JrIC0gY3JlYXRlIGEgY2hpbGQgcHJvY2VzcwogICMgcXVlcnlfbW9kdWxlIC0gcXVlcnkgdGhlIGtlcm5lbCBmb3IgdmFyaW91cyBiaXRzIHBlcnRhaW5pbmcgdG8gbW9kdWxlcwogICMgaW9jdGxfbGlzdCAtIGxpc3Qgb2YgaW9jdGwgY2FsbHMgaW4gTGludXgvaTM4NiBrZXJuZWwKICAjIG1zZ2dldCAtIGdldCBhIFN5c3RlbSBWIG1lc3NhZ2UgcXVldWUgaWRlbnRpZmllcgogICMgc3B1X2NyZWF0ZSAtIGNyZWF0ZSBhIG5ldyBzcHUgY29udGV4dAogICMgc3VicGFnZV9wcm90IC0gZGVmaW5lIGEgc3VicGFnZSBwcm90ZWN0aW9uIGZvciBhbiBhZGRyZXNzIHJhbmdlCiAgIyBxdW90YWN0bCAtIG1hbmlwdWxhdGUgZGlzayBxdW90YXMKICAjIG5mc3NlcnZjdGwgLSBzeXNjYWxsIGludGVyZmFjZSB0byBrZXJuZWwgbmZzIGRhZW1vbgogICMgb3BlbmF0MiAtIG9wZW4gYW5kIHBvc3NpYmx5IGNyZWF0ZSBhIGZpbGUgKGV4dGVuZGVkKQogICMgZ2V0cmxpbWl0IC0gZ2V0L3NldCByZXNvdXJjZSBsaW1pdHMKICAjIHNldHJsaW1pdCAtIGdldC9zZXQgcmVzb3VyY2UgbGltaXRzCiAgIyBwcmxpbWl0IC0gZ2V0L3NldCByZXNvdXJjZSBsaW1pdHMKICAjIHRlZSAtIGR1cGxpY2F0aW5nIHBpcGUgY29udGVudAogICMgc2htZ2V0IC0gYWxsb2NhdGVzIGEgU3lzdGVtIFYgc2hhcmVkIG1lbW9yeSBzZWdtZW50CiAgIyBjcmVhdGVfbW9kdWxlIC0gY3JlYXRlIGEgbG9hZGFibGUgbW9kdWxlIGVudHJ5CiAgIyBnZXR0aW1lb2ZkYXkgLSBnZXQgLyBzZXQgdGltZQogICMgdGltZXJfY3JlYXRlIC0gY3JlYXRlIGEgUE9TSVggcGVyLXByb2Nlc3MgdGltZXIKICAjIGZhbm90aWZ5X21hcmsgLSBhZGQsIHJlbW92ZSwgb3IgbW9kaWZ5IGFuIGZhbm90aWZ5IG1hcmsgb24gYSBmaWxlc3lzdGVtIG9iamVjdAogICMgcGlwZSAtIGNyZWF0ZSBwaXBlCiAgIyBwaXBlMiAtIGNyZWF0ZSBwaXBlCiAgIyBpbnRybyAtIGludHJvZHVjdGlvbiB0byBzeXN0ZW0gY2FsbHMKICAjIGxvb2t1cF9kY29va2llIC0gcmV0dXJuIGEgZGlyZWN0b3J5IGVudHJ5J3MgcGF0aAogICMgc3lzZnMgLSBnZXQgZmlsZXN5c3RlbSB0eXBlIGluZm9ybWF0aW9uCiAgIyBzMzkwX3J1bnRpbWVfaW5zdHIgLSBlbmFibGUvZGlzYWJsZSBzMzkwIENQVSBydW4tdGltZSBpbnN0cnVtZW50YXRpb24KICAjIHNldG5zIC0gcmVhc3NvY2lhdGUgdGhyZWFkIHdpdGggYSBuYW1lc3BhY2UKICAjIHNldF9tZW1wb2xpY3kgLSBzZXQgZGVmYXVsdCBOVU1BIG1lbW9yeSBwb2xpY3kgZm9yIGEgdGhyZWFkIGFuZCBpdHMgY2hpbGRyZW4KICAjIG5pY2UgLSBjaGFuZ2UgcHJvY2VzcyBwcmlvcml0eQogICMgaW9fc2V0dXAgLSBjcmVhdGUgYW4gYXN5bmNocm9ub3VzIEkvTyBjb250ZXh0CiAgIyBtaW5jb3JlIC0gZGV0ZXJtaW5lIHdoZXRoZXIgcGFnZXMgYXJlIHJlc2lkZW50IGluIG1lbW9yeQogICMgaW9jdGxfY29uc29sZSAtIGlvY3RscyBmb3IgY29uc29sZSB0ZXJtaW5hbCBhbmQgdmlydHVhbCBjb25zb2xlcwogICMgcG9sbCAtIHdhaXQgZm9yIHNvbWUgZXZlbnQgb24gYSBmaWxlIGRlc2NyaXB0b3IKICAjIHBwb2xsIC0gd2FpdCBmb3Igc29tZSBldmVudCBvbiBhIGZpbGUgZGVzY3JpcHRvcgogICMgY2FwZ2V0IC0gc2V0L2dldCBjYXBhYmlsaXRpZXMgb2YgdGhyZWFkKHMpCiAgIyBjYXBzZXQgLSBzZXQvZ2V0IGNhcGFiaWxpdGllcyBvZiB0aHJlYWQocykKICAjIGlvY3RsX3R0eSAtIGlvY3RscyBmb3IgdGVybWluYWxzIGFuZCBzZXJpYWwgbGluZXMKICAjIGlvcGwgLSBjaGFuZ2UgSS9PIHByaXZpbGVnZSBsZXZlbAogICMgaW9fZ2V0ZXZlbnRzIC0gcmVhZCBhc3luY2hyb25vdXMgSS9PIGV2ZW50cyBmcm9tIHRoZSBjb21wbGV0aW9uIHF1ZXVlCiAgIyBwcm9jZXNzX3ZtX3JlYWR2IC0gdHJhbnNmZXIgZGF0YSBiZXR3ZWVuIHByb2Nlc3MgYWRkcmVzcyBzcGFjZXMKICAjIHByb2Nlc3Nfdm1fd3JpdGV2IC0gdHJhbnNmZXIgZGF0YSBiZXR3ZWVuIHByb2Nlc3MgYWRkcmVzcyBzcGFjZXMKICAjIHBjaWNvbmZpZ19yZWFkIC0gcGNpIGRldmljZSBpbmZvcm1hdGlvbiBoYW5kbGluZwogICMgcGNpY29uZmlnX3dyaXRlIC0gcGNpIGRldmljZSBpbmZvcm1hdGlvbiBoYW5kbGluZwogICMgcGNpY29uZmlnX2lvYmFzZSAtIHBjaSBkZXZpY2UgaW5mb3JtYXRpb24gaGFuZGxpbmcKICAjIHNicmsgLSBjaGFuZ2UgZGF0YSBzZWdtZW50IHNpemUKICAjIHNldF90aWRfYWRkcmVzcyAtIHNldCBwb2ludGVyIHRvIHRocmVhZCBJRAogICMgcGtleV9hbGxvYyAtIGFsbG9jYXRlIG9yIGZyZWUgYSBwcm90ZWN0aW9uIGtleQogICMgcGtleV9mcmVlIC0gYWxsb2NhdGUgb3IgZnJlZSBhIHByb3RlY3Rpb24ga2V5CiAgIyBzZWxlY3QgLSBzeW5jaHJvbm91cyBJL08gbXVsdGlwbGV4aW5nCiAgIyBwc2VsZWN0IC0gc3luY2hyb25vdXMgSS9PIG11bHRpcGxleGluZwogICMga2V4ZWNfbG9hZCAtIGxvYWQgYSBuZXcga2VybmVsIGZvciBsYXRlciBleGVjdXRpb24KICAjIGtleGVjX2ZpbGVfbG9hZCAtIGxvYWQgYSBuZXcga2VybmVsIGZvciBsYXRlciBleGVjdXRpb24KICAjIHBlcnNvbmFsaXR5IC0gc2V0IHRoZSBwcm9jZXNzIGV4ZWN1dGlvbiBkb21haW4KICAjIGlvY3RsX2dldGZzbWFwIC0gcmV0cmlldmUgdGhlIHBoeXNpY2FsIGxheW91dCBvZiB0aGUgZmlsZXN5c3RlbQogICMgaW5vdGlmeV9ybV93YXRjaCAtIHJlbW92ZSBhbiBleGlzdGluZyB3YXRjaCBmcm9tIGFuIGlub3RpZnkgaW5zdGFuY2UKICAjIHBlcmZfZXZlbnRfb3BlbiAtIHNldCB1cCBwZXJmb3JtYW5jZSBtb25pdG9yaW5nCiAgIyB0aW1lcl9nZXRvdmVycnVuIC0gZ2V0IG92ZXJydW4gY291bnQgZm9yIGEgUE9TSVggcGVyLXByb2Nlc3MgdGltZXIKICAjIHdhaXQzIC0gd2FpdCBmb3IgcHJvY2VzcyB0byBjaGFuZ2Ugc3RhdGUsIEJTRCBzdHlsZQogICMgd2FpdDQgLSB3YWl0IGZvciBwcm9jZXNzIHRvIGNoYW5nZSBzdGF0ZSwgQlNEIHN0eWxlCiAgIyBsaW5rIC0gbWFrZSBhIG5ldyBuYW1lIGZvciBhIGZpbGUKICAjIGxpbmthdCAtIG1ha2UgYSBuZXcgbmFtZSBmb3IgYSBmaWxlCiAgIyBzY2hlZF9ycl9nZXRfaW50ZXJ2YWwgLSBnZXQgdGhlIFNDSEVEX1JSIGludGVydmFsIGZvciB0aGUgbmFtZWQgcHJvY2VzcwogICMgbXVubWFwIC0gbWFwIG9yIHVubWFwIGZpbGVzIG9yIGRldmljZXMgaW50byBtZW1vcnkKICAjIHNvY2tldGNhbGwgLSBzb2NrZXQgc3lzdGVtIGNhbGxzCiAgIyBtcmVtYXAgLSByZW1hcCBhIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MKICAjIHZmb3JrIC0gY3JlYXRlIGEgY2hpbGQgcHJvY2VzcyBhbmQgYmxvY2sgcGFyZW50CiAgIyBzZWNjb21wIC0gb3BlcmF0ZSBvbiBTZWN1cmUgQ29tcHV0aW5nIHN0YXRlIG9mIHRoZSBwcm9jZXNzCiAgIyByZXF1ZXN0X2tleSAtIHJlcXVlc3QgYSBrZXkgZnJvbSB0aGUga2VybmVsJ3Mga2V5IG1hbmFnZW1lbnQgZmFjaWxpdHkKICAjIHN5c2NhbGwgLSBpbmRpcmVjdCBzeXN0ZW0gY2FsbAogICMga2NtcCAtIGNvbXBhcmUgdHdvIHByb2Nlc3NlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBzaGFyZSBhIGtlcm5lbCByZXNvdXJjZQogICMgcmVhZGRpciAtIHJlYWQgZGlyZWN0b3J5IGVudHJ5CiAgIyBpb3Blcm0gLSBzZXQgcG9ydCBpbnB1dC9vdXRwdXQgcGVybWlzc2lvbnMKICAjIHNwdV9ydW4gLSBleGVjdXRlIGFuIFNQVSBjb250ZXh0CiAgIyByZWJvb3QgLSByZWJvb3Qgb3IgZW5hYmxlL2Rpc2FibGUgQ3RybC1BbHQtRGVsCiAgIyByZWFkYWhlYWQgLSBpbml0aWF0ZSBmaWxlIHJlYWRhaGVhZCBpbnRvIHBhZ2UgY2FjaGUKICAjIHNjaGVkX2dldHBhcmFtIC0gc2V0IGFuZCBnZXQgc2NoZWR1bGluZyBwYXJhbWV0ZXJzCiAgIyBhY2N0IC0gc3dpdGNoIHByb2Nlc3MgYWNjb3VudGluZyBvbiBvciBvZmYKICAjIHNpZ3N1c3BlbmQgLSB3YWl0IGZvciBhIHNpZ25hbAogICMgcnRfc2lnc3VzcGVuZCAtIHdhaXQgZm9yIGEgc2lnbmFsCiAgIyBleGl0X2dyb3VwIC0gZXhpdCBhbGwgdGhyZWFkcyBpbiBhIHByb2Nlc3MKICAjIHNvY2tldCAtIGNyZWF0ZSBhbiBlbmRwb2ludCBmb3IgY29tbXVuaWNhdGlvbgogICMgaW9jdGxfdXNlcmZhdWx0ZmQgLSBjcmVhdGUgYSBmaWxlIGRlc2NyaXB0b3IgZm9yIGhhbmRsaW5nIHBhZ2UgZmF1bHRzIGluIHVzZXIgc3BhY2UKICAjIHNjaGVkX2dldF9wcmlvcml0eV9tYXggLSBnZXQgc3RhdGljIHByaW9yaXR5IHJhbmdlCiAgIyBzY2hlZF9nZXRfcHJpb3JpdHlfbWluICAtIGdldCBzdGF0aWMgcHJpb3JpdHkgcmFuZ2UKICAjIGdldGRlbnRzIC0gZ2V0IGRpcmVjdG9yeSBlbnRyaWVzCiAgIyBnZXRkZW50czY0IC0gZ2V0IGRpcmVjdG9yeSBlbnRyaWVzCiAgIyBzZWxlY3QgLSBzeW5jaHJvbm91cyBJL08gbXVsdGlwbGV4aW5nCiAgIyBwc2VsZWN0IC0gc3luY2hyb25vdXMgSS9PIG11bHRpcGxleGluZwogICMgYWxsb2NfaHVnZXBhZ2VzIC0gYWxsb2NhdGUgb3IgZnJlZSBodWdlIHBhZ2VzCiAgIyBmcmVlX2h1Z2VwYWdlcyAtIGFsbG9jYXRlIG9yIGZyZWUgaHVnZSBwYWdlcwogICMgZnN5bmMgLSBzeW5jaHJvbml6ZSBhIGZpbGUncyBpbi1jb3JlIHN0YXRlIHdpdGggc3RvcmFnZSBkZXZpY2UKICAjIGZkYXRhc3luYyAtIHN5bmNocm9uaXplIGEgZmlsZSdzIGluLWNvcmUgc3RhdGUgd2l0aCBzdG9yYWdlIGRldmljZQogICMgc3lzY2FsbHMgLSBMaW51eCBzeXN0ZW0gY2FsbHMKICAjIG1lbWZkX2NyZWF0ZSAtIGNyZWF0ZSBhbiBhbm9ueW1vdXMgZmlsZQogICMgbW9kaWZ5X2xkdCAtIGdldCBvciBzZXQgYSBwZXItcHJvY2VzcyBMRFQgZW50cnkKICAjIGdldF9rZXJuZWxfc3ltcyAtIHJldHJpZXZlIGV4cG9ydGVkIGtlcm5lbCBhbmQgbW9kdWxlIHN5bWJvbHMKICAjIGxzZWVrIC0gcmVwb3NpdGlvbiByZWFkL3dyaXRlIGZpbGUgb2Zmc2V0CiAgIyBzaG1hdCAtIFN5c3RlbSBWIHNoYXJlZCBtZW1vcnkgb3BlcmF0aW9ucwogICMgc2htZHQgLSBTeXN0ZW0gViBzaGFyZWQgbWVtb3J5IG9wZXJhdGlvbnMKICAjIHRpbWVyX2RlbGV0ZSAtIGRlbGV0ZSBhIFBPU0lYIHBlci1wcm9jZXNzIHRpbWVyCiAgIyBwZXJmbW9uY3RsIC0gaW50ZXJmYWNlIHRvIElBLTY0IHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgdW5pdAogICMgbW92ZV9wYWdlcyAtIG1vdmUgaW5kaXZpZHVhbCBwYWdlcyBvZiBhIHByb2Nlc3MgdG8gYW5vdGhlciBub2RlCiAgIyBjaGRpciAtIGNoYW5nZSB3b3JraW5nIGRpcmVjdG9yeQogICMgZmNoZGlyIC0gY2hhbmdlIHdvcmtpbmcgZGlyZWN0b3J5CiAgIyB0aW1lIC0gZ2V0IHRpbWUgaW4gc2Vjb25kcwogICMgX2V4aXQgLSB0ZXJtaW5hdGUgdGhlIGNhbGxpbmcgcHJvY2VzcwogICMgX0V4aXQgLSB0ZXJtaW5hdGUgdGhlIGNhbGxpbmcgcHJvY2VzcwogICMgczM5MF9zdGh5aSAtIGVtdWxhdGUgU1RIWUkgaW5zdHJ1Y3Rpb24KICAjIGlvX3N1Ym1pdCAtIHN1Ym1pdCBhc3luY2hyb25vdXMgSS9PIGJsb2NrcyBmb3IgcHJvY2Vzc2luZwogICMgbWxvY2sgLSBsb2NrIGFuZCB1bmxvY2sgbWVtb3J5CiAgIyBtbG9jazIgLSBsb2NrIGFuZCB1bmxvY2sgbWVtb3J5CiAgIyBtdW5sb2NrIC0gbG9jayBhbmQgdW5sb2NrIG1lbW9yeQogICMgbWxvY2thbGwgLSBsb2NrIGFuZCB1bmxvY2sgbWVtb3J5CiAgIyBtdW5sb2NrYWxsIC0gbG9jayBhbmQgdW5sb2NrIG1lbW9yeQogICMgdW1hc2sgLSBzZXQgZmlsZSBtb2RlIGNyZWF0aW9uIG1hc2sKICAjIGFyY2hfcHJjdGwgLSBzZXQgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHRocmVhZCBzdGF0ZQogICMgdXNlbGliIC0gbG9hZCBzaGFyZWQgbGlicmFyeQogICMgc2VuZGZpbGUgLSB0cmFuc2ZlciBkYXRhIGJldHdlZW4gZmlsZSBkZXNjcmlwdG9ycwogICMgc2htY3RsIC0gU3lzdGVtIFYgc2hhcmVkIG1lbW9yeSBjb250cm9sCiAgIyBlcG9sbF93YWl0IC0gd2FpdCBmb3IgYW4gSS9PIGV2ZW50IG9uIGFuIGVwb2xsIGZpbGUgZGVzY3JpcHRvcgogICMgZXBvbGxfcHdhaXQgLSB3YWl0IGZvciBhbiBJL08gZXZlbnQgb24gYW4gZXBvbGwgZmlsZSBkZXNjcmlwdG9yCiAgIyBzaWdhbHRzdGFjayAtIHNldCBhbmQvb3IgZ2V0IHNpZ25hbCBzdGFjayBjb250ZXh0CiAgIyBpb2N0bCAtIGNvbnRyb2wgZGV2aWNlCiAgIyBzaWduYWxmZCAtIGNyZWF0ZSBhIGZpbGUgZGVzY3JpcHRvciBmb3IgYWNjZXB0aW5nIHNpZ25hbHMKICAjIHVuc2hhcmUgLSBkaXNhc3NvY2lhdGUgcGFydHMgb2YgdGhlIHByb2Nlc3MgZXhlY3V0aW9uIGNvbnRleHQKICAjIGNocm9vdCAtIGNoYW5nZSByb290IGRpcmVjdG9yeQogICMgbWFkdmlzZSAtIGdpdmUgYWR2aWNlIGFib3V0IHVzZSBvZiBtZW1vcnkKICAjIGdldHRpZCAtIGdldCB0aHJlYWQgaWRlbnRpZmljYXRpb24KICAjIGdldHNvY2tuYW1lIC0gZ2V0IHNvY2tldCBuYW1lCiAgIyBpb19kZXN0cm95IC0gZGVzdHJveSBhbiBhc3luY2hyb25vdXMgSS9PIGNvbnRleHQKICAjIHNldHVwIC0gc2V0dXAgZGV2aWNlcyBhbmQgZmlsZXN5c3RlbXMsIG1vdW50IHJvb3QgZmlsZXN5c3RlbQogICMgbnRwX2FkanRpbWUgLSB0dW5lIGtlcm5lbCBjbG9jawogICMgc2VtZ2V0IC0gZ2V0IGEgU3lzdGVtIFYgc2VtYXBob3JlIHNldCBpZGVudGlmaWVyCiAgIyBnZXR1aWQgLSBnZXQgdXNlciBpZGVudGl0eQogICMgZ2V0ZXVpZCAtIGdldCB1c2VyIGlkZW50aXR5CiAgIyBfc3lzY2FsbCAtIGludm9raW5nIGEgc3lzdGVtIGNhbGwgd2l0aG91dCBsaWJyYXJ5IHN1cHBvcnQgKE9CU09MRVRFKQogICMgc2NoZWRfc2V0YWZmaW5pdHkgLSBcIHNldCBhbmQgZ2V0IGEgdGhyZWFkJ3MgQ1BVIGFmZmluaXR5IG1hc2sKICAjIHNjaGVkX2dldGFmZmluaXR5IC0gXCBzZXQgYW5kIGdldCBhIHRocmVhZCdzIENQVSBhZmZpbml0eSBtYXNrCiAgIyBjYWNoZWZsdXNoIC0gZmx1c2ggY29udGVudHMgb2YgaW5zdHJ1Y3Rpb24gYW5kL29yIGRhdGEgY2FjaGUKICAjIHBpdm90X3Jvb3QgLSBjaGFuZ2UgdGhlIHJvb3QgbW91bnQKICAjIG1zZ2N0bCAtIFN5c3RlbSBWIG1lc3NhZ2UgY29udHJvbCBvcGVyYXRpb25zCiAgIyBpb2N0bF9mYXQgLSBtYW5pcHVsYXRpbmcgdGhlIEZBVCBmaWxlc3lzdGVtCiAgIyBzZXRwZ2lkIC0gc2V0L2dldCBwcm9jZXNzIGdyb3VwCiAgIyBnZXRwZ2lkIC0gc2V0L2dldCBwcm9jZXNzIGdyb3VwCiAgIyBzZXRwZ3JwIC0gc2V0L2dldCBwcm9jZXNzIGdyb3VwCiAgIyBnZXRwZ3JwIC0gc2V0L2dldCBwcm9jZXNzIGdyb3VwCiAgIyBzb2NrZXRwYWlyIC0gY3JlYXRlIGEgcGFpciBvZiBjb25uZWN0ZWQgc29ja2V0cwogICMgYmRmbHVzaCAtIHN0YXJ0LCBmbHVzaCwgb3IgdHVuZSBidWZmZXItZGlydHktZmx1c2ggZGFlbW9uCiAgIyBhbGFybSAtIHNldCBhbiBhbGFybSBjbG9jayBmb3IgZGVsaXZlcnkgb2YgYSBzaWduYWwKICAjIHRpbWVyX3NldHRpbWUgLSBhcm0vZGlzYXJtIGFuZCBmZXRjaCBzdGF0ZSBvZiBQT1NJWCBwZXItcHJvY2VzcyB0aW1lcgogICMgdGltZXJfZ2V0dGltZSAtIGFybS9kaXNhcm0gYW5kIGZldGNoIHN0YXRlIG9mIFBPU0lYIHBlci1wcm9jZXNzIHRpbWVyCiAgIyBhZGRfa2V5IC0gYWRkIGEga2V5IHRvIHRoZSBrZXJuZWwncyBrZXkgbWFuYWdlbWVudCBmYWNpbGl0eQogICMgcnRfc2lncXVldWVpbmZvIC0gcXVldWUgYSBzaWduYWwgYW5kIGRhdGEKICAjIHJ0X3Rnc2lncXVldWVpbmZvIC0gcXVldWUgYSBzaWduYWwgYW5kIGRhdGEKICAjIHVzZXJmYXVsdGZkIC0gY3JlYXRlIGEgZmlsZSBkZXNjcmlwdG9yIGZvciBoYW5kbGluZyBwYWdlIGZhdWx0cyBpbiB1c2VyIHNwYWNlCiAgIyBzZW1vcCAtIFN5c3RlbSBWIHNlbWFwaG9yZSBvcGVyYXRpb25zCiAgIyBzZW10aW1lZG9wIC0gU3lzdGVtIFYgc2VtYXBob3JlIG9wZXJhdGlvbnMKICAjIGdldGdpZCAtIGdldCBncm91cCBpZGVudGl0eQogICMgZ2V0ZWdpZCAtIGdldCBncm91cCBpZGVudGl0eQogICMgZ2V0cGlkIC0gZ2V0IHByb2Nlc3MgaWRlbnRpZmljYXRpb24KICAjIGdldHBwaWQgLSBnZXQgcHJvY2VzcyBpZGVudGlmaWNhdGlvbgogICMgc2lncHJvY21hc2sgLSBleGFtaW5lIGFuZCBjaGFuZ2UgYmxvY2tlZCBzaWduYWxzCiAgIyBydF9zaWdwcm9jbWFzayAtIGV4YW1pbmUgYW5kIGNoYW5nZSBibG9ja2VkIHNpZ25hbHMKICAjIHVuYW1lIC0gZ2V0IG5hbWUgYW5kIGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQga2VybmVsCiAgIyBzdGF0eCAtIGdldCBmaWxlIHN0YXR1cyAoZXh0ZW5kZWQpCiAgIyBpb2N0bF9maWNsb25lcmFuZ2UgLSBzaGFyZSBzb21lIHRoZSBkYXRhIG9mIG9uZSBmaWxlIHdpdGggYW5vdGhlciBmaWxlCiAgIyBpb2N0bF9maWNsb25lIC0gc2hhcmUgc29tZSB0aGUgZGF0YSBvZiBvbmUgZmlsZSB3aXRoIGFub3RoZXIgZmlsZQogICMgbXFfZ2V0c2V0YXR0ciAtIGdldC9zZXQgbWVzc2FnZSBxdWV1ZSBhdHRyaWJ1dGVzCiAgIyBpb3ByaW9fZ2V0IC0gZ2V0L3NldCBJL08gc2NoZWR1bGluZyBjbGFzcyBhbmQgcHJpb3JpdHkKICAjIGlvcHJpb19zZXQgLSBnZXQvc2V0IEkvTyBzY2hlZHVsaW5nIGNsYXNzIGFuZCBwcmlvcml0eQogICMgZXBvbGxfY3RsIC0gY29udHJvbCBpbnRlcmZhY2UgZm9yIGFuIGVwb2xsIGZpbGUgZGVzY3JpcHRvcgogICMgc3luYyAtIGNvbW1pdCBmaWxlc3lzdGVtIGNhY2hlcyB0byBkaXNrCiAgIyBzeW5jZnMgLSBjb21taXQgZmlsZXN5c3RlbSBjYWNoZXMgdG8gZGlzawogICMgc2V0c2lkIC0gY3JlYXRlcyBhIHNlc3Npb24gYW5kIHNldHMgdGhlIHByb2Nlc3MgZ3JvdXAgSUQKICAjIHNodXRkb3duIC0gc2h1dCBkb3duIHBhcnQgb2YgYSBmdWxsLWR1cGxleCBjb25uZWN0aW9uCiAgIyBnZXRzaWQgLSBnZXQgc2Vzc2lvbiBJRAogICMgZ2V0X3RocmVhZF9hcmVhIC0gbWFuaXB1bGF0ZSB0aHJlYWQtbG9jYWwgc3RvcmFnZSBpbmZvcm1hdGlvbgogICMgc2V0X3RocmVhZF9hcmVhIC0gbWFuaXB1bGF0ZSB0aHJlYWQtbG9jYWwgc3RvcmFnZSBpbmZvcm1hdGlvbgogICMgdGltZXJmZF9jcmVhdGUgLSB0aW1lcnMgdGhhdCBub3RpZnkgdmlhIGZpbGUgZGVzY3JpcHRvcnMKICAjIHRpbWVyZmRfc2V0dGltZSAtIHRpbWVycyB0aGF0IG5vdGlmeSB2aWEgZmlsZSBkZXNjcmlwdG9ycwogICMgdGltZXJmZF9nZXR0aW1lIC0gdGltZXJzIHRoYXQgbm90aWZ5IHZpYSBmaWxlIGRlc2NyaXB0b3JzCiAgIyBpb2N0bF9maWRlZHVwZXJhbmdlIC0gc2hhcmUgc29tZSB0aGUgZGF0YSBvZiBvbmUgZmlsZSB3aXRoIGFub3RoZXIgZmlsZQogICMgbmFtZV90b19oYW5kbGVfYXQgLSBvYnRhaW4gaGFuZGxlIGZvciBhIHBhdGhuYW1lIGFuZCBvcGVuIGZpbGUgdmlhIGEgaGFuZGxlCiAgIyBvcGVuX2J5X2hhbmRsZV9hdCAtIG9idGFpbiBoYW5kbGUgZm9yIGEgcGF0aG5hbWUgYW5kIG9wZW4gZmlsZSB2aWEgYSBoYW5kbGUKICAjIGZ1dGV4IC0gZmFzdCB1c2VyLXNwYWNlIGxvY2tpbmcKICAjIGlvY3RsX25zIC0gaW9jdGwoKSBvcGVyYXRpb25zIGZvciBMaW51eCBuYW1lc3BhY2VzCiAgIyBwaWRmZF9zZW5kX3NpZ25hbCAtIHNlbmQgYSBzaWduYWwgdG8gYSBwcm9jZXNzIHNwZWNpZmllZCBieSBhIGZpbGUgZGVzY3JpcHRvcgogICMgY2xvbmUgLSBjcmVhdGUgYSBjaGlsZCBwcm9jZXNzCiAgIyBfX2Nsb25lMiAtIGNyZWF0ZSBhIGNoaWxkIHByb2Nlc3MKICAjIGNsb25lMyAtIGNyZWF0ZSBhIGNoaWxkIHByb2Nlc3MKICAjIHRpbWVzIC0gZ2V0IHByb2Nlc3MgdGltZXMKICAjIHN5c2luZm8gLSByZXR1cm4gc3lzdGVtIGluZm9ybWF0aW9uCiAgIyBpcGMgLSBTeXN0ZW0gViBJUEMgc3lzdGVtIGNhbGxzCiAgIyBldmVudGZkIC0gY3JlYXRlIGEgZmlsZSBkZXNjcmlwdG9yIGZvciBldmVudCBub3RpZmljYXRpb24KICAjIHdhaXQgLSB3YWl0IGZvciBwcm9jZXNzIHRvIGNoYW5nZSBzdGF0ZQogICMgd2FpdHBpZCAtIHdhaXQgZm9yIHByb2Nlc3MgdG8gY2hhbmdlIHN0YXRlCiAgIyB3YWl0aWQgLSB3YWl0IGZvciBwcm9jZXNzIHRvIGNoYW5nZSBzdGF0ZQogICMgZ2V0ZG9tYWlubmFtZSAtIGdldC9zZXQgTklTIGRvbWFpbiBuYW1lCiAgIyBpZGxlIC0gbWFrZSBwcm9jZXNzIDAgaWRsZQogICMgaW5vdGlmeV9hZGRfd2F0Y2ggLSBhZGQgYSB3YXRjaCB0byBhbiBpbml0aWFsaXplZCBpbm90aWZ5IGluc3RhbmNlCiAgIyBnZXRfbWVtcG9saWN5IC0gcmV0cmlldmUgTlVNQSBtZW1vcnkgcG9saWN5IGZvciBhIHRocmVhZAogICMgYnBmIC0gcGVyZm9ybSBhIGNvbW1hbmQgb24gYW4gZXh0ZW5kZWQgQlBGIG1hcCBvciBwcm9ncmFtCiAgIyBnZXRzb2Nrb3B0IC0gZ2V0IGFuZCBzZXQgb3B0aW9ucyBvbiBzb2NrZXRzCiAgIyBzZXRzb2Nrb3B0IC0gZ2V0IGFuZCBzZXQgb3B0aW9ucyBvbiBzb2NrZXRzCiAgIyBnZXRpdGltZXIgLSBnZXQgb3Igc2V0IHZhbHVlIG9mIGFuIGludGVydmFsIHRpbWVyCiAgIyBzZXRpdGltZXIgLSBnZXQgb3Igc2V0IHZhbHVlIG9mIGFuIGludGVydmFsIHRpbWVyCiAgIyBtZW1iYXJyaWVyIC0gaXNzdWUgbWVtb3J5IGJhcnJpZXJzIG9uIGEgc2V0IG9mIHRocmVhZHMKICAjIG1wcm90ZWN0IC0gc2V0IHByb3RlY3Rpb24gb24gYSByZWdpb24gb2YgbWVtb3J5CiAgIyBwa2V5X21wcm90ZWN0IC0gc2V0IHByb3RlY3Rpb24gb24gYSByZWdpb24gb2YgbWVtb3J5CiAgIyBnZXRjcHUgLSBkZXRlcm1pbmUgQ1BVIGFuZCBOVU1BIG5vZGUgb24gd2hpY2ggdGhlIGNhbGxpbmcgdGhyZWFkIGlzIHJ1bm5pbmcKICAjIGlvY3RsX2ZzbGFiZWwgLSBnZXQgb3Igc2V0IGEgZmlsZXN5c3RlbSBsYWJlbAogICMgbGlzdHhhdHRyIC0gbGlzdCBleHRlbmRlZCBhdHRyaWJ1dGUgbmFtZXMKICAjIGxsaXN0eGF0dHIgLSBsaXN0IGV4dGVuZGVkIGF0dHJpYnV0ZSBuYW1lcwogICMgZmxpc3R4YXR0ciAtIGxpc3QgZXh0ZW5kZWQgYXR0cmlidXRlIG5hbWVzCiAgIyBfbGxzZWVrIC0gcmVwb3NpdGlvbiByZWFkL3dyaXRlIGZpbGUgb2Zmc2V0CiAgIyBmY250bCAtIG1hbmlwdWxhdGUgZmlsZSBkZXNjcmlwdG9yCiAgIyB1c3RhdCAtIGdldCBmaWxlc3lzdGVtIHN0YXRpc3RpY3MKICAjIHNpZ25hbCAtIEFOU0kgQyBzaWduYWwgaGFuZGxpbmcKICAjIG5hbm9zbGVlcCAtIGhpZ2gtcmVzb2x1dGlvbiBzbGVlcAogICMgY29ubmVjdCAtIGluaXRpYXRlIGEgY29ubmVjdGlvbiBvbiBhIHNvY2tldAogICMgdm04Nm9sZCAtIGVudGVyIHZpcnR1YWwgODA4NiBtb2RlCiAgIyB2bTg2IC0gZW50ZXIgdmlydHVhbCA4MDg2IG1vZGUKICAjIGZhbm90aWZ5X2luaXQgLSBjcmVhdGUgYW5kIGluaXRpYWxpemUgZmFub3RpZnkgZ3JvdXAKICAjIG1pZ3JhdGVfcGFnZXMgLSBtb3ZlIGFsbCBwYWdlcyBpbiBhIHByb2Nlc3MgdG8gYW5vdGhlciBzZXQgb2Ygbm9kZXMKICAjIHJlc3RhcnRfc3lzY2FsbCAtIHJlc3RhcnQgYSBzeXN0ZW0gY2FsbCBhZnRlciBpbnRlcnJ1cHRpb24gYnkgYSBzdG9wIHNpZ25hbAogICMgY2xvc2UgLSBjbG9zZSBhIGZpbGUgZGVzY3JpcHRvcgogICMgbXNncmN2IC0gU3lzdGVtIFYgbWVzc2FnZSBxdWV1ZSBvcGVyYXRpb25zCiAgIyBtc2dzbmQgLSBTeXN0ZW0gViBtZXNzYWdlIHF1ZXVlIG9wZXJhdGlvbnMKICAjIHJlYWR2IC0gcmVhZCBvciB3cml0ZSBkYXRhIGludG8gbXVsdGlwbGUgYnVmZmVycwogICMgd3JpdGV2IC0gcmVhZCBvciB3cml0ZSBkYXRhIGludG8gbXVsdGlwbGUgYnVmZmVycwogICMgcHJlYWR2IC0gcmVhZCBvciB3cml0ZSBkYXRhIGludG8gbXVsdGlwbGUgYnVmZmVycwogICMgcHdyaXRldiAtIHJlYWQgb3Igd3JpdGUgZGF0YSBpbnRvIG11bHRpcGxlIGJ1ZmZlcnMKICAjIHByZWFkdjIgLSByZWFkIG9yIHdyaXRlIGRhdGEgaW50byBtdWx0aXBsZSBidWZmZXJzCiAgIyBwd3JpdGV2MiAtIHJlYWQgb3Igd3JpdGUgZGF0YSBpbnRvIG11bHRpcGxlIGJ1ZmZlcnMKICAjIHN5c2xvZyAtIHJlYWQgYW5kL29yIGNsZWFyIGtlcm5lbCBtZXNzYWdlIHJpbmcgYnVmZmVyOyBzZXQgY29uc29sZV9sb2dsZXZlbAogICMga2xvZ2N0bCAtIHJlYWQgYW5kL29yIGNsZWFyIGtlcm5lbCBtZXNzYWdlIHJpbmcgYnVmZmVyOyBzZXQgY29uc29sZV9sb2dsZXZlbAogICMgc2NoZWRfeWllbGQgLSB5aWVsZCB0aGUgcHJvY2Vzc29yCiAgIyB2aGFuZ3VwIC0gdmlydHVhbGx5IGhhbmd1cCB0aGUgY3VycmVudCB0ZXJtaW5hbAogICMgaW9jdGxfaWZsYWdzIC0gaW9jdGwoKSBvcGVyYXRpb25zIGZvciBpbm9kZSBmbGFncwogICMgc2dldG1hc2sgLSBtYW5pcHVsYXRpb24gb2Ygc2lnbmFsIG1hc2sgKG9ic29sZXRlKQogICMgc3NldG1hc2sgLSBtYW5pcHVsYXRpb24gb2Ygc2lnbmFsIG1hc2sgKG9ic29sZXRlKQogICMgc3luY19maWxlX3JhbmdlIC0gc3luYyBhIGZpbGUgc2VnbWVudCB3aXRoIGRpc2sKICAjIGNvcHlfZmlsZV9yYW5nZSAtIENvcHkgYSByYW5nZSBvZiBkYXRhIGZyb20gb25lIGZpbGUgdG8gYW5vdGhlcgogICMgc2lncGVuZGluZyAtIGV4YW1pbmUgcGVuZGluZyBzaWduYWxzCiAgIyBydF9zaWdwZW5kaW5nIC0gZXhhbWluZSBwZW5kaW5nIHNpZ25hbHMKICAjIGdldHVud2luZCAtIGNvcHkgdGhlIHVud2luZCBkYXRhIHRvIGNhbGxlcidzIGJ1ZmZlcgogICMgbXN5bmMgLSBzeW5jaHJvbml6ZSBhIGZpbGUgd2l0aCBhIG1lbW9yeSBtYXAKICAjIGdldF9yb2J1c3RfbGlzdCAtIGdldC9zZXQgbGlzdCBvZiByb2J1c3QgZnV0ZXhlcwogICMgc2V0X3JvYnVzdF9saXN0IC0gZ2V0L3NldCBsaXN0IG9mIHJvYnVzdCBmdXRleGVzCiAgIyBkdXAgLSBkdXBsaWNhdGUgYSBmaWxlIGRlc2NyaXB0b3IKICAjIGR1cDIgLSBkdXBsaWNhdGUgYSBmaWxlIGRlc2NyaXB0b3IKICAjIGR1cDMgLSBkdXBsaWNhdGUgYSBmaWxlIGRlc2NyaXB0b3IKICAjIHMzOTBfcGNpX21taW9fd3JpdGUgLSB0cmFuc2ZlciBkYXRhIHRvL2Zyb20gUENJIE1NSU8gbWVtb3J5IHBhZ2UKICAjIHMzOTBfcGNpX21taW9fcmVhZCAtIHRyYW5zZmVyIGRhdGEgdG8vZnJvbSBQQ0kgTU1JTyBtZW1vcnkgcGFnZQogICMgcGF1c2UgLSB3YWl0IGZvciBzaWduYWwKICAjIHN3YXBvbiAtIHN0YXJ0L3N0b3Agc3dhcHBpbmcgdG8gZmlsZS9kZXZpY2UKICAjIHN3YXBvZmYgLSBzdGFydC9zdG9wIHN3YXBwaW5nIHRvIGZpbGUvZGV2aWNlCgogICMgUmVjb3JkIHR5cGUgbm9ybWFsaXphdGlvbnMKICAjIFVzZWZ1bCBsaW5rczoKICAjIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS90b3J2YWxkcy9saW51eC92NC4xNi9pbmNsdWRlL3VhcGkvbGludXgvYXVkaXQuaAogICMgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2xpbnV4LWF1ZGl0L2F1ZGl0LXVzZXJzcGFjZS80ZDkzMzMwMWIxODM1Y2FmYTA4YjllOWVmNzA1YzhmYjZjOTZjYjYyL2xpYi9saWJhdWRpdC5oCiAgIyBodHRwczovL3d3dy5lbGFzdGljLmNvL2d1aWRlL2VuL2Vjcy9jdXJyZW50L2Vjcy1hbGxvd2VkLXZhbHVlcy1ldmVudC1jYXRlZ29yeS5odG1sCgogICMgSUFNIHJlbGF0ZWQgZXZlbnRzCgogICMgQVVESVRfQUNDVF9MT0NLIC0gVXNlcidzIGFjY291bnQgbG9ja2VkIGJ5IGFkbWluCiAgLSByZWNvcmRfdHlwZXM6IEFDQ1RfTE9DSwogICAgYWN0aW9uOiBsb2NrZWQtYWNjb3VudAogICAgZWNzOgogICAgICA8PDogKmVjcy1pYW0KICAgICAgdHlwZToKICAgICAgICAtIHVzZXIKICAgICAgICAtIGluZm8KICAjIEFVRElUX0FDQ1RfVU5MT0NLIC0gVXNlcidzIGFjY291bnQgdW5sb2NrZWQgYnkgYWRtaW4KICAtIHJlY29yZF90eXBlczogQUNDVF9VTkxPQ0sKICAgIGFjdGlvbjogdW5sb2NrZWQtYWNjb3VudAogICAgZWNzOgogICAgICA8PDogKmVjcy1pYW0KICAgICAgdHlwZToKICAgICAgICAtIHVzZXIKICAgICAgICAtIGluZm8KICAjIEFVRElUX0FERF9HUk9VUCAtIEdyb3VwIGFjY291bnQgYWRkZWQKICAtIHJlY29yZF90eXBlczogQUREX0dST1VQCiAgICBhY3Rpb246IGFkZGVkLWdyb3VwLWFjY291bnQtdG8KICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogW2lkLCBhY2N0XQogICAgICB3aGF0OiBhY2NvdW50CiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWlhbQogICAgICA8PDogKmVjcy1ncm91cC1tb2RpZmljYXRpb24tbWFwcGluZ3MKICAgICAgdHlwZToKICAgICAgICAtIGdyb3VwCiAgICAgICAgLSBjcmVhdGlvbgoKICAjIEFVRElUX0FERF9VU0VSIC0gVXNlciBhY2NvdW50IGFkZGVkCiAgLSByZWNvcmRfdHlwZXM6IEFERF9VU0VSCiAgICBhY3Rpb246IGFkZGVkLXVzZXItYWNjb3VudAogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiBbaWQsIGFjY3RdCiAgICAgIHdoYXQ6IGFjY291bnQKICAgIGVjczoKICAgICAgPDw6ICplY3MtaWFtCiAgICAgIDw8OiAqZWNzLXVzZXItbW9kaWZpY2F0aW9uLW1hcHBpbmdzCiAgICAgIHR5cGU6CiAgICAgICAgLSB1c2VyCiAgICAgICAgLSBjcmVhdGlvbgogICMgQVVESVRfREVMX0dST1VQIC0gR3JvdXAgYWNjb3VudCBkZWxldGVkCiAgLSByZWNvcmRfdHlwZXM6IERFTF9HUk9VUAogICAgYWN0aW9uOiBkZWxldGVkLWdyb3VwLWFjY291bnQtZnJvbQogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiBbaWQsIGFjY3RdCiAgICAgIHdoYXQ6IGFjY291bnQKICAgIGVjczoKICAgICAgPDw6ICplY3MtaWFtCiAgICAgIDw8OiAqZWNzLWdyb3VwLW1vZGlmaWNhdGlvbi1tYXBwaW5ncwogICAgICB0eXBlOgogICAgICAgIC0gZ3JvdXAKICAgICAgICAtIGRlbGV0aW9uCiAgIyBBVURJVF9ERUxfVVNFUiAtIFVzZXIgYWNjb3VudCBkZWxldGVkCiAgLSByZWNvcmRfdHlwZXM6IERFTF9VU0VSCiAgICBhY3Rpb246IGRlbGV0ZWQtdXNlci1hY2NvdW50CiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IFtpZCwgYWNjdF0KICAgICAgd2hhdDogYWNjb3VudAogICAgZWNzOgogICAgICA8PDogKmVjcy1pYW0KICAgICAgPDw6ICplY3MtdXNlci1tb2RpZmljYXRpb24tbWFwcGluZ3MKICAgICAgdHlwZToKICAgICAgICAtIHVzZXIKICAgICAgICAtIGRlbGV0aW9uCiAgIyBBVURJVF9HUlBfTUdNVCAtIEdyb3VwIGFjY291bnQgYXR0ciB3YXMgbW9kaWZpZWQKICAtIHJlY29yZF90eXBlczogR1JQX01HTVQKICAgIGFjdGlvbjogbW9kaWZpZWQtZ3JvdXAtYWNjb3VudAogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiBbaWQsIGFjY3RdCiAgICAgIHdoYXQ6IGFjY291bnQKICAgIGVjczoKICAgICAgPDw6ICplY3MtaWFtCiAgICAgIHR5cGU6CiAgICAgICAgLSBncm91cAogICAgICAgIC0gY2hhbmdlCiAgICAgIG1hcHBpbmdzOgogICAgICAgIC0gZnJvbTogc3ViamVjdC5wcmltYXJ5CiAgICAgICAgICB0bzogdXNlcgogICAgICAgIC0gZnJvbTogc3ViamVjdC5zZWNvbmRhcnkKICAgICAgICAgIHRvOiBncm91cAogICAgICAgIC0gZnJvbTogdWlkLnVpZAogICAgICAgICAgdG86IHVzZXIuZWZmZWN0aXZlCiAgIyBBVURJVF9ST0xFX0FTU0lHTiAtIEFkbWluIGFzc2lnbmVkIHVzZXIgdG8gcm9sZQogIC0gcmVjb3JkX3R5cGVzOiBST0xFX0FTU0lHTgogICAgYWN0aW9uOiBhc3NpZ25lZC11c2VyLXJvbGUtdG8KICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogW2lkLCBhY2N0XQogICAgICB3aGF0OiBhY2NvdW50CiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWlhbQogICAgICB0eXBlOgogICAgICAgIC0gdXNlcgogICAgICAgIC0gY2hhbmdlCiAgIyBBVURJVF9ST0xFX01PRElGWSAtIEFkbWluIG1vZGlmaWVkIGEgcm9sZQogIC0gcmVjb3JkX3R5cGVzOiBST0xFX01PRElGWQogICAgYWN0aW9uOiBtb2RpZmllZC1yb2xlCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWlhbQogICAgICB0eXBlOgogICAgICAgIC0gY2hhbmdlCiAgIyBBVURJVF9ST0xFX1JFTU9WRSAtIEFkbWluIHJlbW92ZWQgdXNlciBmcm9tIHJvbGUKICAtIHJlY29yZF90eXBlczogUk9MRV9SRU1PVkUKICAgIGFjdGlvbjogcmVtb3ZlZC11c2VyLXJvbGUtZnJvbQogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiBbaWQsIGFjY3RdCiAgICAgIHdoYXQ6IGFjY291bnQKICAgIGVjczoKICAgICAgPDw6ICplY3MtaWFtCiAgICAgIHR5cGU6CiAgICAgICAgLSB1c2VyCiAgICAgICAgLSBjaGFuZ2UKICAjIEFVRElUX1VTRVJfTUdNVCAtIFVzZXIgYWNjdCBhdHRyaWJ1dGUgY2hhbmdlCiAgLSA8PDogKm1hY3JvLXVzZXItc2Vzc2lvbgogICAgcmVjb3JkX3R5cGVzOiBVU0VSX01HTVQKICAgIGFjdGlvbjogbW9kaWZpZWQtdXNlci1hY2NvdW50CiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWlhbQogICAgICB0eXBlOgogICAgICAgIC0gdXNlcgogICAgICAgIC0gY2hhbmdlCiAgICAgIG1hcHBpbmdzOgogICAgICAgIC0gZnJvbTogc3ViamVjdC5wcmltYXJ5CiAgICAgICAgICB0bzogdXNlcgogICAgICAgIC0gZnJvbTogc3ViamVjdC5zZWNvbmRhcnkKICAgICAgICAgIHRvOiB1c2VyLnRhcmdldAogICAgICAgIC0gZnJvbTogdWlkLnVpZAogICAgICAgICAgdG86IHVzZXIuZWZmZWN0aXZlCiAgIyBBVURJVF9VU0VSX0NIQVVUSFRPSyAtIFVzZXIgYWNjdCBwYXNzd29yZCBvciBwaW4gY2hhbmdlZAogIC0gPDw6ICptYWNyby11c2VyLXNlc3Npb24KICAgIHJlY29yZF90eXBlczogVVNFUl9DSEFVVEhUT0sKICAgIGFjdGlvbjogY2hhbmdlZC1wYXNzd29yZAogICAgZWNzOgogICAgICA8PDogKmVjcy1pYW0KICAgICAgdHlwZToKICAgICAgICAtIHVzZXIKICAgICAgICAtIGNoYW5nZQogICAgICBtYXBwaW5nczoKICAgICAgICAtIGZyb206IHN1YmplY3QucHJpbWFyeQogICAgICAgICAgdG86IHVzZXIKICAgICAgICAtIGZyb206IHVpZC51aWQKICAgICAgICAgIHRvOiB1c2VyLmVmZmVjdGl2ZQogICAgICAgIC0gZnJvbTogc3ViamVjdC5zZWNvbmRhcnkKICAgICAgICAgIHRvOiB1c2VyLnRhcmdldAoKICAjIEFVRElUX0dSUF9DSEFVVEhUT0sgLSBHcm91cCBhY2N0IHBhc3N3b3JkIG9yIHBpbiBjaGFuZ2VkCiAgLSA8PDogKm1hY3JvLXVzZXItc2Vzc2lvbgogICAgcmVjb3JkX3R5cGVzOiBHUlBfQ0hBVVRIVE9LCiAgICBhY3Rpb246IGNoYW5nZWQtZ3JvdXAtcGFzc3dvcmQKICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogYWNjdAogICAgICB3aGF0OiB1c2VyLXNlc3Npb24KICAgIGVjczoKICAgICAgPDw6ICplY3MtaWFtCiAgICAgIHR5cGU6CiAgICAgICAgLSBncm91cAogICAgICAgIC0gY2hhbmdlCiAgICAgIG1hcHBpbmdzOgogICAgICAgIC0gZnJvbTogc3ViamVjdC5wcmltYXJ5CiAgICAgICAgICB0bzogdXNlcgogICAgICAgIC0gZnJvbTogdWlkLnVpZAogICAgICAgICAgdG86IHVzZXIuZWZmZWN0aXZlCiAgICAgICAgLSBmcm9tOiBzdWJqZWN0LnNlY29uZGFyeQogICAgICAgICAgdG86IGdyb3VwCgogICMgQXV0aGVudGljYXRpb24gcmVsYXRlZCBldmVudHMKCiAgIyBBVURJVF9DUkVEX0FDUSAtIFVzZXIgY3JlZGVudGlhbCBhY3F1aXJlZAogIC0gPDw6ICptYWNyby11c2VyLXNlc3Npb24KICAgIHJlY29yZF90eXBlczogQ1JFRF9BQ1EKICAgIGFjdGlvbjogYWNxdWlyZWQtY3JlZGVudGlhbHMKICAgIGVjczogKmVjcy1hdXRoCiAgIyBBVURJVF9DUkVEX0RJU1AgLSBVc2VyIGNyZWRlbnRpYWwgZGlzcG9zZWQKICAtIDw8OiAqbWFjcm8tdXNlci1zZXNzaW9uCiAgICByZWNvcmRfdHlwZXM6IENSRURfRElTUAogICAgYWN0aW9uOiBkaXNwb3NlZC1jcmVkZW50aWFscwogICAgZWNzOiAqZWNzLWF1dGgKICAjIEFVRElUX0NSRURfUkVGUiAtIFVzZXIgY3JlZGVudGlhbCByZWZyZXNoZWQKICAtIDw8OiAqbWFjcm8tdXNlci1zZXNzaW9uCiAgICByZWNvcmRfdHlwZXM6IENSRURfUkVGUgogICAgYWN0aW9uOiByZWZyZXNoZWQtY3JlZGVudGlhbHMKICAgIGVjczogKmVjcy1hdXRoCiAgIyBBVURJVF9HUlBfQVVUSCAtIEF1dGhlbnRpY2F0aW9uIGZvciBncm91cCBwYXNzd29yZAogIC0gcmVjb3JkX3R5cGVzOiBHUlBfQVVUSAogICAgYWN0aW9uOiBhdXRoZW50aWNhdGVkLXRvLWdyb3VwCiAgICBlY3M6ICplY3MtYXV0aAogICMgQVVESVRfTE9HSU4gLSBEZWZpbmUgdGhlIGxvZ2luIGlkIGFuZCBpbmZvcm1hdGlvbgogIC0gcmVjb3JkX3R5cGVzOiBMT0dJTgogICAgYWN0aW9uOiBjaGFuZ2VkLWxvZ2luLWlkLXRvCiAgICBzdWJqZWN0OgogICAgICBwcmltYXJ5OiBbb2xkX2F1aWQsIG9sZC1hdWlkXQogICAgICBzZWNvbmRhcnk6IHVpZAogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiBbbmV3LWF1aWQsIG5ld19hdWlkLCBhdWlkXQogICAgICB3aGF0OiB1c2VyLXNlc3Npb24KICAgIGVjczoKICAgICAgPDw6ICplY3MtYXV0aAogICAgICB0eXBlOiBzdGFydAogICAgICBtYXBwaW5nczoKICAgICAgICAtIGZyb206IHN1YmplY3QucHJpbWFyeQogICAgICAgICAgdG86IHVzZXIKICAgICAgICAtIGZyb206IG9iamVjdC5wcmltYXJ5CiAgICAgICAgICB0bzogdXNlci5lZmZlY3RpdmUKICAjIEFVRElUX1VTRVJfQUNDVCAtIFVzZXIgc3lzdGVtIGFjY2VzcyBhdXRob3JpemF0aW9uCiAgLSA8PDogKm1hY3JvLXVzZXItc2Vzc2lvbgogICAgcmVjb3JkX3R5cGVzOiBVU0VSX0FDQ1QKICAgIGFjdGlvbjogd2FzLWF1dGhvcml6ZWQKICAgIGVjczogKmVjcy1hdXRoCiAgIyBBVURJVF9VU0VSX0FVVEggLSBVc2VyIHN5c3RlbSBhY2Nlc3MgYXV0aGVudGljYXRpb24KICAtIDw8OiAqbWFjcm8tdXNlci1zZXNzaW9uCiAgICByZWNvcmRfdHlwZXM6IFVTRVJfQVVUSAogICAgYWN0aW9uOiBhdXRoZW50aWNhdGVkCiAgICBlY3M6ICplY3MtYXV0aAogICMgQVVESVRfVVNFUl9FTkQgLSBVc2VyIHNlc3Npb24gZW5kCiAgLSA8PDogKm1hY3JvLXVzZXItc2Vzc2lvbgogICAgcmVjb3JkX3R5cGVzOiBVU0VSX0VORAogICAgYWN0aW9uOiBlbmRlZC1zZXNzaW9uCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLXNlc3Npb24KICAgICAgdHlwZTogZW5kCiAgIyBBVURJVF9VU0VSX0VSUiAtIFVzZXIgYWNjdCBzdGF0ZSBlcnJvcgogIC0gPDw6ICptYWNyby11c2VyLXNlc3Npb24KICAgIHJlY29yZF90eXBlczogVVNFUl9FUlIKICAgIGFjdGlvbjogZXJyb3IKICAgIHNvdXJjZV9pcDogW2FkZHJdCiAgICBlY3M6ICplY3MtYXV0aAogICMgQVVESVRfVVNFUl9MT0dJTiAtIFVzZXIgaGFzIGxvZ2dlZCBpbgogIC0gPDw6ICptYWNyby11c2VyLXNlc3Npb24KICAgIHJlY29yZF90eXBlczogVVNFUl9MT0dJTgogICAgYWN0aW9uOiBsb2dnZWQtaW4KICAgIHNvdXJjZV9pcDogW2FkZHJdCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWF1dGgKICAgICAgdHlwZTogc3RhcnQKICAjIEFVRElUX1VTRVJfTE9HT1VUIC0gVXNlciBoYXMgbG9nZ2VkIG91dAogIC0gPDw6ICptYWNyby11c2VyLXNlc3Npb24KICAgIHJlY29yZF90eXBlczogVVNFUl9MT0dPVVQKICAgIGFjdGlvbjogbG9nZ2VkLW91dAogICAgZWNzOgogICAgICA8PDogKmVjcy1hdXRoCiAgICAgIHR5cGU6IGVuZAogICMgQVVESVRfVVNFUl9ST0xFX0NIQU5HRSAtIFVzZXIgY2hhbmdlZCB0byBhIG5ldyByb2xlCiAgLSA8PDogKm1hY3JvLXVzZXItc2Vzc2lvbgogICAgcmVjb3JkX3R5cGVzOiBVU0VSX1JPTEVfQ0hBTkdFCiAgICBhY3Rpb246IGNoYW5nZWQtcm9sZS10bwogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiBzZWxlY3RlZC1jb250ZXh0CiAgICAgIHdoYXQ6IHVzZXItc2Vzc2lvbgogICMgQVVESVRfVVNFUl9TVEFSVCAtIFVzZXIgc2Vzc2lvbiBzdGFydAogIC0gPDw6ICptYWNyby11c2VyLXNlc3Npb24KICAgIHJlY29yZF90eXBlczogVVNFUl9TVEFSVAogICAgYWN0aW9uOiBzdGFydGVkLXNlc3Npb24KICAgIHNvdXJjZV9pcDogW2FkZHJdCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLXNlc3Npb24KICAgICAgdHlwZTogc3RhcnQKCiAgIyBIb3N0IHZpcnR1YWxpemF0aW9uIGV2ZW50cwoKICAjIEFVRElUX1ZJUlRfQ09OVFJPTCAtIFN0YXJ0LCBQYXVzZSwgU3RvcCBWTQogIC0gcmVjb3JkX3R5cGVzOiBWSVJUX0NPTlRST0wKICAgIGFjdGlvbjogaXNzdWVkLXZtLWNvbnRyb2wKICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogb3AKICAgICAgc2Vjb25kYXJ5OiB2bQogICAgICB3aGF0OiB2aXJ0dWFsLW1hY2hpbmUKICAgIGVjczogKmVjcy1ob3N0CiAgIyBBVURJVF9WSVJUX0NSRUFURSAtIENyZWF0aW9uIG9mIGd1ZXN0IGltYWdlCiAgLSByZWNvcmRfdHlwZXM6IFZJUlRfQ1JFQVRFCiAgICBhY3Rpb246IGNyZWF0ZWQtdm0taW1hZ2UKICAgIGVjczogKmVjcy1ob3N0CiAgIyBBVURJVF9WSVJUX0RFU1RST1kgLSBEZXN0cnVjdGlvbiBvZiBndWVzdCBpbWFnZQogIC0gcmVjb3JkX3R5cGVzOiBWSVJUX0RFU1RST1kKICAgIGFjdGlvbjogZGVsZXRlZC12bS1pbWFnZQogICAgZWNzOiAqZWNzLWhvc3QKICAjIEFVRElUX1ZJUlRfSU5URUdSSVRZX0NIRUNLIC0gR3Vlc3QgaW50ZWdyaXR5IHJlc3VsdHMKICAtIHJlY29yZF90eXBlczogVklSVF9JTlRFR1JJVFlfQ0hFQ0sKICAgIGFjdGlvbjogY2hlY2tlZC1pbnRlZ3JpdHktb2YKICAgIGVjczogKmVjcy1ob3N0CiAgIyBBVURJVF9WSVJUX01BQ0hJTkVfSUQgLSBCaW5kaW5nIG9mIGxhYmVsIHRvIFZNCiAgLSByZWNvcmRfdHlwZXM6IFZJUlRfTUFDSElORV9JRAogICAgYWN0aW9uOiBhc3NpZ25lZC12bS1pZAogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiB2bQogICAgICB3aGF0OiB2aXJ0dWFsLW1hY2hpbmUKICAgIGVjczogKmVjcy1ob3N0CiAgIyBBVURJVF9WSVJUX01JR1JBVEVfSU4gLSBJbmJvdW5kIGd1ZXN0IG1pZ3JhdGlvbiBpbmZvCiAgLSByZWNvcmRfdHlwZXM6IFZJUlRfTUlHUkFURV9JTgogICAgYWN0aW9uOiBtaWdyYXRlZC12bS1mcm9tCiAgICBlY3M6ICplY3MtaG9zdAogICMgQVVESVRfVklSVF9NSUdSQVRFX09VVCAtIE91dGJvdW5kIGd1ZXN0IG1pZ3JhdGlvbiBpbmZvCiAgLSByZWNvcmRfdHlwZXM6IFZJUlRfTUlHUkFURV9PVVQKICAgIGFjdGlvbjogbWlncmF0ZWQtdm0tdG8KICAgIGVjczogKmVjcy1ob3N0CiAgIyBBVURJVF9WSVJUX1JFU09VUkNFIC0gUmVzb3VyY2UgYXNzaWdubWVudAogIC0gcmVjb3JkX3R5cGVzOiBWSVJUX1JFU09VUkNFCiAgICBhY3Rpb246IGFzc2lnbmVkLXZtLXJlc291cmNlCiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IHJlc3JjCiAgICAgIHNlY29uZGFyeTogdm0KICAgICAgd2hhdDogdmlydHVhbC1tYWNoaW5lCiAgICBlY3M6ICplY3MtaG9zdAoKICAjIFVzZXJzcGFjZSBwcm9jZXNzIGV2ZW50cwoKICAjIEFVRElUX0NIR1JQX0lEIC0gVXNlciBzcGFjZSBncm91cCBJRCBjaGFuZ2VkCiAgLSByZWNvcmRfdHlwZXM6IENIR1JQX0lECiAgICBhY3Rpb246IGNoYW5nZWQtZ3JvdXAKICAgIGVjczoKICAgICAgPDw6ICplY3MtcHJvY2VzcwogICAgICB0eXBlOiBjaGFuZ2UKICAjIEFVRElUX0NIVVNFUl9JRCAtIENoYW5nZWQgdXNlciBJRCBzdXBwbGVtZW50YWwgZGF0YQogIC0gcmVjb3JkX3R5cGVzOiBDSFVTRVJfSUQKICAgIGFjdGlvbjogY2hhbmdlZC11c2VyLWlkCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLXByb2Nlc3MKICAgICAgdHlwZTogY2hhbmdlCiAgIyBBVURJVF9URVNUIC0gVXNlZCBmb3IgdGVzdCBzdWNjZXNzIG1lc3NhZ2VzCiAgLSByZWNvcmRfdHlwZXM6IFRFU1QKICAgIGFjdGlvbjogc2VudC10ZXN0CiAgICBlY3M6ICplY3MtcHJvY2VzcwogICMgQVVESVRfVFJVU1RFRF9BUFAgLSBUcnVzdGVkIGFwcCBtc2cgLSBmcmVlc3R5bGUgdGV4dAogIC0gcmVjb3JkX3R5cGVzOiBUUlVTVEVEX0FQUAogICAgYWN0aW9uOiB1bmtub3duCiAgICBlY3M6ICplY3MtcHJvY2VzcwogICMgQVVESVRfVVNFUl9DTUQgLSBVc2VyIHNoZWxsIGNvbW1hbmQgYW5kIGFyZ3MKICAtIHJlY29yZF90eXBlczogVVNFUl9DTUQKICAgIGFjdGlvbjogcmFuLWNvbW1hbmQKICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogY21kCiAgICAgIHdoYXQ6IHByb2Nlc3MKICAgIGRlc2NyaXB0aW9uOiA+CiAgICAgIFRoZXNlIG1lc3NhZ2VzIGFyZSBmcm9tIHVzZXItc3BhY2UgYXBwcywgbGlrZSBzdWRvLCB0aGF0IGxvZyBjb21tYW5kcwogICAgICBiZWluZyBydW4gYnkgYSB1c2VyLiBUaGUgdWlkIGNvbnRhaW5lZCBpbiB0aGVzZSBtZXNzYWdlcyBpcyB1c2VyJ3MgVUlEIGF0CiAgICAgIHRoZSB0aW1lIHRoZSBjb21tYW5kIHdhcyBydW4uIEl0IGlzIG5vdCB0aGUgInRhcmdldCIgVUlEIHVzZWQgdG8gcnVuIHRoZQogICAgICBjb21tYW5kLCB3aGljaCBpcyBub3JtYWxseSByb290LgogICAgZWNzOgogICAgICA8PDogKmVjcy1wcm9jZXNzCiAgICAgIHR5cGU6IHN0YXJ0CgogICMgSG9zdC1sZXZlbCBldmVudHMKCiAgIyBBVURJVF9TWVNURU1fQk9PVCAtIFN5c3RlbSBib290CiAgLSByZWNvcmRfdHlwZXM6IFNZU1RFTV9CT09UCiAgICBhY3Rpb246IGJvb3RlZC1zeXN0ZW0KICAgIG9iamVjdDoKICAgICAgd2hhdDogc3lzdGVtCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWhvc3QKICAgICAgdHlwZTogc3RhcnQKICAjIEFVRElUX1NZU1RFTV9SVU5MRVZFTCAtIFN5c3RlbSBydW5sZXZlbCBjaGFuZ2UKICAtIHJlY29yZF90eXBlczogU1lTVEVNX1JVTkxFVkVMCiAgICBhY3Rpb246IGNoYW5nZWQtdG8tcnVubGV2ZWwKICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogbmV3LWxldmVsCiAgICAgIHdoYXQ6IHN5c3RlbQogICAgZWNzOgogICAgICA8PDogKmVjcy1ob3N0CiAgICAgIHR5cGU6IGNoYW5nZQogICMgQVVESVRfU1lTVEVNX1NIVVRET1dOIC0gU3lzdGVtIHNodXRkb3duCiAgLSByZWNvcmRfdHlwZXM6IFNZU1RFTV9TSFVURE9XTgogICAgYWN0aW9uOiBzaHV0ZG93bi1zeXN0ZW0KICAgIG9iamVjdDoKICAgICAgd2hhdDogc3lzdGVtCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLWhvc3QKICAgICAgdHlwZTogZW5kCgogICMgU2VydmljZS1sZXZlbCBldmVudHMKCiAgIyBBVURJVF9TRVJWSUNFX1NUQVJUIC0gU2VydmljZSAoZGFlbW9uKSBzdGFydAogIC0gcmVjb3JkX3R5cGVzOiBTRVJWSUNFX1NUQVJUCiAgICBhY3Rpb246IHN0YXJ0ZWQtc2VydmljZQogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiB1bml0CiAgICAgIHdoYXQ6IHNlcnZpY2UKICAgIGVjczoKICAgICAgPDw6ICplY3MtcHJvY2VzcwogICAgICB0eXBlOiBzdGFydAogICMgQVVESVRfU0VSVklDRV9TVE9QIC0gU2VydmljZSAoZGFlbW9uKSBzdG9wCiAgLSByZWNvcmRfdHlwZXM6IFNFUlZJQ0VfU1RPUAogICAgYWN0aW9uOiBzdG9wcGVkLXNlcnZpY2UKICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogdW5pdAogICAgICB3aGF0OiBzZXJ2aWNlCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLXByb2Nlc3MKICAgICAgdHlwZTogc3RvcAoKICAjIEF1ZGl0ZCBpbnRlcm5hbCBldmVudHMKCiAgIyBBVURJVF9DT05GSUdfQ0hBTkdFIC0gQXVkaXQgc3lzdGVtIGNvbmZpZ3VyYXRpb24gY2hhbmdlCiAgLSByZWNvcmRfdHlwZXM6IENPTkZJR19DSEFOR0UKICAgIGFjdGlvbjogY2hhbmdlZC1hdWRpdC1jb25maWd1cmF0aW9uCiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6CiAgICAgICAgW29wLCBrZXksIGF1ZGl0X2VuYWJsZWQsIGF1ZGl0X3BpZCwgYXVkaXRfYmFja2xvZ19saW1pdCwgYXVkaXRfZmFpbHVyZV0KICAgICAgd2hhdDogYXVkaXQtY29uZmlnCiAgICBlY3M6CiAgICAgIGNhdGVnb3J5OiBbcHJvY2VzcywgY29uZmlndXJhdGlvbl0KICAgICAgdHlwZTogY2hhbmdlCiAgIyBBVURJVF9EQUVNT05fQUJPUlQgLSBEYWVtb24gZXJyb3Igc3RvcCByZWNvcmQKICAtIHJlY29yZF90eXBlczogREFFTU9OX0FCT1JUCiAgICBhY3Rpb246IGFib3J0ZWQtYXVkaXRkLXN0YXJ0dXAKICAgIG9iamVjdDoKICAgICAgd2hhdDogc2VydmljZQogICAgZWNzOgogICAgICA8PDogKmVjcy1wcm9jZXNzCiAgICAgIHR5cGU6IHN0b3AKICAjIEFVRElUX0RBRU1PTl9BQ0NFUFQgLSBBdWRpdGQgYWNjZXB0ZWQgcmVtb3RlIGNvbm5lY3Rpb24KICAtIHJlY29yZF90eXBlczogREFFTU9OX0FDQ0VQVAogICAgYWN0aW9uOiByZW1vdGUtYXVkaXQtY29ubmVjdGVkCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHNlcnZpY2UKICAgIGVjczoKICAgICAgPDw6ICplY3MtbmV0d29yawogICAgICB0eXBlOgogICAgICAgIC0gY29ubmVjdGlvbgogICAgICAgIC0gc3RhcnQKICAjIEFVRElUX0RBRU1PTl9DTE9TRSAtIEF1ZGl0ZCBjbG9zZWQgcmVtb3RlIGNvbm5lY3Rpb24KICAtIHJlY29yZF90eXBlczogREFFTU9OX0NMT1NFCiAgICBhY3Rpb246IHJlbW90ZS1hdWRpdC1kaXNjb25uZWN0ZWQKICAgIG9iamVjdDoKICAgICAgd2hhdDogc2VydmljZQogICAgZWNzOgogICAgICA8PDogKmVjcy1uZXR3b3JrCiAgICAgIHR5cGU6CiAgICAgICAgLSBjb25uZWN0aW9uCiAgICAgICAgLSBzdGFydAogICMgQVVESVRfREFFTU9OX0NPTkZJRyAtIERhZW1vbiBjb25maWcgY2hhbmdlCiAgLSByZWNvcmRfdHlwZXM6IERBRU1PTl9DT05GSUcKICAgIGFjdGlvbjogY2hhbmdlZC1hdWRpdGQtY29uZmlndXJhdGlvbgogICAgb2JqZWN0OgogICAgICB3aGF0OiBzZXJ2aWNlCiAgICBlY3M6CiAgICAgIGNhdGVnb3J5OiBbcHJvY2VzcywgY29uZmlndXJhdGlvbl0KICAgICAgdHlwZTogY2hhbmdlCiAgIyBBVURJVF9EQUVNT05fRU5EIC0gRGFlbW9uIG5vcm1hbCBzdG9wIHJlY29yZAogIC0gcmVjb3JkX3R5cGVzOiBEQUVNT05fRU5ECiAgICBhY3Rpb246IHNodXRkb3duLWF1ZGl0CiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHNlcnZpY2UKICAgIGVjczoKICAgICAgPDw6ICplY3MtcHJvY2VzcwogICAgICB0eXBlOiBzdG9wCiAgIyBBVURJVF9EQUVNT05fRVJSIC0gQXVkaXRkIGludGVybmFsIGVycm9yCiAgLSByZWNvcmRfdHlwZXM6IERBRU1PTl9FUlIKICAgIGFjdGlvbjogYXVkaXQtZXJyb3IKICAgIG9iamVjdDoKICAgICAgd2hhdDogc2VydmljZQogICAgZWNzOiAqZWNzLXByb2Nlc3MKICAjIEFVRElUX0RBRU1PTl9SRUNPTkZJRyAtIEF1ZGl0ZCBzaG91bGQgcmVjb25maWd1cmUKICAtIHJlY29yZF90eXBlczogREFFTU9OX1JFQ09ORklHCiAgICBhY3Rpb246IHJlY29uZmlndXJlZC1hdWRpdGQKICAgIG9iamVjdDoKICAgICAgd2hhdDogc2VydmljZQogICAgZWNzOgogICAgICBjYXRlZ29yeTogW3Byb2Nlc3MsIGNvbmZpZ3VyYXRpb25dCiAgICAgIHR5cGU6IGluZm8KICAjIEFVRElUX0RBRU1PTl9SRVNVTUUgLSBBdWRpdGQgc2hvdWxkIHJlc3VtZSBsb2dnaW5nCiAgLSByZWNvcmRfdHlwZXM6IERBRU1PTl9SRVNVTUUKICAgIGFjdGlvbjogcmVzdW1lZC1hdWRpdC1sb2dnaW5nCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHNlcnZpY2UKICAgIGVjczoKICAgICAgPDw6ICplY3MtcHJvY2VzcwogICAgICB0eXBlOiBjaGFuZ2UKICAjIEFVRElUX0RBRU1PTl9ST1RBVEUgLSBBdWRpdGQgc2hvdWxkIHJvdGF0ZSBsb2dzCiAgLSByZWNvcmRfdHlwZXM6IERBRU1PTl9ST1RBVEUKICAgIGFjdGlvbjogcm90YXRlZC1hdWRpdC1sb2dzCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IHNlcnZpY2UKICAgIGVjczoKICAgICAgPDw6ICplY3MtcHJvY2VzcwogICAgICB0eXBlOiBjaGFuZ2UKICAjIEFVRElUX0RBRU1PTl9TVEFSVCAtIERhZW1vbiBzdGFydHVwIHJlY29yZAogIC0gcmVjb3JkX3R5cGVzOiBEQUVNT05fU1RBUlQKICAgIGFjdGlvbjogc3RhcnRlZC1hdWRpdAogICAgb2JqZWN0OgogICAgICB3aGF0OiBzZXJ2aWNlCiAgICBlY3M6CiAgICAgIDw8OiAqZWNzLXByb2Nlc3MKICAgICAgdHlwZTogc3RhcnQKICAjIEFVRElUX0tFUk5FTCAtIEFzeW5jaHJvbm91cyBhdWRpdCByZWNvcmQuIE5PVCBBIFJFUVVFU1QuCiAgLSByZWNvcmRfdHlwZXM6IEtFUk5FTAogICAgYWN0aW9uOiBpbml0aWFsaXplZC1hdWRpdC1zdWJzeXN0ZW0KICAgIGVjczogKmVjcy1wcm9jZXNzCgogICMgQ29uZmlndXJhdGlvbiBjaGFuZ2UgZXZlbnRzCgogICMgQVVESVRfVVNZU19DT05GSUcgLSBVc2VyIHNwYWNlIHN5c3RlbSBjb25maWcgY2hhbmdlCiAgLSByZWNvcmRfdHlwZXM6IFVTWVNfQ09ORklHCiAgICBhY3Rpb246IGNoYW5nZWQtY29uZmlndXJhdGlvbgogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiBvcAogICAgICB3aGF0OiBzeXN0ZW0KICAgIGVjczoKICAgICAgY2F0ZWdvcnk6IGNvbmZpZ3VyYXRpb24KICAgICAgdHlwZTogY2hhbmdlCiAgIyBBVURJVF9ORVRGSUxURVJfQ0ZHIC0gTmV0ZmlsdGVyIGNoYWluIG1vZGlmaWNhdGlvbnMKICAtIHJlY29yZF90eXBlczogTkVURklMVEVSX0NGRwogICAgYWN0aW9uOiBsb2FkZWQtZmlyZXdhbGwtcnVsZS10bwogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiB0YWJsZQogICAgICB3aGF0OiBmaXJld2FsbAogICAgZWNzOgogICAgICBjYXRlZ29yeTogY29uZmlndXJhdGlvbgogICAgICB0eXBlOiBjaGFuZ2UKICAjIEFVRElUX0ZFQVRVUkVfQ0hBTkdFIC0gYXVkaXQgbG9nIGxpc3RpbmcgZmVhdHVyZSBjaGFuZ2VzCiAgLSByZWNvcmRfdHlwZXM6IEZFQVRVUkVfQ0hBTkdFCiAgICBhY3Rpb246IGNoYW5nZWQtYXVkaXQtZmVhdHVyZQogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiBmZWF0dXJlCiAgICAgIHdoYXQ6IHN5c3RlbQogICAgZWNzOgogICAgICBjYXRlZ29yeTogY29uZmlndXJhdGlvbgogICAgICB0eXBlOiBjaGFuZ2UKICAjIEFVRElUX1JFUExBQ0UgLSBSZXBsYWNlIGF1ZGl0ZCBpZiB0aGlzIHBhY2tldCB1bmFuc3dlcmQKCiAgIyBUVFkgZXZlbnRzCgogIC0gcmVjb3JkX3R5cGVzOgogICAgICAjIEFVRElUX1RUWSAtIElucHV0IG9uIGFuIGFkbWluaXN0cmF0aXZlIFRUWQogICAgICAtIFRUWQogICAgICAjIEFVRElUX1VTRVJfVFRZIC0gTm9uLUlDQU5PTiBUVFkgaW5wdXQgbWVhbmluZwogICAgICAtIFVTRVJfVFRZCiAgICBhY3Rpb246IHR5cGVkCiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IGRhdGEKICAgICAgd2hhdDoga2V5c3Ryb2tlcwogICAgaG93OiBbY29tbSwgZXhlXQoKICAjIFBvbGljeSBldmVudHMKCiAgIyBBVURJVF9BVkMgLSBTRSBMaW51eCBhdmMgZGVuaWFsIG9yIGdyYW50IChzZWxpbnV4KQogIC0gcmVjb3JkX3R5cGVzOiBBVkMKICAgIGFjdGlvbjogdmlvbGF0ZWQtc2VsaW51eC1wb2xpY3kKICAgIHN1YmplY3Q6CiAgICAgIHByaW1hcnk6IHNjb250ZXh0CiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IHRjb250ZXh0CiAgICAgIHNlY29uZGFyeTogdGNsYXNzCiAgICBoYXNfZmllbGRzOgogICAgICAtIHNlcmVzdWx0CiAgIyBBVURJVF9BVkMgLSBTRSBMaW51eCBhdmMgZGVuaWFsIG9yIGdyYW50IChhcHBhcm1vcikKICAtIHJlY29yZF90eXBlczogQVZDCiAgICBhY3Rpb246IHZpb2xhdGVkLWFwcGFybW9yLXBvbGljeQogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiBvcGVyYXRpb24KICAgICAgc2Vjb25kYXJ5OiBbcmVxdWVzdGVkX21hc2ssIGRlbmllZF9tYXNrLCBjYXBuYW1lXQogICAgICB3aGF0OiBwb2xpY3kKICAgIGhhc19maWVsZHM6CiAgICAgIC0gYXBwYXJtb3IKICAjIEFVRElUX0ZTX1JFTEFCRUwgLSBGaWxlc3lzdGVtIHJlbGFiZWxlZAogIC0gcmVjb3JkX3R5cGVzOiBGU19SRUxBQkVMCiAgICBhY3Rpb246IHJlbGFiZWxlZC1maWxlc3lzdGVtCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IG1hYy1jb25maWcKICAjIEFVRElUX0xBQkVMX0xFVkVMX0NIQU5HRSAtIE9iamVjdCdzIGxldmVsIHdhcyBjaGFuZ2VkCiAgLSByZWNvcmRfdHlwZXM6IExBQkVMX0xFVkVMX0NIQU5HRQogICAgYWN0aW9uOiBtb2RpZmllZC1sZXZlbC1vZgogICAgb2JqZWN0OgogICAgICBwcmltYXJ5OiBwcmludGVyCiAgICAgIHdoYXQ6IHByaW50ZXIKICAjIEFVRElUX0xBQkVMX09WRVJSSURFIC0gQWRtaW4gaXMgb3ZlcnJpZGluZyBhIGxhYmVsCiAgLSByZWNvcmRfdHlwZXM6IExBQkVMX09WRVJSSURFCiAgICBhY3Rpb246IG92ZXJyb2RlLWxhYmVsLW9mCiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IG1hYy1jb25maWcKICAjIEFVRElUX01BQ19DSEVDSyAtIFVzZXIgc3BhY2UgTUFDIGRlY2lzaW9uIHJlc3VsdHMKICAtIHJlY29yZF90eXBlczogTUFDX0NIRUNLCiAgICBhY3Rpb246IG1hYy1wZXJtaXNzaW9uCiAgIyBBVURJVF9NQUNfQ09ORklHX0NIQU5HRSAtIENoYW5nZXMgdG8gYm9vbGVhbnMKICAtIHJlY29yZF90eXBlczogTUFDX0NPTkZJR19DSEFOR0UKICAgIGFjdGlvbjogY2hhbmdlZC1zZWxpbnV4LWJvb2xlYW4KICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogYm9vbAogICAgICB3aGF0OiBtYWMtY29uZmlnCiAgICBlY3M6CiAgICAgIGNhdGVnb3J5OiBjb25maWd1cmF0aW9uCiAgICAgIHR5cGU6IGNoYW5nZQogICMgQVVESVRfTUFDX1BPTElDWV9MT0FEIC0gUG9saWN5IGZpbGUgbG9hZAogIC0gcmVjb3JkX3R5cGVzOiBNQUNfUE9MSUNZX0xPQUQKICAgIGFjdGlvbjogbG9hZGVkLXNlbGludXgtcG9saWN5CiAgICBvYmplY3Q6CiAgICAgIHdoYXQ6IG1hYy1jb25maWcKICAgIGVjczoKICAgICAgY2F0ZWdvcnk6IGNvbmZpZ3VyYXRpb24KICAgICAgdHlwZTogYWNjZXNzCiAgIyBBVURJVF9NQUNfU1RBVFVTIC0gQ2hhbmdlZCBlbmZvcmNpbmcscGVybWlzc2l2ZSxvZmYKICAtIHJlY29yZF90eXBlczogTUFDX1NUQVRVUwogICAgYWN0aW9uOiBjaGFuZ2VkLXNlbGludXgtZW5mb3JjZW1lbnQKICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogZW5mb3JjaW5nCiAgICAgIHdoYXQ6IG1hYy1jb25maWcKICAgIGVjczoKICAgICAgY2F0ZWdvcnk6IGNvbmZpZ3VyYXRpb24KICAgICAgdHlwZTogY2hhbmdlCiAgIyBBVURJVF9VU0VSX0FWQyAtIFVzZXIgc3BhY2UgYXZjIG1lc3NhZ2UKICAtIHJlY29yZF90eXBlczogVVNFUl9BVkMKICAgIGFjdGlvbjogYWNjZXNzLXBlcm1pc3Npb24KICAjIEFVRElUX1VTRVJfTUFDX0NPTkZJR19DSEFOR0UgLSBDaGFuZ2UgbWFkZSB0byBNQUMgcG9saWN5CiAgLSByZWNvcmRfdHlwZXM6IFVTRVJfTUFDX0NPTkZJR19DSEFOR0UKICAgIGFjdGlvbjogY2hhbmdlZC1tYWMtY29uZmlndXJhdGlvbgogICAgb2JqZWN0OgogICAgICB3aGF0OiBtYWMtY29uZmlnCiAgICBlY3M6CiAgICAgIGNhdGVnb3J5OiBjb25maWd1cmF0aW9uCiAgICAgIHR5cGU6IGNoYW5nZQogICMgQVVESVRfVVNFUl9NQUNfUE9MSUNZX0xPQUQgLSBVc2Vyc3BjIGRhZW1vbiBsb2FkZWQgcG9saWMKICAtIHJlY29yZF90eXBlczogVVNFUl9NQUNfUE9MSUNZX0xPQUQKICAgIGFjdGlvbjogbG9hZGVkLW1hYy1wb2xpY3kKICAgIG9iamVjdDoKICAgICAgd2hhdDogbWFjLWNvbmZpZwogICAgZWNzOgogICAgICBjYXRlZ29yeTogY29uZmlndXJhdGlvbgogICAgICB0eXBlOiBhY2Nlc3MKICAjIEFVRElUX1VTRVJfU0VMSU5VWF9FUlIgLSBTRSBMaW51eCB1c2VyIHNwYWNlIGVycm9yCiAgLSByZWNvcmRfdHlwZXM6IFVTRVJfU0VMSU5VWF9FUlIKICAgIGFjdGlvbjogYWNjZXNzLWVycm9yCiAgIyBBVURJVF9TRUNDT01QIC0gU2VjdXJlIENvbXB1dGluZyBldmVudAogIC0gcmVjb3JkX3R5cGVzOiBTRUNDT01QCiAgICBhY3Rpb246IHZpb2xhdGVkLXNlY2NvbXAtcG9saWN5CiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IHN5c2NhbGwKICAgICAgd2hhdDogcHJvY2VzcwogICMgQVVESVRfU0VMSU5VWF9FUlIgLSBJbnRlcm5hbCBTRSBMaW51eCBFcnJvcnMKICAtIGFjdGlvbjogY2F1c2VkLW1hYy1wb2xpY3ktZXJyb3IKICAgIG9iamVjdDoKICAgICAgd2hhdDogc3lzdGVtCiAgICByZWNvcmRfdHlwZXM6IFNFTElOVVhfRVJSCiAgIyBBVURJVF9BUFBBUk1PUl9BTExPV0VECiAgIyBBVURJVF9BUFBBUk1PUl9ERU5JRUQKICAjIEFVRElUX0FQUEFSTU9SX0VSUk9SCiAgIyBBVURJVF9BVkNfUEFUSCAtIGRlbnRyeSwgdmZzbW91bnQgcGFpciBmcm9tIGF2YwogICMgQVVESVRfQVBQQVJNT1JfQVVESVQKICAjIEFVRElUX0FQUEFSTU9SX0hJTlQKICAjIEFVRElUX0FQUEFSTU9SX1NUQVRVUwogICMgQVVESVRfQVBQQVJNT1JfRVJST1IKICAjIEFVRElUX0RFVl9BTExPQyAtIERldmljZSB3YXMgYWxsb2NhdGVkCiAgIyBBVURJVF9ERVZfREVBTExPQyAtIERldmljZSB3YXMgZGVhbGxvY2F0ZWQKICAjIEFVRElUX01BQ19VTkxCTF9BTExPVyAtIE5ldExhYmVsOiBhbGxvdyB1bmxhYmVsZWQgdHJhZmZpYwogICMgQVVESVRfTUFDX0NJUFNPVjRfQUREIC0gTmV0TGFiZWw6IGFkZCBDSVBTT3Y0IERPSSBlbnRyeQogICMgQVVESVRfTUFDX0NJUFNPVjRfREVMIC0gTmV0TGFiZWw6IGRlbCBDSVBTT3Y0IERPSSBlbnRyeQogICMgQVVESVRfTUFDX01BUF9BREQgLSBOZXRMYWJlbDogYWRkIExTTSBkb21haW4gbWFwcGluZwogICMgQVVESVRfTUFDX01BUF9ERUwgLSBOZXRMYWJlbDogZGVsIExTTSBkb21haW4gbWFwcGluZwogICMgQVVESVRfTUFDX0lQU0VDX0VWRU5UIC0gQXVkaXQgYW4gSVBTZWMgZXZlbnQKICAjIEFVRElUX01BQ19VTkxCTF9TVENBREQgLSBOZXRMYWJlbDogYWRkIGEgc3RhdGljIGxhYmVsCiAgIyBBVURJVF9NQUNfVU5MQkxfU1RDREVMIC0gTmV0TGFiZWw6IGRlbCBhIHN0YXRpYyBsYWJlbAogICMgQVVESVRfTUFDX0NBTElQU09fQUREIC0gTmV0TGFiZWw6IGFkZCBDQUxJUFNPIERPSSBlbnRyeQogICMgQVVESVRfTUFDX0NBTElQU09fREVMIC0gTmV0TGFiZWw6IGRlbCBDQUxJUFNPIERPSSBlbnRyeQogICMgQVVESVRfVVNFUl9MQUJFTEVEX0VYUE9SVCAtIE9iamVjdCBleHBvcnRlZCB3aXRoIGxhYmVsCiAgIyBBVURJVF9VU0VSX1VOTEFCRUxFRF9FWFBPUlQgLSBPYmplY3QgZXhwb3J0ZWQgd2l0aG91dCBsYWJlbAoKICAjIENyeXB0byBldmVudHMKCiAgLSA8PDogKm1hY3JvLXVzZXItc2Vzc2lvbgogICAgYWN0aW9uOiBuZWdvdGlhdGVkLWNyeXB0by1rZXkKICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogZnAKICAgICAgc2Vjb25kYXJ5OiBbYWRkciwgaG9zdG5hbWVdCiAgICAgIHdoYXQ6IHVzZXItc2Vzc2lvbgogICAgcmVjb3JkX3R5cGVzOiBDUllQVE9fS0VZX1VTRVIKICAgIHNvdXJjZV9pcDogW2FkZHJdCiAgICBlY3M6ICplY3MtcHJvY2VzcwogIC0gYWN0aW9uOiBjcnlwdG8tb2ZmaWNlci1sb2dnZWQtaW4KICAgIHJlY29yZF90eXBlczogQ1JZUFRPX0xPR0lOCiAgLSBhY3Rpb246IGNyeXB0by1vZmZpY2VyLWxvZ2dlZC1vdXQKICAgIHJlY29yZF90eXBlczogQ1JZUFRPX0xPR09VVAogICAgZWNzOiAqZWNzLXByb2Nlc3MKICAtIDw8OiAqbWFjcm8tdXNlci1zZXNzaW9uCiAgICBhY3Rpb246IHN0YXJ0ZWQtY3J5cHRvLXNlc3Npb24KICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogYWRkcgogICAgICBzZWNvbmRhcnk6IFtycG9ydF0KICAgIHJlY29yZF90eXBlczogQ1JZUFRPX1NFU1NJT04KICAgIHNvdXJjZV9pcDogW2FkZHJdCiAgICBlY3M6ICplY3MtcHJvY2VzcwogIC0gYWN0aW9uOiBhY2Nlc3MtcmVzdWx0CiAgICByZWNvcmRfdHlwZXM6IERBQ19DSEVDSwoKICAjIEFub21hbGllcwoKICAjIEFVRElUX0FOT01fQUJFTkQgLSBQcm9jZXNzIGVuZGVkIGFibm9ybWFsbHkKICAtIHJlY29yZF90eXBlczogQU5PTV9BQkVORAogICAgYWN0aW9uOiBjcmFzaGVkLXByb2dyYW0KICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogW2NvbW0sIGV4ZV0KICAgICAgc2Vjb25kYXJ5OiBwaWQKICAgICAgd2hhdDogcHJvY2VzcwogICAgaG93OiBzaWcKICAgIGVjczoKICAgICAgIyBjb25zaWRlciBhZGRpbmcgYW4gYW5vbWFseSBjYXRlZ29yeSB3aGVuIHdlIGludHJvZHVjZQogICAgICAjIHRvIEVDUwogICAgICA8PDogKmVjcy1wcm9jZXNzCiAgICAgIHR5cGU6IGVuZAogICMgQVVESVRfQU5PTV9FWEVDIC0gRXhlY3V0aW9uIG9mIGZpbGUKICAtIHJlY29yZF90eXBlczogQU5PTV9FWEVDCiAgICBhY3Rpb246IGF0dGVtcHRlZC1leGVjdXRpb24tb2YtZm9yYmlkZGVuLXByb2dyYW0KICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogY21kCiAgICAgIHdoYXQ6IHByb2Nlc3MKICAgIGhvdzogdGVybWluYWwKICAgIGVjczoKICAgICAgIyBjb25zaWRlciBhZGRpbmcgYW4gYW5vbWFseSBjYXRlZ29yeSB3aGVuIHdlIGludHJvZHVjZQogICAgICAjIHRvIEVDUwogICAgICA8PDogKmVjcy1wcm9jZXNzCiAgICAgIHR5cGU6IHN0YXJ0CiAgIyBBVURJVF9BTk9NX0xJTksgLSBTdXNwaWNpb3VzIHVzZSBvZiBmaWxlIGxpbmtzCiAgLSByZWNvcmRfdHlwZXM6IEFOT01fTElOSwogICAgYWN0aW9uOiB1c2VkLXN1c3BpY2lvdXMtbGluawogICMgQVVESVRfQU5PTV9MT0dJTl9GQUlMVVJFUyAtIEZhaWxlZCBsb2dpbiBsaW1pdCByZWFjaGVkCiAgLSA8PDogKm1hY3JvLXVzZXItc2Vzc2lvbgogICAgcmVjb3JkX3R5cGVzOiBBTk9NX0xPR0lOX0ZBSUxVUkVTCiAgICBhY3Rpb246IGZhaWxlZC1sb2ctaW4tdG9vLW1hbnktdGltZXMtdG8KICAjIEFVRElUX0FOT01fTE9HSU5fTE9DQVRJT04gLSBMb2dpbiBmcm9tIGZvcmJpZGRlbiBsb2NhdGlvbgogIC0gPDw6ICptYWNyby11c2VyLXNlc3Npb24KICAgIHJlY29yZF90eXBlczogQU5PTV9MT0dJTl9MT0NBVElPTgogICAgYWN0aW9uOiBhdHRlbXB0ZWQtbG9nLWluLWZyb20tdW51c3VhbC1wbGFjZS10bwogICMgQVVESVRfQU5PTV9MT0dJTl9TRVNTSU9OUyAtIE1heCBjb25jdXJyZW50IHNlc3Npb25zIHJlYWNoZWQKICAtIDw8OiAqbWFjcm8tdXNlci1zZXNzaW9uCiAgICByZWNvcmRfdHlwZXM6IEFOT01fTE9HSU5fU0VTU0lPTlMKICAgIGFjdGlvbjogb3BlbmVkLXRvby1tYW55LXNlc3Npb25zLXRvCiAgIyBBVURJVF9BTk9NX0xPR0lOX1RJTUUgLSBMb2dpbiBhdHRlbXB0ZWQgYXQgYmFkIHRpbWUKICAtIDw8OiAqbWFjcm8tdXNlci1zZXNzaW9uCiAgICByZWNvcmRfdHlwZXM6IEFOT01fTE9HSU5fVElNRQogICAgYWN0aW9uOiBhdHRlbXB0ZWQtbG9nLWluLWR1cmluZy11bnVzdWFsLWhvdXItdG8KICAjIEFVRElUX0FOT01fUFJPTUlTQ1VPVVMgLSBEZXZpY2UgY2hhbmdlZCBwcm9taXNjdW91cyBtb2RlCiAgLSByZWNvcmRfdHlwZXM6IEFOT01fUFJPTUlTQ1VPVVMKICAgIGFjdGlvbjogY2hhbmdlZC1wcm9taXNjdW91cy1tb2RlLW9uLWRldmljZSAjIENvdWxkIGJlIGVudGVyZWQgb3IgZXhpdGVkIGJhc2VkIG9uIHByb20gZmllbGQuCiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IGRldgogICAgICB3aGF0OiBuZXR3b3JrLWRldmljZQogICMgQVVESVRfQU5PTV9SQkFDX0lOVEVHUklUWV9GQUlMIC0gUkJBQyBmaWxlIGludGVncml0eSBmYWlsdXJlCiAgLSByZWNvcmRfdHlwZXM6IEFOT01fUkJBQ19JTlRFR1JJVFlfRkFJTAogICAgYWN0aW9uOiB0ZXN0ZWQtZmlsZS1zeXN0ZW0taW50ZWdyaXR5LW9mCiAgICBvYmplY3Q6CiAgICAgIHByaW1hcnk6IGhvc3RuYW1lCiAgICAgIHdoYXQ6IGZpbGVzeXN0ZW0KICAjIEFVRElUX0FOT01fTE9HSU5fQUNDVCAtIExvZ2luIGF0dGVtcHRlZCB0byB3YXRjaGVkIGFjY3QKICAjIEFVRElUX0FOT01fTUFYX0RBQyAtIE1heCBEQUMgZmFpbHVyZXMgcmVhY2hlZAogICMgQVVESVRfQU5PTV9NQVhfTUFDIC0gTWF4IE1BQyBmYWlsdXJlcyByZWFjaGVkCiAgIyBBVURJVF9BTk9NX0FNVFVfRkFJTCAtIEFNVFUgZmFpbHVyZQogICMgQVVESVRfQU5PTV9SQkFDX0ZBSUwgLSBSQkFDIHNlbGYgdGVzdCBmYWlsdXJlCiAgIyBBVURJVF9BTk9NX0NSWVBUT19GQUlMIC0gQ3J5cHRvIHN5c3RlbSB0ZXN0IGZhaWx1cmUKICAjIEFVRElUX0FOT01fTUtfRVhFIC0gTWFrZSBhbiBleGVjdXRhYmxlCiAgIyBBVURJVF9BTk9NX0FDQ0VTU19GUyAtIEFjY2VzcyBvZiBmaWxlIG9yIGRpcgogICMgQVVESVRfQU5PTV9BRERfQUNDVCAtIEFkZGluZyBhbiBhY2N0CiAgIyBBVURJVF9BTk9NX0RFTF9BQ0NUIC0gRGVsZXRpbmcgYW4gYWNjdAogICMgQVVESVRfQU5PTV9NT0RfQUNDVCAtIENoYW5naW5nIGFuIGFjY3QKICAjIEFVRElUX0FOT01fUk9PVF9UUkFOUyAtIFVzZXIgYmVjYW1lIHJvb3QKICAjIEFVRElUX0FOT01fTE9HSU5fU0VSVklDRSAtIFNlcnZpY2UgYWNjdCBhdHRlbXB0ZWQgbG9naW4KCiAgIyBBbm9tYWx5IHJlc3BvbnNlcwoKICAjIEFVRElUX1JFU1BfQU5PTUFMWSAtIEFub21hbHkgbm90IHJlYWN0ZWQgdG8KICAjIEFVRElUX1JFU1BfQUxFUlQgLSBBbGVydCBlbWFpbCB3YXMgc2VudAogICMgQVVESVRfUkVTUF9LSUxMX1BST0MgLSBLaWxsIHByb2dyYW0KICAjIEFVRElUX1JFU1BfVEVSTV9BQ0NFU1MgLSBUZXJtaW5hdGUgc2Vzc2lvbgogICMgQVVESVRfUkVTUF9BQ0NUX1JFTU9URSAtIEFjY3QgbG9ja2VkIGZyb20gcmVtb3RlIGFjY2VzcwogICMgQVVESVRfUkVTUF9BQ0NUX0xPQ0tfVElNRUQgLSBVc2VyIGFjY3QgbG9ja2VkIGZvciB0aW1lCiAgIyBBVURJVF9SRVNQX0FDQ1RfVU5MT0NLX1RJTUVEIC0gVXNlciBhY2N0IHVubG9ja2VkIGZyb20gdGltZQogICMgQVVESVRfUkVTUF9BQ0NUX0xPQ0sgLSBVc2VyIGFjY3Qgd2FzIGxvY2tlZAogICMgQVVESVRfUkVTUF9URVJNX0xPQ0sgLSBUZXJtaW5hbCB3YXMgbG9ja2VkCiAgIyBBVURJVF9SRVNQX1NFQk9PTCAtIFNldCBhbiBTRSBMaW51eCBib29sZWFuCiAgIyBBVURJVF9SRVNQX0VYRUMgLSBFeGVjdXRlIGEgc2NyaXB0CiAgIyBBVURJVF9SRVNQX1NJTkdMRSAtIEdvIHRvIHNpbmdsZSB1c2VyIG1vZGUKICAjIEFVRElUX1JFU1BfSEFMVCAtIHRha2UgdGhlIHN5c3RlbSBkb3duCiAgIyBBVURJVF9SRVNQX09SSUdJTl9CTE9DSyAtIEFkZHJlc3MgYmxvY2tlZCBieSBpcHRhYmxlcwogICMgQVVESVRfUkVTUF9PUklHSU5fQkxPQ0tfVElNRUQgLSBBZGRyZXNzIGJsb2NrZWQgZm9yIHRpbWUKCiAgIyBBdWRpdCBydWxlIGV2ZW50cwoKICAjIEFVRElUX1NZU0NBTEwgLSBTeXNjYWxsIGV2ZW50CiAgIyBBVURJVF9QQVRIIC0gRmlsZW5hbWUgcGF0aCBpbmZvcm1hdGlvbgogICMgQVVESVRfSVBDIC0gSVBDIHJlY29yZAogICMgQVVESVRfU09DS0VUQ0FMTCAtIHN5c19zb2NrZXRjYWxsIGFyZ3VtZW50cwogICMgQVVESVRfU09DS0FERFIgLSBzb2NrYWRkciBjb3BpZWQgYXMgc3lzY2FsbCBhcmcKICAjIEFVRElUX0NXRCAtIEN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKICAjIEFVRElUX0VYRUNWRSAtIGV4ZWN2ZSBhcmd1bWVudHMKICAjIEFVRElUX0lQQ19TRVRfUEVSTSAtIElQQyBuZXcgcGVybWlzc2lvbnMgcmVjb3JkIHR5cGUKICAjIEFVRElUX01RX09QRU4gLSBQT1NJWCBNUSBvcGVuIHJlY29yZCB0eXBlCiAgIyBBVURJVF9NUV9TRU5EUkVDVi0gUE9TSVggTVEgc2VuZC9yZWNlaXZlIHJlY29yZCB0eXBlCiAgIyBBVURJVF9NUV9OT1RJRlkgLSBQT1NJWCBNUSBub3RpZnkgcmVjb3JkIHR5cGUKICAjIEFVRElUX01RX0dFVFNFVEFUVFIgLSBQT1NJWCBNUSBnZXQvc2V0IGF0dHJpYnV0ZSByZWNvcmQgdHlwZQogICMgQVVESVRfRkRfUEFJUiAtIGF1ZGl0IHJlY29yZCBmb3IgcGlwZS9zb2NrZXRwYWlyCiAgIyBBVURJVF9PQkpfUElEIC0gcHRyYWNlIHRhcmdldAogICMgQVVESVRfQlBSTV9GQ0FQUyAtIEluZm9ybWF0aW9uIGFib3V0IGZjYXBzIGluY3JlYXNpbmcgcGVybXMKICAjIEFVRElUX0NBUFNFVCAtIFJlY29yZCBzaG93aW5nIGFyZ3VtZW50IHRvIHN5c19jYXBzZXQKICAjIEFVRElUX01NQVAgLSBSZWNvcmQgc2hvd2luZyBkZXNjcmlwdG9yIGFuZCBmbGFncyBpbiBtbWFwCiAgIyBBVURJVF9ORVRGSUxURVJfUEtUIC0gUGFja2V0cyB0cmF2ZXJzaW5nIG5ldGZpbHRlciBjaGFpbnMKCiAgIyBJbnRlZ3JpdHkgY2hlY2tzCgogICMgQVVESVRfSU5URUdSSVRZX0RBVEEgLSBEYXRhIGludGVncml0eSB2ZXJpZmljYXRpb24KICAjIEFVRElUX0lOVEVHUklUWV9NRVRBREFUQSAtIE1ldGFkYXRhIGludGVncml0eSB2ZXJpZmljYXRpb24KICAjIEFVRElUX0lOVEVHUklUWV9TVEFUVVMgLSBJbnRlZ3JpdHkgZW5hYmxlIHN0YXR1cwogICMgQVVESVRfSU5URUdSSVRZX0hBU0ggLSBJbnRlZ3JpdHkgSEFTSCB0eXBlCiAgIyBBVURJVF9JTlRFR1JJVFlfUENSIC0gUENSIGludmFsaWRhdGlvbiBtc2dzCiAgIyBBVURJVF9JTlRFR1JJVFlfUlVMRSAtIFBvbGljeSBydWxlCgogICMgVmFyaW91cwoKICAjIEFVRElUX1VTRVIgLSBNZXNzYWdlIGZyb20gdXNlcnNwYWNlIC0tIGRlcHJlY2F0ZWQKICAtIHJlY29yZF90eXBlczogVVNFUgogICAgYWN0aW9uOiBzZW50LW1lc3NhZ2UKICAgIG9iamVjdDoKICAgICAgcHJpbWFyeTogYWRkcgoKICAjIEFVRElUX1NPRlRXQVJFX1VQREFURSAtIFBhY2thZ2UgbWFuYWdlbWVudAogIC0gcmVjb3JkX3R5cGVzOiBTT0ZUV0FSRV9VUERBVEUKICAgIGFjdGlvbjogcGFja2FnZS11cGRhdGVkCiAgICBlY3M6CiAgICAgIGNhdGVnb3J5OiBwYWNrYWdlCiAgICAgIHR5cGU6IGluZm8K")
 		assets["normalizationData"] = value
 	}
 
diff --git a/auparse/auparse.go b/auparse/auparse.go
index 74c9271..34a0e57 100644
--- a/auparse/auparse.go
+++ b/auparse/auparse.go
@@ -317,6 +317,7 @@ func trimQuotesAndSpace(v string) string { return strings.Trim(v, `'" `) }
 
 func enrichData(msg *AuditMessage) error {
 	normalizeUnsetID("auid", msg.fields)
+	normalizeUnsetID("old-auid", msg.fields)
 	normalizeUnsetID("ses", msg.fields)
 
 	// Many different message types can have subj field so check them all.
diff --git a/rule/rule.go b/rule/rule.go
index afd6115..51bc142 100644
--- a/rule/rule.go
+++ b/rule/rule.go
@@ -364,7 +364,7 @@ func addFileWatch(data *ruleData, rule *FileWatchRule) error {
 
 func addKeys(data *ruleData, keys []string) error {
 	if len(keys) > 0 {
-		key := strings.Join(keys, string(keySeparator))
+		key := strings.Join(keys, string(rune(keySeparator)))
 		if err := addFilter(data, "key", "=", key); err != nil {
 			return errors.Wrapf(err, "failed to add keys [%v]", strings.Join(keys, ","))
 		}


Test patch:
diff --git a/aucoalesce/id_lookup_test.go b/aucoalesce/id_lookup_test.go
index 11e59c3..64c79ec 100644
--- a/aucoalesce/id_lookup_test.go
+++ b/aucoalesce/id_lookup_test.go
@@ -19,36 +19,88 @@ package aucoalesce
 
 import (
 	"os"
+	"os/user"
 	"strconv"
 	"testing"
+
+	"github.com/stretchr/testify/assert"
 )
 
 func TestUIDLookup(t *testing.T) {
 	uid := os.Getuid()
-	user := userLookup.LookupUID(strconv.Itoa(uid))
-	user = userLookup.LookupUID(strconv.Itoa(uid))
+	user := userLookup.LookupID(strconv.Itoa(uid))
+	user = userLookup.LookupID(strconv.Itoa(uid))
 	gid := os.Getgid()
-	group := groupLookup.LookupGID(strconv.Itoa(gid))
-	group = groupLookup.LookupGID(strconv.Itoa(gid))
+	group := groupLookup.LookupID(strconv.Itoa(gid))
+	group = groupLookup.LookupID(strconv.Itoa(gid))
 
 	t.Log(user, group)
 }
 
 func TestResolveIDs(t *testing.T) {
-	auid := strconv.Itoa(os.Getuid())
+	usr, err := user.Current()
+	if err != nil {
+		t.Fatal(err)
+	}
+	group, err := user.LookupGroupId(usr.Gid)
+	if err != nil {
+		t.Fatal(err)
+	}
 	event := &Event{
 		User: User{
 			IDs: map[string]string{
-				"auid": auid,
-				"gid":  strconv.Itoa(os.Getgid()),
+				"auid": usr.Uid,
+				"gid":  usr.Gid,
 			},
 		},
 		Summary: Summary{
 			Actor: Actor{
-				Primary: auid,
+				Primary: usr.Uid,
+			},
+		},
+		ECS: ECSFields{
+			User: ECSEntity{
+				ECSEntityData: ECSEntityData{
+					ID: usr.Uid,
+				},
+				Effective: ECSEntityData{
+					Name: usr.Username,
+				},
 			},
 		},
 	}
+
 	ResolveIDs(event)
 	t.Logf("%+v", event)
+	assert.Equal(t, usr.Username, event.User.Names["auid"])
+	assert.Equal(t, group.Name, event.User.Names["gid"])
+	assert.Equal(t, usr.Username, event.Summary.Actor.Primary)
+	assert.Equal(t, usr.Uid, event.ECS.User.ID)
+	assert.Equal(t, usr.Username, event.ECS.User.Name)
+	assert.Equal(t, usr.Uid, event.ECS.User.Effective.ID)
+	assert.Equal(t, usr.Username, event.ECS.User.Effective.Name)
+}
+
+func TestNameLookup(t *testing.T) {
+	usr, err := user.Current()
+	if err != nil {
+		t.Fatal(err)
+	}
+	group, err := user.LookupGroupId(usr.Gid)
+	if err != nil {
+		t.Fatal(err)
+	}
+	assert.Equal(t, usr.Uid, userLookup.LookupName(usr.Username))
+	assert.Equal(t, group.Gid, groupLookup.LookupName(group.Name))
+}
+
+func TestHardcoded(t *testing.T) {
+	usr := user.User{Uid: "42", Username: "auditbeat_user"}
+	grp := user.Group{Gid: "43", Name: "auditbeat_group"}
+	HardcodeUsers(usr)
+	HardcodeGroups(grp)
+	assert.Equal(t, usr.Username, userLookup.LookupID(usr.Uid))
+	assert.Equal(t, usr.Uid, userLookup.LookupName(usr.Username))
+	assert.Equal(t, grp.Name, groupLookup.LookupID(grp.Gid))
+	assert.Equal(t, grp.Gid, groupLookup.LookupName(grp.Name))
 }
diff --git a/aucoalesce/testdata/random-internet.json.golden b/aucoalesce/testdata/random-internet.json.golden
index fe40295..98db480 100644
--- a/aucoalesce/testdata/random-internet.json.golden
+++ b/aucoalesce/testdata/random-internet.json.golden
@@ -50,7 +50,13 @@
           "type": [
             "end"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   }
diff --git a/aucoalesce/testdata/rhel-7-linux-3.10.0.json.golden b/aucoalesce/testdata/rhel-7-linux-3.10.0.json.golden
index 2612dc2..8b805e6 100644
--- a/aucoalesce/testdata/rhel-7-linux-3.10.0.json.golden
+++ b/aucoalesce/testdata/rhel-7-linux-3.10.0.json.golden
@@ -46,7 +46,13 @@
           "type": [
             "change"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -94,7 +100,13 @@
           "type": [
             "change"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -158,7 +170,13 @@
           "type": [
             "info"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -227,7 +245,13 @@
           "type": [
             "info"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -242,7 +266,7 @@
       "session": "1",
       "summary": {
         "actor": {
-          "primary": "4294967295",
+          "primary": "unset",
           "secondary": "0"
         },
         "action": "changed-login-id-to",
@@ -254,7 +278,7 @@
       "user": {
         "ids": {
           "auid": "1000",
-          "old-auid": "4294967295",
+          "old-auid": "unset",
           "uid": "0"
         },
         "selinux": {
@@ -279,7 +303,16 @@
           "type": [
             "start"
           ]
-        }
+        },
+        "user": {
+          "id": "unset",
+          "effective": {
+            "id": "1000"
+          },
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -341,7 +374,16 @@
           "type": [
             "start"
           ]
-        }
+        },
+        "user": {
+          "id": "unset",
+          "effective": {
+            "name": "root"
+          },
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -396,7 +438,16 @@
           "type": [
             "end"
           ]
-        }
+        },
+        "user": {
+          "id": "1000",
+          "effective": {
+            "id": "1000"
+          },
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     },
     "warnings": [
@@ -470,7 +521,13 @@
           "type": [
             "change"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -588,7 +645,13 @@
           "type": [
             "creation"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -696,7 +759,13 @@
           "type": [
             "creation"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   }
diff --git a/aucoalesce/testdata/ubuntu-16.04-linux-4.13.0.json.golden b/aucoalesce/testdata/ubuntu-16.04-linux-4.13.0.json.golden
index 0a2d2e1..86c55ab 100644
--- a/aucoalesce/testdata/ubuntu-16.04-linux-4.13.0.json.golden
+++ b/aucoalesce/testdata/ubuntu-16.04-linux-4.13.0.json.golden
@@ -65,7 +65,13 @@
           "type": [
             "info"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     },
     "warnings": [
@@ -187,7 +193,13 @@
           "type": [
             "deletion"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     },
     "warnings": [
diff --git a/aucoalesce/testdata/ubuntu-16.10-linux-4.8.0.json.golden b/aucoalesce/testdata/ubuntu-16.10-linux-4.8.0.json.golden
index 4e3ab55..ab85f38 100644
--- a/aucoalesce/testdata/ubuntu-16.10-linux-4.8.0.json.golden
+++ b/aucoalesce/testdata/ubuntu-16.10-linux-4.8.0.json.golden
@@ -65,7 +65,13 @@
           "type": [
             "info"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -110,7 +116,13 @@
           "type": [
             "change"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -156,7 +168,13 @@
           "type": [
             "change"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -260,7 +278,13 @@
           "type": [
             "start"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -328,7 +352,13 @@
             "change",
             "info"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -375,7 +405,13 @@
           "type": [
             "start"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -418,12 +454,21 @@
       "ecs": {
         "event": {
           "category": [
-            "authentication"
+            "session"
           ],
           "type": [
-            "info"
+            "end"
           ]
-        }
+        },
+        "user": {
+          "id": "0",
+          "effective": {
+            "name": "root"
+          },
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     },
     "warnings": [
@@ -481,7 +526,16 @@
           "type": [
             "start"
           ]
-        }
+        },
+        "user": {
+          "id": "unset",
+          "effective": {
+            "name": "(invalid user)"
+          },
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -537,7 +591,16 @@
           "type": [
             "start"
           ]
-        }
+        },
+        "user": {
+          "id": "1001",
+          "effective": {
+            "id": "1001"
+          },
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -588,12 +651,21 @@
       "ecs": {
         "event": {
           "category": [
-            "authentication"
+            "session"
           ],
           "type": [
-            "info"
+            "start"
           ]
-        }
+        },
+        "user": {
+          "id": "1001",
+          "effective": {
+            "name": "andrew_kroh"
+          },
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -671,7 +743,13 @@
             "connection",
             "start"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -736,7 +814,13 @@
           "type": [
             "change"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -814,7 +898,13 @@
             "connection",
             "start"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -879,7 +969,13 @@
           "type": [
             "start"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   }
diff --git a/aucoalesce/testdata/ubuntu-17.04-linux-4.10.0.json.golden b/aucoalesce/testdata/ubuntu-17.04-linux-4.10.0.json.golden
index 8f85928..93c462a 100644
--- a/aucoalesce/testdata/ubuntu-17.04-linux-4.10.0.json.golden
+++ b/aucoalesce/testdata/ubuntu-17.04-linux-4.10.0.json.golden
@@ -43,7 +43,16 @@
           "type": [
             "info"
           ]
-        }
+        },
+        "user": {
+          "id": "unset",
+          "effective": {
+            "name": "root"
+          },
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     },
     "warnings": [
@@ -94,7 +103,16 @@
           "type": [
             "info"
           ]
-        }
+        },
+        "user": {
+          "id": "0",
+          "effective": {
+            "name": "root"
+          },
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     },
     "warnings": [
@@ -203,7 +221,13 @@
           "type": [
             "start"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -251,7 +275,16 @@
           "type": [
             "info"
           ]
-        }
+        },
+        "user": {
+          "id": "unset",
+          "effective": {
+            "name": "root"
+          },
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     },
     "warnings": [
@@ -302,7 +335,16 @@
           "type": [
             "info"
           ]
-        }
+        },
+        "user": {
+          "id": "1001",
+          "effective": {
+            "name": "root"
+          },
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     },
     "warnings": [
@@ -354,7 +396,18 @@
             "user",
             "change"
           ]
-        }
+        },
+        "user": {
+          "id": "1001",
+          "effective": {
+            "id": "1002"
+          },
+          "target": {
+            "name": "akroh"
+          },
+          "changes": {}
+        },
+        "group": {}
       }
     },
     "warnings": [
@@ -403,7 +456,13 @@
           "type": [
             "start"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -446,12 +505,21 @@
       "ecs": {
         "event": {
           "category": [
-            "authentication"
+            "session"
           ],
           "type": [
-            "info"
+            "end"
           ]
-        }
+        },
+        "user": {
+          "id": "0",
+          "effective": {
+            "name": "root"
+          },
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     },
     "warnings": [
@@ -509,7 +577,16 @@
           "type": [
             "info"
           ]
-        }
+        },
+        "user": {
+          "id": "unset",
+          "effective": {
+            "id": "0"
+          },
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -564,7 +641,16 @@
           "type": [
             "start"
           ]
-        }
+        },
+        "user": {
+          "id": "unset",
+          "effective": {
+            "name": "(invalid user)"
+          },
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -607,12 +693,21 @@
       "ecs": {
         "event": {
           "category": [
-            "authentication"
+            "session"
           ],
           "type": [
-            "info"
+            "start"
           ]
-        }
+        },
+        "user": {
+          "id": "0",
+          "effective": {
+            "name": "root"
+          },
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     },
     "warnings": [
@@ -681,7 +776,13 @@
           "type": [
             "info"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -746,7 +847,13 @@
           "type": [
             "info"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -867,7 +974,13 @@
           "type": [
             "change"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   },
@@ -966,7 +1079,13 @@
           "type": [
             "deletion"
           ]
-        }
+        },
+        "user": {
+          "effective": {},
+          "target": {},
+          "changes": {}
+        },
+        "group": {}
       }
     }
   }
diff --git a/auparse/testdata/audit-rhel7.log.golden b/auparse/testdata/audit-rhel7.log.golden
index 1b05d82..c0d640a 100644
--- a/auparse/testdata/audit-rhel7.log.golden
+++ b/auparse/testdata/audit-rhel7.log.golden
@@ -306,7 +306,7 @@
     "raw_msg": "audit(1481077043.057:414): pid=1298 uid=0 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 old-auid=4294967295 auid=1000 old-ses=4294967295 ses=1 res=1",
     "data": {
       "auid": "1000",
-      "old-auid": "4294967295",
+      "old-auid": "unset",
       "old-ses": "4294967295",
       "pid": "1298",
       "result": "success",