jsii-pacmak 1.44.2 → 1.45.0
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/lib/targets/dotnet/dotnetdocgenerator.js +5 -2
- package/lib/targets/dotnet/dotnetgenerator.js +5 -2
- package/lib/targets/python/type-name.d.ts +5 -0
- package/lib/targets/python/type-name.js +3 -2
- package/lib/targets/python.js +16 -2
- package/lib/version.d.ts +2 -2
- package/lib/version.js +4 -4
- package/package.json +12 -12
|
@@ -149,7 +149,10 @@ class DotNetDocGenerator {
|
|
|
149
149
|
xml.att(name, value);
|
|
150
150
|
}
|
|
151
151
|
const xmlstring = xml.end({ allowEmpty: true, pretty: false });
|
|
152
|
-
|
|
152
|
+
const trimLeft = tag !== 'code';
|
|
153
|
+
for (const line of xmlstring
|
|
154
|
+
.split('\n')
|
|
155
|
+
.map((x) => (trimLeft ? x.trim() : x.trimRight()))) {
|
|
153
156
|
this.code.line(`/// ${line}`);
|
|
154
157
|
}
|
|
155
158
|
}
|
|
@@ -165,4 +168,4 @@ function shouldMentionStability(s) {
|
|
|
165
168
|
// Don't render "stable" or "external", those are both stable by implication
|
|
166
169
|
return s === spec.Stability.Deprecated || s === spec.Stability.Experimental;
|
|
167
170
|
}
|
|
168
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90bmV0ZG9jZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZG90bmV0ZG9jZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFtQztBQUVuQywrQ0FPc0I7QUFDdEIseUNBQXlDO0FBRXpDLDBCQUF3RDtBQUN4RCxzQ0FBMEM7QUFDMUMsMkNBQThDO0FBRTlDOzs7O0dBSUc7QUFDSCxNQUFhLGtCQUFrQjtJQUk3QixZQUNFLElBQWUsRUFDRSxPQUFnQixFQUNoQixRQUF1QjtRQUR2QixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLGFBQVEsR0FBUixRQUFRLENBQWU7UUFMekIsY0FBUyxHQUFvQixJQUFJLDJCQUFlLEVBQUUsQ0FBQztRQU9sRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksUUFBUSxDQUFDLEdBQXNCLEVBQUUsV0FBd0I7UUFDOUQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztRQUV0Qiw2RUFBNkU7UUFDN0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsc0JBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVwRCxrREFBa0Q7UUFDbEQsTUFBTSxTQUFTLEdBQUcsR0FBa0IsQ0FBQztRQUNyQyxJQUFJLFNBQVMsQ0FBQyxVQUFVLEVBQUU7WUFDeEIsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTs7Z0JBQ3JDLG1GQUFtRjtnQkFDbkYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVM7cUJBQzdCLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7cUJBQ2hDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxjQUFFLEtBQUssQ0FBQyxJ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NUUsT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDO0FBQzlFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzcGVjIGZyb20gJ0Bqc2lpL3NwZWMnO1xuaW1wb3J0IHsgQ29kZU1ha2VyIH0gZnJvbSAnY29kZW1ha2VyJztcbmltcG9ydCB7XG4gIFJvc2V0dGEsXG4gIFRhcmdldExhbmd1YWdlLFxuICBUcmFuc2xhdGlvbixcbiAgZW5mb3JjZXNTdHJpY3RNb2RlLFxuICBtYXJrRG93blRvWG1sRG9jLFxuICBBcGlMb2NhdGlvbixcbn0gZnJvbSAnanNpaS1yb3NldHRhJztcbmltcG9ydCAqIGFzIHhtbGJ1aWxkZXIgZnJvbSAneG1sYnVpbGRlcic7XG5cbmltcG9ydCB7IElOQ09NUExFVEVfRElTQ0xBSU1FUl9OT05DT01QSUxJTkcgfSBmcm9tICcuLic7XG5pbXBvcnQgeyByZW5kZXJTdW1tYXJ5IH0gZnJvbSAnLi4vX3V0aWxzJztcbmltcG9ydCB7IERvdE5ldE5hbWVVdGlscyB9IGZyb20gJy4vbmFtZXV0aWxzJztcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIEpzaWkgYXR0cmlidXRlcyBhbmQgY2FsbHMgZm9yIHRoZSAuTkVUIHJ1bnRpbWVcbiAqXG4gKiBVc2VzIHRoZSBzYW1lIGluc3RhbmNlIG9mIENvZGVNYWtlciBhcyB0aGUgcmVzdCBvZiB0aGUgY29kZVxuICovXG5leHBvcnQgY2xhc3MgRG90TmV0RG9jR2VuZXJhdG9yIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb2RlOiBDb2RlTWFrZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmFtZXV0aWxzOiBEb3ROZXROYW1lVXRpbHMgPSBuZXcgRG90TmV0TmFtZVV0aWxzKCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvc2V0dGE6IFJvc2V0dGEsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhc3NlbWJseTogc3BlYy5Bc3NlbWJseSxcbiAgKSB7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBhbGwgZG9jdW1lbnRhdGlvbiBkZXBlbmRpbmcgb24gd2hhdCBpcyBhdmFpbGFibGUgaW4gdGhlIGpzaWkgbW9kZWxcbiAgICpcbiAgICogVXNlZCBieSBhbGwga2luZCBvZiBtZW1iZXJzICsgY2xhc3NlcywgaW50ZXJmYWNlcywgZW51bXNcbiAgICogT3JkZXIgc2hvdWxkIGJlXG4gICAqIFN1bW1hcnlcbiAgICogUGFyYW1cbiAgICogUmV0dXJuc1xuICAgKiBSZW1hcmtzIChpbmNsdWRlcyBleGFtcGxlcywgbGlua3MsIGRlcHJlY2F0ZWQpXG4gICAqL1xuICBwdWJsaWMgZW1pdERvY3Mob2JqOiBzcGVjLkRvY3VtZW50YWJsZSwgYXBpTG9jYXRpb246IEFwaUxvY2F0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgZG9jcyA9IG9iai5kb2NzO1xuXG4gICAgLy8gVGhlIGRvY3MgbWF5IGJlIHVuZGVmaW5lZCBhdCB0aGUgbWV0aG9kIGxldmVsIGJ1dCBub3QgdGhlIHBhcmFtZXRlcnMgbGV2ZWxcbiAgICB0aGlzLmVtaXRYbWxEb2MoJ3N1bW1hcnknLCByZW5kZXJTdW1tYXJ5KG9iai5kb2NzKSk7XG5cbiAgICAvLyBIYW5kbGluZyBwYXJhbWV0ZXJzIG9ubHkgaWYgdGhlIG9iaiBpcyBhIG1ldGhvZFxuICAgIGNvbnN0IG9iak1ldGhvZCA9IG9iaiBhcyBzcGVjLk1ldGhvZDtcbiAgICBpZiAob2JqTWV0aG9kLnBhcmFtZXRlcnMpIHtcbiAgICAgIG9iak1ldGhvZC5wYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtKSA9PiB7XG4gICAgICAgIC8vIFJlbW92ZSBhbnkgc2x1ZyBgQGAgZnJvbSB0aGUgcGFyYW1ldGVyIG5hbWUgLSBpdCdzIG5vdCBzdXBwb3NlZCB0byBzaG93IHVwIGhlcmUuXG4gICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHRoaXMubmFtZXV0aWxzXG4gICAgICAgICAgLmNvbnZlcnRQYXJhbWV0ZXJOYW1lKHBhcmFtLm5hbWUpXG4gICAgICAgICAgLnJlcGxhY2UoL15ALywgJycpO1xuICAgICAgICB0aGlzLmVtaXRYbWxEb2MoJ3BhcmFtJywgcGFyYW0uZG9jcz8uc3VtbWFyeSA/PyAnJywge1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgbmFtZTogcGFyYW1OYW1lIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXQgdGhpcyBwZG9jZnggbmFtZXNwYWNlZG9jZCBhIHZhbGlkIGluc3RhbmNlIG9mIGRvY3NcbiAgICBpZiAoIWRvY3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZG9jcy5yZXR1cm5zKSB7XG4gICAgICB0aGlzLmVtaXRYbWxEb2MoJ3JldHVybnMnLCBkb2NzLnJldHVybnMpO1xuICAgIH1cblxuICAgIC8vIFJlbWFya3MgZG9lcyBub3QgdXNlIGVtaXRYbWxEb2MoKSBiZWNhdXNlIHRoZSByZW1hcmtzIGNhbiBjb250YWluIGNvZGUgYmxvY2tzXG4gICAgLy8gd2hpY2ggYXJlIGZlbmNlZCB3aXRoIDxjb2RlPiB0YWdzLCB3aGljaCB3b3VsZCBiZSBlc2NhcGVkIHRvXG4gICAgLy8gJmx0O2NvZGUmZ3Q7IGlmIHdlIHVzZWQgdGhlIHhtbCBidWlsZGVyLlxuICAgIGNvbnN0IHJlbWFya3MgPSB0aGlzLnJlbmRlclJlbWFya3MoZG9jcywgYXBpTG9jYXRpb24pO1xuICAgIGlmIChyZW1hcmtzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCcvLy8gPHJlbWFya3M+Jyk7XG4gICAgICByZW1hcmtzLmZvckVhY2goKHIpID0+IHRoaXMuY29kZS5saW5lKGAvLy8gJHtyfWAudHJpbVJpZ2h0KCkpKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCcvLy8gPC9yZW1hcmtzPicpO1xuICAgIH1cblxuICAgIGlmIChkb2NzLmV4YW1wbGUpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCcvLy8gPGV4YW1wbGU+Jyk7XG4gICAgICB0aGlzLmVtaXRYbWxEb2MoJ2NvZGUnLCB0aGlzLmNvbnZlcnRFeGFtcGxlKGRvY3MuZXhhbXBsZSwgYXBpTG9jYXRpb24pKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCcvLy8gPC9leGFtcGxlPicpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlbWl0TWFya2Rvd25Bc1JlbWFya3MoXG4gICAgbWFya2Rvd246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBhcGlMb2NhdGlvbjogQXBpTG9jYXRpb24sXG4gICkge1xuICAgIGlmICghbWFya2Rvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2xhdGVkID0gbWFya0Rvd25Ub1htbERvYyhcbiAgICAgIHRoaXMuY29udmVydFNhbXBsZXNJbk1hcmtkb3duKG1hcmtkb3duLCBhcGlMb2NhdGlvbiksXG4gICAgKTtcbiAgICBjb25zdCBsaW5lcyA9IHRyYW5zbGF0ZWQuc3BsaXQoJ1xcbicpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoJy8vLyA8cmVtYXJrcz4nKTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAvLy8gJHtsaW5lfWAudHJpbVJpZ2h0KCkpO1xuICAgIH1cbiAgICB0aGlzLmNvZGUubGluZSgnLy8vIDwvcmVtYXJrcz4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaW5lcyB0aGF0IHNob3VsZCBnbyBpbnRvIHRoZSA8cmVtYXJrcz4gc2VjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJSZW1hcmtzKGRvY3M6IHNwZWMuRG9jcywgYXBpTG9jYXRpb246IEFwaUxvY2F0aW9uKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJldDogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChkb2NzLnJlbWFya3MpIHtcbiAgICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSBtYXJrRG93blRvWG1sRG9jKFxuICAgICAgICB0aGlzLmNvbnZlcnRTYW1wbGVzSW5NYXJrZG93bihkb2NzLnJlbWFya3MsIGFwaUxvY2F0aW9uKSxcbiAgICAgICk7XG4gICAgICByZXQucHVzaCguLi50cmFuc2xhdGVkLnNwbGl0KCdcXG4nKSk7XG4gICAgICByZXQucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gQWxsIHRoZSBcInRhZ3NcIiBuZWVkIHRvIGJlIHJlbmRlcmVkIHdpdGggZW1weXQgbGluZXMgYmV0d2VlbiB0aGVtIG9yIHRoZXknbGwgYmUgd29yZCB3cmFwcGVkLlxuXG4gICAgaWYgKGRvY3MuZGVmYXVsdCkge1xuICAgICAgZW1pdERvY0F0dHJpYnV0ZSgnZGVmYXVsdCcsIGRvY3MuZGVmYXVsdCk7XG4gICAgfVxuICAgIGlmIChkb2NzLnN0YWJpbGl0eSAmJiBzaG91bGRNZW50aW9uU3RhYmlsaXR5KGRvY3Muc3RhYmlsaXR5KSkge1xuICAgICAgZW1pdERvY0F0dHJpYnV0ZShcbiAgICAgICAgJ3N0YWJpbGl0eScsXG4gICAgICAgIHRoaXMubmFtZXV0aWxzLmNhcGl0YWxpemVXb3JkKGRvY3Muc3RhYmlsaXR5KSxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkb2NzLnNlZSkge1xuICAgICAgZW1pdERvY0F0dHJpYnV0ZSgnc2VlJywgZG9jcy5zZWUpO1xuICAgIH1cbiAgICBpZiAoZG9jcy5zdWJjbGFzc2FibGUpIHtcbiAgICAgIGVtaXREb2NBdHRyaWJ1dGUoJ3N1YmNsYXNzYWJsZScsICcnKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoZG9jcy5jdXN0b20gPz8ge30pKSB7XG4gICAgICBjb25zdCBleHRyYVNwYWNlID0gayA9PT0gJ2xpbmsnID8gJyAnIDogJyc7IC8vIEV4dHJhIHNwYWNlIGZvciAnQGxpbmsnIHRvIGtlZXAgdW5pdCB0ZXN0cyBoYXBweVxuICAgICAgZW1pdERvY0F0dHJpYnV0ZShrLCB2ICsgZXh0cmFTcGFjZSk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGVtcHR5IGxpbmVzXG4gICAgd2hpbGUgKHJldC5sZW5ndGggPiAwICYmIHJldFswXSA9PT0gJycpIHtcbiAgICAgIHJldC5zaGlmdCgpO1xuICAgIH1cbiAgICB3aGlsZSAocmV0Lmxlbmd0aCA+IDAgJiYgcmV0W3JldC5sZW5ndGggLSAxXSA9PT0gJycpIHtcbiAgICAgIHJldC5wb3AoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuXG4gICAgZnVuY3Rpb24gZW1pdERvY0F0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIGNvbnRlbnRzOiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IGxzID0gY29udGVudHMuc3BsaXQoJ1xcbicpO1xuICAgICAgcmV0LnB1c2goYDxzdHJvbmc+JHt1Y0ZpcnN0KG5hbWUpfTwvc3Ryb25nPjogJHtsc1swXX1gKTtcbiAgICAgIHJldC5wdXNoKC4uLmxzLnNsaWNlKDEpKTtcbiAgICAgIHJldC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRFeGFtcGxlKGV4YW1wbGU6IHN0cmluZywgYXBpTG9jYXRpb246IEFwaUxvY2F0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCB0cmFuc2xhdGVkID0gdGhpcy5yb3NldHRhLnRyYW5zbGF0ZUV4YW1wbGUoXG4gICAgICBhcGlMb2NhdGlvbixcbiAgICAgIGV4YW1wbGUsXG4gICAgICBUYXJnZXRMYW5ndWFnZS5DU0hBUlAsXG4gICAgICBlbmZvcmNlc1N0cmljdE1vZGUodGhpcy5hc3NlbWJseSksXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5wcmVmaXhEaXNjbGFpbWVyKHRyYW5zbGF0ZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0U2FtcGxlc0luTWFya2Rvd24obWFya2Rvd246IHN0cmluZywgYXBpOiBBcGlMb2NhdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucm9zZXR0YS50cmFuc2xhdGVTbmlwcGV0c0luTWFya2Rvd24oXG4gICAgICBhcGksXG4gICAgICBtYXJrZG93bixcbiAgICAgIFRhcmdldExhbmd1YWdlLkNTSEFSUCxcbiAgICAgIGVuZm9yY2VzU3RyaWN0TW9kZSh0aGlzLmFzc2VtYmx5KSxcbiAgICAgICh0cmFucykgPT4gKHtcbiAgICAgICAgbGFuZ3VhZ2U6IHRyYW5zLmxhbmd1YWdlLFxuICAgICAgICBzb3VyY2U6IHRoaXMucHJlZml4RGlzY2xhaW1lcih0cmFucyksXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVmaXhEaXNjbGFpbWVyKHRyYW5zbGF0ZWQ6IFRyYW5zbGF0aW9uKSB7XG4gICAgaWYgKCF0cmFuc2xhdGVkLmRpZENvbXBpbGUgJiYgSU5DT01QTEVURV9ESVNDTEFJTUVSX05PTkNPTVBJTElORykge1xuICAgICAgcmV0dXJuIGAvLyAke0lOQ09NUExFVEVfRElTQ0xBSU1FUl9OT05DT01QSUxJTkd9XFxuJHt0cmFuc2xhdGVkLnNvdXJjZX1gO1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNsYXRlZC5zb3VyY2U7XG4gIH1cblxuICBwcml2YXRlIGVtaXRYbWxEb2MoXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIHsgYXR0cmlidXRlcyA9IHt9IH06IHsgYXR0cmlidXRlcz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9IH0gPSB7fSxcbiAgKTogdm9pZCB7XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeG1sID0geG1sYnVpbGRlci5jcmVhdGUodGFnLCB7IGhlYWRsZXNzOiB0cnVlIH0pLnRleHQoY29udGVudCk7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpKSB7XG4gICAgICB4bWwuYXR0KG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgeG1sc3RyaW5nID0geG1sLmVuZCh7IGFsbG93RW1wdHk6IHRydWUsIHByZXR0eTogZmFsc2UgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgeG1sc3RyaW5nLnNwbGl0KCdcXG4nKS5tYXAoKHgpID0+IHgudHJpbSgpKSkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYC8vLyAke2xpbmV9YCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVXBwZXJjYXNlIHRoZSBmaXJzdCBsZXR0ZXJcbiAqL1xuZnVuY3Rpb24gdWNGaXJzdCh4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHguc3Vic3RyKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyB4LnN1YnN0cigxKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkTWVudGlvblN0YWJpbGl0eShzOiBzcGVjLlN0YWJpbGl0eSkge1xuICAvLyBEb24ndCByZW5kZXIgXCJzdGFibGVcIiBvciBcImV4dGVybmFsXCIsIHRob3NlIGFyZSBib3RoIHN0YWJsZSBieSBpbXBsaWNhdGlvblxuICByZXR1cm4gcyA9PT0gc3BlYy5TdGFiaWxpdHkuRGVwcmVjYXRlZCB8fCBzID09PSBzcGVjLlN0YWJpbGl0eS5FeHBlcmltZW50YWw7XG59XG4iXX0=
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90bmV0ZG9jZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZG90bmV0ZG9jZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFtQztBQUVuQywrQ0FPc0I7QUFDdEIseUNBQXlDO0FBRXpDLDBCQUF3RDtBQUN4RCxzQ0FBMEM7QUFDMUMsMkNBQThDO0FBRTlDOzs7O0dBSUc7QUFDSCxNQUFhLGtCQUFrQjtJQUk3QixZQUNFLElBQWUsRUFDRSxPQUFnQixFQUNoQixRQUF1QjtRQUR2QixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLGFBQVEsR0FBUixRQUFRLENBQWU7UUFMekIsY0FBUyxHQUFvQixJQUFJLDJCQUFlLEVBQUUsQ0FBQztRQU9sRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksUUFBUSxDQUFDLEdBQXNCLEVBQUUsV0FBd0I7UUFDOUQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztRQUV0Qiw2RUFBNkU7UUFDN0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsc0JBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVwRCxrREFBa0Q7UUFDbEQsTUFBTSxTQUFTLEdBQUcsR0FBa0IsQ0FBQztRQUNyQyxJQUFJLFNBQVMsQ0FBQyxVQUFVLEVBQUU7WUFDeEIsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTs7Z0JBQ3JDLG1GQUFtRjtnQkFDbkYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVM7cUJBQzdCLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7cUJBQ2hDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxjQUFFLEtBQUssQ0FBQyxJ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QyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLENBQWlCO0lBQy9DLDRFQUE0RTtJQUM1RSxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7QUFDOUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHNwZWMgZnJvbSAnQGpzaWkvc3BlYyc7XG5pbXBvcnQgeyBDb2RlTWFrZXIgfSBmcm9tICdjb2RlbWFrZXInO1xuaW1wb3J0IHtcbiAgUm9zZXR0YSxcbiAgVGFyZ2V0TGFuZ3VhZ2UsXG4gIFRyYW5zbGF0aW9uLFxuICBlbmZvcmNlc1N0cmljdE1vZGUsXG4gIG1hcmtEb3duVG9YbWxEb2MsXG4gIEFwaUxvY2F0aW9uLFxufSBmcm9tICdqc2lpLXJvc2V0dGEnO1xuaW1wb3J0ICogYXMgeG1sYnVpbGRlciBmcm9tICd4bWxidWlsZGVyJztcblxuaW1wb3J0IHsgSU5DT01QTEVURV9ESVNDTEFJTUVSX05PTkNPTVBJTElORyB9IGZyb20gJy4uJztcbmltcG9ydCB7IHJlbmRlclN1bW1hcnkgfSBmcm9tICcuLi9fdXRpbHMnO1xuaW1wb3J0IHsgRG90TmV0TmFtZVV0aWxzIH0gZnJvbSAnLi9uYW1ldXRpbHMnO1xuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgSnNpaSBhdHRyaWJ1dGVzIGFuZCBjYWxscyBmb3IgdGhlIC5ORVQgcnVudGltZVxuICpcbiAqIFVzZXMgdGhlIHNhbWUgaW5zdGFuY2Ugb2YgQ29kZU1ha2VyIGFzIHRoZSByZXN0IG9mIHRoZSBjb2RlXG4gKi9cbmV4cG9ydCBjbGFzcyBEb3ROZXREb2NHZW5lcmF0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IGNvZGU6IENvZGVNYWtlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1ldXRpbHM6IERvdE5ldE5hbWVVdGlscyA9IG5ldyBEb3ROZXROYW1lVXRpbHMoKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm9zZXR0YTogUm9zZXR0YSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFzc2VtYmx5OiBzcGVjLkFzc2VtYmx5LFxuICApIHtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFsbCBkb2N1bWVudGF0aW9uIGRlcGVuZGluZyBvbiB3aGF0IGlzIGF2YWlsYWJsZSBpbiB0aGUganNpaSBtb2RlbFxuICAgKlxuICAgKiBVc2VkIGJ5IGFsbCBraW5kIG9mIG1lbWJlcnMgKyBjbGFzc2VzLCBpbnRlcmZhY2VzLCBlbnVtc1xuICAgKiBPcmRlciBzaG91bGQgYmVcbiAgICogU3VtbWFyeVxuICAgKiBQYXJhbVxuICAgKiBSZXR1cm5zXG4gICAqIFJlbWFya3MgKGluY2x1ZGVzIGV4YW1wbGVzLCBsaW5rcywgZGVwcmVjYXRlZClcbiAgICovXG4gIHB1YmxpYyBlbWl0RG9jcyhvYmo6IHNwZWMuRG9jdW1lbnRhYmxlLCBhcGlMb2NhdGlvbjogQXBpTG9jYXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBkb2NzID0gb2JqLmRvY3M7XG5cbiAgICAvLyBUaGUgZG9jcyBtYXkgYmUgdW5kZWZpbmVkIGF0IHRoZSBtZXRob2QgbGV2ZWwgYnV0IG5vdCB0aGUgcGFyYW1ldGVycyBsZXZlbFxuICAgIHRoaXMuZW1pdFhtbERvYygnc3VtbWFyeScsIHJlbmRlclN1bW1hcnkob2JqLmRvY3MpKTtcblxuICAgIC8vIEhhbmRsaW5nIHBhcmFtZXRlcnMgb25seSBpZiB0aGUgb2JqIGlzIGEgbWV0aG9kXG4gICAgY29uc3Qgb2JqTWV0aG9kID0gb2JqIGFzIHNwZWMuTWV0aG9kO1xuICAgIGlmIChvYmpNZXRob2QucGFyYW1ldGVycykge1xuICAgICAgb2JqTWV0aG9kLnBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW0pID0+IHtcbiAgICAgICAgLy8gUmVtb3ZlIGFueSBzbHVnIGBAYCBmcm9tIHRoZSBwYXJhbWV0ZXIgbmFtZSAtIGl0J3Mgbm90IHN1cHBvc2VkIHRvIHNob3cgdXAgaGVyZS5cbiAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gdGhpcy5uYW1ldXRpbHNcbiAgICAgICAgICAuY29udmVydFBhcmFtZXRlck5hbWUocGFyYW0ubmFtZSlcbiAgICAgICAgICAucmVwbGFjZSgvXkAvLCAnJyk7XG4gICAgICAgIHRoaXMuZW1pdFhtbERvYygncGFyYW0nLCBwYXJhbS5kb2NzPy5zdW1tYXJ5ID8/ICcnLCB7XG4gICAgICAgICAgYXR0cmlidXRlczogeyBuYW1lOiBwYXJhbU5hbWUgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBdCB0aGlzIHBkb2NmeCBuYW1lc3BhY2Vkb2NkIGEgdmFsaWQgaW5zdGFuY2Ugb2YgZG9jc1xuICAgIGlmICghZG9jcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkb2NzLnJldHVybnMpIHtcbiAgICAgIHRoaXMuZW1pdFhtbERvYygncmV0dXJucycsIGRvY3MucmV0dXJucyk7XG4gICAgfVxuXG4gICAgLy8gUmVtYXJrcyBkb2VzIG5vdCB1c2UgZW1pdFhtbERvYygpIGJlY2F1c2UgdGhlIHJlbWFya3MgY2FuIGNvbnRhaW4gY29kZSBibG9ja3NcbiAgICAvLyB3aGljaCBhcmUgZmVuY2VkIHdpdGggPGNvZGU+IHRhZ3MsIHdoaWNoIHdvdWxkIGJlIGVzY2FwZWQgdG9cbiAgICAvLyAmbHQ7Y29kZSZndDsgaWYgd2UgdXNlZCB0aGUgeG1sIGJ1aWxkZXIuXG4gICAgY29uc3QgcmVtYXJrcyA9IHRoaXMucmVuZGVyUmVtYXJrcyhkb2NzLCBhcGlMb2NhdGlvbik7XG4gICAgaWYgKHJlbWFya3MubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJy8vLyA8cmVtYXJrcz4nKTtcbiAgICAgIHJlbWFya3MuZm9yRWFjaCgocikgPT4gdGhpcy5jb2RlLmxpbmUoYC8vLyAke3J9YC50cmltUmlnaHQoKSkpO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJy8vLyA8L3JlbWFya3M+Jyk7XG4gICAgfVxuXG4gICAgaWYgKGRvY3MuZXhhbXBsZSkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJy8vLyA8ZXhhbXBsZT4nKTtcbiAgICAgIHRoaXMuZW1pdFhtbERvYygnY29kZScsIHRoaXMuY29udmVydEV4YW1wbGUoZG9jcy5leGFtcGxlLCBhcGlMb2NhdGlvbikpO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJy8vLyA8L2V4YW1wbGU+Jyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVtaXRNYXJrZG93bkFzUmVtYXJrcyhcbiAgICBtYXJrZG93bjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGFwaUxvY2F0aW9uOiBBcGlMb2NhdGlvbixcbiAgKSB7XG4gICAgaWYgKCFtYXJrZG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSBtYXJrRG93blRvWG1sRG9jKFxuICAgICAgdGhpcy5jb252ZXJ0U2FtcGxlc0luTWFya2Rvd24obWFya2Rvd24sIGFwaUxvY2F0aW9uKSxcbiAgICApO1xuICAgIGNvbnN0IGxpbmVzID0gdHJhbnNsYXRlZC5zcGxpdCgnXFxuJyk7XG5cbiAgICB0aGlzLmNvZGUubGluZSgnLy8vIDxyZW1hcmtzPicpO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYC8vLyAke2xpbmV9YC50cmltUmlnaHQoKSk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5saW5lKCcvLy8gPC9yZW1hcmtzPicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpbmVzIHRoYXQgc2hvdWxkIGdvIGludG8gdGhlIDxyZW1hcmtzPiBzZWN0aW9uXG4gICAqL1xuICBwcml2YXRlIHJlbmRlclJlbWFya3MoZG9jczogc3BlYy5Eb2NzLCBhcGlMb2NhdGlvbjogQXBpTG9jYXRpb24pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcmV0OiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKGRvY3MucmVtYXJrcykge1xuICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IG1hcmtEb3duVG9YbWxEb2MoXG4gICAgICAgIHRoaXMuY29udmVydFNhbXBsZXNJbk1hcmtkb3duKGRvY3MucmVtYXJrcywgYXBpTG9jYXRpb24pLFxuICAgICAgKTtcbiAgICAgIHJldC5wdXNoKC4uLnRyYW5zbGF0ZWQuc3BsaXQoJ1xcbicpKTtcbiAgICAgIHJldC5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICAvLyBBbGwgdGhlIFwidGFnc1wiIG5lZWQgdG8gYmUgcmVuZGVyZWQgd2l0aCBlbXB5dCBsaW5lcyBiZXR3ZWVuIHRoZW0gb3IgdGhleSdsbCBiZSB3b3JkIHdyYXBwZWQuXG5cbiAgICBpZiAoZG9jcy5kZWZhdWx0KSB7XG4gICAgICBlbWl0RG9jQXR0cmlidXRlKCdkZWZhdWx0JywgZG9jcy5kZWZhdWx0KTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc3RhYmlsaXR5ICYmIHNob3VsZE1lbnRpb25TdGFiaWxpdHkoZG9jcy5zdGFiaWxpdHkpKSB7XG4gICAgICBlbWl0RG9jQXR0cmlidXRlKFxuICAgICAgICAnc3RhYmlsaXR5JyxcbiAgICAgICAgdGhpcy5uYW1ldXRpbHMuY2FwaXRhbGl6ZVdvcmQoZG9jcy5zdGFiaWxpdHkpLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc2VlKSB7XG4gICAgICBlbWl0RG9jQXR0cmlidXRlKCdzZWUnLCBkb2NzLnNlZSk7XG4gICAgfVxuICAgIGlmIChkb2NzLnN1YmNsYXNzYWJsZSkge1xuICAgICAgZW1pdERvY0F0dHJpYnV0ZSgnc3ViY2xhc3NhYmxlJywgJycpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhkb2NzLmN1c3RvbSA/PyB7fSkpIHtcbiAgICAgIGNvbnN0IGV4dHJhU3BhY2UgPSBrID09PSAnbGluaycgPyAnICcgOiAnJzsgLy8gRXh0cmEgc3BhY2UgZm9yICdAbGluaycgdG8ga2VlcCB1bml0IHRlc3RzIGhhcHB5XG4gICAgICBlbWl0RG9jQXR0cmlidXRlKGssIHYgKyBleHRyYVNwYWNlKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgZW1wdHkgbGluZXNcbiAgICB3aGlsZSAocmV0Lmxlbmd0aCA+IDAgJiYgcmV0WzBdID09PSAnJykge1xuICAgICAgcmV0LnNoaWZ0KCk7XG4gICAgfVxuICAgIHdoaWxlIChyZXQubGVuZ3RoID4gMCAmJiByZXRbcmV0Lmxlbmd0aCAtIDFdID09PSAnJykge1xuICAgICAgcmV0LnBvcCgpO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG5cbiAgICBmdW5jdGlvbiBlbWl0RG9jQXR0cmlidXRlKG5hbWU6IHN0cmluZywgY29udGVudHM6IHN0cmluZykge1xuICAgICAgY29uc3QgbHMgPSBjb250ZW50cy5zcGxpdCgnXFxuJyk7XG4gICAgICByZXQucHVzaChgPHN0cm9uZz4ke3VjRmlyc3QobmFtZSl9PC9zdHJvbmc+OiAke2xzWzBdfWApO1xuICAgICAgcmV0LnB1c2goLi4ubHMuc2xpY2UoMSkpO1xuICAgICAgcmV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEV4YW1wbGUoZXhhbXBsZTogc3RyaW5nLCBhcGlMb2NhdGlvbjogQXBpTG9jYXRpb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSB0aGlzLnJvc2V0dGEudHJhbnNsYXRlRXhhbXBsZShcbiAgICAgIGFwaUxvY2F0aW9uLFxuICAgICAgZXhhbXBsZSxcbiAgICAgIFRhcmdldExhbmd1YWdlLkNTSEFSUCxcbiAgICAgIGVuZm9yY2VzU3RyaWN0TW9kZSh0aGlzLmFzc2VtYmx5KSxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnByZWZpeERpc2NsYWltZXIodHJhbnNsYXRlZCk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRTYW1wbGVzSW5NYXJrZG93bihtYXJrZG93bjogc3RyaW5nLCBhcGk6IEFwaUxvY2F0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yb3NldHRhLnRyYW5zbGF0ZVNuaXBwZXRzSW5NYXJrZG93bihcbiAgICAgIGFwaSxcbiAgICAgIG1hcmtkb3duLFxuICAgICAgVGFyZ2V0TGFuZ3VhZ2UuQ1NIQVJQLFxuICAgICAgZW5mb3JjZXNTdHJpY3RNb2RlKHRoaXMuYXNzZW1ibHkpLFxuICAgICAgKHRyYW5zKSA9PiAoe1xuICAgICAgICBsYW5ndWFnZTogdHJhbnMubGFuZ3VhZ2UsXG4gICAgICAgIHNvdXJjZTogdGhpcy5wcmVmaXhEaXNjbGFpbWVyKHRyYW5zKSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHByZWZpeERpc2NsYWltZXIodHJhbnNsYXRlZDogVHJhbnNsYXRpb24pIHtcbiAgICBpZiAoIXRyYW5zbGF0ZWQuZGlkQ29tcGlsZSAmJiBJTkNPTVBMRVRFX0RJU0NMQUlNRVJfTk9OQ09NUElMSU5HKSB7XG4gICAgICByZXR1cm4gYC8vICR7SU5DT01QTEVURV9ESVNDTEFJTUVSX05PTkNPTVBJTElOR31cXG4ke3RyYW5zbGF0ZWQuc291cmNlfWA7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2xhdGVkLnNvdXJjZTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFhtbERvYyhcbiAgICB0YWc6IHN0cmluZyxcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgeyBhdHRyaWJ1dGVzID0ge30gfTogeyBhdHRyaWJ1dGVzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0gfSA9IHt9LFxuICApOiB2b2lkIHtcbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB4bWwgPSB4bWxidWlsZGVyLmNyZWF0ZSh0YWcsIHsgaGVhZGxlc3M6IHRydWUgfSkudGV4dChjb250ZW50KTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpIHtcbiAgICAgIHhtbC5hdHQobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCB4bWxzdHJpbmcgPSB4bWwuZW5kKHsgYWxsb3dFbXB0eTogdHJ1ZSwgcHJldHR5OiBmYWxzZSB9KTtcbiAgICBjb25zdCB0cmltTGVmdCA9IHRhZyAhPT0gJ2NvZGUnO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiB4bWxzdHJpbmdcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5tYXAoKHgpID0+ICh0cmltTGVmdCA/IHgudHJpbSgpIDogeC50cmltUmlnaHQoKSkpKSB7XG4gICAgICB0aGlzLmNvZGUubGluZShgLy8vICR7bGluZX1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBVcHBlcmNhc2UgdGhlIGZpcnN0IGxldHRlclxuICovXG5mdW5jdGlvbiB1Y0ZpcnN0KHg6IHN0cmluZykge1xuICByZXR1cm4geC5zdWJzdHIoMCwgMSkudG9VcHBlckNhc2UoKSArIHguc3Vic3RyKDEpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRNZW50aW9uU3RhYmlsaXR5KHM6IHNwZWMuU3RhYmlsaXR5KSB7XG4gIC8vIERvbid0IHJlbmRlciBcInN0YWJsZVwiIG9yIFwiZXh0ZXJuYWxcIiwgdGhvc2UgYXJlIGJvdGggc3RhYmxlIGJ5IGltcGxpY2F0aW9uXG4gIHJldHVybiBzID09PSBzcGVjLlN0YWJpbGl0eS5EZXByZWNhdGVkIHx8IHMgPT09IHNwZWMuU3RhYmlsaXR5LkV4cGVyaW1lbnRhbDtcbn1cbiJdfQ==
|
|
@@ -102,7 +102,10 @@ class DotNetGenerator extends generator_1.Generator {
|
|
|
102
102
|
var _a;
|
|
103
103
|
const submodule = (_a = this.assembly.submodules) === null || _a === void 0 ? void 0 : _a[jsiiNs];
|
|
104
104
|
if (submodule) {
|
|
105
|
-
const dotnetNs = this.typeresolver.resolveNamespace(this.assembly, this.assembly.name,
|
|
105
|
+
const dotnetNs = this.typeresolver.resolveNamespace(this.assembly, this.assembly.name,
|
|
106
|
+
// Strip the `${assmName}.` prefix here, as the "assembly-relative" NS
|
|
107
|
+
// is expected by `this.typeResolver.resovleNamespace`.
|
|
108
|
+
jsiiNs.substr(this.assembly.name.length + 1));
|
|
106
109
|
this.emitNamespaceDocs(dotnetNs, jsiiNs, submodule);
|
|
107
110
|
}
|
|
108
111
|
}
|
|
@@ -877,4 +880,4 @@ class DotNetGenerator extends generator_1.Generator {
|
|
|
877
880
|
}
|
|
878
881
|
}
|
|
879
882
|
exports.DotNetGenerator = DotNetGenerator;
|
|
880
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90bmV0Z2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZG90bmV0Z2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFtQztBQUNuQywrQkFBK0I7QUFDL0IsK0JBQStCO0FBRy9CLDZCQUE2QjtBQUU3QiwrQ0FBc0Q7QUFFdEQsNkRBQTBEO0FBQzFELHFFQUFrRTtBQUNsRSw2REFBMEQ7QUFDMUQsbURBQWdEO0FBQ2hELDJDQUE4QztBQUU5Qzs7R0FFRztBQUNILE1BQWEsZUFBZ0IsU0FBUSxxQkFBUztJQVk1QyxZQUNtQixnQ0FBMEMsRUFDMUMsT0FBZ0I7UUFFakMsS0FBSyxFQUFFLENBQUM7UUFIUyxxQ0FBZ0MsR0FBaEMsZ0NBQWdDLENBQVU7UUFDMUMsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQWJuQywyRUFBMkU7UUFDbkUsdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBSWxCLGNBQVMsR0FBb0IsSUFBSSwyQkFBZSxFQUFFLENBQUM7UUFZbEUsb0dBQW9HO1FBQ3BHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsSUFBSTtZQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJLENBQ2YsV0FBbUIsRUFDbkIsUUFBMEI7UUFFMUIsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRLENBQUMsV0FBb0I7UUFDbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHVDQUFrQixDQUN4QyxJQUFJLENBQUMsUUFBUSxFQUNiLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxF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Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osMkZBQTJGLENBQzVGLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFwcENELDBDQW9wQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzcGVjIGZyb20gJ0Bqc2lpL3NwZWMnO1xuaW1wb3J0ICogYXMgY2xvbmUgZnJvbSAnY2xvbmUnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0IHsgUm9zZXR0YSB9IGZyb20gJ2pzaWktcm9zZXR0YSc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBHZW5lcmF0b3IsIExlZ2FsZXNlIH0gZnJvbSAnLi4vLi4vZ2VuZXJhdG9yJztcbmltcG9ydCB7IE1ldGhvZERlZmluaXRpb24sIFByb3BlcnR5RGVmaW5pdGlvbiB9IGZyb20gJy4uL191dGlscyc7XG5pbXBvcnQgeyBEb3ROZXREb2NHZW5lcmF0b3IgfSBmcm9tICcuL2RvdG5ldGRvY2dlbmVyYXRvcic7XG5pbXBvcnQgeyBEb3ROZXRSdW50aW1lR2VuZXJhdG9yIH0gZnJvbSAnLi9kb3RuZXRydW50aW1lZ2VuZXJhdG9yJztcbmltcG9ydCB7IERvdE5ldFR5cGVSZXNvbHZlciB9IGZyb20gJy4vZG90bmV0dHlwZXJlc29sdmVyJztcbmltcG9ydCB7IEZpbGVHZW5lcmF0b3IgfSBmcm9tICcuL2ZpbGVnZW5lcmF0b3InO1xuaW1wb3J0IHsgRG90TmV0TmFtZVV0aWxzIH0gZnJvbSAnLi9uYW1ldXRpbHMnO1xuXG4vKipcbiAqIENPREUgR0VORVJBVE9SIFYyXG4gKi9cbmV4cG9ydCBjbGFzcyBEb3ROZXRHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3Ige1xuICAvLyBGbGFncyB0aGF0IHRyYWNrcyBpZiB3ZSBoYXZlIGFscmVhZHkgd3JvdGUgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgY2xhc3NcbiAgcHJpdmF0ZSBmaXJzdE1lbWJlcldyaXR0ZW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHR5cGVyZXNvbHZlciE6IERvdE5ldFR5cGVSZXNvbHZlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IG5hbWV1dGlsczogRG90TmV0TmFtZVV0aWxzID0gbmV3IERvdE5ldE5hbWVVdGlscygpO1xuXG4gIHByaXZhdGUgZG90bmV0UnVudGltZUdlbmVyYXRvciE6IERvdE5ldFJ1bnRpbWVHZW5lcmF0b3I7XG5cbiAgcHJpdmF0ZSBkb3RuZXREb2NHZW5lcmF0b3IhOiBEb3ROZXREb2NHZW5lcmF0b3I7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXNzZW1ibGllc0N1cnJlbnRseUJlaW5nQ29tcGlsZWQ6IHN0cmluZ1tdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm9zZXR0YTogUm9zZXR0YSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIE92ZXJyaWRlIHRoZSBvcGVuQmxvY2sgdG8gZ2V0IGEgY29ycmVjdCBDIyBsb29raW5nIGNvZGUgYmxvY2sgd2l0aCB0aGUgY3VybHkgYnJhY2UgYWZ0ZXIgdGhlIGxpbmVcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgIHRoaXMubGluZSh0ZXh0KTtcbiAgICAgIHRoaXMub3BlbigneycpO1xuICAgIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9hZChcbiAgICBwYWNrYWdlUm9vdDogc3RyaW5nLFxuICAgIGFzc2VtYmx5OiByZWZsZWN0LkFzc2VtYmx5LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBzdXBlci5sb2FkKHBhY2thZ2VSb290LCBhc3NlbWJseSk7XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0aGUgZ2VuZXJhdG9yIChpbi1tZW1vcnkpLlxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlKGZpbmdlcnByaW50OiBib29sZWFuKSB7XG4gICAgdGhpcy50eXBlcmVzb2x2ZXIgPSBuZXcgRG90TmV0VHlwZVJlc29sdmVyKFxuICAgICAgdGhpcy5hc3NlbWJseSxcbiAgICAgIChmcW46IHN0cmluZykgPT4gdGhpcy5maW5kTW9kdWxlKGZxbiksXG4gICAgICAoZnFuOiBzdHJpbmcpID0+IHRoaXMuZmluZFR5cGUoZnFuKSxcbiAgICAgIHRoaXMuYXNzZW1ibGllc0N1cnJlbnRseUJlaW5nQ29tcGlsZWQsXG4gICAgKTtcblxuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvciA9IG5ldyBEb3ROZXRSdW50aW1lR2VuZXJhdG9yKFxuICAgICAgdGhpcy5jb2RlLFxuICAgICAgdGhpcy50eXBlcmVzb2x2ZXIsXG4gICAgKTtcbiAgICB0aGlzLmRvdG5ldERvY0dlbmVyYXRvciA9IG5ldyBEb3ROZXREb2NHZW5lcmF0b3IoXG4gICAgICB0aGlzLmNvZGUsXG4gICAgICB0aGlzLnJvc2V0dGEsXG4gICAgICB0aGlzLmFzc2VtYmx5LFxuICAgICk7XG5cbiAgICB0aGlzLmVtaXRBc3NlbWJseURvY3MoKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gcmVzb2x2ZSB0aGUgZGVwZW5kZW5jeSB0cmVlXG4gICAgdGhpcy50eXBlcmVzb2x2ZXIucmVzb2x2ZU5hbWVzcGFjZXNEZXBlbmRlbmNpZXMoKTtcbiAgICBzdXBlci5nZW5lcmF0ZShmaW5nZXJwcmludCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2F2ZShcbiAgICBvdXRkaXI6IHN0cmluZyxcbiAgICB0YXJiYWxsOiBzdHJpbmcsXG4gICAgeyBsaWNlbnNlLCBub3RpY2UgfTogTGVnYWxlc2UsXG4gICk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAvLyBHZW5lcmF0aW5nIHRoZSBjc3Byb2ogYW5kIEFzc2VtYmx5SW5mby5jcyBmaWxlc1xuICAgIGNvbnN0IHRhcmJhbGxGaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUodGFyYmFsbCk7XG4gICAgY29uc3QgZmlsZWdlbiA9IG5ldyBGaWxlR2VuZXJhdG9yKFxuICAgICAgdGhpcy5hc3NlbWJseSxcbiAgICAgIHRhcmJhbGxGaWxlTmFtZSxcbiAgICAgIHRoaXMuY29kZSxcbiAgICApO1xuICAgIGZpbGVnZW4uZ2VuZXJhdGVBc3NlbWJseUluZm9GaWxlKCk7XG4gICAgZmlsZWdlbi5nZW5lcmF0ZVByb2plY3RGaWxlKHRoaXMudHlwZXJlc29sdmVyLm5hbWVzcGFjZURlcGVuZGVuY2llcyk7XG4gICAgLy8gQ2FsbGluZyBzdXBlci5zYXZlKCkgZHVtcHMgdGhlIHRhcmJhbGwgaW4gdGhlIGZvcm1hdCBuYW1lQHZlcnNpb24uanNpaS50Z3ouXG4gICAgLy8gVGhpcyBpcyBub3QgaW4gc3luYyB3aXRoIHRoZSBPbGQgLk5FVCBnZW5lcmF0b3Igd2hlcmUgdGhlIG5hbWUgaXMgc2NvcGUtbmFtZS12ZXJzaW9uLnRnei5cbiAgICAvLyBIZW5jZSB3ZSBhcmUgc2F2aW5nIHRoZSBmaWxlcyBvdXJzZWx2ZXMgaGVyZTpcbiAgICBjb25zdCBhc3NtID0gdGhpcy5hc3NlbWJseTtcbiAgICBjb25zdCBwYWNrYWdlSWQ6IHN0cmluZyA9IGFzc20udGFyZ2V0cyEuZG90bmV0IS5wYWNrYWdlSWQ7XG4gICAgaWYgKCFwYWNrYWdlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBtb2R1bGUgJHthc3NtLm5hbWV9IGRvZXMgbm90IGhhdmUgYSBkb3RuZXQucGFja2FnZUlkIHNldHRpbmdgLFxuICAgICAgKTtcbiAgICB9XG4gICAgYXdhaXQgZnMubWtkaXJwKHBhdGguam9pbihvdXRkaXIsIHBhY2thZ2VJZCkpO1xuICAgIGF3YWl0IGZzLmNvcHlGaWxlKHRhcmJhbGwsIHBhdGguam9pbihvdXRkaXIsIHBhY2thZ2VJZCwgdGFyYmFsbEZpbGVOYW1lKSk7XG5cbiAgICAvLyBDcmVhdGUgYW4gYW5jaG9yIGZpbGUgZm9yIHRoZSBjdXJyZW50IG1vZGVsXG4gICAgdGhpcy5nZW5lcmF0ZURlcGVuZGVuY3lBbmNob3JGaWxlKCk7XG5cbiAgICBpZiAobGljZW5zZSkge1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihvdXRkaXIsIHBhY2thZ2VJZCwgJ0xJQ0VOU0UnKSwgbGljZW5zZSwge1xuICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChub3RpY2UpIHtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4ob3V0ZGlyLCBwYWNrYWdlSWQsICdOT1RJQ0UnKSwgbm90aWNlLCB7XG4gICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTYXZpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLlxuICAgIHJldHVybiB0aGlzLmNvZGUuc2F2ZShvdXRkaXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyB0aGUgYW5jaG9yIGZpbGVcbiAgICovXG4gIHByb3RlY3RlZCBnZW5lcmF0ZURlcGVuZGVuY3lBbmNob3JGaWxlKCkge1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IGAke1xuICAgICAgdGhpcy5hc3NlbWJseS50YXJnZXRzIS5kb3RuZXQhLm5hbWVzcGFjZVxuICAgIH0uSW50ZXJuYWwuRGVwZW5kZW5jeVJlc29sdXRpb25gO1xuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZCgnQW5jaG9yJywgbmFtZXNwYWNlLCBmYWxzZSwgZmFsc2UpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ3B1YmxpYyBzZWFsZWQgY2xhc3MgQW5jaG9yJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jaygncHVibGljIEFuY2hvcigpJyk7XG4gICAgdGhpcy50eXBlcmVzb2x2ZXIubmFtZXNwYWNlRGVwZW5kZW5jaWVzLmZvckVhY2goKHZhbHVlKSA9PlxuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGBuZXcgJHt2YWx1ZS5uYW1lc3BhY2V9LkludGVybmFsLkRlcGVuZGVuY3lSZXNvbHV0aW9uLkFuY2hvcigpO2AsXG4gICAgICApLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY2xvc2VGaWxlSWZOZWVkZWQoJ0FuY2hvcicsIG5hbWVzcGFjZSwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdCB1c2VkIGFzIHdlIG92ZXJyaWRlIHRoZSBzYXZlKCkgbWV0aG9kXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0QXNzZW1ibHlPdXRwdXREaXIobW9kOiBzcGVjLkFzc2VtYmx5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1ldXRpbHMuY29udmVydFBhY2thZ2VOYW1lKG1vZC5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYW1lc3BhY2VzIGFyZSBoYW5kbGVkIGltcGxpY2l0bHkgYnkgb3BlbkZpbGVJZk5lZWRlZCgpLlxuICAgKlxuICAgKiBEbyBnZW5lcmF0ZSBkb2NzIGlmIHRoaXMgaXMgZm9yIGEgc3VibW9kdWxlIHRob3VnaC5cbiAgICovXG4gIHByb3RlY3RlZCBvbkJlZ2luTmFtZXNwYWNlKGpzaWlOczogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3VibW9kdWxlID0gdGhpcy5hc3NlbWJseS5zdWJtb2R1bGVzPy5banNpaU5zXTtcbiAgICBpZiAoc3VibW9kdWxlKSB7XG4gICAgICBjb25zdCBkb3RuZXROcyA9IHRoaXMudHlwZXJlc29sdmVyLnJlc29sdmVOYW1lc3BhY2UoXG4gICAgICAgIHRoaXMuYXNzZW1ibHksXG4gICAgICAgIHRoaXMuYXNzZW1ibHkubmFtZSxcbiAgICAgICAganNpaU5zLFxuICAgICAgKTtcbiAgICAgIHRoaXMuZW1pdE5hbWVzcGFjZURvY3MoZG90bmV0TnMsIGpzaWlOcywgc3VibW9kdWxlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmROYW1lc3BhY2UoX25zOiBzdHJpbmcpIHtcbiAgICAvKiBub29wICovXG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkludGVyZmFjZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIGNvbnN0IGltcGxlbWVudGF0aW9ucyA9IHRoaXMudHlwZXJlc29sdmVyLnJlc29sdmVJbXBsZW1lbnRlZEludGVyZmFjZXMoaWZjKTtcbiAgICBjb25zdCBpbnRlcmZhY2VOYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydEludGVyZmFjZU5hbWUoaWZjKTtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSB0aGlzLm5hbWVzcGFjZUZvcih0aGlzLmFzc2VtYmx5LCBpZmMpO1xuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZChpbnRlcmZhY2VOYW1lLCBuYW1lc3BhY2UsIHRoaXMuaXNOZXN0ZWQoaWZjKSk7XG5cbiAgICB0aGlzLmRvdG5ldERvY0dlbmVyYXRvci5lbWl0RG9jcyhpZmMsIHsgYXBpOiAndHlwZScsIGZxbjogaWZjLmZxbiB9KTtcbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdEF0dHJpYnV0ZXNGb3JJbnRlcmZhY2UoaWZjKTtcblxuICAgIGlmIChpbXBsZW1lbnRhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgICAgYHB1YmxpYyBpbnRlcmZhY2UgJHtpbnRlcmZhY2VOYW1lfSA6ICR7aW1wbGVtZW50YXRpb25zLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYHB1YmxpYyBpbnRlcmZhY2UgJHtpbnRlcmZhY2VOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLmZsYWdGaXJzdE1lbWJlcldyaXR0ZW4oZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kSW50ZXJmYWNlKGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlKSB7XG4gICAgLy8gZW1pdCBpbnRlcmZhY2UgcHJveHkgY2xhc3NcbiAgICB0aGlzLmVtaXRJbnRlcmZhY2VQcm94eShpZmMpO1xuXG4gICAgY29uc3QgaW50ZXJmYWNlTmFtZSA9IHRoaXMubmFtZXV0aWxzLmNvbnZlcnRJbnRlcmZhY2VOYW1lKGlmYyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSB0aGlzLm5hbWVzcGFjZUZvcih0aGlzLmFzc2VtYmx5LCBpZmMpO1xuICAgIHRoaXMuY2xvc2VGaWxlSWZOZWVkZWQoaW50ZXJmYWNlTmFtZSwgbmFtZXNwYWNlLCB0aGlzLmlzTmVzdGVkKGlmYykpO1xuXG4gICAgLy8gZW1pdCBpbXBsZW1lbnRhdGlvbiBjbGFzc1xuICAgIC8vIFRPRE86IElmIGRhdGF0eXBlIHRoZW4gd2UgbWF5IG5vdCBuZWVkIHRoZSBpbnRlcmZhY2UgcHJveHkgdG8gYmUgY3JlYXRlZCwgV2UgY291bGQgZG8gd2l0aCBqdXN0IHRoZSBpbnRlcmZhY2UgaW1wbD9cbiAgICBpZiAoaWZjLmRhdGF0eXBlKSB7XG4gICAgICB0aGlzLmVtaXRJbnRlcmZhY2VEYXRhVHlwZShpZmMpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZU1ldGhvZChpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKG1ldGhvZCwge1xuICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgIGZxbjogaWZjLmZxbixcbiAgICAgIG1lbWJlck5hbWU6IG1ldGhvZC5uYW1lLFxuICAgIH0pO1xuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0QXR0cmlidXRlc0Zvck1ldGhvZChpZmMsIG1ldGhvZCk7XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IG1ldGhvZC5yZXR1cm5zXG4gICAgICA/IHRoaXMudHlwZXJlc29sdmVyLnRvRG90TmV0VHlwZShtZXRob2QucmV0dXJucy50eXBlKVxuICAgICAgOiAndm9pZCc7XG4gICAgY29uc3QgbnVsbGFibGUgPSBtZXRob2QucmV0dXJucz8ub3B0aW9uYWwgPyAnPycgOiAnJztcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGAke3JldHVyblR5cGV9JHtudWxsYWJsZX0gJHt0aGlzLm5hbWV1dGlscy5jb252ZXJ0TWV0aG9kTmFtZShcbiAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICApfSgke3RoaXMucmVuZGVyTWV0aG9kUGFyYW1ldGVycyhtZXRob2QpfSk7YCxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW50ZXJmYWNlTWV0aG9kT3ZlcmxvYWQoXG4gICAgaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsXG4gICAgb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRoaXMub25JbnRlcmZhY2VNZXRob2QoaWZjLCBvdmVybG9hZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VQcm9wZXJ0eShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIGlmICghcHJvcC5hYnN0cmFjdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcmZhY2UgcHJvcGVydGllcyBtdXN0IGJlIGFic3RyYWN0OiAke3Byb3AubmFtZX1gKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcC5wcm90ZWN0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFByb3RlY3RlZCBwcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZCBvbiBpbnRlcmZhY2VzOiAke3Byb3AubmFtZX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcC5zdGF0aWMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFByb3BlcnR5ICR7aWZjLm5hbWV9LiR7cHJvcC5uYW1lfSBpcyBtYXJrZWQgYXMgc3RhdGljLCBidXQgaW50ZXJmYWNlcyBtdXN0IG5vdCBjb250YWluIHN0YXRpYyBtZW1iZXJzLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdE5ld0xpbmVJZk5lY2Vzc2FyeSgpO1xuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKHByb3AsIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IGlmYy5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiBwcm9wLm5hbWUsXG4gICAgfSk7XG4gICAgdGhpcy5kb3RuZXRSdW50aW1lR2VuZXJhdG9yLmVtaXRBdHRyaWJ1dGVzRm9yUHJvcGVydHkocHJvcCk7XG5cbiAgICBjb25zdCBwcm9wVHlwZSA9IHRoaXMudHlwZXJlc29sdmVyLnRvRG90TmV0VHlwZShwcm9wLnR5cGUpO1xuICAgIGNvbnN0IHByb3BOYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydFByb3BlcnR5TmFtZShwcm9wLm5hbWUpO1xuXG4gICAgaWYgKHByb3Aub3B0aW9uYWwpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdbQW1hem9uLkpTSUkuUnVudGltZS5EZXB1dHkuSnNpaU9wdGlvbmFsXScpO1xuICAgIH1cblxuICAgIC8vIFNwZWNpZnlpbmcgdGhhdCBhIHR5cGUgaXMgbnVsbGFibGUgaXMgb25seSByZXF1aXJlZCBmb3IgcHJpbWl0aXZlIHZhbHVlIHR5cGVzXG4gICAgY29uc3QgaXNPcHRpb25hbCA9IHByb3Aub3B0aW9uYWwgPyAnPycgOiAnJztcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGAke3Byb3BUeXBlfSR7aXNPcHRpb25hbH0gJHtwcm9wTmFtZX1gKTtcblxuICAgIGlmIChwcm9wLm9wdGlvbmFsKSB7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCdnZXQnKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdyZXR1cm4gbnVsbDsnKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICBpZiAoIXByb3AuaW1tdXRhYmxlKSB7XG4gICAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ3NldCcpO1xuICAgICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgICBgdGhyb3cgbmV3IFN5c3RlbS5Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oXCInc2V0JyBmb3IgJyR7cHJvcE5hbWV9JyBpcyBub3QgaW1wbGVtZW50ZWRcIik7YCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJ2dldDsnKTtcbiAgICAgIGlmICghcHJvcC5pbW11dGFibGUpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoJ3NldDsnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuZmxhZ0ZpcnN0TWVtYmVyV3JpdHRlbih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luQ2xhc3MoY2xzOiBzcGVjLkNsYXNzVHlwZSwgYWJzdHJhY3Q6IGJvb2xlYW4pIHtcbiAgICBsZXQgYmFzZVR5cGVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSB0aGlzLm5hbWVzcGFjZUZvcih0aGlzLmFzc2VtYmx5LCBjbHMpO1xuXG4gICAgLy8gQSBjbGFzcyBjYW4gZGVyaXZlIGZyb20gb25seSBvbmUgYmFzZSBjbGFzc1xuICAgIC8vIEJ1dCBjYW4gaW1wbGVtZW50IG11bHRpcGxlIGludGVyZmFjZXNcbiAgICBpZiAoIWNscy5iYXNlKSB7XG4gICAgICBiYXNlVHlwZU5hbWVzLnB1c2goJ0RlcHV0eUJhc2UnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2xhc3NCYXNlID0gdGhpcy50eXBlcmVzb2x2ZXIudG9Eb3ROZXRUeXBlKHsgZnFuOiBjbHMuYmFzZSB9KTtcbiAgICAgIGJhc2VUeXBlTmFtZXMucHVzaChjbGFzc0Jhc2UpO1xuICAgIH1cblxuICAgIGlmIChjbHMuaW50ZXJmYWNlcyAmJiBjbHMuaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbnMgPVxuICAgICAgICB0aGlzLnR5cGVyZXNvbHZlci5yZXNvbHZlSW1wbGVtZW50ZWRJbnRlcmZhY2VzKGNscyk7XG4gICAgICBiYXNlVHlwZU5hbWVzID0gYmFzZVR5cGVOYW1lcy5jb25jYXQoaW1wbGVtZW50YXRpb25zKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbGFzc05hbWUgPSB0aGlzLm5hbWV1dGlscy5jb252ZXJ0Q2xhc3NOYW1lKGNscyk7XG5cbiAgICAvLyBOZXN0ZWQgY2xhc3NlcyB3aWxsIGJlIGRlYWx0IHdpdGggZHVyaW5nIGNhbGMgY29kZSBnZW5lcmF0aW9uXG4gICAgY29uc3QgbmVzdGVkID0gdGhpcy5pc05lc3RlZChjbHMpO1xuICAgIGNvbnN0IGFic1ByZWZpeCA9IGFic3RyYWN0ID8gJyBhYnN0cmFjdCcgOiAnJztcblxuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZChjbGFzc05hbWUsIG5hbWVzcGFjZSwgbmVzdGVkKTtcblxuICAgIGNvbnN0IGltcGxlbWVudHNFeHByID0gYCA6ICR7YmFzZVR5cGVOYW1lcy5qb2luKCcsICcpfWA7XG5cbiAgICB0aGlzLmRvdG5ldERvY0dlbmVyYXRvci5lbWl0RG9jcyhjbHMsIHtcbiAgICAgIGFwaTogJ3R5cGUnLFxuICAgICAgZnFuOiBjbHMuZnFuLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kb3RuZXRSdW50aW1lR2VuZXJhdG9yLmVtaXRBdHRyaWJ1dGVzRm9yQ2xhc3MoY2xzKTtcblxuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHVibGljJHthYnNQcmVmaXh9IGNsYXNzICR7Y2xhc3NOYW1lfSR7aW1wbGVtZW50c0V4cHJ9YCxcbiAgICApO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgY2xhc3MgcGFyYW1ldGVyc1xuICAgIGxldCBwYXJhbWV0ZXJzRGVmaW5pdGlvbiA9ICcnO1xuICAgIGxldCBwYXJhbWV0ZXJzQmFzZSA9ICcnO1xuICAgIGNvbnN0IGluaXRpYWxpemVyID0gY2xzLmluaXRpYWxpemVyO1xuICAgIGlmIChpbml0aWFsaXplcikge1xuICAgICAgdGhpcy5kb3RuZXREb2NHZW5lcmF0b3IuZW1pdERvY3MoaW5pdGlhbGl6ZXIsIHtcbiAgICAgICAgYXBpOiAnaW5pdGlhbGl6ZXInLFxuICAgICAgICBmcW46IGNscy5mcW4sXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0RGVwcmVjYXRlZEF0dHJpYnV0ZUlmTmVjZXNzYXJ5KFxuICAgICAgICBpbml0aWFsaXplcixcbiAgICAgICk7XG4gICAgICBpZiAoaW5pdGlhbGl6ZXIucGFyYW1ldGVycykge1xuICAgICAgICBwYXJhbWV0ZXJzRGVmaW5pdGlvbiA9IHRoaXMucmVuZGVyUGFyYW1ldGVyc1N0cmluZyhcbiAgICAgICAgICBpbml0aWFsaXplci5wYXJhbWV0ZXJzLFxuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgaW5pdGlhbGl6ZXIucGFyYW1ldGVycykge1xuICAgICAgICAgIHBhcmFtZXRlcnNCYXNlICs9IGAke3RoaXMubmFtZXV0aWxzLmNvbnZlcnRQYXJhbWV0ZXJOYW1lKHAubmFtZSl9YDtcbiAgICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgbGFzdCBwYXJhbWV0ZXIsIGFwcGVuZCAsXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaW5pdGlhbGl6ZXIucGFyYW1ldGVycy5pbmRleE9mKHApICE9PVxuICAgICAgICAgICAgaW5pdGlhbGl6ZXIucGFyYW1ldGVycy5sZW5ndGggLSAxXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzQmFzZSArPSAnLCAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgdGhlIGNvbnN0cnVjdG9yczpcbiAgICAgIC8vIEFic3RyYWN0IGNsYXNzZXMgaGF2ZSBwcm90ZWN0ZWQgY29uc3RydWN0b3JzLlxuICAgICAgY29uc3QgdmlzaWJpbGl0eSA9IGNscy5hYnN0cmFjdCA/ICdwcm90ZWN0ZWQnIDogJ3B1YmxpYyc7XG5cbiAgICAgIGNvbnN0IGFyZ3MgPVxuICAgICAgICBwYXJhbWV0ZXJzQmFzZS5sZW5ndGggPiAwXG4gICAgICAgICAgPyBgbmV3IG9iamVjdD9bXXske3BhcmFtZXRlcnNCYXNlfX1gXG4gICAgICAgICAgOiBgU3lzdGVtLkFycmF5LkVtcHR5PG9iamVjdD8+KClgO1xuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgICAgYCR7dmlzaWJpbGl0eX0gJHtjbGFzc05hbWV9KCR7cGFyYW1ldGVyc0RlZmluaXRpb259KTogYmFzZShuZXcgRGVwdXR5UHJvcHMoJHthcmdzfSkpYCxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICcvLy8gPHN1bW1hcnk+VXNlZCBieSBqc2lpIHRvIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gYSBKYXZhc2NyaXB0LW93bmVkIG9iamVjdCByZWZlcmVuY2U8L3N1bW1hcnk+JyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJy8vLyA8cGFyYW0gbmFtZT1cInJlZmVyZW5jZVwiPlRoZSBKYXZhc2NyaXB0LW93bmVkIG9iamVjdCByZWZlcmVuY2U8L3BhcmFtPicsXG4gICAgKTtcbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdERlcHJlY2F0ZWRBdHRyaWJ1dGVJZk5lY2Vzc2FyeShpbml0aWFsaXplcik7XG4gICAgdGhpcy5lbWl0SGlkZUF0dHJpYnV0ZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkICR7Y2xhc3NOYW1lfShCeVJlZlZhbHVlIHJlZmVyZW5jZSk6IGJhc2UocmVmZXJlbmNlKWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG5cbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICcvLy8gPHN1bW1hcnk+VXNlZCBieSBqc2lpIHRvIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gRGVwdXR5UHJvcHM8L3N1bW1hcnk+JyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCcvLy8gPHBhcmFtIG5hbWU9XCJwcm9wc1wiPlRoZSBkZXB1dHkgcHJvcHM8L3BhcmFtPicpO1xuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0RGVwcmVjYXRlZEF0dHJpYnV0ZUlmTmVjZXNzYXJ5KGluaXRpYWxpemVyKTtcbiAgICB0aGlzLmVtaXRIaWRlQXR0cmlidXRlKCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwcm90ZWN0ZWQgJHtjbGFzc05hbWV9KERlcHV0eVByb3BzIHByb3BzKTogYmFzZShwcm9wcylgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBvdXRwdXR0ZWQgbWVtYmVycyAoY29uc3RydWN0b3JzKSwgc2V0dGluZyB0aGUgZmxhZyB0byB0cnVlXG4gICAgdGhpcy5mbGFnRmlyc3RNZW1iZXJXcml0dGVuKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kQ2xhc3MoY2xzOiBzcGVjLkNsYXNzVHlwZSkge1xuICAgIGlmIChjbHMuYWJzdHJhY3QpIHtcbiAgICAgIHRoaXMuZW1pdEludGVyZmFjZVByb3h5KGNscyk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICBjb25zdCBjbGFzc05hbWUgPSB0aGlzLm5hbWV1dGlscy5jb252ZXJ0Q2xhc3NOYW1lKGNscyk7XG4gICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2VGb3IodGhpcy5hc3NlbWJseSwgY2xzKTtcbiAgICB0aGlzLmNsb3NlRmlsZUlmTmVlZGVkKGNsYXNzTmFtZSwgbmFtZXNwYWNlLCB0aGlzLmlzTmVzdGVkKGNscykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRmllbGQoXG4gICAgX2Nsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgX3Byb3A6IHNwZWMuUHJvcGVydHksXG4gICAgX3VuaW9uPzogc3BlYy5VbmlvblR5cGVSZWZlcmVuY2UsXG4gICkge1xuICAgIC8qIG5vb3AgKi9cbiAgfVxuXG4gIHByb3RlY3RlZCBvbk1ldGhvZChjbHM6IHNwZWMuQ2xhc3NUeXBlLCBtZXRob2Q6IHNwZWMuTWV0aG9kKSB7XG4gICAgdGhpcy5lbWl0TWV0aG9kKGNscywgbWV0aG9kLCBjbHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTWV0aG9kT3ZlcmxvYWQoXG4gICAgY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBvdmVybG9hZDogc3BlYy5NZXRob2QsXG4gICAgX29yaWdpbmFsTWV0aG9kOiBzcGVjLk1ldGhvZCxcbiAgKSB7XG4gICAgdGhpcy5vbk1ldGhvZChjbHMsIG92ZXJsb2FkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblByb3BlcnR5KGNsczogc3BlYy5DbGFzc1R5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICB0aGlzLmVtaXRQcm9wZXJ0eShjbHMsIHByb3AsIGNscyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNNZXRob2QoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIHRoaXMuZW1pdE1ldGhvZChjbHMsIG1ldGhvZCwgY2xzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN0YXRpY01ldGhvZE92ZXJsb2FkKFxuICAgIGNsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRoaXMuZW1pdE1ldGhvZChjbHMsIG92ZXJsb2FkLCBjbHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3RhdGljUHJvcGVydHkoY2xzOiBzcGVjLkNsYXNzVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIGlmIChwcm9wLmNvbnN0KSB7XG4gICAgICB0aGlzLmVtaXRDb25zdFByb3BlcnR5KGNscywgcHJvcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdFByb3BlcnR5KGNscywgcHJvcCwgY2xzKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25VbmlvblByb3BlcnR5KFxuICAgIGNsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgcHJvcDogc3BlYy5Qcm9wZXJ0eSxcbiAgICBfdW5pb246IHNwZWMuVW5pb25UeXBlUmVmZXJlbmNlLFxuICApIHtcbiAgICB0aGlzLmVtaXRQcm9wZXJ0eShjbHMsIHByb3AsIGNscyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkVudW0oZW5tOiBzcGVjLkVudW1UeXBlKSB7XG4gICAgY29uc3QgZW51bU5hbWUgPSB0aGlzLm5hbWV1dGlscy5jb252ZXJ0VHlwZU5hbWUoZW5tLm5hbWUpO1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IHRoaXMubmFtZXNwYWNlRm9yKHRoaXMuYXNzZW1ibHksIGVubSk7XG4gICAgdGhpcy5vcGVuRmlsZUlmTmVlZGVkKGVudW1OYW1lLCBuYW1lc3BhY2UsIHRoaXMuaXNOZXN0ZWQoZW5tKSk7XG4gICAgdGhpcy5lbWl0TmV3TGluZUlmTmVjZXNzYXJ5KCk7XG4gICAgdGhpcy5kb3RuZXREb2NHZW5lcmF0b3IuZW1pdERvY3MoZW5tLCB7XG4gICAgICBhcGk6ICd0eXBlJyxcbiAgICAgIGZxbjogZW5tLmZxbixcbiAgICB9KTtcbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdEF0dHJpYnV0ZXNGb3JFbnVtKGVubSwgZW51bU5hbWUpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYHB1YmxpYyBlbnVtICR7ZW5tLm5hbWV9YCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmRFbnVtKGVubTogc3BlYy5FbnVtVHlwZSkge1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgY29uc3QgZW51bU5hbWUgPSB0aGlzLm5hbWV1dGlscy5jb252ZXJ0VHlwZU5hbWUoZW5tLm5hbWUpO1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IHRoaXMubmFtZXNwYWNlRm9yKHRoaXMuYXNzZW1ibHksIGVubSk7XG4gICAgdGhpcy5jbG9zZUZpbGVJZk5lZWRlZChlbnVtTmFtZSwgbmFtZXNwYWNlLCB0aGlzLmlzTmVzdGVkKGVubSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW51bU1lbWJlcihlbm06IHNwZWMuRW51bVR5cGUsIG1lbWJlcjogc3BlYy5FbnVtTWVtYmVyKSB7XG4gICAgdGhpcy5kb3RuZXREb2NHZW5lcmF0b3IuZW1pdERvY3MobWVtYmVyLCB7XG4gICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgZnFuOiBlbm0uZnFuLFxuICAgICAgbWVtYmVyTmFtZTogbWVtYmVyLm5hbWUsXG4gICAgfSk7XG4gICAgY29uc3QgZW51bU1lbWJlck5hbWUgPSB0aGlzLm5hbWV1dGlscy5jb252ZXJ0RW51bU1lbWJlck5hbWUobWVtYmVyLm5hbWUpO1xuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0QXR0cmlidXRlc0ZvckVudW1NZW1iZXIoXG4gICAgICBlbnVtTWVtYmVyTmFtZSxcbiAgICAgIG1lbWJlcixcbiAgICApO1xuICAgIC8vIElmIHdlIGFyZSBvbiB0aGUgbGFzdCBlbnVtIG1lbWJlciwgd2UgZG9uJ3QgbmVlZCBhIGNvbW1hXG4gICAgaWYgKGVubS5tZW1iZXJzLmluZGV4T2YobWVtYmVyKSAhPT0gZW5tLm1lbWJlcnMubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYCR7ZW51bU1lbWJlck5hbWV9LGApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvZGUubGluZShgJHtlbnVtTWVtYmVyTmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5hbWVzcGFjZUZvcihhc3NtOiBzcGVjLkFzc2VtYmx5LCB0eXBlOiBzcGVjLlR5cGUpOiBzdHJpbmcge1xuICAgIGxldCBucyA9IHR5cGUubmFtZXNwYWNlO1xuICAgIHdoaWxlIChucyAhPSBudWxsICYmIGFzc20udHlwZXM/LltgJHthc3NtLm5hbWV9LiR7bnN9YF0gIT0gbnVsbCkge1xuICAgICAgY29uc3QgbmVzdGluZyA9IGFzc20udHlwZXNbYCR7YXNzbS5uYW1lfS4ke25zfWBdO1xuICAgICAgbnMgPSBuZXN0aW5nLm5hbWVzcGFjZTtcbiAgICB9XG4gICAgaWYgKG5zICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLnR5cGVyZXNvbHZlci5yZXNvbHZlTmFtZXNwYWNlKGFzc20sIGFzc20ubmFtZSwgbnMpO1xuICAgIH1cbiAgICByZXR1cm4gYXNzbS50YXJnZXRzIS5kb3RuZXQhLm5hbWVzcGFjZTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdE1ldGhvZChcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlIHwgc3BlYy5JbnRlcmZhY2VUeXBlLFxuICAgIG1ldGhvZDogc3BlYy5NZXRob2QsXG4gICAgZGVmaW5pbmdUeXBlOiBzcGVjLlR5cGUsXG4gICAgZW1pdEZvclByb3h5T3JEYXRhdHlwZSA9IGZhbHNlLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmVtaXROZXdMaW5lSWZOZWNlc3NhcnkoKTtcbiAgICBjb25zdCByZXR1cm5UeXBlID0gbWV0aG9kLnJldHVybnNcbiAgICAgID8gdGhpcy50eXBlcmVzb2x2ZXIudG9Eb3ROZXRUeXBlKG1ldGhvZC5yZXR1cm5zLnR5cGUpXG4gICAgICA6ICd2b2lkJztcbiAgICBjb25zdCBzdGF0aWNLZXlXb3JkID0gbWV0aG9kLnN0YXRpYyA/ICdzdGF0aWMgJyA6ICcnO1xuICAgIGxldCBvdmVycmlkZUtleVdvcmQgPSAnJztcbiAgICBsZXQgdmlydHVhbEtleVdvcmQgPSAnJztcblxuICAgIGxldCBkZWZpbmVkT25BbmNlc3RvciA9IGZhbHNlO1xuICAgIC8vIEluIHRoZSBjYXNlIG9mIHRoZSBzb3VyY2UgYmVpbmcgYSBjbGFzcywgd2UgY2hlY2sgaWYgaXQgaXMgYWxyZWFkeSBkZWZpbmVkIG9uIGFuIGFuY2VzdG9yXG4gICAgaWYgKHNwZWMuaXNDbGFzc1R5cGUoY2xzKSkge1xuICAgICAgZGVmaW5lZE9uQW5jZXN0b3IgPSB0aGlzLmlzTWVtYmVyRGVmaW5lZE9uQW5jZXN0b3IoY2xzLCBtZXRob2QpO1xuICAgIH1cbiAgICAvLyBUaGUgbWV0aG9kIGlzIGFuIG92ZXJyaWRlIGlmIGl0J3MgZGVmaW5lZCBvbiB0aGUgYW5jZXN0b3IsIG9yIGlmIHRoZSBwYXJlbnQgaXMgYSBjbGFzcyBhbmQgd2UgYXJlIGdlbmVyYXRpbmcgYSBwcm94eSBvciBkYXRhdHlwZSBjbGFzc1xuICAgIGxldCBvdmVycmlkZXMgPVxuICAgICAgZGVmaW5lZE9uQW5jZXN0b3IgfHwgKHNwZWMuaXNDbGFzc1R5cGUoY2xzKSAmJiBlbWl0Rm9yUHJveHlPckRhdGF0eXBlKTtcbiAgICAvLyBXZSBhbHNvIGluc3BlY3QgdGhlIGpzaWkgbW9kZWwgdG8gc2VlIGlmIGl0IG92ZXJyaWRlcyBhIGNsYXNzIG1lbWJlci5cbiAgICBpZiAobWV0aG9kLm92ZXJyaWRlcykge1xuICAgICAgY29uc3Qgb3ZlcnJpZGVUeXBlID0gdGhpcy5maW5kVHlwZShtZXRob2Qub3ZlcnJpZGVzKTtcbiAgICAgIGlmIChzcGVjLmlzQ2xhc3NUeXBlKG92ZXJyaWRlVHlwZSkpIHtcbiAgICAgICAgLy8gT3ZlcnJpZGVzIGEgY2xhc3MsIG5lZWRzIG92ZXJyaWRlcyBrZXl3b3JkXG4gICAgICAgIG92ZXJyaWRlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvdmVycmlkZXMpIHtcbiAgICAgIC8vIEFkZCB0aGUgb3ZlcnJpZGUga2V5IHdvcmQgaWYgdGhlIG1ldGhvZCBpcyBlbWl0dGVkIGZvciBhIHByb3h5IG9yIGRhdGEgdHlwZSBvciBpcyBkZWZpbmVkIG9uIGFuIGFuY2VzdG9yLiBJZlxuICAgICAgLy8gdGhlIG1lbWJlciBpcyBzdGF0aWMsIHVzZSB0aGUgXCJuZXdcIiBrZXl3b3JkIGluc3RlYWQsIHRvIGluZGljYXRlIHdlIGFyZSBpbnRlbnRpb25hbGx5IGhpZGluZyB0aGUgYW5jZXN0b3JcbiAgICAgIC8vIGRlY2xhcmF0aW9uIChhcyBDIyBkb2VzIG5vdCBpbmhlcml0IHN0YXRpY3MsIHRoZXkgY2FuIGJlIGhpZGRlbiBidXQgbm90IG92ZXJyaWRkZW4pLiBUaGUgXCJuZXdcIiBrZXl3b3JkIGlzXG4gICAgICAvLyBvcHRpb25hbCBpbiB0aGlzIGNvbnRleHQsIGJ1dCBoZWxwcyBjbGFyaWZ5IGludGVudGlvbi5cbiAgICAgIG92ZXJyaWRlS2V5V29yZCA9IG1ldGhvZC5zdGF0aWMgPyAnbmV3ICcgOiAnb3ZlcnJpZGUgJztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgIW1ldGhvZC5zdGF0aWMgJiZcbiAgICAgIChtZXRob2QuYWJzdHJhY3QgfHwgIWRlZmluZWRPbkFuY2VzdG9yKSAmJlxuICAgICAgIWVtaXRGb3JQcm94eU9yRGF0YXR5cGVcbiAgICApIHtcbiAgICAgIC8vIEFkZCB0aGUgdmlydHVhbCBrZXkgd29yZCBpZiB0aGUgbWV0aG9kIGlzIGFic3RyYWN0IG9yIG5vdCBkZWZpbmVkIG9uIGFuIGFuY2VzdG9yIGFuZCB3ZSBhcmUgTk9UIGdlbmVyYXRpbmcgYSBwcm94eSBvciBkYXRhdHlwZSBjbGFzc1xuICAgICAgLy8gTWV0aG9kcyBzaG91bGQgYWx3YXlzIGJlIHZpcnR1YWwgd2hlbiBwb3NzaWJsZVxuICAgICAgdmlydHVhbEtleVdvcmQgPSAndmlydHVhbCAnO1xuICAgIH1cblxuICAgIGNvbnN0IGFjY2VzcyA9IHRoaXMucmVuZGVyQWNjZXNzTGV2ZWwobWV0aG9kKTtcbiAgICBjb25zdCBtZXRob2ROYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydE1ldGhvZE5hbWUobWV0aG9kLm5hbWUpO1xuXG4gICAgY29uc3QgaXNPcHRpb25hbCA9IG1ldGhvZC5yZXR1cm5zICYmIG1ldGhvZC5yZXR1cm5zLm9wdGlvbmFsID8gJz8nIDogJyc7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYCR7cmV0dXJuVHlwZX0ke2lzT3B0aW9uYWx9ICR7bWV0aG9kTmFtZX0oJHt0aGlzLnJlbmRlck1ldGhvZFBhcmFtZXRlcnMoXG4gICAgICBtZXRob2QsXG4gICAgKX0pYDtcblxuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKG1ldGhvZCwge1xuICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgIGZxbjogZGVmaW5pbmdUeXBlLmZxbixcbiAgICAgIG1lbWJlck5hbWU6IG1ldGhvZC5uYW1lLFxuICAgIH0pO1xuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0QXR0cmlidXRlc0Zvck1ldGhvZChcbiAgICAgIGNscyxcbiAgICAgIG1ldGhvZCAvKiwgZW1pdEZvclByb3h5T3JEYXRhdHlwZSovLFxuICAgICk7XG5cbiAgICBpZiAobWV0aG9kLmFic3RyYWN0KSB7XG4gICAgICB0aGlzLmNvZGUubGluZShgJHthY2Nlc3N9ICR7b3ZlcnJpZGVLZXlXb3JkfWFic3RyYWN0ICR7c2lnbmF0dXJlfTtgKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAgIGAke2FjY2Vzc30gJHtzdGF0aWNLZXlXb3JkfSR7b3ZlcnJpZGVLZXlXb3JkfSR7dmlydHVhbEtleVdvcmR9JHtzaWduYXR1cmV9YCxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgdGhpcy5kb3RuZXRSdW50aW1lR2VuZXJhdG9yLmNyZWF0ZUludm9rZU1ldGhvZElkZW50aWZpZXIoXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIGNscyBhcyBzcGVjLkNsYXNzVHlwZSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3VuZHMgb3V0IGlmIGEgbWVtYmVyIChwcm9wZXJ0eSBvciBtZXRob2QpIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBvbmUgb2YgdGhlIGJhc2UgY2xhc3Nlc1xuICAgKlxuICAgKiBVc2VkIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIG92ZXJyaWRlIG9yIHZpcnR1YWwga2V5d29yZHMgYXJlIG5lY2Vzc2FyeS5cbiAgICovXG4gIHByaXZhdGUgaXNNZW1iZXJEZWZpbmVkT25BbmNlc3RvcihcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIG1lbWJlcjogc3BlYy5Qcm9wZXJ0eSB8IHNwZWMuTWV0aG9kLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAobWVtYmVyIGFzIHNwZWMuTWV0aG9kKSB7XG4gICAgICBjb25zdCBvYmplY3RNZXRob2RzID0gWydUb1N0cmluZycsICdHZXRIYXNoQ29kZScsICdFcXVhbHMnXTtcbiAgICAgIC8vIE1ldGhvZHMgZGVmaW5lZCBvbiB0aGUgT2JqZWN0IGNsYXNzIHNob3VsZCBiZSBvdmVycmlkZGVuLCByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChcbiAgICAgICAgb2JqZWN0TWV0aG9kcy5pbmNsdWRlcyh0aGlzLm5hbWV1dGlscy5jb252ZXJ0TWV0aG9kTmFtZShtZW1iZXIubmFtZSkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZSA9IGNscy5iYXNlO1xuICAgIGlmIChiYXNlKSB7XG4gICAgICBjb25zdCBiYXNlVHlwZSA9IHRoaXMuZmluZFR5cGUoYmFzZSkgYXMgc3BlYy5DbGFzc1R5cGU7XG5cbiAgICAgIGlmIChtZW1iZXIgYXMgc3BlYy5Qcm9wZXJ0eSkge1xuICAgICAgICBpZiAoYmFzZVR5cGUucHJvcGVydGllcykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGJhc2VUeXBlLnByb3BlcnRpZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUgPT09IG1lbWJlci5uYW1lLFxuICAgICAgICAgICAgKS5sZW5ndGggPiAwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBwcm9wZXJ0eSBmb3VuZCBpbiBiYXNlIHBhcmVudFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmlzTWVtYmVyRGVmaW5lZE9uQW5jZXN0b3IoYmFzZVR5cGUsIG1lbWJlcik7XG4gICAgICB9IGVsc2UgaWYgKG1lbWJlciBhcyBzcGVjLk1ldGhvZCkge1xuICAgICAgICBpZiAoYmFzZVR5cGUubWV0aG9kcykge1xuICAgICAgICAgIGNvbnN0IG15TWV0aG9kID0gbWVtYmVyIGFzIHNwZWMuTWV0aG9kO1xuICAgICAgICAgIC8vIElmIHRoZSBuYW1lLCBwYXJhbWV0ZXJzIGFuZCByZXR1cm5zIGFyZSBzaW1pbGFyIHRoZW4gaXQgaXMgdGhlIHNhbWUgbWV0aG9kIGluIC5ORVRcbiAgICAgICAgICBmb3IgKGNvbnN0IG0gb2YgYmFzZVR5cGUubWV0aG9kcykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBtLm5hbWUgPT09IG15TWV0aG9kLm5hbWUgJiZcbiAgICAgICAgICAgICAgbS5wYXJhbWV0ZXJzID09PSBteU1ldGhvZC5wYXJhbWV0ZXJzICYmXG4gICAgICAgICAgICAgIG0ucmV0dXJucyA9PT0gbXlNZXRob2QucmV0dXJuc1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pc01lbWJlckRlZmluZWRPbkFuY2VzdG9yKGJhc2VUeXBlLCBtZW1iZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBtZXRob2QgcGFyYW1ldGVycyBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyTWV0aG9kUGFyYW1ldGVycyhtZXRob2Q6IHNwZWMuTWV0aG9kKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJQYXJhbWV0ZXJzU3RyaW5nKG1ldGhvZC5wYXJhbWV0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHBhcmFtZXRlcnMgc3RyaW5nIGZvciBtZXRob2RzIG9yIGNvbnN0cnVjdG9yc1xuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJQYXJhbWV0ZXJzU3RyaW5nKFxuICAgIHBhcmFtZXRlcnM6IHNwZWMuUGFyYW1ldGVyW10gfCB1bmRlZmluZWQsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFyYW1zID0gW107XG4gICAgaWYgKHBhcmFtZXRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIGxldCBvcHRpb25hbFByaW1pdGl2ZSA9ICcnO1xuICAgICAgICBsZXQgb3B0aW9uYWxLZXl3b3JkID0gJyc7XG4gICAgICAgIGxldCB0eXBlID0gdGhpcy50eXBlcmVzb2x2ZXIudG9Eb3ROZXRUeXBlKHAudHlwZSk7XG4gICAgICAgIGlmIChwLm9wdGlvbmFsKSB7XG4gICAgICAgICAgb3B0aW9uYWxLZXl3b3JkID0gJyA9IG51bGwnO1xuICAgICAgICAgIGlmIChwLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICBvcHRpb25hbFByaW1pdGl2ZSA9ICc/JztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocC52YXJpYWRpYykge1xuICAgICAgICAgIHR5cGUgPSBgcGFyYW1zICR7dHlwZX1bXWA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3QgPSBgJHt0eXBlfSR7b3B0aW9uYWxQcmltaXRpdmV9ICR7dGhpcy5uYW1ldXRpbHMuY29udmVydFBhcmFtZXRlck5hbWUoXG4gICAgICAgICAgcC5uYW1lLFxuICAgICAgICApfSR7b3B0aW9uYWxLZXl3b3JkfWA7XG4gICAgICAgIHBhcmFtcy5wdXNoKHN0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcy5qb2luKCcsICcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGludGVyZmFjZSBwcm94eSBmb3IgYW4gaW50ZXJmYWNlIG9yIGFuIGFic3RyYWN0IGNsYXNzLlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0SW50ZXJmYWNlUHJveHkoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUgfCBzcGVjLkNsYXNzVHlwZSk6IHZvaWQge1xuICAgIGNvbnN0IG5hbWUgPSAnX1Byb3h5JztcbiAgICBjb25zdCBuYW1lc3BhY2UgPSB0aGlzLm5hbWVzcGFjZUZvcih0aGlzLmFzc2VtYmx5LCBpZmMpO1xuICAgIGNvbnN0IGlzTmVzdGVkID0gdHJ1ZTtcbiAgICB0aGlzLm9wZW5GaWxlSWZOZWVkZWQobmFtZSwgbmFtZXNwYWNlLCBpc05lc3RlZCk7XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKGlmYywge1xuICAgICAgYXBpOiAndHlwZScsXG4gICAgICBmcW46IGlmYy5mcW4sXG4gICAgfSk7XG4gICAgdGhpcy5kb3RuZXRSdW50aW1lR2VuZXJhdG9yLmVtaXRBdHRyaWJ1dGVzRm9ySW50ZXJmYWNlUHJveHkoaWZjKTtcblxuICAgIGNvbnN0IGludGVyZmFjZUZxbiA9IHRoaXMudHlwZXJlc29sdmVyLnRvTmF0aXZlRnFuKGlmYy5mcW4pO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHNwZWMuaXNJbnRlcmZhY2VUeXBlKGlmYylcbiAgICAgID8gYDogRGVwdXR5QmFzZSwgJHtpbnRlcmZhY2VGcW59YFxuICAgICAgOiBgOiAke2ludGVyZmFjZUZxbn1gO1xuICAgIGNvbnN0IG5ld01vZGlmaWVyID0gdGhpcy5wcm94eU11c3RVc2VOZXdNb2RpZmllcihpZmMpID8gJ25ldyAnIDogJyc7XG5cbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYCR7bmV3TW9kaWZpZXJ9aW50ZXJuYWwgc2VhbGVkIGNsYXNzICR7bmFtZX0gJHtzdWZmaXh9YCxcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBwcml2YXRlIGNvbnN0cnVjdG9yXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwcml2YXRlICR7bmFtZX0oQnlSZWZWYWx1ZSByZWZlcmVuY2UpOiBiYXNlKHJlZmVyZW5jZSlgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBvdXRwdXQgYSBtZW1iZXIgKGNvbnN0cnVjdG9yKSwgc2V0dGluZyB0aGUgZmlyc3QgbWVtYmVyIGZsYWcgdG8gdHJ1ZVxuICAgIHRoaXMuZmxhZ0ZpcnN0TWVtYmVyV3JpdHRlbih0cnVlKTtcblxuICAgIGNvbnN0IGRhdGF0eXBlID0gZmFsc2U7XG4gICAgY29uc3QgcHJveHkgPSB0cnVlO1xuICAgIHRoaXMuZW1pdEludGVyZmFjZU1lbWJlcnNGb3JQcm94eU9yRGF0YXR5cGUoaWZjLCBkYXRhdHlwZSwgcHJveHkpO1xuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNsb3NlRmlsZUlmTmVlZGVkKG5hbWUsIG5hbWVzcGFjZSwgaXNOZXN0ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBhbnkgYW5jZXN0b3Igb2YgdGhlIGdpdmVuIHR5cGUgbXVzdCB1c2UgdGhlIGBuZXdgXG4gICAqIG1vZGlmaWVyIHdoZW4gaW50cm9kdWNpbmcgaXQncyBvd24gcHJveHkuXG4gICAqXG4gICAqIElmIHRoZSB0eXBlIGlzIGEgYGNsYXNzYCwgdGhlbiBpdCBtdXN0IHVzZSBgbmV3YCBpZiBpdCBleHRlbmRzIGFub3RoZXJcbiAgICogYWJzdHJhY3QgY2xhc3MgZGVmaW5lZCBpbiB0aGUgc2FtZSBhc3NlbWJseSAoc2luY2UgcHJveGllcyBhcmUgaW50ZXJuYWwsXG4gICAqIGV4dGVybmFsIHR5cGVzJyBwcm94aWVzIGFyZSBub3QgdmlzaWJsZSBpbiB0aGF0IGNvbnRleHQpLlxuICAgKlxuICAgKiBJZiB0aGUgdHlwZSBpcyBhbiBgaW50ZXJmYWNlYCwgdGhlbiBpdCBtdXN0IHVzZSBgbmV3YCBpZiBpdCBleHRlbmRzIGFub3RoZXJcbiAgICogaW50ZXJmYWNlIGZyb20gdGhlIHNhbWUgYXNzZW1ibHkuXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlIHRoZSB0ZXN0ZWQgcHJveHktYWJsZSB0eXBlIChhbiBhYnN0cmFjdCBjbGFzcyBvciBhbiBpbnRlcmZhY2UpLlxuICAgKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGFueSBhbmNlc3RvciBvZiB0aGlzIHR5cGUgaGFzIGEgdmlzaWJsZSBwcm94eS5cbiAgICovXG4gIHByaXZhdGUgcHJveHlNdXN0VXNlTmV3TW9kaWZpZXIoXG4gICAgdHlwZTogc3BlYy5DbGFzc1R5cGUgfCBzcGVjLkludGVyZmFjZVR5cGUsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChzcGVjLmlzQ2xhc3NUeXBlKHR5cGUpKSB7XG4gICAgICBpZiAodHlwZS5iYXNlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlID0gdGhpcy5maW5kVHlwZSh0eXBlLmJhc2UpIGFzIHNwZWMuQ2xhc3NUeXBlO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgYmFzZS5hc3NlbWJseSA9PT0gdHlwZS5hc3NlbWJseSAmJlxuICAgICAgICAoYmFzZS5hYnN0cmFjdFxuICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgIDogLy8gQW4gYWJzdHJhY3QgY2xhc3MgY291bGQgZXh0ZW5kIGEgY29uY3JldGUgY2xhc3MuLi4gV2UgbXVzdCB3YWxrIHVwIHRoZSBpbmhlcml0YW5jZSB0cmVlIGluIHRoaXMgY2FzZS4uLlxuICAgICAgICAgICAgdGhpcy5wcm94eU11c3RVc2VOZXdNb2RpZmllcihiYXNlKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGUuaW50ZXJmYWNlcz8uZmluZChcbiAgICAgICAgKGZxbikgPT4gdGhpcy5maW5kVHlwZShmcW4pLmFzc2VtYmx5ID09PSB0eXBlLmFzc2VtYmx5LFxuICAgICAgKSAhPSBudWxsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBhbiBJbnRlcmZhY2UgRGF0YXR5cGUgY2xhc3NcbiAgICpcbiAgICogVGhpcyBpcyB1c2VkIHRvIGVtaXQgYSBjbGFzcyBpbXBsZW1lbnRpbmcgYW4gaW50ZXJmYWNlIHdoZW4gdGhlIGRhdGF0eXBlIHByb3BlcnR5IGlzIHRydWUgaW4gdGhlIGpzaWkgbW9kZWxcbiAgICogVGhlIGdlbmVyYXRpb24gb2YgdGhlIGludGVyZmFjZSBwcm94eSBtYXkgbm90IGJlIG5lZWRlZCBpZiB0aGUgaW50ZXJmYWNlIGlzIGFsc28gc2V0IGFzIGEgZGF0YXR5cGVcbiAgICovXG4gIHByaXZhdGUgZW1pdEludGVyZmFjZURhdGFUeXBlKGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlKTogdm9pZCB7XG4gICAgLy8gSW50ZXJmYWNlIGRhdGF0eXBlcyBkbyBub3QgbmVlZCB0byBiZSBwcmVmaXhlZCBieSBJLCB3ZSBjYW4gY2FsbCBjb252ZXJ0Q2xhc3NOYW1lXG4gICAgY29uc3QgbmFtZSA9IHRoaXMubmFtZXV0aWxzLmNvbnZlcnRDbGFzc05hbWUoaWZjKTtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSB0aGlzLm5hbWVzcGFjZUZvcih0aGlzLmFzc2VtYmx5LCBpZmMpO1xuICAgIGNvbnN0IGlzTmVzdGVkID0gdGhpcy5pc05lc3RlZChpZmMpO1xuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZChuYW1lLCBuYW1lc3BhY2UsIGlzTmVzdGVkKTtcblxuICAgIGlmIChpZmMucHJvcGVydGllcz8uZmluZCgocHJvcCkgPT4gIXByb3Aub3B0aW9uYWwpICE9IG51bGwpIHtcbiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gYmUgYW5ub3llZCBieSB0aGUgbGFjayBvZiBpbml0aWFsaXphdGlvbiBvZiBub24tbnVsbGFibGUgZmllbGRzIGluIHRoaXMgY2FzZS5cbiAgICAgIHRoaXMuY29kZS5saW5lKCcjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSBDUzg2MTgnKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgfVxuXG4gICAgdGhpcy5kb3RuZXREb2NHZW5lcmF0b3IuZW1pdERvY3MoaWZjLCB7XG4gICAgICBhcGk6ICd0eXBlJyxcbiAgICAgIGZxbjogaWZjLmZxbixcbiAgICB9KTtcbiAgICBjb25zdCBzdWZmaXggPSBgOiAke3RoaXMudHlwZXJlc29sdmVyLnRvTmF0aXZlRnFuKGlmYy5mcW4pfWA7XG4gICAgdGhpcy5kb3RuZXRSdW50aW1lR2VuZXJhdG9yLmVtaXRBdHRyaWJ1dGVzRm9ySW50ZXJmYWNlRGF0YXR5cGUoaWZjKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBwdWJsaWMgY2xhc3MgJHtuYW1lfSAke3N1ZmZpeH1gKTtcbiAgICB0aGlzLmZsYWdGaXJzdE1lbWJlcldyaXR0ZW4oZmFsc2UpO1xuICAgIGNvbnN0IGRhdGF0eXBlID0gdHJ1ZTtcbiAgICBjb25zdCBwcm94eSA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdEludGVyZmFjZU1lbWJlcnNGb3JQcm94eU9yRGF0YXR5cGUoaWZjLCBkYXRhdHlwZSwgcHJveHkpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jbG9zZUZpbGVJZk5lZWRlZChuYW1lLCBuYW1lc3BhY2UsIGlzTmVzdGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgdGhlIGJvZHkgb2YgdGhlIGludGVyZmFjZSBwcm94eSBvciBkYXRhIHR5cGUgY2xhc3NcbiAgICpcbiAgICogVGhpcyBsb29wcyB0aHJvdWdoIGFsbCB0aGUgbWVtYmVyIGFuZCBnZW5lcmF0ZXMgdGhlbVxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0SW50ZXJmYWNlTWVtYmVyc0ZvclByb3h5T3JEYXRhdHlwZShcbiAgICBpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSB8IHNwZWMuQ2xhc3NUeXBlLFxuICAgIGRhdGF0eXBlOiBib29sZWFuLFxuICAgIHByb3h5OiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICAvLyBUaGUga2V5IGlzIGluIHRoZSBmb3JtICdtZXRob2QubmFtZTtwYXJhbWV0ZXIxO3BhcmFtZXRlcjI7JyBldGNcbiAgICBjb25zdCBtZXRob2RzID0gbmV3IE1hcDxzdHJpbmcsIE1ldGhvZERlZmluaXRpb24+KCk7XG4gICAgLypcbiAgICAgICAgICBPbmx5IGdldCB0aGUgZmlyc3QgZGVjbGFyYXRpb24gZW5jb3VudGVyZWQsIGFuZCBrZWVwIGl0IGlmIGl0IGlzIGFic3RyYWN0LiBUaGUgbGlzdCBjb250YWlucyBBTExcbiAgICAgICAgICBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIGVuY291bnRlcmVkLCBpbiB0aGUgb3JkZXIgZW5jb3VudGVyZWQuIEFuIGFic3RyYWN0IGNsYXNzIGNhbiBoYXZlIGNvbmNyZXRlXG4gICAgICAgICAgaW1wbGVtZW50YXRpb25zLiBUaGVyZWZvcmUsIHdlIG9ubHkgZ2VuZXJhdGUgbWV0aG9kcy9wcm9wZXJ0aWVzIGlmIHRoZSBmaXJzdCBtZW1iZXIgZW5jb3VudGVyZWRcbiAgICAgICAgICBpcyB1bmltcGxlbWVudGVkLlxuICAgICAgICAqL1xuICAgIGNvbnN0IGV4Y2x1ZGVkTWV0aG9kOiBzdHJpbmdbXSA9IFtdOyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgbWV0aG9kcyB3ZSBhbHJlYWR5IHJhbiBpbnRvIGFuZCBkb24ndCB3YW50IHRvIGVtaXRcbiAgICBjb25zdCBleGNsdWRlZFByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107IC8vIEtlZXBzIHRyYWNrIG9mIHRoZSBwcm9wZXJ0aWVzIHdlIGFscmVhZHkgcmFuIGludG8gYW5kIGRvbid0IHdhbnQgdG8gZW1pdFxuICAgIGNvbnN0IHByb3BlcnRpZXM6IHsgW25hbWU6IHN0cmluZ106IFByb3BlcnR5RGVmaW5pdGlvbiB9ID0ge307XG4gICAgY29uc3QgY29sbGVjdEFic3RyYWN0TWVtYmVycyA9IChcbiAgICAgIGN1cnJlbnRUeXBlOiBzcGVjLkludGVyZmFjZVR5cGUgfCBzcGVjLkNsYXNzVHlwZSxcbiAgICApID0+IHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBjdXJyZW50VHlwZS5wcm9wZXJ0aWVzID8/IFtdKSB7XG4gICAgICAgIGlmICghZXhjbHVkZWRQcm9wZXJ0aWVzLmluY2x1ZGVzKHByb3AubmFtZSkpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIG5ldmVyIHJ1biBpbnRvIHRoaXMgcHJvcGVydHkgYmVmb3JlIGFuZCBpdCBpcyBhYnN0cmFjdCwgd2Uga2VlcCBpdFxuICAgICAgICAgIGlmIChwcm9wLmFic3RyYWN0KSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzW3Byb3AubmFtZV0gPSB7IHByb3AsIGRlZmluaW5nVHlwZTogY3VycmVudFR5cGUgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXhjbHVkZWRQcm9wZXJ0aWVzLnB1c2gocHJvcC5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBjdXJyZW50VHlwZS5tZXRob2RzID8/IFtdKSB7XG4gICAgICAgIGxldCBtZXRob2RQYXJhbWV0ZXJzID0gJyc7XG4gICAgICAgIGlmIChtZXRob2QucGFyYW1ldGVycykge1xuICAgICAgICAgIG1ldGhvZC5wYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtKSA9PiB7XG4gICAgICAgICAgICBtZXRob2RQYXJhbWV0ZXJzICs9IGA7JHt0aGlzLnR5cGVyZXNvbHZlci50b0RvdE5ldFR5cGUoXG4gICAgICAgICAgICAgIHBhcmFtLnR5cGUsXG4gICAgICAgICAgICApfWA7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFleGNsdWRlZE1ldGhvZC5pbmNsdWRlcyhgJHttZXRob2QubmFtZX0ke21ldGhvZFBhcmFtZXRlcnN9YCkpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIG5ldmVyIHJ1biBpbnRvIHRoaXMgbWV0aG9kIGJlZm9yZSBhbmQgaXQgaXMgYWJzdHJhY3QsIHdlIGtlZXAgaXRcbiAgICAgICAgICBpZiAobWV0aG9kLmFic3RyYWN0KSB7XG4gICAgICAgICAgICBtZXRob2RzLnNldChgJHttZXRob2QubmFtZX0ke21ldGhvZFBhcmFtZXRlcnN9YCwge1xuICAgICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgICAgIGRlZmluaW5nVHlwZTogY3VycmVudFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXhjbHVkZWRNZXRob2QucHVzaChgJHttZXRob2QubmFtZX0ke21ldGhvZFBhcmFtZXRlcnN9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgYmFzZXMgPSBuZXcgQXJyYXk8c3BlYy5OYW1lZFR5cGVSZWZlcmVuY2U+KCk7XG4gICAgICBiYXNlcy5wdXNoKFxuICAgICAgICAuLi4oY3VycmVudFR5cGUuaW50ZXJmYWNlcyA/PyBbXSkubWFwKChpZmFjZSkgPT4gdGhpcy5maW5kVHlwZShpZmFjZSkpLFxuICAgICAgKTtcbiAgICAgIGlmIChzcGVjLmlzQ2xhc3NUeXBlKGN1cnJlbnRUeXBlKSAmJiBjdXJyZW50VHlwZS5iYXNlKSB7XG4gICAgICAgIGJhc2VzLnB1c2godGhpcy5maW5kVHlwZShjdXJyZW50VHlwZS5iYXNlKSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGJhc2Ugb2YgYmFzZXMpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuZmluZFR5cGUoYmFzZS5mcW4pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZS5raW5kICE9PSBzcGVjLlR5cGVLaW5kLkludGVyZmFjZSAmJlxuICAgICAgICAgIHR5cGUua2luZCAhPT0gc3BlYy5UeXBlS2luZC5DbGFzc1xuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQmFzZSBpbnRlcmZhY2VzIG9mIGFuIGludGVyZmFjZSBtdXN0IGJlIGFuIGludGVyZmFjZSBvciBhIGNsYXNzICgke2Jhc2UuZnFufSBpcyBvZiB0eXBlICR7dHlwZS5raW5kfSlgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29sbGVjdEFic3RyYWN0TWVtYmVycyh0eXBlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbGxlY3RBYnN0cmFjdE1lbWJlcnMoaWZjKTtcblxuICAgIC8vIGVtaXQgYWxsIHByb3BlcnRpZXNcbiAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIE9iamVjdC5rZXlzKHByb3BlcnRpZXMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gY2xvbmUocHJvcGVydGllc1twcm9wTmFtZV0pO1xuICAgICAgcHJvcC5wcm9wLmFic3RyYWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLmVtaXRQcm9wZXJ0eShpZmMsIHByb3AucHJvcCwgcHJvcC5kZWZpbmluZ1R5cGUsIGRhdGF0eXBlLCBwcm94eSk7XG4gICAgfVxuICAgIC8vIGVtaXQgYWxsIHRoZSBtZXRob2RzXG4gICAgZm9yIChjb25zdCBtZXRob2ROYW1lQW5kUGFyYW1ldGVycyBvZiBtZXRob2RzLmtleXMoKSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBtZXRob2RzLmdldChtZXRob2ROYW1lQW5kUGFyYW1ldGVycyk7XG4gICAgICBpZiAob3JpZ2luYWxNZXRob2QpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kID0gY2xvbmUob3JpZ2luYWxNZXRob2QpO1xuICAgICAgICBtZXRob2QubWV0aG9kLmFic3RyYWN0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW1pdE1ldGhvZChcbiAgICAgICAgICBpZmMsXG4gICAgICAgICAgbWV0aG9kLm1ldGhvZCxcbiAgICAgICAgICBtZXRob2QuZGVmaW5pbmdUeXBlLFxuICAgICAgICAgIC8qIGVtaXRGb3JQcm94eU9yRGF0YXR5cGUgKi8gdHJ1ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGNvbnN0IG92ZXJsb2FkZWRNZXRob2Qgb2YgdGhpcy5jcmVhdGVPdmVybG9hZHNGb3JPcHRpb25hbHMoXG4gICAgICAgICAgbWV0aG9kLm1ldGhvZCxcbiAgICAgICAgKSkge1xuICAgICAgICAgIG92ZXJsb2FkZWRNZXRob2QuYWJzdHJhY3QgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmVtaXRNZXRob2QoXG4gICAgICAgICAgICBpZmMsXG4gICAgICAgICAgICBvdmVybG9hZGVkTWV0aG9kLFxuICAgICAgICAgICAgbWV0aG9kLmRlZmluaW5nVHlwZSxcbiAgICAgICAgICAgIC8qIGVtaXRGb3JQcm94eU9yRGF0YXR5cGUgKi8gdHJ1ZSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgcHJvcGVydHlcbiAgICovXG4gIHByaXZhdGUgZW1pdFByb3BlcnR5KFxuICAgIGNsczogc3BlYy5UeXBlLFxuICAgIHByb3A6IHNwZWMuUHJvcGVydHksXG4gICAgZGVmaW5pbmdUeXBlOiBzcGVjLlR5cGUsXG4gICAgZGF0YXR5cGUgPSBmYWxzZSxcbiAgICBwcm94eSA9IGZhbHNlLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmVtaXROZXdMaW5lSWZOZWNlc3NhcnkoKTtcblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHRoaXMudHlwZXJlc29sdmVyLnRvTmF0aXZlRnFuKGNscy5mcW4pO1xuICAgIGNvbnN0IGFjY2VzcyA9IHRoaXMucmVuZGVyQWNjZXNzTGV2ZWwocHJvcCk7XG4gICAgY29uc3Qgc3RhdGljS2V5V29yZCA9IHByb3Auc3RhdGljID8gJ3N0YXRpYyAnIDogJyc7XG4gICAgY29uc3QgcHJvcE5hbWUgPSB0aGlzLm5hbWV1dGlscy5jb252ZXJ0UHJvcGVydHlOYW1lKHByb3AubmFtZSk7XG5cbiAgICB0aGlzLmRvdG5ldERvY0dlbmVyYXRvci5lbWl0RG9jcyhwcm9wLCB7XG4gICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgZnFuOiBkZWZpbmluZ1R5cGUuZnFuLFxuICAgICAgbWVtYmVyTmFtZTogcHJvcC5uYW1lLFxuICAgIH0pO1xuICAgIGlmIChwcm9wLm9wdGlvbmFsKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnW0pzaWlPcHRpb25hbF0nKTtcbiAgICB9XG4gICAgdGhpcy5kb3RuZXRSdW50aW1lR2VuZXJhdG9yLmVtaXRBdHRyaWJ1dGVzRm9yUHJvcGVydHkocHJvcCwgZGF0YXR5cGUpO1xuXG4gICAgbGV0IGlzT3ZlcnJpZGVLZXlXb3JkID0gJyc7XG4gICAgbGV0IGlzVmlydHVhbEtleVdvcmQgPSAnJztcbiAgICBsZXQgaXNBYnN0cmFjdEtleXdvcmQgPSAnJztcblxuICAgIC8vIElmIHRoZSBwcm9wIHBhcmVudCBpcyBhIGNsYXNzXG4gICAgaWYgKHNwZWMuaXNDbGFzc1R5cGUoY2xzKSkge1xuICAgICAgY29uc3QgaW1wbGVtZW50ZWRJbkJhc2UgPSB0aGlzLmlzTWVtYmVyRGVmaW5lZE9uQW5jZXN0b3IoXG4gICAgICAgIGNscyBhcyBzcGVjLkNsYXNzVHlwZSxcbiAgICAgICAgcHJvcCxcbiAgICAgICk7XG4gICAgICBpZiAoaW1wbGVtZW50ZWRJbkJhc2UgfHwgZGF0YXR5cGUgfHwgcHJveHkpIHtcbiAgICAgICAgLy8gT3ZlcnJpZGUgaWYgdGhlIHByb3BlcnR5IGlzIGluIGEgZGF0YXR5cGUgb3IgcHJveHkgY2xhc3Mgb3IgZGVjbGFyZWQgaW4gYSBwYXJlbnQgY2xhc3MuIElmIHRoZSBtZW1iZXIgaXNcbiAgICAgICAgLy8gc3RhdGljLCB1c2UgdGhlIFwibmV3XCIga2V5d29yZCBpbnN0ZWFkLCB0byBpbmRpY2F0ZSB3ZSBhcmUgaW50ZW50aW9uYWxseSBoaWRpbmcgdGhlIGFuY2VzdG9yIGRlY2xhcmF0aW9uIChhc1xuICAgICAgICAvLyBDIyBkb2VzIG5vdCBpbmhlcml0IHN0YXRpY3MsIHRoZXkgY2FuIGJlIGhpZGRlbiBidXQgbm90IG92ZXJyaWRkZW4pLlRoZSBcIm5ld1wiIGtleXdvcmQgaXMgb3B0aW9uYWwgaW4gdGhpc1xuICAgICAgICAvLyBjb250ZXh0LCBidXQgaGVscHMgY2xhcmlmeSBpbnRlbnRpb24uXG4gICAgICAgIGlzT3ZlcnJpZGVLZXlXb3JkID0gcHJvcC5zdGF0aWMgPyAnbmV3ICcgOiAnb3ZlcnJpZGUgJztcbiAgICAgIH0gZWxzZSBpZiAocHJvcC5hYnN0cmFjdCkge1xuICAgICAgICAvLyBBYnN0cmFjdCBtZW1iZXJzIGdldCBkZWNvcmF0ZWQgYXMgc3VjaFxuICAgICAgICBpc0Fic3RyYWN0S2V5d29yZCA9ICdhYnN0cmFjdCAnO1xuICAgICAgfSBlbHNlIGlmICghcHJvcC5zdGF0aWMgJiYgIWltcGxlbWVudGVkSW5CYXNlKSB7XG4gICAgICAgIC8vIFZpcnR1YWwgaWYgdGhlIHByb3AgaXMgbm90IHN0YXRpYywgYW5kIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiBiYXNlIG1lbWJlciwgdGhpcyB3YXkgd2UgY2FuIGxhdGVyIG92ZXJyaWRlIGl0LlxuICAgICAgICBpc1ZpcnR1YWxLZXlXb3JkID0gJ3ZpcnR1YWwgJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwcm9wVHlwZUZRTiA9IHRoaXMudHlwZXJlc29sdmVyLnRvRG90TmV0VHlwZShwcm9wLnR5cGUpO1xuICAgIGNvbnN0IGlzT3B0aW9uYWwgPSBwcm9wLm9wdGlvbmFsID8gJz8nIDogJyc7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gYCR7YWNjZXNzfSAke2lzQWJzdHJhY3RLZXl3b3JkfSR7aXNWaXJ0dWFsS2V5V29yZH0ke3N0YXRpY0tleVdvcmR9JHtpc092ZXJyaWRlS2V5V29yZH0ke3Byb3BUeXBlRlFOfSR7aXNPcHRpb25hbH0gJHtwcm9wTmFtZX1gO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soc3RhdGVtZW50KTtcblxuICAgIC8vIEVtaXQgZ2V0dGVyc1xuICAgIGlmIChkYXRhdHlwZSB8fCBwcm9wLmNvbnN0IHx8IHByb3AuYWJzdHJhY3QpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdnZXQ7Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBub24tb3B0aW9uYWwsIGFkZCBhIGJhbmcgdG8gc2lsZW5jZSBjb21waWxlciB3YXJuaW5nXG4gICAgICBjb25zdCBiYW5nID0gcHJvcC5vcHRpb25hbCA/ICcnIDogJyEnO1xuICAgICAgaWYgKHByb3Auc3RhdGljKSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICAgIGBnZXQgPT4gR2V0U3RhdGljUHJvcGVydHk8JHtwcm9wVHlwZUZRTn0ke2lzT3B0aW9uYWx9Pih0eXBlb2YoJHtjbGFzc05hbWV9KSkke2Jhbmd9O2AsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgICBgZ2V0ID0+IEdldEluc3RhbmNlUHJvcGVydHk8JHtwcm9wVHlwZUZRTn0ke2lzT3B0aW9uYWx9PigpJHtiYW5nfTtgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVtaXQgc2V0dGVyc1xuICAgIGlmIChkYXRhdHlwZSB8fCAoIXByb3AuaW1tdXRhYmxlICYmIHByb3AuYWJzdHJhY3QpKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnc2V0OycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXByb3AuaW1tdXRhYmxlKSB7XG4gICAgICAgIGlmIChwcm9wLnN0YXRpYykge1xuICAgICAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICAgICAgYHNldCA9PiBTZXRTdGF0aWNQcm9wZXJ0eSh0eXBlb2YoJHtjbGFzc05hbWV9KSwgdmFsdWUpO2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvZGUubGluZSgnc2V0ID0+IFNldEluc3RhbmNlUHJvcGVydHkodmFsdWUpOycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIHRoaXMuZmxhZ0ZpcnN0TWVtYmVyV3JpdHRlbih0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBhIGNvbnN0YW50IHByb3BlcnR5XG4gICAqL1xuICBwcml2YXRlIGVtaXRDb25zdFByb3BlcnR5KGNsczogc3BlYy5DbGFzc1R5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXROZXdMaW5lSWZOZWNlc3NhcnkoKTtcbiAgICB0aGlzLmZsYWdGaXJzdE1lbWJlcldyaXR0ZW4odHJ1ZSk7XG4gICAgY29uc3QgcHJvcFR5cGUgPSB0aGlzLnR5cGVyZXNvbHZlci50b0RvdE5ldFR5cGUocHJvcC50eXBlKTtcbiAgICBjb25zdCBpc09wdGlvbmFsID0gcHJvcC5vcHRpb25hbCA/ICc/JyA6ICcnO1xuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKHByb3AsIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IGNscy5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiBwcm9wLm5hbWUsXG4gICAgfSk7XG4gICAgdGhpcy5kb3RuZXRSdW50aW1lR2VuZXJhdG9yLmVtaXRBdHRyaWJ1dGVzRm9yUHJvcGVydHkocHJvcCk7XG4gICAgY29uc3QgYWNjZXNzID0gdGhpcy5yZW5kZXJBY2Nlc3NMZXZlbChwcm9wKTtcbiAgICBjb25zdCBwcm9wTmFtZSA9IHRoaXMubmFtZXV0aWxzLmNvbnZlcnRQcm9wZXJ0eU5hbWUocHJvcC5uYW1lKTtcbiAgICBjb25zdCBzdGF0aWNLZXl3b3JkID0gcHJvcC5zdGF0aWMgPyAnc3RhdGljICcgOiAnJztcblxuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgJHthY2Nlc3N9ICR7c3RhdGljS2V5d29yZH0ke3Byb3BUeXBlfSR7aXNPcHRpb25hbH0gJHtwcm9wTmFtZX1gLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2dldDsnKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHRoaXMudHlwZXJlc29sdmVyLnRvTmF0aXZlRnFuKGNscy5mcW4pO1xuICAgIC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBub24tb3B0aW9uYWwsIGFkZCBhIGJhbmcgdG8gc2lsZW5jZSB0aGUgY29tcGlsZXIgd2FybmluZ1xuICAgIGNvbnN0IGJhbmcgPSBwcm9wLm9wdGlvbmFsID8gJycgOiAnISc7XG4gICAgY29uc3QgaW5pdGlhbGl6ZXIgPSBwcm9wLnN0YXRpY1xuICAgICAgPyBgPSBHZXRTdGF0aWNQcm9wZXJ0eTwke3Byb3BUeXBlfT4odHlwZW9mKCR7Y2xhc3NOYW1lfSkpJHtiYW5nfTtgXG4gICAgICA6IGA9IEdldEluc3RhbmNlUHJvcGVydHk8JHtwcm9wVHlwZX0+KHR5cGVvZigke2NsYXNzTmFtZX0pKSR7YmFuZ307YDtcbiAgICB0aGlzLmNvZGUubGluZShpbml0aWFsaXplcik7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckFjY2Vzc0xldmVsKG1ldGhvZDogc3BlYy5NZXRob2QgfCBzcGVjLlByb3BlcnR5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gbWV0aG9kLnByb3RlY3RlZCA/ICdwcm90ZWN0ZWQnIDogJ3B1YmxpYyc7XG4gIH1cblxuICBwcml2YXRlIGlzTmVzdGVkKHR5cGU6IHNwZWMuVHlwZSk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5hc3NlbWJseS50eXBlcyB8fCAhdHlwZS5uYW1lc3BhY2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gYCR7dHlwZS5hc3NlbWJseX0uJHt0eXBlLm5hbWVzcGFjZX1gO1xuICAgIHJldHVybiBwYXJlbnQgaW4gdGhpcy5hc3NlbWJseS50eXBlcztcbiAgfVxuXG4gIHByaXZhdGUgdG9DU2hhcnBGaWxlUGF0aCh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0eXBlfS5jc2A7XG4gIH1cblxuICBwcml2YXRlIG9wZW5GaWxlSWZOZWVkZWQoXG4gICAgdHlwZU5hbWU6IHN0cmluZyxcbiAgICBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICBpc05lc3RlZDogYm9vbGVhbixcbiAgICB1c2luZ0RlcHV0eSA9IHRydWUsXG4gICk6IHZvaWQge1xuICAgIC8vIElmIE5lc3RlZCB0eXBlLCB3ZSBzaG91bGRuJ3Qgb3Blbi9jbG9zZSBhIGZpbGVcbiAgICBpZiAoaXNOZXN0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkb3RuZXRQYWNrYWdlSWQgPSB0aGlzLmFzc2VtYmx5LnRhcmdldHM/LmRvdG5ldD8ucGFja2FnZUlkO1xuICAgIGlmICghZG90bmV0UGFja2FnZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgbW9kdWxlICR7dGhpcy5hc3NlbWJseS5uYW1lfSBkb2VzIG5vdCBoYXZlIGEgZG90bmV0LnBhY2thZ2VJZCBzZXR0aW5nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGZpbGVQYXRoID0gbmFtZXNwYWNlLnJlcGxhY2UoL1suXS9nLCAnLycpO1xuICAgIHRoaXMuY29kZS5vcGVuRmlsZShcbiAgICAgIHBhdGguam9pbihkb3RuZXRQYWNrYWdlSWQsIGZpbGVQYXRoLCB0aGlzLnRvQ1NoYXJwRmlsZVBhdGgodHlwZU5hbWUpKSxcbiAgICApO1xuICAgIGlmICh1c2luZ0RlcHV0eSkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJ3VzaW5nIEFtYXpvbi5KU0lJLlJ1bnRpbWUuRGVwdXR5OycpO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB9XG5cbiAgICAvLyBTdXBwcmVzcyB3YXJuaW5ncyBhYm91dCBtaXNzaW5nIFhNTERvYywgT2Jzb2xldGUgaW5jb25zaXN0ZW5jaWVzXG4gICAgdGhpcy5jb2RlLmxpbmUoJyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIENTMDY3MixDUzA4MDksQ1MxNTkxJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcblxuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYG5hbWVzcGFjZSAke25hbWVzcGFjZX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VGaWxlSWZOZWVkZWQoXG4gICAgdHlwZU5hbWU6IHN0cmluZyxcbiAgICBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICBpc05lc3RlZDogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgaWYgKGlzTmVzdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICBjb25zdCBkb3RuZXRQYWNrYWdlSWQgPSB0aGlzLmFzc2VtYmx5LnRhcmdldHM/LmRvdG5ldD8ucGFja2FnZUlkO1xuICAgIGlmICghZG90bmV0UGFja2FnZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgbW9kdWxlICR7dGhpcy5hc3NlbWJseS5uYW1lfSBkb2VzIG5vdCBoYXZlIGEgZG90bmV0LnBhY2thZ2VJZCBzZXR0aW5nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGZpbGVQYXRoID0gbmFtZXNwYWNlLnJlcGxhY2UoL1suXS9nLCAnLycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUoXG4gICAgICBwYXRoLmpvaW4oZG90bmV0UGFja2FnZUlkLCBmaWxlUGF0aCwgdGhpcy50b0NTaGFycEZpbGVQYXRoKHR5cGVOYW1lKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGZpcnN0TWVtYmVyIGJvb2xlYW4gZmxhZyB0byBrZWVwIHRyYWNrIG9mIHRoZSBmaXJzdCBtZW1iZXIgb2YgYSBuZXcgZmlsZVxuICAgKlxuICAgKiBUaGlzIGF2b2lkcyB1bm5lY2Vzc2FyeSB3aGl0ZSBsaW5lc1xuICAgKi9cbiAgcHJpdmF0ZSBmbGFnRmlyc3RNZW1iZXJXcml0dGVuKGZpcnN0OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5maXJzdE1lbWJlcldyaXR0ZW4gPSBmaXJzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBhIG5ldyBsaW5lIHByaW9yIHRvIHdyaXRpbmcgYSBuZXcgcHJvcGVydHksIG1ldGhvZCwgaWYgdGhlIHByb3BlcnR5IGlzIG5vdCB0aGUgZmlyc3Qgb25lIGluIHRoZSBjbGFzc1xuICAgKlxuICAgKiBUaGlzIGF2b2lkcyB1bm5lY2Vzc2FyeSB3aGl0ZSBsaW5lcy5cbiAgICovXG4gIHByaXZhdGUgZW1pdE5ld0xpbmVJZk5lY2Vzc2FyeSgpOiB2b2lkIHtcbiAgICAvLyBJZiB0aGUgZmlyc3QgbWVtYmVyIGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbiwgaXQgaXMgc2FmZSB0byB3cml0ZSBhIG5ldyBsaW5lXG4gICAgaWYgKHRoaXMuZmlyc3RNZW1iZXJXcml0dGVuKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpcnN0TWVtYmVyV3JpdHRlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdEFzc2VtYmx5RG9jcygpIHtcbiAgICB0aGlzLmVtaXROYW1lc3BhY2VEb2NzKFxuICAgICAgdGhpcy5hc3NlbWJseS50YXJnZXRzIS5kb3RuZXQhLm5hbWVzcGFjZSxcbiAgICAgIHRoaXMuYXNzZW1ibHkubmFtZSxcbiAgICAgIHRoaXMuYXNzZW1ibHksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IGFuIHVudXNlZCwgZW1wdHkgY2xhc3MgY2FsbGVkIGBOYW1lc3BhY2VEb2NgIHRvIGF0dGFjaCB0aGUgbW9kdWxlIFJFQURNRSB0b1xuICAgKlxuICAgKiBUaGVyZSBpcyBubyB3YXkgdG8gYXR0YWNoIGRvYyBjb21tZW50cyB0byBhIG5hbWVzcGFjZSBpbiBDIywgYW5kIHRoaXMgdHJpY2sgaGFzIGJlZW5cbiAgICogc2VtaS1zdGFuZGFyZGl6ZWQgYnkgTkRvYyBhbmQgU2FuZGNhc3RsZSBIZWxwIEZpbGUgQnVpbGRlci5cbiAgICpcbiAgICogRG9jRlggZG9lc24ndCBzdXBwb3J0IGl0IG91dCBvZiB0aGUgYm94LCBidXQgd2Ugc2hvdWxkIGJlIGFibGUgdG8gZ2V0IHRoZXJlIHdpdGggYVxuICAgKiBiaXQgb2YgaGFja2VyeS5cbiAgICpcbiAgICogSW4gYW55IGNhc2UsIHdlIG5lZWQgYSBwbGFjZSB0byBhdHRhY2ggdGhlIGRvY3Mgd2hlcmUgdGhleSBjYW4gYmUgdHJhbnNwb3J0ZWQgYXJvdW5kLFxuICAgKiBtaWdodCBhcyB3ZWxsIGJlIHRoaXMgbWV0aG9kLlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0TmFtZXNwYWNlRG9jcyhcbiAgICBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICBqc2lpRnFuOiBzdHJpbmcsXG4gICAgZG9jU291cmNlOiBzcGVjLlRhcmdldGFibGUsXG4gICkge1xuICAgIGlmICghZG9jU291cmNlLnJlYWRtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9ICdOYW1lc3BhY2VEb2MnO1xuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZChjbGFzc05hbWUsIG5hbWVzcGFjZSwgZmFsc2UsIGZhbHNlKTtcblxuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXRNYXJrZG93bkFzUmVtYXJrcyhkb2NTb3VyY2UucmVhZG1lLm1hcmtkb3duLCB7XG4gICAgICBhcGk6ICdtb2R1bGVSZWFkbWUnLFxuICAgICAgbW9kdWxlRnFuOiBqc2lpRnFuLFxuICAgIH0pO1xuICAgIHRoaXMuZW1pdEhpZGVBdHRyaWJ1dGUoKTtcbiAgICAvLyBUcmFkaXRpb25hbGx5IHRoaXMgY2xhc3MgaXMgbWFkZSAnaW50ZXJuYWwnLCBidXQgdGhhdCBpbnRlcmFjdHMgcG9vcmx5IHdpdGggRG9jRlgncyBkZWZhdWx0IGZpbHRlcnNcbiAgICAvLyB3aGljaCBhcmVuJ3Qgb3ZlcnJpZGFibGUuIFNvIHdlIG1ha2UgaXQgcHVibGljLCBidXQgdXNlIGF0dHJpYnV0ZXMgdG8gaGlkZSBpdCBmcm9tIHVzZXJzJyBJbnRlbGxpU2Vuc2UsXG4gICAgLy8gc28gdGhhdCB3ZSBjYW4gYWNjZXNzIHRoZSBjbGFzcyBpbiBEb2NGWC5cbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBwdWJsaWMgY2xhc3MgJHtjbGFzc05hbWV9YCk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNsb3NlRmlsZUlmTmVlZGVkKGNsYXNzTmFtZSwgbmFtZXNwYWNlLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdCBhbiBhdHRyaWJ1dGUgdGhhdCB3aWxsIGhpZGUgdGhlIHN1YnNlcXVlbnQgQVBJIGVsZW1lbnQgZnJvbSB1c2Vyc1xuICAgKi9cbiAgcHJpdmF0ZSBlbWl0SGlkZUF0dHJpYnV0ZSgpIHtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICdbU3lzdGVtLkNvbXBvbmVudE1vZGVsLkVkaXRvckJyb3dzYWJsZShTeXN0ZW0uQ29tcG9uZW50TW9kZWwuRWRpdG9yQnJvd3NhYmxlU3RhdGUuTmV2ZXIpXScsXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
883
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90bmV0Z2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZG90bmV0Z2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFtQztBQUNuQywrQkFBK0I7QUFDL0IsK0JBQStCO0FBRy9CLDZCQUE2QjtBQUU3QiwrQ0FBc0Q7QUFFdEQsNkRBQTBEO0FBQzFELHFFQUFrRTtBQUNsRSw2REFBMEQ7QUFDMUQsbURBQWdEO0FBQ2hELDJDQUE4QztBQUU5Qzs7R0FFRztBQUNILE1BQWEsZUFBZ0IsU0FBUSxxQkFBUztJQVk1QyxZQUNtQixnQ0FBMEMsRUFDMUMsT0FBZ0I7UUFFakMsS0FBSyxFQUFFLENBQUM7UUFIUyxxQ0FBZ0MsR0FBaEMsZ0NBQWdDLENBQVU7UUFDMUMsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQWJuQywyRUFBMkU7UUFDbkUsdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBSWxCLGNBQVMsR0FBb0IsSUFBSSwyQkFBZSxFQUFFLENBQUM7UUFZbEUsb0dBQW9HO1FBQ3BHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsSUFBSTtZQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJLENBQ2YsV0FBbUIsRUFDbkIsUUFBMEI7UUFFMUIsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRLENBQUMsV0FBb0I7UUFDbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHVDQUFrQixDQUN4QyxJQUFJLENBQUMsUUFBUSxFQUNiLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxF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LEVBQUUsT0FBTztTQUNuQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixzR0FBc0c7UUFDdEcsMEdBQTBHO1FBQzFHLDRDQUE0QztRQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7T0FFRztJQUNLLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWiwyRkFBMkYsQ0FDNUYsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXRwQ0QsMENBc3BDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHNwZWMgZnJvbSAnQGpzaWkvc3BlYyc7XG5pbXBvcnQgKiBhcyBjbG9uZSBmcm9tICdjbG9uZSc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyByZWZsZWN0IGZyb20gJ2pzaWktcmVmbGVjdCc7XG5pbXBvcnQgeyBSb3NldHRhIH0gZnJvbSAnanNpaS1yb3NldHRhJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IEdlbmVyYXRvciwgTGVnYWxlc2UgfSBmcm9tICcuLi8uLi9nZW5lcmF0b3InO1xuaW1wb3J0IHsgTWV0aG9kRGVmaW5pdGlvbiwgUHJvcGVydHlEZWZpbml0aW9uIH0gZnJvbSAnLi4vX3V0aWxzJztcbmltcG9ydCB7IERvdE5ldERvY0dlbmVyYXRvciB9IGZyb20gJy4vZG90bmV0ZG9jZ2VuZXJhdG9yJztcbmltcG9ydCB7IERvdE5ldFJ1bnRpbWVHZW5lcmF0b3IgfSBmcm9tICcuL2RvdG5ldHJ1bnRpbWVnZW5lcmF0b3InO1xuaW1wb3J0IHsgRG90TmV0VHlwZVJlc29sdmVyIH0gZnJvbSAnLi9kb3RuZXR0eXBlcmVzb2x2ZXInO1xuaW1wb3J0IHsgRmlsZUdlbmVyYXRvciB9IGZyb20gJy4vZmlsZWdlbmVyYXRvcic7XG5pbXBvcnQgeyBEb3ROZXROYW1lVXRpbHMgfSBmcm9tICcuL25hbWV1dGlscyc7XG5cbi8qKlxuICogQ09ERSBHRU5FUkFUT1IgVjJcbiAqL1xuZXhwb3J0IGNsYXNzIERvdE5ldEdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7XG4gIC8vIEZsYWdzIHRoYXQgdHJhY2tzIGlmIHdlIGhhdmUgYWxyZWFkeSB3cm90ZSB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBjbGFzc1xuICBwcml2YXRlIGZpcnN0TWVtYmVyV3JpdHRlbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgdHlwZXJlc29sdmVyITogRG90TmV0VHlwZVJlc29sdmVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbmFtZXV0aWxzOiBEb3ROZXROYW1lVXRpbHMgPSBuZXcgRG90TmV0TmFtZVV0aWxzKCk7XG5cbiAgcHJpdmF0ZSBkb3RuZXRSdW50aW1lR2VuZXJhdG9yITogRG90TmV0UnVudGltZUdlbmVyYXRvcjtcblxuICBwcml2YXRlIGRvdG5ldERvY0dlbmVyYXRvciE6IERvdE5ldERvY0dlbmVyYXRvcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBhc3NlbWJsaWVzQ3VycmVudGx5QmVpbmdDb21waWxlZDogc3RyaW5nW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3NldHRhOiBSb3NldHRhLFxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gT3ZlcnJpZGUgdGhlIG9wZW5CbG9jayB0byBnZXQgYSBjb3JyZWN0IEMjIGxvb2tpbmcgY29kZSBibG9jayB3aXRoIHRoZSBjdXJseSBicmFjZSBhZnRlciB0aGUgbGluZVxuICAgIHRoaXMuY29kZS5vcGVuQmxvY2sgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgICAgdGhpcy5saW5lKHRleHQpO1xuICAgICAgdGhpcy5vcGVuKCd7Jyk7XG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2FkKFxuICAgIHBhY2thZ2VSb290OiBzdHJpbmcsXG4gICAgYXNzZW1ibHk6IHJlZmxlY3QuQXNzZW1ibHksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLmxvYWQocGFja2FnZVJvb3QsIGFzc2VtYmx5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBnZW5lcmF0b3IgKGluLW1lbW9yeSkuXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGUoZmluZ2VycHJpbnQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnR5cGVyZXNvbHZlciA9IG5ldyBEb3ROZXRUeXBlUmVzb2x2ZXIoXG4gICAgICB0aGlzLmFzc2VtYmx5LFxuICAgICAgKGZxbjogc3RyaW5nKSA9PiB0aGlzLmZpbmRNb2R1bGUoZnFuKSxcbiAgICAgIChmcW46IHN0cmluZykgPT4gdGhpcy5maW5kVHlwZShmcW4pLFxuICAgICAgdGhpcy5hc3NlbWJsaWVzQ3VycmVudGx5QmVpbmdDb21waWxlZCxcbiAgICApO1xuXG4gICAgdGhpcy5kb3RuZXRSdW50aW1lR2VuZXJhdG9yID0gbmV3IERvdE5ldFJ1bnRpbWVHZW5lcmF0b3IoXG4gICAgICB0aGlzLmNvZGUsXG4gICAgICB0aGlzLnR5cGVyZXNvbHZlcixcbiAgICApO1xuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yID0gbmV3IERvdE5ldERvY0dlbmVyYXRvcihcbiAgICAgIHRoaXMuY29kZSxcbiAgICAgIHRoaXMucm9zZXR0YSxcbiAgICAgIHRoaXMuYXNzZW1ibHksXG4gICAgKTtcblxuICAgIHRoaXMuZW1pdEFzc2VtYmx5RG9jcygpO1xuXG4gICAgLy8gV2UgbmVlZCB0byByZXNvbHZlIHRoZSBkZXBlbmRlbmN5IHRyZWVcbiAgICB0aGlzLnR5cGVyZXNvbHZlci5yZXNvbHZlTmFtZXNwYWNlc0RlcGVuZGVuY2llcygpO1xuICAgIHN1cGVyLmdlbmVyYXRlKGZpbmdlcnByaW50KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzYXZlKFxuICAgIG91dGRpcjogc3RyaW5nLFxuICAgIHRhcmJhbGw6IHN0cmluZyxcbiAgICB7IGxpY2Vuc2UsIG5vdGljZSB9OiBMZWdhbGVzZSxcbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIC8vIEdlbmVyYXRpbmcgdGhlIGNzcHJvaiBhbmQgQXNzZW1ibHlJbmZvLmNzIGZpbGVzXG4gICAgY29uc3QgdGFyYmFsbEZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZSh0YXJiYWxsKTtcbiAgICBjb25zdCBmaWxlZ2VuID0gbmV3IEZpbGVHZW5lcmF0b3IoXG4gICAgICB0aGlzLmFzc2VtYmx5LFxuICAgICAgdGFyYmFsbEZpbGVOYW1lLFxuICAgICAgdGhpcy5jb2RlLFxuICAgICk7XG4gICAgZmlsZWdlbi5nZW5lcmF0ZUFzc2VtYmx5SW5mb0ZpbGUoKTtcbiAgICBmaWxlZ2VuLmdlbmVyYXRlUHJvamVjdEZpbGUodGhpcy50eXBlcmVzb2x2ZXIubmFtZXNwYWNlRGVwZW5kZW5jaWVzKTtcbiAgICAvLyBDYWxsaW5nIHN1cGVyLnNhdmUoKSBkdW1wcyB0aGUgdGFyYmFsbCBpbiB0aGUgZm9ybWF0IG5hbWVAdmVyc2lvbi5qc2lpLnRnei5cbiAgICAvLyBUaGlzIGlzIG5vdCBpbiBzeW5jIHdpdGggdGhlIE9sZCAuTkVUIGdlbmVyYXRvciB3aGVyZSB0aGUgbmFtZSBpcyBzY29wZS1uYW1lLXZlcnNpb24udGd6LlxuICAgIC8vIEhlbmNlIHdlIGFyZSBzYXZpbmcgdGhlIGZpbGVzIG91cnNlbHZlcyBoZXJlOlxuICAgIGNvbnN0IGFzc20gPSB0aGlzLmFzc2VtYmx5O1xuICAgIGNvbnN0IHBhY2thZ2VJZDogc3RyaW5nID0gYXNzbS50YXJnZXRzIS5kb3RuZXQhLnBhY2thZ2VJZDtcbiAgICBpZiAoIXBhY2thZ2VJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIG1vZHVsZSAke2Fzc20ubmFtZX0gZG9lcyBub3QgaGF2ZSBhIGRvdG5ldC5wYWNrYWdlSWQgc2V0dGluZ2AsXG4gICAgICApO1xuICAgIH1cbiAgICBhd2FpdCBmcy5ta2RpcnAocGF0aC5qb2luKG91dGRpciwgcGFja2FnZUlkKSk7XG4gICAgYXdhaXQgZnMuY29weUZpbGUodGFyYmFsbCwgcGF0aC5qb2luKG91dGRpciwgcGFja2FnZUlkLCB0YXJiYWxsRmlsZU5hbWUpKTtcblxuICAgIC8vIENyZWF0ZSBhbiBhbmNob3IgZmlsZSBmb3IgdGhlIGN1cnJlbnQgbW9kZWxcbiAgICB0aGlzLmdlbmVyYXRlRGVwZW5kZW5jeUFuY2hvckZpbGUoKTtcblxuICAgIGlmIChsaWNlbnNlKSB7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKG91dGRpciwgcGFja2FnZUlkLCAnTElDRU5TRScpLCBsaWNlbnNlLCB7XG4gICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKG5vdGljZSkge1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihvdXRkaXIsIHBhY2thZ2VJZCwgJ05PVElDRScpLCBub3RpY2UsIHtcbiAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFNhdmluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuXG4gICAgcmV0dXJuIHRoaXMuY29kZS5zYXZlKG91dGRpcik7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHRoZSBhbmNob3IgZmlsZVxuICAgKi9cbiAgcHJvdGVjdGVkIGdlbmVyYXRlRGVwZW5kZW5jeUFuY2hvckZpbGUoKSB7XG4gICAgY29uc3QgbmFtZXNwYWNlID0gYCR7XG4gICAgICB0aGlzLmFzc2VtYmx5LnRhcmdldHMhLmRvdG5ldCEubmFtZXNwYWNlXG4gICAgfS5JbnRlcm5hbC5EZXBlbmRlbmN5UmVzb2x1dGlvbmA7XG4gICAgdGhpcy5vcGVuRmlsZUlmTmVlZGVkKCdBbmNob3InLCBuYW1lc3BhY2UsIGZhbHNlLCBmYWxzZSk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jaygncHVibGljIHNlYWxlZCBjbGFzcyBBbmNob3InKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCdwdWJsaWMgQW5jaG9yKCknKTtcbiAgICB0aGlzLnR5cGVyZXNvbHZlci5uYW1lc3BhY2VEZXBlbmRlbmNpZXMuZm9yRWFjaCgodmFsdWUpID0+XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYG5ldyAke3ZhbHVlLm5hbWVzcGFjZX0uSW50ZXJuYWwuRGVwZW5kZW5jeVJlc29sdXRpb24uQW5jaG9yKCk7YCxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jbG9zZUZpbGVJZk5lZWRlZCgnQW5jaG9yJywgbmFtZXNwYWNlLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogTm90IHVzZWQgYXMgd2Ugb3ZlcnJpZGUgdGhlIHNhdmUoKSBtZXRob2RcbiAgICovXG4gIHByb3RlY3RlZCBnZXRBc3NlbWJseU91dHB1dERpcihtb2Q6IHNwZWMuQXNzZW1ibHkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5hbWV1dGlscy5jb252ZXJ0UGFja2FnZU5hbWUobW9kLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hbWVzcGFjZXMgYXJlIGhhbmRsZWQgaW1wbGljaXRseSBieSBvcGVuRmlsZUlmTmVlZGVkKCkuXG4gICAqXG4gICAqIERvIGdlbmVyYXRlIGRvY3MgaWYgdGhpcyBpcyBmb3IgYSBzdWJtb2R1bGUgdGhvdWdoLlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uQmVnaW5OYW1lc3BhY2UoanNpaU5zOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzdWJtb2R1bGUgPSB0aGlzLmFzc2VtYmx5LnN1Ym1vZHVsZXM/Lltqc2lpTnNdO1xuICAgIGlmIChzdWJtb2R1bGUpIHtcbiAgICAgIGNvbnN0IGRvdG5ldE5zID0gdGhpcy50eXBlcmVzb2x2ZXIucmVzb2x2ZU5hbWVzcGFjZShcbiAgICAgICAgdGhpcy5hc3NlbWJseSxcbiAgICAgICAgdGhpcy5hc3NlbWJseS5uYW1lLFxuICAgICAgICAvLyBTdHJpcCB0aGUgYCR7YXNzbU5hbWV9LmAgcHJlZml4IGhlcmUsIGFzIHRoZSBcImFzc2VtYmx5LXJlbGF0aXZlXCIgTlNcbiAgICAgICAgLy8gaXMgZXhwZWN0ZWQgYnkgYHRoaXMudHlwZVJlc29sdmVyLnJlc292bGVOYW1lc3BhY2VgLlxuICAgICAgICBqc2lpTnMuc3Vic3RyKHRoaXMuYXNzZW1ibHkubmFtZS5sZW5ndGggKyAxKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmVtaXROYW1lc3BhY2VEb2NzKGRvdG5ldE5zLCBqc2lpTnMsIHN1Ym1vZHVsZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kTmFtZXNwYWNlKF9uczogc3RyaW5nKSB7XG4gICAgLyogbm9vcCAqL1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5JbnRlcmZhY2UoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUpIHtcbiAgICBjb25zdCBpbXBsZW1lbnRhdGlvbnMgPSB0aGlzLnR5cGVyZXNvbHZlci5yZXNvbHZlSW1wbGVtZW50ZWRJbnRlcmZhY2VzKGlmYyk7XG4gICAgY29uc3QgaW50ZXJmYWNlTmFtZSA9IHRoaXMubmFtZXV0aWxzLmNvbnZlcnRJbnRlcmZhY2VOYW1lKGlmYyk7XG4gICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2VGb3IodGhpcy5hc3NlbWJseSwgaWZjKTtcbiAgICB0aGlzLm9wZW5GaWxlSWZOZWVkZWQoaW50ZXJmYWNlTmFtZSwgbmFtZXNwYWNlLCB0aGlzLmlzTmVzdGVkKGlmYykpO1xuXG4gICAgdGhpcy5kb3RuZXREb2NHZW5lcmF0b3IuZW1pdERvY3MoaWZjLCB7IGFwaTogJ3R5cGUnLCBmcW46IGlmYy5mcW4gfSk7XG4gICAgdGhpcy5kb3RuZXRSdW50aW1lR2VuZXJhdG9yLmVtaXRBdHRyaWJ1dGVzRm9ySW50ZXJmYWNlKGlmYyk7XG5cbiAgICBpZiAoaW1wbGVtZW50YXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAgIGBwdWJsaWMgaW50ZXJmYWNlICR7aW50ZXJmYWNlTmFtZX0gOiAke2ltcGxlbWVudGF0aW9ucy5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBwdWJsaWMgaW50ZXJmYWNlICR7aW50ZXJmYWNlTmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5mbGFnRmlyc3RNZW1iZXJXcml0dGVuKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZEludGVyZmFjZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIC8vIGVtaXQgaW50ZXJmYWNlIHByb3h5IGNsYXNzXG4gICAgdGhpcy5lbWl0SW50ZXJmYWNlUHJveHkoaWZjKTtcblxuICAgIGNvbnN0IGludGVyZmFjZU5hbWUgPSB0aGlzLm5hbWV1dGlscy5jb252ZXJ0SW50ZXJmYWNlTmFtZShpZmMpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2VGb3IodGhpcy5hc3NlbWJseSwgaWZjKTtcbiAgICB0aGlzLmNsb3NlRmlsZUlmTmVlZGVkKGludGVyZmFjZU5hbWUsIG5hbWVzcGFjZSwgdGhpcy5pc05lc3RlZChpZmMpKTtcblxuICAgIC8vIGVtaXQgaW1wbGVtZW50YXRpb24gY2xhc3NcbiAgICAvLyBUT0RPOiBJZiBkYXRhdHlwZSB0aGVuIHdlIG1heSBub3QgbmVlZCB0aGUgaW50ZXJmYWNlIHByb3h5IHRvIGJlIGNyZWF0ZWQsIFdlIGNvdWxkIGRvIHdpdGgganVzdCB0aGUgaW50ZXJmYWNlIGltcGw/XG4gICAgaWYgKGlmYy5kYXRhdHlwZSkge1xuICAgICAgdGhpcy5lbWl0SW50ZXJmYWNlRGF0YVR5cGUoaWZjKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VNZXRob2QoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsIG1ldGhvZDogc3BlYy5NZXRob2QpIHtcbiAgICB0aGlzLmRvdG5ldERvY0dlbmVyYXRvci5lbWl0RG9jcyhtZXRob2QsIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IGlmYy5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiBtZXRob2QubmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdEF0dHJpYnV0ZXNGb3JNZXRob2QoaWZjLCBtZXRob2QpO1xuICAgIGNvbnN0IHJldHVyblR5cGUgPSBtZXRob2QucmV0dXJuc1xuICAgICAgPyB0aGlzLnR5cGVyZXNvbHZlci50b0RvdE5ldFR5cGUobWV0aG9kLnJldHVybnMudHlwZSlcbiAgICAgIDogJ3ZvaWQnO1xuICAgIGNvbnN0IG51bGxhYmxlID0gbWV0aG9kLnJldHVybnM/Lm9wdGlvbmFsID8gJz8nIDogJyc7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgJHtyZXR1cm5UeXBlfSR7bnVsbGFibGV9ICR7dGhpcy5uYW1ldXRpbHMuY29udmVydE1ldGhvZE5hbWUoXG4gICAgICAgIG1ldGhvZC5uYW1lLFxuICAgICAgKX0oJHt0aGlzLnJlbmRlck1ldGhvZFBhcmFtZXRlcnMobWV0aG9kKX0pO2AsXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZU1ldGhvZE92ZXJsb2FkKFxuICAgIGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlLFxuICAgIG92ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aGlzLm9uSW50ZXJmYWNlTWV0aG9kKGlmYywgb3ZlcmxvYWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW50ZXJmYWNlUHJvcGVydHkoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICBpZiAoIXByb3AuYWJzdHJhY3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJmYWNlIHByb3BlcnRpZXMgbXVzdCBiZSBhYnN0cmFjdDogJHtwcm9wLm5hbWV9YCk7XG4gICAgfVxuXG4gICAgaWYgKHByb3AucHJvdGVjdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBQcm90ZWN0ZWQgcHJvcGVydGllcyBhcmUgbm90IGFsbG93ZWQgb24gaW50ZXJmYWNlczogJHtwcm9wLm5hbWV9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHByb3Auc3RhdGljKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBQcm9wZXJ0eSAke2lmYy5uYW1lfS4ke3Byb3AubmFtZX0gaXMgbWFya2VkIGFzIHN0YXRpYywgYnV0IGludGVyZmFjZXMgbXVzdCBub3QgY29udGFpbiBzdGF0aWMgbWVtYmVycy5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmVtaXROZXdMaW5lSWZOZWNlc3NhcnkoKTtcbiAgICB0aGlzLmRvdG5ldERvY0dlbmVyYXRvci5lbWl0RG9jcyhwcm9wLCB7XG4gICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgZnFuOiBpZmMuZnFuLFxuICAgICAgbWVtYmVyTmFtZTogcHJvcC5uYW1lLFxuICAgIH0pO1xuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0QXR0cmlidXRlc0ZvclByb3BlcnR5KHByb3ApO1xuXG4gICAgY29uc3QgcHJvcFR5cGUgPSB0aGlzLnR5cGVyZXNvbHZlci50b0RvdE5ldFR5cGUocHJvcC50eXBlKTtcbiAgICBjb25zdCBwcm9wTmFtZSA9IHRoaXMubmFtZXV0aWxzLmNvbnZlcnRQcm9wZXJ0eU5hbWUocHJvcC5uYW1lKTtcblxuICAgIGlmIChwcm9wLm9wdGlvbmFsKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnW0FtYXpvbi5KU0lJLlJ1bnRpbWUuRGVwdXR5LkpzaWlPcHRpb25hbF0nKTtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWZ5aW5nIHRoYXQgYSB0eXBlIGlzIG51bGxhYmxlIGlzIG9ubHkgcmVxdWlyZWQgZm9yIHByaW1pdGl2ZSB2YWx1ZSB0eXBlc1xuICAgIGNvbnN0IGlzT3B0aW9uYWwgPSBwcm9wLm9wdGlvbmFsID8gJz8nIDogJyc7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgJHtwcm9wVHlwZX0ke2lzT3B0aW9uYWx9ICR7cHJvcE5hbWV9YCk7XG5cbiAgICBpZiAocHJvcC5vcHRpb25hbCkge1xuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jaygnZ2V0Jyk7XG4gICAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIG51bGw7Jyk7XG4gICAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgICAgaWYgKCFwcm9wLmltbXV0YWJsZSkge1xuICAgICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCdzZXQnKTtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgICAgYHRocm93IG5ldyBTeXN0ZW0uTm90U3VwcG9ydGVkRXhjZXB0aW9uKFwiJ3NldCcgZm9yICcke3Byb3BOYW1lfScgaXMgbm90IGltcGxlbWVudGVkXCIpO2AsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdnZXQ7Jyk7XG4gICAgICBpZiAoIXByb3AuaW1tdXRhYmxlKSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKCdzZXQ7Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmZsYWdGaXJzdE1lbWJlcldyaXR0ZW4odHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkNsYXNzKGNsczogc3BlYy5DbGFzc1R5cGUsIGFic3RyYWN0OiBib29sZWFuKSB7XG4gICAgbGV0IGJhc2VUeXBlTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2VGb3IodGhpcy5hc3NlbWJseSwgY2xzKTtcblxuICAgIC8vIEEgY2xhc3MgY2FuIGRlcml2ZSBmcm9tIG9ubHkgb25lIGJhc2UgY2xhc3NcbiAgICAvLyBCdXQgY2FuIGltcGxlbWVudCBtdWx0aXBsZSBpbnRlcmZhY2VzXG4gICAgaWYgKCFjbHMuYmFzZSkge1xuICAgICAgYmFzZVR5cGVOYW1lcy5wdXNoKCdEZXB1dHlCYXNlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNsYXNzQmFzZSA9IHRoaXMudHlwZXJlc29sdmVyLnRvRG90TmV0VHlwZSh7IGZxbjogY2xzLmJhc2UgfSk7XG4gICAgICBiYXNlVHlwZU5hbWVzLnB1c2goY2xhc3NCYXNlKTtcbiAgICB9XG5cbiAgICBpZiAoY2xzLmludGVyZmFjZXMgJiYgY2xzLmludGVyZmFjZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaW1wbGVtZW50YXRpb25zID1cbiAgICAgICAgdGhpcy50eXBlcmVzb2x2ZXIucmVzb2x2ZUltcGxlbWVudGVkSW50ZXJmYWNlcyhjbHMpO1xuICAgICAgYmFzZVR5cGVOYW1lcyA9IGJhc2VUeXBlTmFtZXMuY29uY2F0KGltcGxlbWVudGF0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydENsYXNzTmFtZShjbHMpO1xuXG4gICAgLy8gTmVzdGVkIGNsYXNzZXMgd2lsbCBiZSBkZWFsdCB3aXRoIGR1cmluZyBjYWxjIGNvZGUgZ2VuZXJhdGlvblxuICAgIGNvbnN0IG5lc3RlZCA9IHRoaXMuaXNOZXN0ZWQoY2xzKTtcbiAgICBjb25zdCBhYnNQcmVmaXggPSBhYnN0cmFjdCA/ICcgYWJzdHJhY3QnIDogJyc7XG5cbiAgICB0aGlzLm9wZW5GaWxlSWZOZWVkZWQoY2xhc3NOYW1lLCBuYW1lc3BhY2UsIG5lc3RlZCk7XG5cbiAgICBjb25zdCBpbXBsZW1lbnRzRXhwciA9IGAgOiAke2Jhc2VUeXBlTmFtZXMuam9pbignLCAnKX1gO1xuXG4gICAgdGhpcy5kb3RuZXREb2NHZW5lcmF0b3IuZW1pdERvY3MoY2xzLCB7XG4gICAgICBhcGk6ICd0eXBlJyxcbiAgICAgIGZxbjogY2xzLmZxbixcbiAgICB9KTtcblxuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0QXR0cmlidXRlc0ZvckNsYXNzKGNscyk7XG5cbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHB1YmxpYyR7YWJzUHJlZml4fSBjbGFzcyAke2NsYXNzTmFtZX0ke2ltcGxlbWVudHNFeHByfWAsXG4gICAgKTtcblxuICAgIC8vIENvbXB1dGUgdGhlIGNsYXNzIHBhcmFtZXRlcnNcbiAgICBsZXQgcGFyYW1ldGVyc0RlZmluaXRpb24gPSAnJztcbiAgICBsZXQgcGFyYW1ldGVyc0Jhc2UgPSAnJztcbiAgICBjb25zdCBpbml0aWFsaXplciA9IGNscy5pbml0aWFsaXplcjtcbiAgICBpZiAoaW5pdGlhbGl6ZXIpIHtcbiAgICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKGluaXRpYWxpemVyLCB7XG4gICAgICAgIGFwaTogJ2luaXRpYWxpemVyJyxcbiAgICAgICAgZnFuOiBjbHMuZnFuLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdERlcHJlY2F0ZWRBdHRyaWJ1dGVJZk5lY2Vzc2FyeShcbiAgICAgICAgaW5pdGlhbGl6ZXIsXG4gICAgICApO1xuICAgICAgaWYgKGluaXRpYWxpemVyLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgcGFyYW1ldGVyc0RlZmluaXRpb24gPSB0aGlzLnJlbmRlclBhcmFtZXRlcnNTdHJpbmcoXG4gICAgICAgICAgaW5pdGlhbGl6ZXIucGFyYW1ldGVycyxcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIGluaXRpYWxpemVyLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICBwYXJhbWV0ZXJzQmFzZSArPSBgJHt0aGlzLm5hbWV1dGlscy5jb252ZXJ0UGFyYW1ldGVyTmFtZShwLm5hbWUpfWA7XG4gICAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIGxhc3QgcGFyYW1ldGVyLCBhcHBlbmQgLFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGluaXRpYWxpemVyLnBhcmFtZXRlcnMuaW5kZXhPZihwKSAhPT1cbiAgICAgICAgICAgIGluaXRpYWxpemVyLnBhcmFtZXRlcnMubGVuZ3RoIC0gMVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcGFyYW1ldGVyc0Jhc2UgKz0gJywgJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHRoZSBjb25zdHJ1Y3RvcnM6XG4gICAgICAvLyBBYnN0cmFjdCBjbGFzc2VzIGhhdmUgcHJvdGVjdGVkIGNvbnN0cnVjdG9ycy5cbiAgICAgIGNvbnN0IHZpc2liaWxpdHkgPSBjbHMuYWJzdHJhY3QgPyAncHJvdGVjdGVkJyA6ICdwdWJsaWMnO1xuXG4gICAgICBjb25zdCBhcmdzID1cbiAgICAgICAgcGFyYW1ldGVyc0Jhc2UubGVuZ3RoID4gMFxuICAgICAgICAgID8gYG5ldyBvYmplY3Q/W117JHtwYXJhbWV0ZXJzQmFzZX19YFxuICAgICAgICAgIDogYFN5c3RlbS5BcnJheS5FbXB0eTxvYmplY3Q/PigpYDtcbiAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAgIGAke3Zpc2liaWxpdHl9ICR7Y2xhc3NOYW1lfSgke3BhcmFtZXRlcnNEZWZpbml0aW9ufSk6IGJhc2UobmV3IERlcHV0eVByb3BzKCR7YXJnc30pKWAsXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnLy8vIDxzdW1tYXJ5PlVzZWQgYnkganNpaSB0byBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIGEgSmF2YXNjcmlwdC1vd25lZCBvYmplY3QgcmVmZXJlbmNlPC9zdW1tYXJ5PicsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICcvLy8gPHBhcmFtIG5hbWU9XCJyZWZlcmVuY2VcIj5UaGUgSmF2YXNjcmlwdC1vd25lZCBvYmplY3QgcmVmZXJlbmNlPC9wYXJhbT4nLFxuICAgICk7XG4gICAgdGhpcy5kb3RuZXRSdW50aW1lR2VuZXJhdG9yLmVtaXREZXByZWNhdGVkQXR0cmlidXRlSWZOZWNlc3NhcnkoaW5pdGlhbGl6ZXIpO1xuICAgIHRoaXMuZW1pdEhpZGVBdHRyaWJ1dGUoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHByb3RlY3RlZCAke2NsYXNzTmFtZX0oQnlSZWZWYWx1ZSByZWZlcmVuY2UpOiBiYXNlKHJlZmVyZW5jZSlgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnLy8vIDxzdW1tYXJ5PlVzZWQgYnkganNpaSB0byBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIERlcHV0eVByb3BzPC9zdW1tYXJ5PicsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnLy8vIDxwYXJhbSBuYW1lPVwicHJvcHNcIj5UaGUgZGVwdXR5IHByb3BzPC9wYXJhbT4nKTtcbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdERlcHJlY2F0ZWRBdHRyaWJ1dGVJZk5lY2Vzc2FyeShpbml0aWFsaXplcik7XG4gICAgdGhpcy5lbWl0SGlkZUF0dHJpYnV0ZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkICR7Y2xhc3NOYW1lfShEZXB1dHlQcm9wcyBwcm9wcyk6IGJhc2UocHJvcHMpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICAvLyBXZSBoYXZlIGFscmVhZHkgb3V0cHV0dGVkIG1lbWJlcnMgKGNvbnN0cnVjdG9ycyksIHNldHRpbmcgdGhlIGZsYWcgdG8gdHJ1ZVxuICAgIHRoaXMuZmxhZ0ZpcnN0TWVtYmVyV3JpdHRlbih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZENsYXNzKGNsczogc3BlYy5DbGFzc1R5cGUpIHtcbiAgICBpZiAoY2xzLmFic3RyYWN0KSB7XG4gICAgICB0aGlzLmVtaXRJbnRlcmZhY2VQcm94eShjbHMpO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydENsYXNzTmFtZShjbHMpO1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IHRoaXMubmFtZXNwYWNlRm9yKHRoaXMuYXNzZW1ibHksIGNscyk7XG4gICAgdGhpcy5jbG9zZUZpbGVJZk5lZWRlZChjbGFzc05hbWUsIG5hbWVzcGFjZSwgdGhpcy5pc05lc3RlZChjbHMpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkZpZWxkKFxuICAgIF9jbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIF9wcm9wOiBzcGVjLlByb3BlcnR5LFxuICAgIF91bmlvbj86IHNwZWMuVW5pb25UeXBlUmVmZXJlbmNlLFxuICApIHtcbiAgICAvKiBub29wICovXG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2QoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIHRoaXMuZW1pdE1ldGhvZChjbHMsIG1ldGhvZCwgY2xzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbk1ldGhvZE92ZXJsb2FkKFxuICAgIGNsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRoaXMub25NZXRob2QoY2xzLCBvdmVybG9hZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Qcm9wZXJ0eShjbHM6IHNwZWMuQ2xhc3NUeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgdGhpcy5lbWl0UHJvcGVydHkoY2xzLCBwcm9wLCBjbHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3RhdGljTWV0aG9kKGNsczogc3BlYy5DbGFzc1R5cGUsIG1ldGhvZDogc3BlYy5NZXRob2QpIHtcbiAgICB0aGlzLmVtaXRNZXRob2QoY2xzLCBtZXRob2QsIGNscyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNNZXRob2RPdmVybG9hZChcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIG92ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aGlzLmVtaXRNZXRob2QoY2xzLCBvdmVybG9hZCwgY2xzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN0YXRpY1Byb3BlcnR5KGNsczogc3BlYy5DbGFzc1R5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICBpZiAocHJvcC5jb25zdCkge1xuICAgICAgdGhpcy5lbWl0Q29uc3RQcm9wZXJ0eShjbHMsIHByb3ApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXRQcm9wZXJ0eShjbHMsIHByb3AsIGNscyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uVW5pb25Qcm9wZXJ0eShcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIHByb3A6IHNwZWMuUHJvcGVydHksXG4gICAgX3VuaW9uOiBzcGVjLlVuaW9uVHlwZVJlZmVyZW5jZSxcbiAgKSB7XG4gICAgdGhpcy5lbWl0UHJvcGVydHkoY2xzLCBwcm9wLCBjbHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5FbnVtKGVubTogc3BlYy5FbnVtVHlwZSkge1xuICAgIGNvbnN0IGVudW1OYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydFR5cGVOYW1lKGVubS5uYW1lKTtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSB0aGlzLm5hbWVzcGFjZUZvcih0aGlzLmFzc2VtYmx5LCBlbm0pO1xuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZChlbnVtTmFtZSwgbmFtZXNwYWNlLCB0aGlzLmlzTmVzdGVkKGVubSkpO1xuICAgIHRoaXMuZW1pdE5ld0xpbmVJZk5lY2Vzc2FyeSgpO1xuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKGVubSwge1xuICAgICAgYXBpOiAndHlwZScsXG4gICAgICBmcW46IGVubS5mcW4sXG4gICAgfSk7XG4gICAgdGhpcy5kb3RuZXRSdW50aW1lR2VuZXJhdG9yLmVtaXRBdHRyaWJ1dGVzRm9yRW51bShlbm0sIGVudW1OYW1lKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBwdWJsaWMgZW51bSAke2VubS5uYW1lfWApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kRW51bShlbm06IHNwZWMuRW51bVR5cGUpIHtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIGNvbnN0IGVudW1OYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydFR5cGVOYW1lKGVubS5uYW1lKTtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSB0aGlzLm5hbWVzcGFjZUZvcih0aGlzLmFzc2VtYmx5LCBlbm0pO1xuICAgIHRoaXMuY2xvc2VGaWxlSWZOZWVkZWQoZW51bU5hbWUsIG5hbWVzcGFjZSwgdGhpcy5pc05lc3RlZChlbm0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVudW1NZW1iZXIoZW5tOiBzcGVjLkVudW1UeXBlLCBtZW1iZXI6IHNwZWMuRW51bU1lbWJlcikge1xuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKG1lbWJlciwge1xuICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgIGZxbjogZW5tLmZxbixcbiAgICAgIG1lbWJlck5hbWU6IG1lbWJlci5uYW1lLFxuICAgIH0pO1xuICAgIGNvbnN0IGVudW1NZW1iZXJOYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydEVudW1NZW1iZXJOYW1lKG1lbWJlci5uYW1lKTtcbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdEF0dHJpYnV0ZXNGb3JFbnVtTWVtYmVyKFxuICAgICAgZW51bU1lbWJlck5hbWUsXG4gICAgICBtZW1iZXIsXG4gICAgKTtcbiAgICAvLyBJZiB3ZSBhcmUgb24gdGhlIGxhc3QgZW51bSBtZW1iZXIsIHdlIGRvbid0IG5lZWQgYSBjb21tYVxuICAgIGlmIChlbm0ubWVtYmVycy5pbmRleE9mKG1lbWJlcikgIT09IGVubS5tZW1iZXJzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAke2VudW1NZW1iZXJOYW1lfSxgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYCR7ZW51bU1lbWJlck5hbWV9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBuYW1lc3BhY2VGb3IoYXNzbTogc3BlYy5Bc3NlbWJseSwgdHlwZTogc3BlYy5UeXBlKTogc3RyaW5nIHtcbiAgICBsZXQgbnMgPSB0eXBlLm5hbWVzcGFjZTtcbiAgICB3aGlsZSAobnMgIT0gbnVsbCAmJiBhc3NtLnR5cGVzPy5bYCR7YXNzbS5uYW1lfS4ke25zfWBdICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IG5lc3RpbmcgPSBhc3NtLnR5cGVzW2Ake2Fzc20ubmFtZX0uJHtuc31gXTtcbiAgICAgIG5zID0gbmVzdGluZy5uYW1lc3BhY2U7XG4gICAgfVxuICAgIGlmIChucyAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy50eXBlcmVzb2x2ZXIucmVzb2x2ZU5hbWVzcGFjZShhc3NtLCBhc3NtLm5hbWUsIG5zKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzc20udGFyZ2V0cyEuZG90bmV0IS5uYW1lc3BhY2U7XG4gIH1cblxuICBwcml2YXRlIGVtaXRNZXRob2QoXG4gICAgY2xzOiBzcGVjLkNsYXNzVHlwZSB8IHNwZWMuSW50ZXJmYWNlVHlwZSxcbiAgICBtZXRob2Q6IHNwZWMuTWV0aG9kLFxuICAgIGRlZmluaW5nVHlwZTogc3BlYy5UeXBlLFxuICAgIGVtaXRGb3JQcm94eU9yRGF0YXR5cGUgPSBmYWxzZSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5lbWl0TmV3TGluZUlmTmVjZXNzYXJ5KCk7XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IG1ldGhvZC5yZXR1cm5zXG4gICAgICA/IHRoaXMudHlwZXJlc29sdmVyLnRvRG90TmV0VHlwZShtZXRob2QucmV0dXJucy50eXBlKVxuICAgICAgOiAndm9pZCc7XG4gICAgY29uc3Qgc3RhdGljS2V5V29yZCA9IG1ldGhvZC5zdGF0aWMgPyAnc3RhdGljICcgOiAnJztcbiAgICBsZXQgb3ZlcnJpZGVLZXlXb3JkID0gJyc7XG4gICAgbGV0IHZpcnR1YWxLZXlXb3JkID0gJyc7XG5cbiAgICBsZXQgZGVmaW5lZE9uQW5jZXN0b3IgPSBmYWxzZTtcbiAgICAvLyBJbiB0aGUgY2FzZSBvZiB0aGUgc291cmNlIGJlaW5nIGEgY2xhc3MsIHdlIGNoZWNrIGlmIGl0IGlzIGFscmVhZHkgZGVmaW5lZCBvbiBhbiBhbmNlc3RvclxuICAgIGlmIChzcGVjLmlzQ2xhc3NUeXBlKGNscykpIHtcbiAgICAgIGRlZmluZWRPbkFuY2VzdG9yID0gdGhpcy5pc01lbWJlckRlZmluZWRPbkFuY2VzdG9yKGNscywgbWV0aG9kKTtcbiAgICB9XG4gICAgLy8gVGhlIG1ldGhvZCBpcyBhbiBvdmVycmlkZSBpZiBpdCdzIGRlZmluZWQgb24gdGhlIGFuY2VzdG9yLCBvciBpZiB0aGUgcGFyZW50IGlzIGEgY2xhc3MgYW5kIHdlIGFyZSBnZW5lcmF0aW5nIGEgcHJveHkgb3IgZGF0YXR5cGUgY2xhc3NcbiAgICBsZXQgb3ZlcnJpZGVzID1cbiAgICAgIGRlZmluZWRPbkFuY2VzdG9yIHx8IChzcGVjLmlzQ2xhc3NUeXBlKGNscykgJiYgZW1pdEZvclByb3h5T3JEYXRhdHlwZSk7XG4gICAgLy8gV2UgYWxzbyBpbnNwZWN0IHRoZSBqc2lpIG1vZGVsIHRvIHNlZSBpZiBpdCBvdmVycmlkZXMgYSBjbGFzcyBtZW1iZXIuXG4gICAgaWYgKG1ldGhvZC5vdmVycmlkZXMpIHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlVHlwZSA9IHRoaXMuZmluZFR5cGUobWV0aG9kLm92ZXJyaWRlcyk7XG4gICAgICBpZiAoc3BlYy5pc0NsYXNzVHlwZShvdmVycmlkZVR5cGUpKSB7XG4gICAgICAgIC8vIE92ZXJyaWRlcyBhIGNsYXNzLCBuZWVkcyBvdmVycmlkZXMga2V5d29yZFxuICAgICAgICBvdmVycmlkZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3ZlcnJpZGVzKSB7XG4gICAgICAvLyBBZGQgdGhlIG92ZXJyaWRlIGtleSB3b3JkIGlmIHRoZSBtZXRob2QgaXMgZW1pdHRlZCBmb3IgYSBwcm94eSBvciBkYXRhIHR5cGUgb3IgaXMgZGVmaW5lZCBvbiBhbiBhbmNlc3Rvci4gSWZcbiAgICAgIC8vIHRoZSBtZW1iZXIgaXMgc3RhdGljLCB1c2UgdGhlIFwibmV3XCIga2V5d29yZCBpbnN0ZWFkLCB0byBpbmRpY2F0ZSB3ZSBhcmUgaW50ZW50aW9uYWxseSBoaWRpbmcgdGhlIGFuY2VzdG9yXG4gICAgICAvLyBkZWNsYXJhdGlvbiAoYXMgQyMgZG9lcyBub3QgaW5oZXJpdCBzdGF0aWNzLCB0aGV5IGNhbiBiZSBoaWRkZW4gYnV0IG5vdCBvdmVycmlkZGVuKS4gVGhlIFwibmV3XCIga2V5d29yZCBpc1xuICAgICAgLy8gb3B0aW9uYWwgaW4gdGhpcyBjb250ZXh0LCBidXQgaGVscHMgY2xhcmlmeSBpbnRlbnRpb24uXG4gICAgICBvdmVycmlkZUtleVdvcmQgPSBtZXRob2Quc3RhdGljID8gJ25ldyAnIDogJ292ZXJyaWRlICc7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICFtZXRob2Quc3RhdGljICYmXG4gICAgICAobWV0aG9kLmFic3RyYWN0IHx8ICFkZWZpbmVkT25BbmNlc3RvcikgJiZcbiAgICAgICFlbWl0Rm9yUHJveHlPckRhdGF0eXBlXG4gICAgKSB7XG4gICAgICAvLyBBZGQgdGhlIHZpcnR1YWwga2V5IHdvcmQgaWYgdGhlIG1ldGhvZCBpcyBhYnN0cmFjdCBvciBub3QgZGVmaW5lZCBvbiBhbiBhbmNlc3RvciBhbmQgd2UgYXJlIE5PVCBnZW5lcmF0aW5nIGEgcHJveHkgb3IgZGF0YXR5cGUgY2xhc3NcbiAgICAgIC8vIE1ldGhvZHMgc2hvdWxkIGFsd2F5cyBiZSB2aXJ0dWFsIHdoZW4gcG9zc2libGVcbiAgICAgIHZpcnR1YWxLZXlXb3JkID0gJ3ZpcnR1YWwgJztcbiAgICB9XG5cbiAgICBjb25zdCBhY2Nlc3MgPSB0aGlzLnJlbmRlckFjY2Vzc0xldmVsKG1ldGhvZCk7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHRoaXMubmFtZXV0aWxzLmNvbnZlcnRNZXRob2ROYW1lKG1ldGhvZC5uYW1lKTtcblxuICAgIGNvbnN0IGlzT3B0aW9uYWwgPSBtZXRob2QucmV0dXJucyAmJiBtZXRob2QucmV0dXJucy5vcHRpb25hbCA/ICc/JyA6ICcnO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGAke3JldHVyblR5cGV9JHtpc09wdGlvbmFsfSAke21ldGhvZE5hbWV9KCR7dGhpcy5yZW5kZXJNZXRob2RQYXJhbWV0ZXJzKFxuICAgICAgbWV0aG9kLFxuICAgICl9KWA7XG5cbiAgICB0aGlzLmRvdG5ldERvY0dlbmVyYXRvci5lbWl0RG9jcyhtZXRob2QsIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IGRlZmluaW5nVHlwZS5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiBtZXRob2QubmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdEF0dHJpYnV0ZXNGb3JNZXRob2QoXG4gICAgICBjbHMsXG4gICAgICBtZXRob2QgLyosIGVtaXRGb3JQcm94eU9yRGF0YXR5cGUqLyxcbiAgICApO1xuXG4gICAgaWYgKG1ldGhvZC5hYnN0cmFjdCkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYCR7YWNjZXNzfSAke292ZXJyaWRlS2V5V29yZH1hYnN0cmFjdCAke3NpZ25hdHVyZX07YCk7XG4gICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICBgJHthY2Nlc3N9ICR7c3RhdGljS2V5V29yZH0ke292ZXJyaWRlS2V5V29yZH0ke3ZpcnR1YWxLZXlXb3JkfSR7c2lnbmF0dXJlfWAsXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5jcmVhdGVJbnZva2VNZXRob2RJZGVudGlmaWVyKFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBjbHMgYXMgc3BlYy5DbGFzc1R5cGUsXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm91bmRzIG91dCBpZiBhIG1lbWJlciAocHJvcGVydHkgb3IgbWV0aG9kKSBpcyBhbHJlYWR5IGRlZmluZWQgaW4gb25lIG9mIHRoZSBiYXNlIGNsYXNzZXNcbiAgICpcbiAgICogVXNlZCB0byBmaWd1cmUgb3V0IGlmIHRoZSBvdmVycmlkZSBvciB2aXJ0dWFsIGtleXdvcmRzIGFyZSBuZWNlc3NhcnkuXG4gICAqL1xuICBwcml2YXRlIGlzTWVtYmVyRGVmaW5lZE9uQW5jZXN0b3IoXG4gICAgY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBtZW1iZXI6IHNwZWMuUHJvcGVydHkgfCBzcGVjLk1ldGhvZCxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKG1lbWJlciBhcyBzcGVjLk1ldGhvZCkge1xuICAgICAgY29uc3Qgb2JqZWN0TWV0aG9kcyA9IFsnVG9TdHJpbmcnLCAnR2V0SGFzaENvZGUnLCAnRXF1YWxzJ107XG4gICAgICAvLyBNZXRob2RzIGRlZmluZWQgb24gdGhlIE9iamVjdCBjbGFzcyBzaG91bGQgYmUgb3ZlcnJpZGRlbiwgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoXG4gICAgICAgIG9iamVjdE1ldGhvZHMuaW5jbHVkZXModGhpcy5uYW1ldXRpbHMuY29udmVydE1ldGhvZE5hbWUobWVtYmVyLm5hbWUpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGJhc2UgPSBjbHMuYmFzZTtcbiAgICBpZiAoYmFzZSkge1xuICAgICAgY29uc3QgYmFzZVR5cGUgPSB0aGlzLmZpbmRUeXBlKGJhc2UpIGFzIHNwZWMuQ2xhc3NUeXBlO1xuXG4gICAgICBpZiAobWVtYmVyIGFzIHNwZWMuUHJvcGVydHkpIHtcbiAgICAgICAgaWYgKGJhc2VUeXBlLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBiYXNlVHlwZS5wcm9wZXJ0aWVzLmZpbHRlcihcbiAgICAgICAgICAgICAgKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lID09PSBtZW1iZXIubmFtZSxcbiAgICAgICAgICAgICkubGVuZ3RoID4gMFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gcHJvcGVydHkgZm91bmQgaW4gYmFzZSBwYXJlbnRcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pc01lbWJlckRlZmluZWRPbkFuY2VzdG9yKGJhc2VUeXBlLCBtZW1iZXIpO1xuICAgICAgfSBlbHNlIGlmIChtZW1iZXIgYXMgc3BlYy5NZXRob2QpIHtcbiAgICAgICAgaWYgKGJhc2VUeXBlLm1ldGhvZHMpIHtcbiAgICAgICAgICBjb25zdCBteU1ldGhvZCA9IG1lbWJlciBhcyBzcGVjLk1ldGhvZDtcbiAgICAgICAgICAvLyBJZiB0aGUgbmFtZSwgcGFyYW1ldGVycyBhbmQgcmV0dXJucyBhcmUgc2ltaWxhciB0aGVuIGl0IGlzIHRoZSBzYW1lIG1ldGhvZCBpbiAuTkVUXG4gICAgICAgICAgZm9yIChjb25zdCBtIG9mIGJhc2VUeXBlLm1ldGhvZHMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgbS5uYW1lID09PSBteU1ldGhvZC5uYW1lICYmXG4gICAgICAgICAgICAgIG0ucGFyYW1ldGVycyA9PT0gbXlNZXRob2QucGFyYW1ldGVycyAmJlxuICAgICAgICAgICAgICBtLnJldHVybnMgPT09IG15TWV0aG9kLnJldHVybnNcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNNZW1iZXJEZWZpbmVkT25BbmNlc3RvcihiYXNlVHlwZSwgbWVtYmVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgbWV0aG9kIHBhcmFtZXRlcnMgc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIHJlbmRlck1ldGhvZFBhcmFtZXRlcnMobWV0aG9kOiBzcGVjLk1ldGhvZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyUGFyYW1ldGVyc1N0cmluZyhtZXRob2QucGFyYW1ldGVycyk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBwYXJhbWV0ZXJzIHN0cmluZyBmb3IgbWV0aG9kcyBvciBjb25zdHJ1Y3RvcnNcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyUGFyYW1ldGVyc1N0cmluZyhcbiAgICBwYXJhbWV0ZXJzOiBzcGVjLlBhcmFtZXRlcltdIHwgdW5kZWZpbmVkLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xuICAgIGlmIChwYXJhbWV0ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgcGFyYW1ldGVycykge1xuICAgICAgICBsZXQgb3B0aW9uYWxQcmltaXRpdmUgPSAnJztcbiAgICAgICAgbGV0IG9wdGlvbmFsS2V5d29yZCA9ICcnO1xuICAgICAgICBsZXQgdHlwZSA9IHRoaXMudHlwZXJlc29sdmVyLnRvRG90TmV0VHlwZShwLnR5cGUpO1xuICAgICAgICBpZiAocC5vcHRpb25hbCkge1xuICAgICAgICAgIG9wdGlvbmFsS2V5d29yZCA9ICcgPSBudWxsJztcbiAgICAgICAgICBpZiAocC5vcHRpb25hbCkge1xuICAgICAgICAgICAgb3B0aW9uYWxQcmltaXRpdmUgPSAnPyc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHAudmFyaWFkaWMpIHtcbiAgICAgICAgICB0eXBlID0gYHBhcmFtcyAke3R5cGV9W11gO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0ID0gYCR7dHlwZX0ke29wdGlvbmFsUHJpbWl0aXZlfSAke3RoaXMubmFtZXV0aWxzLmNvbnZlcnRQYXJhbWV0ZXJOYW1lKFxuICAgICAgICAgIHAubmFtZSxcbiAgICAgICAgKX0ke29wdGlvbmFsS2V5d29yZH1gO1xuICAgICAgICBwYXJhbXMucHVzaChzdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXMuam9pbignLCAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBhbiBpbnRlcmZhY2UgcHJveHkgZm9yIGFuIGludGVyZmFjZSBvciBhbiBhYnN0cmFjdCBjbGFzcy5cbiAgICovXG4gIHByaXZhdGUgZW1pdEludGVyZmFjZVByb3h5KGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlIHwgc3BlYy5DbGFzc1R5cGUpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gJ19Qcm94eSc7XG4gICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2VGb3IodGhpcy5hc3NlbWJseSwgaWZjKTtcbiAgICBjb25zdCBpc05lc3RlZCA9IHRydWU7XG4gICAgdGhpcy5vcGVuRmlsZUlmTmVlZGVkKG5hbWUsIG5hbWVzcGFjZSwgaXNOZXN0ZWQpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmRvdG5ldERvY0dlbmVyYXRvci5lbWl0RG9jcyhpZmMsIHtcbiAgICAgIGFwaTogJ3R5cGUnLFxuICAgICAgZnFuOiBpZmMuZnFuLFxuICAgIH0pO1xuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0QXR0cmlidXRlc0ZvckludGVyZmFjZVByb3h5KGlmYyk7XG5cbiAgICBjb25zdCBpbnRlcmZhY2VGcW4gPSB0aGlzLnR5cGVyZXNvbHZlci50b05hdGl2ZUZxbihpZmMuZnFuKTtcbiAgICBjb25zdCBzdWZmaXggPSBzcGVjLmlzSW50ZXJmYWNlVHlwZShpZmMpXG4gICAgICA/IGA6IERlcHV0eUJhc2UsICR7aW50ZXJmYWNlRnFufWBcbiAgICAgIDogYDogJHtpbnRlcmZhY2VGcW59YDtcbiAgICBjb25zdCBuZXdNb2RpZmllciA9IHRoaXMucHJveHlNdXN0VXNlTmV3TW9kaWZpZXIoaWZjKSA/ICduZXcgJyA6ICcnO1xuXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGAke25ld01vZGlmaWVyfWludGVybmFsIHNlYWxlZCBjbGFzcyAke25hbWV9ICR7c3VmZml4fWAsXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgcHJpdmF0ZSBjb25zdHJ1Y3RvclxuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJpdmF0ZSAke25hbWV9KEJ5UmVmVmFsdWUgcmVmZXJlbmNlKTogYmFzZShyZWZlcmVuY2UpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICAvLyBXZSBoYXZlIGFscmVhZHkgb3V0cHV0IGEgbWVtYmVyIChjb25zdHJ1Y3RvciksIHNldHRpbmcgdGhlIGZpcnN0IG1lbWJlciBmbGFnIHRvIHRydWVcbiAgICB0aGlzLmZsYWdGaXJzdE1lbWJlcldyaXR0ZW4odHJ1ZSk7XG5cbiAgICBjb25zdCBkYXRhdHlwZSA9IGZhbHNlO1xuICAgIGNvbnN0IHByb3h5ID0gdHJ1ZTtcbiAgICB0aGlzLmVtaXRJbnRlcmZhY2VNZW1iZXJzRm9yUHJveHlPckRhdGF0eXBlKGlmYywgZGF0YXR5cGUsIHByb3h5KTtcblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jbG9zZUZpbGVJZk5lZWRlZChuYW1lLCBuYW1lc3BhY2UsIGlzTmVzdGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW55IGFuY2VzdG9yIG9mIHRoZSBnaXZlbiB0eXBlIG11c3QgdXNlIHRoZSBgbmV3YFxuICAgKiBtb2RpZmllciB3aGVuIGludHJvZHVjaW5nIGl0J3Mgb3duIHByb3h5LlxuICAgKlxuICAgKiBJZiB0aGUgdHlwZSBpcyBhIGBjbGFzc2AsIHRoZW4gaXQgbXVzdCB1c2UgYG5ld2AgaWYgaXQgZXh0ZW5kcyBhbm90aGVyXG4gICAqIGFic3RyYWN0IGNsYXNzIGRlZmluZWQgaW4gdGhlIHNhbWUgYXNzZW1ibHkgKHNpbmNlIHByb3hpZXMgYXJlIGludGVybmFsLFxuICAgKiBleHRlcm5hbCB0eXBlcycgcHJveGllcyBhcmUgbm90IHZpc2libGUgaW4gdGhhdCBjb250ZXh0KS5cbiAgICpcbiAgICogSWYgdGhlIHR5cGUgaXMgYW4gYGludGVyZmFjZWAsIHRoZW4gaXQgbXVzdCB1c2UgYG5ld2AgaWYgaXQgZXh0ZW5kcyBhbm90aGVyXG4gICAqIGludGVyZmFjZSBmcm9tIHRoZSBzYW1lIGFzc2VtYmx5LlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZSB0aGUgdGVzdGVkIHByb3h5LWFibGUgdHlwZSAoYW4gYWJzdHJhY3QgY2xhc3Mgb3IgYW4gaW50ZXJmYWNlKS5cbiAgICpcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBhbnkgYW5jZXN0b3Igb2YgdGhpcyB0eXBlIGhhcyBhIHZpc2libGUgcHJveHkuXG4gICAqL1xuICBwcml2YXRlIHByb3h5TXVzdFVzZU5ld01vZGlmaWVyKFxuICAgIHR5cGU6IHNwZWMuQ2xhc3NUeXBlIHwgc3BlYy5JbnRlcmZhY2VUeXBlLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoc3BlYy5pc0NsYXNzVHlwZSh0eXBlKSkge1xuICAgICAgaWYgKHR5cGUuYmFzZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmFzZSA9IHRoaXMuZmluZFR5cGUodHlwZS5iYXNlKSBhcyBzcGVjLkNsYXNzVHlwZTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGJhc2UuYXNzZW1ibHkgPT09IHR5cGUuYXNzZW1ibHkgJiZcbiAgICAgICAgKGJhc2UuYWJzdHJhY3RcbiAgICAgICAgICA/IHRydWVcbiAgICAgICAgICA6IC8vIEFuIGFic3RyYWN0IGNsYXNzIGNvdWxkIGV4dGVuZCBhIGNvbmNyZXRlIGNsYXNzLi4uIFdlIG11c3Qgd2FsayB1cCB0aGUgaW5oZXJpdGFuY2UgdHJlZSBpbiB0aGlzIGNhc2UuLi5cbiAgICAgICAgICAgIHRoaXMucHJveHlNdXN0VXNlTmV3TW9kaWZpZXIoYmFzZSkpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICB0eXBlLmludGVyZmFjZXM/LmZpbmQoXG4gICAgICAgIChmcW4pID0+IHRoaXMuZmluZFR5cGUoZnFuKS5hc3NlbWJseSA9PT0gdHlwZS5hc3NlbWJseSxcbiAgICAgICkgIT0gbnVsbFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYW4gSW50ZXJmYWNlIERhdGF0eXBlIGNsYXNzXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZCB0byBlbWl0IGEgY2xhc3MgaW1wbGVtZW50aW5nIGFuIGludGVyZmFjZSB3aGVuIHRoZSBkYXRhdHlwZSBwcm9wZXJ0eSBpcyB0cnVlIGluIHRoZSBqc2lpIG1vZGVsXG4gICAqIFRoZSBnZW5lcmF0aW9uIG9mIHRoZSBpbnRlcmZhY2UgcHJveHkgbWF5IG5vdCBiZSBuZWVkZWQgaWYgdGhlIGludGVyZmFjZSBpcyBhbHNvIHNldCBhcyBhIGRhdGF0eXBlXG4gICAqL1xuICBwcml2YXRlIGVtaXRJbnRlcmZhY2VEYXRhVHlwZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSk6IHZvaWQge1xuICAgIC8vIEludGVyZmFjZSBkYXRhdHlwZXMgZG8gbm90IG5lZWQgdG8gYmUgcHJlZml4ZWQgYnkgSSwgd2UgY2FuIGNhbGwgY29udmVydENsYXNzTmFtZVxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5hbWV1dGlscy5jb252ZXJ0Q2xhc3NOYW1lKGlmYyk7XG4gICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2VGb3IodGhpcy5hc3NlbWJseSwgaWZjKTtcbiAgICBjb25zdCBpc05lc3RlZCA9IHRoaXMuaXNOZXN0ZWQoaWZjKTtcbiAgICB0aGlzLm9wZW5GaWxlSWZOZWVkZWQobmFtZSwgbmFtZXNwYWNlLCBpc05lc3RlZCk7XG5cbiAgICBpZiAoaWZjLnByb3BlcnRpZXM/LmZpbmQoKHByb3ApID0+ICFwcm9wLm9wdGlvbmFsKSAhPSBudWxsKSB7XG4gICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGJlIGFubm95ZWQgYnkgdGhlIGxhY2sgb2YgaW5pdGlhbGl6YXRpb24gb2Ygbm9uLW51bGxhYmxlIGZpZWxkcyBpbiB0aGlzIGNhc2UuXG4gICAgICB0aGlzLmNvZGUubGluZSgnI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgQ1M4NjE4Jyk7XG4gICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIH1cblxuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKGlmYywge1xuICAgICAgYXBpOiAndHlwZScsXG4gICAgICBmcW46IGlmYy5mcW4sXG4gICAgfSk7XG4gICAgY29uc3Qgc3VmZml4ID0gYDogJHt0aGlzLnR5cGVyZXNvbHZlci50b05hdGl2ZUZxbihpZmMuZnFuKX1gO1xuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0QXR0cmlidXRlc0ZvckludGVyZmFjZURhdGF0eXBlKGlmYyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgcHVibGljIGNsYXNzICR7bmFtZX0gJHtzdWZmaXh9YCk7XG4gICAgdGhpcy5mbGFnRmlyc3RNZW1iZXJXcml0dGVuKGZhbHNlKTtcbiAgICBjb25zdCBkYXRhdHlwZSA9IHRydWU7XG4gICAgY29uc3QgcHJveHkgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXRJbnRlcmZhY2VNZW1iZXJzRm9yUHJveHlPckRhdGF0eXBlKGlmYywgZGF0YXR5cGUsIHByb3h5KTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY2xvc2VGaWxlSWZOZWVkZWQobmFtZSwgbmFtZXNwYWNlLCBpc05lc3RlZCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHRoZSBib2R5IG9mIHRoZSBpbnRlcmZhY2UgcHJveHkgb3IgZGF0YSB0eXBlIGNsYXNzXG4gICAqXG4gICAqIFRoaXMgbG9vcHMgdGhyb3VnaCBhbGwgdGhlIG1lbWJlciBhbmQgZ2VuZXJhdGVzIHRoZW1cbiAgICovXG4gIHByaXZhdGUgZW1pdEludGVyZmFjZU1lbWJlcnNGb3JQcm94eU9yRGF0YXR5cGUoXG4gICAgaWZjOiBzcGVjLkludGVyZmFjZVR5cGUgfCBzcGVjLkNsYXNzVHlwZSxcbiAgICBkYXRhdHlwZTogYm9vbGVhbixcbiAgICBwcm94eTogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgLy8gVGhlIGtleSBpcyBpbiB0aGUgZm9ybSAnbWV0aG9kLm5hbWU7cGFyYW1ldGVyMTtwYXJhbWV0ZXIyOycgZXRjXG4gICAgY29uc3QgbWV0aG9kcyA9IG5ldyBNYXA8c3RyaW5nLCBNZXRob2REZWZpbml0aW9uPigpO1xuICAgIC8qXG4gICAgICAgICAgT25seSBnZXQgdGhlIGZpcnN0IGRlY2xhcmF0aW9uIGVuY291bnRlcmVkLCBhbmQga2VlcCBpdCBpZiBpdCBpcyBhYnN0cmFjdC4gVGhlIGxpc3QgY29udGFpbnMgQUxMXG4gICAgICAgICAgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBlbmNvdW50ZXJlZCwgaW4gdGhlIG9yZGVyIGVuY291bnRlcmVkLiBBbiBhYnN0cmFjdCBjbGFzcyBjYW4gaGF2ZSBjb25jcmV0ZVxuICAgICAgICAgIGltcGxlbWVudGF0aW9ucy4gVGhlcmVmb3JlLCB3ZSBvbmx5IGdlbmVyYXRlIG1ldGhvZHMvcHJvcGVydGllcyBpZiB0aGUgZmlyc3QgbWVtYmVyIGVuY291bnRlcmVkXG4gICAgICAgICAgaXMgdW5pbXBsZW1lbnRlZC5cbiAgICAgICAgKi9cbiAgICBjb25zdCBleGNsdWRlZE1ldGhvZDogc3RyaW5nW10gPSBbXTsgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIG1ldGhvZHMgd2UgYWxyZWFkeSByYW4gaW50byBhbmQgZG9uJ3Qgd2FudCB0byBlbWl0XG4gICAgY29uc3QgZXhjbHVkZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdOyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgcHJvcGVydGllcyB3ZSBhbHJlYWR5IHJhbiBpbnRvIGFuZCBkb24ndCB3YW50IHRvIGVtaXRcbiAgICBjb25zdCBwcm9wZXJ0aWVzOiB7IFtuYW1lOiBzdHJpbmddOiBQcm9wZXJ0eURlZmluaXRpb24gfSA9IHt9O1xuICAgIGNvbnN0IGNvbGxlY3RBYnN0cmFjdE1lbWJlcnMgPSAoXG4gICAgICBjdXJyZW50VHlwZTogc3BlYy5JbnRlcmZhY2VUeXBlIHwgc3BlYy5DbGFzc1R5cGUsXG4gICAgKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgY3VycmVudFR5cGUucHJvcGVydGllcyA/PyBbXSkge1xuICAgICAgICBpZiAoIWV4Y2x1ZGVkUHJvcGVydGllcy5pbmNsdWRlcyhwcm9wLm5hbWUpKSB7XG4gICAgICAgICAgLy8gSWYgd2UgaGF2ZSBuZXZlciBydW4gaW50byB0aGlzIHByb3BlcnR5IGJlZm9yZSBhbmQgaXQgaXMgYWJzdHJhY3QsIHdlIGtlZXAgaXRcbiAgICAgICAgICBpZiAocHJvcC5hYnN0cmFjdCkge1xuICAgICAgICAgICAgcHJvcGVydGllc1twcm9wLm5hbWVdID0geyBwcm9wLCBkZWZpbmluZ1R5cGU6IGN1cnJlbnRUeXBlIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGV4Y2x1ZGVkUHJvcGVydGllcy5wdXNoKHByb3AubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgY3VycmVudFR5cGUubWV0aG9kcyA/PyBbXSkge1xuICAgICAgICBsZXQgbWV0aG9kUGFyYW1ldGVycyA9ICcnO1xuICAgICAgICBpZiAobWV0aG9kLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICBtZXRob2QucGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbSkgPT4ge1xuICAgICAgICAgICAgbWV0aG9kUGFyYW1ldGVycyArPSBgOyR7dGhpcy50eXBlcmVzb2x2ZXIudG9Eb3ROZXRUeXBlKFxuICAgICAgICAgICAgICBwYXJhbS50eXBlLFxuICAgICAgICAgICAgKX1gO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXhjbHVkZWRNZXRob2QuaW5jbHVkZXMoYCR7bWV0aG9kLm5hbWV9JHttZXRob2RQYXJhbWV0ZXJzfWApKSB7XG4gICAgICAgICAgLy8gSWYgd2UgaGF2ZSBuZXZlciBydW4gaW50byB0aGlzIG1ldGhvZCBiZWZvcmUgYW5kIGl0IGlzIGFic3RyYWN0LCB3ZSBrZWVwIGl0XG4gICAgICAgICAgaWYgKG1ldGhvZC5hYnN0cmFjdCkge1xuICAgICAgICAgICAgbWV0aG9kcy5zZXQoYCR7bWV0aG9kLm5hbWV9JHttZXRob2RQYXJhbWV0ZXJzfWAsIHtcbiAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICBkZWZpbmluZ1R5cGU6IGN1cnJlbnRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGV4Y2x1ZGVkTWV0aG9kLnB1c2goYCR7bWV0aG9kLm5hbWV9JHttZXRob2RQYXJhbWV0ZXJzfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VzID0gbmV3IEFycmF5PHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlPigpO1xuICAgICAgYmFzZXMucHVzaChcbiAgICAgICAgLi4uKGN1cnJlbnRUeXBlLmludGVyZmFjZXMgPz8gW10pLm1hcCgoaWZhY2UpID0+IHRoaXMuZmluZFR5cGUoaWZhY2UpKSxcbiAgICAgICk7XG4gICAgICBpZiAoc3BlYy5pc0NsYXNzVHlwZShjdXJyZW50VHlwZSkgJiYgY3VycmVudFR5cGUuYmFzZSkge1xuICAgICAgICBiYXNlcy5wdXNoKHRoaXMuZmluZFR5cGUoY3VycmVudFR5cGUuYmFzZSkpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBiYXNlIG9mIGJhc2VzKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpbmRUeXBlKGJhc2UuZnFuKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGUua2luZCAhPT0gc3BlYy5UeXBlS2luZC5JbnRlcmZhY2UgJiZcbiAgICAgICAgICB0eXBlLmtpbmQgIT09IHNwZWMuVHlwZUtpbmQuQ2xhc3NcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEJhc2UgaW50ZXJmYWNlcyBvZiBhbiBpbnRlcmZhY2UgbXVzdCBiZSBhbiBpbnRlcmZhY2Ugb3IgYSBjbGFzcyAoJHtiYXNlLmZxbn0gaXMgb2YgdHlwZSAke3R5cGUua2luZH0pYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbGxlY3RBYnN0cmFjdE1lbWJlcnModHlwZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBjb2xsZWN0QWJzdHJhY3RNZW1iZXJzKGlmYyk7XG5cbiAgICAvLyBlbWl0IGFsbCBwcm9wZXJ0aWVzXG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKSkge1xuICAgICAgY29uc3QgcHJvcCA9IGNsb25lKHByb3BlcnRpZXNbcHJvcE5hbWVdKTtcbiAgICAgIHByb3AucHJvcC5hYnN0cmFjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5lbWl0UHJvcGVydHkoaWZjLCBwcm9wLnByb3AsIHByb3AuZGVmaW5pbmdUeXBlLCBkYXRhdHlwZSwgcHJveHkpO1xuICAgIH1cbiAgICAvLyBlbWl0IGFsbCB0aGUgbWV0aG9kc1xuICAgIGZvciAoY29uc3QgbWV0aG9kTmFtZUFuZFBhcmFtZXRlcnMgb2YgbWV0aG9kcy5rZXlzKCkpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gbWV0aG9kcy5nZXQobWV0aG9kTmFtZUFuZFBhcmFtZXRlcnMpO1xuICAgICAgaWYgKG9yaWdpbmFsTWV0aG9kKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IGNsb25lKG9yaWdpbmFsTWV0aG9kKTtcbiAgICAgICAgbWV0aG9kLm1ldGhvZC5hYnN0cmFjdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVtaXRNZXRob2QoXG4gICAgICAgICAgaWZjLFxuICAgICAgICAgIG1ldGhvZC5tZXRob2QsXG4gICAgICAgICAgbWV0aG9kLmRlZmluaW5nVHlwZSxcbiAgICAgICAgICAvKiBlbWl0Rm9yUHJveHlPckRhdGF0eXBlICovIHRydWUsXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9yIChjb25zdCBvdmVybG9hZGVkTWV0aG9kIG9mIHRoaXMuY3JlYXRlT3ZlcmxvYWRzRm9yT3B0aW9uYWxzKFxuICAgICAgICAgIG1ldGhvZC5tZXRob2QsXG4gICAgICAgICkpIHtcbiAgICAgICAgICBvdmVybG9hZGVkTWV0aG9kLmFic3RyYWN0ID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5lbWl0TWV0aG9kKFxuICAgICAgICAgICAgaWZjLFxuICAgICAgICAgICAgb3ZlcmxvYWRlZE1ldGhvZCxcbiAgICAgICAgICAgIG1ldGhvZC5kZWZpbmluZ1R5cGUsXG4gICAgICAgICAgICAvKiBlbWl0Rm9yUHJveHlPckRhdGF0eXBlICovIHRydWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBhIHByb3BlcnR5XG4gICAqL1xuICBwcml2YXRlIGVtaXRQcm9wZXJ0eShcbiAgICBjbHM6IHNwZWMuVHlwZSxcbiAgICBwcm9wOiBzcGVjLlByb3BlcnR5LFxuICAgIGRlZmluaW5nVHlwZTogc3BlYy5UeXBlLFxuICAgIGRhdGF0eXBlID0gZmFsc2UsXG4gICAgcHJveHkgPSBmYWxzZSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5lbWl0TmV3TGluZUlmTmVjZXNzYXJ5KCk7XG5cbiAgICBjb25zdCBjbGFzc05hbWUgPSB0aGlzLnR5cGVyZXNvbHZlci50b05hdGl2ZUZxbihjbHMuZnFuKTtcbiAgICBjb25zdCBhY2Nlc3MgPSB0aGlzLnJlbmRlckFjY2Vzc0xldmVsKHByb3ApO1xuICAgIGNvbnN0IHN0YXRpY0tleVdvcmQgPSBwcm9wLnN0YXRpYyA/ICdzdGF0aWMgJyA6ICcnO1xuICAgIGNvbnN0IHByb3BOYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydFByb3BlcnR5TmFtZShwcm9wLm5hbWUpO1xuXG4gICAgdGhpcy5kb3RuZXREb2NHZW5lcmF0b3IuZW1pdERvY3MocHJvcCwge1xuICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgIGZxbjogZGVmaW5pbmdUeXBlLmZxbixcbiAgICAgIG1lbWJlck5hbWU6IHByb3AubmFtZSxcbiAgICB9KTtcbiAgICBpZiAocHJvcC5vcHRpb25hbCkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJ1tKc2lpT3B0aW9uYWxdJyk7XG4gICAgfVxuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0QXR0cmlidXRlc0ZvclByb3BlcnR5KHByb3AsIGRhdGF0eXBlKTtcblxuICAgIGxldCBpc092ZXJyaWRlS2V5V29yZCA9ICcnO1xuICAgIGxldCBpc1ZpcnR1YWxLZXlXb3JkID0gJyc7XG4gICAgbGV0IGlzQWJzdHJhY3RLZXl3b3JkID0gJyc7XG5cbiAgICAvLyBJZiB0aGUgcHJvcCBwYXJlbnQgaXMgYSBjbGFzc1xuICAgIGlmIChzcGVjLmlzQ2xhc3NUeXBlKGNscykpIHtcbiAgICAgIGNvbnN0IGltcGxlbWVudGVkSW5CYXNlID0gdGhpcy5pc01lbWJlckRlZmluZWRPbkFuY2VzdG9yKFxuICAgICAgICBjbHMgYXMgc3BlYy5DbGFzc1R5cGUsXG4gICAgICAgIHByb3AsXG4gICAgICApO1xuICAgICAgaWYgKGltcGxlbWVudGVkSW5CYXNlIHx8IGRhdGF0eXBlIHx8IHByb3h5KSB7XG4gICAgICAgIC8vIE92ZXJyaWRlIGlmIHRoZSBwcm9wZXJ0eSBpcyBpbiBhIGRhdGF0eXBlIG9yIHByb3h5IGNsYXNzIG9yIGRlY2xhcmVkIGluIGEgcGFyZW50IGNsYXNzLiBJZiB0aGUgbWVtYmVyIGlzXG4gICAgICAgIC8vIHN0YXRpYywgdXNlIHRoZSBcIm5ld1wiIGtleXdvcmQgaW5zdGVhZCwgdG8gaW5kaWNhdGUgd2UgYXJlIGludGVudGlvbmFsbHkgaGlkaW5nIHRoZSBhbmNlc3RvciBkZWNsYXJhdGlvbiAoYXNcbiAgICAgICAgLy8gQyMgZG9lcyBub3QgaW5oZXJpdCBzdGF0aWNzLCB0aGV5IGNhbiBiZSBoaWRkZW4gYnV0IG5vdCBvdmVycmlkZGVuKS5UaGUgXCJuZXdcIiBrZXl3b3JkIGlzIG9wdGlvbmFsIGluIHRoaXNcbiAgICAgICAgLy8gY29udGV4dCwgYnV0IGhlbHBzIGNsYXJpZnkgaW50ZW50aW9uLlxuICAgICAgICBpc092ZXJyaWRlS2V5V29yZCA9IHByb3Auc3RhdGljID8gJ25ldyAnIDogJ292ZXJyaWRlICc7XG4gICAgICB9IGVsc2UgaWYgKHByb3AuYWJzdHJhY3QpIHtcbiAgICAgICAgLy8gQWJzdHJhY3QgbWVtYmVycyBnZXQgZGVjb3JhdGVkIGFzIHN1Y2hcbiAgICAgICAgaXNBYnN0cmFjdEtleXdvcmQgPSAnYWJzdHJhY3QgJztcbiAgICAgIH0gZWxzZSBpZiAoIXByb3Auc3RhdGljICYmICFpbXBsZW1lbnRlZEluQmFzZSkge1xuICAgICAgICAvLyBWaXJ0dWFsIGlmIHRoZSBwcm9wIGlzIG5vdCBzdGF0aWMsIGFuZCBpcyBub3QgaW1wbGVtZW50ZWQgaW4gYmFzZSBtZW1iZXIsIHRoaXMgd2F5IHdlIGNhbiBsYXRlciBvdmVycmlkZSBpdC5cbiAgICAgICAgaXNWaXJ0dWFsS2V5V29yZCA9ICd2aXJ0dWFsICc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcFR5cGVGUU4gPSB0aGlzLnR5cGVyZXNvbHZlci50b0RvdE5ldFR5cGUocHJvcC50eXBlKTtcbiAgICBjb25zdCBpc09wdGlvbmFsID0gcHJvcC5vcHRpb25hbCA/ICc/JyA6ICcnO1xuICAgIGNvbnN0IHN0YXRlbWVudCA9IGAke2FjY2Vzc30gJHtpc0Fic3RyYWN0S2V5d29yZH0ke2lzVmlydHVhbEtleVdvcmR9JHtzdGF0aWNLZXlXb3JkfSR7aXNPdmVycmlkZUtleVdvcmR9JHtwcm9wVHlwZUZRTn0ke2lzT3B0aW9uYWx9ICR7cHJvcE5hbWV9YDtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKHN0YXRlbWVudCk7XG5cbiAgICAvLyBFbWl0IGdldHRlcnNcbiAgICBpZiAoZGF0YXR5cGUgfHwgcHJvcC5jb25zdCB8fCBwcm9wLmFic3RyYWN0KSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnZ2V0OycpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUgcHJvcGVydHkgaXMgbm9uLW9wdGlvbmFsLCBhZGQgYSBiYW5nIHRvIHNpbGVuY2UgY29tcGlsZXIgd2FybmluZ1xuICAgICAgY29uc3QgYmFuZyA9IHByb3Aub3B0aW9uYWwgPyAnJyA6ICchJztcbiAgICAgIGlmIChwcm9wLnN0YXRpYykge1xuICAgICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgICBgZ2V0ID0+IEdldFN0YXRpY1Byb3BlcnR5PCR7cHJvcFR5cGVGUU59JHtpc09wdGlvbmFsfT4odHlwZW9mKCR7Y2xhc3NOYW1lfSkpJHtiYW5nfTtgLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgICAgYGdldCA9PiBHZXRJbnN0YW5jZVByb3BlcnR5PCR7cHJvcFR5cGVGUU59JHtpc09wdGlvbmFsfT4oKSR7YmFuZ307YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbWl0IHNldHRlcnNcbiAgICBpZiAoZGF0YXR5cGUgfHwgKCFwcm9wLmltbXV0YWJsZSAmJiBwcm9wLmFic3RyYWN0KSkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJ3NldDsnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFwcm9wLmltbXV0YWJsZSkge1xuICAgICAgICBpZiAocHJvcC5zdGF0aWMpIHtcbiAgICAgICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgICAgIGBzZXQgPT4gU2V0U3RhdGljUHJvcGVydHkodHlwZW9mKCR7Y2xhc3NOYW1lfSksIHZhbHVlKTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb2RlLmxpbmUoJ3NldCA9PiBTZXRJbnN0YW5jZVByb3BlcnR5KHZhbHVlKTsnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICB0aGlzLmZsYWdGaXJzdE1lbWJlcldyaXR0ZW4odHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYSBjb25zdGFudCBwcm9wZXJ0eVxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0Q29uc3RQcm9wZXJ0eShjbHM6IHNwZWMuQ2xhc3NUeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KTogdm9pZCB7XG4gICAgdGhpcy5lbWl0TmV3TGluZUlmTmVjZXNzYXJ5KCk7XG4gICAgdGhpcy5mbGFnRmlyc3RNZW1iZXJXcml0dGVuKHRydWUpO1xuICAgIGNvbnN0IHByb3BUeXBlID0gdGhpcy50eXBlcmVzb2x2ZXIudG9Eb3ROZXRUeXBlKHByb3AudHlwZSk7XG4gICAgY29uc3QgaXNPcHRpb25hbCA9IHByb3Aub3B0aW9uYWwgPyAnPycgOiAnJztcbiAgICB0aGlzLmRvdG5ldERvY0dlbmVyYXRvci5lbWl0RG9jcyhwcm9wLCB7XG4gICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgZnFuOiBjbHMuZnFuLFxuICAgICAgbWVtYmVyTmFtZTogcHJvcC5uYW1lLFxuICAgIH0pO1xuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0QXR0cmlidXRlc0ZvclByb3BlcnR5KHByb3ApO1xuICAgIGNvbnN0IGFjY2VzcyA9IHRoaXMucmVuZGVyQWNjZXNzTGV2ZWwocHJvcCk7XG4gICAgY29uc3QgcHJvcE5hbWUgPSB0aGlzLm5hbWV1dGlscy5jb252ZXJ0UHJvcGVydHlOYW1lKHByb3AubmFtZSk7XG4gICAgY29uc3Qgc3RhdGljS2V5d29yZCA9IHByb3Auc3RhdGljID8gJ3N0YXRpYyAnIDogJyc7XG5cbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYCR7YWNjZXNzfSAke3N0YXRpY0tleXdvcmR9JHtwcm9wVHlwZX0ke2lzT3B0aW9uYWx9ICR7cHJvcE5hbWV9YCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCdnZXQ7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICBjb25zdCBjbGFzc05hbWUgPSB0aGlzLnR5cGVyZXNvbHZlci50b05hdGl2ZUZxbihjbHMuZnFuKTtcbiAgICAvLyBJZiB0aGUgcHJvcGVydHkgaXMgbm9uLW9wdGlvbmFsLCBhZGQgYSBiYW5nIHRvIHNpbGVuY2UgdGhlIGNvbXBpbGVyIHdhcm5pbmdcbiAgICBjb25zdCBiYW5nID0gcHJvcC5vcHRpb25hbCA/ICcnIDogJyEnO1xuICAgIGNvbnN0IGluaXRpYWxpemVyID0gcHJvcC5zdGF0aWNcbiAgICAgID8gYD0gR2V0U3RhdGljUHJvcGVydHk8JHtwcm9wVHlwZX0+KHR5cGVvZigke2NsYXNzTmFtZX0pKSR7YmFuZ307YFxuICAgICAgOiBgPSBHZXRJbnN0YW5jZVByb3BlcnR5PCR7cHJvcFR5cGV9Pih0eXBlb2YoJHtjbGFzc05hbWV9KSkke2Jhbmd9O2A7XG4gICAgdGhpcy5jb2RlLmxpbmUoaW5pdGlhbGl6ZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJBY2Nlc3NMZXZlbChtZXRob2Q6IHNwZWMuTWV0aG9kIHwgc3BlYy5Qcm9wZXJ0eSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG1ldGhvZC5wcm90ZWN0ZWQgPyAncHJvdGVjdGVkJyA6ICdwdWJsaWMnO1xuICB9XG5cbiAgcHJpdmF0ZSBpc05lc3RlZCh0eXBlOiBzcGVjLlR5cGUpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuYXNzZW1ibHkudHlwZXMgfHwgIXR5cGUubmFtZXNwYWNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGAke3R5cGUuYXNzZW1ibHl9LiR7dHlwZS5uYW1lc3BhY2V9YDtcbiAgICByZXR1cm4gcGFyZW50IGluIHRoaXMuYXNzZW1ibHkudHlwZXM7XG4gIH1cblxuICBwcml2YXRlIHRvQ1NoYXJwRmlsZVBhdGgodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dHlwZX0uY3NgO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuRmlsZUlmTmVlZGVkKFxuICAgIHR5cGVOYW1lOiBzdHJpbmcsXG4gICAgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgaXNOZXN0ZWQ6IGJvb2xlYW4sXG4gICAgdXNpbmdEZXB1dHkgPSB0cnVlLFxuICApOiB2b2lkIHtcbiAgICAvLyBJZiBOZXN0ZWQgdHlwZSwgd2Ugc2hvdWxkbid0IG9wZW4vY2xvc2UgYSBmaWxlXG4gICAgaWYgKGlzTmVzdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZG90bmV0UGFja2FnZUlkID0gdGhpcy5hc3NlbWJseS50YXJnZXRzPy5kb3RuZXQ/LnBhY2thZ2VJZDtcbiAgICBpZiAoIWRvdG5ldFBhY2thZ2VJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIG1vZHVsZSAke3RoaXMuYXNzZW1ibHkubmFtZX0gZG9lcyBub3QgaGF2ZSBhIGRvdG5ldC5wYWNrYWdlSWQgc2V0dGluZ2AsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBmaWxlUGF0aCA9IG5hbWVzcGFjZS5yZXBsYWNlKC9bLl0vZywgJy8nKTtcbiAgICB0aGlzLmNvZGUub3BlbkZpbGUoXG4gICAgICBwYXRoLmpvaW4oZG90bmV0UGFja2FnZUlkLCBmaWxlUGF0aCwgdGhpcy50b0NTaGFycEZpbGVQYXRoKHR5cGVOYW1lKSksXG4gICAgKTtcbiAgICBpZiAodXNpbmdEZXB1dHkpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCd1c2luZyBBbWF6b24uSlNJSS5SdW50aW1lLkRlcHV0eTsnKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgfVxuXG4gICAgLy8gU3VwcHJlc3Mgd2FybmluZ3MgYWJvdXQgbWlzc2luZyBYTUxEb2MsIE9ic29sZXRlIGluY29uc2lzdGVuY2llc1xuICAgIHRoaXMuY29kZS5saW5lKCcjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSBDUzA2NzIsQ1MwODA5LENTMTU5MScpO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG5cbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBuYW1lc3BhY2UgJHtuYW1lc3BhY2V9YCk7XG4gIH1cblxuICBwcml2YXRlIGNsb3NlRmlsZUlmTmVlZGVkKFxuICAgIHR5cGVOYW1lOiBzdHJpbmcsXG4gICAgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgaXNOZXN0ZWQ6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGlmIChpc05lc3RlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgY29uc3QgZG90bmV0UGFja2FnZUlkID0gdGhpcy5hc3NlbWJseS50YXJnZXRzPy5kb3RuZXQ/LnBhY2thZ2VJZDtcbiAgICBpZiAoIWRvdG5ldFBhY2thZ2VJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIG1vZHVsZSAke3RoaXMuYXNzZW1ibHkubmFtZX0gZG9lcyBub3QgaGF2ZSBhIGRvdG5ldC5wYWNrYWdlSWQgc2V0dGluZ2AsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBmaWxlUGF0aCA9IG5hbWVzcGFjZS5yZXBsYWNlKC9bLl0vZywgJy8nKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VGaWxlKFxuICAgICAgcGF0aC5qb2luKGRvdG5ldFBhY2thZ2VJZCwgZmlsZVBhdGgsIHRoaXMudG9DU2hhcnBGaWxlUGF0aCh0eXBlTmFtZSkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBmaXJzdE1lbWJlciBib29sZWFuIGZsYWcgdG8ga2VlcCB0cmFjayBvZiB0aGUgZmlyc3QgbWVtYmVyIG9mIGEgbmV3IGZpbGVcbiAgICpcbiAgICogVGhpcyBhdm9pZHMgdW5uZWNlc3Nhcnkgd2hpdGUgbGluZXNcbiAgICovXG4gIHByaXZhdGUgZmxhZ0ZpcnN0TWVtYmVyV3JpdHRlbihmaXJzdDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZmlyc3RNZW1iZXJXcml0dGVuID0gZmlyc3Q7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYSBuZXcgbGluZSBwcmlvciB0byB3cml0aW5nIGEgbmV3IHByb3BlcnR5LCBtZXRob2QsIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgdGhlIGZpcnN0IG9uZSBpbiB0aGUgY2xhc3NcbiAgICpcbiAgICogVGhpcyBhdm9pZHMgdW5uZWNlc3Nhcnkgd2hpdGUgbGluZXMuXG4gICAqL1xuICBwcml2YXRlIGVtaXROZXdMaW5lSWZOZWNlc3NhcnkoKTogdm9pZCB7XG4gICAgLy8gSWYgdGhlIGZpcnN0IG1lbWJlciBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4sIGl0IGlzIHNhZmUgdG8gd3JpdGUgYSBuZXcgbGluZVxuICAgIGlmICh0aGlzLmZpcnN0TWVtYmVyV3JpdHRlbikge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maXJzdE1lbWJlcldyaXR0ZW4gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRBc3NlbWJseURvY3MoKSB7XG4gICAgdGhpcy5lbWl0TmFtZXNwYWNlRG9jcyhcbiAgICAgIHRoaXMuYXNzZW1ibHkudGFyZ2V0cyEuZG90bmV0IS5uYW1lc3BhY2UsXG4gICAgICB0aGlzLmFzc2VtYmx5Lm5hbWUsXG4gICAgICB0aGlzLmFzc2VtYmx5LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdCBhbiB1bnVzZWQsIGVtcHR5IGNsYXNzIGNhbGxlZCBgTmFtZXNwYWNlRG9jYCB0byBhdHRhY2ggdGhlIG1vZHVsZSBSRUFETUUgdG9cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gd2F5IHRvIGF0dGFjaCBkb2MgY29tbWVudHMgdG8gYSBuYW1lc3BhY2UgaW4gQyMsIGFuZCB0aGlzIHRyaWNrIGhhcyBiZWVuXG4gICAqIHNlbWktc3RhbmRhcmRpemVkIGJ5IE5Eb2MgYW5kIFNhbmRjYXN0bGUgSGVscCBGaWxlIEJ1aWxkZXIuXG4gICAqXG4gICAqIERvY0ZYIGRvZXNuJ3Qgc3VwcG9ydCBpdCBvdXQgb2YgdGhlIGJveCwgYnV0IHdlIHNob3VsZCBiZSBhYmxlIHRvIGdldCB0aGVyZSB3aXRoIGFcbiAgICogYml0IG9mIGhhY2tlcnkuXG4gICAqXG4gICAqIEluIGFueSBjYXNlLCB3ZSBuZWVkIGEgcGxhY2UgdG8gYXR0YWNoIHRoZSBkb2NzIHdoZXJlIHRoZXkgY2FuIGJlIHRyYW5zcG9ydGVkIGFyb3VuZCxcbiAgICogbWlnaHQgYXMgd2VsbCBiZSB0aGlzIG1ldGhvZC5cbiAgICovXG4gIHByaXZhdGUgZW1pdE5hbWVzcGFjZURvY3MoXG4gICAgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAganNpaUZxbjogc3RyaW5nLFxuICAgIGRvY1NvdXJjZTogc3BlYy5UYXJnZXRhYmxlICYgc3BlYy5SZWFkTWVDb250YWluZXIsXG4gICkge1xuICAgIGlmICghZG9jU291cmNlLnJlYWRtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9ICdOYW1lc3BhY2VEb2MnO1xuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZChjbGFzc05hbWUsIG5hbWVzcGFjZSwgZmFsc2UsIGZhbHNlKTtcblxuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXRNYXJrZG93bkFzUmVtYXJrcyhkb2NTb3VyY2UucmVhZG1lLm1hcmtkb3duLCB7XG4gICAgICBhcGk6ICdtb2R1bGVSZWFkbWUnLFxuICAgICAgbW9kdWxlRnFuOiBqc2lpRnFuLFxuICAgIH0pO1xuICAgIHRoaXMuZW1pdEhpZGVBdHRyaWJ1dGUoKTtcbiAgICAvLyBUcmFkaXRpb25hbGx5IHRoaXMgY2xhc3MgaXMgbWFkZSAnaW50ZXJuYWwnLCBidXQgdGhhdCBpbnRlcmFjdHMgcG9vcmx5IHdpdGggRG9jRlgncyBkZWZhdWx0IGZpbHRlcnNcbiAgICAvLyB3aGljaCBhcmVuJ3Qgb3ZlcnJpZGFibGUuIFNvIHdlIG1ha2UgaXQgcHVibGljLCBidXQgdXNlIGF0dHJpYnV0ZXMgdG8gaGlkZSBpdCBmcm9tIHVzZXJzJyBJbnRlbGxpU2Vuc2UsXG4gICAgLy8gc28gdGhhdCB3ZSBjYW4gYWNjZXNzIHRoZSBjbGFzcyBpbiBEb2NGWC5cbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBwdWJsaWMgY2xhc3MgJHtjbGFzc05hbWV9YCk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNsb3NlRmlsZUlmTmVlZGVkKGNsYXNzTmFtZSwgbmFtZXNwYWNlLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdCBhbiBhdHRyaWJ1dGUgdGhhdCB3aWxsIGhpZGUgdGhlIHN1YnNlcXVlbnQgQVBJIGVsZW1lbnQgZnJvbSB1c2Vyc1xuICAgKi9cbiAgcHJpdmF0ZSBlbWl0SGlkZUF0dHJpYnV0ZSgpIHtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICdbU3lzdGVtLkNvbXBvbmVudE1vZGVsLkVkaXRvckJyb3dzYWJsZShTeXN0ZW0uQ29tcG9uZW50TW9kZWwuRWRpdG9yQnJvd3NhYmxlU3RhdGUuTmV2ZXIpXScsXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -63,3 +63,8 @@ export declare function toTypeName(ref?: OptionalValue | TypeReference): TypeNam
|
|
|
63
63
|
*/
|
|
64
64
|
export declare function toPackageName(fqn: string, rootAssm: Assembly): string;
|
|
65
65
|
export declare function mergePythonImports(...pythonImports: readonly PythonImports[]): PythonImports;
|
|
66
|
+
export declare function toPythonFqn(fqn: string, rootAssm: Assembly): {
|
|
67
|
+
assemblyName: string;
|
|
68
|
+
packageName: string;
|
|
69
|
+
pythonFqn: string;
|
|
70
|
+
};
|