UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

314 lines 63.2 kB
import { Injectable } from '@angular/core';
import { BooleanField } from '../../data-fields/boolean-field/models/boolean-field';
import { TextField } from '../../data-fields/text-field/models/text-field';
import { NumberField } from '../../data-fields/number-field/models/number-field';
import { EnumerationField } from '../../data-fields/enumeration-field/models/enumeration-field';
import { MultichoiceField } from '../../data-fields/multichoice-field/models/multichoice-field';
import { DateField } from '../../data-fields/date-field/models/date-field';
import { DateTimeField } from '../../data-fields/date-time-field/models/date-time-field';
import { UserField } from '../../data-fields/user-field/models/user-field';
import { ButtonField } from '../../data-fields/button-field/models/button-field';
import { FileField } from '../../data-fields/file-field/models/file-field';
import moment from 'moment';
import { UserValue } from '../../data-fields/user-field/models/user-value';
import { FieldTypeResource } from '../model/field-type-resource';
import { FileListField } from '../../data-fields/file-list-field/models/file-list-field';
import { TextAreaField } from '../../data-fields/text-field/models/text-area-field';
import { TaskRefField } from '../../data-fields/task-ref-field/model/task-ref-field';
import { DynamicEnumerationField } from '../../data-fields/enumeration-field/models/dynamic-enumeration-field';
import { FilterField } from '../../data-fields/filter-field/models/filter-field';
import { I18nField } from '../../data-fields/i18n-field/models/i18n-field';
import { UserListField } from '../../data-fields/user-list-field/models/user-list-field';
import { UserListValue } from '../../data-fields/user-list-field/models/user-list-value';
import { decodeBase64, encodeBase64 } from '../../utility/base64';
import { CaseRefField } from '../../data-fields/case-ref-field/model/case-ref-field';
import { StringCollectionField } from '../../data-fields/string-collection-field/models/string-collection-field';
import * as i0 from "@angular/core";
export class FieldConverterService {
    textFieldNames = ['richtextarea', 'htmltextarea', 'editor', 'htmlEditor'];
    constructor() {
    }
    toClass(item) {
        switch (item.type) {
            case FieldTypeResource.BOOLEAN:
                return new BooleanField(item.stringId, item.name, item.value, item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId);
            case FieldTypeResource.TEXT: {
                if (this.textFieldNames?.includes(item.component?.name)) {
                    return new TextAreaField(item.stringId, item.name, this.resolveTextValue(item, item.value), item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId);
                }
                return new TextField(item.stringId, item.name, this.resolveTextValue(item, item.value), item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId);
            }
            case FieldTypeResource.NUMBER:
                return new NumberField(item.stringId, item.name, item.value, item.behavior, item.validations, item.placeholder, item.description, item.layout, item.formatFilter, this.resolveNumberComponent(item), item.parentTaskId);
            case FieldTypeResource.ENUMERATION:
            case FieldTypeResource.ENUMERATION_MAP:
                return this.resolveEnumField(item);
            case FieldTypeResource.MULTICHOICE:
                return new MultichoiceField(item.stringId, item.name, item.value, this.resolveMultichoiceChoices(item), item.behavior, item.placeholder, item.description, item.layout, item.type, item.validations, item.component, item.parentTaskId);
            case FieldTypeResource.MULTICHOICE_MAP:
                return new MultichoiceField(item.stringId, item.name, item.value, this.resolveMultichoiceOptions(item), item.behavior, item.placeholder, item.description, item.layout, item.type, item.validations, item.component, item.parentTaskId);
            case FieldTypeResource.DATE: {
                let date;
                if (item.value) {
                    date = moment(new Date(item.value[0], item.value[1] - 1, item.value[2]));
                }
                return new DateField(item.stringId, item.name, date, item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId);
            }
            case FieldTypeResource.DATE_TIME: {
                let dateTime;
                if (item.value) {
                    dateTime = moment(new Date(item.value[0], item.value[1] - 1, item.value[2], item.value[3], item.value[4]));
                }
                return new DateTimeField(item.stringId, item.name, dateTime, item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId);
            }
            case FieldTypeResource.ACTOR: {
                let user;
                if (item.value) {
                    user = new UserValue(item.value.id, item.value.realmId, item.value.firstName, item.value.lastName, item.value.fullName, item.value.username);
                }
                return new UserField(item.stringId, item.name, item.behavior, user, item.roles, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId);
            }
            case FieldTypeResource.ACTOR_LIST: {
                let userListValue = new UserListValue(new Map());
                if (item.value) {
                    item.value.actorValues.forEach(u => userListValue.addUserValue(new UserValue(u.id, u.realmId, u.firstName, u.lastName, u.fullName, u.username)));
                }
                return new UserListField(item.stringId, item.name, item.behavior, userListValue, item.roles, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId);
            }
            case FieldTypeResource.BUTTON:
                return new ButtonField(item.stringId, item.name, item.behavior, item.value, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId);
            case FieldTypeResource.FILE:
                return new FileField(item.stringId, item.name, item.behavior, item.value ? item.value : {}, item.placeholder, item.description, item.layout, this.resolveByteSize(item.component?.properties?.maxSize), this.resolveAllowedTypes(item.component?.properties?.allowTypes?.split(',')), item.validations, item.component, item.parentTaskId);
            case FieldTypeResource.FILE_LIST:
                return new FileListField(item.stringId, item.name, item.behavior, item.value ? item.value : {}, item.placeholder, item.description, item.layout, item.validations, this.resolveByteSize(item.component?.properties?.maxSize), this.resolveAllowedTypes(item.component?.properties?.allowTypes?.split(',')), item.component, item.parentTaskId);
            case FieldTypeResource.TASK_REF:
                return new TaskRefField(item.stringId, item.name, item.value ? item.value : [], item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId);
            case FieldTypeResource.CASE_REF:
                return new CaseRefField(item.stringId, item.name, item.value ? item.value : [], item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId);
            case FieldTypeResource.FILTER:
                return new FilterField(item.stringId, item.name, item.value ?? '', item.filterMetadata, item.allowedNets, item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId);
            case FieldTypeResource.I18N:
                return new I18nField(item.stringId, item.name, item.value ?? { defaultValue: '' }, item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component);
            case FieldTypeResource.STRING_COLLECTION:
                return new StringCollectionField(item.stringId, item.name, item.value ? item.value : [], item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId);
        }
    }
    resolveType(item) {
        if (item instanceof BooleanField) {
            return FieldTypeResource.BOOLEAN;
        }
        else if (item instanceof ButtonField) {
            return FieldTypeResource.BUTTON;
        }
        else if (item instanceof TextField) {
            return FieldTypeResource.TEXT;
        }
        else if (item instanceof NumberField) {
            return FieldTypeResource.NUMBER;
        }
        else if (item instanceof DateField) {
            return FieldTypeResource.DATE;
        }
        else if (item instanceof DateTimeField) {
            return FieldTypeResource.DATE_TIME;
        }
        else if (item instanceof FileField) {
            return FieldTypeResource.FILE;
        }
        else if (item instanceof FileListField) {
            return FieldTypeResource.FILE_LIST;
        }
        else if (item instanceof UserField) {
            return FieldTypeResource.ACTOR;
        }
        else if (item instanceof UserListField) {
            return FieldTypeResource.ACTOR_LIST;
        }
        else if (item instanceof TaskRefField) {
            return FieldTypeResource.TASK_REF;
        }
        else if (item instanceof EnumerationField || item instanceof MultichoiceField) {
            return item.fieldType;
        }
        else if (item instanceof FilterField) {
            return FieldTypeResource.FILTER;
        }
        else if (item instanceof I18nField) {
            return FieldTypeResource.I18N;
        }
        else if (item instanceof CaseRefField) {
            return FieldTypeResource.CASE_REF;
        }
        else if (item instanceof StringCollectionField) {
            return FieldTypeResource.STRING_COLLECTION;
        }
    }
    formatValueForBackend(field, value) {
        if (this.resolveType(field) === FieldTypeResource.TEXT && value === null) {
            return null;
        }
        if (this.resolveType(field) === FieldTypeResource.TEXT && field.component && field.component.name === 'password') {
            return encodeBase64(value);
        }
        if (value === null) {
            return null;
        }
        if (value === undefined) {
            return;
        }
        if (this.resolveType(field) === FieldTypeResource.DATE) {
            if (moment.isMoment(value)) {
                return value.format('YYYY-MM-DD');
            }
        }
        if (this.resolveType(field) === FieldTypeResource.ACTOR) {
            return value.id;
        }
        if (this.resolveType(field) === FieldTypeResource.ACTOR_LIST) {
            return [...value.userValues.keys()];
        }
        if (this.resolveType(field) === FieldTypeResource.DATE_TIME) {
            if (moment.isMoment(value)) {
                return value.format('DD.MM.YYYY HH:mm:ss');
            }
        }
        return value;
    }
    resolveNumberComponent(numberField) {
        let numberComponent = { name: 'default', properties: undefined };
        if (numberField.component !== undefined) {
            numberComponent = {
                name: numberField.component.name,
                properties: numberField.component.properties,
            };
        }
        return numberComponent;
    }
    /**
     * Resolves `enumeration` and `eunumeration_map` fields into their appropriate class instances
     * @param enumField enumeration field resource
     */
    resolveEnumField(enumField) {
        const options = enumField.type === FieldTypeResource.ENUMERATION
            ? this.resolveEnumChoices(enumField)
            : this.resolveEnumOptions(enumField);
        if (enumField.component && enumField.component.name === 'autocomplete_dynamic') {
            return new DynamicEnumerationField(enumField.stringId, enumField.name, enumField.value, options, enumField.behavior, enumField.placeholder, enumField.description, enumField.layout, enumField.type, enumField.validations, enumField.component, enumField.parentTaskId);
        }
        else {
            return new EnumerationField(enumField.stringId, enumField.name, enumField.value, options, enumField.behavior, enumField.placeholder, enumField.description, enumField.layout, enumField.type, enumField.validations, enumField.component, enumField.parentTaskId);
        }
    }
    /**
     * This function is used to parse enumeration options from the `choices` attribute
     * @param enumField enumeration field resource object who's choices we want to resolve
     * @returns the options for the enumeration field
     */
    resolveEnumChoices(enumField) {
        const enumChoices = [];
        if (enumField.choices instanceof Array) {
            enumField.choices.forEach(it => {
                enumChoices.push({ key: it, value: it });
            });
        }
        else {
            Object.keys(enumField.choices).forEach(key => {
                enumChoices.push({ key, value: enumField.choices[key] });
            });
        }
        return enumChoices;
    }
    /**
     * This function is used to parse enumeration options from the `options` attribute
     * @param enumField enumeration field resource object who's options we want to resolve
     * @returns the options for the enumeration field
     */
    resolveEnumOptions(enumField) {
        return Object.entries(enumField.options).map(entry => ({ key: entry[0], value: entry[1] }));
    }
    /**
     * This function is used to parse multichoice options from the `choices` attribute
     * @param multiField multichoice field resource object who's options we want to resolve
     * @returns the options for the multichoice field
     */
    resolveMultichoiceChoices(multiField) {
        const choicesMulti = [];
        if (multiField.choices instanceof Array) {
            multiField.choices.forEach(it => {
                choicesMulti.push({ key: it, value: it });
            });
        }
        else {
            Object.keys(multiField.choices).forEach(key => {
                choicesMulti.push({ key, value: multiField.choices[key] });
            });
        }
        return choicesMulti;
    }
    /**
     * This function is used to parse enumeration options from the `options` attribute
     * @param multiField multichoice field resource object who's options we want to resolve
     * @returns the options for the multichoice field
     */
    resolveMultichoiceOptions(multiField) {
        return Object.entries(multiField.options).map(entry => ({ key: entry[0], value: entry[1] }));
    }
    formatValueFromBackend(field, value) {
        if (value === null) {
            return null;
        }
        if (value === undefined) {
            return;
        }
        if (this.resolveType(field) === FieldTypeResource.TEXT && field.component && field.component.name === 'password') {
            return decodeBase64(value);
        }
        if (this.resolveType(field) === FieldTypeResource.DATE) {
            return moment(new Date(value[0], value[1] - 1, value[2]));
        }
        if (this.resolveType(field) === FieldTypeResource.ACTOR) {
            return new UserValue(value.id, value.realmId, value.firstName, value.lastName, value.fullName, value.username);
        }
        if (this.resolveType(field) === FieldTypeResource.DATE_TIME) {
            return moment(new Date(value[0], value[1] - 1, value[2], value[3], value[4]));
        }
        if (this.resolveType(field) === FieldTypeResource.MULTICHOICE) {
            const array = [];
            value.forEach(v => {
                if (v.defaultValue) {
                    array.push(v.defaultValue);
                }
                else {
                    array.push(v);
                }
            });
            return array;
        }
        if (this.resolveType(field) === FieldTypeResource.ACTOR_LIST && !!value) {
            const userValues = !!value.actorValues ? value.actorValues : (!!value.userValues ? value.userValues : []);
            return new UserListValue(new Map(userValues.map(v => [v.id, v])));
        }
        return value;
    }
    resolveTextValue(field, value) {
        if (field.component !== undefined && field.component.name === 'password' && value !== '' && value !== undefined) {
            return decodeBase64(value);
        }
        return value;
    }
    resolveAllowedTypes(allowTypes) {
        return allowTypes?.length > 0 ? (allowTypes.length > 1 ? allowTypes : allowTypes[0]) : null;
    }
    resolveByteSize(bytesSize) {
        return bytesSize !== undefined ? bytesSize : null;
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FieldConverterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FieldConverterService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FieldConverterService, decorators: [{
            type: Injectable,
            args: [{
                    providedIn: 'root',
                }]
        }], ctorParameters: () => [] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtY29udmVydGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL3Rhc2stY29udGVudC9zZXJ2aWNlcy9maWVsZC1jb252ZXJ0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBR3pDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxzREFBc0QsQ0FBQztBQUNsRixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0RBQWdELENBQUM7QUFDekUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBQy9FLE9BQU8sRUFBQyxnQkFBZ0IsRUFBd0IsTUFBTSw4REFBOEQsQ0FBQztBQUNySCxPQUFPLEVBQUMsZ0JBQWdCLEVBQXdCLE1BQU0sOERBQThELENBQUM7QUFDckgsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSwwREFBMEQsQ0FBQztBQUN2RixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0RBQWdELENBQUM7QUFDekUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBQy9FLE9BQU8sRUFBQyxTQUFTLEVBQXFCLE1BQU0sZ0RBQWdELENBQUM7QUFDN0YsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sMERBQTBELENBQUM7QUFDdkYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFEQUFxRCxDQUFDO0FBRWxGLE9B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QUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDeEgsQ0FBQztJQUVTLGVBQWUsQ0FBQyxTQUFTO1FBQy9CLE9BQU8sU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdEQsQ0FBQzt3R0EzU1EscUJBQXFCOzRHQUFyQixxQkFBcUIsY0FGbEIsTUFBTTs7NEZBRVQscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0RhdGFGaWVsZFJlc291cmNlfSBmcm9tICcuLi9tb2RlbC9yZXNvdXJjZS1pbnRlcmZhY2UnO1xuaW1wb3J0IHtEYXRhRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL21vZGVscy9hYnN0cmFjdC1kYXRhLWZpZWxkJztcbmltcG9ydCB7Qm9vbGVhbkZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9ib29sZWFuLWZpZWxkL21vZGVscy9ib29sZWFuLWZpZWxkJztcbmltcG9ydCB7VGV4dEZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy90ZXh0LWZpZWxkL21vZGVscy90ZXh0LWZpZWxkJztcbmltcG9ydCB7TnVtYmVyRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL251bWJlci1maWVsZC9tb2RlbHMvbnVtYmVyLWZpZWxkJztcbmltcG9ydCB7RW51bWVyYXRpb25GaWVsZCwgRW51bWVyYXRpb25GaWVsZFZhbHVlfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9lbnVtZXJhdGlvbi1maWVsZC9tb2RlbHMvZW51bWVyYXRpb24tZmllbGQnO1xuaW1wb3J0IHtNdWx0aWNob2ljZUZpZWxkLCBNdWx0aWNob2ljZUZpZWxkVmFsdWV9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL211bHRpY2hvaWNlLWZpZWxkL21vZGVscy9tdWx0aWNob2ljZS1maWVsZCc7XG5pbXBvcnQge0RhdGVGaWVsZH0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvZGF0ZS1maWVsZC9tb2RlbHMvZGF0ZS1maWVsZCc7XG5pbXBvcnQge0RhdGVUaW1lRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL2RhdGUtdGltZS1maWVsZC9tb2RlbHMvZGF0ZS10aW1lLWZpZWxkJztcbmltcG9ydCB7VXNlckZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy91c2VyLWZpZWxkL21vZGVscy91c2VyLWZpZWxkJztcbmltcG9ydCB7QnV0dG9uRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL2J1dHRvbi1maWVsZC9tb2RlbHMvYnV0dG9uLWZpZWxkJztcbmltcG9ydCB7RmlsZUZpZWxkLCBGaWxlVXBsb2FkTUlNRVR5cGV9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL2ZpbGUtZmllbGQvbW9kZWxzL2ZpbGUtZmllbGQnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtVc2VyVmFsdWV9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL3VzZXItZmllbGQvbW9kZWxzL3VzZXItdmFsdWUnO1xuaW1wb3J0IHtGaWVsZFR5cGVSZXNvdXJjZX0gZnJvbSAnLi4vbW9kZWwvZmllbGQtdHlwZS1yZXNvdXJjZSc7XG5pbXBvcnQge0ZpbGVMaXN0RmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL2ZpbGUtbGlzdC1maWVsZC9tb2RlbHMvZmlsZS1saXN0LWZpZWxkJztcbmltcG9ydCB7VGV4dEFyZWFGaWVsZH0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvdGV4dC1maWVsZC9tb2RlbHMvdGV4dC1hcmVhLWZpZWxkJztcbmltcG9ydCB7Q29tcG9uZW50fSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9tb2RlbHMvY29tcG9uZW50JztcbmltcG9ydCB7VGFza1JlZkZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy90YXNrLXJlZi1maWVsZC9tb2RlbC90YXNrLXJlZi1maWVsZCc7XG5pbXBvcnQge0R5bmFtaWNFbnVtZXJhdGlvbkZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9lbnVtZXJhdGlvbi1maWVsZC9tb2RlbHMvZHluYW1pYy1lbnVtZXJhdGlvbi1maWVsZCc7XG5pbXBvcnQge0ZpbHRlckZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9maWx0ZXItZmllbGQvbW9kZWxzL2ZpbHRlci1maWVsZCc7XG5pbXBvcnQge0kxOG5GaWVsZH0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvaTE4bi1maWVsZC9tb2RlbHMvaTE4bi1maWVsZCc7XG5pbXBvcnQge1VzZXJMaXN0RmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL3VzZXItbGlzdC1maWVsZC9tb2RlbHMvdXNlci1saXN0LWZpZWxkJztcbmltcG9ydCB7VXNlckxpc3RWYWx1ZX0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvdXNlci1saXN0LWZpZWxkL21vZGVscy91c2VyLWxpc3QtdmFsdWUnO1xuaW1wb3J0IHtkZWNvZGVCYXNlNjQsIGVuY29kZUJhc2U2NH0gZnJvbSAnLi4vLi4vdXRpbGl0eS9iYXNlNjQnO1xuaW1wb3J0IHtDYXNlUmVmRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL2Nhc2UtcmVmLWZpZWxkL21vZGVsL2Nhc2UtcmVmLWZpZWxkJztcbmltcG9ydCB7U3RyaW5nQ29sbGVjdGlvbkZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9zdHJpbmctY29sbGVjdGlvbi1maWVsZC9tb2RlbHMvc3RyaW5nLWNvbGxlY3Rpb24tZmllbGQnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBGaWVsZENvbnZlcnRlclNlcnZpY2Uge1xuICAgIHByaXZhdGUgdGV4dEZpZWxkTmFtZXMgPSBbJ3JpY2h0ZXh0YXJlYScsICdodG1sdGV4dGFyZWEnLCAnZWRpdG9yJywgJ2h0bWxFZGl0b3InXTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0NsYXNzKGl0ZW06IERhdGFGaWVsZFJlc291cmNlKTogRGF0YUZpZWxkPGFueT4ge1xuICAgICAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVSZXNvdXJjZS5CT09MRUFOOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQm9vbGVhbkZpZWxkKGl0ZW0uc3RyaW5nSWQsIGl0ZW0ubmFtZSwgaXRlbS52YWx1ZSBhcyBib29sZWFuLCBpdGVtLmJlaGF2aW9yLFxuICAgICAgICAgICAgICAgICAgICBpdGVtLnBsYWNlaG9sZGVyLCBpdGVtLmRlc2NyaXB0aW9uLCBpdGVtLmxheW91dCwgaXRlbS52YWxpZGF0aW9ucywgaXRlbS5jb21wb25lbnQsIGl0ZW0ucGFyZW50VGFza0lkKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlUmVzb3VyY2UuVEVYVDoge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRleHRGaWVsZE5hbWVzPy5pbmNsdWRlcyhpdGVtLmNvbXBvbmVudD8ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0QXJlYUZpZWxkKGl0ZW0uc3RyaW5nSWQsIGl0ZW0ubmFtZSwgdGhpcy5yZXNvbHZlVGV4dFZhbHVlKGl0ZW0sIGl0ZW0udmFsdWUpLCBpdGVtLmJlaGF2aW9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wbGFjZWhvbGRlciwgaXRlbS5kZXNjcmlwdGlvbiwgaXRlbS5sYXlvdXQsIGl0ZW0udmFsaWRhdGlvbnMsIGl0ZW0uY29tcG9uZW50LCBpdGVtLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dEZpZWxkKGl0ZW0uc3RyaW5nSWQsIGl0ZW0ubmFtZSwgdGhpcy5yZXNvbHZlVGV4dFZhbHVlKGl0ZW0sIGl0ZW0udmFsdWUpLCBpdGVtLmJlaGF2aW9yLCBpdGVtLnBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICAgICAgICBpdGVtLmRlc2NyaXB0aW9uLCBpdGVtLmxheW91dCwgaXRlbS52YWxpZGF0aW9ucywgaXRlbS5jb21wb25lbnQsIGl0ZW0ucGFyZW50VGFza0lkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlUmVzb3VyY2UuTlVNQkVSOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTnVtYmVyRmllbGQoaXRlbS5zdHJpbmdJZCwgaXRlbS5uYW1lLCBpdGVtLnZhbHVlIGFzIG51bWJlciwgaXRlbS5iZWhhdmlvciwgaXRlbS52YWxpZGF0aW9ucywgaXRlbS5wbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5kZXNjcmlwdGlvbiwgaXRlbS5sYXlvdXQsIGl0ZW0uZm9ybWF0RmlsdGVyLCB0aGlzLnJlc29sdmVOdW1iZXJDb21wb25lbnQoaXRlbSksIGl0ZW0ucGFyZW50VGFza0lkKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlUmVzb3VyY2UuRU5VTUVSQVRJT046XG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZVJlc291cmNlLkVOVU1FUkFUSU9OX01BUDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlRW51bUZpZWxkKGl0ZW0pO1xuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVSZXNvdXJjZS5NVUxUSUNIT0lDRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE11bHRpY2hvaWNlRmllbGQoaXRlbS5zdHJpbmdJZCwgaXRlbS5uYW1lLCBpdGVtLnZhbHVlLCB0aGlzLnJlc29sdmVNdWx0aWNob2ljZUNob2ljZXMoaXRlbSksXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYmVoYXZpb3IsIGl0ZW0ucGxhY2Vob2xkZXIsIGl0ZW0uZGVzY3JpcHRpb24sIGl0ZW0ubGF5b3V0LCBpdGVtLnR5cGUsIGl0ZW0udmFsaWRhdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uY29tcG9uZW50LCBpdGVtLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZVJlc291cmNlLk1VTFRJQ0hPSUNFX01BUDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE11bHRpY2hvaWNlRmllbGQoaXRlbS5zdHJpbmdJZCwgaXRlbS5uYW1lLCBpdGVtLnZhbHVlLCB0aGlzLnJlc29sdmVNdWx0aWNob2ljZU9wdGlvbnMoaXRlbSksXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYmVoYXZpb3IsIGl0ZW0ucGxhY2Vob2xkZXIsIGl0ZW0uZGVzY3JpcHRpb24sIGl0ZW0ubGF5b3V0LFxuICAgICAgICAgICAgICAgICAgICBpdGVtLnR5cGUsIGl0ZW0udmFsaWRhdGlvbnMsIGl0ZW0uY29tcG9uZW50LCBpdGVtLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZVJlc291cmNlLkRBVEU6IHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0ZTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRlID0gbW9tZW50KG5ldyBEYXRlKGl0ZW0udmFsdWVbMF0sIGl0ZW0udmFsdWVbMV0gLSAxLCBpdGVtLnZhbHVlWzJdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZUZpZWxkKGl0ZW0uc3RyaW5nSWQsIGl0ZW0ubmFtZSwgZGF0ZSwgaXRlbS5iZWhhdmlvciwgaXRlbS5wbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5kZXNjcmlwdGlvbiwgaXRlbS5sYXlvdXQsIGl0ZW0udmFsaWRhdGlvbnMsIGl0ZW0uY29tcG9uZW50LCBpdGVtLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZVJlc291cmNlLkRBVEVfVElNRToge1xuICAgICAgICAgICAgICAgIGxldCBkYXRlVGltZTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRlVGltZSA9IG1vbWVudChuZXcgRGF0ZShpdGVtLnZhbHVlWzBdLCBpdGVtLnZhbHVlWzFdIC0gMSwgaXRlbS52YWx1ZVsyXSwgaXRlbS52YWx1ZVszXSwgaXRlbS52YWx1ZVs0XSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGVUaW1lRmllbGQoaXRlbS5zdHJpbmdJZCwgaXRlbS5uYW1lLCBkYXRlVGltZSwgaXRlbS5iZWhhdmlvcixcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5wbGFjZWhvbGRlciwgaXRlbS5kZXNjcmlwdGlvbiwgaXRlbS5sYXlvdXQsIGl0ZW0udmFsaWRhdGlvbnMsIGl0ZW0uY29tcG9uZW50LCBpdGVtLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZVJlc291cmNlLkFDVE9SOiB7XG4gICAgICAgICAgICAgICAgbGV0IHVzZXI7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlciA9IG5ldyBVc2VyVmFsdWUoaXRlbS52YWx1ZS5pZCwgaXRlbS52YWx1ZS5yZWFsbUlkLCBpdGVtLnZhbHVlLmZpcnN0TmFtZSwgaXRlbS52YWx1ZS5sYXN0TmFtZSwgaXRlbS52YWx1ZS5mdWxsTmFtZSwgaXRlbS52YWx1ZS51c2VybmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVXNlckZpZWxkKGl0ZW0uc3RyaW5nSWQsIGl0ZW0ubmFtZSwgaXRlbS5iZWhhdmlvciwgdXNlcixcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5yb2xlcywgaXRlbS5wbGFjZWhvbGRlciwgaXRlbS5kZXNjcmlwdGlvbiwgaXRlbS5sYXlvdXQsIGl0ZW0udmFsaWRhdGlvbnMsIGl0ZW0uY29tcG9uZW50LCBpdGVtLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZVJlc291cmNlLkFDVE9SX0xJU1Q6IHtcbiAgICAgICAgICAgICAgICBsZXQgdXNlckxpc3RWYWx1ZSA9IG5ldyBVc2VyTGlzdFZhbHVlKG5ldyBNYXA8c3RyaW5nLCBVc2VyVmFsdWU+KCkpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0udmFsdWUuYWN0b3JWYWx1ZXMuZm9yRWFjaCh1ID0+IHVzZXJMaXN0VmFsdWUuYWRkVXNlclZhbHVlKG5ldyBVc2VyVmFsdWUodS5pZCwgdS5yZWFsbUlkLCB1LmZpcnN0TmFtZSwgdS5sYXN0TmFtZSwgdS5mdWxsTmFtZSwgdS51c2VybmFtZSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVc2VyTGlzdEZpZWxkKGl0ZW0uc3RyaW5nSWQsIGl0ZW0ubmFtZSwgaXRlbS5iZWhhdmlvciwgdXNlckxpc3RWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5yb2xlcywgaXRlbS5wbGFjZWhvbGRlciwgaXRlbS5kZXNjcmlwdGlvbiwgaXRlbS5sYXlvdXQsIGl0ZW0udmFsaWRhdGlvbnMsIGl0ZW0uY29tcG9uZW50LCBpdGVtLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZVJlc291cmNlLkJVVFRPTjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1dHRvbkZpZWxkKGl0ZW0uc3RyaW5nSWQsIGl0ZW0ubmFtZSwgaXRlbS5iZWhhdmlvciwgaXRlbS52YWx1ZSBhcyBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucGxhY2Vob2xkZXIsIGl0ZW0uZGVzY3JpcHRpb24sIGl0ZW0ubGF5b3V0LCBpdGVtLnZhbGlkYXRpb25zLCBpdGVtLmNvbXBvbmVudCwgaXRlbS5wYXJlbnRUYXNrSWQpO1xuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVSZXNvdXJjZS5GSUxFOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZUZpZWxkKGl0ZW0uc3RyaW5nSWQsIGl0ZW0ubmFtZSwgaXRlbS5iZWhhdmlvciwgaXRlbS52YWx1ZSA/IGl0ZW0udmFsdWUgOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5wbGFjZWhvbGRlciwgaXRlbS5kZXNjcmlwdGlvbiwgaXRlbS5sYXlvdXQsIHRoaXMucmVzb2x2ZUJ5dGVTaXplKGl0ZW0uY29tcG9uZW50Py5wcm9wZXJ0aWVzPy5tYXhTaXplKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlQWxsb3dlZFR5cGVzKGl0ZW0uY29tcG9uZW50Py5wcm9wZXJ0aWVzPy5hbGxvd1R5cGVzPy5zcGxpdCgnLCcpKSwgaXRlbS52YWxpZGF0aW9ucywgaXRlbS5jb21wb25lbnQsIGl0ZW0ucGFyZW50VGFza0lkKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlUmVzb3VyY2UuRklMRV9MSVNUOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZUxpc3RGaWVsZChpdGVtLnN0cmluZ0lkLCBpdGVtLm5hbWUsIGl0ZW0uYmVoYXZpb3IsIGl0ZW0udmFsdWUgPyBpdGVtLnZhbHVlIDoge30sXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucGxhY2Vob2xkZXIsIGl0ZW0uZGVzY3JpcHRpb24sIGl0ZW0ubGF5b3V0LCBpdGVtLnZhbGlkYXRpb25zLCB0aGlzLnJlc29sdmVCeXRlU2l6ZShpdGVtLmNvbXBvbmVudD8ucHJvcGVydGllcz8ubWF4U2l6ZSksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZUFsbG93ZWRUeXBlcyhpdGVtLmNvbXBvbmVudD8ucHJvcGVydGllcz8uYWxsb3dUeXBlcz8uc3BsaXQoJywnKSksIGl0ZW0uY29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBpdGVtLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZVJlc291cmNlLlRBU0tfUkVGOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFza1JlZkZpZWxkKGl0ZW0uc3RyaW5nSWQsIGl0ZW0ubmFtZSwgaXRlbS52YWx1ZSA/IGl0ZW0udmFsdWUgOiBbXSwgaXRlbS5iZWhhdmlvcixcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5wbGFjZWhvbGRlciwgaXRlbS5kZXNjcmlwdGlvbiwgaXRlbS5sYXlvdXQsIGl0ZW0udmFsaWRhdGlvbnMsIGl0ZW0uY29tcG9uZW50LCBpdGVtLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZVJlc291cmNlLkNBU0VfUkVGOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2FzZVJlZkZpZWxkKGl0ZW0uc3RyaW5nSWQsIGl0ZW0ubmFtZSwgaXRlbS52YWx1ZSA/IGl0ZW0udmFsdWUgOiBbXSwgaXRlbS5iZWhhdmlvcixcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5wbGFjZWhvbGRlciwgaXRlbS5kZXNjcmlwdGlvbiwgaXRlbS5sYXlvdXQsIGl0ZW0udmFsaWRhdGlvbnMsIGl0ZW0uY29tcG9uZW50LCBpdGVtLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZVJlc291cmNlLkZJTFRFUjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbHRlckZpZWxkKGl0ZW0uc3RyaW5nSWQsIGl0ZW0ubmFtZSwgaXRlbS52YWx1ZSA/PyAnJywgaXRlbS5maWx0ZXJNZXRhZGF0YSwgaXRlbS5hbGxvd2VkTmV0cyxcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5iZWhhdmlvciwgaXRlbS5wbGFjZWhvbGRlciwgaXRlbS5kZXNjcmlwdGlvbiwgaXRlbS5sYXlvdXQsIGl0ZW0udmFsaWRhdGlvbnMsIGl0ZW0uY29tcG9uZW50LCBpdGVtLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZVJlc291cmNlLkkxOE46XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJMThuRmllbGQoaXRlbS5zdHJpbmdJZCwgaXRlbS5uYW1lLCBpdGVtLnZhbHVlID8/IHtkZWZhdWx0VmFsdWU6ICcnfSwgaXRlbS5iZWhhdmlvciwgaXRlbS5wbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5kZXNjcmlwdGlvbiwgaXRlbS5sYXlvdXQsIGl0ZW0udmFsaWRhdGlvbnMsIGl0ZW0uY29tcG9uZW50KTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlUmVzb3VyY2UuU1RSSU5HX0NPTExFQ1RJT046XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdDb2xsZWN0aW9uRmllbGQoaXRlbS5zdHJpbmdJZCwgaXRlbS5uYW1lLCBpdGVtLnZhbHVlID8gaXRlbS52YWx1ZSA6IFtdLCBpdGVtLmJlaGF2aW9yLFxuICAgICAgICAgICAgICAgICAgICBpdGVtLnBsYWNlaG9sZGVyLCBpdGVtLmRlc2NyaXB0aW9uLCBpdGVtLmxheW91dCwgaXRlbS52YWxpZGF0aW9ucywgaXRlbS5jb21wb25lbnQsIGl0ZW0ucGFyZW50VGFza0lkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZXNvbHZlVHlwZShpdGVtOiBEYXRhRmllbGQ8YW55Pik6IEZpZWxkVHlwZVJlc291cmNlIHtcbiAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBCb29sZWFuRmllbGQpIHtcbiAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGVSZXNvdXJjZS5CT09MRUFOO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBCdXR0b25GaWVsZCkge1xuICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZVJlc291cmNlLkJVVFRPTjtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVGV4dEZpZWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlUmVzb3VyY2UuVEVYVDtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgTnVtYmVyRmllbGQpIHtcbiAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGVSZXNvdXJjZS5OVU1CRVI7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIERhdGVGaWVsZCkge1xuICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZVJlc291cmNlLkRBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIERhdGVUaW1lRmllbGQpIHtcbiAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGVSZXNvdXJjZS5EQVRFX1RJTUU7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEZpbGVGaWVsZCkge1xuICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZVJlc291cmNlLkZJTEU7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEZpbGVMaXN0RmllbGQpIHtcbiAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGVSZXNvdXJjZS5GSUxFX0xJU1Q7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFVzZXJGaWVsZCkge1xuICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZVJlc291cmNlLkFDVE9SO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBVc2VyTGlzdEZpZWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlUmVzb3VyY2UuQUNUT1JfTElTVDtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVGFza1JlZkZpZWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlUmVzb3VyY2UuVEFTS19SRUY7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEVudW1lcmF0aW9uRmllbGQgfHwgaXRlbSBpbnN0YW5jZW9mIE11bHRpY2hvaWNlRmllbGQpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtLmZpZWxkVHlwZTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRmlsdGVyRmllbGQpIHtcbiAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGVSZXNvdXJjZS5GSUxURVI7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEkxOG5GaWVsZCkge1xuICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZVJlc291cmNlLkkxOE47XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENhc2VSZWZGaWVsZCkge1xuICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZVJlc291cmNlLkNBU0VfUkVGO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdHJpbmdDb2xsZWN0aW9uRmllbGQpIHtcbiAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGVSZXNvdXJjZS5TVFJJTkdfQ09MTEVDVElPTjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBmb3JtYXRWYWx1ZUZvckJhY2tlbmQoZmllbGQ6IERhdGFGaWVsZDxhbnk+LCB2YWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHRoaXMucmVzb2x2ZVR5cGUoZmllbGQpID09PSBGaWVsZFR5cGVSZXNvdXJjZS5URVhUICYmIHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZXNvbHZlVHlwZShmaWVsZCkgPT09IEZpZWxkVHlwZVJlc291cmNlLlRFWFQgJiYgZmllbGQuY29tcG9uZW50ICYmIGZpZWxkLmNvbXBvbmVudC5uYW1lID09PSAncGFzc3dvcmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlQmFzZTY0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVzb2x2ZVR5cGUoZmllbGQpID09PSBGaWVsZFR5cGVSZXNvdXJjZS5EQVRFKSB7XG4gICAgICAgICAgICBpZiAobW9tZW50LmlzTW9tZW50KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZXNvbHZlVHlwZShmaWVsZCkgPT09IEZpZWxkVHlwZVJlc291cmNlLkFDVE9SKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuaWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVzb2x2ZVR5cGUoZmllbGQpID09PSBGaWVsZFR5cGVSZXNvdXJjZS5BQ1RPUl9MSVNUKSB7XG4gICAgICAgICAgICByZXR1cm4gWy4uLnZhbHVlLnVzZXJWYWx1ZXMua2V5cygpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZXNvbHZlVHlwZShmaWVsZCkgPT09IEZpZWxkVHlwZVJlc291cmNlLkRBVEVfVElNRSkge1xuICAgICAgICAgICAgaWYgKG1vbWVudC5pc01vbWVudCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuZm9ybWF0KCdERC5NTS5ZWVlZIEhIOm1tOnNzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZXNvbHZlTnVtYmVyQ29tcG9uZW50KG51bWJlckZpZWxkOiBEYXRhRmllbGRSZXNvdXJjZSk6IENvbXBvbmVudCB7XG4gICAgICAgIGxldCBudW1iZXJDb21wb25lbnQgPSB7bmFtZTogJ2RlZmF1bHQnLCBwcm9wZXJ0aWVzOiB1bmRlZmluZWR9O1xuICAgICAgICBpZiAobnVtYmVyRmllbGQuY29tcG9uZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG51bWJlckNvbXBvbmVudCA9IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBudW1iZXJGaWVsZC5jb21wb25lbnQubmFtZSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBudW1iZXJGaWVsZC5jb21wb25lbnQucHJvcGVydGllcyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bWJlckNvbXBvbmVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBgZW51bWVyYXRpb25gIGFuZCBgZXVudW1lcmF0aW9uX21hcGAgZmllbGRzIGludG8gdGhlaXIgYXBwcm9wcmlhdGUgY2xhc3MgaW5zdGFuY2VzXG4gICAgICogQHBhcmFtIGVudW1GaWVsZCBlbnVtZXJhdGlvbiBmaWVsZCByZXNvdXJjZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZXNvbHZlRW51bUZpZWxkKGVudW1GaWVsZDogRGF0YUZpZWxkUmVzb3VyY2UpOiBFbnVtZXJhdGlvbkZpZWxkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGVudW1GaWVsZC50eXBlID09PSBGaWVsZFR5cGVSZXNvdXJjZS5FTlVNRVJBVElPTlxuICAgICAgICAgICAgPyB0aGlzLnJlc29sdmVFbnVtQ2hvaWNlcyhlbnVtRmllbGQpXG4gICAgICAgICAgICA6IHRoaXMucmVzb2x2ZUVudW1PcHRpb25zKGVudW1GaWVsZCk7XG4gICAgICAgIGlmIChlbnVtRmllbGQuY29tcG9uZW50ICYmIGVudW1GaWVsZC5jb21wb25lbnQubmFtZSA9PT0gJ2F1dG9jb21wbGV0ZV9keW5hbWljJykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljRW51bWVyYXRpb25GaWVsZChlbnVtRmllbGQuc3RyaW5nSWQsIGVudW1GaWVsZC5uYW1lLCBlbnVtRmllbGQudmFsdWUsIG9wdGlvbnMsXG4gICAgICAgICAgICAgICAgZW51bUZpZWxkLmJlaGF2aW9yLCBlbnVtRmllbGQucGxhY2Vob2xkZXIsIGVudW1GaWVsZC5kZXNjcmlwdGlvbiwgZW51bUZpZWxkLmxheW91dCxcbiAgICAgICAgICAgICAgICBlbnVtRmllbGQudHlwZSwgZW51bUZpZWxkLnZhbGlkYXRpb25zLCBlbnVtRmllbGQuY29tcG9uZW50LCBlbnVtRmllbGQucGFyZW50VGFza0lkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRW51bWVyYXRpb25GaWVsZChlbnVtRmllbGQuc3RyaW5nSWQsIGVudW1GaWVsZC5uYW1lLCBlbnVtRmllbGQudmFsdWUsIG9wdGlvbnMsXG4gICAgICAgICAgICAgICAgZW51bUZpZWxkLmJlaGF2aW9yLCBlbnVtRmllbGQucGxhY2Vob2xkZXIsIGVudW1GaWVsZC5kZXNjcmlwdGlvbiwgZW51bUZpZWxkLmxheW91dCxcbiAgICAgICAgICAgICAgICBlbnVtRmllbGQudHlwZSwgZW51bUZpZWxkLnZhbGlkYXRpb25zLCBlbnVtRmllbGQuY29tcG9uZW50LCBlbnVtRmllbGQucGFyZW50VGFza0lkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXJzZSBlbnVtZXJhdGlvbiBvcHRpb25zIGZyb20gdGhlIGBjaG9pY2VzYCBhdHRyaWJ1dGVcbiAgICAgKiBAcGFyYW0gZW51bUZpZWxkIGVudW1lcmF0aW9uIGZpZWxkIHJlc291cmNlIG9iamVjdCB3aG8ncyBjaG9pY2VzIHdlIHdhbnQgdG8gcmVzb2x2ZVxuICAgICAqIEByZXR1cm5zIHRoZSBvcHRpb25zIGZvciB0aGUgZW51bWVyYXRpb24gZmllbGRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVzb2x2ZUVudW1DaG9pY2VzKGVudW1GaWVsZDogRGF0YUZpZWxkUmVzb3VyY2UpOiBBcnJheTxFbnVtZXJhdGlvbkZpZWxkVmFsdWU+IHtcbiAgICAgICAgY29uc3QgZW51bUNob2ljZXMgPSBbXTtcbiAgICAgICAgaWYgKGVudW1GaWVsZC5jaG9pY2VzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGVudW1GaWVsZC5jaG9pY2VzLmZvckVhY2goaXQgPT4ge1xuICAgICAgICAgICAgICAgIGVudW1DaG9pY2VzLnB1c2goe2tleTogaXQsIHZhbHVlOiBpdH0gYXMgRW51bWVyYXRpb25GaWVsZFZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZW51bUZpZWxkLmNob2ljZXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBlbnVtQ2hvaWNlcy5wdXNoKHtrZXksIHZhbHVlOiBlbnVtRmllbGQuY2hvaWNlc1trZXldfSBhcyBFbnVtZXJhdGlvbkZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudW1DaG9pY2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXJzZSBlbnVtZXJhdGlvbiBvcHRpb25zIGZyb20gdGhlIGBvcHRpb25zYCBhdHRyaWJ1dGVcbiAgICAgKiBAcGFyYW0gZW51bUZpZWxkIGVudW1lcmF0aW9uIGZpZWxkIHJlc291cmNlIG9iamVjdCB3aG8ncyBvcHRpb25zIHdlIHdhbnQgdG8gcmVzb2x2ZVxuICAgICAqIEByZXR1cm5zIHRoZSBvcHRpb25zIGZvciB0aGUgZW51bWVyYXRpb24gZmllbGRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVzb2x2ZUVudW1PcHRpb25zKGVudW1GaWVsZDogRGF0YUZpZWxkUmVzb3VyY2UpOiBBcnJheTxFbnVtZXJhdGlvbkZpZWxkVmFsdWU+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGVudW1GaWVsZC5vcHRpb25zKS5tYXAoZW50cnkgPT4gKHtrZXk6IGVudHJ5WzBdLCB2YWx1ZTogZW50cnlbMV19KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHBhcnNlIG11bHRpY2hvaWNlIG9wdGlvbnMgZnJvbSB0aGUgYGNob2ljZXNgIGF0dHJpYnV0ZVxuICAgICAqIEBwYXJhbSBtdWx0aUZpZWxkIG11bHRpY2hvaWNlIGZpZWxkIHJlc291cmNlIG9iamVjdCB3aG8ncyBvcHRpb25zIHdlIHdhbnQgdG8gcmVzb2x2ZVxuICAgICAqIEByZXR1cm5zIHRoZSBvcHRpb25zIGZvciB0aGUgbXVsdGljaG9pY2UgZmllbGRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVzb2x2ZU11bHRpY2hvaWNlQ2hvaWNlcyhtdWx0aUZpZWxkOiBEYXRhRmllbGRSZXNvdXJjZSk6IEFycmF5PE11bHRpY2hvaWNlRmllbGRWYWx1ZT4ge1xuICAgICAgICBjb25zdCBjaG9pY2VzTXVsdGk6IEFycmF5PE11bHRpY2hvaWNlRmllbGRWYWx1ZT4gPSBbXTtcbiAgICAgICAgaWYgKG11bHRpRmllbGQuY2hvaWNlcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICBtdWx0aUZpZWxkLmNob2ljZXMuZm9yRWFjaChpdCA9PiB7XG4gICAgICAgICAgICAgICAgY2hvaWNlc011bHRpLnB1c2goe2tleTogaXQsIHZhbHVlOiBpdH0gYXMgTXVsdGljaG9pY2VGaWVsZFZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMobXVsdGlGaWVsZC5jaG9pY2VzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgY2hvaWNlc011bHRpLnB1c2goe2tleSwgdmFsdWU6IG11bHRpRmllbGQuY2hvaWNlc1trZXldfSBhcyBNdWx0aWNob2ljZUZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNob2ljZXNNdWx0aTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGFyc2UgZW51bWVyYXRpb24gb3B0aW9ucyBmcm9tIHRoZSBgb3B0aW9uc2AgYXR0cmlidXRlXG4gICAgICogQHBhcmFtIG11bHRpRmllbGQgbXVsdGljaG9pY2UgZmllbGQgcmVzb3VyY2Ugb2JqZWN0IHdobydzIG9wdGlvbnMgd2Ugd2FudCB0byByZXNvbHZlXG4gICAgICogQHJldHVybnMgdGhlIG9wdGlvbnMgZm9yIHRoZSBtdWx0aWNob2ljZSBmaWVsZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZXNvbHZlTXVsdGljaG9pY2VPcHRpb25zKG11bHRpRmllbGQ6IERhdGFGaWVsZFJlc291cmNlKTogQXJyYXk8TXVsdGljaG9pY2VGaWVsZFZhbHVlPiB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyhtdWx0aUZpZWxkLm9wdGlvbnMpLm1hcChlbnRyeSA9PiAoe2tleTogZW50cnlbMF0sIHZhbHVlOiBlbnRyeVsxXX0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9ybWF0VmFsdWVGcm9tQmFja2VuZChmaWVsZDogRGF0YUZpZWxkPGFueT4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVzb2x2ZVR5cGUoZmllbGQpID09PSBGaWVsZFR5cGVSZXNvdXJjZS5URVhUICYmIGZpZWxkLmNvbXBvbmVudCAmJiBmaWVsZC5jb21wb25lbnQubmFtZSA9PT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICAgICAgcmV0dXJuIGRlY29kZUJhc2U2NCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVzb2x2ZVR5cGUoZmllbGQpID09PSBGaWVsZFR5cGVSZXNvdXJjZS5EQVRFKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9tZW50KG5ldyBEYXRlKHZhbHVlWzBdLCB2YWx1ZVsxXSAtIDEsIHZhbHVlWzJdKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVzb2x2ZVR5cGUoZmllbGQpID09PSBGaWVsZFR5cGVSZXNvdXJjZS5BQ1RPUikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBVc2VyVmFsdWUodmFsdWUuaWQsIHZhbHVlLnJlYWxtSWQsIHZhbHVlLmZpcnN0TmFtZSwgdmFsdWUubGFzdE5hbWUsIHZhbHVlLmZ1bGxOYW1lLCB2YWx1ZS51c2VybmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVzb2x2ZVR5cGUoZmllbGQpID09PSBGaWVsZFR5cGVSZXNvdXJjZS5EQVRFX1RJTUUpIHtcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQobmV3IERhdGUodmFsdWVbMF0sIHZhbHVlWzFdIC0gMSwgdmFsdWVbMl0sIHZhbHVlWzNdLCB2YWx1ZVs0XSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlc29sdmVUeXBlKGZpZWxkKSA9PT0gRmllbGRUeXBlUmVzb3VyY2UuTVVMVElDSE9JQ0UpIHtcbiAgICAgICAgICAgIGNvbnN0IGFycmF5ID0gW107XG4gICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKHYgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2LmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHYuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlc29sdmVUeXBlKGZpZWxkKSA9PT0gRmllbGRUeXBlUmVzb3VyY2UuQUNUT1JfTElTVCAmJiAhIXZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCB1c2VyVmFsdWVzID0gISF2YWx1ZS5hY3RvclZhbHVlcyA/IHZhbHVlLmFjdG9yVmFsdWVzIDogKCEhdmFsdWUudXNlclZhbHVlcyA/IHZhbHVlLnVzZXJWYWx1ZXMgOiBbXSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVzZXJMaXN0VmFsdWUobmV3IE1hcCh1c2VyVmFsdWVzLm1hcCh2ID0+IFt2LmlkLCB2XSkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc29sdmVUZXh0VmFsdWUoZmllbGQ6IERhdGFGaWVsZFJlc291cmNlLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGZpZWxkLmNvbXBvbmVudCAhPT0gdW5kZWZpbmVkICYmIGZpZWxkLmNvbXBvbmVudC5uYW1lID09PSAncGFzc3dvcmQnICYmIHZhbHVlICE9PSAnJyAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVjb2RlQmFzZTY0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc29sdmVBbGxvd2VkVHlwZXMoYWxsb3dUeXBlczogc3RyaW5nW10pIHtcbiAgICAgICAgcmV0dXJuIGFsbG93VHlwZXM/Lmxlbmd0aCA+IDAgPyAoYWxsb3dUeXBlcy5sZW5ndGggPiAxID8gYWxsb3dUeXBlcyBhcyBGaWxlVXBsb2FkTUlNRVR5cGVbXSA6IGFsbG93VHlwZXNbMF0pIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVzb2x2ZUJ5dGVTaXplKGJ5dGVzU2l6ZSkge1xuICAgICAgICByZXR1cm4gYnl0ZXNTaXplICE9PSB1bmRlZmluZWQgPyBieXRlc1NpemUgOiBudWxsO1xuICAgIH1cbn1cbiJdfQ==