库结构
从广义上讲,构造声明文件的方式取决于库的使用方式。在 JavaScript 中提供供使用的库的方法有很多种,您需要编写声明文件来匹配它。本指南涵盖了如何识别常见的库模式,以及如何编写与该模式相对应的声明文件。
每种类型的主要库结构模式在 模板 部分都有对应的文件。您可以从这些模板开始,以帮助您更快地开始。
识别库的种类
首先,我们将回顾 TypeScript 声明文件可以表示的库类型。我们将简要展示每种库的使用方式、编写方式,并列出一些来自现实世界的示例库。
识别库的结构是编写其声明文件的第一步。我们将给出有关如何根据其用法和代码识别结构的提示。根据库的文档和组织,一个可能比另一个更容易。我们建议您使用您觉得更舒服的那个。
你应该找什么?
在查看您尝试输入的库时问自己的问题。
lLcqXDNuvnD/67kcGYjOYuFFU2fOcyYCPjnGX0YKmh8=
0mEpL8+ptItODH1/F3uZY6qHRpPGmhiPDbvGWQe7d6FglAW810bZVOlfFFfQZHppXq/Yz3pXn/f+9qFHec9Lnw==
kD1Jsy9+r6bt8dm+F2d0Rv6CAxRdbv7Frk17/fecw9Q=
SY3YMnn3t5LaqODRAot2DzpndbpewPiKMJP6K1bp+KrPjkVctvVCZtooRLKhy7tOa79mFFwtYOPUe7lkqgbqFViWTIHe/el2PgeydqJOGGFQ0uHaiUbZ9rwgkRTgiud3IIhnl8S8O/aMx9YRPUx2gszi1c/oL298CV0Kn7mhOh4=
不同类型库的较小样本
模块化库
9JzYQQBcwdbaHSF7SLyjmY78scPyQH+xNOZRzM8eKO7PnvnD6FKD7W0QmwTNFsbJCJQmpwc+JfeD/R909N5bObXTV5mgND6oVgXnROY1wdJvtftR6eIicoKqFpVKZls46GWkciebT01/ll4bCB3wuI1l7w3jwYfU2s+6pU+67o2+7EcapjCq5veWPc5khVVBRg+F9IQbJM44VijsfFAaOmdknvj8wkSBIawmvtRdhuC2PG7a2PTDVp5R1d5nOaAK2lzyNCCPcYzTG3dtcDXYtTCqlrxiTdjJ10seDq7o5RQaslyq6WnjvMVDTKlSJISoMRk9+0f+L+hdOwKiQBe6zQ==
HkKIzJjwf2g3i6T1B6A2nP9lA9FMCJPFAEsGVs0G0+1XqOWD1HhsWmEquW/Td+Ps+Q4ySRiS7++s46hFC+KUqsDVxM9ldv/cz+aIiV8MSUOWOHlVEUKYqeDGvNFUvJtS2UpM3M3wPTBombRGwJUgi4ErWTXTUvcoD3pjHujlDazpUH4axvbzo1HVndn0R3zWogB5DiIwDVi8Xz2yPp4wtWJHbJq6tPBR9L7NSsPVWo6MWebeUD0RzM9hxRH3neA1
var fs = require("fs");
FsBAntGhNayD41vNb8BjKMuGIbPuLTAR7ErrdU5kjg1J3Eq9pwFyLQoB7H48yJ/kiEWR9IrOKSMYc8TSbiJhmJYwQoD+r00Vp5oS5+fGG9g=
import * as fs from "fs";
s2EskZmWMFwLRvRGAzJkFBkUcNHh83uK3BLFv6E/e/qzZKK0MrBdWBWt1jf55hSZTYYG7SiI/LvMRZFoGq7jftrjlUPmuTRutSanNbnvoCg=
var someLib = require("someLib");
WisDxdjOdljBtqrBmUFY/A==
define(..., ['someLib'], function(someLib) {
});
WPTicDI1UC1bPRh9F85xcd3HZ7SGWBAREwhbfS2H3kgZDfR/phV6ad7rBW99J8t9BrRcn2c1r30278SE8Lr0+UoPh8WtHYNIWAJHT8JevVgyHh0Pd/cPHX8qka/yRxiqg4VIJSYklffwzkR9R3+rbfsZQEr3h/A9z4OQBYMiG+ogc1gpM0Cul97n32LDPkcx4w55fKeSD//dN8KVGhJK0YufPtYBPmkiCzpcsbqcjPC39AArc+SZBR41nVdIfNsg
从代码中识别模块库
yjMi3mfDnmLvytM2/xfnawkLHc+P1QNRZeYKC72B1Pc7nssZY+xJjRytFyaLYUDh
- ZZ0yBSkRmxdnfR2pjHoZ/eh98c3uW4El6tqvZLh7LHlZQqQvldrW2846t8zK8PivUTD5N7Z5PDNV280F0ZYn+qh+r3iZigYgR21n/fgL+v3yZliQ06MSwcNbK2DWIyRf2hQp5OOFYoUDEsRi179iUAUBIOQdp0BhYKBs0Az66OfGjGsJ35rjWFqWO4e6DDvoe01Zmcz8mXsdhKsAlTx/WZ6agkxvrbA50HBpKwRv4KNenf4b+1ocxIf18D+0wH/XStMg0rs92iWiI3KA1MPqpeEubz52SAfk8i9w139qe7b5z1g2qzx4Eds5U58BXzJb
8l/IUw5Z2FTuqvlPdtSIxKefixHM4S6QASUWkG7hGh4=
- qeSWFCzn5JUlBzQnPLWQtgWw7+lg6jyZeYOMS4OdTA7pPtTZ45N6HCn7jM7eiV1l6HTjC7a0WR5ttValmOYTFmDXr5LIp+pz7yRpWCOcjOs=
模块模板
QaJxLTBSOIFz+ZH1QySwOuRfngcdldKAniljGqDhWJTWfXzjSWwKAYLTbbynhwmd4SZPVPtl8rkdUN+hPG//bsrqYlw7Xlj9QRWzjKMhv4tY0ySXJ3u0tQdnmMJhnnq3vM3pNkeI30ntoKT2T90pCp/yJsNm3DVuL6hprlc/LXe3IBCF1ZbCE3Zg5xPemebclYgXfYRCffvtXZyrfHvWGqrmEf8mRSUMY9X556zQhtHv9QOQefrm8c/5TH/wQdQwp9ma50Z/mK+m2zpnPaObswbPc45j+7/byoBg6812To19P7aJ2UqMAGXMHeuDijKbKLq6tkz2r4oa0MxcRTBk/aBw/pLhlXfOsCWMpf7p5Gxpu4QQzfb/v6n7vy2g8GTvJ5T4mg1O5CERKnkJs61ToMq1RuIr/yyiJKG2MSWsJVLLaqqOwEqDLD1OxBfvrVjA2G6zmqOWkVMjpU860cuIx0wKooycDNa1dZDgdeqHN+c=
Ftq4L/QTkj1Eh3hW9ezz7XjWdiF/R3N5WqqeGkara7ZL7ylt80CjOVPZcPQvCZqLCd9FpUfmOgMBzWPuwh6SHJnzpXOwtwHCJYVT1VnCGDDEIOVDAESBhSCFiLPQ0GPkuwDJz2V/ShGTmGTatiQkHUIKzGm+EU39dqJU7e9rSgvBV8iAp8KvVAmU9A91tfk4
OXiNjSdfu6dyhTx3lY/bDBrXd5iv8YlsXU/KbJ1tjMgvy4If3SV6oKf89iK6h4O8fJIuEvhg+QfcF2fKULAJWm3VfqA5mzp2+uSAckOXj2+0t+kqFgUH8f8rMfHI8M1xtrtrQNxetnDVyNBKV40JhrA+z8EryTHyCd+MQmbszmohkbxK3oPGEHJiDLBc5VLBVvjJUDLOjeRm0E/xaqYqJg==
const x = require("foo");
// Note: calling 'x' as a function
const y = x(42);
OXiNjSdfu6dyhTx3lY/bDFEwgHKa8E1c3w2Flu+CtetZxiwYLAChrvd7Fc6mafWJ3rcHkaRxbLHbdRyBdRPKLMoQ5fmc5dkPPEL4sSdk6grosf086Bz9I0Qn7qRc8kN990lXTfHmXt4R7mK41FXAnKbU+ES5sPFoO+sUkI+bQkS8WwMIUZ5CnoJIbrAF0hURZ8i56ldYH5yIaDs5Fd3IGQ==
const x = require("bar");
// Note: using 'new' operator on the imported variable
const y = new x("hello");
IgEwTcVgnrvqZY8tenpo81K3mr2CHp56K0WRkpsT3YgoErDfpG64HsX7sJzQSqxWWuLmYEPguPUDLhngyQt0Qna5SQbWNtKJGb+Xlq/GLVjm8/hIXrLmyRGhssoky9g9CKFKq/+TJNABjbZWJlD1r8ggeuwkDc/EhX+BLx391t11o/baFuAHnBBzMGcwVQl3FKvfJwgdpvFb5afTnqXWox/0R7yAg9qM1NIDdtZoy3s=
const jest = require("jest");
require("jest-matchers-files");
全局库
Gy5E/GZiQGXQyHF+dgbsgLK56EyT9ioqT6EVpfX+323W0O6FJemawh4efpjQ20/pkPlRjAePLCIe5OOqh2qil1fIPMogBx8ylfoOiZLBgzENbTSxRnNp2vIrQEIt4xTVEKpXl8sLhdVq7CkQBYdEhDI7cVTvLPzjsqrUK30X/X7WDD3hXelyWWbnQk4o+Wq8fZjUiZF+ahcjer8hteABHuon7/J83F3JtGHx1P5IAjlmtVlOr9TIVdnruZIe8itxIIls04WjHwL6v6f3tJFeR20WRQZOtvs8bi00zFI3YMG9r7s2JCGAGB/S00jnP34FuGOQbvfScrxp48KGbRl3fC2t9qxwotLzCoANPSFiLQaH8ULdk+rWzdbKQWAQpR8Hkr3UhJD5oyXPfDX+kkG+d6QN/HOnmqbDZS0Dj7TMtZI=
$(() => {
console.log("hello!");
});
mpEgre7O+ZgYF5C5nlqVFA4x2rEwQP2myq8h49q6gg7Lc1BVPnNQnnjM6Su3WSTVHg/Cg8rf9kHbwkuODYRoISlHnwMHs4iAOdvS1yyTcn2rxdgB11ctwld9SVoBBZRpx3hck/kCnuXbe3bfdsU9Pg==
<script src="http://a.great.cdn.for/someLib.js"></script>
azEl4JVo/5RzIwPuSDS2NrurY0SDXcTM4ERPrCSGlGE6Edkz/npGvrruIx947Xumj8ZfxTBJWfTV52/iH3EdFmT+8NZfdGODH4+nrdz18e1G0uJSNYSaR1SPydvjeISWinHuixfr8ReRDmfmntsylAz1YeqGOBVZLH4lczMrFfelQvlpXAZJWD0KTtYKAF39WCSWM1X3Otw1nmTJjMNgVtLkwohnm/KIlI47DZeEYSpEYdKf+6ZSievhEoGo5SwDGDPHk0sp5Se+SWXihqsj/WLPRfCH/RdJKrfl2OYLk0A/DaScVCi5aoNc27sNxcPb
从代码中识别全局库
adttM9R+yegBpoaqzOF8dcO4teS8w4CSxK6FErDSoGB3PjxBOC1jbJJcfCjSUK91Uuq+fsX/+cdmEa4vtyXovMWsP7akMzLv01o4KjaI/ZjnZDIdVbrmrFMyql9s5rl4
function createGreeting(s) {
return "Hello, " + s;
}
rrgqPMC5TXPiKZ+1cGoWPxXoThWe68uQeNsDK+oW4q8=
// Web
window.createGreeting = function (s) {
return "Hello, " + s;
};
// Node
global.createGreeting = function (s) {
return "Hello, " + s;
};
// Potentially any runtime
globalThis.createGreeting = function (s) {
return "Hello, " + s;
};
RCCUao1dpiRSj6a9LaBiUfkF2QdccFMJiNrMkwoXXhYYO6eoTp6Vhq4MqSntv8jPdyHjJNfJh4DvGS5wAjNikw==
- J8yM9fZeP4mAZNOMCEq/KFsNTPm/v4Z8N6qfpkXPArTeMPKAztRMjCU4nKleZcCACzl++t5khTMe5Am92fsVUnpv2uWCOYgZFNfWaJtNUKQ15Bt3LmrbjpIbI94yZdail1nOglWJ8Alk5LzUUVtUIywNQg6xodP+4nfPTGUhVLGhsLyfQGQ37Dd0zvh5O6cD39cYRm/Xtz4LlXj7HRoWVy7e+ZbHi33tAB01+71+q2rSsCio0Iyze0fTYkryf3CUaq/SuD2TBBuS6KIuEJZH4Ld0MMtuZ0oOR5QraszgM2qcJEoccVG59PYvKKPvydbD
/8r9KSKach7evb/LpWTL9MqjGewI9qWbBGtaKNwa7nY=
- +aEaUDyIhfTsjby2mzyBlAjoKHXdfqBTLJMamZfVMCzcgZFzVWEy71n7fdEXKqrFKj5IO6Jn/hzlcl2T1TX1sjHpKtimizGJVBacg3Jhv1dk+jyJUiSQ1br+E7ieqC81ZRwiP61pg75nOpj6rivAU2MZJf1Ricg2KfQ6c8Ucgbcq8rxBhy8hldyoE/HbBXSZhSpuiL8onkwPI2hH7H6azV3O1f7zQKKZ1g/HmTq3HdCxFYf9rXWDsCABT1Gouf38U4Nb0RZi9VFKEJVZsLpmhZ4rQH9Em7s4vCPYBErkTTLOh07MTVB/tkJ21gsAfLRXpTpFWEtEDtQk0Bq3TPHxV5BlZG+wvsanoW87l+XIr0/gCnE227Jg2kR1pgRrquW8
全局库的示例
4Ei0fFPDlKdTZswz9n7ZLM/PK/yr0NuOAhfa0s53SpXAxwH2DYD8q/026fhx0SMhzRqe+vxLw3rfDqF+grq4yr3h7FSfDKMjfhA47lRP2QDL+hsCM0zSeC1QlE+90qiMLBXlR0OxmJShm7BO81GKp5/1gw14sa0DFjATEa0W8DrpaDUJI/uCTtEJkaeJLuvlGO6hmCYMp9ubPv1pIf+5W9crWdb5iDPCt1b/9QGr/8YRRWzQjDiDD9lgGuKMmuKW9GqYwvMjTq5AQb4OPe5ySw==
全局库模板
fxearSfSGKZlPcJJLlid1WGDOuhwKt1jDmkgJwTc7D5Rf4YW3lFNisFVqPOaOTgWCy8t0DGObtV0/FVVAf117hKsWh+Nn+Bb9+7yKQYTfaQ3RTvzmnIRTaCezoqrz5J5uS6OpKnjIpT7L59Mtt6b50+ZwRFeYaSKyl21H4qmnww/cTFsM809Auf5vFVFDSvPmxUiXROoo2X1Z5Ohge+bxKv5gALr8X0+vBSQTKS+tuNoQIHM2DCsv4zQwu8uBvxXUeQR9fGRpuL0VN7J0iXWtG/P+82ZowI0tLT1RyUCjUep34CdqcmVr92q48rX9a5y
UMD
XY2+dzMwa8ddCpGHABtypfIPle2bhNRWmw7aGXtFl+ArPwpa1ieHgm2YI+/HGfZh60kOnIgijywO062dW8S7pXgCI7+5tM8DuRM/Y3IKDFTX2fBa+gZhiVEua6mk+rbD72ecoek5f7O74DL2ymsz72mb1g5GEuaXLRjV8d/a1OSSD4PAdaStUFI5ODLerAn6Cmf1X4VdrVwiDMePylkU3mh/HVUB7J9PQ9LUi18HgWRJRJJ/d211MShToSIh2tk6nNgXepOecS98Ud7QrN/g+7m/rrMxe1tLz3F/P+E7rFDbbcAXThxDQrGe4GPbdrcrSvDoFIDTDCIulyLLnvGyRZQGGY8FjSs88dywAyIyXOIME/LhIwh4cT/g1tEVeXpViSevMzc+H5/obKAiaRkcPg==
import moment = require("moment");
console.log(moment.format());
OBsaBq2q9YJOLrN+VCADLnjo/uIz89AF4mfi5TkQukp8G884T5OIHgvJBS7Hwvri
console.log(moment.format());
识别 UMD 库
k+dD4ZssNdoaPf8rKNQ/JvyvoxrcGXTi926kUbCebYG/iPwlzEKa0io+NQAnKN6TSm5Nsd6MzdKAQJS4GSTpHz5sVVCfFT3vaTrwWrFMgNgFAy2PfB3ofPJrLl9Qk5fpEvcJbOsKOI7vtsfgtpROn0QoLwRY6sZXdUv7nSTH6gV7TAWjZqXguA5fGFfrA4f2QlYhaFbepL/d5yh/DZTBjA==
(function (root, factory) {
if (typeof define === "function" && define.amd) {
define(["libName"], factory);
} else if (typeof module === "object" && module.exports) {
module.exports = factory(require("libName"));
} else {
root.returnExports = factory(root.libName);
}
}(this, function (b) {
iOUt88Fl3vcslWVSqhlCwiY8Asyp3XcRfKPGLdtOR29CqJDbHWIFlzKEuLUfbncKhziqMaJtKEfEzuQeykU5Av3OU4JJS7Pfgq7Vfd0lwsZ0LIDRxIaWg1iXDd8ghd6l9O2TDeh02hEVuCQBpYV7MpjNObvuvGagMi902oN6n2S4Go/eacLeiRZ6H4vFpvp/oP8BzuQTmgU4Iip1TAakc2DhUAqXB15uypFaUPHiQIII2qt1/+jZ0JScf/rhWiW5
Tw3y0j1VkXQo9H4R1gS+V0cV7rECug9Nl5u4OzmGsWAeeo8jRItos+dqIktfFTNXkpWipLXUe1XDDxQFFZnuH22g+HB8NlgKbmPOAi0jxfl/RzfAyYRGJ8WQi99tB/U6ua/5Q5SsFuF4vtibYAnTx3IMymGRBtJelNvOpxgF6gy4doJBhXPvmN8udkPLQQ3FSnVPTazkg8ggohZRmNDL+rXmXRs/gxfNF/cB+UhUZ71DOWG3wvXJ0LKrjjs6ixqVtReqN+x/LUXslpxRbYA1Rw==
UMD 库的示例
typ05kTFitM9pCndZA2cCvgWVD7yxsXu+DtmSiu21Av34UmXf2bD4aBe5YCJFfpaytCsyHz7hTDDBbmooBhw9uzVsaFVqWjK4j30hOGdKXclW5dONIL68coS9aYnTAN2jNPPGPJZue6dSaMzO+llsAFtruK4WrcrYCrQrpBCwqfZoUSM5INXB6I1bznF+5U3JJojqZhLXdMkBEEv4sVGpwPtSOCdrhU4+AeWdgXI2gSxp9rRCDueYE4PEF7RTSGKcAZsqAGOSsKF5t/5VpIDO55QAJIUHvk5t3Z5PHeR+EWpLlHo4JJxHqSD+cOkvZRq3vdirkn4ipaiKe0everfm+K1LPste6AYG0N8/reYLFs=
模板
EprjCMyxvPcaHkK2PpF4DcaMwdTA8F0v3h8MewA32xhh53L3tckeiU0otBQyMuYeDUG2wYeXBa96ae1rIRx+CEg7XHlLR2x74RwU6cNf/DBP6Zrnx3rKwoTInrv4sbl4959WGcFN4H5OV5YsFNiPdg==
引用依赖
V9O+rb5haPHDzat3EMJLY2Yv3ys5EbGjHQvYLll51Pm7V8X2hOL2p3jtZ4YSjfMRufIYfCVZtzi84vE9sUd6+YVIY6p5P41YZbiRUZG6y0wyxVVUESzzaVSP99rKCrBl
对全局库的依赖
pf/TbxmM3smbPi+Z8ah7Q+q0uicWJTJqcCvinkMoob+pXjrRfmVE+AzI+hoVjt+XOUsRYRwxr+5nXrnzV0xL5E85XzJhvlOZ4gz+Papym9etKLNALLKRclQzOarOQV9H3nm5LWe2YE2JdFI05PrzfQ==
/// <reference types="someLib" />
function getThing(): someLib.thing;
对模块的依赖
pf/TbxmM3smbPi+Z8ah7Q+mezHq2J4ZUOip+YQwEgumrVkVFCrKQEFw73Gnwt69qGFo+f+l+W10UUsYaVOkxVdtcc9H1EjO0RtnZh+laIbI=
import * as moment from "moment";
function getThing(): moment;
对 UMD 库的依赖
来自全局库
HjApMqX5kE82S90zEm9rOuLxLUdYDZ0I+SDmYJpBZleIttn8J8w7MuBQcmX/ql70NOUnAVUzijnQPG5JU/n1UTgZ7V/FMOqGqV5ZjfjM6KHTl3/qa+F9cYnsBnX3EeyPXn+3DsATi4UJl2fliGJeVg==
/// <reference types="moment" />
function getThing(): moment;
来自模块或 UMD 库
OXiNjSdfu6dyhTx3lY/bDO5ZwJck9FzAy2XrKxCvtVZgRa/BVEE6DSx2Nscjdjjb+HnR/+gN2+FetwCdDYMfBvKAUVpZjKHz/3UTtB9CHeCF6fXX8VIFBnzzIrlNcn3z
import * as someLib from "someLib";
LG4Wn/MpX9DD6s44YT+7C+0K2yOJsp3BoAL1fGu157Aa63mfVIH3yxJg5tbkQoXomLviyCB/4fpMCyaAwXM3b/sPT/jxWjHl+2uMQ7OYfw53axGOVCko+yxNgHbf5Dy2
脚注
防止名称冲突
v5lM9HJGLTMR7O3kUWoNFOBAfQWEParRJh9RhUnh73TvG5dutQTbSHZMUfZBuVEU/GVD9lYT6eArfLuy3Nu/jkc9NZaYN++ojK6mvBYVUeIP2JAO8F4PGKkZHk71EIdjUsG/bstmjuGQFdQ7dLuCt9WECbajpCXqykBzv3aml1E6OtQ5R/MzIKhi/qAPvblVhn5qHe/XHtC+yJbsCLoHWQENU+iD/4ihc5veX8Do4sNOJXkGnImuLWN13zM6urCUYHPJ+vlJa1zlaKmBjKEkaPvOhd68Z2yf/f8G1t2k+Gk=
5vDqtOxPbdJHzOp8Bunf+UL+GAZ7aFQ0eM93HAuIFmFiQ3Fb+Fmd6EO3YityZ6+oeIVo/zcSkXjrDXdBVYBOktr6XEYrolx8FXzno1C35Sv8exIvUihBHn2Z/1xr+U5JkZk2UWil1ZbKLe96astWpnOsu+2ApsP73CjKnz+SLjI7QCOIv5Ecxkexw1H1v16NF4g/6Z17XRxVQY7OySW5QQ==
declare namespace cats {
interface KittySettings {}
}
xCtAts0k6I7CgjVAuUllmA==
// at top-level
interface CatsKittySettings {}
DBOkLWA8I8ZIa7wjPUYi0JVh96Ym5fUcoXTv/XPQmLO+08wCKun8D42EEVs6mi4aKnsfCGbhBbf18mS2ky5+ly2X8iyS05pfGSqEUp6gP7sE3Y6KQ1HIhU23LRRWcsqV
ES6 对模块调用签名的影响
iu7PJCDt3yQGwM/zYDg0ffccGnR9xRiUt5NQIYQ7FvRN4sqdwDEOjKqWgK6108Z+qABcvE88f54KlBE+Ni04bT3dW/Q/XAW2vy2ZJQ6veeCq2+3NRCA0UEty3fuV7Jn+owSl7sk+bqtm7YCN1vMDPqecPORLMJjIkJ0XKjsvasO3hTqLeSP4ww2IXkvyNwZk
import exp = require("express");
var app = exp();
d+3FiHTef4VDtBPCIF6xIrJHnjfaJCqmJlyWMZwiRydHZ/iDMZSV0y/cqvtw7lSpu57MhXxmSD7uEDAEehEVh6ma41ELPpEMquC73CcAvgMUKtN+PAtVfLybgeJSCu42/SUFvSMtCzB9YupSQGAut8+FnmHlZcmuuueUTN+DK2C0jY1QEekqDnUX81boYQdNBotIaQYsr0oVybLsS8ubsA==
+RNjR5GIMuFUVU7wN73JbSv1Y8poioYoXuCwRczXK++1rZOsvGmbVZkhNR/c7jJ5uRuRoKycgorcN4vie3xtS7l33lM/3bE1blji6wSiF5MyRU/ImVjZqheOkav86jlF+jtPijpcLw4UJa/8hL7/SR40SWrXrTqsqMaXoAdzRTWReIPeY/yX6tGk+JYSFsmcA3uXo+w8h3b1SmK3wQ0G6IIokq1IHWrIAJ1GZnRPAfOOb/qPFgaRcxhm/ReqaM7PcSGcfevaJxFrChKVL4c0T7/0EerRIQ9/vS0OSbvtDJe4so/pCajKK5vf9ubRS9Rzm0bPBwZ7iY7vSuU6uSHxeEu9sg/qjLk2M5vL3oVqfUQKkA+/iQAxlGTGPSG6uPb36ZR7ScGopOO1pEWwxaa57K4v8AEuk3i8t62xYAp4ujhoY1eNcKVtgWBq/k90TB9eBRvceB+A+aWZHFm862eEjMG4iDeBg+LGZDJ6x4cfeG4=