@smartico/public-api 0.0.386 → 0.0.387
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/README.md +1 -1
- package/dist/Avatars/AvatarCustomizeErrorCode.d.ts +7 -1
- package/dist/Avatars/AvatarCustomizeResponse.d.ts +16 -0
- package/dist/Avatars/index.d.ts +1 -0
- package/dist/Missions/UserAchievementTask.d.ts +4 -0
- package/dist/SmarticoAPI.d.ts +11 -0
- package/dist/WSAPI/WSAPIAvatars.d.ts +103 -0
- package/dist/WSAPI/WSAPITypes.d.ts +6 -2
- package/dist/index.js +260 -78
- package/dist/index.js.map +1 -1
- package/dist/index.modern.mjs +168 -6
- package/dist/index.modern.mjs.map +1 -1
- package/docs/SmarticoObject.md +15 -0
- package/docs/api/README.md +2 -0
- package/docs/api/classes/WSAPIAvatars.md +135 -0
- package/docs/api/classes/WSAPIClans.md +3 -5
- package/docs/api/documents/SmarticoObject.md +15 -0
- package/docs/api/enumerations/AvatarCustomizeErrorCode.md +21 -0
- package/docs/api/enumerations/JoinClanErrorCode.md +16 -17
- package/docs/api/interfaces/AvatarCustomizeResponse.md +31 -0
- package/docs/api/interfaces/TAvatarPrompt.md +2 -2
- package/docs/api/interfaces/TMissionOrBadgeTask.md +16 -0
- package/docs/api/interfaces/UserAchievementTask.md +16 -0
- package/docs/native/PROTOCOL.md +3 -1
- package/docs/ui/avatars/UIGuide_avatarsCustomize.md +69 -0
- package/package.json +1 -1
- package/src/Avatars/AvatarCustomizeErrorCode.ts +7 -5
- package/src/Avatars/AvatarCustomizeResponse.ts +17 -0
- package/src/Avatars/index.ts +1 -0
- package/src/Missions/UserAchievement.ts +2 -0
- package/src/Missions/UserAchievementTask.ts +4 -0
- package/src/SmarticoAPI.ts +53 -0
- package/src/WSAPI/WSAPIAvatars.ts +121 -0
- package/src/WSAPI/WSAPITypes.ts +6 -2
- package/tsconfig.json +3 -1
package/dist/index.modern.mjs
CHANGED
|
@@ -1616,6 +1616,8 @@ const UserAchievementTransform = items => {
|
|
|
1616
1616
|
id: t.task_id,
|
|
1617
1617
|
name: (_t$task_public_meta = t.task_public_meta) == null ? void 0 : _t$task_public_meta.name,
|
|
1618
1618
|
points_reward: t.points_reward,
|
|
1619
|
+
gems_reward: t.gems_reward,
|
|
1620
|
+
diamonds_reward: t.diamonds_reward,
|
|
1619
1621
|
is_completed: t.isCompleted,
|
|
1620
1622
|
progress: t.userProgress,
|
|
1621
1623
|
execution_count_expected: t.executionCount,
|
|
@@ -7531,6 +7533,116 @@ class WSAPIAvatars extends WSAPIMiniGames {
|
|
|
7531
7533
|
err_message: r.errMsg
|
|
7532
7534
|
};
|
|
7533
7535
|
}
|
|
7536
|
+
/**
|
|
7537
|
+
* Generates an AI-customized variant of a base avatar by applying an
|
|
7538
|
+
* operator-defined style prompt, returning the CDN URL of the result.
|
|
7539
|
+
* This is a paid, generate-only step: it does NOT change the user's
|
|
7540
|
+
* active avatar — pass the returned `cdn_url` to {@link setAvatar} to
|
|
7541
|
+
* activate it.
|
|
7542
|
+
*
|
|
7543
|
+
* @remarks
|
|
7544
|
+
* **Preconditions**
|
|
7545
|
+
* - Authenticated session required; not available in visitor mode (throws).
|
|
7546
|
+
* - All five fields are mandatory — the SDK throws synchronously
|
|
7547
|
+
* (`Error("<field> is required")`) if any is missing or zero.
|
|
7548
|
+
* - `prompt_id` must be one of the prompts from {@link getAvatarPrompts};
|
|
7549
|
+
* `avatar_url` / `avatar_real_id` identify the base avatar to style.
|
|
7550
|
+
*
|
|
7551
|
+
* **Cost**
|
|
7552
|
+
* Each generation costs the currency the operator configured on the
|
|
7553
|
+
* chosen prompt (points, gems, or diamonds — some prompts are free; read
|
|
7554
|
+
* `cost_currency_type_id` / `cost_value` from the {@link getAvatarPrompts}
|
|
7555
|
+
* entry to gate the UI before calling). The cost is charged only on
|
|
7556
|
+
* success; if the user can't afford it the call fails with `errCode -1`
|
|
7557
|
+
* and nothing is generated or charged.
|
|
7558
|
+
*
|
|
7559
|
+
* **Latency**
|
|
7560
|
+
* Generation runs server-side AI image synthesis and is synchronous from
|
|
7561
|
+
* the caller's side — expect several seconds (roughly 5–20 s) before the
|
|
7562
|
+
* promise resolves. There is no SDK cache and no push/subscription; show
|
|
7563
|
+
* a loading state for the full duration and disable the trigger to
|
|
7564
|
+
* prevent duplicate submissions.
|
|
7565
|
+
*
|
|
7566
|
+
* **Result & error codes**
|
|
7567
|
+
* On success the result has `cdn_url` set; on failure it has `errCode` /
|
|
7568
|
+
* `errMessage` set and no `cdn_url`. Branch on `errCode` — the generic
|
|
7569
|
+
* message is fixed text, not cause-specific:
|
|
7570
|
+
* - `12001` (`AvatarCustomizeErrorCode.AVATAR_USER_LIMIT`) — the user hit
|
|
7571
|
+
* their monthly per-user generation cap. Nothing is generated or charged.
|
|
7572
|
+
* - `12002` (`AvatarCustomizeErrorCode.AVATAR_LABEL_LIMIT`) — the brand's
|
|
7573
|
+
* shared monthly pool is exhausted. Nothing is generated or charged;
|
|
7574
|
+
* surface a "try again later" message.
|
|
7575
|
+
* - `-1` — generic failure: insufficient balance, an unavailable prompt,
|
|
7576
|
+
* or a generation error. Nothing is charged. Allow the user to retry.
|
|
7577
|
+
*
|
|
7578
|
+
* Both monthly caps are operator-configured and reset at the start of
|
|
7579
|
+
* each calendar month.
|
|
7580
|
+
*
|
|
7581
|
+
* **Side effects (on success)**
|
|
7582
|
+
* The generated variant is persisted to the user's customization history
|
|
7583
|
+
* and counts toward the monthly caps **whether or not** it is later
|
|
7584
|
+
* activated — generation is not reversible. The SDK clears the
|
|
7585
|
+
* {@link getAvatarsCustomized} cache so the next call surfaces the new
|
|
7586
|
+
* variant. The user's active avatar is unchanged until you call
|
|
7587
|
+
* {@link setAvatar} with the returned `cdn_url`.
|
|
7588
|
+
*
|
|
7589
|
+
* **Idempotency**: not idempotent — each successful call generates (and
|
|
7590
|
+
* charges for) a new variant. Guard the call site against double-clicks.
|
|
7591
|
+
*
|
|
7592
|
+
* **UI guidance**: see [UI Guide — `avatarsCustomize`](../../docs/ui/avatars/UIGuide_avatarsCustomize.md).
|
|
7593
|
+
*
|
|
7594
|
+
* **Visitor mode**: not supported (throws).
|
|
7595
|
+
*
|
|
7596
|
+
* @param props.label_id Numeric Smartico label (brand) ID the user belongs to.
|
|
7597
|
+
* @param props.user_id Numeric Smartico user ID.
|
|
7598
|
+
* @param props.prompt_id Style-prompt ID (`prompt_id`) from {@link getAvatarPrompts}.
|
|
7599
|
+
* @param props.avatar_url CDN URL of the base avatar to customize.
|
|
7600
|
+
* @param props.avatar_real_id `avatar_real_id` of the base avatar.
|
|
7601
|
+
* @returns {@link AvatarCustomizeResponse} — `cdn_url` set on success;
|
|
7602
|
+
* `errCode` / `errMessage` set on failure.
|
|
7603
|
+
*
|
|
7604
|
+
* @example
|
|
7605
|
+
* ```ts
|
|
7606
|
+
* // label_id / user_id identify the Smartico user being customized.
|
|
7607
|
+
* const prompts = await window._smartico.api.getAvatarPrompts();
|
|
7608
|
+
* const prompt = prompts[0];
|
|
7609
|
+
*
|
|
7610
|
+
* console.log('[smartico] generating avatar — show a spinner for ~5-20s and disable the Generate button');
|
|
7611
|
+
* const result = await window._smartico.api.avatarsCustomize({
|
|
7612
|
+
* label_id,
|
|
7613
|
+
* user_id,
|
|
7614
|
+
* prompt_id: prompt.prompt_id,
|
|
7615
|
+
* avatar_url: baseAvatar.avatar_url,
|
|
7616
|
+
* avatar_real_id: baseAvatar.avatar_real_id,
|
|
7617
|
+
* });
|
|
7618
|
+
*
|
|
7619
|
+
* if (result.cdn_url) {
|
|
7620
|
+
* console.log('[smartico] generation succeeded — preview this URL, then call setAvatar to apply it:', result.cdn_url);
|
|
7621
|
+
* // await window._smartico.api.setAvatar({ avatar_url: result.cdn_url, avatar_real_id: baseAvatar.avatar_real_id });
|
|
7622
|
+
* } else if (result.errCode === 12001) {
|
|
7623
|
+
* console.error('[smartico] user monthly limit reached — show "you have used all your custom avatars this month"');
|
|
7624
|
+
* } else if (result.errCode === 12002) {
|
|
7625
|
+
* console.error('[smartico] brand monthly pool exhausted — show "custom avatars are unavailable right now, try later"');
|
|
7626
|
+
* } else {
|
|
7627
|
+
* console.error('[smartico] generation failed (e.g. not enough balance) — let the user retry:', result.errMessage);
|
|
7628
|
+
* }
|
|
7629
|
+
* ```
|
|
7630
|
+
*/
|
|
7631
|
+
async avatarsCustomize(props) {
|
|
7632
|
+
const required = ['label_id', 'user_id', 'prompt_id', 'avatar_url', 'avatar_real_id'];
|
|
7633
|
+
for (const field of required) {
|
|
7634
|
+
if (!props[field]) {
|
|
7635
|
+
throw new Error(`${field} is required`);
|
|
7636
|
+
}
|
|
7637
|
+
}
|
|
7638
|
+
const r = await this.api.avatarsCustomize(props);
|
|
7639
|
+
// On success a new variant is persisted server-side — drop the cached
|
|
7640
|
+
// list so the next getAvatarsCustomized() surfaces it.
|
|
7641
|
+
if (r.cdn_url) {
|
|
7642
|
+
OCache.clear(ECacheContext.WSAPI, onUpdateContextKey.AvatarsCustomized);
|
|
7643
|
+
}
|
|
7644
|
+
return r;
|
|
7645
|
+
}
|
|
7534
7646
|
}
|
|
7535
7647
|
|
|
7536
7648
|
/** @group GamePick */
|
|
@@ -9297,7 +9409,7 @@ const AVATAR_DOMAIN = 'https://img{ENV_ID}.smr.vc';
|
|
|
9297
9409
|
const DEFAULT_LANG_EN = 'EN';
|
|
9298
9410
|
class SmarticoAPI {
|
|
9299
9411
|
constructor(label_api_key, brand_api_key, messageSender, options = {}) {
|
|
9300
|
-
var _options$tracker;
|
|
9412
|
+
var _options$tracker, _options$tracker2;
|
|
9301
9413
|
this.label_api_key = void 0;
|
|
9302
9414
|
this.brand_api_key = void 0;
|
|
9303
9415
|
this.messageSender = void 0;
|
|
@@ -9308,6 +9420,7 @@ class SmarticoAPI {
|
|
|
9308
9420
|
this.gamesApiUrl = void 0;
|
|
9309
9421
|
this.baseRgApiParams = void 0;
|
|
9310
9422
|
this.avatarDomain = void 0;
|
|
9423
|
+
this.avatarOriginDomain = void 0;
|
|
9311
9424
|
this.envId = void 0;
|
|
9312
9425
|
this.logger = void 0;
|
|
9313
9426
|
this.logCIDs = void 0;
|
|
@@ -9335,6 +9448,7 @@ class SmarticoAPI {
|
|
|
9335
9448
|
};
|
|
9336
9449
|
}
|
|
9337
9450
|
this.avatarDomain = SmarticoAPI.getAvatarUrl(label_api_key || ((_options$tracker = options.tracker) == null ? void 0 : _options$tracker.label_api_key));
|
|
9451
|
+
this.avatarOriginDomain = SmarticoAPI.getAvatarOriginUrl(label_api_key || ((_options$tracker2 = options.tracker) == null ? void 0 : _options$tracker2.label_api_key));
|
|
9338
9452
|
this.label_api_key = SmarticoAPI.getCleanLabelApiKey(label_api_key);
|
|
9339
9453
|
}
|
|
9340
9454
|
static getEnvDnsSuffix(label_api_key) {
|
|
@@ -9391,6 +9505,9 @@ class SmarticoAPI {
|
|
|
9391
9505
|
const avatarUrl = AVATAR_DOMAIN.replace('{ENV_ID}', SmarticoAPI.getEnvDnsSuffix(label_api_key));
|
|
9392
9506
|
return SmarticoAPI.replaceSmrDomainsWithCloudfront(avatarUrl);
|
|
9393
9507
|
}
|
|
9508
|
+
static getAvatarOriginUrl(label_api_key) {
|
|
9509
|
+
return AVATAR_DOMAIN.replace('{ENV_ID}', SmarticoAPI.getEnvDnsSuffix(label_api_key));
|
|
9510
|
+
}
|
|
9394
9511
|
async send(message, expectCID, force_language) {
|
|
9395
9512
|
if (this.logCIDs.includes(message.cid)) {
|
|
9396
9513
|
this.logger.info('REQ', message);
|
|
@@ -10145,6 +10262,33 @@ class SmarticoAPI {
|
|
|
10145
10262
|
throw new Error(`Failed to call games API: ${method}. ${e.message}`);
|
|
10146
10263
|
}
|
|
10147
10264
|
}
|
|
10265
|
+
async sendAvatarApi({
|
|
10266
|
+
method,
|
|
10267
|
+
body
|
|
10268
|
+
}) {
|
|
10269
|
+
if (!this.tracker) {
|
|
10270
|
+
throw new Error(`Avatar APIs are not available in the visitor mode`);
|
|
10271
|
+
}
|
|
10272
|
+
const url = `${this.avatarOriginDomain}/${method}`;
|
|
10273
|
+
try {
|
|
10274
|
+
const response = await fetch(url, {
|
|
10275
|
+
method: 'POST',
|
|
10276
|
+
headers: {
|
|
10277
|
+
'Accept': 'application/json',
|
|
10278
|
+
'Content-Type': 'application/json'
|
|
10279
|
+
},
|
|
10280
|
+
body: JSON.stringify(body)
|
|
10281
|
+
});
|
|
10282
|
+
const data = await response.json();
|
|
10283
|
+
return SmarticoAPI.replaceSmrDomainsWithCloudfront(data);
|
|
10284
|
+
} catch (e) {
|
|
10285
|
+
this.logger.error(`Failed to call avatar API: ${method}`, {
|
|
10286
|
+
url,
|
|
10287
|
+
error: e.message
|
|
10288
|
+
});
|
|
10289
|
+
throw new Error(`Failed to call avatar API: ${method}. ${e.message}`);
|
|
10290
|
+
}
|
|
10291
|
+
}
|
|
10148
10292
|
async gpGetActiveRounds(saw_template_id) {
|
|
10149
10293
|
const params = {
|
|
10150
10294
|
ext_game_id: saw_template_id
|
|
@@ -10252,6 +10396,21 @@ class SmarticoAPI {
|
|
|
10252
10396
|
});
|
|
10253
10397
|
return await this.send(message, ClassId.CLIENT_SET_AVATAR_RESPONSE);
|
|
10254
10398
|
}
|
|
10399
|
+
async avatarsCustomize(params) {
|
|
10400
|
+
var _this$tracker, _this$tracker2;
|
|
10401
|
+
return this.sendAvatarApi({
|
|
10402
|
+
method: 'avatar-customize',
|
|
10403
|
+
body: {
|
|
10404
|
+
label_id: params.label_id,
|
|
10405
|
+
user_id: params.user_id,
|
|
10406
|
+
user_ext_id: (_this$tracker = this.tracker) == null ? void 0 : _this$tracker.getExtUserId(),
|
|
10407
|
+
brand_key: this.brand_api_key || ((_this$tracker2 = this.tracker) == null || (_this$tracker2 = _this$tracker2.params) == null ? void 0 : _this$tracker2.brand_key),
|
|
10408
|
+
prompt_id: params.prompt_id,
|
|
10409
|
+
avatar_url: params.avatar_url,
|
|
10410
|
+
avatar_real_id: params.avatar_real_id
|
|
10411
|
+
}
|
|
10412
|
+
});
|
|
10413
|
+
}
|
|
10255
10414
|
async avatarsGetListT(user_ext_id) {
|
|
10256
10415
|
var _await$this$avatarsGe;
|
|
10257
10416
|
return avatarDefinitionTransform((_await$this$avatarsGe = (await this.avatarsGetList(user_ext_id)).avatars) != null ? _await$this$avatarsGe : [], this.avatarDomain);
|
|
@@ -10925,15 +11084,18 @@ var JackpotType;
|
|
|
10925
11084
|
JackpotType[JackpotType["Personal"] = 2] = "Personal";
|
|
10926
11085
|
})(JackpotType || (JackpotType = {}));
|
|
10927
11086
|
|
|
11087
|
+
/**
|
|
11088
|
+
* Limit error codes returned in `errCode` by the `avatarsCustomize` method.
|
|
11089
|
+
* See the `avatarsCustomize` TSDoc for the full table (including the generic
|
|
11090
|
+
* `-1` failure, which has no named member here).
|
|
11091
|
+
*/
|
|
10928
11092
|
var AvatarCustomizeErrorCode;
|
|
10929
11093
|
(function (AvatarCustomizeErrorCode) {
|
|
11094
|
+
/** The user has reached the operator-configured per-user monthly cap on custom-avatar generations. */
|
|
10930
11095
|
AvatarCustomizeErrorCode[AvatarCustomizeErrorCode["AVATAR_USER_LIMIT"] = 12001] = "AVATAR_USER_LIMIT";
|
|
11096
|
+
/** The brand's operator-configured shared monthly pool of custom-avatar generations is exhausted. */
|
|
10931
11097
|
AvatarCustomizeErrorCode[AvatarCustomizeErrorCode["AVATAR_LABEL_LIMIT"] = 12002] = "AVATAR_LABEL_LIMIT";
|
|
10932
11098
|
})(AvatarCustomizeErrorCode || (AvatarCustomizeErrorCode = {}));
|
|
10933
|
-
const AvatarCustomizeErrorMessage = {
|
|
10934
|
-
[AvatarCustomizeErrorCode.AVATAR_USER_LIMIT]: 'You have exceeded number of custom avatars creation, please try later',
|
|
10935
|
-
[AvatarCustomizeErrorCode.AVATAR_LABEL_LIMIT]: 'The custom avatars are not available, please try again later'
|
|
10936
|
-
};
|
|
10937
11099
|
|
|
10938
11100
|
/**
|
|
10939
11101
|
* Error codes returned in `errCode` by the `joinClan` method (also carried
|
|
@@ -10969,5 +11131,5 @@ var JoinClanErrorCode;
|
|
|
10969
11131
|
JoinClanErrorCode[JoinClanErrorCode["JOIN_CLAN_JOINED_AFTER_TOURNAMENT_START"] = 1011] = "JOIN_CLAN_JOINED_AFTER_TOURNAMENT_START";
|
|
10970
11132
|
})(JoinClanErrorCode || (JoinClanErrorCode = {}));
|
|
10971
11133
|
|
|
10972
|
-
export { AchCategoryTransform, AchCustomLayoutTheme, AchCustomSectionType, AchMissionsTabsOptions, AchOverviewMissionsFilter, AchievementAvailabilityStatus, AchievementClaimPeriodTypeId, AchievementStatus, AchievementTaskType, AchievementType, ActivityLogTransform, ActivityTypeLimited, AllRoundsGameBoardID, AnalyticsInboxSubScreenNameId, AnalyticsInterfaceType, AnalyticsScreenNameId, AnalyticsTournamentsLobbySubScreenNameId, AttemptPeriodType, AvatarCustomizeErrorCode,
|
|
11134
|
+
export { AchCategoryTransform, AchCustomLayoutTheme, AchCustomSectionType, AchMissionsTabsOptions, AchOverviewMissionsFilter, AchievementAvailabilityStatus, AchievementClaimPeriodTypeId, AchievementStatus, AchievementTaskType, AchievementType, ActivityLogTransform, ActivityTypeLimited, AllRoundsGameBoardID, AnalyticsInboxSubScreenNameId, AnalyticsInterfaceType, AnalyticsScreenNameId, AnalyticsTournamentsLobbySubScreenNameId, AttemptPeriodType, AvatarCustomizeErrorCode, BadgesTimeLimitStates, BonusItemsTransform, BonusStatus, BuyStoreItemErrorCode, ClassId, CookieStore, CoreUtils, ECacheContext, GPRoundStatus, GamePickMarketType, GamePickResolutionType, GamePickScoreType, GamePickSportType, GameRoundOrderType, GetJackpotEligibleGamesResponseTransform, GetJackpotWinnersResponseTransform, GetLevelMapResponseTransform, InboxCategories, InboxMessageBodyTransform, InboxMessageType, InboxMessagesTransform, InboxReadStatus, JackPotTemparature, JackpotContributionType, JackpotType, JoinClanErrorCode, LeaderBoardPeriodType, LiquidEntityData, MiniGamePrizeTypeName, MiniGamePrizeTypeNamed, MissionCategory, MissionUtils, OCache, OpenLinksType, PointChangeSourceType, PrizeModifiers, PrizeModifiersKeysNames, PublicLabelSettings, QuizAnswersValueType, QuizMarketPerSport, QuizSportType, RaffleDrawInstanceState, RaffleDrawTypeExecution, RaffleTicketCapVisualization, SAWAcknowledgeType, SAWAcknowledgeTypeName, SAWAcknowledgeTypeNamed, SAWAskForUsername, SAWBuyInType, SAWBuyInTypeName, SAWBuyInTypeNamed, SAWExposeUserSpinId, SAWExposeUserSpinIdName, SAWExposeUserSpinIdNamed, SAWGPMarketType, SAWGameDifficultyType, SAWGameDifficultyTypeName, SAWGameLayout, SAWGameLayoutName, SAWGameLayoutNamed, SAWGameType, SAWGameTypeName, SAWGameTypeNamed, SAWHistoryTransform, SAWPrizeType, SAWSpinErrorCode, SAWTemplatesTransform, SAWUtils, SAWWheelLayout, SAWWinSoundFiles, SAWWinSoundType, SawGameDifficultyTypeNamed, ScheduledMissionType, SmarticoAPI, StoreCategoryTransform, StoreItemPurchaseType, StoreItemPurchasedTransform, StoreItemTransform, StoreItemType, StoreItemTypeName, StoreItemTypeNamed, TournamentInstanceStatus, TournamentInstanceStatusName, TournamentItemsTransform, TournamentRegistrationError, TournamentRegistrationStatus, TournamentRegistrationStatusName, TournamentRegistrationStatusNamed, TournamentRegistrationType, TournamentRegistrationTypeGetName, TournamentType, TournamentUtils, TranslationArea, UICustomSectionTransform, UserAchievementTransform, UserBalanceType, WSAPI, avatarCustomizedTransform, avatarDefinitionTransform, avatarPromptTransform, clanTournamentPlayersTransform, drawRunHistoryTransform, drawRunTransform, drawTransform, enrichUserAchievementsWithBadgeState, getLeaderBoardTransform, marketsInfo, prizeTransform, quizAnswerAwayTeamReplacementText, quizAnswerHomeTeamReplacementText, quizAnswersTrKeys, quizDrawReplacementText, quizEvenReplacementText, quizNoGoalsReplacementText, quizNoReplacementText, quizOddReplacementText, quizOrReplacementText, quizSupportedSports, quizYesReplacementText, raffleClaimPrizeResponseTransform, raffleTransform, ticketsTransform, tournamentInfoItemTransform, winnersTransform };
|
|
10973
11135
|
//# sourceMappingURL=index.modern.mjs.map
|