mirror of
https://github.com/swc-project/swc.git
synced 2024-12-23 13:51:19 +03:00
6287 lines
342 KiB
TypeScript
6287 lines
342 KiB
TypeScript
class DenoStdInternalError extends Error {
|
||
constructor(message){
|
||
super(message);
|
||
this.name = "DenoStdInternalError";
|
||
}
|
||
}
|
||
function assert(expr, msg = "") {
|
||
if (!expr) {
|
||
throw new DenoStdInternalError(msg);
|
||
}
|
||
}
|
||
function get(obj, key) {
|
||
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
||
return obj[key];
|
||
}
|
||
}
|
||
function getForce(obj, key) {
|
||
const v = get(obj, key);
|
||
assert(v != null);
|
||
return v;
|
||
}
|
||
function isNumber(x) {
|
||
if (typeof x === "number") return true;
|
||
if (/^0x[0-9a-f]+$/i.test(String(x))) return true;
|
||
return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(String(x));
|
||
}
|
||
function hasKey(obj, keys) {
|
||
let o = obj;
|
||
keys.slice(0, -1).forEach((key)=>{
|
||
o = get(o, key) ?? {};
|
||
});
|
||
const key = keys[keys.length - 1];
|
||
return key in o;
|
||
}
|
||
function parse(args, { "--": doubleDash = false , alias ={} , boolean: __boolean = false , default: defaults = {} , stopEarly =false , string =[] , unknown =(i)=>i } = {}) {
|
||
const flags = {
|
||
bools: {},
|
||
strings: {},
|
||
unknownFn: unknown,
|
||
allBools: false
|
||
};
|
||
if (__boolean !== undefined) {
|
||
if (typeof __boolean === "boolean") {
|
||
flags.allBools = !!__boolean;
|
||
} else {
|
||
const booleanArgs = typeof __boolean === "string" ? [
|
||
__boolean
|
||
] : __boolean;
|
||
for (const key of booleanArgs.filter(Boolean)){
|
||
flags.bools[key] = true;
|
||
}
|
||
}
|
||
}
|
||
const aliases = {};
|
||
if (alias !== undefined) {
|
||
for(const key1 in alias){
|
||
const val = getForce(alias, key1);
|
||
if (typeof val === "string") {
|
||
aliases[key1] = [
|
||
val
|
||
];
|
||
} else {
|
||
aliases[key1] = val;
|
||
}
|
||
for (const alias1 of getForce(aliases, key1)){
|
||
aliases[alias1] = [
|
||
key1
|
||
].concat(aliases[key1].filter((y)=>alias1 !== y));
|
||
}
|
||
}
|
||
}
|
||
if (string !== undefined) {
|
||
const stringArgs = typeof string === "string" ? [
|
||
string
|
||
] : string;
|
||
for (const key2 of stringArgs.filter(Boolean)){
|
||
flags.strings[key2] = true;
|
||
const alias2 = get(aliases, key2);
|
||
if (alias2) {
|
||
for (const al of alias2){
|
||
flags.strings[al] = true;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
const argv = {
|
||
_: []
|
||
};
|
||
function argDefined(key, arg) {
|
||
return flags.allBools && /^--[^=]+$/.test(arg) || get(flags.bools, key) || !!get(flags.strings, key) || !!get(aliases, key);
|
||
}
|
||
function setKey(obj, keys, value) {
|
||
let o = obj;
|
||
keys.slice(0, -1).forEach(function(key) {
|
||
if (get(o, key) === undefined) {
|
||
o[key] = {};
|
||
}
|
||
o = get(o, key);
|
||
});
|
||
const key = keys[keys.length - 1];
|
||
if (get(o, key) === undefined || get(flags.bools, key) || typeof get(o, key) === "boolean") {
|
||
o[key] = value;
|
||
} else if (Array.isArray(get(o, key))) {
|
||
o[key].push(value);
|
||
} else {
|
||
o[key] = [
|
||
get(o, key),
|
||
value
|
||
];
|
||
}
|
||
}
|
||
function setArg(key, val, arg = undefined) {
|
||
if (arg && flags.unknownFn && !argDefined(key, arg)) {
|
||
if (flags.unknownFn(arg, key, val) === false) return;
|
||
}
|
||
const value = !get(flags.strings, key) && isNumber(val) ? Number(val) : val;
|
||
setKey(argv, key.split("."), value);
|
||
const alias = get(aliases, key);
|
||
if (alias) {
|
||
for (const x of alias){
|
||
setKey(argv, x.split("."), value);
|
||
}
|
||
}
|
||
}
|
||
function aliasIsBoolean(key) {
|
||
return getForce(aliases, key).some((x)=>typeof get(flags.bools, x) === "boolean");
|
||
}
|
||
for (const key3 of Object.keys(flags.bools)){
|
||
setArg(key3, defaults[key3] === undefined ? false : defaults[key3]);
|
||
}
|
||
let notFlags = [];
|
||
if (args.includes("--")) {
|
||
notFlags = args.slice(args.indexOf("--") + 1);
|
||
args = args.slice(0, args.indexOf("--"));
|
||
}
|
||
for(let i = 0; i < args.length; i++){
|
||
const arg = args[i];
|
||
if (/^--.+=/.test(arg)) {
|
||
const m = arg.match(/^--([^=]+)=(.*)$/s);
|
||
assert(m != null);
|
||
const [, key4, value] = m;
|
||
if (flags.bools[key4]) {
|
||
const booleanValue = value !== "false";
|
||
setArg(key4, booleanValue, arg);
|
||
} else {
|
||
setArg(key4, value, arg);
|
||
}
|
||
} else if (/^--no-.+/.test(arg)) {
|
||
const m1 = arg.match(/^--no-(.+)/);
|
||
assert(m1 != null);
|
||
setArg(m1[1], false, arg);
|
||
} else if (/^--.+/.test(arg)) {
|
||
const m2 = arg.match(/^--(.+)/);
|
||
assert(m2 != null);
|
||
const [, key5] = m2;
|
||
const next = args[i + 1];
|
||
if (next !== undefined && !/^-/.test(next) && !get(flags.bools, key5) && !flags.allBools && (get(aliases, key5) ? !aliasIsBoolean(key5) : true)) {
|
||
setArg(key5, next, arg);
|
||
i++;
|
||
} else if (/^(true|false)$/.test(next)) {
|
||
setArg(key5, next === "true", arg);
|
||
i++;
|
||
} else {
|
||
setArg(key5, get(flags.strings, key5) ? "" : true, arg);
|
||
}
|
||
} else if (/^-[^-]+/.test(arg)) {
|
||
const letters = arg.slice(1, -1).split("");
|
||
let broken = false;
|
||
for(let j = 0; j < letters.length; j++){
|
||
const next1 = arg.slice(j + 2);
|
||
if (next1 === "-") {
|
||
setArg(letters[j], next1, arg);
|
||
continue;
|
||
}
|
||
if (/[A-Za-z]/.test(letters[j]) && /=/.test(next1)) {
|
||
setArg(letters[j], next1.split(/=(.+)/)[1], arg);
|
||
broken = true;
|
||
break;
|
||
}
|
||
if (/[A-Za-z]/.test(letters[j]) && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next1)) {
|
||
setArg(letters[j], next1, arg);
|
||
broken = true;
|
||
break;
|
||
}
|
||
if (letters[j + 1] && letters[j + 1].match(/\W/)) {
|
||
setArg(letters[j], arg.slice(j + 2), arg);
|
||
broken = true;
|
||
break;
|
||
} else {
|
||
setArg(letters[j], get(flags.strings, letters[j]) ? "" : true, arg);
|
||
}
|
||
}
|
||
const [key6] = arg.slice(-1);
|
||
if (!broken && key6 !== "-") {
|
||
if (args[i + 1] && !/^(-|--)[^-]/.test(args[i + 1]) && !get(flags.bools, key6) && (get(aliases, key6) ? !aliasIsBoolean(key6) : true)) {
|
||
setArg(key6, args[i + 1], arg);
|
||
i++;
|
||
} else if (args[i + 1] && /^(true|false)$/.test(args[i + 1])) {
|
||
setArg(key6, args[i + 1] === "true", arg);
|
||
i++;
|
||
} else {
|
||
setArg(key6, get(flags.strings, key6) ? "" : true, arg);
|
||
}
|
||
}
|
||
} else {
|
||
if (!flags.unknownFn || flags.unknownFn(arg) !== false) {
|
||
argv._.push(flags.strings["_"] ?? !isNumber(arg) ? arg : Number(arg));
|
||
}
|
||
if (stopEarly) {
|
||
argv._.push(...args.slice(i + 1));
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
for (const key7 of Object.keys(defaults)){
|
||
if (!hasKey(argv, key7.split("."))) {
|
||
setKey(argv, key7.split("."), defaults[key7]);
|
||
if (aliases[key7]) {
|
||
for (const x of aliases[key7]){
|
||
setKey(argv, x.split("."), defaults[key7]);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (doubleDash) {
|
||
argv["--"] = [];
|
||
for (const key8 of notFlags){
|
||
argv["--"].push(key8);
|
||
}
|
||
} else {
|
||
for (const key9 of notFlags){
|
||
argv._.push(key9);
|
||
}
|
||
}
|
||
return argv;
|
||
}
|
||
const mod = {
|
||
parse: parse
|
||
};
|
||
const CHAR_UPPERCASE_A = 65;
|
||
const CHAR_LOWERCASE_A = 97;
|
||
const CHAR_UPPERCASE_Z = 90;
|
||
const CHAR_LOWERCASE_Z = 122;
|
||
const CHAR_DOT = 46;
|
||
const CHAR_FORWARD_SLASH = 47;
|
||
const CHAR_BACKWARD_SLASH = 92;
|
||
const CHAR_COLON = 58;
|
||
const CHAR_QUESTION_MARK = 63;
|
||
let NATIVE_OS = "linux";
|
||
const navigator = globalThis.navigator;
|
||
if (globalThis.Deno != null) {
|
||
NATIVE_OS = Deno.build.os;
|
||
} else if (navigator?.appVersion?.includes?.("Win") ?? false) {
|
||
NATIVE_OS = "windows";
|
||
}
|
||
const isWindows = NATIVE_OS == "windows";
|
||
const SEP = isWindows ? "\\" : "/";
|
||
const SEP_PATTERN = isWindows ? /[\\/]+/ : /\/+/;
|
||
function assertPath(path) {
|
||
if (typeof path !== "string") {
|
||
throw new TypeError(`Path must be a string. Received ${JSON.stringify(path)}`);
|
||
}
|
||
}
|
||
function isPosixPathSeparator(code) {
|
||
return code === CHAR_FORWARD_SLASH;
|
||
}
|
||
function isPathSeparator(code) {
|
||
return isPosixPathSeparator(code) || code === CHAR_BACKWARD_SLASH;
|
||
}
|
||
function isWindowsDeviceRoot(code) {
|
||
return code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z || code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z;
|
||
}
|
||
function normalizeString(path, allowAboveRoot, separator, isPathSeparator) {
|
||
let res = "";
|
||
let lastSegmentLength = 0;
|
||
let lastSlash = -1;
|
||
let dots = 0;
|
||
let code;
|
||
for(let i = 0, len = path.length; i <= len; ++i){
|
||
if (i < len) code = path.charCodeAt(i);
|
||
else if (isPathSeparator(code)) break;
|
||
else code = CHAR_FORWARD_SLASH;
|
||
if (isPathSeparator(code)) {
|
||
if (lastSlash === i - 1 || dots === 1) {} else if (lastSlash !== i - 1 && dots === 2) {
|
||
if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== CHAR_DOT || res.charCodeAt(res.length - 2) !== CHAR_DOT) {
|
||
if (res.length > 2) {
|
||
const lastSlashIndex = res.lastIndexOf(separator);
|
||
if (lastSlashIndex === -1) {
|
||
res = "";
|
||
lastSegmentLength = 0;
|
||
} else {
|
||
res = res.slice(0, lastSlashIndex);
|
||
lastSegmentLength = res.length - 1 - res.lastIndexOf(separator);
|
||
}
|
||
lastSlash = i;
|
||
dots = 0;
|
||
continue;
|
||
} else if (res.length === 2 || res.length === 1) {
|
||
res = "";
|
||
lastSegmentLength = 0;
|
||
lastSlash = i;
|
||
dots = 0;
|
||
continue;
|
||
}
|
||
}
|
||
if (allowAboveRoot) {
|
||
if (res.length > 0) res += `${separator}..`;
|
||
else res = "..";
|
||
lastSegmentLength = 2;
|
||
}
|
||
} else {
|
||
if (res.length > 0) res += separator + path.slice(lastSlash + 1, i);
|
||
else res = path.slice(lastSlash + 1, i);
|
||
lastSegmentLength = i - lastSlash - 1;
|
||
}
|
||
lastSlash = i;
|
||
dots = 0;
|
||
} else if (code === CHAR_DOT && dots !== -1) {
|
||
++dots;
|
||
} else {
|
||
dots = -1;
|
||
}
|
||
}
|
||
return res;
|
||
}
|
||
function _format(sep, pathObject) {
|
||
const dir = pathObject.dir || pathObject.root;
|
||
const base = pathObject.base || (pathObject.name || "") + (pathObject.ext || "");
|
||
if (!dir) return base;
|
||
if (dir === pathObject.root) return dir + base;
|
||
return dir + sep + base;
|
||
}
|
||
const sep = "\\";
|
||
const delimiter = ";";
|
||
function resolve(...pathSegments) {
|
||
let resolvedDevice = "";
|
||
let resolvedTail = "";
|
||
let resolvedAbsolute = false;
|
||
for(let i = pathSegments.length - 1; i >= -1; i--){
|
||
let path;
|
||
if (i >= 0) {
|
||
path = pathSegments[i];
|
||
} else if (!resolvedDevice) {
|
||
if (globalThis.Deno == null) {
|
||
throw new TypeError("Resolved a drive-letter-less path without a CWD.");
|
||
}
|
||
path = Deno.cwd();
|
||
} else {
|
||
if (globalThis.Deno == null) {
|
||
throw new TypeError("Resolved a relative path without a CWD.");
|
||
}
|
||
path = Deno.env.get(`=${resolvedDevice}`) || Deno.cwd();
|
||
if (path === undefined || path.slice(0, 3).toLowerCase() !== `${resolvedDevice.toLowerCase()}\\`) {
|
||
path = `${resolvedDevice}\\`;
|
||
}
|
||
}
|
||
assertPath(path);
|
||
const len = path.length;
|
||
if (len === 0) continue;
|
||
let rootEnd = 0;
|
||
let device = "";
|
||
let isAbsolute = false;
|
||
const code = path.charCodeAt(0);
|
||
if (len > 1) {
|
||
if (isPathSeparator(code)) {
|
||
isAbsolute = true;
|
||
if (isPathSeparator(path.charCodeAt(1))) {
|
||
let j = 2;
|
||
let last = j;
|
||
for(; j < len; ++j){
|
||
if (isPathSeparator(path.charCodeAt(j))) break;
|
||
}
|
||
if (j < len && j !== last) {
|
||
const firstPart = path.slice(last, j);
|
||
last = j;
|
||
for(; j < len; ++j){
|
||
if (!isPathSeparator(path.charCodeAt(j))) break;
|
||
}
|
||
if (j < len && j !== last) {
|
||
last = j;
|
||
for(; j < len; ++j){
|
||
if (isPathSeparator(path.charCodeAt(j))) break;
|
||
}
|
||
if (j === len) {
|
||
device = `\\\\${firstPart}\\${path.slice(last)}`;
|
||
rootEnd = j;
|
||
} else if (j !== last) {
|
||
device = `\\\\${firstPart}\\${path.slice(last, j)}`;
|
||
rootEnd = j;
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
rootEnd = 1;
|
||
}
|
||
} else if (isWindowsDeviceRoot(code)) {
|
||
if (path.charCodeAt(1) === CHAR_COLON) {
|
||
device = path.slice(0, 2);
|
||
rootEnd = 2;
|
||
if (len > 2) {
|
||
if (isPathSeparator(path.charCodeAt(2))) {
|
||
isAbsolute = true;
|
||
rootEnd = 3;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} else if (isPathSeparator(code)) {
|
||
rootEnd = 1;
|
||
isAbsolute = true;
|
||
}
|
||
if (device.length > 0 && resolvedDevice.length > 0 && device.toLowerCase() !== resolvedDevice.toLowerCase()) {
|
||
continue;
|
||
}
|
||
if (resolvedDevice.length === 0 && device.length > 0) {
|
||
resolvedDevice = device;
|
||
}
|
||
if (!resolvedAbsolute) {
|
||
resolvedTail = `${path.slice(rootEnd)}\\${resolvedTail}`;
|
||
resolvedAbsolute = isAbsolute;
|
||
}
|
||
if (resolvedAbsolute && resolvedDevice.length > 0) break;
|
||
}
|
||
resolvedTail = normalizeString(resolvedTail, !resolvedAbsolute, "\\", isPathSeparator);
|
||
return resolvedDevice + (resolvedAbsolute ? "\\" : "") + resolvedTail || ".";
|
||
}
|
||
function normalize(path) {
|
||
assertPath(path);
|
||
const len = path.length;
|
||
if (len === 0) return ".";
|
||
let rootEnd = 0;
|
||
let device;
|
||
let isAbsolute = false;
|
||
const code = path.charCodeAt(0);
|
||
if (len > 1) {
|
||
if (isPathSeparator(code)) {
|
||
isAbsolute = true;
|
||
if (isPathSeparator(path.charCodeAt(1))) {
|
||
let j = 2;
|
||
let last = j;
|
||
for(; j < len; ++j){
|
||
if (isPathSeparator(path.charCodeAt(j))) break;
|
||
}
|
||
if (j < len && j !== last) {
|
||
const firstPart = path.slice(last, j);
|
||
last = j;
|
||
for(; j < len; ++j){
|
||
if (!isPathSeparator(path.charCodeAt(j))) break;
|
||
}
|
||
if (j < len && j !== last) {
|
||
last = j;
|
||
for(; j < len; ++j){
|
||
if (isPathSeparator(path.charCodeAt(j))) break;
|
||
}
|
||
if (j === len) {
|
||
return `\\\\${firstPart}\\${path.slice(last)}\\`;
|
||
} else if (j !== last) {
|
||
device = `\\\\${firstPart}\\${path.slice(last, j)}`;
|
||
rootEnd = j;
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
rootEnd = 1;
|
||
}
|
||
} else if (isWindowsDeviceRoot(code)) {
|
||
if (path.charCodeAt(1) === CHAR_COLON) {
|
||
device = path.slice(0, 2);
|
||
rootEnd = 2;
|
||
if (len > 2) {
|
||
if (isPathSeparator(path.charCodeAt(2))) {
|
||
isAbsolute = true;
|
||
rootEnd = 3;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} else if (isPathSeparator(code)) {
|
||
return "\\";
|
||
}
|
||
let tail;
|
||
if (rootEnd < len) {
|
||
tail = normalizeString(path.slice(rootEnd), !isAbsolute, "\\", isPathSeparator);
|
||
} else {
|
||
tail = "";
|
||
}
|
||
if (tail.length === 0 && !isAbsolute) tail = ".";
|
||
if (tail.length > 0 && isPathSeparator(path.charCodeAt(len - 1))) {
|
||
tail += "\\";
|
||
}
|
||
if (device === undefined) {
|
||
if (isAbsolute) {
|
||
if (tail.length > 0) return `\\${tail}`;
|
||
else return "\\";
|
||
} else if (tail.length > 0) {
|
||
return tail;
|
||
} else {
|
||
return "";
|
||
}
|
||
} else if (isAbsolute) {
|
||
if (tail.length > 0) return `${device}\\${tail}`;
|
||
else return `${device}\\`;
|
||
} else if (tail.length > 0) {
|
||
return device + tail;
|
||
} else {
|
||
return device;
|
||
}
|
||
}
|
||
function isAbsolute(path) {
|
||
assertPath(path);
|
||
const len = path.length;
|
||
if (len === 0) return false;
|
||
const code = path.charCodeAt(0);
|
||
if (isPathSeparator(code)) {
|
||
return true;
|
||
} else if (isWindowsDeviceRoot(code)) {
|
||
if (len > 2 && path.charCodeAt(1) === CHAR_COLON) {
|
||
if (isPathSeparator(path.charCodeAt(2))) return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
function join(...paths) {
|
||
const pathsCount = paths.length;
|
||
if (pathsCount === 0) return ".";
|
||
let joined;
|
||
let firstPart = null;
|
||
for(let i = 0; i < pathsCount; ++i){
|
||
const path = paths[i];
|
||
assertPath(path);
|
||
if (path.length > 0) {
|
||
if (joined === undefined) joined = firstPart = path;
|
||
else joined += `\\${path}`;
|
||
}
|
||
}
|
||
if (joined === undefined) return ".";
|
||
let needsReplace = true;
|
||
let slashCount = 0;
|
||
assert(firstPart != null);
|
||
if (isPathSeparator(firstPart.charCodeAt(0))) {
|
||
++slashCount;
|
||
const firstLen = firstPart.length;
|
||
if (firstLen > 1) {
|
||
if (isPathSeparator(firstPart.charCodeAt(1))) {
|
||
++slashCount;
|
||
if (firstLen > 2) {
|
||
if (isPathSeparator(firstPart.charCodeAt(2))) ++slashCount;
|
||
else {
|
||
needsReplace = false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (needsReplace) {
|
||
for(; slashCount < joined.length; ++slashCount){
|
||
if (!isPathSeparator(joined.charCodeAt(slashCount))) break;
|
||
}
|
||
if (slashCount >= 2) joined = `\\${joined.slice(slashCount)}`;
|
||
}
|
||
return normalize(joined);
|
||
}
|
||
function relative(from, to) {
|
||
assertPath(from);
|
||
assertPath(to);
|
||
if (from === to) return "";
|
||
const fromOrig = resolve(from);
|
||
const toOrig = resolve(to);
|
||
if (fromOrig === toOrig) return "";
|
||
from = fromOrig.toLowerCase();
|
||
to = toOrig.toLowerCase();
|
||
if (from === to) return "";
|
||
let fromStart = 0;
|
||
let fromEnd = from.length;
|
||
for(; fromStart < fromEnd; ++fromStart){
|
||
if (from.charCodeAt(fromStart) !== CHAR_BACKWARD_SLASH) break;
|
||
}
|
||
for(; fromEnd - 1 > fromStart; --fromEnd){
|
||
if (from.charCodeAt(fromEnd - 1) !== CHAR_BACKWARD_SLASH) break;
|
||
}
|
||
const fromLen = fromEnd - fromStart;
|
||
let toStart = 0;
|
||
let toEnd = to.length;
|
||
for(; toStart < toEnd; ++toStart){
|
||
if (to.charCodeAt(toStart) !== CHAR_BACKWARD_SLASH) break;
|
||
}
|
||
for(; toEnd - 1 > toStart; --toEnd){
|
||
if (to.charCodeAt(toEnd - 1) !== CHAR_BACKWARD_SLASH) break;
|
||
}
|
||
const toLen = toEnd - toStart;
|
||
const length = fromLen < toLen ? fromLen : toLen;
|
||
let lastCommonSep = -1;
|
||
let i = 0;
|
||
for(; i <= length; ++i){
|
||
if (i === length) {
|
||
if (toLen > length) {
|
||
if (to.charCodeAt(toStart + i) === CHAR_BACKWARD_SLASH) {
|
||
return toOrig.slice(toStart + i + 1);
|
||
} else if (i === 2) {
|
||
return toOrig.slice(toStart + i);
|
||
}
|
||
}
|
||
if (fromLen > length) {
|
||
if (from.charCodeAt(fromStart + i) === CHAR_BACKWARD_SLASH) {
|
||
lastCommonSep = i;
|
||
} else if (i === 2) {
|
||
lastCommonSep = 3;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
const fromCode = from.charCodeAt(fromStart + i);
|
||
const toCode = to.charCodeAt(toStart + i);
|
||
if (fromCode !== toCode) break;
|
||
else if (fromCode === CHAR_BACKWARD_SLASH) lastCommonSep = i;
|
||
}
|
||
if (i !== length && lastCommonSep === -1) {
|
||
return toOrig;
|
||
}
|
||
let out = "";
|
||
if (lastCommonSep === -1) lastCommonSep = 0;
|
||
for(i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i){
|
||
if (i === fromEnd || from.charCodeAt(i) === CHAR_BACKWARD_SLASH) {
|
||
if (out.length === 0) out += "..";
|
||
else out += "\\..";
|
||
}
|
||
}
|
||
if (out.length > 0) {
|
||
return out + toOrig.slice(toStart + lastCommonSep, toEnd);
|
||
} else {
|
||
toStart += lastCommonSep;
|
||
if (toOrig.charCodeAt(toStart) === CHAR_BACKWARD_SLASH) ++toStart;
|
||
return toOrig.slice(toStart, toEnd);
|
||
}
|
||
}
|
||
function toNamespacedPath(path) {
|
||
if (typeof path !== "string") return path;
|
||
if (path.length === 0) return "";
|
||
const resolvedPath = resolve(path);
|
||
if (resolvedPath.length >= 3) {
|
||
if (resolvedPath.charCodeAt(0) === CHAR_BACKWARD_SLASH) {
|
||
if (resolvedPath.charCodeAt(1) === CHAR_BACKWARD_SLASH) {
|
||
const code = resolvedPath.charCodeAt(2);
|
||
if (code !== CHAR_QUESTION_MARK && code !== CHAR_DOT) {
|
||
return `\\\\?\\UNC\\${resolvedPath.slice(2)}`;
|
||
}
|
||
}
|
||
} else if (isWindowsDeviceRoot(resolvedPath.charCodeAt(0))) {
|
||
if (resolvedPath.charCodeAt(1) === CHAR_COLON && resolvedPath.charCodeAt(2) === CHAR_BACKWARD_SLASH) {
|
||
return `\\\\?\\${resolvedPath}`;
|
||
}
|
||
}
|
||
}
|
||
return path;
|
||
}
|
||
function dirname(path) {
|
||
assertPath(path);
|
||
const len = path.length;
|
||
if (len === 0) return ".";
|
||
let rootEnd = -1;
|
||
let end = -1;
|
||
let matchedSlash = true;
|
||
let offset = 0;
|
||
const code = path.charCodeAt(0);
|
||
if (len > 1) {
|
||
if (isPathSeparator(code)) {
|
||
rootEnd = offset = 1;
|
||
if (isPathSeparator(path.charCodeAt(1))) {
|
||
let j = 2;
|
||
let last = j;
|
||
for(; j < len; ++j){
|
||
if (isPathSeparator(path.charCodeAt(j))) break;
|
||
}
|
||
if (j < len && j !== last) {
|
||
last = j;
|
||
for(; j < len; ++j){
|
||
if (!isPathSeparator(path.charCodeAt(j))) break;
|
||
}
|
||
if (j < len && j !== last) {
|
||
last = j;
|
||
for(; j < len; ++j){
|
||
if (isPathSeparator(path.charCodeAt(j))) break;
|
||
}
|
||
if (j === len) {
|
||
return path;
|
||
}
|
||
if (j !== last) {
|
||
rootEnd = offset = j + 1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} else if (isWindowsDeviceRoot(code)) {
|
||
if (path.charCodeAt(1) === CHAR_COLON) {
|
||
rootEnd = offset = 2;
|
||
if (len > 2) {
|
||
if (isPathSeparator(path.charCodeAt(2))) rootEnd = offset = 3;
|
||
}
|
||
}
|
||
}
|
||
} else if (isPathSeparator(code)) {
|
||
return path;
|
||
}
|
||
for(let i = len - 1; i >= offset; --i){
|
||
if (isPathSeparator(path.charCodeAt(i))) {
|
||
if (!matchedSlash) {
|
||
end = i;
|
||
break;
|
||
}
|
||
} else {
|
||
matchedSlash = false;
|
||
}
|
||
}
|
||
if (end === -1) {
|
||
if (rootEnd === -1) return ".";
|
||
else end = rootEnd;
|
||
}
|
||
return path.slice(0, end);
|
||
}
|
||
function basename(path, ext = "") {
|
||
if (ext !== undefined && typeof ext !== "string") {
|
||
throw new TypeError('"ext" argument must be a string');
|
||
}
|
||
assertPath(path);
|
||
let start = 0;
|
||
let end = -1;
|
||
let matchedSlash = true;
|
||
let i;
|
||
if (path.length >= 2) {
|
||
const drive = path.charCodeAt(0);
|
||
if (isWindowsDeviceRoot(drive)) {
|
||
if (path.charCodeAt(1) === CHAR_COLON) start = 2;
|
||
}
|
||
}
|
||
if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {
|
||
if (ext.length === path.length && ext === path) return "";
|
||
let extIdx = ext.length - 1;
|
||
let firstNonSlashEnd = -1;
|
||
for(i = path.length - 1; i >= start; --i){
|
||
const code = path.charCodeAt(i);
|
||
if (isPathSeparator(code)) {
|
||
if (!matchedSlash) {
|
||
start = i + 1;
|
||
break;
|
||
}
|
||
} else {
|
||
if (firstNonSlashEnd === -1) {
|
||
matchedSlash = false;
|
||
firstNonSlashEnd = i + 1;
|
||
}
|
||
if (extIdx >= 0) {
|
||
if (code === ext.charCodeAt(extIdx)) {
|
||
if (--extIdx === -1) {
|
||
end = i;
|
||
}
|
||
} else {
|
||
extIdx = -1;
|
||
end = firstNonSlashEnd;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (start === end) end = firstNonSlashEnd;
|
||
else if (end === -1) end = path.length;
|
||
return path.slice(start, end);
|
||
} else {
|
||
for(i = path.length - 1; i >= start; --i){
|
||
if (isPathSeparator(path.charCodeAt(i))) {
|
||
if (!matchedSlash) {
|
||
start = i + 1;
|
||
break;
|
||
}
|
||
} else if (end === -1) {
|
||
matchedSlash = false;
|
||
end = i + 1;
|
||
}
|
||
}
|
||
if (end === -1) return "";
|
||
return path.slice(start, end);
|
||
}
|
||
}
|
||
function extname(path) {
|
||
assertPath(path);
|
||
let start = 0;
|
||
let startDot = -1;
|
||
let startPart = 0;
|
||
let end = -1;
|
||
let matchedSlash = true;
|
||
let preDotState = 0;
|
||
if (path.length >= 2 && path.charCodeAt(1) === CHAR_COLON && isWindowsDeviceRoot(path.charCodeAt(0))) {
|
||
start = startPart = 2;
|
||
}
|
||
for(let i = path.length - 1; i >= start; --i){
|
||
const code = path.charCodeAt(i);
|
||
if (isPathSeparator(code)) {
|
||
if (!matchedSlash) {
|
||
startPart = i + 1;
|
||
break;
|
||
}
|
||
continue;
|
||
}
|
||
if (end === -1) {
|
||
matchedSlash = false;
|
||
end = i + 1;
|
||
}
|
||
if (code === CHAR_DOT) {
|
||
if (startDot === -1) startDot = i;
|
||
else if (preDotState !== 1) preDotState = 1;
|
||
} else if (startDot !== -1) {
|
||
preDotState = -1;
|
||
}
|
||
}
|
||
if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
||
return "";
|
||
}
|
||
return path.slice(startDot, end);
|
||
}
|
||
function format(pathObject) {
|
||
if (pathObject === null || typeof pathObject !== "object") {
|
||
throw new TypeError(`The "pathObject" argument must be of type Object. Received type ${typeof pathObject}`);
|
||
}
|
||
return _format("\\", pathObject);
|
||
}
|
||
function parse1(path) {
|
||
assertPath(path);
|
||
const ret = {
|
||
root: "",
|
||
dir: "",
|
||
base: "",
|
||
ext: "",
|
||
name: ""
|
||
};
|
||
const len = path.length;
|
||
if (len === 0) return ret;
|
||
let rootEnd = 0;
|
||
let code = path.charCodeAt(0);
|
||
if (len > 1) {
|
||
if (isPathSeparator(code)) {
|
||
rootEnd = 1;
|
||
if (isPathSeparator(path.charCodeAt(1))) {
|
||
let j = 2;
|
||
let last = j;
|
||
for(; j < len; ++j){
|
||
if (isPathSeparator(path.charCodeAt(j))) break;
|
||
}
|
||
if (j < len && j !== last) {
|
||
last = j;
|
||
for(; j < len; ++j){
|
||
if (!isPathSeparator(path.charCodeAt(j))) break;
|
||
}
|
||
if (j < len && j !== last) {
|
||
last = j;
|
||
for(; j < len; ++j){
|
||
if (isPathSeparator(path.charCodeAt(j))) break;
|
||
}
|
||
if (j === len) {
|
||
rootEnd = j;
|
||
} else if (j !== last) {
|
||
rootEnd = j + 1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} else if (isWindowsDeviceRoot(code)) {
|
||
if (path.charCodeAt(1) === CHAR_COLON) {
|
||
rootEnd = 2;
|
||
if (len > 2) {
|
||
if (isPathSeparator(path.charCodeAt(2))) {
|
||
if (len === 3) {
|
||
ret.root = ret.dir = path;
|
||
return ret;
|
||
}
|
||
rootEnd = 3;
|
||
}
|
||
} else {
|
||
ret.root = ret.dir = path;
|
||
return ret;
|
||
}
|
||
}
|
||
}
|
||
} else if (isPathSeparator(code)) {
|
||
ret.root = ret.dir = path;
|
||
return ret;
|
||
}
|
||
if (rootEnd > 0) ret.root = path.slice(0, rootEnd);
|
||
let startDot = -1;
|
||
let startPart = rootEnd;
|
||
let end = -1;
|
||
let matchedSlash = true;
|
||
let i = path.length - 1;
|
||
let preDotState = 0;
|
||
for(; i >= rootEnd; --i){
|
||
code = path.charCodeAt(i);
|
||
if (isPathSeparator(code)) {
|
||
if (!matchedSlash) {
|
||
startPart = i + 1;
|
||
break;
|
||
}
|
||
continue;
|
||
}
|
||
if (end === -1) {
|
||
matchedSlash = false;
|
||
end = i + 1;
|
||
}
|
||
if (code === CHAR_DOT) {
|
||
if (startDot === -1) startDot = i;
|
||
else if (preDotState !== 1) preDotState = 1;
|
||
} else if (startDot !== -1) {
|
||
preDotState = -1;
|
||
}
|
||
}
|
||
if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
||
if (end !== -1) {
|
||
ret.base = ret.name = path.slice(startPart, end);
|
||
}
|
||
} else {
|
||
ret.name = path.slice(startPart, startDot);
|
||
ret.base = path.slice(startPart, end);
|
||
ret.ext = path.slice(startDot, end);
|
||
}
|
||
if (startPart > 0 && startPart !== rootEnd) {
|
||
ret.dir = path.slice(0, startPart - 1);
|
||
} else ret.dir = ret.root;
|
||
return ret;
|
||
}
|
||
function fromFileUrl(url) {
|
||
url = url instanceof URL ? url : new URL(url);
|
||
if (url.protocol != "file:") {
|
||
throw new TypeError("Must be a file URL.");
|
||
}
|
||
let path = decodeURIComponent(url.pathname.replace(/\//g, "\\").replace(/%(?![0-9A-Fa-f]{2})/g, "%25")).replace(/^\\*([A-Za-z]:)(\\|$)/, "$1\\");
|
||
if (url.hostname != "") {
|
||
path = `\\\\${url.hostname}${path}`;
|
||
}
|
||
return path;
|
||
}
|
||
function toFileUrl(path) {
|
||
if (!isAbsolute(path)) {
|
||
throw new TypeError("Must be an absolute path.");
|
||
}
|
||
const [, hostname, pathname] = path.match(/^(?:[/\\]{2}([^/\\]+)(?=[/\\][^/\\]))?(.*)/);
|
||
const url = new URL("file:///");
|
||
url.pathname = pathname.replace(/%/g, "%25");
|
||
if (hostname != null) {
|
||
url.hostname = hostname;
|
||
if (!url.hostname) {
|
||
throw new TypeError("Invalid hostname.");
|
||
}
|
||
}
|
||
return url;
|
||
}
|
||
const mod1 = {
|
||
sep: sep,
|
||
delimiter: delimiter,
|
||
resolve: resolve,
|
||
normalize: normalize,
|
||
isAbsolute: isAbsolute,
|
||
join: join,
|
||
relative: relative,
|
||
toNamespacedPath: toNamespacedPath,
|
||
dirname: dirname,
|
||
basename: basename,
|
||
extname: extname,
|
||
format: format,
|
||
parse: parse1,
|
||
fromFileUrl: fromFileUrl,
|
||
toFileUrl: toFileUrl
|
||
};
|
||
const sep1 = "/";
|
||
const delimiter1 = ":";
|
||
function resolve1(...pathSegments) {
|
||
let resolvedPath = "";
|
||
let resolvedAbsolute = false;
|
||
for(let i = pathSegments.length - 1; i >= -1 && !resolvedAbsolute; i--){
|
||
let path;
|
||
if (i >= 0) path = pathSegments[i];
|
||
else {
|
||
if (globalThis.Deno == null) {
|
||
throw new TypeError("Resolved a relative path without a CWD.");
|
||
}
|
||
path = Deno.cwd();
|
||
}
|
||
assertPath(path);
|
||
if (path.length === 0) {
|
||
continue;
|
||
}
|
||
resolvedPath = `${path}/${resolvedPath}`;
|
||
resolvedAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH;
|
||
}
|
||
resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute, "/", isPosixPathSeparator);
|
||
if (resolvedAbsolute) {
|
||
if (resolvedPath.length > 0) return `/${resolvedPath}`;
|
||
else return "/";
|
||
} else if (resolvedPath.length > 0) return resolvedPath;
|
||
else return ".";
|
||
}
|
||
function normalize1(path) {
|
||
assertPath(path);
|
||
if (path.length === 0) return ".";
|
||
const isAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH;
|
||
const trailingSeparator = path.charCodeAt(path.length - 1) === CHAR_FORWARD_SLASH;
|
||
path = normalizeString(path, !isAbsolute, "/", isPosixPathSeparator);
|
||
if (path.length === 0 && !isAbsolute) path = ".";
|
||
if (path.length > 0 && trailingSeparator) path += "/";
|
||
if (isAbsolute) return `/${path}`;
|
||
return path;
|
||
}
|
||
function isAbsolute1(path) {
|
||
assertPath(path);
|
||
return path.length > 0 && path.charCodeAt(0) === CHAR_FORWARD_SLASH;
|
||
}
|
||
function join1(...paths) {
|
||
if (paths.length === 0) return ".";
|
||
let joined;
|
||
for(let i = 0, len = paths.length; i < len; ++i){
|
||
const path = paths[i];
|
||
assertPath(path);
|
||
if (path.length > 0) {
|
||
if (!joined) joined = path;
|
||
else joined += `/${path}`;
|
||
}
|
||
}
|
||
if (!joined) return ".";
|
||
return normalize1(joined);
|
||
}
|
||
function relative1(from, to) {
|
||
assertPath(from);
|
||
assertPath(to);
|
||
if (from === to) return "";
|
||
from = resolve1(from);
|
||
to = resolve1(to);
|
||
if (from === to) return "";
|
||
let fromStart = 1;
|
||
const fromEnd = from.length;
|
||
for(; fromStart < fromEnd; ++fromStart){
|
||
if (from.charCodeAt(fromStart) !== CHAR_FORWARD_SLASH) break;
|
||
}
|
||
const fromLen = fromEnd - fromStart;
|
||
let toStart = 1;
|
||
const toEnd = to.length;
|
||
for(; toStart < toEnd; ++toStart){
|
||
if (to.charCodeAt(toStart) !== CHAR_FORWARD_SLASH) break;
|
||
}
|
||
const toLen = toEnd - toStart;
|
||
const length = fromLen < toLen ? fromLen : toLen;
|
||
let lastCommonSep = -1;
|
||
let i = 0;
|
||
for(; i <= length; ++i){
|
||
if (i === length) {
|
||
if (toLen > length) {
|
||
if (to.charCodeAt(toStart + i) === CHAR_FORWARD_SLASH) {
|
||
return to.slice(toStart + i + 1);
|
||
} else if (i === 0) {
|
||
return to.slice(toStart + i);
|
||
}
|
||
} else if (fromLen > length) {
|
||
if (from.charCodeAt(fromStart + i) === CHAR_FORWARD_SLASH) {
|
||
lastCommonSep = i;
|
||
} else if (i === 0) {
|
||
lastCommonSep = 0;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
const fromCode = from.charCodeAt(fromStart + i);
|
||
const toCode = to.charCodeAt(toStart + i);
|
||
if (fromCode !== toCode) break;
|
||
else if (fromCode === CHAR_FORWARD_SLASH) lastCommonSep = i;
|
||
}
|
||
let out = "";
|
||
for(i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i){
|
||
if (i === fromEnd || from.charCodeAt(i) === CHAR_FORWARD_SLASH) {
|
||
if (out.length === 0) out += "..";
|
||
else out += "/..";
|
||
}
|
||
}
|
||
if (out.length > 0) return out + to.slice(toStart + lastCommonSep);
|
||
else {
|
||
toStart += lastCommonSep;
|
||
if (to.charCodeAt(toStart) === CHAR_FORWARD_SLASH) ++toStart;
|
||
return to.slice(toStart);
|
||
}
|
||
}
|
||
function toNamespacedPath1(path) {
|
||
return path;
|
||
}
|
||
function dirname1(path) {
|
||
assertPath(path);
|
||
if (path.length === 0) return ".";
|
||
const hasRoot = path.charCodeAt(0) === CHAR_FORWARD_SLASH;
|
||
let end = -1;
|
||
let matchedSlash = true;
|
||
for(let i = path.length - 1; i >= 1; --i){
|
||
if (path.charCodeAt(i) === CHAR_FORWARD_SLASH) {
|
||
if (!matchedSlash) {
|
||
end = i;
|
||
break;
|
||
}
|
||
} else {
|
||
matchedSlash = false;
|
||
}
|
||
}
|
||
if (end === -1) return hasRoot ? "/" : ".";
|
||
if (hasRoot && end === 1) return "//";
|
||
return path.slice(0, end);
|
||
}
|
||
function basename1(path, ext = "") {
|
||
if (ext !== undefined && typeof ext !== "string") {
|
||
throw new TypeError('"ext" argument must be a string');
|
||
}
|
||
assertPath(path);
|
||
let start = 0;
|
||
let end = -1;
|
||
let matchedSlash = true;
|
||
let i;
|
||
if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {
|
||
if (ext.length === path.length && ext === path) return "";
|
||
let extIdx = ext.length - 1;
|
||
let firstNonSlashEnd = -1;
|
||
for(i = path.length - 1; i >= 0; --i){
|
||
const code = path.charCodeAt(i);
|
||
if (code === CHAR_FORWARD_SLASH) {
|
||
if (!matchedSlash) {
|
||
start = i + 1;
|
||
break;
|
||
}
|
||
} else {
|
||
if (firstNonSlashEnd === -1) {
|
||
matchedSlash = false;
|
||
firstNonSlashEnd = i + 1;
|
||
}
|
||
if (extIdx >= 0) {
|
||
if (code === ext.charCodeAt(extIdx)) {
|
||
if (--extIdx === -1) {
|
||
end = i;
|
||
}
|
||
} else {
|
||
extIdx = -1;
|
||
end = firstNonSlashEnd;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (start === end) end = firstNonSlashEnd;
|
||
else if (end === -1) end = path.length;
|
||
return path.slice(start, end);
|
||
} else {
|
||
for(i = path.length - 1; i >= 0; --i){
|
||
if (path.charCodeAt(i) === CHAR_FORWARD_SLASH) {
|
||
if (!matchedSlash) {
|
||
start = i + 1;
|
||
break;
|
||
}
|
||
} else if (end === -1) {
|
||
matchedSlash = false;
|
||
end = i + 1;
|
||
}
|
||
}
|
||
if (end === -1) return "";
|
||
return path.slice(start, end);
|
||
}
|
||
}
|
||
function extname1(path) {
|
||
assertPath(path);
|
||
let startDot = -1;
|
||
let startPart = 0;
|
||
let end = -1;
|
||
let matchedSlash = true;
|
||
let preDotState = 0;
|
||
for(let i = path.length - 1; i >= 0; --i){
|
||
const code = path.charCodeAt(i);
|
||
if (code === CHAR_FORWARD_SLASH) {
|
||
if (!matchedSlash) {
|
||
startPart = i + 1;
|
||
break;
|
||
}
|
||
continue;
|
||
}
|
||
if (end === -1) {
|
||
matchedSlash = false;
|
||
end = i + 1;
|
||
}
|
||
if (code === CHAR_DOT) {
|
||
if (startDot === -1) startDot = i;
|
||
else if (preDotState !== 1) preDotState = 1;
|
||
} else if (startDot !== -1) {
|
||
preDotState = -1;
|
||
}
|
||
}
|
||
if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
||
return "";
|
||
}
|
||
return path.slice(startDot, end);
|
||
}
|
||
function format1(pathObject) {
|
||
if (pathObject === null || typeof pathObject !== "object") {
|
||
throw new TypeError(`The "pathObject" argument must be of type Object. Received type ${typeof pathObject}`);
|
||
}
|
||
return _format("/", pathObject);
|
||
}
|
||
function parse2(path) {
|
||
assertPath(path);
|
||
const ret = {
|
||
root: "",
|
||
dir: "",
|
||
base: "",
|
||
ext: "",
|
||
name: ""
|
||
};
|
||
if (path.length === 0) return ret;
|
||
const isAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH;
|
||
let start;
|
||
if (isAbsolute) {
|
||
ret.root = "/";
|
||
start = 1;
|
||
} else {
|
||
start = 0;
|
||
}
|
||
let startDot = -1;
|
||
let startPart = 0;
|
||
let end = -1;
|
||
let matchedSlash = true;
|
||
let i = path.length - 1;
|
||
let preDotState = 0;
|
||
for(; i >= start; --i){
|
||
const code = path.charCodeAt(i);
|
||
if (code === CHAR_FORWARD_SLASH) {
|
||
if (!matchedSlash) {
|
||
startPart = i + 1;
|
||
break;
|
||
}
|
||
continue;
|
||
}
|
||
if (end === -1) {
|
||
matchedSlash = false;
|
||
end = i + 1;
|
||
}
|
||
if (code === CHAR_DOT) {
|
||
if (startDot === -1) startDot = i;
|
||
else if (preDotState !== 1) preDotState = 1;
|
||
} else if (startDot !== -1) {
|
||
preDotState = -1;
|
||
}
|
||
}
|
||
if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
||
if (end !== -1) {
|
||
if (startPart === 0 && isAbsolute) {
|
||
ret.base = ret.name = path.slice(1, end);
|
||
} else {
|
||
ret.base = ret.name = path.slice(startPart, end);
|
||
}
|
||
}
|
||
} else {
|
||
if (startPart === 0 && isAbsolute) {
|
||
ret.name = path.slice(1, startDot);
|
||
ret.base = path.slice(1, end);
|
||
} else {
|
||
ret.name = path.slice(startPart, startDot);
|
||
ret.base = path.slice(startPart, end);
|
||
}
|
||
ret.ext = path.slice(startDot, end);
|
||
}
|
||
if (startPart > 0) ret.dir = path.slice(0, startPart - 1);
|
||
else if (isAbsolute) ret.dir = "/";
|
||
return ret;
|
||
}
|
||
function fromFileUrl1(url) {
|
||
url = url instanceof URL ? url : new URL(url);
|
||
if (url.protocol != "file:") {
|
||
throw new TypeError("Must be a file URL.");
|
||
}
|
||
return decodeURIComponent(url.pathname.replace(/%(?![0-9A-Fa-f]{2})/g, "%25"));
|
||
}
|
||
function toFileUrl1(path) {
|
||
if (!isAbsolute1(path)) {
|
||
throw new TypeError("Must be an absolute path.");
|
||
}
|
||
const url = new URL("file:///");
|
||
url.pathname = path.replace(/%/g, "%25").replace(/\\/g, "%5C");
|
||
return url;
|
||
}
|
||
const mod2 = {
|
||
sep: sep1,
|
||
delimiter: delimiter1,
|
||
resolve: resolve1,
|
||
normalize: normalize1,
|
||
isAbsolute: isAbsolute1,
|
||
join: join1,
|
||
relative: relative1,
|
||
toNamespacedPath: toNamespacedPath1,
|
||
dirname: dirname1,
|
||
basename: basename1,
|
||
extname: extname1,
|
||
format: format1,
|
||
parse: parse2,
|
||
fromFileUrl: fromFileUrl1,
|
||
toFileUrl: toFileUrl1
|
||
};
|
||
function common(paths, sep = SEP) {
|
||
const [first = "", ...remaining] = paths;
|
||
if (first === "" || remaining.length === 0) {
|
||
return first.substring(0, first.lastIndexOf(sep) + 1);
|
||
}
|
||
const parts = first.split(sep);
|
||
let endOfPrefix = parts.length;
|
||
for (const path of remaining){
|
||
const compare = path.split(sep);
|
||
for(let i = 0; i < endOfPrefix; i++){
|
||
if (compare[i] !== parts[i]) {
|
||
endOfPrefix = i;
|
||
}
|
||
}
|
||
if (endOfPrefix === 0) {
|
||
return "";
|
||
}
|
||
}
|
||
const prefix = parts.slice(0, endOfPrefix).join(sep);
|
||
return prefix.endsWith(sep) ? prefix : `${prefix}${sep}`;
|
||
}
|
||
const path = isWindows ? mod1 : mod2;
|
||
const regExpEscapeChars = [
|
||
"!",
|
||
"$",
|
||
"(",
|
||
")",
|
||
"*",
|
||
"+",
|
||
".",
|
||
"=",
|
||
"?",
|
||
"[",
|
||
"\\",
|
||
"^",
|
||
"{",
|
||
"|"
|
||
];
|
||
const win32 = mod1;
|
||
const posix = mod2;
|
||
const { basename: basename2 , delimiter: delimiter2 , dirname: dirname2 , extname: extname2 , format: format2 , fromFileUrl: fromFileUrl2 , isAbsolute: isAbsolute2 , join: join2 , normalize: normalize2 , parse: parse3 , relative: relative2 , resolve: resolve2 , sep: sep2 , toFileUrl: toFileUrl2 , toNamespacedPath: toNamespacedPath2 , } = path;
|
||
const rangeEscapeChars = [
|
||
"-",
|
||
"\\",
|
||
"]"
|
||
];
|
||
function globToRegExp(glob, { extended =true , globstar: globstarOption = true , os =NATIVE_OS } = {}) {
|
||
if (glob == "") {
|
||
return /(?!)/;
|
||
}
|
||
const sep = os == "windows" ? "(?:\\\\|/)+" : "/+";
|
||
const sepMaybe = os == "windows" ? "(?:\\\\|/)*" : "/*";
|
||
const seps = os == "windows" ? [
|
||
"\\",
|
||
"/"
|
||
] : [
|
||
"/"
|
||
];
|
||
const globstar = os == "windows" ? "(?:[^\\\\/]*(?:\\\\|/|$)+)*" : "(?:[^/]*(?:/|$)+)*";
|
||
const wildcard = os == "windows" ? "[^\\\\/]*" : "[^/]*";
|
||
const escapePrefix = os == "windows" ? "`" : "\\";
|
||
let newLength = glob.length;
|
||
for(; newLength > 1 && seps.includes(glob[newLength - 1]); newLength--);
|
||
glob = glob.slice(0, newLength);
|
||
let regExpString = "";
|
||
for(let j = 0; j < glob.length;){
|
||
let segment = "";
|
||
const groupStack = [];
|
||
let inRange = false;
|
||
let inEscape = false;
|
||
let endsWithSep = false;
|
||
let i = j;
|
||
for(; i < glob.length && !seps.includes(glob[i]); i++){
|
||
if (inEscape) {
|
||
inEscape = false;
|
||
const escapeChars = inRange ? rangeEscapeChars : regExpEscapeChars;
|
||
segment += escapeChars.includes(glob[i]) ? `\\${glob[i]}` : glob[i];
|
||
continue;
|
||
}
|
||
if (glob[i] == escapePrefix) {
|
||
inEscape = true;
|
||
continue;
|
||
}
|
||
if (glob[i] == "[") {
|
||
if (!inRange) {
|
||
inRange = true;
|
||
segment += "[";
|
||
if (glob[i + 1] == "!") {
|
||
i++;
|
||
segment += "^";
|
||
} else if (glob[i + 1] == "^") {
|
||
i++;
|
||
segment += "\\^";
|
||
}
|
||
continue;
|
||
} else if (glob[i + 1] == ":") {
|
||
let k = i + 1;
|
||
let value = "";
|
||
while(glob[k + 1] != null && glob[k + 1] != ":"){
|
||
value += glob[k + 1];
|
||
k++;
|
||
}
|
||
if (glob[k + 1] == ":" && glob[k + 2] == "]") {
|
||
i = k + 2;
|
||
if (value == "alnum") segment += "\\dA-Za-z";
|
||
else if (value == "alpha") segment += "A-Za-z";
|
||
else if (value == "ascii") segment += "\x00-\x7F";
|
||
else if (value == "blank") segment += "\t ";
|
||
else if (value == "cntrl") segment += "\x00-\x1F\x7F";
|
||
else if (value == "digit") segment += "\\d";
|
||
else if (value == "graph") segment += "\x21-\x7E";
|
||
else if (value == "lower") segment += "a-z";
|
||
else if (value == "print") segment += "\x20-\x7E";
|
||
else if (value == "punct") {
|
||
segment += "!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_‘{|}~";
|
||
} else if (value == "space") segment += "\\s\v";
|
||
else if (value == "upper") segment += "A-Z";
|
||
else if (value == "word") segment += "\\w";
|
||
else if (value == "xdigit") segment += "\\dA-Fa-f";
|
||
continue;
|
||
}
|
||
}
|
||
}
|
||
if (glob[i] == "]" && inRange) {
|
||
inRange = false;
|
||
segment += "]";
|
||
continue;
|
||
}
|
||
if (inRange) {
|
||
if (glob[i] == "\\") {
|
||
segment += `\\\\`;
|
||
} else {
|
||
segment += glob[i];
|
||
}
|
||
continue;
|
||
}
|
||
if (glob[i] == ")" && groupStack.length > 0 && groupStack[groupStack.length - 1] != "BRACE") {
|
||
segment += ")";
|
||
const type = groupStack.pop();
|
||
if (type == "!") {
|
||
segment += wildcard;
|
||
} else if (type != "@") {
|
||
segment += type;
|
||
}
|
||
continue;
|
||
}
|
||
if (glob[i] == "|" && groupStack.length > 0 && groupStack[groupStack.length - 1] != "BRACE") {
|
||
segment += "|";
|
||
continue;
|
||
}
|
||
if (glob[i] == "+" && extended && glob[i + 1] == "(") {
|
||
i++;
|
||
groupStack.push("+");
|
||
segment += "(?:";
|
||
continue;
|
||
}
|
||
if (glob[i] == "@" && extended && glob[i + 1] == "(") {
|
||
i++;
|
||
groupStack.push("@");
|
||
segment += "(?:";
|
||
continue;
|
||
}
|
||
if (glob[i] == "?") {
|
||
if (extended && glob[i + 1] == "(") {
|
||
i++;
|
||
groupStack.push("?");
|
||
segment += "(?:";
|
||
} else {
|
||
segment += ".";
|
||
}
|
||
continue;
|
||
}
|
||
if (glob[i] == "!" && extended && glob[i + 1] == "(") {
|
||
i++;
|
||
groupStack.push("!");
|
||
segment += "(?!";
|
||
continue;
|
||
}
|
||
if (glob[i] == "{") {
|
||
groupStack.push("BRACE");
|
||
segment += "(?:";
|
||
continue;
|
||
}
|
||
if (glob[i] == "}" && groupStack[groupStack.length - 1] == "BRACE") {
|
||
groupStack.pop();
|
||
segment += ")";
|
||
continue;
|
||
}
|
||
if (glob[i] == "," && groupStack[groupStack.length - 1] == "BRACE") {
|
||
segment += "|";
|
||
continue;
|
||
}
|
||
if (glob[i] == "*") {
|
||
if (extended && glob[i + 1] == "(") {
|
||
i++;
|
||
groupStack.push("*");
|
||
segment += "(?:";
|
||
} else {
|
||
const prevChar = glob[i - 1];
|
||
let numStars = 1;
|
||
while(glob[i + 1] == "*"){
|
||
i++;
|
||
numStars++;
|
||
}
|
||
const nextChar = glob[i + 1];
|
||
if (globstarOption && numStars == 2 && [
|
||
...seps,
|
||
undefined
|
||
].includes(prevChar) && [
|
||
...seps,
|
||
undefined
|
||
].includes(nextChar)) {
|
||
segment += globstar;
|
||
endsWithSep = true;
|
||
} else {
|
||
segment += wildcard;
|
||
}
|
||
}
|
||
continue;
|
||
}
|
||
segment += regExpEscapeChars.includes(glob[i]) ? `\\${glob[i]}` : glob[i];
|
||
}
|
||
if (groupStack.length > 0 || inRange || inEscape) {
|
||
segment = "";
|
||
for (const c of glob.slice(j, i)){
|
||
segment += regExpEscapeChars.includes(c) ? `\\${c}` : c;
|
||
endsWithSep = false;
|
||
}
|
||
}
|
||
regExpString += segment;
|
||
if (!endsWithSep) {
|
||
regExpString += i < glob.length ? sep : sepMaybe;
|
||
endsWithSep = true;
|
||
}
|
||
while(seps.includes(glob[i]))i++;
|
||
if (!(i > j)) {
|
||
throw new Error("Assertion failure: i > j (potential infinite loop)");
|
||
}
|
||
j = i;
|
||
}
|
||
regExpString = `^${regExpString}$`;
|
||
return new RegExp(regExpString);
|
||
}
|
||
function isGlob(str) {
|
||
const chars = {
|
||
"{": "}",
|
||
"(": ")",
|
||
"[": "]"
|
||
};
|
||
const regex = /\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/;
|
||
if (str === "") {
|
||
return false;
|
||
}
|
||
let match;
|
||
while(match = regex.exec(str)){
|
||
if (match[2]) return true;
|
||
let idx = match.index + match[0].length;
|
||
const open = match[1];
|
||
const close = open ? chars[open] : null;
|
||
if (open && close) {
|
||
const n = str.indexOf(close, idx);
|
||
if (n !== -1) {
|
||
idx = n + 1;
|
||
}
|
||
}
|
||
str = str.slice(idx);
|
||
}
|
||
return false;
|
||
}
|
||
function normalizeGlob(glob, { globstar =false } = {}) {
|
||
if (glob.match(/\0/g)) {
|
||
throw new Error(`Glob contains invalid characters: "${glob}"`);
|
||
}
|
||
if (!globstar) {
|
||
return normalize2(glob);
|
||
}
|
||
const s = SEP_PATTERN.source;
|
||
const badParentPattern = new RegExp(`(?<=(${s}|^)\\*\\*${s})\\.\\.(?=${s}|$)`, "g");
|
||
return normalize2(glob.replace(badParentPattern, "\0")).replace(/\0/g, "..");
|
||
}
|
||
function joinGlobs(globs, { extended =false , globstar =false } = {}) {
|
||
if (!globstar || globs.length == 0) {
|
||
return join2(...globs);
|
||
}
|
||
if (globs.length === 0) return ".";
|
||
let joined;
|
||
for (const glob of globs){
|
||
const path = glob;
|
||
if (path.length > 0) {
|
||
if (!joined) joined = path;
|
||
else joined += `${SEP}${path}`;
|
||
}
|
||
}
|
||
if (!joined) return ".";
|
||
return normalizeGlob(joined, {
|
||
extended,
|
||
globstar
|
||
});
|
||
}
|
||
const mod3 = {
|
||
SEP: SEP,
|
||
SEP_PATTERN: SEP_PATTERN,
|
||
win32: win32,
|
||
posix: posix,
|
||
basename: basename2,
|
||
delimiter: delimiter2,
|
||
dirname: dirname2,
|
||
extname: extname2,
|
||
format: format2,
|
||
fromFileUrl: fromFileUrl2,
|
||
isAbsolute: isAbsolute2,
|
||
join: join2,
|
||
normalize: normalize2,
|
||
parse: parse3,
|
||
relative: relative2,
|
||
resolve: resolve2,
|
||
sep: sep2,
|
||
toFileUrl: toFileUrl2,
|
||
toNamespacedPath: toNamespacedPath2,
|
||
common,
|
||
globToRegExp,
|
||
isGlob,
|
||
normalizeGlob,
|
||
joinGlobs
|
||
};
|
||
var LogLevels;
|
||
(function(LogLevels) {
|
||
LogLevels[LogLevels["NOTSET"] = 0] = "NOTSET";
|
||
LogLevels[LogLevels["DEBUG"] = 10] = "DEBUG";
|
||
LogLevels[LogLevels["INFO"] = 20] = "INFO";
|
||
LogLevels[LogLevels["WARNING"] = 30] = "WARNING";
|
||
LogLevels[LogLevels["ERROR"] = 40] = "ERROR";
|
||
LogLevels[LogLevels["CRITICAL"] = 50] = "CRITICAL";
|
||
})(LogLevels || (LogLevels = {}));
|
||
Object.keys(LogLevels).filter((key)=>isNaN(Number(key)));
|
||
const byLevel = {
|
||
[String(LogLevels.NOTSET)]: "NOTSET",
|
||
[String(LogLevels.DEBUG)]: "DEBUG",
|
||
[String(LogLevels.INFO)]: "INFO",
|
||
[String(LogLevels.WARNING)]: "WARNING",
|
||
[String(LogLevels.ERROR)]: "ERROR",
|
||
[String(LogLevels.CRITICAL)]: "CRITICAL"
|
||
};
|
||
function getLevelByName(name) {
|
||
switch(name){
|
||
case "NOTSET":
|
||
return LogLevels.NOTSET;
|
||
case "DEBUG":
|
||
return LogLevels.DEBUG;
|
||
case "INFO":
|
||
return LogLevels.INFO;
|
||
case "WARNING":
|
||
return LogLevels.WARNING;
|
||
case "ERROR":
|
||
return LogLevels.ERROR;
|
||
case "CRITICAL":
|
||
return LogLevels.CRITICAL;
|
||
default:
|
||
throw new Error(`no log level found for "${name}"`);
|
||
}
|
||
}
|
||
function getLevelName(level) {
|
||
const levelName = byLevel[level];
|
||
if (levelName) {
|
||
return levelName;
|
||
}
|
||
throw new Error(`no level name found for level: ${level}`);
|
||
}
|
||
class LogRecord {
|
||
#args;
|
||
#datetime;
|
||
constructor(options){
|
||
this.msg = options.msg;
|
||
this.#args = [
|
||
...options.args
|
||
];
|
||
this.level = options.level;
|
||
this.loggerName = options.loggerName;
|
||
this.#datetime = new Date();
|
||
this.levelName = getLevelName(options.level);
|
||
}
|
||
get args() {
|
||
return [
|
||
...this.#args
|
||
];
|
||
}
|
||
get datetime() {
|
||
return new Date(this.#datetime.getTime());
|
||
}
|
||
}
|
||
class Logger {
|
||
#level;
|
||
#handlers;
|
||
#loggerName;
|
||
constructor(loggerName, levelName, options = {}){
|
||
this.#loggerName = loggerName;
|
||
this.#level = getLevelByName(levelName);
|
||
this.#handlers = options.handlers || [];
|
||
}
|
||
get level() {
|
||
return this.#level;
|
||
}
|
||
set level(level) {
|
||
this.#level = level;
|
||
}
|
||
get levelName() {
|
||
return getLevelName(this.#level);
|
||
}
|
||
set levelName(levelName) {
|
||
this.#level = getLevelByName(levelName);
|
||
}
|
||
get loggerName() {
|
||
return this.#loggerName;
|
||
}
|
||
set handlers(hndls) {
|
||
this.#handlers = hndls;
|
||
}
|
||
get handlers() {
|
||
return this.#handlers;
|
||
}
|
||
_log(level, msg, ...args) {
|
||
if (this.level > level) {
|
||
return msg instanceof Function ? undefined : msg;
|
||
}
|
||
let fnResult;
|
||
let logMessage;
|
||
if (msg instanceof Function) {
|
||
fnResult = msg();
|
||
logMessage = this.asString(fnResult);
|
||
} else {
|
||
logMessage = this.asString(msg);
|
||
}
|
||
const record = new LogRecord({
|
||
msg: logMessage,
|
||
args: args,
|
||
level: level,
|
||
loggerName: this.loggerName
|
||
});
|
||
this.#handlers.forEach((handler)=>{
|
||
handler.handle(record);
|
||
});
|
||
return msg instanceof Function ? fnResult : msg;
|
||
}
|
||
asString(data) {
|
||
if (typeof data === "string") {
|
||
return data;
|
||
} else if (data === null || typeof data === "number" || typeof data === "bigint" || typeof data === "boolean" || typeof data === "undefined" || typeof data === "symbol") {
|
||
return String(data);
|
||
} else if (typeof data === "object") {
|
||
return JSON.stringify(data);
|
||
}
|
||
return "undefined";
|
||
}
|
||
debug(msg, ...args) {
|
||
return this._log(LogLevels.DEBUG, msg, ...args);
|
||
}
|
||
info(msg, ...args) {
|
||
return this._log(LogLevels.INFO, msg, ...args);
|
||
}
|
||
warning(msg, ...args) {
|
||
return this._log(LogLevels.WARNING, msg, ...args);
|
||
}
|
||
error(msg, ...args) {
|
||
return this._log(LogLevels.ERROR, msg, ...args);
|
||
}
|
||
critical(msg, ...args) {
|
||
return this._log(LogLevels.CRITICAL, msg, ...args);
|
||
}
|
||
}
|
||
const noColor = globalThis.Deno?.noColor ?? true;
|
||
let enabled = !noColor;
|
||
function code(open, close) {
|
||
return {
|
||
open: `\x1b[${open.join(";")}m`,
|
||
close: `\x1b[${close}m`,
|
||
regexp: new RegExp(`\\x1b\\[${close}m`, "g")
|
||
};
|
||
}
|
||
function run(str, code) {
|
||
return enabled ? `${code.open}${str.replace(code.regexp, code.open)}${code.close}` : str;
|
||
}
|
||
function bold(str) {
|
||
return run(str, code([
|
||
1
|
||
], 22));
|
||
}
|
||
function red(str) {
|
||
return run(str, code([
|
||
31
|
||
], 39));
|
||
}
|
||
function yellow(str) {
|
||
return run(str, code([
|
||
33
|
||
], 39));
|
||
}
|
||
function blue(str) {
|
||
return run(str, code([
|
||
34
|
||
], 39));
|
||
}
|
||
new RegExp([
|
||
"[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)",
|
||
"(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))",
|
||
].join("|"), "g");
|
||
async function exists(filePath) {
|
||
try {
|
||
await Deno.lstat(filePath);
|
||
return true;
|
||
} catch (err) {
|
||
if (err instanceof Deno.errors.NotFound) {
|
||
return false;
|
||
}
|
||
throw err;
|
||
}
|
||
}
|
||
function existsSync(filePath) {
|
||
try {
|
||
Deno.lstatSync(filePath);
|
||
return true;
|
||
} catch (err) {
|
||
if (err instanceof Deno.errors.NotFound) {
|
||
return false;
|
||
}
|
||
throw err;
|
||
}
|
||
}
|
||
function copyBytes(src, dst, off = 0) {
|
||
off = Math.max(0, Math.min(off, dst.byteLength));
|
||
const dstBytesAvailable = dst.byteLength - off;
|
||
if (src.byteLength > dstBytesAvailable) {
|
||
src = src.subarray(0, dstBytesAvailable);
|
||
}
|
||
dst.set(src, off);
|
||
return src.byteLength;
|
||
}
|
||
const DEFAULT_BUF_SIZE = 4096;
|
||
const MIN_BUF_SIZE = 16;
|
||
const MAX_CONSECUTIVE_EMPTY_READS = 100;
|
||
const CR = "\r".charCodeAt(0);
|
||
const LF = "\n".charCodeAt(0);
|
||
class BufferFullError extends Error {
|
||
constructor(partial){
|
||
super("Buffer full");
|
||
this.partial = partial;
|
||
this.name = "BufferFullError";
|
||
}
|
||
}
|
||
class PartialReadError extends Deno.errors.UnexpectedEof {
|
||
name = "PartialReadError";
|
||
constructor(){
|
||
super("Encountered UnexpectedEof, data only partially read");
|
||
}
|
||
}
|
||
class BufReader {
|
||
r = 0;
|
||
w = 0;
|
||
eof = false;
|
||
static create(r, size = DEFAULT_BUF_SIZE) {
|
||
return r instanceof BufReader ? r : new BufReader(r, size);
|
||
}
|
||
constructor(rd, size = DEFAULT_BUF_SIZE){
|
||
if (size < MIN_BUF_SIZE) {
|
||
size = MIN_BUF_SIZE;
|
||
}
|
||
this._reset(new Uint8Array(size), rd);
|
||
}
|
||
size() {
|
||
return this.buf.byteLength;
|
||
}
|
||
buffered() {
|
||
return this.w - this.r;
|
||
}
|
||
async _fill() {
|
||
if (this.r > 0) {
|
||
this.buf.copyWithin(0, this.r, this.w);
|
||
this.w -= this.r;
|
||
this.r = 0;
|
||
}
|
||
if (this.w >= this.buf.byteLength) {
|
||
throw Error("bufio: tried to fill full buffer");
|
||
}
|
||
for(let i = MAX_CONSECUTIVE_EMPTY_READS; i > 0; i--){
|
||
const rr = await this.rd.read(this.buf.subarray(this.w));
|
||
if (rr === null) {
|
||
this.eof = true;
|
||
return;
|
||
}
|
||
assert(rr >= 0, "negative read");
|
||
this.w += rr;
|
||
if (rr > 0) {
|
||
return;
|
||
}
|
||
}
|
||
throw new Error(`No progress after ${MAX_CONSECUTIVE_EMPTY_READS} read() calls`);
|
||
}
|
||
reset(r) {
|
||
this._reset(this.buf, r);
|
||
}
|
||
_reset(buf, rd) {
|
||
this.buf = buf;
|
||
this.rd = rd;
|
||
this.eof = false;
|
||
}
|
||
async read(p) {
|
||
let rr = p.byteLength;
|
||
if (p.byteLength === 0) return rr;
|
||
if (this.r === this.w) {
|
||
if (p.byteLength >= this.buf.byteLength) {
|
||
const rr1 = await this.rd.read(p);
|
||
const nread = rr1 ?? 0;
|
||
assert(nread >= 0, "negative read");
|
||
return rr1;
|
||
}
|
||
this.r = 0;
|
||
this.w = 0;
|
||
rr = await this.rd.read(this.buf);
|
||
if (rr === 0 || rr === null) return rr;
|
||
assert(rr >= 0, "negative read");
|
||
this.w += rr;
|
||
}
|
||
const copied = copyBytes(this.buf.subarray(this.r, this.w), p, 0);
|
||
this.r += copied;
|
||
return copied;
|
||
}
|
||
async readFull(p) {
|
||
let bytesRead = 0;
|
||
while(bytesRead < p.length){
|
||
try {
|
||
const rr = await this.read(p.subarray(bytesRead));
|
||
if (rr === null) {
|
||
if (bytesRead === 0) {
|
||
return null;
|
||
} else {
|
||
throw new PartialReadError();
|
||
}
|
||
}
|
||
bytesRead += rr;
|
||
} catch (err) {
|
||
err.partial = p.subarray(0, bytesRead);
|
||
throw err;
|
||
}
|
||
}
|
||
return p;
|
||
}
|
||
async readByte() {
|
||
while(this.r === this.w){
|
||
if (this.eof) return null;
|
||
await this._fill();
|
||
}
|
||
const c = this.buf[this.r];
|
||
this.r++;
|
||
return c;
|
||
}
|
||
async readString(delim) {
|
||
if (delim.length !== 1) {
|
||
throw new Error("Delimiter should be a single character");
|
||
}
|
||
const buffer = await this.readSlice(delim.charCodeAt(0));
|
||
if (buffer === null) return null;
|
||
return new TextDecoder().decode(buffer);
|
||
}
|
||
async readLine() {
|
||
let line;
|
||
try {
|
||
line = await this.readSlice(LF);
|
||
} catch (err) {
|
||
let { partial } = err;
|
||
assert(partial instanceof Uint8Array, "bufio: caught error from `readSlice()` without `partial` property");
|
||
if (!(err instanceof BufferFullError)) {
|
||
throw err;
|
||
}
|
||
if (!this.eof && partial.byteLength > 0 && partial[partial.byteLength - 1] === CR) {
|
||
assert(this.r > 0, "bufio: tried to rewind past start of buffer");
|
||
this.r--;
|
||
partial = partial.subarray(0, partial.byteLength - 1);
|
||
}
|
||
return {
|
||
line: partial,
|
||
more: !this.eof
|
||
};
|
||
}
|
||
if (line === null) {
|
||
return null;
|
||
}
|
||
if (line.byteLength === 0) {
|
||
return {
|
||
line,
|
||
more: false
|
||
};
|
||
}
|
||
if (line[line.byteLength - 1] == LF) {
|
||
let drop = 1;
|
||
if (line.byteLength > 1 && line[line.byteLength - 2] === CR) {
|
||
drop = 2;
|
||
}
|
||
line = line.subarray(0, line.byteLength - drop);
|
||
}
|
||
return {
|
||
line,
|
||
more: false
|
||
};
|
||
}
|
||
async readSlice(delim) {
|
||
let s = 0;
|
||
let slice;
|
||
while(true){
|
||
let i = this.buf.subarray(this.r + s, this.w).indexOf(delim);
|
||
if (i >= 0) {
|
||
i += s;
|
||
slice = this.buf.subarray(this.r, this.r + i + 1);
|
||
this.r += i + 1;
|
||
break;
|
||
}
|
||
if (this.eof) {
|
||
if (this.r === this.w) {
|
||
return null;
|
||
}
|
||
slice = this.buf.subarray(this.r, this.w);
|
||
this.r = this.w;
|
||
break;
|
||
}
|
||
if (this.buffered() >= this.buf.byteLength) {
|
||
this.r = this.w;
|
||
const oldbuf = this.buf;
|
||
const newbuf = this.buf.slice(0);
|
||
this.buf = newbuf;
|
||
throw new BufferFullError(oldbuf);
|
||
}
|
||
s = this.w - this.r;
|
||
try {
|
||
await this._fill();
|
||
} catch (err) {
|
||
err.partial = slice;
|
||
throw err;
|
||
}
|
||
}
|
||
return slice;
|
||
}
|
||
async peek(n) {
|
||
if (n < 0) {
|
||
throw Error("negative count");
|
||
}
|
||
let avail = this.w - this.r;
|
||
while(avail < n && avail < this.buf.byteLength && !this.eof){
|
||
try {
|
||
await this._fill();
|
||
} catch (err) {
|
||
err.partial = this.buf.subarray(this.r, this.w);
|
||
throw err;
|
||
}
|
||
avail = this.w - this.r;
|
||
}
|
||
if (avail === 0 && this.eof) {
|
||
return null;
|
||
} else if (avail < n && this.eof) {
|
||
return this.buf.subarray(this.r, this.r + avail);
|
||
} else if (avail < n) {
|
||
throw new BufferFullError(this.buf.subarray(this.r, this.w));
|
||
}
|
||
return this.buf.subarray(this.r, this.r + n);
|
||
}
|
||
}
|
||
class AbstractBufBase {
|
||
usedBufferBytes = 0;
|
||
err = null;
|
||
size() {
|
||
return this.buf.byteLength;
|
||
}
|
||
available() {
|
||
return this.buf.byteLength - this.usedBufferBytes;
|
||
}
|
||
buffered() {
|
||
return this.usedBufferBytes;
|
||
}
|
||
}
|
||
class BufWriter extends AbstractBufBase {
|
||
static create(writer, size = DEFAULT_BUF_SIZE) {
|
||
return writer instanceof BufWriter ? writer : new BufWriter(writer, size);
|
||
}
|
||
constructor(writer, size = DEFAULT_BUF_SIZE){
|
||
super();
|
||
this.writer = writer;
|
||
if (size <= 0) {
|
||
size = DEFAULT_BUF_SIZE;
|
||
}
|
||
this.buf = new Uint8Array(size);
|
||
}
|
||
reset(w) {
|
||
this.err = null;
|
||
this.usedBufferBytes = 0;
|
||
this.writer = w;
|
||
}
|
||
async flush() {
|
||
if (this.err !== null) throw this.err;
|
||
if (this.usedBufferBytes === 0) return;
|
||
try {
|
||
await Deno.writeAll(this.writer, this.buf.subarray(0, this.usedBufferBytes));
|
||
} catch (e) {
|
||
this.err = e;
|
||
throw e;
|
||
}
|
||
this.buf = new Uint8Array(this.buf.length);
|
||
this.usedBufferBytes = 0;
|
||
}
|
||
async write(data) {
|
||
if (this.err !== null) throw this.err;
|
||
if (data.length === 0) return 0;
|
||
let totalBytesWritten = 0;
|
||
let numBytesWritten = 0;
|
||
while(data.byteLength > this.available()){
|
||
if (this.buffered() === 0) {
|
||
try {
|
||
numBytesWritten = await this.writer.write(data);
|
||
} catch (e) {
|
||
this.err = e;
|
||
throw e;
|
||
}
|
||
} else {
|
||
numBytesWritten = copyBytes(data, this.buf, this.usedBufferBytes);
|
||
this.usedBufferBytes += numBytesWritten;
|
||
await this.flush();
|
||
}
|
||
totalBytesWritten += numBytesWritten;
|
||
data = data.subarray(numBytesWritten);
|
||
}
|
||
numBytesWritten = copyBytes(data, this.buf, this.usedBufferBytes);
|
||
this.usedBufferBytes += numBytesWritten;
|
||
totalBytesWritten += numBytesWritten;
|
||
return totalBytesWritten;
|
||
}
|
||
}
|
||
class BufWriterSync extends AbstractBufBase {
|
||
static create(writer, size = DEFAULT_BUF_SIZE) {
|
||
return writer instanceof BufWriterSync ? writer : new BufWriterSync(writer, size);
|
||
}
|
||
constructor(writer, size = DEFAULT_BUF_SIZE){
|
||
super();
|
||
this.writer = writer;
|
||
if (size <= 0) {
|
||
size = DEFAULT_BUF_SIZE;
|
||
}
|
||
this.buf = new Uint8Array(size);
|
||
}
|
||
reset(w) {
|
||
this.err = null;
|
||
this.usedBufferBytes = 0;
|
||
this.writer = w;
|
||
}
|
||
flush() {
|
||
if (this.err !== null) throw this.err;
|
||
if (this.usedBufferBytes === 0) return;
|
||
try {
|
||
Deno.writeAllSync(this.writer, this.buf.subarray(0, this.usedBufferBytes));
|
||
} catch (e) {
|
||
this.err = e;
|
||
throw e;
|
||
}
|
||
this.buf = new Uint8Array(this.buf.length);
|
||
this.usedBufferBytes = 0;
|
||
}
|
||
writeSync(data) {
|
||
if (this.err !== null) throw this.err;
|
||
if (data.length === 0) return 0;
|
||
let totalBytesWritten = 0;
|
||
let numBytesWritten = 0;
|
||
while(data.byteLength > this.available()){
|
||
if (this.buffered() === 0) {
|
||
try {
|
||
numBytesWritten = this.writer.writeSync(data);
|
||
} catch (e) {
|
||
this.err = e;
|
||
throw e;
|
||
}
|
||
} else {
|
||
numBytesWritten = copyBytes(data, this.buf, this.usedBufferBytes);
|
||
this.usedBufferBytes += numBytesWritten;
|
||
this.flush();
|
||
}
|
||
totalBytesWritten += numBytesWritten;
|
||
data = data.subarray(numBytesWritten);
|
||
}
|
||
numBytesWritten = copyBytes(data, this.buf, this.usedBufferBytes);
|
||
this.usedBufferBytes += numBytesWritten;
|
||
totalBytesWritten += numBytesWritten;
|
||
return totalBytesWritten;
|
||
}
|
||
}
|
||
const DEFAULT_FORMATTER = "{levelName} {msg}";
|
||
class BaseHandler {
|
||
constructor(levelName, options = {}){
|
||
this.level = getLevelByName(levelName);
|
||
this.levelName = levelName;
|
||
this.formatter = options.formatter || DEFAULT_FORMATTER;
|
||
}
|
||
handle(logRecord) {
|
||
if (this.level > logRecord.level) return;
|
||
const msg = this.format(logRecord);
|
||
return this.log(msg);
|
||
}
|
||
format(logRecord) {
|
||
if (this.formatter instanceof Function) {
|
||
return this.formatter(logRecord);
|
||
}
|
||
return this.formatter.replace(/{(\S+)}/g, (match, p1)=>{
|
||
const value = logRecord[p1];
|
||
if (value == null) {
|
||
return match;
|
||
}
|
||
return String(value);
|
||
});
|
||
}
|
||
log(_msg) {}
|
||
async setup() {}
|
||
async destroy() {}
|
||
}
|
||
class ConsoleHandler extends BaseHandler {
|
||
format(logRecord) {
|
||
let msg = super.format(logRecord);
|
||
switch(logRecord.level){
|
||
case LogLevels.INFO:
|
||
msg = blue(msg);
|
||
break;
|
||
case LogLevels.WARNING:
|
||
msg = yellow(msg);
|
||
break;
|
||
case LogLevels.ERROR:
|
||
msg = red(msg);
|
||
break;
|
||
case LogLevels.CRITICAL:
|
||
msg = bold(red(msg));
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
return msg;
|
||
}
|
||
log(msg) {
|
||
console.log(msg);
|
||
}
|
||
}
|
||
class WriterHandler extends BaseHandler {
|
||
#encoder = new TextEncoder();
|
||
}
|
||
class FileHandler extends WriterHandler {
|
||
_encoder = new TextEncoder();
|
||
#unloadCallback = ()=>this.destroy();
|
||
constructor(levelName, options){
|
||
super(levelName, options);
|
||
this._filename = options.filename;
|
||
this._mode = options.mode ? options.mode : "a";
|
||
this._openOptions = {
|
||
createNew: this._mode === "x",
|
||
create: this._mode !== "x",
|
||
append: this._mode === "a",
|
||
truncate: this._mode !== "a",
|
||
write: true
|
||
};
|
||
}
|
||
async setup() {
|
||
this._file = await Deno.open(this._filename, this._openOptions);
|
||
this._writer = this._file;
|
||
this._buf = new BufWriterSync(this._file);
|
||
addEventListener("unload", this.#unloadCallback);
|
||
}
|
||
handle(logRecord) {
|
||
super.handle(logRecord);
|
||
if (logRecord.level > LogLevels.ERROR) {
|
||
this.flush();
|
||
}
|
||
}
|
||
log(msg) {
|
||
this._buf.writeSync(this._encoder.encode(msg + "\n"));
|
||
}
|
||
flush() {
|
||
if (this._buf?.buffered() > 0) {
|
||
this._buf.flush();
|
||
}
|
||
}
|
||
destroy() {
|
||
this.flush();
|
||
this._file?.close();
|
||
this._file = undefined;
|
||
removeEventListener("unload", this.#unloadCallback);
|
||
return Promise.resolve();
|
||
}
|
||
}
|
||
class RotatingFileHandler extends FileHandler {
|
||
#maxBytes;
|
||
#maxBackupCount;
|
||
#currentFileSize = 0;
|
||
constructor(levelName, options){
|
||
super(levelName, options);
|
||
this.#maxBytes = options.maxBytes;
|
||
this.#maxBackupCount = options.maxBackupCount;
|
||
}
|
||
async setup() {
|
||
if (this.#maxBytes < 1) {
|
||
this.destroy();
|
||
throw new Error("maxBytes cannot be less than 1");
|
||
}
|
||
if (this.#maxBackupCount < 1) {
|
||
this.destroy();
|
||
throw new Error("maxBackupCount cannot be less than 1");
|
||
}
|
||
await super.setup();
|
||
if (this._mode === "w") {
|
||
for(let i = 1; i <= this.#maxBackupCount; i++){
|
||
if (await exists(this._filename + "." + i)) {
|
||
await Deno.remove(this._filename + "." + i);
|
||
}
|
||
}
|
||
} else if (this._mode === "x") {
|
||
for(let i1 = 1; i1 <= this.#maxBackupCount; i1++){
|
||
if (await exists(this._filename + "." + i1)) {
|
||
this.destroy();
|
||
throw new Deno.errors.AlreadyExists("Backup log file " + this._filename + "." + i1 + " already exists");
|
||
}
|
||
}
|
||
} else {
|
||
this.#currentFileSize = (await Deno.stat(this._filename)).size;
|
||
}
|
||
}
|
||
log(msg) {
|
||
const msgByteLength = this._encoder.encode(msg).byteLength + 1;
|
||
if (this.#currentFileSize + msgByteLength > this.#maxBytes) {
|
||
this.rotateLogFiles();
|
||
this.#currentFileSize = 0;
|
||
}
|
||
this._buf.writeSync(this._encoder.encode(msg + "\n"));
|
||
this.#currentFileSize += msgByteLength;
|
||
}
|
||
rotateLogFiles() {
|
||
this._buf.flush();
|
||
Deno.close(this._file.rid);
|
||
for(let i = this.#maxBackupCount - 1; i >= 0; i--){
|
||
const source = this._filename + (i === 0 ? "" : "." + i);
|
||
const dest = this._filename + "." + (i + 1);
|
||
if (existsSync(source)) {
|
||
Deno.renameSync(source, dest);
|
||
}
|
||
}
|
||
this._file = Deno.openSync(this._filename, this._openOptions);
|
||
this._writer = this._file;
|
||
this._buf = new BufWriterSync(this._file);
|
||
}
|
||
}
|
||
class LoggerConfig {
|
||
}
|
||
const DEFAULT_LEVEL = "INFO";
|
||
const DEFAULT_CONFIG = {
|
||
handlers: {
|
||
default: new ConsoleHandler(DEFAULT_LEVEL)
|
||
},
|
||
loggers: {
|
||
default: {
|
||
level: DEFAULT_LEVEL,
|
||
handlers: [
|
||
"default"
|
||
]
|
||
}
|
||
}
|
||
};
|
||
const state = {
|
||
handlers: new Map(),
|
||
loggers: new Map(),
|
||
config: DEFAULT_CONFIG
|
||
};
|
||
const handlers = {
|
||
BaseHandler,
|
||
ConsoleHandler,
|
||
WriterHandler,
|
||
FileHandler,
|
||
RotatingFileHandler
|
||
};
|
||
function getLogger(name) {
|
||
if (!name) {
|
||
const d = state.loggers.get("default");
|
||
assert(d != null, `"default" logger must be set for getting logger without name`);
|
||
return d;
|
||
}
|
||
const result = state.loggers.get(name);
|
||
if (!result) {
|
||
const logger = new Logger(name, "NOTSET", {
|
||
handlers: []
|
||
});
|
||
state.loggers.set(name, logger);
|
||
return logger;
|
||
}
|
||
return result;
|
||
}
|
||
function debug(msg, ...args) {
|
||
if (msg instanceof Function) {
|
||
return getLogger("default").debug(msg, ...args);
|
||
}
|
||
return getLogger("default").debug(msg, ...args);
|
||
}
|
||
function info(msg, ...args) {
|
||
if (msg instanceof Function) {
|
||
return getLogger("default").info(msg, ...args);
|
||
}
|
||
return getLogger("default").info(msg, ...args);
|
||
}
|
||
function warning(msg, ...args) {
|
||
if (msg instanceof Function) {
|
||
return getLogger("default").warning(msg, ...args);
|
||
}
|
||
return getLogger("default").warning(msg, ...args);
|
||
}
|
||
function error(msg, ...args) {
|
||
if (msg instanceof Function) {
|
||
return getLogger("default").error(msg, ...args);
|
||
}
|
||
return getLogger("default").error(msg, ...args);
|
||
}
|
||
function critical(msg, ...args) {
|
||
if (msg instanceof Function) {
|
||
return getLogger("default").critical(msg, ...args);
|
||
}
|
||
return getLogger("default").critical(msg, ...args);
|
||
}
|
||
async function setup(config) {
|
||
state.config = {
|
||
handlers: {
|
||
...DEFAULT_CONFIG.handlers,
|
||
...config.handlers
|
||
},
|
||
loggers: {
|
||
...DEFAULT_CONFIG.loggers,
|
||
...config.loggers
|
||
}
|
||
};
|
||
state.handlers.forEach((handler)=>{
|
||
handler.destroy();
|
||
});
|
||
state.handlers.clear();
|
||
const handlers = state.config.handlers || {};
|
||
for(const handlerName in handlers){
|
||
const handler = handlers[handlerName];
|
||
await handler.setup();
|
||
state.handlers.set(handlerName, handler);
|
||
}
|
||
state.loggers.clear();
|
||
const loggers = state.config.loggers || {};
|
||
for(const loggerName in loggers){
|
||
const loggerConfig = loggers[loggerName];
|
||
const handlerNames = loggerConfig.handlers || [];
|
||
const handlers1 = [];
|
||
handlerNames.forEach((handlerName)=>{
|
||
const handler = state.handlers.get(handlerName);
|
||
if (handler) {
|
||
handlers1.push(handler);
|
||
}
|
||
});
|
||
const levelName = loggerConfig.level || DEFAULT_LEVEL;
|
||
const logger = new Logger(loggerName, levelName, {
|
||
handlers: handlers1
|
||
});
|
||
state.loggers.set(loggerName, logger);
|
||
}
|
||
}
|
||
await setup(DEFAULT_CONFIG);
|
||
const mod4 = await async function() {
|
||
return {
|
||
LogLevels: LogLevels,
|
||
Logger: Logger,
|
||
LoggerConfig: LoggerConfig,
|
||
handlers: handlers,
|
||
getLogger: getLogger,
|
||
debug: debug,
|
||
info: info,
|
||
warning: warning,
|
||
error: error,
|
||
critical: critical,
|
||
setup: setup
|
||
};
|
||
}();
|
||
async function emptyDir(dir) {
|
||
try {
|
||
const items = [];
|
||
for await (const dirEntry of Deno.readDir(dir)){
|
||
items.push(dirEntry);
|
||
}
|
||
while(items.length){
|
||
const item = items.shift();
|
||
if (item && item.name) {
|
||
const filepath = join2(dir, item.name);
|
||
await Deno.remove(filepath, {
|
||
recursive: true
|
||
});
|
||
}
|
||
}
|
||
} catch (err) {
|
||
if (!(err instanceof Deno.errors.NotFound)) {
|
||
throw err;
|
||
}
|
||
await Deno.mkdir(dir, {
|
||
recursive: true
|
||
});
|
||
}
|
||
}
|
||
function emptyDirSync(dir) {
|
||
try {
|
||
const items = [
|
||
...Deno.readDirSync(dir)
|
||
];
|
||
while(items.length){
|
||
const item = items.shift();
|
||
if (item && item.name) {
|
||
const filepath = join2(dir, item.name);
|
||
Deno.removeSync(filepath, {
|
||
recursive: true
|
||
});
|
||
}
|
||
}
|
||
} catch (err) {
|
||
if (!(err instanceof Deno.errors.NotFound)) {
|
||
throw err;
|
||
}
|
||
Deno.mkdirSync(dir, {
|
||
recursive: true
|
||
});
|
||
return;
|
||
}
|
||
}
|
||
function isSubdir(src, dest, sep = sep2) {
|
||
if (src === dest) {
|
||
return false;
|
||
}
|
||
const srcArray = src.split(sep);
|
||
const destArray = dest.split(sep);
|
||
return srcArray.every((current, i)=>destArray[i] === current);
|
||
}
|
||
function getFileInfoType(fileInfo) {
|
||
return fileInfo.isFile ? "file" : fileInfo.isDirectory ? "dir" : fileInfo.isSymlink ? "symlink" : undefined;
|
||
}
|
||
async function ensureDir(dir) {
|
||
try {
|
||
const fileInfo = await Deno.lstat(dir);
|
||
if (!fileInfo.isDirectory) {
|
||
throw new Error(`Ensure path exists, expected 'dir', got '${getFileInfoType(fileInfo)}'`);
|
||
}
|
||
} catch (err) {
|
||
if (err instanceof Deno.errors.NotFound) {
|
||
await Deno.mkdir(dir, {
|
||
recursive: true
|
||
});
|
||
return;
|
||
}
|
||
throw err;
|
||
}
|
||
}
|
||
function ensureDirSync(dir) {
|
||
try {
|
||
const fileInfo = Deno.lstatSync(dir);
|
||
if (!fileInfo.isDirectory) {
|
||
throw new Error(`Ensure path exists, expected 'dir', got '${getFileInfoType(fileInfo)}'`);
|
||
}
|
||
} catch (err) {
|
||
if (err instanceof Deno.errors.NotFound) {
|
||
Deno.mkdirSync(dir, {
|
||
recursive: true
|
||
});
|
||
return;
|
||
}
|
||
throw err;
|
||
}
|
||
}
|
||
async function ensureFile(filePath) {
|
||
try {
|
||
const stat = await Deno.lstat(filePath);
|
||
if (!stat.isFile) {
|
||
throw new Error(`Ensure path exists, expected 'file', got '${getFileInfoType(stat)}'`);
|
||
}
|
||
} catch (err) {
|
||
if (err instanceof Deno.errors.NotFound) {
|
||
await ensureDir(dirname2(filePath));
|
||
await Deno.writeFile(filePath, new Uint8Array());
|
||
return;
|
||
}
|
||
throw err;
|
||
}
|
||
}
|
||
function ensureFileSync(filePath) {
|
||
try {
|
||
const stat = Deno.lstatSync(filePath);
|
||
if (!stat.isFile) {
|
||
throw new Error(`Ensure path exists, expected 'file', got '${getFileInfoType(stat)}'`);
|
||
}
|
||
} catch (err) {
|
||
if (err instanceof Deno.errors.NotFound) {
|
||
ensureDirSync(dirname2(filePath));
|
||
Deno.writeFileSync(filePath, new Uint8Array());
|
||
return;
|
||
}
|
||
throw err;
|
||
}
|
||
}
|
||
async function ensureLink(src, dest) {
|
||
if (await exists(dest)) {
|
||
const destStatInfo = await Deno.lstat(dest);
|
||
const destFilePathType = getFileInfoType(destStatInfo);
|
||
if (destFilePathType !== "file") {
|
||
throw new Error(`Ensure path exists, expected 'file', got '${destFilePathType}'`);
|
||
}
|
||
return;
|
||
}
|
||
await ensureDir(dirname2(dest));
|
||
await Deno.link(src, dest);
|
||
}
|
||
function ensureLinkSync(src, dest) {
|
||
if (existsSync(dest)) {
|
||
const destStatInfo = Deno.lstatSync(dest);
|
||
const destFilePathType = getFileInfoType(destStatInfo);
|
||
if (destFilePathType !== "file") {
|
||
throw new Error(`Ensure path exists, expected 'file', got '${destFilePathType}'`);
|
||
}
|
||
return;
|
||
}
|
||
ensureDirSync(dirname2(dest));
|
||
Deno.linkSync(src, dest);
|
||
}
|
||
async function ensureSymlink(src, dest) {
|
||
const srcStatInfo = await Deno.lstat(src);
|
||
const srcFilePathType = getFileInfoType(srcStatInfo);
|
||
if (await exists(dest)) {
|
||
const destStatInfo = await Deno.lstat(dest);
|
||
const destFilePathType = getFileInfoType(destStatInfo);
|
||
if (destFilePathType !== "symlink") {
|
||
throw new Error(`Ensure path exists, expected 'symlink', got '${destFilePathType}'`);
|
||
}
|
||
return;
|
||
}
|
||
await ensureDir(dirname2(dest));
|
||
if (Deno.build.os === "windows") {
|
||
await Deno.symlink(src, dest, {
|
||
type: srcFilePathType === "dir" ? "dir" : "file"
|
||
});
|
||
} else {
|
||
await Deno.symlink(src, dest);
|
||
}
|
||
}
|
||
function ensureSymlinkSync(src, dest) {
|
||
const srcStatInfo = Deno.lstatSync(src);
|
||
const srcFilePathType = getFileInfoType(srcStatInfo);
|
||
if (existsSync(dest)) {
|
||
const destStatInfo = Deno.lstatSync(dest);
|
||
const destFilePathType = getFileInfoType(destStatInfo);
|
||
if (destFilePathType !== "symlink") {
|
||
throw new Error(`Ensure path exists, expected 'symlink', got '${destFilePathType}'`);
|
||
}
|
||
return;
|
||
}
|
||
ensureDirSync(dirname2(dest));
|
||
if (Deno.build.os === "windows") {
|
||
Deno.symlinkSync(src, dest, {
|
||
type: srcFilePathType === "dir" ? "dir" : "file"
|
||
});
|
||
} else {
|
||
Deno.symlinkSync(src, dest);
|
||
}
|
||
}
|
||
function _createWalkEntrySync(path) {
|
||
path = normalize2(path);
|
||
const name = basename2(path);
|
||
const info = Deno.statSync(path);
|
||
return {
|
||
path,
|
||
name,
|
||
isFile: info.isFile,
|
||
isDirectory: info.isDirectory,
|
||
isSymlink: info.isSymlink
|
||
};
|
||
}
|
||
async function _createWalkEntry(path) {
|
||
path = normalize2(path);
|
||
const name = basename2(path);
|
||
const info = await Deno.stat(path);
|
||
return {
|
||
path,
|
||
name,
|
||
isFile: info.isFile,
|
||
isDirectory: info.isDirectory,
|
||
isSymlink: info.isSymlink
|
||
};
|
||
}
|
||
function include(path, exts, match, skip) {
|
||
if (exts && !exts.some((ext)=>path.endsWith(ext))) {
|
||
return false;
|
||
}
|
||
if (match && !match.some((pattern)=>!!path.match(pattern))) {
|
||
return false;
|
||
}
|
||
if (skip && skip.some((pattern)=>!!path.match(pattern))) {
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
async function* walk(root, { maxDepth =Infinity , includeFiles =true , includeDirs =true , followSymlinks =false , exts =undefined , match =undefined , skip =undefined } = {}) {
|
||
if (maxDepth < 0) {
|
||
return;
|
||
}
|
||
if (includeDirs && include(root, exts, match, skip)) {
|
||
yield await _createWalkEntry(root);
|
||
}
|
||
if (maxDepth < 1 || !include(root, undefined, undefined, skip)) {
|
||
return;
|
||
}
|
||
for await (const entry of Deno.readDir(root)){
|
||
if (entry.isSymlink) {
|
||
if (followSymlinks) {
|
||
throw new Error("unimplemented");
|
||
} else {
|
||
continue;
|
||
}
|
||
}
|
||
assert(entry.name != null);
|
||
const path = join2(root, entry.name);
|
||
if (entry.isFile) {
|
||
if (includeFiles && include(path, exts, match, skip)) {
|
||
yield {
|
||
path,
|
||
...entry
|
||
};
|
||
}
|
||
} else {
|
||
yield* walk(path, {
|
||
maxDepth: maxDepth - 1,
|
||
includeFiles,
|
||
includeDirs,
|
||
followSymlinks,
|
||
exts,
|
||
match,
|
||
skip
|
||
});
|
||
}
|
||
}
|
||
}
|
||
function* walkSync(root, { maxDepth =Infinity , includeFiles =true , includeDirs =true , followSymlinks =false , exts =undefined , match =undefined , skip =undefined } = {}) {
|
||
if (maxDepth < 0) {
|
||
return;
|
||
}
|
||
if (includeDirs && include(root, exts, match, skip)) {
|
||
yield _createWalkEntrySync(root);
|
||
}
|
||
if (maxDepth < 1 || !include(root, undefined, undefined, skip)) {
|
||
return;
|
||
}
|
||
for (const entry of Deno.readDirSync(root)){
|
||
if (entry.isSymlink) {
|
||
if (followSymlinks) {
|
||
throw new Error("unimplemented");
|
||
} else {
|
||
continue;
|
||
}
|
||
}
|
||
assert(entry.name != null);
|
||
const path = join2(root, entry.name);
|
||
if (entry.isFile) {
|
||
if (includeFiles && include(path, exts, match, skip)) {
|
||
yield {
|
||
path,
|
||
...entry
|
||
};
|
||
}
|
||
} else {
|
||
yield* walkSync(path, {
|
||
maxDepth: maxDepth - 1,
|
||
includeFiles,
|
||
includeDirs,
|
||
followSymlinks,
|
||
exts,
|
||
match,
|
||
skip
|
||
});
|
||
}
|
||
}
|
||
}
|
||
const isWindows1 = Deno.build.os == "windows";
|
||
function split(path) {
|
||
const s = SEP_PATTERN.source;
|
||
const segments = path.replace(new RegExp(`^${s}|${s}$`, "g"), "").split(SEP_PATTERN);
|
||
const isAbsolute_ = isAbsolute2(path);
|
||
return {
|
||
segments,
|
||
isAbsolute: isAbsolute_,
|
||
hasTrailingSep: !!path.match(new RegExp(`${s}$`)),
|
||
winRoot: isWindows1 && isAbsolute_ ? segments.shift() : undefined
|
||
};
|
||
}
|
||
function throwUnlessNotFound(error) {
|
||
if (!(error instanceof Deno.errors.NotFound)) {
|
||
throw error;
|
||
}
|
||
}
|
||
function comparePath(a, b) {
|
||
if (a.path < b.path) return -1;
|
||
if (a.path > b.path) return 1;
|
||
return 0;
|
||
}
|
||
async function* expandGlob(glob, { root =Deno.cwd() , exclude =[] , includeDirs =true , extended =false , globstar =false } = {}) {
|
||
const globOptions = {
|
||
extended,
|
||
globstar
|
||
};
|
||
const absRoot = isAbsolute2(root) ? normalize2(root) : joinGlobs([
|
||
Deno.cwd(),
|
||
root
|
||
], globOptions);
|
||
const resolveFromRoot = (path)=>isAbsolute2(path) ? normalize2(path) : joinGlobs([
|
||
absRoot,
|
||
path
|
||
], globOptions);
|
||
const excludePatterns = exclude.map(resolveFromRoot).map((s)=>globToRegExp(s, globOptions));
|
||
const shouldInclude = (path)=>!excludePatterns.some((p)=>!!path.match(p));
|
||
const { segments , hasTrailingSep , winRoot } = split(resolveFromRoot(glob));
|
||
let fixedRoot = winRoot != undefined ? winRoot : "/";
|
||
while(segments.length > 0 && !isGlob(segments[0])){
|
||
const seg = segments.shift();
|
||
assert(seg != null);
|
||
fixedRoot = joinGlobs([
|
||
fixedRoot,
|
||
seg
|
||
], globOptions);
|
||
}
|
||
let fixedRootInfo;
|
||
try {
|
||
fixedRootInfo = await _createWalkEntry(fixedRoot);
|
||
} catch (error) {
|
||
return throwUnlessNotFound(error);
|
||
}
|
||
async function* advanceMatch(walkInfo, globSegment) {
|
||
if (!walkInfo.isDirectory) {
|
||
return;
|
||
} else if (globSegment == "..") {
|
||
const parentPath = joinGlobs([
|
||
walkInfo.path,
|
||
".."
|
||
], globOptions);
|
||
try {
|
||
if (shouldInclude(parentPath)) {
|
||
return yield await _createWalkEntry(parentPath);
|
||
}
|
||
} catch (error) {
|
||
throwUnlessNotFound(error);
|
||
}
|
||
return;
|
||
} else if (globSegment == "**") {
|
||
return yield* walk(walkInfo.path, {
|
||
includeFiles: false,
|
||
skip: excludePatterns
|
||
});
|
||
}
|
||
yield* walk(walkInfo.path, {
|
||
maxDepth: 1,
|
||
match: [
|
||
globToRegExp(joinGlobs([
|
||
walkInfo.path,
|
||
globSegment
|
||
], globOptions), globOptions),
|
||
],
|
||
skip: excludePatterns
|
||
});
|
||
}
|
||
let currentMatches = [
|
||
fixedRootInfo
|
||
];
|
||
for (const segment of segments){
|
||
const nextMatchMap = new Map();
|
||
for (const currentMatch of currentMatches){
|
||
for await (const nextMatch of advanceMatch(currentMatch, segment)){
|
||
nextMatchMap.set(nextMatch.path, nextMatch);
|
||
}
|
||
}
|
||
currentMatches = [
|
||
...nextMatchMap.values()
|
||
].sort(comparePath);
|
||
}
|
||
if (hasTrailingSep) {
|
||
currentMatches = currentMatches.filter((entry)=>entry.isDirectory);
|
||
}
|
||
if (!includeDirs) {
|
||
currentMatches = currentMatches.filter((entry)=>!entry.isDirectory);
|
||
}
|
||
yield* currentMatches;
|
||
}
|
||
function* expandGlobSync(glob, { root =Deno.cwd() , exclude =[] , includeDirs =true , extended =false , globstar =false } = {}) {
|
||
const globOptions = {
|
||
extended,
|
||
globstar
|
||
};
|
||
const absRoot = isAbsolute2(root) ? normalize2(root) : joinGlobs([
|
||
Deno.cwd(),
|
||
root
|
||
], globOptions);
|
||
const resolveFromRoot = (path)=>isAbsolute2(path) ? normalize2(path) : joinGlobs([
|
||
absRoot,
|
||
path
|
||
], globOptions);
|
||
const excludePatterns = exclude.map(resolveFromRoot).map((s)=>globToRegExp(s, globOptions));
|
||
const shouldInclude = (path)=>!excludePatterns.some((p)=>!!path.match(p));
|
||
const { segments , hasTrailingSep , winRoot } = split(resolveFromRoot(glob));
|
||
let fixedRoot = winRoot != undefined ? winRoot : "/";
|
||
while(segments.length > 0 && !isGlob(segments[0])){
|
||
const seg = segments.shift();
|
||
assert(seg != null);
|
||
fixedRoot = joinGlobs([
|
||
fixedRoot,
|
||
seg
|
||
], globOptions);
|
||
}
|
||
let fixedRootInfo;
|
||
try {
|
||
fixedRootInfo = _createWalkEntrySync(fixedRoot);
|
||
} catch (error) {
|
||
return throwUnlessNotFound(error);
|
||
}
|
||
function* advanceMatch(walkInfo, globSegment) {
|
||
if (!walkInfo.isDirectory) {
|
||
return;
|
||
} else if (globSegment == "..") {
|
||
const parentPath = joinGlobs([
|
||
walkInfo.path,
|
||
".."
|
||
], globOptions);
|
||
try {
|
||
if (shouldInclude(parentPath)) {
|
||
return yield _createWalkEntrySync(parentPath);
|
||
}
|
||
} catch (error) {
|
||
throwUnlessNotFound(error);
|
||
}
|
||
return;
|
||
} else if (globSegment == "**") {
|
||
return yield* walkSync(walkInfo.path, {
|
||
includeFiles: false,
|
||
skip: excludePatterns
|
||
});
|
||
}
|
||
yield* walkSync(walkInfo.path, {
|
||
maxDepth: 1,
|
||
match: [
|
||
globToRegExp(joinGlobs([
|
||
walkInfo.path,
|
||
globSegment
|
||
], globOptions), globOptions),
|
||
],
|
||
skip: excludePatterns
|
||
});
|
||
}
|
||
let currentMatches = [
|
||
fixedRootInfo
|
||
];
|
||
for (const segment of segments){
|
||
const nextMatchMap = new Map();
|
||
for (const currentMatch of currentMatches){
|
||
for (const nextMatch of advanceMatch(currentMatch, segment)){
|
||
nextMatchMap.set(nextMatch.path, nextMatch);
|
||
}
|
||
}
|
||
currentMatches = [
|
||
...nextMatchMap.values()
|
||
].sort(comparePath);
|
||
}
|
||
if (hasTrailingSep) {
|
||
currentMatches = currentMatches.filter((entry)=>entry.isDirectory);
|
||
}
|
||
if (!includeDirs) {
|
||
currentMatches = currentMatches.filter((entry)=>!entry.isDirectory);
|
||
}
|
||
yield* currentMatches;
|
||
}
|
||
async function move(src, dest, { overwrite =false } = {}) {
|
||
const srcStat = await Deno.stat(src);
|
||
if (srcStat.isDirectory && isSubdir(src, dest)) {
|
||
throw new Error(`Cannot move '${src}' to a subdirectory of itself, '${dest}'.`);
|
||
}
|
||
if (overwrite) {
|
||
if (await exists(dest)) {
|
||
await Deno.remove(dest, {
|
||
recursive: true
|
||
});
|
||
}
|
||
await Deno.rename(src, dest);
|
||
} else {
|
||
if (await exists(dest)) {
|
||
throw new Error("dest already exists.");
|
||
}
|
||
await Deno.rename(src, dest);
|
||
}
|
||
return;
|
||
}
|
||
function moveSync(src, dest, { overwrite =false } = {}) {
|
||
const srcStat = Deno.statSync(src);
|
||
if (srcStat.isDirectory && isSubdir(src, dest)) {
|
||
throw new Error(`Cannot move '${src}' to a subdirectory of itself, '${dest}'.`);
|
||
}
|
||
if (overwrite) {
|
||
if (existsSync(dest)) {
|
||
Deno.removeSync(dest, {
|
||
recursive: true
|
||
});
|
||
}
|
||
Deno.renameSync(src, dest);
|
||
} else {
|
||
if (existsSync(dest)) {
|
||
throw new Error("dest already exists.");
|
||
}
|
||
Deno.renameSync(src, dest);
|
||
}
|
||
}
|
||
const isWindows2 = Deno.build.os === "windows";
|
||
async function ensureValidCopy(src, dest, options, isCopyFolder = false) {
|
||
let destStat;
|
||
try {
|
||
destStat = await Deno.lstat(dest);
|
||
} catch (err) {
|
||
if (err instanceof Deno.errors.NotFound) {
|
||
return;
|
||
}
|
||
throw err;
|
||
}
|
||
if (isCopyFolder && !destStat.isDirectory) {
|
||
throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`);
|
||
}
|
||
if (!options.overwrite) {
|
||
throw new Error(`'${dest}' already exists.`);
|
||
}
|
||
return destStat;
|
||
}
|
||
function ensureValidCopySync(src, dest, options, isCopyFolder = false) {
|
||
let destStat;
|
||
try {
|
||
destStat = Deno.lstatSync(dest);
|
||
} catch (err) {
|
||
if (err instanceof Deno.errors.NotFound) {
|
||
return;
|
||
}
|
||
throw err;
|
||
}
|
||
if (isCopyFolder && !destStat.isDirectory) {
|
||
throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`);
|
||
}
|
||
if (!options.overwrite) {
|
||
throw new Error(`'${dest}' already exists.`);
|
||
}
|
||
return destStat;
|
||
}
|
||
async function copyFile(src, dest, options) {
|
||
await ensureValidCopy(src, dest, options);
|
||
await Deno.copyFile(src, dest);
|
||
if (options.preserveTimestamps) {
|
||
const statInfo = await Deno.stat(src);
|
||
assert(statInfo.atime instanceof Date, `statInfo.atime is unavailable`);
|
||
assert(statInfo.mtime instanceof Date, `statInfo.mtime is unavailable`);
|
||
await Deno.utime(dest, statInfo.atime, statInfo.mtime);
|
||
}
|
||
}
|
||
function copyFileSync(src, dest, options) {
|
||
ensureValidCopySync(src, dest, options);
|
||
Deno.copyFileSync(src, dest);
|
||
if (options.preserveTimestamps) {
|
||
const statInfo = Deno.statSync(src);
|
||
assert(statInfo.atime instanceof Date, `statInfo.atime is unavailable`);
|
||
assert(statInfo.mtime instanceof Date, `statInfo.mtime is unavailable`);
|
||
Deno.utimeSync(dest, statInfo.atime, statInfo.mtime);
|
||
}
|
||
}
|
||
async function copySymLink(src, dest, options) {
|
||
await ensureValidCopy(src, dest, options);
|
||
const originSrcFilePath = await Deno.readLink(src);
|
||
const type = getFileInfoType(await Deno.lstat(src));
|
||
if (isWindows2) {
|
||
await Deno.symlink(originSrcFilePath, dest, {
|
||
type: type === "dir" ? "dir" : "file"
|
||
});
|
||
} else {
|
||
await Deno.symlink(originSrcFilePath, dest);
|
||
}
|
||
if (options.preserveTimestamps) {
|
||
const statInfo = await Deno.lstat(src);
|
||
assert(statInfo.atime instanceof Date, `statInfo.atime is unavailable`);
|
||
assert(statInfo.mtime instanceof Date, `statInfo.mtime is unavailable`);
|
||
await Deno.utime(dest, statInfo.atime, statInfo.mtime);
|
||
}
|
||
}
|
||
function copySymlinkSync(src, dest, options) {
|
||
ensureValidCopySync(src, dest, options);
|
||
const originSrcFilePath = Deno.readLinkSync(src);
|
||
const type = getFileInfoType(Deno.lstatSync(src));
|
||
if (isWindows2) {
|
||
Deno.symlinkSync(originSrcFilePath, dest, {
|
||
type: type === "dir" ? "dir" : "file"
|
||
});
|
||
} else {
|
||
Deno.symlinkSync(originSrcFilePath, dest);
|
||
}
|
||
if (options.preserveTimestamps) {
|
||
const statInfo = Deno.lstatSync(src);
|
||
assert(statInfo.atime instanceof Date, `statInfo.atime is unavailable`);
|
||
assert(statInfo.mtime instanceof Date, `statInfo.mtime is unavailable`);
|
||
Deno.utimeSync(dest, statInfo.atime, statInfo.mtime);
|
||
}
|
||
}
|
||
async function copyDir(src, dest, options) {
|
||
const destStat = await ensureValidCopy(src, dest, options, true);
|
||
if (!destStat) {
|
||
await ensureDir(dest);
|
||
}
|
||
if (options.preserveTimestamps) {
|
||
const srcStatInfo = await Deno.stat(src);
|
||
assert(srcStatInfo.atime instanceof Date, `statInfo.atime is unavailable`);
|
||
assert(srcStatInfo.mtime instanceof Date, `statInfo.mtime is unavailable`);
|
||
await Deno.utime(dest, srcStatInfo.atime, srcStatInfo.mtime);
|
||
}
|
||
for await (const entry of Deno.readDir(src)){
|
||
const srcPath = join2(src, entry.name);
|
||
const destPath = join2(dest, basename2(srcPath));
|
||
if (entry.isSymlink) {
|
||
await copySymLink(srcPath, destPath, options);
|
||
} else if (entry.isDirectory) {
|
||
await copyDir(srcPath, destPath, options);
|
||
} else if (entry.isFile) {
|
||
await copyFile(srcPath, destPath, options);
|
||
}
|
||
}
|
||
}
|
||
function copyDirSync(src, dest, options) {
|
||
const destStat = ensureValidCopySync(src, dest, options, true);
|
||
if (!destStat) {
|
||
ensureDirSync(dest);
|
||
}
|
||
if (options.preserveTimestamps) {
|
||
const srcStatInfo = Deno.statSync(src);
|
||
assert(srcStatInfo.atime instanceof Date, `statInfo.atime is unavailable`);
|
||
assert(srcStatInfo.mtime instanceof Date, `statInfo.mtime is unavailable`);
|
||
Deno.utimeSync(dest, srcStatInfo.atime, srcStatInfo.mtime);
|
||
}
|
||
for (const entry of Deno.readDirSync(src)){
|
||
assert(entry.name != null, "file.name must be set");
|
||
const srcPath = join2(src, entry.name);
|
||
const destPath = join2(dest, basename2(srcPath));
|
||
if (entry.isSymlink) {
|
||
copySymlinkSync(srcPath, destPath, options);
|
||
} else if (entry.isDirectory) {
|
||
copyDirSync(srcPath, destPath, options);
|
||
} else if (entry.isFile) {
|
||
copyFileSync(srcPath, destPath, options);
|
||
}
|
||
}
|
||
}
|
||
async function copy(src, dest, options = {}) {
|
||
src = resolve2(src);
|
||
dest = resolve2(dest);
|
||
if (src === dest) {
|
||
throw new Error("Source and destination cannot be the same.");
|
||
}
|
||
const srcStat = await Deno.lstat(src);
|
||
if (srcStat.isDirectory && isSubdir(src, dest)) {
|
||
throw new Error(`Cannot copy '${src}' to a subdirectory of itself, '${dest}'.`);
|
||
}
|
||
if (srcStat.isSymlink) {
|
||
await copySymLink(src, dest, options);
|
||
} else if (srcStat.isDirectory) {
|
||
await copyDir(src, dest, options);
|
||
} else if (srcStat.isFile) {
|
||
await copyFile(src, dest, options);
|
||
}
|
||
}
|
||
function copySync(src, dest, options = {}) {
|
||
src = resolve2(src);
|
||
dest = resolve2(dest);
|
||
if (src === dest) {
|
||
throw new Error("Source and destination cannot be the same.");
|
||
}
|
||
const srcStat = Deno.lstatSync(src);
|
||
if (srcStat.isDirectory && isSubdir(src, dest)) {
|
||
throw new Error(`Cannot copy '${src}' to a subdirectory of itself, '${dest}'.`);
|
||
}
|
||
if (srcStat.isSymlink) {
|
||
copySymlinkSync(src, dest, options);
|
||
} else if (srcStat.isDirectory) {
|
||
copyDirSync(src, dest, options);
|
||
} else if (srcStat.isFile) {
|
||
copyFileSync(src, dest, options);
|
||
}
|
||
}
|
||
var EOL;
|
||
(function(EOL) {
|
||
EOL["LF"] = "\n";
|
||
EOL["CRLF"] = "\r\n";
|
||
})(EOL || (EOL = {}));
|
||
const regDetect = /(?:\r?\n)/g;
|
||
function detect(content) {
|
||
const d = content.match(regDetect);
|
||
if (!d || d.length === 0) {
|
||
return null;
|
||
}
|
||
const crlf = d.filter((x)=>x === EOL.CRLF);
|
||
if (crlf.length > 0) {
|
||
return EOL.CRLF;
|
||
} else {
|
||
return EOL.LF;
|
||
}
|
||
}
|
||
function format3(content, eol) {
|
||
return content.replace(regDetect, eol);
|
||
}
|
||
const mod5 = {
|
||
exists,
|
||
existsSync,
|
||
emptyDir,
|
||
emptyDirSync,
|
||
ensureDir,
|
||
ensureDirSync,
|
||
ensureFile,
|
||
ensureFileSync,
|
||
ensureLink,
|
||
ensureLinkSync,
|
||
ensureSymlink,
|
||
ensureSymlinkSync,
|
||
expandGlob,
|
||
expandGlobSync,
|
||
_createWalkEntrySync,
|
||
_createWalkEntry,
|
||
walk,
|
||
walkSync,
|
||
move,
|
||
moveSync,
|
||
copy,
|
||
copySync,
|
||
EOL,
|
||
detect,
|
||
format: format3
|
||
};
|
||
const base64abc = [
|
||
"A",
|
||
"B",
|
||
"C",
|
||
"D",
|
||
"E",
|
||
"F",
|
||
"G",
|
||
"H",
|
||
"I",
|
||
"J",
|
||
"K",
|
||
"L",
|
||
"M",
|
||
"N",
|
||
"O",
|
||
"P",
|
||
"Q",
|
||
"R",
|
||
"S",
|
||
"T",
|
||
"U",
|
||
"V",
|
||
"W",
|
||
"X",
|
||
"Y",
|
||
"Z",
|
||
"a",
|
||
"b",
|
||
"c",
|
||
"d",
|
||
"e",
|
||
"f",
|
||
"g",
|
||
"h",
|
||
"i",
|
||
"j",
|
||
"k",
|
||
"l",
|
||
"m",
|
||
"n",
|
||
"o",
|
||
"p",
|
||
"q",
|
||
"r",
|
||
"s",
|
||
"t",
|
||
"u",
|
||
"v",
|
||
"w",
|
||
"x",
|
||
"y",
|
||
"z",
|
||
"0",
|
||
"1",
|
||
"2",
|
||
"3",
|
||
"4",
|
||
"5",
|
||
"6",
|
||
"7",
|
||
"8",
|
||
"9",
|
||
"+",
|
||
"/"
|
||
];
|
||
function encode(data) {
|
||
const uint8 = typeof data === "string" ? new TextEncoder().encode(data) : data instanceof Uint8Array ? data : new Uint8Array(data);
|
||
let result = "", i;
|
||
const l = uint8.length;
|
||
for(i = 2; i < l; i += 3){
|
||
result += base64abc[uint8[i - 2] >> 2];
|
||
result += base64abc[(uint8[i - 2] & 0x03) << 4 | uint8[i - 1] >> 4];
|
||
result += base64abc[(uint8[i - 1] & 0x0f) << 2 | uint8[i] >> 6];
|
||
result += base64abc[uint8[i] & 0x3f];
|
||
}
|
||
if (i === l + 1) {
|
||
result += base64abc[uint8[i - 2] >> 2];
|
||
result += base64abc[(uint8[i - 2] & 0x03) << 4];
|
||
result += "==";
|
||
}
|
||
if (i === l) {
|
||
result += base64abc[uint8[i - 2] >> 2];
|
||
result += base64abc[(uint8[i - 2] & 0x03) << 4 | uint8[i - 1] >> 4];
|
||
result += base64abc[(uint8[i - 1] & 0x0f) << 2];
|
||
result += "=";
|
||
}
|
||
return result;
|
||
}
|
||
function decode(b64) {
|
||
const binString = atob(b64);
|
||
const size = binString.length;
|
||
const bytes = new Uint8Array(size);
|
||
for(let i = 0; i < size; i++){
|
||
bytes[i] = binString.charCodeAt(i);
|
||
}
|
||
return bytes;
|
||
}
|
||
const importMeta = {
|
||
url: "<https://deno.land/std@0.77.0/hash/_wasm/wasm.js>",
|
||
main: false
|
||
};
|
||
const source = decode("AGFzbQEAAAABSQxgAn9/AGACf38Bf2ADf39/AGADf39/AX9gAX8AYAF/AX9gAABgBH9/f38Bf2AFf39/f38AYAV/f39/fwF/YAJ+fwF/YAF/AX4CTQMDd2JnFV9fd2JpbmRnZW5fc3RyaW5nX25ldwABA3diZxBfX3diaW5kZ2VuX3Rocm93AAADd2JnEl9fd2JpbmRnZW5fcmV0aHJvdwAEA6sBqQEAAgEAAAIFAAACAAQABAADAAAAAQcJAAAAAAAAAAAAAAAAAAAAAAICAgIAAAAAAAAAAAAAAAAAAAACAgICBAAAAgAAAQAAAAAAAAAAAAAAAAAECgEEAQIAAAAAAgIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQEAgICAAEGAAMEAgcEAgQEAwMFBAQAAwQDAQEBAQQABwYBBgYBAAELBQUFBQUFBQAEBAUBcAFpaQUDAQARBgkBfwFBgIDAAAsHoQEJBm1lbW9yeQIAE19fd2JnX2Rlbm9oYXNoX2ZyZWUAhAELY3JlYXRlX2hhc2gABQt1cGRhdGVfaGFzaACFAQtkaWdlc3RfaGFzaACCARFfX3diaW5kZ2VuX21hbGxvYwCNARJfX3diaW5kZ2VuX3JlYWxsb2MAkwETX193YmluZGdlbl9leHBvcnRfMgMAD19fd2JpbmRnZW5fZnJlZQCZAQmPAQEAQQELaJcBqgGcAZYBnwFYqwFDDy5XowE3PEFIkgGjAWA/QkliPi9EjgGlAVI9GSiHAaQBR2EwRY8BU18nOooBqAFQIS2JAakBUVkTHnunAUsVJnqmAUoqNjiYAagBcSkyNJgBqQF1LBocmAGnAXQrIiSYAaYBdzU5cDEzeBsddiMlc4wBVoABlQGiAZQBCsixBqkBjEwBVn4gACABKQN4IgIgASkDSCIaIAEpAwAiFyABKQMIIgtCOIkgC0IHiIUgC0I/iYV8fCABKQNwIgNCA4kgA0IGiIUgA0ItiYV8IgRCOIkgBEIHiIUgBEI/iYV8IAEpA1AiPiABKQMQIglCOIkgCUIHiIUgCUI/iYUgC3x8IAJCBoggAkIDiYUgAkItiYV8IgcgASkDQCITIBpCB4ggGkI4iYUgGkI/iYV8fCABKQMwIhQgASkDOCJCQjiJIEJCB4iFIEJCP4mFfCACfCABKQNoIkQgASkDICIVIAEpAygiQ0I4iSBDQgeIhSBDQj+JhXx8IAEpA1giPyABKQMYIgpCOIkgCkIHiIUgCkI/iYUgCXx8IARCBoggBEIDiYUgBEItiYV8IgZCA4kgBkIGiIUgBkItiYV8IgVCA4kgBUIGiIUgBUItiYV8IghCA4kgCEIGiIUgCEItiYV8Igx8IANCB4ggA0I4iYUgA0I/iYUgRHwgCHwgASkDYCJAQjiJIEBCB4iFIEBCP4mFID98IAV8ID5CB4ggPkI4iYUgPkI/iYUgGnwgBnwgE0IHiCATQjiJhSATQj+JhSBCfCAEfCAUQgeIIBRCOImFIBRCP4mFIEN8IAN8IBVCB4ggFUI4iYUgFUI/iYUgCnwgQHwgB0IGiCAHQgOJhSAHQi2JhXwiDUIDiSANQgaIhSANQi2JhXwiDkIDiSAOQgaIhSAOQi2JhXwiEEIDiSAQQgaIhSAQQi2JhXwiEUIDiSARQgaIhSARQi2JhXwiFkIDiSAWQgaIhSAWQi2JhXwiGEIDiSAYQgaIhSAYQi2JhXwiGUI4iSAZQgeIhSAZQj+JhSACQgeIIAJCOImFIAJCP4mFIAN8IBB8IERCB4ggREI4iYUgREI/iYUgQHwgDnwgP0IHiCA/QjiJhSA/Qj+JhSA+fCANfCAMQgaIIAxCA4mFIAxCLYmFfCIbQgOJIBtCBoiFIBtCLYmFfCIcQgOJIBxCBoiFIBxCLYmFfCIdfCAHQgeIIAdCOImFIAdCP4mFIAR8IBF8IB1CBoggHUIDiYUgHUItiYV8Ih4gDEIHiCAMQjiJhSAMQj+JhSAQfHwgCEIHiCAIQjiJhSAIQj+JhSAOfCAdfCAFQgeIIAVCOImFIAVCP4mFIA18IBx8IAZCB4ggBkI4iYUgBkI/iYUgB3wgG3wgGUIGiCAZQgOJhSAZQi2JhXwiH0IDiSAfQgaIhSAfQi2JhXwiIEIDiSAgQgaIhSAgQi2JhXwiIUIDiSAhQgaIhSAhQi2JhXwiInwgGEIHiCAYQjiJhSAYQj+JhSAcfCAhfCAWQgeIIBZCOImFIBZCP4mFIBt8ICB8IBFCB4ggEUI4iYUgEUI/iYUgDHwgH3wgEEIHiCAQQjiJhSAQQj+JhSAIfCAZfCAOQgeIIA5COImFIA5CP4mFIAV8IBh8IA1CB4ggDUI4iYUgDUI/iYUgBnwgFnwgHkIGiCAeQgOJhSAeQi2JhXwiI0IDiSAjQgaIhSAjQi2JhXwiJEIDiSAkQgaIhSAkQi2JhXwiJUIDiSAlQgaIhSAlQi2JhXwiJkIDiSAmQgaIhSAmQi2JhXwiJ0IDiSAnQgaIhSAnQi2JhXwiKEIDiSAoQgaIhSAoQi2JhXwiKUI4iSApQgeIhSApQj+JhSAdQgeIIB1COImFIB1CP4mFIBh8ICV8IBxCB4ggHEI4iYUgHEI/iYUgFnwgJHwgG0IHiCAbQjiJhSAbQj+JhSARfCAjfCAiQgaIICJCA4mFICJCLYmFfCIqQgOJICpCBoiFICpCLYmFfCIrQgOJICtCBoiFICtCLYmFfCIsfCAeQgeIIB5COImFIB5CP4mFIBl8ICZ8ICxCBoggLEIDiYUgLEItiYV8Ii0gIkIHiCAiQjiJhSAiQj+JhSAlfHwgIUIHiCAhQjiJhSAhQj+JhSAkfCAsfCAgQgeIICBCOImFICBCP4mFICN8ICt8IB9CB4ggH0I4iYUgH0I/iYUgHnwgKnwgKUIGiCApQgOJhSApQi2JhXwiLkIDiSAuQgaIhSAuQi2JhXwiL0IDiSAvQgaIhSAvQi2JhXwiMEIDiSAwQgaIhSAwQi2JhXwiMXwgKEIHiCAoQjiJhSAoQj+JhSArfCAwfCAnQgeIICdCOImFICdCP4mFICp8IC98ICZCB4ggJkI4iYUgJkI/iYUgInwgLnwgJUIHiCAlQjiJhSAlQj+JhSAhfCApfCAkQgeIICRCOImFICRCP4mFICB8ICh8ICNCB4ggI0I4iYUgI0I/iYUgH3wgJ3wgLUIGiCAtQgOJhSAtQi2JhXwiMkIDiSAyQgaIhSAyQi2JhXwiM0IDiSAzQgaIhSAzQi2JhXwiNEIDiSA0QgaIhSA0Qi2JhXwiNUIDiSA1QgaIhSA1Qi2JhXwiNkIDiSA2QgaIhSA2Qi2JhXwiN0IDiSA3QgaIhSA3Qi2JhXwiOEI4iSA4QgeIhSA4Qj+JhSAsQgeIICxCOImFICxCP4mFICh8IDR8ICtCB4ggK0I4iYUgK0I/iYUgJ3wgM3wgKkIHiCAqQjiJhSAqQj+JhSAmfCAyfCAxQgaIIDFCA4mFIDFCLYmFfCI5QgOJIDlCBoiFIDlCLYmFfCI6QgOJIDpCBoiFIDpCLYmFfCI7fCAtQgeIIC1COImFIC1CP4mFICl8IDV8IDtCBoggO0IDiYUgO0ItiYV8IjwgMUIHiCAxQjiJhSAxQj+JhSA0fHwgMEIHiCAwQjiJhSAwQj+JhSAzfCA7fCAvQgeIIC9COImFIC9CP4mFIDJ8IDp8IC5CB4ggLkI4iYUgLkI/iYUgLXwgOXwgOEIGiCA4QgOJhSA4Qi2JhXwiPUIDiSA9QgaIhSA9Qi2JhXwiRkIDiSBGQgaIhSBGQi2JhXwiR0IDiSBHQgaIhSBHQi2JhXwiSHwgN0IHiCA3QjiJhSA3Qj+JhSA6fCBHfCA2QgeIIDZCOImFIDZCP4mFIDl8IEZ8IDVCB4ggNUI4iYUgNUI/iYUgMXwgPXwgNEIHiCA0QjiJhSA0Qj+JhSAwfCA4fCAzQgeIIDNCOImFIDNCP4mFIC98IDd8IDJCB4ggMkI4iYUgMkI/iYUgLnwgNnwgPEIGiCA8QgOJhSA8Qi2JhXwiQUIDiSBBQgaIhSBBQi2JhXwiSUIDiSBJQgaIhSBJQi2JhXwiSkIDiSBKQgaIhSBKQi2JhXwiS0IDiSBLQgaIhSBLQi2JhXwiTEIDiSBMQgaIhSBMQi2JhXwiTkIDiSBOQgaIhSBOQi2JhXwiTyBMIEogQSA7IDkgMCAuICggJiAkIB4gHCAMIAUgBCBAIBMgFSAXIAApAzgiVCAAKQMgIhdCMokgF0IuiYUgF0IXiYV8IAApAzAiUCAAKQMoIk2FIBeDIFCFfHxCotyiuY3zi8XCAHwiEiAAKQMYIlV8IhV8IAogF3wgCSBNfCALIFB8IBUgFyBNhYMgTYV8IBVCMokgFUIuiYUgFUIXiYV8Qs3LvZ+SktGb8QB8IlEgACkDECJSfCIJIBUgF4WDIBeFfCAJQjKJIAlCLomFIAlCF4mFfEKv9rTi/vm+4LV/fCJTIAApAwgiRXwiCiAJIBWFgyAVhXwgCkIyiSAKQi6JhSAKQheJhXxCvLenjNj09tppfCJWIAApAwAiFXwiDyAJIAqFgyAJhXwgD0IyiSAPQi6JhSAPQheJhXxCuOqimr/LsKs5fCJXIEUgUoUgFYMgRSBSg4UgFUIkiSAVQh6JhSAVQhmJhXwgEnwiC3wiEnwgDyBCfCAKIBR8IAkgQ3wgEiAKIA+FgyAKhXwgEkIyiSASQi6JhSASQheJhXxCmaCXsJu+xPjZAHwiQiALQiSJIAtCHomFIAtCGYmFIAsgFSBFhYMgFSBFg4V8IFF8Igl8IhMgDyAShYMgD4V8IBNCMokgE0IuiYUgE0IXiYV8Qpuf5fjK1OCfkn98IkMgCUIkiSAJQh6JhSAJQhmJhSAJIAsgFYWDIAsgFYOFfCBTfCIKfCIPIBIgE4WDIBKFfCAPQjKJIA9CLomFIA9CF4mFfEKYgrbT3dqXjqt/fCJRIApCJIkgCkIeiYUgCkIZiYUgCiAJIAuFgyAJIAuDhXwgVnwiC3wiEiAPIBOFgyAThXwgEkIyiSASQi6JhSASQheJhXxCwoSMmIrT6oNYfCJTIAtCJIkgC0IeiYUgC0IZiYUgCyAJIAqFgyAJIAqDhXwgV3wiCXwiFHwgEiA/fCAPID58IBMgGnwgFCAPIBKFgyAPhXwgFEIyiSAUQi6JhSAUQheJhXxCvt/Bq5Tg1sESfCIaIAlCJIkgCUIeiYUgCUIZiYUgCSAKIAuFgyAKIAuDhXwgQnwiCnwiDyASIBSFgyAShXwgD0IyiSAPQi6JhSAPQheJhXxCjOWS9+S34ZgkfCI+IApCJIkgCkIeiYUgCkIZiYUgCiAJIAuFgyAJIAuDhXwgQ3wiC3wiEiAPIBSFgyAUhXwgEkIyiSASQi6JhSASQheJhXxC4un+r724n4bVAHwiPyALQiSJIAtCHomFIAtCGYmFIAsgCSAKhYMgCSAKg4V8IFF8Igl8IhMgDyAShYMgD4V8IBNCMokgE0IuiYUgE0IXiYV8Qu+S7pPPrpff8gB8IkAgCUIkiSAJQh6JhSAJQhmJhSAJIAogC4WDIAogC4OFfCBTfCIKfCIUfCACIBN8IAMgEnwgDyBEfCAUIBIgE4WDIBKFfCAUQjKJIBRCLomFIBRCF4mFfEKxrdrY47+s74B/fCISIApCJIkgCkIeiYUgCkIZiYUgCiAJIAuFgyAJIAuDhXwgGnwiAnwiCyATIBSFgyAThXwgC0IyiSALQi6JhSALQheJhXxCtaScrvLUge6bf3wiEyACQiSJIAJCHomFIAJCGYmFIAIgCSAKhYMgCSAKg4V8ID58IgN8IgkgCyAUhYMgFIV8IAlCMokgCUIuiYUgCUIXiYV8QpTNpPvMrvzNQXwiFCADQiSJIANCHomFIANCGYmFIAMgAiAKhYMgAiAKg4V8ID98IgR8IgogCSALhYMgC4V8IApCMokgCkIuiYUgCkIXiYV8QtKVxfeZuNrNZHwiGiAEQiSJIARCHomFIARCGYmFIAQgAiADhYMgAiADg4V8IEB8IgJ8Ig98IAogDXwgBiAJfCAHIAt8IA8gCSAKhYMgCYV8IA9CMokgD0IuiYUgD0IXiYV8QuPLvMLj8JHfb3wiCyACQiSJIAJCHomFIAJCGYmFIAIgAyAEhYMgAyAEg4V8IBJ8IgN8IgcgCiAPhYMgCoV8IAdCMokgB0IuiYUgB0IXiYV8QrWrs9zouOfgD3wiCSADQiSJIANCHomFIANCGYmFIAMgAiAEhYMgAiAEg4V8IBN8IgR8IgYgByAPhYMgD4V8IAZCMokgBkIuiYUgBkIXiYV8QuW4sr3HuaiGJHwiCiAEQiSJIARCHomFIARCGYmFIAQgAiADhYMgAiADg4V8IBR8IgJ8IgUgBiAHhYMgB4V8IAVCMokgBUIuiYUgBUIXiYV8QvWErMn1jcv0LXwiDyACQiSJIAJCHomFIAJCGYmFIAIgAyAEhYMgAyAEg4V8IBp8IgN8Ig18IAUgEHwgBiAIfCAHIA58IA0gBSAGhYMgBoV8IA1CMokgDUIuiYUgDUIXiYV8QoPJm/WmlaG6ygB8IgwgA0IkiSADQh6JhSADQhmJhSADIAIgBIWDIAIgBIOFfCALfCIEfCIHIAUgDYWDIAWFfCAHQjKJIAdCLomFIAdCF4mFfELU94fqy7uq2NwAfCIOIARCJIkgBEIeiYUgBEIZiYUgBCACIAOFgyACIAODhXwgCXwiAnwiBiAHIA2FgyANhXwgBkIyiSAGQi6JhSAGQheJhXxCtafFmKib4vz2AHwiDSACQiSJIAJCHomFIAJCGYmFIAIgAyAEhYMgAyAEg4V8IAp8IgN8IgUgBiAHhYMgB4V8IAVCMokgBUIuiYUgBUIXiYV8Qqu/m/OuqpSfmH98IhAgA0IkiSADQh6JhSADQhmJhSADIAIgBIWDIAIgBIOFfCAPfCIEfCIIfCAFIBZ8IAYgG3wgByARfCAIIAUgBoWDIAaFfCAIQjKJIAhCLomFIAhCF4mFfEKQ5NDt0s3xmKh/fCIRIARCJIkgBEIeiYUgBEIZiYUgBCACIAOFgyACIAODhXwgDHwiAnwiByAFIAiFgyAFhXwgB0IyiSAHQi6JhSAHQheJhXxCv8Lsx4n5yYGwf3wiDCACQiSJIAJCHomFIAJCGYmFIAIgAyAEhYMgAyAEg4V8IA58IgN8IgYgByAIhYMgCIV8IAZCMokgBkIuiYUgBkIXiYV8QuSdvPf7+N+sv398Ig4gA0IkiSADQh6JhSADQhmJhSADIAIgBIWDIAIgBIOFfCANfCIEfCIFIAYgB4WDIAeFfCAFQjKJIAVCLomFIAVCF4mFfELCn6Lts/6C8EZ8Ig0gBEIkiSAEQh6JhSAEQhmJhSAEIAIgA4WDIAIgA4OFfCAQfCICfCIIfCAFIBl8IAYgHXwgByAYfCAIIAUgBoWDIAaFfCAIQjKJIAhCLomFIAhCF4mFfEKlzqqY+ajk01V8IhAgAkIkiSACQh6JhSACQhmJhSACIAMgBIWDIAMgBIOFfCARfCIDfCIHIAUgCIWDIAWFfCAHQjKJIAdCLomFIAdCF4mFfELvhI6AnuqY5QZ8IhEgA0IkiSADQh6JhSADQhmJhSADIAIgBIWDIAIgBIOFfCAMfCIEfCIGIAcgCIWDIAiFfCAGQjKJIAZCLomFIAZCF4mFfELw3LnQ8KzKlBR8IgwgBEIkiSAEQh6JhSAEQhmJhSAEIAIgA4WDIAIgA4OFfCAOfCICfCIFIAYgB4WDIAeFfCAFQjKJIAVCLomFIAVCF4mFfEL838i21NDC2yd8Ig4gAkIkiSACQh6JhSACQhmJhSACIAMgBIWDIAMgBIOFfCANfCIDfCIIfCAFICB8IAYgI3wgByAffCAIIAUgBoWDIAaFfCAIQjKJIAhCLomFIAhCF4mFfEKmkpvhhafIjS58Ig0gA0IkiSADQh6JhSADQhmJhSADIAIgBIWDIAIgBIOFfCAQfCIEfCIHIAUgCIWDIAWFfCAHQjKJIAdCLomFIAdCF4mFfELt1ZDWxb+bls0AfCIQIARCJIkgBEIeiYUgBEIZiYUgBCACIAOFgyACIAODhXwgEXwiAnwiBiAHIAiFgyAIhXwgBkIyiSAGQi6JhSAGQheJhXxC3+fW7Lmig5zTAHwiESACQiSJIAJCHomFIAJCGYmFIAIgAyAEhYMgAyAEg4V8IAx8IgN8IgUgBiAHhYMgB4V8IAVCMokgBUIuiYUgBUIXiYV8Qt7Hvd3I6pyF5QB8IgwgA0IkiSADQh6JhSADQhmJhSADIAIgBIWDIAIgBIOFfCAOfCIEfCIIfCAFICJ8IAYgJXwgByAhfCAIIAUgBoWDIAaFfCAIQjKJIAhCLomFIAhCF4mFfEKo5d7js9eCtfYAfCIOIARCJIkgBEIeiYUgBEIZiYUgBCACIAOFgyACIAODhXwgDXwiAnwiByAFIAiFgyAFhXwgB0IyiSAHQi6JhSAHQheJhXxC5t22v+SlsuGBf3wiDSACQiSJIAJCHomFIAJCGYmFIAIgAyAEhYMgAyAEg4V8IBB8IgN8IgYgByAIhYMgCIV8IAZCMokgBkIuiYUgBkIXiYV8QrvqiKTRkIu5kn98IhAgA0IkiSADQh6JhSADQhmJhSADIAIgBIWDIAIgBIOFfCARfCIEfCIFIAYgB4WDIAeFfCAFQjKJIAVCLomFIAVCF4mFfELkhsTnlJT636J/fCIRIARCJIkgBEIeiYUgBEIZiYUgBCACIAOFgyACIAODhXwgDHwiAnwiCHwgBSArfCAGICd8IAcgKnwgCCAFIAaFgyAGhXwgCEIyiSAIQi6JhSAIQheJhXxCgeCI4rvJmY2of3wiDCACQiSJIAJCHomFIAJCGYmFIAIgAyAEhYMgAyAEg4V8IA58IgN8IgcgBSAIhYMgBYV8IAdCMokgB0IuiYUgB0IXiYV8QpGv4oeN7uKlQnwiDiADQiSJIANCHomFIANCGYmFIAMgAiAEhYMgAiAEg4V8IA18IgR8IgYgByAIhYMgCIV8IAZCMokgBkIuiYUgBkIXiYV8QrD80rKwtJS2R3wiDSAEQiSJIARCHomFIARCGYmFIAQgAiADhYMgAiADg4V8IBB8IgJ8IgUgBiAHhYMgB4V8IAVCMokgBUIuiYUgBUIXiYV8Qpikvbedg7rJUXwiECACQiSJIAJCHomFIAJCGYmFIAIgAyAEhYMgAyAEg4V8IBF8IgN8Igh8IAUgLXwgBiApfCAHICx8IAggBSAGhYMgBoV8IAhCMokgCEIuiYUgCEIXiYV8QpDSlqvFxMHMVnwiESADQiSJIANCHomFIANCGYmFIAMgAiAEhYMgAiAEg4V8IAx8IgR8IgcgBSAIhYMgBYV8IAdCMokgB0IuiYUgB0IXiYV8QqrAxLvVsI2HdHwiDCAEQiSJIARCHomFIARCGYmFIAQgAiADhYMgAiADg4V8IA58IgJ8IgYgByAIhYMgCIV8IAZCMokgBkIuiYUgBkIXiYV8Qrij75WDjqi1EHwiDiACQiSJIAJCHomFIAJCGYmFIAIgAyAEhYMgAyAEg4V8IA18IgN8IgUgBiAHhYMgB4V8IAVCMokgBUIuiYUgBUIXiYV8Qsihy8brorDSGXwiDSADQiSJIANCHomFIANCGYmFIAMgAiAEhYMgAiAEg4V8IBB8IgR8Igh8IAUgM3wgBiAvfCAHIDJ8IAggBSAGhYMgBoV8IAhCMokgCEIuiYUgCEIXiYV8QtPWhoqFgdubHnwiECAEQiSJIARCHomFIARCGYmFIAQgAiADhYMgAiADg4V8IBF8IgJ8IgcgBSAIhYMgBYV8IAdCMokgB0IuiYUgB0IXiYV8QpnXu/zN6Z2kJ3wiESACQiSJIAJCHomFIAJCGYmFIAIgAyAEhYMgAyAEg4V8IAx8IgN8IgYgByAIhYMgCIV8IAZCMokgBkIuiYUgBkIXiYV8QqiR7Yzelq/YNHwiDCADQiSJIANCHomFIANCGYmFIAMgAiAEhYMgAiAEg4V8IA58IgR8IgUgBiAHhYMgB4V8IAVCMokgBUIuiYUgBUIXiYV8QuO0pa68loOOOXwiDiAEQiSJIARCHomFIARCGYmFIAQgAiADhYMgAiADg4V8IA18IgJ8Igh8IAUgNXwgBiAxfCAHIDR8IAggBSAGhYMgBoV8IAhCMokgCEIuiYUgCEIXiYV8QsuVhpquyarszgB8Ig0gAkIkiSACQh6JhSACQhmJhSACIAMgBIWDIAMgBIOFfCAQfCIDfCIHIAUgCIWDIAWFfCAHQjKJIAdCLomFIAdCF4mFfELzxo+798myztsAfCIQIANCJIkgA0IeiYUgA0IZiYUgAyACIASFgyACIASDhXwgEXwiBHwiBiAHIAiFgyAIhXwgBkIyiSAGQi6JhSAGQheJhXxCo/HKtb3+m5foAHwiESAEQiSJIARCHomFIARCGYmFIAQgAiADhYMgAiADg4V8IAx8IgJ8IgUgBiAHhYMgB4V8IAVCMokgBUIuiYUgBUIXiYV8Qvzlvu/l3eDH9AB8IgwgAkIkiSACQh6JhSACQhmJhSACIAMgBIWDIAMgBIOFfCAOfCIDfCIIfCAFIDd8IAYgOnwgByA2fCAIIAUgBoWDIAaFfCAIQjKJIAhCLomFIAhCF4mFfELg3tyY9O3Y0vgAfCIOIANCJIkgA0IeiYUgA0IZiYUgAyACIASFgyACIASDhXwgDXwiBHwiByAFIAiFgyAFhXwgB0IyiSAHQi6JhSAHQheJhXxC8tbCj8qCnuSEf3wiDSAEQiSJIARCHomFIARCGYmFIAQgAiADhYMgAiADg4V8IBB8IgJ8IgYgByAIhYMgCIV8IAZCMokgBkIuiYUgBkIXiYV8QuzzkNOBwcDjjH98IhAgAkIkiSACQh6JhSACQhmJhSACIAMgBIWDIAMgBIOFfCARfCIDfCIFIAYgB4WDIAeFfCAFQjKJIAVCLomFIAVCF4mFfEKovIybov+/35B/fCIRIANCJIkgA0IeiYUgA0IZiYUgAyACIASFgyACIASDhXwgDHwiBHwiCHwgBSA9fCAGIDx8IAcgOHwgCCAFIAaFgyAGhXwgCEIyiSAIQi6JhSAIQheJhXxC6fuK9L2dm6ikf3wiDCAEQiSJIARCHomFIARCGYmFIAQgAiADhYMgAiADg4V8IA58IgJ8IgcgBSAIhYMgBYV8IAdCMokgB0IuiYUgB0IXiYV8QpXymZb7/uj8vn98Ig4gAkIkiSACQh6JhSACQhmJhSACIAMgBIWDIAMgBIOFfCANfCIDfCIGIAcgCIWDIAiFfCAGQjKJIAZCLomFIAZCF4mFfEKrpsmbrp7euEZ8Ig0gA0IkiSADQh6JhSADQhmJhSADIAIgBIWDIAIgBIOFfCAQfCIEfCIFIAYgB4WDIAeFfCAFQjKJIAVCLomFIAVCF4mFfEKcw5nR7tnPk0p8IhAgBEIkiSAEQh6JhSAEQhmJhSAEIAIgA4WDIAIgA4OFfCARfCICfCIIfCAFIEd8IAYgSXwgByBGfCAIIAUgBoWDIAaFfCAIQjKJIAhCLomFIAhCF4mFfEKHhIOO8piuw1F8IhEgAkIkiSACQh6JhSACQhmJhSACIAMgBIWDIAMgBIOFfCAMfCIDfCIHIAUgCIWDIAWFfCAHQjKJIAdCLomFIAdCF4mFfEKe1oPv7Lqf7Wp8IgwgA0IkiSADQh6JhSADQhmJhSADIAIgBIWDIAIgBIOFfCAOfCIEfCIGIAcgCIWDIAiFfCAGQjKJIAZCLomFIAZCF4mFfEL4orvz/u/TvnV8Ig4gBEIkiSAEQh6JhSAEQhmJhSAEIAIgA4WDIAIgA4OFfCANfCICfCIFIAYgB4WDIAeFfCAFQjKJIAVCLomFIAVCF4mFfEK6392Qp/WZ+AZ8IhYgAkIkiSACQh6JhSACQhmJhSACIAMgBIWDIAMgBIOFfCAQfCIDfCIIfCA5QgeIIDlCOImFIDlCP4mFIDV8IEF8IEhCBoggSEIDiYUgSEItiYV8Ig0gBXwgBiBLfCAHIEh8IAggBSAGhYMgBoV8IAhCMokgCEIuiYUgCEIXiYV8QqaxopbauN+xCnwiECADQiSJIANCHomFIANCGYmFIAMgAiAEhYMgAiAEg4V8IBF8IgR8IgcgBSAIhYMgBYV8IAdCMokgB0IuiYUgB0IXiYV8Qq6b5PfLgOafEXwiESAEQiSJIARCHomFIARCGYmFIAQgAiADhYMgAiADg4V8IAx8IgJ8IgYgByAIhYMgCIV8IAZCMokgBkIuiYUgBkIXiYV8QpuO8ZjR5sK4G3wiGCACQiSJIAJCHomFIAJCGYmFIAIgAyAEhYMgAyAEg4V8IA58IgN8IgUgBiAHhYMgB4V8IAVCMokgBUIuiYUgBUIXiYV8QoT7kZjS/t3tKHwiGSADQiSJIANCHomFIANCGYmFIAMgAiAEhYMgAiAEg4V8IBZ8IgR8Igh8IDtCB4ggO0I4iYUgO0I/iYUgN3wgSnwgOkIHiCA6QjiJhSA6Qj+JhSA2fCBJfCANQgaIIA1CA4mFIA1CLYmFfCIMQgOJIAxCBoiFIAxCLYmFfCIOIAV8IAYgTnwgByAMfCAIIAUgBoWDIAaFfCAIQjKJIAhCLomFIAhCF4mFfEKTyZyGtO+q5TJ8IgcgBEIkiSAEQh6JhSAEQhmJhSAEIAIgA4WDIAIgA4OFfCAQfCICfCIGIAUgCIWDIAWFfCAGQjKJIAZCLomFIAZCF4mFfEK8/aauocGvzzx8IhAgAkIkiSACQh6JhSACQhmJhSACIAMgBIWDIAMgBIOFfCARfCIDfCIFIAYgCIWDIAiFfCAFQjKJIAVCLomFIAVCF4mFfELMmsDgyfjZjsMAfCIRIANCJIkgA0IeiYUgA0IZiYUgAyACIASFgyACIASDhXwgGHwiBHwiCCAFIAaFgyAGhXwgCEIyiSAIQi6JhSAIQheJhXxCtoX52eyX9eLMAHwiFiAEQiSJIARCHomFIARCGYmFIAQgAiADhYMgAiADg4V8IBl8IgJ8IgwgVHw3AzggACBVIAJCJIkgAkIeiYUgAkIZiYUgAiADIASFgyADIASDhXwgB3wiA0IkiSADQh6JhSADQhmJhSADIAIgBIWDIAIgBIOFfCAQfCIEQiSJIARCHomFIARCGYmFIAQgAiADhYMgAiADg4V8IBF8IgJCJIkgAkIeiYUgAkIZiYUgAiADIASFgyADIASDhXwgFnwiB3w3AxggACBQIAMgPEIHiCA8QjiJhSA8Qj+JhSA4fCBLfCAOQgaIIA5CA4mFIA5CLYmFfCIOIAZ8IAwgBSAIhYMgBYV8IAxCMokgDEIuiYUgDEIXiYV8Qqr8lePPs8q/2QB8IgN8IgZ8NwMwIAAgUiAHQiSJIAdCHomFIAdCGYmFIAcgAiAEhYMgAiAEg4V8IAN8IgN8NwMQIAAgTSA8ID1CB4ggPUI4iYUgPUI/iYV8IA18IE9CBoggT0IDiYUgT0ItiYV8IAV8IAYgCCAMhYMgCIV8IAZCMokgBkIuiYUgBkIXiYV8Quz129az9dvl3wB8IgUgBHwiBHw3AyggACBFIANCJIkgA0IeiYUgA0IZiYUgAyACIAeFgyACIAeDhXwgBXwiBXw3AwggACA9IEFCB4ggQUI4iYUgQUI/iYV8IEx8IA5CBoggDkIDiYUgDkItiYV8IAh8IAQgBiAMhYMgDIV8IARCMokgBEIuiYUgBEIXiYV8QpewndLEsYai7AB8IgQgAiAXfHw3AyAgACAVIAUgAyAHhYMgAyAHg4V8IAVCJIkgBUIeiYUgBUIZiYV8IAR8NwMAC6JBASN/IwBBQGoiHEE4akIANwMAIBxBMGpCADcDACAcQShqQgA3AwAgHEEgakIANwMAIBxBGGpCADcDACAcQRBqQgA3AwAgHEEIakIANwMAIBxCADcDACAAKAIcISMgACgCGCEhIAAoAhQhHyAAKAIQIR4gACgCDCEkIAAoAgghIiAAKAIEISAgACgCACEHIAIEQCABIAJBBnRqISUDQCAcIAEoAAAiAkEYdCACQQh0QYCA/AdxciACQQh2QYD+A3EgAkEYdnJyNgIAIBwgAUEEaigAACICQRh0IAJBCHRBgID8B3FyIAJBCHZBgP4DcSACQRh2cnI2AgQgHCABQQhqKAAAIgJBGHQgAkEIdEGAgPwHcXIgAkEIdkGA/gNxIAJBGHZycjYCCCAcIAFBDGooAAAiAkEYdCACQQh0QYCA/AdxciACQQh2QYD+A3EgAkEYdnJyNgIMIBwgAUEQaigAACICQRh0IAJBCHRBgID8B3FyIAJBCHZBgP4DcSACQRh2cnI2AhAgHCABQRRqKAAAIgJBGHQgAkEIdEGAgPwHcXIgAkEIdkGA/gNxIAJBGHZycjYCFCAcIAFBGGooAAAiAkEYdCACQQh0QYCA/AdxciACQQh2QYD+A3EgAkEYdnJyIhk2AhggHCABQRxqKAAAIgJBGHQgAkEIdEGAgPwHcXIgAkEIdkGA/gNxIAJBGHZyciIGNgIcIBwgAUEgaigAACICQRh0IAJBCHRBgID8B3FyIAJBCHZBgP4DcSACQRh2cnIiCjYCICAcIAFBJGooAAAiAkEYdCACQQh0QYCA/AdxciACQQh2QYD+A3EgAkEYdnJyIhE2AiQgHCABQShqKAAAIgJBGHQgAkEIdEGAgPwHcXIgAkEIdkGA/gNxIAJBGHZyciIQNgIoIBwgAUEsaigAACICQRh0IAJBCHRBgID8B3FyIAJBCHZBgP4DcSACQRh2cnIiFDYCLCAcIAFBMGooAAAiAkEYdCACQQh0QYCA/AdxciACQQh2QYD+A3EgAkEYdnJyIhU2AjAgHCABQTRqKAAAIgJBGHQgAkEIdEGAgPwHcXIgAkEIdkGA/gNxIAJBGHZyciIaNgI0IBwgAUE4aigAACICQRh0IAJBCHRBgID8B3FyIAJBCHZBgP4DcSACQRh2cnIiAjYCOCAcIAFBPGooAAAiG0EYdCAbQQh0QYCA/AdxciAbQQh2QYD+A3EgG0EYdnJyIhs2AjwgByAcKAIAIhggIyAfICFzIB5xICFzaiAeQRp3IB5BFXdzIB5BB3dzampBmN+olARqIgkgByAicSAHICBxIgsgICAicXNzIAdBHncgB0ETd3MgB0EKd3NqaiITQR53IBNBE3dzIBNBCndzIBMgByAgc3EgC3NqICEgHCgCBCIXaiAJICRqIgQgHiAfc3EgH3NqIARBGncgBEEVd3MgBEEHd3NqQZGJ3YkHaiILaiIJIBNxIgggByATcXMgByAJcXMgCUEedyAJQRN3cyAJQQp3c2ogHyAcKAIIIgVqIAsgImoiAyAEIB5zcSAec2ogA0EadyADQRV3cyADQQd3c2pBz/eDrntqIgtqIgxBHncgDEETd3MgDEEKd3MgDCAJIBNzcSAIc2ogHiAcKAIMIhZqIAsgIGoiCCADIARzcSAEc2ogCEEadyAIQRV3cyAIQQd3c2pBpbfXzX5qIg9qIgsgDHEiEiAJIAxxcyAJIAtxcyALQR53IAtBE3dzIAtBCndzaiAEIBwoAhAiDWogByAPaiIEIAMgCHNxIANzaiAEQRp3IARBFXdzIARBB3dzakHbhNvKA2oiB2oiD0EedyAPQRN3cyAPQQp3cyAPIAsgDHNxIBJzaiAcKAIUIg4gA2ogByATaiITIAQgCHNxIAhzaiATQRp3IBNBFXdzIBNBB3dzakHxo8TPBWoiA2oiByAPcSISIAsgD3FzIAcgC3FzIAdBHncgB0ETd3MgB0EKd3NqIAggGWogAyAJaiIDIAQgE3NxIARzaiADQRp3IANBFXdzIANBB3dzakGkhf6ReWoiCWoiCEEedyAIQRN3cyAIQQp3cyAIIAcgD3NxIBJzaiAEIAZqIAkgDGoiBCADIBNzcSATc2ogBEEadyAEQRV3cyAEQQd3c2pB1b3x2HpqIgxqIgkgCHEiEiAHIAhxcyAHIAlxcyAJQR53IAlBE3dzIAlBCndzaiAKIBNqIAsgDGoiEyADIARzcSADc2ogE0EadyATQRV3cyATQQd3c2pBmNWewH1qIgtqIgxBHncgDEETd3MgDEEKd3MgDCAIIAlzcSASc2ogAyARaiALIA9qIgMgBCATc3EgBHNqIANBGncgA0EVd3MgA0EHd3NqQYG2jZQBaiIPaiILIAxxIhIgCSAMcXMgCSALcXMgC0EedyALQRN3cyALQQp3c2ogBCAQaiAHIA9qIgQgAyATc3EgE3NqIARBGncgBEEVd3MgBEEHd3NqQb6LxqECaiIHaiIPQR53IA9BE3dzIA9BCndzIA8gCyAMc3EgEnNqIBMgFGogByAIaiITIAMgBHNxIANzaiATQRp3IBNBFXdzIBNBB3dzakHD+7GoBWoiCGoiByAPcSISIAsgD3FzIAcgC3FzIAdBHncgB0ETd3MgB0EKd3NqIAMgFWogCCAJaiIDIAQgE3NxIARzaiADQRp3IANBFXdzIANBB3dzakH0uvmVB2oiCWoiCEEedyAIQRN3cyAIQQp3cyAIIAcgD3NxIBJzaiAEIBpqIAkgDGoiBCADIBNzcSATc2ogBEEadyAEQRV3cyAEQQd3c2pB/uP6hnhqIgxqIgkgCHEiHSAHIAhxcyAHIAlxcyAJQR53IAlBE3dzIAlBCndzaiACIBNqIAsgDGoiDCADIARzcSADc2ogDEEadyAMQRV3cyAMQQd3c2pBp43w3nlqIgtqIhJBHncgEkETd3MgEkEKd3MgEiAIIAlzcSAdc2ogAyAbaiALIA9qIgMgBCAMc3EgBHNqIANBGncgA0EVd3MgA0EHd3NqQfTi74x8aiIPaiILIBJxIh0gCSAScXMgCSALcXMgC0EedyALQRN3cyALQQp3c2ogF0EDdiAXQRl3cyAXQQ53cyAYaiARaiACQQ93IAJBDXdzIAJBCnZzaiITIARqIAcgD2oiDyADIAxzcSAMc2ogD0EadyAPQRV3cyAPQQd3c2pBwdPtpH5qIgRqIhhBHncgGEETd3MgGEEKd3MgGCALIBJzcSAdc2ogBUEDdiAFQRl3cyAFQQ53cyAXaiAQaiAbQQ93IBtBDXdzIBtBCnZzaiIHIAxqIAQgCGoiCCADIA9zcSADc2ogCEEadyAIQRV3cyAIQQd3c2pBho/5/X5qIgxqIgQgGHEiHSALIBhxcyAEIAtxcyAEQR53IARBE3dzIARBCndzaiADIBZBA3YgFkEZd3MgFkEOd3MgBWogFGogE0EPdyATQQ13cyATQQp2c2oiA2ogCSAMaiIXIAggD3NxIA9zaiAXQRp3IBdBFXdzIBdBB3dzakHGu4b+AGoiDGoiBUEedyAFQRN3cyAFQQp3cyAFIAQgGHNxIB1zaiANQQN2IA1BGXdzIA1BDndzIBZqIBVqIAdBD3cgB0ENd3MgB0EKdnNqIgkgD2ogDCASaiISIAggF3NxIAhzaiASQRp3IBJBFXdzIBJBB3dzakHMw7KgAmoiD2oiDCAFcSIdIAQgBXFzIAQgDHFzIAxBHncgDEETd3MgDEEKd3NqIAggDkEDdiAOQRl3cyAOQQ53cyANaiAaaiADQQ93IANBDXdzIANBCnZzaiIIaiALIA9qIhYgEiAXc3EgF3NqIBZBGncgFkEVd3MgFkEHd3NqQe/YpO8CaiIPaiINQR53IA1BE3dzIA1BCndzIA0gBSAMc3EgHXNqIBlBA3YgGUEZd3MgGUEOd3MgDmogAmogCUEPdyAJQQ13cyAJQQp2c2oiCyAXaiAPIBhqIhcgEiAWc3EgEnNqIBdBGncgF0EVd3MgF0EHd3NqQaqJ0tMEaiIYaiIPIA1xIh0gDCANcXMgDCAPcXMgD0EedyAPQRN3cyAPQQp3c2ogEiAGQQN2IAZBGXdzIAZBDndzIBlqIBtqIAhBD3cgCEENd3MgCEEKdnNqIhJqIAQgGGoiGSAWIBdzcSAWc2ogGUEadyAZQRV3cyAZQQd3c2pB3NPC5QVqIhhqIg5BHncgDkETd3MgDkEKd3MgDiANIA9zcSAdc2ogCkEDdiAKQRl3cyAKQQ53cyAGaiATaiALQQ93IAtBDXdzIAtBCnZzaiIEIBZqIAUgGGoiFiAXIBlzcSAXc2ogFkEadyAWQRV3cyAWQQd3c2pB2pHmtwdqIgVqIhggDnEiHSAOIA9xcyAPIBhxcyAYQR53IBhBE3dzIBhBCndzaiAXIBFBA3YgEUEZd3MgEUEOd3MgCmogB2ogEkEPdyASQQ13cyASQQp2c2oiF2ogBSAMaiIGIBYgGXNxIBlzaiAGQRp3IAZBFXdzIAZBB3dzakHSovnBeWoiBWoiCkEedyAKQRN3cyAKQQp3cyAKIA4gGHNxIB1zaiAQQQN2IBBBGXdzIBBBDndzIBFqIANqIARBD3cgBEENd3MgBEEKdnNqIgwgGWogBSANaiIZIAYgFnNxIBZzaiAZQRp3IBlBFXdzIBlBB3dzakHtjMfBemoiDWoiBSAKcSIdIAogGHFzIAUgGHFzIAVBHncgBUETd3MgBUEKd3NqIBYgFEEDdiAUQRl3cyAUQQ53cyAQaiAJaiAXQQ93IBdBDXdzIBdBCnZzaiIWaiANIA9qIhEgBiAZc3EgBnNqIBFBGncgEUEVd3MgEUEHd3NqQcjPjIB7aiINaiIQQR53IBBBE3dzIBBBCndzIBAgBSAKc3EgHXNqIBVBA3YgFUEZd3MgFUEOd3MgFGogCGogDEEPdyAMQQ13cyAMQQp2c2oiDyAGaiANIA5qIgYgESAZc3EgGXNqIAZBGncgBkEVd3MgBkEHd3NqQcf/5fp7aiIOaiINIBBxIh0gBSAQcXMgBSANcXMgDUEedyANQRN3cyANQQp3c2ogGSAaQQN2IBpBGXdzIBpBDndzIBVqIAtqIBZBD3cgFkENd3MgFkEKdnNqIhlqIA4gGGoiFCAGIBFzcSARc2ogFEEadyAUQRV3cyAUQQd3c2pB85eAt3xqIg5qIhVBHncgFUETd3MgFUEKd3MgFSANIBBzcSAdc2ogAkEDdiACQRl3cyACQQ53cyAaaiASaiAPQQ93IA9BDXdzIA9BCnZzaiIYIBFqIAogDmoiCiAGIBRzcSAGc2ogCkEadyAKQRV3cyAKQQd3c2pBx6KerX1qIhFqIg4gFXEiGiANIBVxcyANIA5xcyAOQR53IA5BE3dzIA5BCndzaiAbQQN2IBtBGXdzIBtBDndzIAJqIARqIBlBD3cgGUENd3MgGUEKdnNqIgIgBmogBSARaiIGIAogFHNxIBRzaiAGQRp3IAZBFXdzIAZBB3dzakHRxqk2aiIFaiIRQR53IBFBE3dzIBFBCndzIBEgDiAVc3EgGnNqIBNBA3YgE0EZd3MgE0EOd3MgG2ogF2ogGEEPdyAYQQ13cyAYQQp2c2oiGyAUaiAFIBBqIhAgBiAKc3EgCnNqIBBBGncgEEEVd3MgEEEHd3NqQefSpKEBaiIUaiIFIBFxIhogDiARcXMgBSAOcXMgBUEedyAFQRN3cyAFQQp3c2ogB0EDdiAHQRl3cyAHQQ53cyATaiAMaiACQQ93IAJBDXdzIAJBCnZzaiITIApqIA0gFGoiCiAGIBBzcSAGc2ogCkEadyAKQRV3cyAKQQd3c2pBhZXcvQJqIg1qIhRBHncgFEETd3MgFEEKd3MgFCAFIBFzcSAac2ogA0EDdiADQRl3cyADQQ53cyAHaiAWaiAbQQ93IBtBDXdzIBtBCnZzaiIHIAZqIA0gFWoiBiAKIBBzcSAQc2ogBkEadyAGQRV3cyAGQQd3c2pBuMLs8AJqIhVqIg0gFHEiGiAFIBRxcyAFIA1xcyANQR53IA1BE3dzIA1BCndzaiAJQQN2IAlBGXdzIAlBDndzIANqIA9qIBNBD3cgE0ENd3MgE0EKdnNqIgMgEGogDiAVaiIQIAYgCnNxIApzaiAQQRp3IBBBFXdzIBBBB3dzakH827HpBGoiDmoiFUEedyAVQRN3cyAVQQp3cyAVIA0gFHNxIBpzaiAIQQN2IAhBGXdzIAhBDndzIAlqIBlqIAdBD3cgB0ENd3MgB0EKdnNqIgkgCmogDiARaiIKIAYgEHNxIAZzaiAKQRp3IApBFXdzIApBB3dzakGTmuCZBWoiEWoiDiAVcSIaIA0gFXFzIA0gDnFzIA5BHncgDkETd3MgDkEKd3NqIAtBA3YgC0EZd3MgC0EOd3MgCGogGGogA0EPdyADQQ13cyADQQp2c2oiCCAGaiAFIBFqIgYgCiAQc3EgEHNqIAZBGncgBkEVd3MgBkEHd3NqQdTmqagGaiIFaiIRQR53IBFBE3dzIBFBCndzIBEgDiAVc3EgGnNqIBJBA3YgEkEZd3MgEkEOd3MgC2ogAmogCUEPdyAJQQ13cyAJQQp2c2oiCyAQaiAFIBRqIhAgBiAKc3EgCnNqIBBBGncgEEEVd3MgEEEHd3NqQbuVqLMHaiIUaiIFIBFxIhogDiARcXMgBSAOcXMgBUEedyAFQRN3cyAFQQp3c2ogBEEDdiAEQRl3cyAEQQ53cyASaiAbaiAIQQ93IAhBDXdzIAhBCnZzaiISIApqIA0gFGoiCiAGIBBzcSAGc2ogCkEadyAKQRV3cyAKQQd3c2pBrpKLjnhqIg1qIhRBHncgFEETd3MgFEEKd3MgFCAFIBFzcSAac2ogF0EDdiAXQRl3cyAXQQ53cyAEaiATaiALQQ93IAtBDXdzIAtBCnZzaiIEIAZqIA0gFWoiBiAKIBBzcSAQc2ogBkEadyAGQRV3cyAGQQd3c2pBhdnIk3lqIhVqIg0gFHEiGiAFIBRxcyAFIA1xcyANQR53IA1BE3dzIA1BCndzaiAMQQN2IAxBGXdzIAxBDndzIBdqIAdqIBJBD3cgEkENd3MgEkEKdnNqIhcgEGogDiAVaiIQIAYgCnNxIApzaiAQQRp3IBBBFXdzIBBBB3dzakGh0f+VemoiDmoiFUEedyAVQRN3cyAVQQp3cyAVIA0gFHNxIBpzaiAWQQN2IBZBGXdzIBZBDndzIAxqIANqIARBD3cgBEENd3MgBEEKdnNqIgwgCmogDiARaiIKIAYgEHNxIAZzaiAKQRp3IApBFXdzIApBB3dzakHLzOnAemoiEWoiDiAVcSIaIA0gFXFzIA0gDnFzIA5BHncgDkETd3MgDkEKd3NqIA9BA3YgD0EZd3MgD0EOd3MgFmogCWogF0EPdyAXQQ13cyAXQQp2c2oiFiAGaiAFIBFqIgYgCiAQc3EgEHNqIAZBGncgBkEVd3MgBkEHd3NqQfCWrpJ8aiIFaiIRQR53IBFBE3dzIBFBCndzIBEgDiAVc3EgGnNqIBlBA3YgGUEZd3MgGUEOd3MgD2ogCGogDEEPdyAMQQ13cyAMQQp2c2oiDyAQaiAFIBRqIhAgBiAKc3EgCnNqIBBBGncgEEEVd3MgEEEHd3NqQaOjsbt8aiIUaiIFIBFxIhogDiARcXMgBSAOcXMgBUEedyAFQRN3cyAFQQp3c2ogGEEDdiAYQRl3cyAYQQ53cyAZaiALaiAWQQ93IBZBDXdzIBZBCnZzaiIZIApqIA0gFGoiCiAGIBBzcSAGc2ogCkEadyAKQRV3cyAKQQd3c2pBmdDLjH1qIg1qIhRBHncgFEETd3MgFEEKd3MgFCAFIBFzcSAac2ogAkEDdiACQRl3cyACQQ53cyAYaiASaiAPQQ93IA9BDXdzIA9BCnZzaiIYIAZqIA0gFWoiBiAKIBBzcSAQc2ogBkEadyAGQRV3cyAGQQd3c2pBpIzktH1qIhVqIg0gFHEiGiAFIBRxcyAFIA1xcyANQR53IA1BE3dzIA1BCndzaiAbQQN2IBtBGXdzIBtBDndzIAJqIARqIBlBD3cgGUENd3MgGUEKdnNqIgIgEGogDiAVaiIQIAYgCnNxIApzaiAQQRp3IBBBFXdzIBBBB3dzakGF67igf2oiDmoiFUEedyAVQRN3cyAVQQp3cyAVIA0gFHNxIBpzaiATQQN2IBNBGXdzIBNBDndzIBtqIBdqIBhBD3cgGEENd3MgGEEKdnNqIhsgCmogDiARaiIKIAYgEHNxIAZzaiAKQRp3IApBFXdzIApBB3dzakHwwKqDAWoiEWoiDiAVcSIaIA0gFXFzIA0gDnFzIA5BHncgDkETd3MgDkEKd3NqIAdBA3YgB0EZd3MgB0EOd3MgE2ogDGogAkEPdyACQQ13cyACQQp2c2oiEyAGaiAFIBFqIgUgCiAQc3EgEHNqIAVBGncgBUEVd3MgBUEHd3NqQZaCk80BaiIRaiIGQR53IAZBE3dzIAZBCndzIAYgDiAVc3EgGnNqIBAgA0EDdiADQRl3cyADQQ53cyAHaiAWaiAbQQ93IBtBDXdzIBtBCnZzaiIQaiARIBRqIhEgBSAKc3EgCnNqIBFBGncgEUEVd3MgEUEHd3NqQYjY3fEBaiIUaiIHIAZxIhogBiAOcXMgByAOcXMgB0EedyAHQRN3cyAHQQp3c2ogCiAJQQN2IAlBGXdzIAlBDndzIANqIA9qIBNBD3cgE0ENd3MgE0EKdnNqIgpqIA0gFGoiAyAFIBFzcSAFc2ogA0EadyADQRV3cyADQQd3c2pBzO6hugJqIh1qIg1BHncgDUETd3MgDUEKd3MgDSAGIAdzcSAac2ogCEEDdiAIQRl3cyAIQQ53cyAJaiAZaiAQQQ93IBBBDXdzIBBBCnZzaiIUIAVqIBUgHWoiBSADIBFzcSARc2ogBUEadyAFQRV3cyAFQQd3c2pBtfnCpQNqIhVqIgkgDXEiGiAHIA1xcyAHIAlxcyAJQR53IAlBE3dzIAlBCndzaiARIAtBA3YgC0EZd3MgC0EOd3MgCGogGGogCkEPdyAKQQ13cyAKQQp2c2oiEWogDiAVaiIIIAMgBXNxIANzaiAIQRp3IAhBFXdzIAhBB3dzakGzmfDIA2oiHWoiDkEedyAOQRN3cyAOQQp3cyAOIAkgDXNxIBpzaiASQQN2IBJBGXdzIBJBDndzIAtqIAJqIBRBD3cgFEENd3MgFEEKdnNqIhUgA2ogBiAdaiIDIAUgCHNxIAVzaiADQRp3IANBFXdzIANBB3dzakHK1OL2BGoiGmoiCyAOcSIdIAkgDnFzIAkgC3FzIAtBHncgC0ETd3MgC0EKd3NqIARBA3YgBEEZd3MgBEEOd3MgEmogG2ogEUEPdyARQQ13cyARQQp2c2oiBiAFaiAHIBpqIhIgAyAIc3EgCHNqIBJBGncgEkEVd3MgEkEHd3NqQc+U89wFaiIHaiIFQR53IAVBE3dzIAVBCndzIAUgCyAOc3EgHXNqIBdBA3YgF0EZd3MgF0EOd3MgBGogE2ogFUEPdyAVQQ13cyAVQQp2c2oiGiAIaiAHIA1qIgQgAyASc3EgA3NqIARBGncgBEEVd3MgBEEHd3NqQfPfucEGaiIIaiIHIAVxIg0gBSALcXMgByALcXMgB0EedyAHQRN3cyAHQQp3c2ogDEEDdiAMQRl3cyAMQQ53cyAXaiAQaiAGQQ93IAZBDXdzIAZBCnZzaiIXIANqIAggCWoiAyAEIBJzcSASc2ogA0EadyADQRV3cyADQQd3c2pB7oW+pAdqIglqIghBHncgCEETd3MgCEEKd3MgCCAFIAdzcSANc2ogFkEDdiAWQRl3cyAWQQ53cyAMaiAKaiAaQQ93IBpBDXdzIBpBCnZzaiINIBJqIAkgDmoiDCADIARzcSAEc2ogDEEadyAMQRV3cyAMQQd3c2pB78aVxQdqIhJqIgkgCHEiDiAHIAhxcyAHIAlxcyAJQR53IAlBE3dzIAlBCndzaiAPQQN2IA9BGXdzIA9BDndzIBZqIBRqIBdBD3cgF0ENd3MgF0EKdnNqIhYgBGogCyASaiIEIAMgDHNxIANzaiAEQRp3IARBFXdzIARBB3dzakGU8KGmeGoiC2oiEkEedyASQRN3cyASQQp3cyASIAggCXNxIA5zaiAZQQN2IBlBGXdzIBlBDndzIA9qIBFqIA1BD3cgDUENd3MgDUEKdnNqIg8gA2ogBSALaiIDIAQgDHNxIAxzaiADQRp3IANBFXdzIANBB3dzakGIhJzmeGoiDWoiCyAScSIOIAkgEnFzIAkgC3FzIAtBHncgC0ETd3MgC0EKd3NqIBhBA3YgGEEZd3MgGEEOd3MgGWogFWogFkEPdyAWQQ13cyAWQQp2c2oiBSAMaiAHIA1qIgcgAyAEc3EgBHNqIAdBGncgB0EVd3MgB0EHd3NqQfr/+4V5aiIWaiIMQR53IAxBE3dzIAxBCndzIAwgCyASc3EgDnNqIAJBA3YgAkEZd3MgAkEOd3MgGGogBmogD0EPdyAPQQ13cyAPQQp2c2oiDyAEaiAIIBZqIgQgAyAHc3EgA3NqIARBGncgBEEVd3MgBEEHd3NqQevZwaJ6aiIYaiIIIAxxIhYgCyAMcXMgCCALcXMgCEEedyAIQRN3cyAIQQp3c2ogAiAbQQN2IBtBGXdzIBtBDndzaiAaaiAFQQ93IAVBDXdzIAVBCnZzaiADaiAJIBhqIgIgBCAHc3EgB3NqIAJBGncgAkEVd3MgAkEHd3NqQffH5vd7aiIDaiIJIAggDHNxIBZzaiAJQR53IAlBE3dzIAlBCndzaiAbIBNBA3YgE0EZd3MgE0EOd3NqIBdqIA9BD3cgD0ENd3MgD0EKdnNqIAdqIAMgEmoiGyACIARzcSAEc2ogG0EadyAbQRV3cyAbQQd3c2pB8vHFs3xqIhNqIQcgCSAgaiEgIAggImohIiAMICRqISQgCyAeaiATaiEeIBsgH2ohHyACICFqISEgBCAjaiEjIAFBQGsiASAlRw0ACwsgACAjNgIcIAAgITYCGCAAIB82AhQgACAeNgIQIAAgJDYCDCAAICI2AgggACAgNgIEIAAgBzYCAAuXOgEMfyMAQaAFayICJAAgAiABNgIEIAIgADYCAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQCABQX1qIgNBBksNAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADQQFrDgYCEgMSBAEACyAAQYCAwABGDQQgAEGAgMAAQQMQgwFFDQQgAEGogMAARg0FIABBqIDAAEEDEIMBRQ0FIABB0IDAAEcEQCAAQdCAwABBAxCDAQ0SCyACQZIEakIANwEAIAJBmgRqQQA7AQAgAkGcBGpCADcCACACQaQEakIANwIAIAJBrARqQgA3AgAgAkG0BGpCADcCACACQbwEakIANwIAIAJBxARqQQA6AAAgAkHFBGpBADYAACACQckEakEAOwAAIAJBywRqQQA6AAAgAkHAADYCiAQgAkEAOwGMBCACQQA2AY4EIAJBmAFqIAJBiARqQcQAEIsBGiACQagDaiIEIAJB1AFqKQIANwMAIAJBoANqIgUgAkHMAWopAgA3AwAgAkGYA2oiCSACQcQBaikCADcDACACQZADaiIKIAJBvAFqKQIANwMAIAJBiANqIgYgAkG0AWopAgA3AwAgAkGAA2oiByACQawBaikCADcDACACQfgCaiIIIAJBpAFqKQIANwMAIAIgAikCnAE3A/ACQeAAQQgQoQEiA0UNGSADQQA2AgggA0IANwMAIAMgAikD8AI3AgwgA0EUaiAIKQMANwIAIANBHGogBykDADcCACADQSRqIAYpAwA3AgAgA0EsaiAKKQMANwIAIANBNGogCSkDADcCACADQTxqIAUpAwA3AgAgA0HEAGogBCkDADcCACADQdQAakHIl8AAKQIANwIAIANBwJfAACkCADcCTEHUgMAAIQRBAAwSCyAAQfiAwABGDQUgAEH4gMAAQQkQgwFFDQUgAEGogcAARg0GIABBqIHAAEEJEIMBRQ0GIABB4ITAAEYNDSAAQeCEwAAgARCDAUUNDSAAQZCFwABGDQ4gAEGQhcAAIAEQgwFFDQ4gAEHAhcAARg0PIABBwIXAACABEIMBRQ0PIABB8IXAAEcEQCAAQfCFwAAgARCDAQ0RCyACQZgBakEAQcgBEJEBGiACQf4CakIANwEAIAJBhgNqQgA3AQAgAkGOA2pCADcBACACQZYDakIANwEAIAJBngNqQgA3AQAgAkGmA2pCADcBACACQa4DakIANwEAIAJBtgNqQQA2AQAgAkG6A2pBADsBACACQQA7AfQCIAJCADcB9gIgAkHIADYC8AIgAkGIBGogAkHwAmpBzAAQiwEaIAJBCGogAkGIBGpBBHJByAAQiwEaQZgCQQgQoQEiA0UNHiADIAJBmAFqQcgBEIsBIgRBADYCyAEgBEHMAWogAkEIakHIABCLARpB/IXAACEEQQAMEQsgAEHYgcAARwRAIAAoAABB89CFiwNHDRALIAJBkgRqQgA3AQAgAkGaBGpBADsBACACQZwEakIANwIAIAJBpARqQgA3AgAgAkGsBGpCADcCACACQbQEakIANwIAIAJBvARqQgA3AgAgAkHEBGpBADoAACACQcUEakEANgAAIAJByQRqQQA7AAAgAkHLBGpBADoAACACQcAANgKIBCACQQA7AYwEIAJBADYBjgQgAkGYAWogAkGIBGpBxAAQiwEaIAJBqANqIgQgAkHUAWopAgA3AwAgAkGgA2oiBSACQcwBaikCADcDACACQZgDaiIJIAJBxAFqKQIANwMAIAJBkANqIgogAkG8AWopAgA3AwAgAkGIA2oiBiACQbQBaikCADcDACACQYADaiIHIAJBrAFqKQIANwMAIAJB+AJqIgggAkGkAWopAgA3AwAgAiACKQKcATcD8AJB4ABBCBChASIDRQ0XIANCADcDACADQQA2AhwgAyACKQPwAjcDICADQfiXwAApAwA3AwggA0EQakGAmMAAKQMANwMAIANBGGpBiJjAACgCADYCACADQShqIAgpAwA3AwAgA0EwaiAHKQMANwMAIANBOGogBikDADcDACADQUBrIAopAwA3AwAgA0HIAGogCSkDADcDACADQdAAaiAFKQMANwMAIANB2ABqIAQpAwA3AwBB3IHAACEEQQAMEAsgAEGAgsAARg0FIABBgILAAEEGEIMBRQ0FIABBrILAAEYNBiAAQayCwABBBhCDAUUNBiAAQdiCwABGDQcgAEHYgsAAQQYQgwFFDQcgAEGEg8AARwRAIABBhIPAAEEGEIMBDQ8LIAJBADYCiAQgAkGIBGpBBHIhBEEAIQMDQCADIARqQQA6AAAgAiACKAKIBEEBajYCiAQgA0EBaiIDQYABRw0ACyACQZgBaiACQYgEakGEARCLARogAkHwAmogAkGYAWpBBHJBgAEQiwEaQdgBQQgQoQEiA0UNGCADQgA3AwggA0IANwMAIANBADYCUCADQZCZwAApAwA3AxAgA0EYakGYmcAAKQMANwMAIANBIGpBoJnAACkDADcDACADQShqQaiZwAApAwA3AwAgA0EwakGwmcAAKQMANwMAIANBOGpBuJnAACkDADcDACADQUBrQcCZwAApAwA3AwAgA0HIAGpByJnAACkDADcDACADQdQAaiACQfACakGAARCLARpBjIPAACEEQQAMDwsgAEGwg8AARg0HIAApAABC89CFm9PFjJk0UQ0HIABB3IPAAEYNCCAAKQAAQvPQhZvTxcyaNlENCCAAQYiEwABGDQkgACkAAELz0IWb0+WMnDRRDQkgAEG0hMAARwRAIAApAABC89CFm9OlzZgyUg0OCyACQZgBakEAQcgBEJEBGiACQf4CakIANwEAIAJBhgNqQgA3AQAgAkGOA2pCADcBACACQZYDakIANwEAIAJBngNqQgA3AQAgAkGmA2pCADcBACACQa4DakIANwEAIAJBtgNqQQA2AQAgAkG6A2pBADsBACACQQA7AfQCIAJCADcB9gIgAkHIADYC8AIgAkGIBGogAkHwAmpBzAAQiwEaIAJBCGogAkGIBGpBBHJByAAQiwEaQZgCQQgQoQEiA0UNGyADIAJBmAFqQcgBEIsBIgRBADYCyAEgBEHMAWogAkEIakHIABCLARpBvITAACEEQQAMDgsgAkGSBGpCADcBACACQZoEakEAOwEAIAJBEDYCiAQgAkEAOwGMBCACQQA2AY4EIAJBqAFqIgMgAkGYBGoiBCgCADYCACACQaABaiIJIAJBkARqIgUpAwA3AwAgAkHoAmoiBiACQaQBaikCADcDACACIAIpA4gENwOYASACIAIpApwBNwPgAiACQcABaiIHQgA3AwAgAkG4AWoiCEIANwMAIAJBsAFqIg1CADcDACADQgA3AwAgCUIANwMAIAJCADcDmAEgAkH6AmpCADcBACACQYIDakEAOwEAIAJBEDYC8AIgAkEAOwH0AiACQQA2AfYCIAQgAkGAA2ooAgA2AgAgBSACQfgCaiIKKQMANwMAIAJBEGoiCyACQZQEaikCADcDACACIAIpA/ACNwOIBCACIAIpAowENwMIIAJB0AFqIgwgCykDADcDACACIAIpAwg3A8gBIAogBikDADcDACACIAIpA+ACNwPwAiACQcAEaiIGIAwpAwA3AwAgAkG4BGoiCyACKQPIATcDACACQbAEaiIMIAcpAwA3AwAgAkGoBGoiByAIKQMANwMAIAJBoARqIgggDSkDADcDACAEIAMpAwA3AwAgBSAJKQMANwMAIAIgAikDmAE3A4gEQdQAQQQQoQEiA0UNDiADQQA2AgAgAyACKQPwAjcCBCADIAIpA4gENwIUIANBDGogCikDADcCACADQRxqIAUpAwA3AgAgA0EkaiAEKQMANwIAIANBLGogCCkDADcCACADQTRqIAcpAwA3AgAgA0E8aiAMKQMANwIAIANBxABqIAspAwA3AgAgA0HMAGogBikDADcCAEGEgMAAIQRBAAwNCyACQZIEakIANwEAIAJBmgRqQQA7AQAgAkGcBGpCADcCACACQaQEakIANwIAIAJBrARqQgA3AgAgAkG0BGpCADcCACACQbwEakIANwIAIAJBxARqQQA6AAAgAkHFBGpBADYAACACQckEakEAOwAAIAJBywRqQQA6AAAgAkHAADYCiAQgAkEAOwGMBCACQQA2AY4EIAJBmAFqIAJBiARqQcQAEIsBGiACQagDaiIEIAJB1AFqKQIANwMAIAJBoANqIgUgAkHMAWopAgA3AwAgAkGYA2oiCSACQcQBaikCADcDACACQZADaiIKIAJBvAFqKQIANwMAIAJBiANqIgYgAkG0AWopAgA3AwAgAkGAA2oiByACQawBaikCADcDACACQfgCaiIIIAJBpAFqKQIANwMAIAIgAikCnAE3A/ACQeAAQQgQoQEiA0UNEyADQQA2AgggA0IANwMAIAMgAikD8AI3AgwgA0EUaiAIKQMANwIAIANBHGogBykDADcCACADQSRqIAYpAwA3AgAgA0EsaiAKKQMANwIAIANBNGogCSkDADcCACADQTxqIAUpAwA3AgAgA0HEAGogBCkDADcCACADQdQAakHIl8AAKQIANwIAIANBwJfAACkCADcCTEGsgMAAIQRBAAwMCyACQZIEakIANwEAIAJBmgRqQQA7AQAgAkGcBGpCADcCACACQaQEakIANwIAIAJBrARqQgA3AgAgAkG0BGpCADcCACACQbwEakIANwIAIAJBxARqQQA6AAAgAkHFBGpBADYAACACQckEakEAOwAAIAJBywRqQQA6AAAgAkHAADYCiAQgAkEAOwGMBCACQQA2AY4EIAJBmAFqIAJBiARqQcQAEIsBGiACQagDaiIEIAJB1AFqKQIANwMAIAJBoANqIgUgAkHMAWopAgA3AwAgAkGYA2oiCSACQcQBaikCADcDACACQZADaiIKIAJBvAFqKQIANwMAIAJBiANqIgYgAkG0AWopAgA3AwAgAkGAA2oiByACQawBaikCADcDACACQfgCaiIIIAJBpAFqKQIANwMAIAIgAikCnAE3A/ACQeAAQQgQoQEiA0UNEiADQgA3AwAgA0EANgIcIAMgAikD8AI3AyAgA0H4l8AAKQMANwMIIANBEGpBgJjAACkDADcDACADQRhqQYiYwAAoAgA2AgAgA0EoaiAIKQMANwMAIANBMGogBykDADcDACADQThqIAYpAwA3AwAgA0FAayAKKQMANwMAIANByABqIAkpAwA3AwAgA0HQAGogBSkDADcDACADQdgAaiAEKQMANwMAQYSBwAAhBEEADAsLIAJBkgRqQgA3AQAgAkGaBGpBADsBACACQZwEakIANwIAIAJBpARqQgA3AgAgAkGsBGpCADcCACACQbQEakIANwIAIAJBvARqQgA3AgAgAkHEBGpBADoAACACQcUEakEANgAAIAJByQRqQQA7AAAgAkHLBGpBADoAACACQcAANgKIBCACQQA7AYwEIAJBADYBjgQgAkGYAWogAkGIBGpBxAAQiwEaIAJBqANqIgQgAkHUAWopAgA3AwAgAkGgA2oiBSACQcwBaikCADcDACACQZgDaiIJIAJBxAFqKQIANwMAIAJBkANqIgogAkG8AWopAgA3AwAgAkGIA2oiBiACQbQBaikCADcDACACQYADaiIHIAJBrAFqKQIANwMAIAJB+AJqIgggAkGkAWopAgA3AwAgAiACKQKcATcD8AJB+ABBCBChASIDRQ0MIANCADcDACADQQA2AjAgAyACKQPwAjcCNCADQdCXwAApAwA3AwggA0EQakHYl8AAKQMANwMAIANBGGpB4JfAACkDADcDACADQSBqQeiXwAApAwA3AwAgA0EoakHwl8AAKQMANwMAIANBPGogCCkDADcCACADQcQAaiAHKQMANwIAIANBzABqIAYpAwA3AgAgA0HUAGogCikDADcCACADQdwAaiAJKQMANwIAIANB5ABqIAUpAwA3AgAgA0HsAGogBCkDADcCAEG0gcAAIQRBAAwKCyACQZIEakIANwEAIAJBmgRqQQA7AQAgAkGcBGpCADcCACACQaQEakIANwIAIAJBrARqQgA3AgAgAkG0BGpCADcCACACQbwEakIANwIAIAJBxARqQQA6AAAgAkHFBGpBADYAACACQckEakEAOwAAIAJBywRqQQA6AAAgAkHAADYCiAQgAkEAOwGMBCACQQA2AY4EIAJBmAFqIAJBiARqQcQAEIsBGiACQagDaiIEIAJB1AFqKQIANwMAIAJBoANqIgUgAkHMAWopAgA3AwAgAkGYA2oiCSACQcQBaikCADcDACACQZADaiIKIAJBvAFqKQIANwMAIAJBiANqIgYgAkG0AWopAgA3AwAgAkGAA2oiByACQawBaikCADcDACACQfgCaiIIIAJBpAFqKQIANwMAIAIgAikCnAE3A/ACQfAAQQgQoQEiA0UNESADQQA2AgggA0IANwMAIAMgAikD8AI3AgwgA0EUaiAIKQMANwIAIANBHGogBykDADcCACADQSRqIAYpAwA3AgAgA0EsaiAKKQMANwIAIANBNGogCSkDADcCACADQTxqIAUpAwA3AgAgA0HEAGogBCkDADcCACADQeQAakGkmMAAKQIANwIAIANB3ABqQZyYwAApAgA3AgAgA0HUAGpBlJjAACkCADcCACADQYyYwAApAgA3AkxBiILAACEEQQAMCQsgAkGSBGpCADcBACACQZoEakEAOwEAIAJBnARqQgA3AgAgAkGkBGpCADcCACACQawEakIANwIAIAJBtARqQgA3AgAgAkG8BGpCADcCACACQcQEakEAOgAAIAJBxQRqQQA2AAAgAkHJBGpBADsAACACQcsEakEAOgAAIAJBwAA2AogEIAJBADsBjAQgAkEANgGOBCACQZgBaiACQYgEakHEABCLARogAkGoA2oiBCACQdQBaikCADcDACACQaADaiIFIAJBzAFqKQIANwMAIAJBmANqIgkgAkHEAWopAgA3AwAgAkGQA2oiCiACQbwBaikCADcDACACQYgDaiIGIAJBtAFqKQIANwMAIAJBgANqIgcgAkGsAWopAgA3AwAgAkH4AmoiCCACQaQBaikCADcDACACIAIpApwBNwPwAkHwAEEIEKEBIgNFDRAgA0EANgIIIANCADcDACADIAIpA/ACNwIMIANBFGogCCkDADcCACADQRxqIAcpAwA3AgAgA0EkaiAGKQMANwIAIANBLGogCikDADcCACADQTRqIAkpAwA3AgAgA0E8aiAFKQMANwIAIANBxABqIAQpAwA3AgAgA0HkAGpBxJjAACkCADcCACADQdwAakG8mMAAKQIANwIAIANB1ABqQbSYwAApAgA3AgAgA0GsmMAAKQIANwJMQbSCwAAhBEEADAgLIAJBADYCiAQgAkGIBGpBBHIhBEEAIQMDQCADIARqQQA6AAAgAiACKAKIBEEBajYCiAQgA0EBaiIDQYABRw0ACyACQZgBaiACQYgEakGEARCLARogAkHwAmogAkGYAWpBBHJBgAEQiwEaQdgBQQgQoQEiA0UNECADQgA3AwggA0IANwMAIANBADYCUCADQdCYwAApAwA3AxAgA0EYakHYmMAAKQMANwMAIANBIGpB4JjAACkDADcDACADQShqQeiYwAApAwA3AwAgA0EwakHwmMAAKQMANwMAIANBOGpB+JjAACkDADcDACADQUBrQYCZwAApAwA3AwAgA0HIAGpBiJnAACkDADcDACADQdQAaiACQfACakGAARCLARpB4ILAACEEQQAMBwsgAkGYAWpBAEHIARCRARogAkEANgLwAkEEIQMDQCACQfACaiADakEAOgAAIAIgAigC8AJBAWo2AvACIANBAWoiA0GUAUcNAAsgAkGIBGogAkHwAmpBlAEQiwEaIAJBCGogAkGIBGpBBHJBkAEQiwEaQeACQQgQoQEiA0UNECADIAJBmAFqQcgBEIsBIgRBADYCyAEgBEHMAWogAkEIakGQARCLARpBuIPAACEEQQAMBgsgAkGYAWpBAEHIARCRARogAkEANgLwAkEEIQMDQCACQfACaiADakEAOgAAIAIgAigC8AJBAWo2AvACIANBAWoiA0GMAUcNAAsgAkGIBGogAkHwAmpBjAEQiwEaIAJBCGogAkGIBGpBBHJBiAEQiwEaQdgCQQgQoQEiA0UNECADIAJBmAFqQcgBEIsBIgRBADYCyAEgBEHMAWogAkEIakGIARCLARpB5IPAACEEQQAMBQsgAkGYAWpBAEHIARCRARogAkEANgLwAkEEIQMDQCACQfACaiADakEAOgAAIAIgAigC8AJBAWo2AvACIANBAWoiA0HsAEcNAAsgAkGIBGogAkHwAmpB7AAQiwEaIAJBCGogAkGIBGpBBHJB6AAQiwEaQbgCQQgQoQEiA0UNECADIAJBmAFqQcgBEIsBIgRBADYCyAEgBEHMAWogAkEIakHoABCLARpBkITAACEEQQAMBAsgAkGYAWpBAEHIARCRARogAkEA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aiIBIAIgBHNzakHglu21f2pBEHcgAWoiAyABcyACIApqIAEgBHMgA3NqQfD4/vV7akEXdyADaiICc2pBxv3txAJqQQR3IAJqIgRqIAMgC2ogASATaiACIANzIARzakH6z4TVfmpBC3cgBGoiASACIARzc2pBheG8p31qQRB3IAFqIgMgAXMgAiAGaiABIARzIANzakGFuqAkakEXdyADaiICc2pBuaDTzn1qQQR3IAJqIgRqIAIgDGogASAJaiACIANzIARzakHls+62fmpBC3cgBGoiASAEcyADIBJqIAIgBHMgAXNqQfj5if0BakEQdyABaiICc2pB5ayxpXxqQRd3IAJqIgMgAUF/c3IgAnNqQcTEpKF/akEGdyADaiIEaiADIBVqIAIgCGogASAOaiAEIAJBf3NyIANzakGX/6uZBGpBCncgBGoiASADQX9zciAEc2pBp8fQ3HpqQQ93IAFqIgIgBEF/c3IgAXNqQbnAzmRqQRV3IAJqIgMgAUF/c3IgAnNqQcOz7aoGakEGdyADaiIEaiADIBRqIAIgCmogASALaiAEIAJBf3NyIANzakGSmbP4eGpBCncgBGoiASADQX9zciAEc2pB/ei/f2pBD3cgAWoiAiAEQX9zciABc2pB0buRrHhqQRV3IAJqIgMgAUF/c3IgAnNqQc/8of0GakEGdyADaiIEaiADIBFqIAIgBmogASASaiAEIAJBf3NyIANzakHgzbNxakEKdyAEaiIBIANBf3NyIARzakGUhoWYempBD3cgAWoiAiAEQX9zciABc2pBoaOg8ARqQRV3IAJqIgMgAUF/c3IgAnNqQYL9zbp/akEGdyADaiIEIAAoAgBqNgIAIAAgASAQaiAEIAJBf3NyIANzakG15Ovpe2pBCncgBGoiASAAKAIMajYCDCAAIAIgDGogASADQX9zciAEc2pBu6Xf1gJqQQ93IAFqIgIgACgCCGo2AgggACACIAAoAgRqIAMgD2ogAiAEQX9zciABc2pBkaeb3H5qQRV3ajYCBAvcDwEFfyAAIAEtAAAiAzoAECAAIAEtAAEiAjoAESAAIAEtAAIiBDoAEiAAIAEtAAMiBToAEyAAIAEtAAQiBjoAFCAAIAMgAC0AAHM6ACAgACACIAAtAAFzOgAhIAAgBCAALQACczoAIiAAIAUgAC0AA3M6ACMgACAGIAAt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BCARIAEgA0F/c3EgAyAEcXIgAmpqQQd3IgVBf3NxIAMgBXFyIAFqakELdyIBIAVyIBIgBCABIAVxIgQgAyABQX9zcXJqakETdyICcSAEcmogFGpBmfOJ1AVqQQN3IgMgByABIAUgAyABIAJycSABIAJxcmogDWpBmfOJ1AVqQQV3IgQgAiADcnEgAiADcXJqakGZ84nUBWpBCXciASAEciAJIAIgASADIARycSADIARxcmpqQZnzidQFakENdyICcSABIARxcmogDGpBmfOJ1AVqQQN3IgMgDyABIAQgAyABIAJycSABIAJxcmogFWpBmfOJ1AVqQQV3IgQgAiADcnEgAiADcXJqakGZ84nUBWpBCXciASAEciARIAIgASADIARycSADIARxcmpqQZnzidQFakENdyICcSABIARxcmogC2pBmfOJ1AVqQQN3IgMgCiABIAYgBCADIAEgAnJxIAEgAnFyampBmfOJ1AVqQQV3IgQgAiADcnEgAiADcXJqakGZ84nUBWpBCXciASAEciAIIAIgASADIARycSADIARxcmpqQZnzidQFakENdyICcSABIARxcmogE2pBmfOJ1AVqQQN3IgMgEiACIBAgASAOIAQgAyABIAJycSABIAJxcmpqQZnzidQFakEFdyIEIAIgA3JxIAIgA3FyampBmfOJ1AVqQQl3IgUgAyAEcnEgAyAEcXJqakGZ84nUBWpBDXciAyAFcyICIARzaiAUakGh1+f2BmpBA3ciASAJIAMgASAHIAQgASACc2pqQaHX5/YGakEJdyICcyAFIA1qIAEgA3MgAnNqQaHX5/YGakELdyIEc2pqQaHX5/YGakEPdyIDIARzIgUgAnNqIAtqQaHX5/YGakEDdyIBIAggAyABIAogAiABIAVzampBodfn9gZqQQl3IgJzIAQgBmogASADcyACc2pBodfn9gZqQQt3IgRzampBodfn9gZqQQ93IgMgBHMiBSACc2ogDGpBodfn9gZqQQN3IgEgESADIAEgDyACIAEgBXNqakGh1+f2BmpBCXciAnMgBCAVaiABIANzIAJzakGh1+f2BmpBC3ciBHNqakGh1+f2BmpBD3ciAyAEcyIFIAJzaiATakGh1+f2BmpBA3ciASAAKAIAajYCACAAIBAgAiABIAVzampBodfn9gZqQQl3IgIgACgCDGo2Agwg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IgVFDQULIAIgBDYCFCACIAU2AhALIAIoAhAhBSACQThqIgZCADcDACACQTBqIgdCADcDACACQShqIghCADcDACACQSBqIglCADcDACACQRhqIgpCADcDACACQgA3AxAgAkHqAGpCADcBACACQfIAakEAOwEAIAJBEDYCYCACQQA7AWQgAkEANgFmIAJBiAFqIAJB8ABqKAIANgIAIAJBgAFqIAJB6ABqKQMANwMAIAJB2ABqIgsgAkGEAWopAgA3AwAgAiACKQNgNwN4IAIgAikCfDcDUCACQcgAaiIMIAspAwA3AwAgAiACKQNQNwNAIANBOGogDCkDADcAACADQTBqIAIpA0A3AAAgA0EoaiAGKQMANwAAIANBIGogBykDADcAACADQRhqIAgpAwA3AAAgA0EQaiAJKQMANwAAIANBCGogCikDADcAACADIAIpAxA3AAAgAUEANgIAIAAgBDYCBCAAIAU2AgAgAkGQAWokAA8LQbCawABBFyACQRBqQaCXwABBsJfAABB5AAtBEEEBQbSlwAAoAgAiAEECIAAbEQAAAAtBh4zAAEEkQayMwAAQiAEACyAEQQFBtKXAACgCACIAQQIgABsRAAAAC9gIAQV/IABBeGoiASAAQXxqKAIAIgNBeHEiAGohAgJAAkACQAJAIANBAXENACADQQNxRQ0BIAEoAgAiAyAAaiEAIAEgA2siAUH8pMAAKAIARgRAIAIoAgRBA3FBA0cNAUH0pMAAIAA2AgAgAiACKAIEQX5xNgIEIAEgAEEBcjYCBCAAIAFqIAA2AgAPCyABIAMQTAsCQCACQQRqIgQoAgAiA0ECcQRAIAQgA0F+cTYCACABIABBAXI2AgQgACABaiAANgIADAELAkAgAkGApcAAKAIARwRAQfykwAAoAgAgAkYNASACIANBeHEiAhBMIAEgACACaiIAQQFyNgIEIAAgAWogADYCACABQfykwAAoAgBHDQJB9KTAACAANgIADwtBgKXAACABNgIAQfikwABB+KTAACgCACAAaiIANgIAIAEgAEEBcjYCBEH8pMAAKAIAIAFGBEBB9KTAAEEANgIAQfykwABBADYCAAtBnKXAACgCACICIABPDQJBgKXAACgCACIARQ0CAkBB+KTAACgCACIDQSlJDQBBjKXAACEBA0AgASgCACIEIABNBEAgBCABKAIE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KQMwNwNoIAJBIGogAkGMAWopAgA3AwAgAkEYaiACQYQBaikCADcDACACQRBqIAJB/ABqKQIANwMAIAJBCGogAkH0AGopAgA3AwAgAkEoaiACQZQBaikCADcDACACIAIpAmw3AwAgASACEB8gAUIANwMIIAFCADcDACABQQA2AlAgAUHQmMAAKQMANwMQIAFBGGpB2JjAACkDADcDACABQSBqQeCYwAApAwA3AwAgAUEoakHomMAAKQMANwMAIAFBMGpB8JjAACkDADcDACABQThqQfiYwAApAwA3AwAgAUFAa0GAmcAAKQMANwMAIAFByABqQYiZwAApAwA3AwACQAJAQTBBARChASIDBEAgAkIwNwJsIAIgAzYCaCACQegAaiACQTAQXgJAIAIoAmwiBCACKAJwIgNGBEAgBCEDDAELIAQgA0kNAiAERQ0AIAIoAmghBQJAIANFBEAgBRAQQQEhBAwBCyAFIARBASADEJoBIgRFDQQLIAIgAzYCbCACIAQ2AmgLIAIoAmghBCABQgA3AwggAUIANwMAIAFBADYCUCABQRBqIgFB0JjAACkDADcDACABQQhqQdiYwAApAwA3AwAgAUEQakHgmMAAKQMANwMAIAFBGGpB6JjAACkDADcDACABQSBqQfCYwAApAwA3AwAgAUEoakH4mMAAKQMANwMAIAFBMGpBgJnAACkDADcDACABQThqQYiZwAApAwA3AwAgACADNgIEIAAgBDYCACACQaABaiQADwtBMEEBQbSlwAAoAgAiAEECIAAbEQAAAAtBh4zAAEEkQayMwAAQiAEACyADQQFBtKXAACgCACIAQQIgABsRAAAAC78GAQR/IAAgAWohAgJAAkACQAJAAkAgAEEEaigCACIDQQFxDQAgA0EDcUUNASAAKAIAIgMgAWohASAAIANrIgBB/KTAACgCAEYEQCACKAIEQQNxQQNHDQFB9KTAACABNgIAIAIgAigCBEF+cTYCBCAAIAFBAXI2AgQgAiABNgIADwsgACADEEwLAkAgAkEEaigCACIDQQJxBEAgAkEEaiADQX5xNgIAIAAgAUEBcjYCBCAAIAFqIAE2AgAMAQsCQCACQYClwAAoAgBHBEBB/KTAACgCACACRg0BIAIgA0F4cSICEEwgACABIAJqIgFBAXI2AgQgACABaiABNgIAIABB/KTAACgCAEcNAkH0pMAAIAE2AgAPC0GApcAAIAA2AgBB+KTAAEH4pMAAKAIAIAFqIgE2AgAgACABQQFyNgIEIABB/KTAACgCAEcNAkH0pMAAQQA2AgBB/KTAAEEANgIADwtB/KTAACAANgIAQfSkwABB9KTAACgCACABaiIBNgIAIAAgAUEBcjYCBCAAIAFqIAE2AgAPCyABQYACSQ0DIABCADcCECAAQRxqAn9BACABQQh2IgNFDQAaQR8gAUH///8HSw0AGiABQQYgA2ciAmtBH3F2QQFxIAJBAXRrQT5qCyICNgIAIAJBAnRB9KPAAGohAwJAAkBB6KHAACgCACIEQQEgAkEfcXQiBXEEQCADKAIAIgNBBGooAgBBeHEgAUcNASADIQIMAgtB6KHAACAEIAVyNgIAIAMgADYCAAwECyABQQBBGSACQQF2a0EfcSACQR9GG3QhBANAIAMgBEEddkEEcWpBEGoiBSgCACICRQ0DIARBAXQhBCACIQMgAkEEaigCAEF4cSABRw0ACwsgAigCCCIBIAA2AgwgAiAANgIIIABBGGpBADYCACAAIAI2AgwgACABNgIICw8LIAUgADYCAAsgAEEYaiADNgIAIAAgADYCDCAAIAA2AggPCyABQQN2IgJBA3RB7KHAAGohAQJ/QeShwAAoAgAiA0EBIAJ0IgJxBEAgASgCCAwBC0HkocAAIAIgA3I2AgAgAQshAiABIAA2AgggAiAANgIMIAAgATYCDCAAIAI2AggL1AYBBH8jAEHQAWsiAiQAIAJBygBqQgA3AQAgAkHSAGpBADsBACACQdQAakIANwIAIAJB3ABqQgA3AgAgAkHkAGpCADcCACACQewAakIANwIAIAJB9ABqQgA3AgAgAkH8AGpBADoAACACQf0AakEANgAAIAJBgQFqQQA7AAAgAkGDAWpBADoAACACQQA7AUQgAkEANgFGIAJBwAA2AkAgAkGIAWogAkFAa0HEABCLARogAkE4aiACQcQBaikCADcDACACQTBqIAJBvAFqKQIANwMAIAJBKGogAkG0AWopAgA3AwAgAkEgaiACQawBaikCADcDACACQRhqIAJBpAFqKQIANwMAIAJBEGogAkGcAWopAgA3AwAgAkEIaiACQZQBaikCADcDACACIAIpAowBNwMAIAEgAhARIAFCADcDCCABQgA3AwAgAUEANgJQIAFBkJnAACkDADcDECABQRhqQZiZwAApAwA3AwAgAUEgakGgmcAAKQMANwMAIAFBKGpBqJnAACkDADcDACABQTBqQbCZwAApAwA3AwAgAUE4akG4mcAAKQMANwMAIAFBQGtBwJnAACkDADcDACABQcgAakHImcAAKQMANwMAAkACQEHAAEEBEKEBIgMEQCACQsAANwKMASACIAM2AogBIAJBiAFqIAJBwAAQXgJAIAIoAowBIgQgAigCkAEiA0YEQCAEIQMMAQsgBCADSQ0CIARFDQAgAigCiAEhBQJAIANFBEAgBRAQQQEhBAwBCyAFIARBASADEJoBIgRFDQQLIAIgAzYCjAEgAiAENgKIAQsgAigCiAEhBCABQgA3AwggAUIANwMAIAFBADYCUCABQRBqIgFBkJnAACkDADcDACABQQhqQZiZwAApAwA3AwAgAUEQakGgmcAAKQMANwMAIAFBGGpBqJnAACkDADcDACABQSBqQbCZwAApAwA3AwAgAUEoakG4mcAAKQMANwMAIAFBMGpBwJnAACkDADcDACABQThqQciZwAApAwA3AwAgACADNgIEIAAgBDYCACACQdABaiQADwtBwABBAUG0pcAAKAIAIgBBAiAAGxEAAAALQYeMwABBJEGsjMAAEIgBAAsgA0EBQbSlwAAoAgAiAEECIAAbEQAAAAuOBgEKfyMAQTBrIgIkACACQSRqQYCHwAA2AgAgAkEDOgAoIAJCgICAgIAENwMIIAIgADYCICACQQA2AhggAkEANgIQAn8CQAJAAkAgASgCCCIDBEAgASgCACEFIAEoAgQiCCABQQxqKAIAIgYgBiAISxsiBkUNASABQRRqKAIAIQcgASgCECEJIAAgBSgCACAFKAIEQYyHwAAoAgARAwANAyAFQQhqIQECQAJAA0AgAiADQQRqKAIANgIMIAIgA0Ecai0AADoAKCACIANBCGooAgA2AgggA0EYaigCACEAQQAhBAJAAkACQCADQRRqKAIAQQFrDgIAAgELIAAgB08NAyAAQQN0IAlqIgooAgRBA0cNASAKKAIAKAIAIQALQQEhBAsgAiAANgIUIAIgBDYCECADQRBqKAIAIQBBACEEAkACQAJAIANBDGooAgBBAWsOAgACAQsgACAHTw0EIABBA3QgCWoiCigCBEEDRw0BIAooAgAoAgAh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IQEgACgCGCEAA0AgBkF/aiIGRQRAQQAPCyAAIAcgASgCEBEBAEUNAAsLIAULtwUBBH8jAEGQAWsiAiQAIAJBOmpCADcBACACQcIAakEAOwEAIAJBxABqQgA3AgAgAkHMAGpCADcCACACQdQAakIANwIAIAJBADsBNCACQQA2ATYgAkEoNgIwIAJBgAFqIAJB0ABqKQMANwMAIAJB+ABqIAJByABqKQMANwMAIAJB8ABqIAJBQGspAwA3AwAgAkHoAGogAkE4aikDADcDACACQYgBaiACQdgAaigCADYCACACIAIpAzA3A2AgAkEgaiACQfwAaikCADcDACACQRhqIAJB9ABqKQIANwMAIAJBEGogAkHsAGopAgA3AwAgAkEoaiACQYQBaikCADcDACACIAIpAmQ3AwggASACQQhqEE0gAUIANwMAIAFBADYCMCABQdCXwAApAwA3AwggAUEQakHYl8AAKQMANwMAIAFBGGpB4JfAACkDADcDACABQSBqQeiXwAApAwA3AwAgAUEoakHwl8AAKQMANwMAAkACQEEoQQEQoQEiAwRAIAJCKDcCZCACIAM2AmAgAkHgAGogAkEIakEoEF4CQCACKAJkIgQgAigCaCIDRgRAIAQhAwwBCyAEIANJDQIgBEUNACACKAJgIQUCQCADRQRAIAUQEEEBIQQMAQsgBSAEQQEgAxCaASIERQ0ECyACIAM2AmQgAiAENgJgCyACKAJgIQQgAUIANwMAIAFBADYCMCABQQhqIgFB0JfAACkDADcDACABQQhqQdiXwAApAwA3AwAgAUEQakHgl8AAKQMANwMAIAFBGGpB6JfAACkDADcDACABQSBqQfCXwAApAwA3AwAgACADNgIEIAAgBDYCACACQZABaiQADwtBKEEBQbSlwAAoAgAiAEECIAAbEQAAAAtBh4zAAEEkQayMwAAQiAEACyADQQFBtKXAACgCACIAQQIgABsRAAAAC8YEAQR/IwBBoAFrIgIkACACQTpqQgA3AQAgAkHCAGpBADsBACACQcQAakIANwIAIAJBzABqQgA3AgAgAkHUAGpCADcCACACQdwAakIANwIAIAJBADsBNCACQQA2ATYgAkEwNgIwIAJBkAFqIAJB2ABqKQMANwMAIAJBiAFqIAJB0ABqKQMANwMAIAJBgAFqIAJByABqKQMANwMAIAJB+ABqIAJBQGspAwA3AwAgAkHwAGogAkE4aikDADcDACACQZgBaiACQeAAaigCADYCACACIAIpAzA3A2ggAkEgaiACQYwBaikCADcDACACQRhqIAJBhAFqKQIANwMAIAJBEGogAkH8AGopAgA3AwAgAkEIaiACQfQAaikCADcDACACQShqIAJBlAFqKQIANwMAIAIgAikCbDcDACABIAIQYyABQQBByAEQkQEiBUEANgLIAQJAAkBBMEEBEKEBIgEEQCACQjA3AmwgAiABNgJoIAJB6ABqIAJBMBBeAkAgAigCbCIDIAIoAnAiAUYEQCADIQEMAQsgAyABSQ0CIANFDQAgAigCaCEEAkAgAUUEQCAEEBBBASEDDAELIAQgA0EBIAEQmgEiA0UNBAsgAiABNgJsIAIgAzYCaAsgAigCaCEDIAVBAEHIARCRAUEANgLIASAAIAE2AgQgACADNgIAIAJBoAFqJAAPC0EwQQFBtKXAACgCACIAQQIgABsRAAAAC0GHjMAAQSRBrIzAABCIAQALIAFBAUG0pcAAKAIAIgBBAiAAGxEAAAALxgQBBH8jAEGgAWsiAiQAIAJBOmpCADcBACACQcIAakEAOwEAIAJBxABqQgA3AgAgAkHMAGpCADcCACACQdQAakIANwIAIAJB3ABqQgA3AgAgAkEAOwE0IAJBADYBNiACQTA2AjAgAkGQAWogAkHYAGopAwA3AwAgAkGIAWogAkHQAGopAwA3AwAgAkGAAWogAkHIAGopAwA3AwAgAkH4AGogAkFAaykDADcDACACQfAAaiACQThqKQMANwMAIAJBmAFqIAJB4ABqKAIANgIAIAIgAikDMDcDaCACQSBqIAJBjAFqKQIANwMAIAJBGGogAkGEAWopAgA3AwAgAkEQaiACQfwAaikCADcDACACQQhqIAJB9ABqKQIANwMAIAJBKGogAkGUAWopAgA3AwAgAiACKQJsNwMAIAEgAhBkIAFBAEHIARCRASIFQQA2AsgBAkACQEEwQQEQoQEiAQRAIAJCMDcCbCACIAE2AmggAkHoAGogAkEwEF4CQCACKAJsIgMgAigCcCIBRgRAIAMhAQwBCyADIAFJDQIgA0UNACACKAJoIQQCQCABRQRAIAQQEEEBIQMMAQsgBCADQQEgARCaASIDRQ0ECyACIAE2AmwgAiADNgJoCyACKAJoIQMgBUEAQcgBEJEBQQA2AsgBIAAgATYCBCAAIAM2AgAgAkGgAWokAA8LQTBBAUG0pcAAKAIAIgBBAiAAGxEAAAALQYeMwABBJEGsjMAAEIgBAAsgAUEBQbSlwAAoAgAiAEECIAAbEQAAAAu8BAEEfyMAQaADayICJAAgAkHyAmpCADcBACACQfoCakEAOwEAIAJB/AJqQgA3AgAgAkGEA2pCADcCACACQYwDakIANwIAIAJBlANqQgA3AgAgAkEAOwHsAiACQQA2Ae4CIAJBMDYC6AIgAkHYAGogAkGQA2opAwA3AwAgAkHQAGogAkGIA2opAwA3AwAgAkHIAGogAkGAA2opAwA3AwAgAkFAayACQfgCaikDADcDACACQThqIAJB8AJqKQMANwMAIAJB4ABqIAJBmANqKAIANgIAIAIgAikD6AI3AzAgAkEgaiACQdQAaikCADcDACACQRhqIAJBzABqKQIANwMAIAJBEGogAkHEAGopAgA3AwAgAkEIaiACQTxqKQIANwMAIAJBKGogAkHcAGopAgA3AwAgAiACKQI0NwMAIAJBMGogAUG4AhCLARogAkEwaiACEGMCQAJAQTBBARChASIDBEAgAkIwNwI0IAIgAzYCMCACQTBqIAJBMBBeAkAgAigCNCIEIAIoAjgiA0YEQCAEIQMMAQsgBCADSQ0CIARFDQAgAigCMCEFAkAgA0UEQCAFEBBBASEEDAELIAUgBEEBIAMQmgEiBEUNBAsgAiADNgI0IAIgBDYCMAsgAigCMCEEIAEQECAAIAM2AgQgACAENgIAIAJBoANqJAAPC0EwQQFBtKXAACgCACIAQQIgABsRAAAAC0GHjMAAQSRBrIzAABCIAQALIANBAUG0pcAAKAIAIgBBAiAAGxEAAAALvAQBBH8jAEGgA2siAiQAIAJB8gJqQgA3AQAgAkH6AmpBADsBACACQfwCakIANwIAIAJBhANqQgA3AgAgAkGMA2pCADcCACACQZQDakIANwIAIAJBADsB7AIgAkEANgHuAiACQTA2AugCIAJB2ABqIAJBkANqKQMANwMAIAJB0ABqIAJBiANqKQMANwMAIAJByABqIAJBgANqKQMANwMAIAJBQGsgAkH4AmopAwA3AwAgAkE4aiACQfACaikDADcDACACQeAAaiACQZgDaigCADYCACACIAIpA+gCNwMwIAJBIGogAkHUAGopAgA3AwAgAkEYaiACQcwAaikCADcDACACQRBqIAJBxABqKQIANwMAIAJBCGogAkE8aikCADcDACACQShqIAJB3ABqKQIANwMAIAIgAikCNDcDACACQTBqIAFBuAIQiwEaIAJBMGogAhBkAkACQEEwQQEQoQEiAwRAIAJCMDcCNCACIAM2AjAgAkEwaiACQTAQXgJAIAIoAjQiBCACKAI4IgNGBEAgBCEDDAELIAQgA0kNAiAERQ0AIAIoAjAhBQJAIANFBEAgBRAQQQEhBAwBCyAFIARBASADEJoBIgRFDQQLIAIgAzYCNCACIAQ2AjALIAIoAjAhBCABEBAgACADNgIEIAAgBDYCACACQaADaiQADwtBMEEBQbSlwAAoAgAiAEECIAAbEQAAAAtBh4zAAEEkQayMwAAQiAEACyADQQFBtKXAACgCACIAQQIgABsRAAAAC7wEAQR/IwBBwAJrIgIkACACQZICakIANwEAIAJBmgJqQQA7AQAgAkGcAmpCADcCACACQaQCakIANwIAIAJBrAJqQgA3AgAgAkG0AmpCADcCACACQQA7AYwCIAJBADYBjgIgAkEwNgKIAiACQdgAaiACQbACaikDADcDACACQdAAaiACQagCaikDADcDACACQcgAaiACQaACaikDADcDACACQUBrIAJBmAJqKQMANwMAIAJBOGogAkGQAmopAwA3AwAgAkHgAGogAkG4AmooAgA2AgAgAiACKQOIAjcDMCACQSBqIAJB1ABqKQIANwMAIAJBGGogAkHMAGopAgA3AwAgAkEQaiACQcQAaikCADcDACACQQhqIAJBPGopAgA3AwAgAkEoaiACQdwAaikCADcDACACIAIpAjQ3AwAgAkEwaiABQdgBEIsBGiACQTBqIAIQHwJAAkBBMEEBEKEBIgMEQCACQjA3AjQgAiADNgIwIAJBMGogAkEwEF4CQCACKAI0IgQgAigCOCIDRgRAIAQhAwwBCyAEIANJDQIgBEUNACACKAIwIQUCQCADRQRAIAUQEEEBIQQMAQsgBSAEQQEgAxCaASIERQ0ECyACIAM2AjQgAiAENgIwCyACKAIwIQQgARAQIAAgAzYCBCAAIAQ2AgAgAkHAAmokAA8LQTBBAUG0pcAAKAIAIgBBAiAAGxEAAAALQYeMwABBJEGs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AkHwAGokAA8LQSBBAUG0pcAAKAIAIgBBAiAAGxEAAAALQYeMwABBJEGsjMAAEIgBAAsgA0EBQbSlwAAoAgAiAEECIAAbEQAAAAvMBAEEfyMAQdABayICJAAgAkHKAGpCADcBACACQdIAakEAOwEAIAJB1ABqQgA3AgAgAkHcAGpCADcCACACQeQAakIANwIAIAJB7ABqQgA3AgAgAkH0AGpCADcCACACQfwAakEAOgAAIAJB/QBqQQA2AAAgAkGBAWpBADsAACACQYMBakEAOgAAIAJBADsBRCACQQA2AUYgAkHAADYCQCACQYgBaiACQUBrQcQAEIsBGiACQThqIAJBxAFqKQIANwMAIAJBMGogAkG8AWopAgA3AwAgAkEoaiACQbQBaikCADcDACACQSBqIAJBrAFqKQIANwMAIAJBGGogAkGkAWopAgA3AwAgAkEQaiACQZwBaikCADcDACACQQhqIAJBlAFqKQIANwMAIAIgAikCjAE3AwAgASACEFsgAUEAQcgBEJEBIgVBADYCyAECQAJAQcAAQQEQoQEiAQRAIAJCwAA3AowBIAIgATYCiAEgAkGIAWogAkHAABBeAkAgAigCjAEiAyACKAKQASIBRgRAIAMhAQwBCyADIAFJDQIgA0UNACACKAKIASEEAkAgAUUEQCAEEBBBASEDDAELIAQgA0EBIAEQmgEiA0UNBAsgAiABNgKMASACIAM2AogBCyACKAKIASEDIAVBAEHIARCRAUEANgLIASAAIAE2AgQgACADNgIAIAJB0AFqJAAPC0HAAEEBQbSlwAAoAgAiAEECIAAbEQAAAAtBh4zAAEEkQayMwAAQiAEACyABQQFBtKXAACgCACIAQQIgABsRAAAAC8wEAQR/IwBB0AFrIgIkACACQcoAakIANwEAIAJB0gBqQQA7AQAgAkHUAGpCADcCACACQdwAakIANwIAIAJB5ABqQgA3AgAgAkHsAGpCADcCACACQfQAakIANwIAIAJB/ABqQQA6AAAgAkH9AGpBADYAACACQYEBakEAOwAAIAJBgwFqQQA6AAAgAkEAOwFEIAJBADYBRiACQcAANgJAIAJBiAFqIAJBQGtBxAAQiwEaIAJBOGogAkHEAWopAgA3AwAgAkEwaiACQbwBaikCADcDACACQShqIAJBtAFqKQIANwMAIAJBIGogAkGsAWopAgA3AwAgAkEYaiACQaQBaikCADcDACACQRBqIAJBnAFqKQIANwMAIAJBCGogAkGUAWopAgA3AwAgAiACKQKMATcDACABIAIQXCABQQBByAEQkQEiBUEANgLIAQJAAkBBwABBARChASIBBEAgAkLAADcCjAEgAiABNgKIASACQYgBaiACQcAAEF4CQCACKAKMASIDIAIoApABIgFGBEAgAyEBDAELIAMgAUkNAiADRQ0AIAIoAogBIQQCQCABRQRAIAQQEEEBIQMMAQsgBCADQQEgARCaASIDRQ0ECyACIAE2AowBIAIgAzYCiAELIAIoAogBIQMgBUEAQcgBEJEBQQA2AsgBIAAgATYCBCAAIAM2AgAgAkHQAWokAA8LQcAAQQFBtKXAACgCACIAQQIgABsRAAAAC0GHjMAAQSRBrIzAABCIAQALIAFBAUG0pcAAKAIAIgBBAiAAGxEAAAALuAQBBH8jAEGgA2siAiQAIAJB4gJqQgA3AQAgAkHqAmpBADsBACACQewCakIANwIAIAJB9AJqQgA3AgAgAkH8AmpCADcCACACQYQDakIANwIAIAJBjANqQgA3AgAgAkGUA2pBADoAACACQZUDakEANgAAIAJBmQNqQQA7AAAgAkGbA2pBADoAACACQQA7AdwCIAJBADYB3gIgAkHAADYC2AIgAkFAayACQdgCakHEABCLARogAkE4aiACQfwAaikCADcDACACQTBqIAJB9ABqKQIANwMAIAJBKGogAkHsAGopAgA3AwAgAkEgaiACQeQAaikCADcDACACQRhqIAJB3ABqKQIANwMAIAJBEGogAkHUAGopAgA3AwAgAkEIaiACQcwAaikCADcDACACIAIpAkQ3AwAgAkFAayABQZgCEIsBGiACQUBrIAIQWwJAAkBBwABBARChASIDBEAgAkLAADcCRCACIAM2AkAgAkFAayACQcAAEF4CQCACKAJEIgQgAigCSCIDRgRAIAQhAwwBCyAEIANJDQIgBEUNACACKAJAIQUCQCADRQRAIAUQEEEBIQQMAQsgBSAEQQEgAxCaASIERQ0ECyACIAM2AkQgAiAENgJACyACKAJAIQQgARAQIAAgAzYCBCAAIAQ2AgAgAkGgA2okAA8LQcAAQQFBtKXAACgCACIAQQIgABsRAAAAC0GHjMAAQSRBrIzAABCIAQALIANBAUG0pcAAKAIAIgBBAiAAGxEAAAALuAQBBH8jAEGgA2siAiQAIAJB4gJqQgA3AQAgAkHqAmpBADsBACACQewCakIANwIAIAJB9AJqQgA3AgAgAkH8AmpCADcCACACQYQDakIANwIAIAJBjANqQgA3AgAgAkGUA2pBADoAACACQZUDakEANgAAIAJBmQNqQQA7AAAgAkGbA2pBADoAACACQQA7AdwCIAJBADYB3gIgAkHAADYC2AIgAkFAayACQdgCakHEABCLARogAkE4aiACQfwAaikCADcDACACQTBqIAJB9ABqKQIANwMAIAJBKGogAkHsAGopAgA3AwAgAkEgaiACQeQAaikCADcDACACQRhqIAJB3ABqKQIANwMAIAJBEGogAkHUAGopAgA3AwAgAkEIaiACQcwAaikCADcDACACIAIpAkQ3AwAgAkFAayABQZgCEIsBGiACQUBrIAIQXAJAAkBBwABBARChASIDBEAgAkLAADcCRCACIAM2AkAgAkFAayACQcAAEF4CQCACKAJEIgQgAigCSCIDRgRAIAQhAwwBCyAEIANJDQIgBEUNACACKAJAIQUCQCADRQRAIAUQEEEBIQQMAQsgBSAEQQEgAxCaASIERQ0ECyACIAM2AkQgAiAENgJACyACKAJAIQQgARAQIAAgAzYCBCAAIAQ2AgAgAkGgA2okAA8LQcAAQQFBtKXAACgCACIAQQIgABsRAAAAC0GHjMAAQSRBrIzAABCIAQALIANBAUG0pcAAKAIAIgBBAiAAGxEAAAALuAQBBH8jAEHgAmsiAiQAIAJBogJqQgA3AQAgAkGqAmpBADsBACACQawCakIANwIAIAJBtAJqQgA3AgAgAkG8AmpCADcCACACQcQCakIANwIAIAJBzAJqQgA3AgAgAkHUAmpBADoAACACQdUCakEANgAAIAJB2QJqQQA7AAAgAkHbAmpBADoAACACQQA7AZwCIAJBADYBngIgAkHAADYCmAIgAkFAayACQZgCakHEABCLARogAkE4aiACQfwAaikCADcDACACQTBqIAJB9ABqKQIANwMAIAJBKGogAkHsAGopAgA3AwAgAkEgaiACQeQAaikCADcDACACQRhqIAJB3ABqKQIANwMAIAJBEGogAkHUAGopAgA3AwAgAkEIaiACQcwAaikCADcDACACIAIpAkQ3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AABzOgAAIAVBAWoiBUHIAEcNAAsgABAOIAZByABJDQJByAAhBSACQcgAaiECIAhByABqIQgMAAsACyACIARqIgYgBEkNAiAGQcgASw0DIAAgBGpBzAFqIAEgAhCLARogACgCyAEgAmohBwwBCyAAQcwBaiABIARqIAcQiwEaCyAAIAc2AsgBIANBQGskAA8LIAQgBkHAm8AAEH4ACyAGQcgAQcCbwAAQfQALIARByABB0JvAABB+AAsgBCACQeCbwAAQfQALIANBNGpBBjYCACADQSRqQQI2AgAgA0IDNwIUIANBuJ7AADYCECADQQY2AiwgAyADQQxqNgI4IANB3J7AADYCPCADIANBKGo2AiAgAyADQTxqNgIwIAMgA0E4ajYCKCADQRBqQeCewAAQkAEAC5sEAQd/IwBBQGoiAyQAAkACQAJAAkACQAJAAkBB6AAgACgCyAEiBGsiBiACTQRAIAQEQCAEQekATw0GIAAgBGpBzAFqIAEgBhCLARogAiAGayECIAEgBmohAQNAIAAgBWoiBCAELQAAIARBzAFqLQAAczoAACAFQQFqIgVB6ABHDQALIAAQDgsgAiACQegAcCIHayEEIAIgB0kNBiAEQegASQ0BIAFB6ABqIQggASECIAQhBkHoACEFA0AgAyAFNgIMIAVB6ABHDQggBkGYf2ohBkEAIQUDQCAAIAVqIgkgCS0AACACIAVqLQAAczoAACAFQQFqIgVB6ABHDQALIAAQDiAGQegASQ0CQegAIQUgAkHoAGohAiAIQegAaiEIDAALAAsgAiAEaiIGIARJDQIgBkHoAEsNAyAAIARqQcwBaiABIAIQiwEaIAAoAsgBIAJqIQcMAQsgAEHMAWogASAEaiAHEIsBGgsgACAHNgLIASADQUBrJAAPCyAEIAZBwJvAABB+AAsgBkHoAEHAm8AAEH0ACyAEQegAQdCbwAAQfgALIAQgAkHgm8AAEH0ACyADQTRqQQY2AgAgA0EkakECNgIAIANCAzcCFCADQbiewAA2AhAgA0EGNgIsIAMgA0EMajYCOCADQdiewAA2AjwgAyADQShqNgIgIAMgA0E8ajYCMCADIANBOGo2AiggA0EQakHgnsAAEJABAAvkAwEEfyMAQcABayICJAAgAkGiAWpCADcBACACQaoBakEAOwEAIAJBrAFqQgA3AgAgAkG0AWpCADcCACACQQA7AZwBIAJBADYBngEgAkEgNgKYASACQUBrIAJBsAFqKQMANwMAIAJBOGogAkGoAWopAwA3AwAgAkEwaiACQaABaikDADcDACACQcgAaiACQbgBaigCADYCACACIAIpA5gBNwMoIAJBGGogAkE8aikCADcDACACQRBqIAJBNGopAgA3AwAgAkEgaiACQcQAaikCADcDACACIAIpAiw3AwggAkEoaiABQfAAEIsBGiACQShqIAJBCGoQOwJAAkBBIEEBEKEBIgMEQCACQiA3AiwgAiADNgIoIAJBKGogAkEIakEgEF4CQCACKAIsIgQgAigCMCIDRgRAIAQhAwwBCyAEIANJDQIgBEUNACACKAIoIQUCQCADRQRAIAUQEEEBIQQMAQsgBSAEQQEgAxCaASIERQ0ECyACIAM2AiwgAiAENgIoCyACKAIoIQQgARAQIAAgAzYCBCAAIAQ2AgAgAkHAAWokAA8LQSBBAUG0pcAAKAIAIgBBAiAAGxEAAAALQYeMwABBJEGsjMAAEIgBAAsgA0EBQbSlwAAoAgAiAEECIAAbEQAAAAuOBAEFfyMAQYABayICJAAgAkHyAGpCADcBACACQfoAakEAOwEAIAJBADsBbCACQQA2AW4gAkEQNgJoIAJBGGogAkHwAGoiBCkDADcDACACQSBqIAJB+ABqKAIANgIAIAJBCGoiBSACQRxqKQIANwMAIAIgAikDaDcDECACIAIpAhQ3AwAgAkEQaiABQdQAEIsBGgJAAkACQCACKAIQIgNBEEkEQCACQRBqQQRyIgYgA2pBECADayIDIAMQkQEaIAJBADYCECACQSRqIgMgBhALIAQgAkHcAGopAgA3AwAgAiACQdQAaikCADcDaCADIAJB6ABqEAsgBSACQSxqKQIANwMAIAIgAikCJDcDAEEQQQEQoQEiA0UNASACQhA3AhQgAiADNgIQIAJBEGogAkEQEF4CQCACKAIUIgQgAigCGCIDRgRAIAQhAwwBCyAEIANJDQMgBEUNACACKAIQIQUCQCADRQRAIAUQEEEBIQQMAQsgBSAEQQEgAxCaASIERQ0FCyACIAM2AhQgAiAENgIQCyACKAIQIQQgARAQIAAgAzYCBCAAIAQ2AgAgAkGAAWokAA8LQbCawABBFyACQegAakGgl8AAQbCXwAAQeQALQRBBAUG0pcAAKAIAIgBBAiAAGxEAAAALQYeMwABBJEGsjMAAEIgBAAsgA0EBQbSlwAAoAgAiAEECIAAbEQAAAAuFBAEEfyMAQdAAayICJAAgAkEqakIANwEAIAJBMmpBADsBACACQRQ2AiAgAkE0akEANgIAIAJBADsBJCACQQA2ASYgAkHIAGogAkEwaikDADcDACACQUBrIAJBKGopAwA3AwAgAkEQaiACQcQAaikCADcDACACQRhqIAJBzABqKAIANgIAIAIgAikDIDcDOCACIAIpAjw3AwggASACQQhqEFogAUIANwMAIAFBADYCHCABQfiXwAApAwA3AwggAUEQakGAmMAAKQMANwMAIAFBGGpBiJjAACgCADYCAAJAAkBBFEEBEKEBIgMEQCACQhQ3AjwgAiADNgI4IAJBOGogAkEIakEUEF4CQCACKAI8IgQgAigCQCIDRgRAIAQhAwwBCyAEIANJDQIgBEUNACACKAI4IQUCQCADRQRAIAUQEEEBIQQMAQsgBSAEQQEgAxCaASIERQ0ECyACIAM2AjwgAiAENgI4CyACKAI4IQQgAUIANwMAIAFBADYCHCABQQhqIgFB+JfAACkDADcDACABQQhqQYCYwAApAwA3AwAgAUEQakGImMAAKAIANgIAIAAgAzYCBCAAIAQ2AgAgAkHQAGokAA8LQRRBAUG0pcAAKAIAIgBBAiAAGxEAAAALQYeMwABBJEGsjMAAEIgBAAsgA0EBQbSlwAAoAgAiAEECIAAbEQAAAAuFBAEEfyMAQdAAayICJAAgAkEqakIANwEAIAJBMmpBADsBACACQRQ2AiAgAkE0akEANgIAIAJBADsBJCACQQA2ASYgAkHIAGogAkEwaikDADcDACACQUBrIAJBKGopAwA3AwAgAkEQaiACQcQAaikCADcDACACQRhqIAJBzABqKAIANgIAIAIgAikDIDcDOCACIAIpAjw3AwggASACQQhqECAgAUEANgIcIAFCADcDACABQRhqQYiYwAAoAgA2AgAgAUEQakGAmMAAKQMANwMAIAFB+JfAACkDADcDCAJAAkBBFEEBEKEBIgMEQCACQhQ3AjwgAiADNgI4IAJBOGogAkEIakEUEF4CQCACKAI8IgQgAigCQCIDRgRAIAQhAwwBCyAEIANJDQIgBEUNACACKAI4IQUCQCADRQRAIAUQEEEBIQQMAQsgBSAEQQEgAxCaASIERQ0ECyACIAM2AjwgAiAENgI4CyACKAI4IQQgAUEANgIcIAFCADcDACABQQhqIgFBEGpBiJjAACgCADYCACABQQhqQYCYwAApAwA3AwAgAUH4l8AAKQMANwMAIAAgAzYCBCAAIAQ2AgAgAkHQAGokAA8LQRRBAUG0pcAAKAIAIgBBAiAAGxEAAAALQYeMwABBJEGsjMAAEIgBAAsgA0EBQbSlwAAoAgAiAEECIAAbEQAAAAvlAwEEfyMAQfAAayICJAAgAkEqakIANwEAIAJBMmpBADsBACACQTRqQgA3AgAgAkE8akIANwIAIAJBADsBJCACQQA2ASYgAkEgNgIgIAJB4ABqIAJBOGopAwA3AwAgAkHYAGogAkEwaikDADcDACACQdAAaiACQShqKQMANwMAIAJB6ABqIAJBQGsoAgA2AgAgAiACKQMgNwNIIAJBEGogAkHcAGopAgA3AwAgAkEIaiACQdQAaikCADcDACACQRhqIAJB5ABqKQIANwMAIAIgAikCTDcDACABIAIQZiABQQBByAEQkQEiBUEANgLIAQJAAkBBIEEBEKEBIgEEQCACQiA3AkwgAiABNgJIIAJByABqIAJBIBBeAkAgAigCTCIDIAIoAlAiAUYEQCADIQEMAQsgAyABSQ0CIANFDQAgAigCSCEEAkAgAUUEQCAEEBBBASEDDAELIAQgA0EBIAEQmgEiA0UNBAsgAiABNgJMIAIgAzYCSAsgAigCSCEDIAVBAEHIARCRAUEANgLIASAAIAE2AgQgACADNgIAIAJB8ABqJAAPC0EgQQFBtKXAACgCACIAQQIgABsRAAAAC0GHjMAAQSRBrIzAABCIAQALIAFBAUG0pcAAKAIAIgBBAiAAGxEAAAAL5QMBBH8jAEHwAGsiAiQAIAJBKmpCADcBACACQTJqQQA7AQAgAkE0akIANwIAIAJBPGpCADcCACACQQA7ASQgAkEANgEmIAJBIDYCICACQeAAaiACQThqKQMANwMAIAJB2ABqIAJBMGopAwA3AwAgAkHQAGogAkEoaikDADcDACACQegAaiACQUBrKAIANgIAIAIgAikDIDcDSCACQRBqIAJB3ABqKQIANwMAIAJBCGogAkHUAGopAgA3AwAgAkEYaiACQeQAaikCADcDACACIAIpAkw3AwAgASACEGcgAUEAQcgBEJEBIgVBADYCyAECQAJAQSBBARChASIBBEAgAkIgNwJMIAIgATYCSCACQcgAaiACQSAQXgJAIAIoAkwiAyACKAJQIgFGBEAgAyEBDAELIAMgAUkNAiADRQ0AIAIoAkghBAJAIAFFBEAgBBAQQQEhAwwBCyAEIANBASABEJoBIgNFDQQLIAIgATYCTCACIAM2AkgLIAIoAkghAyAFQQBByAEQkQFBADYCyAEgACABNgIEIAAgAzYCACACQfAAaiQADwtBIEEBQbSlwAAoAgAiAEECIAAbEQAAAAtBh4zAAEEkQayMwAAQiAEACyABQQFBtKXAACgCACIAQQIgABsRAAAAC9wDAQR/IwBBoANrIgIkACACQYIDakIANwEAIAJBigNqQQA7AQAgAkGMA2pCADcCACACQZQDakIANwIAIAJBADsB/AIgAkEANgH+AiACQSA2AvgCIAJBOGogAkGQA2opAwA3AwAgAkEwaiACQYgDaikDADcDACACQShqIAJBgANqKQMANwMAIAJBQGsgAkGYA2ooAgA2AgAgAiACKQP4AjcDICACQRBqIAJBNGopAgA3AwAgAkEIaiACQSxqKQIANwMAIAJBGGogAkE8aikCADcDACACIAIpAiQ3AwAgAkEgaiABQdgCEIsBGiACQSBqIAIQZgJAAkBBIEEBEKEBIgMEQCACQiA3AiQgAiADNgIgIAJBIGogAkEgEF4CQCACKAIkIgQgAigCKCIDRgRAIAQhAwwBCyAEIANJDQIgBEUNACACKAIgIQUCQCADRQRAIAUQEEEBIQQMAQsgBSAEQQEgAxCaASIERQ0ECyACIAM2AiQgAiAENgIgCyACKAIgIQQgARAQIAAgAzYCBCAAIAQ2AgAgAkGgA2okAA8LQSBBAUG0pcAAKAIAIgBBAiAAGxEAAAALQYeMwABBJEGsjMAAEIgBAAsgA0EBQbSlwAAoAgAiAEECIAAbEQAAAAvcAwEEfyMAQaADayICJAAgAkGCA2pCADcBACACQYoDakEAOwEAIAJBjANqQgA3AgAgAkGUA2pCADcCACACQQA7AfwCIAJBADYB/gIgAkEgNgL4AiACQThqIAJBkANqKQMANwMAIAJBMGogAkGIA2opAwA3AwAgAkEoaiACQYADaikDADcDACACQUBrIAJBmANqKAIANgIAIAIgAikD+AI3AyAgAkEQaiACQTRqKQIANwMAIAJBCGogAkEsaikCADcDACACQRhqIAJBPGopAgA3AwAgAiACKQIkNwMAIAJBIGogAUHYAhCLARogAkEgaiACEGcCQAJAQSBBARChASIDBEAgAkIgNwIkIAIgAzYCICACQSBqIAJBIBBeAkAgAigCJCIEIAIoAigiA0YEQCAEIQMMAQsgBCADSQ0CIARFDQAgAigCICEFAkAgA0UEQCAFEBBBASEEDAELIAUgBEEBIAMQmgEiBEUNBAsgAiADNgIkIAIgBDYCIAsgAigCICEEIAEQECAAIAM2AgQgACAENgIAIAJBoANqJAAPC0EgQQFBtKXAACgCACIAQQIgABsRAAAAC0GHjMAAQSRBrIzAABCIAQALIANBAUG0pcAAKAIAIgBBAiAAGxEAAAAL0wMBBH8jAEHgAGsiAiQAIAJBKmpCADcBACACQTJqQQA7AQAgAkE0akIANwIAIAJBHDYCICACQTxqQQA2AgAgAkEAOwEkIAJBADYBJiACQdgAaiACQThqKQMANwMAIAJB0ABqIAJBMGopAwA3AwAgAkHIAGogAkEoaikDADcDACACIAIpAyA3A0AgAkEYaiACQdwAaigCADYCACACQRBqIAJB1ABqKQIANwMAIAJBCGogAkHMAGopAgA3AwAgAiACKQJENwMAIAEgAhBoIAFBAEHIARCRASIFQQA2AsgBAkACQEEcQQEQoQEiAQRAIAJCHDcCRCACIAE2AkAgAkFAayACQRwQXgJAIAIoAkQiAyACKAJIIgFGBEAgAyEBDAELIAMgAUkNAiADRQ0AIAIoAkAhBAJAIAFFBEAgBBAQQQEhAwwBCyAEIANBASABEJoBIgNFDQQLIAIgATYCRCACIAM2AkALIAIoAkAhAyAFQQBByAEQkQFBADYCyAEgACABNgIEIAAgAzYCACACQeAAaiQADwtBHEEBQbSlwAAoAgAiAEECIAAbEQAAAAtBh4zAAEEkQayMwAAQiAEACyABQQFBtKXAACgCACIAQQIgABsRAAAAC9MDAQR/IwBB4ABrIgIkACACQSpqQgA3AQAgAkEyakEAOwEAIAJBNGpCADcCACACQRw2AiAgAkE8akEANgIAIAJBADsBJCACQQA2ASYgAkHYAGogAkE4aikDADcDACACQdAAaiACQTBqKQMANwMAIAJByABqIAJBKGopAwA3AwAgAiACKQMgNwNAIAJBGGogAkHcAGooAgA2AgAgAkEQaiACQdQAaikCADcDACACQQhqIAJBzABqKQIANwMAIAIgAikCRDcDACABIAIQaSABQQBByAEQkQEiBUEANgLIAQJAAkBBHEEBEKEBIgEEQCACQhw3AkQgAiABNgJAIAJBQGsgAkEcEF4CQCACKAJEIgMgAigCSCIBRgRAIAMhAQwBCyADIAFJDQIgA0UNACACKAJAIQQCQCABRQRAIAQQEEEBIQMMAQsgBCADQQEgARCaASIDRQ0ECyACIAE2AkQgAiADNgJACyACKAJAIQMgBUEAQcgBEJEBQQA2AsgBIAAgATYCBCAAIAM2AgAgAkHgAGokAA8LQRxBAUG0pcAAKAIAIgBBAiAAGxEAAAALQYeMwABBJEGsjMAAEIgBAAsgAUEBQbSlwAAoAgAiAEECIAAbEQAAAAvkAwIJfwF+IwBBoAFrIgIkACACQUBrIAFBBGoQciABKAIAIQggAkH4AGoiAyABQTxqKQAANwMAIAJB8ABqIgQgAUE0aikAADcDACACQegAaiIFIAFBLGopAAA3AwAgAkHgAGoiBiABQSRqKQAANwMAIAJB2ABqIgcgAUEcaikAADcDACACIAEpABQ3A1AgAkGQAWogAUHEAGoQciACQQhqIgkgBykDADcDACACQRBqIgcgBikDADcDACACQRhqIgYgBSkDADcDACACQSBqIgUgBCkDADcDACACQShqIgQgAykDADcDACACQTBqIgMgAikDkAEiCzcDACACQThqIgogAkGYAWopAwA3AwAgAiALNwOAASACIAIpA1A3AwBB1ABBBBChASIBRQRAQdQAQQRBtKXAACgCACIAQQIgABsRAAAACyABIAg2AgAgASACKQNANwIEIAEgAikDADcCFCABQQxqIAJByABqKQMANwIAIAFBHGogCSkDADcCACABQSRqIAcpAwA3AgAgAUEsaiAGKQMANwIAIAFBNGogBSkDADcCACABQTxqIAQpAwA3AgAgAUHEAGogAykDADcCACABQcwAaiAKKQMANwIAIABB9I/AADYCBCAAIAE2AgAgAkGgAWokAAvLAwEEfyMAQaADayICJAAgAkGKA2pCADcBACACQZIDakEAOwEAIAJBlANqQgA3AgAgAkEcNgKAAyACQZwDakEANgIAIAJBADsBhAMgAkEANgGGAyACQThqIAJBmANqKQMANwMAIAJBMGogAkGQA2opAwA3AwAgAkEoaiACQYgDaikDADcDACACIAIpA4ADNwMgIAJBGGogAkE8aigCADYCACACQRBqIAJBNGopAgA3AwAgAkEIaiACQSxqKQIANwMAIAIgAikCJDcDACACQSBqIAFB4AIQiwEaIAJBIGogAhBpAkACQEEcQQEQoQEiAwRAIAJCHDcCJCACIAM2AiAgAkEgaiACQRwQXgJAIAIoAiQiBCACKAIoIgNGBEAgBCEDDAELIAQgA0kNAiAERQ0AIAIoAiAhBQJAIANFBEAgBRAQQQEhBAwBCyAFIARBASADEJoBIgRFDQQLIAIgAzYCJCACIAQ2AiALIAIoAiAhBCABEBAgACADNgIEIAAgBDYCACACQaADaiQADwtBHEEBQbSlwAAoAgAiAEECIAAbEQAAAAtBh4zAAEEkQayMwAAQiAEACyADQQFBtKXAACgCACIAQQIgABsRAAAAC8sDAQR/IwBBoANrIgIkACACQYoDakIANwEAIAJBkgNqQQA7AQAgAkGUA2pCADcCACACQRw2AoADIAJBnANqQQA2AgAgAkEAOwGEAyACQQA2AYYDIAJBOGogAkGYA2opAwA3AwAgAkEwaiACQZADaikDADcDACACQShqIAJBiANqKQMANwMAIAIgAikDgAM3AyAgAkEYaiACQTxqKAIANgIAIAJBEGogAkE0aikCADcDACACQQhqIAJBLGopAgA3AwAgAiACKQIkNwMAIAJBIGogAUHgAhCLARogAkEgaiACEGgCQAJAQRxBARChASIDBEAgAkIcNwIkIAIgAzYCICACQSBqIAJBHBBeAkAgAigCJCIEIAIoAigiA0YEQCAEIQMMAQsgBCADSQ0CIARFDQAgAigCICEFAkAgA0UEQCAFEBBBASEEDAELIAUgBEEBIAMQmgEiBEUNBAsgAiADNgIkIAIgBDYCIAsgAigCICEEIAEQECAAIAM2AgQgACAENgIAIAJBoANqJAAPC0EcQQFBtKXAACgCACIAQQIgABsRAAAAC0GHjMAAQSRBrIzAABCIAQALIANBAUG0pcAAKAIAIgBBAiAAGxEAAAALywMBBH8jAEGwAWsiAiQAIAJBmgFqQgA3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HCIEayIFIAJNBEAgAEEIaiEHIAQEQCAEQcEATw0GIAQgAEEgaiIEaiABIAUQiwEaIAcgBBAHIAIgBWshAiABIAVqIQELIAJBP3EhBSACQUBxIghBwABJDQEgAiAFa0FAaiEGIAEhBEHAACECA0AgAyACNgIMIAJBwABHDQcgByAEEAcgBkHAAEkNAiAEQUBrIQQgBkFAaiEGDAALAAsgAiAEaiIFIARJDQIgBUHAAEsNAyAAIARqQSBqIAEgAhCLARogACgCHCACaiEFDAELIABBIGogASAIaiAFEIsBGgsgACAFNgIcIANBQGskAA8LIAQgBUHAm8AAEH4ACyAFQcAAQcCbwAAQfQALIARBwABB0JvAABB+AAsgA0E0akEGNgIAIANBJGpBAjYCACADQgM3AhQgA0G4nsAANgIQIANBBjYCLCADIANBDGo2AjggA0GsjcAANgI8IAMgA0EoajYCICADIANBPGo2AjAgAyADQThqNgIoIANBEGpB4J7AABCQAQALtAMBBn8jAEFAaiIDJAAgACAAKQMAIAKtfDcDAAJAAkACQAJAAkACQEHAACAAKAIIIgRrIgUgAk0EQCAAQcwAaiEHIAQEQCAEQcEATw0GIAQgAEEMaiIEaiABIAUQiwEaIAcgBBAKIAIgBWshAiABIAVqIQELIAJBP3EhBSACQUBxIghBwABJDQEgAiAFa0FAaiEGIAEhBEHAACECA0AgAyACNgIMIAJBwABHDQcgByAEEAogBkHAAEkNAiAEQUBrIQQgBkFAaiEGDAALAAsgAiAEaiIFIARJDQIgBUHAAEsNAyAAIARqQQxqIAEgAhCLARogACgCCCACaiEFDAELIABBDGogASAIaiAFEIsBGgsgACAFNgIIIANBQGskAA8LIAQgBUHAm8AAEH4ACyAFQcAAQcCbwAAQfQALIARBwABB0JvAABB+AAsgA0E0akEGNgIAIANBJGpBAjYCACADQgM3AhQgA0G4nsAANgIQIANBBjYCLCADIANBDGo2AjggA0GsjcAANgI8IAMgA0EoajYCICADIANBPGo2AjAgAyADQThqNgIoIANBEGpB4J7AABCQAQAL0QMCBX8CfiAAQdQAaiECIABBEGohAyAAQQhqKQMAIQYgACkDACEHAkACQCAAKAJQIgFBgAFGBEAgAyACQQEQDEEAIQEgAEEA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AXFyQQJyNgIEIAAgA2oiAyADKAIEQQFyNgIEIAUgAiAFKAIAQQFxckECcjYCACAAIAAoAgRBAXI2AgQgASACEBQMAQsgASgCACEBIAAgAzYCBCAAIAEgAmo2AgALAkAgAEEEaigCACIBQQNxRQ0AIAFBeHEiAiAEQRBqTQ0AIABBBGogBCABQQFxckECcjYCACAAIARqIgEgAiAEayIEQQNyNgIEIAAgAmoiAiACKAIEQQFyNgIEIAEgBBAUCyAAQQhqIQMLIAMLiwMCBn8BfiMAQfAAayICJAAgAkHQAGoiAyABQRBqKQMANwMAIAJB2ABqIgQgAUEYaikDADcDACACQeAAaiIFIAFBIGopAwA3AwAgAkHoAGoiBiABQShqKQMANwMAIAIgASkDCDcDSCABKQMAIQggAkEIaiABQTRqEGUgASgCMCEHQfgAQQgQoQEiAUUEQEH4AEEIQbSlwAAoAgAiAEECIAAbEQAAAAsgASAINwMAIAEgAikDSDcDCCABIAc2AjAgASACKQMINwI0IAFBEGogAykDADcDACABQRhqIAQpAwA3AwAgAUEgaiAFKQMANwMAIAFBKGogBikDADcDACABQTxqIAJBEGopAwA3AgAgAUHEAGogAkEYaikDADcCACABQcwAaiACQSBqKQMANwIAIAFB1ABqIAJBKGopAwA3AgAgAUHcAGogAkEwaikDADcCACABQeQAaiACQThqKQMANwIAIAFB7ABqIAJBQGspAwA3AgAgAEHgjMAANgIEIAAgATYCACACQfAAaiQAC4YDAQR/IwBBkAFrIgIkACACQYIBakIANwEAIAJBigFqQQA7AQAgAkEAOwF8IAJBADYBfiACQRA2AnggAkEgaiACQYABaikDADcDACACQShqIAJBiAFqKAIANgIAIAJBEGogAkEkaikCADcDACACIAIpA3g3AxggAiACKQIcNwMIIAJBGGogAUHgABCLARogAkEYaiACQQhqEF0CQAJAQRBBARChASIDBEAgAkIQNwIcIAIgAzYCGCACQRhqIAJBCGpBEBBeAkAgAigCHCIEIAIoAiAiA0YEQCAEIQMMAQsgBCADSQ0CIARFDQAgAigCGCEFAkAgA0UEQCAFEBBBASEEDAELIAUgBEEBIAMQmgEiBEUNBAsgAiADNgIcIAIgBDYCGAsgAigCGCEEIAEQ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QT8gBmsQkQEaQcAAIAAoAjBrQQdNBEAgBCADEAYgACgCMCICQcEATw0CIABBNGpBACACEJEBGgsgAEHsAGogB0IDhjcCACAEIAMQBiAAQQA2AjAgASAAKAIINgAAIAEgAEEMaigCADYABCABIABBEGooAgA2AAggASAAQRRqKAIANgAMIAEgAEEYaigCADYAECABIABBHGooAgA2ABQgASAAQSBqKAIANgAYIAEgAEEkaigCADYAHCABIABBKGooAgA2ACAgASAAQSxqKAIANgAkDwsgAkHAAEGAmsAAEH4ACyACQcAAQZCawAAQfQALIAJBwABBoJrAABB8AAvwAgIGfwF+IwBBEGsiBCQAIABBDGohBSAAQcwAaiEDIAApAwAhCAJAAkAgACgCCCICQcAARgRAIAMgBRAKQQAhAiAAQQA2AggMAQsgAkE/Sw0BCyAAQQhqIgYgAmpBBGpBgAE6AAAgACAAKAIIIgdBAWoiAjYCCAJAIAJBwQBJBEAgAiAGakEEakEAQT8gB2sQkQEaQcAAIAAoAghrQQdNBEAgAyAFEAogACgCCCICQcEATw0CIABBDGpBACACEJEBGgsgAEHEAGogCEIDhjcCACADIAUQCiAAQQA2AgggBEEIaiICIABB3ABqNgIEIAIgAzYCACAEKAIMIAQoAggiAGtBAnYiA0EEIANBBEkbIgIEQEEAIQMDQCABIAAoAgA2AAAgAEEEaiEAIAFBBGohASADQQFqIgMgAkkNAAsLIARBEGokAA8LIAJBwABBgJrAABB+AAsgAkHAAEGQmsAAEH0ACyACQcAAQaCawAAQfAAL1AIBAX8gABBUIAEgACgCTCICQRh0IAJBCHRBgID8B3FyIAJBCHZBgP4DcSACQRh2cnI2AAAgASAAQdAAaigCACICQRh0IAJBCHRBgID8B3FyIAJBCHZBgP4DcSACQRh2cnI2AAQgASAAQdQAaigCACICQRh0IAJBCHRBgID8B3FyIAJBCHZBgP4DcSACQRh2cnI2AAggASAAQdgAaigCACICQRh0IAJBCHRBgID8B3FyIAJBCHZBgP4DcSACQRh2cnI2AAwgASAAQdwAaigCACICQRh0IAJBCHRBgID8B3FyIAJBCHZBgP4DcSACQRh2cnI2ABAgASAAQeAAaigCACICQRh0IAJBCHRBgID8B3FyIAJBCHZBgP4DcSACQRh2cnI2ABQgASAAQeQAaigCACIAQRh0IABBCHRBgID8B3FyIABBCHZBgP4DcSAAQRh2cnI2ABgL7AICBX8BfiMAQeAAayICJAAgASkDACEHIAJBIGogAUEMahBlIAJBCGoiAyABQdQAaikCADcDACACQRBqIgQgAUHcAGopAgA3AwAgAkEYaiIFIAFB5ABqKQIANwMAIAIgASkCTDcDACABKAIIIQZB8ABBCBChASIBRQRAQfAAQQhBtKXAACgCACIAQQIgABsRAAAACyABIAY2AgggASAHNwMAIAEgAikDIDcCDCABQRRqIAJBKGopAwA3AgAgAUEcaiACQTBqKQMANwIAIAFBJGogAkE4aikDADcCACABQSxqIAJBQGspAwA3AgAgAUE0aiACQcgAaikDADcCACABQTxqIAJB0ABqKQMANwIAIAFBxABqIAJB2ABqKQMANwIAIAFB5ABqIAUpAwA3AgAgAUHcAGogBCkDADcCACABQdQAaiADKQMANwIAIAEgAikDADcCTCAAQeCQwAA2AgQgACABNgIAIAJB4ABqJAAL7AICBX8BfiMAQeAAayICJAAgASkDACEHIAJBIGogAUEMahBlIAJBCGoiAyABQdQAaikCADcDACACQRBqIgQgAUHcAGopAgA3AwAgAkEYaiIFIAFB5ABqKQIANwMAIAIgASkCTDcDACABKAIIIQZB8ABBCBChASIBRQRAQfAAQQhBtKXAACgCACIAQQIgABsRAAAACyABIAY2AgggASAHNwMAIAEgAikDIDcCDCABQRRqIAJBKGopAwA3AgAgAUEcaiACQTBqKQMANwIAIAFBJGogAkE4aikDADcCACABQSxqIAJBQGspAwA3AgAgAUE0aiACQcgAaikDADcCACABQTxqIAJB0ABqKQMANwIAIAFBxABqIAJB2ABqKQMANwIAIAFB5ABqIAUpAwA3AgAgAUHcAGogBCkDADcCACABQdQAaiADKQMANwIAIAEgAikDADcCTCAAQYSRwAA2AgQgACABNgIAIAJB4ABqJAALyAICBH8BfiMAQeAAayICJAAgAkHQAGoiAyABQRBqKQMANwMAIAJB2ABqIgQgAUEYaigCADYCACACIAEpAwg3A0ggASkDACEGIAJBCGogAUEgahBlIAEoAhwhBUHgAEEIEKEBIgFFBEBB4ABBCEG0pcAAKAIAIgBBAiAAGxEAAAALIAEgBjcDACABIAIpA0g3AwggASAFNgIcIAEgAikDCDcDICABQRBqIAMpAwA3AwAgAUEYaiAEKAIANgIAIAFBKGogAkEQaikDADcDACABQTBqIAJBGGopAwA3AwAgAUE4aiACQSBqKQMANwMAIAFBQGsgAkEoaikDADcDACABQcgAaiACQTBqKQMANwMAIAFB0ABqIAJBOGopAwA3AwAgAUHYAGogAkFAaykDADcDACAAQYSNwAA2AgQgACABNgIAIAJB4ABqJAALyAICBH8BfiMAQeAAayICJAAgAkHQAGoiAyABQRBqKQMANwMAIAJB2ABqIgQgAUEYaigCADYCACACIAEpAwg3A0ggASkDACEGIAJBCGogAUEgahBlIAEoAhwhBUHgAEEIEKEBIgFFBEBB4ABBCEG0pcAAKAIAIgBBAiAAGxEAAAALIAEgBjcDACABIAIpA0g3AwggASAFNgIcIAEgAikDCDcDICABQRBqIAMpAwA3AwAgAUEYaiAEKAIANgIAIAFBKGogAkEQaikDADcDACABQTBqIAJBGGopAwA3AwAgAUE4aiACQSBqKQMANwMAIAFBQGsgAkEoaikDADcDACABQcgAaiACQTBqKQMANwMAIAFB0ABqIAJBOGopAwA3AwAgAUHYAGogAkFAaykDADcDACAAQbCNwAA2AgQgACABNgIAIAJB4ABqJAAL3QICBX8BfiAAQQxqIQIgAEHMAGohAyAAKQMAIQYCQAJAIAAoAggiAUHAAEYEQCADIAJBARAEQQAhASAAQQA2AggMAQsgAUE/Sw0BCyAAQQhqIgQgAWpBBGpBgAE6AAAgACAAKAIIIgVBAWoiATYCCAJAIAFBwQBJBEAgASAEakEEakEAQT8gBWsQkQEaQcAAIAAoAghrQQdNBEAgAyACQQEQBCAAKAIIIgFBwQBPDQIgAEEMakEAIAEQkQEaCyAAQcQAaiAGQiiGQoCAgICAgMD/AIMgBkI4hoQgBkIYhkKAgICAgOA/gyAGQgiGQoCAgIDwH4OEhCAGQgiIQoCAgPgPgyAGQhiIQoCA/AeDhCAGQiiIQoD+A4MgBkI4iISEhDcCACADIAJBARAEIABBADYCCA8LIAFBwABBgJrAABB+AAsgAUHAAEGQmsAAEH0ACyABQcAAQaCawAAQfAALvgICBX8BfiMAQTBrIgQkAEEnIQICQCAAQpDOAFQEQCAAIQcMAQsDQCAEQQlqIAJqIgNBfGogACAAQpDOAIAiB0LwsX9+fKciBUH//wNxQeQAbiIGQQF0QdqIwABqLwAAOwAAIANBfmogBkGcf2wgBWpB//8DcUEBdEHaiMAAai8AADsAACACQXxqIQIgAEL/wdcvViAHIQANAAsLIAenIgNB4wBKBEAgAkF+aiICIARBCWpqIAenIgVB//8DcUHkAG4iA0Gcf2wgBWpB//8DcUEBdEHaiMAAai8AADsAAAsCQCADQQpOBEAgAkF+aiICIARBCWpqIANBAXRB2ojAAGovAAA7AAAMAQsgAkF/aiICIARBCWpqIANBMGo6AAALIAFByKDAAEEAIARBCWogAmpBJyACaxAYIARBMGokAAu/AgEDfyMAQRBrIgIkAAJAIAAoAgAiAAJ/AkAgAUGAAU8EQCACQQA2AgwgAUGAEEkNASABQYCABEkEQCACIAFBP3FBgAFyOgAOIAIgAUEMdkHgAXI6AAwgAiABQQZ2QT9xQYABcjoADUEDDAMLIAIgAUE/cUGAAXI6AA8gAiABQRJ2QfABcjoADCACIAFBBnZBP3FBgAFyOgAOIAIgAUEMdkE/cUGAAXI6AA1BBAwCCyAAKAIIIgMgAEEEaigCAEYEfyAAQQEQaiAAKAIIBSADCyAAKAIAaiABOgAAIAAgACgCCEEBajYCCAwCCyACIAFBP3FBgAFyOgANIAIgAUEGdkHAAXI6AAxBAgsiARBqIABBCGoiAygCACIEIAAoAgBqIAJBDGogARCLARogAyABIARqNgIACyACQRBqJABBAAvLAgEIfyMAQYABayIBQShqIgJCADcDACABQSBqIgNCADcDACABQRhqIgRCADcDACABQRBqIgVCADcDACABQQhqIgZCADcDACABQgA3AwAgAUHaAGpCADcBACABQeIAakEAOwEAIAFBEDYCUCABQQA7AVQgAUEANgFWIAFB+ABqIAFB4ABqKAIANgIAIAFB8ABqIAFB2ABqKQMANwMAIAFByABqIgcgAUH0AGopAgA3AwAgASABKQNQNwNoIAEgASkCbDcDQCABQThqIgggBykDADcDACABIAEpA0A3AzAgAEHMAGogCCkDADcAACAAQcQAaiABKQMwNwAAIABBPGogAikDADcAACAAQTRqIAMpAwA3AAAgAEEsaiAEKQMANwAAIABBJGogBSkDADcAACAAQRxqIAYpAwA3AAAgACABKQMANwAUIABBADYCAAuxAgEDfyMAQYABayIEJAAgACgCACEAAkACQAJ/AkAgASgCACIDQRBxRQRAIAAoAgAhAiADQSBxDQEgAq0gARBVDAILIAAoAgAhAkEAIQADQCAAIARqQf8AaiACQQ9xIgNBMHIgA0HXAGogA0EKSRs6AAAgAEF/aiEAIAJBBHYiAg0ACyAAQYABaiICQYEBTw0CIAFB2IvAAEECIAAgBGpBgAFqQQAgAGsQGAwBC0EAIQADQCAAIARqQf8AaiACQQ9xIgNBMHIgA0E3aiADQQpJGzoAACAAQX9qIQAgAkEEdiICDQALIABBgAFqIgJBgQFPDQIgAUHYi8AAQQIgACAEakGAAWpBACAAaxAYCyAEQYABaiQADwsgAkGAAUHIi8AAEH4ACyACQYABQciLwAAQfgALrAICA38CfiAAIAApAwAiBiACrUIDhnwiBzcDACAAQQhqIgMgAykDACAHIAZUrXw3AwACQAJAQYABIAAoAlAiA2siBCACTQRAIABBEGoiBSADBEAgA0GBAU8NAiADIABB1ABqIgNqIAEgBBCLARogAEEANgJQIAUgA0EBEAwgAiAEayECIAEgBGohAQsgASACQQd2EAwgAkH/AHEiA0GBAU8NAiAAQdQAaiABIAJBgH9xaiADEIsBGiAAIAM2AlAPCwJAIAIgA2oiBCADTwRAIARBgAFLDQEgACADakHUAGogASACEIsBGiAAIAAoAlAgAmo2AlAPCyADIARB0JnAABB+AAsgBEGAAUHQmcAAEH0ACyADQYABQeCZwAAQfgALIANBgAFB8JnAABB9AAu8AgIFfwF+IABBIGohAyAAQQhqIQQgACkDACEHAkACQCAAKAIcIgJBwABGBEAgBCADEAdBACECIABBADYCHAwBCyACQT9LDQELIABBHGoiBSACakEEakGAAToAACAAIAAoAhwiBkEBaiICNgIcAkAgAkHBAEkEQCACIAVqQQRqQQBBPyAGaxCRARpBwAAgACgCHGtBB00EQCAEIAMQByAAKAIcIgJBwQBPDQIgAEEgakEAIAIQkQEaCyAAQdgAaiAHQgOGNwIAIAQgAxAHIABBADYCHCABIAAoAgg2AAAgASAAQQxqKAIANgAEIAEgAEEQaigCADYACCABIABBFGooAgA2AAwgASAAQRhqKAIANgAQDwsgAkHAAEGAmsAAEH4ACyACQcAAQZCawAAQfQALIAJBwABBoJrAABB8AAu1AgEDfyMAQRBrIgQkACAAKALIASICQccATQRAIAAgAmpBzAFqQQY6AAAgAkEBaiIDQcgARwRAIAAgA2pBzAFqQQBBxwAgAmsQkQEaC0EAIQIgAEEANgLIASAAQZMCaiIDIAMtAABBgAFyOgAAA0AgACACaiIDIAMtAAAgA0HMAWotAABzOgAAIAJBAWoiAkHIAEcNAAsgABAOIAEgACkAADcAACABQThqIABBOGopAAA3AAAgAUEwaiAAQTBqKQAANwAAIAFBKGogAEEoaikAADcAACABQSBqIABBIGopAAA3AAAgAUEYaiAAQRhqKQAANwAAIAFBEGogAEEQaikAADcAACABQQhqIABBCGopAAA3AAAgBEEQaiQADwtBsJrAAEEXIARBCGpByJrAAEGknsAAEHkAC7UCAQN/IwBBEGsiBCQAIAAoAsgBIgJBxwBNBEAgACACakHMAWpBAToAACACQQFqIgNByABHBEAgACADakHMAWpBAEHHACACaxCRARoLQQAhAiAAQQA2AsgBIABBkwJqIgMgAy0AAEGAAXI6AAADQCAAIAJqIgMgAy0AACADQcwBai0AAHM6AAAgAkEBaiICQcgARw0ACyAAEA4gASAAKQAANwAAIAFBOGogAEE4aikAADcAACABQTBqIABBMGopAAA3AAAgAUEoaiAAQShqKQAANwAAIAFBIGogAEEgaikAADcAACABQRhqIABBGGopAAA3AAAgAUEQaiAAQRBqKQAANwAAIAFBCGogAEEIaikAADcAACAEQRBqJAAPC0GwmsAAQRcgBEEIakHImsAAQeSdwAAQeQALswICBX8BfiAAQQxqIQMgAEHMAGohBCAAKQMAIQcCQAJAIAAoAggiAkHAAEYEQCAEIAMQDUEAIQIgAEEANgIIDAELIAJBP0sNAQsgAEEIaiIFIAJqQQRqQYABOgAAIAAgACgCCCIGQQFqIgI2AggCQCACQcEASQRAIAIgBWpBBGpBAEE/IAZrEJEBGkHAACAAKAIIa0EHTQRAIAQgAxANIAAoAggiAkHBAE8NAiAAQQxqQQAgAhCRARoLIABBxABqIAdCA4Y3AgAgBCADEA0gAEEANgIIIAEgACgCTDYAACABIABB0ABqKAIANgAEIAEgAEHUAGooAgA2AAggASAAQdgAaigCADYADA8LIAJBwABBgJrAABB+AAsgAkHAAEGQmsAAEH0ACyACQcAAQaCawAAQfAALhgIBBH8CQCAAQQRqKAIAIgYgAEEIaigCACIFayACTwRAIAAoAgAhBAwBCwJAAn8gAiAFaiIDIAVPBEBBACAGQQF0IgUgAyAFIANLGyIDQQggA0EISxsiA0EASA0BGgJAIAAoAgBBACAGGyIERQRAIANBARChASIEDQQMAQsgAyAGRg0DIAZFBEAgA0EBEKEBIgRFDQEMBAsgBCAGQQEgAxCaASIEDQMLQQEMAQtBAAsiBARAIAMgBEG0pcAAKAIAIgBBAiAAGxEAAAALEJsBAAsgACAENgIAIABBBGogAzYCACAAQQhqKAIAIQULIAQgBWogASACEIsBGiAAQQhqIAIgBWo2AgALjAIBA38gACAAKQMAIAKtQgOGfDcDAAJAAkBBwAAgACgCCCIDayIEIAJNBEAgAEHMAGoiBSADBEAgA0HBAE8NAiADIABBDGoiA2ogASAEEIsBGiAAQQA2AgggBSADQQEQBCACIARrIQIgASAEaiEBCyABIAJBBnYQBCACQT9xIgNBwQBPDQIgAEEMaiABIAJBQHFqIAMQiwEaIAAgAzYCCA8LAkAgAiADaiIEIANPBEAgBEHAAEsNASAAIANqQQxqIAEgAhCLARogACAAKAIIIAJqNgIIDwsgAyAEQdCZwAAQfgALIARBwABB0JnAABB9AAsgA0HAAEHgmcAAEH4ACyADQcAAQfCZwAAQfQALqAICA38BfiMAQdAAayICJAAgASkDACEFIAJBEGogAUEMahBlIAJBCGoiAyABQdQAaikCADcDACACIAEpAkw3AwAgASgCCCEEQeAAQQgQoQEiAUUEQEHgAEEIQbSlwAAoAgAiAEECIAAbEQAAAAsgASAENgIIIAEgBTcDACABIAIpAxA3AgwgAUEUaiACQRhqKQMANwIAIAFBHGogAkEgaikDADcCACABQSRqIAJBKGopAwA3AgAgAUEsaiACQTBqKQMANwIAIAFBNGogAkE4aikDADcCACABQTxqIAJBQGspAwA3AgAgAUHEAGogAkHIAGopAwA3AgAgAUHUAGogAykDADcCACABIAIpAwA3AkwgAEG8jMAANgIEIAAgATYCACACQdAAaiQAC4gCAQN/IAAgACkDACACrXw3AwACQAJAQcAAIAAoAhwiA2siBCACTQRAIABBCGoiBSADBEAgA0HBAE8NAiADIABBIGoiA2ogASAEEIsBGiAAQQA2AhwgBSADQQEQCCACIARrIQIgASAEaiEBCyABIAJBBnYQCCACQT9xIgNBwQBPDQIgAEEgaiABIAJBQHFqIAMQiwEaIAAgAzYCHA8LAkAgAiADaiIEIANPBEAgBEHAAEsNASAAIANqQSBqIAEgAhCLARogACAAKAIcIAJqNgIcDwsgAyAEQdCZwAAQfgALIARBwABB0JnAABB9AAsgA0HAAEHgmcAAEH4ACyADQcAAQfCZwAAQfQALqAICA38BfiMAQdAAayICJAAgASkDACEFIAJBEGogAUEMahBlIAJBCGoiAyABQdQAaikCADcDACACIAEpAkw3AwAgASgCCCEEQeAAQQgQoQEiAUUEQEHgAEEIQbSlwAAoAgAiAEECIAAbEQAAAAsgASAENgIIIAEgBTcDACABIAIpAxA3AgwgAUEUaiACQRhqKQMANwIAIAFBHGogAkEgaikDADcCACABQSRqIAJBKGopAwA3AgAgAUEsaiACQTBqKQMANwIAIAFBNGogAkE4aikDADcCACABQTxqIAJBQGspAwA3AgAgAUHEAGogAkHIAGopAwA3AgAgAUHUAGogAykDADcCACABIAIpAwA3AkwgAEGokcAANgIEIAAgATYCACACQdAAaiQAC5UCAQN/IwBBEGsiBCQAIAAoAsgBIgJB5wBNBEAgACACakHMAWpBBjoAACACQQFqIgNB6ABHBEAgACADakHMAWpBAEHnACACaxCRARoLQQAhAiAAQQA2AsgBIABBswJqIgMgAy0AAEGAAXI6AAADQCAAIAJqIgMgAy0AACADQcwBai0AAHM6AAAgAkEBaiICQegARw0ACyAAEA4gASAAKQAANwAAIAFBKGogAEEoaikAADcAACABQSBqIABBIGopAAA3AAAgAUEYaiAAQRhqKQAANwAAIAFBEGogAEEQaikAADcAACABQQhqIABBCGopAAA3AAAgBEEQaiQADwtBsJrAAEEXIARBCGpByJrAAEGUnsAAEHkAC5UCAQN/IwBBEGsiBCQAIAAoAsgBIgJB5wBNBEAgACACakHMAWpBAToAACACQQFqIgNB6ABHBEAgACADakHMAWpBAEHnACACaxCRARoLQQAhAiAAQQA2AsgBIABBswJqIgMgAy0AAEGAAXI6AAADQCAAIAJqIgMgAy0AACADQcwBai0AAHM6AAAgAkEBaiICQegARw0ACyAAEA4gASAAKQAANwAAIAFBKGogAEEoaikAADcAACABQSBqIABBIGopAAA3AAAgAUEYaiAAQRhqKQAANwAAIAFBEGogAEEQaikAADcAACABQQhqIABBCGopAAA3AAAgBEEQaiQADwtBsJrAAEEXIARBCGpByJrAAEHUncAAEHkAC/MBAQR/IwBBkAFrIgIkACACQQA2AgAgAkEEciEFA0AgAyAFaiABIANqLQAAOgAAIAIgAigCAEEBaiIENgIAIANBAWoiA0HAAEcNAAsgBEE/TQRAIARBwAAQfwALIAJByABqIAJBxAAQiwEaIABBOGogAkGEAWopAgA3AAAgAEEwaiACQfwAaikCADcAACAAQShqIAJB9ABqKQIANwAAIABBIGogAkHsAGopAgA3AAAgAEEYaiACQeQAaikCADcAACAAQRBqIAJB3ABqKQIANwAAIABBCGogAkHUAGopAgA3AAAgACACKQJMNwAAIAJBkAFqJAAL9QEBA38jAEEQayIEJAAgACgCyAEiAkGHAU0EQCAAIAJqQcwBakEBOgAAIAJBAWoiA0GIAUcEQCAAIANqQcwBakEAQYcBIAJrEJEBGgtBACECIABBADYCyAEgAEHTAmoiAyADLQAAQYABcjoAAANAIAAgAmoiAyADLQAAIANBzAFqLQAAczoAACACQQFqIgJBiAFHDQALIAAQDiABIAApAAA3AAAgAUEYaiAAQRhqKQAANwAAIAFBEGogAEEQaikAADcAACABQQhqIABBCGopAAA3AAAgBEEQaiQADwtBsJrAAEEXIARBCGpByJrAAEHEncAAEHkAC/UBAQN/IwBBEGsiBCQAIAAoAsgBIgJBhwFNBEAgACACakHMAWpBBjoAACACQQFqIgNBiAFHBEAgACADakHMAWpBAEGHASACaxCRARoLQQAhAiAAQQA2AsgBIABB0wJqIgMgAy0AAEGAAXI6AAADQCAAIAJqIgMgAy0AACADQcwBai0AAHM6AAAgAkEBaiICQYgBRw0ACyAAEA4gASAAKQAANwAAIAFBGGogAEEYaikAADcAACABQRBqIABBEGopAAA3AAAgAUEIaiAAQQhqKQAANwAAIARBEGokAA8LQbCawABBFyAEQQhqQciawABBhJ7AABB5AAv1AQEDfyMAQRBrIgQkACAAKALIASICQY8BTQRAIAAgAmpBzAFqQQE6AAAgAkEBaiIDQZABRwRAIAAgA2pBzAFqQQBBjwEgAmsQkQEaC0EAIQIgAEEANgLIASAAQdsCaiIDIAMtAABBgAFyOgAAA0AgACACaiIDIAMtAAAgA0HMAWotAABzOgAAIAJBAWoiAkGQAUcNAAsgABAOIAEgACkAADcAACABQRhqIABBGGooAAA2AAAgAUEQaiAAQRBqKQAANwAAIAFBCGogAEEIaikAADcAACAEQRBqJAAPC0GwmsAAQRcgBEEIakHImsAAQdiawAAQeQAL9QEBA38jAEEQayIEJAAgACgCyAEiAkGPAU0EQCAAIAJqQcwBakEGOgAAIAJBAWoiA0GQAUcEQCAAIANqQcwBakEAQY8BIAJrEJEBGgtBACECIABBADYCyAEgAEHbAmoiAyADLQAAQYABcjoAAANAIAAgAmoiAyADLQAAIANBzAFqLQAAczoAACACQQFqIgJBkAFHDQALIAAQDiABIAApAAA3AAAgAUEYaiAAQRhqKAAANgAAIAFBEGogAEEQaikAADcAACABQQhqIABBCGopAAA3AAAgBEEQaiQADwtBsJrAAEEXIARBCGpByJrAAEH0ncAAEHkAC8MBAQJ/AkACQCAAQQRqKAIAIgMgACgCCCICayABSQRAIAEgAmoiASACSQ0BIANBAXQiAiABIAIgAUsbIgFBCCABQQhLGyICQQBIDQECQCAAKAIAQQAgAxsiAUUEQCACQQEQoQEhAQwBCyACIANGDQAgA0UEQCACQQEQoQEhAQwBCyABIANBASACEJoBIQELIAFFDQIgACABNgIAIABBBGogAjYCAAsPCxCbAQALIAJBAUG0pcAAKAIAIgBBAiAAGxEAAAALhQEBBH8jAEGgAWsiAiQAIAJBADYCACACQQRyIQUDQCADIAVqIAEgA2otAAA6AAAgAiACKAIAQQFqIgQ2AgAgA0EBaiIDQcgARw0A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JAAgAkGIAWogAUHIARCLARogAiABQcwBahBuIAEoAsgBIQNB2AJBCBChASIBRQRAQdgCQQhBtKXAACgCACIAQQIgABsRAAAACyABIAJBiAFqQcgBEIsBIgEgAzYCyAEgAUHMAWogAkGIARCLARogAEGsj8AANgIEIAAgATYCACACQdACaiQAC34BAX8jAEFAaiIFJAAgBSABNgIMIAUgADYCCCAFIAM2AhQgBSACNgIQIAVBLGpBAjYCACAFQTxqQQQ2AgAgBUICNwIcIAVB8IvAADYCGCAFQQE2AjQgBSAFQTBqNgIoIAUgBUEQajYCOCAFIAVBCGo2AjAgBUEYaiAEEJABAAuVAQAgAEIANwMIIABCADcDACAAQQA2AlAgAEGQmcAAKQMANwMQIABBGGpBmJnAACkDADcDACAAQSBqQaCZwAApAwA3AwAgAEEoakGomcAAKQMANwMAIABBMGpBsJnAACkDADcDACAAQThqQbiZwAApAwA3AwAgAEFAa0HAmcAAKQMANwMAIABByABqQciZwAApAwA3AwALlQEAIABCADcDCCAAQgA3AwAgAEEANgJQIABB0JjAACkDADcDECAAQRhqQdiYwAApAwA3AwAgAEEgakHgmMAAKQMANwMAIABBKGpB6JjAACkDADcDACAAQTBqQfCYwAApAwA3AwAgAEE4akH4mMAAKQMANwMAIABBQGtBgJnAACkDADcDACAAQcgAakGImcAAKQMANwMAC20BAX8jAEEwayIDJAAgAyABNgIEIAMgADYCACADQRxqQQI2AgAgA0EsakEFNgIAIANCAjcCDCADQYiIwAA2AgggA0EFNgIkIAMgA0EgajYCGCADIAM2AiggAyADQQRqNgIgIANBCGogAhCQAQALbQEBfyMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBHGpBAjYCACADQSxqQQU2AgAgA0ICNwIMIANBpIrAADYCCCADQQU2AiQgAyADQSBqNgIYIAMgA0EEajYCKCADIAM2AiAgA0EIaiACEJABAAttAQF/IwBBMGsiAyQAIAMgATYCBCADIAA2AgAgA0EcakECNgIAIANBLGpBBTYCACADQgI3AgwgA0HcisAANgIIIANBBTYCJCADIANBIGo2AhggAyADQQRqNgIoIAMgAzYCICADQQhqIAIQkAEAC3ABAX8jAEEwayICJAAgAiABNgIEIAIgADYCACACQRxqQQI2AgAgAkEsakEFNgIAIAJCAjcCDCACQcyRwAA2AgggAkEFNgIkIAIgAkEgajYCGCACIAJBBGo2AiggAiACNgIgIAJBCGpB3JHAABCQAQALVAEBfyMAQSBrIgIkACACIAAoAgA2AgQgAkEYaiABQRBqKQIANwMAIAJBEGogAUEIaikCADcDACACIAEpAgA3AwggAkEEaiACQQhqEBYgAkEgaiQAC30BAn9BASEAQeChwABB4KHAACgCAEEBajYCAAJAAkBBqKXAACgCAEEBRwRAQailwABCgYCAgBA3AwAMAQtBrKXAAEGspcAAKAIAQQFqIgA2AgAgAEECSw0BC0GwpcAAKAIAIgFBf0wNAEGwpcAAIAE2AgAgAEEBSw0AAAsAC2ICAX8BfiMAQRBrIgIkAAJAIAEEQCABKAIADQEgAUF/NgIAIAJBCGogASgCBCABQQhqKAIAKAIQEQAAIAIpAwghAyABQQA2AgAgACADNwIAIAJBEGokAA8LEJ0BAAsQngEAC0MBA38CQCACRQ0AA0AgAC0AACIEIAEtAAAiBUYEQCAAQQFqIQAgAUEBaiEBIAJBf2oiAg0BDAILCyAEIAVrIQMLIAMLSwECfwJAIAAEQCAAKAIADQEgAEEANgIAIAAoAgQhASAAKAIIIQIgABAQIAEgAigCABEEACACKAIEBEAgARAQCw8LEJ0BAAsQngEAC0gAAkAgAARAIAAoAgANASAAQX82AgAgACgCBCABIAIgAEEIaigCACgCDBECACACBEAgARAQCyAAQQA2AgAPCxCdAQALEJ4BAAtKAAJ/IAFBgIDEAEcEQEEBIAAoAhggASAAQRxqKAIAKAIQEQEADQEaCyACRQRAQQAPCyAAKAIYIAIgAyAAQRxqKAIAKAIMEQMACwtdACAAQgA3AwAgAEEANgIwIABB0JfAACkDADcDCCAAQRBqQdiXwAApAwA3AwAgAEEYakHgl8AAKQMANwMAIABBIGpB6JfAACkDADcDACAAQShqQfCXwAApAwA3AwALSAEBfyMAQSBrIgMkACADQRRqQQA2AgAgA0HIoMAANgIQIANCATcCBCADIAE2AhwgAyAANgIYIAMgA0EYajYCACADIAIQkAEAC1AAIABBADYCCCAAQgA3AwAgAEGsmMAAKQIANwJMIABB1ABqQbSYwAApAgA3AgAgAEHcAGpBvJjAACkCADcCACAAQeQAakHEmMAAKQIANwIAC1AAIABBADYCCCAAQgA3AwAgAEGMmMAAKQIANwJMIABB1ABqQZSYwAApAgA3AgAgAEHcAGpBnJjAACkCADcCACAAQeQAakGkmMAAKQIANwIACzMBAX8gAgRAIAAhAwNAIAMgAS0AADoAACABQQFqIQEgA0EBaiEDIAJBf2oiAg0ACwsgAAs1AQJ/IAAoAgAiACACEGogAEEIaiIDKAIAIgQgACgCAGogASACEIsBGiADIAIgBGo2AgBBAAsrAAJAIABBfEsNACAARQRAQQQPCyAAIABBfUlBAnQQoQEiAEUNACAADwsACz0AIABCADcDACAAQQA2AhwgAEH4l8AAKQMANwMIIABBEGpBgJjAACkDADcDACAAQRhqQYiYwAAoAgA2AgALPQAgAEEANgIcIABCADcDACAAQRhqQYiYwAAoAgA2AgAgAEEQakGAmMAAKQMANwMAIABB+JfAACkDADcDCAtMAQF/IwBBEGsiAiQAIAIgATYCDCACIAA2AgggAkGYiMAANgIEIAJByKDAADYCACACKAIIRQRAQZ2gwABBK0HIoMAAEIgBAAsQgQEACykBAX8gAgRAIAAhAwNAIAMgAToAACADQQFqIQMgAkF/aiICDQALCyAACy4AIABBADYCCCAAQgA3AwAgAEHUAGpByJfAACkCADcCACAAQcCXwAApAgA3AkwLIAACQCABQXxLDQAgACABQQQgAhCaASIARQ0AIAAPCwALHAAgASgCGEH/h8AAQQggAUEcaigCACgCDBEDAAscACABKAIYQYKMwABBBSABQRxqKAIAKAIMEQMACxQAIAAoAgAgASAAKAIEKAIMEQEACxAAIAEgACgCACAAKAIEEBILEgAgAEEAQcgBEJEBQQA2AsgBCwsAIAEEQCAAEBALCwwAIAAgASACIAMQFwsSAEHEhsAAQRFB2IbAABCIAQALDgAgACgCABoDQAwACwALDQBB76DAAEEbEKABAAsOAEGKocAAQc8AEKABAAsLACAANQIAIAEQVQsJACAAIAEQAQALGQACfyABQQlPBEAgASAAEEYMAQsgABAJCwsNAEKtqduM/5imovgACwQAQRALBABBKAsEAEEUCwUAQcAACwQAQTALBABBHAsEAEEgCwMAAQsDAAELC+MhAQBBgIDAAAvZIW1kMgAHAAAAVAAAAAQAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAABtZDQABwAAAGAAAAAIAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAbWQ1AAcAAABgAAAACAAAABQAAAAVAAAAFgAAABEAAAASAAAAFwAAAHJpcGVtZDE2MAAAAAcAAABgAAAACAAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAHJpcGVtZDMyMAAAAAcAAAB4AAAACAAAAB4AAAAfAAAAIAAAACEAAAAiAAAAIwAAAHNoYTEHAAAAYAAAAAgAAAAkAAAAJQAAACYAAAAnAAAAHAAAACgAAABzaGEyMjQAAAcAAABwAAAACAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAHNoYTI1NgAABwAAAHAAAAAIAAAAKQAAAC8AAAAwAAAAMQAAADIAAAAzAAAAc2hhMzg0AAAHAAAA2AAAAAgAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAABzaGE1MTIAAAcAAADYAAAACAAAADQAAAA6AAAAOwAAADwAAAA9AAAAPgAAAHNoYTMtMjI0BwAAAGABAAAIAAAAPwAAAEAAAABBAAAAQgAAAEMAAABEAAAAc2hhMy0yNTYHAAAAWAEAAAgAAABFAAAARgAAAEcAAABIAAAASQAAAEoAAABzaGEzLTM4NAcAAAA4AQAACAAAAEsAAABMAAAATQAAAE4AAABPAAAAUAAAAHNoYTMtNTEyBwAAABgBAAAIAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAAa2VjY2FrMjI0AAAABwAAAGABAAAIAAAAPwAAAFcAAABYAAAAQgAAAEMAAABZAAAAa2VjY2FrMjU2AAAABwAAAFgBAAAIAAAARQAAAFoAAABbAAAASAAAAEkAAABcAAAAa2VjY2FrMzg0AAAABwAAADgBAAAIAAAASwAAAF0AAABeAAAATgAAAE8AAABfAAAAa2VjY2FrNTEyAAAABwAAABgBAAAIAAAAUQAAAGAAAABhAAAAVAAAAFUAAABiAAAAdW5zdXBwb3J0ZWQgaGFzaCBhbGdvcml0aG06ICADEAAcAAAAY2FwYWNpdHkgb3ZlcmZsb3cAAABoAxAAFwAAABcCAAAFAAAAc3JjL2xpYmFsbG9jL3Jhd192ZWMucnMABwAAAAQAAAAEAAAAYwAAAGQAAABlAAAAYSBmb3JtYXR0aW5nIHRyYWl0IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9yAAcAAAAAAAAAAQAAAGYAAADsAxAAEwAAAEoCAAAcAAAAc3JjL2xpYmFsbG9jL2ZtdC5yc1BhZEVycm9yACgEEAAgAAAASAQQABIAAAAHAAAAAAAAAAEAAABnAAAAaW5kZXggb3V0IG9mIGJvdW5kczogdGhlIGxlbiBpcyAgYnV0IHRoZSBpbmRleCBpcyAwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5OQAANAUQAAYAAAA6BRAAIgAAAGluZGV4ICBvdXQgb2YgcmFuZ2UgZm9yIHNsaWNlIG9mIGxlbmd0aCBsBRAAFgAAAIIFEAANAAAAc2xpY2UgaW5kZXggc3RhcnRzIGF0ICBidXQgZW5kcyBhdCAAsAUQABYAAABdBAAAJAAAALAFEAAWAAAAUwQAABEAAABzcmMvbGliY29yZS9mbXQvbW9kLnJzAADaBRAAFgAAAFQAAAAUAAAAMHhzcmMvbGliY29yZS9mbXQvbnVtLnJzSBAQAAAAAAAABhAAAgAAADogRXJyb3JUcmllZCB0byBzaHJpbmsgdG8gYSBsYXJnZXIgY2FwYWNpdHkAcA8QAHQAAAAKAAAACQAAAAcAAABgAAAACAAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAAAcAAAB4AAAACAAAAB4AAAAfAAAAIAAAACEAAAAiAAAAIwAAAAcAAABgAAAACAAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAABAAAABAAAAABwAAAGAAAAAIAAAAJAAAACUAAAAmAAAAJwAAABwAAAAoAAAABwAAABgBAAAIAAAAUQAAAGAAAABhAAAAVAAAAFUAAABiAAAABwAAADgBAAAIAAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAABwAAAGABAAAIAAAAPwAAAFcAAABYAAAAQgAAAEMAAABZAAAABwAAAFgBAAAIAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAABwAAADgBAAAIAAAASwAAAF0AAABeAAAATgAAAE8AAABfAAAABwAAABgBAAAIAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAABwAAAFgBAAAIAAAARQAAAFoAAABbAAAASAAAAEkAAABcAAAABwAAAGABAAAIAAAAPwAAAEAAAABBAAAAQgAAAEMAAABEAAAABwAAAFQAAAAEAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAABwAAANgAAAAIAAAANAAAADoAAAA7AAAAPAAAAD0AAAA+AAAABwAAANgAAAAIAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAABwAAAHAAAAAIAAAAKQAAACoAAAArAAAALAAAAC0AAAAuAAAABwAAAHAAAAAIAAAAKQAAAC8AAAAwAAAAMQAAADIAAAAzAAAABwAAAGAAAAAIAAAAFAAAABUAAAAWAAAAEQAAABIAAAAXAAAATgkQACEAAABvCRAAFwAAAOwIEABiAAAAZwEAAAUAAAAvaG9tZS9sdWNhY2Fzb25hdG8vLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvZ2VuZXJpYy1hcnJheS0wLjE0LjQvc3JjL2xpYi5yc0dlbmVyaWNBcnJheTo6ZnJvbV9pdGVyIHJlY2VpdmVkICBlbGVtZW50cyBidXQgZXhwZWN0ZWQgAAABAAAAAAAAAIKAAAAAAAAAioAAAAAAAIAAgACAAAAAgIuAAAAAAAAAAQAAgAAAAACBgACAAAAAgAmAAAAAAACAigAAAAAAAACIAAAAAAAAAAmAAIAAAAAACgAAgAAAAACLgACAAAAAAIsAAAAAAACAiYAAAAAAAIADgAAAAAAAgAKAAAAAAACAgAAAAAAAAIAKgAAAAAAAAAoAAIAAAACAgYAAgAAAAICAgAAAAAAAgAEAAIAAAAAACIAAgAAAAIApLkPJoth8AT02VKHs8AYTYqcF88DHc4yYkyvZvEyCyh6bVzz91OAWZ0JvGIoX5RK+TsTW2p7eSaD79Y67L+56qWh5kRWyBz+UwhCJCyJfIYB/XZpakDInNT7M57/3lwP/GTCzSKW10ddekiqsVqrGT7g40pakfbZ2/GvinHQE8UWdcFlkcYcghlvPZeYtqAIbYCWtrrC59hxGYWk0QH4PVUejI91RrzrDXPnOusXqJixTDW6FKIQJ09/N9EGBTVJq3DfIbMGr+iThewgMvbFKeIiVi+Nj6G3py9X+OwAdOfLvtw5mWNDkpndy+Ot1SwoxRFC0j+0fGtuZjTOfEYMUL2hvbWUvbHVjYWNhc29uYXRvLy5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL21kMi0wLjkuMC9zcmMvbGliLnJzAAcAAAAAAAAAAQAAAGgAAABICxAAVwAAAG8AAAAOAAAAASNFZ4mrze/+3LqYdlQyEAEjRWeJq83v/ty6mHZUMhDw4dLDEDJUdpi63P7vzauJZ0UjAQ8eLTwBI0VniavN7/7cuph2VDIQ8OHSw9ieBcEH1Xw2F91wMDlZDvcxC8D/ERVYaKeP+WSkT/q+Z+YJaoWuZ7ty8248OvVPpX9SDlGMaAWbq9mDHxnN4FsAAAAA2J4FwV2du8sH1Xw2KimaYhfdcDBaAVmROVkO99jsLxUxC8D/ZyYzZxEVWGiHSrSOp4/5ZA0uDNukT/q+HUi1RwjJvPNn5glqO6fKhIWuZ7sr+JT+cvNuPPE2HV869U+l0YLmrX9SDlEfbD4rjGgFm2u9Qfur2YMfeSF+ExnN4FvwDRAAYAAAADoAAAANAAAA8A0QAGAAAABBAAAADQAAAPANEABgAAAAVQAAAAkAAADwDRAAYAAAAIcAAAAXAAAA8A0QAGAAAACLAAAAGwAAAPANEABgAAAAhAAAAAkAAAB3ZSBuZXZlciB1c2UgaW5wdXRfbGF6eQAHAAAAAAAAAAEAAABoAAAAaA0QAFgAAABBAAAAAQAAAC9ob21lL2x1Y2FjYXNvbmF0by8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9zaGEzLTAuOS4xL3NyYy9saWIucnPwDRAAYAAAABsAAAANAAAA8A0QAGAAAAAiAAAADQAAAFAOEABzAAAACgQAAAsAAAAvaG9tZS9sdWNhY2Fzb25hdG8vLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvYmxvY2stYnVmZmVyLTAuOS4wL3NyYy9saWIucnMvaG9tZS9sdWNhY2Fzb25hdG8vLnJ1c3R1cC90b29sY2hhaW5zL3N0YWJsZS14ODZfNjQtdW5rbm93bi1saW51eC1nbnUvbGliL3J1c3RsaWIvc3JjL3J1c3Qvc3JjL2xpYmNvcmUvc2xpY2UvbW9kLnJzAGgNEABYAAAASAAAAAEAAABoDRAAWAAAAE8AAAABAAAAaA0QAFgAAABWAAAAAQAAAGgNEABYAAAAZgAAAAEAAABoDRAAWAAAAG0AAAABAAAAaA0QAFgAAAB0AAAAAQAAAGgNEABYAAAAewAAAAEAAACQAAAA5A8QAC0AAAAREBAADAAAAFAPEAABAAAAYAAAAIgAAABoAAAASAAAAHAPEAB0AAAAEAAAAAkAAAAvaG9tZS9sdWNhY2Fzb25hdG8vLnJ1c3R1cC90b29sY2hhaW5zL3N0YWJsZS14ODZfNjQtdW5rbm93bi1saW51eC1nbnUvbGliL3J1c3RsaWIvc3JjL3J1c3Qvc3JjL2xpYmNvcmUvbWFjcm9zL21vZC5yc2Fzc2VydGlvbiBmYWlsZWQ6IGAobGVmdCA9PSByaWdodClgCiAgbGVmdDogYGAsCiByaWdodDogYGNhbGxlZCBgT3B0aW9uOjp1bndyYXAoKWAgb24gYSBgTm9uZWAgdmFsdWVYEBAAFwAAALQBAAAeAAAAc3JjL2xpYnN0ZC9wYW5pY2tpbmcucnNudWxsIHBvaW50ZXIgcGFzc2VkIHRvIHJ1c3RyZWN1cnNpdmUgdXNlIG9mIGFuIG9iamVjdCBkZXRlY3RlZCB3aGljaCB3b3VsZCBsZWFkIHRvIHVuc2FmZSBhbGlhc2luZyBpbiBydXN0AHsJcHJvZHVjZXJzAghsYW5ndWFnZQEEUnVzdAAMcHJvY2Vzc2VkLWJ5AwVydXN0Yx0xLjQ2LjAgKDA0NDg4YWZlMyAyMDIwLTA4LTI0KQZ3YWxydXMGMC4xOC4wDHdhc20tYmluZGdlbhIwLjIuNjggKGEwNGUxODk3MSk=");
|
||
let wasm;
|
||
let cachedTextDecoder = new TextDecoder('utf-8', {
|
||
ignoreBOM: true,
|
||
fatal: true
|
||
});
|
||
cachedTextDecoder.decode();
|
||
let cachegetUint8Memory0 = null;
|
||
function getUint8Memory0() {
|
||
if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) {
|
||
cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer);
|
||
}
|
||
return cachegetUint8Memory0;
|
||
}
|
||
function getStringFromWasm0(ptr, len) {
|
||
return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));
|
||
}
|
||
const heap = new Array(32).fill(undefined);
|
||
heap.push(undefined, null, true, false);
|
||
let heap_next = heap.length;
|
||
function addHeapObject(obj) {
|
||
if (heap_next === heap.length) heap.push(heap.length + 1);
|
||
const idx = heap_next;
|
||
heap_next = heap[idx];
|
||
heap[idx] = obj;
|
||
return idx;
|
||
}
|
||
function getObject(idx) {
|
||
return heap[idx];
|
||
}
|
||
function dropObject(idx) {
|
||
if (idx < 36) return;
|
||
heap[idx] = heap_next;
|
||
heap_next = idx;
|
||
}
|
||
function takeObject(idx) {
|
||
const ret = getObject(idx);
|
||
dropObject(idx);
|
||
return ret;
|
||
}
|
||
let WASM_VECTOR_LEN = 0;
|
||
let cachedTextEncoder = new TextEncoder('utf-8');
|
||
const encodeString = typeof cachedTextEncoder.encodeInto === 'function' ? function(arg, view) {
|
||
return cachedTextEncoder.encodeInto(arg, view);
|
||
} : function(arg, view) {
|
||
const buf = cachedTextEncoder.encode(arg);
|
||
view.set(buf);
|
||
return {
|
||
read: arg.length,
|
||
written: buf.length
|
||
};
|
||
};
|
||
function passStringToWasm0(arg, malloc, realloc) {
|
||
if (realloc === undefined) {
|
||
const buf = cachedTextEncoder.encode(arg);
|
||
const ptr = malloc(buf.length);
|
||
getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf);
|
||
WASM_VECTOR_LEN = buf.length;
|
||
return ptr;
|
||
}
|
||
let len = arg.length;
|
||
let ptr1 = malloc(len);
|
||
const mem = getUint8Memory0();
|
||
let offset = 0;
|
||
for(; offset < len; offset++){
|
||
const code = arg.charCodeAt(offset);
|
||
if (code > 0x7F) break;
|
||
mem[ptr1 + offset] = code;
|
||
}
|
||
if (offset !== len) {
|
||
if (offset !== 0) {
|
||
arg = arg.slice(offset);
|
||
}
|
||
ptr1 = realloc(ptr1, len, len = offset + arg.length * 3);
|
||
const view = getUint8Memory0().subarray(ptr1 + offset, ptr1 + len);
|
||
const ret = encodeString(arg, view);
|
||
offset += ret.written;
|
||
}
|
||
WASM_VECTOR_LEN = offset;
|
||
return ptr1;
|
||
}
|
||
function create_hash(algorithm) {
|
||
var ptr0 = passStringToWasm0(algorithm, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||
var len0 = WASM_VECTOR_LEN;
|
||
var ret = wasm.create_hash(ptr0, len0);
|
||
return DenoHash.__wrap(ret);
|
||
}
|
||
function _assertClass(instance, klass) {
|
||
if (!(instance instanceof klass)) {
|
||
throw new Error(`expected instance of ${klass.name}`);
|
||
}
|
||
return instance.ptr;
|
||
}
|
||
function passArray8ToWasm0(arg, malloc) {
|
||
const ptr = malloc(arg.length * 1);
|
||
getUint8Memory0().set(arg, ptr / 1);
|
||
WASM_VECTOR_LEN = arg.length;
|
||
return ptr;
|
||
}
|
||
function update_hash(hash, data) {
|
||
_assertClass(hash, DenoHash);
|
||
var ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_malloc);
|
||
var len0 = WASM_VECTOR_LEN;
|
||
wasm.update_hash(hash.ptr, ptr0, len0);
|
||
}
|
||
let cachegetInt32Memory0 = null;
|
||
function getInt32Memory0() {
|
||
if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== wasm.memory.buffer) {
|
||
cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer);
|
||
}
|
||
return cachegetInt32Memory0;
|
||
}
|
||
function getArrayU8FromWasm0(ptr, len) {
|
||
return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len);
|
||
}
|
||
function digest_hash(hash) {
|
||
try {
|
||
const retptr = wasm.__wbindgen_export_2.value - 16;
|
||
wasm.__wbindgen_export_2.value = retptr;
|
||
_assertClass(hash, DenoHash);
|
||
wasm.digest_hash(retptr, hash.ptr);
|
||
var r0 = getInt32Memory0()[retptr / 4 + 0];
|
||
var r1 = getInt32Memory0()[retptr / 4 + 1];
|
||
var v0 = getArrayU8FromWasm0(r0, r1).slice();
|
||
wasm.__wbindgen_free(r0, r1 * 1);
|
||
return v0;
|
||
} finally{
|
||
wasm.__wbindgen_export_2.value += 16;
|
||
}
|
||
}
|
||
class DenoHash {
|
||
static __wrap(ptr) {
|
||
const obj = Object.create(DenoHash.prototype);
|
||
obj.ptr = ptr;
|
||
return obj;
|
||
}
|
||
free() {
|
||
const ptr = this.ptr;
|
||
this.ptr = 0;
|
||
wasm.__wbg_denohash_free(ptr);
|
||
}
|
||
}
|
||
async function load(module, imports) {
|
||
if (typeof Response === 'function' && module instanceof Response) {
|
||
if (typeof WebAssembly.instantiateStreaming === 'function') {
|
||
try {
|
||
return await WebAssembly.instantiateStreaming(module, imports);
|
||
} catch (e) {
|
||
if (module.headers.get('Content-Type') != 'application/wasm') {
|
||
console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
|
||
} else {
|
||
throw e;
|
||
}
|
||
}
|
||
}
|
||
const bytes = await module.arrayBuffer();
|
||
return await WebAssembly.instantiate(bytes, imports);
|
||
} else {
|
||
const instance = await WebAssembly.instantiate(module, imports);
|
||
if (instance instanceof WebAssembly.Instance) {
|
||
return {
|
||
instance,
|
||
module
|
||
};
|
||
} else {
|
||
return instance;
|
||
}
|
||
}
|
||
}
|
||
async function init(input) {
|
||
if (typeof input === 'undefined') {
|
||
input = importMeta.url.replace(/\.js$/, '_bg.wasm');
|
||
}
|
||
const imports = {};
|
||
imports.wbg = {};
|
||
imports.wbg.__wbindgen_string_new = function(arg0, arg1) {
|
||
var ret = getStringFromWasm0(arg0, arg1);
|
||
return addHeapObject(ret);
|
||
};
|
||
imports.wbg.__wbindgen_throw = function(arg0, arg1) {
|
||
throw new Error(getStringFromWasm0(arg0, arg1));
|
||
};
|
||
imports.wbg.__wbindgen_rethrow = function(arg0) {
|
||
throw takeObject(arg0);
|
||
};
|
||
if (typeof input === 'string' || typeof Request === 'function' && input instanceof Request || typeof URL === 'function' && input instanceof URL) {
|
||
input = fetch(input);
|
||
}
|
||
const { instance , module } = await load(await input, imports);
|
||
wasm = instance.exports;
|
||
init.__wbindgen_wasm_module = module;
|
||
return wasm;
|
||
}
|
||
const hextable = new TextEncoder().encode("0123456789abcdef");
|
||
function encodedLen(n) {
|
||
return n * 2;
|
||
}
|
||
function encode1(src) {
|
||
const dst = new Uint8Array(encodedLen(src.length));
|
||
for(let i = 0; i < dst.length; i++){
|
||
const v = src[i];
|
||
dst[i * 2] = hextable[v >> 4];
|
||
dst[i * 2 + 1] = hextable[v & 0x0f];
|
||
}
|
||
return dst;
|
||
}
|
||
function encodeToString(src) {
|
||
return new TextDecoder().decode(encode1(src));
|
||
}
|
||
await init(source);
|
||
const TYPE_ERROR_MSG = "hash: `data` is invalid type";
|
||
class Hash {
|
||
#hash;
|
||
#digested;
|
||
constructor(algorithm){
|
||
this.#hash = create_hash(algorithm);
|
||
this.#digested = false;
|
||
}
|
||
update(data) {
|
||
let msg;
|
||
if (typeof data === "string") {
|
||
msg = new TextEncoder().encode(data);
|
||
} else if (typeof data === "object") {
|
||
if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {
|
||
msg = new Uint8Array(data);
|
||
} else {
|
||
throw new Error(TYPE_ERROR_MSG);
|
||
}
|
||
} else {
|
||
throw new Error(TYPE_ERROR_MSG);
|
||
}
|
||
update_hash(this.#hash, msg);
|
||
return this;
|
||
}
|
||
digest() {
|
||
if (this.#digested) throw new Error("hash: already digested");
|
||
this.#digested = true;
|
||
return digest_hash(this.#hash);
|
||
}
|
||
toString(format = "hex") {
|
||
const finalized = new Uint8Array(this.digest());
|
||
switch(format){
|
||
case "hex":
|
||
return encodeToString(finalized);
|
||
case "base64":
|
||
return encode(finalized);
|
||
default:
|
||
throw new Error("hash: invalid format");
|
||
}
|
||
}
|
||
}
|
||
function createHash(algorithm) {
|
||
return new Hash(algorithm);
|
||
}
|
||
const mod6 = {
|
||
createHash: createHash
|
||
};
|
||
const SEMVER_SPEC_VERSION = "2.0.0";
|
||
const MAX_LENGTH = 256;
|
||
const MAX_SAFE_COMPONENT_LENGTH = 16;
|
||
const re = [];
|
||
const src = [];
|
||
let R = 0;
|
||
const NUMERICIDENTIFIER = R++;
|
||
src[NUMERICIDENTIFIER] = "0|[1-9]\\d*";
|
||
const NUMERICIDENTIFIERLOOSE = R++;
|
||
src[NUMERICIDENTIFIERLOOSE] = "[0-9]+";
|
||
const NONNUMERICIDENTIFIER = R++;
|
||
src[NONNUMERICIDENTIFIER] = "\\d*[a-zA-Z-][a-zA-Z0-9-]*";
|
||
const MAINVERSION = R++;
|
||
const nid = src[NUMERICIDENTIFIER];
|
||
src[MAINVERSION] = `(${nid})\\.(${nid})\\.(${nid})`;
|
||
const MAINVERSIONLOOSE = R++;
|
||
const nidl = src[NUMERICIDENTIFIERLOOSE];
|
||
src[MAINVERSIONLOOSE] = `(${nidl})\\.(${nidl})\\.(${nidl})`;
|
||
const PRERELEASEIDENTIFIER = R++;
|
||
src[PRERELEASEIDENTIFIER] = "(?:" + src[NUMERICIDENTIFIER] + "|" + src[NONNUMERICIDENTIFIER] + ")";
|
||
const PRERELEASEIDENTIFIERLOOSE = R++;
|
||
src[PRERELEASEIDENTIFIERLOOSE] = "(?:" + src[NUMERICIDENTIFIERLOOSE] + "|" + src[NONNUMERICIDENTIFIER] + ")";
|
||
const PRERELEASE = R++;
|
||
src[PRERELEASE] = "(?:-(" + src[PRERELEASEIDENTIFIER] + "(?:\\." + src[PRERELEASEIDENTIFIER] + ")*))";
|
||
const PRERELEASELOOSE = R++;
|
||
src[PRERELEASELOOSE] = "(?:-?(" + src[PRERELEASEIDENTIFIERLOOSE] + "(?:\\." + src[PRERELEASEIDENTIFIERLOOSE] + ")*))";
|
||
const BUILDIDENTIFIER = R++;
|
||
src[BUILDIDENTIFIER] = "[0-9A-Za-z-]+";
|
||
const BUILD = R++;
|
||
src[BUILD] = "(?:\\+(" + src[BUILDIDENTIFIER] + "(?:\\." + src[BUILDIDENTIFIER] + ")*))";
|
||
const FULL = R++;
|
||
const FULLPLAIN = "v?" + src[MAINVERSION] + src[PRERELEASE] + "?" + src[BUILD] + "?";
|
||
src[FULL] = "^" + FULLPLAIN + "$";
|
||
const LOOSEPLAIN = "[v=\\s]*" + src[MAINVERSIONLOOSE] + src[PRERELEASELOOSE] + "?" + src[BUILD] + "?";
|
||
const LOOSE = R++;
|
||
src[LOOSE] = "^" + LOOSEPLAIN + "$";
|
||
const GTLT = R++;
|
||
src[GTLT] = "((?:<|>)?=?)";
|
||
const XRANGEIDENTIFIERLOOSE = R++;
|
||
src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + "|x|X|\\*";
|
||
const XRANGEIDENTIFIER = R++;
|
||
src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + "|x|X|\\*";
|
||
const XRANGEPLAIN = R++;
|
||
src[XRANGEPLAIN] = "[v=\\s]*(" + src[XRANGEIDENTIFIER] + ")" + "(?:\\.(" + src[XRANGEIDENTIFIER] + ")" + "(?:\\.(" + src[XRANGEIDENTIFIER] + ")" + "(?:" + src[PRERELEASE] + ")?" + src[BUILD] + "?" + ")?)?";
|
||
const XRANGEPLAINLOOSE = R++;
|
||
src[XRANGEPLAINLOOSE] = "[v=\\s]*(" + src[XRANGEIDENTIFIERLOOSE] + ")" + "(?:\\.(" + src[XRANGEIDENTIFIERLOOSE] + ")" + "(?:\\.(" + src[XRANGEIDENTIFIERLOOSE] + ")" + "(?:" + src[PRERELEASELOOSE] + ")?" + src[BUILD] + "?" + ")?)?";
|
||
const XRANGE = R++;
|
||
src[XRANGE] = "^" + src[GTLT] + "\\s*" + src[XRANGEPLAIN] + "$";
|
||
const XRANGELOOSE = R++;
|
||
src[XRANGELOOSE] = "^" + src[GTLT] + "\\s*" + src[XRANGEPLAINLOOSE] + "$";
|
||
const COERCE = R++;
|
||
src[COERCE] = "(?:^|[^\\d])" + "(\\d{1," + MAX_SAFE_COMPONENT_LENGTH + "})" + "(?:\\.(\\d{1," + MAX_SAFE_COMPONENT_LENGTH + "}))?" + "(?:\\.(\\d{1," + MAX_SAFE_COMPONENT_LENGTH + "}))?" + "(?:$|[^\\d])";
|
||
const LONETILDE = R++;
|
||
src[LONETILDE] = "(?:~>?)";
|
||
const TILDETRIM = R++;
|
||
src[TILDETRIM] = "(\\s*)" + src[LONETILDE] + "\\s+";
|
||
re[TILDETRIM] = new RegExp(src[TILDETRIM], "g");
|
||
const tildeTrimReplace = "$1~";
|
||
const TILDE = R++;
|
||
src[TILDE] = "^" + src[LONETILDE] + src[XRANGEPLAIN] + "$";
|
||
const TILDELOOSE = R++;
|
||
src[TILDELOOSE] = "^" + src[LONETILDE] + src[XRANGEPLAINLOOSE] + "$";
|
||
const LONECARET = R++;
|
||
src[LONECARET] = "(?:\\^)";
|
||
const CARETTRIM = R++;
|
||
src[CARETTRIM] = "(\\s*)" + src[LONECARET] + "\\s+";
|
||
re[CARETTRIM] = new RegExp(src[CARETTRIM], "g");
|
||
const caretTrimReplace = "$1^";
|
||
const CARET = R++;
|
||
src[CARET] = "^" + src[LONECARET] + src[XRANGEPLAIN] + "$";
|
||
const CARETLOOSE = R++;
|
||
src[CARETLOOSE] = "^" + src[LONECARET] + src[XRANGEPLAINLOOSE] + "$";
|
||
const COMPARATORLOOSE = R++;
|
||
src[COMPARATORLOOSE] = "^" + src[GTLT] + "\\s*(" + LOOSEPLAIN + ")$|^$";
|
||
const COMPARATOR = R++;
|
||
src[COMPARATOR] = "^" + src[GTLT] + "\\s*(" + FULLPLAIN + ")$|^$";
|
||
const COMPARATORTRIM = R++;
|
||
src[COMPARATORTRIM] = "(\\s*)" + src[GTLT] + "\\s*(" + LOOSEPLAIN + "|" + src[XRANGEPLAIN] + ")";
|
||
re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], "g");
|
||
const comparatorTrimReplace = "$1$2$3";
|
||
const HYPHENRANGE = R++;
|
||
src[HYPHENRANGE] = "^\\s*(" + src[XRANGEPLAIN] + ")" + "\\s+-\\s+" + "(" + src[XRANGEPLAIN] + ")" + "\\s*$";
|
||
const HYPHENRANGELOOSE = R++;
|
||
src[HYPHENRANGELOOSE] = "^\\s*(" + src[XRANGEPLAINLOOSE] + ")" + "\\s+-\\s+" + "(" + src[XRANGEPLAINLOOSE] + ")" + "\\s*$";
|
||
const STAR = R++;
|
||
src[STAR] = "(<|>)?=?\\s*\\*";
|
||
for(let i = 0; i < R; i++){
|
||
if (!re[i]) {
|
||
re[i] = new RegExp(src[i]);
|
||
}
|
||
}
|
||
function parse4(version, optionsOrLoose) {
|
||
if (!optionsOrLoose || typeof optionsOrLoose !== "object") {
|
||
optionsOrLoose = {
|
||
loose: !!optionsOrLoose,
|
||
includePrerelease: false
|
||
};
|
||
}
|
||
if (version instanceof SemVer) {
|
||
return version;
|
||
}
|
||
if (typeof version !== "string") {
|
||
return null;
|
||
}
|
||
if (version.length > MAX_LENGTH) {
|
||
return null;
|
||
}
|
||
const r = optionsOrLoose.loose ? re[LOOSE] : re[FULL];
|
||
if (!r.test(version)) {
|
||
return null;
|
||
}
|
||
try {
|
||
return new SemVer(version, optionsOrLoose);
|
||
} catch (er) {
|
||
return null;
|
||
}
|
||
}
|
||
function valid(version, optionsOrLoose) {
|
||
if (version === null) return null;
|
||
const v = parse4(version, optionsOrLoose);
|
||
return v ? v.version : null;
|
||
}
|
||
function clean(version, optionsOrLoose) {
|
||
const s = parse4(version.trim().replace(/^[=v]+/, ""), optionsOrLoose);
|
||
return s ? s.version : null;
|
||
}
|
||
class SemVer {
|
||
constructor(version, optionsOrLoose){
|
||
if (!optionsOrLoose || typeof optionsOrLoose !== "object") {
|
||
optionsOrLoose = {
|
||
loose: !!optionsOrLoose,
|
||
includePrerelease: false
|
||
};
|
||
}
|
||
if (version instanceof SemVer) {
|
||
if (version.loose === optionsOrLoose.loose) {
|
||
return version;
|
||
} else {
|
||
version = version.version;
|
||
}
|
||
} else if (typeof version !== "string") {
|
||
throw new TypeError("Invalid Version: " + version);
|
||
}
|
||
if (version.length > MAX_LENGTH) {
|
||
throw new TypeError("version is longer than " + MAX_LENGTH + " characters");
|
||
}
|
||
if (!(this instanceof SemVer)) {
|
||
return new SemVer(version, optionsOrLoose);
|
||
}
|
||
this.options = optionsOrLoose;
|
||
this.loose = !!optionsOrLoose.loose;
|
||
const m = version.trim().match(optionsOrLoose.loose ? re[LOOSE] : re[FULL]);
|
||
if (!m) {
|
||
throw new TypeError("Invalid Version: " + version);
|
||
}
|
||
this.raw = version;
|
||
this.major = +m[1];
|
||
this.minor = +m[2];
|
||
this.patch = +m[3];
|
||
if (this.major > Number.MAX_SAFE_INTEGER || this.major < 0) {
|
||
throw new TypeError("Invalid major version");
|
||
}
|
||
if (this.minor > Number.MAX_SAFE_INTEGER || this.minor < 0) {
|
||
throw new TypeError("Invalid minor version");
|
||
}
|
||
if (this.patch > Number.MAX_SAFE_INTEGER || this.patch < 0) {
|
||
throw new TypeError("Invalid patch version");
|
||
}
|
||
if (!m[4]) {
|
||
this.prerelease = [];
|
||
} else {
|
||
this.prerelease = m[4].split(".").map((id)=>{
|
||
if (/^[0-9]+$/.test(id)) {
|
||
const num = +id;
|
||
if (num >= 0 && num < Number.MAX_SAFE_INTEGER) {
|
||
return num;
|
||
}
|
||
}
|
||
return id;
|
||
});
|
||
}
|
||
this.build = m[5] ? m[5].split(".") : [];
|
||
this.format();
|
||
}
|
||
format() {
|
||
this.version = this.major + "." + this.minor + "." + this.patch;
|
||
if (this.prerelease.length) {
|
||
this.version += "-" + this.prerelease.join(".");
|
||
}
|
||
return this.version;
|
||
}
|
||
compare(other) {
|
||
if (!(other instanceof SemVer)) {
|
||
other = new SemVer(other, this.options);
|
||
}
|
||
return this.compareMain(other) || this.comparePre(other);
|
||
}
|
||
compareMain(other) {
|
||
if (!(other instanceof SemVer)) {
|
||
other = new SemVer(other, this.options);
|
||
}
|
||
return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch);
|
||
}
|
||
comparePre(other) {
|
||
if (!(other instanceof SemVer)) {
|
||
other = new SemVer(other, this.options);
|
||
}
|
||
if (this.prerelease.length && !other.prerelease.length) {
|
||
return -1;
|
||
} else if (!this.prerelease.length && other.prerelease.length) {
|
||
return 1;
|
||
} else if (!this.prerelease.length && !other.prerelease.length) {
|
||
return 0;
|
||
}
|
||
let i = 0;
|
||
do {
|
||
const a = this.prerelease[i];
|
||
const b = other.prerelease[i];
|
||
if (a === undefined && b === undefined) {
|
||
return 0;
|
||
} else if (b === undefined) {
|
||
return 1;
|
||
} else if (a === undefined) {
|
||
return -1;
|
||
} else if (a === b) {
|
||
continue;
|
||
} else {
|
||
return compareIdentifiers(a, b);
|
||
}
|
||
}while (++i)
|
||
return 1;
|
||
}
|
||
compareBuild(other) {
|
||
if (!(other instanceof SemVer)) {
|
||
other = new SemVer(other, this.options);
|
||
}
|
||
let i = 0;
|
||
do {
|
||
const a = this.build[i];
|
||
const b = other.build[i];
|
||
if (a === undefined && b === undefined) {
|
||
return 0;
|
||
} else if (b === undefined) {
|
||
return 1;
|
||
} else if (a === undefined) {
|
||
return -1;
|
||
} else if (a === b) {
|
||
continue;
|
||
} else {
|
||
return compareIdentifiers(a, b);
|
||
}
|
||
}while (++i)
|
||
return 1;
|
||
}
|
||
inc(release, identifier) {
|
||
switch(release){
|
||
case "premajor":
|
||
this.prerelease.length = 0;
|
||
this.patch = 0;
|
||
this.minor = 0;
|
||
this.major++;
|
||
this.inc("pre", identifier);
|
||
break;
|
||
case "preminor":
|
||
this.prerelease.length = 0;
|
||
this.patch = 0;
|
||
this.minor++;
|
||
this.inc("pre", identifier);
|
||
break;
|
||
case "prepatch":
|
||
this.prerelease.length = 0;
|
||
this.inc("patch", identifier);
|
||
this.inc("pre", identifier);
|
||
break;
|
||
case "prerelease":
|
||
if (this.prerelease.length === 0) {
|
||
this.inc("patch", identifier);
|
||
}
|
||
this.inc("pre", identifier);
|
||
break;
|
||
case "major":
|
||
if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) {
|
||
this.major++;
|
||
}
|
||
this.minor = 0;
|
||
this.patch = 0;
|
||
this.prerelease = [];
|
||
break;
|
||
case "minor":
|
||
if (this.patch !== 0 || this.prerelease.length === 0) {
|
||
this.minor++;
|
||
}
|
||
this.patch = 0;
|
||
this.prerelease = [];
|
||
break;
|
||
case "patch":
|
||
if (this.prerelease.length === 0) {
|
||
this.patch++;
|
||
}
|
||
this.prerelease = [];
|
||
break;
|
||
case "pre":
|
||
if (this.prerelease.length === 0) {
|
||
this.prerelease = [
|
||
0
|
||
];
|
||
} else {
|
||
let i = this.prerelease.length;
|
||
while(--i >= 0){
|
||
if (typeof this.prerelease[i] === "number") {
|
||
this.prerelease[i]++;
|
||
i = -2;
|
||
}
|
||
}
|
||
if (i === -1) {
|
||
this.prerelease.push(0);
|
||
}
|
||
}
|
||
if (identifier) {
|
||
if (this.prerelease[0] === identifier) {
|
||
if (isNaN(this.prerelease[1])) {
|
||
this.prerelease = [
|
||
identifier,
|
||
0
|
||
];
|
||
}
|
||
} else {
|
||
this.prerelease = [
|
||
identifier,
|
||
0
|
||
];
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
throw new Error("invalid increment argument: " + release);
|
||
}
|
||
this.format();
|
||
this.raw = this.version;
|
||
return this;
|
||
}
|
||
toString() {
|
||
return this.version;
|
||
}
|
||
}
|
||
function inc(version, release, optionsOrLoose, identifier) {
|
||
if (typeof optionsOrLoose === "string") {
|
||
identifier = optionsOrLoose;
|
||
optionsOrLoose = undefined;
|
||
}
|
||
try {
|
||
return new SemVer(version, optionsOrLoose).inc(release, identifier).version;
|
||
} catch (er) {
|
||
return null;
|
||
}
|
||
}
|
||
function diff(version1, version2, optionsOrLoose) {
|
||
if (eq(version1, version2, optionsOrLoose)) {
|
||
return null;
|
||
} else {
|
||
const v1 = parse4(version1);
|
||
const v2 = parse4(version2);
|
||
let prefix = "";
|
||
let defaultResult = null;
|
||
if (v1 && v2) {
|
||
if (v1.prerelease.length || v2.prerelease.length) {
|
||
prefix = "pre";
|
||
defaultResult = "prerelease";
|
||
}
|
||
for(const key in v1){
|
||
if (key === "major" || key === "minor" || key === "patch") {
|
||
if (v1[key] !== v2[key]) {
|
||
return prefix + key;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return defaultResult;
|
||
}
|
||
}
|
||
const numeric = /^[0-9]+$/;
|
||
function compareIdentifiers(a, b) {
|
||
const anum = numeric.test(a);
|
||
const bnum = numeric.test(b);
|
||
if (a === null || b === null) throw "Comparison against null invalid";
|
||
if (anum && bnum) {
|
||
a = +a;
|
||
b = +b;
|
||
}
|
||
return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1;
|
||
}
|
||
function rcompareIdentifiers(a, b) {
|
||
return compareIdentifiers(b, a);
|
||
}
|
||
function major(v, optionsOrLoose) {
|
||
return new SemVer(v, optionsOrLoose).major;
|
||
}
|
||
function minor(v, optionsOrLoose) {
|
||
return new SemVer(v, optionsOrLoose).minor;
|
||
}
|
||
function patch(v, optionsOrLoose) {
|
||
return new SemVer(v, optionsOrLoose).patch;
|
||
}
|
||
function compare(v1, v2, optionsOrLoose) {
|
||
return new SemVer(v1, optionsOrLoose).compare(new SemVer(v2, optionsOrLoose));
|
||
}
|
||
function compareLoose(a, b) {
|
||
return compare(a, b, true);
|
||
}
|
||
function compareBuild(a, b, loose) {
|
||
var versionA = new SemVer(a, loose);
|
||
var versionB = new SemVer(b, loose);
|
||
return versionA.compare(versionB) || versionA.compareBuild(versionB);
|
||
}
|
||
function rcompare(v1, v2, optionsOrLoose) {
|
||
return compare(v2, v1, optionsOrLoose);
|
||
}
|
||
function sort(list, optionsOrLoose) {
|
||
return list.sort((a, b)=>{
|
||
return compareBuild(a, b, optionsOrLoose);
|
||
});
|
||
}
|
||
function rsort(list, optionsOrLoose) {
|
||
return list.sort((a, b)=>{
|
||
return compareBuild(b, a, optionsOrLoose);
|
||
});
|
||
}
|
||
function gt(v1, v2, optionsOrLoose) {
|
||
return compare(v1, v2, optionsOrLoose) > 0;
|
||
}
|
||
function lt(v1, v2, optionsOrLoose) {
|
||
return compare(v1, v2, optionsOrLoose) < 0;
|
||
}
|
||
function eq(v1, v2, optionsOrLoose) {
|
||
return compare(v1, v2, optionsOrLoose) === 0;
|
||
}
|
||
function neq(v1, v2, optionsOrLoose) {
|
||
return compare(v1, v2, optionsOrLoose) !== 0;
|
||
}
|
||
function gte(v1, v2, optionsOrLoose) {
|
||
return compare(v1, v2, optionsOrLoose) >= 0;
|
||
}
|
||
function lte(v1, v2, optionsOrLoose) {
|
||
return compare(v1, v2, optionsOrLoose) <= 0;
|
||
}
|
||
function cmp(v1, operator, v2, optionsOrLoose) {
|
||
switch(operator){
|
||
case "===":
|
||
if (typeof v1 === "object") v1 = v1.version;
|
||
if (typeof v2 === "object") v2 = v2.version;
|
||
return v1 === v2;
|
||
case "!==":
|
||
if (typeof v1 === "object") v1 = v1.version;
|
||
if (typeof v2 === "object") v2 = v2.version;
|
||
return v1 !== v2;
|
||
case "":
|
||
case "=":
|
||
case "==":
|
||
return eq(v1, v2, optionsOrLoose);
|
||
case "!=":
|
||
return neq(v1, v2, optionsOrLoose);
|
||
case ">":
|
||
return gt(v1, v2, optionsOrLoose);
|
||
case ">=":
|
||
return gte(v1, v2, optionsOrLoose);
|
||
case "<":
|
||
return lt(v1, v2, optionsOrLoose);
|
||
case "<=":
|
||
return lte(v1, v2, optionsOrLoose);
|
||
default:
|
||
throw new TypeError("Invalid operator: " + operator);
|
||
}
|
||
}
|
||
const ANY = {};
|
||
class Comparator {
|
||
constructor(comp, optionsOrLoose){
|
||
if (!optionsOrLoose || typeof optionsOrLoose !== "object") {
|
||
optionsOrLoose = {
|
||
loose: !!optionsOrLoose,
|
||
includePrerelease: false
|
||
};
|
||
}
|
||
if (comp instanceof Comparator) {
|
||
if (comp.loose === !!optionsOrLoose.loose) {
|
||
return comp;
|
||
} else {
|
||
comp = comp.value;
|
||
}
|
||
}
|
||
if (!(this instanceof Comparator)) {
|
||
return new Comparator(comp, optionsOrLoose);
|
||
}
|
||
this.options = optionsOrLoose;
|
||
this.loose = !!optionsOrLoose.loose;
|
||
this.parse(comp);
|
||
if (this.semver === ANY) {
|
||
this.value = "";
|
||
} else {
|
||
this.value = this.operator + this.semver.version;
|
||
}
|
||
}
|
||
parse(comp) {
|
||
const r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
|
||
const m = comp.match(r);
|
||
if (!m) {
|
||
throw new TypeError("Invalid comparator: " + comp);
|
||
}
|
||
const m1 = m[1];
|
||
this.operator = m1 !== undefined ? m1 : "";
|
||
if (this.operator === "=") {
|
||
this.operator = "";
|
||
}
|
||
if (!m[2]) {
|
||
this.semver = ANY;
|
||
} else {
|
||
this.semver = new SemVer(m[2], this.options.loose);
|
||
}
|
||
}
|
||
test(version) {
|
||
if (this.semver === ANY || version === ANY) {
|
||
return true;
|
||
}
|
||
if (typeof version === "string") {
|
||
version = new SemVer(version, this.options);
|
||
}
|
||
return cmp(version, this.operator, this.semver, this.options);
|
||
}
|
||
intersects(comp, optionsOrLoose) {
|
||
if (!(comp instanceof Comparator)) {
|
||
throw new TypeError("a Comparator is required");
|
||
}
|
||
if (!optionsOrLoose || typeof optionsOrLoose !== "object") {
|
||
optionsOrLoose = {
|
||
loose: !!optionsOrLoose,
|
||
includePrerelease: false
|
||
};
|
||
}
|
||
let rangeTmp;
|
||
if (this.operator === "") {
|
||
if (this.value === "") {
|
||
return true;
|
||
}
|
||
rangeTmp = new Range(comp.value, optionsOrLoose);
|
||
return satisfies(this.value, rangeTmp, optionsOrLoose);
|
||
} else if (comp.operator === "") {
|
||
if (comp.value === "") {
|
||
return true;
|
||
}
|
||
rangeTmp = new Range(this.value, optionsOrLoose);
|
||
return satisfies(comp.semver, rangeTmp, optionsOrLoose);
|
||
}
|
||
const sameDirectionIncreasing = (this.operator === ">=" || this.operator === ">") && (comp.operator === ">=" || comp.operator === ">");
|
||
const sameDirectionDecreasing = (this.operator === "<=" || this.operator === "<") && (comp.operator === "<=" || comp.operator === "<");
|
||
const sameSemVer = this.semver.version === comp.semver.version;
|
||
const differentDirectionsInclusive = (this.operator === ">=" || this.operator === "<=") && (comp.operator === ">=" || comp.operator === "<=");
|
||
const oppositeDirectionsLessThan = cmp(this.semver, "<", comp.semver, optionsOrLoose) && (this.operator === ">=" || this.operator === ">") && (comp.operator === "<=" || comp.operator === "<");
|
||
const oppositeDirectionsGreaterThan = cmp(this.semver, ">", comp.semver, optionsOrLoose) && (this.operator === "<=" || this.operator === "<") && (comp.operator === ">=" || comp.operator === ">");
|
||
return sameDirectionIncreasing || sameDirectionDecreasing || sameSemVer && differentDirectionsInclusive || oppositeDirectionsLessThan || oppositeDirectionsGreaterThan;
|
||
}
|
||
toString() {
|
||
return this.value;
|
||
}
|
||
}
|
||
class Range {
|
||
constructor(range, optionsOrLoose){
|
||
if (!optionsOrLoose || typeof optionsOrLoose !== "object") {
|
||
optionsOrLoose = {
|
||
loose: !!optionsOrLoose,
|
||
includePrerelease: false
|
||
};
|
||
}
|
||
if (range instanceof Range) {
|
||
if (range.loose === !!optionsOrLoose.loose && range.includePrerelease === !!optionsOrLoose.includePrerelease) {
|
||
return range;
|
||
} else {
|
||
return new Range(range.raw, optionsOrLoose);
|
||
}
|
||
}
|
||
if (range instanceof Comparator) {
|
||
return new Range(range.value, optionsOrLoose);
|
||
}
|
||
if (!(this instanceof Range)) {
|
||
return new Range(range, optionsOrLoose);
|
||
}
|
||
this.options = optionsOrLoose;
|
||
this.loose = !!optionsOrLoose.loose;
|
||
this.includePrerelease = !!optionsOrLoose.includePrerelease;
|
||
this.raw = range;
|
||
this.set = range.split(/\s*\|\|\s*/).map((range)=>this.parseRange(range.trim())).filter((c)=>{
|
||
return c.length;
|
||
});
|
||
if (!this.set.length) {
|
||
throw new TypeError("Invalid SemVer Range: " + range);
|
||
}
|
||
this.format();
|
||
}
|
||
format() {
|
||
this.range = this.set.map((comps)=>comps.join(" ").trim()).join("||").trim();
|
||
return this.range;
|
||
}
|
||
parseRange(range) {
|
||
const loose = this.options.loose;
|
||
range = range.trim();
|
||
const hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE];
|
||
range = range.replace(hr, hyphenReplace);
|
||
range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace);
|
||
range = range.replace(re[TILDETRIM], tildeTrimReplace);
|
||
range = range.replace(re[CARETTRIM], caretTrimReplace);
|
||
range = range.split(/\s+/).join(" ");
|
||
const compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
|
||
let set = range.split(" ").map((comp)=>parseComparator(comp, this.options)).join(" ").split(/\s+/);
|
||
if (this.options.loose) {
|
||
set = set.filter((comp)=>{
|
||
return !!comp.match(compRe);
|
||
});
|
||
}
|
||
return set.map((comp)=>new Comparator(comp, this.options));
|
||
}
|
||
test(version) {
|
||
if (typeof version === "string") {
|
||
version = new SemVer(version, this.options);
|
||
}
|
||
for(var i = 0; i < this.set.length; i++){
|
||
if (testSet(this.set[i], version, this.options)) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
intersects(range, optionsOrLoose) {
|
||
if (!(range instanceof Range)) {
|
||
throw new TypeError("a Range is required");
|
||
}
|
||
return this.set.some((thisComparators)=>{
|
||
return isSatisfiable(thisComparators, optionsOrLoose) && range.set.some((rangeComparators)=>{
|
||
return isSatisfiable(rangeComparators, optionsOrLoose) && thisComparators.every((thisComparator)=>{
|
||
return rangeComparators.every((rangeComparator)=>{
|
||
return thisComparator.intersects(rangeComparator, optionsOrLoose);
|
||
});
|
||
});
|
||
});
|
||
});
|
||
}
|
||
toString() {
|
||
return this.range;
|
||
}
|
||
}
|
||
function testSet(set, version, options) {
|
||
for(let i = 0; i < set.length; i++){
|
||
if (!set[i].test(version)) {
|
||
return false;
|
||
}
|
||
}
|
||
if (version.prerelease.length && !options.includePrerelease) {
|
||
for(let i1 = 0; i1 < set.length; i1++){
|
||
if (set[i1].semver === ANY) {
|
||
continue;
|
||
}
|
||
if (set[i1].semver.prerelease.length > 0) {
|
||
const allowed = set[i1].semver;
|
||
if (allowed.major === version.major && allowed.minor === version.minor && allowed.patch === version.patch) {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
function isSatisfiable(comparators, options) {
|
||
let result = true;
|
||
const remainingComparators = comparators.slice();
|
||
let testComparator = remainingComparators.pop();
|
||
while(result && remainingComparators.length){
|
||
result = remainingComparators.every((otherComparator)=>{
|
||
return testComparator?.intersects(otherComparator, options);
|
||
});
|
||
testComparator = remainingComparators.pop();
|
||
}
|
||
return result;
|
||
}
|
||
function toComparators(range, optionsOrLoose) {
|
||
return new Range(range, optionsOrLoose).set.map((comp)=>{
|
||
return comp.map((c)=>c.value).join(" ").trim().split(" ");
|
||
});
|
||
}
|
||
function parseComparator(comp, options) {
|
||
comp = replaceCarets(comp, options);
|
||
comp = replaceTildes(comp, options);
|
||
comp = replaceXRanges(comp, options);
|
||
comp = replaceStars(comp, options);
|
||
return comp;
|
||
}
|
||
function isX(id) {
|
||
return !id || id.toLowerCase() === "x" || id === "*";
|
||
}
|
||
function replaceTildes(comp, options) {
|
||
return comp.trim().split(/\s+/).map((comp)=>replaceTilde(comp, options)).join(" ");
|
||
}
|
||
function replaceTilde(comp, options) {
|
||
const r = options.loose ? re[TILDELOOSE] : re[TILDE];
|
||
return comp.replace(r, (_, M, m, p, pr)=>{
|
||
let ret;
|
||
if (isX(M)) {
|
||
ret = "";
|
||
} else if (isX(m)) {
|
||
ret = ">=" + M + ".0.0 <" + (+M + 1) + ".0.0";
|
||
} else if (isX(p)) {
|
||
ret = ">=" + M + "." + m + ".0 <" + M + "." + (+m + 1) + ".0";
|
||
} else if (pr) {
|
||
ret = ">=" + M + "." + m + "." + p + "-" + pr + " <" + M + "." + (+m + 1) + ".0";
|
||
} else {
|
||
ret = ">=" + M + "." + m + "." + p + " <" + M + "." + (+m + 1) + ".0";
|
||
}
|
||
return ret;
|
||
});
|
||
}
|
||
function replaceCarets(comp, options) {
|
||
return comp.trim().split(/\s+/).map((comp)=>replaceCaret(comp, options)).join(" ");
|
||
}
|
||
function replaceCaret(comp, options) {
|
||
const r = options.loose ? re[CARETLOOSE] : re[CARET];
|
||
return comp.replace(r, (_, M, m, p, pr)=>{
|
||
let ret;
|
||
if (isX(M)) {
|
||
ret = "";
|
||
} else if (isX(m)) {
|
||
ret = ">=" + M + ".0.0 <" + (+M + 1) + ".0.0";
|
||
} else if (isX(p)) {
|
||
if (M === "0") {
|
||
ret = ">=" + M + "." + m + ".0 <" + M + "." + (+m + 1) + ".0";
|
||
} else {
|
||
ret = ">=" + M + "." + m + ".0 <" + (+M + 1) + ".0.0";
|
||
}
|
||
} else if (pr) {
|
||
if (M === "0") {
|
||
if (m === "0") {
|
||
ret = ">=" + M + "." + m + "." + p + "-" + pr + " <" + M + "." + m + "." + (+p + 1);
|
||
} else {
|
||
ret = ">=" + M + "." + m + "." + p + "-" + pr + " <" + M + "." + (+m + 1) + ".0";
|
||
}
|
||
} else {
|
||
ret = ">=" + M + "." + m + "." + p + "-" + pr + " <" + (+M + 1) + ".0.0";
|
||
}
|
||
} else {
|
||
if (M === "0") {
|
||
if (m === "0") {
|
||
ret = ">=" + M + "." + m + "." + p + " <" + M + "." + m + "." + (+p + 1);
|
||
} else {
|
||
ret = ">=" + M + "." + m + "." + p + " <" + M + "." + (+m + 1) + ".0";
|
||
}
|
||
} else {
|
||
ret = ">=" + M + "." + m + "." + p + " <" + (+M + 1) + ".0.0";
|
||
}
|
||
}
|
||
return ret;
|
||
});
|
||
}
|
||
function replaceXRanges(comp, options) {
|
||
return comp.split(/\s+/).map((comp)=>replaceXRange(comp, options)).join(" ");
|
||
}
|
||
function replaceXRange(comp, options) {
|
||
comp = comp.trim();
|
||
const r = options.loose ? re[XRANGELOOSE] : re[XRANGE];
|
||
return comp.replace(r, (ret, gtlt, M, m, p, pr)=>{
|
||
const xM = isX(M);
|
||
const xm = xM || isX(m);
|
||
const xp = xm || isX(p);
|
||
const anyX = xp;
|
||
if (gtlt === "=" && anyX) {
|
||
gtlt = "";
|
||
}
|
||
if (xM) {
|
||
if (gtlt === ">" || gtlt === "<") {
|
||
ret = "<0.0.0";
|
||
} else {
|
||
ret = "*";
|
||
}
|
||
} else if (gtlt && anyX) {
|
||
if (xm) {
|
||
m = 0;
|
||
}
|
||
p = 0;
|
||
if (gtlt === ">") {
|
||
gtlt = ">=";
|
||
if (xm) {
|
||
M = +M + 1;
|
||
m = 0;
|
||
p = 0;
|
||
} else {
|
||
m = +m + 1;
|
||
p = 0;
|
||
}
|
||
} else if (gtlt === "<=") {
|
||
gtlt = "<";
|
||
if (xm) {
|
||
M = +M + 1;
|
||
} else {
|
||
m = +m + 1;
|
||
}
|
||
}
|
||
ret = gtlt + M + "." + m + "." + p;
|
||
} else if (xm) {
|
||
ret = ">=" + M + ".0.0 <" + (+M + 1) + ".0.0";
|
||
} else if (xp) {
|
||
ret = ">=" + M + "." + m + ".0 <" + M + "." + (+m + 1) + ".0";
|
||
}
|
||
return ret;
|
||
});
|
||
}
|
||
function replaceStars(comp, options) {
|
||
return comp.trim().replace(re[STAR], "");
|
||
}
|
||
function hyphenReplace($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr, tb) {
|
||
if (isX(fM)) {
|
||
from = "";
|
||
} else if (isX(fm)) {
|
||
from = ">=" + fM + ".0.0";
|
||
} else if (isX(fp)) {
|
||
from = ">=" + fM + "." + fm + ".0";
|
||
} else {
|
||
from = ">=" + from;
|
||
}
|
||
if (isX(tM)) {
|
||
to = "";
|
||
} else if (isX(tm)) {
|
||
to = "<" + (+tM + 1) + ".0.0";
|
||
} else if (isX(tp)) {
|
||
to = "<" + tM + "." + (+tm + 1) + ".0";
|
||
} else if (tpr) {
|
||
to = "<=" + tM + "." + tm + "." + tp + "-" + tpr;
|
||
} else {
|
||
to = "<=" + to;
|
||
}
|
||
return (from + " " + to).trim();
|
||
}
|
||
function satisfies(version, range, optionsOrLoose) {
|
||
try {
|
||
range = new Range(range, optionsOrLoose);
|
||
} catch (er) {
|
||
return false;
|
||
}
|
||
return range.test(version);
|
||
}
|
||
function maxSatisfying(versions, range, optionsOrLoose) {
|
||
var max = null;
|
||
var maxSV = null;
|
||
try {
|
||
var rangeObj = new Range(range, optionsOrLoose);
|
||
} catch (er) {
|
||
return null;
|
||
}
|
||
versions.forEach((v)=>{
|
||
if (rangeObj.test(v)) {
|
||
if (!max || maxSV && maxSV.compare(v) === -1) {
|
||
max = v;
|
||
maxSV = new SemVer(max, optionsOrLoose);
|
||
}
|
||
}
|
||
});
|
||
return max;
|
||
}
|
||
function minSatisfying(versions, range, optionsOrLoose) {
|
||
var min = null;
|
||
var minSV = null;
|
||
try {
|
||
var rangeObj = new Range(range, optionsOrLoose);
|
||
} catch (er) {
|
||
return null;
|
||
}
|
||
versions.forEach((v)=>{
|
||
if (rangeObj.test(v)) {
|
||
if (!min || minSV.compare(v) === 1) {
|
||
min = v;
|
||
minSV = new SemVer(min, optionsOrLoose);
|
||
}
|
||
}
|
||
});
|
||
return min;
|
||
}
|
||
function minVersion(range, optionsOrLoose) {
|
||
range = new Range(range, optionsOrLoose);
|
||
var minver = new SemVer("0.0.0");
|
||
if (range.test(minver)) {
|
||
return minver;
|
||
}
|
||
minver = new SemVer("0.0.0-0");
|
||
if (range.test(minver)) {
|
||
return minver;
|
||
}
|
||
minver = null;
|
||
for(var i = 0; i < range.set.length; ++i){
|
||
var comparators = range.set[i];
|
||
comparators.forEach((comparator)=>{
|
||
var compver = new SemVer(comparator.semver.version);
|
||
switch(comparator.operator){
|
||
case ">":
|
||
if (compver.prerelease.length === 0) {
|
||
compver.patch++;
|
||
} else {
|
||
compver.prerelease.push(0);
|
||
}
|
||
compver.raw = compver.format();
|
||
case "":
|
||
case ">=":
|
||
if (!minver || gt(minver, compver)) {
|
||
minver = compver;
|
||
}
|
||
break;
|
||
case "<":
|
||
case "<=":
|
||
break;
|
||
default:
|
||
throw new Error("Unexpected operation: " + comparator.operator);
|
||
}
|
||
});
|
||
}
|
||
if (minver && range.test(minver)) {
|
||
return minver;
|
||
}
|
||
return null;
|
||
}
|
||
function validRange(range, optionsOrLoose) {
|
||
try {
|
||
if (range === null) return null;
|
||
return new Range(range, optionsOrLoose).range || "*";
|
||
} catch (er) {
|
||
return null;
|
||
}
|
||
}
|
||
function ltr(version, range, optionsOrLoose) {
|
||
return outside(version, range, "<", optionsOrLoose);
|
||
}
|
||
function gtr(version, range, optionsOrLoose) {
|
||
return outside(version, range, ">", optionsOrLoose);
|
||
}
|
||
function outside(version, range, hilo, optionsOrLoose) {
|
||
version = new SemVer(version, optionsOrLoose);
|
||
range = new Range(range, optionsOrLoose);
|
||
let gtfn;
|
||
let ltefn;
|
||
let ltfn;
|
||
let comp;
|
||
let ecomp;
|
||
switch(hilo){
|
||
case ">":
|
||
gtfn = gt;
|
||
ltefn = lte;
|
||
ltfn = lt;
|
||
comp = ">";
|
||
ecomp = ">=";
|
||
break;
|
||
case "<":
|
||
gtfn = lt;
|
||
ltefn = gte;
|
||
ltfn = gt;
|
||
comp = "<";
|
||
ecomp = "<=";
|
||
break;
|
||
default:
|
||
throw new TypeError('Must provide a hilo val of "<" or ">"');
|
||
}
|
||
if (satisfies(version, range, optionsOrLoose)) {
|
||
return false;
|
||
}
|
||
for(let i = 0; i < range.set.length; ++i){
|
||
const comparators = range.set[i];
|
||
let high = null;
|
||
let low = null;
|
||
comparators.forEach((comparator)=>{
|
||
if (comparator.semver === ANY) {
|
||
comparator = new Comparator(">=0.0.0");
|
||
}
|
||
high = high || comparator;
|
||
low = low || comparator;
|
||
if (gtfn(comparator.semver, high.semver, optionsOrLoose)) {
|
||
high = comparator;
|
||
} else if (ltfn(comparator.semver, low.semver, optionsOrLoose)) {
|
||
low = comparator;
|
||
}
|
||
});
|
||
if (high === null || low === null) return true;
|
||
if (high.operator === comp || high.operator === ecomp) {
|
||
return false;
|
||
}
|
||
if ((!low.operator || low.operator === comp) && ltefn(version, low.semver)) {
|
||
return false;
|
||
} else if (low.operator === ecomp && ltfn(version, low.semver)) {
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
function prerelease(version, optionsOrLoose) {
|
||
var parsed = parse4(version, optionsOrLoose);
|
||
return parsed && parsed.prerelease.length ? parsed.prerelease : null;
|
||
}
|
||
function intersects(range1, range2, optionsOrLoose) {
|
||
range1 = new Range(range1, optionsOrLoose);
|
||
range2 = new Range(range2, optionsOrLoose);
|
||
return range1.intersects(range2);
|
||
}
|
||
function coerce(version, optionsOrLoose) {
|
||
if (version instanceof SemVer) {
|
||
return version;
|
||
}
|
||
if (typeof version !== "string") {
|
||
return null;
|
||
}
|
||
const match = version.match(re[COERCE]);
|
||
if (match == null) {
|
||
return null;
|
||
}
|
||
return parse4(match[1] + "." + (match[2] || "0") + "." + (match[3] || "0"), optionsOrLoose);
|
||
}
|
||
const mod7 = {
|
||
SEMVER_SPEC_VERSION: SEMVER_SPEC_VERSION,
|
||
parse: parse4,
|
||
valid: valid,
|
||
clean: clean,
|
||
SemVer: SemVer,
|
||
inc: inc,
|
||
diff: diff,
|
||
compareIdentifiers: compareIdentifiers,
|
||
rcompareIdentifiers: rcompareIdentifiers,
|
||
major: major,
|
||
minor: minor,
|
||
patch: patch,
|
||
compare: compare,
|
||
compareLoose: compareLoose,
|
||
compareBuild: compareBuild,
|
||
rcompare: rcompare,
|
||
sort: sort,
|
||
rsort: rsort,
|
||
gt: gt,
|
||
lt: lt,
|
||
eq: eq,
|
||
neq: neq,
|
||
gte: gte,
|
||
lte: lte,
|
||
cmp: cmp,
|
||
Comparator: Comparator,
|
||
Range: Range,
|
||
toComparators: toComparators,
|
||
satisfies: satisfies,
|
||
maxSatisfying: maxSatisfying,
|
||
minSatisfying: minSatisfying,
|
||
minVersion: minVersion,
|
||
validRange: validRange,
|
||
ltr: ltr,
|
||
gtr: gtr,
|
||
outside: outside,
|
||
prerelease: prerelease,
|
||
intersects: intersects,
|
||
coerce: coerce,
|
||
default: SemVer
|
||
};
|
||
const version = "1.11.0";
|
||
const TaskName_AST = {
|
||
"moduleName": "dnit.manifest",
|
||
"decl": {
|
||
"annotations": [],
|
||
"type_": {
|
||
"kind": "newtype_",
|
||
"value": {
|
||
"typeParams": [],
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "primitive",
|
||
"value": "String"
|
||
},
|
||
"parameters": []
|
||
}
|
||
}
|
||
},
|
||
"name": "TaskName",
|
||
"version": {
|
||
"kind": "nothing"
|
||
}
|
||
}
|
||
};
|
||
const TrackedFileName_AST = {
|
||
"moduleName": "dnit.manifest",
|
||
"decl": {
|
||
"annotations": [],
|
||
"type_": {
|
||
"kind": "newtype_",
|
||
"value": {
|
||
"typeParams": [],
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "primitive",
|
||
"value": "String"
|
||
},
|
||
"parameters": []
|
||
}
|
||
}
|
||
},
|
||
"name": "TrackedFileName",
|
||
"version": {
|
||
"kind": "nothing"
|
||
}
|
||
}
|
||
};
|
||
const TrackedFileHash_AST = {
|
||
"moduleName": "dnit.manifest",
|
||
"decl": {
|
||
"annotations": [],
|
||
"type_": {
|
||
"kind": "newtype_",
|
||
"value": {
|
||
"typeParams": [],
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "primitive",
|
||
"value": "String"
|
||
},
|
||
"parameters": []
|
||
}
|
||
}
|
||
},
|
||
"name": "TrackedFileHash",
|
||
"version": {
|
||
"kind": "nothing"
|
||
}
|
||
}
|
||
};
|
||
const Timestamp_AST = {
|
||
"moduleName": "dnit.manifest",
|
||
"decl": {
|
||
"annotations": [],
|
||
"type_": {
|
||
"kind": "newtype_",
|
||
"value": {
|
||
"typeParams": [],
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "primitive",
|
||
"value": "String"
|
||
},
|
||
"parameters": []
|
||
}
|
||
}
|
||
},
|
||
"name": "Timestamp",
|
||
"version": {
|
||
"kind": "nothing"
|
||
}
|
||
}
|
||
};
|
||
const TaskData_AST = {
|
||
"moduleName": "dnit.manifest",
|
||
"decl": {
|
||
"annotations": [],
|
||
"type_": {
|
||
"kind": "struct_",
|
||
"value": {
|
||
"typeParams": [],
|
||
"fields": [
|
||
{
|
||
"annotations": [],
|
||
"serializedName": "lastExecution",
|
||
"default": {
|
||
"kind": "just",
|
||
"value": null
|
||
},
|
||
"name": "lastExecution",
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "primitive",
|
||
"value": "Nullable"
|
||
},
|
||
"parameters": [
|
||
{
|
||
"typeRef": {
|
||
"kind": "reference",
|
||
"value": {
|
||
"moduleName": "dnit.manifest",
|
||
"name": "Timestamp"
|
||
}
|
||
},
|
||
"parameters": []
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"annotations": [],
|
||
"serializedName": "trackedFiles",
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"name": "trackedFiles",
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "reference",
|
||
"value": {
|
||
"moduleName": "sys.types",
|
||
"name": "Map"
|
||
}
|
||
},
|
||
"parameters": [
|
||
{
|
||
"typeRef": {
|
||
"kind": "reference",
|
||
"value": {
|
||
"moduleName": "dnit.manifest",
|
||
"name": "TrackedFileName"
|
||
}
|
||
},
|
||
"parameters": []
|
||
},
|
||
{
|
||
"typeRef": {
|
||
"kind": "reference",
|
||
"value": {
|
||
"moduleName": "dnit.manifest",
|
||
"name": "TrackedFileData"
|
||
}
|
||
},
|
||
"parameters": []
|
||
}
|
||
]
|
||
}
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"name": "TaskData",
|
||
"version": {
|
||
"kind": "nothing"
|
||
}
|
||
}
|
||
};
|
||
const TrackedFileData_AST = {
|
||
"moduleName": "dnit.manifest",
|
||
"decl": {
|
||
"annotations": [],
|
||
"type_": {
|
||
"kind": "struct_",
|
||
"value": {
|
||
"typeParams": [],
|
||
"fields": [
|
||
{
|
||
"annotations": [],
|
||
"serializedName": "hash",
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"name": "hash",
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "reference",
|
||
"value": {
|
||
"moduleName": "dnit.manifest",
|
||
"name": "TrackedFileHash"
|
||
}
|
||
},
|
||
"parameters": []
|
||
}
|
||
},
|
||
{
|
||
"annotations": [],
|
||
"serializedName": "timestamp",
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"name": "timestamp",
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "reference",
|
||
"value": {
|
||
"moduleName": "dnit.manifest",
|
||
"name": "Timestamp"
|
||
}
|
||
},
|
||
"parameters": []
|
||
}
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"name": "TrackedFileData",
|
||
"version": {
|
||
"kind": "nothing"
|
||
}
|
||
}
|
||
};
|
||
const Manifest_AST = {
|
||
"moduleName": "dnit.manifest",
|
||
"decl": {
|
||
"annotations": [],
|
||
"type_": {
|
||
"kind": "struct_",
|
||
"value": {
|
||
"typeParams": [],
|
||
"fields": [
|
||
{
|
||
"annotations": [],
|
||
"serializedName": "tasks",
|
||
"default": {
|
||
"kind": "just",
|
||
"value": []
|
||
},
|
||
"name": "tasks",
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "reference",
|
||
"value": {
|
||
"moduleName": "sys.types",
|
||
"name": "Map"
|
||
}
|
||
},
|
||
"parameters": [
|
||
{
|
||
"typeRef": {
|
||
"kind": "reference",
|
||
"value": {
|
||
"moduleName": "dnit.manifest",
|
||
"name": "TaskName"
|
||
}
|
||
},
|
||
"parameters": []
|
||
},
|
||
{
|
||
"typeRef": {
|
||
"kind": "reference",
|
||
"value": {
|
||
"moduleName": "dnit.manifest",
|
||
"name": "TaskData"
|
||
}
|
||
},
|
||
"parameters": []
|
||
}
|
||
]
|
||
}
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"name": "Manifest",
|
||
"version": {
|
||
"kind": "nothing"
|
||
}
|
||
}
|
||
};
|
||
const _AST_MAP = {
|
||
"dnit.manifest.TaskName": TaskName_AST,
|
||
"dnit.manifest.TrackedFileName": TrackedFileName_AST,
|
||
"dnit.manifest.TrackedFileHash": TrackedFileHash_AST,
|
||
"dnit.manifest.Timestamp": Timestamp_AST,
|
||
"dnit.manifest.TaskData": TaskData_AST,
|
||
"dnit.manifest.TrackedFileData": TrackedFileData_AST,
|
||
"dnit.manifest.Manifest": Manifest_AST
|
||
};
|
||
function isEnum(union) {
|
||
for (let field of union.fields){
|
||
if (!isVoid(field.typeExpr)) {
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
function isVoid(texpr) {
|
||
if (texpr.typeRef.kind === "primitive") {
|
||
return texpr.typeRef.value === "Void";
|
||
}
|
||
return false;
|
||
}
|
||
Symbol();
|
||
Symbol();
|
||
Symbol();
|
||
Symbol();
|
||
function asJsonObject(jv) {
|
||
if (jv instanceof Object && !(jv instanceof Array)) {
|
||
return jv;
|
||
}
|
||
return undefined;
|
||
}
|
||
function asJsonArray(jv) {
|
||
if (jv instanceof Array) {
|
||
return jv;
|
||
}
|
||
return undefined;
|
||
}
|
||
function jsonParseException(message) {
|
||
const context = [];
|
||
let createContextString = ()=>{
|
||
const rcontext = context.slice(0);
|
||
rcontext.push('$');
|
||
rcontext.reverse();
|
||
return rcontext.join('.');
|
||
};
|
||
return {
|
||
kind: 'JsonParseException',
|
||
getMessage () {
|
||
return message + ' at ' + createContextString();
|
||
},
|
||
pushField (fieldName) {
|
||
context.push(fieldName);
|
||
},
|
||
pushIndex (index) {
|
||
context.push('[' + index + ']');
|
||
},
|
||
toString () {
|
||
return this.getMessage();
|
||
}
|
||
};
|
||
}
|
||
function isJsonParseException(exception) {
|
||
return exception.kind === 'JsonParseException';
|
||
}
|
||
function buildJsonBinding(dresolver, texpr, boundTypeParams) {
|
||
if (texpr.typeRef.kind === "primitive") {
|
||
return primitiveJsonBinding(dresolver, texpr.typeRef.value, texpr.parameters, boundTypeParams);
|
||
} else if (texpr.typeRef.kind === "reference") {
|
||
const ast = dresolver(texpr.typeRef.value);
|
||
if (ast.decl.type_.kind === "struct_") {
|
||
return structJsonBinding(dresolver, ast.decl.type_.value, texpr.parameters, boundTypeParams);
|
||
} else if (ast.decl.type_.kind === "union_") {
|
||
const union = ast.decl.type_.value;
|
||
if (isEnum(union)) {
|
||
return enumJsonBinding(dresolver, union, texpr.parameters, boundTypeParams);
|
||
} else {
|
||
return unionJsonBinding(dresolver, union, texpr.parameters, boundTypeParams);
|
||
}
|
||
} else if (ast.decl.type_.kind === "newtype_") {
|
||
return newtypeJsonBinding(dresolver, ast.decl.type_.value, texpr.parameters, boundTypeParams);
|
||
} else if (ast.decl.type_.kind === "type_") {
|
||
return typedefJsonBinding(dresolver, ast.decl.type_.value, texpr.parameters, boundTypeParams);
|
||
}
|
||
} else if (texpr.typeRef.kind === "typeParam") {
|
||
return boundTypeParams[texpr.typeRef.value];
|
||
}
|
||
throw new Error("buildJsonBinding : unimplemented ADL type");
|
||
}
|
||
function primitiveJsonBinding(dresolver, ptype, params, boundTypeParams) {
|
||
if (ptype === "String") {
|
||
return identityJsonBinding("a string", (v)=>typeof v === 'string');
|
||
} else if (ptype === "Int8") {
|
||
return identityJsonBinding("a number", (v)=>typeof v === 'number');
|
||
} else if (ptype === "Void") {
|
||
return identityJsonBinding("a null", (v)=>v === null);
|
||
} else if (ptype === "Bool") {
|
||
return identityJsonBinding("a bool", (v)=>typeof v === 'boolean');
|
||
} else if (ptype === "Int8") {
|
||
return identityJsonBinding("a number", (v)=>typeof v === 'number');
|
||
} else if (ptype === "Int16") {
|
||
return identityJsonBinding("a number", (v)=>typeof v === 'number');
|
||
} else if (ptype === "Int32") {
|
||
return identityJsonBinding("a number", (v)=>typeof v === 'number');
|
||
} else if (ptype === "Int64") {
|
||
return identityJsonBinding("a number", (v)=>typeof v === 'number');
|
||
} else if (ptype === "Word8") {
|
||
return identityJsonBinding("a number", (v)=>typeof v === 'number');
|
||
} else if (ptype === "Word16") {
|
||
return identityJsonBinding("a number", (v)=>typeof v === 'number');
|
||
} else if (ptype === "Word32") {
|
||
return identityJsonBinding("a number", (v)=>typeof v === 'number');
|
||
} else if (ptype === "Word64") {
|
||
return identityJsonBinding("a number", (v)=>typeof v === 'number');
|
||
} else if (ptype === "Float") {
|
||
return identityJsonBinding("a number", (v)=>typeof v === 'number');
|
||
} else if (ptype === "Double") {
|
||
return identityJsonBinding("a number", (v)=>typeof v === 'number');
|
||
} else if (ptype === "Json") {
|
||
return identityJsonBinding("a json value", (_v)=>true);
|
||
} else if (ptype === "Bytes") {
|
||
return bytesJsonBinding();
|
||
} else if (ptype === "Vector") {
|
||
return vectorJsonBinding(dresolver, params[0], boundTypeParams);
|
||
} else if (ptype === "StringMap") {
|
||
return stringMapJsonBinding(dresolver, params[0], boundTypeParams);
|
||
} else if (ptype === "Nullable") {
|
||
return nullableJsonBinding(dresolver, params[0], boundTypeParams);
|
||
} else throw new Error("Unimplemented json binding for primitive " + ptype);
|
||
}
|
||
function identityJsonBinding(expected, predicate) {
|
||
function toJson(v) {
|
||
return v;
|
||
}
|
||
function fromJson(json) {
|
||
if (!predicate(json)) {
|
||
throw jsonParseException("expected " + expected);
|
||
}
|
||
return json;
|
||
}
|
||
return {
|
||
toJson,
|
||
fromJson
|
||
};
|
||
}
|
||
function bytesJsonBinding() {
|
||
function toJson(v) {
|
||
throw new Error("bytesJsonBinding not implemented");
|
||
}
|
||
function fromJson(json) {
|
||
if (typeof json != 'string') {
|
||
throw jsonParseException('expected a string');
|
||
}
|
||
throw new Error("bytesJsonBinding not implemented");
|
||
}
|
||
return {
|
||
toJson,
|
||
fromJson
|
||
};
|
||
}
|
||
function vectorJsonBinding(dresolver, texpr, boundTypeParams) {
|
||
const elementBinding = once(()=>buildJsonBinding(dresolver, texpr, boundTypeParams));
|
||
function toJson(v) {
|
||
return v.map(elementBinding().toJson);
|
||
}
|
||
function fromJson(json) {
|
||
const jarr = asJsonArray(json);
|
||
if (jarr == undefined) {
|
||
throw jsonParseException('expected an array');
|
||
}
|
||
let result = [];
|
||
jarr.forEach((eljson, i)=>{
|
||
try {
|
||
result.push(elementBinding().fromJson(eljson));
|
||
} catch (e) {
|
||
if (isJsonParseException(e)) {
|
||
e.pushIndex(i);
|
||
}
|
||
throw e;
|
||
}
|
||
});
|
||
return result;
|
||
}
|
||
return {
|
||
toJson,
|
||
fromJson
|
||
};
|
||
}
|
||
function stringMapJsonBinding(dresolver, texpr, boundTypeParams) {
|
||
const elementBinding = once(()=>buildJsonBinding(dresolver, texpr, boundTypeParams));
|
||
function toJson(v) {
|
||
const result = {};
|
||
for(let k in v){
|
||
result[k] = elementBinding().toJson(v[k]);
|
||
}
|
||
return result;
|
||
}
|
||
function fromJson(json) {
|
||
const jobj = asJsonObject(json);
|
||
if (!jobj) {
|
||
throw jsonParseException('expected an object');
|
||
}
|
||
let result = {};
|
||
for(let k in jobj){
|
||
try {
|
||
result[k] = elementBinding().fromJson(jobj[k]);
|
||
} catch (e) {
|
||
if (isJsonParseException(e)) {
|
||
e.pushField(k);
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
return {
|
||
toJson,
|
||
fromJson
|
||
};
|
||
}
|
||
function nullableJsonBinding(dresolver, texpr, boundTypeParams) {
|
||
const elementBinding = once(()=>buildJsonBinding(dresolver, texpr, boundTypeParams));
|
||
function toJson(v) {
|
||
if (v === null) {
|
||
return null;
|
||
}
|
||
return elementBinding().toJson(v);
|
||
}
|
||
function fromJson(json) {
|
||
if (json === null) {
|
||
return null;
|
||
}
|
||
return elementBinding().fromJson(json);
|
||
}
|
||
return {
|
||
toJson,
|
||
fromJson
|
||
};
|
||
}
|
||
function structJsonBinding(dresolver, struct, params, boundTypeParams) {
|
||
const newBoundTypeParams = createBoundTypeParams(dresolver, struct.typeParams, params, boundTypeParams);
|
||
const fieldDetails = [];
|
||
struct.fields.forEach((field)=>{
|
||
let buildDefault = once(()=>{
|
||
if (field.default.kind === "just") {
|
||
const json = field.default.value;
|
||
return {
|
||
'value': buildJsonBinding(dresolver, field.typeExpr, newBoundTypeParams).fromJson(json)
|
||
};
|
||
} else {
|
||
return null;
|
||
}
|
||
});
|
||
fieldDetails.push({
|
||
field: field,
|
||
jsonBinding: once(()=>buildJsonBinding(dresolver, field.typeExpr, newBoundTypeParams)),
|
||
buildDefault: buildDefault
|
||
});
|
||
});
|
||
function toJson(v0) {
|
||
const v = v0;
|
||
const json = {};
|
||
fieldDetails.forEach((fd)=>{
|
||
json[fd.field.serializedName] = fd.jsonBinding().toJson(v && v[fd.field.name]);
|
||
});
|
||
return json;
|
||
}
|
||
function fromJson(json) {
|
||
const jobj = asJsonObject(json);
|
||
if (!jobj) {
|
||
throw jsonParseException("expected an object");
|
||
}
|
||
const v = {};
|
||
fieldDetails.forEach((fd)=>{
|
||
if (jobj[fd.field.serializedName] === undefined) {
|
||
const defaultv = fd.buildDefault();
|
||
if (defaultv === null) {
|
||
throw jsonParseException("missing struct field " + fd.field.serializedName);
|
||
} else {
|
||
v[fd.field.name] = defaultv.value;
|
||
}
|
||
} else {
|
||
try {
|
||
v[fd.field.name] = fd.jsonBinding().fromJson(jobj[fd.field.serializedName]);
|
||
} catch (e) {
|
||
if (isJsonParseException(e)) {
|
||
e.pushField(fd.field.serializedName);
|
||
}
|
||
throw e;
|
||
}
|
||
}
|
||
});
|
||
return v;
|
||
}
|
||
return {
|
||
toJson,
|
||
fromJson
|
||
};
|
||
}
|
||
function enumJsonBinding(_dresolver, union, _params, _boundTypeParams) {
|
||
const fieldSerializedNames = [];
|
||
const fieldNumbers = {};
|
||
union.fields.forEach((field, i)=>{
|
||
fieldSerializedNames.push(field.serializedName);
|
||
fieldNumbers[field.serializedName] = i;
|
||
});
|
||
function toJson(v) {
|
||
return fieldSerializedNames[v];
|
||
}
|
||
function fromJson(json) {
|
||
if (typeof json !== 'string') {
|
||
throw jsonParseException("expected a string for enum");
|
||
}
|
||
const result = fieldNumbers[json];
|
||
if (result === undefined) {
|
||
throw jsonParseException("invalid string for enum: " + json);
|
||
}
|
||
return result;
|
||
}
|
||
return {
|
||
toJson,
|
||
fromJson
|
||
};
|
||
}
|
||
function unionJsonBinding(dresolver, union, params, boundTypeParams) {
|
||
const newBoundTypeParams = createBoundTypeParams(dresolver, union.typeParams, params, boundTypeParams);
|
||
const detailsByName = {};
|
||
const detailsBySerializedName = {};
|
||
union.fields.forEach((field)=>{
|
||
const details = {
|
||
field: field,
|
||
isVoid: isVoid(field.typeExpr),
|
||
jsonBinding: once(()=>buildJsonBinding(dresolver, field.typeExpr, newBoundTypeParams))
|
||
};
|
||
detailsByName[field.name] = details;
|
||
detailsBySerializedName[field.serializedName] = details;
|
||
});
|
||
function toJson(v0) {
|
||
const v = v0;
|
||
const details = detailsByName[v.kind];
|
||
if (details.isVoid) {
|
||
return details.field.serializedName;
|
||
} else {
|
||
const result = {};
|
||
result[details.field.serializedName] = details.jsonBinding().toJson(v.value);
|
||
return result;
|
||
}
|
||
}
|
||
function lookupDetails(serializedName) {
|
||
let details = detailsBySerializedName[serializedName];
|
||
if (details === undefined) {
|
||
throw jsonParseException("invalid union field " + serializedName);
|
||
}
|
||
return details;
|
||
}
|
||
function fromJson(json) {
|
||
if (typeof json === "string") {
|
||
let details = lookupDetails(json);
|
||
if (!details.isVoid) {
|
||
throw jsonParseException("union field " + json + "needs an associated value");
|
||
}
|
||
return {
|
||
kind: details.field.name
|
||
};
|
||
}
|
||
const jobj = asJsonObject(json);
|
||
if (jobj) {
|
||
for(let k in jobj){
|
||
let details1 = lookupDetails(k);
|
||
try {
|
||
return {
|
||
kind: details1.field.name,
|
||
value: details1.jsonBinding().fromJson(jobj[k])
|
||
};
|
||
} catch (e) {
|
||
if (isJsonParseException(e)) {
|
||
e.pushField(k);
|
||
}
|
||
throw e;
|
||
}
|
||
}
|
||
throw jsonParseException("union without a property");
|
||
} else {
|
||
throw jsonParseException("expected an object or string");
|
||
}
|
||
}
|
||
return {
|
||
toJson,
|
||
fromJson
|
||
};
|
||
}
|
||
function newtypeJsonBinding(dresolver, newtype, params, boundTypeParams) {
|
||
const newBoundTypeParams = createBoundTypeParams(dresolver, newtype.typeParams, params, boundTypeParams);
|
||
return buildJsonBinding(dresolver, newtype.typeExpr, newBoundTypeParams);
|
||
}
|
||
function typedefJsonBinding(dresolver, typedef, params, boundTypeParams) {
|
||
const newBoundTypeParams = createBoundTypeParams(dresolver, typedef.typeParams, params, boundTypeParams);
|
||
return buildJsonBinding(dresolver, typedef.typeExpr, newBoundTypeParams);
|
||
}
|
||
function createBoundTypeParams(dresolver, paramNames, paramTypes, boundTypeParams) {
|
||
let result = {};
|
||
paramNames.forEach((paramName, i)=>{
|
||
result[paramName] = buildJsonBinding(dresolver, paramTypes[i], boundTypeParams);
|
||
});
|
||
return result;
|
||
}
|
||
function once(run) {
|
||
let result = null;
|
||
return ()=>{
|
||
if (result === null) {
|
||
result = run();
|
||
}
|
||
return result;
|
||
};
|
||
}
|
||
function declResolver(...astMaps) {
|
||
const astMap = {};
|
||
for (let map of astMaps){
|
||
for(let scopedName in map){
|
||
astMap[scopedName] = map[scopedName];
|
||
}
|
||
}
|
||
function resolver(scopedName) {
|
||
const scopedNameStr = scopedName.moduleName + "." + scopedName.name;
|
||
const result = astMap[scopedNameStr];
|
||
if (result === undefined) {
|
||
throw new Error("Unable to resolve ADL type " + scopedNameStr);
|
||
}
|
||
return result;
|
||
}
|
||
return resolver;
|
||
}
|
||
const Pair_AST = {
|
||
"moduleName": "sys.types",
|
||
"decl": {
|
||
"annotations": [],
|
||
"type_": {
|
||
"kind": "struct_",
|
||
"value": {
|
||
"typeParams": [
|
||
"T1",
|
||
"T2"
|
||
],
|
||
"fields": [
|
||
{
|
||
"annotations": [],
|
||
"serializedName": "v1",
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"name": "v1",
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "typeParam",
|
||
"value": "T1"
|
||
},
|
||
"parameters": []
|
||
}
|
||
},
|
||
{
|
||
"annotations": [],
|
||
"serializedName": "v2",
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"name": "v2",
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "typeParam",
|
||
"value": "T2"
|
||
},
|
||
"parameters": []
|
||
}
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"name": "Pair",
|
||
"version": {
|
||
"kind": "nothing"
|
||
}
|
||
}
|
||
};
|
||
const Either_AST = {
|
||
"moduleName": "sys.types",
|
||
"decl": {
|
||
"annotations": [],
|
||
"type_": {
|
||
"kind": "union_",
|
||
"value": {
|
||
"typeParams": [
|
||
"T1",
|
||
"T2"
|
||
],
|
||
"fields": [
|
||
{
|
||
"annotations": [],
|
||
"serializedName": "left",
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"name": "left",
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "typeParam",
|
||
"value": "T1"
|
||
},
|
||
"parameters": []
|
||
}
|
||
},
|
||
{
|
||
"annotations": [],
|
||
"serializedName": "right",
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"name": "right",
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "typeParam",
|
||
"value": "T2"
|
||
},
|
||
"parameters": []
|
||
}
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"name": "Either",
|
||
"version": {
|
||
"kind": "nothing"
|
||
}
|
||
}
|
||
};
|
||
const Maybe_AST = {
|
||
"moduleName": "sys.types",
|
||
"decl": {
|
||
"annotations": [],
|
||
"type_": {
|
||
"kind": "union_",
|
||
"value": {
|
||
"typeParams": [
|
||
"T"
|
||
],
|
||
"fields": [
|
||
{
|
||
"annotations": [],
|
||
"serializedName": "nothing",
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"name": "nothing",
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "primitive",
|
||
"value": "Void"
|
||
},
|
||
"parameters": []
|
||
}
|
||
},
|
||
{
|
||
"annotations": [],
|
||
"serializedName": "just",
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"name": "just",
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "typeParam",
|
||
"value": "T"
|
||
},
|
||
"parameters": []
|
||
}
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"name": "Maybe",
|
||
"version": {
|
||
"kind": "nothing"
|
||
}
|
||
}
|
||
};
|
||
const Error_AST = {
|
||
"moduleName": "sys.types",
|
||
"decl": {
|
||
"annotations": [],
|
||
"type_": {
|
||
"kind": "union_",
|
||
"value": {
|
||
"typeParams": [
|
||
"T"
|
||
],
|
||
"fields": [
|
||
{
|
||
"annotations": [],
|
||
"serializedName": "value",
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"name": "value",
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "typeParam",
|
||
"value": "T"
|
||
},
|
||
"parameters": []
|
||
}
|
||
},
|
||
{
|
||
"annotations": [],
|
||
"serializedName": "error",
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"name": "error",
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "primitive",
|
||
"value": "String"
|
||
},
|
||
"parameters": []
|
||
}
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"name": "Error",
|
||
"version": {
|
||
"kind": "nothing"
|
||
}
|
||
}
|
||
};
|
||
const MapEntry_AST = {
|
||
"moduleName": "sys.types",
|
||
"decl": {
|
||
"annotations": [],
|
||
"type_": {
|
||
"kind": "struct_",
|
||
"value": {
|
||
"typeParams": [
|
||
"K",
|
||
"V"
|
||
],
|
||
"fields": [
|
||
{
|
||
"annotations": [],
|
||
"serializedName": "k",
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"name": "key",
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "typeParam",
|
||
"value": "K"
|
||
},
|
||
"parameters": []
|
||
}
|
||
},
|
||
{
|
||
"annotations": [],
|
||
"serializedName": "v",
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"name": "value",
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "typeParam",
|
||
"value": "V"
|
||
},
|
||
"parameters": []
|
||
}
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"name": "MapEntry",
|
||
"version": {
|
||
"kind": "nothing"
|
||
}
|
||
}
|
||
};
|
||
const Map_AST = {
|
||
"moduleName": "sys.types",
|
||
"decl": {
|
||
"annotations": [],
|
||
"type_": {
|
||
"kind": "newtype_",
|
||
"value": {
|
||
"typeParams": [
|
||
"K",
|
||
"V"
|
||
],
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "primitive",
|
||
"value": "Vector"
|
||
},
|
||
"parameters": [
|
||
{
|
||
"typeRef": {
|
||
"kind": "reference",
|
||
"value": {
|
||
"moduleName": "sys.types",
|
||
"name": "Pair"
|
||
}
|
||
},
|
||
"parameters": [
|
||
{
|
||
"typeRef": {
|
||
"kind": "typeParam",
|
||
"value": "K"
|
||
},
|
||
"parameters": []
|
||
},
|
||
{
|
||
"typeRef": {
|
||
"kind": "typeParam",
|
||
"value": "V"
|
||
},
|
||
"parameters": []
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
},
|
||
"name": "Map",
|
||
"version": {
|
||
"kind": "nothing"
|
||
}
|
||
}
|
||
};
|
||
const Set_AST = {
|
||
"moduleName": "sys.types",
|
||
"decl": {
|
||
"annotations": [],
|
||
"type_": {
|
||
"kind": "newtype_",
|
||
"value": {
|
||
"typeParams": [
|
||
"T"
|
||
],
|
||
"default": {
|
||
"kind": "nothing"
|
||
},
|
||
"typeExpr": {
|
||
"typeRef": {
|
||
"kind": "primitive",
|
||
"value": "Vector"
|
||
},
|
||
"parameters": [
|
||
{
|
||
"typeRef": {
|
||
"kind": "typeParam",
|
||
"value": "T"
|
||
},
|
||
"parameters": []
|
||
}
|
||
]
|
||
}
|
||
}
|
||
},
|
||
"name": "Set",
|
||
"version": {
|
||
"kind": "nothing"
|
||
}
|
||
}
|
||
};
|
||
const _AST_MAP1 = {
|
||
"sys.types.Pair": Pair_AST,
|
||
"sys.types.Either": Either_AST,
|
||
"sys.types.Maybe": Maybe_AST,
|
||
"sys.types.Error": Error_AST,
|
||
"sys.types.MapEntry": MapEntry_AST,
|
||
"sys.types.Map": Map_AST,
|
||
"sys.types.Set": Set_AST
|
||
};
|
||
const ADL = {
|
||
..._AST_MAP,
|
||
..._AST_MAP1
|
||
};
|
||
declResolver(ADL);
|
||
class ADLMap {
|
||
constructor(data, isEqual){
|
||
this.data = data;
|
||
this.isEqual = isEqual;
|
||
}
|
||
has(k) {
|
||
return this.findIndex(k) !== -1;
|
||
}
|
||
get(k) {
|
||
const ind = this.findIndex(k);
|
||
if (ind === -1) {
|
||
return undefined;
|
||
}
|
||
return this.data[ind].v2;
|
||
}
|
||
getOrInsert(k, v) {
|
||
const existing = this.get(k);
|
||
if (existing === undefined) {
|
||
this.set(k, v);
|
||
return v;
|
||
}
|
||
return existing;
|
||
}
|
||
set(k, v) {
|
||
const ind = this.findIndex(k);
|
||
if (ind === -1) {
|
||
this.data.push({
|
||
v1: k,
|
||
v2: v
|
||
});
|
||
}
|
||
this.data[ind] = {
|
||
v1: k,
|
||
v2: v
|
||
};
|
||
return this;
|
||
}
|
||
keys() {
|
||
return this.data.map((p)=>p.v1);
|
||
}
|
||
values() {
|
||
return this.data.map((p)=>p.v2);
|
||
}
|
||
entries() {
|
||
return this.data.map((p)=>[
|
||
p.v1,
|
||
p.v2
|
||
]);
|
||
}
|
||
toData() {
|
||
return this.data;
|
||
}
|
||
findIndex(k) {
|
||
return this.data.findIndex((p)=>this.isEqual(p.v1, k));
|
||
}
|
||
}
|
||
class TaskManifest {
|
||
lastExecution = null;
|
||
trackedFiles = new ADLMap([], (k1, k2)=>k1 === k2);
|
||
constructor(data){
|
||
this.trackedFiles = new ADLMap(data.trackedFiles, (k1, k2)=>k1 === k2);
|
||
this.lastExecution = data.lastExecution;
|
||
}
|
||
getFileData(fn) {
|
||
return this.trackedFiles.get(fn);
|
||
}
|
||
setFileData(fn, d) {
|
||
this.trackedFiles.set(fn, d);
|
||
}
|
||
setExecutionTimestamp() {
|
||
this.lastExecution = new Date().toISOString();
|
||
}
|
||
toData() {
|
||
return {
|
||
lastExecution: this.lastExecution,
|
||
trackedFiles: this.trackedFiles.toData()
|
||
};
|
||
}
|
||
}
|
||
function taskContext(ctx, task) {
|
||
return {
|
||
logger: ctx.taskLogger,
|
||
task,
|
||
args: ctx.args
|
||
};
|
||
}
|
||
function isTask(dep) {
|
||
return dep instanceof Task;
|
||
}
|
||
function isTrackedFile(dep) {
|
||
return dep instanceof TrackedFile;
|
||
}
|
||
function isTrackedFileAsync(dep) {
|
||
return dep instanceof TrackedFilesAsync;
|
||
}
|
||
async function statPath(path) {
|
||
try {
|
||
const fileInfo = await Deno.stat(path);
|
||
return {
|
||
kind: 'fileInfo',
|
||
fileInfo
|
||
};
|
||
} catch (err) {
|
||
if (err instanceof Deno.errors.NotFound) {
|
||
return {
|
||
kind: 'nonExistent'
|
||
};
|
||
}
|
||
throw err;
|
||
}
|
||
}
|
||
class Task {
|
||
taskManifest = null;
|
||
constructor(taskParams){
|
||
this.name = taskParams.name;
|
||
this.action = taskParams.action;
|
||
this.description = taskParams.description;
|
||
this.task_deps = new Set(this.getTaskDeps(taskParams.deps || []));
|
||
this.file_deps = new Set(this.getTrackedFiles(taskParams.deps || []));
|
||
this.async_files_deps = new Set(this.getTrackedFilesAsync(taskParams.deps || []));
|
||
this.targets = new Set(taskParams.targets || []);
|
||
this.uptodate = taskParams.uptodate;
|
||
for (const f of this.targets){
|
||
f.setTask(this);
|
||
}
|
||
}
|
||
getTaskDeps(deps) {
|
||
return deps.filter(isTask);
|
||
}
|
||
getTrackedFiles(deps) {
|
||
return deps.filter(isTrackedFile);
|
||
}
|
||
getTrackedFilesAsync(deps) {
|
||
return deps.filter(isTrackedFileAsync);
|
||
}
|
||
async setup(ctx) {
|
||
if (this.taskManifest === null) {
|
||
for (const t of this.targets){
|
||
ctx.targetRegister.set(t.path, this);
|
||
}
|
||
this.taskManifest = ctx.manifest.tasks.getOrInsert(this.name, new TaskManifest({
|
||
lastExecution: null,
|
||
trackedFiles: []
|
||
}));
|
||
for (const taskDep of this.task_deps){
|
||
await taskDep.setup(ctx);
|
||
}
|
||
for (const fDep of this.file_deps){
|
||
const fDepTask = fDep.getTask();
|
||
if (fDepTask !== null) {
|
||
await fDepTask.setup(ctx);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
async exec(ctx) {
|
||
if (ctx.doneTasks.has(this)) {
|
||
return;
|
||
}
|
||
if (ctx.inprogressTasks.has(this)) {
|
||
return;
|
||
}
|
||
ctx.inprogressTasks.add(this);
|
||
for (const afd of this.async_files_deps){
|
||
const file_deps = await afd.getTrackedFiles();
|
||
for (const fd of file_deps){
|
||
this.file_deps.add(fd);
|
||
}
|
||
}
|
||
for (const fd1 of this.file_deps){
|
||
const t = ctx.targetRegister.get(fd1.path);
|
||
if (t !== undefined) {
|
||
this.task_deps.add(t);
|
||
}
|
||
}
|
||
await this.execDependencies(ctx);
|
||
let actualUpToDate = true;
|
||
actualUpToDate = actualUpToDate && await this.checkFileDeps(ctx);
|
||
ctx.internalLogger.info(`${this.name} checkFileDeps ${actualUpToDate}`);
|
||
actualUpToDate = actualUpToDate && await this.targetsExist(ctx);
|
||
ctx.internalLogger.info(`${this.name} targetsExist ${actualUpToDate}`);
|
||
if (this.uptodate !== undefined) {
|
||
actualUpToDate = actualUpToDate && await this.uptodate(taskContext(ctx, this));
|
||
}
|
||
ctx.internalLogger.info(`${this.name} uptodate ${actualUpToDate}`);
|
||
if (actualUpToDate) {
|
||
ctx.taskLogger.info(`--- ${this.name}`);
|
||
} else {
|
||
ctx.taskLogger.info(`... ${this.name}`);
|
||
await this.action(taskContext(ctx, this));
|
||
ctx.taskLogger.info(`=== ${this.name}`);
|
||
{
|
||
this.taskManifest?.setExecutionTimestamp();
|
||
let promisesInProgress = [];
|
||
for (const fdep of this.file_deps){
|
||
promisesInProgress.push(ctx.asyncQueue.schedule(async ()=>{
|
||
const trackedFileData = await fdep.getFileData(ctx);
|
||
this.taskManifest?.setFileData(fdep.path, trackedFileData);
|
||
}));
|
||
}
|
||
await Promise.all(promisesInProgress);
|
||
}
|
||
}
|
||
ctx.doneTasks.add(this);
|
||
ctx.inprogressTasks.delete(this);
|
||
}
|
||
async targetsExist(ctx) {
|
||
const tex = await Promise.all(Array.from(this.targets).map(async (tf)=>ctx.asyncQueue.schedule(()=>tf.exists())));
|
||
return !tex.some((t)=>!t);
|
||
}
|
||
async checkFileDeps(ctx) {
|
||
let fileDepsUpToDate = true;
|
||
let promisesInProgress = [];
|
||
const taskManifest = this.taskManifest;
|
||
if (taskManifest === null) {
|
||
throw new Error(`Invalid null taskManifest on ${this.name}`);
|
||
}
|
||
for (const fdep of this.file_deps){
|
||
promisesInProgress.push(ctx.asyncQueue.schedule(async ()=>{
|
||
const r = await fdep.getFileDataOrCached(ctx, taskManifest.getFileData(fdep.path));
|
||
taskManifest.setFileData(fdep.path, r.tData);
|
||
fileDepsUpToDate = fileDepsUpToDate && r.upToDate;
|
||
}));
|
||
}
|
||
await Promise.all(promisesInProgress);
|
||
promisesInProgress = [];
|
||
return fileDepsUpToDate;
|
||
}
|
||
async execDependencies(ctx) {
|
||
for (const dep of this.task_deps){
|
||
if (!ctx.doneTasks.has(dep) && !ctx.inprogressTasks.has(dep)) {
|
||
await dep.exec(ctx);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
class TrackedFile {
|
||
path = "";
|
||
#getHash;
|
||
#getTimestamp;
|
||
fromTask = null;
|
||
constructor(fileParams){
|
||
this.path = mod3.posix.resolve(fileParams.path);
|
||
this.#getHash = fileParams.getHash || getFileSha1Sum;
|
||
this.#getTimestamp = fileParams.getTimestamp || getFileTimestamp;
|
||
}
|
||
async stat() {
|
||
mod4.getLogger('internal').info(`checking file ${this.path}`);
|
||
return await statPath(this.path);
|
||
}
|
||
async exists(statInput) {
|
||
let statResult = statInput;
|
||
if (statResult === undefined) {
|
||
statResult = await this.stat();
|
||
}
|
||
return statResult.kind === 'fileInfo';
|
||
}
|
||
async getHash(statInput) {
|
||
let statResult = statInput;
|
||
if (statResult === undefined) {
|
||
statResult = await this.stat();
|
||
}
|
||
if (statResult.kind !== 'fileInfo') {
|
||
return "";
|
||
}
|
||
mod4.getLogger('internal').info(`checking hash on ${this.path}`);
|
||
return this.#getHash(this.path, statResult.fileInfo);
|
||
}
|
||
async getTimestamp(statInput) {
|
||
let statResult = statInput;
|
||
if (statResult === undefined) {
|
||
statResult = await this.stat();
|
||
}
|
||
if (statResult.kind !== 'fileInfo') {
|
||
return "";
|
||
}
|
||
return this.#getTimestamp(this.path, statResult.fileInfo);
|
||
}
|
||
async isUpToDate(ctx, tData, statInput) {
|
||
if (tData === undefined) {
|
||
return false;
|
||
}
|
||
let statResult = statInput;
|
||
if (statResult === undefined) {
|
||
statResult = await this.stat();
|
||
}
|
||
const mtime = await this.getTimestamp(statResult);
|
||
if (mtime === tData.timestamp) {
|
||
return true;
|
||
}
|
||
const hash = await this.getHash(statResult);
|
||
return hash === tData.hash;
|
||
}
|
||
async getFileData(ctx, statInput) {
|
||
let statResult = statInput;
|
||
if (statResult === undefined) {
|
||
statResult = await this.stat();
|
||
}
|
||
return {
|
||
hash: await this.getHash(statResult),
|
||
timestamp: await this.getTimestamp(statResult)
|
||
};
|
||
}
|
||
async getFileDataOrCached(ctx, tData, statInput) {
|
||
let statResult = statInput;
|
||
if (statResult === undefined) {
|
||
statResult = await this.stat();
|
||
}
|
||
if (tData !== undefined && await this.isUpToDate(ctx, tData, statResult)) {
|
||
return {
|
||
tData,
|
||
upToDate: true
|
||
};
|
||
}
|
||
return {
|
||
tData: await this.getFileData(ctx, statResult),
|
||
upToDate: false
|
||
};
|
||
}
|
||
setTask(t) {
|
||
if (this.fromTask === null) {
|
||
this.fromTask = t;
|
||
} else {
|
||
throw new Error("Duplicate tasks generating TrackedFile as target - " + this.path);
|
||
}
|
||
}
|
||
getTask() {
|
||
return this.fromTask;
|
||
}
|
||
}
|
||
class TrackedFilesAsync {
|
||
constructor(gen){
|
||
this.gen = gen;
|
||
this.kind = 'trackedfilesasync';
|
||
}
|
||
async getTrackedFiles() {
|
||
return this.gen();
|
||
}
|
||
}
|
||
async function getFileSha1Sum(filename) {
|
||
const data = await Deno.readFile(filename);
|
||
const hashsha1 = mod6.createHash("sha1");
|
||
hashsha1.update(data);
|
||
const hashInHex = hashsha1.toString();
|
||
return hashInHex;
|
||
}
|
||
async function getFileTimestamp(filename, stat) {
|
||
const mtime = stat.mtime;
|
||
return mtime?.toISOString() || "";
|
||
}
|
||
class StdErrPlainHandler extends mod4.handlers.BaseHandler {
|
||
constructor(levelName){
|
||
super(levelName, {
|
||
formatter: "{msg}"
|
||
});
|
||
}
|
||
log(msg) {
|
||
Deno.stderr.writeSync(new TextEncoder().encode(msg + "\n"));
|
||
}
|
||
}
|
||
class StdErrHandler extends mod4.handlers.ConsoleHandler {
|
||
log(msg) {
|
||
Deno.stderr.writeSync(new TextEncoder().encode(msg + "\n"));
|
||
}
|
||
}
|
||
async function setupLogging() {
|
||
await mod4.setup({
|
||
handlers: {
|
||
stderr: new StdErrHandler("DEBUG"),
|
||
stderrPlain: new StdErrPlainHandler("DEBUG")
|
||
},
|
||
loggers: {
|
||
internal: {
|
||
level: "WARNING",
|
||
handlers: [
|
||
"stderrPlain"
|
||
]
|
||
},
|
||
task: {
|
||
level: "INFO",
|
||
handlers: [
|
||
"stderrPlain"
|
||
]
|
||
},
|
||
user: {
|
||
level: "INFO",
|
||
handlers: [
|
||
"stderrPlain"
|
||
]
|
||
}
|
||
}
|
||
});
|
||
}
|
||
function findUserSourceContext(dir) {
|
||
dir.split(mod3.SEP);
|
||
return {
|
||
path: dir,
|
||
stat: Deno.lstatSync(dir)
|
||
};
|
||
}
|
||
function findUserSource(dir, startCtxArg) {
|
||
const startCtx = startCtxArg === null ? findUserSourceContext(dir) : startCtxArg;
|
||
const dirStat = Deno.lstatSync(dir);
|
||
if (dirStat.dev !== startCtx.stat.dev) {
|
||
return null;
|
||
}
|
||
if (mod3.resolve(mod3.join(dir, "..")) === dir) {
|
||
return null;
|
||
}
|
||
const subdirs = [
|
||
"dnit"
|
||
];
|
||
const defaultSources = [
|
||
"main.ts",
|
||
"dnit.ts",
|
||
];
|
||
const importmaps = [
|
||
"import_map.json",
|
||
".import_map.json"
|
||
];
|
||
for (const subdir of subdirs){
|
||
for (const sourceName of defaultSources){
|
||
const res = {
|
||
baseDir: mod3.resolve(dir),
|
||
dnitDir: mod3.resolve(mod3.join(dir, subdir)),
|
||
mainSrc: mod3.resolve(mod3.join(dir, subdir, sourceName))
|
||
};
|
||
if (mod5.existsSync(res.mainSrc)) {
|
||
for (const importMapFile of importmaps){
|
||
const importmap = mod3.resolve(mod3.join(dir, subdir, importMapFile));
|
||
if (mod5.existsSync(importmap)) {
|
||
return {
|
||
...res,
|
||
importmap
|
||
};
|
||
}
|
||
}
|
||
return {
|
||
...res,
|
||
importmap: null
|
||
};
|
||
}
|
||
}
|
||
}
|
||
return findUserSource(mod3.join(dir, ".."), startCtx);
|
||
}
|
||
async function parseDotDenoVersionFile(fname) {
|
||
const denoReqSemverRange = await Deno.readTextFile(fname);
|
||
return denoReqSemverRange;
|
||
}
|
||
async function getDenoVersion() {
|
||
const proc = Deno.run({
|
||
cmd: [
|
||
"deno",
|
||
"--version"
|
||
],
|
||
stdout: 'piped'
|
||
});
|
||
const [status, output] = await Promise.all([
|
||
proc.status(),
|
||
proc.output()
|
||
]);
|
||
const decoder = new TextDecoder();
|
||
const denoVersionStr = decoder.decode(output);
|
||
const regmatch = denoVersionStr.match(/deno[ ]+([0-9.]+)/);
|
||
if (regmatch) {
|
||
return regmatch[1];
|
||
}
|
||
throw new Error("Invalid parse of deno version output");
|
||
}
|
||
function checkValidDenoVersion(denoVersion, denoReqSemverRange) {
|
||
return mod7.satisfies(denoVersion, denoReqSemverRange);
|
||
}
|
||
async function launch(logger) {
|
||
const userSource = findUserSource(Deno.cwd(), null);
|
||
if (userSource !== null) {
|
||
logger.info("running source:" + userSource.mainSrc);
|
||
logger.info("running wd:" + userSource.baseDir);
|
||
logger.info("running importmap:" + userSource.importmap);
|
||
logger.info("running dnitDir:" + userSource.dnitDir);
|
||
const denoVersion = await getDenoVersion();
|
||
logger.info("deno version:" + denoVersion);
|
||
const dotDenoVersionFile = mod3.join(userSource.dnitDir, '.denoversion');
|
||
if (mod5.existsSync(dotDenoVersionFile)) {
|
||
const reqDenoVerStr = await parseDotDenoVersionFile(dotDenoVersionFile);
|
||
const validDenoVer = checkValidDenoVersion(denoVersion, reqDenoVerStr);
|
||
if (!validDenoVer) {
|
||
throw new Error("Requires deno version " + reqDenoVerStr);
|
||
}
|
||
logger.info("deno version ok:" + denoVersion + " for " + reqDenoVerStr);
|
||
}
|
||
Deno.chdir(userSource.baseDir);
|
||
const permissions = [
|
||
"--allow-read",
|
||
"--allow-write",
|
||
"--allow-run",
|
||
"--allow-env",
|
||
"--allow-net",
|
||
];
|
||
const flags = [
|
||
"--quiet",
|
||
"--unstable",
|
||
];
|
||
const importmap = userSource.importmap ? [
|
||
"--importmap",
|
||
userSource.importmap,
|
||
] : [];
|
||
const proc = Deno.run({
|
||
cmd: [
|
||
"deno",
|
||
"run"
|
||
].concat(flags).concat(permissions).concat(importmap).concat([
|
||
userSource.mainSrc
|
||
]).concat([
|
||
"--dnitDir",
|
||
userSource.dnitDir
|
||
]).concat(Deno.args)
|
||
});
|
||
const status = await proc.status();
|
||
return status;
|
||
} else {
|
||
logger.error("No dnit.ts or dnit directory found");
|
||
return {
|
||
success: false,
|
||
code: 1
|
||
};
|
||
}
|
||
}
|
||
async function main() {
|
||
const args = mod.parse(Deno.args);
|
||
if (args["version"] === true) {
|
||
console.log(`dnit ${version}`);
|
||
Deno.exit(0);
|
||
}
|
||
await setupLogging();
|
||
const internalLogger = mod4.getLogger("internal");
|
||
if (args["verbose"] !== undefined) {
|
||
internalLogger.levelName = "INFO";
|
||
}
|
||
internalLogger.info(`starting dnit launch using version: ${version}`);
|
||
launch(internalLogger).then((st)=>{
|
||
Deno.exit(st.code);
|
||
});
|
||
}
|
||
main();
|
||
export { main as main };
|