@discordeno/gateway 19.0.0-next.aecc55d → 19.0.0-next.af6ffc3

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.
package/README.md CHANGED
@@ -1,8 +1,17 @@
1
- # Standalone WS / Proxy WS
1
+ # Discordeno WS
2
2
 
3
- This WS service is meant for ADVANCED DEVELOPERS ONLY!
3
+ <img align="right" src="https://raw.githubusercontent.com/discordeno/discordeno/main/website/static/img/logo.png" height="150px" />
4
4
 
5
- ## Benefits
5
+ Discord API library for [Node.JS](https://nodejs.org), [Deno](https://deno.land) & [Bun](https://bun.sh/)
6
+
7
+ [![Discord](https://img.shields.io/discord/785384884197392384?color=7289da&logo=discord&logoColor=dark)](https://discord.com/invite/5vBgXk3UcZ)
8
+ [![codecov](https://codecov.io/gh/discordeno/discordeno/branch/main/graph/badge.svg?token=SQI9OYJ7AK)](https://codecov.io/gh/discordeno/discordeno)
9
+ ![action status](https://github.com/discordeno/discordeno/actions/workflows/lib-check.yml/badge.svg?event=push)
10
+
11
+ > [!WARNING]
12
+ > Using a Standalone / Proxy WS is mean for advanced developers only
13
+
14
+ Standalone WebSocket to connect to the Discord API.
6
15
 
7
16
  - **Zero Downtime Updates**:
8
17
 
@@ -48,14 +57,8 @@ This WS service is meant for ADVANCED DEVELOPERS ONLY!
48
57
  - Take full advantage of all your CPU cores by using workers to spread the load. Control how many shards per worker
49
58
  and how many workers to maximize efficiency!
50
59
 
51
- ## Usage
52
-
53
- ```ts
54
- createGatewayManager({
55
- // TODO: (docs) Fill this out
56
- })
57
- ```
58
-
59
- ## API/Docs
60
+ ## Links
60
61
 
61
- // TODO: (docs) Fill this out. List all props/methods.
62
+ - [Website](https://discordeno.js.org/)
63
+ - [Documentation](https://doc.deno.land/https/deno.land/x/discordeno/mod.ts)
64
+ - [Discord](https://discord.com/invite/5vBgXk3UcZ)
@@ -221,6 +221,7 @@ let DiscordenoShard = class DiscordenoShard {
221
221
  /** Handle a gateway connection close. */ async handleClose(close) {
222
222
  // gateway.debug("GW CLOSED", { shardId, payload: event });
223
223
  this.stopHeartbeating();
224
+ this.logger.debug(`[Shard] Gateway connection closed with code ${close.code}.`);
224
225
  switch(close.code){
225
226
  case _types1.ShardSocketCloseCodes.TestingFinished:
226
227
  {
@@ -247,7 +248,7 @@ let DiscordenoShard = class DiscordenoShard {
247
248
  case _types.GatewayCloseEventCodes.RateLimited:
248
249
  case _types.GatewayCloseEventCodes.SessionTimedOut:
249
250
  {
250
- this.logger.debug(`[Shard] Gateway connection closing requiring re-identify. Code: ${close.code}`);
251
+ this.logger.debug('[Shard] Gateway connection closing requiring re-identify.');
251
252
  this.state = _types1.ShardState.Identifying;
252
253
  this.events.disconnected?.(this);
253
254
  return await this.identify();
@@ -271,7 +272,7 @@ let DiscordenoShard = class DiscordenoShard {
271
272
  case _types.GatewayCloseEventCodes.AlreadyAuthenticated:
272
273
  default:
273
274
  {
274
- this.logger.info(`[Shard] closed shard #${this.id}. Resuming...`);
275
+ this.logger.info(`[Shard] Closed shard #${this.id} with code ${close.code}. Attempting to resume...`);
275
276
  this.state = _types1.ShardState.Resuming;
276
277
  this.events.disconnected?.(this);
277
278
  return await this.resume();
@@ -486,4 +487,4 @@ let DiscordenoShard = class DiscordenoShard {
486
487
  };
487
488
  const _default = DiscordenoShard;
488
489
 
489
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TaGFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tY29uZnVzaW5nLXZvaWQtZXhwcmVzc2lvbiAqL1xuaW1wb3J0IHR5cGUgeyBEaXNjb3JkR2F0ZXdheVBheWxvYWQsIERpc2NvcmRIZWxsbywgRGlzY29yZFJlYWR5IH0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnXG5pbXBvcnQgeyBHYXRld2F5Q2xvc2VFdmVudENvZGVzLCBHYXRld2F5T3Bjb2RlcyB9IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgTGVha3lCdWNrZXQsIGNhbWVsaXplLCBkZWxheSwgbG9nZ2VyIH0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnXG5pbXBvcnQgeyBpbmZsYXRlU3luYyB9IGZyb20gJ25vZGU6emxpYidcbmltcG9ydCBOb2RlV2ViU29ja2V0IGZyb20gJ3dzJ1xuaW1wb3J0IHR5cGUgeyBCb3RTdGF0dXNVcGRhdGUsIFNoYXJkRXZlbnRzLCBTaGFyZEdhdGV3YXlDb25maWcsIFNoYXJkSGVhcnQsIFNoYXJkU29ja2V0UmVxdWVzdCB9IGZyb20gJy4vdHlwZXMuanMnXG5pbXBvcnQgeyBTaGFyZFNvY2tldENsb3NlQ29kZXMsIFNoYXJkU3RhdGUgfSBmcm9tICcuL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIGxldCBXZWJTb2NrZXQ6IGFueVxuXG5leHBvcnQgY2xhc3MgRGlzY29yZGVub1NoYXJkIHtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgc2hhcmQgKi9cbiAgaWQ6IG51bWJlclxuICAvKiogVGhlIGNvbm5lY3Rpb24gY29uZmlnIGRldGFpbHMgdGhhdCB0aGlzIHNoYXJkIHdpbGwgdXNlZCB0byBjb25uZWN0IHRvIGRpc2NvcmQuICovXG4gIGNvbm5lY3Rpb246IFNoYXJkR2F0ZXdheUNvbmZpZ1xuICAvKiogVGhpcyBjb250YWlucyBhbGwgdGhlIGhlYXJ0YmVhdCBpbmZvcm1hdGlvbiAqL1xuICBoZWFydDogU2hhcmRIZWFydFxuICAvKiogVGhlIG1heGltdW0gb2YgcmVxdWVzdHMgd2hpY2ggY2FuIGJlIHNlbmQgdG8gZGlzY29yZCBwZXIgcmF0ZSBsaW1pdCB0aWNrLiBUeXBpY2FsbHkgdGhpcyB2YWx1ZSBzaG91bGQgbm90IGJlIGNoYW5nZWQuICovXG4gIG1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljazogbnVtYmVyID0gMTIwXG4gIC8qKiBUaGUgcHJldmlvdXMgcGF5bG9hZCBzZXF1ZW5jZSBudW1iZXIuICovXG4gIHByZXZpb3VzU2VxdWVuY2VOdW1iZXI6IG51bWJlciB8IG51bGwgPSBudWxsXG4gIC8qKiBJbiB3aGljaCBpbnRlcnZhbCAoaW4gbWlsbGlzZWNvbmRzKSB0aGUgZ2F0ZXdheSByZXNldHMgaXQncyByYXRlIGxpbWl0LiAqL1xuICByYXRlTGltaXRSZXNldEludGVydmFsOiBudW1iZXIgPSA2MDAwMFxuICAvKiogQ3VycmVudCBzZXNzaW9uIGlkIG9mIHRoZSBzaGFyZCBpZiBwcmVzZW50LiAqL1xuICBzZXNzaW9uSWQ/OiBzdHJpbmdcbiAgLyoqIFRoaXMgY29udGFpbnMgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIERpc2NvcmQsIGlmIGN1cnJlbnRseSBjb25uZWN0ZWQuICovXG4gIHNvY2tldD86IE5vZGVXZWJTb2NrZXRcbiAgLyoqIEN1cnJlbnQgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHRoaXMuICovXG4gIHN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gIC8qKiBUaGUgdXJsIHByb3ZpZGVkIGJ5IGRpc2NvcmQgdG8gdXNlIHdoZW4gcmVzdW1pbmcgYSBjb25uZWN0aW9uIGZvciB0aGlzIHRoaXMuICovXG4gIHJlc3VtZUdhdGV3YXlVcmw6IHN0cmluZyA9ICcnXG4gIC8qKiBUaGUgc2hhcmQgcmVsYXRlZCBldmVudCBoYW5kbGVycy4gKi9cbiAgZXZlbnRzOiBTaGFyZEV2ZW50cyA9IHt9XG4gIC8qKiBDYWNoZSBmb3IgcGVuZGluZyBnYXRld2F5IHJlcXVlc3RzIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gc2VuZCB3aGlsZSB0aGUgZ2F0ZXdheSB3ZW50IG9mZmxpbmUuICovXG4gIG9mZmxpbmVTZW5kUXVldWU6IEFycmF5PChfPzogdW5rbm93bikgPT4gdm9pZD4gPSBbXVxuICAvKiogUmVzb2x2ZSBpbnRlcm5hbCB3YWl0aW5nIHN0YXRlcy4gTWFwcGVkIGJ5IFNlbGVjdGVkRXZlbnRzID0+IFJlc29sdmVGdW5jdGlvbiAqL1xuICByZXNvbHZlcyA9IG5ldyBNYXA8J1JFQURZJyB8ICdSRVNVTUVEJyB8ICdJTlZBTElEX1NFU1NJT04nLCAocGF5bG9hZDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKSA9PiB2b2lkPigpXG4gIC8qKiBTaGFyZCBidWNrZXQuIE9ubHkgYWNjZXNzIHRoaXMgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiBCdWNrZXQgZm9yIGhhbmRsaW5nIHNoYXJkIHJlcXVlc3QgcmF0ZSBsaW1pdHMuICovXG4gIGJ1Y2tldDogTGVha3lCdWNrZXRcbiAgLyoqIExvZ2dlciBmb3IgdGhlIGJ1Y2tldCAqL1xuICBsb2dnZXI6IFBpY2s8dHlwZW9mIGxvZ2dlciwgJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicgfCAnZmF0YWwnPlxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNoYXJkQ3JlYXRlT3B0aW9ucykge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkXG4gICAgdGhpcy5jb25uZWN0aW9uID0gb3B0aW9ucy5jb25uZWN0aW9uXG4gICAgdGhpcy5ldmVudHMgPSBvcHRpb25zLmV2ZW50c1xuICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyXG5cbiAgICB0aGlzLmhlYXJ0ID0ge1xuICAgICAgYWNrbm93bGVkZ2VkOiBmYWxzZSxcbiAgICAgIGludGVydmFsOiA0NTAwMCxcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5yZXF1ZXN0SWRlbnRpZnkpIHRoaXMucmVxdWVzdElkZW50aWZ5ID0gb3B0aW9ucy5yZXF1ZXN0SWRlbnRpZnlcbiAgICBpZiAob3B0aW9ucy5zaGFyZElzUmVhZHkpIHRoaXMuc2hhcmRJc1JlYWR5ID0gb3B0aW9ucy5zaGFyZElzUmVhZHlcblxuICAgIHRoaXMuYnVja2V0ID0gbmV3IExlYWt5QnVja2V0KHtcbiAgICAgIG1heDogdGhpcy5jYWxjdWxhdGVTYWZlUmVxdWVzdHMoKSxcbiAgICAgIHJlZmlsbEFtb3VudDogdGhpcy5jYWxjdWxhdGVTYWZlUmVxdWVzdHMoKSxcbiAgICAgIHJlZmlsbEludGVydmFsOiA2MDAwMCxcbiAgICAgIGxvZ2dlcjogdGhpcy5sb2dnZXIsXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBUaGUgZ2F0ZXdheSBjb25maWd1cmF0aW9uIHdoaWNoIGlzIHVzZWQgdG8gY29ubmVjdCB0byBEaXNjb3JkLiAqL1xuICBnZXQgZ2F0ZXdheUNvbmZpZygpOiBTaGFyZEdhdGV3YXlDb25maWcge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKiBUaGUgdXJsIHRvIGNvbm5lY3QgdG8uIEluaXRpYWxseSB0aGlzIGlzIHRoZSBkaXNjb3JkIGdhdGV3YXkgdXJsLCBhbmQgdGhlbiBpcyBzd2l0Y2hlZCB0byByZXN1bWUgZ2F0ZXdheSB1cmwgb25jZSBhIFJFQURZIGlzIHJlY2VpdmVkLiAqL1xuICBnZXQgY29ubmVjdGlvblVybCgpOiBzdHJpbmcge1xuICAgIC8vIFVzZSB8fCBhbmQgbm90ID8/IGhlcmUuID8/IHdpbGwgY2F1c2UgYSBidWcuXG4gICAgcmV0dXJuIHRoaXMucmVzdW1lR2F0ZXdheVVybCB8fCB0aGlzLmdhdGV3YXlDb25maWcudXJsXG4gIH1cblxuICAvKiogQ2FsY3VsYXRlIHRoZSBhbW91bnQgb2YgcmVxdWVzdHMgd2hpY2ggY2FuIHNhZmVseSBiZSBtYWRlIHBlciByYXRlIGxpbWl0IGludGVydmFsLCBiZWZvcmUgdGhlIGdhdGV3YXkgZ2V0cyBkaXNjb25uZWN0ZWQgZHVlIHRvIGFuIGV4Y2VlZGVkIHJhdGUgbGltaXQuICovXG4gIGNhbGN1bGF0ZVNhZmVSZXF1ZXN0cygpOiBudW1iZXIge1xuICAgIC8vICogMiBhZGRzIGV4dHJhIHNhZmV0eSBsYXllciBmb3IgZGlzY29yZHMgT1AgMSByZXF1ZXN0cyB0aGF0IHdlIG5lZWQgdG8gcmVzcG9uZCB0b1xuICAgIGNvbnN0IHNhZmVSZXF1ZXN0cyA9IHRoaXMubWF4UmVxdWVzdHNQZXJSYXRlTGltaXRUaWNrIC0gTWF0aC5jZWlsKHRoaXMucmF0ZUxpbWl0UmVzZXRJbnRlcnZhbCAvIHRoaXMuaGVhcnQuaW50ZXJ2YWwpICogMlxuXG4gICAgcmV0dXJuIHNhZmVSZXF1ZXN0cyA8IDAgPyAwIDogc2FmZVJlcXVlc3RzXG4gIH1cblxuICBhc3luYyBjaGVja09mZmxpbmUoaGlnaFByaW9yaXR5OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbigpKSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAvLyBIaWdoZXIgcHJpb3JpdHkgcmVxdWVzdHMgZ2V0IGFkZGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LlxuICAgICAgICBpZiAoaGlnaFByaW9yaXR5KSB0aGlzLm9mZmxpbmVTZW5kUXVldWUudW5zaGlmdChyZXNvbHZlKVxuICAgICAgICBlbHNlIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5wdXNoKHJlc29sdmUpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgc29ja2V0IGNvbm5lY3Rpb24gdG8gZGlzY29yZCBpZiBwcmVzZW50LiAqL1xuICBjbG9zZShjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc29ja2V0Py5yZWFkeVN0YXRlICE9PSBOb2RlV2ViU29ja2V0Lk9QRU4pIHJldHVyblxuXG4gICAgdGhpcy5zb2NrZXQ/LmNsb3NlKGNvZGUsIHJlYXNvbilcbiAgfVxuXG4gIC8qKiBDb25uZWN0IHRoZSBzaGFyZCB3aXRoIHRoZSBnYXRld2F5IGFuZCBzdGFydCBoZWFydGJlYXRpbmcuIFRoaXMgd2lsbCBub3QgaWRlbnRpZnkgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LiAqL1xuICBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8RGlzY29yZGVub1NoYXJkPiB7XG4gICAgLy8gT25seSBzZXQgdGhlIHNoYXJkIHRvIGBDb25uZWN0aW5nYCBzdGF0ZSxcbiAgICAvLyBpZiB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IGRvZXMgbm90IGNvbWUgZnJvbSBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgIGlmICghW1NoYXJkU3RhdGUuSWRlbnRpZnlpbmcsIFNoYXJkU3RhdGUuUmVzdW1pbmddLmluY2x1ZGVzKHRoaXMuc3RhdGUpKSB7XG4gICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0aW5nXG4gICAgfVxuICAgIHRoaXMuZXZlbnRzLmNvbm5lY3Rpbmc/Lih0aGlzKVxuXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTCh0aGlzLmNvbm5lY3Rpb25VcmwpXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3YnLCB0aGlzLmdhdGV3YXlDb25maWcudmVyc2lvbi50b1N0cmluZygpKVxuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdlbmNvZGluZycsICdqc29uJylcblxuICAgIGNvbnN0IHNvY2tldDogTm9kZVdlYlNvY2tldCA9XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIERlbm9cbiAgICAgIGdsb2JhbFRoaXMuRGVubyAhPT0gdW5kZWZpbmVkICYmIFJlZmxlY3QuaGFzKGdsb2JhbFRoaXMsICdEZW5vJykgPyBuZXcgV2ViU29ja2V0KHVybC50b1N0cmluZygpKSA6IG5ldyBOb2RlV2ViU29ja2V0KHVybC50b1N0cmluZygpKVxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG5cbiAgICAvLyBUT0RPOiBwcm9wZXIgZXZlbnQgaGFuZGxpbmdcbiAgICBzb2NrZXQub25lcnJvciA9IChldmVudDogTm9kZVdlYlNvY2tldC5FcnJvckV2ZW50KSA9PiBjb25zb2xlLmxvZyh7IGVycm9yOiBldmVudCwgc2hhcmRJZDogdGhpcy5pZCB9KVxuICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgKGV2ZW50OiBOb2RlV2ViU29ja2V0LkNsb3NlRXZlbnQpID0+IGF3YWl0IHRoaXMuaGFuZGxlQ2xvc2UoZXZlbnQpXG4gICAgc29ja2V0Lm9ubWVzc2FnZSA9IGFzeW5jIChtZXNzYWdlOiBOb2RlV2ViU29ja2V0Lk1lc3NhZ2VFdmVudCkgPT4gYXdhaXQgdGhpcy5oYW5kbGVNZXNzYWdlKG1lc3NhZ2UpXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIC8vIE9ubHkgc2V0IHRoZSBzaGFyZCB0byBgVW5pZGVudGlmaWVkYCBzdGF0ZSxcbiAgICAgICAgLy8gaWYgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBkb2VzIG5vdCBjb21lIGZyb20gYW4gaWRlbnRpZnkgb3IgcmVzdW1lIGFjdGlvbi5cbiAgICAgICAgaWYgKCFbU2hhcmRTdGF0ZS5JZGVudGlmeWluZywgU2hhcmRTdGF0ZS5SZXN1bWluZ10uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5VbmlkZW50aWZpZWRcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV2ZW50cy5jb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJlc29sdmUodGhpcylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqIElkZW50aWZ5IHRoZSBzaGFyZCB0byB0aGUgZ2F0ZXdheS4gSWYgbm90IGNvbm5lY3RlZCwgdGhpcyB3aWxsIGFsc28gY29ubmVjdCB0aGUgc2hhcmQgdG8gdGhlIGdhdGV3YXkuICovXG4gIGFzeW5jIGlkZW50aWZ5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEEgbmV3IGlkZW50aWZ5IGhhcyBiZWVuIHJlcXVlc3RlZCBldmVuIHRob3VnaCB0aGVyZSBpcyBhbHJlYWR5IGEgY29ubmVjdGlvbiBvcGVuLlxuICAgIC8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGNsb3NlIHRoZSBvbGQgY29ubmVjdGlvbiBhbmQgaGVhcnRiZWF0aW5nIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBvbmUuXG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDTE9TSU5HIEVYSVNUSU5HIFNIQVJEOiAjJHt0aGlzLmlkfWApXG4gICAgICB0aGlzLmNsb3NlKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZUlkZW50aWZ5aW5nLCAnUmUtaWRlbnRpZnlpbmcgY2xvc3VyZSBvZiBvbGQgY29ubmVjdGlvbi4nKVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLklkZW50aWZ5aW5nXG4gICAgdGhpcy5ldmVudHMuaWRlbnRpZnlpbmc/Lih0aGlzKVxuXG4gICAgLy8gSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgc2hhcmQgaXMgaW4gSGVhcnRiZWF0aW5nIHN0YXRlIGJ1dCBub3QgaWRlbnRpZmllZCxcbiAgICAvLyBzbyBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGFscmVhZHkgYSBnYXRld2F5IGNvbm5lY3Rpb24gZXhpc3RpbmcuXG4gICAgLy8gSWYgbm90IHdlIG5lZWQgdG8gY3JlYXRlIG9uZSBiZWZvcmUgd2UgaWRlbnRpZnkuXG4gICAgaWYgKCF0aGlzLmlzT3BlbigpKSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3QoKVxuICAgIH1cblxuICAgIHRoaXMuc2VuZChcbiAgICAgIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLklkZW50aWZ5LFxuICAgICAgICBkOiB7XG4gICAgICAgICAgdG9rZW46IGBCb3QgJHt0aGlzLmdhdGV3YXlDb25maWcudG9rZW59YCxcbiAgICAgICAgICBjb21wcmVzczogdGhpcy5nYXRld2F5Q29uZmlnLmNvbXByZXNzLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHRoaXMuZ2F0ZXdheUNvbmZpZy5wcm9wZXJ0aWVzLFxuICAgICAgICAgIGludGVudHM6IHRoaXMuZ2F0ZXdheUNvbmZpZy5pbnRlbnRzLFxuICAgICAgICAgIHNoYXJkOiBbdGhpcy5pZCwgdGhpcy5nYXRld2F5Q29uZmlnLnRvdGFsU2hhcmRzXSxcbiAgICAgICAgICBwcmVzZW5jZTogYXdhaXQgdGhpcy5tYWtlUHJlc2VuY2U/LigpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgKVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnUkVBRFknLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZXZlbnRzLmlkZW50aWZpZWQ/Lih0aGlzKVxuICAgICAgICAvLyBUZWxscyB0aGUgbWFuYWdlciB0aGF0IHRoaXMgc2hhcmQgaXMgcmVhZHlcbiAgICAgICAgdGhpcy5zaGFyZElzUmVhZHkoKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0pXG4gICAgICAvLyBXaGVuIGlkZW50aWZ5aW5nIHRvbyBmYXN0LFxuICAgICAgLy8gRGlzY29yZCBzZW5kcyBhbiBpbnZhbGlkIHNlc3Npb24gcGF5bG9hZC5cbiAgICAgIC8vIFRoaXMgY2FuIHNhZmVseSBiZSBpZ25vcmVkIHRob3VnaCBhbmQgdGhlIHNoYXJkIHN0YXJ0cyBhIG5ldyBpZGVudGlmeSBhY3Rpb24uXG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnSU5WQUxJRF9TRVNTSU9OJywgKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVBRFknKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBDaGVjayB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIHRvIERpc2NvcmQgaXMgY3VycmVudGx5IG9wZW4uICovXG4gIGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ/LnJlYWR5U3RhdGUgPT09IE5vZGVXZWJTb2NrZXQuT1BFTlxuICB9XG5cbiAgLyoqIEF0dGVtcHQgdG8gcmVzdW1lIHRoZSBwcmV2aW91cyBzaGFyZHMgc2Vzc2lvbiB3aXRoIHRoZSBnYXRld2F5LiAqL1xuICBhc3luYyByZXN1bWUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfWApXG4gICAgLy8gSXQgaGFzIGJlZW4gcmVxdWVzdGVkIHRvIHJlc3VtZSB0aGUgU2hhcmRzIHNlc3Npb24uXG4gICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBzaGFyZCBpcyBzdGlsbCBjb25uZWN0ZWQgd2l0aCBEaXNjb3JkJ3MgZ2F0ZXdheSB0aGVyZWZvcmUgd2UgbmVlZCB0byBmb3JjZWZ1bGx5IGNsb3NlIGl0LlxuICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9IGluIGlzT3BlbmApXG4gICAgICB0aGlzLmNsb3NlKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXN1bWVDbG9zaW5nT2xkQ29ubmVjdGlvbiwgJ1JlY29ubmVjdGluZyB0aGUgc2hhcmQsIGNsb3Npbmcgb2xkIGNvbm5lY3Rpb24uJylcbiAgICB9XG5cbiAgICAvLyBTaGFyZCBoYXMgbmV2ZXIgaWRlbnRpZmllZCwgc28gd2UgY2Fubm90IHJlc3VtZS5cbiAgICBpZiAoIXRoaXMuc2Vzc2lvbklkKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBUcnlpbmcgdG8gcmVzdW1lIGEgc2hhcmQgIyR7dGhpcy5pZH0gdGhhdCB3YXMgTk9UIGZpcnN0IGlkZW50aWZpZWQuIChObyBzZXNzaW9uIGlkIGZvdW5kKWApXG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmlkZW50aWZ5KClcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5SZXN1bWluZ1xuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfSwgYmVmb3JlIGNvbm5lY3RpbmdgKVxuICAgIC8vIEJlZm9yZSB3ZSBjYW4gcmVzdW1lLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIHdpdGggRGlzY29yZCdzIGdhdGV3YXkuXG4gICAgYXdhaXQgdGhpcy5jb25uZWN0KClcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgIGBbR2F0ZXdheV0gUmVzdW1pbmcgU2hhcmQgIyR7dGhpcy5pZH0sIGFmdGVyIGNvbm5lY3RpbmcuICR7dGhpcy5zZXNzaW9uSWR9IHwgJHt0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXJ9YCxcbiAgICApXG5cbiAgICB0aGlzLnNlbmQoXG4gICAgICB7XG4gICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5SZXN1bWUsXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICB0b2tlbjogYEJvdCAke3RoaXMuZ2F0ZXdheUNvbmZpZy50b2tlbn1gLFxuICAgICAgICAgIHNlc3Npb25faWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgICAgIHNlcTogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyID8/IDAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfSBhZnRlciBzZW5kIHJlc3VtZ2ApXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdSRVNVTUVEJywgKCkgPT4gcmVzb2x2ZSgpKVxuICAgICAgLy8gSWYgaXQgaXMgYXR0ZW1wdGVkIHRvIHJlc3VtZSB3aXRoIGFuIGludmFsaWQgc2Vzc2lvbiBpZCxcbiAgICAgIC8vIERpc2NvcmQgc2VuZHMgYW4gaW52YWxpZCBzZXNzaW9uIHBheWxvYWRcbiAgICAgIC8vIE5vdCBlcnJvcmluZyBoZXJlIHNpbmNlIGl0IGlzIGVhc3kgdGhhdCB0aGlzIGhhcHBlbnMsIGFsc28gaXQgd291bGQgYmUgbm90IGNhdGNoYWJsZVxuICAgICAgdGhpcy5yZXNvbHZlcy5zZXQoJ0lOVkFMSURfU0VTU0lPTicsICgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFU1VNRUQnKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBTZW5kIGEgbWVzc2FnZSB0byBEaXNjb3JkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtoaWdoUHJpb3JpdHk9ZmFsc2VdIC0gV2hldGhlciB0aGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbmQgYXNhcC5cbiAgICovXG4gIGFzeW5jIHNlbmQobWVzc2FnZTogU2hhcmRTb2NrZXRSZXF1ZXN0LCBoaWdoUHJpb3JpdHk6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEJlZm9yZSBhY3F1aXJpbmcgYSB0b2tlbiBmcm9tIHRoZSBidWNrZXQsIGNoZWNrIHdoZXRoZXIgdGhlIHNoYXJkIGlzIGN1cnJlbnRseSBvZmZsaW5lIG9yIG5vdC5cbiAgICAvLyBFbHNlIGJ1Y2tldCBhbmQgdG9rZW4gd2FpdCB0aW1lIGp1c3QgZ2V0IHdhc3RlZC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHkpXG5cbiAgICBhd2FpdCB0aGlzLmJ1Y2tldC5hY3F1aXJlKGhpZ2hQcmlvcml0eSlcblxuICAgIC8vIEl0J3MgcG9zc2libGUsIHRoYXQgdGhlIHNoYXJkIHdlbnQgb2ZmbGluZSBhZnRlciBhIHRva2VuIGhhcyBiZWVuIGFjcXVpcmVkIGZyb20gdGhlIGJ1Y2tldC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHkpXG5cbiAgICB0aGlzLnNvY2tldD8uc2VuZChKU09OLnN0cmluZ2lmeShtZXNzYWdlKSlcbiAgfVxuXG4gIC8qKiBTaHV0ZG93biB0aGUgdGhpcy4gRm9yY2VmdWxseSBkaXNjb25uZWN0IHRoZSBzaGFyZCBmcm9tIERpc2NvcmQuIFRoZSBzaGFyZCBtYXkgbm90IGF0dGVtcHQgdG8gcmVjb25uZWN0IHdpdGggRGlzY29yZC4gKi9cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuU2h1dGRvd24sICdTaGFyZCBzaHV0dGluZyBkb3duLicpXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICB9XG5cbiAgLyoqIEhhbmRsZSBhIGdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZS4gKi9cbiAgYXN5bmMgaGFuZGxlQ2xvc2UoY2xvc2U6IE5vZGVXZWJTb2NrZXQuQ2xvc2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vICAgZ2F0ZXdheS5kZWJ1ZyhcIkdXIENMT1NFRFwiLCB7IHNoYXJkSWQsIHBheWxvYWQ6IGV2ZW50IH0pO1xuXG4gICAgdGhpcy5zdG9wSGVhcnRiZWF0aW5nKClcblxuICAgIHN3aXRjaCAoY2xvc2UuY29kZSkge1xuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuVGVzdGluZ0ZpbmlzaGVkOiB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLk9mZmxpbmVcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIC8vIE9uIHRoZXNlIGNvZGVzIGEgbWFudWFsIHN0YXJ0IHdpbGwgYmUgZG9uZS5cbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlNodXRkb3duOlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVJZGVudGlmeWluZzpcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlc2hhcmRlZDpcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uOlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuWm9tYmllZENvbm5lY3Rpb246IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuRGlzY29ubmVjdGVkXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgLy8gZ2F0ZXdheS5kZWJ1ZyhcIkdXIENMT1NFRF9SRUNPTk5FQ1RcIiwgeyBzaGFyZElkLCBwYXlsb2FkOiBldmVudCB9KTtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBHYXRld2F5IGNvbm5lY3Rpb24gY2xvc2VzIHdoaWNoIHJlcXVpcmUgYSBuZXcgaWRlbnRpZnkuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuVW5rbm93bk9wY29kZTpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Ob3RBdXRoZW50aWNhdGVkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkludmFsaWRTZXE6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuUmF0ZUxpbWl0ZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuU2Vzc2lvblRpbWVkT3V0OiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIEdhdGV3YXkgY29ubmVjdGlvbiBjbG9zaW5nIHJlcXVpcmluZyByZS1pZGVudGlmeS4gQ29kZTogJHtjbG9zZS5jb2RlfWApXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLklkZW50aWZ5aW5nXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuICAgICAgfVxuICAgICAgLy8gV2hlbiB0aGVzZSBjb2RlcyBhcmUgcmVjZWl2ZWQgc29tZXRoaW5nIHdlbnQgcmVhbGx5IHdyb25nLlxuICAgICAgLy8gT24gdGhvc2Ugd2UgY2Fubm90IHN0YXJ0IGEgcmVjb25uZWN0IGF0dGVtcHQuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuQXV0aGVudGljYXRpb25GYWlsZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZFNoYXJkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlNoYXJkaW5nUmVxdWlyZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZEFwaVZlcnNpb246XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZEludGVudHM6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuRGlzYWxsb3dlZEludGVudHM6IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihjbG9zZS5yZWFzb24gfHwgJ0Rpc2NvcmQgZ2F2ZSBubyByZWFzb24hIEdHISBZb3UgYnJva2UgRGlzY29yZCEnKVxuICAgICAgfVxuICAgICAgLy8gR2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlcyBvbiB3aGljaCBhIHJlc3VtZSBpcyBhbGxvd2VkLlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlVua25vd25FcnJvcjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5EZWNvZGVFcnJvcjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5BbHJlYWR5QXV0aGVudGljYXRlZDpcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgW1NoYXJkXSBjbG9zZWQgc2hhcmQgIyR7dGhpcy5pZH0uIFJlc3VtaW5nLi4uYClcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuUmVzdW1pbmdcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXN1bWUoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBIYW5kbGVzIGEgaW5jb21pbmcgZ2F0ZXdheSBwYWNrZXQuICovXG4gIGFzeW5jIGhhbmRsZURpc2NvcmRQYWNrZXQocGFja2V0OiBEaXNjb3JkR2F0ZXdheVBheWxvYWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBFZGdlIGNhc2Ugc3RhcnQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9kaXNjb3JkZW5vL2Rpc2NvcmRlbm8vaXNzdWVzLzIzMTFcbiAgICB0aGlzLmhlYXJ0Lmxhc3RBY2sgPSBEYXRlLm5vdygpXG4gICAgdGhpcy5oZWFydC5hY2tub3dsZWRnZWQgPSB0cnVlXG4gICAgLy8gRWRnZSBjYXNlIGVuZCFcblxuICAgIHN3aXRjaCAocGFja2V0Lm9wKSB7XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdDoge1xuICAgICAgICAvLyBUT0RPOiBjYW4gdGhpcyBhY3R1YWxseSBoYXBwZW5cbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlbigpKSByZXR1cm5cblxuICAgICAgICB0aGlzLmhlYXJ0Lmxhc3RCZWF0ID0gRGF0ZS5ub3coKVxuICAgICAgICAvLyBEaXNjb3JkIHJhbmRvbWx5IHNlbmRzIHRoaXMgcmVxdWlyaW5nIGFuIGltbWVkaWF0ZSBoZWFydGJlYXQgYmFjay5cbiAgICAgICAgLy8gVXNpbmcgYSBkaXJlY3Qgc29ja2V0LnNlbmQgY2FsbCBoZXJlIGJlY2F1c2UgaGVhcnRiZWF0IHJlcXVlc3RzIGFyZSByZXNlcnZlZCBieSB1cy5cbiAgICAgICAgdGhpcy5zb2NrZXQ/LnNlbmQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdCxcbiAgICAgICAgICAgIGQ6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICB0aGlzLmV2ZW50cy5oZWFydGJlYXQ/Lih0aGlzKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkhlbGxvOiB7XG4gICAgICAgIGNvbnN0IGludGVydmFsID0gKHBhY2tldC5kIGFzIERpc2NvcmRIZWxsbykuaGVhcnRiZWF0X2ludGVydmFsXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gSGVsbG8gb24gU2hhcmQgIyR7dGhpcy5pZH1gKVxuICAgICAgICB0aGlzLnN0YXJ0SGVhcnRiZWF0aW5nKGludGVydmFsKVxuXG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBTaGFyZFN0YXRlLlJlc3VtaW5nKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFF1ZXVlID0gWy4uLnRoaXMuYnVja2V0LnF1ZXVlXVxuICAgICAgICAgIC8vIEhFTExPIGhhcyBiZWVuIHNlbmQgb24gYSBub24gcmVzdW1lIGFjdGlvbi5cbiAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIHNoYXJkIHN0YXJ0cyBhIG5ldyBzZXNzaW9uLFxuICAgICAgICAgIC8vIHRoZXJlZm9yZSB0aGUgcmF0ZSBsaW1pdCBpbnRlcnZhbCBoYXMgYmVlbiByZXNldCB0b28uXG4gICAgICAgICAgdGhpcy5idWNrZXQgPSBuZXcgTGVha3lCdWNrZXQoe1xuICAgICAgICAgICAgbWF4OiB0aGlzLmNhbGN1bGF0ZVNhZmVSZXF1ZXN0cygpLFxuICAgICAgICAgICAgcmVmaWxsSW50ZXJ2YWw6IDYwMDAwLFxuICAgICAgICAgICAgcmVmaWxsQW1vdW50OiB0aGlzLmNhbGN1bGF0ZVNhZmVSZXF1ZXN0cygpLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICAvLyBRdWV1ZSBzaG91bGQgbm90IGJlIGxvc3Qgb24gYSByZS1pZGVudGlmeS5cbiAgICAgICAgICB0aGlzLmJ1Y2tldC5xdWV1ZS51bnNoaWZ0KC4uLmN1cnJlbnRRdWV1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlbGxvPy4odGhpcylcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXRBQ0s6IHtcbiAgICAgICAgLy8gTWFudWFsbHkgY2FsY3VsYXRpbmcgdGhlIHJvdW5kIHRyaXAgdGltZSBmb3IgdXNlcnMgd2hvIG5lZWQgaXQuXG4gICAgICAgIGlmICh0aGlzLmhlYXJ0Lmxhc3RCZWF0KSB7XG4gICAgICAgICAgdGhpcy5oZWFydC5ydHQgPSB0aGlzLmhlYXJ0Lmxhc3RBY2sgLSB0aGlzLmhlYXJ0Lmxhc3RCZWF0XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV2ZW50cy5oZWFydGJlYXRBY2s/Lih0aGlzKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLlJlY29ubmVjdDoge1xuICAgICAgICAvLyAgIGdhdGV3YXkuZGVidWcoXCJHVyBSRUNPTk5FQ1RcIiwgeyBzaGFyZElkIH0pO1xuXG4gICAgICAgIHRoaXMuZXZlbnRzLnJlcXVlc3RlZFJlY29ubmVjdD8uKHRoaXMpXG5cbiAgICAgICAgYXdhaXQgdGhpcy5yZXN1bWUoKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkludmFsaWRTZXNzaW9uOiB7XG4gICAgICAgIGNvbnN0IHJlc3VtYWJsZSA9IHBhY2tldC5kIGFzIGJvb2xlYW5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gUmVjZWl2ZWQgSW52YWxpZCBTZXNzaW9uIGZvciBTaGFyZCAjJHt0aGlzLmlkfSB3aXRoIHJlc3VtZWFibGUgYXMgJHtyZXN1bWFibGUudG9TdHJpbmcoKX1gKVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmludmFsaWRTZXNzaW9uPy4odGhpcywgcmVzdW1hYmxlKVxuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgYSByYW5kb20gYW1vdW50IG9mIHRpbWUgYmV0d2VlbiAxIGFuZCA1XG4gICAgICAgIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjcmVzdW1pbmdcbiAgICAgICAgYXdhaXQgZGVsYXkoTWF0aC5mbG9vcigoTWF0aC5yYW5kb20oKSAqIDQgKyAxKSAqIDEwMDApKVxuXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZ2V0KCdJTlZBTElEX1NFU1NJT04nKT8uKHBhY2tldClcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ0lOVkFMSURfU0VTU0lPTicpXG5cbiAgICAgICAgLy8gV2hlbiByZXN1bWFibGUgaXMgZmFsc2Ugd2UgbmVlZCB0byByZS1pZGVudGlmeVxuICAgICAgICBpZiAoIXJlc3VtYWJsZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdElkZW50aWZ5KClcblxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgc2Vzc2lvbiBpcyBpbnZhbGlkIGJ1dCBhcHBhcmVudGx5IGl0IGlzIHJlc3VtYWJsZVxuICAgICAgICBhd2FpdCB0aGlzLnJlc3VtZSgpXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKHBhY2tldC50KSB7XG4gICAgICBjYXNlICdSRVNVTUVEJzpcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuQ29ubmVjdGVkXG4gICAgICAgIHRoaXMuZXZlbnRzLnJlc3VtZWQ/Lih0aGlzKVxuXG4gICAgICAgIC8vIENvbnRpbnVlIHRoZSByZXF1ZXN0cyB3aGljaCBoYXZlIGJlZW4gcXVldWVkIHNpbmNlIHRoZSBzaGFyZCB3ZW50IG9mZmxpbmUuXG4gICAgICAgIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5tYXAoKHJlc29sdmUpID0+IHJlc29sdmUoKSlcblxuICAgICAgICB0aGlzLnJlc29sdmVzLmdldCgnUkVTVU1FRCcpPy4ocGFja2V0KVxuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVTVU1FRCcpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdSRUFEWSc6IHtcbiAgICAgICAgLy8gSW1wb3J0YW50IGZvciBmdXR1cmUgcmVzdW1lcy5cbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHBhY2tldC5kIGFzIERpc2NvcmRSZWFkeVxuXG4gICAgICAgIHRoaXMucmVzdW1lR2F0ZXdheVVybCA9IHBheWxvYWQucmVzdW1lX2dhdGV3YXlfdXJsXG5cbiAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBwYXlsb2FkLnNlc3Npb25faWRcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuQ29ubmVjdGVkXG5cbiAgICAgICAgLy8gQ29udGludWUgdGhlIHJlcXVlc3RzIHdoaWNoIGhhdmUgYmVlbiBxdWV1ZWQgc2luY2UgdGhlIHNoYXJkIHdlbnQgb2ZmbGluZS5cbiAgICAgICAgLy8gSW1wb3J0YW50IHdoZW4gdGhpcyBpcyBhIHJlLWlkZW50aWZ5XG4gICAgICAgIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5tYXAoKHJlc29sdmUpID0+IHJlc29sdmUoKSlcblxuICAgICAgICB0aGlzLnJlc29sdmVzLmdldCgnUkVBRFknKT8uKHBhY2tldClcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFQURZJylcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIHNlcXVlbmNlIG51bWJlciBpZiBpdCBpcyBwcmVzZW50XG4gICAgLy8gYHNgIGNhbiBiZSBlaXRoZXIgYG51bGxgIG9yIGEgYG51bWJlcmAuXG4gICAgLy8gSW4gb3JkZXIgdG8gcHJldmVudCB1cGRhdGUgbWlzc2VzIHdoZW4gYHNgIGlzIGAwYCB3ZSBjaGVjayBhZ2FpbnN0IG51bGwuXG4gICAgaWYgKHBhY2tldC5zICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIgPSBwYWNrZXQuc1xuICAgIH1cblxuICAgIHRoaXMuZm9yd2FyZFRvQm90KHBhY2tldClcbiAgfVxuXG4gIGZvcndhcmRUb0JvdChwYWNrZXQ6IERpc2NvcmRHYXRld2F5UGF5bG9hZCk6IHZvaWQge1xuICAgIC8vIFRoZSBuZWNlc3NhcnkgaGFuZGxpbmcgcmVxdWlyZWQgZm9yIHRoZSBTaGFyZHMgY29ubmVjdGlvbiBoYXMgYmVlbiBmaW5pc2hlZC5cbiAgICAvLyBOb3cgdGhlIGV2ZW50IGNhbiBiZSBzYWZlbHkgZm9yd2FyZGVkLlxuICAgIHRoaXMuZXZlbnRzLm1lc3NhZ2U/Lih0aGlzLCBjYW1lbGl6ZShwYWNrZXQpKVxuICB9XG5cbiAgLyoqIEhhbmRsZSBhbiBpbmNvbWluZyBnYXRld2F5IG1lc3NhZ2UuICovXG4gIGFzeW5jIGhhbmRsZU1lc3NhZ2UobWVzc2FnZTogTm9kZVdlYlNvY2tldC5NZXNzYWdlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgcHJlUHJvY2Vzc01lc3NhZ2UgPSBtZXNzYWdlLmRhdGFcblxuICAgIC8vIElmIG1lc3NhZ2UgY29tcHJlc3Npb24gaXMgZW5hYmxlZCxcbiAgICAvLyBEaXNjb3JkIG1pZ2h0IHNlbmQgemxpYiBjb21wcmVzc2VkIHBheWxvYWRzLlxuICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MgJiYgcHJlUHJvY2Vzc01lc3NhZ2UgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICBwcmVQcm9jZXNzTWVzc2FnZSA9IGluZmxhdGVTeW5jKGF3YWl0IHByZVByb2Nlc3NNZXNzYWdlLmFycmF5QnVmZmVyKCkpLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICAvLyBTYWZlZ3VhcmQgaW5jYXNlIGRlY29tcHJlc3Npb24gZmFpbGVkIHRvIG1ha2UgYSBzdHJpbmcuXG4gICAgaWYgKHR5cGVvZiBwcmVQcm9jZXNzTWVzc2FnZSAhPT0gJ3N0cmluZycpIHJldHVyblxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlRGlzY29yZFBhY2tldChKU09OLnBhcnNlKHByZVByb2Nlc3NNZXNzYWdlKSBhcyBEaXNjb3JkR2F0ZXdheVBheWxvYWQpXG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgaW4gb3JkZXIgdG8gbWFrZSB0aGUgc2hhcmRzIHByZXNlbmNlLlxuICAgKiBhc3luYyBpbiBjYXNlIGRldnMgY3JlYXRlIHRoZSBwcmVzZW5jZSBiYXNlZCBvbiBlZy4gZGF0YWJhc2UgdmFsdWVzLlxuICAgKiBQYXNzaW5nIHRoZSBzaGFyZCdzIGlkIHRoZXJlIHRvIG1ha2UgaXQgZWFzaWVyIGZvciB0aGUgZGV2IHRvIHVzZSB0aGlzIGZ1bmN0aW9uLlxuICAgKi9cbiAgYXN5bmMgbWFrZVByZXNlbmNlKCk6IFByb21pc2U8Qm90U3RhdHVzVXBkYXRlIHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtcmV0dXJuXG4gICAgcmV0dXJuXG4gIH1cblxuICAvKiogVGhpcyBmdW5jdGlvbiBjb21tdW5pY2F0ZXMgd2l0aCB0aGUgbWFuYWdlbWVudCBwcm9jZXNzLCBpbiBvcmRlciB0byBrbm93IHdoZXRoZXIgaXRzIGZyZWUgdG8gaWRlbnRpZnkuIFdoZW4gdGhpcyBmdW5jdGlvbiByZXNvbHZlcywgdGhpcyBtZWFucyB0aGF0IHRoZSBzaGFyZCBpcyBhbGxvd2VkIHRvIHNlbmQgYW4gaWRlbnRpZnkgcGF5bG9hZCB0byBkaXNjb3JkLiAqL1xuICBhc3luYyByZXF1ZXN0SWRlbnRpZnkoKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBUaGlzIGZ1bmN0aW9uIGNvbW11bmljYXRlcyB3aXRoIHRoZSBtYW5hZ2VtZW50IHByb2Nlc3MsIGluIG9yZGVyIHRvIHRlbGwgaXQgY2FuIGlkZW50aWZ5IHRoZSBuZXh0IHNoYXJkLiAqL1xuICBhc3luYyBzaGFyZElzUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBTdGFydCBzZW5kaW5nIGhlYXJ0YmVhdCBwYXlsb2FkcyB0byBEaXNjb3JkIGluIHRoZSBwcm92aWRlZCBpbnRlcnZhbC4gKi9cbiAgc3RhcnRIZWFydGJlYXRpbmcoaW50ZXJ2YWw6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gU3RhcnQgSGVhcnRiZWF0aW5nIFNoYXJkICMke3RoaXMuaWR9YClcbiAgICAvLyBJZiBvbGQgaGVhcnRiZWFzdCBleGlzdCBsaWtlIGFmdGVyIHJlc3VtZSwgY2xlYXIgdGhlIG9sZCBvbmVzLlxuICAgIGlmICh0aGlzLmhlYXJ0LmludGVydmFsSWQpIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydC5pbnRlcnZhbElkKVxuICAgIGlmICh0aGlzLmhlYXJ0LnRpbWVvdXRJZCkgY2xlYXJUaW1lb3V0KHRoaXMuaGVhcnQudGltZW91dElkKVxuXG4gICAgdGhpcy5oZWFydC5pbnRlcnZhbCA9IGludGVydmFsXG5cbiAgICAvLyBPbmx5IHNldCB0aGUgc2hhcmQncyBzdGF0ZSB0byBgVW5pZGVudGlmaWVkYFxuICAgIC8vIGlmIGhlYXJ0YmVhdGluZyBoYXMgbm90IGJlZW4gc3RhcnRlZCBkdWUgdG8gYW4gaWRlbnRpZnkgb3IgcmVzdW1lIGFjdGlvbi5cbiAgICBpZiAoW1NoYXJkU3RhdGUuRGlzY29ubmVjdGVkLCBTaGFyZFN0YXRlLk9mZmxpbmVdLmluY2x1ZGVzKHRoaXMuc3RhdGUpKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBhYClcbiAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlVuaWRlbnRpZmllZFxuICAgIH1cblxuICAgIC8vIFRoZSBmaXJzdCBoZWFydGJlYXQgbmVlZHMgdG8gYmUgc2VuZCB3aXRoIGEgcmFuZG9tIGRlbGF5IGJldHdlZW4gYDBgIGFuZCBgaW50ZXJ2YWxgXG4gICAgLy8gVXNpbmcgYSBgc2V0VGltZW91dChfLCBqaXR0ZXIpYCBoZXJlIHRvIGFjY29tcGxpc2ggdGhhdC5cbiAgICAvLyBgTWF0aC5yYW5kb20oKWAgY2FuIGJlIGAwYCBzbyB3ZSB1c2UgYDAuNWAgaWYgdGhpcyBoYXBwZW5zXG4gICAgLy8gUmVmZXJlbmNlOiBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSNoZWFydGJlYXRpbmdcbiAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLmNlaWwodGhpcy5oZWFydC5pbnRlcnZhbCAqIChNYXRoLnJhbmRvbSgpIHx8IDAuNSkpXG4gICAgdGhpcy5oZWFydC50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gU3RhcnQgSGVhcnRiZWF0aW5nIFNoYXJkICMke3RoaXMuaWR9IGJgKVxuICAgICAgaWYgKCF0aGlzLmlzT3BlbigpKSByZXR1cm5cbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gU3RhcnQgSGVhcnRiZWF0aW5nIFNoYXJkICMke3RoaXMuaWR9IGMgJHt0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIhfWApXG5cbiAgICAgIC8vIFVzaW5nIGEgZGlyZWN0IHNvY2tldC5zZW5kIGNhbGwgaGVyZSBiZWNhdXNlIGhlYXJ0YmVhdCByZXF1ZXN0cyBhcmUgcmVzZXJ2ZWQgYnkgdXMuXG4gICAgICB0aGlzLnNvY2tldD8uc2VuZChcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQsXG4gICAgICAgICAgZDogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyLFxuICAgICAgICB9KSxcbiAgICAgIClcblxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH0gZGApXG4gICAgICB0aGlzLmhlYXJ0Lmxhc3RCZWF0ID0gRGF0ZS5ub3coKVxuICAgICAgdGhpcy5oZWFydC5hY2tub3dsZWRnZWQgPSBmYWxzZVxuXG4gICAgICAvLyBBZnRlciB0aGUgcmFuZG9tIGhlYXJ0YmVhdCBqaXR0ZXIgd2UgY2FuIHN0YXJ0IGEgbm9ybWFsIGludGVydmFsLlxuICAgICAgdGhpcy5oZWFydC5pbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBlYClcbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlbigpKSByZXR1cm5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH0gZmApXG4gICAgICAgIC8vIGdhdGV3YXkuZGVidWcoXCJHVyBERUJVR1wiLCBgUnVubmluZyBzZXRJbnRlcnZhbCBpbiBoZWFydGJlYXQgZmlsZS4gU2hhcmQ6ICR7c2hhcmRJZH1gKTtcblxuICAgICAgICAvLyBnYXRld2F5LmRlYnVnKFwiR1cgSEVBUlRCRUFUSU5HXCIsIHsgc2hhcmRJZCwgc2hhcmQ6IGN1cnJlbnRTaGFyZCB9KTtcblxuICAgICAgICAvLyBUaGUgU2hhcmQgZGlkIG5vdCByZWNlaXZlIGEgaGVhcnRiZWF0IEFDSyBmcm9tIERpc2NvcmQgaW4gdGltZSxcbiAgICAgICAgLy8gdGhlcmVmb3JlIHdlIGhhdmUgdG8gYXNzdW1lIHRoYXQgdGhlIGNvbm5lY3Rpb24gaGFzIGZhaWxlZCBvciBnb3QgXCJ6b21iaWVkXCIuXG4gICAgICAgIC8vIFRoZSBTaGFyZCBuZWVkcyB0byBzdGFydCBhIHJlLWlkZW50aWZ5IGFjdGlvbiBhY2NvcmRpbmdseS5cbiAgICAgICAgLy8gUmVmZXJlbmNlOiBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSNoZWFydGJlYXRpbmctZXhhbXBsZS1nYXRld2F5LWhlYXJ0YmVhdC1hY2tcbiAgICAgICAgaWYgKCF0aGlzLmhlYXJ0LmFja25vd2xlZGdlZCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIEhlYXJ0YmVhdCBub3QgYWNrbm93bGVkZ2VkIGZvciBzaGFyZCAjJHt0aGlzLmlkfS5gKVxuICAgICAgICAgIHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlpvbWJpZWRDb25uZWN0aW9uLCAnWm9tYmllZCBjb25uZWN0aW9uLCBkaWQgbm90IHJlY2VpdmUgYW4gaGVhcnRiZWF0IEFDSyBpbiB0aW1lLicpXG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5pZGVudGlmeSgpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhlYXJ0LmFja25vd2xlZGdlZCA9IGZhbHNlXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH0gZ2ApXG4gICAgICAgIC8vIFVzaW5nIGEgZGlyZWN0IHNvY2tldC5zZW5kIGNhbGwgaGVyZSBiZWNhdXNlIGhlYXJ0YmVhdCByZXF1ZXN0cyBhcmUgcmVzZXJ2ZWQgYnkgdXMuXG4gICAgICAgIHRoaXMuc29ja2V0Py5zZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQsXG4gICAgICAgICAgICBkOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH0gaGApXG5cbiAgICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KClcblxuICAgICAgICB0aGlzLmV2ZW50cy5oZWFydGJlYXQ/Lih0aGlzKVxuICAgICAgfSwgdGhpcy5oZWFydC5pbnRlcnZhbClcbiAgICB9LCBqaXR0ZXIpXG4gIH1cblxuICAvKiogU3RvcCB0aGUgaGVhcnRiZWF0aW5nIHByb2Nlc3Mgd2l0aCBkaXNjb3JkLiAqL1xuICBzdG9wSGVhcnRiZWF0aW5nKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIHRoZSByZWd1bGFyIGhlYXJ0YmVhdCBpbnRlcnZhbC5cbiAgICBjbGVhckludGVydmFsKHRoaXMuaGVhcnQuaW50ZXJ2YWxJZClcbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIFNoYXJkIGdvdCBjbG9zZWQgYmVmb3JlIHRoZSBmaXJzdCBqaXR0ZXJlZCBoZWFydGJlYXQuXG4gICAgLy8gVG8gZ28gc2FmZSB3ZSBzaG91bGQgY2xlYXIgdGhlIHJlbGF0ZWQgdGltZW91dCB0b28uXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuaGVhcnQudGltZW91dElkKVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmRDcmVhdGVPcHRpb25zIHtcbiAgLyoqIFRoZSBzaGFyZCBpZCAqL1xuICBpZDogbnVtYmVyXG4gIC8qKiBUaGUgY29ubmVjdGlvbiBkZXRhaWxzICovXG4gIGNvbm5lY3Rpb246IFNoYXJkR2F0ZXdheUNvbmZpZ1xuICAvKiogVGhlIGV2ZW50IGhhbmRsZXJzIGZvciBldmVudHMgb24gdGhlIHNoYXJkLiAqL1xuICBldmVudHM6IFNoYXJkRXZlbnRzXG4gIC8qKiBUaGUgbG9nZ2VyIGZvciB0aGUgc2hhcmQgKi9cbiAgbG9nZ2VyPzogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+XG4gIC8qKiBUaGUgaGFuZGxlciB0byByZXF1ZXN0IGEgc3BhY2UgdG8gbWFrZSBhbiBpZGVudGlmeSByZXF1ZXN0LiAqL1xuICByZXF1ZXN0SWRlbnRpZnk/OiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBUaGUgaGFuZGxlciB0byBhbGVydCB0aGUgZ2F0ZXdheSBtYW5hZ2VyIHRoYXQgdGhpcyBzaGFyZCBoYXMgcmVjZWl2ZWQgYSBSRUFEWSBldmVudC4gKi9cbiAgc2hhcmRJc1JlYWR5PzogKCkgPT4gUHJvbWlzZTx2b2lkPlxufVxuXG5leHBvcnQgZGVmYXVsdCBEaXNjb3JkZW5vU2hhcmRcbiJdLCJuYW1lcyI6WyJEaXNjb3JkZW5vU2hhcmQiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJtYXhSZXF1ZXN0c1BlclJhdGVMaW1pdFRpY2siLCJwcmV2aW91c1NlcXVlbmNlTnVtYmVyIiwicmF0ZUxpbWl0UmVzZXRJbnRlcnZhbCIsInN0YXRlIiwiU2hhcmRTdGF0ZSIsIk9mZmxpbmUiLCJyZXN1bWVHYXRld2F5VXJsIiwiZXZlbnRzIiwib2ZmbGluZVNlbmRRdWV1ZSIsInJlc29sdmVzIiwiTWFwIiwiaWQiLCJjb25uZWN0aW9uIiwibG9nZ2VyIiwiaGVhcnQiLCJhY2tub3dsZWRnZWQiLCJpbnRlcnZhbCIsInJlcXVlc3RJZGVudGlmeSIsInNoYXJkSXNSZWFkeSIsImJ1Y2tldCIsIkxlYWt5QnVja2V0IiwibWF4IiwiY2FsY3VsYXRlU2FmZVJlcXVlc3RzIiwicmVmaWxsQW1vdW50IiwicmVmaWxsSW50ZXJ2YWwiLCJnYXRld2F5Q29uZmlnIiwiY29ubmVjdGlvblVybCIsInVybCIsInNhZmVSZXF1ZXN0cyIsIk1hdGgiLCJjZWlsIiwiY2hlY2tPZmZsaW5lIiwiaGlnaFByaW9yaXR5IiwiaXNPcGVuIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ1bnNoaWZ0IiwicHVzaCIsImNsb3NlIiwiY29kZSIsInJlYXNvbiIsInNvY2tldCIsInJlYWR5U3RhdGUiLCJOb2RlV2ViU29ja2V0IiwiT1BFTiIsImNvbm5lY3QiLCJJZGVudGlmeWluZyIsIlJlc3VtaW5nIiwiaW5jbHVkZXMiLCJDb25uZWN0aW5nIiwiY29ubmVjdGluZyIsIlVSTCIsInNlYXJjaFBhcmFtcyIsInNldCIsInZlcnNpb24iLCJ0b1N0cmluZyIsImdsb2JhbFRoaXMiLCJEZW5vIiwidW5kZWZpbmVkIiwiUmVmbGVjdCIsImhhcyIsIldlYlNvY2tldCIsIm9uZXJyb3IiLCJldmVudCIsImNvbnNvbGUiLCJsb2ciLCJlcnJvciIsInNoYXJkSWQiLCJvbmNsb3NlIiwiaGFuZGxlQ2xvc2UiLCJvbm1lc3NhZ2UiLCJtZXNzYWdlIiwiaGFuZGxlTWVzc2FnZSIsIm9ub3BlbiIsIlVuaWRlbnRpZmllZCIsImNvbm5lY3RlZCIsImlkZW50aWZ5IiwiZGVidWciLCJTaGFyZFNvY2tldENsb3NlQ29kZXMiLCJSZUlkZW50aWZ5aW5nIiwiaWRlbnRpZnlpbmciLCJzZW5kIiwib3AiLCJHYXRld2F5T3Bjb2RlcyIsIklkZW50aWZ5IiwiZCIsInRva2VuIiwiY29tcHJlc3MiLCJwcm9wZXJ0aWVzIiwiaW50ZW50cyIsInNoYXJkIiwidG90YWxTaGFyZHMiLCJwcmVzZW5jZSIsIm1ha2VQcmVzZW5jZSIsImlkZW50aWZpZWQiLCJkZWxldGUiLCJyZXN1bWUiLCJSZXN1bWVDbG9zaW5nT2xkQ29ubmVjdGlvbiIsInNlc3Npb25JZCIsIlJlc3VtZSIsInNlc3Npb25faWQiLCJzZXEiLCJhY3F1aXJlIiwiSlNPTiIsInN0cmluZ2lmeSIsInNodXRkb3duIiwiU2h1dGRvd24iLCJzdG9wSGVhcnRiZWF0aW5nIiwiVGVzdGluZ0ZpbmlzaGVkIiwiZGlzY29ubmVjdGVkIiwiUmVzaGFyZGVkIiwiWm9tYmllZENvbm5lY3Rpb24iLCJEaXNjb25uZWN0ZWQiLCJHYXRld2F5Q2xvc2VFdmVudENvZGVzIiwiVW5rbm93bk9wY29kZSIsIk5vdEF1dGhlbnRpY2F0ZWQiLCJJbnZhbGlkU2VxIiwiUmF0ZUxpbWl0ZWQiLCJTZXNzaW9uVGltZWRPdXQiLCJBdXRoZW50aWNhdGlvbkZhaWxlZCIsIkludmFsaWRTaGFyZCIsIlNoYXJkaW5nUmVxdWlyZWQiLCJJbnZhbGlkQXBpVmVyc2lvbiIsIkludmFsaWRJbnRlbnRzIiwiRGlzYWxsb3dlZEludGVudHMiLCJFcnJvciIsIlVua25vd25FcnJvciIsIkRlY29kZUVycm9yIiwiQWxyZWFkeUF1dGhlbnRpY2F0ZWQiLCJpbmZvIiwiaGFuZGxlRGlzY29yZFBhY2tldCIsInBhY2tldCIsImxhc3RBY2siLCJEYXRlIiwibm93IiwiSGVhcnRiZWF0IiwibGFzdEJlYXQiLCJoZWFydGJlYXQiLCJIZWxsbyIsImhlYXJ0YmVhdF9pbnRlcnZhbCIsInN0YXJ0SGVhcnRiZWF0aW5nIiwiY3VycmVudFF1ZXVlIiwicXVldWUiLCJoZWxsbyIsIkhlYXJ0YmVhdEFDSyIsInJ0dCIsImhlYXJ0YmVhdEFjayIsIlJlY29ubmVjdCIsInJlcXVlc3RlZFJlY29ubmVjdCIsIkludmFsaWRTZXNzaW9uIiwicmVzdW1hYmxlIiwiaW52YWxpZFNlc3Npb24iLCJkZWxheSIsImZsb29yIiwicmFuZG9tIiwiZ2V0IiwidCIsIkNvbm5lY3RlZCIsInJlc3VtZWQiLCJtYXAiLCJwYXlsb2FkIiwicmVzdW1lX2dhdGV3YXlfdXJsIiwicyIsImZvcndhcmRUb0JvdCIsImNhbWVsaXplIiwicHJlUHJvY2Vzc01lc3NhZ2UiLCJkYXRhIiwiQmxvYiIsImluZmxhdGVTeW5jIiwiYXJyYXlCdWZmZXIiLCJwYXJzZSIsImludGVydmFsSWQiLCJjbGVhckludGVydmFsIiwidGltZW91dElkIiwiY2xlYXJUaW1lb3V0Iiwiaml0dGVyIiwic2V0VGltZW91dCIsInNldEludGVydmFsIl0sIm1hcHBpbmdzIjoiQUFBQSxrRUFBa0U7Ozs7Ozs7Ozs7O0lBV3JEQSxlQUFlO2VBQWZBOztJQW9sQmIsT0FBOEI7ZUFBOUI7Ozt1QkE3bEJ1RDt1QkFDRjswQkFDekI7MkRBQ0Y7d0JBRXdCOzs7Ozs7QUFJM0MsSUFBQSxBQUFNQSxrQkFBTixNQUFNQTtJQWdDWEMsWUFBWUMsT0FBMkIsQ0FBRTtRQXpCekMsMEhBQTBILFFBQzFIQyw4QkFBc0M7UUFDdEMsMENBQTBDLFFBQzFDQyx5QkFBd0M7UUFDeEMsNEVBQTRFLFFBQzVFQyx5QkFBaUM7UUFLakMsd0NBQXdDLFFBQ3hDQyxRQUFRQyxrQkFBVSxDQUFDQyxPQUFPO1FBQzFCLGlGQUFpRixRQUNqRkMsbUJBQTJCO1FBQzNCLHNDQUFzQyxRQUN0Q0MsU0FBc0IsQ0FBQztRQUN2QixtR0FBbUcsUUFDbkdDLG1CQUFpRCxFQUFFO1FBQ25ELGlGQUFpRixRQUNqRkMsV0FBVyxJQUFJQztRQU9iLElBQUksQ0FBQ0MsRUFBRSxHQUFHWixRQUFRWSxFQUFFO1FBQ3BCLElBQUksQ0FBQ0MsVUFBVSxHQUFHYixRQUFRYSxVQUFVO1FBQ3BDLElBQUksQ0FBQ0wsTUFBTSxHQUFHUixRQUFRUSxNQUFNO1FBQzVCLElBQUksQ0FBQ00sTUFBTSxHQUFHZCxRQUFRYyxNQUFNLElBQUlBLGFBQU07UUFFdEMsSUFBSSxDQUFDQyxLQUFLLEdBQUc7WUFDWEMsY0FBYztZQUNkQyxVQUFVO1FBQ1o7UUFFQSxJQUFJakIsUUFBUWtCLGVBQWUsRUFBRSxJQUFJLENBQUNBLGVBQWUsR0FBR2xCLFFBQVFrQixlQUFlO1FBQzNFLElBQUlsQixRQUFRbUIsWUFBWSxFQUFFLElBQUksQ0FBQ0EsWUFBWSxHQUFHbkIsUUFBUW1CLFlBQVk7UUFFbEUsSUFBSSxDQUFDQyxNQUFNLEdBQUcsSUFBSUMsa0JBQVcsQ0FBQztZQUM1QkMsS0FBSyxJQUFJLENBQUNDLHFCQUFxQjtZQUMvQkMsY0FBYyxJQUFJLENBQUNELHFCQUFxQjtZQUN4Q0UsZ0JBQWdCO1lBQ2hCWCxRQUFRLElBQUksQ0FBQ0EsTUFBTTtRQUNyQjtJQUNGO0lBRUEsbUVBQW1FLEdBQ25FLElBQUlZLGdCQUFvQztRQUN0QyxPQUFPLElBQUksQ0FBQ2IsVUFBVTtJQUN4QjtJQUVBLDJJQUEySSxHQUMzSSxJQUFJYyxnQkFBd0I7UUFDMUIsK0NBQStDO1FBQy9DLE9BQU8sSUFBSSxDQUFDcEIsZ0JBQWdCLElBQUksSUFBSSxDQUFDbUIsYUFBYSxDQUFDRSxHQUFHO0lBQ3hEO0lBRUEsMkpBQTJKLEdBQzNKTCx3QkFBZ0M7UUFDOUIsb0ZBQW9GO1FBQ3BGLE1BQU1NLGVBQWUsSUFBSSxDQUFDNUIsMkJBQTJCLEdBQUc2QixLQUFLQyxJQUFJLENBQUMsSUFBSSxDQUFDNUIsc0JBQXNCLEdBQUcsSUFBSSxDQUFDWSxLQUFLLENBQUNFLFFBQVEsSUFBSTtRQUV2SCxPQUFPWSxlQUFlLElBQUksSUFBSUE7SUFDaEM7SUFFQSxNQUFNRyxhQUFhQyxZQUFxQixFQUFpQjtRQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDQyxNQUFNLElBQUk7WUFDbEIsTUFBTSxJQUFJQyxRQUFRLENBQUNDO2dCQUNqQixvRUFBb0U7Z0JBQ3BFLElBQUlILGNBQWMsSUFBSSxDQUFDeEIsZ0JBQWdCLENBQUM0QixPQUFPLENBQUNEO3FCQUMzQyxJQUFJLENBQUMzQixnQkFBZ0IsQ0FBQzZCLElBQUksQ0FBQ0Y7WUFDbEM7UUFDRjtJQUNGO0lBRUEsdURBQXVELEdBQ3ZERyxNQUFNQyxJQUFZLEVBQUVDLE1BQWMsRUFBUTtRQUN4QyxJQUFJLElBQUksQ0FBQ0MsTUFBTSxFQUFFQyxlQUFlQyxXQUFhLENBQUNDLElBQUksRUFBRTtRQUVwRCxJQUFJLENBQUNILE1BQU0sRUFBRUgsTUFBTUMsTUFBTUM7SUFDM0I7SUFFQSxnSEFBZ0gsR0FDaEgsTUFBTUssVUFBb0M7UUFDeEMsNENBQTRDO1FBQzVDLDZFQUE2RTtRQUM3RSxJQUFJLENBQUM7WUFBQ3pDLGtCQUFVLENBQUMwQyxXQUFXO1lBQUUxQyxrQkFBVSxDQUFDMkMsUUFBUTtTQUFDLENBQUNDLFFBQVEsQ0FBQyxJQUFJLENBQUM3QyxLQUFLLEdBQUc7WUFDdkUsSUFBSSxDQUFDQSxLQUFLLEdBQUdDLGtCQUFVLENBQUM2QyxVQUFVO1FBQ3BDO1FBQ0EsSUFBSSxDQUFDMUMsTUFBTSxDQUFDMkMsVUFBVSxHQUFHLElBQUk7UUFFN0IsTUFBTXZCLE1BQU0sSUFBSXdCLElBQUksSUFBSSxDQUFDekIsYUFBYTtRQUN0Q0MsSUFBSXlCLFlBQVksQ0FBQ0MsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDNUIsYUFBYSxDQUFDNkIsT0FBTyxDQUFDQyxRQUFRO1FBQzdENUIsSUFBSXlCLFlBQVksQ0FBQ0MsR0FBRyxDQUFDLFlBQVk7UUFFakMsTUFBTVosU0FDSix3QkFBd0I7UUFDeEJlLFdBQVdDLElBQUksS0FBS0MsYUFBYUMsUUFBUUMsR0FBRyxDQUFDSixZQUFZLFVBQVUsSUFBSUssVUFBVWxDLElBQUk0QixRQUFRLE1BQU0sSUFBSVosV0FBYSxDQUFDaEIsSUFBSTRCLFFBQVE7UUFDbkksSUFBSSxDQUFDZCxNQUFNLEdBQUdBO1FBRWQsOEJBQThCO1FBQzlCQSxPQUFPcUIsT0FBTyxHQUFHLENBQUNDLFFBQW9DQyxRQUFRQyxHQUFHLENBQUM7Z0JBQUVDLE9BQU9IO2dCQUFPSSxTQUFTLElBQUksQ0FBQ3hELEVBQUU7WUFBQztRQUNuRzhCLE9BQU8yQixPQUFPLEdBQUcsT0FBT0wsUUFBb0MsTUFBTSxJQUFJLENBQUNNLFdBQVcsQ0FBQ047UUFDbkZ0QixPQUFPNkIsU0FBUyxHQUFHLE9BQU9DLFVBQXdDLE1BQU0sSUFBSSxDQUFDQyxhQUFhLENBQUNEO1FBRTNGLE9BQU8sTUFBTSxJQUFJckMsUUFBUSxDQUFDQztZQUN4Qk0sT0FBT2dDLE1BQU0sR0FBRztnQkFDZCw4Q0FBOEM7Z0JBQzlDLDZFQUE2RTtnQkFDN0UsSUFBSSxDQUFDO29CQUFDckUsa0JBQVUsQ0FBQzBDLFdBQVc7b0JBQUUxQyxrQkFBVSxDQUFDMkMsUUFBUTtpQkFBQyxDQUFDQyxRQUFRLENBQUMsSUFBSSxDQUFDN0MsS0FBSyxHQUFHO29CQUN2RSxJQUFJLENBQUNBLEtBQUssR0FBR0Msa0JBQVUsQ0FBQ3NFLFlBQVk7Z0JBQ3RDO2dCQUNBLElBQUksQ0FBQ25FLE1BQU0sQ0FBQ29FLFNBQVMsR0FBRyxJQUFJO2dCQUU1QnhDLFFBQVEsSUFBSTtZQUNkO1FBQ0Y7SUFDRjtJQUVBLDBHQUEwRyxHQUMxRyxNQUFNeUMsV0FBMEI7UUFDOUIsb0ZBQW9GO1FBQ3BGLDRGQUE0RjtRQUM1RixJQUFJLElBQUksQ0FBQzNDLE1BQU0sSUFBSTtZQUNqQixJQUFJLENBQUNwQixNQUFNLENBQUNnRSxLQUFLLENBQUMsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUNsRSxFQUFFLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMyQixLQUFLLENBQUN3Qyw2QkFBcUIsQ0FBQ0MsYUFBYSxFQUFFO1FBQ2xEO1FBRUEsSUFBSSxDQUFDNUUsS0FBSyxHQUFHQyxrQkFBVSxDQUFDMEMsV0FBVztRQUNuQyxJQUFJLENBQUN2QyxNQUFNLENBQUN5RSxXQUFXLEdBQUcsSUFBSTtRQUU5Qiw2RUFBNkU7UUFDN0UsbUVBQW1FO1FBQ25FLG1EQUFtRDtRQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDL0MsTUFBTSxJQUFJO1lBQ2xCLE1BQU0sSUFBSSxDQUFDWSxPQUFPO1FBQ3BCO1FBRUEsSUFBSSxDQUFDb0MsSUFBSSxDQUNQO1lBQ0VDLElBQUlDLHFCQUFjLENBQUNDLFFBQVE7WUFDM0JDLEdBQUc7Z0JBQ0RDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDN0QsYUFBYSxDQUFDNkQsS0FBSyxDQUFDLENBQUM7Z0JBQ3hDQyxVQUFVLElBQUksQ0FBQzlELGFBQWEsQ0FBQzhELFFBQVE7Z0JBQ3JDQyxZQUFZLElBQUksQ0FBQy9ELGFBQWEsQ0FBQytELFVBQVU7Z0JBQ3pDQyxTQUFTLElBQUksQ0FBQ2hFLGFBQWEsQ0FBQ2dFLE9BQU87Z0JBQ25DQyxPQUFPO29CQUFDLElBQUksQ0FBQy9FLEVBQUU7b0JBQUUsSUFBSSxDQUFDYyxhQUFhLENBQUNrRSxXQUFXO2lCQUFDO2dCQUNoREMsVUFBVSxNQUFNLElBQUksQ0FBQ0MsWUFBWTtZQUNuQztRQUNGLEdBQ0E7UUFHRixPQUFPLE1BQU0sSUFBSTNELFFBQVEsQ0FBQ0M7WUFDeEIsSUFBSSxDQUFDMUIsUUFBUSxDQUFDNEMsR0FBRyxDQUFDLFNBQVM7Z0JBQ3pCLElBQUksQ0FBQzlDLE1BQU0sQ0FBQ3VGLFVBQVUsR0FBRyxJQUFJO2dCQUM3Qiw2Q0FBNkM7Z0JBQzdDLElBQUksQ0FBQzVFLFlBQVk7Z0JBQ2pCaUI7WUFDRjtZQUNBLDZCQUE2QjtZQUM3Qiw0Q0FBNEM7WUFDNUMsZ0ZBQWdGO1lBQ2hGLElBQUksQ0FBQzFCLFFBQVEsQ0FBQzRDLEdBQUcsQ0FBQyxtQkFBbUI7Z0JBQ25DLElBQUksQ0FBQzVDLFFBQVEsQ0FBQ3NGLE1BQU0sQ0FBQztnQkFDckI1RDtZQUNGO1FBQ0Y7SUFDRjtJQUVBLCtEQUErRCxHQUMvREYsU0FBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUNRLE1BQU0sRUFBRUMsZUFBZUMsV0FBYSxDQUFDQyxJQUFJO0lBQ3ZEO0lBRUEsb0VBQW9FLEdBQ3BFLE1BQU1vRCxTQUF3QjtRQUM1QixJQUFJLENBQUNuRixNQUFNLENBQUNnRSxLQUFLLENBQUMsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUNsRSxFQUFFLENBQUMsQ0FBQztRQUN4RCxzREFBc0Q7UUFDdEQsbUhBQW1IO1FBQ25ILElBQUksSUFBSSxDQUFDc0IsTUFBTSxJQUFJO1lBQ2pCLElBQUksQ0FBQ3BCLE1BQU0sQ0FBQ2dFLEtBQUssQ0FBQyxDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQ2xFLEVBQUUsQ0FBQyxVQUFVLENBQUM7WUFDbEUsSUFBSSxDQUFDMkIsS0FBSyxDQUFDd0MsNkJBQXFCLENBQUNtQiwwQkFBMEIsRUFBRTtRQUMvRDtRQUVBLG1EQUFtRDtRQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDQyxTQUFTLEVBQUU7WUFDbkIsSUFBSSxDQUFDckYsTUFBTSxDQUFDZ0UsS0FBSyxDQUFDLENBQUMsa0NBQWtDLEVBQUUsSUFBSSxDQUFDbEUsRUFBRSxDQUFDLHFEQUFxRCxDQUFDO1lBRXJILE9BQU8sTUFBTSxJQUFJLENBQUNpRSxRQUFRO1FBQzVCO1FBRUEsSUFBSSxDQUFDekUsS0FBSyxHQUFHQyxrQkFBVSxDQUFDMkMsUUFBUTtRQUVoQyxJQUFJLENBQUNsQyxNQUFNLENBQUNnRSxLQUFLLENBQUMsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUNsRSxFQUFFLENBQUMsbUJBQW1CLENBQUM7UUFDM0UsbUZBQW1GO1FBQ25GLE1BQU0sSUFBSSxDQUFDa0MsT0FBTztRQUNsQixJQUFJLENBQUNoQyxNQUFNLENBQUNnRSxLQUFLLENBQ2YsNEVBQTRFO1FBQzVFLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDbEUsRUFBRSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQ3VGLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDakcsc0JBQXNCLENBQUMsQ0FBQztRQUc5RyxJQUFJLENBQUNnRixJQUFJLENBQ1A7WUFDRUMsSUFBSUMscUJBQWMsQ0FBQ2dCLE1BQU07WUFDekJkLEdBQUc7Z0JBQ0RDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDN0QsYUFBYSxDQUFDNkQsS0FBSyxDQUFDLENBQUM7Z0JBQ3hDYyxZQUFZLElBQUksQ0FBQ0YsU0FBUztnQkFDMUJHLEtBQUssSUFBSSxDQUFDcEcsc0JBQXNCLElBQUk7WUFDdEM7UUFDRixHQUNBO1FBRUYsSUFBSSxDQUFDWSxNQUFNLENBQUNnRSxLQUFLLENBQUMsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUNsRSxFQUFFLENBQUMsa0JBQWtCLENBQUM7UUFFMUUsT0FBTyxNQUFNLElBQUl1QixRQUFRLENBQUNDO1lBQ3hCLElBQUksQ0FBQzFCLFFBQVEsQ0FBQzRDLEdBQUcsQ0FBQyxXQUFXLElBQU1sQjtZQUNuQywyREFBMkQ7WUFDM0QsMkNBQTJDO1lBQzNDLHVGQUF1RjtZQUN2RixJQUFJLENBQUMxQixRQUFRLENBQUM0QyxHQUFHLENBQUMsbUJBQW1CO2dCQUNuQyxJQUFJLENBQUM1QyxRQUFRLENBQUNzRixNQUFNLENBQUM7Z0JBQ3JCNUQ7WUFDRjtRQUNGO0lBQ0Y7SUFFQTs7R0FFQyxHQUNELE1BQU04QyxLQUFLVixPQUEyQixFQUFFdkMsZUFBd0IsS0FBSyxFQUFpQjtRQUNwRixpR0FBaUc7UUFDakcsbURBQW1EO1FBQ25ELE1BQU0sSUFBSSxDQUFDRCxZQUFZLENBQUNDO1FBRXhCLE1BQU0sSUFBSSxDQUFDYixNQUFNLENBQUNtRixPQUFPLENBQUN0RTtRQUUxQiw4RkFBOEY7UUFDOUYsTUFBTSxJQUFJLENBQUNELFlBQVksQ0FBQ0M7UUFFeEIsSUFBSSxDQUFDUyxNQUFNLEVBQUV3QyxLQUFLc0IsS0FBS0MsU0FBUyxDQUFDakM7SUFDbkM7SUFFQSwwSEFBMEgsR0FDMUgsTUFBTWtDLFdBQTBCO1FBQzlCLElBQUksQ0FBQ25FLEtBQUssQ0FBQ3dDLDZCQUFxQixDQUFDNEIsUUFBUSxFQUFFO1FBQzNDLElBQUksQ0FBQ3ZHLEtBQUssR0FBR0Msa0JBQVUsQ0FBQ0MsT0FBTztJQUNqQztJQUVBLHVDQUF1QyxHQUN2QyxNQUFNZ0UsWUFBWS9CLEtBQStCLEVBQWlCO1FBQ2hFLDZEQUE2RDtRQUU3RCxJQUFJLENBQUNxRSxnQkFBZ0I7UUFFckIsT0FBUXJFLE1BQU1DLElBQUk7WUFDaEIsS0FBS3VDLDZCQUFxQixDQUFDOEIsZUFBZTtnQkFBRTtvQkFDMUMsSUFBSSxDQUFDekcsS0FBSyxHQUFHQyxrQkFBVSxDQUFDQyxPQUFPO29CQUMvQixJQUFJLENBQUNFLE1BQU0sQ0FBQ3NHLFlBQVksR0FBRyxJQUFJO29CQUUvQjtnQkFDRjtZQUNBLDhDQUE4QztZQUM5QyxLQUFLL0IsNkJBQXFCLENBQUM0QixRQUFRO1lBQ25DLEtBQUs1Qiw2QkFBcUIsQ0FBQ0MsYUFBYTtZQUN4QyxLQUFLRCw2QkFBcUIsQ0FBQ2dDLFNBQVM7WUFDcEMsS0FBS2hDLDZCQUFxQixDQUFDbUIsMEJBQTBCO1lBQ3JELEtBQUtuQiw2QkFBcUIsQ0FBQ2lDLGlCQUFpQjtnQkFBRTtvQkFDNUMsSUFBSSxDQUFDNUcsS0FBSyxHQUFHQyxrQkFBVSxDQUFDNEcsWUFBWTtvQkFDcEMsSUFBSSxDQUFDekcsTUFBTSxDQUFDc0csWUFBWSxHQUFHLElBQUk7b0JBRS9CLHFFQUFxRTtvQkFDckU7Z0JBQ0Y7WUFDQSwwREFBMEQ7WUFDMUQsS0FBS0ksNkJBQXNCLENBQUNDLGFBQWE7WUFDekMsS0FBS0QsNkJBQXNCLENBQUNFLGdCQUFnQjtZQUM1QyxLQUFLRiw2QkFBc0IsQ0FBQ0csVUFBVTtZQUN0QyxLQUFLSCw2QkFBc0IsQ0FBQ0ksV0FBVztZQUN2QyxLQUFLSiw2QkFBc0IsQ0FBQ0ssZUFBZTtnQkFBRTtvQkFDM0MsSUFBSSxDQUFDekcsTUFBTSxDQUFDZ0UsS0FBSyxDQUFDLENBQUMsZ0VBQWdFLEVBQUV2QyxNQUFNQyxJQUFJLENBQUMsQ0FBQztvQkFDakcsSUFBSSxDQUFDcEMsS0FBSyxHQUFHQyxrQkFBVSxDQUFDMEMsV0FBVztvQkFDbkMsSUFBSSxDQUFDdkMsTUFBTSxDQUFDc0csWUFBWSxHQUFHLElBQUk7b0JBRS9CLE9BQU8sTUFBTSxJQUFJLENBQUNqQyxRQUFRO2dCQUM1QjtZQUNBLDZEQUE2RDtZQUM3RCxnREFBZ0Q7WUFDaEQsS0FBS3FDLDZCQUFzQixDQUFDTSxvQkFBb0I7WUFDaEQsS0FBS04sNkJBQXNCLENBQUNPLFlBQVk7WUFDeEMsS0FBS1AsNkJBQXNCLENBQUNRLGdCQUFnQjtZQUM1QyxLQUFLUiw2QkFBc0IsQ0FBQ1MsaUJBQWlCO1lBQzdDLEtBQUtULDZCQUFzQixDQUFDVSxjQUFjO1lBQzFDLEtBQUtWLDZCQUFzQixDQUFDVyxpQkFBaUI7Z0JBQUU7b0JBQzdDLElBQUksQ0FBQ3pILEtBQUssR0FBR0Msa0JBQVUsQ0FBQ0MsT0FBTztvQkFDL0IsSUFBSSxDQUFDRSxNQUFNLENBQUNzRyxZQUFZLEdBQUcsSUFBSTtvQkFFL0IsTUFBTSxJQUFJZ0IsTUFBTXZGLE1BQU1FLE1BQU0sSUFBSTtnQkFDbEM7WUFDQSwwREFBMEQ7WUFDMUQsS0FBS3lFLDZCQUFzQixDQUFDYSxZQUFZO1lBQ3hDLEtBQUtiLDZCQUFzQixDQUFDYyxXQUFXO1lBQ3ZDLEtBQUtkLDZCQUFzQixDQUFDZSxvQkFBb0I7WUFDaEQ7Z0JBQVM7b0JBQ1AsSUFBSSxDQUFDbkgsTUFBTSxDQUFDb0gsSUFBSSxDQUFDLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDdEgsRUFBRSxDQUFDLGFBQWEsQ0FBQztvQkFDaEUsSUFBSSxDQUFDUixLQUFLLEdBQUdDLGtCQUFVLENBQUMyQyxRQUFRO29CQUNoQyxJQUFJLENBQUN4QyxNQUFNLENBQUNzRyxZQUFZLEdBQUcsSUFBSTtvQkFFL0IsT0FBTyxNQUFNLElBQUksQ0FBQ2IsTUFBTTtnQkFDMUI7UUFDRjtJQUNGO0lBRUEsdUNBQXVDLEdBQ3ZDLE1BQU1rQyxvQkFBb0JDLE1BQTZCLEVBQWlCO1FBQ3RFLHdFQUF3RTtRQUN4RSxJQUFJLENBQUNySCxLQUFLLENBQUNzSCxPQUFPLEdBQUdDLEtBQUtDLEdBQUc7UUFDN0IsSUFBSSxDQUFDeEgsS0FBSyxDQUFDQyxZQUFZLEdBQUc7UUFDMUIsaUJBQWlCO1FBRWpCLE9BQVFvSCxPQUFPakQsRUFBRTtZQUNmLEtBQUtDLHFCQUFjLENBQUNvRCxTQUFTO2dCQUFFO29CQUM3QixpQ0FBaUM7b0JBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUN0RyxNQUFNLElBQUk7b0JBRXBCLElBQUksQ0FBQ25CLEtBQUssQ0FBQzBILFFBQVEsR0FBR0gsS0FBS0MsR0FBRztvQkFDOUIscUVBQXFFO29CQUNyRSxzRkFBc0Y7b0JBQ3RGLElBQUksQ0FBQzdGLE1BQU0sRUFBRXdDLEtBQ1hzQixLQUFLQyxTQUFTLENBQUM7d0JBQ2J0QixJQUFJQyxxQkFBYyxDQUFDb0QsU0FBUzt3QkFDNUJsRCxHQUFHLElBQUksQ0FBQ3BGLHNCQUFzQjtvQkFDaEM7b0JBRUYsSUFBSSxDQUFDTSxNQUFNLENBQUNrSSxTQUFTLEdBQUcsSUFBSTtvQkFFNUI7Z0JBQ0Y7WUFDQSxLQUFLdEQscUJBQWMsQ0FBQ3VELEtBQUs7Z0JBQUU7b0JBQ3pCLE1BQU0xSCxXQUFXLEFBQUNtSCxPQUFPOUMsQ0FBQyxDQUFrQnNELGtCQUFrQjtvQkFDOUQsSUFBSSxDQUFDOUgsTUFBTSxDQUFDZ0UsS0FBSyxDQUFDLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDbEUsRUFBRSxDQUFDLENBQUM7b0JBQ3hELElBQUksQ0FBQ2lJLGlCQUFpQixDQUFDNUg7b0JBRXZCLElBQUksSUFBSSxDQUFDYixLQUFLLEtBQUtDLGtCQUFVLENBQUMyQyxRQUFRLEVBQUU7d0JBQ3RDLE1BQU04RixlQUFlOytCQUFJLElBQUksQ0FBQzFILE1BQU0sQ0FBQzJILEtBQUs7eUJBQUM7d0JBQzNDLDhDQUE4Qzt3QkFDOUMsa0RBQWtEO3dCQUNsRCx3REFBd0Q7d0JBQ3hELElBQUksQ0FBQzNILE1BQU0sR0FBRyxJQUFJQyxrQkFBVyxDQUFDOzRCQUM1QkMsS0FBSyxJQUFJLENBQUNDLHFCQUFxQjs0QkFDL0JFLGdCQUFnQjs0QkFDaEJELGNBQWMsSUFBSSxDQUFDRCxxQkFBcUI7d0JBQzFDO3dCQUVBLDZDQUE2Qzt3QkFDN0MsSUFBSSxDQUFDSCxNQUFNLENBQUMySCxLQUFLLENBQUMxRyxPQUFPLElBQUl5RztvQkFDL0I7b0JBRUEsSUFBSSxDQUFDdEksTUFBTSxDQUFDd0ksS0FBSyxHQUFHLElBQUk7b0JBRXhCO2dCQUNGO1lBQ0EsS0FBSzVELHFCQUFjLENBQUM2RCxZQUFZO2dCQUFFO29CQUNoQyxrRUFBa0U7b0JBQ2xFLElBQUksSUFBSSxDQUFDbEksS0FBSyxDQUFDMEgsUUFBUSxFQUFFO3dCQUN2QixJQUFJLENBQUMxSCxLQUFLLENBQUNtSSxHQUFHLEdBQUcsSUFBSSxDQUFDbkksS0FBSyxDQUFDc0gsT0FBTyxHQUFHLElBQUksQ0FBQ3RILEtBQUssQ0FBQzBILFFBQVE7b0JBQzNEO29CQUVBLElBQUksQ0FBQ2pJLE1BQU0sQ0FBQzJJLFlBQVksR0FBRyxJQUFJO29CQUUvQjtnQkFDRjtZQUNBLEtBQUsvRCxxQkFBYyxDQUFDZ0UsU0FBUztnQkFBRTtvQkFDN0IsZ0RBQWdEO29CQUVoRCxJQUFJLENBQUM1SSxNQUFNLENBQUM2SSxrQkFBa0IsR0FBRyxJQUFJO29CQUVyQyxNQUFNLElBQUksQ0FBQ3BELE1BQU07b0JBRWpCO2dCQUNGO1lBQ0EsS0FBS2IscUJBQWMsQ0FBQ2tFLGNBQWM7Z0JBQUU7b0JBQ2xDLE1BQU1DLFlBQVluQixPQUFPOUMsQ0FBQztvQkFDMUIsSUFBSSxDQUFDeEUsTUFBTSxDQUFDZ0UsS0FBSyxDQUFDLENBQUMsNENBQTRDLEVBQUUsSUFBSSxDQUFDbEUsRUFBRSxDQUFDLG9CQUFvQixFQUFFMkksVUFBVS9GLFFBQVEsR0FBRyxDQUFDO29CQUVySCxJQUFJLENBQUNoRCxNQUFNLENBQUNnSixjQUFjLEdBQUcsSUFBSSxFQUFFRDtvQkFFbkMsOERBQThEO29CQUM5RCx5RUFBeUU7b0JBQ3pFLE1BQU1FLElBQUFBLFlBQUssRUFBQzNILEtBQUs0SCxLQUFLLENBQUMsQUFBQzVILENBQUFBLEtBQUs2SCxNQUFNLEtBQUssSUFBSSxDQUFBLElBQUs7b0JBRWpELElBQUksQ0FBQ2pKLFFBQVEsQ0FBQ2tKLEdBQUcsQ0FBQyxxQkFBcUJ4QjtvQkFDdkMsSUFBSSxDQUFDMUgsUUFBUSxDQUFDc0YsTUFBTSxDQUFDO29CQUVyQixpREFBaUQ7b0JBQ2pELElBQUksQ0FBQ3VELFdBQVc7d0JBQ2QsTUFBTSxJQUFJLENBQUNySSxlQUFlO3dCQUUxQjtvQkFDRjtvQkFFQSx3REFBd0Q7b0JBQ3hELE1BQU0sSUFBSSxDQUFDK0UsTUFBTTtvQkFFakI7Z0JBQ0Y7UUFDRjtRQUVBLE9BQVFtQyxPQUFPeUIsQ0FBQztZQUNkLEtBQUs7Z0JBQ0gsSUFBSSxDQUFDekosS0FBSyxHQUFHQyxrQkFBVSxDQUFDeUosU0FBUztnQkFDakMsSUFBSSxDQUFDdEosTUFBTSxDQUFDdUosT0FBTyxHQUFHLElBQUk7Z0JBRTFCLDZFQUE2RTtnQkFDN0UsSUFBSSxDQUFDdEosZ0JBQWdCLENBQUN1SixHQUFHLENBQUMsQ0FBQzVILFVBQVlBO2dCQUV2QyxJQUFJLENBQUMxQixRQUFRLENBQUNrSixHQUFHLENBQUMsYUFBYXhCO2dCQUMvQixJQUFJLENBQUMxSCxRQUFRLENBQUNzRixNQUFNLENBQUM7Z0JBQ3JCO1lBQ0YsS0FBSztnQkFBUztvQkFDWixnQ0FBZ0M7b0JBQ2hDLE1BQU1pRSxVQUFVN0IsT0FBTzlDLENBQUM7b0JBRXhCLElBQUksQ0FBQy9FLGdCQUFnQixHQUFHMEosUUFBUUMsa0JBQWtCO29CQUVsRCxJQUFJLENBQUMvRCxTQUFTLEdBQUc4RCxRQUFRNUQsVUFBVTtvQkFDbkMsSUFBSSxDQUFDakcsS0FBSyxHQUFHQyxrQkFBVSxDQUFDeUosU0FBUztvQkFFakMsNkVBQTZFO29CQUM3RSx1Q0FBdUM7b0JBQ3ZDLElBQUksQ0FBQ3JKLGdCQUFnQixDQUFDdUosR0FBRyxDQUFDLENBQUM1SCxVQUFZQTtvQkFFdkMsSUFBSSxDQUFDMUIsUUFBUSxDQUFDa0osR0FBRyxDQUFDLFdBQVd4QjtvQkFDN0IsSUFBSSxDQUFDMUgsUUFBUSxDQUFDc0YsTUFBTSxDQUFDO29CQUNyQjtnQkFDRjtRQUNGO1FBRUEsOENBQThDO1FBQzlDLDBDQUEwQztRQUMxQywyRUFBMkU7UUFDM0UsSUFBSW9DLE9BQU8rQixDQUFDLEtBQUssTUFBTTtZQUNyQixJQUFJLENBQUNqSyxzQkFBc0IsR0FBR2tJLE9BQU8rQixDQUFDO1FBQ3hDO1FBRUEsSUFBSSxDQUFDQyxZQUFZLENBQUNoQztJQUNwQjtJQUVBZ0MsYUFBYWhDLE1BQTZCLEVBQVE7UUFDaEQsK0VBQStFO1FBQy9FLHlDQUF5QztRQUN6QyxJQUFJLENBQUM1SCxNQUFNLENBQUNnRSxPQUFPLEdBQUcsSUFBSSxFQUFFNkYsSUFBQUEsZUFBUSxFQUFDakM7SUFDdkM7SUFFQSx3Q0FBd0MsR0FDeEMsTUFBTTNELGNBQWNELE9BQW1DLEVBQWlCO1FBQ3RFLElBQUk4RixvQkFBb0I5RixRQUFRK0YsSUFBSTtRQUVwQyxxQ0FBcUM7UUFDckMsK0NBQStDO1FBQy9DLElBQUksSUFBSSxDQUFDN0ksYUFBYSxDQUFDOEQsUUFBUSxJQUFJOEUsNkJBQTZCRSxNQUFNO1lBQ3BFRixvQkFBb0JHLElBQUFBLHFCQUFXLEVBQUMsTUFBTUgsa0JBQWtCSSxXQUFXLElBQUlsSCxRQUFRO1FBQ2pGO1FBRUEsMERBQTBEO1FBQzFELElBQUksT0FBTzhHLHNCQUFzQixVQUFVO1FBRTNDLE9BQU8sTUFBTSxJQUFJLENBQUNuQyxtQkFBbUIsQ0FBQzNCLEtBQUttRSxLQUFLLENBQUNMO0lBQ25EO0lBRUE7Ozs7R0FJQyxHQUNELE1BQU14RSxlQUFxRDtRQUN6RCw2Q0FBNkM7UUFDN0M7SUFDRjtJQUVBLHFOQUFxTixHQUNyTixNQUFNNUUsa0JBQWlDLENBQUM7SUFFeEMsNkdBQTZHLEdBQzdHLE1BQU1DLGVBQThCLENBQUM7SUFFckMsMEVBQTBFLEdBQzFFMEgsa0JBQWtCNUgsUUFBZ0IsRUFBUTtRQUN4QyxJQUFJLENBQUNILE1BQU0sQ0FBQ2dFLEtBQUssQ0FBQyxDQUFDLG9DQUFvQyxFQUFFLElBQUksQ0FBQ2xFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLGlFQUFpRTtRQUNqRSxJQUFJLElBQUksQ0FBQ0csS0FBSyxDQUFDNkosVUFBVSxFQUFFQyxjQUFjLElBQUksQ0FBQzlKLEtBQUssQ0FBQzZKLFVBQVU7UUFDOUQsSUFBSSxJQUFJLENBQUM3SixLQUFLLENBQUMrSixTQUFTLEVBQUVDLGFBQWEsSUFBSSxDQUFDaEssS0FBSyxDQUFDK0osU0FBUztRQUUzRCxJQUFJLENBQUMvSixLQUFLLENBQUNFLFFBQVEsR0FBR0E7UUFFdEIsK0NBQStDO1FBQy9DLDRFQUE0RTtRQUM1RSxJQUFJO1lBQUNaLGtCQUFVLENBQUM0RyxZQUFZO1lBQUU1RyxrQkFBVSxDQUFDQyxPQUFPO1NBQUMsQ0FBQzJDLFFBQVEsQ0FBQyxJQUFJLENBQUM3QyxLQUFLLEdBQUc7WUFDdEUsSUFBSSxDQUFDVSxNQUFNLENBQUNnRSxLQUFLLENBQUMsQ0FBQyxvQ0FBb0MsRUFBRSxJQUFJLENBQUNsRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3BFLElBQUksQ0FBQ1IsS0FBSyxHQUFHQyxrQkFBVSxDQUFDc0UsWUFBWTtRQUN0QztRQUVBLHNGQUFzRjtRQUN0RiwyREFBMkQ7UUFDM0QsNkRBQTZEO1FBQzdELDZFQUE2RTtRQUM3RSxNQUFNcUcsU0FBU2xKLEtBQUtDLElBQUksQ0FBQyxJQUFJLENBQUNoQixLQUFLLENBQUNFLFFBQVEsR0FBSWEsQ0FBQUEsS0FBSzZILE1BQU0sTUFBTSxHQUFFO1FBQ25FLElBQUksQ0FBQzVJLEtBQUssQ0FBQytKLFNBQVMsR0FBR0csV0FBVztZQUNoQyxJQUFJLENBQUNuSyxNQUFNLENBQUNnRSxLQUFLLENBQUMsQ0FBQyxvQ0FBb0MsRUFBRSxJQUFJLENBQUNsRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3BFLElBQUksQ0FBQyxJQUFJLENBQUNzQixNQUFNLElBQUk7WUFDcEIsSUFBSSxDQUFDcEIsTUFBTSxDQUFDZ0UsS0FBSyxDQUFDLENBQUMsb0NBQW9DLEVBQUUsSUFBSSxDQUFDbEUsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUNWLHNCQUFzQixDQUFFLENBQUM7WUFFcEcsc0ZBQXNGO1lBQ3RGLElBQUksQ0FBQ3dDLE1BQU0sRUFBRXdDLEtBQ1hzQixLQUFLQyxTQUFTLENBQUM7Z0JBQ2J0QixJQUFJQyxxQkFBYyxDQUFDb0QsU0FBUztnQkFDNUJsRCxHQUFHLElBQUksQ0FBQ3BGLHNCQUFzQjtZQUNoQztZQUdGLElBQUksQ0FBQ1ksTUFBTSxDQUFDZ0UsS0FBSyxDQUFDLENBQUMsb0NBQW9DLEVBQUUsSUFBSSxDQUFDbEUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNwRSxJQUFJLENBQUNHLEtBQUssQ0FBQzBILFFBQVEsR0FBR0gsS0FBS0MsR0FBRztZQUM5QixJQUFJLENBQUN4SCxLQUFLLENBQUNDLFlBQVksR0FBRztZQUUxQixvRUFBb0U7WUFDcEUsSUFBSSxDQUFDRCxLQUFLLENBQUM2SixVQUFVLEdBQUdNLFlBQVk7Z0JBQ2xDLElBQUksQ0FBQ3BLLE1BQU0sQ0FBQ2dFLEtBQUssQ0FBQyxDQUFDLG9DQUFvQyxFQUFFLElBQUksQ0FBQ2xFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BFLElBQUksQ0FBQyxJQUFJLENBQUNzQixNQUFNLElBQUk7Z0JBQ3BCLElBQUksQ0FBQ3BCLE1BQU0sQ0FBQ2dFLEtBQUssQ0FBQyxDQUFDLG9DQUFvQyxFQUFFLElBQUksQ0FBQ2xFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BFLHlGQUF5RjtnQkFFekYsc0VBQXNFO2dCQUV0RSxrRUFBa0U7Z0JBQ2xFLCtFQUErRTtnQkFDL0UsNkRBQTZEO2dCQUM3RCwyR0FBMkc7Z0JBQzNHLElBQUksQ0FBQyxJQUFJLENBQUNHLEtBQUssQ0FBQ0MsWUFBWSxFQUFFO29CQUM1QixJQUFJLENBQUNGLE1BQU0sQ0FBQ2dFLEtBQUssQ0FBQyxDQUFDLDhDQUE4QyxFQUFFLElBQUksQ0FBQ2xFLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQzdFLElBQUksQ0FBQzJCLEtBQUssQ0FBQ3dDLDZCQUFxQixDQUFDaUMsaUJBQWlCLEVBQUU7b0JBRXBELE9BQU8sTUFBTSxJQUFJLENBQUNuQyxRQUFRO2dCQUM1QjtnQkFFQSxJQUFJLENBQUM5RCxLQUFLLENBQUNDLFlBQVksR0FBRztnQkFFMUIsSUFBSSxDQUFDRixNQUFNLENBQUNnRSxLQUFLLENBQUMsQ0FBQyxvQ0FBb0MsRUFBRSxJQUFJLENBQUNsRSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNwRSxzRkFBc0Y7Z0JBQ3RGLElBQUksQ0FBQzhCLE1BQU0sRUFBRXdDLEtBQ1hzQixLQUFLQyxTQUFTLENBQUM7b0JBQ2J0QixJQUFJQyxxQkFBYyxDQUFDb0QsU0FBUztvQkFDNUJsRCxHQUFHLElBQUksQ0FBQ3BGLHNCQUFzQjtnQkFDaEM7Z0JBRUYsSUFBSSxDQUFDWSxNQUFNLENBQUNnRSxLQUFLLENBQUMsQ0FBQyxvQ0FBb0MsRUFBRSxJQUFJLENBQUNsRSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUVwRSxJQUFJLENBQUNHLEtBQUssQ0FBQzBILFFBQVEsR0FBR0gsS0FBS0MsR0FBRztnQkFFOUIsSUFBSSxDQUFDL0gsTUFBTSxDQUFDa0ksU0FBUyxHQUFHLElBQUk7WUFDOUIsR0FBRyxJQUFJLENBQUMzSCxLQUFLLENBQUNFLFFBQVE7UUFDeEIsR0FBRytKO0lBQ0w7SUFFQSxnREFBZ0QsR0FDaERwRSxtQkFBeUI7UUFDdkIsd0NBQXdDO1FBQ3hDaUUsY0FBYyxJQUFJLENBQUM5SixLQUFLLENBQUM2SixVQUFVO1FBQ25DLCtFQUErRTtRQUMvRSxzREFBc0Q7UUFDdERHLGFBQWEsSUFBSSxDQUFDaEssS0FBSyxDQUFDK0osU0FBUztJQUNuQztBQUNGO01BaUJBLFdBQWVoTCJ9
490
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TaGFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tY29uZnVzaW5nLXZvaWQtZXhwcmVzc2lvbiAqL1xuaW1wb3J0IHR5cGUgeyBEaXNjb3JkR2F0ZXdheVBheWxvYWQsIERpc2NvcmRIZWxsbywgRGlzY29yZFJlYWR5IH0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnXG5pbXBvcnQgeyBHYXRld2F5Q2xvc2VFdmVudENvZGVzLCBHYXRld2F5T3Bjb2RlcyB9IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgTGVha3lCdWNrZXQsIGNhbWVsaXplLCBkZWxheSwgbG9nZ2VyIH0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnXG5pbXBvcnQgeyBpbmZsYXRlU3luYyB9IGZyb20gJ25vZGU6emxpYidcbmltcG9ydCBOb2RlV2ViU29ja2V0IGZyb20gJ3dzJ1xuaW1wb3J0IHR5cGUgeyBCb3RTdGF0dXNVcGRhdGUsIFNoYXJkRXZlbnRzLCBTaGFyZEdhdGV3YXlDb25maWcsIFNoYXJkSGVhcnQsIFNoYXJkU29ja2V0UmVxdWVzdCB9IGZyb20gJy4vdHlwZXMuanMnXG5pbXBvcnQgeyBTaGFyZFNvY2tldENsb3NlQ29kZXMsIFNoYXJkU3RhdGUgfSBmcm9tICcuL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIGxldCBXZWJTb2NrZXQ6IGFueVxuXG5leHBvcnQgY2xhc3MgRGlzY29yZGVub1NoYXJkIHtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgc2hhcmQgKi9cbiAgaWQ6IG51bWJlclxuICAvKiogVGhlIGNvbm5lY3Rpb24gY29uZmlnIGRldGFpbHMgdGhhdCB0aGlzIHNoYXJkIHdpbGwgdXNlZCB0byBjb25uZWN0IHRvIGRpc2NvcmQuICovXG4gIGNvbm5lY3Rpb246IFNoYXJkR2F0ZXdheUNvbmZpZ1xuICAvKiogVGhpcyBjb250YWlucyBhbGwgdGhlIGhlYXJ0YmVhdCBpbmZvcm1hdGlvbiAqL1xuICBoZWFydDogU2hhcmRIZWFydFxuICAvKiogVGhlIG1heGltdW0gb2YgcmVxdWVzdHMgd2hpY2ggY2FuIGJlIHNlbmQgdG8gZGlzY29yZCBwZXIgcmF0ZSBsaW1pdCB0aWNrLiBUeXBpY2FsbHkgdGhpcyB2YWx1ZSBzaG91bGQgbm90IGJlIGNoYW5nZWQuICovXG4gIG1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljazogbnVtYmVyID0gMTIwXG4gIC8qKiBUaGUgcHJldmlvdXMgcGF5bG9hZCBzZXF1ZW5jZSBudW1iZXIuICovXG4gIHByZXZpb3VzU2VxdWVuY2VOdW1iZXI6IG51bWJlciB8IG51bGwgPSBudWxsXG4gIC8qKiBJbiB3aGljaCBpbnRlcnZhbCAoaW4gbWlsbGlzZWNvbmRzKSB0aGUgZ2F0ZXdheSByZXNldHMgaXQncyByYXRlIGxpbWl0LiAqL1xuICByYXRlTGltaXRSZXNldEludGVydmFsOiBudW1iZXIgPSA2MDAwMFxuICAvKiogQ3VycmVudCBzZXNzaW9uIGlkIG9mIHRoZSBzaGFyZCBpZiBwcmVzZW50LiAqL1xuICBzZXNzaW9uSWQ/OiBzdHJpbmdcbiAgLyoqIFRoaXMgY29udGFpbnMgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIERpc2NvcmQsIGlmIGN1cnJlbnRseSBjb25uZWN0ZWQuICovXG4gIHNvY2tldD86IE5vZGVXZWJTb2NrZXRcbiAgLyoqIEN1cnJlbnQgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHRoaXMuICovXG4gIHN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gIC8qKiBUaGUgdXJsIHByb3ZpZGVkIGJ5IGRpc2NvcmQgdG8gdXNlIHdoZW4gcmVzdW1pbmcgYSBjb25uZWN0aW9uIGZvciB0aGlzIHRoaXMuICovXG4gIHJlc3VtZUdhdGV3YXlVcmw6IHN0cmluZyA9ICcnXG4gIC8qKiBUaGUgc2hhcmQgcmVsYXRlZCBldmVudCBoYW5kbGVycy4gKi9cbiAgZXZlbnRzOiBTaGFyZEV2ZW50cyA9IHt9XG4gIC8qKiBDYWNoZSBmb3IgcGVuZGluZyBnYXRld2F5IHJlcXVlc3RzIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gc2VuZCB3aGlsZSB0aGUgZ2F0ZXdheSB3ZW50IG9mZmxpbmUuICovXG4gIG9mZmxpbmVTZW5kUXVldWU6IEFycmF5PChfPzogdW5rbm93bikgPT4gdm9pZD4gPSBbXVxuICAvKiogUmVzb2x2ZSBpbnRlcm5hbCB3YWl0aW5nIHN0YXRlcy4gTWFwcGVkIGJ5IFNlbGVjdGVkRXZlbnRzID0+IFJlc29sdmVGdW5jdGlvbiAqL1xuICByZXNvbHZlcyA9IG5ldyBNYXA8J1JFQURZJyB8ICdSRVNVTUVEJyB8ICdJTlZBTElEX1NFU1NJT04nLCAocGF5bG9hZDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKSA9PiB2b2lkPigpXG4gIC8qKiBTaGFyZCBidWNrZXQuIE9ubHkgYWNjZXNzIHRoaXMgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiBCdWNrZXQgZm9yIGhhbmRsaW5nIHNoYXJkIHJlcXVlc3QgcmF0ZSBsaW1pdHMuICovXG4gIGJ1Y2tldDogTGVha3lCdWNrZXRcbiAgLyoqIExvZ2dlciBmb3IgdGhlIGJ1Y2tldCAqL1xuICBsb2dnZXI6IFBpY2s8dHlwZW9mIGxvZ2dlciwgJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicgfCAnZmF0YWwnPlxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNoYXJkQ3JlYXRlT3B0aW9ucykge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkXG4gICAgdGhpcy5jb25uZWN0aW9uID0gb3B0aW9ucy5jb25uZWN0aW9uXG4gICAgdGhpcy5ldmVudHMgPSBvcHRpb25zLmV2ZW50c1xuICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyXG5cbiAgICB0aGlzLmhlYXJ0ID0ge1xuICAgICAgYWNrbm93bGVkZ2VkOiBmYWxzZSxcbiAgICAgIGludGVydmFsOiA0NTAwMCxcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5yZXF1ZXN0SWRlbnRpZnkpIHRoaXMucmVxdWVzdElkZW50aWZ5ID0gb3B0aW9ucy5yZXF1ZXN0SWRlbnRpZnlcbiAgICBpZiAob3B0aW9ucy5zaGFyZElzUmVhZHkpIHRoaXMuc2hhcmRJc1JlYWR5ID0gb3B0aW9ucy5zaGFyZElzUmVhZHlcblxuICAgIHRoaXMuYnVja2V0ID0gbmV3IExlYWt5QnVja2V0KHtcbiAgICAgIG1heDogdGhpcy5jYWxjdWxhdGVTYWZlUmVxdWVzdHMoKSxcbiAgICAgIHJlZmlsbEFtb3VudDogdGhpcy5jYWxjdWxhdGVTYWZlUmVxdWVzdHMoKSxcbiAgICAgIHJlZmlsbEludGVydmFsOiA2MDAwMCxcbiAgICAgIGxvZ2dlcjogdGhpcy5sb2dnZXIsXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBUaGUgZ2F0ZXdheSBjb25maWd1cmF0aW9uIHdoaWNoIGlzIHVzZWQgdG8gY29ubmVjdCB0byBEaXNjb3JkLiAqL1xuICBnZXQgZ2F0ZXdheUNvbmZpZygpOiBTaGFyZEdhdGV3YXlDb25maWcge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKiBUaGUgdXJsIHRvIGNvbm5lY3QgdG8uIEluaXRpYWxseSB0aGlzIGlzIHRoZSBkaXNjb3JkIGdhdGV3YXkgdXJsLCBhbmQgdGhlbiBpcyBzd2l0Y2hlZCB0byByZXN1bWUgZ2F0ZXdheSB1cmwgb25jZSBhIFJFQURZIGlzIHJlY2VpdmVkLiAqL1xuICBnZXQgY29ubmVjdGlvblVybCgpOiBzdHJpbmcge1xuICAgIC8vIFVzZSB8fCBhbmQgbm90ID8/IGhlcmUuID8/IHdpbGwgY2F1c2UgYSBidWcuXG4gICAgcmV0dXJuIHRoaXMucmVzdW1lR2F0ZXdheVVybCB8fCB0aGlzLmdhdGV3YXlDb25maWcudXJsXG4gIH1cblxuICAvKiogQ2FsY3VsYXRlIHRoZSBhbW91bnQgb2YgcmVxdWVzdHMgd2hpY2ggY2FuIHNhZmVseSBiZSBtYWRlIHBlciByYXRlIGxpbWl0IGludGVydmFsLCBiZWZvcmUgdGhlIGdhdGV3YXkgZ2V0cyBkaXNjb25uZWN0ZWQgZHVlIHRvIGFuIGV4Y2VlZGVkIHJhdGUgbGltaXQuICovXG4gIGNhbGN1bGF0ZVNhZmVSZXF1ZXN0cygpOiBudW1iZXIge1xuICAgIC8vICogMiBhZGRzIGV4dHJhIHNhZmV0eSBsYXllciBmb3IgZGlzY29yZHMgT1AgMSByZXF1ZXN0cyB0aGF0IHdlIG5lZWQgdG8gcmVzcG9uZCB0b1xuICAgIGNvbnN0IHNhZmVSZXF1ZXN0cyA9IHRoaXMubWF4UmVxdWVzdHNQZXJSYXRlTGltaXRUaWNrIC0gTWF0aC5jZWlsKHRoaXMucmF0ZUxpbWl0UmVzZXRJbnRlcnZhbCAvIHRoaXMuaGVhcnQuaW50ZXJ2YWwpICogMlxuXG4gICAgcmV0dXJuIHNhZmVSZXF1ZXN0cyA8IDAgPyAwIDogc2FmZVJlcXVlc3RzXG4gIH1cblxuICBhc3luYyBjaGVja09mZmxpbmUoaGlnaFByaW9yaXR5OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbigpKSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAvLyBIaWdoZXIgcHJpb3JpdHkgcmVxdWVzdHMgZ2V0IGFkZGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LlxuICAgICAgICBpZiAoaGlnaFByaW9yaXR5KSB0aGlzLm9mZmxpbmVTZW5kUXVldWUudW5zaGlmdChyZXNvbHZlKVxuICAgICAgICBlbHNlIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5wdXNoKHJlc29sdmUpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgc29ja2V0IGNvbm5lY3Rpb24gdG8gZGlzY29yZCBpZiBwcmVzZW50LiAqL1xuICBjbG9zZShjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc29ja2V0Py5yZWFkeVN0YXRlICE9PSBOb2RlV2ViU29ja2V0Lk9QRU4pIHJldHVyblxuXG4gICAgdGhpcy5zb2NrZXQ/LmNsb3NlKGNvZGUsIHJlYXNvbilcbiAgfVxuXG4gIC8qKiBDb25uZWN0IHRoZSBzaGFyZCB3aXRoIHRoZSBnYXRld2F5IGFuZCBzdGFydCBoZWFydGJlYXRpbmcuIFRoaXMgd2lsbCBub3QgaWRlbnRpZnkgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LiAqL1xuICBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8RGlzY29yZGVub1NoYXJkPiB7XG4gICAgLy8gT25seSBzZXQgdGhlIHNoYXJkIHRvIGBDb25uZWN0aW5nYCBzdGF0ZSxcbiAgICAvLyBpZiB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IGRvZXMgbm90IGNvbWUgZnJvbSBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgIGlmICghW1NoYXJkU3RhdGUuSWRlbnRpZnlpbmcsIFNoYXJkU3RhdGUuUmVzdW1pbmddLmluY2x1ZGVzKHRoaXMuc3RhdGUpKSB7XG4gICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0aW5nXG4gICAgfVxuICAgIHRoaXMuZXZlbnRzLmNvbm5lY3Rpbmc/Lih0aGlzKVxuXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTCh0aGlzLmNvbm5lY3Rpb25VcmwpXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3YnLCB0aGlzLmdhdGV3YXlDb25maWcudmVyc2lvbi50b1N0cmluZygpKVxuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdlbmNvZGluZycsICdqc29uJylcblxuICAgIGNvbnN0IHNvY2tldDogTm9kZVdlYlNvY2tldCA9XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIERlbm9cbiAgICAgIGdsb2JhbFRoaXMuRGVubyAhPT0gdW5kZWZpbmVkICYmIFJlZmxlY3QuaGFzKGdsb2JhbFRoaXMsICdEZW5vJykgPyBuZXcgV2ViU29ja2V0KHVybC50b1N0cmluZygpKSA6IG5ldyBOb2RlV2ViU29ja2V0KHVybC50b1N0cmluZygpKVxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG5cbiAgICAvLyBUT0RPOiBwcm9wZXIgZXZlbnQgaGFuZGxpbmdcbiAgICBzb2NrZXQub25lcnJvciA9IChldmVudDogTm9kZVdlYlNvY2tldC5FcnJvckV2ZW50KSA9PiBjb25zb2xlLmxvZyh7IGVycm9yOiBldmVudCwgc2hhcmRJZDogdGhpcy5pZCB9KVxuICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgKGV2ZW50OiBOb2RlV2ViU29ja2V0LkNsb3NlRXZlbnQpID0+IGF3YWl0IHRoaXMuaGFuZGxlQ2xvc2UoZXZlbnQpXG4gICAgc29ja2V0Lm9ubWVzc2FnZSA9IGFzeW5jIChtZXNzYWdlOiBOb2RlV2ViU29ja2V0Lk1lc3NhZ2VFdmVudCkgPT4gYXdhaXQgdGhpcy5oYW5kbGVNZXNzYWdlKG1lc3NhZ2UpXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIC8vIE9ubHkgc2V0IHRoZSBzaGFyZCB0byBgVW5pZGVudGlmaWVkYCBzdGF0ZSxcbiAgICAgICAgLy8gaWYgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBkb2VzIG5vdCBjb21lIGZyb20gYW4gaWRlbnRpZnkgb3IgcmVzdW1lIGFjdGlvbi5cbiAgICAgICAgaWYgKCFbU2hhcmRTdGF0ZS5JZGVudGlmeWluZywgU2hhcmRTdGF0ZS5SZXN1bWluZ10uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5VbmlkZW50aWZpZWRcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV2ZW50cy5jb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJlc29sdmUodGhpcylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqIElkZW50aWZ5IHRoZSBzaGFyZCB0byB0aGUgZ2F0ZXdheS4gSWYgbm90IGNvbm5lY3RlZCwgdGhpcyB3aWxsIGFsc28gY29ubmVjdCB0aGUgc2hhcmQgdG8gdGhlIGdhdGV3YXkuICovXG4gIGFzeW5jIGlkZW50aWZ5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEEgbmV3IGlkZW50aWZ5IGhhcyBiZWVuIHJlcXVlc3RlZCBldmVuIHRob3VnaCB0aGVyZSBpcyBhbHJlYWR5IGEgY29ubmVjdGlvbiBvcGVuLlxuICAgIC8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGNsb3NlIHRoZSBvbGQgY29ubmVjdGlvbiBhbmQgaGVhcnRiZWF0aW5nIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBvbmUuXG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDTE9TSU5HIEVYSVNUSU5HIFNIQVJEOiAjJHt0aGlzLmlkfWApXG4gICAgICB0aGlzLmNsb3NlKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZUlkZW50aWZ5aW5nLCAnUmUtaWRlbnRpZnlpbmcgY2xvc3VyZSBvZiBvbGQgY29ubmVjdGlvbi4nKVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLklkZW50aWZ5aW5nXG4gICAgdGhpcy5ldmVudHMuaWRlbnRpZnlpbmc/Lih0aGlzKVxuXG4gICAgLy8gSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgc2hhcmQgaXMgaW4gSGVhcnRiZWF0aW5nIHN0YXRlIGJ1dCBub3QgaWRlbnRpZmllZCxcbiAgICAvLyBzbyBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGFscmVhZHkgYSBnYXRld2F5IGNvbm5lY3Rpb24gZXhpc3RpbmcuXG4gICAgLy8gSWYgbm90IHdlIG5lZWQgdG8gY3JlYXRlIG9uZSBiZWZvcmUgd2UgaWRlbnRpZnkuXG4gICAgaWYgKCF0aGlzLmlzT3BlbigpKSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3QoKVxuICAgIH1cblxuICAgIHRoaXMuc2VuZChcbiAgICAgIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLklkZW50aWZ5LFxuICAgICAgICBkOiB7XG4gICAgICAgICAgdG9rZW46IGBCb3QgJHt0aGlzLmdhdGV3YXlDb25maWcudG9rZW59YCxcbiAgICAgICAgICBjb21wcmVzczogdGhpcy5nYXRld2F5Q29uZmlnLmNvbXByZXNzLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHRoaXMuZ2F0ZXdheUNvbmZpZy5wcm9wZXJ0aWVzLFxuICAgICAgICAgIGludGVudHM6IHRoaXMuZ2F0ZXdheUNvbmZpZy5pbnRlbnRzLFxuICAgICAgICAgIHNoYXJkOiBbdGhpcy5pZCwgdGhpcy5nYXRld2F5Q29uZmlnLnRvdGFsU2hhcmRzXSxcbiAgICAgICAgICBwcmVzZW5jZTogYXdhaXQgdGhpcy5tYWtlUHJlc2VuY2U/LigpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgKVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnUkVBRFknLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZXZlbnRzLmlkZW50aWZpZWQ/Lih0aGlzKVxuICAgICAgICAvLyBUZWxscyB0aGUgbWFuYWdlciB0aGF0IHRoaXMgc2hhcmQgaXMgcmVhZHlcbiAgICAgICAgdGhpcy5zaGFyZElzUmVhZHkoKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0pXG4gICAgICAvLyBXaGVuIGlkZW50aWZ5aW5nIHRvbyBmYXN0LFxuICAgICAgLy8gRGlzY29yZCBzZW5kcyBhbiBpbnZhbGlkIHNlc3Npb24gcGF5bG9hZC5cbiAgICAgIC8vIFRoaXMgY2FuIHNhZmVseSBiZSBpZ25vcmVkIHRob3VnaCBhbmQgdGhlIHNoYXJkIHN0YXJ0cyBhIG5ldyBpZGVudGlmeSBhY3Rpb24uXG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnSU5WQUxJRF9TRVNTSU9OJywgKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVBRFknKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBDaGVjayB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIHRvIERpc2NvcmQgaXMgY3VycmVudGx5IG9wZW4uICovXG4gIGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ/LnJlYWR5U3RhdGUgPT09IE5vZGVXZWJTb2NrZXQuT1BFTlxuICB9XG5cbiAgLyoqIEF0dGVtcHQgdG8gcmVzdW1lIHRoZSBwcmV2aW91cyBzaGFyZHMgc2Vzc2lvbiB3aXRoIHRoZSBnYXRld2F5LiAqL1xuICBhc3luYyByZXN1bWUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfWApXG4gICAgLy8gSXQgaGFzIGJlZW4gcmVxdWVzdGVkIHRvIHJlc3VtZSB0aGUgU2hhcmRzIHNlc3Npb24uXG4gICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBzaGFyZCBpcyBzdGlsbCBjb25uZWN0ZWQgd2l0aCBEaXNjb3JkJ3MgZ2F0ZXdheSB0aGVyZWZvcmUgd2UgbmVlZCB0byBmb3JjZWZ1bGx5IGNsb3NlIGl0LlxuICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9IGluIGlzT3BlbmApXG4gICAgICB0aGlzLmNsb3NlKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXN1bWVDbG9zaW5nT2xkQ29ubmVjdGlvbiwgJ1JlY29ubmVjdGluZyB0aGUgc2hhcmQsIGNsb3Npbmcgb2xkIGNvbm5lY3Rpb24uJylcbiAgICB9XG5cbiAgICAvLyBTaGFyZCBoYXMgbmV2ZXIgaWRlbnRpZmllZCwgc28gd2UgY2Fubm90IHJlc3VtZS5cbiAgICBpZiAoIXRoaXMuc2Vzc2lvbklkKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBUcnlpbmcgdG8gcmVzdW1lIGEgc2hhcmQgIyR7dGhpcy5pZH0gdGhhdCB3YXMgTk9UIGZpcnN0IGlkZW50aWZpZWQuIChObyBzZXNzaW9uIGlkIGZvdW5kKWApXG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmlkZW50aWZ5KClcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5SZXN1bWluZ1xuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfSwgYmVmb3JlIGNvbm5lY3RpbmdgKVxuICAgIC8vIEJlZm9yZSB3ZSBjYW4gcmVzdW1lLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIHdpdGggRGlzY29yZCdzIGdhdGV3YXkuXG4gICAgYXdhaXQgdGhpcy5jb25uZWN0KClcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgIGBbR2F0ZXdheV0gUmVzdW1pbmcgU2hhcmQgIyR7dGhpcy5pZH0sIGFmdGVyIGNvbm5lY3RpbmcuICR7dGhpcy5zZXNzaW9uSWR9IHwgJHt0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXJ9YCxcbiAgICApXG5cbiAgICB0aGlzLnNlbmQoXG4gICAgICB7XG4gICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5SZXN1bWUsXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICB0b2tlbjogYEJvdCAke3RoaXMuZ2F0ZXdheUNvbmZpZy50b2tlbn1gLFxuICAgICAgICAgIHNlc3Npb25faWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgICAgIHNlcTogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyID8/IDAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfSBhZnRlciBzZW5kIHJlc3VtZ2ApXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdSRVNVTUVEJywgKCkgPT4gcmVzb2x2ZSgpKVxuICAgICAgLy8gSWYgaXQgaXMgYXR0ZW1wdGVkIHRvIHJlc3VtZSB3aXRoIGFuIGludmFsaWQgc2Vzc2lvbiBpZCxcbiAgICAgIC8vIERpc2NvcmQgc2VuZHMgYW4gaW52YWxpZCBzZXNzaW9uIHBheWxvYWRcbiAgICAgIC8vIE5vdCBlcnJvcmluZyBoZXJlIHNpbmNlIGl0IGlzIGVhc3kgdGhhdCB0aGlzIGhhcHBlbnMsIGFsc28gaXQgd291bGQgYmUgbm90IGNhdGNoYWJsZVxuICAgICAgdGhpcy5yZXNvbHZlcy5zZXQoJ0lOVkFMSURfU0VTU0lPTicsICgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFU1VNRUQnKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBTZW5kIGEgbWVzc2FnZSB0byBEaXNjb3JkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtoaWdoUHJpb3JpdHk9ZmFsc2VdIC0gV2hldGhlciB0aGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbmQgYXNhcC5cbiAgICovXG4gIGFzeW5jIHNlbmQobWVzc2FnZTogU2hhcmRTb2NrZXRSZXF1ZXN0LCBoaWdoUHJpb3JpdHk6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEJlZm9yZSBhY3F1aXJpbmcgYSB0b2tlbiBmcm9tIHRoZSBidWNrZXQsIGNoZWNrIHdoZXRoZXIgdGhlIHNoYXJkIGlzIGN1cnJlbnRseSBvZmZsaW5lIG9yIG5vdC5cbiAgICAvLyBFbHNlIGJ1Y2tldCBhbmQgdG9rZW4gd2FpdCB0aW1lIGp1c3QgZ2V0IHdhc3RlZC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHkpXG5cbiAgICBhd2FpdCB0aGlzLmJ1Y2tldC5hY3F1aXJlKGhpZ2hQcmlvcml0eSlcblxuICAgIC8vIEl0J3MgcG9zc2libGUsIHRoYXQgdGhlIHNoYXJkIHdlbnQgb2ZmbGluZSBhZnRlciBhIHRva2VuIGhhcyBiZWVuIGFjcXVpcmVkIGZyb20gdGhlIGJ1Y2tldC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHkpXG5cbiAgICB0aGlzLnNvY2tldD8uc2VuZChKU09OLnN0cmluZ2lmeShtZXNzYWdlKSlcbiAgfVxuXG4gIC8qKiBTaHV0ZG93biB0aGUgdGhpcy4gRm9yY2VmdWxseSBkaXNjb25uZWN0IHRoZSBzaGFyZCBmcm9tIERpc2NvcmQuIFRoZSBzaGFyZCBtYXkgbm90IGF0dGVtcHQgdG8gcmVjb25uZWN0IHdpdGggRGlzY29yZC4gKi9cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuU2h1dGRvd24sICdTaGFyZCBzaHV0dGluZyBkb3duLicpXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICB9XG5cbiAgLyoqIEhhbmRsZSBhIGdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZS4gKi9cbiAgYXN5bmMgaGFuZGxlQ2xvc2UoY2xvc2U6IE5vZGVXZWJTb2NrZXQuQ2xvc2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vICAgZ2F0ZXdheS5kZWJ1ZyhcIkdXIENMT1NFRFwiLCB7IHNoYXJkSWQsIHBheWxvYWQ6IGV2ZW50IH0pO1xuXG4gICAgdGhpcy5zdG9wSGVhcnRiZWF0aW5nKClcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBHYXRld2F5IGNvbm5lY3Rpb24gY2xvc2VkIHdpdGggY29kZSAke2Nsb3NlLmNvZGV9LmApXG5cbiAgICBzd2l0Y2ggKGNsb3NlLmNvZGUpIHtcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlRlc3RpbmdGaW5pc2hlZDoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBPbiB0aGVzZSBjb2RlcyBhIG1hbnVhbCBzdGFydCB3aWxsIGJlIGRvbmUuXG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5TaHV0ZG93bjpcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlSWRlbnRpZnlpbmc6XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXNoYXJkZWQ6XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXN1bWVDbG9zaW5nT2xkQ29ubmVjdGlvbjpcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlpvbWJpZWRDb25uZWN0aW9uOiB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkRpc2Nvbm5lY3RlZFxuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIC8vIGdhdGV3YXkuZGVidWcoXCJHVyBDTE9TRURfUkVDT05ORUNUXCIsIHsgc2hhcmRJZCwgcGF5bG9hZDogZXZlbnQgfSk7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gR2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlcyB3aGljaCByZXF1aXJlIGEgbmV3IGlkZW50aWZ5LlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlVua25vd25PcGNvZGU6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuTm90QXV0aGVudGljYXRlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkU2VxOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlJhdGVMaW1pdGVkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlNlc3Npb25UaW1lZE91dDoge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnW1NoYXJkXSBHYXRld2F5IGNvbm5lY3Rpb24gY2xvc2luZyByZXF1aXJpbmcgcmUtaWRlbnRpZnkuJylcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuSWRlbnRpZnlpbmdcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5pZGVudGlmeSgpXG4gICAgICB9XG4gICAgICAvLyBXaGVuIHRoZXNlIGNvZGVzIGFyZSByZWNlaXZlZCBzb21ldGhpbmcgd2VudCByZWFsbHkgd3JvbmcuXG4gICAgICAvLyBPbiB0aG9zZSB3ZSBjYW5ub3Qgc3RhcnQgYSByZWNvbm5lY3QgYXR0ZW1wdC5cbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5BdXRoZW50aWNhdGlvbkZhaWxlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkU2hhcmQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuU2hhcmRpbmdSZXF1aXJlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkQXBpVmVyc2lvbjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkSW50ZW50czpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5EaXNhbGxvd2VkSW50ZW50czoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNsb3NlLnJlYXNvbiB8fCAnRGlzY29yZCBnYXZlIG5vIHJlYXNvbiEgR0chIFlvdSBicm9rZSBEaXNjb3JkIScpXG4gICAgICB9XG4gICAgICAvLyBHYXRld2F5IGNvbm5lY3Rpb24gY2xvc2VzIG9uIHdoaWNoIGEgcmVzdW1lIGlzIGFsbG93ZWQuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuVW5rbm93bkVycm9yOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkRlY29kZUVycm9yOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkFscmVhZHlBdXRoZW50aWNhdGVkOlxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKGBbU2hhcmRdIENsb3NlZCBzaGFyZCAjJHt0aGlzLmlkfSB3aXRoIGNvZGUgJHtjbG9zZS5jb2RlfS4gQXR0ZW1wdGluZyB0byByZXN1bWUuLi5gKVxuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5SZXN1bWluZ1xuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlc3VtZSgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEhhbmRsZXMgYSBpbmNvbWluZyBnYXRld2F5IHBhY2tldC4gKi9cbiAgYXN5bmMgaGFuZGxlRGlzY29yZFBhY2tldChwYWNrZXQ6IERpc2NvcmRHYXRld2F5UGF5bG9hZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEVkZ2UgY2FzZSBzdGFydDogaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmRlbm8vZGlzY29yZGVuby9pc3N1ZXMvMjMxMVxuICAgIHRoaXMuaGVhcnQubGFzdEFjayA9IERhdGUubm93KClcbiAgICB0aGlzLmhlYXJ0LmFja25vd2xlZGdlZCA9IHRydWVcbiAgICAvLyBFZGdlIGNhc2UgZW5kIVxuXG4gICAgc3dpdGNoIChwYWNrZXQub3ApIHtcbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0OiB7XG4gICAgICAgIC8vIFRPRE86IGNhbiB0aGlzIGFjdHVhbGx5IGhhcHBlblxuICAgICAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVyblxuXG4gICAgICAgIHRoaXMuaGVhcnQubGFzdEJlYXQgPSBEYXRlLm5vdygpXG4gICAgICAgIC8vIERpc2NvcmQgcmFuZG9tbHkgc2VuZHMgdGhpcyByZXF1aXJpbmcgYW4gaW1tZWRpYXRlIGhlYXJ0YmVhdCBiYWNrLlxuICAgICAgICAvLyBVc2luZyBhIGRpcmVjdCBzb2NrZXQuc2VuZCBjYWxsIGhlcmUgYmVjYXVzZSBoZWFydGJlYXQgcmVxdWVzdHMgYXJlIHJlc2VydmVkIGJ5IHVzLlxuICAgICAgICB0aGlzLnNvY2tldD8uc2VuZChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0LFxuICAgICAgICAgICAgZDogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlYXJ0YmVhdD8uKHRoaXMpXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuSGVsbG86IHtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSAocGFja2V0LmQgYXMgRGlzY29yZEhlbGxvKS5oZWFydGJlYXRfaW50ZXJ2YWxcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBIZWxsbyBvbiBTaGFyZCAjJHt0aGlzLmlkfWApXG4gICAgICAgIHRoaXMuc3RhcnRIZWFydGJlYXRpbmcoaW50ZXJ2YWwpXG5cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IFNoYXJkU3RhdGUuUmVzdW1pbmcpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UXVldWUgPSBbLi4udGhpcy5idWNrZXQucXVldWVdXG4gICAgICAgICAgLy8gSEVMTE8gaGFzIGJlZW4gc2VuZCBvbiBhIG5vbiByZXN1bWUgYWN0aW9uLlxuICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgc2hhcmQgc3RhcnRzIGEgbmV3IHNlc3Npb24sXG4gICAgICAgICAgLy8gdGhlcmVmb3JlIHRoZSByYXRlIGxpbWl0IGludGVydmFsIGhhcyBiZWVuIHJlc2V0IHRvby5cbiAgICAgICAgICB0aGlzLmJ1Y2tldCA9IG5ldyBMZWFreUJ1Y2tldCh7XG4gICAgICAgICAgICBtYXg6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICAgICAgICByZWZpbGxJbnRlcnZhbDogNjAwMDAsXG4gICAgICAgICAgICByZWZpbGxBbW91bnQ6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIC8vIFF1ZXVlIHNob3VsZCBub3QgYmUgbG9zdCBvbiBhIHJlLWlkZW50aWZ5LlxuICAgICAgICAgIHRoaXMuYnVja2V0LnF1ZXVlLnVuc2hpZnQoLi4uY3VycmVudFF1ZXVlKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudHMuaGVsbG8/Lih0aGlzKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdEFDSzoge1xuICAgICAgICAvLyBNYW51YWxseSBjYWxjdWxhdGluZyB0aGUgcm91bmQgdHJpcCB0aW1lIGZvciB1c2VycyB3aG8gbmVlZCBpdC5cbiAgICAgICAgaWYgKHRoaXMuaGVhcnQubGFzdEJlYXQpIHtcbiAgICAgICAgICB0aGlzLmhlYXJ0LnJ0dCA9IHRoaXMuaGVhcnQubGFzdEFjayAtIHRoaXMuaGVhcnQubGFzdEJlYXRcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlYXJ0YmVhdEFjaz8uKHRoaXMpXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuUmVjb25uZWN0OiB7XG4gICAgICAgIC8vICAgZ2F0ZXdheS5kZWJ1ZyhcIkdXIFJFQ09OTkVDVFwiLCB7IHNoYXJkSWQgfSk7XG5cbiAgICAgICAgdGhpcy5ldmVudHMucmVxdWVzdGVkUmVjb25uZWN0Py4odGhpcylcblxuICAgICAgICBhd2FpdCB0aGlzLnJlc3VtZSgpXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuSW52YWxpZFNlc3Npb246IHtcbiAgICAgICAgY29uc3QgcmVzdW1hYmxlID0gcGFja2V0LmQgYXMgYm9vbGVhblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBSZWNlaXZlZCBJbnZhbGlkIFNlc3Npb24gZm9yIFNoYXJkICMke3RoaXMuaWR9IHdpdGggcmVzdW1lYWJsZSBhcyAke3Jlc3VtYWJsZS50b1N0cmluZygpfWApXG5cbiAgICAgICAgdGhpcy5ldmVudHMuaW52YWxpZFNlc3Npb24/Lih0aGlzLCByZXN1bWFibGUpXG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB3YWl0IGZvciBhIHJhbmRvbSBhbW91bnQgb2YgdGltZSBiZXR3ZWVuIDEgYW5kIDVcbiAgICAgICAgLy8gUmVmZXJlbmNlOiBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSNyZXN1bWluZ1xuICAgICAgICBhd2FpdCBkZWxheShNYXRoLmZsb29yKChNYXRoLnJhbmRvbSgpICogNCArIDEpICogMTAwMCkpXG5cbiAgICAgICAgdGhpcy5yZXNvbHZlcy5nZXQoJ0lOVkFMSURfU0VTU0lPTicpPy4ocGFja2V0KVxuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnSU5WQUxJRF9TRVNTSU9OJylcblxuICAgICAgICAvLyBXaGVuIHJlc3VtYWJsZSBpcyBmYWxzZSB3ZSBuZWVkIHRvIHJlLWlkZW50aWZ5XG4gICAgICAgIGlmICghcmVzdW1hYmxlKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0SWRlbnRpZnkoKVxuXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBzZXNzaW9uIGlzIGludmFsaWQgYnV0IGFwcGFyZW50bHkgaXQgaXMgcmVzdW1hYmxlXG4gICAgICAgIGF3YWl0IHRoaXMucmVzdW1lKClcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAocGFja2V0LnQpIHtcbiAgICAgIGNhc2UgJ1JFU1VNRUQnOlxuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0ZWRcbiAgICAgICAgdGhpcy5ldmVudHMucmVzdW1lZD8uKHRoaXMpXG5cbiAgICAgICAgLy8gQ29udGludWUgdGhlIHJlcXVlc3RzIHdoaWNoIGhhdmUgYmVlbiBxdWV1ZWQgc2luY2UgdGhlIHNoYXJkIHdlbnQgb2ZmbGluZS5cbiAgICAgICAgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLm1hcCgocmVzb2x2ZSkgPT4gcmVzb2x2ZSgpKVxuXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZ2V0KCdSRVNVTUVEJyk/LihwYWNrZXQpXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRVNVTUVEJylcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ1JFQURZJzoge1xuICAgICAgICAvLyBJbXBvcnRhbnQgZm9yIGZ1dHVyZSByZXN1bWVzLlxuICAgICAgICBjb25zdCBwYXlsb2FkID0gcGFja2V0LmQgYXMgRGlzY29yZFJlYWR5XG5cbiAgICAgICAgdGhpcy5yZXN1bWVHYXRld2F5VXJsID0gcGF5bG9hZC5yZXN1bWVfZ2F0ZXdheV91cmxcblxuICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHBheWxvYWQuc2Vzc2lvbl9pZFxuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0ZWRcblxuICAgICAgICAvLyBDb250aW51ZSB0aGUgcmVxdWVzdHMgd2hpY2ggaGF2ZSBiZWVuIHF1ZXVlZCBzaW5jZSB0aGUgc2hhcmQgd2VudCBvZmZsaW5lLlxuICAgICAgICAvLyBJbXBvcnRhbnQgd2hlbiB0aGlzIGlzIGEgcmUtaWRlbnRpZnlcbiAgICAgICAgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLm1hcCgocmVzb2x2ZSkgPT4gcmVzb2x2ZSgpKVxuXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZ2V0KCdSRUFEWScpPy4ocGFja2V0KVxuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVBRFknKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgc2VxdWVuY2UgbnVtYmVyIGlmIGl0IGlzIHByZXNlbnRcbiAgICAvLyBgc2AgY2FuIGJlIGVpdGhlciBgbnVsbGAgb3IgYSBgbnVtYmVyYC5cbiAgICAvLyBJbiBvcmRlciB0byBwcmV2ZW50IHVwZGF0ZSBtaXNzZXMgd2hlbiBgc2AgaXMgYDBgIHdlIGNoZWNrIGFnYWluc3QgbnVsbC5cbiAgICBpZiAocGFja2V0LnMgIT09IG51bGwpIHtcbiAgICAgIHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlciA9IHBhY2tldC5zXG4gICAgfVxuXG4gICAgdGhpcy5mb3J3YXJkVG9Cb3QocGFja2V0KVxuICB9XG5cbiAgZm9yd2FyZFRvQm90KHBhY2tldDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKTogdm9pZCB7XG4gICAgLy8gVGhlIG5lY2Vzc2FyeSBoYW5kbGluZyByZXF1aXJlZCBmb3IgdGhlIFNoYXJkcyBjb25uZWN0aW9uIGhhcyBiZWVuIGZpbmlzaGVkLlxuICAgIC8vIE5vdyB0aGUgZXZlbnQgY2FuIGJlIHNhZmVseSBmb3J3YXJkZWQuXG4gICAgdGhpcy5ldmVudHMubWVzc2FnZT8uKHRoaXMsIGNhbWVsaXplKHBhY2tldCkpXG4gIH1cblxuICAvKiogSGFuZGxlIGFuIGluY29taW5nIGdhdGV3YXkgbWVzc2FnZS4gKi9cbiAgYXN5bmMgaGFuZGxlTWVzc2FnZShtZXNzYWdlOiBOb2RlV2ViU29ja2V0Lk1lc3NhZ2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBwcmVQcm9jZXNzTWVzc2FnZSA9IG1lc3NhZ2UuZGF0YVxuXG4gICAgLy8gSWYgbWVzc2FnZSBjb21wcmVzc2lvbiBpcyBlbmFibGVkLFxuICAgIC8vIERpc2NvcmQgbWlnaHQgc2VuZCB6bGliIGNvbXByZXNzZWQgcGF5bG9hZHMuXG4gICAgaWYgKHRoaXMuZ2F0ZXdheUNvbmZpZy5jb21wcmVzcyAmJiBwcmVQcm9jZXNzTWVzc2FnZSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgIHByZVByb2Nlc3NNZXNzYWdlID0gaW5mbGF0ZVN5bmMoYXdhaXQgcHJlUHJvY2Vzc01lc3NhZ2UuYXJyYXlCdWZmZXIoKSkudG9TdHJpbmcoKVxuICAgIH1cblxuICAgIC8vIFNhZmVndWFyZCBpbmNhc2UgZGVjb21wcmVzc2lvbiBmYWlsZWQgdG8gbWFrZSBhIHN0cmluZy5cbiAgICBpZiAodHlwZW9mIHByZVByb2Nlc3NNZXNzYWdlICE9PSAnc3RyaW5nJykgcmV0dXJuXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVEaXNjb3JkUGFja2V0KEpTT04ucGFyc2UocHJlUHJvY2Vzc01lc3NhZ2UpIGFzIERpc2NvcmRHYXRld2F5UGF5bG9hZClcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBpbiBvcmRlciB0byBtYWtlIHRoZSBzaGFyZHMgcHJlc2VuY2UuXG4gICAqIGFzeW5jIGluIGNhc2UgZGV2cyBjcmVhdGUgdGhlIHByZXNlbmNlIGJhc2VkIG9uIGVnLiBkYXRhYmFzZSB2YWx1ZXMuXG4gICAqIFBhc3NpbmcgdGhlIHNoYXJkJ3MgaWQgdGhlcmUgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHRoZSBkZXYgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXG4gICAqL1xuICBhc3luYyBtYWtlUHJlc2VuY2UoKTogUHJvbWlzZTxCb3RTdGF0dXNVcGRhdGUgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1yZXR1cm5cbiAgICByZXR1cm5cbiAgfVxuXG4gIC8qKiBUaGlzIGZ1bmN0aW9uIGNvbW11bmljYXRlcyB3aXRoIHRoZSBtYW5hZ2VtZW50IHByb2Nlc3MsIGluIG9yZGVyIHRvIGtub3cgd2hldGhlciBpdHMgZnJlZSB0byBpZGVudGlmeS4gV2hlbiB0aGlzIGZ1bmN0aW9uIHJlc29sdmVzLCB0aGlzIG1lYW5zIHRoYXQgdGhlIHNoYXJkIGlzIGFsbG93ZWQgdG8gc2VuZCBhbiBpZGVudGlmeSBwYXlsb2FkIHRvIGRpc2NvcmQuICovXG4gIGFzeW5jIHJlcXVlc3RJZGVudGlmeSgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gY29tbXVuaWNhdGVzIHdpdGggdGhlIG1hbmFnZW1lbnQgcHJvY2VzcywgaW4gb3JkZXIgdG8gdGVsbCBpdCBjYW4gaWRlbnRpZnkgdGhlIG5leHQgc2hhcmQuICovXG4gIGFzeW5jIHNoYXJkSXNSZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIFN0YXJ0IHNlbmRpbmcgaGVhcnRiZWF0IHBheWxvYWRzIHRvIERpc2NvcmQgaW4gdGhlIHByb3ZpZGVkIGludGVydmFsLiAqL1xuICBzdGFydEhlYXJ0YmVhdGluZyhpbnRlcnZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH1gKVxuICAgIC8vIElmIG9sZCBoZWFydGJlYXN0IGV4aXN0IGxpa2UgYWZ0ZXIgcmVzdW1lLCBjbGVhciB0aGUgb2xkIG9uZXMuXG4gICAgaWYgKHRoaXMuaGVhcnQuaW50ZXJ2YWxJZCkgY2xlYXJJbnRlcnZhbCh0aGlzLmhlYXJ0LmludGVydmFsSWQpXG4gICAgaWYgKHRoaXMuaGVhcnQudGltZW91dElkKSBjbGVhclRpbWVvdXQodGhpcy5oZWFydC50aW1lb3V0SWQpXG5cbiAgICB0aGlzLmhlYXJ0LmludGVydmFsID0gaW50ZXJ2YWxcblxuICAgIC8vIE9ubHkgc2V0IHRoZSBzaGFyZCdzIHN0YXRlIHRvIGBVbmlkZW50aWZpZWRgXG4gICAgLy8gaWYgaGVhcnRiZWF0aW5nIGhhcyBub3QgYmVlbiBzdGFydGVkIGR1ZSB0byBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgIGlmIChbU2hhcmRTdGF0ZS5EaXNjb25uZWN0ZWQsIFNoYXJkU3RhdGUuT2ZmbGluZV0uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gU3RhcnQgSGVhcnRiZWF0aW5nIFNoYXJkICMke3RoaXMuaWR9IGFgKVxuICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuVW5pZGVudGlmaWVkXG4gICAgfVxuXG4gICAgLy8gVGhlIGZpcnN0IGhlYXJ0YmVhdCBuZWVkcyB0byBiZSBzZW5kIHdpdGggYSByYW5kb20gZGVsYXkgYmV0d2VlbiBgMGAgYW5kIGBpbnRlcnZhbGBcbiAgICAvLyBVc2luZyBhIGBzZXRUaW1lb3V0KF8sIGppdHRlcilgIGhlcmUgdG8gYWNjb21wbGlzaCB0aGF0LlxuICAgIC8vIGBNYXRoLnJhbmRvbSgpYCBjYW4gYmUgYDBgIHNvIHdlIHVzZSBgMC41YCBpZiB0aGlzIGhhcHBlbnNcbiAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I2hlYXJ0YmVhdGluZ1xuICAgIGNvbnN0IGppdHRlciA9IE1hdGguY2VpbCh0aGlzLmhlYXJ0LmludGVydmFsICogKE1hdGgucmFuZG9tKCkgfHwgMC41KSlcbiAgICB0aGlzLmhlYXJ0LnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH0gYmApXG4gICAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVyblxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH0gYyAke3RoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlciF9YClcblxuICAgICAgLy8gVXNpbmcgYSBkaXJlY3Qgc29ja2V0LnNlbmQgY2FsbCBoZXJlIGJlY2F1c2UgaGVhcnRiZWF0IHJlcXVlc3RzIGFyZSByZXNlcnZlZCBieSB1cy5cbiAgICAgIHRoaXMuc29ja2V0Py5zZW5kKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdCxcbiAgICAgICAgICBkOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgIH0pLFxuICAgICAgKVxuXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBkYClcbiAgICAgIHRoaXMuaGVhcnQubGFzdEJlYXQgPSBEYXRlLm5vdygpXG4gICAgICB0aGlzLmhlYXJ0LmFja25vd2xlZGdlZCA9IGZhbHNlXG5cbiAgICAgIC8vIEFmdGVyIHRoZSByYW5kb20gaGVhcnRiZWF0IGppdHRlciB3ZSBjYW4gc3RhcnQgYSBub3JtYWwgaW50ZXJ2YWwuXG4gICAgICB0aGlzLmhlYXJ0LmludGVydmFsSWQgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gU3RhcnQgSGVhcnRiZWF0aW5nIFNoYXJkICMke3RoaXMuaWR9IGVgKVxuICAgICAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVyblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBmYClcbiAgICAgICAgLy8gZ2F0ZXdheS5kZWJ1ZyhcIkdXIERFQlVHXCIsIGBSdW5uaW5nIHNldEludGVydmFsIGluIGhlYXJ0YmVhdCBmaWxlLiBTaGFyZDogJHtzaGFyZElkfWApO1xuXG4gICAgICAgIC8vIGdhdGV3YXkuZGVidWcoXCJHVyBIRUFSVEJFQVRJTkdcIiwgeyBzaGFyZElkLCBzaGFyZDogY3VycmVudFNoYXJkIH0pO1xuXG4gICAgICAgIC8vIFRoZSBTaGFyZCBkaWQgbm90IHJlY2VpdmUgYSBoZWFydGJlYXQgQUNLIGZyb20gRGlzY29yZCBpbiB0aW1lLFxuICAgICAgICAvLyB0aGVyZWZvcmUgd2UgaGF2ZSB0byBhc3N1bWUgdGhhdCB0aGUgY29ubmVjdGlvbiBoYXMgZmFpbGVkIG9yIGdvdCBcInpvbWJpZWRcIi5cbiAgICAgICAgLy8gVGhlIFNoYXJkIG5lZWRzIHRvIHN0YXJ0IGEgcmUtaWRlbnRpZnkgYWN0aW9uIGFjY29yZGluZ2x5LlxuICAgICAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I2hlYXJ0YmVhdGluZy1leGFtcGxlLWdhdGV3YXktaGVhcnRiZWF0LWFja1xuICAgICAgICBpZiAoIXRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gSGVhcnRiZWF0IG5vdCBhY2tub3dsZWRnZWQgZm9yIHNoYXJkICMke3RoaXMuaWR9LmApXG4gICAgICAgICAgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuWm9tYmllZENvbm5lY3Rpb24sICdab21iaWVkIGNvbm5lY3Rpb24sIGRpZCBub3QgcmVjZWl2ZSBhbiBoZWFydGJlYXQgQUNLIGluIHRpbWUuJylcblxuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmlkZW50aWZ5KClcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gZmFsc2VcblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBnYClcbiAgICAgICAgLy8gVXNpbmcgYSBkaXJlY3Qgc29ja2V0LnNlbmQgY2FsbCBoZXJlIGJlY2F1c2UgaGVhcnRiZWF0IHJlcXVlc3RzIGFyZSByZXNlcnZlZCBieSB1cy5cbiAgICAgICAgdGhpcy5zb2NrZXQ/LnNlbmQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdCxcbiAgICAgICAgICAgIGQ6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBoYClcblxuICAgICAgICB0aGlzLmhlYXJ0Lmxhc3RCZWF0ID0gRGF0ZS5ub3coKVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlYXJ0YmVhdD8uKHRoaXMpXG4gICAgICB9LCB0aGlzLmhlYXJ0LmludGVydmFsKVxuICAgIH0sIGppdHRlcilcbiAgfVxuXG4gIC8qKiBTdG9wIHRoZSBoZWFydGJlYXRpbmcgcHJvY2VzcyB3aXRoIGRpc2NvcmQuICovXG4gIHN0b3BIZWFydGJlYXRpbmcoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgdGhlIHJlZ3VsYXIgaGVhcnRiZWF0IGludGVydmFsLlxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydC5pbnRlcnZhbElkKVxuICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgU2hhcmQgZ290IGNsb3NlZCBiZWZvcmUgdGhlIGZpcnN0IGppdHRlcmVkIGhlYXJ0YmVhdC5cbiAgICAvLyBUbyBnbyBzYWZlIHdlIHNob3VsZCBjbGVhciB0aGUgcmVsYXRlZCB0aW1lb3V0IHRvby5cbiAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydC50aW1lb3V0SWQpXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGFyZENyZWF0ZU9wdGlvbnMge1xuICAvKiogVGhlIHNoYXJkIGlkICovXG4gIGlkOiBudW1iZXJcbiAgLyoqIFRoZSBjb25uZWN0aW9uIGRldGFpbHMgKi9cbiAgY29ubmVjdGlvbjogU2hhcmRHYXRld2F5Q29uZmlnXG4gIC8qKiBUaGUgZXZlbnQgaGFuZGxlcnMgZm9yIGV2ZW50cyBvbiB0aGUgc2hhcmQuICovXG4gIGV2ZW50czogU2hhcmRFdmVudHNcbiAgLyoqIFRoZSBsb2dnZXIgZm9yIHRoZSBzaGFyZCAqL1xuICBsb2dnZXI/OiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cbiAgLyoqIFRoZSBoYW5kbGVyIHRvIHJlcXVlc3QgYSBzcGFjZSB0byBtYWtlIGFuIGlkZW50aWZ5IHJlcXVlc3QuICovXG4gIHJlcXVlc3RJZGVudGlmeT86ICgpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFRoZSBoYW5kbGVyIHRvIGFsZXJ0IHRoZSBnYXRld2F5IG1hbmFnZXIgdGhhdCB0aGlzIHNoYXJkIGhhcyByZWNlaXZlZCBhIFJFQURZIGV2ZW50LiAqL1xuICBzaGFyZElzUmVhZHk/OiAoKSA9PiBQcm9taXNlPHZvaWQ+XG59XG5cbmV4cG9ydCBkZWZhdWx0IERpc2NvcmRlbm9TaGFyZFxuIl0sIm5hbWVzIjpbIkRpc2NvcmRlbm9TaGFyZCIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsIm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayIsInByZXZpb3VzU2VxdWVuY2VOdW1iZXIiLCJyYXRlTGltaXRSZXNldEludGVydmFsIiwic3RhdGUiLCJTaGFyZFN0YXRlIiwiT2ZmbGluZSIsInJlc3VtZUdhdGV3YXlVcmwiLCJldmVudHMiLCJvZmZsaW5lU2VuZFF1ZXVlIiwicmVzb2x2ZXMiLCJNYXAiLCJpZCIsImNvbm5lY3Rpb24iLCJsb2dnZXIiLCJoZWFydCIsImFja25vd2xlZGdlZCIsImludGVydmFsIiwicmVxdWVzdElkZW50aWZ5Iiwic2hhcmRJc1JlYWR5IiwiYnVja2V0IiwiTGVha3lCdWNrZXQiLCJtYXgiLCJjYWxjdWxhdGVTYWZlUmVxdWVzdHMiLCJyZWZpbGxBbW91bnQiLCJyZWZpbGxJbnRlcnZhbCIsImdhdGV3YXlDb25maWciLCJjb25uZWN0aW9uVXJsIiwidXJsIiwic2FmZVJlcXVlc3RzIiwiTWF0aCIsImNlaWwiLCJjaGVja09mZmxpbmUiLCJoaWdoUHJpb3JpdHkiLCJpc09wZW4iLCJQcm9taXNlIiwicmVzb2x2ZSIsInVuc2hpZnQiLCJwdXNoIiwiY2xvc2UiLCJjb2RlIiwicmVhc29uIiwic29ja2V0IiwicmVhZHlTdGF0ZSIsIk5vZGVXZWJTb2NrZXQiLCJPUEVOIiwiY29ubmVjdCIsIklkZW50aWZ5aW5nIiwiUmVzdW1pbmciLCJpbmNsdWRlcyIsIkNvbm5lY3RpbmciLCJjb25uZWN0aW5nIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwic2V0IiwidmVyc2lvbiIsInRvU3RyaW5nIiwiZ2xvYmFsVGhpcyIsIkRlbm8iLCJ1bmRlZmluZWQiLCJSZWZsZWN0IiwiaGFzIiwiV2ViU29ja2V0Iiwib25lcnJvciIsImV2ZW50IiwiY29uc29sZSIsImxvZyIsImVycm9yIiwic2hhcmRJZCIsIm9uY2xvc2UiLCJoYW5kbGVDbG9zZSIsIm9ubWVzc2FnZSIsIm1lc3NhZ2UiLCJoYW5kbGVNZXNzYWdlIiwib25vcGVuIiwiVW5pZGVudGlmaWVkIiwiY29ubmVjdGVkIiwiaWRlbnRpZnkiLCJkZWJ1ZyIsIlNoYXJkU29ja2V0Q2xvc2VDb2RlcyIsIlJlSWRlbnRpZnlpbmciLCJpZGVudGlmeWluZyIsInNlbmQiLCJvcCIsIkdhdGV3YXlPcGNvZGVzIiwiSWRlbnRpZnkiLCJkIiwidG9rZW4iLCJjb21wcmVzcyIsInByb3BlcnRpZXMiLCJpbnRlbnRzIiwic2hhcmQiLCJ0b3RhbFNoYXJkcyIsInByZXNlbmNlIiwibWFrZVByZXNlbmNlIiwiaWRlbnRpZmllZCIsImRlbGV0ZSIsInJlc3VtZSIsIlJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uIiwic2Vzc2lvbklkIiwiUmVzdW1lIiwic2Vzc2lvbl9pZCIsInNlcSIsImFjcXVpcmUiLCJKU09OIiwic3RyaW5naWZ5Iiwic2h1dGRvd24iLCJTaHV0ZG93biIsInN0b3BIZWFydGJlYXRpbmciLCJUZXN0aW5nRmluaXNoZWQiLCJkaXNjb25uZWN0ZWQiLCJSZXNoYXJkZWQiLCJab21iaWVkQ29ubmVjdGlvbiIsIkRpc2Nvbm5lY3RlZCIsIkdhdGV3YXlDbG9zZUV2ZW50Q29kZXMiLCJVbmtub3duT3Bjb2RlIiwiTm90QXV0aGVudGljYXRlZCIsIkludmFsaWRTZXEiLCJSYXRlTGltaXRlZCIsIlNlc3Npb25UaW1lZE91dCIsIkF1dGhlbnRpY2F0aW9uRmFpbGVkIiwiSW52YWxpZFNoYXJkIiwiU2hhcmRpbmdSZXF1aXJlZCIsIkludmFsaWRBcGlWZXJzaW9uIiwiSW52YWxpZEludGVudHMiLCJEaXNhbGxvd2VkSW50ZW50cyIsIkVycm9yIiwiVW5rbm93bkVycm9yIiwiRGVjb2RlRXJyb3IiLCJBbHJlYWR5QXV0aGVudGljYXRlZCIsImluZm8iLCJoYW5kbGVEaXNjb3JkUGFja2V0IiwicGFja2V0IiwibGFzdEFjayIsIkRhdGUiLCJub3ciLCJIZWFydGJlYXQiLCJsYXN0QmVhdCIsImhlYXJ0YmVhdCIsIkhlbGxvIiwiaGVhcnRiZWF0X2ludGVydmFsIiwic3RhcnRIZWFydGJlYXRpbmciLCJjdXJyZW50UXVldWUiLCJxdWV1ZSIsImhlbGxvIiwiSGVhcnRiZWF0QUNLIiwicnR0IiwiaGVhcnRiZWF0QWNrIiwiUmVjb25uZWN0IiwicmVxdWVzdGVkUmVjb25uZWN0IiwiSW52YWxpZFNlc3Npb24iLCJyZXN1bWFibGUiLCJpbnZhbGlkU2Vzc2lvbiIsImRlbGF5IiwiZmxvb3IiLCJyYW5kb20iLCJnZXQiLCJ0IiwiQ29ubmVjdGVkIiwicmVzdW1lZCIsIm1hcCIsInBheWxvYWQiLCJyZXN1bWVfZ2F0ZXdheV91cmwiLCJzIiwiZm9yd2FyZFRvQm90IiwiY2FtZWxpemUiLCJwcmVQcm9jZXNzTWVzc2FnZSIsImRhdGEiLCJCbG9iIiwiaW5mbGF0ZVN5bmMiLCJhcnJheUJ1ZmZlciIsInBhcnNlIiwiaW50ZXJ2YWxJZCIsImNsZWFySW50ZXJ2YWwiLCJ0aW1lb3V0SWQiLCJjbGVhclRpbWVvdXQiLCJqaXR0ZXIiLCJzZXRUaW1lb3V0Iiwic2V0SW50ZXJ2YWwiXSwibWFwcGluZ3Mi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