@alauda-fe/common
Version:
Alauda frontend team common codes.
164 lines • 22 kB
JavaScript
import { Directive, Host, Input, IterableDiffers, TemplateRef, ViewContainerRef, } from '@angular/core';
import { TEMPLATE_OPTIONS } from '../core/public-api';
import { TranslateService } from './translate.service';
import * as i0 from "@angular/core";
import * as i1 from "./translate.service";
const placeholder = (val) => ({
type: 'placeholder',
val: val.trim(),
});
const text = (val) => ({ type: 'text', val });
export class TranslateView {
constructor(templateRef, match = '') {
this.templateRef = templateRef;
this.match = match;
}
isText() {
return !this.match;
}
}
export class TranslateDirective {
constructor(viewContainer, translate, differs) {
this.viewContainer = viewContainer;
this.translate = translate;
this.differs = differs;
this.dirty = false;
this.views = {};
this.differ = null;
this.viewIndexes = {};
this.inlineTracker = (index, item) => item.type === 'text'
? `${item.val}_${index}`
: `${item.val}_${index}_${this.views[item.val] ? 'has_view' : 'no_view'}`;
}
set aclTranslate(key) {
this.translateKey = key;
this.dirty = true;
}
ngDoCheck() {
if (this.dirty || this.locale !== this.translate.locale) {
this.locale = this.translate.locale;
this.inlines = this.separateContent(this.translate.getRaw(this.translateKey));
if (!this.differ) {
try {
this.differ = this.differs.find([]).create(this.inlineTracker);
}
catch {
throw new Error(`Cannot find differ for translate directive inlines`);
}
}
this.update(this.inlines);
}
}
separateContent(content) {
if (content.length === 0) {
return [];
}
const matches = content.matchAll(TEMPLATE_OPTIONS.interpolate);
const result = [];
let prevIndex = 0;
for (const match of matches) {
if (match.index > prevIndex) {
result.push(text(content.slice(prevIndex, match.index)));
}
result.push(placeholder(match[1]));
prevIndex = match.index + match[0].length;
}
if (prevIndex < content.length) {
result.push(text(content.slice(prevIndex, content.length)));
}
return result;
}
update(inlines) {
if (!this.textView) {
throw new Error('translate directive need aclTranslateText to render text');
}
if (!this.differ) {
return;
}
const changes = this.differ.diff(inlines);
if (!changes) {
return;
}
this.applyChanges(changes);
this.dirty = false;
}
applyChanges(changes) {
changes.forEachOperation((change, adjustedPreviousIndex, currentIndex) => {
if (change.previousIndex === null) {
const item = change.item;
const index = currentIndex === null ? undefined : currentIndex;
if (item.type === 'text') {
this.viewContainer.createEmbeddedView(this.textView.templateRef, { $implicit: item.val }, index);
}
else {
const view = this.views[item.val];
if (view) {
this.viewContainer.createEmbeddedView(view.templateRef, null, index);
}
else {
this.viewContainer.createEmbeddedView(this.textView.templateRef, { $implicit: item.val }, index);
}
this.viewIndexes[item.val] = this.viewIndexes[item.val] || [index];
}
}
else if (currentIndex === null) {
this.viewContainer.remove(adjustedPreviousIndex === null ? undefined : adjustedPreviousIndex);
}
else if (adjustedPreviousIndex !== null) {
const view = this.viewContainer.get(adjustedPreviousIndex);
this.viewContainer.move(view, currentIndex);
}
});
}
addView(view) {
if (view.isText()) {
this.textView = view;
}
else {
this.views[view.match] = view;
this.update(this.inlines);
}
}
static { this.ɵfac = function TranslateDirective_Factory(t) { return new (t || TranslateDirective)(i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject(i1.TranslateService), i0.ɵɵdirectiveInject(i0.IterableDiffers)); }; }
static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: TranslateDirective, selectors: [["", "aclTranslate", ""]], inputs: { aclTranslate: "aclTranslate" }, standalone: true }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TranslateDirective, [{
type: Directive,
args: [{ selector: '[aclTranslate]', standalone: true }]
}], () => [{ type: i0.ViewContainerRef }, { type: i1.TranslateService }, { type: i0.IterableDiffers }], { aclTranslate: [{
type: Input
}] }); })();
export class TranslateMatchDirective {
constructor(templateRef, aclTranslate) {
this.templateRef = templateRef;
this.aclTranslate = aclTranslate;
}
set aclTranslateMatch(val) {
this.aclTranslate.addView(new TranslateView(this.templateRef, val));
}
static { this.ɵfac = function TranslateMatchDirective_Factory(t) { return new (t || TranslateMatchDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef), i0.ɵɵdirectiveInject(TranslateDirective, 1)); }; }
static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: TranslateMatchDirective, selectors: [["", "aclTranslateMatch", ""]], inputs: { aclTranslateMatch: "aclTranslateMatch" }, standalone: true }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TranslateMatchDirective, [{
type: Directive,
args: [{ selector: '[aclTranslateMatch]', standalone: true }]
}], () => [{ type: i0.TemplateRef }, { type: TranslateDirective, decorators: [{
type: Host
}] }], { aclTranslateMatch: [{
type: Input
}] }); })();
export class TranslateTextDirective {
constructor(templateRef, aclTranslate) {
this.aclTranslate = aclTranslate;
this.aclTranslate.addView(new TranslateView(templateRef));
}
static { this.ɵfac = function TranslateTextDirective_Factory(t) { return new (t || TranslateTextDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef), i0.ɵɵdirectiveInject(TranslateDirective, 1)); }; }
static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: TranslateTextDirective, selectors: [["", "aclTranslateText", ""]], standalone: true }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TranslateTextDirective, [{
type: Directive,
args: [{ selector: '[aclTranslateText]', standalone: true }]
}], () => [{ type: i0.TemplateRef }, { type: TranslateDirective, decorators: [{
type: Host
}] }], null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy90cmFuc2xhdGUvdHJhbnNsYXRlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULElBQUksRUFDSixLQUFLLEVBR0wsZUFBZSxFQUNmLFdBQVcsRUFDWCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQU92RCxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQVcsRUFBVSxFQUFFLENBQUMsQ0FBQztJQUM1QyxJQUFJLEVBQUUsYUFBYTtJQUNuQixHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRTtDQUNoQixDQUFDLENBQUM7QUFDSCxNQUFNLElBQUksR0FBRyxDQUFDLEdBQVcsRUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUU5RCxNQUFNLE9BQU8sYUFBYTtJQUN4QixZQUNrQixXQUE2QixFQUM3QixRQUFRLEVBQUU7UUFEVixnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7UUFDN0IsVUFBSyxHQUFMLEtBQUssQ0FBSztJQUN6QixDQUFDO0lBRUosTUFBTTtRQUNKLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3JCLENBQUM7Q0FDRjtBQUdELE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsWUFDbUIsYUFBK0IsRUFDL0IsU0FBMkIsRUFDM0IsT0FBd0I7UUFGeEIsa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBQy9CLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLFlBQU8sR0FBUCxPQUFPLENBQWlCO1FBWW5DLFVB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LFNBQVM7ZUFBQyxFQUFFLFFBQVEsRUFBRSxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFOztzQkFJMUQsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRG9DaGVjayxcbiAgSG9zdCxcbiAgSW5wdXQsXG4gIEl0ZXJhYmxlQ2hhbmdlcyxcbiAgSXRlcmFibGVEaWZmZXIsXG4gIEl0ZXJhYmxlRGlmZmVycyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJ3RzLWVzc2VudGlhbHMnO1xuXG5pbXBvcnQgeyBURU1QTEFURV9PUFRJT05TIH0gZnJvbSAnLi4vY29yZS9wdWJsaWMtYXBpJztcblxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4vdHJhbnNsYXRlLnNlcnZpY2UnO1xuXG5pbnRlcmZhY2UgSW5saW5lIHtcbiAgdHlwZTogJ3BsYWNlaG9sZGVyJyB8ICd0ZXh0JztcbiAgdmFsOiBzdHJpbmc7XG59XG5cbmNvbnN0IHBsYWNlaG9sZGVyID0gKHZhbDogc3RyaW5nKTogSW5saW5lID0+ICh7XG4gIHR5cGU6ICdwbGFjZWhvbGRlcicsXG4gIHZhbDogdmFsLnRyaW0oKSxcbn0pO1xuY29uc3QgdGV4dCA9ICh2YWw6IHN0cmluZyk6IElubGluZSA9PiAoeyB0eXBlOiAndGV4dCcsIHZhbCB9KTtcblxuZXhwb3J0IGNsYXNzIFRyYW5zbGF0ZVZpZXcge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgcHVibGljIHJlYWRvbmx5IG1hdGNoID0gJycsXG4gICkge31cblxuICBpc1RleHQoKSB7XG4gICAgcmV0dXJuICF0aGlzLm1hdGNoO1xuICB9XG59XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1thY2xUcmFuc2xhdGVdJywgc3RhbmRhbG9uZTogdHJ1ZSB9KVxuZXhwb3J0IGNsYXNzIFRyYW5zbGF0ZURpcmVjdGl2ZSBpbXBsZW1lbnRzIERvQ2hlY2sge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMsXG4gICkge31cblxuICBASW5wdXQoKSBzZXQgYWNsVHJhbnNsYXRlKGtleTogc3RyaW5nKSB7XG4gICAgdGhpcy50cmFuc2xhdGVLZXkgPSBrZXk7XG4gICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gIH1cblxuICB0cmFuc2xhdGVLZXk6IHN0cmluZyB8IERpY3Rpb25hcnk8c3RyaW5nPjtcblxuICBwcml2YXRlIGxvY2FsZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgZGlydHkgPSBmYWxzZTtcblxuICBwcml2YXRlIHRleHRWaWV3OiBUcmFuc2xhdGVWaWV3O1xuXG4gIHByaXZhdGUgdmlld3M6IERpY3Rpb25hcnk8VHJhbnNsYXRlVmlldz4gPSB7fTtcblxuICBwcml2YXRlIGRpZmZlcjogSXRlcmFibGVEaWZmZXI8SW5saW5lPiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgdmlld0luZGV4ZXM6IERpY3Rpb25hcnk8bnVtYmVyW10+ID0ge307XG5cbiAgcHJpdmF0ZSBpbmxpbmVzOiBJbmxpbmVbXTtcblxuICBpbmxpbmVUcmFja2VyID0gKGluZGV4OiBudW1iZXIsIGl0ZW06IElubGluZSkgPT5cbiAgICBpdGVtLnR5cGUgPT09ICd0ZXh0J1xuICAgICAgPyBgJHtpdGVtLnZhbH1fJHtpbmRleH1gXG4gICAgICA6IGAke2l0ZW0udmFsfV8ke2luZGV4fV8ke3RoaXMudmlld3NbaXRlbS52YWxdID8gJ2hhc192aWV3JyA6ICdub192aWV3J31gO1xuXG4gIG5nRG9DaGVjaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXJ0eSB8fCB0aGlzLmxvY2FsZSAhPT0gdGhpcy50cmFuc2xhdGUubG9jYWxlKSB7XG4gICAgICB0aGlzLmxvY2FsZSA9IHRoaXMudHJhbnNsYXRlLmxvY2FsZTtcbiAgICAgIHRoaXMuaW5saW5lcyA9IHRoaXMuc2VwYXJhdGVDb250ZW50KFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZS5nZXRSYXcodGhpcy50cmFuc2xhdGVLZXkpLFxuICAgICAgKTtcblxuICAgICAgaWYgKCF0aGlzLmRpZmZlcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuZGlmZmVyID0gdGhpcy5kaWZmZXJzLmZpbmQoW10pLmNyZWF0ZSh0aGlzLmlubGluZVRyYWNrZXIpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGRpZmZlciBmb3IgdHJhbnNsYXRlIGRpcmVjdGl2ZSBpbmxpbmVzYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGUodGhpcy5pbmxpbmVzKTtcbiAgICB9XG4gIH1cblxuICBzZXBhcmF0ZUNvbnRlbnQoY29udGVudDogc3RyaW5nKSB7XG4gICAgaWYgKGNvbnRlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2hlcyA9IGNvbnRlbnQubWF0Y2hBbGwoVEVNUExBVEVfT1BUSU9OUy5pbnRlcnBvbGF0ZSk7XG5cbiAgICBjb25zdCByZXN1bHQ6IElubGluZVtdID0gW107XG4gICAgbGV0IHByZXZJbmRleCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgIGlmIChtYXRjaC5pbmRleCA+IHByZXZJbmRleCkge1xuICAgICAgICByZXN1bHQucHVzaCh0ZXh0KGNvbnRlbnQuc2xpY2UocHJldkluZGV4LCBtYXRjaC5pbmRleCkpKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0LnB1c2gocGxhY2Vob2xkZXIobWF0Y2hbMV0pKTtcblxuICAgICAgcHJldkluZGV4ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKHByZXZJbmRleCA8IGNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICByZXN1bHQucHVzaCh0ZXh0KGNvbnRlbnQuc2xpY2UocHJldkluZGV4LCBjb250ZW50Lmxlbmd0aCkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGUoaW5saW5lczogSW5saW5lW10pIHtcbiAgICBpZiAoIXRoaXMudGV4dFZpZXcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3RyYW5zbGF0ZSBkaXJlY3RpdmUgbmVlZCBhY2xUcmFuc2xhdGVUZXh0IHRvIHJlbmRlciB0ZXh0JyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRpZmZlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLmRpZmZlci5kaWZmKGlubGluZXMpO1xuXG4gICAgaWYgKCFjaGFuZ2VzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hcHBseUNoYW5nZXMoY2hhbmdlcyk7XG5cbiAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Q2hhbmdlcyhjaGFuZ2VzOiBJdGVyYWJsZUNoYW5nZXM8SW5saW5lPikge1xuICAgIGNoYW5nZXMuZm9yRWFjaE9wZXJhdGlvbigoY2hhbmdlLCBhZGp1c3RlZFByZXZpb3VzSW5kZXgsIGN1cnJlbnRJbmRleCkgPT4ge1xuICAgICAgaWYgKGNoYW5nZS5wcmV2aW91c0luZGV4ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBjaGFuZ2UuaXRlbTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBjdXJyZW50SW5kZXggPT09IG51bGwgPyB1bmRlZmluZWQgOiBjdXJyZW50SW5kZXg7XG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcoXG4gICAgICAgICAgICB0aGlzLnRleHRWaWV3LnRlbXBsYXRlUmVmLFxuICAgICAgICAgICAgeyAkaW1wbGljaXQ6IGl0ZW0udmFsIH0sXG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdzW2l0ZW0udmFsXTtcbiAgICAgICAgICBpZiAodmlldykge1xuICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyhcbiAgICAgICAgICAgICAgdmlldy50ZW1wbGF0ZVJlZixcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KFxuICAgICAgICAgICAgICB0aGlzLnRleHRWaWV3LnRlbXBsYXRlUmVmLFxuICAgICAgICAgICAgICB7ICRpbXBsaWNpdDogaXRlbS52YWwgfSxcbiAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMudmlld0luZGV4ZXNbaXRlbS52YWxdID0gdGhpcy52aWV3SW5kZXhlc1tpdGVtLnZhbF0gfHwgW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50SW5kZXggPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLnJlbW92ZShcbiAgICAgICAgICBhZGp1c3RlZFByZXZpb3VzSW5kZXggPT09IG51bGwgPyB1bmRlZmluZWQgOiBhZGp1c3RlZFByZXZpb3VzSW5kZXgsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGFkanVzdGVkUHJldmlvdXNJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3Q29udGFpbmVyLmdldChhZGp1c3RlZFByZXZpb3VzSW5kZXgpITtcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLm1vdmUodmlldywgY3VycmVudEluZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFkZFZpZXcodmlldzogVHJhbnNsYXRlVmlldykge1xuICAgIGlmICh2aWV3LmlzVGV4dCgpKSB7XG4gICAgICB0aGlzLnRleHRWaWV3ID0gdmlldztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52aWV3c1t2aWV3Lm1hdGNoXSA9IHZpZXc7XG4gICAgICB0aGlzLnVwZGF0ZSh0aGlzLmlubGluZXMpO1xuICAgIH1cbiAgfVxufVxuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbYWNsVHJhbnNsYXRlTWF0Y2hdJywgc3RhbmRhbG9uZTogdHJ1ZSB9KVxuZXhwb3J0IGNsYXNzIFRyYW5zbGF0ZU1hdGNoRGlyZWN0aXZlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PixcbiAgICBASG9zdCgpIHByaXZhdGUgcmVhZG9ubHkgYWNsVHJhbnNsYXRlOiBUcmFuc2xhdGVEaXJlY3RpdmUsXG4gICkge31cblxuICBASW5wdXQoKSBzZXQgYWNsVHJhbnNsYXRlTWF0Y2godmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFjbFRyYW5zbGF0ZS5hZGRWaWV3KG5ldyBUcmFuc2xhdGVWaWV3KHRoaXMudGVtcGxhdGVSZWYsIHZhbCkpO1xuICB9XG59XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1thY2xUcmFuc2xhdGVUZXh0XScsIHN0YW5kYWxvbmU6IHRydWUgfSlcbmV4cG9ydCBjbGFzcyBUcmFuc2xhdGVUZXh0RGlyZWN0aXZlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgQEhvc3QoKSBwcml2YXRlIHJlYWRvbmx5IGFjbFRyYW5zbGF0ZTogVHJhbnNsYXRlRGlyZWN0aXZlLFxuICApIHtcbiAgICB0aGlzLmFjbFRyYW5zbGF0ZS5hZGRWaWV3KG5ldyBUcmFuc2xhdGVWaWV3KHRlbXBsYXRlUmVmKSk7XG4gIH1cbn1cbiJdfQ==