@blinkk/root-password-protect 1.0.0-rc.35 → 1.0.0-rc.36
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/bin/root-password-protect.js +5 -14
- package/dist/cli.js +31 -4
- package/dist/core.d.ts +7 -1
- package/dist/core.js +41 -1
- package/dist/plugin.d.ts +11 -2
- package/dist/plugin.js +53 -24
- package/package.json +9 -12
|
@@ -3,24 +3,15 @@
|
|
|
3
3
|
import {createRequire} from 'node:module';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import {fileURLToPath} from 'node:url';
|
|
6
|
-
import {
|
|
7
|
-
import {bgGreen, black} from 'kleur/colors';
|
|
8
|
-
import {generateHash} from '../dist/cli.js';
|
|
6
|
+
import {CliRunner} from '../dist/cli.js';
|
|
9
7
|
|
|
10
8
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
11
9
|
const require = createRequire(import.meta.url);
|
|
12
10
|
const packageJson = require(path.join(__dirname, '../package.json'));
|
|
13
11
|
|
|
14
|
-
async function main() {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const program = new Command('root-password-protect');
|
|
18
|
-
program.version(packageJson.version);
|
|
19
|
-
program
|
|
20
|
-
.command('generate-hash <password>')
|
|
21
|
-
.description('generates root-cms.d.ts from *.schema.ts files in the project')
|
|
22
|
-
.action(generateHash);
|
|
23
|
-
await program.parseAsync(process.argv);
|
|
12
|
+
async function main(argv) {
|
|
13
|
+
const cli = new CliRunner('root-password-protect', packageJson.version);
|
|
14
|
+
await cli.run();
|
|
24
15
|
}
|
|
25
16
|
|
|
26
|
-
main();
|
|
17
|
+
main(process.argv);
|
package/dist/cli.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
//
|
|
1
|
+
// src/cli/cli.ts
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { bgGreen, black } from "kleur/colors";
|
|
4
|
+
|
|
5
|
+
// src/core/password.ts
|
|
2
6
|
import crypto from "crypto";
|
|
3
7
|
var PASSWORD_ITERATIONS = 1e4;
|
|
4
8
|
var PASSWORD_HASH_LENGTH = 64;
|
|
@@ -30,7 +34,7 @@ function generateHash(password, salt) {
|
|
|
30
34
|
});
|
|
31
35
|
}
|
|
32
36
|
|
|
33
|
-
// cli/
|
|
37
|
+
// src/cli/generate-hash.ts
|
|
34
38
|
async function generateHash2(password) {
|
|
35
39
|
const { hash, salt } = await hashPassword(password);
|
|
36
40
|
console.log('// Generated by: `root-password-protect generate-hash "..."`.');
|
|
@@ -39,7 +43,30 @@ async function generateHash2(password) {
|
|
|
39
43
|
console.log(` salt: '${salt}',`);
|
|
40
44
|
console.log("}");
|
|
41
45
|
}
|
|
46
|
+
|
|
47
|
+
// src/cli/cli.ts
|
|
48
|
+
var CliRunner = class {
|
|
49
|
+
constructor(name, version) {
|
|
50
|
+
this.name = name;
|
|
51
|
+
this.version = version;
|
|
52
|
+
}
|
|
53
|
+
async run(argv) {
|
|
54
|
+
const program = new Command(this.name);
|
|
55
|
+
program.version(this.version);
|
|
56
|
+
program.option("-q, --quiet", "quiet");
|
|
57
|
+
program.hook("preAction", (cmd) => {
|
|
58
|
+
if (!cmd.opts().quiet) {
|
|
59
|
+
console.log(
|
|
60
|
+
`\u{1F955} ${bgGreen(black(` ${this.name} `))} v${this.version}
|
|
61
|
+
`
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
program.command("generate-hash <password>").description("generates a hash/salt pair from a plain-text password").action(generateHash2);
|
|
66
|
+
await program.parseAsync(argv);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
42
69
|
export {
|
|
43
|
-
|
|
70
|
+
CliRunner
|
|
44
71
|
};
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaS9jbGkudHMiLCAiLi4vc3JjL2NvcmUvcGFzc3dvcmQudHMiLCAiLi4vc3JjL2NsaS9nZW5lcmF0ZS1oYXNoLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge0NvbW1hbmR9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQge2JnR3JlZW4sIGJsYWNrfSBmcm9tICdrbGV1ci9jb2xvcnMnO1xuaW1wb3J0IHtnZW5lcmF0ZUhhc2h9IGZyb20gJy4vZ2VuZXJhdGUtaGFzaCc7XG5cbmV4cG9ydCBjbGFzcyBDbGlSdW5uZXIge1xuICBwcml2YXRlIG5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gIH1cblxuICBhc3luYyBydW4oYXJndjogc3RyaW5nW10pIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQodGhpcy5uYW1lKTtcbiAgICBwcm9ncmFtLnZlcnNpb24odGhpcy52ZXJzaW9uKTtcbiAgICBwcm9ncmFtLm9wdGlvbignLXEsIC0tcXVpZXQnLCAncXVpZXQnKTtcbiAgICBwcm9ncmFtLmhvb2soJ3ByZUFjdGlvbicsIChjbWQpID0+IHtcbiAgICAgIGlmICghY21kLm9wdHMoKS5xdWlldCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgXHVEODNFXHVERDU1ICR7YmdHcmVlbihibGFjayhgICR7dGhpcy5uYW1lfSBgKSl9IHYke3RoaXMudmVyc2lvbn1cXG5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvZ3JhbVxuICAgICAgLmNvbW1hbmQoJ2dlbmVyYXRlLWhhc2ggPHBhc3N3b3JkPicpXG4gICAgICAuZGVzY3JpcHRpb24oJ2dlbmVyYXRlcyBhIGhhc2gvc2FsdCBwYWlyIGZyb20gYSBwbGFpbi10ZXh0IHBhc3N3b3JkJylcbiAgICAgIC5hY3Rpb24oZ2VuZXJhdGVIYXNoKTtcbiAgICBhd2FpdCBwcm9ncmFtLnBhcnNlQXN5bmMoYXJndik7XG4gIH1cbn1cbiIsICJpbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5cbmNvbnN0IFBBU1NXT1JEX0lURVJBVElPTlMgPSAxMDAwMDtcbmNvbnN0IFBBU1NXT1JEX0hBU0hfTEVOR1RIID0gNjQ7XG5jb25zdCBQQVNTV09SRF9ESUdFU1QgPSAnc2hhMjU2JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhc2hQYXNzd29yZChcbiAgcGFzc3dvcmQ6IHN0cmluZ1xuKTogUHJvbWlzZTx7aGFzaDogc3RyaW5nOyBzYWx0OiBzdHJpbmd9PiB7XG4gIGNvbnN0IHNhbHQgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgaGFzaCA9IGF3YWl0IGdlbmVyYXRlSGFzaChwYXNzd29yZCwgc2FsdCk7XG4gIHJldHVybiB7aGFzaCwgc2FsdH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlQYXNzd29yZChcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgaGFzaDogc3RyaW5nLFxuICBzYWx0OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBnZW5lcmF0ZWRIYXNoID0gYXdhaXQgZ2VuZXJhdGVIYXNoKHBhc3N3b3JkLCBzYWx0KTtcbiAgcmV0dXJuIGhhc2ggPT09IGdlbmVyYXRlZEhhc2g7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUhhc2gocGFzc3dvcmQ6IHN0cmluZywgc2FsdDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjcnlwdG8ucGJrZGYyKFxuICAgICAgcGFzc3dvcmQsXG4gICAgICBzYWx0LFxuICAgICAgUEFTU1dPUkRfSVRFUkFUSU9OUyxcbiAgICAgIFBBU1NXT1JEX0hBU0hfTEVOR1RILFxuICAgICAgUEFTU1dPUkRfRElHRVNULFxuICAgICAgKGVyciwgZGVyaXZlZEtleSkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigncGFzc3dvcmQgaGFzaGluZyBmYWlsZWQnKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhhc2ggPSBkZXJpdmVkS2V5LnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgcmVzb2x2ZShoYXNoKTtcbiAgICAgIH1cbiAgICApO1xuICB9KTtcbn1cbiIsICJpbXBvcnQge2hhc2hQYXNzd29yZH0gZnJvbSAnLi4vY29yZS9wYXNzd29yZC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUhhc2gocGFzc3dvcmQ6IHN0cmluZykge1xuICBjb25zdCB7aGFzaCwgc2FsdH0gPSBhd2FpdCBoYXNoUGFzc3dvcmQocGFzc3dvcmQpO1xuICBjb25zb2xlLmxvZygnLy8gR2VuZXJhdGVkIGJ5OiBgcm9vdC1wYXNzd29yZC1wcm90ZWN0IGdlbmVyYXRlLWhhc2ggXCIuLi5cImAuJyk7XG4gIGNvbnNvbGUubG9nKCdwYXNzd29yZDogeycpO1xuICBjb25zb2xlLmxvZyhgICBoYXNoOiAnJHtoYXNofScsYCk7XG4gIGNvbnNvbGUubG9nKGAgIHNhbHQ6ICcke3NhbHR9JyxgKTtcbiAgY29uc29sZS5sb2coJ30nKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFRLGVBQWM7QUFDdEIsU0FBUSxTQUFTLGFBQVk7OztBQ0Q3QixPQUFPLFlBQVk7QUFFbkIsSUFBTSxzQkFBc0I7QUFDNUIsSUFBTSx1QkFBdUI7QUFDN0IsSUFBTSxrQkFBa0I7QUFFeEIsZUFBc0IsYUFDcEIsVUFDdUM7QUFDdkMsUUFBTSxPQUFPLE9BQU8sWUFBWSxFQUFFLEVBQUUsU0FBUyxLQUFLO0FBQ2xELFFBQU0sT0FBTyxNQUFNLGFBQWEsVUFBVSxJQUFJO0FBQzlDLFNBQU8sRUFBQyxNQUFNLEtBQUk7QUFDcEI7QUFXTyxTQUFTLGFBQWEsVUFBa0IsTUFBK0I7QUFDNUUsU0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDdEMsV0FBTztBQUFBLE1BQ0w7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQSxDQUFDLEtBQUssZUFBZTtBQUNuQixZQUFJLEtBQUs7QUFDUCxrQkFBUSxNQUFNLHlCQUF5QjtBQUN2QyxrQkFBUSxNQUFNLEdBQUc7QUFDakIsaUJBQU8sR0FBRztBQUNWO0FBQUEsUUFDRjtBQUNBLGNBQU0sT0FBTyxXQUFXLFNBQVMsS0FBSztBQUN0QyxnQkFBUSxJQUFJO0FBQUEsTUFDZDtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFDSDs7O0FDekNBLGVBQXNCQSxjQUFhLFVBQWtCO0FBQ25ELFFBQU0sRUFBQyxNQUFNLEtBQUksSUFBSSxNQUFNLGFBQWEsUUFBUTtBQUNoRCxVQUFRLElBQUksK0RBQStEO0FBQzNFLFVBQVEsSUFBSSxhQUFhO0FBQ3pCLFVBQVEsSUFBSSxZQUFZLElBQUksSUFBSTtBQUNoQyxVQUFRLElBQUksWUFBWSxJQUFJLElBQUk7QUFDaEMsVUFBUSxJQUFJLEdBQUc7QUFDakI7OztBRkxPLElBQU0sWUFBTixNQUFnQjtBQUFBLEVBSXJCLFlBQVksTUFBYyxTQUFpQjtBQUN6QyxTQUFLLE9BQU87QUFDWixTQUFLLFVBQVU7QUFBQSxFQUNqQjtBQUFBLEVBRUEsTUFBTSxJQUFJLE1BQWdCO0FBQ3hCLFVBQU0sVUFBVSxJQUFJLFFBQVEsS0FBSyxJQUFJO0FBQ3JDLFlBQVEsUUFBUSxLQUFLLE9BQU87QUFDNUIsWUFBUSxPQUFPLGVBQWUsT0FBTztBQUNyQyxZQUFRLEtBQUssYUFBYSxDQUFDLFFBQVE7QUFDakMsVUFBSSxDQUFDLElBQUksS0FBSyxFQUFFLE9BQU87QUFDckIsZ0JBQVE7QUFBQSxVQUNOLGFBQU0sUUFBUSxNQUFNLElBQUksS0FBSyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssS0FBSyxPQUFPO0FBQUE7QUFBQSxRQUN6RDtBQUFBLE1BQ0Y7QUFBQSxJQUNGLENBQUM7QUFDRCxZQUNHLFFBQVEsMEJBQTBCLEVBQ2xDLFlBQVksdURBQXVELEVBQ25FLE9BQU9DLGFBQVk7QUFDdEIsVUFBTSxRQUFRLFdBQVcsSUFBSTtBQUFBLEVBQy9CO0FBQ0Y7IiwKICAibmFtZXMiOiBbImdlbmVyYXRlSGFzaCIsICJnZW5lcmF0ZUhhc2giXQp9Cg==
|
package/dist/core.d.ts
CHANGED
|
@@ -1,2 +1,8 @@
|
|
|
1
|
+
declare function hashPassword(password: string): Promise<{
|
|
2
|
+
hash: string;
|
|
3
|
+
salt: string;
|
|
4
|
+
}>;
|
|
5
|
+
declare function verifyPassword(password: string, hash: string, salt: string): Promise<boolean>;
|
|
6
|
+
declare function generateHash(password: string, salt: string): Promise<string>;
|
|
1
7
|
|
|
2
|
-
export {
|
|
8
|
+
export { generateHash, hashPassword, verifyPassword };
|
package/dist/core.js
CHANGED
|
@@ -1 +1,41 @@
|
|
|
1
|
-
|
|
1
|
+
// src/core/password.ts
|
|
2
|
+
import crypto from "crypto";
|
|
3
|
+
var PASSWORD_ITERATIONS = 1e4;
|
|
4
|
+
var PASSWORD_HASH_LENGTH = 64;
|
|
5
|
+
var PASSWORD_DIGEST = "sha256";
|
|
6
|
+
async function hashPassword(password) {
|
|
7
|
+
const salt = crypto.randomBytes(16).toString("hex");
|
|
8
|
+
const hash = await generateHash(password, salt);
|
|
9
|
+
return { hash, salt };
|
|
10
|
+
}
|
|
11
|
+
async function verifyPassword(password, hash, salt) {
|
|
12
|
+
const generatedHash = await generateHash(password, salt);
|
|
13
|
+
return hash === generatedHash;
|
|
14
|
+
}
|
|
15
|
+
function generateHash(password, salt) {
|
|
16
|
+
return new Promise((resolve, reject) => {
|
|
17
|
+
crypto.pbkdf2(
|
|
18
|
+
password,
|
|
19
|
+
salt,
|
|
20
|
+
PASSWORD_ITERATIONS,
|
|
21
|
+
PASSWORD_HASH_LENGTH,
|
|
22
|
+
PASSWORD_DIGEST,
|
|
23
|
+
(err, derivedKey) => {
|
|
24
|
+
if (err) {
|
|
25
|
+
console.error("password hashing failed");
|
|
26
|
+
console.error(err);
|
|
27
|
+
reject(err);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const hash = derivedKey.toString("hex");
|
|
31
|
+
resolve(hash);
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
generateHash,
|
|
38
|
+
hashPassword,
|
|
39
|
+
verifyPassword
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvcmUvcGFzc3dvcmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcblxuY29uc3QgUEFTU1dPUkRfSVRFUkFUSU9OUyA9IDEwMDAwO1xuY29uc3QgUEFTU1dPUkRfSEFTSF9MRU5HVEggPSA2NDtcbmNvbnN0IFBBU1NXT1JEX0RJR0VTVCA9ICdzaGEyNTYnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFzaFBhc3N3b3JkKFxuICBwYXNzd29yZDogc3RyaW5nXG4pOiBQcm9taXNlPHtoYXNoOiBzdHJpbmc7IHNhbHQ6IHN0cmluZ30+IHtcbiAgY29uc3Qgc2FsdCA9IGNyeXB0by5yYW5kb21CeXRlcygxNikudG9TdHJpbmcoJ2hleCcpO1xuICBjb25zdCBoYXNoID0gYXdhaXQgZ2VuZXJhdGVIYXNoKHBhc3N3b3JkLCBzYWx0KTtcbiAgcmV0dXJuIHtoYXNoLCBzYWx0fTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVBhc3N3b3JkKFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBoYXNoOiBzdHJpbmcsXG4gIHNhbHQ6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGdlbmVyYXRlZEhhc2ggPSBhd2FpdCBnZW5lcmF0ZUhhc2gocGFzc3dvcmQsIHNhbHQpO1xuICByZXR1cm4gaGFzaCA9PT0gZ2VuZXJhdGVkSGFzaDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSGFzaChwYXNzd29yZDogc3RyaW5nLCBzYWx0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNyeXB0by5wYmtkZjIoXG4gICAgICBwYXNzd29yZCxcbiAgICAgIHNhbHQsXG4gICAgICBQQVNTV09SRF9JVEVSQVRJT05TLFxuICAgICAgUEFTU1dPUkRfSEFTSF9MRU5HVEgsXG4gICAgICBQQVNTV09SRF9ESUdFU1QsXG4gICAgICAoZXJyLCBkZXJpdmVkS2V5KSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdwYXNzd29yZCBoYXNoaW5nIGZhaWxlZCcpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGFzaCA9IGRlcml2ZWRLZXkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICByZXNvbHZlKGhhc2gpO1xuICAgICAgfVxuICAgICk7XG4gIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLE9BQU8sWUFBWTtBQUVuQixJQUFNLHNCQUFzQjtBQUM1QixJQUFNLHVCQUF1QjtBQUM3QixJQUFNLGtCQUFrQjtBQUV4QixlQUFzQixhQUNwQixVQUN1QztBQUN2QyxRQUFNLE9BQU8sT0FBTyxZQUFZLEVBQUUsRUFBRSxTQUFTLEtBQUs7QUFDbEQsUUFBTSxPQUFPLE1BQU0sYUFBYSxVQUFVLElBQUk7QUFDOUMsU0FBTyxFQUFDLE1BQU0sS0FBSTtBQUNwQjtBQUVBLGVBQXNCLGVBQ3BCLFVBQ0EsTUFDQSxNQUNrQjtBQUNsQixRQUFNLGdCQUFnQixNQUFNLGFBQWEsVUFBVSxJQUFJO0FBQ3ZELFNBQU8sU0FBUztBQUNsQjtBQUVPLFNBQVMsYUFBYSxVQUFrQixNQUErQjtBQUM1RSxTQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUN0QyxXQUFPO0FBQUEsTUFDTDtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBLENBQUMsS0FBSyxlQUFlO0FBQ25CLFlBQUksS0FBSztBQUNQLGtCQUFRLE1BQU0seUJBQXlCO0FBQ3ZDLGtCQUFRLE1BQU0sR0FBRztBQUNqQixpQkFBTyxHQUFHO0FBQ1Y7QUFBQSxRQUNGO0FBQ0EsY0FBTSxPQUFPLFdBQVcsU0FBUyxLQUFLO0FBQ3RDLGdCQUFRLElBQUk7QUFBQSxNQUNkO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogW10KfQo=
|
package/dist/plugin.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import { Plugin } from '@blinkk/root';
|
|
1
|
+
import { Plugin, Request, Response } from '@blinkk/root';
|
|
2
|
+
|
|
3
|
+
interface PasswordPageProps {
|
|
4
|
+
nonce: string;
|
|
5
|
+
error?: string;
|
|
6
|
+
}
|
|
2
7
|
|
|
3
8
|
interface PasswordProtectedRoute {
|
|
4
9
|
/**
|
|
@@ -32,5 +37,9 @@ interface PasswordProtectPluginOptions {
|
|
|
32
37
|
protectedRoutes: PasswordProtectedRoute[];
|
|
33
38
|
}
|
|
34
39
|
declare function passwordProtectPlugin(options: PasswordProtectPluginOptions): Plugin;
|
|
40
|
+
/**
|
|
41
|
+
* Renders the login page to a response.
|
|
42
|
+
*/
|
|
43
|
+
declare function renderPasswordPage(req: Request, res: Response, props?: Omit<PasswordPageProps, 'nonce'>): Promise<void>;
|
|
35
44
|
|
|
36
|
-
export { type PasswordProtectPluginOptions, type PasswordProtectedRoute, passwordProtectPlugin };
|
|
45
|
+
export { type PasswordProtectPluginOptions, type PasswordProtectedRoute, passwordProtectPlugin, renderPasswordPage };
|
package/dist/plugin.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
//
|
|
1
|
+
// src/plugin/plugin.tsx
|
|
2
2
|
import bodyParser from "body-parser";
|
|
3
3
|
import micromatch from "micromatch";
|
|
4
|
+
import renderToString from "preact-render-to-string";
|
|
4
5
|
|
|
5
|
-
//
|
|
6
|
-
import { render as renderToString } from "preact-render-to-string";
|
|
7
|
-
import { jsx, jsxs } from "preact/jsx-runtime";
|
|
6
|
+
// src/components/PasswordPage/PasswordPage.css.ts
|
|
8
7
|
var CSS = `
|
|
9
8
|
.signin {
|
|
10
9
|
font-family: 'Google Sans', arial, sans-serif;
|
|
@@ -112,6 +111,9 @@ var CSS = `
|
|
|
112
111
|
margin: 20px auto 0;
|
|
113
112
|
}
|
|
114
113
|
`;
|
|
114
|
+
|
|
115
|
+
// src/components/PasswordPage/PasswordPage.tsx
|
|
116
|
+
import { jsx, jsxs } from "preact/jsx-runtime";
|
|
115
117
|
function PasswordPage(props) {
|
|
116
118
|
return /* @__PURE__ */ jsxs("html", { children: [
|
|
117
119
|
/* @__PURE__ */ jsxs("head", { children: [
|
|
@@ -129,10 +131,11 @@ function PasswordPage(props) {
|
|
|
129
131
|
"link",
|
|
130
132
|
{
|
|
131
133
|
rel: "stylesheet",
|
|
132
|
-
href: "https://fonts.googleapis.com/css2?family=Google+Sans:wght@500&display=swap"
|
|
134
|
+
href: "https://fonts.googleapis.com/css2?family=Google+Sans:wght@500&display=swap",
|
|
135
|
+
nonce: props.nonce
|
|
133
136
|
}
|
|
134
137
|
),
|
|
135
|
-
/* @__PURE__ */ jsx("style", { children: CSS })
|
|
138
|
+
/* @__PURE__ */ jsx("style", { nonce: props.nonce, children: CSS })
|
|
136
139
|
] }),
|
|
137
140
|
/* @__PURE__ */ jsx("body", { children: /* @__PURE__ */ jsx("div", { id: "root", children: /* @__PURE__ */ jsxs("div", { className: "signin", children: [
|
|
138
141
|
/* @__PURE__ */ jsxs("div", { className: "signin__headline", children: [
|
|
@@ -162,7 +165,6 @@ function ShieldIcon() {
|
|
|
162
165
|
"svg",
|
|
163
166
|
{
|
|
164
167
|
xmlns: "http://www.w3.org/2000/svg",
|
|
165
|
-
class: "icon icon-tabler icon-tabler-shield-lock-filled",
|
|
166
168
|
width: "36",
|
|
167
169
|
height: "36",
|
|
168
170
|
viewBox: "0 0 24 24",
|
|
@@ -185,21 +187,35 @@ function ShieldIcon() {
|
|
|
185
187
|
}
|
|
186
188
|
);
|
|
187
189
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
190
|
+
|
|
191
|
+
// src/core/csp.ts
|
|
192
|
+
import crypto from "node:crypto";
|
|
193
|
+
function generateNonce() {
|
|
194
|
+
return crypto.randomBytes(16).toString("base64");
|
|
195
|
+
}
|
|
196
|
+
function setSecurityHeaders(res, nonce) {
|
|
197
|
+
res.setHeader("x-frame-options", "SAMEORIGIN");
|
|
198
|
+
res.setHeader(
|
|
199
|
+
"strict-transport-security",
|
|
200
|
+
"max-age=63072000; includeSubdomains; preload"
|
|
201
|
+
);
|
|
202
|
+
res.setHeader("x-content-type-options", "nosniff");
|
|
203
|
+
res.setHeader("x-xss-protection", "1; mode=block");
|
|
204
|
+
const directives = [
|
|
205
|
+
"base-uri 'none'",
|
|
206
|
+
"object-src 'none'",
|
|
207
|
+
`script-src 'self' 'nonce-${nonce}'`
|
|
208
|
+
];
|
|
209
|
+
res.setHeader("content-security-policy-report-only", directives.join(";"));
|
|
194
210
|
}
|
|
195
211
|
|
|
196
|
-
// core/password.ts
|
|
197
|
-
import
|
|
212
|
+
// src/core/password.ts
|
|
213
|
+
import crypto2 from "crypto";
|
|
198
214
|
var PASSWORD_ITERATIONS = 1e4;
|
|
199
215
|
var PASSWORD_HASH_LENGTH = 64;
|
|
200
216
|
var PASSWORD_DIGEST = "sha256";
|
|
201
217
|
async function hashPassword(password) {
|
|
202
|
-
const salt =
|
|
218
|
+
const salt = crypto2.randomBytes(16).toString("hex");
|
|
203
219
|
const hash = await generateHash(password, salt);
|
|
204
220
|
return { hash, salt };
|
|
205
221
|
}
|
|
@@ -209,7 +225,7 @@ async function verifyPassword(password, hash, salt) {
|
|
|
209
225
|
}
|
|
210
226
|
function generateHash(password, salt) {
|
|
211
227
|
return new Promise((resolve, reject) => {
|
|
212
|
-
|
|
228
|
+
crypto2.pbkdf2(
|
|
213
229
|
password,
|
|
214
230
|
salt,
|
|
215
231
|
PASSWORD_ITERATIONS,
|
|
@@ -229,7 +245,10 @@ function generateHash(password, salt) {
|
|
|
229
245
|
});
|
|
230
246
|
}
|
|
231
247
|
|
|
232
|
-
//
|
|
248
|
+
// src/plugin/plugin.tsx
|
|
249
|
+
import { jsx as jsx2 } from "preact/jsx-runtime";
|
|
250
|
+
var SESSION_COOKIE_HASH = "password_protect.hash";
|
|
251
|
+
var SESSION_COOKIE_SALT = "password_protect.hash";
|
|
233
252
|
function passwordProtectPlugin(options) {
|
|
234
253
|
const protectedRoutesUserConfig = options.protectedRoutes || [];
|
|
235
254
|
const protectedRoutes = protectedRoutesUserConfig.filter((protectedRoute) => {
|
|
@@ -293,19 +312,29 @@ async function handleProtectedRoute(protectedRoute, req, res, next) {
|
|
|
293
312
|
}
|
|
294
313
|
async function setSessionCookie(protectedRoute, res) {
|
|
295
314
|
const { hash, salt } = await hashPassword(protectedRoute.password.hash);
|
|
296
|
-
res.session.setItem(
|
|
297
|
-
res.session.setItem(
|
|
315
|
+
res.session.setItem(SESSION_COOKIE_HASH, hash);
|
|
316
|
+
res.session.setItem(SESSION_COOKIE_SALT, salt);
|
|
298
317
|
res.saveSession();
|
|
299
318
|
}
|
|
300
319
|
async function verifySessionCookie(protectedRoute, req) {
|
|
301
|
-
const hash = req.session.getItem(
|
|
302
|
-
const salt = req.session.getItem(
|
|
320
|
+
const hash = req.session.getItem(SESSION_COOKIE_HASH);
|
|
321
|
+
const salt = req.session.getItem(SESSION_COOKIE_SALT);
|
|
303
322
|
if (!hash || !salt) {
|
|
304
323
|
return false;
|
|
305
324
|
}
|
|
306
325
|
return await verifyPassword(protectedRoute.password.hash, hash, salt);
|
|
307
326
|
}
|
|
327
|
+
async function renderPasswordPage(req, res, props) {
|
|
328
|
+
const nonce = generateNonce();
|
|
329
|
+
const mainHtml = renderToString(/* @__PURE__ */ jsx2(PasswordPage, { ...props, nonce }));
|
|
330
|
+
const html = `<!doctype html>
|
|
331
|
+
${mainHtml}`;
|
|
332
|
+
res.setHeader("content-type", "text/html");
|
|
333
|
+
setSecurityHeaders(res, nonce);
|
|
334
|
+
res.send(html);
|
|
335
|
+
}
|
|
308
336
|
export {
|
|
309
|
-
passwordProtectPlugin
|
|
337
|
+
passwordProtectPlugin,
|
|
338
|
+
renderPasswordPage
|
|
310
339
|
};
|
|
311
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9wbHVnaW4udHMiLCAiLi4vY29yZS9wYXNzd29yZC1wYWdlLnRzeCIsICIuLi9jb3JlL3Bhc3N3b3JkLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge1JlcXVlc3QsIFJlc3BvbnNlLCBOZXh0RnVuY3Rpb24sIFBsdWdpbiwgU2VydmVyfSBmcm9tICdAYmxpbmtrL3Jvb3QnO1xuaW1wb3J0IGJvZHlQYXJzZXIgZnJvbSAnYm9keS1wYXJzZXInO1xuaW1wb3J0IG1pY3JvbWF0Y2ggZnJvbSAnbWljcm9tYXRjaCc7XG5pbXBvcnQge3JlbmRlclBhc3N3b3JkUGFnZX0gZnJvbSAnLi9wYXNzd29yZC1wYWdlLmpzJztcbmltcG9ydCB7aGFzaFBhc3N3b3JkLCB2ZXJpZnlQYXNzd29yZH0gZnJvbSAnLi9wYXNzd29yZC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFzc3dvcmRQcm90ZWN0ZWRSb3V0ZSB7XG4gIC8qKlxuICAgKiBVUkwgZ2xvYiBwYXR0ZXJuIHRvIG1hdGNoIChyZWdleCBub3Qgc3VwcG9ydGVkIHlldCkuXG4gICAqL1xuICBzb3VyY2U6IHN0cmluZztcblxuICBwYXNzd29yZDoge1xuICAgIC8qKlxuICAgICAqIEEgaGFzaCBvZiB0aGUgcGFzc3dvcmQuIE5vdGU6IGEgcGxhaW4tdGV4dCBwYXNzd29yZCBzaG91bGQgbmV2ZXIgYmVcbiAgICAgKiBzdG9yZWQgaW4gY29kZS4gQ29uc2lkZXIgc3RvcmluZyB0aGlzIHZhbHVlIGluIGEgYC5lbnZgIGZpbGUgZm9yIGV4dHJhXG4gICAgICogc2VjdXJpdHkuXG4gICAgICpcbiAgICAgKiBHZW5lcmF0ZSB0aGlzIGJ5IHJ1bm5pbmc6XG4gICAgICogYGBgXG4gICAgICogcm9vdC1wYXNzd29yZC1wcm90ZWN0IGdlbmVyYXRlLWhhc2ggXCJNWV9QQVNTV09SRFwiXG4gICAgICogYGBgYFxuICAgICAqL1xuICAgIGhhc2g6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIHN0cmluZyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBwYXNzd29yZCBoYXNoLlxuICAgICAqXG4gICAgICogR2VuZXJhdGUgdGhpcyBieSBydW5uaW5nOlxuICAgICAqIGBgYFxuICAgICAqIHJvb3QtcGFzc3dvcmQtcHJvdGVjdCBnZW5lcmF0ZS1oYXNoIFwiTVlfUEFTU1dPUkRcIlxuICAgICAqIGBgYGBcbiAgICAgKi9cbiAgICBzYWx0OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFzc3dvcmRQcm90ZWN0UGx1Z2luT3B0aW9ucyB7XG4gIHByb3RlY3RlZFJvdXRlczogUGFzc3dvcmRQcm90ZWN0ZWRSb3V0ZVtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFzc3dvcmRQcm90ZWN0UGx1Z2luKFxuICBvcHRpb25zOiBQYXNzd29yZFByb3RlY3RQbHVnaW5PcHRpb25zXG4pOiBQbHVnaW4ge1xuICBjb25zdCBwcm90ZWN0ZWRSb3V0ZXNVc2VyQ29uZmlnID0gb3B0aW9ucy5wcm90ZWN0ZWRSb3V0ZXMgfHwgW107XG4gIGNvbnN0IHByb3RlY3RlZFJvdXRlcyA9IHByb3RlY3RlZFJvdXRlc1VzZXJDb25maWcuZmlsdGVyKChwcm90ZWN0ZWRSb3V0ZSkgPT4ge1xuICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgcHJvdGVjdGVkUm91dGUuc291cmNlICYmXG4gICAgICAgIHByb3RlY3RlZFJvdXRlLnBhc3N3b3JkICYmXG4gICAgICAgIHByb3RlY3RlZFJvdXRlLnBhc3N3b3JkLmhhc2ggJiZcbiAgICAgICAgcHJvdGVjdGVkUm91dGUucGFzc3dvcmQuc2FsdFxuICAgICk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBwYXNzd29yZC1wcm90ZWN0ZWQgcm91dGUgdGhhdCBtYXRjaGVzLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UHJvdGVjdGVkUm91dGVDb25maWcoXG4gICAgcmVxOiBSZXF1ZXN0XG4gICk6IFBhc3N3b3JkUHJvdGVjdGVkUm91dGUgfCBudWxsIHtcbiAgICBmb3IgKGNvbnN0IHByb3RlY3RlZFJvdXRlIG9mIHByb3RlY3RlZFJvdXRlcykge1xuICAgICAgaWYgKG1pY3JvbWF0Y2guaXNNYXRjaChyZXEucGF0aCwgcHJvdGVjdGVkUm91dGUuc291cmNlKSkge1xuICAgICAgICByZXR1cm4gcHJvdGVjdGVkUm91dGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAncm9vdC1wYXNzd29yZC1wcm90ZWN0JyxcbiAgICBjb25maWd1cmVTZXJ2ZXI6IChzZXJ2ZXI6IFNlcnZlcikgPT4ge1xuICAgICAgaWYgKHByb3RlY3RlZFJvdXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2VydmVyLnVzZShib2R5UGFyc2VyLnVybGVuY29kZWQoe2V4dGVuZGVkOiB0cnVlfSkpO1xuICAgICAgc2VydmVyLnVzZShhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJvdGVjdGVkUm91dGUgPSBnZXRQcm90ZWN0ZWRSb3V0ZUNvbmZpZyhyZXEpO1xuICAgICAgICBpZiAocHJvdGVjdGVkUm91dGUpIHtcbiAgICAgICAgICBhd2FpdCBoYW5kbGVQcm90ZWN0ZWRSb3V0ZShwcm90ZWN0ZWRSb3V0ZSwgcmVxLCByZXMsIG5leHQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBuZXh0KCk7XG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVQcm90ZWN0ZWRSb3V0ZShcbiAgcHJvdGVjdGVkUm91dGU6IFBhc3N3b3JkUHJvdGVjdGVkUm91dGUsXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uXG4pIHtcbiAgaWYgKHJlcS5tZXRob2QgPT09ICdQT1NUJykge1xuICAgIC8vIFZlcmlmeSBwYXNzd29yZCBhbmQgaWYgdmFsaWQgc2V0IGEgc2Vzc2lvbiBjb29raWUuXG4gICAgaWYgKFxuICAgICAgcmVxLmdldCgnY29udGVudC10eXBlJykgIT09ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnIHx8XG4gICAgICAhcmVxLmJvZHkgfHxcbiAgICAgICFyZXEuYm9keS5wYXNzd29yZFxuICAgICkge1xuICAgICAgcmVzLnN0YXR1cyg0MDApO1xuICAgICAgcmVuZGVyUGFzc3dvcmRQYWdlKHJlcSwgcmVzLCB7ZXJyb3I6ICdCYWQgcmVxdWVzdCAobm8gcGFzc3dvcmQpLid9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXNzd29yZCA9IHJlcS5ib2R5LnBhc3N3b3JkIGFzIHN0cmluZztcbiAgICBjb25zdCBpc1ZhbGlkID0gYXdhaXQgdmVyaWZ5UGFzc3dvcmQoXG4gICAgICBwYXNzd29yZCxcbiAgICAgIHByb3RlY3RlZFJvdXRlLnBhc3N3b3JkLmhhc2gsXG4gICAgICBwcm90ZWN0ZWRSb3V0ZS5wYXNzd29yZC5zYWx0XG4gICAgKTtcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIHJlbmRlclBhc3N3b3JkUGFnZShyZXEsIHJlcywge2Vycm9yOiAnSW5jb3JyZWN0IHBhc3N3b3JkLid9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gU2V0IGEgc2Vzc2lvbiBjb29raWUgdmFsdWUgdG8gdmVyaWZ5IHN1YnNlcXVlbnQgcmVxdWVzdHMuXG4gICAgYXdhaXQgc2V0U2Vzc2lvbkNvb2tpZShwcm90ZWN0ZWRSb3V0ZSwgcmVzKTtcbiAgICBuZXh0KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgcHJldmlvdXNseSBsb2dnZWQgaW4sIGNoZWNrIHRoZSBzZXNzaW9uIGNvb2tpZSBhZ2FpbnN0IHRoZSBjdXJyZW50XG4gIC8vIHBhc3N3b3JkIGhhc2guXG4gIGNvbnN0IGlzVmFsaWQgPSBhd2FpdCB2ZXJpZnlTZXNzaW9uQ29va2llKHByb3RlY3RlZFJvdXRlLCByZXEpO1xuICBpZiAoaXNWYWxpZCkge1xuICAgIG5leHQoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICByZW5kZXJQYXNzd29yZFBhZ2UocmVxLCByZXMpO1xufVxuXG4vKipcbiAqIFNhdmVzIGEgdmVyaWZpY2F0aW9uIHRva2VuIHRvIHRoZSBzZXNzaW9uIGNvb2tpZSBmb3Igc3Vic2VxdWVudCByZXF1ZXN0cy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2V0U2Vzc2lvbkNvb2tpZShcbiAgcHJvdGVjdGVkUm91dGU6IFBhc3N3b3JkUHJvdGVjdGVkUm91dGUsXG4gIHJlczogUmVzcG9uc2Vcbikge1xuICBjb25zdCB7aGFzaCwgc2FsdH0gPSBhd2FpdCBoYXNoUGFzc3dvcmQocHJvdGVjdGVkUm91dGUucGFzc3dvcmQuaGFzaCk7XG4gIHJlcy5zZXNzaW9uLnNldEl0ZW0oJ3Bhc3N3b3JkX3Byb3RlY3QuaGFzaCcsIGhhc2gpO1xuICByZXMuc2Vzc2lvbi5zZXRJdGVtKCdwYXNzd29yZF9wcm90ZWN0LnNhbHQnLCBzYWx0KTtcbiAgcmVzLnNhdmVTZXNzaW9uKCk7XG59XG5cbi8qKlxuICogVmVyaWZpZXMgdGhlIHNlc3Npb24gY29va2llIHZhbHVlIGlzIHZhbGlkLlxuICovXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlTZXNzaW9uQ29va2llKFxuICBwcm90ZWN0ZWRSb3V0ZTogUGFzc3dvcmRQcm90ZWN0ZWRSb3V0ZSxcbiAgcmVxOiBSZXF1ZXN0XG4pIHtcbiAgY29uc3QgaGFzaCA9IHJlcS5zZXNzaW9uLmdldEl0ZW0oJ3Bhc3N3b3JkX3Byb3RlY3QuaGFzaCcpO1xuICBjb25zdCBzYWx0ID0gcmVxLnNlc3Npb24uZ2V0SXRlbSgncGFzc3dvcmRfcHJvdGVjdC5zYWx0Jyk7XG4gIGlmICghaGFzaCB8fCAhc2FsdCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdmVyaWZ5UGFzc3dvcmQocHJvdGVjdGVkUm91dGUucGFzc3dvcmQuaGFzaCwgaGFzaCwgc2FsdCk7XG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7ZmlsZVVSTFRvUGF0aH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHtSZXF1ZXN0LCBSZXNwb25zZX0gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCB7cmVuZGVyIGFzIHJlbmRlclRvU3RyaW5nfSBmcm9tICdwcmVhY3QtcmVuZGVyLXRvLXN0cmluZyc7XG5cbmNvbnN0IENTUyA9IGBcbi5zaWduaW4ge1xuICBmb250LWZhbWlseTogJ0dvb2dsZSBTYW5zJywgYXJpYWwsIHNhbnMtc2VyaWY7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgcGFkZGluZzogNDhweCAyMHB4O1xuICBjb2xvcjogIzNjNDA0Mztcbn1cblxuLnNpZ25pbl9faGVhZGxpbmUge1xuICBtYXJnaW4tYm90dG9tOiA0MHB4O1xufVxuXG4uc2lnbmluX19oZWFkbGluZV9faWNvbiB7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG59XG5cbi5zaWduaW5fX2hlYWRsaW5lX19pY29uIHN2ZyB7XG4gIHdpZHRoOiA3MnB4O1xuICBoZWlnaHQ6IDcycHg7XG59XG5cbi5zaWduaW5fX2hlYWRsaW5lX190aXRsZSB7XG4gIGZvbnQtc2l6ZTogMzZweDtcbiAgbGluZS1oZWlnaHQ6IDEuMztcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1cblxuLnNpZ25pbl9faGVhZGxpbmVfX2JvZHkge1xuICBmb250LXNpemU6IDE4cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjU7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5zaWduaW5fX2Zvcm0ge1xuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IDhweDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbi5zaWduaW5fX2Zvcm1fX3Bhc3N3b3JkIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RhZGNlMDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBoZWlnaHQ6IDQwcHg7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBsZXR0ZXItc3BhY2luZzogLjI1cHg7XG4gIHBhZGRpbmc6IDAgMTJweDtcbiAgbWluLXdpZHRoOiAyNTBweDtcbiAgdHJhbnNpdGlvbjogYWxsIDAuMjE4cyBlYXNlO1xufVxuXG4uc2lnbmluX19mb3JtX19wYXNzd29yZDpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogI2QyZTNmYztcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg2NiwgMTMzLCAyNDQsIDAuMDQpO1xufVxuXG4uc2lnbmluX19idXR0b24ge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgYXBwZWFyYW5jZTogbm9uZTtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZ2FwOiAxMnB4O1xuICBwYWRkaW5nOiA4cHggMTFweDtcbiAgYmFja2dyb3VuZDogd2hpdGU7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkYWRjZTA7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgcGFkZGluZzogMCAxMnB4O1xuICBoZWlnaHQ6IDQwcHg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHRyYW5zaXRpb246IGFsbCAwLjIxOHMgZWFzZTtcbn1cblxuLnNpZ25pbl9fYnV0dG9uOmhvdmVyIHtcbiAgYm9yZGVyLWNvbG9yOiAjZDJlM2ZjO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDY2LCAxMzMsIDI0NCwgMC4wNCk7XG59XG5cbi5zaWduaW5fX2J1dHRvbl9faWNvbiB7XG4gIHdpZHRoOiAxOHB4O1xuICBoZWlnaHQ6IDE4cHg7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xufVxuXG4uc2lnbmluX19idXR0b25fX2xhYmVsIHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTtcbiAgbGV0dGVyLXNwYWNpbmc6IC4yNXB4O1xuICBmb250LXdlaWdodDogNTAwO1xuICBjb2xvcjogIzNjNDA0Mztcbn1cblxuLnNpZ25pbl9fZXJyb3Ige1xuICBjb2xvcjogcmVkO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBtYXgtd2lkdGg6IDYwY2g7XG4gIG1hcmdpbjogMjBweCBhdXRvIDA7XG59XG5gO1xuXG5pbnRlcmZhY2UgUGFzc3dvcmRQYWdlUHJvcHMge1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuZnVuY3Rpb24gUGFzc3dvcmRQYWdlKHByb3BzOiBQYXNzd29yZFBhZ2VQcm9wcykge1xuICByZXR1cm4gKFxuICAgIDxodG1sPlxuICAgICAgPGhlYWQ+XG4gICAgICAgIDxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiIC8+XG4gICAgICAgIDx0aXRsZT5Qcm90ZWN0ZWQ8L3RpdGxlPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cImljb25cIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2xoMy5nb29nbGV1c2VyY29udGVudC5jb20vaWpLNTBUZlFsVl95SnczaS1DTWxuRDZvc0g0UGJvWkJJTFpySmNXaG9OTUVtb3lDRDVlMWJBeFhiYU9QZTV3NGdHX1NjZjM3RVhybVo2cDhzUDJsdWU1ZkxaNDE5bTVKeUxNcz1lMzg1LXcyNTZcIlxuICAgICAgICAgIHR5cGU9XCJpbWFnZS9wbmdcIlxuICAgICAgICAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cInN0eWxlc2hlZXRcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUdvb2dsZStTYW5zOndnaHRANTAwJmRpc3BsYXk9c3dhcFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxzdHlsZT57Q1NTfTwvc3R5bGU+XG4gICAgICA8L2hlYWQ+XG4gICAgICA8Ym9keT5cbiAgICAgICAgPGRpdiBpZD1cInJvb3RcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNpZ25pblwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzaWduaW5fX2hlYWRsaW5lXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2lnbmluX19oZWFkbGluZV9faWNvblwiPlxuICAgICAgICAgICAgICAgIDxTaGllbGRJY29uIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8aDE+VGhpcyBwYWdlIGlzIHByb3RlY3RlZC48L2gxPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJzaWduaW5fX2hlYWRsaW5lX19ib2R5XCI+XG4gICAgICAgICAgICAgICAgRW50ZXIgdGhlIHBhc3N3b3JkIGJlbG93IHRvIGNvbnRpbnVlOlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxmb3JtIGNsYXNzTmFtZT1cInNpZ25pbl9fZm9ybVwiIG1ldGhvZD1cIlBPU1RcIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgaWQ9XCJwYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwic2lnbmluX19mb3JtX19wYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgbmFtZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUGFzc3dvcmRcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cInNpZ25pbl9fYnV0dG9uXCIgdHlwZT1cInN1Ym1pdFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2lnbmluX19idXR0b25fX2xhYmVsXCI+U3VibWl0PC9kaXY+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAge3Byb3BzLmVycm9yICYmIDxwIGNsYXNzTmFtZT1cInNpZ25pbl9fZXJyb3JcIj57cHJvcHMuZXJyb3J9PC9wPn1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2JvZHk+XG4gICAgPC9odG1sPlxuICApO1xufVxuXG5mdW5jdGlvbiBTaGllbGRJY29uKCkge1xuICByZXR1cm4gKFxuICAgIDxzdmdcbiAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgY2xhc3M9XCJpY29uIGljb24tdGFibGVyIGljb24tdGFibGVyLXNoaWVsZC1sb2NrLWZpbGxlZFwiXG4gICAgICB3aWR0aD1cIjM2XCJcbiAgICAgIGhlaWdodD1cIjM2XCJcbiAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgIHN0cm9rZT1cIiNmZjQ1MDBcIlxuICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgPlxuICAgICAgPHBhdGggc3Ryb2tlPVwibm9uZVwiIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIiAvPlxuICAgICAgPHBhdGhcbiAgICAgICAgZD1cIk0xMS45OTggMmwuMTE4IC4wMDdsLjA1OSAuMDA4bC4wNjEgLjAxM2wuMTExIC4wMzRhLjk5MyAuOTkzIDAgMCAxIC4yMTcgLjExMmwuMTA0IC4wODJsLjI1NSAuMjE4YTExIDExIDAgMCAwIDcuMTg5IDIuNTM3bC4zNDIgLS4wMWExIDEgMCAwIDEgMS4wMDUgLjcxN2ExMyAxMyAwIDAgMSAtOS4yMDggMTYuMjVhMSAxIDAgMCAxIC0uNTAyIDBhMTMgMTMgMCAwIDEgLTkuMjA5IC0xNi4yNWExIDEgMCAwIDEgMS4wMDUgLS43MTdhMTEgMTEgMCAwIDAgNy41MzEgLTIuNTI3bC4yNjMgLS4yMjVsLjA5NiAtLjA3NWEuOTkzIC45OTMgMCAwIDEgLjIxNyAtLjExMmwuMTEyIC0uMDM0YS45NyAuOTcgMCAwIDEgLjExOSAtLjAyMWwuMTE1IC0uMDA3em0uMDAyIDdhMiAyIDAgMCAwIC0xLjk5NSAxLjg1bC0uMDA1IC4xNWwuMDA1IC4xNWEyIDIgMCAwIDAgLjk5NSAxLjU4MXYxLjc2OWwuMDA3IC4xMTdhMSAxIDAgMCAwIDEuOTkzIC0uMTE3bC4wMDEgLTEuNzY4YTIgMiAwIDAgMCAtMS4wMDEgLTMuNzMyelwiXG4gICAgICAgIHN0cm9rZS13aWR0aD1cIjBcIlxuICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgIC8+XG4gICAgPC9zdmc+XG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJQYXNzd29yZFBhZ2UoXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgcHJvcHM/OiBQYXNzd29yZFBhZ2VQcm9wc1xuKSB7XG4gIGNvbnN0IG1haW5IdG1sID0gcmVuZGVyVG9TdHJpbmcoPFBhc3N3b3JkUGFnZSB7Li4ucHJvcHN9IC8+KTtcbiAgY29uc3QgaHRtbCA9IGA8IWRvY3R5cGUgaHRtbD5cXG4ke21haW5IdG1sfWA7XG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgcmVzLnNlbmQoaHRtbCk7XG59XG4iLCAiaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuXG5jb25zdCBQQVNTV09SRF9JVEVSQVRJT05TID0gMTAwMDA7XG5jb25zdCBQQVNTV09SRF9IQVNIX0xFTkdUSCA9IDY0O1xuY29uc3QgUEFTU1dPUkRfRElHRVNUID0gJ3NoYTI1Nic7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYXNoUGFzc3dvcmQoXG4gIHBhc3N3b3JkOiBzdHJpbmdcbik6IFByb21pc2U8e2hhc2g6IHN0cmluZzsgc2FsdDogc3RyaW5nfT4ge1xuICBjb25zdCBzYWx0ID0gY3J5cHRvLnJhbmRvbUJ5dGVzKDE2KS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IGhhc2ggPSBhd2FpdCBnZW5lcmF0ZUhhc2gocGFzc3dvcmQsIHNhbHQpO1xuICByZXR1cm4ge2hhc2gsIHNhbHR9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5UGFzc3dvcmQoXG4gIHBhc3N3b3JkOiBzdHJpbmcsXG4gIGhhc2g6IHN0cmluZyxcbiAgc2FsdDogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZ2VuZXJhdGVkSGFzaCA9IGF3YWl0IGdlbmVyYXRlSGFzaChwYXNzd29yZCwgc2FsdCk7XG4gIHJldHVybiBoYXNoID09PSBnZW5lcmF0ZWRIYXNoO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUhhc2gocGFzc3dvcmQ6IHN0cmluZywgc2FsdDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjcnlwdG8ucGJrZGYyKFxuICAgICAgcGFzc3dvcmQsXG4gICAgICBzYWx0LFxuICAgICAgUEFTU1dPUkRfSVRFUkFUSU9OUyxcbiAgICAgIFBBU1NXT1JEX0hBU0hfTEVOR1RILFxuICAgICAgUEFTU1dPUkRfRElHRVNULFxuICAgICAgKGVyciwgZGVyaXZlZEtleSkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigncGFzc3dvcmQgaGFzaGluZyBmYWlsZWQnKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhhc2ggPSBkZXJpdmVkS2V5LnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgcmVzb2x2ZShoYXNoKTtcbiAgICAgIH1cbiAgICApO1xuICB9KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFDQSxPQUFPLGdCQUFnQjtBQUN2QixPQUFPLGdCQUFnQjs7O0FDQ3ZCLFNBQVEsVUFBVSxzQkFBcUI7QUFxSGpDLFNBQ0UsS0FERjtBQW5ITixJQUFNLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdIWixTQUFTLGFBQWEsT0FBMEI7QUFDOUMsU0FDRSxxQkFBQyxVQUNDO0FBQUEseUJBQUMsVUFDQztBQUFBLDBCQUFDLFVBQUssU0FBUSxTQUFRO0FBQUEsTUFDdEIsb0JBQUMsV0FBTSx1QkFBUztBQUFBLE1BQ2hCO0FBQUEs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
|
|
340
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3BsdWdpbi9wbHVnaW4udHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL1Bhc3N3b3JkUGFnZS9QYXNzd29yZFBhZ2UuY3NzLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL1Bhc3N3b3JkUGFnZS9QYXNzd29yZFBhZ2UudHN4IiwgIi4uL3NyYy9jb3JlL2NzcC50cyIsICIuLi9zcmMvY29yZS9wYXNzd29yZC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHtSZXF1ZXN0LCBSZXNwb25zZSwgTmV4dEZ1bmN0aW9uLCBQbHVnaW4sIFNlcnZlcn0gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCBib2R5UGFyc2VyIGZyb20gJ2JvZHktcGFyc2VyJztcbmltcG9ydCBtaWNyb21hdGNoIGZyb20gJ21pY3JvbWF0Y2gnO1xuaW1wb3J0IHJlbmRlclRvU3RyaW5nIGZyb20gJ3ByZWFjdC1yZW5kZXItdG8tc3RyaW5nJztcbmltcG9ydCB7XG4gIFBhc3N3b3JkUGFnZSxcbiAgUGFzc3dvcmRQYWdlUHJvcHMsXG59IGZyb20gJy4uL2NvbXBvbmVudHMvUGFzc3dvcmRQYWdlL1Bhc3N3b3JkUGFnZS5qcyc7XG5pbXBvcnQge2dlbmVyYXRlTm9uY2UsIHNldFNlY3VyaXR5SGVhZGVyc30gZnJvbSAnLi4vY29yZS9jc3AuanMnO1xuaW1wb3J0IHtoYXNoUGFzc3dvcmQsIHZlcmlmeVBhc3N3b3JkfSBmcm9tICcuLi9jb3JlL3Bhc3N3b3JkLmpzJztcblxuY29uc3QgU0VTU0lPTl9DT09LSUVfSEFTSCA9ICdwYXNzd29yZF9wcm90ZWN0Lmhhc2gnO1xuY29uc3QgU0VTU0lPTl9DT09LSUVfU0FMVCA9ICdwYXNzd29yZF9wcm90ZWN0Lmhhc2gnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhc3N3b3JkUHJvdGVjdGVkUm91dGUge1xuICAvKipcbiAgICogVVJMIGdsb2IgcGF0dGVybiB0byBtYXRjaCAocmVnZXggbm90IHN1cHBvcnRlZCB5ZXQpLlxuICAgKi9cbiAgc291cmNlOiBzdHJpbmc7XG5cbiAgcGFzc3dvcmQ6IHtcbiAgICAvKipcbiAgICAgKiBBIGhhc2ggb2YgdGhlIHBhc3N3b3JkLiBOb3RlOiBhIHBsYWluLXRleHQgcGFzc3dvcmQgc2hvdWxkIG5ldmVyIGJlXG4gICAgICogc3RvcmVkIGluIGNvZGUuIENvbnNpZGVyIHN0b3JpbmcgdGhpcyB2YWx1ZSBpbiBhIGAuZW52YCBmaWxlIGZvciBleHRyYVxuICAgICAqIHNlY3VyaXR5LlxuICAgICAqXG4gICAgICogR2VuZXJhdGUgdGhpcyBieSBydW5uaW5nOlxuICAgICAqIGBgYFxuICAgICAqIHJvb3QtcGFzc3dvcmQtcHJvdGVjdCBnZW5lcmF0ZS1oYXNoIFwiTVlfUEFTU1dPUkRcIlxuICAgICAqIGBgYGBcbiAgICAgKi9cbiAgICBoYXNoOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBzdHJpbmcgdXNlZCB0byBnZW5lcmF0ZSB0aGUgcGFzc3dvcmQgaGFzaC5cbiAgICAgKlxuICAgICAqIEdlbmVyYXRlIHRoaXMgYnkgcnVubmluZzpcbiAgICAgKiBgYGBcbiAgICAgKiByb290LXBhc3N3b3JkLXByb3RlY3QgZ2VuZXJhdGUtaGFzaCBcIk1ZX1BBU1NXT1JEXCJcbiAgICAgKiBgYGBgXG4gICAgICovXG4gICAgc2FsdDogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhc3N3b3JkUHJvdGVjdFBsdWdpbk9wdGlvbnMge1xuICBwcm90ZWN0ZWRSb3V0ZXM6IFBhc3N3b3JkUHJvdGVjdGVkUm91dGVbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhc3N3b3JkUHJvdGVjdFBsdWdpbihcbiAgb3B0aW9uczogUGFzc3dvcmRQcm90ZWN0UGx1Z2luT3B0aW9uc1xuKTogUGx1Z2luIHtcbiAgY29uc3QgcHJvdGVjdGVkUm91dGVzVXNlckNvbmZpZyA9IG9wdGlvbnMucHJvdGVjdGVkUm91dGVzIHx8IFtdO1xuICBjb25zdCBwcm90ZWN0ZWRSb3V0ZXMgPSBwcm90ZWN0ZWRSb3V0ZXNVc2VyQ29uZmlnLmZpbHRlcigocHJvdGVjdGVkUm91dGUpID0+IHtcbiAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgIHByb3RlY3RlZFJvdXRlLnNvdXJjZSAmJlxuICAgICAgICBwcm90ZWN0ZWRSb3V0ZS5wYXNzd29yZCAmJlxuICAgICAgICBwcm90ZWN0ZWRSb3V0ZS5wYXNzd29yZC5oYXNoICYmXG4gICAgICAgIHByb3RlY3RlZFJvdXRlLnBhc3N3b3JkLnNhbHRcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmlyc3QgcGFzc3dvcmQtcHJvdGVjdGVkIHJvdXRlIHRoYXQgbWF0Y2hlcy5cbiAgICovXG4gIGZ1bmN0aW9uIGdldFByb3RlY3RlZFJvdXRlQ29uZmlnKFxuICAgIHJlcTogUmVxdWVzdFxuICApOiBQYXNzd29yZFByb3RlY3RlZFJvdXRlIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCBwcm90ZWN0ZWRSb3V0ZSBvZiBwcm90ZWN0ZWRSb3V0ZXMpIHtcbiAgICAgIGlmIChtaWNyb21hdGNoLmlzTWF0Y2gocmVxLnBhdGgsIHByb3RlY3RlZFJvdXRlLnNvdXJjZSkpIHtcbiAgICAgICAgcmV0dXJuIHByb3RlY3RlZFJvdXRlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3Jvb3QtcGFzc3dvcmQtcHJvdGVjdCcsXG4gICAgY29uZmlndXJlU2VydmVyOiAoc2VydmVyOiBTZXJ2ZXIpID0+IHtcbiAgICAgIGlmIChwcm90ZWN0ZWRSb3V0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNlcnZlci51c2UoYm9keVBhcnNlci51cmxlbmNvZGVkKHtleHRlbmRlZDogdHJ1ZX0pKTtcbiAgICAgIHNlcnZlci51c2UoYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3RlY3RlZFJvdXRlID0gZ2V0UHJvdGVjdGVkUm91dGVDb25maWcocmVxKTtcbiAgICAgICAgaWYgKHByb3RlY3RlZFJvdXRlKSB7XG4gICAgICAgICAgYXdhaXQgaGFuZGxlUHJvdGVjdGVkUm91dGUocHJvdGVjdGVkUm91dGUsIHJlcSwgcmVzLCBuZXh0KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbmV4dCgpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlUHJvdGVjdGVkUm91dGUoXG4gIHByb3RlY3RlZFJvdXRlOiBQYXNzd29yZFByb3RlY3RlZFJvdXRlLFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvblxuKSB7XG4gIGlmIChyZXEubWV0aG9kID09PSAnUE9TVCcpIHtcbiAgICAvLyBWZXJpZnkgcGFzc3dvcmQgYW5kIGlmIHZhbGlkIHNldCBhIHNlc3Npb24gY29va2llLlxuICAgIGlmIChcbiAgICAgIHJlcS5nZXQoJ2NvbnRlbnQtdHlwZScpICE9PSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyB8fFxuICAgICAgIXJlcS5ib2R5IHx8XG4gICAgICAhcmVxLmJvZHkucGFzc3dvcmRcbiAgICApIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKTtcbiAgICAgIHJlbmRlclBhc3N3b3JkUGFnZShyZXEsIHJlcywge2Vycm9yOiAnQmFkIHJlcXVlc3QgKG5vIHBhc3N3b3JkKS4nfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFzc3dvcmQgPSByZXEuYm9keS5wYXNzd29yZCBhcyBzdHJpbmc7XG4gICAgY29uc3QgaXNWYWxpZCA9IGF3YWl0IHZlcmlmeVBhc3N3b3JkKFxuICAgICAgcGFzc3dvcmQsXG4gICAgICBwcm90ZWN0ZWRSb3V0ZS5wYXNzd29yZC5oYXNoLFxuICAgICAgcHJvdGVjdGVkUm91dGUucGFzc3dvcmQuc2FsdFxuICAgICk7XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICByZW5kZXJQYXNzd29yZFBhZ2UocmVxLCByZXMsIHtlcnJvcjogJ0luY29ycmVjdCBwYXNzd29yZC4nfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFNldCBhIHNlc3Npb24gY29va2llIHZhbHVlIHRvIHZlcmlmeSBzdWJzZXF1ZW50IHJlcXVlc3RzLlxuICAgIGF3YWl0IHNldFNlc3Npb25Db29raWUocHJvdGVjdGVkUm91dGUsIHJlcyk7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIElmIHByZXZpb3VzbHkgbG9nZ2VkIGluLCBjaGVjayB0aGUgc2Vzc2lvbiBjb29raWUgYWdhaW5zdCB0aGUgY3VycmVudFxuICAvLyBwYXNzd29yZCBoYXNoLlxuICBjb25zdCBpc1ZhbGlkID0gYXdhaXQgdmVyaWZ5U2Vzc2lvbkNvb2tpZShwcm90ZWN0ZWRSb3V0ZSwgcmVxKTtcbiAgaWYgKGlzVmFsaWQpIHtcbiAgICBuZXh0KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmVuZGVyUGFzc3dvcmRQYWdlKHJlcSwgcmVzKTtcbn1cblxuLyoqXG4gKiBTYXZlcyBhIHZlcmlmaWNhdGlvbiB0b2tlbiB0byB0aGUgc2Vzc2lvbiBjb29raWUgZm9yIHN1YnNlcXVlbnQgcmVxdWVzdHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNldFNlc3Npb25Db29raWUoXG4gIHByb3RlY3RlZFJvdXRlOiBQYXNzd29yZFByb3RlY3RlZFJvdXRlLFxuICByZXM6IFJlc3BvbnNlXG4pIHtcbiAgY29uc3Qge2hhc2gsIHNhbHR9ID0gYXdhaXQgaGFzaFBhc3N3b3JkKHByb3RlY3RlZFJvdXRlLnBhc3N3b3JkLmhhc2gpO1xuICByZXMuc2Vzc2lvbi5zZXRJdGVtKFNFU1NJT05fQ09PS0lFX0hBU0gsIGhhc2gpO1xuICByZXMuc2Vzc2lvbi5zZXRJdGVtKFNFU1NJT05fQ09PS0lFX1NBTFQsIHNhbHQpO1xuICByZXMuc2F2ZVNlc3Npb24oKTtcbn1cblxuLyoqXG4gKiBWZXJpZmllcyB0aGUgc2Vzc2lvbiBjb29raWUgdmFsdWUgaXMgdmFsaWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeVNlc3Npb25Db29raWUoXG4gIHByb3RlY3RlZFJvdXRlOiBQYXNzd29yZFByb3RlY3RlZFJvdXRlLFxuICByZXE6IFJlcXVlc3Rcbikge1xuICBjb25zdCBoYXNoID0gcmVxLnNlc3Npb24uZ2V0SXRlbShTRVNTSU9OX0NPT0tJRV9IQVNIKTtcbiAgY29uc3Qgc2FsdCA9IHJlcS5zZXNzaW9uLmdldEl0ZW0oU0VTU0lPTl9DT09LSUVfU0FMVCk7XG4gIGlmICghaGFzaCB8fCAhc2FsdCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdmVyaWZ5UGFzc3dvcmQocHJvdGVjdGVkUm91dGUucGFzc3dvcmQuaGFzaCwgaGFzaCwgc2FsdCk7XG59XG5cbi8qKlxuICogUmVuZGVycyB0aGUgbG9naW4gcGFnZSB0byBhIHJlc3BvbnNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyUGFzc3dvcmRQYWdlKFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIHByb3BzPzogT21pdDxQYXNzd29yZFBhZ2VQcm9wcywgJ25vbmNlJz5cbikge1xuICBjb25zdCBub25jZSA9IGdlbmVyYXRlTm9uY2UoKTtcbiAgY29uc3QgbWFpbkh0bWwgPSByZW5kZXJUb1N0cmluZyg8UGFzc3dvcmRQYWdlIHsuLi5wcm9wc30gbm9uY2U9e25vbmNlfSAvPik7XG4gIGNvbnN0IGh0bWwgPSBgPCFkb2N0eXBlIGh0bWw+XFxuJHttYWluSHRtbH1gO1xuICByZXMuc2V0SGVhZGVyKCdjb250ZW50LXR5cGUnLCAndGV4dC9odG1sJyk7XG4gIHNldFNlY3VyaXR5SGVhZGVycyhyZXMsIG5vbmNlKTtcbiAgcmVzLnNlbmQoaHRtbCk7XG59XG4iLCAiZXhwb3J0IGNvbnN0IENTUyA9IGBcbi5zaWduaW4ge1xuICBmb250LWZhbWlseTogJ0dvb2dsZSBTYW5zJywgYXJpYWwsIHNhbnMtc2VyaWY7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgcGFkZGluZzogNDhweCAyMHB4O1xuICBjb2xvcjogIzNjNDA0Mztcbn1cblxuLnNpZ25pbl9faGVhZGxpbmUge1xuICBtYXJnaW4tYm90dG9tOiA0MHB4O1xufVxuXG4uc2lnbmluX19oZWFkbGluZV9faWNvbiB7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG59XG5cbi5zaWduaW5fX2hlYWRsaW5lX19pY29uIHN2ZyB7XG4gIHdpZHRoOiA3MnB4O1xuICBoZWlnaHQ6IDcycHg7XG59XG5cbi5zaWduaW5fX2hlYWRsaW5lX190aXRsZSB7XG4gIGZvbnQtc2l6ZTogMzZweDtcbiAgbGluZS1oZWlnaHQ6IDEuMztcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1cblxuLnNpZ25pbl9faGVhZGxpbmVfX2JvZHkge1xuICBmb250LXNpemU6IDE4cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjU7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5zaWduaW5fX2Zvcm0ge1xuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IDhweDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbi5zaWduaW5fX2Zvcm1fX3Bhc3N3b3JkIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RhZGNlMDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBoZWlnaHQ6IDQwcHg7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBsZXR0ZXItc3BhY2luZzogLjI1cHg7XG4gIHBhZGRpbmc6IDAgMTJweDtcbiAgbWluLXdpZHRoOiAyNTBweDtcbiAgdHJhbnNpdGlvbjogYWxsIDAuMjE4cyBlYXNlO1xufVxuXG4uc2lnbmluX19mb3JtX19wYXNzd29yZDpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogI2QyZTNmYztcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg2NiwgMTMzLCAyNDQsIDAuMDQpO1xufVxuXG4uc2lnbmluX19idXR0b24ge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgYXBwZWFyYW5jZTogbm9uZTtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZ2FwOiAxMnB4O1xuICBwYWRkaW5nOiA4cHggMTFweDtcbiAgYmFja2dyb3VuZDogd2hpdGU7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkYWRjZTA7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgcGFkZGluZzogMCAxMnB4O1xuICBoZWlnaHQ6IDQwcHg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHRyYW5zaXRpb246IGFsbCAwLjIxOHMgZWFzZTtcbn1cblxuLnNpZ25pbl9fYnV0dG9uOmhvdmVyIHtcbiAgYm9yZGVyLWNvbG9yOiAjZDJlM2ZjO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDY2LCAxMzMsIDI0NCwgMC4wNCk7XG59XG5cbi5zaWduaW5fX2J1dHRvbl9faWNvbiB7XG4gIHdpZHRoOiAxOHB4O1xuICBoZWlnaHQ6IDE4cHg7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xufVxuXG4uc2lnbmluX19idXR0b25fX2xhYmVsIHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTtcbiAgbGV0dGVyLXNwYWNpbmc6IC4yNXB4O1xuICBmb250LXdlaWdodDogNTAwO1xuICBjb2xvcjogIzNjNDA0Mztcbn1cblxuLnNpZ25pbl9fZXJyb3Ige1xuICBjb2xvcjogcmVkO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBtYXgtd2lkdGg6IDYwY2g7XG4gIG1hcmdpbjogMjBweCBhdXRvIDA7XG59XG5gO1xuIiwgImltcG9ydCB7Q1NTfSBmcm9tICcuL1Bhc3N3b3JkUGFnZS5jc3MnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhc3N3b3JkUGFnZVByb3BzIHtcbiAgbm9uY2U6IHN0cmluZztcbiAgZXJyb3I/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBQYXNzd29yZFBhZ2UocHJvcHM6IFBhc3N3b3JkUGFnZVByb3BzKSB7XG4gIHJldHVybiAoXG4gICAgPGh0bWw+XG4gICAgICA8aGVhZD5cbiAgICAgICAgPG1ldGEgY2hhcnNldD1cInV0Zi04XCIgLz5cbiAgICAgICAgPHRpdGxlPlByb3RlY3RlZDwvdGl0bGU+XG4gICAgICAgIDxsaW5rXG4gICAgICAgICAgcmVsPVwiaWNvblwiXG4gICAgICAgICAgaHJlZj1cImh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9paks1MFRmUWxWX3lKdzNpLUNNbG5ENm9zSDRQYm9aQklMWnJKY1dob05NRW1veUNENWUxYkF4WGJhT1BlNXc0Z0dfU2NmMzdFWHJtWjZwOHNQMmx1ZTVmTFo0MTltNUp5TE1zPWUzODUtdzI1NlwiXG4gICAgICAgICAgdHlwZT1cImltYWdlL3BuZ1wiXG4gICAgICAgIC8+XG4gICAgICAgIDxsaW5rXG4gICAgICAgICAgcmVsPVwic3R5bGVzaGVldFwiXG4gICAgICAgICAgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9R29vZ2xlK1NhbnM6d2dodEA1MDAmZGlzcGxheT1zd2FwXCJcbiAgICAgICAgICBub25jZT17cHJvcHMubm9uY2V9XG4gICAgICAgIC8+XG4gICAgICAgIDxzdHlsZSBub25jZT17cHJvcHMubm9uY2V9PntDU1N9PC9zdHlsZT5cbiAgICAgIDwvaGVhZD5cbiAgICAgIDxib2R5PlxuICAgICAgICA8ZGl2IGlkPVwicm9vdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2lnbmluXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNpZ25pbl9faGVhZGxpbmVcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzaWduaW5fX2hlYWRsaW5lX19pY29uXCI+XG4gICAgICAgICAgICAgICAgPFNoaWVsZEljb24gLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxoMT5UaGlzIHBhZ2UgaXMgcHJvdGVjdGVkLjwvaDE+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInNpZ25pbl9faGVhZGxpbmVfX2JvZHlcIj5cbiAgICAgICAgICAgICAgICBFbnRlciB0aGUgcGFzc3dvcmQgYmVsb3cgdG8gY29udGludWU6XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGZvcm0gY2xhc3NOYW1lPVwic2lnbmluX19mb3JtXCIgbWV0aG9kPVwiUE9TVFwiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBpZD1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJzaWduaW5fX2Zvcm1fX3Bhc3N3b3JkXCJcbiAgICAgICAgICAgICAgICBuYW1lPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJwYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJQYXNzd29yZFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwic2lnbmluX19idXR0b25cIiB0eXBlPVwic3VibWl0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzaWduaW5fX2J1dHRvbl9fbGFiZWxcIj5TdWJtaXQ8L2Rpdj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICB7cHJvcHMuZXJyb3IgJiYgPHAgY2xhc3NOYW1lPVwic2lnbmluX19lcnJvclwiPntwcm9wcy5lcnJvcn08L3A+fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYm9keT5cbiAgICA8L2h0bWw+XG4gICk7XG59XG5cbmZ1bmN0aW9uIFNoaWVsZEljb24oKSB7XG4gIHJldHVybiAoXG4gICAgPHN2Z1xuICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICB3aWR0aD1cIjM2XCJcbiAgICAgIGhlaWdodD1cIjM2XCJcbiAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgIHN0cm9rZT1cIiNmZjQ1MDBcIlxuICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgPlxuICAgICAgPHBhdGggc3Ryb2tlPVwibm9uZVwiIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIiAvPlxuICAgICAgPHBhdGhcbiAgICAgICAgZD1cIk0xMS45OTggMmwuMTE4IC4wMDdsLjA1OSAuMDA4bC4wNjEgLjAxM2wuMTExIC4wMzRhLjk5MyAuOTkzIDAgMCAxIC4yMTcgLjExMmwuMTA0IC4wODJsLjI1NSAuMjE4YTExIDExIDAgMCAwIDcuMTg5IDIuNTM3bC4zNDIgLS4wMWExIDEgMCAwIDEgMS4wMDUgLjcxN2ExMyAxMyAwIDAgMSAtOS4yMDggMTYuMjVhMSAxIDAgMCAxIC0uNTAyIDBhMTMgMTMgMCAwIDEgLTkuMjA5IC0xNi4yNWExIDEgMCAwIDEgMS4wMDUgLS43MTdhMTEgMTEgMCAwIDAgNy41MzEgLTIuNTI3bC4yNjMgLS4yMjVsLjA5NiAtLjA3NWEuOTkzIC45OTMgMCAwIDEgLjIxNyAtLjExMmwuMTEyIC0uMDM0YS45NyAuOTcgMCAwIDEgLjExOSAtLjAyMWwuMTE1IC0uMDA3em0uMDAyIDdhMiAyIDAgMCAwIC0xLjk5NSAxLjg1bC0uMDA1IC4xNWwuMDA1IC4xNWEyIDIgMCAwIDAgLjk5NSAxLjU4MXYxLjc2OWwuMDA3IC4xMTdhMSAxIDAgMCAwIDEuOTkzIC0uMTE3bC4wMDEgLTEuNzY4YTIgMiAwIDAgMCAtMS4wMDEgLTMuNzMyelwiXG4gICAgICAgIHN0cm9rZS13aWR0aD1cIjBcIlxuICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgIC8+XG4gICAgPC9zdmc+XG4gICk7XG59XG4iLCAiaW1wb3J0IGNyeXB0byBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge1Jlc3BvbnNlfSBmcm9tICdAYmxpbmtrL3Jvb3QnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVOb25jZSgpIHtcbiAgcmV0dXJuIGNyeXB0by5yYW5kb21CeXRlcygxNikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0U2VjdXJpdHlIZWFkZXJzKHJlczogUmVzcG9uc2UsIG5vbmNlOiBzdHJpbmcpIHtcbiAgcmVzLnNldEhlYWRlcigneC1mcmFtZS1vcHRpb25zJywgJ1NBTUVPUklHSU4nKTtcbiAgcmVzLnNldEhlYWRlcihcbiAgICAnc3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eScsXG4gICAgJ21heC1hZ2U9NjMwNzIwMDA7IGluY2x1ZGVTdWJkb21haW5zOyBwcmVsb2FkJ1xuICApO1xuICByZXMuc2V0SGVhZGVyKCd4LWNvbnRlbnQtdHlwZS1vcHRpb25zJywgJ25vc25pZmYnKTtcbiAgcmVzLnNldEhlYWRlcigneC14c3MtcHJvdGVjdGlvbicsICcxOyBtb2RlPWJsb2NrJyk7XG5cbiAgY29uc3QgZGlyZWN0aXZlcyA9IFtcbiAgICBcImJhc2UtdXJpICdub25lJ1wiLFxuICAgIFwib2JqZWN0LXNyYyAnbm9uZSdcIixcbiAgICBgc2NyaXB0LXNyYyAnc2VsZicgJ25vbmNlLSR7bm9uY2V9J2AsXG4gIF07XG4gIHJlcy5zZXRIZWFkZXIoJ2NvbnRlbnQtc2VjdXJpdHktcG9saWN5LXJlcG9ydC1vbmx5JywgZGlyZWN0aXZlcy5qb2luKCc7JykpO1xufVxuIiwgImltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcblxuY29uc3QgUEFTU1dPUkRfSVRFUkFUSU9OUyA9IDEwMDAwO1xuY29uc3QgUEFTU1dPUkRfSEFTSF9MRU5HVEggPSA2NDtcbmNvbnN0IFBBU1NXT1JEX0RJR0VTVCA9ICdzaGEyNTYnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFzaFBhc3N3b3JkKFxuICBwYXNzd29yZDogc3RyaW5nXG4pOiBQcm9taXNlPHtoYXNoOiBzdHJpbmc7IHNhbHQ6IHN0cmluZ30+IHtcbiAgY29uc3Qgc2FsdCA9IGNyeXB0by5yYW5kb21CeXRlcygxNikudG9TdHJpbmcoJ2hleCcpO1xuICBjb25zdCBoYXNoID0gYXdhaXQgZ2VuZXJhdGVIYXNoKHBhc3N3b3JkLCBzYWx0KTtcbiAgcmV0dXJuIHtoYXNoLCBzYWx0fTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVBhc3N3b3JkKFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBoYXNoOiBzdHJpbmcsXG4gIHNhbHQ6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGdlbmVyYXRlZEhhc2ggPSBhd2FpdCBnZW5lcmF0ZUhhc2gocGFzc3dvcmQsIHNhbHQpO1xuICByZXR1cm4gaGFzaCA9PT0gZ2VuZXJhdGVkSGFzaDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSGFzaChwYXNzd29yZDogc3RyaW5nLCBzYWx0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNyeXB0by5wYmtkZjIoXG4gICAgICBwYXNzd29yZCxcbiAgICAgIHNhbHQsXG4gICAgICBQQVNTV09SRF9JVEVSQVRJT05TLFxuICAgICAgUEFTU1dPUkRfSEFTSF9MRU5HVEgsXG4gICAgICBQQVNTV09SRF9ESUdFU1QsXG4gICAgICAoZXJyLCBkZXJpdmVkS2V5KSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdwYXNzd29yZCBoYXNoaW5nIGZhaWxlZCcpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGFzaCA9IGRlcml2ZWRLZXkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICByZXNvbHZlKGhhc2gpO1xuICAgICAgfVxuICAgICk7XG4gIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUNBLE9BQU8sZ0JBQWdCO0FBQ3ZCLE9BQU8sZ0JBQWdCO0FBQ3ZCLE9BQU8sb0JBQW9COzs7QUNIcEIsSUFBTSxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blinkk/root-password-protect",
|
|
3
|
-
"version": "1.0.0-rc.
|
|
3
|
+
"version": "1.0.0-rc.36",
|
|
4
4
|
"author": "s@blinkk.com",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"engines": {
|
|
7
|
-
"node": ">=
|
|
7
|
+
"node": ">=18.0.0"
|
|
8
8
|
},
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
@@ -12,14 +12,14 @@
|
|
|
12
12
|
"directory": "packages/root-password-protect"
|
|
13
13
|
},
|
|
14
14
|
"files": [
|
|
15
|
-
"dist
|
|
15
|
+
"dist/*"
|
|
16
16
|
],
|
|
17
17
|
"bin": {
|
|
18
18
|
"root-password-protect": "./bin/root-password-protect.js"
|
|
19
19
|
},
|
|
20
20
|
"type": "module",
|
|
21
|
-
"module": "./dist/
|
|
22
|
-
"types": "./dist/
|
|
21
|
+
"module": "./dist/core.js",
|
|
22
|
+
"types": "./dist/core.d.ts",
|
|
23
23
|
"exports": {
|
|
24
24
|
".": {
|
|
25
25
|
"types": "./dist/core.d.ts",
|
|
@@ -31,30 +31,27 @@
|
|
|
31
31
|
}
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@types/micromatch": "4.0.6",
|
|
35
34
|
"body-parser": "1.20.2",
|
|
36
35
|
"commander": "11.0.0",
|
|
37
36
|
"kleur": "4.1.5",
|
|
38
37
|
"micromatch": "4.0.5"
|
|
39
38
|
},
|
|
40
39
|
"peerDependencies": {
|
|
41
|
-
"@blinkk/root": "1.0.0-rc.
|
|
42
|
-
"firebase-admin": ">=11",
|
|
43
|
-
"firebase-functions": ">=4",
|
|
40
|
+
"@blinkk/root": "1.0.0-rc.36",
|
|
44
41
|
"preact": ">=10",
|
|
45
42
|
"preact-render-to-string": ">=5"
|
|
46
43
|
},
|
|
47
44
|
"devDependencies": {
|
|
48
45
|
"@types/body-parser": "1.19.3",
|
|
46
|
+
"@types/micromatch": "4.0.6",
|
|
49
47
|
"@types/node": "20.11.25",
|
|
50
48
|
"preact": "10.19.3",
|
|
51
49
|
"preact-render-to-string": "6.3.1",
|
|
52
50
|
"tsup": "8.0.1",
|
|
53
|
-
"
|
|
54
|
-
"@blinkk/root": "1.0.0-rc.35"
|
|
51
|
+
"@blinkk/root": "1.0.0-rc.36"
|
|
55
52
|
},
|
|
56
53
|
"scripts": {
|
|
57
|
-
"build": "tsup-node
|
|
54
|
+
"build": "rm -rf dist && tsup-node",
|
|
58
55
|
"dev": "pnpm build --watch",
|
|
59
56
|
"test": "pnpm build"
|
|
60
57
|
}
|