@sonarwatch/portfolio-plugins 0.11.93 → 0.11.95

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/package.json +2 -2
  3. package/src/index.js +8 -0
  4. package/src/index.js.map +1 -1
  5. package/src/plugins/aurory/constants.d.ts +9 -0
  6. package/src/plugins/aurory/constants.js +19 -0
  7. package/src/plugins/aurory/constants.js.map +1 -0
  8. package/src/plugins/aurory/helpers.d.ts +2 -0
  9. package/src/plugins/aurory/helpers.js +21 -0
  10. package/src/plugins/aurory/helpers.js.map +1 -0
  11. package/src/plugins/aurory/index.d.ts +6 -0
  12. package/src/plugins/aurory/index.js +12 -0
  13. package/src/plugins/aurory/index.js.map +1 -0
  14. package/src/plugins/aurory/stakingFetcher.d.ts +3 -0
  15. package/src/plugins/aurory/stakingFetcher.js +47 -0
  16. package/src/plugins/aurory/stakingFetcher.js.map +1 -0
  17. package/src/plugins/aurory/structs.d.ts +10 -0
  18. package/src/plugins/aurory/structs.js +11 -0
  19. package/src/plugins/aurory/structs.js.map +1 -0
  20. package/src/plugins/flash/constants.js +1 -0
  21. package/src/plugins/flash/constants.js.map +1 -1
  22. package/src/plugins/flash/poolJob.js +3 -2
  23. package/src/plugins/flash/poolJob.js.map +1 -1
  24. package/src/plugins/flash/stakeFetcher.js +2 -0
  25. package/src/plugins/flash/stakeFetcher.js.map +1 -1
  26. package/src/plugins/flash/structs.d.ts +1 -0
  27. package/src/plugins/flash/structs.js +26 -1
  28. package/src/plugins/flash/structs.js.map +1 -1
  29. package/src/plugins/flowmatic/stakingFetcher.js +4 -0
  30. package/src/plugins/flowmatic/stakingFetcher.js.map +1 -1
  31. package/src/plugins/genesysgo/stakingFetcher.js +4 -0
  32. package/src/plugins/genesysgo/stakingFetcher.js.map +1 -1
  33. package/src/plugins/kamino/constants.d.ts +3 -3
  34. package/src/plugins/kamino/constants.js +53 -44
  35. package/src/plugins/kamino/constants.js.map +1 -1
  36. package/src/plugins/kamino/helpers/pdas.d.ts +2 -2
  37. package/src/plugins/kamino/helpers/pdas.js +28 -15
  38. package/src/plugins/kamino/helpers/pdas.js.map +1 -1
  39. package/src/plugins/kamino/index.js +2 -1
  40. package/src/plugins/kamino/index.js.map +1 -1
  41. package/src/plugins/kamino/lendsFetcher.js +158 -140
  42. package/src/plugins/kamino/lendsFetcher.js.map +1 -1
  43. package/src/plugins/kamino/marketsJob.d.ts +3 -0
  44. package/src/plugins/kamino/marketsJob.js +29 -0
  45. package/src/plugins/kamino/marketsJob.js.map +1 -0
  46. package/src/plugins/kamino/types.d.ts +5 -0
  47. package/src/plugins/x-staking-solana/constants.d.ts +16 -0
  48. package/src/plugins/x-staking-solana/constants.js +64 -0
  49. package/src/plugins/x-staking-solana/constants.js.map +1 -0
  50. package/src/plugins/x-staking-solana/index.d.ts +6 -0
  51. package/src/plugins/x-staking-solana/index.js +15 -0
  52. package/src/plugins/x-staking-solana/index.js.map +1 -0
  53. package/src/plugins/x-staking-solana/stakingJob.d.ts +3 -0
  54. package/src/plugins/x-staking-solana/stakingJob.js +49 -0
  55. package/src/plugins/x-staking-solana/stakingJob.js.map +1 -0
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const portfolio_core_1 = require("@sonarwatch/portfolio-core");
13
+ const clients_1 = require("../../utils/clients");
14
+ const solana_1 = require("../../utils/solana");
15
+ const filters_1 = require("../../utils/solana/filters");
16
+ const constants_1 = require("./constants");
17
+ const klend_1 = require("./structs/klend");
18
+ const executor = (cache) => __awaiter(void 0, void 0, void 0, function* () {
19
+ const client = (0, clients_1.getClientSolana)();
20
+ const lendingMarketAccounts = yield (0, solana_1.getParsedProgramAccounts)(client, klend_1.lendingMarketStruct, constants_1.klendProgramId, (0, filters_1.dataSizeFilter)(klend_1.lendingMarketStruct.byteSize));
21
+ yield cache.setItem(constants_1.marketsKey, lendingMarketAccounts.map((acc) => acc.pubkey.toString()), { prefix: constants_1.platformId, networkId: portfolio_core_1.NetworkId.solana });
22
+ });
23
+ const job = {
24
+ id: `${constants_1.platformId}-markets`,
25
+ executor,
26
+ label: 'normal',
27
+ };
28
+ exports.default = job;
29
+ //# sourceMappingURL=marketsJob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketsJob.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/kamino/marketsJob.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+DAAuD;AAGvD,iDAAsD;AACtD,+CAA8D;AAC9D,wDAA4D;AAC5D,2CAAqE;AACrE,2CAAsD;AAEtD,MAAM,QAAQ,GAAgB,CAAO,KAAY,EAAE,EAAE;IACnD,MAAM,MAAM,GAAG,IAAA,yBAAe,GAAE,CAAC;IAEjC,MAAM,qBAAqB,GAAG,MAAM,IAAA,iCAAwB,EAC1D,MAAM,EACN,2BAAmB,EACnB,0BAAc,EACd,IAAA,wBAAc,EAAC,2BAAmB,CAAC,QAAQ,CAAC,CAC7C,CAAC;IAEF,MAAM,KAAK,CAAC,OAAO,CACjB,sBAAU,EACV,qBAAqB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EACzD,EAAE,MAAM,EAAE,sBAAU,EAAE,SAAS,EAAE,0BAAS,CAAC,MAAM,EAAE,CACpD,CAAC;AACJ,CAAC,CAAA,CAAC;AAEF,MAAM,GAAG,GAAQ;IACf,EAAE,EAAE,GAAG,sBAAU,UAAU;IAC3B,QAAQ;IACR,KAAK,EAAE,QAAQ;CAChB,CAAC;AACF,kBAAe,GAAG,CAAC"}
@@ -86,3 +86,8 @@ export type FarmInfo = {
86
86
  lockingStart: number;
87
87
  lockingDuration: number;
88
88
  };
89
+ export type LendingMarketConfig = {
90
+ name: string;
91
+ multiplyPairs?: string[][];
92
+ leveragePairs?: string[][];
93
+ };
@@ -0,0 +1,16 @@
1
+ import { Platform } from '@sonarwatch/portfolio-core';
2
+ export declare const whalesMarketPlatformId = "whalesmarket";
3
+ export declare const whalesMarketPlatform: Platform;
4
+ export declare const stepFinancePlatformId = "stepfinance";
5
+ export declare const stepFinancePlatform: Platform;
6
+ export declare const allbridgePlatformId = "allbridge";
7
+ export declare const allbridgePlatform: Platform;
8
+ export declare const xStakingConfigs: StakingConfig[];
9
+ export type StakingConfig = {
10
+ mint: string;
11
+ decimals: number;
12
+ vault: string;
13
+ xMint: string;
14
+ xDecimals: number;
15
+ platformId: string;
16
+ };
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.xStakingConfigs = exports.allbridgePlatform = exports.allbridgePlatformId = exports.stepFinancePlatform = exports.stepFinancePlatformId = exports.whalesMarketPlatform = exports.whalesMarketPlatformId = void 0;
4
+ const constants_1 = require("../aurory/constants");
5
+ exports.whalesMarketPlatformId = 'whalesmarket';
6
+ exports.whalesMarketPlatform = {
7
+ id: exports.whalesMarketPlatformId,
8
+ name: 'Whales Market',
9
+ image: 'https://sonar.watch/img/platforms/whalesmarket.png',
10
+ // defiLlamaId: 'foo-finance', // from https://defillama.com/docs/api
11
+ website: 'https://app.whales.market/',
12
+ twitter: 'https://twitter.com/WhalesMarket',
13
+ };
14
+ exports.stepFinancePlatformId = 'stepfinance';
15
+ exports.stepFinancePlatform = {
16
+ id: exports.stepFinancePlatformId,
17
+ name: 'Step Finance',
18
+ image: 'https://sonar.watch/img/platforms/stepfinance.png',
19
+ website: 'https://app.step.finance/',
20
+ twitter: 'https://twitter.com/StepFinance_',
21
+ };
22
+ exports.allbridgePlatformId = 'allbridge';
23
+ exports.allbridgePlatform = {
24
+ id: exports.allbridgePlatformId,
25
+ name: 'Step Finance',
26
+ image: 'https://sonar.watch/img/platforms/allbridge.png',
27
+ website: 'https://stake.allbridge.io/?chain=SOL',
28
+ twitter: 'https://twitter.com/Allbridge_io',
29
+ };
30
+ exports.xStakingConfigs = [
31
+ {
32
+ mint: constants_1.auryMint,
33
+ decimals: constants_1.decimals,
34
+ vault: constants_1.vaultPubkey,
35
+ xMint: constants_1.xAuryMint,
36
+ xDecimals: 9,
37
+ platformId: constants_1.auroryPlatformId,
38
+ },
39
+ {
40
+ mint: 'GTH3wG3NErjwcf7VGCoXEXkgXSHvYhx5gtATeeM5JAS1',
41
+ decimals: 6,
42
+ vault: 'Cm1KT2iqQ3LoxbmLy4WrQ9wE7WByJx6R512A28LbjGh9',
43
+ xMint: '3wCoTb3TArUdzmeTBPzPFyPBUP6EJXaW5LAzGsWCpySu',
44
+ xDecimals: 6,
45
+ platformId: exports.whalesMarketPlatformId,
46
+ },
47
+ {
48
+ mint: 'StepAscQoEioFxxWGnh2sLBDFp9d8rvKz2Yp39iDpyT',
49
+ decimals: 9,
50
+ vault: 'ANYxxG365hutGYaTdtUQG8u2hC4dFX9mFHKuzy9ABQJi',
51
+ xMint: 'xStpgUCss9piqeFUk2iLVcvJEGhAdJxJQuwLkXP555G',
52
+ xDecimals: 9,
53
+ platformId: exports.stepFinancePlatformId,
54
+ },
55
+ {
56
+ mint: 'a11bdAAuV8iB2fu7X6AxAvDTo1QZ8FXB3kk5eecdasp',
57
+ decimals: 9,
58
+ vault: '51dd7AuT32b5VCK2rBVrjLGvfuvZ3kMayNrZZbWuvas2',
59
+ xMint: 'xAx6d1sjmBvpWkVZQEqgUvPmGBNndEXPxYpr3QVp61H',
60
+ xDecimals: 9,
61
+ platformId: exports.allbridgePlatformId,
62
+ },
63
+ ];
64
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/x-staking-solana/constants.ts"],"names":[],"mappings":";;;AACA,mDAM6B;AAEhB,QAAA,sBAAsB,GAAG,cAAc,CAAC;AACxC,QAAA,oBAAoB,GAAa;IAC5C,EAAE,EAAE,8BAAsB;IAC1B,IAAI,EAAE,eAAe;IACrB,KAAK,EAAE,oDAAoD;IAC3D,qEAAqE;IACrE,OAAO,EAAE,4BAA4B;IACrC,OAAO,EAAE,kCAAkC;CAC5C,CAAC;AAEW,QAAA,qBAAqB,GAAG,aAAa,CAAC;AACtC,QAAA,mBAAmB,GAAa;IAC3C,EAAE,EAAE,6BAAqB;IACzB,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,mDAAmD;IAC1D,OAAO,EAAE,2BAA2B;IACpC,OAAO,EAAE,kCAAkC;CAC5C,CAAC;AAEW,QAAA,mBAAmB,GAAG,WAAW,CAAC;AAClC,QAAA,iBAAiB,GAAa;IACzC,EAAE,EAAE,2BAAmB;IACvB,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,iDAAiD;IACxD,OAAO,EAAE,uCAAuC;IAChD,OAAO,EAAE,kCAAkC;CAC5C,CAAC;AAEW,QAAA,eAAe,GAAoB;IAC9C;QACE,IAAI,EAAE,oBAAQ;QACd,QAAQ,EAAR,oBAAQ;QACR,KAAK,EAAE,uBAAW;QAClB,KAAK,EAAE,qBAAS;QAChB,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,4BAAgB;KAC7B;IACD;QACE,IAAI,EAAE,8CAA8C;QACpD,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE,8CAA8C;QACrD,KAAK,EAAE,8CAA8C;QACrD,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,8BAAsB;KACnC;IACD;QACE,IAAI,EAAE,6CAA6C;QACnD,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE,8CAA8C;QACrD,KAAK,EAAE,6CAA6C;QACpD,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,6BAAqB;KAClC;IACD;QACE,IAAI,EAAE,6CAA6C;QACnD,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE,8CAA8C;QACrD,KAAK,EAAE,6CAA6C;QACpD,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,2BAAmB;KAChC;CACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Platform } from '@sonarwatch/portfolio-core';
2
+ import { Fetcher } from '../../Fetcher';
3
+ import { Job } from '../../Job';
4
+ export declare const platforms: Platform[];
5
+ export declare const jobs: Job[];
6
+ export declare const fetchers: Fetcher[];
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.fetchers = exports.jobs = exports.platforms = void 0;
7
+ const constants_1 = require("./constants");
8
+ const stakingJob_1 = __importDefault(require("./stakingJob"));
9
+ exports.platforms = [
10
+ constants_1.whalesMarketPlatform,
11
+ constants_1.stepFinancePlatform,
12
+ ];
13
+ exports.jobs = [stakingJob_1.default];
14
+ exports.fetchers = [];
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/x-staking-solana/index.ts"],"names":[],"mappings":";;;;;;AAGA,2CAAwE;AACxE,8DAAuC;AAE1B,QAAA,SAAS,GAAe;IACnC,gCAAoB;IACpB,+BAAmB;CACpB,CAAC;AACW,QAAA,IAAI,GAAU,CAAC,oBAAW,CAAC,CAAC;AAC5B,QAAA,QAAQ,GAAc,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Job } from '../../Job';
2
+ declare const job: Job;
3
+ export default job;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const web3_js_1 = require("@solana/web3.js");
13
+ const portfolio_core_1 = require("@sonarwatch/portfolio-core");
14
+ const clients_1 = require("../../utils/clients");
15
+ const solana_1 = require("../../utils/solana");
16
+ const constants_1 = require("./constants");
17
+ const executor = (cache) => __awaiter(void 0, void 0, void 0, function* () {
18
+ const client = (0, clients_1.getClientSolana)();
19
+ const vaultsAccounts = yield (0, solana_1.getParsedMultipleAccountsInfo)(client, solana_1.tokenAccountStruct, constants_1.xStakingConfigs.map((conf) => new web3_js_1.PublicKey(conf.vault)));
20
+ const tokensInfos = yield (0, solana_1.getParsedMultipleAccountsInfo)(client, solana_1.mintAccountStruct, constants_1.xStakingConfigs.map((conf) => new web3_js_1.PublicKey(conf.xMint)));
21
+ const tokensPricesMap = yield cache.getTokenPricesAsMap(constants_1.xStakingConfigs.map((conf) => conf.mint), portfolio_core_1.NetworkId.solana);
22
+ for (let i = 0; i < constants_1.xStakingConfigs.length; i++) {
23
+ const config = constants_1.xStakingConfigs[i];
24
+ const tokenPrice = tokensPricesMap.get(config.mint);
25
+ const [tokenInfo, vaultAccount] = [tokensInfos[i], vaultsAccounts[i]];
26
+ if (!tokenInfo || !vaultAccount || !tokenPrice)
27
+ continue;
28
+ const xSupply = tokenInfo.supply.dividedBy(Math.pow(10, tokenInfo.decimals));
29
+ const vaultTokenAmount = vaultAccount.amount.dividedBy(Math.pow(10, config.decimals));
30
+ const xPrice = vaultTokenAmount.dividedBy(xSupply).times(tokenPrice.price);
31
+ yield cache.setTokenPriceSource({
32
+ address: config.xMint,
33
+ decimals: config.xDecimals,
34
+ id: config.vault,
35
+ networkId: portfolio_core_1.NetworkId.solana,
36
+ platformId: config.platformId,
37
+ price: xPrice.toNumber(),
38
+ timestamp: Date.now(),
39
+ weight: 1,
40
+ });
41
+ }
42
+ });
43
+ const job = {
44
+ id: `x-staking-solana`,
45
+ executor,
46
+ label: 'normal',
47
+ };
48
+ exports.default = job;
49
+ //# sourceMappingURL=stakingJob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stakingJob.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/x-staking-solana/stakingJob.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,6CAA4C;AAC5C,+DAAuD;AAGvD,iDAAsD;AACtD,+CAI4B;AAC5B,2CAA8C;AAE9C,MAAM,QAAQ,GAAgB,CAAO,KAAY,EAAE,EAAE;IACnD,MAAM,MAAM,GAAG,IAAA,yBAAe,GAAE,CAAC;IAEjC,MAAM,cAAc,GAAG,MAAM,IAAA,sCAA6B,EACxD,MAAM,EACN,2BAAkB,EAClB,2BAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,mBAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CACzD,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,IAAA,sCAA6B,EACrD,MAAM,EACN,0BAAiB,EACjB,2BAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,mBAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CACzD,CAAC;IAEF,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,mBAAmB,CACrD,2BAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EACxC,0BAAS,CAAC,MAAM,CACjB,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,2BAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,2BAAe,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtE,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,IAAI,CAAC,UAAU;YAAE,SAAS;QAEzD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,SAAA,EAAE,EAAI,SAAS,CAAC,QAAQ,CAAA,CAAC,CAAC;QAErE,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAC,SAAS,CACpD,SAAA,EAAE,EAAI,MAAM,CAAC,QAAQ,CAAA,CACtB,CAAC;QAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAE3E,MAAM,KAAK,CAAC,mBAAmB,CAAC;YAC9B,OAAO,EAAE,MAAM,CAAC,KAAK;YACrB,QAAQ,EAAE,MAAM,CAAC,SAAS;YAC1B,EAAE,EAAE,MAAM,CAAC,KAAK;YAChB,SAAS,EAAE,0BAAS,CAAC,MAAM;YAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE;YACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM,EAAE,CAAC;SACV,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,MAAM,GAAG,GAAQ;IACf,EAAE,EAAE,kBAAkB;IACtB,QAAQ;IACR,KAAK,EAAE,QAAQ;CAChB,CAAC;AACF,kBAAe,GAAG,CAAC"}