@agoric/orchestration 0.1.1-dev-d1ef359.0 → 0.1.1-dev-ee18609.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agoric/orchestration",
|
|
3
|
-
"version": "0.1.1-dev-
|
|
3
|
+
"version": "0.1.1-dev-ee18609.0+ee18609",
|
|
4
4
|
"description": "Chain abstraction for Agoric's orchestration clients",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.js",
|
|
@@ -33,19 +33,19 @@
|
|
|
33
33
|
},
|
|
34
34
|
"homepage": "https://github.com/Agoric/agoric-sdk#readme",
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@agoric/async-flow": "0.1.1-dev-
|
|
37
|
-
"@agoric/cosmic-proto": "0.4.1-dev-
|
|
38
|
-
"@agoric/ertp": "0.16.3-dev-
|
|
39
|
-
"@agoric/internal": "0.3.3-dev-
|
|
40
|
-
"@agoric/network": "0.1.1-dev-
|
|
41
|
-
"@agoric/notifier": "0.6.3-dev-
|
|
42
|
-
"@agoric/store": "0.9.3-dev-
|
|
43
|
-
"@agoric/time": "0.3.3-dev-
|
|
44
|
-
"@agoric/vat-data": "0.5.3-dev-
|
|
45
|
-
"@agoric/vats": "0.15.2-dev-
|
|
46
|
-
"@agoric/vow": "0.1.1-dev-
|
|
47
|
-
"@agoric/zoe": "0.26.3-dev-
|
|
48
|
-
"@agoric/zone": "0.2.3-dev-
|
|
36
|
+
"@agoric/async-flow": "0.1.1-dev-ee18609.0+ee18609",
|
|
37
|
+
"@agoric/cosmic-proto": "0.4.1-dev-ee18609.0+ee18609",
|
|
38
|
+
"@agoric/ertp": "0.16.3-dev-ee18609.0+ee18609",
|
|
39
|
+
"@agoric/internal": "0.3.3-dev-ee18609.0+ee18609",
|
|
40
|
+
"@agoric/network": "0.1.1-dev-ee18609.0+ee18609",
|
|
41
|
+
"@agoric/notifier": "0.6.3-dev-ee18609.0+ee18609",
|
|
42
|
+
"@agoric/store": "0.9.3-dev-ee18609.0+ee18609",
|
|
43
|
+
"@agoric/time": "0.3.3-dev-ee18609.0+ee18609",
|
|
44
|
+
"@agoric/vat-data": "0.5.3-dev-ee18609.0+ee18609",
|
|
45
|
+
"@agoric/vats": "0.15.2-dev-ee18609.0+ee18609",
|
|
46
|
+
"@agoric/vow": "0.1.1-dev-ee18609.0+ee18609",
|
|
47
|
+
"@agoric/zoe": "0.26.3-dev-ee18609.0+ee18609",
|
|
48
|
+
"@agoric/zone": "0.2.3-dev-ee18609.0+ee18609",
|
|
49
49
|
"@endo/base64": "^1.0.9",
|
|
50
50
|
"@endo/errors": "^1.2.9",
|
|
51
51
|
"@endo/far": "^1.1.10",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"@noble/hashes": "^1.5.0"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
|
-
"@agoric/swingset-liveslots": "0.10.3-dev-
|
|
57
|
+
"@agoric/swingset-liveslots": "0.10.3-dev-ee18609.0+ee18609",
|
|
58
58
|
"@chain-registry/client": "^1.47.4",
|
|
59
59
|
"@cosmjs/amino": "^0.32.3",
|
|
60
60
|
"@cosmjs/proto-signing": "^0.32.3",
|
|
@@ -97,5 +97,5 @@
|
|
|
97
97
|
"typeCoverage": {
|
|
98
98
|
"atLeast": 97.77
|
|
99
99
|
},
|
|
100
|
-
"gitHead": "
|
|
100
|
+
"gitHead": "ee18609f4a135945eb43fc4ad7092406eaf2c623"
|
|
101
101
|
}
|
package/src/exos/chain-hub.d.ts
CHANGED
|
@@ -40,6 +40,14 @@ export function makeChainHub(zone: Zone, agoricNames: Remote<NameHub>, vowTools:
|
|
|
40
40
|
* @param {CosmosChainInfo} chainInfo
|
|
41
41
|
*/
|
|
42
42
|
registerChain(name: string, chainInfo: CosmosChainInfo): void;
|
|
43
|
+
/**
|
|
44
|
+
* Update chain info by completely replacing existing entry
|
|
45
|
+
*
|
|
46
|
+
* @param {string} chainName - Name of the chain to update
|
|
47
|
+
* @param {CosmosChainInfo} chainInfo - New chain info
|
|
48
|
+
* @throws {Error} If chain not registered
|
|
49
|
+
*/
|
|
50
|
+
updateChain(chainName: string, chainInfo: CosmosChainInfo): void;
|
|
43
51
|
/**
|
|
44
52
|
* @template {string} K
|
|
45
53
|
* @param {K} chainName
|
|
@@ -52,6 +60,15 @@ export function makeChainHub(zone: Zone, agoricNames: Remote<NameHub>, vowTools:
|
|
|
52
60
|
* @param {IBCConnectionInfo} connectionInfo from primary to counterparty
|
|
53
61
|
*/
|
|
54
62
|
registerConnection(primaryChainId: string, counterpartyChainId: string, connectionInfo: IBCConnectionInfo): void;
|
|
63
|
+
/**
|
|
64
|
+
* Update connection info by completely replacing existing entry
|
|
65
|
+
*
|
|
66
|
+
* @param {string} primaryChainId - ID of primary chain
|
|
67
|
+
* @param {string} counterpartyChainId - ID of counterparty chain
|
|
68
|
+
* @param {IBCConnectionInfo} connectionInfo - New connection info
|
|
69
|
+
* @throws {Error} If connection not registered
|
|
70
|
+
*/
|
|
71
|
+
updateConnection(primaryChainId: string, counterpartyChainId: string, connectionInfo: IBCConnectionInfo): void;
|
|
55
72
|
/**
|
|
56
73
|
* @param {string | { chainId: string }} primary the primary chain
|
|
57
74
|
* @param {string | { chainId: string }} counter the counterparty chain
|
|
@@ -81,6 +98,15 @@ export function makeChainHub(zone: Zone, agoricNames: Remote<NameHub>, vowTools:
|
|
|
81
98
|
* @param {DenomDetail} detail - chainName and baseName must be registered
|
|
82
99
|
*/
|
|
83
100
|
registerAsset(denom: Denom, detail: DenomDetail): void;
|
|
101
|
+
/**
|
|
102
|
+
* Update asset info by completely replacing existing entry
|
|
103
|
+
*
|
|
104
|
+
* @param {Denom} denom - Denom on the holding chain
|
|
105
|
+
* @param {DenomDetail} detail - New asset details
|
|
106
|
+
* @throws {Error} If asset not registered or referenced chains not
|
|
107
|
+
* registered
|
|
108
|
+
*/
|
|
109
|
+
updateAsset(denom: Denom, detail: DenomDetail): void;
|
|
84
110
|
/**
|
|
85
111
|
* Retrieve holding, issuing chain names etc. for a denom.
|
|
86
112
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chain-hub.d.ts","sourceRoot":"","sources":["chain-hub.js"],"names":[],"mappings":"AAoBA;;;;;;;;GAQG;AAEH,gEAAgE;AAChE,2BAAkD,KAAK,CAAE;sBAsB/C,CAAC,OAAO,OAAO,EAAE,MAAM,OAAO,OAAO,CAAC;;;;;;AAYhD,oCAAoC;AACpC,gCAAuC;AACvC,8CAA8C;AAC9C,gDAAuD;AACvD,0CAA0C;AAC1C,uCAA8C;AAgBvC,uCAHI,MAAM,UAOd;AAUI,wCAHI,MAAM,YACN,MAAM,UAOhB;AAoCM,wDALI,MAAM,kBACN,MAAM,YACN,iBAAiB,GACf,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAavC;AAwCD,0CAA0C;AAC1C,iCADW,aAAa,aAAa,CAAC,CAUpC;
|
|
1
|
+
{"version":3,"file":"chain-hub.d.ts","sourceRoot":"","sources":["chain-hub.js"],"names":[],"mappings":"AAoBA;;;;;;;;GAQG;AAEH,gEAAgE;AAChE,2BAAkD,KAAK,CAAE;sBAsB/C,CAAC,OAAO,OAAO,EAAE,MAAM,OAAO,OAAO,CAAC;;;;;;AAYhD,oCAAoC;AACpC,gCAAuC;AACvC,8CAA8C;AAC9C,gDAAuD;AACvD,0CAA0C;AAC1C,uCAA8C;AAgBvC,uCAHI,MAAM,UAOd;AAUI,wCAHI,MAAM,YACN,MAAM,UAOhB;AAoCM,wDALI,MAAM,kBACN,MAAM,YACN,iBAAiB,GACf,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAavC;AAwCD,0CAA0C;AAC1C,iCADW,aAAa,aAAa,CAAC,CAUpC;AA2CK,mCAJI,IAAI,eACJ,OAAO,OAAO,CAAC,YACf,QAAQ;IA0If;;;;;;;;;;;OAWG;wBAFQ,MAAM,aACN,eAAe;IAQ1B;;;;;;OAMG;2BAHQ,MAAM,aACN,eAAe;IAgB1B;;;;OAIG;iBAHmB,CAAC,SAAV,MAAQ,aACV,CAAC,GACC,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC;IAYpC;;;;OAIG;uCAHQ,MAAM,uBACN,MAAM,kBACN,iBAAiB;IAU5B;;;;;;;OAOG;qCAJQ,MAAM,uBACN,MAAM,kBACN,iBAAiB;IAiB5B;;;;OAIG;+BAHQ,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,WAC5B,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAC1B,IAAI,iBAAiB,CAAC;IAmBnC;;;;;;;;OAQG;2BAPmB,EAAE,SAAX,MAAQ,EACC,EAAE,SAAX,MAAQ,eACV,EAAE,eACF,EAAE,GACA,IACZ,CAAK,eAAe,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAC9D;IAOJ;;;;;;;OAOG;yBAHQ,KAAK,UAEL,WAAW;IAmBtB;;;;;;;OAOG;uBAJQ,KAAK,UACL,WAAW;IAgCtB;;;;;;OAMG;oBAHQ,KAAK,gBACL,MAAM,GACJ,WAAW,GAAG,SAAS;IASpC;;;;;OAKG;oBAFQ,KAAK,GACH,KAAK,GAAG,SAAS;IAQ9B;;;;OAIG;gCAHQ,MAAM,GACJ,SAAS;IAatB;;;;OAIG;gCAHQ,MAAM,GACJ,kBAAkB;IAwB/B;;;;;;;;;;;;;;;OAeG;mCANQ,YAAY,eACZ,WAAW,gBACX,MAAM,gBACN,qBAAqB,CAAC,aAAa,CAAC,GAClC,aAAa;GAwG7B;AAUM,yCAJI,QAAQ,QACR,MAAM,UACN,eAAe,EAAE,QAe3B;;;;4BAjuBqB,CAAC,SAAV,MAAQ,IACR,CAAC,SAAS,MAAM,WAAW,GACjC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,GAC/C,SAAS;;;;;cAMF,MAAM;;;;eACN,KAAK;;;;eACL,MAAM;;;;;;uBAgsBN,UAAU,CAAC,OAAO,YAAY,CAAC;uCAvtBuG,kBAAkB;mCAAlB,kBAAkB;kCAG/H,kBAAkB;0BAJlC,cAAc;6BAFX,cAAc;4BAMD,kBAAkB;8BALzB,aAAa;qCAEuG,kBAAkB;yBAFtI,aAAa;2BAIoD,yBAAyB;+BAAzB,yBAAyB;wCAAzB,yBAAyB;kCAAzB,yBAAyB;iCAAzB,yBAAyB;2CAF0B,kBAAkB;qCAAlB,kBAAkB;iCAC7H,kBAAkB;+BAAlB,kBAAkB"}
|
package/src/exos/chain-hub.js
CHANGED
|
@@ -204,15 +204,22 @@ export const TransferRouteShape = M.splitRecord(
|
|
|
204
204
|
|
|
205
205
|
const ChainHubI = M.interface('ChainHub', {
|
|
206
206
|
registerChain: M.call(M.string(), CosmosChainInfoShape).returns(),
|
|
207
|
+
updateChain: M.call(M.string(), CosmosChainInfoShape).returns(),
|
|
207
208
|
getChainInfo: M.call(M.string()).returns(VowShape),
|
|
208
209
|
registerConnection: M.call(
|
|
209
210
|
M.string(),
|
|
210
211
|
M.string(),
|
|
211
212
|
IBCConnectionInfoShape,
|
|
212
213
|
).returns(),
|
|
214
|
+
updateConnection: M.call(
|
|
215
|
+
M.string(),
|
|
216
|
+
M.string(),
|
|
217
|
+
IBCConnectionInfoShape,
|
|
218
|
+
).returns(),
|
|
213
219
|
getConnectionInfo: M.call(ChainIdArgShape, ChainIdArgShape).returns(VowShape),
|
|
214
220
|
getChainsAndConnection: M.call(M.string(), M.string()).returns(VowShape),
|
|
215
221
|
registerAsset: M.call(M.string(), DenomDetailShape).returns(),
|
|
222
|
+
updateAsset: M.call(M.string(), DenomDetailShape).returns(),
|
|
216
223
|
getAsset: M.call(M.string(), M.string()).returns(
|
|
217
224
|
M.or(DenomDetailShape, M.undefined()),
|
|
218
225
|
),
|
|
@@ -390,6 +397,26 @@ export const makeChainHub = (zone, agoricNames, vowTools) => {
|
|
|
390
397
|
bech32PrefixToChainName.init(chainInfo.bech32Prefix, name);
|
|
391
398
|
}
|
|
392
399
|
},
|
|
400
|
+
/**
|
|
401
|
+
* Update chain info by completely replacing existing entry
|
|
402
|
+
*
|
|
403
|
+
* @param {string} chainName - Name of the chain to update
|
|
404
|
+
* @param {CosmosChainInfo} chainInfo - New chain info
|
|
405
|
+
* @throws {Error} If chain not registered
|
|
406
|
+
*/
|
|
407
|
+
updateChain(chainName, chainInfo) {
|
|
408
|
+
if (!chainInfos.has(chainName)) {
|
|
409
|
+
throw makeError(`Chain ${q(chainName)} not registered`);
|
|
410
|
+
}
|
|
411
|
+
const oldInfo = chainInfos.get(chainName);
|
|
412
|
+
if (oldInfo.bech32Prefix) {
|
|
413
|
+
bech32PrefixToChainName.delete(oldInfo.bech32Prefix);
|
|
414
|
+
}
|
|
415
|
+
chainInfos.set(chainName, chainInfo);
|
|
416
|
+
if (chainInfo.bech32Prefix) {
|
|
417
|
+
bech32PrefixToChainName.init(chainInfo.bech32Prefix, chainName);
|
|
418
|
+
}
|
|
419
|
+
},
|
|
393
420
|
/**
|
|
394
421
|
* @template {string} K
|
|
395
422
|
* @param {K} chainName
|
|
@@ -418,7 +445,28 @@ export const makeChainHub = (zone, agoricNames, vowTools) => {
|
|
|
418
445
|
);
|
|
419
446
|
connectionInfos.init(key, normalized);
|
|
420
447
|
},
|
|
421
|
-
|
|
448
|
+
/**
|
|
449
|
+
* Update connection info by completely replacing existing entry
|
|
450
|
+
*
|
|
451
|
+
* @param {string} primaryChainId - ID of primary chain
|
|
452
|
+
* @param {string} counterpartyChainId - ID of counterparty chain
|
|
453
|
+
* @param {IBCConnectionInfo} connectionInfo - New connection info
|
|
454
|
+
* @throws {Error} If connection not registered
|
|
455
|
+
*/
|
|
456
|
+
updateConnection(primaryChainId, counterpartyChainId, connectionInfo) {
|
|
457
|
+
const key = connectionKey(primaryChainId, counterpartyChainId);
|
|
458
|
+
if (!connectionInfos.has(key)) {
|
|
459
|
+
throw makeError(
|
|
460
|
+
`Connection ${q(primaryChainId)}<->${q(counterpartyChainId)} not registered`,
|
|
461
|
+
);
|
|
462
|
+
}
|
|
463
|
+
const [_, normalizedInfo] = normalizeConnectionInfo(
|
|
464
|
+
primaryChainId,
|
|
465
|
+
counterpartyChainId,
|
|
466
|
+
connectionInfo,
|
|
467
|
+
);
|
|
468
|
+
connectionInfos.set(key, normalizedInfo);
|
|
469
|
+
},
|
|
422
470
|
/**
|
|
423
471
|
* @param {string | { chainId: string }} primary the primary chain
|
|
424
472
|
* @param {string | { chainId: string }} counter the counterparty chain
|
|
@@ -480,6 +528,42 @@ export const makeChainHub = (zone, agoricNames, vowTools) => {
|
|
|
480
528
|
brandDenoms.init(detail.brand, denom);
|
|
481
529
|
}
|
|
482
530
|
},
|
|
531
|
+
/**
|
|
532
|
+
* Update asset info by completely replacing existing entry
|
|
533
|
+
*
|
|
534
|
+
* @param {Denom} denom - Denom on the holding chain
|
|
535
|
+
* @param {DenomDetail} detail - New asset details
|
|
536
|
+
* @throws {Error} If asset not registered or referenced chains not
|
|
537
|
+
* registered
|
|
538
|
+
*/
|
|
539
|
+
updateAsset(denom, detail) {
|
|
540
|
+
const { baseName, brand, chainName } = detail;
|
|
541
|
+
const denomKey = makeDenomKey(denom, chainName);
|
|
542
|
+
if (!denomDetails.has(denomKey)) {
|
|
543
|
+
throw makeError(`Asset ${q(denom)} on ${q(chainName)} not registered`);
|
|
544
|
+
}
|
|
545
|
+
if (!chainInfos.has(chainName)) {
|
|
546
|
+
throw makeError(`Chain ${q(chainName)} not registered`);
|
|
547
|
+
}
|
|
548
|
+
if (!chainInfos.has(baseName)) {
|
|
549
|
+
throw makeError(`Chain ${q(baseName)} not registered`);
|
|
550
|
+
}
|
|
551
|
+
if (brand) {
|
|
552
|
+
if (chainName !== 'agoric') {
|
|
553
|
+
throw makeError('Brands only registerable for agoric-held assets');
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
const oldDetail = denomDetails.get(denomKey);
|
|
558
|
+
if (oldDetail.brand) {
|
|
559
|
+
brandDenoms.delete(oldDetail.brand);
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
denomDetails.set(denomKey, detail);
|
|
563
|
+
if (brand) {
|
|
564
|
+
brandDenoms.init(brand, denom);
|
|
565
|
+
}
|
|
566
|
+
},
|
|
483
567
|
/**
|
|
484
568
|
* Retrieve holding, issuing chain names etc. for a denom.
|
|
485
569
|
*
|
|
@@ -8,8 +8,10 @@ export function provideOrchestration(zcf: ZCF, baggage: Baggage, remotePowers: O
|
|
|
8
8
|
baggage: Baggage;
|
|
9
9
|
chainHub: import("@endo/exo").Guarded<{
|
|
10
10
|
registerChain(name: string, chainInfo: import("../cosmos-api.js").CosmosChainInfo): void;
|
|
11
|
+
updateChain(chainName: string, chainInfo: import("../cosmos-api.js").CosmosChainInfo): void;
|
|
11
12
|
getChainInfo<K extends string>(chainName: K): import("@agoric/vow").Vow<ActualChainInfo<K>>;
|
|
12
13
|
registerConnection(primaryChainId: string, counterpartyChainId: string, connectionInfo: import("../cosmos-api.js").IBCConnectionInfo): void;
|
|
14
|
+
updateConnection(primaryChainId: string, counterpartyChainId: string, connectionInfo: import("../cosmos-api.js").IBCConnectionInfo): void;
|
|
13
15
|
getConnectionInfo(primary: string | {
|
|
14
16
|
chainId: string;
|
|
15
17
|
}, counter: string | {
|
|
@@ -17,6 +19,7 @@ export function provideOrchestration(zcf: ZCF, baggage: Baggage, remotePowers: O
|
|
|
17
19
|
}): import("@agoric/vow").Vow<import("../cosmos-api.js").IBCConnectionInfo>;
|
|
18
20
|
getChainsAndConnection<C1 extends string, C2 extends string>(primaryName: C1, counterName: C2): import("@agoric/vow").Vow<[ActualChainInfo<C1>, ActualChainInfo<C2>, import("../cosmos-api.js").IBCConnectionInfo]>;
|
|
19
21
|
registerAsset(denom: import("../orchestration-api.js").Denom, detail: DenomDetail): void;
|
|
22
|
+
updateAsset(denom: import("../orchestration-api.js").Denom, detail: DenomDetail): void;
|
|
20
23
|
getAsset(denom: import("../orchestration-api.js").Denom, srcChainName: string): DenomDetail | undefined;
|
|
21
24
|
getDenom(brand: Brand): import("../orchestration-api.js").Denom | undefined;
|
|
22
25
|
resolveAccountId(partialId: string): import("../orchestration-api.js").AccountId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-helper.d.ts","sourceRoot":"","sources":["start-helper.js"],"names":[],"mappings":"AAqDO,0CANI,GAAG,WACH,OAAO,gBACP,mBAAmB,cACnB,UAAU;+BAiGR,IAAI
|
|
1
|
+
{"version":3,"file":"start-helper.d.ts","sourceRoot":"","sources":["start-helper.js"],"names":[],"mappings":"AAqDO,0CANI,GAAG,WACH,OAAO,gBACP,mBAAmB,cACnB,UAAU;+BAiGR,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBA1CD,CAAC;;;;;;;;;;;;;;;;;;;;;sBAuHykY,CAAC;;;;;;;;;;;;;;;;;;;;EA5C1lY;AA+BM,kCAfgC,EAAE,SAA3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAE,EAGhC,EAAE,SAFM,mBAAmB,GAAG;IAC/B,UAAU,EAAE,UAAU,CAAC;CACvB,EACQ,CAAC,cACH,CACN,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EACZ,WAAW,EAAE,EAAE,EACf,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,kBAAkB,KACtB,OAAO,CAAC,CAAC,CAAC,SACP,qBAAqB,GACnB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAczE;kCArMU;IACR,UAAU,EAAE,OAAO,UAAU,CAAC,CAAC;IAC/B,oBAAoB,EAAE,OAAO,uBAAuB,CAAC,CAAC;IACtD,WAAW,CAAC,EAAE,OAAO,WAAW,CAAC,CAAC;IAClC,YAAY,EAAE,OAAO,YAAY,CAAC,CAAC;IACnC,WAAW,EAAE,OAAO,OAAO,CAAC,CAAC;CAC9B;;;;;;;;;iCAwJU,IAAI,CAAC,UAAU,CAAC,OAAO,oBAAoB,CAAC,EAAE,MAAM,CAAC;6BAtKzC,kBAAkB;0BAGrB,cAAc;gCALR,gCAAgC;4BAIpC,aAAa;6CAEI,2BAA2B;kCALtC,cAAc;6BAEnB,cAAc"}
|