parse-server 8.6.44 → 8.6.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -130,11 +130,12 @@
130
130
 
131
131
  /**
132
132
  * @interface RequestComplexityOptions
133
- * @property {Number} graphQLDepth Maximum depth of GraphQL field selections. Set to `-1` to disable. Default is `50`.
134
- * @property {Number} graphQLFields Maximum number of field selections in a GraphQL query. Set to `-1` to disable. Default is `200`.
135
- * @property {Number} includeCount Maximum number of include paths in a single query. Set to `-1` to disable. Default is `50`.
136
- * @property {Number} includeDepth Maximum depth of include pointer chains (e.g. `a.b.c` = depth 3). Set to `-1` to disable. Default is `5`.
137
- * @property {Number} subqueryDepth Maximum nesting depth of `$inQuery`, `$notInQuery`, `$select`, `$dontSelect` subqueries. Set to `-1` to disable. Default is `5`.
133
+ * @property {Number} graphQLDepth Maximum depth of GraphQL field selections. Set to `-1` to disable. Default is `-1`.
134
+ * @property {Number} graphQLFields Maximum number of field selections in a GraphQL query. Set to `-1` to disable. Default is `-1`.
135
+ * @property {Number} includeCount Maximum number of include paths in a single query. Set to `-1` to disable. Default is `-1`.
136
+ * @property {Number} includeDepth Maximum depth of include pointer chains (e.g. `a.b.c` = depth 3). Set to `-1` to disable. Default is `-1`.
137
+ * @property {Number} queryDepth Maximum nesting depth of `$or`, `$and`, `$nor` query operators. Set to `-1` to disable. Default is `-1`.
138
+ * @property {Number} subqueryDepth Maximum nesting depth of `$inQuery`, `$notInQuery`, `$select`, `$dontSelect` subqueries. Set to `-1` to disable. Default is `-1`.
138
139
  */
139
140
 
140
141
  /**
@@ -343,4 +344,4 @@
343
344
  * @property {String} triggerBeforeSuccess Log level used by the Cloud Code Triggers `beforeSave`, `beforeDelete`, `beforeFind`, `beforeLogin` on success. Default is `info`. See [LogLevel](LogLevel.html) for available values.
344
345
  */
345
346
  "use strict";
346
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL09wdGlvbnMvZG9jcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBpbnRlcmZhY2UgU2NoZW1hT3B0aW9uc1xuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gYWZ0ZXJNaWdyYXRpb24gRXhlY3V0ZSBhIGNhbGxiYWNrIGFmdGVyIHJ1bm5pbmcgc2NoZW1hIG1pZ3JhdGlvbnMuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBiZWZvcmVNaWdyYXRpb24gRXhlY3V0ZSBhIGNhbGxiYWNrIGJlZm9yZSBydW5uaW5nIHNjaGVtYSBtaWdyYXRpb25zLlxuICogQHByb3BlcnR5IHtBbnl9IGRlZmluaXRpb25zIFJlc3QgcmVwcmVzZW50YXRpb24gb24gUGFyc2UuU2NoZW1hIGh0dHBzOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9yZXN0L2d1aWRlLyNhZGRpbmctYS1zY2hlbWFcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZGVsZXRlRXh0cmFGaWVsZHMgSXMgdHJ1ZSBpZiBQYXJzZSBTZXJ2ZXIgc2hvdWxkIGRlbGV0ZSBhbnkgZmllbGRzIG5vdCBkZWZpbmVkIGluIGEgc2NoZW1hIGRlZmluaXRpb24uIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBkdXJpbmcgZGV2ZWxvcG1lbnQuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGtlZXBVbmtub3duSW5kZXhlcyAoT3B0aW9uYWwpIEtlZXAgaW5kZXhlcyB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSBkYXRhYmFzZSBidXQgbm90IGRlZmluZWQgaW4gdGhlIHNjaGVtYS4gU2V0IHRoaXMgdG8gYHRydWVgIGlmIHlvdSBhcmUgYWRkaW5nIGluZGV4ZXMgbWFudWFsbHksIHNvIHRoYXQgdGhleSB3b24ndCBiZSByZW1vdmVkIHdoZW4gcnVubmluZyBzY2hlbWEgbWlncmF0aW9uLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGxvY2tTY2hlbWFzIElzIHRydWUgaWYgUGFyc2UgU2VydmVyIHdpbGwgcmVqZWN0IGFueSBhdHRlbXB0cyB0byBtb2RpZnkgdGhlIHNjaGVtYSB3aGlsZSB0aGUgc2VydmVyIGlzIHJ1bm5pbmcuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHJlY3JlYXRlTW9kaWZpZWRGaWVsZHMgSXMgdHJ1ZSBpZiBQYXJzZSBTZXJ2ZXIgc2hvdWxkIHJlY3JlYXRlIGFueSBmaWVsZHMgdGhhdCBhcmUgZGlmZmVyZW50IGJldHdlZW4gdGhlIGN1cnJlbnQgZGF0YWJhc2Ugc2NoZW1hIGFuZCB0aGVzY2hlbWEgZGVmaW5pdGlvbi4gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGR1cmluZyBkZXZlbG9wbWVudC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gc3RyaWN0IElzIHRydWUgaWYgUGFyc2UgU2VydmVyIHNob3VsZCBleGl0IGlmIHNjaGVtYSB1cGRhdGUgZmFpbC5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgUGFyc2VTZXJ2ZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge0FjY291bnRMb2Nrb3V0T3B0aW9uc30gYWNjb3VudExvY2tvdXQgVGhlIGFjY291bnQgbG9ja291dCBwb2xpY3kgZm9yIGZhaWxlZCBsb2dpbiBhdHRlbXB0cy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gYWxsb3dDbGllbnRDbGFzc0NyZWF0aW9uIEVuYWJsZSAob3IgZGlzYWJsZSkgY2xpZW50IGNsYXNzIGNyZWF0aW9uLCBkZWZhdWx0cyB0byBmYWxzZVxuICogQHByb3BlcnR5IHtCb29sZWFufSBhbGxvd0N1c3RvbU9iamVjdElkIEVuYWJsZSAob3IgZGlzYWJsZSkgY3VzdG9tIG9iamVjdElkXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGFsbG93RXhwaXJlZEF1dGhEYXRhVG9rZW4gQWxsb3cgYSB1c2VyIHRvIGxvZyBpbiBldmVuIGlmIHRoZSAzcmQgcGFydHkgYXV0aGVudGljYXRpb24gdG9rZW4gdGhhdCB3YXMgdXNlZCB0byBzaWduIGluIHRvIHRoZWlyIGFjY291bnQgaGFzIGV4cGlyZWQuIElmIHRoaXMgaXMgc2V0IHRvIGBmYWxzZWAsIHRoZW4gdGhlIHRva2VuIHdpbGwgYmUgdmFsaWRhdGVkIGV2ZXJ5IHRpbWUgdGhlIHVzZXIgc2lnbnMgaW4gdG8gdGhlaXIgYWNjb3VudC4gVGhpcyByZWZlcnMgdG8gdGhlIHRva2VuIHRoYXQgaXMgc3RvcmVkIGluIHRoZSBgX1VzZXIuYXV0aERhdGFgIGZpZWxkLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtTdHJpbmdbXX0gYWxsb3dIZWFkZXJzIEFkZCBoZWFkZXJzIHRvIEFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfFN0cmluZ1tdfSBhbGxvd09yaWdpbiBTZXRzIG9yaWdpbnMgZm9yIEFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbi4gVGhpcyBjYW4gYmUgYSBzdHJpbmcgZm9yIGEgc2luZ2xlIG9yaWdpbiBvciBhbiBhcnJheSBvZiBzdHJpbmdzIGZvciBtdWx0aXBsZSBvcmlnaW5zLlxuICogQHByb3BlcnR5IHtBZGFwdGVyPEFuYWx5dGljc0FkYXB0ZXI+fSBhbmFseXRpY3NBZGFwdGVyIEFkYXB0ZXIgbW9kdWxlIGZvciB0aGUgYW5hbHl0aWNzXG4gKiBAcHJvcGVydHkge1N0cmluZ30gYXBwSWQgWW91ciBQYXJzZSBBcHBsaWNhdGlvbiBJRFxuICogQHByb3BlcnR5IHtTdHJpbmd9IGFwcE5hbWUgU2V0cyB0aGUgYXBwIG5hbWVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBhdXRoIENvbmZpZ3VyYXRpb24gZm9yIHlvdXIgYXV0aGVudGljYXRpb24gcHJvdmlkZXJzLCBhcyBzdHJpbmdpZmllZCBKU09OLiBTZWUgaHR0cDovL2RvY3MucGFyc2VwbGF0Zm9ybS5vcmcvcGFyc2Utc2VydmVyL2d1aWRlLyNvYXV0aC1hbmQtM3JkLXBhcnR5LWF1dGhlbnRpY2F0aW9uPGJyPjxicj5Qcm92aWRlciBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgYW5kIGNvbnRhaW4gb25seSBsZXR0ZXJzLCBkaWdpdHMsIGFuZCB1bmRlcnNjb3JlcyAoYC9eW0EtWmEtel1bQS1aYS16MC05X10qJC9gKS4gVGhpcyBpcyBiZWNhdXNlIGVhY2ggcHJvdmlkZXIgbmFtZSBpcyB1c2VkIHRvIGNvbnN0cnVjdCBhIGRhdGFiYXNlIGZpZWxkIChgX2F1dGhfZGF0YV88cHJvdmlkZXI+YCksIHdoaWNoIG11c3QgY29tcGx5IHdpdGggUGFyc2UgU2VydmVyJ3MgZmllbGQgbmFtaW5nIHJ1bGVzLlxuICogQHByb3BlcnR5IHtBZGFwdGVyPENhY2hlQWRhcHRlcj59IGNhY2hlQWRhcHRlciBBZGFwdGVyIG1vZHVsZSBmb3IgdGhlIGNhY2hlXG4gKiBAcHJvcGVydHkge051bWJlcn0gY2FjaGVNYXhTaXplIFNldHMgdGhlIG1heGltdW0gc2l6ZSBmb3IgdGhlIGluIG1lbW9yeSBjYWNoZSwgZGVmYXVsdHMgdG8gMTAwMDBcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBjYWNoZVRUTCBTZXRzIHRoZSBUVEwgZm9yIHRoZSBpbiBtZW1vcnkgY2FjaGUgKGluIG1zKSwgZGVmYXVsdHMgdG8gNTAwMCAoNSBzZWNvbmRzKVxuICogQHByb3BlcnR5IHtTdHJpbmd9IGNsaWVudEtleSBLZXkgZm9yIGlPUywgTWFjT1MsIHR2T1MgY2xpZW50c1xuICogQHByb3BlcnR5IHtTdHJpbmd9IGNsb3VkIEZ1bGwgcGF0aCB0byB5b3VyIGNsb3VkIGNvZGUgbWFpbi5qc1xuICogQHByb3BlcnR5IHtOdW1iZXJ8Qm9vbGVhbn0gY2x1c3RlciBSdW4gd2l0aCBjbHVzdGVyLCBvcHRpb25hbGx5IHNldCB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlcyBkZWZhdWx0IHRvIG9zLmNwdXMoKS5sZW5ndGhcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBjb2xsZWN0aW9uUHJlZml4IEEgY29sbGVjdGlvbiBwcmVmaXggZm9yIHRoZSBjbGFzc2VzXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbnZlcnRFbWFpbFRvTG93ZXJjYXNlIE9wdGlvbmFsLiBJZiBzZXQgdG8gYHRydWVgLCB0aGUgYGVtYWlsYCBwcm9wZXJ0eSBvZiBhIHVzZXIgaXMgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGJlZm9yZSBiZWluZyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiBDb25zZXF1ZW50bHksIHF1ZXJpZXMgbXVzdCBtYXRjaCB0aGUgY2FzZSBhcyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLCB3aGljaCB3b3VsZCBiZSBsb3dlcmNhc2UgaW4gdGhpcyBzY2VuYXJpby4gSWYgYGZhbHNlYCwgdGhlIGBlbWFpbGAgcHJvcGVydHkgaXMgc3RvcmVkIGFzIHNldCwgd2l0aG91dCBhbnkgY2FzZSBtb2RpZmljYXRpb25zLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbnZlcnRVc2VybmFtZVRvTG93ZXJjYXNlIE9wdGlvbmFsLiBJZiBzZXQgdG8gYHRydWVgLCB0aGUgYHVzZXJuYW1lYCBwcm9wZXJ0eSBvZiBhIHVzZXIgaXMgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGJlZm9yZSBiZWluZyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiBDb25zZXF1ZW50bHksIHF1ZXJpZXMgbXVzdCBtYXRjaCB0aGUgY2FzZSBhcyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLCB3aGljaCB3b3VsZCBiZSBsb3dlcmNhc2UgaW4gdGhpcyBzY2VuYXJpby4gSWYgYGZhbHNlYCwgdGhlIGB1c2VybmFtZWAgcHJvcGVydHkgaXMgc3RvcmVkIGFzIHNldCwgd2l0aG91dCBhbnkgY2FzZSBtb2RpZmljYXRpb25zLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge0N1c3RvbVBhZ2VzT3B0aW9uc30gY3VzdG9tUGFnZXMgY3VzdG9tIHBhZ2VzIGZvciBwYXNzd29yZCB2YWxpZGF0aW9uIGFuZCByZXNldFxuICogQHByb3BlcnR5IHtBZGFwdGVyPFN0b3JhZ2VBZGFwdGVyPn0gZGF0YWJhc2VBZGFwdGVyIEFkYXB0ZXIgbW9kdWxlIGZvciB0aGUgZGF0YWJhc2U7IGFueSBvcHRpb25zIHRoYXQgYXJlIG5vdCBleHBsaWNpdGx5IGRlc2NyaWJlZCBoZXJlIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGRhdGFiYXNlIGNsaWVudC5cbiAqIEBwcm9wZXJ0eSB7RGF0YWJhc2VPcHRpb25zfSBkYXRhYmFzZU9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIHRvIHRoZSBkYXRhYmFzZSBjbGllbnRcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBkYXRhYmFzZVVSSSBUaGUgZnVsbCBVUkkgdG8geW91ciBkYXRhYmFzZS4gU3VwcG9ydGVkIGRhdGFiYXNlcyBhcmUgbW9uZ29kYiBvciBwb3N0Z3Jlcy5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBkZWZhdWx0TGltaXQgRGVmYXVsdCB2YWx1ZSBmb3IgbGltaXQgb3B0aW9uIG9uIHF1ZXJpZXMsIGRlZmF1bHRzIHRvIGAxMDBgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBkaXJlY3RBY2Nlc3MgU2V0IHRvIGB0cnVlYCBpZiBQYXJzZSByZXF1ZXN0cyB3aXRoaW4gdGhlIHNhbWUgTm9kZS5qcyBlbnZpcm9ubWVudCBhcyBQYXJzZSBTZXJ2ZXIgc2hvdWxkIGJlIHJvdXRlZCB0byBQYXJzZSBTZXJ2ZXIgZGlyZWN0bHkgaW5zdGVhZCBvZiB2aWEgdGhlIEhUVFAgaW50ZXJmYWNlLiBEZWZhdWx0IGlzIGBmYWxzZWAuPGJyPjxicj5JZiBzZXQgdG8gYGZhbHNlYCB0aGVuIFBhcnNlIHJlcXVlc3RzIHdpdGhpbiB0aGUgc2FtZSBOb2RlLmpzIGVudmlyb25tZW50IGFzIFBhcnNlIFNlcnZlciBhcmUgZXhlY3V0ZWQgYXMgSFRUUCByZXF1ZXN0cyBzZW50IHRvIFBhcnNlIFNlcnZlciB2aWEgdGhlIGBzZXJ2ZXJVUkxgLiBGb3IgZXhhbXBsZSwgYSBgUGFyc2UuUXVlcnlgIGluIENsb3VkIENvZGUgaXMgY2FsbGluZyBQYXJzZSBTZXJ2ZXIgdmlhIGEgSFRUUCByZXF1ZXN0LiBUaGUgc2VydmVyIGlzIGVzc2VudGlhbGx5IG1ha2luZyBhIEhUVFAgcmVxdWVzdCB0byBpdHNlbGYsIHVubmVjZXNzYXJpbHkgdXNpbmcgbmV0d29yayByZXNvdXJjZXMgc3VjaCBhcyBuZXR3b3JrIHBvcnRzLjxicj48YnI+4pqg77iPIEluIGVudmlyb25tZW50cyB3aGVyZSBtdWx0aXBsZSBQYXJzZSBTZXJ2ZXIgaW5zdGFuY2VzIHJ1biBiZWhpbmQgYSBsb2FkIGJhbGFuY2VyIGFuZCBQYXJzZSByZXF1ZXN0cyB3aXRoaW4gdGhlIGN1cnJlbnQgTm9kZS5qcyBlbnZpcm9ubWVudCBzaG91bGQgYmUgcm91dGVkIHZpYSB0aGUgbG9hZCBiYWxhbmNlciBhbmQgZGlzdHJpYnV0ZWQgYXMgSFRUUCByZXF1ZXN0cyBhbW9uZyBhbGwgaW5zdGFuY2VzIHZpYSB0aGUgYHNlcnZlclVSTGAsIHRoaXMgc2hvdWxkIGJlIHNldCB0byBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGRvdE5ldEtleSBLZXkgZm9yIFVuaXR5IGFuZCAuTmV0IFNES1xuICogQHByb3BlcnR5IHtBZGFwdGVyPE1haWxBZGFwdGVyPn0gZW1haWxBZGFwdGVyIEFkYXB0ZXIgbW9kdWxlIGZvciBlbWFpbCBzZW5kaW5nXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGVtYWlsVmVyaWZ5U3VjY2Vzc09uSW52YWxpZEVtYWlsIFNldCB0byBgdHJ1ZWAgaWYgYSByZXF1ZXN0IHRvIHZlcmlmeSB0aGUgZW1haWwgc2hvdWxkIHJldHVybiBhIHN1Y2Nlc3MgcmVzcG9uc2UgZXZlbiBpZiB0aGUgcHJvdmlkZWQgZW1haWwgYWRkcmVzcyBkb2VzIG5vdCBiZWxvbmcgdG8gYSB2ZXJpZmlhYmxlIGFjY291bnQsIGZvciBleGFtcGxlIGJlY2F1c2UgaXQgaXMgdW5rbm93biBvciBhbHJlYWR5IHZlcmlmaWVkLCBvciBgZmFsc2VgIGlmIHRoZSByZXF1ZXN0IHNob3VsZCByZXR1cm4gYW4gZXJyb3IgcmVzcG9uc2UgaW4gdGhvc2UgY2FzZXMuPGJyPjxicj5EZWZhdWx0IGlzIGB0cnVlYC48YnI+UmVxdWlyZXMgb3B0aW9uIGB2ZXJpZnlVc2VyRW1haWxzOiB0cnVlYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW1haWxWZXJpZnlUb2tlblJldXNlSWZWYWxpZCBTZXQgdG8gYHRydWVgIGlmIGEgZW1haWwgdmVyaWZpY2F0aW9uIHRva2VuIHNob3VsZCBiZSByZXVzZWQgaW4gY2FzZSBhbm90aGVyIHRva2VuIGlzIHJlcXVlc3RlZCBidXQgdGhlcmUgaXMgYSB0b2tlbiB0aGF0IGlzIHN0aWxsIHZhbGlkLCBpLmUuIGhhcyBub3QgZXhwaXJlZC4gVGhpcyBhdm9pZHMgdGhlIG9mdGVuIG9ic2VydmVkIGlzc3VlIHRoYXQgYSB1c2VyIHJlcXVlc3RzIG11bHRpcGxlIGVtYWlscyBhbmQgZG9lcyBub3Qga25vdyB3aGljaCBsaW5rIGNvbnRhaW5zIGEgdmFsaWQgdG9rZW4gYmVjYXVzZSBlYWNoIG5ld2x5IGdlbmVyYXRlZCB0b2tlbiB3b3VsZCBpbnZhbGlkYXRlIHRoZSBwcmV2aW91cyB0b2tlbi48YnI+PGJyPkRlZmF1bHQgaXMgYGZhbHNlYC48YnI+UmVxdWlyZXMgb3B0aW9uIGB2ZXJpZnlVc2VyRW1haWxzOiB0cnVlYC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBlbWFpbFZlcmlmeVRva2VuVmFsaWRpdHlEdXJhdGlvbiBTZXQgdGhlIHZhbGlkaXR5IGR1cmF0aW9uIG9mIHRoZSBlbWFpbCB2ZXJpZmljYXRpb24gdG9rZW4gaW4gc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgdG9rZW4gZXhwaXJlcy4gVGhlIHRva2VuIGlzIHVzZWQgaW4gdGhlIGxpbmsgdGhhdCBpcyBzZXQgaW4gdGhlIGVtYWlsLiBBZnRlciB0aGUgdG9rZW4gZXhwaXJlcywgdGhlIGxpbmsgYmVjb21lcyBpbnZhbGlkIGFuZCBhIG5ldyBsaW5rIGhhcyB0byBiZSBzZW50LiBJZiB0aGUgb3B0aW9uIGlzIG5vdCBzZXQgb3Igc2V0IHRvIGB1bmRlZmluZWRgLCB0aGVuIHRoZSB0b2tlbiBuZXZlciBleHBpcmVzLjxicj48YnI+Rm9yIGV4YW1wbGUsIHRvIGV4cGlyZSB0aGUgdG9rZW4gYWZ0ZXIgMiBob3Vycywgc2V0IGEgdmFsdWUgb2YgNzIwMCBzZWNvbmRzICg9IDYwIHNlY29uZHMgKiA2MCBtaW51dGVzICogMiBob3VycykuPGJyPjxicj5EZWZhdWx0IGlzIGB1bmRlZmluZWRgLjxicj5SZXF1aXJlcyBvcHRpb24gYHZlcmlmeVVzZXJFbWFpbHM6IHRydWVgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVBbm9ueW1vdXNVc2VycyBFbmFibGUgKG9yIGRpc2FibGUpIGFub255bW91cyB1c2VycywgZGVmYXVsdHMgdG8gdHJ1ZVxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVDb2xsYXRpb25DYXNlQ29tcGFyaXNvbiBPcHRpb25hbC4gSWYgc2V0IHRvIGB0cnVlYCwgdGhlIGNvbGxhdGlvbiBydWxlIG9mIGNhc2UgY29tcGFyaXNvbiBmb3IgcXVlcmllcyBhbmQgaW5kZXhlcyBpcyBlbmFibGVkLiBFbmFibGUgdGhpcyBvcHRpb24gdG8gcnVuIFBhcnNlIFNlcnZlciB3aXRoIE1vbmdvREIgQXRsYXMgU2VydmVybGVzcyBvciBBV1MgQW1hem9uIERvY3VtZW50REIuIElmIGBmYWxzZWAsIHRoZSBjb2xsYXRpb24gcnVsZSBvZiBjYXNlIGNvbXBhcmlzb24gaXMgZGlzYWJsZWQuIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlRXhwcmVzc0Vycm9ySGFuZGxlciBFbmFibGVzIHRoZSBkZWZhdWx0IGV4cHJlc3MgZXJyb3IgaGFuZGxlciBmb3IgYWxsIGVycm9yc1xuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVJbnNlY3VyZUF1dGhBZGFwdGVycyBFbmFibGUgKG9yIGRpc2FibGUpIGluc2VjdXJlIGF1dGggYWRhcHRlcnMsIGRlZmF1bHRzIHRvIHRydWUuIEluc2VjdXJlIGF1dGggYWRhcHRlcnMgYXJlIGRlcHJlY2F0ZWQgYW5kIGl0IGlzIHJlY29tbWVuZGVkIHRvIGRpc2FibGUgdGhlbS5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlU2FuaXRpemVkRXJyb3JSZXNwb25zZSBJZiBzZXQgdG8gYHRydWVgLCBlcnJvciBkZXRhaWxzIGFyZSByZW1vdmVkIGZyb20gZXJyb3IgbWVzc2FnZXMgaW4gcmVzcG9uc2VzIHRvIGNsaWVudCByZXF1ZXN0cywgYW5kIGluc3RlYWQgYSBnZW5lcmljIGVycm9yIG1lc3NhZ2UgaXMgc2VudC4gRGVmYXVsdCBpcyBgdHJ1ZWAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGVuY29kZVBhcnNlT2JqZWN0SW5DbG91ZEZ1bmN0aW9uIElmIHNldCB0byBgdHJ1ZWAsIGEgYFBhcnNlLk9iamVjdGAgdGhhdCBpcyBpbiB0aGUgcGF5bG9hZCB3aGVuIGNhbGxpbmcgYSBDbG91ZCBGdW5jdGlvbiB3aWxsIGJlIGNvbnZlcnRlZCB0byBhbiBpbnN0YW5jZSBvZiBgUGFyc2UuT2JqZWN0YC4gSWYgYGZhbHNlYCwgdGhlIG9iamVjdCB3aWxsIG5vdCBiZSBjb252ZXJ0ZWQgYW5kIGluc3RlYWQgYmUgYSBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdCwgd2hpY2ggY29udGFpbnMgdGhlIHJhdyBkYXRhIG9mIGEgYFBhcnNlLk9iamVjdGAgYnV0IGlzIG5vdCBhbiBhY3R1YWwgaW5zdGFuY2Ugb2YgYFBhcnNlLk9iamVjdGAuIERlZmF1bHQgaXMgYGZhbHNlYC4gPGJyPjxicj7ihLnvuI8gVGhlIGV4cGVjdGVkIGJlaGF2aW9yIHdvdWxkIGJlIHRoYXQgdGhlIG9iamVjdCBpcyBjb252ZXJ0ZWQgdG8gYW4gaW5zdGFuY2Ugb2YgYFBhcnNlLk9iamVjdGAsIHNvIHlvdSB3b3VsZCBub3JtYWxseSBzZXQgdGhpcyBvcHRpb24gdG8gYHRydWVgLiBUaGUgZGVmYXVsdCBpcyBgZmFsc2VgIGJlY2F1c2UgdGhpcyBpcyBhIHRlbXBvcmFyeSBvcHRpb24gdGhhdCBoYXMgYmVlbiBpbnRyb2R1Y2VkIHRvIGF2b2lkIGEgYnJlYWtpbmcgY2hhbmdlIHdoZW4gZml4aW5nIGEgYnVnIHdoZXJlIEphdmFTY3JpcHQgb2JqZWN0cyBhcmUgbm90IGNvbnZlcnRlZCB0byBhY3R1YWwgaW5zdGFuY2VzIG9mIGBQYXJzZS5PYmplY3RgLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGVuY3J5cHRpb25LZXkgS2V5IGZvciBlbmNyeXB0aW5nIHlvdXIgZmlsZXNcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5mb3JjZVByaXZhdGVVc2VycyBTZXQgdG8gdHJ1ZSBpZiBuZXcgdXNlcnMgc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aG91dCBwdWJsaWMgcmVhZCBhbmQgd3JpdGUgYWNjZXNzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBleHBpcmVJbmFjdGl2ZVNlc3Npb25zIFNldHMgd2hldGhlciB3ZSBzaG91bGQgZXhwaXJlIHRoZSBpbmFjdGl2ZSBzZXNzaW9ucywgZGVmYXVsdHMgdG8gdHJ1ZS4gSWYgZmFsc2UsIGFsbCBuZXcgc2Vzc2lvbnMgYXJlIGNyZWF0ZWQgd2l0aCBubyBleHBpcmF0aW9uIGRhdGUuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGV4dGVuZFNlc3Npb25PblVzZSBXaGV0aGVyIFBhcnNlIFNlcnZlciBzaG91bGQgYXV0b21hdGljYWxseSBleHRlbmQgYSB2YWxpZCBzZXNzaW9uIGJ5IHRoZSBzZXNzaW9uTGVuZ3RoLiBJbiBvcmRlciB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBzZXNzaW9uIHVwZGF0ZXMgaW4gdGhlIGRhdGFiYXNlLCBhIHNlc3Npb24gd2lsbCBvbmx5IGJlIGV4dGVuZGVkIHdoZW4gYSByZXF1ZXN0IGlzIHJlY2VpdmVkIGFmdGVyIGF0IGxlYXN0IGhhbGYgb2YgdGhlIGN1cnJlbnQgc2Vzc2lvbidzIGxpZmV0aW1lIGhhcyBwYXNzZWQuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZmlsZUtleSBLZXkgZm9yIHlvdXIgZmlsZXNcbiAqIEBwcm9wZXJ0eSB7QWRhcHRlcjxGaWxlc0FkYXB0ZXI+fSBmaWxlc0FkYXB0ZXIgQWRhcHRlciBtb2R1bGUgZm9yIHRoZSBmaWxlcyBzdWItc3lzdGVtXG4gKiBAcHJvcGVydHkge0ZpbGVVcGxvYWRPcHRpb25zfSBmaWxlVXBsb2FkIE9wdGlvbnMgZm9yIGZpbGUgdXBsb2Fkc1xuICogQHByb3BlcnR5IHtTdHJpbmd9IGdyYXBoUUxQYXRoIFRoZSBtb3VudCBwYXRoIGZvciB0aGUgR3JhcGhRTCBlbmRwb2ludDxicj48YnI+4pqg77iPIEZpbGUgdXBsb2FkIGluc2lkZSB0aGUgR3JhcGhRTCBtdXRhdGlvbiBzeXN0ZW0gcmVxdWlyZXMgUGFyc2UgU2VydmVyIHRvIGJlIGFibGUgdG8gY2FsbCBpdHNlbGYgYnkgbWFraW5nIHJlcXVlc3RzIHRvIHRoZSBVUkwgc2V0IGluIGBzZXJ2ZXJVUkxgLjxicj48YnI+RGVmYXVsdHMgaXMgYC9ncmFwaHFsYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZ3JhcGhRTFB1YmxpY0ludHJvc3BlY3Rpb24gRW5hYmxlIHB1YmxpYyBpbnRyb3NwZWN0aW9uIGZvciB0aGUgR3JhcGhRTCBlbmRwb2ludCwgZGVmYXVsdHMgdG8gZmFsc2VcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBncmFwaFFMU2NoZW1hIEZ1bGwgcGF0aCB0byB5b3VyIEdyYXBoUUwgY3VzdG9tIHNjaGVtYS5ncmFwaHFsIGZpbGVcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBob3N0IFRoZSBob3N0IHRvIHNlcnZlIFBhcnNlU2VydmVyIG9uLCBkZWZhdWx0cyB0byAwLjAuMC4wXG4gKiBAcHJvcGVydHkge0lkZW1wb3RlbmN5T3B0aW9uc30gaWRlbXBvdGVuY3lPcHRpb25zIE9wdGlvbnMgZm9yIHJlcXVlc3QgaWRlbXBvdGVuY3kgdG8gZGVkdXBsaWNhdGUgaWRlbnRpY2FsIHJlcXVlc3RzIHRoYXQgbWF5IGJlIGNhdXNlZCBieSBuZXR3b3JrIGlzc3Vlcy4gQ2F1dGlvbiwgdGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSB0aGF0IG1heSBub3QgYmUgYXBwcm9wcmlhdGUgZm9yIHByb2R1Y3Rpb24uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gamF2YXNjcmlwdEtleSBLZXkgZm9yIHRoZSBKYXZhc2NyaXB0IFNES1xuICogQHByb3BlcnR5IHtCb29sZWFufSBqc29uTG9ncyBMb2cgYXMgc3RydWN0dXJlZCBKU09OIG9iamVjdHNcbiAqIEBwcm9wZXJ0eSB7TGl2ZVF1ZXJ5T3B0aW9uc30gbGl2ZVF1ZXJ5IHBhcnNlLXNlcnZlcidzIExpdmVRdWVyeSBjb25maWd1cmF0aW9uIG9iamVjdFxuICogQHByb3BlcnR5IHtMaXZlUXVlcnlTZXJ2ZXJPcHRpb25zfSBsaXZlUXVlcnlTZXJ2ZXJPcHRpb25zIExpdmUgcXVlcnkgc2VydmVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAod2lsbCBzdGFydCB0aGUgbGl2ZVF1ZXJ5IHNlcnZlcilcbiAqIEBwcm9wZXJ0eSB7QWRhcHRlcjxMb2dnZXJBZGFwdGVyPn0gbG9nZ2VyQWRhcHRlciBBZGFwdGVyIG1vZHVsZSBmb3IgdGhlIGxvZ2dpbmcgc3ViLXN5c3RlbVxuICogQHByb3BlcnR5IHtTdHJpbmd9IGxvZ0xldmVsIFNldHMgdGhlIGxldmVsIGZvciBsb2dzXG4gKiBAcHJvcGVydHkge0xvZ0xldmVsc30gbG9nTGV2ZWxzIChPcHRpb25hbCkgT3ZlcnJpZGVzIHRoZSBsb2cgbGV2ZWxzIHVzZWQgaW50ZXJuYWxseSBieSBQYXJzZSBTZXJ2ZXIgdG8gbG9nIGV2ZW50cy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBsb2dzRm9sZGVyIEZvbGRlciBmb3IgdGhlIGxvZ3MgKGRlZmF1bHRzIHRvICcuL2xvZ3MnKTsgc2V0IHRvIG51bGwgdG8gZGlzYWJsZSBmaWxlIGJhc2VkIGxvZ2dpbmdcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBtYWludGVuYW5jZUtleSAoT3B0aW9uYWwpIFRoZSBtYWludGVuYW5jZSBrZXkgaXMgdXNlZCBmb3IgbW9kaWZ5aW5nIGludGVybmFsIGFuZCByZWFkLW9ubHkgZmllbGRzIG9mIFBhcnNlIFNlcnZlci48YnI+PGJyPuKaoO+4jyBUaGlzIGtleSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIGEgcmVndWxhciBvcGVyYXRpb24gb2YgUGFyc2UgU2VydmVyLiBUaGlzIGtleSBpcyBpbnRlbmRlZCB0byBjb25kdWN0IG91dC1vZi1iYW5kIGNoYW5nZXMgc3VjaCBhcyBvbmUtdGltZSBtaWdyYXRpb25zIG9yIGRhdGEgY29ycmVjdGlvbiB0YXNrcy4gSW50ZXJuYWwgZmllbGRzIGFyZSBub3Qgb2ZmaWNpYWxseSBkb2N1bWVudGVkIGFuZCBtYXkgY2hhbmdlIGF0IGFueSB0aW1lIHdpdGhvdXQgcHVibGljYXRpb24gaW4gcmVsZWFzZSBjaGFuZ2Vsb2dzLiBXZSBzdHJvbmdseSBhZHZpY2Ugbm90IHRvIHJlbHkgb24gaW50ZXJuYWwgZmllbGRzIGFzIHBhcnQgb2YgeW91ciByZWd1bGFyIG9wZXJhdGlvbiBhbmQgdG8gaW52ZXN0aWdhdGUgdGhlIGltcGxpY2F0aW9ucyBvZiBhbnkgcGxhbm5lZCBjaGFuZ2VzICpkaXJlY3RseSBpbiB0aGUgc291cmNlIGNvZGUqIG9mIHlvdXIgY3VycmVudCB2ZXJzaW9uIG9mIFBhcnNlIFNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IG1haW50ZW5hbmNlS2V5SXBzIChPcHRpb25hbCkgUmVzdHJpY3RzIHRoZSB1c2Ugb2YgbWFpbnRlbmFuY2Uga2V5IHBlcm1pc3Npb25zIHRvIGEgbGlzdCBvZiBJUCBhZGRyZXNzZXMgb3IgcmFuZ2VzLjxicj48YnI+VGhpcyBvcHRpb24gYWNjZXB0cyBhIGxpc3Qgb2Ygc2luZ2xlIElQIGFkZHJlc3NlcywgZm9yIGV4YW1wbGUgYFsnMTAuMC4wLjEnLCAnMTAuMC4wLjInXWAuIFlvdSBjYW4gYWxzbyB1c2UgQ0lEUiBub3RhdGlvbiB0byBzcGVjaWZ5IGFuIElQIGFkZHJlc3MgcmFuZ2UsIGZvciBleGFtcGxlIGBbJzEwLjAuMS4wLzI0J11gLjxicj48YnI+PGI+U3BlY2lhbCBzY2VuYXJpb3M6PC9iPjxicj4tIFNldHRpbmcgYW4gZW1wdHkgYXJyYXkgYFtdYCBtZWFucyB0aGF0IHRoZSBtYWludGVuYW5jZSBrZXkgY2Fubm90IGJlIHVzZWQgZXZlbiBpbiBQYXJzZSBTZXJ2ZXIgQ2xvdWQgQ29kZS4gVGhpcyB2YWx1ZSBjYW5ub3QgYmUgc2V0IHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyB0aGVyZSBpcyBubyB3YXkgdG8gcGFzcyBhbiBlbXB0eSBhcnJheSB0byBQYXJzZSBTZXJ2ZXIgdmlhIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLjxicj4tIFNldHRpbmcgYFsnMC4wLjAuMC8wJywgJzo6MCddYCBtZWFucyB0byBhbGxvdyBhbnkgSVB2NCBhbmQgSVB2NiBhZGRyZXNzIHRvIHVzZSB0aGUgbWFpbnRlbmFuY2Uga2V5IGFuZCBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGUgSVAgZmlsdGVyLjxicj48YnI+PGI+Q29uc2lkZXJhdGlvbnM6PC9iPjxicj4tIElQdjQgYW5kIElQdjYgYWRkcmVzc2VzIGFyZSBub3QgY29tcGFyZWQgYWdhaW5zdCBlYWNoIG90aGVyLiBFYWNoIElQIHZlcnNpb24gKElQdjQgYW5kIElQdjYpIG5lZWRzIHRvIGJlIGNvbnNpZGVyZWQgc2VwYXJhdGVseS4gRm9yIGV4YW1wbGUsIGBbJzAuMC4wLjAvMCddYCBhbGxvd3MgYW55IElQdjQgYWRkcmVzcyBhbmQgYmxvY2tzIGV2ZXJ5IElQdjYgYWRkcmVzcy4gQ29udmVyc2VseSwgYFsnOjowJ11gIGFsbG93cyBhbnkgSVB2NiBhZGRyZXNzIGFuZCBibG9ja3MgZXZlcnkgSVB2NCBhZGRyZXNzLjxicj4tIEtlZXAgaW4gbWluZCB0aGF0IHRoZSBJUCB2ZXJzaW9uIGluIHVzZSBkZXBlbmRzIG9uIHRoZSBuZXR3b3JrIHN0YWNrIG9mIHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCBQYXJzZSBTZXJ2ZXIgcnVucy4gQSBsb2NhbCBlbnZpcm9ubWVudCBtYXkgdXNlIGEgZGlmZmVyZW50IElQIHZlcnNpb24gdGhhbiBhIHJlbW90ZSBlbnZpcm9ubWVudC4gRm9yIGV4YW1wbGUsIGl0J3MgcG9zc2libGUgdGhhdCBsb2NhbGx5IHRoZSB2YWx1ZSBgWycwLjAuMC4wLzAnXWAgYWxsb3dzIHRoZSByZXF1ZXN0IElQIGJlY2F1c2UgdGhlIGVudmlyb25tZW50IGlzIHVzaW5nIElQdjQsIGJ1dCB3aGVuIFBhcnNlIFNlcnZlciBpcyBkZXBsb3llZCByZW1vdGVseSB0aGUgcmVxdWVzdCBJUCBpcyBibG9ja2VkIGJlY2F1c2UgdGhlIHJlbW90ZSBlbnZpcm9ubWVudCBpcyB1c2luZyBJUHY2Ljxicj4tIFdoZW4gc2V0dGluZyB0aGUgb3B0aW9uIHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGUgbm90YXRpb24gaXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLCBmb3IgZXhhbXBsZSBgXCIwLjAuMC4wLzAsOjowXCJgLjxicj4tIElQdjYgem9uZSBpbmRpY2VzIChgJWAgc3VmZml4KSBhcmUgbm90IHN1cHBvcnRlZCwgZm9yIGV4YW1wbGUgYGZlODA6OjElZXRoMGAsIGBmZTgwOjoxJTFgIG9yIGA6OjElbG9gLjxicj48YnI+RGVmYXVsdHMgdG8gYFsnMTI3LjAuMC4xJywgJzo6MSddYCB3aGljaCBtZWFucyB0aGF0IG9ubHkgYGxvY2FsaG9zdGAsIHRoZSBzZXJ2ZXIgaW5zdGFuY2Ugb24gd2hpY2ggUGFyc2UgU2VydmVyIHJ1bnMsIGlzIGFsbG93ZWQgdG8gdXNlIHRoZSBtYWludGVuYW5jZSBrZXkuXG4gKiBAcHJvcGVydHkge1VuaW9ufSBtYXN0ZXJLZXkgWW91ciBQYXJzZSBNYXN0ZXIgS2V5XG4gKiBAcHJvcGVydHkge1N0cmluZ1tdfSBtYXN0ZXJLZXlJcHMgKE9wdGlvbmFsKSBSZXN0cmljdHMgdGhlIHVzZSBvZiBtYXN0ZXIga2V5IHBlcm1pc3Npb25zIHRvIGEgbGlzdCBvZiBJUCBhZGRyZXNzZXMgb3IgcmFuZ2VzLjxicj48YnI+VGhpcyBvcHRpb24gYWNjZXB0cyBhIGxpc3Qgb2Ygc2luZ2xlIElQIGFkZHJlc3NlcywgZm9yIGV4YW1wbGUgYFsnMTAuMC4wLjEnLCAnMTAuMC4wLjInXWAuIFlvdSBjYW4gYWxzbyB1c2UgQ0lEUiBub3RhdGlvbiB0byBzcGVjaWZ5IGFuIElQIGFkZHJlc3MgcmFuZ2UsIGZvciBleGFtcGxlIGBbJzEwLjAuMS4wLzI0J11gLjxicj48YnI+PGI+U3BlY2lhbCBzY2VuYXJpb3M6PC9iPjxicj4tIFNldHRpbmcgYW4gZW1wdHkgYXJyYXkgYFtdYCBtZWFucyB0aGF0IHRoZSBtYXN0ZXIga2V5IGNhbm5vdCBiZSB1c2VkIGV2ZW4gaW4gUGFyc2UgU2VydmVyIENsb3VkIENvZGUuIFRoaXMgdmFsdWUgY2Fubm90IGJlIHNldCB2aWEgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgdGhlcmUgaXMgbm8gd2F5IHRvIHBhc3MgYW4gZW1wdHkgYXJyYXkgdG8gUGFyc2UgU2VydmVyIHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS48YnI+LSBTZXR0aW5nIGBbJzAuMC4wLjAvMCcsICc6OjAnXWAgbWVhbnMgdG8gYWxsb3cgYW55IElQdjQgYW5kIElQdjYgYWRkcmVzcyB0byB1c2UgdGhlIG1hc3RlciBrZXkgYW5kIGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoZSBJUCBmaWx0ZXIuPGJyPjxicj48Yj5Db25zaWRlcmF0aW9uczo8L2I+PGJyPi0gSVB2NCBhbmQgSVB2NiBhZGRyZXNzZXMgYXJlIG5vdCBjb21wYXJlZCBhZ2FpbnN0IGVhY2ggb3RoZXIuIEVhY2ggSVAgdmVyc2lvbiAoSVB2NCBhbmQgSVB2NikgbmVlZHMgdG8gYmUgY29uc2lkZXJlZCBzZXBhcmF0ZWx5LiBGb3IgZXhhbXBsZSwgYFsnMC4wLjAuMC8wJ11gIGFsbG93cyBhbnkgSVB2NCBhZGRyZXNzIGFuZCBibG9ja3MgZXZlcnkgSVB2NiBhZGRyZXNzLiBDb252ZXJzZWx5LCBgWyc6OjAnXWAgYWxsb3dzIGFueSBJUHY2IGFkZHJlc3MgYW5kIGJsb2NrcyBldmVyeSBJUHY0IGFkZHJlc3MuPGJyPi0gS2VlcCBpbiBtaW5kIHRoYXQgdGhlIElQIHZlcnNpb24gaW4gdXNlIGRlcGVuZHMgb24gdGhlIG5ldHdvcmsgc3RhY2sgb2YgdGhlIGVudmlyb25tZW50IGluIHdoaWNoIFBhcnNlIFNlcnZlciBydW5zLiBBIGxvY2FsIGVudmlyb25tZW50IG1heSB1c2UgYSBkaWZmZXJlbnQgSVAgdmVyc2lvbiB0aGFuIGEgcmVtb3RlIGVudmlyb25tZW50LiBGb3IgZXhhbXBsZSwgaXQncyBwb3NzaWJsZSB0aGF0IGxvY2FsbHkgdGhlIHZhbHVlIGBbJzAuMC4wLjAvMCddYCBhbGxvd3MgdGhlIHJlcXVlc3QgSVAgYmVjYXVzZSB0aGUgZW52aXJvbm1lbnQgaXMgdXNpbmcgSVB2NCwgYnV0IHdoZW4gUGFyc2UgU2VydmVyIGlzIGRlcGxveWVkIHJlbW90ZWx5IHRoZSByZXF1ZXN0IElQIGlzIGJsb2NrZWQgYmVjYXVzZSB0aGUgcmVtb3RlIGVudmlyb25tZW50IGlzIHVzaW5nIElQdjYuPGJyPi0gV2hlbiBzZXR0aW5nIHRoZSBvcHRpb24gdmlhIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRoZSBub3RhdGlvbiBpcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcsIGZvciBleGFtcGxlIGBcIjAuMC4wLjAvMCw6OjBcImAuPGJyPi0gSVB2NiB6b25lIGluZGljZXMgKGAlYCBzdWZmaXgpIGFyZSBub3Qgc3VwcG9ydGVkLCBmb3IgZXhhbXBsZSBgZmU4MDo6MSVldGgwYCwgYGZlODA6OjElMWAgb3IgYDo6MSVsb2AuPGJyPjxicj5EZWZhdWx0cyB0byBgWycxMjcuMC4wLjEnLCAnOjoxJ11gIHdoaWNoIG1lYW5zIHRoYXQgb25seSBgbG9jYWxob3N0YCwgdGhlIHNlcnZlciBpbnN0YW5jZSBvbiB3aGljaCBQYXJzZSBTZXJ2ZXIgcnVucywgaXMgYWxsb3dlZCB0byB1c2UgdGhlIG1hc3RlciBrZXkuXG4gKiBAcHJvcGVydHkge051bWJlcn0gbWFzdGVyS2V5VHRsIChPcHRpb25hbCkgVGhlIGR1cmF0aW9uIGluIHNlY29uZHMgZm9yIHdoaWNoIHRoZSBjdXJyZW50IGBtYXN0ZXJLZXlgIGlzIGJlaW5nIHVzZWQgYmVmb3JlIGl0IGlzIHJlcXVlc3RlZCBhZ2FpbiBpZiBgbWFzdGVyS2V5YCBpcyBzZXQgdG8gYSBmdW5jdGlvbi4gSWYgYG1hc3RlcktleWAgaXMgbm90IHNldCB0byBhIGZ1bmN0aW9uLCB0aGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0LiBEZWZhdWx0IGlzIGAwYCwgd2hpY2ggbWVhbnMgdGhlIG1hc3RlciBrZXkgaXMgcmVxdWVzdGVkIGJ5IGludm9raW5nIHRoZSAgYG1hc3RlcktleWAgZnVuY3Rpb24gZXZlcnkgdGltZSB0aGUgbWFzdGVyIGtleSBpcyB1c2VkIGludGVybmFsbHkgYnkgUGFyc2UgU2VydmVyLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IG1heExpbWl0IE1heCB2YWx1ZSBmb3IgbGltaXQgb3B0aW9uIG9uIHF1ZXJpZXMsIGRlZmF1bHRzIHRvIHVubGltaXRlZFxuICogQHByb3BlcnR5IHtOdW1iZXJ8U3RyaW5nfSBtYXhMb2dGaWxlcyBNYXhpbXVtIG51bWJlciBvZiBsb2dzIHRvIGtlZXAuIElmIG5vdCBzZXQsIG5vIGxvZ3Mgd2lsbCBiZSByZW1vdmVkLiBUaGlzIGNhbiBiZSBhIG51bWJlciBvZiBmaWxlcyBvciBudW1iZXIgb2YgZGF5cy4gSWYgdXNpbmcgZGF5cywgYWRkICdkJyBhcyB0aGUgc3VmZml4LiAoZGVmYXVsdDogbnVsbClcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBtYXhVcGxvYWRTaXplIE1heCBmaWxlIHNpemUgZm9yIHVwbG9hZHMsIGRlZmF1bHRzIHRvIDIwbWJcbiAqIEBwcm9wZXJ0eSB7VW5pb259IG1pZGRsZXdhcmUgbWlkZGxld2FyZSBmb3IgZXhwcmVzcyBzZXJ2ZXIsIGNhbiBiZSBzdHJpbmcgb3IgZnVuY3Rpb25cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gbW91bnRHcmFwaFFMIE1vdW50cyB0aGUgR3JhcGhRTCBlbmRwb2ludFxuICogQHByb3BlcnR5IHtTdHJpbmd9IG1vdW50UGF0aCBNb3VudCBwYXRoIGZvciB0aGUgc2VydmVyLCBkZWZhdWx0cyB0byAvcGFyc2VcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gbW91bnRQbGF5Z3JvdW5kIE1vdW50cyB0aGUgR3JhcGhRTCBQbGF5Z3JvdW5kIC0gbmV2ZXIgdXNlIHRoaXMgb3B0aW9uIGluIHByb2R1Y3Rpb25cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBvYmplY3RJZFNpemUgU2V0cyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gZ2VuZXJhdGVkIG9iamVjdCBpZCdzLCBkZWZhdWx0IDEwXG4gKiBAcHJvcGVydHkge1BhZ2VzT3B0aW9uc30gcGFnZXMgVGhlIG9wdGlvbnMgZm9yIHBhZ2VzIHN1Y2ggYXMgcGFzc3dvcmQgcmVzZXQgYW5kIGVtYWlsIHZlcmlmaWNhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UGFzc3dvcmRQb2xpY3lPcHRpb25zfSBwYXNzd29yZFBvbGljeSBUaGUgcGFzc3dvcmQgcG9saWN5IGZvciBlbmZvcmNpbmcgcGFzc3dvcmQgcmVsYXRlZCBydWxlcy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwbGF5Z3JvdW5kUGF0aCBNb3VudCBwYXRoIGZvciB0aGUgR3JhcGhRTCBQbGF5Z3JvdW5kLCBkZWZhdWx0cyB0byAvcGxheWdyb3VuZFxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHBvcnQgVGhlIHBvcnQgdG8gcnVuIHRoZSBQYXJzZVNlcnZlciwgZGVmYXVsdHMgdG8gMTMzNy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gcHJlc2VydmVGaWxlTmFtZSBFbmFibGUgKG9yIGRpc2FibGUpIHRoZSBhZGRpdGlvbiBvZiBhIHVuaXF1ZSBoYXNoIHRvIHRoZSBmaWxlIG5hbWVzXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHByZXZlbnRMb2dpbldpdGhVbnZlcmlmaWVkRW1haWwgU2V0IHRvIGB0cnVlYCB0byBwcmV2ZW50IGEgdXNlciBmcm9tIGxvZ2dpbmcgaW4gaWYgdGhlIGVtYWlsIGhhcyBub3QgeWV0IGJlZW4gdmVyaWZpZWQgYW5kIGVtYWlsIHZlcmlmaWNhdGlvbiBpcyByZXF1aXJlZC48YnI+PGJyPkRlZmF1bHQgaXMgYGZhbHNlYC48YnI+UmVxdWlyZXMgb3B0aW9uIGB2ZXJpZnlVc2VyRW1haWxzOiB0cnVlYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gcHJldmVudFNpZ251cFdpdGhVbnZlcmlmaWVkRW1haWwgSWYgc2V0IHRvIGB0cnVlYCBpdCBwcmV2ZW50cyBhIHVzZXIgZnJvbSBzaWduaW5nIHVwIGlmIHRoZSBlbWFpbCBoYXMgbm90IHlldCBiZWVuIHZlcmlmaWVkIGFuZCBlbWFpbCB2ZXJpZmljYXRpb24gaXMgcmVxdWlyZWQuIEluIHRoYXQgY2FzZSB0aGUgc2VydmVyIHJlc3BvbmRzIHRvIHRoZSBzaWduLXVwIHdpdGggSFRUUCBzdGF0dXMgNDAwIGFuZCBhIFBhcnNlIEVycm9yIDIwNSBgRU1BSUxfTk9UX0ZPVU5EYC4gSWYgc2V0IHRvIGBmYWxzZWAgdGhlIHNlcnZlciByZXNwb25kcyB3aXRoIEhUVFAgc3RhdHVzIDIwMCwgYW5kIGNsaWVudCBTREtzIHJldHVybiBhbiB1bmF1dGhlbnRpY2F0ZWQgUGFyc2UgVXNlciB3aXRob3V0IHNlc3Npb24gdG9rZW4uIEluIHRoYXQgY2FzZSBzdWJzZXF1ZW50IHJlcXVlc3RzIGZhaWwgdW50aWwgdGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzIGlzIHZlcmlmaWVkLjxicj48YnI+RGVmYXVsdCBpcyBgZmFsc2VgLjxicj5SZXF1aXJlcyBvcHRpb24gYHZlcmlmeVVzZXJFbWFpbHM6IHRydWVgLlxuICogQHByb3BlcnR5IHtQcm90ZWN0ZWRGaWVsZHN9IHByb3RlY3RlZEZpZWxkcyBQcm90ZWN0ZWQgZmllbGRzIHRoYXQgc2hvdWxkIGJlIHRyZWF0ZWQgd2l0aCBleHRyYSBzZWN1cml0eSB3aGVuIGZldGNoaW5nIGRldGFpbHMuXG4gKiBAcHJvcGVydHkge1VuaW9ufSBwdWJsaWNTZXJ2ZXJVUkwgT3B0aW9uYWwuIFRoZSBwdWJsaWMgVVJMIHRvIFBhcnNlIFNlcnZlci4gVGhpcyBVUkwgd2lsbCBiZSB1c2VkIHRvIHJlYWNoIFBhcnNlIFNlcnZlciBwdWJsaWNseSBmb3IgZmVhdHVyZXMgbGlrZSBwYXNzd29yZCByZXNldCBhbmQgZW1haWwgdmVyaWZpY2F0aW9uIGxpbmtzLiBUaGUgb3B0aW9uIGNhbiBiZSBzZXQgdG8gYSBzdHJpbmcgb3IgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhc3luY2hyb25vdXNseSByZXNvbHZlZC4gVGhlIHJldHVybmVkIFVSTCBzdHJpbmcgbXVzdCBzdGFydCB3aXRoIGBodHRwOi8vYCBvciBgaHR0cHM6Ly9gLlxuICogQHByb3BlcnR5IHtBbnl9IHB1c2ggQ29uZmlndXJhdGlvbiBmb3IgcHVzaCwgYXMgc3RyaW5naWZpZWQgSlNPTi4gU2VlIGh0dHA6Ly9kb2NzLnBhcnNlcGxhdGZvcm0ub3JnL3BhcnNlLXNlcnZlci9ndWlkZS8jcHVzaC1ub3RpZmljYXRpb25zXG4gKiBAcHJvcGVydHkge1JhdGVMaW1pdE9wdGlvbnNbXX0gcmF0ZUxpbWl0IE9wdGlvbnMgdG8gbGltaXQgcmVwZWF0ZWQgcmVxdWVzdHMgdG8gUGFyc2UgU2VydmVyIEFQSXMuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvdGVjdCBzZW5zaXRpdmUgZW5kcG9pbnRzIHN1Y2ggYXMgYC9yZXF1ZXN0UGFzc3dvcmRSZXNldGAgZnJvbSBicnV0ZS1mb3JjZSBhdHRhY2tzIG9yIFBhcnNlIFNlcnZlciBhcyBhIHdob2xlIGZyb20gZGVuaWFsLW9mLXNlcnZpY2UgKERvUykgYXR0YWNrcy48YnI+PGJyPuKEue+4jyBNaW5kIHRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnM6PGJyPi0gcmF0ZSBsaW1pdHMgYXBwbGllZCBwZXIgSVAgYWRkcmVzczsgdGhpcyBsaW1pdHMgcHJvdGVjdGlvbiBhZ2FpbnN0IGRpc3RyaWJ1dGVkIGRlbmlhbC1vZi1zZXJ2aWNlIChERG9TKSBhdHRhY2tzIHdoZXJlIG1hbnkgcmVxdWVzdHMgYXJlIGNvbWluZyBmcm9tIHZhcmlvdXMgSVAgYWRkcmVzc2VzPGJyPi0gaWYgbXVsdGlwbGUgUGFyc2UgU2VydmVyIGluc3RhbmNlcyBhcmUgYmVoaW5kIGEgbG9hZCBiYWxhbmNlciBvciByYW4gaW4gYSBjbHVzdGVyLCBlYWNoIGluc3RhbmNlIHdpbGwgY2FsY3VsYXRlIGl0J3Mgb3duIHJlcXVlc3QgcmF0ZXMsIGluZGVwZW5kZW50IGZyb20gb3RoZXIgaW5zdGFuY2VzOyB0aGlzIGxpbWl0cyB0aGUgYXBwbGljYWJpbGl0eSBvZiB0aGlzIGZlYXR1cmUgd2hlbiB1c2luZyBhIGxvYWQgYmFsYW5jZXIgYW5kIGFub3RoZXIgcmF0ZSBsaW1pdGluZyBzb2x1dGlvbiB0aGF0IHRha2VzIHJlcXVlc3RzIGFjcm9zcyBhbGwgaW5zdGFuY2VzIGludG8gYWNjb3VudCBtYXkgYmUgbW9yZSBzdWl0YWJsZTxicj4tIHRoaXMgZmVhdHVyZSBwcm92aWRlcyBiYXNpYyBwcm90ZWN0aW9uIGFnYWluc3QgZGVuaWFsLW9mLXNlcnZpY2UgYXR0YWNrcywgYnV0IGEgbW9yZSBzb3BoaXN0aWNhdGVkIHNvbHV0aW9uIHdvcmtzIGVhcmxpZXIgaW4gdGhlIHJlcXVlc3QgZmxvdyBhbmQgcHJldmVudHMgYSBtYWxpY2lvdXMgcmVxdWVzdHMgdG8gZXZlbiByZWFjaCBhIHNlcnZlciBpbnN0YW5jZTsgaXQncyB0aGVyZWZvcmUgcmVjb21tZW5kZWQgdG8gaW1wbGVtZW50IGEgc29sdXRpb24gYWNjb3JkaW5nIHRvIGFyY2hpdGVjdHVyZSBhbmQgdXNlciBjYXNlLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHJlYWRPbmx5TWFzdGVyS2V5IFJlYWQtb25seSBrZXksIHdoaWNoIGhhcyB0aGUgc2FtZSBjYXBhYmlsaXRpZXMgYXMgTWFzdGVyS2V5IHdpdGhvdXQgd3JpdGVzXG4gKiBAcHJvcGVydHkge1JlcXVlc3RDb21wbGV4aXR5T3B0aW9uc30gcmVxdWVzdENvbXBsZXhpdHkgT3B0aW9ucyB0byBsaW1pdCB0aGUgY29tcGxleGl0eSBvZiByZXF1ZXN0cyB0byBwcmV2ZW50IGFidXNlLiBFYWNoIG9wdGlvbiBjYW4gYmUgc2V0IHRvIGAtMWAgdG8gZGlzYWJsZS5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHJlcXVlc3RDb250ZXh0TWlkZGxld2FyZSBPcHRpb25zIHRvIGN1c3RvbWl6ZSB0aGUgcmVxdWVzdCBjb250ZXh0IHVzaW5nIGludmVyc2lvbiBvZiBjb250cm9sL2RlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHByb3BlcnR5IHtSZXF1ZXN0S2V5d29yZERlbnlsaXN0W119IHJlcXVlc3RLZXl3b3JkRGVueWxpc3QgQW4gYXJyYXkgb2Yga2V5cyBhbmQgdmFsdWVzIHRoYXQgYXJlIHByb2hpYml0ZWQgaW4gZGF0YWJhc2UgcmVhZCBhbmQgd3JpdGUgcmVxdWVzdHMgdG8gcHJldmVudCBwb3RlbnRpYWwgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzLiBJdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IG9ubHkgYSBrZXkgKGB7XCJrZXlcIjpcIi4uLlwifWApLCBvbmx5IGEgdmFsdWUgKGB7XCJ2YWx1ZVwiOlwiLi4uXCJ9YCkgb3IgYSBrZXktdmFsdWUgcGFpciAoYHtcImtleVwiOlwiLi4uXCIsXCJ2YWx1ZVwiOlwiLi4uXCJ9YCkuIFRoZSBzcGVjaWZpY2F0aW9uIGNhbiB1c2UgdGhlIGZvbGxvd2luZyB0eXBlczogYGJvb2xlYW5gLCBgbnVtZXJpY2Agb3IgYHN0cmluZ2AsIHdoZXJlIGBzdHJpbmdgIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYSByZWdleCBub3RhdGlvbi4gUmVxdWVzdCBkYXRhIGlzIGRlZXAtc2Nhbm5lZCBmb3IgbWF0Y2hpbmcgZGVmaW5pdGlvbnMgdG8gZGV0ZWN0IGFsc28gYW55IG5lc3RlZCBvY2N1cnJlbmNlcy4gRGVmYXVsdHMgYXJlIHBhdHRlcm5zIHRoYXQgYXJlIGxpa2VseSB0byBiZSB1c2VkIGluIG1hbGljaW91cyByZXF1ZXN0cy4gU2V0dGluZyB0aGlzIG9wdGlvbiB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHBhdHRlcm5zLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHJlc3RBUElLZXkgS2V5IGZvciBSRVNUIGNhbGxzXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHJldm9rZVNlc3Npb25PblBhc3N3b3JkUmVzZXQgV2hlbiBhIHVzZXIgY2hhbmdlcyB0aGVpciBwYXNzd29yZCwgZWl0aGVyIHRocm91Z2ggdGhlIHJlc2V0IHBhc3N3b3JkIGVtYWlsIG9yIHdoaWxlIGxvZ2dlZCBpbiwgYWxsIHNlc3Npb25zIGFyZSByZXZva2VkIGlmIHRoaXMgaXMgdHJ1ZS4gU2V0IHRvIGZhbHNlIGlmIHlvdSBkb24ndCB3YW50IHRvIHJldm9rZSBzZXNzaW9ucy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gc2NoZWR1bGVkUHVzaCBDb25maWd1cmF0aW9uIGZvciBwdXNoIHNjaGVkdWxpbmcsIGRlZmF1bHRzIHRvIGZhbHNlLlxuICogQHByb3BlcnR5IHtTY2hlbWFPcHRpb25zfSBzY2hlbWEgRGVmaW5lZCBzY2hlbWFcbiAqIEBwcm9wZXJ0eSB7U2VjdXJpdHlPcHRpb25zfSBzZWN1cml0eSBUaGUgc2VjdXJpdHkgb3B0aW9ucyB0byBpZGVudGlmeSBhbmQgcmVwb3J0IHdlYWsgc2VjdXJpdHkgc2V0dGluZ3MuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHNlbmRVc2VyRW1haWxWZXJpZmljYXRpb24gU2V0IHRvIGBmYWxzZWAgdG8gcHJldmVudCBzZW5kaW5nIG9mIHZlcmlmaWNhdGlvbiBlbWFpbC4gU3VwcG9ydHMgYSBmdW5jdGlvbiB3aXRoIGEgcmV0dXJuIHZhbHVlIG9mIGB0cnVlYCBvciBgZmFsc2VgIGZvciBjb25kaXRpb25hbCBlbWFpbCBzZW5kaW5nLjxicj48YnI+RGVmYXVsdCBpcyBgdHJ1ZWAuPGJyPlxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gc2VydmVyQ2xvc2VDb21wbGV0ZSBDYWxsYmFjayB3aGVuIHNlcnZlciBoYXMgY2xvc2VkXG4gKiBAcHJvcGVydHkge1N0cmluZ30gc2VydmVyVVJMIFRoZSBVUkwgdG8gUGFyc2UgU2VydmVyLjxicj48YnI+4pqg77iPIENlcnRhaW4gc2VydmVyIGZlYXR1cmVzIG9yIGFkYXB0ZXJzIG1heSByZXF1aXJlIFBhcnNlIFNlcnZlciB0byBiZSBhYmxlIHRvIGNhbGwgaXRzZWxmIGJ5IG1ha2luZyByZXF1ZXN0cyB0byB0aGUgVVJMIHNldCBpbiBgc2VydmVyVVJMYC4gSWYgYSBmZWF0dXJlIHJlcXVpcmVzIHRoaXMsIGl0IGlzIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSW4gdGhhdCBjYXNlIGVuc3VyZSB0aGF0IHRoZSBVUkwgaXMgYWNjZXNzaWJsZSBmcm9tIHRoZSBzZXJ2ZXIgaXRzZWxmLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHNlc3Npb25MZW5ndGggU2Vzc2lvbiBkdXJhdGlvbiwgaW4gc2Vjb25kcywgZGVmYXVsdHMgdG8gMSB5ZWFyXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHNpbGVudCBEaXNhYmxlcyBjb25zb2xlIG91dHB1dFxuICogQHByb3BlcnR5IHtCb29sZWFufSBzdGFydExpdmVRdWVyeVNlcnZlciBTdGFydHMgdGhlIGxpdmVRdWVyeSBzZXJ2ZXJcbiAqIEBwcm9wZXJ0eSB7QW55fSB0cnVzdFByb3h5IFRoZSB0cnVzdCBwcm94eSBzZXR0aW5ncy4gSXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhlIGV4YWN0IHNldHVwIG9mIHRoZSByZXZlcnNlIHByb3h5LCBzaW5jZSB0aGlzIHNldHRpbmcgd2lsbCB0cnVzdCB2YWx1ZXMgcHJvdmlkZWQgaW4gdGhlIFBhcnNlIFNlcnZlciBBUEkgcmVxdWVzdC4gU2VlIHRoZSA8YSBocmVmPVwiaHR0cHM6Ly9leHByZXNzanMuY29tL2VuL2d1aWRlL2JlaGluZC1wcm94aWVzLmh0bWxcIj5leHByZXNzIHRydXN0IHByb3h5IHNldHRpbmdzPC9hPiBkb2N1bWVudGF0aW9uLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtTdHJpbmdbXX0gdXNlclNlbnNpdGl2ZUZpZWxkcyBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiBmaWVsZHMgaW4gdGhlIHVzZXIgdGFibGUgdGhlIHNob3VsZCBiZSByZW1vdmVkIGZvciBub24tYXV0aG9yaXplZCB1c2Vycy4gRGVwcmVjYXRlZCBAc2VlIHByb3RlY3RlZEZpZWxkc1xuICogQHByb3BlcnR5IHtCb29sZWFufSB2ZXJib3NlIFNldCB0aGUgbG9nZ2luZyB0byB2ZXJib3NlXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHZlcmlmeVNlcnZlclVybCBQYXJzZSBTZXJ2ZXIgbWFrZXMgYSBIVFRQIHJlcXVlc3QgdG8gdGhlIFVSTCBzZXQgaW4gYHNlcnZlclVSTGAgYXQgdGhlIGVuZCBvZiBpdHMgbGF1bmNoIHJvdXRpbmUgdG8gdmVyaWZ5IHRoYXQgdGhlIGxhdW5jaCBzdWNjZWVkZWQuIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBgZmFsc2VgLCB0aGUgdmVyaWZpY2F0aW9uIHdpbGwgYmUgc2tpcHBlZC4gVGhpcyBjYW4gYmUgdXNlZnVsIGluIGVudmlyb25tZW50cyB3aGVyZSB0aGUgc2VydmVyIFVSTCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBzZXJ2ZXIgaXRzZWxmLCBzdWNoIGFzIHdoZW4gcnVubmluZyBiZWhpbmQgYSBmaXJld2FsbCBvciBpbiBjZXJ0YWluIGNvbnRhaW5lcml6ZWQgZW52aXJvbm1lbnRzLjxicj48YnI+4pqg77iPIFNlcnZlciBVUkwgdmVyaWZpY2F0aW9uIHJlcXVpcmVzIFBhcnNlIFNlcnZlciB0byBiZSBhYmxlIHRvIGNhbGwgaXRzZWxmIGJ5IG1ha2luZyByZXF1ZXN0cyB0byB0aGUgVVJMIHNldCBpbiBgc2VydmVyVVJMYC48YnI+PGJyPkRlZmF1bHQgaXMgYHRydWVgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSB2ZXJpZnlVc2VyRW1haWxzIFNldCB0byBgdHJ1ZWAgdG8gcmVxdWlyZSB1c2VycyB0byB2ZXJpZnkgdGhlaXIgZW1haWwgYWRkcmVzcyB0byBjb21wbGV0ZSB0aGUgc2lnbi11cCBwcm9jZXNzLiBTdXBwb3J0cyBhIGZ1bmN0aW9uIHdpdGggYSByZXR1cm4gdmFsdWUgb2YgYHRydWVgIG9yIGBmYWxzZWAgZm9yIGNvbmRpdGlvbmFsIHZlcmlmaWNhdGlvbi48YnI+PGJyPkRlZmF1bHQgaXMgYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB3ZWJob29rS2V5IEtleSBzZW50IHdpdGggb3V0Z29pbmcgd2ViaG9vayBjYWxsc1xuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBSYXRlTGltaXRPcHRpb25zXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZXJyb3JSZXNwb25zZU1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgaW4gdGhlIGJvZHkgb2YgdGhlIEhUVFAgNDI5IHJlc3BvbnNlIHdoZW4gdGhlIHJhdGUgbGltaXQgaXMgaGl0LiBEZWZhdWx0IGlzIGBUb28gbWFueSByZXF1ZXN0cy5gLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBpbmNsdWRlSW50ZXJuYWxSZXF1ZXN0cyBPcHRpb25hbCwgaWYgYHRydWVgIHRoZSByYXRlIGxpbWl0IHdpbGwgYWxzbyBhcHBseSB0byByZXF1ZXN0cyB0aGF0IGFyZSBtYWRlIGluIGJ5IENsb3VkIENvZGUsIGRlZmF1bHQgaXMgYGZhbHNlYC4gTm90ZSB0aGF0IGEgcHVibGljIENsb3VkIENvZGUgZnVuY3Rpb24gdGhhdCB0cmlnZ2VycyBpbnRlcm5hbCByZXF1ZXN0cyBtYXkgY2lyY3VtdmVudCByYXRlIGxpbWl0aW5nIGFuZCBiZSB2dWxuZXJhYmxlIHRvIGF0dGFja3MuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGluY2x1ZGVNYXN0ZXJLZXkgT3B0aW9uYWwsIGlmIGB0cnVlYCB0aGUgcmF0ZSBsaW1pdCB3aWxsIGFsc28gYXBwbHkgdG8gcmVxdWVzdHMgdXNpbmcgdGhlIGBtYXN0ZXJLZXlgLCBkZWZhdWx0IGlzIGBmYWxzZWAuIE5vdGUgdGhhdCBhIHB1YmxpYyBDbG91ZCBDb2RlIGZ1bmN0aW9uIHRoYXQgdHJpZ2dlcnMgaW50ZXJuYWwgcmVxdWVzdHMgdXNpbmcgdGhlIGBtYXN0ZXJLZXlgIG1heSBjaXJjdW12ZW50IHJhdGUgbGltaXRpbmcgYW5kIGJlIHZ1bG5lcmFibGUgdG8gYXR0YWNrcy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSByZWRpc1VybCBPcHRpb25hbCwgdGhlIFVSTCBvZiB0aGUgUmVkaXMgc2VydmVyIHRvIHN0b3JlIHJhdGUgbGltaXQgZGF0YS4gVGhpcyBhbGxvd3MgdG8gcmF0ZSBsaW1pdCByZXF1ZXN0cyBmb3IgbXVsdGlwbGUgc2VydmVycyBieSBjYWxjdWxhdGluZyB0aGUgc3VtIG9mIGFsbCByZXF1ZXN0cyBhY3Jvc3MgYWxsIHNlcnZlcnMuIFRoaXMgaXMgdXNlZnVsIGlmIG11bHRpcGxlIHNlcnZlcnMgYXJlIHByb2Nlc3NpbmcgcmVxdWVzdHMgYmVoaW5kIGEgbG9hZCBiYWxhbmNlci4gRm9yIGV4YW1wbGUsIHRoZSBsaW1pdCBvZiAxMCByZXF1ZXN0cyBpcyByZWFjaGVkIGlmIGVhY2ggb2YgMiBzZXJ2ZXJzIHByb2Nlc3NlZCA1IHJlcXVlc3RzLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHJlcXVlc3RDb3VudCBUaGUgbnVtYmVyIG9mIHJlcXVlc3RzIHRoYXQgY2FuIGJlIG1hZGUgcGVyIElQIGFkZHJlc3Mgd2l0aGluIHRoZSB0aW1lIHdpbmRvdyBzZXQgaW4gYHJlcXVlc3RUaW1lV2luZG93YCBiZWZvcmUgdGhlIHJhdGUgbGltaXQgaXMgYXBwbGllZC4gRm9yIGJhdGNoIHJlcXVlc3RzLCB0aGlzIGFsc28gbGltaXRzIHRoZSBudW1iZXIgb2Ygc3ViLXJlcXVlc3RzIGluIGEgc2luZ2xlIGJhdGNoIHRoYXQgdGFyZ2V0IHRoaXMgcGF0aDsgaG93ZXZlciwgcmVxdWVzdHMgYWxyZWFkeSBjb25zdW1lZCBpbiB0aGUgY3VycmVudCB0aW1lIHdpbmRvdyBhcmUgbm90IGNvdW50ZWQgYWdhaW5zdCB0aGUgYmF0Y2gsIHNvIHRoZSBlZmZlY3RpdmUgbGltaXQgbWF5IGJlIGhpZ2hlciB3aGVuIGNvbWJpbmluZyBpbmRpdmlkdWFsIGFuZCBiYXRjaCByZXF1ZXN0cy4gTm90ZSB0aGF0IHRoaXMgaXMgYSBiYXNpYyBzZXJ2ZXItbGV2ZWwgcmF0ZSBsaW1pdDsgZm9yIGNvbXByZWhlbnNpdmUgcHJvdGVjdGlvbiwgdXNlIGEgcmV2ZXJzZSBwcm94eSBvciBXQUYgZm9yIHJhdGUgbGltaXRpbmcuXG4gKiBAcHJvcGVydHkge1N0cmluZ1tdfSByZXF1ZXN0TWV0aG9kcyBPcHRpb25hbCwgdGhlIEhUVFAgcmVxdWVzdCBtZXRob2RzIHRvIHdoaWNoIHRoZSByYXRlIGxpbWl0IHNob3VsZCBiZSBhcHBsaWVkLCBkZWZhdWx0IGlzIGFsbCBtZXRob2RzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHJlcXVlc3RQYXRoIFRoZSBwYXRoIG9mIHRoZSBBUEkgcm91dGUgdG8gYmUgcmF0ZSBsaW1pdGVkLiBSb3V0ZSBwYXRocywgaW4gY29tYmluYXRpb24gd2l0aCBhIHJlcXVlc3QgbWV0aG9kLCBkZWZpbmUgdGhlIGVuZHBvaW50cyBhdCB3aGljaCByZXF1ZXN0cyBjYW4gYmUgbWFkZS4gUm91dGUgcGF0aHMgY2FuIGJlIHN0cmluZ3MsIHN0cmluZyBwYXR0ZXJucywgb3IgcmVndWxhciBleHByZXNzaW9uLiBTZWU6IGh0dHBzOi8vZXhwcmVzc2pzLmNvbS9lbi9ndWlkZS9yb3V0aW5nLmh0bWxcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSByZXF1ZXN0VGltZVdpbmRvdyBUaGUgd2luZG93IG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHdpdGhpbiB3aGljaCB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIHNldCBpbiBgcmVxdWVzdENvdW50YCBjYW4gYmUgbWFkZSBiZWZvcmUgdGhlIHJhdGUgbGltaXQgaXMgYXBwbGllZC5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB6b25lIFRoZSB0eXBlIG9mIHJhdGUgbGltaXQgdG8gYXBwbHkuIFRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIHN1cHBvcnRlZDo8dWw+PGxpPmBnbG9iYWxgOiByYXRlIGxpbWl0IGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMgbWFkZSBieSBhbGwgdXNlcnM8L2xpPjxsaT5gaXBgOiByYXRlIGxpbWl0IGJhc2VkIG9uIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSByZXF1ZXN0PC9saT48bGk+YHVzZXJgOiByYXRlIGxpbWl0IGJhc2VkIG9uIHRoZSB1c2VyIElEIG9mIHRoZSByZXF1ZXN0PC9saT48bGk+YHNlc3Npb25gOiByYXRlIGxpbWl0IGJhc2VkIG9uIHRoZSBzZXNzaW9uIHRva2VuIG9mIHRoZSByZXF1ZXN0PC9saT48L3VsPkRlZmF1bHQgaXMgYGlwYC5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgUmVxdWVzdENvbXBsZXhpdHlPcHRpb25zXG4gKiBAcHJvcGVydHkge051bWJlcn0gZ3JhcGhRTERlcHRoIE1heGltdW0gZGVwdGggb2YgR3JhcGhRTCBmaWVsZCBzZWxlY3Rpb25zLiBTZXQgdG8gYC0xYCB0byBkaXNhYmxlLiBEZWZhdWx0IGlzIGA1MGAuXG4gKiBAcHJvcGVydHkge051bWJlcn0gZ3JhcGhRTEZpZWxkcyBNYXhpbXVtIG51bWJlciBvZiBmaWVsZCBzZWxlY3Rpb25zIGluIGEgR3JhcGhRTCBxdWVyeS4gU2V0IHRvIGAtMWAgdG8gZGlzYWJsZS4gRGVmYXVsdCBpcyBgMjAwYC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBpbmNsdWRlQ291bnQgTWF4aW11bSBudW1iZXIgb2YgaW5jbHVkZSBwYXRocyBpbiBhIHNpbmdsZSBxdWVyeS4gU2V0IHRvIGAtMWAgdG8gZGlzYWJsZS4gRGVmYXVsdCBpcyBgNTBgLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGluY2x1ZGVEZXB0aCBNYXhpbXVtIGRlcHRoIG9mIGluY2x1ZGUgcG9pbnRlciBjaGFpbnMgKGUuZy4gYGEuYi5jYCA9IGRlcHRoIDMpLiBTZXQgdG8gYC0xYCB0byBkaXNhYmxlLiBEZWZhdWx0IGlzIGA1YC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBzdWJxdWVyeURlcHRoIE1heGltdW0gbmVzdGluZyBkZXB0aCBvZiBgJGluUXVlcnlgLCBgJG5vdEluUXVlcnlgLCBgJHNlbGVjdGAsIGAkZG9udFNlbGVjdGAgc3VicXVlcmllcy4gU2V0IHRvIGAtMWAgdG8gZGlzYWJsZS4gRGVmYXVsdCBpcyBgNWAuXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIFNlY3VyaXR5T3B0aW9uc1xuICogQHByb3BlcnR5IHtDaGVja0dyb3VwW119IGNoZWNrR3JvdXBzIFRoZSBzZWN1cml0eSBjaGVjayBncm91cHMgdG8gcnVuLiBUaGlzIGFsbG93cyB0byBhZGQgY3VzdG9tIHNlY3VyaXR5IGNoZWNrcyBvciBvdmVycmlkZSBleGlzdGluZyBvbmVzLiBEZWZhdWx0IGFyZSB0aGUgZ3JvdXBzIGRlZmluZWQgaW4gYENoZWNrR3JvdXBzLmpzYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlQ2hlY2sgSXMgdHJ1ZSBpZiBQYXJzZSBTZXJ2ZXIgc2hvdWxkIGNoZWNrIGZvciB3ZWFrIHNlY3VyaXR5IHNldHRpbmdzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVDaGVja0xvZyBJcyB0cnVlIGlmIHRoZSBzZWN1cml0eSBjaGVjayByZXBvcnQgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gbG9ncy4gVGhpcyBzaG91bGQgb25seSBiZSBlbmFibGVkIHRlbXBvcmFyaWx5IHRvIG5vdCBleHBvc2Ugd2VhayBzZWN1cml0eSBzZXR0aW5ncyBpbiBsb2dzLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBQYWdlc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7UGFnZXNSb3V0ZVtdfSBjdXN0b21Sb3V0ZXMgVGhlIGN1c3RvbSByb3V0ZXMuXG4gKiBAcHJvcGVydHkge1BhZ2VzQ3VzdG9tVXJsc09wdGlvbnN9IGN1c3RvbVVybHMgVGhlIFVSTHMgdG8gdGhlIGN1c3RvbSBwYWdlcy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlTG9jYWxpemF0aW9uIElzIHRydWUgaWYgcGFnZXMgc2hvdWxkIGJlIGxvY2FsaXplZDsgdGhpcyBoYXMgbm8gZWZmZWN0IG9uIGN1c3RvbSBwYWdlIHJlZGlyZWN0cy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlUm91dGVyIElzIHRydWUgaWYgdGhlIHBhZ2VzIHJvdXRlciBzaG91bGQgYmUgZW5hYmxlZDsgdGhpcyBpcyByZXF1aXJlZCBmb3IgYW55IG9mIHRoZSBwYWdlcyBvcHRpb25zIHRvIHRha2UgZWZmZWN0LlxuICogQHByb3BlcnR5IHtCb29sZWFufSBmb3JjZVJlZGlyZWN0IElzIHRydWUgaWYgcmVzcG9uc2VzIHNob3VsZCBhbHdheXMgYmUgcmVkaXJlY3RzIGFuZCBuZXZlciBjb250ZW50LCBmYWxzZSBpZiB0aGUgcmVzcG9uc2UgdHlwZSBzaG91bGQgZGVwZW5kIG9uIHRoZSByZXF1ZXN0IHR5cGUgKEdFVCByZXF1ZXN0IC0+IGNvbnRlbnQgcmVzcG9uc2U7IFBPU1QgcmVxdWVzdCAtPiByZWRpcmVjdCByZXNwb25zZSkuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbG9jYWxpemF0aW9uRmFsbGJhY2tMb2NhbGUgVGhlIGZhbGxiYWNrIGxvY2FsZSBmb3IgbG9jYWxpemF0aW9uIGlmIG5vIG1hdGNoaW5nIHRyYW5zbGF0aW9uIGlzIHByb3ZpZGVkIGZvciB0aGUgZ2l2ZW4gbG9jYWxlLiBUaGlzIGlzIG9ubHkgcmVsZXZhbnQgd2hlbiBwcm92aWRpbmcgdHJhbnNsYXRpb24gcmVzb3VyY2VzIHZpYSBKU09OIGZpbGUuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbG9jYWxpemF0aW9uSnNvblBhdGggVGhlIHBhdGggdG8gdGhlIEpTT04gZmlsZSBmb3IgbG9jYWxpemF0aW9uOyB0aGUgdHJhbnNsYXRpb25zIHdpbGwgYmUgdXNlZCB0byBmaWxsIHRlbXBsYXRlIHBsYWNlaG9sZGVycyBhY2NvcmRpbmcgdG8gdGhlIGxvY2FsZS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwYWdlc0VuZHBvaW50IFRoZSBBUEkgZW5kcG9pbnQgZm9yIHRoZSBwYWdlcy4gRGVmYXVsdCBpcyAnYXBwcycuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcGFnZXNQYXRoIFRoZSBwYXRoIHRvIHRoZSBwYWdlcyBkaXJlY3Rvcnk7IHRoaXMgYWxzbyBkZWZpbmVzIHdoZXJlIHRoZSBzdGF0aWMgZW5kcG9pbnQgJy9hcHBzJyBwb2ludHMgdG8uIERlZmF1bHQgaXMgdGhlICcuL3B1YmxpYy8nIGRpcmVjdG9yeS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwbGFjZWhvbGRlcnMgVGhlIHBsYWNlaG9sZGVyIGtleXMgYW5kIHZhbHVlcyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiBwYWdlczsgdGhpcyBjYW4gYmUgYSBzaW1wbGUgb2JqZWN0IG9yIGEgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIFBhZ2VzUm91dGVcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGhhbmRsZXIgVGhlIHJvdXRlIGhhbmRsZXIgdGhhdCBpcyBhbiBhc3luYyBmdW5jdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBtZXRob2QgVGhlIHJvdXRlIG1ldGhvZCwgZS5nLiAnR0VUJyBvciAnUE9TVCcuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcGF0aCBUaGUgcm91dGUgcGF0aC5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgUGFnZXNDdXN0b21VcmxzT3B0aW9uc1xuICogQHByb3BlcnR5IHtTdHJpbmd9IGVtYWlsVmVyaWZpY2F0aW9uTGlua0V4cGlyZWQgVGhlIFVSTCB0byB0aGUgY3VzdG9tIHBhZ2UgZm9yIGVtYWlsIHZlcmlmaWNhdGlvbiAtPiBsaW5rIGV4cGlyZWQuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZW1haWxWZXJpZmljYXRpb25MaW5rSW52YWxpZCBUaGUgVVJMIHRvIHRoZSBjdXN0b20gcGFnZSBmb3IgZW1haWwgdmVyaWZpY2F0aW9uIC0+IGxpbmsgaW52YWxpZC5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBlbWFpbFZlcmlmaWNhdGlvblNlbmRGYWlsIFRoZSBVUkwgdG8gdGhlIGN1c3RvbSBwYWdlIGZvciBlbWFpbCB2ZXJpZmljYXRpb24gLT4gbGluayBzZW5kIGZhaWwuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZW1haWxWZXJpZmljYXRpb25TZW5kU3VjY2VzcyBUaGUgVVJMIHRvIHRoZSBjdXN0b20gcGFnZSBmb3IgZW1haWwgdmVyaWZpY2F0aW9uIC0+IHJlc2VuZCBsaW5rIC0+IHN1Y2Nlc3MuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZW1haWxWZXJpZmljYXRpb25TdWNjZXNzIFRoZSBVUkwgdG8gdGhlIGN1c3RvbSBwYWdlIGZvciBlbWFpbCB2ZXJpZmljYXRpb24gLT4gc3VjY2Vzcy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwYXNzd29yZFJlc2V0IFRoZSBVUkwgdG8gdGhlIGN1c3RvbSBwYWdlIGZvciBwYXNzd29yZCByZXNldC5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwYXNzd29yZFJlc2V0TGlua0ludmFsaWQgVGhlIFVSTCB0byB0aGUgY3VzdG9tIHBhZ2UgZm9yIHBhc3N3b3JkIHJlc2V0IC0+IGxpbmsgaW52YWxpZC5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwYXNzd29yZFJlc2V0U3VjY2VzcyBUaGUgVVJMIHRvIHRoZSBjdXN0b20gcGFnZSBmb3IgcGFzc3dvcmQgcmVzZXQgLT4gc3VjY2Vzcy5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgQ3VzdG9tUGFnZXNPcHRpb25zXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY2hvb3NlUGFzc3dvcmQgY2hvb3NlIHBhc3N3b3JkIHBhZ2UgcGF0aFxuICogQHByb3BlcnR5IHtTdHJpbmd9IGV4cGlyZWRWZXJpZmljYXRpb25MaW5rIGV4cGlyZWQgdmVyaWZpY2F0aW9uIGxpbmsgcGFnZSBwYXRoXG4gKiBAcHJvcGVydHkge1N0cmluZ30gaW52YWxpZExpbmsgaW52YWxpZCBsaW5rIHBhZ2UgcGF0aFxuICogQHByb3BlcnR5IHtTdHJpbmd9IGludmFsaWRQYXNzd29yZFJlc2V0TGluayBpbnZhbGlkIHBhc3N3b3JkIHJlc2V0IGxpbmsgcGFnZSBwYXRoXG4gKiBAcHJvcGVydHkge1N0cmluZ30gaW52YWxpZFZlcmlmaWNhdGlvbkxpbmsgaW52YWxpZCB2ZXJpZmljYXRpb24gbGluayBwYWdlIHBhdGhcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBsaW5rU2VuZEZhaWwgdmVyaWZpY2F0aW9uIGxpbmsgc2VuZCBmYWlsIHBhZ2UgcGF0aFxuICogQHByb3BlcnR5IHtTdHJpbmd9IGxpbmtTZW5kU3VjY2VzcyB2ZXJpZmljYXRpb24gbGluayBzZW5kIHN1Y2Nlc3MgcGFnZSBwYXRoXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcGFyc2VGcmFtZVVSTCBmb3IgbWFza2luZyB1c2VyLWZhY2luZyBwYWdlc1xuICogQHByb3BlcnR5IHtTdHJpbmd9IHBhc3N3b3JkUmVzZXRTdWNjZXNzIHBhc3N3b3JkIHJlc2V0IHN1Y2Nlc3MgcGFnZSBwYXRoXG4gKiBAcHJvcGVydHkge1N0cmluZ30gdmVyaWZ5RW1haWxTdWNjZXNzIHZlcmlmeSBlbWFpbCBzdWNjZXNzIHBhZ2UgcGF0aFxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBMaXZlUXVlcnlPcHRpb25zXG4gKiBAcHJvcGVydHkge1N0cmluZ1tdfSBjbGFzc05hbWVzIHBhcnNlLXNlcnZlcidzIExpdmVRdWVyeSBjbGFzc05hbWVzXG4gKiBAcHJvcGVydHkge0FkYXB0ZXI8UHViU3ViQWRhcHRlcj59IHB1YlN1YkFkYXB0ZXIgTGl2ZVF1ZXJ5IHB1YnN1YiBhZGFwdGVyXG4gKiBAcHJvcGVydHkge0FueX0gcmVkaXNPcHRpb25zIHBhcnNlLXNlcnZlcidzIExpdmVRdWVyeSByZWRpc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSByZWRpc1VSTCBwYXJzZS1zZXJ2ZXIncyBMaXZlUXVlcnkgcmVkaXNVUkxcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSByZWdleFRpbWVvdXQgU2V0cyB0aGUgbWF4aW11bSBleGVjdXRpb24gdGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIG1hdGNoaW5nIGluIExpdmVRdWVyeS4gVGhpcyBwcm90ZWN0cyBhZ2FpbnN0IFJlZ3VsYXIgRXhwcmVzc2lvbiBEZW5pYWwgb2YgU2VydmljZSAoUmVEb1MpIGF0dGFja3Mgd2hlcmUgYSBtYWxpY2lvdXMgcmVnZXggcGF0dGVybiBjb3VsZCBibG9jayB0aGUgZXZlbnQgbG9vcC4gQSByZWdleCB0aGF0IGV4Y2VlZHMgdGhlIHRpbWVvdXQgd2lsbCBiZSB0cmVhdGVkIGFzIG5vbi1tYXRjaGluZy48YnI+PGJyPlRoZSBwcm90ZWN0aW9uIHJ1bnMgZWFjaCByZWdleCBldmFsdWF0aW9uIGluIGFuIGlzb2xhdGVkIFZNIGNvbnRleHQgd2l0aCBhIHRpbWVvdXQuIFRoaXMgYWRkcyBhcHByb3hpbWF0ZWx5IDUwIG1pY3Jvc2Vjb25kcyBvZiBvdmVyaGVhZCBwZXIgcmVnZXggZXZhbHVhdGlvbi4gRm9yIG1vc3QgYXBwbGljYXRpb25zIHRoaXMgaXMgbmVnbGlnaWJsZSwgYnV0IGl0IGNhbiBhZGQgdXAgaWYgeW91IGhhdmUgYSB2ZXJ5IGxhcmdlIG51bWJlciBvZiBMaXZlUXVlcnkgc3Vic2NyaXB0aW9ucyB0aGF0IHVzZSBgJHJlZ2V4YCBvbiB0aGUgc2FtZSBjbGFzcy4gRm9yIGV4YW1wbGUsIDEwLDAwMCBjb25jdXJyZW50IHJlZ2V4IHN1YnNjcmlwdGlvbnMgd291bGQgYWRkIGFwcHJveGltYXRlbHkgNTAwbXMgb2YgcHJvY2Vzc2luZyB0aW1lIHBlciBvYmplY3Qgc2F2ZSBldmVudCBvbiB0aGF0IGNsYXNzLjxicj48YnI+U2V0IHRvIGAwYCB0byBkaXNhYmxlIHRoZSB0aW1lb3V0IGFuZCB1c2UgbmF0aXZlIHJlZ2V4IGV2YWx1YXRpb24gd2l0aG91dCBwcm90ZWN0aW9uLiBEZWZhdWx0cyB0byBgMTAwYC5cbiAqIEBwcm9wZXJ0eSB7QWRhcHRlcjxXU1NBZGFwdGVyPn0gd3NzQWRhcHRlciBBZGFwdGVyIG1vZHVsZSBmb3IgdGhlIFdlYlNvY2tldFNlcnZlclxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBMaXZlUXVlcnlTZXJ2ZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge1N0cmluZ30gYXBwSWQgVGhpcyBzdHJpbmcgc2hvdWxkIG1hdGNoIHRoZSBhcHBJZCBpbiB1c2UgYnkgeW91ciBQYXJzZSBTZXJ2ZXIuIElmIHlvdSBkZXBsb3kgdGhlIExpdmVRdWVyeSBzZXJ2ZXIgYWxvbmdzaWRlIFBhcnNlIFNlcnZlciwgdGhlIExpdmVRdWVyeSBzZXJ2ZXIgd2lsbCB0cnkgdG8gdXNlIHRoZSBzYW1lIGFwcElkLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGNhY2hlVGltZW91dCBOdW1iZXIgaW4gbWlsbGlzZWNvbmRzLiBXaGVuIGNsaWVudHMgcHJvdmlkZSB0aGUgc2Vzc2lvblRva2VuIHRvIHRoZSBMaXZlUXVlcnkgc2VydmVyLCB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciB3aWxsIHRyeSB0byBmZXRjaCBpdHMgUGFyc2VVc2VyJ3Mgb2JqZWN0SWQgZnJvbSBwYXJzZSBzZXJ2ZXIgYW5kIHN0b3JlIGl0IGluIHRoZSBjYWNoZS4gVGhlIHZhbHVlIGRlZmluZXMgdGhlIGR1cmF0aW9uIG9mIHRoZSBjYWNoZS4gQ2hlY2sgdGhlIGZvbGxvd2luZyBTZWN1cml0eSBzZWN0aW9uIGFuZCBvdXIgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscywgZGVmYXVsdHMgdG8gNSAqIDEwMDAgbXMgKDUgc2Vjb25kcykuXG4gKiBAcHJvcGVydHkge0FueX0ga2V5UGFpcnMgQSBKU09OIG9iamVjdCB0aGF0IHNlcnZlcyBhcyBhIHdoaXRlbGlzdCBvZiBrZXlzLiBJdCBpcyB1c2VkIGZvciB2YWxpZGF0aW5nIGNsaWVudHMgd2hlbiB0aGV5IHRyeSB0byBjb25uZWN0IHRvIHRoZSBMaXZlUXVlcnkgc2VydmVyLiBDaGVjayB0aGUgZm9sbG93aW5nIFNlY3VyaXR5IHNlY3Rpb24gYW5kIG91ciBwcm90b2NvbCBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGxvZ0xldmVsIFRoaXMgc3RyaW5nIGRlZmluZXMgdGhlIGxvZyBsZXZlbCBvZiB0aGUgTGl2ZVF1ZXJ5IHNlcnZlci4gV2Ugc3VwcG9ydCBWRVJCT1NFLCBJTkZPLCBFUlJPUiwgTk9ORSwgZGVmYXVsdHMgdG8gSU5GTy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBtYXN0ZXJLZXkgVGhpcyBzdHJpbmcgc2hvdWxkIG1hdGNoIHRoZSBtYXN0ZXJLZXkgaW4gdXNlIGJ5IHlvdXIgUGFyc2UgU2VydmVyLiBJZiB5b3UgZGVwbG95IHRoZSBMaXZlUXVlcnkgc2VydmVyIGFsb25nc2lkZSBQYXJzZSBTZXJ2ZXIsIHRoZSBMaXZlUXVlcnkgc2VydmVyIHdpbGwgdHJ5IHRvIHVzZSB0aGUgc2FtZSBtYXN0ZXJLZXkuXG4gKiBAcHJvcGVydHkge051bWJlcn0gcG9ydCBUaGUgcG9ydCB0byBydW4gdGhlIExpdmVRdWVyeSBzZXJ2ZXIsIGRlZmF1bHRzIHRvIDEzMzcuXG4gKiBAcHJvcGVydHkge0FkYXB0ZXI8UHViU3ViQWRhcHRlcj59IHB1YlN1YkFkYXB0ZXIgTGl2ZVF1ZXJ5IHB1YnN1YiBhZGFwdGVyXG4gKiBAcHJvcGVydHkge0FueX0gcmVkaXNPcHRpb25zIHBhcnNlLXNlcnZlcidzIExpdmVRdWVyeSByZWRpc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSByZWRpc1VSTCBwYXJzZS1zZXJ2ZXIncyBMaXZlUXVlcnkgcmVkaXNVUkxcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBzZXJ2ZXJVUkwgVGhpcyBzdHJpbmcgc2hvdWxkIG1hdGNoIHRoZSBzZXJ2ZXJVUkwgaW4gdXNlIGJ5IHlvdXIgUGFyc2UgU2VydmVyLiBJZiB5b3UgZGVwbG95IHRoZSBMaXZlUXVlcnkgc2VydmVyIGFsb25nc2lkZSBQYXJzZSBTZXJ2ZXIsIHRoZSBMaXZlUXVlcnkgc2VydmVyIHdpbGwgdHJ5IHRvIHVzZSB0aGUgc2FtZSBzZXJ2ZXJVUkwuXG4gKiBAcHJvcGVydHkge051bWJlcn0gd2Vic29ja2V0VGltZW91dCBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJldHdlZW4gcGluZy9wb25nIGZyYW1lcy4gVGhlIFdlYlNvY2tldCBzZXJ2ZXIgc2VuZHMgcGluZy9wb25nIGZyYW1lcyB0byB0aGUgY2xpZW50cyB0byBrZWVwIHRoZSBXZWJTb2NrZXQgYWxpdmUuIFRoaXMgdmFsdWUgZGVmaW5lcyB0aGUgaW50ZXJ2YWwgb2YgdGhlIHBpbmcvcG9uZyBmcmFtZSBmcm9tIHRoZSBzZXJ2ZXIgdG8gY2xpZW50cywgZGVmYXVsdHMgdG8gMTAgKiAxMDAwIG1zICgxMCBzKS5cbiAqIEBwcm9wZXJ0eSB7QWRhcHRlcjxXU1NBZGFwdGVyPn0gd3NzQWRhcHRlciBBZGFwdGVyIG1vZHVsZSBmb3IgdGhlIFdlYlNvY2tldFNlcnZlclxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBJZGVtcG90ZW5jeU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IHBhdGhzIEFuIGFycmF5IG9mIHBhdGhzIGZvciB3aGljaCB0aGUgZmVhdHVyZSBzaG91bGQgYmUgZW5hYmxlZC4gVGhlIG1vdW50IHBhdGggbXVzdCBub3QgYmUgaW5jbHVkZWQsIGZvciBleGFtcGxlIGluc3RlYWQgb2YgYC9wYXJzZS9mdW5jdGlvbnMvbXlGdW5jdGlvbmAgc3BlY2lmaXkgYGZ1bmN0aW9ucy9teUZ1bmN0aW9uYC4gVGhlIGVudHJpZXMgYXJlIGludGVycHJldGVkIGFzIHJlZ3VsYXIgZXhwcmVzc2lvbiwgZm9yIGV4YW1wbGUgYGZ1bmN0aW9ucy8uKmAgbWF0Y2hlcyBhbGwgZnVuY3Rpb25zLCBgam9icy8uKmAgbWF0Y2hlcyBhbGwgam9icywgYGNsYXNzZXMvLipgIG1hdGNoZXMgYWxsIGNsYXNzZXMsIGAuKmAgbWF0Y2hlcyBhbGwgcGF0aHMuXG4gKiBAcHJvcGVydHkge051bWJlcn0gdHRsIFRoZSBkdXJhdGlvbiBpbiBzZWNvbmRzIGFmdGVyIHdoaWNoIGEgcmVxdWVzdCByZWNvcmQgaXMgZGlzY2FyZGVkIGZyb20gdGhlIGRhdGFiYXNlLCBkZWZhdWx0cyB0byAzMDBzLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBBY2NvdW50TG9ja291dE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBkdXJhdGlvbiBTZXQgdGhlIGR1cmF0aW9uIGluIG1pbnV0ZXMgdGhhdCBhIGxvY2tlZC1vdXQgYWNjb3VudCByZW1haW5zIGxvY2tlZCBvdXQgYmVmb3JlIGF1dG9tYXRpY2FsbHkgYmVjb21pbmcgdW5sb2NrZWQuPGJyPjxicj5WYWxpZCB2YWx1ZXMgYXJlIGdyZWF0ZXIgdGhhbiBgMGAgYW5kIGxlc3MgdGhhbiBgMTAwMDAwYC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB0aHJlc2hvbGQgU2V0IHRoZSBudW1iZXIgb2YgZmFpbGVkIHNpZ24taW4gYXR0ZW1wdHMgdGhhdCB3aWxsIGNhdXNlIGEgdXNlciBhY2NvdW50IHRvIGJlIGxvY2tlZC4gSWYgdGhlIGFjY291bnQgaXMgbG9ja2VkLiBUaGUgYWNjb3VudCB3aWxsIHVubG9jayBhZnRlciB0aGUgZHVyYXRpb24gc2V0IGluIHRoZSBgZHVyYXRpb25gIG9wdGlvbiBoYXMgcGFzc2VkIGFuZCBubyBmdXJ0aGVyIGxvZ2luIGF0dGVtcHRzIGhhdmUgYmVlbiBtYWRlLjxicj48YnI+VmFsaWQgdmFsdWVzIGFyZSBncmVhdGVyIHRoYW4gYDBgIGFuZCBsZXNzIHRoYW4gYDEwMDBgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSB1bmxvY2tPblBhc3N3b3JkUmVzZXQgU2V0IHRvIGB0cnVlYCAgaWYgdGhlIGFjY291bnQgc2hvdWxkIGJlIHVubG9ja2VkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBwYXNzd29yZCByZXNldC48YnI+PGJyPkRlZmF1bHQgaXMgYGZhbHNlYC48YnI+UmVxdWlyZXMgb3B0aW9ucyBgZHVyYXRpb25gIGFuZCBgdGhyZXNob2xkYCB0byBiZSBzZXQuXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIFBhc3N3b3JkUG9saWN5T3B0aW9uc1xuICogQHByb3BlcnR5IHtCb29sZWFufSBkb05vdEFsbG93VXNlcm5hbWUgU2V0IHRvIGB0cnVlYCB0byBkaXNhbGxvdyB0aGUgdXNlcm5hbWUgYXMgcGFydCBvZiB0aGUgcGFzc3dvcmQuPGJyPjxicj5EZWZhdWx0IGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge051bWJlcn0gbWF4UGFzc3dvcmRBZ2UgU2V0IHRoZSBudW1iZXIgb2YgZGF5cyBhZnRlciB3aGljaCBhIHBhc3N3b3JkIGV4cGlyZXMuIExvZ2luIGF0dGVtcHRzIGZhaWwgaWYgdGhlIHVzZXIgZG9lcyBub3QgcmVzZXQgdGhlIHBhc3N3b3JkIGJlZm9yZSBleHBpcmF0aW9uLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IG1heFBhc3N3b3JkSGlzdG9yeSBTZXQgdGhlIG51bWJlciBvZiBwcmV2aW91cyBwYXNzd29yZCB0aGF0IHdpbGwgbm90IGJlIGFsbG93ZWQgdG8gYmUgc2V0IGFzIG5ldyBwYXNzd29yZC4gSWYgdGhlIG9wdGlvbiBpcyBub3Qgc2V0IG9yIHNldCB0byBgMGAsIG5vIHByZXZpb3VzIHBhc3N3b3JkcyB3aWxsIGJlIGNvbnNpZGVyZWQuPGJyPjxicj5WYWxpZCB2YWx1ZXMgYXJlID49IGAwYCBhbmQgPD0gYDIwYC48YnI+RGVmYXVsdCBpcyBgMGAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHJlc2V0UGFzc3dvcmRTdWNjZXNzT25JbnZhbGlkRW1haWwgU2V0IHRvIGB0cnVlYCBpZiBhIHJlcXVlc3QgdG8gcmVzZXQgdGhlIHBhc3N3b3JkIHNob3VsZCByZXR1cm4gYSBzdWNjZXNzIHJlc3BvbnNlIGV2ZW4gaWYgdGhlIHByb3ZpZGVkIGVtYWlsIGFkZHJlc3MgaXMgaW52YWxpZCwgb3IgYGZhbHNlYCBpZiB0aGUgcmVxdWVzdCBzaG91bGQgcmV0dXJuIGFuIGVycm9yIHJlc3BvbnNlIGlmIHRoZSBlbWFpbCBhZGRyZXNzIGlzIGludmFsaWQuPGJyPjxicj5EZWZhdWx0IGlzIGB0cnVlYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gcmVzZXRUb2tlblJldXNlSWZWYWxpZCBTZXQgdG8gYHRydWVgIGlmIGEgcGFzc3dvcmQgcmVzZXQgdG9rZW4gc2hvdWxkIGJlIHJldXNlZCBpbiBjYXNlIGFub3RoZXIgdG9rZW4gaXMgcmVxdWVzdGVkIGJ1dCB0aGVyZSBpcyBhIHRva2VuIHRoYXQgaXMgc3RpbGwgdmFsaWQsIGkuZS4gaGFzIG5vdCBleHBpcmVkLiBUaGlzIGF2b2lkcyB0aGUgb2Z0ZW4gb2JzZXJ2ZWQgaXNzdWUgdGhhdCBhIHVzZXIgcmVxdWVzdHMgbXVsdGlwbGUgZW1haWxzIGFuZCBkb2VzIG5vdCBrbm93IHdoaWNoIGxpbmsgY29udGFpbnMgYSB2YWxpZCB0b2tlbiBiZWNhdXNlIGVhY2ggbmV3bHkgZ2VuZXJhdGVkIHRva2VuIHdvdWxkIGludmFsaWRhdGUgdGhlIHByZXZpb3VzIHRva2VuLjxicj48YnI+RGVmYXVsdCBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uIFNldCB0aGUgdmFsaWRpdHkgZHVyYXRpb24gb2YgdGhlIHBhc3N3b3JkIHJlc2V0IHRva2VuIGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIHRva2VuIGV4cGlyZXMuIFRoZSB0b2tlbiBpcyB1c2VkIGluIHRoZSBsaW5rIHRoYXQgaXMgc2V0IGluIHRoZSBlbWFpbC4gQWZ0ZXIgdGhlIHRva2VuIGV4cGlyZXMsIHRoZSBsaW5rIGJlY29tZXMgaW52YWxpZCBhbmQgYSBuZXcgbGluayBoYXMgdG8gYmUgc2VudC4gSWYgdGhlIG9wdGlvbiBpcyBub3Qgc2V0IG9yIHNldCB0byBgdW5kZWZpbmVkYCwgdGhlbiB0aGUgdG9rZW4gbmV2ZXIgZXhwaXJlcy48YnI+PGJyPkZvciBleGFtcGxlLCB0byBleHBpcmUgdGhlIHRva2VuIGFmdGVyIDIgaG91cnMsIHNldCBhIHZhbHVlIG9mIDcyMDAgc2Vjb25kcyAoPSA2MCBzZWNvbmRzICogNjAgbWludXRlcyAqIDIgaG91cnMpLjxicj48YnI+RGVmYXVsdCBpcyBgdW5kZWZpbmVkYC5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB2YWxpZGF0aW9uRXJyb3IgU2V0IHRoZSBlcnJvciBtZXNzYWdlIHRvIGJlIHNlbnQuPGJyPjxicj5EZWZhdWx0IGlzIGBQYXNzd29yZCBkb2VzIG5vdCBtZWV0IHRoZSBQYXNzd29yZCBQb2xpY3kgcmVxdWlyZW1lbnRzLmBcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHZhbGlkYXRvckNhbGxiYWNrIFNldCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIGEgcGFzc3dvcmQgdG8gYmUgYWNjZXB0ZWQuPGJyPjxicj5JZiB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggYHZhbGlkYXRvclBhdHRlcm5gLCB0aGUgcGFzc3dvcmQgbXVzdCBwYXNzIGJvdGggdG8gYmUgYWNjZXB0ZWQuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gdmFsaWRhdG9yUGF0dGVybiBTZXQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB2YWxpZGF0aW9uIHBhdHRlcm4gYSBwYXNzd29yZCBtdXN0IG1hdGNoIHRvIGJlIGFjY2VwdGVkLjxicj48YnI+SWYgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIGB2YWxpZGF0b3JDYWxsYmFja2AsIHRoZSBwYXNzd29yZCBtdXN0IHBhc3MgYm90aCB0byBiZSBhY2NlcHRlZC5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRmlsZVVwbG9hZE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlRm9yQW5vbnltb3VzVXNlciBJcyB0cnVlIGlmIGZpbGUgdXBsb2FkIHNob3VsZCBiZSBhbGxvd2VkIGZvciBhbm9ueW1vdXMgdXNlcnMuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGVuYWJsZUZvckF1dGhlbnRpY2F0ZWRVc2VyIElzIHRydWUgaWYgZmlsZSB1cGxvYWQgc2hvdWxkIGJlIGFsbG93ZWQgZm9yIGF1dGhlbnRpY2F0ZWQgdXNlcnMuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGVuYWJsZUZvclB1YmxpYyBJcyB0cnVlIGlmIGZpbGUgdXBsb2FkIHNob3VsZCBiZSBhbGxvd2VkIGZvciBhbnlvbmUsIHJlZ2FyZGxlc3Mgb2YgdXNlciBhdXRoZW50aWNhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IGZpbGVFeHRlbnNpb25zIFNldHMgdGhlIGFsbG93ZWQgZmlsZSBleHRlbnNpb25zIGZvciB1cGxvYWRpbmcgZmlsZXMuIFRoZSBleHRlbnNpb24gaXMgZGVmaW5lZCBhcyBhbiBhcnJheSBvZiBmaWxlIGV4dGVuc2lvbnMsIG9yIGEgcmVnZXggcGF0dGVybi48YnI+PGJyPkl0IGlzIHJlY29tbWVuZGVkIHRvIG9ubHkgYWxsb3cgdGhlIGZpbGUgZXh0ZW5zaW9ucyB0aGF0IHlvdXIgYXBwIGFjdHVhbGx5IG5lZWRzLCByYXRoZXIgdGhhbiByZWx5aW5nIG9uIGJsb2NraW5nIGRhbmdlcm91cyBleHRlbnNpb25zLiBUaGlzIGFsbG93bGlzdCBhcHByb2FjaCBpcyBtb3JlIHNlY3VyZSBiZWNhdXNlIG5ldyBkYW5nZXJvdXMgZmlsZSBleHRlbnNpb25zIG1heSBlbWVyZ2UgdGhhdCBhcmUgbm90IGNvdmVyZWQgYnkgdGhlIGRlZmF1bHQgYmxvY2tsaXN0Ljxicj48YnI+VGhlIGRlZmF1bHQgYmxvY2tzIHRoZSBtb3N0IGNvbW1vbiBmaWxlIGV4dGVuc2lvbnMgdGhhdCBhcmUga25vd24gdG8gYmUgcmVuZGVyZWQgYXMgYWN0aXZlIGNvbnRlbnQgYnkgd2ViIGJyb3dzZXJzLCBzdWNoIGFzIEhUTUwsIFNWRywgYW5kIFhNTCBmaWxlcywgd2hpY2ggbWF5IGJlIHVzZWQgYnkgYW4gYXR0YWNrZXIgdG8gY29tcHJvbWlzZSB0aGUgc2Vzc2lvbiB0b2tlbiBvZiBhbm90aGVyIHVzZXIgdmlhIGFjY2Vzc2luZyB0aGUgYnJvd3NlcidzIGxvY2FsIHN0b3JhZ2UuIFRoZSBibG9ja2VkIGV4dGVuc2lvbnMgYXJlOiBgaHRtbGAsIGBodG1gLCBgc2h0bWxgLCBgeGh0bWxgLCBgeGh0bWwreG1sYCwgYHhodGAsIGBzdmdgLCBgc3ZnemAsIGBzdmcreG1sYCwgYHhtbGAsIGB4c2xgLCBgeHNsdGAsIGB4c2x0K3htbGAsIGB4c2RgLCBgcm5nYCwgYHJkZmAsIGByZGYreG1sYCwgYG93bGAsIGBtYXRobWxgLCBgbWF0aG1sK3htbGAuPGJyPjxicj5EZWZhdWx0cyB0byBgW1wiXig/IShbeFhzU10/W2hIXVt0VF1bbU1dW2xMXT8oXFxcXCtbeFhdW21NXVtsTF0pP3xbeFhdW2hIXVt0VF18W3NTXVt2Vl1bZ0ddKFt6Wl18XFxcXCtbeFhdW21NXVtsTF0pP3xbeFhdW21NXVtsTF18W3hYXVtzU11bbExdW3RUXT8oXFxcXCtbeFhdW21NXVtsTF0pP3xbeFhdW3NTXVtkRF18W3JSXVtuTl1bZ0ddfFtyUl1bZERdW2ZGXShcXFxcK1t4WF1bbU1dW2xMXSk/fFtvT11bd1ddW2xMXXxbbU1dW2FBXVt0VF1baEhdW21NXVtsTF0oXFxcXCtbeFhdW21NXVtsTF0pPykkKVwiXWAuXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIExvZ0xldmVsXG4gKiBAcHJvcGVydHkge1N0cmluZ0xpdGVyYWx9IGRlYnVnIERlYnVnIGxldmVsXG4gKiBAcHJvcGVydHkge1N0cmluZ0xpdGVyYWx9IGVycm9yIEVycm9yIGxldmVsIC0gaGlnaGVzdCBwcmlvcml0eVxuICogQHByb3BlcnR5IHtTdHJpbmdMaXRlcmFsfSBpbmZvIEluZm8gbGV2ZWwgLSBkZWZhdWx0XG4gKiBAcHJvcGVydHkge1N0cmluZ0xpdGVyYWx9IHNpbGx5IFNpbGx5IGxldmVsIC0gbG93ZXN0IHByaW9yaXR5XG4gKiBAcHJvcGVydHkge1N0cmluZ0xpdGVyYWx9IHZlcmJvc2UgVmVyYm9zZSBsZXZlbFxuICogQHByb3BlcnR5IHtTdHJpbmdMaXRlcmFsfSB3YXJuIFdhcm5pbmcgbGV2ZWxcbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgTG9nQ2xpZW50RXZlbnRcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IGtleXMgT3B0aW9uYWwgYXJyYXkgb2YgZG90LW5vdGF0aW9uIHBhdGhzIHRvIGV4dHJhY3Qgc3BlY2lmaWMgZGF0YSBmcm9tIHRoZSBldmVudCBvYmplY3QuIElmIG5vdCBwcm92aWRlZCBvciBlbXB0eSwgdGhlIGVudGlyZSBldmVudCBvYmplY3Qgd2lsbCBiZSBsb2dnZWQuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbG9nTGV2ZWwgVGhlIGxvZyBsZXZlbCB0byB1c2UgZm9yIHRoaXMgZXZlbnQuIFNlZSBbTG9nTGV2ZWxdKExvZ0xldmVsLmh0bWwpIGZvciBhdmFpbGFibGUgdmFsdWVzLiBEZWZhdWx0cyB0byBgJ2luZm8nYC5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBNb25nb0RCIGRyaXZlciBldmVudCBuYW1lIHRvIGxpc3RlbiBmb3IuIFNlZSB0aGUgW01vbmdvREIgZHJpdmVyIGV2ZW50cyBkb2N1bWVudGF0aW9uXShodHRwczovL3d3dy5tb25nb2RiLmNvbS9kb2NzL2RyaXZlcnMvbm9kZS9jdXJyZW50L2Z1bmRhbWVudGFscy9tb25pdG9yaW5nLykgZm9yIGF2YWlsYWJsZSBldmVudHMuXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIERhdGFiYXNlT3B0aW9uc1xuICogQHByb3BlcnR5IHtCb29sZWFufSBhbGxvd1B1YmxpY0V4cGxhaW4gU2V0IHRvIGB0cnVlYCB0byBhbGxvdyBgUGFyc2UuUXVlcnkuZXhwbGFpbmAgd2l0aG91dCBtYXN0ZXIga2V5Ljxicj48YnI+4pqg77iPIEVuYWJsaW5nIHRoaXMgb3B0aW9uIG1heSBleHBvc2Ugc2Vuc2l0aXZlIHF1ZXJ5IHBlcmZvcm1hbmNlIGRhdGEgdG8gdW5hdXRob3JpemVkIHVzZXJzIGFuZCBjb3VsZCBwb3RlbnRpYWxseSBiZSBleHBsb2l0ZWQgZm9yIG1hbGljaW91cyBwdXJwb3Nlcy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBhcHBOYW1lIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gdGhhdCBjcmVhdGVkIHRoaXMgTW9uZ29DbGllbnQgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gYXV0aE1lY2hhbmlzbSBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSB0aGF0IE1vbmdvREIgd2lsbCB1c2UgdG8gYXV0aGVudGljYXRlIHRoZSBjb25uZWN0aW9uLlxuICogQHByb3BlcnR5IHtBbnl9IGF1dGhNZWNoYW5pc21Qcm9wZXJ0aWVzIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSBwcm9wZXJ0aWVzIGZvciB0aGUgc3BlY2lmaWVkIGF1dGhNZWNoYW5pc20gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjb2xvbi1zZXBhcmF0ZWQga2V5LXZhbHVlIHBhaXJzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGF1dGhTb3VyY2UgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBkYXRhYmFzZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlcidzIGNyZWRlbnRpYWxzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBhdXRvU2VsZWN0RmFtaWx5IFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc2V0IHdoZXRoZXIgdGhlIHNvY2tldCBhdHRlbXB0cyB0byBjb25uZWN0IHRvIElQdjYgYW5kIElQdjQgYWRkcmVzc2VzIHVudGlsIGEgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZC4gSWYgYXZhaWxhYmxlLCB0aGUgZHJpdmVyIHdpbGwgc2VsZWN0IHRoZSBmaXJzdCBJUHY2IGFkZHJlc3MuXG4gKiBAcHJvcGVydHkge051bWJlcn0gYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0IFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgYW1vdW50IG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIGEgY29ubmVjdGlvbiBhdHRlbXB0IHRvIGZpbmlzaCBiZWZvcmUgdHJ5aW5nIHRoZSBuZXh0IGFkZHJlc3Mgd2hlbiB1c2luZyB0aGUgYXV0b1NlbGVjdEZhbWlseSBvcHRpb24uIElmIHNldCB0byBhIHBvc2l0aXZlIGludGVnZXIgbGVzcyB0aGFuIDEwLCB0aGUgdmFsdWUgMTAgaXMgdXNlZCBpbnN0ZWFkLlxuICogQHByb3BlcnR5IHtVbmlvbn0gY29tcHJlc3NvcnMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IGFuIGFycmF5IG9yIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcgb2YgY29tcHJlc3NvcnMgdG8gZW5hYmxlIG5ldHdvcmsgY29tcHJlc3Npb24gZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGlzIGNsaWVudCBhbmQgYSBtb25nb2QvbW9uZ29zIGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGNvbm5lY3RUaW1lb3V0TVMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byB3YWl0IHRvIGVzdGFibGlzaCBhIHNpbmdsZSBUQ1Agc29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBiZWZvcmUgcmFpc2luZyBhbiBlcnJvci4gU3BlY2lmeWluZyAwIGRpc2FibGVzIHRoZSBjb25uZWN0aW9uIHRpbWVvdXQuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGNyZWF0ZUluZGV4QXV0aERhdGFVbmlxdWVuZXNzIFNldCB0byBgdHJ1ZWAgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgdW5pcXVlIGluZGV4ZXMgb24gdGhlIGF1dGhEYXRhIGZpZWxkcyBvZiB0aGUgX1VzZXIgY29sbGVjdGlvbiBmb3IgZWFjaCBjb25maWd1cmVkIGF1dGggcHJvdmlkZXIgb24gc2VydmVyIHN0YXJ0LCBpbmNsdWRpbmcgYGFub255bW91c2Agd2hlbiBhbm9ueW1vdXMgdXNlcnMgYXJlIGVuYWJsZWQuIFRoZXNlIGluZGV4ZXMgcHJldmVudCByYWNlIGNvbmRpdGlvbnMgZHVyaW5nIGNvbmN1cnJlbnQgc2lnbnVwcyB3aXRoIHRoZSBzYW1lIGF1dGhEYXRhLiBTZXQgdG8gYGZhbHNlYCB0byBza2lwIGluZGV4IGNyZWF0aW9uLiBEZWZhdWx0IGlzIGB0cnVlYC48YnI+PGJyPuKaoO+4jyBXaGVuIHNldHRpbmcgdGhpcyBvcHRpb24gdG8gYGZhbHNlYCB0byBtYW51YWxseSBjcmVhdGUgdGhlIGluZGV4ZXMsIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBvdGhlcndpc2UgYXV0b21hdGljYWxseSBjcmVhdGVkIGluZGV4ZXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHRvIGJlIG9wdGltaXplZCBmb3IgdGhlIGludGVybmFsIHVzYWdlIGJ5IFBhcnNlIFNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY3JlYXRlSW5kZXhSb2xlTmFtZSBTZXQgdG8gYHRydWVgIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgdW5pcXVlIGluZGV4IG9uIHRoZSBuYW1lIGZpZWxkIG9mIHRoZSBfUm9sZSBjb2xsZWN0aW9uIG9uIHNlcnZlciBzdGFydC4gU2V0IHRvIGBmYWxzZWAgdG8gc2tpcCBpbmRleCBjcmVhdGlvbi4gRGVmYXVsdCBpcyBgdHJ1ZWAuPGJyPjxicj7imqDvuI8gV2hlbiBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGBmYWxzZWAgdG8gbWFudWFsbHkgY3JlYXRlIHRoZSBpbmRleCwga2VlcCBpbiBtaW5kIHRoYXQgdGhlIG90aGVyd2lzZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaW5kZXggbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHRvIGJlIG9wdGltaXplZCBmb3IgdGhlIGludGVybmFsIHVzYWdlIGJ5IFBhcnNlIFNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY3JlYXRlSW5kZXhVc2VyRW1haWwgU2V0IHRvIGB0cnVlYCB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBpbmRleGVzIG9uIHRoZSBlbWFpbCBmaWVsZCBvZiB0aGUgX1VzZXIgY29sbGVjdGlvbiBvbiBzZXJ2ZXIgc3RhcnQuIFNldCB0byBgZmFsc2VgIHRvIHNraXAgaW5kZXggY3JlYXRpb24uIERlZmF1bHQgaXMgYHRydWVgLjxicj48YnI+4pqg77iPIFdoZW4gc2V0dGluZyB0aGlzIG9wdGlvbiB0byBgZmFsc2VgIHRvIG1hbnVhbGx5IGNyZWF0ZSB0aGUgaW5kZXgsIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBvdGhlcndpc2UgYXV0b21hdGljYWxseSBjcmVhdGVkIGluZGV4IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoZSBpbnRlcm5hbCB1c2FnZSBieSBQYXJzZSBTZXJ2ZXIuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGNyZWF0ZUluZGV4VXNlckVtYWlsQ2FzZUluc2Vuc2l0aXZlIFNldCB0byBgdHJ1ZWAgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgYSBjYXNlLWluc2Vuc2l0aXZlIGluZGV4IG9uIHRoZSBlbWFpbCBmaWVsZCBvZiB0aGUgX1VzZXIgY29sbGVjdGlvbiBvbiBzZXJ2ZXIgc3RhcnQuIFNldCB0byBgZmFsc2VgIHRvIHNraXAgaW5kZXggY3JlYXRpb24uIERlZmF1bHQgaXMgYHRydWVgLjxicj48YnI+4pqg77iPIFdoZW4gc2V0dGluZyB0aGlzIG9wdGlvbiB0byBgZmFsc2VgIHRvIG1hbnVhbGx5IGNyZWF0ZSB0aGUgaW5kZXgsIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBvdGhlcndpc2UgYXV0b21hdGljYWxseSBjcmVhdGVkIGluZGV4IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoZSBpbnRlcm5hbCB1c2FnZSBieSBQYXJzZSBTZXJ2ZXIuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGNyZWF0ZUluZGV4VXNlckVtYWlsVmVyaWZ5VG9rZW4gU2V0IHRvIGB0cnVlYCB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhbiBpbmRleCBvbiB0aGUgX2VtYWlsX3ZlcmlmeV90b2tlbiBmaWVsZCBvZiB0aGUgX1VzZXIgY29sbGVjdGlvbiBvbiBzZXJ2ZXIgc3RhcnQuIFNldCB0byBgZmFsc2VgIHRvIHNraXAgaW5kZXggY3JlYXRpb24uIERlZmF1bHQgaXMgYHRydWVgLjxicj48YnI+4pqg77iPIFdoZW4gc2V0dGluZyB0aGlzIG9wdGlvbiB0byBgZmFsc2VgIHRvIG1hbnVhbGx5IGNyZWF0ZSB0aGUgaW5kZXgsIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBvdGhlcndpc2UgYXV0b21hdGljYWxseSBjcmVhdGVkIGluZGV4IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoZSBpbnRlcm5hbCB1c2FnZSBieSBQYXJzZSBTZXJ2ZXIuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGNyZWF0ZUluZGV4VXNlclBhc3N3b3JkUmVzZXRUb2tlbiBTZXQgdG8gYHRydWVgIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGFuIGluZGV4IG9uIHRoZSBfcGVyaXNoYWJsZV90b2tlbiBmaWVsZCBvZiB0aGUgX1VzZXIgY29sbGVjdGlvbiBvbiBzZXJ2ZXIgc3RhcnQuIFNldCB0byBgZmFsc2VgIHRvIHNraXAgaW5kZXggY3JlYXRpb24uIERlZmF1bHQgaXMgYHRydWVgLjxicj48YnI+4pqg77iPIFdoZW4gc2V0dGluZyB0aGlzIG9wdGlvbiB0byBgZmFsc2VgIHRvIG1hbnVhbGx5IGNyZWF0ZSB0aGUgaW5kZXgsIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBvdGhlcndpc2UgYXV0b21hdGljYWxseSBjcmVhdGVkIGluZGV4IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoZSBpbnRlcm5hbCB1c2FnZSBieSBQYXJzZSBTZXJ2ZXIuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGNyZWF0ZUluZGV4VXNlclVzZXJuYW1lIFNldCB0byBgdHJ1ZWAgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgaW5kZXhlcyBvbiB0aGUgdXNlcm5hbWUgZmllbGQgb2YgdGhlIF9Vc2VyIGNvbGxlY3Rpb24gb24gc2VydmVyIHN0YXJ0LiBTZXQgdG8gYGZhbHNlYCB0byBza2lwIGluZGV4IGNyZWF0aW9uLiBEZWZhdWx0IGlzIGB0cnVlYC48YnI+PGJyPuKaoO+4jyBXaGVuIHNldHRpbmcgdGhpcyBvcHRpb24gdG8gYGZhbHNlYCB0byBtYW51YWxseSBjcmVhdGUgdGhlIGluZGV4LCBrZWVwIGluIG1pbmQgdGhhdCB0aGUgb3RoZXJ3aXNlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBpbmRleCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUgdG8gYmUgb3B0aW1pemVkIGZvciB0aGUgaW50ZXJuYWwgdXNhZ2UgYnkgUGFyc2UgU2VydmVyLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBjcmVhdGVJbmRleFVzZXJVc2VybmFtZUNhc2VJbnNlbnNpdGl2ZSBTZXQgdG8gYHRydWVgIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgY2FzZS1pbnNlbnNpdGl2ZSBpbmRleCBvbiB0aGUgdXNlcm5hbWUgZmllbGQgb2YgdGhlIF9Vc2VyIGNvbGxlY3Rpb24gb24gc2VydmVyIHN0YXJ0LiBTZXQgdG8gYGZhbHNlYCB0byBza2lwIGluZGV4IGNyZWF0aW9uLiBEZWZhdWx0IGlzIGB0cnVlYC48YnI+PGJyPuKaoO+4jyBXaGVuIHNldHRpbmcgdGhpcyBvcHRpb24gdG8gYGZhbHNlYCB0byBtYW51YWxseSBjcmVhdGUgdGhlIGluZGV4LCBrZWVwIGluIG1pbmQgdGhhdCB0aGUgb3RoZXJ3aXNlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBpbmRleCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUgdG8gYmUgb3B0aW1pemVkIGZvciB0aGUgaW50ZXJuYWwgdXNhZ2UgYnkgUGFyc2UgU2VydmVyLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBkaXJlY3RDb25uZWN0aW9uIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gZm9yY2UgYSBTaW5nbGUgdG9wb2xvZ3kgdHlwZSB3aXRoIGEgY29ubmVjdGlvbiBzdHJpbmcgY29udGFpbmluZyBvbmUgaG9zdC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZGlzYWJsZUluZGV4RmllbGRWYWxpZGF0aW9uIFNldCB0byBgdHJ1ZWAgdG8gZGlzYWJsZSB2YWxpZGF0aW9uIG9mIGluZGV4IGZpZWxkcy4gV2hlbiBkaXNhYmxlZCwgaW5kZXhlcyBjYW4gYmUgY3JlYXRlZCBldmVuIGlmIHRoZSBmaWVsZHMgZG8gbm90IGV4aXN0IGluIHRoZSBzY2hlbWEuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGNyZWF0aW5nIGluZGV4ZXMgb24gZmllbGRzIHRoYXQgd2lsbCBiZSBhZGRlZCBsYXRlci5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlU2NoZW1hSG9va3MgRW5hYmxlcyBkYXRhYmFzZSByZWFsLXRpbWUgaG9va3MgdG8gdXBkYXRlIHNpbmdsZSBzY2hlbWEgY2FjaGUuIFNldCB0byBgdHJ1ZWAgaWYgdXNpbmcgbXVsdGlwbGUgUGFyc2UgU2VydmVycyBpbnN0YW5jZXMgY29ubmVjdGVkIHRvIHRoZSBzYW1lIGRhdGFiYXNlLiBGYWlsaW5nIHRvIGRvIHNvIHdpbGwgY2F1c2UgYSBzY2hlbWEgY2hhbmdlIHRvIG5vdCBwcm9wYWdhdGUgdG8gYWxsIGluc3RhbmNlcyBhbmQgcmUtc3luY2luZyB3aWxsIG9ubHkgaGFwcGVuIHdoZW4gdGhlIGluc3RhbmNlcyByZXN0YXJ0LiBUbyB1c2UgdGhpcyBmZWF0dXJlIHdpdGggTW9uZ29EQiwgYSByZXBsaWNhIHNldCBjbHVzdGVyIHdpdGggW2NoYW5nZSBzdHJlYW1dKGh0dHBzOi8vZG9jcy5tb25nb2RiLmNvbS9tYW51YWwvY2hhbmdlU3RyZWFtcy8jYXZhaWxhYmlsaXR5KSBzdXBwb3J0IGlzIHJlcXVpcmVkLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBmb3JjZVNlcnZlck9iamVjdElkIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gZm9yY2Ugc2VydmVyIHRvIGFzc2lnbiBfaWQgdmFsdWVzIGluc3RlYWQgb2YgZHJpdmVyLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGhlYXJ0YmVhdEZyZXF1ZW5jeU1TIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgZnJlcXVlbmN5IGluIG1pbGxpc2Vjb25kcyBhdCB3aGljaCB0aGUgZHJpdmVyIGNoZWNrcyB0aGUgc3RhdGUgb2YgdGhlIE1vbmdvREIgZGVwbG95bWVudC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gbG9hZEJhbGFuY2VkIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gaW5zdHJ1Y3QgdGhlIGRyaXZlciBpdCBpcyBjb25uZWN0aW5nIHRvIGEgbG9hZCBiYWxhbmNlciBmcm9udGluZyBhIG1vbmdvcyBsaWtlIHNlcnZpY2UuXG4gKiBAcHJvcGVydHkge051bWJlcn0gbG9jYWxUaHJlc2hvbGRNUyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIHNpemUgKGluIG1pbGxpc2Vjb25kcykgb2YgdGhlIGxhdGVuY3kgd2luZG93IGZvciBzZWxlY3RpbmcgYW1vbmcgbXVsdGlwbGUgc3VpdGFibGUgTW9uZ29EQiBpbnN0YW5jZXMuXG4gKiBAcHJvcGVydHkge0xvZ0NsaWVudEV2ZW50W119IGxvZ0NsaWVudEV2ZW50cyBBbiBhcnJheSBvZiBNb25nb0RCIGNsaWVudCBldmVudCBjb25maWd1cmF0aW9ucyB0byBlbmFibGUgbG9nZ2luZyBvZiBzcGVjaWZpYyBldmVudHMuXG4gKiBAcHJvcGVydHkge051bWJlcn0gbWF4Q29ubmVjdGluZyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgbWF5IGJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGVzdGFibGlzaGVkIGNvbmN1cnJlbnRseSBieSB0aGUgY29ubmVjdGlvbiBwb29sLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IG1heElkbGVUaW1lTVMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBhbW91bnQgb2YgdGltZSBpbiBtaWxsaXNlY29uZHMgdGhhdCBhIGNvbm5lY3Rpb24gY2FuIHJlbWFpbiBpZGxlIGluIHRoZSBjb25uZWN0aW9uIHBvb2wgYmVmb3JlIGJlaW5nIHJlbW92ZWQgYW5kIGNsb3NlZC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBtYXhQb29sU2l6ZSBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3BlbmVkLCBjYWNoZWQsIHJlYWR5LXRvLXVzZSBkYXRhYmFzZSBjb25uZWN0aW9ucyBtYWludGFpbmVkIGJ5IHRoZSBkcml2ZXIuXG4gKiBAcHJvcGVydHkge051bWJlcn0gbWF4U3RhbGVuZXNzU2Vjb25kcyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNldCB0aGUgbWF4aW11bSByZXBsaWNhdGlvbiBsYWcgZm9yIHJlYWRzIGZyb20gc2Vjb25kYXJ5IG5vZGVzLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IG1heFRpbWVNUyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNldCBhIGN1bXVsYXRpdmUgdGltZSBsaW1pdCBpbiBtaWxsaXNlY29uZHMgZm9yIHByb2Nlc3Npbmcgb3BlcmF0aW9ucyBvbiBhIGN1cnNvci5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBtaW5Qb29sU2l6ZSBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNldCB0aGUgbWluaW11bSBudW1iZXIgb2Ygb3BlbmVkLCBjYWNoZWQsIHJlYWR5LXRvLXVzZSBkYXRhYmFzZSBjb25uZWN0aW9ucyBtYWludGFpbmVkIGJ5IHRoZSBkcml2ZXIuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcHJveHlIb3N0IFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gY29uZmlndXJlIGEgU29ja3M1IHByb3h5IGhvc3QgdXNlZCBmb3IgY3JlYXRpbmcgVENQIGNvbm5lY3Rpb25zLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHByb3h5UGFzc3dvcmQgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBjb25maWd1cmUgYSBTb2NrczUgcHJveHkgcGFzc3dvcmQgd2hlbiB0aGUgcHJveHkgcmVxdWlyZXMgdXNlcm5hbWUvcGFzc3dvcmQgYXV0aGVudGljYXRpb24uXG4gKiBAcHJvcGVydHkge051bWJlcn0gcHJveHlQb3J0IFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gY29uZmlndXJlIGEgU29ja3M1IHByb3h5IHBvcnQgdXNlZCBmb3IgY3JlYXRpbmcgVENQIGNvbm5lY3Rpb25zLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHByb3h5VXNlcm5hbWUgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBjb25maWd1cmUgYSBTb2NrczUgcHJveHkgdXNlcm5hbWUgd2hlbiB0aGUgcHJveHkgcmVxdWlyZXMgdXNlcm5hbWUvcGFzc3dvcmQgYXV0aGVudGljYXRpb24uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcmVhZENvbmNlcm5MZXZlbCBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGxldmVsIG9mIGlzb2xhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSByZWFkUHJlZmVyZW5jZSBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIHJlYWQgcHJlZmVyZW5jZXMgZm9yIHRoaXMgY29ubmVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7QW55W119IHJlYWRQcmVmZXJlbmNlVGFncyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIHRhZ3MgZG9jdW1lbnQgYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjb2xvbi1zZXBhcmF0ZWQga2V5LXZhbHVlIHBhaXJzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHJlcGxpY2FTZXQgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSByZXBsaWNhIHNldCwgaWYgdGhlIG1vbmdvZCBpcyBhIG1lbWJlciBvZiBhIHJlcGxpY2Egc2V0LlxuICogQHByb3BlcnR5IHtCb29sZWFufSByZXRyeVJlYWRzIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gZW5hYmxlIHJldHJ5YWJsZSByZWFkcy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gcmV0cnlXcml0ZXMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzZXQgd2hldGhlciB0byByZXRyeSBmYWlsZWQgd3JpdGVzLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHNjaGVtYUNhY2hlVHRsIFRoZSBkdXJhdGlvbiBpbiBzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSBzY2hlbWEgY2FjaGUgZXhwaXJlcyBhbmQgd2lsbCBiZSByZWZldGNoZWQgZnJvbSB0aGUgZGF0YWJhc2UuIFVzZSB0aGlzIG9wdGlvbiBpZiB1c2luZyBtdWx0aXBsZSBQYXJzZSBTZXJ2ZXJzIGluc3RhbmNlcyBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgZGF0YWJhc2UuIEEgbG93IGR1cmF0aW9uIHdpbGwgY2F1c2UgdGhlIHNjaGVtYSBjYWNoZSB0byBiZSB1cGRhdGVkIHRvbyBvZnRlbiwgY2F1c2luZyB1bm5lY2Vzc2FyeSBkYXRhYmFzZSByZWFkcy4gQSBoaWdoIGR1cmF0aW9uIHdpbGwgY2F1c2UgdGhlIHNjaGVtYSB0byBiZSB1cGRhdGVkIHRvbyByYXJlbHksIGluY3JlYXNpbmcgdGhlIHRpbWUgcmVxdWlyZWQgdW50aWwgc2NoZW1hIGNoYW5nZXMgcHJvcGFnYXRlIHRvIGFsbCBzZXJ2ZXIgaW5zdGFuY2VzLiBUaGlzIGZlYXR1cmUgY2FuIGJlIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgb3IgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgb3B0aW9uIGBlbmFibGVTY2hlbWFIb29rc2AuIERlZmF1bHQgaXMgaW5maW5pdGUgd2hpY2ggbWVhbnMgdGhlIHNjaGVtYSBjYWNoZSBuZXZlciBleHBpcmVzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHNlcnZlck1vbml0b3JpbmdNb2RlIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gaW5zdHJ1Y3QgdGhlIGRyaXZlciBtb25pdG9ycyB0byB1c2UgYSBzcGVjaWZpYyBtb25pdG9yaW5nIG1vZGUuXG4gKiBAcHJvcGVydHkge051bWJlcn0gc2VydmVyU2VsZWN0aW9uVGltZW91dE1TIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgYW1vdW50IG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGZvciBhIHNlcnZlciB0byBiZSBjb25zaWRlcmVkIHN1aXRhYmxlIGZvciBzZWxlY3Rpb24uXG4gKiBAcHJvcGVydHkge051bWJlcn0gc29ja2V0VGltZW91dE1TIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgc3BlbnQgYXR0ZW1wdGluZyB0byBzZW5kIG9yIHJlY2VpdmUgb24gYSBzb2NrZXQgYmVmb3JlIHRpbWluZyBvdXQuIFNwZWNpZnlpbmcgMCBtZWFucyBubyB0aW1lb3V0LlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHNydk1heEhvc3RzIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgaG9zdHMgdG8gY29ubmVjdCB0byB3aGVuIHVzaW5nIGFuIHNydiBjb25uZWN0aW9uIHN0cmluZywgYSBzZXR0aW5nIG9mIDAgbWVhbnMgdW5saW1pdGVkIGhvc3RzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHNydlNlcnZpY2VOYW1lIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gbW9kaWZ5IHRoZSBzcnYgVVJJIHNlcnZpY2UgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gc3NsIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gZW5hYmxlIG9yIGRpc2FibGUgVExTL1NTTCBmb3IgdGhlIGNvbm5lY3Rpb24gKGVxdWl2YWxlbnQgdG8gdGxzIG9wdGlvbikuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHRscyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIGVuYWJsZSBvciBkaXNhYmxlIFRMUy9TU0wgZm9yIHRoZSBjb25uZWN0aW9uLlxuICogQHByb3BlcnR5IHtCb29sZWFufSB0bHNBbGxvd0ludmFsaWRDZXJ0aWZpY2F0ZXMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBieXBhc3MgdmFsaWRhdGlvbiBvZiB0aGUgY2VydGlmaWNhdGVzIHByZXNlbnRlZCBieSB0aGUgbW9uZ29kL21vbmdvcyBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gdGxzQWxsb3dJbnZhbGlkSG9zdG5hbWVzIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gZGlzYWJsZSBob3N0bmFtZSB2YWxpZGF0aW9uIG9mIHRoZSBjZXJ0aWZpY2F0ZSBwcmVzZW50ZWQgYnkgdGhlIG1vbmdvZC9tb25nb3MgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gdGxzQ0FGaWxlIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgYSBsb2NhbCAucGVtIGZpbGUgdGhhdCBjb250YWlucyB0aGUgcm9vdCBjZXJ0aWZpY2F0ZSBjaGFpbiBmcm9tIHRoZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gdGxzQ2VydGlmaWNhdGVLZXlGaWxlIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgYSBsb2NhbCAucGVtIGZpbGUgdGhhdCBjb250YWlucyB0aGUgY2xpZW50J3MgVExTL1NTTCBjZXJ0aWZpY2F0ZSBhbmQga2V5LlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHRsc0NlcnRpZmljYXRlS2V5RmlsZVBhc3N3b3JkIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgcGFzc3dvcmQgdG8gZGVjcnlwdCB0aGUgdGxzQ2VydGlmaWNhdGVLZXlGaWxlLlxuICogQHByb3BlcnR5IHtCb29sZWFufSB0bHNJbnNlY3VyZSBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIGRpc2FibGUgdmFyaW91cyBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB3YWl0UXVldWVUaW1lb3V0TVMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRoYXQgYSB0aHJlYWQgY2FuIHdhaXQgZm9yIGEgY29ubmVjdGlvbiB0byBiZWNvbWUgYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHpsaWJDb21wcmVzc2lvbkxldmVsIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgaWYgdXNpbmcgemxpYiBmb3IgbmV0d29yayBjb21wcmVzc2lvbiAoMC05KS5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgQXV0aEFkYXB0ZXJcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlZCBJcyBgdHJ1ZWAgaWYgdGhlIGF1dGggYWRhcHRlciBpcyBlbmFibGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgTG9nTGV2ZWxzXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY2xvdWRGdW5jdGlvbkVycm9yIExvZyBsZXZlbCB1c2VkIGJ5IHRoZSBDbG91ZCBDb2RlIEZ1bmN0aW9ucyBvbiBlcnJvci4gRGVmYXVsdCBpcyBgZXJyb3JgLiBTZWUgW0xvZ0xldmVsXShMb2dMZXZlbC5odG1sKSBmb3IgYXZhaWxhYmxlIHZhbHVlcy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBjbG91ZEZ1bmN0aW9uU3VjY2VzcyBMb2cgbGV2ZWwgdXNlZCBieSB0aGUgQ2xvdWQgQ29kZSBGdW5jdGlvbnMgb24gc3VjY2Vzcy4gRGVmYXVsdCBpcyBgaW5mb2AuIFNlZSBbTG9nTGV2ZWxdKExvZ0xldmVsLmh0bWwpIGZvciBhdmFpbGFibGUgdmFsdWVzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHRyaWdnZXJBZnRlciBMb2cgbGV2ZWwgdXNlZCBieSB0aGUgQ2xvdWQgQ29kZSBUcmlnZ2VycyBgYWZ0ZXJTYXZlYCwgYGFmdGVyRGVsZXRlYCwgYGFmdGVyRmluZGAsIGBhZnRlckxvZ291dGAuIERlZmF1bHQgaXMgYGluZm9gLiBTZWUgW0xvZ0xldmVsXShMb2dMZXZlbC5odG1sKSBmb3IgYXZhaWxhYmxlIHZhbHVlcy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB0cmlnZ2VyQmVmb3JlRXJyb3IgTG9nIGxldmVsIHVzZWQgYnkgdGhlIENsb3VkIENvZGUgVHJpZ2dlcnMgYGJlZm9yZVNhdmVgLCBgYmVmb3JlRGVsZXRlYCwgYGJlZm9yZUZpbmRgLCBgYmVmb3JlTG9naW5gIG9uIGVycm9yLiBEZWZhdWx0IGlzIGBlcnJvcmAuIFNlZSBbTG9nTGV2ZWxdKExvZ0xldmVsLmh0bWwpIGZvciBhdmFpbGFibGUgdmFsdWVzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHRyaWdnZXJCZWZvcmVTdWNjZXNzIExvZyBsZXZlbCB1c2VkIGJ5IHRoZSBDbG91ZCBDb2RlIFRyaWdnZXJzIGBiZWZvcmVTYXZlYCwgYGJlZm9yZURlbGV0ZWAsIGBiZWZvcmVGaW5kYCwgYGJlZm9yZUxvZ2luYCBvbiBzdWNjZXNzLiBEZWZhdWx0IGlzIGBpbmZvYC4gU2VlIFtMb2dMZXZlbF0oTG9nTGV2ZWwuaHRtbCkgZm9yIGF2YWlsYWJsZSB2YWx1ZXMuXG4gKi9cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEEiLCJpZ25vcmVMaXN0IjpbXX0=
347
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL09wdGlvbnMvZG9jcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBpbnRlcmZhY2UgU2NoZW1hT3B0aW9uc1xuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gYWZ0ZXJNaWdyYXRpb24gRXhlY3V0ZSBhIGNhbGxiYWNrIGFmdGVyIHJ1bm5pbmcgc2NoZW1hIG1pZ3JhdGlvbnMuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBiZWZvcmVNaWdyYXRpb24gRXhlY3V0ZSBhIGNhbGxiYWNrIGJlZm9yZSBydW5uaW5nIHNjaGVtYSBtaWdyYXRpb25zLlxuICogQHByb3BlcnR5IHtBbnl9IGRlZmluaXRpb25zIFJlc3QgcmVwcmVzZW50YXRpb24gb24gUGFyc2UuU2NoZW1hIGh0dHBzOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9yZXN0L2d1aWRlLyNhZGRpbmctYS1zY2hlbWFcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZGVsZXRlRXh0cmFGaWVsZHMgSXMgdHJ1ZSBpZiBQYXJzZSBTZXJ2ZXIgc2hvdWxkIGRlbGV0ZSBhbnkgZmllbGRzIG5vdCBkZWZpbmVkIGluIGEgc2NoZW1hIGRlZmluaXRpb24uIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBkdXJpbmcgZGV2ZWxvcG1lbnQuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGtlZXBVbmtub3duSW5kZXhlcyAoT3B0aW9uYWwpIEtlZXAgaW5kZXhlcyB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSBkYXRhYmFzZSBidXQgbm90IGRlZmluZWQgaW4gdGhlIHNjaGVtYS4gU2V0IHRoaXMgdG8gYHRydWVgIGlmIHlvdSBhcmUgYWRkaW5nIGluZGV4ZXMgbWFudWFsbHksIHNvIHRoYXQgdGhleSB3b24ndCBiZSByZW1vdmVkIHdoZW4gcnVubmluZyBzY2hlbWEgbWlncmF0aW9uLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGxvY2tTY2hlbWFzIElzIHRydWUgaWYgUGFyc2UgU2VydmVyIHdpbGwgcmVqZWN0IGFueSBhdHRlbXB0cyB0byBtb2RpZnkgdGhlIHNjaGVtYSB3aGlsZSB0aGUgc2VydmVyIGlzIHJ1bm5pbmcuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHJlY3JlYXRlTW9kaWZpZWRGaWVsZHMgSXMgdHJ1ZSBpZiBQYXJzZSBTZXJ2ZXIgc2hvdWxkIHJlY3JlYXRlIGFueSBmaWVsZHMgdGhhdCBhcmUgZGlmZmVyZW50IGJldHdlZW4gdGhlIGN1cnJlbnQgZGF0YWJhc2Ugc2NoZW1hIGFuZCB0aGVzY2hlbWEgZGVmaW5pdGlvbi4gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGR1cmluZyBkZXZlbG9wbWVudC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gc3RyaWN0IElzIHRydWUgaWYgUGFyc2UgU2VydmVyIHNob3VsZCBleGl0IGlmIHNjaGVtYSB1cGRhdGUgZmFpbC5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgUGFyc2VTZXJ2ZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge0FjY291bnRMb2Nrb3V0T3B0aW9uc30gYWNjb3VudExvY2tvdXQgVGhlIGFjY291bnQgbG9ja291dCBwb2xpY3kgZm9yIGZhaWxlZCBsb2dpbiBhdHRlbXB0cy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gYWxsb3dDbGllbnRDbGFzc0NyZWF0aW9uIEVuYWJsZSAob3IgZGlzYWJsZSkgY2xpZW50IGNsYXNzIGNyZWF0aW9uLCBkZWZhdWx0cyB0byBmYWxzZVxuICogQHByb3BlcnR5IHtCb29sZWFufSBhbGxvd0N1c3RvbU9iamVjdElkIEVuYWJsZSAob3IgZGlzYWJsZSkgY3VzdG9tIG9iamVjdElkXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGFsbG93RXhwaXJlZEF1dGhEYXRhVG9rZW4gQWxsb3cgYSB1c2VyIHRvIGxvZyBpbiBldmVuIGlmIHRoZSAzcmQgcGFydHkgYXV0aGVudGljYXRpb24gdG9rZW4gdGhhdCB3YXMgdXNlZCB0byBzaWduIGluIHRvIHRoZWlyIGFjY291bnQgaGFzIGV4cGlyZWQuIElmIHRoaXMgaXMgc2V0IHRvIGBmYWxzZWAsIHRoZW4gdGhlIHRva2VuIHdpbGwgYmUgdmFsaWRhdGVkIGV2ZXJ5IHRpbWUgdGhlIHVzZXIgc2lnbnMgaW4gdG8gdGhlaXIgYWNjb3VudC4gVGhpcyByZWZlcnMgdG8gdGhlIHRva2VuIHRoYXQgaXMgc3RvcmVkIGluIHRoZSBgX1VzZXIuYXV0aERhdGFgIGZpZWxkLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtTdHJpbmdbXX0gYWxsb3dIZWFkZXJzIEFkZCBoZWFkZXJzIHRvIEFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfFN0cmluZ1tdfSBhbGxvd09yaWdpbiBTZXRzIG9yaWdpbnMgZm9yIEFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbi4gVGhpcyBjYW4gYmUgYSBzdHJpbmcgZm9yIGEgc2luZ2xlIG9yaWdpbiBvciBhbiBhcnJheSBvZiBzdHJpbmdzIGZvciBtdWx0aXBsZSBvcmlnaW5zLlxuICogQHByb3BlcnR5IHtBZGFwdGVyPEFuYWx5dGljc0FkYXB0ZXI+fSBhbmFseXRpY3NBZGFwdGVyIEFkYXB0ZXIgbW9kdWxlIGZvciB0aGUgYW5hbHl0aWNzXG4gKiBAcHJvcGVydHkge1N0cmluZ30gYXBwSWQgWW91ciBQYXJzZSBBcHBsaWNhdGlvbiBJRFxuICogQHByb3BlcnR5IHtTdHJpbmd9IGFwcE5hbWUgU2V0cyB0aGUgYXBwIG5hbWVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBhdXRoIENvbmZpZ3VyYXRpb24gZm9yIHlvdXIgYXV0aGVudGljYXRpb24gcHJvdmlkZXJzLCBhcyBzdHJpbmdpZmllZCBKU09OLiBTZWUgaHR0cDovL2RvY3MucGFyc2VwbGF0Zm9ybS5vcmcvcGFyc2Utc2VydmVyL2d1aWRlLyNvYXV0aC1hbmQtM3JkLXBhcnR5LWF1dGhlbnRpY2F0aW9uPGJyPjxicj5Qcm92aWRlciBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgYW5kIGNvbnRhaW4gb25seSBsZXR0ZXJzLCBkaWdpdHMsIGFuZCB1bmRlcnNjb3JlcyAoYC9eW0EtWmEtel1bQS1aYS16MC05X10qJC9gKS4gVGhpcyBpcyBiZWNhdXNlIGVhY2ggcHJvdmlkZXIgbmFtZSBpcyB1c2VkIHRvIGNvbnN0cnVjdCBhIGRhdGFiYXNlIGZpZWxkIChgX2F1dGhfZGF0YV88cHJvdmlkZXI+YCksIHdoaWNoIG11c3QgY29tcGx5IHdpdGggUGFyc2UgU2VydmVyJ3MgZmllbGQgbmFtaW5nIHJ1bGVzLlxuICogQHByb3BlcnR5IHtBZGFwdGVyPENhY2hlQWRhcHRlcj59IGNhY2hlQWRhcHRlciBBZGFwdGVyIG1vZHVsZSBmb3IgdGhlIGNhY2hlXG4gKiBAcHJvcGVydHkge051bWJlcn0gY2FjaGVNYXhTaXplIFNldHMgdGhlIG1heGltdW0gc2l6ZSBmb3IgdGhlIGluIG1lbW9yeSBjYWNoZSwgZGVmYXVsdHMgdG8gMTAwMDBcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBjYWNoZVRUTCBTZXRzIHRoZSBUVEwgZm9yIHRoZSBpbiBtZW1vcnkgY2FjaGUgKGluIG1zKSwgZGVmYXVsdHMgdG8gNTAwMCAoNSBzZWNvbmRzKVxuICogQHByb3BlcnR5IHtTdHJpbmd9IGNsaWVudEtleSBLZXkgZm9yIGlPUywgTWFjT1MsIHR2T1MgY2xpZW50c1xuICogQHByb3BlcnR5IHtTdHJpbmd9IGNsb3VkIEZ1bGwgcGF0aCB0byB5b3VyIGNsb3VkIGNvZGUgbWFpbi5qc1xuICogQHByb3BlcnR5IHtOdW1iZXJ8Qm9vbGVhbn0gY2x1c3RlciBSdW4gd2l0aCBjbHVzdGVyLCBvcHRpb25hbGx5IHNldCB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlcyBkZWZhdWx0IHRvIG9zLmNwdXMoKS5sZW5ndGhcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBjb2xsZWN0aW9uUHJlZml4IEEgY29sbGVjdGlvbiBwcmVmaXggZm9yIHRoZSBjbGFzc2VzXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbnZlcnRFbWFpbFRvTG93ZXJjYXNlIE9wdGlvbmFsLiBJZiBzZXQgdG8gYHRydWVgLCB0aGUgYGVtYWlsYCBwcm9wZXJ0eSBvZiBhIHVzZXIgaXMgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGJlZm9yZSBiZWluZyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiBDb25zZXF1ZW50bHksIHF1ZXJpZXMgbXVzdCBtYXRjaCB0aGUgY2FzZSBhcyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLCB3aGljaCB3b3VsZCBiZSBsb3dlcmNhc2UgaW4gdGhpcyBzY2VuYXJpby4gSWYgYGZhbHNlYCwgdGhlIGBlbWFpbGAgcHJvcGVydHkgaXMgc3RvcmVkIGFzIHNldCwgd2l0aG91dCBhbnkgY2FzZSBtb2RpZmljYXRpb25zLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbnZlcnRVc2VybmFtZVRvTG93ZXJjYXNlIE9wdGlvbmFsLiBJZiBzZXQgdG8gYHRydWVgLCB0aGUgYHVzZXJuYW1lYCBwcm9wZXJ0eSBvZiBhIHVzZXIgaXMgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGJlZm9yZSBiZWluZyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiBDb25zZXF1ZW50bHksIHF1ZXJpZXMgbXVzdCBtYXRjaCB0aGUgY2FzZSBhcyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLCB3aGljaCB3b3VsZCBiZSBsb3dlcmNhc2UgaW4gdGhpcyBzY2VuYXJpby4gSWYgYGZhbHNlYCwgdGhlIGB1c2VybmFtZWAgcHJvcGVydHkgaXMgc3RvcmVkIGFzIHNldCwgd2l0aG91dCBhbnkgY2FzZSBtb2RpZmljYXRpb25zLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge0N1c3RvbVBhZ2VzT3B0aW9uc30gY3VzdG9tUGFnZXMgY3VzdG9tIHBhZ2VzIGZvciBwYXNzd29yZCB2YWxpZGF0aW9uIGFuZCByZXNldFxuICogQHByb3BlcnR5IHtBZGFwdGVyPFN0b3JhZ2VBZGFwdGVyPn0gZGF0YWJhc2VBZGFwdGVyIEFkYXB0ZXIgbW9kdWxlIGZvciB0aGUgZGF0YWJhc2U7IGFueSBvcHRpb25zIHRoYXQgYXJlIG5vdCBleHBsaWNpdGx5IGRlc2NyaWJlZCBoZXJlIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGRhdGFiYXNlIGNsaWVudC5cbiAqIEBwcm9wZXJ0eSB7RGF0YWJhc2VPcHRpb25zfSBkYXRhYmFzZU9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIHRvIHRoZSBkYXRhYmFzZSBjbGllbnRcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBkYXRhYmFzZVVSSSBUaGUgZnVsbCBVUkkgdG8geW91ciBkYXRhYmFzZS4gU3VwcG9ydGVkIGRhdGFiYXNlcyBhcmUgbW9uZ29kYiBvciBwb3N0Z3Jlcy5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBkZWZhdWx0TGltaXQgRGVmYXVsdCB2YWx1ZSBmb3IgbGltaXQgb3B0aW9uIG9uIHF1ZXJpZXMsIGRlZmF1bHRzIHRvIGAxMDBgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBkaXJlY3RBY2Nlc3MgU2V0IHRvIGB0cnVlYCBpZiBQYXJzZSByZXF1ZXN0cyB3aXRoaW4gdGhlIHNhbWUgTm9kZS5qcyBlbnZpcm9ubWVudCBhcyBQYXJzZSBTZXJ2ZXIgc2hvdWxkIGJlIHJvdXRlZCB0byBQYXJzZSBTZXJ2ZXIgZGlyZWN0bHkgaW5zdGVhZCBvZiB2aWEgdGhlIEhUVFAgaW50ZXJmYWNlLiBEZWZhdWx0IGlzIGBmYWxzZWAuPGJyPjxicj5JZiBzZXQgdG8gYGZhbHNlYCB0aGVuIFBhcnNlIHJlcXVlc3RzIHdpdGhpbiB0aGUgc2FtZSBOb2RlLmpzIGVudmlyb25tZW50IGFzIFBhcnNlIFNlcnZlciBhcmUgZXhlY3V0ZWQgYXMgSFRUUCByZXF1ZXN0cyBzZW50IHRvIFBhcnNlIFNlcnZlciB2aWEgdGhlIGBzZXJ2ZXJVUkxgLiBGb3IgZXhhbXBsZSwgYSBgUGFyc2UuUXVlcnlgIGluIENsb3VkIENvZGUgaXMgY2FsbGluZyBQYXJzZSBTZXJ2ZXIgdmlhIGEgSFRUUCByZXF1ZXN0LiBUaGUgc2VydmVyIGlzIGVzc2VudGlhbGx5IG1ha2luZyBhIEhUVFAgcmVxdWVzdCB0byBpdHNlbGYsIHVubmVjZXNzYXJpbHkgdXNpbmcgbmV0d29yayByZXNvdXJjZXMgc3VjaCBhcyBuZXR3b3JrIHBvcnRzLjxicj48YnI+4pqg77iPIEluIGVudmlyb25tZW50cyB3aGVyZSBtdWx0aXBsZSBQYXJzZSBTZXJ2ZXIgaW5zdGFuY2VzIHJ1biBiZWhpbmQgYSBsb2FkIGJhbGFuY2VyIGFuZCBQYXJzZSByZXF1ZXN0cyB3aXRoaW4gdGhlIGN1cnJlbnQgTm9kZS5qcyBlbnZpcm9ubWVudCBzaG91bGQgYmUgcm91dGVkIHZpYSB0aGUgbG9hZCBiYWxhbmNlciBhbmQgZGlzdHJpYnV0ZWQgYXMgSFRUUCByZXF1ZXN0cyBhbW9uZyBhbGwgaW5zdGFuY2VzIHZpYSB0aGUgYHNlcnZlclVSTGAsIHRoaXMgc2hvdWxkIGJlIHNldCB0byBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGRvdE5ldEtleSBLZXkgZm9yIFVuaXR5IGFuZCAuTmV0IFNES1xuICogQHByb3BlcnR5IHtBZGFwdGVyPE1haWxBZGFwdGVyPn0gZW1haWxBZGFwdGVyIEFkYXB0ZXIgbW9kdWxlIGZvciBlbWFpbCBzZW5kaW5nXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGVtYWlsVmVyaWZ5U3VjY2Vzc09uSW52YWxpZEVtYWlsIFNldCB0byBgdHJ1ZWAgaWYgYSByZXF1ZXN0IHRvIHZlcmlmeSB0aGUgZW1haWwgc2hvdWxkIHJldHVybiBhIHN1Y2Nlc3MgcmVzcG9uc2UgZXZlbiBpZiB0aGUgcHJvdmlkZWQgZW1haWwgYWRkcmVzcyBkb2VzIG5vdCBiZWxvbmcgdG8gYSB2ZXJpZmlhYmxlIGFjY291bnQsIGZvciBleGFtcGxlIGJlY2F1c2UgaXQgaXMgdW5rbm93biBvciBhbHJlYWR5IHZlcmlmaWVkLCBvciBgZmFsc2VgIGlmIHRoZSByZXF1ZXN0IHNob3VsZCByZXR1cm4gYW4gZXJyb3IgcmVzcG9uc2UgaW4gdGhvc2UgY2FzZXMuPGJyPjxicj5EZWZhdWx0IGlzIGB0cnVlYC48YnI+UmVxdWlyZXMgb3B0aW9uIGB2ZXJpZnlVc2VyRW1haWxzOiB0cnVlYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW1haWxWZXJpZnlUb2tlblJldXNlSWZWYWxpZCBTZXQgdG8gYHRydWVgIGlmIGEgZW1haWwgdmVyaWZpY2F0aW9uIHRva2VuIHNob3VsZCBiZSByZXVzZWQgaW4gY2FzZSBhbm90aGVyIHRva2VuIGlzIHJlcXVlc3RlZCBidXQgdGhlcmUgaXMgYSB0b2tlbiB0aGF0IGlzIHN0aWxsIHZhbGlkLCBpLmUuIGhhcyBub3QgZXhwaXJlZC4gVGhpcyBhdm9pZHMgdGhlIG9mdGVuIG9ic2VydmVkIGlzc3VlIHRoYXQgYSB1c2VyIHJlcXVlc3RzIG11bHRpcGxlIGVtYWlscyBhbmQgZG9lcyBub3Qga25vdyB3aGljaCBsaW5rIGNvbnRhaW5zIGEgdmFsaWQgdG9rZW4gYmVjYXVzZSBlYWNoIG5ld2x5IGdlbmVyYXRlZCB0b2tlbiB3b3VsZCBpbnZhbGlkYXRlIHRoZSBwcmV2aW91cyB0b2tlbi48YnI+PGJyPkRlZmF1bHQgaXMgYGZhbHNlYC48YnI+UmVxdWlyZXMgb3B0aW9uIGB2ZXJpZnlVc2VyRW1haWxzOiB0cnVlYC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBlbWFpbFZlcmlmeVRva2VuVmFsaWRpdHlEdXJhdGlvbiBTZXQgdGhlIHZhbGlkaXR5IGR1cmF0aW9uIG9mIHRoZSBlbWFpbCB2ZXJpZmljYXRpb24gdG9rZW4gaW4gc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgdG9rZW4gZXhwaXJlcy4gVGhlIHRva2VuIGlzIHVzZWQgaW4gdGhlIGxpbmsgdGhhdCBpcyBzZXQgaW4gdGhlIGVtYWlsLiBBZnRlciB0aGUgdG9rZW4gZXhwaXJlcywgdGhlIGxpbmsgYmVjb21lcyBpbnZhbGlkIGFuZCBhIG5ldyBsaW5rIGhhcyB0byBiZSBzZW50LiBJZiB0aGUgb3B0aW9uIGlzIG5vdCBzZXQgb3Igc2V0IHRvIGB1bmRlZmluZWRgLCB0aGVuIHRoZSB0b2tlbiBuZXZlciBleHBpcmVzLjxicj48YnI+Rm9yIGV4YW1wbGUsIHRvIGV4cGlyZSB0aGUgdG9rZW4gYWZ0ZXIgMiBob3Vycywgc2V0IGEgdmFsdWUgb2YgNzIwMCBzZWNvbmRzICg9IDYwIHNlY29uZHMgKiA2MCBtaW51dGVzICogMiBob3VycykuPGJyPjxicj5EZWZhdWx0IGlzIGB1bmRlZmluZWRgLjxicj5SZXF1aXJlcyBvcHRpb24gYHZlcmlmeVVzZXJFbWFpbHM6IHRydWVgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVBbm9ueW1vdXNVc2VycyBFbmFibGUgKG9yIGRpc2FibGUpIGFub255bW91cyB1c2VycywgZGVmYXVsdHMgdG8gdHJ1ZVxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVDb2xsYXRpb25DYXNlQ29tcGFyaXNvbiBPcHRpb25hbC4gSWYgc2V0IHRvIGB0cnVlYCwgdGhlIGNvbGxhdGlvbiBydWxlIG9mIGNhc2UgY29tcGFyaXNvbiBmb3IgcXVlcmllcyBhbmQgaW5kZXhlcyBpcyBlbmFibGVkLiBFbmFibGUgdGhpcyBvcHRpb24gdG8gcnVuIFBhcnNlIFNlcnZlciB3aXRoIE1vbmdvREIgQXRsYXMgU2VydmVybGVzcyBvciBBV1MgQW1hem9uIERvY3VtZW50REIuIElmIGBmYWxzZWAsIHRoZSBjb2xsYXRpb24gcnVsZSBvZiBjYXNlIGNvbXBhcmlzb24gaXMgZGlzYWJsZWQuIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlRXhwcmVzc0Vycm9ySGFuZGxlciBFbmFibGVzIHRoZSBkZWZhdWx0IGV4cHJlc3MgZXJyb3IgaGFuZGxlciBmb3IgYWxsIGVycm9yc1xuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVJbnNlY3VyZUF1dGhBZGFwdGVycyBFbmFibGUgKG9yIGRpc2FibGUpIGluc2VjdXJlIGF1dGggYWRhcHRlcnMsIGRlZmF1bHRzIHRvIHRydWUuIEluc2VjdXJlIGF1dGggYWRhcHRlcnMgYXJlIGRlcHJlY2F0ZWQgYW5kIGl0IGlzIHJlY29tbWVuZGVkIHRvIGRpc2FibGUgdGhlbS5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlU2FuaXRpemVkRXJyb3JSZXNwb25zZSBJZiBzZXQgdG8gYHRydWVgLCBlcnJvciBkZXRhaWxzIGFyZSByZW1vdmVkIGZyb20gZXJyb3IgbWVzc2FnZXMgaW4gcmVzcG9uc2VzIHRvIGNsaWVudCByZXF1ZXN0cywgYW5kIGluc3RlYWQgYSBnZW5lcmljIGVycm9yIG1lc3NhZ2UgaXMgc2VudC4gRGVmYXVsdCBpcyBgdHJ1ZWAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGVuY29kZVBhcnNlT2JqZWN0SW5DbG91ZEZ1bmN0aW9uIElmIHNldCB0byBgdHJ1ZWAsIGEgYFBhcnNlLk9iamVjdGAgdGhhdCBpcyBpbiB0aGUgcGF5bG9hZCB3aGVuIGNhbGxpbmcgYSBDbG91ZCBGdW5jdGlvbiB3aWxsIGJlIGNvbnZlcnRlZCB0byBhbiBpbnN0YW5jZSBvZiBgUGFyc2UuT2JqZWN0YC4gSWYgYGZhbHNlYCwgdGhlIG9iamVjdCB3aWxsIG5vdCBiZSBjb252ZXJ0ZWQgYW5kIGluc3RlYWQgYmUgYSBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdCwgd2hpY2ggY29udGFpbnMgdGhlIHJhdyBkYXRhIG9mIGEgYFBhcnNlLk9iamVjdGAgYnV0IGlzIG5vdCBhbiBhY3R1YWwgaW5zdGFuY2Ugb2YgYFBhcnNlLk9iamVjdGAuIERlZmF1bHQgaXMgYGZhbHNlYC4gPGJyPjxicj7ihLnvuI8gVGhlIGV4cGVjdGVkIGJlaGF2aW9yIHdvdWxkIGJlIHRoYXQgdGhlIG9iamVjdCBpcyBjb252ZXJ0ZWQgdG8gYW4gaW5zdGFuY2Ugb2YgYFBhcnNlLk9iamVjdGAsIHNvIHlvdSB3b3VsZCBub3JtYWxseSBzZXQgdGhpcyBvcHRpb24gdG8gYHRydWVgLiBUaGUgZGVmYXVsdCBpcyBgZmFsc2VgIGJlY2F1c2UgdGhpcyBpcyBhIHRlbXBvcmFyeSBvcHRpb24gdGhhdCBoYXMgYmVlbiBpbnRyb2R1Y2VkIHRvIGF2b2lkIGEgYnJlYWtpbmcgY2hhbmdlIHdoZW4gZml4aW5nIGEgYnVnIHdoZXJlIEphdmFTY3JpcHQgb2JqZWN0cyBhcmUgbm90IGNvbnZlcnRlZCB0byBhY3R1YWwgaW5zdGFuY2VzIG9mIGBQYXJzZS5PYmplY3RgLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGVuY3J5cHRpb25LZXkgS2V5IGZvciBlbmNyeXB0aW5nIHlvdXIgZmlsZXNcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5mb3JjZVByaXZhdGVVc2VycyBTZXQgdG8gdHJ1ZSBpZiBuZXcgdXNlcnMgc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aG91dCBwdWJsaWMgcmVhZCBhbmQgd3JpdGUgYWNjZXNzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBleHBpcmVJbmFjdGl2ZVNlc3Npb25zIFNldHMgd2hldGhlciB3ZSBzaG91bGQgZXhwaXJlIHRoZSBpbmFjdGl2ZSBzZXNzaW9ucywgZGVmYXVsdHMgdG8gdHJ1ZS4gSWYgZmFsc2UsIGFsbCBuZXcgc2Vzc2lvbnMgYXJlIGNyZWF0ZWQgd2l0aCBubyBleHBpcmF0aW9uIGRhdGUuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGV4dGVuZFNlc3Npb25PblVzZSBXaGV0aGVyIFBhcnNlIFNlcnZlciBzaG91bGQgYXV0b21hdGljYWxseSBleHRlbmQgYSB2YWxpZCBzZXNzaW9uIGJ5IHRoZSBzZXNzaW9uTGVuZ3RoLiBJbiBvcmRlciB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBzZXNzaW9uIHVwZGF0ZXMgaW4gdGhlIGRhdGFiYXNlLCBhIHNlc3Npb24gd2lsbCBvbmx5IGJlIGV4dGVuZGVkIHdoZW4gYSByZXF1ZXN0IGlzIHJlY2VpdmVkIGFmdGVyIGF0IGxlYXN0IGhhbGYgb2YgdGhlIGN1cnJlbnQgc2Vzc2lvbidzIGxpZmV0aW1lIGhhcyBwYXNzZWQuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZmlsZUtleSBLZXkgZm9yIHlvdXIgZmlsZXNcbiAqIEBwcm9wZXJ0eSB7QWRhcHRlcjxGaWxlc0FkYXB0ZXI+fSBmaWxlc0FkYXB0ZXIgQWRhcHRlciBtb2R1bGUgZm9yIHRoZSBmaWxlcyBzdWItc3lzdGVtXG4gKiBAcHJvcGVydHkge0ZpbGVVcGxvYWRPcHRpb25zfSBmaWxlVXBsb2FkIE9wdGlvbnMgZm9yIGZpbGUgdXBsb2Fkc1xuICogQHByb3BlcnR5IHtTdHJpbmd9IGdyYXBoUUxQYXRoIFRoZSBtb3VudCBwYXRoIGZvciB0aGUgR3JhcGhRTCBlbmRwb2ludDxicj48YnI+4pqg77iPIEZpbGUgdXBsb2FkIGluc2lkZSB0aGUgR3JhcGhRTCBtdXRhdGlvbiBzeXN0ZW0gcmVxdWlyZXMgUGFyc2UgU2VydmVyIHRvIGJlIGFibGUgdG8gY2FsbCBpdHNlbGYgYnkgbWFraW5nIHJlcXVlc3RzIHRvIHRoZSBVUkwgc2V0IGluIGBzZXJ2ZXJVUkxgLjxicj48YnI+RGVmYXVsdHMgaXMgYC9ncmFwaHFsYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZ3JhcGhRTFB1YmxpY0ludHJvc3BlY3Rpb24gRW5hYmxlIHB1YmxpYyBpbnRyb3NwZWN0aW9uIGZvciB0aGUgR3JhcGhRTCBlbmRwb2ludCwgZGVmYXVsdHMgdG8gZmFsc2VcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBncmFwaFFMU2NoZW1hIEZ1bGwgcGF0aCB0byB5b3VyIEdyYXBoUUwgY3VzdG9tIHNjaGVtYS5ncmFwaHFsIGZpbGVcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBob3N0IFRoZSBob3N0IHRvIHNlcnZlIFBhcnNlU2VydmVyIG9uLCBkZWZhdWx0cyB0byAwLjAuMC4wXG4gKiBAcHJvcGVydHkge0lkZW1wb3RlbmN5T3B0aW9uc30gaWRlbXBvdGVuY3lPcHRpb25zIE9wdGlvbnMgZm9yIHJlcXVlc3QgaWRlbXBvdGVuY3kgdG8gZGVkdXBsaWNhdGUgaWRlbnRpY2FsIHJlcXVlc3RzIHRoYXQgbWF5IGJlIGNhdXNlZCBieSBuZXR3b3JrIGlzc3Vlcy4gQ2F1dGlvbiwgdGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSB0aGF0IG1heSBub3QgYmUgYXBwcm9wcmlhdGUgZm9yIHByb2R1Y3Rpb24uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gamF2YXNjcmlwdEtleSBLZXkgZm9yIHRoZSBKYXZhc2NyaXB0IFNES1xuICogQHByb3BlcnR5IHtCb29sZWFufSBqc29uTG9ncyBMb2cgYXMgc3RydWN0dXJlZCBKU09OIG9iamVjdHNcbiAqIEBwcm9wZXJ0eSB7TGl2ZVF1ZXJ5T3B0aW9uc30gbGl2ZVF1ZXJ5IHBhcnNlLXNlcnZlcidzIExpdmVRdWVyeSBjb25maWd1cmF0aW9uIG9iamVjdFxuICogQHByb3BlcnR5IHtMaXZlUXVlcnlTZXJ2ZXJPcHRpb25zfSBsaXZlUXVlcnlTZXJ2ZXJPcHRpb25zIExpdmUgcXVlcnkgc2VydmVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAod2lsbCBzdGFydCB0aGUgbGl2ZVF1ZXJ5IHNlcnZlcilcbiAqIEBwcm9wZXJ0eSB7QWRhcHRlcjxMb2dnZXJBZGFwdGVyPn0gbG9nZ2VyQWRhcHRlciBBZGFwdGVyIG1vZHVsZSBmb3IgdGhlIGxvZ2dpbmcgc3ViLXN5c3RlbVxuICogQHByb3BlcnR5IHtTdHJpbmd9IGxvZ0xldmVsIFNldHMgdGhlIGxldmVsIGZvciBsb2dzXG4gKiBAcHJvcGVydHkge0xvZ0xldmVsc30gbG9nTGV2ZWxzIChPcHRpb25hbCkgT3ZlcnJpZGVzIHRoZSBsb2cgbGV2ZWxzIHVzZWQgaW50ZXJuYWxseSBieSBQYXJzZSBTZXJ2ZXIgdG8gbG9nIGV2ZW50cy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBsb2dzRm9sZGVyIEZvbGRlciBmb3IgdGhlIGxvZ3MgKGRlZmF1bHRzIHRvICcuL2xvZ3MnKTsgc2V0IHRvIG51bGwgdG8gZGlzYWJsZSBmaWxlIGJhc2VkIGxvZ2dpbmdcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBtYWludGVuYW5jZUtleSAoT3B0aW9uYWwpIFRoZSBtYWludGVuYW5jZSBrZXkgaXMgdXNlZCBmb3IgbW9kaWZ5aW5nIGludGVybmFsIGFuZCByZWFkLW9ubHkgZmllbGRzIG9mIFBhcnNlIFNlcnZlci48YnI+PGJyPuKaoO+4jyBUaGlzIGtleSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIGEgcmVndWxhciBvcGVyYXRpb24gb2YgUGFyc2UgU2VydmVyLiBUaGlzIGtleSBpcyBpbnRlbmRlZCB0byBjb25kdWN0IG91dC1vZi1iYW5kIGNoYW5nZXMgc3VjaCBhcyBvbmUtdGltZSBtaWdyYXRpb25zIG9yIGRhdGEgY29ycmVjdGlvbiB0YXNrcy4gSW50ZXJuYWwgZmllbGRzIGFyZSBub3Qgb2ZmaWNpYWxseSBkb2N1bWVudGVkIGFuZCBtYXkgY2hhbmdlIGF0IGFueSB0aW1lIHdpdGhvdXQgcHVibGljYXRpb24gaW4gcmVsZWFzZSBjaGFuZ2Vsb2dzLiBXZSBzdHJvbmdseSBhZHZpY2Ugbm90IHRvIHJlbHkgb24gaW50ZXJuYWwgZmllbGRzIGFzIHBhcnQgb2YgeW91ciByZWd1bGFyIG9wZXJhdGlvbiBhbmQgdG8gaW52ZXN0aWdhdGUgdGhlIGltcGxpY2F0aW9ucyBvZiBhbnkgcGxhbm5lZCBjaGFuZ2VzICpkaXJlY3RseSBpbiB0aGUgc291cmNlIGNvZGUqIG9mIHlvdXIgY3VycmVudCB2ZXJzaW9uIG9mIFBhcnNlIFNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IG1haW50ZW5hbmNlS2V5SXBzIChPcHRpb25hbCkgUmVzdHJpY3RzIHRoZSB1c2Ugb2YgbWFpbnRlbmFuY2Uga2V5IHBlcm1pc3Npb25zIHRvIGEgbGlzdCBvZiBJUCBhZGRyZXNzZXMgb3IgcmFuZ2VzLjxicj48YnI+VGhpcyBvcHRpb24gYWNjZXB0cyBhIGxpc3Qgb2Ygc2luZ2xlIElQIGFkZHJlc3NlcywgZm9yIGV4YW1wbGUgYFsnMTAuMC4wLjEnLCAnMTAuMC4wLjInXWAuIFlvdSBjYW4gYWxzbyB1c2UgQ0lEUiBub3RhdGlvbiB0byBzcGVjaWZ5IGFuIElQIGFkZHJlc3MgcmFuZ2UsIGZvciBleGFtcGxlIGBbJzEwLjAuMS4wLzI0J11gLjxicj48YnI+PGI+U3BlY2lhbCBzY2VuYXJpb3M6PC9iPjxicj4tIFNldHRpbmcgYW4gZW1wdHkgYXJyYXkgYFtdYCBtZWFucyB0aGF0IHRoZSBtYWludGVuYW5jZSBrZXkgY2Fubm90IGJlIHVzZWQgZXZlbiBpbiBQYXJzZSBTZXJ2ZXIgQ2xvdWQgQ29kZS4gVGhpcyB2YWx1ZSBjYW5ub3QgYmUgc2V0IHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyB0aGVyZSBpcyBubyB3YXkgdG8gcGFzcyBhbiBlbXB0eSBhcnJheSB0byBQYXJzZSBTZXJ2ZXIgdmlhIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLjxicj4tIFNldHRpbmcgYFsnMC4wLjAuMC8wJywgJzo6MCddYCBtZWFucyB0byBhbGxvdyBhbnkgSVB2NCBhbmQgSVB2NiBhZGRyZXNzIHRvIHVzZSB0aGUgbWFpbnRlbmFuY2Uga2V5IGFuZCBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGUgSVAgZmlsdGVyLjxicj48YnI+PGI+Q29uc2lkZXJhdGlvbnM6PC9iPjxicj4tIElQdjQgYW5kIElQdjYgYWRkcmVzc2VzIGFyZSBub3QgY29tcGFyZWQgYWdhaW5zdCBlYWNoIG90aGVyLiBFYWNoIElQIHZlcnNpb24gKElQdjQgYW5kIElQdjYpIG5lZWRzIHRvIGJlIGNvbnNpZGVyZWQgc2VwYXJhdGVseS4gRm9yIGV4YW1wbGUsIGBbJzAuMC4wLjAvMCddYCBhbGxvd3MgYW55IElQdjQgYWRkcmVzcyBhbmQgYmxvY2tzIGV2ZXJ5IElQdjYgYWRkcmVzcy4gQ29udmVyc2VseSwgYFsnOjowJ11gIGFsbG93cyBhbnkgSVB2NiBhZGRyZXNzIGFuZCBibG9ja3MgZXZlcnkgSVB2NCBhZGRyZXNzLjxicj4tIEtlZXAgaW4gbWluZCB0aGF0IHRoZSBJUCB2ZXJzaW9uIGluIHVzZSBkZXBlbmRzIG9uIHRoZSBuZXR3b3JrIHN0YWNrIG9mIHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCBQYXJzZSBTZXJ2ZXIgcnVucy4gQSBsb2NhbCBlbnZpcm9ubWVudCBtYXkgdXNlIGEgZGlmZmVyZW50IElQIHZlcnNpb24gdGhhbiBhIHJlbW90ZSBlbnZpcm9ubWVudC4gRm9yIGV4YW1wbGUsIGl0J3MgcG9zc2libGUgdGhhdCBsb2NhbGx5IHRoZSB2YWx1ZSBgWycwLjAuMC4wLzAnXWAgYWxsb3dzIHRoZSByZXF1ZXN0IElQIGJlY2F1c2UgdGhlIGVudmlyb25tZW50IGlzIHVzaW5nIElQdjQsIGJ1dCB3aGVuIFBhcnNlIFNlcnZlciBpcyBkZXBsb3llZCByZW1vdGVseSB0aGUgcmVxdWVzdCBJUCBpcyBibG9ja2VkIGJlY2F1c2UgdGhlIHJlbW90ZSBlbnZpcm9ubWVudCBpcyB1c2luZyBJUHY2Ljxicj4tIFdoZW4gc2V0dGluZyB0aGUgb3B0aW9uIHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGUgbm90YXRpb24gaXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLCBmb3IgZXhhbXBsZSBgXCIwLjAuMC4wLzAsOjowXCJgLjxicj4tIElQdjYgem9uZSBpbmRpY2VzIChgJWAgc3VmZml4KSBhcmUgbm90IHN1cHBvcnRlZCwgZm9yIGV4YW1wbGUgYGZlODA6OjElZXRoMGAsIGBmZTgwOjoxJTFgIG9yIGA6OjElbG9gLjxicj48YnI+RGVmYXVsdHMgdG8gYFsnMTI3LjAuMC4xJywgJzo6MSddYCB3aGljaCBtZWFucyB0aGF0IG9ubHkgYGxvY2FsaG9zdGAsIHRoZSBzZXJ2ZXIgaW5zdGFuY2Ugb24gd2hpY2ggUGFyc2UgU2VydmVyIHJ1bnMsIGlzIGFsbG93ZWQgdG8gdXNlIHRoZSBtYWludGVuYW5jZSBrZXkuXG4gKiBAcHJvcGVydHkge1VuaW9ufSBtYXN0ZXJLZXkgWW91ciBQYXJzZSBNYXN0ZXIgS2V5XG4gKiBAcHJvcGVydHkge1N0cmluZ1tdfSBtYXN0ZXJLZXlJcHMgKE9wdGlvbmFsKSBSZXN0cmljdHMgdGhlIHVzZSBvZiBtYXN0ZXIga2V5IHBlcm1pc3Npb25zIHRvIGEgbGlzdCBvZiBJUCBhZGRyZXNzZXMgb3IgcmFuZ2VzLjxicj48YnI+VGhpcyBvcHRpb24gYWNjZXB0cyBhIGxpc3Qgb2Ygc2luZ2xlIElQIGFkZHJlc3NlcywgZm9yIGV4YW1wbGUgYFsnMTAuMC4wLjEnLCAnMTAuMC4wLjInXWAuIFlvdSBjYW4gYWxzbyB1c2UgQ0lEUiBub3RhdGlvbiB0byBzcGVjaWZ5IGFuIElQIGFkZHJlc3MgcmFuZ2UsIGZvciBleGFtcGxlIGBbJzEwLjAuMS4wLzI0J11gLjxicj48YnI+PGI+U3BlY2lhbCBzY2VuYXJpb3M6PC9iPjxicj4tIFNldHRpbmcgYW4gZW1wdHkgYXJyYXkgYFtdYCBtZWFucyB0aGF0IHRoZSBtYXN0ZXIga2V5IGNhbm5vdCBiZSB1c2VkIGV2ZW4gaW4gUGFyc2UgU2VydmVyIENsb3VkIENvZGUuIFRoaXMgdmFsdWUgY2Fubm90IGJlIHNldCB2aWEgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgdGhlcmUgaXMgbm8gd2F5IHRvIHBhc3MgYW4gZW1wdHkgYXJyYXkgdG8gUGFyc2UgU2VydmVyIHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS48YnI+LSBTZXR0aW5nIGBbJzAuMC4wLjAvMCcsICc6OjAnXWAgbWVhbnMgdG8gYWxsb3cgYW55IElQdjQgYW5kIElQdjYgYWRkcmVzcyB0byB1c2UgdGhlIG1hc3RlciBrZXkgYW5kIGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoZSBJUCBmaWx0ZXIuPGJyPjxicj48Yj5Db25zaWRlcmF0aW9uczo8L2I+PGJyPi0gSVB2NCBhbmQgSVB2NiBhZGRyZXNzZXMgYXJlIG5vdCBjb21wYXJlZCBhZ2FpbnN0IGVhY2ggb3RoZXIuIEVhY2ggSVAgdmVyc2lvbiAoSVB2NCBhbmQgSVB2NikgbmVlZHMgdG8gYmUgY29uc2lkZXJlZCBzZXBhcmF0ZWx5LiBGb3IgZXhhbXBsZSwgYFsnMC4wLjAuMC8wJ11gIGFsbG93cyBhbnkgSVB2NCBhZGRyZXNzIGFuZCBibG9ja3MgZXZlcnkgSVB2NiBhZGRyZXNzLiBDb252ZXJzZWx5LCBgWyc6OjAnXWAgYWxsb3dzIGFueSBJUHY2IGFkZHJlc3MgYW5kIGJsb2NrcyBldmVyeSBJUHY0IGFkZHJlc3MuPGJyPi0gS2VlcCBpbiBtaW5kIHRoYXQgdGhlIElQIHZlcnNpb24gaW4gdXNlIGRlcGVuZHMgb24gdGhlIG5ldHdvcmsgc3RhY2sgb2YgdGhlIGVudmlyb25tZW50IGluIHdoaWNoIFBhcnNlIFNlcnZlciBydW5zLiBBIGxvY2FsIGVudmlyb25tZW50IG1heSB1c2UgYSBkaWZmZXJlbnQgSVAgdmVyc2lvbiB0aGFuIGEgcmVtb3RlIGVudmlyb25tZW50LiBGb3IgZXhhbXBsZSwgaXQncyBwb3NzaWJsZSB0aGF0IGxvY2FsbHkgdGhlIHZhbHVlIGBbJzAuMC4wLjAvMCddYCBhbGxvd3MgdGhlIHJlcXVlc3QgSVAgYmVjYXVzZSB0aGUgZW52aXJvbm1lbnQgaXMgdXNpbmcgSVB2NCwgYnV0IHdoZW4gUGFyc2UgU2VydmVyIGlzIGRlcGxveWVkIHJlbW90ZWx5IHRoZSByZXF1ZXN0IElQIGlzIGJsb2NrZWQgYmVjYXVzZSB0aGUgcmVtb3RlIGVudmlyb25tZW50IGlzIHVzaW5nIElQdjYuPGJyPi0gV2hlbiBzZXR0aW5nIHRoZSBvcHRpb24gdmlhIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRoZSBub3RhdGlvbiBpcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcsIGZvciBleGFtcGxlIGBcIjAuMC4wLjAvMCw6OjBcImAuPGJyPi0gSVB2NiB6b25lIGluZGljZXMgKGAlYCBzdWZmaXgpIGFyZSBub3Qgc3VwcG9ydGVkLCBmb3IgZXhhbXBsZSBgZmU4MDo6MSVldGgwYCwgYGZlODA6OjElMWAgb3IgYDo6MSVsb2AuPGJyPjxicj5EZWZhdWx0cyB0byBgWycxMjcuMC4wLjEnLCAnOjoxJ11gIHdoaWNoIG1lYW5zIHRoYXQgb25seSBgbG9jYWxob3N0YCwgdGhlIHNlcnZlciBpbnN0YW5jZSBvbiB3aGljaCBQYXJzZSBTZXJ2ZXIgcnVucywgaXMgYWxsb3dlZCB0byB1c2UgdGhlIG1hc3RlciBrZXkuXG4gKiBAcHJvcGVydHkge051bWJlcn0gbWFzdGVyS2V5VHRsIChPcHRpb25hbCkgVGhlIGR1cmF0aW9uIGluIHNlY29uZHMgZm9yIHdoaWNoIHRoZSBjdXJyZW50IGBtYXN0ZXJLZXlgIGlzIGJlaW5nIHVzZWQgYmVmb3JlIGl0IGlzIHJlcXVlc3RlZCBhZ2FpbiBpZiBgbWFzdGVyS2V5YCBpcyBzZXQgdG8gYSBmdW5jdGlvbi4gSWYgYG1hc3RlcktleWAgaXMgbm90IHNldCB0byBhIGZ1bmN0aW9uLCB0aGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0LiBEZWZhdWx0IGlzIGAwYCwgd2hpY2ggbWVhbnMgdGhlIG1hc3RlciBrZXkgaXMgcmVxdWVzdGVkIGJ5IGludm9raW5nIHRoZSAgYG1hc3RlcktleWAgZnVuY3Rpb24gZXZlcnkgdGltZSB0aGUgbWFzdGVyIGtleSBpcyB1c2VkIGludGVybmFsbHkgYnkgUGFyc2UgU2VydmVyLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IG1heExpbWl0IE1heCB2YWx1ZSBmb3IgbGltaXQgb3B0aW9uIG9uIHF1ZXJpZXMsIGRlZmF1bHRzIHRvIHVubGltaXRlZFxuICogQHByb3BlcnR5IHtOdW1iZXJ8U3RyaW5nfSBtYXhMb2dGaWxlcyBNYXhpbXVtIG51bWJlciBvZiBsb2dzIHRvIGtlZXAuIElmIG5vdCBzZXQsIG5vIGxvZ3Mgd2lsbCBiZSByZW1vdmVkLiBUaGlzIGNhbiBiZSBhIG51bWJlciBvZiBmaWxlcyBvciBudW1iZXIgb2YgZGF5cy4gSWYgdXNpbmcgZGF5cywgYWRkICdkJyBhcyB0aGUgc3VmZml4LiAoZGVmYXVsdDogbnVsbClcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBtYXhVcGxvYWRTaXplIE1heCBmaWxlIHNpemUgZm9yIHVwbG9hZHMsIGRlZmF1bHRzIHRvIDIwbWJcbiAqIEBwcm9wZXJ0eSB7VW5pb259IG1pZGRsZXdhcmUgbWlkZGxld2FyZSBmb3IgZXhwcmVzcyBzZXJ2ZXIsIGNhbiBiZSBzdHJpbmcgb3IgZnVuY3Rpb25cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gbW91bnRHcmFwaFFMIE1vdW50cyB0aGUgR3JhcGhRTCBlbmRwb2ludFxuICogQHByb3BlcnR5IHtTdHJpbmd9IG1vdW50UGF0aCBNb3VudCBwYXRoIGZvciB0aGUgc2VydmVyLCBkZWZhdWx0cyB0byAvcGFyc2VcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gbW91bnRQbGF5Z3JvdW5kIE1vdW50cyB0aGUgR3JhcGhRTCBQbGF5Z3JvdW5kIC0gbmV2ZXIgdXNlIHRoaXMgb3B0aW9uIGluIHByb2R1Y3Rpb25cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBvYmplY3RJZFNpemUgU2V0cyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gZ2VuZXJhdGVkIG9iamVjdCBpZCdzLCBkZWZhdWx0IDEwXG4gKiBAcHJvcGVydHkge1BhZ2VzT3B0aW9uc30gcGFnZXMgVGhlIG9wdGlvbnMgZm9yIHBhZ2VzIHN1Y2ggYXMgcGFzc3dvcmQgcmVzZXQgYW5kIGVtYWlsIHZlcmlmaWNhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UGFzc3dvcmRQb2xpY3lPcHRpb25zfSBwYXNzd29yZFBvbGljeSBUaGUgcGFzc3dvcmQgcG9saWN5IGZvciBlbmZvcmNpbmcgcGFzc3dvcmQgcmVsYXRlZCBydWxlcy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwbGF5Z3JvdW5kUGF0aCBNb3VudCBwYXRoIGZvciB0aGUgR3JhcGhRTCBQbGF5Z3JvdW5kLCBkZWZhdWx0cyB0byAvcGxheWdyb3VuZFxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHBvcnQgVGhlIHBvcnQgdG8gcnVuIHRoZSBQYXJzZVNlcnZlciwgZGVmYXVsdHMgdG8gMTMzNy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gcHJlc2VydmVGaWxlTmFtZSBFbmFibGUgKG9yIGRpc2FibGUpIHRoZSBhZGRpdGlvbiBvZiBhIHVuaXF1ZSBoYXNoIHRvIHRoZSBmaWxlIG5hbWVzXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHByZXZlbnRMb2dpbldpdGhVbnZlcmlmaWVkRW1haWwgU2V0IHRvIGB0cnVlYCB0byBwcmV2ZW50IGEgdXNlciBmcm9tIGxvZ2dpbmcgaW4gaWYgdGhlIGVtYWlsIGhhcyBub3QgeWV0IGJlZW4gdmVyaWZpZWQgYW5kIGVtYWlsIHZlcmlmaWNhdGlvbiBpcyByZXF1aXJlZC48YnI+PGJyPkRlZmF1bHQgaXMgYGZhbHNlYC48YnI+UmVxdWlyZXMgb3B0aW9uIGB2ZXJpZnlVc2VyRW1haWxzOiB0cnVlYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gcHJldmVudFNpZ251cFdpdGhVbnZlcmlmaWVkRW1haWwgSWYgc2V0IHRvIGB0cnVlYCBpdCBwcmV2ZW50cyBhIHVzZXIgZnJvbSBzaWduaW5nIHVwIGlmIHRoZSBlbWFpbCBoYXMgbm90IHlldCBiZWVuIHZlcmlmaWVkIGFuZCBlbWFpbCB2ZXJpZmljYXRpb24gaXMgcmVxdWlyZWQuIEluIHRoYXQgY2FzZSB0aGUgc2VydmVyIHJlc3BvbmRzIHRvIHRoZSBzaWduLXVwIHdpdGggSFRUUCBzdGF0dXMgNDAwIGFuZCBhIFBhcnNlIEVycm9yIDIwNSBgRU1BSUxfTk9UX0ZPVU5EYC4gSWYgc2V0IHRvIGBmYWxzZWAgdGhlIHNlcnZlciByZXNwb25kcyB3aXRoIEhUVFAgc3RhdHVzIDIwMCwgYW5kIGNsaWVudCBTREtzIHJldHVybiBhbiB1bmF1dGhlbnRpY2F0ZWQgUGFyc2UgVXNlciB3aXRob3V0IHNlc3Npb24gdG9rZW4uIEluIHRoYXQgY2FzZSBzdWJzZXF1ZW50IHJlcXVlc3RzIGZhaWwgdW50aWwgdGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzIGlzIHZlcmlmaWVkLjxicj48YnI+RGVmYXVsdCBpcyBgZmFsc2VgLjxicj5SZXF1aXJlcyBvcHRpb24gYHZlcmlmeVVzZXJFbWFpbHM6IHRydWVgLlxuICogQHByb3BlcnR5IHtQcm90ZWN0ZWRGaWVsZHN9IHByb3RlY3RlZEZpZWxkcyBQcm90ZWN0ZWQgZmllbGRzIHRoYXQgc2hvdWxkIGJlIHRyZWF0ZWQgd2l0aCBleHRyYSBzZWN1cml0eSB3aGVuIGZldGNoaW5nIGRldGFpbHMuXG4gKiBAcHJvcGVydHkge1VuaW9ufSBwdWJsaWNTZXJ2ZXJVUkwgT3B0aW9uYWwuIFRoZSBwdWJsaWMgVVJMIHRvIFBhcnNlIFNlcnZlci4gVGhpcyBVUkwgd2lsbCBiZSB1c2VkIHRvIHJlYWNoIFBhcnNlIFNlcnZlciBwdWJsaWNseSBmb3IgZmVhdHVyZXMgbGlrZSBwYXNzd29yZCByZXNldCBhbmQgZW1haWwgdmVyaWZpY2F0aW9uIGxpbmtzLiBUaGUgb3B0aW9uIGNhbiBiZSBzZXQgdG8gYSBzdHJpbmcgb3IgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhc3luY2hyb25vdXNseSByZXNvbHZlZC4gVGhlIHJldHVybmVkIFVSTCBzdHJpbmcgbXVzdCBzdGFydCB3aXRoIGBodHRwOi8vYCBvciBgaHR0cHM6Ly9gLlxuICogQHByb3BlcnR5IHtBbnl9IHB1c2ggQ29uZmlndXJhdGlvbiBmb3IgcHVzaCwgYXMgc3RyaW5naWZpZWQgSlNPTi4gU2VlIGh0dHA6Ly9kb2NzLnBhcnNlcGxhdGZvcm0ub3JnL3BhcnNlLXNlcnZlci9ndWlkZS8jcHVzaC1ub3RpZmljYXRpb25zXG4gKiBAcHJvcGVydHkge1JhdGVMaW1pdE9wdGlvbnNbXX0gcmF0ZUxpbWl0IE9wdGlvbnMgdG8gbGltaXQgcmVwZWF0ZWQgcmVxdWVzdHMgdG8gUGFyc2UgU2VydmVyIEFQSXMuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvdGVjdCBzZW5zaXRpdmUgZW5kcG9pbnRzIHN1Y2ggYXMgYC9yZXF1ZXN0UGFzc3dvcmRSZXNldGAgZnJvbSBicnV0ZS1mb3JjZSBhdHRhY2tzIG9yIFBhcnNlIFNlcnZlciBhcyBhIHdob2xlIGZyb20gZGVuaWFsLW9mLXNlcnZpY2UgKERvUykgYXR0YWNrcy48YnI+PGJyPuKEue+4jyBNaW5kIHRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnM6PGJyPi0gcmF0ZSBsaW1pdHMgYXBwbGllZCBwZXIgSVAgYWRkcmVzczsgdGhpcyBsaW1pdHMgcHJvdGVjdGlvbiBhZ2FpbnN0IGRpc3RyaWJ1dGVkIGRlbmlhbC1vZi1zZXJ2aWNlIChERG9TKSBhdHRhY2tzIHdoZXJlIG1hbnkgcmVxdWVzdHMgYXJlIGNvbWluZyBmcm9tIHZhcmlvdXMgSVAgYWRkcmVzc2VzPGJyPi0gaWYgbXVsdGlwbGUgUGFyc2UgU2VydmVyIGluc3RhbmNlcyBhcmUgYmVoaW5kIGEgbG9hZCBiYWxhbmNlciBvciByYW4gaW4gYSBjbHVzdGVyLCBlYWNoIGluc3RhbmNlIHdpbGwgY2FsY3VsYXRlIGl0J3Mgb3duIHJlcXVlc3QgcmF0ZXMsIGluZGVwZW5kZW50IGZyb20gb3RoZXIgaW5zdGFuY2VzOyB0aGlzIGxpbWl0cyB0aGUgYXBwbGljYWJpbGl0eSBvZiB0aGlzIGZlYXR1cmUgd2hlbiB1c2luZyBhIGxvYWQgYmFsYW5jZXIgYW5kIGFub3RoZXIgcmF0ZSBsaW1pdGluZyBzb2x1dGlvbiB0aGF0IHRha2VzIHJlcXVlc3RzIGFjcm9zcyBhbGwgaW5zdGFuY2VzIGludG8gYWNjb3VudCBtYXkgYmUgbW9yZSBzdWl0YWJsZTxicj4tIHRoaXMgZmVhdHVyZSBwcm92aWRlcyBiYXNpYyBwcm90ZWN0aW9uIGFnYWluc3QgZGVuaWFsLW9mLXNlcnZpY2UgYXR0YWNrcywgYnV0IGEgbW9yZSBzb3BoaXN0aWNhdGVkIHNvbHV0aW9uIHdvcmtzIGVhcmxpZXIgaW4gdGhlIHJlcXVlc3QgZmxvdyBhbmQgcHJldmVudHMgYSBtYWxpY2lvdXMgcmVxdWVzdHMgdG8gZXZlbiByZWFjaCBhIHNlcnZlciBpbnN0YW5jZTsgaXQncyB0aGVyZWZvcmUgcmVjb21tZW5kZWQgdG8gaW1wbGVtZW50IGEgc29sdXRpb24gYWNjb3JkaW5nIHRvIGFyY2hpdGVjdHVyZSBhbmQgdXNlciBjYXNlLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHJlYWRPbmx5TWFzdGVyS2V5IFJlYWQtb25seSBrZXksIHdoaWNoIGhhcyB0aGUgc2FtZSBjYXBhYmlsaXRpZXMgYXMgTWFzdGVyS2V5IHdpdGhvdXQgd3JpdGVzXG4gKiBAcHJvcGVydHkge1JlcXVlc3RDb21wbGV4aXR5T3B0aW9uc30gcmVxdWVzdENvbXBsZXhpdHkgT3B0aW9ucyB0byBsaW1pdCB0aGUgY29tcGxleGl0eSBvZiByZXF1ZXN0cyB0byBwcmV2ZW50IGFidXNlLiBFYWNoIG9wdGlvbiBjYW4gYmUgc2V0IHRvIGAtMWAgdG8gZGlzYWJsZS5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHJlcXVlc3RDb250ZXh0TWlkZGxld2FyZSBPcHRpb25zIHRvIGN1c3RvbWl6ZSB0aGUgcmVxdWVzdCBjb250ZXh0IHVzaW5nIGludmVyc2lvbiBvZiBjb250cm9sL2RlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHByb3BlcnR5IHtSZXF1ZXN0S2V5d29yZERlbnlsaXN0W119IHJlcXVlc3RLZXl3b3JkRGVueWxpc3QgQW4gYXJyYXkgb2Yga2V5cyBhbmQgdmFsdWVzIHRoYXQgYXJlIHByb2hpYml0ZWQgaW4gZGF0YWJhc2UgcmVhZCBhbmQgd3JpdGUgcmVxdWVzdHMgdG8gcHJldmVudCBwb3RlbnRpYWwgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzLiBJdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IG9ubHkgYSBrZXkgKGB7XCJrZXlcIjpcIi4uLlwifWApLCBvbmx5IGEgdmFsdWUgKGB7XCJ2YWx1ZVwiOlwiLi4uXCJ9YCkgb3IgYSBrZXktdmFsdWUgcGFpciAoYHtcImtleVwiOlwiLi4uXCIsXCJ2YWx1ZVwiOlwiLi4uXCJ9YCkuIFRoZSBzcGVjaWZpY2F0aW9uIGNhbiB1c2UgdGhlIGZvbGxvd2luZyB0eXBlczogYGJvb2xlYW5gLCBgbnVtZXJpY2Agb3IgYHN0cmluZ2AsIHdoZXJlIGBzdHJpbmdgIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYSByZWdleCBub3RhdGlvbi4gUmVxdWVzdCBkYXRhIGlzIGRlZXAtc2Nhbm5lZCBmb3IgbWF0Y2hpbmcgZGVmaW5pdGlvbnMgdG8gZGV0ZWN0IGFsc28gYW55IG5lc3RlZCBvY2N1cnJlbmNlcy4gRGVmYXVsdHMgYXJlIHBhdHRlcm5zIHRoYXQgYXJlIGxpa2VseSB0byBiZSB1c2VkIGluIG1hbGljaW91cyByZXF1ZXN0cy4gU2V0dGluZyB0aGlzIG9wdGlvbiB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHBhdHRlcm5zLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHJlc3RBUElLZXkgS2V5IGZvciBSRVNUIGNhbGxzXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHJldm9rZVNlc3Npb25PblBhc3N3b3JkUmVzZXQgV2hlbiBhIHVzZXIgY2hhbmdlcyB0aGVpciBwYXNzd29yZCwgZWl0aGVyIHRocm91Z2ggdGhlIHJlc2V0IHBhc3N3b3JkIGVtYWlsIG9yIHdoaWxlIGxvZ2dlZCBpbiwgYWxsIHNlc3Npb25zIGFyZSByZXZva2VkIGlmIHRoaXMgaXMgdHJ1ZS4gU2V0IHRvIGZhbHNlIGlmIHlvdSBkb24ndCB3YW50IHRvIHJldm9rZSBzZXNzaW9ucy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gc2NoZWR1bGVkUHVzaCBDb25maWd1cmF0aW9uIGZvciBwdXNoIHNjaGVkdWxpbmcsIGRlZmF1bHRzIHRvIGZhbHNlLlxuICogQHByb3BlcnR5IHtTY2hlbWFPcHRpb25zfSBzY2hlbWEgRGVmaW5lZCBzY2hlbWFcbiAqIEBwcm9wZXJ0eSB7U2VjdXJpdHlPcHRpb25zfSBzZWN1cml0eSBUaGUgc2VjdXJpdHkgb3B0aW9ucyB0byBpZGVudGlmeSBhbmQgcmVwb3J0IHdlYWsgc2VjdXJpdHkgc2V0dGluZ3MuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHNlbmRVc2VyRW1haWxWZXJpZmljYXRpb24gU2V0IHRvIGBmYWxzZWAgdG8gcHJldmVudCBzZW5kaW5nIG9mIHZlcmlmaWNhdGlvbiBlbWFpbC4gU3VwcG9ydHMgYSBmdW5jdGlvbiB3aXRoIGEgcmV0dXJuIHZhbHVlIG9mIGB0cnVlYCBvciBgZmFsc2VgIGZvciBjb25kaXRpb25hbCBlbWFpbCBzZW5kaW5nLjxicj48YnI+RGVmYXVsdCBpcyBgdHJ1ZWAuPGJyPlxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gc2VydmVyQ2xvc2VDb21wbGV0ZSBDYWxsYmFjayB3aGVuIHNlcnZlciBoYXMgY2xvc2VkXG4gKiBAcHJvcGVydHkge1N0cmluZ30gc2VydmVyVVJMIFRoZSBVUkwgdG8gUGFyc2UgU2VydmVyLjxicj48YnI+4pqg77iPIENlcnRhaW4gc2VydmVyIGZlYXR1cmVzIG9yIGFkYXB0ZXJzIG1heSByZXF1aXJlIFBhcnNlIFNlcnZlciB0byBiZSBhYmxlIHRvIGNhbGwgaXRzZWxmIGJ5IG1ha2luZyByZXF1ZXN0cyB0byB0aGUgVVJMIHNldCBpbiBgc2VydmVyVVJMYC4gSWYgYSBmZWF0dXJlIHJlcXVpcmVzIHRoaXMsIGl0IGlzIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSW4gdGhhdCBjYXNlIGVuc3VyZSB0aGF0IHRoZSBVUkwgaXMgYWNjZXNzaWJsZSBmcm9tIHRoZSBzZXJ2ZXIgaXRzZWxmLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHNlc3Npb25MZW5ndGggU2Vzc2lvbiBkdXJhdGlvbiwgaW4gc2Vjb25kcywgZGVmYXVsdHMgdG8gMSB5ZWFyXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHNpbGVudCBEaXNhYmxlcyBjb25zb2xlIG91dHB1dFxuICogQHByb3BlcnR5IHtCb29sZWFufSBzdGFydExpdmVRdWVyeVNlcnZlciBTdGFydHMgdGhlIGxpdmVRdWVyeSBzZXJ2ZXJcbiAqIEBwcm9wZXJ0eSB7QW55fSB0cnVzdFByb3h5IFRoZSB0cnVzdCBwcm94eSBzZXR0aW5ncy4gSXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhlIGV4YWN0IHNldHVwIG9mIHRoZSByZXZlcnNlIHByb3h5LCBzaW5jZSB0aGlzIHNldHRpbmcgd2lsbCB0cnVzdCB2YWx1ZXMgcHJvdmlkZWQgaW4gdGhlIFBhcnNlIFNlcnZlciBBUEkgcmVxdWVzdC4gU2VlIHRoZSA8YSBocmVmPVwiaHR0cHM6Ly9leHByZXNzanMuY29tL2VuL2d1aWRlL2JlaGluZC1wcm94aWVzLmh0bWxcIj5leHByZXNzIHRydXN0IHByb3h5IHNldHRpbmdzPC9hPiBkb2N1bWVudGF0aW9uLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtTdHJpbmdbXX0gdXNlclNlbnNpdGl2ZUZpZWxkcyBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiBmaWVsZHMgaW4gdGhlIHVzZXIgdGFibGUgdGhlIHNob3VsZCBiZSByZW1vdmVkIGZvciBub24tYXV0aG9yaXplZCB1c2Vycy4gRGVwcmVjYXRlZCBAc2VlIHByb3RlY3RlZEZpZWxkc1xuICogQHByb3BlcnR5IHtCb29sZWFufSB2ZXJib3NlIFNldCB0aGUgbG9nZ2luZyB0byB2ZXJib3NlXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHZlcmlmeVNlcnZlclVybCBQYXJzZSBTZXJ2ZXIgbWFrZXMgYSBIVFRQIHJlcXVlc3QgdG8gdGhlIFVSTCBzZXQgaW4gYHNlcnZlclVSTGAgYXQgdGhlIGVuZCBvZiBpdHMgbGF1bmNoIHJvdXRpbmUgdG8gdmVyaWZ5IHRoYXQgdGhlIGxhdW5jaCBzdWNjZWVkZWQuIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBgZmFsc2VgLCB0aGUgdmVyaWZpY2F0aW9uIHdpbGwgYmUgc2tpcHBlZC4gVGhpcyBjYW4gYmUgdXNlZnVsIGluIGVudmlyb25tZW50cyB3aGVyZSB0aGUgc2VydmVyIFVSTCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBzZXJ2ZXIgaXRzZWxmLCBzdWNoIGFzIHdoZW4gcnVubmluZyBiZWhpbmQgYSBmaXJld2FsbCBvciBpbiBjZXJ0YWluIGNvbnRhaW5lcml6ZWQgZW52aXJvbm1lbnRzLjxicj48YnI+4pqg77iPIFNlcnZlciBVUkwgdmVyaWZpY2F0aW9uIHJlcXVpcmVzIFBhcnNlIFNlcnZlciB0byBiZSBhYmxlIHRvIGNhbGwgaXRzZWxmIGJ5IG1ha2luZyByZXF1ZXN0cyB0byB0aGUgVVJMIHNldCBpbiBgc2VydmVyVVJMYC48YnI+PGJyPkRlZmF1bHQgaXMgYHRydWVgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSB2ZXJpZnlVc2VyRW1haWxzIFNldCB0byBgdHJ1ZWAgdG8gcmVxdWlyZSB1c2VycyB0byB2ZXJpZnkgdGhlaXIgZW1haWwgYWRkcmVzcyB0byBjb21wbGV0ZSB0aGUgc2lnbi11cCBwcm9jZXNzLiBTdXBwb3J0cyBhIGZ1bmN0aW9uIHdpdGggYSByZXR1cm4gdmFsdWUgb2YgYHRydWVgIG9yIGBmYWxzZWAgZm9yIGNvbmRpdGlvbmFsIHZlcmlmaWNhdGlvbi48YnI+PGJyPkRlZmF1bHQgaXMgYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB3ZWJob29rS2V5IEtleSBzZW50IHdpdGggb3V0Z29pbmcgd2ViaG9vayBjYWxsc1xuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBSYXRlTGltaXRPcHRpb25zXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZXJyb3JSZXNwb25zZU1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgaW4gdGhlIGJvZHkgb2YgdGhlIEhUVFAgNDI5IHJlc3BvbnNlIHdoZW4gdGhlIHJhdGUgbGltaXQgaXMgaGl0LiBEZWZhdWx0IGlzIGBUb28gbWFueSByZXF1ZXN0cy5gLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBpbmNsdWRlSW50ZXJuYWxSZXF1ZXN0cyBPcHRpb25hbCwgaWYgYHRydWVgIHRoZSByYXRlIGxpbWl0IHdpbGwgYWxzbyBhcHBseSB0byByZXF1ZXN0cyB0aGF0IGFyZSBtYWRlIGluIGJ5IENsb3VkIENvZGUsIGRlZmF1bHQgaXMgYGZhbHNlYC4gTm90ZSB0aGF0IGEgcHVibGljIENsb3VkIENvZGUgZnVuY3Rpb24gdGhhdCB0cmlnZ2VycyBpbnRlcm5hbCByZXF1ZXN0cyBtYXkgY2lyY3VtdmVudCByYXRlIGxpbWl0aW5nIGFuZCBiZSB2dWxuZXJhYmxlIHRvIGF0dGFja3MuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGluY2x1ZGVNYXN0ZXJLZXkgT3B0aW9uYWwsIGlmIGB0cnVlYCB0aGUgcmF0ZSBsaW1pdCB3aWxsIGFsc28gYXBwbHkgdG8gcmVxdWVzdHMgdXNpbmcgdGhlIGBtYXN0ZXJLZXlgLCBkZWZhdWx0IGlzIGBmYWxzZWAuIE5vdGUgdGhhdCBhIHB1YmxpYyBDbG91ZCBDb2RlIGZ1bmN0aW9uIHRoYXQgdHJpZ2dlcnMgaW50ZXJuYWwgcmVxdWVzdHMgdXNpbmcgdGhlIGBtYXN0ZXJLZXlgIG1heSBjaXJjdW12ZW50IHJhdGUgbGltaXRpbmcgYW5kIGJlIHZ1bG5lcmFibGUgdG8gYXR0YWNrcy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSByZWRpc1VybCBPcHRpb25hbCwgdGhlIFVSTCBvZiB0aGUgUmVkaXMgc2VydmVyIHRvIHN0b3JlIHJhdGUgbGltaXQgZGF0YS4gVGhpcyBhbGxvd3MgdG8gcmF0ZSBsaW1pdCByZXF1ZXN0cyBmb3IgbXVsdGlwbGUgc2VydmVycyBieSBjYWxjdWxhdGluZyB0aGUgc3VtIG9mIGFsbCByZXF1ZXN0cyBhY3Jvc3MgYWxsIHNlcnZlcnMuIFRoaXMgaXMgdXNlZnVsIGlmIG11bHRpcGxlIHNlcnZlcnMgYXJlIHByb2Nlc3NpbmcgcmVxdWVzdHMgYmVoaW5kIGEgbG9hZCBiYWxhbmNlci4gRm9yIGV4YW1wbGUsIHRoZSBsaW1pdCBvZiAxMCByZXF1ZXN0cyBpcyByZWFjaGVkIGlmIGVhY2ggb2YgMiBzZXJ2ZXJzIHByb2Nlc3NlZCA1IHJlcXVlc3RzLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHJlcXVlc3RDb3VudCBUaGUgbnVtYmVyIG9mIHJlcXVlc3RzIHRoYXQgY2FuIGJlIG1hZGUgcGVyIElQIGFkZHJlc3Mgd2l0aGluIHRoZSB0aW1lIHdpbmRvdyBzZXQgaW4gYHJlcXVlc3RUaW1lV2luZG93YCBiZWZvcmUgdGhlIHJhdGUgbGltaXQgaXMgYXBwbGllZC4gRm9yIGJhdGNoIHJlcXVlc3RzLCB0aGlzIGFsc28gbGltaXRzIHRoZSBudW1iZXIgb2Ygc3ViLXJlcXVlc3RzIGluIGEgc2luZ2xlIGJhdGNoIHRoYXQgdGFyZ2V0IHRoaXMgcGF0aDsgaG93ZXZlciwgcmVxdWVzdHMgYWxyZWFkeSBjb25zdW1lZCBpbiB0aGUgY3VycmVudCB0aW1lIHdpbmRvdyBhcmUgbm90IGNvdW50ZWQgYWdhaW5zdCB0aGUgYmF0Y2gsIHNvIHRoZSBlZmZlY3RpdmUgbGltaXQgbWF5IGJlIGhpZ2hlciB3aGVuIGNvbWJpbmluZyBpbmRpdmlkdWFsIGFuZCBiYXRjaCByZXF1ZXN0cy4gTm90ZSB0aGF0IHRoaXMgaXMgYSBiYXNpYyBzZXJ2ZXItbGV2ZWwgcmF0ZSBsaW1pdDsgZm9yIGNvbXByZWhlbnNpdmUgcHJvdGVjdGlvbiwgdXNlIGEgcmV2ZXJzZSBwcm94eSBvciBXQUYgZm9yIHJhdGUgbGltaXRpbmcuXG4gKiBAcHJvcGVydHkge1N0cmluZ1tdfSByZXF1ZXN0TWV0aG9kcyBPcHRpb25hbCwgdGhlIEhUVFAgcmVxdWVzdCBtZXRob2RzIHRvIHdoaWNoIHRoZSByYXRlIGxpbWl0IHNob3VsZCBiZSBhcHBsaWVkLCBkZWZhdWx0IGlzIGFsbCBtZXRob2RzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHJlcXVlc3RQYXRoIFRoZSBwYXRoIG9mIHRoZSBBUEkgcm91dGUgdG8gYmUgcmF0ZSBsaW1pdGVkLiBSb3V0ZSBwYXRocywgaW4gY29tYmluYXRpb24gd2l0aCBhIHJlcXVlc3QgbWV0aG9kLCBkZWZpbmUgdGhlIGVuZHBvaW50cyBhdCB3aGljaCByZXF1ZXN0cyBjYW4gYmUgbWFkZS4gUm91dGUgcGF0aHMgY2FuIGJlIHN0cmluZ3MsIHN0cmluZyBwYXR0ZXJucywgb3IgcmVndWxhciBleHByZXNzaW9uLiBTZWU6IGh0dHBzOi8vZXhwcmVzc2pzLmNvbS9lbi9ndWlkZS9yb3V0aW5nLmh0bWxcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSByZXF1ZXN0VGltZVdpbmRvdyBUaGUgd2luZG93IG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHdpdGhpbiB3aGljaCB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIHNldCBpbiBgcmVxdWVzdENvdW50YCBjYW4gYmUgbWFkZSBiZWZvcmUgdGhlIHJhdGUgbGltaXQgaXMgYXBwbGllZC5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB6b25lIFRoZSB0eXBlIG9mIHJhdGUgbGltaXQgdG8gYXBwbHkuIFRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIHN1cHBvcnRlZDo8dWw+PGxpPmBnbG9iYWxgOiByYXRlIGxpbWl0IGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMgbWFkZSBieSBhbGwgdXNlcnM8L2xpPjxsaT5gaXBgOiByYXRlIGxpbWl0IGJhc2VkIG9uIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSByZXF1ZXN0PC9saT48bGk+YHVzZXJgOiByYXRlIGxpbWl0IGJhc2VkIG9uIHRoZSB1c2VyIElEIG9mIHRoZSByZXF1ZXN0PC9saT48bGk+YHNlc3Npb25gOiByYXRlIGxpbWl0IGJhc2VkIG9uIHRoZSBzZXNzaW9uIHRva2VuIG9mIHRoZSByZXF1ZXN0PC9saT48L3VsPkRlZmF1bHQgaXMgYGlwYC5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgUmVxdWVzdENvbXBsZXhpdHlPcHRpb25zXG4gKiBAcHJvcGVydHkge051bWJlcn0gZ3JhcGhRTERlcHRoIE1heGltdW0gZGVwdGggb2YgR3JhcGhRTCBmaWVsZCBzZWxlY3Rpb25zLiBTZXQgdG8gYC0xYCB0byBkaXNhYmxlLiBEZWZhdWx0IGlzIGAtMWAuXG4gKiBAcHJvcGVydHkge051bWJlcn0gZ3JhcGhRTEZpZWxkcyBNYXhpbXVtIG51bWJlciBvZiBmaWVsZCBzZWxlY3Rpb25zIGluIGEgR3JhcGhRTCBxdWVyeS4gU2V0IHRvIGAtMWAgdG8gZGlzYWJsZS4gRGVmYXVsdCBpcyBgLTFgLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGluY2x1ZGVDb3VudCBNYXhpbXVtIG51bWJlciBvZiBpbmNsdWRlIHBhdGhzIGluIGEgc2luZ2xlIHF1ZXJ5LiBTZXQgdG8gYC0xYCB0byBkaXNhYmxlLiBEZWZhdWx0IGlzIGAtMWAuXG4gKiBAcHJvcGVydHkge051bWJlcn0gaW5jbHVkZURlcHRoIE1heGltdW0gZGVwdGggb2YgaW5jbHVkZSBwb2ludGVyIGNoYWlucyAoZS5nLiBgYS5iLmNgID0gZGVwdGggMykuIFNldCB0byBgLTFgIHRvIGRpc2FibGUuIERlZmF1bHQgaXMgYC0xYC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBxdWVyeURlcHRoIE1heGltdW0gbmVzdGluZyBkZXB0aCBvZiBgJG9yYCwgYCRhbmRgLCBgJG5vcmAgcXVlcnkgb3BlcmF0b3JzLiBTZXQgdG8gYC0xYCB0byBkaXNhYmxlLiBEZWZhdWx0IGlzIGAtMWAuXG4gKiBAcHJvcGVydHkge051bWJlcn0gc3VicXVlcnlEZXB0aCBNYXhpbXVtIG5lc3RpbmcgZGVwdGggb2YgYCRpblF1ZXJ5YCwgYCRub3RJblF1ZXJ5YCwgYCRzZWxlY3RgLCBgJGRvbnRTZWxlY3RgIHN1YnF1ZXJpZXMuIFNldCB0byBgLTFgIHRvIGRpc2FibGUuIERlZmF1bHQgaXMgYC0xYC5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgU2VjdXJpdHlPcHRpb25zXG4gKiBAcHJvcGVydHkge0NoZWNrR3JvdXBbXX0gY2hlY2tHcm91cHMgVGhlIHNlY3VyaXR5IGNoZWNrIGdyb3VwcyB0byBydW4uIFRoaXMgYWxsb3dzIHRvIGFkZCBjdXN0b20gc2VjdXJpdHkgY2hlY2tzIG9yIG92ZXJyaWRlIGV4aXN0aW5nIG9uZXMuIERlZmF1bHQgYXJlIHRoZSBncm91cHMgZGVmaW5lZCBpbiBgQ2hlY2tHcm91cHMuanNgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVDaGVjayBJcyB0cnVlIGlmIFBhcnNlIFNlcnZlciBzaG91bGQgY2hlY2sgZm9yIHdlYWsgc2VjdXJpdHkgc2V0dGluZ3MuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGVuYWJsZUNoZWNrTG9nIElzIHRydWUgaWYgdGhlIHNlY3VyaXR5IGNoZWNrIHJlcG9ydCBzaG91bGQgYmUgd3JpdHRlbiB0byBsb2dzLiBUaGlzIHNob3VsZCBvbmx5IGJlIGVuYWJsZWQgdGVtcG9yYXJpbHkgdG8gbm90IGV4cG9zZSB3ZWFrIHNlY3VyaXR5IHNldHRpbmdzIGluIGxvZ3MuXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIFBhZ2VzT3B0aW9uc1xuICogQHByb3BlcnR5IHtQYWdlc1JvdXRlW119IGN1c3RvbVJvdXRlcyBUaGUgY3VzdG9tIHJvdXRlcy5cbiAqIEBwcm9wZXJ0eSB7UGFnZXNDdXN0b21VcmxzT3B0aW9uc30gY3VzdG9tVXJscyBUaGUgVVJMcyB0byB0aGUgY3VzdG9tIHBhZ2VzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVMb2NhbGl6YXRpb24gSXMgdHJ1ZSBpZiBwYWdlcyBzaG91bGQgYmUgbG9jYWxpemVkOyB0aGlzIGhhcyBubyBlZmZlY3Qgb24gY3VzdG9tIHBhZ2UgcmVkaXJlY3RzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVSb3V0ZXIgSXMgdHJ1ZSBpZiB0aGUgcGFnZXMgcm91dGVyIHNob3VsZCBiZSBlbmFibGVkOyB0aGlzIGlzIHJlcXVpcmVkIGZvciBhbnkgb2YgdGhlIHBhZ2VzIG9wdGlvbnMgdG8gdGFrZSBlZmZlY3QuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGZvcmNlUmVkaXJlY3QgSXMgdHJ1ZSBpZiByZXNwb25zZXMgc2hvdWxkIGFsd2F5cyBiZSByZWRpcmVjdHMgYW5kIG5ldmVyIGNvbnRlbnQsIGZhbHNlIGlmIHRoZSByZXNwb25zZSB0eXBlIHNob3VsZCBkZXBlbmQgb24gdGhlIHJlcXVlc3QgdHlwZSAoR0VUIHJlcXVlc3QgLT4gY29udGVudCByZXNwb25zZTsgUE9TVCByZXF1ZXN0IC0+IHJlZGlyZWN0IHJlc3BvbnNlKS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBsb2NhbGl6YXRpb25GYWxsYmFja0xvY2FsZSBUaGUgZmFsbGJhY2sgbG9jYWxlIGZvciBsb2NhbGl6YXRpb24gaWYgbm8gbWF0Y2hpbmcgdHJhbnNsYXRpb24gaXMgcHJvdmlkZWQgZm9yIHRoZSBnaXZlbiBsb2NhbGUuIFRoaXMgaXMgb25seSByZWxldmFudCB3aGVuIHByb3ZpZGluZyB0cmFuc2xhdGlvbiByZXNvdXJjZXMgdmlhIEpTT04gZmlsZS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBsb2NhbGl6YXRpb25Kc29uUGF0aCBUaGUgcGF0aCB0byB0aGUgSlNPTiBmaWxlIGZvciBsb2NhbGl6YXRpb247IHRoZSB0cmFuc2xhdGlvbnMgd2lsbCBiZSB1c2VkIHRvIGZpbGwgdGVtcGxhdGUgcGxhY2Vob2xkZXJzIGFjY29yZGluZyB0byB0aGUgbG9jYWxlLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHBhZ2VzRW5kcG9pbnQgVGhlIEFQSSBlbmRwb2ludCBmb3IgdGhlIHBhZ2VzLiBEZWZhdWx0IGlzICdhcHBzJy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwYWdlc1BhdGggVGhlIHBhdGggdG8gdGhlIHBhZ2VzIGRpcmVjdG9yeTsgdGhpcyBhbHNvIGRlZmluZXMgd2hlcmUgdGhlIHN0YXRpYyBlbmRwb2ludCAnL2FwcHMnIHBvaW50cyB0by4gRGVmYXVsdCBpcyB0aGUgJy4vcHVibGljLycgZGlyZWN0b3J5LlxuICogQHByb3BlcnR5IHtPYmplY3R9IHBsYWNlaG9sZGVycyBUaGUgcGxhY2Vob2xkZXIga2V5cyBhbmQgdmFsdWVzIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHBhZ2VzOyB0aGlzIGNhbiBiZSBhIHNpbXBsZSBvYmplY3Qgb3IgYSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgUGFnZXNSb3V0ZVxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gaGFuZGxlciBUaGUgcm91dGUgaGFuZGxlciB0aGF0IGlzIGFuIGFzeW5jIGZ1bmN0aW9uLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IG1ldGhvZCBUaGUgcm91dGUgbWV0aG9kLCBlLmcuICdHRVQnIG9yICdQT1NUJy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwYXRoIFRoZSByb3V0ZSBwYXRoLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBQYWdlc0N1c3RvbVVybHNPcHRpb25zXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZW1haWxWZXJpZmljYXRpb25MaW5rRXhwaXJlZCBUaGUgVVJMIHRvIHRoZSBjdXN0b20gcGFnZSBmb3IgZW1haWwgdmVyaWZpY2F0aW9uIC0+IGxpbmsgZXhwaXJlZC5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBlbWFpbFZlcmlmaWNhdGlvbkxpbmtJbnZhbGlkIFRoZSBVUkwgdG8gdGhlIGN1c3RvbSBwYWdlIGZvciBlbWFpbCB2ZXJpZmljYXRpb24gLT4gbGluayBpbnZhbGlkLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGVtYWlsVmVyaWZpY2F0aW9uU2VuZEZhaWwgVGhlIFVSTCB0byB0aGUgY3VzdG9tIHBhZ2UgZm9yIGVtYWlsIHZlcmlmaWNhdGlvbiAtPiBsaW5rIHNlbmQgZmFpbC5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBlbWFpbFZlcmlmaWNhdGlvblNlbmRTdWNjZXNzIFRoZSBVUkwgdG8gdGhlIGN1c3RvbSBwYWdlIGZvciBlbWFpbCB2ZXJpZmljYXRpb24gLT4gcmVzZW5kIGxpbmsgLT4gc3VjY2Vzcy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBlbWFpbFZlcmlmaWNhdGlvblN1Y2Nlc3MgVGhlIFVSTCB0byB0aGUgY3VzdG9tIHBhZ2UgZm9yIGVtYWlsIHZlcmlmaWNhdGlvbiAtPiBzdWNjZXNzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHBhc3N3b3JkUmVzZXQgVGhlIFVSTCB0byB0aGUgY3VzdG9tIHBhZ2UgZm9yIHBhc3N3b3JkIHJlc2V0LlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHBhc3N3b3JkUmVzZXRMaW5rSW52YWxpZCBUaGUgVVJMIHRvIHRoZSBjdXN0b20gcGFnZSBmb3IgcGFzc3dvcmQgcmVzZXQgLT4gbGluayBpbnZhbGlkLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHBhc3N3b3JkUmVzZXRTdWNjZXNzIFRoZSBVUkwgdG8gdGhlIGN1c3RvbSBwYWdlIGZvciBwYXNzd29yZCByZXNldCAtPiBzdWNjZXNzLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBDdXN0b21QYWdlc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBjaG9vc2VQYXNzd29yZCBjaG9vc2UgcGFzc3dvcmQgcGFnZSBwYXRoXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZXhwaXJlZFZlcmlmaWNhdGlvbkxpbmsgZXhwaXJlZCB2ZXJpZmljYXRpb24gbGluayBwYWdlIHBhdGhcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBpbnZhbGlkTGluayBpbnZhbGlkIGxpbmsgcGFnZSBwYXRoXG4gKiBAcHJvcGVydHkge1N0cmluZ30gaW52YWxpZFBhc3N3b3JkUmVzZXRMaW5rIGludmFsaWQgcGFzc3dvcmQgcmVzZXQgbGluayBwYWdlIHBhdGhcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBpbnZhbGlkVmVyaWZpY2F0aW9uTGluayBpbnZhbGlkIHZlcmlmaWNhdGlvbiBsaW5rIHBhZ2UgcGF0aFxuICogQHByb3BlcnR5IHtTdHJpbmd9IGxpbmtTZW5kRmFpbCB2ZXJpZmljYXRpb24gbGluayBzZW5kIGZhaWwgcGFnZSBwYXRoXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbGlua1NlbmRTdWNjZXNzIHZlcmlmaWNhdGlvbiBsaW5rIHNlbmQgc3VjY2VzcyBwYWdlIHBhdGhcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwYXJzZUZyYW1lVVJMIGZvciBtYXNraW5nIHVzZXItZmFjaW5nIHBhZ2VzXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcGFzc3dvcmRSZXNldFN1Y2Nlc3MgcGFzc3dvcmQgcmVzZXQgc3VjY2VzcyBwYWdlIHBhdGhcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB2ZXJpZnlFbWFpbFN1Y2Nlc3MgdmVyaWZ5IGVtYWlsIHN1Y2Nlc3MgcGFnZSBwYXRoXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIExpdmVRdWVyeU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IGNsYXNzTmFtZXMgcGFyc2Utc2VydmVyJ3MgTGl2ZVF1ZXJ5IGNsYXNzTmFtZXNcbiAqIEBwcm9wZXJ0eSB7QWRhcHRlcjxQdWJTdWJBZGFwdGVyPn0gcHViU3ViQWRhcHRlciBMaXZlUXVlcnkgcHVic3ViIGFkYXB0ZXJcbiAqIEBwcm9wZXJ0eSB7QW55fSByZWRpc09wdGlvbnMgcGFyc2Utc2VydmVyJ3MgTGl2ZVF1ZXJ5IHJlZGlzT3B0aW9uc1xuICogQHByb3BlcnR5IHtTdHJpbmd9IHJlZGlzVVJMIHBhcnNlLXNlcnZlcidzIExpdmVRdWVyeSByZWRpc1VSTFxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHJlZ2V4VGltZW91dCBTZXRzIHRoZSBtYXhpbXVtIGV4ZWN1dGlvbiB0aW1lIGluIG1pbGxpc2Vjb25kcyBmb3IgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gbWF0Y2hpbmcgaW4gTGl2ZVF1ZXJ5LiBUaGlzIHByb3RlY3RzIGFnYWluc3QgUmVndWxhciBFeHByZXNzaW9uIERlbmlhbCBvZiBTZXJ2aWNlIChSZURvUykgYXR0YWNrcyB3aGVyZSBhIG1hbGljaW91cyByZWdleCBwYXR0ZXJuIGNvdWxkIGJsb2NrIHRoZSBldmVudCBsb29wLiBBIHJlZ2V4IHRoYXQgZXhjZWVkcyB0aGUgdGltZW91dCB3aWxsIGJlIHRyZWF0ZWQgYXMgbm9uLW1hdGNoaW5nLjxicj48YnI+VGhlIHByb3RlY3Rpb24gcnVucyBlYWNoIHJlZ2V4IGV2YWx1YXRpb24gaW4gYW4gaXNvbGF0ZWQgVk0gY29udGV4dCB3aXRoIGEgdGltZW91dC4gVGhpcyBhZGRzIGFwcHJveGltYXRlbHkgNTAgbWljcm9zZWNvbmRzIG9mIG92ZXJoZWFkIHBlciByZWdleCBldmFsdWF0aW9uLiBGb3IgbW9zdCBhcHBsaWNhdGlvbnMgdGhpcyBpcyBuZWdsaWdpYmxlLCBidXQgaXQgY2FuIGFkZCB1cCBpZiB5b3UgaGF2ZSBhIHZlcnkgbGFyZ2UgbnVtYmVyIG9mIExpdmVRdWVyeSBzdWJzY3JpcHRpb25zIHRoYXQgdXNlIGAkcmVnZXhgIG9uIHRoZSBzYW1lIGNsYXNzLiBGb3IgZXhhbXBsZSwgMTAsMDAwIGNvbmN1cnJlbnQgcmVnZXggc3Vic2NyaXB0aW9ucyB3b3VsZCBhZGQgYXBwcm94aW1hdGVseSA1MDBtcyBvZiBwcm9jZXNzaW5nIHRpbWUgcGVyIG9iamVjdCBzYXZlIGV2ZW50IG9uIHRoYXQgY2xhc3MuPGJyPjxicj5TZXQgdG8gYDBgIHRvIGRpc2FibGUgdGhlIHRpbWVvdXQgYW5kIHVzZSBuYXRpdmUgcmVnZXggZXZhbHVhdGlvbiB3aXRob3V0IHByb3RlY3Rpb24uIERlZmF1bHRzIHRvIGAxMDBgLlxuICogQHByb3BlcnR5IHtBZGFwdGVyPFdTU0FkYXB0ZXI+fSB3c3NBZGFwdGVyIEFkYXB0ZXIgbW9kdWxlIGZvciB0aGUgV2ViU29ja2V0U2VydmVyXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIExpdmVRdWVyeVNlcnZlck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBhcHBJZCBUaGlzIHN0cmluZyBzaG91bGQgbWF0Y2ggdGhlIGFwcElkIGluIHVzZSBieSB5b3VyIFBhcnNlIFNlcnZlci4gSWYgeW91IGRlcGxveSB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciBhbG9uZ3NpZGUgUGFyc2UgU2VydmVyLCB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciB3aWxsIHRyeSB0byB1c2UgdGhlIHNhbWUgYXBwSWQuXG4gKiBAcHJvcGVydHkge051bWJlcn0gY2FjaGVUaW1lb3V0IE51bWJlciBpbiBtaWxsaXNlY29uZHMuIFdoZW4gY2xpZW50cyBwcm92aWRlIHRoZSBzZXNzaW9uVG9rZW4gdG8gdGhlIExpdmVRdWVyeSBzZXJ2ZXIsIHRoZSBMaXZlUXVlcnkgc2VydmVyIHdpbGwgdHJ5IHRvIGZldGNoIGl0cyBQYXJzZVVzZXIncyBvYmplY3RJZCBmcm9tIHBhcnNlIHNlcnZlciBhbmQgc3RvcmUgaXQgaW4gdGhlIGNhY2hlLiBUaGUgdmFsdWUgZGVmaW5lcyB0aGUgZHVyYXRpb24gb2YgdGhlIGNhY2hlLiBDaGVjayB0aGUgZm9sbG93aW5nIFNlY3VyaXR5IHNlY3Rpb24gYW5kIG91ciBwcm90b2NvbCBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLCBkZWZhdWx0cyB0byA1ICogMTAwMCBtcyAoNSBzZWNvbmRzKS5cbiAqIEBwcm9wZXJ0eSB7QW55fSBrZXlQYWlycyBBIEpTT04gb2JqZWN0IHRoYXQgc2VydmVzIGFzIGEgd2hpdGVsaXN0IG9mIGtleXMuIEl0IGlzIHVzZWQgZm9yIHZhbGlkYXRpbmcgY2xpZW50cyB3aGVuIHRoZXkgdHJ5IHRvIGNvbm5lY3QgdG8gdGhlIExpdmVRdWVyeSBzZXJ2ZXIuIENoZWNrIHRoZSBmb2xsb3dpbmcgU2VjdXJpdHkgc2VjdGlvbiBhbmQgb3VyIHByb3RvY29sIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbG9nTGV2ZWwgVGhpcyBzdHJpbmcgZGVmaW5lcyB0aGUgbG9nIGxldmVsIG9mIHRoZSBMaXZlUXVlcnkgc2VydmVyLiBXZSBzdXBwb3J0IFZFUkJPU0UsIElORk8sIEVSUk9SLCBOT05FLCBkZWZhdWx0cyB0byBJTkZPLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IG1hc3RlcktleSBUaGlzIHN0cmluZyBzaG91bGQgbWF0Y2ggdGhlIG1hc3RlcktleSBpbiB1c2UgYnkgeW91ciBQYXJzZSBTZXJ2ZXIuIElmIHlvdSBkZXBsb3kgdGhlIExpdmVRdWVyeSBzZXJ2ZXIgYWxvbmdzaWRlIFBhcnNlIFNlcnZlciwgdGhlIExpdmVRdWVyeSBzZXJ2ZXIgd2lsbCB0cnkgdG8gdXNlIHRoZSBzYW1lIG1hc3RlcktleS5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBwb3J0IFRoZSBwb3J0IHRvIHJ1biB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciwgZGVmYXVsdHMgdG8gMTMzNy5cbiAqIEBwcm9wZXJ0eSB7QWRhcHRlcjxQdWJTdWJBZGFwdGVyPn0gcHViU3ViQWRhcHRlciBMaXZlUXVlcnkgcHVic3ViIGFkYXB0ZXJcbiAqIEBwcm9wZXJ0eSB7QW55fSByZWRpc09wdGlvbnMgcGFyc2Utc2VydmVyJ3MgTGl2ZVF1ZXJ5IHJlZGlzT3B0aW9uc1xuICogQHByb3BlcnR5IHtTdHJpbmd9IHJlZGlzVVJMIHBhcnNlLXNlcnZlcidzIExpdmVRdWVyeSByZWRpc1VSTFxuICogQHByb3BlcnR5IHtTdHJpbmd9IHNlcnZlclVSTCBUaGlzIHN0cmluZyBzaG91bGQgbWF0Y2ggdGhlIHNlcnZlclVSTCBpbiB1c2UgYnkgeW91ciBQYXJzZSBTZXJ2ZXIuIElmIHlvdSBkZXBsb3kgdGhlIExpdmVRdWVyeSBzZXJ2ZXIgYWxvbmdzaWRlIFBhcnNlIFNlcnZlciwgdGhlIExpdmVRdWVyeSBzZXJ2ZXIgd2lsbCB0cnkgdG8gdXNlIHRoZSBzYW1lIHNlcnZlclVSTC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB3ZWJzb2NrZXRUaW1lb3V0IE51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiBwaW5nL3BvbmcgZnJhbWVzLiBUaGUgV2ViU29ja2V0IHNlcnZlciBzZW5kcyBwaW5nL3BvbmcgZnJhbWVzIHRvIHRoZSBjbGllbnRzIHRvIGtlZXAgdGhlIFdlYlNvY2tldCBhbGl2ZS4gVGhpcyB2YWx1ZSBkZWZpbmVzIHRoZSBpbnRlcnZhbCBvZiB0aGUgcGluZy9wb25nIGZyYW1lIGZyb20gdGhlIHNlcnZlciB0byBjbGllbnRzLCBkZWZhdWx0cyB0byAxMCAqIDEwMDAgbXMgKDEwIHMpLlxuICogQHByb3BlcnR5IHtBZGFwdGVyPFdTU0FkYXB0ZXI+fSB3c3NBZGFwdGVyIEFkYXB0ZXIgbW9kdWxlIGZvciB0aGUgV2ViU29ja2V0U2VydmVyXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIElkZW1wb3RlbmN5T3B0aW9uc1xuICogQHByb3BlcnR5IHtTdHJpbmdbXX0gcGF0aHMgQW4gYXJyYXkgb2YgcGF0aHMgZm9yIHdoaWNoIHRoZSBmZWF0dXJlIHNob3VsZCBiZSBlbmFibGVkLiBUaGUgbW91bnQgcGF0aCBtdXN0IG5vdCBiZSBpbmNsdWRlZCwgZm9yIGV4YW1wbGUgaW5zdGVhZCBvZiBgL3BhcnNlL2Z1bmN0aW9ucy9teUZ1bmN0aW9uYCBzcGVjaWZpeSBgZnVuY3Rpb25zL215RnVuY3Rpb25gLiBUaGUgZW50cmllcyBhcmUgaW50ZXJwcmV0ZWQgYXMgcmVndWxhciBleHByZXNzaW9uLCBmb3IgZXhhbXBsZSBgZnVuY3Rpb25zLy4qYCBtYXRjaGVzIGFsbCBmdW5jdGlvbnMsIGBqb2JzLy4qYCBtYXRjaGVzIGFsbCBqb2JzLCBgY2xhc3Nlcy8uKmAgbWF0Y2hlcyBhbGwgY2xhc3NlcywgYC4qYCBtYXRjaGVzIGFsbCBwYXRocy5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB0dGwgVGhlIGR1cmF0aW9uIGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggYSByZXF1ZXN0IHJlY29yZCBpcyBkaXNjYXJkZWQgZnJvbSB0aGUgZGF0YWJhc2UsIGRlZmF1bHRzIHRvIDMwMHMuXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIEFjY291bnRMb2Nrb3V0T3B0aW9uc1xuICogQHByb3BlcnR5IHtOdW1iZXJ9IGR1cmF0aW9uIFNldCB0aGUgZHVyYXRpb24gaW4gbWludXRlcyB0aGF0IGEgbG9ja2VkLW91dCBhY2NvdW50IHJlbWFpbnMgbG9ja2VkIG91dCBiZWZvcmUgYXV0b21hdGljYWxseSBiZWNvbWluZyB1bmxvY2tlZC48YnI+PGJyPlZhbGlkIHZhbHVlcyBhcmUgZ3JlYXRlciB0aGFuIGAwYCBhbmQgbGVzcyB0aGFuIGAxMDAwMDBgLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHRocmVzaG9sZCBTZXQgdGhlIG51bWJlciBvZiBmYWlsZWQgc2lnbi1pbiBhdHRlbXB0cyB0aGF0IHdpbGwgY2F1c2UgYSB1c2VyIGFjY291bnQgdG8gYmUgbG9ja2VkLiBJZiB0aGUgYWNjb3VudCBpcyBsb2NrZWQuIFRoZSBhY2NvdW50IHdpbGwgdW5sb2NrIGFmdGVyIHRoZSBkdXJhdGlvbiBzZXQgaW4gdGhlIGBkdXJhdGlvbmAgb3B0aW9uIGhhcyBwYXNzZWQgYW5kIG5vIGZ1cnRoZXIgbG9naW4gYXR0ZW1wdHMgaGF2ZSBiZWVuIG1hZGUuPGJyPjxicj5WYWxpZCB2YWx1ZXMgYXJlIGdyZWF0ZXIgdGhhbiBgMGAgYW5kIGxlc3MgdGhhbiBgMTAwMGAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHVubG9ja09uUGFzc3dvcmRSZXNldCBTZXQgdG8gYHRydWVgICBpZiB0aGUgYWNjb3VudCBzaG91bGQgYmUgdW5sb2NrZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIHBhc3N3b3JkIHJlc2V0Ljxicj48YnI+RGVmYXVsdCBpcyBgZmFsc2VgLjxicj5SZXF1aXJlcyBvcHRpb25zIGBkdXJhdGlvbmAgYW5kIGB0aHJlc2hvbGRgIHRvIGJlIHNldC5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgUGFzc3dvcmRQb2xpY3lPcHRpb25zXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGRvTm90QWxsb3dVc2VybmFtZSBTZXQgdG8gYHRydWVgIHRvIGRpc2FsbG93IHRoZSB1c2VybmFtZSBhcyBwYXJ0IG9mIHRoZSBwYXNzd29yZC48YnI+PGJyPkRlZmF1bHQgaXMgYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBtYXhQYXNzd29yZEFnZSBTZXQgdGhlIG51bWJlciBvZiBkYXlzIGFmdGVyIHdoaWNoIGEgcGFzc3dvcmQgZXhwaXJlcy4gTG9naW4gYXR0ZW1wdHMgZmFpbCBpZiB0aGUgdXNlciBkb2VzIG5vdCByZXNldCB0aGUgcGFzc3dvcmQgYmVmb3JlIGV4cGlyYXRpb24uXG4gKiBAcHJvcGVydHkge051bWJlcn0gbWF4UGFzc3dvcmRIaXN0b3J5IFNldCB0aGUgbnVtYmVyIG9mIHByZXZpb3VzIHBhc3N3b3JkIHRoYXQgd2lsbCBub3QgYmUgYWxsb3dlZCB0byBiZSBzZXQgYXMgbmV3IHBhc3N3b3JkLiBJZiB0aGUgb3B0aW9uIGlzIG5vdCBzZXQgb3Igc2V0IHRvIGAwYCwgbm8gcHJldmlvdXMgcGFzc3dvcmRzIHdpbGwgYmUgY29uc2lkZXJlZC48YnI+PGJyPlZhbGlkIHZhbHVlcyBhcmUgPj0gYDBgIGFuZCA8PSBgMjBgLjxicj5EZWZhdWx0IGlzIGAwYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gcmVzZXRQYXNzd29yZFN1Y2Nlc3NPbkludmFsaWRFbWFpbCBTZXQgdG8gYHRydWVgIGlmIGEgcmVxdWVzdCB0byByZXNldCB0aGUgcGFzc3dvcmQgc2hvdWxkIHJldHVybiBhIHN1Y2Nlc3MgcmVzcG9uc2UgZXZlbiBpZiB0aGUgcHJvdmlkZWQgZW1haWwgYWRkcmVzcyBpcyBpbnZhbGlkLCBvciBgZmFsc2VgIGlmIHRoZSByZXF1ZXN0IHNob3VsZCByZXR1cm4gYW4gZXJyb3IgcmVzcG9uc2UgaWYgdGhlIGVtYWlsIGFkZHJlc3MgaXMgaW52YWxpZC48YnI+PGJyPkRlZmF1bHQgaXMgYHRydWVgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSByZXNldFRva2VuUmV1c2VJZlZhbGlkIFNldCB0byBgdHJ1ZWAgaWYgYSBwYXNzd29yZCByZXNldCB0b2tlbiBzaG91bGQgYmUgcmV1c2VkIGluIGNhc2UgYW5vdGhlciB0b2tlbiBpcyByZXF1ZXN0ZWQgYnV0IHRoZXJlIGlzIGEgdG9rZW4gdGhhdCBpcyBzdGlsbCB2YWxpZCwgaS5lLiBoYXMgbm90IGV4cGlyZWQuIFRoaXMgYXZvaWRzIHRoZSBvZnRlbiBvYnNlcnZlZCBpc3N1ZSB0aGF0IGEgdXNlciByZXF1ZXN0cyBtdWx0aXBsZSBlbWFpbHMgYW5kIGRvZXMgbm90IGtub3cgd2hpY2ggbGluayBjb250YWlucyBhIHZhbGlkIHRva2VuIGJlY2F1c2UgZWFjaCBuZXdseSBnZW5lcmF0ZWQgdG9rZW4gd291bGQgaW52YWxpZGF0ZSB0aGUgcHJldmlvdXMgdG9rZW4uPGJyPjxicj5EZWZhdWx0IGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge051bWJlcn0gcmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24gU2V0IHRoZSB2YWxpZGl0eSBkdXJhdGlvbiBvZiB0aGUgcGFzc3dvcmQgcmVzZXQgdG9rZW4gaW4gc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgdG9rZW4gZXhwaXJlcy4gVGhlIHRva2VuIGlzIHVzZWQgaW4gdGhlIGxpbmsgdGhhdCBpcyBzZXQgaW4gdGhlIGVtYWlsLiBBZnRlciB0aGUgdG9rZW4gZXhwaXJlcywgdGhlIGxpbmsgYmVjb21lcyBpbnZhbGlkIGFuZCBhIG5ldyBsaW5rIGhhcyB0byBiZSBzZW50LiBJZiB0aGUgb3B0aW9uIGlzIG5vdCBzZXQgb3Igc2V0IHRvIGB1bmRlZmluZWRgLCB0aGVuIHRoZSB0b2tlbiBuZXZlciBleHBpcmVzLjxicj48YnI+Rm9yIGV4YW1wbGUsIHRvIGV4cGlyZSB0aGUgdG9rZW4gYWZ0ZXIgMiBob3Vycywgc2V0IGEgdmFsdWUgb2YgNzIwMCBzZWNvbmRzICg9IDYwIHNlY29uZHMgKiA2MCBtaW51dGVzICogMiBob3VycykuPGJyPjxicj5EZWZhdWx0IGlzIGB1bmRlZmluZWRgLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHZhbGlkYXRpb25FcnJvciBTZXQgdGhlIGVycm9yIG1lc3NhZ2UgdG8gYmUgc2VudC48YnI+PGJyPkRlZmF1bHQgaXMgYFBhc3N3b3JkIGRvZXMgbm90IG1lZXQgdGhlIFBhc3N3b3JkIFBvbGljeSByZXF1aXJlbWVudHMuYFxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gdmFsaWRhdG9yQ2FsbGJhY2sgU2V0IGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gdmFsaWRhdGUgYSBwYXNzd29yZCB0byBiZSBhY2NlcHRlZC48YnI+PGJyPklmIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBgdmFsaWRhdG9yUGF0dGVybmAsIHRoZSBwYXNzd29yZCBtdXN0IHBhc3MgYm90aCB0byBiZSBhY2NlcHRlZC5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB2YWxpZGF0b3JQYXR0ZXJuIFNldCB0aGUgcmVndWxhciBleHByZXNzaW9uIHZhbGlkYXRpb24gcGF0dGVybiBhIHBhc3N3b3JkIG11c3QgbWF0Y2ggdG8gYmUgYWNjZXB0ZWQuPGJyPjxicj5JZiB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggYHZhbGlkYXRvckNhbGxiYWNrYCwgdGhlIHBhc3N3b3JkIG11c3QgcGFzcyBib3RoIHRvIGJlIGFjY2VwdGVkLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBGaWxlVXBsb2FkT3B0aW9uc1xuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVGb3JBbm9ueW1vdXNVc2VyIElzIHRydWUgaWYgZmlsZSB1cGxvYWQgc2hvdWxkIGJlIGFsbG93ZWQgZm9yIGFub255bW91cyB1c2Vycy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlRm9yQXV0aGVudGljYXRlZFVzZXIgSXMgdHJ1ZSBpZiBmaWxlIHVwbG9hZCBzaG91bGQgYmUgYWxsb3dlZCBmb3IgYXV0aGVudGljYXRlZCB1c2Vycy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlRm9yUHVibGljIElzIHRydWUgaWYgZmlsZSB1cGxvYWQgc2hvdWxkIGJlIGFsbG93ZWQgZm9yIGFueW9uZSwgcmVnYXJkbGVzcyBvZiB1c2VyIGF1dGhlbnRpY2F0aW9uLlxuICogQHByb3BlcnR5IHtTdHJpbmdbXX0gZmlsZUV4dGVuc2lvbnMgU2V0cyB0aGUgYWxsb3dlZCBmaWxlIGV4dGVuc2lvbnMgZm9yIHVwbG9hZGluZyBmaWxlcy4gVGhlIGV4dGVuc2lvbiBpcyBkZWZpbmVkIGFzIGFuIGFycmF5IG9mIGZpbGUgZXh0ZW5zaW9ucywgb3IgYSByZWdleCBwYXR0ZXJuLjxicj48YnI+SXQgaXMgcmVjb21tZW5kZWQgdG8gb25seSBhbGxvdyB0aGUgZmlsZSBleHRlbnNpb25zIHRoYXQgeW91ciBhcHAgYWN0dWFsbHkgbmVlZHMsIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gYmxvY2tpbmcgZGFuZ2Vyb3VzIGV4dGVuc2lvbnMuIFRoaXMgYWxsb3dsaXN0IGFwcHJvYWNoIGlzIG1vcmUgc2VjdXJlIGJlY2F1c2UgbmV3IGRhbmdlcm91cyBmaWxlIGV4dGVuc2lvbnMgbWF5IGVtZXJnZSB0aGF0IGFyZSBub3QgY292ZXJlZCBieSB0aGUgZGVmYXVsdCBibG9ja2xpc3QuPGJyPjxicj5UaGUgZGVmYXVsdCBibG9ja3MgdGhlIG1vc3QgY29tbW9uIGZpbGUgZXh0ZW5zaW9ucyB0aGF0IGFyZSBrbm93biB0byBiZSByZW5kZXJlZCBhcyBhY3RpdmUgY29udGVudCBieSB3ZWIgYnJvd3NlcnMsIHN1Y2ggYXMgSFRNTCwgU1ZHLCBhbmQgWE1MIGZpbGVzLCB3aGljaCBtYXkgYmUgdXNlZCBieSBhbiBhdHRhY2tlciB0byBjb21wcm9taXNlIHRoZSBzZXNzaW9uIHRva2VuIG9mIGFub3RoZXIgdXNlciB2aWEgYWNjZXNzaW5nIHRoZSBicm93c2VyJ3MgbG9jYWwgc3RvcmFnZS4gVGhlIGJsb2NrZWQgZXh0ZW5zaW9ucyBhcmU6IGBodG1sYCwgYGh0bWAsIGBzaHRtbGAsIGB4aHRtbGAsIGB4aHRtbCt4bWxgLCBgeGh0YCwgYHN2Z2AsIGBzdmd6YCwgYHN2Zyt4bWxgLCBgeG1sYCwgYHhzbGAsIGB4c2x0YCwgYHhzbHQreG1sYCwgYHhzZGAsIGBybmdgLCBgcmRmYCwgYHJkZit4bWxgLCBgb3dsYCwgYG1hdGhtbGAsIGBtYXRobWwreG1sYC48YnI+PGJyPkRlZmF1bHRzIHRvIGBbXCJeKD8hKFt4WHNTXT9baEhdW3RUXVttTV1bbExdPyhcXFxcK1t4WF1bbU1dW2xMXSk/fFt4WF1baEhdW3RUXXxbc1NdW3ZWXVtnR10oW3paXXxcXFxcK1t4WF1bbU1dW2xMXSk/fFt4WF1bbU1dW2xMXXxbeFhdW3NTXVtsTF1bdFRdPyhcXFxcK1t4WF1bbU1dW2xMXSk/fFt4WF1bc1NdW2REXXxbclJdW25OXVtnR118W3JSXVtkRF1bZkZdKFxcXFwrW3hYXVttTV1bbExdKT98W29PXVt3V11bbExdfFttTV1bYUFdW3RUXVtoSF1bbU1dW2xMXShcXFxcK1t4WF1bbU1dW2xMXSk/KSQpXCJdYC5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgTG9nTGV2ZWxcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nTGl0ZXJhbH0gZGVidWcgRGVidWcgbGV2ZWxcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nTGl0ZXJhbH0gZXJyb3IgRXJyb3IgbGV2ZWwgLSBoaWdoZXN0IHByaW9yaXR5XG4gKiBAcHJvcGVydHkge1N0cmluZ0xpdGVyYWx9IGluZm8gSW5mbyBsZXZlbCAtIGRlZmF1bHRcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nTGl0ZXJhbH0gc2lsbHkgU2lsbHkgbGV2ZWwgLSBsb3dlc3QgcHJpb3JpdHlcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nTGl0ZXJhbH0gdmVyYm9zZSBWZXJib3NlIGxldmVsXG4gKiBAcHJvcGVydHkge1N0cmluZ0xpdGVyYWx9IHdhcm4gV2FybmluZyBsZXZlbFxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBMb2dDbGllbnRFdmVudFxuICogQHByb3BlcnR5IHtTdHJpbmdbXX0ga2V5cyBPcHRpb25hbCBhcnJheSBvZiBkb3Qtbm90YXRpb24gcGF0aHMgdG8gZXh0cmFjdCBzcGVjaWZpYyBkYXRhIGZyb20gdGhlIGV2ZW50IG9iamVjdC4gSWYgbm90IHByb3ZpZGVkIG9yIGVtcHR5LCB0aGUgZW50aXJlIGV2ZW50IG9iamVjdCB3aWxsIGJlIGxvZ2dlZC5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBsb2dMZXZlbCBUaGUgbG9nIGxldmVsIHRvIHVzZSBmb3IgdGhpcyBldmVudC4gU2VlIFtMb2dMZXZlbF0oTG9nTGV2ZWwuaHRtbCkgZm9yIGF2YWlsYWJsZSB2YWx1ZXMuIERlZmF1bHRzIHRvIGAnaW5mbydgLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIE1vbmdvREIgZHJpdmVyIGV2ZW50IG5hbWUgdG8gbGlzdGVuIGZvci4gU2VlIHRoZSBbTW9uZ29EQiBkcml2ZXIgZXZlbnRzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vd3d3Lm1vbmdvZGIuY29tL2RvY3MvZHJpdmVycy9ub2RlL2N1cnJlbnQvZnVuZGFtZW50YWxzL21vbml0b3JpbmcvKSBmb3IgYXZhaWxhYmxlIGV2ZW50cy5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRGF0YWJhc2VPcHRpb25zXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGFsbG93UHVibGljRXhwbGFpbiBTZXQgdG8gYHRydWVgIHRvIGFsbG93IGBQYXJzZS5RdWVyeS5leHBsYWluYCB3aXRob3V0IG1hc3RlciBrZXkuPGJyPjxicj7imqDvuI8gRW5hYmxpbmcgdGhpcyBvcHRpb24gbWF5IGV4cG9zZSBzZW5zaXRpdmUgcXVlcnkgcGVyZm9ybWFuY2UgZGF0YSB0byB1bmF1dGhvcml6ZWQgdXNlcnMgYW5kIGNvdWxkIHBvdGVudGlhbGx5IGJlIGV4cGxvaXRlZCBmb3IgbWFsaWNpb3VzIHB1cnBvc2VzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGFwcE5hbWUgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGNyZWF0ZWQgdGhpcyBNb25nb0NsaWVudCBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBhdXRoTWVjaGFuaXNtIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIHRoYXQgTW9uZ29EQiB3aWxsIHVzZSB0byBhdXRoZW50aWNhdGUgdGhlIGNvbm5lY3Rpb24uXG4gKiBAcHJvcGVydHkge0FueX0gYXV0aE1lY2hhbmlzbVByb3BlcnRpZXMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHByb3BlcnRpZXMgZm9yIHRoZSBzcGVjaWZpZWQgYXV0aE1lY2hhbmlzbSBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNvbG9uLXNlcGFyYXRlZCBrZXktdmFsdWUgcGFpcnMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gYXV0aFNvdXJjZSBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGRhdGFiYXNlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyJ3MgY3JlZGVudGlhbHMuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGF1dG9TZWxlY3RGYW1pbHkgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzZXQgd2hldGhlciB0aGUgc29ja2V0IGF0dGVtcHRzIHRvIGNvbm5lY3QgdG8gSVB2NiBhbmQgSVB2NCBhZGRyZXNzZXMgdW50aWwgYSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLiBJZiBhdmFpbGFibGUsIHRoZSBkcml2ZXIgd2lsbCBzZWxlY3QgdGhlIGZpcnN0IElQdjYgYWRkcmVzcy5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBhdXRvU2VsZWN0RmFtaWx5QXR0ZW1wdFRpbWVvdXQgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBhbW91bnQgb2YgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgYSBjb25uZWN0aW9uIGF0dGVtcHQgdG8gZmluaXNoIGJlZm9yZSB0cnlpbmcgdGhlIG5leHQgYWRkcmVzcyB3aGVuIHVzaW5nIHRoZSBhdXRvU2VsZWN0RmFtaWx5IG9wdGlvbi4gSWYgc2V0IHRvIGEgcG9zaXRpdmUgaW50ZWdlciBsZXNzIHRoYW4gMTAsIHRoZSB2YWx1ZSAxMCBpcyB1c2VkIGluc3RlYWQuXG4gKiBAcHJvcGVydHkge1VuaW9ufSBjb21wcmVzc29ycyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgYW4gYXJyYXkgb3IgY29tbWEtZGVsaW1pdGVkIHN0cmluZyBvZiBjb21wcmVzc29ycyB0byBlbmFibGUgbmV0d29yayBjb21wcmVzc2lvbiBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoaXMgY2xpZW50IGFuZCBhIG1vbmdvZC9tb25nb3MgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge051bWJlcn0gY29ubmVjdFRpbWVvdXRNUyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIHdhaXQgdG8gZXN0YWJsaXNoIGEgc2luZ2xlIFRDUCBzb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIGJlZm9yZSByYWlzaW5nIGFuIGVycm9yLiBTcGVjaWZ5aW5nIDAgZGlzYWJsZXMgdGhlIGNvbm5lY3Rpb24gdGltZW91dC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY3JlYXRlSW5kZXhBdXRoRGF0YVVuaXF1ZW5lc3MgU2V0IHRvIGB0cnVlYCB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSB1bmlxdWUgaW5kZXhlcyBvbiB0aGUgYXV0aERhdGEgZmllbGRzIG9mIHRoZSBfVXNlciBjb2xsZWN0aW9uIGZvciBlYWNoIGNvbmZpZ3VyZWQgYXV0aCBwcm92aWRlciBvbiBzZXJ2ZXIgc3RhcnQsIGluY2x1ZGluZyBgYW5vbnltb3VzYCB3aGVuIGFub255bW91cyB1c2VycyBhcmUgZW5hYmxlZC4gVGhlc2UgaW5kZXhlcyBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyBkdXJpbmcgY29uY3VycmVudCBzaWdudXBzIHdpdGggdGhlIHNhbWUgYXV0aERhdGEuIFNldCB0byBgZmFsc2VgIHRvIHNraXAgaW5kZXggY3JlYXRpb24uIERlZmF1bHQgaXMgYHRydWVgLjxicj48YnI+4pqg77iPIFdoZW4gc2V0dGluZyB0aGlzIG9wdGlvbiB0byBgZmFsc2VgIHRvIG1hbnVhbGx5IGNyZWF0ZSB0aGUgaW5kZXhlcywga2VlcCBpbiBtaW5kIHRoYXQgdGhlIG90aGVyd2lzZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaW5kZXhlcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUgdG8gYmUgb3B0aW1pemVkIGZvciB0aGUgaW50ZXJuYWwgdXNhZ2UgYnkgUGFyc2UgU2VydmVyLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBjcmVhdGVJbmRleFJvbGVOYW1lIFNldCB0byBgdHJ1ZWAgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgYSB1bmlxdWUgaW5kZXggb24gdGhlIG5hbWUgZmllbGQgb2YgdGhlIF9Sb2xlIGNvbGxlY3Rpb24gb24gc2VydmVyIHN0YXJ0LiBTZXQgdG8gYGZhbHNlYCB0byBza2lwIGluZGV4IGNyZWF0aW9uLiBEZWZhdWx0IGlzIGB0cnVlYC48YnI+PGJyPuKaoO+4jyBXaGVuIHNldHRpbmcgdGhpcyBvcHRpb24gdG8gYGZhbHNlYCB0byBtYW51YWxseSBjcmVhdGUgdGhlIGluZGV4LCBrZWVwIGluIG1pbmQgdGhhdCB0aGUgb3RoZXJ3aXNlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBpbmRleCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUgdG8gYmUgb3B0aW1pemVkIGZvciB0aGUgaW50ZXJuYWwgdXNhZ2UgYnkgUGFyc2UgU2VydmVyLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBjcmVhdGVJbmRleFVzZXJFbWFpbCBTZXQgdG8gYHRydWVgIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGluZGV4ZXMgb24gdGhlIGVtYWlsIGZpZWxkIG9mIHRoZSBfVXNlciBjb2xsZWN0aW9uIG9uIHNlcnZlciBzdGFydC4gU2V0IHRvIGBmYWxzZWAgdG8gc2tpcCBpbmRleCBjcmVhdGlvbi4gRGVmYXVsdCBpcyBgdHJ1ZWAuPGJyPjxicj7imqDvuI8gV2hlbiBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGBmYWxzZWAgdG8gbWFudWFsbHkgY3JlYXRlIHRoZSBpbmRleCwga2VlcCBpbiBtaW5kIHRoYXQgdGhlIG90aGVyd2lzZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaW5kZXggbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHRvIGJlIG9wdGltaXplZCBmb3IgdGhlIGludGVybmFsIHVzYWdlIGJ5IFBhcnNlIFNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY3JlYXRlSW5kZXhVc2VyRW1haWxDYXNlSW5zZW5zaXRpdmUgU2V0IHRvIGB0cnVlYCB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIGNhc2UtaW5zZW5zaXRpdmUgaW5kZXggb24gdGhlIGVtYWlsIGZpZWxkIG9mIHRoZSBfVXNlciBjb2xsZWN0aW9uIG9uIHNlcnZlciBzdGFydC4gU2V0IHRvIGBmYWxzZWAgdG8gc2tpcCBpbmRleCBjcmVhdGlvbi4gRGVmYXVsdCBpcyBgdHJ1ZWAuPGJyPjxicj7imqDvuI8gV2hlbiBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGBmYWxzZWAgdG8gbWFudWFsbHkgY3JlYXRlIHRoZSBpbmRleCwga2VlcCBpbiBtaW5kIHRoYXQgdGhlIG90aGVyd2lzZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaW5kZXggbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHRvIGJlIG9wdGltaXplZCBmb3IgdGhlIGludGVybmFsIHVzYWdlIGJ5IFBhcnNlIFNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY3JlYXRlSW5kZXhVc2VyRW1haWxWZXJpZnlUb2tlbiBTZXQgdG8gYHRydWVgIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGFuIGluZGV4IG9uIHRoZSBfZW1haWxfdmVyaWZ5X3Rva2VuIGZpZWxkIG9mIHRoZSBfVXNlciBjb2xsZWN0aW9uIG9uIHNlcnZlciBzdGFydC4gU2V0IHRvIGBmYWxzZWAgdG8gc2tpcCBpbmRleCBjcmVhdGlvbi4gRGVmYXVsdCBpcyBgdHJ1ZWAuPGJyPjxicj7imqDvuI8gV2hlbiBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGBmYWxzZWAgdG8gbWFudWFsbHkgY3JlYXRlIHRoZSBpbmRleCwga2VlcCBpbiBtaW5kIHRoYXQgdGhlIG90aGVyd2lzZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaW5kZXggbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHRvIGJlIG9wdGltaXplZCBmb3IgdGhlIGludGVybmFsIHVzYWdlIGJ5IFBhcnNlIFNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY3JlYXRlSW5kZXhVc2VyUGFzc3dvcmRSZXNldFRva2VuIFNldCB0byBgdHJ1ZWAgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgYW4gaW5kZXggb24gdGhlIF9wZXJpc2hhYmxlX3Rva2VuIGZpZWxkIG9mIHRoZSBfVXNlciBjb2xsZWN0aW9uIG9uIHNlcnZlciBzdGFydC4gU2V0IHRvIGBmYWxzZWAgdG8gc2tpcCBpbmRleCBjcmVhdGlvbi4gRGVmYXVsdCBpcyBgdHJ1ZWAuPGJyPjxicj7imqDvuI8gV2hlbiBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGBmYWxzZWAgdG8gbWFudWFsbHkgY3JlYXRlIHRoZSBpbmRleCwga2VlcCBpbiBtaW5kIHRoYXQgdGhlIG90aGVyd2lzZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaW5kZXggbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHRvIGJlIG9wdGltaXplZCBmb3IgdGhlIGludGVybmFsIHVzYWdlIGJ5IFBhcnNlIFNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY3JlYXRlSW5kZXhVc2VyVXNlcm5hbWUgU2V0IHRvIGB0cnVlYCB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBpbmRleGVzIG9uIHRoZSB1c2VybmFtZSBmaWVsZCBvZiB0aGUgX1VzZXIgY29sbGVjdGlvbiBvbiBzZXJ2ZXIgc3RhcnQuIFNldCB0byBgZmFsc2VgIHRvIHNraXAgaW5kZXggY3JlYXRpb24uIERlZmF1bHQgaXMgYHRydWVgLjxicj48YnI+4pqg77iPIFdoZW4gc2V0dGluZyB0aGlzIG9wdGlvbiB0byBgZmFsc2VgIHRvIG1hbnVhbGx5IGNyZWF0ZSB0aGUgaW5kZXgsIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBvdGhlcndpc2UgYXV0b21hdGljYWxseSBjcmVhdGVkIGluZGV4IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoZSBpbnRlcm5hbCB1c2FnZSBieSBQYXJzZSBTZXJ2ZXIuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGNyZWF0ZUluZGV4VXNlclVzZXJuYW1lQ2FzZUluc2Vuc2l0aXZlIFNldCB0byBgdHJ1ZWAgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgYSBjYXNlLWluc2Vuc2l0aXZlIGluZGV4IG9uIHRoZSB1c2VybmFtZSBmaWVsZCBvZiB0aGUgX1VzZXIgY29sbGVjdGlvbiBvbiBzZXJ2ZXIgc3RhcnQuIFNldCB0byBgZmFsc2VgIHRvIHNraXAgaW5kZXggY3JlYXRpb24uIERlZmF1bHQgaXMgYHRydWVgLjxicj48YnI+4pqg77iPIFdoZW4gc2V0dGluZyB0aGlzIG9wdGlvbiB0byBgZmFsc2VgIHRvIG1hbnVhbGx5IGNyZWF0ZSB0aGUgaW5kZXgsIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBvdGhlcndpc2UgYXV0b21hdGljYWxseSBjcmVhdGVkIGluZGV4IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoZSBpbnRlcm5hbCB1c2FnZSBieSBQYXJzZSBTZXJ2ZXIuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGRpcmVjdENvbm5lY3Rpb24gVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBmb3JjZSBhIFNpbmdsZSB0b3BvbG9neSB0eXBlIHdpdGggYSBjb25uZWN0aW9uIHN0cmluZyBjb250YWluaW5nIG9uZSBob3N0LlxuICogQHByb3BlcnR5IHtCb29sZWFufSBkaXNhYmxlSW5kZXhGaWVsZFZhbGlkYXRpb24gU2V0IHRvIGB0cnVlYCB0byBkaXNhYmxlIHZhbGlkYXRpb24gb2YgaW5kZXggZmllbGRzLiBXaGVuIGRpc2FibGVkLCBpbmRleGVzIGNhbiBiZSBjcmVhdGVkIGV2ZW4gaWYgdGhlIGZpZWxkcyBkbyBub3QgZXhpc3QgaW4gdGhlIHNjaGVtYS4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gY3JlYXRpbmcgaW5kZXhlcyBvbiBmaWVsZHMgdGhhdCB3aWxsIGJlIGFkZGVkIGxhdGVyLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVTY2hlbWFIb29rcyBFbmFibGVzIGRhdGFiYXNlIHJlYWwtdGltZSBob29rcyB0byB1cGRhdGUgc2luZ2xlIHNjaGVtYSBjYWNoZS4gU2V0IHRvIGB0cnVlYCBpZiB1c2luZyBtdWx0aXBsZSBQYXJzZSBTZXJ2ZXJzIGluc3RhbmNlcyBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgZGF0YWJhc2UuIEZhaWxpbmcgdG8gZG8gc28gd2lsbCBjYXVzZSBhIHNjaGVtYSBjaGFuZ2UgdG8gbm90IHByb3BhZ2F0ZSB0byBhbGwgaW5zdGFuY2VzIGFuZCByZS1zeW5jaW5nIHdpbGwgb25seSBoYXBwZW4gd2hlbiB0aGUgaW5zdGFuY2VzIHJlc3RhcnQuIFRvIHVzZSB0aGlzIGZlYXR1cmUgd2l0aCBNb25nb0RCLCBhIHJlcGxpY2Egc2V0IGNsdXN0ZXIgd2l0aCBbY2hhbmdlIHN0cmVhbV0oaHR0cHM6Ly9kb2NzLm1vbmdvZGIuY29tL21hbnVhbC9jaGFuZ2VTdHJlYW1zLyNhdmFpbGFiaWxpdHkpIHN1cHBvcnQgaXMgcmVxdWlyZWQuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGZvcmNlU2VydmVyT2JqZWN0SWQgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBmb3JjZSBzZXJ2ZXIgdG8gYXNzaWduIF9pZCB2YWx1ZXMgaW5zdGVhZCBvZiBkcml2ZXIuXG4gKiBAcHJvcGVydHkge051bWJlcn0gaGVhcnRiZWF0RnJlcXVlbmN5TVMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBmcmVxdWVuY3kgaW4gbWlsbGlzZWNvbmRzIGF0IHdoaWNoIHRoZSBkcml2ZXIgY2hlY2tzIHRoZSBzdGF0ZSBvZiB0aGUgTW9uZ29EQiBkZXBsb3ltZW50LlxuICogQHByb3BlcnR5IHtCb29sZWFufSBsb2FkQmFsYW5jZWQgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBpbnN0cnVjdCB0aGUgZHJpdmVyIGl0IGlzIGNvbm5lY3RpbmcgdG8gYSBsb2FkIGJhbGFuY2VyIGZyb250aW5nIGEgbW9uZ29zIGxpa2Ugc2VydmljZS5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBsb2NhbFRocmVzaG9sZE1TIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgc2l6ZSAoaW4gbWlsbGlzZWNvbmRzKSBvZiB0aGUgbGF0ZW5jeSB3aW5kb3cgZm9yIHNlbGVjdGluZyBhbW9uZyBtdWx0aXBsZSBzdWl0YWJsZSBNb25nb0RCIGluc3RhbmNlcy5cbiAqIEBwcm9wZXJ0eSB7TG9nQ2xpZW50RXZlbnRbXX0gbG9nQ2xpZW50RXZlbnRzIEFuIGFycmF5IG9mIE1vbmdvREIgY2xpZW50IGV2ZW50IGNvbmZpZ3VyYXRpb25zIHRvIGVuYWJsZSBsb2dnaW5nIG9mIHNwZWNpZmljIGV2ZW50cy5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBtYXhDb25uZWN0aW5nIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCBtYXkgYmUgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZXN0YWJsaXNoZWQgY29uY3VycmVudGx5IGJ5IHRoZSBjb25uZWN0aW9uIHBvb2wuXG4gKiBAcHJvcGVydHkge051bWJlcn0gbWF4SWRsZVRpbWVNUyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGFtb3VudCBvZiB0aW1lIGluIG1pbGxpc2Vjb25kcyB0aGF0IGEgY29ubmVjdGlvbiBjYW4gcmVtYWluIGlkbGUgaW4gdGhlIGNvbm5lY3Rpb24gcG9vbCBiZWZvcmUgYmVpbmcgcmVtb3ZlZCBhbmQgY2xvc2VkLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IG1heFBvb2xTaXplIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBvcGVuZWQsIGNhY2hlZCwgcmVhZHktdG8tdXNlIGRhdGFiYXNlIGNvbm5lY3Rpb25zIG1haW50YWluZWQgYnkgdGhlIGRyaXZlci5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBtYXhTdGFsZW5lc3NTZWNvbmRzIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc2V0IHRoZSBtYXhpbXVtIHJlcGxpY2F0aW9uIGxhZyBmb3IgcmVhZHMgZnJvbSBzZWNvbmRhcnkgbm9kZXMuXG4gKiBAcHJvcGVydHkge051bWJlcn0gbWF4VGltZU1TIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc2V0IGEgY3VtdWxhdGl2ZSB0aW1lIGxpbWl0IGluIG1pbGxpc2Vjb25kcyBmb3IgcHJvY2Vzc2luZyBvcGVyYXRpb25zIG9uIGEgY3Vyc29yLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IG1pblBvb2xTaXplIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc2V0IHRoZSBtaW5pbXVtIG51bWJlciBvZiBvcGVuZWQsIGNhY2hlZCwgcmVhZHktdG8tdXNlIGRhdGFiYXNlIGNvbm5lY3Rpb25zIG1haW50YWluZWQgYnkgdGhlIGRyaXZlci5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcm94eUhvc3QgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBjb25maWd1cmUgYSBTb2NrczUgcHJveHkgaG9zdCB1c2VkIGZvciBjcmVhdGluZyBUQ1AgY29ubmVjdGlvbnMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcHJveHlQYXNzd29yZCBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIGNvbmZpZ3VyZSBhIFNvY2tzNSBwcm94eSBwYXNzd29yZCB3aGVuIHRoZSBwcm94eSByZXF1aXJlcyB1c2VybmFtZS9wYXNzd29yZCBhdXRoZW50aWNhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBwcm94eVBvcnQgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBjb25maWd1cmUgYSBTb2NrczUgcHJveHkgcG9ydCB1c2VkIGZvciBjcmVhdGluZyBUQ1AgY29ubmVjdGlvbnMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcHJveHlVc2VybmFtZSBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIGNvbmZpZ3VyZSBhIFNvY2tzNSBwcm94eSB1c2VybmFtZSB3aGVuIHRoZSBwcm94eSByZXF1aXJlcyB1c2VybmFtZS9wYXNzd29yZCBhdXRoZW50aWNhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSByZWFkQ29uY2VybkxldmVsIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgbGV2ZWwgb2YgaXNvbGF0aW9uLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHJlYWRQcmVmZXJlbmNlIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgcmVhZCBwcmVmZXJlbmNlcyBmb3IgdGhpcyBjb25uZWN0aW9uLlxuICogQHByb3BlcnR5IHtBbnlbXX0gcmVhZFByZWZlcmVuY2VUYWdzIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgdGFncyBkb2N1bWVudCBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNvbG9uLXNlcGFyYXRlZCBrZXktdmFsdWUgcGFpcnMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcmVwbGljYVNldCBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHJlcGxpY2Egc2V0LCBpZiB0aGUgbW9uZ29kIGlzIGEgbWVtYmVyIG9mIGEgcmVwbGljYSBzZXQuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHJldHJ5UmVhZHMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBlbmFibGUgcmV0cnlhYmxlIHJlYWRzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSByZXRyeVdyaXRlcyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNldCB3aGV0aGVyIHRvIHJldHJ5IGZhaWxlZCB3cml0ZXMuXG4gKiBAcHJvcGVydHkge051bWJlcn0gc2NoZW1hQ2FjaGVUdGwgVGhlIGR1cmF0aW9uIGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIHNjaGVtYSBjYWNoZSBleHBpcmVzIGFuZCB3aWxsIGJlIHJlZmV0Y2hlZCBmcm9tIHRoZSBkYXRhYmFzZS4gVXNlIHRoaXMgb3B0aW9uIGlmIHVzaW5nIG11bHRpcGxlIFBhcnNlIFNlcnZlcnMgaW5zdGFuY2VzIGNvbm5lY3RlZCB0byB0aGUgc2FtZSBkYXRhYmFzZS4gQSBsb3cgZHVyYXRpb24gd2lsbCBjYXVzZSB0aGUgc2NoZW1hIGNhY2hlIHRvIGJlIHVwZGF0ZWQgdG9vIG9mdGVuLCBjYXVzaW5nIHVubmVjZXNzYXJ5IGRhdGFiYXNlIHJlYWRzLiBBIGhpZ2ggZHVyYXRpb24gd2lsbCBjYXVzZSB0aGUgc2NoZW1hIHRvIGJlIHVwZGF0ZWQgdG9vIHJhcmVseSwgaW5jcmVhc2luZyB0aGUgdGltZSByZXF1aXJlZCB1bnRpbCBzY2hlbWEgY2hhbmdlcyBwcm9wYWdhdGUgdG8gYWxsIHNlcnZlciBpbnN0YW5jZXMuIFRoaXMgZmVhdHVyZSBjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSBvciBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvcHRpb24gYGVuYWJsZVNjaGVtYUhvb2tzYC4gRGVmYXVsdCBpcyBpbmZpbml0ZSB3aGljaCBtZWFucyB0aGUgc2NoZW1hIGNhY2hlIG5ldmVyIGV4cGlyZXMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gc2VydmVyTW9uaXRvcmluZ01vZGUgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBpbnN0cnVjdCB0aGUgZHJpdmVyIG1vbml0b3JzIHRvIHVzZSBhIHNwZWNpZmljIG1vbml0b3JpbmcgbW9kZS5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBzZXJ2ZXJTZWxlY3Rpb25UaW1lb3V0TVMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBhbW91bnQgb2YgdGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIGEgc2VydmVyIHRvIGJlIGNvbnNpZGVyZWQgc3VpdGFibGUgZm9yIHNlbGVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBzb2NrZXRUaW1lb3V0TVMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCBzcGVudCBhdHRlbXB0aW5nIHRvIHNlbmQgb3IgcmVjZWl2ZSBvbiBhIHNvY2tldCBiZWZvcmUgdGltaW5nIG91dC4gU3BlY2lmeWluZyAwIG1lYW5zIG5vIHRpbWVvdXQuXG4gKiBAcHJvcGVydHkge051bWJlcn0gc3J2TWF4SG9zdHMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBob3N0cyB0byBjb25uZWN0IHRvIHdoZW4gdXNpbmcgYW4gc3J2IGNvbm5lY3Rpb24gc3RyaW5nLCBhIHNldHRpbmcgb2YgMCBtZWFucyB1bmxpbWl0ZWQgaG9zdHMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gc3J2U2VydmljZU5hbWUgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBtb2RpZnkgdGhlIHNydiBVUkkgc2VydmljZSBuYW1lLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBzc2wgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBlbmFibGUgb3IgZGlzYWJsZSBUTFMvU1NMIGZvciB0aGUgY29ubmVjdGlvbiAoZXF1aXZhbGVudCB0byB0bHMgb3B0aW9uKS5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gdGxzIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gZW5hYmxlIG9yIGRpc2FibGUgVExTL1NTTCBmb3IgdGhlIGNvbm5lY3Rpb24uXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHRsc0FsbG93SW52YWxpZENlcnRpZmljYXRlcyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIGJ5cGFzcyB2YWxpZGF0aW9uIG9mIHRoZSBjZXJ0aWZpY2F0ZXMgcHJlc2VudGVkIGJ5IHRoZSBtb25nb2QvbW9uZ29zIGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtCb29sZWFufSB0bHNBbGxvd0ludmFsaWRIb3N0bmFtZXMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBkaXNhYmxlIGhvc3RuYW1lIHZhbGlkYXRpb24gb2YgdGhlIGNlcnRpZmljYXRlIHByZXNlbnRlZCBieSB0aGUgbW9uZ29kL21vbmdvcyBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB0bHNDQUZpbGUgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBhIGxvY2FsIC5wZW0gZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSByb290IGNlcnRpZmljYXRlIGNoYWluIGZyb20gdGhlIENlcnRpZmljYXRlIEF1dGhvcml0eS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB0bHNDZXJ0aWZpY2F0ZUtleUZpbGUgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBhIGxvY2FsIC5wZW0gZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBjbGllbnQncyBUTFMvU1NMIGNlcnRpZmljYXRlIGFuZCBrZXkuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gdGxzQ2VydGlmaWNhdGVLZXlGaWxlUGFzc3dvcmQgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSB0bHNDZXJ0aWZpY2F0ZUtleUZpbGUuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHRsc0luc2VjdXJlIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gZGlzYWJsZSB2YXJpb3VzIGNlcnRpZmljYXRlIHZhbGlkYXRpb25zLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHdhaXRRdWV1ZVRpbWVvdXRNUyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIG1heGltdW0gdGltZSBpbiBtaWxsaXNlY29uZHMgdGhhdCBhIHRocmVhZCBjYW4gd2FpdCBmb3IgYSBjb25uZWN0aW9uIHRvIGJlY29tZSBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge051bWJlcn0gemxpYkNvbXByZXNzaW9uTGV2ZWwgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBjb21wcmVzc2lvbiBsZXZlbCBpZiB1c2luZyB6bGliIGZvciBuZXR3b3JrIGNvbXByZXNzaW9uICgwLTkpLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBBdXRoQWRhcHRlclxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVkIElzIGB0cnVlYCBpZiB0aGUgYXV0aCBhZGFwdGVyIGlzIGVuYWJsZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBMb2dMZXZlbHNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBjbG91ZEZ1bmN0aW9uRXJyb3IgTG9nIGxldmVsIHVzZWQgYnkgdGhlIENsb3VkIENvZGUgRnVuY3Rpb25zIG9uIGVycm9yLiBEZWZhdWx0IGlzIGBlcnJvcmAuIFNlZSBbTG9nTGV2ZWxdKExvZ0xldmVsLmh0bWwpIGZvciBhdmFpbGFibGUgdmFsdWVzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGNsb3VkRnVuY3Rpb25TdWNjZXNzIExvZyBsZXZlbCB1c2VkIGJ5IHRoZSBDbG91ZCBDb2RlIEZ1bmN0aW9ucyBvbiBzdWNjZXNzLiBEZWZhdWx0IGlzIGBpbmZvYC4gU2VlIFtMb2dMZXZlbF0oTG9nTGV2ZWwuaHRtbCkgZm9yIGF2YWlsYWJsZSB2YWx1ZXMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gdHJpZ2dlckFmdGVyIExvZyBsZXZlbCB1c2VkIGJ5IHRoZSBDbG91ZCBDb2RlIFRyaWdnZXJzIGBhZnRlclNhdmVgLCBgYWZ0ZXJEZWxldGVgLCBgYWZ0ZXJGaW5kYCwgYGFmdGVyTG9nb3V0YC4gRGVmYXVsdCBpcyBgaW5mb2AuIFNlZSBbTG9nTGV2ZWxdKExvZ0xldmVsLmh0bWwpIGZvciBhdmFpbGFibGUgdmFsdWVzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHRyaWdnZXJCZWZvcmVFcnJvciBMb2cgbGV2ZWwgdXNlZCBieSB0aGUgQ2xvdWQgQ29kZSBUcmlnZ2VycyBgYmVmb3JlU2F2ZWAsIGBiZWZvcmVEZWxldGVgLCBgYmVmb3JlRmluZGAsIGBiZWZvcmVMb2dpbmAgb24gZXJyb3IuIERlZmF1bHQgaXMgYGVycm9yYC4gU2VlIFtMb2dMZXZlbF0oTG9nTGV2ZWwuaHRtbCkgZm9yIGF2YWlsYWJsZSB2YWx1ZXMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gdHJpZ2dlckJlZm9yZVN1Y2Nlc3MgTG9nIGxldmVsIHVzZWQgYnkgdGhlIENsb3VkIENvZGUgVHJpZ2dlcnMgYGJlZm9yZVNhdmVgLCBgYmVmb3JlRGVsZXRlYCwgYGJlZm9yZUZpbmRgLCBgYmVmb3JlTG9naW5gIG9uIHN1Y2Nlc3MuIERlZmF1bHQgaXMgYGluZm9gLiBTZWUgW0xvZ0xldmVsXShMb2dMZXZlbC5odG1sKSBmb3IgYXZhaWxhYmxlIHZhbHVlcy5cbiAqL1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBIiwiaWdub3JlTGlzdCI6W119