@serenityjs/plugins 0.8.11 → 0.8.12-beta-20250825015248

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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @serenityjs/plugins
2
2
 
3
+ ## 0.8.12-beta-20250825015248
4
+
5
+ ### Patch Changes
6
+
7
+ - [`0a28554`](https://github.com/SerenityJS/serenity/commit/0a285541c9f61f51ab93dabdc0e895121e9e8936) Thanks [@PMK744](https://github.com/PMK744)! - init v0.8.12-beta
8
+
9
+ - Updated dependencies [[`0a28554`](https://github.com/SerenityJS/serenity/commit/0a285541c9f61f51ab93dabdc0e895121e9e8936)]:
10
+ - @serenityjs/core@0.8.12-beta-20250825015248
11
+ - @serenityjs/emitter@0.8.12-beta-20250825015248
12
+ - @serenityjs/logger@0.8.12-beta-20250825015248
13
+ - @serenityjs/protocol@0.8.12-beta-20250825015248
14
+
3
15
  ## 0.8.11
4
16
 
5
17
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -409,10 +409,6 @@ declare class Pipeline {
409
409
  * The plugins loaded in the pipeline.
410
410
  */
411
411
  readonly plugins: Map<string, Plugin<unknown>>;
412
- /**
413
- * The temporary paths used by the pipeline.
414
- */
415
- protected readonly tempPaths: Set<string>;
416
412
  /**
417
413
  * Whether the pipeline is running in ESM mode.
418
414
  */
package/dist/index.d.ts CHANGED
@@ -409,10 +409,6 @@ declare class Pipeline {
409
409
  * The plugins loaded in the pipeline.
410
410
  */
411
411
  readonly plugins: Map<string, Plugin<unknown>>;
412
- /**
413
- * The temporary paths used by the pipeline.
414
- */
415
- protected readonly tempPaths: Set<string>;
416
412
  /**
417
413
  * Whether the pipeline is running in ESM mode.
418
414
  */
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var v=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var f=(a,e)=>v(a,"name",{value:e,configurable:!0});var M=(a,e)=>{for(var t in e)v(a,t,{get:e[t],enumerable:!0})},q=(a,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of _(e))!D.call(a,s)&&s!==t&&v(a,s,{get:()=>e[s],enumerable:!(o=U(e,s))||o.enumerable});return a};var C=a=>q(v({},"__esModule",{value:!0}),a);var Z={};M(Z,{DefaultPipelineProperties:()=>O,Pipeline:()=>W,Plugin:()=>J,PluginHeader:()=>m,PluginPriority:()=>S,PluginType:()=>k});module.exports=C(Z);var l=require("fs"),n=require("path"),w=require("zlib"),P=require("@serenityjs/logger"),x=require("@serenityjs/core"),$=require("@serenityjs/binarystream");var z=require("path");var E=require("@serenityjs/core");var y=class extends E.CustomEnum{static{f(this,"PluginsEnum")}static identifier="plugins";static options=[]},R=class extends E.CustomEnum{static{f(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var K=f((a,e)=>{a.commandPalette.register("plugins","Interact with the plugins of the server",t=>{t.permissions=["serenity.operator"],t.overload({action:R},({action:o})=>{if(o.result!=="list")return;if(e.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let s=[...e.plugins.values()],r=[];for(let i of s)r.push(`\xA7u${i.identifier} v${i.version}\xA7r`);return{message:`\xA77Active Plugins (${s.length}):\xA7r ${r.join("\xA77,\xA7r ")}`}}),t.overload({action:R,plugin:y},({action:o,plugin:s})=>{if(o.result!=="reload"&&o.result!=="bundle")return;let r=e.plugins.get(s.result);if(!r)throw new Error(`Plugin ${s.result} is not found.`);if(o.result==="reload")return e.reload(r),{message:`\xA7aSuccessfully reloaded \xA72${r.identifier}\xA7a.`};if(r.isBundled)throw new Error(`Plugin ${r.identifier} cannot be bundled, as it is already a bundled plugin.`);return e.bundle(r),{message:`\xA7aSuccessfully bundled \xA72${r.identifier}\xA7a, output file was placed at \xA77${(0,z.relative)(process.cwd(),e.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),L=K;var m=function(a){return a[a.HasNoResources=2]="HasNoResources",a[a.HasResources=3]="HasResources",a}(m||{});var S=function(a){return a[a.Low=0]="Low",a[a.Normal=1]="Normal",a[a.High=2]="High",a}(S||{});var k=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(k||{});var O={path:"./plugins",commands:!0,initialize:!0},W=class{static{f(this,"Pipeline")}serenity;properties;logger=new P.Logger("Plugins",P.LoggerColors.MaterialLapis);plugins=new Map;tempPaths=new Set;esm=typeof module<"u"&&module?.exports!==exports;get path(){return this.properties.path}set path(e){throw new Error("The path property is read-only.")}constructor(e,t){this.serenity=e,this.properties={...O,...t},e.on(x.ServerEvent.Start,this.start.bind(this)),e.on(x.ServerEvent.Stop,this.stop.bind(this)),e.on(x.WorldEvent.WorldInitialize,({world:o})=>{this.properties.commands&&L(o,this);for(let[,s]of this.plugins)o.blockPalette.registerType(...s.blocks.types).registerTrait(...s.blocks.traits),o.itemPalette.registerType(...s.items.types).registerTrait(...s.items.traits),o.entityPalette.registerType(...s.entities.types).registerTrait(...s.entities.traits)}),this.properties.initialize&&this.initialize()}initialize(){(0,l.existsSync)((0,n.resolve)(this.path))||(0,l.mkdirSync)((0,n.resolve)(this.path),{recursive:!0});let t=(0,l.readdirSync)((0,n.resolve)(this.path),{withFileTypes:!0}).filter(r=>r.isFile()?r.name.endsWith(".plugin"):!1),o=[];for(let r of t)try{let i=(0,n.resolve)(this.path,r.name),p=(0,w.inflateSync)((0,l.readFileSync)(i)),u=new $.BinaryStream(p);switch(u.readByte()){case m.HasNoResources:{let c=u.readVarInt(),h=u.readBuffer(c).toString("utf-8"),d=this.loadFromTextSource(i,h,!0);d&&o.push(d);break}case m.HasResources:{let c=u.readVarInt(),h=u.readBuffer(c).toString("utf-8"),d=this.loadFromTextSource(i,h,!0);if(!d)break;o.push(d);let g=u.readVarInt();for(let F=0;F<g;F++)try{let T=u.readVarInt(),j=u.readBuffer(T),I=this.serenity.resources.loadFromZip(j);d.logger.success(`Loaded resource pack \xA7u${I.name}\xA7r (\xA78${I.uuid}\xA7r).`),d.resources.add(I)}catch(T){this.logger.error(`Failed to load resource pack \xA78${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,r.name))}\xA7r for plugin \xA71${d.identifier}\xA7r.`,T)}break}case k.Addon:{this.logger.warn(`The plugin \xA71${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,r.name))}\xA7r is using a deprecated plugin type (Addon). Please update the plugin to use the new plugin system.`);let c=u.readRemainingBuffer().toString("utf-8"),h=this.loadFromTextSource(i,c,!0);h&&o.push(h);break}case k.Api:this.logger.error(`The plugin \xA71${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,r.name))}\xA7r is using a deprecated plugin type (API). API plugins are no longer supported. Please update the plugin to use the new plugin system.`)}}catch(i){this.logger.error(`Failed to load plugin from "${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,r.name))}", skipping the plugin.`,i)}let s=(0,l.readdirSync)((0,n.resolve)(this.path),{withFileTypes:!0}).filter(r=>r.isDirectory());for(let r of s)try{let i=(0,n.resolve)(this.path,r.name);if(!(0,l.existsSync)((0,n.resolve)(i,"package.json")))continue;let p=JSON.parse((0,l.readFileSync)((0,n.resolve)(i,"package.json"),"utf-8")),u=(0,n.resolve)(i,p.main);if(!(0,l.existsSync)((0,n.resolve)(i,u))){this.logger.warn(`Unable to load plugin \xA7u${p.name??"unknown-plugin"}\xA78@\xA7u${p.version??"unknown-version"}\xA7r, the main entry path "\xA78${(0,n.relative)(process.cwd(),(0,n.resolve)(i,u))}\xA7r" was not found in the directory.`);continue}let b=require((0,n.resolve)(i,u)),c=b.default;if(this.plugins.has(c.identifier)){this.logger.warn(`Unable to load plugin \xA7u${c.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}c.pipeline=this,c.serenity=this.serenity,c.path=i,c.isBundled=!1,this.linkModule(c.identifier,b),this.plugins.set(c.identifier,c),y.options.push(c.identifier),o.push(c),(0,l.existsSync)((0,n.resolve)(i,"resource_packs"))||(0,l.mkdirSync)((0,n.resolve)(i,"resource_packs"));let h=(0,l.readdirSync)((0,n.resolve)(i,"resource_packs"),{withFileTypes:!0}).filter(d=>d.isDirectory());for(let d of h)try{let g=this.serenity.resources.loadFromPath((0,n.resolve)(i,"resource_packs",d.name));c.logger.success(`Loaded resource pack \xA7u${g.name}\xA7r (\xA78${g.uuid}\xA7r).`),c.resources.add(g)}catch(g){this.logger.error(`Failed to load resource pack \xA78${(0,n.relative)(process.cwd(),(0,n.resolve)(i,"resource_packs",d.name))}\xA7r for plugin \xA71${c.identifier}\xA7r.`,g)}}catch(i){this.logger.error(`Failed to load plugin from "${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,r.name))}", skipping the plugin.`,i)}o.sort((r,i)=>r.priority!==i.priority?i.priority-r.priority:r.identifier<i.identifier?-1:r.identifier>i.identifier?1:0);for(let r of o)r.onInitialize(r),this.bindEvents(r)}start(){for(let e of this.plugins.values())e.onStartUp(e)}stop(){for(let e of this.plugins.values())e.onShutDown(e);for(let e of this.tempPaths)(0,l.unlinkSync)(e)}loadFromTextSource(e,t,o=!1){(0,l.writeFileSync)((0,n.resolve)(e.slice(0,-7)),t);try{let s=require((0,n.resolve)(e.slice(0,-7))),r=s.default;return this.plugins.has(r.identifier)?(this.logger.warn(`Unable to load plugin \xA7u${r.identifier}\xA7r, the plugin is already loaded in the pipeline.`),(0,l.unlinkSync)((0,n.resolve)(e.slice(0,-7))),null):(r.pipeline=this,r.serenity=this.serenity,r.path=(0,n.resolve)(e),r.isBundled=o,this.linkModule(r.identifier,s),this.plugins.set(r.identifier,r),y.options.push(r.identifier),(0,l.unlinkSync)((0,n.resolve)(e.slice(0,-7))),r)}catch(s){this.logger.error(`Failed to load plugin from \xA78${(0,n.relative)(process.cwd(),e)}\xA7r, skipping the plugin.`,s)}return(0,l.unlinkSync)((0,n.resolve)(e.slice(0,-7))),null}reload(e){e.onShutDown(e),this.plugins.delete(e.identifier);let t=e.path;delete require.cache[require.resolve(t)],this.serenity.removePath(t);for(let o of e.resources)this.serenity.resources.packs.delete(o.uuid);if(e.isBundled){let o=(0,w.inflateSync)((0,l.readFileSync)(t)),s=new $.BinaryStream(o);switch(s.readByte()){case m.HasNoResources:{let i=s.readVarInt(),p=s.readBuffer(i).toString("utf-8"),u=this.loadFromTextSource(t,p,!0);if(!u)break;u.onInitialize(u),this.bindEvents(u),u.onStartUp(u);break}case m.HasResources:{let i=s.readVarInt(),p=s.readBuffer(i).toString("utf-8"),u=this.loadFromTextSource(t,p,!0);if(!u)break;u.onInitialize(u),this.bindEvents(u),u.onStartUp(u);let b=s.readVarInt();for(let c=0;c<b;c++)try{let h=s.readVarInt(),d=s.readBuffer(h),g=this.serenity.resources.loadFromZip(d);u.logger.success(`Loaded resource pack \xA7u${g.name}\xA7r (\xA78${g.uuid}\xA7r).`),u.resources.add(g)}catch(h){this.logger.error(`Failed to load resource pack \xA78${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,t))}\xA7r for plugin \xA71${u.identifier}\xA7r.`,h)}}}}else{let o=JSON.parse((0,l.readFileSync)((0,n.resolve)(t,"package.json"),"utf-8")),s=(0,n.resolve)(t,o.main);if(!(0,l.existsSync)((0,n.resolve)(t,s))){this.logger.warn(`Unable to reload plugin \xA7u${o.name??"unknown-plugin"}\xA78@\xA7u${o.version??"unknown-version"}\xA7r, the main entry path "\xA78${(0,n.relative)(process.cwd(),(0,n.resolve)(t,s))}\xA7r" was not found in the directory.`);return}let r=require((0,n.resolve)(t,s)),i=r.default;i.pipeline=this,i.serenity=this.serenity,i.path=t,i.isBundled=!1,this.linkModule(i.identifier,r),this.plugins.set(i.identifier,i),y.options.push(i.identifier),i.onInitialize(i),this.bindEvents(i)}}bundle(e){let t=new $.BinaryStream,o=e.resources.size>0?m.HasResources:m.HasNoResources;switch(t.writeByte(o),o){case m.HasNoResources:{let s=(0,n.resolve)(e.path,"dist","index.js"),r=(0,l.readFileSync)(s);t.writeVarInt(r.byteLength),t.writeBuffer(r),(0,l.writeFileSync)((0,n.resolve)(this.path,`${e.identifier}-v${e.version}.plugin`),(0,w.deflateSync)(t.getBuffer()));break}case m.HasResources:{let s=(0,n.resolve)(e.path,"dist","index.js"),r=(0,l.readFileSync)(s);t.writeVarInt(r.byteLength),t.writeBuffer(r),t.writeVarInt(e.resources.size);for(let i of e.resources){let p=i.compress();t.writeVarInt(p.byteLength),t.writeBuffer(p)}(0,l.writeFileSync)((0,n.resolve)(this.path,`${e.identifier}-v${e.version}.plugin`),(0,w.deflateSync)(t.getBuffer()));break}}}bindEvents(e){let t=Object.getPrototypeOf(e),o=Object.getOwnPropertyNames(t),s=Object.keys(x.WorldEvent);s=s.slice(s.length/2);for(let r of s){let i=s.indexOf(r);if(o.includes("on"+r)){let p=e["on"+r];typeof p=="function"&&this.serenity.on(i,p.bind(e))}if(o.includes("before"+r)){let p=e["before"+r];typeof p=="function"&&this.serenity.before(i,p.bind(e))}if(o.includes("after"+r)){let p=e["after"+r];typeof p=="function"&&this.serenity.after(i,p.bind(e))}}}linkModule(e,t){process.versions.bun!==void 0&&Bun.plugin({name:`serenityjs.plugin.${e}`,setup(s){s.module(e,()=>({exports:t,loader:"object"}))}})}};var B=require("@serenityjs/logger"),V=require("@serenityjs/emitter");var A=class{static{f(this,"PluginBlockRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var N=class{static{f(this,"PluginItemRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var H=class{static{f(this,"PluginEntityRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var J=class extends V.Emitter{static{f(this,"Plugin")}identifier;version;logger;priority=S.Normal;blocks=new A;items=new N;entities=new H;resources=new Set;path;isBundled;pipeline;serenity;constructor(e,t,o){super(o?.maxListeners),this.identifier=e,this.version=t,this.logger=o?.logger??new B.Logger(`${e}@${t}`,B.LoggerColors.Blue),o?.onInitialize&&(this.onInitialize=o.onInitialize),o?.onStartUp&&(this.onStartUp=o.onStartUp),o?.onShutDown&&(this.onShutDown=o.onShutDown)}resolve(e){if(!this.pipeline)return null;let t=this.pipeline.plugins.get(e);return t||null}onInitialize(e){}onStartUp(e){}onShutDown(e){}};0&&(module.exports={DefaultPipelineProperties,Pipeline,Plugin,PluginHeader,PluginPriority,PluginType});
2
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9waXBlbGluZS50cyIsICIuLi9zcmMvY29tbWFuZHMvY29tbWFuZC50cyIsICIuLi9zcmMvY29tbWFuZHMvZW51bS50cyIsICIuLi9zcmMvZW51bXMvaGVhZGVyLnRzIiwgIi4uL3NyYy9lbnVtcy9wcmlvcml0eS50cyIsICIuLi9zcmMvZW51bXMvdHlwZS50cyIsICIuLi9zcmMvcGx1Z2luLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9ibG9jay50cyIsICIuLi9zcmMvcmVnaXN0cnkvaXRlbS50cyIsICIuLi9zcmMvcmVnaXN0cnkvZW50aXR5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9waXBlbGluZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGx1Z2luXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lbnVtc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHVubGlua1N5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZGVmbGF0ZVN5bmMsIGluZmxhdGVTeW5jIH0gZnJvbSBcIm5vZGU6emxpYlwiO1xuXG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dlckNvbG9ycyB9IGZyb20gXCJAc2VyZW5pdHlqcy9sb2dnZXJcIjtcbmltcG9ydCB7IFNlcmVuaXR5LCBTZXJ2ZXJFdmVudCwgV29ybGRFdmVudCB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBCaW5hcnlTdHJlYW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFBsdWdpblBhY2thZ2UgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSBcIi4vcGx1Z2luXCI7XG5pbXBvcnQgQ29tbWFuZCBmcm9tIFwiLi9jb21tYW5kcy9jb21tYW5kXCI7XG5pbXBvcnQgeyBQbHVnaW5zRW51bSB9IGZyb20gXCIuL2NvbW1hbmRzXCI7XG5pbXBvcnQgeyBQbHVnaW5UeXBlLCBQbHVnaW5IZWFkZXIgfSBmcm9tIFwiLi9lbnVtc1wiO1xuXG5pbnRlcmZhY2UgUGlwZWxpbmVQcm9wZXJ0aWVzIHtcbiAgcGF0aDogc3RyaW5nO1xuICBjb21tYW5kczogYm9vbGVhbjtcbiAgaW5pdGlhbGl6ZTogYm9vbGVhbjtcbn1cblxuY29uc3QgRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllczogUGlwZWxpbmVQcm9wZXJ0aWVzID0ge1xuICBwYXRoOiBcIi4vcGx1Z2luc1wiLFxuICBjb21tYW5kczogdHJ1ZSxcbiAgaW5pdGlhbGl6ZTogdHJ1ZVxufTtcblxuY2xhc3MgUGlwZWxpbmUge1xuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZSBmb3IgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VyZW5pdHk6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBmb3IgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydGllczogUGlwZWxpbmVQcm9wZXJ0aWVzO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKFwiUGx1Z2luc1wiLCBMb2dnZXJDb2xvcnMuTWF0ZXJpYWxMYXBpcyk7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW5zIGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2lucyA9IG5ldyBNYXA8c3RyaW5nLCBQbHVnaW4+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZW1wb3JhcnkgcGF0aHMgdXNlZCBieSB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGVtcFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBpcGVsaW5lIGlzIHJ1bm5pbmcgaW4gRVNNIG1vZGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXNtOiBib29sZWFuID1cbiAgICB0eXBlb2YgbW9kdWxlICE9PSBcInVuZGVmaW5lZFwiICYmIG1vZHVsZT8uZXhwb3J0cyAhPT0gZXhwb3J0cztcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIGdldCBwYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5wYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyBzZXQgcGF0aChfKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhdGggcHJvcGVydHkgaXMgcmVhZC1vbmx5LlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBQaXBlbGluZSBjbGFzcy5cbiAgICogQHBhcmFtIHNlcmVuaXR5IFRoZSBzZXJlbml0eSBzZXJ2ZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgc2VyZW5pdHk6IFNlcmVuaXR5LFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFBpcGVsaW5lUHJvcGVydGllcz5cbiAgKSB7XG4gICAgLy8gU2V0IHRoZSBzZXJlbml0eSBzZXJ2ZXIgaW5zdGFuY2VcbiAgICB0aGlzLnNlcmVuaXR5ID0gc2VyZW5pdHk7XG5cbiAgICAvLyBNZXJnZSB0aGUgcHJvcGVydGllcyB3aXRoIHRoZSBkZWZhdWx0IHByb3BlcnRpZXNcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7IC4uLkRlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMsIC4uLnByb3BlcnRpZXMgfTtcblxuICAgIC8vIEhvb2sgaW50byB0aGUgc2VyZW5pdHkgc2VydmVyIGV2ZW50c1xuICAgIHNlcmVuaXR5Lm9uKFNlcnZlckV2ZW50LlN0YXJ0LCB0aGlzLnN0YXJ0LmJpbmQodGhpcykpO1xuICAgIHNlcmVuaXR5Lm9uKFNlcnZlckV2ZW50LlN0b3AsIHRoaXMuc3RvcC5iaW5kKHRoaXMpKTtcblxuICAgIC8vIEhvb2sgaW50byB0aGUgd29ybGQgaW5pdGlhbGl6ZSBldmVudFxuICAgIHNlcmVuaXR5Lm9uKFdvcmxkRXZlbnQuV29ybGRJbml0aWFsaXplLCAoeyB3b3JsZCB9KSA9PiB7XG4gICAgICAvLyBSZWdpc3RlciB0aGUgY29tbWFuZHMgZm9yIHRoZSBwbHVnaW5zXG4gICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmNvbW1hbmRzKSBDb21tYW5kKHdvcmxkLCB0aGlzKTtcblxuICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcGx1Z2lucywgYW5kIHJlZ2lzdGVyIHRoZSBibG9ja3MsIGl0ZW1zLCBhbmQgZW50aXRpZXNcbiAgICAgIGZvciAoY29uc3QgWywgcGx1Z2luXSBvZiB0aGlzLnBsdWdpbnMpIHtcbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGJsb2NrcyBmb3IgdGhlIHdvcmxkXG4gICAgICAgIHdvcmxkLmJsb2NrUGFsZXR0ZVxuICAgICAgICAgIC5yZWdpc3RlclR5cGUoLi4ucGx1Z2luLmJsb2Nrcy50eXBlcylcbiAgICAgICAgICAucmVnaXN0ZXJUcmFpdCguLi5wbHVnaW4uYmxvY2tzLnRyYWl0cyk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGl0ZW1zIGZvciB0aGUgd29ybGRcbiAgICAgICAgd29ybGQuaXRlbVBhbGV0dGVcbiAgICAgICAgICAucmVnaXN0ZXJUeXBlKC4uLnBsdWdpbi5pdGVtcy50eXBlcylcbiAgICAgICAgICAucmVnaXN0ZXJUcmFpdCguLi5wbHVnaW4uaXRlbXMudHJhaXRzKTtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGUgZW50aXRpZXMgZm9yIHRoZSB3b3JsZFxuICAgICAgICB3b3JsZC5lbnRpdHlQYWxldHRlXG4gICAgICAgICAgLnJlZ2lzdGVyVHlwZSguLi5wbHVnaW4uZW50aXRpZXMudHlwZXMpXG4gICAgICAgICAgLnJlZ2lzdGVyVHJhaXQoLi4ucGx1Z2luLmVudGl0aWVzLnRyYWl0cyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2lucyBzaG91bGQgYmUgaW5pdGlhbGl6ZWRcbiAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmluaXRpYWxpemUpIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHRoaXMucGF0aCkpKVxuICAgICAgLy8gSWYgbm90LCBjcmVhdGUgdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICBta2RpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlYWQgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KTtcblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBmaWxlcyB0aGF0IGhhdmUgYSAucGx1Z2luIGV4dGVuc2lvblxuICAgIGNvbnN0IGJ1bmRsZXMgPSBlbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PlxuICAgICAgZGlyZW50LmlzRmlsZSgpID8gZGlyZW50Lm5hbWUuZW5kc1dpdGgoXCIucGx1Z2luXCIpIDogZmFsc2VcbiAgICApO1xuXG4gICAgLy8gQXJyYXkgdG8gaG9sZCB0aGUgb3JkZXJlZCBwbHVnaW5zXG4gICAgY29uc3Qgb3JkZXJlZFBsdWdpbnM6IEFycmF5PFBsdWdpbj4gPSBbXTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGJ1bmRsZWQgcGx1Z2lucywgYW5kIGltcG9ydCB0aGVtXG4gICAgZm9yIChjb25zdCBidW5kbGUgb2YgYnVuZGxlcykge1xuICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIC5wbHVnaW4gZmlsZSBhbmQgaW5mbGF0ZSBpdCwgYW5kIGNyZWF0ZSBhIG5ldyBiaW5hcnkgc3RyZWFtXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGluZmxhdGVTeW5jKHJlYWRGaWxlU3luYyhwYXRoKSk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oYnVmZmVyKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBwbHVnaW4gaGVhZGVyIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICBjb25zdCB0eXBlID0gc3RyZWFtLnJlYWRCeXRlKCkgYXMgUGx1Z2luVHlwZSB8IFBsdWdpbkhlYWRlcjtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFBsdWdpbkhlYWRlci5IYXNOb1Jlc291cmNlczoge1xuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcblxuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAgIC8vIExvYWQgdGhlIHBsdWdpbiBmcm9tIHRoZSB0ZXh0IHNvdXJjZVxuICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gdG8gdGhlIG9yZGVyZWQgcGx1Z2lucyBhcnJheVxuICAgICAgICAgICAgaWYgKHBsdWdpbikgb3JkZXJlZFBsdWdpbnMucHVzaChwbHVnaW4pO1xuXG4gICAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc1Jlc291cmNlczoge1xuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcblxuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAgIC8vIExvYWQgdGhlIHBsdWdpbiBmcm9tIHRoZSB0ZXh0IHNvdXJjZVxuICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIHdhcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAgICAgICBpZiAoIXBsdWdpbikgYnJlYWs7XG5cbiAgICAgICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiB0byB0aGUgb3JkZXJlZCBwbHVnaW5zIGFycmF5XG4gICAgICAgICAgICBvcmRlcmVkUGx1Z2lucy5wdXNoKHBsdWdpbik7XG5cbiAgICAgICAgICAgIC8vIFJlYWQgdGhlIGFtb3VudCBvZiByZXNvdXJjZXMgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCByZXNvdXJjZXMgPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZXNvdXJjZXMsIGFuZCByZWFkIHRoZW0gZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc291cmNlczsgaSsrKSB7XG4gICAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gcmVhZCB0aGUgcmVzb3VyY2UgcGFja1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgLy8gTG9hZCB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBidWZmZXJcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuc2VyZW5pdHkucmVzb3VyY2VzLmxvYWRGcm9tWmlwKGJ1ZmZlcik7XG5cbiAgICAgICAgICAgICAgICAvLyBMb2cgdGhlIHN1Y2Nlc3NmdWwgbG9hZCBvZiB0aGUgcmVzb3VyY2UgcGFja1xuICAgICAgICAgICAgICAgIHBsdWdpbi5sb2dnZXIuc3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgIGBMb2FkZWQgcmVzb3VyY2UgcGFjayDCp3Uke3Jlc291cmNlLm5hbWV9wqdyICjCpzgke3Jlc291cmNlLnV1aWR9wqdyKS5gXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgcmVzb3VyY2UgcGFjayB0byB0aGUgcGx1Z2luIHJlc291cmNlcyBzZXRcbiAgICAgICAgICAgICAgICBwbHVnaW4ucmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgICAgIC8vIExvZyB0aGUgZXJyb3IgaWYgdGhlIHJlc291cmNlIHBhY2sgZmFpbGVkIHRvIGxvYWRcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCByZXNvdXJjZSBwYWNrIMKnOCR7cmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSlcbiAgICAgICAgICAgICAgICAgICl9wqdyIGZvciBwbHVnaW4gwqcxJHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IuYCxcbiAgICAgICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBERVBSRUNBVEVEOiBFdmVudHVhbGx5IHJlbW92ZSBzdXBwb3J0IGZvciB0aGVzZSBwbHVnaW4gdHlwZXNcbiAgICAgICAgICBjYXNlIFBsdWdpblR5cGUuQWRkb246IHtcbiAgICAgICAgICAgIC8vIFdlIHdpbGwgaGFuZGxlIGFkZG9uIHBsdWdpbnMsIGJ1dCBtZW50aW9uIHRoYXQgdGhleSBhcmUgZGVwcmVjYXRlZFxuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFRoZSBwbHVnaW4gwqcxJHtyZWxhdGl2ZShcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSlcbiAgICAgICAgICAgICAgKX3Cp3IgaXMgdXNpbmcgYSBkZXByZWNhdGVkIHBsdWdpbiB0eXBlIChBZGRvbikuIFBsZWFzZSB1cGRhdGUgdGhlIHBsdWdpbiB0byB1c2UgdGhlIG5ldyBwbHVnaW4gc3lzdGVtLmBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFJlYWQgdGhlIG1vZHVsZSBlbnRyeSBwb2ludCBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RyZWFtLnJlYWRSZW1haW5pbmdCdWZmZXIoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgICAvLyBMb2FkIHRoZSBwbHVnaW4gZnJvbSB0aGUgdGV4dCBzb3VyY2VcbiAgICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMubG9hZEZyb21UZXh0U291cmNlKHBhdGgsIGluZGV4LCB0cnVlKTtcblxuICAgICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIHRvIHRoZSBvcmRlcmVkIHBsdWdpbnMgYXJyYXlcbiAgICAgICAgICAgIGlmIChwbHVnaW4pIG9yZGVyZWRQbHVnaW5zLnB1c2gocGx1Z2luKTtcblxuICAgICAgICAgICAgLy8gQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBERVBSRUNBVEVEOiBFdmVudHVhbGx5IHJlbW92ZSBzdXBwb3J0IGZvciB0aGVzZSBwbHVnaW4gdHlwZXNcbiAgICAgICAgICBjYXNlIFBsdWdpblR5cGUuQXBpOiB7XG4gICAgICAgICAgICAvLyBXZSBubyBsb25nZXIgc3VwcG9ydCBBUEkgcGx1Z2luc1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgIGBUaGUgcGx1Z2luIMKnMSR7cmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUpXG4gICAgICAgICAgICAgICl9wqdyIGlzIHVzaW5nIGEgZGVwcmVjYXRlZCBwbHVnaW4gdHlwZSAoQVBJKS4gQVBJIHBsdWdpbnMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQuIFBsZWFzZSB1cGRhdGUgdGhlIHBsdWdpbiB0byB1c2UgdGhlIG5ldyBwbHVnaW4gc3lzdGVtLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gXCIke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSkpfVwiLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGRpcmVjdG9yaWVzIGZyb20gdGhlIGVudHJpZXNcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNEaXJlY3RvcnkoKSk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBkaXJlY3RvcmllcywgY2hlY2tpbmcgaWYgdGhleSBhcmUgdmFsaWQgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBkaXJlY3RvcnkubmFtZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYSBwYWNrYWdlLmpzb24gZmlsZSwgaWYgbm90LCBza2lwIHRoZSBwbHVnaW5cbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIikpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgcmVhZEZpbGVTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIilcbiAgICAgICAgKSBhcyBQbHVnaW5QYWNrYWdlO1xuXG4gICAgICAgIC8vIEdldCB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCBtYW5pZmVzdC5tYWluKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZWQgZW50cnkgcG9pbnQgaXMgdmFsaWRcbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgbWFpbikpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqd1JHttYW5pZmVzdC5uYW1lID8/IFwidW5rbm93bi1wbHVnaW5cIn3CpzhAwqd1JHttYW5pZmVzdC52ZXJzaW9uID8/IFwidW5rbm93bi12ZXJzaW9uXCJ9wqdyLCB0aGUgbWFpbiBlbnRyeSBwYXRoIFwiwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHBhdGgsIG1haW4pKX3Cp3JcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHJlc29sdmUocGF0aCwgbWFpbikpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBMaW5rIHRoZSBtb2R1bGUgdG8gdGhlIHBpcGVsaW5lXG4gICAgICAgIHRoaXMubGlua01vZHVsZShwbHVnaW4uaWRlbnRpZmllciwgbW9kdWxlKTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIHRvIHRoZSBvcmRlcmVkIHBsdWdpbnMgYXJyYXlcbiAgICAgICAgb3JkZXJlZFBsdWdpbnMucHVzaChwbHVnaW4pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGEgXCJyZXNvdXJjZV9wYWNrc1wiIGRpcmVjdG9yeSBleGlzdHMgaW4gdGhlIHBsdWdpblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBcInJlc291cmNlX3BhY2tzXCIpKSkge1xuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgcmVzb3VyY2VfcGFja3MgZGlyZWN0b3J5XG4gICAgICAgICAgbWtkaXJTeW5jKHJlc29sdmUocGF0aCwgXCJyZXNvdXJjZV9wYWNrc1wiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgcmVzb3VyY2VfcGFjayBkaXJlY3RvcnksIG9ubHkgaW5jbHVkaW5nIGRpcmVjdG9yaWVzXG4gICAgICAgIGNvbnN0IHJlc291cmNlcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUocGF0aCwgXCJyZXNvdXJjZV9wYWNrc1wiKSwge1xuICAgICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICAgICAgfSkuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKTtcblxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZXNvdXJjZSBwYWNrIGRpcmVjdG9yaWVzLCBhbmQgYXR0ZW1wdCB0byBsb2FkIHRoZW1cbiAgICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiByZXNvdXJjZXMpIHtcbiAgICAgICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHJlc291cmNlIHBhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVzb3VyY2UgcGFjaywgYW5kIGFkZCBpdCB0byB0aGUgc2VyZW5pdHkgcmVzb3VyY2VzXG4gICAgICAgICAgICBjb25zdCBwYWNrID0gdGhpcy5zZXJlbml0eS5yZXNvdXJjZXMubG9hZEZyb21QYXRoKFxuICAgICAgICAgICAgICByZXNvbHZlKHBhdGgsIFwicmVzb3VyY2VfcGFja3NcIiwgcmVzb3VyY2UubmFtZSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIExvZyB0aGUgc3VjY2Vzc2Z1bCBsb2FkIG9mIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgICBwbHVnaW4ubG9nZ2VyLnN1Y2Nlc3MoXG4gICAgICAgICAgICAgIGBMb2FkZWQgcmVzb3VyY2UgcGFjayDCp3Uke3BhY2submFtZX3Cp3IgKMKnOCR7cGFjay51dWlkfcKncikuYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gQWRkIHRoZSByZXNvdXJjZSBwYWNrIHRvIHRoZSBwbHVnaW4gcmVzb3VyY2VzIHNldFxuICAgICAgICAgICAgcGx1Z2luLnJlc291cmNlcy5hZGQocGFjayk7XG4gICAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICAvLyBMb2cgdGhlIGVycm9yIGlmIHRoZSByZXNvdXJjZSBwYWNrIGZhaWxlZCB0byBsb2FkXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHJlc291cmNlIHBhY2sgwqc4JHtyZWxhdGl2ZShcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgIHJlc29sdmUocGF0aCwgXCJyZXNvdXJjZV9wYWNrc1wiLCByZXNvdXJjZS5uYW1lKVxuICAgICAgICAgICAgICApfcKnciBmb3IgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLmAsXG4gICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IHRoZSBwbHVnaW5zIGJ5IHRoZWlyIHByaW9yaXR5XG4gICAgb3JkZXJlZFBsdWdpbnMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgLy8gU29ydCBieSBwcmlvcml0eSBmaXJzdFxuICAgICAgaWYgKGEucHJpb3JpdHkgIT09IGIucHJpb3JpdHkpIHtcbiAgICAgICAgcmV0dXJuIGIucHJpb3JpdHkgLSBhLnByaW9yaXR5OyAvLyBIaWdoZXIgcHJpb3JpdHkgY29tZXMgZmlyc3RcbiAgICAgIH1cblxuICAgICAgLy8gSWYgcHJpb3JpdHkgaXMgdGhlIHNhbWUsIHNvcnQgYnkgaWRlbnRpZmllciBhbHBoYWJldGljYWxseVxuICAgICAgaWYgKGEuaWRlbnRpZmllciA8IGIuaWRlbnRpZmllcikgcmV0dXJuIC0xO1xuICAgICAgaWYgKGEuaWRlbnRpZmllciA+IGIuaWRlbnRpZmllcikgcmV0dXJuIDE7XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHBsdWdpbnMsIGFuZCBpbml0aWFsaXplIHRoZW1cbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBvcmRlcmVkUGx1Z2lucykge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luLCBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICBwbHVnaW4ub25Jbml0aWFsaXplKHBsdWdpbik7XG4gICAgICB0aGlzLmJpbmRFdmVudHMocGx1Z2luKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgIC8vIFN0YXJ0IHVwIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU3RhcnRVcChwbHVnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcblxuICAgIC8vIERlbGV0ZSBhbGwgdGhlIHRlbXBvcmFyeSBmaWxlc1xuICAgIGZvciAoY29uc3QgdGVtcFBhdGggb2YgdGhpcy50ZW1wUGF0aHMpIHtcbiAgICAgIC8vIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgIHVubGlua1N5bmModGVtcFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGEgcGx1Z2luIGZyb20gYSB0ZXh0IHNvdXJjZS5cbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGNvZGUgb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIGlzQnVuZGxlZCBXaGV0aGVyIHRoZSBwbHVnaW4gaXMgYnVuZGxlZCBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgbG9hZEZyb21UZXh0U291cmNlKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBzb3VyY2U6IHN0cmluZyxcbiAgICBpc0J1bmRsZWQgPSBmYWxzZVxuICApOiBQbHVnaW4gfCBudWxsIHtcbiAgICAvLyBXcml0ZSB0aGUgc291cmNlIHRvIHRoZSB0ZW1wb3JhcnkgcGF0aFxuICAgIHdyaXRlRmlsZVN5bmMocmVzb2x2ZShwYXRoLnNsaWNlKDAsIC03KSksIHNvdXJjZSk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgIHRyeSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZShyZXNvbHZlKHBhdGguc2xpY2UoMCwgLTcpKSk7XG5cbiAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgY29uc3QgcGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgLy8gTG9nIHRoZSB3YXJuaW5nIHRoYXQgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZFxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqd1JHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IsIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIHBpcGVsaW5lLmBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgIHVubGlua1N5bmMocmVzb2x2ZShwYXRoLnNsaWNlKDAsIC03KSkpO1xuXG4gICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgcGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgIHBsdWdpbi5wYXRoID0gcmVzb2x2ZShwYXRoKTtcbiAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSBpc0J1bmRsZWQ7XG5cbiAgICAgIC8vIExpbmsgdGhlIG1vZHVsZSB0byB0aGUgcGlwZWxpbmVcbiAgICAgIHRoaXMubGlua01vZHVsZShwbHVnaW4uaWRlbnRpZmllciwgbW9kdWxlKTtcblxuICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICBQbHVnaW5zRW51bS5vcHRpb25zLnB1c2gocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICB1bmxpbmtTeW5jKHJlc29sdmUocGF0aC5zbGljZSgwLCAtNykpKTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBwbHVnaW5cbiAgICAgIHJldHVybiBwbHVnaW47XG4gICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgIHJlYXNvblxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgdW5saW5rU3luYyhyZXNvbHZlKHBhdGguc2xpY2UoMCwgLTcpKSk7XG5cbiAgICAvLyBSZXR1cm4gbnVsbCBpZiB0aGUgcGx1Z2luIGZhaWxlZCB0byBsb2FkXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIHRoZSBwbHVnaW5cbiAgICBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgcGx1Z2lucyBtYXBcbiAgICB0aGlzLnBsdWdpbnMuZGVsZXRlKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgIC8vIEdldCB0aGUgcGx1Z2luIHBhdGhcbiAgICBjb25zdCBwYXRoID0gcGx1Z2luLnBhdGg7XG5cbiAgICAvLyBEZWxldGUgdGhlIHJlcXVpcmUgY2FjaGUgZm9yIHRoZSBwbHVnaW5cbiAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtyZXF1aXJlLnJlc29sdmUocGF0aCldO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgc2VyZW5pdHkgaW5zdGFuY2VcbiAgICB0aGlzLnNlcmVuaXR5LnJlbW92ZVBhdGgocGF0aCk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZXNvdXJjZXMgaW4gdGhlIHBsdWdpbiwgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIHNlcmVuaXR5IGluc3RhbmNlXG4gICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBwbHVnaW4ucmVzb3VyY2VzKSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIHJlc291cmNlIHBhY2sgZnJvbSB0aGUgc2VyZW5pdHkgaW5zdGFuY2VcbiAgICAgIHRoaXMuc2VyZW5pdHkucmVzb3VyY2VzLnBhY2tzLmRlbGV0ZShyZXNvdXJjZS51dWlkKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2luLmlzQnVuZGxlZCkge1xuICAgICAgLy8gUmVhZCB0aGUgLnBsdWdpbiBmaWxlIGFuZCBpbmZsYXRlIGl0LCBhbmQgY3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW1cbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGluZmxhdGVTeW5jKHJlYWRGaWxlU3luYyhwYXRoKSk7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBiaW5hcnkgc3RyZWFtIGZyb20gdGhlIGJ1ZmZlclxuICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgICAvLyBSZWFkIHRoZSBwbHVnaW4gaGVhZGVyIGZyb20gdGhlIHN0cmVhbVxuICAgICAgY29uc3QgdHlwZSA9IHN0cmVhbS5yZWFkQnl0ZSgpIGFzIFBsdWdpblR5cGUgfCBQbHVnaW5IZWFkZXI7XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFBsdWdpbkhlYWRlci5IYXNOb1Jlc291cmNlczoge1xuICAgICAgICAgIC8vIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGUgaW5kZXggZmlsZSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgLy8gTG9hZCB0aGUgcGx1Z2luIGZyb20gdGhlIHRleHQgc291cmNlXG4gICAgICAgICAgY29uc3QgbmV3UGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiB3YXMgbG9hZGVkIHN1Y2Nlc3NmdWxseVxuICAgICAgICAgIGlmICghbmV3UGx1Z2luKSBicmVhaztcblxuICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbiwgYW5kIGJpbmQgdGhlIGV2ZW50c1xuICAgICAgICAgIG5ld1BsdWdpbi5vbkluaXRpYWxpemUobmV3UGx1Z2luKTtcbiAgICAgICAgICB0aGlzLmJpbmRFdmVudHMobmV3UGx1Z2luKTtcblxuICAgICAgICAgIC8vIFN0YXJ0IHVwIHRoZSBwbHVnaW5cbiAgICAgICAgICBuZXdQbHVnaW4ub25TdGFydFVwKG5ld1BsdWdpbik7XG5cbiAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc1Jlc291cmNlczoge1xuICAgICAgICAgIC8vIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGUgaW5kZXggZmlsZSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgLy8gTG9hZCB0aGUgcGx1Z2luIGZyb20gdGhlIHRleHQgc291cmNlXG4gICAgICAgICAgY29uc3QgbmV3UGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiB3YXMgbG9hZGVkIHN1Y2Nlc3NmdWxseVxuICAgICAgICAgIGlmICghbmV3UGx1Z2luKSBicmVhaztcblxuICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbiwgYW5kIGJpbmQgdGhlIGV2ZW50c1xuICAgICAgICAgIG5ld1BsdWdpbi5vbkluaXRpYWxpemUobmV3UGx1Z2luKTtcbiAgICAgICAgICB0aGlzLmJpbmRFdmVudHMobmV3UGx1Z2luKTtcblxuICAgICAgICAgIC8vIFN0YXJ0IHVwIHRoZSBwbHVnaW5cbiAgICAgICAgICBuZXdQbHVnaW4ub25TdGFydFVwKG5ld1BsdWdpbik7XG5cbiAgICAgICAgICAvLyBSZWFkIHRoZSBhbW91bnQgb2YgcmVzb3VyY2VzIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IHJlc291cmNlcyA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZXNvdXJjZXMsIGFuZCByZWFkIHRoZW0gZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNvdXJjZXM7IGkrKykge1xuICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAvLyBSZWFkIHRoZSBsZW5ndGggb2YgdGhlIHJlc291cmNlIHBhY2sgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKTtcblxuICAgICAgICAgICAgICAvLyBMb2FkIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIGJ1ZmZlclxuICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuc2VyZW5pdHkucmVzb3VyY2VzLmxvYWRGcm9tWmlwKGJ1ZmZlcik7XG5cbiAgICAgICAgICAgICAgLy8gTG9nIHRoZSBzdWNjZXNzZnVsIGxvYWQgb2YgdGhlIHJlc291cmNlIHBhY2tcbiAgICAgICAgICAgICAgbmV3UGx1Z2luLmxvZ2dlci5zdWNjZXNzKFxuICAgICAgICAgICAgICAgIGBMb2FkZWQgcmVzb3VyY2UgcGFjayDCp3Uke3Jlc291cmNlLm5hbWV9wqdyICjCpzgke3Jlc291cmNlLnV1aWR9wqdyKS5gXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgLy8gQWRkIHRoZSByZXNvdXJjZSBwYWNrIHRvIHRoZSBwbHVnaW4gcmVzb3VyY2VzIHNldFxuICAgICAgICAgICAgICBuZXdQbHVnaW4ucmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgICAgICAgLy8gTG9nIHRoZSBlcnJvciBpZiB0aGUgcmVzb3VyY2UgcGFjayBmYWlsZWQgdG8gbG9hZFxuICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2UgcGFjayDCpzgke3JlbGF0aXZlKFxuICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBwYXRoKVxuICAgICAgICAgICAgICAgICl9wqdyIGZvciBwbHVnaW4gwqcxJHtuZXdQbHVnaW4uaWRlbnRpZmllcn3Cp3IuYCxcbiAgICAgICAgICAgICAgICByZWFzb25cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVhZCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgcmVhZEZpbGVTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIilcbiAgICAgICkgYXMgUGx1Z2luUGFja2FnZTtcblxuICAgICAgLy8gR2V0IHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgcGx1Z2luXG4gICAgICBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCBtYW5pZmVzdC5tYWluKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVkIGVudHJ5IHBvaW50IGlzIHZhbGlkXG4gICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBtYWluKSkpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgVW5hYmxlIHRvIHJlbG9hZCBwbHVnaW4gwqd1JHttYW5pZmVzdC5uYW1lID8/IFwidW5rbm93bi1wbHVnaW5cIn3CpzhAwqd1JHttYW5pZmVzdC52ZXJzaW9uID8/IFwidW5rbm93bi12ZXJzaW9uXCJ9wqdyLCB0aGUgbWFpbiBlbnRyeSBwYXRoIFwiwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHBhdGgsIG1haW4pKX3Cp3JcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEF0dGVtcHQgdG8gaW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHJlc29sdmUocGF0aCwgbWFpbikpO1xuXG4gICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgIGNvbnN0IG5ld1BsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICBuZXdQbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgbmV3UGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgIG5ld1BsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgIG5ld1BsdWdpbi5pc0J1bmRsZWQgPSBmYWxzZTtcblxuICAgICAgLy8gTGluayB0aGUgbW9kdWxlIHRvIHRoZSBwaXBlbGluZVxuICAgICAgdGhpcy5saW5rTW9kdWxlKG5ld1BsdWdpbi5pZGVudGlmaWVyLCBtb2R1bGUpO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgIHRoaXMucGx1Z2lucy5zZXQobmV3UGx1Z2luLmlkZW50aWZpZXIsIG5ld1BsdWdpbik7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChuZXdQbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbiwgYW5kIGJpbmQgdGhlIGV2ZW50c1xuICAgICAgbmV3UGx1Z2luLm9uSW5pdGlhbGl6ZShuZXdQbHVnaW4pO1xuICAgICAgdGhpcy5iaW5kRXZlbnRzKG5ld1BsdWdpbik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGJ1bmRsZShwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBCaW5hcnlTdHJlYW0gaW5zdGFuY2VcbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIHBsdWdpbiBoZWFkZXIgYmFzZWQgb24gdGhlIHJlc291cmNlc1xuICAgIGNvbnN0IGhlYWRlciA9XG4gICAgICBwbHVnaW4ucmVzb3VyY2VzLnNpemUgPiAwXG4gICAgICAgID8gUGx1Z2luSGVhZGVyLkhhc1Jlc291cmNlc1xuICAgICAgICA6IFBsdWdpbkhlYWRlci5IYXNOb1Jlc291cmNlcztcblxuICAgIC8vIFdyaXRlIHRoZSBwbHVnaW4gdHlwZSB0byB0aGUgc3RyZWFtXG4gICAgc3RyZWFtLndyaXRlQnl0ZShoZWFkZXIpO1xuXG4gICAgLy8gU3dpdGNoIGJhc2VkIG9uIHRoZSBwbHVnaW4gaGVhZGVyXG4gICAgc3dpdGNoIChoZWFkZXIpIHtcbiAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc05vUmVzb3VyY2VzOiB7XG4gICAgICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgcGx1Z2luJ3MgY29tcGlsZWQgaW5kZXggZmlsZVxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZShwbHVnaW4ucGF0aCwgXCJkaXN0XCIsIFwiaW5kZXguanNcIik7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgaW5kZXggZmlsZSBmcm9tIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgaW5kZXggPSByZWFkRmlsZVN5bmMocGF0aCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIGxlbmd0aCBvZiB0aGUgaW5kZXggZmlsZSB0byB0aGUgc3RyZWFtXG4gICAgICAgIHN0cmVhbS53cml0ZVZhckludChpbmRleC5ieXRlTGVuZ3RoKTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgaW5kZXggZmlsZSB0byB0aGUgc3RyZWFtXG4gICAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihpbmRleCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIEJpbmFyeVN0cmVhbSB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7cGx1Z2luLmlkZW50aWZpZXJ9LXYke3BsdWdpbi52ZXJzaW9ufS5wbHVnaW5gKSxcbiAgICAgICAgICBkZWZsYXRlU3luYyhzdHJlYW0uZ2V0QnVmZmVyKCkpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFBsdWdpbkhlYWRlci5IYXNSZXNvdXJjZXM6IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW4ncyBjb21waWxlZCBpbmRleCBmaWxlXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHBsdWdpbi5wYXRoLCBcImRpc3RcIiwgXCJpbmRleC5qc1wiKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBpbmRleCA9IHJlYWRGaWxlU3luYyhwYXRoKTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgc3RyZWFtLndyaXRlVmFySW50KGluZGV4LmJ5dGVMZW5ndGgpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBpbmRleCBmaWxlIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGluZGV4KTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgYW1vdW50IG9mIHJlc291cmNlcyB0byB0aGUgc3RyZWFtXG4gICAgICAgIHN0cmVhbS53cml0ZVZhckludChwbHVnaW4ucmVzb3VyY2VzLnNpemUpO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlc291cmNlcywgYW5kIHdyaXRlIHRoZW0gdG8gdGhlIHN0cmVhbVxuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHBsdWdpbi5yZXNvdXJjZXMpIHtcbiAgICAgICAgICAvLyBDb21wcmVzcyB0aGUgcmVzb3VyY2UgcGFjayBpbnRvIGEgYnVmZmVyXG4gICAgICAgICAgY29uc3QgYnVmZmVyID0gcmVzb3VyY2UuY29tcHJlc3MoKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIHJlc291cmNlIHBhY2sgdG8gdGhlIHN0cmVhbVxuICAgICAgICAgIHN0cmVhbS53cml0ZVZhckludChidWZmZXIuYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgcmVzb3VyY2UgcGFjayB0byB0aGUgc3RyZWFtXG4gICAgICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGJ1ZmZlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXcml0ZSB0aGUgQmluYXJ5U3RyZWFtIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0tdiR7cGx1Z2luLnZlcnNpb259LnBsdWdpbmApLFxuICAgICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGJpbmRFdmVudHMocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHByb3RvdHlwZSBvZiB0aGUgcGx1Z2luXG4gICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHBsdWdpbik7XG5cbiAgICAvLyBHZXQgdGhlIG9iamVjdCBrZXlzIGZyb20gdGhlIHBsdWdpblxuICAgIGNvbnN0IHBsdWdpbktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90b3R5cGUpO1xuXG4gICAgLy8gR2V0IHRoZSB3b3JsZCBldmVudCBrZXlzLCBhbmQgc2xpY2UgdGhlbSBpbiBoYWxmXG4gICAgbGV0IGV2ZW50S2V5cyA9IE9iamVjdC5rZXlzKFdvcmxkRXZlbnQpO1xuICAgIGV2ZW50S2V5cyA9IGV2ZW50S2V5cy5zbGljZShldmVudEtleXMubGVuZ3RoIC8gMik7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBldmVudCBrZXlzXG4gICAgZm9yIChjb25zdCBldmVudEtleSBvZiBldmVudEtleXMpIHtcbiAgICAgIC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIGV2ZW50IGtleVxuICAgICAgY29uc3QgaW5kZXggPSBldmVudEtleXMuaW5kZXhPZihldmVudEtleSkgYXMgV29ybGRFdmVudDtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYW55IFwib25cIiBldmVudCBrZXlzXG4gICAgICBpZiAocGx1Z2luS2V5cy5pbmNsdWRlcyhcIm9uXCIgKyBldmVudEtleSkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXZlbnQga2V5XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGx1Z2luWyhcIm9uXCIgKyBldmVudEtleSkgYXMga2V5b2YgUGx1Z2luXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gdGhlIHBsdWdpblxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkub24oaW5kZXgsIHZhbHVlLmJpbmQocGx1Z2luKSBhcyAoKSA9PiB2b2lkKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYW55IFwiYmVmb3JlXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJiZWZvcmVcIiArIGV2ZW50S2V5KSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBldmVudCBrZXlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwbHVnaW5bKFwiYmVmb3JlXCIgKyBldmVudEtleSkgYXMga2V5b2YgUGx1Z2luXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gdGhlIHBsdWdpblxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkuYmVmb3JlKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gYm9vbGVhbik7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcImFmdGVyXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJhZnRlclwiICsgZXZlbnRLZXkpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV2ZW50IGtleVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHBsdWdpblsoXCJhZnRlclwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5LmFmdGVyKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gdm9pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpbmsgYSBtb2R1bGUgdG8gdGhlIHBpcGVsaW5lLlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGxpbmsuXG4gICAqIEBwYXJhbSBtb2R1bGUgVGhlIG1vZHVsZSB0byBsaW5rLlxuICAgKi9cbiAgcHVibGljIGxpbmtNb2R1bGUobmFtZTogc3RyaW5nLCBtb2R1bGU6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHJ1bnRpbWUgb2YgdGhlIHNlcnZlclxuICAgIGNvbnN0IGlzQnVuID0gcHJvY2Vzcy52ZXJzaW9ucy5idW4gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZTtcblxuICAgIC8vIE1vZHVsZSBsaW5raW5nIGlzIG9ubHkgc3VwcG9ydGVkIGluIEJ1blxuICAgIGlmICghaXNCdW4pIHJldHVybjtcblxuICAgIC8vIEluamVjdCB0aGUgbW9kdWxlIGludG8gdGhlIEJ1biBwbHVnaW4gc3lzdGVtXG4gICAgQnVuLnBsdWdpbih7XG4gICAgICBuYW1lOiBgc2VyZW5pdHlqcy5wbHVnaW4uJHtuYW1lfWAsXG4gICAgICBzZXR1cChidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIubW9kdWxlKG5hbWUsICgpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXhwb3J0czogbW9kdWxlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgbG9hZGVyOiBcIm9iamVjdFwiXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGlwZWxpbmUsIERlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMgfTtcbiIsICJpbXBvcnQgeyByZWxhdGl2ZSB9IGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFdvcmxkIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi4vcGlwZWxpbmVcIjtcblxuaW1wb3J0IHsgUGx1Z2luQWN0aW9uc0VudW0sIFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vZW51bVwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQsIHBpcGVsaW5lOiBQaXBlbGluZSkgPT4ge1xuICB3b3JsZC5jb21tYW5kUGFsZXR0ZS5yZWdpc3RlcihcbiAgICBcInBsdWdpbnNcIixcbiAgICBcIkludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgb2YgdGhlIHNlcnZlclwiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbnMgPSBbXCJzZXJlbml0eS5vcGVyYXRvclwiXTtcblxuICAgICAgLy8gT3ZlcmxvYWQgZm9yIGxpc3RpbmcgdGhlIHBsdWdpbnNcbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bVxuICAgICAgICB9LFxuICAgICAgICAoeyBhY3Rpb24gfSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgbGlzdFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcImxpc3RcIikgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBpcGVsaW5lIGhhcyBubyBwbHVnaW5zXG4gICAgICAgICAgaWYgKHBpcGVsaW5lLnBsdWdpbnMuc2l6ZSA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwiwqdjVGhlcmUgYXJlIGN1cnJlbnQgbm8gcGx1Z2lucyBsb2FkZWQgb24gdGhlIHNlcnZlci5cIlxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2lucyBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbnMgPSBbLi4ucGlwZWxpbmUucGx1Z2lucy52YWx1ZXMoKV07XG5cbiAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFtdO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBwbHVnaW5zXG4gICAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIG5hbWUgdG8gdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIG1lc3NhZ2UucHVzaChgwqd1JHtwbHVnaW4uaWRlbnRpZmllcn0gdiR7cGx1Z2luLnZlcnNpb259wqdyYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGDCpzdBY3RpdmUgUGx1Z2lucyAoJHtwbHVnaW5zLmxlbmd0aH0pOsKnciAke21lc3NhZ2Uuam9pbihcIsKnNyzCp3IgXCIpfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIGFjdGlvbjogUGx1Z2luQWN0aW9uc0VudW0sXG4gICAgICAgICAgcGx1Z2luOiBQbHVnaW5zRW51bVxuICAgICAgICB9LFxuICAgICAgICAoeyBhY3Rpb24sIHBsdWdpbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyByZWxvYWRcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCAhPT0gXCJyZWxvYWRcIiAmJiBhY3Rpb24ucmVzdWx0ICE9PSBcImJ1bmRsZVwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbkluc3RhbmNlID0gcGlwZWxpbmUucGx1Z2lucy5nZXQocGx1Z2luLnJlc3VsdCBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBub3QgZm91bmRcbiAgICAgICAgICBpZiAoIXBsdWdpbkluc3RhbmNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gJHtwbHVnaW4ucmVzdWx0fSBpcyBub3QgZm91bmQuYCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ID09PSBcInJlbG9hZFwiKSB7XG4gICAgICAgICAgICAvLyBSZWxvYWQgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUucmVsb2FkKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IHJlbG9hZGVkIMKnMiR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn3Cp2EuYFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBsdWdpbkluc3RhbmNlLmlzQnVuZGxlZClcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGJ1bmRsZWRcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBQbHVnaW4gJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfSBjYW5ub3QgYmUgYnVuZGxlZCwgYXMgaXQgaXMgYWxyZWFkeSBhIGJ1bmRsZWQgcGx1Z2luLmBcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gQnVuZGxlIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIHBpcGVsaW5lLmJ1bmRsZShwbHVnaW5JbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogYMKnYVN1Y2Nlc3NmdWxseSBidW5kbGVkIMKnMiR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn3Cp2EsIG91dHB1dCBmaWxlIHdhcyBwbGFjZWQgYXQgwqc3JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwaXBlbGluZS5wYXRoKX3Cp2EuYFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBvdmVybG9hZCBtYXRjaGVkIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXCIpO1xuICAgIH1cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IEN1c3RvbUVudW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5zRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInBsdWdpbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbmNsYXNzIFBsdWdpbkFjdGlvbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luX2FjdGlvbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW1wibGlzdFwiLCBcInJlbG9hZFwiLCBcImJ1bmRsZVwiXTtcbn1cblxuZXhwb3J0IHsgUGx1Z2luc0VudW0sIFBsdWdpbkFjdGlvbnNFbnVtIH07XG4iLCAiZW51bSBQbHVnaW5IZWFkZXIge1xuICBIYXNOb1Jlc291cmNlcyA9IDIsXG4gIEhhc1Jlc291cmNlcyA9IDNcbn1cblxuZXhwb3J0IHsgUGx1Z2luSGVhZGVyIH07XG4iLCAiLyoqXG4gKiBUaGUgcHJpb3JpdHkgb2YgYSBwbHVnaW4gZGV0ZXJtaW5lcyB3aGVuIGl0IHdpbGwgYmUgbG9hZGVkIGluIHJlbGF0aW9uIHRvIG90aGVyIHBsdWdpbnMuXG4gKiBBIHBsdWdpbiB3aXRoIGEgaGlnaGVyIHByaW9yaXR5IHdpbGwgYmUgbG9hZGVkIGJlZm9yZSBhIHBsdWdpbiB3aXRoIGEgbG93ZXIgcHJpb3JpdHkuXG4gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IG5lZWQgdG8gYmUgbG9hZGVkIGJlZm9yZSBvciBhZnRlciBvdGhlciBwbHVnaW5zLlxuICogRm9yIGV4YW1wbGUsIGEgbGlicmFyeSBwbHVnaW4gbWF5IG5lZWQgdG8gYmUgbG9hZGVkIGJlZm9yZSBhIHBsdWdpbiB0aGF0IHVzZXMgaXQsXG4gKiBvciBhIHBsdWdpbiB0aGF0IG1vZGlmaWVzIHRoZSBiZWhhdmlvciBvZiBzZXJlbml0eSdzIEFQSXMgbWF5IG5lZWQgdG8gYmUgbG9hZGVkIGFmdGVyIGl0LlxuICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgTm9ybWFsLlxuICovXG5lbnVtIFBsdWdpblByaW9yaXR5IHtcbiAgLyoqXG4gICAqIEEgbG93IHByaW9yaXR5IHBsdWdpbiB3aWxsIGJlIGxvYWRlZCBhZnRlciBvdGhlciBwbHVnaW5zLlxuICAgKiBVc2VmdWwgZm9yIHJlYWN0aW5nIHRvIGNoYW5nZXMgb3IgZmluYWwgYWRqdXN0bWVudHMuXG4gICAqL1xuICBMb3csXG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHByaW9yaXR5IGZvciBhIHBsdWdpbi5cbiAgICogU3VpdGFibGUgZm9yIHN0YW5kYXJkIHBsdWdpbiBiZWhhdmlvci5cbiAgICovXG4gIE5vcm1hbCxcblxuICAvKipcbiAgICogQSBoaWdoIHByaW9yaXR5IHBsdWdpbiB3aWxsIGJlIGxvYWRlZCBiZWZvcmUgb3RoZXIgcGx1Z2lucy5cbiAgICogVXNlZnVsIGZvciBlYXJseSBzZXR1cCBvciBvdmVycmlkaW5nIGJlaGF2aW9yLlxuICAgKi9cbiAgSGlnaFxufVxuXG5leHBvcnQgeyBQbHVnaW5Qcmlvcml0eSB9O1xuIiwgIi8qKlxuICogVGhlIHBsdWdpbiB0eXBlIGRlY2xhcmVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgcGx1Z2luLlxuICovXG5lbnVtIFBsdWdpblR5cGUge1xuICAvKipcbiAgICogQW4gYWRkb24gcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aG91dCBhbiBleHBvc2VkIEFQSS5cbiAgICovXG4gIEFkZG9uLFxuXG4gIC8qKlxuICAgKiBBbiBBUEkgcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aCBhbiBleHBvc2VkIEFQSSBmb3Igb3RoZXIgcGx1Z2lucyB0byB1c2UuXG4gICAqL1xuICBBcGlcbn1cblxuZXhwb3J0IHsgUGx1Z2luVHlwZSB9O1xuIiwgImltcG9ydCB7IFJlc291cmNlUGFjaywgU2VyZW5pdHkgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSBcIkBzZXJlbml0eWpzL2VtaXR0ZXJcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi9waXBlbGluZVwiO1xuaW1wb3J0IHsgUGx1Z2luRXZlbnRzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIFBsdWdpbkJsb2NrUmVnaXN0cnksXG4gIFBsdWdpbkVudGl0eVJlZ2lzdHJ5LFxuICBQbHVnaW5JdGVtUmVnaXN0cnlcbn0gZnJvbSBcIi4vcmVnaXN0cnlcIjtcbmltcG9ydCB7IFBsdWdpblByaW9yaXR5IH0gZnJvbSBcIi4vZW51bXMvcHJpb3JpdHlcIjtcblxuaW50ZXJmYWNlIFBsdWdpbk9wdGlvbnMgZXh0ZW5kcyBQYXJ0aWFsPFBsdWdpbkV2ZW50cz4ge1xuICAvKipcbiAgICogVGhlIGxvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIGxvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHJpb3JpdHk6IFBsdWdpblByaW9yaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgbGlzdGVuZXJzIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgbWF4TGlzdGVuZXJzOiBudW1iZXI7XG59XG5cbi8qKlxuICogIyBJbnRyb2R1Y3Rpb25cbiAqIFBsdWdpbnMgYXJlIHRoZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3Mgb2YgU2VyZW5pdHlKUy5cbiAqIFRoZXkgYXJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aGljaCBhbGxvd3MgdG90YWwgY29udHJvbCBvdmVyIHRoZSBzZXJ2ZXIuXG4gKlxuICogVGhlcmUgYXJlIDIgdHlwZXMgb2YgcGx1Z2lucyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBgUGx1Z2luVHlwZWAgZW51bTogYEFkZG9uYCAmIGBBcGlgXG4gKlxuICogQWRkb24gcGx1Z2lucyBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGhvdXQgYW4gZXhwb3NlZCBBUEkuIFRoaXMgbWVhbnMgZXh0ZXJuYWwgcGx1Z2lucyBjYW5ub3QgZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBBUEkuXG4gKiBBcGkgcGx1Z2lucyBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGggYW4gZXhwb3NlZCBBUEkgZm9yIG90aGVyIHBsdWdpbnMgdG8gdXNlLiBUaGlzIG1lYW5zIGV4dGVybmFsIHBsdWdpbnMgY2FuIGRpcmVjdGx5IGludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgQVBJLlxuICpcbiAqICMjIENsYXNzIEV4dGVuZGluZyBQbHVnaW5cbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBQbHVnaW4sIFBsdWdpblR5cGUsIFBsdWdpbkV2ZW50cyB9IGZyb20gXCJAc2VyZW5pdHlqcy9wbHVnaW5zXCI7XG4gKlxuICogY2xhc3MgU2FtcGxlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAqICAgcHVibGljIHJlYWRvbmx5IHR5cGUgPSBQbHVnaW5UeXBlLkFkZG9uO1xuICpcbiAqICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHN1cGVyKFwic2FtcGxlLXBsdWdpblwiLCBcIjEuMC4wXCIpO1xuICogICB9XG4gKlxuICogICBwdWJsaWMgb25Jbml0aWFsaXplKCk6IHZvaWQge31cbiAqXG4gKiAgIHB1YmxpYyBvblN0YXJ0VXAoKTogdm9pZCB7fVxuICpcbiAqICAgcHVibGljIG9uU2h1dERvd24oKTogdm9pZCB7fVxuICogfVxuICpcbiAqIGV4cG9ydCBkZWZhdWx0IG5ldyBTYW1wbGVQbHVnaW4oKTtcbiAqIGBgYFxuICovXG5jbGFzcyBQbHVnaW48VCA9IHVua25vd24+IGV4dGVuZHMgRW1pdHRlcjxUPiBpbXBsZW1lbnRzIFBsdWdpbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJpb3JpdHkgb2YgdGhlIHBsdWdpbi5cbiAgICogQG5vdGUgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgb3JkZXIgaW4gd2hpY2ggcGx1Z2lucyBhcmUgbG9hZGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByaW9yaXR5OiBQbHVnaW5Qcmlvcml0eSA9IFBsdWdpblByaW9yaXR5Lk5vcm1hbDtcblxuICAvKipcbiAgICogVGhlIGJsb2NrIHJlZ2lzdHJ5IGZvciB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzL3RyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJsb2NrcyA9IG5ldyBQbHVnaW5CbG9ja1JlZ2lzdHJ5KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBpdGVtIHJlZ2lzdHJ5IGZvciB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzL3RyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGl0ZW1zID0gbmV3IFBsdWdpbkl0ZW1SZWdpc3RyeSgpO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHJlZ2lzdHJ5IGZvciB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzL3RyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0aWVzID0gbmV3IFBsdWdpbkVudGl0eVJlZ2lzdHJ5KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlcyA9IG5ldyBTZXQ8UmVzb3VyY2VQYWNrPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2luLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGF0aCE6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsdWdpbiBpcyBidW5kbGVkLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgaXNCdW5kbGVkITogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwaXBlbGluZSB0aGUgcGx1Z2luIGlzIGluLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGlwZWxpbmUhOiBQaXBlbGluZTtcblxuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IGluc3RhbmNlIG9mIHRoZSBzZXJ2ZXIuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBzZXJlbml0eSE6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcGx1Z2luIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICB2ZXJzaW9uOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8UGx1Z2luT3B0aW9ucz5cbiAgKSB7XG4gICAgLy8gQ2FsbCB0aGUgc3VwZXIgbWV0aG9kIHdpdGggdGhlIG1heCBsaXN0ZW5lcnNcbiAgICBzdXBlcihvcHRpb25zPy5tYXhMaXN0ZW5lcnMpO1xuXG4gICAgLy8gU2V0IHRoZSBpZGVudGlmaWVyIGFuZCB2ZXJzaW9uIG9mIHRoZSBwbHVnaW5cbiAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICAvLyBTZXQgdGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpblxuICAgIHRoaXMubG9nZ2VyID1cbiAgICAgIG9wdGlvbnM/LmxvZ2dlciA/P1xuICAgICAgbmV3IExvZ2dlcihgJHtpZGVudGlmaWVyfUAke3ZlcnNpb259YCwgTG9nZ2VyQ29sb3JzLkJsdWUpO1xuXG4gICAgLy8gU2V0IHRoZSBvbiBpbml0aWFsaXplLCBzdGFydCB1cCwgYW5kIHNodXQgZG93biBvcHRpb25zXG4gICAgaWYgKG9wdGlvbnM/Lm9uSW5pdGlhbGl6ZSkgdGhpcy5vbkluaXRpYWxpemUgPSBvcHRpb25zLm9uSW5pdGlhbGl6ZTtcbiAgICBpZiAob3B0aW9ucz8ub25TdGFydFVwKSB0aGlzLm9uU3RhcnRVcCA9IG9wdGlvbnMub25TdGFydFVwO1xuICAgIGlmIChvcHRpb25zPy5vblNodXREb3duKSB0aGlzLm9uU2h1dERvd24gPSBvcHRpb25zLm9uU2h1dERvd247XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIHBsdWdpbiBieSBpdHMgaWRlbnRpZmllclxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luIHRvIHJlc29sdmUuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaW5zdGFuY2UgaWYgZm91bmQsIG90aGVyd2lzZSBudWxsLlxuICAgKi9cbiAgcHVibGljIHJlc29sdmU8VCBleHRlbmRzIFBsdWdpbj4oaWRlbnRpZmllcjogc3RyaW5nKTogVCB8IG51bGwge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwaXBlbGluZSBpcyBkZWZpbmVkLlxuICAgIGlmICghdGhpcy5waXBlbGluZSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBHZXQgdGhlIHBsdWdpbiBmcm9tIHRoZSBwaXBlbGluZVxuICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMucGlwZWxpbmUucGx1Z2lucy5nZXQoaWRlbnRpZmllcik7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGRlZmluZWRcbiAgICBpZiAoIXBsdWdpbikgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHBsdWdpblxuICAgIHJldHVybiBwbHVnaW4gYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgaW5pdGlhbGl6ZWQuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uSW5pdGlhbGl6ZShfcGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgc3RhcnRlZCB1cC5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHN0YXJ0ZWQgdXAuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU3RhcnRVcChfcGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgc2h1dCBkb3duLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgc2h1dCBkb3duLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblNodXREb3duKF9wbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luLCBQbHVnaW5PcHRpb25zIH07XG4iLCAiaW1wb3J0IHsgdHlwZSBCbG9ja1RyYWl0LCBDdXN0b21CbG9ja1R5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5CbG9ja1JlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBibG9jayB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21CbG9ja1R5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBibG9jayB0cmFpdHMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHM6IEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBibG9jayB0eXBlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21CbG9ja1R5cGU+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHlwZSB0byB0aGUgdHlwZXMgYXJyYXkuXG4gICAgdGhpcy50eXBlcy5wdXNoKC4uLnR5cGVzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gYmxvY2sgdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUeXBlKHR5cGU6IEN1c3RvbUJsb2NrVHlwZSk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSB0eXBlcyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHlwZXMuaW5kZXhPZih0eXBlKTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSB0eXBlc1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHlwZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gYmxvY2sgdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUcmFpdCguLi50cmFpdHM6IEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGJsb2NrIHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgQmxvY2tUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5CbG9ja1JlZ2lzdHJ5IH07XG4iLCAiaW1wb3J0IHsgdHlwZSBJdGVtU3RhY2tUcmFpdCwgQ3VzdG9tSXRlbVR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5JdGVtUmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGl0ZW0gdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tSXRlbVR5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBpdGVtIHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEl0ZW1TdGFja1RyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGl0ZW0gdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21JdGVtVHlwZT4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0eXBlIHRvIHRoZSB0eXBlcyBhcnJheS5cbiAgICB0aGlzLnR5cGVzLnB1c2goLi4udHlwZXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGl0ZW0gdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclR5cGUodHlwZTogQ3VzdG9tSXRlbVR5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gaXRlbSB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgSXRlbVN0YWNrVHJhaXQ+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHRyYWl0cyBhcnJheS5cbiAgICB0aGlzLnRyYWl0cy5wdXNoKC4uLnRyYWl0cyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBpdGVtIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBpdGVtIHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHJhaXQodHJhaXQ6IHR5cGVvZiBJdGVtU3RhY2tUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5JdGVtUmVnaXN0cnkgfTtcbiIsICJpbXBvcnQgeyB0eXBlIEVudGl0eVRyYWl0LCBDdXN0b21FbnRpdHlUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luRW50aXR5UmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGVudGl0eSB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21FbnRpdHlUeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gZW50aXR5IHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gZW50aXR5IHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21FbnRpdHlUeXBlPik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHR5cGUgdG8gdGhlIHR5cGVzIGFycmF5LlxuICAgIHRoaXMudHlwZXMucHVzaCguLi50eXBlcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBlbnRpdHkgdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHlwZSh0eXBlOiBDdXN0b21FbnRpdHlUeXBlKTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIHR5cGVzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50eXBlcy5pbmRleE9mKHR5cGUpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0eXBlIGZyb20gdGhlIHR5cGVzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50eXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gZW50aXR5IHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRyYWl0KC4uLnRyYWl0czogQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBlbnRpdHkgdHJhaXQgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgRW50aXR5VHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luRW50aXR5UmVnaXN0cnkgfTtcbiJdLAogICJtYXBwaW5ncyI6ICI0ZEFBQSxJQUFBQSxFQUFBLEdBQUFDLEVBQUFELEVBQUEsK0JBQUFFLEVBQUEsYUFBQUMsRUFBQSxXQUFBQyxFQUFBLGlCQUFBQyxFQUFBLG1CQUFBQyxFQUFBLGVBQUFDLElBQUEsZUFBQUMsRUFBQVIsR0NDQSxJQUFBUyxFQU9PLGNBQ1BDLEVBQWtDLGdCQUNsQ0MsRUFBeUMsZ0JBRXpDQyxFQUFxQyw4QkFDckNDLEVBQWtELDRCQUNsREMsRUFBNkIsb0NDZDdCLElBQUFDLEVBQXlCLGdCQ0F6QixJQUFBQyxFQUEyQiw0QkFFM0IsSUFBTUMsRUFBTixjQUEwQkMsWUFBQUEsQ0FGMUIsTUFFMEJBLENBQUFBLEVBQUFBLG9CQUN4QixPQUF1QkMsV0FBYSxVQUNwQyxPQUF1QkMsUUFBeUIsQ0FBQSxDQUNsRCxFQUVNQyxFQUFOLGNBQWdDSCxZQUFBQSxDQVBoQyxNQU9nQ0EsQ0FBQUEsRUFBQUEsMEJBQzlCLE9BQXVCQyxXQUFhLGlCQUNwQyxPQUF1QkMsUUFBeUIsQ0FBQyxPQUFRLFNBQVUsU0FDckUsRURGQSxJQUFNRSxFQUFXQyxFQUFBLENBQUNDLEVBQWNDLElBQUFBLENBQzlCRCxFQUFNRSxlQUFlSixTQUNuQixVQUNBLDBDQUNDSyxHQUFBQSxDQUVDQSxFQUFTQyxZQUFjLENBQUMscUJBR3hCRCxFQUFTRSxTQUNQLENBQ0VDLE9BQVFDLENBQ1YsRUFDQSxDQUFDLENBQUVELE9BQUFBLENBQU0s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ZUFBYUMsSUFBSSxFQUd0REosR0FBU0ssZUFBYyxLQUFLQSxhQUFlTCxFQUFRSyxjQUNuREwsR0FBU00sWUFBVyxLQUFLQSxVQUFZTixFQUFRTSxXQUM3Q04sR0FBU08sYUFBWSxLQUFLQSxXQUFhUCxFQUFRTyxXQUNyRCxDQU9PQyxRQUEwQjFCLEVBQThCLENBRTdELEdBQUksQ0FBQyxLQUFLZ0IsU0FBVSxPQUFPLEtBRzNCLElBQU1XLEVBQVMsS0FBS1gsU0FBU1ksUUFBUUMsSUFBSTdCLENBQUFBLEVBR3pDLE9BQUsyQixHQUFlLElBSXRCLENBTU9KLGFBQWFPLEVBQXVCLENBRTNDLENBTU9OLFVBQVVNLEVBQXVCLENBRXhDLENBTU9MLFdBQVdLLEVBQXVCLENBRXpDLENBQ0YiLAogICJuYW1lcyI6IFsiaW5kZXhfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgIlBpcGVsaW5lIiwgIlBsdWdpbiIsICJQbHVnaW5IZWFkZXIiLCAiUGx1Z2luUHJpb3JpdHkiLCAiUGx1Z2luVHlwZSIsICJfX3RvQ29tbW9uSlMiLCAiaW1wb3J0X25vZGVfZnMiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJpbXBvcnRfbm9kZV96bGliIiwgImltcG9ydF9sb2dnZXIiLCAiaW1wb3J0X2NvcmUiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJpbXBvcnRfcGF0aCIsICJpbXBvcnRfY29yZSIsICJQbHVnaW5zRW51bSIsICJDdXN0b21FbnVtIiwgImlkZW50aWZpZXIiLCAib3B0aW9ucyIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZWdpc3RlciIsICJfX25hbWUiLCAid29ybGQiLCAicGlwZWxpbmUiLCAiY29tbWFuZFBhbGV0dGUiLCAicmVnaXN0cnkiLCAicGVybWlzc2lvbnMiLCAib3ZlcmxvYWQiLCAiYWN0aW9uIiwgIlBsdWdpbkFjdGlvbnNFbnVtIiwgInJlc3VsdCIsICJwbHVnaW5zIiwgInNpemUiLCAibWVzc2FnZSIsICJ2YWx1ZXMiLCAicGx1Z2luIiwgInB1c2giLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxlbmd0aCIsICJqb2luIiwgIlBsdWdpbnNFbnVtIiwgInBsdWdpbkluc3RhbmNlIiwgImdldCIsICJFcnJvciIsICJyZWxvYWQiLCAiaXNCdW5kbGVkIiwgImJ1bmRsZSIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImN3ZCIsICJwYXRoIiwgImNvbW1hbmRfZGVmYXVsdCIsICJQbHVnaW5IZWFkZXIiLCAiUGx1Z2luUHJpb3JpdHkiLCAiUGx1Z2luVHlwZSIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgInBhdGgiLCAiY29tbWFuZHMiLCAiaW5pdGlhbGl6ZSIsICJQaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgImxvZ2dlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIk1hdGVyaWFsTGFwaXMiLCAicGx1Z2lucyIsICJNYXAiLCAidGVtcFBhdGhzIiwgIlNldCIsICJlc20iLCAibW9kdWxlIiwgImV4cG9ydHMiLCAiXyIsICJFcnJvciIsICJvbiIsICJTZXJ2ZXJFdmVudCIsICJTdGFydCIsICJzdGFydCIsICJiaW5kIiwgIlN0b3AiLCAic3RvcCIsICJXb3JsZEV2ZW50IiwgIldvcmxkSW5pdGlhbGl6ZSIsICJ3b3JsZCIsICJDb21tYW5kIiwgInBsdWdpbiIsICJibG9ja1BhbGV0dGUiLCAicmVnaXN0ZXJUeXBlIiwgImJsb2NrcyIsICJ0eXBlcyIsICJyZWdpc3RlclRyYWl0IiwgInRyYWl0cyIsICJpdGVtUGFsZXR0ZSIsICJpdGVtcyIsICJlbnRpdHlQYWxldHRlIiwgImVudGl0aWVzIiwgImV4aXN0c1N5bmMiLCAicmVzb2x2ZSIsICJta2RpclN5bmMiLCAicmVjdXJzaXZlIiwgImJ1bmRsZXMiLCAicmVhZGRpclN5bmMiLCAid2l0aEZpbGVUeXBlcyIsICJmaWx0ZXIiLCAiZGlyZW50IiwgImlzRmlsZSIsICJuYW1lIiwgImVuZHNXaXRoIiwgIm9yZGVyZWRQbHVnaW5zIiwgImJ1bmRsZSIsICJidWZmZXIiLCAiaW5mbGF0ZVN5bmMiLCAicmVhZEZpbGVTeW5jIiwgInN0cmVhbSIsICJCaW5hcnlTdHJlYW0iLCAicmVhZEJ5dGUiLCAidHlwZSIsICJQbHVnaW5IZWFkZXIiLCAiSGFzTm9SZXNvdXJjZXMiLCAibGVuZ3RoIiwgInJlYWRWYXJJbnQiLCAiaW5kZXgiLCAicmVhZEJ1ZmZlciIsICJ0b1N0cmluZyIsICJsb2FkRnJvbVRleHRTb3VyY2UiLCAicHVzaCIsICJIYXNSZXNvdXJjZXMiLCAicmVzb3VyY2VzIiwgImkiLCAicmVzb3VyY2UiLCAibG9hZEZyb21aaXAiLCAic3VjY2VzcyIsICJ1dWlkIiwgImFkZCIsICJyZWFzb24iLCAiZXJyb3IiLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAiaWRlbnRpZmllciIsICJQbHVnaW5UeXBlIiwgIkFkZG9uIiwgIndhcm4iLCAicmVhZFJlbWFpbmluZ0J1ZmZlciIsICJBcGkiLCAiZGlyZWN0b3JpZXMiLCAiaXNEaXJlY3RvcnkiLCAiZGlyZWN0b3J5IiwgIm1hbmlmZXN0IiwgIkpTT04iLCAicGFyc2UiLCAibWFpbiIsICJ2ZXJzaW9uIiwgInJlcXVpcmUiLCAiZGVmYXVsdCIsICJoYXMiLCAicGlwZWxpbmUiLCAiaXNCdW5kbGVkIiwgImxpbmtNb2R1bGUiLCAic2V0IiwgIlBsdWdpbnNFbnVtIiwgIm9wdGlvbnMiLCAicGFjayIsICJsb2FkRnJvbVBhdGgiLCAic29ydCIsICJhIiwgImIiLCAicHJpb3JpdHkiLCAib25Jbml0aWFsaXplIiwgImJpbmRFdmVudHMiLCAidmFsdWVzIiwgIm9uU3RhcnRVcCIsICJvblNodXREb3duIiwgInRlbXBQYXRoIiwgInVubGlua1N5bmMiLCAic291cmNlIiwgIndyaXRlRmlsZVN5bmMiLCAic2xpY2UiLCAicmVsb2FkIiwgImRlbGV0ZSIsICJjYWNoZSIsICJyZW1vdmVQYXRoIiwgInBhY2tzIiwgIm5ld1BsdWdpbiIsICJoZWFkZXIiLCAic2l6ZSIsICJ3cml0ZUJ5dGUiLCAid3JpdGVWYXJJbnQiLCAiYnl0ZUxlbmd0aCIsICJ3cml0ZUJ1ZmZlciIsICJkZWZsYXRlU3luYyIsICJnZXRCdWZmZXIiLCAiY29tcHJlc3MiLCAicHJvdG90eXBlIiwgIk9iamVjdCIsICJnZXRQcm90b3R5cGVPZiIsICJwbHVnaW5LZXlzIiwgImdldE93blByb3BlcnR5TmFtZXMiLCAiZXZlbnRLZXlzIiwgImtleXMiLCAiZXZlbnRLZXkiLCAiaW5kZXhPZiIsICJpbmNsdWRlcyIsICJ2YWx1ZSIsICJiZWZvcmUiLCAiYWZ0ZXIiLCAidmVyc2lvbnMiLCAiYnVuIiwgInVuZGVmaW5lZCIsICJCdW4iLCAic2V0dXAiLCAiYnVpbGRlciIsICJsb2FkZXIiLCAiaW1wb3J0X2xvZ2dlciIsICJpbXBvcnRfZW1pdHRlciIsICJQbHVnaW5CbG9ja1JlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbkl0ZW1SZWdpc3RyeSIsICJ0eXBlcyIsICJ0cmFpdHMiLCAicmVnaXN0ZXJUeXBlIiwgInB1c2giLCAidW5yZWdpc3RlclR5cGUiLCAidHlwZSIsICJpbmRleCIsICJpbmRleE9mIiwgInNwbGljZSIsICJyZWdpc3RlclRyYWl0IiwgInVucmVnaXN0ZXJUcmFpdCIsICJ0cmFpdCIsICJQbHVnaW5FbnRpdHlSZWdpc3RyeSIsICJ0eXBlcyIsICJ0cmFpdHMiLCAicmVnaXN0ZXJUeXBlIiwgInB1c2giLCAidW5yZWdpc3RlclR5cGUiLCAidHlwZSIsICJpbmRleCIsICJpbmRleE9mIiwgInNwbGljZSIsICJyZWdpc3RlclRyYWl0IiwgInVucmVnaXN0ZXJUcmFpdCIsICJ0cmFpdCIsICJQbHVnaW4iLCAiRW1pdHRlciIsICJpZGVudGlmaWVyIiwgInZlcnNpb24iLCAibG9nZ2VyIiwgInByaW9yaXR5IiwgIlBsdWdpblByaW9yaXR5IiwgIk5vcm1hbCIsICJibG9ja3MiLCAiUGx1Z2luQmxvY2tSZWdpc3RyeSIsICJpdGVtcyIsICJQbHVnaW5JdGVtUmVnaXN0cnkiLCAiZW50aXRpZXMiLCAiUGx1Z2luRW50aXR5UmVnaXN0cnkiLCAicmVzb3VyY2VzIiwgIlNldCIsICJwYXRoIiwgImlzQnVuZGxlZCIsICJwaXBlbGluZSIsICJzZXJlbml0eSIsICJvcHRpb25zIiwgIm1heExpc3RlbmVycyIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIkJsdWUiLCAib25Jbml0aWFsaXplIiwgIm9uU3RhcnRVcCIsICJvblNodXREb3duIiwgInJlc29sdmUiLCAicGx1Z2luIiwgInBsdWdpbnMiLCAiZ2V0IiwgIl9wbHVnaW4iXQp9Cg==
1
+ "use strict";var v=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var f=(a,e)=>v(a,"name",{value:e,configurable:!0});var M=(a,e)=>{for(var t in e)v(a,t,{get:e[t],enumerable:!0})},q=(a,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of U(e))!D.call(a,n)&&n!==t&&v(a,n,{get:()=>e[n],enumerable:!(o=j(e,n))||o.enumerable});return a};var C=a=>q(v({},"__esModule",{value:!0}),a);var Z={};M(Z,{DefaultPipelineProperties:()=>O,Pipeline:()=>W,Plugin:()=>J,PluginHeader:()=>m,PluginPriority:()=>S,PluginType:()=>k});module.exports=C(Z);var l=require("fs"),s=require("path"),x=require("zlib"),B=require("@serenityjs/logger"),w=require("@serenityjs/core"),$=require("@serenityjs/binarystream");var z=require("path");var E=require("@serenityjs/core");var y=class extends E.CustomEnum{static{f(this,"PluginsEnum")}static identifier="plugins";static options=[]},R=class extends E.CustomEnum{static{f(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var K=f((a,e)=>{a.commandPalette.register("plugins","Interact with the plugins of the server",t=>{t.permissions=["serenity.operator"],t.overload({action:R},({action:o})=>{if(o.result!=="list")return;if(e.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let n=[...e.plugins.values()],i=[];for(let r of n)i.push(`\xA7u${r.identifier} v${r.version}\xA7r`);return{message:`\xA77Active Plugins (${n.length}):\xA7r ${i.join("\xA77,\xA7r ")}`}}),t.overload({action:R,plugin:y},({action:o,plugin:n})=>{if(o.result!=="reload"&&o.result!=="bundle")return;let i=e.plugins.get(n.result);if(!i)throw new Error(`Plugin ${n.result} is not found.`);if(o.result==="reload")return e.reload(i),{message:`\xA7aSuccessfully reloaded \xA72${i.identifier}\xA7a.`};if(i.isBundled)throw new Error(`Plugin ${i.identifier} cannot be bundled, as it is already a bundled plugin.`);return e.bundle(i),{message:`\xA7aSuccessfully bundled \xA72${i.identifier}\xA7a, output file was placed at \xA77${(0,z.relative)(process.cwd(),e.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),L=K;var m=function(a){return a[a.HasNoResources=2]="HasNoResources",a[a.HasResources=3]="HasResources",a}(m||{});var S=function(a){return a[a.Low=0]="Low",a[a.Normal=1]="Normal",a[a.High=2]="High",a}(S||{});var k=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(k||{});var O={path:"./plugins",commands:!0,initialize:!0},W=class{static{f(this,"Pipeline")}serenity;properties;logger=new B.Logger("Plugins",B.LoggerColors.MaterialLapis);plugins=new Map;esm=typeof module<"u"&&module?.exports!==exports;get path(){return this.properties.path}set path(e){throw new Error("The path property is read-only.")}constructor(e,t){this.serenity=e,this.properties={...O,...t},e.on(w.ServerEvent.Start,this.start.bind(this)),e.on(w.ServerEvent.Stop,this.stop.bind(this)),e.on(w.WorldEvent.WorldInitialize,({world:o})=>{this.properties.commands&&L(o,this);for(let[,n]of this.plugins)o.blockPalette.registerType(...n.blocks.types).registerTrait(...n.blocks.traits),o.itemPalette.registerType(...n.items.types).registerTrait(...n.items.traits),o.entityPalette.registerType(...n.entities.types).registerTrait(...n.entities.traits)}),this.properties.initialize&&this.initialize()}initialize(){(0,l.existsSync)((0,s.resolve)(this.path))||(0,l.mkdirSync)((0,s.resolve)(this.path),{recursive:!0});let t=(0,l.readdirSync)((0,s.resolve)(this.path),{withFileTypes:!0}).filter(i=>i.isFile()?i.name.endsWith(".plugin"):!1),o=[];for(let i of t)try{let r=(0,s.resolve)(this.path,i.name),p=(0,x.inflateSync)((0,l.readFileSync)(r)),u=new $.BinaryStream(p);switch(u.readByte()){case m.HasNoResources:{let c=u.readVarInt(),h=u.readBuffer(c).toString("utf-8"),d=this.loadFromTextSource(r,h,!0);d&&o.push(d);break}case m.HasResources:{let c=u.readVarInt(),h=u.readBuffer(c).toString("utf-8"),d=this.loadFromTextSource(r,h,!0);if(!d)break;o.push(d);let g=u.readVarInt();for(let F=0;F<g;F++)try{let T=u.readVarInt(),_=u.readBuffer(T),I=this.serenity.resources.loadFromZip(_);d.logger.success(`Loaded resource pack \xA7u${I.name}\xA7r (\xA78${I.uuid}\xA7r).`),d.resources.add(I)}catch(T){this.logger.error(`Failed to load resource pack \xA78${(0,s.relative)(process.cwd(),(0,s.resolve)(this.path,i.name))}\xA7r for plugin \xA71${d.identifier}\xA7r.`,T)}break}case k.Addon:{this.logger.warn(`The plugin \xA71${(0,s.relative)(process.cwd(),(0,s.resolve)(this.path,i.name))}\xA7r is using a deprecated plugin type (Addon). Please update the plugin to use the new plugin system.`);let c=u.readRemainingBuffer().toString("utf-8"),h=this.loadFromTextSource(r,c,!0);h&&o.push(h);break}case k.Api:this.logger.error(`The plugin \xA71${(0,s.relative)(process.cwd(),(0,s.resolve)(this.path,i.name))}\xA7r is using a deprecated plugin type (API). API plugins are no longer supported. Please update the plugin to use the new plugin system.`)}}catch(r){this.logger.error(`Failed to load plugin from "${(0,s.relative)(process.cwd(),(0,s.resolve)(this.path,i.name))}", skipping the plugin.`,r)}let n=(0,l.readdirSync)((0,s.resolve)(this.path),{withFileTypes:!0}).filter(i=>i.isDirectory());for(let i of n)try{let r=(0,s.resolve)(this.path,i.name);if(!(0,l.existsSync)((0,s.resolve)(r,"package.json")))continue;let p=JSON.parse((0,l.readFileSync)((0,s.resolve)(r,"package.json"),"utf-8")),u=(0,s.resolve)(r,p.main);if(!(0,l.existsSync)((0,s.resolve)(r,u))){this.logger.warn(`Unable to load plugin \xA7u${p.name??"unknown-plugin"}\xA78@\xA7u${p.version??"unknown-version"}\xA7r, the main entry path "\xA78${(0,s.relative)(process.cwd(),(0,s.resolve)(r,u))}\xA7r" was not found in the directory.`);continue}let b=require((0,s.resolve)(r,u)),c=b.default;if(this.plugins.has(c.identifier)){this.logger.warn(`Unable to load plugin \xA7u${c.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}c.pipeline=this,c.serenity=this.serenity,c.path=r,c.isBundled=!1,this.linkModule(c.identifier,b),this.plugins.set(c.identifier,c),y.options.push(c.identifier),o.push(c),(0,l.existsSync)((0,s.resolve)(r,"resource_packs"))||(0,l.mkdirSync)((0,s.resolve)(r,"resource_packs"));let h=(0,l.readdirSync)((0,s.resolve)(r,"resource_packs"),{withFileTypes:!0}).filter(d=>d.isDirectory());for(let d of h)try{let g=this.serenity.resources.loadFromPath((0,s.resolve)(r,"resource_packs",d.name));c.logger.success(`Loaded resource pack \xA7u${g.name}\xA7r (\xA78${g.uuid}\xA7r).`),c.resources.add(g)}catch(g){this.logger.error(`Failed to load resource pack \xA78${(0,s.relative)(process.cwd(),(0,s.resolve)(r,"resource_packs",d.name))}\xA7r for plugin \xA71${c.identifier}\xA7r.`,g)}}catch(r){this.logger.error(`Failed to load plugin from "${(0,s.relative)(process.cwd(),(0,s.resolve)(this.path,i.name))}", skipping the plugin.`,r)}o.sort((i,r)=>i.priority!==r.priority?r.priority-i.priority:i.identifier<r.identifier?-1:i.identifier>r.identifier?1:0);for(let i of o)if(i.onInitialize(i),this.bindEvents(i),i.isBundled){let r=(0,s.resolve)(i.path.slice(0,-7).replace(/\./g,"_"));(0,l.existsSync)(r)&&process.nextTick(()=>(0,l.unlinkSync)(r))}}start(){for(let e of this.plugins.values())e.onStartUp(e)}stop(){for(let e of this.plugins.values())e.onShutDown(e)}loadFromTextSource(e,t,o=!1){let n=(0,s.resolve)(e.slice(0,-7).replace(/\./g,"_"));(0,l.writeFileSync)((0,s.resolve)(n),t);try{let i=require((0,s.resolve)(n)),r=i.default;return this.plugins.has(r.identifier)?(this.logger.warn(`Unable to load plugin \xA7u${r.identifier}\xA7r, the plugin is already loaded in the pipeline.`),(0,l.unlinkSync)((0,s.resolve)(n)),null):(r.pipeline=this,r.serenity=this.serenity,r.path=(0,s.resolve)(e),r.isBundled=o,this.linkModule(r.identifier,i),this.plugins.set(r.identifier,r),y.options.push(r.identifier),r)}catch(i){this.logger.error(`Failed to load plugin from \xA78${(0,s.relative)(process.cwd(),e)}\xA7r, skipping the plugin.`,i),(0,l.unlinkSync)((0,s.resolve)(n))}return null}reload(e){e.onShutDown(e),this.plugins.delete(e.identifier);let t=e.path;delete require.cache[require.resolve(t)],this.serenity.removePath(t);for(let o of e.resources)this.serenity.resources.packs.delete(o.uuid);if(e.isBundled){let o=(0,x.inflateSync)((0,l.readFileSync)(t)),n=new $.BinaryStream(o);switch(n.readByte()){case m.HasNoResources:{let r=n.readVarInt(),p=n.readBuffer(r).toString("utf-8"),u=this.loadFromTextSource(t,p,!0);if(!u)break;u.onInitialize(u),this.bindEvents(u),u.onStartUp(u);break}case m.HasResources:{let r=n.readVarInt(),p=n.readBuffer(r).toString("utf-8"),u=this.loadFromTextSource(t,p,!0);if(!u)break;u.onInitialize(u),this.bindEvents(u),u.onStartUp(u);let b=n.readVarInt();for(let c=0;c<b;c++)try{let h=n.readVarInt(),d=n.readBuffer(h),g=this.serenity.resources.loadFromZip(d);u.logger.success(`Loaded resource pack \xA7u${g.name}\xA7r (\xA78${g.uuid}\xA7r).`),u.resources.add(g)}catch(h){this.logger.error(`Failed to load resource pack \xA78${(0,s.relative)(process.cwd(),(0,s.resolve)(this.path,t))}\xA7r for plugin \xA71${u.identifier}\xA7r.`,h)}}}}else{let o=JSON.parse((0,l.readFileSync)((0,s.resolve)(t,"package.json"),"utf-8")),n=(0,s.resolve)(t,o.main);if(!(0,l.existsSync)((0,s.resolve)(t,n))){this.logger.warn(`Unable to reload plugin \xA7u${o.name??"unknown-plugin"}\xA78@\xA7u${o.version??"unknown-version"}\xA7r, the main entry path "\xA78${(0,s.relative)(process.cwd(),(0,s.resolve)(t,n))}\xA7r" was not found in the directory.`);return}let i=require((0,s.resolve)(t,n)),r=i.default;r.pipeline=this,r.serenity=this.serenity,r.path=t,r.isBundled=!1,this.linkModule(r.identifier,i),this.plugins.set(r.identifier,r),y.options.push(r.identifier),r.onInitialize(r),this.bindEvents(r)}}bundle(e){let t=new $.BinaryStream,o=e.resources.size>0?m.HasResources:m.HasNoResources;switch(t.writeByte(o),o){case m.HasNoResources:{let n=(0,s.resolve)(e.path,"dist","index.js"),i=(0,l.readFileSync)(n);t.writeVarInt(i.byteLength),t.writeBuffer(i),(0,l.writeFileSync)((0,s.resolve)(this.path,`${e.identifier}-v${e.version}.plugin`),(0,x.deflateSync)(t.getBuffer()));break}case m.HasResources:{let n=(0,s.resolve)(e.path,"dist","index.js"),i=(0,l.readFileSync)(n);t.writeVarInt(i.byteLength),t.writeBuffer(i),t.writeVarInt(e.resources.size);for(let r of e.resources){let p=r.compress();t.writeVarInt(p.byteLength),t.writeBuffer(p)}(0,l.writeFileSync)((0,s.resolve)(this.path,`${e.identifier}-v${e.version}.plugin`),(0,x.deflateSync)(t.getBuffer()));break}}}bindEvents(e){let t=Object.getPrototypeOf(e),o=Object.getOwnPropertyNames(t),n=Object.keys(w.WorldEvent);n=n.slice(n.length/2);for(let i of n){let r=n.indexOf(i);if(o.includes("on"+i)){let p=e["on"+i];typeof p=="function"&&this.serenity.on(r,p.bind(e))}if(o.includes("before"+i)){let p=e["before"+i];typeof p=="function"&&this.serenity.before(r,p.bind(e))}if(o.includes("after"+i)){let p=e["after"+i];typeof p=="function"&&this.serenity.after(r,p.bind(e))}}}linkModule(e,t){process.versions.bun!==void 0&&Bun.plugin({name:`serenityjs.plugin.${e}`,setup(n){n.module(e,()=>({exports:t,loader:"object"}))}})}};var P=require("@serenityjs/logger"),V=require("@serenityjs/emitter");var A=class{static{f(this,"PluginBlockRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var N=class{static{f(this,"PluginItemRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var H=class{static{f(this,"PluginEntityRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var J=class extends V.Emitter{static{f(this,"Plugin")}identifier;version;logger;priority=S.Normal;blocks=new A;items=new N;entities=new H;resources=new Set;path;isBundled;pipeline;serenity;constructor(e,t,o){super(o?.maxListeners),this.identifier=e,this.version=t,this.logger=o?.logger??new P.Logger(`${e}@${t}`,P.LoggerColors.Blue),o?.onInitialize&&(this.onInitialize=o.onInitialize),o?.onStartUp&&(this.onStartUp=o.onStartUp),o?.onShutDown&&(this.onShutDown=o.onShutDown)}resolve(e){if(!this.pipeline)return null;let t=this.pipeline.plugins.get(e);return t||null}onInitialize(e){}onStartUp(e){}onShutDown(e){}};0&&(module.exports={DefaultPipelineProperties,Pipeline,Plugin,PluginHeader,PluginPriority,PluginType});
2
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9waXBlbGluZS50cyIsICIuLi9zcmMvY29tbWFuZHMvY29tbWFuZC50cyIsICIuLi9zcmMvY29tbWFuZHMvZW51bS50cyIsICIuLi9zcmMvZW51bXMvaGVhZGVyLnRzIiwgIi4uL3NyYy9lbnVtcy9wcmlvcml0eS50cyIsICIuLi9zcmMvZW51bXMvdHlwZS50cyIsICIuLi9zcmMvcGx1Z2luLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9ibG9jay50cyIsICIuLi9zcmMvcmVnaXN0cnkvaXRlbS50cyIsICIuLi9zcmMvcmVnaXN0cnkvZW50aXR5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9waXBlbGluZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGx1Z2luXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lbnVtc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHVubGlua1N5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZGVmbGF0ZVN5bmMsIGluZmxhdGVTeW5jIH0gZnJvbSBcIm5vZGU6emxpYlwiO1xuXG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dlckNvbG9ycyB9IGZyb20gXCJAc2VyZW5pdHlqcy9sb2dnZXJcIjtcbmltcG9ydCB7IFNlcmVuaXR5LCBTZXJ2ZXJFdmVudCwgV29ybGRFdmVudCB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBCaW5hcnlTdHJlYW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFBsdWdpblBhY2thZ2UgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSBcIi4vcGx1Z2luXCI7XG5pbXBvcnQgQ29tbWFuZCBmcm9tIFwiLi9jb21tYW5kcy9jb21tYW5kXCI7XG5pbXBvcnQgeyBQbHVnaW5zRW51bSB9IGZyb20gXCIuL2NvbW1hbmRzXCI7XG5pbXBvcnQgeyBQbHVnaW5UeXBlLCBQbHVnaW5IZWFkZXIgfSBmcm9tIFwiLi9lbnVtc1wiO1xuXG5pbnRlcmZhY2UgUGlwZWxpbmVQcm9wZXJ0aWVzIHtcbiAgcGF0aDogc3RyaW5nO1xuICBjb21tYW5kczogYm9vbGVhbjtcbiAgaW5pdGlhbGl6ZTogYm9vbGVhbjtcbn1cblxuY29uc3QgRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllczogUGlwZWxpbmVQcm9wZXJ0aWVzID0ge1xuICBwYXRoOiBcIi4vcGx1Z2luc1wiLFxuICBjb21tYW5kczogdHJ1ZSxcbiAgaW5pdGlhbGl6ZTogdHJ1ZVxufTtcblxuY2xhc3MgUGlwZWxpbmUge1xuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZSBmb3IgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VyZW5pdHk6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBmb3IgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydGllczogUGlwZWxpbmVQcm9wZXJ0aWVzO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKFwiUGx1Z2luc1wiLCBMb2dnZXJDb2xvcnMuTWF0ZXJpYWxMYXBpcyk7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW5zIGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2lucyA9IG5ldyBNYXA8c3RyaW5nLCBQbHVnaW4+KCk7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBpcGVsaW5lIGlzIHJ1bm5pbmcgaW4gRVNNIG1vZGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXNtOiBib29sZWFuID1cbiAgICB0eXBlb2YgbW9kdWxlICE9PSBcInVuZGVmaW5lZFwiICYmIG1vZHVsZT8uZXhwb3J0cyAhPT0gZXhwb3J0cztcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIGdldCBwYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5wYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyBzZXQgcGF0aChfKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhdGggcHJvcGVydHkgaXMgcmVhZC1vbmx5LlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBQaXBlbGluZSBjbGFzcy5cbiAgICogQHBhcmFtIHNlcmVuaXR5IFRoZSBzZXJlbml0eSBzZXJ2ZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgc2VyZW5pdHk6IFNlcmVuaXR5LFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFBpcGVsaW5lUHJvcGVydGllcz5cbiAgKSB7XG4gICAgLy8gU2V0IHRoZSBzZXJlbml0eSBzZXJ2ZXIgaW5zdGFuY2VcbiAgICB0aGlzLnNlcmVuaXR5ID0gc2VyZW5pdHk7XG5cbiAgICAvLyBNZXJnZSB0aGUgcHJvcGVydGllcyB3aXRoIHRoZSBkZWZhdWx0IHByb3BlcnRpZXNcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7IC4uLkRlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMsIC4uLnByb3BlcnRpZXMgfTtcblxuICAgIC8vIEhvb2sgaW50byB0aGUgc2VyZW5pdHkgc2VydmVyIGV2ZW50c1xuICAgIHNlcmVuaXR5Lm9uKFNlcnZlckV2ZW50LlN0YXJ0LCB0aGlzLnN0YXJ0LmJpbmQodGhpcykpO1xuICAgIHNlcmVuaXR5Lm9uKFNlcnZlckV2ZW50LlN0b3AsIHRoaXMuc3RvcC5iaW5kKHRoaXMpKTtcblxuICAgIC8vIEhvb2sgaW50byB0aGUgd29ybGQgaW5pdGlhbGl6ZSBldmVudFxuICAgIHNlcmVuaXR5Lm9uKFdvcmxkRXZlbnQuV29ybGRJbml0aWFsaXplLCAoeyB3b3JsZCB9KSA9PiB7XG4gICAgICAvLyBSZWdpc3RlciB0aGUgY29tbWFuZHMgZm9yIHRoZSBwbHVnaW5zXG4gICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmNvbW1hbmRzKSBDb21tYW5kKHdvcmxkLCB0aGlzKTtcblxuICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcGx1Z2lucywgYW5kIHJlZ2lzdGVyIHRoZSBibG9ja3MsIGl0ZW1zLCBhbmQgZW50aXRpZXNcbiAgICAgIGZvciAoY29uc3QgWywgcGx1Z2luXSBvZiB0aGlzLnBsdWdpbnMpIHtcbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGJsb2NrcyBmb3IgdGhlIHdvcmxkXG4gICAgICAgIHdvcmxkLmJsb2NrUGFsZXR0ZVxuICAgICAgICAgIC5yZWdpc3RlclR5cGUoLi4ucGx1Z2luLmJsb2Nrcy50eXBlcylcbiAgICAgICAgICAucmVnaXN0ZXJUcmFpdCguLi5wbHVnaW4uYmxvY2tzLnRyYWl0cyk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGl0ZW1zIGZvciB0aGUgd29ybGRcbiAgICAgICAgd29ybGQuaXRlbVBhbGV0dGVcbiAgICAgICAgICAucmVnaXN0ZXJUeXBlKC4uLnBsdWdpbi5pdGVtcy50eXBlcylcbiAgICAgICAgICAucmVnaXN0ZXJUcmFpdCguLi5wbHVnaW4uaXRlbXMudHJhaXRzKTtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGUgZW50aXRpZXMgZm9yIHRoZSB3b3JsZFxuICAgICAgICB3b3JsZC5lbnRpdHlQYWxldHRlXG4gICAgICAgICAgLnJlZ2lzdGVyVHlwZSguLi5wbHVnaW4uZW50aXRpZXMudHlwZXMpXG4gICAgICAgICAgLnJlZ2lzdGVyVHJhaXQoLi4ucGx1Z2luLmVudGl0aWVzLnRyYWl0cyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2lucyBzaG91bGQgYmUgaW5pdGlhbGl6ZWRcbiAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmluaXRpYWxpemUpIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHRoaXMucGF0aCkpKVxuICAgICAgLy8gSWYgbm90LCBjcmVhdGUgdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICBta2RpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlYWQgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KTtcblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBmaWxlcyB0aGF0IGhhdmUgYSAucGx1Z2luIGV4dGVuc2lvblxuICAgIGNvbnN0IGJ1bmRsZXMgPSBlbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PlxuICAgICAgZGlyZW50LmlzRmlsZSgpID8gZGlyZW50Lm5hbWUuZW5kc1dpdGgoXCIucGx1Z2luXCIpIDogZmFsc2VcbiAgICApO1xuXG4gICAgLy8gQXJyYXkgdG8gaG9sZCB0aGUgb3JkZXJlZCBwbHVnaW5zXG4gICAgY29uc3Qgb3JkZXJlZFBsdWdpbnM6IEFycmF5PFBsdWdpbj4gPSBbXTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGJ1bmRsZWQgcGx1Z2lucywgYW5kIGltcG9ydCB0aGVtXG4gICAgZm9yIChjb25zdCBidW5kbGUgb2YgYnVuZGxlcykge1xuICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIC5wbHVnaW4gZmlsZSBhbmQgaW5mbGF0ZSBpdCwgYW5kIGNyZWF0ZSBhIG5ldyBiaW5hcnkgc3RyZWFtXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGluZmxhdGVTeW5jKHJlYWRGaWxlU3luYyhwYXRoKSk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oYnVmZmVyKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBwbHVnaW4gaGVhZGVyIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICBjb25zdCB0eXBlID0gc3RyZWFtLnJlYWRCeXRlKCkgYXMgUGx1Z2luVHlwZSB8IFBsdWdpbkhlYWRlcjtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFBsdWdpbkhlYWRlci5IYXNOb1Jlc291cmNlczoge1xuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcblxuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAgIC8vIExvYWQgdGhlIHBsdWdpbiBmcm9tIHRoZSB0ZXh0IHNvdXJjZVxuICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gdG8gdGhlIG9yZGVyZWQgcGx1Z2lucyBhcnJheVxuICAgICAgICAgICAgaWYgKHBsdWdpbikgb3JkZXJlZFBsdWdpbnMucHVzaChwbHVnaW4pO1xuXG4gICAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc1Jlc291cmNlczoge1xuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcblxuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAgIC8vIExvYWQgdGhlIHBsdWdpbiBmcm9tIHRoZSB0ZXh0IHNvdXJjZVxuICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIHdhcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAgICAgICBpZiAoIXBsdWdpbikgYnJlYWs7XG5cbiAgICAgICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiB0byB0aGUgb3JkZXJlZCBwbHVnaW5zIGFycmF5XG4gICAgICAgICAgICBvcmRlcmVkUGx1Z2lucy5wdXNoKHBsdWdpbik7XG5cbiAgICAgICAgICAgIC8vIFJlYWQgdGhlIGFtb3VudCBvZiByZXNvdXJjZXMgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCByZXNvdXJjZXMgPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZXNvdXJjZXMsIGFuZCByZWFkIHRoZW0gZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc291cmNlczsgaSsrKSB7XG4gICAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gcmVhZCB0aGUgcmVzb3VyY2UgcGFja1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgLy8gTG9hZCB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBidWZmZXJcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuc2VyZW5pdHkucmVzb3VyY2VzLmxvYWRGcm9tWmlwKGJ1ZmZlcik7XG5cbiAgICAgICAgICAgICAgICAvLyBMb2cgdGhlIHN1Y2Nlc3NmdWwgbG9hZCBvZiB0aGUgcmVzb3VyY2UgcGFja1xuICAgICAgICAgICAgICAgIHBsdWdpbi5sb2dnZXIuc3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgIGBMb2FkZWQgcmVzb3VyY2UgcGFjayDCp3Uke3Jlc291cmNlLm5hbWV9wqdyICjCpzgke3Jlc291cmNlLnV1aWR9wqdyKS5gXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgcmVzb3VyY2UgcGFjayB0byB0aGUgcGx1Z2luIHJlc291cmNlcyBzZXRcbiAgICAgICAgICAgICAgICBwbHVnaW4ucmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgICAgIC8vIExvZyB0aGUgZXJyb3IgaWYgdGhlIHJlc291cmNlIHBhY2sgZmFpbGVkIHRvIGxvYWRcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCByZXNvdXJjZSBwYWNrIMKnOCR7cmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSlcbiAgICAgICAgICAgICAgICAgICl9wqdyIGZvciBwbHVnaW4gwqcxJHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IuYCxcbiAgICAgICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBERVBSRUNBVEVEOiBFdmVudHVhbGx5IHJlbW92ZSBzdXBwb3J0IGZvciB0aGVzZSBwbHVnaW4gdHlwZXNcbiAgICAgICAgICBjYXNlIFBsdWdpblR5cGUuQWRkb246IHtcbiAgICAgICAgICAgIC8vIFdlIHdpbGwgaGFuZGxlIGFkZG9uIHBsdWdpbnMsIGJ1dCBtZW50aW9uIHRoYXQgdGhleSBhcmUgZGVwcmVjYXRlZFxuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFRoZSBwbHVnaW4gwqcxJHtyZWxhdGl2ZShcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSlcbiAgICAgICAgICAgICAgKX3Cp3IgaXMgdXNpbmcgYSBkZXByZWNhdGVkIHBsdWdpbiB0eXBlIChBZGRvbikuIFBsZWFzZSB1cGRhdGUgdGhlIHBsdWdpbiB0byB1c2UgdGhlIG5ldyBwbHVnaW4gc3lzdGVtLmBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFJlYWQgdGhlIG1vZHVsZSBlbnRyeSBwb2ludCBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RyZWFtLnJlYWRSZW1haW5pbmdCdWZmZXIoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgICAvLyBMb2FkIHRoZSBwbHVnaW4gZnJvbSB0aGUgdGV4dCBzb3VyY2VcbiAgICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMubG9hZEZyb21UZXh0U291cmNlKHBhdGgsIGluZGV4LCB0cnVlKTtcblxuICAgICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIHRvIHRoZSBvcmRlcmVkIHBsdWdpbnMgYXJyYXlcbiAgICAgICAgICAgIGlmIChwbHVnaW4pIG9yZGVyZWRQbHVnaW5zLnB1c2gocGx1Z2luKTtcblxuICAgICAgICAgICAgLy8gQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBERVBSRUNBVEVEOiBFdmVudHVhbGx5IHJlbW92ZSBzdXBwb3J0IGZvciB0aGVzZSBwbHVnaW4gdHlwZXNcbiAgICAgICAgICBjYXNlIFBsdWdpblR5cGUuQXBpOiB7XG4gICAgICAgICAgICAvLyBXZSBubyBsb25nZXIgc3VwcG9ydCBBUEkgcGx1Z2luc1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgIGBUaGUgcGx1Z2luIMKnMSR7cmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUpXG4gICAgICAgICAgICAgICl9wqdyIGlzIHVzaW5nIGEgZGVwcmVjYXRlZCBwbHVnaW4gdHlwZSAoQVBJKS4gQVBJIHBsdWdpbnMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQuIFBsZWFzZSB1cGRhdGUgdGhlIHBsdWdpbiB0byB1c2UgdGhlIG5ldyBwbHVnaW4gc3lzdGVtLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gXCIke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSkpfVwiLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGRpcmVjdG9yaWVzIGZyb20gdGhlIGVudHJpZXNcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNEaXJlY3RvcnkoKSk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBkaXJlY3RvcmllcywgY2hlY2tpbmcgaWYgdGhleSBhcmUgdmFsaWQgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBkaXJlY3RvcnkubmFtZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYSBwYWNrYWdlLmpzb24gZmlsZSwgaWYgbm90LCBza2lwIHRoZSBwbHVnaW5cbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIikpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgcmVhZEZpbGVTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIilcbiAgICAgICAgKSBhcyBQbHVnaW5QYWNrYWdlO1xuXG4gICAgICAgIC8vIEdldCB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCBtYW5pZmVzdC5tYWluKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZWQgZW50cnkgcG9pbnQgaXMgdmFsaWRcbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgbWFpbikpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqd1JHttYW5pZmVzdC5uYW1lID8/IFwidW5rbm93bi1wbHVnaW5cIn3CpzhAwqd1JHttYW5pZmVzdC52ZXJzaW9uID8/IFwidW5rbm93bi12ZXJzaW9uXCJ9wqdyLCB0aGUgbWFpbiBlbnRyeSBwYXRoIFwiwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHBhdGgsIG1haW4pKX3Cp3JcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHJlc29sdmUocGF0aCwgbWFpbikpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBMaW5rIHRoZSBtb2R1bGUgdG8gdGhlIHBpcGVsaW5lXG4gICAgICAgIHRoaXMubGlua01vZHVsZShwbHVnaW4uaWRlbnRpZmllciwgbW9kdWxlKTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIHRvIHRoZSBvcmRlcmVkIHBsdWdpbnMgYXJyYXlcbiAgICAgICAgb3JkZXJlZFBsdWdpbnMucHVzaChwbHVnaW4pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGEgXCJyZXNvdXJjZV9wYWNrc1wiIGRpcmVjdG9yeSBleGlzdHMgaW4gdGhlIHBsdWdpblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBcInJlc291cmNlX3BhY2tzXCIpKSkge1xuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgcmVzb3VyY2VfcGFja3MgZGlyZWN0b3J5XG4gICAgICAgICAgbWtkaXJTeW5jKHJlc29sdmUocGF0aCwgXCJyZXNvdXJjZV9wYWNrc1wiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgcmVzb3VyY2VfcGFjayBkaXJlY3RvcnksIG9ubHkgaW5jbHVkaW5nIGRpcmVjdG9yaWVzXG4gICAgICAgIGNvbnN0IHJlc291cmNlcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUocGF0aCwgXCJyZXNvdXJjZV9wYWNrc1wiKSwge1xuICAgICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICAgICAgfSkuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKTtcblxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZXNvdXJjZSBwYWNrIGRpcmVjdG9yaWVzLCBhbmQgYXR0ZW1wdCB0byBsb2FkIHRoZW1cbiAgICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiByZXNvdXJjZXMpIHtcbiAgICAgICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHJlc291cmNlIHBhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVzb3VyY2UgcGFjaywgYW5kIGFkZCBpdCB0byB0aGUgc2VyZW5pdHkgcmVzb3VyY2VzXG4gICAgICAgICAgICBjb25zdCBwYWNrID0gdGhpcy5zZXJlbml0eS5yZXNvdXJjZXMubG9hZEZyb21QYXRoKFxuICAgICAgICAgICAgICByZXNvbHZlKHBhdGgsIFwicmVzb3VyY2VfcGFja3NcIiwgcmVzb3VyY2UubmFtZSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIExvZyB0aGUgc3VjY2Vzc2Z1bCBsb2FkIG9mIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgICBwbHVnaW4ubG9nZ2VyLnN1Y2Nlc3MoXG4gICAgICAgICAgICAgIGBMb2FkZWQgcmVzb3VyY2UgcGFjayDCp3Uke3BhY2submFtZX3Cp3IgKMKnOCR7cGFjay51dWlkfcKncikuYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gQWRkIHRoZSByZXNvdXJjZSBwYWNrIHRvIHRoZSBwbHVnaW4gcmVzb3VyY2VzIHNldFxuICAgICAgICAgICAgcGx1Z2luLnJlc291cmNlcy5hZGQocGFjayk7XG4gICAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICAvLyBMb2cgdGhlIGVycm9yIGlmIHRoZSByZXNvdXJjZSBwYWNrIGZhaWxlZCB0byBsb2FkXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHJlc291cmNlIHBhY2sgwqc4JHtyZWxhdGl2ZShcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgIHJlc29sdmUocGF0aCwgXCJyZXNvdXJjZV9wYWNrc1wiLCByZXNvdXJjZS5uYW1lKVxuICAgICAgICAgICAgICApfcKnciBmb3IgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLmAsXG4gICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IHRoZSBwbHVnaW5zIGJ5IHRoZWlyIHByaW9yaXR5XG4gICAgb3JkZXJlZFBsdWdpbnMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgLy8gU29ydCBieSBwcmlvcml0eSBmaXJzdFxuICAgICAgaWYgKGEucHJpb3JpdHkgIT09IGIucHJpb3JpdHkpIHtcbiAgICAgICAgcmV0dXJuIGIucHJpb3JpdHkgLSBhLnByaW9yaXR5OyAvLyBIaWdoZXIgcHJpb3JpdHkgY29tZXMgZmlyc3RcbiAgICAgIH1cblxuICAgICAgLy8gSWYgcHJpb3JpdHkgaXMgdGhlIHNhbWUsIHNvcnQgYnkgaWRlbnRpZmllciBhbHBoYWJldGljYWxseVxuICAgICAgaWYgKGEuaWRlbnRpZmllciA8IGIuaWRlbnRpZmllcikgcmV0dXJuIC0xO1xuICAgICAgaWYgKGEuaWRlbnRpZmllciA+IGIuaWRlbnRpZmllcikgcmV0dXJuIDE7XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHBsdWdpbnMsIGFuZCBpbml0aWFsaXplIHRoZW1cbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBvcmRlcmVkUGx1Z2lucykge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luLCBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICBwbHVnaW4ub25Jbml0aWFsaXplKHBsdWdpbik7XG4gICAgICB0aGlzLmJpbmRFdmVudHMocGx1Z2luKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBidW5kbGVkXG4gICAgICBpZiAocGx1Z2luLmlzQnVuZGxlZCkge1xuICAgICAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBjb25zdCB0ZW1wID0gcmVzb2x2ZShwbHVnaW4ucGF0aC5zbGljZSgwLCAtNykucmVwbGFjZSgvXFwuL2csIFwiX1wiKSk7XG5cbiAgICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZSBpZiBpdCBleGlzdHNcbiAgICAgICAgaWYgKGV4aXN0c1N5bmModGVtcCkpIHByb2Nlc3MubmV4dFRpY2soKCkgPT4gdW5saW5rU3luYyh0ZW1wKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBzdGFydCgpOiB2b2lkIHtcbiAgICAvLyBTdGFydCB1cCBhbGwgdGhlIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMudmFsdWVzKCkpIHBsdWdpbi5vblN0YXJ0VXAocGx1Z2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xuICAgIC8vIFNodXQgZG93biBhbGwgdGhlIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMudmFsdWVzKCkpIHBsdWdpbi5vblNodXREb3duKHBsdWdpbik7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIHBsdWdpbiBmcm9tIGEgdGV4dCBzb3VyY2UuXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSBpc0J1bmRsZWQgV2hldGhlciB0aGUgcGx1Z2luIGlzIGJ1bmRsZWQgb3Igbm90LlxuICAgKi9cbiAgcHVibGljIGxvYWRGcm9tVGV4dFNvdXJjZShcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgc291cmNlOiBzdHJpbmcsXG4gICAgaXNCdW5kbGVkID0gZmFsc2VcbiAgKTogUGx1Z2luIHwgbnVsbCB7XG4gICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICBjb25zdCB0ZW1wID0gcmVzb2x2ZShwYXRoLnNsaWNlKDAsIC03KS5yZXBsYWNlKC9cXC4vZywgXCJfXCIpKTtcblxuICAgIC8vIFdyaXRlIHRoZSBzb3VyY2UgdG8gdGhlIHRlbXBvcmFyeSBwYXRoXG4gICAgd3JpdGVGaWxlU3luYyhyZXNvbHZlKHRlbXApLCBzb3VyY2UpO1xuXG4gICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICB0cnkge1xuICAgICAgLy8gQXR0ZW1wdCB0byBpbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcbiAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocmVzb2x2ZSh0ZW1wKSk7XG5cbiAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgY29uc3QgcGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgLy8gTG9nIHRoZSB3YXJuaW5nIHRoYXQgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZFxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqd1JHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IsIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIHBpcGVsaW5lLmBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBSZW1vdmUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgIHVubGlua1N5bmMocmVzb2x2ZSh0ZW1wKSk7XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgcGx1Z2luLnBhdGggPSByZXNvbHZlKHBhdGgpO1xuICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IGlzQnVuZGxlZDtcblxuICAgICAgLy8gTGluayB0aGUgbW9kdWxlIHRvIHRoZSBwaXBlbGluZVxuICAgICAgdGhpcy5saW5rTW9kdWxlKHBsdWdpbi5pZGVudGlmaWVyLCBtb2R1bGUpO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgIHRoaXMucGx1Z2lucy5zZXQocGx1Z2luLmlkZW50aWZpZXIsIHBsdWdpbik7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgcGx1Z2luXG4gICAgICByZXR1cm4gcGx1Z2luO1xuICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnciwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICByZWFzb25cbiAgICAgICk7XG5cbiAgICAgIC8vIFJlbW92ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgIHVubGlua1N5bmMocmVzb2x2ZSh0ZW1wKSk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIG51bGwgaWYgdGhlIHBsdWdpbiBmYWlsZWQgdG8gbG9hZFxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIHJlbG9hZChwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIFNodXQgZG93biB0aGUgcGx1Z2luXG4gICAgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHBsdWdpbnMgbWFwXG4gICAgdGhpcy5wbHVnaW5zLmRlbGV0ZShwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAvLyBHZXQgdGhlIHBsdWdpbiBwYXRoXG4gICAgY29uc3QgcGF0aCA9IHBsdWdpbi5wYXRoO1xuXG4gICAgLy8gRGVsZXRlIHRoZSByZXF1aXJlIGNhY2hlIGZvciB0aGUgcGx1Z2luXG4gICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKHBhdGgpXTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHNlcmVuaXR5IGluc3RhbmNlXG4gICAgdGhpcy5zZXJlbml0eS5yZW1vdmVQYXRoKHBhdGgpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVzb3VyY2VzIGluIHRoZSBwbHVnaW4sIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBzZXJlbml0eSBpbnN0YW5jZVxuICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcGx1Z2luLnJlc291cmNlcykge1xuICAgICAgLy8gUmVtb3ZlIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIHNlcmVuaXR5IGluc3RhbmNlXG4gICAgICB0aGlzLnNlcmVuaXR5LnJlc291cmNlcy5wYWNrcy5kZWxldGUocmVzb3VyY2UudXVpZCk7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbi5pc0J1bmRsZWQpIHtcbiAgICAgIC8vIFJlYWQgdGhlIC5wbHVnaW4gZmlsZSBhbmQgaW5mbGF0ZSBpdCwgYW5kIGNyZWF0ZSBhIG5ldyBiaW5hcnkgc3RyZWFtXG4gICAgICBjb25zdCBidWZmZXIgPSBpbmZsYXRlU3luYyhyZWFkRmlsZVN5bmMocGF0aCkpO1xuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgYmluYXJ5IHN0cmVhbSBmcm9tIHRoZSBidWZmZXJcbiAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oYnVmZmVyKTtcblxuICAgICAgLy8gUmVhZCB0aGUgcGx1Z2luIGhlYWRlciBmcm9tIHRoZSBzdHJlYW1cbiAgICAgIGNvbnN0IHR5cGUgPSBzdHJlYW0ucmVhZEJ5dGUoKSBhcyBQbHVnaW5UeXBlIHwgUGx1Z2luSGVhZGVyO1xuXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBQbHVnaW5IZWFkZXIuSGFzTm9SZXNvdXJjZXM6IHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4IGZpbGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcblxuICAgICAgICAgIC8vIFJlYWQgdGhlIG1vZHVsZSBlbnRyeSBwb2ludCBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBpbmRleCA9IHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCkudG9TdHJpbmcoXCJ1dGYtOFwiKTtcblxuICAgICAgICAgIC8vIExvYWQgdGhlIHBsdWdpbiBmcm9tIHRoZSB0ZXh0IHNvdXJjZVxuICAgICAgICAgIGNvbnN0IG5ld1BsdWdpbiA9IHRoaXMubG9hZEZyb21UZXh0U291cmNlKHBhdGgsIGluZGV4LCB0cnVlKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gd2FzIGxvYWRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgICBpZiAoIW5ld1BsdWdpbikgYnJlYWs7XG5cbiAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW4sIGFuZCBiaW5kIHRoZSBldmVudHNcbiAgICAgICAgICBuZXdQbHVnaW4ub25Jbml0aWFsaXplKG5ld1BsdWdpbik7XG4gICAgICAgICAgdGhpcy5iaW5kRXZlbnRzKG5ld1BsdWdpbik7XG5cbiAgICAgICAgICAvLyBTdGFydCB1cCB0aGUgcGx1Z2luXG4gICAgICAgICAgbmV3UGx1Z2luLm9uU3RhcnRVcChuZXdQbHVnaW4pO1xuXG4gICAgICAgICAgLy8gQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIFBsdWdpbkhlYWRlci5IYXNSZXNvdXJjZXM6IHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4IGZpbGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcblxuICAgICAgICAgIC8vIFJlYWQgdGhlIG1vZHVsZSBlbnRyeSBwb2ludCBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBpbmRleCA9IHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCkudG9TdHJpbmcoXCJ1dGYtOFwiKTtcblxuICAgICAgICAgIC8vIExvYWQgdGhlIHBsdWdpbiBmcm9tIHRoZSB0ZXh0IHNvdXJjZVxuICAgICAgICAgIGNvbnN0IG5ld1BsdWdpbiA9IHRoaXMubG9hZEZyb21UZXh0U291cmNlKHBhdGgsIGluZGV4LCB0cnVlKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gd2FzIGxvYWRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgICBpZiAoIW5ld1BsdWdpbikgYnJlYWs7XG5cbiAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW4sIGFuZCBiaW5kIHRoZSBldmVudHNcbiAgICAgICAgICBuZXdQbHVnaW4ub25Jbml0aWFsaXplKG5ld1BsdWdpbik7XG4gICAgICAgICAgdGhpcy5iaW5kRXZlbnRzKG5ld1BsdWdpbik7XG5cbiAgICAgICAgICAvLyBTdGFydCB1cCB0aGUgcGx1Z2luXG4gICAgICAgICAgbmV3UGx1Z2luLm9uU3RhcnRVcChuZXdQbHVnaW4pO1xuXG4gICAgICAgICAgLy8gUmVhZCB0aGUgYW1vdW50IG9mIHJlc291cmNlcyBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCByZXNvdXJjZXMgPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVzb3VyY2VzLCBhbmQgcmVhZCB0aGVtIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzb3VyY2VzOyBpKyspIHtcbiAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcmVzb3VyY2UgcGFja1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgICAgIC8vIFJlYWQgdGhlIHJlc291cmNlIHBhY2sgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCk7XG5cbiAgICAgICAgICAgICAgLy8gTG9hZCB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBidWZmZXJcbiAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnNlcmVuaXR5LnJlc291cmNlcy5sb2FkRnJvbVppcChidWZmZXIpO1xuXG4gICAgICAgICAgICAgIC8vIExvZyB0aGUgc3VjY2Vzc2Z1bCBsb2FkIG9mIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgICAgIG5ld1BsdWdpbi5sb2dnZXIuc3VjY2VzcyhcbiAgICAgICAgICAgICAgICBgTG9hZGVkIHJlc291cmNlIHBhY2sgwqd1JHtyZXNvdXJjZS5uYW1lfcKnciAowqc4JHtyZXNvdXJjZS51dWlkfcKncikuYFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIC8vIEFkZCB0aGUgcmVzb3VyY2UgcGFjayB0byB0aGUgcGx1Z2luIHJlc291cmNlcyBzZXRcbiAgICAgICAgICAgICAgbmV3UGx1Z2luLnJlc291cmNlcy5hZGQocmVzb3VyY2UpO1xuICAgICAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICAgIC8vIExvZyB0aGUgZXJyb3IgaWYgdGhlIHJlc291cmNlIHBhY2sgZmFpbGVkIHRvIGxvYWRcbiAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHJlc291cmNlIHBhY2sgwqc4JHtyZWxhdGl2ZShcbiAgICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgcGF0aClcbiAgICAgICAgICAgICAgICApfcKnciBmb3IgcGx1Z2luIMKnMSR7bmV3UGx1Z2luLmlkZW50aWZpZXJ9wqdyLmAsXG4gICAgICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlYWQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICAgIHJlYWRGaWxlU3luYyhyZXNvbHZlKHBhdGgsIFwicGFja2FnZS5qc29uXCIpLCBcInV0Zi04XCIpXG4gICAgICApIGFzIFBsdWdpblBhY2thZ2U7XG5cbiAgICAgIC8vIEdldCB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHBsdWdpblxuICAgICAgY29uc3QgbWFpbiA9IHJlc29sdmUocGF0aCwgbWFuaWZlc3QubWFpbik7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlZCBlbnRyeSBwb2ludCBpcyB2YWxpZFxuICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgbWFpbikpKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFVuYWJsZSB0byByZWxvYWQgcGx1Z2luIMKndSR7bWFuaWZlc3QubmFtZSA/PyBcInVua25vd24tcGx1Z2luXCJ9wqc4QMKndSR7bWFuaWZlc3QudmVyc2lvbiA/PyBcInVua25vd24tdmVyc2lvblwifcKnciwgdGhlIG1haW4gZW50cnkgcGF0aCBcIsKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZShwYXRoLCBtYWluKSl9wqdyXCIgd2FzIG5vdCBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5LmBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBdHRlbXB0IHRvIGltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZShyZXNvbHZlKHBhdGgsIG1haW4pKTtcblxuICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICBjb25zdCBuZXdQbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgbmV3UGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgIG5ld1BsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICBuZXdQbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICBuZXdQbHVnaW4uaXNCdW5kbGVkID0gZmFsc2U7XG5cbiAgICAgIC8vIExpbmsgdGhlIG1vZHVsZSB0byB0aGUgcGlwZWxpbmVcbiAgICAgIHRoaXMubGlua01vZHVsZShuZXdQbHVnaW4uaWRlbnRpZmllciwgbW9kdWxlKTtcblxuICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICB0aGlzLnBsdWdpbnMuc2V0KG5ld1BsdWdpbi5pZGVudGlmaWVyLCBuZXdQbHVnaW4pO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICBQbHVnaW5zRW51bS5vcHRpb25zLnB1c2gobmV3UGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW4sIGFuZCBiaW5kIHRoZSBldmVudHNcbiAgICAgIG5ld1BsdWdpbi5vbkluaXRpYWxpemUobmV3UGx1Z2luKTtcbiAgICAgIHRoaXMuYmluZEV2ZW50cyhuZXdQbHVnaW4pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBidW5kbGUocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgQmluYXJ5U3RyZWFtIGluc3RhbmNlXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBwbHVnaW4gaGVhZGVyIGJhc2VkIG9uIHRoZSByZXNvdXJjZXNcbiAgICBjb25zdCBoZWFkZXIgPVxuICAgICAgcGx1Z2luLnJlc291cmNlcy5zaXplID4gMFxuICAgICAgICA/IFBsdWdpbkhlYWRlci5IYXNSZXNvdXJjZXNcbiAgICAgICAgOiBQbHVnaW5IZWFkZXIuSGFzTm9SZXNvdXJjZXM7XG5cbiAgICAvLyBXcml0ZSB0aGUgcGx1Z2luIHR5cGUgdG8gdGhlIHN0cmVhbVxuICAgIHN0cmVhbS53cml0ZUJ5dGUoaGVhZGVyKTtcblxuICAgIC8vIFN3aXRjaCBiYXNlZCBvbiB0aGUgcGx1Z2luIGhlYWRlclxuICAgIHN3aXRjaCAoaGVhZGVyKSB7XG4gICAgICBjYXNlIFBsdWdpbkhlYWRlci5IYXNOb1Jlc291cmNlczoge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpbidzIGNvbXBpbGVkIGluZGV4IGZpbGVcbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUocGx1Z2luLnBhdGgsIFwiZGlzdFwiLCBcImluZGV4LmpzXCIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIGluZGV4IGZpbGUgZnJvbSB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IGluZGV4ID0gcmVhZEZpbGVTeW5jKHBhdGgpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4IGZpbGUgdG8gdGhlIHN0cmVhbVxuICAgICAgICBzdHJlYW0ud3JpdGVWYXJJbnQoaW5kZXguYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIGluZGV4IGZpbGUgdG8gdGhlIHN0cmVhbVxuICAgICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoaW5kZXgpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBCaW5hcnlTdHJlYW0gdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS12JHtwbHVnaW4udmVyc2lvbn0ucGx1Z2luYCksXG4gICAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEJyZWFrIG91dCBvZiB0aGUgc3dpdGNoIHN0YXRlbWVudFxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBQbHVnaW5IZWFkZXIuSGFzUmVzb3VyY2VzOiB7XG4gICAgICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgcGx1Z2luJ3MgY29tcGlsZWQgaW5kZXggZmlsZVxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZShwbHVnaW4ucGF0aCwgXCJkaXN0XCIsIFwiaW5kZXguanNcIik7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgaW5kZXggZmlsZSBmcm9tIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgaW5kZXggPSByZWFkRmlsZVN5bmMocGF0aCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIGxlbmd0aCBvZiB0aGUgaW5kZXggZmlsZSB0byB0aGUgc3RyZWFtXG4gICAgICAgIHN0cmVhbS53cml0ZVZhckludChpbmRleC5ieXRlTGVuZ3RoKTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgaW5kZXggZmlsZSB0byB0aGUgc3RyZWFtXG4gICAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihpbmRleCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIGFtb3VudCBvZiByZXNvdXJjZXMgdG8gdGhlIHN0cmVhbVxuICAgICAgICBzdHJlYW0ud3JpdGVWYXJJbnQocGx1Z2luLnJlc291cmNlcy5zaXplKTtcblxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZXNvdXJjZXMsIGFuZCB3cml0ZSB0aGVtIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBwbHVnaW4ucmVzb3VyY2VzKSB7XG4gICAgICAgICAgLy8gQ29tcHJlc3MgdGhlIHJlc291cmNlIHBhY2sgaW50byBhIGJ1ZmZlclxuICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlc291cmNlLmNvbXByZXNzKCk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSByZXNvdXJjZSBwYWNrIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgICBzdHJlYW0ud3JpdGVWYXJJbnQoYnVmZmVyLmJ5dGVMZW5ndGgpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIHJlc291cmNlIHBhY2sgdG8gdGhlIHN0cmVhbVxuICAgICAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihidWZmZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIEJpbmFyeVN0cmVhbSB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7cGx1Z2luLmlkZW50aWZpZXJ9LXYke3BsdWdpbi52ZXJzaW9ufS5wbHVnaW5gKSxcbiAgICAgICAgICBkZWZsYXRlU3luYyhzdHJlYW0uZ2V0QnVmZmVyKCkpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBiaW5kRXZlbnRzKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBwcm90b3R5cGUgb2YgdGhlIHBsdWdpblxuICAgIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwbHVnaW4pO1xuXG4gICAgLy8gR2V0IHRoZSBvYmplY3Qga2V5cyBmcm9tIHRoZSBwbHVnaW5cbiAgICBjb25zdCBwbHVnaW5LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG90eXBlKTtcblxuICAgIC8vIEdldCB0aGUgd29ybGQgZXZlbnQga2V5cywgYW5kIHNsaWNlIHRoZW0gaW4gaGFsZlxuICAgIGxldCBldmVudEtleXMgPSBPYmplY3Qua2V5cyhXb3JsZEV2ZW50KTtcbiAgICBldmVudEtleXMgPSBldmVudEtleXMuc2xpY2UoZXZlbnRLZXlzLmxlbmd0aCAvIDIpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgZXZlbnQga2V5c1xuICAgIGZvciAoY29uc3QgZXZlbnRLZXkgb2YgZXZlbnRLZXlzKSB7XG4gICAgICAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBldmVudCBrZXlcbiAgICAgIGNvbnN0IGluZGV4ID0gZXZlbnRLZXlzLmluZGV4T2YoZXZlbnRLZXkpIGFzIFdvcmxkRXZlbnQ7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcIm9uXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJvblwiICsgZXZlbnRLZXkpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV2ZW50IGtleVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHBsdWdpblsoXCJvblwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5Lm9uKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gdm9pZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcImJlZm9yZVwiIGV2ZW50IGtleXNcbiAgICAgIGlmIChwbHVnaW5LZXlzLmluY2x1ZGVzKFwiYmVmb3JlXCIgKyBldmVudEtleSkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXZlbnQga2V5XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGx1Z2luWyhcImJlZm9yZVwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5LmJlZm9yZShpbmRleCwgdmFsdWUuYmluZChwbHVnaW4pIGFzICgpID0+IGJvb2xlYW4pO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbnkgXCJhZnRlclwiIGV2ZW50IGtleXNcbiAgICAgIGlmIChwbHVnaW5LZXlzLmluY2x1ZGVzKFwiYWZ0ZXJcIiArIGV2ZW50S2V5KSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBldmVudCBrZXlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwbHVnaW5bKFwiYWZ0ZXJcIiArIGV2ZW50S2V5KSBhcyBrZXlvZiBQbHVnaW5dO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAvLyBCaW5kIHRoZSBldmVudCB0byB0aGUgcGx1Z2luXG4gICAgICAgICAgdGhpcy5zZXJlbml0eS5hZnRlcihpbmRleCwgdmFsdWUuYmluZChwbHVnaW4pIGFzICgpID0+IHZvaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaW5rIGEgbW9kdWxlIHRvIHRoZSBwaXBlbGluZS5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBsaW5rLlxuICAgKiBAcGFyYW0gbW9kdWxlIFRoZSBtb2R1bGUgdG8gbGluay5cbiAgICovXG4gIHB1YmxpYyBsaW5rTW9kdWxlKG5hbWU6IHN0cmluZywgbW9kdWxlOiB1bmtub3duKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBydW50aW1lIG9mIHRoZSBzZXJ2ZXJcbiAgICBjb25zdCBpc0J1biA9IHByb2Nlc3MudmVyc2lvbnMuYnVuID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWU7XG5cbiAgICAvLyBNb2R1bGUgbGlua2luZyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBCdW5cbiAgICBpZiAoIWlzQnVuKSByZXR1cm47XG5cbiAgICAvLyBJbmplY3QgdGhlIG1vZHVsZSBpbnRvIHRoZSBCdW4gcGx1Z2luIHN5c3RlbVxuICAgIEJ1bi5wbHVnaW4oe1xuICAgICAgbmFtZTogYHNlcmVuaXR5anMucGx1Z2luLiR7bmFtZX1gLFxuICAgICAgc2V0dXAoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLm1vZHVsZShuYW1lLCAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4cG9ydHM6IG1vZHVsZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIGxvYWRlcjogXCJvYmplY3RcIlxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7IFBpcGVsaW5lLCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIH07XG4iLCAiaW1wb3J0IHsgcmVsYXRpdmUgfSBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBXb3JsZCB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4uL3BpcGVsaW5lXCI7XG5cbmltcG9ydCB7IFBsdWdpbkFjdGlvbnNFbnVtLCBQbHVnaW5zRW51bSB9IGZyb20gXCIuL2VudW1cIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkLCBwaXBlbGluZTogUGlwZWxpbmUpID0+IHtcbiAgd29ybGQuY29tbWFuZFBhbGV0dGUucmVnaXN0ZXIoXG4gICAgXCJwbHVnaW5zXCIsXG4gICAgXCJJbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIG9mIHRoZSBzZXJ2ZXJcIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgcGVybWlzc2lvbnMgb2YgdGhlIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5LnBlcm1pc3Npb25zID0gW1wic2VyZW5pdHkub3BlcmF0b3JcIl07XG5cbiAgICAgIC8vIE92ZXJsb2FkIGZvciBsaXN0aW5nIHRoZSBwbHVnaW5zXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIGFjdGlvbjogUGx1Z2luQWN0aW9uc0VudW1cbiAgICAgICAgfSxcbiAgICAgICAgKHsgYWN0aW9uIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIGxpc3RcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCAhPT0gXCJsaXN0XCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwaXBlbGluZSBoYXMgbm8gcGx1Z2luc1xuICAgICAgICAgIGlmIChwaXBlbGluZS5wbHVnaW5zLnNpemUgPT09IDApXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBcIsKnY1RoZXJlIGFyZSBjdXJyZW50IG5vIHBsdWdpbnMgbG9hZGVkIG9uIHRoZSBzZXJ2ZXIuXCJcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbnMgZnJvbSB0aGUgcGlwZWxpbmVcbiAgICAgICAgICBjb25zdCBwbHVnaW5zID0gWy4uLnBpcGVsaW5lLnBsdWdpbnMudmFsdWVzKCldO1xuXG4gICAgICAgICAgLy8gUHJlcGFyZSB0aGUgbWVzc2FnZVxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbXTtcblxuICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgcGx1Z2luc1xuICAgICAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiBuYW1lIHRvIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICBtZXNzYWdlLnB1c2goYMKndSR7cGx1Z2luLmlkZW50aWZpZXJ9IHYke3BsdWdpbi52ZXJzaW9ufcKncmApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXNzYWdlOiBgwqc3QWN0aXZlIFBsdWdpbnMgKCR7cGx1Z2lucy5sZW5ndGh9KTrCp3IgJHttZXNzYWdlLmpvaW4oXCLCpzcswqdyIFwiKX1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtLFxuICAgICAgICAgIHBsdWdpbjogUGx1Z2luc0VudW1cbiAgICAgICAgfSxcbiAgICAgICAgKHsgYWN0aW9uLCBwbHVnaW4gfSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwicmVsb2FkXCIgJiYgYWN0aW9uLnJlc3VsdCAhPT0gXCJidW5kbGVcIikgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gZnJvbSB0aGUgcGlwZWxpbmVcbiAgICAgICAgICBjb25zdCBwbHVnaW5JbnN0YW5jZSA9IHBpcGVsaW5lLnBsdWdpbnMuZ2V0KHBsdWdpbi5yZXN1bHQgYXMgc3RyaW5nKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgbm90IGZvdW5kXG4gICAgICAgICAgaWYgKCFwbHVnaW5JbnN0YW5jZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luICR7cGx1Z2luLnJlc3VsdH0gaXMgbm90IGZvdW5kLmApO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyByZWxvYWRcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCA9PT0gXCJyZWxvYWRcIikge1xuICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIHBpcGVsaW5lLnJlbG9hZChwbHVnaW5JbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogYMKnYVN1Y2Nlc3NmdWxseSByZWxvYWRlZCDCpzIke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9wqdhLmBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwbHVnaW5JbnN0YW5jZS5pc0J1bmRsZWQpXG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBidW5kbGVkXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgUGx1Z2luICR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn0gY2Fubm90IGJlIGJ1bmRsZWQsIGFzIGl0IGlzIGFscmVhZHkgYSBidW5kbGVkIHBsdWdpbi5gXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIEJ1bmRsZSB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5idW5kbGUocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgYnVuZGxlZCDCpzIke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9wqdhLCBvdXRwdXQgZmlsZSB3YXMgcGxhY2VkIGF0IMKnNyR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGlwZWxpbmUucGF0aCl9wqdhLmBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gICAgKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gb3ZlcmxvYWQgbWF0Y2hlZCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlwiKTtcbiAgICB9XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlcjtcbiIsICJpbXBvcnQgeyBDdXN0b21FbnVtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5zXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9uczogQXJyYXk8c3RyaW5nPiA9IFtdO1xufVxuXG5jbGFzcyBQbHVnaW5BY3Rpb25zRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInBsdWdpbl9hY3Rpb25zXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9uczogQXJyYXk8c3RyaW5nPiA9IFtcImxpc3RcIiwgXCJyZWxvYWRcIiwgXCJidW5kbGVcIl07XG59XG5cbmV4cG9ydCB7IFBsdWdpbnNFbnVtLCBQbHVnaW5BY3Rpb25zRW51bSB9O1xuIiwgImVudW0gUGx1Z2luSGVhZGVyIHtcbiAgSGFzTm9SZXNvdXJjZXMgPSAyLFxuICBIYXNSZXNvdXJjZXMgPSAzXG59XG5cbmV4cG9ydCB7IFBsdWdpbkhlYWRlciB9O1xuIiwgIi8qKlxuICogVGhlIHByaW9yaXR5IG9mIGEgcGx1Z2luIGRldGVybWluZXMgd2hlbiBpdCB3aWxsIGJlIGxvYWRlZCBpbiByZWxhdGlvbiB0byBvdGhlciBwbHVnaW5zLlxuICogQSBwbHVnaW4gd2l0aCBhIGhpZ2hlciBwcmlvcml0eSB3aWxsIGJlIGxvYWRlZCBiZWZvcmUgYSBwbHVnaW4gd2l0aCBhIGxvd2VyIHByaW9yaXR5LlxuICogVGhpcyBpcyB1c2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBuZWVkIHRvIGJlIGxvYWRlZCBiZWZvcmUgb3IgYWZ0ZXIgb3RoZXIgcGx1Z2lucy5cbiAqIEZvciBleGFtcGxlLCBhIGxpYnJhcnkgcGx1Z2luIG1heSBuZWVkIHRvIGJlIGxvYWRlZCBiZWZvcmUgYSBwbHVnaW4gdGhhdCB1c2VzIGl0LFxuICogb3IgYSBwbHVnaW4gdGhhdCBtb2RpZmllcyB0aGUgYmVoYXZpb3Igb2Ygc2VyZW5pdHkncyBBUElzIG1heSBuZWVkIHRvIGJlIGxvYWRlZCBhZnRlciBpdC5cbiAqIFRoZSBkZWZhdWx0IHByaW9yaXR5IGlzIE5vcm1hbC5cbiAqL1xuZW51bSBQbHVnaW5Qcmlvcml0eSB7XG4gIC8qKlxuICAgKiBBIGxvdyBwcmlvcml0eSBwbHVnaW4gd2lsbCBiZSBsb2FkZWQgYWZ0ZXIgb3RoZXIgcGx1Z2lucy5cbiAgICogVXNlZnVsIGZvciByZWFjdGluZyB0byBjaGFuZ2VzIG9yIGZpbmFsIGFkanVzdG1lbnRzLlxuICAgKi9cbiAgTG93LFxuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBwcmlvcml0eSBmb3IgYSBwbHVnaW4uXG4gICAqIFN1aXRhYmxlIGZvciBzdGFuZGFyZCBwbHVnaW4gYmVoYXZpb3IuXG4gICAqL1xuICBOb3JtYWwsXG5cbiAgLyoqXG4gICAqIEEgaGlnaCBwcmlvcml0eSBwbHVnaW4gd2lsbCBiZSBsb2FkZWQgYmVmb3JlIG90aGVyIHBsdWdpbnMuXG4gICAqIFVzZWZ1bCBmb3IgZWFybHkgc2V0dXAgb3Igb3ZlcnJpZGluZyBiZWhhdmlvci5cbiAgICovXG4gIEhpZ2hcbn1cblxuZXhwb3J0IHsgUGx1Z2luUHJpb3JpdHkgfTtcbiIsICIvKipcbiAqIFRoZSBwbHVnaW4gdHlwZSBkZWNsYXJlcyB0aGUgdXNlIGNhc2Ugb2YgdGhlIHBsdWdpbi5cbiAqL1xuZW51bSBQbHVnaW5UeXBlIHtcbiAgLyoqXG4gICAqIEFuIGFkZG9uIHBsdWdpbiB0eXBlIGFkZHMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGhvdXQgYW4gZXhwb3NlZCBBUEkuXG4gICAqL1xuICBBZGRvbixcblxuICAvKipcbiAgICogQW4gQVBJIHBsdWdpbiB0eXBlIGFkZHMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGggYW4gZXhwb3NlZCBBUEkgZm9yIG90aGVyIHBsdWdpbnMgdG8gdXNlLlxuICAgKi9cbiAgQXBpXG59XG5cbmV4cG9ydCB7IFBsdWdpblR5cGUgfTtcbiIsICJpbXBvcnQgeyBSZXNvdXJjZVBhY2ssIFNlcmVuaXR5IH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuaW1wb3J0IHsgRW1pdHRlciB9IGZyb20gXCJAc2VyZW5pdHlqcy9lbWl0dGVyXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4vcGlwZWxpbmVcIjtcbmltcG9ydCB7IFBsdWdpbkV2ZW50cyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBQbHVnaW5CbG9ja1JlZ2lzdHJ5LFxuICBQbHVnaW5FbnRpdHlSZWdpc3RyeSxcbiAgUGx1Z2luSXRlbVJlZ2lzdHJ5XG59IGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5pbXBvcnQgeyBQbHVnaW5Qcmlvcml0eSB9IGZyb20gXCIuL2VudW1zL3ByaW9yaXR5XCI7XG5cbmludGVyZmFjZSBQbHVnaW5PcHRpb25zIGV4dGVuZHMgUGFydGlhbDxQbHVnaW5FdmVudHM+IHtcbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgaW5zdGFuY2UgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHByaW9yaXR5OiBQbHVnaW5Qcmlvcml0eTtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGxpc3RlbmVycyBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIG1heExpc3RlbmVyczogbnVtYmVyO1xufVxuXG4vKipcbiAqICMgSW50cm9kdWN0aW9uXG4gKiBQbHVnaW5zIGFyZSB0aGUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIG9mIFNlcmVuaXR5SlMuXG4gKiBUaGV5IGFyZSB1c2VkIHRvIGFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2hpY2ggYWxsb3dzIHRvdGFsIGNvbnRyb2wgb3ZlciB0aGUgc2VydmVyLlxuICpcbiAqIFRoZXJlIGFyZSAyIHR5cGVzIG9mIHBsdWdpbnMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgYFBsdWdpblR5cGVgIGVudW06IGBBZGRvbmAgJiBgQXBpYFxuICpcbiAqIEFkZG9uIHBsdWdpbnMgYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRob3V0IGFuIGV4cG9zZWQgQVBJLiBUaGlzIG1lYW5zIGV4dGVybmFsIHBsdWdpbnMgY2Fubm90IGRpcmVjdGx5IGludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgQVBJLlxuICogQXBpIHBsdWdpbnMgYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRoIGFuIGV4cG9zZWQgQVBJIGZvciBvdGhlciBwbHVnaW5zIHRvIHVzZS4gVGhpcyBtZWFucyBleHRlcm5hbCBwbHVnaW5zIGNhbiBkaXJlY3RseSBpbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIEFQSS5cbiAqXG4gKiAjIyBDbGFzcyBFeHRlbmRpbmcgUGx1Z2luXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5UeXBlLCBQbHVnaW5FdmVudHMgfSBmcm9tIFwiQHNlcmVuaXR5anMvcGx1Z2luc1wiO1xuICpcbiAqIGNsYXNzIFNhbXBsZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG4gKiAgIHB1YmxpYyByZWFkb25seSB0eXBlID0gUGx1Z2luVHlwZS5BZGRvbjtcbiAqXG4gKiAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICBzdXBlcihcInNhbXBsZS1wbHVnaW5cIiwgXCIxLjAuMFwiKTtcbiAqICAgfVxuICpcbiAqICAgcHVibGljIG9uSW5pdGlhbGl6ZSgpOiB2b2lkIHt9XG4gKlxuICogICBwdWJsaWMgb25TdGFydFVwKCk6IHZvaWQge31cbiAqXG4gKiAgIHB1YmxpYyBvblNodXREb3duKCk6IHZvaWQge31cbiAqIH1cbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBuZXcgU2FtcGxlUGx1Z2luKCk7XG4gKiBgYGBcbiAqL1xuY2xhc3MgUGx1Z2luPFQgPSB1bmtub3duPiBleHRlbmRzIEVtaXR0ZXI8VD4gaW1wbGVtZW50cyBQbHVnaW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogVGhlIHByaW9yaXR5IG9mIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG9yZGVyIGluIHdoaWNoIHBsdWdpbnMgYXJlIGxvYWRlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcmlvcml0eTogUGx1Z2luUHJpb3JpdHkgPSBQbHVnaW5Qcmlvcml0eS5Ob3JtYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBibG9jayByZWdpc3RyeSBmb3IgdGhlIHBsdWdpbi5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcy90cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBibG9ja3MgPSBuZXcgUGx1Z2luQmxvY2tSZWdpc3RyeSgpO1xuXG4gIC8qKlxuICAgKiBUaGUgaXRlbSByZWdpc3RyeSBmb3IgdGhlIHBsdWdpbi5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcy90cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpdGVtcyA9IG5ldyBQbHVnaW5JdGVtUmVnaXN0cnkoKTtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSByZWdpc3RyeSBmb3IgdGhlIHBsdWdpbi5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcy90cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbnRpdGllcyA9IG5ldyBQbHVnaW5FbnRpdHlSZWdpc3RyeSgpO1xuXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZXMgPSBuZXcgU2V0PFJlc291cmNlUGFjaz4oKTtcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbi5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHBhdGghOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbHVnaW4gaXMgYnVuZGxlZC5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIGlzQnVuZGxlZCE6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gcGlwZWxpbmUgdGhlIHBsdWdpbiBpcyBpbi5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHBpcGVsaW5lITogUGlwZWxpbmU7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJlbml0eSBpbnN0YW5jZSBvZiB0aGUgc2VydmVyLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgc2VyZW5pdHkhOiBTZXJlbml0eTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHBsdWdpbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgdmVyc2lvbjogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPFBsdWdpbk9wdGlvbnM+XG4gICkge1xuICAgIC8vIENhbGwgdGhlIHN1cGVyIG1ldGhvZCB3aXRoIHRoZSBtYXggbGlzdGVuZXJzXG4gICAgc3VwZXIob3B0aW9ucz8ubWF4TGlzdGVuZXJzKTtcblxuICAgIC8vIFNldCB0aGUgaWRlbnRpZmllciBhbmQgdmVyc2lvbiBvZiB0aGUgcGx1Z2luXG4gICAgdGhpcy5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgLy8gU2V0IHRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5cbiAgICB0aGlzLmxvZ2dlciA9XG4gICAgICBvcHRpb25zPy5sb2dnZXIgPz9cbiAgICAgIG5ldyBMb2dnZXIoYCR7aWRlbnRpZmllcn1AJHt2ZXJzaW9ufWAsIExvZ2dlckNvbG9ycy5CbHVlKTtcblxuICAgIC8vIFNldCB0aGUgb24gaW5pdGlhbGl6ZSwgc3RhcnQgdXAsIGFuZCBzaHV0IGRvd24gb3B0aW9uc1xuICAgIGlmIChvcHRpb25zPy5vbkluaXRpYWxpemUpIHRoaXMub25Jbml0aWFsaXplID0gb3B0aW9ucy5vbkluaXRpYWxpemU7XG4gICAgaWYgKG9wdGlvbnM/Lm9uU3RhcnRVcCkgdGhpcy5vblN0YXJ0VXAgPSBvcHRpb25zLm9uU3RhcnRVcDtcbiAgICBpZiAob3B0aW9ucz8ub25TaHV0RG93bikgdGhpcy5vblNodXREb3duID0gb3B0aW9ucy5vblNodXREb3duO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBwbHVnaW4gYnkgaXRzIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbiB0byByZXNvbHZlLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGluc3RhbmNlIGlmIGZvdW5kLCBvdGhlcndpc2UgbnVsbC5cbiAgICovXG4gIHB1YmxpYyByZXNvbHZlPFQgZXh0ZW5kcyBQbHVnaW4+KGlkZW50aWZpZXI6IHN0cmluZyk6IFQgfCBudWxsIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGlwZWxpbmUgaXMgZGVmaW5lZC5cbiAgICBpZiAoIXRoaXMucGlwZWxpbmUpIHJldHVybiBudWxsO1xuXG4gICAgLy8gR2V0IHRoZSBwbHVnaW4gZnJvbSB0aGUgcGlwZWxpbmVcbiAgICBjb25zdCBwbHVnaW4gPSB0aGlzLnBpcGVsaW5lLnBsdWdpbnMuZ2V0KGlkZW50aWZpZXIpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBkZWZpbmVkXG4gICAgaWYgKCFwbHVnaW4pIHJldHVybiBudWxsO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBwbHVnaW5cbiAgICByZXR1cm4gcGx1Z2luIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIGluaXRpYWxpemVkLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvbkluaXRpYWxpemUoX3BsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHN0YXJ0ZWQgdXAuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzdGFydGVkIHVwLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblN0YXJ0VXAoX3BsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHNodXQgZG93bi5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHNodXQgZG93bi4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25TaHV0RG93bihfcGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbiwgUGx1Z2luT3B0aW9ucyB9O1xuIiwgImltcG9ydCB7IHR5cGUgQmxvY2tUcmFpdCwgQ3VzdG9tQmxvY2tUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luQmxvY2tSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gYmxvY2sgdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tQmxvY2tUeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gYmxvY2sgdHJhaXRzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHJhaXRzOiBBcnJheTx0eXBlb2YgQmxvY2tUcmFpdD4gPSBbXTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gYmxvY2sgdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBibG9jayByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHlwZSguLi50eXBlczogQXJyYXk8Q3VzdG9tQmxvY2tUeXBlPik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHR5cGUgdG8gdGhlIHR5cGVzIGFycmF5LlxuICAgIHRoaXMudHlwZXMucHVzaCguLi50eXBlcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGJsb2NrIHR5cGUgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBibG9jayByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHlwZSh0eXBlOiBDdXN0b21CbG9ja1R5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGJsb2NrIHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgQmxvY2tUcmFpdD4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0cmFpdCB0byB0aGUgdHJhaXRzIGFycmF5LlxuICAgIHRoaXMudHJhaXRzLnB1c2goLi4udHJhaXRzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBibG9jayB0cmFpdCB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUcmFpdCh0cmFpdDogdHlwZW9mIEJsb2NrVHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luQmxvY2tSZWdpc3RyeSB9O1xuIiwgImltcG9ydCB7IHR5cGUgSXRlbVN0YWNrVHJhaXQsIEN1c3RvbUl0ZW1UeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luSXRlbVJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBpdGVtIHR5cGVzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZXM6IEFycmF5PEN1c3RvbUl0ZW1UeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gaXRlbSB0cmFpdHMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHM6IEFycmF5PHR5cGVvZiBJdGVtU3RhY2tUcmFpdD4gPSBbXTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGl0ZW0gdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBpdGVtIHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHlwZSguLi50eXBlczogQXJyYXk8Q3VzdG9tSXRlbVR5cGU+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHlwZSB0byB0aGUgdHlwZXMgYXJyYXkuXG4gICAgdGhpcy50eXBlcy5wdXNoKC4uLnR5cGVzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGl0ZW0gdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBpdGVtIHR5cGUgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUeXBlKHR5cGU6IEN1c3RvbUl0ZW1UeXBlKTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIHR5cGVzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50eXBlcy5pbmRleE9mKHR5cGUpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0eXBlIGZyb20gdGhlIHR5cGVzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50eXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGl0ZW0gdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGl0ZW0gdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRyYWl0KC4uLnRyYWl0czogQXJyYXk8dHlwZW9mIEl0ZW1TdGFja1RyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gaXRlbSB0cmFpdCB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgSXRlbVN0YWNrVHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luSXRlbVJlZ2lzdHJ5IH07XG4iLCAiaW1wb3J0IHsgdHlwZSBFbnRpdHlUcmFpdCwgQ3VzdG9tRW50aXR5VHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbkVudGl0eVJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBlbnRpdHkgdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tRW50aXR5VHlwZT4gPSBbXTtcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGVudGl0eSB0cmFpdHMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHM6IEFycmF5PHR5cGVvZiBFbnRpdHlUcmFpdD4gPSBbXTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGVudGl0eSB0eXBlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHlwZSguLi50eXBlczogQXJyYXk8Q3VzdG9tRW50aXR5VHlwZT4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0eXBlIHRvIHRoZSB0eXBlcyBhcnJheS5cbiAgICB0aGlzLnR5cGVzLnB1c2goLi4udHlwZXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gZW50aXR5IHR5cGUgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclR5cGUodHlwZTogQ3VzdG9tRW50aXR5VHlwZSk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSB0eXBlcyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHlwZXMuaW5kZXhPZih0eXBlKTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSB0eXBlc1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHlwZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGVudGl0eSB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUcmFpdCguLi50cmFpdHM6IEFycmF5PHR5cGVvZiBFbnRpdHlUcmFpdD4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0cmFpdCB0byB0aGUgdHJhaXRzIGFycmF5LlxuICAgIHRoaXMudHJhaXRzLnB1c2goLi4udHJhaXRzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gZW50aXR5IHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUcmFpdCh0cmFpdDogdHlwZW9mIEVudGl0eVRyYWl0KTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHRyYWl0IGluIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnRyYWl0cy5pbmRleE9mKHRyYWl0KTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgdHJhaXRzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50cmFpdHMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbkVudGl0eVJlZ2lzdHJ5IH07XG4iXSwKICAibWFwcGluZ3MiOiAiNGRBQUEsSUFBQUEsRUFBQSxHQUFBQyxFQUFBRCxFQUFBLCtCQUFBRSxFQUFBLGFBQUFDLEVBQUEsV0FBQUMsRUFBQSxpQkFBQUMsRUFBQSxtQkFBQUMsRUFBQSxlQUFBQyxJQUFBLGVBQUFDLEVBQUFSLEdDQ0EsSUFBQVMsRUFPTyxjQUNQQyxFQUFrQyxnQkFDbENDLEVBQXlDLGdCQUV6Q0MsRUFBcUMsOEJBQ3JDQyxFQUFrRCw0QkFDbERDLEVBQTZCLG9DQ2Q3QixJQUFBQyxFQUF5QixnQkNBekIsSUFBQUMsRUFBMkIsNEJBRTNCLElBQU1DLEVBQU4sY0FBMEJDLFlBQUFBLENBRjFCLE1BRTBCQSxDQUFBQSxFQUFBQSxvQkFDeEIsT0FBdUJDLFdBQWEsVUFDcEMsT0FBdUJDLFFBQXlCLENBQUEsQ0FDbEQsRUFFTUMsRUFBTixjQUFnQ0gsWUFBQUEsQ0FQaEMsTUFPZ0NBLENBQUFBLEVBQUFBLDBCQUM5QixPQUF1QkMsV0FBYSxpQkFDcEMsT0FBdUJDLFFBQXlCLENBQUMsT0FBUSxTQUFVLFNBQ3JFLEVERkEsSUFBTUUsRUFBV0MsRUFBQSxDQUFDQyxFQUFjQyxJQUFBQSxDQUM5QkQsRUFBTUUsZUFBZUosU0FDbkIsVUFDQSwwQ0FDQ0ssR0FBQUEsQ0FFQ0EsRUFBU0MsWUFBYyxDQUFDLHFCQUd4QkQsRUFBU0Us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LEVBR2YsS0FBS25CLFdBQWFBLEVBQ2xCLEtBQUtDLFFBQVVBLEVBR2YsS0FBS0MsT0FDSGdCLEdBQVNoQixRQUNULElBQUlrQixTQUFPLEdBQUdwQixDQUFBQSxJQUFjQyxDQUFBQSxHQUFXb0IsZUFBYUMsSUFBSSxFQUd0REosR0FBU0ssZUFBYyxLQUFLQSxhQUFlTCxFQUFRSyxjQUNuREwsR0FBU00sWUFBVyxLQUFLQSxVQUFZTixFQUFRTSxXQUM3Q04sR0FBU08sYUFBWSxLQUFLQSxXQUFhUCxFQUFRTyxXQUNyRCxDQU9PQyxRQUEwQjFCLEVBQThCLENBRTdELEdBQUksQ0FBQyxLQUFLZ0IsU0FBVSxPQUFPLEtBRzNCLElBQU1XLEVBQVMsS0FBS1gsU0FBU1ksUUFBUUMsSUFBSTdCLENBQUFBLEVBR3pDLE9BQUsyQixHQUFlLElBSXRCLENBTU9KLGFBQWFPLEVBQXVCLENBRTNDLENBTU9OLFVBQVVNLEVBQXVCLENBRXhDLENBTU9MLFdBQVdLLEVBQXVCLENBRXpDLENBQ0YiLAogICJuYW1lcyI6IFsiaW5kZXhfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgIlBpcGVsaW5lIiwgIlBsdWdpbiIsICJQbHVnaW5IZWFkZXIiLCAiUGx1Z2luUHJpb3JpdHkiLCAiUGx1Z2luVHlwZSIsICJfX3RvQ29tbW9uSlMiLCAiaW1wb3J0X25vZGVfZnMiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJpbXBvcnRfbm9kZV96bGliIiwgImltcG9ydF9sb2dnZXIiLCAiaW1wb3J0X2NvcmUiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJpbXBvcnRfcGF0aCIsICJpbXBvcnRfY29yZSIsICJQbHVnaW5zRW51bSIsICJDdXN0b21FbnVtIiwgImlkZW50aWZpZXIiLCAib3B0aW9ucyIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZWdpc3RlciIsICJfX25hbWUiLCAid29ybGQiLCAicGlwZWxpbmUiLCAiY29tbWFuZFBhbGV0dGUiLCAicmVnaXN0cnkiLCAicGVybWlzc2lvbnMiLCAib3ZlcmxvYWQiLCAiYWN0aW9uIiwgIlBsdWdpbkFjdGlvbnNFbnVtIiwgInJlc3VsdCIsICJwbHVnaW5zIiwgInNpemUiLCAibWVzc2FnZSIsICJ2YWx1ZXMiLCAicGx1Z2luIiwgInB1c2giLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxlbmd0aCIsICJqb2luIiwgIlBsdWdpbnNFbnVtIiwgInBsdWdpbkluc3RhbmNlIiwgImdldCIsICJFcnJvciIsICJyZWxvYWQiLCAiaXNCdW5kbGVkIiwgImJ1bmRsZSIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImN3ZCIsICJwYXRoIiwgImNvbW1hbmRfZGVmYXVsdCIsICJQbHVnaW5IZWFkZXIiLCAiUGx1Z2luUHJpb3JpdHkiLCAiUGx1Z2luVHlwZSIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgInBhdGgiLCAiY29tbWFuZHMiLCAiaW5pdGlhbGl6ZSIsICJQaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgImxvZ2dlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIk1hdGVyaWFsTGFwaXMiLCAicGx1Z2lucyIsICJNYXAiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJwbHVnaW4iLCAiYmxvY2tQYWxldHRlIiwgInJlZ2lzdGVyVHlwZSIsICJibG9ja3MiLCAidHlwZXMiLCAicmVnaXN0ZXJUcmFpdCIsICJ0cmFpdHMiLCAiaXRlbVBhbGV0dGUiLCAiaXRlbXMiLCAiZW50aXR5UGFsZXR0ZSIsICJlbnRpdGllcyIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0ZpbGUiLCAibmFtZSIsICJlbmRzV2l0aCIsICJvcmRlcmVkUGx1Z2lucyIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInJlYWRCeXRlIiwgInR5cGUiLCAiUGx1Z2luSGVhZGVyIiwgIkhhc05vUmVzb3VyY2VzIiwgImxlbmd0aCIsICJyZWFkVmFySW50IiwgImluZGV4IiwgInJlYWRCdWZmZXIiLCAidG9TdHJpbmciLCAibG9hZEZyb21UZXh0U291cmNlIiwgInB1c2giLCAiSGFzUmVzb3VyY2VzIiwgInJlc291cmNlcyIsICJpIiwgInJlc291cmNlIiwgImxvYWRGcm9tWmlwIiwgInN1Y2Nlc3MiLCAidXVpZCIsICJhZGQiLCAicmVhc29uIiwgImVycm9yIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgImlkZW50aWZpZXIiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJ3YXJuIiwgInJlYWRSZW1haW5pbmdCdWZmZXIiLCAiQXBpIiwgImRpcmVjdG9yaWVzIiwgImlzRGlyZWN0b3J5IiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJyZXF1aXJlIiwgImRlZmF1bHQiLCAiaGFzIiwgInBpcGVsaW5lIiwgImlzQnVuZGxlZCIsICJsaW5rTW9kdWxlIiwgInNldCIsICJQbHVnaW5zRW51bSIsICJvcHRpb25zIiwgInBhY2siLCAibG9hZEZyb21QYXRoIiwgInNvcnQiLCAiYSIsICJiIiwgInByaW9yaXR5IiwgIm9uSW5pdGlhbGl6ZSIsICJiaW5kRXZlbnRzIiwgInRlbXAiLCAic2xpY2UiLCAicmVwbGFjZSIsICJuZXh0VGljayIsICJ1bmxpbmtTeW5jIiwgInZhbHVlcyIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJzb3VyY2UiLCAid3JpdGVGaWxlU3luYyIsICJyZWxvYWQiLCAiZGVsZXRlIiwgImNhY2hlIiwgInJlbW92ZVBhdGgiLCAicGFja3MiLCAibmV3UGx1Z2luIiwgImhlYWRlciIsICJzaXplIiwgIndyaXRlQnl0ZSIsICJ3cml0ZVZhckludCIsICJieXRlTGVuZ3RoIiwgIndyaXRlQnVmZmVyIiwgImRlZmxhdGVTeW5jIiwgImdldEJ1ZmZlciIsICJjb21wcmVzcyIsICJwcm90b3R5cGUiLCAiT2JqZWN0IiwgImdldFByb3RvdHlwZU9mIiwgInBsdWdpbktleXMiLCAiZ2V0T3duUHJvcGVydHlOYW1lcyIsICJldmVudEtleXMiLCAia2V5cyIsICJldmVudEtleSIsICJpbmRleE9mIiwgImluY2x1ZGVzIiwgInZhbHVlIiwgImJlZm9yZSIsICJhZnRlciIsICJ2ZXJzaW9ucyIsICJidW4iLCAidW5kZWZpbmVkIiwgIkJ1biIsICJzZXR1cCIsICJidWlsZGVyIiwgImxvYWRlciIsICJpbXBvcnRfbG9nZ2VyIiwgImltcG9ydF9lbWl0dGVyIiwgIlBsdWdpbkJsb2NrUmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luSXRlbVJlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbkVudGl0eVJlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbiIsICJFbWl0dGVyIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsb2dnZXIiLCAicHJpb3JpdHkiLCAiUGx1Z2luUHJpb3JpdHkiLCAiTm9ybWFsIiwgImJsb2NrcyIsICJQbHVnaW5CbG9ja1JlZ2lzdHJ5IiwgIml0ZW1zIiwgIlBsdWdpbkl0ZW1SZWdpc3RyeSIsICJlbnRpdGllcyIsICJQbHVnaW5FbnRpdHlSZWdpc3RyeSIsICJyZXNvdXJjZXMiLCAiU2V0IiwgInBhdGgiLCAiaXNCdW5kbGVkIiwgInBpcGVsaW5lIiwgInNlcmVuaXR5IiwgIm9wdGlvbnMiLCAibWF4TGlzdGVuZXJzIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiQmx1ZSIsICJvbkluaXRpYWxpemUiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAicmVzb2x2ZSIsICJwbHVnaW4iLCAicGx1Z2lucyIsICJnZXQiLCAiX3BsdWdpbiJdCn0K
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var M=Object.defineProperty;var d=(a,e)=>M(a,"name",{value:e,configurable:!0}),y=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});import{existsSync as k,mkdirSync as O,readdirSync as I,readFileSync as x,unlinkSync as S,writeFileSync as E}from"node:fs";import{relative as m,resolve as o}from"node:path";import{deflateSync as A,inflateSync as N}from"node:zlib";import{Logger as K,LoggerColors as W}from"@serenityjs/logger";import{ServerEvent as H,WorldEvent as V}from"@serenityjs/core";import{BinaryStream as R}from"@serenityjs/binarystream";import{relative as q}from"path";import{CustomEnum as z}from"@serenityjs/core";var w=class extends z{static{d(this,"PluginsEnum")}static identifier="plugins";static options=[]},B=class extends z{static{d(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var C=d((a,e)=>{a.commandPalette.register("plugins","Interact with the plugins of the server",t=>{t.permissions=["serenity.operator"],t.overload({action:B},({action:s})=>{if(s.result!=="list")return;if(e.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let n=[...e.plugins.values()],r=[];for(let i of n)r.push(`\xA7u${i.identifier} v${i.version}\xA7r`);return{message:`\xA77Active Plugins (${n.length}):\xA7r ${r.join("\xA77,\xA7r ")}`}}),t.overload({action:B,plugin:w},({action:s,plugin:n})=>{if(s.result!=="reload"&&s.result!=="bundle")return;let r=e.plugins.get(n.result);if(!r)throw new Error(`Plugin ${n.result} is not found.`);if(s.result==="reload")return e.reload(r),{message:`\xA7aSuccessfully reloaded \xA72${r.identifier}\xA7a.`};if(r.isBundled)throw new Error(`Plugin ${r.identifier} cannot be bundled, as it is already a bundled plugin.`);return e.bundle(r),{message:`\xA7aSuccessfully bundled \xA72${r.identifier}\xA7a, output file was placed at \xA77${q(process.cwd(),e.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),L=C;var g=function(a){return a[a.HasNoResources=2]="HasNoResources",a[a.HasResources=3]="HasResources",a}(g||{});var T=function(a){return a[a.Low=0]="Low",a[a.Normal=1]="Normal",a[a.High=2]="High",a}(T||{});var v=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(v||{});var J={path:"./plugins",commands:!0,initialize:!0},Be=class{static{d(this,"Pipeline")}serenity;properties;logger=new K("Plugins",W.MaterialLapis);plugins=new Map;tempPaths=new Set;esm=typeof module<"u"&&module?.exports!==exports;get path(){return this.properties.path}set path(e){throw new Error("The path property is read-only.")}constructor(e,t){this.serenity=e,this.properties={...J,...t},e.on(H.Start,this.start.bind(this)),e.on(H.Stop,this.stop.bind(this)),e.on(V.WorldInitialize,({world:s})=>{this.properties.commands&&L(s,this);for(let[,n]of this.plugins)s.blockPalette.registerType(...n.blocks.types).registerTrait(...n.blocks.traits),s.itemPalette.registerType(...n.items.types).registerTrait(...n.items.traits),s.entityPalette.registerType(...n.entities.types).registerTrait(...n.entities.traits)}),this.properties.initialize&&this.initialize()}initialize(){k(o(this.path))||O(o(this.path),{recursive:!0});let t=I(o(this.path),{withFileTypes:!0}).filter(r=>r.isFile()?r.name.endsWith(".plugin"):!1),s=[];for(let r of t)try{let i=o(this.path,r.name),c=N(x(i)),u=new R(c);switch(u.readByte()){case g.HasNoResources:{let l=u.readVarInt(),f=u.readBuffer(l).toString("utf-8"),p=this.loadFromTextSource(i,f,!0);p&&s.push(p);break}case g.HasResources:{let l=u.readVarInt(),f=u.readBuffer(l).toString("utf-8"),p=this.loadFromTextSource(i,f,!0);if(!p)break;s.push(p);let h=u.readVarInt();for(let F=0;F<h;F++)try{let $=u.readVarInt(),D=u.readBuffer($),P=this.serenity.resources.loadFromZip(D);p.logger.success(`Loaded resource pack \xA7u${P.name}\xA7r (\xA78${P.uuid}\xA7r).`),p.resources.add(P)}catch($){this.logger.error(`Failed to load resource pack \xA78${m(process.cwd(),o(this.path,r.name))}\xA7r for plugin \xA71${p.identifier}\xA7r.`,$)}break}case v.Addon:{this.logger.warn(`The plugin \xA71${m(process.cwd(),o(this.path,r.name))}\xA7r is using a deprecated plugin type (Addon). Please update the plugin to use the new plugin system.`);let l=u.readRemainingBuffer().toString("utf-8"),f=this.loadFromTextSource(i,l,!0);f&&s.push(f);break}case v.Api:this.logger.error(`The plugin \xA71${m(process.cwd(),o(this.path,r.name))}\xA7r is using a deprecated plugin type (API). API plugins are no longer supported. Please update the plugin to use the new plugin system.`)}}catch(i){this.logger.error(`Failed to load plugin from "${m(process.cwd(),o(this.path,r.name))}", skipping the plugin.`,i)}let n=I(o(this.path),{withFileTypes:!0}).filter(r=>r.isDirectory());for(let r of n)try{let i=o(this.path,r.name);if(!k(o(i,"package.json")))continue;let c=JSON.parse(x(o(i,"package.json"),"utf-8")),u=o(i,c.main);if(!k(o(i,u))){this.logger.warn(`Unable to load plugin \xA7u${c.name??"unknown-plugin"}\xA78@\xA7u${c.version??"unknown-version"}\xA7r, the main entry path "\xA78${m(process.cwd(),o(i,u))}\xA7r" was not found in the directory.`);continue}let b=y(o(i,u)),l=b.default;if(this.plugins.has(l.identifier)){this.logger.warn(`Unable to load plugin \xA7u${l.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}l.pipeline=this,l.serenity=this.serenity,l.path=i,l.isBundled=!1,this.linkModule(l.identifier,b),this.plugins.set(l.identifier,l),w.options.push(l.identifier),s.push(l),k(o(i,"resource_packs"))||O(o(i,"resource_packs"));let f=I(o(i,"resource_packs"),{withFileTypes:!0}).filter(p=>p.isDirectory());for(let p of f)try{let h=this.serenity.resources.loadFromPath(o(i,"resource_packs",p.name));l.logger.success(`Loaded resource pack \xA7u${h.name}\xA7r (\xA78${h.uuid}\xA7r).`),l.resources.add(h)}catch(h){this.logger.error(`Failed to load resource pack \xA78${m(process.cwd(),o(i,"resource_packs",p.name))}\xA7r for plugin \xA71${l.identifier}\xA7r.`,h)}}catch(i){this.logger.error(`Failed to load plugin from "${m(process.cwd(),o(this.path,r.name))}", skipping the plugin.`,i)}s.sort((r,i)=>r.priority!==i.priority?i.priority-r.priority:r.identifier<i.identifier?-1:r.identifier>i.identifier?1:0);for(let r of s)r.onInitialize(r),this.bindEvents(r)}start(){for(let e of this.plugins.values())e.onStartUp(e)}stop(){for(let e of this.plugins.values())e.onShutDown(e);for(let e of this.tempPaths)S(e)}loadFromTextSource(e,t,s=!1){E(o(e.slice(0,-7)),t);try{let n=y(o(e.slice(0,-7))),r=n.default;return this.plugins.has(r.identifier)?(this.logger.warn(`Unable to load plugin \xA7u${r.identifier}\xA7r, the plugin is already loaded in the pipeline.`),S(o(e.slice(0,-7))),null):(r.pipeline=this,r.serenity=this.serenity,r.path=o(e),r.isBundled=s,this.linkModule(r.identifier,n),this.plugins.set(r.identifier,r),w.options.push(r.identifier),S(o(e.slice(0,-7))),r)}catch(n){this.logger.error(`Failed to load plugin from \xA78${m(process.cwd(),e)}\xA7r, skipping the plugin.`,n)}return S(o(e.slice(0,-7))),null}reload(e){e.onShutDown(e),this.plugins.delete(e.identifier);let t=e.path;delete y.cache[y.resolve(t)],this.serenity.removePath(t);for(let s of e.resources)this.serenity.resources.packs.delete(s.uuid);if(e.isBundled){let s=N(x(t)),n=new R(s);switch(n.readByte()){case g.HasNoResources:{let i=n.readVarInt(),c=n.readBuffer(i).toString("utf-8"),u=this.loadFromTextSource(t,c,!0);if(!u)break;u.onInitialize(u),this.bindEvents(u),u.onStartUp(u);break}case g.HasResources:{let i=n.readVarInt(),c=n.readBuffer(i).toString("utf-8"),u=this.loadFromTextSource(t,c,!0);if(!u)break;u.onInitialize(u),this.bindEvents(u),u.onStartUp(u);let b=n.readVarInt();for(let l=0;l<b;l++)try{let f=n.readVarInt(),p=n.readBuffer(f),h=this.serenity.resources.loadFromZip(p);u.logger.success(`Loaded resource pack \xA7u${h.name}\xA7r (\xA78${h.uuid}\xA7r).`),u.resources.add(h)}catch(f){this.logger.error(`Failed to load resource pack \xA78${m(process.cwd(),o(this.path,t))}\xA7r for plugin \xA71${u.identifier}\xA7r.`,f)}}}}else{let s=JSON.parse(x(o(t,"package.json"),"utf-8")),n=o(t,s.main);if(!k(o(t,n))){this.logger.warn(`Unable to reload plugin \xA7u${s.name??"unknown-plugin"}\xA78@\xA7u${s.version??"unknown-version"}\xA7r, the main entry path "\xA78${m(process.cwd(),o(t,n))}\xA7r" was not found in the directory.`);return}let r=y(o(t,n)),i=r.default;i.pipeline=this,i.serenity=this.serenity,i.path=t,i.isBundled=!1,this.linkModule(i.identifier,r),this.plugins.set(i.identifier,i),w.options.push(i.identifier),i.onInitialize(i),this.bindEvents(i)}}bundle(e){let t=new R,s=e.resources.size>0?g.HasResources:g.HasNoResources;switch(t.writeByte(s),s){case g.HasNoResources:{let n=o(e.path,"dist","index.js"),r=x(n);t.writeVarInt(r.byteLength),t.writeBuffer(r),E(o(this.path,`${e.identifier}-v${e.version}.plugin`),A(t.getBuffer()));break}case g.HasResources:{let n=o(e.path,"dist","index.js"),r=x(n);t.writeVarInt(r.byteLength),t.writeBuffer(r),t.writeVarInt(e.resources.size);for(let i of e.resources){let c=i.compress();t.writeVarInt(c.byteLength),t.writeBuffer(c)}E(o(this.path,`${e.identifier}-v${e.version}.plugin`),A(t.getBuffer()));break}}}bindEvents(e){let t=Object.getPrototypeOf(e),s=Object.getOwnPropertyNames(t),n=Object.keys(V);n=n.slice(n.length/2);for(let r of n){let i=n.indexOf(r);if(s.includes("on"+r)){let c=e["on"+r];typeof c=="function"&&this.serenity.on(i,c.bind(e))}if(s.includes("before"+r)){let c=e["before"+r];typeof c=="function"&&this.serenity.before(i,c.bind(e))}if(s.includes("after"+r)){let c=e["after"+r];typeof c=="function"&&this.serenity.after(i,c.bind(e))}}}linkModule(e,t){process.versions.bun!==void 0&&Bun.plugin({name:`serenityjs.plugin.${e}`,setup(n){n.module(e,()=>({exports:t,loader:"object"}))}})}};import{Logger as Z,LoggerColors as G}from"@serenityjs/logger";import{Emitter as Q}from"@serenityjs/emitter";var j=class{static{d(this,"PluginBlockRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var U=class{static{d(this,"PluginItemRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var _=class{static{d(this,"PluginEntityRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var We=class extends Q{static{d(this,"Plugin")}identifier;version;logger;priority=T.Normal;blocks=new j;items=new U;entities=new _;resources=new Set;path;isBundled;pipeline;serenity;constructor(e,t,s){super(s?.maxListeners),this.identifier=e,this.version=t,this.logger=s?.logger??new Z(`${e}@${t}`,G.Blue),s?.onInitialize&&(this.onInitialize=s.onInitialize),s?.onStartUp&&(this.onStartUp=s.onStartUp),s?.onShutDown&&(this.onShutDown=s.onShutDown)}resolve(e){if(!this.pipeline)return null;let t=this.pipeline.plugins.get(e);return t||null}onInitialize(e){}onStartUp(e){}onShutDown(e){}};export{J as DefaultPipelineProperties,Be as Pipeline,We as Plugin,g as PluginHeader,T as PluginPriority,v as PluginType};
2
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3BpcGVsaW5lLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtLnRzIiwgIi4uL3NyYy9lbnVtcy9oZWFkZXIudHMiLCAiLi4vc3JjL2VudW1zL3ByaW9yaXR5LnRzIiwgIi4uL3NyYy9lbnVtcy90eXBlLnRzIiwgIi4uL3NyYy9wbHVnaW4udHMiLCAiLi4vc3JjL3JlZ2lzdHJ5L2Jsb2NrLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9pdGVtLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9lbnRpdHkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgdW5saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWZsYXRlU3luYywgaW5mbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5cbmltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuaW1wb3J0IHsgU2VyZW5pdHksIFNlcnZlckV2ZW50LCBXb3JsZEV2ZW50IH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IEJpbmFyeVN0cmVhbSB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgUGx1Z2luUGFja2FnZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW5cIjtcbmltcG9ydCBDb21tYW5kIGZyb20gXCIuL2NvbW1hbmRzL2NvbW1hbmRcIjtcbmltcG9ydCB7IFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vY29tbWFuZHNcIjtcbmltcG9ydCB7IFBsdWdpblR5cGUsIFBsdWdpbkhlYWRlciB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQaXBlbGluZVByb3BlcnRpZXMge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmRzOiBib29sZWFuO1xuICBpbml0aWFsaXplOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IFwiLi9wbHVnaW5zXCIsXG4gIGNvbW1hbmRzOiB0cnVlLFxuICBpbml0aWFsaXplOiB0cnVlXG59O1xuXG5jbGFzcyBQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJQbHVnaW5zXCIsIExvZ2dlckNvbG9ycy5NYXRlcmlhbExhcGlzKTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbnMgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogVGhlIHRlbXBvcmFyeSBwYXRocyB1c2VkIGJ5IHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0ZW1wUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBpbiBFU00gbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlc206IGJvb2xlYW4gPVxuICAgIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlPy5leHBvcnRzICE9PSBleHBvcnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHNldCBwYXRoKF8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGF0aCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBpcGVsaW5lIGNsYXNzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGlwZWxpbmVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSBzZXJlbml0eSBzZXJ2ZXIgZXZlbnRzXG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RhcnQsIHRoaXMuc3RhcnQuYmluZCh0aGlzKSk7XG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RvcCwgdGhpcy5zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSB3b3JsZCBpbml0aWFsaXplIGV2ZW50XG4gICAgc2VyZW5pdHkub24oV29ybGRFdmVudC5Xb3JsZEluaXRpYWxpemUsICh7IHdvcmxkIH0pID0+IHtcbiAgICAgIC8vIFJlZ2lzdGVyIHRoZSBjb21tYW5kcyBmb3IgdGhlIHBsdWdpbnNcbiAgICAgIGlmICh0aGlzLnByb3BlcnRpZXMuY29tbWFuZHMpIENvbW1hbmQod29ybGQsIHRoaXMpO1xuXG4gICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBwbHVnaW5zLCBhbmQgcmVnaXN0ZXIgdGhlIGJsb2NrcywgaXRlbXMsIGFuZCBlbnRpdGllc1xuICAgICAgZm9yIChjb25zdCBbLCBwbHVnaW5dIG9mIHRoaXMucGx1Z2lucykge1xuICAgICAgICAvLyBSZWdpc3RlciB0aGUgYmxvY2tzIGZvciB0aGUgd29ybGRcbiAgICAgICAgd29ybGQuYmxvY2tQYWxldHRlXG4gICAgICAgICAgLnJlZ2lzdGVyVHlwZSguLi5wbHVnaW4uYmxvY2tzLnR5cGVzKVxuICAgICAgICAgIC5yZWdpc3RlclRyYWl0KC4uLnBsdWdpbi5ibG9ja3MudHJhaXRzKTtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGUgaXRlbXMgZm9yIHRoZSB3b3JsZFxuICAgICAgICB3b3JsZC5pdGVtUGFsZXR0ZVxuICAgICAgICAgIC5yZWdpc3RlclR5cGUoLi4ucGx1Z2luLml0ZW1zLnR5cGVzKVxuICAgICAgICAgIC5yZWdpc3RlclRyYWl0KC4uLnBsdWdpbi5pdGVtcy50cmFpdHMpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBlbnRpdGllcyBmb3IgdGhlIHdvcmxkXG4gICAgICAgIHdvcmxkLmVudGl0eVBhbGV0dGVcbiAgICAgICAgICAucmVnaXN0ZXJUeXBlKC4uLnBsdWdpbi5lbnRpdGllcy50eXBlcylcbiAgICAgICAgICAucmVnaXN0ZXJUcmFpdCguLi5wbHVnaW4uZW50aXRpZXMudHJhaXRzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW5zIHNob3VsZCBiZSBpbml0aWFsaXplZFxuICAgIGlmICh0aGlzLnByb3BlcnRpZXMuaW5pdGlhbGl6ZSkgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2lucyBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUodGhpcy5wYXRoKSkpXG4gICAgICAvLyBJZiBub3QsIGNyZWF0ZSB0aGUgcGx1Z2lucyBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVhZCBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgY29uc3QgZW50cmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pO1xuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGZpbGVzIHRoYXQgaGF2ZSBhIC5wbHVnaW4gZXh0ZW5zaW9uXG4gICAgY29uc3QgYnVuZGxlcyA9IGVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+XG4gICAgICBkaXJlbnQuaXNGaWxlKCkgPyBkaXJlbnQubmFtZS5lbmRzV2l0aChcIi5wbHVnaW5cIikgOiBmYWxzZVxuICAgICk7XG5cbiAgICAvLyBBcnJheSB0byBob2xkIHRoZSBvcmRlcmVkIHBsdWdpbnNcbiAgICBjb25zdCBvcmRlcmVkUGx1Z2luczogQXJyYXk8UGx1Z2luPiA9IFtdO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgYnVuZGxlZCBwbHVnaW5zLCBhbmQgaW1wb3J0IHRoZW1cbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBidW5kbGVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgLnBsdWdpbiBmaWxlIGFuZCBpbmZsYXRlIGl0LCBhbmQgY3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW1cbiAgICAgICAgY29uc3QgYnVmZmVyID0gaW5mbGF0ZVN5bmMocmVhZEZpbGVTeW5jKHBhdGgpKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBsdWdpbiBoZWFkZXIgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgIGNvbnN0IHR5cGUgPSBzdHJlYW0ucmVhZEJ5dGUoKSBhcyBQbHVnaW5UeXBlIHwgUGx1Z2luSGVhZGVyO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc05vUmVzb3VyY2VzOiB7XG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4IGZpbGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCkudG9TdHJpbmcoXCJ1dGYtOFwiKTtcblxuICAgICAgICAgICAgLy8gTG9hZCB0aGUgcGx1Z2luIGZyb20gdGhlIHRleHQgc291cmNlXG4gICAgICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLmxvYWRGcm9tVGV4dFNvdXJjZShwYXRoLCBpbmRleCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiB0byB0aGUgb3JkZXJlZCBwbHVnaW5zIGFycmF5XG4gICAgICAgICAgICBpZiAocGx1Z2luKSBvcmRlcmVkUGx1Z2lucy5wdXNoKHBsdWdpbik7XG5cbiAgICAgICAgICAgIC8vIEJyZWFrIG91dCBvZiB0aGUgc3dpdGNoIHN0YXRlbWVudFxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSBQbHVnaW5IZWFkZXIuSGFzUmVzb3VyY2VzOiB7XG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4IGZpbGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCkudG9TdHJpbmcoXCJ1dGYtOFwiKTtcblxuICAgICAgICAgICAgLy8gTG9hZCB0aGUgcGx1Z2luIGZyb20gdGhlIHRleHQgc291cmNlXG4gICAgICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLmxvYWRGcm9tVGV4dFNvdXJjZShwYXRoLCBpbmRleCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gd2FzIGxvYWRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgICAgIGlmICghcGx1Z2luKSBicmVhaztcblxuICAgICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIHRvIHRoZSBvcmRlcmVkIHBsdWdpbnMgYXJyYXlcbiAgICAgICAgICAgIG9yZGVyZWRQbHVnaW5zLnB1c2gocGx1Z2luKTtcblxuICAgICAgICAgICAgLy8gUmVhZCB0aGUgYW1vdW50IG9mIHJlc291cmNlcyBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgIGNvbnN0IHJlc291cmNlcyA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlc291cmNlcywgYW5kIHJlYWQgdGhlbSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzb3VyY2VzOyBpKyspIHtcbiAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byByZWFkIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCk7XG5cbiAgICAgICAgICAgICAgICAvLyBMb2FkIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIGJ1ZmZlclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5zZXJlbml0eS5yZXNvdXJjZXMubG9hZEZyb21aaXAoYnVmZmVyKTtcblxuICAgICAgICAgICAgICAgIC8vIExvZyB0aGUgc3VjY2Vzc2Z1bCBsb2FkIG9mIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgICAgICAgcGx1Z2luLmxvZ2dlci5zdWNjZXNzKFxuICAgICAgICAgICAgICAgICAgYExvYWRlZCByZXNvdXJjZSBwYWNrIMKndSR7cmVzb3VyY2UubmFtZX3Cp3IgKMKnOCR7cmVzb3VyY2UudXVpZH3Cp3IpLmBcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSByZXNvdXJjZSBwYWNrIHRvIHRoZSBwbHVnaW4gcmVzb3VyY2VzIHNldFxuICAgICAgICAgICAgICAgIHBsdWdpbi5yZXNvdXJjZXMuYWRkKHJlc291cmNlKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9nIHRoZSBlcnJvciBpZiB0aGUgcmVzb3VyY2UgcGFjayBmYWlsZWQgdG8gbG9hZFxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHJlc291cmNlIHBhY2sgwqc4JHtyZWxhdGl2ZShcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKVxuICAgICAgICAgICAgICAgICAgKX3Cp3IgZm9yIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnci5gLFxuICAgICAgICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERFUFJFQ0FURUQ6IEV2ZW50dWFsbHkgcmVtb3ZlIHN1cHBvcnQgZm9yIHRoZXNlIHBsdWdpbiB0eXBlc1xuICAgICAgICAgIGNhc2UgUGx1Z2luVHlwZS5BZGRvbjoge1xuICAgICAgICAgICAgLy8gV2Ugd2lsbCBoYW5kbGUgYWRkb24gcGx1Z2lucywgYnV0IG1lbnRpb24gdGhhdCB0aGV5IGFyZSBkZXByZWNhdGVkXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgVGhlIHBsdWdpbiDCpzEke3JlbGF0aXZlKFxuICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKVxuICAgICAgICAgICAgICApfcKnciBpcyB1c2luZyBhIGRlcHJlY2F0ZWQgcGx1Z2luIHR5cGUgKEFkZG9uKS4gUGxlYXNlIHVwZGF0ZSB0aGUgcGx1Z2luIHRvIHVzZSB0aGUgbmV3IHBsdWdpbiBzeXN0ZW0uYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZFJlbWFpbmluZ0J1ZmZlcigpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAgIC8vIExvYWQgdGhlIHBsdWdpbiBmcm9tIHRoZSB0ZXh0IHNvdXJjZVxuICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gdG8gdGhlIG9yZGVyZWQgcGx1Z2lucyBhcnJheVxuICAgICAgICAgICAgaWYgKHBsdWdpbikgb3JkZXJlZFBsdWdpbnMucHVzaChwbHVnaW4pO1xuXG4gICAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERFUFJFQ0FURUQ6IEV2ZW50dWFsbHkgcmVtb3ZlIHN1cHBvcnQgZm9yIHRoZXNlIHBsdWdpbiB0eXBlc1xuICAgICAgICAgIGNhc2UgUGx1Z2luVHlwZS5BcGk6IHtcbiAgICAgICAgICAgIC8vIFdlIG5vIGxvbmdlciBzdXBwb3J0IEFQSSBwbHVnaW5zXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYFRoZSBwbHVnaW4gwqcxJHtyZWxhdGl2ZShcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSlcbiAgICAgICAgICAgICAgKX3Cp3IgaXMgdXNpbmcgYSBkZXByZWNhdGVkIHBsdWdpbiB0eXBlIChBUEkpLiBBUEkgcGx1Z2lucyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gUGxlYXNlIHVwZGF0ZSB0aGUgcGx1Z2luIHRvIHVzZSB0aGUgbmV3IHBsdWdpbiBzeXN0ZW0uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgZGlyZWN0b3JpZXMgZnJvbSB0aGUgZW50cmllc1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gcmVhZGRpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgfSkuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGRpcmVjdG9yaWVzLCBjaGVja2luZyBpZiB0aGV5IGFyZSB2YWxpZCBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBkaXJlY3Rvcnkgb2YgZGlyZWN0b3JpZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhIHBhY2thZ2UuanNvbiBmaWxlLCBpZiBub3QsIHNraXAgdGhlIHBsdWdpblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgICByZWFkRmlsZVN5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICAgICApIGFzIFBsdWdpblBhY2thZ2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIG1hbmlmZXN0Lm1haW4pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlZCBlbnRyeSBwb2ludCBpcyB2YWxpZFxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBtYWluKSkpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCp3Uke21hbmlmZXN0Lm5hbWUgPz8gXCJ1bmtub3duLXBsdWdpblwifcKnOEDCp3Uke21hbmlmZXN0LnZlcnNpb24gPz8gXCJ1bmtub3duLXZlcnNpb25cIn3Cp3IsIHRoZSBtYWluIGVudHJ5IHBhdGggXCLCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUocGF0aCwgbWFpbikpfcKnclwiIHdhcyBub3QgZm91bmQgaW4gdGhlIGRpcmVjdG9yeS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocmVzb2x2ZShwYXRoLCBtYWluKSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKndSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIExpbmsgdGhlIG1vZHVsZSB0byB0aGUgcGlwZWxpbmVcbiAgICAgICAgdGhpcy5saW5rTW9kdWxlKHBsdWdpbi5pZGVudGlmaWVyLCBtb2R1bGUpO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gdG8gdGhlIG9yZGVyZWQgcGx1Z2lucyBhcnJheVxuICAgICAgICBvcmRlcmVkUGx1Z2lucy5wdXNoKHBsdWdpbik7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgYSBcInJlc291cmNlX3BhY2tzXCIgZGlyZWN0b3J5IGV4aXN0cyBpbiB0aGUgcGx1Z2luXG4gICAgICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHBhdGgsIFwicmVzb3VyY2VfcGFja3NcIikpKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIHRoZSByZXNvdXJjZV9wYWNrcyBkaXJlY3RvcnlcbiAgICAgICAgICBta2RpclN5bmMocmVzb2x2ZShwYXRoLCBcInJlc291cmNlX3BhY2tzXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSByZXNvdXJjZV9wYWNrIGRpcmVjdG9yeSwgb25seSBpbmNsdWRpbmcgZGlyZWN0b3JpZXNcbiAgICAgICAgY29uc3QgcmVzb3VyY2VzID0gcmVhZGRpclN5bmMocmVzb2x2ZShwYXRoLCBcInJlc291cmNlX3BhY2tzXCIpLCB7XG4gICAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgICAgICB9KS5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRGlyZWN0b3J5KCkpO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlc291cmNlIHBhY2sgZGlyZWN0b3JpZXMsIGFuZCBhdHRlbXB0IHRvIGxvYWQgdGhlbVxuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuICAgICAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcmVzb3VyY2UgcGFja1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBSZWFkIHRoZSByZXNvdXJjZSBwYWNrLCBhbmQgYWRkIGl0IHRvIHRoZSBzZXJlbml0eSByZXNvdXJjZXNcbiAgICAgICAgICAgIGNvbnN0IHBhY2sgPSB0aGlzLnNlcmVuaXR5LnJlc291cmNlcy5sb2FkRnJvbVBhdGgoXG4gICAgICAgICAgICAgIHJlc29sdmUocGF0aCwgXCJyZXNvdXJjZV9wYWNrc1wiLCByZXNvdXJjZS5uYW1lKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gTG9nIHRoZSBzdWNjZXNzZnVsIGxvYWQgb2YgdGhlIHJlc291cmNlIHBhY2tcbiAgICAgICAgICAgIHBsdWdpbi5sb2dnZXIuc3VjY2VzcyhcbiAgICAgICAgICAgICAgYExvYWRlZCByZXNvdXJjZSBwYWNrIMKndSR7cGFjay5uYW1lfcKnciAowqc4JHtwYWNrLnV1aWR9wqdyKS5gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBBZGQgdGhlIHJlc291cmNlIHBhY2sgdG8gdGhlIHBsdWdpbiByZXNvdXJjZXMgc2V0XG4gICAgICAgICAgICBwbHVnaW4ucmVzb3VyY2VzLmFkZChwYWNrKTtcbiAgICAgICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgICAgIC8vIExvZyB0aGUgZXJyb3IgaWYgdGhlIHJlc291cmNlIHBhY2sgZmFpbGVkIHRvIGxvYWRcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2UgcGFjayDCpzgke3JlbGF0aXZlKFxuICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShwYXRoLCBcInJlc291cmNlX3BhY2tzXCIsIHJlc291cmNlLm5hbWUpXG4gICAgICAgICAgICAgICl9wqdyIGZvciBwbHVnaW4gwqcxJHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IuYCxcbiAgICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIFwiJHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHRoaXMucGF0aCwgZGlyZWN0b3J5Lm5hbWUpKX1cIiwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNvcnQgdGhlIHBsdWdpbnMgYnkgdGhlaXIgcHJpb3JpdHlcbiAgICBvcmRlcmVkUGx1Z2lucy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAvLyBTb3J0IGJ5IHByaW9yaXR5IGZpcnN0XG4gICAgICBpZiAoYS5wcmlvcml0eSAhPT0gYi5wcmlvcml0eSkge1xuICAgICAgICByZXR1cm4gYi5wcmlvcml0eSAtIGEucHJpb3JpdHk7IC8vIEhpZ2hlciBwcmlvcml0eSBjb21lcyBmaXJzdFxuICAgICAgfVxuXG4gICAgICAvLyBJZiBwcmlvcml0eSBpcyB0aGUgc2FtZSwgc29ydCBieSBpZGVudGlmaWVyIGFscGhhYmV0aWNhbGx5XG4gICAgICBpZiAoYS5pZGVudGlmaWVyIDwgYi5pZGVudGlmaWVyKSByZXR1cm4gLTE7XG4gICAgICBpZiAoYS5pZGVudGlmaWVyID4gYi5pZGVudGlmaWVyKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcGx1Z2lucywgYW5kIGluaXRpYWxpemUgdGhlbVxuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIG9yZGVyZWRQbHVnaW5zKSB7XG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW4sIGFuZCBiaW5kIHRoZSBldmVudHNcbiAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcbiAgICAgIHRoaXMuYmluZEV2ZW50cyhwbHVnaW4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RhcnQoKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgdXAgYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TdGFydFVwKHBsdWdpbik7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gRGVsZXRlIGFsbCB0aGUgdGVtcG9yYXJ5IGZpbGVzXG4gICAgZm9yIChjb25zdCB0ZW1wUGF0aCBvZiB0aGlzLnRlbXBQYXRocykge1xuICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgdW5saW5rU3luYyh0ZW1wUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBwbHVnaW4gZnJvbSBhIHRleHQgc291cmNlLlxuICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2UgY29kZSBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gaXNCdW5kbGVkIFdoZXRoZXIgdGhlIHBsdWdpbiBpcyBidW5kbGVkIG9yIG5vdC5cbiAgICovXG4gIHB1YmxpYyBsb2FkRnJvbVRleHRTb3VyY2UoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIHNvdXJjZTogc3RyaW5nLFxuICAgIGlzQnVuZGxlZCA9IGZhbHNlXG4gICk6IFBsdWdpbiB8IG51bGwge1xuICAgIC8vIFdyaXRlIHRoZSBzb3VyY2UgdG8gdGhlIHRlbXBvcmFyeSBwYXRoXG4gICAgd3JpdGVGaWxlU3luYyhyZXNvbHZlKHBhdGguc2xpY2UoMCwgLTcpKSwgc291cmNlKTtcblxuICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgdHJ5IHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gaW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHJlc29sdmUocGF0aC5zbGljZSgwLCAtNykpKTtcblxuICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAvLyBMb2cgdGhlIHdhcm5pbmcgdGhhdCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgdW5saW5rU3luYyhyZXNvbHZlKHBhdGguc2xpY2UoMCwgLTcpKSk7XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgcGx1Z2luLnBhdGggPSByZXNvbHZlKHBhdGgpO1xuICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IGlzQnVuZGxlZDtcblxuICAgICAgLy8gTGluayB0aGUgbW9kdWxlIHRvIHRoZSBwaXBlbGluZVxuICAgICAgdGhpcy5saW5rTW9kdWxlKHBsdWdpbi5pZGVudGlmaWVyLCBtb2R1bGUpO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgIHRoaXMucGx1Z2lucy5zZXQocGx1Z2luLmlkZW50aWZpZXIsIHBsdWdpbik7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgIC8vIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgIHVubGlua1N5bmMocmVzb2x2ZShwYXRoLnNsaWNlKDAsIC03KSkpO1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIHBsdWdpblxuICAgICAgcmV0dXJuIHBsdWdpbjtcbiAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgcmVhc29uXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICB1bmxpbmtTeW5jKHJlc29sdmUocGF0aC5zbGljZSgwLCAtNykpKTtcblxuICAgIC8vIFJldHVybiBudWxsIGlmIHRoZSBwbHVnaW4gZmFpbGVkIHRvIGxvYWRcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyByZWxvYWQocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gdGhlIHBsdWdpblxuICAgIHBsdWdpbi5vblNodXREb3duKHBsdWdpbik7XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBsdWdpbiBmcm9tIHRoZSBwbHVnaW5zIG1hcFxuICAgIHRoaXMucGx1Z2lucy5kZWxldGUocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgLy8gR2V0IHRoZSBwbHVnaW4gcGF0aFxuICAgIGNvbnN0IHBhdGggPSBwbHVnaW4ucGF0aDtcblxuICAgIC8vIERlbGV0ZSB0aGUgcmVxdWlyZSBjYWNoZSBmb3IgdGhlIHBsdWdpblxuICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW3JlcXVpcmUucmVzb2x2ZShwYXRoKV07XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBsdWdpbiBmcm9tIHRoZSBzZXJlbml0eSBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkucmVtb3ZlUGF0aChwYXRoKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlc291cmNlcyBpbiB0aGUgcGx1Z2luLCBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc2VyZW5pdHkgaW5zdGFuY2VcbiAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHBsdWdpbi5yZXNvdXJjZXMpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBzZXJlbml0eSBpbnN0YW5jZVxuICAgICAgdGhpcy5zZXJlbml0eS5yZXNvdXJjZXMucGFja3MuZGVsZXRlKHJlc291cmNlLnV1aWQpO1xuICAgIH1cblxuICAgIGlmIChwbHVnaW4uaXNCdW5kbGVkKSB7XG4gICAgICAvLyBSZWFkIHRoZSAucGx1Z2luIGZpbGUgYW5kIGluZmxhdGUgaXQsIGFuZCBjcmVhdGUgYSBuZXcgYmluYXJ5IHN0cmVhbVxuICAgICAgY29uc3QgYnVmZmVyID0gaW5mbGF0ZVN5bmMocmVhZEZpbGVTeW5jKHBhdGgpKTtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW0gZnJvbSB0aGUgYnVmZmVyXG4gICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKGJ1ZmZlcik7XG5cbiAgICAgIC8vIFJlYWQgdGhlIHBsdWdpbiBoZWFkZXIgZnJvbSB0aGUgc3RyZWFtXG4gICAgICBjb25zdCB0eXBlID0gc3RyZWFtLnJlYWRCeXRlKCkgYXMgUGx1Z2luVHlwZSB8IFBsdWdpbkhlYWRlcjtcblxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc05vUmVzb3VyY2VzOiB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAvLyBMb2FkIHRoZSBwbHVnaW4gZnJvbSB0aGUgdGV4dCBzb3VyY2VcbiAgICAgICAgICBjb25zdCBuZXdQbHVnaW4gPSB0aGlzLmxvYWRGcm9tVGV4dFNvdXJjZShwYXRoLCBpbmRleCwgdHJ1ZSk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIHdhcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAgICAgaWYgKCFuZXdQbHVnaW4pIGJyZWFrO1xuXG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luLCBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICAgICAgbmV3UGx1Z2luLm9uSW5pdGlhbGl6ZShuZXdQbHVnaW4pO1xuICAgICAgICAgIHRoaXMuYmluZEV2ZW50cyhuZXdQbHVnaW4pO1xuXG4gICAgICAgICAgLy8gU3RhcnQgdXAgdGhlIHBsdWdpblxuICAgICAgICAgIG5ld1BsdWdpbi5vblN0YXJ0VXAobmV3UGx1Z2luKTtcblxuICAgICAgICAgIC8vIEJyZWFrIG91dCBvZiB0aGUgc3dpdGNoIHN0YXRlbWVudFxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBQbHVnaW5IZWFkZXIuSGFzUmVzb3VyY2VzOiB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAvLyBMb2FkIHRoZSBwbHVnaW4gZnJvbSB0aGUgdGV4dCBzb3VyY2VcbiAgICAgICAgICBjb25zdCBuZXdQbHVnaW4gPSB0aGlzLmxvYWRGcm9tVGV4dFNvdXJjZShwYXRoLCBpbmRleCwgdHJ1ZSk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIHdhcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAgICAgaWYgKCFuZXdQbHVnaW4pIGJyZWFrO1xuXG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luLCBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICAgICAgbmV3UGx1Z2luLm9uSW5pdGlhbGl6ZShuZXdQbHVnaW4pO1xuICAgICAgICAgIHRoaXMuYmluZEV2ZW50cyhuZXdQbHVnaW4pO1xuXG4gICAgICAgICAgLy8gU3RhcnQgdXAgdGhlIHBsdWdpblxuICAgICAgICAgIG5ld1BsdWdpbi5vblN0YXJ0VXAobmV3UGx1Z2luKTtcblxuICAgICAgICAgIC8vIFJlYWQgdGhlIGFtb3VudCBvZiByZXNvdXJjZXMgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgcmVzb3VyY2VzID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcblxuICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlc291cmNlcywgYW5kIHJlYWQgdGhlbSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc291cmNlczsgaSsrKSB7XG4gICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHJlc291cmNlIHBhY2tcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIC8vIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcblxuICAgICAgICAgICAgICAvLyBSZWFkIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpO1xuXG4gICAgICAgICAgICAgIC8vIExvYWQgdGhlIHJlc291cmNlIHBhY2sgZnJvbSB0aGUgYnVmZmVyXG4gICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5zZXJlbml0eS5yZXNvdXJjZXMubG9hZEZyb21aaXAoYnVmZmVyKTtcblxuICAgICAgICAgICAgICAvLyBMb2cgdGhlIHN1Y2Nlc3NmdWwgbG9hZCBvZiB0aGUgcmVzb3VyY2UgcGFja1xuICAgICAgICAgICAgICBuZXdQbHVnaW4ubG9nZ2VyLnN1Y2Nlc3MoXG4gICAgICAgICAgICAgICAgYExvYWRlZCByZXNvdXJjZSBwYWNrIMKndSR7cmVzb3VyY2UubmFtZX3Cp3IgKMKnOCR7cmVzb3VyY2UudXVpZH3Cp3IpLmBcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAvLyBBZGQgdGhlIHJlc291cmNlIHBhY2sgdG8gdGhlIHBsdWdpbiByZXNvdXJjZXMgc2V0XG4gICAgICAgICAgICAgIG5ld1BsdWdpbi5yZXNvdXJjZXMuYWRkKHJlc291cmNlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgICAvLyBMb2cgdGhlIGVycm9yIGlmIHRoZSByZXNvdXJjZSBwYWNrIGZhaWxlZCB0byBsb2FkXG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCByZXNvdXJjZSBwYWNrIMKnOCR7cmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIHBhdGgpXG4gICAgICAgICAgICAgICAgKX3Cp3IgZm9yIHBsdWdpbiDCpzEke25ld1BsdWdpbi5pZGVudGlmaWVyfcKnci5gLFxuICAgICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZWFkIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgICByZWFkRmlsZVN5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICAgKSBhcyBQbHVnaW5QYWNrYWdlO1xuXG4gICAgICAvLyBHZXQgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBwbHVnaW5cbiAgICAgIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIG1hbmlmZXN0Lm1haW4pO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZWQgZW50cnkgcG9pbnQgaXMgdmFsaWRcbiAgICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHBhdGgsIG1haW4pKSkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBVbmFibGUgdG8gcmVsb2FkIHBsdWdpbiDCp3Uke21hbmlmZXN0Lm5hbWUgPz8gXCJ1bmtub3duLXBsdWdpblwifcKnOEDCp3Uke21hbmlmZXN0LnZlcnNpb24gPz8gXCJ1bmtub3duLXZlcnNpb25cIn3Cp3IsIHRoZSBtYWluIGVudHJ5IHBhdGggXCLCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUocGF0aCwgbWFpbikpfcKnclwiIHdhcyBub3QgZm91bmQgaW4gdGhlIGRpcmVjdG9yeS5gXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQXR0ZW1wdCB0byBpbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcbiAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocmVzb2x2ZShwYXRoLCBtYWluKSk7XG5cbiAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgY29uc3QgbmV3UGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgIG5ld1BsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICBuZXdQbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgbmV3UGx1Z2luLnBhdGggPSBwYXRoO1xuICAgICAgbmV3UGx1Z2luLmlzQnVuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBMaW5rIHRoZSBtb2R1bGUgdG8gdGhlIHBpcGVsaW5lXG4gICAgICB0aGlzLmxpbmtNb2R1bGUobmV3UGx1Z2luLmlkZW50aWZpZXIsIG1vZHVsZSk7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgdGhpcy5wbHVnaW5zLnNldChuZXdQbHVnaW4uaWRlbnRpZmllciwgbmV3UGx1Z2luKTtcblxuICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgZW51bVxuICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKG5ld1BsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luLCBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICBuZXdQbHVnaW4ub25Jbml0aWFsaXplKG5ld1BsdWdpbik7XG4gICAgICB0aGlzLmJpbmRFdmVudHMobmV3UGx1Z2luKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYnVuZGxlKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZVxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcblxuICAgIC8vIERldGVybWluZSB0aGUgcGx1Z2luIGhlYWRlciBiYXNlZCBvbiB0aGUgcmVzb3VyY2VzXG4gICAgY29uc3QgaGVhZGVyID1cbiAgICAgIHBsdWdpbi5yZXNvdXJjZXMuc2l6ZSA+IDBcbiAgICAgICAgPyBQbHVnaW5IZWFkZXIuSGFzUmVzb3VyY2VzXG4gICAgICAgIDogUGx1Z2luSGVhZGVyLkhhc05vUmVzb3VyY2VzO1xuXG4gICAgLy8gV3JpdGUgdGhlIHBsdWdpbiB0eXBlIHRvIHRoZSBzdHJlYW1cbiAgICBzdHJlYW0ud3JpdGVCeXRlKGhlYWRlcik7XG5cbiAgICAvLyBTd2l0Y2ggYmFzZWQgb24gdGhlIHBsdWdpbiBoZWFkZXJcbiAgICBzd2l0Y2ggKGhlYWRlcikge1xuICAgICAgY2FzZSBQbHVnaW5IZWFkZXIuSGFzTm9SZXNvdXJjZXM6IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW4ncyBjb21waWxlZCBpbmRleCBmaWxlXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHBsdWdpbi5wYXRoLCBcImRpc3RcIiwgXCJpbmRleC5qc1wiKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBpbmRleCA9IHJlYWRGaWxlU3luYyhwYXRoKTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgc3RyZWFtLndyaXRlVmFySW50KGluZGV4LmJ5dGVMZW5ndGgpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBpbmRleCBmaWxlIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGluZGV4KTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgQmluYXJ5U3RyZWFtIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0tdiR7cGx1Z2luLnZlcnNpb259LnBsdWdpbmApLFxuICAgICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc1Jlc291cmNlczoge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpbidzIGNvbXBpbGVkIGluZGV4IGZpbGVcbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUocGx1Z2luLnBhdGgsIFwiZGlzdFwiLCBcImluZGV4LmpzXCIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIGluZGV4IGZpbGUgZnJvbSB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IGluZGV4ID0gcmVhZEZpbGVTeW5jKHBhdGgpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4IGZpbGUgdG8gdGhlIHN0cmVhbVxuICAgICAgICBzdHJlYW0ud3JpdGVWYXJJbnQoaW5kZXguYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIGluZGV4IGZpbGUgdG8gdGhlIHN0cmVhbVxuICAgICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoaW5kZXgpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBhbW91bnQgb2YgcmVzb3VyY2VzIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgc3RyZWFtLndyaXRlVmFySW50KHBsdWdpbi5yZXNvdXJjZXMuc2l6ZSk7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVzb3VyY2VzLCBhbmQgd3JpdGUgdGhlbSB0byB0aGUgc3RyZWFtXG4gICAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcGx1Z2luLnJlc291cmNlcykge1xuICAgICAgICAgIC8vIENvbXByZXNzIHRoZSByZXNvdXJjZSBwYWNrIGludG8gYSBidWZmZXJcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSByZXNvdXJjZS5jb21wcmVzcygpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIGxlbmd0aCBvZiB0aGUgcmVzb3VyY2UgcGFjayB0byB0aGUgc3RyZWFtXG4gICAgICAgICAgc3RyZWFtLndyaXRlVmFySW50KGJ1ZmZlci5ieXRlTGVuZ3RoKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSByZXNvdXJjZSBwYWNrIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoYnVmZmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBCaW5hcnlTdHJlYW0gdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS12JHtwbHVnaW4udmVyc2lvbn0ucGx1Z2luYCksXG4gICAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEJyZWFrIG91dCBvZiB0aGUgc3dpdGNoIHN0YXRlbWVudFxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYmluZEV2ZW50cyhwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcHJvdG90eXBlIG9mIHRoZSBwbHVnaW5cbiAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocGx1Z2luKTtcblxuICAgIC8vIEdldCB0aGUgb2JqZWN0IGtleXMgZnJvbSB0aGUgcGx1Z2luXG4gICAgY29uc3QgcGx1Z2luS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvdHlwZSk7XG5cbiAgICAvLyBHZXQgdGhlIHdvcmxkIGV2ZW50IGtleXMsIGFuZCBzbGljZSB0aGVtIGluIGhhbGZcbiAgICBsZXQgZXZlbnRLZXlzID0gT2JqZWN0LmtleXMoV29ybGRFdmVudCk7XG4gICAgZXZlbnRLZXlzID0gZXZlbnRLZXlzLnNsaWNlKGV2ZW50S2V5cy5sZW5ndGggLyAyKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGV2ZW50IGtleXNcbiAgICBmb3IgKGNvbnN0IGV2ZW50S2V5IG9mIGV2ZW50S2V5cykge1xuICAgICAgLy8gR2V0IHRoZSBpbmRleCBvZiB0aGUgZXZlbnQga2V5XG4gICAgICBjb25zdCBpbmRleCA9IGV2ZW50S2V5cy5pbmRleE9mKGV2ZW50S2V5KSBhcyBXb3JsZEV2ZW50O1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbnkgXCJvblwiIGV2ZW50IGtleXNcbiAgICAgIGlmIChwbHVnaW5LZXlzLmluY2x1ZGVzKFwib25cIiArIGV2ZW50S2V5KSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBldmVudCBrZXlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwbHVnaW5bKFwib25cIiArIGV2ZW50S2V5KSBhcyBrZXlvZiBQbHVnaW5dO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAvLyBCaW5kIHRoZSBldmVudCB0byB0aGUgcGx1Z2luXG4gICAgICAgICAgdGhpcy5zZXJlbml0eS5vbihpbmRleCwgdmFsdWUuYmluZChwbHVnaW4pIGFzICgpID0+IHZvaWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbnkgXCJiZWZvcmVcIiBldmVudCBrZXlzXG4gICAgICBpZiAocGx1Z2luS2V5cy5pbmNsdWRlcyhcImJlZm9yZVwiICsgZXZlbnRLZXkpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV2ZW50IGtleVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHBsdWdpblsoXCJiZWZvcmVcIiArIGV2ZW50S2V5KSBhcyBrZXlvZiBQbHVnaW5dO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAvLyBCaW5kIHRoZSBldmVudCB0byB0aGUgcGx1Z2luXG4gICAgICAgICAgdGhpcy5zZXJlbml0eS5iZWZvcmUoaW5kZXgsIHZhbHVlLmJpbmQocGx1Z2luKSBhcyAoKSA9PiBib29sZWFuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYW55IFwiYWZ0ZXJcIiBldmVudCBrZXlzXG4gICAgICBpZiAocGx1Z2luS2V5cy5pbmNsdWRlcyhcImFmdGVyXCIgKyBldmVudEtleSkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXZlbnQga2V5XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGx1Z2luWyhcImFmdGVyXCIgKyBldmVudEtleSkgYXMga2V5b2YgUGx1Z2luXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gdGhlIHBsdWdpblxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkuYWZ0ZXIoaW5kZXgsIHZhbHVlLmJpbmQocGx1Z2luKSBhcyAoKSA9PiB2b2lkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGluayBhIG1vZHVsZSB0byB0aGUgcGlwZWxpbmUuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gbGluay5cbiAgICogQHBhcmFtIG1vZHVsZSBUaGUgbW9kdWxlIHRvIGxpbmsuXG4gICAqL1xuICBwdWJsaWMgbGlua01vZHVsZShuYW1lOiBzdHJpbmcsIG1vZHVsZTogdW5rbm93bik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcnVudGltZSBvZiB0aGUgc2VydmVyXG4gICAgY29uc3QgaXNCdW4gPSBwcm9jZXNzLnZlcnNpb25zLmJ1biA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlO1xuXG4gICAgLy8gTW9kdWxlIGxpbmtpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gQnVuXG4gICAgaWYgKCFpc0J1bikgcmV0dXJuO1xuXG4gICAgLy8gSW5qZWN0IHRoZSBtb2R1bGUgaW50byB0aGUgQnVuIHBsdWdpbiBzeXN0ZW1cbiAgICBCdW4ucGx1Z2luKHtcbiAgICAgIG5hbWU6IGBzZXJlbml0eWpzLnBsdWdpbi4ke25hbWV9YCxcbiAgICAgIHNldHVwKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5tb2R1bGUobmFtZSwgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBleHBvcnRzOiBtb2R1bGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICBsb2FkZXI6IFwib2JqZWN0XCJcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgeyBQaXBlbGluZSwgRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyB9O1xuIiwgImltcG9ydCB7IHJlbGF0aXZlIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgV29ybGQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5pbXBvcnQgeyBQaXBlbGluZSB9IGZyb20gXCIuLi9waXBlbGluZVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5BY3Rpb25zRW51bSwgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9lbnVtXCI7XG5cbmNvbnN0IHJlZ2lzdGVyID0gKHdvcmxkOiBXb3JsZCwgcGlwZWxpbmU6IFBpcGVsaW5lKSA9PiB7XG4gIHdvcmxkLmNvbW1hbmRQYWxldHRlLnJlZ2lzdGVyKFxuICAgIFwicGx1Z2luc1wiLFxuICAgIFwiSW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBvZiB0aGUgc2VydmVyXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIHBlcm1pc3Npb25zIG9mIHRoZSBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9ucyA9IFtcInNlcmVuaXR5Lm9wZXJhdG9yXCJdO1xuXG4gICAgICAvLyBPdmVybG9hZCBmb3IgbGlzdGluZyB0aGUgcGx1Z2luc1xuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBsaXN0XG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwibGlzdFwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGlwZWxpbmUgaGFzIG5vIHBsdWdpbnNcbiAgICAgICAgICBpZiAocGlwZWxpbmUucGx1Z2lucy5zaXplID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCLCp2NUaGVyZSBhcmUgY3VycmVudCBubyBwbHVnaW5zIGxvYWRlZCBvbiB0aGUgc2VydmVyLlwiXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW5zIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2lucyA9IFsuLi5waXBlbGluZS5wbHVnaW5zLnZhbHVlcygpXTtcblxuICAgICAgICAgIC8vIFByZXBhcmUgdGhlIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gW107XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHBsdWdpbnNcbiAgICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gbmFtZSB0byB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgbWVzc2FnZS5wdXNoKGDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfSB2JHtwbHVnaW4udmVyc2lvbn3Cp3JgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVzc2FnZTogYMKnN0FjdGl2ZSBQbHVnaW5zICgke3BsdWdpbnMubGVuZ3RofSk6wqdyICR7bWVzc2FnZS5qb2luKFwiwqc3LMKnciBcIil9YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bSxcbiAgICAgICAgICBwbHVnaW46IFBsdWdpbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiwgcGx1Z2luIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcInJlbG9hZFwiICYmIGFjdGlvbi5yZXN1bHQgIT09IFwiYnVuZGxlXCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2luSW5zdGFuY2UgPSBwaXBlbGluZS5wbHVnaW5zLmdldChwbHVnaW4ucmVzdWx0IGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIG5vdCBmb3VuZFxuICAgICAgICAgIGlmICghcGx1Z2luSW5zdGFuY2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAke3BsdWdpbi5yZXN1bHR9IGlzIG5vdCBmb3VuZC5gKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgPT09IFwicmVsb2FkXCIpIHtcbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5yZWxvYWQocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgcmVsb2FkZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocGx1Z2luSW5zdGFuY2UuaXNCdW5kbGVkKVxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgYnVuZGxlZFxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFBsdWdpbiAke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9IGNhbm5vdCBiZSBidW5kbGVkLCBhcyBpdCBpcyBhbHJlYWR5IGEgYnVuZGxlZCBwbHVnaW4uYFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBCdW5kbGUgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUuYnVuZGxlKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IGJ1bmRsZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYSwgb3V0cHV0IGZpbGUgd2FzIHBsYWNlZCBhdCDCpzcke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBpcGVsaW5lLnBhdGgpfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG92ZXJsb2FkIG1hdGNoZWQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cIik7XG4gICAgfVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ3VzdG9tRW51bSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbn1cblxuY2xhc3MgUGx1Z2luQWN0aW9uc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5fYWN0aW9uc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXCJsaXN0XCIsIFwicmVsb2FkXCIsIFwiYnVuZGxlXCJdO1xufVxuXG5leHBvcnQgeyBQbHVnaW5zRW51bSwgUGx1Z2luQWN0aW9uc0VudW0gfTtcbiIsICJlbnVtIFBsdWdpbkhlYWRlciB7XG4gIEhhc05vUmVzb3VyY2VzID0gMixcbiAgSGFzUmVzb3VyY2VzID0gM1xufVxuXG5leHBvcnQgeyBQbHVnaW5IZWFkZXIgfTtcbiIsICIvKipcbiAqIFRoZSBwcmlvcml0eSBvZiBhIHBsdWdpbiBkZXRlcm1pbmVzIHdoZW4gaXQgd2lsbCBiZSBsb2FkZWQgaW4gcmVsYXRpb24gdG8gb3RoZXIgcGx1Z2lucy5cbiAqIEEgcGx1Z2luIHdpdGggYSBoaWdoZXIgcHJpb3JpdHkgd2lsbCBiZSBsb2FkZWQgYmVmb3JlIGEgcGx1Z2luIHdpdGggYSBsb3dlciBwcmlvcml0eS5cbiAqIFRoaXMgaXMgdXNlZnVsIGZvciBwbHVnaW5zIHRoYXQgbmVlZCB0byBiZSBsb2FkZWQgYmVmb3JlIG9yIGFmdGVyIG90aGVyIHBsdWdpbnMuXG4gKiBGb3IgZXhhbXBsZSwgYSBsaWJyYXJ5IHBsdWdpbiBtYXkgbmVlZCB0byBiZSBsb2FkZWQgYmVmb3JlIGEgcGx1Z2luIHRoYXQgdXNlcyBpdCxcbiAqIG9yIGEgcGx1Z2luIHRoYXQgbW9kaWZpZXMgdGhlIGJlaGF2aW9yIG9mIHNlcmVuaXR5J3MgQVBJcyBtYXkgbmVlZCB0byBiZSBsb2FkZWQgYWZ0ZXIgaXQuXG4gKiBUaGUgZGVmYXVsdCBwcmlvcml0eSBpcyBOb3JtYWwuXG4gKi9cbmVudW0gUGx1Z2luUHJpb3JpdHkge1xuICAvKipcbiAgICogQSBsb3cgcHJpb3JpdHkgcGx1Z2luIHdpbGwgYmUgbG9hZGVkIGFmdGVyIG90aGVyIHBsdWdpbnMuXG4gICAqIFVzZWZ1bCBmb3IgcmVhY3RpbmcgdG8gY2hhbmdlcyBvciBmaW5hbCBhZGp1c3RtZW50cy5cbiAgICovXG4gIExvdyxcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgZm9yIGEgcGx1Z2luLlxuICAgKiBTdWl0YWJsZSBmb3Igc3RhbmRhcmQgcGx1Z2luIGJlaGF2aW9yLlxuICAgKi9cbiAgTm9ybWFsLFxuXG4gIC8qKlxuICAgKiBBIGhpZ2ggcHJpb3JpdHkgcGx1Z2luIHdpbGwgYmUgbG9hZGVkIGJlZm9yZSBvdGhlciBwbHVnaW5zLlxuICAgKiBVc2VmdWwgZm9yIGVhcmx5IHNldHVwIG9yIG92ZXJyaWRpbmcgYmVoYXZpb3IuXG4gICAqL1xuICBIaWdoXG59XG5cbmV4cG9ydCB7IFBsdWdpblByaW9yaXR5IH07XG4iLCAiLyoqXG4gKiBUaGUgcGx1Z2luIHR5cGUgZGVjbGFyZXMgdGhlIHVzZSBjYXNlIG9mIHRoZSBwbHVnaW4uXG4gKi9cbmVudW0gUGx1Z2luVHlwZSB7XG4gIC8qKlxuICAgKiBBbiBhZGRvbiBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRob3V0IGFuIGV4cG9zZWQgQVBJLlxuICAgKi9cbiAgQWRkb24sXG5cbiAgLyoqXG4gICAqIEFuIEFQSSBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRoIGFuIGV4cG9zZWQgQVBJIGZvciBvdGhlciBwbHVnaW5zIHRvIHVzZS5cbiAgICovXG4gIEFwaVxufVxuXG5leHBvcnQgeyBQbHVnaW5UeXBlIH07XG4iLCAiaW1wb3J0IHsgUmVzb3VyY2VQYWNrLCBTZXJlbml0eSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dlckNvbG9ycyB9IGZyb20gXCJAc2VyZW5pdHlqcy9sb2dnZXJcIjtcbmltcG9ydCB7IEVtaXR0ZXIgfSBmcm9tIFwiQHNlcmVuaXR5anMvZW1pdHRlclwiO1xuXG5pbXBvcnQgeyBQaXBlbGluZSB9IGZyb20gXCIuL3BpcGVsaW5lXCI7XG5pbXBvcnQgeyBQbHVnaW5FdmVudHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgUGx1Z2luQmxvY2tSZWdpc3RyeSxcbiAgUGx1Z2luRW50aXR5UmVnaXN0cnksXG4gIFBsdWdpbkl0ZW1SZWdpc3RyeVxufSBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuaW1wb3J0IHsgUGx1Z2luUHJpb3JpdHkgfSBmcm9tIFwiLi9lbnVtcy9wcmlvcml0eVwiO1xuXG5pbnRlcmZhY2UgUGx1Z2luT3B0aW9ucyBleHRlbmRzIFBhcnRpYWw8UGx1Z2luRXZlbnRzPiB7XG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwcmlvcml0eTogUGx1Z2luUHJpb3JpdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBsaXN0ZW5lcnMgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICBtYXhMaXN0ZW5lcnM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiAjIEludHJvZHVjdGlvblxuICogUGx1Z2lucyBhcmUgdGhlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBvZiBTZXJlbml0eUpTLlxuICogVGhleSBhcmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdoaWNoIGFsbG93cyB0b3RhbCBjb250cm9sIG92ZXIgdGhlIHNlcnZlci5cbiAqXG4gKiBUaGVyZSBhcmUgMiB0eXBlcyBvZiBwbHVnaW5zIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIGBQbHVnaW5UeXBlYCBlbnVtOiBgQWRkb25gICYgYEFwaWBcbiAqXG4gKiBBZGRvbiBwbHVnaW5zIGFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aG91dCBhbiBleHBvc2VkIEFQSS4gVGhpcyBtZWFucyBleHRlcm5hbCBwbHVnaW5zIGNhbm5vdCBkaXJlY3RseSBpbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIEFQSS5cbiAqIEFwaSBwbHVnaW5zIGFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aCBhbiBleHBvc2VkIEFQSSBmb3Igb3RoZXIgcGx1Z2lucyB0byB1c2UuIFRoaXMgbWVhbnMgZXh0ZXJuYWwgcGx1Z2lucyBjYW4gZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBBUEkuXG4gKlxuICogIyMgQ2xhc3MgRXh0ZW5kaW5nIFBsdWdpblxuICogYGBgdHNcbiAqIGltcG9ydCB7IFBsdWdpbiwgUGx1Z2luVHlwZSwgUGx1Z2luRXZlbnRzIH0gZnJvbSBcIkBzZXJlbml0eWpzL3BsdWdpbnNcIjtcbiAqXG4gKiBjbGFzcyBTYW1wbGVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICogICBwdWJsaWMgcmVhZG9ubHkgdHlwZSA9IFBsdWdpblR5cGUuQWRkb247XG4gKlxuICogICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIoXCJzYW1wbGUtcGx1Z2luXCIsIFwiMS4wLjBcIik7XG4gKiAgIH1cbiAqXG4gKiAgIHB1YmxpYyBvbkluaXRpYWxpemUoKTogdm9pZCB7fVxuICpcbiAqICAgcHVibGljIG9uU3RhcnRVcCgpOiB2b2lkIHt9XG4gKlxuICogICBwdWJsaWMgb25TaHV0RG93bigpOiB2b2lkIHt9XG4gKiB9XG4gKlxuICogZXhwb3J0IGRlZmF1bHQgbmV3IFNhbXBsZVBsdWdpbigpO1xuICogYGBgXG4gKi9cbmNsYXNzIFBsdWdpbjxUID0gdW5rbm93bj4gZXh0ZW5kcyBFbWl0dGVyPFQ+IGltcGxlbWVudHMgUGx1Z2luT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmlvcml0eSBvZiB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBvcmRlciBpbiB3aGljaCBwbHVnaW5zIGFyZSBsb2FkZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJpb3JpdHk6IFBsdWdpblByaW9yaXR5ID0gUGx1Z2luUHJpb3JpdHkuTm9ybWFsO1xuXG4gIC8qKlxuICAgKiBUaGUgYmxvY2sgcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2tzID0gbmV3IFBsdWdpbkJsb2NrUmVnaXN0cnkoKTtcblxuICAvKipcbiAgICogVGhlIGl0ZW0gcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXRlbXMgPSBuZXcgUGx1Z2luSXRlbVJlZ2lzdHJ5KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW50aXRpZXMgPSBuZXcgUGx1Z2luRW50aXR5UmVnaXN0cnkoKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2VzID0gbmV3IFNldDxSZXNvdXJjZVBhY2s+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwYXRoITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGx1Z2luIGlzIGJ1bmRsZWQuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBpc0J1bmRsZWQhOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHBpcGVsaW5lIHRoZSBwbHVnaW4gaXMgaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwaXBlbGluZSE6IFBpcGVsaW5lO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgaW5zdGFuY2Ugb2YgdGhlIHNlcnZlci5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHNlcmVuaXR5ITogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwbHVnaW4gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIHZlcnNpb246IHN0cmluZyxcbiAgICBvcHRpb25zPzogUGFydGlhbDxQbHVnaW5PcHRpb25zPlxuICApIHtcbiAgICAvLyBDYWxsIHRoZSBzdXBlciBtZXRob2Qgd2l0aCB0aGUgbWF4IGxpc3RlbmVyc1xuICAgIHN1cGVyKG9wdGlvbnM/Lm1heExpc3RlbmVycyk7XG5cbiAgICAvLyBTZXQgdGhlIGlkZW50aWZpZXIgYW5kIHZlcnNpb24gb2YgdGhlIHBsdWdpblxuICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIC8vIFNldCB0aGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luXG4gICAgdGhpcy5sb2dnZXIgPVxuICAgICAgb3B0aW9ucz8ubG9nZ2VyID8/XG4gICAgICBuZXcgTG9nZ2VyKGAke2lkZW50aWZpZXJ9QCR7dmVyc2lvbn1gLCBMb2dnZXJDb2xvcnMuQmx1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIG9uIGluaXRpYWxpemUsIHN0YXJ0IHVwLCBhbmQgc2h1dCBkb3duIG9wdGlvbnNcbiAgICBpZiAob3B0aW9ucz8ub25Jbml0aWFsaXplKSB0aGlzLm9uSW5pdGlhbGl6ZSA9IG9wdGlvbnMub25Jbml0aWFsaXplO1xuICAgIGlmIChvcHRpb25zPy5vblN0YXJ0VXApIHRoaXMub25TdGFydFVwID0gb3B0aW9ucy5vblN0YXJ0VXA7XG4gICAgaWYgKG9wdGlvbnM/Lm9uU2h1dERvd24pIHRoaXMub25TaHV0RG93biA9IG9wdGlvbnMub25TaHV0RG93bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgcGx1Z2luIGJ5IGl0cyBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4gdG8gcmVzb2x2ZS5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpbnN0YW5jZSBpZiBmb3VuZCwgb3RoZXJ3aXNlIG51bGwuXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZTxUIGV4dGVuZHMgUGx1Z2luPihpZGVudGlmaWVyOiBzdHJpbmcpOiBUIHwgbnVsbCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBpcGVsaW5lIGlzIGRlZmluZWQuXG4gICAgaWYgKCF0aGlzLnBpcGVsaW5lKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIEdldCB0aGUgcGx1Z2luIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgY29uc3QgcGx1Z2luID0gdGhpcy5waXBlbGluZS5wbHVnaW5zLmdldChpZGVudGlmaWVyKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgZGVmaW5lZFxuICAgIGlmICghcGx1Z2luKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIFJldHVybiB0aGUgcGx1Z2luXG4gICAgcmV0dXJuIHBsdWdpbiBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBpbml0aWFsaXplZC4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25Jbml0aWFsaXplKF9wbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBzdGFydGVkIHVwLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgc3RhcnRlZCB1cC4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25TdGFydFVwKF9wbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBzaHV0IGRvd24uXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzaHV0IGRvd24uICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU2h1dERvd24oX3BsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW4sIFBsdWdpbk9wdGlvbnMgfTtcbiIsICJpbXBvcnQgeyB0eXBlIEJsb2NrVHJhaXQsIEN1c3RvbUJsb2NrVHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbkJsb2NrUmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGJsb2NrIHR5cGVzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZXM6IEFycmF5PEN1c3RvbUJsb2NrVHlwZT4gPSBbXTtcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGJsb2NrIHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEJsb2NrVHJhaXQ+ID0gW107XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGJsb2NrIHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclR5cGUoLi4udHlwZXM6IEFycmF5PEN1c3RvbUJsb2NrVHlwZT4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0eXBlIHRvIHRoZSB0eXBlcyBhcnJheS5cbiAgICB0aGlzLnR5cGVzLnB1c2goLi4udHlwZXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBibG9jayB0eXBlIHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclR5cGUodHlwZTogQ3VzdG9tQmxvY2tUeXBlKTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIHR5cGVzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50eXBlcy5pbmRleE9mKHR5cGUpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0eXBlIGZyb20gdGhlIHR5cGVzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50eXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBibG9jayB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBibG9jayByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRyYWl0KC4uLnRyYWl0czogQXJyYXk8dHlwZW9mIEJsb2NrVHJhaXQ+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHRyYWl0cyBhcnJheS5cbiAgICB0aGlzLnRyYWl0cy5wdXNoKC4uLnRyYWl0cyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gYmxvY2sgdHJhaXQgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBibG9jayByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHJhaXQodHJhaXQ6IHR5cGVvZiBCbG9ja1RyYWl0KTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHRyYWl0IGluIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnRyYWl0cy5pbmRleE9mKHRyYWl0KTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgdHJhaXRzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50cmFpdHMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbkJsb2NrUmVnaXN0cnkgfTtcbiIsICJpbXBvcnQgeyB0eXBlIEl0ZW1TdGFja1RyYWl0LCBDdXN0b21JdGVtVHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbkl0ZW1SZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gaXRlbSB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21JdGVtVHlwZT4gPSBbXTtcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGl0ZW0gdHJhaXRzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHJhaXRzOiBBcnJheTx0eXBlb2YgSXRlbVN0YWNrVHJhaXQ+ID0gW107XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBpdGVtIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gaXRlbSB0eXBlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclR5cGUoLi4udHlwZXM6IEFycmF5PEN1c3RvbUl0ZW1UeXBlPik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHR5cGUgdG8gdGhlIHR5cGVzIGFycmF5LlxuICAgIHRoaXMudHlwZXMucHVzaCguLi50eXBlcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBpdGVtIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gaXRlbSB0eXBlIHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHlwZSh0eXBlOiBDdXN0b21JdGVtVHlwZSk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSB0eXBlcyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHlwZXMuaW5kZXhPZih0eXBlKTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSB0eXBlc1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHlwZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBpdGVtIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBpdGVtIHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUcmFpdCguLi50cmFpdHM6IEFycmF5PHR5cGVvZiBJdGVtU3RhY2tUcmFpdD4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0cmFpdCB0byB0aGUgdHJhaXRzIGFycmF5LlxuICAgIHRoaXMudHJhaXRzLnB1c2goLi4udHJhaXRzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGl0ZW0gdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGl0ZW0gdHJhaXQgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUcmFpdCh0cmFpdDogdHlwZW9mIEl0ZW1TdGFja1RyYWl0KTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHRyYWl0IGluIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnRyYWl0cy5pbmRleE9mKHRyYWl0KTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgdHJhaXRzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50cmFpdHMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbkl0ZW1SZWdpc3RyeSB9O1xuIiwgImltcG9ydCB7IHR5cGUgRW50aXR5VHJhaXQsIEN1c3RvbUVudGl0eVR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5FbnRpdHlSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gZW50aXR5IHR5cGVzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZXM6IEFycmF5PEN1c3RvbUVudGl0eVR5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBlbnRpdHkgdHJhaXRzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHJhaXRzOiBBcnJheTx0eXBlb2YgRW50aXR5VHJhaXQ+ID0gW107XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBlbnRpdHkgdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclR5cGUoLi4udHlwZXM6IEFycmF5PEN1c3RvbUVudGl0eVR5cGU+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHlwZSB0byB0aGUgdHlwZXMgYXJyYXkuXG4gICAgdGhpcy50eXBlcy5wdXNoKC4uLnR5cGVzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGVudGl0eSB0eXBlIHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUeXBlKHR5cGU6IEN1c3RvbUVudGl0eVR5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBlbnRpdHkgdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgRW50aXR5VHJhaXQ+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHRyYWl0cyBhcnJheS5cbiAgICB0aGlzLnRyYWl0cy5wdXNoKC4uLnRyYWl0cyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGVudGl0eSB0cmFpdCB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHJhaXQodHJhaXQ6IHR5cGVvZiBFbnRpdHlUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5FbnRpdHlSZWdpc3RyeSB9O1xuIl0sCiAgIm1hcHBpbmdzIjogIm9VQUNBLE9BQ0VBLGNBQUFBLEVBQ0FDLGFBQUFBLEVBQ0FDLGVBQUFBLEVBQ0FDLGdCQUFBQSxFQUNBQyxjQUFBQSxFQUNBQyxpQkFBQUEsTUFDSyxVQUNQLE9BQVNDLFlBQUFBLEVBQVVDLFdBQUFBLE1BQWUsWUFDbEMsT0FBU0MsZUFBQUEsRUFBYUMsZUFBQUEsTUFBbUIsWUFFekMsT0FBU0MsVUFBQUEsRUFBUUMsZ0JBQUFBLE1BQW9CLHFCQUNyQyxPQUFtQkMsZUFBQUEsRUFBYUMsY0FBQUEsTUFBa0IsbUJBQ2xELE9BQVNDLGdCQUFBQSxNQUFvQiwyQkNkN0IsT0FBU0MsWUFBQUEsTUFBZ0IsT0NBekIsT0FBU0MsY0FBQUEsTUFBa0IsbUJBRTNCLElBQU1DLEVBQU4sY0FBMEJDLENBQUFBLENBRjFCLE1BRTBCQSxDQUFBQSxFQUFBQSxvQkFDeEIsT0FBdUJDLFdBQWEsVUFDcEMsT0FBdUJDLFFBQXlCLENBQUEsQ0FDbEQsRUFFTUMsRUFBTixjQUFnQ0gsQ0FBQUEsQ0FQaEMsTUFPZ0NBLENBQUFBLEVBQUFBLDBCQUM5QixPQUF1QkMsV0FBYSxpQkFDcEMsT0FBdUJDLFFBQXlCLENBQUMsT0FBUSxTQUFVLFNBQ3JFLEVERkEsSUFBTUUsRUFBV0MsRUFBQSxDQUFDQyxFQUFjQyxJQUFBQSxDQUM5QkQsRUFBTUUsZUFBZUosU0FDbkIsVUFDQSwwQ0FDQ0ssR0FBQUEsQ0FFQ0EsRUFBU0MsWUFBYyxDQUFDLHFCQUd4QkQsRUFBU0UsU0FDUCxDQUNFQyxPQUFRQyxDQUNWLEVBQ0EsQ0FBQyxDQUFFRCxPQUFBQSxDQUFNLElBQUUsQ0FFVCxHQUFJQSxFQUFPRSxTQUFXLE9BQVEsT0FHOUIsR0FBSVAsRUFBU1EsUUFBUUMsT0FBUyxFQUM1QixNQUFP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QUFXLEtBQUtBLFVBQVlOLEVBQVFNLFdBQzdDTixHQUFTTyxhQUFZLEtBQUtBLFdBQWFQLEVBQVFPLFdBQ3JELENBT09DLFFBQTBCMUIsRUFBOEIsQ0FFN0QsR0FBSSxDQUFDLEtBQUtnQixTQUFVLE9BQU8sS0FHM0IsSUFBTVcsRUFBUyxLQUFLWCxTQUFTWSxRQUFRQyxJQUFJN0IsQ0FBQUEsRUFHekMsT0FBSzJCLEdBQWUsSUFJdEIsQ0FNT0osYUFBYU8sRUFBdUIsQ0FFM0MsQ0FNT04sVUFBVU0sRUFBdUIsQ0FFeEMsQ0FNT0wsV0FBV0ssRUFBdUIsQ0FFekMsQ0FDRiIsCiAgIm5hbWVzIjogWyJleGlzdHNTeW5jIiwgIm1rZGlyU3luYyIsICJyZWFkZGlyU3luYyIsICJyZWFkRmlsZVN5bmMiLCAidW5saW5rU3luYyIsICJ3cml0ZUZpbGVTeW5jIiwgInJlbGF0aXZlIiwgInJlc29sdmUiLCAiZGVmbGF0ZVN5bmMiLCAiaW5mbGF0ZVN5bmMiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJTZXJ2ZXJFdmVudCIsICJXb3JsZEV2ZW50IiwgIkJpbmFyeVN0cmVhbSIsICJyZWxhdGl2ZSIsICJDdXN0b21FbnVtIiwgIlBsdWdpbnNFbnVtIiwgIkN1c3RvbUVudW0iLCAiaWRlbnRpZmllciIsICJvcHRpb25zIiwgIlBsdWdpbkFjdGlvbnNFbnVtIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJwaXBlbGluZSIsICJjb21tYW5kUGFsZXR0ZSIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9ucyIsICJvdmVybG9hZCIsICJhY3Rpb24iLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVzdWx0IiwgInBsdWdpbnMiLCAic2l6ZSIsICJtZXNzYWdlIiwgInZhbHVlcyIsICJwbHVnaW4iLCAicHVzaCIsICJpZGVudGlmaWVyIiwgInZlcnNpb24iLCAibGVuZ3RoIiwgImpvaW4iLCAiUGx1Z2luc0VudW0iLCAicGx1Z2luSW5zdGFuY2UiLCAiZ2V0IiwgIkVycm9yIiwgInJlbG9hZCIsICJpc0J1bmRsZWQiLCAiYnVuZGxlIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgInBhdGgiLCAiY29tbWFuZF9kZWZhdWx0IiwgIlBsdWdpbkhlYWRlciIsICJQbHVnaW5Qcmlvcml0eSIsICJQbHVnaW5UeXBlIiwgIkRlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMiLCAicGF0aCIsICJjb21tYW5kcyIsICJpbml0aWFsaXplIiwgIlBpcGVsaW5lIiwgInNlcmVuaXR5IiwgInByb3BlcnRpZXMiLCAibG9nZ2VyIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiTWF0ZXJpYWxMYXBpcyIsICJwbHVnaW5zIiwgIk1hcCIsICJ0ZW1wUGF0aHMiLCAiU2V0IiwgImVzbSIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJfIiwgIkVycm9yIiwgIm9uIiwgIlNlcnZlckV2ZW50IiwgIlN0YXJ0IiwgInN0YXJ0IiwgImJpbmQiLCAiU3RvcCIsICJzdG9wIiwgIldvcmxkRXZlbnQiLCAiV29ybGRJbml0aWFsaXplIiwgIndvcmxkIiwgIkNvbW1hbmQiLCAicGx1Z2luIiwgImJsb2NrUGFsZXR0ZSIsICJyZWdpc3RlclR5cGUiLCAiYmxvY2tzIiwgInR5cGVzIiwgInJlZ2lzdGVyVHJhaXQiLCAidHJhaXRzIiwgIml0ZW1QYWxldHRlIiwgIml0ZW1zIiwgImVudGl0eVBhbGV0dGUiLCAiZW50aXRpZXMiLCAiZXhpc3RzU3luYyIsICJyZXNvbHZlIiwgIm1rZGlyU3luYyIsICJyZWN1cnNpdmUiLCAiYnVuZGxlcyIsICJyZWFkZGlyU3luYyIsICJ3aXRoRmlsZVR5cGVzIiwgImZpbHRlciIsICJkaXJlbnQiLCAiaXNGaWxlIiwgIm5hbWUiLCAiZW5kc1dpdGgiLCAib3JkZXJlZFBsdWdpbnMiLCAiYnVuZGxlIiwgImJ1ZmZlciIsICJpbmZsYXRlU3luYyIsICJyZWFkRmlsZVN5bmMiLCAic3RyZWFtIiwgIkJpbmFyeVN0cmVhbSIsICJyZWFkQnl0ZSIsICJ0eXBlIiwgIlBsdWdpbkhlYWRlciIsICJIYXNOb1Jlc291cmNlcyIsICJsZW5ndGgiLCAicmVhZFZhckludCIsICJpbmRleCIsICJyZWFkQnVmZmVyIiwgInRvU3RyaW5nIiwgImxvYWRGcm9tVGV4dFNvdXJjZSIsICJwdXNoIiwgIkhhc1Jlc291cmNlcyIsICJyZXNvdXJjZXMiLCAiaSIsICJyZXNvdXJjZSIsICJsb2FkRnJvbVppcCIsICJzdWNjZXNzIiwgInV1aWQiLCAiYWRkIiwgInJlYXNvbiIsICJlcnJvciIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImN3ZCIsICJpZGVudGlmaWVyIiwgIlBsdWdpblR5cGUiLCAiQWRkb24iLCAid2FybiIsICJyZWFkUmVtYWluaW5nQnVmZmVyIiwgIkFwaSIsICJkaXJlY3RvcmllcyIsICJpc0RpcmVjdG9yeSIsICJkaXJlY3RvcnkiLCAibWFuaWZlc3QiLCAiSlNPTiIsICJwYXJzZSIsICJtYWluIiwgInZlcnNpb24iLCAicmVxdWlyZSIsICJkZWZhdWx0IiwgImhhcyIsICJwaXBlbGluZSIsICJpc0J1bmRsZWQiLCAibGlua01vZHVsZSIsICJzZXQiLCAiUGx1Z2luc0VudW0iLCAib3B0aW9ucyIsICJwYWNrIiwgImxvYWRGcm9tUGF0aCIsICJzb3J0IiwgImEiLCAiYiIsICJwcmlvcml0eSIsICJvbkluaXRpYWxpemUiLCAiYmluZEV2ZW50cyIsICJ2YWx1ZXMiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAidGVtcFBhdGgiLCAidW5saW5rU3luYyIsICJzb3VyY2UiLCAid3JpdGVGaWxlU3luYyIsICJzbGljZSIsICJyZWxvYWQiLCAiZGVsZXRlIiwgImNhY2hlIiwgInJlbW92ZVBhdGgiLCAicGFja3MiLCAibmV3UGx1Z2luIiwgImhlYWRlciIsICJzaXplIiwgIndyaXRlQnl0ZSIsICJ3cml0ZVZhckludCIsICJieXRlTGVuZ3RoIiwgIndyaXRlQnVmZmVyIiwgImRlZmxhdGVTeW5jIiwgImdldEJ1ZmZlciIsICJjb21wcmVzcyIsICJwcm90b3R5cGUiLCAiT2JqZWN0IiwgImdldFByb3RvdHlwZU9mIiwgInBsdWdpbktleXMiLCAiZ2V0T3duUHJvcGVydHlOYW1lcyIsICJldmVudEtleXMiLCAia2V5cyIsICJldmVudEtleSIsICJpbmRleE9mIiwgImluY2x1ZGVzIiwgInZhbHVlIiwgImJlZm9yZSIsICJhZnRlciIsICJ2ZXJzaW9ucyIsICJidW4iLCAidW5kZWZpbmVkIiwgIkJ1biIsICJzZXR1cCIsICJidWlsZGVyIiwgImxvYWRlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIkVtaXR0ZXIiLCAiUGx1Z2luQmxvY2tSZWdpc3RyeSIsICJ0eXBlcyIsICJ0cmFpdHMiLCAicmVnaXN0ZXJUeXBlIiwgInB1c2giLCAidW5yZWdpc3RlclR5cGUiLCAidHlwZSIsICJpbmRleCIsICJpbmRleE9mIiwgInNwbGljZSIsICJyZWdpc3RlclRyYWl0IiwgInVucmVnaXN0ZXJUcmFpdCIsICJ0cmFpdCIsICJQbHVnaW5JdGVtUmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luRW50aXR5UmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luIiwgIkVtaXR0ZXIiLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxvZ2dlciIsICJwcmlvcml0eSIsICJQbHVnaW5Qcmlvcml0eSIsICJOb3JtYWwiLCAiYmxvY2tzIiwgIlBsdWdpbkJsb2NrUmVnaXN0cnkiLCAiaXRlbXMiLCAiUGx1Z2luSXRlbVJlZ2lzdHJ5IiwgImVudGl0aWVzIiwgIlBsdWdpbkVudGl0eVJlZ2lzdHJ5IiwgInJlc291cmNlcyIsICJTZXQiLCAicGF0aCIsICJpc0J1bmRsZWQiLCAicGlwZWxpbmUiLCAic2VyZW5pdHkiLCAib3B0aW9ucyIsICJtYXhMaXN0ZW5lcnMiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJCbHVlIiwgIm9uSW5pdGlhbGl6ZSIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJyZXNvbHZlIiwgInBsdWdpbiIsICJwbHVnaW5zIiwgImdldCIsICJfcGx1Z2luIl0KfQo=
1
+ var M=Object.defineProperty;var d=(a,e)=>M(a,"name",{value:e,configurable:!0}),y=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});import{existsSync as w,mkdirSync as O,readdirSync as T,readFileSync as b,unlinkSync as I,writeFileSync as E}from"node:fs";import{relative as m,resolve as o}from"node:path";import{deflateSync as A,inflateSync as N}from"node:zlib";import{Logger as K,LoggerColors as W}from"@serenityjs/logger";import{ServerEvent as H,WorldEvent as V}from"@serenityjs/core";import{BinaryStream as R}from"@serenityjs/binarystream";import{relative as q}from"path";import{CustomEnum as z}from"@serenityjs/core";var x=class extends z{static{d(this,"PluginsEnum")}static identifier="plugins";static options=[]},B=class extends z{static{d(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var C=d((a,e)=>{a.commandPalette.register("plugins","Interact with the plugins of the server",r=>{r.permissions=["serenity.operator"],r.overload({action:B},({action:s})=>{if(s.result!=="list")return;if(e.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let n=[...e.plugins.values()],i=[];for(let t of n)i.push(`\xA7u${t.identifier} v${t.version}\xA7r`);return{message:`\xA77Active Plugins (${n.length}):\xA7r ${i.join("\xA77,\xA7r ")}`}}),r.overload({action:B,plugin:x},({action:s,plugin:n})=>{if(s.result!=="reload"&&s.result!=="bundle")return;let i=e.plugins.get(n.result);if(!i)throw new Error(`Plugin ${n.result} is not found.`);if(s.result==="reload")return e.reload(i),{message:`\xA7aSuccessfully reloaded \xA72${i.identifier}\xA7a.`};if(i.isBundled)throw new Error(`Plugin ${i.identifier} cannot be bundled, as it is already a bundled plugin.`);return e.bundle(i),{message:`\xA7aSuccessfully bundled \xA72${i.identifier}\xA7a, output file was placed at \xA77${q(process.cwd(),e.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),L=C;var g=function(a){return a[a.HasNoResources=2]="HasNoResources",a[a.HasResources=3]="HasResources",a}(g||{});var P=function(a){return a[a.Low=0]="Low",a[a.Normal=1]="Normal",a[a.High=2]="High",a}(P||{});var v=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(v||{});var J={path:"./plugins",commands:!0,initialize:!0},Pe=class{static{d(this,"Pipeline")}serenity;properties;logger=new K("Plugins",W.MaterialLapis);plugins=new Map;esm=typeof module<"u"&&module?.exports!==exports;get path(){return this.properties.path}set path(e){throw new Error("The path property is read-only.")}constructor(e,r){this.serenity=e,this.properties={...J,...r},e.on(H.Start,this.start.bind(this)),e.on(H.Stop,this.stop.bind(this)),e.on(V.WorldInitialize,({world:s})=>{this.properties.commands&&L(s,this);for(let[,n]of this.plugins)s.blockPalette.registerType(...n.blocks.types).registerTrait(...n.blocks.traits),s.itemPalette.registerType(...n.items.types).registerTrait(...n.items.traits),s.entityPalette.registerType(...n.entities.types).registerTrait(...n.entities.traits)}),this.properties.initialize&&this.initialize()}initialize(){w(o(this.path))||O(o(this.path),{recursive:!0});let r=T(o(this.path),{withFileTypes:!0}).filter(i=>i.isFile()?i.name.endsWith(".plugin"):!1),s=[];for(let i of r)try{let t=o(this.path,i.name),c=N(b(t)),u=new R(c);switch(u.readByte()){case g.HasNoResources:{let l=u.readVarInt(),f=u.readBuffer(l).toString("utf-8"),p=this.loadFromTextSource(t,f,!0);p&&s.push(p);break}case g.HasResources:{let l=u.readVarInt(),f=u.readBuffer(l).toString("utf-8"),p=this.loadFromTextSource(t,f,!0);if(!p)break;s.push(p);let h=u.readVarInt();for(let F=0;F<h;F++)try{let S=u.readVarInt(),D=u.readBuffer(S),$=this.serenity.resources.loadFromZip(D);p.logger.success(`Loaded resource pack \xA7u${$.name}\xA7r (\xA78${$.uuid}\xA7r).`),p.resources.add($)}catch(S){this.logger.error(`Failed to load resource pack \xA78${m(process.cwd(),o(this.path,i.name))}\xA7r for plugin \xA71${p.identifier}\xA7r.`,S)}break}case v.Addon:{this.logger.warn(`The plugin \xA71${m(process.cwd(),o(this.path,i.name))}\xA7r is using a deprecated plugin type (Addon). Please update the plugin to use the new plugin system.`);let l=u.readRemainingBuffer().toString("utf-8"),f=this.loadFromTextSource(t,l,!0);f&&s.push(f);break}case v.Api:this.logger.error(`The plugin \xA71${m(process.cwd(),o(this.path,i.name))}\xA7r is using a deprecated plugin type (API). API plugins are no longer supported. Please update the plugin to use the new plugin system.`)}}catch(t){this.logger.error(`Failed to load plugin from "${m(process.cwd(),o(this.path,i.name))}", skipping the plugin.`,t)}let n=T(o(this.path),{withFileTypes:!0}).filter(i=>i.isDirectory());for(let i of n)try{let t=o(this.path,i.name);if(!w(o(t,"package.json")))continue;let c=JSON.parse(b(o(t,"package.json"),"utf-8")),u=o(t,c.main);if(!w(o(t,u))){this.logger.warn(`Unable to load plugin \xA7u${c.name??"unknown-plugin"}\xA78@\xA7u${c.version??"unknown-version"}\xA7r, the main entry path "\xA78${m(process.cwd(),o(t,u))}\xA7r" was not found in the directory.`);continue}let k=y(o(t,u)),l=k.default;if(this.plugins.has(l.identifier)){this.logger.warn(`Unable to load plugin \xA7u${l.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}l.pipeline=this,l.serenity=this.serenity,l.path=t,l.isBundled=!1,this.linkModule(l.identifier,k),this.plugins.set(l.identifier,l),x.options.push(l.identifier),s.push(l),w(o(t,"resource_packs"))||O(o(t,"resource_packs"));let f=T(o(t,"resource_packs"),{withFileTypes:!0}).filter(p=>p.isDirectory());for(let p of f)try{let h=this.serenity.resources.loadFromPath(o(t,"resource_packs",p.name));l.logger.success(`Loaded resource pack \xA7u${h.name}\xA7r (\xA78${h.uuid}\xA7r).`),l.resources.add(h)}catch(h){this.logger.error(`Failed to load resource pack \xA78${m(process.cwd(),o(t,"resource_packs",p.name))}\xA7r for plugin \xA71${l.identifier}\xA7r.`,h)}}catch(t){this.logger.error(`Failed to load plugin from "${m(process.cwd(),o(this.path,i.name))}", skipping the plugin.`,t)}s.sort((i,t)=>i.priority!==t.priority?t.priority-i.priority:i.identifier<t.identifier?-1:i.identifier>t.identifier?1:0);for(let i of s)if(i.onInitialize(i),this.bindEvents(i),i.isBundled){let t=o(i.path.slice(0,-7).replace(/\./g,"_"));w(t)&&process.nextTick(()=>I(t))}}start(){for(let e of this.plugins.values())e.onStartUp(e)}stop(){for(let e of this.plugins.values())e.onShutDown(e)}loadFromTextSource(e,r,s=!1){let n=o(e.slice(0,-7).replace(/\./g,"_"));E(o(n),r);try{let i=y(o(n)),t=i.default;return this.plugins.has(t.identifier)?(this.logger.warn(`Unable to load plugin \xA7u${t.identifier}\xA7r, the plugin is already loaded in the pipeline.`),I(o(n)),null):(t.pipeline=this,t.serenity=this.serenity,t.path=o(e),t.isBundled=s,this.linkModule(t.identifier,i),this.plugins.set(t.identifier,t),x.options.push(t.identifier),t)}catch(i){this.logger.error(`Failed to load plugin from \xA78${m(process.cwd(),e)}\xA7r, skipping the plugin.`,i),I(o(n))}return null}reload(e){e.onShutDown(e),this.plugins.delete(e.identifier);let r=e.path;delete y.cache[y.resolve(r)],this.serenity.removePath(r);for(let s of e.resources)this.serenity.resources.packs.delete(s.uuid);if(e.isBundled){let s=N(b(r)),n=new R(s);switch(n.readByte()){case g.HasNoResources:{let t=n.readVarInt(),c=n.readBuffer(t).toString("utf-8"),u=this.loadFromTextSource(r,c,!0);if(!u)break;u.onInitialize(u),this.bindEvents(u),u.onStartUp(u);break}case g.HasResources:{let t=n.readVarInt(),c=n.readBuffer(t).toString("utf-8"),u=this.loadFromTextSource(r,c,!0);if(!u)break;u.onInitialize(u),this.bindEvents(u),u.onStartUp(u);let k=n.readVarInt();for(let l=0;l<k;l++)try{let f=n.readVarInt(),p=n.readBuffer(f),h=this.serenity.resources.loadFromZip(p);u.logger.success(`Loaded resource pack \xA7u${h.name}\xA7r (\xA78${h.uuid}\xA7r).`),u.resources.add(h)}catch(f){this.logger.error(`Failed to load resource pack \xA78${m(process.cwd(),o(this.path,r))}\xA7r for plugin \xA71${u.identifier}\xA7r.`,f)}}}}else{let s=JSON.parse(b(o(r,"package.json"),"utf-8")),n=o(r,s.main);if(!w(o(r,n))){this.logger.warn(`Unable to reload plugin \xA7u${s.name??"unknown-plugin"}\xA78@\xA7u${s.version??"unknown-version"}\xA7r, the main entry path "\xA78${m(process.cwd(),o(r,n))}\xA7r" was not found in the directory.`);return}let i=y(o(r,n)),t=i.default;t.pipeline=this,t.serenity=this.serenity,t.path=r,t.isBundled=!1,this.linkModule(t.identifier,i),this.plugins.set(t.identifier,t),x.options.push(t.identifier),t.onInitialize(t),this.bindEvents(t)}}bundle(e){let r=new R,s=e.resources.size>0?g.HasResources:g.HasNoResources;switch(r.writeByte(s),s){case g.HasNoResources:{let n=o(e.path,"dist","index.js"),i=b(n);r.writeVarInt(i.byteLength),r.writeBuffer(i),E(o(this.path,`${e.identifier}-v${e.version}.plugin`),A(r.getBuffer()));break}case g.HasResources:{let n=o(e.path,"dist","index.js"),i=b(n);r.writeVarInt(i.byteLength),r.writeBuffer(i),r.writeVarInt(e.resources.size);for(let t of e.resources){let c=t.compress();r.writeVarInt(c.byteLength),r.writeBuffer(c)}E(o(this.path,`${e.identifier}-v${e.version}.plugin`),A(r.getBuffer()));break}}}bindEvents(e){let r=Object.getPrototypeOf(e),s=Object.getOwnPropertyNames(r),n=Object.keys(V);n=n.slice(n.length/2);for(let i of n){let t=n.indexOf(i);if(s.includes("on"+i)){let c=e["on"+i];typeof c=="function"&&this.serenity.on(t,c.bind(e))}if(s.includes("before"+i)){let c=e["before"+i];typeof c=="function"&&this.serenity.before(t,c.bind(e))}if(s.includes("after"+i)){let c=e["after"+i];typeof c=="function"&&this.serenity.after(t,c.bind(e))}}}linkModule(e,r){process.versions.bun!==void 0&&Bun.plugin({name:`serenityjs.plugin.${e}`,setup(n){n.module(e,()=>({exports:r,loader:"object"}))}})}};import{Logger as Z,LoggerColors as G}from"@serenityjs/logger";import{Emitter as Q}from"@serenityjs/emitter";var _=class{static{d(this,"PluginBlockRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let r=this.types.indexOf(e);return r!==-1&&this.types.splice(r,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let r=this.traits.indexOf(e);return r!==-1&&this.traits.splice(r,1),this}};var j=class{static{d(this,"PluginItemRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let r=this.types.indexOf(e);return r!==-1&&this.types.splice(r,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let r=this.traits.indexOf(e);return r!==-1&&this.traits.splice(r,1),this}};var U=class{static{d(this,"PluginEntityRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let r=this.types.indexOf(e);return r!==-1&&this.types.splice(r,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let r=this.traits.indexOf(e);return r!==-1&&this.traits.splice(r,1),this}};var We=class extends Q{static{d(this,"Plugin")}identifier;version;logger;priority=P.Normal;blocks=new _;items=new j;entities=new U;resources=new Set;path;isBundled;pipeline;serenity;constructor(e,r,s){super(s?.maxListeners),this.identifier=e,this.version=r,this.logger=s?.logger??new Z(`${e}@${r}`,G.Blue),s?.onInitialize&&(this.onInitialize=s.onInitialize),s?.onStartUp&&(this.onStartUp=s.onStartUp),s?.onShutDown&&(this.onShutDown=s.onShutDown)}resolve(e){if(!this.pipeline)return null;let r=this.pipeline.plugins.get(e);return r||null}onInitialize(e){}onStartUp(e){}onShutDown(e){}};export{J as DefaultPipelineProperties,Pe as Pipeline,We as Plugin,g as PluginHeader,P as PluginPriority,v as PluginType};
2
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3BpcGVsaW5lLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtLnRzIiwgIi4uL3NyYy9lbnVtcy9oZWFkZXIudHMiLCAiLi4vc3JjL2VudW1zL3ByaW9yaXR5LnRzIiwgIi4uL3NyYy9lbnVtcy90eXBlLnRzIiwgIi4uL3NyYy9wbHVnaW4udHMiLCAiLi4vc3JjL3JlZ2lzdHJ5L2Jsb2NrLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9pdGVtLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9lbnRpdHkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgdW5saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWZsYXRlU3luYywgaW5mbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5cbmltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuaW1wb3J0IHsgU2VyZW5pdHksIFNlcnZlckV2ZW50LCBXb3JsZEV2ZW50IH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IEJpbmFyeVN0cmVhbSB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgUGx1Z2luUGFja2FnZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW5cIjtcbmltcG9ydCBDb21tYW5kIGZyb20gXCIuL2NvbW1hbmRzL2NvbW1hbmRcIjtcbmltcG9ydCB7IFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vY29tbWFuZHNcIjtcbmltcG9ydCB7IFBsdWdpblR5cGUsIFBsdWdpbkhlYWRlciB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQaXBlbGluZVByb3BlcnRpZXMge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmRzOiBib29sZWFuO1xuICBpbml0aWFsaXplOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IFwiLi9wbHVnaW5zXCIsXG4gIGNvbW1hbmRzOiB0cnVlLFxuICBpbml0aWFsaXplOiB0cnVlXG59O1xuXG5jbGFzcyBQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJQbHVnaW5zXCIsIExvZ2dlckNvbG9ycy5NYXRlcmlhbExhcGlzKTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbnMgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBpbiBFU00gbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlc206IGJvb2xlYW4gPVxuICAgIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlPy5leHBvcnRzICE9PSBleHBvcnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHNldCBwYXRoKF8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGF0aCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBpcGVsaW5lIGNsYXNzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGlwZWxpbmVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSBzZXJlbml0eSBzZXJ2ZXIgZXZlbnRzXG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RhcnQsIHRoaXMuc3RhcnQuYmluZCh0aGlzKSk7XG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RvcCwgdGhpcy5zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSB3b3JsZCBpbml0aWFsaXplIGV2ZW50XG4gICAgc2VyZW5pdHkub24oV29ybGRFdmVudC5Xb3JsZEluaXRpYWxpemUsICh7IHdvcmxkIH0pID0+IHtcbiAgICAgIC8vIFJlZ2lzdGVyIHRoZSBjb21tYW5kcyBmb3IgdGhlIHBsdWdpbnNcbiAgICAgIGlmICh0aGlzLnByb3BlcnRpZXMuY29tbWFuZHMpIENvbW1hbmQod29ybGQsIHRoaXMpO1xuXG4gICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBwbHVnaW5zLCBhbmQgcmVnaXN0ZXIgdGhlIGJsb2NrcywgaXRlbXMsIGFuZCBlbnRpdGllc1xuICAgICAgZm9yIChjb25zdCBbLCBwbHVnaW5dIG9mIHRoaXMucGx1Z2lucykge1xuICAgICAgICAvLyBSZWdpc3RlciB0aGUgYmxvY2tzIGZvciB0aGUgd29ybGRcbiAgICAgICAgd29ybGQuYmxvY2tQYWxldHRlXG4gICAgICAgICAgLnJlZ2lzdGVyVHlwZSguLi5wbHVnaW4uYmxvY2tzLnR5cGVzKVxuICAgICAgICAgIC5yZWdpc3RlclRyYWl0KC4uLnBsdWdpbi5ibG9ja3MudHJhaXRzKTtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGUgaXRlbXMgZm9yIHRoZSB3b3JsZFxuICAgICAgICB3b3JsZC5pdGVtUGFsZXR0ZVxuICAgICAgICAgIC5yZWdpc3RlclR5cGUoLi4ucGx1Z2luLml0ZW1zLnR5cGVzKVxuICAgICAgICAgIC5yZWdpc3RlclRyYWl0KC4uLnBsdWdpbi5pdGVtcy50cmFpdHMpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBlbnRpdGllcyBmb3IgdGhlIHdvcmxkXG4gICAgICAgIHdvcmxkLmVudGl0eVBhbGV0dGVcbiAgICAgICAgICAucmVnaXN0ZXJUeXBlKC4uLnBsdWdpbi5lbnRpdGllcy50eXBlcylcbiAgICAgICAgICAucmVnaXN0ZXJUcmFpdCguLi5wbHVnaW4uZW50aXRpZXMudHJhaXRzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW5zIHNob3VsZCBiZSBpbml0aWFsaXplZFxuICAgIGlmICh0aGlzLnByb3BlcnRpZXMuaW5pdGlhbGl6ZSkgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2lucyBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUodGhpcy5wYXRoKSkpXG4gICAgICAvLyBJZiBub3QsIGNyZWF0ZSB0aGUgcGx1Z2lucyBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVhZCBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgY29uc3QgZW50cmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pO1xuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGZpbGVzIHRoYXQgaGF2ZSBhIC5wbHVnaW4gZXh0ZW5zaW9uXG4gICAgY29uc3QgYnVuZGxlcyA9IGVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+XG4gICAgICBkaXJlbnQuaXNGaWxlKCkgPyBkaXJlbnQubmFtZS5lbmRzV2l0aChcIi5wbHVnaW5cIikgOiBmYWxzZVxuICAgICk7XG5cbiAgICAvLyBBcnJheSB0byBob2xkIHRoZSBvcmRlcmVkIHBsdWdpbnNcbiAgICBjb25zdCBvcmRlcmVkUGx1Z2luczogQXJyYXk8UGx1Z2luPiA9IFtdO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgYnVuZGxlZCBwbHVnaW5zLCBhbmQgaW1wb3J0IHRoZW1cbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBidW5kbGVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgLnBsdWdpbiBmaWxlIGFuZCBpbmZsYXRlIGl0LCBhbmQgY3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW1cbiAgICAgICAgY29uc3QgYnVmZmVyID0gaW5mbGF0ZVN5bmMocmVhZEZpbGVTeW5jKHBhdGgpKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBsdWdpbiBoZWFkZXIgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgIGNvbnN0IHR5cGUgPSBzdHJlYW0ucmVhZEJ5dGUoKSBhcyBQbHVnaW5UeXBlIHwgUGx1Z2luSGVhZGVyO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc05vUmVzb3VyY2VzOiB7XG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4IGZpbGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCkudG9TdHJpbmcoXCJ1dGYtOFwiKTtcblxuICAgICAgICAgICAgLy8gTG9hZCB0aGUgcGx1Z2luIGZyb20gdGhlIHRleHQgc291cmNlXG4gICAgICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLmxvYWRGcm9tVGV4dFNvdXJjZShwYXRoLCBpbmRleCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiB0byB0aGUgb3JkZXJlZCBwbHVnaW5zIGFycmF5XG4gICAgICAgICAgICBpZiAocGx1Z2luKSBvcmRlcmVkUGx1Z2lucy5wdXNoKHBsdWdpbik7XG5cbiAgICAgICAgICAgIC8vIEJyZWFrIG91dCBvZiB0aGUgc3dpdGNoIHN0YXRlbWVudFxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSBQbHVnaW5IZWFkZXIuSGFzUmVzb3VyY2VzOiB7XG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4IGZpbGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCkudG9TdHJpbmcoXCJ1dGYtOFwiKTtcblxuICAgICAgICAgICAgLy8gTG9hZCB0aGUgcGx1Z2luIGZyb20gdGhlIHRleHQgc291cmNlXG4gICAgICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLmxvYWRGcm9tVGV4dFNvdXJjZShwYXRoLCBpbmRleCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gd2FzIGxvYWRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgICAgIGlmICghcGx1Z2luKSBicmVhaztcblxuICAgICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIHRvIHRoZSBvcmRlcmVkIHBsdWdpbnMgYXJyYXlcbiAgICAgICAgICAgIG9yZGVyZWRQbHVnaW5zLnB1c2gocGx1Z2luKTtcblxuICAgICAgICAgICAgLy8gUmVhZCB0aGUgYW1vdW50IG9mIHJlc291cmNlcyBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgIGNvbnN0IHJlc291cmNlcyA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlc291cmNlcywgYW5kIHJlYWQgdGhlbSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzb3VyY2VzOyBpKyspIHtcbiAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byByZWFkIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCk7XG5cbiAgICAgICAgICAgICAgICAvLyBMb2FkIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIGJ1ZmZlclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5zZXJlbml0eS5yZXNvdXJjZXMubG9hZEZyb21aaXAoYnVmZmVyKTtcblxuICAgICAgICAgICAgICAgIC8vIExvZyB0aGUgc3VjY2Vzc2Z1bCBsb2FkIG9mIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgICAgICAgcGx1Z2luLmxvZ2dlci5zdWNjZXNzKFxuICAgICAgICAgICAgICAgICAgYExvYWRlZCByZXNvdXJjZSBwYWNrIMKndSR7cmVzb3VyY2UubmFtZX3Cp3IgKMKnOCR7cmVzb3VyY2UudXVpZH3Cp3IpLmBcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSByZXNvdXJjZSBwYWNrIHRvIHRoZSBwbHVnaW4gcmVzb3VyY2VzIHNldFxuICAgICAgICAgICAgICAgIHBsdWdpbi5yZXNvdXJjZXMuYWRkKHJlc291cmNlKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9nIHRoZSBlcnJvciBpZiB0aGUgcmVzb3VyY2UgcGFjayBmYWlsZWQgdG8gbG9hZFxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHJlc291cmNlIHBhY2sgwqc4JHtyZWxhdGl2ZShcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKVxuICAgICAgICAgICAgICAgICAgKX3Cp3IgZm9yIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnci5gLFxuICAgICAgICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERFUFJFQ0FURUQ6IEV2ZW50dWFsbHkgcmVtb3ZlIHN1cHBvcnQgZm9yIHRoZXNlIHBsdWdpbiB0eXBlc1xuICAgICAgICAgIGNhc2UgUGx1Z2luVHlwZS5BZGRvbjoge1xuICAgICAgICAgICAgLy8gV2Ugd2lsbCBoYW5kbGUgYWRkb24gcGx1Z2lucywgYnV0IG1lbnRpb24gdGhhdCB0aGV5IGFyZSBkZXByZWNhdGVkXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgVGhlIHBsdWdpbiDCpzEke3JlbGF0aXZlKFxuICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKVxuICAgICAgICAgICAgICApfcKnciBpcyB1c2luZyBhIGRlcHJlY2F0ZWQgcGx1Z2luIHR5cGUgKEFkZG9uKS4gUGxlYXNlIHVwZGF0ZSB0aGUgcGx1Z2luIHRvIHVzZSB0aGUgbmV3IHBsdWdpbiBzeXN0ZW0uYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZFJlbWFpbmluZ0J1ZmZlcigpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAgIC8vIExvYWQgdGhlIHBsdWdpbiBmcm9tIHRoZSB0ZXh0IHNvdXJjZVxuICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gdG8gdGhlIG9yZGVyZWQgcGx1Z2lucyBhcnJheVxuICAgICAgICAgICAgaWYgKHBsdWdpbikgb3JkZXJlZFBsdWdpbnMucHVzaChwbHVnaW4pO1xuXG4gICAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERFUFJFQ0FURUQ6IEV2ZW50dWFsbHkgcmVtb3ZlIHN1cHBvcnQgZm9yIHRoZXNlIHBsdWdpbiB0eXBlc1xuICAgICAgICAgIGNhc2UgUGx1Z2luVHlwZS5BcGk6IHtcbiAgICAgICAgICAgIC8vIFdlIG5vIGxvbmdlciBzdXBwb3J0IEFQSSBwbHVnaW5zXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYFRoZSBwbHVnaW4gwqcxJHtyZWxhdGl2ZShcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSlcbiAgICAgICAgICAgICAgKX3Cp3IgaXMgdXNpbmcgYSBkZXByZWNhdGVkIHBsdWdpbiB0eXBlIChBUEkpLiBBUEkgcGx1Z2lucyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gUGxlYXNlIHVwZGF0ZSB0aGUgcGx1Z2luIHRvIHVzZSB0aGUgbmV3IHBsdWdpbiBzeXN0ZW0uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgZGlyZWN0b3JpZXMgZnJvbSB0aGUgZW50cmllc1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gcmVhZGRpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgfSkuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGRpcmVjdG9yaWVzLCBjaGVja2luZyBpZiB0aGV5IGFyZSB2YWxpZCBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBkaXJlY3Rvcnkgb2YgZGlyZWN0b3JpZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhIHBhY2thZ2UuanNvbiBmaWxlLCBpZiBub3QsIHNraXAgdGhlIHBsdWdpblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgICByZWFkRmlsZVN5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICAgICApIGFzIFBsdWdpblBhY2thZ2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIG1hbmlmZXN0Lm1haW4pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlZCBlbnRyeSBwb2ludCBpcyB2YWxpZFxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBtYWluKSkpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCp3Uke21hbmlmZXN0Lm5hbWUgPz8gXCJ1bmtub3duLXBsdWdpblwifcKnOEDCp3Uke21hbmlmZXN0LnZlcnNpb24gPz8gXCJ1bmtub3duLXZlcnNpb25cIn3Cp3IsIHRoZSBtYWluIGVudHJ5IHBhdGggXCLCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUocGF0aCwgbWFpbikpfcKnclwiIHdhcyBub3QgZm91bmQgaW4gdGhlIGRpcmVjdG9yeS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocmVzb2x2ZShwYXRoLCBtYWluKSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKndSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIExpbmsgdGhlIG1vZHVsZSB0byB0aGUgcGlwZWxpbmVcbiAgICAgICAgdGhpcy5saW5rTW9kdWxlKHBsdWdpbi5pZGVudGlmaWVyLCBtb2R1bGUpO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gdG8gdGhlIG9yZGVyZWQgcGx1Z2lucyBhcnJheVxuICAgICAgICBvcmRlcmVkUGx1Z2lucy5wdXNoKHBsdWdpbik7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgYSBcInJlc291cmNlX3BhY2tzXCIgZGlyZWN0b3J5IGV4aXN0cyBpbiB0aGUgcGx1Z2luXG4gICAgICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHBhdGgsIFwicmVzb3VyY2VfcGFja3NcIikpKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIHRoZSByZXNvdXJjZV9wYWNrcyBkaXJlY3RvcnlcbiAgICAgICAgICBta2RpclN5bmMocmVzb2x2ZShwYXRoLCBcInJlc291cmNlX3BhY2tzXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSByZXNvdXJjZV9wYWNrIGRpcmVjdG9yeSwgb25seSBpbmNsdWRpbmcgZGlyZWN0b3JpZXNcbiAgICAgICAgY29uc3QgcmVzb3VyY2VzID0gcmVhZGRpclN5bmMocmVzb2x2ZShwYXRoLCBcInJlc291cmNlX3BhY2tzXCIpLCB7XG4gICAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgICAgICB9KS5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRGlyZWN0b3J5KCkpO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlc291cmNlIHBhY2sgZGlyZWN0b3JpZXMsIGFuZCBhdHRlbXB0IHRvIGxvYWQgdGhlbVxuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuICAgICAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcmVzb3VyY2UgcGFja1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBSZWFkIHRoZSByZXNvdXJjZSBwYWNrLCBhbmQgYWRkIGl0IHRvIHRoZSBzZXJlbml0eSByZXNvdXJjZXNcbiAgICAgICAgICAgIGNvbnN0IHBhY2sgPSB0aGlzLnNlcmVuaXR5LnJlc291cmNlcy5sb2FkRnJvbVBhdGgoXG4gICAgICAgICAgICAgIHJlc29sdmUocGF0aCwgXCJyZXNvdXJjZV9wYWNrc1wiLCByZXNvdXJjZS5uYW1lKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gTG9nIHRoZSBzdWNjZXNzZnVsIGxvYWQgb2YgdGhlIHJlc291cmNlIHBhY2tcbiAgICAgICAgICAgIHBsdWdpbi5sb2dnZXIuc3VjY2VzcyhcbiAgICAgICAgICAgICAgYExvYWRlZCByZXNvdXJjZSBwYWNrIMKndSR7cGFjay5uYW1lfcKnciAowqc4JHtwYWNrLnV1aWR9wqdyKS5gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBBZGQgdGhlIHJlc291cmNlIHBhY2sgdG8gdGhlIHBsdWdpbiByZXNvdXJjZXMgc2V0XG4gICAgICAgICAgICBwbHVnaW4ucmVzb3VyY2VzLmFkZChwYWNrKTtcbiAgICAgICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgICAgIC8vIExvZyB0aGUgZXJyb3IgaWYgdGhlIHJlc291cmNlIHBhY2sgZmFpbGVkIHRvIGxvYWRcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2UgcGFjayDCpzgke3JlbGF0aXZlKFxuICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShwYXRoLCBcInJlc291cmNlX3BhY2tzXCIsIHJlc291cmNlLm5hbWUpXG4gICAgICAgICAgICAgICl9wqdyIGZvciBwbHVnaW4gwqcxJHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IuYCxcbiAgICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIFwiJHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHRoaXMucGF0aCwgZGlyZWN0b3J5Lm5hbWUpKX1cIiwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNvcnQgdGhlIHBsdWdpbnMgYnkgdGhlaXIgcHJpb3JpdHlcbiAgICBvcmRlcmVkUGx1Z2lucy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAvLyBTb3J0IGJ5IHByaW9yaXR5IGZpcnN0XG4gICAgICBpZiAoYS5wcmlvcml0eSAhPT0gYi5wcmlvcml0eSkge1xuICAgICAgICByZXR1cm4gYi5wcmlvcml0eSAtIGEucHJpb3JpdHk7IC8vIEhpZ2hlciBwcmlvcml0eSBjb21lcyBmaXJzdFxuICAgICAgfVxuXG4gICAgICAvLyBJZiBwcmlvcml0eSBpcyB0aGUgc2FtZSwgc29ydCBieSBpZGVudGlmaWVyIGFscGhhYmV0aWNhbGx5XG4gICAgICBpZiAoYS5pZGVudGlmaWVyIDwgYi5pZGVudGlmaWVyKSByZXR1cm4gLTE7XG4gICAgICBpZiAoYS5pZGVudGlmaWVyID4gYi5pZGVudGlmaWVyKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcGx1Z2lucywgYW5kIGluaXRpYWxpemUgdGhlbVxuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIG9yZGVyZWRQbHVnaW5zKSB7XG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW4sIGFuZCBiaW5kIHRoZSBldmVudHNcbiAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcbiAgICAgIHRoaXMuYmluZEV2ZW50cyhwbHVnaW4pO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGJ1bmRsZWRcbiAgICAgIGlmIChwbHVnaW4uaXNCdW5kbGVkKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IHRlbXAgPSByZXNvbHZlKHBsdWdpbi5wYXRoLnNsaWNlKDAsIC03KS5yZXBsYWNlKC9cXC4vZywgXCJfXCIpKTtcblxuICAgICAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlIGlmIGl0IGV4aXN0c1xuICAgICAgICBpZiAoZXhpc3RzU3luYyh0ZW1wKSkgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB1bmxpbmtTeW5jKHRlbXApKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgIC8vIFN0YXJ0IHVwIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU3RhcnRVcChwbHVnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGEgcGx1Z2luIGZyb20gYSB0ZXh0IHNvdXJjZS5cbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGNvZGUgb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIGlzQnVuZGxlZCBXaGV0aGVyIHRoZSBwbHVnaW4gaXMgYnVuZGxlZCBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgbG9hZEZyb21UZXh0U291cmNlKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBzb3VyY2U6IHN0cmluZyxcbiAgICBpc0J1bmRsZWQgPSBmYWxzZVxuICApOiBQbHVnaW4gfCBudWxsIHtcbiAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgIGNvbnN0IHRlbXAgPSByZXNvbHZlKHBhdGguc2xpY2UoMCwgLTcpLnJlcGxhY2UoL1xcLi9nLCBcIl9cIikpO1xuXG4gICAgLy8gV3JpdGUgdGhlIHNvdXJjZSB0byB0aGUgdGVtcG9yYXJ5IHBhdGhcbiAgICB3cml0ZUZpbGVTeW5jKHJlc29sdmUodGVtcCksIHNvdXJjZSk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgIHRyeSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZShyZXNvbHZlKHRlbXApKTtcblxuICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAvLyBMb2cgdGhlIHdhcm5pbmcgdGhhdCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgdW5saW5rU3luYyhyZXNvbHZlKHRlbXApKTtcblxuICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgcGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICBwbHVnaW4ucGF0aCA9IHJlc29sdmUocGF0aCk7XG4gICAgICBwbHVnaW4uaXNCdW5kbGVkID0gaXNCdW5kbGVkO1xuXG4gICAgICAvLyBMaW5rIHRoZSBtb2R1bGUgdG8gdGhlIHBpcGVsaW5lXG4gICAgICB0aGlzLmxpbmtNb2R1bGUocGx1Z2luLmlkZW50aWZpZXIsIG1vZHVsZSk7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgZW51bVxuICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBwbHVnaW5cbiAgICAgIHJldHVybiBwbHVnaW47XG4gICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgIHJlYXNvblxuICAgICAgKTtcblxuICAgICAgLy8gUmVtb3ZlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgdW5saW5rU3luYyhyZXNvbHZlKHRlbXApKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gbnVsbCBpZiB0aGUgcGx1Z2luIGZhaWxlZCB0byBsb2FkXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIHRoZSBwbHVnaW5cbiAgICBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgcGx1Z2lucyBtYXBcbiAgICB0aGlzLnBsdWdpbnMuZGVsZXRlKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgIC8vIEdldCB0aGUgcGx1Z2luIHBhdGhcbiAgICBjb25zdCBwYXRoID0gcGx1Z2luLnBhdGg7XG5cbiAgICAvLyBEZWxldGUgdGhlIHJlcXVpcmUgY2FjaGUgZm9yIHRoZSBwbHVnaW5cbiAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtyZXF1aXJlLnJlc29sdmUocGF0aCldO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgc2VyZW5pdHkgaW5zdGFuY2VcbiAgICB0aGlzLnNlcmVuaXR5LnJlbW92ZVBhdGgocGF0aCk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZXNvdXJjZXMgaW4gdGhlIHBsdWdpbiwgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIHNlcmVuaXR5IGluc3RhbmNlXG4gICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBwbHVnaW4ucmVzb3VyY2VzKSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIHJlc291cmNlIHBhY2sgZnJvbSB0aGUgc2VyZW5pdHkgaW5zdGFuY2VcbiAgICAgIHRoaXMuc2VyZW5pdHkucmVzb3VyY2VzLnBhY2tzLmRlbGV0ZShyZXNvdXJjZS51dWlkKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2luLmlzQnVuZGxlZCkge1xuICAgICAgLy8gUmVhZCB0aGUgLnBsdWdpbiBmaWxlIGFuZCBpbmZsYXRlIGl0LCBhbmQgY3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW1cbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGluZmxhdGVTeW5jKHJlYWRGaWxlU3luYyhwYXRoKSk7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBiaW5hcnkgc3RyZWFtIGZyb20gdGhlIGJ1ZmZlclxuICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgICAvLyBSZWFkIHRoZSBwbHVnaW4gaGVhZGVyIGZyb20gdGhlIHN0cmVhbVxuICAgICAgY29uc3QgdHlwZSA9IHN0cmVhbS5yZWFkQnl0ZSgpIGFzIFBsdWdpblR5cGUgfCBQbHVnaW5IZWFkZXI7XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFBsdWdpbkhlYWRlci5IYXNOb1Jlc291cmNlczoge1xuICAgICAgICAgIC8vIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGUgaW5kZXggZmlsZSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgLy8gTG9hZCB0aGUgcGx1Z2luIGZyb20gdGhlIHRleHQgc291cmNlXG4gICAgICAgICAgY29uc3QgbmV3UGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiB3YXMgbG9hZGVkIHN1Y2Nlc3NmdWxseVxuICAgICAgICAgIGlmICghbmV3UGx1Z2luKSBicmVhaztcblxuICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbiwgYW5kIGJpbmQgdGhlIGV2ZW50c1xuICAgICAgICAgIG5ld1BsdWdpbi5vbkluaXRpYWxpemUobmV3UGx1Z2luKTtcbiAgICAgICAgICB0aGlzLmJpbmRFdmVudHMobmV3UGx1Z2luKTtcblxuICAgICAgICAgIC8vIFN0YXJ0IHVwIHRoZSBwbHVnaW5cbiAgICAgICAgICBuZXdQbHVnaW4ub25TdGFydFVwKG5ld1BsdWdpbik7XG5cbiAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc1Jlc291cmNlczoge1xuICAgICAgICAgIC8vIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGUgaW5kZXggZmlsZSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgLy8gTG9hZCB0aGUgcGx1Z2luIGZyb20gdGhlIHRleHQgc291cmNlXG4gICAgICAgICAgY29uc3QgbmV3UGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiB3YXMgbG9hZGVkIHN1Y2Nlc3NmdWxseVxuICAgICAgICAgIGlmICghbmV3UGx1Z2luKSBicmVhaztcblxuICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbiwgYW5kIGJpbmQgdGhlIGV2ZW50c1xuICAgICAgICAgIG5ld1BsdWdpbi5vbkluaXRpYWxpemUobmV3UGx1Z2luKTtcbiAgICAgICAgICB0aGlzLmJpbmRFdmVudHMobmV3UGx1Z2luKTtcblxuICAgICAgICAgIC8vIFN0YXJ0IHVwIHRoZSBwbHVnaW5cbiAgICAgICAgICBuZXdQbHVnaW4ub25TdGFydFVwKG5ld1BsdWdpbik7XG5cbiAgICAgICAgICAvLyBSZWFkIHRoZSBhbW91bnQgb2YgcmVzb3VyY2VzIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IHJlc291cmNlcyA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZXNvdXJjZXMsIGFuZCByZWFkIHRoZW0gZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNvdXJjZXM7IGkrKykge1xuICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAvLyBSZWFkIHRoZSBsZW5ndGggb2YgdGhlIHJlc291cmNlIHBhY2sgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKTtcblxuICAgICAgICAgICAgICAvLyBMb2FkIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIGJ1ZmZlclxuICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuc2VyZW5pdHkucmVzb3VyY2VzLmxvYWRGcm9tWmlwKGJ1ZmZlcik7XG5cbiAgICAgICAgICAgICAgLy8gTG9nIHRoZSBzdWNjZXNzZnVsIGxvYWQgb2YgdGhlIHJlc291cmNlIHBhY2tcbiAgICAgICAgICAgICAgbmV3UGx1Z2luLmxvZ2dlci5zdWNjZXNzKFxuICAgICAgICAgICAgICAgIGBMb2FkZWQgcmVzb3VyY2UgcGFjayDCp3Uke3Jlc291cmNlLm5hbWV9wqdyICjCpzgke3Jlc291cmNlLnV1aWR9wqdyKS5gXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgLy8gQWRkIHRoZSByZXNvdXJjZSBwYWNrIHRvIHRoZSBwbHVnaW4gcmVzb3VyY2VzIHNldFxuICAgICAgICAgICAgICBuZXdQbHVnaW4ucmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgICAgICAgLy8gTG9nIHRoZSBlcnJvciBpZiB0aGUgcmVzb3VyY2UgcGFjayBmYWlsZWQgdG8gbG9hZFxuICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2UgcGFjayDCpzgke3JlbGF0aXZlKFxuICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBwYXRoKVxuICAgICAgICAgICAgICAgICl9wqdyIGZvciBwbHVnaW4gwqcxJHtuZXdQbHVnaW4uaWRlbnRpZmllcn3Cp3IuYCxcbiAgICAgICAgICAgICAgICByZWFzb25cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVhZCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgcmVhZEZpbGVTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIilcbiAgICAgICkgYXMgUGx1Z2luUGFja2FnZTtcblxuICAgICAgLy8gR2V0IHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgcGx1Z2luXG4gICAgICBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCBtYW5pZmVzdC5tYWluKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVkIGVudHJ5IHBvaW50IGlzIHZhbGlkXG4gICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBtYWluKSkpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgVW5hYmxlIHRvIHJlbG9hZCBwbHVnaW4gwqd1JHttYW5pZmVzdC5uYW1lID8/IFwidW5rbm93bi1wbHVnaW5cIn3CpzhAwqd1JHttYW5pZmVzdC52ZXJzaW9uID8/IFwidW5rbm93bi12ZXJzaW9uXCJ9wqdyLCB0aGUgbWFpbiBlbnRyeSBwYXRoIFwiwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHBhdGgsIG1haW4pKX3Cp3JcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEF0dGVtcHQgdG8gaW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHJlc29sdmUocGF0aCwgbWFpbikpO1xuXG4gICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgIGNvbnN0IG5ld1BsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICBuZXdQbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgbmV3UGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgIG5ld1BsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgIG5ld1BsdWdpbi5pc0J1bmRsZWQgPSBmYWxzZTtcblxuICAgICAgLy8gTGluayB0aGUgbW9kdWxlIHRvIHRoZSBwaXBlbGluZVxuICAgICAgdGhpcy5saW5rTW9kdWxlKG5ld1BsdWdpbi5pZGVudGlmaWVyLCBtb2R1bGUpO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgIHRoaXMucGx1Z2lucy5zZXQobmV3UGx1Z2luLmlkZW50aWZpZXIsIG5ld1BsdWdpbik7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChuZXdQbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbiwgYW5kIGJpbmQgdGhlIGV2ZW50c1xuICAgICAgbmV3UGx1Z2luLm9uSW5pdGlhbGl6ZShuZXdQbHVnaW4pO1xuICAgICAgdGhpcy5iaW5kRXZlbnRzKG5ld1BsdWdpbik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGJ1bmRsZShwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBCaW5hcnlTdHJlYW0gaW5zdGFuY2VcbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIHBsdWdpbiBoZWFkZXIgYmFzZWQgb24gdGhlIHJlc291cmNlc1xuICAgIGNvbnN0IGhlYWRlciA9XG4gICAgICBwbHVnaW4ucmVzb3VyY2VzLnNpemUgPiAwXG4gICAgICAgID8gUGx1Z2luSGVhZGVyLkhhc1Jlc291cmNlc1xuICAgICAgICA6IFBsdWdpbkhlYWRlci5IYXNOb1Jlc291cmNlcztcblxuICAgIC8vIFdyaXRlIHRoZSBwbHVnaW4gdHlwZSB0byB0aGUgc3RyZWFtXG4gICAgc3RyZWFtLndyaXRlQnl0ZShoZWFkZXIpO1xuXG4gICAgLy8gU3dpdGNoIGJhc2VkIG9uIHRoZSBwbHVnaW4gaGVhZGVyXG4gICAgc3dpdGNoIChoZWFkZXIpIHtcbiAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc05vUmVzb3VyY2VzOiB7XG4gICAgICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgcGx1Z2luJ3MgY29tcGlsZWQgaW5kZXggZmlsZVxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZShwbHVnaW4ucGF0aCwgXCJkaXN0XCIsIFwiaW5kZXguanNcIik7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgaW5kZXggZmlsZSBmcm9tIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgaW5kZXggPSByZWFkRmlsZVN5bmMocGF0aCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIGxlbmd0aCBvZiB0aGUgaW5kZXggZmlsZSB0byB0aGUgc3RyZWFtXG4gICAgICAgIHN0cmVhbS53cml0ZVZhckludChpbmRleC5ieXRlTGVuZ3RoKTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgaW5kZXggZmlsZSB0byB0aGUgc3RyZWFtXG4gICAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihpbmRleCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIEJpbmFyeVN0cmVhbSB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7cGx1Z2luLmlkZW50aWZpZXJ9LXYke3BsdWdpbi52ZXJzaW9ufS5wbHVnaW5gKSxcbiAgICAgICAgICBkZWZsYXRlU3luYyhzdHJlYW0uZ2V0QnVmZmVyKCkpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFBsdWdpbkhlYWRlci5IYXNSZXNvdXJjZXM6IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW4ncyBjb21waWxlZCBpbmRleCBmaWxlXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHBsdWdpbi5wYXRoLCBcImRpc3RcIiwgXCJpbmRleC5qc1wiKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBpbmRleCA9IHJlYWRGaWxlU3luYyhwYXRoKTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgc3RyZWFtLndyaXRlVmFySW50KGluZGV4LmJ5dGVMZW5ndGgpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBpbmRleCBmaWxlIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGluZGV4KTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgYW1vdW50IG9mIHJlc291cmNlcyB0byB0aGUgc3RyZWFtXG4gICAgICAgIHN0cmVhbS53cml0ZVZhckludChwbHVnaW4ucmVzb3VyY2VzLnNpemUpO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlc291cmNlcywgYW5kIHdyaXRlIHRoZW0gdG8gdGhlIHN0cmVhbVxuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHBsdWdpbi5yZXNvdXJjZXMpIHtcbiAgICAgICAgICAvLyBDb21wcmVzcyB0aGUgcmVzb3VyY2UgcGFjayBpbnRvIGEgYnVmZmVyXG4gICAgICAgICAgY29uc3QgYnVmZmVyID0gcmVzb3VyY2UuY29tcHJlc3MoKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIHJlc291cmNlIHBhY2sgdG8gdGhlIHN0cmVhbVxuICAgICAgICAgIHN0cmVhbS53cml0ZVZhckludChidWZmZXIuYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgcmVzb3VyY2UgcGFjayB0byB0aGUgc3RyZWFtXG4gICAgICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGJ1ZmZlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXcml0ZSB0aGUgQmluYXJ5U3RyZWFtIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0tdiR7cGx1Z2luLnZlcnNpb259LnBsdWdpbmApLFxuICAgICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGJpbmRFdmVudHMocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHByb3RvdHlwZSBvZiB0aGUgcGx1Z2luXG4gICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHBsdWdpbik7XG5cbiAgICAvLyBHZXQgdGhlIG9iamVjdCBrZXlzIGZyb20gdGhlIHBsdWdpblxuICAgIGNvbnN0IHBsdWdpbktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90b3R5cGUpO1xuXG4gICAgLy8gR2V0IHRoZSB3b3JsZCBldmVudCBrZXlzLCBhbmQgc2xpY2UgdGhlbSBpbiBoYWxmXG4gICAgbGV0IGV2ZW50S2V5cyA9IE9iamVjdC5rZXlzKFdvcmxkRXZlbnQpO1xuICAgIGV2ZW50S2V5cyA9IGV2ZW50S2V5cy5zbGljZShldmVudEtleXMubGVuZ3RoIC8gMik7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBldmVudCBrZXlzXG4gICAgZm9yIChjb25zdCBldmVudEtleSBvZiBldmVudEtleXMpIHtcbiAgICAgIC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIGV2ZW50IGtleVxuICAgICAgY29uc3QgaW5kZXggPSBldmVudEtleXMuaW5kZXhPZihldmVudEtleSkgYXMgV29ybGRFdmVudDtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYW55IFwib25cIiBldmVudCBrZXlzXG4gICAgICBpZiAocGx1Z2luS2V5cy5pbmNsdWRlcyhcIm9uXCIgKyBldmVudEtleSkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXZlbnQga2V5XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGx1Z2luWyhcIm9uXCIgKyBldmVudEtleSkgYXMga2V5b2YgUGx1Z2luXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gdGhlIHBsdWdpblxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkub24oaW5kZXgsIHZhbHVlLmJpbmQocGx1Z2luKSBhcyAoKSA9PiB2b2lkKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYW55IFwiYmVmb3JlXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJiZWZvcmVcIiArIGV2ZW50S2V5KSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBldmVudCBrZXlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwbHVnaW5bKFwiYmVmb3JlXCIgKyBldmVudEtleSkgYXMga2V5b2YgUGx1Z2luXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gdGhlIHBsdWdpblxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkuYmVmb3JlKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gYm9vbGVhbik7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcImFmdGVyXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJhZnRlclwiICsgZXZlbnRLZXkpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV2ZW50IGtleVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHBsdWdpblsoXCJhZnRlclwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5LmFmdGVyKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gdm9pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpbmsgYSBtb2R1bGUgdG8gdGhlIHBpcGVsaW5lLlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGxpbmsuXG4gICAqIEBwYXJhbSBtb2R1bGUgVGhlIG1vZHVsZSB0byBsaW5rLlxuICAgKi9cbiAgcHVibGljIGxpbmtNb2R1bGUobmFtZTogc3RyaW5nLCBtb2R1bGU6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHJ1bnRpbWUgb2YgdGhlIHNlcnZlclxuICAgIGNvbnN0IGlzQnVuID0gcHJvY2Vzcy52ZXJzaW9ucy5idW4gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZTtcblxuICAgIC8vIE1vZHVsZSBsaW5raW5nIGlzIG9ubHkgc3VwcG9ydGVkIGluIEJ1blxuICAgIGlmICghaXNCdW4pIHJldHVybjtcblxuICAgIC8vIEluamVjdCB0aGUgbW9kdWxlIGludG8gdGhlIEJ1biBwbHVnaW4gc3lzdGVtXG4gICAgQnVuLnBsdWdpbih7XG4gICAgICBuYW1lOiBgc2VyZW5pdHlqcy5wbHVnaW4uJHtuYW1lfWAsXG4gICAgICBzZXR1cChidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIubW9kdWxlKG5hbWUsICgpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXhwb3J0czogbW9kdWxlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgbG9hZGVyOiBcIm9iamVjdFwiXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGlwZWxpbmUsIERlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMgfTtcbiIsICJpbXBvcnQgeyByZWxhdGl2ZSB9IGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFdvcmxkIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi4vcGlwZWxpbmVcIjtcblxuaW1wb3J0IHsgUGx1Z2luQWN0aW9uc0VudW0sIFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vZW51bVwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQsIHBpcGVsaW5lOiBQaXBlbGluZSkgPT4ge1xuICB3b3JsZC5jb21tYW5kUGFsZXR0ZS5yZWdpc3RlcihcbiAgICBcInBsdWdpbnNcIixcbiAgICBcIkludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgb2YgdGhlIHNlcnZlclwiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbnMgPSBbXCJzZXJlbml0eS5vcGVyYXRvclwiXTtcblxuICAgICAgLy8gT3ZlcmxvYWQgZm9yIGxpc3RpbmcgdGhlIHBsdWdpbnNcbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bVxuICAgICAgICB9LFxuICAgICAgICAoeyBhY3Rpb24gfSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgbGlzdFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcImxpc3RcIikgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBpcGVsaW5lIGhhcyBubyBwbHVnaW5zXG4gICAgICAgICAgaWYgKHBpcGVsaW5lLnBsdWdpbnMuc2l6ZSA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwiwqdjVGhlcmUgYXJlIGN1cnJlbnQgbm8gcGx1Z2lucyBsb2FkZWQgb24gdGhlIHNlcnZlci5cIlxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2lucyBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbnMgPSBbLi4ucGlwZWxpbmUucGx1Z2lucy52YWx1ZXMoKV07XG5cbiAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFtdO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBwbHVnaW5zXG4gICAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIG5hbWUgdG8gdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIG1lc3NhZ2UucHVzaChgwqd1JHtwbHVnaW4uaWRlbnRpZmllcn0gdiR7cGx1Z2luLnZlcnNpb259wqdyYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGDCpzdBY3RpdmUgUGx1Z2lucyAoJHtwbHVnaW5zLmxlbmd0aH0pOsKnciAke21lc3NhZ2Uuam9pbihcIsKnNyzCp3IgXCIpfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIGFjdGlvbjogUGx1Z2luQWN0aW9uc0VudW0sXG4gICAgICAgICAgcGx1Z2luOiBQbHVnaW5zRW51bVxuICAgICAgICB9LFxuICAgICAgICAoeyBhY3Rpb24sIHBsdWdpbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyByZWxvYWRcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCAhPT0gXCJyZWxvYWRcIiAmJiBhY3Rpb24ucmVzdWx0ICE9PSBcImJ1bmRsZVwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbkluc3RhbmNlID0gcGlwZWxpbmUucGx1Z2lucy5nZXQocGx1Z2luLnJlc3VsdCBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBub3QgZm91bmRcbiAgICAgICAgICBpZiAoIXBsdWdpbkluc3RhbmNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gJHtwbHVnaW4ucmVzdWx0fSBpcyBub3QgZm91bmQuYCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ID09PSBcInJlbG9hZFwiKSB7XG4gICAgICAgICAgICAvLyBSZWxvYWQgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUucmVsb2FkKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IHJlbG9hZGVkIMKnMiR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn3Cp2EuYFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBsdWdpbkluc3RhbmNlLmlzQnVuZGxlZClcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGJ1bmRsZWRcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBQbHVnaW4gJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfSBjYW5ub3QgYmUgYnVuZGxlZCwgYXMgaXQgaXMgYWxyZWFkeSBhIGJ1bmRsZWQgcGx1Z2luLmBcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gQnVuZGxlIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIHBpcGVsaW5lLmJ1bmRsZShwbHVnaW5JbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogYMKnYVN1Y2Nlc3NmdWxseSBidW5kbGVkIMKnMiR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn3Cp2EsIG91dHB1dCBmaWxlIHdhcyBwbGFjZWQgYXQgwqc3JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwaXBlbGluZS5wYXRoKX3Cp2EuYFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBvdmVybG9hZCBtYXRjaGVkIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXCIpO1xuICAgIH1cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IEN1c3RvbUVudW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5zRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInBsdWdpbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbmNsYXNzIFBsdWdpbkFjdGlvbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luX2FjdGlvbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW1wibGlzdFwiLCBcInJlbG9hZFwiLCBcImJ1bmRsZVwiXTtcbn1cblxuZXhwb3J0IHsgUGx1Z2luc0VudW0sIFBsdWdpbkFjdGlvbnNFbnVtIH07XG4iLCAiZW51bSBQbHVnaW5IZWFkZXIge1xuICBIYXNOb1Jlc291cmNlcyA9IDIsXG4gIEhhc1Jlc291cmNlcyA9IDNcbn1cblxuZXhwb3J0IHsgUGx1Z2luSGVhZGVyIH07XG4iLCAiLyoqXG4gKiBUaGUgcHJpb3JpdHkgb2YgYSBwbHVnaW4gZGV0ZXJtaW5lcyB3aGVuIGl0IHdpbGwgYmUgbG9hZGVkIGluIHJlbGF0aW9uIHRvIG90aGVyIHBsdWdpbnMuXG4gKiBBIHBsdWdpbiB3aXRoIGEgaGlnaGVyIHByaW9yaXR5IHdpbGwgYmUgbG9hZGVkIGJlZm9yZSBhIHBsdWdpbiB3aXRoIGEgbG93ZXIgcHJpb3JpdHkuXG4gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IG5lZWQgdG8gYmUgbG9hZGVkIGJlZm9yZSBvciBhZnRlciBvdGhlciBwbHVnaW5zLlxuICogRm9yIGV4YW1wbGUsIGEgbGlicmFyeSBwbHVnaW4gbWF5IG5lZWQgdG8gYmUgbG9hZGVkIGJlZm9yZSBhIHBsdWdpbiB0aGF0IHVzZXMgaXQsXG4gKiBvciBhIHBsdWdpbiB0aGF0IG1vZGlmaWVzIHRoZSBiZWhhdmlvciBvZiBzZXJlbml0eSdzIEFQSXMgbWF5IG5lZWQgdG8gYmUgbG9hZGVkIGFmdGVyIGl0LlxuICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgTm9ybWFsLlxuICovXG5lbnVtIFBsdWdpblByaW9yaXR5IHtcbiAgLyoqXG4gICAqIEEgbG93IHByaW9yaXR5IHBsdWdpbiB3aWxsIGJlIGxvYWRlZCBhZnRlciBvdGhlciBwbHVnaW5zLlxuICAgKiBVc2VmdWwgZm9yIHJlYWN0aW5nIHRvIGNoYW5nZXMgb3IgZmluYWwgYWRqdXN0bWVudHMuXG4gICAqL1xuICBMb3csXG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHByaW9yaXR5IGZvciBhIHBsdWdpbi5cbiAgICogU3VpdGFibGUgZm9yIHN0YW5kYXJkIHBsdWdpbiBiZWhhdmlvci5cbiAgICovXG4gIE5vcm1hbCxcblxuICAvKipcbiAgICogQSBoaWdoIHByaW9yaXR5IHBsdWdpbiB3aWxsIGJlIGxvYWRlZCBiZWZvcmUgb3RoZXIgcGx1Z2lucy5cbiAgICogVXNlZnVsIGZvciBlYXJseSBzZXR1cCBvciBvdmVycmlkaW5nIGJlaGF2aW9yLlxuICAgKi9cbiAgSGlnaFxufVxuXG5leHBvcnQgeyBQbHVnaW5Qcmlvcml0eSB9O1xuIiwgIi8qKlxuICogVGhlIHBsdWdpbiB0eXBlIGRlY2xhcmVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgcGx1Z2luLlxuICovXG5lbnVtIFBsdWdpblR5cGUge1xuICAvKipcbiAgICogQW4gYWRkb24gcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aG91dCBhbiBleHBvc2VkIEFQSS5cbiAgICovXG4gIEFkZG9uLFxuXG4gIC8qKlxuICAgKiBBbiBBUEkgcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aCBhbiBleHBvc2VkIEFQSSBmb3Igb3RoZXIgcGx1Z2lucyB0byB1c2UuXG4gICAqL1xuICBBcGlcbn1cblxuZXhwb3J0IHsgUGx1Z2luVHlwZSB9O1xuIiwgImltcG9ydCB7IFJlc291cmNlUGFjaywgU2VyZW5pdHkgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSBcIkBzZXJlbml0eWpzL2VtaXR0ZXJcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi9waXBlbGluZVwiO1xuaW1wb3J0IHsgUGx1Z2luRXZlbnRzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIFBsdWdpbkJsb2NrUmVnaXN0cnksXG4gIFBsdWdpbkVudGl0eVJlZ2lzdHJ5LFxuICBQbHVnaW5JdGVtUmVnaXN0cnlcbn0gZnJvbSBcIi4vcmVnaXN0cnlcIjtcbmltcG9ydCB7IFBsdWdpblByaW9yaXR5IH0gZnJvbSBcIi4vZW51bXMvcHJpb3JpdHlcIjtcblxuaW50ZXJmYWNlIFBsdWdpbk9wdGlvbnMgZXh0ZW5kcyBQYXJ0aWFsPFBsdWdpbkV2ZW50cz4ge1xuICAvKipcbiAgICogVGhlIGxvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIGxvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHJpb3JpdHk6IFBsdWdpblByaW9yaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgbGlzdGVuZXJzIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgbWF4TGlzdGVuZXJzOiBudW1iZXI7XG59XG5cbi8qKlxuICogIyBJbnRyb2R1Y3Rpb25cbiAqIFBsdWdpbnMgYXJlIHRoZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3Mgb2YgU2VyZW5pdHlKUy5cbiAqIFRoZXkgYXJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aGljaCBhbGxvd3MgdG90YWwgY29udHJvbCBvdmVyIHRoZSBzZXJ2ZXIuXG4gKlxuICogVGhlcmUgYXJlIDIgdHlwZXMgb2YgcGx1Z2lucyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBgUGx1Z2luVHlwZWAgZW51bTogYEFkZG9uYCAmIGBBcGlgXG4gKlxuICogQWRkb24gcGx1Z2lucyBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGhvdXQgYW4gZXhwb3NlZCBBUEkuIFRoaXMgbWVhbnMgZXh0ZXJuYWwgcGx1Z2lucyBjYW5ub3QgZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBBUEkuXG4gKiBBcGkgcGx1Z2lucyBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGggYW4gZXhwb3NlZCBBUEkgZm9yIG90aGVyIHBsdWdpbnMgdG8gdXNlLiBUaGlzIG1lYW5zIGV4dGVybmFsIHBsdWdpbnMgY2FuIGRpcmVjdGx5IGludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgQVBJLlxuICpcbiAqICMjIENsYXNzIEV4dGVuZGluZyBQbHVnaW5cbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBQbHVnaW4sIFBsdWdpblR5cGUsIFBsdWdpbkV2ZW50cyB9IGZyb20gXCJAc2VyZW5pdHlqcy9wbHVnaW5zXCI7XG4gKlxuICogY2xhc3MgU2FtcGxlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAqICAgcHVibGljIHJlYWRvbmx5IHR5cGUgPSBQbHVnaW5UeXBlLkFkZG9uO1xuICpcbiAqICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHN1cGVyKFwic2FtcGxlLXBsdWdpblwiLCBcIjEuMC4wXCIpO1xuICogICB9XG4gKlxuICogICBwdWJsaWMgb25Jbml0aWFsaXplKCk6IHZvaWQge31cbiAqXG4gKiAgIHB1YmxpYyBvblN0YXJ0VXAoKTogdm9pZCB7fVxuICpcbiAqICAgcHVibGljIG9uU2h1dERvd24oKTogdm9pZCB7fVxuICogfVxuICpcbiAqIGV4cG9ydCBkZWZhdWx0IG5ldyBTYW1wbGVQbHVnaW4oKTtcbiAqIGBgYFxuICovXG5jbGFzcyBQbHVnaW48VCA9IHVua25vd24+IGV4dGVuZHMgRW1pdHRlcjxUPiBpbXBsZW1lbnRzIFBsdWdpbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJpb3JpdHkgb2YgdGhlIHBsdWdpbi5cbiAgICogQG5vdGUgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgb3JkZXIgaW4gd2hpY2ggcGx1Z2lucyBhcmUgbG9hZGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByaW9yaXR5OiBQbHVnaW5Qcmlvcml0eSA9IFBsdWdpblByaW9yaXR5Lk5vcm1hbDtcblxuICAvKipcbiAgICogVGhlIGJsb2NrIHJlZ2lzdHJ5IGZvciB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzL3RyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJsb2NrcyA9IG5ldyBQbHVnaW5CbG9ja1JlZ2lzdHJ5KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBpdGVtIHJlZ2lzdHJ5IGZvciB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzL3RyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGl0ZW1zID0gbmV3IFBsdWdpbkl0ZW1SZWdpc3RyeSgpO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHJlZ2lzdHJ5IGZvciB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzL3RyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0aWVzID0gbmV3IFBsdWdpbkVudGl0eVJlZ2lzdHJ5KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlcyA9IG5ldyBTZXQ8UmVzb3VyY2VQYWNrPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2luLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGF0aCE6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsdWdpbiBpcyBidW5kbGVkLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgaXNCdW5kbGVkITogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwaXBlbGluZSB0aGUgcGx1Z2luIGlzIGluLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGlwZWxpbmUhOiBQaXBlbGluZTtcblxuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IGluc3RhbmNlIG9mIHRoZSBzZXJ2ZXIuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBzZXJlbml0eSE6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcGx1Z2luIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICB2ZXJzaW9uOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8UGx1Z2luT3B0aW9ucz5cbiAgKSB7XG4gICAgLy8gQ2FsbCB0aGUgc3VwZXIgbWV0aG9kIHdpdGggdGhlIG1heCBsaXN0ZW5lcnNcbiAgICBzdXBlcihvcHRpb25zPy5tYXhMaXN0ZW5lcnMpO1xuXG4gICAgLy8gU2V0IHRoZSBpZGVudGlmaWVyIGFuZCB2ZXJzaW9uIG9mIHRoZSBwbHVnaW5cbiAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICAvLyBTZXQgdGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpblxuICAgIHRoaXMubG9nZ2VyID1cbiAgICAgIG9wdGlvbnM/LmxvZ2dlciA/P1xuICAgICAgbmV3IExvZ2dlcihgJHtpZGVudGlmaWVyfUAke3ZlcnNpb259YCwgTG9nZ2VyQ29sb3JzLkJsdWUpO1xuXG4gICAgLy8gU2V0IHRoZSBvbiBpbml0aWFsaXplLCBzdGFydCB1cCwgYW5kIHNodXQgZG93biBvcHRpb25zXG4gICAgaWYgKG9wdGlvbnM/Lm9uSW5pdGlhbGl6ZSkgdGhpcy5vbkluaXRpYWxpemUgPSBvcHRpb25zLm9uSW5pdGlhbGl6ZTtcbiAgICBpZiAob3B0aW9ucz8ub25TdGFydFVwKSB0aGlzLm9uU3RhcnRVcCA9IG9wdGlvbnMub25TdGFydFVwO1xuICAgIGlmIChvcHRpb25zPy5vblNodXREb3duKSB0aGlzLm9uU2h1dERvd24gPSBvcHRpb25zLm9uU2h1dERvd247XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIHBsdWdpbiBieSBpdHMgaWRlbnRpZmllclxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luIHRvIHJlc29sdmUuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaW5zdGFuY2UgaWYgZm91bmQsIG90aGVyd2lzZSBudWxsLlxuICAgKi9cbiAgcHVibGljIHJlc29sdmU8VCBleHRlbmRzIFBsdWdpbj4oaWRlbnRpZmllcjogc3RyaW5nKTogVCB8IG51bGwge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwaXBlbGluZSBpcyBkZWZpbmVkLlxuICAgIGlmICghdGhpcy5waXBlbGluZSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBHZXQgdGhlIHBsdWdpbiBmcm9tIHRoZSBwaXBlbGluZVxuICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMucGlwZWxpbmUucGx1Z2lucy5nZXQoaWRlbnRpZmllcik7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGRlZmluZWRcbiAgICBpZiAoIXBsdWdpbikgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHBsdWdpblxuICAgIHJldHVybiBwbHVnaW4gYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgaW5pdGlhbGl6ZWQuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uSW5pdGlhbGl6ZShfcGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgc3RhcnRlZCB1cC5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHN0YXJ0ZWQgdXAuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU3RhcnRVcChfcGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgc2h1dCBkb3duLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgc2h1dCBkb3duLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblNodXREb3duKF9wbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luLCBQbHVnaW5PcHRpb25zIH07XG4iLCAiaW1wb3J0IHsgdHlwZSBCbG9ja1RyYWl0LCBDdXN0b21CbG9ja1R5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5CbG9ja1JlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBibG9jayB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21CbG9ja1R5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBibG9jayB0cmFpdHMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHM6IEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBibG9jayB0eXBlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21CbG9ja1R5cGU+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHlwZSB0byB0aGUgdHlwZXMgYXJyYXkuXG4gICAgdGhpcy50eXBlcy5wdXNoKC4uLnR5cGVzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gYmxvY2sgdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUeXBlKHR5cGU6IEN1c3RvbUJsb2NrVHlwZSk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSB0eXBlcyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHlwZXMuaW5kZXhPZih0eXBlKTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSB0eXBlc1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHlwZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gYmxvY2sgdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUcmFpdCguLi50cmFpdHM6IEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGJsb2NrIHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgQmxvY2tUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5CbG9ja1JlZ2lzdHJ5IH07XG4iLCAiaW1wb3J0IHsgdHlwZSBJdGVtU3RhY2tUcmFpdCwgQ3VzdG9tSXRlbVR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5JdGVtUmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGl0ZW0gdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tSXRlbVR5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBpdGVtIHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEl0ZW1TdGFja1RyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGl0ZW0gdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21JdGVtVHlwZT4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0eXBlIHRvIHRoZSB0eXBlcyBhcnJheS5cbiAgICB0aGlzLnR5cGVzLnB1c2goLi4udHlwZXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGl0ZW0gdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclR5cGUodHlwZTogQ3VzdG9tSXRlbVR5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gaXRlbSB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgSXRlbVN0YWNrVHJhaXQ+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHRyYWl0cyBhcnJheS5cbiAgICB0aGlzLnRyYWl0cy5wdXNoKC4uLnRyYWl0cyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBpdGVtIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBpdGVtIHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHJhaXQodHJhaXQ6IHR5cGVvZiBJdGVtU3RhY2tUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5JdGVtUmVnaXN0cnkgfTtcbiIsICJpbXBvcnQgeyB0eXBlIEVudGl0eVRyYWl0LCBDdXN0b21FbnRpdHlUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luRW50aXR5UmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGVudGl0eSB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21FbnRpdHlUeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gZW50aXR5IHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gZW50aXR5IHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21FbnRpdHlUeXBlPik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHR5cGUgdG8gdGhlIHR5cGVzIGFycmF5LlxuICAgIHRoaXMudHlwZXMucHVzaCguLi50eXBlcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBlbnRpdHkgdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHlwZSh0eXBlOiBDdXN0b21FbnRpdHlUeXBlKTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIHR5cGVzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50eXBlcy5pbmRleE9mKHR5cGUpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0eXBlIGZyb20gdGhlIHR5cGVzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50eXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gZW50aXR5IHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRyYWl0KC4uLnRyYWl0czogQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBlbnRpdHkgdHJhaXQgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgRW50aXR5VHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luRW50aXR5UmVnaXN0cnkgfTtcbiJdLAogICJtYXBwaW5ncyI6ICJvVUFDQSxPQUNFQSxjQUFBQSxFQUNBQyxhQUFBQSxFQUNBQyxlQUFBQSxFQUNBQyxnQkFBQUEsRUFDQUMsY0FBQUEsRUFDQUMsaUJBQUFBLE1BQ0ssVUFDUCxPQUFTQyxZQUFBQSxFQUFVQyxXQUFBQSxNQUFlLFlBQ2xDLE9BQVNDLGVBQUFBLEVBQWFDLGVBQUFBLE1BQW1CLFlBRXpDLE9BQVNDLFVBQUFBLEVBQVFDLGdCQUFBQSxNQUFvQixxQkFDckMsT0FBbUJDLGVBQUFBLEVBQWFDLGNBQUFBLE1BQWtCLG1CQUNsRCxPQUFTQyxnQkFBQUEsTUFBb0IsMkJDZDdCLE9BQVNDLFlBQUFBLE1BQWdCLE9DQXpCLE9BQVNDLGNBQUFBLE1BQWtCLG1CQUUzQixJQUFNQyxFQUFOLGNBQTBCQyxDQUFBQSxDQUYxQixNQUUwQkEsQ0FBQUEsRUFBQUEsb0JBQ3hCLE9BQXVCQyxXQUFhLFVBQ3BDLE9BQXVCQyxRQUF5QixDQUFBLENBQ2xELEVBRU1DLEVBQU4sY0FBZ0NILENBQUFBLENBUGhDLE1BT2dDQSxDQUFBQSxFQUFBQSwwQkFDOUIsT0FBdUJDLFdBQWEsaUJBQ3BDLE9BQXVCQyxRQUF5QixDQUFDLE9BQVEsU0FBVSxTQUNyRSxFREZBLElBQU1FLEVBQVdDLEVBQUEsQ0FBQ0MsRUFBY0MsSUFBQUEsQ0FDOUJELEVBQU1FLGVBQWVKLFNBQ25CLFVBQ0EsMENBQ0NLLEdBQUFBLENBRUNBLEVBQVNDLFlBQWMsQ0FBQyxxQkFHeEJELEVBQVNFLFNBQ1AsQ0FDRUMsT0FBUUMsQ0FDVixFQUNBLENBQUMsQ0FBRUQsT0FBQUEsQ0FBTSxJQUFFLENBRVQsR0FBSUEsRUFBT0Us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LElBQUlrQixFQUFPLEdBQUdwQixDQUFBQSxJQUFjQyxDQUFBQSxHQUFXb0IsRUFBYUMsSUFBSSxFQUd0REosR0FBU0ssZUFBYyxLQUFLQSxhQUFlTCxFQUFRSyxjQUNuREwsR0FBU00sWUFBVyxLQUFLQSxVQUFZTixFQUFRTSxXQUM3Q04sR0FBU08sYUFBWSxLQUFLQSxXQUFhUCxFQUFRTyxXQUNyRCxDQU9PQyxRQUEwQjFCLEVBQThCLENBRTdELEdBQUksQ0FBQyxLQUFLZ0IsU0FBVSxPQUFPLEtBRzNCLElBQU1XLEVBQVMsS0FBS1gsU0FBU1ksUUFBUUMsSUFBSTdCLENBQUFBLEVBR3pDLE9BQUsyQixHQUFlLElBSXRCLENBTU9KLGFBQWFPLEVBQXVCLENBRTNDLENBTU9OLFVBQVVNLEVBQXVCLENBRXhDLENBTU9MLFdBQVdLLEVBQXVCLENBRXpDLENBQ0YiLAogICJuYW1lcyI6IFsiZXhpc3RzU3luYyIsICJta2RpclN5bmMiLCAicmVhZGRpclN5bmMiLCAicmVhZEZpbGVTeW5jIiwgInVubGlua1N5bmMiLCAid3JpdGVGaWxlU3luYyIsICJyZWxhdGl2ZSIsICJyZXNvbHZlIiwgImRlZmxhdGVTeW5jIiwgImluZmxhdGVTeW5jIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiU2VydmVyRXZlbnQiLCAiV29ybGRFdmVudCIsICJCaW5hcnlTdHJlYW0iLCAicmVsYXRpdmUiLCAiQ3VzdG9tRW51bSIsICJQbHVnaW5zRW51bSIsICJDdXN0b21FbnVtIiwgImlkZW50aWZpZXIiLCAib3B0aW9ucyIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZWdpc3RlciIsICJfX25hbWUiLCAid29ybGQiLCAicGlwZWxpbmUiLCAiY29tbWFuZFBhbGV0dGUiLCAicmVnaXN0cnkiLCAicGVybWlzc2lvbnMiLCAib3ZlcmxvYWQiLCAiYWN0aW9uIiwgIlBsdWdpbkFjdGlvbnNFbnVtIiwgInJlc3VsdCIsICJwbHVnaW5zIiwgInNpemUiLCAibWVzc2FnZSIsICJ2YWx1ZXMiLCAicGx1Z2luIiwgInB1c2giLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxlbmd0aCIsICJqb2luIiwgIlBsdWdpbnNFbnVtIiwgInBsdWdpbkluc3RhbmNlIiwgImdldCIsICJFcnJvciIsICJyZWxvYWQiLCAiaXNCdW5kbGVkIiwgImJ1bmRsZSIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImN3ZCIsICJwYXRoIiwgImNvbW1hbmRfZGVmYXVsdCIsICJQbHVnaW5IZWFkZXIiLCAiUGx1Z2luUHJpb3JpdHkiLCAiUGx1Z2luVHlwZSIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgInBhdGgiLCAiY29tbWFuZHMiLCAiaW5pdGlhbGl6ZSIsICJQaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgImxvZ2dlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIk1hdGVyaWFsTGFwaXMiLCAicGx1Z2lucyIsICJNYXAiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJwbHVnaW4iLCAiYmxvY2tQYWxldHRlIiwgInJlZ2lzdGVyVHlwZSIsICJibG9ja3MiLCAidHlwZXMiLCAicmVnaXN0ZXJUcmFpdCIsICJ0cmFpdHMiLCAiaXRlbVBhbGV0dGUiLCAiaXRlbXMiLCAiZW50aXR5UGFsZXR0ZSIsICJlbnRpdGllcyIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0ZpbGUiLCAibmFtZSIsICJlbmRzV2l0aCIsICJvcmRlcmVkUGx1Z2lucyIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInJlYWRCeXRlIiwgInR5cGUiLCAiUGx1Z2luSGVhZGVyIiwgIkhhc05vUmVzb3VyY2VzIiwgImxlbmd0aCIsICJyZWFkVmFySW50IiwgImluZGV4IiwgInJlYWRCdWZmZXIiLCAidG9TdHJpbmciLCAibG9hZEZyb21UZXh0U291cmNlIiwgInB1c2giLCAiSGFzUmVzb3VyY2VzIiwgInJlc291cmNlcyIsICJpIiwgInJlc291cmNlIiwgImxvYWRGcm9tWmlwIiwgInN1Y2Nlc3MiLCAidXVpZCIsICJhZGQiLCAicmVhc29uIiwgImVycm9yIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgImlkZW50aWZpZXIiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJ3YXJuIiwgInJlYWRSZW1haW5pbmdCdWZmZXIiLCAiQXBpIiwgImRpcmVjdG9yaWVzIiwgImlzRGlyZWN0b3J5IiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJyZXF1aXJlIiwgImRlZmF1bHQiLCAiaGFzIiwgInBpcGVsaW5lIiwgImlzQnVuZGxlZCIsICJsaW5rTW9kdWxlIiwgInNldCIsICJQbHVnaW5zRW51bSIsICJvcHRpb25zIiwgInBhY2siLCAibG9hZEZyb21QYXRoIiwgInNvcnQiLCAiYSIsICJiIiwgInByaW9yaXR5IiwgIm9uSW5pdGlhbGl6ZSIsICJiaW5kRXZlbnRzIiwgInRlbXAiLCAic2xpY2UiLCAicmVwbGFjZSIsICJuZXh0VGljayIsICJ1bmxpbmtTeW5jIiwgInZhbHVlcyIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJzb3VyY2UiLCAid3JpdGVGaWxlU3luYyIsICJyZWxvYWQiLCAiZGVsZXRlIiwgImNhY2hlIiwgInJlbW92ZVBhdGgiLCAicGFja3MiLCAibmV3UGx1Z2luIiwgImhlYWRlciIsICJzaXplIiwgIndyaXRlQnl0ZSIsICJ3cml0ZVZhckludCIsICJieXRlTGVuZ3RoIiwgIndyaXRlQnVmZmVyIiwgImRlZmxhdGVTeW5jIiwgImdldEJ1ZmZlciIsICJjb21wcmVzcyIsICJwcm90b3R5cGUiLCAiT2JqZWN0IiwgImdldFByb3RvdHlwZU9mIiwgInBsdWdpbktleXMiLCAiZ2V0T3duUHJvcGVydHlOYW1lcyIsICJldmVudEtleXMiLCAia2V5cyIsICJldmVudEtleSIsICJpbmRleE9mIiwgImluY2x1ZGVzIiwgInZhbHVlIiwgImJlZm9yZSIsICJhZnRlciIsICJ2ZXJzaW9ucyIsICJidW4iLCAidW5kZWZpbmVkIiwgIkJ1biIsICJzZXR1cCIsICJidWlsZGVyIiwgImxvYWRlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIkVtaXR0ZXIiLCAiUGx1Z2luQmxvY2tSZWdpc3RyeSIsICJ0eXBlcyIsICJ0cmFpdHMiLCAicmVnaXN0ZXJUeXBlIiwgInB1c2giLCAidW5yZWdpc3RlclR5cGUiLCAidHlwZSIsICJpbmRleCIsICJpbmRleE9mIiwgInNwbGljZSIsICJyZWdpc3RlclRyYWl0IiwgInVucmVnaXN0ZXJUcmFpdCIsICJ0cmFpdCIsICJQbHVnaW5JdGVtUmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luRW50aXR5UmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luIiwgIkVtaXR0ZXIiLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxvZ2dlciIsICJwcmlvcml0eSIsICJQbHVnaW5Qcmlvcml0eSIsICJOb3JtYWwiLCAiYmxvY2tzIiwgIlBsdWdpbkJsb2NrUmVnaXN0cnkiLCAiaXRlbXMiLCAiUGx1Z2luSXRlbVJlZ2lzdHJ5IiwgImVudGl0aWVzIiwgIlBsdWdpbkVudGl0eVJlZ2lzdHJ5IiwgInJlc291cmNlcyIsICJTZXQiLCAicGF0aCIsICJpc0J1bmRsZWQiLCAicGlwZWxpbmUiLCAic2VyZW5pdHkiLCAib3B0aW9ucyIsICJtYXhMaXN0ZW5lcnMiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJCbHVlIiwgIm9uSW5pdGlhbGl6ZSIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJyZXNvbHZlIiwgInBsdWdpbiIsICJwbHVnaW5zIiwgImdldCIsICJfcGx1Z2luIl0KfQo=
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@serenityjs/plugins",
3
3
  "author": "Serenity",
4
4
  "license": "MIT",
5
- "version": "0.8.11",
5
+ "version": "0.8.12-beta-20250825015248",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
8
8
  "types": "./dist/index.d.ts",
@@ -20,7 +20,7 @@
20
20
  "typecheck": "tsc --noEmit"
21
21
  },
22
22
  "devDependencies": {
23
- "@serenityjs/internal-config": "*",
23
+ "@serenityjs/internal-config": "0.8.12-beta-20250825015248",
24
24
  "@swc/core": "1.7.42",
25
25
  "@types/node": "22.8.6",
26
26
  "eslint": "9.13.0",
@@ -29,9 +29,9 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "@serenityjs/binarystream": "2.7.3",
32
- "@serenityjs/core": "*",
33
- "@serenityjs/emitter": "*",
34
- "@serenityjs/logger": "*",
35
- "@serenityjs/protocol": "*"
32
+ "@serenityjs/core": "0.8.12-beta-20250825015248",
33
+ "@serenityjs/emitter": "0.8.12-beta-20250825015248",
34
+ "@serenityjs/logger": "0.8.12-beta-20250825015248",
35
+ "@serenityjs/protocol": "0.8.12-beta-20250825015248"
36
36
  }
37
37
  }