Init.
This commit is contained in:
commit
7cd0705120
14 changed files with 13408 additions and 0 deletions
55
README.md
Normal file
55
README.md
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
# YouTube PoToken Generator
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
This program outputs the mysterious pair `{ visitorData, poToken }`, with the help of `js-dom`.
|
||||||
|
|
||||||
|
## How it works
|
||||||
|
|
||||||
|
Only one network request is made to get a fresh copy of `visitorData`.
|
||||||
|
|
||||||
|
Then `poToken` is generated with pre-downloaded scripts from YouTube and some magic provided in `lib/inject.js`
|
||||||
|
|
||||||
|
No real browser is required to install.
|
||||||
|
|
||||||
|
## How to use
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn add youtube-po-token-generator
|
||||||
|
# Or
|
||||||
|
npm install youtube-po-token-generator
|
||||||
|
```
|
||||||
|
|
||||||
|
See `examples` for simple usages.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const { generate } = require('youtube-po-token-generator')
|
||||||
|
|
||||||
|
generate().then(console.log, console.error)
|
||||||
|
// => { visitorData: '...', poToken: '...' }
|
||||||
|
```
|
||||||
|
|
||||||
|
Require `lib/task` directly if you have already prepared your `visitorData`.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const { createTask } = require('youtube-po-token-generator/lib/task')
|
||||||
|
|
||||||
|
const visitorData = '...'
|
||||||
|
|
||||||
|
createTask(visitorData).then(task => task.start).then(console.log, console.error)
|
||||||
|
// => { poToken: '...' }
|
||||||
|
```
|
||||||
|
|
||||||
|
## Related works
|
||||||
|
|
||||||
|
This project is inspired by https://github.com/iv-org/youtube-trusted-session-generator .
|
||||||
|
|
||||||
|
## More
|
||||||
|
|
||||||
|
Debugging the source code from YouTube was a pain.
|
||||||
|
|
||||||
|
* Pausing at key parts of the `poToken` generation may lead to misleading branches.
|
||||||
|
|
||||||
|
* Modification on the injected code from `botguardData.program` may lead to invalid tokens.
|
||||||
|
|
||||||
|
* Improper userAgent would lead to valid or invalid poToken being generated randomly, like a lottery.
|
78
examples/multi-thread.js
Normal file
78
examples/multi-thread.js
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
const { parentPort, Worker, isMainThread } = require('worker_threads')
|
||||||
|
const { createTask } = require('../lib/task')
|
||||||
|
const { formatError } = require('../lib/utils')
|
||||||
|
const { fetchVisitorData } = require('../lib/workflow')
|
||||||
|
const os = require('os')
|
||||||
|
|
||||||
|
if (isMainThread) {
|
||||||
|
const generate = async () => {
|
||||||
|
const visitorData = await fetchVisitorData()
|
||||||
|
|
||||||
|
return new Promise((res, rej) => {
|
||||||
|
try {
|
||||||
|
const workers = Array(Math.max(1, os.cpus().length - 1)).fill(0).map(() => new Worker(__filename))
|
||||||
|
|
||||||
|
workers.forEach((worker, i) => {
|
||||||
|
worker.on('message', ({ result, data }) => {
|
||||||
|
if (result === 'success') {
|
||||||
|
console.log(`Worker ${i} finished the race.`)
|
||||||
|
workers.forEach(worker => {
|
||||||
|
worker.postMessage({ action: 'stop' })
|
||||||
|
})
|
||||||
|
res(data)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
worker.on('error', (err) => {
|
||||||
|
console.error(`Worker ${i} encountered an error ${formatError(err)}`)
|
||||||
|
})
|
||||||
|
|
||||||
|
worker.on('exit', (code) => {
|
||||||
|
console.error(`Worker ${i} exited (${code})`)
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log(`Starting worker ${i}...`)
|
||||||
|
worker.postMessage({ action: 'start', data: { visitorData } })
|
||||||
|
})
|
||||||
|
} catch (err) {
|
||||||
|
rej(err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { generate }
|
||||||
|
} else {
|
||||||
|
let flagStop = false
|
||||||
|
let visitorData = undefined
|
||||||
|
let stop
|
||||||
|
|
||||||
|
const start = async () => {
|
||||||
|
try {
|
||||||
|
if (!visitorData) {
|
||||||
|
throw new Error('visitorData is absent')
|
||||||
|
}
|
||||||
|
const task = await createTask(visitorData)
|
||||||
|
stop = task.stop
|
||||||
|
const { poToken } = await task.start()
|
||||||
|
return { result: 'success', data: { visitorData, poToken } }
|
||||||
|
} catch (err) {
|
||||||
|
return { result: 'failure', data: { reason: formatError(err) } }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
parentPort.on('message', async ({ action, data }) => {
|
||||||
|
if (action === 'start') {
|
||||||
|
visitorData = data.visitorData
|
||||||
|
const message = await start()
|
||||||
|
if (flagStop) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
parentPort.postMessage(message)
|
||||||
|
}
|
||||||
|
if (action === 'stop') {
|
||||||
|
flagStop = true
|
||||||
|
stop?.()
|
||||||
|
process.exit(0)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
4
examples/one-shot.js
Normal file
4
examples/one-shot.js
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
const { generate } = require('../index')
|
||||||
|
const { formatError } = require('../lib/utils')
|
||||||
|
|
||||||
|
generate().then(console.log, err => console.log(formatError(err)))
|
11
index.js
Normal file
11
index.js
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
const { createTask } = require('./lib/task')
|
||||||
|
const { fetchVisitorData } = require('./lib/workflow')
|
||||||
|
|
||||||
|
const generate = async () => {
|
||||||
|
const visitorData = await fetchVisitorData()
|
||||||
|
const task = await createTask(visitorData)
|
||||||
|
const { poToken } = await task.start()
|
||||||
|
return { visitorData, poToken }
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { generate }
|
9
lib/consts.js
Normal file
9
lib/consts.js
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
const url = 'https://www.youtube.com/embed/dQw4w9WgXcQ'
|
||||||
|
const userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko)'
|
||||||
|
const headers = {
|
||||||
|
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
|
||||||
|
'accept-language': 'en-US;q=0.9',
|
||||||
|
'user-agent': userAgent,
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { url, headers, userAgent }
|
26
lib/inject.js
Normal file
26
lib/inject.js
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
const bOa$ = bOa
|
||||||
|
bOa = (...args) => {
|
||||||
|
const ret = bOa$(...args)
|
||||||
|
if (ret.length > 80) {
|
||||||
|
window.onPoToken(ret)
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
ytcfg.set({
|
||||||
|
'INNERTUBE_CONTEXT': {
|
||||||
|
...ytcfg.get('INNERTUBE_CONTEXT'),
|
||||||
|
client: {
|
||||||
|
...ytcfg.get('INNERTUBE_CONTEXT').client,
|
||||||
|
visitorData: window.visitorData,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'VISITOR_DATA': window.visitorData,
|
||||||
|
'IDENTITY_MEMENTO': {
|
||||||
|
'visitor_data': window.visitorData,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
g.C_.create(
|
||||||
|
document.getElementById('player'),
|
||||||
|
{ args: {}, attrs: {}, loaded: true },
|
||||||
|
ytcfg.get('WEB_PLAYER_CONTEXT_CONFIGS')['WEB_PLAYER_CONTEXT_CONFIG_ID_EMBEDDED_PLAYER'],
|
||||||
|
)
|
40
lib/task.js
Normal file
40
lib/task.js
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
const fs = require('fs/promises')
|
||||||
|
const { JSDOM, VirtualConsole } = require('jsdom')
|
||||||
|
const { url, userAgent } = require('./consts')
|
||||||
|
|
||||||
|
const createTask = async (visitorData) => {
|
||||||
|
const domContent = await fs.readFile('vendor/index.html', 'utf-8')
|
||||||
|
const baseContent = await fs.readFile(`vendor/base.js`, 'utf-8')
|
||||||
|
const baseAppendContent = await fs.readFile(`lib/inject.js`, 'utf-8')
|
||||||
|
let destroy = undefined
|
||||||
|
return {
|
||||||
|
stop: () => destroy?.(),
|
||||||
|
start: async () => {
|
||||||
|
while (true) {
|
||||||
|
const { poToken } = await new Promise(async (res, rej) => {
|
||||||
|
const { window } = new JSDOM(domContent, {
|
||||||
|
url,
|
||||||
|
pretendToBeVisual: true,
|
||||||
|
runScripts: 'dangerously',
|
||||||
|
virtualConsole: new VirtualConsole(),
|
||||||
|
})
|
||||||
|
Object.defineProperty(window.navigator, 'userAgent', { value: userAgent, writable: false })
|
||||||
|
window.visitorData = visitorData
|
||||||
|
window.onPoToken = (poToken) => {
|
||||||
|
res({ poToken })
|
||||||
|
}
|
||||||
|
window.eval(baseContent.replace(/}\s*\)\(_yt_player\);\s*$/, (matched) => `;${baseAppendContent};${matched}`))
|
||||||
|
destroy = () => {
|
||||||
|
window.close()
|
||||||
|
rej(new Error('Window is closed'))
|
||||||
|
}
|
||||||
|
}).finally(() => destroy())
|
||||||
|
if (poToken.length === 160) {
|
||||||
|
return { poToken }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { createTask }
|
22
lib/utils.js
Normal file
22
lib/utils.js
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
const https = require('https')
|
||||||
|
const { headers, url } = require('./consts')
|
||||||
|
|
||||||
|
const download = (url) => new Promise((resolve, reject) => {
|
||||||
|
https.get(url, { headers }, (res) => {
|
||||||
|
let data = ''
|
||||||
|
|
||||||
|
res.on('data', (chunk) => {
|
||||||
|
data += chunk
|
||||||
|
})
|
||||||
|
|
||||||
|
res.on('end', () => {
|
||||||
|
resolve(data)
|
||||||
|
})
|
||||||
|
}).on('error', (err) => {
|
||||||
|
reject(err)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
const formatError = (err) => err.message || err.toString()
|
||||||
|
|
||||||
|
module.exports = { download, formatError }
|
14
lib/workflow.js
Normal file
14
lib/workflow.js
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
const { download } = require('./utils')
|
||||||
|
const { url } = require('./consts')
|
||||||
|
|
||||||
|
const fetchVisitorData = async () => {
|
||||||
|
const data = await download(url)
|
||||||
|
const matched = data.match(/"visitorData":"([^"]+)/)
|
||||||
|
if (matched) {
|
||||||
|
return matched[1]
|
||||||
|
} else {
|
||||||
|
throw new Error(`Failed to find visitorData`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { fetchVisitorData }
|
24
package.json
Normal file
24
package.json
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
"name": "youtube-po-token-generator",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"author": "Yunzhe <yunzhe@zju.edu.cn>",
|
||||||
|
"description": "It generates a valid poToken with visitorData fetched from YouTube.",
|
||||||
|
"keywords": [
|
||||||
|
"youtube",
|
||||||
|
"session",
|
||||||
|
"poToken",
|
||||||
|
"visitorData",
|
||||||
|
"po_token",
|
||||||
|
"visitor_data",
|
||||||
|
"invidious"
|
||||||
|
],
|
||||||
|
"repository": "https://github.com/YunzheZJU/youtube-po-token-generator.git",
|
||||||
|
"main": "index.js",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"jsdom": "^24.1.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18.0"
|
||||||
|
}
|
||||||
|
}
|
2
vendor/README.md
vendored
Normal file
2
vendor/README.md
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
* `index.html` was downloaded from https://www.youtube.com/embed/dQw4w9WgXcQ . Inspect its content for generating timestamp and region.
|
||||||
|
* `base.js` was downloaded from https://www.youtube.com/s/player/d2e656ee/player_ias.vflset/en_US/base.js . `d2e656ee` should be the version number for its content.
|
12830
vendor/base.js
vendored
Normal file
12830
vendor/base.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
10
vendor/index.html
vendored
Normal file
10
vendor/index.html
vendored
Normal file
File diff suppressed because one or more lines are too long
283
yarn.lock
Normal file
283
yarn.lock
Normal file
|
@ -0,0 +1,283 @@
|
||||||
|
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||||
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
|
agent-base@^7.0.2, agent-base@^7.1.0:
|
||||||
|
version "7.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317"
|
||||||
|
integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==
|
||||||
|
dependencies:
|
||||||
|
debug "^4.3.4"
|
||||||
|
|
||||||
|
asynckit@^0.4.0:
|
||||||
|
version "0.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
|
||||||
|
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
|
||||||
|
|
||||||
|
combined-stream@^1.0.8:
|
||||||
|
version "1.0.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
|
||||||
|
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
|
||||||
|
dependencies:
|
||||||
|
delayed-stream "~1.0.0"
|
||||||
|
|
||||||
|
cssstyle@^4.0.1:
|
||||||
|
version "4.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.0.1.tgz#ef29c598a1e90125c870525490ea4f354db0660a"
|
||||||
|
integrity sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==
|
||||||
|
dependencies:
|
||||||
|
rrweb-cssom "^0.6.0"
|
||||||
|
|
||||||
|
data-urls@^5.0.0:
|
||||||
|
version "5.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-5.0.0.tgz#2f76906bce1824429ffecb6920f45a0b30f00dde"
|
||||||
|
integrity sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==
|
||||||
|
dependencies:
|
||||||
|
whatwg-mimetype "^4.0.0"
|
||||||
|
whatwg-url "^14.0.0"
|
||||||
|
|
||||||
|
debug@4, debug@^4.3.4:
|
||||||
|
version "4.3.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b"
|
||||||
|
integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==
|
||||||
|
dependencies:
|
||||||
|
ms "2.1.2"
|
||||||
|
|
||||||
|
decimal.js@^10.4.3:
|
||||||
|
version "10.4.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23"
|
||||||
|
integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==
|
||||||
|
|
||||||
|
delayed-stream@~1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
|
||||||
|
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
|
||||||
|
|
||||||
|
entities@^4.4.0:
|
||||||
|
version "4.5.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
|
||||||
|
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
|
||||||
|
|
||||||
|
form-data@^4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
|
||||||
|
integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
|
||||||
|
dependencies:
|
||||||
|
asynckit "^0.4.0"
|
||||||
|
combined-stream "^1.0.8"
|
||||||
|
mime-types "^2.1.12"
|
||||||
|
|
||||||
|
html-encoding-sniffer@^4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz#696df529a7cfd82446369dc5193e590a3735b448"
|
||||||
|
integrity sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==
|
||||||
|
dependencies:
|
||||||
|
whatwg-encoding "^3.1.1"
|
||||||
|
|
||||||
|
http-proxy-agent@^7.0.2:
|
||||||
|
version "7.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e"
|
||||||
|
integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==
|
||||||
|
dependencies:
|
||||||
|
agent-base "^7.1.0"
|
||||||
|
debug "^4.3.4"
|
||||||
|
|
||||||
|
https-proxy-agent@^7.0.5:
|
||||||
|
version "7.0.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2"
|
||||||
|
integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==
|
||||||
|
dependencies:
|
||||||
|
agent-base "^7.0.2"
|
||||||
|
debug "4"
|
||||||
|
|
||||||
|
iconv-lite@0.6.3:
|
||||||
|
version "0.6.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
|
||||||
|
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
|
||||||
|
dependencies:
|
||||||
|
safer-buffer ">= 2.1.2 < 3.0.0"
|
||||||
|
|
||||||
|
is-potential-custom-element-name@^1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
|
||||||
|
integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
|
||||||
|
|
||||||
|
jsdom@^24.1.1:
|
||||||
|
version "24.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-24.1.1.tgz#f41df8f4f3b2fbfa7e1bdc5df62c9804fd14a9d0"
|
||||||
|
integrity sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==
|
||||||
|
dependencies:
|
||||||
|
cssstyle "^4.0.1"
|
||||||
|
data-urls "^5.0.0"
|
||||||
|
decimal.js "^10.4.3"
|
||||||
|
form-data "^4.0.0"
|
||||||
|
html-encoding-sniffer "^4.0.0"
|
||||||
|
http-proxy-agent "^7.0.2"
|
||||||
|
https-proxy-agent "^7.0.5"
|
||||||
|
is-potential-custom-element-name "^1.0.1"
|
||||||
|
nwsapi "^2.2.12"
|
||||||
|
parse5 "^7.1.2"
|
||||||
|
rrweb-cssom "^0.7.1"
|
||||||
|
saxes "^6.0.0"
|
||||||
|
symbol-tree "^3.2.4"
|
||||||
|
tough-cookie "^4.1.4"
|
||||||
|
w3c-xmlserializer "^5.0.0"
|
||||||
|
webidl-conversions "^7.0.0"
|
||||||
|
whatwg-encoding "^3.1.1"
|
||||||
|
whatwg-mimetype "^4.0.0"
|
||||||
|
whatwg-url "^14.0.0"
|
||||||
|
ws "^8.18.0"
|
||||||
|
xml-name-validator "^5.0.0"
|
||||||
|
|
||||||
|
mime-db@1.52.0:
|
||||||
|
version "1.52.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
|
||||||
|
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
|
||||||
|
|
||||||
|
mime-types@^2.1.12:
|
||||||
|
version "2.1.35"
|
||||||
|
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
|
||||||
|
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
|
||||||
|
dependencies:
|
||||||
|
mime-db "1.52.0"
|
||||||
|
|
||||||
|
ms@2.1.2:
|
||||||
|
version "2.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
|
||||||
|
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
|
||||||
|
|
||||||
|
nwsapi@^2.2.12:
|
||||||
|
version "2.2.12"
|
||||||
|
resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8"
|
||||||
|
integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==
|
||||||
|
|
||||||
|
parse5@^7.1.2:
|
||||||
|
version "7.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32"
|
||||||
|
integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==
|
||||||
|
dependencies:
|
||||||
|
entities "^4.4.0"
|
||||||
|
|
||||||
|
psl@^1.1.33:
|
||||||
|
version "1.9.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
|
||||||
|
integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
|
||||||
|
|
||||||
|
punycode@^2.1.1, punycode@^2.3.1:
|
||||||
|
version "2.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
|
||||||
|
integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
|
||||||
|
|
||||||
|
querystringify@^2.1.1:
|
||||||
|
version "2.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
|
||||||
|
integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
|
||||||
|
|
||||||
|
requires-port@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
|
||||||
|
integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
|
||||||
|
|
||||||
|
rrweb-cssom@^0.6.0:
|
||||||
|
version "0.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1"
|
||||||
|
integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==
|
||||||
|
|
||||||
|
rrweb-cssom@^0.7.1:
|
||||||
|
version "0.7.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz#c73451a484b86dd7cfb1e0b2898df4b703183e4b"
|
||||||
|
integrity sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==
|
||||||
|
|
||||||
|
"safer-buffer@>= 2.1.2 < 3.0.0":
|
||||||
|
version "2.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
|
||||||
|
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
|
||||||
|
|
||||||
|
saxes@^6.0.0:
|
||||||
|
version "6.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5"
|
||||||
|
integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==
|
||||||
|
dependencies:
|
||||||
|
xmlchars "^2.2.0"
|
||||||
|
|
||||||
|
symbol-tree@^3.2.4:
|
||||||
|
version "3.2.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
|
||||||
|
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
|
||||||
|
|
||||||
|
tough-cookie@^4.1.4:
|
||||||
|
version "4.1.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36"
|
||||||
|
integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==
|
||||||
|
dependencies:
|
||||||
|
psl "^1.1.33"
|
||||||
|
punycode "^2.1.1"
|
||||||
|
universalify "^0.2.0"
|
||||||
|
url-parse "^1.5.3"
|
||||||
|
|
||||||
|
tr46@^5.0.0:
|
||||||
|
version "5.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/tr46/-/tr46-5.0.0.tgz#3b46d583613ec7283020d79019f1335723801cec"
|
||||||
|
integrity sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==
|
||||||
|
dependencies:
|
||||||
|
punycode "^2.3.1"
|
||||||
|
|
||||||
|
universalify@^0.2.0:
|
||||||
|
version "0.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0"
|
||||||
|
integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==
|
||||||
|
|
||||||
|
url-parse@^1.5.3:
|
||||||
|
version "1.5.10"
|
||||||
|
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
|
||||||
|
integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
|
||||||
|
dependencies:
|
||||||
|
querystringify "^2.1.1"
|
||||||
|
requires-port "^1.0.0"
|
||||||
|
|
||||||
|
w3c-xmlserializer@^5.0.0:
|
||||||
|
version "5.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz#f925ba26855158594d907313cedd1476c5967f6c"
|
||||||
|
integrity sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==
|
||||||
|
dependencies:
|
||||||
|
xml-name-validator "^5.0.0"
|
||||||
|
|
||||||
|
webidl-conversions@^7.0.0:
|
||||||
|
version "7.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a"
|
||||||
|
integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
|
||||||
|
|
||||||
|
whatwg-encoding@^3.1.1:
|
||||||
|
version "3.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5"
|
||||||
|
integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==
|
||||||
|
dependencies:
|
||||||
|
iconv-lite "0.6.3"
|
||||||
|
|
||||||
|
whatwg-mimetype@^4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a"
|
||||||
|
integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==
|
||||||
|
|
||||||
|
whatwg-url@^14.0.0:
|
||||||
|
version "14.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.0.0.tgz#00baaa7fd198744910c4b1ef68378f2200e4ceb6"
|
||||||
|
integrity sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==
|
||||||
|
dependencies:
|
||||||
|
tr46 "^5.0.0"
|
||||||
|
webidl-conversions "^7.0.0"
|
||||||
|
|
||||||
|
ws@^8.18.0:
|
||||||
|
version "8.18.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc"
|
||||||
|
integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==
|
||||||
|
|
||||||
|
xml-name-validator@^5.0.0:
|
||||||
|
version "5.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz#82be9b957f7afdacf961e5980f1bf227c0bf7673"
|
||||||
|
integrity sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==
|
||||||
|
|
||||||
|
xmlchars@^2.2.0:
|
||||||
|
version "2.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
|
||||||
|
integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
|
Loading…
Reference in a new issue