diff --git a/backbone/.gitignore b/backbone/.gitignore new file mode 100644 index 0000000000..40b878db5b --- /dev/null +++ b/backbone/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/backbone/assets/images/BackwaterLogo_Full.png b/backbone/assets/images/BackwaterLogo_Full.png new file mode 100644 index 0000000000..846c81aecf Binary files /dev/null and b/backbone/assets/images/BackwaterLogo_Full.png differ diff --git a/backbone/assets/images/Border_with_fade.png b/backbone/assets/images/Border_with_fade.png new file mode 100644 index 0000000000..f7693f1f57 Binary files /dev/null and b/backbone/assets/images/Border_with_fade.png differ diff --git a/backbone/assets/images/Roll20 Sheet Fonts.docx b/backbone/assets/images/Roll20 Sheet Fonts.docx new file mode 100644 index 0000000000..b6987b93b4 Binary files /dev/null and b/backbone/assets/images/Roll20 Sheet Fonts.docx differ diff --git a/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/Health.png b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/Health.png new file mode 100644 index 0000000000..7f7aa8e83c Binary files /dev/null and b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/Health.png differ diff --git a/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/StatBlock Bones.png b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/StatBlock Bones.png new file mode 100644 index 0000000000..95ed627931 Binary files /dev/null and b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/StatBlock Bones.png differ diff --git a/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/adrn_.png b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/adrn_.png new file mode 100644 index 0000000000..7b4f327c68 Binary files /dev/null and b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/adrn_.png differ diff --git a/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/armor.png b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/armor.png new file mode 100644 index 0000000000..7ed870ba65 Binary files /dev/null and b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/armor.png differ diff --git a/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/attribute.png b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/attribute.png new file mode 100644 index 0000000000..e7aac26f18 Binary files /dev/null and b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/attribute.png differ diff --git a/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/atts-bottomline.png b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/atts-bottomline.png new file mode 100644 index 0000000000..0310af0577 Binary files /dev/null and b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/atts-bottomline.png differ diff --git a/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/atts-midline.png b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/atts-midline.png new file mode 100644 index 0000000000..11b73b5fa1 Binary files /dev/null and b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/atts-midline.png differ diff --git a/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/atts-special.png b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/atts-special.png new file mode 100644 index 0000000000..f14604e93e Binary files /dev/null and b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/atts-special.png differ diff --git a/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/atts-top.png b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/atts-top.png new file mode 100644 index 0000000000..bb2b6d784e Binary files /dev/null and b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/atts-top.png differ diff --git a/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/atts-topline.png b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/atts-topline.png new file mode 100644 index 0000000000..19b909c65f Binary files /dev/null and b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/atts-topline.png differ diff --git a/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/movement.png b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/movement.png new file mode 100644 index 0000000000..777df709f7 Binary files /dev/null and b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/movement.png differ diff --git a/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/resolve.png b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/resolve.png new file mode 100644 index 0000000000..db1f2ff243 Binary files /dev/null and b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/resolve.png differ diff --git a/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/speed.png b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/speed.png new file mode 100644 index 0000000000..ab21da4c41 Binary files /dev/null and b/backbone/assets/images/Roll20 Sheet-20220907T172010Z-001/Roll20 Sheet/NPC-Monster Stat Blocks/speed.png differ diff --git a/backbone/assets/images/TempalteBorderWithFadeCentercut.png b/backbone/assets/images/TempalteBorderWithFadeCentercut.png new file mode 100644 index 0000000000..0e0815a362 Binary files /dev/null and b/backbone/assets/images/TempalteBorderWithFadeCentercut.png differ diff --git a/backbone/assets/images/TempalteBorderWithFadeCentercut.psd b/backbone/assets/images/TempalteBorderWithFadeCentercut.psd new file mode 100644 index 0000000000..50ac848a4e Binary files /dev/null and b/backbone/assets/images/TempalteBorderWithFadeCentercut.psd differ diff --git a/backbone/assets/images/ammo_section_blanked_300.png b/backbone/assets/images/ammo_section_blanked_300.png new file mode 100644 index 0000000000..e0891562c5 Binary files /dev/null and b/backbone/assets/images/ammo_section_blanked_300.png differ diff --git a/backbone/assets/images/ammo_section_whitebg_300.png b/backbone/assets/images/ammo_section_whitebg_300.png new file mode 100644 index 0000000000..22f3b753bd Binary files /dev/null and b/backbone/assets/images/ammo_section_whitebg_300.png differ diff --git a/backbone/assets/images/armor_icon_300.png b/backbone/assets/images/armor_icon_300.png new file mode 100644 index 0000000000..dc9ea19c61 Binary files /dev/null and b/backbone/assets/images/armor_icon_300.png differ diff --git a/backbone/assets/images/backbone-4.png b/backbone/assets/images/backbone-4.png new file mode 100644 index 0000000000..0df7227fc0 Binary files /dev/null and b/backbone/assets/images/backbone-4.png differ diff --git a/backbone/assets/images/backbone_B-x3.png b/backbone/assets/images/backbone_B-x3.png new file mode 100644 index 0000000000..87cccded52 Binary files /dev/null and b/backbone/assets/images/backbone_B-x3.png differ diff --git a/backbone/assets/images/backbone_B.png b/backbone/assets/images/backbone_B.png new file mode 100644 index 0000000000..88cdcb4425 Binary files /dev/null and b/backbone/assets/images/backbone_B.png differ diff --git a/backbone/assets/images/backbonelogo.png b/backbone/assets/images/backbonelogo.png new file mode 100644 index 0000000000..59f16f5441 Binary files /dev/null and b/backbone/assets/images/backbonelogo.png differ diff --git a/backbone/assets/images/bandage-icon-single.png b/backbone/assets/images/bandage-icon-single.png new file mode 100644 index 0000000000..a2a88033ba Binary files /dev/null and b/backbone/assets/images/bandage-icon-single.png differ diff --git a/backbone/assets/images/bandage-icon.png b/backbone/assets/images/bandage-icon.png new file mode 100644 index 0000000000..10619bcbf7 Binary files /dev/null and b/backbone/assets/images/bandage-icon.png differ diff --git a/backbone/assets/images/boot_icon_300.png b/backbone/assets/images/boot_icon_300.png new file mode 100644 index 0000000000..2fdd655a24 Binary files /dev/null and b/backbone/assets/images/boot_icon_300.png differ diff --git a/backbone/assets/images/border_bw.png b/backbone/assets/images/border_bw.png new file mode 100644 index 0000000000..9a67f2a342 Binary files /dev/null and b/backbone/assets/images/border_bw.png differ diff --git a/backbone/assets/images/fail-circle.png b/backbone/assets/images/fail-circle.png new file mode 100644 index 0000000000..b4a0e32770 Binary files /dev/null and b/backbone/assets/images/fail-circle.png differ diff --git a/backbone/assets/images/flame_icon_300.png b/backbone/assets/images/flame_icon_300.png new file mode 100644 index 0000000000..ae4253ce65 Binary files /dev/null and b/backbone/assets/images/flame_icon_300.png differ diff --git a/backbone/assets/images/heart_icon_300.png b/backbone/assets/images/heart_icon_300.png new file mode 100644 index 0000000000..9ee51ee11a Binary files /dev/null and b/backbone/assets/images/heart_icon_300.png differ diff --git a/backbone/assets/images/images/pageMaskBorder_TL.png b/backbone/assets/images/images/pageMaskBorder_TL.png new file mode 100644 index 0000000000..052f2a91b0 Binary files /dev/null and b/backbone/assets/images/images/pageMaskBorder_TL.png differ diff --git a/backbone/assets/images/images/pageMaskBorder_bl.png b/backbone/assets/images/images/pageMaskBorder_bl.png new file mode 100644 index 0000000000..0cfad5f963 Binary files /dev/null and b/backbone/assets/images/images/pageMaskBorder_bl.png differ diff --git a/backbone/assets/images/images/pageMaskBorder_bottom.png b/backbone/assets/images/images/pageMaskBorder_bottom.png new file mode 100644 index 0000000000..16c82be037 Binary files /dev/null and b/backbone/assets/images/images/pageMaskBorder_bottom.png differ diff --git a/backbone/assets/images/images/pageMaskBorder_br.png b/backbone/assets/images/images/pageMaskBorder_br.png new file mode 100644 index 0000000000..b9e1d34acf Binary files /dev/null and b/backbone/assets/images/images/pageMaskBorder_br.png differ diff --git a/backbone/assets/images/images/pageMaskBorder_left.png b/backbone/assets/images/images/pageMaskBorder_left.png new file mode 100644 index 0000000000..bb6ab38151 Binary files /dev/null and b/backbone/assets/images/images/pageMaskBorder_left.png differ diff --git a/backbone/assets/images/images/pageMaskBorder_right.png b/backbone/assets/images/images/pageMaskBorder_right.png new file mode 100644 index 0000000000..e69b7cc30d Binary files /dev/null and b/backbone/assets/images/images/pageMaskBorder_right.png differ diff --git a/backbone/assets/images/images/pageMaskBorder_top.png b/backbone/assets/images/images/pageMaskBorder_top.png new file mode 100644 index 0000000000..4d8f614051 Binary files /dev/null and b/backbone/assets/images/images/pageMaskBorder_top.png differ diff --git a/backbone/assets/images/images/pageMaskBorder_tr.png b/backbone/assets/images/images/pageMaskBorder_tr.png new file mode 100644 index 0000000000..686e7a6e08 Binary files /dev/null and b/backbone/assets/images/images/pageMaskBorder_tr.png differ diff --git a/backbone/assets/images/lightning_icon_300.png b/backbone/assets/images/lightning_icon_300.png new file mode 100644 index 0000000000..d5cc83ed0b Binary files /dev/null and b/backbone/assets/images/lightning_icon_300.png differ diff --git a/backbone/assets/images/maskBorderTransparentEdge.png b/backbone/assets/images/maskBorderTransparentEdge.png new file mode 100644 index 0000000000..65254d9254 Binary files /dev/null and b/backbone/assets/images/maskBorderTransparentEdge.png differ diff --git a/backbone/assets/images/maskBorderWip.psd b/backbone/assets/images/maskBorderWip.psd new file mode 100644 index 0000000000..5324aa829b Binary files /dev/null and b/backbone/assets/images/maskBorderWip.psd differ diff --git a/backbone/assets/images/pageMaskBorder.png b/backbone/assets/images/pageMaskBorder.png new file mode 100644 index 0000000000..0faf1ecb99 Binary files /dev/null and b/backbone/assets/images/pageMaskBorder.png differ diff --git a/backbone/assets/images/pageMaskBorder.psd b/backbone/assets/images/pageMaskBorder.psd new file mode 100644 index 0000000000..c6dea562e1 Binary files /dev/null and b/backbone/assets/images/pageMaskBorder.psd differ diff --git a/backbone/assets/images/rolloutput-2-adjusted.png b/backbone/assets/images/rolloutput-2-adjusted.png new file mode 100644 index 0000000000..6273ae0430 Binary files /dev/null and b/backbone/assets/images/rolloutput-2-adjusted.png differ diff --git a/backbone/assets/images/rolloutput-2.png b/backbone/assets/images/rolloutput-2.png new file mode 100644 index 0000000000..fd9656a0f4 Binary files /dev/null and b/backbone/assets/images/rolloutput-2.png differ diff --git a/backbone/assets/images/skull_icon_300.png b/backbone/assets/images/skull_icon_300.png new file mode 100644 index 0000000000..8ac889fbbf Binary files /dev/null and b/backbone/assets/images/skull_icon_300.png differ diff --git a/backbone/assets/images/successcircle.png b/backbone/assets/images/successcircle.png new file mode 100644 index 0000000000..c4ae02e2fa Binary files /dev/null and b/backbone/assets/images/successcircle.png differ diff --git a/backbone/assets/images/tree_b.png b/backbone/assets/images/tree_b.png new file mode 100644 index 0000000000..25844b1f59 Binary files /dev/null and b/backbone/assets/images/tree_b.png differ diff --git a/backbone/assets/images/x3/armor_iconx3.png b/backbone/assets/images/x3/armor_iconx3.png new file mode 100644 index 0000000000..43d0bd9914 Binary files /dev/null and b/backbone/assets/images/x3/armor_iconx3.png differ diff --git a/backbone/assets/images/x3/boot_iconx3.png b/backbone/assets/images/x3/boot_iconx3.png new file mode 100644 index 0000000000..69dfeb4cc7 Binary files /dev/null and b/backbone/assets/images/x3/boot_iconx3.png differ diff --git a/backbone/assets/images/x3/flame_iconx3.png b/backbone/assets/images/x3/flame_iconx3.png new file mode 100644 index 0000000000..b8e48480f4 Binary files /dev/null and b/backbone/assets/images/x3/flame_iconx3.png differ diff --git a/backbone/assets/images/x3/heart_iconx3.png b/backbone/assets/images/x3/heart_iconx3.png new file mode 100644 index 0000000000..022bb91eb9 Binary files /dev/null and b/backbone/assets/images/x3/heart_iconx3.png differ diff --git a/backbone/assets/images/x3/lightning_iconx3.png b/backbone/assets/images/x3/lightning_iconx3.png new file mode 100644 index 0000000000..57aa5ada21 Binary files /dev/null and b/backbone/assets/images/x3/lightning_iconx3.png differ diff --git a/backbone/assets/images/x3/skull_iconx3.png b/backbone/assets/images/x3/skull_iconx3.png new file mode 100644 index 0000000000..a6f9fdb653 Binary files /dev/null and b/backbone/assets/images/x3/skull_iconx3.png differ diff --git a/backbone/assets/images/~$ll20 Sheet Fonts.docx b/backbone/assets/images/~$ll20 Sheet Fonts.docx new file mode 100644 index 0000000000..16d78d72d8 Binary files /dev/null and b/backbone/assets/images/~$ll20 Sheet Fonts.docx differ diff --git a/backbone/babel.config.json b/backbone/babel.config.json new file mode 100644 index 0000000000..8aa924d7c6 --- /dev/null +++ b/backbone/babel.config.json @@ -0,0 +1,3 @@ +{ + "presets": ["@babel/preset-env"] +} \ No newline at end of file diff --git a/backbone/backbone.css b/backbone/backbone.css new file mode 100644 index 0000000000..80e2d687d2 --- /dev/null +++ b/backbone/backbone.css @@ -0,0 +1,2110 @@ +@import url("https://fonts.googleapis.com/css?family=IM+Fell+English+SC|Trade+Winds|Material+Icons&display=swap"); +.ui-dialog .tab-content .charsheet select, +.ui-dialog .tab-content .charsheet textarea, +.ui-dialog .tab-content .charsheet input, +.ui-dialog .tab-content .charsheet .uneditable-input, +.ui-dialog .tab-content .charsheet label, +.ui-dialog .tab-content .charsheet button { + all: initial; +} + +.tabs .tabs__container:not(.k-active-tab) { + display: none !important; +} + +.sheet-rolltemplate-backbone .text-collapse:before, .ui-dialog .tab-content .charsheet .text-collapse:before, .sheet-rolltemplate-backbone .sheet-material-icons, .ui-dialog .tab-content .charsheet .sheet-material-icons, +.sheet-rolltemplate-backbone .material-icons, +.ui-dialog .tab-content .charsheet .material-icons { + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; /* Preferred icon size */ + display: inline-block; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; +} + +.sheet-rolltemplate-backbone .sheet-pictos, .ui-dialog .tab-content .charsheet .sheet-pictos, +.sheet-rolltemplate-backbone .pictos, +.ui-dialog .tab-content .charsheet .pictos { + font-family: pictos; + text-transform: none; +} + +.sheet-rolltemplate-backbone .pictos3, .ui-dialog .tab-content .charsheet .pictos3, +.sheet-rolltemplate-backbone .sheet-pictos3, +.ui-dialog .tab-content .charsheet .sheet-pictos3 { + font-family: pictos three; + text-transform: none; +} + +.sheet-rolltemplate-backbone .pictoscustom, .ui-dialog .tab-content .charsheet .pictoscustom, +.sheet-rolltemplate-backbone .sheet-pictoscustom, +.ui-dialog .tab-content .charsheet .sheet-pictoscustom { + font-family: pictos custom; + text-transform: none; +} + +.sheet-rolltemplate-backbone .dicefontd20, .ui-dialog .tab-content .charsheet .dicefontd20, +.sheet-rolltemplate-backbone .sheet-dicefontd20, +.ui-dialog .tab-content .charsheet .sheet-dicefontd20 { + font-family: dicefontd20; + text-transform: none; +} + +.sheet-rolltemplate-backbone .sheet-hidden, .ui-dialog .tab-content .charsheet .sheet-hidden, +.sheet-rolltemplate-backbone .hidden, +.ui-dialog .tab-content .charsheet .hidden, +.sheet-rolltemplate-backbone *[hidden], +.ui-dialog .tab-content .charsheet *[hidden] { + display: none !important; +} + +.sheet-rolltemplate-backbone span, .ui-dialog .tab-content .charsheet span, +.sheet-rolltemplate-backbone input, +.ui-dialog .tab-content .charsheet input, +.sheet-rolltemplate-backbone textarea, +.ui-dialog .tab-content .charsheet textarea, +.sheet-rolltemplate-backbone p, +.ui-dialog .tab-content .charsheet p, .sheet-rolltemplate-backbone h5 *, .ui-dialog .tab-content .charsheet h5 *, +.sheet-rolltemplate-backbone *[aria-level="5"] *, +.ui-dialog .tab-content .charsheet *[aria-level="5"] *, .sheet-rolltemplate-backbone h5, .ui-dialog .tab-content .charsheet h5, +.sheet-rolltemplate-backbone *[aria-level="5"], +.ui-dialog .tab-content .charsheet *[aria-level="5"], .ui-dialog .tab-content .charsheet .roller:not([role]) *, .ui-dialog .tab-content .charsheet .styled-button--controlled *, +.ui-dialog .tab-content .charsheet .styled-button--controlled * *, .sheet-rolltemplate-backbone h4 *, .ui-dialog .tab-content .charsheet h4 *, +.sheet-rolltemplate-backbone *[aria-level="4"] *, +.ui-dialog .tab-content .charsheet *[aria-level="4"] *, .ui-dialog .tab-content .charsheet .roller:not([role]), .ui-dialog .tab-content .charsheet .styled-button--controlled, +.ui-dialog .tab-content .charsheet .styled-button--controlled *, .sheet-rolltemplate-backbone h4, .ui-dialog .tab-content .charsheet h4, +.sheet-rolltemplate-backbone *[aria-level="4"], +.ui-dialog .tab-content .charsheet *[aria-level="4"], .sheet-rolltemplate-backbone .sheet-content .inlinerollresult, .sheet-rolltemplate-backbone .big-text *, .ui-dialog .tab-content .charsheet .big-text *, +.sheet-rolltemplate-backbone .sheet-big-text *, +.ui-dialog .tab-content .charsheet .sheet-big-text *, .sheet-rolltemplate-backbone h3 *, .ui-dialog .tab-content .charsheet h3 *, +.sheet-rolltemplate-backbone *[aria-level="3"] *, +.ui-dialog .tab-content .charsheet *[aria-level="3"] *, .sheet-rolltemplate-backbone .big-text, .ui-dialog .tab-content .charsheet .big-text, +.sheet-rolltemplate-backbone .sheet-big-text, +.ui-dialog .tab-content .charsheet .sheet-big-text, .sheet-rolltemplate-backbone h3, .ui-dialog .tab-content .charsheet h3, +.sheet-rolltemplate-backbone *[aria-level="3"], +.ui-dialog .tab-content .charsheet *[aria-level="3"], .sheet-rolltemplate-backbone h2 *, .ui-dialog .tab-content .charsheet h2 *, .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name] *, .ui-dialog .tab-content .charsheet .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name] *, .sheet-rolltemplate-backbone .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name] *, .sheet-rolltemplate-backbone .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name] *, .ui-dialog .tab-content .charsheet .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name] *, .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name] *, +.sheet-rolltemplate-backbone *[aria-level="2"] *, +.ui-dialog .tab-content .charsheet *[aria-level="2"] *, .sheet-rolltemplate-backbone h2, .ui-dialog .tab-content .charsheet h2, .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name], .ui-dialog .tab-content .charsheet .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name], .sheet-rolltemplate-backbone .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name], .sheet-rolltemplate-backbone .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name], .ui-dialog .tab-content .charsheet .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name], .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name], +.sheet-rolltemplate-backbone *[aria-level="2"], +.ui-dialog .tab-content .charsheet *[aria-level="2"], .sheet-rolltemplate-backbone .sheet-content .sheet-result .inlinerollresult *, .sheet-rolltemplate-backbone h1 *, .ui-dialog .tab-content .charsheet h1 *, +.sheet-rolltemplate-backbone *[aria-level="1"] *, +.ui-dialog .tab-content .charsheet *[aria-level="1"] *, .sheet-rolltemplate-backbone .sheet-content .sheet-result .inlinerollresult, .sheet-rolltemplate-backbone h1, .ui-dialog .tab-content .charsheet h1, +.sheet-rolltemplate-backbone *[aria-level="1"], +.ui-dialog .tab-content .charsheet *[aria-level="1"] { + line-height: normal; +} + +.sheet-rolltemplate-backbone .sheet-italics, .ui-dialog .tab-content .charsheet .sheet-italics, +.sheet-rolltemplate-backbone .italics, +.ui-dialog .tab-content .charsheet .italics { + font-style: italic; +} + +.sheet-rolltemplate-backbone h5 *, .ui-dialog .tab-content .charsheet h5 *, +.sheet-rolltemplate-backbone *[aria-level="5"] *, +.ui-dialog .tab-content .charsheet *[aria-level="5"] *, .sheet-rolltemplate-backbone h5, .ui-dialog .tab-content .charsheet h5, +.sheet-rolltemplate-backbone *[aria-level="5"], +.ui-dialog .tab-content .charsheet *[aria-level="5"], .ui-dialog .tab-content .charsheet .roller:not([role]) *, .ui-dialog .tab-content .charsheet .styled-button--controlled *, +.ui-dialog .tab-content .charsheet .styled-button--controlled * *, .sheet-rolltemplate-backbone h4 *, .ui-dialog .tab-content .charsheet h4 *, +.sheet-rolltemplate-backbone *[aria-level="4"] *, +.ui-dialog .tab-content .charsheet *[aria-level="4"] *, .ui-dialog .tab-content .charsheet .roller:not([role]), .ui-dialog .tab-content .charsheet .styled-button--controlled, +.ui-dialog .tab-content .charsheet .styled-button--controlled *, .sheet-rolltemplate-backbone h4, .ui-dialog .tab-content .charsheet h4, +.sheet-rolltemplate-backbone *[aria-level="4"], +.ui-dialog .tab-content .charsheet *[aria-level="4"], .sheet-rolltemplate-backbone .sheet-content .inlinerollresult, .sheet-rolltemplate-backbone .big-text *, .ui-dialog .tab-content .charsheet .big-text *, +.sheet-rolltemplate-backbone .sheet-big-text *, +.ui-dialog .tab-content .charsheet .sheet-big-text *, .sheet-rolltemplate-backbone h3 *, .ui-dialog .tab-content .charsheet h3 *, +.sheet-rolltemplate-backbone *[aria-level="3"] *, +.ui-dialog .tab-content .charsheet *[aria-level="3"] *, .sheet-rolltemplate-backbone .big-text, .ui-dialog .tab-content .charsheet .big-text, +.sheet-rolltemplate-backbone .sheet-big-text, +.ui-dialog .tab-content .charsheet .sheet-big-text, .sheet-rolltemplate-backbone h3, .ui-dialog .tab-content .charsheet h3, +.sheet-rolltemplate-backbone *[aria-level="3"], +.ui-dialog .tab-content .charsheet *[aria-level="3"], .sheet-rolltemplate-backbone h2 *, .ui-dialog .tab-content .charsheet h2 *, .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name] *, .ui-dialog .tab-content .charsheet .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name] *, .sheet-rolltemplate-backbone .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name] *, .sheet-rolltemplate-backbone .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name] *, .ui-dialog .tab-content .charsheet .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name] *, .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name] *, +.sheet-rolltemplate-backbone *[aria-level="2"] *, +.ui-dialog .tab-content .charsheet *[aria-level="2"] *, .sheet-rolltemplate-backbone h2, .ui-dialog .tab-content .charsheet h2, .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name], .ui-dialog .tab-content .charsheet .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name], .sheet-rolltemplate-backbone .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name], .sheet-rolltemplate-backbone .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name], .ui-dialog .tab-content .charsheet .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name], .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name], +.sheet-rolltemplate-backbone *[aria-level="2"], +.ui-dialog .tab-content .charsheet *[aria-level="2"], .sheet-rolltemplate-backbone .sheet-content .sheet-result .inlinerollresult *, .sheet-rolltemplate-backbone h1 *, .ui-dialog .tab-content .charsheet h1 *, +.sheet-rolltemplate-backbone *[aria-level="1"] *, +.ui-dialog .tab-content .charsheet *[aria-level="1"] *, .sheet-rolltemplate-backbone .sheet-content .sheet-result .inlinerollresult, .sheet-rolltemplate-backbone h1, .ui-dialog .tab-content .charsheet h1, +.sheet-rolltemplate-backbone *[aria-level="1"], +.ui-dialog .tab-content .charsheet *[aria-level="1"] { + color: var(--fontColor); + white-space: nowrap; + margin-top: 0px; + margin-bottom: 0px; + font-weight: normal; +} + +.sheet-rolltemplate-backbone .sheet-content .inlinerollresult, .sheet-rolltemplate-backbone .big-text *, .ui-dialog .tab-content .charsheet .big-text *, +.sheet-rolltemplate-backbone .sheet-big-text *, +.ui-dialog .tab-content .charsheet .sheet-big-text *, .sheet-rolltemplate-backbone h3 *, .ui-dialog .tab-content .charsheet h3 *, +.sheet-rolltemplate-backbone *[aria-level="3"] *, +.ui-dialog .tab-content .charsheet *[aria-level="3"] *, .sheet-rolltemplate-backbone .big-text, .ui-dialog .tab-content .charsheet .big-text, +.sheet-rolltemplate-backbone .sheet-big-text, +.ui-dialog .tab-content .charsheet .sheet-big-text, .sheet-rolltemplate-backbone h3, .ui-dialog .tab-content .charsheet h3, +.sheet-rolltemplate-backbone *[aria-level="3"], +.ui-dialog .tab-content .charsheet *[aria-level="3"], .sheet-rolltemplate-backbone h2 *, .ui-dialog .tab-content .charsheet h2 *, .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name] *, .ui-dialog .tab-content .charsheet .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name] *, .sheet-rolltemplate-backbone .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name] *, .sheet-rolltemplate-backbone .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name] *, .ui-dialog .tab-content .charsheet .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name] *, .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name] *, +.sheet-rolltemplate-backbone *[aria-level="2"] *, +.ui-dialog .tab-content .charsheet *[aria-level="2"] *, .sheet-rolltemplate-backbone h2, .ui-dialog .tab-content .charsheet h2, .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name], .ui-dialog .tab-content .charsheet .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name], .sheet-rolltemplate-backbone .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name], .sheet-rolltemplate-backbone .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name], .ui-dialog .tab-content .charsheet .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name], .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name], +.sheet-rolltemplate-backbone *[aria-level="2"], +.ui-dialog .tab-content .charsheet *[aria-level="2"], .sheet-rolltemplate-backbone .sheet-content .sheet-result .inlinerollresult *, .sheet-rolltemplate-backbone h1 *, .ui-dialog .tab-content .charsheet h1 *, +.sheet-rolltemplate-backbone *[aria-level="1"] *, +.ui-dialog .tab-content .charsheet *[aria-level="1"] *, .sheet-rolltemplate-backbone .sheet-content .sheet-result .inlinerollresult, .sheet-rolltemplate-backbone h1, .ui-dialog .tab-content .charsheet h1, +.sheet-rolltemplate-backbone *[aria-level="1"], +.ui-dialog .tab-content .charsheet *[aria-level="1"] { + text-transform: uppercase; + font-weight: normal; +} + +.sheet-rolltemplate-backbone h5 :not(:where(input)), .ui-dialog .tab-content .charsheet h5 :not(:where(input)), +.sheet-rolltemplate-backbone *[aria-level="5"] :not(:where(input)), +.ui-dialog .tab-content .charsheet *[aria-level="5"] :not(:where(input)), .sheet-rolltemplate-backbone h5:not(:where(input)), .ui-dialog .tab-content .charsheet h5:not(:where(input)), +.sheet-rolltemplate-backbone [aria-level="5"]:not(:where(input)), +.ui-dialog .tab-content .charsheet [aria-level="5"]:not(:where(input)), .ui-dialog .tab-content .charsheet .roller:not([role]) :not(:where(input)), .ui-dialog .tab-content .charsheet .styled-button--controlled :not(:where(input)), .sheet-rolltemplate-backbone h4 :not(:where(input)), .ui-dialog .tab-content .charsheet h4 :not(:where(input)), +.sheet-rolltemplate-backbone *[aria-level="4"] :not(:where(input)), +.ui-dialog .tab-content .charsheet *[aria-level="4"] :not(:where(input)), .ui-dialog .tab-content .charsheet .roller:not(:where(input)):not([role]), .ui-dialog .tab-content .charsheet .styled-button--controlled:not(:where(input)), .sheet-rolltemplate-backbone h4:not(:where(input)), .ui-dialog .tab-content .charsheet h4:not(:where(input)), +.sheet-rolltemplate-backbone [aria-level="4"]:not(:where(input)), +.ui-dialog .tab-content .charsheet [aria-level="4"]:not(:where(input)) { + text-transform: capitalize; +} + +.sheet-rolltemplate-backbone .sheet-content .sheet-result .inlinerollresult *, .sheet-rolltemplate-backbone h1 *, .ui-dialog .tab-content .charsheet h1 *, +.sheet-rolltemplate-backbone *[aria-level="1"] *, +.ui-dialog .tab-content .charsheet *[aria-level="1"] *, .sheet-rolltemplate-backbone .sheet-content .sheet-result .inlinerollresult, .sheet-rolltemplate-backbone h1, .ui-dialog .tab-content .charsheet h1, +.sheet-rolltemplate-backbone *[aria-level="1"], +.ui-dialog .tab-content .charsheet *[aria-level="1"] { + font-size: 1.5rem; + font-family: var(--topHeaderFont); +} +.sheet-rolltemplate-backbone .sheet-content .sheet-result .inlinerollresult :not(input), .sheet-rolltemplate-backbone h1 :not(input), .ui-dialog .tab-content .charsheet h1 :not(input), +.sheet-rolltemplate-backbone *[aria-level="1"] :not(input), +.ui-dialog .tab-content .charsheet *[aria-level="1"] :not(input), .sheet-rolltemplate-backbone .sheet-content .sheet-result .inlinerollresult:not(input), .sheet-rolltemplate-backbone h1:not(input), .ui-dialog .tab-content .charsheet h1:not(input), +.sheet-rolltemplate-backbone [aria-level="1"]:not(input), +.ui-dialog .tab-content .charsheet [aria-level="1"]:not(input) { + text-align: center; +} + +.sheet-rolltemplate-backbone h2 *, .ui-dialog .tab-content .charsheet h2 *, .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name] *, .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name] *, +.sheet-rolltemplate-backbone *[aria-level="2"] *, +.ui-dialog .tab-content .charsheet *[aria-level="2"] *, .sheet-rolltemplate-backbone h2, .ui-dialog .tab-content .charsheet h2, .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name], .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name], +.sheet-rolltemplate-backbone *[aria-level="2"], +.ui-dialog .tab-content .charsheet *[aria-level="2"] { + font-size: 1.375rem; + font-family: var(--topHeaderFont); +} +.sheet-rolltemplate-backbone h2 :not(input), .ui-dialog .tab-content .charsheet h2 :not(input), .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name] :not(input), .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name] :not(input), +.sheet-rolltemplate-backbone *[aria-level="2"] :not(input), +.ui-dialog .tab-content .charsheet *[aria-level="2"] :not(input), .sheet-rolltemplate-backbone h2:not(input), .ui-dialog .tab-content .charsheet h2:not(input), .sheet-rolltemplate-backbone .input-label:not(.stacked).large > [name]:not(input), .ui-dialog .tab-content .charsheet .input-label:not(.stacked).large > [name]:not(input), +.sheet-rolltemplate-backbone [aria-level="2"]:not(input), +.ui-dialog .tab-content .charsheet [aria-level="2"]:not(input) { + text-align: center; +} + +.sheet-rolltemplate-backbone .sheet-content .inlinerollresult, .sheet-rolltemplate-backbone .big-text *, .ui-dialog .tab-content .charsheet .big-text *, +.sheet-rolltemplate-backbone .sheet-big-text *, +.ui-dialog .tab-content .charsheet .sheet-big-text *, .sheet-rolltemplate-backbone h3 *, .ui-dialog .tab-content .charsheet h3 *, +.sheet-rolltemplate-backbone *[aria-level="3"] *, +.ui-dialog .tab-content .charsheet *[aria-level="3"] *, .sheet-rolltemplate-backbone .big-text, .ui-dialog .tab-content .charsheet .big-text, +.sheet-rolltemplate-backbone .sheet-big-text, +.ui-dialog .tab-content .charsheet .sheet-big-text, .sheet-rolltemplate-backbone h3, .ui-dialog .tab-content .charsheet h3, +.sheet-rolltemplate-backbone *[aria-level="3"], +.ui-dialog .tab-content .charsheet *[aria-level="3"] { + font-size: 1.25rem; + font-family: var(--topHeaderFont); +} +.sheet-rolltemplate-backbone .sheet-content .inlinerollresult:not(input), .sheet-rolltemplate-backbone .big-text :not(input), .ui-dialog .tab-content .charsheet .big-text :not(input), +.sheet-rolltemplate-backbone .sheet-big-text :not(input), +.ui-dialog .tab-content .charsheet .sheet-big-text :not(input), .sheet-rolltemplate-backbone h3 :not(input), .ui-dialog .tab-content .charsheet h3 :not(input), +.sheet-rolltemplate-backbone *[aria-level="3"] :not(input), +.ui-dialog .tab-content .charsheet *[aria-level="3"] :not(input), .sheet-rolltemplate-backbone .big-text:not(input), .ui-dialog .tab-content .charsheet .big-text:not(input), +.sheet-rolltemplate-backbone .sheet-big-text:not(input), +.ui-dialog .tab-content .charsheet .sheet-big-text:not(input), .sheet-rolltemplate-backbone h3:not(input), .ui-dialog .tab-content .charsheet h3:not(input), +.sheet-rolltemplate-backbone [aria-level="3"]:not(input), +.ui-dialog .tab-content .charsheet [aria-level="3"]:not(input) { + text-align: center; +} + +.ui-dialog .tab-content .charsheet .roller:not([role]) *, .ui-dialog .tab-content .charsheet .styled-button--controlled *, .sheet-rolltemplate-backbone h4 *, .ui-dialog .tab-content .charsheet h4 *, +.sheet-rolltemplate-backbone *[aria-level="4"] *, +.ui-dialog .tab-content .charsheet *[aria-level="4"] *, .ui-dialog .tab-content .charsheet .roller:not([role]), .ui-dialog .tab-content .charsheet .styled-button--controlled, .sheet-rolltemplate-backbone h4, .ui-dialog .tab-content .charsheet h4, +.sheet-rolltemplate-backbone *[aria-level="4"], +.ui-dialog .tab-content .charsheet *[aria-level="4"] { + font-size: 1.125rem; + font-family: var(--midHeaderFont); +} +.ui-dialog .tab-content .charsheet .roller:not([role]) :not(input), .ui-dialog .tab-content .charsheet .styled-button--controlled :not(input), .sheet-rolltemplate-backbone h4 :not(input), .ui-dialog .tab-content .charsheet h4 :not(input), +.sheet-rolltemplate-backbone *[aria-level="4"] :not(input), +.ui-dialog .tab-content .charsheet *[aria-level="4"] :not(input), .ui-dialog .tab-content .charsheet .roller:not(input):not([role]), .ui-dialog .tab-content .charsheet .styled-button--controlled:not(input), .sheet-rolltemplate-backbone h4:not(input), .ui-dialog .tab-content .charsheet h4:not(input), +.sheet-rolltemplate-backbone [aria-level="4"]:not(input), +.ui-dialog .tab-content .charsheet [aria-level="4"]:not(input) { + text-align: center; +} + +.sheet-rolltemplate-backbone h5 *, .ui-dialog .tab-content .charsheet h5 *, +.sheet-rolltemplate-backbone *[aria-level="5"] *, +.ui-dialog .tab-content .charsheet *[aria-level="5"] *, .sheet-rolltemplate-backbone h5, .ui-dialog .tab-content .charsheet h5, +.sheet-rolltemplate-backbone *[aria-level="5"], +.ui-dialog .tab-content .charsheet *[aria-level="5"] { + font-size: 1rem; + font-style: normal; + font-family: var(--midHeaderFont); +} +.sheet-rolltemplate-backbone h5 :not(input), .ui-dialog .tab-content .charsheet h5 :not(input), +.sheet-rolltemplate-backbone *[aria-level="5"] :not(input), +.ui-dialog .tab-content .charsheet *[aria-level="5"] :not(input), .sheet-rolltemplate-backbone h5:not(input), .ui-dialog .tab-content .charsheet h5:not(input), +.sheet-rolltemplate-backbone [aria-level="5"]:not(input), +.ui-dialog .tab-content .charsheet [aria-level="5"]:not(input) { + text-align: center; +} + +.sheet-rolltemplate-backbone span, .ui-dialog .tab-content .charsheet span, +.sheet-rolltemplate-backbone input, +.ui-dialog .tab-content .charsheet input, +.sheet-rolltemplate-backbone textarea, +.ui-dialog .tab-content .charsheet textarea, +.sheet-rolltemplate-backbone p, +.ui-dialog .tab-content .charsheet p { + font-size: 1rem; + color: var(--fontColor); +} +.sheet-rolltemplate-backbone span, .ui-dialog .tab-content .charsheet span, .sheet-rolltemplate-backbone input, .ui-dialog .tab-content .charsheet input, .sheet-rolltemplate-backbone textarea, .ui-dialog .tab-content .charsheet textarea, .sheet-rolltemplate-backbone button, .ui-dialog .tab-content .charsheet button, .sheet-rolltemplate-backbone select, .ui-dialog .tab-content .charsheet select { + font-family: var(--contentFont); +} +.sheet-rolltemplate-backbone .tiny-text, .ui-dialog .tab-content .charsheet .tiny-text, +.sheet-rolltemplate-backbone .sheet-tiny-text, +.ui-dialog .tab-content .charsheet .sheet-tiny-text { + font-size: 0.75rem; +} +.sheet-rolltemplate-backbone .uppercase, .ui-dialog .tab-content .charsheet .uppercase { + text-transform: uppercase !important; +} + +.ui-dialog .tab-content .charsheet .tabs > nav .tabs__button, .sheet-rolltemplate-backbone .text-collapse__check:not(:checked) + .text-collapse, .ui-dialog .tab-content .charsheet .text-collapse__check:not(:checked) + .text-collapse, .sheet-rolltemplate-backbone .control-button, .ui-dialog .tab-content .charsheet .control-button, .sheet-rolltemplate-backbone :is(.underlined, .boxed):not([readonly]):not([type=checkbox]):not([type=radio]):is(:hover, :focus, :focus-within), .ui-dialog .tab-content .charsheet :is(.underlined, .boxed):not([readonly]):not([type=checkbox]):not([type=radio]):is(:hover, :focus, :focus-within) { + border-width: 1px 3px; + border-style: solid; + border-color: var(--borderColor); + border-radius: 5px; + box-sizing: border-box; +} + +.sheet-rolltemplate-backbone .adaptive > span, .ui-dialog .tab-content .charsheet .adaptive > span, .sheet-rolltemplate-backbone select, .ui-dialog .tab-content .charsheet select, +.sheet-rolltemplate-backbone .pseudo-select span, +.ui-dialog .tab-content .charsheet .pseudo-select span, +.sheet-rolltemplate-backbone .sheet-pseudo-select span, +.ui-dialog .tab-content .charsheet .sheet-pseudo-select span, +.sheet-rolltemplate-backbone input:not(:where([type=checkbox], [type=radio])), +.ui-dialog .tab-content .charsheet input:not(:where([type=checkbox], [type=radio])), +.sheet-rolltemplate-backbone .uneditable-input, +.ui-dialog .tab-content .charsheet .uneditable-input, +.sheet-rolltemplate-backbone textarea, +.ui-dialog .tab-content .charsheet textarea, .sheet-rolltemplate-backbone .underlined, .ui-dialog .tab-content .charsheet .underlined, +.sheet-rolltemplate-backbone .sheet-underlined, +.ui-dialog .tab-content .charsheet .sheet-underlined { + border-width: 1px 3px; + border-style: solid; + border-radius: 5px; + border-color: transparent; + box-sizing: border-box; +} + +.sheet-rolltemplate-backbone .boxed, .ui-dialog .tab-content .charsheet .boxed, +.sheet-rolltemplate-backbone .sheet-boxed, +.ui-dialog .tab-content .charsheet .sheet-boxed { + border: 2px solid var(--borderColor); + border-radius: 0; + box-sizing: border-box; +} + +.sheet-rolltemplate-backbone .boxed.thick-left, .ui-dialog .tab-content .charsheet .boxed.thick-left, +.sheet-rolltemplate-backbone .sheet-boxed.thick-left, +.ui-dialog .tab-content .charsheet .sheet-boxed.thick-left { + border-left-width: 5px; +} +.sheet-rolltemplate-backbone .boxed.thick-bottom, .ui-dialog .tab-content .charsheet .boxed.thick-bottom, +.sheet-rolltemplate-backbone .sheet-boxed.thick-bottom, +.ui-dialog .tab-content .charsheet .sheet-boxed.thick-bottom { + border-bottom-width: 5px; +} +.sheet-rolltemplate-backbone .boxed.thick-right, .ui-dialog .tab-content .charsheet .boxed.thick-right, +.sheet-rolltemplate-backbone .sheet-boxed.thick-right, +.ui-dialog .tab-content .charsheet .sheet-boxed.thick-right { + border-right-width: 5px; +} +.sheet-rolltemplate-backbone .boxed.thick-top, .ui-dialog .tab-content .charsheet .boxed.thick-top, +.sheet-rolltemplate-backbone .sheet-boxed.thick-top, +.ui-dialog .tab-content .charsheet .sheet-boxed.thick-top { + border-top-width: 5px; +} +.sheet-rolltemplate-backbone .underlined, .ui-dialog .tab-content .charsheet .underlined, +.sheet-rolltemplate-backbone .sheet-underlined, +.ui-dialog .tab-content .charsheet .sheet-underlined { + border-radius: 0; + border-bottom: 1px solid var(--borderColor); + transition: var(--focusTrans); +} +.sheet-rolltemplate-backbone :is(.underlined, .boxed):not([readonly]):not([type=checkbox]):not([type=radio]):is(:focus, :focus-within), .ui-dialog .tab-content .charsheet :is(.underlined, .boxed):not([readonly]):not([type=checkbox]):not([type=radio]):is(:focus, :focus-within) { + background-color: var(--subHeadBackColor); +} +.sheet-rolltemplate-backbone .underlined--invisible, .ui-dialog .tab-content .charsheet .underlined--invisible { + border-color: transparent !important; +} + +.ui-dialog .tab-content .charsheet .styled-button { + box-shadow: rgba(0, 0, 0, 0.16) 0px 3px 6px, rgba(0, 0, 0, 0.23) 0px 3px 6px; +} + +.sheet-rolltemplate-backbone .repcontrol_edit:after, .ui-dialog .tab-content .charsheet .repcontrol_edit:after, .sheet-rolltemplate-backbone .repcontrol-button--add, .ui-dialog .tab-content .charsheet .repcontrol-button--add { + background-color: rgba(220, 220, 220, 0.2); + border-radius: 5px; + box-shadow: 0 2px 4px black; + border-width: 0; + transition-property: box-shadow, backdrop-filter; + transition-duration: 200ms; + transition-timing-function: ease-out; + backdrop-filter: blur(1px); + overflow: hidden; +} +.sheet-rolltemplate-backbone .repcontrol_edit:is(:hover, :focus):after, .ui-dialog .tab-content .charsheet .repcontrol_edit:is(:hover, :focus):after, .sheet-rolltemplate-backbone .repcontrol-button--add:is(:hover, :focus), .ui-dialog .tab-content .charsheet .repcontrol-button--add:is(:hover, :focus) { + background-color: rgba(133, 133, 133, 0.5019607843); + box-shadow: 0 4px 6px black; + backdrop-filter: blur(2px); +} +.sheet-rolltemplate-backbone .repcontrol_edit:active:after, .ui-dialog .tab-content .charsheet .repcontrol_edit:active:after, .sheet-rolltemplate-backbone .repcontrol-button--add:active, .ui-dialog .tab-content .charsheet .repcontrol-button--add:active { + background-color: #858585; + box-shadow: 0 1px 2px black; + backdrop-filter: blur(0px); +} + +.sheet-rolltemplate-backbone .repcontrol_edit:after, .ui-dialog .tab-content .charsheet .repcontrol_edit:after, .sheet-rolltemplate-backbone .repcontrol-button--add, .ui-dialog .tab-content .charsheet .repcontrol-button--add { + padding: 5px 7px; +} + +.sheet-rolltemplate-backbone button, .ui-dialog .tab-content .charsheet button { + cursor: pointer; +} +.sheet-rolltemplate-backbone .roller, .ui-dialog .tab-content .charsheet .roller { + display: flex; + gap: var(--half-gap); + align-items: center; +} +.sheet-rolltemplate-backbone .roller:before, .ui-dialog .tab-content .charsheet .roller:before { + font-family: dicefontd20; + content: "T"; +} +.sheet-rolltemplate-backbone .control-button, .ui-dialog .tab-content .charsheet .control-button { + align-self: center; + padding-inline: var(--tiny-gap); + transition-property: background-color, color; + transition-duration: var(--revealTime); + transition-timing-function: ease; +} +.sheet-rolltemplate-backbone .control-button:hover, .ui-dialog .tab-content .charsheet .control-button:hover { + background-color: var(--borderColor); + color: var(--backColor); +} + +.sheet-rolltemplate-backbone input:is([type=checkbox], [type=radio]):not(.collapse):not(.fill-left__radio):checked:before, .ui-dialog .tab-content .charsheet input:is([type=checkbox], [type=radio]):not(.collapse):not(.fill-left__radio):checked:before { + content: "✓"; + grid-area: content; + font-weight: bold; + place-self: start center; + color: var(--checkColor); + font-size: 1.5rem; + line-height: 0.5rem; +} + +.sheet-rolltemplate-backbone input, .ui-dialog .tab-content .charsheet input { + width: auto; + font-family: var(--topHeaderFont); +} +.sheet-rolltemplate-backbone input:placeholder, .ui-dialog .tab-content .charsheet input:placeholder { + color: rgba(237, 237, 237, 0.5019607843); +} +.sheet-rolltemplate-backbone input.plus-control:not([value*="-"]) + span:before, .ui-dialog .tab-content .charsheet input.plus-control:not([value*="-"]) + span:before { + content: "+"; +} +.sheet-rolltemplate-backbone input[readonly], .ui-dialog .tab-content .charsheet input[readonly] { + border: 0; +} +.sheet-rolltemplate-backbone input:is([type=checkbox], [type=radio]), .ui-dialog .tab-content .charsheet input:is([type=checkbox], [type=radio]) { + border: 1px solid var(--borderColor); + cursor: pointer; + -webkit-appearance: none; + appearance: none; + width: 14px; + min-width: 14px; + height: 14px; + min-height: 14px; + display: grid; + grid-template-columns: 1fr; + grid-template-areas: "content"; +} +.sheet-rolltemplate-backbone input[type=number], .ui-dialog .tab-content .charsheet input[type=number] { + width: 3rem; + -moz-appearance: textfield !important; + text-align: center; +} +.sheet-rolltemplate-backbone input[type=number]::-webkit-inner-spin-button, .ui-dialog .tab-content .charsheet input[type=number]::-webkit-inner-spin-button, .sheet-rolltemplate-backbone input[type=number]::-webkit-outer-spin-button, .ui-dialog .tab-content .charsheet input[type=number]::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} +.sheet-rolltemplate-backbone select, .ui-dialog .tab-content .charsheet select, +.sheet-rolltemplate-backbone .pseudo-select span, +.ui-dialog .tab-content .charsheet .pseudo-select span, +.sheet-rolltemplate-backbone .sheet-pseudo-select span, +.ui-dialog .tab-content .charsheet .sheet-pseudo-select span, +.sheet-rolltemplate-backbone textarea, +.ui-dialog .tab-content .charsheet textarea, +.sheet-rolltemplate-backbone input:not(:is([type=radio], [type=checkbox])), +.ui-dialog .tab-content .charsheet input:not(:is([type=radio], [type=checkbox])), +.sheet-rolltemplate-backbone .uneditable-input, +.ui-dialog .tab-content .charsheet .uneditable-input { + padding: 2px; +} +.sheet-rolltemplate-backbone input:is([type=text], [type=number]), .ui-dialog .tab-content .charsheet input:is([type=text], [type=number]), .sheet-rolltemplate-backbone textarea, .ui-dialog .tab-content .charsheet textarea { + cursor: auto; +} +.sheet-rolltemplate-backbone select, .ui-dialog .tab-content .charsheet select, +.sheet-rolltemplate-backbone .sheet-pseudo-select span, +.ui-dialog .tab-content .charsheet .sheet-pseudo-select span, +.sheet-rolltemplate-backbone .pseudo-select span, +.ui-dialog .tab-content .charsheet .pseudo-select span { + -webkit-apperance: none; + appearance: none; + text-transform: capitalize; + overflow: hidden !important; + white-space: nowrap; + text-overflow: ellipsis; + text-align: center; + color: var(--fontColor); +} +.sheet-rolltemplate-backbone textarea, .ui-dialog .tab-content .charsheet textarea { + resize: vertical; + white-space: pre-wrap; +} +.sheet-rolltemplate-backbone textarea.fixed, .ui-dialog .tab-content .charsheet textarea.fixed { + resize: none; + overflow: auto; +} + +.sheet-rolltemplate-backbone .stacked.input-label, .ui-dialog .tab-content .charsheet .stacked.input-label { + flex-direction: column; +} +.sheet-rolltemplate-backbone .stacked.center.input-label > *, .ui-dialog .tab-content .charsheet .stacked.center.input-label > * { + text-align: center; +} +.sheet-rolltemplate-backbone .stacked.input-label > [name]:not([type=number]):not([type=checkbox]):not([type=radio]), .ui-dialog .tab-content .charsheet .stacked.input-label > [name]:not([type=number]):not([type=checkbox]):not([type=radio]) { + width: 100%; +} + +.sheet-rolltemplate-backbone .input-label, .ui-dialog .tab-content .charsheet .input-label { + display: inline-flex; + gap: var(--half-gap); + align-items: center; +} +.sheet-rolltemplate-backbone .input-label:not(.stacked) > input[type=text], .ui-dialog .tab-content .charsheet .input-label:not(.stacked) > input[type=text] { + flex: 1 1 0; +} +.sheet-rolltemplate-backbone .input-label:not(.stacked) > :not([name]), .ui-dialog .tab-content .charsheet .input-label:not(.stacked) > :not([name]) { + flex: 0 0 auto; +} +.sheet-rolltemplate-backbone .input-label > :is(span, button), .ui-dialog .tab-content .charsheet .input-label > :is(span, button) { + text-transform: capitalize; +} +.sheet-rolltemplate-backbone .input-label--dual, .ui-dialog .tab-content .charsheet .input-label--dual { + grid-template-columns: 1fr auto 1fr; + grid-template-areas: "over over over" "under under under"; +} +.sheet-rolltemplate-backbone .input-label--dual > span:last-of-type, .ui-dialog .tab-content .charsheet .input-label--dual > span:last-of-type { + grid-column: 1/-1; +} +.sheet-rolltemplate-backbone .input-label--dual > input:not([type=number]):not([type=checkbox]):not([type=radio]), .ui-dialog .tab-content .charsheet .input-label--dual > input:not([type=number]):not([type=checkbox]):not([type=radio]) { + width: 100%; +} +.sheet-rolltemplate-backbone .input-label--dual > .slash, .ui-dialog .tab-content .charsheet .input-label--dual > .slash { + line-height: 0rem; + font-weight: normal; +} + +.sheet-rolltemplate-backbone .collapse-container, .ui-dialog .tab-content .charsheet .collapse-container { + position: relative; +} +.sheet-rolltemplate-backbone .text-collapse, .ui-dialog .tab-content .charsheet .text-collapse { + cursor: pointer; + display: flex; + justify-content: flex-start; + align-items: center; +} +.sheet-rolltemplate-backbone .text-collapse:before, .ui-dialog .tab-content .charsheet .text-collapse:before { + content: "unfold_less"; +} +.sheet-rolltemplate-backbone .text-collapse__text, .ui-dialog .tab-content .charsheet .text-collapse__text { + display: inline; +} +.sheet-rolltemplate-backbone .text-collapse__check:checked + .text-collapse:before, .ui-dialog .tab-content .charsheet .text-collapse__check:checked + .text-collapse:before { + content: "unfold_more"; +} +.sheet-rolltemplate-backbone .repitem:hover .collapse, .ui-dialog .tab-content .charsheet .repitem:hover .collapse, .sheet-rolltemplate-backbone .repitem:hover .roll-container, .ui-dialog .tab-content .charsheet .repitem:hover .roll-container, +.sheet-rolltemplate-backbone .collapse-container:hover .collapse, +.ui-dialog .tab-content .charsheet .collapse-container:hover .collapse, +.sheet-rolltemplate-backbone .collapse-container:hover .roll-container, +.ui-dialog .tab-content .charsheet .collapse-container:hover .roll-container { + opacity: 1; +} +.sheet-rolltemplate-backbone .repitem .collapse, .ui-dialog .tab-content .charsheet .repitem .collapse, +.sheet-rolltemplate-backbone .collapse-container .collapse, +.ui-dialog .tab-content .charsheet .collapse-container .collapse { + opacity: 0; + position: absolute; + right: -10px; + top: 0px; + border: 0px solid black; + border-radius: 0; + color: var(--selectedColor); + text-transform: none; + background-color: transparent; +} +.sheet-rolltemplate-backbone .repitem .collapse:before, .ui-dialog .tab-content .charsheet .repitem .collapse:before, +.sheet-rolltemplate-backbone .collapse-container .collapse:before, +.ui-dialog .tab-content .charsheet .collapse-container .collapse:before { + content: "y"; + font-family: pictos; +} +.sheet-rolltemplate-backbone .repitem .collapse:checked, .ui-dialog .tab-content .charsheet .repitem .collapse:checked, +.sheet-rolltemplate-backbone .collapse-container .collapse:checked, +.ui-dialog .tab-content .charsheet .collapse-container .collapse:checked { + color: var(--unselectedColor1); + background-color: transparent; +} +.sheet-rolltemplate-backbone .repitem .collapse:checked ~ .expanded, .ui-dialog .tab-content .charsheet .repitem .collapse:checked ~ .expanded, +.sheet-rolltemplate-backbone .repitem .collapse:checked ~ .collapse-container .expanded, +.ui-dialog .tab-content .charsheet .repitem .collapse:checked ~ .collapse-container .expanded, +.sheet-rolltemplate-backbone .collapse-container .collapse:checked ~ .expanded, +.ui-dialog .tab-content .charsheet .collapse-container .collapse:checked ~ .expanded, +.sheet-rolltemplate-backbone .collapse-container .collapse:checked ~ .collapse-container .expanded, +.ui-dialog .tab-content .charsheet .collapse-container .collapse:checked ~ .collapse-container .expanded { + display: none !important; +} +.sheet-rolltemplate-backbone .repitem .collapse:checked ~ .expanded--empty:is(:not([value]), [value=""]) + *, .ui-dialog .tab-content .charsheet .repitem .collapse:checked ~ .expanded--empty:is(:not([value]), [value=""]) + *, +.sheet-rolltemplate-backbone .collapse-container .collapse:checked ~ .expanded--empty:is(:not([value]), [value=""]) + *, +.ui-dialog .tab-content .charsheet .collapse-container .collapse:checked ~ .expanded--empty:is(:not([value]), [value=""]) + * { + display: none !important; +} +.sheet-rolltemplate-backbone .repitem .collapse:not(:checked) ~ .collapsed, .ui-dialog .tab-content .charsheet .repitem .collapse:not(:checked) ~ .collapsed, +.sheet-rolltemplate-backbone .repitem .collapse:not(:checked) ~ .collapse-container .collapsed, +.ui-dialog .tab-content .charsheet .repitem .collapse:not(:checked) ~ .collapse-container .collapsed, +.sheet-rolltemplate-backbone .collapse-container .collapse:not(:checked) ~ .collapsed, +.ui-dialog .tab-content .charsheet .collapse-container .collapse:not(:checked) ~ .collapsed, +.sheet-rolltemplate-backbone .collapse-container .collapse:not(:checked) ~ .collapse-container .collapsed, +.ui-dialog .tab-content .charsheet .collapse-container .collapse:not(:checked) ~ .collapse-container .collapsed { + display: none !important; +} +.sheet-rolltemplate-backbone .repitem .collapse:hover, .ui-dialog .tab-content .charsheet .repitem .collapse:hover, +.sheet-rolltemplate-backbone .collapse-container .collapse:hover, +.ui-dialog .tab-content .charsheet .collapse-container .collapse:hover { + color: var(--selectedColor); +} +.sheet-rolltemplate-backbone .repcontainer.editmode .collapse, .ui-dialog .tab-content .charsheet .repcontainer.editmode .collapse { + display: none; +} +.sheet-rolltemplate-backbone .section-control:not(:checked) + .section-display, .ui-dialog .tab-content .charsheet .section-control:not(:checked) + .section-display { + display: none !important; +} +.sheet-rolltemplate-backbone .empty-hider:is([value=""], :not([value])) + *, .ui-dialog .tab-content .charsheet .empty-hider:is([value=""], :not([value])) + * { + display: none; +} + +.sheet-rolltemplate-backbone .adaptive, .ui-dialog .tab-content .charsheet .adaptive { + display: grid; + grid-template-columns: auto; + grid-template-rows: auto; + grid-template-areas: "content"; + position: relative; +} +.sheet-rolltemplate-backbone .adaptive > *, .ui-dialog .tab-content .charsheet .adaptive > * { + grid-area: content; +} +.sheet-rolltemplate-backbone .adaptive > span, .ui-dialog .tab-content .charsheet .adaptive > span { + opacity: 0; + z-index: -10; + text-transform: initial; + border-radius: 0px; +} +.sheet-rolltemplate-backbone .adaptive--text, .ui-dialog .tab-content .charsheet .adaptive--text { + min-height: 4rem; +} +.sheet-rolltemplate-backbone .adaptive--text__span, .ui-dialog .tab-content .charsheet .adaptive--text__span { + white-space: pre-wrap; + padding: 2px; +} +.sheet-rolltemplate-backbone .adaptive--text__textarea, .ui-dialog .tab-content .charsheet .adaptive--text__textarea { + width: 100%; + height: 100%; + resize: none; +} +.sheet-rolltemplate-backbone .adaptive--text__textarea, .ui-dialog .tab-content .charsheet .adaptive--text__textarea, +.sheet-rolltemplate-backbone .adaptive--input__input, +.ui-dialog .tab-content .charsheet .adaptive--input__input { + position: absolute; +} +.sheet-rolltemplate-backbone .adaptive--input__input, .ui-dialog .tab-content .charsheet .adaptive--input__input { + width: 100%; +} +.sheet-rolltemplate-backbone .adaptive--input__span, .ui-dialog .tab-content .charsheet .adaptive--input__span { + padding: 2px; + min-height: 1.5rem; +} + +.sheet-rolltemplate-backbone .headed-textarea, .ui-dialog .tab-content .charsheet .headed-textarea { + display: grid; + grid-template-rows: auto 1fr; + grid-template-columns: auto; + grid-column: 1/-1; +} +.sheet-rolltemplate-backbone .headed-textarea :not(textarea):not(.adaptive), .ui-dialog .tab-content .charsheet .headed-textarea :not(textarea):not(.adaptive) { + justify-self: start; +} +.sheet-rolltemplate-backbone .headed-textarea .headed-textarea__header, .ui-dialog .tab-content .charsheet .headed-textarea .headed-textarea__header { + grid-area: initial; +} + +.sheet-rolltemplate-backbone .repitem > input:not([type=checkbox]), .ui-dialog .tab-content .charsheet .repitem > input:not([type=checkbox]) { + width: 100%; +} +.sheet-rolltemplate-backbone .repitem .headed-textarea, .ui-dialog .tab-content .charsheet .repitem .headed-textarea, +.sheet-rolltemplate-backbone .repitem .description, +.ui-dialog .tab-content .charsheet .repitem .description { + grid-column: 1/-1; +} +.sheet-rolltemplate-backbone .repcontainer, .ui-dialog .tab-content .charsheet .repcontainer { + display: grid; + gap: var(--grid-gap); +} +.sheet-rolltemplate-backbone .repeating-container, .ui-dialog .tab-content .charsheet .repeating-container { + display: grid; + grid-template-areas: "header"; + align-self: start; +} +.sheet-rolltemplate-backbone .repeating-container > .header, .ui-dialog .tab-content .charsheet .repeating-container > .header { + grid-area: header; +} +.sheet-rolltemplate-backbone .repeating-container:is(:hover, :focus-within, :focus) .repcontrol_edit:after, .ui-dialog .tab-content .charsheet .repeating-container:is(:hover, :focus-within, :focus) .repcontrol_edit:after, +.sheet-rolltemplate-backbone .repeating-container:is(:hover, :focus-within, :focus) .repcontrol-button, +.ui-dialog .tab-content .charsheet .repeating-container:is(:hover, :focus-within, :focus) .repcontrol-button { + opacity: 1; +} +.sheet-rolltemplate-backbone .repcontrol_edit, .ui-dialog .tab-content .charsheet .repcontrol_edit { + visibility: hidden; + text-transform: none; +} +.sheet-rolltemplate-backbone .repcontrol_edit:after, .ui-dialog .tab-content .charsheet .repcontrol_edit:after { + opacity: 0; + transition-property: opacity, background-color; + transition-duration: var(--revealTime); + font-family: pictos; + visibility: visible; + content: "p"; +} +.sheet-rolltemplate-backbone .repcontrol-button, .ui-dialog .tab-content .charsheet .repcontrol-button { + grid-area: header; + align-self: start; +} +.sheet-rolltemplate-backbone .repcontrol-button ~ .repcontrol, .ui-dialog .tab-content .charsheet .repcontrol-button ~ .repcontrol { + display: contents; +} +.sheet-rolltemplate-backbone .repcontrol-button ~ .repcontrol .repcontrol_edit, .ui-dialog .tab-content .charsheet .repcontrol-button ~ .repcontrol .repcontrol_edit { + grid-area: header; + align-self: start; + justify-self: end; + display: flex; + float: none; +} +.sheet-rolltemplate-backbone .repcontrol-button ~ .repcontrol .repcontrol_add, .ui-dialog .tab-content .charsheet .repcontrol-button ~ .repcontrol .repcontrol_add { + display: none !important; +} +.sheet-rolltemplate-backbone .repcontrol-button--add, .ui-dialog .tab-content .charsheet .repcontrol-button--add { + justify-self: start; + opacity: 0; + transition-property: opacity, background-color; + transition-duration: var(--revealTime); + font-family: pictos; +} +.sheet-rolltemplate-backbone .repcontrol-button--add:before, .ui-dialog .tab-content .charsheet .repcontrol-button--add:before { + font-family: pictos; + content: "&"; +} + +.ui-dialog .tab-content .charsheet .circle { + border-radius: 50%; +} + +.sheet-rolltemplate-backbone .ratio1-1, .ui-dialog .tab-content .charsheet .ratio1-1, +.sheet-rolltemplate-backbone .sheet-ratio1-1, +.ui-dialog .tab-content .charsheet .sheet-ratio1-1 { + aspect-ratio: 1/1; +} + +.sheet-rolltemplate-backbone .fill-left, .ui-dialog .tab-content .charsheet .fill-left { + display: flex; + align-self: center; + box-sizing: border-box; +} +.sheet-rolltemplate-backbone .fill-left__radio, .ui-dialog .tab-content .charsheet .fill-left__radio { + appearance: none; + -webkit-appearance: none; + background-color: var(--selectedColor); + width: var(--fillLeftRadioWidth); + height: var(--fillLeftRadioHeight); + cursor: pointer; +} +.sheet-rolltemplate-backbone .fill-left__radio[data-value], .ui-dialog .tab-content .charsheet .fill-left__radio[data-value] { + display: grid; + grid-template-areas: "content"; + place-items: center; +} +.sheet-rolltemplate-backbone .fill-left__radio[data-value] > *, .ui-dialog .tab-content .charsheet .fill-left__radio[data-value] > * { + grid-area: content; +} +.sheet-rolltemplate-backbone .fill-left__radio[data-value]:checked:before, .ui-dialog .tab-content .charsheet .fill-left__radio[data-value]:checked:before { + content: attr(data-value); + color: var(--backColor); + font-size: 1rem; + place-self: center; + text-transform: uppercase; +} +.sheet-rolltemplate-backbone .fill-left__radio:checked ~ .fill-left__radio, .ui-dialog .tab-content .charsheet .fill-left__radio:checked ~ .fill-left__radio { + background-color: var(--unselectedColor2); +} + +.sheet-rolltemplate-backbone .inline, .ui-dialog .tab-content .charsheet .inline, +.sheet-rolltemplate-backbone .sheet-inline, +.ui-dialog .tab-content .charsheet .sheet-inline { + display: inline !important; +} +.sheet-rolltemplate-backbone .inline-flex-box, .ui-dialog .tab-content .charsheet .inline-flex-box, +.sheet-rolltemplate-backbone .sheet-inline-flex-box, +.ui-dialog .tab-content .charsheet .sheet-inline-flex-box { + display: inline-flex !important; +} +.sheet-rolltemplate-backbone .flex-box, .ui-dialog .tab-content .charsheet .flex-box, +.sheet-rolltemplate-backbone .sheet-flex-box, +.ui-dialog .tab-content .charsheet .sheet-flex-box { + display: flex; +} +.sheet-rolltemplate-backbone .flex-wrap, .ui-dialog .tab-content .charsheet .flex-wrap, +.sheet-rolltemplate-backbone .sheet-flex-wrap, +.ui-dialog .tab-content .charsheet .sheet-flex-wrap { + flex-wrap: wrap; +} +.sheet-rolltemplate-backbone .justify-space-around, .ui-dialog .tab-content .charsheet .justify-space-around, +.sheet-rolltemplate-backbone .sheet-justify-space-around, +.ui-dialog .tab-content .charsheet .sheet-justify-space-around { + justify-content: space-around; +} +.sheet-rolltemplate-backbone .justify-space-between, .ui-dialog .tab-content .charsheet .justify-space-between, +.sheet-rolltemplate-backbone .sheet-justify-space-between, +.ui-dialog .tab-content .charsheet .sheet-justify-space-between { + justify-content: space-between; +} +.sheet-rolltemplate-backbone .justify-center, .ui-dialog .tab-content .charsheet .justify-center, +.sheet-rolltemplate-backbone .sheet-justify-center, +.ui-dialog .tab-content .charsheet .sheet-justify-center { + justify-content: center; +} +.sheet-rolltemplate-backbone .stacked, .ui-dialog .tab-content .charsheet .stacked, +.sheet-rolltemplate-backbone .sheet-stacked, +.ui-dialog .tab-content .charsheet .sheet-stacked { + flex-direction: column; +} +.sheet-rolltemplate-backbone .stacked.center, .ui-dialog .tab-content .charsheet .stacked.center, .sheet-rolltemplate-backbone .stacked.sheet-center, .ui-dialog .tab-content .charsheet .stacked.sheet-center, +.sheet-rolltemplate-backbone .sheet-stacked.center, +.ui-dialog .tab-content .charsheet .sheet-stacked.center, +.sheet-rolltemplate-backbone .sheet-stacked.sheet-center, +.ui-dialog .tab-content .charsheet .sheet-stacked.sheet-center { + align-items: center; +} +.sheet-rolltemplate-backbone .stacked.center > *, .ui-dialog .tab-content .charsheet .stacked.center > *, +.sheet-rolltemplate-backbone .sheet-stacked.sheet-stacked > *, +.ui-dialog .tab-content .charsheet .sheet-stacked.sheet-stacked > * { + text-align: center; +} +.sheet-rolltemplate-backbone .stacked:not(.center):not(.sheet-center), .ui-dialog .tab-content .charsheet .stacked:not(.center):not(.sheet-center), +.sheet-rolltemplate-backbone .sheet-stacked:not(.center):not(.sheet-center), +.ui-dialog .tab-content .charsheet .sheet-stacked:not(.center):not(.sheet-center) { + align-items: start; +} +.sheet-rolltemplate-backbone .stacked > [name]:not([type=number]):not([type=checkbox]):not([type=radio]), .ui-dialog .tab-content .charsheet .stacked > [name]:not([type=number]):not([type=checkbox]):not([type=radio]), +.sheet-rolltemplate-backbone .sheet-stacked > [name]:not([type=number]):not([type=checkbox]):not([type=radio]), +.ui-dialog .tab-content .charsheet .sheet-stacked > [name]:not([type=number]):not([type=checkbox]):not([type=radio]) { + width: 100%; +} +.sheet-rolltemplate-backbone .span-2, .ui-dialog .tab-content .charsheet .span-2, +.sheet-rolltemplate-backbone .sheet-span-2, +.ui-dialog .tab-content .charsheet .sheet-span-2 { + grid-column: span 2; +} +.sheet-rolltemplate-backbone .span-all, .ui-dialog .tab-content .charsheet .span-all, +.sheet-rolltemplate-backbone .sheet-span-all, +.ui-dialog .tab-content .charsheet .sheet-span-all { + grid-column: 1/-1; +} +.sheet-rolltemplate-backbone .row-reverse, .ui-dialog .tab-content .charsheet .row-reverse, +.sheet-rolltemplate-backbone .sheet-row-reverse, +.ui-dialog .tab-content .charsheet .sheet-row-reverse { + flex-direction: row-reverse; +} +.sheet-rolltemplate-backbone .column-reverse, .ui-dialog .tab-content .charsheet .column-reverse, +.sheet-rolltemplate-backbone .sheet-column-reverse, +.ui-dialog .tab-content .charsheet .sheet-column-reverse { + flex-direction: column-reverse; +} +.sheet-rolltemplate-backbone .no-gap, .ui-dialog .tab-content .charsheet .no-gap, +.sheet-rolltemplate-backbone .sheet-no-gap, +.ui-dialog .tab-content .charsheet .sheet-no-gap { + gap: 0; +} +.sheet-rolltemplate-backbone .gap, .ui-dialog .tab-content .charsheet .gap, +.sheet-rolltemplate-backbone .sheet-gap, +.ui-dialog .tab-content .charsheet .sheet-gap { + gap: var(--grid-gap); +} +.sheet-rolltemplate-backbone .half-gap, .ui-dialog .tab-content .charsheet .half-gap, +.sheet-rolltemplate-backbone .sheet-half-gap, +.ui-dialog .tab-content .charsheet .sheet-half-gap { + gap: var(--half-gap); +} +.sheet-rolltemplate-backbone .tiny-gap, .ui-dialog .tab-content .charsheet .tiny-gap, +.sheet-rolltemplate-backbone .sheet-tiny-gap, +.ui-dialog .tab-content .charsheet .sheet-tiny-gap { + gap: var(--tiny-gap); +} +.sheet-rolltemplate-backbone .big-gap, .ui-dialog .tab-content .charsheet .big-gap, +.sheet-rolltemplate-backbone .sheet-big-gap, +.ui-dialog .tab-content .charsheet .sheet-big-gap { + gap: var(--big-gap); +} +.sheet-rolltemplate-backbone .no-gap, .ui-dialog .tab-content .charsheet .no-gap, +.sheet-rolltemplate-backbone .sheet-no-gap, +.ui-dialog .tab-content .charsheet .sheet-no-gap { + gap: 0; +} +.sheet-rolltemplate-backbone .flex-min-content, .ui-dialog .tab-content .charsheet .flex-min-content, +.sheet-rolltemplate-backbone .sheet-flex-min-content, +.ui-dialog .tab-content .charsheet .sheet-flex-min-content { + flex: 1 1 min-content; +} +.sheet-rolltemplate-backbone input.flex-min-content, .ui-dialog .tab-content .charsheet input.flex-min-content, +.sheet-rolltemplate-backbone input.sheet-flex-min-content, +.ui-dialog .tab-content .charsheet input.sheet-flex-min-content { + width: 0; +} +.sheet-rolltemplate-backbone .align-self-stretch, .ui-dialog .tab-content .charsheet .align-self-stretch, +.sheet-rolltemplate-backbone .sheet-align-self-stretch, +.ui-dialog .tab-content .charsheet .sheet-align-self-stretch { + align-self: stretch; +} +.sheet-rolltemplate-backbone .align-self-start, .ui-dialog .tab-content .charsheet .align-self-start, +.sheet-rolltemplate-backbone .sheet-align-self-start, +.ui-dialog .tab-content .charsheet .sheet-align-self-start { + align-self: start; +} +.sheet-rolltemplate-backbone .align-self-end, .ui-dialog .tab-content .charsheet .align-self-end, +.sheet-rolltemplate-backbone .sheet-align-self-end, +.ui-dialog .tab-content .charsheet .sheet-align-self-end { + align-self: end; +} +.sheet-rolltemplate-backbone .align-items-center, .ui-dialog .tab-content .charsheet .align-items-center, +.sheet-rolltemplate-backbone .sheet-align-items-center, +.ui-dialog .tab-content .charsheet .sheet-align-items-center { + align-items: center; +} +.sheet-rolltemplate-backbone .align-items-end, .ui-dialog .tab-content .charsheet .align-items-end, +.sheet-rolltemplate-backbone .sheet-align-items-end, +.ui-dialog .tab-content .charsheet .sheet-align-items-end { + align-items: end; +} +.sheet-rolltemplate-backbone .flex-box > .span-all, .ui-dialog .tab-content .charsheet .flex-box > .span-all { + width: 100%; +} +.sheet-rolltemplate-backbone .tall-2, .ui-dialog .tab-content .charsheet .tall-2 { + grid-row: span 2; +} + +.sheet-rolltemplate-backbone, .ui-dialog { + --topHeaderFont:Arial; + --midHeaderFont:Arial; + --contentFont:Arial; +} + +.sheet-rolltemplate-backbone, .ui-dialog { + --grid-gap: 1rem; + --half-gap: calc(var(--grid-gap) / 2); + --tiny-gap: calc(var(--half-gap) / 2); + --big-gap: calc(var(--grid-gap) * 2); + --spanSectionColumn:1/-1; + --fillLeftRadioSize: 1rem; + --fillLeftRadioWidth:var(--fillLeftRadioSize); + --fillLeftRadioHeight:var(--fillLeftRadioSize); + --revealTime: 500ms; + --delayTime: 200ms; + --inputSwap: opacity var(--revealTime) ease var(--delayTime); + --focusTiming: 500ms ease; + --focusTrans: all var(--focusTiming); + --borderColor: black; + --fontColor: black; + --backColor: #ffffff; + --subHeadBackColor:grey; + --unselectedColor1:lightgrey; + --unselectedColor2:transparent; + --selectedColor:black; + --checkColor:black; + --darkCheck:white; + --displayBorderWidth: 2px; +} + +.sheet-darkmode .ui-dialog { + --borderColor: var(--dark-secondarytext); + --fontColor: var(--dark-secondarytext); + --backColor: var(--dark-surface1); + --selectedColor:var(--fontColor); + --subHeadBackColor:var(--dark-primary); + --checkColor: var(--darkCheck); +} +.sheet-darkmode .ui-dialog img { + filter: brightness(0.8) contrast(1.2); +} + +.sheet-rolltemplate-backbone, .ui-dialog { + --errorColor:red; + --failCircle: url("https://s3.amazonaws.com/files.d20.io/images/318562209/I3x7bfc3_M_QcFnt8tV85Q/original.png?16710625345"); + --successCircle: url("https://s3.amazonaws.com/files.d20.io/images/318562210/oX_VbZJwiNoujxFnSVumpA/original.png?16710625345"); + --conditionIcon: url("https://s3.amazonaws.com/files.d20.io/images/318557936/fEiMDUb_UctEstYyXkKlEA/original.png?16710607145"); + --heart:url("https://s3.amazonaws.com/files.d20.io/images/303476002/EGcfkMfeF7mIRowjCyVy-w/original.png?16625716925"); + --boot:url("https://s3.amazonaws.com/files.d20.io/images/303476005/Ap6DSJSqAVUkpkEwmKazPA/original.png?16625716925"); + --bolt:url("https://s3.amazonaws.com/files.d20.io/images/303476003/7La7gESx4Th7OYnkHc4u2Q/original.png?16625716925"); + --flame:url("https://s3.amazonaws.com/files.d20.io/images/303476004/9l3GwDqA2PNTAULgIvC8EA/original.png?16625716915"); + --armor:url("https://s3.amazonaws.com/files.d20.io/images/303476001/9BHZGaCcM8H3wbj2W23zdw/original.png?16625716925"); + --skull: url("https://s3.amazonaws.com/files.d20.io/images/303477021/Vm1A4GWATnboxP65WqEW0A/original.png?16625722085"); + --borderImageSource: url(https://s3.amazonaws.com/files.d20.io/images/312349470/ovngRYPae8cWAT9W489wJw/original.png?166741640555); + --borderImageSlice: 175 fill; + --maskSize: 20px; + --shadowSize: 0px; + --shadowBlur: 4px; + --shadowColor: rgb(0 0 0 / 0.2); + --shadowColor2: rgb(0 0 0 / 0.1); + --topHeaderFont: "Trade Winds", cursive; + --midHeaderFont: "IM Fell English SC"; + --contentFont: "IM Fell English SC"; + --radioSize:15px; + --columnSize:370px; + --imgInvert: invert(0); +} + +html { + font-size: 16px; +} + +.ui-dialog .tab-content .charsheet { + /* + First of all we apply our default styles. + Note that because we are using the placeholder, these styles would be first up in the cascade even if we put the extend declaration last. + This is done first so that when we read the code, we can easily see that it is applied, and anything after it will overwrite those default styles. + */ + padding-top: 0; +} +.ui-dialog .tab-content .charsheet .repitem .roller:nth-last-child(3) { + padding-right: var(--half-gap); +} +.ui-dialog .tab-content .charsheet .large-parentheses { + align-items: center; + font-size: 2rem; +} +.ui-dialog .tab-content .charsheet .fill-left__radio[data-value]:checked:before { + font-family: var(--contentFont); +} +.ui-dialog .tab-content .charsheet .parentheses { + font-family: var(--topHeaderFont); +} +.ui-dialog .tab-content .charsheet .text-center { + text-align: center; +} +.ui-dialog .tab-content .charsheet .input-controls { + display: grid; + grid-template-columns: [input-start increment-start] auto [increment-end] 1fr [decrement-start] auto [input-end decrement-end]; + grid-template-rows: [increment-start input-start decrement-start] auto [increment-end input-end decrement-end]; +} +.ui-dialog .tab-content .charsheet .input-controls > input { + grid-area: input; +} +.ui-dialog .tab-content .charsheet .input-control--button { + font-family: var(--topHeaderFont); + z-index: 100; +} +.ui-dialog .tab-content .charsheet .input-control--button:first-of-type { + grid-area: increment; +} +.ui-dialog .tab-content .charsheet .input-control--button:last-of-type { + grid-area: decrement; +} +.ui-dialog .tab-content .charsheet .even-flow { + gap: inherit; + display: flex; +} +.ui-dialog .tab-content .charsheet .roller { + display: flex; + gap: var(--half-gap); + align-items: center; +} +.ui-dialog .tab-content .charsheet .roller:before { + font-family: dicefontd20; + content: "T"; +} +.ui-dialog .tab-content .charsheet button { + color: var(--fontColor); + cursor: pointer; +} +.ui-dialog .tab-content .charsheet h3 { + grid-area: header; +} +.ui-dialog .tab-content .charsheet .styled-button { + background-color: var(--backColor); + border: 0; + border-radius: 0.5rem; + box-sizing: border-box; + cursor: pointer; + transition-property: background-color, color; + transition-duration: var(--revealTime); + padding-inline: var(--half-gap); + text-align: center; +} +.ui-dialog .tab-content .charsheet .styled-button:hover { + background-color: var(--selectedColor); +} +.ui-dialog .tab-content .charsheet .styled-button:hover, .ui-dialog .tab-content .charsheet .styled-button:hover * { + color: var(--dark-secondarytext); +} +.ui-dialog .tab-content .charsheet .styled-button:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} +.ui-dialog .tab-content .charsheet .styled-button:focus-visible { + box-shadow: none; +} +.ui-dialog .tab-content .charsheet .styled-button-control:is(:checked, [type=hidden]:not([value=""]):not([value="0"])) + .styled-button--controlled { + background-color: var(--selectedColor); +} +.ui-dialog .tab-content .charsheet .styled-button-control:is(:checked, [type=hidden]:not([value=""]):not([value="0"])) + .styled-button--controlled, .ui-dialog .tab-content .charsheet .styled-button-control:is(:checked, [type=hidden]:not([value=""]):not([value="0"])) + .styled-button--controlled * { + color: var(--dark-secondarytext); +} +.ui-dialog .tab-content .charsheet .parens-holder { + display: flex; + align-items: center; +} +.ui-dialog .tab-content .charsheet .parens-holder > .input-label { + gap: 0; +} +.ui-dialog .tab-content .charsheet .parens-holder > .input-label span { + font-size: 0.8rem; +} +.ui-dialog .tab-content .charsheet .stat-container { + --shadowSize: 1px; + border: 2px solid var(--fontColor); + display: flex; + flex-direction: column; + align-items: center; + break-inside: avoid; + aspect-ratio: 1/1; + justify-content: center; +} +.ui-dialog .tab-content .charsheet .stat-container:not(.circle) { + border-radius: 20px; +} +.ui-dialog .tab-content .charsheet :is(.stat-container, .overlay-content) .input-label__text, +.ui-dialog .tab-content .charsheet :is(.stat-container, .overlay-content) .roller { + text-shadow: var(--shadowSize) 0 var(--backColor), calc(var(--shadowSize) * -1) 0 var(--backColor), 0px var(--shadowSize) var(--backColor), 0px calc(var(--shadowSize) * -1) var(--backColor); +} +.ui-dialog .tab-content .charsheet .overlay-content { + display: grid; + grid-template-areas: content; + place-items: center; +} +.ui-dialog .tab-content .charsheet .overlay-content > * { + grid-area: content !important; +} +.ui-dialog .tab-content .charsheet .overlay-content > .overlaid-content { + z-index: 100; +} +.ui-dialog .tab-content .charsheet .basic-border { + border: 2px solid var(--fontColor); +} +.ui-dialog .tab-content .charsheet .avoid-break { + break-inside: avoid; +} +.ui-dialog .tab-content .charsheet article { + position: relative; +} +.ui-dialog .tab-content .charsheet .text-check span { + transition-duration: var(--revealTime); + transition-property: color, background-color; +} +.ui-dialog .tab-content .charsheet .text-check > input:checked + span { + background-color: var(--selectedColor); + color: var(--backColor); +} + +.ui-dialog .sheetform { + background-color: var(--backColor); + transition-property: background-color; + transition-duration: var(--revealTime); +} + +.sheet-darkmode .ui-dialog { + --imgInvert:invert(0.9); +} + +#main { + display: grid; + grid-area: content; +} + +ul.nav-tabs.nav { + position: sticky; + top: 0; + background-color: var(--backColor); + z-index: 9999; + margin-bottom: 0px; +} + +.ui-dialog .tab-content .charsheet .tabs > nav { + display: flex; + flex-wrap: wrap; + justify-content: end; + align-items: start; + gap: var(--half-gap); + position: sticky; + top: 44px; + margin-bottom: 10px; + padding-inline: 10px; + padding-block: var(--half-gap); + background-color: var(--backColor); + z-index: 1000; + transition-property: background-color; + transition-duration: var(--revealTime); +} +.ui-dialog .tab-content .charsheet .tabs > nav .no-list { + list-style: none; + margin: 0; +} +.ui-dialog .tab-content .charsheet .tabs > nav button { + color: var(--fontColor); +} +.ui-dialog .tab-content .charsheet .tabs > nav .tabs__button { + font-size: 1.5rem; + border-color: transparent; + padding-inline: 0; + transition-property: border-color, color, background-color, padding-inline; + transition-duration: var(--revealTime); + transition-timing-function: ease; +} +.ui-dialog .tab-content .charsheet .tabs > nav .tabs__button:not(.pictos) { + font-family: var(--topHeaderFont); + line-height: 1; +} +.ui-dialog .tab-content .charsheet .tabs > nav .tabs__button.k-active-button { + color: var(--backColor); + background-color: var(--borderColor); + border-color: var(--borderColor); + padding-inline: var(--tiny-gap); +} +.ui-dialog .tab-content .charsheet .tabs > nav .tabs__button.inactive { + display: none !important; +} +.ui-dialog .tab-content .charsheet .tabs > nav .roll-options, +.ui-dialog .tab-content .charsheet .tabs > nav .basic-moves { + display: flex; + flex-wrap: wrap; + grid-gap: var(--half-gap); +} +.ui-dialog .tab-content .charsheet .tabs > nav .basic-moves { + justify-content: space-between; +} +.ui-dialog .tab-content .charsheet .tabs > nav .roll-options { + grid-column: 1; + justify-content: center; +} + +#pc { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(var(--columnSize), 1fr)); + gap: var(--grid-gap); +} +#pc section { + align-self: start; +} + +#character-info { + flex-basis: 100%; + display: flex; + flex-wrap: wrap; +} +#character-info > div { + gap: var(--half-gap); +} +#character-info [aria-level="2"] { + font-size: 1rem; +} +#character-info .input-label input { + width: 50px; + flex: 1 0 auto; +} +#character-info > :first-child { + display: grid; + grid-template-columns: 1fr 1fr; + flex: 1; + padding-right: var(--half-gap); + margin-right: var(--half-gap); + border-right: 1px solid var(--fontColor); +} +#character-info > :first-child > :first-child { + grid-column: 1/-1; +} +#character-info > :nth-child(2) { + flex: 2; + display: grid; + grid-template-columns: repeat(3, 1fr); +} +#character-info > :nth-child(2) > div { + flex: 1 1 0px; +} + +#basic-stats { + grid-column: 1/-1; + display: flex; + flex-wrap: wrap; + align-items: flex-start; + justify-content: center; + gap: var(--big-gap); +} +#basic-stats > div { + flex: 1 0 200px; +} +#basic-stats > :is(.attributes, .characteristics) { + display: flex; + flex-wrap: wrap; + gap: var(--half-gap); + margin: 0; + justify-content: center; +} +#basic-stats > :is(.attributes, .characteristics) .stat-container { + box-sizing: border-box; +} +#basic-stats h2 { + width: 100%; + box-sizing: border-box; + column-span: all; + font-size: 1rem; +} +#basic-stats [aria-level="3"] { + font-size: 0.8rem; +} +#basic-stats .stat-container { + box-sizing: border-box; +} +#basic-stats .armor-movement { + display: flex; + flex-wrap: wrap; + gap: var(--half-gap); + align-items: center; + justify-content: center; +} +#basic-stats .armor-details { + width: 100%; +} +#basic-stats .armor-details span { + font-size: 0.75rem; + text-transform: capitalize; +} + +.characteristics { + flex-grow: 2; +} +.characteristics > .stat-container { + width: 55px; +} + +.attributes .stat-container { + width: 70px; +} + +.armor-movement > .stat-container { + width: 70px; +} +.armor-movement .armor { + position: relative; + isolation: isolate; +} +.armor-movement .armor:before { + border-radius: inherit; + overflow: hidden; + z-index: -1; + filter: var(--imgInvert); + content: ""; + position: absolute; + inset: 0; + background-image: var(--armor); + background-position: center; + background-size: contain; + background-repeat: no-repeat; +} +.armor-movement .movement { + position: relative; + isolation: isolate; +} +.armor-movement .movement:before { + border-radius: inherit; + overflow: hidden; + z-index: -1; + filter: var(--imgInvert); + content: ""; + position: absolute; + inset: 0; + background-image: var(--boot); + background-position: center; + background-size: contain; + background-repeat: no-repeat; +} +.armor-movement .sprint { + position: relative; + isolation: isolate; +} +.armor-movement .sprint:before { + border-radius: inherit; + overflow: hidden; + z-index: -1; + filter: var(--imgInvert); + content: ""; + position: absolute; + inset: 0; + background-image: var(--bolt); + background-position: center; + background-size: contain; + background-repeat: no-repeat; +} + +#combat-stats { + grid-column: 1/-1; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: center; + gap: var(--big-gap); +} +#combat-stats [aria-level="3"], +#combat-stats h3 { + font-size: 0.8rem; +} +#combat-stats .health-container { + display: flex; + gap: var(--half-gap); + height: 70px; +} +#combat-stats .luck-container { + display: grid; + grid-template-columns: auto auto auto; + grid-template-rows: auto auto; + grid-template-areas: "header odd button" "header even button"; + justify-items: end; + column-gap: var(--tiny-gap); +} +#combat-stats .luck-container h3 { + grid-area: header; + writing-mode: vertical-rl; + rotate: 180deg; +} +#combat-stats .luck-container button { + grid-area: button; + place-self: center; +} +#combat-stats .adrenaline-container { + align-items: center; +} +#combat-stats .adrenaline-container input { + font-size: 2rem; +} + +.adrenaline { + position: relative; + isolation: isolate; +} +.adrenaline:before { + border-radius: inherit; + overflow: hidden; + z-index: -1; + filter: var(--imgInvert); + content: ""; + position: absolute; + inset: 0; + background-image: var(--flame); + background-position: center; + background-size: contain; + background-repeat: no-repeat; +} + +.max { + position: relative; + isolation: isolate; +} +.max:before { + border-radius: inherit; + overflow: hidden; + z-index: -1; + background-position: center; + background-size: contain; + background-repeat: no-repeat; + filter: var(--imgInvert); +} +.max.health:before { + content: ""; + position: absolute; + inset: 0; + background-image: var(--heart); +} +.max.resolve:before { + content: ""; + position: absolute; + inset: 0; + background-image: var(--skull); +} + +#skills { + grid-column: 1/-1; + display: flex; + flex-wrap: wrap; + gap: var(--half-gap) var(--big-gap); +} +#skills .stacked { + flex-direction: column-reverse; +} +#skills .fill-left__radio { + border: 1px solid var(--borderColor); +} +#skills .fill-left__radio:first-child { + border-radius: 50% 0 0 50%; +} +#skills .fill-left__radio:before { + line-height: 0; +} +#skills .parens-holder input { + position: relative; + top: var(--half-gap); +} +#skills > .basic-skills { + width: 100%; +} +#skills > .basic-skills > :first-child { + display: flex; + gap: var(--half-gap); + justify-content: space-between; +} +#skills > .basic-skills > h2 { + column-span: all; +} +#skills > .basic-skills > .skill-container { + column-width: var(--columnSize); + column-gap: var(--big-gap); + column-rule: 2px solid var(--fontColor); +} +#skills > .basic-skills > .skill-container > .skill-row { + break-inside: avoid; +} +#skills > :not(.basic-skills) { + flex: 1 1 var(--columnSize); +} +#skills .skill-row, +#skills .repitem { + display: flex; + gap: var(--half-gap); + align-items: center; +} +#skills .skill-row > :first-child, +#skills .repitem > :first-child { + flex: 1 0 auto; +} +#skills .skill-row [aria-level="3"], +#skills .repitem [aria-level="3"] { + font-size: 1.125rem; + text-transform: capitalize; + text-align: left; +} +#skills .skill-row input[type=number], +#skills .repitem input[type=number] { + width: 2rem; +} + +#notes { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(var(--columnSize), 1fr)); + gap: var(--big-gap); +} +#notes .headed-textarea { + grid-column: initial; +} + +#gear { + display: flex; + flex-direction: column; + gap: var(--grid-gap); +} +#gear > .coin { + display: flex; + flex-wrap: wrap; + gap: var(--half-gap); +} +#gear > .coin h2 { + width: 100%; +} +#gear > .coin .input-label { + flex: 1; +} +#gear > .coin .input-label__input { + width: 80px; + flex: 1 0 80px; +} +#gear .repeating-container { + align-self: initial; +} +#gear .repitem { + display: grid; + gap: var(--half-gap); +} +#gear .equipped .repitem { + grid-template-columns: auto 1fr auto; +} +#gear .equipped .repitem .skill { + grid-column: 1/-1; + place-self: center; +} +#gear .over-equip-control:checked + .input-label span:last-of-type { + color: transparent; + display: grid; + grid-template-columns: "content"; +} +#gear .over-equip-control:checked + .input-label span:last-of-type > * { + grid-area: content; +} +#gear .over-equip-control:checked + .input-label span:last-of-type:before { + content: "!"; + color: var(--errorColor); + font-size: 150%; +} +#gear .over-equip-control:checked + .input-label input:first-of-type { + color: var(--errorColor); + font-family: var(--topHeaderFont); +} +#gear .stored .repitem { + grid-template-columns: auto 1fr auto; +} +#gear .stored .section-display:not(.wear) { + grid-column: 1/-1; + display: grid; + gap: var(--half-gap); +} +#gear .stored .section-display:not(.wear).weapon-section { + grid-template-columns: auto 1fr 2fr; + grid-template-areas: "blitz damage damage" "range range wear"; +} +#gear .stored .section-display:not(.wear).gear { + grid-auto-flow: column; + place-content: center; +} +#gear .stored .section-display:not(.wear) .blitz { + grid-area: blitz; +} +#gear .stored .section-display:not(.wear) .damage { + grid-area: damage; +} +#gear .stored .section-display:not(.wear) .range { + grid-area: range; +} +#gear .stored .section-display:not(.wear) .wear { + grid-area: wear; +} +#gear .stored .section-display:not(.wear) .input-label__input:not([type=checkbox]) { + width: 70px; + flex: 1; +} +#gear .stored .section-display:not(.wear) .input-label { + flex: 1; +} + +#weapons .repitem { + display: grid; + grid-template-columns: auto 1fr; + gap: var(--half-gap); + grid-template-areas: "equipped name name roller" "damage damage range range" "blitz blitz wear wear"; +} +#weapons .repitem .equipped { + grid-area: equipped; +} +#weapons .repitem .name { + grid-area: name; +} +#weapons .repitem .roller { + grid-area: roller; +} +#weapons .repitem .damage { + grid-area: damage; +} +#weapons .repitem .range { + grid-area: range; +} +#weapons .repitem .blitz { + grid-area: blitz; +} +#weapons .repitem .wear { + grid-area: wear; +} +#weapons .repitem .section-display { + grid-column: 1/-1; + display: flex; + flex-wrap: wrap; + gap: var(--half-gap); +} +#weapons .repitem .blitz, #weapons .repitem .wear { + justify-self: center; + flex: 1 1 0; + width: 0; +} +#weapons .repitem .blitz input, #weapons .repitem .wear input { + width: 0; +} +#weapons .ammo-container .container-name { + width: 10rem; + flex: 1; +} +#weapons .ammo-container .parens-holder { + flex: 0; +} +#weapons .ammo-container .ammo-type { + width: 5rem; +} + +#archetype .repitem { + display: flex; + flex-direction: column; + gap: var(--half-gap); +} + +#favorable-traits .repitem, +#unfavorable-traits .repitem { + display: flex; + flex-direction: column; + gap: var(--half-gap); +} + +#npc { + max-width: 500px; + display: flex; + flex-direction: column; + gap: var(--half-gap); +} +#npc h3 { + text-align: left; +} +#npc .repeating-container { + grid-template-columns: 1fr 60px; + grid-template-rows: auto 1fr; + grid-template-areas: "header buttons" "repeat repeat"; +} +#npc .repeating-container h3 { + grid-area: header; +} +#npc .repeating-container .repcontrol_edit, +#npc .repeating-container .repcontrol-button--add { + grid-area: buttons; +} +#npc .repeating-container .repcontainer { + grid-area: repeat; +} + +#npc-header { + display: flex; +} +#npc-header input[type=text] { + flex: 1; + width: 0; +} + +.npc-skill-container { + display: flex; + flex-wrap: wrap; + gap: var(--half-gap); +} + +#npc-stats { + border-bottom: 2px dashed lightgray; + padding-bottom: var(--half-gap); +} +#npc-stats .characteristics { + display: grid; + grid-template-columns: repeat(4, 1fr); +} +#npc-stats .circle { + width: 4.5rem; +} + +.ui-dialog .tab-content .charsheet .sidebar-toggle { + position: absolute; + top: 0; + --toggleSize:24px; + display: grid; + grid-template-areas: "content"; +} +.ui-dialog .tab-content .charsheet .sidebar-toggle:before { + --endRotate:45deg; +} +.ui-dialog .tab-content .charsheet .sidebar-toggle:after { + --endRotate:-45deg; +} +.ui-dialog .tab-content .charsheet .sidebar-toggle:before, .ui-dialog .tab-content .charsheet .sidebar-toggle:after { + content: ""; + grid-area: content; + display: block; + width: var(--toggleSize); + height: var(--toggleSize); + background-image: var(--conditionIcon); + background-repeat: no-repeat; + background-position: left center; + background-size: contain; + filter: var(--imgInvert); + transform: rotate(0deg); +} +.ui-dialog .tab-content .charsheet .sidebar-toggle:not(.fresh):before, .ui-dialog .tab-content .charsheet .sidebar-toggle:not(.fresh):after { + animation-duration: var(--sidebarRevealTime); + animation-iteration-count: 1; + animation-delay: var(--sidebarRevealTime); + animation-direction: normal; + animation-fill-mode: both; + animation-name: x-rotate-close; +} +.ui-dialog .tab-content .charsheet .sidebar-toggle.above-top { + top: -2rem; + z-index: 1000; +} +.ui-dialog .tab-content .charsheet .sidebar-toggle.sidebar--left { + left: 0; +} +.ui-dialog .tab-content .charsheet .sidebar-toggle.sidebar--right { + right: 0; +} +.ui-dialog .tab-content .charsheet .sidebar { + --sidebarWidth: clamp(250px,75vw,500px); + --hidValue: calc(-1 * var(--sidebarWidth)); + --sidebarRevealTime: 1s; + background-color: var(--backColor); + position: fixed; + width: var(--sidebarWidth); + top: 46px; + left: 0; + z-index: 10000; + border: var(--displayBorderWidth) solid var(--borderColor); + border-radius: 0 5px 5px 0; + box-sizing: border-box; + padding: var(--grid-gap) var(--big-gap) var(--grid-gap) var(--grid-gap); + opacity: 1; + translate: calc(var(--sidebarWidth) * -1 + 26px); + border-color: transparent; +} +.ui-dialog .tab-content .charsheet .sidebar:not(.fresh):not(.active) { + animation-duration: var(--sidebarRevealTime); + animation-iteration-count: 1; + animation-direction: normal; + animation-fill-mode: forwards; + animation-name: slide-out; +} +.ui-dialog .tab-content .charsheet .sidebar.active { + animation-duration: var(--sidebarRevealTime); + animation-iteration-count: 1; + animation-direction: normal; + animation-fill-mode: forwards; + animation-name: slide-in; +} +.ui-dialog .tab-content .charsheet .sidebar.active .sidebar-toggle:before, .ui-dialog .tab-content .charsheet .sidebar.active .sidebar-toggle:after { + animation-duration: var(--sidebarRevealTime); + animation-iteration-count: 1; + animation-delay: var(--sidebarRevealTime); + animation-direction: normal; + animation-fill-mode: both; + animation-name: x-rotate-open; +} +.ui-dialog .tab-content .charsheet .sidebar .tooltip-display { + left: 0; +} +.ui-dialog .tab-content .charsheet .text-check { + break-inside: avoid; + cursor: pointer; +} +.ui-dialog .tab-content .charsheet .text-check span { + padding-inline: var(--half-gap); +} +.ui-dialog .tab-content .charsheet .sidebar--open { + background-image: var(--conditionIcon); + background-repeat: no-repeat; + background-position: left center; + background-size: contain; + flex: 0 0 auto; + margin-right: auto; +} +.ui-dialog .tab-content .charsheet .condition-holder { + position: relative; + display: grid; + grid-template-areas: "content"; + place-items: center; +} +.ui-dialog .tab-content .charsheet .condition-holder > * { + grid-area: content; +} +.ui-dialog .tab-content .charsheet .condition-holder:not(:hover):not(:focus):not(:focus-within) .tooltip-display { + opacity: 0; + visibility: hidden; + transition: opacity var(--revealTime) ease-in, visibility 0ms var(--revealTime); +} +.ui-dialog .tab-content .charsheet .tooltip-display { + z-index: 1000; + position: absolute; + top: 100%; + width: min(50vw, 250px); + padding: var(--half-gap); + border: var(--displayBorderWidth) solid var(--borderColor); + border-radius: 0 0 5px 5px; + transition: opacity var(--revealTime) ease-out; + background-color: var(--backColor); + visibility: visible; +} +.ui-dialog .tab-content .charsheet .condition-item { + gap: var(--half-gap); + list-style: none; +} +.ui-dialog .tab-content .charsheet .condition-summary { + flex: 1 1 0; + margin: 0; +} +.ui-dialog .tab-content .charsheet .display-control:not(:checked) + * { + display: none; +} + +#pc-conditions { + box-sizing: border-box; +} +#pc-conditions > div { + gap: var(--grid-gap); +} + +@keyframes x-rotate-open { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(var(--endRotate)); + } +} +@keyframes x-rotate-close { + 0% { + transform: rotate(var(--endRotate)); + } + 100% { + transform: rotate(0deg); + } +} +@keyframes slide-in { + 0% { + translate: calc(var(--sidebarWidth) * -1 + 26px); + border-color: transparent; + } + 100% { + translate: calc(var(--displayBorderWidth) * -1); + border-color: var(--borderColor); + } +} +@keyframes slide-out { + 0% { + translate: calc(var(--displayBorderWidth) * -1); + border-color: var(--borderColor); + } + 100% { + translate: calc(var(--sidebarWidth) * -1 + 26px); + border-color: transparent; + } +} +.sheet-rolltemplate-backbone { + --backColor:#FCF5E5; + --borderImgRadiusFit:20px; + margin-right: -16px; + margin-left: -45px; + margin-bottom: -7px; + padding: var(--grid-gap); +} +.sheet-rolltemplate-backbone:not(:first-child) { + margin-top: var(--grid-gap); +} +.sheet-rolltemplate-backbone .sheet-image-border { + position: absolute; + inset: 0; + border: var(--maskSize) solid; + border-image-source: var(--borderImageSource); + border-image-slice: var(--borderImageSlice); + border-image-width: var(--maskSize); + border-image-repeat: round; + pointer-events: none; + z-index: -1; +} +.sheet-rolltemplate-backbone .sheet-template { + position: relative; + padding: 4px; + isolation: isolate; + filter: drop-shadow(var(--shadowSize) 0 var(--shadowBlur) var(--shadowColor)) drop-shadow(calc(var(--shadowSize) * -1) 0 var(--shadowBlur) var(--shadowColor)) drop-shadow(0 var(--shadowSize) var(--shadowBlur) var(--shadowColor)) drop-shadow(0 calc(var(--shadowSize) * -1) var(--shadowBlur) var(--shadowColor)) drop-shadow(var(--shadowSize) 0 calc(var(--shadowBlur) * 1.5) var(--shadowColor2)) drop-shadow(calc(var(--shadowSize) * -1) 0 calc(var(--shadowBlur) * 1.5) var(--shadowColor2)) drop-shadow(0 var(--shadowSize) calc(var(--shadowBlur) * 1.5) var(--shadowColor2)) drop-shadow(0 calc(var(--shadowSize) * -1) calc(var(--shadowBlur) * 1.5) var(--shadowColor2)); +} +.sheet-rolltemplate-backbone .sheet-template > :nth-child(2) { + border-top-left-radius: var(--borderImgRadiusFit); + border-top-right-radius: var(--borderImgRadiusFit); +} +.sheet-rolltemplate-backbone .sheet-template > :last-child { + border-bottom-left-radius: var(--borderImgRadiusFit); + border-bottom-right-radius: var(--borderImgRadiusFit); +} +.sheet-rolltemplate-backbone .sheet-template p, .sheet-rolltemplate-backbone .sheet-template span { + font-size: 1.3rem; +} +.sheet-rolltemplate-backbone .sheet-template p { + overflow-y: auto; + max-height: 30rem; + margin: 0; +} +.sheet-rolltemplate-backbone .sheet-template a { + background-color: transparent; + border: none; + padding: 0; + color: var(--fontColor); + font-weight: 700; +} +.sheet-rolltemplate-backbone .sheet-template a[href^="!"], .sheet-rolltemplate-backbone .sheet-template a[href^="~"] { + display: inline-grid; + grid-template-columns: 10px auto; + grid-template-areas: "icon text"; +} +.sheet-rolltemplate-backbone .sheet-template a[href^="!"]:before, .sheet-rolltemplate-backbone .sheet-template a[href^="~"]:before { + content: ""; + background-image: url("https://s3.amazonaws.com/files.d20.io/images/305391097/UIK_ZAJSwqtkuDg5I2g_LQ/original.png?16636241805"); + background-repeat: no-repeat; + background-size: contain; + background-position: center; +} +.sheet-rolltemplate-backbone .sheet-content { + padding: var(--big-gap); +} +.sheet-rolltemplate-backbone .sheet-content .inlinerollresult { + background-color: transparent; + border: 0px solid transparent; + font-weight: 700; +} +.sheet-rolltemplate-backbone .sheet-content .inlinerollresult.fullcrit { + color: green; +} +.sheet-rolltemplate-backbone .sheet-content .inlinerollresult.fullfail { + color: red; +} +.sheet-rolltemplate-backbone .sheet-content .inlinerollresult.importantroll { + color: blue; +} +.sheet-rolltemplate-backbone .sheet-content .sheet-pure-success + .inlinerollresult { + color: var(--fontColor) !important; + position: relative; + display: flex; + align-items: center; +} +.sheet-rolltemplate-backbone .sheet-content .sheet-pure-success + .inlinerollresult:before { + position: absolute; + left: -24px; +} +.sheet-rolltemplate-backbone .sheet-content .sheet-pure-success + .inlinerollresult.fullcrit { + color: var(--fontColor); +} +.sheet-rolltemplate-backbone .sheet-content .sheet-pure-success + .inlinerollresult.fullcrit:before { + content: ""; + display: block; + background-image: var(--successCircle); + background-repeat: no-repeat; + background-size: contain; + width: 24px; + height: 24px; +} +.sheet-rolltemplate-backbone .sheet-content .sheet-pure-success + .inlinerollresult.fullfail { + color: var(--fontColor); +} +.sheet-rolltemplate-backbone .sheet-content .sheet-pure-success + .inlinerollresult.fullfail:before { + content: ""; + display: block; + background-image: var(--failCircle); + background-repeat: no-repeat; + background-size: contain; + width: 24px; + height: 24px; +} +.sheet-rolltemplate-backbone .sheet-content .sheet-result .inlinerollresult { + font-size: 3rem; +} +.sheet-rolltemplate-backbone .sheet-content .sheet-result--no-crit .inlinerollresult { + color: var(--fontColor); +} +.sheet-rolltemplate-backbone .sheet-content .sheet-result--is-fumble .inlinerollresult { + position: relative; + display: flex; + align-items: center; +} +.sheet-rolltemplate-backbone .sheet-content .sheet-result--is-fumble .inlinerollresult:before { + position: absolute; + left: -24px; +} +.sheet-rolltemplate-backbone .sheet-content .sheet-result--is-fumble .inlinerollresult:before { + content: ""; + display: block; + background-image: var(--failCircle); + background-repeat: no-repeat; + background-size: contain; + width: 24px; + height: 24px; +} +.sheet-rolltemplate-backbone .sheet-content .sheet-result--is-crit .inlinerollresult { + position: relative; + display: flex; + align-items: center; +} +.sheet-rolltemplate-backbone .sheet-content .sheet-result--is-crit .inlinerollresult:before { + position: absolute; + left: -24px; +} +.sheet-rolltemplate-backbone .sheet-content .sheet-result--is-crit .inlinerollresult:before { + content: ""; + display: block; + background-image: var(--successCircle); + background-repeat: no-repeat; + background-size: contain; + width: 24px; + height: 24px; +} +.sheet-rolltemplate-backbone .sheet-description { + width: 100%; +} \ No newline at end of file diff --git a/backbone/backbone.html b/backbone/backbone.html new file mode 100644 index 0000000000..65316a69dd --- /dev/null +++ b/backbone/backbone.html @@ -0,0 +1,3734 @@ + + + + +
+ +
+ +
+
+ +
+
+ + + +
+
+ + + + + + +
+
+
+
+

+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+

+
+
+
+ + +
+ + +
( +
+ 0 +
) +
+
+
+
+ + +
+ + +
( +
+ 0 +
) +
+
+
+
+
+
+ + +
+ + +
( +
+ 0 +
) +
+
+
+
+ + +
+ + +
( +
+ 0 +
) +
+
+
+
+
+ +

+
+ +
+
+ +
+
+ +
+
+
+ + +
+
+ +
+
+
+
+
+
+
+
+ + +
+ + +
+
+ +
+
+
+
+
+ + +
+ + +
+
+ +
+
+
+

+ + + + + +
+
+ +
( +
+ + + +
) +
+
+
+
+
+
+

+
+
+ + + +
+
+
+
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+ +
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+
+
+

+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+ + + +
+ + + + + + +
+
( + ) +
+ +
+
+
+

+ +
+ + + + +
+ + + + + + +
+ + +
+
+
+
+
+

+ + + +
+
+ +
+
+
+
+
+

+ +
+ / + +
+
+ +
+ +
+ + +
+ / + +
+ + + +
+ +
+ + +
+
+ +
+
+
+
+

+ +
+ +
+ + + + + +
+ +
+ + +
+ + + +
+ +
+ +
+
+ / + +
+ +
+ +
+ +
+
+ + +
+
+ +
+
+
+
+
+

+ +
+ +
+ + + + + + +
+ +
+ + +
+ + + +
+ +
+
+ + +
+
+ +
+
+
+
+ +
( +
+ + +
) +
+
( +
+ + +
) +
+
+
+ +
( +
+ + +
) +
+
( +
+ + +
) +
+
+
+
+
+

+ +
+ +
+ + + + + +
+
+

+
+ +
+
+
+
+
+

+ +
+ + +
+ +
+
+
+
+

+ +
+ + +
+ +
+
+
+
+
+

+
+ +
+
+
+
+
+

+
+ +
+
+
+
+
+
+ +
+ / + +
+
+
+
+
+
+ + +
+ + +
( +
+ 0 +
) +
+
+
+
+ + +
+ + +
( +
+ 0 +
) +
+
+
+
+ + +
+ + +
( +
+ 0 +
) +
+
+
+
+ + +
+ + +
( +
+ 0 +
) +
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + + + + + + + +
+
+
+ +
+

+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+
+

+
+ + + +
+ +
+ +
+
+ + + +
+ +
+ +
+
+
+
+

+ +
+ + +
+ +
+ + + + + + +
+ +
+ + +
+ + + +
+ +
+
+ + +
+
+ +
+
+
+
+
+

+ +
+ + +
+
+ + + + + + +
+
+

+
+ +
+
+
+
+
+
+

+
+ +
+
+
+
+

+ + +
+
+
+
+ +
+
+
{{#character_name}}{{#character_id}} +

[{{character_name}}](http://journal.roll20.net/character/{{character_id}})

{{/character_id}}{{^character_id}} +

{{character_name}}

{{/character_id}}{{/character_name}}{{#roll}} +
{{#pure_success}}{{/pure_success}}{{computed::roll}}{{#title}} +

{{title}}

{{/title}} +
{{/roll}}{{#luck}} +
{{#rollTotal() computed::luck 1}}{{luck}}{{/rollTotal() computed::luck 1}}{{#rollTotal() computed::luck 0}}{{luck}}{{/rollTotal() computed::luck 0}} +
{{/luck}} +
{{#roll_name}} +

{{roll_name}}

{{/roll_name}} +
{{#luck}} +
{{#rollTotal() computed::luck 1}} +

{{/rollTotal() computed::luck 1}}{{#rollTotal() computed::luck 0}} +

{{/rollTotal() computed::luck 0}} +
{{/luck}}{{#damage}} +
{{#damage_type}} +

{{damage_type}}

{{/damage_type}}{{^damage_type}} +

{{/damage_type}}{{computed::damage}} +
{{/damage}}{{#description}} +
+

{{description}}

+
{{/description}} +
+
+
+ + \ No newline at end of file diff --git a/backbone/nodemon.json b/backbone/nodemon.json new file mode 100644 index 0000000000..af82656dc9 --- /dev/null +++ b/backbone/nodemon.json @@ -0,0 +1,5 @@ +{ + "ext":"pug, js, json, scss", + "ignore":["**/javascript/index.js","*.html","**/translation.json"], + "verbose":true +} \ No newline at end of file diff --git a/backbone/package-lock.json b/backbone/package-lock.json new file mode 100644 index 0000000000..18adf78a1c --- /dev/null +++ b/backbone/package-lock.json @@ -0,0 +1,13658 @@ +{ + "name": "Backbone", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "Backbone", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@babel/preset-env": "^7.16.11", + "babel-jest": "^27.5.1", + "jest": "^27.2.5", + "jest-summary-reporter": "^0.0.2", + "jsdom": "^20.0.0", + "nodemon": "^2.0.20", + "pug": "^3.0.2", + "sass-embedded": "^1.55.0", + "underscore": "^1.13.6" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", + "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", + "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz", + "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz", + "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz", + "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz", + "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz", + "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", + "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", + "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-simple-access": "^7.19.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", + "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-identifier": "^7.19.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", + "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz", + "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", + "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", + "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/babel__core": { + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", + "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/assert-never": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", + "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dev": true, + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.9.6" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", + "dev": true + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001431", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", + "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "dev": true, + "dependencies": { + "is-regex": "^1.0.3" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", + "dev": true + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/constantinople": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/core-js-compat": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz", + "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz", + "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==", + "dev": true + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", + "dev": true + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==", + "dev": true + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "dev": true + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + } + }, + "node_modules/is-expression/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "dev": true, + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-circus/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-circus/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "dev": true, + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-environment-jsdom/node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/jest-environment-jsdom/node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/jest-environment-jsdom/node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-environment-jsdom/node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-environment-jsdom/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/jest-environment-jsdom/node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-jasmine2/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "dev": true, + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-summary-reporter": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/jest-summary-reporter/-/jest-summary-reporter-0.0.2.tgz", + "integrity": "sha512-rZ3ThO57l+ZJCxF74cXIGQU3cV9I7bSBe1ElBp0taE3x2JghgD69bNCKt0LvpVQX5azTRHG7LmcjIpwriVnTng==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1" + } + }, + "node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "20.0.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.2.tgz", + "integrity": "sha512-AHWa+QO/cgRg4N+DsmHg1Y7xnz+8KU3EflM0LVDTdmrYOc1WWTSkOjtpUveQH+1Bqd5rtcVnb/DuxV/UjDO4rA==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.0", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.9.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "dev": true, + "dependencies": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "node_modules/nodemon": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", + "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/pug": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", + "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", + "dev": true, + "dependencies": { + "pug-code-gen": "^3.0.2", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" + } + }, + "node_modules/pug-attrs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "dev": true, + "dependencies": { + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" + } + }, + "node_modules/pug-code-gen": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz", + "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", + "dev": true, + "dependencies": { + "constantinople": "^4.0.1", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.0.0", + "pug-runtime": "^3.0.0", + "void-elements": "^3.1.0", + "with": "^7.0.0" + } + }, + "node_modules/pug-error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", + "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==", + "dev": true + }, + "node_modules/pug-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "dev": true, + "dependencies": { + "constantinople": "^4.0.1", + "jstransformer": "1.0.0", + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" + } + }, + "node_modules/pug-lexer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", + "dev": true, + "dependencies": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-linker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "dev": true, + "dependencies": { + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-load": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", + "dev": true, + "dependencies": { + "pug-error": "^2.0.0", + "token-stream": "1.0.0" + } + }, + "node_modules/pug-runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", + "dev": true + }, + "node_modules/pug-strip-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", + "dev": true, + "dependencies": { + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", + "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sass-embedded": { + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.55.0.tgz", + "integrity": "sha512-6AkKEyRjxz37iNwOdTOW94I33j5mxcih9Z604q1w0M1dOTKaZgtyNI67O0zb4akwZ9dVZ2VSJBXqY8/1TZRBIw==", + "dev": true, + "dependencies": { + "buffer-builder": "^0.2.0", + "google-protobuf": "^3.11.4", + "immutable": "^4.0.0", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "sass-embedded-darwin-arm64": "1.55.0", + "sass-embedded-darwin-x64": "1.55.0", + "sass-embedded-linux-arm": "1.55.0", + "sass-embedded-linux-arm64": "1.55.0", + "sass-embedded-linux-ia32": "1.55.0", + "sass-embedded-linux-x64": "1.55.0", + "sass-embedded-win32-ia32": "1.55.0", + "sass-embedded-win32-x64": "1.55.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.55.0.tgz", + "integrity": "sha512-LWUp5YpJy0/Q+5AOVcw919jktw+OnPiM4f4j5K6MJAiaodJwrSTqRGwMa2wOWyAUpjIdka8Ygm6j+2h5HNgSNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sass-embedded/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-update-notifier": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", + "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/token-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==", + "dev": true + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/with": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "dev": true + }, + "@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", + "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", + "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "dev": true, + "requires": { + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-replace-supers": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dev": true, + "requires": { + "@babel/types": "^7.20.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + } + }, + "@babel/helpers": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "dev": true + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz", + "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz", + "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.1" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz", + "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz", + "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz", + "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", + "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", + "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-simple-access": "^7.19.4" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", + "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-identifier": "^7.19.1" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", + "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz", + "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/preset-env": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", + "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.10" + } + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + } + }, + "@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + } + }, + "@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + } + }, + "@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "dev": true, + "requires": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + } + }, + "@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@sinonjs/commons": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", + "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", + "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "@types/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true + }, + "acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "requires": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "assert-never": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", + "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dev": true, + "requires": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", + "dev": true, + "requires": { + "@babel/types": "^7.9.6" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001431", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", + "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "dev": true, + "requires": { + "is-regex": "^1.0.3" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "ci-info": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "constantinople": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "dev": true, + "requires": { + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" + } + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "core-js-compat": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz", + "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==", + "dev": true, + "requires": { + "browserslist": "^4.21.4" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "requires": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decimal.js": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz", + "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true + }, + "doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", + "dev": true + }, + "domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "requires": { + "webidl-conversions": "^7.0.0" + } + }, + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "requires": { + "whatwg-encoding": "^2.0.0" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "dev": true + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "dev": true, + "requires": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + } + }, + "jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + } + }, + "jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "dev": true, + "requires": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "dev": true, + "requires": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "dependencies": { + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + } + } + }, + "jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + } + }, + "jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "dev": true + }, + "jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "dev": true, + "requires": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true + }, + "jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + } + }, + "jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + } + }, + "jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "dev": true, + "requires": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-summary-reporter": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/jest-summary-reporter/-/jest-summary-reporter-0.0.2.tgz", + "integrity": "sha512-rZ3ThO57l+ZJCxF74cXIGQU3cV9I7bSBe1ElBp0taE3x2JghgD69bNCKt0LvpVQX5azTRHG7LmcjIpwriVnTng==", + "dev": true, + "requires": { + "chalk": "^2.4.1" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "dev": true, + "requires": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsdom": { + "version": "20.0.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.2.tgz", + "integrity": "sha512-AHWa+QO/cgRg4N+DsmHg1Y7xnz+8KU3EflM0LVDTdmrYOc1WWTSkOjtpUveQH+1Bqd5rtcVnb/DuxV/UjDO4rA==", + "dev": true, + "requires": { + "abab": "^2.0.6", + "acorn": "^8.8.0", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.9.0", + "xml-name-validator": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + }, + "jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "dev": true, + "requires": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "nodemon": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nwsapi": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", + "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "dev": true, + "requires": { + "entities": "^4.4.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true + }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "requires": { + "asap": "~2.0.3" + } + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "pug": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", + "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", + "dev": true, + "requires": { + "pug-code-gen": "^3.0.2", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" + } + }, + "pug-attrs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "dev": true, + "requires": { + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" + } + }, + "pug-code-gen": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz", + "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", + "dev": true, + "requires": { + "constantinople": "^4.0.1", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.0.0", + "pug-runtime": "^3.0.0", + "void-elements": "^3.1.0", + "with": "^7.0.0" + } + }, + "pug-error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", + "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==", + "dev": true + }, + "pug-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "dev": true, + "requires": { + "constantinople": "^4.0.1", + "jstransformer": "1.0.0", + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" + } + }, + "pug-lexer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", + "dev": true, + "requires": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "pug-linker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "dev": true, + "requires": { + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" + } + }, + "pug-load": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" + } + }, + "pug-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", + "dev": true, + "requires": { + "pug-error": "^2.0.0", + "token-stream": "1.0.0" + } + }, + "pug-runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", + "dev": true + }, + "pug-strip-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", + "dev": true, + "requires": { + "pug-error": "^2.0.0" + } + }, + "pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", + "dev": true + }, + "regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexpu-core": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", + "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "regjsgen": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", + "dev": true + }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass-embedded": { + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.55.0.tgz", + "integrity": "sha512-6AkKEyRjxz37iNwOdTOW94I33j5mxcih9Z604q1w0M1dOTKaZgtyNI67O0zb4akwZ9dVZ2VSJBXqY8/1TZRBIw==", + "dev": true, + "requires": { + "buffer-builder": "^0.2.0", + "google-protobuf": "^3.11.4", + "immutable": "^4.0.0", + "rxjs": "^7.4.0", + "sass-embedded-darwin-arm64": "1.55.0", + "sass-embedded-darwin-x64": "1.55.0", + "sass-embedded-linux-arm": "1.55.0", + "sass-embedded-linux-arm64": "1.55.0", + "sass-embedded-linux-ia32": "1.55.0", + "sass-embedded-linux-x64": "1.55.0", + "sass-embedded-win32-ia32": "1.55.0", + "sass-embedded-win32-x64": "1.55.0", + "supports-color": "^8.1.1" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "sass-embedded-win32-x64": { + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.55.0.tgz", + "integrity": "sha512-LWUp5YpJy0/Q+5AOVcw919jktw+OnPiM4f4j5K6MJAiaodJwrSTqRGwMa2wOWyAUpjIdka8Ygm6j+2h5HNgSNQ==", + "dev": true, + "optional": true + }, + "saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "simple-update-notifier": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", + "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "dev": true, + "requires": { + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "token-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==", + "dev": true + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "tough-cookie": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + } + }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true + }, + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + } + } + }, + "void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "dev": true + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "dev": true, + "requires": { + "xml-name-validator": "^4.0.0" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true + }, + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + } + }, + "whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true + }, + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "with": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "dev": true, + "requires": { + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } +} diff --git a/backbone/package.json b/backbone/package.json new file mode 100644 index 0000000000..307320bd8c --- /dev/null +++ b/backbone/package.json @@ -0,0 +1,39 @@ +{ + "name": "Backbone", + "version": "1.0.0", + "description": "Below is the information on how the Backbone project will be handled and developed.", + "main": "index.js", + "scripts": { + "start": "nodemon render.js", + "test": "jest", + "wtest":"jest --watchAll" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@babel/preset-env": "^7.16.11", + "babel-jest": "^27.5.1", + "jest": "^27.2.5", + "jest-summary-reporter": "^0.0.2", + "jsdom": "^20.0.0", + "nodemon": "^2.0.20", + "pug": "^3.0.2", + "sass-embedded": "^1.55.0", + "underscore": "^1.13.6" + }, + "jest": { + "transform": { + "^.+\\.[t|j]sx?$": "babel-jest" + }, + "reporters": [ + "default", + [ + "jest-summary-reporter", + { + "failuresOnly": false + } + ] + ] + } +} diff --git a/backbone/preview.jpg b/backbone/preview.jpg new file mode 100644 index 0000000000..ae1cd5ed45 Binary files /dev/null and b/backbone/preview.jpg differ diff --git a/backbone/render.js b/backbone/render.js new file mode 100644 index 0000000000..55c5c30377 --- /dev/null +++ b/backbone/render.js @@ -0,0 +1,17 @@ +const k = require('./source/scaffold'); +const fs = require('fs/promises'); +const jsdom = require('jsdom'); +const { JSDOM } = jsdom; + +const generate = async ()=>{ + const [pugOut] = await k.all({source:'./source',destination:'./'}); + const dom = new JSDOM(pugOut); + const { window } = dom; + const { document } = window; + const scriptContent = document.querySelector('script').innerHTML; + const scriptPrepend = await fs.readFile('./source/scaffold/scripts/mock20.js','utf8'); + const scriptAppend = await fs.readFile('./source/scaffold/scripts/mockScaffold.js','utf8'); + fs.writeFile('./source/javascript/index.js',`${scriptPrepend}\n${scriptContent}\n${scriptAppend}`); +} + +generate(); \ No newline at end of file diff --git a/backbone/sheet.json b/backbone/sheet.json new file mode 100644 index 0000000000..c6be59e606 --- /dev/null +++ b/backbone/sheet.json @@ -0,0 +1,10 @@ +{ + "html": "backbone.html", + "css": "backbone.css", + "authors": "Scott Casey", + "roll20userid": "459831", + "preview": "preview.jpg", + "instructions": "This is the official sheet for the backbone system by [Backwater games](https://backwater-games.itch.io/).", + "legacy": false, + "compendium":"backbone" +} \ No newline at end of file diff --git a/backbone/source/Demo macro.roll b/backbone/source/Demo macro.roll new file mode 100644 index 0000000000..8fb74a9773 --- /dev/null +++ b/backbone/source/Demo macro.roll @@ -0,0 +1 @@ +&{template:backbone} {{character_name=John Smith of the overly complex surname}} {{title=Example Action That has some stupidly long name}} {{roll_name=Athletics}} {{roll=[[1d20+5]]}} {{damage=[[1d8+5]]}} {{description=Lorem ipsum dolor sit amet consectetur adipisicing elit. Id iure illum reprehenderit non minus voluptatem magni? Autem consequuntur rerum distinctio harum! Harum eaque culpa **tempore** [[1d100]] delectus unde officia? Doloribus id *deleniti* voluptatum eos? Nam, exercitationem voluptatum. Similique illum dolorum accusantium tenetur. Tenetur repellat consectetur, eum mollitia odit quod veritatis placeat? [Example button](! Does a thing)}} \ No newline at end of file diff --git a/backbone/source/articles/_npc.pug b/backbone/source/articles/_npc.pug new file mode 100644 index 0000000000..d2536159e5 --- /dev/null +++ b/backbone/source/articles/_npc.pug @@ -0,0 +1,7 @@ ++tab({tabName:'npc',container:'article'})#npc + include npc/_header.pug + include npc/_basicStats.pug + include npc/_skills.pug + include npc/_weapons.pug + include npc/_abilities.pug + include npc/_gear.pug \ No newline at end of file diff --git a/backbone/source/articles/_pc.pug b/backbone/source/articles/_pc.pug new file mode 100644 index 0000000000..a86aebe4ab --- /dev/null +++ b/backbone/source/articles/_pc.pug @@ -0,0 +1,12 @@ +include pc/_active_conditions.pug ++tab({tabName:'pc',container:'article'})#pc + include pc/_conditions.pug + include pc/_header.pug + include pc/_basic_stats.pug + include pc/_combat_stats.pug + include pc/_skills.pug + include pc/_gear.pug + include pc/_weapons.pug + include pc/_archetypes.pug + include pc/_traits.pug + include pc/_notes.pug \ No newline at end of file diff --git a/backbone/source/articles/_settings.pug b/backbone/source/articles/_settings.pug new file mode 100644 index 0000000000..b6eed6de6c --- /dev/null +++ b/backbone/source/articles/_settings.pug @@ -0,0 +1,19 @@ ++hidden({name:'whisper',value:' '}) ++tab({tabName:'settings',button:{class:'pictos',content:'y'},container:'article'})#settings + h1(data-i18n='settings') + +select-label({ + inputObj:{name:'character type',class:'underlined',trigger:{ + triggeredFuncs:['sheetTypeDisplay'] + }}, + spanObj:{'data-i18n':'character type'}, + }) + +option({'data-i18n':'pc',value:'pc',selected:''}) + +option({'data-i18n':'npc',value:'npc'}) + +select-label({ + inputObj:{name:'whisper',class:'underlined',trigger:{ + triggeredFuncs:['sheetTypeDisplay'] + }}, + spanObj:{'data-i18n':'whisper rolls to gm'}, + }) + +option({'data-i18n':'never',value:'',selected:''}) + +option({'data-i18n':'always',value:'/w gm '}) \ No newline at end of file diff --git a/backbone/source/articles/npc/_abilities.pug b/backbone/source/articles/npc/_abilities.pug new file mode 100644 index 0000000000..3e3f139cd4 --- /dev/null +++ b/backbone/source/articles/npc/_abilities.pug @@ -0,0 +1,32 @@ +section(aria-labelledby='npc-ability-header' id='npc-abilities').npc-abilities.npc-separator.repeating-container + h3(data-i18n='abilities') + +customControlFieldset({ + name:'ability' + }) + +collapse + .collapsed.inline + +roller({ + name:'roll', + trigger:{triggeredFuncs:['rollRepeating']}, + class:'inline-flex-box half-gap' + }) + +span({name:'type','data-i18n-dynamic':''}) + +span({name:'name'}) + +span({name:'description',class:'inline-description'}) + .expanded + .span-all.flex-box.half-gap.flex-wrap + +roller({name:'roll',trigger:{ + triggeredFuncs:['rollRepeating'] + }}) + +select({name:'type',class:'underlined'}) + +option({value:'','data-i18n':'select one'}) + each value in ['action','blitz','counter','passive'] + +option({value,'data-i18n':value}) + +text({name:'name','data-i18n-placeholder':'name',class:'underlined flex-min-content'}) + +skillSelect + .headed-textarea + h4(data-i18n='description') + +adaptiveTextarea({name:'description',class:'boxed'}) + + + diff --git a/backbone/source/articles/npc/_basicStats.pug b/backbone/source/articles/npc/_basicStats.pug new file mode 100644 index 0000000000..4edcab8848 --- /dev/null +++ b/backbone/source/articles/npc/_basicStats.pug @@ -0,0 +1,25 @@ +mixin npcCircleAttribute(name,attrName,i18n) + .overlay-content + div(class=attrName || name).circle.basic-border.ratio1-1 + +input-label({ + inputObj:{type:'number',name:attrName || name}, + spanObj:{'data-i18n':i18n || `${name} abbreviation`,role:'heading','aria-level':3}, + divObj:{class:`stacked center no-gap overlaid-content`} + }) + +section#npc-stats.tiny-gap.npc-separator + .attributes.flex-box.half-gap.justify-space-around.flex-wrap + each name in attributes + +attributeHolder(name) + .armor-movement.flex-box.half-gap.justify-space-around.flex-wrap + each name in ['health','resolve'] + +npcCircleAttribute(name,`${name} max`,name) + each obj in [...movementArmor,{name:'adrenaline'}] + +npcCircleAttribute(obj.name) + .characteristics.half-gap.justify-space-between + each obj,name in characteristics + +input-label({ + inputObj:{name,type:'number',class:'underlined'}, + spanObj:{'data-i18n':`${name}-abbreviation`,role:'heading','aria-level':3}, + divObj:{class:'no-gap'} + }) \ No newline at end of file diff --git a/backbone/source/articles/npc/_gear.pug b/backbone/source/articles/npc/_gear.pug new file mode 100644 index 0000000000..e7408b40b4 --- /dev/null +++ b/backbone/source/articles/npc/_gear.pug @@ -0,0 +1,3 @@ +section(aria-labelledby='npc-gear-header' id='npc-gear').npc-gear + h3(data-i18n='items') + +adaptiveTextarea({name:'npc items',class:'boxed'}) \ No newline at end of file diff --git a/backbone/source/articles/npc/_header.pug b/backbone/source/articles/npc/_header.pug new file mode 100644 index 0000000000..3a533502ce --- /dev/null +++ b/backbone/source/articles/npc/_header.pug @@ -0,0 +1,10 @@ +section#npc-header.half-gap.align-items-end + +text({name:'character name',value:'',role:'heading','aria-level':2,class:'underlined'}) + +dual-input-label({ + inputArr:[ + {type:'number',name:'difficulty size',class:'underlined'}, + {type:'number',name:'difficulty level',class:'underlined'} + ], + spanObj:{'data-i18n':'difficulty level abbreviation',class:'uppercase'}, + separator:'-' + }) \ No newline at end of file diff --git a/backbone/source/articles/npc/_skills.pug b/backbone/source/articles/npc/_skills.pug new file mode 100644 index 0000000000..36e1c66b36 --- /dev/null +++ b/backbone/source/articles/npc/_skills.pug @@ -0,0 +1,34 @@ +- + const skillRefs = { + skill: {i18n: 'skills', collection:basicSkills}, + specialty: {i18n: 'specialty skills'}, + combat: {i18n: 'combat skills', collection:combatSkills} + }; +mixin npcSkillContainer(skill) + div(class=`npc-${skill.replace(/\s+/g,'-').replace(/\(|\)|\//g,'')}-container`).input-label.collapse-container.avoid-break + +roller({ + name:skill, + role:'heading', + 'aria-level':3, + 'data-i18n':skill + }) + +plusControl({ + name:skill, + classAdd:'collapsed', + defaultValue:'' + }) + +number({ + name:skill, + class:'expanded underlined', + trigger:{ + triggeredFuncs:['displayNPCSkill'] + } + }) +//- End mixin +.collapse-container + +collapse('npc skills') + each name in ['skill','combat'] + section(aria-labelledby=`npc-${name}-header` id=`npc-${name}`).collapse-container.npc-skill-container + h3(data-i18n=skillRefs[name].i18n id=`npc-${name}-header`) + each obj in skillRefs[name].collection + +npcSkillContainer(obj.name) \ No newline at end of file diff --git a/backbone/source/articles/npc/_weapons.pug b/backbone/source/articles/npc/_weapons.pug new file mode 100644 index 0000000000..3c122c96a8 --- /dev/null +++ b/backbone/source/articles/npc/_weapons.pug @@ -0,0 +1,28 @@ +section(aria-labelledby='npc-weapon-header' id='npc-weapons').npc-weapons.npc-separator.repeating-container + h3(data-i18n='attacks') + +customControlFieldset({ + name:'weapon' + }) + +collapse + .collapsed.flex-box.flex-wrap.half-gap + +roller({ + name:'roll', + trigger:{triggeredFuncs:['rollRepeating']}, + class:'flex-box half-gap' + }) + +span({name:'skill','data-i18n-dynamic':''}) + +span({name:'name'}) + +hidden({name:'damage',value:'',class:'empty-hider'}) + .flex-box.tiny-gap + +span({name:'damage'}) + span(data-i18n='damage-abbreviation') + +hidden({name:'range',value:'',class:'empty-hider'}) + .flex-box.tiny-gap + span(data-i18n='range') + +span({name:'range'}) + .expanded + +weaponDetails(true) + +sizeAndSlot + +adaptiveTextarea({name:'description',class:'boxed'}).description + + diff --git a/backbone/source/articles/pc/_active_conditions.pug b/backbone/source/articles/pc/_active_conditions.pug new file mode 100644 index 0000000000..16a26a2a12 --- /dev/null +++ b/backbone/source/articles/pc/_active_conditions.pug @@ -0,0 +1,8 @@ +ul(data-container-tab="backbone" data-tab="pc").tabs__container.flex-box.flex-wrap.justify-center.condition-summary.half-gap + each condition in conditions + +checkbox({name:condition,value:1,hidden:'',class:'display-control',trigger:{ + triggeredFuncs:['resetCondition'] + }}) + li(class=`condition-item--${condition}`).condition-item.flex-box.tiny-gap + +conditionCheck(condition) + +inputWithControls({name:`track ${condition}`,type:'number',class:'underlined'}) \ No newline at end of file diff --git a/backbone/source/articles/pc/_archetypes.pug b/backbone/source/articles/pc/_archetypes.pug new file mode 100644 index 0000000000..d52bc5978b --- /dev/null +++ b/backbone/source/articles/pc/_archetypes.pug @@ -0,0 +1,15 @@ +section#archetype.repeating-container + h2(data-i18n='abilities').header + +customControlFieldset({ + name:'ability' + }) + +collapse + .span-all.flex-box.half-gap.flex-wrap + +roller({name:'roll',trigger:{ + triggeredFuncs:['rollRepeating'] + }}) + +text({name:'name','data-i18n-placeholder':'name',class:'underlined flex-min-content'}) + +skillSelect + .headed-textarea.expanded + h4(data-i18n='description') + +adaptiveTextarea({name:'description',class:'boxed'}) \ No newline at end of file diff --git a/backbone/source/articles/pc/_basic_stats.pug b/backbone/source/articles/pc/_basic_stats.pug new file mode 100644 index 0000000000..6b69b31704 --- /dev/null +++ b/backbone/source/articles/pc/_basic_stats.pug @@ -0,0 +1,64 @@ +section(data-i18n-aria-label="basic stats")#basic-stats + .characteristics + h2(data-i18n='characteristics') + - + const groupHolder = Object.values(characteristics).reduce((acc,obj)=>{ + const endIndex = Math.max(acc.length - 1,0) + if(!acc[endIndex] || acc[endIndex][1]){ + const dest = []; + dest.push(obj); + acc.push(dest); + }else{ + acc[endIndex].push(obj); + } + return acc; + },[]); + each arr in groupHolder + .even-flow + each obj in arr + - const trigger = {affects:obj.affects}; + +statContainer({class:obj.name}) + +input-label({ + inputObj:{name:obj.name,type:'number',trigger}, + spanObj:{'data-i18n':`${obj.name}-abbreviation`,role:'heading','aria-level':3}, + divObj:{class:'stacked center no-gap'} + }) + .attributes + h2(data-i18n='attributes') + - + const attrHolder = attributes.reduce((acc,name) => { + const endIndex = Math.max(acc.length - 1,0) + if(!acc[endIndex] || acc[endIndex][1]){ + const dest = []; + dest.push(name); + acc.push(dest); + }else{ + acc[endIndex].push(name); + } + return acc; + },[]); + each arr in attrHolder + .even-flow + each name in arr + +attributeHolder(name) + .armor-movement.collapse-container + +collapse('armor-collapse')(checked) + h2(data-i18n='armor-movement') + each obj in movementArmor + +statContainer({class:obj.name.replace(/\s.+/,'')}).circle + +input-label({ + inputObj:{type:'number',...obj}, + spanObj:{'data-i18n':`${obj.name} abbreviation`,role:'heading','aria-level':3}, + divObj:{class:`stacked center no-gap`} + }) + .headed-textarea.armor-details.collapse-container.tiny-gap + .flex-box.half-gap(style="width:100%") + +text({name:'armor name',value:'','data-i18n-placeholder':'equipped armor',class:'flex-min-content underlined'}) + +action({ + name:'unequip armor', + 'data-i18n':'unequip', + class:'control-button', + trigger:{triggeredFuncs:['equipArmor']} + }) + +adaptiveTextarea({name:'armor details',class:'boxed underlined--light'}).expanded + \ No newline at end of file diff --git a/backbone/source/articles/pc/_combat_stats.pug b/backbone/source/articles/pc/_combat_stats.pug new file mode 100644 index 0000000000..f2b4bd0aa3 --- /dev/null +++ b/backbone/source/articles/pc/_combat_stats.pug @@ -0,0 +1,32 @@ +section(data-i18n-aria-label="combat stats")#combat-stats + each name in ['health','resolve'] + .health-container + +statContainer({class:name}) + +roller-label({ + inputObj:{name:name,type:'number'}, + buttonObj:{name,'data-i18n':name,role:'heading','aria-level':3,trigger:{ + triggeredFuncs:['rollHealthCheck'] + }}, + divObj:{class:'stacked center'} + }) + +statContainer({class:`${name} max`}) + +input-label({ + inputObj:{name:`${name} max`,type:'number'}, + spanObj:{'data-i18n':'maximum',role:'heading','aria-level':3}, + divObj:{class:'stacked'} + }) + .luck-container + h3(data-i18n='luck') + each value in ['odd','even'] + +input-label({ + inputObj:{name:'luck',type:'radio',value}, + spanObj:{'data-i18n':value} + }) + +roller({name:'luck',role:'heading','aria-level':3,trigger:{triggeredFuncs:['rollLuck']}}) + .adrenaline-container.input-label + label(for='adrenaline') + h3(data-i18n='adrenaline') + .parens-holder.adrenaline + span.parentheses.large-parentheses ( + +inputWithControls({name:'adrenaline',id:'adrenaline',type:'number'}) + span.parentheses.large-parentheses ) \ No newline at end of file diff --git a/backbone/source/articles/pc/_conditions.pug b/backbone/source/articles/pc/_conditions.pug new file mode 100644 index 0000000000..c610381021 --- /dev/null +++ b/backbone/source/articles/pc/_conditions.pug @@ -0,0 +1,10 @@ +aside#pc-conditions.pc-conditions.sidebar.sidebar--left.conditions-sidebar.fresh + +action({ + name:'condition display', + class:'sidebar-toggle sidebar--right fresh', + trigger:{triggeredFuncs:['showConditions']} + }) + h4(data-i18n="conditions") + .flex-box.flex-wrap.justify-center + each condition in conditions + +conditionCheck(condition) \ No newline at end of file diff --git a/backbone/source/articles/pc/_gear.pug b/backbone/source/articles/pc/_gear.pug new file mode 100644 index 0000000000..4fec6c8208 --- /dev/null +++ b/backbone/source/articles/pc/_gear.pug @@ -0,0 +1,66 @@ +section#gear.tall-2 + .coin + h2(data-i18n='coin & assets') + each name in ['credit','coin'] + +input-label({ + inputObj:{name,type:'number',class:'underlined'}, + spanObj:{'data-i18n':name}, + }) + +input-label({ + inputObj:{name:'badge',type:'text',class:'underlined'}, + spanObj:{'data-i18n':'badge'}, + }) + .input-label + span(data-i18n='clothes').input-label__text + +adaptiveInput({name:'clothes',class:'underlined'}).input-label__input + .repeating-container.equipped + .flex.header.center + h2(data-i18n='equipped gear') + +checkbox({name:'overburdened',value:1,hidden:'',class:'over-equip-control',trigger:{ + calculation:'calcOverburdened' + }}) + +dual-input-label({ + inputArr:[ + {name:'item slots',type:'number',readonly:'',class:'underlined',trigger:{affects:['overburdened'],calculation:'calcUsedSlots'}}, + {name:'item slots max',type:'number',class:'underlined',trigger:{affects:['overburdened'],calculation:'calcItemSlotsMax'}} + ], + spanObj:{'data-i18n':'item slots'} + }) + +customControlFieldset({ + name:'equipped' + }) + +collapse + .flex-box.half-gap.span-all.align-items-center + +checkbox({name:'equipped',value:1,checked:'',trigger:{triggeredFuncs:['equipItem'],affects:['item slots']}}) + +text({name:'name',class:'underlined flex-min-content'}) + +dual-input-label({ + inputArr:[{name:'uses',type:'number',class:'underlined'},{name:'uses max',type:'number',class:'underlined expanded'}], + spanObj:{'data-i18n':'uses'}, + divObj:{class:'collapse-container'}, + separatorObj:{content:'/',class:'expanded'} + }) + +roller({name:'roll',trigger:{ + triggeredFuncs:['rollRepeating'] + }}) + +skillSelect.expanded.skill + +sizeAndSlot + +adaptiveTextarea({name:'description',class:'boxed'}).description.expanded + .repeating-container.stored + h2(data-i18n='stored gear').header + +customControlFieldset({ + name:'stored' + }) + +weaponDetails + +sectionControl({name:'type',value:'gear'}).expanded.gear + +dual-input-label({ + inputArr:[{name:'uses',type:'number',class:'underlined'},{name:'uses max',type:'number',class:'underlined'}], + spanObj:{'data-i18n':'uses'} + }) + +skillSelect.expanded.skill + +sectionControl({name:'type',value:'armor'}).expanded.gear + +input-label({ + inputObj:{name:'armor bonus',type:'number',class:'underlined'}, + spanObj:{'data-i18n':'armor bonus'} + }) + +sizeAndSlot + +adaptiveTextarea({name:'description',class:'boxed'}).description.expanded \ No newline at end of file diff --git a/backbone/source/articles/pc/_header.pug b/backbone/source/articles/pc/_header.pug new file mode 100644 index 0000000000..51210417d4 --- /dev/null +++ b/backbone/source/articles/pc/_header.pug @@ -0,0 +1,16 @@ +section#character-info.span-all + div + each name,i in ['character name','age','gender'] + - inputObj = {name,class:'underlined',type:'text'}; + if i > 0 + - inputObj.class += ' text-center'; + +input-label({ + inputObj, + spanObj:{'data-i18n':name.replace(/character /,''),role:'heading','aria-level':2} + }) + div + each obj in [{name:'origin',type:'text'},{name:'dialect',type:'text'},{name:'level',type:'number'},{name:'archetype',type:'text'},{name:'ideals',type:'text'},{name:'fortune',type:'text'}] + +input-label({ + inputObj:{name:obj.name,class:'underlined',type:obj.type}, + spanObj:{'data-i18n':obj.name,role:'heading','aria-level':2} + }) \ No newline at end of file diff --git a/backbone/source/articles/pc/_notes.pug b/backbone/source/articles/pc/_notes.pug new file mode 100644 index 0000000000..f1dddb650b --- /dev/null +++ b/backbone/source/articles/pc/_notes.pug @@ -0,0 +1,5 @@ +each name in ['backstory','notes'] + section(id=name) + .headed-textarea + h2(data-i18n=name) + +adaptiveTextarea({name:name,class:'boxed'}) \ No newline at end of file diff --git a/backbone/source/articles/pc/_skills.pug b/backbone/source/articles/pc/_skills.pug new file mode 100644 index 0000000000..6a3719603a --- /dev/null +++ b/backbone/source/articles/pc/_skills.pug @@ -0,0 +1,33 @@ +section(aria-label="skills")#skills.tall-2 + .basic-skills + div + h2(data-i18n='basic-skills' style='column-span:all;')#basic-skills + .input-label + span(data-i18n='skill points').input-label__text + +inputWithControls({name:'skill points',type:'number',class:'underlined'}) + .skill-container + +skillRows(basicSkills) + .combat-skills + h2(data-i18n="combat skills") + +skillRows(combatSkills) + .specialty-skills.repeating-container + h2(data-i18n="specialty skills").header + +customControlFieldset({ + name:'specialty', + }) + +roller({name:'roll',role:'heading','aria-level':3,class:'dicefontd20',trigger:{ + triggeredFuncs:['rollSkill'] + }}) + +text({name:'name',class:'underlined skill-name'}) + +fillLeft({ + radioObj:{name:`proficiency`,value:-1}, + divObj:{class:'proficiency'}, + valueArray:[-1,0,1,2,3,4], + noClear:true, + displayValues:['-1','+0','+1','+2','+3','+4'] + }) + +select({name:'characteristic'}) + +option({value:'','data-i18n':'select',selected:''}) + each obj,value in characteristics + +option({value,'data-i18n':`${value} abbreviation`}) + +checkbox({name:`${name} mastery`,value:1,class:'mastery'}) \ No newline at end of file diff --git a/backbone/source/articles/pc/_traits.pug b/backbone/source/articles/pc/_traits.pug new file mode 100644 index 0000000000..6fed518380 --- /dev/null +++ b/backbone/source/articles/pc/_traits.pug @@ -0,0 +1,16 @@ +section#favorable-traits.repeating-container + h3(data-i18n='favorable traits').header + +customControlFieldset({ + name:'favorable' + }) + +collapse + +text({name:'name',class:'underlined'}) + +adaptiveTextarea({name:'description',class:'boxed'}).expanded +section#unfavorable-traits.repeating-container + h3(data-i18n='unfavorable traits').header + +customControlFieldset({ + name:'unfavorable' + }) + +collapse + +text({name:'name',class:'underlined'}) + +adaptiveTextarea({name:'description',class:'boxed'}).expanded \ No newline at end of file diff --git a/backbone/source/articles/pc/_weapons.pug b/backbone/source/articles/pc/_weapons.pug new file mode 100644 index 0000000000..8f016420fc --- /dev/null +++ b/backbone/source/articles/pc/_weapons.pug @@ -0,0 +1,24 @@ +section#weapons.repeating-container + h2(data-i18n='equipped weapons').header + +customControlFieldset({ + name:'weapon', + trigger:{ + addFuncs:['addWeapon'] + } + }) + +weaponDetails(true) + +sizeAndSlot + +adaptiveTextarea({name:'description',class:'boxed'}).description.expanded + .flex-box.gap.flex-wrap.justify-center + - let ammoCount = 1; + each i in [1,2] + .ammo-container.flex-box.half-gap.align-items-center + +text({name:`container ${i}`,type:'text',class:'underlined container-name','data-i18n-placeholder':'ammo container'}) + each n in [1,2] + .parens-holder + span.parentheses.large-parentheses ( + .flex-box.stacked.center + +number({name:`ammo ${ammoCount}`,class:'underlined'}) + +text({name:`ammo type ${ammoCount}`,'data-i18n-placeholder':'type',class:'ammo-type'}) + - ammoCount++; + span.parentheses.large-parentheses ) \ No newline at end of file diff --git a/backbone/source/assets/scss/_generalsetup.scss b/backbone/source/assets/scss/_generalsetup.scss new file mode 100644 index 0000000000..d72329234a --- /dev/null +++ b/backbone/source/assets/scss/_generalsetup.scss @@ -0,0 +1,211 @@ +//This file will store all of our generic styling for the sheet. Styling for specific sections will be done in individual scss files to make the code easier to read. +@use 'mixinsandplaceholders'; +@use 'systemVariables'; +@use 'placeholders/systemPlaceholders'; +@import url('https://fonts.googleapis.com/css?family=IM+Fell+English+SC|Trade+Winds|Material+Icons&display=swap'); + +html{ + font-size:16px; +} +.ui-dialog{ + @extend %systemVariables; + .tab-content .charsheet{ + .repitem{ + .roller:nth-last-child(3){ + padding-right:var(--half-gap); + } + } + .large-parentheses { + align-items: center; + font-size: 2rem; + } + .fill-left__radio[data-value]:checked:before{ + font-family:var(--contentFont); + } + .parentheses{ + font-family:var(--topHeaderFont); + } + .text-center{ + text-align: center; + } + .input-controls{ + display:grid; + grid-template-columns: [input-start increment-start] auto [increment-end] 1fr [decrement-start] auto [input-end decrement-end]; + grid-template-rows: [increment-start input-start decrement-start] auto [increment-end input-end decrement-end]; + > input{ + grid-area:input; + } + } + .input-control--button{ + font-family:var(--topHeaderFont); + z-index:100; + &:first-of-type{ + grid-area:increment; + } + &:last-of-type{ + grid-area:decrement; + } + } + .even-flow{ + gap:inherit; + display:flex; + } + /* + First of all we apply our default styles. + Note that because we are using the placeholder, these styles would be first up in the cascade even if we put the extend declaration last. + This is done first so that when we read the code, we can easily see that it is applied, and anything after it will overwrite those default styles. + */ + + // Clears the default Roll20 styling from all elements so that we can style them as we want more easily. We are using 3 classes here because we have to use at least that level of specificity to overcome many of the default Roll20 styles. + @extend %defaultStyles; + padding-top:0; + .roller{ + &:not([role]){ + @extend %h4; + } + display:flex; + gap:var(--half-gap); + align-items:center; + &:before{ + font-family:dicefontd20; + content:'T' + } + } + button{ + color:var(--fontColor); + cursor:pointer; + } + h3{ + grid-area:header; + } + + .styled-button{ + @extend %sectionBoxShadow; + background-color: var(--backColor); + border: 0; + border-radius: .5rem; + box-sizing: border-box; + cursor:pointer; + transition: { + property:background-color,color; + duration:var(--revealTime); + }; + padding-inline:var(--half-gap); + text-align:center; + + &:hover { + background-color: var(--selectedColor); + &, + & *{ + color:var(--dark-secondarytext); + } + } + + &:focus { + outline: 2px solid transparent; + outline-offset: 2px; + } + + &:focus-visible { + box-shadow: none; + } + } + .styled-button--controlled, + .styled-button--controlled *{ + @extend %h4; + } + .styled-button-control:is(:checked,[type='hidden']:not([value='']):not([value='0'])) + .styled-button--controlled{ + background-color:var(--selectedColor); + &, + & *{ + color:var(--dark-secondarytext); + } + } + .parens-holder{ + display:flex; + align-items:center; + > .input-label{ + gap:0; + span{ + font-size:.8rem; + } + } + } + .stat-container{ + --shadowSize: 1px; + border:2px solid var(--fontColor); + display:flex; + flex-direction:column; + align-items:center; + break-inside:avoid; + aspect-ratio: 1 / 1; + justify-content: center; + &:not(.circle){ + border-radius:20px; + } + } + :is(.stat-container,.overlay-content){ + .input-label__text, + .roller{ + text-shadow: + var(--shadowSize) 0 var(--backColor), + calc( var(--shadowSize) * -1 ) 0 var(--backColor), + 0px var(--shadowSize) var(--backColor), + 0px calc( var(--shadowSize) * -1 ) var(--backColor); + } + } + .circle{ + @extend %circle; + } + .overlay-content{ + display:grid; + grid-template-areas:content; + place-items:center; + > * { + grid-area:content !important; + } + > .overlaid-content{ + z-index: 100; + } + } + .basic-border{ + border: 2px solid var(--fontColor); + } + .avoid-break{ + break-inside: avoid; + } + article{ + position:relative; + } + .text-check{ + span{ + transition: { + duration:var(--revealTime); + property:color,background-color; + }; + } + > input:checked{ + + span{ + background-color:var(--selectedColor); + color:var(--backColor); + } + } + } + } +} +.ui-dialog .sheetform{ + background-color:var(--backColor); + transition: { + property:background-color; + duration:var(--revealTime); + }; +} +.sheet-darkmode .ui-dialog{ + @extend %darkmodeStyle; + --imgInvert:invert(0.9); +} +//the declarations for styles specifically applying to our main element. +#main{ + display:grid; + grid-area:content; +} \ No newline at end of file diff --git a/backbone/source/assets/scss/_mixinsandplaceholders.scss b/backbone/source/assets/scss/_mixinsandplaceholders.scss new file mode 100644 index 0000000000..ccf9527fd1 --- /dev/null +++ b/backbone/source/assets/scss/_mixinsandplaceholders.scss @@ -0,0 +1,40 @@ +//- This file will store all mixins and placeholders that have generic use +@use 'placeholders/materialIcons'; + +@use 'placeholders/pictos'; + +@use 'placeholders/hidden'; + +@use 'placeholders/textLevel'; +@use 'placeholders/button'; +@use 'placeholders/inputBase'; +@use 'placeholders/inputlabel'; +@use 'placeholders/collapse'; +@use 'placeholders/adaptiveInputs'; +@use 'placeholders/headedText'; + +@use 'placeholders/borderPlaceholders'; +@use 'placeholders/fieldsetStyling'; +@use 'placeholders/sizingAndRatio'; +@use 'placeholders/fillLeft'; +@use 'placeholders/layout'; +//- Default styles. This Placeholder gets a little complicated. We're going to define several CSS variables in the first lines that will allow us to easily use the same layout principles across the sheet. Additionally, this placeholder is going to apply several styles to various elements. The reason we do this as a placeholder instead of directly in a class' CSS declaration is so that we can easily apply the same styling to our sheet as a whole and to the rolltemplate (note that many of these class specifications have versions prefixed and unprefixed with `.sheet-` +%defaultStyles{ + @extend %textElements; + @extend %materialIcons; + @extend %hideBase; + @extend %textStyles; + @extend %headerElements; + @extend %inputBase; + @extend %button; + @extend %r20FontClasses; + @extend %input-label; + @extend %headed-textarea; + @extend %borderStyles; + @extend %adaptiveText; + @extend %sizesAndRatios; + @extend %collapsible; + @extend %fieldsetStyling; + @extend %fillLeft; + @extend %layout; +} \ No newline at end of file diff --git a/backbone/source/assets/scss/_roll20clear.scss b/backbone/source/assets/scss/_roll20clear.scss new file mode 100644 index 0000000000..9eb56cea16 --- /dev/null +++ b/backbone/source/assets/scss/_roll20clear.scss @@ -0,0 +1,10 @@ +.ui-dialog .tab-content .charsheet { + select, + textarea, + input, + .uneditable-input, + label, + button { + all: initial; + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/_rolltemplate.scss b/backbone/source/assets/scss/_rolltemplate.scss new file mode 100644 index 0000000000..7be3c0a96a --- /dev/null +++ b/backbone/source/assets/scss/_rolltemplate.scss @@ -0,0 +1,161 @@ +@use 'mixinsandplaceholders'; +@use 'systemVariables'; +@use 'placeholders/systemPlaceholders'; + +.sheet-rolltemplate-backbone{ + @extend %systemVariables; + @extend %defaultStyles; + --backColor:#FCF5E5; + --borderImgRadiusFit:20px; + margin-right:-16px; + margin-left:-45px; + margin-bottom:-7px; + padding:var(--grid-gap); + &:not(:first-child){ + margin-top:var(--grid-gap); + } + + .sheet-image-border{ + position: absolute; + inset: 0; + border: var(--maskSize) solid; + border-image-source: var(--borderImageSource); + border-image-slice: var(--borderImageSlice); + border-image-width: var(--maskSize); + border-image-repeat: round; + pointer-events: none; + z-index:-1; + } + .sheet-template{ + position:relative; + padding:4px; + isolation:isolate; + filter: drop-shadow(var(--shadowSize) 0 var(--shadowBlur) var(--shadowColor)) drop-shadow(calc(var(--shadowSize) * -1) 0 var(--shadowBlur) var(--shadowColor)) drop-shadow(0 var(--shadowSize) var(--shadowBlur) var(--shadowColor)) drop-shadow(0 calc(var(--shadowSize) * -1) var(--shadowBlur) var(--shadowColor)) drop-shadow(var(--shadowSize) 0 calc(var(--shadowBlur) * 1.5 ) var(--shadowColor2)) drop-shadow(calc(var(--shadowSize) * -1) 0 calc(var(--shadowBlur) * 1.5 ) var(--shadowColor2)) drop-shadow(0 var(--shadowSize) calc(var(--shadowBlur) * 1.5 ) var(--shadowColor2)) drop-shadow(0 calc(var(--shadowSize) * -1) calc(var(--shadowBlur) * 1.5 ) var(--shadowColor2)); + > :nth-child(2){ + border-top-left-radius: var(--borderImgRadiusFit); + border-top-right-radius: var(--borderImgRadiusFit); + } + > :last-child{ + border-bottom-left-radius: var(--borderImgRadiusFit); + border-bottom-right-radius: var(--borderImgRadiusFit); + } + p,span{ + font-size:1.3rem; + } + p{ + overflow-y:auto; + max-height:30rem; + margin:0; + } + a{ + background-color:transparent; + border:none; + padding:0; + color:var(--fontColor); + font-weight:700; + &[href^='!'], + &[href^='~']{ + display:inline-grid; + grid-template-columns:10px auto; + grid-template-areas: 'icon text'; + &:before{ + content:''; + background:{ + image: url('https://s3.amazonaws.com/files.d20.io/images/305391097/UIK_ZAJSwqtkuDg5I2g_LQ/original.png?16636241805'); + repeat:no-repeat; + size:contain; + position:center; + } + + } + } + } + } + @mixin pureResult{ + position:relative; + display:flex; + align-items:center; + &:before{ + position:absolute; + left:-24px; + } + } + @mixin pureSuccess{ + &:before{ + content:''; + display:block; + background-image:var(--successCircle); + background-repeat:no-repeat; + background-size:contain; + width: 24px; + height:24px; + } + } + @mixin pureFail{ + &:before{ + content:''; + display:block; + background-image:var(--failCircle); + background-repeat:no-repeat; + background-size:contain; + width: 24px; + height:24px; + } + } + .sheet-content{ + padding: var(--big-gap); + .inlinerollresult{ + @extend %h3-style; + background-color: transparent; + border:0px solid transparent; + font-weight:700; + &.fullcrit{ + color:green; + } + &.fullfail{ + color:red; + } + &.importantroll{ + color:blue; + } + } + .sheet-pure-success{ + + .inlinerollresult{ + color:var(--fontColor) !important; + @include pureResult; + &.fullcrit{ + color:var(--fontColor); + @include pureSuccess + } + &.fullfail{ + color:var(--fontColor); + @include pureFail; + } + } + } + .sheet-result .inlinerollresult{ + @extend %h1; + font-size:3rem; + } + .sheet-result--no-crit{ + .inlinerollresult{ + color:var(--fontColor); + } + } + .sheet-result--is-fumble{ + .inlinerollresult{ + @include pureResult; + @include pureFail; + } + } + .sheet-result--is-crit{ + .inlinerollresult{ + @include pureResult; + @include pureSuccess; + } + } + } + .sheet-description{ + width:100%; + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/_systemVariables.scss b/backbone/source/assets/scss/_systemVariables.scss new file mode 100644 index 0000000000..017a7853ce --- /dev/null +++ b/backbone/source/assets/scss/_systemVariables.scss @@ -0,0 +1,36 @@ +@use 'placeholders/defaultVariables'; +@use 'placeholders/darkmode'; +%systemVariables{ + @extend %universalVariables; + // Color component variables + --errorColor:red; + + // Images + --failCircle: url('https://s3.amazonaws.com/files.d20.io/images/318562209/I3x7bfc3_M_QcFnt8tV85Q/original.png?16710625345'); + --successCircle: url('https://s3.amazonaws.com/files.d20.io/images/318562210/oX_VbZJwiNoujxFnSVumpA/original.png?16710625345'); + --conditionIcon: url('https://s3.amazonaws.com/files.d20.io/images/318557936/fEiMDUb_UctEstYyXkKlEA/original.png?16710607145'); + --heart:url('https://s3.amazonaws.com/files.d20.io/images/303476002/EGcfkMfeF7mIRowjCyVy-w/original.png?16625716925'); + --boot:url('https://s3.amazonaws.com/files.d20.io/images/303476005/Ap6DSJSqAVUkpkEwmKazPA/original.png?16625716925'); + --bolt:url('https://s3.amazonaws.com/files.d20.io/images/303476003/7La7gESx4Th7OYnkHc4u2Q/original.png?16625716925'); + --flame:url('https://s3.amazonaws.com/files.d20.io/images/303476004/9l3GwDqA2PNTAULgIvC8EA/original.png?16625716915'); + --armor:url('https://s3.amazonaws.com/files.d20.io/images/303476001/9BHZGaCcM8H3wbj2W23zdw/original.png?16625716925'); + --skull: url('https://s3.amazonaws.com/files.d20.io/images/303477021/Vm1A4GWATnboxP65WqEW0A/original.png?16625722085'); + --borderImageSource: url(https://s3.amazonaws.com/files.d20.io/images/312349470/ovngRYPae8cWAT9W489wJw/original.png?166741640555); + --borderImageSlice: 175 fill; + + --maskSize: 20px; + --shadowSize: 0px; + --shadowBlur: 4px; + --shadowColor: rgb(0 0 0 / 0.2); + --shadowColor2: rgb(0 0 0 / 0.1); + + // Fonts + --topHeaderFont: 'Trade Winds', cursive; + --midHeaderFont: 'IM Fell English SC'; + --contentFont: 'IM Fell English SC'; + + --radioSize:15px; + --columnSize:370px; + + --imgInvert: invert(0); +} \ No newline at end of file diff --git a/backbone/source/assets/scss/placeholders/_adaptiveInputs.scss b/backbone/source/assets/scss/placeholders/_adaptiveInputs.scss new file mode 100644 index 0000000000..9a5a2b711b --- /dev/null +++ b/backbone/source/assets/scss/placeholders/_adaptiveInputs.scss @@ -0,0 +1,43 @@ +@use '_borderPlaceholders.scss'; +%adaptiveText{ + .adaptive{ + display:grid; + grid-template-columns: auto; + grid-template-rows: auto; + grid-template-areas: "content"; + position:relative; + >*{ + grid-area: content; + } + > span{ + opacity: 0; + z-index: -10; + @extend %base-border; + text-transform: initial; + border-radius:0px; + } + } + .adaptive--text{ + min-height:4rem; + } + .adaptive--text__span{ + white-space: pre-wrap; + padding:2px; + } + .adaptive--text__textarea{ + width:100%; + height:100%; + resize: none; + } + .adaptive--text__textarea, + .adaptive--input__input{ + position:absolute; + } + .adaptive--input__input{ + width:100%; + } + .adaptive--input__span{ + padding:2px; + min-height:1.5rem; + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/placeholders/_borderPlaceholders.scss b/backbone/source/assets/scss/placeholders/_borderPlaceholders.scss new file mode 100644 index 0000000000..98dad7d819 --- /dev/null +++ b/backbone/source/assets/scss/placeholders/_borderPlaceholders.scss @@ -0,0 +1,60 @@ +//- Creates our basic border for inputs +%inputHighlight{ + border-width: 1px 3px; + border-style: solid; + border-color: var(--borderColor); + border-radius: 5px; + box-sizing: border-box; +} +%base-border{ + border-width: 1px 3px; + border-style: solid; + border-radius: 5px; + border-color: transparent; + box-sizing: border-box; +} +//- Styling for elements that should have a box around them +%boxed{ + border: 2px solid var(--borderColor); + border-radius:0; + box-sizing:border-box; +} +%borderStyles{ + .boxed, + .sheet-boxed{ + @extend %boxed; + &.thick-left{ + border-left-width: 5px; + } + &.thick-bottom{ + border-bottom-width: 5px; + } + &.thick-right{ + border-right-width: 5px; + } + &.thick-top{ + border-top-width: 5px; + } + } + .underlined, + .sheet-underlined{ + @extend %base-border; + border-radius: 0; + border-bottom: 1px solid var(--borderColor); + transition: var(--focusTrans); + } + :is(.underlined,.boxed){ + &:not([readonly]):not([type='checkbox']):not([type='radio']):is(:hover, :focus,:focus-within){ + @extend %inputHighlight; + } + &:not([readonly]):not([type='checkbox']):not([type='radio']):is(:focus,:focus-within){ + background-color: var(--subHeadBackColor); + } + } + .underlined--invisible{ + border-color:transparent !important; + } +} +%sectionBoxShadow{ + box-shadow: rgba(0, 0, 0, 0.16) 0px 3px 6px, rgba(0, 0, 0, 0.23) 0px 3px 6px; +} \ No newline at end of file diff --git a/backbone/source/assets/scss/placeholders/_button.scss b/backbone/source/assets/scss/placeholders/_button.scss new file mode 100644 index 0000000000..d9d9939a87 --- /dev/null +++ b/backbone/source/assets/scss/placeholders/_button.scss @@ -0,0 +1,81 @@ +@use 'textLevel'; +@use 'borderPlaceholders'; +//- Our basic button styling +%base-button{ + background-color: #DCDCDC33; + border-radius: 5px; + box-shadow: 0 2px 4px black; + border-width: 0; + transition: { + property:box-shadow,backdrop-filter; + duration:200ms; + timing-function:ease-out; + }; + backdrop-filter:blur(1px); + overflow:hidden; + &:is(:hover,:focus){ + background-color: #85858580; + box-shadow: 0 4px 6px black; + backdrop-filter:blur(2px); + } + &:active{ + background-color: #858585ff; + box-shadow: 0 1px 2px black; + backdrop-filter:blur(0px); + } +} +//- Styling for our dice buttons +%die-button{ + @extend %base-button; + line-height: 14px; + /*height to vertically center a 2rem dicefontd10*/ + font-size: 2rem; + font-weight: normal; + font-style: normal; + padding: 5px 3px 7px; +} +//- styling for buttons that have standard text in them +%text-button{ + padding: 5px 7px; + @extend %base-button; +} +//- Styling for our roll buttons +%roller{ + display: inline-flex; + align-items: center; + align-self:start; + gap: var(--half-gap); + color:var(--fontColor); + &:before{ + content:'L'; + font-family:dicefontd6; + } +} +%button{ + button{ + cursor: pointer; + } + .roller{ + display:flex; + gap:var(--half-gap); + align-items:center; + &:before{ + font-family:dicefontd20; + content:'T' + } + } + .control-button{ + @extend %inputHighlight; + align-self:center; + padding-inline:var(--tiny-gap); + transition: { + property: background-color, color; + duration: var(--revealTime); + timing-function: ease; + } + &:hover{ + background-color:var(--borderColor); + color:var(--backColor); + } + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/placeholders/_collapse.scss b/backbone/source/assets/scss/placeholders/_collapse.scss new file mode 100644 index 0000000000..3613836145 --- /dev/null +++ b/backbone/source/assets/scss/placeholders/_collapse.scss @@ -0,0 +1,83 @@ +@use 'borderPlaceholders'; +@use 'materialIcons'; +%collapsible{ + .collapse-container{ + position:relative; + } + .text-collapse{ + cursor:pointer; + display:flex; + justify-content:flex-start; + align-items:center; + &:before{ + content:'unfold_less'; + @extend %materialStyle; + } + } + .text-collapse__text{ + display:inline; + } + .text-collapse__check{ + &:not(:checked) + .text-collapse{ + @extend %inputHighlight; + } + &:checked + .text-collapse:before{ + content:'unfold_more'; + } + } + .repitem, + .collapse-container{ + &:hover{ + .collapse,.roll-container{ + opacity:1; + } + } + .collapse{ + opacity:0; + position:absolute; + right:-10px; + top:0px; + border:0px solid black; + border-radius:0; + color:var(--selectedColor); + text-transform:none; + background-color:transparent; + &:before{ + content:'y'; + font-family:pictos; + } + &:checked{ + color:var(--unselectedColor1); + background-color:transparent; + ~ .expanded, + ~ .collapse-container .expanded{ + display:none !important; + } + ~ .expanded--empty:is(:not([value]),[value='']) + *, + ~ .collapse-container ~ .expanded--empty:is(:not([value]),[value='']) + *{ + display:none !important; + } + } + &:not(:checked){ + ~ .collapsed, + ~ .collapse-container .collapsed{ + display:none !important; + } + } + &:hover{ + color:var(--selectedColor); + } + } + } + .repcontainer.editmode{ + .collapse{ + display:none; + } + } + .section-control:not(:checked) + .section-display{ + display:none !important; + } + .empty-hider:is([value=''],:not([value])) + *{ + display:none; + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/placeholders/_darkmode.scss b/backbone/source/assets/scss/placeholders/_darkmode.scss new file mode 100644 index 0000000000..01e17114e2 --- /dev/null +++ b/backbone/source/assets/scss/placeholders/_darkmode.scss @@ -0,0 +1,12 @@ +//- A placeholder for creating a stackable grid of elements. Particularly for making stacked input labels. +%darkmodeStyle{ + --borderColor: var(--dark-secondarytext);//Our basic border color + --fontColor: var(--dark-secondarytext);//Our basic font color + --backColor: var(--dark-surface1);//Set our background to match the dark mode background of the sheet + --selectedColor:var(--fontColor); + --subHeadBackColor:var(--dark-primary); + --checkColor: var(--darkCheck); + img{ + filter: brightness(.8) contrast(1.2); + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/placeholders/_defaultVariables.scss b/backbone/source/assets/scss/placeholders/_defaultVariables.scss new file mode 100644 index 0000000000..3d0d37fb8a --- /dev/null +++ b/backbone/source/assets/scss/placeholders/_defaultVariables.scss @@ -0,0 +1,39 @@ +//Our various fonts that can be used on the sheet. For now, these are all set to Arial until we find fonts we like, which won't be done until the very end. +%font-vars{ + --topHeaderFont:Arial; + --midHeaderFont:Arial; + --contentFont:Arial; +} +%universalVariables{ + // Layout variables + --grid-gap: 1rem;//Variable to define our basic gap between layout elements. Followed by several gaps that are mathematically related to it. + --half-gap: calc(var(--grid-gap) / 2); + --tiny-gap: calc(var(--half-gap) / 2); + --big-gap: calc(var(--grid-gap) * 2); + --spanSectionColumn:1/-1;//How a section should span when it is meant to span large numbers of columns (default span all) + --fillLeftRadioSize: 1rem; + --fillLeftRadioWidth:var(--fillLeftRadioSize); + --fillLeftRadioHeight:var(--fillLeftRadioSize); + + // Animation variables + --revealTime: 500ms;//Our basic reveal time for transitions + --delayTime: 200ms;//Our basic delay time before a transition occurs + --inputSwap: opacity var(--revealTime) ease var(--delayTime);//Transition properties for swapping the visibility of two elements + --focusTiming: 500ms ease;//our basic timing for the transition used when an element is focused or hovered on + --focusTrans: all var(--focusTiming);//The full transition properties for focusing/hovering on an element + + // color variables + --borderColor: black;//Our basic border color + --fontColor: black;//Our basic font color + --backColor: #ffffff;//Our basic background color + --subHeadBackColor:grey;//Our sub header background color + --unselectedColor1:lightgrey;//Our default font color for items that are currently inactive + --unselectedColor2:transparent; + --selectedColor:black; + --checkColor:black; + --darkCheck:white; + + // Border sizing variables + --displayBorderWidth: 2px;//Our default border width + @extend %font-vars; +} \ No newline at end of file diff --git a/backbone/source/assets/scss/placeholders/_fieldsetStyling.scss b/backbone/source/assets/scss/placeholders/_fieldsetStyling.scss new file mode 100644 index 0000000000..4fb6c18de5 --- /dev/null +++ b/backbone/source/assets/scss/placeholders/_fieldsetStyling.scss @@ -0,0 +1,74 @@ +@use 'button'; + +@mixin repButton{ + opacity:0; + transition: { + property:opacity,background-color; + duration: var(--revealTime); + }; + @extend %text-button; + font-family:pictos; +} +%fieldsetStyling{ + .repitem{ + > input:not([type='checkbox']){ + width:100%; + } + .headed-textarea, + .description{ + grid-column:1/-1; + } + } + .repcontainer{ + display:grid; + gap:var(--grid-gap); + } + .repeating-container{ + display:grid; + grid-template-areas:'header'; + align-self:start; + > .header{ + grid-area:header; + } + &:is(:hover,:focus-within,:focus){ + .repcontrol_edit:after, + .repcontrol-button{ + opacity:1; + } + } + } + .repcontrol_edit{ + visibility:hidden; + text-transform:none; + &:after{ + @include repButton; + visibility:visible; + content:'p'; + } + } + .repcontrol-button{ + grid-area:header; + align-self:start; + ~ .repcontrol{ + display:contents; + .repcontrol_edit{ + grid-area:header; + align-self:start; + justify-self:end; + display:flex; + float:none; + } + .repcontrol_add{ + display:none !important; + } + } + } + .repcontrol-button--add{ + justify-self:start; + @include repButton; + &:before{ + font-family:pictos; + content:'&'; + } + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/placeholders/_fillLeft.scss b/backbone/source/assets/scss/placeholders/_fillLeft.scss new file mode 100644 index 0000000000..429c8e784e --- /dev/null +++ b/backbone/source/assets/scss/placeholders/_fillLeft.scss @@ -0,0 +1,33 @@ +%fillLeft{ + .fill-left{ + display:flex; + align-self:center; + box-sizing:border-box; + } + .fill-left__radio{ + appearance:none; + -webkit-appearance:none; + background-color:var(--selectedColor); + width:var(--fillLeftRadioWidth); + height:var(--fillLeftRadioHeight); + cursor:pointer; + &[data-value]{ + display:grid; + grid-template-areas: 'content'; + place-items:center; + > *{ + grid-area:content; + } + &:checked:before{ + content:attr(data-value); + color:var(--backColor); + font-size:1rem; + place-self:center; + text-transform: uppercase; + } + } + &:checked ~ .fill-left__radio{ + background-color:var(--unselectedColor2); + } + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/placeholders/_headedText.scss b/backbone/source/assets/scss/placeholders/_headedText.scss new file mode 100644 index 0000000000..13afa6dc6b --- /dev/null +++ b/backbone/source/assets/scss/placeholders/_headedText.scss @@ -0,0 +1,14 @@ +%headed-textarea{ + .headed-textarea{ + display:grid; + grid-template-rows: auto 1fr; + grid-template-columns: auto; + grid-column:1 / -1; + :not(textarea):not(.adaptive){ + justify-self: start; + } + .headed-textarea__header{ + grid-area:initial; + } + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/placeholders/_hidden.scss b/backbone/source/assets/scss/placeholders/_hidden.scss new file mode 100644 index 0000000000..9cdcc5dd91 --- /dev/null +++ b/backbone/source/assets/scss/placeholders/_hidden.scss @@ -0,0 +1,11 @@ +//- Styling to hide elements +%hidden{ + display: none!important;//!important is usually a thing to avoid, but if we're applying this, we want it to be gone no matter what. +} +%hideBase{ + .sheet-hidden, + .hidden, + *[hidden]{ + @extend %hidden; + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/placeholders/_inputBase.scss b/backbone/source/assets/scss/placeholders/_inputBase.scss new file mode 100644 index 0000000000..e3f78a0477 --- /dev/null +++ b/backbone/source/assets/scss/placeholders/_inputBase.scss @@ -0,0 +1,94 @@ +@use 'borderPlaceholders'; +//- Placeholder for applying our checked styling to something +%checked{ + &:before{ + content: '\2713'; + grid-area:content; + font-weight:bold; + place-self:start center; + color: var(--checkColor); + font-size: 1.5rem; + line-height: 0.5rem; + } +} +//- Some styling to highlight which input is currently being interacted with. +%inputBase{ + input{ + width: auto; + font-family: var(--topHeaderFont); + &:placeholder{ + color: #ededed80; + } + &.plus-control:not([value*="-"]) + span:before{ + content: '+'; + } + &[readonly]{ + border:0; + } + &:is([type='checkbox'],[type='radio']){ + border: 1px solid var(--borderColor); + cursor: pointer; + -webkit-appearance:none; + appearance:none; + width: 14px; + min-width: 14px; + height: 14px; + min-height: 14px; + display:grid; + grid-template-columns:1fr; + grid-template-areas:"content"; + &:not(.collapse):not(.fill-left__radio):checked{ + @extend %checked; + } + } + &[type='number']{ + width: 3rem; + -moz-appearance: textfield !important; + text-align: center; + &::-webkit-inner-spin-button, + &::-webkit-outer-spin-button{ + -webkit-appearance: none; + margin: 0; + } + } + } + select, + .pseudo-select span, + .sheet-pseudo-select span, + textarea, + input:not(:is([type='radio'],[type='checkbox'])), + .uneditable-input{ + padding: 2px; + } + input:is([type="text"],[type="number"]),textarea{ + cursor:auto; + } + select, + .pseudo-select span, + .sheet-pseudo-select span, + input:not(:where([type='checkbox'], [type='radio'])), + .uneditable-input, + textarea{ + @extend %base-border; + } + select, + .sheet-pseudo-select span, + .pseudo-select span{ + -webkit-apperance: none; + appearance: none; + text-transform: capitalize; + overflow: hidden!important; + white-space: nowrap; + text-overflow: ellipsis; + text-align: center; + color:var(--fontColor); + } + textarea{ + resize: vertical; + white-space: pre-wrap; + &.fixed{ + resize: none; + overflow: auto; + } + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/placeholders/_inputlabel.scss b/backbone/source/assets/scss/placeholders/_inputlabel.scss new file mode 100644 index 0000000000..dc302e9626 --- /dev/null +++ b/backbone/source/assets/scss/placeholders/_inputlabel.scss @@ -0,0 +1,48 @@ +@use 'textLevel'; +%stackedGrid{ + &.stacked{ + flex-direction:column; + &.center>*{ + text-align: center; + } + > [name]:not([type="number"]):not([type="checkbox"]):not([type="radio"]){ + width:100%; + } + } +} +%input-label{ + .input-label{ + display: inline-flex; + gap: var(--half-gap); + align-items:center; + @extend %stackedGrid; + &:not(.stacked){ + > input[type='text']{ + flex:1 1 0; + } + >:not([name]){ + flex:0 0 auto; + } + &.large > [name]{ + @extend h2; + } + } + > :is(span,button){ + text-transform:capitalize; + } + } + .input-label--dual{ + grid-template-columns: 1fr auto 1fr; + grid-template-areas: 'over over over' 'under under under'; + >span:last-of-type{ + grid-column: 1 / -1; + } + >input:not([type="number"]):not([type="checkbox"]):not([type="radio"]){ + width: 100%; + } + >.slash{ + line-height: 0rem; + font-weight: normal; + } + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/placeholders/_layout.scss b/backbone/source/assets/scss/placeholders/_layout.scss new file mode 100644 index 0000000000..4f36444670 --- /dev/null +++ b/backbone/source/assets/scss/placeholders/_layout.scss @@ -0,0 +1,122 @@ +%layout{ + .inline, + .sheet-inline{ + display:inline !important; + } + .inline-flex-box, + .sheet-inline-flex-box{ + display:inline-flex !important; + } + .flex-box, + .sheet-flex-box{ + display:flex; + } + .flex-wrap, + .sheet-flex-wrap{ + flex-wrap:wrap; + } + .justify-space-around, + .sheet-justify-space-around{ + justify-content:space-around; + } + .justify-space-between, + .sheet-justify-space-between{ + justify-content:space-between; + } + .justify-center, + .sheet-justify-center{ + justify-content:center; + } + .stacked, + .sheet-stacked{ + flex-direction:column; + &.center, + &.sheet-center{ + align-items:center; + } + &.center > *, + &.sheet-stacked > *{ + text-align: center; + } + &:not(.center):not(.sheet-center){ + align-items:start; + } + > [name]:not([type="number"]):not([type="checkbox"]):not([type="radio"]){ + width:100%; + } + } + .span-2, + .sheet-span-2{ + grid-column:span 2; + } + .span-all, + .sheet-span-all{ + grid-column:1/-1; + } + .row-reverse, + .sheet-row-reverse{ + flex-direction: row-reverse; + } + .column-reverse, + .sheet-column-reverse{ + flex-direction: column-reverse; + } + .no-gap, + .sheet-no-gap{ + gap:0; + } + .gap, + .sheet-gap{ + gap:var(--grid-gap); + } + .half-gap, + .sheet-half-gap{ + gap:var(--half-gap); + } + .tiny-gap, + .sheet-tiny-gap{ + gap:var(--tiny-gap); + } + .big-gap, + .sheet-big-gap{ + gap:var(--big-gap); + } + .no-gap, + .sheet-no-gap{ + gap:0; + } + .flex-min-content, + .sheet-flex-min-content{ + flex: 1 1 min-content; + } + input.flex-min-content, + input.sheet-flex-min-content{ + width:0; + } + .align-self-stretch, + .sheet-align-self-stretch{ + align-self:stretch; + } + .align-self-start, + .sheet-align-self-start{ + align-self:start; + } + .align-self-end, + .sheet-align-self-end{ + align-self:end; + } + .align-items-center, + .sheet-align-items-center{ + align-items:center; + } + .align-items-end, + .sheet-align-items-end{ + align-items: end; + } + .flex-box > .span-all{ + width:100%; + } + .tall-2{ + grid-row: span 2; + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/placeholders/_materialIcons.scss b/backbone/source/assets/scss/placeholders/_materialIcons.scss new file mode 100644 index 0000000000..b1426c8044 --- /dev/null +++ b/backbone/source/assets/scss/placeholders/_materialIcons.scss @@ -0,0 +1,30 @@ +%materialStyle{ + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; /* Preferred icon size */ + display: inline-block; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + + /* Support for IE. */ + font-feature-settings: 'liga'; +} +%materialIcons{ + .sheet-material-icons, + .material-icons { + @extend %materialStyle; + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/placeholders/_pictos.scss b/backbone/source/assets/scss/placeholders/_pictos.scss new file mode 100644 index 0000000000..8f1bdc9f34 --- /dev/null +++ b/backbone/source/assets/scss/placeholders/_pictos.scss @@ -0,0 +1,35 @@ +//- Styling for items that need the pictos fonts +%pictos{ + font-family: pictos; + text-transform: none; +} +%pictos3{ + font-family: pictos three; + text-transform: none; +} +%pictosCustom{ + font-family: pictos custom; + text-transform: none; +} +%diceD20{ + font-family:dicefontd20; + text-transform:none; +} +%r20FontClasses{ + .sheet-pictos, + .pictos{ + @extend %pictos; + } + .pictos3, + .sheet-pictos3{ + @extend %pictos3; + } + .pictoscustom, + .sheet-pictoscustom{ + @extend %pictosCustom; + } + .dicefontd20, + .sheet-dicefontd20{ + @extend %diceD20; + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/placeholders/_sizingAndRatio.scss b/backbone/source/assets/scss/placeholders/_sizingAndRatio.scss new file mode 100644 index 0000000000..a7d8e3bad9 --- /dev/null +++ b/backbone/source/assets/scss/placeholders/_sizingAndRatio.scss @@ -0,0 +1,12 @@ +%circle{ + border-radius: 50%; +} +%ratio1_1{ + aspect-ratio: 1/1; +} +%sizesAndRatios{ + .ratio1-1, + .sheet-ratio1-1{ + @extend %ratio1_1; + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/placeholders/_systemPlaceholders.scss b/backbone/source/assets/scss/placeholders/_systemPlaceholders.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/backbone/source/assets/scss/placeholders/_textLevel.scss b/backbone/source/assets/scss/placeholders/_textLevel.scss new file mode 100644 index 0000000000..1290a6fcbf --- /dev/null +++ b/backbone/source/assets/scss/placeholders/_textLevel.scss @@ -0,0 +1,163 @@ +//- Our basic setup for text on the sheet. +%baseText{ + line-height: normal; +} +//- styling for italic words +%italics{ + font-style: italic; +} +%uppercase{ + text-transform:uppercase; +} +%textStyles{ + .sheet-italics, + .italics{ + @extend %italics; + } +} +//- Basic styling for headers. +%baseHeader{ + @extend %baseText; + color:var(--fontColor); + white-space: nowrap; + margin-top: 0px; + margin-bottom: 0px; + font-weight:normal; +} + +//- Headers that should pop! +%importantHeader{ + text-transform: uppercase; + font-weight: normal; +} + +//- Headers that should be important, but not eye-catching +%midHeader{ + &:not(:where(input)){ + text-transform:capitalize; + } +} + +//- The next several placeholders are for styling our various levels of headers (1-5). +%h1-style{ + @extend %baseHeader; + @extend %importantHeader; + font-size: 1.5rem; + font-family: var(--topHeaderFont); + &:not(input){ + text-align: center; + } +} +%h1{ + @extend %h1-style; + *{ + @extend %h1-style; + } +} +%h2-style{ + @extend %baseHeader; + @extend %importantHeader; + font-size: 1.375rem; + font-family: var(--topHeaderFont); + &:not(input){ + text-align: center; + } +} +%h2{ + @extend %h2-style; + *{ + @extend %h2-style; + } +} +%h3-style{ + @extend %baseHeader; + @extend %importantHeader; + font-size: 1.25rem; + font-family: var(--topHeaderFont); + &:not(input){ + text-align: center; + } +} +%h3{ + @extend %h3-style; + *{ + @extend %h3-style; + } +} +%h4-style{ + @extend %baseHeader; + @extend %midHeader; + font-size: 1.125rem; + font-family: var(--midHeaderFont); + &:not(input){ + text-align: center; + } +} +%h4{ + @extend %h4-style; + *{ + @extend %h4-style; + } +} +%h5-style{ + @extend %baseHeader; + @extend %midHeader; + font-size: 1rem; + font-style:normal; + font-family: var(--midHeaderFont); + &:not(input){ + text-align: center; + } +} +%h5{ + @extend %h5-style; + *{ + @extend %h5-style; + } +} +%headerElements{ + h1, + *[aria-level='1']{ + @extend %h1; + } + h2, + *[aria-level='2']{ + @extend %h2; + } + h3, + *[aria-level='3']{ + @extend %h3; + } + h4, + *[aria-level='4']{ + @extend %h4; + } + h5, + *[aria-level='5']{ + @extend %h5; + } +} +%textElements{ + span, + input, + textarea, + p{ + font-size: 1rem; + color:var(--fontColor); + @extend %baseText; + } + span,input,textarea,button,select{ + font-family:var(--contentFont); + } + .big-text, + .sheet-big-text{ + @extend %h3; + } + .tiny-text, + .sheet-tiny-text{ + font-size:0.75rem; + } + .uppercase{ + text-transform:uppercase !important; + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/sections/_abilities.scss b/backbone/source/assets/scss/sections/_abilities.scss new file mode 100644 index 0000000000..c80d9f4eec --- /dev/null +++ b/backbone/source/assets/scss/sections/_abilities.scss @@ -0,0 +1,7 @@ +#archetype{ + .repitem{ + display:flex; + flex-direction:column; + gap:var(--half-gap); + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/sections/_archetypes.scss b/backbone/source/assets/scss/sections/_archetypes.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/backbone/source/assets/scss/sections/_basic_stats.scss b/backbone/source/assets/scss/sections/_basic_stats.scss new file mode 100644 index 0000000000..37ddfe296b --- /dev/null +++ b/backbone/source/assets/scss/sections/_basic_stats.scss @@ -0,0 +1,142 @@ +#basic-stats { + grid-column: 1 / -1; + display: flex; + flex-wrap: wrap; + align-items: flex-start; + justify-content: center; + gap: var(--big-gap); + + >div { + flex: 1 0 200px; + } + + > :is(.attributes, .characteristics) { + display: flex; + flex-wrap: wrap; + gap: var(--half-gap); + margin: 0; + justify-content: center; + + .stat-container { + box-sizing: border-box; + } + } + + h2 { + width: 100%; + box-sizing: border-box; + column-span: all; + font-size: 1rem; + } + + [aria-level="3"] { + font-size: .8rem; + } + + .stat-container { + box-sizing: border-box; + } + + .armor-movement { + display: flex; + flex-wrap: wrap; + gap: var(--half-gap); + align-items: center; + justify-content: center; + } + + .armor-details { + width: 100%; + + span { + font-size: 0.75rem; + text-transform: capitalize; + } + } +} + +.characteristics { + flex-grow: 2; + + >.stat-container { + width: 55px; + } +} + +.attributes { + .stat-container { + width: 70px; + } +} + +.armor-movement { + >.stat-container { + width: 70px; + } + + .armor { + position: relative; + isolation: isolate; + + &:before { + border-radius:inherit; + overflow:hidden; + z-index: -1; + filter: var(--imgInvert); + content: ''; + position: absolute; + inset: 0; + + background: { + image: var(--armor); + position: center; + size: contain; + repeat: no-repeat; + } + } + } + + .movement { + position: relative; + isolation: isolate; + + &:before { + border-radius:inherit; + overflow:hidden; + z-index: -1; + filter: var(--imgInvert); + content: ''; + position: absolute; + inset: 0; + + background: { + image: var(--boot); + position: center; + size: contain; + repeat: no-repeat; + } + } + } + + .sprint { + position: relative; + isolation: isolate; + + &:before { + border-radius:inherit; + overflow:hidden; + z-index: -1; + filter: var(--imgInvert); + content: ''; + position: absolute; + inset: 0; + + background: { + image: var(--bolt); + position: center; + size: contain; + repeat: no-repeat; + } + } + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/sections/_combat_stats.scss b/backbone/source/assets/scss/sections/_combat_stats.scss new file mode 100644 index 0000000000..e3a2f3ed5c --- /dev/null +++ b/backbone/source/assets/scss/sections/_combat_stats.scss @@ -0,0 +1,103 @@ +#combat-stats { + grid-column: 1 / -1; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: center; + gap: var(--big-gap); + + [aria-level='3'], + h3 { + font-size: 0.8rem; + } + + .health-container { + display: flex; + gap: var(--half-gap); + height: 70px; + } + + .luck-container { + display: grid; + grid-template-columns: auto auto auto; + grid-template-rows: auto auto; + grid-template-areas: + 'header odd button' + 'header even button'; + justify-items: end; + column-gap: var(--tiny-gap); + + h3 { + grid-area: header; + writing-mode: vertical-rl; + rotate: 180deg; + } + + button { + grid-area: button; + place-self: center; + } + } + + .adrenaline-container { + align-items: center; + + input { + font-size: 2rem; + } + } +} + +.adrenaline { + position:relative; + isolation: isolate; + &:before{ + border-radius:inherit; + overflow:hidden; + z-index:-1; + filter:var(--imgInvert); + content: ''; + position:absolute; + inset:0; + background: { + image: var(--flame); + position: center; + size: contain; + repeat: no-repeat; + } + } +} + +.max { + position:relative; + isolation: isolate; + &:before{ + border-radius:inherit; + overflow:hidden; + z-index:-1; + background: { + position: center; + size: contain; + repeat: no-repeat; + } + filter:var(--imgInvert); + } + + &.health:before { + content: ''; + position:absolute; + inset:0; + background: { + image: var(--heart); + } + } + + &.resolve:before { + content: ''; + position:absolute; + inset:0; + background: { + image: var(--skull); + } + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/sections/_condition.scss b/backbone/source/assets/scss/sections/_condition.scss new file mode 100644 index 0000000000..80e45dc2a1 --- /dev/null +++ b/backbone/source/assets/scss/sections/_condition.scss @@ -0,0 +1,224 @@ +// Offset to show just the right side of the aside when collapsed: calc(var(--sidebarWidth) * -1 + 75px) +.ui-dialog .tab-content .charsheet{ + .sidebar-toggle{ + position:absolute; + top:0; + --toggleSize:24px; + display:grid; + grid-template-areas:'content'; + &:before{ + --endRotate:45deg; + } + &:after{ + --endRotate:-45deg; + } + &:before, + &:after{ + content:''; + grid-area:content; + display:block; + width:var(--toggleSize); + height:var(--toggleSize); + background: { + image:var(--conditionIcon); + repeat: no-repeat; + position: left center; + size:contain + }; + filter: var(--imgInvert); + transform:rotate(0deg); + } + &:not(.fresh){ + &:before, + &:after{ + animation: { + duration: var(--sidebarRevealTime); + iteration-count: 1; + delay: var(--sidebarRevealTime); + direction: normal; + fill-mode:both; + name: x-rotate-close; + }; + } + } + &:after{ + // opacity:0; + } + &.above-top{ + top: -2rem; + z-index:1000; + } + &.sidebar--left{ + left:0; + } + &.sidebar--right{ + right:0; + } + } + .sidebar{ + --sidebarWidth: clamp(250px,75vw,500px); + --hidValue: calc(-1 * var(--sidebarWidth)); + --sidebarRevealTime: 1s; + background-color:var(--backColor); + position:fixed; + width: var(--sidebarWidth); + top:46px; + left:0; + z-index:10000; + border: var(--displayBorderWidth) solid var(--borderColor); + border-radius: 0 5px 5px 0; + box-sizing:border-box; + padding:var(--grid-gap) var(--big-gap) var(--grid-gap) var(--grid-gap); + opacity: 1; + translate:calc(var(--sidebarWidth) * -1 + 26px); + border-color:transparent; + &:not(.fresh):not(.active){ + // visibility: hidden; + animation: { + duration: var(--sidebarRevealTime); + iteration-count: 1; + direction: normal; + fill-mode:forwards; + name: slide-out; + } + } + &.active{ + animation: { + duration: var(--sidebarRevealTime); + iteration-count: 1; + direction: normal; + fill-mode:forwards; + name: slide-in; + } + .sidebar-toggle{ + &:before, + &:after{ + animation: { + duration: var(--sidebarRevealTime); + iteration-count: 1; + delay: var(--sidebarRevealTime); + direction: normal; + fill-mode:both; + name: x-rotate-open; + }; + } + // &:after{ + // opacity:1; + // transition: { + // property: rotate,opacity; + // duration: var(--sidebarRevealTime),0ms; + // timing-function:ease-out; + // delay:var(--sidebarRevealTime), calc( var(--sidebarRevealTime) * 2); + // } + // } + } + } + .tooltip-display{ + left:0; + } + } + .text-check{ + break-inside: avoid; + cursor: pointer; + span{ + padding-inline:var(--half-gap); + } + } + .sidebar--open{ + background: { + image:var(--conditionIcon); + repeat: no-repeat; + position: left center; + size:contain + } + flex: 0 0 auto; + margin-right:auto; + } + .condition-holder{ + position:relative; + display:grid; + grid-template-areas: 'content'; + place-items:center; + > *{ + grid-area:content; + } + &:not(:hover):not(:focus):not(:focus-within) .tooltip-display{ + opacity:0; + visibility:hidden; + transition: opacity var(--revealTime) ease-in, visibility 0ms var(--revealTime); + } + } + .tooltip-display{ + z-index:1000; + position:absolute; + top:100%; + width: min(50vw,250px); + padding:var(--half-gap); + border: var(--displayBorderWidth) solid var(--borderColor); + border-radius: 0 0 5px 5px; + transition: opacity var(--revealTime) ease-out; + background-color:var(--backColor); + visibility:visible; + } + .condition-item{ + gap:var(--half-gap); + list-style: none; + } + .condition-summary{ + flex: 1 1 0; + margin:0; + } + .display-control:not(:checked) + *{ + display:none; + } +} + + + +#pc-conditions{ + box-sizing: border-box; + > div{ + gap:var(--grid-gap); + } +} + +@keyframes x-rotate-open{ + 0%{ + // opacity:1; + transform:rotate(0deg); + } + 100%{ + // opacity:1; + transform: rotate(var(--endRotate)); + } +} +@keyframes x-rotate-close{ + 0%{ + // opacity:1; + transform: rotate(var(--endRotate)); + } + 100%{ + // opacity:1; + transform:rotate(0deg); + } +} +@keyframes slide-in{ + 0%{ + translate:calc(var(--sidebarWidth) * -1 + 26px); + border-color:transparent; + } + 100%{ + translate: calc(var(--displayBorderWidth) * -1); + border-color:var(--borderColor); + } +} +@keyframes slide-out{ + 0%{ + translate: calc(var(--displayBorderWidth) * -1); + border-color:var(--borderColor); + } + 100%{ + translate:calc(var(--sidebarWidth) * -1 + 26px); + border-color:transparent; + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/sections/_gear.scss b/backbone/source/assets/scss/sections/_gear.scss new file mode 100644 index 0000000000..6b3ce8ac53 --- /dev/null +++ b/backbone/source/assets/scss/sections/_gear.scss @@ -0,0 +1,88 @@ +#gear{ + display:flex; + flex-direction:column; + gap:var(--grid-gap); + > .coin{ + display:flex; + flex-wrap:wrap; + gap:var(--half-gap); + h2{ + width:100%; + } + .input-label{ + flex:1; + } + .input-label__input{ + width:80px; + flex:1 0 80px; + } + } + .repeating-container{ + align-self:initial; + } + .repitem{ + display:grid; + gap:var(--half-gap); + } + .equipped{ + .repitem{ + grid-template-columns: auto 1fr auto; + .skill{ + grid-column: 1 / -1; + place-self:center; + } + } + } + .over-equip-control:checked + .input-label{ + span:last-of-type{ + color:transparent; + display:grid; + grid-template-columns:'content'; + > * { + grid-area:content; + } + &:before{ + content:'!'; + color:var(--errorColor); + font-size:150%; + } + } + input:first-of-type{ + color:var(--errorColor); + font-family:var(--topHeaderFont); + } + } + .stored{ + .repitem{ + grid-template-columns: auto 1fr auto; + } + .section-display:not(.wear){ + grid-column:1 / -1; + display:grid; + gap:var(--half-gap); + &.weapon-section{ + grid-template-columns:auto 1fr 2fr; + grid-template-areas: + "blitz damage damage" + "range range wear"; + } + &.gear{ + grid-auto-flow: column; + place-content:center; + } + + @each $field in blitz,damage,range,wear{ + .#{$field}{ + grid-area:$field; + } + } + .input-label__input:not([type="checkbox"]){ + width:70px; + flex:1; + } + .input-label{ + flex:1; + } + } + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/sections/_header.scss b/backbone/source/assets/scss/sections/_header.scss new file mode 100644 index 0000000000..fdd3014636 --- /dev/null +++ b/backbone/source/assets/scss/sections/_header.scss @@ -0,0 +1,36 @@ +#character-info{ + flex-basis:100%; + display:flex; + flex-wrap:wrap; + >div{ + gap:var(--half-gap); + } + [aria-level="2"]{ + font-size:1rem; + } + .input-label{ + input{ + width:50px; + flex:1 0 auto; + } + } + > :first-child{ + display:grid; + grid-template-columns:1fr 1fr; + flex:1; + padding-right:var(--half-gap); + margin-right: var(--half-gap); + border-right:1px solid var(--fontColor); + > :first-child{ + grid-column:1 / -1; + } + } + > :nth-child(2){ + flex:2; + display:grid; + grid-template-columns:repeat(3,1fr); + > div{ + flex:1 1 0px; + } + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/sections/_nav.scss b/backbone/source/assets/scss/sections/_nav.scss new file mode 100644 index 0000000000..5e832cad67 --- /dev/null +++ b/backbone/source/assets/scss/sections/_nav.scss @@ -0,0 +1,71 @@ +//Sets the bio/charsheet/a&a tab container to be sticky and float at the top +@use '../placeholders/borderPlaceholders'; +ul.nav-tabs.nav{ + position:sticky; + top:0; + background-color:var(--backColor); + z-index:9999; + margin-bottom:0px; +} +.ui-dialog .tab-content .charsheet .tabs > nav{ + display:flex; + flex-wrap:wrap; + justify-content:end; + align-items:start; + gap:var(--half-gap); + position:sticky; + top:44px; + margin-bottom:10px; + padding-inline:10px; + padding-block:var(--half-gap); + background-color:var(--backColor); + z-index:1000; + transition: { + property:background-color; + duration:var(--revealTime); + }; + .no-list{ + list-style:none; + margin:0; + } + button{ + color:var(--fontColor); + } + .tabs__button{ + font-size:1.5rem; + @extend %inputHighlight; + border-color:transparent; + padding-inline:0; + transition: { + property: border-color, color, background-color, padding-inline; + duration: var(--revealTime); + timing-function: ease; + } + &:not(.pictos){ + font-family:var(--topHeaderFont); + line-height:1; + } + &.k-active-button{ + color:var(--backColor); + background-color: var(--borderColor); + border-color:var(--borderColor); + padding-inline:var(--tiny-gap); + } + &.inactive{ + display:none !important; + } + } + .roll-options, + .basic-moves{ + display:flex; + flex-wrap:wrap; + grid-gap:var(--half-gap); + } + .basic-moves{ + justify-content: space-between; + } + .roll-options{ + grid-column:1; + justify-content: center; + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/sections/_notes.scss b/backbone/source/assets/scss/sections/_notes.scss new file mode 100644 index 0000000000..7d4182b9ad --- /dev/null +++ b/backbone/source/assets/scss/sections/_notes.scss @@ -0,0 +1,8 @@ +#notes{ + display:grid; + grid-template-columns: repeat(auto-fill,minmax(var(--columnSize),1fr)); + gap:var(--big-gap); + .headed-textarea{ + grid-column: initial; + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/sections/_npc.scss b/backbone/source/assets/scss/sections/_npc.scss new file mode 100644 index 0000000000..372c89c647 --- /dev/null +++ b/backbone/source/assets/scss/sections/_npc.scss @@ -0,0 +1,26 @@ +#npc{ + max-width:500px; + display:flex; + flex-direction: column; + gap:var(--half-gap); + h3{ + text-align:left; + } + .repeating-container{ + grid-template-columns:1fr 60px; + grid-template-rows:auto 1fr; + grid-template-areas: + 'header buttons' + 'repeat repeat'; + h3{ + grid-area:header; + } + .repcontrol_edit, + .repcontrol-button--add{ + grid-area:buttons; + } + .repcontainer{ + grid-area:repeat; + } + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/sections/_npcAbilities.scss b/backbone/source/assets/scss/sections/_npcAbilities.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/backbone/source/assets/scss/sections/_npcGear.scss b/backbone/source/assets/scss/sections/_npcGear.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/backbone/source/assets/scss/sections/_npcHeader.scss b/backbone/source/assets/scss/sections/_npcHeader.scss new file mode 100644 index 0000000000..91a441d396 --- /dev/null +++ b/backbone/source/assets/scss/sections/_npcHeader.scss @@ -0,0 +1,7 @@ +#npc-header{ + display:flex; + input[type="text"]{ + flex:1; + width:0; + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/sections/_npcSkills.scss b/backbone/source/assets/scss/sections/_npcSkills.scss new file mode 100644 index 0000000000..d239fd6d6c --- /dev/null +++ b/backbone/source/assets/scss/sections/_npcSkills.scss @@ -0,0 +1,5 @@ +.npc-skill-container{ + display:flex; + flex-wrap:wrap; + gap:var(--half-gap); +} \ No newline at end of file diff --git a/backbone/source/assets/scss/sections/_npcStats.scss b/backbone/source/assets/scss/sections/_npcStats.scss new file mode 100644 index 0000000000..78f31968ea --- /dev/null +++ b/backbone/source/assets/scss/sections/_npcStats.scss @@ -0,0 +1,11 @@ +#npc-stats{ + border-bottom:2px dashed lightgray; + padding-bottom:var(--half-gap); + .characteristics{ + display:grid; + grid-template-columns:repeat(4,1fr); + } + .circle{ + width:4.5rem; + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/sections/_npcWeapons.scss b/backbone/source/assets/scss/sections/_npcWeapons.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/backbone/source/assets/scss/sections/_pc.scss b/backbone/source/assets/scss/sections/_pc.scss new file mode 100644 index 0000000000..4619191b54 --- /dev/null +++ b/backbone/source/assets/scss/sections/_pc.scss @@ -0,0 +1,8 @@ +#pc{ + display:grid; + grid-template-columns:repeat(auto-fit,minmax(var(--columnSize),1fr)); + gap:var(--grid-gap); + section{ + align-self:start; + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/sections/_skills.scss b/backbone/source/assets/scss/sections/_skills.scss new file mode 100644 index 0000000000..822a477793 --- /dev/null +++ b/backbone/source/assets/scss/sections/_skills.scss @@ -0,0 +1,65 @@ +#skills{ + grid-column:1 / -1; + display:flex; + flex-wrap:wrap; + gap:var(--half-gap) var(--big-gap); + .stacked{ + flex-direction: column-reverse; + } + .fill-left__radio{ + border:1px solid var(--borderColor); + &:first-child{ + border-radius: 50% 0 0 50%; + } + &:before{ + line-height:0; + } + } + .parens-holder{ + input{ + position:relative; + top:var(--half-gap); + } + } + > .basic-skills{ + width: 100%; + > :first-child{ + display:flex; + gap:var(--half-gap); + justify-content: space-between; + } + > h2{ + column-span:all; + } + > .skill-container{ + column: { + width:var(--columnSize); + gap:var(--big-gap); + rule:2px solid var(--fontColor); + } + > .skill-row{ + break-inside:avoid; + } + } + } + > :not(.basic-skills){ + flex:1 1 var(--columnSize); + } + .skill-row, + .repitem{ + display:flex; + gap:var(--half-gap); + align-items:center; + > :first-child{ + flex:1 0 auto; + } + [aria-level="3"]{ + font-size:1.125rem; + text-transform:capitalize; + text-align:left; + } + input[type="number"]{ + width:2rem; + } + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/sections/_traits.scss b/backbone/source/assets/scss/sections/_traits.scss new file mode 100644 index 0000000000..4ab45baf34 --- /dev/null +++ b/backbone/source/assets/scss/sections/_traits.scss @@ -0,0 +1,8 @@ +#favorable-traits, +#unfavorable-traits{ + .repitem{ + display:flex; + flex-direction:column; + gap:var(--half-gap); + } +} \ No newline at end of file diff --git a/backbone/source/assets/scss/sections/_weapons.scss b/backbone/source/assets/scss/sections/_weapons.scss new file mode 100644 index 0000000000..afe09eb6f3 --- /dev/null +++ b/backbone/source/assets/scss/sections/_weapons.scss @@ -0,0 +1,42 @@ +#weapons{ + .repitem{ + display:grid; + grid-template-columns:auto 1fr ; + gap:var(--half-gap); + grid-template-areas: + 'equipped name name roller' + 'damage damage range range' + 'blitz blitz wear wear'; + @each $field in equipped,name,roller,damage,range,blitz,wear{ + .#{$field}{ + grid-area:$field; + } + } + .section-display{ + grid-column:1 / -1; + display:flex; + flex-wrap:wrap; + gap:var(--half-gap); + } + .blitz,.wear{ + justify-self:center; + flex:1 1 0; + width:0; + input{ + width:0; + } + } + } + .ammo-container{ + .container-name{ + width:10rem; + flex:1; + } + .parens-holder{ + flex: 0; + } + .ammo-type{ + width:5rem + } + } +} \ No newline at end of file diff --git a/backbone/source/backbone.pug b/backbone/source/backbone.pug new file mode 100644 index 0000000000..e887217bc3 --- /dev/null +++ b/backbone/source/backbone.pug @@ -0,0 +1,25 @@ +include ./scaffold/_k.pug +include mixins/_sheetmixins.pug +- const templateName = 'backbone'; +//- sheet_state will contain which display of the sheet is currently enabled ++hidden({name:'sheet version',value:0}) ++hidden({name:'sheet state',value:'settings'}) +//- collapsed will contain the sections that are currently collapsed as a space separated list ++hidden({name:'collapsed',value:''}) +//- Now, for our actual sheet. We'll wrap this in a main element and give it an ID of main. +main#main + +tabs({name:"backbone",defaultActiveTab:"settings",navFuncs:['refreshAnimations']}) + include articles/_pc.pug + +bestWorstToggle + include articles/_npc.pug + include articles/_settings.pug + +include rolltemplates/_backbone.pug ++hidden({ + name:'template start', + value:`@{whisper}&{template:${templateName}} {{character_name=@{character_name}}} {{character_id=@{character_id}}}` + }) ++kscript + //- All additional javascript files should start here + include javascript/_index.pug + \ No newline at end of file diff --git a/backbone/source/backbone.scss b/backbone/source/backbone.scss new file mode 100644 index 0000000000..a390358d9a --- /dev/null +++ b/backbone/source/backbone.scss @@ -0,0 +1,26 @@ +@use 'assets/scss/roll20clear'; +@use 'scaffold/k'; +@use 'assets/scss/generalsetup'; + +@use 'assets/scss/sections/nav'; + +@use 'assets/scss/sections/pc'; +@use 'assets/scss/sections/header'; +@use 'assets/scss/sections/basic_stats'; +@use 'assets/scss/sections/combat_stats'; +@use 'assets/scss/sections/skills'; +@use 'assets/scss/sections/notes'; +@use 'assets/scss/sections/gear'; +@use 'assets/scss/sections/weapons'; +@use 'assets/scss/sections/archetypes'; +@use 'assets/scss/sections/abilities'; +@use 'assets/scss/sections/traits'; +@use 'assets/scss/sections/npc'; +@use 'assets/scss/sections/npcAbilities'; +@use 'assets/scss/sections/npcGear'; +@use 'assets/scss/sections/npcHeader'; +@use 'assets/scss/sections/npcSkills'; +@use 'assets/scss/sections/npcStats'; +@use 'assets/scss/sections/condition'; +@use 'assets/scss/sections/npcWeapons'; +@use 'assets/scss/rolltemplate'; diff --git a/backbone/source/javascript/__tests__/calculation.test.js b/backbone/source/javascript/__tests__/calculation.test.js new file mode 100644 index 0000000000..5e8d323da8 --- /dev/null +++ b/backbone/source/javascript/__tests__/calculation.test.js @@ -0,0 +1,149 @@ +const { k } = require('..'); +describe('Calculation.js',()=>{ + describe('calcAttribute({trigger,attributes})',()=>{ + Object.entries({ + vigilance:[{logic:2,willpower:2},{logic:0,willpower:-1},{logic:-1,willpower:-1}], + build:[{size:2,stamina:2},{size:2,stamina:-1},{size:-1,stamina:-1}], + intuition:[{charisma:2,wisdom:2},{charisma:2,wisdom:-1},{charisma:-1,wisdom:-1}], + reflex:[{athletics:2,aptitude:2},{athletics:2,aptitude:-1},{athletics:-1,aptitude:-1}] + }).forEach(([attr,propArray])=>{ + propArray.forEach(obj => { + const entries = Object.entries(obj); + const [prop1,value1,prop2,value2] = entries.flat(); + const expectedVal = 10 + value1 + value2; + const itMsg = `Given ${value1} ${prop1} and ${value2} ${prop2}, should return ${expectedVal} for ${attr}` + it(itMsg,()=>{ + k.getAllAttrs({ + callback:(attributes,sections,casc)=>{ + attributes[prop1] = value1; + attributes[prop2] = value2; + const retVal = k.callFunc('calcAttribute',{trigger:{name:`${attr}_goal`},attributes}); + expect(retVal).toBe(expectedVal); + } + }); + }); + }); + }); + }); + describe('calcAttributeMod({trigger,attributes})',()=>{ + Object.entries({ + vigilance:[9,11,14], + build:[9,11,14], + intuition:[9,11,14], + reflex:[9,11,14], + }).forEach(([attr,numArr]) => { + numArr.forEach((num)=>{ + const expectedVal = num - 11; + const itMsg = `Given ${num} ${attr}, should return ${expectedVal} for ${attr}_mod`; + it(itMsg,()=>{ + k.getAllAttrs({ + callback:(attributes,sections,casc)=>{ + attributes[`${attr}_goal`] = num; + expect(k.callFunc('calcAttributeMod',{trigger:{name:attr},attributes})).toBe(expectedVal); + } + }); + }); + }); + }); + }); + describe('calcMovement({attributes})',()=>{ + [-1,0,2].forEach(num => { + const expectedVal = 20 + num * 5; + const itMsg = `Given ${num} athletics, should return ${expectedVal}`; + it(itMsg,()=>{ + k.getAllAttrs({ + callback:(attributes,sections,casc) => { + attributes.athletics = num; + expect(k.callFunc('calcMovement',{attributes})).toBe(expectedVal); + } + }) + }) + }); + }); + describe('calcSprint({attributes})',()=>{ + [-1,0,2].forEach(num => { + const expectedVal = 10 + num * 5; + const itMsg = `Given ${num} athletics, should return ${expectedVal}`; + it(itMsg,()=>{ + k.getAllAttrs({ + callback:(attributes,sections,casc) => { + attributes.athletics = num; + expect(k.callFunc('calcSprint',{attributes})).toBe(expectedVal); + } + }); + }); + }); + }); + describe('calcItemSlotsMax({attributes})',()=>{ + it('Max item slots should equal the largest of SIZ + 3 or SIZ + ATH + 1',()=>{ + k.getAllAttrs({ + callback:(attributes,sections,casc)=>{ + // siz + athletics + 1 < siz + 3 + attributes.attributes.size = 4; + attributes.attributes.athletics = 1; + const sizExpected = 7; + + const sizReceived = k.callFunc('calcItemSlotsMax',{attributes}); + + expect(sizReceived).toBe(sizExpected); + // siz + athletics + 1 === siz +3 + attributes.attributes.size = 4; + attributes.attributes.athletics = 2; + const equalExpected = 7; + + const equalReceived = k.callFunc('calcItemSlotsMax',{attributes}); + + expect(equalReceived).toBe(equalExpected); + + // siz + athletics + 1 > siz +3 + attributes.attributes.size = 4; + attributes.attributes.athletics = 4; + const athExpected = 9; + + const athReceived = k.callFunc('calcItemSlotsMax',{attributes}); + + expect(athReceived).toBe(athExpected); + } + }); + }); + }); + describe('calcUsedSlots({attributes,sections})',()=>{ + it('used Item slots should equal the number of equipped items',()=>{ + k.getAllAttrs({ + callback:(attributes,sections,casc)=>{ + // no equipped items + const emptyUsed = k.callFunc('calcUsedSlots',{attributes,sections}); + + expect(emptyUsed).toBe(0); + + // 3 equipped gear pieces; 1 that doesn't use a slot, no weapons + const equippedRows = [1,2,3].map(n=>k.generateRowID('repeating_equipped',sections)); + equippedRows.forEach((row,n)=> + attributes.attributes[`${row}_uses_slot`] = + n === 1 ? + 0 : + 1 + ); + + const equipUsed = k.callFunc('calcUsedSlots',{attributes,sections}); + + expect(equipUsed).toBe(2); + + // 3 equipped gear pieces; 1 that doesn't use a slot, and 2 weapons; 1 that doesn't use a slot + const weaponRows = [1,2].map(n=>k.generateRowID('repeating_weapon',sections)); + weaponRows.forEach((row,n)=> + attributes.attributes[`${row}_uses_slot`] = + n === 1 ? + 0 : + 1 + ); + + const weaponUsed = k.callFunc('calcUsedSlots',{attributes,sections}); + + expect(weaponUsed).toBe(3); + + } + }) + }) + }); +}); \ No newline at end of file diff --git a/backbone/source/javascript/_index.pug b/backbone/source/javascript/_index.pug new file mode 100644 index 0000000000..daa2081fec --- /dev/null +++ b/backbone/source/javascript/_index.pug @@ -0,0 +1,5 @@ +include ./variables.js +include ./calculations.js +include ./triggeredFuncs.js +include ./rollFunctions.js +include ./navFuncs.js \ No newline at end of file diff --git a/backbone/source/javascript/calculations.js b/backbone/source/javascript/calculations.js new file mode 100644 index 0000000000..6b86ec2ea3 --- /dev/null +++ b/backbone/source/javascript/calculations.js @@ -0,0 +1,113 @@ +/** + * Function to calculate the raw attribute score + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const calcAttribute = function({trigger,attributes,sections,casc}){ + const [charac1,charac2] = attributesDetails[trigger.name]; + return 10 + attributes[charac1] + attributes[charac2]; +}; +k.registerFuncs({calcAttribute}); + +/** + * Function to calculate the attribute modifier + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const calcAttributeMod = function({trigger,attributes,sections,casc}){ + const baseName = `${trigger.name}_goal`; + return attributes[baseName] - 11; +}; +k.registerFuncs({calcAttributeMod}); + +/** + * Function to calculate the sprint speed of a character + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const calcSprint = function({trigger,attributes,sections,casc}){ + return attributes.athletics * 5 + 10; +}; +k.registerFuncs({calcSprint}); + +/** + * Function to calculate the movement speed of a character + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const calcMovement = function({trigger,attributes,sections,casc}){ + return attributes.athletics * 5 + 20; +}; +k.registerFuncs({calcMovement}); + +/** + * Calculates the maximum item slots that can be used without penalty + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const calcItemSlotsMax = function({trigger,attributes,sections,casc}){ + return Math.max( + attributes.size + 3, + attributes.athletics + attributes.size + 1 + ); +}; +k.registerFuncs({calcItemSlotsMax}); + +/** + * Calculates how many slots have been used based on the equipped gear and weapon sections + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const calcUsedSlots = function({trigger,attributes,sections,casc}){ + const equippedIDs = [ + ...sections.repeating_equipped.map(id => `repeating_equipped_${id}`), + ...sections.repeating_weapon.map(id => `repeating_weapon_${id}`) + ]; + let freeWeapons = 3; + return equippedIDs + .reduce((total,section) => { + if( + attributes[`${section}_uses_slot`] && + ( + !section.startsWith('repeating_weapon') || + freeWeapons <= 0 + ) + ){ + total += 1; + } + if( + section.startsWith('repeating_weapon') && + freeWeapons > 0 + ){ + freeWeapons--; + } + return total; + },0); +}; +k.registerFuncs({calcUsedSlots}); + +/** + * Calculates whether the character is overburdened or not, returning 1 if they are and 0 otherwise + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const calcOverburdened = function({trigger,attributes,sections,casc}){ + return attributes.item_slots_max - attributes.item_slots < 0 ? + 1 : + 0; +}; +k.registerFuncs({calcOverburdened}); \ No newline at end of file diff --git a/backbone/source/javascript/index.js b/backbone/source/javascript/index.js new file mode 100644 index 0000000000..e7c7516cbd --- /dev/null +++ b/backbone/source/javascript/index.js @@ -0,0 +1,1689 @@ +// This code adapted from Nic Bradley's R20 test framework from the WFRP4e official sheet. +const _ = require('underscore'); +const environment = { + attributes: {}, + triggers: [], +}; +global.environment = environment; +const on = jest.fn((trigger, func) => { + environment.triggers.push({ trigger, func }); +}); +global.on = on; +const getAttrs = jest.fn((query, callback) => { + let values = {}; + for (const attr of query) { + if (attr in environment.attributes) values[attr] = environment.attributes[attr]; + } + if (typeof callback === "function") callback(values); +}); +global.getAttrs = getAttrs; +const setAttrs = jest.fn((submit, params, callback) => { + if (!callback && typeof params === "function") callback = params; + for (const attr in submit) { + environment.attributes[attr] = submit[attr]; + } + if (typeof callback === "function") callback(); +}); +global.setAttrs = setAttrs; +const getSectionIDs = jest.fn((section, callback) => { + const ids = []; + const sectionName = section.indexOf("repeating_") === 0 ? section : `repeating_${section}`; + const attributes = environment.attributes; + for (const attr in attributes) { + if (attr.indexOf(sectionName) === 0) ids.push(attr.split("_")[2]); + } + const idMap = [...new Set(ids)]; + if (typeof callback === "function") callback(idMap); +}); +global.getSectionIDs = getSectionIDs; +const getSectionIDsSync = jest.fn((section) => { + const ids = []; + const sectionName = section.indexOf("repeating_") === 0 ? section : `repeating_${section}`; + const attributes = environment.attributes; + for (const attr in attributes) { + if (attr.indexOf(sectionName) === 0) ids.push(attr.split("_")[2]); + } + const idMap = [...new Set(ids)]; + return idMap; +}); +global.getSectionIDsSync = getSectionIDsSync; +const removeRepeatingRow = jest.fn((id) => { + const attributes = environment.attributes; + for (const attr in attributes) { + if (attr.indexOf(id) > -1) delete environment.attributes[attr]; + } +}); +global.removeRepeatingRow = removeRepeatingRow; +const getCompendiumPage = jest.fn((request, callback) => { + const pages = compendiumData; + if (!pages) + throw new Error( + "Tried to use getCompendiumPage, but testing environment does not contain compendiumData." + ); + if (typeof request === "string") { + const [category, pageName] = request.split(":"); + const response = { + Name: pageName, + Category: category, + data: {}, + }; + if (pages[request]) response.data = pages[request].data; + if (typeof callback === "function") callback(response); + } else if (Array.isArray(request)) { + const pageArray = []; + for (const page of request) { + if (pages[request] && pages[request].Category === category) pageArray.push(pages[pageName]); + } + if (typeof callback === "function") callback(pageArray); + } +}); +global.getCompendiumPage = getCompendiumPage; +const generateUUID = jest.fn(() => { + var a = 0, + b = []; + return (function () { + var c = new Date().getTime() + 0, + d = c === a; + a = c; + for (var e = Array(8), f = 7; 0 <= f; f--) + (e[f] = "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz".charAt(c % 64)), + (c = Math.floor(c / 64)); + c = e.join(""); + if (d) { + for (f = 11; 0 <= f && 63 === b[f]; f--) b[f] = 0; + b[f]++; + } else for (f = 0; 12 > f; f++) b[f] = Math.floor(64 * Math.random()); + for (f = 0; 12 > f; f++) + c += "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz".charAt(b[f]); + return c.replace(/_/g, "z"); + })(); +}); +global.generateUUID = generateUUID; +const generateRowID = jest.fn(() => { + return generateUUID().replace(/_/g, "Z"); +}); +global.generateRowID = generateRowID; +const simulateEvent = jest.fn((event) => { + environment.triggers.forEach((trigger) => { + const splitTriggers = trigger.trigger.split(" ") || [trigger.trigger]; + splitTriggers.forEach((singleTrigger) => { + if (event === singleTrigger) { + trigger.func({ + sourceAttribute: "test", + }); + } + }); + }); +}); +global.simulateEvent = simulateEvent; +const getTranslationByKey = jest.fn((key) => key); +global.getTranslationByKey = getTranslationByKey; +// Roll Handlingglobal.getTranslationByKey = getTranslationByKey; + +const extractRollTemplate = (rollString) => { + const rollTemplate = rollString.match(/&\{template:(.*?)\}/)?.[1]; + environment.attributes.__rolltemplate = rollTemplate; +}; + +const cleanRollElements = (value) => value.replace(/(\{\{|\}})/gi, "").split("="); + +const extractRollElements = (rollString) => { + const rollElements = rollString.match(/\{\{(.*?)\}{2,}/g); + if (!rollElements || rollElements.length < 1) throw new Error("No roll elements provided in roll string"); + return Object.fromEntries(rollElements.map(cleanRollElements)); +}; + +const getExpression = (element) => element.replace(/(\[\[|\]\])/gi, ""); + +const getDiceOrHalf = (size) => { + const diceStack = environment.diceStack; + if (!diceStack?.[size] || diceStack[size].length < 0) return size / 2; + return environment.diceStack[size].pop(); +}; + +const getDiceRolls = (expression) => { + const rolls = expression.match(/([0-9]+)?d([0-9]+)/gi); + if (!rolls) return []; + const allRolls = []; + rolls.forEach((roll) => { + const [number, size] = roll.split(/d/i); + for (let i = 1; i <= number; i++) { + const dice = getDiceOrHalf(size); + allRolls.push(dice); + } + }); + return allRolls; +}; + +const calculateResult = (expression, dice) => { + const rolls = expression.match(/([0-9]+)?d([0-9]+)/gi); + if (!rolls) return eval(expression); + rolls.forEach((roll, index) => { + const [number, size] = roll.split(/d/i); + let total = 0; + for (let i = 1; i <= number; i++) { + total += +dice.shift(); + } + expression = expression.replace(/([0-9]+d[0-9]+([+\-*/][0-9]+)?)(.*?)$/gi, "$1"); + const regex = new RegExp(roll, "gi"); + expression = expression.replace(regex, total); + }); + + return eval(expression); +}; + +const replaceAttributes = (element) => { + const test = /@\{(.*?)\}/i; + while (test.test(element)) { + element = element.replace(/@\{(.*?)\}/gi, (sub, ...args) => { + const attributeName = args[0]; + const attributeValue = environment.attributes[attributeName]; + const attributeExists = typeof attributeValue !== "undefined"; + const possibleAttributes = Object.keys(environment.attributes); + if (attributeExists) return attributeValue; + else + throw new Error( + `Roll called ${sub} but no corresponding attribute "${attributeName}" was found. Attributes are: ${possibleAttributes.join( + ", " + )}` + ); + }); + } + return element; +}; + +const calculateRollResult = (rollElements) => { + const results = {}; + for (const key in rollElements) { + const element = rollElements[key]; + if (element.indexOf("[[") === -1) continue; + const attributeFilled = replaceAttributes(element); + const expression = getExpression(attributeFilled); + const dice = getDiceRolls(expression); + const result = calculateResult(expression, [...dice]); + results[key] = { + result, + dice, + expression, + }; + } + return results; +}; + +const startRoll = jest.fn(async (rollString) => { + if (!rollString) throw new Error("startRoll expected a Roll String but none was provided."); + const rollResult = { results: {} }; + extractRollTemplate(rollString); + const rollElements = extractRollElements(rollString); + rollResult.results = calculateRollResult(rollElements); + rollResult.rollId = generateUUID(); + return rollResult; +}); +global.startRoll = startRoll; +const finishRoll = jest.fn(() => {}); +global.finishRoll = finishRoll; + + const k = (function(){ + const kFuncs = {}; + + const cascades = {"attr_character_name":{"name":"character_name","type":"text","defaultValue":"","affects":[],"triggeredFuncs":["setActionCalls"],"listenerFunc":"accessSheet","listener":"change:character_name"},"attr_sheet_version":{"name":"sheet_version","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_sheet_state":{"name":"sheet_state","type":"hidden","defaultValue":"settings","triggeredFuncs":[],"affects":[]},"attr_collapsed":{"name":"collapsed","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_backbone_tab":{"name":"backbone_tab","type":"hidden","defaultValue":"nav-tabs-backbone--settings","triggeredFuncs":[],"affects":[]},"attr_bewildered":{"triggeredFuncs":["resetCondition"],"name":"bewildered","listener":"change:bewildered","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-bewildered":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-bewildered","listener":"clicked:decrement-track-bewildered","listenerFunc":"accessSheet","type":"action"},"attr_track_bewildered":{"name":"track_bewildered","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-bewildered":{"triggeredFuncs":["incrementInput"],"name":"increment-track-bewildered","listener":"clicked:increment-track-bewildered","listenerFunc":"accessSheet","type":"action"},"attr_bleeding":{"triggeredFuncs":["resetCondition"],"name":"bleeding","listener":"change:bleeding","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-bleeding":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-bleeding","listener":"clicked:decrement-track-bleeding","listenerFunc":"accessSheet","type":"action"},"attr_track_bleeding":{"name":"track_bleeding","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-bleeding":{"triggeredFuncs":["incrementInput"],"name":"increment-track-bleeding","listener":"clicked:increment-track-bleeding","listenerFunc":"accessSheet","type":"action"},"attr_blinded":{"triggeredFuncs":["resetCondition"],"name":"blinded","listener":"change:blinded","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-blinded":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-blinded","listener":"clicked:decrement-track-blinded","listenerFunc":"accessSheet","type":"action"},"attr_track_blinded":{"name":"track_blinded","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-blinded":{"triggeredFuncs":["incrementInput"],"name":"increment-track-blinded","listener":"clicked:increment-track-blinded","listenerFunc":"accessSheet","type":"action"},"attr_burned":{"triggeredFuncs":["resetCondition"],"name":"burned","listener":"change:burned","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-burned":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-burned","listener":"clicked:decrement-track-burned","listenerFunc":"accessSheet","type":"action"},"attr_track_burned":{"name":"track_burned","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-burned":{"triggeredFuncs":["incrementInput"],"name":"increment-track-burned","listener":"clicked:increment-track-burned","listenerFunc":"accessSheet","type":"action"},"attr_confused":{"triggeredFuncs":["resetCondition"],"name":"confused","listener":"change:confused","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-confused":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-confused","listener":"clicked:decrement-track-confused","listenerFunc":"accessSheet","type":"action"},"attr_track_confused":{"name":"track_confused","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-confused":{"triggeredFuncs":["incrementInput"],"name":"increment-track-confused","listener":"clicked:increment-track-confused","listenerFunc":"accessSheet","type":"action"},"attr_deafened":{"triggeredFuncs":["resetCondition"],"name":"deafened","listener":"change:deafened","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-deafened":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-deafened","listener":"clicked:decrement-track-deafened","listenerFunc":"accessSheet","type":"action"},"attr_track_deafened":{"name":"track_deafened","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-deafened":{"triggeredFuncs":["incrementInput"],"name":"increment-track-deafened","listener":"clicked:increment-track-deafened","listenerFunc":"accessSheet","type":"action"},"attr_incapacitated":{"triggeredFuncs":["resetCondition"],"name":"incapacitated","listener":"change:incapacitated","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-incapacitated":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-incapacitated","listener":"clicked:decrement-track-incapacitated","listenerFunc":"accessSheet","type":"action"},"attr_track_incapacitated":{"name":"track_incapacitated","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-incapacitated":{"triggeredFuncs":["incrementInput"],"name":"increment-track-incapacitated","listener":"clicked:increment-track-incapacitated","listenerFunc":"accessSheet","type":"action"},"attr_infuriated":{"triggeredFuncs":["resetCondition"],"name":"infuriated","listener":"change:infuriated","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-infuriated":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-infuriated","listener":"clicked:decrement-track-infuriated","listenerFunc":"accessSheet","type":"action"},"attr_track_infuriated":{"name":"track_infuriated","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-infuriated":{"triggeredFuncs":["incrementInput"],"name":"increment-track-infuriated","listener":"clicked:increment-track-infuriated","listenerFunc":"accessSheet","type":"action"},"attr_intoxicated":{"triggeredFuncs":["resetCondition"],"name":"intoxicated","listener":"change:intoxicated","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-intoxicated":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-intoxicated","listener":"clicked:decrement-track-intoxicated","listenerFunc":"accessSheet","type":"action"},"attr_track_intoxicated":{"name":"track_intoxicated","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-intoxicated":{"triggeredFuncs":["incrementInput"],"name":"increment-track-intoxicated","listener":"clicked:increment-track-intoxicated","listenerFunc":"accessSheet","type":"action"},"attr_plagued":{"triggeredFuncs":["resetCondition"],"name":"plagued","listener":"change:plagued","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-plagued":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-plagued","listener":"clicked:decrement-track-plagued","listenerFunc":"accessSheet","type":"action"},"attr_track_plagued":{"name":"track_plagued","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-plagued":{"triggeredFuncs":["incrementInput"],"name":"increment-track-plagued","listener":"clicked:increment-track-plagued","listenerFunc":"accessSheet","type":"action"},"attr_poisoned":{"triggeredFuncs":["resetCondition"],"name":"poisoned","listener":"change:poisoned","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-poisoned":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-poisoned","listener":"clicked:decrement-track-poisoned","listenerFunc":"accessSheet","type":"action"},"attr_track_poisoned":{"name":"track_poisoned","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-poisoned":{"triggeredFuncs":["incrementInput"],"name":"increment-track-poisoned","listener":"clicked:increment-track-poisoned","listenerFunc":"accessSheet","type":"action"},"attr_panicked":{"triggeredFuncs":["resetCondition"],"name":"panicked","listener":"change:panicked","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-panicked":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-panicked","listener":"clicked:decrement-track-panicked","listenerFunc":"accessSheet","type":"action"},"attr_track_panicked":{"name":"track_panicked","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-panicked":{"triggeredFuncs":["incrementInput"],"name":"increment-track-panicked","listener":"clicked:increment-track-panicked","listenerFunc":"accessSheet","type":"action"},"attr_sleeping":{"triggeredFuncs":["resetCondition"],"name":"sleeping","listener":"change:sleeping","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-sleeping":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-sleeping","listener":"clicked:decrement-track-sleeping","listenerFunc":"accessSheet","type":"action"},"attr_track_sleeping":{"name":"track_sleeping","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-sleeping":{"triggeredFuncs":["incrementInput"],"name":"increment-track-sleeping","listener":"clicked:increment-track-sleeping","listenerFunc":"accessSheet","type":"action"},"attr_spellbound":{"triggeredFuncs":["resetCondition"],"name":"spellbound","listener":"change:spellbound","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-spellbound":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-spellbound","listener":"clicked:decrement-track-spellbound","listenerFunc":"accessSheet","type":"action"},"attr_track_spellbound":{"name":"track_spellbound","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-spellbound":{"triggeredFuncs":["incrementInput"],"name":"increment-track-spellbound","listener":"clicked:increment-track-spellbound","listenerFunc":"accessSheet","type":"action"},"attr_wounded":{"triggeredFuncs":["resetCondition"],"name":"wounded","listener":"change:wounded","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-wounded":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-wounded","listener":"clicked:decrement-track-wounded","listenerFunc":"accessSheet","type":"action"},"attr_track_wounded":{"name":"track_wounded","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-wounded":{"triggeredFuncs":["incrementInput"],"name":"increment-track-wounded","listener":"clicked:increment-track-wounded","listenerFunc":"accessSheet","type":"action"},"attr_comatose":{"triggeredFuncs":["resetCondition"],"name":"comatose","listener":"change:comatose","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-comatose":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-comatose","listener":"clicked:decrement-track-comatose","listenerFunc":"accessSheet","type":"action"},"attr_track_comatose":{"name":"track_comatose","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-comatose":{"triggeredFuncs":["incrementInput"],"name":"increment-track-comatose","listener":"clicked:increment-track-comatose","listenerFunc":"accessSheet","type":"action"},"attr_death":{"triggeredFuncs":["resetCondition"],"name":"death","listener":"change:death","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-death":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-death","listener":"clicked:decrement-track-death","listenerFunc":"accessSheet","type":"action"},"attr_track_death":{"name":"track_death","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-death":{"triggeredFuncs":["incrementInput"],"name":"increment-track-death","listener":"clicked:increment-track-death","listenerFunc":"accessSheet","type":"action"},"attr_in_extremis":{"triggeredFuncs":["resetCondition"],"name":"in_extremis","listener":"change:in_extremis","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-in-extremis":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-in-extremis","listener":"clicked:decrement-track-in-extremis","listenerFunc":"accessSheet","type":"action"},"attr_track_in_extremis":{"name":"track_in_extremis","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-in-extremis":{"triggeredFuncs":["incrementInput"],"name":"increment-track-in-extremis","listener":"clicked:increment-track-in-extremis","listenerFunc":"accessSheet","type":"action"},"attr_prone":{"triggeredFuncs":["resetCondition"],"name":"prone","listener":"change:prone","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-prone":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-prone","listener":"clicked:decrement-track-prone","listenerFunc":"accessSheet","type":"action"},"attr_track_prone":{"name":"track_prone","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-prone":{"triggeredFuncs":["incrementInput"],"name":"increment-track-prone","listener":"clicked:increment-track-prone","listenerFunc":"accessSheet","type":"action"},"attr_restrained":{"triggeredFuncs":["resetCondition"],"name":"restrained","listener":"change:restrained","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-restrained":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-restrained","listener":"clicked:decrement-track-restrained","listenerFunc":"accessSheet","type":"action"},"attr_track_restrained":{"name":"track_restrained","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-restrained":{"triggeredFuncs":["incrementInput"],"name":"increment-track-restrained","listener":"clicked:increment-track-restrained","listenerFunc":"accessSheet","type":"action"},"attr_unconscious":{"triggeredFuncs":["resetCondition"],"name":"unconscious","listener":"change:unconscious","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-unconscious":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-unconscious","listener":"clicked:decrement-track-unconscious","listenerFunc":"accessSheet","type":"action"},"attr_track_unconscious":{"name":"track_unconscious","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-unconscious":{"triggeredFuncs":["incrementInput"],"name":"increment-track-unconscious","listener":"clicked:increment-track-unconscious","listenerFunc":"accessSheet","type":"action"},"attr_roll_state":{"name":"roll_state","type":"radio","defaultValue":"2d20kh1","triggeredFuncs":[],"affects":[]},"attr_whisper":{"name":"whisper","type":"hidden","defaultValue":" ","triggeredFuncs":["sheetTypeDisplay"],"affects":[],"listener":"change:whisper","listenerFunc":"accessSheet"},"act_nav-tabs-backbone--pc":{"triggeredFuncs":["kSwitchTab"],"navFuncs":["refreshAnimations"],"name":"nav-tabs-backbone--pc","listener":"clicked:nav-tabs-backbone--pc","listenerFunc":"accessSheet","type":"action"},"act_nav-tabs-backbone--npc":{"triggeredFuncs":["kSwitchTab"],"navFuncs":["refreshAnimations"],"name":"nav-tabs-backbone--npc","listener":"clicked:nav-tabs-backbone--npc","listenerFunc":"accessSheet","type":"action"},"act_nav-tabs-backbone--settings":{"triggeredFuncs":["kSwitchTab"],"navFuncs":["refreshAnimations"],"name":"nav-tabs-backbone--settings","listener":"clicked:nav-tabs-backbone--settings","listenerFunc":"accessSheet","type":"action"},"act_condition-display":{"triggeredFuncs":["showConditions"],"name":"condition-display","listener":"clicked:condition-display","listenerFunc":"accessSheet","type":"action"},"attr_age":{"name":"age","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_gender":{"name":"gender","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_origin":{"name":"origin","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_dialect":{"name":"dialect","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_level":{"name":"level","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_archetype":{"name":"archetype","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_ideals":{"name":"ideals","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_fortune":{"name":"fortune","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_aptitude":{"affects":["reflex_goal"],"name":"aptitude","listener":"change:aptitude","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_athletics":{"affects":["reflex_goal","movement_rate","sprint_speed","item_slots_max"],"name":"athletics","listener":"change:athletics","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_charisma":{"affects":["intuition_goal"],"name":"charisma","listener":"change:charisma","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_logic":{"affects":["vigilance_goal"],"name":"logic","listener":"change:logic","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_wisdom":{"affects":["intuition_goal"],"name":"wisdom","listener":"change:wisdom","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_size":{"affects":["build_goal","item_slots_max"],"name":"size","listener":"change:size","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_stamina":{"affects":["build_goal"],"name":"stamina","listener":"change:stamina","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_willpower":{"affects":["vigilance_goal"],"name":"willpower","listener":"change:willpower","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_vigilance_goal":{"calculation":"calcAttribute","affects":["vigilance"],"name":"vigilance_goal","listener":"change:vigilance_goal","listenerFunc":"accessSheet","type":"number","defaultValue":11,"triggeredFuncs":[]},"act_vigilance-action":{"triggeredFuncs":["rollAttribute"],"name":"vigilance-action","listener":"clicked:vigilance-action","listenerFunc":"accessSheet","type":"action"},"attr_vigilance_action":{"name":"vigilance_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_vigilance":{"calculation":"calcAttributeMod","name":"vigilance","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_build_goal":{"calculation":"calcAttribute","affects":["build"],"name":"build_goal","listener":"change:build_goal","listenerFunc":"accessSheet","type":"number","defaultValue":11,"triggeredFuncs":[]},"act_build-action":{"triggeredFuncs":["rollAttribute"],"name":"build-action","listener":"clicked:build-action","listenerFunc":"accessSheet","type":"action"},"attr_build_action":{"name":"build_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_build":{"calculation":"calcAttributeMod","name":"build","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_intuition_goal":{"calculation":"calcAttribute","affects":["intuition"],"name":"intuition_goal","listener":"change:intuition_goal","listenerFunc":"accessSheet","type":"number","defaultValue":11,"triggeredFuncs":[]},"act_intuition-action":{"triggeredFuncs":["rollAttribute"],"name":"intuition-action","listener":"clicked:intuition-action","listenerFunc":"accessSheet","type":"action"},"attr_intuition_action":{"name":"intuition_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_intuition":{"calculation":"calcAttributeMod","name":"intuition","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_reflex_goal":{"calculation":"calcAttribute","affects":["reflex"],"name":"reflex_goal","listener":"change:reflex_goal","listenerFunc":"accessSheet","type":"number","defaultValue":11,"triggeredFuncs":[]},"act_reflex-action":{"triggeredFuncs":["rollAttribute"],"name":"reflex-action","listener":"clicked:reflex-action","listenerFunc":"accessSheet","type":"action"},"attr_reflex_action":{"name":"reflex_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_reflex":{"calculation":"calcAttributeMod","name":"reflex","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_armor-collapse":{"name":"armor-collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_armor":{"name":"armor","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_movement_rate":{"calculation":"calcMovement","name":"movement_rate","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_sprint_speed":{"calculation":"calcSprint","name":"sprint_speed","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_armor_name":{"name":"armor_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_unequip-armor":{"triggeredFuncs":["equipArmor"],"name":"unequip-armor","listener":"clicked:unequip-armor","listenerFunc":"accessSheet","type":"action"},"attr_armor_details":{"name":"armor_details","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_health":{"name":"health","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_health-action":{"triggeredFuncs":["rollHealthCheck"],"name":"health-action","listener":"clicked:health-action","listenerFunc":"accessSheet","type":"action"},"attr_health_action":{"name":"health_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_health_max":{"name":"health_max","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_resolve":{"name":"resolve","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_resolve-action":{"triggeredFuncs":["rollHealthCheck"],"name":"resolve-action","listener":"clicked:resolve-action","listenerFunc":"accessSheet","type":"action"},"attr_resolve_action":{"name":"resolve_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_resolve_max":{"name":"resolve_max","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_luck":{"name":"luck","type":"radio","defaultValue":"odd","triggeredFuncs":[],"affects":[]},"act_luck-action":{"triggeredFuncs":["rollLuck"],"name":"luck-action","listener":"clicked:luck-action","listenerFunc":"accessSheet","type":"action"},"attr_luck_action":{"name":"luck_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_decrement-adrenaline":{"triggeredFuncs":["decrementInput"],"name":"decrement-adrenaline","listener":"clicked:decrement-adrenaline","listenerFunc":"accessSheet","type":"action"},"attr_adrenaline":{"name":"adrenaline","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-adrenaline":{"triggeredFuncs":["incrementInput"],"name":"increment-adrenaline","listener":"clicked:increment-adrenaline","listenerFunc":"accessSheet","type":"action"},"act_decrement-skill-points":{"triggeredFuncs":["decrementInput"],"name":"decrement-skill-points","listener":"clicked:decrement-skill-points","listenerFunc":"accessSheet","type":"action"},"attr_skill_points":{"name":"skill_points","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-skill-points":{"triggeredFuncs":["incrementInput"],"name":"increment-skill-points","listener":"clicked:increment-skill-points","listenerFunc":"accessSheet","type":"action"},"act_assess-action":{"triggeredFuncs":["rollSkill"],"name":"assess-action","listener":"clicked:assess-action","listenerFunc":"accessSheet","type":"action"},"attr_assess_action":{"name":"assess_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_assess_proficiency":{"name":"assess_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_assess_mastery":{"name":"assess_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_deceive-action":{"triggeredFuncs":["rollSkill"],"name":"deceive-action","listener":"clicked:deceive-action","listenerFunc":"accessSheet","type":"action"},"attr_deceive_action":{"name":"deceive_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_deceive_proficiency":{"name":"deceive_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_deceive_mastery":{"name":"deceive_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_deduce-action":{"triggeredFuncs":["rollSkill"],"name":"deduce-action","listener":"clicked:deduce-action","listenerFunc":"accessSheet","type":"action"},"attr_deduce_action":{"name":"deduce_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_deduce_proficiency":{"name":"deduce_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_deduce_mastery":{"name":"deduce_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_disguise-action":{"triggeredFuncs":["rollSkill"],"name":"disguise-action","listener":"clicked:disguise-action","listenerFunc":"accessSheet","type":"action"},"attr_disguise_action":{"name":"disguise_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_disguise_proficiency":{"name":"disguise_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_disguise_mastery":{"name":"disguise_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_encrypt-action":{"triggeredFuncs":["rollSkill"],"name":"encrypt-action","listener":"clicked:encrypt-action","listenerFunc":"accessSheet","type":"action"},"attr_encrypt_action":{"name":"encrypt_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_encrypt_proficiency":{"name":"encrypt_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_encrypt_mastery":{"name":"encrypt_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_first-aid-action":{"triggeredFuncs":["rollSkill"],"name":"first-aid-action","listener":"clicked:first-aid-action","listenerFunc":"accessSheet","type":"action"},"attr_first_aid_action":{"name":"first_aid_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_first_aid_proficiency":{"name":"first_aid_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_first_aid_mastery":{"name":"first_aid_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_hide-action":{"triggeredFuncs":["rollSkill"],"name":"hide-action","listener":"clicked:hide-action","listenerFunc":"accessSheet","type":"action"},"attr_hide_action":{"name":"hide_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_hide_proficiency":{"name":"hide_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_hide_mastery":{"name":"hide_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_legerdemain-action":{"triggeredFuncs":["rollSkill"],"name":"legerdemain-action","listener":"clicked:legerdemain-action","listenerFunc":"accessSheet","type":"action"},"attr_legerdemain_action":{"name":"legerdemain_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_legerdemain_proficiency":{"name":"legerdemain_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_legerdemain_mastery":{"name":"legerdemain_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_locksmith-action":{"triggeredFuncs":["rollSkill"],"name":"locksmith-action","listener":"clicked:locksmith-action","listenerFunc":"accessSheet","type":"action"},"attr_locksmith_action":{"name":"locksmith_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_locksmith_proficiency":{"name":"locksmith_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_locksmith_mastery":{"name":"locksmith_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_nurse-(ment)-action":{"triggeredFuncs":["rollSkill"],"name":"nurse-(ment)-action","listener":"clicked:nurse-(ment)-action","listenerFunc":"accessSheet","type":"action"},"attr_nurse_(ment)_action":{"name":"nurse_(ment)_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_nurse_(ment)_proficiency":{"name":"nurse_(ment)_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_nurse_(ment)_mastery":{"name":"nurse_(ment)_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_nurse-(phys)-action":{"triggeredFuncs":["rollSkill"],"name":"nurse-(phys)-action","listener":"clicked:nurse-(phys)-action","listenerFunc":"accessSheet","type":"action"},"attr_nurse_(phys)_action":{"name":"nurse_(phys)_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_nurse_(phys)_proficiency":{"name":"nurse_(phys)_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_nurse_(phys)_mastery":{"name":"nurse_(phys)_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_persuade-action":{"triggeredFuncs":["rollSkill"],"name":"persuade-action","listener":"clicked:persuade-action","listenerFunc":"accessSheet","type":"action"},"attr_persuade_action":{"name":"persuade_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_persuade_proficiency":{"name":"persuade_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_persuade_mastery":{"name":"persuade_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_research-action":{"triggeredFuncs":["rollSkill"],"name":"research-action","listener":"clicked:research-action","listenerFunc":"accessSheet","type":"action"},"attr_research_action":{"name":"research_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_research_proficiency":{"name":"research_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_research_mastery":{"name":"research_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_ride/steer-action":{"triggeredFuncs":["rollSkill"],"name":"ride/steer-action","listener":"clicked:ride/steer-action","listenerFunc":"accessSheet","type":"action"},"attr_ride/steer_action":{"name":"ride/steer_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_ride/steer_proficiency":{"name":"ride/steer_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_ride/steer_mastery":{"name":"ride/steer_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_search-action":{"triggeredFuncs":["rollSkill"],"name":"search-action","listener":"clicked:search-action","listenerFunc":"accessSheet","type":"action"},"attr_search_action":{"name":"search_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_search_proficiency":{"name":"search_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_search_mastery":{"name":"search_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_sneak-action":{"triggeredFuncs":["rollSkill"],"name":"sneak-action","listener":"clicked:sneak-action","listenerFunc":"accessSheet","type":"action"},"attr_sneak_action":{"name":"sneak_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_sneak_proficiency":{"name":"sneak_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_sneak_mastery":{"name":"sneak_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_stunt-action":{"triggeredFuncs":["rollSkill"],"name":"stunt-action","listener":"clicked:stunt-action","listenerFunc":"accessSheet","type":"action"},"attr_stunt_action":{"name":"stunt_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_stunt_proficiency":{"name":"stunt_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_stunt_mastery":{"name":"stunt_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_survive-action":{"triggeredFuncs":["rollSkill"],"name":"survive-action","listener":"clicked:survive-action","listenerFunc":"accessSheet","type":"action"},"attr_survive_action":{"name":"survive_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_survive_proficiency":{"name":"survive_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_survive_mastery":{"name":"survive_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_threaten-action":{"triggeredFuncs":["rollSkill"],"name":"threaten-action","listener":"clicked:threaten-action","listenerFunc":"accessSheet","type":"action"},"attr_threaten_action":{"name":"threaten_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_threaten_proficiency":{"name":"threaten_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_threaten_mastery":{"name":"threaten_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_tinker-action":{"triggeredFuncs":["rollSkill"],"name":"tinker-action","listener":"clicked:tinker-action","listenerFunc":"accessSheet","type":"action"},"attr_tinker_action":{"name":"tinker_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_tinker_proficiency":{"name":"tinker_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_tinker_mastery":{"name":"tinker_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_melee-action":{"triggeredFuncs":["rollSkill"],"name":"melee-action","listener":"clicked:melee-action","listenerFunc":"accessSheet","type":"action"},"attr_melee_action":{"name":"melee_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_melee_proficiency":{"name":"melee_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_melee_mastery":{"name":"melee_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_ranged-action":{"triggeredFuncs":["rollSkill"],"name":"ranged-action","listener":"clicked:ranged-action","listenerFunc":"accessSheet","type":"action"},"attr_ranged_action":{"name":"ranged_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_ranged_proficiency":{"name":"ranged_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_ranged_mastery":{"name":"ranged_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_add-specialty":{"listenerFunc":"addItem","name":"add-specialty","listener":"clicked:add-specialty","type":"action"},"act_repeating_specialty_$X_action":{"triggeredFuncs":["rollSkill"],"name":"repeating_specialty_$X_action","listener":"clicked:repeating_specialty:action","listenerFunc":"accessSheet","type":"action"},"attr_repeating_specialty_$X_action":{"name":"repeating_specialty_$X_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_specialty_$X_name":{"name":"repeating_specialty_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_specialty_$X_proficiency":{"name":"repeating_specialty_$X_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_repeating_specialty_$X_characteristic":{"name":"repeating_specialty_$X_characteristic","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_specialty_$X_undefined_mastery":{"name":"repeating_specialty_$X_undefined_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_credit":{"name":"credit","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_coin":{"name":"coin","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_badge":{"name":"badge","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_clothes":{"name":"clothes","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_overburdened":{"calculation":"calcOverburdened","name":"overburdened","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_item_slots":{"affects":["overburdened"],"calculation":"calcUsedSlots","name":"item_slots","listener":"change:item_slots","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_item_slots_max":{"affects":["overburdened"],"calculation":"calcItemSlotsMax","name":"item_slots_max","listener":"change:item_slots_max","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"act_add-equipped":{"listenerFunc":"addItem","name":"add-equipped","listener":"clicked:add-equipped","type":"action"},"attr_repeating_equipped_$X_collapse":{"name":"repeating_equipped_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_equipped_$X_equipped":{"triggeredFuncs":["equipItem"],"affects":["item_slots"],"name":"repeating_equipped_$X_equipped","listener":"change:repeating_equipped:equipped","listenerFunc":"accessSheet","type":"checkbox","defaultValue":1},"attr_repeating_equipped_$X_name":{"name":"repeating_equipped_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_equipped_$X_uses":{"name":"repeating_equipped_$X_uses","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_equipped_$X_uses_max":{"name":"repeating_equipped_$X_uses_max","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_repeating_equipped_$X_action":{"triggeredFuncs":["rollRepeating"],"name":"repeating_equipped_$X_action","listener":"clicked:repeating_equipped:action","listenerFunc":"accessSheet","type":"action"},"attr_repeating_equipped_$X_action":{"name":"repeating_equipped_$X_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_equipped_$X_skill":{"name":"repeating_equipped_$X_skill","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_equipped_$X_uses_slot":{"affects":["item_slots"],"name":"repeating_equipped_$X_uses_slot","listener":"change:repeating_equipped:uses_slot","listenerFunc":"accessSheet","type":"checkbox","defaultValue":1,"triggeredFuncs":[]},"attr_repeating_equipped_$X_item_size":{"name":"repeating_equipped_$X_item_size","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_equipped_$X_description":{"name":"repeating_equipped_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-stored":{"listenerFunc":"addItem","name":"add-stored","listener":"clicked:add-stored","type":"action"},"attr_repeating_stored_$X_collapse":{"name":"repeating_stored_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_equipped":{"triggeredFuncs":["equipItem"],"affects":["item_slots"],"name":"repeating_stored_$X_equipped","listener":"change:repeating_stored:equipped","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0},"attr_repeating_stored_$X_name":{"name":"repeating_stored_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_type":{"name":"repeating_stored_$X_type","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_wear":{"name":"repeating_stored_$X_wear","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_skill":{"name":"repeating_stored_$X_skill","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_properties":{"name":"repeating_stored_$X_properties","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_damage":{"name":"repeating_stored_$X_damage","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_damage_characteristic":{"name":"repeating_stored_$X_damage_characteristic","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_range":{"name":"repeating_stored_$X_range","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_uses":{"name":"repeating_stored_$X_uses","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_uses_max":{"name":"repeating_stored_$X_uses_max","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_armor_bonus":{"name":"repeating_stored_$X_armor_bonus","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_uses_slot":{"affects":["item_slots"],"name":"repeating_stored_$X_uses_slot","listener":"change:repeating_stored:uses_slot","listenerFunc":"accessSheet","type":"checkbox","defaultValue":1,"triggeredFuncs":[]},"attr_repeating_stored_$X_item_size":{"name":"repeating_stored_$X_item_size","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_description":{"name":"repeating_stored_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-weapon":{"listenerFunc":"addItem","name":"add-weapon","listener":"clicked:add-weapon","type":"action"},"fieldset_repeating_weapon":{"addFuncs":["addWeapon"],"name":"repeating_weapon","type":"fieldset"},"attr_repeating_weapon_$X_collapse":{"name":"repeating_weapon_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_equipped":{"triggeredFuncs":["equipItem"],"affects":["item_slots","item slots"],"name":"repeating_weapon_$X_equipped","listener":"change:repeating_weapon:equipped","listenerFunc":"accessSheet","type":"checkbox","defaultValue":1},"attr_repeating_weapon_$X_name":{"name":"repeating_weapon_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_wear":{"name":"repeating_weapon_$X_wear","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_repeating_weapon_$X_action":{"triggeredFuncs":["rollRepeating"],"name":"repeating_weapon_$X_action","listener":"clicked:repeating_weapon:action","listenerFunc":"accessSheet","type":"action"},"attr_repeating_weapon_$X_action":{"name":"repeating_weapon_$X_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_type":{"defaultValue":"","name":"repeating_weapon_$X_type","type":"checkbox","triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_skill":{"name":"repeating_weapon_$X_skill","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_properties":{"name":"repeating_weapon_$X_properties","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_damage":{"name":"repeating_weapon_$X_damage","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_damage_characteristic":{"name":"repeating_weapon_$X_damage_characteristic","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_range":{"name":"repeating_weapon_$X_range","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_uses_slot":{"affects":["item_slots","item slots"],"name":"repeating_weapon_$X_uses_slot","listener":"change:repeating_weapon:uses_slot","listenerFunc":"accessSheet","type":"checkbox","defaultValue":1,"triggeredFuncs":[]},"attr_repeating_weapon_$X_item_size":{"name":"repeating_weapon_$X_item_size","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_description":{"name":"repeating_weapon_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_container_1":{"name":"container_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_ammo_1":{"name":"ammo_1","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_ammo_type_1":{"name":"ammo_type_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_ammo_2":{"name":"ammo_2","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_ammo_type_2":{"name":"ammo_type_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_container_2":{"name":"container_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_ammo_3":{"name":"ammo_3","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_ammo_type_3":{"name":"ammo_type_3","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_ammo_4":{"name":"ammo_4","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_ammo_type_4":{"name":"ammo_type_4","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-ability":{"listenerFunc":"addItem","name":"add-ability","listener":"clicked:add-ability","type":"action"},"attr_repeating_ability_$X_collapse":{"name":"repeating_ability_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_repeating_ability_$X_action":{"triggeredFuncs":["rollRepeating"],"name":"repeating_ability_$X_action","listener":"clicked:repeating_ability:action","listenerFunc":"accessSheet","type":"action"},"attr_repeating_ability_$X_action":{"name":"repeating_ability_$X_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_ability_$X_name":{"name":"repeating_ability_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_ability_$X_skill":{"name":"repeating_ability_$X_skill","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_ability_$X_description":{"name":"repeating_ability_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-favorable":{"listenerFunc":"addItem","name":"add-favorable","listener":"clicked:add-favorable","type":"action"},"attr_repeating_favorable_$X_collapse":{"name":"repeating_favorable_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_favorable_$X_name":{"name":"repeating_favorable_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_favorable_$X_description":{"name":"repeating_favorable_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-unfavorable":{"listenerFunc":"addItem","name":"add-unfavorable","listener":"clicked:add-unfavorable","type":"action"},"attr_repeating_unfavorable_$X_collapse":{"name":"repeating_unfavorable_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_unfavorable_$X_name":{"name":"repeating_unfavorable_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_unfavorable_$X_description":{"name":"repeating_unfavorable_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_backstory":{"name":"backstory","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_notes":{"name":"notes","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_difficulty_size":{"name":"difficulty_size","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_difficulty_level":{"name":"difficulty_level","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_npc_skills":{"name":"npc_skills","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_assess":{"name":"assess","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:assess","listenerFunc":"accessSheet"},"attr_deceive":{"name":"deceive","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:deceive","listenerFunc":"accessSheet"},"attr_deduce":{"name":"deduce","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:deduce","listenerFunc":"accessSheet"},"attr_disguise":{"name":"disguise","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:disguise","listenerFunc":"accessSheet"},"attr_encrypt":{"name":"encrypt","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:encrypt","listenerFunc":"accessSheet"},"attr_first_aid":{"name":"first_aid","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:first_aid","listenerFunc":"accessSheet"},"attr_hide":{"name":"hide","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:hide","listenerFunc":"accessSheet"},"attr_legerdemain":{"name":"legerdemain","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:legerdemain","listenerFunc":"accessSheet"},"attr_locksmith":{"name":"locksmith","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:locksmith","listenerFunc":"accessSheet"},"attr_nurse_(ment)":{"name":"nurse_(ment)","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:nurse_(ment)","listenerFunc":"accessSheet"},"attr_nurse_(phys)":{"name":"nurse_(phys)","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:nurse_(phys)","listenerFunc":"accessSheet"},"attr_persuade":{"name":"persuade","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:persuade","listenerFunc":"accessSheet"},"attr_research":{"name":"research","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:research","listenerFunc":"accessSheet"},"attr_ride/steer":{"name":"ride/steer","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:ride/steer","listenerFunc":"accessSheet"},"attr_search":{"name":"search","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:search","listenerFunc":"accessSheet"},"attr_sneak":{"name":"sneak","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:sneak","listenerFunc":"accessSheet"},"attr_stunt":{"name":"stunt","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:stunt","listenerFunc":"accessSheet"},"attr_survive":{"name":"survive","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:survive","listenerFunc":"accessSheet"},"attr_threaten":{"name":"threaten","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:threaten","listenerFunc":"accessSheet"},"attr_tinker":{"name":"tinker","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:tinker","listenerFunc":"accessSheet"},"attr_melee":{"name":"melee","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:melee","listenerFunc":"accessSheet"},"attr_ranged":{"name":"ranged","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:ranged","listenerFunc":"accessSheet"},"attr_repeating_ability_$X_type":{"name":"repeating_ability_$X_type","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_npc_items":{"name":"npc_items","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_character_type":{"triggeredFuncs":["sheetTypeDisplay"],"name":"character_type","listener":"change:character_type","listenerFunc":"accessSheet","type":"select","defaultValue":"","affects":[]},"attr_template_start":{"name":"template_start","type":"hidden","defaultValue":"@{whisper}&{template:backbone} {{character_name=@{character_name}}} {{character_id=@{character_id}}}","triggeredFuncs":[],"affects":[]}}; + + kFuncs.cascades = cascades; + + const repeatingSectionDetails = [{"section":"repeating_specialty","fields":["action","name","proficiency","characteristic","undefined_mastery"]},{"section":"repeating_equipped","fields":["collapse","equipped","name","uses","uses_max","action","skill","uses_slot","item_size","description"]},{"section":"repeating_stored","fields":["collapse","equipped","name","type","wear","skill","properties","damage","damage_characteristic","range","uses","uses_max","armor_bonus","uses_slot","item_size","description"]},{"section":"repeating_weapon","fields":["collapse","equipped","name","wear","action","type","skill","properties","damage","damage_characteristic","range","uses_slot","item_size","description"]},{"section":"repeating_ability","fields":["collapse","action","name","skill","description","type"]},{"section":"repeating_favorable","fields":["collapse","name","description"]},{"section":"repeating_unfavorable","fields":["collapse","name","description"]}]; + + kFuncs.repeatingSectionDetails = repeatingSectionDetails; + /** + * This stores the name of your sheet for use in the logging functions {@link log} and {@link debug}. Accessible by `k.sheetName` + * @var + * @type {string} + */ +let sheetName = 'kScaffold Powered Sheet'; +kFuncs.sheetName = sheetName; +/** + * This stores the version of your sheet for use in the logging functions{@link log} and {@link debug}. It is also stored in the sheet_version attribute on your character sheet. Accessible via `k.version` + * @var + * @type {number} + */ +let version = 0; +kFuncs.version = version; +/** + * A boolean flag that tells the script whether to enable or disable {@link debug} calls. If the version of the sheet is `0`, or an attribute named `debug_mode` is found on opening this is set to true for your entire session. Otherwise, it remains false. + * @var + * @type {boolean} + */ +let debugMode = false; +kFuncs.debugMode = debugMode; +const funcs = {}; +kFuncs.funcs = funcs; +const updateHandlers = {}; +const openHandlers = {}; +const initialSetups = {}; +const allHandlers = {}; +const addFuncs = {}; + +const kscaffoldJSVersion = '0.0.4'; +const kscaffoldPUGVersion = '0.0.4'; + /*jshint esversion: 11, laxcomma:true, eqeqeq:true*/ +/*jshint -W014,-W084,-W030,-W033*/ +/** + * Replaces problem characters to use a string as a regex + * @param {string} text - The text to replace characters in + * @returns {string} + * @example + * const textForRegex = k.sanitizeForRegex('.some thing[with characters]'); + * console.log(textForRegex);// => "\.some thing\[with characters\]" + */ +const sanitizeForRegex = function(text){ + return text.replace(/\.|\||\(|\)|\[|\]|\-|\+|\?|\/|\{|\}|\^|\$|\*/g,'\\$&'); +}; +kFuncs.sanitizeForRegex = sanitizeForRegex; + +/** + * Converts a value to a number, it\'s default value, or `0` if no default value passed. + * @param {string|number} val - Value to convert to a number + * @param {number} def - The default value, uses 0 if not passed + * @returns {number|undefined} + * @example + * const num = k.value('100'); + * console.log(num);// => 100 + */ +const value = function(val,def){ + return (+val||def||0); +}; +kFuncs.value = value; + +/** + * Extracts the section (e.g. `repeating_equipment`), rowID (e.g `-;lkj098J:LKj`), and field name (e.g. `bulk`) from a repeating attribute name. + * @param {string} string - The string to parse + * @returns {array} - Array of matches. Index 0: the section name, e.g. repeating_equipment | Index 1:the row ID | index 2: The name of the attribute + * @returns {string[]} + * @example + * //Extract info from a full repeating name + * const [section,rowID,attrName] = k.parseRepeatName('repeating_equipment_-8908asdflkjZlkj23_name'); + * console.log(section);// => "repeating_equipment" + * console.log(rowID);// => "-8908asdflkjZlkj23" + * console.log(attrName);// => "name" + * + * //Extract info from just a row name + * const [section,rowID,attrName] = k.parseRepeatName('repeating_equipment_-8908asdflkjZlkj23'); + * console.log(section);// => "repeating_equipment" + * console.log(rowID);// => "-8908asdflkjZlkj23" + * console.log(attrName);// => undefined + */ +const parseRepeatName = function(string){ + let match = string.match(/(repeating_[^_]+)_([^_]+)(?:_(.+))?/); + match.shift(); + return match; +}; +kFuncs.parseRepeatName = parseRepeatName; + +/** + * Parses out the components of a trigger name similar to [parseRepeatName](#parserepeatname). Aliases: parseClickTrigger. + * + * Aliases: `k.parseClickTrigger` + * @param {string} string The triggerName property of the + * @returns {array} - For a repeating button named `repeating_equipment_-LKJhpoi98;lj_roll`, the array will be `['repeating_equipment','-LKJhpoi98;lj','roll']`. For a non repeating button named `roll`, the array will be `[undefined,undefined,'roll']` + * @returns {string[]} + * @example + * //Parse a non repeating trigger + * const [section,rowID,attrName] = k.parseTriggerName('clicked:some-button'); + * console.log(section);// => undefined + * console.log(rowID);// => undefined + * console.log(attrName);// => "some-button" + * + * //Parse a repeating trigger + * const [section,rowID,attrName] = k.parseTriggerName('clicked:repeating_attack_-234lkjpd8fu8usadf_some-button'); + * console.log(section);// => "repeating_attack" + * console.log(rowID);// => "-234lkjpd8fu8usadf" + * console.log(attrName);// => "some-button" + * + * //Parse a repeating name + * const [section,rowID,attrName] = k.parseTriggerName('repeating_attack_-234lkjpd8fu8usadf_some-button'); + * console.log(section);// => "repeating_attack" + * console.log(rowID);// => "-234lkjpd8fu8usadf" + * console.log(attrName);// => "some-button" + */ +const parseTriggerName = function(string){ + let match = string.replace(/^clicked:/,'').match(/(?:(repeating_[^_]+)_([^_]+)_)?(.+)/); + match.shift(); + return match; +}; +kFuncs.parseTriggerName = parseTriggerName; +const parseClickTrigger = parseTriggerName; +kFuncs.parseClickTrigger = parseClickTrigger; + +/** + * Parses out the attribute name from the htmlattribute name. + * @param {string} string - The triggerName property of the [event](https://wiki.roll20.net/Sheet_Worker_Scripts#eventInfo_Object). + * @returns {string} + * @example + * //Parse a name + * const attrName = k.parseHtmlName('attr_attribute_1'); + * console.log(attrName);// => "attribute_1" + */ +const parseHTMLName = function(string){ + let match = string.match(/(?:attr|act|roll)_(.+)/); + match.shift(); + return match[0]; +}; +kFuncs.parseHTMLName = parseHTMLName; + +/** + * Capitalize each word in a string + * @param {string} string - The string to capitalize + * @returns {string} + * @example + * const capitalized = k.capitalize('a word'); + * console.log(capitalized);// => "A Word" + */ +const capitalize = function(string){ + return string.replace(/(?:^|\s+|\/)[a-z]/ig,(letter)=>letter.toUpperCase()); +}; +kFuncs.capitalize = capitalize; + +/** + * Extracts a roll query result for use in later functions. Must be awaited as per [startRoll documentation](https://wiki.roll20.net/Sheet_Worker_Scripts#Roll_Parsing.28NEW.29). Stolen from [Oosh\'s Adventures with Startroll thread](https://app.roll20.net/forum/post/10346883/adventures-with-startroll). + * @param {string} query - The query should be just the text as the `?{` and `}` at the start/end of the query are added by the function. + * @returns {Promise} - Resolves to the selected value from the roll query + * @example + * const rollFunction = async function(){ + * //Get the result of a choose from list query + * const queryResult = await extractQueryResult('Prompt Text Here|Option 1|Option 2'); + * console.log(queryResult);//=> "Option 1" or "Option 2" depending on what the user selects + * + * //Get free from input from the user + * const freeResult = await extractQueryResult('Prompt Text Here'); + * consoel.log(freeResult);// => Whatever the user entered + * } + */ +const extractQueryResult = async function(query){ + debug('entering extractQueryResult'); + let queryRoll = await startRoll(`!{{query=[[0[response=?{${query}}]]]}}`); + finishRoll(queryRoll.rollId); + return queryRoll.results.query.expression.replace(/^.+?response=|\]$/g,''); +}; +kFuncs.extractQueryResult = extractQueryResult; + +/** + * Simulates a query for ensuring that async/await works correctly in the sheetworker environment when doing conditional startRolls. E.g. if you have an if/else and only one of the conditions results in `startRoll` being called (and thus an `await`), the sheetworker environment would normally crash. Awaiting this in the condition that does not actually need to call `startRoll` will keep the environment in sync. + * @param {string|number} [value] - The value to return. Optional. + * @returns {Promise} - Resolves to the value passed to the function + * @example + * const rollFunction = async function(){ + * //Get the result of a choose from list query + * const queryResult = await pseudoQuery('a value'); + * console.log(queryResult);//=> "a value" + * } + */ +const pseudoQuery = async function(value){ + debug('entering pseudoQuery'); + let queryRoll = await startRoll(`!{{query=[[0[response=${value}]]]}}`); + finishRoll(queryRoll.rollId); + return queryRoll.results.query.expression.replace(/^.+?response=|\]$/g,''); +}; +kFuncs.pseudoQuery = pseudoQuery; + +/** + * An alias for console.log. + * @param {any} msg - The message can be a straight string, an object, or an array. If it is an object or array, the object will be broken down so that each key is used as a label to output followed by the value of that key. If the value of the key is an object or array, it will be output via `console.table`. + */ +const log = function(msg){ + if(typeof msg === 'string'){ + console.log(`%c${kFuncs.sheetName} log| ${msg}`,"background-color:#159ccf"); + }else if(typeof msg === 'object'){ + Object.keys(msg).forEach((m)=>{ + if(typeof msg[m] === 'string'){ + console.log(`%c${kFuncs.sheetName} log| ${m}: ${msg[m]}`,"background-color:#159ccf"); + }else{ + console.log(`%c${kFuncs.sheetName} log| ${typeof msg[m]} ${m}`,"background-color:#159ccf"); + console.table(msg[m]); + } + }); + } +}; +kFuncs.log = log; + +/** + * Alias for console.log that only triggers when debug mode is enabled or when the sheet\'s version is `0`. Useful for entering test logs that will not pollute the console on the live sheet. + * @param {any} msg - 'See {@link k.log} + * @param {boolean} force - Pass as a truthy value to force the debug output to be output to the console regardless of debug mode. + * @returns {void} + */ +const debug = function(msg,force){ + if(!kFuncs.debugMode && !force && kFuncs.version > 0) return; + if(typeof msg === 'string'){ + console.log(`%c${kFuncs.sheetName} DEBUG| ${msg}`,"background-color:tan;color:red;"); + }else if(typeof msg === 'object'){ + Object.keys(msg).forEach((m)=>{ + if(typeof msg[m] === 'string'){ + console.log(`%c${kFuncs.sheetName} DEBUG| ${m}: ${msg[m]}`,"background-color:tan;color:red;"); + }else{ + console.log(`%c${kFuncs.sheetName} DEBUG| ${typeof msg[m]} ${m}`,"background-color:tan;color:red;font-weight:bold;"); + console.table(msg[m]); + } + }); + } +}; +kFuncs.debug = debug; + +/** + * Orders the section id arrays for all sections in the `sections` object to match the repOrder attribute. + * @param {attributesProxy} attributes - The attributes object that must have a value for the reporder for each section. + * @param {[object]} sections - Object containing the IDs for the repeating sections, indexed by repeating section name. + */ +const orderSections = function(attributes,sections){ + Object.keys(sections).forEach((section)=>{ + attributes.attributes[`_reporder_${section}`] = commaArray(attributes[`_reporder_${section}`]); + orderSection(attributes.attributes[`_reporder_${section}`],sections[section]); + }); +}; +kFuncs.orderSections = orderSections; + +/** + * Orders a single ID array. + * @param {[string]} repOrder - Array of IDs in the order they are in on the sheet. + * @param {[string]} IDs - Array of IDs to be ordered. + */ +const orderSection = function(repOrder,IDs=[]){ + IDs.sort((a,b)=>{ + return repOrder.indexOf(a.toLowerCase()) - repOrder.indexOf(b.toLowerCase()); + }); +}; +kFuncs.orderSection = orderSection; + +/** + * Splits a comma delimited string into an array + * @param {string} string - The string to split. + * @returns {array} - The string segments of the comma delimited list. + */ +const commaArray = function(string=''){ + return string.toLowerCase().split(/\s*,\s*/); +}; +kFuncs.commaArray = commaArray;/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/ +/*jshint -W014,-W084,-W030,-W033*/ +//# Attribute Obj Proxy handler +const createAttrProxy = function(attrs){ + //creates a proxy for the attributes object so that values can be worked with more easily. + const getCascObj = function(event,casc){ + const eventName = event.triggerName || event.sourceAttribute; + let typePrefix = eventName.startsWith('clicked:') ? + 'act_' : + event.removedInfo ? + 'fieldset_' : + 'attr_'; + let cascName = `${typePrefix}${eventName.replace(/(?:removed|clicked):/,'')}`; + let cascObj = casc[cascName]; + if(typePrefix === 'attr_'){ + cascObj.previousValue = event.previousValue; + } + return cascObj; + }; + + const triggerFunctions = function(obj,attributes,sections,casc){ + if(obj.triggeredFuncs && obj.triggeredFuncs.length){ + debug(`triggering functions for ${obj.name}`); + obj.triggeredFuncs && obj.triggeredFuncs.forEach(func=>funcs[func] ? + funcs[func]({trigger:obj,attributes,sections,casc}) : + debug(`!!!Warning!!! no function named ${func} found. Triggered function not called for ${obj.name}`,true)); + } + }; + + const initialFunction = function(obj,attributes,sections){ + if(obj.initialFunc){ + debug(`initial functions for ${obj.name}`); + funcs[obj.initialFunc] ? + funcs[obj.initialFunc]({trigger:obj,attributes,sections}) : + debug(`!!!Warning!!! no function named ${obj.initialFunc} found. Initial function not called for ${obj.name}`,true); + } + }; + const alwaysFunctions = function(trigger,attributes,sections,casc){ + Object.values(allHandlers).forEach((handler)=>{ + handler({trigger,attributes,sections,casc}); + }); + }; + const processChange = function({event,trigger,attributes,sections,casc}){ + if(event && !trigger){ + debug(`${event.sourceAttribute} change detected. No trigger found`); + return; + } + if(!attributes || !sections || !casc){ + debug(`!!! Insufficient arguments || attributes > ${!!attributes} | sections > ${!!sections} | casc > ${!!casc} !!!`); + return; + } + debug({trigger}); + if(event){ + debug('checking for initial & always functions'); + alwaysFunctions(trigger,attributes,sections,casc);//Functions that should be run for all events. + initialFunction(trigger,attributes,sections,casc);//functions that should only be run if the attribute was the thing changed by the user + } + if(trigger){ + debug(`processing ${trigger.name}`); + triggerFunctions(trigger,attributes,sections,casc); + if(!event && trigger.calculation && funcs[trigger.calculation]){ + attributes[trigger.name] = funcs[trigger.calculation]({trigger,attributes,sections,casc}); + }else if(trigger.calculation && !funcs[trigger.calculation]){ + debug(`K-Scaffold Error: No function named ${trigger.calculation} found`); + } + if(Array.isArray(trigger.affects)){ + attributes.queue.push(...trigger.affects); + } + } + attributes.set({attributes,sections,casc}); + }; + const attrTarget = { + updates:{}, + attributes:{...attrs}, + repOrders:{}, + queue: [], + casc:{}, + alwaysFunctions, + processChange, + triggerFunctions, + initialFunction, + getCascObj + }; + const attrHandler = { + get:function(obj,prop){//gets the most value of the attribute. + //If it is a repeating order, returns the array, otherwise returns the update value or the original value + if(prop === 'set'){ + return function(){ + let {attributes,sections,casc,callback,vocal} = arguments[0] ? arguments[0] : {}; + if(attributes && attributes.queue.length && sections && casc){ + let triggerName = attributes.queue.shift(); + let trigger = getCascObj({sourceAttribute:triggerName},casc); + attributes.processChange({trigger,attributes,sections,casc}); + }else{ + debug({updates:obj.updates}); + let trueCallback = Object.keys(obj.repOrders).length ? + function(){ + Object.entries(obj.repOrders).forEach(([section,order])=>{ + _setSectionOrder(section,order,) + }); + callback && callback(); + }: + callback; + Object.keys(obj.updates).forEach((key)=>obj.attributes[key] = obj.updates[key]); + const update = obj.updates; + obj.updates = {}; + set(update,vocal,trueCallback); + } + } + }else if(Object.keys(obj).some(key=>key===prop)){ + return Reflect.get(...arguments) + }else{ + let retValue; + switch(true){ + case obj.repOrders.hasOwnProperty(prop): + retValue = obj.repOrders[prop]; + break; + case obj.updates.hasOwnProperty(prop): + retValue = obj.updates[prop]; + break; + default: + retValue = obj.attributes[prop]; + break; + } + let cascRef = `attr_${prop.replace(/(repeating_[^_]+_)[^_]+/,'$1\$X')}`; + let numRetVal = +retValue; + if(!Number.isNaN(numRetVal) && retValue !== ''){ + retValue = numRetVal; + }else if(cascades[cascRef] && (typeof cascades[cascRef].defaultValue === 'number' || cascades[cascRef].type === 'number')){ + retValue = cascades[cascRef].defaultValue; + } + return retValue; + } + }, + set:function(obj,prop,value){ + //Sets the value. Also verifies that the value is a valid attribute value + //e.g. not undefined, null, or NaN + if(value || value===0 || value===''){ + if(/reporder|^repeating_[^_]+$/.test(prop)){ + let section = prop.replace(/_reporder_/,''); + obj.repOrders[section] = value; + }else if(`${obj.attributes}` !== `${value}` || + (obj.updates[prop] && `${obj.updates}` !== `${value}`) + ){ + obj.updates[prop] = value; + } + }else{ + debug(`!!!Warning: Attempted to set ${prop} to an invalid value:${value}; value not stored!!!`); + } + return true; + }, + deleteProperty(obj,prop){ + //removes the property from the original attributes, updates, and the reporders + Object.keys(obj).forEach((key)=>{ + delete obj[key][prop.toLowerCase()]; + }); + } + }; + return new Proxy(attrTarget,attrHandler); +}; + + +/** + * Function that registers a function for being called via the funcs object. Returns true if the function was successfully registered, and false if it could not be registered for any reason. + * @param {object} funcObj - Object with keys that are names to register functions under and values that are functions. + * @param {object} optionsObj - Object that contains options to use for this registration. + * @param {string[]} optionsObj.type - Array that contains the types of specialized functions that apply to the functions being registered. Valid types are `"opener"`, `"updater"`, and `"default"`. `"default"` is always used, and never needs to be passed. + * @returns {boolean} - True if the registration succeeded, false if it failed. + * @example + * //Basic Registration + * const myFunc = function({trigger,attributes,sections,casc}){}; + * k.registerFuncs({myFunc}); + * + * //Register a function to run on sheet open + * const openFunc = function({trigger,attributes,sections,casc}){}; + * k.registerFuncs({openFunc},{type:['opener']}) + * + * //Register a function to run on all events + * const allFunc = function({trigger,attributes,sections,casc}){}; + * k.registerFuncs({allFunc},{type:['all']}) + */ +const registerFuncs = function(funcObj,optionsObj = {}){ + if(typeof funcObj !== 'object' || typeof optionsObj !== 'object'){ + debug(`!!!! K-scaffold error: Improper arguments to register functions !!!!`); + return false; + } + const typeArr = optionsObj.type ? ['default',...optionsObj.type] : ['default']; + const typeSwitch = { + 'opener':openHandlers, + 'updater':updateHandlers, + 'new':initialSetups, + 'all':allHandlers, + 'default':funcs + }; + let setState; + Object.entries(funcObj).map(([prop,value])=>{ + typeArr.forEach((type)=>{ + if(typeSwitch[type][prop]){ + debug(`!!! Duplicate function name for ${prop} as ${type}!!!`); + setState = false; + }else if(typeof value === 'function'){ + typeSwitch[type][prop] = value; + setState = setState !== false ? true : false; + }else{ + debug(`!!! K-scaffold error: Function registration requires a function. Invalid value to register as ${type} !!!`); + setState = false; + } + }); + }); + return setState; +}; +kFuncs.registerFuncs = registerFuncs; + +const setActionCalls = function({attributes,sections}){ + actionAttributes.forEach((base)=>{ + let [section,,field] = k.parseTriggerName(base); + let fieldAction = field.replace(/_/g,'-'); + if(section){ + sections[section].forEach((id)=>{ + attributes[`${section}_${id}_${field}`] = `%{${attributes.character_name}|${section}_${id}_${fieldAction}}`; + }); + }else{ + attributes[`${field}`] = `%{${attributes.character_name}|${fieldAction}}`; + } + }); +}; +funcs.setActionCalls = setActionCalls; + +/** + * Function to call a function previously registered to the funcs object. May not be used that much. Either returns the function or null if no function exists. + * @param {string} funcName - The name of the function to invoke. + * @param {...any} args - The arguments to call the function with. + * @returns {any} + * @example + * //Call myFunc with two arguments + * k.callFunc('myFunc','an argument','another argument'); + */ +const callFunc = function(funcName,...args){ + if(funcs[funcName]){ + debug(`calling ${funcName}`); + return funcs[funcName](...args); + }else{ + debug(`Invalid function name: ${funcName}`); + return null; + } +}; +kFuncs.callFunc = callFunc;/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/ +/*jshint -W014,-W084,-W030,-W033*/ +//Sheet Updaters and styling functions +const updateSheet = function(){ + log('updating sheet'); + getAllAttrs({props:['debug_mode',...baseGet],callback:(attributes,sections,casc)=>{ + kFuncs.debugMode = kFuncs.debugMode || !!attributes.debug_mode; + debug({sheet_version:attributes.sheet_version}); + if(!attributes.sheet_version){ + Object.entries(initialSetups).forEach(([funcName,handler])=>{ + if(typeof funcs[funcName] === 'function'){ + debug(`running ${funcName}`); + funcs[funcName]({attributes,sections,casc}); + }else{ + debug(`!!!Warning!!! no function named ${funcName} found. Initial sheet setup not performed.`); + } + }); + }else{ + Object.entries(updateHandlers).forEach(([ver,handler])=>{ + if(attributes.sheet_version < +ver){ + handler({attributes,sections,casc}); + } + }); + } + Object.entries(openHandlers).forEach(([funcName,func])=>{ + if(typeof funcs[funcName] === 'function'){ + debug(`running ${funcName}`); + funcs[funcName]({attributes,sections,casc}); + }else{ + debug(`!!!Warning!!! no function named ${funcName} found. Sheet open handling not performed.`); + } + }); + setActionCalls({attributes,sections}); + attributes.sheet_version = kFuncs.version; + log(`Sheet Update applied. Current Sheet Version ${kFuncs.version}`); + attributes.set(); + log('Sheet ready for use'); + }}); +}; + +const initialSetup = function(attributes,sections){ + debug('Initial sheet setup'); +}; + +/** + * This is the default listener function for attributes that the K-Scaffold uses. It utilizes the `triggerFuncs`, `listenerFunc`, `calculation`, and `affects` properties of the K-scaffold trigger object (see the Pug section of the scaffold for more details). + * @param {Roll20Event} event + * @returns {void} + * @example + * //Call from an attribute change + * on('change:an_attribute',k.accessSheet); + */ +const accessSheet = function(event){ + debug({funcs:Object.keys(funcs)}); + debug({event}); + getAllAttrs({callback:(attributes,sections,casc)=>{ + let trigger = attributes.getCascObj(event,casc); + attributes.processChange({event,trigger,attributes,sections,casc}); + }}); +}; +funcs.accessSheet = accessSheet;/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/ +/*jshint -W014,-W084,-W030,-W033*/ +/* +Cascade Expansion functions +*/ +//Expands the repeating section templates in cascades to reflect the rows actually available +const expandCascade = function(cascade,sections,attributes){ + return _.keys(cascade).reduce((memo,key)=>{//iterate through cascades and replace references to repeating attributes with correct row ids. + if(/^(?:act|attr)_repeating_/.test(key)){//If the attribute is a repeating attribute, do special logic + expandRepeating(memo,key,cascade,sections,attributes); + }else if(key){//for non repeating attributes do this logic + expandNormal(memo,key,cascade,sections); + } + return memo; + },{}); +}; + +const expandRepeating = function(memo,key,cascade,sections,attributes){ + key.replace(/((?:attr|act)_)(repeating_[^_]+)_[^_]+?_(.+)/,(match,type,section,field)=>{ + (sections[section]||[]).forEach((id)=>{ + memo[`${type}${section}_${id}_${field}`]=_.clone(cascade[key]);//clone the details so that each row's attributes have correct ids + memo[`${type}${section}_${id}_${field}`].name = `${section}_${id}_${field}`; + if(key.startsWith('attr_')){ + memo[`${type}${section}_${id}_${field}`].affects = memo[`${type}${section}_${id}_${field}`].affects.reduce((m,affected)=>{ + if(section === affected){//otherwise if the affected attribute is in the same section, simply set the affected attribute to have the same row id. + m.push(applyID(affected,id)); + }else if(/repeating/.test(affected)){//If the affected attribute isn't in the same repeating section but is still a repeating attribute, add all the rows of that section + addAllRows(affected,m,sections); + }else{//otherwise the affected attribute is a non repeating attribute. Simply add it to the computed affected array + m.push(affected); + } + return m; + },[]); + } + }); + }); +}; + +const applyID = function(affected,id){ + return affected.replace(/(repeating_[^_]+_)[^_]+(.+)/,`$1${id}$2`); +}; + +const expandNormal = function(memo,key,cascade,sections){ + memo[key] = _.clone(cascade[key]); + if(key.startsWith('attr_')){ + memo[key].affects = memo[key].affects || []; + memo[key].affects = memo[key].affects.reduce((m,a)=>{ + if(/^repeating/.test(a)){ + addAllRows(a,m,sections); + }else{ + m.push(a); + } + return m; + },[]); + } +}; + +const addAllRows = function(affected,memo,sections){ + affected.replace(/(repeating_[^_]+?)_[^_]+?_(.+)/,(match,section,field)=>{ + sections[section].forEach(id=>memo.push(`${section}_${id}_${field}`)); + }); +};/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/ +/*jshint -W014,-W084,-W030,-W033*/ +/** + * Alias for [setSectionOrder()](https://wiki.roll20.net/Sheet_Worker_Scripts#setSectionOrder.28.3CRepeating_Section_Name.3E.2C_.3CSection_Array.3E.2C_.3CCallback.3E.29) that allows you to use the section name in either `repeating_section` or `section` formats. Note that the Roll20 sheetworker [setSectionOrder](https://wiki.roll20.net/Sheet_Worker_Scripts#setSectionOrder.28.3CRepeating_Section_Name.3E.2C_.3CSection_Array.3E.2C_.3CCallback.3E.29) currently causes some display issues on sheets. + * @param {string} section + * @param {string[]} order + * @returns {void} + * @example + * //Set the order of a repeating_weapon section + * k.setSectionOrder('repeating_equipment',['id1','id2','id3']); + * //Can also specify the section name without the repeating_ prefix + * k.setSectionOrder('equipment',['id1','id2','id3']); + */ +const _setSectionOrder = function(section,order){ + let trueSection = section.replace(/repeating_/,''); + setSectionOrder(trueSection,order); +}; +kFuncs.setSectionOrder = _setSectionOrder; + +/** + * Alias for [removeRepeatingRow](https://wiki.roll20.net/Sheet_Worker_Scripts#removeRepeatingRow.28_RowID_.29) that also removes the row from the current object of attribute values and array of section IDs to ensure that erroneous updates are not issued. + * @param {string} row - The row id to be removed + * @param {attributesProxy} attributes - The attribute values currently in memory + * @param {object} sections - Object that contains arrays of all the IDs in sections on the sheet indexed by repeating name. + * @returns {void} + * @example + * //Remove a repeating Row + * k.getAllAttrs({ + * callback:(attributes,sections)=>{ + * const rowID = sections.repeating_equipment[0]; + * k.removeRepeatingRow(`repeating_equipment_${rowID}`,attributes,sections); + * console.log(sections.repeating_equipment); // => rowID no longer exists in the array. + * console.log(attributes[`repeating_equipment_${rowID}_name`]); // => undefined + * } + * }) + */ +const _removeRepeatingRow = function(row,attributes,sections){ + debug(`removing ${row}`); + Object.keys(attributes.attributes).forEach((key)=>{ + if(key.startsWith(row)){ + delete attributes[key]; + } + }); + let [,section,rowID] = row.match(/(repeating_[^_]+)_(.+)/,''); + sections[section] = sections[section].filter((id)=>id!==rowID); + removeRepeatingRow(row); +}; +kFuncs.removeRepeatingRow = _removeRepeatingRow; + +/** + * Alias for [getAttrs()](https://wiki.roll20.net/Sheet_Worker_Scripts#getAttrs.28attributeNameArray.2C_callback.29) that converts the default object of attribute values into an {@link attributesProxy} and passes that back to the callback function. + * @param {Object} args + * @param {string[]} [args.props=baseGet] - Array of attribute names to get the value of. Defaults to {@link baseGet} if not passed. + * @param {function(attributesProxy)} args.callback - The function to call after the attribute values have been gotten. An {@link attributesProxy} is passed to the callback. + * @example + * //Gets the attributes named in props. + * k.getAttrs({ + * props:['attribute_1','attribute_2'], + * callback:(attributes)=>{ + * //Work with the attributes as you would in a normal getAttrs, or use the superpowers of the K-scaffold attributes object like so: + * attributes.attribute_1 = 'new value'; + * attributes.set(); + * } + * }) + */ +const _getAttrs = function({props=baseGet,callback}){ + getAttrs(props,(values)=>{ + const attributes = createAttrProxy(values); + callback(attributes); + }); +}; +kFuncs.getAttrs = _getAttrs; + +/** + * Alias for [getAttrs()](https://wiki.roll20.net/Sheet_Worker_Scripts#getAttrs.28attributeNameArray.2C_callback.29) and [getSectionIDs](https://wiki.roll20.net/Sheet_Worker_Scripts#getSectionIDs.28section_name.2Ccallback.29) that combines the actions of both sheetworker functions and converts the default object of attribute values into an {@link attributesProxy}. Also gets the details on how to handle all attributes from the master {@link cascades} object and. + * @param {Object} args + * @param {string[]} [args.props=baseGet] - Array of attribute names to get the value of. Defaults to {@link baseGet} if not passed. + * @param {repeatingSectionDetails} sectionDetails - Array of details about a section to get the IDs for and attributes that need to be gotten. + * @param {function(attributesProxy,sectionObj,expandedCascade):void} args.callback - The function to call after the attribute values have been gotten. An {@link attributesProxy} is passed to the callback along with a {@link sectionObj} and {@link expandedCascade}. + * @example + * //Get every K-scaffold linked attribute on the sheet + * k.getAllAttrs({ + * callback:(attributes,sections,casc)=>{ + * //Work with the attributes as you please. + * attributes.some_attribute = 'a value'; + * attributes.set();//Apply our change + * } + * }) + */ +const getAllAttrs = function({props=baseGet,sectionDetails=repeatingSectionDetails,callback}){ + getSections(sectionDetails,(repeats,sections)=>{ + getAttrs([...props,...repeats],(values)=>{ + const attributes = createAttrProxy(values); + orderSections(attributes,sections); + const casc = expandCascade(cascades,sections,attributes); + callback(attributes,sections,casc); + }) + }); +}; +kFuncs.getAllAttrs = getAllAttrs; + +/** + * Alias for [getSectionIDs()](https://wiki.roll20.net/Sheet_Worker_Scripts#getSectionIDs.28section_name.2Ccallback.29) that allows you to iterate through several functions at once. Also assembles an array of repeating attributes to get. + * @param {object[]} sectionDetails - Array of details about a section to get the IDs for and attributes that need to be gotten. + * @param {string} sectionDetails.section - The full name of the repeating section including the `repeating_` prefix. + * @param {string[]} sectionDetails.fields - Array of field names that need to be gotten from the repeating section + * @param {function(string[],sectionObj)} callback - The function to call once all IDs have been gotten and the array of repating attributes to get has been assembled. The callback is passed the array of repating attributes to get and a {@link sectionObj}. + * @example + * // Get some section details + * const sectionDetails = { + * {section:'repeating_equipment',fields:['name','weight','cost']}, + * {section:'repeating_weapon',fields:['name','attack','damage']} + * }; + * k.getSections(sectionDetails,(attributeNames,sections)=>{ + * console.log(attributeNames);// => Array containing all row specific attribute names + * console.log(sections);// => Object with arrays containing the row ids. Indexed by section name (e.g. repeating_eqiupment) + * }) + */ +const getSections = function(sectionDetails,callback){ + let queueClone = _.clone(sectionDetails); + const worker = (queue,repeatAttrs=[],sections={})=>{ + let detail = queue.shift(); + getSectionIDs(detail.section,(IDs)=>{ + sections[detail.section] = IDs; + IDs.forEach((id)=>{ + detail.fields.forEach((f)=>{ + repeatAttrs.push(`${detail.section}_${id}_${f}`); + }); + }); + repeatAttrs.push(`_reporder_${detail.section}`); + if(queue.length){ + worker(queue,repeatAttrs,sections); + }else{ + callback(repeatAttrs,sections); + } + }); + }; + if(!queueClone[0]){ + callback([],{}); + }else{ + worker(queueClone); + } +}; +kFuncs.getSections = getSections; + +// Sets the attributes while always calling with {silent:true} +// Can be awaited to get the values returned from _setAttrs +/** + * Alias for [setAttrs()](https://wiki.roll20.net/Sheet_Worker_Scripts#setAttrs.28values.2Coptions.2Ccallback.29) that sets silently by default. + * @param {object} obj - The object containting attributes to set + * @param {boolean} [vocal=false] - Whether to set silently (default value) or not. + * @param {function()} [callback] - The callback function to invoke after the setting has been completed. No arguments are passed to the callback function. + * @example + * //Set some attributes silently + * k.setAttrs({attribute_1:'new value'}) + * //Set some attributes and triggers listeners + * k.setAttrs({attribute_1:'new value',true}) + * //Set some attributes and call a callback function + * k.setAttrs({attribute_1:'new value'},null,()=>{ + * //Do something after the attribute is set + * }) + */ +const set = function(obj,vocal=false,callback){ + setAttrs(obj,{silent:!vocal},callback); +}; +kFuncs.setAttrs = set; + +const generateCustomID = function(string){ + if(!string.startsWith('-')){ + string = `-${string}`; + } + rowID = generateRowID(); + let re = new RegExp(`^.{${string.length}}`); + return `${string}${rowID.replace(re,'')}`; +}; + + +/** + * Alias for generateRowID that adds the new id to the {@link sectionObj}. Also allows for creation of custom IDs that conform to the section ID requirements. + * @param {sectionObj} sections + * @param {string} [customText] - Custom text to start the ID with. This text should not be longer than the standard repeating section ID format. + * @returns {string} - The created ID + * @example + * k.getAllAttrs({ + * callback:(attributes,sections,casc)=>{ + * //Create a new row ID + * const rowID = k.generateRowID('repeating_equipment',sections); + * console.log(rowID);// => -p8rg908ug0suzz + * //Create a custom row ID + * const customID = k.generateRowID('repeating_equipment',sections,'custom'); + * console.log(customID);// => -custom98uadj89kj + * } + * }); + */ +const _generateRowID = function(section,sections,customText){ + let rowID = customText ? + generateCustomID(customText) : + generateRowID(); + section = section.match(/^repeating_[^_]+$/) ? + section : + `repeating_${section}`; + sections[section] = sections[section] || []; + sections[section].push(rowID); + return `${section}_${rowID}`; +}; +kFuncs.generateRowID = _generateRowID;/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/ +/*jshint -W014,-W084,-W030,-W033*/ +const listeners = {}; +const baseGet = Object.entries(cascades).reduce((memo,[attrName,detailObj])=>{ + if(!/repeating/.test(attrName) && detailObj.type !== 'action'){ + memo.push(detailObj.name); + } + if(detailObj.listener){ + listeners[detailObj.listener] = detailObj.listenerFunc; + } + return memo; +},[]); +kFuncs.baseGet = baseGet; +const registerEventHandlers = function(){ + on('sheet:opened',updateSheet); + debug({funcKeys:Object.keys(funcs),funcs}); + //Roll20 change and click listeners + Object.entries(listeners).forEach(([event,funcName])=>{ + if(funcs[funcName]){ + on(event,funcs[funcName]); + }else{ + debug(`!!!Warning!!! no function named ${funcName} found. No listener created for ${event}`,true); + } + }); + log(`kScaffold Loaded`); +}; +kFuncs.registerEventHandlers = registerEventHandlers; + +const addItem = function(event){ + let [,,section] = parseClickTrigger(event.triggerName); + section = section.replace(/add-/,''); + getAllAttrs({ + callback:(attributes,sections,casc) => { + let row = _generateRowID(section,sections); + debug({row}); + attributes[`${row}_name`] = ''; + setActionCalls({attributes,sections}); + const trigger = cascades[`fieldset_repeating_${section}`]; + if(trigger && trigger.addFuncs){ + trigger.addFuncs.forEach((funcName) => { + if(funcs[funcName]){ + funcs[funcName]({attributes,sections,casc,trigger,newRow:row}); + } + }); + } + attributes.set({attributes,sections,casc}); + } + }); +}; +funcs.addItem = addItem; + +const editSection = function(event){ + let [,,section] = parseClickTrigger(event.triggerName); + section = section.replace(/edit-/,''); + let target = `fieldset.repeating_${section} + .repcontainer`; + $20(target).toggleClass('ui-sortable'); + $20(target).toggleClass('editmode'); +}; +registerFuncs({editSection});/** + * The default tab navigation function of the K-scaffold. Courtesy of Riernar. It will add `k-active-tab` to the active tab-container and `k-active-button` to the active button. You can either write your own CSS to control display of these, or use the default CSS included in `scaffold/_k.scss`. Note that `k-active-button` has no default CSS as it is assumed that you will want to style the active button to match your system. + * @param {Object} trigger - The trigger object + */ +const kSwitchTab = function ({ trigger, attributes, sections, casc }) { + const [container, tab] = ( + trigger.name.match(/nav-tabs-(.+)--(.+)/) || + [] + ).slice(1); + $20(`[data-container-tab="${container}"]`).removeClass('k-active-tab'); + $20(`[data-container-tab="${container}"][data-tab="${tab}"]`).addClass('k-active-tab'); + $20(`[data-container-button="${container}"]`).removeClass('k-active-button'); + $20(`[data-container-button="${container}"][data-button="${tab}"]`).addClass('k-active-button'); + const tabInputName = `${container.replace(/\-/g,'_')}_tab`; + if(persistentTabs.indexOf(tabInputName) > -1){ + attributes[tabInputName] = trigger.name; + } + if(trigger && trigger.navFuncs){ + trigger.navFuncs.forEach((funcName) => { + if(funcs[funcName]){ + funcs[funcName]({attributes,sections,casc,trigger}); + } + }); + } +} + +registerFuncs({ kSwitchTab }); + +/** + * Sets persistent tabs to their last active state + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const kTabOnOpen = function({trigger,attributes,sections,casc}){ + persistentTabs.forEach((tabInput) => { + const pseudoTrigger = {name:attributes[tabInput]}; + kSwitchTab({trigger:pseudoTrigger, attributes}); + }); +}; +registerFuncs({ kTabOnOpen },{type:['opener']}); + return kFuncs; + }()); + const actionAttributes = ["vigilance_action","build_action","intuition_action","reflex_action","health_action","resolve_action","luck_action","assess_action","deceive_action","deduce_action","disguise_action","encrypt_action","first_aid_action","hide_action","legerdemain_action","locksmith_action","nurse_(ment)_action","nurse_(phys)_action","persuade_action","research_action","ride/steer_action","search_action","sneak_action","stunt_action","survive_action","threaten_action","tinker_action","melee_action","ranged_action","repeating_specialty_$X_action","repeating_equipped_$X_action","repeating_weapon_$X_action","repeating_ability_$X_action"];const characteristics = {"aptitude":{"name":"aptitude","affects":["reflex goal"]},"athletics":{"name":"athletics","affects":["reflex goal","movement rate","sprint speed","item_slots_max"]},"charisma":{"name":"charisma","affects":["intuition goal"]},"logic":{"name":"logic","affects":["vigilance goal"]},"wisdom":{"name":"wisdom","affects":["intuition goal"]},"size":{"name":"size","affects":["build goal","item_slots_max"]},"stamina":{"name":"stamina","affects":["build goal"]},"willpower":{"name":"willpower","affects":["vigilance goal"]}};const attributesDetails = {"vigilance_goal":["logic","willpower"],"build_goal":["size","stamina"],"intuition_goal":["charisma","wisdom"],"reflex_goal":["athletics","aptitude"]};const skills = {"assess":{"name":"assess","characteristic":"wisdom"},"deceive":{"name":"deceive","characteristic":"charisma"},"deduce":{"name":"deduce","characteristic":"logic"},"disguise":{"name":"disguise","characteristic":"charisma"},"encrypt":{"name":"encrypt","characteristic":"logic"},"first aid":{"name":"first aid","characteristic":"wisdom"},"hide":{"name":"hide","characteristic":"wisdom"},"legerdemain":{"name":"legerdemain","characteristic":"aptitude"},"locksmith":{"name":"locksmith","characteristic":"aptitude"},"nurse (ment)":{"name":"nurse (ment)","characteristic":"logic"},"nurse (phys)":{"name":"nurse (phys)","characteristic":"logic"},"persuade":{"name":"persuade","characteristic":"charisma"},"research":{"name":"research","characteristic":"logic"},"ride/steer":{"name":"ride/steer","characteristic":"athletics"},"search":{"name":"search","characteristic":"wisdom"},"sneak":{"name":"sneak","characteristic":"athletics"},"stunt":{"name":"stunt","characteristic":"athletics"},"survive":{"name":"survive","characteristic":"wisdom"},"threaten":{"name":"threaten","characteristic":"charisma"},"tinker":{"name":"tinker","characteristic":"aptitude"},"melee":{"name":"melee","characteristic":"athletics"},"ranged":{"name":"ranged","characteristic":"aptitude"}};const persistentTabs = ["backbone_tab"]; + /** + * Function to calculate the raw attribute score + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const calcAttribute = function({trigger,attributes,sections,casc}){ + const [charac1,charac2] = attributesDetails[trigger.name]; + return 10 + attributes[charac1] + attributes[charac2]; +}; +k.registerFuncs({calcAttribute}); + +/** + * Function to calculate the attribute modifier + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const calcAttributeMod = function({trigger,attributes,sections,casc}){ + const baseName = `${trigger.name}_goal`; + return attributes[baseName] - 11; +}; +k.registerFuncs({calcAttributeMod}); + +/** + * Function to calculate the sprint speed of a character + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const calcSprint = function({trigger,attributes,sections,casc}){ + return attributes.athletics * 5 + 10; +}; +k.registerFuncs({calcSprint}); + +/** + * Function to calculate the movement speed of a character + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const calcMovement = function({trigger,attributes,sections,casc}){ + return attributes.athletics * 5 + 20; +}; +k.registerFuncs({calcMovement}); + +/** + * Calculates the maximum item slots that can be used without penalty + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const calcItemSlotsMax = function({trigger,attributes,sections,casc}){ + return Math.max( + attributes.size + 3, + attributes.athletics + attributes.size + 1 + ); +}; +k.registerFuncs({calcItemSlotsMax}); + +/** + * Calculates how many slots have been used based on the equipped gear and weapon sections + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const calcUsedSlots = function({trigger,attributes,sections,casc}){ + const equippedIDs = [ + ...sections.repeating_equipped.map(id => `repeating_equipped_${id}`), + ...sections.repeating_weapon.map(id => `repeating_weapon_${id}`) + ]; + let freeWeapons = 3; + return equippedIDs + .reduce((total,section) => { + if( + attributes[`${section}_uses_slot`] && + ( + !section.startsWith('repeating_weapon') || + freeWeapons <= 0 + ) + ){ + total += 1; + } + if( + section.startsWith('repeating_weapon') && + freeWeapons > 0 + ){ + freeWeapons--; + } + return total; + },0); +}; +k.registerFuncs({calcUsedSlots}); + +/** + * Calculates whether the character is overburdened or not, returning 1 if they are and 0 otherwise + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const calcOverburdened = function({trigger,attributes,sections,casc}){ + return attributes.item_slots_max - attributes.item_slots < 0 ? + 1 : + 0; +}; +k.registerFuncs({calcOverburdened});/** + * (un)equips armor items + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const equipArmor = function({trigger,attributes,sections,casc}){ + const [section,rowID,attr] = k.parseTriggerName(trigger.name); + const row = section ? + `${section}_${rowID}` : + k.generateRowID('repeating_stored',sections); + const armorAttrs = { + equipped:{ + 'armor':attributes[`${row}_armor_bonus`], + 'armor_name':attributes[`${row}_name`], + 'armor_details':attributes[`${row}_description`], + 'armor_size':attributes[`${row}_item_size`], + }, + stored:{ + [`${row}_armor_bonus`]:attributes.armor, + [`${row}_name`]:attributes.armor_name, + [`${row}_description`]:attributes.armor_details, + [`${row}_item_size`]:attributes.armor_size, + } + }; + const actionType = section ? 'equipped' : 'stored'; + const attrMap = armorAttrs[actionType]; + // If we are equipping a stored armor, then store the currently equipped armor in the stored items repeating section. + if(section){ + equipArmor({trigger:{name:'armor_name'},attributes,sections,casc}); + } + if( + !section && attributes.armor_name + ){ + attrMap[`${row}_type`] = 'armor'; + } + // copy the values to the target + Object.entries(attrMap) + .forEach(([key,val]) => { + if(section || val){ + attributes[key] = val; + } + }); + // If we equipped a stored armor, remove it from the stored gear repeating section. + if(section){ + k.removeRepeatingRow(row,attributes,sections); + }else{ + Object.keys(armorAttrs.equipped).forEach( + attr => attributes[attr] = '' + ); + } +}; +k.registerFuncs({equipArmor}); + +/** + * Moves gear/weapon/armor items around on the sheet equip/unequip them. + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const equipItem = function({trigger,attributes,sections,casc}){ + const [section,rowID,attr] = k.parseTriggerName(trigger.name); + const row = `${section}_${rowID}`; + if( + section === 'repeating_stored' && + attributes[`${row}_type`] === 'armor'){ + equipArmor({trigger,attributes,sections,casc}); + return; + } + const newSection = section === 'repeating_stored' ? + ( + attributes[`${row}_type`] === 'weapon' ? + 'repeating_weapon' : + 'repeating_equipped' + ): + 'repeating_stored'; + const newRow = k.generateRowID(newSection,sections); + Object.keys(casc) + .forEach(cascKey => { + if(cascKey.startsWith(`attr_${row}`)){ + const attrRef = cascKey.replace(/attr_repeating_[^_]+_[^_]+_/,''); + k.debug({[attrRef]:attributes[`${row}_${attrRef}`]}) + attributes[`${newRow}_${attrRef}`] = attributes[`${row}_${attrRef}`]; + } + }); + attributes[`${newRow}_equipped`] = newSection.endsWith('stored') ? + 0 : + 1; + debugger; + if(section !== 'repeating_stored'){ + attributes[`${newRow}_type`] = section.endsWith('equipped') ? + 'gear' : + 'weapon'; + }else{ + attributes[`${newRow}_type`] = attributes[`${newRow}_type`] || 'gear'; + } + k.removeRepeatingRow(row,attributes,sections); +}; +k.registerFuncs({equipItem}); + +/** + * Manipulates the classes on the npc skill containers to ensure that only those with an entered value are displayed in collapsed mode + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const displayNPCSkill = function({trigger,attributes,sections,casc}){ + const skill = trigger.name; + const rawSkillValue = attributes.attributes[skill]; + const action = rawSkillValue ? + 'removeClass' : + 'addClass'; + const $elem = $20(`.npc-${skill.replace(/\s+/g,'-').replace(/\(|\)|\//g,'')}-container`); + $elem[action]('expanded'); +}; +k.registerFuncs({displayNPCSkill}); + +/** + * Sets up the npc skill display based on the collected values by calling displayNPCSkill for each skill + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const NPCSkillSetup = function({trigger,attributes,sections,casc}){ + Object + .keys(skills) + .forEach((skill) => + displayNPCSkill({trigger:{name:skill},attributes,sections,casc})); +}; +k.registerFuncs({NPCSkillSetup},{type:['opener']}); + +/** + * + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const showConditions = function({trigger,attributes,sections,casc}){ + $20('#pc-conditions .sidebar-toggle,#pc-conditions').removeClass('fresh'); + $20('#pc-conditions').toggleClass('active'); +}; +k.registerFuncs({showConditions}); + +/** + * Resets the tracker for a condition to 0 when the condition is turned off + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const resetCondition = function({trigger,attributes,sections,casc}){ + if(attributes[trigger.name]){ + attributes[`track_${trigger.name}`] = ''; + } +}; +k.registerFuncs({resetCondition}); + +/** + * Decrements the indicated input + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ + const decrementInput = function({trigger,attributes,sections,casc}){ + const [section,rowID,buttonName] = k.parseTriggerName(trigger.name); + const attrName = buttonName.replace(/^decrement-/,'').replace(/-/g,'_'); + attributes[attrName] -= 1; +}; +k.registerFuncs({decrementInput}); + +/** + * Increments the indicated input + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const incrementInput = function({trigger,attributes,sections,casc}){ + const [section,rowID,buttonName] = k.parseTriggerName(trigger.name); + const attrName = buttonName.replace(/^increment-/,'').replace(/-/g,'_'); + attributes[attrName] += 1; +}; +k.registerFuncs({incrementInput}); + +/** + * Sets the pc/npc specific button displays + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const sheetTypeDisplay = function({trigger,attributes,sections,casc}){ + if(attributes.character_type === 'pc'){ + $20('.tabs--backbone__button--pc').removeClass('inactive'); + $20('.tabs--backbone__button--npc').addClass('inactive'); + }else{ + $20('.tabs--backbone__button--pc').addClass('inactive'); + $20('.tabs--backbone__button--npc').removeClass('inactive'); + } +}; +k.registerFuncs({sheetTypeDisplay},{type:['opener']}); + + +/** + * Handles the necessary setup for adding a weapon + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const addWeapon = function({trigger,attributes,sections,casc,newRow}){ + attributes[`${newRow}_type`] = 'weapon'; +}; +k.registerFuncs({addWeapon});/** + * + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ + const rollHealthCheck = async function({trigger,attributes,sections,casc}){ + const rollName = trigger.name.replace(/-action$/,''); + const statVal = attributes[rollName]; + const rollObj = { + title:`^{${rollName} roll}`, + pure_success:true, + roll:`[[@{roll_state}cs<${statVal}cf>[[${statVal} + 1]]]]` + }; + const roll = await executeRoll({rollObj,attributes,sections}); + finishRoll(roll.rollId); +}; +k.registerFuncs({rollHealthCheck}); + +/** + * Starts the process of rolling a basic attribute check + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const rollAttribute = async function({trigger,attributes,sections,casc}){ + const rollName = trigger.name.replace(/-action$/,''); + const rollAttr = rollName.replace(/-/g,'_'); + const rollTransKey = rollName.replace(/-/g,' '); + const rollObj = { + title:`^{${rollName}}`, + roll:`[[@{roll_state} + ${attributes[rollAttr]}[${k.capitalize(getTranslationByKey(rollTransKey))}]]]` + }; + const roll = await executeRoll({rollObj,attributes,sections}); + finishRoll(roll.rollId); +}; +k.registerFuncs({rollAttribute}); + +/** + * Makes rolls for the repeating sections (weapons and abilities) + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const rollRepeating = async function({trigger,attributes,sections,casc}){ + const [section,rowID] = k.parseTriggerName(trigger.name); + const row = `${section}_${rowID}`; + const rollName = attributes[`${row}_name`]; + const skillName = attributes[`${row}_skill`]; + const [modifier] = getSkillRollModifier(skillName,attributes); + const rollObj = { + title:rollName, + roll_name:`^{${skillName}}`, + roll:`[[@{roll_state}${modifier}]]]` + }; + if(attributes[`${row}_damage`]){ + rollObj.damage = attributes[`${row}_damage`]; + if(attributes[`${row}_damage_characteristic`]){ + rollObj.damage += `+ @{${attributes[`${row}_damage_characteristic`]}}[${k.capitalize(getTranslationByKey(attributes[`${row}_damage_characteristic`]))}]`; + } + rollObj.damage = `[[${rollObj.damage}]]`; + }else{ + rollObj.description = attributes[`${row}_description`]; + } + const roll = await executeRoll({rollObj,attributes,sections}); + finishRoll(roll.rollId); +}; +k.registerFuncs({rollRepeating}); + +const getSkillRollModifier = (rollName,attributes,row) => { + row = row ? `${row}_` : ''; + const rollAttr = `${row}${rollName.replace(/-/g,'_')}`.replace(/_$/,''); + const rollTransKey = row ? + '': + rollName.replace(/-/g,' '); + const characteristicName = row ? + attributes[`${row}characteristic`] : + skills[rollTransKey].characteristic; + const characteristic = attributes[characteristicName] || 0; + const mastery = attributes[`${rollAttr}_mastery`]; + const profLabel = rollTransKey ? + k.capitalize(getTranslationByKey(rollTransKey)) : + attributes[`${row}name`]; + const charLabel = k.capitalize(getTranslationByKey(characteristicName)); + const profBonus = attributes.roll_state === '1D20' ? + Math.max(attributes[`${rollAttr}_proficiency`] * 2, 1) : + attributes[`${rollAttr}_proficiency`]; + const rollMsg = `${mastery ? 'cs>19' : ''} + ${profBonus}[${profLabel}] + ${characteristic}[${charLabel}`; + return [ + rollMsg, + characteristicName, + rollTransKey]; +}; + +/** + * Starts the process of rolling a basic skill check + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const rollSkill = async function({trigger,attributes,sections,casc}){ + const [section,rowID,button] = k.parseTriggerName(trigger.name); + const row = section ? + `${section}_${rowID}` : + ''; + const rollName = button.replace(/-?action$/,''); + const [modifier,,rollTransKey] = getSkillRollModifier(rollName,attributes,row); + const rollObj = { + title:section ? + attributes[`${row}_name`]: + `^{${rollTransKey}}`, + roll:`[[@{roll_state}${modifier}]]]` + }; + const roll = await executeRoll({rollObj,attributes,sections}); + finishRoll(roll.rollId); +}; +k.registerFuncs({rollSkill}); + +/** + * Rolls for luck and displays `lucky` or `unlucky` + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const rollLuck = async function({trigger,attributes,sections,casc}){ + const luckTarget = attributes.luck === 'odd' ? + 1 : + 0; + const rollObj = { + title:'^{luck}', + luck:`[[@{roll_state}]]` + }; + const roll = await executeRoll({rollObj,attributes,sections}); + const computeObj = {}; + const rollModulus = roll.results.luck.result % 2; + computeObj.luck = rollModulus === luckTarget ? + 1 : + 0; + finishRoll(roll.rollId,computeObj); +}; +k.registerFuncs({rollLuck}); + +const assembleRoll = (rollObj,attributes,sections) => { + return Object.entries(rollObj).reduce((str,[field,content])=>{ + return str += ` {{${field}=${content}}}`; + },'@{template_start}'); +}; + +/** + * Executes the roll. Uses a callback if any computations are required. + * @param {object} rollObj - Object describing the roll fields to be used + * @param {object} attributes - The character attributes + * @param {object[]} sections - The sections array + * @returns {Promise} - Resolves to the roll results object + */ +const executeRoll = async ({rollObj,attributes,sections}) => { + const rollString = assembleRoll(rollObj,attributes,sections); + return startRoll(rollString); +};/** + * Resets the fresh state for animation containers so that they do not run on reloading a page. + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const refreshAnimations = function({trigger,attributes,sections,casc}){ + $20('#pc-conditions .sidebar-toggle,#pc-conditions').addClass('fresh'); +}; +k.registerFuncs({ refreshAnimations }); + k.registerEventHandlers(); + + +console.debug = jest.fn(a => null); +console.log = jest.fn(a => null); +console.table = jest.fn(a => null); +module.exports = {k,...global}; \ No newline at end of file diff --git a/backbone/source/javascript/navFuncs.js b/backbone/source/javascript/navFuncs.js new file mode 100644 index 0000000000..76c3f9dc8c --- /dev/null +++ b/backbone/source/javascript/navFuncs.js @@ -0,0 +1,11 @@ +/** + * Resets the fresh state for animation containers so that they do not run on reloading a page. + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const refreshAnimations = function({trigger,attributes,sections,casc}){ + $20('#pc-conditions .sidebar-toggle,#pc-conditions').addClass('fresh'); +}; +k.registerFuncs({ refreshAnimations }); \ No newline at end of file diff --git a/backbone/source/javascript/rollFunctions.js b/backbone/source/javascript/rollFunctions.js new file mode 100644 index 0000000000..50f1eb972b --- /dev/null +++ b/backbone/source/javascript/rollFunctions.js @@ -0,0 +1,164 @@ +/** + * + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ + const rollHealthCheck = async function({trigger,attributes,sections,casc}){ + const rollName = trigger.name.replace(/-action$/,''); + const statVal = attributes[rollName]; + const rollObj = { + title:`^{${rollName} roll}`, + pure_success:true, + roll:`[[@{roll_state}cs<${statVal}cf>[[${statVal} + 1]]]]` + }; + const roll = await executeRoll({rollObj,attributes,sections}); + finishRoll(roll.rollId); +}; +k.registerFuncs({rollHealthCheck}); + +/** + * Starts the process of rolling a basic attribute check + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const rollAttribute = async function({trigger,attributes,sections,casc}){ + const rollName = trigger.name.replace(/-action$/,''); + const rollAttr = rollName.replace(/-/g,'_'); + const rollTransKey = rollName.replace(/-/g,' '); + const rollObj = { + title:`^{${rollName}}`, + roll:`[[@{roll_state} + ${attributes[rollAttr]}[${k.capitalize(getTranslationByKey(rollTransKey))}]]]` + }; + const roll = await executeRoll({rollObj,attributes,sections}); + finishRoll(roll.rollId); +}; +k.registerFuncs({rollAttribute}); + +/** + * Makes rolls for the repeating sections (weapons and abilities) + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const rollRepeating = async function({trigger,attributes,sections,casc}){ + const [section,rowID] = k.parseTriggerName(trigger.name); + const row = `${section}_${rowID}`; + const rollName = attributes[`${row}_name`]; + const skillName = attributes[`${row}_skill`]; + const [modifier] = getSkillRollModifier(skillName,attributes); + const rollObj = { + title:rollName, + roll_name:`^{${skillName}}`, + roll:`[[@{roll_state}${modifier}]]]` + }; + if(attributes[`${row}_damage`]){ + rollObj.damage = attributes[`${row}_damage`]; + if(attributes[`${row}_damage_characteristic`]){ + rollObj.damage += `+ @{${attributes[`${row}_damage_characteristic`]}}[${k.capitalize(getTranslationByKey(attributes[`${row}_damage_characteristic`]))}]`; + } + rollObj.damage = `[[${rollObj.damage}]]`; + }else{ + rollObj.description = attributes[`${row}_description`]; + } + const roll = await executeRoll({rollObj,attributes,sections}); + finishRoll(roll.rollId); +}; +k.registerFuncs({rollRepeating}); + +const getSkillRollModifier = (rollName,attributes,row) => { + row = row ? `${row}_` : ''; + const rollAttr = `${row}${rollName.replace(/-/g,'_')}`.replace(/_$/,''); + const rollTransKey = row ? + '': + rollName.replace(/-/g,' '); + const characteristicName = row ? + attributes[`${row}characteristic`] : + skills[rollTransKey].characteristic; + const characteristic = attributes[characteristicName] || 0; + const mastery = attributes[`${rollAttr}_mastery`]; + const profLabel = rollTransKey ? + k.capitalize(getTranslationByKey(rollTransKey)) : + attributes[`${row}name`]; + const charLabel = k.capitalize(getTranslationByKey(characteristicName)); + const profBonus = attributes.roll_state === '1D20' ? + Math.max(attributes[`${rollAttr}_proficiency`] * 2, 1) : + attributes[`${rollAttr}_proficiency`]; + const rollMsg = `${mastery ? 'cs>19' : ''} + ${profBonus}[${profLabel}] + ${characteristic}[${charLabel}`; + return [ + rollMsg, + characteristicName, + rollTransKey]; +}; + +/** + * Starts the process of rolling a basic skill check + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const rollSkill = async function({trigger,attributes,sections,casc}){ + const [section,rowID,button] = k.parseTriggerName(trigger.name); + const row = section ? + `${section}_${rowID}` : + ''; + const rollName = button.replace(/-?action$/,''); + const [modifier,,rollTransKey] = getSkillRollModifier(rollName,attributes,row); + const rollObj = { + title:section ? + attributes[`${row}_name`]: + `^{${rollTransKey}}`, + roll:`[[@{roll_state}${modifier}]]]` + }; + const roll = await executeRoll({rollObj,attributes,sections}); + finishRoll(roll.rollId); +}; +k.registerFuncs({rollSkill}); + +/** + * Rolls for luck and displays `lucky` or `unlucky` + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const rollLuck = async function({trigger,attributes,sections,casc}){ + const luckTarget = attributes.luck === 'odd' ? + 1 : + 0; + const rollObj = { + title:'^{luck}', + luck:`[[@{roll_state}]]` + }; + const roll = await executeRoll({rollObj,attributes,sections}); + const computeObj = {}; + const rollModulus = roll.results.luck.result % 2; + computeObj.luck = rollModulus === luckTarget ? + 1 : + 0; + finishRoll(roll.rollId,computeObj); +}; +k.registerFuncs({rollLuck}); + +const assembleRoll = (rollObj,attributes,sections) => { + return Object.entries(rollObj).reduce((str,[field,content])=>{ + return str += ` {{${field}=${content}}}`; + },'@{template_start}'); +}; + +/** + * Executes the roll. Uses a callback if any computations are required. + * @param {object} rollObj - Object describing the roll fields to be used + * @param {object} attributes - The character attributes + * @param {object[]} sections - The sections array + * @returns {Promise} - Resolves to the roll results object + */ +const executeRoll = async ({rollObj,attributes,sections}) => { + const rollString = assembleRoll(rollObj,attributes,sections); + return startRoll(rollString); +}; \ No newline at end of file diff --git a/backbone/source/javascript/triggeredFuncs.js b/backbone/source/javascript/triggeredFuncs.js new file mode 100644 index 0000000000..1fae157aff --- /dev/null +++ b/backbone/source/javascript/triggeredFuncs.js @@ -0,0 +1,220 @@ +/** + * (un)equips armor items + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const equipArmor = function({trigger,attributes,sections,casc}){ + const [section,rowID,attr] = k.parseTriggerName(trigger.name); + const row = section ? + `${section}_${rowID}` : + k.generateRowID('repeating_stored',sections); + const armorAttrs = { + equipped:{ + 'armor':attributes[`${row}_armor_bonus`], + 'armor_name':attributes[`${row}_name`], + 'armor_details':attributes[`${row}_description`], + 'armor_size':attributes[`${row}_item_size`], + }, + stored:{ + [`${row}_armor_bonus`]:attributes.armor, + [`${row}_name`]:attributes.armor_name, + [`${row}_description`]:attributes.armor_details, + [`${row}_item_size`]:attributes.armor_size, + } + }; + const actionType = section ? 'equipped' : 'stored'; + const attrMap = armorAttrs[actionType]; + // If we are equipping a stored armor, then store the currently equipped armor in the stored items repeating section. + if(section){ + equipArmor({trigger:{name:'armor_name'},attributes,sections,casc}); + } + if( + !section && attributes.armor_name + ){ + attrMap[`${row}_type`] = 'armor'; + } + // copy the values to the target + Object.entries(attrMap) + .forEach(([key,val]) => { + if(section || val){ + attributes[key] = val; + } + }); + // If we equipped a stored armor, remove it from the stored gear repeating section. + if(section){ + k.removeRepeatingRow(row,attributes,sections); + }else{ + Object.keys(armorAttrs.equipped).forEach( + attr => attributes[attr] = '' + ); + } +}; +k.registerFuncs({equipArmor}); + +/** + * Moves gear/weapon/armor items around on the sheet equip/unequip them. + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const equipItem = function({trigger,attributes,sections,casc}){ + const [section,rowID,attr] = k.parseTriggerName(trigger.name); + const row = `${section}_${rowID}`; + if( + section === 'repeating_stored' && + attributes[`${row}_type`] === 'armor'){ + equipArmor({trigger,attributes,sections,casc}); + return; + } + const newSection = section === 'repeating_stored' ? + ( + attributes[`${row}_type`] === 'weapon' ? + 'repeating_weapon' : + 'repeating_equipped' + ): + 'repeating_stored'; + const newRow = k.generateRowID(newSection,sections); + Object.keys(casc) + .forEach(cascKey => { + if(cascKey.startsWith(`attr_${row}`)){ + const attrRef = cascKey.replace(/attr_repeating_[^_]+_[^_]+_/,''); + k.debug({[attrRef]:attributes[`${row}_${attrRef}`]}) + attributes[`${newRow}_${attrRef}`] = attributes[`${row}_${attrRef}`]; + } + }); + attributes[`${newRow}_equipped`] = newSection.endsWith('stored') ? + 0 : + 1; + debugger; + if(section !== 'repeating_stored'){ + attributes[`${newRow}_type`] = section.endsWith('equipped') ? + 'gear' : + 'weapon'; + }else{ + attributes[`${newRow}_type`] = attributes[`${newRow}_type`] || 'gear'; + } + k.removeRepeatingRow(row,attributes,sections); +}; +k.registerFuncs({equipItem}); + +/** + * Manipulates the classes on the npc skill containers to ensure that only those with an entered value are displayed in collapsed mode + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const displayNPCSkill = function({trigger,attributes,sections,casc}){ + const skill = trigger.name; + const rawSkillValue = attributes.attributes[skill]; + const action = rawSkillValue ? + 'removeClass' : + 'addClass'; + const $elem = $20(`.npc-${skill.replace(/\s+/g,'-').replace(/\(|\)|\//g,'')}-container`); + $elem[action]('expanded'); +}; +k.registerFuncs({displayNPCSkill}); + +/** + * Sets up the npc skill display based on the collected values by calling displayNPCSkill for each skill + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const NPCSkillSetup = function({trigger,attributes,sections,casc}){ + Object + .keys(skills) + .forEach((skill) => + displayNPCSkill({trigger:{name:skill},attributes,sections,casc})); +}; +k.registerFuncs({NPCSkillSetup},{type:['opener']}); + +/** + * + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const showConditions = function({trigger,attributes,sections,casc}){ + $20('#pc-conditions .sidebar-toggle,#pc-conditions').removeClass('fresh'); + $20('#pc-conditions').toggleClass('active'); +}; +k.registerFuncs({showConditions}); + +/** + * Resets the tracker for a condition to 0 when the condition is turned off + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const resetCondition = function({trigger,attributes,sections,casc}){ + if(attributes[trigger.name]){ + attributes[`track_${trigger.name}`] = ''; + } +}; +k.registerFuncs({resetCondition}); + +/** + * Decrements the indicated input + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ + const decrementInput = function({trigger,attributes,sections,casc}){ + const [section,rowID,buttonName] = k.parseTriggerName(trigger.name); + const attrName = buttonName.replace(/^decrement-/,'').replace(/-/g,'_'); + attributes[attrName] -= 1; +}; +k.registerFuncs({decrementInput}); + +/** + * Increments the indicated input + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const incrementInput = function({trigger,attributes,sections,casc}){ + const [section,rowID,buttonName] = k.parseTriggerName(trigger.name); + const attrName = buttonName.replace(/^increment-/,'').replace(/-/g,'_'); + attributes[attrName] += 1; +}; +k.registerFuncs({incrementInput}); + +/** + * Sets the pc/npc specific button displays + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const sheetTypeDisplay = function({trigger,attributes,sections,casc}){ + if(attributes.character_type === 'pc'){ + $20('.tabs--backbone__button--pc').removeClass('inactive'); + $20('.tabs--backbone__button--npc').addClass('inactive'); + }else{ + $20('.tabs--backbone__button--pc').addClass('inactive'); + $20('.tabs--backbone__button--npc').removeClass('inactive'); + } +}; +k.registerFuncs({sheetTypeDisplay},{type:['opener']}); + + +/** + * Handles the necessary setup for adding a weapon + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const addWeapon = function({trigger,attributes,sections,casc,newRow}){ + attributes[`${newRow}_type`] = 'weapon'; +}; +k.registerFuncs({addWeapon}); \ No newline at end of file diff --git a/backbone/source/javascript/variables.js b/backbone/source/javascript/variables.js new file mode 100644 index 0000000000..f8f5e5be40 --- /dev/null +++ b/backbone/source/javascript/variables.js @@ -0,0 +1 @@ +k.version = 1; \ No newline at end of file diff --git a/backbone/source/mixins/_sheetmixins.pug b/backbone/source/mixins/_sheetmixins.pug new file mode 100644 index 0000000000..76d675465c --- /dev/null +++ b/backbone/source/mixins/_sheetmixins.pug @@ -0,0 +1,264 @@ +- + const conditions = [ + 'bewildered', + 'bleeding', + 'blinded', + 'burned', + 'confused', + 'deafened', + 'incapacitated', + 'infuriated', + 'intoxicated', + 'plagued', + 'poisoned', + 'panicked', + 'sleeping', + 'spellbound', + 'wounded', + 'comatose', + 'death', + 'in extremis', + 'prone', + 'restrained', + 'unconscious' + ]; +- + const characteristics = { + 'aptitude':{name:'aptitude',affects:['reflex goal']}, + 'athletics':{name:'athletics',affects:['reflex goal','movement rate','sprint speed','item_slots_max']}, + 'charisma':{name:'charisma',affects:['intuition goal']}, + 'logic':{name:'logic',affects:['vigilance goal']}, + 'wisdom':{name:'wisdom',affects:['intuition goal']}, + 'size':{name:'size',affects:['build goal','item_slots_max']}, + 'stamina':{name:'stamina',affects:['build goal']}, + 'willpower':{name:'willpower',affects:['vigilance goal']} + }; +- varObjects.characteristics = characteristics; +- const attributes = ['vigilance','build','intuition','reflex']; +- + varObjects.attributesDetails = { + vigilance_goal:['logic','willpower'], + build_goal:['size','stamina'], + intuition_goal:['charisma','wisdom'], + reflex_goal:['athletics','aptitude'] + }; +- + const movementArmor = [ + {name:'armor',value:0,trigger:{}}, + {name:'movement rate',trigger:{calculation:'calcMovement'}}, + {name:'sprint speed',trigger:{calculation:'calcSprint'}} + ]; +- + const basicSkills = { + assess:{name:'assess',characteristic:'wisdom'}, + deceive:{name:'deceive',characteristic:'charisma'}, + deduce:{name:'deduce',characteristic:'logic'}, + disguise:{name:'disguise',characteristic:'charisma'}, + encrypt:{name:'encrypt',characteristic:'logic'}, + 'first aid':{name:'first aid',characteristic:'wisdom'}, + hide:{name:'hide',characteristic:'wisdom'}, + legerdemain:{name:'legerdemain',characteristic:'aptitude'}, + locksmith:{name:'locksmith',characteristic:'aptitude'}, + 'nurse (ment)':{name:'nurse (ment)',characteristic:'logic'}, + 'nurse (phys)':{name:'nurse (phys)',characteristic:'logic'}, + persuade:{name:'persuade',characteristic:'charisma'}, + research:{name:'research',characteristic:'logic'}, + 'ride/steer':{name:'ride/steer',characteristic:'athletics'}, + search:{name:'search',characteristic:'wisdom'}, + sneak:{name:'sneak',characteristic:'athletics'}, + stunt:{name:'stunt',characteristic:'athletics'}, + survive:{name:'survive',characteristic:'wisdom'}, + threaten:{name:'threaten',characteristic:'charisma'}, + tinker:{name:'tinker',characteristic:'aptitude'} + }; +- + const combatSkills = { + melee:{name:'melee',characteristic:'athletics'}, + ranged:{name:'ranged',characteristic:'aptitude'} + }; +- varObjects.skills = {...basicSkills,...combatSkills}; + +mixin statContainer(divObj) + - divObj = divObj || {}; + .stat-container&attributes(divObj)&attributes(attributes) + block +//- End Mixin + +mixin skillSelect(selectObj = {name:'skill',class:'underlined'},defaultValue) + +select-label({ + inputObj:selectObj, + spanObj:{'data-i18n':'skill'}, + divObj:attributes + }) + if !defaultValue + +option({value:'','data-i18n':'select one',selected:''}) + each skill in [...Object.keys(basicSkills),...Object.keys(combatSkills)] + - const optObj = {value:replaceSpaces(skill),'data-i18n':skill} + if skill === defaultValue || optObj.value === defaultValue + - optObj.selected = ''; + +option(optObj) +//- End Mixin + +mixin characteristicOptions(defaultValue) + if !defaultValue + +option({value:'','data-i18n':'select one',selected:''}) + each value in Object.keys(characteristics) + - const optObj = {value:replaceSpaces(value),'data-i18n':value} + if value === defaultValue || optObj.value === defaultValue + - optObj.selected = ''; + +option(optObj) +//- End Mixin + +mixin plusControl({name,defaultValue,classAdd,trigger}) + div(class=`plus-container${classAdd ? classAdd : ''}`) + //- +hidden({name:`${name} modded`,class:'mod-control',value:'',trigger:{affects:[replaceSpaces(name)]}}) + - + const trueDefault = defaultValue === undefined ? + 0 : + defaultValue; + +hidden({name,class:'plus-control',value:trueDefault,trigger}) + +span({class:`plus-display${classAdd ? ` ${classAdd}` : ''}`,name}) + |#{trueDefault} +//- End mixin + +mixin skillRows(skills) + each obj,name in skills + div(class=`skill-${name}`).skill-row + +roller({name,role:'heading','aria-level':3,'data-i18n':name,trigger:{ + triggeredFuncs:['rollSkill'] + }}) + +fillLeft({ + radioObj:{name:`${name} proficiency`,value:-1}, + divObj:{class:'proficiency'}, + valueArray:[-1,0,1,2,3,4], + noClear:true, + displayValues:['-1','+0','+1','+2','+3','+4'] + }) + .parens-holder + span.parentheses ( + +input-label({ + inputObj:{name:obj.characteristic,type:'number',readonly:true}, + spanObj:{'data-i18n':`+${obj.characteristic} abbreviation`}, + divObj:{class:'stacked'} + }) + span.parentheses ) + +checkbox({name:`${name} mastery`,value:1,class:'mastery'}) +//- End Mixin + +mixin sectionControl(inputObj) + - inputObj.hidden = ''; + - + inputObj.class = inputObj.class ? + `${inputObj.class} section-control` : + 'section-control'; + +checkbox(inputObj) + .section-display&attributes(attributes) + block +//- End Mixin +mixin sizeAndSlot + .flex-box.justify-center.span-all.half-gap.expanded + +input-label({ + inputObj:{name:'uses_slot',type:'checkbox',value:1,checked:'',class:'underlined',trigger:{affects:['item slots']}}, + spanObj:{'data-i18n':'uses slot'} + }) + +select-label({ + inputObj:{name:'item size',class:'underlined'}, + spanObj:{'data-i18n':'size'} + }) + +option({value:'','data-i18n':'select size',selected:''}) + each size in ['small','medium','large'] + +option({value:size,'data-i18n':size}) +//- End Mixin +mixin weaponDetails(equipped) + +collapse + - const equippedCheckObj = {name:'equipped',class:'equipped',value:1,trigger:{triggeredFuncs:['equipItem'],affects:['item slots']}}; + if equipped + - equippedCheckObj.checked = ''; + .flex-box.span-all.half-gap + +checkbox(equippedCheckObj) + +text({name:'name',class:'underlined flex-min-content'}) + if !equipped + +select({name:'type',class:'underlined'}) + +option({value:'','data-i18n':'select'}) + each value in ['gear','armor','weapon'] + +option({value,'data-i18n':value}) + +checkbox({name:'type',value:'weapon',hidden:'',class:'section-control'}) + +input-label({ + inputObj:{name:'wear',type:'number',class:'underlined'}, + spanObj:{'data-i18n':'wear',role:'heading','aria-level':4}, + divObj:{class:'wear section-display'} + }) + else + +input-label({ + inputObj:{name:'wear',type:'number',class:'underlined'}, + spanObj:{'data-i18n':'wear',role:'heading','aria-level':4}, + divObj:{clas:'wear'} + }) + +roller({name:'roll',trigger:{ + triggeredFuncs:['rollRepeating'] + }}) + +checkbox({name:'type',value:'weapon',hidden:'',class:'section-control',trigger:{defaultValue:''}}) + .section-display.expanded.weapon-section + +skillSelect + +input-label({ + inputObj:{name:'properties',type:'text',class:'underlined'}, + spanObj:{'data-i18n':'properties',role:'heading','aria-level':4}, + divObj:{class:'blitz'} + }) + .input-label.input-label--dual.damage + span(data-i18n='damage' role='heading' aria-level=4) + +text({name:'damage',class:'underlined'}) + span.slash + + +select({name:'damage characteristic',class:'underlined'}) + +characteristicOptions + +input-label({ + inputObj:{name:'range',type:'text',class:'underlined'}, + spanObj:{'data-i18n':'range',role:'heading','aria-level':4}, + divObj:{class:'range'} + }) +mixin attributeHolder(name) + - const trigger = {calculation:'calcAttribute',affects:[`${name}`]}; + +statContainer({class:name})&attributes(attributes) + +roller-label({ + inputObj:{name:`${name} goal`,value:11,class:'underlined',type:'number',trigger}, + buttonObj:{name,'data-i18n':name,role:'heading','aria-level':3,trigger:{ + triggeredFuncs:['rollAttribute'] + }}, + divObj:{class:'stacked center no-gap'} + }) + .parens-holder + span.parentheses ( + +plusControl({name:`${name}`,value:0,trigger:{calculation:'calcAttributeMod'}}) + span.parentheses ) +mixin conditionCheck(condition) + .condition-holder + label.text-check.tooltip--control + +checkbox({name:condition,value:1,hidden:''}) + span(data-i18n=condition).basic-border + span(data-i18n=`${condition}-description`).tooltip-display +//- End Mixin + +mixin bestWorstToggle + ul.best-worst-toggle.flex-box.half-gap.flex-wrap + each value,state in {'best-of-two':'2d20kh1','normal':'1d20','worst-of-two':'2d20kl1','take time':'1D20'} + li.no-list + label(title='@{roll_state}').text-check + - const checkObj = {name:'roll state',value,hidden:''}; + if state === 'normal' + - checkObj.checked = ''; + +radio(checkObj) + span(data-i18n=state).basic-border +//- End Mixin + +mixin inputWithControls(inputObj) + - const nameBase = inputObj.name; + .input-controls + +action({name:`decrement ${nameBase}`,class:'input-control--button',trigger:{ + triggeredFuncs:['decrementInput'] + }}) + |- + +input(inputObj) + +action({name:`increment ${nameBase}`,class:'input-control--button',trigger:{ + triggeredFuncs:['incrementInput'] + }}) + |+ \ No newline at end of file diff --git a/backbone/source/rolltemplates/_backbone.pug b/backbone/source/rolltemplates/_backbone.pug new file mode 100644 index 0000000000..e7ee39e788 --- /dev/null +++ b/backbone/source/rolltemplates/_backbone.pug @@ -0,0 +1,41 @@ ++templateWrapper(templateName) + .image-border + .sheet-content.stacked.center.flex-box.half-gap + +characterLink + +templateConditionalDisplay('roll') + .flex-box.results.half-gap.stacked.center + span.result + +templateConditionalDisplay('pure_success') + span.pure-success + |{{computed::roll}} + +templateConditionalDisplay('title') + h2 {{title}} + +templateConditionalDisplay('luck') + .flex-box.results.half-gap.stacked.center.center + +rollTotal({values:'computed::luck 1'}) + span.result.result--is-crit {{luck}} + +rollTotal({values:'computed::luck 0'}) + span.result.result--is-fumble {{luck}} + + .header.flex-box.stacked.center.flex-wrap + +templateConditionalDisplay('roll_name') + h3.title.align-self-start {{roll_name}} + + +templateConditionalDisplay('luck') + .flex-box.results.half-gap.stacked.center.center + +rollTotal({values:'computed::luck 1'}) + h3(data-i18n='lucky-message').result + +rollTotal({values:'computed::luck 0'}) + h3(data-i18n='unlucky-message').result + + +templateConditionalDisplay('damage') + .flex-box.space-between.results.half-gap.column-reverse + +templateConditionalDisplay('damage_type') + h3 {{damage_type}} + +templateConditionalDisplay('damage_type','invert') + h3(data-i18n='damage') + span.result {{computed::damage}} + + +templateConditionalDisplay('description') + .description.flex-box.stacked.center.align-self-stretch + p(style="text-align:left") {{description}} \ No newline at end of file diff --git a/backbone/source/scaffold/_k.pug b/backbone/source/scaffold/_k.pug new file mode 100644 index 0000000000..6cda03fca3 --- /dev/null +++ b/backbone/source/scaffold/_k.pug @@ -0,0 +1,11 @@ +include ./helpers/_helpers.pug +include ./attribute_holders/_attribute_holders.pug + +include ./labels/_labels.pug +include ./adaptive/_adaptive.pug +include ./fieldsets/_fieldsets.pug +include ./tabs/_tabs.pug +include ./scripts/_scripts.pug +include ./rolltemplate/_rolltemplate.pug + +include ./deprecated/_base_elements.pug \ No newline at end of file diff --git a/backbone/source/scaffold/_k.scss b/backbone/source/scaffold/_k.scss new file mode 100644 index 0000000000..f4cdfde69b --- /dev/null +++ b/backbone/source/scaffold/_k.scss @@ -0,0 +1 @@ +@use 'tabs/_tabs.scss'; \ No newline at end of file diff --git a/backbone/source/scaffold/adaptive/_adaptive.pug b/backbone/source/scaffold/adaptive/_adaptive.pug new file mode 100644 index 0000000000..3921b740eb --- /dev/null +++ b/backbone/source/scaffold/adaptive/_adaptive.pug @@ -0,0 +1,39 @@ +//- @pugdoc + name: adaptiveTextarea + description: Creates an html construction for creating a [content-scaled](https://wiki.roll20.net/CSS_Wizardry#Content-scaled_Inputs) textarea. You can apply classes and IDs to the container div by appending them to the mixin call (see the second example). + arguments: + - {object} textObj - The object describing the textarea as per the {@link textarea} mixin. + attributes: + example: | + include _htmlelements.pug + +adaptiveTextarea({name:'character description'}) + + //Appending the class directly to the mixin + +adaptiveTextarea({name:'character description'}).custom-class +mixin adaptiveTextarea(textObj) + .adaptive.adaptive--text&attributes(attributes) + - let spanObj = {name:textObj.name,class:'adaptive--text__span'}; + - textObj.class = textObj.class ? `${textObj.class} adaptive--text__textarea` : 'adaptive--text__textarea'; + +span(spanObj) + +textarea(textObj) +//- End Mixin + +//- @pugdoc + name: adaptiveInput + description: Creates an html construction for creating a [content-scaled](https://wiki.roll20.net/CSS_Wizardry#Content-scaled_Inputs) input. You can apply classes and IDs to the container div by appending them to the mixin call (see the second example). + arguments: + - {object} inputObj - The object describing the input as per the {@link input} mixin. You can apply classes and IDs to the container div by appending them to the mixin call (see the second example). + attributes: + example: | + include _htmlelements.pug + +adaptiveInput({name:'character description',type:'text'}) + + //Appending class directly to the mixin + +adaptiveInput({name:'character description',type:'text'}).custom-class +mixin adaptiveInput(textObj) + .adaptive.adaptive--input&attributes(attributes) + - let spanObj = {name:textObj.name,class:'adaptive--input__span','max-width':maxWidth}; + - textObj.class = textObj.class ? `${textObj.class} adaptive--input__input` : 'adaptive--input__input'; + +span(spanObj) + +input(textObj) +//- End Mixin \ No newline at end of file diff --git a/backbone/source/scaffold/attribute_holders/_attribute_backed.pug b/backbone/source/scaffold/attribute_holders/_attribute_backed.pug new file mode 100644 index 0000000000..d7ff5b6d86 --- /dev/null +++ b/backbone/source/scaffold/attribute_holders/_attribute_backed.pug @@ -0,0 +1,71 @@ + +//- @pugdoc + name: img + description: A mixin to create a sheet image element. Particularly useful when using the image attribute syntax. + arguments: + attributes: + example: | + include _htmlelements.pug + +img({name:'my image',class:'some-class'}) +mixin img(obj) + - checkKUse(); + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + - obj['data-i18n-alt'] = obj['data-i18n-alt'] || obj.name; + - obj.name = attrName(obj.name); + - obj.title = obj.title || attrTitle(obj.name); + - obj.name = `attr_${obj.name}`; + img&attributes(obj) +//-End Mixin + + + + +//- @pugdoc + name: span + description: Creates a span element and formats the name of the span for compatibility with the Roll20 attribute system. + arguments: + - {object} attrObj - The object describing the span itself. + - {block} block - What is contained within the span + attributes: + example: | + include _htmlelements.pug + +span({name:'attribute backed span',trigger:{calculation:'calculateAttribute'}}) +mixin span(obj) + - checkKUse(); + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + if obj.name + - obj.name = attrName(obj.name); + - obj.title = obj.title || attrTitle(obj.name); + - obj.name = `attr_${obj.name}`; + - addFieldToFieldsetObj(obj); + - const elementObj = makeElementObj(obj); + span&attributes(elementObj) + block + if obj.name + - obj.type = 'span'; + - storeTrigger(obj); +//-End Mixin + + + + +//- @pugdoc + name: div + description: Creates a div element and will properly format the name attribute of the div if it is provided + arguments: + - {object} divObj - The object describing the div + - {block} block - The contents of the div + attributes: + example: | + include _htmlelements.pug + +div({name:'background image'}) +mixin div(obj) + - checkKUse(); + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + if obj.name + - obj.name = attrName(obj.name); + - obj.title = obj.title || attrTitle(obj.name); + - obj.name = `attr_${obj.name}`; + div&attributes(obj) + block +//-End Mixin \ No newline at end of file diff --git a/backbone/source/scaffold/attribute_holders/_attribute_holders.pug b/backbone/source/scaffold/attribute_holders/_attribute_holders.pug new file mode 100644 index 0000000000..17ab6db278 --- /dev/null +++ b/backbone/source/scaffold/attribute_holders/_attribute_holders.pug @@ -0,0 +1,6 @@ +include _inputs.pug +include _selects.pug +include _attribute_backed.pug +include _fill_left.pug +include _buttons.pug +include _compendium.pug \ No newline at end of file diff --git a/backbone/source/scaffold/attribute_holders/_buttons.pug b/backbone/source/scaffold/attribute_holders/_buttons.pug new file mode 100644 index 0000000000..84b124308b --- /dev/null +++ b/backbone/source/scaffold/attribute_holders/_buttons.pug @@ -0,0 +1,87 @@ +//- @pugdoc + name: button + description: Creates a button element. Valid types are `roll` or `action`. If a type is not specified in the object argument, a roll button is created. If an action button is created, spaces in the name are replaced with dashes instead of underscores. + arguments: + - {object} buttonObj - The object describing the button + - {block} block - The contents of the button element + attributes: + example: | + include _htmlelements.pug + //A basic roll button + +button({name:'my button',value:'/r 3d10'}) + //An action button + +button({name:'my button',type:'action','data-i18n':'action button',trigger:{triggeredFuncs:['doSomethingOnClick']}}) +mixin button(obj, _attributes) + - checkKUse(); + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + - obj.name = attrName(obj.name); + - obj.title = obj.title || buttonTitle(obj.name); + if obj.type === 'action' + - obj.name = `act_${obj.name}`; + else + - obj.type = 'roll'; + - obj.name = `roll_${obj.name}`; + - const elementObj = makeElementObj(obj); + if obj.type !== 'roll' + - storeTrigger(obj); + button&attributes(elementObj)&attributes(attributes) + block +//-End Mixin + +//- @pugdoc + name: action + description: Alias for {@link button} that creates a button element with a type of `action`. Spaces in the name are replaced with dashes instead of underscores. + arguments: + attributes: + example: | + include _htmlelements.pug + +action({name:'my button','data-i18n':'action button',trigger:{triggeredFuncs:['doSomethingOnClick']}}) +mixin action(obj, _attributes) + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + - obj.type = 'action'; + - obj.name = attrName(obj.name).replace(/[\s_]+/g,'-'); + +button(obj)&attributes(attributes) + block +//- End Mixin + +//- @pugdoc + name: navButton + description: Alias for {@link button} that creates a button element with a type of `action` for use in nav buttons. Spaces in the name are replaced with dashes instead of underscores. The name is prefixed with `nav_`. A {@link trigger} object should be passed + arguments: + attributes: + example: | + include _htmlelements.pug + +navButton({name:'my button','data-i18n':'action button'}) +mixin navButton(obj) + - addIfUnique(obj.name,'navButtons'); + - obj.name = `nav ${obj.name}`; + +action(obj)&attributes(attributes) + block +//- End Mixin + +mixin rollerExtras(obj) + - obj.class = obj.class ? `${replaceProblems(obj.class)} roller` : 'roller'; + - let attributeName = replaceSpaces(actionInputName(attrName(obj.name))); + - let actionName = actionButtonName(attributeName); + - obj.value = `@{${attributeName}}`; + - actionObj = {name:actionName,hidden:''}; + - actionObj.trigger = obj.trigger || {listenerFunc:'initiateRoll'}; + block + - addIfUnique(`${repeatingPrefix}${attributeName}`,'actionAttributes'); + +action(actionObj) + +hidden({name:attributeName}) +//- @pugdoc + name: roller + description: Creates a multi element construction made of a hidden input, a roll button, and a hidden action button. On sheet load, or character sheet name change, the hidden input is updated with an ability call to the action button. The roll button refers to the hidden input as its value. This allows for an action button to be used to call custom roll parsing (or other sheet functionality) while retaining the ability to drag the button to the macro bar. Uses the same arguments as {@link button}. A trigger should be passed, and will be associated with the action button's name. + arguments: + attributes: + example: | + include _htmlelements.pug + +roller({name:'my button','data-i18n':'action button',trigger:{triggeredFuncs:['doSomethingOnClick']}}) +mixin roller(obj) + +rollerExtras(obj) + - let rollObj = {...obj}; + - delete rollObj.trigger; + +button(obj) + block +//- End Mixin \ No newline at end of file diff --git a/backbone/source/scaffold/attribute_holders/_compendium.pug b/backbone/source/scaffold/attribute_holders/_compendium.pug new file mode 100644 index 0000000000..81abcf3ca9 --- /dev/null +++ b/backbone/source/scaffold/attribute_holders/_compendium.pug @@ -0,0 +1,27 @@ +//- @pugdoc + name: compendiumAttributes + description: Creates a set of compendium drop target attributes. Defaults to creating target attributes for the `Name` and `data` compendium attributes. + arguments: + - {string} [prefix] - A prefix to attach to the default attribute names. + - {array} [lookupAttributes = ['Name','data']] - An array of the lookup attributes to create targets for. The target attributes are named based on the compendium attribute they are for. + - {string} [triggerAccept = 'Name'] - The compendium attribute that should trigger the sheetworkers to handle the compendium drop. + - {object} [trigger] - The trigger object. + attributes: + example: | + include _htmlelements.pug + //Using just defaults + +compendiumAttributes({}) + + //Specifying a prefix + +compendiumAttributes({prefix:'prefix'}) + + //Specifying lookupAttributes and a prefix + +compendiumAttributes({lookupAttributes:['Name','data','Category'],prefix:'prefix'}) +mixin compendiumAttributes({prefix,lookupAttributes = ['Name','data'],triggerAccept = 'Name',trigger = {triggeredFuncs:["handleCompendiumDrop"]}}) + - prefix = prefix ? `${prefix} ` : ''; + each accept in lookupAttributes + - let inputObj = {name:`${prefix}drop ${accept.toLowerCase()}`,accept,value:''}; + if accept === triggerAccept + - inputObj.trigger = trigger; + +hidden(inputObj) +//- End Mixin \ No newline at end of file diff --git a/backbone/source/scaffold/attribute_holders/_fill_left.pug b/backbone/source/scaffold/attribute_holders/_fill_left.pug new file mode 100644 index 0000000000..8ff018bae2 --- /dev/null +++ b/backbone/source/scaffold/attribute_holders/_fill_left.pug @@ -0,0 +1,40 @@ +//- @pugdoc + name: fillLeft + description: A mixin that creates an html construction ready to be styled for use as a [fill-to-left section](https://wiki.roll20.net/CSS_Wizardry#Fill_Radio_Buttons_to_the_Left). + arguments: + - {object} radioObj - The object containing the details of the radio input to create. Similar to the {@link radio}, but the value property passed is used as the default checked value. + - {object} [divObj] - Optional object containing any details of the div to be applied such as class, id, or other properties. Class and ID can also be supplied by attaching them to the mixin invocation just like with a regular div. + - {array} valueArray - Array containing the values to be used for the fill to left construction. These should be in the order that they should be displayed left to right. + - {boolean} [noClear] - Optional argument that tells the mixin whether or not to apply the `fill-left__radio--clearer` class to the first radio button value. If falsy (or not passed), the class is applied. If truthy, the class is not applied. + example: | + include _htmlelements.pug + +fillLeft({ + radioObj:{name:'my radio'}, + divObj:{class:'some-custom-class'}, + valueArray:[1,2,3,4,5] + }) +mixin fillLeft({radioObj,divObj,valueArray,noClear,displayValues}) + - divObj = divObj || {}; + .fill-left&attributes(divObj)&attributes(attributes) + if !noClear + - const clearObj = {...radioObj,value:0}; + - + clearObj.class = clearObj.class ? + `${clearObj.class} fill-left__radio fill-left__radio--clearer` : + `fill-left__radio fill-left__radio--clearer`; + if value === 0 + - clearObj.checked = ''; + +hidden(clearObj) + each value,index in valueArray + - const usedObj = {...radioObj,value}; + - + usedObj.class = usedObj.class ? + `${usedObj.class} fill-left__radio` : + `fill-left__radio`; + if displayValues + - usedObj['data-value'] = displayValues[index]; + if value === radioObj.value + - usedObj.checked = ''; + + +#{noClear ? 'radio' : 'checkbox'}(usedObj) +//- End Mixin diff --git a/backbone/source/scaffold/attribute_holders/_inputs.pug b/backbone/source/scaffold/attribute_holders/_inputs.pug new file mode 100644 index 0000000000..c37f2fc319 --- /dev/null +++ b/backbone/source/scaffold/attribute_holders/_inputs.pug @@ -0,0 +1,140 @@ + +//- @pugdoc + name: input + description: A generic mixin to create an input. The mixin will replace spaces in the attribute name with underscores and will add a title property if one isn't supplied that will inform the user what the attribute call for the attribute is. + arguments: + - {object} inputObj - An object describing the properties of the input just like they would be in a PUG or HTML element declaration, but in JS Object syntax. May also include a trigger property + attributes: + example: | + include _htmlelements.pug + +input({name:'my attribute',type:'text',class:'some-class',trigger:{affects:['other_attribute']}}) +mixin input(obj) + - checkKUse(); + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + - obj.name = attrName(obj.name); + - obj.title = obj.title || attrTitle(obj.name); + - obj.name = `attr_${obj.name}`; + - const elementObj = makeElementObj(obj); + - addFieldToFieldsetObj(obj); + - storeTrigger(obj); + input&attributes(elementObj)&attributes(attributes) +//-End Mixin + +//- @pugdoc + name: text + description: An alias for {@link input} that specifies the input type as text. See {@link input} for arguments. + arguments: + attributes: + example: | + include _htmlelements.pug + +text({name:'my attribute',class:'some-class',trigger:{affects:['other_attribute']}}) +mixin text(obj) + - obj.type = 'text'; + +input(obj) +//-End Mixin + +//- @pugdoc + name: checkbox + description: An alias for {@link input} that specifies the input type as checkbox. See {@link input} for arguments. + arguments: + attributes: + example: | + include _htmlelements.pug +mixin checkbox(obj) + - obj.type = 'checkbox'; + +input(obj)&attributes(attributes) +//-End Mixin + +//- @pugdoc + name: collapse + description: Alias for {@link checkbox} that creates a checkbox for us in collapse/expanding a section. Sets the checkbox to unchecked with a checked value of `1` and a class of `collapse`. Additional classes/ids can be applied by applying them inline to the mixin call. + arguments: + - {string} [name=collapse] - The name to use for the collapse element. Defaults to `collapse` + attributes: + example: | + include _htmlelements.pug + +collapse() +mixin collapse(name='collapse',isCollapsed) + - const checkObj = {name,value:1,class:'collapse'} + if isCollapsed + - checkObj.checked = ''; + +checkbox(checkObj)&attributes(attributes) +//-End Mixin + +//- @pugdoc + name: radio + description: Alias for {@link input} that specifies `radio` as the input type. See {@link input} for arguments. + arguments: + attributes: + example: | + include _htmlelements.pug +mixin radio(obj) + - obj.type = 'radio'; + +input(obj) +//-End Mixin + +//- @pugdoc + name: number + description: Alias for {@link input} that makes a number input. See {@link input} for arguments. + arguments: + attributes: + example: | + include _htmlelements.pug + +number({name:'my number',class:'some-class',trigger:{affects:['other_attribute']}}) +mixin number(obj) + - obj.type = 'number'; + +input(obj) +//-End Mixin + +//- @pugdoc + name: range + description: Alias for {@link input} that makes a range input. See {@link input} for arguments. + arguments: + attributes: + example: | + include _htmlelements.pug + +range({name:'my range',class:'some-class'}) +mixin range(obj) + - obj.type = 'range'; + +input(obj) +//-End Mixin + +//- @pugdoc + name: hidden + description: Alias for {@link input} that makes a hidden input. See {@link input} for arguments. + arguments: + attributes: + example: | + include _htmlelements.pug + +hidden({name:'my hidden attribute',class:'some-class',trigger:{triggeredFuncs:['someFunction']}}) +mixin hidden(obj) + - obj.type = 'hidden'; + +input(obj) +//-End Mixin + +mixin radioGroup(objArray) + each obj in objArray + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + - obj.type='radio'; + +input(obj) + +//- @pugdoc + name: textarea + description: A mixin to create K-scaffold compatible textareas. + arguments: + - {object} textObj - See {@link input} for information on valid properties of the textObj. + attributes: + example: | + include _htmlelements.pug + +textarea({name:'my textarea',class:'some-class',trigger:{affects:['an_attribute']}}) +mixin textarea(obj) + - checkKUse(); + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + - obj.name = attrName(obj.name); + - obj.title = obj.title || attrTitle(obj.name); + - obj.name = `attr_${obj.name}`; + - addFieldToFieldsetObj(obj); + - storeTrigger(obj); + - const elementObj = makeElementObj(obj); + textarea&attributes(elementObj) +//-End Mixin \ No newline at end of file diff --git a/backbone/source/scaffold/attribute_holders/_selects.pug b/backbone/source/scaffold/attribute_holders/_selects.pug new file mode 100644 index 0000000000..833b8ae8bc --- /dev/null +++ b/backbone/source/scaffold/attribute_holders/_selects.pug @@ -0,0 +1,66 @@ +//- @pugdoc + name: select + description: A mixin to create a select element. Uses K-scaffold global variables to control how {@link option} mixins within the select's block behave. + arguments: + - {object} inputObj - The object describing the select + - {block} block - The content within the select + attributes: + example: | + include _htmlelements.pug + +select({name:'my select'}) + +option({value:'a value','data-i18n':'a translation key',trigger:{affects:['some_attribute']}}) + +option({value:'value 2','data-i18n':'translation 2'}) + +option({value:'value 3'}) + |Some Text we include via the option's block +mixin select(obj) + - checkKUse(); + - + obj.class = obj.class ? + replaceProblems(obj.class) : + undefined; + - obj.name = attrName(obj.name); + - obj.title = obj.title || attrTitle(obj.name); + - obj.name = `attr_${obj.name}`; + - addFieldToFieldsetObj(obj); + + //- Initialize the object that will be passed to the cascade + - const triggerObj = {...obj,type:'select'}; + - const options = []; + + mixin option(optObj) + - + obj.class = obj.class ? + replaceProblems(obj.class) : + undefined; + - + const pushObj = { + obj:optObj, + attributes: attributes || {} + }; + if block + - pushObj.block = block; + - options.push(pushObj); + + + if !block + option(value='!!! Error: empty select !!!') + else + - block(); + - const selObj = makeElementObj(obj); + select&attributes(selObj)&attributes(attributes) + each o in options + if o.hasOwnProperty('selected') && o.hasOwnProperty('value') + - triggerObj.value = o.value; + if o.trigger && !triggerObj.trigger + - triggerObj.trigger = o.trigger; + - const elemObj = makeElementObj(o.obj); + option&attributes(elemObj)&attributes(o.attributes) + - storeTrigger(triggerObj); + +//- mixin select(obj) +//- select&attributes(obj) +//- if block +//- block +//- else +//- +option({value:'empty select, PEBKAC',selected:true}) +//-End Mixin \ No newline at end of file diff --git a/backbone/source/scaffold/deprecated/_base_elements.pug b/backbone/source/scaffold/deprecated/_base_elements.pug new file mode 100644 index 0000000000..d1ca6f1dbd --- /dev/null +++ b/backbone/source/scaffold/deprecated/_base_elements.pug @@ -0,0 +1,89 @@ +//- These mixins should be considered deprecated and are not even mentioned in the documentation. They are unneccessary barring a change in what Roll20 allows us to turn into an attribute backed element. +mixin h1(obj) + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + h1&attributes(obj) + block + + +mixin h2(obj) + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + h2&attributes(obj) + block + + +mixin h3(obj) + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + h3&attributes(obj) + block + + +mixin h4(obj) + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + h4&attributes(obj) + block + + +mixin h5(obj) + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + h5&attributes(obj) + block + + +mixin h6(obj) + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + h6&attributes(obj) + block + + +mixin p(obj) + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + p&attributes(obj) + block + + +mixin section(obj) + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + section&attributes(obj) + block + + + +mixin main(obj) + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + main&attributes(obj) + block + + + +mixin header(obj) + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + header&attributes(obj) + block + + + +mixin footer(obj) + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + footer&attributes(obj) + block + + + +mixin details(obj) + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + details&attributes(obj) + block + + + +mixin summary(obj) + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + summary&attributes(obj) + block + + + +mixin label(obj) + - obj.class = obj.class ? replaceProblems(obj.class) : undefined; + label&attributes(obj) + block diff --git a/backbone/source/scaffold/fieldsets/_fieldsets.pug b/backbone/source/scaffold/fieldsets/_fieldsets.pug new file mode 100644 index 0000000000..e1e057a820 --- /dev/null +++ b/backbone/source/scaffold/fieldsets/_fieldsets.pug @@ -0,0 +1,147 @@ + +//- @pugdoc + name: fieldset + description: A mixin that creates a fieldset for the creation of a repeating section. The mixin prefixes the name with `repeating_` and replaces problem characters (e.g. spaces are replaced with dashes). Additionally, the auto-generated title properties from the K-scaffold\'s mixins will include the proper repeating section information. + arguments: + - {string} name - The name of the repeating section. Will be prefixed with `repeating_` and spaces will be replaced with dashes (`-`). + - {object} [trigger] - Trigger that defines how to handle the removal of a row from the fieldset. `Optional` + - {string} addClass - Any additional classes that should be used for the repeating section. Note that these are not added to the fieldset itself as adding additional classes to the fieldset itself interferes with calling action buttons from chat, but are added to a span that precedes the fieldset. This allows styling of the repcontainer via a css declaration like `.bonus-class + fieldset + .repcontainer`. + attributes: + example: | + include _htmlelements.pug + //A basic fieldset declaration with a trigger + +fieldset({ + name:'fieldset', + trigger:{triggeredFuncs:['doWhenRemoved']} + }) + +text({name:'name'}) + + //A Fieldset with an added class + +fieldset({ + name:'fieldset', + trigger:{triggeredFuncs:['doWhenRemoved']}, + addClass:'some-class' + }) + +text({name:'name'}) +mixin fieldset({name,trigger,addClass}) + - + name = repeatsIgnoreSystemPrefix || !getSystemPrefix() ? + name : + `${getSystemPrefix()} ${name}`; + - name = name.replace(/\s+/g,'-'); + - let section = `repeating_${name}`; + - repeatingPrefix = `${section}_$X_`; + - createFieldsetObj(section) + if trigger + - storeTrigger({name:section,type:'fieldset',trigger}) + if addClass + span(hidden="" class=addClass) + fieldset(class=`${section}`) + block + - repeatingPrefix = ''; +//-End Mixin + + + + +//- @pugdoc + name: customControlFieldset + description: Alias for {@link fieldset} that creates to custom action buttons to add/remove rows to the repeating section. Useful when you need to trigger a sheetworker when a row is added. This also prevents the occassional error of a new row disappearing immediately after the user has clicked the button to create one. Proper use of this will require css to hide the default buttons that fieldsets create automatically. Note that currently this assumes the existence of an addItem and editSection sheetworker function. + arguments: + - {string} name - The name of the repeating section. Will be prefixed with `repeating_` and spaces will be replaced with dashes (`-`). + - {object} [trigger] - Trigger that defines how to handle the removal of a row from the fieldset. `Optional` + - {string} addClass - Any additional classes that should be used for the repeating section. Note that these are not added to the fieldset itself as adding additional classes to the fieldset itself interferes with calling action buttons from chat, but are added to a span that precedes the fieldset. This allows styling of the repcontainer via a css declaration like `.bonus-class + fieldset + .repcontainer`. + attributes: + example: | + include _htmlelements.pug + //A basic customControlfieldset declaration with a trigger + +customControlfieldset({ + name:'fieldset', + trigger:{triggeredFuncs:['doWhenRemoved']} + }) + + //A customControlfieldset with an added class + +customControlfieldset({ + name:'fieldset', + trigger:{triggeredFuncs:['doWhenRemoved']}, + addClass:'some-class' + }) +mixin customControlFieldset({name,trigger,addClass}) + - const prefixHolder = setSystemPrefix(); + - + buttonName = prefixHolder ? + `${prefixHolder} ${name}`: + name; + +action({name:`add ${buttonName}`,class:'repcontrol-button repcontrol-button--add',trigger:{listenerFunc:'addItem'}}) + - setSystemPrefix(prefixHolder); + +fieldset({name,trigger,addClass}) + block +//- End Mixin + + + + +//- @pugdoc + name: repeating_section + description: A mixin that creates a section element with an h2, a space for column headers, and a {@link customcontrolfieldset} which can be styled to fit those column headers. The h2 labels the section via `aria-labelledby`. + arguments: + - {string} name - The name of the section as per {@link fieldset}. This name will also be added to the section's class list as `repeating-container--NAME`. If no id argument is passed, this is also used as the id of the section. + - {string} header - The translation key for the h2 element in the section + - {array} columnArr - Array of translation keys to use as column headers. These are added as h5's. + - {string} id - An id to use for the section element. + attributes: + example: | + include _htmlelements.pug + +repeating_section('attacks','weapons',['name','bonus','damage','property'],'atk') + +text({name:'name'}) + +number({name:'bonus'}) + +text({name:'damage'}) + +text({name:'properties'}) +mixin repeating_section(name,header,columnArr,id) + section(class=`repeating-container--${name} repeating-container section` id=`${(id||name).replace(/\s+/g,'-')}`) + if header + h2(data-i18n=header) + if columnArr + .repeat-columns + each head in columnArr + h5(data-i18n=head) + +customControlFieldset(name) + block +//- End Mixin + + + + +//- @pugdoc + name: inlineFieldset + description: An alias for {@link fieldset} that creates a fieldset with an added class that can be easily hooked into via CSS to style the fieldset for inline display. + arguments: + - {string} name - The name of the repeating section. Will be prefixed with `repeating_` and spaces will be replaced with dashes (`-`). + - {object} [trigger] - Trigger that defines how to handle the removal of a row from the fieldset. `Optional` + - {string} addClass - Any additional classes that should be used for the repeating section. Note that these are not added to the fieldset itself as adding additional classes to the fieldset itself interferes with calling action buttons from chat, but are added to a span that precedes the fieldset. This allows styling of the repcontainer via a css declaration like `.bonus-class + fieldset + .repcontainer`. + attributes: + example: | + include _htmlelements.pug + +inlineFieldset({ + name:'fieldset', + trigger:{triggeredFuncs:['doWhenRemoved']}, + addClass:'some-class' + }) +mixin inlineFieldset({name,trigger,addClass}) + - addClass = addClass ? `${addClass} inline-fieldset` : 'inline-fieldset'; + - varObjects.inlineFieldsets = varObjects.inlineFieldsets || []; + - varObjects.inlineFieldsets.push(name); + +fieldset({name,trigger,addClass}) + +radio({name:'display state',class:'display-control',value:'short-display',hidden:''}) + .inline-fieldset__summary.display-target + label.pointer + +checkbox({name:'collapse',value:1,hidden:'',trigger:{triggeredFuncs:['collapseSection']}}) + +span({name:'name',class:'inline-fieldset__summary__text'}) + +radio({name:'display state',class:'display-control',value:'display',checked:'',hidden:''}) + .inline-fieldset__detail.display-target + +collapse + block + + +action({name:`add ${name}`,class:'repcontrol-button repcontrol-button--add repcontrol-button--inline',trigger:{listenerFunc:'sectionInteract'}}) + +action({name:`edit ${name}`,class:'repcontrol-button repcontrol-button--edit repcontrol-button--inline',trigger:{listenerFunc:'sectionInteract'}}) +//- End Mixin diff --git a/backbone/source/scaffold/helpers/_helpers.pug b/backbone/source/scaffold/helpers/_helpers.pug new file mode 100644 index 0000000000..81f9001250 --- /dev/null +++ b/backbone/source/scaffold/helpers/_helpers.pug @@ -0,0 +1,250 @@ +- let scriptUsed = false; +- + const varObjects = { + repeatingSectionDetails:[], + actionAttributes:[], + cascades:{ + attr_character_name:{ + name:'character_name', + type:'text', + defaultValue:'', + affects:[], + triggeredFuncs:['setActionCalls'], + listenerFunc:'accessSheet', + listener:'change:character_name'} + } + }; +- let repeatingPrefix = ''; +- let repeatsIgnoreSystemPrefix = false; +- let systemPrefix = ''; +- + let variables = ""; + variables += `arguments.callee -> ${arguments.callee}\n`; + //variables += `pug_debug_filename -> ${pug_debug_filename}\n`; + // variables += `pug -> ${pug}\n`; + // variables += `fs -> ${fs}\n`; + // throw new Error(variables); + +- + const checkKUse = () => { + if(scriptUsed){ + throw Error('kScript mixin already used. Kscript should be the final mixin used in the sheet code.'); + } + }; + + +- const getSystemPrefix = () => systemPrefix || ''; + +//- @pugdoc + name: SetSystemPrefix + description: Updates the systemPrefix K-scaffold global variable so that any attributes created after this point will be prepended with the prefix. By default attributes in repeating sections are not prepended; instead the repeating section name is prefixed. Returns the previous prefix. + arguments: + - {string} val - The value to set the prefix to. If not a string or falsy, will reset the prefix to an empty string. + - {boolean} [normalRepeating = true] - Whether the prefix should be applied to repeating section names (default), or to the attribute name itself in repeating sections. + attributes: + example: | + include _htmlelements.pug + // Non repeating attributes + setSystemPrefix('npc') + +number({name:'athletics',value:0}) + + // pass it a falsy value to unset it + setSystemPrefix(false) + +number({name:'athletics',value:0}) + + // Repeating attributes + setSystemPrefix('npc') + +fieldset({name:'skill'}) + +number({name:'score',value:0}) +- + const setSystemPrefix = (val,normalRepeating = false) => { + repeatsIgnoreSystemPrefix = normalRepeating; + const prevPrefix = systemPrefix; + systemPrefix = typeof val === 'string' ? val : ''; + return prevPrefix; + }; + +//- @pugdoc + name: attrTitle + description: Converts an attribute name into an attribute call for that attribute. Converts `_max` attribute names to the proper attribute call syntax for `_max` attributes (see second example). If called from inside the block of a {@link fieldset} mixin, will also add the appropriate information for calling a repeating attribute. + arguments: + - {string} attrName - The attribute name to create an attribute call for. + attributes: + example: | + include _htmlelements.pug + //Basic attribute name + +input({name:'hidden name',type:'text',title:attrTitle('user accessible name')}) + + //Max attribute name + +input({name:'hidden max',type:'number',title:attrTitle('user accessible max')}) + + //fieldset attrTitle + +fieldset({name:'equipment'}) + +input({name:'name',type:'text',title:attrTitle('user accessible name')}) +- const attrTitle = (string) => `@{${repeatingPrefix}${replaceSpaces(string).replace(/_max$/,'|max')}}`; + +- + const attrName = (string) => { + const sp = getSystemPrefix(); + let tempString = replaceSpaces(`${ + (repeatingPrefix && !repeatsIgnoreSystemPrefix) || !sp || /^character[\s_]name$/.test(string) ? + '' : + `${sp} ` + }${string}`); + if(sp){ + tempString = tempString + .replace(new RegExp(`${sp}[_-]${sp}`),sp); + } + return tempString; + }; + + +//- @pugdoc + name: buttonTitle + description: Converts an ability name into an ability call for that attribute. If called from inside the block of a {@link fieldset} mixin, will also add the appropriate information for calling a repeating attribute. + arguments: + - {string} abilityName - The ability name to create a call for. + attributes: + example: | + include _htmlelements.pug + //Basic button title + +button({name:'hidden button',type:'text',title:buttonTitle('user accessible name')}) + + //fieldset button title + +fieldset({name:'equipment'}) + +button({name:'button',type:'text',title:buttonTitle('user accessible name')}) +- const buttonTitle = (string) => `%{${repeatingPrefix}${replaceSpaces(string)}}`; + +//- @pugdoc + name: replaceSpaces + description: Replaces spaces in a string with underscores (`_`). + arguments: + - {string} string - The string to work on + attributes: +- const replaceSpaces = (string) => string.replace(/\s+/g,'_'); + +//- @pugdoc + name: replaceProblems + description: Escapes problem characters in a string for use as a regex. + arguments: + - {string} string - The string to work on + attributes: +- const replaceProblems = (string) => string.replace(/[\(\)\[\]\|\/\\]/g,'-'); + +//- @pugdoc + name: capitalize + description: Capitalizes the first let of words in a string. + arguments: + - {string} string - The string to work on + attributes: +- + const capitalize = (string)=> string.replace(/(?:^|\s+|\/)[a-z]/ig,(letter)=>letter.toUpperCase()); + +- const actionButtonName = (name) => `${name.replace(/_|\s+/g,'-')}`; +- const actionInputName = (name) => `${name}_action`.replace(/roll_action/,'action'); +- const titleToName = (string) => string.replace(/[@%]\{|\}/g,''); +- + const addIfUnique = (item,arrName) => { + varObjects[arrName] = varObjects[arrName] || []; + if(varObjects[arrName].indexOf(item) === -1){ + varObjects[arrName].push(item); + } + }; +- + const storeTrigger = function(element){ + let trigger = element.trigger || {}; + const namePrefix = { + roll:'roll_', + action:'act_', + fieldset:'fieldset_' + }; + const typeDefs = { + select:'', + radio:0, + checkbox:0, + number:0, + text:'', + span:'' + }; + const eventTypes = { + roll:'clicked', + action:'clicked', + fieldset:'remove' + }; + let elementName = element.title ? + titleToName(element.title) : + element.name; + trigger.name = elementName.replace(/\|/g,'_'); + let cascName = `${namePrefix[element.type] || 'attr_'}${trigger.name}`; + let match = trigger.name.match(/(repeating_[^_]+)_[^_]+_(.+)/); + let [,section,field] = match || [,,trigger.name]; + let eventType = eventTypes[element.type] || 'change'; + if(!varObjects.cascades[cascName]){ + if(trigger.listener || trigger.triggeredFuncs || trigger.listenerFunc || trigger.initialFunc || trigger.affects){ + trigger.listener = trigger.listener || `${eventType}:${section ? `${section}:` : ''}${field}`; + trigger.listenerFunc = trigger.listenerFunc || 'accessSheet'; + } + trigger.type = element.type; + if(!namePrefix[element.type]){ + trigger.defaultValue = trigger.hasOwnProperty('defaultValue') ? + trigger.defaultValue : + (element.type === 'checkbox' && !element.hasOwnProperty('checked')) ? + 0 : + element.hasOwnProperty('value') ? + element.value : + typeDefs.hasOwnProperty(element.type) ? + typeDefs[element.type] : + ''; + trigger.triggeredFuncs = trigger.triggeredFuncs || []; + if(trigger.affects){ + trigger.affects = trigger.affects.map((affect)=>{ + const attributeName = attrName(affect); + return replaceSpaces(attributeName) + }); + }else{ + trigger.affects = []; + } + } + varObjects.cascades[cascName] = {...trigger}; + }else{ + if(!namePrefix[varObjects.cascades[cascName].type]){ + varObjects.cascades[cascName].triggeredFuncs = trigger.triggeredFuncs ? + [...new Set([...varObjects.cascades[cascName].triggeredFuncs,...trigger.triggeredFuncs])] : + varObjects.cascades[cascName].triggeredFuncs; + varObjects.cascades[cascName].affects = trigger.affects ? + [...new Set([...varObjects.cascades[cascName].affects,...trigger.affects])] : + varObjects.cascades[cascName].affects; + varObjects.cascades[cascName].calculation = varObjects.cascades[cascName].calculation || + trigger.calculation; + } + if(trigger.listenerFunc || trigger.triggeredFuncs || trigger.affects){ + varObjects.cascades[cascName].listener = varObjects.cascades[cascName].listener || trigger.listener || `${eventType}:${section ? `${section}:` : ''}${field}`; + varObjects.cascades[cascName].listenerFunc = varObjects.cascades[cascName].listenerFunc || trigger.listenerFunc || 'accessSheet'; + } + } + }; +- + const getSectionDetails = function(section){ + return varObjects.repeatingSectionDetails.find((obj)=>obj.section === section); + }; +- + const createFieldsetObj = function(section){ + !getSectionDetails(section) ? + varObjects.repeatingSectionDetails.push({section,fields:[]}) : + null; + }; +- + const addFieldToFieldsetObj = function(obj){ + let section = repeatingPrefix.replace(/_[^_]+_$/,''); + let sectionDetails = getSectionDetails(section); + let name = obj.name.replace(/^attr_/,''); + if(sectionDetails && sectionDetails.fields.indexOf(name) < 0){ + sectionDetails.fields.push(name); + } + }; +- + const makeElementObj = function(obj){ + const newObj = {...obj}; + delete newObj.trigger; + return newObj; + }; \ No newline at end of file diff --git a/backbone/source/scaffold/index.js b/backbone/source/scaffold/index.js new file mode 100644 index 0000000000..daf876f524 --- /dev/null +++ b/backbone/source/scaffold/index.js @@ -0,0 +1,148 @@ +const path = require('path'); +const {pathToFileURL} = require('url'); +const fs = require('fs/promises'); +const jsdom = require('jsdom'); +const { JSDOM } = jsdom; + +const pug = require('pug'); +const sass = require('sass-embedded'); +// Object to hold the last edited times of each file to prevent extraneous renders + +const getTemplate = (filePath) => fs.readFile(filePath,'utf8') + .then(text => text.replace(/include k-scaffold/g,'include /node_modules/k-scaffold/_k.pug')); + +const outputPug = async (html,destination) => { + if(!destination) return; + const destDir = path.dirname(destination); + await fs.mkdir(destDir,{recursive:true}); + await fs.writeFile(destination,html); + console.log(`HTML written to ${destination}`); + const dom = new JSDOM(html); + const { window } = dom; + const { document } = window; + + const transArr = [...document.querySelectorAll('[data-i18n]')]; + const attrTransKeys = ['title','placeholder','label','aria-label','alt','list'] + const attrTransArr = attrTransKeys.reduce((memo,key) => [...new Set([ + ...memo, + ...document.querySelectorAll(`[data-i18n-${key}]`) + ])] ,[]); + const translations = transArr.reduce((memo,el)=>{ + memo[el.dataset.i18n] = el.textContent?.trim() || el.dataset.i18n; + return memo; + },{}); + const capitalizeI18n = string => string.replace(/(?:^|\s+|\/|-)[a-z]/ig,(letter)=>letter.toUpperCase()).replace(/-/g,''); + attrTransArr.forEach(el => { + attrTransKeys.forEach(key => { + if(el.dataset[`i18n${capitalizeI18n(key)}`]){ + translations[el.dataset[`i18n${capitalizeI18n(key)}`]] = el[key] || el.dataset[`i18n${capitalizeI18n(key)}`]; + } + }); + }); + if(translations){ + const transPath = path.resolve(path.dirname(destination),'translation.json'); + const currTranslation = await fs.readFile(transPath,'utf8') + .then(t => JSON.parse(t)) + .catch( e => {return {}}); + Object.entries(translations) + .forEach(([key,val]) => { + if(!currTranslation[key]){ + currTranslation[key] = val; + } + }); + await fs.writeFile(transPath,JSON.stringify(currTranslation,null,2)); + console.log(`${transPath} updated`); + } + +}; + +const renderPug = async ({source,destination,options={suppressStack:true}}) => { + const template = await getTemplate(source); + try{ + console.log('original source',source); + console.log('manipulated filename',source); + const html = pug.render(template,{pretty:true,...options,filename:source,basedir:path.dirname(process.argv[1])}) + await outputPug(html,destination); + return html; + }catch(err){ + if(err.message.endsWith('kScript mixin already used. Kscript should be the final mixin used in the sheet code.')){ + console.log('\x1b[31m%s\x1b[0m', + '================================\n==== K-scaffold PARSE ERROR ====\n================================'); + console.log('kScript mixin already used. Kscript should be the final mixin used in the sheet code.'); + }else{ + console.log('\x1b[31m%s\x1b[0m', + '=========================\n==== PUG PARSE ERROR ====\n========================='); + if(options.suppressStack){ + console.error(err.message) + }else{ + console.log('showing full err'); + console.error(err); + } + } + } +}; + +const renderSASS = async ({source,destination,options={}}) => { + const dirname = path.dirname(process.argv[1]); + const compileOptions = { + charset:false, + importers: [ + { + findFileUrl(url) { + if(!url.startsWith('k/')) return null; + const sub = url.substring(2); + const fileURL = pathToFileURL('node_modules/k-scaffold'); + const newURL = new URL(sub, pathToFileURL('node_modules/k-scaffold/')); + return newURL; + } + } + ] + }; + const currOptions = {...options}; + if(currOptions.importers){ + compileOptions.importers.push(...currOptions.importers); + delete currOptions.importers; + } + Object.assign(compileOptions,currOptions); + + const {css} = await sass.compileAsync(source,compileOptions); + if(destination){ + await fs.writeFile(destination,css); + console.log(`CSS written to ${destination}`); + } + + return css +}; + +const renderAll = async ({source ='./',destination,pugOptions={suppressStack:true},scssOptions={}}) => { + const sourceDir = path.dirname(source); + const destDir = path.dirname(destination); + const files = await fs.opendir(source); + const pugOutput = []; + const scssOutput = []; + for await (entry of files){ + if(entry.isFile()){ + const resSource = path.resolve(source,entry.name); + const resDest = destination ? + path.resolve(destination,entry.name.replace(/\.pug$/,'.html').replace(/\.scss$/,'.css')) : + undefined; + if(entry.name.endsWith('.scss')){ + console.log(`Processing ${entry.name}`); + const newSass = await renderSASS({source:resSource,destination:resDest,options:scssOptions}); + scssOutput.push(newSass); + } + if(entry.name.endsWith('.pug')){ + console.log(`Processing ${entry.name}`); + const newPug = await renderPug({source:resSource,destination:resDest,options:pugOptions}); + pugOutput.push(newPug); + } + } + } + return [pugOutput,scssOutput]; +}; + +module.exports = { + pug:renderPug, + scss:renderSASS, + all:renderAll +}; \ No newline at end of file diff --git a/backbone/source/scaffold/labels/_labels.pug b/backbone/source/scaffold/labels/_labels.pug new file mode 100644 index 0000000000..5ca1c4641b --- /dev/null +++ b/backbone/source/scaffold/labels/_labels.pug @@ -0,0 +1,192 @@ + +//- @pugdoc + name: button-label + description: A mixin to create a combined button and input that are within the same container. Similar to {@link input-label}, but does not use a label. + arguments: + - {object} inputObj - An object describing the input to be paired with the button. This is the same object that you would pass to {@link input}. + - {object} buttonObj - An object describing the button to be paired with the input. This is the same object that you would pass to {@link button}. + - {object} divObj - An object describing the container div. Similar to the first two objects, but will most likely only have a `class` property if it is passed at all. + attributes: + example: | + include _htmlelements.pug + +button-label({ + inputObj:{name:'strength',type:'number',class:'underlined',value:10,trigger:{affects:['athletics']}}, + buttonObj:{name:'strength_roll',type:'roll',value:'/r 1d20+@{strength}'}, + divObj:{class:'strength'} + }) +mixin button-label({inputObj,buttonObj,divObj}) + if divObj + - divObj.class = divObj.class ? replaceProblems(divObj.class) : undefined; + - inputObj.class = inputObj.class ? replaceProblems(inputObj.class) : undefined; + - buttonObj.class = buttonObj.class ? replaceProblems(buttonObj.class) : undefined; + - inputObj.name = inputObj.name.replace(/\s+/g,'_'); + - buttonObj.name = (buttonObj.name || inputObj.name).replace(/\s+/g,'_'); + .input-label.input-label--button&attributes(divObj) + - inputObj.class = inputObj.class ? `${inputObj.class} input-label__input` : 'input-label__input'; + if spanObj + - buttonObj.class = buttonObj.class ? `${buttonObj.class} input-label__text` : 'input-label__text'; + +button(buttonObj) + +input(inputObj) +//-End Mixin + + + + +//- @pugdoc + name: roller-label + description: Similar to the construction created by {@link button-label}, except that it creates a {@link roller} construction instead of just a straight button. + arguments: + - {object} inputObj - An object describing the input to be paired with the button. This is the same object that you would pass to {@link input}. + - {object} buttonObj - An object describing the button to be paired with the input. This is the same object that you would pass to {@link button}. + - {object} divObj - An object describing the container div. Similar to the first two objects, but will most likely only have a `class` property if it is passed at all. + attributes: + example: | + include _htmlelements.pug + +roller-label({ + inputObj:{name:'strength',type:'number',class:'underlined',value:10,trigger:{affects:['athletics']}}, + buttonObj:{name:'strength_roll',type:'roll',value:'/r 1d20+@{strength}'}, + divObj:{class:'strength'} + }) +mixin roller-label({inputObj,buttonObj,divObj}) + +rollerExtras(buttonObj) + +button-label({inputObj,buttonObj,divObj}) +//-End Mixin + + + + +//- @pugdoc + name: action-label + description: Similar to the construction created by {@link button-label}, except that it specifcally creates an [action button](https://wiki.roll20.net/Button#Action_Button) as per {@link action}. + arguments: + - {object} inputObj - An object describing the input to be paired with the button. This is the same object that you would pass to {@link input}. + - {object} buttonObj - An object describing the button to be paired with the input. This is the same object that you would pass to {@link button}. + - {object} divObj - An object describing the container div. Similar to the first two objects, but will most likely only have a `class` property if it is passed at all. + attributes: + example: | + include _htmlelements.pug + +roller-label({ + inputObj:{name:'strength',type:'number',class:'underlined',value:10,trigger:{affects:['athletics']}}, + buttonObj:{name:'strength_roll',type:'roll',value:'/r 1d20+@{strength}'}, + divObj:{class:'strength'} + }) +mixin action-label({inputObj,buttonObj,divObj}) + - buttonObj.type = 'action'; + +button-label(inputObj,buttonObj,divObj) +//-End Mixin + + + + +//- @pugdoc + name: select-label + description: Similar to the construction created by {@link input-label}, except that the input is replaced with a select. + arguments: + - {string} label - The translation key to use for the span. If not passed, then the spanObj must be passed with a translation key + - {object} inputObj - An object describing the select to be paired with the button. This is the same object that you would pass to {@link select}. + - {object} [divObj] - An object describing the container label. Similar to the inputObj, but will most likely only have a `class` property if it is passed at all. + - {object} [spanObj] - An object describing the span to be paired with the input. This is the same object that you would pass to {@link span}. + - {block} block - The mixin uses the pug block as the content of the select. + attributes: + example: | + include _htmlelements.pug + +select-label({ + label:'Whisper to GM', + inputObj:{name:'whisper'}, + divObj:{class:'div-class'}, + spanObj:{class:'span-class'} + }) + +option({value:'','data-i18n':'never',selected:''}) + +option({value:'/w gm ','data-i18n':'always'}) +mixin select-label({label,inputObj,divObj,spanObj}) + if divObj + - divObj.class = divObj.class ? replaceProblems(divObj.class) : undefined; + if inputObj + - inputObj.class = inputObj.class ? replaceProblems(inputObj.class) : undefined; + if spanObj + - spanObj.class = spanObj.class ? replaceProblems(spanObj.class) : undefined; + label.input-label&attributes(divObj) + - inputObj.name = inputObj.name.replace(/\s+/g,'_'); + - inputObj.class = inputObj.class ? `${inputObj.class} input-label__input` : 'input-label__input'; + if spanObj + - spanObj.class = spanObj.class ? `${spanObj.class} input-label__text` : 'input-label__text'; + span(data-i18n=label)&attributes(spanObj) + +select(inputObj) + block +//-End Mixin + + + + +//- @pugdoc + name: input-label + description: + arguments: + - {string} label - The translation key to use for the span. If not passed, then the spanObj must be passed with a translation key + - {object} inputObj - An object describing the input to be paired with the button. This is the same object that you would pass to {@link input}. + - {object} [divObj] - An object describing the container label. Similar to the inputObj, but will most likely only have a `class` property if it is passed at all. + - {object} [spanObj] - An object describing the span to be paired with the input. This is the same object that you would pass to {@link span}. + attributes: + example: | + include _htmlelements.pug + +input-label({ + label:'strength', + inputObj:{name:'strength',type:'number'}, + divObj:{class:'div-class'}, + spanObj:{class:'span-class'} + }) +mixin input-label({label,inputObj,divObj,spanObj}) + if divObj + - divObj.class = divObj.class ? replaceProblems(divObj.class) : undefined; + if inputObj + - inputObj.class = inputObj.class ? replaceProblems(inputObj.class) : undefined; + if spanObj + - spanObj.class = spanObj.class ? replaceProblems(spanObj.class) : undefined; + label.input-label&attributes(divObj) + - inputObj.name = inputObj.name.replace(/\s+/g,'_'); + - inputObj.class = inputObj.class ? `${inputObj.class} input-label__input` : 'input-label__input'; + if spanObj + - spanObj.class = spanObj.class ? `${spanObj.class} input-label__text` : 'input-label__text'; + span(data-i18n=label)&attributes(spanObj) + +input(inputObj) +//-End Mixin + + + + +mixin dual-input-label({label,inputArr,divObj,spanObj,separatorObj={content:'/'}}) + if divObj + - divObj.class = divObj.class ? replaceProblems(divObj.class) : undefined; + if spanObj + - spanObj.class = spanObj.class ? replaceProblems(spanObj.class) : undefined; + - const separator = separatorObj.content || ''; + - delete separatorObj.content; + .input-label.input-label--dual&attributes(divObj) + span(data-i18n=label)&attributes(spanObj) + each inputObj,i in inputArr + if inputObj + - inputObj.class = inputObj.class ? replaceProblems(inputObj.class) : undefined; + - inputObj.name = inputObj.name.replace(/\s+/g,'_'); + +input(inputObj) + if i<1 + | + span(class='slash h2')&attributes(separatorObj) #{separator} + +//- @pugdoc + name: headedTextarea + description: Creates a construction for pairing a header with a textarea. Currently is locked to creating an `h3`. This mixin also accepts classes and IDs appended directly to it (see the second example) + arguments: + - {object} textObj - The object describing the textarea as per {@link textarea} + - {string} header - The `data-i18n` translation key to use for the header + attributes: + example: | + include _htmlelements.pug + +headedTextarea({textObj:{name:'character description','data-i18n-placeholder':'The description of your character'},header:'description'}) + //With class appended to the mixin itself + +headedTextarea({textObj:{name:'character description','data-i18n-placeholder':'The description of your character'},header:'description'}).character-description +mixin headedTextarea({textObj,header}) + .headed-textarea&attributes(attributes) + - textObj.class = textObj.class ? `${textObj.class} headed-textarea__textarea` : 'headed-textarea__textarea'; + +h3({'data-i18n':header,class:'headed-textarea__header'}) + +textarea(textObj) +//-End Mixin \ No newline at end of file diff --git a/backbone/source/scaffold/rolltemplate/_rolltemplate.pug b/backbone/source/scaffold/rolltemplate/_rolltemplate.pug new file mode 100644 index 0000000000..35cdffa3bb --- /dev/null +++ b/backbone/source/scaffold/rolltemplate/_rolltemplate.pug @@ -0,0 +1,69 @@ +//-Roll Template Mixins to be included in Sheet files +mixin rolltemplate(name) + rolltemplate(class=`sheet-rolltemplate-${name}`) + block +//- End Mixin +mixin templateWrapper(name) + +rolltemplate(name) + div(class=`template ${name}`) + block +//- End Mixin +mixin multiPartTemplate(name) + rolltemplate(class=`sheet-rolltemplate-${name}`) + +templateHelperFunction({func:'rollBetween',values:'computed::finished 0 0',invert:true}) + span(class='finished') + div(class=`template ${name}{{#continuation}} continuation{{/continuation}}{{#first}} first{{/first}} finished`) + block +//- End Mixin +mixin characterLink + +templateConditionalDisplay('character_name') + +templateConditionalDisplay('character_id') + h4.character_name [{{character_name}}](http://journal.roll20.net/character/{{character_id}}) + +templateConditionalDisplay('character_id',true) + h4.character_name {{character_name}} +//-End mixin +mixin templateConditionalDisplay(fieldBool,invert) + !=`{{${invert ? '^' : '#'}${fieldBool}}}` + block + !=`{{/${fieldBool}}}` +//- End mixin +mixin templateHelperFunction(helperObj) + !=`{{${helperObj.invert ? '#^':'#'}${helperObj.func ? `${helperObj.func}() `:''}${helperObj.values ? `${helperObj.values}` : ''}}}` + block + !=`{{/${(helperObj.invert) ? '^' : ''}${helperObj.func ? `${helperObj.func}() `:''}${helperObj.values}}}` +//- End Mixin +mixin rollWasCrit(helperObj) + - helperObj.func = 'rollWasCrit'; + +templateHelperFunction(helperObj) + block +//- End Mixin +mixin rollWasFumble(helperObj) + - helperObj.func = 'rollWasFumble'; + +templateHelperFunction(helperObj) + block +//- End Mixin +mixin rollTotal(helperObj) + - helperObj.func = 'rollTotal'; + +templateHelperFunction(helperObj) + block +//- End Mixin +mixin rollGreater(helperObj) + - helperObj.func = 'rollGreater'; + +templateHelperFunction(helperObj) + block +//- End Mixin +mixin rollLess(helperObj) + - helperObj.func = 'rollLess'; + +templateHelperFunction(helperObj) + block +//- End Mixin +mixin rollBetween(helperObj) + - helperObj.func = 'rollBetween'; + +templateHelperFunction(helperObj) + block +//- End Mixin +mixin allProps(helperObj) + - helperObj.func = 'allprops'; + +templateHelperFunction(helperObj) + block +//- End Mixin \ No newline at end of file diff --git a/backbone/source/scaffold/scripts/_scripts.pug b/backbone/source/scaffold/scripts/_scripts.pug new file mode 100644 index 0000000000..d1d6489d34 --- /dev/null +++ b/backbone/source/scaffold/scripts/_scripts.pug @@ -0,0 +1,67 @@ +//- Functions +//- @pugdoc + name: script + description: Creates a generic [Roll20 script block](https://wiki.roll20.net/Building_Character_Sheets#JavaScript_2) for use with the sheetworker system. + arguments: + attributes: + example: | + include _htmlelements.pug + +script +mixin script + script(type='text/worker') + block +//-End Mixin + +mixin kscriptContents(testing) + |const k = (function(){ + |const kFuncs = {}; + //- The below declarations import variables from the pug file and mixins into the sheetworker code + - const propArray = ['cascades','repeatingSectionDetails']; + each prop in propArray + | + |const !{prop} = !{JSON.stringify(varObjects[prop])}; + | + |kFuncs.!{prop} = !{prop}; + - delete varObjects[prop]; + | + | + include kvariables.js + include utility.js + include attribute_proxy.js + include accessSheet.js + include parse_cascade.js + include sheetworker_aliases.js + include listeners.js + include ../tabs/tabs.js + | + |return kFuncs; + |}()); + | + each content,prop in varObjects + | + if typeof content === 'object' + |const !{prop} = !{JSON.stringify(content)}; + else + |let !{prop} = !{content}; + | + | + block + | + |k.registerEventHandlers(); + | + +//- @pugdoc + name: kscript + description: Similar to {@link script}, but includes the K-scaffold\'s javascript function library. + arguments: + attributes: + example: | + include _htmlelements.pug + +kscript + +mixin kscript + - scriptUsed = true; + +script + +kscriptContents + block +//- End Mixin \ No newline at end of file diff --git a/backbone/source/scaffold/scripts/accessSheet.js b/backbone/source/scaffold/scripts/accessSheet.js new file mode 100644 index 0000000000..cbc216a159 --- /dev/null +++ b/backbone/source/scaffold/scripts/accessSheet.js @@ -0,0 +1,61 @@ +/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/ +/*jshint -W014,-W084,-W030,-W033*/ +//Sheet Updaters and styling functions +const updateSheet = function(){ + log('updating sheet'); + getAllAttrs({props:['debug_mode',...baseGet],callback:(attributes,sections,casc)=>{ + kFuncs.debugMode = kFuncs.debugMode || !!attributes.debug_mode; + debug({sheet_version:attributes.sheet_version}); + if(!attributes.sheet_version){ + Object.entries(initialSetups).forEach(([funcName,handler])=>{ + if(typeof funcs[funcName] === 'function'){ + debug(`running ${funcName}`); + funcs[funcName]({attributes,sections,casc}); + }else{ + debug(`!!!Warning!!! no function named ${funcName} found. Initial sheet setup not performed.`); + } + }); + }else{ + Object.entries(updateHandlers).forEach(([ver,handler])=>{ + if(attributes.sheet_version < +ver){ + handler({attributes,sections,casc}); + } + }); + } + Object.entries(openHandlers).forEach(([funcName,func])=>{ + if(typeof funcs[funcName] === 'function'){ + debug(`running ${funcName}`); + funcs[funcName]({attributes,sections,casc}); + }else{ + debug(`!!!Warning!!! no function named ${funcName} found. Sheet open handling not performed.`); + } + }); + setActionCalls({attributes,sections}); + attributes.sheet_version = kFuncs.version; + log(`Sheet Update applied. Current Sheet Version ${kFuncs.version}`); + attributes.set(); + log('Sheet ready for use'); + }}); +}; + +const initialSetup = function(attributes,sections){ + debug('Initial sheet setup'); +}; + +/** + * This is the default listener function for attributes that the K-Scaffold uses. It utilizes the `triggerFuncs`, `listenerFunc`, `calculation`, and `affects` properties of the K-scaffold trigger object (see the Pug section of the scaffold for more details). + * @param {Roll20Event} event + * @returns {void} + * @example + * //Call from an attribute change + * on('change:an_attribute',k.accessSheet); + */ +const accessSheet = function(event){ + debug({funcs:Object.keys(funcs)}); + debug({event}); + getAllAttrs({callback:(attributes,sections,casc)=>{ + let trigger = attributes.getCascObj(event,casc); + attributes.processChange({event,trigger,attributes,sections,casc}); + }}); +}; +funcs.accessSheet = accessSheet; \ No newline at end of file diff --git a/backbone/source/scaffold/scripts/attribute_proxy.js b/backbone/source/scaffold/scripts/attribute_proxy.js new file mode 100644 index 0000000000..6ddba238d5 --- /dev/null +++ b/backbone/source/scaffold/scripts/attribute_proxy.js @@ -0,0 +1,247 @@ +/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/ +/*jshint -W014,-W084,-W030,-W033*/ +//# Attribute Obj Proxy handler +const createAttrProxy = function(attrs){ + //creates a proxy for the attributes object so that values can be worked with more easily. + const getCascObj = function(event,casc){ + const eventName = event.triggerName || event.sourceAttribute; + let typePrefix = eventName.startsWith('clicked:') ? + 'act_' : + event.removedInfo ? + 'fieldset_' : + 'attr_'; + let cascName = `${typePrefix}${eventName.replace(/(?:removed|clicked):/,'')}`; + let cascObj = casc[cascName]; + if(typePrefix === 'attr_'){ + cascObj.previousValue = event.previousValue; + } + return cascObj; + }; + + const triggerFunctions = function(obj,attributes,sections,casc){ + if(obj.triggeredFuncs && obj.triggeredFuncs.length){ + debug(`triggering functions for ${obj.name}`); + obj.triggeredFuncs && obj.triggeredFuncs.forEach(func=>funcs[func] ? + funcs[func]({trigger:obj,attributes,sections,casc}) : + debug(`!!!Warning!!! no function named ${func} found. Triggered function not called for ${obj.name}`,true)); + } + }; + + const initialFunction = function(obj,attributes,sections){ + if(obj.initialFunc){ + debug(`initial functions for ${obj.name}`); + funcs[obj.initialFunc] ? + funcs[obj.initialFunc]({trigger:obj,attributes,sections}) : + debug(`!!!Warning!!! no function named ${obj.initialFunc} found. Initial function not called for ${obj.name}`,true); + } + }; + const alwaysFunctions = function(trigger,attributes,sections,casc){ + Object.values(allHandlers).forEach((handler)=>{ + handler({trigger,attributes,sections,casc}); + }); + }; + const processChange = function({event,trigger,attributes,sections,casc}){ + if(event && !trigger){ + debug(`${event.sourceAttribute} change detected. No trigger found`); + return; + } + if(!attributes || !sections || !casc){ + debug(`!!! Insufficient arguments || attributes > ${!!attributes} | sections > ${!!sections} | casc > ${!!casc} !!!`); + return; + } + debug({trigger}); + if(event){ + debug('checking for initial & always functions'); + alwaysFunctions(trigger,attributes,sections,casc);//Functions that should be run for all events. + initialFunction(trigger,attributes,sections,casc);//functions that should only be run if the attribute was the thing changed by the user + } + if(trigger){ + debug(`processing ${trigger.name}`); + triggerFunctions(trigger,attributes,sections,casc); + if(!event && trigger.calculation && funcs[trigger.calculation]){ + attributes[trigger.name] = funcs[trigger.calculation]({trigger,attributes,sections,casc}); + }else if(trigger.calculation && !funcs[trigger.calculation]){ + debug(`K-Scaffold Error: No function named ${trigger.calculation} found`); + } + if(Array.isArray(trigger.affects)){ + attributes.queue.push(...trigger.affects); + } + } + attributes.set({attributes,sections,casc}); + }; + const attrTarget = { + updates:{}, + attributes:{...attrs}, + repOrders:{}, + queue: [], + casc:{}, + alwaysFunctions, + processChange, + triggerFunctions, + initialFunction, + getCascObj + }; + const attrHandler = { + get:function(obj,prop){//gets the most value of the attribute. + //If it is a repeating order, returns the array, otherwise returns the update value or the original value + if(prop === 'set'){ + return function(){ + let {attributes,sections,casc,callback,vocal} = arguments[0] ? arguments[0] : {}; + if(attributes && attributes.queue.length && sections && casc){ + let triggerName = attributes.queue.shift(); + let trigger = getCascObj({sourceAttribute:triggerName},casc); + attributes.processChange({trigger,attributes,sections,casc}); + }else{ + debug({updates:obj.updates}); + let trueCallback = Object.keys(obj.repOrders).length ? + function(){ + Object.entries(obj.repOrders).forEach(([section,order])=>{ + _setSectionOrder(section,order,) + }); + callback && callback(); + }: + callback; + Object.keys(obj.updates).forEach((key)=>obj.attributes[key] = obj.updates[key]); + const update = obj.updates; + obj.updates = {}; + set(update,vocal,trueCallback); + } + } + }else if(Object.keys(obj).some(key=>key===prop)){ + return Reflect.get(...arguments) + }else{ + let retValue; + switch(true){ + case obj.repOrders.hasOwnProperty(prop): + retValue = obj.repOrders[prop]; + break; + case obj.updates.hasOwnProperty(prop): + retValue = obj.updates[prop]; + break; + default: + retValue = obj.attributes[prop]; + break; + } + let cascRef = `attr_${prop.replace(/(repeating_[^_]+_)[^_]+/,'$1\$X')}`; + let numRetVal = +retValue; + if(!Number.isNaN(numRetVal) && retValue !== ''){ + retValue = numRetVal; + }else if(cascades[cascRef] && (typeof cascades[cascRef].defaultValue === 'number' || cascades[cascRef].type === 'number')){ + retValue = cascades[cascRef].defaultValue; + } + return retValue; + } + }, + set:function(obj,prop,value){ + //Sets the value. Also verifies that the value is a valid attribute value + //e.g. not undefined, null, or NaN + if(value || value===0 || value===''){ + if(/reporder|^repeating_[^_]+$/.test(prop)){ + let section = prop.replace(/_reporder_/,''); + obj.repOrders[section] = value; + }else if(`${obj.attributes}` !== `${value}` || + (obj.updates[prop] && `${obj.updates}` !== `${value}`) + ){ + obj.updates[prop] = value; + } + }else{ + debug(`!!!Warning: Attempted to set ${prop} to an invalid value:${value}; value not stored!!!`); + } + return true; + }, + deleteProperty(obj,prop){ + //removes the property from the original attributes, updates, and the reporders + Object.keys(obj).forEach((key)=>{ + delete obj[key][prop.toLowerCase()]; + }); + } + }; + return new Proxy(attrTarget,attrHandler); +}; + + +/** + * Function that registers a function for being called via the funcs object. Returns true if the function was successfully registered, and false if it could not be registered for any reason. + * @param {object} funcObj - Object with keys that are names to register functions under and values that are functions. + * @param {object} optionsObj - Object that contains options to use for this registration. + * @param {string[]} optionsObj.type - Array that contains the types of specialized functions that apply to the functions being registered. Valid types are `"opener"`, `"updater"`, and `"default"`. `"default"` is always used, and never needs to be passed. + * @returns {boolean} - True if the registration succeeded, false if it failed. + * @example + * //Basic Registration + * const myFunc = function({trigger,attributes,sections,casc}){}; + * k.registerFuncs({myFunc}); + * + * //Register a function to run on sheet open + * const openFunc = function({trigger,attributes,sections,casc}){}; + * k.registerFuncs({openFunc},{type:['opener']}) + * + * //Register a function to run on all events + * const allFunc = function({trigger,attributes,sections,casc}){}; + * k.registerFuncs({allFunc},{type:['all']}) + */ +const registerFuncs = function(funcObj,optionsObj = {}){ + if(typeof funcObj !== 'object' || typeof optionsObj !== 'object'){ + debug(`!!!! K-scaffold error: Improper arguments to register functions !!!!`); + return false; + } + const typeArr = optionsObj.type ? ['default',...optionsObj.type] : ['default']; + const typeSwitch = { + 'opener':openHandlers, + 'updater':updateHandlers, + 'new':initialSetups, + 'all':allHandlers, + 'default':funcs + }; + let setState; + Object.entries(funcObj).map(([prop,value])=>{ + typeArr.forEach((type)=>{ + if(typeSwitch[type][prop]){ + debug(`!!! Duplicate function name for ${prop} as ${type}!!!`); + setState = false; + }else if(typeof value === 'function'){ + typeSwitch[type][prop] = value; + setState = setState !== false ? true : false; + }else{ + debug(`!!! K-scaffold error: Function registration requires a function. Invalid value to register as ${type} !!!`); + setState = false; + } + }); + }); + return setState; +}; +kFuncs.registerFuncs = registerFuncs; + +const setActionCalls = function({attributes,sections}){ + actionAttributes.forEach((base)=>{ + let [section,,field] = k.parseTriggerName(base); + let fieldAction = field.replace(/_/g,'-'); + if(section){ + sections[section].forEach((id)=>{ + attributes[`${section}_${id}_${field}`] = `%{${attributes.character_name}|${section}_${id}_${fieldAction}}`; + }); + }else{ + attributes[`${field}`] = `%{${attributes.character_name}|${fieldAction}}`; + } + }); +}; +funcs.setActionCalls = setActionCalls; + +/** + * Function to call a function previously registered to the funcs object. May not be used that much. Either returns the function or null if no function exists. + * @param {string} funcName - The name of the function to invoke. + * @param {...any} args - The arguments to call the function with. + * @returns {any} + * @example + * //Call myFunc with two arguments + * k.callFunc('myFunc','an argument','another argument'); + */ +const callFunc = function(funcName,...args){ + if(funcs[funcName]){ + debug(`calling ${funcName}`); + return funcs[funcName](...args); + }else{ + debug(`Invalid function name: ${funcName}`); + return null; + } +}; +kFuncs.callFunc = callFunc; \ No newline at end of file diff --git a/backbone/source/scaffold/scripts/kvariables.js b/backbone/source/scaffold/scripts/kvariables.js new file mode 100644 index 0000000000..40faa8cfdd --- /dev/null +++ b/backbone/source/scaffold/scripts/kvariables.js @@ -0,0 +1,31 @@ +/** + * This stores the name of your sheet for use in the logging functions {@link log} and {@link debug}. Accessible by `k.sheetName` + * @var + * @type {string} + */ +let sheetName = 'kScaffold Powered Sheet'; +kFuncs.sheetName = sheetName; +/** + * This stores the version of your sheet for use in the logging functions{@link log} and {@link debug}. It is also stored in the sheet_version attribute on your character sheet. Accessible via `k.version` + * @var + * @type {number} + */ +let version = 0; +kFuncs.version = version; +/** + * A boolean flag that tells the script whether to enable or disable {@link debug} calls. If the version of the sheet is `0`, or an attribute named `debug_mode` is found on opening this is set to true for your entire session. Otherwise, it remains false. + * @var + * @type {boolean} + */ +let debugMode = false; +kFuncs.debugMode = debugMode; +const funcs = {}; +kFuncs.funcs = funcs; +const updateHandlers = {}; +const openHandlers = {}; +const initialSetups = {}; +const allHandlers = {}; +const addFuncs = {}; + +const kscaffoldJSVersion = '0.0.4'; +const kscaffoldPUGVersion = '0.0.4'; diff --git a/backbone/source/scaffold/scripts/listeners.js b/backbone/source/scaffold/scripts/listeners.js new file mode 100644 index 0000000000..6eb1871b50 --- /dev/null +++ b/backbone/source/scaffold/scripts/listeners.js @@ -0,0 +1,59 @@ +/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/ +/*jshint -W014,-W084,-W030,-W033*/ +const listeners = {}; +const baseGet = Object.entries(cascades).reduce((memo,[attrName,detailObj])=>{ + if(!/repeating/.test(attrName) && detailObj.type !== 'action'){ + memo.push(detailObj.name); + } + if(detailObj.listener){ + listeners[detailObj.listener] = detailObj.listenerFunc; + } + return memo; +},[]); +kFuncs.baseGet = baseGet; +const registerEventHandlers = function(){ + on('sheet:opened',updateSheet); + debug({funcKeys:Object.keys(funcs),funcs}); + //Roll20 change and click listeners + Object.entries(listeners).forEach(([event,funcName])=>{ + if(funcs[funcName]){ + on(event,funcs[funcName]); + }else{ + debug(`!!!Warning!!! no function named ${funcName} found. No listener created for ${event}`,true); + } + }); + log(`kScaffold Loaded`); +}; +kFuncs.registerEventHandlers = registerEventHandlers; + +const addItem = function(event){ + let [,,section] = parseClickTrigger(event.triggerName); + section = section.replace(/add-/,''); + getAllAttrs({ + callback:(attributes,sections,casc) => { + let row = _generateRowID(section,sections); + debug({row}); + attributes[`${row}_name`] = ''; + setActionCalls({attributes,sections}); + const trigger = cascades[`fieldset_repeating_${section}`]; + if(trigger && trigger.addFuncs){ + trigger.addFuncs.forEach((funcName) => { + if(funcs[funcName]){ + funcs[funcName]({attributes,sections,casc,trigger,newRow:row}); + } + }); + } + attributes.set({attributes,sections,casc}); + } + }); +}; +funcs.addItem = addItem; + +const editSection = function(event){ + let [,,section] = parseClickTrigger(event.triggerName); + section = section.replace(/edit-/,''); + let target = `fieldset.repeating_${section} + .repcontainer`; + $20(target).toggleClass('ui-sortable'); + $20(target).toggleClass('editmode'); +}; +registerFuncs({editSection}); \ No newline at end of file diff --git a/backbone/source/scaffold/scripts/mock20.js b/backbone/source/scaffold/scripts/mock20.js new file mode 100644 index 0000000000..9f437cebc9 --- /dev/null +++ b/backbone/source/scaffold/scripts/mock20.js @@ -0,0 +1,224 @@ +// This code adapted from Nic Bradley's R20 test framework from the WFRP4e official sheet. +const _ = require('underscore'); +const environment = { + attributes: {}, + triggers: [], +}; +global.environment = environment; +const on = jest.fn((trigger, func) => { + environment.triggers.push({ trigger, func }); +}); +global.on = on; +const getAttrs = jest.fn((query, callback) => { + let values = {}; + for (const attr of query) { + if (attr in environment.attributes) values[attr] = environment.attributes[attr]; + } + if (typeof callback === "function") callback(values); +}); +global.getAttrs = getAttrs; +const setAttrs = jest.fn((submit, params, callback) => { + if (!callback && typeof params === "function") callback = params; + for (const attr in submit) { + environment.attributes[attr] = submit[attr]; + } + if (typeof callback === "function") callback(); +}); +global.setAttrs = setAttrs; +const getSectionIDs = jest.fn((section, callback) => { + const ids = []; + const sectionName = section.indexOf("repeating_") === 0 ? section : `repeating_${section}`; + const attributes = environment.attributes; + for (const attr in attributes) { + if (attr.indexOf(sectionName) === 0) ids.push(attr.split("_")[2]); + } + const idMap = [...new Set(ids)]; + if (typeof callback === "function") callback(idMap); +}); +global.getSectionIDs = getSectionIDs; +const getSectionIDsSync = jest.fn((section) => { + const ids = []; + const sectionName = section.indexOf("repeating_") === 0 ? section : `repeating_${section}`; + const attributes = environment.attributes; + for (const attr in attributes) { + if (attr.indexOf(sectionName) === 0) ids.push(attr.split("_")[2]); + } + const idMap = [...new Set(ids)]; + return idMap; +}); +global.getSectionIDsSync = getSectionIDsSync; +const removeRepeatingRow = jest.fn((id) => { + const attributes = environment.attributes; + for (const attr in attributes) { + if (attr.indexOf(id) > -1) delete environment.attributes[attr]; + } +}); +global.removeRepeatingRow = removeRepeatingRow; +const getCompendiumPage = jest.fn((request, callback) => { + const pages = compendiumData; + if (!pages) + throw new Error( + "Tried to use getCompendiumPage, but testing environment does not contain compendiumData." + ); + if (typeof request === "string") { + const [category, pageName] = request.split(":"); + const response = { + Name: pageName, + Category: category, + data: {}, + }; + if (pages[request]) response.data = pages[request].data; + if (typeof callback === "function") callback(response); + } else if (Array.isArray(request)) { + const pageArray = []; + for (const page of request) { + if (pages[request] && pages[request].Category === category) pageArray.push(pages[pageName]); + } + if (typeof callback === "function") callback(pageArray); + } +}); +global.getCompendiumPage = getCompendiumPage; +const generateUUID = jest.fn(() => { + var a = 0, + b = []; + return (function () { + var c = new Date().getTime() + 0, + d = c === a; + a = c; + for (var e = Array(8), f = 7; 0 <= f; f--) + (e[f] = "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz".charAt(c % 64)), + (c = Math.floor(c / 64)); + c = e.join(""); + if (d) { + for (f = 11; 0 <= f && 63 === b[f]; f--) b[f] = 0; + b[f]++; + } else for (f = 0; 12 > f; f++) b[f] = Math.floor(64 * Math.random()); + for (f = 0; 12 > f; f++) + c += "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz".charAt(b[f]); + return c.replace(/_/g, "z"); + })(); +}); +global.generateUUID = generateUUID; +const generateRowID = jest.fn(() => { + return generateUUID().replace(/_/g, "Z"); +}); +global.generateRowID = generateRowID; +const simulateEvent = jest.fn((event) => { + environment.triggers.forEach((trigger) => { + const splitTriggers = trigger.trigger.split(" ") || [trigger.trigger]; + splitTriggers.forEach((singleTrigger) => { + if (event === singleTrigger) { + trigger.func({ + sourceAttribute: "test", + }); + } + }); + }); +}); +global.simulateEvent = simulateEvent; +const getTranslationByKey = jest.fn((key) => key); +global.getTranslationByKey = getTranslationByKey; +// Roll Handlingglobal.getTranslationByKey = getTranslationByKey; + +const extractRollTemplate = (rollString) => { + const rollTemplate = rollString.match(/&\{template:(.*?)\}/)?.[1]; + environment.attributes.__rolltemplate = rollTemplate; +}; + +const cleanRollElements = (value) => value.replace(/(\{\{|\}})/gi, "").split("="); + +const extractRollElements = (rollString) => { + const rollElements = rollString.match(/\{\{(.*?)\}{2,}/g); + if (!rollElements || rollElements.length < 1) throw new Error("No roll elements provided in roll string"); + return Object.fromEntries(rollElements.map(cleanRollElements)); +}; + +const getExpression = (element) => element.replace(/(\[\[|\]\])/gi, ""); + +const getDiceOrHalf = (size) => { + const diceStack = environment.diceStack; + if (!diceStack?.[size] || diceStack[size].length < 0) return size / 2; + return environment.diceStack[size].pop(); +}; + +const getDiceRolls = (expression) => { + const rolls = expression.match(/([0-9]+)?d([0-9]+)/gi); + if (!rolls) return []; + const allRolls = []; + rolls.forEach((roll) => { + const [number, size] = roll.split(/d/i); + for (let i = 1; i <= number; i++) { + const dice = getDiceOrHalf(size); + allRolls.push(dice); + } + }); + return allRolls; +}; + +const calculateResult = (expression, dice) => { + const rolls = expression.match(/([0-9]+)?d([0-9]+)/gi); + if (!rolls) return eval(expression); + rolls.forEach((roll, index) => { + const [number, size] = roll.split(/d/i); + let total = 0; + for (let i = 1; i <= number; i++) { + total += +dice.shift(); + } + expression = expression.replace(/([0-9]+d[0-9]+([+\-*/][0-9]+)?)(.*?)$/gi, "$1"); + const regex = new RegExp(roll, "gi"); + expression = expression.replace(regex, total); + }); + + return eval(expression); +}; + +const replaceAttributes = (element) => { + const test = /@\{(.*?)\}/i; + while (test.test(element)) { + element = element.replace(/@\{(.*?)\}/gi, (sub, ...args) => { + const attributeName = args[0]; + const attributeValue = environment.attributes[attributeName]; + const attributeExists = typeof attributeValue !== "undefined"; + const possibleAttributes = Object.keys(environment.attributes); + if (attributeExists) return attributeValue; + else + throw new Error( + `Roll called ${sub} but no corresponding attribute "${attributeName}" was found. Attributes are: ${possibleAttributes.join( + ", " + )}` + ); + }); + } + return element; +}; + +const calculateRollResult = (rollElements) => { + const results = {}; + for (const key in rollElements) { + const element = rollElements[key]; + if (element.indexOf("[[") === -1) continue; + const attributeFilled = replaceAttributes(element); + const expression = getExpression(attributeFilled); + const dice = getDiceRolls(expression); + const result = calculateResult(expression, [...dice]); + results[key] = { + result, + dice, + expression, + }; + } + return results; +}; + +const startRoll = jest.fn(async (rollString) => { + if (!rollString) throw new Error("startRoll expected a Roll String but none was provided."); + const rollResult = { results: {} }; + extractRollTemplate(rollString); + const rollElements = extractRollElements(rollString); + rollResult.results = calculateRollResult(rollElements); + rollResult.rollId = generateUUID(); + return rollResult; +}); +global.startRoll = startRoll; +const finishRoll = jest.fn(() => {}); +global.finishRoll = finishRoll; \ No newline at end of file diff --git a/backbone/source/scaffold/scripts/mockScaffold.js b/backbone/source/scaffold/scripts/mockScaffold.js new file mode 100644 index 0000000000..d0464de394 --- /dev/null +++ b/backbone/source/scaffold/scripts/mockScaffold.js @@ -0,0 +1,4 @@ +console.debug = jest.fn(a => null); +console.log = jest.fn(a => null); +console.table = jest.fn(a => null); +module.exports = {k,...global}; \ No newline at end of file diff --git a/backbone/source/scaffold/scripts/parse_cascade.js b/backbone/source/scaffold/scripts/parse_cascade.js new file mode 100644 index 0000000000..463acb711e --- /dev/null +++ b/backbone/source/scaffold/scripts/parse_cascade.js @@ -0,0 +1,62 @@ +/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/ +/*jshint -W014,-W084,-W030,-W033*/ +/* +Cascade Expansion functions +*/ +//Expands the repeating section templates in cascades to reflect the rows actually available +const expandCascade = function(cascade,sections,attributes){ + return _.keys(cascade).reduce((memo,key)=>{//iterate through cascades and replace references to repeating attributes with correct row ids. + if(/^(?:act|attr)_repeating_/.test(key)){//If the attribute is a repeating attribute, do special logic + expandRepeating(memo,key,cascade,sections,attributes); + }else if(key){//for non repeating attributes do this logic + expandNormal(memo,key,cascade,sections); + } + return memo; + },{}); +}; + +const expandRepeating = function(memo,key,cascade,sections,attributes){ + key.replace(/((?:attr|act)_)(repeating_[^_]+)_[^_]+?_(.+)/,(match,type,section,field)=>{ + (sections[section]||[]).forEach((id)=>{ + memo[`${type}${section}_${id}_${field}`]=_.clone(cascade[key]);//clone the details so that each row's attributes have correct ids + memo[`${type}${section}_${id}_${field}`].name = `${section}_${id}_${field}`; + if(key.startsWith('attr_')){ + memo[`${type}${section}_${id}_${field}`].affects = memo[`${type}${section}_${id}_${field}`].affects.reduce((m,affected)=>{ + if(section === affected){//otherwise if the affected attribute is in the same section, simply set the affected attribute to have the same row id. + m.push(applyID(affected,id)); + }else if(/repeating/.test(affected)){//If the affected attribute isn't in the same repeating section but is still a repeating attribute, add all the rows of that section + addAllRows(affected,m,sections); + }else{//otherwise the affected attribute is a non repeating attribute. Simply add it to the computed affected array + m.push(affected); + } + return m; + },[]); + } + }); + }); +}; + +const applyID = function(affected,id){ + return affected.replace(/(repeating_[^_]+_)[^_]+(.+)/,`$1${id}$2`); +}; + +const expandNormal = function(memo,key,cascade,sections){ + memo[key] = _.clone(cascade[key]); + if(key.startsWith('attr_')){ + memo[key].affects = memo[key].affects || []; + memo[key].affects = memo[key].affects.reduce((m,a)=>{ + if(/^repeating/.test(a)){ + addAllRows(a,m,sections); + }else{ + m.push(a); + } + return m; + },[]); + } +}; + +const addAllRows = function(affected,memo,sections){ + affected.replace(/(repeating_[^_]+?)_[^_]+?_(.+)/,(match,section,field)=>{ + sections[section].forEach(id=>memo.push(`${section}_${id}_${field}`)); + }); +}; \ No newline at end of file diff --git a/backbone/source/scaffold/scripts/sheetworker_aliases.js b/backbone/source/scaffold/scripts/sheetworker_aliases.js new file mode 100644 index 0000000000..2531af7c31 --- /dev/null +++ b/backbone/source/scaffold/scripts/sheetworker_aliases.js @@ -0,0 +1,206 @@ +/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/ +/*jshint -W014,-W084,-W030,-W033*/ +/** + * Alias for [setSectionOrder()](https://wiki.roll20.net/Sheet_Worker_Scripts#setSectionOrder.28.3CRepeating_Section_Name.3E.2C_.3CSection_Array.3E.2C_.3CCallback.3E.29) that allows you to use the section name in either `repeating_section` or `section` formats. Note that the Roll20 sheetworker [setSectionOrder](https://wiki.roll20.net/Sheet_Worker_Scripts#setSectionOrder.28.3CRepeating_Section_Name.3E.2C_.3CSection_Array.3E.2C_.3CCallback.3E.29) currently causes some display issues on sheets. + * @param {string} section + * @param {string[]} order + * @returns {void} + * @example + * //Set the order of a repeating_weapon section + * k.setSectionOrder('repeating_equipment',['id1','id2','id3']); + * //Can also specify the section name without the repeating_ prefix + * k.setSectionOrder('equipment',['id1','id2','id3']); + */ +const _setSectionOrder = function(section,order){ + let trueSection = section.replace(/repeating_/,''); + setSectionOrder(trueSection,order); +}; +kFuncs.setSectionOrder = _setSectionOrder; + +/** + * Alias for [removeRepeatingRow](https://wiki.roll20.net/Sheet_Worker_Scripts#removeRepeatingRow.28_RowID_.29) that also removes the row from the current object of attribute values and array of section IDs to ensure that erroneous updates are not issued. + * @param {string} row - The row id to be removed + * @param {attributesProxy} attributes - The attribute values currently in memory + * @param {object} sections - Object that contains arrays of all the IDs in sections on the sheet indexed by repeating name. + * @returns {void} + * @example + * //Remove a repeating Row + * k.getAllAttrs({ + * callback:(attributes,sections)=>{ + * const rowID = sections.repeating_equipment[0]; + * k.removeRepeatingRow(`repeating_equipment_${rowID}`,attributes,sections); + * console.log(sections.repeating_equipment); // => rowID no longer exists in the array. + * console.log(attributes[`repeating_equipment_${rowID}_name`]); // => undefined + * } + * }) + */ +const _removeRepeatingRow = function(row,attributes,sections){ + debug(`removing ${row}`); + Object.keys(attributes.attributes).forEach((key)=>{ + if(key.startsWith(row)){ + delete attributes[key]; + } + }); + let [,section,rowID] = row.match(/(repeating_[^_]+)_(.+)/,''); + sections[section] = sections[section].filter((id)=>id!==rowID); + removeRepeatingRow(row); +}; +kFuncs.removeRepeatingRow = _removeRepeatingRow; + +/** + * Alias for [getAttrs()](https://wiki.roll20.net/Sheet_Worker_Scripts#getAttrs.28attributeNameArray.2C_callback.29) that converts the default object of attribute values into an {@link attributesProxy} and passes that back to the callback function. + * @param {Object} args + * @param {string[]} [args.props=baseGet] - Array of attribute names to get the value of. Defaults to {@link baseGet} if not passed. + * @param {function(attributesProxy)} args.callback - The function to call after the attribute values have been gotten. An {@link attributesProxy} is passed to the callback. + * @example + * //Gets the attributes named in props. + * k.getAttrs({ + * props:['attribute_1','attribute_2'], + * callback:(attributes)=>{ + * //Work with the attributes as you would in a normal getAttrs, or use the superpowers of the K-scaffold attributes object like so: + * attributes.attribute_1 = 'new value'; + * attributes.set(); + * } + * }) + */ +const _getAttrs = function({props=baseGet,callback}){ + getAttrs(props,(values)=>{ + const attributes = createAttrProxy(values); + callback(attributes); + }); +}; +kFuncs.getAttrs = _getAttrs; + +/** + * Alias for [getAttrs()](https://wiki.roll20.net/Sheet_Worker_Scripts#getAttrs.28attributeNameArray.2C_callback.29) and [getSectionIDs](https://wiki.roll20.net/Sheet_Worker_Scripts#getSectionIDs.28section_name.2Ccallback.29) that combines the actions of both sheetworker functions and converts the default object of attribute values into an {@link attributesProxy}. Also gets the details on how to handle all attributes from the master {@link cascades} object and. + * @param {Object} args + * @param {string[]} [args.props=baseGet] - Array of attribute names to get the value of. Defaults to {@link baseGet} if not passed. + * @param {repeatingSectionDetails} sectionDetails - Array of details about a section to get the IDs for and attributes that need to be gotten. + * @param {function(attributesProxy,sectionObj,expandedCascade):void} args.callback - The function to call after the attribute values have been gotten. An {@link attributesProxy} is passed to the callback along with a {@link sectionObj} and {@link expandedCascade}. + * @example + * //Get every K-scaffold linked attribute on the sheet + * k.getAllAttrs({ + * callback:(attributes,sections,casc)=>{ + * //Work with the attributes as you please. + * attributes.some_attribute = 'a value'; + * attributes.set();//Apply our change + * } + * }) + */ +const getAllAttrs = function({props=baseGet,sectionDetails=repeatingSectionDetails,callback}){ + getSections(sectionDetails,(repeats,sections)=>{ + getAttrs([...props,...repeats],(values)=>{ + const attributes = createAttrProxy(values); + orderSections(attributes,sections); + const casc = expandCascade(cascades,sections,attributes); + callback(attributes,sections,casc); + }) + }); +}; +kFuncs.getAllAttrs = getAllAttrs; + +/** + * Alias for [getSectionIDs()](https://wiki.roll20.net/Sheet_Worker_Scripts#getSectionIDs.28section_name.2Ccallback.29) that allows you to iterate through several functions at once. Also assembles an array of repeating attributes to get. + * @param {object[]} sectionDetails - Array of details about a section to get the IDs for and attributes that need to be gotten. + * @param {string} sectionDetails.section - The full name of the repeating section including the `repeating_` prefix. + * @param {string[]} sectionDetails.fields - Array of field names that need to be gotten from the repeating section + * @param {function(string[],sectionObj)} callback - The function to call once all IDs have been gotten and the array of repating attributes to get has been assembled. The callback is passed the array of repating attributes to get and a {@link sectionObj}. + * @example + * // Get some section details + * const sectionDetails = { + * {section:'repeating_equipment',fields:['name','weight','cost']}, + * {section:'repeating_weapon',fields:['name','attack','damage']} + * }; + * k.getSections(sectionDetails,(attributeNames,sections)=>{ + * console.log(attributeNames);// => Array containing all row specific attribute names + * console.log(sections);// => Object with arrays containing the row ids. Indexed by section name (e.g. repeating_eqiupment) + * }) + */ +const getSections = function(sectionDetails,callback){ + let queueClone = _.clone(sectionDetails); + const worker = (queue,repeatAttrs=[],sections={})=>{ + let detail = queue.shift(); + getSectionIDs(detail.section,(IDs)=>{ + sections[detail.section] = IDs; + IDs.forEach((id)=>{ + detail.fields.forEach((f)=>{ + repeatAttrs.push(`${detail.section}_${id}_${f}`); + }); + }); + repeatAttrs.push(`_reporder_${detail.section}`); + if(queue.length){ + worker(queue,repeatAttrs,sections); + }else{ + callback(repeatAttrs,sections); + } + }); + }; + if(!queueClone[0]){ + callback([],{}); + }else{ + worker(queueClone); + } +}; +kFuncs.getSections = getSections; + +// Sets the attributes while always calling with {silent:true} +// Can be awaited to get the values returned from _setAttrs +/** + * Alias for [setAttrs()](https://wiki.roll20.net/Sheet_Worker_Scripts#setAttrs.28values.2Coptions.2Ccallback.29) that sets silently by default. + * @param {object} obj - The object containting attributes to set + * @param {boolean} [vocal=false] - Whether to set silently (default value) or not. + * @param {function()} [callback] - The callback function to invoke after the setting has been completed. No arguments are passed to the callback function. + * @example + * //Set some attributes silently + * k.setAttrs({attribute_1:'new value'}) + * //Set some attributes and triggers listeners + * k.setAttrs({attribute_1:'new value',true}) + * //Set some attributes and call a callback function + * k.setAttrs({attribute_1:'new value'},null,()=>{ + * //Do something after the attribute is set + * }) + */ +const set = function(obj,vocal=false,callback){ + setAttrs(obj,{silent:!vocal},callback); +}; +kFuncs.setAttrs = set; + +const generateCustomID = function(string){ + if(!string.startsWith('-')){ + string = `-${string}`; + } + rowID = generateRowID(); + let re = new RegExp(`^.{${string.length}}`); + return `${string}${rowID.replace(re,'')}`; +}; + + +/** + * Alias for generateRowID that adds the new id to the {@link sectionObj}. Also allows for creation of custom IDs that conform to the section ID requirements. + * @param {sectionObj} sections + * @param {string} [customText] - Custom text to start the ID with. This text should not be longer than the standard repeating section ID format. + * @returns {string} - The created ID + * @example + * k.getAllAttrs({ + * callback:(attributes,sections,casc)=>{ + * //Create a new row ID + * const rowID = k.generateRowID('repeating_equipment',sections); + * console.log(rowID);// => -p8rg908ug0suzz + * //Create a custom row ID + * const customID = k.generateRowID('repeating_equipment',sections,'custom'); + * console.log(customID);// => -custom98uadj89kj + * } + * }); + */ +const _generateRowID = function(section,sections,customText){ + let rowID = customText ? + generateCustomID(customText) : + generateRowID(); + section = section.match(/^repeating_[^_]+$/) ? + section : + `repeating_${section}`; + sections[section] = sections[section] || []; + sections[section].push(rowID); + return `${section}_${rowID}`; +}; +kFuncs.generateRowID = _generateRowID; \ No newline at end of file diff --git a/backbone/source/scaffold/scripts/utility.js b/backbone/source/scaffold/scripts/utility.js new file mode 100644 index 0000000000..0f191111ec --- /dev/null +++ b/backbone/source/scaffold/scripts/utility.js @@ -0,0 +1,237 @@ +/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/ +/*jshint -W014,-W084,-W030,-W033*/ +/** + * Replaces problem characters to use a string as a regex + * @param {string} text - The text to replace characters in + * @returns {string} + * @example + * const textForRegex = k.sanitizeForRegex('.some thing[with characters]'); + * console.log(textForRegex);// => "\.some thing\[with characters\]" + */ +const sanitizeForRegex = function(text){ + return text.replace(/\.|\||\(|\)|\[|\]|\-|\+|\?|\/|\{|\}|\^|\$|\*/g,'\\$&'); +}; +kFuncs.sanitizeForRegex = sanitizeForRegex; + +/** + * Converts a value to a number, it\'s default value, or `0` if no default value passed. + * @param {string|number} val - Value to convert to a number + * @param {number} def - The default value, uses 0 if not passed + * @returns {number|undefined} + * @example + * const num = k.value('100'); + * console.log(num);// => 100 + */ +const value = function(val,def){ + return (+val||def||0); +}; +kFuncs.value = value; + +/** + * Extracts the section (e.g. `repeating_equipment`), rowID (e.g `-;lkj098J:LKj`), and field name (e.g. `bulk`) from a repeating attribute name. + * @param {string} string - The string to parse + * @returns {array} - Array of matches. Index 0: the section name, e.g. repeating_equipment | Index 1:the row ID | index 2: The name of the attribute + * @returns {string[]} + * @example + * //Extract info from a full repeating name + * const [section,rowID,attrName] = k.parseRepeatName('repeating_equipment_-8908asdflkjZlkj23_name'); + * console.log(section);// => "repeating_equipment" + * console.log(rowID);// => "-8908asdflkjZlkj23" + * console.log(attrName);// => "name" + * + * //Extract info from just a row name + * const [section,rowID,attrName] = k.parseRepeatName('repeating_equipment_-8908asdflkjZlkj23'); + * console.log(section);// => "repeating_equipment" + * console.log(rowID);// => "-8908asdflkjZlkj23" + * console.log(attrName);// => undefined + */ +const parseRepeatName = function(string){ + let match = string.match(/(repeating_[^_]+)_([^_]+)(?:_(.+))?/); + match.shift(); + return match; +}; +kFuncs.parseRepeatName = parseRepeatName; + +/** + * Parses out the components of a trigger name similar to [parseRepeatName](#parserepeatname). Aliases: parseClickTrigger. + * + * Aliases: `k.parseClickTrigger` + * @param {string} string The triggerName property of the + * @returns {array} - For a repeating button named `repeating_equipment_-LKJhpoi98;lj_roll`, the array will be `['repeating_equipment','-LKJhpoi98;lj','roll']`. For a non repeating button named `roll`, the array will be `[undefined,undefined,'roll']` + * @returns {string[]} + * @example + * //Parse a non repeating trigger + * const [section,rowID,attrName] = k.parseTriggerName('clicked:some-button'); + * console.log(section);// => undefined + * console.log(rowID);// => undefined + * console.log(attrName);// => "some-button" + * + * //Parse a repeating trigger + * const [section,rowID,attrName] = k.parseTriggerName('clicked:repeating_attack_-234lkjpd8fu8usadf_some-button'); + * console.log(section);// => "repeating_attack" + * console.log(rowID);// => "-234lkjpd8fu8usadf" + * console.log(attrName);// => "some-button" + * + * //Parse a repeating name + * const [section,rowID,attrName] = k.parseTriggerName('repeating_attack_-234lkjpd8fu8usadf_some-button'); + * console.log(section);// => "repeating_attack" + * console.log(rowID);// => "-234lkjpd8fu8usadf" + * console.log(attrName);// => "some-button" + */ +const parseTriggerName = function(string){ + let match = string.replace(/^clicked:/,'').match(/(?:(repeating_[^_]+)_([^_]+)_)?(.+)/); + match.shift(); + return match; +}; +kFuncs.parseTriggerName = parseTriggerName; +const parseClickTrigger = parseTriggerName; +kFuncs.parseClickTrigger = parseClickTrigger; + +/** + * Parses out the attribute name from the htmlattribute name. + * @param {string} string - The triggerName property of the [event](https://wiki.roll20.net/Sheet_Worker_Scripts#eventInfo_Object). + * @returns {string} + * @example + * //Parse a name + * const attrName = k.parseHtmlName('attr_attribute_1'); + * console.log(attrName);// => "attribute_1" + */ +const parseHTMLName = function(string){ + let match = string.match(/(?:attr|act|roll)_(.+)/); + match.shift(); + return match[0]; +}; +kFuncs.parseHTMLName = parseHTMLName; + +/** + * Capitalize each word in a string + * @param {string} string - The string to capitalize + * @returns {string} + * @example + * const capitalized = k.capitalize('a word'); + * console.log(capitalized);// => "A Word" + */ +const capitalize = function(string){ + return string.replace(/(?:^|\s+|\/)[a-z]/ig,(letter)=>letter.toUpperCase()); +}; +kFuncs.capitalize = capitalize; + +/** + * Extracts a roll query result for use in later functions. Must be awaited as per [startRoll documentation](https://wiki.roll20.net/Sheet_Worker_Scripts#Roll_Parsing.28NEW.29). Stolen from [Oosh\'s Adventures with Startroll thread](https://app.roll20.net/forum/post/10346883/adventures-with-startroll). + * @param {string} query - The query should be just the text as the `?{` and `}` at the start/end of the query are added by the function. + * @returns {Promise} - Resolves to the selected value from the roll query + * @example + * const rollFunction = async function(){ + * //Get the result of a choose from list query + * const queryResult = await extractQueryResult('Prompt Text Here|Option 1|Option 2'); + * console.log(queryResult);//=> "Option 1" or "Option 2" depending on what the user selects + * + * //Get free from input from the user + * const freeResult = await extractQueryResult('Prompt Text Here'); + * consoel.log(freeResult);// => Whatever the user entered + * } + */ +const extractQueryResult = async function(query){ + debug('entering extractQueryResult'); + let queryRoll = await startRoll(`!{{query=[[0[response=?{${query}}]]]}}`); + finishRoll(queryRoll.rollId); + return queryRoll.results.query.expression.replace(/^.+?response=|\]$/g,''); +}; +kFuncs.extractQueryResult = extractQueryResult; + +/** + * Simulates a query for ensuring that async/await works correctly in the sheetworker environment when doing conditional startRolls. E.g. if you have an if/else and only one of the conditions results in `startRoll` being called (and thus an `await`), the sheetworker environment would normally crash. Awaiting this in the condition that does not actually need to call `startRoll` will keep the environment in sync. + * @param {string|number} [value] - The value to return. Optional. + * @returns {Promise} - Resolves to the value passed to the function + * @example + * const rollFunction = async function(){ + * //Get the result of a choose from list query + * const queryResult = await pseudoQuery('a value'); + * console.log(queryResult);//=> "a value" + * } + */ +const pseudoQuery = async function(value){ + debug('entering pseudoQuery'); + let queryRoll = await startRoll(`!{{query=[[0[response=${value}]]]}}`); + finishRoll(queryRoll.rollId); + return queryRoll.results.query.expression.replace(/^.+?response=|\]$/g,''); +}; +kFuncs.pseudoQuery = pseudoQuery; + +/** + * An alias for console.log. + * @param {any} msg - The message can be a straight string, an object, or an array. If it is an object or array, the object will be broken down so that each key is used as a label to output followed by the value of that key. If the value of the key is an object or array, it will be output via `console.table`. + */ +const log = function(msg){ + if(typeof msg === 'string'){ + console.log(`%c${kFuncs.sheetName} log| ${msg}`,"background-color:#159ccf"); + }else if(typeof msg === 'object'){ + Object.keys(msg).forEach((m)=>{ + if(typeof msg[m] === 'string'){ + console.log(`%c${kFuncs.sheetName} log| ${m}: ${msg[m]}`,"background-color:#159ccf"); + }else{ + console.log(`%c${kFuncs.sheetName} log| ${typeof msg[m]} ${m}`,"background-color:#159ccf"); + console.table(msg[m]); + } + }); + } +}; +kFuncs.log = log; + +/** + * Alias for console.log that only triggers when debug mode is enabled or when the sheet\'s version is `0`. Useful for entering test logs that will not pollute the console on the live sheet. + * @param {any} msg - 'See {@link k.log} + * @param {boolean} force - Pass as a truthy value to force the debug output to be output to the console regardless of debug mode. + * @returns {void} + */ +const debug = function(msg,force){ + if(!kFuncs.debugMode && !force && kFuncs.version > 0) return; + if(typeof msg === 'string'){ + console.log(`%c${kFuncs.sheetName} DEBUG| ${msg}`,"background-color:tan;color:red;"); + }else if(typeof msg === 'object'){ + Object.keys(msg).forEach((m)=>{ + if(typeof msg[m] === 'string'){ + console.log(`%c${kFuncs.sheetName} DEBUG| ${m}: ${msg[m]}`,"background-color:tan;color:red;"); + }else{ + console.log(`%c${kFuncs.sheetName} DEBUG| ${typeof msg[m]} ${m}`,"background-color:tan;color:red;font-weight:bold;"); + console.table(msg[m]); + } + }); + } +}; +kFuncs.debug = debug; + +/** + * Orders the section id arrays for all sections in the `sections` object to match the repOrder attribute. + * @param {attributesProxy} attributes - The attributes object that must have a value for the reporder for each section. + * @param {[object]} sections - Object containing the IDs for the repeating sections, indexed by repeating section name. + */ +const orderSections = function(attributes,sections){ + Object.keys(sections).forEach((section)=>{ + attributes.attributes[`_reporder_${section}`] = commaArray(attributes[`_reporder_${section}`]); + orderSection(attributes.attributes[`_reporder_${section}`],sections[section]); + }); +}; +kFuncs.orderSections = orderSections; + +/** + * Orders a single ID array. + * @param {[string]} repOrder - Array of IDs in the order they are in on the sheet. + * @param {[string]} IDs - Array of IDs to be ordered. + */ +const orderSection = function(repOrder,IDs=[]){ + IDs.sort((a,b)=>{ + return repOrder.indexOf(a.toLowerCase()) - repOrder.indexOf(b.toLowerCase()); + }); +}; +kFuncs.orderSection = orderSection; + +/** + * Splits a comma delimited string into an array + * @param {string} string - The string to split. + * @returns {array} - The string segments of the comma delimited list. + */ +const commaArray = function(string=''){ + return string.toLowerCase().split(/\s*,\s*/); +}; +kFuncs.commaArray = commaArray; \ No newline at end of file diff --git a/backbone/source/scaffold/tabs/_tabs.pug b/backbone/source/scaffold/tabs/_tabs.pug new file mode 100644 index 0000000000..ad594fead2 --- /dev/null +++ b/backbone/source/scaffold/tabs/_tabs.pug @@ -0,0 +1,115 @@ +//- @pugdoc + name: tabs + description: A generic mixin to create tabs using jQuery. It uses a nested {@link tab} mixin to define tabs. Any content outside those mixin in put in the containing div, before the tabs. Attributes passed to the mixin are passed to the outer containing div. + arguments: + - {string} [name=tabs] - The name of the tabs construct. Used in all elements so that you may vary the styling of different tabs + - {string} [defaultActiveTab] - The name of the tab that should be active by default. + - {boolean} [persistent = true] - Whether the tabs should be persistent and load their last state when the sheet is reloaded. True by default. + attributes: + example: | + include ../_htmlelements.pug + // Tabs that are persistent (default) and have the background tab as the default tab + +tabs({name:"sheet-tabs",defaultActiveTab:'background'})(class="outer") + span before the header + +tab({})(class="tab-vertical") + span(style="background: white;") Tab 1 content + +tab({name:"background"})(class="tab_horizontal") + span(style="background: white;") Tab background content + +tab({name:"history", button:{class:"custom-button"}})(class="tab_horizontal") + span(style="background: white;") Tab history content + +tab({name:"inventory", container:"span"})(class="tab_horizontal") + span(style="background: white;") Tab inventory content + + // Tabs that are NOT persistent and have no default tab (aka all tab content will be hidden by default) + +tabs({name:"sheet-tabs"-2,persistent:false})(class="outer") + span before the header + +tab({})(class="tab-vertical") + span(style="background: white;") Tab 1 content + +tab({name:"background"})(class="tab_horizontal") + span(style="background: white;") Tab background content + +tab({name:"history", button:{class:"custom-button"}})(class="tab_horizontal") + span(style="background: white;") Tab history content + +tab({name:"inventory", container:"span"})(class="tab_horizontal") + span(style="background: white;") Tab inventory content +mixin tabs({name="tabs",defaultActiveTab,persistent=true,navFuncs=[]}) + //- Cleanup the name to use "-" instead of spaces, and no problematic chars + //- We use "-" as in action buttons, because this name will be used in CSS classes + - + defaultActiveTab = defaultActiveTab ? + actionButtonName(replaceProblems(defaultActiveTab)) : + undefined; + - sectionName = actionButtonName(replaceProblems(name)); + if persistent + | + - const inputObj = {name:`${sectionName.replace(/\-/g,'_')} tab`}; + if defaultActiveTab + - inputObj.value = `nav-tabs-${sectionName}--${defaultActiveTab}`; + +hidden(inputObj) + - varObjects.persistentTabs = varObjects.persistentTabs || []; + - varObjects.persistentTabs.push(inputObj.name.replace(/attr_/,'')) + + //- Storage for all the tabs in this construct, plus a local mixin to pass + //- several pug blocks + - const tabs = []; + mixin tab({tabName,button={},container="div",tabNavFuncs=[]}) + - tabName = actionButtonName(replaceProblems(tabName || `tab${tabs.length + 1}`)); + - if (tabs.filter(tab => tab.name === tabName).length) { throw new Error(`Tab "${tabName}" already exists in "${sectionName}".`); } + //- Cleanup the name of the navigation button + - button.name = `nav-tabs-${sectionName}--${tabName}`; + //- Cleanup the class, add our own internal classes + - button.class = button.class ? ` ${replaceProblems(button.class)}` : ""; + - button.class = `tabs__button tabs--${sectionName}__button tabs--${sectionName}__button--${tabName}${button.class}${!persistent && defaultActiveTab === tabName ? ' k-active-button' : ''}`; + - button['data-container-button'] = sectionName; + - button['data-button'] = tabName; + - const content = button.content; + - delete button.content; + + //- If not provided, hook the button to the default tab switcher listener + - button.trigger = button.trigger || {triggeredFuncs:["kSwitchTab"],navFuncs:[... new Set([...tabNavFuncs,...navFuncs])]}; + //- Cleanup the class of the tab content passed through the implicit attributes + //- and add our own internal classes + - attributes.class = attributes.class ? ` ${replaceProblems(attributes.class)}` : ''; + - attributes.class = `tabs__container tabs--${sectionName}__container tabs--${sectionName}__container--${tabName}${attributes.class}${!persistent && defaultActiveTab === tabName ? ' k-active-tab' : ''}`; + //- Store the tab definition + - tabs.push({name:tabName, container, button, attributes, block, content}); + + + //- Put everything in a global div with appropriate classes for CSS styling + //- and proper HTML organization + - attributes.class = attributes.class ? ` ${replaceProblems(attributes.class)}` : ''; + - attributes.class = `tabs tabs--${sectionName}${attributes.class}`; + div&attributes(attributes) + //- Execute the block passed to the +tabs mixin, if any + //- this fills the `tabs` array above when the +tab nested mixin + //- is called in the block + + //- Navigation header with action button to switch tabs + nav(class=`tabs__header tabs--${sectionName}__header`) + - block ? block() : undefined; + ul.no-list.flex-box.half-gap.flex-wrap + each tab, index in tabs + if !tab.content + - tab.button['data-i18n'] = `tabs-${sectionName}-${tab.name}`; + li + +action(tab.button)(data-container-tab=sectionName data-tab=tab.name) + if tab.content + != tab.content + + //- Global div storing all the tabs one after another + //- only one will be visible at the same time + div(class=`tabs__body tabs--${sectionName}__body`) + each tab, index in tabs + - const container = tab.container; + #{container}(data-container-tab=sectionName data-tab=tab.name)&attributes(tab.attributes) + - tab.block() + +//- duplicate for documentation purposes +//- @pugdoc + name: tab + description: Mixin to add a new tab. Only available inside a {@link tabs} mixin. Attributes passed to the mixin are passed to the div containing the content, not to the header button. + arguments: + - {string} [name] - The name of the tab. Defaults to `tab` followed by a index count starting at 1 (so tab1, then tab2, ...) + - {object} [button] - object passed to the +action mixin to build the action button for switching tabe. By default a trigger is defined, but you can override it. + - {string} [container] - tag to use to contain the whole tab. A div by default but can be overridden. +mixin tab({name,button={},container="div"}) + - throw new Error("The +tab() mixin can only be used within a +tabs() mixin"); \ No newline at end of file diff --git a/backbone/source/scaffold/tabs/_tabs.scss b/backbone/source/scaffold/tabs/_tabs.scss new file mode 100644 index 0000000000..402c33f2f3 --- /dev/null +++ b/backbone/source/scaffold/tabs/_tabs.scss @@ -0,0 +1,5 @@ +.tabs { + .tabs__container:not(.k-active-tab) { + display: none ! important; + } +} \ No newline at end of file diff --git a/backbone/source/scaffold/tabs/tabs.js b/backbone/source/scaffold/tabs/tabs.js new file mode 100644 index 0000000000..d8a2444335 --- /dev/null +++ b/backbone/source/scaffold/tabs/tabs.js @@ -0,0 +1,42 @@ +/** + * The default tab navigation function of the K-scaffold. Courtesy of Riernar. It will add `k-active-tab` to the active tab-container and `k-active-button` to the active button. You can either write your own CSS to control display of these, or use the default CSS included in `scaffold/_k.scss`. Note that `k-active-button` has no default CSS as it is assumed that you will want to style the active button to match your system. + * @param {Object} trigger - The trigger object + */ +const kSwitchTab = function ({ trigger, attributes, sections, casc }) { + const [container, tab] = ( + trigger.name.match(/nav-tabs-(.+)--(.+)/) || + [] + ).slice(1); + $20(`[data-container-tab="${container}"]`).removeClass('k-active-tab'); + $20(`[data-container-tab="${container}"][data-tab="${tab}"]`).addClass('k-active-tab'); + $20(`[data-container-button="${container}"]`).removeClass('k-active-button'); + $20(`[data-container-button="${container}"][data-button="${tab}"]`).addClass('k-active-button'); + const tabInputName = `${container.replace(/\-/g,'_')}_tab`; + if(persistentTabs.indexOf(tabInputName) > -1){ + attributes[tabInputName] = trigger.name; + } + if(trigger && trigger.navFuncs){ + trigger.navFuncs.forEach((funcName) => { + if(funcs[funcName]){ + funcs[funcName]({attributes,sections,casc,trigger}); + } + }); + } +} + +registerFuncs({ kSwitchTab }); + +/** + * Sets persistent tabs to their last active state + * @param {object} trigger - The trigger that caused the function to be called + * @param {object} attributes - The attribute values of the character + * @param {object[]} sections - All the repeating section IDs + * @param {object} casc - Expanded cascade object + */ +const kTabOnOpen = function({trigger,attributes,sections,casc}){ + persistentTabs.forEach((tabInput) => { + const pseudoTrigger = {name:attributes[tabInput]}; + kSwitchTab({trigger:pseudoTrigger, attributes}); + }); +}; +registerFuncs({ kTabOnOpen },{type:['opener']}); \ No newline at end of file diff --git a/backbone/translation.json b/backbone/translation.json new file mode 100644 index 0000000000..73a83182ac --- /dev/null +++ b/backbone/translation.json @@ -0,0 +1,209 @@ +{ + "health roll": "health roll", + "resolve roll": "resolve roll", + "adrenaline abbreviation": "adrn", + "difficulty level abbreviation": "dl", + "tabs-backbone-pc": "character", + "tabs-backbone-npc": "npc", + "tabs-backbone-companion": "companion", + "unlucky-message": "luck is not in your favor", + "lucky-message": "luck is in your favor!", + "roll": "roll", + "uses slot": "uses slot", + "small": "small", + "medium": "medium", + "large": "large", + "character-info": "character info", + "basic-stats": "basic stats", + "basic-skills": "basic skills", + "combat-skills": "combat skills", + "specialties": "specialties", + "gear": "gear", + "weapons": "weapons", + "archetype": "archetype", + "traits": "traits", + "name": "name", + "age": "age", + "gender": "gender", + "origin": "origin", + "dialect": "dialect", + "level": "level", + "ideals": "ideals", + "fortune": "fortune", + "characteristics": "characteristics", + "aptitude": "aptitude", + "athletics": "athletics", + "charisma": "charisma", + "logic": "logic", + "wisdom": "wisdom", + "size": "size", + "stamina": "stamina", + "willpower": "willpower", + "aptitude-abbreviation": "apt", + "athletics-abbreviation": "ath", + "charisma-abbreviation": "cha", + "logic-abbreviation": "log", + "wisdom-abbreviation": "wis", + "size-abbreviation": "siz", + "stamina-abbreviation": "sta", + "willpower-abbreviation": "wil", + "attributes": "attributes", + "vigilance": "vigilance", + "build": "build", + "intuition": "intuition", + "reflex": "reflex", + "melee": "melee", + "ranged": "ranged", + "combat skills": "combat skills", + "specialty skills": "specialty skills", + "armor-movement": "armor & movement", + "equipped armor": "equipped armor", + "armor details": "armor details", + "armor abbreviation": "armor", + "movement rate abbreviation": "mov", + "sprint speed abbreviation": "sprint", + "skill points": "skill points", + "+wisdom abbreviation": "+wis", + "+charisma abbreviation": "+cha", + "+logic abbreviation": "+log", + "+aptitude abbreviation": "+apt", + "+athletics abbreviation": "+ath", + "assess": "assess", + "deceive": "deceive", + "deduce": "deduce", + "disguise": "disguise", + "encrypt": "encrypt", + "first aid": "first aid", + "hide": "hide", + "legerdemain": "legerdemain", + "locksmith": "locksmith", + "nurse (ment)": "nurse (ment)", + "nurse (phys)": "nurse (phys)", + "persuade": "persuade", + "research": "research", + "ride/steer": "ride/steer", + "search": "search", + "sneak": "sneak", + "stunt": "stunt", + "survive": "survive", + "threaten": "threaten", + "tinker": "tinker", + "select": "select", + "aptitude abbreviation": "aptitude", + "athletics abbreviation": "athletics", + "charisma abbreviation": "charisma", + "logic abbreviation": "logic", + "wisdom abbreviation": "wisdom", + "size abbreviation": "size", + "stamina abbreviation": "stamina", + "willpower abbreviation": "willpower", + "coin & assets": "coin & assets", + "equipped gear": "equipped gear", + "stored gear": "stored gear", + "equipped weapons": "equipped weapons", + "favorable traits": "favorable traits", + "unfavorable traits": "unfavorable traits", + "credit": "credit", + "coin": "coin", + "badge": "badge", + "clothes": "clothes", + "weapon": "weapon", + "armor": "armor", + "damage": "damage", + "range": "range", + "blitz": "blitz", + "wear": "wear", + "weapon name": "weapon name", + "description": "description", + "item slots": "item slots", + "abilities": "abilities", + "health": "health", + "resolve": "resolve", + "maximum": "maximum", + "luck": "luck", + "odd": "odd", + "even": "even", + "adrenaline": "adrenaline", + "uses": "uses", + "skill": "skill", + "select one": "select one", + "armor bonus": "armor bonus", + "": "", + "tabs-backbone-tab1": "tabs-backbone-tab1", + "tabs-backbone-tab2": "tabs-backbone-tab2", + "{\"i18n\":\"skills\",\"collection\":{\"assess\":{\"name\":\"assess\",\"characteristic\":\"wisdom\"},\"deceive\":{\"name\":\"deceive\",\"characteristic\":\"charisma\"},\"deduce\":{\"name\":\"deduce\",\"characteristic\":\"logic\"},\"disguise\":{\"name\":\"disguise\",\"characteristic\":\"charisma\"},\"encrypt\":{\"name\":\"encrypt\",\"characteristic\":\"logic\"},\"first aid\":{\"name\":\"first aid\",\"characteristic\":\"wisdom\"},\"hide\":{\"name\":\"hide\",\"characteristic\":\"wisdom\"},\"legerdemain\":{\"name\":\"legerdemain\",\"characteristic\":\"aptitude\"},\"locksmith\":{\"name\":\"locksmith\",\"characteristic\":\"aptitude\"},\"nurse (ment)\":{\"name\":\"nurse (ment)\",\"characteristic\":\"logic\"},\"nurse (phys)\":{\"name\":\"nurse (phys)\",\"characteristic\":\"logic\"},\"persuade\":{\"name\":\"persuade\",\"characteristic\":\"charisma\"},\"research\":{\"name\":\"research\",\"characteristic\":\"logic\"},\"ride/steer\":{\"name\":\"ride/steer\",\"characteristic\":\"athletics\"},\"search\":{\"name\":\"search\",\"characteristic\":\"wisdom\"},\"sneak\":{\"name\":\"sneak\",\"characteristic\":\"athletics\"},\"stunt\":{\"name\":\"stunt\",\"characteristic\":\"athletics\"},\"survive\":{\"name\":\"survive\",\"characteristic\":\"wisdom\"},\"threaten\":{\"name\":\"threaten\",\"characteristic\":\"charisma\"},\"tinker\":{\"name\":\"tinker\",\"characteristic\":\"aptitude\"}}}": "{\"i18n\":\"skills\",\"collection\":{\"assess\":{\"name\":\"assess\",\"characteristic\":\"wisdom\"},\"deceive\":{\"name\":\"deceive\",\"characteristic\":\"charisma\"},\"deduce\":{\"name\":\"deduce\",\"characteristic\":\"logic\"},\"disguise\":{\"name\":\"disguise\",\"characteristic\":\"charisma\"},\"encrypt\":{\"name\":\"encrypt\",\"characteristic\":\"logic\"},\"first aid\":{\"name\":\"first aid\",\"characteristic\":\"wisdom\"},\"hide\":{\"name\":\"hide\",\"characteristic\":\"wisdom\"},\"legerdemain\":{\"name\":\"legerdemain\",\"characteristic\":\"aptitude\"},\"locksmith\":{\"name\":\"locksmith\",\"characteristic\":\"aptitude\"},\"nurse (ment)\":{\"name\":\"nurse (ment)\",\"characteristic\":\"logic\"},\"nurse (phys)\":{\"name\":\"nurse (phys)\",\"characteristic\":\"logic\"},\"persuade\":{\"name\":\"persuade\",\"characteristic\":\"charisma\"},\"research\":{\"name\":\"research\",\"characteristic\":\"logic\"},\"ride/steer\":{\"name\":\"ride/steer\",\"characteristic\":\"athletics\"},\"search\":{\"name\":\"search\",\"characteristic\":\"wisdom\"},\"sneak\":{\"name\":\"sneak\",\"characteristic\":\"athletics\"},\"stunt\":{\"name\":\"stunt\",\"characteristic\":\"athletics\"},\"survive\":{\"name\":\"survive\",\"characteristic\":\"wisdom\"},\"threaten\":{\"name\":\"threaten\",\"characteristic\":\"charisma\"},\"tinker\":{\"name\":\"tinker\",\"characteristic\":\"aptitude\"}}}", + "{\"i18n\":\"combat skills\",\"collection\":{\"melee\":{\"name\":\"melee\",\"characteristic\":\"athletics\"},\"ranged\":{\"name\":\"ranged\",\"characteristic\":\"aptitude\"}}}": "{\"i18n\":\"combat skills\",\"collection\":{\"melee\":{\"name\":\"melee\",\"characteristic\":\"athletics\"},\"ranged\":{\"name\":\"ranged\",\"characteristic\":\"aptitude\"}}}", + "skills": "skills", + "conditions": "conditions", + "bewildered-description": "Until the condition’s duration expires, the character laughs, cries, or yells whenever they speak or roll the opposite of their luck value. They have a Worst-of-Two modifier on skill rolls that use the CHA and WIS characteristics.", + "bleeding-description": "Puncturing damage to a character’s body causes them to bleed out until the condition duration expires. While Bleeding, the character loses 3 HP at the start of each of their turns for a duration of 1d4 rounds.", + "blinded-description": "Physical damage to a character’s eyes prevents them from seeing until the condition duration expires. During this time, the character fails all skill rolls that require sight.", + "burned-description": "Burn wounds cause the character to receive additional damage until the condition’s duration expires. The burned character loses 1 HP from the burn wound whenever it takes an action.", + "confused-description": "The character loses focus easily and cannot recall events from the last 24 hours until the condition’s duration expires. They have a Worst-of-Two modifier on INTU rolls, and skill rolls that use the LOG characteristic.", + "deafened-description": "A loud noise or physical damage to the character’s ears prevents the character from hearing anything until the condition’s duration expires. While deafened, the character fails all skill rolls that require hearing.", + "incapacitated-description": "The character is conscious but unable to move until the condition’s duration expires. Characters can attempt skill rolls that require only mental or communicative effort; however, characters automatically fail skill rolls that involve physical movement.", + "infuriated-description": "The character acts violently toward the environment and anyone nearby. While infuriated, the character must attack the nearest character(s) on their turn. If the nearest character is Unconscious, the character must succeed an INTU roll (DG 12) or attack the Unconscious character.", + "intoxicated-description": "The character has a Worst-of-Two modifier on REF and VIG rolls until the condition’s duration expires.", + "plagued-description": "The character has a Worst-of-Two modifier on skill rolls that use the APT and CHA characteristics until the condition’s duration expires.", + "poisoned-description": "The character has a Worst-of-Two modifier on BLD rolls and loses 1 HP at the start of its movement turn-phase until the condition’s duration expires. Outside of VIG order, the character receives 1d6 dmg every hour that they remain poisoned.", + "panicked-description": "The character fears every noise and distrusts every person until the condition’s duration expires. They have a Worst-of-Two modifier on INTU rolls and must succeed a luck roll when they hear an unexpected noise. Otherwise, they either attack the source of the noise or scream in fright.", + "sleeping-description": "The character cannot act, think, or move until the condition duration expires or the character takes damage. Attack rolls against sleeping characters automatically succeed, and the character automatically fails attribute rolls.", + "spellbound-description": "Until the condition’s duration expires, the character hallucinates an object or person who is not there whenever they fail a roll with a value opposite of their luck value. These hallucinations should relate to recent events or the character’s backstory. A character believes the hallucinations are real until they succeed an Assess roll (DG 12).", + "wounded-description": "The character suffers a major injury until the condition’s duration expires. This injury temporarily reduces the character’s MOV and sprint by 5 ft. The character also has a Worst-of-Two modifier on skill rolls that use the ATH characteristic.", + "comatose-description": "The character enters a state of deep consciousness. They cannot act, speak, or move. Attacks that target this character automatically succeed, and the character automatically fails attribute rolls. The Comatose condition continues until a character succeeds at a Nurse (Mental) roll (DG 11), at which point the character also recovers 1d4 RES. If the character fails the roll, the character suffers the Confused condition for 2d4 days.", + "death-description": "The character is no longer alive. It cannot sense, act, or think. The character automatically fails attribute rolls, and attacks that target this character automatically succeed. Within the first two minutes of Death, a successful Nurse (Physical) roll (DG 19) with a medicine or emergency kit ends the condition, but the character suffers the Unconscious condition instead and remains at zero HP.", + "in extremis-description": "The character is holding on to life. The character falls Prone and cannot stand while In Extremis. It can take an action but cannot take blitz actions or counter actions. It can move only by crawling, and it automatically fails attribute rolls. Attacks within 5 ft that target this character automatically succeed. When a character In Extremis takes damage, the condition ends and the character suffers Death. A character can end the In Extremis condition with a successful Nurse (Physical) roll (DG 11), at which point the character also recovers 1 HP. If the character fails this roll, it suffers Death.", + "prone-description": "The character lies flat on the ground. Melee attacks against a Prone character have a Best-of-Two modifier. Ranged attacks against a Prone character have a Worst-of-Two modifier, unless in short range. The character must expend 10 ft of their MOV to stand and end the Prone condition.", + "restrained-description": "An item, object, or another person restrains the character. Characters have zero MOV and a Worst-of-Two modifier on skill rolls that require physical movement until the condition ends. A character can end the Restrained condition with a successful BLD roll. The GM determines the DG for the BLD roll if the character is restrained by an item or object. Otherwise, the DG is equal to the restraining character’s BLD goal.", + "unconscious-description": "The character cannot act, think, or move. Attacks within 5 ft that target this character automatically succeed and achieve a critical success. The Unconscious character automatically fails attribute rolls. A character can end the Unconscious condition with a successful Nurse (Physical) roll (DG 11), at which point the Unconscious character also recovers 1 HP. If the character fails this roll and the Unconscious character is at zero HP, the Unconscious character suffers Death. If the Unconscious character has zero HP and then receives damage, it suffers Death. If the Unconscious character receives damage that reduces it to zero HP, it remains Unconscious and does not yet suffer Death.", + "bewildered": "bewildered", + "bleeding": "bleeding", + "blinded": "blinded", + "burned": "burned", + "confused": "confused", + "deafened": "deafened", + "incapacitated": "incapacitated", + "infuriated": "infuriated", + "intoxicated": "intoxicated", + "plagued": "plagued", + "poisoned": "poisoned", + "panicked": "panicked", + "sleeping": "sleeping", + "spellbound": "spellbound", + "wounded": "wounded", + "comatose": "comatose", + "death": "death", + "in extremis": "in extremis", + "prone": "prone", + "restrained": "restrained", + "unconscious": "unconscious", + "best-of-two": "best-of-two", + "normal": "normal", + "worst-of-two": "worst-of-two", + "tabs-backbone-notes": "notes", + "backstory": "backstory", + "notes": "notes", + "select size": "select size", + "properties": "properties", + "unequip": "unequip", + "character type": "character type", + "pc": "pc", + "npc": "npc", + "settings": "settings", + "whisper rolls to gm": "whisper rolls to gm", + "never": "never", + "always": "always", + "ammo container": "ammo container", + "amount": "amount", + "type": "type", + "helping": "helping", + "take time": "take time", + "basic stats": "basic stats", + "combat stats": "combat stats", + "attacks": "attacks", + "damage-abbreviation": "dmg", + "action": "action", + "counter": "counter", + "passive": "passive", + "items": "items" +} \ No newline at end of file