1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const tslib_1 = require("tslib");
|
4 | // tslint:disable ban-types no-bitwise
|
5 | const ts_utils_1 = require("@neo-one/ts-utils");
|
6 | const path = tslib_1.__importStar(require("path"));
|
7 | exports.getGlobals = (program, typeChecker) => {
|
8 | const bufferFile = ts_utils_1.tsUtils.file.getSourceFile(program, require.resolve('@types/node/index.d.ts'));
|
9 | if (bufferFile === undefined) {
|
10 | throw new Error('Could not find Buffer');
|
11 | }
|
12 | const neoFile = ts_utils_1.tsUtils.file.getSourceFile(program, path.resolve(path.dirname(require.resolve('@neo-one/smart-contract')), 'index.d.ts'));
|
13 | if (neoFile === undefined) {
|
14 | throw new Error('Could not find NEO type definition file');
|
15 | }
|
16 | const neoGlobal = ts_utils_1.tsUtils.statement.getNamespaceOrThrow(neoFile, 'global');
|
17 | const buffer = ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(bufferFile, 'Buffer'));
|
18 | const bufferVar = ts_utils_1.tsUtils.type_.getSymbolOrThrow(ts_utils_1.tsUtils.type_.getType(typeChecker, ts_utils_1.tsUtils.statement.getVariableDeclarationOrThrow(bufferFile, 'Buffer')));
|
19 | return {
|
20 | Array: ts_utils_1.tsUtils.type_.getSymbolOrThrow(ts_utils_1.tsUtils.types.getArrayType(typeChecker)),
|
21 | Buffer: buffer,
|
22 | BufferFrom: ts_utils_1.tsUtils.symbol.getMemberOrThrow(bufferVar, 'from'),
|
23 | BufferEquals: ts_utils_1.tsUtils.symbol.getMemberOrThrow(buffer, 'equals'),
|
24 | process: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getVariableDeclarationOrThrow(bufferFile, 'process')),
|
25 | AccountBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'AccountBase')),
|
26 | AssetBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'AssetBase')),
|
27 | AttributeBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'AttributeBase')),
|
28 | BlockBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'BlockBase')),
|
29 | ContractBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'ContractBase')),
|
30 | HeaderBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'HeaderBase')),
|
31 | InputBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'InputBase')),
|
32 | OutputBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'OutputBase')),
|
33 | TransactionBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'TransactionBase')),
|
34 | ValidatorBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'ValidatorBase')),
|
35 | StorageContextBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'StorageContextBase')),
|
36 | StorageContextReadOnlyBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'StorageContextReadOnlyBase')),
|
37 | StorageIteratorBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'StorageIteratorBase')),
|
38 | syscall: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getFunctionOrThrow(neoGlobal, 'syscall'))
|
39 | };
|
40 | };
|
41 | const findLibFile = (program) => {
|
42 | const files = program.getSourceFiles();
|
43 | return files.find(file => ts_utils_1.tsUtils.statement.getClass(file, 'MapStorage') !== undefined);
|
44 | };
|
45 | exports.getLibs = (program, typeChecker) => {
|
46 | const libFileIn = findLibFile(program);
|
47 | if (libFileIn === undefined) {
|
48 | throw new Error('Could not find NEO lib file');
|
49 | }
|
50 | const libFile = libFileIn;
|
51 | return {
|
52 | get SmartContract() {
|
53 | return ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getClassOrThrow(libFile, 'SmartContract'));
|
54 | },
|
55 | get MapStorage() {
|
56 | return ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getClassOrThrow(libFile, 'MapStorage'));
|
57 | },
|
58 | get SetStorage() {
|
59 | return ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getClassOrThrow(libFile, 'SetStorage'));
|
60 | },
|
61 | get Fixed() {
|
62 | return ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getTypeAliasOrThrow(libFile, 'Fixed'));
|
63 | },
|
64 | get constant() {
|
65 | return ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getFunctionOrThrow(libFile, 'constant'));
|
66 | },
|
67 | get verify() {
|
68 | return ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getFunctionOrThrow(libFile, 'verify'));
|
69 | },
|
70 | get createEventHandler() {
|
71 | return ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getFunctionOrThrow(libFile, 'createEventHandler'));
|
72 | }
|
73 | };
|
74 | };
|
75 | exports.getLibAliases = (program, languageService) => {
|
76 | const libFileIn = findLibFile(program);
|
77 | if (libFileIn === undefined) {
|
78 | throw new Error('Could not find NEO lib file');
|
79 | }
|
80 | const libFile = libFileIn;
|
81 | let aliases = {};
|
82 | return {
|
83 | get Address() {
|
84 | if (aliases.Address === undefined) {
|
85 | // tslint:disable-next-line no-object-mutation
|
86 | aliases.Address = new Set(ts_utils_1.tsUtils.reference.findReferencesAsNodes(program, languageService, ts_utils_1.tsUtils.statement.getTypeAliasOrThrow(libFile, 'Address')));
|
87 | }
|
88 | return aliases.Address;
|
89 | },
|
90 | get Hash256() {
|
91 | if (aliases.Hash256 === undefined) {
|
92 | // tslint:disable-next-line no-object-mutation
|
93 | aliases.Hash256 = new Set(ts_utils_1.tsUtils.reference.findReferencesAsNodes(program, languageService, ts_utils_1.tsUtils.statement.getTypeAliasOrThrow(libFile, 'Hash256')));
|
94 | }
|
95 | return aliases.Hash256;
|
96 | },
|
97 | get Signature() {
|
98 | if (aliases.Signature === undefined) {
|
99 | // tslint:disable-next-line no-object-mutation
|
100 | aliases.Signature = new Set(ts_utils_1.tsUtils.reference.findReferencesAsNodes(program, languageService, ts_utils_1.tsUtils.statement.getTypeAliasOrThrow(libFile, 'Signature')));
|
101 | }
|
102 | return aliases.Signature;
|
103 | },
|
104 | get PublicKey() {
|
105 | if (aliases.PublicKey === undefined) {
|
106 | // tslint:disable-next-line no-object-mutation
|
107 | aliases.PublicKey = new Set(ts_utils_1.tsUtils.reference.findReferencesAsNodes(program, languageService, ts_utils_1.tsUtils.statement.getTypeAliasOrThrow(libFile, 'PublicKey')));
|
108 | }
|
109 | return aliases.PublicKey;
|
110 | },
|
111 | get Fixed() {
|
112 | if (aliases.Fixed === undefined) {
|
113 | // tslint:disable-next-line no-object-mutation
|
114 | aliases.Fixed = new Set(ts_utils_1.tsUtils.reference.findReferencesAsNodes(program, languageService, ts_utils_1.tsUtils.statement.getTypeAliasOrThrow(libFile, 'Fixed')));
|
115 | }
|
116 | return aliases.Fixed;
|
117 | },
|
118 | reset() {
|
119 | aliases = {};
|
120 | }
|
121 | };
|
122 | };
|
123 |
|
124 | //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN5bWJvbHMudHMiXSwibmFtZXMiOlsiZ2V0R2xvYmFscyIsInByb2dyYW0iLCJ0eXBlQ2hlY2tlciIsImJ1ZmZlckZpbGUiLCJ0c1V0aWxzIiwiZmlsZSIsImdldFNvdXJjZUZpbGUiLCJyZXF1aXJlIiwicmVzb2x2ZSIsInVuZGVmaW5lZCIsIkVycm9yIiwibmVvRmlsZSIsInBhdGgiLCJkaXJuYW1lIiwibmVvR2xvYmFsIiwic3RhdGVtZW50IiwiZ2V0TmFtZXNwYWNlT3JUaHJvdyIsImJ1ZmZlciIsIm5vZGUiLCJnZXRTeW1ib2xPclRocm93IiwiZ2V0SW50ZXJmYWNlT3JUaHJvdyIsImJ1ZmZlclZhciIsInR5cGVfIiwiZ2V0VHlwZSIsImdldFZhcmlhYmxlRGVjbGFyYXRpb25PclRocm93IiwiQXJyYXkiLCJ0eXBlcyIsImdldEFycmF5VHlwZSIsIkJ1ZmZlciIsIkJ1ZmZlckZyb20iLCJzeW1ib2wiLCJnZXRNZW1iZXJPclRocm93IiwiQnVmZmVyRXF1YWxzIiwicHJvY2VzcyIsIkFjY291bnRCYXNlIiwiQXNzZXRCYXNlIiwiQXR0cmlidXRlQmFzZSIsIkJsb2NrQmFzZSIsIkNvbnRyYWN0QmFzZSIsIkhlYWRlckJhc2UiLCJJbnB1dEJhc2UiLCJPdXRwdXRCYXNlIiwiVHJhbnNhY3Rpb25CYXNlIiwiVmFsaWRhdG9yQmFzZSIsIlN0b3JhZ2VDb250ZXh0QmFzZSIsIlN0b3JhZ2VDb250ZXh0UmVhZE9ubHlCYXNlIiwiU3RvcmFnZUl0ZXJhdG9yQmFzZSIsInN5c2NhbGwiLCJnZXRGdW5jdGlvbk9yVGhyb3ciLCJmaW5kTGliRmlsZSIsImZpbGVzIiwiZ2V0U291cmNlRmlsZXMiLCJmaW5kIiwiZ2V0Q2xhc3MiLCJnZXRMaWJzIiwibGliRmlsZUluIiwibGliRmlsZSIsIlNtYXJ0Q29udHJhY3QiLCJnZXRDbGFzc09yVGhyb3ciLCJNYXBTdG9yYWdlIiwiU2V0U3RvcmFnZSIsIkZpeGVkIiwiZ2V0VHlwZUFsaWFzT3JUaHJvdyIsImNvbnN0YW50IiwidmVyaWZ5IiwiY3JlYXRlRXZlbnRIYW5kbGVyIiwiZ2V0TGliQWxpYXNlcyIsImxhbmd1YWdlU2VydmljZSIsImFsaWFzZXMiLCJBZGRyZXNzIiwiU2V0IiwicmVmZXJlbmNlIiwiZmluZFJlZmVyZW5jZXNBc05vZGVzIiwiSGFzaDI1NiIsIlNpZ25hdHVyZSIsIlB1YmxpY0tleSIsInJlc2V0Il0sIm1hcHBpbmdzIjoiOzs7QUFBQSxzQ0FBQTtBQUNBLGdEQUFBO0FBQ0EsbURBQUE7QUF5QmFBLFFBQUFBLFVBQVUsR0FBRyxDQUFDQyxPQUFELEVBQXNCQyxXQUF0QixFQUFBLEVBQUE7SUFDeEIsTUFBTUMsVUFBVSxHQUFHQyxrQkFBTyxDQUFDQyxJQUFSLENBQWFDLGFBQWIsQ0FBMkJMLE9BQTNCLEVBQW9DTSxPQUFPLENBQUNDLE9BQVIsQ0FBZ0Isd0JBQWhCLENBQXBDLENBQW5CLENBQUE7SUFDQSxJQUFJTCxVQUFVLEtBQUtNLFNBQW5CLEVBQThCO1FBQzVCLE1BQU0sSUFBSUMsS0FBSixDQUFVLHVCQUFWLENBQU4sQ0FBQTtLQUNEO0lBQ0QsTUFBTUMsT0FBTyxHQUFHUCxrQkFBTyxDQUFDQyxJQUFSLENBQWFDLGFBQWIsQ0FDZEwsT0FEYyxFQUVkVyxJQUFJLENBQUNKLE9BQUwsQ0FBYUksSUFBSSxDQUFDQyxPQUFMLENBQWFOLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQix5QkFBaEIsQ0FBYixDQUFiLEVBQXVFLFlBQXZFLENBRmMsQ0FBaEIsQ0FBQTtJQUlBLElBQUlHLE9BQU8sS0FBS0YsU0FBaEIsRUFBMkI7UUFDekIsTUFBTSxJQUFJQyxLQUFKLENBQVUseUNBQVYsQ0FBTixDQUFBO0tBQ0Q7SUFFRCxNQUFNSSxTQUFTLEdBQUdWLGtCQUFPLENBQUNXLFNBQVIsQ0FBa0JDLG1CQUFsQixDQUFzQ0wsT0FBdEMsRUFBK0MsUUFBL0MsQ0FBbEIsQ0FBQTtJQUVBLE1BQU1NLE1BQU0sR0FBR2Isa0JBQU8sQ0FBQ2MsSUFBUixDQUFhQyxnQkFBYixDQUNiakIsV0FEYSxFQUViRSxrQkFBTyxD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T0FBdEMsRUFBK0MsV0FBL0MsQ0FIMEIsQ0FBUixDQUFwQixDQUFBO2FBS0Q7WUFFRCxPQUFPWSxPQUFPLENBQUNNLFNBQWYsQ0FBQTtRQUNELENBcENJO1FBcUNMLElBQUlDLFNBQUo7WUFDRSxJQUFJUCxPQUFPLENBQUNPLFNBQVIsS0FBc0JsRSxTQUExQixFQUFxQztnQkFDbkMsOENBQUE7Z0JBQ0EyRCxPQUFPLENBQUNPLFNBQVIsR0FBb0IsSUFBSUwsR0FBSixDQUFRbEUsa0JBQU8sQ0FBQ21FLFNBQVIsQ0FBa0JDLHFCQUFsQixDQUMxQnZFLE9BRDBCLEVBRTFCa0UsZUFGMEIsRUFHMUIvRCxrQkFBTyxDQUFDVyxTQUFSLENBQWtCK0MsbUJBQWxCLENBQXNDTixPQUF0QyxFQUErQyxXQUEvQyxDQUgwQixDQUFSLENBQXBCLENBQUE7YUFLRDtZQUVELE9BQU9ZLE9BQU8sQ0FBQ08sU0FBZixDQUFBO1FBQ0QsQ0FoREk7UUFpREwsSUFBSWQsS0FBSjtZQUNFLElBQUlPLE9BQU8sQ0FBQ1AsS0FBUixLQUFrQnBELFNBQXRCLEVBQWlDO2dCQUMvQiw4Q0FBQTtnQkFDQTJELE9BQU8sQ0FBQ1AsS0FBUixHQUFnQixJQUFJUyxHQUFKLENBQVFsRSxrQkFBTyxDQUFDbUUsU0FBUixDQUFrQkMscUJBQWxCLENBQ3RCdkUsT0FEc0IsRUFFdEJrRSxlQUZzQixFQUd0Qi9ELGtCQUFPLENBQUNXLFNBQVIsQ0FBa0IrQyxtQkFBbEIsQ0FBc0NOLE9BQXRDLEVBQStDLE9BQS9DLENBSHNCLENBQVIsQ0FBaEIsQ0FBQTthQUtEO1lBRUQsT0FBT1ksT0FBTyxDQUFDUCxLQUFmLENBQUE7UUFDRCxDQTVESTtRQTZETGUsS0FBSztZQUNIUixPQUFPLEdBQUcsRUFBVixDQUFBO1FBQ0QsQ0FBQTtLQS9ESCxDQUFBO0FBaUVELENBM0VNLENBQUEiLCJmaWxlIjoibmVvLW9uZS1zbWFydC1jb250cmFjdC1jb21waWxlci9zcmMvc3ltYm9scy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRzbGludDpkaXNhYmxlIGJhbi10eXBlcyBuby1iaXR3aXNlXG5pbXBvcnQgeyB0c1V0aWxzIH0gZnJvbSAnQG5lby1vbmUvdHMtdXRpbHMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuZXhwb3J0IGludGVyZmFjZSBHbG9iYWxzIHtcbiAgcmVhZG9ubHkgQXJyYXk6IHRzLlN5bWJvbDtcbiAgcmVhZG9ubHkgQnVmZmVyOiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IEJ1ZmZlckZyb206IHRzLlN5bWJvbDtcbiAgcmVhZG9ubHkgQnVmZmVyRXF1YWxzOiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IHByb2Nlc3M6IHRzLlN5bWJvbDtcbiAgcmVhZG9ubHkgQWNjb3VudEJhc2U6IHRzLlN5bWJvbDtcbiAgcmVhZG9ubHkgQXNzZXRCYXNlOiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IEF0dHJpYnV0ZUJhc2U6IHRzLlN5bWJvbDtcbiAgcmVhZG9ubHkgQmxvY2tCYXNlOiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IENvbnRyYWN0QmFzZTogdHMuU3ltYm9sO1xuICByZWFkb25seSBIZWFkZXJCYXNlOiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IElucHV0QmFzZTogdHMuU3ltYm9sO1xuICByZWFkb25seSBPdXRwdXRCYXNlOiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IFRyYW5zYWN0aW9uQmFzZTogdHMuU3ltYm9sO1xuICByZWFkb25seSBWYWxpZGF0b3JCYXNlOiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IFN0b3JhZ2VDb250ZXh0QmFzZTogdHMuU3ltYm9sO1xuICByZWFkb25seSBTdG9yYWdlQ29udGV4dFJlYWRPbmx5QmFzZTogdHMuU3ltYm9sO1xuICByZWFkb25seSBTdG9yYWdlSXRlcmF0b3JCYXNlOiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IHN5c2NhbGw6IHRzLlN5bWJvbDtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEdsb2JhbHMgPSAocHJvZ3JhbTogdHMuUHJvZ3JhbSwgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyKTogR2xvYmFscyA9PiB7XG4gIGNvbnN0IGJ1ZmZlckZpbGUgPSB0c1V0aWxzLmZpbGUuZ2V0U291cmNlRmlsZShwcm9ncmFtLCByZXF1aXJlLnJlc29sdmUoJ0B0eXBlcy9ub2RlL2luZGV4LmQudHMnKSk7XG4gIGlmIChidWZmZXJGaWxlID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIEJ1ZmZlcicpO1xuICB9XG4gIGNvbnN0IG5lb0ZpbGUgPSB0c1V0aWxzLmZpbGUuZ2V0U291cmNlRmlsZShcbiAgICBwcm9ncmFtLFxuICAgIHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUocmVxdWlyZS5yZXNvbHZlKCdAbmVvLW9uZS9zbWFydC1jb250cmFjdCcpKSwgJ2luZGV4LmQudHMnKSxcbiAgKTtcbiAgaWYgKG5lb0ZpbGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgTkVPIHR5cGUgZGVmaW5pdGlvbiBmaWxlJyk7XG4gIH1cblxuICBjb25zdCBuZW9HbG9iYWwgPSB0c1V0aWxzLnN0YXRlbWVudC5nZXROYW1lc3BhY2VPclRocm93KG5lb0ZpbGUsICdnbG9iYWwnKTtcblxuICBjb25zdCBidWZmZXIgPSB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyhcbiAgICB0eXBlQ2hlY2tlcixcbiAgICB0c1V0aWxzLnN0YXRlbWVudC5nZXRJbnRlcmZhY2VPclRocm93KGJ1ZmZlckZpbGUsICdCdWZmZXInKSxcbiAgKTtcblxuICBjb25zdCBidWZmZXJWYXIgPSB0c1V0aWxzLnR5cGVfLmdldFN5bWJvbE9yVGhyb3coXG4gICAgdHNVdGlscy50eXBlXy5nZXRUeXBlKHR5cGVDaGVja2VyLCB0c1V0aWxzLnN0YXRlbWVudC5nZXRWYXJpYWJsZURlY2xhcmF0aW9uT3JUaHJvdyhidWZmZXJGaWxlLCAnQnVmZmVyJykpLFxuICApO1xuXG4gIHJldHVybiB7XG4gICAgQXJyYXk6IHRzVXRpbHMudHlwZV8uZ2V0U3ltYm9sT3JUaHJvdyh0c1V0aWxzLnR5cGVzLmdldEFycmF5VHlwZSh0eXBlQ2hlY2tlcikpLFxuICAgIEJ1ZmZlcjogYnVmZmVyLFxuICAgIEJ1ZmZlckZyb206IHRzVXRpbHMuc3ltYm9sLmdldE1lbWJlck9yVGhyb3coYnVmZmVyVmFyLCAnZnJvbScpLFxuICAgIEJ1ZmZlckVxdWFsczogdHNVdGlscy5zeW1ib2wuZ2V0TWVtYmVyT3JUaHJvdyhidWZmZXIsICdlcXVhbHMnKSxcbiAgICBwcm9jZXNzOiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyhcbiAgICAgIHR5cGVDaGVja2VyLFxuICAgICAgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0VmFyaWFibGVEZWNsYXJhdGlvbk9yVGhyb3coYnVmZmVyRmlsZSwgJ3Byb2Nlc3MnKSxcbiAgICApLFxuICAgIEFjY291bnRCYXNlOiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyhcbiAgICAgIHR5cGVDaGVja2VyLFxuICAgICAgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0SW50ZXJmYWNlT3JUaHJvdyhuZW9HbG9iYWwsICdBY2NvdW50QmFzZScpLFxuICAgICksXG4gICAgQXNzZXRCYXNlOiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyhcbiAgICAgIHR5cGVDaGVja2VyLFxuICAgICAgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0SW50ZXJmYWNlT3JUaHJvdyhuZW9HbG9iYWwsICdBc3NldEJhc2UnKSxcbiAgICApLFxuICAgIEF0dHJpYnV0ZUJhc2U6IHRzVXRpbHMubm9kZS5nZXRTeW1ib2xPclRocm93KFxuICAgICAgdHlwZUNoZWNrZXIsXG4gICAgICB0c1V0aWxzLnN0YXRlbWVudC5nZXRJbnRlcmZhY2VPclRocm93KG5lb0dsb2JhbCwgJ0F0dHJpYnV0ZUJhc2UnKSxcbiAgICApLFxuICAgIEJsb2NrQmFzZTogdHNVdGlscy5ub2RlLmdldFN5bWJvbE9yVGhyb3coXG4gICAgICB0eXBlQ2hlY2tlcixcbiAgICAgIHRzVXRpbHMuc3RhdGVtZW50LmdldEludGVyZmFjZU9yVGhyb3cobmVvR2xvYmFsLCAnQmxvY2tCYXNlJyksXG4gICAgKSxcbiAgICBDb250cmFjdEJhc2U6IHRzVXRpbHMubm9kZS5nZXRTeW1ib2xPclRocm93KFxuICAgICAgdHlwZUNoZWNrZXIsXG4gICAgICB0c1V0aWxzLnN0YXRlbWVudC5nZXRJbnRlcmZhY2VPclRocm93KG5lb0dsb2JhbCwgJ0NvbnRyYWN0QmFzZScpLFxuICAgICksXG4gICAgSGVhZGVyQmFzZTogdHNVdGlscy5ub2RlLmdldFN5bWJvbE9yVGhyb3coXG4gICAgICB0eXBlQ2hlY2tlcixcbiAgICAgIHRzVXRpbHMuc3RhdGVtZW50LmdldEludGVyZmFjZU9yVGhyb3cobmVvR2xvYmFsLCAnSGVhZGVyQmFzZScpLFxuICAgICksXG4gICAgSW5wdXRCYXNlOiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyhcbiAgICAgIHR5cGVDaGVja2VyLFxuICAgICAgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0SW50ZXJmYWNlT3JUaHJvdyhuZW9HbG9iYWwsICdJbnB1dEJhc2UnKSxcbiAgICApLFxuICAgIE91dHB1dEJhc2U6IHRzVXRpbHMubm9kZS5nZXRTeW1ib2xPclRocm93KFxuICAgICAgdHlwZUNoZWNrZXIsXG4gICAgICB0c1V0aWxzLnN0YXRlbWVudC5nZXRJbnRlcmZhY2VPclRocm93KG5lb0dsb2JhbCwgJ091dHB1dEJhc2UnKSxcbiAgICApLFxuICAgIFRyYW5zYWN0aW9uQmFzZTogdHNVdGlscy5ub2RlLmdldFN5bWJvbE9yVGhyb3coXG4gICAgICB0eXBlQ2hlY2tlcixcbiAgICAgIHRzVXRpbHMuc3RhdGVtZW50LmdldEludGVyZmFjZU9yVGhyb3cobmVvR2xvYmFsLCAnVHJhbnNhY3Rpb25CYXNlJyksXG4gICAgKSxcbiAgICBWYWxpZGF0b3JCYXNlOiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyhcbiAgICAgIHR5cGVDaGVja2VyLFxuICAgICAgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0SW50ZXJmYWNlT3JUaHJvdyhuZW9HbG9iYWwsICdWYWxpZGF0b3JCYXNlJyksXG4gICAgKSxcbiAgICBTdG9yYWdlQ29udGV4dEJhc2U6IHRzVXRpbHMubm9kZS5nZXRTeW1ib2xPclRocm93KFxuICAgICAgdHlwZUNoZWNrZXIsXG4gICAgICB0c1V0aWxzLnN0YXRlbWVudC5nZXRJbnRlcmZhY2VPclRocm93KG5lb0dsb2JhbCwgJ1N0b3JhZ2VDb250ZXh0QmFzZScpLFxuICAgICksXG4gICAgU3RvcmFnZUNvbnRleHRSZWFkT25seUJhc2U6IHRzVXRpbHMubm9kZS5nZXRTeW1ib2xPclRocm93KFxuICAgICAgdHlwZUNoZWNrZXIsXG4gICAgICB0c1V0aWxzLnN0YXRlbWVudC5nZXRJbnRlcmZhY2VPclRocm93KG5lb0dsb2JhbCwgJ1N0b3JhZ2VDb250ZXh0UmVhZE9ubHlCYXNlJyksXG4gICAgKSxcbiAgICBTdG9yYWdlSXRlcmF0b3JCYXNlOiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyhcbiAgICAgIHR5cGVDaGVja2VyLFxuICAgICAgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0SW50ZXJmYWNlT3JUaHJvdyhuZW9HbG9iYWwsICdTdG9yYWdlSXRlcmF0b3JCYXNlJyksXG4gICAgKSxcbiAgICBzeXNjYWxsOiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyh0eXBlQ2hlY2tlciwgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0RnVuY3Rpb25PclRocm93KG5lb0dsb2JhbCwgJ3N5c2NhbGwnKSksXG4gIH07XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIExpYnMge1xuICByZWFkb25seSBTbWFydENvbnRyYWN0OiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IE1hcFN0b3JhZ2U6IHRzLlN5bWJvbDtcbiAgcmVhZG9ubHkgU2V0U3RvcmFnZTogdHMuU3ltYm9sO1xuICByZWFkb25seSBGaXhlZDogdHMuU3ltYm9sO1xuICByZWFkb25seSBjb25zdGFudDogdHMuU3ltYm9sO1xuICByZWFkb25seSB2ZXJpZnk6IHRzLlN5bWJvbDtcbiAgcmVhZG9ubHkgY3JlYXRlRXZlbnRIYW5kbGVyOiB0cy5TeW1ib2w7XG59XG5cbmNvbnN0IGZpbmRMaWJGaWxlID0gKHByb2dyYW06IHRzLlByb2dyYW0pOiB0cy5Tb3VyY2VGaWxlIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgZmlsZXMgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCk7XG5cbiAgcmV0dXJuIGZpbGVzLmZpbmQoKGZpbGUpID0+IHRzVXRpbHMuc3RhdGVtZW50LmdldENsYXNzKGZpbGUsICdNYXBTdG9yYWdlJykgIT09IHVuZGVmaW5lZCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TGlicyA9IChwcm9ncmFtOiB0cy5Qcm9ncmFtLCB0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXIpOiBMaWJzID0+IHtcbiAgY29uc3QgbGliRmlsZUluID0gZmluZExpYkZpbGUocHJvZ3JhbSk7XG4gIGlmIChsaWJGaWxlSW4gPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgTkVPIGxpYiBmaWxlJyk7XG4gIH1cblxuICBjb25zdCBsaWJGaWxlID0gbGliRmlsZUluO1xuXG4gIHJldHVybiB7XG4gICAgZ2V0IFNtYXJ0Q29udHJhY3QoKTogdHMuU3ltYm9sIHtcbiAgICAgIHJldHVybiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyh0eXBlQ2hlY2tlciwgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0Q2xhc3NPclRocm93KGxpYkZpbGUsICdTbWFydENvbnRyYWN0JykpO1xuICAgIH0sXG4gICAgZ2V0IE1hcFN0b3JhZ2UoKTogdHMuU3ltYm9sIHtcbiAgICAgIHJldHVybiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyh0eXBlQ2hlY2tlciwgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0Q2xhc3NPclRocm93KGxpYkZpbGUsICdNYXBTdG9yYWdlJykpO1xuICAgIH0sXG4gICAgZ2V0IFNldFN0b3JhZ2UoKTogdHMuU3ltYm9sIHtcbiAgICAgIHJldHVybiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyh0eXBlQ2hlY2tlciwgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0Q2xhc3NPclRocm93KGxpYkZpbGUsICdTZXRTdG9yYWdlJykpO1xuICAgIH0sXG4gICAgZ2V0IEZpeGVkKCk6IHRzLlN5bWJvbCB7XG4gICAgICByZXR1cm4gdHNVdGlscy5ub2RlLmdldFN5bWJvbE9yVGhyb3codHlwZUNoZWNrZXIsIHRzVXRpbHMuc3RhdGVtZW50LmdldFR5cGVBbGlhc09yVGhyb3cobGliRmlsZSwgJ0ZpeGVkJykpO1xuICAgIH0sXG4gICAgZ2V0IGNvbnN0YW50KCk6IHRzLlN5bWJvbCB7XG4gICAgICByZXR1cm4gdHNVdGlscy5ub2RlLmdldFN5bWJvbE9yVGhyb3codHlwZUNoZWNrZXIsIHRzVXRpbHMuc3RhdGVtZW50LmdldEZ1bmN0aW9uT3JUaHJvdyhsaWJGaWxlLCAnY29uc3RhbnQnKSk7XG4gICAgfSxcbiAgICBnZXQgdmVyaWZ5KCk6IHRzLlN5bWJvbCB7XG4gICAgICByZXR1cm4gdHNVdGlscy5ub2RlLmdldFN5bWJvbE9yVGhyb3codHlwZUNoZWNrZXIsIHRzVXRpbHMuc3RhdGVtZW50LmdldEZ1bmN0aW9uT3JUaHJvdyhsaWJGaWxlLCAndmVyaWZ5JykpO1xuICAgIH0sXG4gICAgZ2V0IGNyZWF0ZUV2ZW50SGFuZGxlcigpOiB0cy5TeW1ib2wge1xuICAgICAgcmV0dXJuIHRzVXRpbHMubm9kZS5nZXRTeW1ib2xPclRocm93KFxuICAgICAgICB0eXBlQ2hlY2tlcixcbiAgICAgICAgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0RnVuY3Rpb25PclRocm93KGxpYkZpbGUsICdjcmVhdGVFdmVudEhhbmRsZXInKSxcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGliQWxpYXNlcyB7XG4gIHJlYWRvbmx5IEFkZHJlc3M6IFNldDx0cy5JZGVudGlmaWVyPjtcbiAgcmVhZG9ubHkgSGFzaDI1NjogU2V0PHRzLklkZW50aWZpZXI+O1xuICByZWFkb25seSBTaWduYXR1cmU6IFNldDx0cy5JZGVudGlmaWVyPjtcbiAgcmVhZG9ubHkgUHVibGljS2V5OiBTZXQ8dHMuSWRlbnRpZmllcj47XG4gIHJlYWRvbmx5IEZpeGVkOiBTZXQ8dHMuSWRlbnRpZmllcj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGliQWxpYXNlc1dpdGhSZXNldCBleHRlbmRzIExpYkFsaWFzZXMge1xuICByZWFkb25seSByZXNldDogKCkgPT4gdm9pZDtcbn1cblxuLy8gdHNsaW50OmRpc2FibGUgcmVhZG9ubHkta2V5d29yZFxuaW50ZXJmYWNlIExpYkFsaWFzZXNPcHRpb25hbCB7XG4gIEFkZHJlc3M/OiBTZXQ8dHMuSWRlbnRpZmllcj47XG4gIEhhc2gyNTY/OiBTZXQ8dHMuSWRlbnRpZmllcj47XG4gIFNpZ25hdHVyZT86IFNldDx0cy5JZGVudGlmaWVyPjtcbiAgUHVibGljS2V5PzogU2V0PHRzLklkZW50aWZpZXI+O1xuICBGaXhlZD86IFNldDx0cy5JZGVudGlmaWVyPjtcbn1cbi8vIHRzbGludDplbmFibGUgcmVhZG9ubHkta2V5d29yZFxuXG5leHBvcnQgY29uc3QgZ2V0TGliQWxpYXNlcyA9IChwcm9ncmFtOiB0cy5Qcm9ncmFtLCBsYW5ndWFnZVNlcnZpY2U6IHRzLkxhbmd1YWdlU2VydmljZSk6IExpYkFsaWFzZXNXaXRoUmVzZXQgPT4ge1xuICBjb25zdCBsaWJGaWxlSW4gPSBmaW5kTGliRmlsZShwcm9ncmFtKTtcbiAgaWYgKGxpYkZpbGVJbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBORU8gbGliIGZpbGUnKTtcbiAgfVxuXG4gIGNvbnN0IGxpYkZpbGUgPSBsaWJGaWxlSW47XG5cbiAgbGV0IGFsaWFzZXM6IExpYkFsaWFzZXNPcHRpb25hbCA9IHt9O1xuXG4gIHJldHVybiB7XG4gICAgZ2V0IEFkZHJlc3MoKSB7XG4gICAgICBpZiAoYWxpYXNlcy5BZGRyZXNzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLW9iamVjdC1tdXRhdGlvblxuICAgICAgICBhbGlhc2VzLkFkZHJlc3MgPSBuZXcgU2V0KHRzVXRpbHMucmVmZXJlbmNlLmZpbmRSZWZlcmVuY2VzQXNOb2RlcyhcbiAgICAgICAgICBwcm9ncmFtLFxuICAgICAgICAgIGxhbmd1YWdlU2VydmljZSxcbiAgICAgICAgICB0c1V0aWxzLnN0YXRlbWVudC5nZXRUeXBlQWxpYXNPclRocm93KGxpYkZpbGUsICdBZGRyZXNzJyksXG4gICAgICAgICkgYXMgdHMuSWRlbnRpZmllcltdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFsaWFzZXMuQWRkcmVzcztcbiAgICB9LFxuICAgIGdldCBIYXNoMjU2KCkge1xuICAgICAgaWYgKGFsaWFzZXMuSGFzaDI1NiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1vYmplY3QtbXV0YXRpb25cbiAgICAgICAgYWxpYXNlcy5IYXNoMjU2ID0gbmV3IFNldCh0c1V0aWxzLnJlZmVyZW5jZS5maW5kUmVmZXJlbmNlc0FzTm9kZXMoXG4gICAgICAgICAgcHJvZ3JhbSxcbiAgICAgICAgICBsYW5ndWFnZVNlcnZpY2UsXG4gICAgICAgICAgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0VHlwZUFsaWFzT3JUaHJvdyhsaWJGaWxlLCAnSGFzaDI1NicpLFxuICAgICAgICApIGFzIHRzLklkZW50aWZpZXJbXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhbGlhc2VzLkhhc2gyNTY7XG4gICAgfSxcbiAgICBnZXQgU2lnbmF0dXJlKCkge1xuICAgICAgaWYgKGFsaWFzZXMuU2lnbmF0dXJlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLW9iamVjdC1tdXRhdGlvblxuICAgICAgICBhbGlhc2VzLlNpZ25hdHVyZSA9IG5ldyBTZXQodHNVdGlscy5yZWZlcmVuY2UuZmluZFJlZmVyZW5jZXNBc05vZGVzKFxuICAgICAgICAgIHByb2dyYW0sXG4gICAgICAgICAgbGFuZ3VhZ2VTZXJ2aWNlLFxuICAgICAgICAgIHRzVXRpbHMuc3RhdGVtZW50LmdldFR5cGVBbGlhc09yVGhyb3cobGliRmlsZSwgJ1NpZ25hdHVyZScpLFxuICAgICAgICApIGFzIHRzLklkZW50aWZpZXJbXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhbGlhc2VzLlNpZ25hdHVyZTtcbiAgICB9LFxuICAgIGdldCBQdWJsaWNLZXkoKSB7XG4gICAgICBpZiAoYWxpYXNlcy5QdWJsaWNLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tb2JqZWN0LW11dGF0aW9uXG4gICAgICAgIGFsaWFzZXMuUHVibGljS2V5ID0gbmV3IFNldCh0c1V0aWxzLnJlZmVyZW5jZS5maW5kUmVmZXJlbmNlc0FzTm9kZXMoXG4gICAgICAgICAgcHJvZ3JhbSxcbiAgICAgICAgICBsYW5ndWFnZVNlcnZpY2UsXG4gICAgICAgICAgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0VHlwZUFsaWFzT3JUaHJvdyhsaWJGaWxlLCAnUHVibGljS2V5JyksXG4gICAgICAgICkgYXMgdHMuSWRlbnRpZmllcltdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFsaWFzZXMuUHVibGljS2V5O1xuICAgIH0sXG4gICAgZ2V0IEZpeGVkKCkge1xuICAgICAgaWYgKGFsaWFzZXMuRml4ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tb2JqZWN0LW11dGF0aW9uXG4gICAgICAgIGFsaWFzZXMuRml4ZWQgPSBuZXcgU2V0KHRzVXRpbHMucmVmZXJlbmNlLmZpbmRSZWZlcmVuY2VzQXNOb2RlcyhcbiAgICAgICAgICBwcm9ncmFtLFxuICAgICAgICAgIGxhbmd1YWdlU2VydmljZSxcbiAgICAgICAgICB0c1V0aWxzLnN0YXRlbWVudC5nZXRUeXBlQWxpYXNPclRocm93KGxpYkZpbGUsICdGaXhlZCcpLFxuICAgICAgICApIGFzIHRzLklkZW50aWZpZXJbXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhbGlhc2VzLkZpeGVkO1xuICAgIH0sXG4gICAgcmVzZXQoKSB7XG4gICAgICBhbGlhc2VzID0ge307XG4gICAgfSxcbiAgfTtcbn07XG4iXX0=
|