anylang
Version:
A translator's kit that uses the free APIs of Google Translate, Yandex, Bing, ChatGPT, and other LLMs
173 lines (171 loc) • 25.4 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.MicrosoftTranslator = void 0;
var _zod = require("zod");
var _LanguageAliases = require("../../languages/LanguageAliases");
var _BaseTranslator = require("../BaseTranslator");
var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P ? value : new P(function (resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator["throw"](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
const ResponseScheme = _zod.z.object({
translations: _zod.z.object({
text: _zod.z.string()
}).array()
}).array().or(_zod.z.object({
error: _zod.z.object({
code: _zod.z.number(),
message: _zod.z.string()
})
}));
// eslint-disable
// prettier-ignore
const supportedLanguagesMap = new _LanguageAliases.LanguageAliases(["ace", "af", "sq", "am", "ar", "arz", "ary", "arb", "hy", "as", "ast", "az", "ban", "bn", "ba", "eu", "bbc", "be", "bho", "bik", "brx", "bs", "bg", "yue", "ca", "ceb", "hne", "lzh", "zh-Hans", "zh-Hant", "co", "hr", "cs", "da", "prs", "dv", "doi", "nl", "en", "en-GB", "epo", "et", "fo", "fj", "fil", "fi", "fr", "fr-CA", "fy", "fur", "gl", "lug", "ka", "de", "el", "gu", "ht", "ha", "he", "hil", "hi", "mww", "hu", "iba", "is", "ig", "ilo", "id", "ikt", "iu", "iu-Latn", "ga", "it", "jam", "ja", "jav", "kea", "kn", "pam", "ks", "kk", "km", "rw", "tlh-Latn", "gom", "ko", "kri", "ku", "kmr", "ky", "lo", "la", "lv", "lij", "lim", "ln", "lt", "lmo", "dsb", "lb", "mk", "mai", "mg", "ms", "ml", "mt", "mr", "mwr", "mfe", "min", "mn-Cyrl", "mn-Mong", "my", "mi", "ne", "nb", "nno", "nya", "oc", "or", "pap", "ps", "fa", "pl", "pt", "pt-PT", "pa", "pnb", "otq", "ro", "run", "ru", "sm", "sa", "srd", "sr-Cyrl", "sr-Latn", "st", "nso", "tn", "crs", "sn", "scn", "sd", "si", "sk", "sl", "so", "es", "su", "sw", "sv", "ty", "tgk", "ta", "tt", "te", "tet", "th", "bo", "ti", "tpi", "to", "tr", "tk", "uk", "hsb", "ur", "ug", "uz", "vec", "vi", "war", "cy", "xh", "ydd", "yo", "yua", "zu"]);
// eslint-enable
class MicrosoftTranslator extends _BaseTranslator.BaseTranslator {
constructor() {
super(...arguments);
this.token = null;
}
static getSupportedLanguages() {
return supportedLanguagesMap.getAll();
}
getLengthLimit() {
return 50000;
}
getRequestsTimeout() {
return 300;
}
checkLimitExceeding(text) {
if (Array.isArray(text)) {
const arrayLen = text.reduce((acc, text) => acc + text.length, 0);
const extra = arrayLen - this.getLengthLimit();
return extra > 0 ? extra : 0;
} else {
const extra = text.length - this.getLengthLimit();
return extra > 0 ? extra : 0;
}
}
translate(text, from, to) {
return __awaiter(this, void 0, void 0, function* () {
return this.translateBatch([text], from, to).then(resp => resp[0]);
});
}
translateBatch(text, from, to) {
return __awaiter(this, void 0, void 0, function* () {
const sourceLanguage = from === 'auto' ? 'auto' : supportedLanguagesMap.get(from);
const targetLanguage = supportedLanguagesMap.get(to);
if (!sourceLanguage) throw new TypeError(`Unsupported source language ${from}`);
if (!targetLanguage) throw new TypeError(`Unsupported source language ${to}`);
const token = yield this.getToken();
const url = 'https://api-edge.cognitive.microsofttranslator.com/translate?' + (
// Omit `from` parameter for auto detection of language
sourceLanguage !== 'auto' ? `from=${encodeURIComponent(sourceLanguage)}&` : '') + `to=${encodeURIComponent(targetLanguage)}&api-version=3.0&includeSentenceLength=true`;
return this.fetch(url, {
responseType: 'json',
method: 'POST',
headers: {
accept: '*/*',
'accept-language': 'zh-TW,zh;q=0.9,ja;q=0.8,zh-CN;q=0.7,en-US;q=0.6,en;q=0.5',
authorization: `Bearer ${token}`,
'cache-control': 'no-cache',
'content-type': 'application/json',
pragma: 'no-cache',
priority: 'u=1, i',
'referrer-policy': 'strict-origin-when-cross-origin',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'none',
'sec-fetch-storage-access': 'active'
},
body: JSON.stringify(text.map(text => ({
Text: text
})))
}).then(rawResult => {
const result = ResponseScheme.parse(rawResult.data);
if ('error' in result) {
throw new Error(`Code ${result.error.code}: ${result.error.message}`);
}
// Transform translations array
return result.map(translationItem =>
// Build translation for single text
translationItem.translations.map(translationSegment => translationSegment.text).join(' '));
});
});
}
getToken() {
return __awaiter(this, void 0, void 0, function* () {
var _a;
// Wait resolution if pending
if (this.token instanceof Promise) return this.token;
// Fetch new token
const tokenLifetime = (_a = this.options.tokenLifetime) !== null && _a !== void 0 ? _a : 30000;
if (!this.token || Date.now() - this.token.issuedAt > tokenLifetime) {
this.token = this.fetch('https://edge.microsoft.com/translate/auth', {
responseType: 'text',
method: 'GET',
headers: {
accept: '*/*',
'accept-language': 'zh-TW,zh;q=0.9,ja;q=0.8,zh-CN;q=0.7,en-US;q=0.6,en;q=0.5',
'cache-control': 'no-cache',
pragma: 'no-cache',
priority: 'u=1, i',
'referrer-policy': 'strict-origin-when-cross-origin',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'none',
'sec-fetch-storage-access': 'active'
},
body: null
}).then(({
data: token,
statusText,
status,
ok
}) => {
if (!ok) throw new Error(statusText || `Unknown error with status ${status}`);
this.token = {
value: token,
issuedAt: Date.now()
};
return token;
}).catch(error => {
this.token = null;
throw error;
});
return yield this.token;
}
// Use cached value
return this.token.value;
});
}
}
exports.MicrosoftTranslator = MicrosoftTranslator;
MicrosoftTranslator.translatorName = 'MicrosoftTranslator';
MicrosoftTranslator.isSupportedAutoFrom = () => true;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRvcnMvTWljcm9zb2Z0VHJhbnNsYXRvci9pbmRleC5qcyIsIm5hbWVzIjpbIl96b2QiLCJyZXF1aXJlIiwiX0xhbmd1YWdlQWxpYXNlcyIsIl9CYXNlVHJhbnNsYXRvciIsIlJlc3BvbnNlU2NoZW1lIiwieiIsIm9iamVjdCIsInRyYW5zbGF0aW9ucyIsInRleHQiLCJzdHJpbmciLCJhcnJheSIsIm9yIiwiZXJyb3IiLCJjb2RlIiwibnVtYmVyIiwibWVzc2FnZSIsInN1cHBvcnRlZExhbmd1YWdlc01hcCIsIkxhbmd1YWdlQWxpYXNlcyIsIk1pY3Jvc29mdFRyYW5zbGF0b3IiLCJCYXNlVHJhbnNsYXRvciIsImNvbnN0cnVjdG9yIiwidG9rZW4iLCJnZXRTdXBwb3J0ZWRMYW5ndWFnZXMiLCJnZXRBbGwiLCJnZXRMZW5ndGhMaW1pdCIsImdldFJlcXVlc3RzVGltZW91dCIsImNoZWNrTGltaXRFeGNlZWRpbmciLCJBcnJheSIsImlzQXJyYXkiLCJhcnJheUxlbiIsInJlZHVjZSIsImFjYyIsImxlbmd0aCIsImV4dHJhIiwidHJhbnNsYXRlIiwiZnJvbSIsInRvIiwidHJhbnNsYXRlQmF0Y2giLCJ0aGVuIiwicmVzcCIsInNvdXJjZUxhbmd1YWdlIiwiZ2V0IiwidGFyZ2V0TGFuZ3VhZ2UiLCJUeXBlRXJyb3IiLCJnZXRUb2tlbiIsInVybCIsImVuY29kZVVSSUNvbXBvbmVudCIsImZldGNoIiwicmVzcG9uc2VUeXBlIiwibWV0aG9kIiwiaGVhZGVycyIsImFjY2VwdCIsImF1dGhvcml6YXRpb24iLCJwcmFnbWEiLCJwcmlvcml0eSIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwibWFwIiwiVGV4dCIsInJhd1Jlc3VsdCIsInJlc3VsdCIsInBhcnNlIiwiZGF0YSIsIkVycm9yIiwidHJhbnNsYXRpb25JdGVtIiwidHJhbnNsYXRpb25TZWdtZW50Iiwiam9pbiIsIlByb21pc2UiLCJ0b2tlbkxpZmV0aW1lIiwiX2EiLCJvcHRpb25zIiwiRGF0ZSIsIm5vdyIsImlzc3VlZEF0Iiwic3RhdHVzVGV4dCIsInN0YXR1cyIsIm9rIiwidmFsdWUiLCJjYXRjaCIsInRyYW5zbGF0b3JOYW1lIiwiaXNTdXBwb3J0ZWRBdXRvRnJvbSJdLCJzb3VyY2VzIjpbInRyYW5zbGF0b3JzL01pY3Jvc29mdFRyYW5zbGF0b3IvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IExhbmd1YWdlQWxpYXNlcyB9IGZyb20gJy4uLy4uL2xhbmd1YWdlcy9MYW5ndWFnZUFsaWFzZXMnO1xuXG5pbXBvcnQgeyBCYXNlVHJhbnNsYXRvciB9IGZyb20gJy4uL0Jhc2VUcmFuc2xhdG9yJztcblxuY29uc3QgUmVzcG9uc2VTY2hlbWUgPSB6XG5cdC5vYmplY3Qoe1xuXHRcdHRyYW5zbGF0aW9uczogelxuXHRcdFx0Lm9iamVjdCh7XG5cdFx0XHRcdHRleHQ6IHouc3RyaW5nKCksXG5cdFx0XHR9KVxuXHRcdFx0LmFycmF5KCksXG5cdH0pXG5cdC5hcnJheSgpXG5cdC5vcihcblx0XHR6Lm9iamVjdCh7XG5cdFx0XHRlcnJvcjogei5vYmplY3Qoe1xuXHRcdFx0XHRjb2RlOiB6Lm51bWJlcigpLFxuXHRcdFx0XHRtZXNzYWdlOiB6LnN0cmluZygpLFxuXHRcdFx0fSksXG5cdFx0fSksXG5cdCk7XG5cbi8vIGVzbGludC1kaXNhYmxlXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IHN1cHBvcnRlZExhbmd1YWdlc01hcCA9IG5ldyBMYW5ndWFnZUFsaWFzZXMoW1xuXHRcImFjZVwiLCBcImFmXCIsIFwic3FcIiwgXCJhbVwiLCBcImFyXCIsIFwiYXJ6XCIsIFwiYXJ5XCIsIFwiYXJiXCIsIFwiaHlcIiwgXCJhc1wiLFxuXHRcImFzdFwiLCBcImF6XCIsIFwiYmFuXCIsIFwiYm5cIiwgXCJiYVwiLCBcImV1XCIsIFwiYmJjXCIsIFwiYmVcIiwgXCJiaG9cIiwgXCJiaWtcIixcblx0XCJicnhcIiwgXCJic1wiLCBcImJnXCIsIFwieXVlXCIsIFwiY2FcIiwgXCJjZWJcIiwgXCJobmVcIiwgXCJsemhcIiwgXCJ6aC1IYW5zXCIsXG5cdFwiemgtSGFudFwiLCBcImNvXCIsIFwiaHJcIiwgXCJjc1wiLCBcImRhXCIsIFwicHJzXCIsIFwiZHZcIiwgXCJkb2lcIiwgXCJubFwiLCBcImVuXCIsXG5cdFwiZW4tR0JcIiwgXCJlcG9cIiwgXCJldFwiLCBcImZvXCIsIFwiZmpcIiwgXCJmaWxcIiwgXCJmaVwiLCBcImZyXCIsIFwiZnItQ0FcIiwgXCJmeVwiLFxuXHRcImZ1clwiLCBcImdsXCIsIFwibHVnXCIsIFwia2FcIiwgXCJkZVwiLCBcImVsXCIsIFwiZ3VcIiwgXCJodFwiLCBcImhhXCIsIFwiaGVcIiwgXCJoaWxcIixcblx0XCJoaVwiLCBcIm13d1wiLCBcImh1XCIsIFwiaWJhXCIsIFwiaXNcIiwgXCJpZ1wiLCBcImlsb1wiLCBcImlkXCIsIFwiaWt0XCIsIFwiaXVcIiwgXCJpdS1MYXRuXCIsXG5cdFwiZ2FcIiwgXCJpdFwiLCBcImphbVwiLCBcImphXCIsIFwiamF2XCIsIFwia2VhXCIsIFwia25cIiwgXCJwYW1cIiwgXCJrc1wiLCBcImtrXCIsIFwia21cIixcblx0XCJyd1wiLCBcInRsaC1MYXRuXCIsIFwiZ29tXCIsIFwia29cIiwgXCJrcmlcIiwgXCJrdVwiLCBcImttclwiLCBcImt5XCIsIFwibG9cIiwgXCJsYVwiLCBcImx2XCIsXG5cdFwibGlqXCIsIFwibGltXCIsIFwibG5cIiwgXCJsdFwiLCBcImxtb1wiLCBcImRzYlwiLCBcImxiXCIsIFwibWtcIiwgXCJtYWlcIiwgXCJtZ1wiLCBcIm1zXCIsXG5cdFwibWxcIiwgXCJtdFwiLCBcIm1yXCIsIFwibXdyXCIsIFwibWZlXCIsIFwibWluXCIsIFwibW4tQ3lybFwiLCBcIm1uLU1vbmdcIiwgXCJteVwiLCBcIm1pXCIsXG5cdFwibmVcIiwgXCJuYlwiLCBcIm5ub1wiLCBcIm55YVwiLCBcIm9jXCIsIFwib3JcIiwgXCJwYXBcIiwgXCJwc1wiLCBcImZhXCIsIFwicGxcIiwgXCJwdFwiLFxuXHRcInB0LVBUXCIsIFwicGFcIiwgXCJwbmJcIiwgXCJvdHFcIiwgXCJyb1wiLCBcInJ1blwiLCBcInJ1XCIsIFwic21cIiwgXCJzYVwiLCBcInNyZFwiLFxuXHRcInNyLUN5cmxcIiwgXCJzci1MYXRuXCIsIFwic3RcIiwgXCJuc29cIiwgXCJ0blwiLCBcImNyc1wiLCBcInNuXCIsIFwic2NuXCIsIFwic2RcIiwgXCJzaVwiLFxuXHRcInNrXCIsIFwic2xcIiwgXCJzb1wiLCBcImVzXCIsIFwic3VcIiwgXCJzd1wiLCBcInN2XCIsIFwidHlcIiwgXCJ0Z2tcIiwgXCJ0YVwiLCBcInR0XCIsIFwidGVcIixcblx0XCJ0ZXRcIiwgXCJ0aFwiLCBcImJvXCIsIFwidGlcIiwgXCJ0cGlcIiwgXCJ0b1wiLCBcInRyXCIsIFwidGtcIiwgXCJ1a1wiLCBcImhzYlwiLCBcInVyXCIsIFwidWdcIixcblx0XCJ1elwiLCBcInZlY1wiLCBcInZpXCIsIFwid2FyXCIsIFwiY3lcIiwgXCJ4aFwiLCBcInlkZFwiLCBcInlvXCIsIFwieXVhXCIsIFwienVcIlxuXSk7XG4vLyBlc2xpbnQtZW5hYmxlXG5cbmV4cG9ydCBjbGFzcyBNaWNyb3NvZnRUcmFuc2xhdG9yIGV4dGVuZHMgQmFzZVRyYW5zbGF0b3I8eyB0b2tlbkxpZmV0aW1lPzogbnVtYmVyIH0+IHtcblx0cHVibGljIHN0YXRpYyByZWFkb25seSB0cmFuc2xhdG9yTmFtZSA9ICdNaWNyb3NvZnRUcmFuc2xhdG9yJztcblxuXHRwdWJsaWMgc3RhdGljIGlzU3VwcG9ydGVkQXV0b0Zyb20gPSAoKSA9PiB0cnVlO1xuXG5cdHB1YmxpYyBzdGF0aWMgZ2V0U3VwcG9ydGVkTGFuZ3VhZ2VzKCk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gc3VwcG9ydGVkTGFuZ3VhZ2VzTWFwLmdldEFsbCgpO1xuXHR9XG5cblx0cHVibGljIGdldExlbmd0aExpbWl0KCkge1xuXHRcdHJldHVybiA1MF8wMDA7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UmVxdWVzdHNUaW1lb3V0KCkge1xuXHRcdHJldHVybiAzMDA7XG5cdH1cblxuXHRwdWJsaWMgY2hlY2tMaW1pdEV4Y2VlZGluZyh0ZXh0OiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHRleHQpKSB7XG5cdFx0XHRjb25zdCBhcnJheUxlbiA9IHRleHQucmVkdWNlKChhY2MsIHRleHQpID0+IGFjYyArIHRleHQubGVuZ3RoLCAwKTtcblx0XHRcdGNvbnN0IGV4dHJhID0gYXJyYXlMZW4gLSB0aGlzLmdldExlbmd0aExpbWl0KCk7XG5cdFx0XHRyZXR1cm4gZXh0cmEgPiAwID8gZXh0cmEgOiAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBleHRyYSA9IHRleHQubGVuZ3RoIC0gdGhpcy5nZXRMZW5ndGhMaW1pdCgpO1xuXHRcdFx0cmV0dXJuIGV4dHJhID4gMCA/IGV4dHJhIDogMDtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgdHJhbnNsYXRlKHRleHQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlQmF0Y2goW3RleHRdLCBmcm9tLCB0bykudGhlbigocmVzcCkgPT4gcmVzcFswXSk7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgdHJhbnNsYXRlQmF0Y2godGV4dDogc3RyaW5nW10sIGZyb206IHN0cmluZywgdG86IHN0cmluZykge1xuXHRcdGNvbnN0IHNvdXJjZUxhbmd1YWdlID0gZnJvbSA9PT0gJ2F1dG8nID8gJ2F1dG8nIDogc3VwcG9ydGVkTGFuZ3VhZ2VzTWFwLmdldChmcm9tKTtcblx0XHRjb25zdCB0YXJnZXRMYW5ndWFnZSA9IHN1cHBvcnRlZExhbmd1YWdlc01hcC5nZXQodG8pO1xuXG5cdFx0aWYgKCFzb3VyY2VMYW5ndWFnZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5zdXBwb3J0ZWQgc291cmNlIGxhbmd1YWdlICR7ZnJvbX1gKTtcblx0XHRpZiAoIXRhcmdldExhbmd1YWdlKSB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbnN1cHBvcnRlZCBzb3VyY2UgbGFuZ3VhZ2UgJHt0b31gKTtcblxuXHRcdGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRUb2tlbigpO1xuXG5cdFx0Y29uc3QgdXJsID1cblx0XHRcdCdodHRwczovL2FwaS1lZGdlLmNvZ25pdGl2ZS5taWNyb3NvZnR0cmFuc2xhdG9yLmNvbS90cmFuc2xhdGU/JyArXG5cdFx0XHQvLyBPbWl0IGBmcm9tYCBwYXJhbWV0ZXIgZm9yIGF1dG8gZGV0ZWN0aW9uIG9mIGxhbmd1YWdlXG5cdFx0XHQoc291cmNlTGFuZ3VhZ2UgIT09ICdhdXRvJ1xuXHRcdFx0XHQ/IGBmcm9tPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNvdXJjZUxhbmd1YWdlKX0mYFxuXHRcdFx0XHQ6ICcnKSArXG5cdFx0XHRgdG89JHtlbmNvZGVVUklDb21wb25lbnQoXG5cdFx0XHRcdHRhcmdldExhbmd1YWdlLFxuXHRcdFx0KX0mYXBpLXZlcnNpb249My4wJmluY2x1ZGVTZW50ZW5jZUxlbmd0aD10cnVlYDtcblxuXHRcdHJldHVybiB0aGlzLmZldGNoKHVybCwge1xuXHRcdFx0cmVzcG9uc2VUeXBlOiAnanNvbicsXG5cdFx0XHRtZXRob2Q6ICdQT1NUJyxcblx0XHRcdGhlYWRlcnM6IHtcblx0XHRcdFx0YWNjZXB0OiAnKi8qJyxcblx0XHRcdFx0J2FjY2VwdC1sYW5ndWFnZSc6XG5cdFx0XHRcdFx0J3poLVRXLHpoO3E9MC45LGphO3E9MC44LHpoLUNOO3E9MC43LGVuLVVTO3E9MC42LGVuO3E9MC41Jyxcblx0XHRcdFx0YXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG5cdFx0XHRcdCdjYWNoZS1jb250cm9sJzogJ25vLWNhY2hlJyxcblx0XHRcdFx0J2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcblx0XHRcdFx0cHJhZ21hOiAnbm8tY2FjaGUnLFxuXHRcdFx0XHRwcmlvcml0eTogJ3U9MSwgaScsXG5cdFx0XHRcdCdyZWZlcnJlci1wb2xpY3knOiAnc3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbicsXG5cdFx0XHRcdCdzZWMtZmV0Y2gtZGVzdCc6ICdlbXB0eScsXG5cdFx0XHRcdCdzZWMtZmV0Y2gtbW9kZSc6ICdjb3JzJyxcblx0XHRcdFx0J3NlYy1mZXRjaC1zaXRlJzogJ25vbmUnLFxuXHRcdFx0XHQnc2VjLWZldGNoLXN0b3JhZ2UtYWNjZXNzJzogJ2FjdGl2ZScsXG5cdFx0XHR9LFxuXHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkodGV4dC5tYXAoKHRleHQpID0+ICh7IFRleHQ6IHRleHQgfSkpKSxcblx0XHR9KS50aGVuKChyYXdSZXN1bHQpID0+IHtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IFJlc3BvbnNlU2NoZW1lLnBhcnNlKHJhd1Jlc3VsdC5kYXRhKTtcblxuXHRcdFx0aWYgKCdlcnJvcicgaW4gcmVzdWx0KSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ29kZSAke3Jlc3VsdC5lcnJvci5jb2RlfTogJHtyZXN1bHQuZXJyb3IubWVzc2FnZX1gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVHJhbnNmb3JtIHRyYW5zbGF0aW9ucyBhcnJheVxuXHRcdFx0cmV0dXJuIHJlc3VsdC5tYXAoKHRyYW5zbGF0aW9uSXRlbSkgPT5cblx0XHRcdFx0Ly8gQnVpbGQgdHJhbnNsYXRpb24gZm9yIHNpbmdsZSB0ZXh0XG5cdFx0XHRcdHRyYW5zbGF0aW9uSXRlbS50cmFuc2xhdGlvbnNcblx0XHRcdFx0XHQubWFwKCh0cmFuc2xhdGlvblNlZ21lbnQpID0+IHRyYW5zbGF0aW9uU2VnbWVudC50ZXh0KVxuXHRcdFx0XHRcdC5qb2luKCcgJyksXG5cdFx0XHQpO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJvdGVjdGVkIHRva2VuOlxuXHRcdHwge1xuXHRcdFx0XHR2YWx1ZTogc3RyaW5nO1xuXHRcdFx0XHRpc3N1ZWRBdDogbnVtYmVyO1xuXHRcdCAgfVxuXHRcdHwgUHJvbWlzZTxzdHJpbmc+XG5cdFx0fCBudWxsID0gbnVsbDtcblx0cHJvdGVjdGVkIGFzeW5jIGdldFRva2VuKCkge1xuXHRcdC8vIFdhaXQgcmVzb2x1dGlvbiBpZiBwZW5kaW5nXG5cdFx0aWYgKHRoaXMudG9rZW4gaW5zdGFuY2VvZiBQcm9taXNlKSByZXR1cm4gdGhpcy50b2tlbjtcblxuXHRcdC8vIEZldGNoIG5ldyB0b2tlblxuXHRcdGNvbnN0IHRva2VuTGlmZXRpbWUgPSB0aGlzLm9wdGlvbnMudG9rZW5MaWZldGltZSA/PyAzMF8wMDA7XG5cdFx0aWYgKCF0aGlzLnRva2VuIHx8IERhdGUubm93KCkgLSB0aGlzLnRva2VuLmlzc3VlZEF0ID4gdG9rZW5MaWZldGltZSkge1xuXHRcdFx0dGhpcy50b2tlbiA9IHRoaXMuZmV0Y2goJ2h0dHBzOi8vZWRnZS5taWNyb3NvZnQuY29tL3RyYW5zbGF0ZS9hdXRoJywge1xuXHRcdFx0XHRyZXNwb25zZVR5cGU6ICd0ZXh0Jyxcblx0XHRcdFx0bWV0aG9kOiAnR0VUJyxcblx0XHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRcdGFjY2VwdDogJyovKicsXG5cdFx0XHRcdFx0J2FjY2VwdC1sYW5ndWFnZSc6XG5cdFx0XHRcdFx0XHQnemgtVFcsemg7cT0wLjksamE7cT0wLjgsemgtQ047cT0wLjcsZW4tVVM7cT0wLjYsZW47cT0wLjUnLFxuXHRcdFx0XHRcdCdjYWNoZS1jb250cm9sJzogJ25vLWNhY2hlJyxcblx0XHRcdFx0XHRwcmFnbWE6ICduby1jYWNoZScsXG5cdFx0XHRcdFx0cHJpb3JpdHk6ICd1PTEsIGknLFxuXHRcdFx0XHRcdCdyZWZlcnJlci1wb2xpY3knOiAnc3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbicsXG5cdFx0XHRcdFx0J3NlYy1mZXRjaC1kZXN0JzogJ2VtcHR5Jyxcblx0XHRcdFx0XHQnc2VjLWZldGNoLW1vZGUnOiAnY29ycycsXG5cdFx0XHRcdFx0J3NlYy1mZXRjaC1zaXRlJzogJ25vbmUnLFxuXHRcdFx0XHRcdCdzZWMtZmV0Y2gtc3RvcmFnZS1hY2Nlc3MnOiAnYWN0aXZlJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ym9keTogbnVsbCxcblx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKCh7IGRhdGE6IHRva2VuLCBzdGF0dXNUZXh0LCBzdGF0dXMsIG9rIH0pID0+IHtcblx0XHRcdFx0XHRpZiAoIW9rKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcdFx0XHRzdGF0dXNUZXh0IHx8IGBVbmtub3duIGVycm9yIHdpdGggc3RhdHVzICR7c3RhdHVzfWAsXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0dGhpcy50b2tlbiA9IHsgdmFsdWU6IHRva2VuLCBpc3N1ZWRBdDogRGF0ZS5ub3coKSB9O1xuXHRcdFx0XHRcdHJldHVybiB0b2tlbjtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdHRoaXMudG9rZW4gPSBudWxsO1xuXHRcdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIGF3YWl0IHRoaXMudG9rZW47XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIGNhY2hlZCB2YWx1ZVxuXHRcdHJldHVybiB0aGlzLnRva2VuLnZhbHVlO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLElBQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLGdCQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxlQUFBLEdBQUFGLE9BQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxNQUFNRyxjQUFjLEdBQUdDLE1BQUMsQ0FDdEJDLE1BQU0sQ0FBQztFQUNQQyxZQUFZLEVBQUVGLE1BQUMsQ0FDYkMsTUFBTSxDQUFDO0lBQ1BFLElBQUksRUFBRUgsTUFBQyxDQUFDSSxNQUFNO0dBQ2QsQ0FBQyxDQUNEQyxLQUFLO0NBQ1AsQ0FBQyxDQUNEQSxLQUFLLEVBQUUsQ0FDUEMsRUFBRSxDQUNGTixNQUFDLENBQUNDLE1BQU0sQ0FBQztFQUNSTSxLQUFLLEVBQUVQLE1BQUMsQ0FBQ0MsTUFBTSxDQUFDO0lBQ2ZPLElBQUksRUFBRVIsTUFBQyxDQUFDUyxNQUFNLEVBQUU7SUFDaEJDLE9BQU8sRUFBRVYsTUFBQyxDQUFDSSxNQUFNO0dBQ2pCO0NBQ0QsQ0FBQyxDQUNGO0FBRUY7QUFDQTtBQUNBLE1BQU1PLHFCQUFxQixHQUFHLElBQUlDLGdDQUFlLENBQUMsQ0FDakQsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUM5RCxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQy9ELEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUM5RCxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQ2pFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFDbEUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFDbkUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFDekUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFDcEUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFDekUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFDckUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUN2RSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUNuRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQ2pFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFDdkUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQ3ZFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxF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YSxjQUFBQyxFQUFBLGNBQUFBLEVBQUEsR0FBSSxLQUFNO01BQzFELElBQUksQ0FBQyxJQUFJLENBQUNqRCxLQUFLLElBQUltRCxJQUFJLENBQUNDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQ3BELEtBQUssQ0FBQ3FELFFBQVEsR0FBR0wsYUFBYSxFQUFFO1FBQ3BFLElBQUksQ0FBQ2hELEtBQUssR0FBRyxJQUFJLENBQUMwQixLQUFLLENBQUMsMkNBQTJDLEVBQUU7VUFDcEVDLFlBQVksRUFBRSxNQUFNO1VBQ3BCQyxNQUFNLEVBQUUsS0FBSztVQUNiQyxPQUFPLEVBQUU7WUFDUkMsTUFBTSxFQUFFLEtBQUs7WUFDYixpQkFBaUIsRUFDaEIsMERBQTBEO1lBQzNELGVBQWUsRUFBRSxVQUFVO1lBQzNCRSxNQUFNLEVBQUUsVUFBVTtZQUNsQkMsUUFBUSxFQUFFLFFBQVE7WUFDbEIsaUJBQWlCLEVBQUUsaUNBQWlDO1lBQ3BELGdCQUFnQixFQUFFLE9BQU87WUFDekIsZ0JBQWdCLEVBQUUsTUFBTTtZQUN4QixnQkFBZ0IsRUFBRSxNQUFNO1lBQ3hCLDBCQUEwQixFQUFFO1dBQzVCO1VBQ0RDLElBQUksRUFBRTtTQUNOLENBQUMsQ0FDQWpCLElBQUksQ0FBQyxDQUFDO1VBQUV5QixJQUFJLEVBQUUxQyxLQUFLO1VBQUVzRCxVQUFVO1VBQUVDLE1BQU07VUFBRUM7UUFBRSxDQUFFLEtBQUk7VUFDakQsSUFBSSxDQUFDQSxFQUFFLEVBQ04sTUFBTSxJQUFJYixLQUFLLENBQ2RXLFVBQVUsSUFBSSw2QkFBNkJDLE1BQU0sRUFBRSxDQUNuRDtVQUVGLElBQUksQ0FBQ3ZELEtBQUssR0FBRztZQUFFeUQsS0FBSyxFQUFFekQsS0FBSztZQUFFcUQsUUFBUSxFQUFFRixJQUFJLENBQUNDLEdBQUc7VUFBRSxDQUFFO1VBQ25ELE9BQU9wRCxLQUFLO1FBQ2IsQ0FBQyxDQUFDLENBQ0QwRCxLQUFLLENBQUVuRSxLQUFjLElBQUk7VUFDekIsSUFBSSxDQUFDUyxLQUFLLEdBQUcsSUFBSTtVQUNqQixNQUFNVCxLQUFLO1FBQ1osQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLElBQUksQ0FBQ1MsS0FBSztNQUN4QjtNQUVBO01BQ0EsT0FBTyxJQUFJLENBQUNBLEtBQUssQ0FBQ3lELEtBQUs7SUFDeEIsQ0FBQzs7OztBQXpJc0I1RCxtQkFBQSxDQUFBOEQsY0FBYyxHQUFHLHFCQUFIO0FBRXZCOUQsbUJBQUEsQ0FBQStELG1CQUFtQixHQUFHLE1BQU0sSUFBVCIsImlnbm9yZUxpc3QiOltdfQ==
;