@harbor/ui
Version:
Harbor shared UI components based on Clarity and Angular6
234 lines (233 loc) • 22 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, ViewChild, Input } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { ConfirmationDialogComponent } from '../confirmation-dialog/confirmation-dialog.component';
import { ConfirmationMessage } from '../confirmation-dialog/confirmation-message';
import { ConfigurationService, SystemInfoService } from '../service/index';
import { toPromise, compareValue, isEmptyObject, clone } from '../utils';
import { ErrorHandler } from '../error-handler/index';
import { SystemSettingsComponent, VulnerabilityConfigComponent, GcComponent } from './index';
import { Configuration } from './config';
export class RegistryConfigComponent {
/**
* @param {?} configService
* @param {?} errorHandler
* @param {?} translate
* @param {?} systemInfoService
*/
constructor(configService, errorHandler, translate, systemInfoService) {
this.configService = configService;
this.errorHandler = errorHandler;
this.translate = translate;
this.systemInfoService = systemInfoService;
this.config = new Configuration();
this.onGoing = false;
this.hasAdminRole = false;
}
/**
* @return {?}
*/
get shouldDisable() {
return !this.isValid() || !this.hasChanges() || this.onGoing;
}
/**
* @return {?}
*/
get hasCAFile() {
return this.systemInfo && this.systemInfo.has_ca_root;
}
/**
* @return {?}
*/
get withClair() {
return this.systemInfo && this.systemInfo.with_clair;
}
/**
* @return {?}
*/
get withAdmiral() {
return this.systemInfo && this.systemInfo.with_admiral;
}
/**
* @return {?}
*/
ngOnInit() {
this.loadSystemInfo();
// Initialize
this.load();
}
/**
* @return {?}
*/
isValid() {
return this.systemSettings &&
this.systemSettings.isValid &&
this.vulnerabilityCfg &&
this.vulnerabilityCfg.isValid;
}
/**
* @return {?}
*/
hasChanges() {
return !isEmptyObject(this.getChanges());
}
/**
* @return {?}
*/
loadSystemInfo() {
toPromise(this.systemInfoService.getSystemInfo())
.then((info) => this.systemInfo = info)
.catch(error => this.errorHandler.error(error));
}
/**
* @return {?}
*/
load() {
this.onGoing = true;
toPromise(this.configService.getConfigurations())
.then((config) => {
this.configCopy = clone(config);
this.config = config;
this.onGoing = false;
})
.catch(error => {
this.errorHandler.error(error);
this.onGoing = false;
});
}
/**
* @return {?}
*/
save() {
/** @type {?} */
let changes = this.getChanges();
if (isEmptyObject(changes)) {
// Guard code, do nothing
return;
}
this.onGoing = true;
toPromise(this.configService.saveConfigurations(changes))
.then(() => {
this.onGoing = false;
this.translate.get("CONFIG.SAVE_SUCCESS").subscribe((res) => {
this.errorHandler.info(res);
});
// Reload to fetch all the updates
this.load();
// Reload all system info
// this.loadSystemInfo();
})
.catch(error => {
this.onGoing = false;
this.errorHandler.error(error);
});
}
/**
* @return {?}
*/
cancel() {
/** @type {?} */
let msg = new ConfirmationMessage("CONFIG.CONFIRM_TITLE", "CONFIG.CONFIRM_SUMMARY", "", {}, 9 /* CONFIG */);
this.confirmationDlg.open(msg);
}
/**
* @param {?} ack
* @return {?}
*/
confirmCancel(ack) {
if (ack && ack.source === 9 /* CONFIG */ &&
ack.state === 1 /* CONFIRMED */) {
this.reset();
}
}
/**
* @return {?}
*/
reset() {
/** @type {?} */
let changes = this.getChanges();
for (let prop of Object.keys(changes)) {
this.config[prop] = clone(this.configCopy[prop]);
}
}
/**
* @return {?}
*/
getChanges() {
/** @type {?} */
let changes = {};
if (!this.config || !this.configCopy) {
return changes;
}
for (let prop of Object.keys(this.config)) {
/** @type {?} */
let field = this.configCopy[prop];
if (field && field.editable) {
if (!compareValue(field.value, this.config[prop].value)) {
changes[prop] = this.config[prop].value;
// Number
if (typeof field.value === "number") {
changes[prop] = +changes[prop];
}
// Trim string value
if (typeof field.value === "string") {
changes[prop] = ('' + changes[prop]).trim();
}
}
}
}
return changes;
}
}
RegistryConfigComponent.decorators = [
{ type: Component, args: [{
selector: 'hbr-registry-config',
template: "<clr-tabs>\n <clr-tab>\n <button id=\"config-system\" clrTabLink>{{'CONFIG.SYSTEM' | translate}}</button>\n <clr-tab-content id=\"system_settings\" *clrIfActive>\n <system-settings #systemSettings [(systemSettings)]=\"config\" [showSubTitle]=\"true\" [hasAdminRole]=\"hasAdminRole\" [hasCAFile]=\"hasCAFile\"\n [withAdmiral]=\"withAdmiral\">\n </system-settings>\n </clr-tab-content>\n </clr-tab>\n <clr-tab>\n <button id=\"config-vulnerability\" clrTabLink>{{'CONFIG.VULNERABILITY' | translate}}</button>\n <clr-tab-content id=\"vulnerability\" *clrIfActive>\n <vulnerability-config *ngIf=\"withClair\" #vulnerabilityConfig [(vulnerabilityConfig)]=\"config\" [showSubTitle]=\"true\"></vulnerability-config>\n </clr-tab-content>\n </clr-tab>\n <clr-tab>\n <button id=\"config-gc\" clrTabLink>{{'CONFIG.GC' | translate}}</button>\n <clr-tab-content id=\"gc\" *clrIfActive>\n <gc-config #gcConfig></gc-config>\n </clr-tab-content>\n </clr-tab>\n</clr-tabs>\n<confirmation-dialog #cfgConfirmationDialog (confirmAction)=\"confirmCancel($event)\"></confirmation-dialog>"
}] }
];
/** @nocollapse */
RegistryConfigComponent.ctorParameters = () => [
{ type: ConfigurationService },
{ type: ErrorHandler },
{ type: TranslateService },
{ type: SystemInfoService }
];
RegistryConfigComponent.propDecorators = {
hasAdminRole: [{ type: Input }],
systemSettings: [{ type: ViewChild, args: ["systemSettings",] }],
vulnerabilityCfg: [{ type: ViewChild, args: ["vulnerabilityConfig",] }],
gc: [{ type: ViewChild, args: ["gc",] }],
confirmationDlg: [{ type: ViewChild, args: ["cfgConfirmationDialog",] }]
};
if (false) {
/** @type {?} */
RegistryConfigComponent.prototype.config;
/** @type {?} */
RegistryConfigComponent.prototype.configCopy;
/** @type {?} */
RegistryConfigComponent.prototype.onGoing;
/** @type {?} */
RegistryConfigComponent.prototype.systemInfo;
/** @type {?} */
RegistryConfigComponent.prototype.hasAdminRole;
/** @type {?} */
RegistryConfigComponent.prototype.systemSettings;
/** @type {?} */
RegistryConfigComponent.prototype.vulnerabilityCfg;
/** @type {?} */
RegistryConfigComponent.prototype.gc;
/** @type {?} */
RegistryConfigComponent.prototype.confirmationDlg;
/** @type {?} */
RegistryConfigComponent.prototype.configService;
/** @type {?} */
RegistryConfigComponent.prototype.errorHandler;
/** @type {?} */
RegistryConfigComponent.prototype.translate;
/** @type {?} */
RegistryConfigComponent.prototype.systemInfoService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnktY29uZmlnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BoYXJib3IvdWkvIiwic291cmNlcyI6WyJzcmMvY29uZmlnL3JlZ2lzdHJ5LWNvbmZpZy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUd2RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNuRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUVsRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RixPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixhQUFhLEVBQ2IsS0FBSyxFQUNSLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsNEJBQTRCLEVBQUUsV0FBVyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFNekMsTUFBTTs7Ozs7OztJQWFGLFlBQ1ksZUFDQSxjQUNBLFdBQ0E7UUFIQSxrQkFBYSxHQUFiLGFBQWE7UUFDYixpQkFBWSxHQUFaLFlBQVk7UUFDWixjQUFTLEdBQVQsU0FBUztRQUNULHNCQUFpQixHQUFqQixpQkFBaUI7c0JBaEJMLElBQUksYUFBYSxFQUFFO3VCQUV4QixLQUFLOzRCQUdTLEtBQUs7S0FZakM7Ozs7SUFFTCxJQUFJLGFBQWE7UUFDYixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJ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QU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDckQsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDOztvQkFFeEMsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO3dCQUNqQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ2xDOztvQkFHRCxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7d0JBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztxQkFDL0M7aUJBQ0o7YUFDSjtTQUNKO1FBRUQsT0FBTyxPQUFPLENBQUM7S0FDbEI7OztZQWhLSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLHFCQUFxQjtnQkFDL0IsZ3NDQUErQzthQUNsRDs7OztZQWRRLG9CQUFvQjtZQU9wQixZQUFZO1lBYlosZ0JBQWdCO1lBTU0saUJBQWlCOzs7MkJBcUIzQyxLQUFLOzZCQUVMLFNBQVMsU0FBQyxnQkFBZ0I7K0JBQzFCLFNBQVMsU0FBQyxxQkFBcUI7aUJBQy9CLFNBQVMsU0FBQyxJQUFJOzhCQUNkLFNBQVMsU0FBQyx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5pbXBvcnQgeyBDb25maXJtYXRpb25TdGF0ZSwgQ29uZmlybWF0aW9uVGFyZ2V0cyB9IGZyb20gJy4uL3NoYXJlZC9zaGFyZWQuY29uc3QnO1xuaW1wb3J0IHsgQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vY29uZmlybWF0aW9uLWRpYWxvZy9jb25maXJtYXRpb24tZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb25maXJtYXRpb25NZXNzYWdlIH0gZnJvbSAnLi4vY29uZmlybWF0aW9uLWRpYWxvZy9jb25maXJtYXRpb24tbWVzc2FnZSc7XG5pbXBvcnQgeyBDb25maXJtYXRpb25BY2tub3dsZWRnZW1lbnQgfSBmcm9tICcuLi9jb25maXJtYXRpb24tZGlhbG9nL2NvbmZpcm1hdGlvbi1zdGF0ZS1tZXNzYWdlJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25TZXJ2aWNlLCBTeXN0ZW1JbmZvU2VydmljZSwgU3lzdGVtSW5mbyB9IGZyb20gJy4uL3NlcnZpY2UvaW5kZXgnO1xuaW1wb3J0IHtcbiAgICB0b1Byb21pc2UsXG4gICAgY29tcGFyZVZhbHVlLFxuICAgIGlzRW1wdHlPYmplY3QsXG4gICAgY2xvbmVcbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyIH0gZnJvbSAnLi4vZXJyb3ItaGFuZGxlci9pbmRleCc7XG5pbXBvcnQgeyBTeXN0ZW1TZXR0aW5nc0NvbXBvbmVudCwgVnVsbmVyYWJpbGl0eUNvbmZpZ0NvbXBvbmVudCwgR2NDb21wb25lbnR9IGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vY29uZmlnJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdoYnItcmVnaXN0cnktY29uZmlnJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcmVnaXN0cnktY29uZmlnLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBSZWdpc3RyeUNvbmZpZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgY29uZmlnOiBDb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTtcbiAgICBjb25maWdDb3B5OiBDb25maWd1cmF0aW9uO1xuICAgIG9uR29pbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBzeXN0ZW1JbmZvOiBTeXN0ZW1JbmZvO1xuXG4gICAgQElucHV0KCkgaGFzQWRtaW5Sb2xlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBAVmlld0NoaWxkKFwic3lzdGVtU2V0dGluZ3NcIikgc3lzdGVtU2V0dGluZ3M6IFN5c3RlbVNldHRpbmdzQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoXCJ2dWxuZXJhYmlsaXR5Q29uZmlnXCIpIHZ1bG5lcmFiaWxpdHlDZmc6IFZ1bG5lcmFiaWxpdHlDb25maWdDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZChcImdjXCIpIGdjOiBHY0NvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKFwiY2ZnQ29uZmlybWF0aW9uRGlhbG9nXCIpIGNvbmZpcm1hdGlvbkRsZzogQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXIsXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHN5c3RlbUluZm9TZXJ2aWNlOiBTeXN0ZW1JbmZvU2VydmljZVxuICAgICkgeyB9XG5cbiAgICBnZXQgc2hvdWxkRGlzYWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzVmFsaWQoKSB8fCAhdGhpcy5oYXNDaGFuZ2VzKCkgfHwgdGhpcy5vbkdvaW5nO1xuICAgIH1cblxuICAgIGdldCBoYXNDQUZpbGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5c3RlbUluZm8gJiYgdGhpcy5zeXN0ZW1JbmZvLmhhc19jYV9yb290O1xuICAgIH1cblxuICAgIGdldCB3aXRoQ2xhaXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5c3RlbUluZm8gJiYgdGhpcy5zeXN0ZW1JbmZvLndpdGhfY2xhaXI7XG4gICAgfVxuXG4gICAgZ2V0IHdpdGhBZG1pcmFsKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeXN0ZW1JbmZvICYmIHRoaXMuc3lzdGVtSW5mby53aXRoX2FkbWlyYWw7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9hZFN5c3RlbUluZm8oKTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZVxuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICB9XG5cbiAgICBpc1ZhbGlkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeXN0ZW1TZXR0aW5ncyAmJlxuICAgICAgICAgICAgdGhpcy5zeXN0ZW1TZXR0aW5ncy5pc1ZhbGlkICYmXG4gICAgICAgICAgICB0aGlzLnZ1bG5lcmFiaWxpdHlDZmcgJiZcbiAgICAgICAgICAgIHRoaXMudnVsbmVyYWJpbGl0eUNmZy5pc1ZhbGlkO1xuICAgIH1cblxuICAgIGhhc0NoYW5nZXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhaXNFbXB0eU9iamVjdCh0aGlzLmdldENoYW5nZXMoKSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHN5c3RlbSBpbmZvXG4gICAgbG9hZFN5c3RlbUluZm8oKTogdm9pZCB7XG4gICAgICAgIHRvUHJvbWlzZTxTeXN0ZW1JbmZvPih0aGlzLnN5c3RlbUluZm9TZXJ2aWNlLmdldFN5c3RlbUluZm8oKSlcbiAgICAgICAgICAgIC50aGVuKChpbmZvOiBTeXN0ZW1JbmZvKSA9PiB0aGlzLnN5c3RlbUluZm8gPSBpbmZvKVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHRoaXMuZXJyb3JIYW5kbGVyLmVycm9yKGVycm9yKSk7XG4gICAgfVxuXG4gICAgLy8gTG9hZCBjb25maWd1cmF0aW9uc1xuICAgIGxvYWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Hb2luZyA9IHRydWU7XG4gICAgICAgIHRvUHJvbWlzZTxDb25maWd1cmF0aW9uPih0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlndXJhdGlvbnMoKSlcbiAgICAgICAgICAgIC50aGVuKChjb25maWc6IENvbmZpZ3VyYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ0NvcHkgPSBjbG9uZShjb25maWcpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgICAgIHRoaXMub25Hb2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMub25Hb2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2F2ZSBjb25maWd1cmF0aW9uIGNoYW5nZXNcbiAgICBzYXZlKCk6IHZvaWQge1xuICAgICAgICBsZXQgY2hhbmdlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfCBhbnlbXSB9ID0gdGhpcy5nZXRDaGFuZ2VzKCk7XG5cbiAgICAgICAgaWYgKGlzRW1wdHlPYmplY3QoY2hhbmdlcykpIHtcbiAgICAgICAgICAgIC8vIEd1YXJkIGNvZGUsIGRvIG5vdGhpbmdcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub25Hb2luZyA9IHRydWU7XG4gICAgICAgIHRvUHJvbWlzZTxhbnk+KHRoaXMuY29uZmlnU2VydmljZS5zYXZlQ29uZmlndXJhdGlvbnMoY2hhbmdlcykpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkdvaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS5nZXQoXCJDT05GSUcuU0FWRV9TVUNDRVNTXCIpLnN1YnNjcmliZSgocmVzOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuaW5mbyhyZXMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIFJlbG9hZCB0byBmZXRjaCBhbGwgdGhlIHVwZGF0ZXNcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgICAgICAgICAgICAvLyBSZWxvYWQgYWxsIHN5c3RlbSBpbmZvXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5sb2FkU3lzdGVtSW5mbygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkdvaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsIHRoZSBjaGFuZ2VzIGlmIGhhdmVcbiAgICBjYW5jZWwoKTogdm9pZCB7XG4gICAgICAgIGxldCBtc2cgPSBuZXcgQ29uZmlybWF0aW9uTWVzc2FnZShcbiAgICAgICAgICAgIFwiQ09ORklHLkNPTkZJUk1fVElUTEVcIixcbiAgICAgICAgICAgIFwiQ09ORklHLkNPTkZJUk1fU1VNTUFSWVwiLFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgQ29uZmlybWF0aW9uVGFyZ2V0cy5DT05GSUdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maXJtYXRpb25EbGcub3Blbihtc2cpO1xuICAgIH1cblxuICAgIC8vIENvbmZpcm0gY2FuY2VsXG4gICAgY29uZmlybUNhbmNlbChhY2s6IENvbmZpcm1hdGlvbkFja25vd2xlZGdlbWVudCk6IHZvaWQge1xuICAgICAgICBpZiAoYWNrICYmIGFjay5zb3VyY2UgPT09IENvbmZpcm1hdGlvblRhcmdldHMuQ09ORklHICYmXG4gICAgICAgICAgICBhY2suc3RhdGUgPT09IENvbmZpcm1hdGlvblN0YXRlLkNPTkZJUk1FRCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXQoKTogdm9pZCB7XG4gICAgICAgIC8vIFJlc2V0IHRvIHRoZSB2YWx1ZXMgb2YgY29weVxuICAgICAgICBsZXQgY2hhbmdlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfCBhbnlbXSB9ID0gdGhpcy5nZXRDaGFuZ2VzKCk7XG4gICAgICAgIGZvciAobGV0IHByb3Agb2YgT2JqZWN0LmtleXMoY2hhbmdlcykpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnW3Byb3BdID0gY2xvbmUodGhpcy5jb25maWdDb3B5W3Byb3BdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENoYW5nZXMoKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfCBhbnlbXSB9IHtcbiAgICAgICAgbGV0IGNoYW5nZXM6IHsgW2tleTogc3RyaW5nXTogYW55IHwgYW55W10gfSA9IHt9O1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnIHx8ICF0aGlzLmNvbmZpZ0NvcHkpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZykpIHtcbiAgICAgICAgICAgIGxldCBmaWVsZCA9IHRoaXMuY29uZmlnQ29weVtwcm9wXTtcbiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5lZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgIGlmICghY29tcGFyZVZhbHVlKGZpZWxkLnZhbHVlLCB0aGlzLmNvbmZpZ1twcm9wXS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlc1twcm9wXSA9IHRoaXMuY29uZmlnW3Byb3BdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZC52YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlc1twcm9wXSA9ICtjaGFuZ2VzW3Byb3BdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVHJpbSBzdHJpbmcgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZC52YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlc1twcm9wXSA9ICgnJyArIGNoYW5nZXNbcHJvcF0pLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGFuZ2VzO1xuICAgIH1cbn1cbiJdfQ==