angular-odata
Version:
Client side OData typescript library for Angular
154 lines • 21.6 kB
JavaScript
import { QueryOption } from '../../../types';
import { Objects, Types } from '../../../utils';
import { Expression } from './base';
import { ComputeExpression } from './compute';
import { FilterExpression } from './filter';
import { OrderByExpression } from './orderby';
import { SearchExpression } from './search';
import { SelectExpression } from './select';
import { FieldFactory, render, RenderableFactory, resolve, } from './syntax';
export class ExpandField {
field;
values;
constructor(field, values = {}) {
this.field = field;
this.values = values;
}
get [Symbol.toStringTag]() {
return 'ExpandField';
}
toJson() {
return {
field: this.field.toJson(),
};
}
render({ aliases, escape, prefix, parser, options, }) {
parser = resolve([this.field], parser);
const params = [
QueryOption.select,
QueryOption.expand,
QueryOption.filter,
QueryOption.search,
QueryOption.orderBy,
QueryOption.compute,
QueryOption.skip,
QueryOption.top,
QueryOption.count,
QueryOption.levels,
]
.filter((key) => !Types.isEmpty(this.values[key]))
.reduce((acc, key) => {
let value = this.values[key];
if (Types.rawType(value).endsWith('Expression')) {
value = value.render({
aliases,
prefix,
escape,
parser,
options,
});
}
return Object.assign(acc, { [key]: value });
}, {});
let expand = `${render(this.field, {
aliases,
escape,
prefix,
parser,
options,
})}`;
if (!Types.isEmpty(params)) {
expand = `${expand}(${Object.keys(params)
.map((key) => `$${key}=${params[key]}`)
.join(';')})`;
}
return expand;
}
clone() {
const values = Object.keys(this.values).reduce((acc, key) => Object.assign(acc, { [key]: Objects.clone(this.values[key]) }), {});
return new ExpandField(typeof this.field === 'string' ? this.field : this.field.clone(), values);
}
resolve(parser) {
return parser;
}
select(opts) {
return this.option(QueryOption.select, SelectExpression.factory(opts, this.values[QueryOption.select]));
}
expand(opts) {
return this.option(QueryOption.expand, ExpandExpression.factory(opts, this.values[QueryOption.expand]));
}
filter(opts) {
return this.option(QueryOption.filter, FilterExpression.factory(opts, this.values[QueryOption.filter]));
}
search(opts) {
return this.option(QueryOption.search, SearchExpression.factory(opts, this.values[QueryOption.search]));
}
orderBy(opts) {
return this.option(QueryOption.orderBy, OrderByExpression.factory(opts, this.values[QueryOption.orderBy]));
}
compute(opts) {
return this.option(QueryOption.compute, ComputeExpression.factory(opts, this.values[QueryOption.compute]));
}
skip(n) {
return this.option(QueryOption.skip, n);
}
top(n) {
return this.option(QueryOption.top, n);
}
levels(n) {
return this.option(QueryOption.levels, n);
}
count() {
return this.option(QueryOption.count, true);
}
// Option Handler
option(name, opts) {
if (opts !== undefined)
this.values[name] = opts;
return this.values[name];
}
}
export class ExpandExpression extends Expression {
constructor({ children, } = {}) {
super({ children });
}
get [Symbol.toStringTag]() {
return 'ExpandExpression';
}
static factory(opts, current) {
return opts({
t: FieldFactory(),
e: () => new ExpandExpression(),
}, current);
}
toJson() {
const json = super.toJson();
return Object.assign(json, {});
}
static fromJson(json) {
return new ExpandExpression({
children: json['children'].map((c) => RenderableFactory(c)),
});
}
render({ aliases, escape, prefix, parser, options, } = {}) {
return this._children
.map((n) => n.render({ aliases, escape, prefix, parser, options }))
.join(',');
}
clone() {
return new ExpandExpression({
children: this._children.map((c) => c.clone()),
});
}
_add(node) {
this._children.push(node);
return this;
}
field(field, opts) {
let node = new ExpandField(field);
if (opts !== undefined)
opts(node);
return this._add(node);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwYW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3Jlc291cmNlcy9xdWVyeS9leHByZXNzaW9ucy9leHBhbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF5QixXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLGlCQUFpQixFQUE0QixNQUFNLFdBQVcsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQTJCLE1BQU0sVUFBVSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsRUFBNEIsTUFBTSxXQUFXLENBQUM7QUFDeEUsT0FBTyxFQUFFLGdCQUFnQixFQUEyQixNQUFNLFVBQVUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQTJCLE1BQU0sVUFBVSxDQUFDO0FBQ3JFLE9BQU8sRUFDTCxZQUFZLEVBQ1osTUFBTSxFQUVOLGlCQUFpQixFQUNqQixPQUFPLEdBQ1IsTUFBTSxVQUFVLENBQUM7QUFFbEIsTUFBTSxPQUFPLFdBQVc7SUFFVjtJQUNGO0lBRlYsWUFDWSxLQUFVLEVBQ1osU0FBa0MsRUFBRTtRQURsQyxVQUFLLEdBQUwsS0FBSyxDQUFLO1FBQ1osV0FBTSxHQUFOLE1BQU0sQ0FBOEI7SUFDM0MsQ0FBQztJQUVKLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ3RCLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTztZQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtTQUMzQixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxF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QUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELEtBQUssQ0FDSCxLQUFRLEVBQ1IsSUFBNEM7UUFFNUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxXQUFXLENBQWMsS0FBSyxDQUFDLENBQUM7UUFDL0MsSUFBSSxJQUFJLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFyc2VyLCBQYXJzZXJPcHRpb25zLCBRdWVyeU9wdGlvbiB9IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IE9iamVjdHMsIFR5cGVzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgUXVlcnlDdXN0b21UeXBlLCBVbnBhY2tlZCB9IGZyb20gJy4uL2J1aWxkZXInO1xuaW1wb3J0IHsgRXhwcmVzc2lvbiB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyBDb21wdXRlRXhwcmVzc2lvbiwgQ29tcHV0ZUV4cHJlc3Npb25CdWlsZGVyIH0gZnJvbSAnLi9jb21wdXRlJztcbmltcG9ydCB7IEZpbHRlckV4cHJlc3Npb24sIEZpbHRlckV4cHJlc3Npb25CdWlsZGVyIH0gZnJvbSAnLi9maWx0ZXInO1xuaW1wb3J0IHsgT3JkZXJCeUV4cHJlc3Npb24sIE9yZGVyQnlFeHByZXNzaW9uQnVpbGRlciB9IGZyb20gJy4vb3JkZXJieSc7XG5pbXBvcnQgeyBTZWFyY2hFeHByZXNzaW9uLCBTZWFyY2hFeHByZXNzaW9uQnVpbGRlciB9IGZyb20gJy4vc2VhcmNoJztcbmltcG9ydCB7IFNlbGVjdEV4cHJlc3Npb24sIFNlbGVjdEV4cHJlc3Npb25CdWlsZGVyIH0gZnJvbSAnLi9zZWxlY3QnO1xuaW1wb3J0IHtcbiAgRmllbGRGYWN0b3J5LFxuICByZW5kZXIsXG4gIFJlbmRlcmFibGUsXG4gIFJlbmRlcmFibGVGYWN0b3J5LFxuICByZXNvbHZlLFxufSBmcm9tICcuL3N5bnRheCc7XG5cbmV4cG9ydCBjbGFzcyBFeHBhbmRGaWVsZDxUPiBpbXBsZW1lbnRzIFJlbmRlcmFibGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZmllbGQ6IGFueSxcbiAgICBwcml2YXRlIHZhbHVlczogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgKSB7fVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICByZXR1cm4gJ0V4cGFuZEZpZWxkJztcbiAgfVxuXG4gIHRvSnNvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmllbGQ6IHRoaXMuZmllbGQudG9Kc29uKCksXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcih7XG4gICAgYWxpYXNlcyxcbiAgICBlc2NhcGUsXG4gICAgcHJlZml4LFxuICAgIHBhcnNlcixcbiAgICBvcHRpb25zLFxuICB9OiB7XG4gICAgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdO1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHBhcnNlcj86IFBhcnNlcjxUPjtcbiAgICBvcHRpb25zPzogUGFyc2VyT3B0aW9ucztcbiAgfSk6IHN0cmluZyB7XG4gICAgcGFyc2VyID0gcmVzb2x2ZShbdGhpcy5maWVsZF0sIHBhcnNlcik7XG4gICAgY29uc3QgcGFyYW1zOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IFtcbiAgICAgIFF1ZXJ5T3B0aW9uLnNlbGVjdCxcbiAgICAgIFF1ZXJ5T3B0aW9uLmV4cGFuZCxcbiAgICAgIFF1ZXJ5T3B0aW9uLmZpbHRlcixcbiAgICAgIFF1ZXJ5T3B0aW9uLnNlYXJjaCxcbiAgICAgIFF1ZXJ5T3B0aW9uLm9yZGVyQnksXG4gICAgICBRdWVyeU9wdGlvbi5jb21wdXRlLFxuICAgICAgUXVlcnlPcHRpb24uc2tpcCxcbiAgICAgIFF1ZXJ5T3B0aW9uLnRvcCxcbiAgICAgIFF1ZXJ5T3B0aW9uLmNvdW50LFxuICAgICAgUXVlcnlPcHRpb24ubGV2ZWxzLFxuICAgIF1cbiAgICAgIC5maWx0ZXIoKGtleSkgPT4gIVR5cGVzLmlzRW1wdHkodGhpcy52YWx1ZXNba2V5XSkpXG4gICAgICAucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgICBsZXQgdmFsdWU6IGFueSA9IHRoaXMudmFsdWVzW2tleV07XG4gICAgICAgIGlmIChUeXBlcy5yYXdUeXBlKHZhbHVlKS5lbmRzV2l0aCgnRXhwcmVzc2lvbicpKSB7XG4gICAgICAgICAgdmFsdWUgPSAodmFsdWUgYXMgRXhwcmVzc2lvbjxUPikucmVuZGVyKHtcbiAgICAgICAgICAgIGFsaWFzZXMsXG4gICAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgICBlc2NhcGUsXG4gICAgICAgICAgICBwYXJzZXIsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgeyBba2V5XTogdmFsdWUgfSk7XG4gICAgICB9LCB7fSk7XG4gICAgbGV0IGV4cGFuZCA9IGAke3JlbmRlcih0aGlzLmZpZWxkLCB7XG4gICAgICBhbGlhc2VzLFxuICAgICAgZXNjYXBlLFxuICAgICAgcHJlZml4LFxuICAgICAgcGFyc2VyLFxuICAgICAgb3B0aW9ucyxcbiAgICB9KX1gO1xuICAgIGlmICghVHlwZXMuaXNFbXB0eShwYXJhbXMpKSB7XG4gICAgICBleHBhbmQgPSBgJHtleHBhbmR9KCR7T2JqZWN0LmtleXMocGFyYW1zKVxuICAgICAgICAubWFwKChrZXkpID0+IGAkJHtrZXl9PSR7cGFyYW1zW2tleV19YClcbiAgICAgICAgLmpvaW4oJzsnKX0pYDtcbiAgICB9XG4gICAgcmV0dXJuIGV4cGFuZDtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKS5yZWR1Y2UoXG4gICAgICAoYWNjLCBrZXkpID0+XG4gICAgICAgIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtrZXldOiBPYmplY3RzLmNsb25lKHRoaXMudmFsdWVzW2tleV0pIH0pLFxuICAgICAge30sXG4gICAgKTtcbiAgICByZXR1cm4gbmV3IEV4cGFuZEZpZWxkPFQ+KFxuICAgICAgdHlwZW9mIHRoaXMuZmllbGQgPT09ICdzdHJpbmcnID8gdGhpcy5maWVsZCA6IHRoaXMuZmllbGQuY2xvbmUoKSxcbiAgICAgIHZhbHVlcyxcbiAgICApO1xuICB9XG5cbiAgcmVzb2x2ZShwYXJzZXI6IGFueSkge1xuICAgIHJldHVybiBwYXJzZXI7XG4gIH1cblxuICBzZWxlY3QoXG4gICAgb3B0czogKFxuICAgICAgYnVpbGRlcjogU2VsZWN0RXhwcmVzc2lvbkJ1aWxkZXI8VD4sXG4gICAgICBjdXJyZW50PzogU2VsZWN0RXhwcmVzc2lvbjxUPixcbiAgICApID0+IFNlbGVjdEV4cHJlc3Npb248VD4sXG4gICk6IFNlbGVjdEV4cHJlc3Npb248VD4ge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbihcbiAgICAgIFF1ZXJ5T3B0aW9uLnNlbGVjdCxcbiAgICAgIFNlbGVjdEV4cHJlc3Npb24uZmFjdG9yeTxUPihvcHRzLCB0aGlzLnZhbHVlc1tRdWVyeU9wdGlvbi5zZWxlY3RdKSxcbiAgICApO1xuICB9XG5cbiAgZXhwYW5kKFxuICAgIG9wdHM6IChcbiAgICAgIGJ1aWxkZXI6IEV4cGFuZEV4cHJlc3Npb25CdWlsZGVyPFQ+LFxuICAgICAgY3VycmVudD86IEV4cGFuZEV4cHJlc3Npb248VD4sXG4gICAgKSA9PiBFeHBhbmRFeHByZXNzaW9uPFQ+LFxuICApIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb24oXG4gICAgICBRdWVyeU9wdGlvbi5leHBhbmQsXG4gICAgICBFeHBhbmRFeHByZXNzaW9uLmZhY3Rvcnk8VD4ob3B0cywgdGhpcy52YWx1ZXNbUXVlcnlPcHRpb24uZXhwYW5kXSksXG4gICAgKTtcbiAgfVxuXG4gIGZpbHRlcihcbiAgICBvcHRzOiAoXG4gICAgICBidWlsZGVyOiBGaWx0ZXJFeHByZXNzaW9uQnVpbGRlcjxUPixcbiAgICAgIGN1cnJlbnQ/OiBGaWx0ZXJFeHByZXNzaW9uPFQ+LFxuICAgICkgPT4gRmlsdGVyRXhwcmVzc2lvbjxUPixcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9uKFxuICAgICAgUXVlcnlPcHRpb24uZmlsdGVyLFxuICAgICAgRmlsdGVyRXhwcmVzc2lvbi5mYWN0b3J5PFQ+KG9wdHMsIHRoaXMudmFsdWVzW1F1ZXJ5T3B0aW9uLmZpbHRlcl0pLFxuICAgICk7XG4gIH1cblxuICBzZWFyY2gob3B0czogKGJ1aWxkZXI6IFNlYXJjaEV4cHJlc3Npb25CdWlsZGVyPFQ+KSA9PiBTZWFyY2hFeHByZXNzaW9uPFQ+KSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9uKFxuICAgICAgUXVlcnlPcHRpb24uc2VhcmNoLFxuICAgICAgU2VhcmNoRXhwcmVzc2lvbi5mYWN0b3J5PFQ+KG9wdHMsIHRoaXMudmFsdWVzW1F1ZXJ5T3B0aW9uLnNlYXJjaF0pLFxuICAgICk7XG4gIH1cblxuICBvcmRlckJ5KFxuICAgIG9wdHM6IChcbiAgICAgIGJ1aWxkZXI6IE9yZGVyQnlFeHByZXNzaW9uQnVpbGRlcjxUPixcbiAgICAgIGN1cnJlbnQ/OiBPcmRlckJ5RXhwcmVzc2lvbjxUPixcbiAgICApID0+IE9yZGVyQnlFeHByZXNzaW9uPFQ+LFxuICApIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb24oXG4gICAgICBRdWVyeU9wdGlvbi5vcmRlckJ5LFxuICAgICAgT3JkZXJCeUV4cHJlc3Npb24uZmFjdG9yeTxUPihvcHRzLCB0aGlzLnZhbHVlc1tRdWVyeU9wdGlvbi5vcmRlckJ5XSksXG4gICAgKTtcbiAgfVxuXG4gIGNvbXB1dGUoXG4gICAgb3B0czogKFxuICAgICAgYnVpbGRlcjogQ29tcHV0ZUV4cHJlc3Npb25CdWlsZGVyPFQ+LFxuICAgICAgY3VycmVudD86IENvbXB1dGVFeHByZXNzaW9uPFQ+LFxuICAgICkgPT4gQ29tcHV0ZUV4cHJlc3Npb248VD4sXG4gICkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbihcbiAgICAgIFF1ZXJ5T3B0aW9uLmNvbXB1dGUsXG4gICAgICBDb21wdXRlRXhwcmVzc2lvbi5mYWN0b3J5PFQ+KG9wdHMsIHRoaXMudmFsdWVzW1F1ZXJ5T3B0aW9uLmNvbXB1dGVdKSxcbiAgICApO1xuICB9XG5cbiAgc2tpcChuOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb248bnVtYmVyPihRdWVyeU9wdGlvbi5za2lwLCBuKTtcbiAgfVxuXG4gIHRvcChuOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb248bnVtYmVyPihRdWVyeU9wdGlvbi50b3AsIG4pO1xuICB9XG5cbiAgbGV2ZWxzKG46IG51bWJlciB8ICdtYXgnKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9uPG51bWJlciB8ICdtYXgnPihRdWVyeU9wdGlvbi5sZXZlbHMsIG4pO1xuICB9XG5cbiAgY291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9uPGJvb2xlYW4+KFF1ZXJ5T3B0aW9uLmNvdW50LCB0cnVlKTtcbiAgfVxuXG4gIC8vIE9wdGlvbiBIYW5kbGVyXG4gIHByaXZhdGUgb3B0aW9uPE8+KG5hbWU6IFF1ZXJ5T3B0aW9uLCBvcHRzPzogTykge1xuICAgIGlmIChvcHRzICE9PSB1bmRlZmluZWQpIHRoaXMudmFsdWVzW25hbWVdID0gb3B0cztcbiAgICByZXR1cm4gdGhpcy52YWx1ZXNbbmFtZV0gYXMgTztcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBFeHBhbmRFeHByZXNzaW9uQnVpbGRlcjxUPiA9IHtcbiAgdDogUmVxdWlyZWQ8VD47XG4gIGU6ICgpID0+IEV4cGFuZEV4cHJlc3Npb248VD47XG59O1xuZXhwb3J0IGNsYXNzIEV4cGFuZEV4cHJlc3Npb248VD4gZXh0ZW5kcyBFeHByZXNzaW9uPFQ+IHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGNoaWxkcmVuLFxuICB9OiB7XG4gICAgY2hpbGRyZW4/OiBSZW5kZXJhYmxlW107XG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKHsgY2hpbGRyZW4gfSk7XG4gIH1cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdFeHBhbmRFeHByZXNzaW9uJztcbiAgfVxuXG4gIHN0YXRpYyBmYWN0b3J5PFQ+KFxuICAgIG9wdHM6IChcbiAgICAgIGJ1aWxkZXI6IEV4cGFuZEV4cHJlc3Npb25CdWlsZGVyPFQ+LFxuICAgICAgY3VycmVudD86IEV4cGFuZEV4cHJlc3Npb248VD4sXG4gICAgKSA9PiBFeHBhbmRFeHByZXNzaW9uPFQ+LFxuICAgIGN1cnJlbnQ/OiBFeHBhbmRFeHByZXNzaW9uPFQ+LFxuICApOiBFeHBhbmRFeHByZXNzaW9uPFQ+IHtcbiAgICByZXR1cm4gb3B0cyhcbiAgICAgIHtcbiAgICAgICAgdDogRmllbGRGYWN0b3J5PFJlcXVpcmVkPFQ+PigpLFxuICAgICAgICBlOiAoKSA9PiBuZXcgRXhwYW5kRXhwcmVzc2lvbjxUPigpLFxuICAgICAgfSxcbiAgICAgIGN1cnJlbnQsXG4gICAgKSBhcyBFeHBhbmRFeHByZXNzaW9uPFQ+O1xuICB9XG5cbiAgb3ZlcnJpZGUgdG9Kc29uKCkge1xuICAgIGNvbnN0IGpzb24gPSBzdXBlci50b0pzb24oKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihqc29uLCB7fSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUpzb248VD4oanNvbjogeyBbbmFtZTogc3RyaW5nXTogYW55IH0pOiBFeHBhbmRFeHByZXNzaW9uPFQ+IHtcbiAgICByZXR1cm4gbmV3IEV4cGFuZEV4cHJlc3Npb248VD4oe1xuICAgICAgY2hpbGRyZW46IGpzb25bJ2NoaWxkcmVuJ10ubWFwKChjOiBhbnkpID0+IFJlbmRlcmFibGVGYWN0b3J5KGMpKSxcbiAgICB9KTtcbiAgfVxuXG4gIHJlbmRlcih7XG4gICAgYWxpYXNlcyxcbiAgICBlc2NhcGUsXG4gICAgcHJlZml4LFxuICAgIHBhcnNlcixcbiAgICBvcHRpb25zLFxuICB9OiB7XG4gICAgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdO1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHBhcnNlcj86IFBhcnNlcjxUPjtcbiAgICBvcHRpb25zPzogUGFyc2VyT3B0aW9ucztcbiAgfSA9IHt9KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW5cbiAgICAgIC5tYXAoKG4pID0+IG4ucmVuZGVyKHsgYWxpYXNlcywgZXNjYXBlLCBwcmVmaXgsIHBhcnNlciwgb3B0aW9ucyB9KSlcbiAgICAgIC5qb2luKCcsJyk7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IEV4cGFuZEV4cHJlc3Npb248VD4oe1xuICAgICAgY2hpbGRyZW46IHRoaXMuX2NoaWxkcmVuLm1hcCgoYykgPT4gYy5jbG9uZSgpKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZChub2RlOiBSZW5kZXJhYmxlKTogRXhwYW5kRXhwcmVzc2lvbjxUPiB7XG4gICAgdGhpcy5fY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZpZWxkPEY+KFxuICAgIGZpZWxkOiBGLFxuICAgIG9wdHM/OiAoZTogRXhwYW5kRmllbGQ8VW5wYWNrZWQ8Rj4+KSA9PiB2b2lkLFxuICApOiBFeHBhbmRFeHByZXNzaW9uPFQ+IHtcbiAgICBsZXQgbm9kZSA9IG5ldyBFeHBhbmRGaWVsZDxVbnBhY2tlZDxGPj4oZmllbGQpO1xuICAgIGlmIChvcHRzICE9PSB1bmRlZmluZWQpIG9wdHMobm9kZSk7XG4gICAgcmV0dXJuIHRoaXMuX2FkZChub2RlKTtcbiAgfVxufVxuIl19