@fjall/util 0.86.1 → 0.87.3

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.
@@ -1,6 +1,5 @@
1
1
  import type { Account } from "@aws-sdk/client-organizations";
2
2
  export type { Account } from "@aws-sdk/client-organizations";
3
- type Provider = "aws";
4
3
  export type ServiceConfig = {
5
4
  id: string;
6
5
  type?: string;
@@ -25,8 +24,8 @@ export type Profile = {
25
24
  ssoRoleName?: string;
26
25
  ssoSession?: string;
27
26
  credentialSource?: "keychain";
28
- roleArn?: string;
29
- roleSessionName?: string;
27
+ oidcRoleArn?: string;
28
+ oidcProviderArn?: string;
30
29
  };
31
30
  export type SSOSession = {
32
31
  ssoRegion: string;
@@ -38,7 +37,6 @@ type RootConfig = {
38
37
  services?: {
39
38
  [key: string]: ServiceConfig;
40
39
  };
41
- provider?: Provider;
42
40
  providerAccounts?: ProviderAccount[];
43
41
  primaryRegion?: string;
44
42
  secondaryRegions?: string[];
@@ -62,7 +60,7 @@ export declare class Config {
62
60
  rootConfig: RootConfig;
63
61
  existingAccountsConfig: Account[];
64
62
  costAllocationTagsConfig: CostAllocationTags[];
65
- constructor(rootConfig?: object, existingAccountsConfig?: Account[], costAllocationTagsConfig?: CostAllocationTags[]);
63
+ constructor(rootConfig?: RootConfig, existingAccountsConfig?: Account[], costAllocationTagsConfig?: CostAllocationTags[]);
66
64
  isDevelopment(): boolean;
67
65
  /**
68
66
  * Find the fjall config directory by walking up the directory tree
@@ -78,45 +76,29 @@ export declare class Config {
78
76
  * Load configuration from file
79
77
  *
80
78
  * @returns Loaded configuration
79
+ * @throws Error if config file cannot be parsed
81
80
  */
82
81
  static loadConfig(): Config;
83
82
  /**
84
83
  * Save configuration to file
85
84
  */
86
85
  saveConfig(): void;
87
- /**
88
- * Set the schema version used for this config file
89
- *
90
- * @param version Schema Version
91
- */
92
- setVersion(version: number): void;
93
86
  /**
94
87
  * Add a new service to the config file
95
88
  * @param serviceKey Name/key of the service
96
89
  * @param config Service configuration properties
97
90
  */
98
91
  addService(serviceKey: string, config: ServiceConfig): void;
99
- /**
100
- * Set config options on a previously defined service
101
- *
102
- * @param serviceKey Name/key of the service
103
- * @param config Service configuration properties to set
104
- */
105
- setServiceOption(serviceKey: string, config: ServiceConfig): void;
106
92
  getServiceConfig(serviceKey: string): ServiceConfig | null;
107
- setProvider(provider: Provider): void;
108
93
  addProviderAccount(account: ProviderAccount): void;
109
- getProviderAccount(accountName: string): ProviderAccount | null | undefined;
110
- getProviderAccountById(accountId: string): ProviderAccount | null | undefined;
94
+ getProviderAccount(accountName: string): ProviderAccount | undefined;
95
+ getProviderAccountById(accountId: string): ProviderAccount | undefined;
111
96
  /**
112
97
  * Get provider account by environment type
113
98
  * @param environment The environment type (e.g., 'platform', 'staging', 'production')
114
99
  * @returns The provider account with the specified environment or undefined if not found
115
100
  */
116
101
  getAccountByEnvironment(environment: string): ProviderAccount | undefined;
117
- updateProviderAccountEnvironments(accountTypes: {
118
- [key: string]: readonly string[];
119
- }): void;
120
102
  /**
121
103
  * Sets the existing accounts list. This should be called by AccountService
122
104
  * after it fetches the accounts from AWS.
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Config = void 0;
4
4
  const fs = require("fs");
5
+ const path = require("path");
5
6
  /**
6
7
  * The current base-version of any newly created config file
7
8
  */
@@ -11,19 +12,13 @@ const BASE_CONFIG_VERSION = 0.1;
11
12
  */
12
13
  class Config {
13
14
  constructor(rootConfig, existingAccountsConfig, costAllocationTagsConfig) {
14
- this.rootConfig = rootConfig
15
- ? rootConfig
16
- : {
17
- version: BASE_CONFIG_VERSION,
18
- services: {},
19
- providerAccounts: []
20
- };
21
- this.existingAccountsConfig = existingAccountsConfig
22
- ? existingAccountsConfig
23
- : [];
24
- this.costAllocationTagsConfig = costAllocationTagsConfig
25
- ? costAllocationTagsConfig
26
- : [];
15
+ this.rootConfig = rootConfig ?? {
16
+ version: BASE_CONFIG_VERSION,
17
+ services: {},
18
+ providerAccounts: []
19
+ };
20
+ this.existingAccountsConfig = existingAccountsConfig ?? [];
21
+ this.costAllocationTagsConfig = costAllocationTagsConfig ?? [];
27
22
  }
28
23
  isDevelopment() {
29
24
  return !!this.rootConfig?.development;
@@ -33,25 +28,21 @@ class Config {
33
28
  * @returns The path to the fjall config directory or null if not found
34
29
  */
35
30
  static findConfigDirectory() {
36
- const path = require("path");
37
31
  let currentDir = process.cwd();
38
32
  const maxDepth = 10; // Prevent infinite loops
39
33
  for (let i = 0; i < maxDepth; i++) {
40
- // Check if current directory contains fjall config files
41
34
  const fjallDir = path.join(currentDir, "fjall");
42
35
  const configFile = path.join(fjallDir, "fjall-config.json");
43
36
  if (fs.existsSync(configFile)) {
44
37
  return fjallDir;
45
38
  }
46
- // Check if current directory IS the fjall config directory
47
39
  const directConfigFile = path.join(currentDir, "fjall-config.json");
48
40
  if (fs.existsSync(directConfigFile)) {
49
41
  return currentDir;
50
42
  }
51
- // Move up one directory
52
43
  const parentDir = path.dirname(currentDir);
53
44
  if (parentDir === currentDir)
54
- break; // Reached filesystem root
45
+ break;
55
46
  currentDir = parentDir;
56
47
  }
57
48
  return null;
@@ -68,9 +59,6 @@ class Config {
68
59
  });
69
60
  }
70
61
  catch (_err) {
71
- // console.log(
72
- // `Expected file '${configFile}' does not exist or cannot be read.`
73
- // );
74
62
  return null;
75
63
  }
76
64
  }
@@ -78,18 +66,17 @@ class Config {
78
66
  * Load configuration from file
79
67
  *
80
68
  * @returns Loaded configuration
69
+ * @throws Error if config file cannot be parsed
81
70
  */
82
71
  static loadConfig() {
72
+ const configDir = Config.findConfigDirectory();
73
+ if (!configDir) {
74
+ return new Config();
75
+ }
76
+ const rootConfigJson = Config.loadConfigFile(path.join(configDir, "fjall-config.json"));
77
+ const existingAccountJson = Config.loadConfigFile(path.join(configDir, "accounts-config.json"));
78
+ const costAllocationTagsJson = Config.loadConfigFile(path.join(configDir, "cost-allocation-tags-config.json"));
83
79
  try {
84
- const configDir = Config.findConfigDirectory();
85
- if (!configDir) {
86
- // Return default config if no config directory found
87
- return new Config();
88
- }
89
- const path = require("path");
90
- const rootConfigJson = Config.loadConfigFile(path.join(configDir, "fjall-config.json"));
91
- const existingAccountJson = Config.loadConfigFile(path.join(configDir, "accounts-config.json"));
92
- const costAllocationTagsJson = Config.loadConfigFile(path.join(configDir, "cost-allocation-tags-config.json"));
93
80
  const rootConfig = rootConfigJson
94
81
  ? JSON.parse(rootConfigJson)
95
82
  : undefined;
@@ -102,15 +89,14 @@ class Config {
102
89
  return new Config(rootConfig, existingAccountsConfig, costAllocationTagsConfig);
103
90
  }
104
91
  catch (err) {
105
- console.error("Unable to parse config file. Aborting.", err);
106
- process.exit(1);
92
+ const message = err instanceof Error ? err.message : String(err);
93
+ throw new Error(`Unable to parse config file: ${message}`);
107
94
  }
108
95
  }
109
96
  /**
110
97
  * Save configuration to file
111
98
  */
112
99
  saveConfig() {
113
- const path = require("path");
114
100
  const configDir = Config.findConfigDirectory() || path.join(process.cwd(), "fjall");
115
101
  // Ensure directory exists
116
102
  fs.mkdirSync(configDir, { recursive: true });
@@ -121,14 +107,6 @@ class Config {
121
107
  const costAllocationTagsJsonString = JSON.stringify(this.costAllocationTagsConfig, null, 2);
122
108
  fs.writeFileSync(path.join(configDir, "cost-allocation-tags-config.json"), costAllocationTagsJsonString);
123
109
  }
124
- /**
125
- * Set the schema version used for this config file
126
- *
127
- * @param version Schema Version
128
- */
129
- setVersion(version) {
130
- this.rootConfig.version = version;
131
- }
132
110
  /**
133
111
  * Add a new service to the config file
134
112
  * @param serviceKey Name/key of the service
@@ -139,28 +117,11 @@ class Config {
139
117
  this.rootConfig.services = {};
140
118
  this.rootConfig.services[serviceKey] = config;
141
119
  }
142
- /**
143
- * Set config options on a previously defined service
144
- *
145
- * @param serviceKey Name/key of the service
146
- * @param config Service configuration properties to set
147
- */
148
- setServiceOption(serviceKey, config) {
149
- if (!this.rootConfig.services)
150
- this.rootConfig.services = {};
151
- const service = this.rootConfig.services[serviceKey];
152
- if (!service)
153
- return;
154
- this.rootConfig.services[serviceKey] = { ...service, ...config };
155
- }
156
120
  getServiceConfig(serviceKey) {
157
121
  if (!this.rootConfig.services)
158
122
  return null;
159
123
  return this.rootConfig.services[serviceKey] || null;
160
124
  }
161
- setProvider(provider) {
162
- this.rootConfig.provider = provider;
163
- }
164
125
  addProviderAccount(account) {
165
126
  if (!this.rootConfig.providerAccounts)
166
127
  this.rootConfig.providerAccounts = [];
@@ -169,14 +130,13 @@ class Config {
169
130
  this.rootConfig.providerAccounts.push(account);
170
131
  }
171
132
  getProviderAccount(accountName) {
172
- // TODO: Fix null error
173
133
  if (!this.rootConfig.providerAccounts)
174
- return null;
134
+ return undefined;
175
135
  return this.rootConfig.providerAccounts.find((account) => account.name.toLocaleLowerCase() === accountName.toLocaleLowerCase());
176
136
  }
177
137
  getProviderAccountById(accountId) {
178
138
  if (!this.rootConfig.providerAccounts)
179
- return null;
139
+ return undefined;
180
140
  return this.rootConfig.providerAccounts.find((account) => account.id === accountId);
181
141
  }
182
142
  /**
@@ -189,18 +149,6 @@ class Config {
189
149
  return undefined;
190
150
  return this.rootConfig.providerAccounts.find((account) => account.environment === environment);
191
151
  }
192
- updateProviderAccountEnvironments(accountTypes) {
193
- if (!this.rootConfig.providerAccounts)
194
- return;
195
- for (const [environmentType, accountNames] of Object.entries(accountTypes)) {
196
- for (const accountName of accountNames) {
197
- const account = this.getProviderAccount(accountName);
198
- if (account) {
199
- account.environment = environmentType;
200
- }
201
- }
202
- }
203
- }
204
152
  /**
205
153
  * Sets the existing accounts list. This should be called by AccountService
206
154
  * after it fetches the accounts from AWS.
@@ -309,4 +257,4 @@ class Config {
309
257
  }
310
258
  }
311
259
  exports.Config = Config;
312
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL0NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5QkFBeUI7QUFnRXpCOztHQUVHO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFFaEM7O0dBRUc7QUFDSCxNQUFhLE1BQU07SUFLakIsWUFDRSxVQUFtQixFQUNuQixzQkFBa0MsRUFDbEMsd0JBQStDO1FBRS9DLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVTtZQUMxQixDQUFDLENBQUMsVUFBVTtZQUNaLENBQUMsQ0FBQztnQkFDRSxPQUFPLEVBQUUsbUJBQW1CO2dCQUM1QixRQUFRLEVBQUUsRUFBRTtnQkFDWixnQkFBZ0IsRUFBRSxFQUFFO2FBQ3JCLENBQUM7UUFFTixJQUFJLENBQUMsc0JBQXNCLEdBQUcsc0JBQXNCO1lBQ2xELENBQUMsQ0FBQyxzQkFBc0I7WUFDeEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVQLElBQUksQ0FBQyx3QkFBd0IsR0FBRyx3QkFBd0I7WUFDdEQsQ0FBQyxDQUFDLHdCQUF3QjtZQUMxQixDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1QsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssTUFBTSxDQUFDLG1CQUFtQjtRQUNoQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFN0IsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQy9CLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDLHlCQUF5QjtRQUU5QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbEMseURBQXlEO1lBQ3pELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLG1CQUFtQixDQUFDLENBQUM7WUFFNUQsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sUUFBUSxDQUFDO1lBQ2xCLENBQUM7WUFFRCwyREFBMkQ7WUFDM0QsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3BFLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLE9BQU8sVUFBVSxDQUFDO1lBQ3BCLENBQUM7WUFFRCx3QkFBd0I7WUFDeEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzQyxJQUFJLFNBQVMsS0FBSyxVQUFVO2dCQUFFLE1BQU0sQ0FBQywwQkFBMEI7WUFDL0QsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUN6QixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFrQjtRQUM5QyxJQUFJLENBQUM7WUFDSCxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWpFLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2pDLFFBQVEsRUFBRSxNQUFNO2FBQ2pCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLElBQUksRUFBRSxDQUFDO1lBQ2QsZUFBZTtZQUNmLHNFQUFzRTtZQUN0RSxLQUFLO1lBQ0wsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsVUFBVTtRQUNmLElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDZixxREFBcUQ7Z0JBQ3JELE9BQU8sSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN0QixDQUFDO1lBRUQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdCLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLG1CQUFtQixDQUFDLENBQzFDLENBQUM7WUFDRixNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHNCQUFzQixDQUFDLENBQzdDLENBQUM7WUFDRixNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGtDQUFrQyxDQUFDLENBQ3pELENBQUM7WUFFRixNQUFNLFVBQVUsR0FBRyxjQUFjO2dCQUMvQixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7Z0JBQzVCLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDZCxNQUFNLHNCQUFzQixHQUFHLG1CQUFtQjtnQkFDaEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7Z0JBQ2pDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDZCxNQUFNLHdCQUF3QixHQUFHLHNCQUFzQjtnQkFDckQsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUM7Z0JBQ3BDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFFZCxPQUFPLElBQUksTUFBTSxDQUNmLFVBQVUsRUFDVixzQkFBc0IsRUFDdEIsd0JBQXdCLENBQ3pCLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVTtRQUNSLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixNQUFNLFNBQVMsR0FDYixNQUFNLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVwRSwwQkFBMEI7UUFDMUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU3QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUU1RSxNQUFNLDBCQUEwQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQy9DLElBQUksQ0FBQyxzQkFBc0IsRUFDM0IsSUFBSSxFQUNKLENBQUMsQ0FDRixDQUFDO1FBQ0YsRUFBRSxDQUFDLGFBQWEsQ0FDZCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxzQkFBc0IsQ0FBQyxFQUM1QywwQkFBMEIsQ0FDM0IsQ0FBQztRQUVGLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FDakQsSUFBSSxDQUFDLHdCQUF3QixFQUM3QixJQUFJLEVBQ0osQ0FBQyxDQUNGLENBQUM7UUFDRixFQUFFLENBQUMsYUFBYSxDQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGtDQUFrQyxDQUFDLEVBQ3hELDRCQUE0QixDQUM3QixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsT0FBZTtRQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsVUFBa0IsRUFBRSxNQUFxQjtRQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRO1lBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxnQkFBZ0IsQ0FBQyxVQUFrQixFQUFFLE1BQXFCO1FBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVE7WUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFFN0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBRXJCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUNuRSxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFBa0I7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzNDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3RELENBQUM7SUFFRCxXQUFXLENBQUMsUUFBa0I7UUFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxPQUF3QjtRQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0I7WUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFFeEMsMENBQTBDO1FBQzFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRWhELElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxXQUFtQjtRQUNwQyx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbkQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FDMUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FDdkUsQ0FBQztJQUNKLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxTQUFpQjtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0I7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNuRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUMxQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxTQUFTLENBQ3RDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHVCQUF1QixDQUFDLFdBQW1CO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQjtZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ3hELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQzFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxLQUFLLFdBQVcsQ0FDakQsQ0FBQztJQUNKLENBQUM7SUFFRCxpQ0FBaUMsQ0FBQyxZQUVqQztRQUNDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQjtZQUFFLE9BQU87UUFFOUMsS0FBSyxNQUFNLENBQUMsZUFBZSxFQUFFLFlBQVksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQzFELFlBQVksQ0FDYixFQUFFLENBQUM7WUFDRixLQUFLLE1BQU0sV0FBVyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3JELElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ1osT0FBTyxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUM7Z0JBQ3hDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsdUJBQXVCLENBQUMsUUFBbUI7UUFDekMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFFBQVEsQ0FBQztJQUN6QyxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDO0lBQ3JDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxNQUFjO1FBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztJQUN6QyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsT0FBaUI7UUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUM7SUFDN0MsQ0FBQztJQUVELHlCQUF5QixDQUFDLE1BQWM7UUFDdEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsR0FBRyxNQUFNLENBQUM7SUFDbEQsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7SUFDdkMsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUM7SUFDMUMsQ0FBQztJQUVELHlCQUF5QjtRQUN2QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUM7SUFDaEQsQ0FBQztJQUVELGFBQWE7UUFDWCxNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7UUFFN0IsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDckMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBRUQsSUFDRSxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQjtZQUN0QyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUN6RCxDQUFDO1lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gseUJBQXlCLENBQUMsSUFBMEI7UUFDbEQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztJQUN2QyxDQUFDO0lBRUQscUJBQXFCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsa0JBQWtCO1FBQ3ZCLE9BQU8sTUFBTSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBRUgsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsaUJBQWlCLENBQUMsSUFBWTtRQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFDeEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFZO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVE7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUNoRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3pDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBWSxFQUFFLE9BQWdCO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDO0lBQzNDLENBQUM7SUFFRCxhQUFhLENBQUMsSUFBWTtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUN0QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLDhDQUE4QztRQUM5QyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFZO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVc7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUNuRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxhQUFhLENBQUMsSUFBWSxFQUFFLE9BQW1CO1FBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDO0lBQzlDLENBQUM7Q0FDRjtBQXZZRCx3QkF1WUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB0eXBlIHsgQWNjb3VudCB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtb3JnYW5pemF0aW9uc1wiO1xuZXhwb3J0IHR5cGUgeyBBY2NvdW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1vcmdhbml6YXRpb25zXCI7XG5cbnR5cGUgUHJvdmlkZXIgPSBcImF3c1wiO1xuXG5leHBvcnQgdHlwZSBTZXJ2aWNlQ29uZmlnID0ge1xuICBpZDogc3RyaW5nO1xuICB0eXBlPzogc3RyaW5nO1xuICB2ZXJzaW9uPzogbnVtYmVyO1xuICBvcHRpb25zPzogb2JqZWN0O1xuICBkb2NrZXJDb25maWc/OiB7XG4gICAgZG9ja2VyZmlsZVBhdGg6IHN0cmluZztcbiAgICBjb250YWluZXJQb3J0OiBudW1iZXI7XG4gIH07XG4gIGFwaUFwcGxpY2F0aW9uSWQ/OiBzdHJpbmc7IC8vIEZqYWxsIEFQSSBhcHBsaWNhdGlvbiBJRFxufTtcblxuZXhwb3J0IHR5cGUgUHJvdmlkZXJBY2NvdW50ID0ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIG1hbmFnZWQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgUHJvZmlsZSA9IHtcbiAgdHlwZTogXCJpYW1cIiB8IFwic3NvXCIgfCBcIm9pZGNcIjtcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIC8vIFNTTyBwcm9maWxlc1xuICBzc29BY2NvdW50SWQ/OiBzdHJpbmc7XG4gIHNzb1JvbGVOYW1lPzogc3RyaW5nO1xuICBzc29TZXNzaW9uPzogc3RyaW5nO1xuICAvLyBJQU0gcHJvZmlsZXNcbiAgY3JlZGVudGlhbFNvdXJjZT86IFwia2V5Y2hhaW5cIjtcbiAgLy8gT0lEQyBwcm9maWxlc1xuICByb2xlQXJuPzogc3RyaW5nO1xuICByb2xlU2Vzc2lvbk5hbWU/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTU09TZXNzaW9uID0ge1xuICBzc29SZWdpb246IHN0cmluZztcbiAgc3NvU3RhcnRVcmw6IHN0cmluZztcbn07XG5cbnR5cGUgUm9vdENvbmZpZyA9IHtcbiAgdmVyc2lvbj86IG51bWJlcjtcbiAgZGV2ZWxvcG1lbnQ/OiBib29sZWFuO1xuICBzZXJ2aWNlcz86IHsgW2tleTogc3RyaW5nXTogU2VydmljZUNvbmZpZyB9O1xuICBwcm92aWRlcj86IFByb3ZpZGVyO1xuICBwcm92aWRlckFjY291bnRzPzogUHJvdmlkZXJBY2NvdW50W107XG4gIHByaW1hcnlSZWdpb24/OiBzdHJpbmc7XG4gIHNlY29uZGFyeVJlZ2lvbnM/OiBzdHJpbmdbXTtcbiAgZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbj86IHN0cmluZztcbiAgLy8gUHJvZmlsZSBtYW5hZ2VtZW50XG4gIGN1cnJlbnRQcm9maWxlPzogc3RyaW5nO1xuICBwcm9maWxlcz86IHsgW2tleTogc3RyaW5nXTogUHJvZmlsZSB9O1xuICBzc29TZXNzaW9ucz86IHsgW2tleTogc3RyaW5nXTogU1NPU2Vzc2lvbiB9O1xufTtcblxudHlwZSBDb3N0QWxsb2NhdGlvblRhZ3MgPSB7XG4gIFRhZ0tleTogc3RyaW5nO1xuICBTdGF0dXM6IHN0cmluZztcbn07XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgYmFzZS12ZXJzaW9uIG9mIGFueSBuZXdseSBjcmVhdGVkIGNvbmZpZyBmaWxlXG4gKi9cbmNvbnN0IEJBU0VfQ09ORklHX1ZFUlNJT04gPSAwLjE7XG5cbi8qKlxuICogQ29uZmlnIGNsYXNzIGZvciBsb2FkaW5nIGFuZCBzYXZpbmcgZmphbGwtY29uZmlnLmpzb24gZmlsZVxuICovXG5leHBvcnQgY2xhc3MgQ29uZmlnIHtcbiAgcm9vdENvbmZpZzogUm9vdENvbmZpZztcbiAgZXhpc3RpbmdBY2NvdW50c0NvbmZpZzogQWNjb3VudFtdO1xuICBjb3N0QWxsb2NhdGlvblRhZ3NDb25maWc6IENvc3RBbGxvY2F0aW9uVGFnc1tdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJvb3RDb25maWc/OiBvYmplY3QsXG4gICAgZXhpc3RpbmdBY2NvdW50c0NvbmZpZz86IEFjY291bnRbXSxcbiAgICBjb3N0QWxsb2NhdGlvblRhZ3NDb25maWc/OiBDb3N0QWxsb2NhdGlvblRhZ3NbXVxuICApIHtcbiAgICB0aGlzLnJvb3RDb25maWcgPSByb290Q29uZmlnXG4gICAgICA/IHJvb3RDb25maWdcbiAgICAgIDoge1xuICAgICAgICAgIHZlcnNpb246IEJBU0VfQ09ORklHX1ZFUlNJT04sXG4gICAgICAgICAgc2VydmljZXM6IHt9LFxuICAgICAgICAgIHByb3ZpZGVyQWNjb3VudHM6IFtdXG4gICAgICAgIH07XG5cbiAgICB0aGlzLmV4aXN0aW5nQWNjb3VudHNDb25maWcgPSBleGlzdGluZ0FjY291bnRzQ29uZmlnXG4gICAgICA/IGV4aXN0aW5nQWNjb3VudHNDb25maWdcbiAgICAgIDogW107XG5cbiAgICB0aGlzLmNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZyA9IGNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZ1xuICAgICAgPyBjb3N0QWxsb2NhdGlvblRhZ3NDb25maWdcbiAgICAgIDogW107XG4gIH1cblxuICBpc0RldmVsb3BtZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMucm9vdENvbmZpZz8uZGV2ZWxvcG1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgZmphbGwgY29uZmlnIGRpcmVjdG9yeSBieSB3YWxraW5nIHVwIHRoZSBkaXJlY3RvcnkgdHJlZVxuICAgKiBAcmV0dXJucyBUaGUgcGF0aCB0byB0aGUgZmphbGwgY29uZmlnIGRpcmVjdG9yeSBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZmluZENvbmZpZ0RpcmVjdG9yeSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgICBsZXQgY3VycmVudERpciA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgbWF4RGVwdGggPSAxMDsgLy8gUHJldmVudCBpbmZpbml0ZSBsb29wc1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhEZXB0aDsgaSsrKSB7XG4gICAgICAvLyBDaGVjayBpZiBjdXJyZW50IGRpcmVjdG9yeSBjb250YWlucyBmamFsbCBjb25maWcgZmlsZXNcbiAgICAgIGNvbnN0IGZqYWxsRGlyID0gcGF0aC5qb2luKGN1cnJlbnREaXIsIFwiZmphbGxcIik7XG4gICAgICBjb25zdCBjb25maWdGaWxlID0gcGF0aC5qb2luKGZqYWxsRGlyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpO1xuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhjb25maWdGaWxlKSkge1xuICAgICAgICByZXR1cm4gZmphbGxEaXI7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGN1cnJlbnQgZGlyZWN0b3J5IElTIHRoZSBmamFsbCBjb25maWcgZGlyZWN0b3J5XG4gICAgICBjb25zdCBkaXJlY3RDb25maWdGaWxlID0gcGF0aC5qb2luKGN1cnJlbnREaXIsIFwiZmphbGwtY29uZmlnLmpzb25cIik7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJlY3RDb25maWdGaWxlKSkge1xuICAgICAgICByZXR1cm4gY3VycmVudERpcjtcbiAgICAgIH1cblxuICAgICAgLy8gTW92ZSB1cCBvbmUgZGlyZWN0b3J5XG4gICAgICBjb25zdCBwYXJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudERpcik7XG4gICAgICBpZiAocGFyZW50RGlyID09PSBjdXJyZW50RGlyKSBicmVhazsgLy8gUmVhY2hlZCBmaWxlc3lzdGVtIHJvb3RcbiAgICAgIGN1cnJlbnREaXIgPSBwYXJlbnREaXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBjb25maWcgZmlsZSBpbnRvIG1lbW9yeSBhcyBhIHJhdyBKU09OIHN0cmluZ1xuICAgKiBAcmV0dXJucyBDb25maWcgYXMgSlNPTiBzdHJpbmcgb3IgTlVMTCBpZiBubyBjb25maWcgZmlsZSBhY2Nlc3NpYmxlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBsb2FkQ29uZmlnRmlsZShjb25maWdGaWxlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgZnMuYWNjZXNzU3luYyhjb25maWdGaWxlLCBmcy5jb25zdGFudHMuUl9PSyB8IGZzLmNvbnN0YW50cy5XX09LKTtcblxuICAgICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyhjb25maWdGaWxlLCB7XG4gICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIlxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBFeHBlY3RlZCBmaWxlICcke2NvbmZpZ0ZpbGV9JyBkb2VzIG5vdCBleGlzdCBvciBjYW5ub3QgYmUgcmVhZC5gXG4gICAgICAvLyApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgY29uZmlndXJhdGlvbiBmcm9tIGZpbGVcbiAgICpcbiAgICogQHJldHVybnMgTG9hZGVkIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHN0YXRpYyBsb2FkQ29uZmlnKCk6IENvbmZpZyB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ0RpciA9IENvbmZpZy5maW5kQ29uZmlnRGlyZWN0b3J5KCk7XG4gICAgICBpZiAoIWNvbmZpZ0Rpcikge1xuICAgICAgICAvLyBSZXR1cm4gZGVmYXVsdCBjb25maWcgaWYgbm8gY29uZmlnIGRpcmVjdG9yeSBmb3VuZFxuICAgICAgICByZXR1cm4gbmV3IENvbmZpZygpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG4gICAgICBjb25zdCByb290Q29uZmlnSnNvbiA9IENvbmZpZy5sb2FkQ29uZmlnRmlsZShcbiAgICAgICAgcGF0aC5qb2luKGNvbmZpZ0RpciwgXCJmamFsbC1jb25maWcuanNvblwiKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQWNjb3VudEpzb24gPSBDb25maWcubG9hZENvbmZpZ0ZpbGUoXG4gICAgICAgIHBhdGguam9pbihjb25maWdEaXIsIFwiYWNjb3VudHMtY29uZmlnLmpzb25cIilcbiAgICAgICk7XG4gICAgICBjb25zdCBjb3N0QWxsb2NhdGlvblRhZ3NKc29uID0gQ29uZmlnLmxvYWRDb25maWdGaWxlKFxuICAgICAgICBwYXRoLmpvaW4oY29uZmlnRGlyLCBcImNvc3QtYWxsb2NhdGlvbi10YWdzLWNvbmZpZy5qc29uXCIpXG4gICAgICApO1xuXG4gICAgICBjb25zdCByb290Q29uZmlnID0gcm9vdENvbmZpZ0pzb25cbiAgICAgICAgPyBKU09OLnBhcnNlKHJvb3RDb25maWdKc29uKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQWNjb3VudHNDb25maWcgPSBleGlzdGluZ0FjY291bnRKc29uXG4gICAgICAgID8gSlNPTi5wYXJzZShleGlzdGluZ0FjY291bnRKc29uKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZyA9IGNvc3RBbGxvY2F0aW9uVGFnc0pzb25cbiAgICAgICAgPyBKU09OLnBhcnNlKGNvc3RBbGxvY2F0aW9uVGFnc0pzb24pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gbmV3IENvbmZpZyhcbiAgICAgICAgcm9vdENvbmZpZyxcbiAgICAgICAgZXhpc3RpbmdBY2NvdW50c0NvbmZpZyxcbiAgICAgICAgY29zdEFsbG9jYXRpb25UYWdzQ29uZmlnXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihcIlVuYWJsZSB0byBwYXJzZSBjb25maWcgZmlsZS4gQWJvcnRpbmcuXCIsIGVycik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgY29uZmlndXJhdGlvbiB0byBmaWxlXG4gICAqL1xuICBzYXZlQ29uZmlnKCkge1xuICAgIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbiAgICBjb25zdCBjb25maWdEaXIgPVxuICAgICAgQ29uZmlnLmZpbmRDb25maWdEaXJlY3RvcnkoKSB8fCBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJmamFsbFwiKTtcblxuICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgZnMubWtkaXJTeW5jKGNvbmZpZ0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCByb290SnNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHRoaXMucm9vdENvbmZpZywgbnVsbCwgMik7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oY29uZmlnRGlyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpLCByb290SnNvblN0cmluZyk7XG5cbiAgICBjb25zdCBleGlzdGluZ0FjY291bnRzSnNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgdGhpcy5leGlzdGluZ0FjY291bnRzQ29uZmlnLFxuICAgICAgbnVsbCxcbiAgICAgIDJcbiAgICApO1xuICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnRGlyLCBcImFjY291bnRzLWNvbmZpZy5qc29uXCIpLFxuICAgICAgZXhpc3RpbmdBY2NvdW50c0pzb25TdHJpbmdcbiAgICApO1xuXG4gICAgY29uc3QgY29zdEFsbG9jYXRpb25UYWdzSnNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgdGhpcy5jb3N0QWxsb2NhdGlvblRhZ3NDb25maWcsXG4gICAgICBudWxsLFxuICAgICAgMlxuICAgICk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgIHBhdGguam9pbihjb25maWdEaXIsIFwiY29zdC1hbGxvY2F0aW9uLXRhZ3MtY29uZmlnLmpzb25cIiksXG4gICAgICBjb3N0QWxsb2NhdGlvblRhZ3NKc29uU3RyaW5nXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHNjaGVtYSB2ZXJzaW9uIHVzZWQgZm9yIHRoaXMgY29uZmlnIGZpbGVcbiAgICpcbiAgICogQHBhcmFtIHZlcnNpb24gU2NoZW1hIFZlcnNpb25cbiAgICovXG4gIHNldFZlcnNpb24odmVyc2lvbjogbnVtYmVyKSB7XG4gICAgdGhpcy5yb290Q29uZmlnLnZlcnNpb24gPSB2ZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBzZXJ2aWNlIHRvIHRoZSBjb25maWcgZmlsZVxuICAgKiBAcGFyYW0gc2VydmljZUtleSBOYW1lL2tleSBvZiB0aGUgc2VydmljZVxuICAgKiBAcGFyYW0gY29uZmlnIFNlcnZpY2UgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzXG4gICAqL1xuICBhZGRTZXJ2aWNlKHNlcnZpY2VLZXk6IHN0cmluZywgY29uZmlnOiBTZXJ2aWNlQ29uZmlnKSB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcuc2VydmljZXMpIHRoaXMucm9vdENvbmZpZy5zZXJ2aWNlcyA9IHt9O1xuICAgIHRoaXMucm9vdENvbmZpZy5zZXJ2aWNlc1tzZXJ2aWNlS2V5XSA9IGNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY29uZmlnIG9wdGlvbnMgb24gYSBwcmV2aW91c2x5IGRlZmluZWQgc2VydmljZVxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZUtleSBOYW1lL2tleSBvZiB0aGUgc2VydmljZVxuICAgKiBAcGFyYW0gY29uZmlnIFNlcnZpY2UgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHRvIHNldFxuICAgKi9cbiAgc2V0U2VydmljZU9wdGlvbihzZXJ2aWNlS2V5OiBzdHJpbmcsIGNvbmZpZzogU2VydmljZUNvbmZpZykge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnNlcnZpY2VzKSB0aGlzLnJvb3RDb25maWcuc2VydmljZXMgPSB7fTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnJvb3RDb25maWcuc2VydmljZXNbc2VydmljZUtleV07XG4gICAgaWYgKCFzZXJ2aWNlKSByZXR1cm47XG5cbiAgICB0aGlzLnJvb3RDb25maWcuc2VydmljZXNbc2VydmljZUtleV0gPSB7IC4uLnNlcnZpY2UsIC4uLmNvbmZpZyB9O1xuICB9XG5cbiAgZ2V0U2VydmljZUNvbmZpZyhzZXJ2aWNlS2V5OiBzdHJpbmcpOiBTZXJ2aWNlQ29uZmlnIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcuc2VydmljZXMpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcuc2VydmljZXNbc2VydmljZUtleV0gfHwgbnVsbDtcbiAgfVxuXG4gIHNldFByb3ZpZGVyKHByb3ZpZGVyOiBQcm92aWRlcikge1xuICAgIHRoaXMucm9vdENvbmZpZy5wcm92aWRlciA9IHByb3ZpZGVyO1xuICB9XG5cbiAgYWRkUHJvdmlkZXJBY2NvdW50KGFjY291bnQ6IFByb3ZpZGVyQWNjb3VudCkge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb3ZpZGVyQWNjb3VudHMpXG4gICAgICB0aGlzLnJvb3RDb25maWcucHJvdmlkZXJBY2NvdW50cyA9IFtdO1xuXG4gICAgLy8gZW5zdXJlIGFjY291bnQgbmFtZSBpcyBhbHdheXMgbG93ZXJjYXNlXG4gICAgYWNjb3VudC5uYW1lID0gYWNjb3VudC5uYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG5cbiAgICB0aGlzLnJvb3RDb25maWcucHJvdmlkZXJBY2NvdW50cy5wdXNoKGFjY291bnQpO1xuICB9XG5cbiAgZ2V0UHJvdmlkZXJBY2NvdW50KGFjY291bnROYW1lOiBzdHJpbmcpIHtcbiAgICAvLyBUT0RPOiBGaXggbnVsbCBlcnJvclxuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb3ZpZGVyQWNjb3VudHMpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcucHJvdmlkZXJBY2NvdW50cy5maW5kKFxuICAgICAgKGFjY291bnQpID0+XG4gICAgICAgIGFjY291bnQubmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBhY2NvdW50TmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpXG4gICAgKTtcbiAgfVxuXG4gIGdldFByb3ZpZGVyQWNjb3VudEJ5SWQoYWNjb3VudElkOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLnByb3ZpZGVyQWNjb3VudHMuZmluZChcbiAgICAgIChhY2NvdW50KSA9PiBhY2NvdW50LmlkID09PSBhY2NvdW50SWRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwcm92aWRlciBhY2NvdW50IGJ5IGVudmlyb25tZW50IHR5cGVcbiAgICogQHBhcmFtIGVudmlyb25tZW50IFRoZSBlbnZpcm9ubWVudCB0eXBlIChlLmcuLCAncGxhdGZvcm0nLCAnc3RhZ2luZycsICdwcm9kdWN0aW9uJylcbiAgICogQHJldHVybnMgVGhlIHByb3ZpZGVyIGFjY291bnQgd2l0aCB0aGUgc3BlY2lmaWVkIGVudmlyb25tZW50IG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICovXG4gIGdldEFjY291bnRCeUVudmlyb25tZW50KGVudmlyb25tZW50OiBzdHJpbmcpOiBQcm92aWRlckFjY291bnQgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb3ZpZGVyQWNjb3VudHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzLmZpbmQoXG4gICAgICAoYWNjb3VudCkgPT4gYWNjb3VudC5lbnZpcm9ubWVudCA9PT0gZW52aXJvbm1lbnRcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlUHJvdmlkZXJBY2NvdW50RW52aXJvbm1lbnRzKGFjY291bnRUeXBlczoge1xuICAgIFtrZXk6IHN0cmluZ106IHJlYWRvbmx5IHN0cmluZ1tdO1xuICB9KSB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcucHJvdmlkZXJBY2NvdW50cykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBbZW52aXJvbm1lbnRUeXBlLCBhY2NvdW50TmFtZXNdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgYWNjb3VudFR5cGVzXG4gICAgKSkge1xuICAgICAgZm9yIChjb25zdCBhY2NvdW50TmFtZSBvZiBhY2NvdW50TmFtZXMpIHtcbiAgICAgICAgY29uc3QgYWNjb3VudCA9IHRoaXMuZ2V0UHJvdmlkZXJBY2NvdW50KGFjY291bnROYW1lKTtcbiAgICAgICAgaWYgKGFjY291bnQpIHtcbiAgICAgICAgICBhY2NvdW50LmVudmlyb25tZW50ID0gZW52aXJvbm1lbnRUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGV4aXN0aW5nIGFjY291bnRzIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSBBY2NvdW50U2VydmljZVxuICAgKiBhZnRlciBpdCBmZXRjaGVzIHRoZSBhY2NvdW50cyBmcm9tIEFXUy5cbiAgICogQHBhcmFtIGFjY291bnRzIExpc3Qgb2YgQVdTIGFjY291bnRzIGZyb20gT3JnYW5pemF0aW9ucyBBUElcbiAgICovXG4gIHNldEV4aXN0aW5nQWNjb3VudHNMaXN0KGFjY291bnRzOiBBY2NvdW50W10pIHtcbiAgICB0aGlzLmV4aXN0aW5nQWNjb3VudHNDb25maWcgPSBhY2NvdW50cztcbiAgfVxuXG4gIGdldEV4aXN0aW5nQWNjb3VudHMoKTogQWNjb3VudFtdIHtcbiAgICByZXR1cm4gdGhpcy5leGlzdGluZ0FjY291bnRzQ29uZmlnO1xuICB9XG5cbiAgc2V0UHJpbWFyeVJlZ2lvbihyZWdpb246IHN0cmluZykge1xuICAgIHRoaXMucm9vdENvbmZpZy5wcmltYXJ5UmVnaW9uID0gcmVnaW9uO1xuICB9XG5cbiAgc2V0U2Vjb25kYXJ5UmVnaW9ucyhyZWdpb25zOiBzdHJpbmdbXSkge1xuICAgIHRoaXMucm9vdENvbmZpZy5zZWNvbmRhcnlSZWdpb25zID0gcmVnaW9ucztcbiAgfVxuXG4gIHNldERpc2FzdGVyUmVjb3ZlcnlSZWdpb24ocmVnaW9uOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJvb3RDb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbiA9IHJlZ2lvbjtcbiAgfVxuXG4gIGdldFByaW1hcnlSZWdpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLnByaW1hcnlSZWdpb247XG4gIH1cblxuICBnZXRTZWNvbmRhcnlSZWdpb25zKCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLnNlY29uZGFyeVJlZ2lvbnM7XG4gIH1cblxuICBnZXREaXNhc3RlclJlY292ZXJ5UmVnaW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5kaXNhc3RlclJlY292ZXJ5UmVnaW9uO1xuICB9XG5cbiAgZ2V0QWxsUmVnaW9ucygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcmVnaW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICh0aGlzLnJvb3RDb25maWcucHJpbWFyeVJlZ2lvbikge1xuICAgICAgcmVnaW9ucy5wdXNoKHRoaXMucm9vdENvbmZpZy5wcmltYXJ5UmVnaW9uKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yb290Q29uZmlnLnNlY29uZGFyeVJlZ2lvbnMpIHtcbiAgICAgIHJlZ2lvbnMucHVzaCguLi50aGlzLnJvb3RDb25maWcuc2Vjb25kYXJ5UmVnaW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5yb290Q29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb24gJiZcbiAgICAgICFyZWdpb25zLmluY2x1ZGVzKHRoaXMucm9vdENvbmZpZy5kaXNhc3RlclJlY292ZXJ5UmVnaW9uKVxuICAgICkge1xuICAgICAgcmVnaW9ucy5wdXNoKHRoaXMucm9vdENvbmZpZy5kaXNhc3RlclJlY292ZXJ5UmVnaW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVnaW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjb3N0IGFsbG9jYXRpb24gdGFncyBsaXN0LiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgQWNjb3VudFNlcnZpY2VcbiAgICogYWZ0ZXIgaXQgZmV0Y2hlcyB0aGUgdGFncyBmcm9tIEFXUyBDb3N0IEV4cGxvcmVyLlxuICAgKiBAcGFyYW0gdGFncyBMaXN0IG9mIGNvc3QgYWxsb2NhdGlvbiB0YWdzXG4gICAqL1xuICBzZXRDb3N0QWxsb2NhdGlvblRhZ3NMaXN0KHRhZ3M6IENvc3RBbGxvY2F0aW9uVGFnc1tdKSB7XG4gICAgdGhpcy5jb3N0QWxsb2NhdGlvblRhZ3NDb25maWcgPSB0YWdzO1xuICB9XG5cbiAgZ2V0Q29zdEFsbG9jYXRpb25UYWdzKCk6IENvc3RBbGxvY2F0aW9uVGFnc1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb3N0QWxsb2NhdGlvblRhZ3NDb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmamFsbCBjb25maWcgZGlyZWN0b3J5IHBhdGhcbiAgICogQHJldHVybnMgVGhlIHBhdGggdG8gdGhlIGZqYWxsIGNvbmZpZyBkaXJlY3Rvcnkgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICovXG4gIHN0YXRpYyBnZXRDb25maWdEaXJlY3RvcnkoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIENvbmZpZy5maW5kQ29uZmlnRGlyZWN0b3J5KCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvZmlsZSBtYW5hZ2VtZW50IG1ldGhvZHNcbiAgICovXG5cbiAgZ2V0Q3VycmVudFByb2ZpbGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLmN1cnJlbnRQcm9maWxlO1xuICB9XG5cbiAgc2V0Q3VycmVudFByb2ZpbGUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yb290Q29uZmlnLmN1cnJlbnRQcm9maWxlID0gbmFtZTtcbiAgfVxuXG4gIGdldFByb2ZpbGUobmFtZTogc3RyaW5nKTogUHJvZmlsZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcucHJvZmlsZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5wcm9maWxlc1tuYW1lXTtcbiAgfVxuXG4gIGdldEFsbFByb2ZpbGVOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcucHJvZmlsZXMpIHJldHVybiBbXTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5yb290Q29uZmlnLnByb2ZpbGVzKTtcbiAgfVxuXG4gIGFkZFByb2ZpbGUobmFtZTogc3RyaW5nLCBwcm9maWxlOiBQcm9maWxlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcucHJvZmlsZXMpIHtcbiAgICAgIHRoaXMucm9vdENvbmZpZy5wcm9maWxlcyA9IHt9O1xuICAgIH1cbiAgICB0aGlzLnJvb3RDb25maWcucHJvZmlsZXNbbmFtZV0gPSBwcm9maWxlO1xuICB9XG5cbiAgcmVtb3ZlUHJvZmlsZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucm9vdENvbmZpZy5wcm9maWxlcykgcmV0dXJuO1xuICAgIGRlbGV0ZSB0aGlzLnJvb3RDb25maWcucHJvZmlsZXNbbmFtZV07XG5cbiAgICAvLyBJZiB3ZSByZW1vdmVkIHRoZSBjdXJyZW50IHByb2ZpbGUsIGNsZWFyIGl0XG4gICAgaWYgKHRoaXMucm9vdENvbmZpZy5jdXJyZW50UHJvZmlsZSA9PT0gbmFtZSkge1xuICAgICAgdGhpcy5yb290Q29uZmlnLmN1cnJlbnRQcm9maWxlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGdldFNTT1Nlc3Npb24obmFtZTogc3RyaW5nKTogU1NPU2Vzc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcuc3NvU2Vzc2lvbnMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5zc29TZXNzaW9uc1tuYW1lXTtcbiAgfVxuXG4gIGFkZFNTT1Nlc3Npb24obmFtZTogc3RyaW5nLCBzZXNzaW9uOiBTU09TZXNzaW9uKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcuc3NvU2Vzc2lvbnMpIHtcbiAgICAgIHRoaXMucm9vdENvbmZpZy5zc29TZXNzaW9ucyA9IHt9O1xuICAgIH1cbiAgICB0aGlzLnJvb3RDb25maWcuc3NvU2Vzc2lvbnNbbmFtZV0gPSBzZXNzaW9uO1xuICB9XG59XG4iXX0=
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL0NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBNkQ3Qjs7R0FFRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBRWhDOztHQUVHO0FBQ0gsTUFBYSxNQUFNO0lBS2pCLFlBQ0UsVUFBdUIsRUFDdkIsc0JBQWtDLEVBQ2xDLHdCQUErQztRQUUvQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSTtZQUM5QixPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLFFBQVEsRUFBRSxFQUFFO1lBQ1osZ0JBQWdCLEVBQUUsRUFBRTtTQUNyQixDQUFDO1FBQ0YsSUFBSSxDQUFDLHNCQUFzQixHQUFHLHNCQUFzQixJQUFJLEVBQUUsQ0FBQztRQUMzRCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsd0JBQXdCLElBQUksRUFBRSxDQUFDO0lBQ2pFLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7T0FHRztJQUNLLE1BQU0sQ0FBQyxtQkFBbUI7UUFDaEMsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQy9CLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDLHlCQUF5QjtRQUU5QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztZQUU1RCxJQUFJLEVBQUUsQ0FBQyxVQUFV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QUNuQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDO0lBQzlDLENBQUM7Q0FDRjtBQXZVRCx3QkF1VUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgQWNjb3VudCB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtb3JnYW5pemF0aW9uc1wiO1xuZXhwb3J0IHR5cGUgeyBBY2NvdW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1vcmdhbml6YXRpb25zXCI7XG5cbmV4cG9ydCB0eXBlIFNlcnZpY2VDb25maWcgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIHR5cGU/OiBzdHJpbmc7XG4gIHZlcnNpb24/OiBudW1iZXI7XG4gIG9wdGlvbnM/OiBvYmplY3Q7XG4gIGRvY2tlckNvbmZpZz86IHtcbiAgICBkb2NrZXJmaWxlUGF0aDogc3RyaW5nO1xuICAgIGNvbnRhaW5lclBvcnQ6IG51bWJlcjtcbiAgfTtcbiAgYXBpQXBwbGljYXRpb25JZD86IHN0cmluZzsgLy8gRmphbGwgQVBJIGFwcGxpY2F0aW9uIElEXG59O1xuXG5leHBvcnQgdHlwZSBQcm92aWRlckFjY291bnQgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgbWFuYWdlZD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBQcm9maWxlID0ge1xuICB0eXBlOiBcImlhbVwiIHwgXCJzc29cIiB8IFwib2lkY1wiO1xuICByZWdpb246IHN0cmluZztcbiAgLy8gU1NPIHByb2ZpbGVzXG4gIHNzb0FjY291bnRJZD86IHN0cmluZztcbiAgc3NvUm9sZU5hbWU/OiBzdHJpbmc7XG4gIHNzb1Nlc3Npb24/OiBzdHJpbmc7XG4gIC8vIElBTSBwcm9maWxlc1xuICBjcmVkZW50aWFsU291cmNlPzogXCJrZXljaGFpblwiO1xuICAvLyBPSURDIHByb2ZpbGVzIChDSS9DRClcbiAgb2lkY1JvbGVBcm4/OiBzdHJpbmc7XG4gIG9pZGNQcm92aWRlckFybj86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFNTT1Nlc3Npb24gPSB7XG4gIHNzb1JlZ2lvbjogc3RyaW5nO1xuICBzc29TdGFydFVybDogc3RyaW5nO1xufTtcblxudHlwZSBSb290Q29uZmlnID0ge1xuICB2ZXJzaW9uPzogbnVtYmVyO1xuICBkZXZlbG9wbWVudD86IGJvb2xlYW47XG4gIHNlcnZpY2VzPzogeyBba2V5OiBzdHJpbmddOiBTZXJ2aWNlQ29uZmlnIH07XG4gIHByb3ZpZGVyQWNjb3VudHM/OiBQcm92aWRlckFjY291bnRbXTtcbiAgcHJpbWFyeVJlZ2lvbj86IHN0cmluZztcbiAgc2Vjb25kYXJ5UmVnaW9ucz86IHN0cmluZ1tdO1xuICBkaXNhc3RlclJlY292ZXJ5UmVnaW9uPzogc3RyaW5nO1xuICAvLyBQcm9maWxlIG1hbmFnZW1lbnRcbiAgY3VycmVudFByb2ZpbGU/OiBzdHJpbmc7XG4gIHByb2ZpbGVzPzogeyBba2V5OiBzdHJpbmddOiBQcm9maWxlIH07XG4gIHNzb1Nlc3Npb25zPzogeyBba2V5OiBzdHJpbmddOiBTU09TZXNzaW9uIH07XG59O1xuXG50eXBlIENvc3RBbGxvY2F0aW9uVGFncyA9IHtcbiAgVGFnS2V5OiBzdHJpbmc7XG4gIFN0YXR1czogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBUaGUgY3VycmVudCBiYXNlLXZlcnNpb24gb2YgYW55IG5ld2x5IGNyZWF0ZWQgY29uZmlnIGZpbGVcbiAqL1xuY29uc3QgQkFTRV9DT05GSUdfVkVSU0lPTiA9IDAuMTtcblxuLyoqXG4gKiBDb25maWcgY2xhc3MgZm9yIGxvYWRpbmcgYW5kIHNhdmluZyBmamFsbC1jb25maWcuanNvbiBmaWxlXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25maWcge1xuICByb290Q29uZmlnOiBSb290Q29uZmlnO1xuICBleGlzdGluZ0FjY291bnRzQ29uZmlnOiBBY2NvdW50W107XG4gIGNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZzogQ29zdEFsbG9jYXRpb25UYWdzW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcm9vdENvbmZpZz86IFJvb3RDb25maWcsXG4gICAgZXhpc3RpbmdBY2NvdW50c0NvbmZpZz86IEFjY291bnRbXSxcbiAgICBjb3N0QWxsb2NhdGlvblRhZ3NDb25maWc/OiBDb3N0QWxsb2NhdGlvblRhZ3NbXVxuICApIHtcbiAgICB0aGlzLnJvb3RDb25maWcgPSByb290Q29uZmlnID8/IHtcbiAgICAgIHZlcnNpb246IEJBU0VfQ09ORklHX1ZFUlNJT04sXG4gICAgICBzZXJ2aWNlczoge30sXG4gICAgICBwcm92aWRlckFjY291bnRzOiBbXVxuICAgIH07XG4gICAgdGhpcy5leGlzdGluZ0FjY291bnRzQ29uZmlnID0gZXhpc3RpbmdBY2NvdW50c0NvbmZpZyA/PyBbXTtcbiAgICB0aGlzLmNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZyA9IGNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZyA/PyBbXTtcbiAgfVxuXG4gIGlzRGV2ZWxvcG1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5yb290Q29uZmlnPy5kZXZlbG9wbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBmamFsbCBjb25maWcgZGlyZWN0b3J5IGJ5IHdhbGtpbmcgdXAgdGhlIGRpcmVjdG9yeSB0cmVlXG4gICAqIEByZXR1cm5zIFRoZSBwYXRoIHRvIHRoZSBmamFsbCBjb25maWcgZGlyZWN0b3J5IG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBmaW5kQ29uZmlnRGlyZWN0b3J5KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGxldCBjdXJyZW50RGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBtYXhEZXB0aCA9IDEwOyAvLyBQcmV2ZW50IGluZmluaXRlIGxvb3BzXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heERlcHRoOyBpKyspIHtcbiAgICAgIGNvbnN0IGZqYWxsRGlyID0gcGF0aC5qb2luKGN1cnJlbnREaXIsIFwiZmphbGxcIik7XG4gICAgICBjb25zdCBjb25maWdGaWxlID0gcGF0aC5qb2luKGZqYWxsRGlyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpO1xuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhjb25maWdGaWxlKSkge1xuICAgICAgICByZXR1cm4gZmphbGxEaXI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRpcmVjdENvbmZpZ0ZpbGUgPSBwYXRoLmpvaW4oY3VycmVudERpciwgXCJmamFsbC1jb25maWcuanNvblwiKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGRpcmVjdENvbmZpZ0ZpbGUpKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50RGlyO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudERpcik7XG4gICAgICBpZiAocGFyZW50RGlyID09PSBjdXJyZW50RGlyKSBicmVhaztcbiAgICAgIGN1cnJlbnREaXIgPSBwYXJlbnREaXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBjb25maWcgZmlsZSBpbnRvIG1lbW9yeSBhcyBhIHJhdyBKU09OIHN0cmluZ1xuICAgKiBAcmV0dXJucyBDb25maWcgYXMgSlNPTiBzdHJpbmcgb3IgTlVMTCBpZiBubyBjb25maWcgZmlsZSBhY2Nlc3NpYmxlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBsb2FkQ29uZmlnRmlsZShjb25maWdGaWxlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgZnMuYWNjZXNzU3luYyhjb25maWdGaWxlLCBmcy5jb25zdGFudHMuUl9PSyB8IGZzLmNvbnN0YW50cy5XX09LKTtcblxuICAgICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyhjb25maWdGaWxlLCB7XG4gICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIlxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgY29uZmlndXJhdGlvbiBmcm9tIGZpbGVcbiAgICpcbiAgICogQHJldHVybnMgTG9hZGVkIGNvbmZpZ3VyYXRpb25cbiAgICogQHRocm93cyBFcnJvciBpZiBjb25maWcgZmlsZSBjYW5ub3QgYmUgcGFyc2VkXG4gICAqL1xuICBzdGF0aWMgbG9hZENvbmZpZygpOiBDb25maWcge1xuICAgIGNvbnN0IGNvbmZpZ0RpciA9IENvbmZpZy5maW5kQ29uZmlnRGlyZWN0b3J5KCk7XG4gICAgaWYgKCFjb25maWdEaXIpIHtcbiAgICAgIHJldHVybiBuZXcgQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm9vdENvbmZpZ0pzb24gPSBDb25maWcubG9hZENvbmZpZ0ZpbGUoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnRGlyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpXG4gICAgKTtcbiAgICBjb25zdCBleGlzdGluZ0FjY291bnRKc29uID0gQ29uZmlnLmxvYWRDb25maWdGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZ0RpciwgXCJhY2NvdW50cy1jb25maWcuanNvblwiKVxuICAgICk7XG4gICAgY29uc3QgY29zdEFsbG9jYXRpb25UYWdzSnNvbiA9IENvbmZpZy5sb2FkQ29uZmlnRmlsZShcbiAgICAgIHBhdGguam9pbihjb25maWdEaXIsIFwiY29zdC1hbGxvY2F0aW9uLXRhZ3MtY29uZmlnLmpzb25cIilcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvb3RDb25maWcgPSByb290Q29uZmlnSnNvblxuICAgICAgICA/IEpTT04ucGFyc2Uocm9vdENvbmZpZ0pzb24pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZXhpc3RpbmdBY2NvdW50c0NvbmZpZyA9IGV4aXN0aW5nQWNjb3VudEpzb25cbiAgICAgICAgPyBKU09OLnBhcnNlKGV4aXN0aW5nQWNjb3VudEpzb24pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgY29zdEFsbG9jYXRpb25UYWdzQ29uZmlnID0gY29zdEFsbG9jYXRpb25UYWdzSnNvblxuICAgICAgICA/IEpTT04ucGFyc2UoY29zdEFsbG9jYXRpb25UYWdzSnNvbilcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiBuZXcgQ29uZmlnKFxuICAgICAgICByb290Q29uZmlnLFxuICAgICAgICBleGlzdGluZ0FjY291bnRzQ29uZmlnLFxuICAgICAgICBjb3N0QWxsb2NhdGlvblRhZ3NDb25maWdcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgY29uZmlnIGZpbGU6ICR7bWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBjb25maWd1cmF0aW9uIHRvIGZpbGVcbiAgICovXG4gIHNhdmVDb25maWcoKSB7XG4gICAgY29uc3QgY29uZmlnRGlyID1cbiAgICAgIENvbmZpZy5maW5kQ29uZmlnRGlyZWN0b3J5KCkgfHwgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiZmphbGxcIik7XG5cbiAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGZzLm1rZGlyU3luYyhjb25maWdEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3Qgcm9vdEpzb25TdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnJvb3RDb25maWcsIG51bGwsIDIpO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKGNvbmZpZ0RpciwgXCJmamFsbC1jb25maWcuanNvblwiKSwgcm9vdEpzb25TdHJpbmcpO1xuXG4gICAgY29uc3QgZXhpc3RpbmdBY2NvdW50c0pzb25TdHJpbmcgPSBKU09OLnN0cmluZ2lmeShcbiAgICAgIHRoaXMuZXhpc3RpbmdBY2NvdW50c0NvbmZpZyxcbiAgICAgIG51bGwsXG4gICAgICAyXG4gICAgKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZ0RpciwgXCJhY2NvdW50cy1jb25maWcuanNvblwiKSxcbiAgICAgIGV4aXN0aW5nQWNjb3VudHNKc29uU3RyaW5nXG4gICAgKTtcblxuICAgIGNvbnN0IGNvc3RBbGxvY2F0aW9uVGFnc0pzb25TdHJpbmcgPSBKU09OLnN0cmluZ2lmeShcbiAgICAgIHRoaXMuY29zdEFsbG9jYXRpb25UYWdzQ29uZmlnLFxuICAgICAgbnVsbCxcbiAgICAgIDJcbiAgICApO1xuICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnRGlyLCBcImNvc3QtYWxsb2NhdGlvbi10YWdzLWNvbmZpZy5qc29uXCIpLFxuICAgICAgY29zdEFsbG9jYXRpb25UYWdzSnNvblN0cmluZ1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IHNlcnZpY2UgdG8gdGhlIGNvbmZpZyBmaWxlXG4gICAqIEBwYXJhbSBzZXJ2aWNlS2V5IE5hbWUva2V5IG9mIHRoZSBzZXJ2aWNlXG4gICAqIEBwYXJhbSBjb25maWcgU2VydmljZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXNcbiAgICovXG4gIGFkZFNlcnZpY2Uoc2VydmljZUtleTogc3RyaW5nLCBjb25maWc6IFNlcnZpY2VDb25maWcpIHtcbiAgICBpZiAoIXRoaXMucm9vdENvbmZpZy5zZXJ2aWNlcykgdGhpcy5yb290Q29uZmlnLnNlcnZpY2VzID0ge307XG4gICAgdGhpcy5yb290Q29uZmlnLnNlcnZpY2VzW3NlcnZpY2VLZXldID0gY29uZmlnO1xuICB9XG5cbiAgZ2V0U2VydmljZUNvbmZpZyhzZXJ2aWNlS2V5OiBzdHJpbmcpOiBTZXJ2aWNlQ29uZmlnIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcuc2VydmljZXMpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcuc2VydmljZXNbc2VydmljZUtleV0gfHwgbnVsbDtcbiAgfVxuXG4gIGFkZFByb3ZpZGVyQWNjb3VudChhY2NvdW50OiBQcm92aWRlckFjY291bnQpIHtcbiAgICBpZiAoIXRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzKVxuICAgICAgdGhpcy5yb290Q29uZmlnLnByb3ZpZGVyQWNjb3VudHMgPSBbXTtcblxuICAgIC8vIGVuc3VyZSBhY2NvdW50IG5hbWUgaXMgYWx3YXlzIGxvd2VyY2FzZVxuICAgIGFjY291bnQubmFtZSA9IGFjY291bnQubmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuXG4gICAgdGhpcy5yb290Q29uZmlnLnByb3ZpZGVyQWNjb3VudHMucHVzaChhY2NvdW50KTtcbiAgfVxuXG4gIGdldFByb3ZpZGVyQWNjb3VudChhY2NvdW50TmFtZTogc3RyaW5nKTogUHJvdmlkZXJBY2NvdW50IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcucHJvdmlkZXJBY2NvdW50cy5maW5kKFxuICAgICAgKGFjY291bnQpID0+XG4gICAgICAgIGFjY291bnQubmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBhY2NvdW50TmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpXG4gICAgKTtcbiAgfVxuXG4gIGdldFByb3ZpZGVyQWNjb3VudEJ5SWQoYWNjb3VudElkOiBzdHJpbmcpOiBQcm92aWRlckFjY291bnQgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb3ZpZGVyQWNjb3VudHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzLmZpbmQoXG4gICAgICAoYWNjb3VudCkgPT4gYWNjb3VudC5pZCA9PT0gYWNjb3VudElkXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcHJvdmlkZXIgYWNjb3VudCBieSBlbnZpcm9ubWVudCB0eXBlXG4gICAqIEBwYXJhbSBlbnZpcm9ubWVudCBUaGUgZW52aXJvbm1lbnQgdHlwZSAoZS5nLiwgJ3BsYXRmb3JtJywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbicpXG4gICAqIEByZXR1cm5zIFRoZSBwcm92aWRlciBhY2NvdW50IHdpdGggdGhlIHNwZWNpZmllZCBlbnZpcm9ubWVudCBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAqL1xuICBnZXRBY2NvdW50QnlFbnZpcm9ubWVudChlbnZpcm9ubWVudDogc3RyaW5nKTogUHJvdmlkZXJBY2NvdW50IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcucHJvdmlkZXJBY2NvdW50cy5maW5kKFxuICAgICAgKGFjY291bnQpID0+IGFjY291bnQuZW52aXJvbm1lbnQgPT09IGVudmlyb25tZW50XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBleGlzdGluZyBhY2NvdW50cyBsaXN0LiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgQWNjb3VudFNlcnZpY2VcbiAgICogYWZ0ZXIgaXQgZmV0Y2hlcyB0aGUgYWNjb3VudHMgZnJvbSBBV1MuXG4gICAqIEBwYXJhbSBhY2NvdW50cyBMaXN0IG9mIEFXUyBhY2NvdW50cyBmcm9tIE9yZ2FuaXphdGlvbnMgQVBJXG4gICAqL1xuICBzZXRFeGlzdGluZ0FjY291bnRzTGlzdChhY2NvdW50czogQWNjb3VudFtdKSB7XG4gICAgdGhpcy5leGlzdGluZ0FjY291bnRzQ29uZmlnID0gYWNjb3VudHM7XG4gIH1cblxuICBnZXRFeGlzdGluZ0FjY291bnRzKCk6IEFjY291bnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXhpc3RpbmdBY2NvdW50c0NvbmZpZztcbiAgfVxuXG4gIHNldFByaW1hcnlSZWdpb24ocmVnaW9uOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJvb3RDb25maWcucHJpbWFyeVJlZ2lvbiA9IHJlZ2lvbjtcbiAgfVxuXG4gIHNldFNlY29uZGFyeVJlZ2lvbnMocmVnaW9uczogc3RyaW5nW10pIHtcbiAgICB0aGlzLnJvb3RDb25maWcuc2Vjb25kYXJ5UmVnaW9ucyA9IHJlZ2lvbnM7XG4gIH1cblxuICBzZXREaXNhc3RlclJlY292ZXJ5UmVnaW9uKHJlZ2lvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5yb290Q29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb24gPSByZWdpb247XG4gIH1cblxuICBnZXRQcmltYXJ5UmVnaW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5wcmltYXJ5UmVnaW9uO1xuICB9XG5cbiAgZ2V0U2Vjb25kYXJ5UmVnaW9ucygpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5zZWNvbmRhcnlSZWdpb25zO1xuICB9XG5cbiAgZ2V0RGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbjtcbiAgfVxuXG4gIGdldEFsbFJlZ2lvbnMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJlZ2lvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAodGhpcy5yb290Q29uZmlnLnByaW1hcnlSZWdpb24pIHtcbiAgICAgIHJlZ2lvbnMucHVzaCh0aGlzLnJvb3RDb25maWcucHJpbWFyeVJlZ2lvbik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucm9vdENvbmZpZy5zZWNvbmRhcnlSZWdpb25zKSB7XG4gICAgICByZWdpb25zLnB1c2goLi4udGhpcy5yb290Q29uZmlnLnNlY29uZGFyeVJlZ2lvbnMpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMucm9vdENvbmZpZy5kaXNhc3RlclJlY292ZXJ5UmVnaW9uICYmXG4gICAgICAhcmVnaW9ucy5pbmNsdWRlcyh0aGlzLnJvb3RDb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbilcbiAgICApIHtcbiAgICAgIHJlZ2lvbnMucHVzaCh0aGlzLnJvb3RDb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZ2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY29zdCBhbGxvY2F0aW9uIHRhZ3MgbGlzdC4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IEFjY291bnRTZXJ2aWNlXG4gICAqIGFmdGVyIGl0IGZldGNoZXMgdGhlIHRhZ3MgZnJvbSBBV1MgQ29zdCBFeHBsb3Jlci5cbiAgICogQHBhcmFtIHRhZ3MgTGlzdCBvZiBjb3N0IGFsbG9jYXRpb24gdGFnc1xuICAgKi9cbiAgc2V0Q29zdEFsbG9jYXRpb25UYWdzTGlzdCh0YWdzOiBDb3N0QWxsb2NhdGlvblRhZ3NbXSkge1xuICAgIHRoaXMuY29zdEFsbG9jYXRpb25UYWdzQ29uZmlnID0gdGFncztcbiAgfVxuXG4gIGdldENvc3RBbGxvY2F0aW9uVGFncygpOiBDb3N0QWxsb2NhdGlvblRhZ3NbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29zdEFsbG9jYXRpb25UYWdzQ29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmphbGwgY29uZmlnIGRpcmVjdG9yeSBwYXRoXG4gICAqIEByZXR1cm5zIFRoZSBwYXRoIHRvIHRoZSBmamFsbCBjb25maWcgZGlyZWN0b3J5IG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAqL1xuICBzdGF0aWMgZ2V0Q29uZmlnRGlyZWN0b3J5KCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiBDb25maWcuZmluZENvbmZpZ0RpcmVjdG9yeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2ZpbGUgbWFuYWdlbWVudCBtZXRob2RzXG4gICAqL1xuXG4gIGdldEN1cnJlbnRQcm9maWxlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5jdXJyZW50UHJvZmlsZTtcbiAgfVxuXG4gIHNldEN1cnJlbnRQcm9maWxlKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucm9vdENvbmZpZy5jdXJyZW50UHJvZmlsZSA9IG5hbWU7XG4gIH1cblxuICBnZXRQcm9maWxlKG5hbWU6IHN0cmluZyk6IFByb2ZpbGUgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcucHJvZmlsZXNbbmFtZV07XG4gIH1cblxuICBnZXRBbGxQcm9maWxlTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzKSByZXR1cm4gW107XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucm9vdENvbmZpZy5wcm9maWxlcyk7XG4gIH1cblxuICBhZGRQcm9maWxlKG5hbWU6IHN0cmluZywgcHJvZmlsZTogUHJvZmlsZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcucHJvZmlsZXMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzW25hbWVdID0gcHJvZmlsZTtcbiAgfVxuXG4gIHJlbW92ZVByb2ZpbGUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcucHJvZmlsZXMpIHJldHVybjtcbiAgICBkZWxldGUgdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzW25hbWVdO1xuXG4gICAgLy8gSWYgd2UgcmVtb3ZlZCB0aGUgY3VycmVudCBwcm9maWxlLCBjbGVhciBpdFxuICAgIGlmICh0aGlzLnJvb3RDb25maWcuY3VycmVudFByb2ZpbGUgPT09IG5hbWUpIHtcbiAgICAgIHRoaXMucm9vdENvbmZpZy5jdXJyZW50UHJvZmlsZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBnZXRTU09TZXNzaW9uKG5hbWU6IHN0cmluZyk6IFNTT1Nlc3Npb24gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnNzb1Nlc3Npb25zKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcuc3NvU2Vzc2lvbnNbbmFtZV07XG4gIH1cblxuICBhZGRTU09TZXNzaW9uKG5hbWU6IHN0cmluZywgc2Vzc2lvbjogU1NPU2Vzc2lvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnNzb1Nlc3Npb25zKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcuc3NvU2Vzc2lvbnMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5yb290Q29uZmlnLnNzb1Nlc3Npb25zW25hbWVdID0gc2Vzc2lvbjtcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fjall/util",
3
- "version": "0.86.1",
3
+ "version": "0.87.3",
4
4
  "description": "Common utility methods",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -29,5 +29,5 @@
29
29
  "overrides": {
30
30
  "@smithy/core": "2.5.5"
31
31
  },
32
- "gitHead": "18fcab64c8b43a0507191d418592f3cda68fe6c6"
32
+ "gitHead": "be3b6f5bee0c9d1fe50e0be4816ffd87eb07e4c4"
33
33
  }