@discordeno/gateway 21.0.1-next.4d19305 → 21.0.1-next.511022f

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/dist/esm/Shard.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { Buffer } from 'node:buffer';
2
2
  import { createInflate, inflateSync, constants as zlibConstants } from 'node:zlib';
3
3
  import { GatewayCloseEventCodes, GatewayOpcodes } from '@discordeno/types';
4
- import { LeakyBucket, camelize, delay, logger } from '@discordeno/utils';
4
+ import { camelize, delay, LeakyBucket, logger } from '@discordeno/utils';
5
5
  import NodeWebSocket from 'ws';
6
6
  import { ShardSocketCloseCodes, ShardState, TransportCompression } from './types.js';
7
7
  const ZLIB_SYNC_FLUSH = new Uint8Array([
@@ -212,7 +212,6 @@ export class DiscordenoShard {
212
212
  }, true);
213
213
  return await new Promise((resolve)=>{
214
214
  this.resolves.set('READY', ()=>{
215
- this.events.identified?.(this);
216
215
  resolve();
217
216
  });
218
217
  // When identifying too fast, Discord sends an invalid session payload.
@@ -511,6 +510,7 @@ export class DiscordenoShard {
511
510
  case 'READY':
512
511
  {
513
512
  const payload = packet.d;
513
+ this.events.ready?.(this);
514
514
  // Important for future resumes.
515
515
  this.resumeGatewayUrl = payload.resume_gateway_url;
516
516
  this.sessionId = payload.session_id;
@@ -624,4 +624,4 @@ export class DiscordenoShard {
624
624
  }
625
625
  export default DiscordenoShard;
626
626
 
627
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TaGFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdub2RlOmJ1ZmZlcidcbmltcG9ydCB7IHR5cGUgSW5mbGF0ZSwgY3JlYXRlSW5mbGF0ZSwgaW5mbGF0ZVN5bmMsIGNvbnN0YW50cyBhcyB6bGliQ29uc3RhbnRzIH0gZnJvbSAnbm9kZTp6bGliJ1xuaW1wb3J0IHR5cGUgeyBEaXNjb3JkR2F0ZXdheVBheWxvYWQsIERpc2NvcmRIZWxsbywgRGlzY29yZFJlYWR5LCBEaXNjb3JkVXBkYXRlUHJlc2VuY2UgfSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB7IEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMsIEdhdGV3YXlPcGNvZGVzIH0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnXG5pbXBvcnQgeyBMZWFreUJ1Y2tldCwgY2FtZWxpemUsIGRlbGF5LCBsb2dnZXIgfSBmcm9tICdAZGlzY29yZGVuby91dGlscydcbmltcG9ydCB0eXBlIHsgRGVjb21wcmVzcyBhcyBac3RkRGVjb21wcmVzcyB9IGZyb20gJ2Z6c3RkJ1xuaW1wb3J0IE5vZGVXZWJTb2NrZXQgZnJvbSAnd3MnXG5pbXBvcnQge1xuICB0eXBlIFNoYXJkRXZlbnRzLFxuICB0eXBlIFNoYXJkR2F0ZXdheUNvbmZpZyxcbiAgdHlwZSBTaGFyZEhlYXJ0LFxuICBTaGFyZFNvY2tldENsb3NlQ29kZXMsXG4gIHR5cGUgU2hhcmRTb2NrZXRSZXF1ZXN0LFxuICBTaGFyZFN0YXRlLFxuICBUcmFuc3BvcnRDb21wcmVzc2lvbixcbn0gZnJvbSAnLi90eXBlcy5qcydcblxuY29uc3QgWkxJQl9TWU5DX0ZMVVNIID0gbmV3IFVpbnQ4QXJyYXkoWzB4MCwgMHgwLCAweGZmLCAweGZmXSlcblxubGV0IGZ6c3RkOiB0eXBlb2YgaW1wb3J0KCdmenN0ZCcpXG5cbi8qKiBTaW5jZSBmenN0ZCBpcyBhbiBvcHRpb25hbCBkZXBlbmRlbmN5LCB3ZSBuZWVkIHRvIGltcG9ydCBpdCBsYXppbHkuICovXG5hc3luYyBmdW5jdGlvbiBnZXRGWlN0ZCgpIHtcbiAgcmV0dXJuIChmenN0ZCA/Pz0gYXdhaXQgaW1wb3J0KCdmenN0ZCcpKVxufVxuXG5leHBvcnQgY2xhc3MgRGlzY29yZGVub1NoYXJkIHtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgc2hhcmQuICovXG4gIGlkOiBudW1iZXJcbiAgLyoqIFRoZSBjb25uZWN0aW9uIGNvbmZpZyBkZXRhaWxzIHRoYXQgdGhpcyBzaGFyZCB3aWxsIHVzZWQgdG8gY29ubmVjdCB0byBkaXNjb3JkLiAqL1xuICBjb25uZWN0aW9uOiBTaGFyZEdhdGV3YXlDb25maWdcbiAgLyoqIFRoaXMgY29udGFpbnMgYWxsIHRoZSBoZWFydGJlYXQgaW5mb3JtYXRpb24gKi9cbiAgaGVhcnQ6IFNoYXJkSGVhcnRcbiAgLyoqIFRoZSBtYXhpbXVtIG9mIHJlcXVlc3RzIHdoaWNoIGNhbiBiZSBzZW5kIHRvIGRpc2NvcmQgcGVyIHJhdGUgbGltaXQgdGljay4gVHlwaWNhbGx5IHRoaXMgdmFsdWUgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkLiAqL1xuICBtYXhSZXF1ZXN0c1BlclJhdGVMaW1pdFRpY2s6IG51bWJlciA9IDEyMFxuICAvKiogVGhlIHByZXZpb3VzIHBheWxvYWQgc2VxdWVuY2UgbnVtYmVyLiAqL1xuICBwcmV2aW91c1NlcXVlbmNlTnVtYmVyOiBudW1iZXIgfCBudWxsID0gbnVsbFxuICAvKiogSW4gd2hpY2ggaW50ZXJ2YWwgKGluIG1pbGxpc2Vjb25kcykgdGhlIGdhdGV3YXkgcmVzZXRzIGl0J3MgcmF0ZSBsaW1pdC4gKi9cbiAgcmF0ZUxpbWl0UmVzZXRJbnRlcnZhbDogbnVtYmVyID0gNjAwMDBcbiAgLyoqIEN1cnJlbnQgc2Vzc2lvbiBpZCBvZiB0aGUgc2hhcmQgaWYgcHJlc2VudC4gKi9cbiAgc2Vzc2lvbklkPzogc3RyaW5nXG4gIC8qKiBUaGlzIGNvbnRhaW5zIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byBEaXNjb3JkLCBpZiBjdXJyZW50bHkgY29ubmVjdGVkLiAqL1xuICBzb2NrZXQ/OiBXZWJTb2NrZXRcbiAgLyoqIEN1cnJlbnQgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHRoaXMuICovXG4gIHN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gIC8qKiBUaGUgdXJsIHByb3ZpZGVkIGJ5IGRpc2NvcmQgdG8gdXNlIHdoZW4gcmVzdW1pbmcgYSBjb25uZWN0aW9uIGZvciB0aGlzIHRoaXMuICovXG4gIHJlc3VtZUdhdGV3YXlVcmw6IHN0cmluZyA9ICcnXG4gIC8qKiBUaGUgc2hhcmQgcmVsYXRlZCBldmVudCBoYW5kbGVycy4gKi9cbiAgZXZlbnRzOiBTaGFyZEV2ZW50cyA9IHt9XG4gIC8qKiBDYWNoZSBmb3IgcGVuZGluZyBnYXRld2F5IHJlcXVlc3RzIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gc2VuZCB3aGlsZSB0aGUgZ2F0ZXdheSB3ZW50IG9mZmxpbmUuICovXG4gIG9mZmxpbmVTZW5kUXVldWU6ICgoKSA9PiB2b2lkKVtdID0gW11cbiAgLyoqIFJlc29sdmUgaW50ZXJuYWwgd2FpdGluZyBzdGF0ZXMuIE1hcHBlZCBieSBTZWxlY3RlZEV2ZW50cyA9PiBSZXNvbHZlRnVuY3Rpb24gKi9cbiAgcmVzb2x2ZXMgPSBuZXcgTWFwPCdSRUFEWScgfCAnUkVTVU1FRCcgfCAnSU5WQUxJRF9TRVNTSU9OJywgKHBheWxvYWQ6IERpc2NvcmRHYXRld2F5UGF5bG9hZCkgPT4gdm9pZD4oKVxuICAvKiogU2hhcmQgYnVja2V0LiBPbmx5IGFjY2VzcyB0aGlzIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4gQnVja2V0IGZvciBoYW5kbGluZyBzaGFyZCByZXF1ZXN0IHJhdGUgbGltaXRzLiAqL1xuICBidWNrZXQ6IExlYWt5QnVja2V0XG4gIC8qKiBMb2dnZXIgZm9yIHRoZSBidWNrZXQuICovXG4gIGxvZ2dlcjogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+XG4gIC8qKlxuICAgKiBJcyB0aGUgc2hhcmQgZ29pbmcgb2ZmbGluZT9cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVGhpcyB3aWxsIGJlIHRydWUgaWYgdGhlIGNsb3NlIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgd2l0aCBlaXRoZXIgMTAwMCBvciAxMDAxXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBUaGlzIGlzIGZvciBpbnRlcm5hbCBwdXJwb3NlcyBvbmx5LCBhbmQgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzLlxuICAgKi9cbiAgZ29pbmdPZmZsaW5lID0gZmFsc2VcbiAgLyoqIFRleHQgZGVjb2RlciB1c2VkIGZvciBjb21wcmVzc2VkIHBheWxvYWRzLiAqL1xuICB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gIC8qKiBaTGliIEluZmxhdGUgaW5zdGFuY2UgZm9yIFpMaWItc3RyZWFtIHRyYW5zcG9ydCBwYXlsb2Fkcy4gKi9cbiAgaW5mbGF0ZT86IEluZmxhdGVcbiAgLyoqIFpMaWIgaW5mbGF0ZSBidWZmZXIuICovXG4gIGluZmxhdGVCdWZmZXI6IFVpbnQ4QXJyYXkgfCBudWxsID0gbnVsbFxuICAvKiogWlN0ZCBEZWNvbXByZXNzIGluc3RhbmNlIGZvciBaU3RkLXN0cmVhbSB0cmFuc3BvcnQgcGF5bG9hZHMuICovXG4gIHpzdGREZWNvbXByZXNzPzogWnN0ZERlY29tcHJlc3NcbiAgLyoqIFF1ZXVlIGZvciBjb21wcmVzc2VkIHBheWxvYWRzIGZvciBac3RkIERlY29tcHJlc3MgKi9cbiAgZGVjb21wcmVzc2lvblByb21pc2VzUXVldWU6ICgoZGF0YTogRGlzY29yZEdhdGV3YXlQYXlsb2FkKSA9PiB2b2lkKVtdID0gW11cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbmNlIHRoZSBzb2NrZXQgaXMgY2xvc2VkIGFuZCBoYW5kbGVDbG9zZSgpIGhhcyBmaW5pc2hlZCB1cGRhdGluZyBpbnRlcm5hbCBzdGF0ZXMuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBUaGlzIGlzIGZvciBpbnRlcm5hbCBwdXJwb3NlcyBvbmx5LCBhbmQgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzLlxuICAgKi9cbiAgcmVzb2x2ZUFmdGVyQ2xvc2U/OiAoY2xvc2U6IENsb3NlRXZlbnQpID0+IHZvaWRcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTaGFyZENyZWF0ZU9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZFxuICAgIHRoaXMuY29ubmVjdGlvbiA9IG9wdGlvbnMuY29ubmVjdGlvblxuICAgIHRoaXMuZXZlbnRzID0gb3B0aW9ucy5ldmVudHNcbiAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyID8/IGxvZ2dlclxuXG4gICAgdGhpcy5oZWFydCA9IHtcbiAgICAgIGFja25vd2xlZGdlZDogZmFsc2UsXG4gICAgICBpbnRlcnZhbDogNDUwMDAsXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucmVxdWVzdElkZW50aWZ5KSB0aGlzLnJlcXVlc3RJZGVudGlmeSA9IG9wdGlvbnMucmVxdWVzdElkZW50aWZ5XG4gICAgaWYgKG9wdGlvbnMubWFrZVByZXNlbmNlKSB0aGlzLm1ha2VQcmVzZW5jZSA9IG9wdGlvbnMubWFrZVByZXNlbmNlXG5cbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBMZWFreUJ1Y2tldCh7XG4gICAgICBtYXg6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxBbW91bnQ6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxJbnRlcnZhbDogNjAwMDAsXG4gICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgIH0pXG4gIH1cblxuICAvKiogVGhlIGdhdGV3YXkgY29uZmlndXJhdGlvbiB3aGljaCBpcyB1c2VkIHRvIGNvbm5lY3QgdG8gRGlzY29yZC4gKi9cbiAgZ2V0IGdhdGV3YXlDb25maWcoKTogU2hhcmRHYXRld2F5Q29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uXG4gIH1cblxuICAvKiogVGhlIHVybCB0byBjb25uZWN0IHRvLiBJbml0aWFsbHkgdGhpcyBpcyB0aGUgZGlzY29yZCBnYXRld2F5IHVybCwgYW5kIHRoZW4gaXMgc3dpdGNoZWQgdG8gcmVzdW1lIGdhdGV3YXkgdXJsIG9uY2UgYSBSRUFEWSBpcyByZWNlaXZlZC4gKi9cbiAgZ2V0IGNvbm5lY3Rpb25VcmwoKTogc3RyaW5nIHtcbiAgICAvLyBVc2UgfHwgYW5kIG5vdCA/PyBoZXJlLiA/PyB3aWxsIGNhdXNlIGEgYnVnLlxuICAgIHJldHVybiB0aGlzLnJlc3VtZUdhdGV3YXlVcmwgfHwgdGhpcy5nYXRld2F5Q29uZmlnLnVybFxuICB9XG5cbiAgLyoqIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHJlcXVlc3RzIHdoaWNoIGNhbiBzYWZlbHkgYmUgbWFkZSBwZXIgcmF0ZSBsaW1pdCBpbnRlcnZhbCwgYmVmb3JlIHRoZSBnYXRld2F5IGdldHMgZGlzY29ubmVjdGVkIGR1ZSB0byBhbiBleGNlZWRlZCByYXRlIGxpbWl0LiAqL1xuICBjYWxjdWxhdGVTYWZlUmVxdWVzdHMoKTogbnVtYmVyIHtcbiAgICAvLyAqIDIgYWRkcyBleHRyYSBzYWZldHkgbGF5ZXIgZm9yIGRpc2NvcmRzIE9QIDEgcmVxdWVzdHMgdGhhdCB3ZSBuZWVkIHRvIHJlc3BvbmQgdG9cbiAgICBjb25zdCBzYWZlUmVxdWVzdHMgPSB0aGlzLm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayAtIE1hdGguY2VpbCh0aGlzLnJhdGVMaW1pdFJlc2V0SW50ZXJ2YWwgLyB0aGlzLmhlYXJ0LmludGVydmFsKSAqIDJcblxuICAgIHJldHVybiBzYWZlUmVxdWVzdHMgPCAwID8gMCA6IHNhZmVSZXF1ZXN0c1xuICB9XG5cbiAgYXN5bmMgY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzT3BlbigpKSByZXR1cm5cblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gSGlnaGVyIHByaW9yaXR5IHJlcXVlc3RzIGdldCBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS5cbiAgICAgIGlmIChoaWdoUHJpb3JpdHkpIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS51bnNoaWZ0KHJlc29sdmUpXG4gICAgICBlbHNlIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5wdXNoKHJlc29sdmUpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgc29ja2V0IGNvbm5lY3Rpb24gdG8gZGlzY29yZCBpZiBwcmVzZW50LiAqL1xuICBhc3luYyBjbG9zZShjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gUmVxdWVzdCBmb3IgU2hhcmQgIyR7dGhpcy5pZH0gdG8gY2xvc2UgdGhlIHNvY2tldCB3aXRoIGNvZGUgJHtjb2RlfS5gKVxuXG4gICAgaWYgKHRoaXMuc29ja2V0Py5yZWFkeVN0YXRlICE9PSBOb2RlV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9J3MgcmVhZHkgc3RhdGUgaXMgJHt0aGlzLnNvY2tldD8ucmVhZHlTdGF0ZX0sIFVuYWJsZSB0byBjbG9zZS5gKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5nb2luZ09mZmxpbmUgPSBjb2RlID09PSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLk5vcm1hbENsb3N1cmUgfHwgY29kZSA9PT0gR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Hb2luZ0F3YXlcblxuICAgIC8vIFRoaXMgaGFzIHRvIGJlIGNyZWF0ZWQgYmVmb3JlIHRoZSBhY3R1YWwgY2FsbCB0byBzb2NrZXQuY2xvc2UgYXMgZm9yIGV4YW1wbGUgQnVuIGNhbGxzIHNvY2tldC5vbmNsb3NlIGltbWVkaWF0ZWx5IG9uIHRoZSAuY2xvc2UoKSBjYWxsIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlIGNvbm5lY3Rpb24gdG8gZW5kXG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVBZnRlckNsb3NlID0gcmVzb2x2ZVxuICAgIH0pXG5cbiAgICB0aGlzLnNvY2tldC5jbG9zZShjb2RlLCByZWFzb24pXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBXYWl0aW5nIGZvciBTaGFyZCAjJHt0aGlzLmlkfSB0byBjbG9zZSB0aGUgc29ja2V0IHdpdGggY29kZSAke2NvZGV9LmApXG5cbiAgICAvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgZnVsbHkgY2xvc2VkLCBvdGhlcndpc2UgdGhlcmUnbGwgYmUgcmFjZSBjb25kaXRpb24gaXNzdWVzIGlmIHdlIHRyeSB0byBjb25uZWN0IGFnYWluLCByZXN1bHRpbmcgaW4gdW5leHBlY3RlZCBiZWhhdmlvci5cbiAgICBhd2FpdCBwcm9taXNlXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCAjJHt0aGlzLmlkfSBjbG9zZWQgdGhlIHNvY2tldCB3aXRoIGNvZGUgJHtjb2RlfS5gKVxuXG4gICAgLy8gUmVzZXQgdGhlIHJlc29sdmVBZnRlckNsb3NlIGZ1bmN0aW9uIGFmdGVyIGl0IGhhcyBiZWVuIHJlc29sdmVkLlxuICAgIHRoaXMucmVzb2x2ZUFmdGVyQ2xvc2UgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKiBDb25uZWN0IHRoZSBzaGFyZCB3aXRoIHRoZSBnYXRld2F5IGFuZCBzdGFydCBoZWFydGJlYXRpbmcuIFRoaXMgd2lsbCBub3QgaWRlbnRpZnkgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LiAqL1xuICBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8RGlzY29yZGVub1NoYXJkPiB7XG4gICAgLy8gT25seSBzZXQgdGhlIHNoYXJkIHRvIGBDb25uZWN0aW5nYCBzdGF0ZSxcbiAgICAvLyBpZiB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IGRvZXMgbm90IGNvbWUgZnJvbSBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgIGlmICghW1NoYXJkU3RhdGUuSWRlbnRpZnlpbmcsIFNoYXJkU3RhdGUuUmVzdW1pbmddLmluY2x1ZGVzKHRoaXMuc3RhdGUpKSB7XG4gICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0aW5nXG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gQ29ubmVjdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBzb2NrZXQuYClcblxuICAgIHRoaXMuZXZlbnRzLmNvbm5lY3Rpbmc/Lih0aGlzKVxuXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTCh0aGlzLmNvbm5lY3Rpb25VcmwpXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3YnLCB0aGlzLmdhdGV3YXlDb25maWcudmVyc2lvbi50b1N0cmluZygpKVxuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdlbmNvZGluZycsICdqc29uJylcblxuICAgIC8vIFNldCB0aGUgY29tcHJlc3MgdXJsIHBhcmFtIGFuZCBpbml0aWFsaXplIHRoZSBkZWNvbXByZXNzaW9uIGNvbnRleHRzXG4gICAgaWYgKHRoaXMuZ2F0ZXdheUNvbmZpZy50cmFuc3BvcnRDb21wcmVzc2lvbikge1xuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2NvbXByZXNzJywgdGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uKVxuXG4gICAgICBpZiAodGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uID09PSBUcmFuc3BvcnRDb21wcmVzc2lvbi56bGliKSB7XG4gICAgICAgIHRoaXMuaW5mbGF0ZUJ1ZmZlciA9IG51bGxcbiAgICAgICAgdGhpcy5pbmZsYXRlID0gY3JlYXRlSW5mbGF0ZSh7XG4gICAgICAgICAgZmluaXNoRmx1c2g6IHpsaWJDb25zdGFudHMuWl9TWU5DX0ZMVVNILFxuICAgICAgICAgIGNodW5rU2l6ZTogNjQgKiAxMDI0LFxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuaW5mbGF0ZS5vbignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdUaGUgd2FzIGFuIGVycm9yIGluIGRlY29tcHJlc3NpbmcgYSBaTGliIGNvbXByZXNzZWQgcGF5bG9hZCcsIGUpXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5pbmZsYXRlLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICBpZiAoIShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHJldHVyblxuXG4gICAgICAgICAgaWYgKHRoaXMuaW5mbGF0ZUJ1ZmZlcikge1xuICAgICAgICAgICAgY29uc3QgbmV3QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5pbmZsYXRlQnVmZmVyLmJ5dGVMZW5ndGggKyBkYXRhLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICBuZXdCdWZmZXIuc2V0KHRoaXMuaW5mbGF0ZUJ1ZmZlcilcbiAgICAgICAgICAgIG5ld0J1ZmZlci5zZXQoZGF0YSwgdGhpcy5pbmZsYXRlQnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmluZmxhdGVCdWZmZXIgPSBuZXdCdWZmZXJcblxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5pbmZsYXRlQnVmZmVyID0gZGF0YVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uID09PSBUcmFuc3BvcnRDb21wcmVzc2lvbi56c3RkKSB7XG4gICAgICAgIGNvbnN0IGZ6c3RkID0gYXdhaXQgZ2V0RlpTdGQoKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybignW1NoYXJkXSBcImZ6c3RkXCIgaXMgbm90IGluc3RhbGxlZC4gRGlzYWJsZWQgdHJhbnNwb3J0IGNvbXByZXNzaW9uLicpXG4gICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5kZWxldGUoJ2NvbXByZXNzJylcblxuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGZ6c3RkKSB7XG4gICAgICAgICAgdGhpcy56c3RkRGVjb21wcmVzcyA9IG5ldyBmenN0ZC5EZWNvbXByZXNzKChkYXRhKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkRGF0YSA9IHRoaXMudGV4dERlY29kZXIuZGVjb2RlKGRhdGEpXG4gICAgICAgICAgICBjb25zdCBwYXJzZWREYXRhID0gSlNPTi5wYXJzZShkZWNvZGVkRGF0YSlcbiAgICAgICAgICAgIHRoaXMuZGVjb21wcmVzc2lvblByb21pc2VzUXVldWUuc2hpZnQoKT8uKHBhcnNlZERhdGEpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MgJiYgdGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdbU2hhcmRdIFBheWxvYWQgY29tcHJlc3Npb24gaGFzIGJlZW4gZGlzYWJsZWQgc2luY2UgdHJhbnNwb3J0IGNvbXByZXNzaW9uIGlzIGVuYWJsZWQgYXMgd2VsbC4nKVxuICAgICAgdGhpcy5nYXRld2F5Q29uZmlnLmNvbXByZXNzID0gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBXZSBjaGVjayBmb3IgYnVpbHQtaW4gV2ViU29ja2V0IGltcGxlbWVudGF0aW9ucyBpbiBCdW4gb3IgRGVubywgTm9kZUpTIHYyMiBoYXMgYW4gaW1wbGVtZW50YXRpb24gdG9vIGJ1dCBpdCBzZWVtcyB0byBiZSBsZXNzIG9wdGltaXplZCBzbyBmb3Igbm93IGl0IGlzIGJldHRlciB0byB1c2UgdGhlIHdzIG5wbSBwYWNrYWdlXG4gICAgY29uc3Qgc2hvdWxkVXNlQnVpbHRpbiA9IFJlZmxlY3QuaGFzKGdsb2JhbFRoaXMsICdXZWJTb2NrZXQnKSAmJiAoUmVmbGVjdC5oYXMoZ2xvYmFsVGhpcywgJ0J1bicpIHx8IFJlZmxlY3QuaGFzKGdsb2JhbFRoaXMsICdEZW5vJykpXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIE5vZGVXZWJTb2NrZXQgZG9lc24ndCBzdXBwb3J0IFwiZGlzcGF0Y2hFdmVudFwiLCBhbmQgd2hpbGUgd2UgZG9uJ3QgdXNlIGl0LCBpdCBpcyByZXF1aXJlZCBvbiB0aGUgXCJXZWJTb2NrZXRcIiB0eXBlXG4gICAgY29uc3Qgc29ja2V0OiBXZWJTb2NrZXQgPSBzaG91bGRVc2VCdWlsdGluID8gbmV3IFdlYlNvY2tldCh1cmwpIDogbmV3IE5vZGVXZWJTb2NrZXQodXJsKVxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG5cbiAgICAvLyBCeSBkZWZhdWx0IFdlYlNvY2tldCB3aWxsIGdpdmUgdXMgYSBCbG9iLCB0aGlzIGNoYW5nZXMgaXQgc28gdGhhdCBpdCBnaXZlcyB1cyBhbiBBcnJheUJ1ZmZlclxuICAgIHNvY2tldC5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJ1xuXG4gICAgc29ja2V0Lm9uZXJyb3IgPSAoZXZlbnQpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXZlbnQpXG4gICAgc29ja2V0Lm9uY2xvc2UgPSAoY2xvc2VFdmVudCkgPT4gdGhpcy5oYW5kbGVDbG9zZShjbG9zZUV2ZW50KVxuICAgIHNvY2tldC5vbm1lc3NhZ2UgPSAobWVzc2FnZUV2ZW50KSA9PiB0aGlzLmhhbmRsZU1lc3NhZ2UobWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAvLyBPbmx5IHNldCB0aGUgc2hhcmQgdG8gYFVuaWRlbnRpZmllZGAgc3RhdGUgaWYgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBkb2VzIG5vdCBjb21lIGZyb20gYW4gaWRlbnRpZnkgb3IgcmVzdW1lIGFjdGlvbi5cbiAgICAgICAgaWYgKCFbU2hhcmRTdGF0ZS5JZGVudGlmeWluZywgU2hhcmRTdGF0ZS5SZXN1bWluZ10uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5VbmlkZW50aWZpZWRcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IHNvY2tldCBjb25uZWN0ZWQuYClcblxuICAgICAgICB0aGlzLmV2ZW50cy5jb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJlc29sdmUodGhpcylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIElkZW50aWZ5IHRoZSBzaGFyZCB0byB0aGUgZ2F0ZXdheS4gSWYgbm90IGNvbm5lY3RlZCwgdGhpcyB3aWxsIGFsc28gY29ubmVjdCB0aGUgc2hhcmQgdG8gdGhlIGdhdGV3YXkuXG4gICAqIEBwYXJhbSBieXBhc3NSZXF1ZXN0IC0gV2hldGhlciB0byBieXBhc3MgdGhlIHJlcXVlc3RJZGVudGlmeSBoYW5kbGVyIGFuZCBpZGVudGlmeSBpbW1lZGlhdGVseS4gVGhpcyBzaG91bGQgYmUgdXNlZCBjYXJlZnVsbHkgYXMgaXQgY2FuIGNhdXNlIGludmFsaWQgc2Vzc2lvbnMuXG4gICAqL1xuICBhc3luYyBpZGVudGlmeShieXBhc3NSZXF1ZXN0ID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBIG5ldyBpZGVudGlmeSBoYXMgYmVlbiByZXF1ZXN0ZWQgZXZlbiB0aG91Z2ggdGhlcmUgaXMgYWxyZWFkeSBhIGNvbm5lY3Rpb24gb3Blbi5cbiAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBjbG9zZSB0aGUgb2xkIGNvbm5lY3Rpb24gYW5kIGhlYXJ0YmVhdGluZyBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgb25lLlxuICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBJZGVudGlmeWluZyBvcGVuIFNoYXJkICMke3RoaXMuaWR9LCBjbG9zaW5nIHRoZSBjb25uZWN0aW9uYClcbiAgICAgIGF3YWl0IHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlSWRlbnRpZnlpbmcsICdSZS1pZGVudGlmeWluZyBjbG9zdXJlIG9mIG9sZCBjb25uZWN0aW9uLicpXG4gICAgfVxuXG4gICAgaWYgKCFieXBhc3NSZXF1ZXN0KSB7XG4gICAgICBhd2FpdCB0aGlzLnJlcXVlc3RJZGVudGlmeSgpXG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuSWRlbnRpZnlpbmdcbiAgICB0aGlzLmV2ZW50cy5pZGVudGlmeWluZz8uKHRoaXMpXG5cbiAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzaGFyZCBpcyBpbiBIZWFydGJlYXRpbmcgc3RhdGUgYnV0IG5vdCBpZGVudGlmaWVkLFxuICAgIC8vIHNvIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYWxyZWFkeSBhIGdhdGV3YXkgY29ubmVjdGlvbiBleGlzdGluZy5cbiAgICAvLyBJZiBub3Qgd2UgbmVlZCB0byBjcmVhdGUgb25lIGJlZm9yZSB3ZSBpZGVudGlmeS5cbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2VuZGluZyBJZGVudGlmeSBwYXlsb2FkIGZvciBTaGFyZCAjJHt0aGlzLmlkfS5gKVxuXG4gICAgdGhpcy5zZW5kKFxuICAgICAge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSWRlbnRpZnksXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICB0b2tlbjogYEJvdCAke3RoaXMuZ2F0ZXdheUNvbmZpZy50b2tlbn1gLFxuICAgICAgICAgIGNvbXByZXNzOiB0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MsXG4gICAgICAgICAgcHJvcGVydGllczogdGhpcy5nYXRld2F5Q29uZmlnLnByb3BlcnRpZXMsXG4gICAgICAgICAgaW50ZW50czogdGhpcy5nYXRld2F5Q29uZmlnLmludGVudHMsXG4gICAgICAgICAgc2hhcmQ6IFt0aGlzLmlkLCB0aGlzLmdhdGV3YXlDb25maWcudG90YWxTaGFyZHNdLFxuICAgICAgICAgIHByZXNlbmNlOiBhd2FpdCB0aGlzLm1ha2VQcmVzZW5jZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgKVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnUkVBRFknLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZXZlbnRzLmlkZW50aWZpZWQ/Lih0aGlzKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0pXG4gICAgICAvLyBXaGVuIGlkZW50aWZ5aW5nIHRvbyBmYXN0LCBEaXNjb3JkIHNlbmRzIGFuIGludmFsaWQgc2Vzc2lvbiBwYXlsb2FkLlxuICAgICAgLy8gVGhpcyBjYW4gc2FmZWx5IGJlIGlnbm9yZWQgdGhvdWdoIGFuZCB0aGUgc2hhcmQgc3RhcnRzIGEgbmV3IGlkZW50aWZ5IGFjdGlvbi5cbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdJTlZBTElEX1NFU1NJT04nLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRUFEWScpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIENoZWNrIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gdG8gRGlzY29yZCBpcyBjdXJyZW50bHkgb3Blbi4gKi9cbiAgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvY2tldD8ucmVhZHlTdGF0ZSA9PT0gTm9kZVdlYlNvY2tldC5PUEVOXG4gIH1cblxuICAvKiogQXR0ZW1wdCB0byByZXN1bWUgdGhlIHByZXZpb3VzIHNoYXJkcyBzZXNzaW9uIHdpdGggdGhlIGdhdGV3YXkuICovXG4gIGFzeW5jIHJlc3VtZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfWApXG5cbiAgICAvLyBJdCBoYXMgYmVlbiByZXF1ZXN0ZWQgdG8gcmVzdW1lIHRoZSBTaGFyZHMgc2Vzc2lvbi5cbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHNoYXJkIGlzIHN0aWxsIGNvbm5lY3RlZCB3aXRoIERpc2NvcmQncyBnYXRld2F5IHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGZvcmNlZnVsbHkgY2xvc2UgaXQuXG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlc3VtaW5nIG9wZW4gU2hhcmQgIyR7dGhpcy5pZH0sIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb25gKVxuICAgICAgYXdhaXQgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzdW1lQ2xvc2luZ09sZENvbm5lY3Rpb24sICdSZWNvbm5lY3RpbmcgdGhlIHNoYXJkLCBjbG9zaW5nIG9sZCBjb25uZWN0aW9uLicpXG4gICAgfVxuXG4gICAgLy8gU2hhcmQgaGFzIG5ldmVyIGlkZW50aWZpZWQsIHNvIHdlIGNhbm5vdCByZXN1bWUuXG4gICAgaWYgKCF0aGlzLnNlc3Npb25JZCkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gVHJ5aW5nIHRvIHJlc3VtZSBTaGFyZCAjJHt0aGlzLmlkfSB3aXRob3V0IHRoZSBzZXNzaW9uIGlkLiBJZGVudGlmeWluZyB0aGUgc2hhcmQgaW5zdGVhZC5gKVxuXG4gICAgICBhd2FpdCB0aGlzLmlkZW50aWZ5KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlJlc3VtaW5nXG5cbiAgICAvLyBCZWZvcmUgd2UgY2FuIHJlc3VtZSwgd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiB3aXRoIERpc2NvcmQncyBnYXRld2F5LlxuICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfSBjb25uZWN0ZWQuIFNlc3Npb24gaWQ6ICR7dGhpcy5zZXNzaW9uSWR9IHwgU2VxdWVuY2U6ICR7dGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyfWApXG5cbiAgICB0aGlzLnNlbmQoXG4gICAgICB7XG4gICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5SZXN1bWUsXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICB0b2tlbjogYEJvdCAke3RoaXMuZ2F0ZXdheUNvbmZpZy50b2tlbn1gLFxuICAgICAgICAgIHNlc3Npb25faWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgICAgIHNlcTogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyID8/IDAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdSRVNVTUVEJywgKCkgPT4gcmVzb2x2ZSgpKVxuXG4gICAgICAvLyBJZiBpdCBpcyBhdHRlbXB0ZWQgdG8gcmVzdW1lIHdpdGggYW4gaW52YWxpZCBzZXNzaW9uIGlkLCBEaXNjb3JkIHNlbmRzIGFuIGludmFsaWQgc2Vzc2lvbiBwYXlsb2FkXG4gICAgICAvLyBOb3QgZXJyb3JpbmcgaGVyZSBzaW5jZSBpdCBpcyBlYXN5IHRoYXQgdGhpcyBoYXBwZW5zLCBhbHNvIGl0IHdvdWxkIGJlIG5vdCBjYXRjaGFibGVcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdJTlZBTElEX1NFU1NJT04nLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRVNVTUVEJylcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIG1lc3NhZ2UgdG8gRGlzY29yZC5cbiAgICogQHBhcmFtIGhpZ2hQcmlvcml0eSAtIFdoZXRoZXIgdGhpcyBtZXNzYWdlIHNob3VsZCBiZSBzZW5kIGFzYXAuXG4gICAqL1xuICBhc3luYyBzZW5kKG1lc3NhZ2U6IFNoYXJkU29ja2V0UmVxdWVzdCwgaGlnaFByaW9yaXR5OiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBCZWZvcmUgYWNxdWlyaW5nIGEgdG9rZW4gZnJvbSB0aGUgYnVja2V0LCBjaGVjayB3aGV0aGVyIHRoZSBzaGFyZCBpcyBjdXJyZW50bHkgb2ZmbGluZSBvciBub3QuXG4gICAgLy8gRWxzZSBidWNrZXQgYW5kIHRva2VuIHdhaXQgdGltZSBqdXN0IGdldCB3YXN0ZWQuXG4gICAgYXdhaXQgdGhpcy5jaGVja09mZmxpbmUoaGlnaFByaW9yaXR5KVxuXG4gICAgYXdhaXQgdGhpcy5idWNrZXQuYWNxdWlyZShoaWdoUHJpb3JpdHkpXG5cbiAgICAvLyBJdCdzIHBvc3NpYmxlLCB0aGF0IHRoZSBzaGFyZCB3ZW50IG9mZmxpbmUgYWZ0ZXIgYSB0b2tlbiBoYXMgYmVlbiBhY3F1aXJlZCBmcm9tIHRoZSBidWNrZXQuXG4gICAgYXdhaXQgdGhpcy5jaGVja09mZmxpbmUoaGlnaFByaW9yaXR5KVxuXG4gICAgdGhpcy5zb2NrZXQ/LnNlbmQoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSkpXG4gIH1cblxuICAvKiogU2h1dGRvd24gdGhlIHRoaXMuIEZvcmNlZnVsbHkgZGlzY29ubmVjdCB0aGUgc2hhcmQgZnJvbSBEaXNjb3JkLiBUaGUgc2hhcmQgbWF5IG5vdCBhdHRlbXB0IHRvIHJlY29ubmVjdCB3aXRoIERpc2NvcmQuICovXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlNodXRkb3duLCAnU2hhcmQgc2h1dHRpbmcgZG93bi4nKVxuICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLk9mZmxpbmVcbiAgfVxuXG4gIC8qKiBIYW5kbGUgYSBnYXRld2F5IGNvbm5lY3Rpb24gZXJyb3IgKi9cbiAgaGFuZGxlRXJyb3IoZXJyb3I6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIuZXJyb3IoYFtTaGFyZF0gVGhlcmUgd2FzIGFuIGVycm9yIGNvbm5lY3RpbmcgU2hhcmQgIyR7dGhpcy5pZH0uYCwgZXJyb3IpXG4gIH1cblxuICAvKiogSGFuZGxlIGEgZ2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlLiAqL1xuICBhc3luYyBoYW5kbGVDbG9zZShjbG9zZTogQ2xvc2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc29ja2V0ID0gdW5kZWZpbmVkXG4gICAgdGhpcy5zdG9wSGVhcnRiZWF0aW5nKClcblxuICAgIC8vIENsZWFyIHRoZSB6bGliL3pzdGQgZGF0YVxuICAgIHRoaXMuaW5mbGF0ZSA9IHVuZGVmaW5lZFxuICAgIHRoaXMuenN0ZERlY29tcHJlc3MgPSB1bmRlZmluZWRcbiAgICB0aGlzLmluZmxhdGVCdWZmZXIgPSBudWxsXG4gICAgdGhpcy5kZWNvbXByZXNzaW9uUHJvbWlzZXNRdWV1ZSA9IFtdXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCAjJHt0aGlzLmlkfSBjbG9zZWQgd2l0aCBjb2RlICR7Y2xvc2UuY29kZX0ke2Nsb3NlLnJlYXNvbiA/IGAsIGFuZCByZWFzb246ICR7Y2xvc2UucmVhc29ufWAgOiAnJ30uYClcblxuICAgIC8vIFJlc29sdmUgdGhlIGNsb3NlIHByb21pc2UgaWYgaXQgZXhpc3RzXG4gICAgdGhpcy5yZXNvbHZlQWZ0ZXJDbG9zZT8uKGNsb3NlKVxuXG4gICAgc3dpdGNoIChjbG9zZS5jb2RlKSB7XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5UZXN0aW5nRmluaXNoZWQ6IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gT24gdGhlc2UgY29kZXMgYSBtYW51YWwgc3RhcnQgd2lsbCBiZSBkb25lLlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuU2h1dGRvd246XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZUlkZW50aWZ5aW5nOlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzaGFyZGVkOlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzdW1lQ2xvc2luZ09sZENvbm5lY3Rpb246IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuRGlzY29ubmVjdGVkXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBXaGVuIHRoZXNlIGNvZGVzIGFyZSByZWNlaXZlZCBzb21ldGhpbmcgd2VudCByZWFsbHkgd3JvbmcuXG4gICAgICAvLyBPbiB0aG9zZSB3ZSBjYW5ub3Qgc3RhcnQgYSByZWNvbm5lY3QgYXR0ZW1wdC5cbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5BdXRoZW50aWNhdGlvbkZhaWxlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkU2hhcmQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuU2hhcmRpbmdSZXF1aXJlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkQXBpVmVyc2lvbjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkSW50ZW50czpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5EaXNhbGxvd2VkSW50ZW50czoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNsb3NlLnJlYXNvbiB8fCAnRGlzY29yZCBnYXZlIG5vIHJlYXNvbiEgR0chIFlvdSBicm9rZSBEaXNjb3JkIScpXG4gICAgICB9XG4gICAgICAvLyBHYXRld2F5IGNvbm5lY3Rpb24gY2xvc2VzIHdoaWNoIHJlcXVpcmUgYSBuZXcgaWRlbnRpZnkuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuTm90QXV0aGVudGljYXRlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkU2VxOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlNlc3Npb25UaW1lZE91dDoge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCAjJHt0aGlzLmlkfSBjbG9zZWQgcmVxdWlyaW5nIHJlLWlkZW50aWZ5LmApXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLklkZW50aWZ5aW5nXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgYXdhaXQgdGhpcy5pZGVudGlmeSgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gTk9URTogVGhpcyBjYXNlIG11c3QgYWx3YXlzIGJlIHJpZ2h0IGFib3ZlIHRoZSBjYXNlcyB0aGF0IHJ1bnMgd2l0aCBkZWZhdWx0IGNhc2UgYmVjYXVzZSBvZiBob3cgc3dpdGNoIHdvcmtzIHdoZW4geW91IGRvbid0IGJyZWFrIC8gcmV0dXJuLCBtb3JlIGluZm8gYmVsb3cuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuTm9ybWFsQ2xvc3VyZTpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Hb2luZ0F3YXk6IHtcbiAgICAgICAgLy8gSWYgdGhlIHNoYXJkIGlzIG1hcmtlZCBhcyBnb2luZ09mZmxpbmUsIGl0IHN0YXlzIGRpc2Nvbm5lY3RlZC5cbiAgICAgICAgaWYgKHRoaXMuZ29pbmdPZmZsaW5lKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuRGlzY29ubmVjdGVkXG4gICAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICAgIHRoaXMuZ29pbmdPZmZsaW5lID0gZmFsc2VcblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSB3YW50IHRoZSBzaGFyZCB0byBnbyB0aHJvdWdoIHRoZSBkZWZhdWx0IGNhc2Ugd2hlcmUgaXQgZ2V0cyByZXN1bWVkLCBhcyBpdCBtaWdodCBiZSBhbiB1bmV4cGVjdGVkIGNsb3N1cmUgZnJvbSBEaXNjb3JkIG9yIENsb3VkZmxhcmUgZm9yIGV4YW1wbGUsIHNvIHdlIGRvbid0IHVzZSBicmVhayAvIHJldHVybiBoZXJlLlxuICAgICAgfVxuICAgICAgLy8gR2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlcyBvbiB3aGljaCBhIHJlc3VtZSBpcyBhbGxvd2VkLlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlVua25vd25FcnJvcjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Vbmtub3duT3Bjb2RlOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkRlY29kZUVycm9yOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlJhdGVMaW1pdGVkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkFscmVhZHlBdXRoZW50aWNhdGVkOlxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGdldCBpbnRvIGFuIGluZmluaXRlIGxvb3Agd2hlcmUgd2UgcmVzdW1lIGZvcmV2ZXIsIHNvIGlmIHdlIHdlcmUgYWxyZWFkeSByZXN1bWluZyB3ZSBpZGVudGlmeSBpbnN0ZWFkXG4gICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLnN0YXRlID09PSBTaGFyZFN0YXRlLlJlc3VtaW5nID8gU2hhcmRTdGF0ZS5JZGVudGlmeWluZyA6IFNoYXJkU3RhdGUuUmVzdW1pbmdcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gU2hhcmRTdGF0ZS5SZXN1bWluZykge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVzdW1lKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmlkZW50aWZ5KClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBIYW5kbGUgYW4gaW5jb21pbmcgZ2F0ZXdheSBtZXNzYWdlLiAqL1xuICBhc3luYyBoYW5kbGVNZXNzYWdlKG1lc3NhZ2U6IE1lc3NhZ2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFRoZSB3cyBucG0gcGFja2FnZSB3aWxsIHVzZSBhIEJ1ZmZlciwgd2hpbGUgdGhlIGdsb2JhbCBidWlsdC1pbiB3aWxsIHVzZSBBcnJheUJ1ZmZlclxuICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9IG1lc3NhZ2UuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IG1lc3NhZ2UuZGF0YSBpbnN0YW5jZW9mIEJ1ZmZlclxuXG4gICAgY29uc3QgZGF0YSA9IGlzQ29tcHJlc3NlZCA/IGF3YWl0IHRoaXMuZGVjb21wcmVzc1BhY2tldChtZXNzYWdlLmRhdGEpIDogKEpTT04ucGFyc2UobWVzc2FnZS5kYXRhKSBhcyBEaXNjb3JkR2F0ZXdheVBheWxvYWQpXG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZGVjb21wcmVzc2lvbiB3YXMgbm90IHN1Y2Nlc3NmdWxcbiAgICBpZiAoIWRhdGEpIHJldHVyblxuXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVEaXNjb3JkUGFja2V0KGRhdGEpXG4gIH1cblxuICAvKipcbiAgICogRGVjb21wcmVzcyBhIHpsaWIvenN0ZCBjb21wcmVzc2VkIHBhY2tldFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYXN5bmMgZGVjb21wcmVzc1BhY2tldChkYXRhOiBBcnJheUJ1ZmZlciB8IEJ1ZmZlcik6IFByb21pc2U8RGlzY29yZEdhdGV3YXlQYXlsb2FkIHwgbnVsbD4ge1xuICAgIC8vIEEgYnVmZmVyIGlzIGEgVWludDhBcnJheSB1bmRlciB0aGUgaG9vZC4gQW4gQXJyYXlCdWZmZXIgaXMgZ2VuZXJpYywgc28gd2UgbmVlZCB0byBjcmVhdGUgdGhlIFVpbnQ4QXJyYXkgdGhhdCB1c2VzIHRoZSB3aG9sZSBBcnJheUJ1ZmZlclxuICAgIGNvbnN0IGNvbXByZXNzZWREYXRhOiBVaW50OEFycmF5ID0gZGF0YSBpbnN0YW5jZW9mIEJ1ZmZlciA/IGRhdGEgOiBuZXcgVWludDhBcnJheShkYXRhKVxuXG4gICAgaWYgKHRoaXMuZ2F0ZXdheUNvbmZpZy50cmFuc3BvcnRDb21wcmVzc2lvbiA9PT0gVHJhbnNwb3J0Q29tcHJlc3Npb24uemxpYikge1xuICAgICAgaWYgKCF0aGlzLmluZmxhdGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZmF0YWwoJ1tTaGFyZF0gemxpYi1zdHJlYW0gdHJhbnNwb3J0IGNvbXByZXNzaW9uIHdhcyBlbmFibGVkIGJ1dCBubyBpbnN0YW5jZSBvZiBJbmZsYXRlIHdhcyBmb3VuZC4nKVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICAvLyBBbGlhcywgdXNlZCB0byBhdm9pZCBzb21lIG51bGwgY2hlY2tzIGluIHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yXG4gICAgICBjb25zdCBpbmZsYXRlID0gdGhpcy5pbmZsYXRlXG5cbiAgICAgIGNvbnN0IHdyaXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaW5mbGF0ZS53cml0ZShjb21wcmVzc2VkRGF0YSwgJ2JpbmFyeScsIChlcnJvcikgPT4gKGVycm9yID8gcmVqZWN0KGVycm9yKSA6IHJlc29sdmUoKSkpXG4gICAgICB9KVxuXG4gICAgICBpZiAoIWVuZHNXaXRoTWFya2VyKGNvbXByZXNzZWREYXRhLCBaTElCX1NZTkNfRkxVU0gpKSByZXR1cm4gbnVsbFxuXG4gICAgICBhd2FpdCB3cml0ZVByb21pc2VcblxuICAgICAgaWYgKCF0aGlzLmluZmxhdGVCdWZmZXIpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignW1NoYXJkXSBUaGUgWkxpYiBpbmZsYXRlIGJ1ZmZlciB3YXMgY2xlYXJlZCBhdCBhbiB1bmV4cGVjdGVkIG1vbWVudC4nKVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWNvZGVkRGF0YSA9IHRoaXMudGV4dERlY29kZXIuZGVjb2RlKHRoaXMuaW5mbGF0ZUJ1ZmZlcilcbiAgICAgIHRoaXMuaW5mbGF0ZUJ1ZmZlciA9IG51bGxcblxuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZERhdGEpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2F0ZXdheUNvbmZpZy50cmFuc3BvcnRDb21wcmVzc2lvbiA9PT0gVHJhbnNwb3J0Q29tcHJlc3Npb24uenN0ZCkge1xuICAgICAgaWYgKCF0aGlzLnpzdGREZWNvbXByZXNzKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmZhdGFsKCdbU2hhcmRdIHpzdGQtc3RyZWFtIHRyYW5zcG9ydCBjb21wcmVzc2lvbiB3YXMgZW5hYmxlZCBidXQgbm8gaW5zdGFuY2Ugb2YgRGVjb21wcmVzcyB3YXMgZm91bmQuJylcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cblxuICAgICAgdGhpcy56c3RkRGVjb21wcmVzcy5wdXNoKGNvbXByZXNzZWREYXRhKVxuXG4gICAgICBjb25zdCBkZWNvbXByZXNzaW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlPERpc2NvcmRHYXRld2F5UGF5bG9hZD4oKHIpID0+IHRoaXMuZGVjb21wcmVzc2lvblByb21pc2VzUXVldWUucHVzaChyKSlcbiAgICAgIHJldHVybiBhd2FpdCBkZWNvbXByZXNzaW9uUHJvbWlzZVxuICAgIH1cblxuICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MpIHtcbiAgICAgIGNvbnN0IGRlY29tcHJlc3NlZCA9IGluZmxhdGVTeW5jKGNvbXByZXNzZWREYXRhKVxuICAgICAgY29uc3QgZGVjb2RlZERhdGEgPSB0aGlzLnRleHREZWNvZGVyLmRlY29kZShkZWNvbXByZXNzZWQpXG5cbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZWREYXRhKVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKiogSGFuZGxlcyBhIGluY29taW5nIGdhdGV3YXkgcGFja2V0LiAqL1xuICBhc3luYyBoYW5kbGVEaXNjb3JkUGFja2V0KHBhY2tldDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gRWRnZSBjYXNlIHN0YXJ0OiBodHRwczovL2dpdGh1Yi5jb20vZGlzY29yZGVuby9kaXNjb3JkZW5vL2lzc3Vlcy8yMzExXG4gICAgdGhpcy5oZWFydC5sYXN0QWNrID0gRGF0ZS5ub3coKVxuICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gdHJ1ZVxuICAgIC8vIEVkZ2UgY2FzZSBlbmQhXG5cbiAgICBzd2l0Y2ggKHBhY2tldC5vcCkge1xuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQ6IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlbigpKSByZXR1cm5cblxuICAgICAgICB0aGlzLmhlYXJ0Lmxhc3RCZWF0ID0gRGF0ZS5ub3coKVxuICAgICAgICAvLyBEaXNjb3JkIHJhbmRvbWx5IHNlbmRzIHRoaXMgcmVxdWlyaW5nIGFuIGltbWVkaWF0ZSBoZWFydGJlYXQgYmFjay5cbiAgICAgICAgLy8gVXNpbmcgYSBkaXJlY3Qgc29ja2V0LnNlbmQgY2FsbCBoZXJlIGJlY2F1c2UgaGVhcnRiZWF0IHJlcXVlc3RzIGFyZSByZXNlcnZlZCBieSB1cy5cbiAgICAgICAgdGhpcy5zb2NrZXQ/LnNlbmQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdCxcbiAgICAgICAgICAgIGQ6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICB0aGlzLmV2ZW50cy5oZWFydGJlYXQ/Lih0aGlzKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkhlbGxvOiB7XG4gICAgICAgIGNvbnN0IGludGVydmFsID0gKHBhY2tldC5kIGFzIERpc2NvcmRIZWxsbykuaGVhcnRiZWF0X2ludGVydmFsXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IHJlY2VpdmVkIEhlbGxvYClcbiAgICAgICAgdGhpcy5zdGFydEhlYXJ0YmVhdGluZyhpbnRlcnZhbClcblxuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gU2hhcmRTdGF0ZS5SZXN1bWluZykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRRdWV1ZSA9IFsuLi50aGlzLmJ1Y2tldC5xdWV1ZV1cbiAgICAgICAgICAvLyBIRUxMTyBoYXMgYmVlbiBzZW5kIG9uIGEgbm9uIHJlc3VtZSBhY3Rpb24uXG4gICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBzaGFyZCBzdGFydHMgYSBuZXcgc2Vzc2lvbixcbiAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIHJhdGUgbGltaXQgaW50ZXJ2YWwgaGFzIGJlZW4gcmVzZXQgdG9vLlxuICAgICAgICAgIHRoaXMuYnVja2V0ID0gbmV3IExlYWt5QnVja2V0KHtcbiAgICAgICAgICAgIG1heDogdGhpcy5jYWxjdWxhdGVTYWZlUmVxdWVzdHMoKSxcbiAgICAgICAgICAgIHJlZmlsbEludGVydmFsOiA2MDAwMCxcbiAgICAgICAgICAgIHJlZmlsbEFtb3VudDogdGhpcy5jYWxjdWxhdGVTYWZlUmVxdWVzdHMoKSxcbiAgICAgICAgICAgIGxvZ2dlcjogdGhpcy5sb2dnZXIsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIC8vIFF1ZXVlIHNob3VsZCBub3QgYmUgbG9zdCBvbiBhIHJlLWlkZW50aWZ5LlxuICAgICAgICAgIHRoaXMuYnVja2V0LnF1ZXVlLnVuc2hpZnQoLi4uY3VycmVudFF1ZXVlKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudHMuaGVsbG8/Lih0aGlzKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdEFDSzoge1xuICAgICAgICAvLyBNYW51YWxseSBjYWxjdWxhdGluZyB0aGUgcm91bmQgdHJpcCB0aW1lIGZvciB1c2VycyB3aG8gbmVlZCBpdC5cbiAgICAgICAgaWYgKHRoaXMuaGVhcnQubGFzdEJlYXQpIHtcbiAgICAgICAgICB0aGlzLmhlYXJ0LnJ0dCA9IHRoaXMuaGVhcnQubGFzdEFjayAtIHRoaXMuaGVhcnQubGFzdEJlYXRcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlYXJ0YmVhdEFjaz8uKHRoaXMpXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuUmVjb25uZWN0OiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlY2VpdmVkIGEgUmVjb25uZWN0IGZvciBTaGFyZCAjJHt0aGlzLmlkfWApXG4gICAgICAgIHRoaXMuZXZlbnRzLnJlcXVlc3RlZFJlY29ubmVjdD8uKHRoaXMpXG5cbiAgICAgICAgYXdhaXQgdGhpcy5yZXN1bWUoKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkludmFsaWRTZXNzaW9uOiB7XG4gICAgICAgIGNvbnN0IHJlc3VtYWJsZSA9IHBhY2tldC5kIGFzIGJvb2xlYW5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gUmVjZWl2ZWQgSW52YWxpZCBTZXNzaW9uIGZvciBTaGFyZCAjJHt0aGlzLmlkfSB3aXRoIHJlc3VtYWJsZSBhcyAke3Jlc3VtYWJsZX1gKVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmludmFsaWRTZXNzaW9uPy4odGhpcywgcmVzdW1hYmxlKVxuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgYSByYW5kb20gYW1vdW50IG9mIHRpbWUgYmV0d2VlbiAxIGFuZCA1XG4gICAgICAgIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjcmVzdW1pbmdcbiAgICAgICAgYXdhaXQgZGVsYXkoTWF0aC5mbG9vcigoTWF0aC5yYW5kb20oKSAqIDQgKyAxKSAqIDEwMDApKVxuXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZ2V0KCdJTlZBTElEX1NFU1NJT04nKT8uKHBhY2tldClcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ0lOVkFMSURfU0VTU0lPTicpXG5cbiAgICAgICAgLy8gV2hlbiByZXN1bWFibGUgaXMgZmFsc2Ugd2UgbmVlZCB0byByZS1pZGVudGlmeVxuICAgICAgICBpZiAoIXJlc3VtYWJsZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBzZXNzaW9uIGlzIGludmFsaWQgYnV0IGFwcGFyZW50bHkgaXQgaXMgcmVzdW1hYmxlXG4gICAgICAgIGF3YWl0IHRoaXMucmVzdW1lKClcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAocGFja2V0LnQpIHtcbiAgICAgIGNhc2UgJ1JFU1VNRUQnOlxuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0ZWRcbiAgICAgICAgdGhpcy5ldmVudHMucmVzdW1lZD8uKHRoaXMpXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgIyR7dGhpcy5pZH0gcmVjZWl2ZWQgUkVTVU1FRGApXG5cbiAgICAgICAgLy8gQ29udGludWUgdGhlIHJlcXVlc3RzIHdoaWNoIGhhdmUgYmVlbiBxdWV1ZWQgc2luY2UgdGhlIHNoYXJkIHdlbnQgb2ZmbGluZS5cbiAgICAgICAgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLmZvckVhY2goKHJlc29sdmUpID0+IHJlc29sdmUoKSlcbiAgICAgICAgLy8gU2V0dGluZyB0aGUgbGVuZ3RoIHRvIDAgd2lsbCBkZWxldGUgdGhlIGVsZW1lbnRzIGluIGl0XG4gICAgICAgIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5sZW5ndGggPSAwXG5cbiAgICAgICAgdGhpcy5yZXNvbHZlcy5nZXQoJ1JFU1VNRUQnKT8uKHBhY2tldClcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFU1VNRUQnKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnUkVBRFknOiB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBEaXNjb3JkUmVhZHlcblxuICAgICAgICAvLyBJbXBvcnRhbnQgZm9yIGZ1dHVyZSByZXN1bWVzLlxuICAgICAgICB0aGlzLnJlc3VtZUdhdGV3YXlVcmwgPSBwYXlsb2FkLnJlc3VtZV9nYXRld2F5X3VybFxuICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHBheWxvYWQuc2Vzc2lvbl9pZFxuXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkNvbm5lY3RlZFxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IHJlY2VpdmVkIFJFQURZYClcblxuICAgICAgICAvLyBDb250aW51ZSB0aGUgcmVxdWVzdHMgd2hpY2ggaGF2ZSBiZWVuIHF1ZXVlZCBzaW5jZSB0aGUgc2hhcmQgd2VudCBvZmZsaW5lLlxuICAgICAgICAvLyBJbXBvcnRhbnQgd2hlbiB0aGlzIGlzIGEgcmUtaWRlbnRpZnlcbiAgICAgICAgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLmZvckVhY2goKHJlc29sdmUpID0+IHJlc29sdmUoKSlcbiAgICAgICAgLy8gU2V0dGluZyB0aGUgbGVuZ3RoIHRvIDAgd2lsbCBkZWxldGUgdGhlIGVsZW1lbnRzIGluIGl0XG4gICAgICAgIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5sZW5ndGggPSAwXG5cbiAgICAgICAgdGhpcy5yZXNvbHZlcy5nZXQoJ1JFQURZJyk/LihwYWNrZXQpXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRUFEWScpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBzZXF1ZW5jZSBudW1iZXIgaWYgaXQgaXMgcHJlc2VudFxuICAgIC8vIGBzYCBjYW4gYmUgZWl0aGVyIGBudWxsYCBvciBhIGBudW1iZXJgLlxuICAgIC8vIEluIG9yZGVyIHRvIHByZXZlbnQgdXBkYXRlIG1pc3NlcyB3aGVuIGBzYCBpcyBgMGAgd2UgY2hlY2sgYWdhaW5zdCBudWxsLlxuICAgIGlmIChwYWNrZXQucyAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyID0gcGFja2V0LnNcbiAgICB9XG5cbiAgICB0aGlzLmZvcndhcmRUb0JvdChwYWNrZXQpXG4gIH1cblxuICBmb3J3YXJkVG9Cb3QocGFja2V0OiBEaXNjb3JkR2F0ZXdheVBheWxvYWQpOiB2b2lkIHtcbiAgICAvLyBUaGUgbmVjZXNzYXJ5IGhhbmRsaW5nIHJlcXVpcmVkIGZvciB0aGUgU2hhcmRzIGNvbm5lY3Rpb24gaGFzIGJlZW4gZmluaXNoZWQuXG4gICAgLy8gTm93IHRoZSBldmVudCBjYW4gYmUgc2FmZWx5IGZvcndhcmRlZC5cbiAgICB0aGlzLmV2ZW50cy5tZXNzYWdlPy4odGhpcywgY2FtZWxpemUocGFja2V0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBpbiBvcmRlciB0byBtYWtlIHRoZSBzaGFyZHMgcHJlc2VuY2UuXG4gICAqIGFzeW5jIGluIGNhc2UgZGV2cyBjcmVhdGUgdGhlIHByZXNlbmNlIGJhc2VkIG9uIGVnLiBkYXRhYmFzZSB2YWx1ZXMuXG4gICAqIFBhc3NpbmcgdGhlIHNoYXJkJ3MgaWQgdGhlcmUgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHRoZSBkZXYgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXG4gICAqL1xuICBhc3luYyBtYWtlUHJlc2VuY2UoKTogUHJvbWlzZTxEaXNjb3JkVXBkYXRlUHJlc2VuY2UgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGNvbW11bmljYXRlcyB3aXRoIHRoZSBtYW5hZ2VtZW50IHByb2Nlc3MsIGluIG9yZGVyIHRvIGtub3cgd2hldGhlciBpdHMgZnJlZSB0byBpZGVudGlmeS5cbiAgICogV2hlbiB0aGlzIGZ1bmN0aW9uIHJlc29sdmVzLCB0aGlzIG1lYW5zIHRoYXQgdGhlIHNoYXJkIGlzIGFsbG93ZWQgdG8gc2VuZCBhbiBpZGVudGlmeSBwYXlsb2FkIHRvIGRpc2NvcmQuXG4gICAqL1xuICBhc3luYyByZXF1ZXN0SWRlbnRpZnkoKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBTdGFydCBzZW5kaW5nIGhlYXJ0YmVhdCBwYXlsb2FkcyB0byBEaXNjb3JkIGluIHRoZSBwcm92aWRlZCBpbnRlcnZhbC4gKi9cbiAgc3RhcnRIZWFydGJlYXRpbmcoaW50ZXJ2YWw6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFN0YXJ0IGhlYXJ0YmVhdGluZyBvbiBTaGFyZCAjJHt0aGlzLmlkfWApXG5cbiAgICAvLyBJZiBvbGQgaGVhcnRiZWFzdCBleGlzdCBsaWtlIGFmdGVyIHJlc3VtZSwgY2xlYXIgdGhlIG9sZCBvbmVzLlxuICAgIHRoaXMuc3RvcEhlYXJ0YmVhdGluZygpXG5cbiAgICB0aGlzLmhlYXJ0LmludGVydmFsID0gaW50ZXJ2YWxcblxuICAgIC8vIE9ubHkgc2V0IHRoZSBzaGFyZCdzIHN0YXRlIHRvIGBVbmlkZW50aWZpZWRgXG4gICAgLy8gaWYgaGVhcnRiZWF0aW5nIGhhcyBub3QgYmVlbiBzdGFydGVkIGR1ZSB0byBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgIGlmIChbU2hhcmRTdGF0ZS5EaXNjb25uZWN0ZWQsIFNoYXJkU3RhdGUuT2ZmbGluZV0uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkIGlzIGRpc2Nvbm5lY3RlZCBvciBvZmZsaW5lIGJ1dCB0aGUgaGVhcnRiZWF0IHdhcyBzdGFydGVkICMke3RoaXMuaWR9YClcbiAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlVuaWRlbnRpZmllZFxuICAgIH1cblxuICAgIC8vIFRoZSBmaXJzdCBoZWFydGJlYXQgbmVlZHMgdG8gYmUgc2VuZCB3aXRoIGEgcmFuZG9tIGRlbGF5IGJldHdlZW4gYDBgIGFuZCBgaW50ZXJ2YWxgXG4gICAgLy8gVXNpbmcgYSBgc2V0VGltZW91dChfLCBqaXR0ZXIpYCBoZXJlIHRvIGFjY29tcGxpc2ggdGhhdC5cbiAgICAvLyBgTWF0aC5yYW5kb20oKWAgY2FuIGJlIGAwYCBzbyB3ZSB1c2UgYDAuNWAgaWYgdGhpcyBoYXBwZW5zXG4gICAgLy8gUmVmZXJlbmNlOiBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSNoZWFydGJlYXRpbmdcbiAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLmNlaWwodGhpcy5oZWFydC5pbnRlcnZhbCAqIChNYXRoLnJhbmRvbSgpIHx8IDAuNSkpXG5cbiAgICB0aGlzLmhlYXJ0LnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gQmVnaW5uaW5nIGhlYXJ0YmVhdGluZyBwcm9jZXNzIGZvciBTaGFyZCAjJHt0aGlzLmlkfWApXG5cbiAgICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuXG5cbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIEhlYXJ0YmVhdGluZyBvbiBTaGFyZCAjJHt0aGlzLmlkfS4gUHJldmlvdXMgc2VxdWVuY2UgbnVtYmVyOiAke3RoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcn1gKVxuXG4gICAgICAvLyBVc2luZyBhIGRpcmVjdCBzb2NrZXQuc2VuZCBjYWxsIGhlcmUgYmVjYXVzZSBoZWFydGJlYXQgcmVxdWVzdHMgYXJlIHJlc2VydmVkIGJ5IHVzLlxuICAgICAgdGhpcy5zb2NrZXQ/LnNlbmQoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0LFxuICAgICAgICAgIGQ6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgfSksXG4gICAgICApXG5cbiAgICAgIHRoaXMuaGVhcnQubGFzdEJlYXQgPSBEYXRlLm5vdygpXG4gICAgICB0aGlzLmhlYXJ0LmFja25vd2xlZGdlZCA9IGZhbHNlXG5cbiAgICAgIC8vIEFmdGVyIHRoZSByYW5kb20gaGVhcnRiZWF0IGppdHRlciB3ZSBjYW4gc3RhcnQgYSBub3JtYWwgaW50ZXJ2YWwuXG4gICAgICB0aGlzLmhlYXJ0LmludGVydmFsSWQgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IGlzIG5vdCBvcGVuLCBidXQgYXR0ZW1wdGVkIGhlYXJ0YmVhdCwgaWdub3JpbmcuYClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBTaGFyZCBkaWQgbm90IHJlY2VpdmUgYSBoZWFydGJlYXQgQUNLIGZyb20gRGlzY29yZCBpbiB0aW1lLFxuICAgICAgICAvLyB0aGVyZWZvcmUgd2UgaGF2ZSB0byBhc3N1bWUgdGhhdCB0aGUgY29ubmVjdGlvbiBoYXMgZmFpbGVkIG9yIGdvdCBcInpvbWJpZWRcIi5cbiAgICAgICAgLy8gVGhlIFNoYXJkIG5lZWRzIHRvIHN0YXJ0IGEgcmUtaWRlbnRpZnkgYWN0aW9uIGFjY29yZGluZ2x5LlxuICAgICAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I2hlYXJ0YmVhdGluZy1leGFtcGxlLWdhdGV3YXktaGVhcnRiZWF0LWFja1xuICAgICAgICBpZiAoIXRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gSGVhcnRiZWF0IG5vdCBhY2tub3dsZWRnZWQgZm9yIFNoYXJkICMke3RoaXMuaWR9LiBBc3N1bWluZyB6b21iaWVkIGNvbm5lY3Rpb24uYClcbiAgICAgICAgICBhd2FpdCB0aGlzLmNsb3NlKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5ab21iaWVkQ29ubmVjdGlvbiwgJ1pvbWJpZWQgY29ubmVjdGlvbiwgZGlkIG5vdCByZWNlaXZlIGFuIGhlYXJ0YmVhdCBBQ0sgaW4gdGltZS4nKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gSGVhcnRiZWF0aW5nIG9uIFNoYXJkICMke3RoaXMuaWR9LiBQcmV2aW91cyBzZXF1ZW5jZSBudW1iZXI6ICR7dGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyfWApXG5cbiAgICAgICAgLy8gVXNpbmcgYSBkaXJlY3Qgc29ja2V0LnNlbmQgY2FsbCBoZXJlIGJlY2F1c2UgaGVhcnRiZWF0IHJlcXVlc3RzIGFyZSByZXNlcnZlZCBieSB1cy5cbiAgICAgICAgdGhpcy5zb2NrZXQ/LnNlbmQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdCxcbiAgICAgICAgICAgIGQ6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuXG4gICAgICAgIHRoaXMuaGVhcnQubGFzdEJlYXQgPSBEYXRlLm5vdygpXG4gICAgICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gZmFsc2VcblxuICAgICAgICB0aGlzLmV2ZW50cy5oZWFydGJlYXQ/Lih0aGlzKVxuICAgICAgfSwgdGhpcy5oZWFydC5pbnRlcnZhbClcbiAgICB9LCBqaXR0ZXIpXG4gIH1cblxuICAvKiogU3RvcCB0aGUgaGVhcnRiZWF0aW5nIHByb2Nlc3Mgd2l0aCBkaXNjb3JkLiAqL1xuICBzdG9wSGVhcnRiZWF0aW5nKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIHRoZSByZWd1bGFyIGhlYXJ0YmVhdCBpbnRlcnZhbC5cbiAgICBjbGVhckludGVydmFsKHRoaXMuaGVhcnQuaW50ZXJ2YWxJZClcbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIFNoYXJkIGdvdCBjbG9zZWQgYmVmb3JlIHRoZSBmaXJzdCBqaXR0ZXJlZCBoZWFydGJlYXQuXG4gICAgLy8gVG8gZ28gc2FmZSB3ZSBzaG91bGQgY2xlYXIgdGhlIHJlbGF0ZWQgdGltZW91dCB0b28uXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuaGVhcnQudGltZW91dElkKVxuICB9XG59XG5cbi8qKiBDaGVjayBpZiB0aGUgYnVmZmVyIGVuZHMgd2l0aCB0aGUgbWFya2VyICovXG5mdW5jdGlvbiBlbmRzV2l0aE1hcmtlcihidWZmZXI6IFVpbnQ4QXJyYXksIG1hcmtlcjogVWludDhBcnJheSkge1xuICBpZiAoYnVmZmVyLmxlbmd0aCA8IG1hcmtlci5sZW5ndGgpIHJldHVybiBmYWxzZVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya2VyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gbWFya2VyLmxlbmd0aCArIGldICE9PSBtYXJrZXJbaV0pIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGFyZENyZWF0ZU9wdGlvbnMge1xuICAvKiogVGhlIHNoYXJkIGlkICovXG4gIGlkOiBudW1iZXJcbiAgLyoqIFRoZSBjb25uZWN0aW9uIGRldGFpbHMgKi9cbiAgY29ubmVjdGlvbjogU2hhcmRHYXRld2F5Q29uZmlnXG4gIC8qKiBUaGUgZXZlbnQgaGFuZGxlcnMgZm9yIGV2ZW50cyBvbiB0aGUgc2hhcmQuICovXG4gIGV2ZW50czogU2hhcmRFdmVudHNcbiAgLyoqIFRoZSBsb2dnZXIgZm9yIHRoZSBzaGFyZCAqL1xuICBsb2dnZXI/OiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cbiAgLyoqIFRoZSBoYW5kbGVyIHRvIHJlcXVlc3QgYSBzcGFjZSB0byBtYWtlIGFuIGlkZW50aWZ5IHJlcXVlc3QuICovXG4gIHJlcXVlc3RJZGVudGlmeT86ICgpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIEZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgYm90IHN0YXR1cyB0byBzZW5kIG9uIElkZW50aWZ5IHJlcXVlc3RzICovXG4gIG1ha2VQcmVzZW5jZT86ICgpID0+IFByb21pc2U8RGlzY29yZFVwZGF0ZVByZXNlbmNlIHwgdW5kZWZpbmVkPlxufVxuXG5leHBvcnQgZGVmYXVsdCBEaXNjb3JkZW5vU2hhcmRcbiJdLCJuYW1lcyI6WyJCdWZmZXIiLCJjcmVhdGVJbmZsYXRlIiwiaW5mbGF0ZVN5bmMiLCJjb25zdGFudHMiLCJ6bGliQ29uc3RhbnRzIiwiR2F0ZXdheUNsb3NlRXZlbnRDb2RlcyIsIkdhdGV3YXlPcGNvZGVzIiwiTGVha3lCdWNrZXQiLCJjYW1lbGl6ZSIsImRlbGF5IiwibG9nZ2VyIiwiTm9kZVdlYlNvY2tldCIsIlNoYXJkU29ja2V0Q2xvc2VDb2RlcyIsIlNoYXJkU3RhdGUiLCJUcmFuc3BvcnRDb21wcmVzc2lvbiIsIlpMSUJfU1lOQ19GTFVTSCIsIlVpbnQ4QXJyYXkiLCJmenN0ZCIsImdldEZaU3RkIiwiRGlzY29yZGVub1NoYXJkIiwib3B0aW9ucyIsIm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayIsInByZXZpb3VzU2VxdWVuY2VOdW1iZXIiLCJyYXRlTGltaXRSZXNldEludGVydmFsIiwic3RhdGUiLCJPZmZsaW5lIiwicmVzdW1lR2F0ZXdheVVybCIsImV2ZW50cyIsIm9mZmxpbmVTZW5kUXVldWUiLCJyZXNvbHZlcyIsIk1hcCIsImdvaW5nT2ZmbGluZSIsInRleHREZWNvZGVyIiwiVGV4dERlY29kZXIiLCJpbmZsYXRlQnVmZmVyIiwiZGVjb21wcmVzc2lvblByb21pc2VzUXVldWUiLCJpZCIsImNvbm5lY3Rpb24iLCJoZWFydCIsImFja25vd2xlZGdlZCIsImludGVydmFsIiwicmVxdWVzdElkZW50aWZ5IiwibWFrZVByZXNlbmNlIiwiYnVja2V0IiwibWF4IiwiY2FsY3VsYXRlU2FmZVJlcXVlc3RzIiwicmVmaWxsQW1vdW50IiwicmVmaWxsSW50ZXJ2YWwiLCJnYXRld2F5Q29uZmlnIiwiY29ubmVjdGlvblVybCIsInVybCIsInNhZmVSZXF1ZXN0cyIsIk1hdGgiLCJjZWlsIiwiY2hlY2tPZmZsaW5lIiwiaGlnaFByaW9yaXR5IiwiaXNPcGVuIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ1bnNoaWZ0IiwicHVzaCIsImNsb3NlIiwiY29kZSIsInJlYXNvbiIsImRlYnVnIiwic29ja2V0IiwicmVhZHlTdGF0ZSIsIk9QRU4iLCJOb3JtYWxDbG9zdXJlIiwiR29pbmdBd2F5IiwicHJvbWlzZSIsInJlc29sdmVBZnRlckNsb3NlIiwidW5kZWZpbmVkIiwiY29ubmVjdCIsIklkZW50aWZ5aW5nIiwiUmVzdW1pbmciLCJpbmNsdWRlcyIsIkNvbm5lY3RpbmciLCJjb25uZWN0aW5nIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwic2V0IiwidmVyc2lvbiIsInRvU3RyaW5nIiwidHJhbnNwb3J0Q29tcHJlc3Npb24iLCJ6bGliIiwiaW5mbGF0ZSIsImZpbmlzaEZsdXNoIiwiWl9TWU5DX0ZMVVNIIiwiY2h1bmtTaXplIiwib24iLCJlIiwiZXJyb3IiLCJkYXRhIiwibmV3QnVmZmVyIiwiYnl0ZUxlbmd0aCIsInpzdGQiLCJjYXRjaCIsIndhcm4iLCJkZWxldGUiLCJ6c3RkRGVjb21wcmVzcyIsIkRlY29tcHJlc3MiLCJkZWNvZGVkRGF0YSIsImRlY29kZSIsInBhcnNlZERhdGEiLCJKU09OIiwicGFyc2UiLCJzaGlmdCIsImNvbXByZXNzIiwic2hvdWxkVXNlQnVpbHRpbiIsIlJlZmxlY3QiLCJoYXMiLCJnbG9iYWxUaGlzIiwiV2ViU29ja2V0IiwiYmluYXJ5VHlwZSIsIm9uZXJyb3IiLCJldmVudCIsImhhbmRsZUVycm9yIiwib25jbG9zZSIsImNsb3NlRXZlbnQiLCJoYW5kbGVDbG9zZSIsIm9ubWVzc2FnZSIsIm1lc3NhZ2VFdmVudCIsImhhbmRsZU1lc3NhZ2UiLCJvbm9wZW4iLCJVbmlkZW50aWZpZWQiLCJjb25uZWN0ZWQiLCJpZGVudGlmeSIsImJ5cGFzc1JlcXVlc3QiLCJSZUlkZW50aWZ5aW5nIiwiaWRlbnRpZnlpbmciLCJzZW5kIiwib3AiLCJJZGVudGlmeSIsImQiLCJ0b2tlbiIsInByb3BlcnRpZXMiLCJpbnRlbnRzIiwic2hhcmQiLCJ0b3RhbFNoYXJkcyIsInByZXNlbmNlIiwiaWRlbnRpZmllZCIsInJlc3VtZSIsIlJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uIiwic2Vzc2lvbklkIiwiUmVzdW1lIiwic2Vzc2lvbl9pZCIsInNlcSIsIm1lc3NhZ2UiLCJhY3F1aXJlIiwic3RyaW5naWZ5Iiwic2h1dGRvd24iLCJTaHV0ZG93biIsInN0b3BIZWFydGJlYXRpbmciLCJUZXN0aW5nRmluaXNoZWQiLCJkaXNjb25uZWN0ZWQiLCJSZXNoYXJkZWQiLCJEaXNjb25uZWN0ZWQiLCJBdXRoZW50aWNhdGlvbkZhaWxlZCIsIkludmFsaWRTaGFyZCIsIlNoYXJkaW5nUmVxdWlyZWQiLCJJbnZhbGlkQXBpVmVyc2lvbiIsIkludmFsaWRJbnRlbnRzIiwiRGlzYWxsb3dlZEludGVudHMiLCJFcnJvciIsIk5vdEF1dGhlbnRpY2F0ZWQiLCJJbnZhbGlkU2VxIiwiU2Vzc2lvblRpbWVkT3V0IiwiVW5rbm93bkVycm9yIiwiVW5rbm93bk9wY29kZSIsIkRlY29kZUVycm9yIiwiUmF0ZUxpbWl0ZWQiLCJBbHJlYWR5QXV0aGVudGljYXRlZCIsImlzQ29tcHJlc3NlZCIsIkFycmF5QnVmZmVyIiwiZGVjb21wcmVzc1BhY2tldCIsImhhbmRsZURpc2NvcmRQYWNrZXQiLCJjb21wcmVzc2VkRGF0YSIsImZhdGFsIiwid3JpdGVQcm9taXNlIiwicmVqZWN0Iiwid3JpdGUiLCJlbmRzV2l0aE1hcmtlciIsImRlY29tcHJlc3Npb25Qcm9taXNlIiwiciIsImRlY29tcHJlc3NlZCIsInBhY2tldCIsImxhc3RBY2siLCJEYXRlIiwibm93IiwiSGVhcnRiZWF0IiwibGFzdEJlYXQiLCJoZWFydGJlYXQiLCJIZWxsbyIsImhlYXJ0YmVhdF9pbnRlcnZhbCIsInN0YXJ0SGVhcnRiZWF0aW5nIiwiY3VycmVudFF1ZXVlIiwicXVldWUiLCJoZWxsbyIsIkhlYXJ0YmVhdEFDSyIsInJ0dCIsImhlYXJ0YmVhdEFjayIsIlJlY29ubmVjdCIsInJlcXVlc3RlZFJlY29ubmVjdCIsIkludmFsaWRTZXNzaW9uIiwicmVzdW1hYmxlIiwiaW52YWxpZFNlc3Npb24iLCJmbG9vciIsInJhbmRvbSIsImdldCIsInQiLCJDb25uZWN0ZWQiLCJyZXN1bWVkIiwiZm9yRWFjaCIsImxlbmd0aCIsInBheWxvYWQiLCJyZXN1bWVfZ2F0ZXdheV91cmwiLCJzIiwiZm9yd2FyZFRvQm90Iiwiaml0dGVyIiwidGltZW91dElkIiwic2V0VGltZW91dCIsImludGVydmFsSWQiLCJzZXRJbnRlcnZhbCIsIlpvbWJpZWRDb25uZWN0aW9uIiwiY2xlYXJJbnRlcnZhbCIsImNsZWFyVGltZW91dCIsImJ1ZmZlciIsIm1hcmtlciIsImkiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLE1BQU0sUUFBUSxjQUFhO0FBQ3BDLFNBQXVCQyxhQUFhLEVBQUVDLFdBQVcsRUFBRUMsYUFBYUMsYUFBYSxRQUFRLFlBQVc7QUFFaEcsU0FBU0Msc0JBQXNCLEVBQUVDLGNBQWMsUUFBUSxvQkFBbUI7QUFDMUUsU0FBU0MsV0FBVyxFQUFFQyxRQUFRLEVBQUVDLEtBQUssRUFBRUMsTUFBTSxRQUFRLG9CQUFtQjtBQUV4RSxPQUFPQyxtQkFBbUIsS0FBSTtBQUM5QixTQUlFQyxxQkFBcUIsRUFFckJDLFVBQVUsRUFDVkMsb0JBQW9CLFFBQ2YsYUFBWTtBQUVuQixNQUFNQyxrQkFBa0IsSUFBSUMsV0FBVztJQUFDO0lBQUs7SUFBSztJQUFNO0NBQUs7QUFFN0QsSUFBSUM7QUFFSix3RUFBd0UsR0FDeEUsZUFBZUM7SUFDYixPQUFRRCxVQUFVLE1BQU0sTUFBTSxDQUFDO0FBQ2pDO0FBRUEsT0FBTyxNQUFNRTtJQTJEWCxZQUFZQyxPQUEyQixDQUFFO1FBcER6QywwSEFBMEgsUUFDMUhDLDhCQUFzQztRQUN0QywwQ0FBMEMsUUFDMUNDLHlCQUF3QztRQUN4Qyw0RUFBNEUsUUFDNUVDLHlCQUFpQztRQUtqQyx3Q0FBd0MsUUFDeENDLFFBQVFYLFdBQVdZLE9BQU87UUFDMUIsaUZBQWlGLFFBQ2pGQyxtQkFBMkI7UUFDM0Isc0NBQXNDLFFBQ3RDQyxTQUFzQixDQUFDO1FBQ3ZCLG1HQUFtRyxRQUNuR0MsbUJBQW1DLEVBQUU7UUFDckMsaUZBQWlGLFFBQ2pGQyxXQUFXLElBQUlDO1FBS2Y7Ozs7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
627
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TaGFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdub2RlOmJ1ZmZlcidcbmltcG9ydCB7IGNyZWF0ZUluZmxhdGUsIHR5cGUgSW5mbGF0ZSwgaW5mbGF0ZVN5bmMsIGNvbnN0YW50cyBhcyB6bGliQ29uc3RhbnRzIH0gZnJvbSAnbm9kZTp6bGliJ1xuaW1wb3J0IHR5cGUgeyBEaXNjb3JkR2F0ZXdheVBheWxvYWQsIERpc2NvcmRIZWxsbywgRGlzY29yZFJlYWR5LCBEaXNjb3JkVXBkYXRlUHJlc2VuY2UgfSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB7IEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMsIEdhdGV3YXlPcGNvZGVzIH0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnXG5pbXBvcnQgeyBjYW1lbGl6ZSwgZGVsYXksIExlYWt5QnVja2V0LCBsb2dnZXIgfSBmcm9tICdAZGlzY29yZGVuby91dGlscydcbmltcG9ydCB0eXBlIHsgRGVjb21wcmVzcyBhcyBac3RkRGVjb21wcmVzcyB9IGZyb20gJ2Z6c3RkJ1xuaW1wb3J0IE5vZGVXZWJTb2NrZXQgZnJvbSAnd3MnXG5pbXBvcnQge1xuICB0eXBlIFNoYXJkRXZlbnRzLFxuICB0eXBlIFNoYXJkR2F0ZXdheUNvbmZpZyxcbiAgdHlwZSBTaGFyZEhlYXJ0LFxuICBTaGFyZFNvY2tldENsb3NlQ29kZXMsXG4gIHR5cGUgU2hhcmRTb2NrZXRSZXF1ZXN0LFxuICBTaGFyZFN0YXRlLFxuICBUcmFuc3BvcnRDb21wcmVzc2lvbixcbn0gZnJvbSAnLi90eXBlcy5qcydcblxuY29uc3QgWkxJQl9TWU5DX0ZMVVNIID0gbmV3IFVpbnQ4QXJyYXkoWzB4MCwgMHgwLCAweGZmLCAweGZmXSlcblxubGV0IGZ6c3RkOiB0eXBlb2YgaW1wb3J0KCdmenN0ZCcpXG5cbi8qKiBTaW5jZSBmenN0ZCBpcyBhbiBvcHRpb25hbCBkZXBlbmRlbmN5LCB3ZSBuZWVkIHRvIGltcG9ydCBpdCBsYXppbHkuICovXG5hc3luYyBmdW5jdGlvbiBnZXRGWlN0ZCgpIHtcbiAgcmV0dXJuIChmenN0ZCA/Pz0gYXdhaXQgaW1wb3J0KCdmenN0ZCcpKVxufVxuXG5leHBvcnQgY2xhc3MgRGlzY29yZGVub1NoYXJkIHtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgc2hhcmQuICovXG4gIGlkOiBudW1iZXJcbiAgLyoqIFRoZSBjb25uZWN0aW9uIGNvbmZpZyBkZXRhaWxzIHRoYXQgdGhpcyBzaGFyZCB3aWxsIHVzZWQgdG8gY29ubmVjdCB0byBkaXNjb3JkLiAqL1xuICBjb25uZWN0aW9uOiBTaGFyZEdhdGV3YXlDb25maWdcbiAgLyoqIFRoaXMgY29udGFpbnMgYWxsIHRoZSBoZWFydGJlYXQgaW5mb3JtYXRpb24gKi9cbiAgaGVhcnQ6IFNoYXJkSGVhcnRcbiAgLyoqIFRoZSBtYXhpbXVtIG9mIHJlcXVlc3RzIHdoaWNoIGNhbiBiZSBzZW5kIHRvIGRpc2NvcmQgcGVyIHJhdGUgbGltaXQgdGljay4gVHlwaWNhbGx5IHRoaXMgdmFsdWUgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkLiAqL1xuICBtYXhSZXF1ZXN0c1BlclJhdGVMaW1pdFRpY2s6IG51bWJlciA9IDEyMFxuICAvKiogVGhlIHByZXZpb3VzIHBheWxvYWQgc2VxdWVuY2UgbnVtYmVyLiAqL1xuICBwcmV2aW91c1NlcXVlbmNlTnVtYmVyOiBudW1iZXIgfCBudWxsID0gbnVsbFxuICAvKiogSW4gd2hpY2ggaW50ZXJ2YWwgKGluIG1pbGxpc2Vjb25kcykgdGhlIGdhdGV3YXkgcmVzZXRzIGl0J3MgcmF0ZSBsaW1pdC4gKi9cbiAgcmF0ZUxpbWl0UmVzZXRJbnRlcnZhbDogbnVtYmVyID0gNjAwMDBcbiAgLyoqIEN1cnJlbnQgc2Vzc2lvbiBpZCBvZiB0aGUgc2hhcmQgaWYgcHJlc2VudC4gKi9cbiAgc2Vzc2lvbklkPzogc3RyaW5nXG4gIC8qKiBUaGlzIGNvbnRhaW5zIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byBEaXNjb3JkLCBpZiBjdXJyZW50bHkgY29ubmVjdGVkLiAqL1xuICBzb2NrZXQ/OiBXZWJTb2NrZXRcbiAgLyoqIEN1cnJlbnQgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHRoaXMuICovXG4gIHN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gIC8qKiBUaGUgdXJsIHByb3ZpZGVkIGJ5IGRpc2NvcmQgdG8gdXNlIHdoZW4gcmVzdW1pbmcgYSBjb25uZWN0aW9uIGZvciB0aGlzIHRoaXMuICovXG4gIHJlc3VtZUdhdGV3YXlVcmw6IHN0cmluZyA9ICcnXG4gIC8qKiBUaGUgc2hhcmQgcmVsYXRlZCBldmVudCBoYW5kbGVycy4gKi9cbiAgZXZlbnRzOiBTaGFyZEV2ZW50cyA9IHt9XG4gIC8qKiBDYWNoZSBmb3IgcGVuZGluZyBnYXRld2F5IHJlcXVlc3RzIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gc2VuZCB3aGlsZSB0aGUgZ2F0ZXdheSB3ZW50IG9mZmxpbmUuICovXG4gIG9mZmxpbmVTZW5kUXVldWU6ICgoKSA9PiB2b2lkKVtdID0gW11cbiAgLyoqIFJlc29sdmUgaW50ZXJuYWwgd2FpdGluZyBzdGF0ZXMuIE1hcHBlZCBieSBTZWxlY3RlZEV2ZW50cyA9PiBSZXNvbHZlRnVuY3Rpb24gKi9cbiAgcmVzb2x2ZXMgPSBuZXcgTWFwPCdSRUFEWScgfCAnUkVTVU1FRCcgfCAnSU5WQUxJRF9TRVNTSU9OJywgKHBheWxvYWQ6IERpc2NvcmRHYXRld2F5UGF5bG9hZCkgPT4gdm9pZD4oKVxuICAvKiogU2hhcmQgYnVja2V0LiBPbmx5IGFjY2VzcyB0aGlzIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4gQnVja2V0IGZvciBoYW5kbGluZyBzaGFyZCByZXF1ZXN0IHJhdGUgbGltaXRzLiAqL1xuICBidWNrZXQ6IExlYWt5QnVja2V0XG4gIC8qKiBMb2dnZXIgZm9yIHRoZSBidWNrZXQuICovXG4gIGxvZ2dlcjogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+XG4gIC8qKlxuICAgKiBJcyB0aGUgc2hhcmQgZ29pbmcgb2ZmbGluZT9cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVGhpcyB3aWxsIGJlIHRydWUgaWYgdGhlIGNsb3NlIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgd2l0aCBlaXRoZXIgMTAwMCBvciAxMDAxXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBUaGlzIGlzIGZvciBpbnRlcm5hbCBwdXJwb3NlcyBvbmx5LCBhbmQgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzLlxuICAgKi9cbiAgZ29pbmdPZmZsaW5lID0gZmFsc2VcbiAgLyoqIFRleHQgZGVjb2RlciB1c2VkIGZvciBjb21wcmVzc2VkIHBheWxvYWRzLiAqL1xuICB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gIC8qKiBaTGliIEluZmxhdGUgaW5zdGFuY2UgZm9yIFpMaWItc3RyZWFtIHRyYW5zcG9ydCBwYXlsb2Fkcy4gKi9cbiAgaW5mbGF0ZT86IEluZmxhdGVcbiAgLyoqIFpMaWIgaW5mbGF0ZSBidWZmZXIuICovXG4gIGluZmxhdGVCdWZmZXI6IFVpbnQ4QXJyYXkgfCBudWxsID0gbnVsbFxuICAvKiogWlN0ZCBEZWNvbXByZXNzIGluc3RhbmNlIGZvciBaU3RkLXN0cmVhbSB0cmFuc3BvcnQgcGF5bG9hZHMuICovXG4gIHpzdGREZWNvbXByZXNzPzogWnN0ZERlY29tcHJlc3NcbiAgLyoqIFF1ZXVlIGZvciBjb21wcmVzc2VkIHBheWxvYWRzIGZvciBac3RkIERlY29tcHJlc3MgKi9cbiAgZGVjb21wcmVzc2lvblByb21pc2VzUXVldWU6ICgoZGF0YTogRGlzY29yZEdhdGV3YXlQYXlsb2FkKSA9PiB2b2lkKVtdID0gW11cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbmNlIHRoZSBzb2NrZXQgaXMgY2xvc2VkIGFuZCBoYW5kbGVDbG9zZSgpIGhhcyBmaW5pc2hlZCB1cGRhdGluZyBpbnRlcm5hbCBzdGF0ZXMuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBUaGlzIGlzIGZvciBpbnRlcm5hbCBwdXJwb3NlcyBvbmx5LCBhbmQgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzLlxuICAgKi9cbiAgcmVzb2x2ZUFmdGVyQ2xvc2U/OiAoY2xvc2U6IENsb3NlRXZlbnQpID0+IHZvaWRcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTaGFyZENyZWF0ZU9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZFxuICAgIHRoaXMuY29ubmVjdGlvbiA9IG9wdGlvbnMuY29ubmVjdGlvblxuICAgIHRoaXMuZXZlbnRzID0gb3B0aW9ucy5ldmVudHNcbiAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyID8/IGxvZ2dlclxuXG4gICAgdGhpcy5oZWFydCA9IHtcbiAgICAgIGFja25vd2xlZGdlZDogZmFsc2UsXG4gICAgICBpbnRlcnZhbDogNDUwMDAsXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucmVxdWVzdElkZW50aWZ5KSB0aGlzLnJlcXVlc3RJZGVudGlmeSA9IG9wdGlvbnMucmVxdWVzdElkZW50aWZ5XG4gICAgaWYgKG9wdGlvbnMubWFrZVByZXNlbmNlKSB0aGlzLm1ha2VQcmVzZW5jZSA9IG9wdGlvbnMubWFrZVByZXNlbmNlXG5cbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBMZWFreUJ1Y2tldCh7XG4gICAgICBtYXg6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxBbW91bnQ6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxJbnRlcnZhbDogNjAwMDAsXG4gICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgIH0pXG4gIH1cblxuICAvKiogVGhlIGdhdGV3YXkgY29uZmlndXJhdGlvbiB3aGljaCBpcyB1c2VkIHRvIGNvbm5lY3QgdG8gRGlzY29yZC4gKi9cbiAgZ2V0IGdhdGV3YXlDb25maWcoKTogU2hhcmRHYXRld2F5Q29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uXG4gIH1cblxuICAvKiogVGhlIHVybCB0byBjb25uZWN0IHRvLiBJbml0aWFsbHkgdGhpcyBpcyB0aGUgZGlzY29yZCBnYXRld2F5IHVybCwgYW5kIHRoZW4gaXMgc3dpdGNoZWQgdG8gcmVzdW1lIGdhdGV3YXkgdXJsIG9uY2UgYSBSRUFEWSBpcyByZWNlaXZlZC4gKi9cbiAgZ2V0IGNvbm5lY3Rpb25VcmwoKTogc3RyaW5nIHtcbiAgICAvLyBVc2UgfHwgYW5kIG5vdCA/PyBoZXJlLiA/PyB3aWxsIGNhdXNlIGEgYnVnLlxuICAgIHJldHVybiB0aGlzLnJlc3VtZUdhdGV3YXlVcmwgfHwgdGhpcy5nYXRld2F5Q29uZmlnLnVybFxuICB9XG5cbiAgLyoqIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHJlcXVlc3RzIHdoaWNoIGNhbiBzYWZlbHkgYmUgbWFkZSBwZXIgcmF0ZSBsaW1pdCBpbnRlcnZhbCwgYmVmb3JlIHRoZSBnYXRld2F5IGdldHMgZGlzY29ubmVjdGVkIGR1ZSB0byBhbiBleGNlZWRlZCByYXRlIGxpbWl0LiAqL1xuICBjYWxjdWxhdGVTYWZlUmVxdWVzdHMoKTogbnVtYmVyIHtcbiAgICAvLyAqIDIgYWRkcyBleHRyYSBzYWZldHkgbGF5ZXIgZm9yIGRpc2NvcmRzIE9QIDEgcmVxdWVzdHMgdGhhdCB3ZSBuZWVkIHRvIHJlc3BvbmQgdG9cbiAgICBjb25zdCBzYWZlUmVxdWVzdHMgPSB0aGlzLm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayAtIE1hdGguY2VpbCh0aGlzLnJhdGVMaW1pdFJlc2V0SW50ZXJ2YWwgLyB0aGlzLmhlYXJ0LmludGVydmFsKSAqIDJcblxuICAgIHJldHVybiBzYWZlUmVxdWVzdHMgPCAwID8gMCA6IHNhZmVSZXF1ZXN0c1xuICB9XG5cbiAgYXN5bmMgY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzT3BlbigpKSByZXR1cm5cblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gSGlnaGVyIHByaW9yaXR5IHJlcXVlc3RzIGdldCBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS5cbiAgICAgIGlmIChoaWdoUHJpb3JpdHkpIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS51bnNoaWZ0KHJlc29sdmUpXG4gICAgICBlbHNlIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5wdXNoKHJlc29sdmUpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgc29ja2V0IGNvbm5lY3Rpb24gdG8gZGlzY29yZCBpZiBwcmVzZW50LiAqL1xuICBhc3luYyBjbG9zZShjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gUmVxdWVzdCBmb3IgU2hhcmQgIyR7dGhpcy5pZH0gdG8gY2xvc2UgdGhlIHNvY2tldCB3aXRoIGNvZGUgJHtjb2RlfS5gKVxuXG4gICAgaWYgKHRoaXMuc29ja2V0Py5yZWFkeVN0YXRlICE9PSBOb2RlV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9J3MgcmVhZHkgc3RhdGUgaXMgJHt0aGlzLnNvY2tldD8ucmVhZHlTdGF0ZX0sIFVuYWJsZSB0byBjbG9zZS5gKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5nb2luZ09mZmxpbmUgPSBjb2RlID09PSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLk5vcm1hbENsb3N1cmUgfHwgY29kZSA9PT0gR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Hb2luZ0F3YXlcblxuICAgIC8vIFRoaXMgaGFzIHRvIGJlIGNyZWF0ZWQgYmVmb3JlIHRoZSBhY3R1YWwgY2FsbCB0byBzb2NrZXQuY2xvc2UgYXMgZm9yIGV4YW1wbGUgQnVuIGNhbGxzIHNvY2tldC5vbmNsb3NlIGltbWVkaWF0ZWx5IG9uIHRoZSAuY2xvc2UoKSBjYWxsIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlIGNvbm5lY3Rpb24gdG8gZW5kXG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVBZnRlckNsb3NlID0gcmVzb2x2ZVxuICAgIH0pXG5cbiAgICB0aGlzLnNvY2tldC5jbG9zZShjb2RlLCByZWFzb24pXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBXYWl0aW5nIGZvciBTaGFyZCAjJHt0aGlzLmlkfSB0byBjbG9zZSB0aGUgc29ja2V0IHdpdGggY29kZSAke2NvZGV9LmApXG5cbiAgICAvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgZnVsbHkgY2xvc2VkLCBvdGhlcndpc2UgdGhlcmUnbGwgYmUgcmFjZSBjb25kaXRpb24gaXNzdWVzIGlmIHdlIHRyeSB0byBjb25uZWN0IGFnYWluLCByZXN1bHRpbmcgaW4gdW5leHBlY3RlZCBiZWhhdmlvci5cbiAgICBhd2FpdCBwcm9taXNlXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCAjJHt0aGlzLmlkfSBjbG9zZWQgdGhlIHNvY2tldCB3aXRoIGNvZGUgJHtjb2RlfS5gKVxuXG4gICAgLy8gUmVzZXQgdGhlIHJlc29sdmVBZnRlckNsb3NlIGZ1bmN0aW9uIGFmdGVyIGl0IGhhcyBiZWVuIHJlc29sdmVkLlxuICAgIHRoaXMucmVzb2x2ZUFmdGVyQ2xvc2UgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKiBDb25uZWN0IHRoZSBzaGFyZCB3aXRoIHRoZSBnYXRld2F5IGFuZCBzdGFydCBoZWFydGJlYXRpbmcuIFRoaXMgd2lsbCBub3QgaWRlbnRpZnkgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LiAqL1xuICBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8RGlzY29yZGVub1NoYXJkPiB7XG4gICAgLy8gT25seSBzZXQgdGhlIHNoYXJkIHRvIGBDb25uZWN0aW5nYCBzdGF0ZSxcbiAgICAvLyBpZiB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IGRvZXMgbm90IGNvbWUgZnJvbSBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgIGlmICghW1NoYXJkU3RhdGUuSWRlbnRpZnlpbmcsIFNoYXJkU3RhdGUuUmVzdW1pbmddLmluY2x1ZGVzKHRoaXMuc3RhdGUpKSB7XG4gICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0aW5nXG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gQ29ubmVjdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBzb2NrZXQuYClcblxuICAgIHRoaXMuZXZlbnRzLmNvbm5lY3Rpbmc/Lih0aGlzKVxuXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTCh0aGlzLmNvbm5lY3Rpb25VcmwpXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3YnLCB0aGlzLmdhdGV3YXlDb25maWcudmVyc2lvbi50b1N0cmluZygpKVxuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdlbmNvZGluZycsICdqc29uJylcblxuICAgIC8vIFNldCB0aGUgY29tcHJlc3MgdXJsIHBhcmFtIGFuZCBpbml0aWFsaXplIHRoZSBkZWNvbXByZXNzaW9uIGNvbnRleHRzXG4gICAgaWYgKHRoaXMuZ2F0ZXdheUNvbmZpZy50cmFuc3BvcnRDb21wcmVzc2lvbikge1xuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2NvbXByZXNzJywgdGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uKVxuXG4gICAgICBpZiAodGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uID09PSBUcmFuc3BvcnRDb21wcmVzc2lvbi56bGliKSB7XG4gICAgICAgIHRoaXMuaW5mbGF0ZUJ1ZmZlciA9IG51bGxcbiAgICAgICAgdGhpcy5pbmZsYXRlID0gY3JlYXRlSW5mbGF0ZSh7XG4gICAgICAgICAgZmluaXNoRmx1c2g6IHpsaWJDb25zdGFudHMuWl9TWU5DX0ZMVVNILFxuICAgICAgICAgIGNodW5rU2l6ZTogNjQgKiAxMDI0LFxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuaW5mbGF0ZS5vbignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdUaGUgd2FzIGFuIGVycm9yIGluIGRlY29tcHJlc3NpbmcgYSBaTGliIGNvbXByZXNzZWQgcGF5bG9hZCcsIGUpXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5pbmZsYXRlLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICBpZiAoIShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHJldHVyblxuXG4gICAgICAgICAgaWYgKHRoaXMuaW5mbGF0ZUJ1ZmZlcikge1xuICAgICAgICAgICAgY29uc3QgbmV3QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5pbmZsYXRlQnVmZmVyLmJ5dGVMZW5ndGggKyBkYXRhLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICBuZXdCdWZmZXIuc2V0KHRoaXMuaW5mbGF0ZUJ1ZmZlcilcbiAgICAgICAgICAgIG5ld0J1ZmZlci5zZXQoZGF0YSwgdGhpcy5pbmZsYXRlQnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmluZmxhdGVCdWZmZXIgPSBuZXdCdWZmZXJcblxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5pbmZsYXRlQnVmZmVyID0gZGF0YVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uID09PSBUcmFuc3BvcnRDb21wcmVzc2lvbi56c3RkKSB7XG4gICAgICAgIGNvbnN0IGZ6c3RkID0gYXdhaXQgZ2V0RlpTdGQoKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybignW1NoYXJkXSBcImZ6c3RkXCIgaXMgbm90IGluc3RhbGxlZC4gRGlzYWJsZWQgdHJhbnNwb3J0IGNvbXByZXNzaW9uLicpXG4gICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5kZWxldGUoJ2NvbXByZXNzJylcblxuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGZ6c3RkKSB7XG4gICAgICAgICAgdGhpcy56c3RkRGVjb21wcmVzcyA9IG5ldyBmenN0ZC5EZWNvbXByZXNzKChkYXRhKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkRGF0YSA9IHRoaXMudGV4dERlY29kZXIuZGVjb2RlKGRhdGEpXG4gICAgICAgICAgICBjb25zdCBwYXJzZWREYXRhID0gSlNPTi5wYXJzZShkZWNvZGVkRGF0YSlcbiAgICAgICAgICAgIHRoaXMuZGVjb21wcmVzc2lvblByb21pc2VzUXVldWUuc2hpZnQoKT8uKHBhcnNlZERhdGEpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MgJiYgdGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdbU2hhcmRdIFBheWxvYWQgY29tcHJlc3Npb24gaGFzIGJlZW4gZGlzYWJsZWQgc2luY2UgdHJhbnNwb3J0IGNvbXByZXNzaW9uIGlzIGVuYWJsZWQgYXMgd2VsbC4nKVxuICAgICAgdGhpcy5nYXRld2F5Q29uZmlnLmNvbXByZXNzID0gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBXZSBjaGVjayBmb3IgYnVpbHQtaW4gV2ViU29ja2V0IGltcGxlbWVudGF0aW9ucyBpbiBCdW4gb3IgRGVubywgTm9kZUpTIHYyMiBoYXMgYW4gaW1wbGVtZW50YXRpb24gdG9vIGJ1dCBpdCBzZWVtcyB0byBiZSBsZXNzIG9wdGltaXplZCBzbyBmb3Igbm93IGl0IGlzIGJldHRlciB0byB1c2UgdGhlIHdzIG5wbSBwYWNrYWdlXG4gICAgY29uc3Qgc2hvdWxkVXNlQnVpbHRpbiA9IFJlZmxlY3QuaGFzKGdsb2JhbFRoaXMsICdXZWJTb2NrZXQnKSAmJiAoUmVmbGVjdC5oYXMoZ2xvYmFsVGhpcywgJ0J1bicpIHx8IFJlZmxlY3QuaGFzKGdsb2JhbFRoaXMsICdEZW5vJykpXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIE5vZGVXZWJTb2NrZXQgZG9lc24ndCBzdXBwb3J0IFwiZGlzcGF0Y2hFdmVudFwiLCBhbmQgd2hpbGUgd2UgZG9uJ3QgdXNlIGl0LCBpdCBpcyByZXF1aXJlZCBvbiB0aGUgXCJXZWJTb2NrZXRcIiB0eXBlXG4gICAgY29uc3Qgc29ja2V0OiBXZWJTb2NrZXQgPSBzaG91bGRVc2VCdWlsdGluID8gbmV3IFdlYlNvY2tldCh1cmwpIDogbmV3IE5vZGVXZWJTb2NrZXQodXJsKVxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG5cbiAgICAvLyBCeSBkZWZhdWx0IFdlYlNvY2tldCB3aWxsIGdpdmUgdXMgYSBCbG9iLCB0aGlzIGNoYW5nZXMgaXQgc28gdGhhdCBpdCBnaXZlcyB1cyBhbiBBcnJheUJ1ZmZlclxuICAgIHNvY2tldC5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJ1xuXG4gICAgc29ja2V0Lm9uZXJyb3IgPSAoZXZlbnQpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXZlbnQpXG4gICAgc29ja2V0Lm9uY2xvc2UgPSAoY2xvc2VFdmVudCkgPT4gdGhpcy5oYW5kbGVDbG9zZShjbG9zZUV2ZW50KVxuICAgIHNvY2tldC5vbm1lc3NhZ2UgPSAobWVzc2FnZUV2ZW50KSA9PiB0aGlzLmhhbmRsZU1lc3NhZ2UobWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAvLyBPbmx5IHNldCB0aGUgc2hhcmQgdG8gYFVuaWRlbnRpZmllZGAgc3RhdGUgaWYgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBkb2VzIG5vdCBjb21lIGZyb20gYW4gaWRlbnRpZnkgb3IgcmVzdW1lIGFjdGlvbi5cbiAgICAgICAgaWYgKCFbU2hhcmRTdGF0ZS5JZGVudGlmeWluZywgU2hhcmRTdGF0ZS5SZXN1bWluZ10uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5VbmlkZW50aWZpZWRcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IHNvY2tldCBjb25uZWN0ZWQuYClcblxuICAgICAgICB0aGlzLmV2ZW50cy5jb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJlc29sdmUodGhpcylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIElkZW50aWZ5IHRoZSBzaGFyZCB0byB0aGUgZ2F0ZXdheS4gSWYgbm90IGNvbm5lY3RlZCwgdGhpcyB3aWxsIGFsc28gY29ubmVjdCB0aGUgc2hhcmQgdG8gdGhlIGdhdGV3YXkuXG4gICAqIEBwYXJhbSBieXBhc3NSZXF1ZXN0IC0gV2hldGhlciB0byBieXBhc3MgdGhlIHJlcXVlc3RJZGVudGlmeSBoYW5kbGVyIGFuZCBpZGVudGlmeSBpbW1lZGlhdGVseS4gVGhpcyBzaG91bGQgYmUgdXNlZCBjYXJlZnVsbHkgYXMgaXQgY2FuIGNhdXNlIGludmFsaWQgc2Vzc2lvbnMuXG4gICAqL1xuICBhc3luYyBpZGVudGlmeShieXBhc3NSZXF1ZXN0ID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBIG5ldyBpZGVudGlmeSBoYXMgYmVlbiByZXF1ZXN0ZWQgZXZlbiB0aG91Z2ggdGhlcmUgaXMgYWxyZWFkeSBhIGNvbm5lY3Rpb24gb3Blbi5cbiAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBjbG9zZSB0aGUgb2xkIGNvbm5lY3Rpb24gYW5kIGhlYXJ0YmVhdGluZyBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgb25lLlxuICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBJZGVudGlmeWluZyBvcGVuIFNoYXJkICMke3RoaXMuaWR9LCBjbG9zaW5nIHRoZSBjb25uZWN0aW9uYClcbiAgICAgIGF3YWl0IHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlSWRlbnRpZnlpbmcsICdSZS1pZGVudGlmeWluZyBjbG9zdXJlIG9mIG9sZCBjb25uZWN0aW9uLicpXG4gICAgfVxuXG4gICAgaWYgKCFieXBhc3NSZXF1ZXN0KSB7XG4gICAgICBhd2FpdCB0aGlzLnJlcXVlc3RJZGVudGlmeSgpXG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuSWRlbnRpZnlpbmdcbiAgICB0aGlzLmV2ZW50cy5pZGVudGlmeWluZz8uKHRoaXMpXG5cbiAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzaGFyZCBpcyBpbiBIZWFydGJlYXRpbmcgc3RhdGUgYnV0IG5vdCBpZGVudGlmaWVkLFxuICAgIC8vIHNvIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYWxyZWFkeSBhIGdhdGV3YXkgY29ubmVjdGlvbiBleGlzdGluZy5cbiAgICAvLyBJZiBub3Qgd2UgbmVlZCB0byBjcmVhdGUgb25lIGJlZm9yZSB3ZSBpZGVudGlmeS5cbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2VuZGluZyBJZGVudGlmeSBwYXlsb2FkIGZvciBTaGFyZCAjJHt0aGlzLmlkfS5gKVxuXG4gICAgdGhpcy5zZW5kKFxuICAgICAge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSWRlbnRpZnksXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICB0b2tlbjogYEJvdCAke3RoaXMuZ2F0ZXdheUNvbmZpZy50b2tlbn1gLFxuICAgICAgICAgIGNvbXByZXNzOiB0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MsXG4gICAgICAgICAgcHJvcGVydGllczogdGhpcy5nYXRld2F5Q29uZmlnLnByb3BlcnRpZXMsXG4gICAgICAgICAgaW50ZW50czogdGhpcy5nYXRld2F5Q29uZmlnLmludGVudHMsXG4gICAgICAgICAgc2hhcmQ6IFt0aGlzLmlkLCB0aGlzLmdhdGV3YXlDb25maWcudG90YWxTaGFyZHNdLFxuICAgICAgICAgIHByZXNlbmNlOiBhd2FpdCB0aGlzLm1ha2VQcmVzZW5jZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgKVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnUkVBRFknLCAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICAgIC8vIFdoZW4gaWRlbnRpZnlpbmcgdG9vIGZhc3QsIERpc2NvcmQgc2VuZHMgYW4gaW52YWxpZCBzZXNzaW9uIHBheWxvYWQuXG4gICAgICAvLyBUaGlzIGNhbiBzYWZlbHkgYmUgaWdub3JlZCB0aG91Z2ggYW5kIHRoZSBzaGFyZCBzdGFydHMgYSBuZXcgaWRlbnRpZnkgYWN0aW9uLlxuICAgICAgdGhpcy5yZXNvbHZlcy5zZXQoJ0lOVkFMSURfU0VTU0lPTicsICgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFQURZJylcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKiogQ2hlY2sgd2hldGhlciB0aGUgY29ubmVjdGlvbiB0byBEaXNjb3JkIGlzIGN1cnJlbnRseSBvcGVuLiAqL1xuICBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0Py5yZWFkeVN0YXRlID09PSBOb2RlV2ViU29ja2V0Lk9QRU5cbiAgfVxuXG4gIC8qKiBBdHRlbXB0IHRvIHJlc3VtZSB0aGUgcHJldmlvdXMgc2hhcmRzIHNlc3Npb24gd2l0aCB0aGUgZ2F0ZXdheS4gKi9cbiAgYXN5bmMgcmVzdW1lKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9YClcblxuICAgIC8vIEl0IGhhcyBiZWVuIHJlcXVlc3RlZCB0byByZXN1bWUgdGhlIFNoYXJkcyBzZXNzaW9uLlxuICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgc2hhcmQgaXMgc3RpbGwgY29ubmVjdGVkIHdpdGggRGlzY29yZCdzIGdhdGV3YXkgdGhlcmVmb3JlIHdlIG5lZWQgdG8gZm9yY2VmdWxseSBjbG9zZSBpdC5cbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gUmVzdW1pbmcgb3BlbiBTaGFyZCAjJHt0aGlzLmlkfSwgY2xvc2luZyB0aGUgY29ubmVjdGlvbmApXG4gICAgICBhd2FpdCB0aGlzLmNsb3NlKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXN1bWVDbG9zaW5nT2xkQ29ubmVjdGlvbiwgJ1JlY29ubmVjdGluZyB0aGUgc2hhcmQsIGNsb3Npbmcgb2xkIGNvbm5lY3Rpb24uJylcbiAgICB9XG5cbiAgICAvLyBTaGFyZCBoYXMgbmV2ZXIgaWRlbnRpZmllZCwgc28gd2UgY2Fubm90IHJlc3VtZS5cbiAgICBpZiAoIXRoaXMuc2Vzc2lvbklkKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBUcnlpbmcgdG8gcmVzdW1lIFNoYXJkICMke3RoaXMuaWR9IHdpdGhvdXQgdGhlIHNlc3Npb24gaWQuIElkZW50aWZ5aW5nIHRoZSBzaGFyZCBpbnN0ZWFkLmApXG5cbiAgICAgIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuUmVzdW1pbmdcblxuICAgIC8vIEJlZm9yZSB3ZSBjYW4gcmVzdW1lLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIHdpdGggRGlzY29yZCdzIGdhdGV3YXkuXG4gICAgYXdhaXQgdGhpcy5jb25uZWN0KClcblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9IGNvbm5lY3RlZC4gU2Vzc2lvbiBpZDogJHt0aGlzLnNlc3Npb25JZH0gfCBTZXF1ZW5jZTogJHt0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXJ9YClcblxuICAgIHRoaXMuc2VuZChcbiAgICAgIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlJlc3VtZSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIHRva2VuOiBgQm90ICR7dGhpcy5nYXRld2F5Q29uZmlnLnRva2VufWAsXG4gICAgICAgICAgc2Vzc2lvbl9pZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgc2VxOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIgPz8gMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgIClcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlcy5zZXQoJ1JFU1VNRUQnLCAoKSA9PiByZXNvbHZlKCkpXG5cbiAgICAgIC8vIElmIGl0IGlzIGF0dGVtcHRlZCB0byByZXN1bWUgd2l0aCBhbiBpbnZhbGlkIHNlc3Npb24gaWQsIERpc2NvcmQgc2VuZHMgYW4gaW52YWxpZCBzZXNzaW9uIHBheWxvYWRcbiAgICAgIC8vIE5vdCBlcnJvcmluZyBoZXJlIHNpbmNlIGl0IGlzIGVhc3kgdGhhdCB0aGlzIGhhcHBlbnMsIGFsc28gaXQgd291bGQgYmUgbm90IGNhdGNoYWJsZVxuICAgICAgdGhpcy5yZXNvbHZlcy5zZXQoJ0lOVkFMSURfU0VTU0lPTicsICgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFU1VNRUQnKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgbWVzc2FnZSB0byBEaXNjb3JkLlxuICAgKiBAcGFyYW0gaGlnaFByaW9yaXR5IC0gV2hldGhlciB0aGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbmQgYXNhcC5cbiAgICovXG4gIGFzeW5jIHNlbmQobWVzc2FnZTogU2hhcmRTb2NrZXRSZXF1ZXN0LCBoaWdoUHJpb3JpdHk6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEJlZm9yZSBhY3F1aXJpbmcgYSB0b2tlbiBmcm9tIHRoZSBidWNrZXQsIGNoZWNrIHdoZXRoZXIgdGhlIHNoYXJkIGlzIGN1cnJlbnRseSBvZmZsaW5lIG9yIG5vdC5cbiAgICAvLyBFbHNlIGJ1Y2tldCBhbmQgdG9rZW4gd2FpdCB0aW1lIGp1c3QgZ2V0IHdhc3RlZC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHkpXG5cbiAgICBhd2FpdCB0aGlzLmJ1Y2tldC5hY3F1aXJlKGhpZ2hQcmlvcml0eSlcblxuICAgIC8vIEl0J3MgcG9zc2libGUsIHRoYXQgdGhlIHNoYXJkIHdlbnQgb2ZmbGluZSBhZnRlciBhIHRva2VuIGhhcyBiZWVuIGFjcXVpcmVkIGZyb20gdGhlIGJ1Y2tldC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHkpXG5cbiAgICB0aGlzLnNvY2tldD8uc2VuZChKU09OLnN0cmluZ2lmeShtZXNzYWdlKSlcbiAgfVxuXG4gIC8qKiBTaHV0ZG93biB0aGUgdGhpcy4gRm9yY2VmdWxseSBkaXNjb25uZWN0IHRoZSBzaGFyZCBmcm9tIERpc2NvcmQuIFRoZSBzaGFyZCBtYXkgbm90IGF0dGVtcHQgdG8gcmVjb25uZWN0IHdpdGggRGlzY29yZC4gKi9cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuU2h1dGRvd24sICdTaGFyZCBzaHV0dGluZyBkb3duLicpXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICB9XG5cbiAgLyoqIEhhbmRsZSBhIGdhdGV3YXkgY29ubmVjdGlvbiBlcnJvciAqL1xuICBoYW5kbGVFcnJvcihlcnJvcjogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5lcnJvcihgW1NoYXJkXSBUaGVyZSB3YXMgYW4gZXJyb3IgY29ubmVjdGluZyBTaGFyZCAjJHt0aGlzLmlkfS5gLCBlcnJvcilcbiAgfVxuXG4gIC8qKiBIYW5kbGUgYSBnYXRld2F5IGNvbm5lY3Rpb24gY2xvc2UuICovXG4gIGFzeW5jIGhhbmRsZUNsb3NlKGNsb3NlOiBDbG9zZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zb2NrZXQgPSB1bmRlZmluZWRcbiAgICB0aGlzLnN0b3BIZWFydGJlYXRpbmcoKVxuXG4gICAgLy8gQ2xlYXIgdGhlIHpsaWIvenN0ZCBkYXRhXG4gICAgdGhpcy5pbmZsYXRlID0gdW5kZWZpbmVkXG4gICAgdGhpcy56c3RkRGVjb21wcmVzcyA9IHVuZGVmaW5lZFxuICAgIHRoaXMuaW5mbGF0ZUJ1ZmZlciA9IG51bGxcbiAgICB0aGlzLmRlY29tcHJlc3Npb25Qcm9taXNlc1F1ZXVlID0gW11cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IGNsb3NlZCB3aXRoIGNvZGUgJHtjbG9zZS5jb2RlfSR7Y2xvc2UucmVhc29uID8gYCwgYW5kIHJlYXNvbjogJHtjbG9zZS5yZWFzb259YCA6ICcnfS5gKVxuXG4gICAgLy8gUmVzb2x2ZSB0aGUgY2xvc2UgcHJvbWlzZSBpZiBpdCBleGlzdHNcbiAgICB0aGlzLnJlc29sdmVBZnRlckNsb3NlPy4oY2xvc2UpXG5cbiAgICBzd2l0Y2ggKGNsb3NlLmNvZGUpIHtcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlRlc3RpbmdGaW5pc2hlZDoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBPbiB0aGVzZSBjb2RlcyBhIG1hbnVhbCBzdGFydCB3aWxsIGJlIGRvbmUuXG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5TaHV0ZG93bjpcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlSWRlbnRpZnlpbmc6XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXNoYXJkZWQ6XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXN1bWVDbG9zaW5nT2xkQ29ubmVjdGlvbjoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5EaXNjb25uZWN0ZWRcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIC8vIFdoZW4gdGhlc2UgY29kZXMgYXJlIHJlY2VpdmVkIHNvbWV0aGluZyB3ZW50IHJlYWxseSB3cm9uZy5cbiAgICAgIC8vIE9uIHRob3NlIHdlIGNhbm5vdCBzdGFydCBhIHJlY29ubmVjdCBhdHRlbXB0LlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkF1dGhlbnRpY2F0aW9uRmFpbGVkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkludmFsaWRTaGFyZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5TaGFyZGluZ1JlcXVpcmVkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkludmFsaWRBcGlWZXJzaW9uOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkludmFsaWRJbnRlbnRzOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkRpc2FsbG93ZWRJbnRlbnRzOiB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLk9mZmxpbmVcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoY2xvc2UucmVhc29uIHx8ICdEaXNjb3JkIGdhdmUgbm8gcmVhc29uISBHRyEgWW91IGJyb2tlIERpc2NvcmQhJylcbiAgICAgIH1cbiAgICAgIC8vIEdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZXMgd2hpY2ggcmVxdWlyZSBhIG5ldyBpZGVudGlmeS5cbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Ob3RBdXRoZW50aWNhdGVkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkludmFsaWRTZXE6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuU2Vzc2lvblRpbWVkT3V0OiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IGNsb3NlZCByZXF1aXJpbmcgcmUtaWRlbnRpZnkuYClcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuSWRlbnRpZnlpbmdcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICBhd2FpdCB0aGlzLmlkZW50aWZ5KClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBOT1RFOiBUaGlzIGNhc2UgbXVzdCBhbHdheXMgYmUgcmlnaHQgYWJvdmUgdGhlIGNhc2VzIHRoYXQgcnVucyB3aXRoIGRlZmF1bHQgY2FzZSBiZWNhdXNlIG9mIGhvdyBzd2l0Y2ggd29ya3Mgd2hlbiB5b3UgZG9uJ3QgYnJlYWsgLyByZXR1cm4sIG1vcmUgaW5mbyBiZWxvdy5cbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Ob3JtYWxDbG9zdXJlOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkdvaW5nQXdheToge1xuICAgICAgICAvLyBJZiB0aGUgc2hhcmQgaXMgbWFya2VkIGFzIGdvaW5nT2ZmbGluZSwgaXQgc3RheXMgZGlzY29ubmVjdGVkLlxuICAgICAgICBpZiAodGhpcy5nb2luZ09mZmxpbmUpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5EaXNjb25uZWN0ZWRcbiAgICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgICAgdGhpcy5nb2luZ09mZmxpbmUgPSBmYWxzZVxuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2UsIHdlIHdhbnQgdGhlIHNoYXJkIHRvIGdvIHRocm91Z2ggdGhlIGRlZmF1bHQgY2FzZSB3aGVyZSBpdCBnZXRzIHJlc3VtZWQsIGFzIGl0IG1pZ2h0IGJlIGFuIHVuZXhwZWN0ZWQgY2xvc3VyZSBmcm9tIERpc2NvcmQgb3IgQ2xvdWRmbGFyZSBmb3IgZXhhbXBsZSwgc28gd2UgZG9uJ3QgdXNlIGJyZWFrIC8gcmV0dXJuIGhlcmUuXG4gICAgICB9XG4gICAgICAvLyBHYXRld2F5IGNvbm5lY3Rpb24gY2xvc2VzIG9uIHdoaWNoIGEgcmVzdW1lIGlzIGFsbG93ZWQuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuVW5rbm93bkVycm9yOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlVua25vd25PcGNvZGU6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuRGVjb2RlRXJyb3I6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuUmF0ZUxpbWl0ZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuQWxyZWFkeUF1dGhlbnRpY2F0ZWQ6XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZ2V0IGludG8gYW4gaW5maW5pdGUgbG9vcCB3aGVyZSB3ZSByZXN1bWUgZm9yZXZlciwgc28gaWYgd2Ugd2VyZSBhbHJlYWR5IHJlc3VtaW5nIHdlIGlkZW50aWZ5IGluc3RlYWRcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc3RhdGUgPT09IFNoYXJkU3RhdGUuUmVzdW1pbmcgPyBTaGFyZFN0YXRlLklkZW50aWZ5aW5nIDogU2hhcmRTdGF0ZS5SZXN1bWluZ1xuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBTaGFyZFN0YXRlLlJlc3VtaW5nKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5yZXN1bWUoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEhhbmRsZSBhbiBpbmNvbWluZyBnYXRld2F5IG1lc3NhZ2UuICovXG4gIGFzeW5jIGhhbmRsZU1lc3NhZ2UobWVzc2FnZTogTWVzc2FnZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVGhlIHdzIG5wbSBwYWNrYWdlIHdpbGwgdXNlIGEgQnVmZmVyLCB3aGlsZSB0aGUgZ2xvYmFsIGJ1aWx0LWluIHdpbGwgdXNlIEFycmF5QnVmZmVyXG4gICAgY29uc3QgaXNDb21wcmVzc2VkID0gbWVzc2FnZS5kYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgbWVzc2FnZS5kYXRhIGluc3RhbmNlb2YgQnVmZmVyXG5cbiAgICBjb25zdCBkYXRhID0gaXNDb21wcmVzc2VkID8gYXdhaXQgdGhpcy5kZWNvbXByZXNzUGFja2V0KG1lc3NhZ2UuZGF0YSkgOiAoSlNPTi5wYXJzZShtZXNzYWdlLmRhdGEpIGFzIERpc2NvcmRHYXRld2F5UGF5bG9hZClcblxuICAgIC8vIENoZWNrIGlmIHRoZSBkZWNvbXByZXNzaW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bFxuICAgIGlmICghZGF0YSkgcmV0dXJuXG5cbiAgICBhd2FpdCB0aGlzLmhhbmRsZURpc2NvcmRQYWNrZXQoZGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvbXByZXNzIGEgemxpYi96c3RkIGNvbXByZXNzZWQgcGFja2V0XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhc3luYyBkZWNvbXByZXNzUGFja2V0KGRhdGE6IEFycmF5QnVmZmVyIHwgQnVmZmVyKTogUHJvbWlzZTxEaXNjb3JkR2F0ZXdheVBheWxvYWQgfCBudWxsPiB7XG4gICAgLy8gQSBidWZmZXIgaXMgYSBVaW50OEFycmF5IHVuZGVyIHRoZSBob29kLiBBbiBBcnJheUJ1ZmZlciBpcyBnZW5lcmljLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgVWludDhBcnJheSB0aGF0IHVzZXMgdGhlIHdob2xlIEFycmF5QnVmZmVyXG4gICAgY29uc3QgY29tcHJlc3NlZERhdGE6IFVpbnQ4QXJyYXkgPSBkYXRhIGluc3RhbmNlb2YgQnVmZmVyID8gZGF0YSA6IG5ldyBVaW50OEFycmF5KGRhdGEpXG5cbiAgICBpZiAodGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uID09PSBUcmFuc3BvcnRDb21wcmVzc2lvbi56bGliKSB7XG4gICAgICBpZiAoIXRoaXMuaW5mbGF0ZSkge1xuICAgICAgICB0aGlzLmxvZ2dlci5mYXRhbCgnW1NoYXJkXSB6bGliLXN0cmVhbSB0cmFuc3BvcnQgY29tcHJlc3Npb24gd2FzIGVuYWJsZWQgYnV0IG5vIGluc3RhbmNlIG9mIEluZmxhdGUgd2FzIGZvdW5kLicpXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG5cbiAgICAgIC8vIEFsaWFzLCB1c2VkIHRvIGF2b2lkIHNvbWUgbnVsbCBjaGVja3MgaW4gdGhlIFByb21pc2UgY29uc3RydWN0b3JcbiAgICAgIGNvbnN0IGluZmxhdGUgPSB0aGlzLmluZmxhdGVcblxuICAgICAgY29uc3Qgd3JpdGVQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBpbmZsYXRlLndyaXRlKGNvbXByZXNzZWREYXRhLCAnYmluYXJ5JywgKGVycm9yKSA9PiAoZXJyb3IgPyByZWplY3QoZXJyb3IpIDogcmVzb2x2ZSgpKSlcbiAgICAgIH0pXG5cbiAgICAgIGlmICghZW5kc1dpdGhNYXJrZXIoY29tcHJlc3NlZERhdGEsIFpMSUJfU1lOQ19GTFVTSCkpIHJldHVybiBudWxsXG5cbiAgICAgIGF3YWl0IHdyaXRlUHJvbWlzZVxuXG4gICAgICBpZiAoIXRoaXMuaW5mbGF0ZUJ1ZmZlcikge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdbU2hhcmRdIFRoZSBaTGliIGluZmxhdGUgYnVmZmVyIHdhcyBjbGVhcmVkIGF0IGFuIHVuZXhwZWN0ZWQgbW9tZW50LicpXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29kZWREYXRhID0gdGhpcy50ZXh0RGVjb2Rlci5kZWNvZGUodGhpcy5pbmZsYXRlQnVmZmVyKVxuICAgICAgdGhpcy5pbmZsYXRlQnVmZmVyID0gbnVsbFxuXG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVkRGF0YSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uID09PSBUcmFuc3BvcnRDb21wcmVzc2lvbi56c3RkKSB7XG4gICAgICBpZiAoIXRoaXMuenN0ZERlY29tcHJlc3MpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZmF0YWwoJ1tTaGFyZF0genN0ZC1zdHJlYW0gdHJhbnNwb3J0IGNvbXByZXNzaW9uIHdhcyBlbmFibGVkIGJ1dCBubyBpbnN0YW5jZSBvZiBEZWNvbXByZXNzIHdhcyBmb3VuZC4nKVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICB0aGlzLnpzdGREZWNvbXByZXNzLnB1c2goY29tcHJlc3NlZERhdGEpXG5cbiAgICAgIGNvbnN0IGRlY29tcHJlc3Npb25Qcm9taXNlID0gbmV3IFByb21pc2U8RGlzY29yZEdhdGV3YXlQYXlsb2FkPigocikgPT4gdGhpcy5kZWNvbXByZXNzaW9uUHJvbWlzZXNRdWV1ZS5wdXNoKHIpKVxuICAgICAgcmV0dXJuIGF3YWl0IGRlY29tcHJlc3Npb25Qcm9taXNlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2F0ZXdheUNvbmZpZy5jb21wcmVzcykge1xuICAgICAgY29uc3QgZGVjb21wcmVzc2VkID0gaW5mbGF0ZVN5bmMoY29tcHJlc3NlZERhdGEpXG4gICAgICBjb25zdCBkZWNvZGVkRGF0YSA9IHRoaXMudGV4dERlY29kZXIuZGVjb2RlKGRlY29tcHJlc3NlZClcblxuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZERhdGEpXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKiBIYW5kbGVzIGEgaW5jb21pbmcgZ2F0ZXdheSBwYWNrZXQuICovXG4gIGFzeW5jIGhhbmRsZURpc2NvcmRQYWNrZXQocGFja2V0OiBEaXNjb3JkR2F0ZXdheVBheWxvYWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBFZGdlIGNhc2Ugc3RhcnQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9kaXNjb3JkZW5vL2Rpc2NvcmRlbm8vaXNzdWVzLzIzMTFcbiAgICB0aGlzLmhlYXJ0Lmxhc3RBY2sgPSBEYXRlLm5vdygpXG4gICAgdGhpcy5oZWFydC5hY2tub3dsZWRnZWQgPSB0cnVlXG4gICAgLy8gRWRnZSBjYXNlIGVuZCFcblxuICAgIHN3aXRjaCAocGFja2V0Lm9wKSB7XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdDoge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVyblxuXG4gICAgICAgIHRoaXMuaGVhcnQubGFzdEJlYXQgPSBEYXRlLm5vdygpXG4gICAgICAgIC8vIERpc2NvcmQgcmFuZG9tbHkgc2VuZHMgdGhpcyByZXF1aXJpbmcgYW4gaW1tZWRpYXRlIGhlYXJ0YmVhdCBiYWNrLlxuICAgICAgICAvLyBVc2luZyBhIGRpcmVjdCBzb2NrZXQuc2VuZCBjYWxsIGhlcmUgYmVjYXVzZSBoZWFydGJlYXQgcmVxdWVzdHMgYXJlIHJlc2VydmVkIGJ5IHVzLlxuICAgICAgICB0aGlzLnNvY2tldD8uc2VuZChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0LFxuICAgICAgICAgICAgZDogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlYXJ0YmVhdD8uKHRoaXMpXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuSGVsbG86IHtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSAocGFja2V0LmQgYXMgRGlzY29yZEhlbGxvKS5oZWFydGJlYXRfaW50ZXJ2YWxcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgIyR7dGhpcy5pZH0gcmVjZWl2ZWQgSGVsbG9gKVxuICAgICAgICB0aGlzLnN0YXJ0SGVhcnRiZWF0aW5nKGludGVydmFsKVxuXG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBTaGFyZFN0YXRlLlJlc3VtaW5nKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFF1ZXVlID0gWy4uLnRoaXMuYnVja2V0LnF1ZXVlXVxuICAgICAgICAgIC8vIEhFTExPIGhhcyBiZWVuIHNlbmQgb24gYSBub24gcmVzdW1lIGFjdGlvbi5cbiAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIHNoYXJkIHN0YXJ0cyBhIG5ldyBzZXNzaW9uLFxuICAgICAgICAgIC8vIHRoZXJlZm9yZSB0aGUgcmF0ZSBsaW1pdCBpbnRlcnZhbCBoYXMgYmVlbiByZXNldCB0b28uXG4gICAgICAgICAgdGhpcy5idWNrZXQgPSBuZXcgTGVha3lCdWNrZXQoe1xuICAgICAgICAgICAgbWF4OiB0aGlzLmNhbGN1bGF0ZVNhZmVSZXF1ZXN0cygpLFxuICAgICAgICAgICAgcmVmaWxsSW50ZXJ2YWw6IDYwMDAwLFxuICAgICAgICAgICAgcmVmaWxsQW1vdW50OiB0aGlzLmNhbGN1bGF0ZVNhZmVSZXF1ZXN0cygpLFxuICAgICAgICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgLy8gUXVldWUgc2hvdWxkIG5vdCBiZSBsb3N0IG9uIGEgcmUtaWRlbnRpZnkuXG4gICAgICAgICAgdGhpcy5idWNrZXQucXVldWUudW5zaGlmdCguLi5jdXJyZW50UXVldWUpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV2ZW50cy5oZWxsbz8uKHRoaXMpXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0QUNLOiB7XG4gICAgICAgIC8vIE1hbnVhbGx5IGNhbGN1bGF0aW5nIHRoZSByb3VuZCB0cmlwIHRpbWUgZm9yIHVzZXJzIHdobyBuZWVkIGl0LlxuICAgICAgICBpZiAodGhpcy5oZWFydC5sYXN0QmVhdCkge1xuICAgICAgICAgIHRoaXMuaGVhcnQucnR0ID0gdGhpcy5oZWFydC5sYXN0QWNrIC0gdGhpcy5oZWFydC5sYXN0QmVhdFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudHMuaGVhcnRiZWF0QWNrPy4odGhpcylcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5SZWNvbm5lY3Q6IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gUmVjZWl2ZWQgYSBSZWNvbm5lY3QgZm9yIFNoYXJkICMke3RoaXMuaWR9YClcbiAgICAgICAgdGhpcy5ldmVudHMucmVxdWVzdGVkUmVjb25uZWN0Py4odGhpcylcblxuICAgICAgICBhd2FpdCB0aGlzLnJlc3VtZSgpXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuSW52YWxpZFNlc3Npb246IHtcbiAgICAgICAgY29uc3QgcmVzdW1hYmxlID0gcGFja2V0LmQgYXMgYm9vbGVhblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBSZWNlaXZlZCBJbnZhbGlkIFNlc3Npb24gZm9yIFNoYXJkICMke3RoaXMuaWR9IHdpdGggcmVzdW1hYmxlIGFzICR7cmVzdW1hYmxlfWApXG5cbiAgICAgICAgdGhpcy5ldmVudHMuaW52YWxpZFNlc3Npb24/Lih0aGlzLCByZXN1bWFibGUpXG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB3YWl0IGZvciBhIHJhbmRvbSBhbW91bnQgb2YgdGltZSBiZXR3ZWVuIDEgYW5kIDVcbiAgICAgICAgLy8gUmVmZXJlbmNlOiBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSNyZXN1bWluZ1xuICAgICAgICBhd2FpdCBkZWxheShNYXRoLmZsb29yKChNYXRoLnJhbmRvbSgpICogNCArIDEpICogMTAwMCkpXG5cbiAgICAgICAgdGhpcy5yZXNvbHZlcy5nZXQoJ0lOVkFMSURfU0VTU0lPTicpPy4ocGFja2V0KVxuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnSU5WQUxJRF9TRVNTSU9OJylcblxuICAgICAgICAvLyBXaGVuIHJlc3VtYWJsZSBpcyBmYWxzZSB3ZSBuZWVkIHRvIHJlLWlkZW50aWZ5XG4gICAgICAgIGlmICghcmVzdW1hYmxlKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pZGVudGlmeSgpXG5cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHNlc3Npb24gaXMgaW52YWxpZCBidXQgYXBwYXJlbnRseSBpdCBpcyByZXN1bWFibGVcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN1bWUoKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChwYWNrZXQudCkge1xuICAgICAgY2FzZSAnUkVTVU1FRCc6XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkNvbm5lY3RlZFxuICAgICAgICB0aGlzLmV2ZW50cy5yZXN1bWVkPy4odGhpcylcblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCAjJHt0aGlzLmlkfSByZWNlaXZlZCBSRVNVTUVEYClcblxuICAgICAgICAvLyBDb250aW51ZSB0aGUgcmVxdWVzdHMgd2hpY2ggaGF2ZSBiZWVuIHF1ZXVlZCBzaW5jZSB0aGUgc2hhcmQgd2VudCBvZmZsaW5lLlxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUuZm9yRWFjaCgocmVzb2x2ZSkgPT4gcmVzb2x2ZSgpKVxuICAgICAgICAvLyBTZXR0aW5nIHRoZSBsZW5ndGggdG8gMCB3aWxsIGRlbGV0ZSB0aGUgZWxlbWVudHMgaW4gaXRcbiAgICAgICAgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLmxlbmd0aCA9IDBcblxuICAgICAgICB0aGlzLnJlc29sdmVzLmdldCgnUkVTVU1FRCcpPy4ocGFja2V0KVxuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVTVU1FRCcpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdSRUFEWSc6IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHBhY2tldC5kIGFzIERpc2NvcmRSZWFkeVxuICAgICAgICB0aGlzLmV2ZW50cy5yZWFkeT8uKHRoaXMpXG5cbiAgICAgICAgLy8gSW1wb3J0YW50IGZvciBmdXR1cmUgcmVzdW1lcy5cbiAgICAgICAgdGhpcy5yZXN1bWVHYXRld2F5VXJsID0gcGF5bG9hZC5yZXN1bWVfZ2F0ZXdheV91cmxcbiAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBwYXlsb2FkLnNlc3Npb25faWRcblxuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0ZWRcblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCAjJHt0aGlzLmlkfSByZWNlaXZlZCBSRUFEWWApXG5cbiAgICAgICAgLy8gQ29udGludWUgdGhlIHJlcXVlc3RzIHdoaWNoIGhhdmUgYmVlbiBxdWV1ZWQgc2luY2UgdGhlIHNoYXJkIHdlbnQgb2ZmbGluZS5cbiAgICAgICAgLy8gSW1wb3J0YW50IHdoZW4gdGhpcyBpcyBhIHJlLWlkZW50aWZ5XG4gICAgICAgIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5mb3JFYWNoKChyZXNvbHZlKSA9PiByZXNvbHZlKCkpXG4gICAgICAgIC8vIFNldHRpbmcgdGhlIGxlbmd0aCB0byAwIHdpbGwgZGVsZXRlIHRoZSBlbGVtZW50cyBpbiBpdFxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUubGVuZ3RoID0gMFxuXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZ2V0KCdSRUFEWScpPy4ocGFja2V0KVxuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVBRFknKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgc2VxdWVuY2UgbnVtYmVyIGlmIGl0IGlzIHByZXNlbnRcbiAgICAvLyBgc2AgY2FuIGJlIGVpdGhlciBgbnVsbGAgb3IgYSBgbnVtYmVyYC5cbiAgICAvLyBJbiBvcmRlciB0byBwcmV2ZW50IHVwZGF0ZSBtaXNzZXMgd2hlbiBgc2AgaXMgYDBgIHdlIGNoZWNrIGFnYWluc3QgbnVsbC5cbiAgICBpZiAocGFja2V0LnMgIT09IG51bGwpIHtcbiAgICAgIHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlciA9IHBhY2tldC5zXG4gICAgfVxuXG4gICAgdGhpcy5mb3J3YXJkVG9Cb3QocGFja2V0KVxuICB9XG5cbiAgZm9yd2FyZFRvQm90KHBhY2tldDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKTogdm9pZCB7XG4gICAgLy8gVGhlIG5lY2Vzc2FyeSBoYW5kbGluZyByZXF1aXJlZCBmb3IgdGhlIFNoYXJkcyBjb25uZWN0aW9uIGhhcyBiZWVuIGZpbmlzaGVkLlxuICAgIC8vIE5vdyB0aGUgZXZlbnQgY2FuIGJlIHNhZmVseSBmb3J3YXJkZWQuXG4gICAgdGhpcy5ldmVudHMubWVzc2FnZT8uKHRoaXMsIGNhbWVsaXplKHBhY2tldCkpXG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgaW4gb3JkZXIgdG8gbWFrZSB0aGUgc2hhcmRzIHByZXNlbmNlLlxuICAgKiBhc3luYyBpbiBjYXNlIGRldnMgY3JlYXRlIHRoZSBwcmVzZW5jZSBiYXNlZCBvbiBlZy4gZGF0YWJhc2UgdmFsdWVzLlxuICAgKiBQYXNzaW5nIHRoZSBzaGFyZCdzIGlkIHRoZXJlIHRvIG1ha2UgaXQgZWFzaWVyIGZvciB0aGUgZGV2IHRvIHVzZSB0aGlzIGZ1bmN0aW9uLlxuICAgKi9cbiAgYXN5bmMgbWFrZVByZXNlbmNlKCk6IFByb21pc2U8RGlzY29yZFVwZGF0ZVByZXNlbmNlIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBjb21tdW5pY2F0ZXMgd2l0aCB0aGUgbWFuYWdlbWVudCBwcm9jZXNzLCBpbiBvcmRlciB0byBrbm93IHdoZXRoZXIgaXRzIGZyZWUgdG8gaWRlbnRpZnkuXG4gICAqIFdoZW4gdGhpcyBmdW5jdGlvbiByZXNvbHZlcywgdGhpcyBtZWFucyB0aGF0IHRoZSBzaGFyZCBpcyBhbGxvd2VkIHRvIHNlbmQgYW4gaWRlbnRpZnkgcGF5bG9hZCB0byBkaXNjb3JkLlxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdElkZW50aWZ5KCk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogU3RhcnQgc2VuZGluZyBoZWFydGJlYXQgcGF5bG9hZHMgdG8gRGlzY29yZCBpbiB0aGUgcHJvdmlkZWQgaW50ZXJ2YWwuICovXG4gIHN0YXJ0SGVhcnRiZWF0aW5nKGludGVydmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTdGFydCBoZWFydGJlYXRpbmcgb24gU2hhcmQgIyR7dGhpcy5pZH1gKVxuXG4gICAgLy8gSWYgb2xkIGhlYXJ0YmVhc3QgZXhpc3QgbGlrZSBhZnRlciByZXN1bWUsIGNsZWFyIHRoZSBvbGQgb25lcy5cbiAgICB0aGlzLnN0b3BIZWFydGJlYXRpbmcoKVxuXG4gICAgdGhpcy5oZWFydC5pbnRlcnZhbCA9IGludGVydmFsXG5cbiAgICAvLyBPbmx5IHNldCB0aGUgc2hhcmQncyBzdGF0ZSB0byBgVW5pZGVudGlmaWVkYFxuICAgIC8vIGlmIGhlYXJ0YmVhdGluZyBoYXMgbm90IGJlZW4gc3RhcnRlZCBkdWUgdG8gYW4gaWRlbnRpZnkgb3IgcmVzdW1lIGFjdGlvbi5cbiAgICBpZiAoW1NoYXJkU3RhdGUuRGlzY29ubmVjdGVkLCBTaGFyZFN0YXRlLk9mZmxpbmVdLmluY2x1ZGVzKHRoaXMuc3RhdGUpKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCBpcyBkaXNjb25uZWN0ZWQgb3Igb2ZmbGluZSBidXQgdGhlIGhlYXJ0YmVhdCB3YXMgc3RhcnRlZCAjJHt0aGlzLmlkfWApXG4gICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5VbmlkZW50aWZpZWRcbiAgICB9XG5cbiAgICAvLyBUaGUgZmlyc3QgaGVhcnRiZWF0IG5lZWRzIHRvIGJlIHNlbmQgd2l0aCBhIHJhbmRvbSBkZWxheSBiZXR3ZWVuIGAwYCBhbmQgYGludGVydmFsYFxuICAgIC8vIFVzaW5nIGEgYHNldFRpbWVvdXQoXywgaml0dGVyKWAgaGVyZSB0byBhY2NvbXBsaXNoIHRoYXQuXG4gICAgLy8gYE1hdGgucmFuZG9tKClgIGNhbiBiZSBgMGAgc28gd2UgdXNlIGAwLjVgIGlmIHRoaXMgaGFwcGVuc1xuICAgIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjaGVhcnRiZWF0aW5nXG4gICAgY29uc3Qgaml0dGVyID0gTWF0aC5jZWlsKHRoaXMuaGVhcnQuaW50ZXJ2YWwgKiAoTWF0aC5yYW5kb20oKSB8fCAwLjUpKVxuXG4gICAgdGhpcy5oZWFydC50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIEJlZ2lubmluZyBoZWFydGJlYXRpbmcgcHJvY2VzcyBmb3IgU2hhcmQgIyR7dGhpcy5pZH1gKVxuXG4gICAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVyblxuXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBIZWFydGJlYXRpbmcgb24gU2hhcmQgIyR7dGhpcy5pZH0uIFByZXZpb3VzIHNlcXVlbmNlIG51bWJlcjogJHt0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXJ9YClcblxuICAgICAgLy8gVXNpbmcgYSBkaXJlY3Qgc29ja2V0LnNlbmQgY2FsbCBoZXJlIGJlY2F1c2UgaGVhcnRiZWF0IHJlcXVlc3RzIGFyZSByZXNlcnZlZCBieSB1cy5cbiAgICAgIHRoaXMuc29ja2V0Py5zZW5kKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdCxcbiAgICAgICAgICBkOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgIH0pLFxuICAgICAgKVxuXG4gICAgICB0aGlzLmhlYXJ0Lmxhc3RCZWF0ID0gRGF0ZS5ub3coKVxuICAgICAgdGhpcy5oZWFydC5hY2tub3dsZWRnZWQgPSBmYWxzZVxuXG4gICAgICAvLyBBZnRlciB0aGUgcmFuZG9tIGhlYXJ0YmVhdCBqaXR0ZXIgd2UgY2FuIHN0YXJ0IGEgbm9ybWFsIGludGVydmFsLlxuICAgICAgdGhpcy5oZWFydC5pbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCAjJHt0aGlzLmlkfSBpcyBub3Qgb3BlbiwgYnV0IGF0dGVtcHRlZCBoZWFydGJlYXQsIGlnbm9yaW5nLmApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgU2hhcmQgZGlkIG5vdCByZWNlaXZlIGEgaGVhcnRiZWF0IEFDSyBmcm9tIERpc2NvcmQgaW4gdGltZSxcbiAgICAgICAgLy8gdGhlcmVmb3JlIHdlIGhhdmUgdG8gYXNzdW1lIHRoYXQgdGhlIGNvbm5lY3Rpb24gaGFzIGZhaWxlZCBvciBnb3QgXCJ6b21iaWVkXCIuXG4gICAgICAgIC8vIFRoZSBTaGFyZCBuZWVkcyB0byBzdGFydCBhIHJlLWlkZW50aWZ5IGFjdGlvbiBhY2NvcmRpbmdseS5cbiAgICAgICAgLy8gUmVmZXJlbmNlOiBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSNoZWFydGJlYXRpbmctZXhhbXBsZS1nYXRld2F5LWhlYXJ0YmVhdC1hY2tcbiAgICAgICAgaWYgKCF0aGlzLmhlYXJ0LmFja25vd2xlZGdlZCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIEhlYXJ0YmVhdCBub3QgYWNrbm93bGVkZ2VkIGZvciBTaGFyZCAjJHt0aGlzLmlkfS4gQXNzdW1pbmcgem9tYmllZCBjb25uZWN0aW9uLmApXG4gICAgICAgICAgYXdhaXQgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuWm9tYmllZENvbm5lY3Rpb24sICdab21iaWVkIGNvbm5lY3Rpb24sIGRpZCBub3QgcmVjZWl2ZSBhbiBoZWFydGJlYXQgQUNLIGluIHRpbWUuJylcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIEhlYXJ0YmVhdGluZyBvbiBTaGFyZCAjJHt0aGlzLmlkfS4gUHJldmlvdXMgc2VxdWVuY2UgbnVtYmVyOiAke3RoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcn1gKVxuXG4gICAgICAgIC8vIFVzaW5nIGEgZGlyZWN0IHNvY2tldC5zZW5kIGNhbGwgaGVyZSBiZWNhdXNlIGhlYXJ0YmVhdCByZXF1ZXN0cyBhcmUgcmVzZXJ2ZWQgYnkgdXMuXG4gICAgICAgIHRoaXMuc29ja2V0Py5zZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQsXG4gICAgICAgICAgICBkOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgIClcblxuICAgICAgICB0aGlzLmhlYXJ0Lmxhc3RCZWF0ID0gRGF0ZS5ub3coKVxuICAgICAgICB0aGlzLmhlYXJ0LmFja25vd2xlZGdlZCA9IGZhbHNlXG5cbiAgICAgICAgdGhpcy5ldmVudHMuaGVhcnRiZWF0Py4odGhpcylcbiAgICAgIH0sIHRoaXMuaGVhcnQuaW50ZXJ2YWwpXG4gICAgfSwgaml0dGVyKVxuICB9XG5cbiAgLyoqIFN0b3AgdGhlIGhlYXJ0YmVhdGluZyBwcm9jZXNzIHdpdGggZGlzY29yZC4gKi9cbiAgc3RvcEhlYXJ0YmVhdGluZygpOiB2b2lkIHtcbiAgICAvLyBDbGVhciB0aGUgcmVndWxhciBoZWFydGJlYXQgaW50ZXJ2YWwuXG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLmhlYXJ0LmludGVydmFsSWQpXG4gICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBTaGFyZCBnb3QgY2xvc2VkIGJlZm9yZSB0aGUgZmlyc3Qgaml0dGVyZWQgaGVhcnRiZWF0LlxuICAgIC8vIFRvIGdvIHNhZmUgd2Ugc2hvdWxkIGNsZWFyIHRoZSByZWxhdGVkIHRpbWVvdXQgdG9vLlxuICAgIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0LnRpbWVvdXRJZClcbiAgfVxufVxuXG4vKiogQ2hlY2sgaWYgdGhlIGJ1ZmZlciBlbmRzIHdpdGggdGhlIG1hcmtlciAqL1xuZnVuY3Rpb24gZW5kc1dpdGhNYXJrZXIoYnVmZmVyOiBVaW50OEFycmF5LCBtYXJrZXI6IFVpbnQ4QXJyYXkpIHtcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPCBtYXJrZXIubGVuZ3RoKSByZXR1cm4gZmFsc2VcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtlci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChidWZmZXJbYnVmZmVyLmxlbmd0aCAtIG1hcmtlci5sZW5ndGggKyBpXSAhPT0gbWFya2VyW2ldKSByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmRDcmVhdGVPcHRpb25zIHtcbiAgLyoqIFRoZSBzaGFyZCBpZCAqL1xuICBpZDogbnVtYmVyXG4gIC8qKiBUaGUgY29ubmVjdGlvbiBkZXRhaWxzICovXG4gIGNvbm5lY3Rpb246IFNoYXJkR2F0ZXdheUNvbmZpZ1xuICAvKiogVGhlIGV2ZW50IGhhbmRsZXJzIGZvciBldmVudHMgb24gdGhlIHNoYXJkLiAqL1xuICBldmVudHM6IFNoYXJkRXZlbnRzXG4gIC8qKiBUaGUgbG9nZ2VyIGZvciB0aGUgc2hhcmQgKi9cbiAgbG9nZ2VyPzogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+XG4gIC8qKiBUaGUgaGFuZGxlciB0byByZXF1ZXN0IGEgc3BhY2UgdG8gbWFrZSBhbiBpZGVudGlmeSByZXF1ZXN0LiAqL1xuICByZXF1ZXN0SWRlbnRpZnk/OiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBGdW5jdGlvbiB0byBjcmVhdGUgdGhlIGJvdCBzdGF0dXMgdG8gc2VuZCBvbiBJZGVudGlmeSByZXF1ZXN0cyAqL1xuICBtYWtlUHJlc2VuY2U/OiAoKSA9PiBQcm9taXNlPERpc2NvcmRVcGRhdGVQcmVzZW5jZSB8IHVuZGVmaW5lZD5cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGlzY29yZGVub1NoYXJkXG4iXSwibmFtZXMiOlsiQnVmZmVyIiwiY3JlYXRlSW5mbGF0ZSIsImluZmxhdGVTeW5jIiwiY29uc3RhbnRzIiwiemxpYkNvbnN0YW50cyIsIkdhdGV3YXlDbG9zZUV2ZW50Q29kZXMiLCJHYXRld2F5T3Bjb2RlcyIsImNhbWVsaXplIiwiZGVsYXkiLCJMZWFreUJ1Y2tldCIsImxvZ2dlciIsIk5vZGVXZWJTb2NrZXQiLCJTaGFyZFNvY2tldENsb3NlQ29kZXMiLCJTaGFyZFN0YXRlIiwiVHJhbnNwb3J0Q29tcHJlc3Npb24iLCJaTElCX1NZTkNfRkxVU0giLCJVaW50OEFycmF5IiwiZnpzdGQiLCJnZXRGWlN0ZCIsIkRpc2NvcmRlbm9TaGFyZCIsIm9wdGlvbnMiLCJtYXhSZXF1ZXN0c1BlclJhdGVMaW1pdFRpY2siLCJwcmV2aW91c1NlcXVlbmNlTnVtYmVyIiwicmF0ZUxpbWl0UmVzZXRJbnRlcnZhbCIsInN0YXRlIiwiT2ZmbGluZSIsInJlc3VtZUdhdGV3YXlVcmwiLCJldmVudHMiLCJvZmZsaW5lU2VuZFF1ZXVlIiwicmVzb2x2ZXMiLCJNYXAiLCJnb2luZ09mZmxpbmUiLCJ0ZXh0RGVjb2RlciIsIlRleHREZWNvZGVyIiwiaW5mbGF0ZUJ1ZmZlciIsImRlY29tcHJlc3Npb25Qcm9taXNlc1F1ZXVlIiwiaWQiLCJjb25uZWN0aW9uIiwiaGVhcnQiLCJhY2tub3dsZWRnZWQiLCJpbnRlcnZhbCIsInJlcXVlc3RJZGVudGlmeSIsIm1ha2VQcmVzZW5jZSIsImJ1Y2tldCIsIm1heCIsImNhbGN1bGF0ZVNhZmVSZXF1ZXN0cyIsInJlZmlsbEFtb3VudCIsInJlZmlsbEludGVydmFsIiwiZ2F0ZXdheUNvbmZpZyIsImNvbm5lY3Rpb25VcmwiLCJ1cmwiLCJzYWZlUmVxdWVzdHMiLCJNYXRoIiwiY2VpbCIsImNoZWNrT2ZmbGluZSIsImhpZ2hQcmlvcml0eSIsImlzT3BlbiIsIlByb21pc2UiLCJyZXNvbHZlIiwidW5zaGlmdCIsInB1c2giLCJjbG9zZSIsImNvZGUiLCJyZWFzb24iLCJkZWJ1ZyIsInNvY2tldCIsInJlYWR5U3RhdGUiLCJPUEVOIiwiTm9ybWFsQ2xvc3VyZSIsIkdvaW5nQXdheSIsInByb21pc2UiLCJyZXNvbHZlQWZ0ZXJDbG9zZSIsInVuZGVmaW5lZCIsImNvbm5lY3QiLCJJZGVudGlmeWluZyIsIlJlc3VtaW5nIiwiaW5jbHVkZXMiLCJDb25uZWN0aW5nIiwiY29ubmVjdGluZyIsIlVSTCIsInNlYXJjaFBhcmFtcyIsInNldCIsInZlcnNpb24iLCJ0b1N0cmluZyIsInRyYW5zcG9ydENvbXByZXNzaW9uIiwiemxpYiIsImluZmxhdGUiLCJmaW5pc2hGbHVzaCIsIlpfU1lOQ19GTFVTSCIsImNodW5rU2l6ZSIsIm9uIiwiZSIsImVycm9yIiwiZGF0YSIsIm5ld0J1ZmZlciIsImJ5dGVMZW5ndGgiLCJ6c3RkIiwiY2F0Y2giLCJ3YXJuIiwiZGVsZXRlIiwienN0ZERlY29tcHJlc3MiLCJEZWNvbXByZXNzIiwiZGVjb2RlZERhdGEiLCJkZWNvZGUiLCJwYXJzZWREYXRhIiwiSlNPTiIsInBhcnNlIiwic2hpZnQiLCJjb21wcmVzcyIsInNob3VsZFVzZUJ1aWx0aW4iLCJSZWZsZWN0IiwiaGFzIiwiZ2xvYmFsVGhpcyIsIldlYlNvY2tldCIsImJpbmFyeVR5cGUiLCJvbmVycm9yIiwiZXZlbnQiLCJoYW5kbGVFcnJvciIsIm9uY2xvc2UiLCJjbG9zZUV2ZW50IiwiaGFuZGxlQ2xvc2UiLCJvbm1lc3NhZ2UiLCJtZXNzYWdlRXZlbnQiLCJoYW5kbGVNZXNzYWdlIiwib25vcGVuIiwiVW5pZGVudGlmaWVkIiwiY29ubmVjdGVkIiwiaWRlbnRpZnkiLCJieXBhc3NSZXF1ZXN0IiwiUmVJZGVudGlmeWluZyIsImlkZW50aWZ5aW5nIiwic2VuZCIsIm9wIiwiSWRlbnRpZnkiLCJkIiwidG9rZW4iLCJwcm9wZXJ0aWVzIiwiaW50ZW50cyIsInNoYXJkIiwidG90YWxTaGFyZHMiLCJwcmVzZW5jZSIsInJlc3VtZSIsIlJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uIiwic2Vzc2lvbklkIiwiUmVzdW1lIiwic2Vzc2lvbl9pZCIsInNlcSIsIm1lc3NhZ2UiLCJhY3F1aXJlIiwic3RyaW5naWZ5Iiwic2h1dGRvd24iLCJTaHV0ZG93biIsInN0b3BIZWFydGJlYXRpbmciLCJUZXN0aW5nRmluaXNoZWQiLCJkaXNjb25uZWN0ZWQiLCJSZXNoYXJkZWQiLCJEaXNjb25uZWN0ZWQiLCJBdXRoZW50aWNhdGlvbkZhaWxlZCIsIkludmFsaWRTaGFyZCIsIlNoYXJkaW5nUmVxdWlyZWQiLCJJbnZhbGlkQXBpVmVyc2lvbiIsIkludmFsaWRJbnRlbnRzIiwiRGlzYWxsb3dlZEludGVudHMiLCJFcnJvciIsIk5vdEF1dGhlbnRpY2F0ZWQiLCJJbnZhbGlkU2VxIiwiU2Vzc2lvblRpbWVkT3V0IiwiVW5rbm93bkVycm9yIiwiVW5rbm93bk9wY29kZSIsIkRlY29kZUVycm9yIiwiUmF0ZUxpbWl0ZWQiLCJBbHJlYWR5QXV0aGVudGljYXRlZCIsImlzQ29tcHJlc3NlZCIsIkFycmF5QnVmZmVyIiwiZGVjb21wcmVzc1BhY2tldCIsImhhbmRsZURpc2NvcmRQYWNrZXQiLCJjb21wcmVzc2VkRGF0YSIsImZhdGFsIiwid3JpdGVQcm9taXNlIiwicmVqZWN0Iiwid3JpdGUiLCJlbmRzV2l0aE1hcmtlciIsImRlY29tcHJlc3Npb25Qcm9taXNlIiwiciIsImRlY29tcHJlc3NlZCIsInBhY2tldCIsImxhc3RBY2siLCJEYXRlIiwibm93IiwiSGVhcnRiZWF0IiwibGFzdEJlYXQiLCJoZWFydGJlYXQiLCJIZWxsbyIsImhlYXJ0YmVhdF9pbnRlcnZhbCIsInN0YXJ0SGVhcnRiZWF0aW5nIiwiY3VycmVudFF1ZXVlIiwicXVldWUiLCJoZWxsbyIsIkhlYXJ0YmVhdEFDSyIsInJ0dCIsImhlYXJ0YmVhdEFjayIsIlJlY29ubmVjdCIsInJlcXVlc3RlZFJlY29ubmVjdCIsIkludmFsaWRTZXNzaW9uIiwicmVzdW1hYmxlIiwiaW52YWxpZFNlc3Npb24iLCJmbG9vciIsInJhbmRvbSIsImdldCIsInQiLCJDb25uZWN0ZWQiLCJyZXN1bWVkIiwiZm9yRWFjaCIsImxlbmd0aCIsInBheWxvYWQiLCJyZWFkeSIsInJlc3VtZV9nYXRld2F5X3VybCIsInMiLCJmb3J3YXJkVG9Cb3QiLCJqaXR0ZXIiLCJ0aW1lb3V0SWQiLCJzZXRUaW1lb3V0IiwiaW50ZXJ2YWxJZCIsInNldEludGVydmFsIiwiWm9tYmllZENvbm5lY3Rpb24iLCJjbGVhckludGVydmFsIiwiY2xlYXJUaW1lb3V0IiwiYnVmZmVyIiwibWFya2VyIiwiaSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsTUFBTSxRQUFRLGNBQWE7QUFDcEMsU0FBU0MsYUFBYSxFQUFnQkMsV0FBVyxFQUFFQyxhQUFhQyxhQUFhLFFBQVEsWUFBVztBQUVoRyxTQUFTQyxzQkFBc0IsRUFBRUMsY0FBYyxRQUFRLG9CQUFtQjtBQUMxRSxTQUFTQyxRQUFRLEVBQUVDLEtBQUssRUFBRUMsV0FBVyxFQUFFQyxNQUFNLFFBQVEsb0JBQW1CO0FBRXhFLE9BQU9DLG1CQUFtQixLQUFJO0FBQzlCLFNBSUVDLHFCQUFxQixFQUVyQkMsVUFBVSxFQUNWQyxvQkFBb0IsUUFDZixhQUFZO0FBRW5CLE1BQU1DLGtCQUFrQixJQUFJQyxXQUFXO0lBQUM7SUFBSztJQUFLO0lBQU07Q0FBSztBQUU3RCxJQUFJQztBQUVKLHdFQUF3RSxHQUN4RSxlQUFlQztJQUNiLE9BQVFELFVBQVUsTUFBTSxNQUFNLENBQUM7QUFDakM7QUFFQSxPQUFPLE1BQU1FO0lBMkRYLFlBQVlDLE9BQTJCLENBQUU7UUFwRHpDLDBIQUEwSCxRQUMxSEMsOEJBQXNDO1FBQ3RDLDBDQUEwQyxRQUMxQ0MseUJBQXdDO1FBQ3hDLDRFQUE0RSxRQUM1RUMseUJBQWlDO1FBS2pDLHdDQUF3QyxRQUN4Q0MsUUFBUVgsV0FBV1ksT0FBTztRQUMxQixpRkFBaUYsUUFDakZDLG1CQUEyQjtRQUMzQixzQ0FBc0MsUUFDdENDLFNBQXNCLENBQUM7UUFDdkIsbUdBQW1HLFFBQ25HQyxtQkFBbUMsRUFBRTtRQUNyQyxpRkFBaUYsUUFDakZDLFdBQVcsSUFBSUM7UUFLZjs7Ozs7Ozs7R0FRQyxR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