create-playcanvas 0.1.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2011-2026 PlayCanvas Ltd.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
package/README.md CHANGED
@@ -1,71 +1,78 @@
1
- # Create a PlayCanvas project in seconds
1
+ # create-playcanvas
2
2
 
3
- A simple one line command to sin up a read-to-code PlayCanvas project in seconds.
3
+ [![NPM Version](https://img.shields.io/npm/v/create-playcanvas)](https://www.npmjs.com/package/create-playcanvas)
4
+ [![CI](https://github.com/playcanvas/create-playcanvas/actions/workflows/ci.yml/badge.svg)](https://github.com/playcanvas/create-playcanvas/actions/workflows/ci.yml)
5
+
6
+ Spin up a ready-to-code [PlayCanvas](https://playcanvas.com/) project in seconds.
4
7
 
5
8
  ```bash
6
- # npm (recommended)
7
9
  npm create playcanvas@latest
10
+ ```
8
11
 
9
- # pnpm
10
- pnpm create playcanvas
12
+ Also works with other package managers:
11
13
 
12
- # yarn
14
+ ```bash
15
+ pnpm create playcanvas
13
16
  yarn create playcanvas
14
-
15
- # bun
16
17
  bun create playcanvas
17
18
  ```
18
19
 
19
20
  The CLI will prompt you for:
20
21
 
21
- 1. **Project name** – folder to create (defaults to `playcanvas-project`).
22
- 2. **Overwrite behavior** if the folder exists.
23
- 3. **Package name** – used in `package.json`.
24
- 4. **Framework & variant** – pick from templates below.
25
- 5. **Scaffolding** – project files are copied and tweaked; a final cheat-sheet is printed.
22
+ 1. **Project name** - folder to create (defaults to `playcanvas-project`)
23
+ 2. **Overwrite behavior** - if the folder already exists
24
+ 3. **Package name** - used in `package.json`
25
+ 4. **Framework & variant** - pick from templates below
26
26
 
27
- ### Non-interactive / flags
27
+ ## Non-interactive Usage
28
28
 
29
- Skip the questions when scripting or if you know what you want:
29
+ Skip the prompts when scripting or if you know what you want:
30
30
 
31
31
  ```bash
32
- npm create playcanvas@latest my-game -t react-ts --overwrite
32
+ npm create playcanvas@latest my-game -- -t react-ts --overwrite
33
33
  ```
34
34
 
35
- Flags:
35
+ | Flag | Shorthand | Description |
36
+ | ------------------- | --------- | -------------------------------------------------- |
37
+ | `--template <name>` | `-t` | Directly choose template variant (see list below) |
38
+ | `--overwrite` | | Remove existing files in target directory |
39
+ | `--help` | `-h` | Show help/usage information |
36
40
 
37
- | Flag | Shorthand | Description |
38
- | ---------------------------- | --------- | ---------------------------------------------------- |
39
- | `--template <name>` | `-t` | Directly choose template variant (see list below). |
40
- | `--overwrite` | | Remove existing files in target directory. |
41
- | `--help` | `-h` | Show help/usage information. |
41
+ ## Templates
42
42
 
43
- ## 🎨 Templates
43
+ | Template | Description |
44
+ | ------------ | -------------------------------------- |
45
+ | `vanilla-ts` | Vanilla TypeScript + PlayCanvas Engine |
46
+ | `react-ts` | React + TypeScript + PlayCanvas React |
44
47
 
45
- (TBD)
48
+ _To add your own template, drop a folder in `templates/<name>` and update `templates/index.js`._
46
49
 
47
- | Template | Description |
48
- | ------------ | --------------------------- |
49
- | `vanilla-ts` | Plain Typescript PlayCanvas |
50
- | `react-ts` | React + TypeScript |
50
+ ## Development
51
51
 
52
- _To add your own template, drop a folder in `templates/<name>` and update the `templates/index.js`
52
+ Clone the repo, then:
53
53
 
54
- ## 🛠 Development
54
+ ```bash
55
+ npm install
56
+ npm run dev # stub build for local development
57
+ node index.js # test the CLI locally
58
+ ```
55
59
 
56
- Clone the repo, then:
60
+ Or use `npm link` to test as if installed globally:
57
61
 
58
62
  ```bash
59
- npm install # or npm, yarn, bun
60
- npm run dev # compile TypeScript → dist (if needed)
61
- npm link # you can now run `npx create-playcanvas` to test
63
+ npm link
64
+ create-playcanvas
62
65
  ```
63
66
 
64
- ## 🤝 Contributing
67
+ ## Contributing
65
68
 
66
69
  Bug reports, feature requests and PRs are welcome! Want to create a new template? Please file an issue first if you plan major changes.
67
70
 
68
- 1. Fork / clone.
69
- 2. Create a branch: `git checkout -b feat/my-awesome-idea`.
70
- 3. Commit with conventional-commit messages.
71
- 4. Push and open a PR.
71
+ 1. Fork / clone
72
+ 2. Create a branch: `git checkout -b feat/my-awesome-idea`
73
+ 3. Commit with conventional-commit messages
74
+ 4. Push and open a PR
75
+
76
+ ## License
77
+
78
+ MIT
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import"node:util";import f,{stdin as mD,stdout as gD}from"node:process";import G from"node:readline";import{WriteStream as pD}from"node:tty";import m from"node:fs";import b from"node:path";import{fileURLToPath as fD}from"node:url";import{promises as bD}from"fs";import dD from"path";function O(e){return e==null?[]:Array.isArray(e)?e:[e]}function AD(e,u,t,r){var i,s=e[u],D=~r.string.indexOf(u)?t==null||t===!0?"":String(t):typeof t=="boolean"?t:~r.boolean.indexOf(u)?t==="false"?!1:t==="true"||(e._.push((i=+t,i*0===0?i:t)),!!t):(i=+t,i*0===0?i:t);e[u]=s==null?D:Array.isArray(s)?s.concat(D):[s,D]}function vD(e,u){e=e||[],u=u||{};var t,r,i,s,D,n={_:[]},F=0,a=0,o=0,l=e.length;const c=u.alias!==void 0,h=u.unknown!==void 0,A=u.default!==void 0;if(u.alias=u.alias||{},u.string=O(u.string),u.boolean=O(u.boolean),c)for(t in u.alias)for(r=u.alias[t]=O(u.alias[t]),F=0;F<r.length;F++)(u.alias[r[F]]=r.concat(t)).splice(F,1);for(F=u.boolean.length;F-- >0;)for(r=u.alias[u.boolean[F]]||[],a=r.length;a-- >0;)u.boolean.push(r[a]);for(F=u.string.length;F-- >0;)for(r=u.alias[u.string[F]]||[],a=r.length;a-- >0;)u.string.push(r[a]);if(A){for(t in u.default)if(s=typeof u.default[t],r=u.alias[t]=u.alias[t]||[],u[s]!==void 0)for(u[s].push(t),F=0;F<r.length;F++)u[s].push(r[F])}const v=h?Object.keys(u.alias):[];for(F=0;F<l;F++){if(i=e[F],i==="--"){n._=n._.concat(e.slice(++F));break}for(a=0;a<i.length&&i.charCodeAt(a)===45;a++);if(a===0)n._.push(i);else if(i.substring(a,a+3)==="no-"){if(s=i.substring(a+3),h&&!~v.indexOf(s))return u.unknown(i);n[s]=!1}else{for(o=a+1;o<i.length&&i.charCodeAt(o)!==61;o++);for(s=i.substring(a,o),D=i.substring(++o)||F+1===l||(""+e[F+1]).charCodeAt(0)===45||e[++F],r=a===2?[s]:s,o=0;o<r.length;o++){if(s=r[o],h&&!~v.indexOf(s))return u.unknown("-".repeat(a)+s);AD(n,s,o+1<r.length||D,u)}}}if(A)for(t in u.default)n[t]===void 0&&(n[t]=u.default[t]);if(c)for(t in n)for(r=u.alias[t]||[];r.length>0;)n[r.shift()]=n[t];return n}function xD(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var R,J;function $D(){if(J)return R;J=1;const e="\x1B",u=`${e}[`,t="\x07",r={to(D,n){return n?`${u}${n+1};${D+1}H`:`${u}${D+1}G`},move(D,n){let F="";return D<0?F+=`${u}${-D}D`:D>0&&(F+=`${u}${D}C`),n<0?F+=`${u}${-n}A`:n>0&&(F+=`${u}${n}B`),F},up:(D=1)=>`${u}${D}A`,down:(D=1)=>`${u}${D}B`,forward:(D=1)=>`${u}${D}C`,backward:(D=1)=>`${u}${D}D`,nextLine:(D=1)=>`${u}E`.repeat(D),prevLine:(D=1)=>`${u}F`.repeat(D),left:`${u}G`,hide:`${u}?25l`,show:`${u}?25h`,save:`${e}7`,restore:`${e}8`},i={up:(D=1)=>`${u}S`.repeat(D),down:(D=1)=>`${u}T`.repeat(D)},s={screen:`${u}2J`,up:(D=1)=>`${u}1J`.repeat(D),down:(D=1)=>`${u}J`.repeat(D),line:`${u}2K`,lineEnd:`${u}K`,lineStart:`${u}1K`,lines(D){let n="";for(let F=0;F<D;F++)n+=this.line+(F<D-1?r.up():"");return D&&(n+=r.left),n}};return R={cursor:r,scroll:i,erase:s,beep:t},R}var d=$D(),_={exports:{}},q;function yD(){if(q)return _.exports;q=1;let e=process||{},u=e.argv||[],t=e.env||{},r=!(t.NO_COLOR||u.includes("--no-color"))&&(!!t.FORCE_COLOR||u.includes("--color")||e.platform==="win32"||(e.stdout||{}).isTTY&&t.TERM!=="dumb"||!!t.CI),i=(n,F,a=n)=>o=>{let l=""+o,c=l.indexOf(F,n.length);return~c?n+s(l,F,a,c)+F:n+l+F},s=(n,F,a,o)=>{let l="",c=0;do l+=n.substring(c,o)+a,c=o+F.length,o=n.indexOf(F,c);while(~o);return l+n.substring(c)},D=(n=r)=>{let F=n?i:()=>String;return{isColorSupported:n,reset:F("\x1B[0m","\x1B[0m"),bold:F("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:F("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:F("\x1B[3m","\x1B[23m"),underline:F("\x1B[4m","\x1B[24m"),inverse:F("\x1B[7m","\x1B[27m"),hidden:F("\x1B[8m","\x1B[28m"),strikethrough:F("\x1B[9m","\x1B[29m"),black:F("\x1B[30m","\x1B[39m"),red:F("\x1B[31m","\x1B[39m"),green:F("\x1B[32m","\x1B[39m"),yellow:F("\x1B[33m","\x1B[39m"),blue:F("\x1B[34m","\x1B[39m"),magenta:F("\x1B[35m","\x1B[39m"),cyan:F("\x1B[36m","\x1B[39m"),white:F("\x1B[37m","\x1B[39m"),gray:F("\x1B[90m","\x1B[39m"),bgBlack:F("\x1B[40m","\x1B[49m"),bgRed:F("\x1B[41m","\x1B[49m"),bgGreen:F("\x1B[42m","\x1B[49m"),bgYellow:F("\x1B[43m","\x1B[49m"),bgBlue:F("\x1B[44m","\x1B[49m"),bgMagenta:F("\x1B[45m","\x1B[49m"),bgCyan:F("\x1B[46m","\x1B[49m"),bgWhite:F("\x1B[47m","\x1B[49m"),blackBright:F("\x1B[90m","\x1B[39m"),redBright:F("\x1B[91m","\x1B[39m"),greenBright:F("\x1B[92m","\x1B[39m"),yellowBright:F("\x1B[93m","\x1B[39m"),blueBright:F("\x1B[94m","\x1B[39m"),magentaBright:F("\x1B[95m","\x1B[39m"),cyanBright:F("\x1B[96m","\x1B[39m"),whiteBright:F("\x1B[97m","\x1B[39m"),bgBlackBright:F("\x1B[100m","\x1B[49m"),bgRedBright:F("\x1B[101m","\x1B[49m"),bgGreenBright:F("\x1B[102m","\x1B[49m"),bgYellowBright:F("\x1B[103m","\x1B[49m"),bgBlueBright:F("\x1B[104m","\x1B[49m"),bgMagentaBright:F("\x1B[105m","\x1B[49m"),bgCyanBright:F("\x1B[106m","\x1B[49m"),bgWhiteBright:F("\x1B[107m","\x1B[49m")}};return _.exports=D(),_.exports.createColors=D,_.exports}var U=yD();const C=xD(U);function wD({onlyFirst:e=!1}={}){const u=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp(u,e?void 0:"g")}const SD=wD();function Y(e){if(typeof e!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);return e.replace(SD,"")}function Z(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var H={exports:{}};(function(e){var u={};e.exports=u,u.eastAsianWidth=function(r){var i=r.charCodeAt(0),s=r.length==2?r.charCodeAt(1):0,D=i;return 55296<=i&&i<=56319&&56320<=s&&s<=57343&&(i&=1023,s&=1023,D=i<<10|s,D+=65536),D==12288||65281<=D&&D<=65376||65504<=D&&D<=65510?"F":D==8361||65377<=D&&D<=65470||65474<=D&&D<=65479||65482<=D&&D<=65487||65490<=D&&D<=65495||65498<=D&&D<=65500||65512<=D&&D<=65518?"H":4352<=D&&D<=4447||4515<=D&&D<=4519||4602<=D&&D<=4607||9001<=D&&D<=9002||11904<=D&&D<=11929||11931<=D&&D<=12019||12032<=D&&D<=12245||12272<=D&&D<=12283||12289<=D&&D<=12350||12353<=D&&D<=12438||12441<=D&&D<=12543||12549<=D&&D<=12589||12593<=D&&D<=12686||12688<=D&&D<=12730||12736<=D&&D<=12771||12784<=D&&D<=12830||12832<=D&&D<=12871||12880<=D&&D<=13054||13056<=D&&D<=19903||19968<=D&&D<=42124||42128<=D&&D<=42182||43360<=D&&D<=43388||44032<=D&&D<=55203||55216<=D&&D<=55238||55243<=D&&D<=55291||63744<=D&&D<=64255||65040<=D&&D<=65049||65072<=D&&D<=65106||65108<=D&&D<=65126||65128<=D&&D<=65131||110592<=D&&D<=110593||127488<=D&&D<=127490||127504<=D&&D<=127546||127552<=D&&D<=127560||127568<=D&&D<=127569||131072<=D&&D<=194367||177984<=D&&D<=196605||196608<=D&&D<=262141?"W":32<=D&&D<=126||162<=D&&D<=163||165<=D&&D<=166||D==172||D==175||10214<=D&&D<=10221||10629<=D&&D<=10630?"Na":D==161||D==164||167<=D&&D<=168||D==170||173<=D&&D<=174||176<=D&&D<=180||182<=D&&D<=186||188<=D&&D<=191||D==198||D==208||215<=D&&D<=216||222<=D&&D<=225||D==230||232<=D&&D<=234||236<=D&&D<=237||D==240||242<=D&&D<=243||247<=D&&D<=250||D==252||D==254||D==257||D==273||D==275||D==283||294<=D&&D<=295||D==299||305<=D&&D<=307||D==312||319<=D&&D<=322||D==324||328<=D&&D<=331||D==333||338<=D&&D<=339||358<=D&&D<=359||D==363||D==462||D==464||D==466||D==468||D==470||D==472||D==474||D==476||D==593||D==609||D==708||D==711||713<=D&&D<=715||D==717||D==720||728<=D&&D<=731||D==733||D==735||768<=D&&D<=879||913<=D&&D<=929||931<=D&&D<=937||945<=D&&D<=961||963<=D&&D<=969||D==1025||1040<=D&&D<=1103||D==1105||D==8208||8211<=D&&D<=8214||8216<=D&&D<=8217||8220<=D&&D<=8221||8224<=D&&D<=8226||8228<=D&&D<=8231||D==8240||8242<=D&&D<=8243||D==8245||D==8251||D==8254||D==8308||D==8319||8321<=D&&D<=8324||D==8364||D==8451||D==8453||D==8457||D==8467||D==8470||8481<=D&&D<=8482||D==8486||D==8491||8531<=D&&D<=8532||8539<=D&&D<=8542||8544<=D&&D<=8555||8560<=D&&D<=8569||D==8585||8592<=D&&D<=8601||8632<=D&&D<=8633||D==8658||D==8660||D==8679||D==8704||8706<=D&&D<=8707||8711<=D&&D<=8712||D==8715||D==8719||D==8721||D==8725||D==8730||8733<=D&&D<=8736||D==8739||D==8741||8743<=D&&D<=8748||D==8750||8756<=D&&D<=8759||8764<=D&&D<=8765||D==8776||D==8780||D==8786||8800<=D&&D<=8801||8804<=D&&D<=8807||8810<=D&&D<=8811||8814<=D&&D<=8815||8834<=D&&D<=8835||8838<=D&&D<=8839||D==8853||D==8857||D==8869||D==8895||D==8978||9312<=D&&D<=9449||9451<=D&&D<=9547||9552<=D&&D<=9587||9600<=D&&D<=9615||9618<=D&&D<=9621||9632<=D&&D<=9633||9635<=D&&D<=9641||9650<=D&&D<=9651||9654<=D&&D<=9655||9660<=D&&D<=9661||9664<=D&&D<=9665||9670<=D&&D<=9672||D==9675||9678<=D&&D<=9681||9698<=D&&D<=9701||D==9711||9733<=D&&D<=9734||D==9737||9742<=D&&D<=9743||9748<=D&&D<=9749||D==9756||D==9758||D==9792||D==9794||9824<=D&&D<=9825||9827<=D&&D<=9829||9831<=D&&D<=9834||9836<=D&&D<=9837||D==9839||9886<=D&&D<=9887||9918<=D&&D<=9919||9924<=D&&D<=9933||9935<=D&&D<=9953||D==9955||9960<=D&&D<=9983||D==10045||D==10071||10102<=D&&D<=10111||11093<=D&&D<=11097||12872<=D&&D<=12879||57344<=D&&D<=63743||65024<=D&&D<=65039||D==65533||127232<=D&&D<=127242||127248<=D&&D<=127277||127280<=D&&D<=127337||127344<=D&&D<=127386||917760<=D&&D<=917999||983040<=D&&D<=1048573||1048576<=D&&D<=1114109?"A":"N"},u.characterLength=function(r){var i=this.eastAsianWidth(r);return i=="F"||i=="W"||i=="A"?2:1};function t(r){return r.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g)||[]}u.length=function(r){for(var i=t(r),s=0,D=0;D<i.length;D++)s=s+this.characterLength(i[D]);return s},u.slice=function(r,i,s){textLen=u.length(r),i=i||0,s=s||1,i<0&&(i=textLen+i),s<0&&(s=textLen+s);for(var D="",n=0,F=t(r),a=0;a<F.length;a++){var o=F[a],l=u.length(o);if(n>=i-(l==2?1:0))if(n+l<=s)D+=o;else break;n+=l}return D}})(H);var _D=H.exports;const TD=Z(_D);var kD=function(){return/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g};const jD=Z(kD);function $(e,u={}){if(typeof e!="string"||e.length===0||(u={ambiguousIsNarrow:!0,...u},e=Y(e),e.length===0))return 0;e=e.replace(jD()," ");const t=u.ambiguousIsNarrow?1:2;let r=0;for(const i of e){const s=i.codePointAt(0);if(!(s<=31||s>=127&&s<=159||s>=768&&s<=879))switch(TD.eastAsianWidth(i)){case"F":case"W":r+=2;break;case"A":r+=t;break;default:r+=1}}return r}const P=10,Q=(e=0)=>u=>`\x1B[${u+e}m`,X=(e=0)=>u=>`\x1B[${38+e};5;${u}m`,DD=(e=0)=>(u,t,r)=>`\x1B[${38+e};2;${u};${t};${r}m`,E={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};Object.keys(E.modifier);const MD=Object.keys(E.color),OD=Object.keys(E.bgColor);[...MD,...OD];function RD(){const e=new Map;for(const[u,t]of Object.entries(E)){for(const[r,i]of Object.entries(t))E[r]={open:`\x1B[${i[0]}m`,close:`\x1B[${i[1]}m`},t[r]=E[r],e.set(i[0],i[1]);Object.defineProperty(E,u,{value:t,enumerable:!1})}return Object.defineProperty(E,"codes",{value:e,enumerable:!1}),E.color.close="\x1B[39m",E.bgColor.close="\x1B[49m",E.color.ansi=Q(),E.color.ansi256=X(),E.color.ansi16m=DD(),E.bgColor.ansi=Q(P),E.bgColor.ansi256=X(P),E.bgColor.ansi16m=DD(P),Object.defineProperties(E,{rgbToAnsi256:{value:(u,t,r)=>u===t&&t===r?u<8?16:u>248?231:Math.round((u-8)/247*24)+232:16+36*Math.round(u/255*5)+6*Math.round(t/255*5)+Math.round(r/255*5),enumerable:!1},hexToRgb:{value:u=>{const t=/[a-f\d]{6}|[a-f\d]{3}/i.exec(u.toString(16));if(!t)return[0,0,0];let[r]=t;r.length===3&&(r=[...r].map(s=>s+s).join(""));const i=Number.parseInt(r,16);return[i>>16&255,i>>8&255,i&255]},enumerable:!1},hexToAnsi256:{value:u=>E.rgbToAnsi256(...E.hexToRgb(u)),enumerable:!1},ansi256ToAnsi:{value:u=>{if(u<8)return 30+u;if(u<16)return 90+(u-8);let t,r,i;if(u>=232)t=((u-232)*10+8)/255,r=t,i=t;else{u-=16;const n=u%36;t=Math.floor(u/36)/5,r=Math.floor(n/6)/5,i=n%6/5}const s=Math.max(t,r,i)*2;if(s===0)return 30;let D=30+(Math.round(i)<<2|Math.round(r)<<1|Math.round(t));return s===2&&(D+=60),D},enumerable:!1},rgbToAnsi:{value:(u,t,r)=>E.ansi256ToAnsi(E.rgbToAnsi256(u,t,r)),enumerable:!1},hexToAnsi:{value:u=>E.ansi256ToAnsi(E.hexToAnsi256(u)),enumerable:!1}}),E}const PD=RD(),T=new Set(["\x1B","\x9B"]),ID=39,I="\x07",uD="[",LD="]",eD="m",L=`${LD}8;;`,tD=e=>`${T.values().next().value}${uD}${e}${eD}`,rD=e=>`${T.values().next().value}${L}${e}${I}`,ND=e=>e.split(" ").map(u=>$(u)),N=(e,u,t)=>{const r=[...u];let i=!1,s=!1,D=$(Y(e[e.length-1]));for(const[n,F]of r.entries()){const a=$(F);if(D+a<=t?e[e.length-1]+=F:(e.push(F),D=0),T.has(F)&&(i=!0,s=r.slice(n+1).join("").startsWith(L)),i){s?F===I&&(i=!1,s=!1):F===eD&&(i=!1);continue}D+=a,D===t&&n<r.length-1&&(e.push(""),D=0)}!D&&e[e.length-1].length>0&&e.length>1&&(e[e.length-2]+=e.pop())},WD=e=>{const u=e.split(" ");let t=u.length;for(;t>0&&!($(u[t-1])>0);)t--;return t===u.length?e:u.slice(0,t).join(" ")+u.slice(t).join("")},VD=(e,u,t={})=>{if(t.trim!==!1&&e.trim()==="")return"";let r="",i,s;const D=ND(e);let n=[""];for(const[a,o]of e.split(" ").entries()){t.trim!==!1&&(n[n.length-1]=n[n.length-1].trimStart());let l=$(n[n.length-1]);if(a!==0&&(l>=u&&(t.wordWrap===!1||t.trim===!1)&&(n.push(""),l=0),(l>0||t.trim===!1)&&(n[n.length-1]+=" ",l++)),t.hard&&D[a]>u){const c=u-l,h=1+Math.floor((D[a]-c-1)/u);Math.floor((D[a]-1)/u)<h&&n.push(""),N(n,o,u);continue}if(l+D[a]>u&&l>0&&D[a]>0){if(t.wordWrap===!1&&l<u){N(n,o,u);continue}n.push("")}if(l+D[a]>u&&t.wordWrap===!1){N(n,o,u);continue}n[n.length-1]+=o}t.trim!==!1&&(n=n.map(a=>WD(a)));const F=[...n.join(`
1
+ import"node:util";import f,{stdin as mD,stdout as gD}from"node:process";import G from"node:readline";import{Writable as pD}from"node:stream";import m from"node:fs";import b from"node:path";import{fileURLToPath as fD}from"node:url";import{promises as bD}from"fs";import dD from"path";function O(e){return e==null?[]:Array.isArray(e)?e:[e]}function AD(e,u,t,r){var i,s=e[u],D=~r.string.indexOf(u)?t==null||t===!0?"":String(t):typeof t=="boolean"?t:~r.boolean.indexOf(u)?t==="false"?!1:t==="true"||(e._.push((i=+t,i*0===0?i:t)),!!t):(i=+t,i*0===0?i:t);e[u]=s==null?D:Array.isArray(s)?s.concat(D):[s,D]}function vD(e,u){e=e||[],u=u||{};var t,r,i,s,D,n={_:[]},F=0,a=0,o=0,l=e.length;const c=u.alias!==void 0,h=u.unknown!==void 0,A=u.default!==void 0;if(u.alias=u.alias||{},u.string=O(u.string),u.boolean=O(u.boolean),c)for(t in u.alias)for(r=u.alias[t]=O(u.alias[t]),F=0;F<r.length;F++)(u.alias[r[F]]=r.concat(t)).splice(F,1);for(F=u.boolean.length;F-- >0;)for(r=u.alias[u.boolean[F]]||[],a=r.length;a-- >0;)u.boolean.push(r[a]);for(F=u.string.length;F-- >0;)for(r=u.alias[u.string[F]]||[],a=r.length;a-- >0;)u.string.push(r[a]);if(A){for(t in u.default)if(s=typeof u.default[t],r=u.alias[t]=u.alias[t]||[],u[s]!==void 0)for(u[s].push(t),F=0;F<r.length;F++)u[s].push(r[F])}const v=h?Object.keys(u.alias):[];for(F=0;F<l;F++){if(i=e[F],i==="--"){n._=n._.concat(e.slice(++F));break}for(a=0;a<i.length&&i.charCodeAt(a)===45;a++);if(a===0)n._.push(i);else if(i.substring(a,a+3)==="no-"){if(s=i.substring(a+3),h&&!~v.indexOf(s))return u.unknown(i);n[s]=!1}else{for(o=a+1;o<i.length&&i.charCodeAt(o)!==61;o++);for(s=i.substring(a,o),D=i.substring(++o)||F+1===l||(""+e[F+1]).charCodeAt(0)===45||e[++F],r=a===2?[s]:s,o=0;o<r.length;o++){if(s=r[o],h&&!~v.indexOf(s))return u.unknown("-".repeat(a)+s);AD(n,s,o+1<r.length||D,u)}}}if(A)for(t in u.default)n[t]===void 0&&(n[t]=u.default[t]);if(c)for(t in n)for(r=u.alias[t]||[];r.length>0;)n[r.shift()]=n[t];return n}function xD(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var R,J;function $D(){if(J)return R;J=1;const e="\x1B",u=`${e}[`,t="\x07",r={to(D,n){return n?`${u}${n+1};${D+1}H`:`${u}${D+1}G`},move(D,n){let F="";return D<0?F+=`${u}${-D}D`:D>0&&(F+=`${u}${D}C`),n<0?F+=`${u}${-n}A`:n>0&&(F+=`${u}${n}B`),F},up:(D=1)=>`${u}${D}A`,down:(D=1)=>`${u}${D}B`,forward:(D=1)=>`${u}${D}C`,backward:(D=1)=>`${u}${D}D`,nextLine:(D=1)=>`${u}E`.repeat(D),prevLine:(D=1)=>`${u}F`.repeat(D),left:`${u}G`,hide:`${u}?25l`,show:`${u}?25h`,save:`${e}7`,restore:`${e}8`},i={up:(D=1)=>`${u}S`.repeat(D),down:(D=1)=>`${u}T`.repeat(D)},s={screen:`${u}2J`,up:(D=1)=>`${u}1J`.repeat(D),down:(D=1)=>`${u}J`.repeat(D),line:`${u}2K`,lineEnd:`${u}K`,lineStart:`${u}1K`,lines(D){let n="";for(let F=0;F<D;F++)n+=this.line+(F<D-1?r.up():"");return D&&(n+=r.left),n}};return R={cursor:r,scroll:i,erase:s,beep:t},R}var d=$D(),_={exports:{}},Y;function yD(){if(Y)return _.exports;Y=1;let e=process||{},u=e.argv||[],t=e.env||{},r=!(t.NO_COLOR||u.includes("--no-color"))&&(!!t.FORCE_COLOR||u.includes("--color")||e.platform==="win32"||(e.stdout||{}).isTTY&&t.TERM!=="dumb"||!!t.CI),i=(n,F,a=n)=>o=>{let l=""+o,c=l.indexOf(F,n.length);return~c?n+s(l,F,a,c)+F:n+l+F},s=(n,F,a,o)=>{let l="",c=0;do l+=n.substring(c,o)+a,c=o+F.length,o=n.indexOf(F,c);while(~o);return l+n.substring(c)},D=(n=r)=>{let F=n?i:()=>String;return{isColorSupported:n,reset:F("\x1B[0m","\x1B[0m"),bold:F("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:F("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:F("\x1B[3m","\x1B[23m"),underline:F("\x1B[4m","\x1B[24m"),inverse:F("\x1B[7m","\x1B[27m"),hidden:F("\x1B[8m","\x1B[28m"),strikethrough:F("\x1B[9m","\x1B[29m"),black:F("\x1B[30m","\x1B[39m"),red:F("\x1B[31m","\x1B[39m"),green:F("\x1B[32m","\x1B[39m"),yellow:F("\x1B[33m","\x1B[39m"),blue:F("\x1B[34m","\x1B[39m"),magenta:F("\x1B[35m","\x1B[39m"),cyan:F("\x1B[36m","\x1B[39m"),white:F("\x1B[37m","\x1B[39m"),gray:F("\x1B[90m","\x1B[39m"),bgBlack:F("\x1B[40m","\x1B[49m"),bgRed:F("\x1B[41m","\x1B[49m"),bgGreen:F("\x1B[42m","\x1B[49m"),bgYellow:F("\x1B[43m","\x1B[49m"),bgBlue:F("\x1B[44m","\x1B[49m"),bgMagenta:F("\x1B[45m","\x1B[49m"),bgCyan:F("\x1B[46m","\x1B[49m"),bgWhite:F("\x1B[47m","\x1B[49m"),blackBright:F("\x1B[90m","\x1B[39m"),redBright:F("\x1B[91m","\x1B[39m"),greenBright:F("\x1B[92m","\x1B[39m"),yellowBright:F("\x1B[93m","\x1B[39m"),blueBright:F("\x1B[94m","\x1B[39m"),magentaBright:F("\x1B[95m","\x1B[39m"),cyanBright:F("\x1B[96m","\x1B[39m"),whiteBright:F("\x1B[97m","\x1B[39m"),bgBlackBright:F("\x1B[100m","\x1B[49m"),bgRedBright:F("\x1B[101m","\x1B[49m"),bgGreenBright:F("\x1B[102m","\x1B[49m"),bgYellowBright:F("\x1B[103m","\x1B[49m"),bgBlueBright:F("\x1B[104m","\x1B[49m"),bgMagentaBright:F("\x1B[105m","\x1B[49m"),bgCyanBright:F("\x1B[106m","\x1B[49m"),bgWhiteBright:F("\x1B[107m","\x1B[49m")}};return _.exports=D(),_.exports.createColors=D,_.exports}var q=yD();const C=xD(q);function wD({onlyFirst:e=!1}={}){const u=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp(u,e?void 0:"g")}const SD=wD();function U(e){if(typeof e!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);return e.replace(SD,"")}function Z(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var H={exports:{}};(function(e){var u={};e.exports=u,u.eastAsianWidth=function(r){var i=r.charCodeAt(0),s=r.length==2?r.charCodeAt(1):0,D=i;return 55296<=i&&i<=56319&&56320<=s&&s<=57343&&(i&=1023,s&=1023,D=i<<10|s,D+=65536),D==12288||65281<=D&&D<=65376||65504<=D&&D<=65510?"F":D==8361||65377<=D&&D<=65470||65474<=D&&D<=65479||65482<=D&&D<=65487||65490<=D&&D<=65495||65498<=D&&D<=65500||65512<=D&&D<=65518?"H":4352<=D&&D<=4447||4515<=D&&D<=4519||4602<=D&&D<=4607||9001<=D&&D<=9002||11904<=D&&D<=11929||11931<=D&&D<=12019||12032<=D&&D<=12245||12272<=D&&D<=12283||12289<=D&&D<=12350||12353<=D&&D<=12438||12441<=D&&D<=12543||12549<=D&&D<=12589||12593<=D&&D<=12686||12688<=D&&D<=12730||12736<=D&&D<=12771||12784<=D&&D<=12830||12832<=D&&D<=12871||12880<=D&&D<=13054||13056<=D&&D<=19903||19968<=D&&D<=42124||42128<=D&&D<=42182||43360<=D&&D<=43388||44032<=D&&D<=55203||55216<=D&&D<=55238||55243<=D&&D<=55291||63744<=D&&D<=64255||65040<=D&&D<=65049||65072<=D&&D<=65106||65108<=D&&D<=65126||65128<=D&&D<=65131||110592<=D&&D<=110593||127488<=D&&D<=127490||127504<=D&&D<=127546||127552<=D&&D<=127560||127568<=D&&D<=127569||131072<=D&&D<=194367||177984<=D&&D<=196605||196608<=D&&D<=262141?"W":32<=D&&D<=126||162<=D&&D<=163||165<=D&&D<=166||D==172||D==175||10214<=D&&D<=10221||10629<=D&&D<=10630?"Na":D==161||D==164||167<=D&&D<=168||D==170||173<=D&&D<=174||176<=D&&D<=180||182<=D&&D<=186||188<=D&&D<=191||D==198||D==208||215<=D&&D<=216||222<=D&&D<=225||D==230||232<=D&&D<=234||236<=D&&D<=237||D==240||242<=D&&D<=243||247<=D&&D<=250||D==252||D==254||D==257||D==273||D==275||D==283||294<=D&&D<=295||D==299||305<=D&&D<=307||D==312||319<=D&&D<=322||D==324||328<=D&&D<=331||D==333||338<=D&&D<=339||358<=D&&D<=359||D==363||D==462||D==464||D==466||D==468||D==470||D==472||D==474||D==476||D==593||D==609||D==708||D==711||713<=D&&D<=715||D==717||D==720||728<=D&&D<=731||D==733||D==735||768<=D&&D<=879||913<=D&&D<=929||931<=D&&D<=937||945<=D&&D<=961||963<=D&&D<=969||D==1025||1040<=D&&D<=1103||D==1105||D==8208||8211<=D&&D<=8214||8216<=D&&D<=8217||8220<=D&&D<=8221||8224<=D&&D<=8226||8228<=D&&D<=8231||D==8240||8242<=D&&D<=8243||D==8245||D==8251||D==8254||D==8308||D==8319||8321<=D&&D<=8324||D==8364||D==8451||D==8453||D==8457||D==8467||D==8470||8481<=D&&D<=8482||D==8486||D==8491||8531<=D&&D<=8532||8539<=D&&D<=8542||8544<=D&&D<=8555||8560<=D&&D<=8569||D==8585||8592<=D&&D<=8601||8632<=D&&D<=8633||D==8658||D==8660||D==8679||D==8704||8706<=D&&D<=8707||8711<=D&&D<=8712||D==8715||D==8719||D==8721||D==8725||D==8730||8733<=D&&D<=8736||D==8739||D==8741||8743<=D&&D<=8748||D==8750||8756<=D&&D<=8759||8764<=D&&D<=8765||D==8776||D==8780||D==8786||8800<=D&&D<=8801||8804<=D&&D<=8807||8810<=D&&D<=8811||8814<=D&&D<=8815||8834<=D&&D<=8835||8838<=D&&D<=8839||D==8853||D==8857||D==8869||D==8895||D==8978||9312<=D&&D<=9449||9451<=D&&D<=9547||9552<=D&&D<=9587||9600<=D&&D<=9615||9618<=D&&D<=9621||9632<=D&&D<=9633||9635<=D&&D<=9641||9650<=D&&D<=9651||9654<=D&&D<=9655||9660<=D&&D<=9661||9664<=D&&D<=9665||9670<=D&&D<=9672||D==9675||9678<=D&&D<=9681||9698<=D&&D<=9701||D==9711||9733<=D&&D<=9734||D==9737||9742<=D&&D<=9743||9748<=D&&D<=9749||D==9756||D==9758||D==9792||D==9794||9824<=D&&D<=9825||9827<=D&&D<=9829||9831<=D&&D<=9834||9836<=D&&D<=9837||D==9839||9886<=D&&D<=9887||9918<=D&&D<=9919||9924<=D&&D<=9933||9935<=D&&D<=9953||D==9955||9960<=D&&D<=9983||D==10045||D==10071||10102<=D&&D<=10111||11093<=D&&D<=11097||12872<=D&&D<=12879||57344<=D&&D<=63743||65024<=D&&D<=65039||D==65533||127232<=D&&D<=127242||127248<=D&&D<=127277||127280<=D&&D<=127337||127344<=D&&D<=127386||917760<=D&&D<=917999||983040<=D&&D<=1048573||1048576<=D&&D<=1114109?"A":"N"},u.characterLength=function(r){var i=this.eastAsianWidth(r);return i=="F"||i=="W"||i=="A"?2:1};function t(r){return r.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g)||[]}u.length=function(r){for(var i=t(r),s=0,D=0;D<i.length;D++)s=s+this.characterLength(i[D]);return s},u.slice=function(r,i,s){textLen=u.length(r),i=i||0,s=s||1,i<0&&(i=textLen+i),s<0&&(s=textLen+s);for(var D="",n=0,F=t(r),a=0;a<F.length;a++){var o=F[a],l=u.length(o);if(n>=i-(l==2?1:0))if(n+l<=s)D+=o;else break;n+=l}return D}})(H);var _D=H.exports;const TD=Z(_D);var kD=function(){return/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g};const MD=Z(kD);function $(e,u={}){if(typeof e!="string"||e.length===0||(u={ambiguousIsNarrow:!0,...u},e=U(e),e.length===0))return 0;e=e.replace(MD()," ");const t=u.ambiguousIsNarrow?1:2;let r=0;for(const i of e){const s=i.codePointAt(0);if(!(s<=31||s>=127&&s<=159||s>=768&&s<=879))switch(TD.eastAsianWidth(i)){case"F":case"W":r+=2;break;case"A":r+=t;break;default:r+=1}}return r}const P=10,Q=(e=0)=>u=>`\x1B[${u+e}m`,X=(e=0)=>u=>`\x1B[${38+e};5;${u}m`,DD=(e=0)=>(u,t,r)=>`\x1B[${38+e};2;${u};${t};${r}m`,E={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};Object.keys(E.modifier);const jD=Object.keys(E.color),OD=Object.keys(E.bgColor);[...jD,...OD];function RD(){const e=new Map;for(const[u,t]of Object.entries(E)){for(const[r,i]of Object.entries(t))E[r]={open:`\x1B[${i[0]}m`,close:`\x1B[${i[1]}m`},t[r]=E[r],e.set(i[0],i[1]);Object.defineProperty(E,u,{value:t,enumerable:!1})}return Object.defineProperty(E,"codes",{value:e,enumerable:!1}),E.color.close="\x1B[39m",E.bgColor.close="\x1B[49m",E.color.ansi=Q(),E.color.ansi256=X(),E.color.ansi16m=DD(),E.bgColor.ansi=Q(P),E.bgColor.ansi256=X(P),E.bgColor.ansi16m=DD(P),Object.defineProperties(E,{rgbToAnsi256:{value:(u,t,r)=>u===t&&t===r?u<8?16:u>248?231:Math.round((u-8)/247*24)+232:16+36*Math.round(u/255*5)+6*Math.round(t/255*5)+Math.round(r/255*5),enumerable:!1},hexToRgb:{value:u=>{const t=/[a-f\d]{6}|[a-f\d]{3}/i.exec(u.toString(16));if(!t)return[0,0,0];let[r]=t;r.length===3&&(r=[...r].map(s=>s+s).join(""));const i=Number.parseInt(r,16);return[i>>16&255,i>>8&255,i&255]},enumerable:!1},hexToAnsi256:{value:u=>E.rgbToAnsi256(...E.hexToRgb(u)),enumerable:!1},ansi256ToAnsi:{value:u=>{if(u<8)return 30+u;if(u<16)return 90+(u-8);let t,r,i;if(u>=232)t=((u-232)*10+8)/255,r=t,i=t;else{u-=16;const n=u%36;t=Math.floor(u/36)/5,r=Math.floor(n/6)/5,i=n%6/5}const s=Math.max(t,r,i)*2;if(s===0)return 30;let D=30+(Math.round(i)<<2|Math.round(r)<<1|Math.round(t));return s===2&&(D+=60),D},enumerable:!1},rgbToAnsi:{value:(u,t,r)=>E.ansi256ToAnsi(E.rgbToAnsi256(u,t,r)),enumerable:!1},hexToAnsi:{value:u=>E.ansi256ToAnsi(E.hexToAnsi256(u)),enumerable:!1}}),E}const PD=RD(),T=new Set(["\x1B","\x9B"]),ID=39,I="\x07",uD="[",LD="]",eD="m",L=`${LD}8;;`,tD=e=>`${T.values().next().value}${uD}${e}${eD}`,rD=e=>`${T.values().next().value}${L}${e}${I}`,ND=e=>e.split(" ").map(u=>$(u)),N=(e,u,t)=>{const r=[...u];let i=!1,s=!1,D=$(U(e[e.length-1]));for(const[n,F]of r.entries()){const a=$(F);if(D+a<=t?e[e.length-1]+=F:(e.push(F),D=0),T.has(F)&&(i=!0,s=r.slice(n+1).join("").startsWith(L)),i){s?F===I&&(i=!1,s=!1):F===eD&&(i=!1);continue}D+=a,D===t&&n<r.length-1&&(e.push(""),D=0)}!D&&e[e.length-1].length>0&&e.length>1&&(e[e.length-2]+=e.pop())},WD=e=>{const u=e.split(" ");let t=u.length;for(;t>0&&!($(u[t-1])>0);)t--;return t===u.length?e:u.slice(0,t).join(" ")+u.slice(t).join("")},VD=(e,u,t={})=>{if(t.trim!==!1&&e.trim()==="")return"";let r="",i,s;const D=ND(e);let n=[""];for(const[a,o]of e.split(" ").entries()){t.trim!==!1&&(n[n.length-1]=n[n.length-1].trimStart());let l=$(n[n.length-1]);if(a!==0&&(l>=u&&(t.wordWrap===!1||t.trim===!1)&&(n.push(""),l=0),(l>0||t.trim===!1)&&(n[n.length-1]+=" ",l++)),t.hard&&D[a]>u){const c=u-l,h=1+Math.floor((D[a]-c-1)/u);Math.floor((D[a]-1)/u)<h&&n.push(""),N(n,o,u);continue}if(l+D[a]>u&&l>0&&D[a]>0){if(t.wordWrap===!1&&l<u){N(n,o,u);continue}n.push("")}if(l+D[a]>u&&t.wordWrap===!1){N(n,o,u);continue}n[n.length-1]+=o}t.trim!==!1&&(n=n.map(a=>WD(a)));const F=[...n.join(`
2
2
  `)];for(const[a,o]of F.entries()){if(r+=o,T.has(o)){const{groups:c}=new RegExp(`(?:\\${uD}(?<code>\\d+)m|\\${L}(?<uri>.*)${I})`).exec(F.slice(a).join(""))||{groups:{}};if(c.code!==void 0){const h=Number.parseFloat(c.code);i=h===ID?void 0:h}else c.uri!==void 0&&(s=c.uri.length===0?void 0:c.uri)}const l=PD.codes.get(Number(i));F[a+1]===`
3
3
  `?(s&&(r+=rD("")),i&&l&&(r+=tD(l))):o===`
4
4
  `&&(i&&l&&(r+=tD(i)),s&&(r+=rD(s)))}return r};function iD(e,u,t){return String(e).normalize().replace(/\r\n/g,`
@@ -6,12 +6,12 @@ import"node:util";import f,{stdin as mD,stdout as gD}from"node:process";import G
6
6
  `).map(r=>VD(r,u,t)).join(`
7
7
  `)}const zD=["up","down","left","right","space","enter","cancel"],k={actions:new Set(zD),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["","cancel"],["escape","cancel"]])};function FD(e,u){if(typeof e=="string")return k.aliases.get(e)===u;for(const t of e)if(t!==void 0&&FD(t,u))return!0;return!1}function KD(e,u){if(e===u)return;const t=e.split(`
8
8
  `),r=u.split(`
9
- `),i=[];for(let s=0;s<Math.max(t.length,r.length);s++)t[s]!==r[s]&&i.push(s);return i}globalThis.process.platform.startsWith("win");const W=Symbol("clack:cancel");function j(e){return e===W}function M(e,u){const t=e;t.isTTY&&t.setRawMode(u)}var GD=Object.defineProperty,JD=(e,u,t)=>u in e?GD(e,u,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[u]=t,g=(e,u,t)=>(JD(e,typeof u!="symbol"?u+"":u,t),t);class sD{constructor(u,t=!0){g(this,"input"),g(this,"output"),g(this,"_abortSignal"),g(this,"rl"),g(this,"opts"),g(this,"_render"),g(this,"_track",!1),g(this,"_prevFrame",""),g(this,"_subscribers",new Map),g(this,"_cursor",0),g(this,"state","initial"),g(this,"error",""),g(this,"value");const{input:r=mD,output:i=gD,render:s,signal:D,...n}=u;this.opts=n,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=s.bind(this),this._track=t,this._abortSignal=D,this.input=r,this.output=i}unsubscribe(){this._subscribers.clear()}setSubscriber(u,t){const r=this._subscribers.get(u)??[];r.push(t),this._subscribers.set(u,r)}on(u,t){this.setSubscriber(u,{cb:t})}once(u,t){this.setSubscriber(u,{cb:t,once:!0})}emit(u,...t){const r=this._subscribers.get(u)??[],i=[];for(const s of r)s.cb(...t),s.once&&i.push(()=>r.splice(r.indexOf(s),1));for(const s of i)s()}prompt(){return new Promise((u,t)=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state="cancel",this.close(),u(W);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close()},{once:!0})}const r=new pD(0);r._write=(i,s,D)=>{this._track&&(this.value=this.rl?.line.replace(/\t/g,""),this._cursor=this.rl?.cursor??0,this.emit("value",this.value)),D()},this.input.pipe(r),this.rl=G.createInterface({input:this.input,output:r,tabSize:2,prompt:"",escapeCodeTimeout:50}),G.emitKeypressEvents(this.input,this.rl),this.rl.prompt(),this.opts.initialValue!==void 0&&this._track&&this.rl.write(this.opts.initialValue),this.input.on("keypress",this.onKeypress),M(this.input,!0),this.output.on("resize",this.render),this.render(),this.once("submit",()=>{this.output.write(d.cursor.show),this.output.off("resize",this.render),M(this.input,!1),u(this.value)}),this.once("cancel",()=>{this.output.write(d.cursor.show),this.output.off("resize",this.render),M(this.input,!1),u(W)})})}onKeypress(u,t){if(this.state==="error"&&(this.state="active"),t?.name&&(!this._track&&k.aliases.has(t.name)&&this.emit("cursor",k.aliases.get(t.name)),k.actions.has(t.name)&&this.emit("cursor",t.name)),u&&(u.toLowerCase()==="y"||u.toLowerCase()==="n")&&this.emit("confirm",u.toLowerCase()==="y"),u===" "&&this.opts.placeholder&&(this.value||(this.rl?.write(this.opts.placeholder),this.emit("value",this.opts.placeholder))),u&&this.emit("key",u.toLowerCase()),t?.name==="return"){if(this.opts.validate){const r=this.opts.validate(this.value);r&&(this.error=r instanceof Error?r.message:r,this.state="error",this.rl?.write(this.value))}this.state!=="error"&&(this.state="submit")}FD([u,t?.name,t?.sequence],"cancel")&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close()}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
10
- `),M(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){const u=iD(this._prevFrame,process.stdout.columns,{hard:!0}).split(`
9
+ `),i=[];for(let s=0;s<Math.max(t.length,r.length);s++)t[s]!==r[s]&&i.push(s);return i}globalThis.process.platform.startsWith("win");const W=Symbol("clack:cancel");function M(e){return e===W}function j(e,u){const t=e;t.isTTY&&t.setRawMode(u)}var GD=Object.defineProperty,JD=(e,u,t)=>u in e?GD(e,u,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[u]=t,g=(e,u,t)=>(JD(e,typeof u!="symbol"?u+"":u,t),t);class sD{constructor(u,t=!0){g(this,"input"),g(this,"output"),g(this,"_abortSignal"),g(this,"rl"),g(this,"opts"),g(this,"_render"),g(this,"_track",!1),g(this,"_prevFrame",""),g(this,"_subscribers",new Map),g(this,"_cursor",0),g(this,"state","initial"),g(this,"error",""),g(this,"value");const{input:r=mD,output:i=gD,render:s,signal:D,...n}=u;this.opts=n,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=s.bind(this),this._track=t,this._abortSignal=D,this.input=r,this.output=i}unsubscribe(){this._subscribers.clear()}setSubscriber(u,t){const r=this._subscribers.get(u)??[];r.push(t),this._subscribers.set(u,r)}on(u,t){this.setSubscriber(u,{cb:t})}once(u,t){this.setSubscriber(u,{cb:t,once:!0})}emit(u,...t){const r=this._subscribers.get(u)??[],i=[];for(const s of r)s.cb(...t),s.once&&i.push(()=>r.splice(r.indexOf(s),1));for(const s of i)s()}prompt(){return new Promise((u,t)=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state="cancel",this.close(),u(W);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close()},{once:!0})}const r=new pD;r._write=(i,s,D)=>{this._track&&(this.value=this.rl?.line.replace(/\t/g,""),this._cursor=this.rl?.cursor??0,this.emit("value",this.value)),D()},this.input.pipe(r),this.rl=G.createInterface({input:this.input,output:r,tabSize:2,prompt:"",escapeCodeTimeout:50,terminal:!0}),G.emitKeypressEvents(this.input,this.rl),this.rl.prompt(),this.opts.initialValue!==void 0&&this._track&&this.rl.write(this.opts.initialValue),this.input.on("keypress",this.onKeypress),j(this.input,!0),this.output.on("resize",this.render),this.render(),this.once("submit",()=>{this.output.write(d.cursor.show),this.output.off("resize",this.render),j(this.input,!1),u(this.value)}),this.once("cancel",()=>{this.output.write(d.cursor.show),this.output.off("resize",this.render),j(this.input,!1),u(W)})})}onKeypress(u,t){if(this.state==="error"&&(this.state="active"),t?.name&&(!this._track&&k.aliases.has(t.name)&&this.emit("cursor",k.aliases.get(t.name)),k.actions.has(t.name)&&this.emit("cursor",t.name)),u&&(u.toLowerCase()==="y"||u.toLowerCase()==="n")&&this.emit("confirm",u.toLowerCase()==="y"),u===" "&&this.opts.placeholder&&(this.value||(this.rl?.write(this.opts.placeholder),this.emit("value",this.opts.placeholder))),u&&this.emit("key",u.toLowerCase()),t?.name==="return"){if(this.opts.validate){const r=this.opts.validate(this.value);r&&(this.error=r instanceof Error?r.message:r,this.state="error",this.rl?.write(this.value))}this.state!=="error"&&(this.state="submit")}FD([u,t?.name,t?.sequence],"cancel")&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close()}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
10
+ `),j(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){const u=iD(this._prevFrame,process.stdout.columns,{hard:!0}).split(`
11
11
  `).length-1;this.output.write(d.cursor.move(-999,u*-1))}render(){const u=iD(this._render(this)??"",process.stdout.columns,{hard:!0});if(u!==this._prevFrame){if(this.state==="initial")this.output.write(d.cursor.hide);else{const t=KD(this._prevFrame,u);if(this.restoreCursor(),t&&t?.length===1){const r=t[0];this.output.write(d.cursor.move(0,r)),this.output.write(d.erase.lines(1));const i=u.split(`
12
12
  `);this.output.write(i[r]),this._prevFrame=u,this.output.write(d.cursor.move(0,i.length-r-1));return}if(t&&t?.length>1){const r=t[0];this.output.write(d.cursor.move(0,r)),this.output.write(d.erase.down());const i=u.split(`
13
13
  `).slice(r);this.output.write(i.join(`
14
- `)),this._prevFrame=u;return}this.output.write(d.erase.down())}this.output.write(u),this.state==="initial"&&(this.state="active"),this._prevFrame=u}}}var qD=Object.defineProperty,UD=(e,u,t)=>u in e?qD(e,u,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[u]=t,nD=(e,u,t)=>(UD(e,typeof u!="symbol"?u+"":u,t),t);class YD extends sD{constructor(u){super(u,!1),nD(this,"options"),nD(this,"cursor",0),this.options=u.options,this.cursor=this.options.findIndex(({value:t})=>t===u.initialValue),this.cursor===-1&&(this.cursor=0),this.changeValue(),this.on("cursor",t=>{switch(t){case"left":case"up":this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;break;case"down":case"right":this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;break}this.changeValue()})}get _value(){return this.options[this.cursor]}changeValue(){this.value=this._value.value}}class ZD extends sD{get valueWithCursor(){if(this.state==="submit")return this.value;if(this.cursor>=this.value.length)return`${this.value}\u2588`;const u=this.value.slice(0,this.cursor),[t,...r]=this.value.slice(this.cursor);return`${u}${C.inverse(t)}${r.join("")}`}get cursor(){return this._cursor}constructor(u){super(u),this.on("finalize",()=>{this.value||(this.value=u.defaultValue)})}}function HD(){return f.platform!=="win32"?f.env.TERM!=="linux":!!f.env.CI||!!f.env.WT_SESSION||!!f.env.TERMINUS_SUBLIME||f.env.ConEmuTask==="{cmd::Cmder}"||f.env.TERM_PROGRAM==="Terminus-Sublime"||f.env.TERM_PROGRAM==="vscode"||f.env.TERM==="xterm-256color"||f.env.TERM==="alacritty"||f.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}const QD=HD(),p=(e,u)=>QD?e:u,XD=p("\u25C6","*"),Du=p("\u25A0","x"),uu=p("\u25B2","x"),aD=p("\u25C7","o"),B=p("\u2502","|"),y=p("\u2514","\u2014"),eu=p("\u25CF",">"),tu=p("\u25CB"," "),ru=p("\u25CF","\u2022"),iu=p("\u25C6","*"),Fu=p("\u25B2","!"),su=p("\u25A0","x"),CD=e=>{switch(e){case"initial":case"active":return C.cyan(XD);case"cancel":return C.red(Du);case"error":return C.yellow(uu);case"submit":return C.green(aD)}},nu=e=>{const{cursor:u,options:t,style:r}=e,i=e.maxItems??Number.POSITIVE_INFINITY,s=Math.max(process.stdout.rows-4,0),D=Math.min(s,Math.max(i,5));let n=0;u>=n+D-3?n=Math.max(Math.min(u-D+3,t.length-D),0):u<n+2&&(n=Math.max(u-2,0));const F=D<t.length&&n>0,a=D<t.length&&n+D<t.length;return t.slice(n,n+D).map((o,l,c)=>{const h=l===0&&F,A=l===c.length-1&&a;return h||A?C.dim("..."):r(o,l+n===u)})},oD=e=>new ZD({validate:e.validate,placeholder:e.placeholder,defaultValue:e.defaultValue,initialValue:e.initialValue,render(){const u=`${C.gray(B)}
14
+ `)),this._prevFrame=u;return}this.output.write(d.erase.down())}this.output.write(u),this.state==="initial"&&(this.state="active"),this._prevFrame=u}}}var YD=Object.defineProperty,qD=(e,u,t)=>u in e?YD(e,u,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[u]=t,nD=(e,u,t)=>(qD(e,typeof u!="symbol"?u+"":u,t),t);class UD extends sD{constructor(u){super(u,!1),nD(this,"options"),nD(this,"cursor",0),this.options=u.options,this.cursor=this.options.findIndex(({value:t})=>t===u.initialValue),this.cursor===-1&&(this.cursor=0),this.changeValue(),this.on("cursor",t=>{switch(t){case"left":case"up":this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;break;case"down":case"right":this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;break}this.changeValue()})}get _value(){return this.options[this.cursor]}changeValue(){this.value=this._value.value}}class ZD extends sD{get valueWithCursor(){if(this.state==="submit")return this.value;if(this.cursor>=this.value.length)return`${this.value}\u2588`;const u=this.value.slice(0,this.cursor),[t,...r]=this.value.slice(this.cursor);return`${u}${C.inverse(t)}${r.join("")}`}get cursor(){return this._cursor}constructor(u){super(u),this.on("finalize",()=>{this.value||(this.value=u.defaultValue)})}}function HD(){return f.platform!=="win32"?f.env.TERM!=="linux":!!f.env.CI||!!f.env.WT_SESSION||!!f.env.TERMINUS_SUBLIME||f.env.ConEmuTask==="{cmd::Cmder}"||f.env.TERM_PROGRAM==="Terminus-Sublime"||f.env.TERM_PROGRAM==="vscode"||f.env.TERM==="xterm-256color"||f.env.TERM==="alacritty"||f.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}const QD=HD(),p=(e,u)=>QD?e:u,XD=p("\u25C6","*"),Du=p("\u25A0","x"),uu=p("\u25B2","x"),aD=p("\u25C7","o"),B=p("\u2502","|"),y=p("\u2514","\u2014"),eu=p("\u25CF",">"),tu=p("\u25CB"," "),ru=p("\u25CF","\u2022"),iu=p("\u25C6","*"),Fu=p("\u25B2","!"),su=p("\u25A0","x"),CD=e=>{switch(e){case"initial":case"active":return C.cyan(XD);case"cancel":return C.red(Du);case"error":return C.yellow(uu);case"submit":return C.green(aD)}},nu=e=>{const{cursor:u,options:t,style:r}=e,i=e.maxItems??Number.POSITIVE_INFINITY,s=Math.max(process.stdout.rows-4,0),D=Math.min(s,Math.max(i,5));let n=0;u>=n+D-3?n=Math.max(Math.min(u-D+3,t.length-D),0):u<n+2&&(n=Math.max(u-2,0));const F=D<t.length&&n>0,a=D<t.length&&n+D<t.length;return t.slice(n,n+D).map((o,l,c)=>{const h=l===0&&F,A=l===c.length-1&&a;return h||A?C.dim("..."):r(o,l+n===u)})},oD=e=>new ZD({validate:e.validate,placeholder:e.placeholder,defaultValue:e.defaultValue,initialValue:e.initialValue,render(){const u=`${C.gray(B)}
15
15
  ${CD(this.state)} ${e.message}
16
16
  `,t=e.placeholder?C.inverse(e.placeholder[0])+C.dim(e.placeholder.slice(1)):C.inverse(C.hidden("_")),r=this.value?this.valueWithCursor:t;switch(this.state){case"error":return`${u.trim()}
17
17
  ${C.yellow(B)} ${r}
@@ -19,7 +19,7 @@ ${C.yellow(y)} ${C.yellow(this.error)}
19
19
  `;case"submit":return`${u}${C.gray(B)} ${C.dim(this.value||e.placeholder)}`;case"cancel":return`${u}${C.gray(B)} ${C.strikethrough(C.dim(this.value??""))}${this.value?.trim()?`
20
20
  ${C.gray(B)}`:""}`;default:return`${u}${C.cyan(B)} ${r}
21
21
  ${C.cyan(y)}
22
- `}}}).prompt(),V=e=>{const u=(t,r)=>{const i=t.label??String(t.value);switch(r){case"selected":return`${C.dim(i)}`;case"active":return`${C.green(eu)} ${i} ${t.hint?C.dim(`(${t.hint})`):""}`;case"cancelled":return`${C.strikethrough(C.dim(i))}`;default:return`${C.dim(tu)} ${C.dim(i)}`}};return new YD({options:e.options,initialValue:e.initialValue,render(){const t=`${C.gray(B)}
22
+ `}}}).prompt(),V=e=>{const u=(t,r)=>{const i=t.label??String(t.value);switch(r){case"selected":return`${C.dim(i)}`;case"active":return`${C.green(eu)} ${i} ${t.hint?C.dim(`(${t.hint})`):""}`;case"cancelled":return`${C.strikethrough(C.dim(i))}`;default:return`${C.dim(tu)} ${C.dim(i)}`}};return new UD({options:e.options,initialValue:e.initialValue,render(){const t=`${C.gray(B)}
23
23
  ${CD(this.state)} ${e.message}
24
24
  `;switch(this.state){case"submit":return`${t}${C.gray(B)} ${u(this.options[this.cursor],"selected")}`;case"cancel":return`${t}${C.gray(B)} ${u(this.options[this.cursor],"cancelled")}
25
25
  ${C.gray(B)}`;default:return`${t}${C.cyan(B)} ${nu({cursor:this.cursor,options:this.options,maxItems:e.maxItems,style:(r,i)=>u(r,i?"active":"inactive")}).join(`
@@ -34,14 +34,14 @@ ${C.gray(y)} ${e}
34
34
  `);t.push(`${u} ${r}`,...i.map(s=>`${C.gray(B)} ${s}`))}process.stdout.write(`${t.join(`
35
35
  `)}
36
36
  `)},info:e=>{x.message(e,{symbol:C.blue(ru)})},success:e=>{x.message(e,{symbol:C.green(iu)})},step:e=>{x.message(e,{symbol:C.green(aD)})},warn:e=>{x.message(e,{symbol:C.yellow(Fu)})},warning:e=>{x.warn(e)},error:e=>{x.message(e,{symbol:C.red(su)})}};`${C.gray(B)}`;function z(e){return e.trim().replace(/\/+$/g,"")}function ou(e){const u=m.readdirSync(e);return u.length===0||u.length===1&&u[0]===".git"}function lu(e){if(m.existsSync(e))for(const u of m.readdirSync(e))u!==".git"&&m.rmSync(b.resolve(e,u),{recursive:!0,force:!0})}function lD(e,u){m.statSync(e).isDirectory()?Eu(e,u):m.copyFileSync(e,u)}function Eu(e,u){m.mkdirSync(u,{recursive:!0});for(const t of m.readdirSync(e)){const r=b.resolve(e,t),i=b.resolve(u,t);lD(r,i)}}function cu(e,u){const t=u?u.name:"npm",r=t==="yarn"&&u?.version.startsWith("1.");return e.replace(/^npm create /,()=>t==="bun"?"bun x create-":`${t} create `).replace("@latest",()=>r?"":"@latest").replace(/^npm exec/,()=>t==="pnpm"?"pnpm dlx":t==="yarn"&&!r?"yarn dlx":t==="bun"?"bun x":"npm exec")}async function hu(e,u,t="VITE_"){const r=Object.entries(e).map(([s,D])=>`${t}${s.toUpperCase()}=${JSON.stringify(D)}`).join(`
37
- `),i=dD.join(u,".env");await bD.writeFile(i,r,"utf8")}async function Bu(e){const{cwd:u,targetDir:t,template:r,packageName:i,renameFiles:s,pkgInfo:D}=e,n=b.join(u,t);m.mkdirSync(n,{recursive:!0}),await hu({},n);const F=D?D.name:"npm";x.step(`Creating project in ${n}...`);const a=b.resolve(fD(import.meta.url),`../../templates/${r}`),o=(v,S)=>{const K=b.join(n,s[v]??v);S?m.writeFileSync(K,S):lD(b.join(a,v),K)},l=m.readdirSync(a);for(const v of l.filter(S=>S!=="package.json"))o(v);const c=JSON.parse(m.readFileSync(b.join(a,"package.json"),"utf-8"));c.name=i,o("package.json",JSON.stringify(c,null,2)+`
37
+ `),i=dD.join(u,".env");await bD.writeFile(i,r,"utf8")}async function Bu(e){const{cwd:u,targetDir:t,template:r,packageName:i,renameFiles:s,pkgInfo:D}=e,n=b.join(u,t);m.mkdirSync(n,{recursive:!0}),await hu({},n);const F=D?D.name:"npm";x.step(`Creating project in ${n}...`);const a=b.resolve(fD(import.meta.url),`../../../templates/${r}`),o=(v,S)=>{const K=b.join(n,s[v]??v);S?m.writeFileSync(K,S):lD(b.join(a,v),K)},l=m.readdirSync(a);for(const v of l.filter(S=>S!=="package.json"))o(v);const c=JSON.parse(m.readFileSync(b.join(a,"package.json"),"utf-8"));c.name=i,o("package.json",JSON.stringify(c,null,2)+`
38
38
  `);let h="";const A=b.relative(u,n);switch(h+=`Project created. Now run:
39
39
  `,n!==u&&(h+=`
40
40
  cd ${A.includes(" ")?`"${A}"`:A}`),F){case"yarn":h+=`
41
41
  yarn`,h+=`
42
42
  yarn dev`;break;default:h+=`
43
43
  ${F} install`,h+=`
44
- ${F} run dev`;break}Cu(h)}const{blue:ED,cyan:mu}=C,cD=[{name:"vanilla",display:"Vanilla",description:"with playcanvas engine",color:U.yellow,variants:[{name:"vanilla-ts",display:"TypeScript",color:ED}]},{name:"react",display:"React",description:"with @playcanvas/react",color:mu,variants:[{name:"react-ts",display:"TypeScript",color:ED}]}],gu=cD.flatMap(e=>e.variants.map(u=>u.name));async function pu({argTargetDir:e,defaultTargetDir:u,cancel:t}){let r=e?z(String(e)):void 0;if(!r){const i=await oD({message:"Project name:",defaultValue:u,placeholder:u});j(i)&&t(),r=z(i)}return r}async function fu({targetDir:e,argOverwrite:u,cancel:t}){if(m.existsSync(e)&&!ou(e)){const r=u?"yes":await V({message:(e==="."?"Current directory":`Target directory "${e}"`)+" is not empty. Please choose how to proceed:",options:[{label:"Cancel operation",value:"no"},{label:"Remove existing files and continue",value:"yes"},{label:"Ignore files and continue",value:"ignore"}]});if(j(r))return t();switch(r){case"yes":lu(e);break;case"no":t();return}}}function hD(e){return/^(?:@[a-z\d\-*~][a-z\d\-*._~]*\/)?[a-z\d\-~][a-z\d\-._~]*$/.test(e)}function BD(e){return e.trim().toLowerCase().replace(/\s+/g,"-").replace(/^[._]/,"").replace(/[^a-z\d\-~]+/g,"-")}async function bu({targetDir:e,cancel:u}){let t=b.basename(b.resolve(e));if(!hD(t)){const r=await oD({message:"Package name:",defaultValue:BD(t),placeholder:BD(t),validate(i){if(!hD(i))return"Invalid package.json name"}});if(j(r))return u();t=r}return t}async function du({argTemplate:e,FRAMEWORKS:u,TEMPLATES:t,pkgInfo:r,getFullCustomCommand:i,cancel:s}){let D=e,n=!1;if(e&&!t.includes(e)&&(D=void 0,n=!0),!D){const F=await V({message:n?`"${e}" isn't a valid template. Please choose from below: `:"Select a framework:",options:u.map(a=>{const o=a.color;return{label:o(a.display||a.name),value:a,hint:a.description}})});if(j(F))return s();await V({message:"Select a variant:",options:F.variants.map(a=>{const o=a.color,l=a.customCommand?i(a.customCommand,r).replace(/ TARGET_DIR$/,""):void 0;return{label:o(a.display||a.name),value:a.name,hint:l}})}),D=F.variants[0].name}return D}const w=vD(process.argv.slice(2),{alias:{h:"help",t:"template",d:"delete"},boolean:["help","overwrite"],string:["template"]}),Au=process.cwd(),vu=`Usage: npm create playcanvas@latest [OPTION]...
44
+ ${F} run dev`;break}Cu(h)}const{blue:ED,cyan:mu}=C,cD=[{name:"vanilla",display:"Vanilla",description:"with playcanvas engine",color:q.yellow,variants:[{name:"vanilla-ts",display:"TypeScript",color:ED}]},{name:"react",display:"React",description:"with @playcanvas/react",color:mu,variants:[{name:"react-ts",display:"TypeScript",color:ED}]}],gu=cD.flatMap(e=>e.variants.map(u=>u.name));async function pu({argTargetDir:e,defaultTargetDir:u,cancel:t}){let r=e?z(String(e)):void 0;if(!r){const i=await oD({message:"Project name:",defaultValue:u,placeholder:u});M(i)&&t(),r=z(i)}return r}async function fu({targetDir:e,argOverwrite:u,cancel:t}){if(m.existsSync(e)&&!ou(e)){const r=u?"yes":await V({message:(e==="."?"Current directory":`Target directory "${e}"`)+" is not empty. Please choose how to proceed:",options:[{label:"Cancel operation",value:"no"},{label:"Remove existing files and continue",value:"yes"},{label:"Ignore files and continue",value:"ignore"}]});if(M(r))return t();switch(r){case"yes":lu(e);break;case"no":t();return}}}function hD(e){return/^(?:@[a-z\d\-*~][a-z\d\-*._~]*\/)?[a-z\d\-~][a-z\d\-._~]*$/.test(e)}function BD(e){return e.trim().toLowerCase().replace(/\s+/g,"-").replace(/^[._]/,"").replace(/[^a-z\d\-~]+/g,"-")}async function bu({targetDir:e,cancel:u}){let t=b.basename(b.resolve(e));if(!hD(t)){const r=await oD({message:"Package name:",defaultValue:BD(t),placeholder:BD(t),validate(i){if(!hD(i))return"Invalid package.json name"}});if(M(r))return u();t=r}return t}async function du({argTemplate:e,FRAMEWORKS:u,TEMPLATES:t,pkgInfo:r,getFullCustomCommand:i,cancel:s}){let D=e,n=!1;if(e&&!t.includes(e)&&(D=void 0,n=!0),!D){const F=await V({message:n?`"${e}" isn't a valid template. Please choose from below: `:"Select a framework:",options:u.map(a=>{const o=a.color;return{label:o(a.display||a.name),value:a,hint:a.description}})});if(M(F))return s();await V({message:"Select a variant:",options:F.variants.map(a=>{const o=a.color,l=a.customCommand?i(a.customCommand,r).replace(/ TARGET_DIR$/,""):void 0;return{label:o(a.display||a.name),value:a.name,hint:l}})}),D=F.variants[0].name}return D}const w=vD(process.argv.slice(2),{alias:{h:"help",t:"template",d:"delete"},boolean:["help","overwrite"],string:["template"]}),Au=process.cwd(),vu=`Usage: npm create playcanvas@latest [OPTION]...
45
45
 
46
46
  Create a new PlayCanvas project in JavaScript or TypeScript.
47
47
  With no arguments, start the CLI in interactive mode.
package/package.json CHANGED
@@ -1,8 +1,26 @@
1
1
  {
2
2
  "name": "create-playcanvas",
3
- "author": "Mark Lundin",
4
- "version": "0.1.0",
3
+ "version": "0.2.2",
4
+ "author": "PlayCanvas <support@playcanvas.com>",
5
+ "homepage": "https://github.com/playcanvas/create-playcanvas#readme",
5
6
  "description": "Scaffold a PlayCanvas project",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/playcanvas/create-playcanvas.git"
10
+ },
11
+ "keywords": [
12
+ "playcanvas",
13
+ "create",
14
+ "scaffold",
15
+ "template",
16
+ "vite",
17
+ "react",
18
+ "typescript",
19
+ "webgl",
20
+ "webgpu",
21
+ "game",
22
+ "3d"
23
+ ],
6
24
  "type": "module",
7
25
  "bin": {
8
26
  "create-playcanvas": "index.js"
@@ -18,19 +36,16 @@
18
36
  "typecheck": "tsc --noEmit",
19
37
  "prepublishOnly": "npm run build"
20
38
  },
21
- "license": "ISC",
39
+ "license": "MIT",
22
40
  "devDependencies": {
23
- "@clack/prompts": "^0.10.0",
24
- "@types/node": "^22.13.10",
41
+ "@clack/prompts": "^0.11.0",
42
+ "@types/node": "^25.0.10",
25
43
  "cross-spawn": "^7.0.6",
26
44
  "mri": "^1.2.0",
27
45
  "picocolors": "^1.1.1",
28
- "unbuild": "^3.5.0"
46
+ "unbuild": "^3.6.1"
29
47
  },
30
48
  "engines": {
31
49
  "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
32
- },
33
- "dependencies": {
34
- "node-fetch": "^3.3.2"
35
50
  }
36
51
  }
@@ -10,27 +10,20 @@
10
10
  "predev": "node ./scripts/ensure-node-version.cjs",
11
11
  "dev": "vite",
12
12
  "build": "tsc -b && vite build",
13
- "lint": "eslint .",
14
13
  "preview": "vite preview"
15
14
  },
16
15
  "dependencies": {
17
- "@playcanvas/react": "^0.5.0",
18
- "playcanvas": "^2.8.2",
19
- "react": "^19.1.0",
20
- "react-dom": "^19.1.0"
16
+ "@playcanvas/react": "^0.11.3",
17
+ "playcanvas": "^2.15.1",
18
+ "react": "^19.2.3",
19
+ "react-dom": "^19.2.3"
21
20
  },
22
21
  "devDependencies": {
23
- "@eslint/js": "^9.29.0",
24
- "@types/react": "^19.1.8",
25
- "@types/react-dom": "^19.1.6",
26
- "@vitejs/plugin-react": "^4.5.2",
27
- "eslint": "^9.29.0",
28
- "eslint-plugin-react-hooks": "^5.2.0",
29
- "eslint-plugin-react-refresh": "^0.4.20",
30
- "globals": "^16.2.0",
31
- "semver": "^7.7.2",
32
- "typescript": "~5.8.3",
33
- "typescript-eslint": "^8.34.1",
34
- "vite": "^7.0.0"
22
+ "@types/react": "^19.2.9",
23
+ "@types/react-dom": "^19.2.3",
24
+ "@vitejs/plugin-react": "^5.1.2",
25
+ "semver": "^7.7.3",
26
+ "typescript": "~5.9.3",
27
+ "vite": "^7.3.1"
35
28
  }
36
29
  }
@@ -29,7 +29,7 @@ function App() {
29
29
  </div>
30
30
  <div>
31
31
  <span className="pill">
32
- count is {count}
32
+ Click Count: {count}
33
33
  </span>
34
34
  <p>
35
35
  Edit <code>src/Scene.tsx</code> and save to test HMR
@@ -1,10 +1,11 @@
1
- // @ts-expect-error - ShadowCatcher is not typed
1
+ // @ts-expect-error - PlayCanvas ESM scripts don't have type declarations
2
+ import { CameraControls } from "playcanvas/scripts/esm/camera-controls.mjs";
3
+ // @ts-expect-error - PlayCanvas ESM scripts don't have type declarations
2
4
  import { Grid } from "playcanvas/scripts/esm/grid.mjs";
3
5
  import { useEffect, useState } from "react";
4
6
  import { Entity } from "@playcanvas/react";
5
7
  import { useEnvAtlas, useMaterial } from "@playcanvas/react/hooks";
6
- import { Camera, EnvAtlas, Render, Script } from "@playcanvas/react/components";
7
- import { OrbitControls } from "@playcanvas/react/scripts";
8
+ import { Camera, Environment, Render, Script } from "@playcanvas/react/components";
8
9
 
9
10
  /**
10
11
  * The Scene renders a sphere with a grid and camera controls
@@ -15,7 +16,7 @@ function Scene({ onClick }: SceneProps) {
15
16
  const [hovering, setHovering] = useState(false);
16
17
 
17
18
  // Set a material color based on the hover state
18
- const diffuse = hovering ? '#ffffff' : '#dddddd';
19
+ const diffuse = hovering ? 'orange' : 'lightgrey';
19
20
 
20
21
  // Create a material for the sphere
21
22
  const material = useMaterial({ diffuse });
@@ -34,23 +35,22 @@ function Scene({ onClick }: SceneProps) {
34
35
  return (
35
36
  <>
36
37
  {/* Render some environment lighting using the environment map */}
37
- <EnvAtlas asset={envMap} showSkybox={false} />
38
+ <Environment envAtlas={envMap} showSkybox={false} />
38
39
 
39
40
  {/* Render a background grid */}
40
41
  <Entity scale={[1000, 1000, 1000]}>
41
42
  <Script script={Grid} />
42
43
  </Entity>
43
44
 
44
- {/* Create a camera entity with orbit controls */}
45
+ {/* Create a camera entity with camera controls */}
45
46
  <Entity name='camera' position={[4, 1, 4]}>
46
47
  <Camera clearColor='#171717' />
47
- <OrbitControls />
48
+ <Script script={CameraControls} />
48
49
  </Entity>
49
50
 
50
51
  {/* Create and position entity with pointer events */}
51
52
  <Entity
52
- position={[0, 2, 0]}
53
- scale={[4, 4, 4]}
53
+ position={[0, 0.5, 0]}
54
54
  onClick={onClick}
55
55
  onPointerOver={() => setHovering(true)}
56
56
  onPointerOut={() => setHovering(false)}
@@ -67,4 +67,4 @@ type SceneProps = {
67
67
  onClick: () => void;
68
68
  }
69
69
 
70
- export default Scene;
70
+ export default Scene;
@@ -0,0 +1,24 @@
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ pnpm-debug.log*
8
+ lerna-debug.log*
9
+
10
+ node_modules
11
+ dist
12
+ dist-ssr
13
+ *.local
14
+
15
+ # Editor directories and files
16
+ .vscode/*
17
+ !.vscode/extensions.json
18
+ .idea
19
+ .DS_Store
20
+ *.suo
21
+ *.ntvs*
22
+ *.njsproj
23
+ *.sln
24
+ *.sw?
@@ -10,12 +10,12 @@
10
10
  "preview": "vite preview"
11
11
  },
12
12
  "dependencies": {
13
- "playcanvas": "^2.8.2"
13
+ "playcanvas": "^2.15.1"
14
14
  },
15
15
  "devDependencies": {
16
- "semver": "^7.7.2",
17
- "typescript": "~5.8.3",
18
- "vite": "^7.0.3"
16
+ "semver": "^7.7.3",
17
+ "typescript": "~5.9.3",
18
+ "vite": "^7.3.1"
19
19
  },
20
20
  "engines": {
21
21
  "node": "^20.19.0 || >=22.12.0"
@@ -1,12 +1,49 @@
1
- import { DEVICETYPE_WEBGL2, createGraphicsDevice, AppBase, AppOptions, RenderComponentSystem, CameraComponentSystem, LightComponentSystem, TextureHandler, ContainerHandler, FILLMODE_FILL_WINDOW, RESOLUTION_AUTO, Entity, Color, ScriptComponent, ScriptComponentSystem, Vec3, Picker, EVENT_MOUSEDOWN, EVENT_TOUCHSTART, TouchDevice, Mouse, Mesh, MeshInstance, EVENT_MOUSEMOVE, StandardMaterial, Layer, EVENT_MOUSEUP } from 'playcanvas';
2
-
3
- // @ts-expect-error No declaration exists for this script
1
+ import {
2
+ createGraphicsDevice,
3
+ AppBase,
4
+ AppOptions,
5
+ RenderComponentSystem,
6
+ CameraComponentSystem,
7
+ ScriptComponentSystem,
8
+ TextureHandler,
9
+ ContainerHandler,
10
+ FILLMODE_FILL_WINDOW,
11
+ RESOLUTION_AUTO,
12
+ Entity,
13
+ Color,
14
+ Vec3,
15
+ Picker,
16
+ EVENT_MOUSEMOVE,
17
+ EVENT_MOUSEUP,
18
+ TouchDevice,
19
+ Mouse,
20
+ MeshInstance,
21
+ StandardMaterial,
22
+ Layer,
23
+ Asset,
24
+ AssetListLoader,
25
+ TEXTURETYPE_RGBP
26
+ } from 'playcanvas';
27
+
28
+ // @ts-expect-error - PlayCanvas ESM scripts don't have type declarations
4
29
  import { Grid } from 'playcanvas/scripts/esm/grid.mjs';
5
30
 
6
- // @ts-expect-error No declaration exists for this script
31
+ // @ts-expect-error - PlayCanvas ESM scripts don't have type declarations
7
32
  import { CameraControls } from 'playcanvas/scripts/esm/camera-controls.mjs';
33
+
8
34
  import { throttle } from './utils';
9
35
 
36
+ const HOVER_COLOR = new Color(1, 0.647, 0);
37
+ const DEFAULT_COLOR = new Color(0.827, 0.827, 0.827);
38
+
39
+ // Assets to load
40
+ const assets = {
41
+ envAtlas: new Asset('env-atlas', 'texture', { url: '/environment-map.png' }, {
42
+ type: TEXTURETYPE_RGBP,
43
+ mipmaps: false
44
+ })
45
+ };
46
+
10
47
  /**
11
48
  * Setup the PlayCanvas app
12
49
  * @param canvas - The canvas element
@@ -15,28 +52,29 @@ import { throttle } from './utils';
15
52
  async function setupApp(canvas: HTMLCanvasElement, onClick: () => void) {
16
53
 
17
54
  if (!canvas) {
18
- throw new Error('Canvas not found');
55
+ throw new Error('Canvas not found');
19
56
  }
20
57
 
21
- // create graphics device
22
- const device = await createGraphicsDevice(canvas, {
23
- deviceTypes: [DEVICETYPE_WEBGL2],
24
- });
58
+ // Create graphics device
59
+ const device = await createGraphicsDevice(canvas);
25
60
 
26
- // create app options
61
+ // Create app options
27
62
  const createOptions = new AppOptions();
28
63
  createOptions.graphicsDevice = device;
29
64
  createOptions.mouse = new Mouse(document.body);
30
65
  createOptions.touch = new TouchDevice(document.body);
31
- createOptions.componentSystems = [RenderComponentSystem, CameraComponentSystem, LightComponentSystem, ScriptComponentSystem];
66
+ createOptions.componentSystems = [
67
+ RenderComponentSystem,
68
+ CameraComponentSystem,
69
+ ScriptComponentSystem
70
+ ];
32
71
  createOptions.resourceHandlers = [TextureHandler, ContainerHandler];
33
72
 
34
- // create app
73
+ // Create app
35
74
  const app = new AppBase(canvas);
36
75
  app.init(createOptions);
37
- app.start();
38
76
 
39
- // Set the canvas to fill the window and a
77
+ // Set the canvas to fill the window
40
78
  app.setCanvasFillMode(FILLMODE_FILL_WINDOW);
41
79
  app.setCanvasResolution(RESOLUTION_AUTO);
42
80
 
@@ -44,55 +82,63 @@ async function setupApp(canvas: HTMLCanvasElement, onClick: () => void) {
44
82
  const resize = () => app.resizeCanvas();
45
83
  window.addEventListener('resize', resize);
46
84
 
47
- app.on('destroy', () => {
48
- window.removeEventListener('resize', resize);
85
+ app.once('destroy', () => {
86
+ window.removeEventListener('resize', resize);
87
+ });
88
+
89
+ // Load assets
90
+ await new Promise<void>((resolve) => {
91
+ new AssetListLoader(Object.values(assets), app.assets).load(() => resolve());
49
92
  });
50
93
 
51
- // create sphere entity
94
+ app.start();
95
+
96
+ // Set up environment lighting (no skybox, just IBL)
97
+ app.scene.envAtlas = assets.envAtlas.resource;
98
+ const skyboxLayer = app.scene.layers.getLayerByName('Skybox');
99
+ if (skyboxLayer) {
100
+ skyboxLayer.enabled = false;
101
+ }
102
+
103
+ // Create sphere entity
52
104
  const sphere = new Entity('sphere');
53
- sphere.setLocalScale(4, 4, 4);
54
- sphere.setPosition(new Vec3(0, 2, 0));
105
+ sphere.setPosition(new Vec3(0, 0.5, 0));
106
+
107
+ // Create a new material
108
+ const material = new StandardMaterial();
109
+ material.diffuse.copy(DEFAULT_COLOR);
110
+ material.update();
111
+
55
112
  sphere.addComponent('render', {
56
- type: 'sphere'
113
+ type: 'sphere',
114
+ material: material
57
115
  });
58
116
  app.root.addChild(sphere);
59
117
 
60
- // create camera entity
118
+ // Create camera entity
61
119
  const camera = new Entity('camera');
62
120
  camera.addComponent('camera', {
63
121
  clearColor: new Color(0.09, 0.09, 0.09)
64
122
  });
123
+ camera.setPosition(new Vec3(4, 1, 4));
65
124
  app.root.addChild(camera);
66
- camera.setPosition(new Vec3(8, 2, 8));
67
125
 
68
- // create camera controls
126
+ // Create camera controls
69
127
  camera.addComponent('script');
70
- const controls = camera.script?.create(CameraControls) as CameraControls;
71
- controls.focusPoint = sphere.getLocalPosition();
72
- controls.sceneSize = new Vec3(2, 2, 2).length();
73
- controls.enableFly = false;
74
- controls.lookSpeed = 0.001;
75
-
76
- // create grid entity
128
+ camera.script?.create(CameraControls);
129
+
130
+ // Create grid entity
77
131
  const grid = new Entity('grid');
78
132
  grid.addComponent('script');
79
133
  grid.script?.create(Grid);
80
- app.root.addChild(grid);
81
134
  grid.setLocalScale(1000, 1000, 1000);
135
+ app.root.addChild(grid);
82
136
 
83
- // create directional light entity
84
- const light = new Entity('light');
85
- light.addComponent('light');
86
- app.root.addChild(light);
87
- light.setEulerAngles(45, 0, 0);
88
-
89
- // create a picker
137
+ // Create a picker for mouse interaction
90
138
  const picker = new Picker(app, 1, 1);
91
-
92
- // function handling mouse click / touch
93
139
  const worldLayer = app.scene.layers.getLayerByName('World');
94
- const intersectsSphere = (x: number, y: number, layer: Layer) : Promise<boolean> => {
95
140
 
141
+ const intersectsSphere = (x: number, y: number, layer: Layer): Promise<boolean> => {
96
142
  if (!camera.camera) {
97
143
  return Promise.resolve(false);
98
144
  }
@@ -103,28 +149,16 @@ async function setupApp(canvas: HTMLCanvasElement, onClick: () => void) {
103
149
  if (!layer) {
104
150
  return Promise.resolve(false);
105
151
  }
106
-
107
- // render the ID texture
152
+
108
153
  picker.prepare(camera.camera, app.scene, [layer]);
109
154
 
110
- // get the meshInstance of the picked object
111
- return picker.getSelectionAsync(x * pickerScale, y * pickerScale, 1, 1).then((meshInstances: MeshInstance[]) : boolean => {
155
+ return picker.getSelectionAsync(x * pickerScale, y * pickerScale, 1, 1).then((meshInstances: MeshInstance[]): boolean => {
112
156
  if (meshInstances.length === 0) return false;
113
157
  return meshInstances[0] === sphere.render?.meshInstances[0];
114
158
  });
115
159
  };
116
160
 
117
- app.mouse?.on(EVENT_MOUSEDOWN, (event) => {
118
- if (!worldLayer) return;
119
- intersectsSphere(event.x, event.y, worldLayer);
120
- });
121
-
122
- const HOVER_COLOR = new Color(1, 0, 0);
123
- const DEFAULT_COLOR = new Color(1, 1, 1);
124
- const material = sphere.render?.material as StandardMaterial;
125
-
126
-
127
- // on mouse move, check if the user is hovering over the sphere and update the cursor
161
+ // On mouse move, check if hovering over sphere and update cursor/color
128
162
  app.mouse?.on(EVENT_MOUSEMOVE, throttle((event) => {
129
163
  if (!worldLayer) return;
130
164
  intersectsSphere(event.x, event.y, worldLayer).then((intersects) => {
@@ -134,16 +168,15 @@ async function setupApp(canvas: HTMLCanvasElement, onClick: () => void) {
134
168
  });
135
169
  }, 100));
136
170
 
137
- // on mouse up, check if the user clicked on the sphere and call the onClick function
171
+ // On mouse up, check if clicked on sphere and call onClick
138
172
  app.mouse?.on(EVENT_MOUSEUP, (event) => {
139
173
  if (!worldLayer || !onClick) return;
140
174
  intersectsSphere(event.x, event.y, worldLayer).then((intersects) => {
141
175
  if (intersects) {
142
176
  onClick();
143
177
  }
144
- })
178
+ });
145
179
  });
146
-
147
180
  }
148
181
 
149
182
  export { setupApp };
@@ -2,7 +2,8 @@ import './style.css'
2
2
  import typescriptLogo from './assets/typescript.svg'
3
3
  import playcanvasLogo from './assets/playcanvas.png'
4
4
  import { setupApp } from './App'
5
- import { setupCounter } from './counter'
5
+
6
+ let count = 0;
6
7
 
7
8
  document.querySelector<HTMLDivElement>('#root')!.innerHTML = `
8
9
  <div>
@@ -20,17 +21,25 @@ document.querySelector<HTMLDivElement>('#root')!.innerHTML = `
20
21
  </header>
21
22
  </div>
22
23
  <div>
23
- <div class="card">
24
- <button id="counter" type="button"></button>
25
- </div>
26
- <p class="read-the-docs">
27
- Click on the Vite and TypeScript logos to learn more
24
+ <span id="counter" class="pill">
25
+ Click Count: ${count}
26
+ </span>
27
+ <p>
28
+ Edit <code>src/App.ts</code> and save to test HMR
28
29
  </p>
29
30
  </div>
31
+ <p class="read-the-docs">
32
+ Click on the PlayCanvas and TypeScript logos to learn more
33
+ </p>
30
34
  </div>
31
35
  </div>
32
36
  `
33
37
 
34
- const increment = setupCounter(document.getElementById('counter') as HTMLButtonElement);
38
+ const counterElement = document.getElementById('counter')!;
39
+
40
+ const increment = () => {
41
+ count++;
42
+ counterElement.textContent = `Click Count: ${count}`;
43
+ };
35
44
 
36
- setupApp(document.getElementById('application-canvas') as HTMLCanvasElement, () => increment());
45
+ setupApp(document.getElementById('application-canvas') as HTMLCanvasElement, increment);
@@ -130,4 +130,11 @@ button:focus-visible {
130
130
  position: absolute;
131
131
  top: 0;
132
132
  left: 0;
133
+ }
134
+
135
+ .pill {
136
+ background-color: #000;
137
+ color: #fff;
138
+ padding: 0.5rem 1rem;
139
+ border-radius: 0.5rem;
133
140
  }
@@ -1,23 +0,0 @@
1
- import js from '@eslint/js'
2
- import globals from 'globals'
3
- import reactHooks from 'eslint-plugin-react-hooks'
4
- import reactRefresh from 'eslint-plugin-react-refresh'
5
- import tseslint from 'typescript-eslint'
6
- import { globalIgnores } from 'eslint/config'
7
-
8
- export default tseslint.config([
9
- globalIgnores(['dist']),
10
- {
11
- files: ['**/*.{ts,tsx}'],
12
- extends: [
13
- js.configs.recommended,
14
- tseslint.configs.recommended,
15
- reactHooks.configs['recommended-latest'],
16
- reactRefresh.configs.vite,
17
- ],
18
- languageOptions: {
19
- ecmaVersion: 2020,
20
- globals: globals.browser,
21
- },
22
- },
23
- ])
@@ -1,78 +0,0 @@
1
- #root {
2
- display: flex;
3
- flex-direction: column;
4
- height: 100vh;
5
- width: 100vw;
6
- }
7
-
8
- header {
9
- display: flex;
10
- flex-direction: row;
11
- align-items: center;
12
- padding: 2rem;
13
- }
14
-
15
- .absolute {
16
- position: absolute;
17
- top: 0;
18
- left: 0;
19
- }
20
-
21
- .full-bleed {
22
- width: 100vw;
23
- height: 100vh;
24
- overflow: hidden;
25
- }
26
-
27
- .logo {
28
- height: 2em;
29
- padding: .5em;
30
- will-change: filter;
31
- transition: filter 300ms;
32
- }
33
-
34
- .playcanvas-logo {
35
- border-radius: 100%;
36
- }
37
-
38
- .logo:hover {
39
- filter: drop-shadow(0 0 2em #646cffaa);
40
- }
41
- .card {
42
- padding: 2em;
43
- }
44
-
45
- .read-the-docs {
46
- color: #888;
47
- }
48
-
49
- .container{
50
- position: absolute;
51
- top: 0;
52
- left: 0;
53
- display: flex;
54
- }
55
-
56
- .overlay {
57
- margin: 0 auto;
58
- text-align: center;
59
- display: flex;
60
- flex-direction: column;
61
- align-items: center;
62
- justify-content: stretch;
63
- width: 100vw;
64
- height: 100vh;
65
- pointer-events: none;
66
- }
67
-
68
- .overlay > .grow {
69
- flex-grow: 1;
70
- }
71
-
72
- .pill {
73
- background-color: #000;
74
- color: #fff;
75
- padding: 0.5rem 1rem;
76
- border-radius: 0.5rem;
77
- }
78
-
@@ -1,70 +0,0 @@
1
- // // @ts-expect-error - ShadowCatcher is not typed
2
- // import { Grid } from "playcanvas/scripts/esm/grid.mjs";
3
- // import { useEffect, useState } from "react";
4
- // import { Entity } from "@playcanvas/react";
5
- // import { useEnvAtlas, useMaterial } from "@playcanvas/react/hooks";
6
- // import { Camera, EnvAtlas, Render, Script } from "@playcanvas/react/components";
7
- // import { OrbitControls } from "@playcanvas/react/scripts";
8
-
9
- // /**
10
- // * The Scene renders a sphere with a grid and camera controls
11
- // */
12
- // function Scene({ onClick }: SceneProps) {
13
-
14
- // // Track the hover state and set the color based on the hover state
15
- // const [hovering, setHovering] = useState(false);
16
-
17
- // // Set a material color based on the hover state
18
- // const diffuse = hovering ? '#ffffff' : '#dddddd';
19
-
20
- // // Create a material for the sphere
21
- // const material = useMaterial({ diffuse });
22
-
23
- // // Load the environment map
24
- // const { asset: envMap } = useEnvAtlas('/environment-map.png');
25
-
26
- // // change the mouse cursor based on the hover state
27
- // useEffect(() => {
28
- // document.body.style.cursor = hovering ? 'pointer' : 'default';
29
- // }, [hovering]);
30
-
31
- // // Don't render until the environment map is loaded
32
- // if (!envMap) return null;
33
-
34
- // return (
35
- // <>
36
- // {/* Render some environment lighting using the environment map */}
37
- // <EnvAtlas asset={envMap} showSkybox={false} />
38
-
39
- // {/* Render a background grid */}
40
- // <Entity scale={[1000, 1000, 1000]}>
41
- // <Script script={Grid} />
42
- // </Entity>
43
-
44
- // {/* Create a camera entity with orbit controls */}
45
- // <Entity name='camera' position={[4, 1, 4]}>
46
- // <Camera clearColor='#171717' />
47
- // <OrbitControls />
48
- // </Entity>
49
-
50
- // {/* Create and position entity with pointer events */}
51
- // <Entity
52
- // position={[0, 2, 0]}
53
- // scale={[4, 4, 4]}
54
- // onClick={onClick}
55
- // onPointerOver={() => setHovering(true)}
56
- // onPointerOut={() => setHovering(false)}
57
- // >
58
-
59
- // {/* Render a sphere with the material */}
60
- // <Render type="sphere" material={material} />
61
- // </Entity>
62
- // </>
63
- // )
64
- // }
65
-
66
- // type SceneProps = {
67
- // onClick: () => void;
68
- // }
69
-
70
- // export default Scene;
@@ -1,10 +0,0 @@
1
- export function setupCounter(element: HTMLButtonElement) {
2
- let counter = 0
3
- const setCounter = (count: number) => {
4
- counter = count
5
- element.innerHTML = `count is ${counter}`
6
- }
7
- setCounter(0)
8
- const increment = () => setCounter(counter + 1);
9
- return increment;
10
- }
@@ -1,73 +0,0 @@
1
- :root {
2
- font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
3
- line-height: 1.5;
4
- font-weight: 400;
5
-
6
- color-scheme: light dark;
7
- color: rgba(255, 255, 255, 0.87);
8
- background-color: #242424;
9
-
10
- font-synthesis: none;
11
- text-rendering: optimizeLegibility;
12
- -webkit-font-smoothing: antialiased;
13
- -moz-osx-font-smoothing: grayscale;
14
- }
15
-
16
- a {
17
- font-weight: 500;
18
- color: #646cff;
19
- text-decoration: inherit;
20
- }
21
- a:hover {
22
- color: #535bf2;
23
- }
24
-
25
- a > img {
26
- vertical-align: middle;
27
- }
28
-
29
- body {
30
- margin: 0;
31
- display: flex;
32
- place-items: center;
33
- min-width: 320px;
34
- min-height: 100vh;
35
- }
36
-
37
- h1 {
38
- font-size: 2.4em;
39
- line-height: 1.1;
40
- opacity: 0.85;
41
- }
42
-
43
- button {
44
- border-radius: 8px;
45
- border: 1px solid transparent;
46
- padding: 0.6em 1.2em;
47
- font-size: 1em;
48
- font-weight: 500;
49
- font-family: inherit;
50
- background-color: #1a1a1a;
51
- cursor: pointer;
52
- transition: border-color 0.25s;
53
- }
54
- button:hover {
55
- border-color: #646cff;
56
- }
57
- button:focus,
58
- button:focus-visible {
59
- outline: 4px auto -webkit-focus-ring-color;
60
- }
61
-
62
- @media (prefers-color-scheme: light) {
63
- :root {
64
- color: #213547;
65
- background-color: #ffffff;
66
- }
67
- a:hover {
68
- color: #747bff;
69
- }
70
- button {
71
- background-color: #f9f9f9;
72
- }
73
- }