bc-deeplib 1.1.3 → 1.2.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/dist/deeplib.js CHANGED
@@ -361,6 +361,12 @@ var BaseSubscreen = class _BaseSubscreen {
361
361
  get currentPage() {
362
362
  return this.pageStructure[Math.min(_BaseSubscreen.currentPage - 1, this.pageStructure.length - 1)];
363
363
  }
364
+ getPageLabel() {
365
+ return CommonStringPartitionReplace(getText("settings.page.label"), {
366
+ $currentPage$: `${_BaseSubscreen.currentPage}`,
367
+ $totalPages$: `${this.pageStructure.length}`
368
+ }).join("");
369
+ }
364
370
  /**
365
371
  * Changes the visible page in a multi-page subscreen.
366
372
  * Automatically wraps around when going past the first or last page.
@@ -371,7 +377,7 @@ var BaseSubscreen = class _BaseSubscreen {
371
377
  if (page < 1) page = totalPages;
372
378
  _BaseSubscreen.currentPage = page;
373
379
  this.managePageElementsVisibility();
374
- setLabel(`${_BaseSubscreen.currentPage} of ${this.pageStructure.length}`);
380
+ setLabel(this.getPageLabel());
375
381
  }
376
382
  /**
377
383
  * Updates the DOM to show only elements belonging to the current page.
@@ -419,7 +425,7 @@ var BaseSubscreen = class _BaseSubscreen {
419
425
  initialNextTooltip: getText("settings.button.next_button_hint"),
420
426
  back: /* @__PURE__ */ __name(({ setLabel }) => this.changePage(_BaseSubscreen.currentPage - 1, setLabel), "back"),
421
427
  initialPrevTooltip: getText("settings.button.prev_button_hint"),
422
- initialLabel: `${_BaseSubscreen.currentPage} of ${this.pageStructure.length}`
428
+ initialLabel: this.getPageLabel()
423
429
  });
424
430
  ElementMenu.PrependItem(menu, backNext);
425
431
  }
@@ -432,11 +438,13 @@ var BaseSubscreen = class _BaseSubscreen {
432
438
  const exitButton = advElement.createButton({
433
439
  id: "deeplib-exit",
434
440
  size: [90, 90],
435
- image: `${PUBLIC_URL}/dl_images/exit.svg`,
436
441
  onClick: /* @__PURE__ */ __name(() => {
437
442
  this.exit();
438
443
  }, "onClick"),
439
- tooltip: getText("settings.button.back_button_hint")
444
+ options: {
445
+ image: `${PUBLIC_URL}/dl_images/exit.svg`,
446
+ tooltip: getText("settings.button.back_button_hint")
447
+ }
440
448
  });
441
449
  ElementMenu.AppendButton(menu, exitButton);
442
450
  }
@@ -519,9 +527,10 @@ var BaseSubscreen = class _BaseSubscreen {
519
527
  ElementSetPosition(advElement.getTooltip() || "", 250, 850);
520
528
  ElementSetSize(advElement.getTooltip() || "", 1500, 70);
521
529
  _BaseSubscreen.currentElements.forEach((item) => {
530
+ const element = item[0];
522
531
  const options = item[1];
523
- domUtil.autoSetPosition(options.id, options.position);
524
- domUtil.autoSetSize(options.id, options.size);
532
+ domUtil.autoSetPosition(options.id ?? element.id, options.position);
533
+ domUtil.autoSetSize(options.id ?? element.id, options.size);
525
534
  });
526
535
  if (settingsDiv) {
527
536
  if (domUtil.hasOverflow(settingsDiv)?.vertical) {
@@ -548,6 +557,7 @@ var styles_default = `.deeplib-subscreen,
548
557
  --deeplib-background-color: var(--tmd-main, white);
549
558
  --deeplib-element-color: var(--tmd-element, white);
550
559
  --deeplib-element-hover-color: var(--tmd-element-hover, cyan);
560
+ --deeplib-accent-color: var(--tmd-accent, #FFFF88);
551
561
  --deeplib-blocked-color: var(--tmd-blocked, red);
552
562
  --deeplib-text-color: var(--tmd-text, black);
553
563
  --deeplib-icon-color: var(--tmd-accent, black);
@@ -690,6 +700,25 @@ var styles_default = `.deeplib-subscreen,
690
700
  gap: min(2dvh, 1dvw);
691
701
  }
692
702
 
703
+ #deeplib-storage-meter {
704
+ position: absolute;
705
+ top: 0px;
706
+ left: 0px;
707
+ width: 100%;
708
+ height: 100%;
709
+ overflow: hidden;
710
+ background-color: var(--deeplib-element-color);
711
+ border: var(--deeplib-border-width) solid var(--deeplib-border-color);
712
+ border-radius: var(--deeplib-border-radius);
713
+ z-index: -1;
714
+ }
715
+
716
+ #deeplib-storage-bar {
717
+ height: 100%;
718
+ width: 0%;
719
+ background: var(--deeplib-accent-color);
720
+ }
721
+
693
722
  .deeplib-checkbox-container {
694
723
  display: flex;
695
724
  flex-direction: row;
@@ -829,6 +858,12 @@ input[type=number] {
829
858
  .deeplib-modal .deeplib-modal-button-container .deeplib-button .button-label {
830
859
  display: contents;
831
860
  }
861
+ .deeplib-modal .deeplib-modal-prompt-container {
862
+ display: flex;
863
+ flex-direction: column;
864
+ justify-content: center;
865
+ align-items: center;
866
+ }
832
867
 
833
868
  .deeplib-modal-blocker {
834
869
  z-index: 1000;
@@ -839,12 +874,13 @@ input[type=number] {
839
874
  height: 100dvh;
840
875
  background-color: rgba(0, 0, 0, 0.5);
841
876
  }
842
- /*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL21lZGlhL05WTUUvU3R1ZmYvQ29kZS9CQy9CQy1EZWVwTGliL3NyYy9zdHlsZXMiLCJzb3VyY2VzIjpbInZhcnMuc2NzcyIsImJ1dHRvbnMuc2NzcyIsImVsZW1lbnRzLnNjc3MiLCJpbnB1dHMuc2NzcyIsIm1lc3NhZ2VzLnNjc3MiLCJtb2RhbC5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQ2JGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtBQUFBO0VBRUU7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUVBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7OztBQzNDRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBOzs7QUFHRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQU1FO0VBQ0E7O0FBTkE7RUFDRTtFQUNBOztBQU9KO0VBQ0U7OztBQUlKO0VBQ0U7RUFDQTtFQUNBOzs7QUN0RkY7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQzdERjtFQUNFO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtBQUFBO0VBRUU7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUM3QkY7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFOzs7QUFNUjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBIiwic291cmNlc0NvbnRlbnQiOlsiLmRlZXBsaWItc3Vic2NyZWVuLFxuLmRlZXBsaWItbW9kYWwge1xuICAtLWRlZXBsaWItYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdG1kLW1haW4sIHdoaXRlKTtcbiAgLS1kZWVwbGliLWVsZW1lbnQtY29sb3I6IHZhcigtLXRtZC1lbGVtZW50LCB3aGl0ZSk7XG4gIC0tZGVlcGxpYi1lbGVtZW50LWhvdmVyLWNvbG9yOiB2YXIoLS10bWQtZWxlbWVudC1ob3ZlciwgY3lhbik7XG4gIC0tZGVlcGxpYi1ibG9ja2VkLWNvbG9yOiB2YXIoLS10bWQtYmxvY2tlZCwgcmVkKTtcbiAgLS1kZWVwbGliLXRleHQtY29sb3I6IHZhcigtLXRtZC10ZXh0LCBibGFjayk7XG4gIC0tZGVlcGxpYi1pY29uLWNvbG9yOiB2YXIoLS10bWQtYWNjZW50LCBibGFjayk7XG4gIC0tZGVlcGxpYi1pY29uLWhvdmVyLWNvbG9yOiB2YXIoLS10bWQtYWNjZW50LWhvdmVyLCBibGFjayk7XG4gIC0tZGVlcGxpYi1ib3JkZXItY29sb3I6IHZhcigtLXRtZC1hY2NlbnQsIGJsYWNrKTtcbiAgLS1kZWVwbGliLWJvcmRlci13aWR0aDogbWluKDAuMnZoLCAwLjF2dyk7XG4gIC0tZGVlcGxpYi1ib3JkZXItd2lkdGg6IG1pbigwLjJkdmgsIDAuMWR2dyk7XG4gIC0tZGVlcGxpYi1ib3JkZXItcmFkaXVzOiBtaW4oMXZoLCAwLjV2dyk7XG4gIC0tZGVlcGxpYi1ib3JkZXItcmFkaXVzOiBtaW4oMWR2aCwgMC41ZHZ3KTtcbn1cbiIsIi5kZWVwbGliLWJ1dHRvbiB7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG4uZGVlcGxpYi1idXR0b24uYnV0dG9uLXN0eWxpbmcsXG4uZGVlcGxpYi1idXR0b24uYnV0dG9uLXN0eWxpbmc6OmJlZm9yZSB7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG59XG5cbi5kZWVwbGliLWJ1dHRvbiBpbWcge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMCU7XG4gIGxlZnQ6IDAlO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWljb24tY29sb3IpO1xuICBiYWNrZ3JvdW5kLWJsZW5kLW1vZGU6IG11bHRpcGx5O1xuICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XG4gIG1hc2stcG9zaXRpb246IGxlZnQ7XG4gIG1hc2stc2l6ZTogY29udGFpbjtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgY29sb3I6IHRyYW5zcGFyZW50O1xuXG4gIGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLWltYWdlKTtcbiAgbWFzay1pbWFnZTogdmFyKC0taW1hZ2UpO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmRlZXBsaWItYnV0dG9uOmhvdmVyIGltZyB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRlZXBsaWItaWNvbi1ob3Zlci1jb2xvcik7XG59XG5cbi5kZWVwbGliLWJ1dHRvbiAuYnV0dG9uLWxhYmVsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG4gIGZvbnQtc2l6ZTogbWluKDMuNmR2aCwgMS44ZHZ3KTtcbn1cblxuLmRlZXBsaWItYnV0dG9uIC5idXR0b24tdG9vbHRpcCB7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG59XG4iLCIjZGVlcGxpYi1wYWdlLWxhYmVsIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbiNkZWVwbGliLXN1YnNjcmVlbi10aXRsZSB7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xufVxuXG4uZGVlcGxpYi10ZXh0IHtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG59XG5cbi5kZWVwbGliLXN1YnNjcmVlbiB7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5kZWVwbGliLXN1YnNjcmVlbiAqIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgcG9pbnRlci1ldmVudHM6IGFsbDtcbn1cblxuLmRlZXBsaWItc2V0dGluZ3Mge1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLWF1dG8tcm93czogbWluLWNvbnRlbnQ7XG4gIHBhZGRpbmc6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gIGdhcDogMC4zZW07XG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcbn1cblxuLmRlZXBsaWItbWlzYyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgZ2FwOiBtaW4oMXZoLCAwLjV2dyk7XG59XG5cbi5kZWVwbGliLXRvb2x0aXAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWVsZW1lbnQtY29sb3IpO1xuICBjb2xvcjogdmFyKC0tZGVlcGxpYi10ZXh0LWNvbG9yKTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gIHBhZGRpbmc6IG1pbigxdmgsIDAuNXZ3KTtcbiAgZm9udC1zaXplOiAwLjhlbTtcbiAgYm9yZGVyOiBtaW4oMC4ydmgsIDAuMXZ3KSBzb2xpZCB2YXIoLS1kZWVwbGliLWJvcmRlci1jb2xvcik7XG59XG5cbi5kZWVwbGliLW92ZXJmbG93LWJveCB7XG4gIGJvcmRlcjogdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpIHNvbGlkIHZhcigtLWRlZXBsaWItYm9yZGVyLXdpZHRoKTtcbn1cblxuLmRlZXBsaWItcHJldi1uZXh0IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBnYXA6IG1pbigyZHZoLCAxZHZ3KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yKTtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gIGJvcmRlcjogbWluKDAuMnZoLCAwLjF2dykgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuXG4gIC5kZWVwbGliLXByZXYtbmV4dC1idXR0b24ge1xuICAgICY6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWhvdmVyLWNvbG9yKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWRlZXBsaWItYm9yZGVyLXJhZGl1cyk7XG4gICAgfVxuICAgIFxuICAgIGhlaWdodDogMTAwJTtcbiAgICBhc3BlY3QtcmF0aW86IDE7XG4gIH1cblxuICAuZGVlcGxpYi1wcmV2LW5leHQtbGFiZWwge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIH1cbn1cblxuI2RlZXBsaWItbmF2LW1lbnUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBnYXA6IG1pbigyZHZoLCAxZHZ3KTtcbn0iLCIuZGVlcGxpYi1jaGVja2JveC1jb250YWluZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDAuM2VtO1xufVxuXG4uZGVlcGxpYi1jaGVja2JveC1jb250YWluZXIgaW5wdXQuZGVlcGxpYi1pbnB1dCB7XG4gIHdpZHRoOiBtaW4oNXZoLCAyLjV2dyk7XG4gIGhlaWdodDogbWluKDV2aCwgMi41dncpO1xuICBib3JkZXItcmFkaXVzOiBtaW4oMS4wZHZoLCAwLjVkdncpO1xufVxuXG4uZGVlcGxpYi1jaGVja2JveC1jb250YWluZXIgaW5wdXQuZGVlcGxpYi1pbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Y2hlY2tlZDo6YmVmb3JlIHtcbiAgd2lkdGg6IDgwJTtcbiAgaGVpZ2h0OiA4MCU7XG59XG5cbi5kZWVwbGliLWlucHV0LWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMC4zZW07XG59XG5cbi5kZWVwbGliLWlucHV0LWNvbnRhaW5lcjpoYXMobGFiZWwuZGVlcGxpYi10ZXh0KSB7XG4gIG1hcmdpbi10b3A6IG1pbigxdmgsIDAuNXZ3KTtcbn1cblxuLmRlZXBsaWItaW5wdXQtY29udGFpbmVyIGlucHV0LmRlZXBsaWItaW5wdXQge1xuICBmb250LXNpemU6IDAuNmVtO1xuICBwYWRkaW5nOiA1cHggMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIG91dGxpbmU6IG5vbmU7XG4gIHBhZGRpbmctbGVmdDogbWluKDF2aCwgMC41dncpO1xuICBwYWRkaW5nLXJpZ2h0OiBtaW4oMXZoLCAwLjV2dyk7XG4gIG1pbi1oZWlnaHQ6IG1pbig1ZHZoLCAyLjVkdncpO1xuICBib3JkZXItcmFkaXVzOiBtaW4oMS4wZHZoLCAwLjVkdncpO1xufVxuXG5cbi5kZWVwbGliLWlucHV0LWNvbnRhaW5lciBpbnB1dC5kZWVwbGliLWlucHV0W3R5cGU9XCJjb2xvclwiXSB7XG4gIHBhZGRpbmc6IDBweDtcbiAgd2lkdGg6IG1pbig1dmgsIDIuNXZ3KTtcbiAgaGVpZ2h0OiBtaW4oNXZoLCAyLjV2dyk7XG4gIGJvcmRlci1yYWRpdXM6IDBweDtcbn1cblxuLmRlZXBsaWItaW5wdXQtY29udGFpbmVyIGlucHV0LmRlZXBsaWItaW5wdXRbdHlwZT1cImNvbG9yXCJdOmRpc2FibGVkIHtcbiAgYm9yZGVyOiB2YXIoLS1kZWVwbGliLWJsb2NrZWQtY29sb3IpIHNvbGlkIHZhcigtLWRlZXBsaWItYm9yZGVyLXdpZHRoKTtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuaW5wdXQ6Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24sXG5pbnB1dDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgbWFyZ2luOiAwO1xufVxuXG5pbnB1dFt0eXBlPW51bWJlcl0ge1xuICBhcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7XG4gIC1tb3otYXBwZWFyYW5jZTogdGV4dGZpZWxkO1xufVxuIiwiLmRlZXBsaWItaGlnaGxpZ2h0LXRleHQge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgY29sb3I6IHJnYigyMDMsIDE4NSwgMjMpO1xufVxuXG4jVGV4dEFyZWFDaGF0TG9nW2RhdGEtY29sb3J0aGVtZT0nZGFyayddIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2UsXG4jVGV4dEFyZWFDaGF0TG9nW2RhdGEtY29sb3J0aGVtZT0nZGFyazInXSBkaXYuQ2hhdE1lc3NhZ2UuZGVlcGxpYi1tZXNzYWdlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yKTtcbiAgYm9yZGVyOiBtaW4oMC4yZHZoLCAwLjFkdncpIHNvbGlkIHZhcigtLWRlZXBsaWItYm9yZGVyLWNvbG9yKTtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG59XG5cbiNUZXh0QXJlYUNoYXRMb2cgZGl2LkNoYXRNZXNzYWdlLmRlZXBsaWItbWVzc2FnZSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG4gIGJvcmRlcjogbWluKDAuMmR2aCwgMC4xZHZ3KSBzb2xpZCAjNDQwMTcxO1xuICBjb2xvcjogIzExMTtcbiAgcGFkZGluZy1sZWZ0OiBtaW4oMC42ZHZoLCAwLjNkdncpO1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbn1cblxuI1RleHRBcmVhQ2hhdExvZ1tkYXRhLWNvbG9ydGhlbWU9J2RhcmsnXSBkaXYuQ2hhdE1lc3NhZ2UuZGVlcGxpYi1tZXNzYWdlIGEsXG4jVGV4dEFyZWFDaGF0TG9nW2RhdGEtY29sb3J0aGVtZT0nZGFyazInXSBkaXYuQ2hhdE1lc3NhZ2UuZGVlcGxpYi1tZXNzYWdlIGEge1xuICBjb2xvcjogdmFyKC0tZGVlcGxpYi10ZXh0LWNvbG9yKTtcbn1cblxuI1RleHRBcmVhQ2hhdExvZyBkaXYuQ2hhdE1lc3NhZ2UuZGVlcGxpYi1tZXNzYWdlIGEge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogIzExMTtcbn1cbiIsIi5kZWVwbGliLW1vZGFsIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IDEwJTtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gIHotaW5kZXg6IDEwMDE7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDAuNWVtO1xuICB3aWR0aDogbWF4KDUwZHZ3LCAyNWR2aCk7XG4gIGZvbnQtc2l6ZTogbWluKDRkdmgsIDJkdncpO1xuICBwYWRkaW5nOiBtaW4oMmR2aCwgMWR2dyk7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRlZXBsaWItZWxlbWVudC1jb2xvcik7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjJkdmgsIDAuNmR2dyk7XG4gIGJvcmRlcjogbWluKDAuMmR2aCwgMC4xZHZ3KSBzb2xpZCB2YXIoLS1kZWVwbGliLWJvcmRlci1jb2xvcik7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xuXG4gIC5kZWVwbGliLW1vZGFsLWlucHV0IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBmb250LXNpemU6IG1pbigyLjZkdmgsIDEuOGR2dyk7XG4gICAgYm9yZGVyLXJhZGl1czogbWluKDEuMGR2aCwgMC41ZHZ3KTtcbiAgICBwYWRkaW5nOiBtaW4oMWR2aCwgMC41ZHZ3KTtcbiAgfVxuXG4gIGlucHV0LmRlZXBsaWItbW9kYWwtaW5wdXQge1xuICAgIG1heC13aWR0aDogbWF4KDUwZHZoLCAyNWR2dyk7XG4gIH1cblxuICAuZGVlcGxpYi1tb2RhbC1idXR0b24tY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgICBnYXA6IDAuNWVtO1xuICAgIHdpZHRoOiAxMDAlO1xuXG4gICAgLmRlZXBsaWItYnV0dG9uIHtcbiAgICAgIGZvbnQtc2l6ZTogMC44ZW07XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgd2lkdGg6IGF1dG87XG4gICAgICBwYWRkaW5nOiBtaW4oMC40dmgsIDAuMnZ3KSBtaW4oMnZoLCAxdncpO1xuXG4gICAgICAuYnV0dG9uLWxhYmVsIHtcbiAgICAgICAgZGlzcGxheTogY29udGVudHM7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi5kZWVwbGliLW1vZGFsLWJsb2NrZXIge1xuICB6LWluZGV4OiAxMDAwO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMGR2dztcbiAgaGVpZ2h0OiAxMDBkdmg7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTtcbn1cbiJdfQ== */`;
877
+ /*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL21lZGlhL05WTUUvU3R1ZmYvQ29kZS9CQy9CQy1EZWVwTGliL3NyYy9zdHlsZXMiLCJzb3VyY2VzIjpbInZhcnMuc2NzcyIsImJ1dHRvbnMuc2NzcyIsImVsZW1lbnRzLnNjc3MiLCJpbnB1dHMuc2NzcyIsIm1lc3NhZ2VzLnNjc3MiLCJtb2RhbC5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FDZEY7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQTtFQUNBOzs7QUFHRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FDM0NGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBTUU7RUFDQTs7QUFOQTtFQUNFO0VBQ0E7O0FBT0o7RUFDRTs7O0FBSUo7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUN6R0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQzdERjtFQUNFO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtBQUFBO0VBRUU7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUM3QkY7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFOztBQUtOO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUlKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyIuZGVlcGxpYi1zdWJzY3JlZW4sXG4uZGVlcGxpYi1tb2RhbCB7XG4gIC0tZGVlcGxpYi1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10bWQtbWFpbiwgd2hpdGUpO1xuICAtLWRlZXBsaWItZWxlbWVudC1jb2xvcjogdmFyKC0tdG1kLWVsZW1lbnQsIHdoaXRlKTtcbiAgLS1kZWVwbGliLWVsZW1lbnQtaG92ZXItY29sb3I6IHZhcigtLXRtZC1lbGVtZW50LWhvdmVyLCBjeWFuKTtcbiAgLS1kZWVwbGliLWFjY2VudC1jb2xvcjogdmFyKC0tdG1kLWFjY2VudCwgI0ZGRkY4OCk7XG4gIC0tZGVlcGxpYi1ibG9ja2VkLWNvbG9yOiB2YXIoLS10bWQtYmxvY2tlZCwgcmVkKTtcbiAgLS1kZWVwbGliLXRleHQtY29sb3I6IHZhcigtLXRtZC10ZXh0LCBibGFjayk7XG4gIC0tZGVlcGxpYi1pY29uLWNvbG9yOiB2YXIoLS10bWQtYWNjZW50LCBibGFjayk7XG4gIC0tZGVlcGxpYi1pY29uLWhvdmVyLWNvbG9yOiB2YXIoLS10bWQtYWNjZW50LWhvdmVyLCBibGFjayk7XG4gIC0tZGVlcGxpYi1ib3JkZXItY29sb3I6IHZhcigtLXRtZC1hY2NlbnQsIGJsYWNrKTtcbiAgLS1kZWVwbGliLWJvcmRlci13aWR0aDogbWluKDAuMnZoLCAwLjF2dyk7XG4gIC0tZGVlcGxpYi1ib3JkZXItd2lkdGg6IG1pbigwLjJkdmgsIDAuMWR2dyk7XG4gIC0tZGVlcGxpYi1ib3JkZXItcmFkaXVzOiBtaW4oMXZoLCAwLjV2dyk7XG4gIC0tZGVlcGxpYi1ib3JkZXItcmFkaXVzOiBtaW4oMWR2aCwgMC41ZHZ3KTtcbn1cbiIsIi5kZWVwbGliLWJ1dHRvbiB7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG4uZGVlcGxpYi1idXR0b24uYnV0dG9uLXN0eWxpbmcsXG4uZGVlcGxpYi1idXR0b24uYnV0dG9uLXN0eWxpbmc6OmJlZm9yZSB7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG59XG5cbi5kZWVwbGliLWJ1dHRvbiBpbWcge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMCU7XG4gIGxlZnQ6IDAlO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWljb24tY29sb3IpO1xuICBiYWNrZ3JvdW5kLWJsZW5kLW1vZGU6IG11bHRpcGx5O1xuICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XG4gIG1hc2stcG9zaXRpb246IGxlZnQ7XG4gIG1hc2stc2l6ZTogY29udGFpbjtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgY29sb3I6IHRyYW5zcGFyZW50O1xuXG4gIGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLWltYWdlKTtcbiAgbWFzay1pbWFnZTogdmFyKC0taW1hZ2UpO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmRlZXBsaWItYnV0dG9uOmhvdmVyIGltZyB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRlZXBsaWItaWNvbi1ob3Zlci1jb2xvcik7XG59XG5cbi5kZWVwbGliLWJ1dHRvbiAuYnV0dG9uLWxhYmVsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG4gIGZvbnQtc2l6ZTogbWluKDMuNmR2aCwgMS44ZHZ3KTtcbn1cblxuLmRlZXBsaWItYnV0dG9uIC5idXR0b24tdG9vbHRpcCB7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG59XG4iLCIjZGVlcGxpYi1wYWdlLWxhYmVsIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbiNkZWVwbGliLXN1YnNjcmVlbi10aXRsZSB7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xufVxuXG4uZGVlcGxpYi10ZXh0IHtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG59XG5cbi5kZWVwbGliLXN1YnNjcmVlbiB7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5kZWVwbGliLXN1YnNjcmVlbiAqIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgcG9pbnRlci1ldmVudHM6IGFsbDtcbn1cblxuLmRlZXBsaWItc2V0dGluZ3Mge1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLWF1dG8tcm93czogbWluLWNvbnRlbnQ7XG4gIHBhZGRpbmc6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gIGdhcDogMC4zZW07XG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcbn1cblxuLmRlZXBsaWItbWlzYyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgZ2FwOiBtaW4oMXZoLCAwLjV2dyk7XG59XG5cbi5kZWVwbGliLXRvb2x0aXAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWVsZW1lbnQtY29sb3IpO1xuICBjb2xvcjogdmFyKC0tZGVlcGxpYi10ZXh0LWNvbG9yKTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gIHBhZGRpbmc6IG1pbigxdmgsIDAuNXZ3KTtcbiAgZm9udC1zaXplOiAwLjhlbTtcbiAgYm9yZGVyOiBtaW4oMC4ydmgsIDAuMXZ3KSBzb2xpZCB2YXIoLS1kZWVwbGliLWJvcmRlci1jb2xvcik7XG59XG5cbi5kZWVwbGliLW92ZXJmbG93LWJveCB7XG4gIGJvcmRlcjogdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpIHNvbGlkIHZhcigtLWRlZXBsaWItYm9yZGVyLXdpZHRoKTtcbn1cblxuLmRlZXBsaWItcHJldi1uZXh0IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBnYXA6IG1pbigyZHZoLCAxZHZ3KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yKTtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gIGJvcmRlcjogbWluKDAuMnZoLCAwLjF2dykgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuXG4gIC5kZWVwbGliLXByZXYtbmV4dC1idXR0b24ge1xuICAgICY6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWhvdmVyLWNvbG9yKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWRlZXBsaWItYm9yZGVyLXJhZGl1cyk7XG4gICAgfVxuICAgIFxuICAgIGhlaWdodDogMTAwJTtcbiAgICBhc3BlY3QtcmF0aW86IDE7XG4gIH1cblxuICAuZGVlcGxpYi1wcmV2LW5leHQtbGFiZWwge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIH1cbn1cblxuI2RlZXBsaWItbmF2LW1lbnUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBnYXA6IG1pbigyZHZoLCAxZHZ3KTtcbn1cblxuI2RlZXBsaWItc3RvcmFnZS1tZXRlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwcHg7XG4gIGxlZnQ6IDBweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yKTtcbiAgYm9yZGVyOiB2YXIoLS1kZWVwbGliLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1kZWVwbGliLWJvcmRlci1yYWRpdXMpO1xuICB6LWluZGV4OiAtMTtcbn1cblxuI2RlZXBsaWItc3RvcmFnZS1iYXIge1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAwJTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZGVlcGxpYi1hY2NlbnQtY29sb3IpO1xufVxuIiwiLmRlZXBsaWItY2hlY2tib3gtY29udGFpbmVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAwLjNlbTtcbn1cblxuLmRlZXBsaWItY2hlY2tib3gtY29udGFpbmVyIGlucHV0LmRlZXBsaWItaW5wdXQge1xuICB3aWR0aDogbWluKDV2aCwgMi41dncpO1xuICBoZWlnaHQ6IG1pbig1dmgsIDIuNXZ3KTtcbiAgYm9yZGVyLXJhZGl1czogbWluKDEuMGR2aCwgMC41ZHZ3KTtcbn1cblxuLmRlZXBsaWItY2hlY2tib3gtY29udGFpbmVyIGlucHV0LmRlZXBsaWItaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQ6OmJlZm9yZSB7XG4gIHdpZHRoOiA4MCU7XG4gIGhlaWdodDogODAlO1xufVxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDAuM2VtO1xufVxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXI6aGFzKGxhYmVsLmRlZXBsaWItdGV4dCkge1xuICBtYXJnaW4tdG9wOiBtaW4oMXZoLCAwLjV2dyk7XG59XG5cbi5kZWVwbGliLWlucHV0LWNvbnRhaW5lciBpbnB1dC5kZWVwbGliLWlucHV0IHtcbiAgZm9udC1zaXplOiAwLjZlbTtcbiAgcGFkZGluZzogNXB4IDA7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBvdXRsaW5lOiBub25lO1xuICBwYWRkaW5nLWxlZnQ6IG1pbigxdmgsIDAuNXZ3KTtcbiAgcGFkZGluZy1yaWdodDogbWluKDF2aCwgMC41dncpO1xuICBtaW4taGVpZ2h0OiBtaW4oNWR2aCwgMi41ZHZ3KTtcbiAgYm9yZGVyLXJhZGl1czogbWluKDEuMGR2aCwgMC41ZHZ3KTtcbn1cblxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXIgaW5wdXQuZGVlcGxpYi1pbnB1dFt0eXBlPVwiY29sb3JcIl0ge1xuICBwYWRkaW5nOiAwcHg7XG4gIHdpZHRoOiBtaW4oNXZoLCAyLjV2dyk7XG4gIGhlaWdodDogbWluKDV2aCwgMi41dncpO1xuICBib3JkZXItcmFkaXVzOiAwcHg7XG59XG5cbi5kZWVwbGliLWlucHV0LWNvbnRhaW5lciBpbnB1dC5kZWVwbGliLWlucHV0W3R5cGU9XCJjb2xvclwiXTpkaXNhYmxlZCB7XG4gIGJvcmRlcjogdmFyKC0tZGVlcGxpYi1ibG9ja2VkLWNvbG9yKSBzb2xpZCB2YXIoLS1kZWVwbGliLWJvcmRlci13aWR0aCk7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbmlucHV0Ojotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLFxuaW5wdXQ6Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gIG1hcmdpbjogMDtcbn1cblxuaW5wdXRbdHlwZT1udW1iZXJdIHtcbiAgYXBwZWFyYW5jZTogdGV4dGZpZWxkO1xuICAtbW96LWFwcGVhcmFuY2U6IHRleHRmaWVsZDtcbn1cbiIsIi5kZWVwbGliLWhpZ2hsaWdodC10ZXh0IHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiByZ2IoMjAzLCAxODUsIDIzKTtcbn1cblxuI1RleHRBcmVhQ2hhdExvZ1tkYXRhLWNvbG9ydGhlbWU9J2RhcmsnXSBkaXYuQ2hhdE1lc3NhZ2UuZGVlcGxpYi1tZXNzYWdlLFxuI1RleHRBcmVhQ2hhdExvZ1tkYXRhLWNvbG9ydGhlbWU9J2RhcmsyJ10gZGl2LkNoYXRNZXNzYWdlLmRlZXBsaWItbWVzc2FnZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRlZXBsaWItZWxlbWVudC1jb2xvcik7XG4gIGJvcmRlcjogbWluKDAuMmR2aCwgMC4xZHZ3KSBzb2xpZCB2YXIoLS1kZWVwbGliLWJvcmRlci1jb2xvcik7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xufVxuXG4jVGV4dEFyZWFDaGF0TG9nIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2Uge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xuICBib3JkZXI6IG1pbigwLjJkdmgsIDAuMWR2dykgc29saWQgIzQ0MDE3MTtcbiAgY29sb3I6ICMxMTE7XG4gIHBhZGRpbmctbGVmdDogbWluKDAuNmR2aCwgMC4zZHZ3KTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG59XG5cbiNUZXh0QXJlYUNoYXRMb2dbZGF0YS1jb2xvcnRoZW1lPSdkYXJrJ10gZGl2LkNoYXRNZXNzYWdlLmRlZXBsaWItbWVzc2FnZSBhLFxuI1RleHRBcmVhQ2hhdExvZ1tkYXRhLWNvbG9ydGhlbWU9J2RhcmsyJ10gZGl2LkNoYXRNZXNzYWdlLmRlZXBsaWItbWVzc2FnZSBhIHtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG59XG5cbiNUZXh0QXJlYUNoYXRMb2cgZGl2LkNoYXRNZXNzYWdlLmRlZXBsaWItbWVzc2FnZSBhIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgY29sb3I6ICMxMTE7XG59XG4iLCIuZGVlcGxpYi1tb2RhbCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAxMCU7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICB6LWluZGV4OiAxMDAxO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAwLjVlbTtcbiAgd2lkdGg6IG1heCg1MGR2dywgMjVkdmgpO1xuICBmb250LXNpemU6IG1pbig0ZHZoLCAyZHZ3KTtcbiAgcGFkZGluZzogbWluKDJkdmgsIDFkdncpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWVsZW1lbnQtY29sb3IpO1xuICBib3JkZXItcmFkaXVzOiBtaW4oMS4yZHZoLCAwLjZkdncpO1xuICBib3JkZXI6IG1pbigwLjJkdmgsIDAuMWR2dykgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuICBjb2xvcjogdmFyKC0tZGVlcGxpYi10ZXh0LWNvbG9yKTtcblxuICAuZGVlcGxpYi1tb2RhbC1pbnB1dCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZm9udC1zaXplOiBtaW4oMi42ZHZoLCAxLjhkdncpO1xuICAgIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gICAgcGFkZGluZzogbWluKDFkdmgsIDAuNWR2dyk7XG4gIH1cblxuICBpbnB1dC5kZWVwbGliLW1vZGFsLWlucHV0IHtcbiAgICBtYXgtd2lkdGg6IG1heCg1MGR2aCwgMjVkdncpO1xuICB9XG5cbiAgLmRlZXBsaWItbW9kYWwtYnV0dG9uLWNvbnRhaW5lciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgZ2FwOiAwLjVlbTtcbiAgICB3aWR0aDogMTAwJTtcblxuICAgIC5kZWVwbGliLWJ1dHRvbiB7XG4gICAgICBmb250LXNpemU6IDAuOGVtO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHdpZHRoOiBhdXRvO1xuICAgICAgcGFkZGluZzogbWluKDAuNHZoLCAwLjJ2dykgbWluKDJ2aCwgMXZ3KTtcblxuICAgICAgLmJ1dHRvbi1sYWJlbCB7XG4gICAgICAgIGRpc3BsYXk6IGNvbnRlbnRzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5kZWVwbGliLW1vZGFsLXByb21wdC1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG59XG5cbi5kZWVwbGliLW1vZGFsLWJsb2NrZXIge1xuICB6LWluZGV4OiAxMDAwO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMGR2dztcbiAgaGVpZ2h0OiAxMDBkdmg7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTtcbn1cbiJdfQ== */`;
843
878
 
844
879
  // src/base/initialization.ts
845
880
  var modStorage;
881
+ var sdk;
846
882
  function initMod(options) {
847
- const sdk = new ModSdkManager(options.modInfo.info, options.modInfo.options);
883
+ sdk = new ModSdkManager(options.modInfo.info, options.modInfo.options);
848
884
  const MOD_NAME = ModSdkManager.ModInfo.name;
849
885
  modStorage = new ModStorage(ModSdkManager.ModInfo.name);
850
886
  Style.injectInline("deeplib-style", styles_default);
@@ -865,7 +901,6 @@ function initMod(options) {
865
901
  deepLibLogger.debug(`Already logged in, initing ${MOD_NAME}`);
866
902
  init(options);
867
903
  }
868
- return { sdk };
869
904
  }
870
905
  __name(initMod, "initMod");
871
906
  async function init(options) {
@@ -1396,6 +1431,7 @@ function hasSetter(obj, prop) {
1396
1431
  return false;
1397
1432
  }
1398
1433
  __name(hasSetter, "hasSetter");
1434
+ var byteToKB = /* @__PURE__ */ __name((nByte) => Math.round(nByte / 100) / 10, "byteToKB");
1399
1435
 
1400
1436
  // src/utilities/elements/elements.ts
1401
1437
  var advElement = {
@@ -1410,19 +1446,23 @@ var advElement = {
1410
1446
  createBackNext: elementPrevNext
1411
1447
  };
1412
1448
  function elementCreateButton(options) {
1449
+ options.id ??= ElementGenerateID();
1413
1450
  const elem = document.getElementById(options.id);
1414
1451
  if (elem) return elem;
1415
1452
  options.type = "button";
1453
+ let image = void 0;
1454
+ if (options.options?.image) {
1455
+ image = options.options.image;
1456
+ options.options.image = void 0;
1457
+ }
1416
1458
  const disabled = typeof options?.disabled === "function" ? options?.disabled() : options?.disabled;
1417
1459
  const button = ElementButton.Create(
1418
- options.htmlOptions?.id ?? options.id,
1419
- options.htmlOptions?.onClick ?? options?.onClick ?? (() => {
1460
+ options.id,
1461
+ options?.onClick ?? (() => {
1420
1462
  }),
1421
1463
  deepMerge({
1422
- tooltip: options.tooltip,
1423
- label: options.label,
1424
1464
  labelPosition: "center"
1425
- }, options.htmlOptions?.options),
1465
+ }, options.options),
1426
1466
  deepMerge({
1427
1467
  button: {
1428
1468
  classList: ["deeplib-button"],
@@ -1430,7 +1470,7 @@ function elementCreateButton(options) {
1430
1470
  disabled
1431
1471
  },
1432
1472
  children: [
1433
- options.image ? {
1473
+ image ? {
1434
1474
  tag: "img",
1435
1475
  attributes: {
1436
1476
  id: `${options.id}-image`,
@@ -1441,12 +1481,12 @@ function elementCreateButton(options) {
1441
1481
  // 1x1 transparent image to get rid of broken image
1442
1482
  },
1443
1483
  style: {
1444
- "--image": `url("${options.image}")`
1484
+ "--image": `url("${image}")`
1445
1485
  }
1446
1486
  } : void 0
1447
1487
  ]
1448
1488
  }
1449
- }, options.htmlOptions?.htmlOptions ?? {})
1489
+ }, options.htmlOptions ?? {})
1450
1490
  );
1451
1491
  BaseSubscreen.currentElements.push([button, options]);
1452
1492
  return button;
@@ -1639,7 +1679,6 @@ function elementPrevNext(options) {
1639
1679
  children: [
1640
1680
  advElement.createButton({
1641
1681
  id: `deeplib-prev-next-${options.id}-prev-button`,
1642
- image: `${PUBLIC_URL}/dl_images/arrow_left.svg`,
1643
1682
  onClick: /* @__PURE__ */ __name(() => {
1644
1683
  options.back({
1645
1684
  setLabel,
@@ -1647,16 +1686,15 @@ function elementPrevNext(options) {
1647
1686
  setNextTooltip
1648
1687
  });
1649
1688
  }, "onClick"),
1650
- tooltip: options.initialPrevTooltip,
1651
1689
  htmlOptions: {
1652
- htmlOptions: {
1653
- button: {
1654
- classList: ["deeplib-prev-next-button"]
1655
- }
1656
- },
1657
- options: {
1658
- noStyling: true
1690
+ button: {
1691
+ classList: ["deeplib-prev-next-button"]
1659
1692
  }
1693
+ },
1694
+ options: {
1695
+ noStyling: true,
1696
+ image: `${PUBLIC_URL}/dl_images/arrow_left.svg`,
1697
+ tooltip: options.initialPrevTooltip
1660
1698
  }
1661
1699
  }),
1662
1700
  advElement.createLabel({
@@ -1668,7 +1706,6 @@ function elementPrevNext(options) {
1668
1706
  }),
1669
1707
  advElement.createButton({
1670
1708
  id: `deeplib-prev-next-${options.id}-next-button`,
1671
- image: `${PUBLIC_URL}/dl_images/arrow_right.svg`,
1672
1709
  onClick: /* @__PURE__ */ __name(() => {
1673
1710
  options.next({
1674
1711
  setLabel,
@@ -1676,16 +1713,15 @@ function elementPrevNext(options) {
1676
1713
  setNextTooltip
1677
1714
  });
1678
1715
  }, "onClick"),
1679
- tooltip: options.initialNextTooltip,
1680
1716
  htmlOptions: {
1681
- htmlOptions: {
1682
- button: {
1683
- classList: ["deeplib-prev-next-button"]
1684
- }
1685
- },
1686
- options: {
1687
- noStyling: true
1717
+ button: {
1718
+ classList: ["deeplib-prev-next-button"]
1688
1719
  }
1720
+ },
1721
+ options: {
1722
+ noStyling: true,
1723
+ image: `${PUBLIC_URL}/dl_images/arrow_right.svg`,
1724
+ tooltip: options.initialNextTooltip
1689
1725
  }
1690
1726
  })
1691
1727
  ]
@@ -1699,6 +1735,7 @@ var Modal = class _Modal {
1699
1735
  opts ??= {};
1700
1736
  opts.closeOnBackdrop ??= true;
1701
1737
  const promptId = `modal-prompt-${Date.now()}`;
1738
+ const prompt = (CommonIsArray(opts.prompt) ? opts.prompt : [opts.prompt]).filter((i) => i != null) ?? [""];
1702
1739
  this.dialog = ElementCreate({
1703
1740
  tag: "dialog",
1704
1741
  classList: ["deeplib-modal"],
@@ -1711,7 +1748,13 @@ var Modal = class _Modal {
1711
1748
  fontFamily: CommonGetFontName()
1712
1749
  },
1713
1750
  children: [
1714
- opts.prompt,
1751
+ {
1752
+ tag: "div",
1753
+ classList: ["deeplib-modal-prompt-container"],
1754
+ children: [
1755
+ ...prompt
1756
+ ]
1757
+ },
1715
1758
  {
1716
1759
  tag: "div",
1717
1760
  classList: ["deeplib-modal-prompt"],
@@ -1754,22 +1797,39 @@ var Modal = class _Modal {
1754
1797
  * Shows a simple alert modal with a single "OK" button.
1755
1798
  */
1756
1799
  static async alert(msg, timeoutMs) {
1757
- await new _Modal({ prompt: msg, buttons: [{ action: "close", text: "OK" }], timeoutMs }).show();
1800
+ await new _Modal({
1801
+ prompt: msg,
1802
+ buttons: [{ action: "close", text: getText("modal.button.ok") }],
1803
+ timeoutMs,
1804
+ escapeAction: "close"
1805
+ }).show();
1758
1806
  }
1759
1807
  /**
1760
1808
  * Shows a confirmation modal with "Cancel" and "OK" buttons.
1761
1809
  * Returns true if "OK" is clicked.
1762
1810
  */
1763
1811
  static async confirm(msg) {
1764
- const [action] = await new _Modal({ prompt: msg, buttons: [{ text: "Cancel", action: "cancel" }, { text: "OK", action: "ok" }] }).show();
1765
- return action === "ok";
1812
+ const [action] = await new _Modal({
1813
+ prompt: msg,
1814
+ buttons: [{ text: getText("modal.button.decline"), action: "decline" }, { text: getText("modal.button.confirm"), action: "confirm" }],
1815
+ escapeAction: "decline",
1816
+ enterAction: "confirm"
1817
+ }).show();
1818
+ return action === "confirm";
1766
1819
  }
1767
1820
  /**
1768
1821
  * Shows a prompt modal with an input field and "Submit"/"Cancel" buttons.
1769
1822
  * Returns the input value if submitted, otherwise null.
1770
1823
  */
1771
1824
  static async prompt(msg, defaultValue = "") {
1772
- const [action, value] = await new _Modal({ prompt: msg, timeoutMs: 0, input: { type: "input", defaultValue }, buttons: [{ text: "Cancel", action: "cancel" }, { text: "Submit", action: "submit" }] }).show();
1825
+ const [action, value] = await new _Modal({
1826
+ prompt: msg,
1827
+ timeoutMs: 0,
1828
+ input: { type: "input", defaultValue },
1829
+ buttons: [{ text: getText("modal.button.cancel"), action: "cancel" }, { text: getText("modal.button.submit"), action: "submit" }],
1830
+ escapeAction: "cancel",
1831
+ enterAction: "submit"
1832
+ }).show();
1773
1833
  return action === "submit" ? value : null;
1774
1834
  }
1775
1835
  /** Creates the input element for the modal, applying configuration and validation. */
@@ -1794,10 +1854,12 @@ var Modal = class _Modal {
1794
1854
  const btns = this.opts.buttons ? [...this.opts.buttons] : [];
1795
1855
  btns.forEach((b) => {
1796
1856
  const btn = advElement.createButton({
1797
- label: b.text,
1798
1857
  id: `deeplib-modal-${b.action}`,
1799
- disabled: b.disabled,
1800
- onClick: /* @__PURE__ */ __name(() => this.close(b.action), "onClick")
1858
+ onClick: /* @__PURE__ */ __name(() => this.close(b.action), "onClick"),
1859
+ options: {
1860
+ disabled: b.disabled,
1861
+ label: b.text
1862
+ }
1801
1863
  });
1802
1864
  container.append(btn);
1803
1865
  });
@@ -1837,7 +1899,12 @@ var Modal = class _Modal {
1837
1899
  }
1838
1900
  } else if (e.key === "Escape") {
1839
1901
  e.stopPropagation();
1840
- this.close("close");
1902
+ this.close(this.opts.escapeAction ?? "close");
1903
+ } else if (e.key === "Enter") {
1904
+ if (elements.some((el) => el === document.activeElement) && document.activeElement !== this.inputEl) return;
1905
+ e.preventDefault();
1906
+ e.stopPropagation();
1907
+ this.close(this.opts.enterAction ?? "submit");
1841
1908
  }
1842
1909
  });
1843
1910
  window.requestAnimationFrame(() => {
@@ -1901,11 +1968,13 @@ var MainMenu = class _MainMenu extends BaseSubscreen {
1901
1968
  const exitButton = advElement.createButton({
1902
1969
  id: "exit",
1903
1970
  size: [90, 90],
1904
- image: `${PUBLIC_URL}/dl_images/exit.svg`,
1905
1971
  onClick: /* @__PURE__ */ __name(() => {
1906
1972
  this.exit();
1907
1973
  }, "onClick"),
1908
- tooltip: getText("settings.button.back_button_hint")
1974
+ options: {
1975
+ image: `${PUBLIC_URL}/dl_images/exit.svg`,
1976
+ tooltip: getText("settings.button.back_button_hint")
1977
+ }
1909
1978
  });
1910
1979
  const menu = document.getElementById("deeplib-nav-menu");
1911
1980
  if (menu) {
@@ -1915,12 +1984,14 @@ var MainMenu = class _MainMenu extends BaseSubscreen {
1915
1984
  if (screen.name == "mainmenu") continue;
1916
1985
  const button = advElement.createButton({
1917
1986
  id: `${screen.name}-button`,
1918
- image: screen.icon,
1919
- label: getText(`mainmenu.button.${screen.name}`),
1920
1987
  onClick: /* @__PURE__ */ __name(() => {
1921
1988
  this.setSubscreen(screen);
1922
1989
  }, "onClick"),
1923
- size: [null, 90]
1990
+ size: [null, 90],
1991
+ options: {
1992
+ image: screen.icon,
1993
+ label: getText(`mainmenu.button.${screen.name}`)
1994
+ }
1924
1995
  });
1925
1996
  layout.appendToSettingsDiv(button);
1926
1997
  }
@@ -1929,59 +2000,107 @@ var MainMenu = class _MainMenu extends BaseSubscreen {
1929
2000
  if (_MainMenu.options.wikiLink) {
1930
2001
  const wikiButton = advElement.createButton({
1931
2002
  id: "deeplib-wiki-button",
1932
- image: `${PUBLIC_URL}/dl_images/notebook.svg`,
1933
- label: getText("mainmenu.button.wiki"),
1934
2003
  onClick: /* @__PURE__ */ __name(() => {
1935
2004
  window.open(_MainMenu.options.wikiLink, "_blank");
1936
2005
  }, "onClick"),
1937
- size: [null, 80]
2006
+ size: [null, 80],
2007
+ options: {
2008
+ image: `${PUBLIC_URL}/dl_images/notebook.svg`,
2009
+ label: getText("mainmenu.button.wiki")
2010
+ }
1938
2011
  });
1939
2012
  layout.appendToMiscDiv(wikiButton);
1940
2013
  }
1941
2014
  if (_MainMenu.options.repoLink) {
1942
2015
  const repoButton = advElement.createButton({
1943
2016
  id: "deeplib-repo-button",
1944
- image: `${PUBLIC_URL}/dl_images/git.svg`,
1945
- label: getText("mainmenu.button.repo"),
1946
2017
  onClick: /* @__PURE__ */ __name(() => {
1947
2018
  window.open(_MainMenu.options.repoLink, "_blank");
1948
2019
  }, "onClick"),
1949
- size: [null, 80]
2020
+ size: [null, 80],
2021
+ options: {
2022
+ image: `${PUBLIC_URL}/dl_images/git.svg`,
2023
+ label: getText("mainmenu.button.repo")
2024
+ }
1950
2025
  });
1951
2026
  layout.appendToMiscDiv(repoButton);
1952
2027
  }
1953
2028
  if (_MainMenu.options.resetSubscreen) {
1954
2029
  const resetButton = advElement.createButton({
1955
2030
  id: "deeplib-reset-button",
1956
- image: `${PUBLIC_URL}/dl_images/trash_bin.svg`,
1957
- label: getText("mainmenu.button.reset"),
1958
2031
  onClick: /* @__PURE__ */ __name(() => {
1959
2032
  this.setSubscreen(_MainMenu.options.resetSubscreen);
1960
2033
  }, "onClick"),
1961
- size: [null, 80]
2034
+ size: [null, 80],
2035
+ options: {
2036
+ image: `${PUBLIC_URL}/dl_images/trash_bin.svg`,
2037
+ label: getText("mainmenu.button.reset")
2038
+ }
1962
2039
  });
1963
2040
  layout.appendToMiscDiv(resetButton);
1964
2041
  }
1965
2042
  if (_MainMenu.options.importExportSubscreen) {
1966
2043
  const importExportButton = advElement.createButton({
1967
2044
  id: "deeplib-import-export-button",
1968
- image: `${PUBLIC_URL}/dl_images/transfer.svg`,
1969
- label: getText("mainmenu.button.import_export"),
1970
2045
  onClick: /* @__PURE__ */ __name(() => {
1971
2046
  this.setSubscreen(_MainMenu.options.importExportSubscreen);
1972
2047
  }, "onClick"),
1973
- size: [null, 80]
2048
+ size: [null, 80],
2049
+ options: {
2050
+ image: `${PUBLIC_URL}/dl_images/transfer.svg`,
2051
+ label: getText("mainmenu.button.import_export")
2052
+ }
1974
2053
  });
1975
2054
  layout.appendToMiscDiv(importExportButton);
1976
2055
  }
2056
+ if (_MainMenu.options.storageFullnessIndicator) {
2057
+ const maxStorageCapacityKB = 180;
2058
+ const currentStorageCapacityKB = byteToKB(ModStorage.measureSize(Player.OnlineSettings));
2059
+ const fullness = (currentStorageCapacityKB / maxStorageCapacityKB * 100).toFixed(1);
2060
+ const storageFullnessWrapper = advElement.createButton({
2061
+ id: CommonGenerateUniqueID(),
2062
+ size: [null, 80],
2063
+ options: {
2064
+ tooltipPosition: "left",
2065
+ noStyling: true,
2066
+ tooltip: CommonStringPartitionReplace(getText("mainmenu.meter.storage_hint"), {
2067
+ $percentage$: `${fullness}`
2068
+ }).join(""),
2069
+ label: CommonStringPartitionReplace(getText("mainmenu.meter.storage_label"), {
2070
+ $currentCapacity$: `${currentStorageCapacityKB}`,
2071
+ $maxCapacity$: `${maxStorageCapacityKB}`
2072
+ }).join("")
2073
+ },
2074
+ htmlOptions: {
2075
+ button: {
2076
+ children: [
2077
+ {
2078
+ tag: "div",
2079
+ attributes: { id: "deeplib-storage-meter" },
2080
+ children: [
2081
+ {
2082
+ tag: "div",
2083
+ attributes: { id: "deeplib-storage-bar" },
2084
+ style: { width: `${fullness}%` }
2085
+ }
2086
+ ]
2087
+ }
2088
+ ]
2089
+ }
2090
+ }
2091
+ });
2092
+ layout.appendToMiscDiv(storageFullnessWrapper);
2093
+ }
1977
2094
  if (IS_DEBUG) {
1978
2095
  const debugButton = advElement.createButton({
1979
2096
  id: "deeplib-debug-button",
1980
- image: `${PUBLIC_URL}/dl_images/bug.svg`,
1981
2097
  onClick: /* @__PURE__ */ __name(() => {
1982
2098
  this.setSubscreen(new GuiDebug());
1983
2099
  }, "onClick"),
1984
- size: [90, 90]
2100
+ size: [90, 90],
2101
+ options: {
2102
+ image: `${PUBLIC_URL}/dl_images/bug.svg`
2103
+ }
1985
2104
  });
1986
2105
  if (menu) {
1987
2106
  ElementMenu.PrependItem(menu, debugButton);
@@ -2027,41 +2146,49 @@ var GuiImportExport = class extends BaseSubscreen {
2027
2146
  const importFromFileButton = advElement.createButton({
2028
2147
  id: "deeplib-import-file-button",
2029
2148
  size: [600, 90],
2030
- image: `${PUBLIC_URL}/dl_images/file_import.svg`,
2031
2149
  onClick: /* @__PURE__ */ __name(() => {
2032
2150
  this.dataImport("file");
2033
2151
  }, "onClick"),
2034
- label: getText("import-export.button.import_file")
2152
+ options: {
2153
+ image: `${PUBLIC_URL}/dl_images/file_import.svg`,
2154
+ label: getText("import-export.button.import_file")
2155
+ }
2035
2156
  });
2036
2157
  layout.appendToSettingsDiv(importFromFileButton);
2037
2158
  const exportToFileButton = advElement.createButton({
2038
2159
  id: "deeplib-export-file-button",
2039
2160
  size: [600, 90],
2040
- image: `${PUBLIC_URL}/dl_images/file_export.svg`,
2041
2161
  onClick: /* @__PURE__ */ __name(() => {
2042
2162
  this.dataExport("file");
2043
2163
  }, "onClick"),
2044
- label: getText("import-export.button.export_file")
2164
+ options: {
2165
+ image: `${PUBLIC_URL}/dl_images/file_export.svg`,
2166
+ label: getText("import-export.button.export_file")
2167
+ }
2045
2168
  });
2046
2169
  layout.appendToSettingsDiv(exportToFileButton);
2047
2170
  const importFromClipboardButton = advElement.createButton({
2048
2171
  id: "deeplib-import-clipboard-button",
2049
2172
  size: [600, 90],
2050
- image: `${PUBLIC_URL}/dl_images/clipboard_import.svg`,
2051
2173
  onClick: /* @__PURE__ */ __name(() => {
2052
2174
  this.dataImport("clipboard");
2053
2175
  }, "onClick"),
2054
- label: getText("import-export.button.import_clipboard")
2176
+ options: {
2177
+ image: `${PUBLIC_URL}/dl_images/clipboard_import.svg`,
2178
+ label: getText("import-export.button.import_clipboard")
2179
+ }
2055
2180
  });
2056
2181
  layout.appendToSettingsDiv(importFromClipboardButton);
2057
2182
  const exportToClipboardButton = advElement.createButton({
2058
2183
  id: "deeplib-export-clipboard-button",
2059
2184
  size: [600, 90],
2060
- image: `${PUBLIC_URL}/dl_images/clipboard_export.svg`,
2061
2185
  onClick: /* @__PURE__ */ __name(() => {
2062
2186
  this.dataExport("clipboard");
2063
2187
  }, "onClick"),
2064
- label: getText("import-export.button.export_clipboard")
2188
+ options: {
2189
+ image: `${PUBLIC_URL}/dl_images/clipboard_export.svg`,
2190
+ label: getText("import-export.button.export_clipboard")
2191
+ }
2065
2192
  });
2066
2193
  layout.appendToSettingsDiv(exportToClipboardButton);
2067
2194
  }
@@ -2284,6 +2411,19 @@ var ModStorage = class _ModStorage {
2284
2411
  static dataCompress(object) {
2285
2412
  return LZString.compressToBase64(JSON.stringify(object));
2286
2413
  }
2414
+ static measureSize(data) {
2415
+ try {
2416
+ if (typeof data !== "string") {
2417
+ data = JSON.stringify(data) || "";
2418
+ }
2419
+ if (typeof data === "string") {
2420
+ return new TextEncoder().encode(data).byteLength;
2421
+ }
2422
+ throw new Error();
2423
+ } catch {
2424
+ return NaN;
2425
+ }
2426
+ }
2287
2427
  };
2288
2428
 
2289
2429
  // src/utilities/elements/helpers.ts
@@ -2803,10 +2943,71 @@ var Localization = class _Localization {
2803
2943
  var getText = /* @__PURE__ */ __name((srcTag) => {
2804
2944
  return Localization.getTextMod(srcTag) || Localization.getTextLib(srcTag) || srcTag;
2805
2945
  }, "getText");
2946
+
2947
+ // src/utilities/event_channel.ts
2948
+ var EventChannel = class {
2949
+ constructor(channelName) {
2950
+ this.channelName = channelName;
2951
+ ModSdkManager.prototype.hookFunction("ChatRoomMessageProcessHidden", 0, (args, next) => {
2952
+ if (!this.isChannelMessage(args[0])) {
2953
+ return next(args);
2954
+ }
2955
+ const [message, sender] = args;
2956
+ const { type, data } = message.Dictionary[0];
2957
+ const listeners = this.listeners[type];
2958
+ if (listeners) {
2959
+ listeners.forEach((listener) => listener(data, sender));
2960
+ }
2961
+ return next(args);
2962
+ }, `EventChannel-${channelName}`);
2963
+ }
2964
+ static {
2965
+ __name(this, "EventChannel");
2966
+ }
2967
+ listeners = {};
2968
+ unload() {
2969
+ Object.keys(this.listeners).forEach((key) => delete this.listeners[key]);
2970
+ ModSdkManager.prototype.removeHookByModule("ChatRoomMessageProcessHidden", `EventChannel-${this.channelName}`);
2971
+ }
2972
+ sendEvent(type, data, target = null) {
2973
+ const packet = {
2974
+ Type: "Hidden",
2975
+ Content: this.channelName,
2976
+ Sender: Player.MemberNumber,
2977
+ ...target ? { Target: target } : {},
2978
+ Dictionary: [
2979
+ {
2980
+ type,
2981
+ data
2982
+ }
2983
+ ]
2984
+ };
2985
+ ServerSend("ChatRoomChat", packet);
2986
+ }
2987
+ registerListener(event, listener) {
2988
+ const listeners = this.listeners[event] ?? [];
2989
+ listeners.push(listener);
2990
+ this.listeners[event] = listeners;
2991
+ return () => this.unregisterListener(event, listener);
2992
+ }
2993
+ unregisterListener(event, listener) {
2994
+ const listeners = this.listeners[event];
2995
+ if (listeners) {
2996
+ const index = listeners.indexOf(listener);
2997
+ if (index !== -1) {
2998
+ listeners.splice(index, 1);
2999
+ }
3000
+ }
3001
+ }
3002
+ isChannelMessage(message) {
3003
+ return message && message.Type === "Hidden" && message.Content === this.channelName && message.Sender && message.Sender !== Player.MemberNumber && message.Dictionary && !!message.Dictionary[0]?.data && !!message.Dictionary[0]?.type || false;
3004
+ }
3005
+ };
2806
3006
  export {
2807
3007
  BaseMigrator2 as BaseMigrator,
2808
3008
  BaseModule,
2809
3009
  BaseSubscreen,
3010
+ EventChannel,
2810
3011
  GUI,
2811
3012
  GuiDebug,
2812
3013
  GuiImportExport,
@@ -2820,6 +3021,7 @@ export {
2820
3021
  Style,
2821
3022
  VersionModule,
2822
3023
  advElement,
3024
+ byteToKB,
2823
3025
  deepLibLogger,
2824
3026
  deepMerge,
2825
3027
  deepMergeMatchingProperties,
@@ -2836,6 +3038,7 @@ export {
2836
3038
  modules,
2837
3039
  modulesMap,
2838
3040
  registerModule,
3041
+ sdk,
2839
3042
  sendActionMessage,
2840
3043
  sendLocalMessage,
2841
3044
  setSubscreen,